github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/ssa/rewriteARM.go (about) 1 // Code generated from _gen/ARM.rules using 'go generate'; DO NOT EDIT. 2 3 package ssa 4 5 import ( 6 "github.com/go-asm/go/buildcfg" 7 "github.com/go-asm/go/cmd/compile/types" 8 ) 9 10 func rewriteValueARM(v *Value) bool { 11 switch v.Op { 12 case OpARMADC: 13 return rewriteValueARM_OpARMADC(v) 14 case OpARMADCconst: 15 return rewriteValueARM_OpARMADCconst(v) 16 case OpARMADCshiftLL: 17 return rewriteValueARM_OpARMADCshiftLL(v) 18 case OpARMADCshiftLLreg: 19 return rewriteValueARM_OpARMADCshiftLLreg(v) 20 case OpARMADCshiftRA: 21 return rewriteValueARM_OpARMADCshiftRA(v) 22 case OpARMADCshiftRAreg: 23 return rewriteValueARM_OpARMADCshiftRAreg(v) 24 case OpARMADCshiftRL: 25 return rewriteValueARM_OpARMADCshiftRL(v) 26 case OpARMADCshiftRLreg: 27 return rewriteValueARM_OpARMADCshiftRLreg(v) 28 case OpARMADD: 29 return rewriteValueARM_OpARMADD(v) 30 case OpARMADDD: 31 return rewriteValueARM_OpARMADDD(v) 32 case OpARMADDF: 33 return rewriteValueARM_OpARMADDF(v) 34 case OpARMADDS: 35 return rewriteValueARM_OpARMADDS(v) 36 case OpARMADDSshiftLL: 37 return rewriteValueARM_OpARMADDSshiftLL(v) 38 case OpARMADDSshiftLLreg: 39 return rewriteValueARM_OpARMADDSshiftLLreg(v) 40 case OpARMADDSshiftRA: 41 return rewriteValueARM_OpARMADDSshiftRA(v) 42 case OpARMADDSshiftRAreg: 43 return rewriteValueARM_OpARMADDSshiftRAreg(v) 44 case OpARMADDSshiftRL: 45 return rewriteValueARM_OpARMADDSshiftRL(v) 46 case OpARMADDSshiftRLreg: 47 return rewriteValueARM_OpARMADDSshiftRLreg(v) 48 case OpARMADDconst: 49 return rewriteValueARM_OpARMADDconst(v) 50 case OpARMADDshiftLL: 51 return rewriteValueARM_OpARMADDshiftLL(v) 52 case OpARMADDshiftLLreg: 53 return rewriteValueARM_OpARMADDshiftLLreg(v) 54 case OpARMADDshiftRA: 55 return rewriteValueARM_OpARMADDshiftRA(v) 56 case OpARMADDshiftRAreg: 57 return rewriteValueARM_OpARMADDshiftRAreg(v) 58 case OpARMADDshiftRL: 59 return rewriteValueARM_OpARMADDshiftRL(v) 60 case OpARMADDshiftRLreg: 61 return rewriteValueARM_OpARMADDshiftRLreg(v) 62 case OpARMAND: 63 return rewriteValueARM_OpARMAND(v) 64 case OpARMANDconst: 65 return rewriteValueARM_OpARMANDconst(v) 66 case OpARMANDshiftLL: 67 return rewriteValueARM_OpARMANDshiftLL(v) 68 case OpARMANDshiftLLreg: 69 return rewriteValueARM_OpARMANDshiftLLreg(v) 70 case OpARMANDshiftRA: 71 return rewriteValueARM_OpARMANDshiftRA(v) 72 case OpARMANDshiftRAreg: 73 return rewriteValueARM_OpARMANDshiftRAreg(v) 74 case OpARMANDshiftRL: 75 return rewriteValueARM_OpARMANDshiftRL(v) 76 case OpARMANDshiftRLreg: 77 return rewriteValueARM_OpARMANDshiftRLreg(v) 78 case OpARMBFX: 79 return rewriteValueARM_OpARMBFX(v) 80 case OpARMBFXU: 81 return rewriteValueARM_OpARMBFXU(v) 82 case OpARMBIC: 83 return rewriteValueARM_OpARMBIC(v) 84 case OpARMBICconst: 85 return rewriteValueARM_OpARMBICconst(v) 86 case OpARMBICshiftLL: 87 return rewriteValueARM_OpARMBICshiftLL(v) 88 case OpARMBICshiftLLreg: 89 return rewriteValueARM_OpARMBICshiftLLreg(v) 90 case OpARMBICshiftRA: 91 return rewriteValueARM_OpARMBICshiftRA(v) 92 case OpARMBICshiftRAreg: 93 return rewriteValueARM_OpARMBICshiftRAreg(v) 94 case OpARMBICshiftRL: 95 return rewriteValueARM_OpARMBICshiftRL(v) 96 case OpARMBICshiftRLreg: 97 return rewriteValueARM_OpARMBICshiftRLreg(v) 98 case OpARMCMN: 99 return rewriteValueARM_OpARMCMN(v) 100 case OpARMCMNconst: 101 return rewriteValueARM_OpARMCMNconst(v) 102 case OpARMCMNshiftLL: 103 return rewriteValueARM_OpARMCMNshiftLL(v) 104 case OpARMCMNshiftLLreg: 105 return rewriteValueARM_OpARMCMNshiftLLreg(v) 106 case OpARMCMNshiftRA: 107 return rewriteValueARM_OpARMCMNshiftRA(v) 108 case OpARMCMNshiftRAreg: 109 return rewriteValueARM_OpARMCMNshiftRAreg(v) 110 case OpARMCMNshiftRL: 111 return rewriteValueARM_OpARMCMNshiftRL(v) 112 case OpARMCMNshiftRLreg: 113 return rewriteValueARM_OpARMCMNshiftRLreg(v) 114 case OpARMCMOVWHSconst: 115 return rewriteValueARM_OpARMCMOVWHSconst(v) 116 case OpARMCMOVWLSconst: 117 return rewriteValueARM_OpARMCMOVWLSconst(v) 118 case OpARMCMP: 119 return rewriteValueARM_OpARMCMP(v) 120 case OpARMCMPD: 121 return rewriteValueARM_OpARMCMPD(v) 122 case OpARMCMPF: 123 return rewriteValueARM_OpARMCMPF(v) 124 case OpARMCMPconst: 125 return rewriteValueARM_OpARMCMPconst(v) 126 case OpARMCMPshiftLL: 127 return rewriteValueARM_OpARMCMPshiftLL(v) 128 case OpARMCMPshiftLLreg: 129 return rewriteValueARM_OpARMCMPshiftLLreg(v) 130 case OpARMCMPshiftRA: 131 return rewriteValueARM_OpARMCMPshiftRA(v) 132 case OpARMCMPshiftRAreg: 133 return rewriteValueARM_OpARMCMPshiftRAreg(v) 134 case OpARMCMPshiftRL: 135 return rewriteValueARM_OpARMCMPshiftRL(v) 136 case OpARMCMPshiftRLreg: 137 return rewriteValueARM_OpARMCMPshiftRLreg(v) 138 case OpARMEqual: 139 return rewriteValueARM_OpARMEqual(v) 140 case OpARMGreaterEqual: 141 return rewriteValueARM_OpARMGreaterEqual(v) 142 case OpARMGreaterEqualU: 143 return rewriteValueARM_OpARMGreaterEqualU(v) 144 case OpARMGreaterThan: 145 return rewriteValueARM_OpARMGreaterThan(v) 146 case OpARMGreaterThanU: 147 return rewriteValueARM_OpARMGreaterThanU(v) 148 case OpARMLessEqual: 149 return rewriteValueARM_OpARMLessEqual(v) 150 case OpARMLessEqualU: 151 return rewriteValueARM_OpARMLessEqualU(v) 152 case OpARMLessThan: 153 return rewriteValueARM_OpARMLessThan(v) 154 case OpARMLessThanU: 155 return rewriteValueARM_OpARMLessThanU(v) 156 case OpARMMOVBUload: 157 return rewriteValueARM_OpARMMOVBUload(v) 158 case OpARMMOVBUloadidx: 159 return rewriteValueARM_OpARMMOVBUloadidx(v) 160 case OpARMMOVBUreg: 161 return rewriteValueARM_OpARMMOVBUreg(v) 162 case OpARMMOVBload: 163 return rewriteValueARM_OpARMMOVBload(v) 164 case OpARMMOVBloadidx: 165 return rewriteValueARM_OpARMMOVBloadidx(v) 166 case OpARMMOVBreg: 167 return rewriteValueARM_OpARMMOVBreg(v) 168 case OpARMMOVBstore: 169 return rewriteValueARM_OpARMMOVBstore(v) 170 case OpARMMOVBstoreidx: 171 return rewriteValueARM_OpARMMOVBstoreidx(v) 172 case OpARMMOVDload: 173 return rewriteValueARM_OpARMMOVDload(v) 174 case OpARMMOVDstore: 175 return rewriteValueARM_OpARMMOVDstore(v) 176 case OpARMMOVFload: 177 return rewriteValueARM_OpARMMOVFload(v) 178 case OpARMMOVFstore: 179 return rewriteValueARM_OpARMMOVFstore(v) 180 case OpARMMOVHUload: 181 return rewriteValueARM_OpARMMOVHUload(v) 182 case OpARMMOVHUloadidx: 183 return rewriteValueARM_OpARMMOVHUloadidx(v) 184 case OpARMMOVHUreg: 185 return rewriteValueARM_OpARMMOVHUreg(v) 186 case OpARMMOVHload: 187 return rewriteValueARM_OpARMMOVHload(v) 188 case OpARMMOVHloadidx: 189 return rewriteValueARM_OpARMMOVHloadidx(v) 190 case OpARMMOVHreg: 191 return rewriteValueARM_OpARMMOVHreg(v) 192 case OpARMMOVHstore: 193 return rewriteValueARM_OpARMMOVHstore(v) 194 case OpARMMOVHstoreidx: 195 return rewriteValueARM_OpARMMOVHstoreidx(v) 196 case OpARMMOVWload: 197 return rewriteValueARM_OpARMMOVWload(v) 198 case OpARMMOVWloadidx: 199 return rewriteValueARM_OpARMMOVWloadidx(v) 200 case OpARMMOVWloadshiftLL: 201 return rewriteValueARM_OpARMMOVWloadshiftLL(v) 202 case OpARMMOVWloadshiftRA: 203 return rewriteValueARM_OpARMMOVWloadshiftRA(v) 204 case OpARMMOVWloadshiftRL: 205 return rewriteValueARM_OpARMMOVWloadshiftRL(v) 206 case OpARMMOVWnop: 207 return rewriteValueARM_OpARMMOVWnop(v) 208 case OpARMMOVWreg: 209 return rewriteValueARM_OpARMMOVWreg(v) 210 case OpARMMOVWstore: 211 return rewriteValueARM_OpARMMOVWstore(v) 212 case OpARMMOVWstoreidx: 213 return rewriteValueARM_OpARMMOVWstoreidx(v) 214 case OpARMMOVWstoreshiftLL: 215 return rewriteValueARM_OpARMMOVWstoreshiftLL(v) 216 case OpARMMOVWstoreshiftRA: 217 return rewriteValueARM_OpARMMOVWstoreshiftRA(v) 218 case OpARMMOVWstoreshiftRL: 219 return rewriteValueARM_OpARMMOVWstoreshiftRL(v) 220 case OpARMMUL: 221 return rewriteValueARM_OpARMMUL(v) 222 case OpARMMULA: 223 return rewriteValueARM_OpARMMULA(v) 224 case OpARMMULD: 225 return rewriteValueARM_OpARMMULD(v) 226 case OpARMMULF: 227 return rewriteValueARM_OpARMMULF(v) 228 case OpARMMULS: 229 return rewriteValueARM_OpARMMULS(v) 230 case OpARMMVN: 231 return rewriteValueARM_OpARMMVN(v) 232 case OpARMMVNshiftLL: 233 return rewriteValueARM_OpARMMVNshiftLL(v) 234 case OpARMMVNshiftLLreg: 235 return rewriteValueARM_OpARMMVNshiftLLreg(v) 236 case OpARMMVNshiftRA: 237 return rewriteValueARM_OpARMMVNshiftRA(v) 238 case OpARMMVNshiftRAreg: 239 return rewriteValueARM_OpARMMVNshiftRAreg(v) 240 case OpARMMVNshiftRL: 241 return rewriteValueARM_OpARMMVNshiftRL(v) 242 case OpARMMVNshiftRLreg: 243 return rewriteValueARM_OpARMMVNshiftRLreg(v) 244 case OpARMNEGD: 245 return rewriteValueARM_OpARMNEGD(v) 246 case OpARMNEGF: 247 return rewriteValueARM_OpARMNEGF(v) 248 case OpARMNMULD: 249 return rewriteValueARM_OpARMNMULD(v) 250 case OpARMNMULF: 251 return rewriteValueARM_OpARMNMULF(v) 252 case OpARMNotEqual: 253 return rewriteValueARM_OpARMNotEqual(v) 254 case OpARMOR: 255 return rewriteValueARM_OpARMOR(v) 256 case OpARMORconst: 257 return rewriteValueARM_OpARMORconst(v) 258 case OpARMORshiftLL: 259 return rewriteValueARM_OpARMORshiftLL(v) 260 case OpARMORshiftLLreg: 261 return rewriteValueARM_OpARMORshiftLLreg(v) 262 case OpARMORshiftRA: 263 return rewriteValueARM_OpARMORshiftRA(v) 264 case OpARMORshiftRAreg: 265 return rewriteValueARM_OpARMORshiftRAreg(v) 266 case OpARMORshiftRL: 267 return rewriteValueARM_OpARMORshiftRL(v) 268 case OpARMORshiftRLreg: 269 return rewriteValueARM_OpARMORshiftRLreg(v) 270 case OpARMRSB: 271 return rewriteValueARM_OpARMRSB(v) 272 case OpARMRSBSshiftLL: 273 return rewriteValueARM_OpARMRSBSshiftLL(v) 274 case OpARMRSBSshiftLLreg: 275 return rewriteValueARM_OpARMRSBSshiftLLreg(v) 276 case OpARMRSBSshiftRA: 277 return rewriteValueARM_OpARMRSBSshiftRA(v) 278 case OpARMRSBSshiftRAreg: 279 return rewriteValueARM_OpARMRSBSshiftRAreg(v) 280 case OpARMRSBSshiftRL: 281 return rewriteValueARM_OpARMRSBSshiftRL(v) 282 case OpARMRSBSshiftRLreg: 283 return rewriteValueARM_OpARMRSBSshiftRLreg(v) 284 case OpARMRSBconst: 285 return rewriteValueARM_OpARMRSBconst(v) 286 case OpARMRSBshiftLL: 287 return rewriteValueARM_OpARMRSBshiftLL(v) 288 case OpARMRSBshiftLLreg: 289 return rewriteValueARM_OpARMRSBshiftLLreg(v) 290 case OpARMRSBshiftRA: 291 return rewriteValueARM_OpARMRSBshiftRA(v) 292 case OpARMRSBshiftRAreg: 293 return rewriteValueARM_OpARMRSBshiftRAreg(v) 294 case OpARMRSBshiftRL: 295 return rewriteValueARM_OpARMRSBshiftRL(v) 296 case OpARMRSBshiftRLreg: 297 return rewriteValueARM_OpARMRSBshiftRLreg(v) 298 case OpARMRSCconst: 299 return rewriteValueARM_OpARMRSCconst(v) 300 case OpARMRSCshiftLL: 301 return rewriteValueARM_OpARMRSCshiftLL(v) 302 case OpARMRSCshiftLLreg: 303 return rewriteValueARM_OpARMRSCshiftLLreg(v) 304 case OpARMRSCshiftRA: 305 return rewriteValueARM_OpARMRSCshiftRA(v) 306 case OpARMRSCshiftRAreg: 307 return rewriteValueARM_OpARMRSCshiftRAreg(v) 308 case OpARMRSCshiftRL: 309 return rewriteValueARM_OpARMRSCshiftRL(v) 310 case OpARMRSCshiftRLreg: 311 return rewriteValueARM_OpARMRSCshiftRLreg(v) 312 case OpARMSBC: 313 return rewriteValueARM_OpARMSBC(v) 314 case OpARMSBCconst: 315 return rewriteValueARM_OpARMSBCconst(v) 316 case OpARMSBCshiftLL: 317 return rewriteValueARM_OpARMSBCshiftLL(v) 318 case OpARMSBCshiftLLreg: 319 return rewriteValueARM_OpARMSBCshiftLLreg(v) 320 case OpARMSBCshiftRA: 321 return rewriteValueARM_OpARMSBCshiftRA(v) 322 case OpARMSBCshiftRAreg: 323 return rewriteValueARM_OpARMSBCshiftRAreg(v) 324 case OpARMSBCshiftRL: 325 return rewriteValueARM_OpARMSBCshiftRL(v) 326 case OpARMSBCshiftRLreg: 327 return rewriteValueARM_OpARMSBCshiftRLreg(v) 328 case OpARMSLL: 329 return rewriteValueARM_OpARMSLL(v) 330 case OpARMSLLconst: 331 return rewriteValueARM_OpARMSLLconst(v) 332 case OpARMSRA: 333 return rewriteValueARM_OpARMSRA(v) 334 case OpARMSRAcond: 335 return rewriteValueARM_OpARMSRAcond(v) 336 case OpARMSRAconst: 337 return rewriteValueARM_OpARMSRAconst(v) 338 case OpARMSRL: 339 return rewriteValueARM_OpARMSRL(v) 340 case OpARMSRLconst: 341 return rewriteValueARM_OpARMSRLconst(v) 342 case OpARMSRR: 343 return rewriteValueARM_OpARMSRR(v) 344 case OpARMSUB: 345 return rewriteValueARM_OpARMSUB(v) 346 case OpARMSUBD: 347 return rewriteValueARM_OpARMSUBD(v) 348 case OpARMSUBF: 349 return rewriteValueARM_OpARMSUBF(v) 350 case OpARMSUBS: 351 return rewriteValueARM_OpARMSUBS(v) 352 case OpARMSUBSshiftLL: 353 return rewriteValueARM_OpARMSUBSshiftLL(v) 354 case OpARMSUBSshiftLLreg: 355 return rewriteValueARM_OpARMSUBSshiftLLreg(v) 356 case OpARMSUBSshiftRA: 357 return rewriteValueARM_OpARMSUBSshiftRA(v) 358 case OpARMSUBSshiftRAreg: 359 return rewriteValueARM_OpARMSUBSshiftRAreg(v) 360 case OpARMSUBSshiftRL: 361 return rewriteValueARM_OpARMSUBSshiftRL(v) 362 case OpARMSUBSshiftRLreg: 363 return rewriteValueARM_OpARMSUBSshiftRLreg(v) 364 case OpARMSUBconst: 365 return rewriteValueARM_OpARMSUBconst(v) 366 case OpARMSUBshiftLL: 367 return rewriteValueARM_OpARMSUBshiftLL(v) 368 case OpARMSUBshiftLLreg: 369 return rewriteValueARM_OpARMSUBshiftLLreg(v) 370 case OpARMSUBshiftRA: 371 return rewriteValueARM_OpARMSUBshiftRA(v) 372 case OpARMSUBshiftRAreg: 373 return rewriteValueARM_OpARMSUBshiftRAreg(v) 374 case OpARMSUBshiftRL: 375 return rewriteValueARM_OpARMSUBshiftRL(v) 376 case OpARMSUBshiftRLreg: 377 return rewriteValueARM_OpARMSUBshiftRLreg(v) 378 case OpARMTEQ: 379 return rewriteValueARM_OpARMTEQ(v) 380 case OpARMTEQconst: 381 return rewriteValueARM_OpARMTEQconst(v) 382 case OpARMTEQshiftLL: 383 return rewriteValueARM_OpARMTEQshiftLL(v) 384 case OpARMTEQshiftLLreg: 385 return rewriteValueARM_OpARMTEQshiftLLreg(v) 386 case OpARMTEQshiftRA: 387 return rewriteValueARM_OpARMTEQshiftRA(v) 388 case OpARMTEQshiftRAreg: 389 return rewriteValueARM_OpARMTEQshiftRAreg(v) 390 case OpARMTEQshiftRL: 391 return rewriteValueARM_OpARMTEQshiftRL(v) 392 case OpARMTEQshiftRLreg: 393 return rewriteValueARM_OpARMTEQshiftRLreg(v) 394 case OpARMTST: 395 return rewriteValueARM_OpARMTST(v) 396 case OpARMTSTconst: 397 return rewriteValueARM_OpARMTSTconst(v) 398 case OpARMTSTshiftLL: 399 return rewriteValueARM_OpARMTSTshiftLL(v) 400 case OpARMTSTshiftLLreg: 401 return rewriteValueARM_OpARMTSTshiftLLreg(v) 402 case OpARMTSTshiftRA: 403 return rewriteValueARM_OpARMTSTshiftRA(v) 404 case OpARMTSTshiftRAreg: 405 return rewriteValueARM_OpARMTSTshiftRAreg(v) 406 case OpARMTSTshiftRL: 407 return rewriteValueARM_OpARMTSTshiftRL(v) 408 case OpARMTSTshiftRLreg: 409 return rewriteValueARM_OpARMTSTshiftRLreg(v) 410 case OpARMXOR: 411 return rewriteValueARM_OpARMXOR(v) 412 case OpARMXORconst: 413 return rewriteValueARM_OpARMXORconst(v) 414 case OpARMXORshiftLL: 415 return rewriteValueARM_OpARMXORshiftLL(v) 416 case OpARMXORshiftLLreg: 417 return rewriteValueARM_OpARMXORshiftLLreg(v) 418 case OpARMXORshiftRA: 419 return rewriteValueARM_OpARMXORshiftRA(v) 420 case OpARMXORshiftRAreg: 421 return rewriteValueARM_OpARMXORshiftRAreg(v) 422 case OpARMXORshiftRL: 423 return rewriteValueARM_OpARMXORshiftRL(v) 424 case OpARMXORshiftRLreg: 425 return rewriteValueARM_OpARMXORshiftRLreg(v) 426 case OpARMXORshiftRR: 427 return rewriteValueARM_OpARMXORshiftRR(v) 428 case OpAbs: 429 v.Op = OpARMABSD 430 return true 431 case OpAdd16: 432 v.Op = OpARMADD 433 return true 434 case OpAdd32: 435 v.Op = OpARMADD 436 return true 437 case OpAdd32F: 438 v.Op = OpARMADDF 439 return true 440 case OpAdd32carry: 441 v.Op = OpARMADDS 442 return true 443 case OpAdd32withcarry: 444 v.Op = OpARMADC 445 return true 446 case OpAdd64F: 447 v.Op = OpARMADDD 448 return true 449 case OpAdd8: 450 v.Op = OpARMADD 451 return true 452 case OpAddPtr: 453 v.Op = OpARMADD 454 return true 455 case OpAddr: 456 return rewriteValueARM_OpAddr(v) 457 case OpAnd16: 458 v.Op = OpARMAND 459 return true 460 case OpAnd32: 461 v.Op = OpARMAND 462 return true 463 case OpAnd8: 464 v.Op = OpARMAND 465 return true 466 case OpAndB: 467 v.Op = OpARMAND 468 return true 469 case OpAvg32u: 470 return rewriteValueARM_OpAvg32u(v) 471 case OpBitLen32: 472 return rewriteValueARM_OpBitLen32(v) 473 case OpBswap32: 474 return rewriteValueARM_OpBswap32(v) 475 case OpClosureCall: 476 v.Op = OpARMCALLclosure 477 return true 478 case OpCom16: 479 v.Op = OpARMMVN 480 return true 481 case OpCom32: 482 v.Op = OpARMMVN 483 return true 484 case OpCom8: 485 v.Op = OpARMMVN 486 return true 487 case OpConst16: 488 return rewriteValueARM_OpConst16(v) 489 case OpConst32: 490 return rewriteValueARM_OpConst32(v) 491 case OpConst32F: 492 return rewriteValueARM_OpConst32F(v) 493 case OpConst64F: 494 return rewriteValueARM_OpConst64F(v) 495 case OpConst8: 496 return rewriteValueARM_OpConst8(v) 497 case OpConstBool: 498 return rewriteValueARM_OpConstBool(v) 499 case OpConstNil: 500 return rewriteValueARM_OpConstNil(v) 501 case OpCtz16: 502 return rewriteValueARM_OpCtz16(v) 503 case OpCtz16NonZero: 504 v.Op = OpCtz32 505 return true 506 case OpCtz32: 507 return rewriteValueARM_OpCtz32(v) 508 case OpCtz32NonZero: 509 v.Op = OpCtz32 510 return true 511 case OpCtz8: 512 return rewriteValueARM_OpCtz8(v) 513 case OpCtz8NonZero: 514 v.Op = OpCtz32 515 return true 516 case OpCvt32Fto32: 517 v.Op = OpARMMOVFW 518 return true 519 case OpCvt32Fto32U: 520 v.Op = OpARMMOVFWU 521 return true 522 case OpCvt32Fto64F: 523 v.Op = OpARMMOVFD 524 return true 525 case OpCvt32Uto32F: 526 v.Op = OpARMMOVWUF 527 return true 528 case OpCvt32Uto64F: 529 v.Op = OpARMMOVWUD 530 return true 531 case OpCvt32to32F: 532 v.Op = OpARMMOVWF 533 return true 534 case OpCvt32to64F: 535 v.Op = OpARMMOVWD 536 return true 537 case OpCvt64Fto32: 538 v.Op = OpARMMOVDW 539 return true 540 case OpCvt64Fto32F: 541 v.Op = OpARMMOVDF 542 return true 543 case OpCvt64Fto32U: 544 v.Op = OpARMMOVDWU 545 return true 546 case OpCvtBoolToUint8: 547 v.Op = OpCopy 548 return true 549 case OpDiv16: 550 return rewriteValueARM_OpDiv16(v) 551 case OpDiv16u: 552 return rewriteValueARM_OpDiv16u(v) 553 case OpDiv32: 554 return rewriteValueARM_OpDiv32(v) 555 case OpDiv32F: 556 v.Op = OpARMDIVF 557 return true 558 case OpDiv32u: 559 return rewriteValueARM_OpDiv32u(v) 560 case OpDiv64F: 561 v.Op = OpARMDIVD 562 return true 563 case OpDiv8: 564 return rewriteValueARM_OpDiv8(v) 565 case OpDiv8u: 566 return rewriteValueARM_OpDiv8u(v) 567 case OpEq16: 568 return rewriteValueARM_OpEq16(v) 569 case OpEq32: 570 return rewriteValueARM_OpEq32(v) 571 case OpEq32F: 572 return rewriteValueARM_OpEq32F(v) 573 case OpEq64F: 574 return rewriteValueARM_OpEq64F(v) 575 case OpEq8: 576 return rewriteValueARM_OpEq8(v) 577 case OpEqB: 578 return rewriteValueARM_OpEqB(v) 579 case OpEqPtr: 580 return rewriteValueARM_OpEqPtr(v) 581 case OpFMA: 582 return rewriteValueARM_OpFMA(v) 583 case OpGetCallerPC: 584 v.Op = OpARMLoweredGetCallerPC 585 return true 586 case OpGetCallerSP: 587 v.Op = OpARMLoweredGetCallerSP 588 return true 589 case OpGetClosurePtr: 590 v.Op = OpARMLoweredGetClosurePtr 591 return true 592 case OpHmul32: 593 v.Op = OpARMHMUL 594 return true 595 case OpHmul32u: 596 v.Op = OpARMHMULU 597 return true 598 case OpInterCall: 599 v.Op = OpARMCALLinter 600 return true 601 case OpIsInBounds: 602 return rewriteValueARM_OpIsInBounds(v) 603 case OpIsNonNil: 604 return rewriteValueARM_OpIsNonNil(v) 605 case OpIsSliceInBounds: 606 return rewriteValueARM_OpIsSliceInBounds(v) 607 case OpLeq16: 608 return rewriteValueARM_OpLeq16(v) 609 case OpLeq16U: 610 return rewriteValueARM_OpLeq16U(v) 611 case OpLeq32: 612 return rewriteValueARM_OpLeq32(v) 613 case OpLeq32F: 614 return rewriteValueARM_OpLeq32F(v) 615 case OpLeq32U: 616 return rewriteValueARM_OpLeq32U(v) 617 case OpLeq64F: 618 return rewriteValueARM_OpLeq64F(v) 619 case OpLeq8: 620 return rewriteValueARM_OpLeq8(v) 621 case OpLeq8U: 622 return rewriteValueARM_OpLeq8U(v) 623 case OpLess16: 624 return rewriteValueARM_OpLess16(v) 625 case OpLess16U: 626 return rewriteValueARM_OpLess16U(v) 627 case OpLess32: 628 return rewriteValueARM_OpLess32(v) 629 case OpLess32F: 630 return rewriteValueARM_OpLess32F(v) 631 case OpLess32U: 632 return rewriteValueARM_OpLess32U(v) 633 case OpLess64F: 634 return rewriteValueARM_OpLess64F(v) 635 case OpLess8: 636 return rewriteValueARM_OpLess8(v) 637 case OpLess8U: 638 return rewriteValueARM_OpLess8U(v) 639 case OpLoad: 640 return rewriteValueARM_OpLoad(v) 641 case OpLocalAddr: 642 return rewriteValueARM_OpLocalAddr(v) 643 case OpLsh16x16: 644 return rewriteValueARM_OpLsh16x16(v) 645 case OpLsh16x32: 646 return rewriteValueARM_OpLsh16x32(v) 647 case OpLsh16x64: 648 return rewriteValueARM_OpLsh16x64(v) 649 case OpLsh16x8: 650 return rewriteValueARM_OpLsh16x8(v) 651 case OpLsh32x16: 652 return rewriteValueARM_OpLsh32x16(v) 653 case OpLsh32x32: 654 return rewriteValueARM_OpLsh32x32(v) 655 case OpLsh32x64: 656 return rewriteValueARM_OpLsh32x64(v) 657 case OpLsh32x8: 658 return rewriteValueARM_OpLsh32x8(v) 659 case OpLsh8x16: 660 return rewriteValueARM_OpLsh8x16(v) 661 case OpLsh8x32: 662 return rewriteValueARM_OpLsh8x32(v) 663 case OpLsh8x64: 664 return rewriteValueARM_OpLsh8x64(v) 665 case OpLsh8x8: 666 return rewriteValueARM_OpLsh8x8(v) 667 case OpMod16: 668 return rewriteValueARM_OpMod16(v) 669 case OpMod16u: 670 return rewriteValueARM_OpMod16u(v) 671 case OpMod32: 672 return rewriteValueARM_OpMod32(v) 673 case OpMod32u: 674 return rewriteValueARM_OpMod32u(v) 675 case OpMod8: 676 return rewriteValueARM_OpMod8(v) 677 case OpMod8u: 678 return rewriteValueARM_OpMod8u(v) 679 case OpMove: 680 return rewriteValueARM_OpMove(v) 681 case OpMul16: 682 v.Op = OpARMMUL 683 return true 684 case OpMul32: 685 v.Op = OpARMMUL 686 return true 687 case OpMul32F: 688 v.Op = OpARMMULF 689 return true 690 case OpMul32uhilo: 691 v.Op = OpARMMULLU 692 return true 693 case OpMul64F: 694 v.Op = OpARMMULD 695 return true 696 case OpMul8: 697 v.Op = OpARMMUL 698 return true 699 case OpNeg16: 700 return rewriteValueARM_OpNeg16(v) 701 case OpNeg32: 702 return rewriteValueARM_OpNeg32(v) 703 case OpNeg32F: 704 v.Op = OpARMNEGF 705 return true 706 case OpNeg64F: 707 v.Op = OpARMNEGD 708 return true 709 case OpNeg8: 710 return rewriteValueARM_OpNeg8(v) 711 case OpNeq16: 712 return rewriteValueARM_OpNeq16(v) 713 case OpNeq32: 714 return rewriteValueARM_OpNeq32(v) 715 case OpNeq32F: 716 return rewriteValueARM_OpNeq32F(v) 717 case OpNeq64F: 718 return rewriteValueARM_OpNeq64F(v) 719 case OpNeq8: 720 return rewriteValueARM_OpNeq8(v) 721 case OpNeqB: 722 v.Op = OpARMXOR 723 return true 724 case OpNeqPtr: 725 return rewriteValueARM_OpNeqPtr(v) 726 case OpNilCheck: 727 v.Op = OpARMLoweredNilCheck 728 return true 729 case OpNot: 730 return rewriteValueARM_OpNot(v) 731 case OpOffPtr: 732 return rewriteValueARM_OpOffPtr(v) 733 case OpOr16: 734 v.Op = OpARMOR 735 return true 736 case OpOr32: 737 v.Op = OpARMOR 738 return true 739 case OpOr8: 740 v.Op = OpARMOR 741 return true 742 case OpOrB: 743 v.Op = OpARMOR 744 return true 745 case OpPanicBounds: 746 return rewriteValueARM_OpPanicBounds(v) 747 case OpPanicExtend: 748 return rewriteValueARM_OpPanicExtend(v) 749 case OpRotateLeft16: 750 return rewriteValueARM_OpRotateLeft16(v) 751 case OpRotateLeft32: 752 return rewriteValueARM_OpRotateLeft32(v) 753 case OpRotateLeft8: 754 return rewriteValueARM_OpRotateLeft8(v) 755 case OpRound32F: 756 v.Op = OpCopy 757 return true 758 case OpRound64F: 759 v.Op = OpCopy 760 return true 761 case OpRsh16Ux16: 762 return rewriteValueARM_OpRsh16Ux16(v) 763 case OpRsh16Ux32: 764 return rewriteValueARM_OpRsh16Ux32(v) 765 case OpRsh16Ux64: 766 return rewriteValueARM_OpRsh16Ux64(v) 767 case OpRsh16Ux8: 768 return rewriteValueARM_OpRsh16Ux8(v) 769 case OpRsh16x16: 770 return rewriteValueARM_OpRsh16x16(v) 771 case OpRsh16x32: 772 return rewriteValueARM_OpRsh16x32(v) 773 case OpRsh16x64: 774 return rewriteValueARM_OpRsh16x64(v) 775 case OpRsh16x8: 776 return rewriteValueARM_OpRsh16x8(v) 777 case OpRsh32Ux16: 778 return rewriteValueARM_OpRsh32Ux16(v) 779 case OpRsh32Ux32: 780 return rewriteValueARM_OpRsh32Ux32(v) 781 case OpRsh32Ux64: 782 return rewriteValueARM_OpRsh32Ux64(v) 783 case OpRsh32Ux8: 784 return rewriteValueARM_OpRsh32Ux8(v) 785 case OpRsh32x16: 786 return rewriteValueARM_OpRsh32x16(v) 787 case OpRsh32x32: 788 return rewriteValueARM_OpRsh32x32(v) 789 case OpRsh32x64: 790 return rewriteValueARM_OpRsh32x64(v) 791 case OpRsh32x8: 792 return rewriteValueARM_OpRsh32x8(v) 793 case OpRsh8Ux16: 794 return rewriteValueARM_OpRsh8Ux16(v) 795 case OpRsh8Ux32: 796 return rewriteValueARM_OpRsh8Ux32(v) 797 case OpRsh8Ux64: 798 return rewriteValueARM_OpRsh8Ux64(v) 799 case OpRsh8Ux8: 800 return rewriteValueARM_OpRsh8Ux8(v) 801 case OpRsh8x16: 802 return rewriteValueARM_OpRsh8x16(v) 803 case OpRsh8x32: 804 return rewriteValueARM_OpRsh8x32(v) 805 case OpRsh8x64: 806 return rewriteValueARM_OpRsh8x64(v) 807 case OpRsh8x8: 808 return rewriteValueARM_OpRsh8x8(v) 809 case OpSelect0: 810 return rewriteValueARM_OpSelect0(v) 811 case OpSelect1: 812 return rewriteValueARM_OpSelect1(v) 813 case OpSignExt16to32: 814 v.Op = OpARMMOVHreg 815 return true 816 case OpSignExt8to16: 817 v.Op = OpARMMOVBreg 818 return true 819 case OpSignExt8to32: 820 v.Op = OpARMMOVBreg 821 return true 822 case OpSignmask: 823 return rewriteValueARM_OpSignmask(v) 824 case OpSlicemask: 825 return rewriteValueARM_OpSlicemask(v) 826 case OpSqrt: 827 v.Op = OpARMSQRTD 828 return true 829 case OpSqrt32: 830 v.Op = OpARMSQRTF 831 return true 832 case OpStaticCall: 833 v.Op = OpARMCALLstatic 834 return true 835 case OpStore: 836 return rewriteValueARM_OpStore(v) 837 case OpSub16: 838 v.Op = OpARMSUB 839 return true 840 case OpSub32: 841 v.Op = OpARMSUB 842 return true 843 case OpSub32F: 844 v.Op = OpARMSUBF 845 return true 846 case OpSub32carry: 847 v.Op = OpARMSUBS 848 return true 849 case OpSub32withcarry: 850 v.Op = OpARMSBC 851 return true 852 case OpSub64F: 853 v.Op = OpARMSUBD 854 return true 855 case OpSub8: 856 v.Op = OpARMSUB 857 return true 858 case OpSubPtr: 859 v.Op = OpARMSUB 860 return true 861 case OpTailCall: 862 v.Op = OpARMCALLtail 863 return true 864 case OpTrunc16to8: 865 v.Op = OpCopy 866 return true 867 case OpTrunc32to16: 868 v.Op = OpCopy 869 return true 870 case OpTrunc32to8: 871 v.Op = OpCopy 872 return true 873 case OpWB: 874 v.Op = OpARMLoweredWB 875 return true 876 case OpXor16: 877 v.Op = OpARMXOR 878 return true 879 case OpXor32: 880 v.Op = OpARMXOR 881 return true 882 case OpXor8: 883 v.Op = OpARMXOR 884 return true 885 case OpZero: 886 return rewriteValueARM_OpZero(v) 887 case OpZeroExt16to32: 888 v.Op = OpARMMOVHUreg 889 return true 890 case OpZeroExt8to16: 891 v.Op = OpARMMOVBUreg 892 return true 893 case OpZeroExt8to32: 894 v.Op = OpARMMOVBUreg 895 return true 896 case OpZeromask: 897 return rewriteValueARM_OpZeromask(v) 898 } 899 return false 900 } 901 func rewriteValueARM_OpARMADC(v *Value) bool { 902 v_2 := v.Args[2] 903 v_1 := v.Args[1] 904 v_0 := v.Args[0] 905 // match: (ADC (MOVWconst [c]) x flags) 906 // result: (ADCconst [c] x flags) 907 for { 908 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 909 if v_0.Op != OpARMMOVWconst { 910 continue 911 } 912 c := auxIntToInt32(v_0.AuxInt) 913 x := v_1 914 flags := v_2 915 v.reset(OpARMADCconst) 916 v.AuxInt = int32ToAuxInt(c) 917 v.AddArg2(x, flags) 918 return true 919 } 920 break 921 } 922 // match: (ADC x (SLLconst [c] y) flags) 923 // result: (ADCshiftLL x y [c] flags) 924 for { 925 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 926 x := v_0 927 if v_1.Op != OpARMSLLconst { 928 continue 929 } 930 c := auxIntToInt32(v_1.AuxInt) 931 y := v_1.Args[0] 932 flags := v_2 933 v.reset(OpARMADCshiftLL) 934 v.AuxInt = int32ToAuxInt(c) 935 v.AddArg3(x, y, flags) 936 return true 937 } 938 break 939 } 940 // match: (ADC x (SRLconst [c] y) flags) 941 // result: (ADCshiftRL x y [c] flags) 942 for { 943 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 944 x := v_0 945 if v_1.Op != OpARMSRLconst { 946 continue 947 } 948 c := auxIntToInt32(v_1.AuxInt) 949 y := v_1.Args[0] 950 flags := v_2 951 v.reset(OpARMADCshiftRL) 952 v.AuxInt = int32ToAuxInt(c) 953 v.AddArg3(x, y, flags) 954 return true 955 } 956 break 957 } 958 // match: (ADC x (SRAconst [c] y) flags) 959 // result: (ADCshiftRA x y [c] flags) 960 for { 961 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 962 x := v_0 963 if v_1.Op != OpARMSRAconst { 964 continue 965 } 966 c := auxIntToInt32(v_1.AuxInt) 967 y := v_1.Args[0] 968 flags := v_2 969 v.reset(OpARMADCshiftRA) 970 v.AuxInt = int32ToAuxInt(c) 971 v.AddArg3(x, y, flags) 972 return true 973 } 974 break 975 } 976 // match: (ADC x (SLL y z) flags) 977 // result: (ADCshiftLLreg x y z flags) 978 for { 979 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 980 x := v_0 981 if v_1.Op != OpARMSLL { 982 continue 983 } 984 z := v_1.Args[1] 985 y := v_1.Args[0] 986 flags := v_2 987 v.reset(OpARMADCshiftLLreg) 988 v.AddArg4(x, y, z, flags) 989 return true 990 } 991 break 992 } 993 // match: (ADC x (SRL y z) flags) 994 // result: (ADCshiftRLreg x y z flags) 995 for { 996 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 997 x := v_0 998 if v_1.Op != OpARMSRL { 999 continue 1000 } 1001 z := v_1.Args[1] 1002 y := v_1.Args[0] 1003 flags := v_2 1004 v.reset(OpARMADCshiftRLreg) 1005 v.AddArg4(x, y, z, flags) 1006 return true 1007 } 1008 break 1009 } 1010 // match: (ADC x (SRA y z) flags) 1011 // result: (ADCshiftRAreg x y z flags) 1012 for { 1013 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1014 x := v_0 1015 if v_1.Op != OpARMSRA { 1016 continue 1017 } 1018 z := v_1.Args[1] 1019 y := v_1.Args[0] 1020 flags := v_2 1021 v.reset(OpARMADCshiftRAreg) 1022 v.AddArg4(x, y, z, flags) 1023 return true 1024 } 1025 break 1026 } 1027 return false 1028 } 1029 func rewriteValueARM_OpARMADCconst(v *Value) bool { 1030 v_1 := v.Args[1] 1031 v_0 := v.Args[0] 1032 // match: (ADCconst [c] (ADDconst [d] x) flags) 1033 // result: (ADCconst [c+d] x flags) 1034 for { 1035 c := auxIntToInt32(v.AuxInt) 1036 if v_0.Op != OpARMADDconst { 1037 break 1038 } 1039 d := auxIntToInt32(v_0.AuxInt) 1040 x := v_0.Args[0] 1041 flags := v_1 1042 v.reset(OpARMADCconst) 1043 v.AuxInt = int32ToAuxInt(c + d) 1044 v.AddArg2(x, flags) 1045 return true 1046 } 1047 // match: (ADCconst [c] (SUBconst [d] x) flags) 1048 // result: (ADCconst [c-d] x flags) 1049 for { 1050 c := auxIntToInt32(v.AuxInt) 1051 if v_0.Op != OpARMSUBconst { 1052 break 1053 } 1054 d := auxIntToInt32(v_0.AuxInt) 1055 x := v_0.Args[0] 1056 flags := v_1 1057 v.reset(OpARMADCconst) 1058 v.AuxInt = int32ToAuxInt(c - d) 1059 v.AddArg2(x, flags) 1060 return true 1061 } 1062 return false 1063 } 1064 func rewriteValueARM_OpARMADCshiftLL(v *Value) bool { 1065 v_2 := v.Args[2] 1066 v_1 := v.Args[1] 1067 v_0 := v.Args[0] 1068 b := v.Block 1069 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1070 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1071 for { 1072 d := auxIntToInt32(v.AuxInt) 1073 if v_0.Op != OpARMMOVWconst { 1074 break 1075 } 1076 c := auxIntToInt32(v_0.AuxInt) 1077 x := v_1 1078 flags := v_2 1079 v.reset(OpARMADCconst) 1080 v.AuxInt = int32ToAuxInt(c) 1081 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1082 v0.AuxInt = int32ToAuxInt(d) 1083 v0.AddArg(x) 1084 v.AddArg2(v0, flags) 1085 return true 1086 } 1087 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1088 // result: (ADCconst x [c<<uint64(d)] flags) 1089 for { 1090 d := auxIntToInt32(v.AuxInt) 1091 x := v_0 1092 if v_1.Op != OpARMMOVWconst { 1093 break 1094 } 1095 c := auxIntToInt32(v_1.AuxInt) 1096 flags := v_2 1097 v.reset(OpARMADCconst) 1098 v.AuxInt = int32ToAuxInt(c << uint64(d)) 1099 v.AddArg2(x, flags) 1100 return true 1101 } 1102 return false 1103 } 1104 func rewriteValueARM_OpARMADCshiftLLreg(v *Value) bool { 1105 v_3 := v.Args[3] 1106 v_2 := v.Args[2] 1107 v_1 := v.Args[1] 1108 v_0 := v.Args[0] 1109 b := v.Block 1110 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1111 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1112 for { 1113 if v_0.Op != OpARMMOVWconst { 1114 break 1115 } 1116 c := auxIntToInt32(v_0.AuxInt) 1117 x := v_1 1118 y := v_2 1119 flags := v_3 1120 v.reset(OpARMADCconst) 1121 v.AuxInt = int32ToAuxInt(c) 1122 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1123 v0.AddArg2(x, y) 1124 v.AddArg2(v0, flags) 1125 return true 1126 } 1127 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1128 // cond: 0 <= c && c < 32 1129 // result: (ADCshiftLL x y [c] flags) 1130 for { 1131 x := v_0 1132 y := v_1 1133 if v_2.Op != OpARMMOVWconst { 1134 break 1135 } 1136 c := auxIntToInt32(v_2.AuxInt) 1137 flags := v_3 1138 if !(0 <= c && c < 32) { 1139 break 1140 } 1141 v.reset(OpARMADCshiftLL) 1142 v.AuxInt = int32ToAuxInt(c) 1143 v.AddArg3(x, y, flags) 1144 return true 1145 } 1146 return false 1147 } 1148 func rewriteValueARM_OpARMADCshiftRA(v *Value) bool { 1149 v_2 := v.Args[2] 1150 v_1 := v.Args[1] 1151 v_0 := v.Args[0] 1152 b := v.Block 1153 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1154 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1155 for { 1156 d := auxIntToInt32(v.AuxInt) 1157 if v_0.Op != OpARMMOVWconst { 1158 break 1159 } 1160 c := auxIntToInt32(v_0.AuxInt) 1161 x := v_1 1162 flags := v_2 1163 v.reset(OpARMADCconst) 1164 v.AuxInt = int32ToAuxInt(c) 1165 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1166 v0.AuxInt = int32ToAuxInt(d) 1167 v0.AddArg(x) 1168 v.AddArg2(v0, flags) 1169 return true 1170 } 1171 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1172 // result: (ADCconst x [c>>uint64(d)] flags) 1173 for { 1174 d := auxIntToInt32(v.AuxInt) 1175 x := v_0 1176 if v_1.Op != OpARMMOVWconst { 1177 break 1178 } 1179 c := auxIntToInt32(v_1.AuxInt) 1180 flags := v_2 1181 v.reset(OpARMADCconst) 1182 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 1183 v.AddArg2(x, flags) 1184 return true 1185 } 1186 return false 1187 } 1188 func rewriteValueARM_OpARMADCshiftRAreg(v *Value) bool { 1189 v_3 := v.Args[3] 1190 v_2 := v.Args[2] 1191 v_1 := v.Args[1] 1192 v_0 := v.Args[0] 1193 b := v.Block 1194 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1195 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1196 for { 1197 if v_0.Op != OpARMMOVWconst { 1198 break 1199 } 1200 c := auxIntToInt32(v_0.AuxInt) 1201 x := v_1 1202 y := v_2 1203 flags := v_3 1204 v.reset(OpARMADCconst) 1205 v.AuxInt = int32ToAuxInt(c) 1206 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1207 v0.AddArg2(x, y) 1208 v.AddArg2(v0, flags) 1209 return true 1210 } 1211 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1212 // cond: 0 <= c && c < 32 1213 // result: (ADCshiftRA x y [c] flags) 1214 for { 1215 x := v_0 1216 y := v_1 1217 if v_2.Op != OpARMMOVWconst { 1218 break 1219 } 1220 c := auxIntToInt32(v_2.AuxInt) 1221 flags := v_3 1222 if !(0 <= c && c < 32) { 1223 break 1224 } 1225 v.reset(OpARMADCshiftRA) 1226 v.AuxInt = int32ToAuxInt(c) 1227 v.AddArg3(x, y, flags) 1228 return true 1229 } 1230 return false 1231 } 1232 func rewriteValueARM_OpARMADCshiftRL(v *Value) bool { 1233 v_2 := v.Args[2] 1234 v_1 := v.Args[1] 1235 v_0 := v.Args[0] 1236 b := v.Block 1237 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1238 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1239 for { 1240 d := auxIntToInt32(v.AuxInt) 1241 if v_0.Op != OpARMMOVWconst { 1242 break 1243 } 1244 c := auxIntToInt32(v_0.AuxInt) 1245 x := v_1 1246 flags := v_2 1247 v.reset(OpARMADCconst) 1248 v.AuxInt = int32ToAuxInt(c) 1249 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1250 v0.AuxInt = int32ToAuxInt(d) 1251 v0.AddArg(x) 1252 v.AddArg2(v0, flags) 1253 return true 1254 } 1255 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1256 // result: (ADCconst x [int32(uint32(c)>>uint64(d))] flags) 1257 for { 1258 d := auxIntToInt32(v.AuxInt) 1259 x := v_0 1260 if v_1.Op != OpARMMOVWconst { 1261 break 1262 } 1263 c := auxIntToInt32(v_1.AuxInt) 1264 flags := v_2 1265 v.reset(OpARMADCconst) 1266 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 1267 v.AddArg2(x, flags) 1268 return true 1269 } 1270 return false 1271 } 1272 func rewriteValueARM_OpARMADCshiftRLreg(v *Value) bool { 1273 v_3 := v.Args[3] 1274 v_2 := v.Args[2] 1275 v_1 := v.Args[1] 1276 v_0 := v.Args[0] 1277 b := v.Block 1278 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1279 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1280 for { 1281 if v_0.Op != OpARMMOVWconst { 1282 break 1283 } 1284 c := auxIntToInt32(v_0.AuxInt) 1285 x := v_1 1286 y := v_2 1287 flags := v_3 1288 v.reset(OpARMADCconst) 1289 v.AuxInt = int32ToAuxInt(c) 1290 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1291 v0.AddArg2(x, y) 1292 v.AddArg2(v0, flags) 1293 return true 1294 } 1295 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1296 // cond: 0 <= c && c < 32 1297 // result: (ADCshiftRL x y [c] flags) 1298 for { 1299 x := v_0 1300 y := v_1 1301 if v_2.Op != OpARMMOVWconst { 1302 break 1303 } 1304 c := auxIntToInt32(v_2.AuxInt) 1305 flags := v_3 1306 if !(0 <= c && c < 32) { 1307 break 1308 } 1309 v.reset(OpARMADCshiftRL) 1310 v.AuxInt = int32ToAuxInt(c) 1311 v.AddArg3(x, y, flags) 1312 return true 1313 } 1314 return false 1315 } 1316 func rewriteValueARM_OpARMADD(v *Value) bool { 1317 v_1 := v.Args[1] 1318 v_0 := v.Args[0] 1319 b := v.Block 1320 // match: (ADD x (MOVWconst <t> [c])) 1321 // cond: !t.IsPtr() 1322 // result: (ADDconst [c] x) 1323 for { 1324 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1325 x := v_0 1326 if v_1.Op != OpARMMOVWconst { 1327 continue 1328 } 1329 t := v_1.Type 1330 c := auxIntToInt32(v_1.AuxInt) 1331 if !(!t.IsPtr()) { 1332 continue 1333 } 1334 v.reset(OpARMADDconst) 1335 v.AuxInt = int32ToAuxInt(c) 1336 v.AddArg(x) 1337 return true 1338 } 1339 break 1340 } 1341 // match: (ADD x (SLLconst [c] y)) 1342 // result: (ADDshiftLL x y [c]) 1343 for { 1344 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1345 x := v_0 1346 if v_1.Op != OpARMSLLconst { 1347 continue 1348 } 1349 c := auxIntToInt32(v_1.AuxInt) 1350 y := v_1.Args[0] 1351 v.reset(OpARMADDshiftLL) 1352 v.AuxInt = int32ToAuxInt(c) 1353 v.AddArg2(x, y) 1354 return true 1355 } 1356 break 1357 } 1358 // match: (ADD x (SRLconst [c] y)) 1359 // result: (ADDshiftRL x y [c]) 1360 for { 1361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1362 x := v_0 1363 if v_1.Op != OpARMSRLconst { 1364 continue 1365 } 1366 c := auxIntToInt32(v_1.AuxInt) 1367 y := v_1.Args[0] 1368 v.reset(OpARMADDshiftRL) 1369 v.AuxInt = int32ToAuxInt(c) 1370 v.AddArg2(x, y) 1371 return true 1372 } 1373 break 1374 } 1375 // match: (ADD x (SRAconst [c] y)) 1376 // result: (ADDshiftRA x y [c]) 1377 for { 1378 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1379 x := v_0 1380 if v_1.Op != OpARMSRAconst { 1381 continue 1382 } 1383 c := auxIntToInt32(v_1.AuxInt) 1384 y := v_1.Args[0] 1385 v.reset(OpARMADDshiftRA) 1386 v.AuxInt = int32ToAuxInt(c) 1387 v.AddArg2(x, y) 1388 return true 1389 } 1390 break 1391 } 1392 // match: (ADD x (SLL y z)) 1393 // result: (ADDshiftLLreg x y z) 1394 for { 1395 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1396 x := v_0 1397 if v_1.Op != OpARMSLL { 1398 continue 1399 } 1400 z := v_1.Args[1] 1401 y := v_1.Args[0] 1402 v.reset(OpARMADDshiftLLreg) 1403 v.AddArg3(x, y, z) 1404 return true 1405 } 1406 break 1407 } 1408 // match: (ADD x (SRL y z)) 1409 // result: (ADDshiftRLreg x y z) 1410 for { 1411 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1412 x := v_0 1413 if v_1.Op != OpARMSRL { 1414 continue 1415 } 1416 z := v_1.Args[1] 1417 y := v_1.Args[0] 1418 v.reset(OpARMADDshiftRLreg) 1419 v.AddArg3(x, y, z) 1420 return true 1421 } 1422 break 1423 } 1424 // match: (ADD x (SRA y z)) 1425 // result: (ADDshiftRAreg x y z) 1426 for { 1427 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1428 x := v_0 1429 if v_1.Op != OpARMSRA { 1430 continue 1431 } 1432 z := v_1.Args[1] 1433 y := v_1.Args[0] 1434 v.reset(OpARMADDshiftRAreg) 1435 v.AddArg3(x, y, z) 1436 return true 1437 } 1438 break 1439 } 1440 // match: (ADD x (RSBconst [0] y)) 1441 // result: (SUB x y) 1442 for { 1443 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1444 x := v_0 1445 if v_1.Op != OpARMRSBconst || auxIntToInt32(v_1.AuxInt) != 0 { 1446 continue 1447 } 1448 y := v_1.Args[0] 1449 v.reset(OpARMSUB) 1450 v.AddArg2(x, y) 1451 return true 1452 } 1453 break 1454 } 1455 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 1456 // result: (RSBconst [c+d] (ADD <t> x y)) 1457 for { 1458 t := v.Type 1459 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1460 if v_0.Op != OpARMRSBconst { 1461 continue 1462 } 1463 c := auxIntToInt32(v_0.AuxInt) 1464 x := v_0.Args[0] 1465 if v_1.Op != OpARMRSBconst { 1466 continue 1467 } 1468 d := auxIntToInt32(v_1.AuxInt) 1469 y := v_1.Args[0] 1470 v.reset(OpARMRSBconst) 1471 v.AuxInt = int32ToAuxInt(c + d) 1472 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1473 v0.AddArg2(x, y) 1474 v.AddArg(v0) 1475 return true 1476 } 1477 break 1478 } 1479 // match: (ADD (MUL x y) a) 1480 // result: (MULA x y a) 1481 for { 1482 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1483 if v_0.Op != OpARMMUL { 1484 continue 1485 } 1486 y := v_0.Args[1] 1487 x := v_0.Args[0] 1488 a := v_1 1489 v.reset(OpARMMULA) 1490 v.AddArg3(x, y, a) 1491 return true 1492 } 1493 break 1494 } 1495 return false 1496 } 1497 func rewriteValueARM_OpARMADDD(v *Value) bool { 1498 v_1 := v.Args[1] 1499 v_0 := v.Args[0] 1500 // match: (ADDD a (MULD x y)) 1501 // cond: a.Uses == 1 && buildcfg.GOARM.Version >= 6 1502 // result: (MULAD a x y) 1503 for { 1504 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1505 a := v_0 1506 if v_1.Op != OpARMMULD { 1507 continue 1508 } 1509 y := v_1.Args[1] 1510 x := v_1.Args[0] 1511 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) { 1512 continue 1513 } 1514 v.reset(OpARMMULAD) 1515 v.AddArg3(a, x, y) 1516 return true 1517 } 1518 break 1519 } 1520 // match: (ADDD a (NMULD x y)) 1521 // cond: a.Uses == 1 && buildcfg.GOARM.Version >= 6 1522 // result: (MULSD a x y) 1523 for { 1524 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1525 a := v_0 1526 if v_1.Op != OpARMNMULD { 1527 continue 1528 } 1529 y := v_1.Args[1] 1530 x := v_1.Args[0] 1531 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) { 1532 continue 1533 } 1534 v.reset(OpARMMULSD) 1535 v.AddArg3(a, x, y) 1536 return true 1537 } 1538 break 1539 } 1540 return false 1541 } 1542 func rewriteValueARM_OpARMADDF(v *Value) bool { 1543 v_1 := v.Args[1] 1544 v_0 := v.Args[0] 1545 // match: (ADDF a (MULF x y)) 1546 // cond: a.Uses == 1 && buildcfg.GOARM.Version >= 6 1547 // result: (MULAF a x y) 1548 for { 1549 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1550 a := v_0 1551 if v_1.Op != OpARMMULF { 1552 continue 1553 } 1554 y := v_1.Args[1] 1555 x := v_1.Args[0] 1556 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) { 1557 continue 1558 } 1559 v.reset(OpARMMULAF) 1560 v.AddArg3(a, x, y) 1561 return true 1562 } 1563 break 1564 } 1565 // match: (ADDF a (NMULF x y)) 1566 // cond: a.Uses == 1 && buildcfg.GOARM.Version >= 6 1567 // result: (MULSF a x y) 1568 for { 1569 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1570 a := v_0 1571 if v_1.Op != OpARMNMULF { 1572 continue 1573 } 1574 y := v_1.Args[1] 1575 x := v_1.Args[0] 1576 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) { 1577 continue 1578 } 1579 v.reset(OpARMMULSF) 1580 v.AddArg3(a, x, y) 1581 return true 1582 } 1583 break 1584 } 1585 return false 1586 } 1587 func rewriteValueARM_OpARMADDS(v *Value) bool { 1588 v_1 := v.Args[1] 1589 v_0 := v.Args[0] 1590 // match: (ADDS x (MOVWconst [c])) 1591 // result: (ADDSconst [c] x) 1592 for { 1593 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1594 x := v_0 1595 if v_1.Op != OpARMMOVWconst { 1596 continue 1597 } 1598 c := auxIntToInt32(v_1.AuxInt) 1599 v.reset(OpARMADDSconst) 1600 v.AuxInt = int32ToAuxInt(c) 1601 v.AddArg(x) 1602 return true 1603 } 1604 break 1605 } 1606 // match: (ADDS x (SLLconst [c] y)) 1607 // result: (ADDSshiftLL x y [c]) 1608 for { 1609 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1610 x := v_0 1611 if v_1.Op != OpARMSLLconst { 1612 continue 1613 } 1614 c := auxIntToInt32(v_1.AuxInt) 1615 y := v_1.Args[0] 1616 v.reset(OpARMADDSshiftLL) 1617 v.AuxInt = int32ToAuxInt(c) 1618 v.AddArg2(x, y) 1619 return true 1620 } 1621 break 1622 } 1623 // match: (ADDS x (SRLconst [c] y)) 1624 // result: (ADDSshiftRL x y [c]) 1625 for { 1626 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1627 x := v_0 1628 if v_1.Op != OpARMSRLconst { 1629 continue 1630 } 1631 c := auxIntToInt32(v_1.AuxInt) 1632 y := v_1.Args[0] 1633 v.reset(OpARMADDSshiftRL) 1634 v.AuxInt = int32ToAuxInt(c) 1635 v.AddArg2(x, y) 1636 return true 1637 } 1638 break 1639 } 1640 // match: (ADDS x (SRAconst [c] y)) 1641 // result: (ADDSshiftRA x y [c]) 1642 for { 1643 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1644 x := v_0 1645 if v_1.Op != OpARMSRAconst { 1646 continue 1647 } 1648 c := auxIntToInt32(v_1.AuxInt) 1649 y := v_1.Args[0] 1650 v.reset(OpARMADDSshiftRA) 1651 v.AuxInt = int32ToAuxInt(c) 1652 v.AddArg2(x, y) 1653 return true 1654 } 1655 break 1656 } 1657 // match: (ADDS x (SLL y z)) 1658 // result: (ADDSshiftLLreg x y z) 1659 for { 1660 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1661 x := v_0 1662 if v_1.Op != OpARMSLL { 1663 continue 1664 } 1665 z := v_1.Args[1] 1666 y := v_1.Args[0] 1667 v.reset(OpARMADDSshiftLLreg) 1668 v.AddArg3(x, y, z) 1669 return true 1670 } 1671 break 1672 } 1673 // match: (ADDS x (SRL y z)) 1674 // result: (ADDSshiftRLreg x y z) 1675 for { 1676 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1677 x := v_0 1678 if v_1.Op != OpARMSRL { 1679 continue 1680 } 1681 z := v_1.Args[1] 1682 y := v_1.Args[0] 1683 v.reset(OpARMADDSshiftRLreg) 1684 v.AddArg3(x, y, z) 1685 return true 1686 } 1687 break 1688 } 1689 // match: (ADDS x (SRA y z)) 1690 // result: (ADDSshiftRAreg x y z) 1691 for { 1692 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 1693 x := v_0 1694 if v_1.Op != OpARMSRA { 1695 continue 1696 } 1697 z := v_1.Args[1] 1698 y := v_1.Args[0] 1699 v.reset(OpARMADDSshiftRAreg) 1700 v.AddArg3(x, y, z) 1701 return true 1702 } 1703 break 1704 } 1705 return false 1706 } 1707 func rewriteValueARM_OpARMADDSshiftLL(v *Value) bool { 1708 v_1 := v.Args[1] 1709 v_0 := v.Args[0] 1710 b := v.Block 1711 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 1712 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 1713 for { 1714 d := auxIntToInt32(v.AuxInt) 1715 if v_0.Op != OpARMMOVWconst { 1716 break 1717 } 1718 c := auxIntToInt32(v_0.AuxInt) 1719 x := v_1 1720 v.reset(OpARMADDSconst) 1721 v.AuxInt = int32ToAuxInt(c) 1722 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1723 v0.AuxInt = int32ToAuxInt(d) 1724 v0.AddArg(x) 1725 v.AddArg(v0) 1726 return true 1727 } 1728 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 1729 // result: (ADDSconst x [c<<uint64(d)]) 1730 for { 1731 d := auxIntToInt32(v.AuxInt) 1732 x := v_0 1733 if v_1.Op != OpARMMOVWconst { 1734 break 1735 } 1736 c := auxIntToInt32(v_1.AuxInt) 1737 v.reset(OpARMADDSconst) 1738 v.AuxInt = int32ToAuxInt(c << uint64(d)) 1739 v.AddArg(x) 1740 return true 1741 } 1742 return false 1743 } 1744 func rewriteValueARM_OpARMADDSshiftLLreg(v *Value) bool { 1745 v_2 := v.Args[2] 1746 v_1 := v.Args[1] 1747 v_0 := v.Args[0] 1748 b := v.Block 1749 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 1750 // result: (ADDSconst [c] (SLL <x.Type> x y)) 1751 for { 1752 if v_0.Op != OpARMMOVWconst { 1753 break 1754 } 1755 c := auxIntToInt32(v_0.AuxInt) 1756 x := v_1 1757 y := v_2 1758 v.reset(OpARMADDSconst) 1759 v.AuxInt = int32ToAuxInt(c) 1760 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1761 v0.AddArg2(x, y) 1762 v.AddArg(v0) 1763 return true 1764 } 1765 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 1766 // cond: 0 <= c && c < 32 1767 // result: (ADDSshiftLL x y [c]) 1768 for { 1769 x := v_0 1770 y := v_1 1771 if v_2.Op != OpARMMOVWconst { 1772 break 1773 } 1774 c := auxIntToInt32(v_2.AuxInt) 1775 if !(0 <= c && c < 32) { 1776 break 1777 } 1778 v.reset(OpARMADDSshiftLL) 1779 v.AuxInt = int32ToAuxInt(c) 1780 v.AddArg2(x, y) 1781 return true 1782 } 1783 return false 1784 } 1785 func rewriteValueARM_OpARMADDSshiftRA(v *Value) bool { 1786 v_1 := v.Args[1] 1787 v_0 := v.Args[0] 1788 b := v.Block 1789 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 1790 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 1791 for { 1792 d := auxIntToInt32(v.AuxInt) 1793 if v_0.Op != OpARMMOVWconst { 1794 break 1795 } 1796 c := auxIntToInt32(v_0.AuxInt) 1797 x := v_1 1798 v.reset(OpARMADDSconst) 1799 v.AuxInt = int32ToAuxInt(c) 1800 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1801 v0.AuxInt = int32ToAuxInt(d) 1802 v0.AddArg(x) 1803 v.AddArg(v0) 1804 return true 1805 } 1806 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 1807 // result: (ADDSconst x [c>>uint64(d)]) 1808 for { 1809 d := auxIntToInt32(v.AuxInt) 1810 x := v_0 1811 if v_1.Op != OpARMMOVWconst { 1812 break 1813 } 1814 c := auxIntToInt32(v_1.AuxInt) 1815 v.reset(OpARMADDSconst) 1816 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 1817 v.AddArg(x) 1818 return true 1819 } 1820 return false 1821 } 1822 func rewriteValueARM_OpARMADDSshiftRAreg(v *Value) bool { 1823 v_2 := v.Args[2] 1824 v_1 := v.Args[1] 1825 v_0 := v.Args[0] 1826 b := v.Block 1827 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 1828 // result: (ADDSconst [c] (SRA <x.Type> x y)) 1829 for { 1830 if v_0.Op != OpARMMOVWconst { 1831 break 1832 } 1833 c := auxIntToInt32(v_0.AuxInt) 1834 x := v_1 1835 y := v_2 1836 v.reset(OpARMADDSconst) 1837 v.AuxInt = int32ToAuxInt(c) 1838 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1839 v0.AddArg2(x, y) 1840 v.AddArg(v0) 1841 return true 1842 } 1843 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 1844 // cond: 0 <= c && c < 32 1845 // result: (ADDSshiftRA x y [c]) 1846 for { 1847 x := v_0 1848 y := v_1 1849 if v_2.Op != OpARMMOVWconst { 1850 break 1851 } 1852 c := auxIntToInt32(v_2.AuxInt) 1853 if !(0 <= c && c < 32) { 1854 break 1855 } 1856 v.reset(OpARMADDSshiftRA) 1857 v.AuxInt = int32ToAuxInt(c) 1858 v.AddArg2(x, y) 1859 return true 1860 } 1861 return false 1862 } 1863 func rewriteValueARM_OpARMADDSshiftRL(v *Value) bool { 1864 v_1 := v.Args[1] 1865 v_0 := v.Args[0] 1866 b := v.Block 1867 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 1868 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 1869 for { 1870 d := auxIntToInt32(v.AuxInt) 1871 if v_0.Op != OpARMMOVWconst { 1872 break 1873 } 1874 c := auxIntToInt32(v_0.AuxInt) 1875 x := v_1 1876 v.reset(OpARMADDSconst) 1877 v.AuxInt = int32ToAuxInt(c) 1878 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1879 v0.AuxInt = int32ToAuxInt(d) 1880 v0.AddArg(x) 1881 v.AddArg(v0) 1882 return true 1883 } 1884 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 1885 // result: (ADDSconst x [int32(uint32(c)>>uint64(d))]) 1886 for { 1887 d := auxIntToInt32(v.AuxInt) 1888 x := v_0 1889 if v_1.Op != OpARMMOVWconst { 1890 break 1891 } 1892 c := auxIntToInt32(v_1.AuxInt) 1893 v.reset(OpARMADDSconst) 1894 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 1895 v.AddArg(x) 1896 return true 1897 } 1898 return false 1899 } 1900 func rewriteValueARM_OpARMADDSshiftRLreg(v *Value) bool { 1901 v_2 := v.Args[2] 1902 v_1 := v.Args[1] 1903 v_0 := v.Args[0] 1904 b := v.Block 1905 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 1906 // result: (ADDSconst [c] (SRL <x.Type> x y)) 1907 for { 1908 if v_0.Op != OpARMMOVWconst { 1909 break 1910 } 1911 c := auxIntToInt32(v_0.AuxInt) 1912 x := v_1 1913 y := v_2 1914 v.reset(OpARMADDSconst) 1915 v.AuxInt = int32ToAuxInt(c) 1916 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1917 v0.AddArg2(x, y) 1918 v.AddArg(v0) 1919 return true 1920 } 1921 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 1922 // cond: 0 <= c && c < 32 1923 // result: (ADDSshiftRL x y [c]) 1924 for { 1925 x := v_0 1926 y := v_1 1927 if v_2.Op != OpARMMOVWconst { 1928 break 1929 } 1930 c := auxIntToInt32(v_2.AuxInt) 1931 if !(0 <= c && c < 32) { 1932 break 1933 } 1934 v.reset(OpARMADDSshiftRL) 1935 v.AuxInt = int32ToAuxInt(c) 1936 v.AddArg2(x, y) 1937 return true 1938 } 1939 return false 1940 } 1941 func rewriteValueARM_OpARMADDconst(v *Value) bool { 1942 v_0 := v.Args[0] 1943 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 1944 // result: (MOVWaddr [off1+off2] {sym} ptr) 1945 for { 1946 off1 := auxIntToInt32(v.AuxInt) 1947 if v_0.Op != OpARMMOVWaddr { 1948 break 1949 } 1950 off2 := auxIntToInt32(v_0.AuxInt) 1951 sym := auxToSym(v_0.Aux) 1952 ptr := v_0.Args[0] 1953 v.reset(OpARMMOVWaddr) 1954 v.AuxInt = int32ToAuxInt(off1 + off2) 1955 v.Aux = symToAux(sym) 1956 v.AddArg(ptr) 1957 return true 1958 } 1959 // match: (ADDconst [0] x) 1960 // result: x 1961 for { 1962 if auxIntToInt32(v.AuxInt) != 0 { 1963 break 1964 } 1965 x := v_0 1966 v.copyOf(x) 1967 return true 1968 } 1969 // match: (ADDconst [c] x) 1970 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 1971 // result: (SUBconst [-c] x) 1972 for { 1973 c := auxIntToInt32(v.AuxInt) 1974 x := v_0 1975 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 1976 break 1977 } 1978 v.reset(OpARMSUBconst) 1979 v.AuxInt = int32ToAuxInt(-c) 1980 v.AddArg(x) 1981 return true 1982 } 1983 // match: (ADDconst [c] x) 1984 // cond: buildcfg.GOARM.Version==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff 1985 // result: (SUBconst [-c] x) 1986 for { 1987 c := auxIntToInt32(v.AuxInt) 1988 x := v_0 1989 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) { 1990 break 1991 } 1992 v.reset(OpARMSUBconst) 1993 v.AuxInt = int32ToAuxInt(-c) 1994 v.AddArg(x) 1995 return true 1996 } 1997 // match: (ADDconst [c] (MOVWconst [d])) 1998 // result: (MOVWconst [c+d]) 1999 for { 2000 c := auxIntToInt32(v.AuxInt) 2001 if v_0.Op != OpARMMOVWconst { 2002 break 2003 } 2004 d := auxIntToInt32(v_0.AuxInt) 2005 v.reset(OpARMMOVWconst) 2006 v.AuxInt = int32ToAuxInt(c + d) 2007 return true 2008 } 2009 // match: (ADDconst [c] (ADDconst [d] x)) 2010 // result: (ADDconst [c+d] x) 2011 for { 2012 c := auxIntToInt32(v.AuxInt) 2013 if v_0.Op != OpARMADDconst { 2014 break 2015 } 2016 d := auxIntToInt32(v_0.AuxInt) 2017 x := v_0.Args[0] 2018 v.reset(OpARMADDconst) 2019 v.AuxInt = int32ToAuxInt(c + d) 2020 v.AddArg(x) 2021 return true 2022 } 2023 // match: (ADDconst [c] (SUBconst [d] x)) 2024 // result: (ADDconst [c-d] x) 2025 for { 2026 c := auxIntToInt32(v.AuxInt) 2027 if v_0.Op != OpARMSUBconst { 2028 break 2029 } 2030 d := auxIntToInt32(v_0.AuxInt) 2031 x := v_0.Args[0] 2032 v.reset(OpARMADDconst) 2033 v.AuxInt = int32ToAuxInt(c - d) 2034 v.AddArg(x) 2035 return true 2036 } 2037 // match: (ADDconst [c] (RSBconst [d] x)) 2038 // result: (RSBconst [c+d] x) 2039 for { 2040 c := auxIntToInt32(v.AuxInt) 2041 if v_0.Op != OpARMRSBconst { 2042 break 2043 } 2044 d := auxIntToInt32(v_0.AuxInt) 2045 x := v_0.Args[0] 2046 v.reset(OpARMRSBconst) 2047 v.AuxInt = int32ToAuxInt(c + d) 2048 v.AddArg(x) 2049 return true 2050 } 2051 return false 2052 } 2053 func rewriteValueARM_OpARMADDshiftLL(v *Value) bool { 2054 v_1 := v.Args[1] 2055 v_0 := v.Args[0] 2056 b := v.Block 2057 typ := &b.Func.Config.Types 2058 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2059 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2060 for { 2061 d := auxIntToInt32(v.AuxInt) 2062 if v_0.Op != OpARMMOVWconst { 2063 break 2064 } 2065 c := auxIntToInt32(v_0.AuxInt) 2066 x := v_1 2067 v.reset(OpARMADDconst) 2068 v.AuxInt = int32ToAuxInt(c) 2069 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2070 v0.AuxInt = int32ToAuxInt(d) 2071 v0.AddArg(x) 2072 v.AddArg(v0) 2073 return true 2074 } 2075 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2076 // result: (ADDconst x [c<<uint64(d)]) 2077 for { 2078 d := auxIntToInt32(v.AuxInt) 2079 x := v_0 2080 if v_1.Op != OpARMMOVWconst { 2081 break 2082 } 2083 c := auxIntToInt32(v_1.AuxInt) 2084 v.reset(OpARMADDconst) 2085 v.AuxInt = int32ToAuxInt(c << uint64(d)) 2086 v.AddArg(x) 2087 return true 2088 } 2089 // match: (ADDshiftLL <typ.UInt16> [8] (BFXU <typ.UInt16> [int32(armBFAuxInt(8, 8))] x) x) 2090 // result: (REV16 x) 2091 for { 2092 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)) { 2093 break 2094 } 2095 x := v_0.Args[0] 2096 if x != v_1 { 2097 break 2098 } 2099 v.reset(OpARMREV16) 2100 v.AddArg(x) 2101 return true 2102 } 2103 // match: (ADDshiftLL <typ.UInt16> [8] (SRLconst <typ.UInt16> [24] (SLLconst [16] x)) x) 2104 // cond: buildcfg.GOARM.Version>=6 2105 // result: (REV16 x) 2106 for { 2107 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 { 2108 break 2109 } 2110 v_0_0 := v_0.Args[0] 2111 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 { 2112 break 2113 } 2114 x := v_0_0.Args[0] 2115 if x != v_1 || !(buildcfg.GOARM.Version >= 6) { 2116 break 2117 } 2118 v.reset(OpARMREV16) 2119 v.AddArg(x) 2120 return true 2121 } 2122 return false 2123 } 2124 func rewriteValueARM_OpARMADDshiftLLreg(v *Value) bool { 2125 v_2 := v.Args[2] 2126 v_1 := v.Args[1] 2127 v_0 := v.Args[0] 2128 b := v.Block 2129 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2130 // result: (ADDconst [c] (SLL <x.Type> x y)) 2131 for { 2132 if v_0.Op != OpARMMOVWconst { 2133 break 2134 } 2135 c := auxIntToInt32(v_0.AuxInt) 2136 x := v_1 2137 y := v_2 2138 v.reset(OpARMADDconst) 2139 v.AuxInt = int32ToAuxInt(c) 2140 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2141 v0.AddArg2(x, y) 2142 v.AddArg(v0) 2143 return true 2144 } 2145 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2146 // cond: 0 <= c && c < 32 2147 // result: (ADDshiftLL x y [c]) 2148 for { 2149 x := v_0 2150 y := v_1 2151 if v_2.Op != OpARMMOVWconst { 2152 break 2153 } 2154 c := auxIntToInt32(v_2.AuxInt) 2155 if !(0 <= c && c < 32) { 2156 break 2157 } 2158 v.reset(OpARMADDshiftLL) 2159 v.AuxInt = int32ToAuxInt(c) 2160 v.AddArg2(x, y) 2161 return true 2162 } 2163 return false 2164 } 2165 func rewriteValueARM_OpARMADDshiftRA(v *Value) bool { 2166 v_1 := v.Args[1] 2167 v_0 := v.Args[0] 2168 b := v.Block 2169 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 2170 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 2171 for { 2172 d := auxIntToInt32(v.AuxInt) 2173 if v_0.Op != OpARMMOVWconst { 2174 break 2175 } 2176 c := auxIntToInt32(v_0.AuxInt) 2177 x := v_1 2178 v.reset(OpARMADDconst) 2179 v.AuxInt = int32ToAuxInt(c) 2180 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2181 v0.AuxInt = int32ToAuxInt(d) 2182 v0.AddArg(x) 2183 v.AddArg(v0) 2184 return true 2185 } 2186 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 2187 // result: (ADDconst x [c>>uint64(d)]) 2188 for { 2189 d := auxIntToInt32(v.AuxInt) 2190 x := v_0 2191 if v_1.Op != OpARMMOVWconst { 2192 break 2193 } 2194 c := auxIntToInt32(v_1.AuxInt) 2195 v.reset(OpARMADDconst) 2196 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 2197 v.AddArg(x) 2198 return true 2199 } 2200 return false 2201 } 2202 func rewriteValueARM_OpARMADDshiftRAreg(v *Value) bool { 2203 v_2 := v.Args[2] 2204 v_1 := v.Args[1] 2205 v_0 := v.Args[0] 2206 b := v.Block 2207 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 2208 // result: (ADDconst [c] (SRA <x.Type> x y)) 2209 for { 2210 if v_0.Op != OpARMMOVWconst { 2211 break 2212 } 2213 c := auxIntToInt32(v_0.AuxInt) 2214 x := v_1 2215 y := v_2 2216 v.reset(OpARMADDconst) 2217 v.AuxInt = int32ToAuxInt(c) 2218 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2219 v0.AddArg2(x, y) 2220 v.AddArg(v0) 2221 return true 2222 } 2223 // match: (ADDshiftRAreg x y (MOVWconst [c])) 2224 // cond: 0 <= c && c < 32 2225 // result: (ADDshiftRA x y [c]) 2226 for { 2227 x := v_0 2228 y := v_1 2229 if v_2.Op != OpARMMOVWconst { 2230 break 2231 } 2232 c := auxIntToInt32(v_2.AuxInt) 2233 if !(0 <= c && c < 32) { 2234 break 2235 } 2236 v.reset(OpARMADDshiftRA) 2237 v.AuxInt = int32ToAuxInt(c) 2238 v.AddArg2(x, y) 2239 return true 2240 } 2241 return false 2242 } 2243 func rewriteValueARM_OpARMADDshiftRL(v *Value) bool { 2244 v_1 := v.Args[1] 2245 v_0 := v.Args[0] 2246 b := v.Block 2247 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 2248 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 2249 for { 2250 d := auxIntToInt32(v.AuxInt) 2251 if v_0.Op != OpARMMOVWconst { 2252 break 2253 } 2254 c := auxIntToInt32(v_0.AuxInt) 2255 x := v_1 2256 v.reset(OpARMADDconst) 2257 v.AuxInt = int32ToAuxInt(c) 2258 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2259 v0.AuxInt = int32ToAuxInt(d) 2260 v0.AddArg(x) 2261 v.AddArg(v0) 2262 return true 2263 } 2264 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 2265 // result: (ADDconst x [int32(uint32(c)>>uint64(d))]) 2266 for { 2267 d := auxIntToInt32(v.AuxInt) 2268 x := v_0 2269 if v_1.Op != OpARMMOVWconst { 2270 break 2271 } 2272 c := auxIntToInt32(v_1.AuxInt) 2273 v.reset(OpARMADDconst) 2274 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 2275 v.AddArg(x) 2276 return true 2277 } 2278 return false 2279 } 2280 func rewriteValueARM_OpARMADDshiftRLreg(v *Value) bool { 2281 v_2 := v.Args[2] 2282 v_1 := v.Args[1] 2283 v_0 := v.Args[0] 2284 b := v.Block 2285 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 2286 // result: (ADDconst [c] (SRL <x.Type> x y)) 2287 for { 2288 if v_0.Op != OpARMMOVWconst { 2289 break 2290 } 2291 c := auxIntToInt32(v_0.AuxInt) 2292 x := v_1 2293 y := v_2 2294 v.reset(OpARMADDconst) 2295 v.AuxInt = int32ToAuxInt(c) 2296 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2297 v0.AddArg2(x, y) 2298 v.AddArg(v0) 2299 return true 2300 } 2301 // match: (ADDshiftRLreg x y (MOVWconst [c])) 2302 // cond: 0 <= c && c < 32 2303 // result: (ADDshiftRL x y [c]) 2304 for { 2305 x := v_0 2306 y := v_1 2307 if v_2.Op != OpARMMOVWconst { 2308 break 2309 } 2310 c := auxIntToInt32(v_2.AuxInt) 2311 if !(0 <= c && c < 32) { 2312 break 2313 } 2314 v.reset(OpARMADDshiftRL) 2315 v.AuxInt = int32ToAuxInt(c) 2316 v.AddArg2(x, y) 2317 return true 2318 } 2319 return false 2320 } 2321 func rewriteValueARM_OpARMAND(v *Value) bool { 2322 v_1 := v.Args[1] 2323 v_0 := v.Args[0] 2324 // match: (AND x (MOVWconst [c])) 2325 // result: (ANDconst [c] x) 2326 for { 2327 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2328 x := v_0 2329 if v_1.Op != OpARMMOVWconst { 2330 continue 2331 } 2332 c := auxIntToInt32(v_1.AuxInt) 2333 v.reset(OpARMANDconst) 2334 v.AuxInt = int32ToAuxInt(c) 2335 v.AddArg(x) 2336 return true 2337 } 2338 break 2339 } 2340 // match: (AND x (SLLconst [c] y)) 2341 // result: (ANDshiftLL x y [c]) 2342 for { 2343 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2344 x := v_0 2345 if v_1.Op != OpARMSLLconst { 2346 continue 2347 } 2348 c := auxIntToInt32(v_1.AuxInt) 2349 y := v_1.Args[0] 2350 v.reset(OpARMANDshiftLL) 2351 v.AuxInt = int32ToAuxInt(c) 2352 v.AddArg2(x, y) 2353 return true 2354 } 2355 break 2356 } 2357 // match: (AND x (SRLconst [c] y)) 2358 // result: (ANDshiftRL x y [c]) 2359 for { 2360 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2361 x := v_0 2362 if v_1.Op != OpARMSRLconst { 2363 continue 2364 } 2365 c := auxIntToInt32(v_1.AuxInt) 2366 y := v_1.Args[0] 2367 v.reset(OpARMANDshiftRL) 2368 v.AuxInt = int32ToAuxInt(c) 2369 v.AddArg2(x, y) 2370 return true 2371 } 2372 break 2373 } 2374 // match: (AND x (SRAconst [c] y)) 2375 // result: (ANDshiftRA x y [c]) 2376 for { 2377 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2378 x := v_0 2379 if v_1.Op != OpARMSRAconst { 2380 continue 2381 } 2382 c := auxIntToInt32(v_1.AuxInt) 2383 y := v_1.Args[0] 2384 v.reset(OpARMANDshiftRA) 2385 v.AuxInt = int32ToAuxInt(c) 2386 v.AddArg2(x, y) 2387 return true 2388 } 2389 break 2390 } 2391 // match: (AND x (SLL y z)) 2392 // result: (ANDshiftLLreg x y z) 2393 for { 2394 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2395 x := v_0 2396 if v_1.Op != OpARMSLL { 2397 continue 2398 } 2399 z := v_1.Args[1] 2400 y := v_1.Args[0] 2401 v.reset(OpARMANDshiftLLreg) 2402 v.AddArg3(x, y, z) 2403 return true 2404 } 2405 break 2406 } 2407 // match: (AND x (SRL y z)) 2408 // result: (ANDshiftRLreg x y z) 2409 for { 2410 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2411 x := v_0 2412 if v_1.Op != OpARMSRL { 2413 continue 2414 } 2415 z := v_1.Args[1] 2416 y := v_1.Args[0] 2417 v.reset(OpARMANDshiftRLreg) 2418 v.AddArg3(x, y, z) 2419 return true 2420 } 2421 break 2422 } 2423 // match: (AND x (SRA y z)) 2424 // result: (ANDshiftRAreg x y z) 2425 for { 2426 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2427 x := v_0 2428 if v_1.Op != OpARMSRA { 2429 continue 2430 } 2431 z := v_1.Args[1] 2432 y := v_1.Args[0] 2433 v.reset(OpARMANDshiftRAreg) 2434 v.AddArg3(x, y, z) 2435 return true 2436 } 2437 break 2438 } 2439 // match: (AND x x) 2440 // result: x 2441 for { 2442 x := v_0 2443 if x != v_1 { 2444 break 2445 } 2446 v.copyOf(x) 2447 return true 2448 } 2449 // match: (AND x (MVN y)) 2450 // result: (BIC x y) 2451 for { 2452 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2453 x := v_0 2454 if v_1.Op != OpARMMVN { 2455 continue 2456 } 2457 y := v_1.Args[0] 2458 v.reset(OpARMBIC) 2459 v.AddArg2(x, y) 2460 return true 2461 } 2462 break 2463 } 2464 // match: (AND x (MVNshiftLL y [c])) 2465 // result: (BICshiftLL x y [c]) 2466 for { 2467 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2468 x := v_0 2469 if v_1.Op != OpARMMVNshiftLL { 2470 continue 2471 } 2472 c := auxIntToInt32(v_1.AuxInt) 2473 y := v_1.Args[0] 2474 v.reset(OpARMBICshiftLL) 2475 v.AuxInt = int32ToAuxInt(c) 2476 v.AddArg2(x, y) 2477 return true 2478 } 2479 break 2480 } 2481 // match: (AND x (MVNshiftRL y [c])) 2482 // result: (BICshiftRL x y [c]) 2483 for { 2484 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2485 x := v_0 2486 if v_1.Op != OpARMMVNshiftRL { 2487 continue 2488 } 2489 c := auxIntToInt32(v_1.AuxInt) 2490 y := v_1.Args[0] 2491 v.reset(OpARMBICshiftRL) 2492 v.AuxInt = int32ToAuxInt(c) 2493 v.AddArg2(x, y) 2494 return true 2495 } 2496 break 2497 } 2498 // match: (AND x (MVNshiftRA y [c])) 2499 // result: (BICshiftRA x y [c]) 2500 for { 2501 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 2502 x := v_0 2503 if v_1.Op != OpARMMVNshiftRA { 2504 continue 2505 } 2506 c := auxIntToInt32(v_1.AuxInt) 2507 y := v_1.Args[0] 2508 v.reset(OpARMBICshiftRA) 2509 v.AuxInt = int32ToAuxInt(c) 2510 v.AddArg2(x, y) 2511 return true 2512 } 2513 break 2514 } 2515 return false 2516 } 2517 func rewriteValueARM_OpARMANDconst(v *Value) bool { 2518 v_0 := v.Args[0] 2519 // match: (ANDconst [0] _) 2520 // result: (MOVWconst [0]) 2521 for { 2522 if auxIntToInt32(v.AuxInt) != 0 { 2523 break 2524 } 2525 v.reset(OpARMMOVWconst) 2526 v.AuxInt = int32ToAuxInt(0) 2527 return true 2528 } 2529 // match: (ANDconst [c] x) 2530 // cond: int32(c)==-1 2531 // result: x 2532 for { 2533 c := auxIntToInt32(v.AuxInt) 2534 x := v_0 2535 if !(int32(c) == -1) { 2536 break 2537 } 2538 v.copyOf(x) 2539 return true 2540 } 2541 // match: (ANDconst [c] x) 2542 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 2543 // result: (BICconst [int32(^uint32(c))] x) 2544 for { 2545 c := auxIntToInt32(v.AuxInt) 2546 x := v_0 2547 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 2548 break 2549 } 2550 v.reset(OpARMBICconst) 2551 v.AuxInt = int32ToAuxInt(int32(^uint32(c))) 2552 v.AddArg(x) 2553 return true 2554 } 2555 // match: (ANDconst [c] x) 2556 // cond: buildcfg.GOARM.Version==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff 2557 // result: (BICconst [int32(^uint32(c))] x) 2558 for { 2559 c := auxIntToInt32(v.AuxInt) 2560 x := v_0 2561 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) { 2562 break 2563 } 2564 v.reset(OpARMBICconst) 2565 v.AuxInt = int32ToAuxInt(int32(^uint32(c))) 2566 v.AddArg(x) 2567 return true 2568 } 2569 // match: (ANDconst [c] (MOVWconst [d])) 2570 // result: (MOVWconst [c&d]) 2571 for { 2572 c := auxIntToInt32(v.AuxInt) 2573 if v_0.Op != OpARMMOVWconst { 2574 break 2575 } 2576 d := auxIntToInt32(v_0.AuxInt) 2577 v.reset(OpARMMOVWconst) 2578 v.AuxInt = int32ToAuxInt(c & d) 2579 return true 2580 } 2581 // match: (ANDconst [c] (ANDconst [d] x)) 2582 // result: (ANDconst [c&d] x) 2583 for { 2584 c := auxIntToInt32(v.AuxInt) 2585 if v_0.Op != OpARMANDconst { 2586 break 2587 } 2588 d := auxIntToInt32(v_0.AuxInt) 2589 x := v_0.Args[0] 2590 v.reset(OpARMANDconst) 2591 v.AuxInt = int32ToAuxInt(c & d) 2592 v.AddArg(x) 2593 return true 2594 } 2595 return false 2596 } 2597 func rewriteValueARM_OpARMANDshiftLL(v *Value) bool { 2598 v_1 := v.Args[1] 2599 v_0 := v.Args[0] 2600 b := v.Block 2601 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 2602 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 2603 for { 2604 d := auxIntToInt32(v.AuxInt) 2605 if v_0.Op != OpARMMOVWconst { 2606 break 2607 } 2608 c := auxIntToInt32(v_0.AuxInt) 2609 x := v_1 2610 v.reset(OpARMANDconst) 2611 v.AuxInt = int32ToAuxInt(c) 2612 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2613 v0.AuxInt = int32ToAuxInt(d) 2614 v0.AddArg(x) 2615 v.AddArg(v0) 2616 return true 2617 } 2618 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 2619 // result: (ANDconst x [c<<uint64(d)]) 2620 for { 2621 d := auxIntToInt32(v.AuxInt) 2622 x := v_0 2623 if v_1.Op != OpARMMOVWconst { 2624 break 2625 } 2626 c := auxIntToInt32(v_1.AuxInt) 2627 v.reset(OpARMANDconst) 2628 v.AuxInt = int32ToAuxInt(c << uint64(d)) 2629 v.AddArg(x) 2630 return true 2631 } 2632 // match: (ANDshiftLL y:(SLLconst x [c]) x [c]) 2633 // result: y 2634 for { 2635 c := auxIntToInt32(v.AuxInt) 2636 y := v_0 2637 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c { 2638 break 2639 } 2640 x := y.Args[0] 2641 if x != v_1 { 2642 break 2643 } 2644 v.copyOf(y) 2645 return true 2646 } 2647 return false 2648 } 2649 func rewriteValueARM_OpARMANDshiftLLreg(v *Value) bool { 2650 v_2 := v.Args[2] 2651 v_1 := v.Args[1] 2652 v_0 := v.Args[0] 2653 b := v.Block 2654 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 2655 // result: (ANDconst [c] (SLL <x.Type> x y)) 2656 for { 2657 if v_0.Op != OpARMMOVWconst { 2658 break 2659 } 2660 c := auxIntToInt32(v_0.AuxInt) 2661 x := v_1 2662 y := v_2 2663 v.reset(OpARMANDconst) 2664 v.AuxInt = int32ToAuxInt(c) 2665 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2666 v0.AddArg2(x, y) 2667 v.AddArg(v0) 2668 return true 2669 } 2670 // match: (ANDshiftLLreg x y (MOVWconst [c])) 2671 // cond: 0 <= c && c < 32 2672 // result: (ANDshiftLL x y [c]) 2673 for { 2674 x := v_0 2675 y := v_1 2676 if v_2.Op != OpARMMOVWconst { 2677 break 2678 } 2679 c := auxIntToInt32(v_2.AuxInt) 2680 if !(0 <= c && c < 32) { 2681 break 2682 } 2683 v.reset(OpARMANDshiftLL) 2684 v.AuxInt = int32ToAuxInt(c) 2685 v.AddArg2(x, y) 2686 return true 2687 } 2688 return false 2689 } 2690 func rewriteValueARM_OpARMANDshiftRA(v *Value) bool { 2691 v_1 := v.Args[1] 2692 v_0 := v.Args[0] 2693 b := v.Block 2694 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 2695 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 2696 for { 2697 d := auxIntToInt32(v.AuxInt) 2698 if v_0.Op != OpARMMOVWconst { 2699 break 2700 } 2701 c := auxIntToInt32(v_0.AuxInt) 2702 x := v_1 2703 v.reset(OpARMANDconst) 2704 v.AuxInt = int32ToAuxInt(c) 2705 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2706 v0.AuxInt = int32ToAuxInt(d) 2707 v0.AddArg(x) 2708 v.AddArg(v0) 2709 return true 2710 } 2711 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 2712 // result: (ANDconst x [c>>uint64(d)]) 2713 for { 2714 d := auxIntToInt32(v.AuxInt) 2715 x := v_0 2716 if v_1.Op != OpARMMOVWconst { 2717 break 2718 } 2719 c := auxIntToInt32(v_1.AuxInt) 2720 v.reset(OpARMANDconst) 2721 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 2722 v.AddArg(x) 2723 return true 2724 } 2725 // match: (ANDshiftRA y:(SRAconst x [c]) x [c]) 2726 // result: y 2727 for { 2728 c := auxIntToInt32(v.AuxInt) 2729 y := v_0 2730 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c { 2731 break 2732 } 2733 x := y.Args[0] 2734 if x != v_1 { 2735 break 2736 } 2737 v.copyOf(y) 2738 return true 2739 } 2740 return false 2741 } 2742 func rewriteValueARM_OpARMANDshiftRAreg(v *Value) bool { 2743 v_2 := v.Args[2] 2744 v_1 := v.Args[1] 2745 v_0 := v.Args[0] 2746 b := v.Block 2747 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 2748 // result: (ANDconst [c] (SRA <x.Type> x y)) 2749 for { 2750 if v_0.Op != OpARMMOVWconst { 2751 break 2752 } 2753 c := auxIntToInt32(v_0.AuxInt) 2754 x := v_1 2755 y := v_2 2756 v.reset(OpARMANDconst) 2757 v.AuxInt = int32ToAuxInt(c) 2758 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2759 v0.AddArg2(x, y) 2760 v.AddArg(v0) 2761 return true 2762 } 2763 // match: (ANDshiftRAreg x y (MOVWconst [c])) 2764 // cond: 0 <= c && c < 32 2765 // result: (ANDshiftRA x y [c]) 2766 for { 2767 x := v_0 2768 y := v_1 2769 if v_2.Op != OpARMMOVWconst { 2770 break 2771 } 2772 c := auxIntToInt32(v_2.AuxInt) 2773 if !(0 <= c && c < 32) { 2774 break 2775 } 2776 v.reset(OpARMANDshiftRA) 2777 v.AuxInt = int32ToAuxInt(c) 2778 v.AddArg2(x, y) 2779 return true 2780 } 2781 return false 2782 } 2783 func rewriteValueARM_OpARMANDshiftRL(v *Value) bool { 2784 v_1 := v.Args[1] 2785 v_0 := v.Args[0] 2786 b := v.Block 2787 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 2788 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 2789 for { 2790 d := auxIntToInt32(v.AuxInt) 2791 if v_0.Op != OpARMMOVWconst { 2792 break 2793 } 2794 c := auxIntToInt32(v_0.AuxInt) 2795 x := v_1 2796 v.reset(OpARMANDconst) 2797 v.AuxInt = int32ToAuxInt(c) 2798 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2799 v0.AuxInt = int32ToAuxInt(d) 2800 v0.AddArg(x) 2801 v.AddArg(v0) 2802 return true 2803 } 2804 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 2805 // result: (ANDconst x [int32(uint32(c)>>uint64(d))]) 2806 for { 2807 d := auxIntToInt32(v.AuxInt) 2808 x := v_0 2809 if v_1.Op != OpARMMOVWconst { 2810 break 2811 } 2812 c := auxIntToInt32(v_1.AuxInt) 2813 v.reset(OpARMANDconst) 2814 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 2815 v.AddArg(x) 2816 return true 2817 } 2818 // match: (ANDshiftRL y:(SRLconst x [c]) x [c]) 2819 // result: y 2820 for { 2821 c := auxIntToInt32(v.AuxInt) 2822 y := v_0 2823 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c { 2824 break 2825 } 2826 x := y.Args[0] 2827 if x != v_1 { 2828 break 2829 } 2830 v.copyOf(y) 2831 return true 2832 } 2833 return false 2834 } 2835 func rewriteValueARM_OpARMANDshiftRLreg(v *Value) bool { 2836 v_2 := v.Args[2] 2837 v_1 := v.Args[1] 2838 v_0 := v.Args[0] 2839 b := v.Block 2840 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 2841 // result: (ANDconst [c] (SRL <x.Type> x y)) 2842 for { 2843 if v_0.Op != OpARMMOVWconst { 2844 break 2845 } 2846 c := auxIntToInt32(v_0.AuxInt) 2847 x := v_1 2848 y := v_2 2849 v.reset(OpARMANDconst) 2850 v.AuxInt = int32ToAuxInt(c) 2851 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2852 v0.AddArg2(x, y) 2853 v.AddArg(v0) 2854 return true 2855 } 2856 // match: (ANDshiftRLreg x y (MOVWconst [c])) 2857 // cond: 0 <= c && c < 32 2858 // result: (ANDshiftRL x y [c]) 2859 for { 2860 x := v_0 2861 y := v_1 2862 if v_2.Op != OpARMMOVWconst { 2863 break 2864 } 2865 c := auxIntToInt32(v_2.AuxInt) 2866 if !(0 <= c && c < 32) { 2867 break 2868 } 2869 v.reset(OpARMANDshiftRL) 2870 v.AuxInt = int32ToAuxInt(c) 2871 v.AddArg2(x, y) 2872 return true 2873 } 2874 return false 2875 } 2876 func rewriteValueARM_OpARMBFX(v *Value) bool { 2877 v_0 := v.Args[0] 2878 // match: (BFX [c] (MOVWconst [d])) 2879 // result: (MOVWconst [d<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8))]) 2880 for { 2881 c := auxIntToInt32(v.AuxInt) 2882 if v_0.Op != OpARMMOVWconst { 2883 break 2884 } 2885 d := auxIntToInt32(v_0.AuxInt) 2886 v.reset(OpARMMOVWconst) 2887 v.AuxInt = int32ToAuxInt(d << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))) 2888 return true 2889 } 2890 return false 2891 } 2892 func rewriteValueARM_OpARMBFXU(v *Value) bool { 2893 v_0 := v.Args[0] 2894 // match: (BFXU [c] (MOVWconst [d])) 2895 // result: (MOVWconst [int32(uint32(d)<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8)))]) 2896 for { 2897 c := auxIntToInt32(v.AuxInt) 2898 if v_0.Op != OpARMMOVWconst { 2899 break 2900 } 2901 d := auxIntToInt32(v_0.AuxInt) 2902 v.reset(OpARMMOVWconst) 2903 v.AuxInt = int32ToAuxInt(int32(uint32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8)))) 2904 return true 2905 } 2906 return false 2907 } 2908 func rewriteValueARM_OpARMBIC(v *Value) bool { 2909 v_1 := v.Args[1] 2910 v_0 := v.Args[0] 2911 // match: (BIC x (MOVWconst [c])) 2912 // result: (BICconst [c] x) 2913 for { 2914 x := v_0 2915 if v_1.Op != OpARMMOVWconst { 2916 break 2917 } 2918 c := auxIntToInt32(v_1.AuxInt) 2919 v.reset(OpARMBICconst) 2920 v.AuxInt = int32ToAuxInt(c) 2921 v.AddArg(x) 2922 return true 2923 } 2924 // match: (BIC x (SLLconst [c] y)) 2925 // result: (BICshiftLL x y [c]) 2926 for { 2927 x := v_0 2928 if v_1.Op != OpARMSLLconst { 2929 break 2930 } 2931 c := auxIntToInt32(v_1.AuxInt) 2932 y := v_1.Args[0] 2933 v.reset(OpARMBICshiftLL) 2934 v.AuxInt = int32ToAuxInt(c) 2935 v.AddArg2(x, y) 2936 return true 2937 } 2938 // match: (BIC x (SRLconst [c] y)) 2939 // result: (BICshiftRL x y [c]) 2940 for { 2941 x := v_0 2942 if v_1.Op != OpARMSRLconst { 2943 break 2944 } 2945 c := auxIntToInt32(v_1.AuxInt) 2946 y := v_1.Args[0] 2947 v.reset(OpARMBICshiftRL) 2948 v.AuxInt = int32ToAuxInt(c) 2949 v.AddArg2(x, y) 2950 return true 2951 } 2952 // match: (BIC x (SRAconst [c] y)) 2953 // result: (BICshiftRA x y [c]) 2954 for { 2955 x := v_0 2956 if v_1.Op != OpARMSRAconst { 2957 break 2958 } 2959 c := auxIntToInt32(v_1.AuxInt) 2960 y := v_1.Args[0] 2961 v.reset(OpARMBICshiftRA) 2962 v.AuxInt = int32ToAuxInt(c) 2963 v.AddArg2(x, y) 2964 return true 2965 } 2966 // match: (BIC x (SLL y z)) 2967 // result: (BICshiftLLreg x y z) 2968 for { 2969 x := v_0 2970 if v_1.Op != OpARMSLL { 2971 break 2972 } 2973 z := v_1.Args[1] 2974 y := v_1.Args[0] 2975 v.reset(OpARMBICshiftLLreg) 2976 v.AddArg3(x, y, z) 2977 return true 2978 } 2979 // match: (BIC x (SRL y z)) 2980 // result: (BICshiftRLreg x y z) 2981 for { 2982 x := v_0 2983 if v_1.Op != OpARMSRL { 2984 break 2985 } 2986 z := v_1.Args[1] 2987 y := v_1.Args[0] 2988 v.reset(OpARMBICshiftRLreg) 2989 v.AddArg3(x, y, z) 2990 return true 2991 } 2992 // match: (BIC x (SRA y z)) 2993 // result: (BICshiftRAreg x y z) 2994 for { 2995 x := v_0 2996 if v_1.Op != OpARMSRA { 2997 break 2998 } 2999 z := v_1.Args[1] 3000 y := v_1.Args[0] 3001 v.reset(OpARMBICshiftRAreg) 3002 v.AddArg3(x, y, z) 3003 return true 3004 } 3005 // match: (BIC x x) 3006 // result: (MOVWconst [0]) 3007 for { 3008 x := v_0 3009 if x != v_1 { 3010 break 3011 } 3012 v.reset(OpARMMOVWconst) 3013 v.AuxInt = int32ToAuxInt(0) 3014 return true 3015 } 3016 return false 3017 } 3018 func rewriteValueARM_OpARMBICconst(v *Value) bool { 3019 v_0 := v.Args[0] 3020 // match: (BICconst [0] x) 3021 // result: x 3022 for { 3023 if auxIntToInt32(v.AuxInt) != 0 { 3024 break 3025 } 3026 x := v_0 3027 v.copyOf(x) 3028 return true 3029 } 3030 // match: (BICconst [c] _) 3031 // cond: int32(c)==-1 3032 // result: (MOVWconst [0]) 3033 for { 3034 c := auxIntToInt32(v.AuxInt) 3035 if !(int32(c) == -1) { 3036 break 3037 } 3038 v.reset(OpARMMOVWconst) 3039 v.AuxInt = int32ToAuxInt(0) 3040 return true 3041 } 3042 // match: (BICconst [c] x) 3043 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3044 // result: (ANDconst [int32(^uint32(c))] x) 3045 for { 3046 c := auxIntToInt32(v.AuxInt) 3047 x := v_0 3048 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3049 break 3050 } 3051 v.reset(OpARMANDconst) 3052 v.AuxInt = int32ToAuxInt(int32(^uint32(c))) 3053 v.AddArg(x) 3054 return true 3055 } 3056 // match: (BICconst [c] x) 3057 // cond: buildcfg.GOARM.Version==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff 3058 // result: (ANDconst [int32(^uint32(c))] x) 3059 for { 3060 c := auxIntToInt32(v.AuxInt) 3061 x := v_0 3062 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) { 3063 break 3064 } 3065 v.reset(OpARMANDconst) 3066 v.AuxInt = int32ToAuxInt(int32(^uint32(c))) 3067 v.AddArg(x) 3068 return true 3069 } 3070 // match: (BICconst [c] (MOVWconst [d])) 3071 // result: (MOVWconst [d&^c]) 3072 for { 3073 c := auxIntToInt32(v.AuxInt) 3074 if v_0.Op != OpARMMOVWconst { 3075 break 3076 } 3077 d := auxIntToInt32(v_0.AuxInt) 3078 v.reset(OpARMMOVWconst) 3079 v.AuxInt = int32ToAuxInt(d &^ c) 3080 return true 3081 } 3082 // match: (BICconst [c] (BICconst [d] x)) 3083 // result: (BICconst [c|d] x) 3084 for { 3085 c := auxIntToInt32(v.AuxInt) 3086 if v_0.Op != OpARMBICconst { 3087 break 3088 } 3089 d := auxIntToInt32(v_0.AuxInt) 3090 x := v_0.Args[0] 3091 v.reset(OpARMBICconst) 3092 v.AuxInt = int32ToAuxInt(c | d) 3093 v.AddArg(x) 3094 return true 3095 } 3096 return false 3097 } 3098 func rewriteValueARM_OpARMBICshiftLL(v *Value) bool { 3099 v_1 := v.Args[1] 3100 v_0 := v.Args[0] 3101 // match: (BICshiftLL x (MOVWconst [c]) [d]) 3102 // result: (BICconst x [c<<uint64(d)]) 3103 for { 3104 d := auxIntToInt32(v.AuxInt) 3105 x := v_0 3106 if v_1.Op != OpARMMOVWconst { 3107 break 3108 } 3109 c := auxIntToInt32(v_1.AuxInt) 3110 v.reset(OpARMBICconst) 3111 v.AuxInt = int32ToAuxInt(c << uint64(d)) 3112 v.AddArg(x) 3113 return true 3114 } 3115 // match: (BICshiftLL (SLLconst x [c]) x [c]) 3116 // result: (MOVWconst [0]) 3117 for { 3118 c := auxIntToInt32(v.AuxInt) 3119 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c { 3120 break 3121 } 3122 x := v_0.Args[0] 3123 if x != v_1 { 3124 break 3125 } 3126 v.reset(OpARMMOVWconst) 3127 v.AuxInt = int32ToAuxInt(0) 3128 return true 3129 } 3130 return false 3131 } 3132 func rewriteValueARM_OpARMBICshiftLLreg(v *Value) bool { 3133 v_2 := v.Args[2] 3134 v_1 := v.Args[1] 3135 v_0 := v.Args[0] 3136 // match: (BICshiftLLreg x y (MOVWconst [c])) 3137 // cond: 0 <= c && c < 32 3138 // result: (BICshiftLL x y [c]) 3139 for { 3140 x := v_0 3141 y := v_1 3142 if v_2.Op != OpARMMOVWconst { 3143 break 3144 } 3145 c := auxIntToInt32(v_2.AuxInt) 3146 if !(0 <= c && c < 32) { 3147 break 3148 } 3149 v.reset(OpARMBICshiftLL) 3150 v.AuxInt = int32ToAuxInt(c) 3151 v.AddArg2(x, y) 3152 return true 3153 } 3154 return false 3155 } 3156 func rewriteValueARM_OpARMBICshiftRA(v *Value) bool { 3157 v_1 := v.Args[1] 3158 v_0 := v.Args[0] 3159 // match: (BICshiftRA x (MOVWconst [c]) [d]) 3160 // result: (BICconst x [c>>uint64(d)]) 3161 for { 3162 d := auxIntToInt32(v.AuxInt) 3163 x := v_0 3164 if v_1.Op != OpARMMOVWconst { 3165 break 3166 } 3167 c := auxIntToInt32(v_1.AuxInt) 3168 v.reset(OpARMBICconst) 3169 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 3170 v.AddArg(x) 3171 return true 3172 } 3173 // match: (BICshiftRA (SRAconst x [c]) x [c]) 3174 // result: (MOVWconst [0]) 3175 for { 3176 c := auxIntToInt32(v.AuxInt) 3177 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c { 3178 break 3179 } 3180 x := v_0.Args[0] 3181 if x != v_1 { 3182 break 3183 } 3184 v.reset(OpARMMOVWconst) 3185 v.AuxInt = int32ToAuxInt(0) 3186 return true 3187 } 3188 return false 3189 } 3190 func rewriteValueARM_OpARMBICshiftRAreg(v *Value) bool { 3191 v_2 := v.Args[2] 3192 v_1 := v.Args[1] 3193 v_0 := v.Args[0] 3194 // match: (BICshiftRAreg x y (MOVWconst [c])) 3195 // cond: 0 <= c && c < 32 3196 // result: (BICshiftRA x y [c]) 3197 for { 3198 x := v_0 3199 y := v_1 3200 if v_2.Op != OpARMMOVWconst { 3201 break 3202 } 3203 c := auxIntToInt32(v_2.AuxInt) 3204 if !(0 <= c && c < 32) { 3205 break 3206 } 3207 v.reset(OpARMBICshiftRA) 3208 v.AuxInt = int32ToAuxInt(c) 3209 v.AddArg2(x, y) 3210 return true 3211 } 3212 return false 3213 } 3214 func rewriteValueARM_OpARMBICshiftRL(v *Value) bool { 3215 v_1 := v.Args[1] 3216 v_0 := v.Args[0] 3217 // match: (BICshiftRL x (MOVWconst [c]) [d]) 3218 // result: (BICconst x [int32(uint32(c)>>uint64(d))]) 3219 for { 3220 d := auxIntToInt32(v.AuxInt) 3221 x := v_0 3222 if v_1.Op != OpARMMOVWconst { 3223 break 3224 } 3225 c := auxIntToInt32(v_1.AuxInt) 3226 v.reset(OpARMBICconst) 3227 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 3228 v.AddArg(x) 3229 return true 3230 } 3231 // match: (BICshiftRL (SRLconst x [c]) x [c]) 3232 // result: (MOVWconst [0]) 3233 for { 3234 c := auxIntToInt32(v.AuxInt) 3235 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c { 3236 break 3237 } 3238 x := v_0.Args[0] 3239 if x != v_1 { 3240 break 3241 } 3242 v.reset(OpARMMOVWconst) 3243 v.AuxInt = int32ToAuxInt(0) 3244 return true 3245 } 3246 return false 3247 } 3248 func rewriteValueARM_OpARMBICshiftRLreg(v *Value) bool { 3249 v_2 := v.Args[2] 3250 v_1 := v.Args[1] 3251 v_0 := v.Args[0] 3252 // match: (BICshiftRLreg x y (MOVWconst [c])) 3253 // cond: 0 <= c && c < 32 3254 // result: (BICshiftRL x y [c]) 3255 for { 3256 x := v_0 3257 y := v_1 3258 if v_2.Op != OpARMMOVWconst { 3259 break 3260 } 3261 c := auxIntToInt32(v_2.AuxInt) 3262 if !(0 <= c && c < 32) { 3263 break 3264 } 3265 v.reset(OpARMBICshiftRL) 3266 v.AuxInt = int32ToAuxInt(c) 3267 v.AddArg2(x, y) 3268 return true 3269 } 3270 return false 3271 } 3272 func rewriteValueARM_OpARMCMN(v *Value) bool { 3273 v_1 := v.Args[1] 3274 v_0 := v.Args[0] 3275 // match: (CMN x (MOVWconst [c])) 3276 // result: (CMNconst [c] x) 3277 for { 3278 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3279 x := v_0 3280 if v_1.Op != OpARMMOVWconst { 3281 continue 3282 } 3283 c := auxIntToInt32(v_1.AuxInt) 3284 v.reset(OpARMCMNconst) 3285 v.AuxInt = int32ToAuxInt(c) 3286 v.AddArg(x) 3287 return true 3288 } 3289 break 3290 } 3291 // match: (CMN x (SLLconst [c] y)) 3292 // result: (CMNshiftLL x y [c]) 3293 for { 3294 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3295 x := v_0 3296 if v_1.Op != OpARMSLLconst { 3297 continue 3298 } 3299 c := auxIntToInt32(v_1.AuxInt) 3300 y := v_1.Args[0] 3301 v.reset(OpARMCMNshiftLL) 3302 v.AuxInt = int32ToAuxInt(c) 3303 v.AddArg2(x, y) 3304 return true 3305 } 3306 break 3307 } 3308 // match: (CMN x (SRLconst [c] y)) 3309 // result: (CMNshiftRL x y [c]) 3310 for { 3311 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3312 x := v_0 3313 if v_1.Op != OpARMSRLconst { 3314 continue 3315 } 3316 c := auxIntToInt32(v_1.AuxInt) 3317 y := v_1.Args[0] 3318 v.reset(OpARMCMNshiftRL) 3319 v.AuxInt = int32ToAuxInt(c) 3320 v.AddArg2(x, y) 3321 return true 3322 } 3323 break 3324 } 3325 // match: (CMN x (SRAconst [c] y)) 3326 // result: (CMNshiftRA x y [c]) 3327 for { 3328 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3329 x := v_0 3330 if v_1.Op != OpARMSRAconst { 3331 continue 3332 } 3333 c := auxIntToInt32(v_1.AuxInt) 3334 y := v_1.Args[0] 3335 v.reset(OpARMCMNshiftRA) 3336 v.AuxInt = int32ToAuxInt(c) 3337 v.AddArg2(x, y) 3338 return true 3339 } 3340 break 3341 } 3342 // match: (CMN x (SLL y z)) 3343 // result: (CMNshiftLLreg x y z) 3344 for { 3345 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3346 x := v_0 3347 if v_1.Op != OpARMSLL { 3348 continue 3349 } 3350 z := v_1.Args[1] 3351 y := v_1.Args[0] 3352 v.reset(OpARMCMNshiftLLreg) 3353 v.AddArg3(x, y, z) 3354 return true 3355 } 3356 break 3357 } 3358 // match: (CMN x (SRL y z)) 3359 // result: (CMNshiftRLreg x y z) 3360 for { 3361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3362 x := v_0 3363 if v_1.Op != OpARMSRL { 3364 continue 3365 } 3366 z := v_1.Args[1] 3367 y := v_1.Args[0] 3368 v.reset(OpARMCMNshiftRLreg) 3369 v.AddArg3(x, y, z) 3370 return true 3371 } 3372 break 3373 } 3374 // match: (CMN x (SRA y z)) 3375 // result: (CMNshiftRAreg x y z) 3376 for { 3377 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 3378 x := v_0 3379 if v_1.Op != OpARMSRA { 3380 continue 3381 } 3382 z := v_1.Args[1] 3383 y := v_1.Args[0] 3384 v.reset(OpARMCMNshiftRAreg) 3385 v.AddArg3(x, y, z) 3386 return true 3387 } 3388 break 3389 } 3390 return false 3391 } 3392 func rewriteValueARM_OpARMCMNconst(v *Value) bool { 3393 v_0 := v.Args[0] 3394 // match: (CMNconst (MOVWconst [x]) [y]) 3395 // result: (FlagConstant [addFlags32(x,y)]) 3396 for { 3397 y := auxIntToInt32(v.AuxInt) 3398 if v_0.Op != OpARMMOVWconst { 3399 break 3400 } 3401 x := auxIntToInt32(v_0.AuxInt) 3402 v.reset(OpARMFlagConstant) 3403 v.AuxInt = flagConstantToAuxInt(addFlags32(x, y)) 3404 return true 3405 } 3406 return false 3407 } 3408 func rewriteValueARM_OpARMCMNshiftLL(v *Value) bool { 3409 v_1 := v.Args[1] 3410 v_0 := v.Args[0] 3411 b := v.Block 3412 // match: (CMNshiftLL (MOVWconst [c]) x [d]) 3413 // result: (CMNconst [c] (SLLconst <x.Type> x [d])) 3414 for { 3415 d := auxIntToInt32(v.AuxInt) 3416 if v_0.Op != OpARMMOVWconst { 3417 break 3418 } 3419 c := auxIntToInt32(v_0.AuxInt) 3420 x := v_1 3421 v.reset(OpARMCMNconst) 3422 v.AuxInt = int32ToAuxInt(c) 3423 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3424 v0.AuxInt = int32ToAuxInt(d) 3425 v0.AddArg(x) 3426 v.AddArg(v0) 3427 return true 3428 } 3429 // match: (CMNshiftLL x (MOVWconst [c]) [d]) 3430 // result: (CMNconst x [c<<uint64(d)]) 3431 for { 3432 d := auxIntToInt32(v.AuxInt) 3433 x := v_0 3434 if v_1.Op != OpARMMOVWconst { 3435 break 3436 } 3437 c := auxIntToInt32(v_1.AuxInt) 3438 v.reset(OpARMCMNconst) 3439 v.AuxInt = int32ToAuxInt(c << uint64(d)) 3440 v.AddArg(x) 3441 return true 3442 } 3443 return false 3444 } 3445 func rewriteValueARM_OpARMCMNshiftLLreg(v *Value) bool { 3446 v_2 := v.Args[2] 3447 v_1 := v.Args[1] 3448 v_0 := v.Args[0] 3449 b := v.Block 3450 // match: (CMNshiftLLreg (MOVWconst [c]) x y) 3451 // result: (CMNconst [c] (SLL <x.Type> x y)) 3452 for { 3453 if v_0.Op != OpARMMOVWconst { 3454 break 3455 } 3456 c := auxIntToInt32(v_0.AuxInt) 3457 x := v_1 3458 y := v_2 3459 v.reset(OpARMCMNconst) 3460 v.AuxInt = int32ToAuxInt(c) 3461 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3462 v0.AddArg2(x, y) 3463 v.AddArg(v0) 3464 return true 3465 } 3466 // match: (CMNshiftLLreg x y (MOVWconst [c])) 3467 // cond: 0 <= c && c < 32 3468 // result: (CMNshiftLL x y [c]) 3469 for { 3470 x := v_0 3471 y := v_1 3472 if v_2.Op != OpARMMOVWconst { 3473 break 3474 } 3475 c := auxIntToInt32(v_2.AuxInt) 3476 if !(0 <= c && c < 32) { 3477 break 3478 } 3479 v.reset(OpARMCMNshiftLL) 3480 v.AuxInt = int32ToAuxInt(c) 3481 v.AddArg2(x, y) 3482 return true 3483 } 3484 return false 3485 } 3486 func rewriteValueARM_OpARMCMNshiftRA(v *Value) bool { 3487 v_1 := v.Args[1] 3488 v_0 := v.Args[0] 3489 b := v.Block 3490 // match: (CMNshiftRA (MOVWconst [c]) x [d]) 3491 // result: (CMNconst [c] (SRAconst <x.Type> x [d])) 3492 for { 3493 d := auxIntToInt32(v.AuxInt) 3494 if v_0.Op != OpARMMOVWconst { 3495 break 3496 } 3497 c := auxIntToInt32(v_0.AuxInt) 3498 x := v_1 3499 v.reset(OpARMCMNconst) 3500 v.AuxInt = int32ToAuxInt(c) 3501 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3502 v0.AuxInt = int32ToAuxInt(d) 3503 v0.AddArg(x) 3504 v.AddArg(v0) 3505 return true 3506 } 3507 // match: (CMNshiftRA x (MOVWconst [c]) [d]) 3508 // result: (CMNconst x [c>>uint64(d)]) 3509 for { 3510 d := auxIntToInt32(v.AuxInt) 3511 x := v_0 3512 if v_1.Op != OpARMMOVWconst { 3513 break 3514 } 3515 c := auxIntToInt32(v_1.AuxInt) 3516 v.reset(OpARMCMNconst) 3517 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 3518 v.AddArg(x) 3519 return true 3520 } 3521 return false 3522 } 3523 func rewriteValueARM_OpARMCMNshiftRAreg(v *Value) bool { 3524 v_2 := v.Args[2] 3525 v_1 := v.Args[1] 3526 v_0 := v.Args[0] 3527 b := v.Block 3528 // match: (CMNshiftRAreg (MOVWconst [c]) x y) 3529 // result: (CMNconst [c] (SRA <x.Type> x y)) 3530 for { 3531 if v_0.Op != OpARMMOVWconst { 3532 break 3533 } 3534 c := auxIntToInt32(v_0.AuxInt) 3535 x := v_1 3536 y := v_2 3537 v.reset(OpARMCMNconst) 3538 v.AuxInt = int32ToAuxInt(c) 3539 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3540 v0.AddArg2(x, y) 3541 v.AddArg(v0) 3542 return true 3543 } 3544 // match: (CMNshiftRAreg x y (MOVWconst [c])) 3545 // cond: 0 <= c && c < 32 3546 // result: (CMNshiftRA x y [c]) 3547 for { 3548 x := v_0 3549 y := v_1 3550 if v_2.Op != OpARMMOVWconst { 3551 break 3552 } 3553 c := auxIntToInt32(v_2.AuxInt) 3554 if !(0 <= c && c < 32) { 3555 break 3556 } 3557 v.reset(OpARMCMNshiftRA) 3558 v.AuxInt = int32ToAuxInt(c) 3559 v.AddArg2(x, y) 3560 return true 3561 } 3562 return false 3563 } 3564 func rewriteValueARM_OpARMCMNshiftRL(v *Value) bool { 3565 v_1 := v.Args[1] 3566 v_0 := v.Args[0] 3567 b := v.Block 3568 // match: (CMNshiftRL (MOVWconst [c]) x [d]) 3569 // result: (CMNconst [c] (SRLconst <x.Type> x [d])) 3570 for { 3571 d := auxIntToInt32(v.AuxInt) 3572 if v_0.Op != OpARMMOVWconst { 3573 break 3574 } 3575 c := auxIntToInt32(v_0.AuxInt) 3576 x := v_1 3577 v.reset(OpARMCMNconst) 3578 v.AuxInt = int32ToAuxInt(c) 3579 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3580 v0.AuxInt = int32ToAuxInt(d) 3581 v0.AddArg(x) 3582 v.AddArg(v0) 3583 return true 3584 } 3585 // match: (CMNshiftRL x (MOVWconst [c]) [d]) 3586 // result: (CMNconst x [int32(uint32(c)>>uint64(d))]) 3587 for { 3588 d := auxIntToInt32(v.AuxInt) 3589 x := v_0 3590 if v_1.Op != OpARMMOVWconst { 3591 break 3592 } 3593 c := auxIntToInt32(v_1.AuxInt) 3594 v.reset(OpARMCMNconst) 3595 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 3596 v.AddArg(x) 3597 return true 3598 } 3599 return false 3600 } 3601 func rewriteValueARM_OpARMCMNshiftRLreg(v *Value) bool { 3602 v_2 := v.Args[2] 3603 v_1 := v.Args[1] 3604 v_0 := v.Args[0] 3605 b := v.Block 3606 // match: (CMNshiftRLreg (MOVWconst [c]) x y) 3607 // result: (CMNconst [c] (SRL <x.Type> x y)) 3608 for { 3609 if v_0.Op != OpARMMOVWconst { 3610 break 3611 } 3612 c := auxIntToInt32(v_0.AuxInt) 3613 x := v_1 3614 y := v_2 3615 v.reset(OpARMCMNconst) 3616 v.AuxInt = int32ToAuxInt(c) 3617 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3618 v0.AddArg2(x, y) 3619 v.AddArg(v0) 3620 return true 3621 } 3622 // match: (CMNshiftRLreg x y (MOVWconst [c])) 3623 // cond: 0 <= c && c < 32 3624 // result: (CMNshiftRL x y [c]) 3625 for { 3626 x := v_0 3627 y := v_1 3628 if v_2.Op != OpARMMOVWconst { 3629 break 3630 } 3631 c := auxIntToInt32(v_2.AuxInt) 3632 if !(0 <= c && c < 32) { 3633 break 3634 } 3635 v.reset(OpARMCMNshiftRL) 3636 v.AuxInt = int32ToAuxInt(c) 3637 v.AddArg2(x, y) 3638 return true 3639 } 3640 return false 3641 } 3642 func rewriteValueARM_OpARMCMOVWHSconst(v *Value) bool { 3643 v_1 := v.Args[1] 3644 v_0 := v.Args[0] 3645 // match: (CMOVWHSconst _ (FlagConstant [fc]) [c]) 3646 // cond: fc.uge() 3647 // result: (MOVWconst [c]) 3648 for { 3649 c := auxIntToInt32(v.AuxInt) 3650 if v_1.Op != OpARMFlagConstant { 3651 break 3652 } 3653 fc := auxIntToFlagConstant(v_1.AuxInt) 3654 if !(fc.uge()) { 3655 break 3656 } 3657 v.reset(OpARMMOVWconst) 3658 v.AuxInt = int32ToAuxInt(c) 3659 return true 3660 } 3661 // match: (CMOVWHSconst x (FlagConstant [fc]) [c]) 3662 // cond: fc.ult() 3663 // result: x 3664 for { 3665 x := v_0 3666 if v_1.Op != OpARMFlagConstant { 3667 break 3668 } 3669 fc := auxIntToFlagConstant(v_1.AuxInt) 3670 if !(fc.ult()) { 3671 break 3672 } 3673 v.copyOf(x) 3674 return true 3675 } 3676 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 3677 // result: (CMOVWLSconst x flags [c]) 3678 for { 3679 c := auxIntToInt32(v.AuxInt) 3680 x := v_0 3681 if v_1.Op != OpARMInvertFlags { 3682 break 3683 } 3684 flags := v_1.Args[0] 3685 v.reset(OpARMCMOVWLSconst) 3686 v.AuxInt = int32ToAuxInt(c) 3687 v.AddArg2(x, flags) 3688 return true 3689 } 3690 return false 3691 } 3692 func rewriteValueARM_OpARMCMOVWLSconst(v *Value) bool { 3693 v_1 := v.Args[1] 3694 v_0 := v.Args[0] 3695 // match: (CMOVWLSconst _ (FlagConstant [fc]) [c]) 3696 // cond: fc.ule() 3697 // result: (MOVWconst [c]) 3698 for { 3699 c := auxIntToInt32(v.AuxInt) 3700 if v_1.Op != OpARMFlagConstant { 3701 break 3702 } 3703 fc := auxIntToFlagConstant(v_1.AuxInt) 3704 if !(fc.ule()) { 3705 break 3706 } 3707 v.reset(OpARMMOVWconst) 3708 v.AuxInt = int32ToAuxInt(c) 3709 return true 3710 } 3711 // match: (CMOVWLSconst x (FlagConstant [fc]) [c]) 3712 // cond: fc.ugt() 3713 // result: x 3714 for { 3715 x := v_0 3716 if v_1.Op != OpARMFlagConstant { 3717 break 3718 } 3719 fc := auxIntToFlagConstant(v_1.AuxInt) 3720 if !(fc.ugt()) { 3721 break 3722 } 3723 v.copyOf(x) 3724 return true 3725 } 3726 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 3727 // result: (CMOVWHSconst x flags [c]) 3728 for { 3729 c := auxIntToInt32(v.AuxInt) 3730 x := v_0 3731 if v_1.Op != OpARMInvertFlags { 3732 break 3733 } 3734 flags := v_1.Args[0] 3735 v.reset(OpARMCMOVWHSconst) 3736 v.AuxInt = int32ToAuxInt(c) 3737 v.AddArg2(x, flags) 3738 return true 3739 } 3740 return false 3741 } 3742 func rewriteValueARM_OpARMCMP(v *Value) bool { 3743 v_1 := v.Args[1] 3744 v_0 := v.Args[0] 3745 b := v.Block 3746 // match: (CMP x (MOVWconst [c])) 3747 // result: (CMPconst [c] x) 3748 for { 3749 x := v_0 3750 if v_1.Op != OpARMMOVWconst { 3751 break 3752 } 3753 c := auxIntToInt32(v_1.AuxInt) 3754 v.reset(OpARMCMPconst) 3755 v.AuxInt = int32ToAuxInt(c) 3756 v.AddArg(x) 3757 return true 3758 } 3759 // match: (CMP (MOVWconst [c]) x) 3760 // result: (InvertFlags (CMPconst [c] x)) 3761 for { 3762 if v_0.Op != OpARMMOVWconst { 3763 break 3764 } 3765 c := auxIntToInt32(v_0.AuxInt) 3766 x := v_1 3767 v.reset(OpARMInvertFlags) 3768 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 3769 v0.AuxInt = int32ToAuxInt(c) 3770 v0.AddArg(x) 3771 v.AddArg(v0) 3772 return true 3773 } 3774 // match: (CMP x y) 3775 // cond: canonLessThan(x,y) 3776 // result: (InvertFlags (CMP y x)) 3777 for { 3778 x := v_0 3779 y := v_1 3780 if !(canonLessThan(x, y)) { 3781 break 3782 } 3783 v.reset(OpARMInvertFlags) 3784 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 3785 v0.AddArg2(y, x) 3786 v.AddArg(v0) 3787 return true 3788 } 3789 // match: (CMP x (SLLconst [c] y)) 3790 // result: (CMPshiftLL x y [c]) 3791 for { 3792 x := v_0 3793 if v_1.Op != OpARMSLLconst { 3794 break 3795 } 3796 c := auxIntToInt32(v_1.AuxInt) 3797 y := v_1.Args[0] 3798 v.reset(OpARMCMPshiftLL) 3799 v.AuxInt = int32ToAuxInt(c) 3800 v.AddArg2(x, y) 3801 return true 3802 } 3803 // match: (CMP (SLLconst [c] y) x) 3804 // result: (InvertFlags (CMPshiftLL x y [c])) 3805 for { 3806 if v_0.Op != OpARMSLLconst { 3807 break 3808 } 3809 c := auxIntToInt32(v_0.AuxInt) 3810 y := v_0.Args[0] 3811 x := v_1 3812 v.reset(OpARMInvertFlags) 3813 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 3814 v0.AuxInt = int32ToAuxInt(c) 3815 v0.AddArg2(x, y) 3816 v.AddArg(v0) 3817 return true 3818 } 3819 // match: (CMP x (SRLconst [c] y)) 3820 // result: (CMPshiftRL x y [c]) 3821 for { 3822 x := v_0 3823 if v_1.Op != OpARMSRLconst { 3824 break 3825 } 3826 c := auxIntToInt32(v_1.AuxInt) 3827 y := v_1.Args[0] 3828 v.reset(OpARMCMPshiftRL) 3829 v.AuxInt = int32ToAuxInt(c) 3830 v.AddArg2(x, y) 3831 return true 3832 } 3833 // match: (CMP (SRLconst [c] y) x) 3834 // result: (InvertFlags (CMPshiftRL x y [c])) 3835 for { 3836 if v_0.Op != OpARMSRLconst { 3837 break 3838 } 3839 c := auxIntToInt32(v_0.AuxInt) 3840 y := v_0.Args[0] 3841 x := v_1 3842 v.reset(OpARMInvertFlags) 3843 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 3844 v0.AuxInt = int32ToAuxInt(c) 3845 v0.AddArg2(x, y) 3846 v.AddArg(v0) 3847 return true 3848 } 3849 // match: (CMP x (SRAconst [c] y)) 3850 // result: (CMPshiftRA x y [c]) 3851 for { 3852 x := v_0 3853 if v_1.Op != OpARMSRAconst { 3854 break 3855 } 3856 c := auxIntToInt32(v_1.AuxInt) 3857 y := v_1.Args[0] 3858 v.reset(OpARMCMPshiftRA) 3859 v.AuxInt = int32ToAuxInt(c) 3860 v.AddArg2(x, y) 3861 return true 3862 } 3863 // match: (CMP (SRAconst [c] y) x) 3864 // result: (InvertFlags (CMPshiftRA x y [c])) 3865 for { 3866 if v_0.Op != OpARMSRAconst { 3867 break 3868 } 3869 c := auxIntToInt32(v_0.AuxInt) 3870 y := v_0.Args[0] 3871 x := v_1 3872 v.reset(OpARMInvertFlags) 3873 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 3874 v0.AuxInt = int32ToAuxInt(c) 3875 v0.AddArg2(x, y) 3876 v.AddArg(v0) 3877 return true 3878 } 3879 // match: (CMP x (SLL y z)) 3880 // result: (CMPshiftLLreg x y z) 3881 for { 3882 x := v_0 3883 if v_1.Op != OpARMSLL { 3884 break 3885 } 3886 z := v_1.Args[1] 3887 y := v_1.Args[0] 3888 v.reset(OpARMCMPshiftLLreg) 3889 v.AddArg3(x, y, z) 3890 return true 3891 } 3892 // match: (CMP (SLL y z) x) 3893 // result: (InvertFlags (CMPshiftLLreg x y z)) 3894 for { 3895 if v_0.Op != OpARMSLL { 3896 break 3897 } 3898 z := v_0.Args[1] 3899 y := v_0.Args[0] 3900 x := v_1 3901 v.reset(OpARMInvertFlags) 3902 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 3903 v0.AddArg3(x, y, z) 3904 v.AddArg(v0) 3905 return true 3906 } 3907 // match: (CMP x (SRL y z)) 3908 // result: (CMPshiftRLreg x y z) 3909 for { 3910 x := v_0 3911 if v_1.Op != OpARMSRL { 3912 break 3913 } 3914 z := v_1.Args[1] 3915 y := v_1.Args[0] 3916 v.reset(OpARMCMPshiftRLreg) 3917 v.AddArg3(x, y, z) 3918 return true 3919 } 3920 // match: (CMP (SRL y z) x) 3921 // result: (InvertFlags (CMPshiftRLreg x y z)) 3922 for { 3923 if v_0.Op != OpARMSRL { 3924 break 3925 } 3926 z := v_0.Args[1] 3927 y := v_0.Args[0] 3928 x := v_1 3929 v.reset(OpARMInvertFlags) 3930 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 3931 v0.AddArg3(x, y, z) 3932 v.AddArg(v0) 3933 return true 3934 } 3935 // match: (CMP x (SRA y z)) 3936 // result: (CMPshiftRAreg x y z) 3937 for { 3938 x := v_0 3939 if v_1.Op != OpARMSRA { 3940 break 3941 } 3942 z := v_1.Args[1] 3943 y := v_1.Args[0] 3944 v.reset(OpARMCMPshiftRAreg) 3945 v.AddArg3(x, y, z) 3946 return true 3947 } 3948 // match: (CMP (SRA y z) x) 3949 // result: (InvertFlags (CMPshiftRAreg x y z)) 3950 for { 3951 if v_0.Op != OpARMSRA { 3952 break 3953 } 3954 z := v_0.Args[1] 3955 y := v_0.Args[0] 3956 x := v_1 3957 v.reset(OpARMInvertFlags) 3958 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 3959 v0.AddArg3(x, y, z) 3960 v.AddArg(v0) 3961 return true 3962 } 3963 return false 3964 } 3965 func rewriteValueARM_OpARMCMPD(v *Value) bool { 3966 v_1 := v.Args[1] 3967 v_0 := v.Args[0] 3968 // match: (CMPD x (MOVDconst [0])) 3969 // result: (CMPD0 x) 3970 for { 3971 x := v_0 3972 if v_1.Op != OpARMMOVDconst || auxIntToFloat64(v_1.AuxInt) != 0 { 3973 break 3974 } 3975 v.reset(OpARMCMPD0) 3976 v.AddArg(x) 3977 return true 3978 } 3979 return false 3980 } 3981 func rewriteValueARM_OpARMCMPF(v *Value) bool { 3982 v_1 := v.Args[1] 3983 v_0 := v.Args[0] 3984 // match: (CMPF x (MOVFconst [0])) 3985 // result: (CMPF0 x) 3986 for { 3987 x := v_0 3988 if v_1.Op != OpARMMOVFconst || auxIntToFloat64(v_1.AuxInt) != 0 { 3989 break 3990 } 3991 v.reset(OpARMCMPF0) 3992 v.AddArg(x) 3993 return true 3994 } 3995 return false 3996 } 3997 func rewriteValueARM_OpARMCMPconst(v *Value) bool { 3998 v_0 := v.Args[0] 3999 // match: (CMPconst (MOVWconst [x]) [y]) 4000 // result: (FlagConstant [subFlags32(x,y)]) 4001 for { 4002 y := auxIntToInt32(v.AuxInt) 4003 if v_0.Op != OpARMMOVWconst { 4004 break 4005 } 4006 x := auxIntToInt32(v_0.AuxInt) 4007 v.reset(OpARMFlagConstant) 4008 v.AuxInt = flagConstantToAuxInt(subFlags32(x, y)) 4009 return true 4010 } 4011 // match: (CMPconst (MOVBUreg _) [c]) 4012 // cond: 0xff < c 4013 // result: (FlagConstant [subFlags32(0, 1)]) 4014 for { 4015 c := auxIntToInt32(v.AuxInt) 4016 if v_0.Op != OpARMMOVBUreg || !(0xff < c) { 4017 break 4018 } 4019 v.reset(OpARMFlagConstant) 4020 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1)) 4021 return true 4022 } 4023 // match: (CMPconst (MOVHUreg _) [c]) 4024 // cond: 0xffff < c 4025 // result: (FlagConstant [subFlags32(0, 1)]) 4026 for { 4027 c := auxIntToInt32(v.AuxInt) 4028 if v_0.Op != OpARMMOVHUreg || !(0xffff < c) { 4029 break 4030 } 4031 v.reset(OpARMFlagConstant) 4032 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1)) 4033 return true 4034 } 4035 // match: (CMPconst (ANDconst _ [m]) [n]) 4036 // cond: 0 <= m && m < n 4037 // result: (FlagConstant [subFlags32(0, 1)]) 4038 for { 4039 n := auxIntToInt32(v.AuxInt) 4040 if v_0.Op != OpARMANDconst { 4041 break 4042 } 4043 m := auxIntToInt32(v_0.AuxInt) 4044 if !(0 <= m && m < n) { 4045 break 4046 } 4047 v.reset(OpARMFlagConstant) 4048 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1)) 4049 return true 4050 } 4051 // match: (CMPconst (SRLconst _ [c]) [n]) 4052 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 4053 // result: (FlagConstant [subFlags32(0, 1)]) 4054 for { 4055 n := auxIntToInt32(v.AuxInt) 4056 if v_0.Op != OpARMSRLconst { 4057 break 4058 } 4059 c := auxIntToInt32(v_0.AuxInt) 4060 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 4061 break 4062 } 4063 v.reset(OpARMFlagConstant) 4064 v.AuxInt = flagConstantToAuxInt(subFlags32(0, 1)) 4065 return true 4066 } 4067 return false 4068 } 4069 func rewriteValueARM_OpARMCMPshiftLL(v *Value) bool { 4070 v_1 := v.Args[1] 4071 v_0 := v.Args[0] 4072 b := v.Block 4073 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 4074 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 4075 for { 4076 d := auxIntToInt32(v.AuxInt) 4077 if v_0.Op != OpARMMOVWconst { 4078 break 4079 } 4080 c := auxIntToInt32(v_0.AuxInt) 4081 x := v_1 4082 v.reset(OpARMInvertFlags) 4083 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4084 v0.AuxInt = int32ToAuxInt(c) 4085 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4086 v1.AuxInt = int32ToAuxInt(d) 4087 v1.AddArg(x) 4088 v0.AddArg(v1) 4089 v.AddArg(v0) 4090 return true 4091 } 4092 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 4093 // result: (CMPconst x [c<<uint64(d)]) 4094 for { 4095 d := auxIntToInt32(v.AuxInt) 4096 x := v_0 4097 if v_1.Op != OpARMMOVWconst { 4098 break 4099 } 4100 c := auxIntToInt32(v_1.AuxInt) 4101 v.reset(OpARMCMPconst) 4102 v.AuxInt = int32ToAuxInt(c << uint64(d)) 4103 v.AddArg(x) 4104 return true 4105 } 4106 return false 4107 } 4108 func rewriteValueARM_OpARMCMPshiftLLreg(v *Value) bool { 4109 v_2 := v.Args[2] 4110 v_1 := v.Args[1] 4111 v_0 := v.Args[0] 4112 b := v.Block 4113 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 4114 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 4115 for { 4116 if v_0.Op != OpARMMOVWconst { 4117 break 4118 } 4119 c := auxIntToInt32(v_0.AuxInt) 4120 x := v_1 4121 y := v_2 4122 v.reset(OpARMInvertFlags) 4123 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4124 v0.AuxInt = int32ToAuxInt(c) 4125 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4126 v1.AddArg2(x, y) 4127 v0.AddArg(v1) 4128 v.AddArg(v0) 4129 return true 4130 } 4131 // match: (CMPshiftLLreg x y (MOVWconst [c])) 4132 // cond: 0 <= c && c < 32 4133 // result: (CMPshiftLL x y [c]) 4134 for { 4135 x := v_0 4136 y := v_1 4137 if v_2.Op != OpARMMOVWconst { 4138 break 4139 } 4140 c := auxIntToInt32(v_2.AuxInt) 4141 if !(0 <= c && c < 32) { 4142 break 4143 } 4144 v.reset(OpARMCMPshiftLL) 4145 v.AuxInt = int32ToAuxInt(c) 4146 v.AddArg2(x, y) 4147 return true 4148 } 4149 return false 4150 } 4151 func rewriteValueARM_OpARMCMPshiftRA(v *Value) bool { 4152 v_1 := v.Args[1] 4153 v_0 := v.Args[0] 4154 b := v.Block 4155 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 4156 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 4157 for { 4158 d := auxIntToInt32(v.AuxInt) 4159 if v_0.Op != OpARMMOVWconst { 4160 break 4161 } 4162 c := auxIntToInt32(v_0.AuxInt) 4163 x := v_1 4164 v.reset(OpARMInvertFlags) 4165 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4166 v0.AuxInt = int32ToAuxInt(c) 4167 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4168 v1.AuxInt = int32ToAuxInt(d) 4169 v1.AddArg(x) 4170 v0.AddArg(v1) 4171 v.AddArg(v0) 4172 return true 4173 } 4174 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 4175 // result: (CMPconst x [c>>uint64(d)]) 4176 for { 4177 d := auxIntToInt32(v.AuxInt) 4178 x := v_0 4179 if v_1.Op != OpARMMOVWconst { 4180 break 4181 } 4182 c := auxIntToInt32(v_1.AuxInt) 4183 v.reset(OpARMCMPconst) 4184 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 4185 v.AddArg(x) 4186 return true 4187 } 4188 return false 4189 } 4190 func rewriteValueARM_OpARMCMPshiftRAreg(v *Value) bool { 4191 v_2 := v.Args[2] 4192 v_1 := v.Args[1] 4193 v_0 := v.Args[0] 4194 b := v.Block 4195 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 4196 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 4197 for { 4198 if v_0.Op != OpARMMOVWconst { 4199 break 4200 } 4201 c := auxIntToInt32(v_0.AuxInt) 4202 x := v_1 4203 y := v_2 4204 v.reset(OpARMInvertFlags) 4205 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4206 v0.AuxInt = int32ToAuxInt(c) 4207 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4208 v1.AddArg2(x, y) 4209 v0.AddArg(v1) 4210 v.AddArg(v0) 4211 return true 4212 } 4213 // match: (CMPshiftRAreg x y (MOVWconst [c])) 4214 // cond: 0 <= c && c < 32 4215 // result: (CMPshiftRA x y [c]) 4216 for { 4217 x := v_0 4218 y := v_1 4219 if v_2.Op != OpARMMOVWconst { 4220 break 4221 } 4222 c := auxIntToInt32(v_2.AuxInt) 4223 if !(0 <= c && c < 32) { 4224 break 4225 } 4226 v.reset(OpARMCMPshiftRA) 4227 v.AuxInt = int32ToAuxInt(c) 4228 v.AddArg2(x, y) 4229 return true 4230 } 4231 return false 4232 } 4233 func rewriteValueARM_OpARMCMPshiftRL(v *Value) bool { 4234 v_1 := v.Args[1] 4235 v_0 := v.Args[0] 4236 b := v.Block 4237 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 4238 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 4239 for { 4240 d := auxIntToInt32(v.AuxInt) 4241 if v_0.Op != OpARMMOVWconst { 4242 break 4243 } 4244 c := auxIntToInt32(v_0.AuxInt) 4245 x := v_1 4246 v.reset(OpARMInvertFlags) 4247 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4248 v0.AuxInt = int32ToAuxInt(c) 4249 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 4250 v1.AuxInt = int32ToAuxInt(d) 4251 v1.AddArg(x) 4252 v0.AddArg(v1) 4253 v.AddArg(v0) 4254 return true 4255 } 4256 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 4257 // result: (CMPconst x [int32(uint32(c)>>uint64(d))]) 4258 for { 4259 d := auxIntToInt32(v.AuxInt) 4260 x := v_0 4261 if v_1.Op != OpARMMOVWconst { 4262 break 4263 } 4264 c := auxIntToInt32(v_1.AuxInt) 4265 v.reset(OpARMCMPconst) 4266 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 4267 v.AddArg(x) 4268 return true 4269 } 4270 return false 4271 } 4272 func rewriteValueARM_OpARMCMPshiftRLreg(v *Value) bool { 4273 v_2 := v.Args[2] 4274 v_1 := v.Args[1] 4275 v_0 := v.Args[0] 4276 b := v.Block 4277 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 4278 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 4279 for { 4280 if v_0.Op != OpARMMOVWconst { 4281 break 4282 } 4283 c := auxIntToInt32(v_0.AuxInt) 4284 x := v_1 4285 y := v_2 4286 v.reset(OpARMInvertFlags) 4287 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4288 v0.AuxInt = int32ToAuxInt(c) 4289 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 4290 v1.AddArg2(x, y) 4291 v0.AddArg(v1) 4292 v.AddArg(v0) 4293 return true 4294 } 4295 // match: (CMPshiftRLreg x y (MOVWconst [c])) 4296 // cond: 0 <= c && c < 32 4297 // result: (CMPshiftRL x y [c]) 4298 for { 4299 x := v_0 4300 y := v_1 4301 if v_2.Op != OpARMMOVWconst { 4302 break 4303 } 4304 c := auxIntToInt32(v_2.AuxInt) 4305 if !(0 <= c && c < 32) { 4306 break 4307 } 4308 v.reset(OpARMCMPshiftRL) 4309 v.AuxInt = int32ToAuxInt(c) 4310 v.AddArg2(x, y) 4311 return true 4312 } 4313 return false 4314 } 4315 func rewriteValueARM_OpARMEqual(v *Value) bool { 4316 v_0 := v.Args[0] 4317 // match: (Equal (FlagConstant [fc])) 4318 // result: (MOVWconst [b2i32(fc.eq())]) 4319 for { 4320 if v_0.Op != OpARMFlagConstant { 4321 break 4322 } 4323 fc := auxIntToFlagConstant(v_0.AuxInt) 4324 v.reset(OpARMMOVWconst) 4325 v.AuxInt = int32ToAuxInt(b2i32(fc.eq())) 4326 return true 4327 } 4328 // match: (Equal (InvertFlags x)) 4329 // result: (Equal x) 4330 for { 4331 if v_0.Op != OpARMInvertFlags { 4332 break 4333 } 4334 x := v_0.Args[0] 4335 v.reset(OpARMEqual) 4336 v.AddArg(x) 4337 return true 4338 } 4339 return false 4340 } 4341 func rewriteValueARM_OpARMGreaterEqual(v *Value) bool { 4342 v_0 := v.Args[0] 4343 // match: (GreaterEqual (FlagConstant [fc])) 4344 // result: (MOVWconst [b2i32(fc.ge())]) 4345 for { 4346 if v_0.Op != OpARMFlagConstant { 4347 break 4348 } 4349 fc := auxIntToFlagConstant(v_0.AuxInt) 4350 v.reset(OpARMMOVWconst) 4351 v.AuxInt = int32ToAuxInt(b2i32(fc.ge())) 4352 return true 4353 } 4354 // match: (GreaterEqual (InvertFlags x)) 4355 // result: (LessEqual x) 4356 for { 4357 if v_0.Op != OpARMInvertFlags { 4358 break 4359 } 4360 x := v_0.Args[0] 4361 v.reset(OpARMLessEqual) 4362 v.AddArg(x) 4363 return true 4364 } 4365 return false 4366 } 4367 func rewriteValueARM_OpARMGreaterEqualU(v *Value) bool { 4368 v_0 := v.Args[0] 4369 // match: (GreaterEqualU (FlagConstant [fc])) 4370 // result: (MOVWconst [b2i32(fc.uge())]) 4371 for { 4372 if v_0.Op != OpARMFlagConstant { 4373 break 4374 } 4375 fc := auxIntToFlagConstant(v_0.AuxInt) 4376 v.reset(OpARMMOVWconst) 4377 v.AuxInt = int32ToAuxInt(b2i32(fc.uge())) 4378 return true 4379 } 4380 // match: (GreaterEqualU (InvertFlags x)) 4381 // result: (LessEqualU x) 4382 for { 4383 if v_0.Op != OpARMInvertFlags { 4384 break 4385 } 4386 x := v_0.Args[0] 4387 v.reset(OpARMLessEqualU) 4388 v.AddArg(x) 4389 return true 4390 } 4391 return false 4392 } 4393 func rewriteValueARM_OpARMGreaterThan(v *Value) bool { 4394 v_0 := v.Args[0] 4395 // match: (GreaterThan (FlagConstant [fc])) 4396 // result: (MOVWconst [b2i32(fc.gt())]) 4397 for { 4398 if v_0.Op != OpARMFlagConstant { 4399 break 4400 } 4401 fc := auxIntToFlagConstant(v_0.AuxInt) 4402 v.reset(OpARMMOVWconst) 4403 v.AuxInt = int32ToAuxInt(b2i32(fc.gt())) 4404 return true 4405 } 4406 // match: (GreaterThan (InvertFlags x)) 4407 // result: (LessThan x) 4408 for { 4409 if v_0.Op != OpARMInvertFlags { 4410 break 4411 } 4412 x := v_0.Args[0] 4413 v.reset(OpARMLessThan) 4414 v.AddArg(x) 4415 return true 4416 } 4417 return false 4418 } 4419 func rewriteValueARM_OpARMGreaterThanU(v *Value) bool { 4420 v_0 := v.Args[0] 4421 // match: (GreaterThanU (FlagConstant [fc])) 4422 // result: (MOVWconst [b2i32(fc.ugt())]) 4423 for { 4424 if v_0.Op != OpARMFlagConstant { 4425 break 4426 } 4427 fc := auxIntToFlagConstant(v_0.AuxInt) 4428 v.reset(OpARMMOVWconst) 4429 v.AuxInt = int32ToAuxInt(b2i32(fc.ugt())) 4430 return true 4431 } 4432 // match: (GreaterThanU (InvertFlags x)) 4433 // result: (LessThanU x) 4434 for { 4435 if v_0.Op != OpARMInvertFlags { 4436 break 4437 } 4438 x := v_0.Args[0] 4439 v.reset(OpARMLessThanU) 4440 v.AddArg(x) 4441 return true 4442 } 4443 return false 4444 } 4445 func rewriteValueARM_OpARMLessEqual(v *Value) bool { 4446 v_0 := v.Args[0] 4447 // match: (LessEqual (FlagConstant [fc])) 4448 // result: (MOVWconst [b2i32(fc.le())]) 4449 for { 4450 if v_0.Op != OpARMFlagConstant { 4451 break 4452 } 4453 fc := auxIntToFlagConstant(v_0.AuxInt) 4454 v.reset(OpARMMOVWconst) 4455 v.AuxInt = int32ToAuxInt(b2i32(fc.le())) 4456 return true 4457 } 4458 // match: (LessEqual (InvertFlags x)) 4459 // result: (GreaterEqual x) 4460 for { 4461 if v_0.Op != OpARMInvertFlags { 4462 break 4463 } 4464 x := v_0.Args[0] 4465 v.reset(OpARMGreaterEqual) 4466 v.AddArg(x) 4467 return true 4468 } 4469 return false 4470 } 4471 func rewriteValueARM_OpARMLessEqualU(v *Value) bool { 4472 v_0 := v.Args[0] 4473 // match: (LessEqualU (FlagConstant [fc])) 4474 // result: (MOVWconst [b2i32(fc.ule())]) 4475 for { 4476 if v_0.Op != OpARMFlagConstant { 4477 break 4478 } 4479 fc := auxIntToFlagConstant(v_0.AuxInt) 4480 v.reset(OpARMMOVWconst) 4481 v.AuxInt = int32ToAuxInt(b2i32(fc.ule())) 4482 return true 4483 } 4484 // match: (LessEqualU (InvertFlags x)) 4485 // result: (GreaterEqualU x) 4486 for { 4487 if v_0.Op != OpARMInvertFlags { 4488 break 4489 } 4490 x := v_0.Args[0] 4491 v.reset(OpARMGreaterEqualU) 4492 v.AddArg(x) 4493 return true 4494 } 4495 return false 4496 } 4497 func rewriteValueARM_OpARMLessThan(v *Value) bool { 4498 v_0 := v.Args[0] 4499 // match: (LessThan (FlagConstant [fc])) 4500 // result: (MOVWconst [b2i32(fc.lt())]) 4501 for { 4502 if v_0.Op != OpARMFlagConstant { 4503 break 4504 } 4505 fc := auxIntToFlagConstant(v_0.AuxInt) 4506 v.reset(OpARMMOVWconst) 4507 v.AuxInt = int32ToAuxInt(b2i32(fc.lt())) 4508 return true 4509 } 4510 // match: (LessThan (InvertFlags x)) 4511 // result: (GreaterThan x) 4512 for { 4513 if v_0.Op != OpARMInvertFlags { 4514 break 4515 } 4516 x := v_0.Args[0] 4517 v.reset(OpARMGreaterThan) 4518 v.AddArg(x) 4519 return true 4520 } 4521 return false 4522 } 4523 func rewriteValueARM_OpARMLessThanU(v *Value) bool { 4524 v_0 := v.Args[0] 4525 // match: (LessThanU (FlagConstant [fc])) 4526 // result: (MOVWconst [b2i32(fc.ult())]) 4527 for { 4528 if v_0.Op != OpARMFlagConstant { 4529 break 4530 } 4531 fc := auxIntToFlagConstant(v_0.AuxInt) 4532 v.reset(OpARMMOVWconst) 4533 v.AuxInt = int32ToAuxInt(b2i32(fc.ult())) 4534 return true 4535 } 4536 // match: (LessThanU (InvertFlags x)) 4537 // result: (GreaterThanU x) 4538 for { 4539 if v_0.Op != OpARMInvertFlags { 4540 break 4541 } 4542 x := v_0.Args[0] 4543 v.reset(OpARMGreaterThanU) 4544 v.AddArg(x) 4545 return true 4546 } 4547 return false 4548 } 4549 func rewriteValueARM_OpARMMOVBUload(v *Value) bool { 4550 v_1 := v.Args[1] 4551 v_0 := v.Args[0] 4552 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 4553 // result: (MOVBUload [off1+off2] {sym} ptr mem) 4554 for { 4555 off1 := auxIntToInt32(v.AuxInt) 4556 sym := auxToSym(v.Aux) 4557 if v_0.Op != OpARMADDconst { 4558 break 4559 } 4560 off2 := auxIntToInt32(v_0.AuxInt) 4561 ptr := v_0.Args[0] 4562 mem := v_1 4563 v.reset(OpARMMOVBUload) 4564 v.AuxInt = int32ToAuxInt(off1 + off2) 4565 v.Aux = symToAux(sym) 4566 v.AddArg2(ptr, mem) 4567 return true 4568 } 4569 // match: (MOVBUload [off1] {sym} (SUBconst [off2] ptr) mem) 4570 // result: (MOVBUload [off1-off2] {sym} ptr mem) 4571 for { 4572 off1 := auxIntToInt32(v.AuxInt) 4573 sym := auxToSym(v.Aux) 4574 if v_0.Op != OpARMSUBconst { 4575 break 4576 } 4577 off2 := auxIntToInt32(v_0.AuxInt) 4578 ptr := v_0.Args[0] 4579 mem := v_1 4580 v.reset(OpARMMOVBUload) 4581 v.AuxInt = int32ToAuxInt(off1 - off2) 4582 v.Aux = symToAux(sym) 4583 v.AddArg2(ptr, mem) 4584 return true 4585 } 4586 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 4587 // cond: canMergeSym(sym1,sym2) 4588 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4589 for { 4590 off1 := auxIntToInt32(v.AuxInt) 4591 sym1 := auxToSym(v.Aux) 4592 if v_0.Op != OpARMMOVWaddr { 4593 break 4594 } 4595 off2 := auxIntToInt32(v_0.AuxInt) 4596 sym2 := auxToSym(v_0.Aux) 4597 ptr := v_0.Args[0] 4598 mem := v_1 4599 if !(canMergeSym(sym1, sym2)) { 4600 break 4601 } 4602 v.reset(OpARMMOVBUload) 4603 v.AuxInt = int32ToAuxInt(off1 + off2) 4604 v.Aux = symToAux(mergeSym(sym1, sym2)) 4605 v.AddArg2(ptr, mem) 4606 return true 4607 } 4608 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 4609 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4610 // result: (MOVBUreg x) 4611 for { 4612 off := auxIntToInt32(v.AuxInt) 4613 sym := auxToSym(v.Aux) 4614 ptr := v_0 4615 if v_1.Op != OpARMMOVBstore { 4616 break 4617 } 4618 off2 := auxIntToInt32(v_1.AuxInt) 4619 sym2 := auxToSym(v_1.Aux) 4620 x := v_1.Args[1] 4621 ptr2 := v_1.Args[0] 4622 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4623 break 4624 } 4625 v.reset(OpARMMOVBUreg) 4626 v.AddArg(x) 4627 return true 4628 } 4629 // match: (MOVBUload [0] {sym} (ADD ptr idx) mem) 4630 // cond: sym == nil 4631 // result: (MOVBUloadidx ptr idx mem) 4632 for { 4633 if auxIntToInt32(v.AuxInt) != 0 { 4634 break 4635 } 4636 sym := auxToSym(v.Aux) 4637 if v_0.Op != OpARMADD { 4638 break 4639 } 4640 idx := v_0.Args[1] 4641 ptr := v_0.Args[0] 4642 mem := v_1 4643 if !(sym == nil) { 4644 break 4645 } 4646 v.reset(OpARMMOVBUloadidx) 4647 v.AddArg3(ptr, idx, mem) 4648 return true 4649 } 4650 // match: (MOVBUload [off] {sym} (SB) _) 4651 // cond: symIsRO(sym) 4652 // result: (MOVWconst [int32(read8(sym, int64(off)))]) 4653 for { 4654 off := auxIntToInt32(v.AuxInt) 4655 sym := auxToSym(v.Aux) 4656 if v_0.Op != OpSB || !(symIsRO(sym)) { 4657 break 4658 } 4659 v.reset(OpARMMOVWconst) 4660 v.AuxInt = int32ToAuxInt(int32(read8(sym, int64(off)))) 4661 return true 4662 } 4663 return false 4664 } 4665 func rewriteValueARM_OpARMMOVBUloadidx(v *Value) bool { 4666 v_2 := v.Args[2] 4667 v_1 := v.Args[1] 4668 v_0 := v.Args[0] 4669 // match: (MOVBUloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 4670 // cond: isSamePtr(ptr, ptr2) 4671 // result: (MOVBUreg x) 4672 for { 4673 ptr := v_0 4674 idx := v_1 4675 if v_2.Op != OpARMMOVBstoreidx { 4676 break 4677 } 4678 x := v_2.Args[2] 4679 ptr2 := v_2.Args[0] 4680 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 4681 break 4682 } 4683 v.reset(OpARMMOVBUreg) 4684 v.AddArg(x) 4685 return true 4686 } 4687 // match: (MOVBUloadidx ptr (MOVWconst [c]) mem) 4688 // result: (MOVBUload [c] ptr mem) 4689 for { 4690 ptr := v_0 4691 if v_1.Op != OpARMMOVWconst { 4692 break 4693 } 4694 c := auxIntToInt32(v_1.AuxInt) 4695 mem := v_2 4696 v.reset(OpARMMOVBUload) 4697 v.AuxInt = int32ToAuxInt(c) 4698 v.AddArg2(ptr, mem) 4699 return true 4700 } 4701 // match: (MOVBUloadidx (MOVWconst [c]) ptr mem) 4702 // result: (MOVBUload [c] ptr mem) 4703 for { 4704 if v_0.Op != OpARMMOVWconst { 4705 break 4706 } 4707 c := auxIntToInt32(v_0.AuxInt) 4708 ptr := v_1 4709 mem := v_2 4710 v.reset(OpARMMOVBUload) 4711 v.AuxInt = int32ToAuxInt(c) 4712 v.AddArg2(ptr, mem) 4713 return true 4714 } 4715 return false 4716 } 4717 func rewriteValueARM_OpARMMOVBUreg(v *Value) bool { 4718 v_0 := v.Args[0] 4719 // match: (MOVBUreg x:(MOVBUload _ _)) 4720 // result: (MOVWreg x) 4721 for { 4722 x := v_0 4723 if x.Op != OpARMMOVBUload { 4724 break 4725 } 4726 v.reset(OpARMMOVWreg) 4727 v.AddArg(x) 4728 return true 4729 } 4730 // match: (MOVBUreg (ANDconst [c] x)) 4731 // result: (ANDconst [c&0xff] x) 4732 for { 4733 if v_0.Op != OpARMANDconst { 4734 break 4735 } 4736 c := auxIntToInt32(v_0.AuxInt) 4737 x := v_0.Args[0] 4738 v.reset(OpARMANDconst) 4739 v.AuxInt = int32ToAuxInt(c & 0xff) 4740 v.AddArg(x) 4741 return true 4742 } 4743 // match: (MOVBUreg x:(MOVBUreg _)) 4744 // result: (MOVWreg x) 4745 for { 4746 x := v_0 4747 if x.Op != OpARMMOVBUreg { 4748 break 4749 } 4750 v.reset(OpARMMOVWreg) 4751 v.AddArg(x) 4752 return true 4753 } 4754 // match: (MOVBUreg (MOVWconst [c])) 4755 // result: (MOVWconst [int32(uint8(c))]) 4756 for { 4757 if v_0.Op != OpARMMOVWconst { 4758 break 4759 } 4760 c := auxIntToInt32(v_0.AuxInt) 4761 v.reset(OpARMMOVWconst) 4762 v.AuxInt = int32ToAuxInt(int32(uint8(c))) 4763 return true 4764 } 4765 return false 4766 } 4767 func rewriteValueARM_OpARMMOVBload(v *Value) bool { 4768 v_1 := v.Args[1] 4769 v_0 := v.Args[0] 4770 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 4771 // result: (MOVBload [off1+off2] {sym} ptr mem) 4772 for { 4773 off1 := auxIntToInt32(v.AuxInt) 4774 sym := auxToSym(v.Aux) 4775 if v_0.Op != OpARMADDconst { 4776 break 4777 } 4778 off2 := auxIntToInt32(v_0.AuxInt) 4779 ptr := v_0.Args[0] 4780 mem := v_1 4781 v.reset(OpARMMOVBload) 4782 v.AuxInt = int32ToAuxInt(off1 + off2) 4783 v.Aux = symToAux(sym) 4784 v.AddArg2(ptr, mem) 4785 return true 4786 } 4787 // match: (MOVBload [off1] {sym} (SUBconst [off2] ptr) mem) 4788 // result: (MOVBload [off1-off2] {sym} ptr mem) 4789 for { 4790 off1 := auxIntToInt32(v.AuxInt) 4791 sym := auxToSym(v.Aux) 4792 if v_0.Op != OpARMSUBconst { 4793 break 4794 } 4795 off2 := auxIntToInt32(v_0.AuxInt) 4796 ptr := v_0.Args[0] 4797 mem := v_1 4798 v.reset(OpARMMOVBload) 4799 v.AuxInt = int32ToAuxInt(off1 - off2) 4800 v.Aux = symToAux(sym) 4801 v.AddArg2(ptr, mem) 4802 return true 4803 } 4804 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 4805 // cond: canMergeSym(sym1,sym2) 4806 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 4807 for { 4808 off1 := auxIntToInt32(v.AuxInt) 4809 sym1 := auxToSym(v.Aux) 4810 if v_0.Op != OpARMMOVWaddr { 4811 break 4812 } 4813 off2 := auxIntToInt32(v_0.AuxInt) 4814 sym2 := auxToSym(v_0.Aux) 4815 ptr := v_0.Args[0] 4816 mem := v_1 4817 if !(canMergeSym(sym1, sym2)) { 4818 break 4819 } 4820 v.reset(OpARMMOVBload) 4821 v.AuxInt = int32ToAuxInt(off1 + off2) 4822 v.Aux = symToAux(mergeSym(sym1, sym2)) 4823 v.AddArg2(ptr, mem) 4824 return true 4825 } 4826 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 4827 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 4828 // result: (MOVBreg x) 4829 for { 4830 off := auxIntToInt32(v.AuxInt) 4831 sym := auxToSym(v.Aux) 4832 ptr := v_0 4833 if v_1.Op != OpARMMOVBstore { 4834 break 4835 } 4836 off2 := auxIntToInt32(v_1.AuxInt) 4837 sym2 := auxToSym(v_1.Aux) 4838 x := v_1.Args[1] 4839 ptr2 := v_1.Args[0] 4840 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 4841 break 4842 } 4843 v.reset(OpARMMOVBreg) 4844 v.AddArg(x) 4845 return true 4846 } 4847 // match: (MOVBload [0] {sym} (ADD ptr idx) mem) 4848 // cond: sym == nil 4849 // result: (MOVBloadidx ptr idx mem) 4850 for { 4851 if auxIntToInt32(v.AuxInt) != 0 { 4852 break 4853 } 4854 sym := auxToSym(v.Aux) 4855 if v_0.Op != OpARMADD { 4856 break 4857 } 4858 idx := v_0.Args[1] 4859 ptr := v_0.Args[0] 4860 mem := v_1 4861 if !(sym == nil) { 4862 break 4863 } 4864 v.reset(OpARMMOVBloadidx) 4865 v.AddArg3(ptr, idx, mem) 4866 return true 4867 } 4868 return false 4869 } 4870 func rewriteValueARM_OpARMMOVBloadidx(v *Value) bool { 4871 v_2 := v.Args[2] 4872 v_1 := v.Args[1] 4873 v_0 := v.Args[0] 4874 // match: (MOVBloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 4875 // cond: isSamePtr(ptr, ptr2) 4876 // result: (MOVBreg x) 4877 for { 4878 ptr := v_0 4879 idx := v_1 4880 if v_2.Op != OpARMMOVBstoreidx { 4881 break 4882 } 4883 x := v_2.Args[2] 4884 ptr2 := v_2.Args[0] 4885 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 4886 break 4887 } 4888 v.reset(OpARMMOVBreg) 4889 v.AddArg(x) 4890 return true 4891 } 4892 // match: (MOVBloadidx ptr (MOVWconst [c]) mem) 4893 // result: (MOVBload [c] ptr mem) 4894 for { 4895 ptr := v_0 4896 if v_1.Op != OpARMMOVWconst { 4897 break 4898 } 4899 c := auxIntToInt32(v_1.AuxInt) 4900 mem := v_2 4901 v.reset(OpARMMOVBload) 4902 v.AuxInt = int32ToAuxInt(c) 4903 v.AddArg2(ptr, mem) 4904 return true 4905 } 4906 // match: (MOVBloadidx (MOVWconst [c]) ptr mem) 4907 // result: (MOVBload [c] ptr mem) 4908 for { 4909 if v_0.Op != OpARMMOVWconst { 4910 break 4911 } 4912 c := auxIntToInt32(v_0.AuxInt) 4913 ptr := v_1 4914 mem := v_2 4915 v.reset(OpARMMOVBload) 4916 v.AuxInt = int32ToAuxInt(c) 4917 v.AddArg2(ptr, mem) 4918 return true 4919 } 4920 return false 4921 } 4922 func rewriteValueARM_OpARMMOVBreg(v *Value) bool { 4923 v_0 := v.Args[0] 4924 // match: (MOVBreg x:(MOVBload _ _)) 4925 // result: (MOVWreg x) 4926 for { 4927 x := v_0 4928 if x.Op != OpARMMOVBload { 4929 break 4930 } 4931 v.reset(OpARMMOVWreg) 4932 v.AddArg(x) 4933 return true 4934 } 4935 // match: (MOVBreg (ANDconst [c] x)) 4936 // cond: c & 0x80 == 0 4937 // result: (ANDconst [c&0x7f] x) 4938 for { 4939 if v_0.Op != OpARMANDconst { 4940 break 4941 } 4942 c := auxIntToInt32(v_0.AuxInt) 4943 x := v_0.Args[0] 4944 if !(c&0x80 == 0) { 4945 break 4946 } 4947 v.reset(OpARMANDconst) 4948 v.AuxInt = int32ToAuxInt(c & 0x7f) 4949 v.AddArg(x) 4950 return true 4951 } 4952 // match: (MOVBreg x:(MOVBreg _)) 4953 // result: (MOVWreg x) 4954 for { 4955 x := v_0 4956 if x.Op != OpARMMOVBreg { 4957 break 4958 } 4959 v.reset(OpARMMOVWreg) 4960 v.AddArg(x) 4961 return true 4962 } 4963 // match: (MOVBreg (MOVWconst [c])) 4964 // result: (MOVWconst [int32(int8(c))]) 4965 for { 4966 if v_0.Op != OpARMMOVWconst { 4967 break 4968 } 4969 c := auxIntToInt32(v_0.AuxInt) 4970 v.reset(OpARMMOVWconst) 4971 v.AuxInt = int32ToAuxInt(int32(int8(c))) 4972 return true 4973 } 4974 return false 4975 } 4976 func rewriteValueARM_OpARMMOVBstore(v *Value) bool { 4977 v_2 := v.Args[2] 4978 v_1 := v.Args[1] 4979 v_0 := v.Args[0] 4980 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 4981 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 4982 for { 4983 off1 := auxIntToInt32(v.AuxInt) 4984 sym := auxToSym(v.Aux) 4985 if v_0.Op != OpARMADDconst { 4986 break 4987 } 4988 off2 := auxIntToInt32(v_0.AuxInt) 4989 ptr := v_0.Args[0] 4990 val := v_1 4991 mem := v_2 4992 v.reset(OpARMMOVBstore) 4993 v.AuxInt = int32ToAuxInt(off1 + off2) 4994 v.Aux = symToAux(sym) 4995 v.AddArg3(ptr, val, mem) 4996 return true 4997 } 4998 // match: (MOVBstore [off1] {sym} (SUBconst [off2] ptr) val mem) 4999 // result: (MOVBstore [off1-off2] {sym} ptr val mem) 5000 for { 5001 off1 := auxIntToInt32(v.AuxInt) 5002 sym := auxToSym(v.Aux) 5003 if v_0.Op != OpARMSUBconst { 5004 break 5005 } 5006 off2 := auxIntToInt32(v_0.AuxInt) 5007 ptr := v_0.Args[0] 5008 val := v_1 5009 mem := v_2 5010 v.reset(OpARMMOVBstore) 5011 v.AuxInt = int32ToAuxInt(off1 - off2) 5012 v.Aux = symToAux(sym) 5013 v.AddArg3(ptr, val, mem) 5014 return true 5015 } 5016 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5017 // cond: canMergeSym(sym1,sym2) 5018 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5019 for { 5020 off1 := auxIntToInt32(v.AuxInt) 5021 sym1 := auxToSym(v.Aux) 5022 if v_0.Op != OpARMMOVWaddr { 5023 break 5024 } 5025 off2 := auxIntToInt32(v_0.AuxInt) 5026 sym2 := auxToSym(v_0.Aux) 5027 ptr := v_0.Args[0] 5028 val := v_1 5029 mem := v_2 5030 if !(canMergeSym(sym1, sym2)) { 5031 break 5032 } 5033 v.reset(OpARMMOVBstore) 5034 v.AuxInt = int32ToAuxInt(off1 + off2) 5035 v.Aux = symToAux(mergeSym(sym1, sym2)) 5036 v.AddArg3(ptr, val, mem) 5037 return true 5038 } 5039 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 5040 // result: (MOVBstore [off] {sym} ptr x mem) 5041 for { 5042 off := auxIntToInt32(v.AuxInt) 5043 sym := auxToSym(v.Aux) 5044 ptr := v_0 5045 if v_1.Op != OpARMMOVBreg { 5046 break 5047 } 5048 x := v_1.Args[0] 5049 mem := v_2 5050 v.reset(OpARMMOVBstore) 5051 v.AuxInt = int32ToAuxInt(off) 5052 v.Aux = symToAux(sym) 5053 v.AddArg3(ptr, x, mem) 5054 return true 5055 } 5056 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 5057 // result: (MOVBstore [off] {sym} ptr x mem) 5058 for { 5059 off := auxIntToInt32(v.AuxInt) 5060 sym := auxToSym(v.Aux) 5061 ptr := v_0 5062 if v_1.Op != OpARMMOVBUreg { 5063 break 5064 } 5065 x := v_1.Args[0] 5066 mem := v_2 5067 v.reset(OpARMMOVBstore) 5068 v.AuxInt = int32ToAuxInt(off) 5069 v.Aux = symToAux(sym) 5070 v.AddArg3(ptr, x, mem) 5071 return true 5072 } 5073 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 5074 // result: (MOVBstore [off] {sym} ptr x mem) 5075 for { 5076 off := auxIntToInt32(v.AuxInt) 5077 sym := auxToSym(v.Aux) 5078 ptr := v_0 5079 if v_1.Op != OpARMMOVHreg { 5080 break 5081 } 5082 x := v_1.Args[0] 5083 mem := v_2 5084 v.reset(OpARMMOVBstore) 5085 v.AuxInt = int32ToAuxInt(off) 5086 v.Aux = symToAux(sym) 5087 v.AddArg3(ptr, x, mem) 5088 return true 5089 } 5090 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 5091 // result: (MOVBstore [off] {sym} ptr x mem) 5092 for { 5093 off := auxIntToInt32(v.AuxInt) 5094 sym := auxToSym(v.Aux) 5095 ptr := v_0 5096 if v_1.Op != OpARMMOVHUreg { 5097 break 5098 } 5099 x := v_1.Args[0] 5100 mem := v_2 5101 v.reset(OpARMMOVBstore) 5102 v.AuxInt = int32ToAuxInt(off) 5103 v.Aux = symToAux(sym) 5104 v.AddArg3(ptr, x, mem) 5105 return true 5106 } 5107 // match: (MOVBstore [0] {sym} (ADD ptr idx) val mem) 5108 // cond: sym == nil 5109 // result: (MOVBstoreidx ptr idx val mem) 5110 for { 5111 if auxIntToInt32(v.AuxInt) != 0 { 5112 break 5113 } 5114 sym := auxToSym(v.Aux) 5115 if v_0.Op != OpARMADD { 5116 break 5117 } 5118 idx := v_0.Args[1] 5119 ptr := v_0.Args[0] 5120 val := v_1 5121 mem := v_2 5122 if !(sym == nil) { 5123 break 5124 } 5125 v.reset(OpARMMOVBstoreidx) 5126 v.AddArg4(ptr, idx, val, mem) 5127 return true 5128 } 5129 return false 5130 } 5131 func rewriteValueARM_OpARMMOVBstoreidx(v *Value) bool { 5132 v_3 := v.Args[3] 5133 v_2 := v.Args[2] 5134 v_1 := v.Args[1] 5135 v_0 := v.Args[0] 5136 // match: (MOVBstoreidx ptr (MOVWconst [c]) val mem) 5137 // result: (MOVBstore [c] ptr val mem) 5138 for { 5139 ptr := v_0 5140 if v_1.Op != OpARMMOVWconst { 5141 break 5142 } 5143 c := auxIntToInt32(v_1.AuxInt) 5144 val := v_2 5145 mem := v_3 5146 v.reset(OpARMMOVBstore) 5147 v.AuxInt = int32ToAuxInt(c) 5148 v.AddArg3(ptr, val, mem) 5149 return true 5150 } 5151 // match: (MOVBstoreidx (MOVWconst [c]) ptr val mem) 5152 // result: (MOVBstore [c] ptr val mem) 5153 for { 5154 if v_0.Op != OpARMMOVWconst { 5155 break 5156 } 5157 c := auxIntToInt32(v_0.AuxInt) 5158 ptr := v_1 5159 val := v_2 5160 mem := v_3 5161 v.reset(OpARMMOVBstore) 5162 v.AuxInt = int32ToAuxInt(c) 5163 v.AddArg3(ptr, val, mem) 5164 return true 5165 } 5166 return false 5167 } 5168 func rewriteValueARM_OpARMMOVDload(v *Value) bool { 5169 v_1 := v.Args[1] 5170 v_0 := v.Args[0] 5171 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 5172 // result: (MOVDload [off1+off2] {sym} ptr mem) 5173 for { 5174 off1 := auxIntToInt32(v.AuxInt) 5175 sym := auxToSym(v.Aux) 5176 if v_0.Op != OpARMADDconst { 5177 break 5178 } 5179 off2 := auxIntToInt32(v_0.AuxInt) 5180 ptr := v_0.Args[0] 5181 mem := v_1 5182 v.reset(OpARMMOVDload) 5183 v.AuxInt = int32ToAuxInt(off1 + off2) 5184 v.Aux = symToAux(sym) 5185 v.AddArg2(ptr, mem) 5186 return true 5187 } 5188 // match: (MOVDload [off1] {sym} (SUBconst [off2] ptr) mem) 5189 // result: (MOVDload [off1-off2] {sym} ptr mem) 5190 for { 5191 off1 := auxIntToInt32(v.AuxInt) 5192 sym := auxToSym(v.Aux) 5193 if v_0.Op != OpARMSUBconst { 5194 break 5195 } 5196 off2 := auxIntToInt32(v_0.AuxInt) 5197 ptr := v_0.Args[0] 5198 mem := v_1 5199 v.reset(OpARMMOVDload) 5200 v.AuxInt = int32ToAuxInt(off1 - off2) 5201 v.Aux = symToAux(sym) 5202 v.AddArg2(ptr, mem) 5203 return true 5204 } 5205 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5206 // cond: canMergeSym(sym1,sym2) 5207 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5208 for { 5209 off1 := auxIntToInt32(v.AuxInt) 5210 sym1 := auxToSym(v.Aux) 5211 if v_0.Op != OpARMMOVWaddr { 5212 break 5213 } 5214 off2 := auxIntToInt32(v_0.AuxInt) 5215 sym2 := auxToSym(v_0.Aux) 5216 ptr := v_0.Args[0] 5217 mem := v_1 5218 if !(canMergeSym(sym1, sym2)) { 5219 break 5220 } 5221 v.reset(OpARMMOVDload) 5222 v.AuxInt = int32ToAuxInt(off1 + off2) 5223 v.Aux = symToAux(mergeSym(sym1, sym2)) 5224 v.AddArg2(ptr, mem) 5225 return true 5226 } 5227 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 5228 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5229 // result: x 5230 for { 5231 off := auxIntToInt32(v.AuxInt) 5232 sym := auxToSym(v.Aux) 5233 ptr := v_0 5234 if v_1.Op != OpARMMOVDstore { 5235 break 5236 } 5237 off2 := auxIntToInt32(v_1.AuxInt) 5238 sym2 := auxToSym(v_1.Aux) 5239 x := v_1.Args[1] 5240 ptr2 := v_1.Args[0] 5241 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5242 break 5243 } 5244 v.copyOf(x) 5245 return true 5246 } 5247 return false 5248 } 5249 func rewriteValueARM_OpARMMOVDstore(v *Value) bool { 5250 v_2 := v.Args[2] 5251 v_1 := v.Args[1] 5252 v_0 := v.Args[0] 5253 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5254 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 5255 for { 5256 off1 := auxIntToInt32(v.AuxInt) 5257 sym := auxToSym(v.Aux) 5258 if v_0.Op != OpARMADDconst { 5259 break 5260 } 5261 off2 := auxIntToInt32(v_0.AuxInt) 5262 ptr := v_0.Args[0] 5263 val := v_1 5264 mem := v_2 5265 v.reset(OpARMMOVDstore) 5266 v.AuxInt = int32ToAuxInt(off1 + off2) 5267 v.Aux = symToAux(sym) 5268 v.AddArg3(ptr, val, mem) 5269 return true 5270 } 5271 // match: (MOVDstore [off1] {sym} (SUBconst [off2] ptr) val mem) 5272 // result: (MOVDstore [off1-off2] {sym} ptr val mem) 5273 for { 5274 off1 := auxIntToInt32(v.AuxInt) 5275 sym := auxToSym(v.Aux) 5276 if v_0.Op != OpARMSUBconst { 5277 break 5278 } 5279 off2 := auxIntToInt32(v_0.AuxInt) 5280 ptr := v_0.Args[0] 5281 val := v_1 5282 mem := v_2 5283 v.reset(OpARMMOVDstore) 5284 v.AuxInt = int32ToAuxInt(off1 - off2) 5285 v.Aux = symToAux(sym) 5286 v.AddArg3(ptr, val, mem) 5287 return true 5288 } 5289 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5290 // cond: canMergeSym(sym1,sym2) 5291 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5292 for { 5293 off1 := auxIntToInt32(v.AuxInt) 5294 sym1 := auxToSym(v.Aux) 5295 if v_0.Op != OpARMMOVWaddr { 5296 break 5297 } 5298 off2 := auxIntToInt32(v_0.AuxInt) 5299 sym2 := auxToSym(v_0.Aux) 5300 ptr := v_0.Args[0] 5301 val := v_1 5302 mem := v_2 5303 if !(canMergeSym(sym1, sym2)) { 5304 break 5305 } 5306 v.reset(OpARMMOVDstore) 5307 v.AuxInt = int32ToAuxInt(off1 + off2) 5308 v.Aux = symToAux(mergeSym(sym1, sym2)) 5309 v.AddArg3(ptr, val, mem) 5310 return true 5311 } 5312 return false 5313 } 5314 func rewriteValueARM_OpARMMOVFload(v *Value) bool { 5315 v_1 := v.Args[1] 5316 v_0 := v.Args[0] 5317 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 5318 // result: (MOVFload [off1+off2] {sym} ptr mem) 5319 for { 5320 off1 := auxIntToInt32(v.AuxInt) 5321 sym := auxToSym(v.Aux) 5322 if v_0.Op != OpARMADDconst { 5323 break 5324 } 5325 off2 := auxIntToInt32(v_0.AuxInt) 5326 ptr := v_0.Args[0] 5327 mem := v_1 5328 v.reset(OpARMMOVFload) 5329 v.AuxInt = int32ToAuxInt(off1 + off2) 5330 v.Aux = symToAux(sym) 5331 v.AddArg2(ptr, mem) 5332 return true 5333 } 5334 // match: (MOVFload [off1] {sym} (SUBconst [off2] ptr) mem) 5335 // result: (MOVFload [off1-off2] {sym} ptr mem) 5336 for { 5337 off1 := auxIntToInt32(v.AuxInt) 5338 sym := auxToSym(v.Aux) 5339 if v_0.Op != OpARMSUBconst { 5340 break 5341 } 5342 off2 := auxIntToInt32(v_0.AuxInt) 5343 ptr := v_0.Args[0] 5344 mem := v_1 5345 v.reset(OpARMMOVFload) 5346 v.AuxInt = int32ToAuxInt(off1 - off2) 5347 v.Aux = symToAux(sym) 5348 v.AddArg2(ptr, mem) 5349 return true 5350 } 5351 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5352 // cond: canMergeSym(sym1,sym2) 5353 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5354 for { 5355 off1 := auxIntToInt32(v.AuxInt) 5356 sym1 := auxToSym(v.Aux) 5357 if v_0.Op != OpARMMOVWaddr { 5358 break 5359 } 5360 off2 := auxIntToInt32(v_0.AuxInt) 5361 sym2 := auxToSym(v_0.Aux) 5362 ptr := v_0.Args[0] 5363 mem := v_1 5364 if !(canMergeSym(sym1, sym2)) { 5365 break 5366 } 5367 v.reset(OpARMMOVFload) 5368 v.AuxInt = int32ToAuxInt(off1 + off2) 5369 v.Aux = symToAux(mergeSym(sym1, sym2)) 5370 v.AddArg2(ptr, mem) 5371 return true 5372 } 5373 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 5374 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5375 // result: x 5376 for { 5377 off := auxIntToInt32(v.AuxInt) 5378 sym := auxToSym(v.Aux) 5379 ptr := v_0 5380 if v_1.Op != OpARMMOVFstore { 5381 break 5382 } 5383 off2 := auxIntToInt32(v_1.AuxInt) 5384 sym2 := auxToSym(v_1.Aux) 5385 x := v_1.Args[1] 5386 ptr2 := v_1.Args[0] 5387 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5388 break 5389 } 5390 v.copyOf(x) 5391 return true 5392 } 5393 return false 5394 } 5395 func rewriteValueARM_OpARMMOVFstore(v *Value) bool { 5396 v_2 := v.Args[2] 5397 v_1 := v.Args[1] 5398 v_0 := v.Args[0] 5399 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5400 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 5401 for { 5402 off1 := auxIntToInt32(v.AuxInt) 5403 sym := auxToSym(v.Aux) 5404 if v_0.Op != OpARMADDconst { 5405 break 5406 } 5407 off2 := auxIntToInt32(v_0.AuxInt) 5408 ptr := v_0.Args[0] 5409 val := v_1 5410 mem := v_2 5411 v.reset(OpARMMOVFstore) 5412 v.AuxInt = int32ToAuxInt(off1 + off2) 5413 v.Aux = symToAux(sym) 5414 v.AddArg3(ptr, val, mem) 5415 return true 5416 } 5417 // match: (MOVFstore [off1] {sym} (SUBconst [off2] ptr) val mem) 5418 // result: (MOVFstore [off1-off2] {sym} ptr val mem) 5419 for { 5420 off1 := auxIntToInt32(v.AuxInt) 5421 sym := auxToSym(v.Aux) 5422 if v_0.Op != OpARMSUBconst { 5423 break 5424 } 5425 off2 := auxIntToInt32(v_0.AuxInt) 5426 ptr := v_0.Args[0] 5427 val := v_1 5428 mem := v_2 5429 v.reset(OpARMMOVFstore) 5430 v.AuxInt = int32ToAuxInt(off1 - off2) 5431 v.Aux = symToAux(sym) 5432 v.AddArg3(ptr, val, mem) 5433 return true 5434 } 5435 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5436 // cond: canMergeSym(sym1,sym2) 5437 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5438 for { 5439 off1 := auxIntToInt32(v.AuxInt) 5440 sym1 := auxToSym(v.Aux) 5441 if v_0.Op != OpARMMOVWaddr { 5442 break 5443 } 5444 off2 := auxIntToInt32(v_0.AuxInt) 5445 sym2 := auxToSym(v_0.Aux) 5446 ptr := v_0.Args[0] 5447 val := v_1 5448 mem := v_2 5449 if !(canMergeSym(sym1, sym2)) { 5450 break 5451 } 5452 v.reset(OpARMMOVFstore) 5453 v.AuxInt = int32ToAuxInt(off1 + off2) 5454 v.Aux = symToAux(mergeSym(sym1, sym2)) 5455 v.AddArg3(ptr, val, mem) 5456 return true 5457 } 5458 return false 5459 } 5460 func rewriteValueARM_OpARMMOVHUload(v *Value) bool { 5461 v_1 := v.Args[1] 5462 v_0 := v.Args[0] 5463 b := v.Block 5464 config := b.Func.Config 5465 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 5466 // result: (MOVHUload [off1+off2] {sym} ptr mem) 5467 for { 5468 off1 := auxIntToInt32(v.AuxInt) 5469 sym := auxToSym(v.Aux) 5470 if v_0.Op != OpARMADDconst { 5471 break 5472 } 5473 off2 := auxIntToInt32(v_0.AuxInt) 5474 ptr := v_0.Args[0] 5475 mem := v_1 5476 v.reset(OpARMMOVHUload) 5477 v.AuxInt = int32ToAuxInt(off1 + off2) 5478 v.Aux = symToAux(sym) 5479 v.AddArg2(ptr, mem) 5480 return true 5481 } 5482 // match: (MOVHUload [off1] {sym} (SUBconst [off2] ptr) mem) 5483 // result: (MOVHUload [off1-off2] {sym} ptr mem) 5484 for { 5485 off1 := auxIntToInt32(v.AuxInt) 5486 sym := auxToSym(v.Aux) 5487 if v_0.Op != OpARMSUBconst { 5488 break 5489 } 5490 off2 := auxIntToInt32(v_0.AuxInt) 5491 ptr := v_0.Args[0] 5492 mem := v_1 5493 v.reset(OpARMMOVHUload) 5494 v.AuxInt = int32ToAuxInt(off1 - off2) 5495 v.Aux = symToAux(sym) 5496 v.AddArg2(ptr, mem) 5497 return true 5498 } 5499 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5500 // cond: canMergeSym(sym1,sym2) 5501 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5502 for { 5503 off1 := auxIntToInt32(v.AuxInt) 5504 sym1 := auxToSym(v.Aux) 5505 if v_0.Op != OpARMMOVWaddr { 5506 break 5507 } 5508 off2 := auxIntToInt32(v_0.AuxInt) 5509 sym2 := auxToSym(v_0.Aux) 5510 ptr := v_0.Args[0] 5511 mem := v_1 5512 if !(canMergeSym(sym1, sym2)) { 5513 break 5514 } 5515 v.reset(OpARMMOVHUload) 5516 v.AuxInt = int32ToAuxInt(off1 + off2) 5517 v.Aux = symToAux(mergeSym(sym1, sym2)) 5518 v.AddArg2(ptr, mem) 5519 return true 5520 } 5521 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5522 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5523 // result: (MOVHUreg x) 5524 for { 5525 off := auxIntToInt32(v.AuxInt) 5526 sym := auxToSym(v.Aux) 5527 ptr := v_0 5528 if v_1.Op != OpARMMOVHstore { 5529 break 5530 } 5531 off2 := auxIntToInt32(v_1.AuxInt) 5532 sym2 := auxToSym(v_1.Aux) 5533 x := v_1.Args[1] 5534 ptr2 := v_1.Args[0] 5535 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5536 break 5537 } 5538 v.reset(OpARMMOVHUreg) 5539 v.AddArg(x) 5540 return true 5541 } 5542 // match: (MOVHUload [0] {sym} (ADD ptr idx) mem) 5543 // cond: sym == nil 5544 // result: (MOVHUloadidx ptr idx mem) 5545 for { 5546 if auxIntToInt32(v.AuxInt) != 0 { 5547 break 5548 } 5549 sym := auxToSym(v.Aux) 5550 if v_0.Op != OpARMADD { 5551 break 5552 } 5553 idx := v_0.Args[1] 5554 ptr := v_0.Args[0] 5555 mem := v_1 5556 if !(sym == nil) { 5557 break 5558 } 5559 v.reset(OpARMMOVHUloadidx) 5560 v.AddArg3(ptr, idx, mem) 5561 return true 5562 } 5563 // match: (MOVHUload [off] {sym} (SB) _) 5564 // cond: symIsRO(sym) 5565 // result: (MOVWconst [int32(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))]) 5566 for { 5567 off := auxIntToInt32(v.AuxInt) 5568 sym := auxToSym(v.Aux) 5569 if v_0.Op != OpSB || !(symIsRO(sym)) { 5570 break 5571 } 5572 v.reset(OpARMMOVWconst) 5573 v.AuxInt = int32ToAuxInt(int32(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))) 5574 return true 5575 } 5576 return false 5577 } 5578 func rewriteValueARM_OpARMMOVHUloadidx(v *Value) bool { 5579 v_2 := v.Args[2] 5580 v_1 := v.Args[1] 5581 v_0 := v.Args[0] 5582 // match: (MOVHUloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 5583 // cond: isSamePtr(ptr, ptr2) 5584 // result: (MOVHUreg x) 5585 for { 5586 ptr := v_0 5587 idx := v_1 5588 if v_2.Op != OpARMMOVHstoreidx { 5589 break 5590 } 5591 x := v_2.Args[2] 5592 ptr2 := v_2.Args[0] 5593 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 5594 break 5595 } 5596 v.reset(OpARMMOVHUreg) 5597 v.AddArg(x) 5598 return true 5599 } 5600 // match: (MOVHUloadidx ptr (MOVWconst [c]) mem) 5601 // result: (MOVHUload [c] ptr mem) 5602 for { 5603 ptr := v_0 5604 if v_1.Op != OpARMMOVWconst { 5605 break 5606 } 5607 c := auxIntToInt32(v_1.AuxInt) 5608 mem := v_2 5609 v.reset(OpARMMOVHUload) 5610 v.AuxInt = int32ToAuxInt(c) 5611 v.AddArg2(ptr, mem) 5612 return true 5613 } 5614 // match: (MOVHUloadidx (MOVWconst [c]) ptr mem) 5615 // result: (MOVHUload [c] ptr mem) 5616 for { 5617 if v_0.Op != OpARMMOVWconst { 5618 break 5619 } 5620 c := auxIntToInt32(v_0.AuxInt) 5621 ptr := v_1 5622 mem := v_2 5623 v.reset(OpARMMOVHUload) 5624 v.AuxInt = int32ToAuxInt(c) 5625 v.AddArg2(ptr, mem) 5626 return true 5627 } 5628 return false 5629 } 5630 func rewriteValueARM_OpARMMOVHUreg(v *Value) bool { 5631 v_0 := v.Args[0] 5632 // match: (MOVHUreg x:(MOVBUload _ _)) 5633 // result: (MOVWreg x) 5634 for { 5635 x := v_0 5636 if x.Op != OpARMMOVBUload { 5637 break 5638 } 5639 v.reset(OpARMMOVWreg) 5640 v.AddArg(x) 5641 return true 5642 } 5643 // match: (MOVHUreg x:(MOVHUload _ _)) 5644 // result: (MOVWreg x) 5645 for { 5646 x := v_0 5647 if x.Op != OpARMMOVHUload { 5648 break 5649 } 5650 v.reset(OpARMMOVWreg) 5651 v.AddArg(x) 5652 return true 5653 } 5654 // match: (MOVHUreg (ANDconst [c] x)) 5655 // result: (ANDconst [c&0xffff] x) 5656 for { 5657 if v_0.Op != OpARMANDconst { 5658 break 5659 } 5660 c := auxIntToInt32(v_0.AuxInt) 5661 x := v_0.Args[0] 5662 v.reset(OpARMANDconst) 5663 v.AuxInt = int32ToAuxInt(c & 0xffff) 5664 v.AddArg(x) 5665 return true 5666 } 5667 // match: (MOVHUreg x:(MOVBUreg _)) 5668 // result: (MOVWreg x) 5669 for { 5670 x := v_0 5671 if x.Op != OpARMMOVBUreg { 5672 break 5673 } 5674 v.reset(OpARMMOVWreg) 5675 v.AddArg(x) 5676 return true 5677 } 5678 // match: (MOVHUreg x:(MOVHUreg _)) 5679 // result: (MOVWreg x) 5680 for { 5681 x := v_0 5682 if x.Op != OpARMMOVHUreg { 5683 break 5684 } 5685 v.reset(OpARMMOVWreg) 5686 v.AddArg(x) 5687 return true 5688 } 5689 // match: (MOVHUreg (MOVWconst [c])) 5690 // result: (MOVWconst [int32(uint16(c))]) 5691 for { 5692 if v_0.Op != OpARMMOVWconst { 5693 break 5694 } 5695 c := auxIntToInt32(v_0.AuxInt) 5696 v.reset(OpARMMOVWconst) 5697 v.AuxInt = int32ToAuxInt(int32(uint16(c))) 5698 return true 5699 } 5700 return false 5701 } 5702 func rewriteValueARM_OpARMMOVHload(v *Value) bool { 5703 v_1 := v.Args[1] 5704 v_0 := v.Args[0] 5705 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 5706 // result: (MOVHload [off1+off2] {sym} ptr mem) 5707 for { 5708 off1 := auxIntToInt32(v.AuxInt) 5709 sym := auxToSym(v.Aux) 5710 if v_0.Op != OpARMADDconst { 5711 break 5712 } 5713 off2 := auxIntToInt32(v_0.AuxInt) 5714 ptr := v_0.Args[0] 5715 mem := v_1 5716 v.reset(OpARMMOVHload) 5717 v.AuxInt = int32ToAuxInt(off1 + off2) 5718 v.Aux = symToAux(sym) 5719 v.AddArg2(ptr, mem) 5720 return true 5721 } 5722 // match: (MOVHload [off1] {sym} (SUBconst [off2] ptr) mem) 5723 // result: (MOVHload [off1-off2] {sym} ptr mem) 5724 for { 5725 off1 := auxIntToInt32(v.AuxInt) 5726 sym := auxToSym(v.Aux) 5727 if v_0.Op != OpARMSUBconst { 5728 break 5729 } 5730 off2 := auxIntToInt32(v_0.AuxInt) 5731 ptr := v_0.Args[0] 5732 mem := v_1 5733 v.reset(OpARMMOVHload) 5734 v.AuxInt = int32ToAuxInt(off1 - off2) 5735 v.Aux = symToAux(sym) 5736 v.AddArg2(ptr, mem) 5737 return true 5738 } 5739 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5740 // cond: canMergeSym(sym1,sym2) 5741 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5742 for { 5743 off1 := auxIntToInt32(v.AuxInt) 5744 sym1 := auxToSym(v.Aux) 5745 if v_0.Op != OpARMMOVWaddr { 5746 break 5747 } 5748 off2 := auxIntToInt32(v_0.AuxInt) 5749 sym2 := auxToSym(v_0.Aux) 5750 ptr := v_0.Args[0] 5751 mem := v_1 5752 if !(canMergeSym(sym1, sym2)) { 5753 break 5754 } 5755 v.reset(OpARMMOVHload) 5756 v.AuxInt = int32ToAuxInt(off1 + off2) 5757 v.Aux = symToAux(mergeSym(sym1, sym2)) 5758 v.AddArg2(ptr, mem) 5759 return true 5760 } 5761 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5762 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5763 // result: (MOVHreg x) 5764 for { 5765 off := auxIntToInt32(v.AuxInt) 5766 sym := auxToSym(v.Aux) 5767 ptr := v_0 5768 if v_1.Op != OpARMMOVHstore { 5769 break 5770 } 5771 off2 := auxIntToInt32(v_1.AuxInt) 5772 sym2 := auxToSym(v_1.Aux) 5773 x := v_1.Args[1] 5774 ptr2 := v_1.Args[0] 5775 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5776 break 5777 } 5778 v.reset(OpARMMOVHreg) 5779 v.AddArg(x) 5780 return true 5781 } 5782 // match: (MOVHload [0] {sym} (ADD ptr idx) mem) 5783 // cond: sym == nil 5784 // result: (MOVHloadidx ptr idx mem) 5785 for { 5786 if auxIntToInt32(v.AuxInt) != 0 { 5787 break 5788 } 5789 sym := auxToSym(v.Aux) 5790 if v_0.Op != OpARMADD { 5791 break 5792 } 5793 idx := v_0.Args[1] 5794 ptr := v_0.Args[0] 5795 mem := v_1 5796 if !(sym == nil) { 5797 break 5798 } 5799 v.reset(OpARMMOVHloadidx) 5800 v.AddArg3(ptr, idx, mem) 5801 return true 5802 } 5803 return false 5804 } 5805 func rewriteValueARM_OpARMMOVHloadidx(v *Value) bool { 5806 v_2 := v.Args[2] 5807 v_1 := v.Args[1] 5808 v_0 := v.Args[0] 5809 // match: (MOVHloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 5810 // cond: isSamePtr(ptr, ptr2) 5811 // result: (MOVHreg x) 5812 for { 5813 ptr := v_0 5814 idx := v_1 5815 if v_2.Op != OpARMMOVHstoreidx { 5816 break 5817 } 5818 x := v_2.Args[2] 5819 ptr2 := v_2.Args[0] 5820 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 5821 break 5822 } 5823 v.reset(OpARMMOVHreg) 5824 v.AddArg(x) 5825 return true 5826 } 5827 // match: (MOVHloadidx ptr (MOVWconst [c]) mem) 5828 // result: (MOVHload [c] ptr mem) 5829 for { 5830 ptr := v_0 5831 if v_1.Op != OpARMMOVWconst { 5832 break 5833 } 5834 c := auxIntToInt32(v_1.AuxInt) 5835 mem := v_2 5836 v.reset(OpARMMOVHload) 5837 v.AuxInt = int32ToAuxInt(c) 5838 v.AddArg2(ptr, mem) 5839 return true 5840 } 5841 // match: (MOVHloadidx (MOVWconst [c]) ptr mem) 5842 // result: (MOVHload [c] ptr mem) 5843 for { 5844 if v_0.Op != OpARMMOVWconst { 5845 break 5846 } 5847 c := auxIntToInt32(v_0.AuxInt) 5848 ptr := v_1 5849 mem := v_2 5850 v.reset(OpARMMOVHload) 5851 v.AuxInt = int32ToAuxInt(c) 5852 v.AddArg2(ptr, mem) 5853 return true 5854 } 5855 return false 5856 } 5857 func rewriteValueARM_OpARMMOVHreg(v *Value) bool { 5858 v_0 := v.Args[0] 5859 // match: (MOVHreg x:(MOVBload _ _)) 5860 // result: (MOVWreg x) 5861 for { 5862 x := v_0 5863 if x.Op != OpARMMOVBload { 5864 break 5865 } 5866 v.reset(OpARMMOVWreg) 5867 v.AddArg(x) 5868 return true 5869 } 5870 // match: (MOVHreg x:(MOVBUload _ _)) 5871 // result: (MOVWreg x) 5872 for { 5873 x := v_0 5874 if x.Op != OpARMMOVBUload { 5875 break 5876 } 5877 v.reset(OpARMMOVWreg) 5878 v.AddArg(x) 5879 return true 5880 } 5881 // match: (MOVHreg x:(MOVHload _ _)) 5882 // result: (MOVWreg x) 5883 for { 5884 x := v_0 5885 if x.Op != OpARMMOVHload { 5886 break 5887 } 5888 v.reset(OpARMMOVWreg) 5889 v.AddArg(x) 5890 return true 5891 } 5892 // match: (MOVHreg (ANDconst [c] x)) 5893 // cond: c & 0x8000 == 0 5894 // result: (ANDconst [c&0x7fff] x) 5895 for { 5896 if v_0.Op != OpARMANDconst { 5897 break 5898 } 5899 c := auxIntToInt32(v_0.AuxInt) 5900 x := v_0.Args[0] 5901 if !(c&0x8000 == 0) { 5902 break 5903 } 5904 v.reset(OpARMANDconst) 5905 v.AuxInt = int32ToAuxInt(c & 0x7fff) 5906 v.AddArg(x) 5907 return true 5908 } 5909 // match: (MOVHreg x:(MOVBreg _)) 5910 // result: (MOVWreg x) 5911 for { 5912 x := v_0 5913 if x.Op != OpARMMOVBreg { 5914 break 5915 } 5916 v.reset(OpARMMOVWreg) 5917 v.AddArg(x) 5918 return true 5919 } 5920 // match: (MOVHreg x:(MOVBUreg _)) 5921 // result: (MOVWreg x) 5922 for { 5923 x := v_0 5924 if x.Op != OpARMMOVBUreg { 5925 break 5926 } 5927 v.reset(OpARMMOVWreg) 5928 v.AddArg(x) 5929 return true 5930 } 5931 // match: (MOVHreg x:(MOVHreg _)) 5932 // result: (MOVWreg x) 5933 for { 5934 x := v_0 5935 if x.Op != OpARMMOVHreg { 5936 break 5937 } 5938 v.reset(OpARMMOVWreg) 5939 v.AddArg(x) 5940 return true 5941 } 5942 // match: (MOVHreg (MOVWconst [c])) 5943 // result: (MOVWconst [int32(int16(c))]) 5944 for { 5945 if v_0.Op != OpARMMOVWconst { 5946 break 5947 } 5948 c := auxIntToInt32(v_0.AuxInt) 5949 v.reset(OpARMMOVWconst) 5950 v.AuxInt = int32ToAuxInt(int32(int16(c))) 5951 return true 5952 } 5953 return false 5954 } 5955 func rewriteValueARM_OpARMMOVHstore(v *Value) bool { 5956 v_2 := v.Args[2] 5957 v_1 := v.Args[1] 5958 v_0 := v.Args[0] 5959 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5960 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 5961 for { 5962 off1 := auxIntToInt32(v.AuxInt) 5963 sym := auxToSym(v.Aux) 5964 if v_0.Op != OpARMADDconst { 5965 break 5966 } 5967 off2 := auxIntToInt32(v_0.AuxInt) 5968 ptr := v_0.Args[0] 5969 val := v_1 5970 mem := v_2 5971 v.reset(OpARMMOVHstore) 5972 v.AuxInt = int32ToAuxInt(off1 + off2) 5973 v.Aux = symToAux(sym) 5974 v.AddArg3(ptr, val, mem) 5975 return true 5976 } 5977 // match: (MOVHstore [off1] {sym} (SUBconst [off2] ptr) val mem) 5978 // result: (MOVHstore [off1-off2] {sym} ptr val mem) 5979 for { 5980 off1 := auxIntToInt32(v.AuxInt) 5981 sym := auxToSym(v.Aux) 5982 if v_0.Op != OpARMSUBconst { 5983 break 5984 } 5985 off2 := auxIntToInt32(v_0.AuxInt) 5986 ptr := v_0.Args[0] 5987 val := v_1 5988 mem := v_2 5989 v.reset(OpARMMOVHstore) 5990 v.AuxInt = int32ToAuxInt(off1 - off2) 5991 v.Aux = symToAux(sym) 5992 v.AddArg3(ptr, val, mem) 5993 return true 5994 } 5995 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5996 // cond: canMergeSym(sym1,sym2) 5997 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5998 for { 5999 off1 := auxIntToInt32(v.AuxInt) 6000 sym1 := auxToSym(v.Aux) 6001 if v_0.Op != OpARMMOVWaddr { 6002 break 6003 } 6004 off2 := auxIntToInt32(v_0.AuxInt) 6005 sym2 := auxToSym(v_0.Aux) 6006 ptr := v_0.Args[0] 6007 val := v_1 6008 mem := v_2 6009 if !(canMergeSym(sym1, sym2)) { 6010 break 6011 } 6012 v.reset(OpARMMOVHstore) 6013 v.AuxInt = int32ToAuxInt(off1 + off2) 6014 v.Aux = symToAux(mergeSym(sym1, sym2)) 6015 v.AddArg3(ptr, val, mem) 6016 return true 6017 } 6018 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 6019 // result: (MOVHstore [off] {sym} ptr x mem) 6020 for { 6021 off := auxIntToInt32(v.AuxInt) 6022 sym := auxToSym(v.Aux) 6023 ptr := v_0 6024 if v_1.Op != OpARMMOVHreg { 6025 break 6026 } 6027 x := v_1.Args[0] 6028 mem := v_2 6029 v.reset(OpARMMOVHstore) 6030 v.AuxInt = int32ToAuxInt(off) 6031 v.Aux = symToAux(sym) 6032 v.AddArg3(ptr, x, mem) 6033 return true 6034 } 6035 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 6036 // result: (MOVHstore [off] {sym} ptr x mem) 6037 for { 6038 off := auxIntToInt32(v.AuxInt) 6039 sym := auxToSym(v.Aux) 6040 ptr := v_0 6041 if v_1.Op != OpARMMOVHUreg { 6042 break 6043 } 6044 x := v_1.Args[0] 6045 mem := v_2 6046 v.reset(OpARMMOVHstore) 6047 v.AuxInt = int32ToAuxInt(off) 6048 v.Aux = symToAux(sym) 6049 v.AddArg3(ptr, x, mem) 6050 return true 6051 } 6052 // match: (MOVHstore [0] {sym} (ADD ptr idx) val mem) 6053 // cond: sym == nil 6054 // result: (MOVHstoreidx ptr idx val mem) 6055 for { 6056 if auxIntToInt32(v.AuxInt) != 0 { 6057 break 6058 } 6059 sym := auxToSym(v.Aux) 6060 if v_0.Op != OpARMADD { 6061 break 6062 } 6063 idx := v_0.Args[1] 6064 ptr := v_0.Args[0] 6065 val := v_1 6066 mem := v_2 6067 if !(sym == nil) { 6068 break 6069 } 6070 v.reset(OpARMMOVHstoreidx) 6071 v.AddArg4(ptr, idx, val, mem) 6072 return true 6073 } 6074 return false 6075 } 6076 func rewriteValueARM_OpARMMOVHstoreidx(v *Value) bool { 6077 v_3 := v.Args[3] 6078 v_2 := v.Args[2] 6079 v_1 := v.Args[1] 6080 v_0 := v.Args[0] 6081 // match: (MOVHstoreidx ptr (MOVWconst [c]) val mem) 6082 // result: (MOVHstore [c] ptr val mem) 6083 for { 6084 ptr := v_0 6085 if v_1.Op != OpARMMOVWconst { 6086 break 6087 } 6088 c := auxIntToInt32(v_1.AuxInt) 6089 val := v_2 6090 mem := v_3 6091 v.reset(OpARMMOVHstore) 6092 v.AuxInt = int32ToAuxInt(c) 6093 v.AddArg3(ptr, val, mem) 6094 return true 6095 } 6096 // match: (MOVHstoreidx (MOVWconst [c]) ptr val mem) 6097 // result: (MOVHstore [c] ptr val mem) 6098 for { 6099 if v_0.Op != OpARMMOVWconst { 6100 break 6101 } 6102 c := auxIntToInt32(v_0.AuxInt) 6103 ptr := v_1 6104 val := v_2 6105 mem := v_3 6106 v.reset(OpARMMOVHstore) 6107 v.AuxInt = int32ToAuxInt(c) 6108 v.AddArg3(ptr, val, mem) 6109 return true 6110 } 6111 return false 6112 } 6113 func rewriteValueARM_OpARMMOVWload(v *Value) bool { 6114 v_1 := v.Args[1] 6115 v_0 := v.Args[0] 6116 b := v.Block 6117 config := b.Func.Config 6118 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 6119 // result: (MOVWload [off1+off2] {sym} ptr mem) 6120 for { 6121 off1 := auxIntToInt32(v.AuxInt) 6122 sym := auxToSym(v.Aux) 6123 if v_0.Op != OpARMADDconst { 6124 break 6125 } 6126 off2 := auxIntToInt32(v_0.AuxInt) 6127 ptr := v_0.Args[0] 6128 mem := v_1 6129 v.reset(OpARMMOVWload) 6130 v.AuxInt = int32ToAuxInt(off1 + off2) 6131 v.Aux = symToAux(sym) 6132 v.AddArg2(ptr, mem) 6133 return true 6134 } 6135 // match: (MOVWload [off1] {sym} (SUBconst [off2] ptr) mem) 6136 // result: (MOVWload [off1-off2] {sym} ptr mem) 6137 for { 6138 off1 := auxIntToInt32(v.AuxInt) 6139 sym := auxToSym(v.Aux) 6140 if v_0.Op != OpARMSUBconst { 6141 break 6142 } 6143 off2 := auxIntToInt32(v_0.AuxInt) 6144 ptr := v_0.Args[0] 6145 mem := v_1 6146 v.reset(OpARMMOVWload) 6147 v.AuxInt = int32ToAuxInt(off1 - off2) 6148 v.Aux = symToAux(sym) 6149 v.AddArg2(ptr, mem) 6150 return true 6151 } 6152 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6153 // cond: canMergeSym(sym1,sym2) 6154 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6155 for { 6156 off1 := auxIntToInt32(v.AuxInt) 6157 sym1 := auxToSym(v.Aux) 6158 if v_0.Op != OpARMMOVWaddr { 6159 break 6160 } 6161 off2 := auxIntToInt32(v_0.AuxInt) 6162 sym2 := auxToSym(v_0.Aux) 6163 ptr := v_0.Args[0] 6164 mem := v_1 6165 if !(canMergeSym(sym1, sym2)) { 6166 break 6167 } 6168 v.reset(OpARMMOVWload) 6169 v.AuxInt = int32ToAuxInt(off1 + off2) 6170 v.Aux = symToAux(mergeSym(sym1, sym2)) 6171 v.AddArg2(ptr, mem) 6172 return true 6173 } 6174 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6175 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6176 // result: x 6177 for { 6178 off := auxIntToInt32(v.AuxInt) 6179 sym := auxToSym(v.Aux) 6180 ptr := v_0 6181 if v_1.Op != OpARMMOVWstore { 6182 break 6183 } 6184 off2 := auxIntToInt32(v_1.AuxInt) 6185 sym2 := auxToSym(v_1.Aux) 6186 x := v_1.Args[1] 6187 ptr2 := v_1.Args[0] 6188 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6189 break 6190 } 6191 v.copyOf(x) 6192 return true 6193 } 6194 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 6195 // cond: sym == nil 6196 // result: (MOVWloadidx ptr idx mem) 6197 for { 6198 if auxIntToInt32(v.AuxInt) != 0 { 6199 break 6200 } 6201 sym := auxToSym(v.Aux) 6202 if v_0.Op != OpARMADD { 6203 break 6204 } 6205 idx := v_0.Args[1] 6206 ptr := v_0.Args[0] 6207 mem := v_1 6208 if !(sym == nil) { 6209 break 6210 } 6211 v.reset(OpARMMOVWloadidx) 6212 v.AddArg3(ptr, idx, mem) 6213 return true 6214 } 6215 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 6216 // cond: sym == nil 6217 // result: (MOVWloadshiftLL ptr idx [c] mem) 6218 for { 6219 if auxIntToInt32(v.AuxInt) != 0 { 6220 break 6221 } 6222 sym := auxToSym(v.Aux) 6223 if v_0.Op != OpARMADDshiftLL { 6224 break 6225 } 6226 c := auxIntToInt32(v_0.AuxInt) 6227 idx := v_0.Args[1] 6228 ptr := v_0.Args[0] 6229 mem := v_1 6230 if !(sym == nil) { 6231 break 6232 } 6233 v.reset(OpARMMOVWloadshiftLL) 6234 v.AuxInt = int32ToAuxInt(c) 6235 v.AddArg3(ptr, idx, mem) 6236 return true 6237 } 6238 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 6239 // cond: sym == nil 6240 // result: (MOVWloadshiftRL ptr idx [c] mem) 6241 for { 6242 if auxIntToInt32(v.AuxInt) != 0 { 6243 break 6244 } 6245 sym := auxToSym(v.Aux) 6246 if v_0.Op != OpARMADDshiftRL { 6247 break 6248 } 6249 c := auxIntToInt32(v_0.AuxInt) 6250 idx := v_0.Args[1] 6251 ptr := v_0.Args[0] 6252 mem := v_1 6253 if !(sym == nil) { 6254 break 6255 } 6256 v.reset(OpARMMOVWloadshiftRL) 6257 v.AuxInt = int32ToAuxInt(c) 6258 v.AddArg3(ptr, idx, mem) 6259 return true 6260 } 6261 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 6262 // cond: sym == nil 6263 // result: (MOVWloadshiftRA ptr idx [c] mem) 6264 for { 6265 if auxIntToInt32(v.AuxInt) != 0 { 6266 break 6267 } 6268 sym := auxToSym(v.Aux) 6269 if v_0.Op != OpARMADDshiftRA { 6270 break 6271 } 6272 c := auxIntToInt32(v_0.AuxInt) 6273 idx := v_0.Args[1] 6274 ptr := v_0.Args[0] 6275 mem := v_1 6276 if !(sym == nil) { 6277 break 6278 } 6279 v.reset(OpARMMOVWloadshiftRA) 6280 v.AuxInt = int32ToAuxInt(c) 6281 v.AddArg3(ptr, idx, mem) 6282 return true 6283 } 6284 // match: (MOVWload [off] {sym} (SB) _) 6285 // cond: symIsRO(sym) 6286 // result: (MOVWconst [int32(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))]) 6287 for { 6288 off := auxIntToInt32(v.AuxInt) 6289 sym := auxToSym(v.Aux) 6290 if v_0.Op != OpSB || !(symIsRO(sym)) { 6291 break 6292 } 6293 v.reset(OpARMMOVWconst) 6294 v.AuxInt = int32ToAuxInt(int32(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))) 6295 return true 6296 } 6297 return false 6298 } 6299 func rewriteValueARM_OpARMMOVWloadidx(v *Value) bool { 6300 v_2 := v.Args[2] 6301 v_1 := v.Args[1] 6302 v_0 := v.Args[0] 6303 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 6304 // cond: isSamePtr(ptr, ptr2) 6305 // result: x 6306 for { 6307 ptr := v_0 6308 idx := v_1 6309 if v_2.Op != OpARMMOVWstoreidx { 6310 break 6311 } 6312 x := v_2.Args[2] 6313 ptr2 := v_2.Args[0] 6314 if idx != v_2.Args[1] || !(isSamePtr(ptr, ptr2)) { 6315 break 6316 } 6317 v.copyOf(x) 6318 return true 6319 } 6320 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 6321 // result: (MOVWload [c] ptr mem) 6322 for { 6323 ptr := v_0 6324 if v_1.Op != OpARMMOVWconst { 6325 break 6326 } 6327 c := auxIntToInt32(v_1.AuxInt) 6328 mem := v_2 6329 v.reset(OpARMMOVWload) 6330 v.AuxInt = int32ToAuxInt(c) 6331 v.AddArg2(ptr, mem) 6332 return true 6333 } 6334 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 6335 // result: (MOVWload [c] ptr mem) 6336 for { 6337 if v_0.Op != OpARMMOVWconst { 6338 break 6339 } 6340 c := auxIntToInt32(v_0.AuxInt) 6341 ptr := v_1 6342 mem := v_2 6343 v.reset(OpARMMOVWload) 6344 v.AuxInt = int32ToAuxInt(c) 6345 v.AddArg2(ptr, mem) 6346 return true 6347 } 6348 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 6349 // result: (MOVWloadshiftLL ptr idx [c] mem) 6350 for { 6351 ptr := v_0 6352 if v_1.Op != OpARMSLLconst { 6353 break 6354 } 6355 c := auxIntToInt32(v_1.AuxInt) 6356 idx := v_1.Args[0] 6357 mem := v_2 6358 v.reset(OpARMMOVWloadshiftLL) 6359 v.AuxInt = int32ToAuxInt(c) 6360 v.AddArg3(ptr, idx, mem) 6361 return true 6362 } 6363 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 6364 // result: (MOVWloadshiftLL ptr idx [c] mem) 6365 for { 6366 if v_0.Op != OpARMSLLconst { 6367 break 6368 } 6369 c := auxIntToInt32(v_0.AuxInt) 6370 idx := v_0.Args[0] 6371 ptr := v_1 6372 mem := v_2 6373 v.reset(OpARMMOVWloadshiftLL) 6374 v.AuxInt = int32ToAuxInt(c) 6375 v.AddArg3(ptr, idx, mem) 6376 return true 6377 } 6378 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 6379 // result: (MOVWloadshiftRL ptr idx [c] mem) 6380 for { 6381 ptr := v_0 6382 if v_1.Op != OpARMSRLconst { 6383 break 6384 } 6385 c := auxIntToInt32(v_1.AuxInt) 6386 idx := v_1.Args[0] 6387 mem := v_2 6388 v.reset(OpARMMOVWloadshiftRL) 6389 v.AuxInt = int32ToAuxInt(c) 6390 v.AddArg3(ptr, idx, mem) 6391 return true 6392 } 6393 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 6394 // result: (MOVWloadshiftRL ptr idx [c] mem) 6395 for { 6396 if v_0.Op != OpARMSRLconst { 6397 break 6398 } 6399 c := auxIntToInt32(v_0.AuxInt) 6400 idx := v_0.Args[0] 6401 ptr := v_1 6402 mem := v_2 6403 v.reset(OpARMMOVWloadshiftRL) 6404 v.AuxInt = int32ToAuxInt(c) 6405 v.AddArg3(ptr, idx, mem) 6406 return true 6407 } 6408 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 6409 // result: (MOVWloadshiftRA ptr idx [c] mem) 6410 for { 6411 ptr := v_0 6412 if v_1.Op != OpARMSRAconst { 6413 break 6414 } 6415 c := auxIntToInt32(v_1.AuxInt) 6416 idx := v_1.Args[0] 6417 mem := v_2 6418 v.reset(OpARMMOVWloadshiftRA) 6419 v.AuxInt = int32ToAuxInt(c) 6420 v.AddArg3(ptr, idx, mem) 6421 return true 6422 } 6423 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 6424 // result: (MOVWloadshiftRA ptr idx [c] mem) 6425 for { 6426 if v_0.Op != OpARMSRAconst { 6427 break 6428 } 6429 c := auxIntToInt32(v_0.AuxInt) 6430 idx := v_0.Args[0] 6431 ptr := v_1 6432 mem := v_2 6433 v.reset(OpARMMOVWloadshiftRA) 6434 v.AuxInt = int32ToAuxInt(c) 6435 v.AddArg3(ptr, idx, mem) 6436 return true 6437 } 6438 return false 6439 } 6440 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value) bool { 6441 v_2 := v.Args[2] 6442 v_1 := v.Args[1] 6443 v_0 := v.Args[0] 6444 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 6445 // cond: c==d && isSamePtr(ptr, ptr2) 6446 // result: x 6447 for { 6448 c := auxIntToInt32(v.AuxInt) 6449 ptr := v_0 6450 idx := v_1 6451 if v_2.Op != OpARMMOVWstoreshiftLL { 6452 break 6453 } 6454 d := auxIntToInt32(v_2.AuxInt) 6455 x := v_2.Args[2] 6456 ptr2 := v_2.Args[0] 6457 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) { 6458 break 6459 } 6460 v.copyOf(x) 6461 return true 6462 } 6463 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 6464 // result: (MOVWload [int32(uint32(c)<<uint64(d))] ptr mem) 6465 for { 6466 d := auxIntToInt32(v.AuxInt) 6467 ptr := v_0 6468 if v_1.Op != OpARMMOVWconst { 6469 break 6470 } 6471 c := auxIntToInt32(v_1.AuxInt) 6472 mem := v_2 6473 v.reset(OpARMMOVWload) 6474 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d))) 6475 v.AddArg2(ptr, mem) 6476 return true 6477 } 6478 return false 6479 } 6480 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value) bool { 6481 v_2 := v.Args[2] 6482 v_1 := v.Args[1] 6483 v_0 := v.Args[0] 6484 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 6485 // cond: c==d && isSamePtr(ptr, ptr2) 6486 // result: x 6487 for { 6488 c := auxIntToInt32(v.AuxInt) 6489 ptr := v_0 6490 idx := v_1 6491 if v_2.Op != OpARMMOVWstoreshiftRA { 6492 break 6493 } 6494 d := auxIntToInt32(v_2.AuxInt) 6495 x := v_2.Args[2] 6496 ptr2 := v_2.Args[0] 6497 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) { 6498 break 6499 } 6500 v.copyOf(x) 6501 return true 6502 } 6503 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 6504 // result: (MOVWload [c>>uint64(d)] ptr mem) 6505 for { 6506 d := auxIntToInt32(v.AuxInt) 6507 ptr := v_0 6508 if v_1.Op != OpARMMOVWconst { 6509 break 6510 } 6511 c := auxIntToInt32(v_1.AuxInt) 6512 mem := v_2 6513 v.reset(OpARMMOVWload) 6514 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 6515 v.AddArg2(ptr, mem) 6516 return true 6517 } 6518 return false 6519 } 6520 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value) bool { 6521 v_2 := v.Args[2] 6522 v_1 := v.Args[1] 6523 v_0 := v.Args[0] 6524 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 6525 // cond: c==d && isSamePtr(ptr, ptr2) 6526 // result: x 6527 for { 6528 c := auxIntToInt32(v.AuxInt) 6529 ptr := v_0 6530 idx := v_1 6531 if v_2.Op != OpARMMOVWstoreshiftRL { 6532 break 6533 } 6534 d := auxIntToInt32(v_2.AuxInt) 6535 x := v_2.Args[2] 6536 ptr2 := v_2.Args[0] 6537 if idx != v_2.Args[1] || !(c == d && isSamePtr(ptr, ptr2)) { 6538 break 6539 } 6540 v.copyOf(x) 6541 return true 6542 } 6543 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 6544 // result: (MOVWload [int32(uint32(c)>>uint64(d))] ptr mem) 6545 for { 6546 d := auxIntToInt32(v.AuxInt) 6547 ptr := v_0 6548 if v_1.Op != OpARMMOVWconst { 6549 break 6550 } 6551 c := auxIntToInt32(v_1.AuxInt) 6552 mem := v_2 6553 v.reset(OpARMMOVWload) 6554 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 6555 v.AddArg2(ptr, mem) 6556 return true 6557 } 6558 return false 6559 } 6560 func rewriteValueARM_OpARMMOVWnop(v *Value) bool { 6561 v_0 := v.Args[0] 6562 // match: (MOVWnop (MOVWconst [c])) 6563 // result: (MOVWconst [c]) 6564 for { 6565 if v_0.Op != OpARMMOVWconst { 6566 break 6567 } 6568 c := auxIntToInt32(v_0.AuxInt) 6569 v.reset(OpARMMOVWconst) 6570 v.AuxInt = int32ToAuxInt(c) 6571 return true 6572 } 6573 return false 6574 } 6575 func rewriteValueARM_OpARMMOVWreg(v *Value) bool { 6576 v_0 := v.Args[0] 6577 // match: (MOVWreg x) 6578 // cond: x.Uses == 1 6579 // result: (MOVWnop x) 6580 for { 6581 x := v_0 6582 if !(x.Uses == 1) { 6583 break 6584 } 6585 v.reset(OpARMMOVWnop) 6586 v.AddArg(x) 6587 return true 6588 } 6589 // match: (MOVWreg (MOVWconst [c])) 6590 // result: (MOVWconst [c]) 6591 for { 6592 if v_0.Op != OpARMMOVWconst { 6593 break 6594 } 6595 c := auxIntToInt32(v_0.AuxInt) 6596 v.reset(OpARMMOVWconst) 6597 v.AuxInt = int32ToAuxInt(c) 6598 return true 6599 } 6600 return false 6601 } 6602 func rewriteValueARM_OpARMMOVWstore(v *Value) bool { 6603 v_2 := v.Args[2] 6604 v_1 := v.Args[1] 6605 v_0 := v.Args[0] 6606 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6607 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6608 for { 6609 off1 := auxIntToInt32(v.AuxInt) 6610 sym := auxToSym(v.Aux) 6611 if v_0.Op != OpARMADDconst { 6612 break 6613 } 6614 off2 := auxIntToInt32(v_0.AuxInt) 6615 ptr := v_0.Args[0] 6616 val := v_1 6617 mem := v_2 6618 v.reset(OpARMMOVWstore) 6619 v.AuxInt = int32ToAuxInt(off1 + off2) 6620 v.Aux = symToAux(sym) 6621 v.AddArg3(ptr, val, mem) 6622 return true 6623 } 6624 // match: (MOVWstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6625 // result: (MOVWstore [off1-off2] {sym} ptr val mem) 6626 for { 6627 off1 := auxIntToInt32(v.AuxInt) 6628 sym := auxToSym(v.Aux) 6629 if v_0.Op != OpARMSUBconst { 6630 break 6631 } 6632 off2 := auxIntToInt32(v_0.AuxInt) 6633 ptr := v_0.Args[0] 6634 val := v_1 6635 mem := v_2 6636 v.reset(OpARMMOVWstore) 6637 v.AuxInt = int32ToAuxInt(off1 - off2) 6638 v.Aux = symToAux(sym) 6639 v.AddArg3(ptr, val, mem) 6640 return true 6641 } 6642 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6643 // cond: canMergeSym(sym1,sym2) 6644 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6645 for { 6646 off1 := auxIntToInt32(v.AuxInt) 6647 sym1 := auxToSym(v.Aux) 6648 if v_0.Op != OpARMMOVWaddr { 6649 break 6650 } 6651 off2 := auxIntToInt32(v_0.AuxInt) 6652 sym2 := auxToSym(v_0.Aux) 6653 ptr := v_0.Args[0] 6654 val := v_1 6655 mem := v_2 6656 if !(canMergeSym(sym1, sym2)) { 6657 break 6658 } 6659 v.reset(OpARMMOVWstore) 6660 v.AuxInt = int32ToAuxInt(off1 + off2) 6661 v.Aux = symToAux(mergeSym(sym1, sym2)) 6662 v.AddArg3(ptr, val, mem) 6663 return true 6664 } 6665 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 6666 // cond: sym == nil 6667 // result: (MOVWstoreidx ptr idx val mem) 6668 for { 6669 if auxIntToInt32(v.AuxInt) != 0 { 6670 break 6671 } 6672 sym := auxToSym(v.Aux) 6673 if v_0.Op != OpARMADD { 6674 break 6675 } 6676 idx := v_0.Args[1] 6677 ptr := v_0.Args[0] 6678 val := v_1 6679 mem := v_2 6680 if !(sym == nil) { 6681 break 6682 } 6683 v.reset(OpARMMOVWstoreidx) 6684 v.AddArg4(ptr, idx, val, mem) 6685 return true 6686 } 6687 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 6688 // cond: sym == nil 6689 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6690 for { 6691 if auxIntToInt32(v.AuxInt) != 0 { 6692 break 6693 } 6694 sym := auxToSym(v.Aux) 6695 if v_0.Op != OpARMADDshiftLL { 6696 break 6697 } 6698 c := auxIntToInt32(v_0.AuxInt) 6699 idx := v_0.Args[1] 6700 ptr := v_0.Args[0] 6701 val := v_1 6702 mem := v_2 6703 if !(sym == nil) { 6704 break 6705 } 6706 v.reset(OpARMMOVWstoreshiftLL) 6707 v.AuxInt = int32ToAuxInt(c) 6708 v.AddArg4(ptr, idx, val, mem) 6709 return true 6710 } 6711 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 6712 // cond: sym == nil 6713 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6714 for { 6715 if auxIntToInt32(v.AuxInt) != 0 { 6716 break 6717 } 6718 sym := auxToSym(v.Aux) 6719 if v_0.Op != OpARMADDshiftRL { 6720 break 6721 } 6722 c := auxIntToInt32(v_0.AuxInt) 6723 idx := v_0.Args[1] 6724 ptr := v_0.Args[0] 6725 val := v_1 6726 mem := v_2 6727 if !(sym == nil) { 6728 break 6729 } 6730 v.reset(OpARMMOVWstoreshiftRL) 6731 v.AuxInt = int32ToAuxInt(c) 6732 v.AddArg4(ptr, idx, val, mem) 6733 return true 6734 } 6735 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 6736 // cond: sym == nil 6737 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6738 for { 6739 if auxIntToInt32(v.AuxInt) != 0 { 6740 break 6741 } 6742 sym := auxToSym(v.Aux) 6743 if v_0.Op != OpARMADDshiftRA { 6744 break 6745 } 6746 c := auxIntToInt32(v_0.AuxInt) 6747 idx := v_0.Args[1] 6748 ptr := v_0.Args[0] 6749 val := v_1 6750 mem := v_2 6751 if !(sym == nil) { 6752 break 6753 } 6754 v.reset(OpARMMOVWstoreshiftRA) 6755 v.AuxInt = int32ToAuxInt(c) 6756 v.AddArg4(ptr, idx, val, mem) 6757 return true 6758 } 6759 return false 6760 } 6761 func rewriteValueARM_OpARMMOVWstoreidx(v *Value) bool { 6762 v_3 := v.Args[3] 6763 v_2 := v.Args[2] 6764 v_1 := v.Args[1] 6765 v_0 := v.Args[0] 6766 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 6767 // result: (MOVWstore [c] ptr val mem) 6768 for { 6769 ptr := v_0 6770 if v_1.Op != OpARMMOVWconst { 6771 break 6772 } 6773 c := auxIntToInt32(v_1.AuxInt) 6774 val := v_2 6775 mem := v_3 6776 v.reset(OpARMMOVWstore) 6777 v.AuxInt = int32ToAuxInt(c) 6778 v.AddArg3(ptr, val, mem) 6779 return true 6780 } 6781 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 6782 // result: (MOVWstore [c] ptr val mem) 6783 for { 6784 if v_0.Op != OpARMMOVWconst { 6785 break 6786 } 6787 c := auxIntToInt32(v_0.AuxInt) 6788 ptr := v_1 6789 val := v_2 6790 mem := v_3 6791 v.reset(OpARMMOVWstore) 6792 v.AuxInt = int32ToAuxInt(c) 6793 v.AddArg3(ptr, val, mem) 6794 return true 6795 } 6796 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 6797 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6798 for { 6799 ptr := v_0 6800 if v_1.Op != OpARMSLLconst { 6801 break 6802 } 6803 c := auxIntToInt32(v_1.AuxInt) 6804 idx := v_1.Args[0] 6805 val := v_2 6806 mem := v_3 6807 v.reset(OpARMMOVWstoreshiftLL) 6808 v.AuxInt = int32ToAuxInt(c) 6809 v.AddArg4(ptr, idx, val, mem) 6810 return true 6811 } 6812 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 6813 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6814 for { 6815 if v_0.Op != OpARMSLLconst { 6816 break 6817 } 6818 c := auxIntToInt32(v_0.AuxInt) 6819 idx := v_0.Args[0] 6820 ptr := v_1 6821 val := v_2 6822 mem := v_3 6823 v.reset(OpARMMOVWstoreshiftLL) 6824 v.AuxInt = int32ToAuxInt(c) 6825 v.AddArg4(ptr, idx, val, mem) 6826 return true 6827 } 6828 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 6829 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6830 for { 6831 ptr := v_0 6832 if v_1.Op != OpARMSRLconst { 6833 break 6834 } 6835 c := auxIntToInt32(v_1.AuxInt) 6836 idx := v_1.Args[0] 6837 val := v_2 6838 mem := v_3 6839 v.reset(OpARMMOVWstoreshiftRL) 6840 v.AuxInt = int32ToAuxInt(c) 6841 v.AddArg4(ptr, idx, val, mem) 6842 return true 6843 } 6844 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 6845 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6846 for { 6847 if v_0.Op != OpARMSRLconst { 6848 break 6849 } 6850 c := auxIntToInt32(v_0.AuxInt) 6851 idx := v_0.Args[0] 6852 ptr := v_1 6853 val := v_2 6854 mem := v_3 6855 v.reset(OpARMMOVWstoreshiftRL) 6856 v.AuxInt = int32ToAuxInt(c) 6857 v.AddArg4(ptr, idx, val, mem) 6858 return true 6859 } 6860 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 6861 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6862 for { 6863 ptr := v_0 6864 if v_1.Op != OpARMSRAconst { 6865 break 6866 } 6867 c := auxIntToInt32(v_1.AuxInt) 6868 idx := v_1.Args[0] 6869 val := v_2 6870 mem := v_3 6871 v.reset(OpARMMOVWstoreshiftRA) 6872 v.AuxInt = int32ToAuxInt(c) 6873 v.AddArg4(ptr, idx, val, mem) 6874 return true 6875 } 6876 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 6877 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6878 for { 6879 if v_0.Op != OpARMSRAconst { 6880 break 6881 } 6882 c := auxIntToInt32(v_0.AuxInt) 6883 idx := v_0.Args[0] 6884 ptr := v_1 6885 val := v_2 6886 mem := v_3 6887 v.reset(OpARMMOVWstoreshiftRA) 6888 v.AuxInt = int32ToAuxInt(c) 6889 v.AddArg4(ptr, idx, val, mem) 6890 return true 6891 } 6892 return false 6893 } 6894 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value) bool { 6895 v_3 := v.Args[3] 6896 v_2 := v.Args[2] 6897 v_1 := v.Args[1] 6898 v_0 := v.Args[0] 6899 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 6900 // result: (MOVWstore [int32(uint32(c)<<uint64(d))] ptr val mem) 6901 for { 6902 d := auxIntToInt32(v.AuxInt) 6903 ptr := v_0 6904 if v_1.Op != OpARMMOVWconst { 6905 break 6906 } 6907 c := auxIntToInt32(v_1.AuxInt) 6908 val := v_2 6909 mem := v_3 6910 v.reset(OpARMMOVWstore) 6911 v.AuxInt = int32ToAuxInt(int32(uint32(c) << uint64(d))) 6912 v.AddArg3(ptr, val, mem) 6913 return true 6914 } 6915 return false 6916 } 6917 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value) bool { 6918 v_3 := v.Args[3] 6919 v_2 := v.Args[2] 6920 v_1 := v.Args[1] 6921 v_0 := v.Args[0] 6922 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 6923 // result: (MOVWstore [c>>uint64(d)] ptr val mem) 6924 for { 6925 d := auxIntToInt32(v.AuxInt) 6926 ptr := v_0 6927 if v_1.Op != OpARMMOVWconst { 6928 break 6929 } 6930 c := auxIntToInt32(v_1.AuxInt) 6931 val := v_2 6932 mem := v_3 6933 v.reset(OpARMMOVWstore) 6934 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 6935 v.AddArg3(ptr, val, mem) 6936 return true 6937 } 6938 return false 6939 } 6940 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value) bool { 6941 v_3 := v.Args[3] 6942 v_2 := v.Args[2] 6943 v_1 := v.Args[1] 6944 v_0 := v.Args[0] 6945 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 6946 // result: (MOVWstore [int32(uint32(c)>>uint64(d))] ptr val mem) 6947 for { 6948 d := auxIntToInt32(v.AuxInt) 6949 ptr := v_0 6950 if v_1.Op != OpARMMOVWconst { 6951 break 6952 } 6953 c := auxIntToInt32(v_1.AuxInt) 6954 val := v_2 6955 mem := v_3 6956 v.reset(OpARMMOVWstore) 6957 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 6958 v.AddArg3(ptr, val, mem) 6959 return true 6960 } 6961 return false 6962 } 6963 func rewriteValueARM_OpARMMUL(v *Value) bool { 6964 v_1 := v.Args[1] 6965 v_0 := v.Args[0] 6966 b := v.Block 6967 // match: (MUL x (MOVWconst [c])) 6968 // cond: int32(c) == -1 6969 // result: (RSBconst [0] x) 6970 for { 6971 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 6972 x := v_0 6973 if v_1.Op != OpARMMOVWconst { 6974 continue 6975 } 6976 c := auxIntToInt32(v_1.AuxInt) 6977 if !(int32(c) == -1) { 6978 continue 6979 } 6980 v.reset(OpARMRSBconst) 6981 v.AuxInt = int32ToAuxInt(0) 6982 v.AddArg(x) 6983 return true 6984 } 6985 break 6986 } 6987 // match: (MUL _ (MOVWconst [0])) 6988 // result: (MOVWconst [0]) 6989 for { 6990 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 6991 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 { 6992 continue 6993 } 6994 v.reset(OpARMMOVWconst) 6995 v.AuxInt = int32ToAuxInt(0) 6996 return true 6997 } 6998 break 6999 } 7000 // match: (MUL x (MOVWconst [1])) 7001 // result: x 7002 for { 7003 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7004 x := v_0 7005 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 { 7006 continue 7007 } 7008 v.copyOf(x) 7009 return true 7010 } 7011 break 7012 } 7013 // match: (MUL x (MOVWconst [c])) 7014 // cond: isPowerOfTwo32(c) 7015 // result: (SLLconst [int32(log32(c))] x) 7016 for { 7017 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7018 x := v_0 7019 if v_1.Op != OpARMMOVWconst { 7020 continue 7021 } 7022 c := auxIntToInt32(v_1.AuxInt) 7023 if !(isPowerOfTwo32(c)) { 7024 continue 7025 } 7026 v.reset(OpARMSLLconst) 7027 v.AuxInt = int32ToAuxInt(int32(log32(c))) 7028 v.AddArg(x) 7029 return true 7030 } 7031 break 7032 } 7033 // match: (MUL x (MOVWconst [c])) 7034 // cond: isPowerOfTwo32(c-1) && c >= 3 7035 // result: (ADDshiftLL x x [int32(log32(c-1))]) 7036 for { 7037 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7038 x := v_0 7039 if v_1.Op != OpARMMOVWconst { 7040 continue 7041 } 7042 c := auxIntToInt32(v_1.AuxInt) 7043 if !(isPowerOfTwo32(c-1) && c >= 3) { 7044 continue 7045 } 7046 v.reset(OpARMADDshiftLL) 7047 v.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7048 v.AddArg2(x, x) 7049 return true 7050 } 7051 break 7052 } 7053 // match: (MUL x (MOVWconst [c])) 7054 // cond: isPowerOfTwo32(c+1) && c >= 7 7055 // result: (RSBshiftLL x x [int32(log32(c+1))]) 7056 for { 7057 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7058 x := v_0 7059 if v_1.Op != OpARMMOVWconst { 7060 continue 7061 } 7062 c := auxIntToInt32(v_1.AuxInt) 7063 if !(isPowerOfTwo32(c+1) && c >= 7) { 7064 continue 7065 } 7066 v.reset(OpARMRSBshiftLL) 7067 v.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7068 v.AddArg2(x, x) 7069 return true 7070 } 7071 break 7072 } 7073 // match: (MUL x (MOVWconst [c])) 7074 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7075 // result: (SLLconst [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) 7076 for { 7077 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7078 x := v_0 7079 if v_1.Op != OpARMMOVWconst { 7080 continue 7081 } 7082 c := auxIntToInt32(v_1.AuxInt) 7083 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7084 continue 7085 } 7086 v.reset(OpARMSLLconst) 7087 v.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7088 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7089 v0.AuxInt = int32ToAuxInt(1) 7090 v0.AddArg2(x, x) 7091 v.AddArg(v0) 7092 return true 7093 } 7094 break 7095 } 7096 // match: (MUL x (MOVWconst [c])) 7097 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7098 // result: (SLLconst [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) 7099 for { 7100 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7101 x := v_0 7102 if v_1.Op != OpARMMOVWconst { 7103 continue 7104 } 7105 c := auxIntToInt32(v_1.AuxInt) 7106 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7107 continue 7108 } 7109 v.reset(OpARMSLLconst) 7110 v.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7111 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7112 v0.AuxInt = int32ToAuxInt(2) 7113 v0.AddArg2(x, x) 7114 v.AddArg(v0) 7115 return true 7116 } 7117 break 7118 } 7119 // match: (MUL x (MOVWconst [c])) 7120 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7121 // result: (SLLconst [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) 7122 for { 7123 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7124 x := v_0 7125 if v_1.Op != OpARMMOVWconst { 7126 continue 7127 } 7128 c := auxIntToInt32(v_1.AuxInt) 7129 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7130 continue 7131 } 7132 v.reset(OpARMSLLconst) 7133 v.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7134 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7135 v0.AuxInt = int32ToAuxInt(3) 7136 v0.AddArg2(x, x) 7137 v.AddArg(v0) 7138 return true 7139 } 7140 break 7141 } 7142 // match: (MUL x (MOVWconst [c])) 7143 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7144 // result: (SLLconst [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) 7145 for { 7146 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7147 x := v_0 7148 if v_1.Op != OpARMMOVWconst { 7149 continue 7150 } 7151 c := auxIntToInt32(v_1.AuxInt) 7152 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 7153 continue 7154 } 7155 v.reset(OpARMSLLconst) 7156 v.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 7157 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7158 v0.AuxInt = int32ToAuxInt(3) 7159 v0.AddArg2(x, x) 7160 v.AddArg(v0) 7161 return true 7162 } 7163 break 7164 } 7165 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 7166 // result: (MOVWconst [c*d]) 7167 for { 7168 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7169 if v_0.Op != OpARMMOVWconst { 7170 continue 7171 } 7172 c := auxIntToInt32(v_0.AuxInt) 7173 if v_1.Op != OpARMMOVWconst { 7174 continue 7175 } 7176 d := auxIntToInt32(v_1.AuxInt) 7177 v.reset(OpARMMOVWconst) 7178 v.AuxInt = int32ToAuxInt(c * d) 7179 return true 7180 } 7181 break 7182 } 7183 return false 7184 } 7185 func rewriteValueARM_OpARMMULA(v *Value) bool { 7186 v_2 := v.Args[2] 7187 v_1 := v.Args[1] 7188 v_0 := v.Args[0] 7189 b := v.Block 7190 // match: (MULA x (MOVWconst [c]) a) 7191 // cond: c == -1 7192 // result: (SUB a x) 7193 for { 7194 x := v_0 7195 if v_1.Op != OpARMMOVWconst { 7196 break 7197 } 7198 c := auxIntToInt32(v_1.AuxInt) 7199 a := v_2 7200 if !(c == -1) { 7201 break 7202 } 7203 v.reset(OpARMSUB) 7204 v.AddArg2(a, x) 7205 return true 7206 } 7207 // match: (MULA _ (MOVWconst [0]) a) 7208 // result: a 7209 for { 7210 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 { 7211 break 7212 } 7213 a := v_2 7214 v.copyOf(a) 7215 return true 7216 } 7217 // match: (MULA x (MOVWconst [1]) a) 7218 // result: (ADD x a) 7219 for { 7220 x := v_0 7221 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 { 7222 break 7223 } 7224 a := v_2 7225 v.reset(OpARMADD) 7226 v.AddArg2(x, a) 7227 return true 7228 } 7229 // match: (MULA x (MOVWconst [c]) a) 7230 // cond: isPowerOfTwo32(c) 7231 // result: (ADD (SLLconst <x.Type> [int32(log32(c))] x) a) 7232 for { 7233 x := v_0 7234 if v_1.Op != OpARMMOVWconst { 7235 break 7236 } 7237 c := auxIntToInt32(v_1.AuxInt) 7238 a := v_2 7239 if !(isPowerOfTwo32(c)) { 7240 break 7241 } 7242 v.reset(OpARMADD) 7243 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7244 v0.AuxInt = int32ToAuxInt(int32(log32(c))) 7245 v0.AddArg(x) 7246 v.AddArg2(v0, a) 7247 return true 7248 } 7249 // match: (MULA x (MOVWconst [c]) a) 7250 // cond: isPowerOfTwo32(c-1) && c >= 3 7251 // result: (ADD (ADDshiftLL <x.Type> x x [int32(log32(c-1))]) a) 7252 for { 7253 x := v_0 7254 if v_1.Op != OpARMMOVWconst { 7255 break 7256 } 7257 c := auxIntToInt32(v_1.AuxInt) 7258 a := v_2 7259 if !(isPowerOfTwo32(c-1) && c >= 3) { 7260 break 7261 } 7262 v.reset(OpARMADD) 7263 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7264 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7265 v0.AddArg2(x, x) 7266 v.AddArg2(v0, a) 7267 return true 7268 } 7269 // match: (MULA x (MOVWconst [c]) a) 7270 // cond: isPowerOfTwo32(c+1) && c >= 7 7271 // result: (ADD (RSBshiftLL <x.Type> x x [int32(log32(c+1))]) a) 7272 for { 7273 x := v_0 7274 if v_1.Op != OpARMMOVWconst { 7275 break 7276 } 7277 c := auxIntToInt32(v_1.AuxInt) 7278 a := v_2 7279 if !(isPowerOfTwo32(c+1) && c >= 7) { 7280 break 7281 } 7282 v.reset(OpARMADD) 7283 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7284 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7285 v0.AddArg2(x, x) 7286 v.AddArg2(v0, a) 7287 return true 7288 } 7289 // match: (MULA x (MOVWconst [c]) a) 7290 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7291 // result: (ADD (SLLconst <x.Type> [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) a) 7292 for { 7293 x := v_0 7294 if v_1.Op != OpARMMOVWconst { 7295 break 7296 } 7297 c := auxIntToInt32(v_1.AuxInt) 7298 a := v_2 7299 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7300 break 7301 } 7302 v.reset(OpARMADD) 7303 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7304 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7305 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7306 v1.AuxInt = int32ToAuxInt(1) 7307 v1.AddArg2(x, x) 7308 v0.AddArg(v1) 7309 v.AddArg2(v0, a) 7310 return true 7311 } 7312 // match: (MULA x (MOVWconst [c]) a) 7313 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7314 // result: (ADD (SLLconst <x.Type> [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) a) 7315 for { 7316 x := v_0 7317 if v_1.Op != OpARMMOVWconst { 7318 break 7319 } 7320 c := auxIntToInt32(v_1.AuxInt) 7321 a := v_2 7322 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7323 break 7324 } 7325 v.reset(OpARMADD) 7326 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7327 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7328 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7329 v1.AuxInt = int32ToAuxInt(2) 7330 v1.AddArg2(x, x) 7331 v0.AddArg(v1) 7332 v.AddArg2(v0, a) 7333 return true 7334 } 7335 // match: (MULA x (MOVWconst [c]) a) 7336 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7337 // result: (ADD (SLLconst <x.Type> [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) a) 7338 for { 7339 x := v_0 7340 if v_1.Op != OpARMMOVWconst { 7341 break 7342 } 7343 c := auxIntToInt32(v_1.AuxInt) 7344 a := v_2 7345 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7346 break 7347 } 7348 v.reset(OpARMADD) 7349 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7350 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7351 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7352 v1.AuxInt = int32ToAuxInt(3) 7353 v1.AddArg2(x, x) 7354 v0.AddArg(v1) 7355 v.AddArg2(v0, a) 7356 return true 7357 } 7358 // match: (MULA x (MOVWconst [c]) a) 7359 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7360 // result: (ADD (SLLconst <x.Type> [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) a) 7361 for { 7362 x := v_0 7363 if v_1.Op != OpARMMOVWconst { 7364 break 7365 } 7366 c := auxIntToInt32(v_1.AuxInt) 7367 a := v_2 7368 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 7369 break 7370 } 7371 v.reset(OpARMADD) 7372 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7373 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 7374 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7375 v1.AuxInt = int32ToAuxInt(3) 7376 v1.AddArg2(x, x) 7377 v0.AddArg(v1) 7378 v.AddArg2(v0, a) 7379 return true 7380 } 7381 // match: (MULA (MOVWconst [c]) x a) 7382 // cond: c == -1 7383 // result: (SUB a x) 7384 for { 7385 if v_0.Op != OpARMMOVWconst { 7386 break 7387 } 7388 c := auxIntToInt32(v_0.AuxInt) 7389 x := v_1 7390 a := v_2 7391 if !(c == -1) { 7392 break 7393 } 7394 v.reset(OpARMSUB) 7395 v.AddArg2(a, x) 7396 return true 7397 } 7398 // match: (MULA (MOVWconst [0]) _ a) 7399 // result: a 7400 for { 7401 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 { 7402 break 7403 } 7404 a := v_2 7405 v.copyOf(a) 7406 return true 7407 } 7408 // match: (MULA (MOVWconst [1]) x a) 7409 // result: (ADD x a) 7410 for { 7411 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 { 7412 break 7413 } 7414 x := v_1 7415 a := v_2 7416 v.reset(OpARMADD) 7417 v.AddArg2(x, a) 7418 return true 7419 } 7420 // match: (MULA (MOVWconst [c]) x a) 7421 // cond: isPowerOfTwo32(c) 7422 // result: (ADD (SLLconst <x.Type> [int32(log32(c))] x) a) 7423 for { 7424 if v_0.Op != OpARMMOVWconst { 7425 break 7426 } 7427 c := auxIntToInt32(v_0.AuxInt) 7428 x := v_1 7429 a := v_2 7430 if !(isPowerOfTwo32(c)) { 7431 break 7432 } 7433 v.reset(OpARMADD) 7434 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7435 v0.AuxInt = int32ToAuxInt(int32(log32(c))) 7436 v0.AddArg(x) 7437 v.AddArg2(v0, a) 7438 return true 7439 } 7440 // match: (MULA (MOVWconst [c]) x a) 7441 // cond: isPowerOfTwo32(c-1) && c >= 3 7442 // result: (ADD (ADDshiftLL <x.Type> x x [int32(log32(c-1))]) a) 7443 for { 7444 if v_0.Op != OpARMMOVWconst { 7445 break 7446 } 7447 c := auxIntToInt32(v_0.AuxInt) 7448 x := v_1 7449 a := v_2 7450 if !(isPowerOfTwo32(c-1) && c >= 3) { 7451 break 7452 } 7453 v.reset(OpARMADD) 7454 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7455 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7456 v0.AddArg2(x, x) 7457 v.AddArg2(v0, a) 7458 return true 7459 } 7460 // match: (MULA (MOVWconst [c]) x a) 7461 // cond: isPowerOfTwo32(c+1) && c >= 7 7462 // result: (ADD (RSBshiftLL <x.Type> x x [int32(log32(c+1))]) a) 7463 for { 7464 if v_0.Op != OpARMMOVWconst { 7465 break 7466 } 7467 c := auxIntToInt32(v_0.AuxInt) 7468 x := v_1 7469 a := v_2 7470 if !(isPowerOfTwo32(c+1) && c >= 7) { 7471 break 7472 } 7473 v.reset(OpARMADD) 7474 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7475 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7476 v0.AddArg2(x, x) 7477 v.AddArg2(v0, a) 7478 return true 7479 } 7480 // match: (MULA (MOVWconst [c]) x a) 7481 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7482 // result: (ADD (SLLconst <x.Type> [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) a) 7483 for { 7484 if v_0.Op != OpARMMOVWconst { 7485 break 7486 } 7487 c := auxIntToInt32(v_0.AuxInt) 7488 x := v_1 7489 a := v_2 7490 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7491 break 7492 } 7493 v.reset(OpARMADD) 7494 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7495 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7496 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7497 v1.AuxInt = int32ToAuxInt(1) 7498 v1.AddArg2(x, x) 7499 v0.AddArg(v1) 7500 v.AddArg2(v0, a) 7501 return true 7502 } 7503 // match: (MULA (MOVWconst [c]) x a) 7504 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7505 // result: (ADD (SLLconst <x.Type> [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) a) 7506 for { 7507 if v_0.Op != OpARMMOVWconst { 7508 break 7509 } 7510 c := auxIntToInt32(v_0.AuxInt) 7511 x := v_1 7512 a := v_2 7513 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7514 break 7515 } 7516 v.reset(OpARMADD) 7517 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7518 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7519 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7520 v1.AuxInt = int32ToAuxInt(2) 7521 v1.AddArg2(x, x) 7522 v0.AddArg(v1) 7523 v.AddArg2(v0, a) 7524 return true 7525 } 7526 // match: (MULA (MOVWconst [c]) x a) 7527 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7528 // result: (ADD (SLLconst <x.Type> [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) a) 7529 for { 7530 if v_0.Op != OpARMMOVWconst { 7531 break 7532 } 7533 c := auxIntToInt32(v_0.AuxInt) 7534 x := v_1 7535 a := v_2 7536 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7537 break 7538 } 7539 v.reset(OpARMADD) 7540 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7541 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7542 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7543 v1.AuxInt = int32ToAuxInt(3) 7544 v1.AddArg2(x, x) 7545 v0.AddArg(v1) 7546 v.AddArg2(v0, a) 7547 return true 7548 } 7549 // match: (MULA (MOVWconst [c]) x a) 7550 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7551 // result: (ADD (SLLconst <x.Type> [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) a) 7552 for { 7553 if v_0.Op != OpARMMOVWconst { 7554 break 7555 } 7556 c := auxIntToInt32(v_0.AuxInt) 7557 x := v_1 7558 a := v_2 7559 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 7560 break 7561 } 7562 v.reset(OpARMADD) 7563 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7564 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 7565 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7566 v1.AuxInt = int32ToAuxInt(3) 7567 v1.AddArg2(x, x) 7568 v0.AddArg(v1) 7569 v.AddArg2(v0, a) 7570 return true 7571 } 7572 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 7573 // result: (ADDconst [c*d] a) 7574 for { 7575 if v_0.Op != OpARMMOVWconst { 7576 break 7577 } 7578 c := auxIntToInt32(v_0.AuxInt) 7579 if v_1.Op != OpARMMOVWconst { 7580 break 7581 } 7582 d := auxIntToInt32(v_1.AuxInt) 7583 a := v_2 7584 v.reset(OpARMADDconst) 7585 v.AuxInt = int32ToAuxInt(c * d) 7586 v.AddArg(a) 7587 return true 7588 } 7589 return false 7590 } 7591 func rewriteValueARM_OpARMMULD(v *Value) bool { 7592 v_1 := v.Args[1] 7593 v_0 := v.Args[0] 7594 // match: (MULD (NEGD x) y) 7595 // cond: buildcfg.GOARM.Version >= 6 7596 // result: (NMULD x y) 7597 for { 7598 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7599 if v_0.Op != OpARMNEGD { 7600 continue 7601 } 7602 x := v_0.Args[0] 7603 y := v_1 7604 if !(buildcfg.GOARM.Version >= 6) { 7605 continue 7606 } 7607 v.reset(OpARMNMULD) 7608 v.AddArg2(x, y) 7609 return true 7610 } 7611 break 7612 } 7613 return false 7614 } 7615 func rewriteValueARM_OpARMMULF(v *Value) bool { 7616 v_1 := v.Args[1] 7617 v_0 := v.Args[0] 7618 // match: (MULF (NEGF x) y) 7619 // cond: buildcfg.GOARM.Version >= 6 7620 // result: (NMULF x y) 7621 for { 7622 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 7623 if v_0.Op != OpARMNEGF { 7624 continue 7625 } 7626 x := v_0.Args[0] 7627 y := v_1 7628 if !(buildcfg.GOARM.Version >= 6) { 7629 continue 7630 } 7631 v.reset(OpARMNMULF) 7632 v.AddArg2(x, y) 7633 return true 7634 } 7635 break 7636 } 7637 return false 7638 } 7639 func rewriteValueARM_OpARMMULS(v *Value) bool { 7640 v_2 := v.Args[2] 7641 v_1 := v.Args[1] 7642 v_0 := v.Args[0] 7643 b := v.Block 7644 // match: (MULS x (MOVWconst [c]) a) 7645 // cond: c == -1 7646 // result: (ADD a x) 7647 for { 7648 x := v_0 7649 if v_1.Op != OpARMMOVWconst { 7650 break 7651 } 7652 c := auxIntToInt32(v_1.AuxInt) 7653 a := v_2 7654 if !(c == -1) { 7655 break 7656 } 7657 v.reset(OpARMADD) 7658 v.AddArg2(a, x) 7659 return true 7660 } 7661 // match: (MULS _ (MOVWconst [0]) a) 7662 // result: a 7663 for { 7664 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 0 { 7665 break 7666 } 7667 a := v_2 7668 v.copyOf(a) 7669 return true 7670 } 7671 // match: (MULS x (MOVWconst [1]) a) 7672 // result: (RSB x a) 7673 for { 7674 x := v_0 7675 if v_1.Op != OpARMMOVWconst || auxIntToInt32(v_1.AuxInt) != 1 { 7676 break 7677 } 7678 a := v_2 7679 v.reset(OpARMRSB) 7680 v.AddArg2(x, a) 7681 return true 7682 } 7683 // match: (MULS x (MOVWconst [c]) a) 7684 // cond: isPowerOfTwo32(c) 7685 // result: (RSB (SLLconst <x.Type> [int32(log32(c))] x) a) 7686 for { 7687 x := v_0 7688 if v_1.Op != OpARMMOVWconst { 7689 break 7690 } 7691 c := auxIntToInt32(v_1.AuxInt) 7692 a := v_2 7693 if !(isPowerOfTwo32(c)) { 7694 break 7695 } 7696 v.reset(OpARMRSB) 7697 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7698 v0.AuxInt = int32ToAuxInt(int32(log32(c))) 7699 v0.AddArg(x) 7700 v.AddArg2(v0, a) 7701 return true 7702 } 7703 // match: (MULS x (MOVWconst [c]) a) 7704 // cond: isPowerOfTwo32(c-1) && c >= 3 7705 // result: (RSB (ADDshiftLL <x.Type> x x [int32(log32(c-1))]) a) 7706 for { 7707 x := v_0 7708 if v_1.Op != OpARMMOVWconst { 7709 break 7710 } 7711 c := auxIntToInt32(v_1.AuxInt) 7712 a := v_2 7713 if !(isPowerOfTwo32(c-1) && c >= 3) { 7714 break 7715 } 7716 v.reset(OpARMRSB) 7717 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7718 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7719 v0.AddArg2(x, x) 7720 v.AddArg2(v0, a) 7721 return true 7722 } 7723 // match: (MULS x (MOVWconst [c]) a) 7724 // cond: isPowerOfTwo32(c+1) && c >= 7 7725 // result: (RSB (RSBshiftLL <x.Type> x x [int32(log32(c+1))]) a) 7726 for { 7727 x := v_0 7728 if v_1.Op != OpARMMOVWconst { 7729 break 7730 } 7731 c := auxIntToInt32(v_1.AuxInt) 7732 a := v_2 7733 if !(isPowerOfTwo32(c+1) && c >= 7) { 7734 break 7735 } 7736 v.reset(OpARMRSB) 7737 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7738 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7739 v0.AddArg2(x, x) 7740 v.AddArg2(v0, a) 7741 return true 7742 } 7743 // match: (MULS x (MOVWconst [c]) a) 7744 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7745 // result: (RSB (SLLconst <x.Type> [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) a) 7746 for { 7747 x := v_0 7748 if v_1.Op != OpARMMOVWconst { 7749 break 7750 } 7751 c := auxIntToInt32(v_1.AuxInt) 7752 a := v_2 7753 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7754 break 7755 } 7756 v.reset(OpARMRSB) 7757 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7758 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7759 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7760 v1.AuxInt = int32ToAuxInt(1) 7761 v1.AddArg2(x, x) 7762 v0.AddArg(v1) 7763 v.AddArg2(v0, a) 7764 return true 7765 } 7766 // match: (MULS x (MOVWconst [c]) a) 7767 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7768 // result: (RSB (SLLconst <x.Type> [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) a) 7769 for { 7770 x := v_0 7771 if v_1.Op != OpARMMOVWconst { 7772 break 7773 } 7774 c := auxIntToInt32(v_1.AuxInt) 7775 a := v_2 7776 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7777 break 7778 } 7779 v.reset(OpARMRSB) 7780 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7781 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7782 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7783 v1.AuxInt = int32ToAuxInt(2) 7784 v1.AddArg2(x, x) 7785 v0.AddArg(v1) 7786 v.AddArg2(v0, a) 7787 return true 7788 } 7789 // match: (MULS x (MOVWconst [c]) a) 7790 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7791 // result: (RSB (SLLconst <x.Type> [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) a) 7792 for { 7793 x := v_0 7794 if v_1.Op != OpARMMOVWconst { 7795 break 7796 } 7797 c := auxIntToInt32(v_1.AuxInt) 7798 a := v_2 7799 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7800 break 7801 } 7802 v.reset(OpARMRSB) 7803 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7804 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7805 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7806 v1.AuxInt = int32ToAuxInt(3) 7807 v1.AddArg2(x, x) 7808 v0.AddArg(v1) 7809 v.AddArg2(v0, a) 7810 return true 7811 } 7812 // match: (MULS x (MOVWconst [c]) a) 7813 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 7814 // result: (RSB (SLLconst <x.Type> [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) a) 7815 for { 7816 x := v_0 7817 if v_1.Op != OpARMMOVWconst { 7818 break 7819 } 7820 c := auxIntToInt32(v_1.AuxInt) 7821 a := v_2 7822 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 7823 break 7824 } 7825 v.reset(OpARMRSB) 7826 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7827 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 7828 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7829 v1.AuxInt = int32ToAuxInt(3) 7830 v1.AddArg2(x, x) 7831 v0.AddArg(v1) 7832 v.AddArg2(v0, a) 7833 return true 7834 } 7835 // match: (MULS (MOVWconst [c]) x a) 7836 // cond: c == -1 7837 // result: (ADD a x) 7838 for { 7839 if v_0.Op != OpARMMOVWconst { 7840 break 7841 } 7842 c := auxIntToInt32(v_0.AuxInt) 7843 x := v_1 7844 a := v_2 7845 if !(c == -1) { 7846 break 7847 } 7848 v.reset(OpARMADD) 7849 v.AddArg2(a, x) 7850 return true 7851 } 7852 // match: (MULS (MOVWconst [0]) _ a) 7853 // result: a 7854 for { 7855 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 0 { 7856 break 7857 } 7858 a := v_2 7859 v.copyOf(a) 7860 return true 7861 } 7862 // match: (MULS (MOVWconst [1]) x a) 7863 // result: (RSB x a) 7864 for { 7865 if v_0.Op != OpARMMOVWconst || auxIntToInt32(v_0.AuxInt) != 1 { 7866 break 7867 } 7868 x := v_1 7869 a := v_2 7870 v.reset(OpARMRSB) 7871 v.AddArg2(x, a) 7872 return true 7873 } 7874 // match: (MULS (MOVWconst [c]) x a) 7875 // cond: isPowerOfTwo32(c) 7876 // result: (RSB (SLLconst <x.Type> [int32(log32(c))] x) a) 7877 for { 7878 if v_0.Op != OpARMMOVWconst { 7879 break 7880 } 7881 c := auxIntToInt32(v_0.AuxInt) 7882 x := v_1 7883 a := v_2 7884 if !(isPowerOfTwo32(c)) { 7885 break 7886 } 7887 v.reset(OpARMRSB) 7888 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7889 v0.AuxInt = int32ToAuxInt(int32(log32(c))) 7890 v0.AddArg(x) 7891 v.AddArg2(v0, a) 7892 return true 7893 } 7894 // match: (MULS (MOVWconst [c]) x a) 7895 // cond: isPowerOfTwo32(c-1) && c >= 3 7896 // result: (RSB (ADDshiftLL <x.Type> x x [int32(log32(c-1))]) a) 7897 for { 7898 if v_0.Op != OpARMMOVWconst { 7899 break 7900 } 7901 c := auxIntToInt32(v_0.AuxInt) 7902 x := v_1 7903 a := v_2 7904 if !(isPowerOfTwo32(c-1) && c >= 3) { 7905 break 7906 } 7907 v.reset(OpARMRSB) 7908 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7909 v0.AuxInt = int32ToAuxInt(int32(log32(c - 1))) 7910 v0.AddArg2(x, x) 7911 v.AddArg2(v0, a) 7912 return true 7913 } 7914 // match: (MULS (MOVWconst [c]) x a) 7915 // cond: isPowerOfTwo32(c+1) && c >= 7 7916 // result: (RSB (RSBshiftLL <x.Type> x x [int32(log32(c+1))]) a) 7917 for { 7918 if v_0.Op != OpARMMOVWconst { 7919 break 7920 } 7921 c := auxIntToInt32(v_0.AuxInt) 7922 x := v_1 7923 a := v_2 7924 if !(isPowerOfTwo32(c+1) && c >= 7) { 7925 break 7926 } 7927 v.reset(OpARMRSB) 7928 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7929 v0.AuxInt = int32ToAuxInt(int32(log32(c + 1))) 7930 v0.AddArg2(x, x) 7931 v.AddArg2(v0, a) 7932 return true 7933 } 7934 // match: (MULS (MOVWconst [c]) x a) 7935 // cond: c%3 == 0 && isPowerOfTwo32(c/3) 7936 // result: (RSB (SLLconst <x.Type> [int32(log32(c/3))] (ADDshiftLL <x.Type> x x [1])) a) 7937 for { 7938 if v_0.Op != OpARMMOVWconst { 7939 break 7940 } 7941 c := auxIntToInt32(v_0.AuxInt) 7942 x := v_1 7943 a := v_2 7944 if !(c%3 == 0 && isPowerOfTwo32(c/3)) { 7945 break 7946 } 7947 v.reset(OpARMRSB) 7948 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7949 v0.AuxInt = int32ToAuxInt(int32(log32(c / 3))) 7950 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7951 v1.AuxInt = int32ToAuxInt(1) 7952 v1.AddArg2(x, x) 7953 v0.AddArg(v1) 7954 v.AddArg2(v0, a) 7955 return true 7956 } 7957 // match: (MULS (MOVWconst [c]) x a) 7958 // cond: c%5 == 0 && isPowerOfTwo32(c/5) 7959 // result: (RSB (SLLconst <x.Type> [int32(log32(c/5))] (ADDshiftLL <x.Type> x x [2])) a) 7960 for { 7961 if v_0.Op != OpARMMOVWconst { 7962 break 7963 } 7964 c := auxIntToInt32(v_0.AuxInt) 7965 x := v_1 7966 a := v_2 7967 if !(c%5 == 0 && isPowerOfTwo32(c/5)) { 7968 break 7969 } 7970 v.reset(OpARMRSB) 7971 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7972 v0.AuxInt = int32ToAuxInt(int32(log32(c / 5))) 7973 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7974 v1.AuxInt = int32ToAuxInt(2) 7975 v1.AddArg2(x, x) 7976 v0.AddArg(v1) 7977 v.AddArg2(v0, a) 7978 return true 7979 } 7980 // match: (MULS (MOVWconst [c]) x a) 7981 // cond: c%7 == 0 && isPowerOfTwo32(c/7) 7982 // result: (RSB (SLLconst <x.Type> [int32(log32(c/7))] (RSBshiftLL <x.Type> x x [3])) a) 7983 for { 7984 if v_0.Op != OpARMMOVWconst { 7985 break 7986 } 7987 c := auxIntToInt32(v_0.AuxInt) 7988 x := v_1 7989 a := v_2 7990 if !(c%7 == 0 && isPowerOfTwo32(c/7)) { 7991 break 7992 } 7993 v.reset(OpARMRSB) 7994 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7995 v0.AuxInt = int32ToAuxInt(int32(log32(c / 7))) 7996 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7997 v1.AuxInt = int32ToAuxInt(3) 7998 v1.AddArg2(x, x) 7999 v0.AddArg(v1) 8000 v.AddArg2(v0, a) 8001 return true 8002 } 8003 // match: (MULS (MOVWconst [c]) x a) 8004 // cond: c%9 == 0 && isPowerOfTwo32(c/9) 8005 // result: (RSB (SLLconst <x.Type> [int32(log32(c/9))] (ADDshiftLL <x.Type> x x [3])) a) 8006 for { 8007 if v_0.Op != OpARMMOVWconst { 8008 break 8009 } 8010 c := auxIntToInt32(v_0.AuxInt) 8011 x := v_1 8012 a := v_2 8013 if !(c%9 == 0 && isPowerOfTwo32(c/9)) { 8014 break 8015 } 8016 v.reset(OpARMRSB) 8017 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8018 v0.AuxInt = int32ToAuxInt(int32(log32(c / 9))) 8019 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8020 v1.AuxInt = int32ToAuxInt(3) 8021 v1.AddArg2(x, x) 8022 v0.AddArg(v1) 8023 v.AddArg2(v0, a) 8024 return true 8025 } 8026 // match: (MULS (MOVWconst [c]) (MOVWconst [d]) a) 8027 // result: (SUBconst [c*d] a) 8028 for { 8029 if v_0.Op != OpARMMOVWconst { 8030 break 8031 } 8032 c := auxIntToInt32(v_0.AuxInt) 8033 if v_1.Op != OpARMMOVWconst { 8034 break 8035 } 8036 d := auxIntToInt32(v_1.AuxInt) 8037 a := v_2 8038 v.reset(OpARMSUBconst) 8039 v.AuxInt = int32ToAuxInt(c * d) 8040 v.AddArg(a) 8041 return true 8042 } 8043 return false 8044 } 8045 func rewriteValueARM_OpARMMVN(v *Value) bool { 8046 v_0 := v.Args[0] 8047 // match: (MVN (MOVWconst [c])) 8048 // result: (MOVWconst [^c]) 8049 for { 8050 if v_0.Op != OpARMMOVWconst { 8051 break 8052 } 8053 c := auxIntToInt32(v_0.AuxInt) 8054 v.reset(OpARMMOVWconst) 8055 v.AuxInt = int32ToAuxInt(^c) 8056 return true 8057 } 8058 // match: (MVN (SLLconst [c] x)) 8059 // result: (MVNshiftLL x [c]) 8060 for { 8061 if v_0.Op != OpARMSLLconst { 8062 break 8063 } 8064 c := auxIntToInt32(v_0.AuxInt) 8065 x := v_0.Args[0] 8066 v.reset(OpARMMVNshiftLL) 8067 v.AuxInt = int32ToAuxInt(c) 8068 v.AddArg(x) 8069 return true 8070 } 8071 // match: (MVN (SRLconst [c] x)) 8072 // result: (MVNshiftRL x [c]) 8073 for { 8074 if v_0.Op != OpARMSRLconst { 8075 break 8076 } 8077 c := auxIntToInt32(v_0.AuxInt) 8078 x := v_0.Args[0] 8079 v.reset(OpARMMVNshiftRL) 8080 v.AuxInt = int32ToAuxInt(c) 8081 v.AddArg(x) 8082 return true 8083 } 8084 // match: (MVN (SRAconst [c] x)) 8085 // result: (MVNshiftRA x [c]) 8086 for { 8087 if v_0.Op != OpARMSRAconst { 8088 break 8089 } 8090 c := auxIntToInt32(v_0.AuxInt) 8091 x := v_0.Args[0] 8092 v.reset(OpARMMVNshiftRA) 8093 v.AuxInt = int32ToAuxInt(c) 8094 v.AddArg(x) 8095 return true 8096 } 8097 // match: (MVN (SLL x y)) 8098 // result: (MVNshiftLLreg x y) 8099 for { 8100 if v_0.Op != OpARMSLL { 8101 break 8102 } 8103 y := v_0.Args[1] 8104 x := v_0.Args[0] 8105 v.reset(OpARMMVNshiftLLreg) 8106 v.AddArg2(x, y) 8107 return true 8108 } 8109 // match: (MVN (SRL x y)) 8110 // result: (MVNshiftRLreg x y) 8111 for { 8112 if v_0.Op != OpARMSRL { 8113 break 8114 } 8115 y := v_0.Args[1] 8116 x := v_0.Args[0] 8117 v.reset(OpARMMVNshiftRLreg) 8118 v.AddArg2(x, y) 8119 return true 8120 } 8121 // match: (MVN (SRA x y)) 8122 // result: (MVNshiftRAreg x y) 8123 for { 8124 if v_0.Op != OpARMSRA { 8125 break 8126 } 8127 y := v_0.Args[1] 8128 x := v_0.Args[0] 8129 v.reset(OpARMMVNshiftRAreg) 8130 v.AddArg2(x, y) 8131 return true 8132 } 8133 return false 8134 } 8135 func rewriteValueARM_OpARMMVNshiftLL(v *Value) bool { 8136 v_0 := v.Args[0] 8137 // match: (MVNshiftLL (MOVWconst [c]) [d]) 8138 // result: (MOVWconst [^(c<<uint64(d))]) 8139 for { 8140 d := auxIntToInt32(v.AuxInt) 8141 if v_0.Op != OpARMMOVWconst { 8142 break 8143 } 8144 c := auxIntToInt32(v_0.AuxInt) 8145 v.reset(OpARMMOVWconst) 8146 v.AuxInt = int32ToAuxInt(^(c << uint64(d))) 8147 return true 8148 } 8149 return false 8150 } 8151 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value) bool { 8152 v_1 := v.Args[1] 8153 v_0 := v.Args[0] 8154 // match: (MVNshiftLLreg x (MOVWconst [c])) 8155 // cond: 0 <= c && c < 32 8156 // result: (MVNshiftLL x [c]) 8157 for { 8158 x := v_0 8159 if v_1.Op != OpARMMOVWconst { 8160 break 8161 } 8162 c := auxIntToInt32(v_1.AuxInt) 8163 if !(0 <= c && c < 32) { 8164 break 8165 } 8166 v.reset(OpARMMVNshiftLL) 8167 v.AuxInt = int32ToAuxInt(c) 8168 v.AddArg(x) 8169 return true 8170 } 8171 return false 8172 } 8173 func rewriteValueARM_OpARMMVNshiftRA(v *Value) bool { 8174 v_0 := v.Args[0] 8175 // match: (MVNshiftRA (MOVWconst [c]) [d]) 8176 // result: (MOVWconst [int32(c)>>uint64(d)]) 8177 for { 8178 d := auxIntToInt32(v.AuxInt) 8179 if v_0.Op != OpARMMOVWconst { 8180 break 8181 } 8182 c := auxIntToInt32(v_0.AuxInt) 8183 v.reset(OpARMMOVWconst) 8184 v.AuxInt = int32ToAuxInt(int32(c) >> uint64(d)) 8185 return true 8186 } 8187 return false 8188 } 8189 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value) bool { 8190 v_1 := v.Args[1] 8191 v_0 := v.Args[0] 8192 // match: (MVNshiftRAreg x (MOVWconst [c])) 8193 // cond: 0 <= c && c < 32 8194 // result: (MVNshiftRA x [c]) 8195 for { 8196 x := v_0 8197 if v_1.Op != OpARMMOVWconst { 8198 break 8199 } 8200 c := auxIntToInt32(v_1.AuxInt) 8201 if !(0 <= c && c < 32) { 8202 break 8203 } 8204 v.reset(OpARMMVNshiftRA) 8205 v.AuxInt = int32ToAuxInt(c) 8206 v.AddArg(x) 8207 return true 8208 } 8209 return false 8210 } 8211 func rewriteValueARM_OpARMMVNshiftRL(v *Value) bool { 8212 v_0 := v.Args[0] 8213 // match: (MVNshiftRL (MOVWconst [c]) [d]) 8214 // result: (MOVWconst [^int32(uint32(c)>>uint64(d))]) 8215 for { 8216 d := auxIntToInt32(v.AuxInt) 8217 if v_0.Op != OpARMMOVWconst { 8218 break 8219 } 8220 c := auxIntToInt32(v_0.AuxInt) 8221 v.reset(OpARMMOVWconst) 8222 v.AuxInt = int32ToAuxInt(^int32(uint32(c) >> uint64(d))) 8223 return true 8224 } 8225 return false 8226 } 8227 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value) bool { 8228 v_1 := v.Args[1] 8229 v_0 := v.Args[0] 8230 // match: (MVNshiftRLreg x (MOVWconst [c])) 8231 // cond: 0 <= c && c < 32 8232 // result: (MVNshiftRL x [c]) 8233 for { 8234 x := v_0 8235 if v_1.Op != OpARMMOVWconst { 8236 break 8237 } 8238 c := auxIntToInt32(v_1.AuxInt) 8239 if !(0 <= c && c < 32) { 8240 break 8241 } 8242 v.reset(OpARMMVNshiftRL) 8243 v.AuxInt = int32ToAuxInt(c) 8244 v.AddArg(x) 8245 return true 8246 } 8247 return false 8248 } 8249 func rewriteValueARM_OpARMNEGD(v *Value) bool { 8250 v_0 := v.Args[0] 8251 // match: (NEGD (MULD x y)) 8252 // cond: buildcfg.GOARM.Version >= 6 8253 // result: (NMULD x y) 8254 for { 8255 if v_0.Op != OpARMMULD { 8256 break 8257 } 8258 y := v_0.Args[1] 8259 x := v_0.Args[0] 8260 if !(buildcfg.GOARM.Version >= 6) { 8261 break 8262 } 8263 v.reset(OpARMNMULD) 8264 v.AddArg2(x, y) 8265 return true 8266 } 8267 return false 8268 } 8269 func rewriteValueARM_OpARMNEGF(v *Value) bool { 8270 v_0 := v.Args[0] 8271 // match: (NEGF (MULF x y)) 8272 // cond: buildcfg.GOARM.Version >= 6 8273 // result: (NMULF x y) 8274 for { 8275 if v_0.Op != OpARMMULF { 8276 break 8277 } 8278 y := v_0.Args[1] 8279 x := v_0.Args[0] 8280 if !(buildcfg.GOARM.Version >= 6) { 8281 break 8282 } 8283 v.reset(OpARMNMULF) 8284 v.AddArg2(x, y) 8285 return true 8286 } 8287 return false 8288 } 8289 func rewriteValueARM_OpARMNMULD(v *Value) bool { 8290 v_1 := v.Args[1] 8291 v_0 := v.Args[0] 8292 // match: (NMULD (NEGD x) y) 8293 // result: (MULD x y) 8294 for { 8295 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8296 if v_0.Op != OpARMNEGD { 8297 continue 8298 } 8299 x := v_0.Args[0] 8300 y := v_1 8301 v.reset(OpARMMULD) 8302 v.AddArg2(x, y) 8303 return true 8304 } 8305 break 8306 } 8307 return false 8308 } 8309 func rewriteValueARM_OpARMNMULF(v *Value) bool { 8310 v_1 := v.Args[1] 8311 v_0 := v.Args[0] 8312 // match: (NMULF (NEGF x) y) 8313 // result: (MULF x y) 8314 for { 8315 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8316 if v_0.Op != OpARMNEGF { 8317 continue 8318 } 8319 x := v_0.Args[0] 8320 y := v_1 8321 v.reset(OpARMMULF) 8322 v.AddArg2(x, y) 8323 return true 8324 } 8325 break 8326 } 8327 return false 8328 } 8329 func rewriteValueARM_OpARMNotEqual(v *Value) bool { 8330 v_0 := v.Args[0] 8331 // match: (NotEqual (FlagConstant [fc])) 8332 // result: (MOVWconst [b2i32(fc.ne())]) 8333 for { 8334 if v_0.Op != OpARMFlagConstant { 8335 break 8336 } 8337 fc := auxIntToFlagConstant(v_0.AuxInt) 8338 v.reset(OpARMMOVWconst) 8339 v.AuxInt = int32ToAuxInt(b2i32(fc.ne())) 8340 return true 8341 } 8342 // match: (NotEqual (InvertFlags x)) 8343 // result: (NotEqual x) 8344 for { 8345 if v_0.Op != OpARMInvertFlags { 8346 break 8347 } 8348 x := v_0.Args[0] 8349 v.reset(OpARMNotEqual) 8350 v.AddArg(x) 8351 return true 8352 } 8353 return false 8354 } 8355 func rewriteValueARM_OpARMOR(v *Value) bool { 8356 v_1 := v.Args[1] 8357 v_0 := v.Args[0] 8358 // match: (OR x (MOVWconst [c])) 8359 // result: (ORconst [c] x) 8360 for { 8361 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8362 x := v_0 8363 if v_1.Op != OpARMMOVWconst { 8364 continue 8365 } 8366 c := auxIntToInt32(v_1.AuxInt) 8367 v.reset(OpARMORconst) 8368 v.AuxInt = int32ToAuxInt(c) 8369 v.AddArg(x) 8370 return true 8371 } 8372 break 8373 } 8374 // match: (OR x (SLLconst [c] y)) 8375 // result: (ORshiftLL x y [c]) 8376 for { 8377 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8378 x := v_0 8379 if v_1.Op != OpARMSLLconst { 8380 continue 8381 } 8382 c := auxIntToInt32(v_1.AuxInt) 8383 y := v_1.Args[0] 8384 v.reset(OpARMORshiftLL) 8385 v.AuxInt = int32ToAuxInt(c) 8386 v.AddArg2(x, y) 8387 return true 8388 } 8389 break 8390 } 8391 // match: (OR x (SRLconst [c] y)) 8392 // result: (ORshiftRL x y [c]) 8393 for { 8394 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8395 x := v_0 8396 if v_1.Op != OpARMSRLconst { 8397 continue 8398 } 8399 c := auxIntToInt32(v_1.AuxInt) 8400 y := v_1.Args[0] 8401 v.reset(OpARMORshiftRL) 8402 v.AuxInt = int32ToAuxInt(c) 8403 v.AddArg2(x, y) 8404 return true 8405 } 8406 break 8407 } 8408 // match: (OR x (SRAconst [c] y)) 8409 // result: (ORshiftRA x y [c]) 8410 for { 8411 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8412 x := v_0 8413 if v_1.Op != OpARMSRAconst { 8414 continue 8415 } 8416 c := auxIntToInt32(v_1.AuxInt) 8417 y := v_1.Args[0] 8418 v.reset(OpARMORshiftRA) 8419 v.AuxInt = int32ToAuxInt(c) 8420 v.AddArg2(x, y) 8421 return true 8422 } 8423 break 8424 } 8425 // match: (OR x (SLL y z)) 8426 // result: (ORshiftLLreg x y z) 8427 for { 8428 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8429 x := v_0 8430 if v_1.Op != OpARMSLL { 8431 continue 8432 } 8433 z := v_1.Args[1] 8434 y := v_1.Args[0] 8435 v.reset(OpARMORshiftLLreg) 8436 v.AddArg3(x, y, z) 8437 return true 8438 } 8439 break 8440 } 8441 // match: (OR x (SRL y z)) 8442 // result: (ORshiftRLreg x y z) 8443 for { 8444 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8445 x := v_0 8446 if v_1.Op != OpARMSRL { 8447 continue 8448 } 8449 z := v_1.Args[1] 8450 y := v_1.Args[0] 8451 v.reset(OpARMORshiftRLreg) 8452 v.AddArg3(x, y, z) 8453 return true 8454 } 8455 break 8456 } 8457 // match: (OR x (SRA y z)) 8458 // result: (ORshiftRAreg x y z) 8459 for { 8460 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 8461 x := v_0 8462 if v_1.Op != OpARMSRA { 8463 continue 8464 } 8465 z := v_1.Args[1] 8466 y := v_1.Args[0] 8467 v.reset(OpARMORshiftRAreg) 8468 v.AddArg3(x, y, z) 8469 return true 8470 } 8471 break 8472 } 8473 // match: (OR x x) 8474 // result: x 8475 for { 8476 x := v_0 8477 if x != v_1 { 8478 break 8479 } 8480 v.copyOf(x) 8481 return true 8482 } 8483 return false 8484 } 8485 func rewriteValueARM_OpARMORconst(v *Value) bool { 8486 v_0 := v.Args[0] 8487 // match: (ORconst [0] x) 8488 // result: x 8489 for { 8490 if auxIntToInt32(v.AuxInt) != 0 { 8491 break 8492 } 8493 x := v_0 8494 v.copyOf(x) 8495 return true 8496 } 8497 // match: (ORconst [c] _) 8498 // cond: int32(c)==-1 8499 // result: (MOVWconst [-1]) 8500 for { 8501 c := auxIntToInt32(v.AuxInt) 8502 if !(int32(c) == -1) { 8503 break 8504 } 8505 v.reset(OpARMMOVWconst) 8506 v.AuxInt = int32ToAuxInt(-1) 8507 return true 8508 } 8509 // match: (ORconst [c] (MOVWconst [d])) 8510 // result: (MOVWconst [c|d]) 8511 for { 8512 c := auxIntToInt32(v.AuxInt) 8513 if v_0.Op != OpARMMOVWconst { 8514 break 8515 } 8516 d := auxIntToInt32(v_0.AuxInt) 8517 v.reset(OpARMMOVWconst) 8518 v.AuxInt = int32ToAuxInt(c | d) 8519 return true 8520 } 8521 // match: (ORconst [c] (ORconst [d] x)) 8522 // result: (ORconst [c|d] x) 8523 for { 8524 c := auxIntToInt32(v.AuxInt) 8525 if v_0.Op != OpARMORconst { 8526 break 8527 } 8528 d := auxIntToInt32(v_0.AuxInt) 8529 x := v_0.Args[0] 8530 v.reset(OpARMORconst) 8531 v.AuxInt = int32ToAuxInt(c | d) 8532 v.AddArg(x) 8533 return true 8534 } 8535 return false 8536 } 8537 func rewriteValueARM_OpARMORshiftLL(v *Value) bool { 8538 v_1 := v.Args[1] 8539 v_0 := v.Args[0] 8540 b := v.Block 8541 typ := &b.Func.Config.Types 8542 // match: (ORshiftLL (MOVWconst [c]) x [d]) 8543 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 8544 for { 8545 d := auxIntToInt32(v.AuxInt) 8546 if v_0.Op != OpARMMOVWconst { 8547 break 8548 } 8549 c := auxIntToInt32(v_0.AuxInt) 8550 x := v_1 8551 v.reset(OpARMORconst) 8552 v.AuxInt = int32ToAuxInt(c) 8553 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8554 v0.AuxInt = int32ToAuxInt(d) 8555 v0.AddArg(x) 8556 v.AddArg(v0) 8557 return true 8558 } 8559 // match: (ORshiftLL x (MOVWconst [c]) [d]) 8560 // result: (ORconst x [c<<uint64(d)]) 8561 for { 8562 d := auxIntToInt32(v.AuxInt) 8563 x := v_0 8564 if v_1.Op != OpARMMOVWconst { 8565 break 8566 } 8567 c := auxIntToInt32(v_1.AuxInt) 8568 v.reset(OpARMORconst) 8569 v.AuxInt = int32ToAuxInt(c << uint64(d)) 8570 v.AddArg(x) 8571 return true 8572 } 8573 // match: (ORshiftLL <typ.UInt16> [8] (BFXU <typ.UInt16> [int32(armBFAuxInt(8, 8))] x) x) 8574 // result: (REV16 x) 8575 for { 8576 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)) { 8577 break 8578 } 8579 x := v_0.Args[0] 8580 if x != v_1 { 8581 break 8582 } 8583 v.reset(OpARMREV16) 8584 v.AddArg(x) 8585 return true 8586 } 8587 // match: (ORshiftLL <typ.UInt16> [8] (SRLconst <typ.UInt16> [24] (SLLconst [16] x)) x) 8588 // cond: buildcfg.GOARM.Version>=6 8589 // result: (REV16 x) 8590 for { 8591 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 { 8592 break 8593 } 8594 v_0_0 := v_0.Args[0] 8595 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 { 8596 break 8597 } 8598 x := v_0_0.Args[0] 8599 if x != v_1 || !(buildcfg.GOARM.Version >= 6) { 8600 break 8601 } 8602 v.reset(OpARMREV16) 8603 v.AddArg(x) 8604 return true 8605 } 8606 // match: (ORshiftLL y:(SLLconst x [c]) x [c]) 8607 // result: y 8608 for { 8609 c := auxIntToInt32(v.AuxInt) 8610 y := v_0 8611 if y.Op != OpARMSLLconst || auxIntToInt32(y.AuxInt) != c { 8612 break 8613 } 8614 x := y.Args[0] 8615 if x != v_1 { 8616 break 8617 } 8618 v.copyOf(y) 8619 return true 8620 } 8621 return false 8622 } 8623 func rewriteValueARM_OpARMORshiftLLreg(v *Value) bool { 8624 v_2 := v.Args[2] 8625 v_1 := v.Args[1] 8626 v_0 := v.Args[0] 8627 b := v.Block 8628 // match: (ORshiftLLreg (MOVWconst [c]) x y) 8629 // result: (ORconst [c] (SLL <x.Type> x y)) 8630 for { 8631 if v_0.Op != OpARMMOVWconst { 8632 break 8633 } 8634 c := auxIntToInt32(v_0.AuxInt) 8635 x := v_1 8636 y := v_2 8637 v.reset(OpARMORconst) 8638 v.AuxInt = int32ToAuxInt(c) 8639 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 8640 v0.AddArg2(x, y) 8641 v.AddArg(v0) 8642 return true 8643 } 8644 // match: (ORshiftLLreg x y (MOVWconst [c])) 8645 // cond: 0 <= c && c < 32 8646 // result: (ORshiftLL x y [c]) 8647 for { 8648 x := v_0 8649 y := v_1 8650 if v_2.Op != OpARMMOVWconst { 8651 break 8652 } 8653 c := auxIntToInt32(v_2.AuxInt) 8654 if !(0 <= c && c < 32) { 8655 break 8656 } 8657 v.reset(OpARMORshiftLL) 8658 v.AuxInt = int32ToAuxInt(c) 8659 v.AddArg2(x, y) 8660 return true 8661 } 8662 return false 8663 } 8664 func rewriteValueARM_OpARMORshiftRA(v *Value) bool { 8665 v_1 := v.Args[1] 8666 v_0 := v.Args[0] 8667 b := v.Block 8668 // match: (ORshiftRA (MOVWconst [c]) x [d]) 8669 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 8670 for { 8671 d := auxIntToInt32(v.AuxInt) 8672 if v_0.Op != OpARMMOVWconst { 8673 break 8674 } 8675 c := auxIntToInt32(v_0.AuxInt) 8676 x := v_1 8677 v.reset(OpARMORconst) 8678 v.AuxInt = int32ToAuxInt(c) 8679 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 8680 v0.AuxInt = int32ToAuxInt(d) 8681 v0.AddArg(x) 8682 v.AddArg(v0) 8683 return true 8684 } 8685 // match: (ORshiftRA x (MOVWconst [c]) [d]) 8686 // result: (ORconst x [c>>uint64(d)]) 8687 for { 8688 d := auxIntToInt32(v.AuxInt) 8689 x := v_0 8690 if v_1.Op != OpARMMOVWconst { 8691 break 8692 } 8693 c := auxIntToInt32(v_1.AuxInt) 8694 v.reset(OpARMORconst) 8695 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 8696 v.AddArg(x) 8697 return true 8698 } 8699 // match: (ORshiftRA y:(SRAconst x [c]) x [c]) 8700 // result: y 8701 for { 8702 c := auxIntToInt32(v.AuxInt) 8703 y := v_0 8704 if y.Op != OpARMSRAconst || auxIntToInt32(y.AuxInt) != c { 8705 break 8706 } 8707 x := y.Args[0] 8708 if x != v_1 { 8709 break 8710 } 8711 v.copyOf(y) 8712 return true 8713 } 8714 return false 8715 } 8716 func rewriteValueARM_OpARMORshiftRAreg(v *Value) bool { 8717 v_2 := v.Args[2] 8718 v_1 := v.Args[1] 8719 v_0 := v.Args[0] 8720 b := v.Block 8721 // match: (ORshiftRAreg (MOVWconst [c]) x y) 8722 // result: (ORconst [c] (SRA <x.Type> x y)) 8723 for { 8724 if v_0.Op != OpARMMOVWconst { 8725 break 8726 } 8727 c := auxIntToInt32(v_0.AuxInt) 8728 x := v_1 8729 y := v_2 8730 v.reset(OpARMORconst) 8731 v.AuxInt = int32ToAuxInt(c) 8732 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 8733 v0.AddArg2(x, y) 8734 v.AddArg(v0) 8735 return true 8736 } 8737 // match: (ORshiftRAreg x y (MOVWconst [c])) 8738 // cond: 0 <= c && c < 32 8739 // result: (ORshiftRA x y [c]) 8740 for { 8741 x := v_0 8742 y := v_1 8743 if v_2.Op != OpARMMOVWconst { 8744 break 8745 } 8746 c := auxIntToInt32(v_2.AuxInt) 8747 if !(0 <= c && c < 32) { 8748 break 8749 } 8750 v.reset(OpARMORshiftRA) 8751 v.AuxInt = int32ToAuxInt(c) 8752 v.AddArg2(x, y) 8753 return true 8754 } 8755 return false 8756 } 8757 func rewriteValueARM_OpARMORshiftRL(v *Value) bool { 8758 v_1 := v.Args[1] 8759 v_0 := v.Args[0] 8760 b := v.Block 8761 // match: (ORshiftRL (MOVWconst [c]) x [d]) 8762 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 8763 for { 8764 d := auxIntToInt32(v.AuxInt) 8765 if v_0.Op != OpARMMOVWconst { 8766 break 8767 } 8768 c := auxIntToInt32(v_0.AuxInt) 8769 x := v_1 8770 v.reset(OpARMORconst) 8771 v.AuxInt = int32ToAuxInt(c) 8772 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 8773 v0.AuxInt = int32ToAuxInt(d) 8774 v0.AddArg(x) 8775 v.AddArg(v0) 8776 return true 8777 } 8778 // match: (ORshiftRL x (MOVWconst [c]) [d]) 8779 // result: (ORconst x [int32(uint32(c)>>uint64(d))]) 8780 for { 8781 d := auxIntToInt32(v.AuxInt) 8782 x := v_0 8783 if v_1.Op != OpARMMOVWconst { 8784 break 8785 } 8786 c := auxIntToInt32(v_1.AuxInt) 8787 v.reset(OpARMORconst) 8788 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 8789 v.AddArg(x) 8790 return true 8791 } 8792 // match: (ORshiftRL y:(SRLconst x [c]) x [c]) 8793 // result: y 8794 for { 8795 c := auxIntToInt32(v.AuxInt) 8796 y := v_0 8797 if y.Op != OpARMSRLconst || auxIntToInt32(y.AuxInt) != c { 8798 break 8799 } 8800 x := y.Args[0] 8801 if x != v_1 { 8802 break 8803 } 8804 v.copyOf(y) 8805 return true 8806 } 8807 return false 8808 } 8809 func rewriteValueARM_OpARMORshiftRLreg(v *Value) bool { 8810 v_2 := v.Args[2] 8811 v_1 := v.Args[1] 8812 v_0 := v.Args[0] 8813 b := v.Block 8814 // match: (ORshiftRLreg (MOVWconst [c]) x y) 8815 // result: (ORconst [c] (SRL <x.Type> x y)) 8816 for { 8817 if v_0.Op != OpARMMOVWconst { 8818 break 8819 } 8820 c := auxIntToInt32(v_0.AuxInt) 8821 x := v_1 8822 y := v_2 8823 v.reset(OpARMORconst) 8824 v.AuxInt = int32ToAuxInt(c) 8825 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 8826 v0.AddArg2(x, y) 8827 v.AddArg(v0) 8828 return true 8829 } 8830 // match: (ORshiftRLreg x y (MOVWconst [c])) 8831 // cond: 0 <= c && c < 32 8832 // result: (ORshiftRL x y [c]) 8833 for { 8834 x := v_0 8835 y := v_1 8836 if v_2.Op != OpARMMOVWconst { 8837 break 8838 } 8839 c := auxIntToInt32(v_2.AuxInt) 8840 if !(0 <= c && c < 32) { 8841 break 8842 } 8843 v.reset(OpARMORshiftRL) 8844 v.AuxInt = int32ToAuxInt(c) 8845 v.AddArg2(x, y) 8846 return true 8847 } 8848 return false 8849 } 8850 func rewriteValueARM_OpARMRSB(v *Value) bool { 8851 v_1 := v.Args[1] 8852 v_0 := v.Args[0] 8853 // match: (RSB (MOVWconst [c]) x) 8854 // result: (SUBconst [c] x) 8855 for { 8856 if v_0.Op != OpARMMOVWconst { 8857 break 8858 } 8859 c := auxIntToInt32(v_0.AuxInt) 8860 x := v_1 8861 v.reset(OpARMSUBconst) 8862 v.AuxInt = int32ToAuxInt(c) 8863 v.AddArg(x) 8864 return true 8865 } 8866 // match: (RSB x (MOVWconst [c])) 8867 // result: (RSBconst [c] x) 8868 for { 8869 x := v_0 8870 if v_1.Op != OpARMMOVWconst { 8871 break 8872 } 8873 c := auxIntToInt32(v_1.AuxInt) 8874 v.reset(OpARMRSBconst) 8875 v.AuxInt = int32ToAuxInt(c) 8876 v.AddArg(x) 8877 return true 8878 } 8879 // match: (RSB x (SLLconst [c] y)) 8880 // result: (RSBshiftLL x y [c]) 8881 for { 8882 x := v_0 8883 if v_1.Op != OpARMSLLconst { 8884 break 8885 } 8886 c := auxIntToInt32(v_1.AuxInt) 8887 y := v_1.Args[0] 8888 v.reset(OpARMRSBshiftLL) 8889 v.AuxInt = int32ToAuxInt(c) 8890 v.AddArg2(x, y) 8891 return true 8892 } 8893 // match: (RSB (SLLconst [c] y) x) 8894 // result: (SUBshiftLL x y [c]) 8895 for { 8896 if v_0.Op != OpARMSLLconst { 8897 break 8898 } 8899 c := auxIntToInt32(v_0.AuxInt) 8900 y := v_0.Args[0] 8901 x := v_1 8902 v.reset(OpARMSUBshiftLL) 8903 v.AuxInt = int32ToAuxInt(c) 8904 v.AddArg2(x, y) 8905 return true 8906 } 8907 // match: (RSB x (SRLconst [c] y)) 8908 // result: (RSBshiftRL x y [c]) 8909 for { 8910 x := v_0 8911 if v_1.Op != OpARMSRLconst { 8912 break 8913 } 8914 c := auxIntToInt32(v_1.AuxInt) 8915 y := v_1.Args[0] 8916 v.reset(OpARMRSBshiftRL) 8917 v.AuxInt = int32ToAuxInt(c) 8918 v.AddArg2(x, y) 8919 return true 8920 } 8921 // match: (RSB (SRLconst [c] y) x) 8922 // result: (SUBshiftRL x y [c]) 8923 for { 8924 if v_0.Op != OpARMSRLconst { 8925 break 8926 } 8927 c := auxIntToInt32(v_0.AuxInt) 8928 y := v_0.Args[0] 8929 x := v_1 8930 v.reset(OpARMSUBshiftRL) 8931 v.AuxInt = int32ToAuxInt(c) 8932 v.AddArg2(x, y) 8933 return true 8934 } 8935 // match: (RSB x (SRAconst [c] y)) 8936 // result: (RSBshiftRA x y [c]) 8937 for { 8938 x := v_0 8939 if v_1.Op != OpARMSRAconst { 8940 break 8941 } 8942 c := auxIntToInt32(v_1.AuxInt) 8943 y := v_1.Args[0] 8944 v.reset(OpARMRSBshiftRA) 8945 v.AuxInt = int32ToAuxInt(c) 8946 v.AddArg2(x, y) 8947 return true 8948 } 8949 // match: (RSB (SRAconst [c] y) x) 8950 // result: (SUBshiftRA x y [c]) 8951 for { 8952 if v_0.Op != OpARMSRAconst { 8953 break 8954 } 8955 c := auxIntToInt32(v_0.AuxInt) 8956 y := v_0.Args[0] 8957 x := v_1 8958 v.reset(OpARMSUBshiftRA) 8959 v.AuxInt = int32ToAuxInt(c) 8960 v.AddArg2(x, y) 8961 return true 8962 } 8963 // match: (RSB x (SLL y z)) 8964 // result: (RSBshiftLLreg x y z) 8965 for { 8966 x := v_0 8967 if v_1.Op != OpARMSLL { 8968 break 8969 } 8970 z := v_1.Args[1] 8971 y := v_1.Args[0] 8972 v.reset(OpARMRSBshiftLLreg) 8973 v.AddArg3(x, y, z) 8974 return true 8975 } 8976 // match: (RSB (SLL y z) x) 8977 // result: (SUBshiftLLreg x y z) 8978 for { 8979 if v_0.Op != OpARMSLL { 8980 break 8981 } 8982 z := v_0.Args[1] 8983 y := v_0.Args[0] 8984 x := v_1 8985 v.reset(OpARMSUBshiftLLreg) 8986 v.AddArg3(x, y, z) 8987 return true 8988 } 8989 // match: (RSB x (SRL y z)) 8990 // result: (RSBshiftRLreg x y z) 8991 for { 8992 x := v_0 8993 if v_1.Op != OpARMSRL { 8994 break 8995 } 8996 z := v_1.Args[1] 8997 y := v_1.Args[0] 8998 v.reset(OpARMRSBshiftRLreg) 8999 v.AddArg3(x, y, z) 9000 return true 9001 } 9002 // match: (RSB (SRL y z) x) 9003 // result: (SUBshiftRLreg x y z) 9004 for { 9005 if v_0.Op != OpARMSRL { 9006 break 9007 } 9008 z := v_0.Args[1] 9009 y := v_0.Args[0] 9010 x := v_1 9011 v.reset(OpARMSUBshiftRLreg) 9012 v.AddArg3(x, y, z) 9013 return true 9014 } 9015 // match: (RSB x (SRA y z)) 9016 // result: (RSBshiftRAreg x y z) 9017 for { 9018 x := v_0 9019 if v_1.Op != OpARMSRA { 9020 break 9021 } 9022 z := v_1.Args[1] 9023 y := v_1.Args[0] 9024 v.reset(OpARMRSBshiftRAreg) 9025 v.AddArg3(x, y, z) 9026 return true 9027 } 9028 // match: (RSB (SRA y z) x) 9029 // result: (SUBshiftRAreg x y z) 9030 for { 9031 if v_0.Op != OpARMSRA { 9032 break 9033 } 9034 z := v_0.Args[1] 9035 y := v_0.Args[0] 9036 x := v_1 9037 v.reset(OpARMSUBshiftRAreg) 9038 v.AddArg3(x, y, z) 9039 return true 9040 } 9041 // match: (RSB x x) 9042 // result: (MOVWconst [0]) 9043 for { 9044 x := v_0 9045 if x != v_1 { 9046 break 9047 } 9048 v.reset(OpARMMOVWconst) 9049 v.AuxInt = int32ToAuxInt(0) 9050 return true 9051 } 9052 // match: (RSB (MUL x y) a) 9053 // cond: buildcfg.GOARM.Version == 7 9054 // result: (MULS x y a) 9055 for { 9056 if v_0.Op != OpARMMUL { 9057 break 9058 } 9059 y := v_0.Args[1] 9060 x := v_0.Args[0] 9061 a := v_1 9062 if !(buildcfg.GOARM.Version == 7) { 9063 break 9064 } 9065 v.reset(OpARMMULS) 9066 v.AddArg3(x, y, a) 9067 return true 9068 } 9069 return false 9070 } 9071 func rewriteValueARM_OpARMRSBSshiftLL(v *Value) bool { 9072 v_1 := v.Args[1] 9073 v_0 := v.Args[0] 9074 b := v.Block 9075 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 9076 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 9077 for { 9078 d := auxIntToInt32(v.AuxInt) 9079 if v_0.Op != OpARMMOVWconst { 9080 break 9081 } 9082 c := auxIntToInt32(v_0.AuxInt) 9083 x := v_1 9084 v.reset(OpARMSUBSconst) 9085 v.AuxInt = int32ToAuxInt(c) 9086 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9087 v0.AuxInt = int32ToAuxInt(d) 9088 v0.AddArg(x) 9089 v.AddArg(v0) 9090 return true 9091 } 9092 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 9093 // result: (RSBSconst x [c<<uint64(d)]) 9094 for { 9095 d := auxIntToInt32(v.AuxInt) 9096 x := v_0 9097 if v_1.Op != OpARMMOVWconst { 9098 break 9099 } 9100 c := auxIntToInt32(v_1.AuxInt) 9101 v.reset(OpARMRSBSconst) 9102 v.AuxInt = int32ToAuxInt(c << uint64(d)) 9103 v.AddArg(x) 9104 return true 9105 } 9106 return false 9107 } 9108 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value) bool { 9109 v_2 := v.Args[2] 9110 v_1 := v.Args[1] 9111 v_0 := v.Args[0] 9112 b := v.Block 9113 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 9114 // result: (SUBSconst [c] (SLL <x.Type> x y)) 9115 for { 9116 if v_0.Op != OpARMMOVWconst { 9117 break 9118 } 9119 c := auxIntToInt32(v_0.AuxInt) 9120 x := v_1 9121 y := v_2 9122 v.reset(OpARMSUBSconst) 9123 v.AuxInt = int32ToAuxInt(c) 9124 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9125 v0.AddArg2(x, y) 9126 v.AddArg(v0) 9127 return true 9128 } 9129 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 9130 // cond: 0 <= c && c < 32 9131 // result: (RSBSshiftLL x y [c]) 9132 for { 9133 x := v_0 9134 y := v_1 9135 if v_2.Op != OpARMMOVWconst { 9136 break 9137 } 9138 c := auxIntToInt32(v_2.AuxInt) 9139 if !(0 <= c && c < 32) { 9140 break 9141 } 9142 v.reset(OpARMRSBSshiftLL) 9143 v.AuxInt = int32ToAuxInt(c) 9144 v.AddArg2(x, y) 9145 return true 9146 } 9147 return false 9148 } 9149 func rewriteValueARM_OpARMRSBSshiftRA(v *Value) bool { 9150 v_1 := v.Args[1] 9151 v_0 := v.Args[0] 9152 b := v.Block 9153 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 9154 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 9155 for { 9156 d := auxIntToInt32(v.AuxInt) 9157 if v_0.Op != OpARMMOVWconst { 9158 break 9159 } 9160 c := auxIntToInt32(v_0.AuxInt) 9161 x := v_1 9162 v.reset(OpARMSUBSconst) 9163 v.AuxInt = int32ToAuxInt(c) 9164 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9165 v0.AuxInt = int32ToAuxInt(d) 9166 v0.AddArg(x) 9167 v.AddArg(v0) 9168 return true 9169 } 9170 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 9171 // result: (RSBSconst x [c>>uint64(d)]) 9172 for { 9173 d := auxIntToInt32(v.AuxInt) 9174 x := v_0 9175 if v_1.Op != OpARMMOVWconst { 9176 break 9177 } 9178 c := auxIntToInt32(v_1.AuxInt) 9179 v.reset(OpARMRSBSconst) 9180 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 9181 v.AddArg(x) 9182 return true 9183 } 9184 return false 9185 } 9186 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value) bool { 9187 v_2 := v.Args[2] 9188 v_1 := v.Args[1] 9189 v_0 := v.Args[0] 9190 b := v.Block 9191 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 9192 // result: (SUBSconst [c] (SRA <x.Type> x y)) 9193 for { 9194 if v_0.Op != OpARMMOVWconst { 9195 break 9196 } 9197 c := auxIntToInt32(v_0.AuxInt) 9198 x := v_1 9199 y := v_2 9200 v.reset(OpARMSUBSconst) 9201 v.AuxInt = int32ToAuxInt(c) 9202 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9203 v0.AddArg2(x, y) 9204 v.AddArg(v0) 9205 return true 9206 } 9207 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 9208 // cond: 0 <= c && c < 32 9209 // result: (RSBSshiftRA x y [c]) 9210 for { 9211 x := v_0 9212 y := v_1 9213 if v_2.Op != OpARMMOVWconst { 9214 break 9215 } 9216 c := auxIntToInt32(v_2.AuxInt) 9217 if !(0 <= c && c < 32) { 9218 break 9219 } 9220 v.reset(OpARMRSBSshiftRA) 9221 v.AuxInt = int32ToAuxInt(c) 9222 v.AddArg2(x, y) 9223 return true 9224 } 9225 return false 9226 } 9227 func rewriteValueARM_OpARMRSBSshiftRL(v *Value) bool { 9228 v_1 := v.Args[1] 9229 v_0 := v.Args[0] 9230 b := v.Block 9231 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 9232 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 9233 for { 9234 d := auxIntToInt32(v.AuxInt) 9235 if v_0.Op != OpARMMOVWconst { 9236 break 9237 } 9238 c := auxIntToInt32(v_0.AuxInt) 9239 x := v_1 9240 v.reset(OpARMSUBSconst) 9241 v.AuxInt = int32ToAuxInt(c) 9242 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9243 v0.AuxInt = int32ToAuxInt(d) 9244 v0.AddArg(x) 9245 v.AddArg(v0) 9246 return true 9247 } 9248 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 9249 // result: (RSBSconst x [int32(uint32(c)>>uint64(d))]) 9250 for { 9251 d := auxIntToInt32(v.AuxInt) 9252 x := v_0 9253 if v_1.Op != OpARMMOVWconst { 9254 break 9255 } 9256 c := auxIntToInt32(v_1.AuxInt) 9257 v.reset(OpARMRSBSconst) 9258 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 9259 v.AddArg(x) 9260 return true 9261 } 9262 return false 9263 } 9264 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value) bool { 9265 v_2 := v.Args[2] 9266 v_1 := v.Args[1] 9267 v_0 := v.Args[0] 9268 b := v.Block 9269 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 9270 // result: (SUBSconst [c] (SRL <x.Type> x y)) 9271 for { 9272 if v_0.Op != OpARMMOVWconst { 9273 break 9274 } 9275 c := auxIntToInt32(v_0.AuxInt) 9276 x := v_1 9277 y := v_2 9278 v.reset(OpARMSUBSconst) 9279 v.AuxInt = int32ToAuxInt(c) 9280 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9281 v0.AddArg2(x, y) 9282 v.AddArg(v0) 9283 return true 9284 } 9285 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 9286 // cond: 0 <= c && c < 32 9287 // result: (RSBSshiftRL x y [c]) 9288 for { 9289 x := v_0 9290 y := v_1 9291 if v_2.Op != OpARMMOVWconst { 9292 break 9293 } 9294 c := auxIntToInt32(v_2.AuxInt) 9295 if !(0 <= c && c < 32) { 9296 break 9297 } 9298 v.reset(OpARMRSBSshiftRL) 9299 v.AuxInt = int32ToAuxInt(c) 9300 v.AddArg2(x, y) 9301 return true 9302 } 9303 return false 9304 } 9305 func rewriteValueARM_OpARMRSBconst(v *Value) bool { 9306 v_0 := v.Args[0] 9307 // match: (RSBconst [c] (MOVWconst [d])) 9308 // result: (MOVWconst [c-d]) 9309 for { 9310 c := auxIntToInt32(v.AuxInt) 9311 if v_0.Op != OpARMMOVWconst { 9312 break 9313 } 9314 d := auxIntToInt32(v_0.AuxInt) 9315 v.reset(OpARMMOVWconst) 9316 v.AuxInt = int32ToAuxInt(c - d) 9317 return true 9318 } 9319 // match: (RSBconst [c] (RSBconst [d] x)) 9320 // result: (ADDconst [c-d] x) 9321 for { 9322 c := auxIntToInt32(v.AuxInt) 9323 if v_0.Op != OpARMRSBconst { 9324 break 9325 } 9326 d := auxIntToInt32(v_0.AuxInt) 9327 x := v_0.Args[0] 9328 v.reset(OpARMADDconst) 9329 v.AuxInt = int32ToAuxInt(c - d) 9330 v.AddArg(x) 9331 return true 9332 } 9333 // match: (RSBconst [c] (ADDconst [d] x)) 9334 // result: (RSBconst [c-d] x) 9335 for { 9336 c := auxIntToInt32(v.AuxInt) 9337 if v_0.Op != OpARMADDconst { 9338 break 9339 } 9340 d := auxIntToInt32(v_0.AuxInt) 9341 x := v_0.Args[0] 9342 v.reset(OpARMRSBconst) 9343 v.AuxInt = int32ToAuxInt(c - d) 9344 v.AddArg(x) 9345 return true 9346 } 9347 // match: (RSBconst [c] (SUBconst [d] x)) 9348 // result: (RSBconst [c+d] x) 9349 for { 9350 c := auxIntToInt32(v.AuxInt) 9351 if v_0.Op != OpARMSUBconst { 9352 break 9353 } 9354 d := auxIntToInt32(v_0.AuxInt) 9355 x := v_0.Args[0] 9356 v.reset(OpARMRSBconst) 9357 v.AuxInt = int32ToAuxInt(c + d) 9358 v.AddArg(x) 9359 return true 9360 } 9361 return false 9362 } 9363 func rewriteValueARM_OpARMRSBshiftLL(v *Value) bool { 9364 v_1 := v.Args[1] 9365 v_0 := v.Args[0] 9366 b := v.Block 9367 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 9368 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 9369 for { 9370 d := auxIntToInt32(v.AuxInt) 9371 if v_0.Op != OpARMMOVWconst { 9372 break 9373 } 9374 c := auxIntToInt32(v_0.AuxInt) 9375 x := v_1 9376 v.reset(OpARMSUBconst) 9377 v.AuxInt = int32ToAuxInt(c) 9378 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9379 v0.AuxInt = int32ToAuxInt(d) 9380 v0.AddArg(x) 9381 v.AddArg(v0) 9382 return true 9383 } 9384 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 9385 // result: (RSBconst x [c<<uint64(d)]) 9386 for { 9387 d := auxIntToInt32(v.AuxInt) 9388 x := v_0 9389 if v_1.Op != OpARMMOVWconst { 9390 break 9391 } 9392 c := auxIntToInt32(v_1.AuxInt) 9393 v.reset(OpARMRSBconst) 9394 v.AuxInt = int32ToAuxInt(c << uint64(d)) 9395 v.AddArg(x) 9396 return true 9397 } 9398 // match: (RSBshiftLL (SLLconst x [c]) x [c]) 9399 // result: (MOVWconst [0]) 9400 for { 9401 c := auxIntToInt32(v.AuxInt) 9402 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c { 9403 break 9404 } 9405 x := v_0.Args[0] 9406 if x != v_1 { 9407 break 9408 } 9409 v.reset(OpARMMOVWconst) 9410 v.AuxInt = int32ToAuxInt(0) 9411 return true 9412 } 9413 return false 9414 } 9415 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value) bool { 9416 v_2 := v.Args[2] 9417 v_1 := v.Args[1] 9418 v_0 := v.Args[0] 9419 b := v.Block 9420 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 9421 // result: (SUBconst [c] (SLL <x.Type> x y)) 9422 for { 9423 if v_0.Op != OpARMMOVWconst { 9424 break 9425 } 9426 c := auxIntToInt32(v_0.AuxInt) 9427 x := v_1 9428 y := v_2 9429 v.reset(OpARMSUBconst) 9430 v.AuxInt = int32ToAuxInt(c) 9431 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9432 v0.AddArg2(x, y) 9433 v.AddArg(v0) 9434 return true 9435 } 9436 // match: (RSBshiftLLreg x y (MOVWconst [c])) 9437 // cond: 0 <= c && c < 32 9438 // result: (RSBshiftLL x y [c]) 9439 for { 9440 x := v_0 9441 y := v_1 9442 if v_2.Op != OpARMMOVWconst { 9443 break 9444 } 9445 c := auxIntToInt32(v_2.AuxInt) 9446 if !(0 <= c && c < 32) { 9447 break 9448 } 9449 v.reset(OpARMRSBshiftLL) 9450 v.AuxInt = int32ToAuxInt(c) 9451 v.AddArg2(x, y) 9452 return true 9453 } 9454 return false 9455 } 9456 func rewriteValueARM_OpARMRSBshiftRA(v *Value) bool { 9457 v_1 := v.Args[1] 9458 v_0 := v.Args[0] 9459 b := v.Block 9460 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 9461 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 9462 for { 9463 d := auxIntToInt32(v.AuxInt) 9464 if v_0.Op != OpARMMOVWconst { 9465 break 9466 } 9467 c := auxIntToInt32(v_0.AuxInt) 9468 x := v_1 9469 v.reset(OpARMSUBconst) 9470 v.AuxInt = int32ToAuxInt(c) 9471 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9472 v0.AuxInt = int32ToAuxInt(d) 9473 v0.AddArg(x) 9474 v.AddArg(v0) 9475 return true 9476 } 9477 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 9478 // result: (RSBconst x [c>>uint64(d)]) 9479 for { 9480 d := auxIntToInt32(v.AuxInt) 9481 x := v_0 9482 if v_1.Op != OpARMMOVWconst { 9483 break 9484 } 9485 c := auxIntToInt32(v_1.AuxInt) 9486 v.reset(OpARMRSBconst) 9487 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 9488 v.AddArg(x) 9489 return true 9490 } 9491 // match: (RSBshiftRA (SRAconst x [c]) x [c]) 9492 // result: (MOVWconst [0]) 9493 for { 9494 c := auxIntToInt32(v.AuxInt) 9495 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c { 9496 break 9497 } 9498 x := v_0.Args[0] 9499 if x != v_1 { 9500 break 9501 } 9502 v.reset(OpARMMOVWconst) 9503 v.AuxInt = int32ToAuxInt(0) 9504 return true 9505 } 9506 return false 9507 } 9508 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value) bool { 9509 v_2 := v.Args[2] 9510 v_1 := v.Args[1] 9511 v_0 := v.Args[0] 9512 b := v.Block 9513 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 9514 // result: (SUBconst [c] (SRA <x.Type> x y)) 9515 for { 9516 if v_0.Op != OpARMMOVWconst { 9517 break 9518 } 9519 c := auxIntToInt32(v_0.AuxInt) 9520 x := v_1 9521 y := v_2 9522 v.reset(OpARMSUBconst) 9523 v.AuxInt = int32ToAuxInt(c) 9524 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9525 v0.AddArg2(x, y) 9526 v.AddArg(v0) 9527 return true 9528 } 9529 // match: (RSBshiftRAreg x y (MOVWconst [c])) 9530 // cond: 0 <= c && c < 32 9531 // result: (RSBshiftRA x y [c]) 9532 for { 9533 x := v_0 9534 y := v_1 9535 if v_2.Op != OpARMMOVWconst { 9536 break 9537 } 9538 c := auxIntToInt32(v_2.AuxInt) 9539 if !(0 <= c && c < 32) { 9540 break 9541 } 9542 v.reset(OpARMRSBshiftRA) 9543 v.AuxInt = int32ToAuxInt(c) 9544 v.AddArg2(x, y) 9545 return true 9546 } 9547 return false 9548 } 9549 func rewriteValueARM_OpARMRSBshiftRL(v *Value) bool { 9550 v_1 := v.Args[1] 9551 v_0 := v.Args[0] 9552 b := v.Block 9553 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 9554 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 9555 for { 9556 d := auxIntToInt32(v.AuxInt) 9557 if v_0.Op != OpARMMOVWconst { 9558 break 9559 } 9560 c := auxIntToInt32(v_0.AuxInt) 9561 x := v_1 9562 v.reset(OpARMSUBconst) 9563 v.AuxInt = int32ToAuxInt(c) 9564 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9565 v0.AuxInt = int32ToAuxInt(d) 9566 v0.AddArg(x) 9567 v.AddArg(v0) 9568 return true 9569 } 9570 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 9571 // result: (RSBconst x [int32(uint32(c)>>uint64(d))]) 9572 for { 9573 d := auxIntToInt32(v.AuxInt) 9574 x := v_0 9575 if v_1.Op != OpARMMOVWconst { 9576 break 9577 } 9578 c := auxIntToInt32(v_1.AuxInt) 9579 v.reset(OpARMRSBconst) 9580 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 9581 v.AddArg(x) 9582 return true 9583 } 9584 // match: (RSBshiftRL (SRLconst x [c]) x [c]) 9585 // result: (MOVWconst [0]) 9586 for { 9587 c := auxIntToInt32(v.AuxInt) 9588 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c { 9589 break 9590 } 9591 x := v_0.Args[0] 9592 if x != v_1 { 9593 break 9594 } 9595 v.reset(OpARMMOVWconst) 9596 v.AuxInt = int32ToAuxInt(0) 9597 return true 9598 } 9599 return false 9600 } 9601 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value) bool { 9602 v_2 := v.Args[2] 9603 v_1 := v.Args[1] 9604 v_0 := v.Args[0] 9605 b := v.Block 9606 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 9607 // result: (SUBconst [c] (SRL <x.Type> x y)) 9608 for { 9609 if v_0.Op != OpARMMOVWconst { 9610 break 9611 } 9612 c := auxIntToInt32(v_0.AuxInt) 9613 x := v_1 9614 y := v_2 9615 v.reset(OpARMSUBconst) 9616 v.AuxInt = int32ToAuxInt(c) 9617 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9618 v0.AddArg2(x, y) 9619 v.AddArg(v0) 9620 return true 9621 } 9622 // match: (RSBshiftRLreg x y (MOVWconst [c])) 9623 // cond: 0 <= c && c < 32 9624 // result: (RSBshiftRL x y [c]) 9625 for { 9626 x := v_0 9627 y := v_1 9628 if v_2.Op != OpARMMOVWconst { 9629 break 9630 } 9631 c := auxIntToInt32(v_2.AuxInt) 9632 if !(0 <= c && c < 32) { 9633 break 9634 } 9635 v.reset(OpARMRSBshiftRL) 9636 v.AuxInt = int32ToAuxInt(c) 9637 v.AddArg2(x, y) 9638 return true 9639 } 9640 return false 9641 } 9642 func rewriteValueARM_OpARMRSCconst(v *Value) bool { 9643 v_1 := v.Args[1] 9644 v_0 := v.Args[0] 9645 // match: (RSCconst [c] (ADDconst [d] x) flags) 9646 // result: (RSCconst [c-d] x flags) 9647 for { 9648 c := auxIntToInt32(v.AuxInt) 9649 if v_0.Op != OpARMADDconst { 9650 break 9651 } 9652 d := auxIntToInt32(v_0.AuxInt) 9653 x := v_0.Args[0] 9654 flags := v_1 9655 v.reset(OpARMRSCconst) 9656 v.AuxInt = int32ToAuxInt(c - d) 9657 v.AddArg2(x, flags) 9658 return true 9659 } 9660 // match: (RSCconst [c] (SUBconst [d] x) flags) 9661 // result: (RSCconst [c+d] x flags) 9662 for { 9663 c := auxIntToInt32(v.AuxInt) 9664 if v_0.Op != OpARMSUBconst { 9665 break 9666 } 9667 d := auxIntToInt32(v_0.AuxInt) 9668 x := v_0.Args[0] 9669 flags := v_1 9670 v.reset(OpARMRSCconst) 9671 v.AuxInt = int32ToAuxInt(c + d) 9672 v.AddArg2(x, flags) 9673 return true 9674 } 9675 return false 9676 } 9677 func rewriteValueARM_OpARMRSCshiftLL(v *Value) bool { 9678 v_2 := v.Args[2] 9679 v_1 := v.Args[1] 9680 v_0 := v.Args[0] 9681 b := v.Block 9682 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 9683 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 9684 for { 9685 d := auxIntToInt32(v.AuxInt) 9686 if v_0.Op != OpARMMOVWconst { 9687 break 9688 } 9689 c := auxIntToInt32(v_0.AuxInt) 9690 x := v_1 9691 flags := v_2 9692 v.reset(OpARMSBCconst) 9693 v.AuxInt = int32ToAuxInt(c) 9694 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9695 v0.AuxInt = int32ToAuxInt(d) 9696 v0.AddArg(x) 9697 v.AddArg2(v0, flags) 9698 return true 9699 } 9700 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 9701 // result: (RSCconst x [c<<uint64(d)] flags) 9702 for { 9703 d := auxIntToInt32(v.AuxInt) 9704 x := v_0 9705 if v_1.Op != OpARMMOVWconst { 9706 break 9707 } 9708 c := auxIntToInt32(v_1.AuxInt) 9709 flags := v_2 9710 v.reset(OpARMRSCconst) 9711 v.AuxInt = int32ToAuxInt(c << uint64(d)) 9712 v.AddArg2(x, flags) 9713 return true 9714 } 9715 return false 9716 } 9717 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value) bool { 9718 v_3 := v.Args[3] 9719 v_2 := v.Args[2] 9720 v_1 := v.Args[1] 9721 v_0 := v.Args[0] 9722 b := v.Block 9723 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 9724 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 9725 for { 9726 if v_0.Op != OpARMMOVWconst { 9727 break 9728 } 9729 c := auxIntToInt32(v_0.AuxInt) 9730 x := v_1 9731 y := v_2 9732 flags := v_3 9733 v.reset(OpARMSBCconst) 9734 v.AuxInt = int32ToAuxInt(c) 9735 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9736 v0.AddArg2(x, y) 9737 v.AddArg2(v0, flags) 9738 return true 9739 } 9740 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 9741 // cond: 0 <= c && c < 32 9742 // result: (RSCshiftLL x y [c] flags) 9743 for { 9744 x := v_0 9745 y := v_1 9746 if v_2.Op != OpARMMOVWconst { 9747 break 9748 } 9749 c := auxIntToInt32(v_2.AuxInt) 9750 flags := v_3 9751 if !(0 <= c && c < 32) { 9752 break 9753 } 9754 v.reset(OpARMRSCshiftLL) 9755 v.AuxInt = int32ToAuxInt(c) 9756 v.AddArg3(x, y, flags) 9757 return true 9758 } 9759 return false 9760 } 9761 func rewriteValueARM_OpARMRSCshiftRA(v *Value) bool { 9762 v_2 := v.Args[2] 9763 v_1 := v.Args[1] 9764 v_0 := v.Args[0] 9765 b := v.Block 9766 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 9767 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 9768 for { 9769 d := auxIntToInt32(v.AuxInt) 9770 if v_0.Op != OpARMMOVWconst { 9771 break 9772 } 9773 c := auxIntToInt32(v_0.AuxInt) 9774 x := v_1 9775 flags := v_2 9776 v.reset(OpARMSBCconst) 9777 v.AuxInt = int32ToAuxInt(c) 9778 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9779 v0.AuxInt = int32ToAuxInt(d) 9780 v0.AddArg(x) 9781 v.AddArg2(v0, flags) 9782 return true 9783 } 9784 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 9785 // result: (RSCconst x [c>>uint64(d)] flags) 9786 for { 9787 d := auxIntToInt32(v.AuxInt) 9788 x := v_0 9789 if v_1.Op != OpARMMOVWconst { 9790 break 9791 } 9792 c := auxIntToInt32(v_1.AuxInt) 9793 flags := v_2 9794 v.reset(OpARMRSCconst) 9795 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 9796 v.AddArg2(x, flags) 9797 return true 9798 } 9799 return false 9800 } 9801 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value) bool { 9802 v_3 := v.Args[3] 9803 v_2 := v.Args[2] 9804 v_1 := v.Args[1] 9805 v_0 := v.Args[0] 9806 b := v.Block 9807 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 9808 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 9809 for { 9810 if v_0.Op != OpARMMOVWconst { 9811 break 9812 } 9813 c := auxIntToInt32(v_0.AuxInt) 9814 x := v_1 9815 y := v_2 9816 flags := v_3 9817 v.reset(OpARMSBCconst) 9818 v.AuxInt = int32ToAuxInt(c) 9819 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9820 v0.AddArg2(x, y) 9821 v.AddArg2(v0, flags) 9822 return true 9823 } 9824 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 9825 // cond: 0 <= c && c < 32 9826 // result: (RSCshiftRA x y [c] flags) 9827 for { 9828 x := v_0 9829 y := v_1 9830 if v_2.Op != OpARMMOVWconst { 9831 break 9832 } 9833 c := auxIntToInt32(v_2.AuxInt) 9834 flags := v_3 9835 if !(0 <= c && c < 32) { 9836 break 9837 } 9838 v.reset(OpARMRSCshiftRA) 9839 v.AuxInt = int32ToAuxInt(c) 9840 v.AddArg3(x, y, flags) 9841 return true 9842 } 9843 return false 9844 } 9845 func rewriteValueARM_OpARMRSCshiftRL(v *Value) bool { 9846 v_2 := v.Args[2] 9847 v_1 := v.Args[1] 9848 v_0 := v.Args[0] 9849 b := v.Block 9850 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 9851 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 9852 for { 9853 d := auxIntToInt32(v.AuxInt) 9854 if v_0.Op != OpARMMOVWconst { 9855 break 9856 } 9857 c := auxIntToInt32(v_0.AuxInt) 9858 x := v_1 9859 flags := v_2 9860 v.reset(OpARMSBCconst) 9861 v.AuxInt = int32ToAuxInt(c) 9862 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9863 v0.AuxInt = int32ToAuxInt(d) 9864 v0.AddArg(x) 9865 v.AddArg2(v0, flags) 9866 return true 9867 } 9868 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 9869 // result: (RSCconst x [int32(uint32(c)>>uint64(d))] flags) 9870 for { 9871 d := auxIntToInt32(v.AuxInt) 9872 x := v_0 9873 if v_1.Op != OpARMMOVWconst { 9874 break 9875 } 9876 c := auxIntToInt32(v_1.AuxInt) 9877 flags := v_2 9878 v.reset(OpARMRSCconst) 9879 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 9880 v.AddArg2(x, flags) 9881 return true 9882 } 9883 return false 9884 } 9885 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value) bool { 9886 v_3 := v.Args[3] 9887 v_2 := v.Args[2] 9888 v_1 := v.Args[1] 9889 v_0 := v.Args[0] 9890 b := v.Block 9891 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 9892 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 9893 for { 9894 if v_0.Op != OpARMMOVWconst { 9895 break 9896 } 9897 c := auxIntToInt32(v_0.AuxInt) 9898 x := v_1 9899 y := v_2 9900 flags := v_3 9901 v.reset(OpARMSBCconst) 9902 v.AuxInt = int32ToAuxInt(c) 9903 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9904 v0.AddArg2(x, y) 9905 v.AddArg2(v0, flags) 9906 return true 9907 } 9908 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 9909 // cond: 0 <= c && c < 32 9910 // result: (RSCshiftRL x y [c] flags) 9911 for { 9912 x := v_0 9913 y := v_1 9914 if v_2.Op != OpARMMOVWconst { 9915 break 9916 } 9917 c := auxIntToInt32(v_2.AuxInt) 9918 flags := v_3 9919 if !(0 <= c && c < 32) { 9920 break 9921 } 9922 v.reset(OpARMRSCshiftRL) 9923 v.AuxInt = int32ToAuxInt(c) 9924 v.AddArg3(x, y, flags) 9925 return true 9926 } 9927 return false 9928 } 9929 func rewriteValueARM_OpARMSBC(v *Value) bool { 9930 v_2 := v.Args[2] 9931 v_1 := v.Args[1] 9932 v_0 := v.Args[0] 9933 // match: (SBC (MOVWconst [c]) x flags) 9934 // result: (RSCconst [c] x flags) 9935 for { 9936 if v_0.Op != OpARMMOVWconst { 9937 break 9938 } 9939 c := auxIntToInt32(v_0.AuxInt) 9940 x := v_1 9941 flags := v_2 9942 v.reset(OpARMRSCconst) 9943 v.AuxInt = int32ToAuxInt(c) 9944 v.AddArg2(x, flags) 9945 return true 9946 } 9947 // match: (SBC x (MOVWconst [c]) flags) 9948 // result: (SBCconst [c] x flags) 9949 for { 9950 x := v_0 9951 if v_1.Op != OpARMMOVWconst { 9952 break 9953 } 9954 c := auxIntToInt32(v_1.AuxInt) 9955 flags := v_2 9956 v.reset(OpARMSBCconst) 9957 v.AuxInt = int32ToAuxInt(c) 9958 v.AddArg2(x, flags) 9959 return true 9960 } 9961 // match: (SBC x (SLLconst [c] y) flags) 9962 // result: (SBCshiftLL x y [c] flags) 9963 for { 9964 x := v_0 9965 if v_1.Op != OpARMSLLconst { 9966 break 9967 } 9968 c := auxIntToInt32(v_1.AuxInt) 9969 y := v_1.Args[0] 9970 flags := v_2 9971 v.reset(OpARMSBCshiftLL) 9972 v.AuxInt = int32ToAuxInt(c) 9973 v.AddArg3(x, y, flags) 9974 return true 9975 } 9976 // match: (SBC (SLLconst [c] y) x flags) 9977 // result: (RSCshiftLL x y [c] flags) 9978 for { 9979 if v_0.Op != OpARMSLLconst { 9980 break 9981 } 9982 c := auxIntToInt32(v_0.AuxInt) 9983 y := v_0.Args[0] 9984 x := v_1 9985 flags := v_2 9986 v.reset(OpARMRSCshiftLL) 9987 v.AuxInt = int32ToAuxInt(c) 9988 v.AddArg3(x, y, flags) 9989 return true 9990 } 9991 // match: (SBC x (SRLconst [c] y) flags) 9992 // result: (SBCshiftRL x y [c] flags) 9993 for { 9994 x := v_0 9995 if v_1.Op != OpARMSRLconst { 9996 break 9997 } 9998 c := auxIntToInt32(v_1.AuxInt) 9999 y := v_1.Args[0] 10000 flags := v_2 10001 v.reset(OpARMSBCshiftRL) 10002 v.AuxInt = int32ToAuxInt(c) 10003 v.AddArg3(x, y, flags) 10004 return true 10005 } 10006 // match: (SBC (SRLconst [c] y) x flags) 10007 // result: (RSCshiftRL x y [c] flags) 10008 for { 10009 if v_0.Op != OpARMSRLconst { 10010 break 10011 } 10012 c := auxIntToInt32(v_0.AuxInt) 10013 y := v_0.Args[0] 10014 x := v_1 10015 flags := v_2 10016 v.reset(OpARMRSCshiftRL) 10017 v.AuxInt = int32ToAuxInt(c) 10018 v.AddArg3(x, y, flags) 10019 return true 10020 } 10021 // match: (SBC x (SRAconst [c] y) flags) 10022 // result: (SBCshiftRA x y [c] flags) 10023 for { 10024 x := v_0 10025 if v_1.Op != OpARMSRAconst { 10026 break 10027 } 10028 c := auxIntToInt32(v_1.AuxInt) 10029 y := v_1.Args[0] 10030 flags := v_2 10031 v.reset(OpARMSBCshiftRA) 10032 v.AuxInt = int32ToAuxInt(c) 10033 v.AddArg3(x, y, flags) 10034 return true 10035 } 10036 // match: (SBC (SRAconst [c] y) x flags) 10037 // result: (RSCshiftRA x y [c] flags) 10038 for { 10039 if v_0.Op != OpARMSRAconst { 10040 break 10041 } 10042 c := auxIntToInt32(v_0.AuxInt) 10043 y := v_0.Args[0] 10044 x := v_1 10045 flags := v_2 10046 v.reset(OpARMRSCshiftRA) 10047 v.AuxInt = int32ToAuxInt(c) 10048 v.AddArg3(x, y, flags) 10049 return true 10050 } 10051 // match: (SBC x (SLL y z) flags) 10052 // result: (SBCshiftLLreg x y z flags) 10053 for { 10054 x := v_0 10055 if v_1.Op != OpARMSLL { 10056 break 10057 } 10058 z := v_1.Args[1] 10059 y := v_1.Args[0] 10060 flags := v_2 10061 v.reset(OpARMSBCshiftLLreg) 10062 v.AddArg4(x, y, z, flags) 10063 return true 10064 } 10065 // match: (SBC (SLL y z) x flags) 10066 // result: (RSCshiftLLreg x y z flags) 10067 for { 10068 if v_0.Op != OpARMSLL { 10069 break 10070 } 10071 z := v_0.Args[1] 10072 y := v_0.Args[0] 10073 x := v_1 10074 flags := v_2 10075 v.reset(OpARMRSCshiftLLreg) 10076 v.AddArg4(x, y, z, flags) 10077 return true 10078 } 10079 // match: (SBC x (SRL y z) flags) 10080 // result: (SBCshiftRLreg x y z flags) 10081 for { 10082 x := v_0 10083 if v_1.Op != OpARMSRL { 10084 break 10085 } 10086 z := v_1.Args[1] 10087 y := v_1.Args[0] 10088 flags := v_2 10089 v.reset(OpARMSBCshiftRLreg) 10090 v.AddArg4(x, y, z, flags) 10091 return true 10092 } 10093 // match: (SBC (SRL y z) x flags) 10094 // result: (RSCshiftRLreg x y z flags) 10095 for { 10096 if v_0.Op != OpARMSRL { 10097 break 10098 } 10099 z := v_0.Args[1] 10100 y := v_0.Args[0] 10101 x := v_1 10102 flags := v_2 10103 v.reset(OpARMRSCshiftRLreg) 10104 v.AddArg4(x, y, z, flags) 10105 return true 10106 } 10107 // match: (SBC x (SRA y z) flags) 10108 // result: (SBCshiftRAreg x y z flags) 10109 for { 10110 x := v_0 10111 if v_1.Op != OpARMSRA { 10112 break 10113 } 10114 z := v_1.Args[1] 10115 y := v_1.Args[0] 10116 flags := v_2 10117 v.reset(OpARMSBCshiftRAreg) 10118 v.AddArg4(x, y, z, flags) 10119 return true 10120 } 10121 // match: (SBC (SRA y z) x flags) 10122 // result: (RSCshiftRAreg x y z flags) 10123 for { 10124 if v_0.Op != OpARMSRA { 10125 break 10126 } 10127 z := v_0.Args[1] 10128 y := v_0.Args[0] 10129 x := v_1 10130 flags := v_2 10131 v.reset(OpARMRSCshiftRAreg) 10132 v.AddArg4(x, y, z, flags) 10133 return true 10134 } 10135 return false 10136 } 10137 func rewriteValueARM_OpARMSBCconst(v *Value) bool { 10138 v_1 := v.Args[1] 10139 v_0 := v.Args[0] 10140 // match: (SBCconst [c] (ADDconst [d] x) flags) 10141 // result: (SBCconst [c-d] x flags) 10142 for { 10143 c := auxIntToInt32(v.AuxInt) 10144 if v_0.Op != OpARMADDconst { 10145 break 10146 } 10147 d := auxIntToInt32(v_0.AuxInt) 10148 x := v_0.Args[0] 10149 flags := v_1 10150 v.reset(OpARMSBCconst) 10151 v.AuxInt = int32ToAuxInt(c - d) 10152 v.AddArg2(x, flags) 10153 return true 10154 } 10155 // match: (SBCconst [c] (SUBconst [d] x) flags) 10156 // result: (SBCconst [c+d] x flags) 10157 for { 10158 c := auxIntToInt32(v.AuxInt) 10159 if v_0.Op != OpARMSUBconst { 10160 break 10161 } 10162 d := auxIntToInt32(v_0.AuxInt) 10163 x := v_0.Args[0] 10164 flags := v_1 10165 v.reset(OpARMSBCconst) 10166 v.AuxInt = int32ToAuxInt(c + d) 10167 v.AddArg2(x, flags) 10168 return true 10169 } 10170 return false 10171 } 10172 func rewriteValueARM_OpARMSBCshiftLL(v *Value) bool { 10173 v_2 := v.Args[2] 10174 v_1 := v.Args[1] 10175 v_0 := v.Args[0] 10176 b := v.Block 10177 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 10178 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 10179 for { 10180 d := auxIntToInt32(v.AuxInt) 10181 if v_0.Op != OpARMMOVWconst { 10182 break 10183 } 10184 c := auxIntToInt32(v_0.AuxInt) 10185 x := v_1 10186 flags := v_2 10187 v.reset(OpARMRSCconst) 10188 v.AuxInt = int32ToAuxInt(c) 10189 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10190 v0.AuxInt = int32ToAuxInt(d) 10191 v0.AddArg(x) 10192 v.AddArg2(v0, flags) 10193 return true 10194 } 10195 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 10196 // result: (SBCconst x [c<<uint64(d)] flags) 10197 for { 10198 d := auxIntToInt32(v.AuxInt) 10199 x := v_0 10200 if v_1.Op != OpARMMOVWconst { 10201 break 10202 } 10203 c := auxIntToInt32(v_1.AuxInt) 10204 flags := v_2 10205 v.reset(OpARMSBCconst) 10206 v.AuxInt = int32ToAuxInt(c << uint64(d)) 10207 v.AddArg2(x, flags) 10208 return true 10209 } 10210 return false 10211 } 10212 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value) bool { 10213 v_3 := v.Args[3] 10214 v_2 := v.Args[2] 10215 v_1 := v.Args[1] 10216 v_0 := v.Args[0] 10217 b := v.Block 10218 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 10219 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 10220 for { 10221 if v_0.Op != OpARMMOVWconst { 10222 break 10223 } 10224 c := auxIntToInt32(v_0.AuxInt) 10225 x := v_1 10226 y := v_2 10227 flags := v_3 10228 v.reset(OpARMRSCconst) 10229 v.AuxInt = int32ToAuxInt(c) 10230 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10231 v0.AddArg2(x, y) 10232 v.AddArg2(v0, flags) 10233 return true 10234 } 10235 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 10236 // cond: 0 <= c && c < 32 10237 // result: (SBCshiftLL x y [c] flags) 10238 for { 10239 x := v_0 10240 y := v_1 10241 if v_2.Op != OpARMMOVWconst { 10242 break 10243 } 10244 c := auxIntToInt32(v_2.AuxInt) 10245 flags := v_3 10246 if !(0 <= c && c < 32) { 10247 break 10248 } 10249 v.reset(OpARMSBCshiftLL) 10250 v.AuxInt = int32ToAuxInt(c) 10251 v.AddArg3(x, y, flags) 10252 return true 10253 } 10254 return false 10255 } 10256 func rewriteValueARM_OpARMSBCshiftRA(v *Value) bool { 10257 v_2 := v.Args[2] 10258 v_1 := v.Args[1] 10259 v_0 := v.Args[0] 10260 b := v.Block 10261 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 10262 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 10263 for { 10264 d := auxIntToInt32(v.AuxInt) 10265 if v_0.Op != OpARMMOVWconst { 10266 break 10267 } 10268 c := auxIntToInt32(v_0.AuxInt) 10269 x := v_1 10270 flags := v_2 10271 v.reset(OpARMRSCconst) 10272 v.AuxInt = int32ToAuxInt(c) 10273 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10274 v0.AuxInt = int32ToAuxInt(d) 10275 v0.AddArg(x) 10276 v.AddArg2(v0, flags) 10277 return true 10278 } 10279 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 10280 // result: (SBCconst x [c>>uint64(d)] flags) 10281 for { 10282 d := auxIntToInt32(v.AuxInt) 10283 x := v_0 10284 if v_1.Op != OpARMMOVWconst { 10285 break 10286 } 10287 c := auxIntToInt32(v_1.AuxInt) 10288 flags := v_2 10289 v.reset(OpARMSBCconst) 10290 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 10291 v.AddArg2(x, flags) 10292 return true 10293 } 10294 return false 10295 } 10296 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value) bool { 10297 v_3 := v.Args[3] 10298 v_2 := v.Args[2] 10299 v_1 := v.Args[1] 10300 v_0 := v.Args[0] 10301 b := v.Block 10302 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 10303 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 10304 for { 10305 if v_0.Op != OpARMMOVWconst { 10306 break 10307 } 10308 c := auxIntToInt32(v_0.AuxInt) 10309 x := v_1 10310 y := v_2 10311 flags := v_3 10312 v.reset(OpARMRSCconst) 10313 v.AuxInt = int32ToAuxInt(c) 10314 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10315 v0.AddArg2(x, y) 10316 v.AddArg2(v0, flags) 10317 return true 10318 } 10319 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 10320 // cond: 0 <= c && c < 32 10321 // result: (SBCshiftRA x y [c] flags) 10322 for { 10323 x := v_0 10324 y := v_1 10325 if v_2.Op != OpARMMOVWconst { 10326 break 10327 } 10328 c := auxIntToInt32(v_2.AuxInt) 10329 flags := v_3 10330 if !(0 <= c && c < 32) { 10331 break 10332 } 10333 v.reset(OpARMSBCshiftRA) 10334 v.AuxInt = int32ToAuxInt(c) 10335 v.AddArg3(x, y, flags) 10336 return true 10337 } 10338 return false 10339 } 10340 func rewriteValueARM_OpARMSBCshiftRL(v *Value) bool { 10341 v_2 := v.Args[2] 10342 v_1 := v.Args[1] 10343 v_0 := v.Args[0] 10344 b := v.Block 10345 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 10346 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 10347 for { 10348 d := auxIntToInt32(v.AuxInt) 10349 if v_0.Op != OpARMMOVWconst { 10350 break 10351 } 10352 c := auxIntToInt32(v_0.AuxInt) 10353 x := v_1 10354 flags := v_2 10355 v.reset(OpARMRSCconst) 10356 v.AuxInt = int32ToAuxInt(c) 10357 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10358 v0.AuxInt = int32ToAuxInt(d) 10359 v0.AddArg(x) 10360 v.AddArg2(v0, flags) 10361 return true 10362 } 10363 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 10364 // result: (SBCconst x [int32(uint32(c)>>uint64(d))] flags) 10365 for { 10366 d := auxIntToInt32(v.AuxInt) 10367 x := v_0 10368 if v_1.Op != OpARMMOVWconst { 10369 break 10370 } 10371 c := auxIntToInt32(v_1.AuxInt) 10372 flags := v_2 10373 v.reset(OpARMSBCconst) 10374 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 10375 v.AddArg2(x, flags) 10376 return true 10377 } 10378 return false 10379 } 10380 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value) bool { 10381 v_3 := v.Args[3] 10382 v_2 := v.Args[2] 10383 v_1 := v.Args[1] 10384 v_0 := v.Args[0] 10385 b := v.Block 10386 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 10387 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 10388 for { 10389 if v_0.Op != OpARMMOVWconst { 10390 break 10391 } 10392 c := auxIntToInt32(v_0.AuxInt) 10393 x := v_1 10394 y := v_2 10395 flags := v_3 10396 v.reset(OpARMRSCconst) 10397 v.AuxInt = int32ToAuxInt(c) 10398 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10399 v0.AddArg2(x, y) 10400 v.AddArg2(v0, flags) 10401 return true 10402 } 10403 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 10404 // cond: 0 <= c && c < 32 10405 // result: (SBCshiftRL x y [c] flags) 10406 for { 10407 x := v_0 10408 y := v_1 10409 if v_2.Op != OpARMMOVWconst { 10410 break 10411 } 10412 c := auxIntToInt32(v_2.AuxInt) 10413 flags := v_3 10414 if !(0 <= c && c < 32) { 10415 break 10416 } 10417 v.reset(OpARMSBCshiftRL) 10418 v.AuxInt = int32ToAuxInt(c) 10419 v.AddArg3(x, y, flags) 10420 return true 10421 } 10422 return false 10423 } 10424 func rewriteValueARM_OpARMSLL(v *Value) bool { 10425 v_1 := v.Args[1] 10426 v_0 := v.Args[0] 10427 // match: (SLL x (MOVWconst [c])) 10428 // cond: 0 <= c && c < 32 10429 // result: (SLLconst x [c]) 10430 for { 10431 x := v_0 10432 if v_1.Op != OpARMMOVWconst { 10433 break 10434 } 10435 c := auxIntToInt32(v_1.AuxInt) 10436 if !(0 <= c && c < 32) { 10437 break 10438 } 10439 v.reset(OpARMSLLconst) 10440 v.AuxInt = int32ToAuxInt(c) 10441 v.AddArg(x) 10442 return true 10443 } 10444 return false 10445 } 10446 func rewriteValueARM_OpARMSLLconst(v *Value) bool { 10447 v_0 := v.Args[0] 10448 // match: (SLLconst [c] (MOVWconst [d])) 10449 // result: (MOVWconst [d<<uint64(c)]) 10450 for { 10451 c := auxIntToInt32(v.AuxInt) 10452 if v_0.Op != OpARMMOVWconst { 10453 break 10454 } 10455 d := auxIntToInt32(v_0.AuxInt) 10456 v.reset(OpARMMOVWconst) 10457 v.AuxInt = int32ToAuxInt(d << uint64(c)) 10458 return true 10459 } 10460 return false 10461 } 10462 func rewriteValueARM_OpARMSRA(v *Value) bool { 10463 v_1 := v.Args[1] 10464 v_0 := v.Args[0] 10465 // match: (SRA x (MOVWconst [c])) 10466 // cond: 0 <= c && c < 32 10467 // result: (SRAconst x [c]) 10468 for { 10469 x := v_0 10470 if v_1.Op != OpARMMOVWconst { 10471 break 10472 } 10473 c := auxIntToInt32(v_1.AuxInt) 10474 if !(0 <= c && c < 32) { 10475 break 10476 } 10477 v.reset(OpARMSRAconst) 10478 v.AuxInt = int32ToAuxInt(c) 10479 v.AddArg(x) 10480 return true 10481 } 10482 return false 10483 } 10484 func rewriteValueARM_OpARMSRAcond(v *Value) bool { 10485 v_2 := v.Args[2] 10486 v_1 := v.Args[1] 10487 v_0 := v.Args[0] 10488 // match: (SRAcond x _ (FlagConstant [fc])) 10489 // cond: fc.uge() 10490 // result: (SRAconst x [31]) 10491 for { 10492 x := v_0 10493 if v_2.Op != OpARMFlagConstant { 10494 break 10495 } 10496 fc := auxIntToFlagConstant(v_2.AuxInt) 10497 if !(fc.uge()) { 10498 break 10499 } 10500 v.reset(OpARMSRAconst) 10501 v.AuxInt = int32ToAuxInt(31) 10502 v.AddArg(x) 10503 return true 10504 } 10505 // match: (SRAcond x y (FlagConstant [fc])) 10506 // cond: fc.ult() 10507 // result: (SRA x y) 10508 for { 10509 x := v_0 10510 y := v_1 10511 if v_2.Op != OpARMFlagConstant { 10512 break 10513 } 10514 fc := auxIntToFlagConstant(v_2.AuxInt) 10515 if !(fc.ult()) { 10516 break 10517 } 10518 v.reset(OpARMSRA) 10519 v.AddArg2(x, y) 10520 return true 10521 } 10522 return false 10523 } 10524 func rewriteValueARM_OpARMSRAconst(v *Value) bool { 10525 v_0 := v.Args[0] 10526 // match: (SRAconst [c] (MOVWconst [d])) 10527 // result: (MOVWconst [d>>uint64(c)]) 10528 for { 10529 c := auxIntToInt32(v.AuxInt) 10530 if v_0.Op != OpARMMOVWconst { 10531 break 10532 } 10533 d := auxIntToInt32(v_0.AuxInt) 10534 v.reset(OpARMMOVWconst) 10535 v.AuxInt = int32ToAuxInt(d >> uint64(c)) 10536 return true 10537 } 10538 // match: (SRAconst (SLLconst x [c]) [d]) 10539 // cond: buildcfg.GOARM.Version==7 && uint64(d)>=uint64(c) && uint64(d)<=31 10540 // result: (BFX [(d-c)|(32-d)<<8] x) 10541 for { 10542 d := auxIntToInt32(v.AuxInt) 10543 if v_0.Op != OpARMSLLconst { 10544 break 10545 } 10546 c := auxIntToInt32(v_0.AuxInt) 10547 x := v_0.Args[0] 10548 if !(buildcfg.GOARM.Version == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 10549 break 10550 } 10551 v.reset(OpARMBFX) 10552 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8) 10553 v.AddArg(x) 10554 return true 10555 } 10556 return false 10557 } 10558 func rewriteValueARM_OpARMSRL(v *Value) bool { 10559 v_1 := v.Args[1] 10560 v_0 := v.Args[0] 10561 // match: (SRL x (MOVWconst [c])) 10562 // cond: 0 <= c && c < 32 10563 // result: (SRLconst x [c]) 10564 for { 10565 x := v_0 10566 if v_1.Op != OpARMMOVWconst { 10567 break 10568 } 10569 c := auxIntToInt32(v_1.AuxInt) 10570 if !(0 <= c && c < 32) { 10571 break 10572 } 10573 v.reset(OpARMSRLconst) 10574 v.AuxInt = int32ToAuxInt(c) 10575 v.AddArg(x) 10576 return true 10577 } 10578 return false 10579 } 10580 func rewriteValueARM_OpARMSRLconst(v *Value) bool { 10581 v_0 := v.Args[0] 10582 // match: (SRLconst [c] (MOVWconst [d])) 10583 // result: (MOVWconst [int32(uint32(d)>>uint64(c))]) 10584 for { 10585 c := auxIntToInt32(v.AuxInt) 10586 if v_0.Op != OpARMMOVWconst { 10587 break 10588 } 10589 d := auxIntToInt32(v_0.AuxInt) 10590 v.reset(OpARMMOVWconst) 10591 v.AuxInt = int32ToAuxInt(int32(uint32(d) >> uint64(c))) 10592 return true 10593 } 10594 // match: (SRLconst (SLLconst x [c]) [d]) 10595 // cond: buildcfg.GOARM.Version==7 && uint64(d)>=uint64(c) && uint64(d)<=31 10596 // result: (BFXU [(d-c)|(32-d)<<8] x) 10597 for { 10598 d := auxIntToInt32(v.AuxInt) 10599 if v_0.Op != OpARMSLLconst { 10600 break 10601 } 10602 c := auxIntToInt32(v_0.AuxInt) 10603 x := v_0.Args[0] 10604 if !(buildcfg.GOARM.Version == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 10605 break 10606 } 10607 v.reset(OpARMBFXU) 10608 v.AuxInt = int32ToAuxInt((d - c) | (32-d)<<8) 10609 v.AddArg(x) 10610 return true 10611 } 10612 return false 10613 } 10614 func rewriteValueARM_OpARMSRR(v *Value) bool { 10615 v_1 := v.Args[1] 10616 v_0 := v.Args[0] 10617 // match: (SRR x (MOVWconst [c])) 10618 // result: (SRRconst x [c&31]) 10619 for { 10620 x := v_0 10621 if v_1.Op != OpARMMOVWconst { 10622 break 10623 } 10624 c := auxIntToInt32(v_1.AuxInt) 10625 v.reset(OpARMSRRconst) 10626 v.AuxInt = int32ToAuxInt(c & 31) 10627 v.AddArg(x) 10628 return true 10629 } 10630 return false 10631 } 10632 func rewriteValueARM_OpARMSUB(v *Value) bool { 10633 v_1 := v.Args[1] 10634 v_0 := v.Args[0] 10635 // match: (SUB (MOVWconst [c]) x) 10636 // result: (RSBconst [c] x) 10637 for { 10638 if v_0.Op != OpARMMOVWconst { 10639 break 10640 } 10641 c := auxIntToInt32(v_0.AuxInt) 10642 x := v_1 10643 v.reset(OpARMRSBconst) 10644 v.AuxInt = int32ToAuxInt(c) 10645 v.AddArg(x) 10646 return true 10647 } 10648 // match: (SUB x (MOVWconst [c])) 10649 // result: (SUBconst [c] x) 10650 for { 10651 x := v_0 10652 if v_1.Op != OpARMMOVWconst { 10653 break 10654 } 10655 c := auxIntToInt32(v_1.AuxInt) 10656 v.reset(OpARMSUBconst) 10657 v.AuxInt = int32ToAuxInt(c) 10658 v.AddArg(x) 10659 return true 10660 } 10661 // match: (SUB x (SLLconst [c] y)) 10662 // result: (SUBshiftLL x y [c]) 10663 for { 10664 x := v_0 10665 if v_1.Op != OpARMSLLconst { 10666 break 10667 } 10668 c := auxIntToInt32(v_1.AuxInt) 10669 y := v_1.Args[0] 10670 v.reset(OpARMSUBshiftLL) 10671 v.AuxInt = int32ToAuxInt(c) 10672 v.AddArg2(x, y) 10673 return true 10674 } 10675 // match: (SUB (SLLconst [c] y) x) 10676 // result: (RSBshiftLL x y [c]) 10677 for { 10678 if v_0.Op != OpARMSLLconst { 10679 break 10680 } 10681 c := auxIntToInt32(v_0.AuxInt) 10682 y := v_0.Args[0] 10683 x := v_1 10684 v.reset(OpARMRSBshiftLL) 10685 v.AuxInt = int32ToAuxInt(c) 10686 v.AddArg2(x, y) 10687 return true 10688 } 10689 // match: (SUB x (SRLconst [c] y)) 10690 // result: (SUBshiftRL x y [c]) 10691 for { 10692 x := v_0 10693 if v_1.Op != OpARMSRLconst { 10694 break 10695 } 10696 c := auxIntToInt32(v_1.AuxInt) 10697 y := v_1.Args[0] 10698 v.reset(OpARMSUBshiftRL) 10699 v.AuxInt = int32ToAuxInt(c) 10700 v.AddArg2(x, y) 10701 return true 10702 } 10703 // match: (SUB (SRLconst [c] y) x) 10704 // result: (RSBshiftRL x y [c]) 10705 for { 10706 if v_0.Op != OpARMSRLconst { 10707 break 10708 } 10709 c := auxIntToInt32(v_0.AuxInt) 10710 y := v_0.Args[0] 10711 x := v_1 10712 v.reset(OpARMRSBshiftRL) 10713 v.AuxInt = int32ToAuxInt(c) 10714 v.AddArg2(x, y) 10715 return true 10716 } 10717 // match: (SUB x (SRAconst [c] y)) 10718 // result: (SUBshiftRA x y [c]) 10719 for { 10720 x := v_0 10721 if v_1.Op != OpARMSRAconst { 10722 break 10723 } 10724 c := auxIntToInt32(v_1.AuxInt) 10725 y := v_1.Args[0] 10726 v.reset(OpARMSUBshiftRA) 10727 v.AuxInt = int32ToAuxInt(c) 10728 v.AddArg2(x, y) 10729 return true 10730 } 10731 // match: (SUB (SRAconst [c] y) x) 10732 // result: (RSBshiftRA x y [c]) 10733 for { 10734 if v_0.Op != OpARMSRAconst { 10735 break 10736 } 10737 c := auxIntToInt32(v_0.AuxInt) 10738 y := v_0.Args[0] 10739 x := v_1 10740 v.reset(OpARMRSBshiftRA) 10741 v.AuxInt = int32ToAuxInt(c) 10742 v.AddArg2(x, y) 10743 return true 10744 } 10745 // match: (SUB x (SLL y z)) 10746 // result: (SUBshiftLLreg x y z) 10747 for { 10748 x := v_0 10749 if v_1.Op != OpARMSLL { 10750 break 10751 } 10752 z := v_1.Args[1] 10753 y := v_1.Args[0] 10754 v.reset(OpARMSUBshiftLLreg) 10755 v.AddArg3(x, y, z) 10756 return true 10757 } 10758 // match: (SUB (SLL y z) x) 10759 // result: (RSBshiftLLreg x y z) 10760 for { 10761 if v_0.Op != OpARMSLL { 10762 break 10763 } 10764 z := v_0.Args[1] 10765 y := v_0.Args[0] 10766 x := v_1 10767 v.reset(OpARMRSBshiftLLreg) 10768 v.AddArg3(x, y, z) 10769 return true 10770 } 10771 // match: (SUB x (SRL y z)) 10772 // result: (SUBshiftRLreg x y z) 10773 for { 10774 x := v_0 10775 if v_1.Op != OpARMSRL { 10776 break 10777 } 10778 z := v_1.Args[1] 10779 y := v_1.Args[0] 10780 v.reset(OpARMSUBshiftRLreg) 10781 v.AddArg3(x, y, z) 10782 return true 10783 } 10784 // match: (SUB (SRL y z) x) 10785 // result: (RSBshiftRLreg x y z) 10786 for { 10787 if v_0.Op != OpARMSRL { 10788 break 10789 } 10790 z := v_0.Args[1] 10791 y := v_0.Args[0] 10792 x := v_1 10793 v.reset(OpARMRSBshiftRLreg) 10794 v.AddArg3(x, y, z) 10795 return true 10796 } 10797 // match: (SUB x (SRA y z)) 10798 // result: (SUBshiftRAreg x y z) 10799 for { 10800 x := v_0 10801 if v_1.Op != OpARMSRA { 10802 break 10803 } 10804 z := v_1.Args[1] 10805 y := v_1.Args[0] 10806 v.reset(OpARMSUBshiftRAreg) 10807 v.AddArg3(x, y, z) 10808 return true 10809 } 10810 // match: (SUB (SRA y z) x) 10811 // result: (RSBshiftRAreg x y z) 10812 for { 10813 if v_0.Op != OpARMSRA { 10814 break 10815 } 10816 z := v_0.Args[1] 10817 y := v_0.Args[0] 10818 x := v_1 10819 v.reset(OpARMRSBshiftRAreg) 10820 v.AddArg3(x, y, z) 10821 return true 10822 } 10823 // match: (SUB x x) 10824 // result: (MOVWconst [0]) 10825 for { 10826 x := v_0 10827 if x != v_1 { 10828 break 10829 } 10830 v.reset(OpARMMOVWconst) 10831 v.AuxInt = int32ToAuxInt(0) 10832 return true 10833 } 10834 // match: (SUB a (MUL x y)) 10835 // cond: buildcfg.GOARM.Version == 7 10836 // result: (MULS x y a) 10837 for { 10838 a := v_0 10839 if v_1.Op != OpARMMUL { 10840 break 10841 } 10842 y := v_1.Args[1] 10843 x := v_1.Args[0] 10844 if !(buildcfg.GOARM.Version == 7) { 10845 break 10846 } 10847 v.reset(OpARMMULS) 10848 v.AddArg3(x, y, a) 10849 return true 10850 } 10851 return false 10852 } 10853 func rewriteValueARM_OpARMSUBD(v *Value) bool { 10854 v_1 := v.Args[1] 10855 v_0 := v.Args[0] 10856 // match: (SUBD a (MULD x y)) 10857 // cond: a.Uses == 1 && buildcfg.GOARM.Version >= 6 10858 // result: (MULSD a x y) 10859 for { 10860 a := v_0 10861 if v_1.Op != OpARMMULD { 10862 break 10863 } 10864 y := v_1.Args[1] 10865 x := v_1.Args[0] 10866 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) { 10867 break 10868 } 10869 v.reset(OpARMMULSD) 10870 v.AddArg3(a, x, y) 10871 return true 10872 } 10873 // match: (SUBD a (NMULD x y)) 10874 // cond: a.Uses == 1 && buildcfg.GOARM.Version >= 6 10875 // result: (MULAD a x y) 10876 for { 10877 a := v_0 10878 if v_1.Op != OpARMNMULD { 10879 break 10880 } 10881 y := v_1.Args[1] 10882 x := v_1.Args[0] 10883 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) { 10884 break 10885 } 10886 v.reset(OpARMMULAD) 10887 v.AddArg3(a, x, y) 10888 return true 10889 } 10890 return false 10891 } 10892 func rewriteValueARM_OpARMSUBF(v *Value) bool { 10893 v_1 := v.Args[1] 10894 v_0 := v.Args[0] 10895 // match: (SUBF a (MULF x y)) 10896 // cond: a.Uses == 1 && buildcfg.GOARM.Version >= 6 10897 // result: (MULSF a x y) 10898 for { 10899 a := v_0 10900 if v_1.Op != OpARMMULF { 10901 break 10902 } 10903 y := v_1.Args[1] 10904 x := v_1.Args[0] 10905 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) { 10906 break 10907 } 10908 v.reset(OpARMMULSF) 10909 v.AddArg3(a, x, y) 10910 return true 10911 } 10912 // match: (SUBF a (NMULF x y)) 10913 // cond: a.Uses == 1 && buildcfg.GOARM.Version >= 6 10914 // result: (MULAF a x y) 10915 for { 10916 a := v_0 10917 if v_1.Op != OpARMNMULF { 10918 break 10919 } 10920 y := v_1.Args[1] 10921 x := v_1.Args[0] 10922 if !(a.Uses == 1 && buildcfg.GOARM.Version >= 6) { 10923 break 10924 } 10925 v.reset(OpARMMULAF) 10926 v.AddArg3(a, x, y) 10927 return true 10928 } 10929 return false 10930 } 10931 func rewriteValueARM_OpARMSUBS(v *Value) bool { 10932 v_1 := v.Args[1] 10933 v_0 := v.Args[0] 10934 // match: (SUBS x (MOVWconst [c])) 10935 // result: (SUBSconst [c] x) 10936 for { 10937 x := v_0 10938 if v_1.Op != OpARMMOVWconst { 10939 break 10940 } 10941 c := auxIntToInt32(v_1.AuxInt) 10942 v.reset(OpARMSUBSconst) 10943 v.AuxInt = int32ToAuxInt(c) 10944 v.AddArg(x) 10945 return true 10946 } 10947 // match: (SUBS x (SLLconst [c] y)) 10948 // result: (SUBSshiftLL x y [c]) 10949 for { 10950 x := v_0 10951 if v_1.Op != OpARMSLLconst { 10952 break 10953 } 10954 c := auxIntToInt32(v_1.AuxInt) 10955 y := v_1.Args[0] 10956 v.reset(OpARMSUBSshiftLL) 10957 v.AuxInt = int32ToAuxInt(c) 10958 v.AddArg2(x, y) 10959 return true 10960 } 10961 // match: (SUBS (SLLconst [c] y) x) 10962 // result: (RSBSshiftLL x y [c]) 10963 for { 10964 if v_0.Op != OpARMSLLconst { 10965 break 10966 } 10967 c := auxIntToInt32(v_0.AuxInt) 10968 y := v_0.Args[0] 10969 x := v_1 10970 v.reset(OpARMRSBSshiftLL) 10971 v.AuxInt = int32ToAuxInt(c) 10972 v.AddArg2(x, y) 10973 return true 10974 } 10975 // match: (SUBS x (SRLconst [c] y)) 10976 // result: (SUBSshiftRL x y [c]) 10977 for { 10978 x := v_0 10979 if v_1.Op != OpARMSRLconst { 10980 break 10981 } 10982 c := auxIntToInt32(v_1.AuxInt) 10983 y := v_1.Args[0] 10984 v.reset(OpARMSUBSshiftRL) 10985 v.AuxInt = int32ToAuxInt(c) 10986 v.AddArg2(x, y) 10987 return true 10988 } 10989 // match: (SUBS (SRLconst [c] y) x) 10990 // result: (RSBSshiftRL x y [c]) 10991 for { 10992 if v_0.Op != OpARMSRLconst { 10993 break 10994 } 10995 c := auxIntToInt32(v_0.AuxInt) 10996 y := v_0.Args[0] 10997 x := v_1 10998 v.reset(OpARMRSBSshiftRL) 10999 v.AuxInt = int32ToAuxInt(c) 11000 v.AddArg2(x, y) 11001 return true 11002 } 11003 // match: (SUBS x (SRAconst [c] y)) 11004 // result: (SUBSshiftRA x y [c]) 11005 for { 11006 x := v_0 11007 if v_1.Op != OpARMSRAconst { 11008 break 11009 } 11010 c := auxIntToInt32(v_1.AuxInt) 11011 y := v_1.Args[0] 11012 v.reset(OpARMSUBSshiftRA) 11013 v.AuxInt = int32ToAuxInt(c) 11014 v.AddArg2(x, y) 11015 return true 11016 } 11017 // match: (SUBS (SRAconst [c] y) x) 11018 // result: (RSBSshiftRA x y [c]) 11019 for { 11020 if v_0.Op != OpARMSRAconst { 11021 break 11022 } 11023 c := auxIntToInt32(v_0.AuxInt) 11024 y := v_0.Args[0] 11025 x := v_1 11026 v.reset(OpARMRSBSshiftRA) 11027 v.AuxInt = int32ToAuxInt(c) 11028 v.AddArg2(x, y) 11029 return true 11030 } 11031 // match: (SUBS x (SLL y z)) 11032 // result: (SUBSshiftLLreg x y z) 11033 for { 11034 x := v_0 11035 if v_1.Op != OpARMSLL { 11036 break 11037 } 11038 z := v_1.Args[1] 11039 y := v_1.Args[0] 11040 v.reset(OpARMSUBSshiftLLreg) 11041 v.AddArg3(x, y, z) 11042 return true 11043 } 11044 // match: (SUBS (SLL y z) x) 11045 // result: (RSBSshiftLLreg x y z) 11046 for { 11047 if v_0.Op != OpARMSLL { 11048 break 11049 } 11050 z := v_0.Args[1] 11051 y := v_0.Args[0] 11052 x := v_1 11053 v.reset(OpARMRSBSshiftLLreg) 11054 v.AddArg3(x, y, z) 11055 return true 11056 } 11057 // match: (SUBS x (SRL y z)) 11058 // result: (SUBSshiftRLreg x y z) 11059 for { 11060 x := v_0 11061 if v_1.Op != OpARMSRL { 11062 break 11063 } 11064 z := v_1.Args[1] 11065 y := v_1.Args[0] 11066 v.reset(OpARMSUBSshiftRLreg) 11067 v.AddArg3(x, y, z) 11068 return true 11069 } 11070 // match: (SUBS (SRL y z) x) 11071 // result: (RSBSshiftRLreg x y z) 11072 for { 11073 if v_0.Op != OpARMSRL { 11074 break 11075 } 11076 z := v_0.Args[1] 11077 y := v_0.Args[0] 11078 x := v_1 11079 v.reset(OpARMRSBSshiftRLreg) 11080 v.AddArg3(x, y, z) 11081 return true 11082 } 11083 // match: (SUBS x (SRA y z)) 11084 // result: (SUBSshiftRAreg x y z) 11085 for { 11086 x := v_0 11087 if v_1.Op != OpARMSRA { 11088 break 11089 } 11090 z := v_1.Args[1] 11091 y := v_1.Args[0] 11092 v.reset(OpARMSUBSshiftRAreg) 11093 v.AddArg3(x, y, z) 11094 return true 11095 } 11096 // match: (SUBS (SRA y z) x) 11097 // result: (RSBSshiftRAreg x y z) 11098 for { 11099 if v_0.Op != OpARMSRA { 11100 break 11101 } 11102 z := v_0.Args[1] 11103 y := v_0.Args[0] 11104 x := v_1 11105 v.reset(OpARMRSBSshiftRAreg) 11106 v.AddArg3(x, y, z) 11107 return true 11108 } 11109 return false 11110 } 11111 func rewriteValueARM_OpARMSUBSshiftLL(v *Value) bool { 11112 v_1 := v.Args[1] 11113 v_0 := v.Args[0] 11114 b := v.Block 11115 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 11116 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 11117 for { 11118 d := auxIntToInt32(v.AuxInt) 11119 if v_0.Op != OpARMMOVWconst { 11120 break 11121 } 11122 c := auxIntToInt32(v_0.AuxInt) 11123 x := v_1 11124 v.reset(OpARMRSBSconst) 11125 v.AuxInt = int32ToAuxInt(c) 11126 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11127 v0.AuxInt = int32ToAuxInt(d) 11128 v0.AddArg(x) 11129 v.AddArg(v0) 11130 return true 11131 } 11132 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 11133 // result: (SUBSconst x [c<<uint64(d)]) 11134 for { 11135 d := auxIntToInt32(v.AuxInt) 11136 x := v_0 11137 if v_1.Op != OpARMMOVWconst { 11138 break 11139 } 11140 c := auxIntToInt32(v_1.AuxInt) 11141 v.reset(OpARMSUBSconst) 11142 v.AuxInt = int32ToAuxInt(c << uint64(d)) 11143 v.AddArg(x) 11144 return true 11145 } 11146 return false 11147 } 11148 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value) bool { 11149 v_2 := v.Args[2] 11150 v_1 := v.Args[1] 11151 v_0 := v.Args[0] 11152 b := v.Block 11153 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 11154 // result: (RSBSconst [c] (SLL <x.Type> x y)) 11155 for { 11156 if v_0.Op != OpARMMOVWconst { 11157 break 11158 } 11159 c := auxIntToInt32(v_0.AuxInt) 11160 x := v_1 11161 y := v_2 11162 v.reset(OpARMRSBSconst) 11163 v.AuxInt = int32ToAuxInt(c) 11164 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11165 v0.AddArg2(x, y) 11166 v.AddArg(v0) 11167 return true 11168 } 11169 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 11170 // cond: 0 <= c && c < 32 11171 // result: (SUBSshiftLL x y [c]) 11172 for { 11173 x := v_0 11174 y := v_1 11175 if v_2.Op != OpARMMOVWconst { 11176 break 11177 } 11178 c := auxIntToInt32(v_2.AuxInt) 11179 if !(0 <= c && c < 32) { 11180 break 11181 } 11182 v.reset(OpARMSUBSshiftLL) 11183 v.AuxInt = int32ToAuxInt(c) 11184 v.AddArg2(x, y) 11185 return true 11186 } 11187 return false 11188 } 11189 func rewriteValueARM_OpARMSUBSshiftRA(v *Value) bool { 11190 v_1 := v.Args[1] 11191 v_0 := v.Args[0] 11192 b := v.Block 11193 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 11194 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 11195 for { 11196 d := auxIntToInt32(v.AuxInt) 11197 if v_0.Op != OpARMMOVWconst { 11198 break 11199 } 11200 c := auxIntToInt32(v_0.AuxInt) 11201 x := v_1 11202 v.reset(OpARMRSBSconst) 11203 v.AuxInt = int32ToAuxInt(c) 11204 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11205 v0.AuxInt = int32ToAuxInt(d) 11206 v0.AddArg(x) 11207 v.AddArg(v0) 11208 return true 11209 } 11210 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 11211 // result: (SUBSconst x [c>>uint64(d)]) 11212 for { 11213 d := auxIntToInt32(v.AuxInt) 11214 x := v_0 11215 if v_1.Op != OpARMMOVWconst { 11216 break 11217 } 11218 c := auxIntToInt32(v_1.AuxInt) 11219 v.reset(OpARMSUBSconst) 11220 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 11221 v.AddArg(x) 11222 return true 11223 } 11224 return false 11225 } 11226 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value) bool { 11227 v_2 := v.Args[2] 11228 v_1 := v.Args[1] 11229 v_0 := v.Args[0] 11230 b := v.Block 11231 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 11232 // result: (RSBSconst [c] (SRA <x.Type> x y)) 11233 for { 11234 if v_0.Op != OpARMMOVWconst { 11235 break 11236 } 11237 c := auxIntToInt32(v_0.AuxInt) 11238 x := v_1 11239 y := v_2 11240 v.reset(OpARMRSBSconst) 11241 v.AuxInt = int32ToAuxInt(c) 11242 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11243 v0.AddArg2(x, y) 11244 v.AddArg(v0) 11245 return true 11246 } 11247 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 11248 // cond: 0 <= c && c < 32 11249 // result: (SUBSshiftRA x y [c]) 11250 for { 11251 x := v_0 11252 y := v_1 11253 if v_2.Op != OpARMMOVWconst { 11254 break 11255 } 11256 c := auxIntToInt32(v_2.AuxInt) 11257 if !(0 <= c && c < 32) { 11258 break 11259 } 11260 v.reset(OpARMSUBSshiftRA) 11261 v.AuxInt = int32ToAuxInt(c) 11262 v.AddArg2(x, y) 11263 return true 11264 } 11265 return false 11266 } 11267 func rewriteValueARM_OpARMSUBSshiftRL(v *Value) bool { 11268 v_1 := v.Args[1] 11269 v_0 := v.Args[0] 11270 b := v.Block 11271 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 11272 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 11273 for { 11274 d := auxIntToInt32(v.AuxInt) 11275 if v_0.Op != OpARMMOVWconst { 11276 break 11277 } 11278 c := auxIntToInt32(v_0.AuxInt) 11279 x := v_1 11280 v.reset(OpARMRSBSconst) 11281 v.AuxInt = int32ToAuxInt(c) 11282 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11283 v0.AuxInt = int32ToAuxInt(d) 11284 v0.AddArg(x) 11285 v.AddArg(v0) 11286 return true 11287 } 11288 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 11289 // result: (SUBSconst x [int32(uint32(c)>>uint64(d))]) 11290 for { 11291 d := auxIntToInt32(v.AuxInt) 11292 x := v_0 11293 if v_1.Op != OpARMMOVWconst { 11294 break 11295 } 11296 c := auxIntToInt32(v_1.AuxInt) 11297 v.reset(OpARMSUBSconst) 11298 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 11299 v.AddArg(x) 11300 return true 11301 } 11302 return false 11303 } 11304 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value) bool { 11305 v_2 := v.Args[2] 11306 v_1 := v.Args[1] 11307 v_0 := v.Args[0] 11308 b := v.Block 11309 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 11310 // result: (RSBSconst [c] (SRL <x.Type> x y)) 11311 for { 11312 if v_0.Op != OpARMMOVWconst { 11313 break 11314 } 11315 c := auxIntToInt32(v_0.AuxInt) 11316 x := v_1 11317 y := v_2 11318 v.reset(OpARMRSBSconst) 11319 v.AuxInt = int32ToAuxInt(c) 11320 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11321 v0.AddArg2(x, y) 11322 v.AddArg(v0) 11323 return true 11324 } 11325 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 11326 // cond: 0 <= c && c < 32 11327 // result: (SUBSshiftRL x y [c]) 11328 for { 11329 x := v_0 11330 y := v_1 11331 if v_2.Op != OpARMMOVWconst { 11332 break 11333 } 11334 c := auxIntToInt32(v_2.AuxInt) 11335 if !(0 <= c && c < 32) { 11336 break 11337 } 11338 v.reset(OpARMSUBSshiftRL) 11339 v.AuxInt = int32ToAuxInt(c) 11340 v.AddArg2(x, y) 11341 return true 11342 } 11343 return false 11344 } 11345 func rewriteValueARM_OpARMSUBconst(v *Value) bool { 11346 v_0 := v.Args[0] 11347 // match: (SUBconst [off1] (MOVWaddr [off2] {sym} ptr)) 11348 // result: (MOVWaddr [off2-off1] {sym} ptr) 11349 for { 11350 off1 := auxIntToInt32(v.AuxInt) 11351 if v_0.Op != OpARMMOVWaddr { 11352 break 11353 } 11354 off2 := auxIntToInt32(v_0.AuxInt) 11355 sym := auxToSym(v_0.Aux) 11356 ptr := v_0.Args[0] 11357 v.reset(OpARMMOVWaddr) 11358 v.AuxInt = int32ToAuxInt(off2 - off1) 11359 v.Aux = symToAux(sym) 11360 v.AddArg(ptr) 11361 return true 11362 } 11363 // match: (SUBconst [0] x) 11364 // result: x 11365 for { 11366 if auxIntToInt32(v.AuxInt) != 0 { 11367 break 11368 } 11369 x := v_0 11370 v.copyOf(x) 11371 return true 11372 } 11373 // match: (SUBconst [c] x) 11374 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 11375 // result: (ADDconst [-c] x) 11376 for { 11377 c := auxIntToInt32(v.AuxInt) 11378 x := v_0 11379 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 11380 break 11381 } 11382 v.reset(OpARMADDconst) 11383 v.AuxInt = int32ToAuxInt(-c) 11384 v.AddArg(x) 11385 return true 11386 } 11387 // match: (SUBconst [c] x) 11388 // cond: buildcfg.GOARM.Version==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff 11389 // result: (ADDconst [-c] x) 11390 for { 11391 c := auxIntToInt32(v.AuxInt) 11392 x := v_0 11393 if !(buildcfg.GOARM.Version == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) { 11394 break 11395 } 11396 v.reset(OpARMADDconst) 11397 v.AuxInt = int32ToAuxInt(-c) 11398 v.AddArg(x) 11399 return true 11400 } 11401 // match: (SUBconst [c] (MOVWconst [d])) 11402 // result: (MOVWconst [d-c]) 11403 for { 11404 c := auxIntToInt32(v.AuxInt) 11405 if v_0.Op != OpARMMOVWconst { 11406 break 11407 } 11408 d := auxIntToInt32(v_0.AuxInt) 11409 v.reset(OpARMMOVWconst) 11410 v.AuxInt = int32ToAuxInt(d - c) 11411 return true 11412 } 11413 // match: (SUBconst [c] (SUBconst [d] x)) 11414 // result: (ADDconst [-c-d] x) 11415 for { 11416 c := auxIntToInt32(v.AuxInt) 11417 if v_0.Op != OpARMSUBconst { 11418 break 11419 } 11420 d := auxIntToInt32(v_0.AuxInt) 11421 x := v_0.Args[0] 11422 v.reset(OpARMADDconst) 11423 v.AuxInt = int32ToAuxInt(-c - d) 11424 v.AddArg(x) 11425 return true 11426 } 11427 // match: (SUBconst [c] (ADDconst [d] x)) 11428 // result: (ADDconst [-c+d] x) 11429 for { 11430 c := auxIntToInt32(v.AuxInt) 11431 if v_0.Op != OpARMADDconst { 11432 break 11433 } 11434 d := auxIntToInt32(v_0.AuxInt) 11435 x := v_0.Args[0] 11436 v.reset(OpARMADDconst) 11437 v.AuxInt = int32ToAuxInt(-c + d) 11438 v.AddArg(x) 11439 return true 11440 } 11441 // match: (SUBconst [c] (RSBconst [d] x)) 11442 // result: (RSBconst [-c+d] x) 11443 for { 11444 c := auxIntToInt32(v.AuxInt) 11445 if v_0.Op != OpARMRSBconst { 11446 break 11447 } 11448 d := auxIntToInt32(v_0.AuxInt) 11449 x := v_0.Args[0] 11450 v.reset(OpARMRSBconst) 11451 v.AuxInt = int32ToAuxInt(-c + d) 11452 v.AddArg(x) 11453 return true 11454 } 11455 return false 11456 } 11457 func rewriteValueARM_OpARMSUBshiftLL(v *Value) bool { 11458 v_1 := v.Args[1] 11459 v_0 := v.Args[0] 11460 b := v.Block 11461 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 11462 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 11463 for { 11464 d := auxIntToInt32(v.AuxInt) 11465 if v_0.Op != OpARMMOVWconst { 11466 break 11467 } 11468 c := auxIntToInt32(v_0.AuxInt) 11469 x := v_1 11470 v.reset(OpARMRSBconst) 11471 v.AuxInt = int32ToAuxInt(c) 11472 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11473 v0.AuxInt = int32ToAuxInt(d) 11474 v0.AddArg(x) 11475 v.AddArg(v0) 11476 return true 11477 } 11478 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 11479 // result: (SUBconst x [c<<uint64(d)]) 11480 for { 11481 d := auxIntToInt32(v.AuxInt) 11482 x := v_0 11483 if v_1.Op != OpARMMOVWconst { 11484 break 11485 } 11486 c := auxIntToInt32(v_1.AuxInt) 11487 v.reset(OpARMSUBconst) 11488 v.AuxInt = int32ToAuxInt(c << uint64(d)) 11489 v.AddArg(x) 11490 return true 11491 } 11492 // match: (SUBshiftLL (SLLconst x [c]) x [c]) 11493 // result: (MOVWconst [0]) 11494 for { 11495 c := auxIntToInt32(v.AuxInt) 11496 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c { 11497 break 11498 } 11499 x := v_0.Args[0] 11500 if x != v_1 { 11501 break 11502 } 11503 v.reset(OpARMMOVWconst) 11504 v.AuxInt = int32ToAuxInt(0) 11505 return true 11506 } 11507 return false 11508 } 11509 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value) bool { 11510 v_2 := v.Args[2] 11511 v_1 := v.Args[1] 11512 v_0 := v.Args[0] 11513 b := v.Block 11514 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 11515 // result: (RSBconst [c] (SLL <x.Type> x y)) 11516 for { 11517 if v_0.Op != OpARMMOVWconst { 11518 break 11519 } 11520 c := auxIntToInt32(v_0.AuxInt) 11521 x := v_1 11522 y := v_2 11523 v.reset(OpARMRSBconst) 11524 v.AuxInt = int32ToAuxInt(c) 11525 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11526 v0.AddArg2(x, y) 11527 v.AddArg(v0) 11528 return true 11529 } 11530 // match: (SUBshiftLLreg x y (MOVWconst [c])) 11531 // cond: 0 <= c && c < 32 11532 // result: (SUBshiftLL x y [c]) 11533 for { 11534 x := v_0 11535 y := v_1 11536 if v_2.Op != OpARMMOVWconst { 11537 break 11538 } 11539 c := auxIntToInt32(v_2.AuxInt) 11540 if !(0 <= c && c < 32) { 11541 break 11542 } 11543 v.reset(OpARMSUBshiftLL) 11544 v.AuxInt = int32ToAuxInt(c) 11545 v.AddArg2(x, y) 11546 return true 11547 } 11548 return false 11549 } 11550 func rewriteValueARM_OpARMSUBshiftRA(v *Value) bool { 11551 v_1 := v.Args[1] 11552 v_0 := v.Args[0] 11553 b := v.Block 11554 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 11555 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 11556 for { 11557 d := auxIntToInt32(v.AuxInt) 11558 if v_0.Op != OpARMMOVWconst { 11559 break 11560 } 11561 c := auxIntToInt32(v_0.AuxInt) 11562 x := v_1 11563 v.reset(OpARMRSBconst) 11564 v.AuxInt = int32ToAuxInt(c) 11565 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11566 v0.AuxInt = int32ToAuxInt(d) 11567 v0.AddArg(x) 11568 v.AddArg(v0) 11569 return true 11570 } 11571 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 11572 // result: (SUBconst x [c>>uint64(d)]) 11573 for { 11574 d := auxIntToInt32(v.AuxInt) 11575 x := v_0 11576 if v_1.Op != OpARMMOVWconst { 11577 break 11578 } 11579 c := auxIntToInt32(v_1.AuxInt) 11580 v.reset(OpARMSUBconst) 11581 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 11582 v.AddArg(x) 11583 return true 11584 } 11585 // match: (SUBshiftRA (SRAconst x [c]) x [c]) 11586 // result: (MOVWconst [0]) 11587 for { 11588 c := auxIntToInt32(v.AuxInt) 11589 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c { 11590 break 11591 } 11592 x := v_0.Args[0] 11593 if x != v_1 { 11594 break 11595 } 11596 v.reset(OpARMMOVWconst) 11597 v.AuxInt = int32ToAuxInt(0) 11598 return true 11599 } 11600 return false 11601 } 11602 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value) bool { 11603 v_2 := v.Args[2] 11604 v_1 := v.Args[1] 11605 v_0 := v.Args[0] 11606 b := v.Block 11607 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 11608 // result: (RSBconst [c] (SRA <x.Type> x y)) 11609 for { 11610 if v_0.Op != OpARMMOVWconst { 11611 break 11612 } 11613 c := auxIntToInt32(v_0.AuxInt) 11614 x := v_1 11615 y := v_2 11616 v.reset(OpARMRSBconst) 11617 v.AuxInt = int32ToAuxInt(c) 11618 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11619 v0.AddArg2(x, y) 11620 v.AddArg(v0) 11621 return true 11622 } 11623 // match: (SUBshiftRAreg x y (MOVWconst [c])) 11624 // cond: 0 <= c && c < 32 11625 // result: (SUBshiftRA x y [c]) 11626 for { 11627 x := v_0 11628 y := v_1 11629 if v_2.Op != OpARMMOVWconst { 11630 break 11631 } 11632 c := auxIntToInt32(v_2.AuxInt) 11633 if !(0 <= c && c < 32) { 11634 break 11635 } 11636 v.reset(OpARMSUBshiftRA) 11637 v.AuxInt = int32ToAuxInt(c) 11638 v.AddArg2(x, y) 11639 return true 11640 } 11641 return false 11642 } 11643 func rewriteValueARM_OpARMSUBshiftRL(v *Value) bool { 11644 v_1 := v.Args[1] 11645 v_0 := v.Args[0] 11646 b := v.Block 11647 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 11648 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 11649 for { 11650 d := auxIntToInt32(v.AuxInt) 11651 if v_0.Op != OpARMMOVWconst { 11652 break 11653 } 11654 c := auxIntToInt32(v_0.AuxInt) 11655 x := v_1 11656 v.reset(OpARMRSBconst) 11657 v.AuxInt = int32ToAuxInt(c) 11658 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11659 v0.AuxInt = int32ToAuxInt(d) 11660 v0.AddArg(x) 11661 v.AddArg(v0) 11662 return true 11663 } 11664 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 11665 // result: (SUBconst x [int32(uint32(c)>>uint64(d))]) 11666 for { 11667 d := auxIntToInt32(v.AuxInt) 11668 x := v_0 11669 if v_1.Op != OpARMMOVWconst { 11670 break 11671 } 11672 c := auxIntToInt32(v_1.AuxInt) 11673 v.reset(OpARMSUBconst) 11674 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 11675 v.AddArg(x) 11676 return true 11677 } 11678 // match: (SUBshiftRL (SRLconst x [c]) x [c]) 11679 // result: (MOVWconst [0]) 11680 for { 11681 c := auxIntToInt32(v.AuxInt) 11682 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c { 11683 break 11684 } 11685 x := v_0.Args[0] 11686 if x != v_1 { 11687 break 11688 } 11689 v.reset(OpARMMOVWconst) 11690 v.AuxInt = int32ToAuxInt(0) 11691 return true 11692 } 11693 return false 11694 } 11695 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value) bool { 11696 v_2 := v.Args[2] 11697 v_1 := v.Args[1] 11698 v_0 := v.Args[0] 11699 b := v.Block 11700 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 11701 // result: (RSBconst [c] (SRL <x.Type> x y)) 11702 for { 11703 if v_0.Op != OpARMMOVWconst { 11704 break 11705 } 11706 c := auxIntToInt32(v_0.AuxInt) 11707 x := v_1 11708 y := v_2 11709 v.reset(OpARMRSBconst) 11710 v.AuxInt = int32ToAuxInt(c) 11711 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11712 v0.AddArg2(x, y) 11713 v.AddArg(v0) 11714 return true 11715 } 11716 // match: (SUBshiftRLreg x y (MOVWconst [c])) 11717 // cond: 0 <= c && c < 32 11718 // result: (SUBshiftRL x y [c]) 11719 for { 11720 x := v_0 11721 y := v_1 11722 if v_2.Op != OpARMMOVWconst { 11723 break 11724 } 11725 c := auxIntToInt32(v_2.AuxInt) 11726 if !(0 <= c && c < 32) { 11727 break 11728 } 11729 v.reset(OpARMSUBshiftRL) 11730 v.AuxInt = int32ToAuxInt(c) 11731 v.AddArg2(x, y) 11732 return true 11733 } 11734 return false 11735 } 11736 func rewriteValueARM_OpARMTEQ(v *Value) bool { 11737 v_1 := v.Args[1] 11738 v_0 := v.Args[0] 11739 // match: (TEQ x (MOVWconst [c])) 11740 // result: (TEQconst [c] x) 11741 for { 11742 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11743 x := v_0 11744 if v_1.Op != OpARMMOVWconst { 11745 continue 11746 } 11747 c := auxIntToInt32(v_1.AuxInt) 11748 v.reset(OpARMTEQconst) 11749 v.AuxInt = int32ToAuxInt(c) 11750 v.AddArg(x) 11751 return true 11752 } 11753 break 11754 } 11755 // match: (TEQ x (SLLconst [c] y)) 11756 // result: (TEQshiftLL x y [c]) 11757 for { 11758 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11759 x := v_0 11760 if v_1.Op != OpARMSLLconst { 11761 continue 11762 } 11763 c := auxIntToInt32(v_1.AuxInt) 11764 y := v_1.Args[0] 11765 v.reset(OpARMTEQshiftLL) 11766 v.AuxInt = int32ToAuxInt(c) 11767 v.AddArg2(x, y) 11768 return true 11769 } 11770 break 11771 } 11772 // match: (TEQ x (SRLconst [c] y)) 11773 // result: (TEQshiftRL x y [c]) 11774 for { 11775 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11776 x := v_0 11777 if v_1.Op != OpARMSRLconst { 11778 continue 11779 } 11780 c := auxIntToInt32(v_1.AuxInt) 11781 y := v_1.Args[0] 11782 v.reset(OpARMTEQshiftRL) 11783 v.AuxInt = int32ToAuxInt(c) 11784 v.AddArg2(x, y) 11785 return true 11786 } 11787 break 11788 } 11789 // match: (TEQ x (SRAconst [c] y)) 11790 // result: (TEQshiftRA x y [c]) 11791 for { 11792 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11793 x := v_0 11794 if v_1.Op != OpARMSRAconst { 11795 continue 11796 } 11797 c := auxIntToInt32(v_1.AuxInt) 11798 y := v_1.Args[0] 11799 v.reset(OpARMTEQshiftRA) 11800 v.AuxInt = int32ToAuxInt(c) 11801 v.AddArg2(x, y) 11802 return true 11803 } 11804 break 11805 } 11806 // match: (TEQ x (SLL y z)) 11807 // result: (TEQshiftLLreg x y z) 11808 for { 11809 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11810 x := v_0 11811 if v_1.Op != OpARMSLL { 11812 continue 11813 } 11814 z := v_1.Args[1] 11815 y := v_1.Args[0] 11816 v.reset(OpARMTEQshiftLLreg) 11817 v.AddArg3(x, y, z) 11818 return true 11819 } 11820 break 11821 } 11822 // match: (TEQ x (SRL y z)) 11823 // result: (TEQshiftRLreg x y z) 11824 for { 11825 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11826 x := v_0 11827 if v_1.Op != OpARMSRL { 11828 continue 11829 } 11830 z := v_1.Args[1] 11831 y := v_1.Args[0] 11832 v.reset(OpARMTEQshiftRLreg) 11833 v.AddArg3(x, y, z) 11834 return true 11835 } 11836 break 11837 } 11838 // match: (TEQ x (SRA y z)) 11839 // result: (TEQshiftRAreg x y z) 11840 for { 11841 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 11842 x := v_0 11843 if v_1.Op != OpARMSRA { 11844 continue 11845 } 11846 z := v_1.Args[1] 11847 y := v_1.Args[0] 11848 v.reset(OpARMTEQshiftRAreg) 11849 v.AddArg3(x, y, z) 11850 return true 11851 } 11852 break 11853 } 11854 return false 11855 } 11856 func rewriteValueARM_OpARMTEQconst(v *Value) bool { 11857 v_0 := v.Args[0] 11858 // match: (TEQconst (MOVWconst [x]) [y]) 11859 // result: (FlagConstant [logicFlags32(x^y)]) 11860 for { 11861 y := auxIntToInt32(v.AuxInt) 11862 if v_0.Op != OpARMMOVWconst { 11863 break 11864 } 11865 x := auxIntToInt32(v_0.AuxInt) 11866 v.reset(OpARMFlagConstant) 11867 v.AuxInt = flagConstantToAuxInt(logicFlags32(x ^ y)) 11868 return true 11869 } 11870 return false 11871 } 11872 func rewriteValueARM_OpARMTEQshiftLL(v *Value) bool { 11873 v_1 := v.Args[1] 11874 v_0 := v.Args[0] 11875 b := v.Block 11876 // match: (TEQshiftLL (MOVWconst [c]) x [d]) 11877 // result: (TEQconst [c] (SLLconst <x.Type> x [d])) 11878 for { 11879 d := auxIntToInt32(v.AuxInt) 11880 if v_0.Op != OpARMMOVWconst { 11881 break 11882 } 11883 c := auxIntToInt32(v_0.AuxInt) 11884 x := v_1 11885 v.reset(OpARMTEQconst) 11886 v.AuxInt = int32ToAuxInt(c) 11887 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11888 v0.AuxInt = int32ToAuxInt(d) 11889 v0.AddArg(x) 11890 v.AddArg(v0) 11891 return true 11892 } 11893 // match: (TEQshiftLL x (MOVWconst [c]) [d]) 11894 // result: (TEQconst x [c<<uint64(d)]) 11895 for { 11896 d := auxIntToInt32(v.AuxInt) 11897 x := v_0 11898 if v_1.Op != OpARMMOVWconst { 11899 break 11900 } 11901 c := auxIntToInt32(v_1.AuxInt) 11902 v.reset(OpARMTEQconst) 11903 v.AuxInt = int32ToAuxInt(c << uint64(d)) 11904 v.AddArg(x) 11905 return true 11906 } 11907 return false 11908 } 11909 func rewriteValueARM_OpARMTEQshiftLLreg(v *Value) bool { 11910 v_2 := v.Args[2] 11911 v_1 := v.Args[1] 11912 v_0 := v.Args[0] 11913 b := v.Block 11914 // match: (TEQshiftLLreg (MOVWconst [c]) x y) 11915 // result: (TEQconst [c] (SLL <x.Type> x y)) 11916 for { 11917 if v_0.Op != OpARMMOVWconst { 11918 break 11919 } 11920 c := auxIntToInt32(v_0.AuxInt) 11921 x := v_1 11922 y := v_2 11923 v.reset(OpARMTEQconst) 11924 v.AuxInt = int32ToAuxInt(c) 11925 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11926 v0.AddArg2(x, y) 11927 v.AddArg(v0) 11928 return true 11929 } 11930 // match: (TEQshiftLLreg x y (MOVWconst [c])) 11931 // cond: 0 <= c && c < 32 11932 // result: (TEQshiftLL x y [c]) 11933 for { 11934 x := v_0 11935 y := v_1 11936 if v_2.Op != OpARMMOVWconst { 11937 break 11938 } 11939 c := auxIntToInt32(v_2.AuxInt) 11940 if !(0 <= c && c < 32) { 11941 break 11942 } 11943 v.reset(OpARMTEQshiftLL) 11944 v.AuxInt = int32ToAuxInt(c) 11945 v.AddArg2(x, y) 11946 return true 11947 } 11948 return false 11949 } 11950 func rewriteValueARM_OpARMTEQshiftRA(v *Value) bool { 11951 v_1 := v.Args[1] 11952 v_0 := v.Args[0] 11953 b := v.Block 11954 // match: (TEQshiftRA (MOVWconst [c]) x [d]) 11955 // result: (TEQconst [c] (SRAconst <x.Type> x [d])) 11956 for { 11957 d := auxIntToInt32(v.AuxInt) 11958 if v_0.Op != OpARMMOVWconst { 11959 break 11960 } 11961 c := auxIntToInt32(v_0.AuxInt) 11962 x := v_1 11963 v.reset(OpARMTEQconst) 11964 v.AuxInt = int32ToAuxInt(c) 11965 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11966 v0.AuxInt = int32ToAuxInt(d) 11967 v0.AddArg(x) 11968 v.AddArg(v0) 11969 return true 11970 } 11971 // match: (TEQshiftRA x (MOVWconst [c]) [d]) 11972 // result: (TEQconst x [c>>uint64(d)]) 11973 for { 11974 d := auxIntToInt32(v.AuxInt) 11975 x := v_0 11976 if v_1.Op != OpARMMOVWconst { 11977 break 11978 } 11979 c := auxIntToInt32(v_1.AuxInt) 11980 v.reset(OpARMTEQconst) 11981 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 11982 v.AddArg(x) 11983 return true 11984 } 11985 return false 11986 } 11987 func rewriteValueARM_OpARMTEQshiftRAreg(v *Value) bool { 11988 v_2 := v.Args[2] 11989 v_1 := v.Args[1] 11990 v_0 := v.Args[0] 11991 b := v.Block 11992 // match: (TEQshiftRAreg (MOVWconst [c]) x y) 11993 // result: (TEQconst [c] (SRA <x.Type> x y)) 11994 for { 11995 if v_0.Op != OpARMMOVWconst { 11996 break 11997 } 11998 c := auxIntToInt32(v_0.AuxInt) 11999 x := v_1 12000 y := v_2 12001 v.reset(OpARMTEQconst) 12002 v.AuxInt = int32ToAuxInt(c) 12003 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12004 v0.AddArg2(x, y) 12005 v.AddArg(v0) 12006 return true 12007 } 12008 // match: (TEQshiftRAreg x y (MOVWconst [c])) 12009 // cond: 0 <= c && c < 32 12010 // result: (TEQshiftRA x y [c]) 12011 for { 12012 x := v_0 12013 y := v_1 12014 if v_2.Op != OpARMMOVWconst { 12015 break 12016 } 12017 c := auxIntToInt32(v_2.AuxInt) 12018 if !(0 <= c && c < 32) { 12019 break 12020 } 12021 v.reset(OpARMTEQshiftRA) 12022 v.AuxInt = int32ToAuxInt(c) 12023 v.AddArg2(x, y) 12024 return true 12025 } 12026 return false 12027 } 12028 func rewriteValueARM_OpARMTEQshiftRL(v *Value) bool { 12029 v_1 := v.Args[1] 12030 v_0 := v.Args[0] 12031 b := v.Block 12032 // match: (TEQshiftRL (MOVWconst [c]) x [d]) 12033 // result: (TEQconst [c] (SRLconst <x.Type> x [d])) 12034 for { 12035 d := auxIntToInt32(v.AuxInt) 12036 if v_0.Op != OpARMMOVWconst { 12037 break 12038 } 12039 c := auxIntToInt32(v_0.AuxInt) 12040 x := v_1 12041 v.reset(OpARMTEQconst) 12042 v.AuxInt = int32ToAuxInt(c) 12043 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12044 v0.AuxInt = int32ToAuxInt(d) 12045 v0.AddArg(x) 12046 v.AddArg(v0) 12047 return true 12048 } 12049 // match: (TEQshiftRL x (MOVWconst [c]) [d]) 12050 // result: (TEQconst x [int32(uint32(c)>>uint64(d))]) 12051 for { 12052 d := auxIntToInt32(v.AuxInt) 12053 x := v_0 12054 if v_1.Op != OpARMMOVWconst { 12055 break 12056 } 12057 c := auxIntToInt32(v_1.AuxInt) 12058 v.reset(OpARMTEQconst) 12059 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 12060 v.AddArg(x) 12061 return true 12062 } 12063 return false 12064 } 12065 func rewriteValueARM_OpARMTEQshiftRLreg(v *Value) bool { 12066 v_2 := v.Args[2] 12067 v_1 := v.Args[1] 12068 v_0 := v.Args[0] 12069 b := v.Block 12070 // match: (TEQshiftRLreg (MOVWconst [c]) x y) 12071 // result: (TEQconst [c] (SRL <x.Type> x y)) 12072 for { 12073 if v_0.Op != OpARMMOVWconst { 12074 break 12075 } 12076 c := auxIntToInt32(v_0.AuxInt) 12077 x := v_1 12078 y := v_2 12079 v.reset(OpARMTEQconst) 12080 v.AuxInt = int32ToAuxInt(c) 12081 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12082 v0.AddArg2(x, y) 12083 v.AddArg(v0) 12084 return true 12085 } 12086 // match: (TEQshiftRLreg x y (MOVWconst [c])) 12087 // cond: 0 <= c && c < 32 12088 // result: (TEQshiftRL x y [c]) 12089 for { 12090 x := v_0 12091 y := v_1 12092 if v_2.Op != OpARMMOVWconst { 12093 break 12094 } 12095 c := auxIntToInt32(v_2.AuxInt) 12096 if !(0 <= c && c < 32) { 12097 break 12098 } 12099 v.reset(OpARMTEQshiftRL) 12100 v.AuxInt = int32ToAuxInt(c) 12101 v.AddArg2(x, y) 12102 return true 12103 } 12104 return false 12105 } 12106 func rewriteValueARM_OpARMTST(v *Value) bool { 12107 v_1 := v.Args[1] 12108 v_0 := v.Args[0] 12109 // match: (TST x (MOVWconst [c])) 12110 // result: (TSTconst [c] x) 12111 for { 12112 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12113 x := v_0 12114 if v_1.Op != OpARMMOVWconst { 12115 continue 12116 } 12117 c := auxIntToInt32(v_1.AuxInt) 12118 v.reset(OpARMTSTconst) 12119 v.AuxInt = int32ToAuxInt(c) 12120 v.AddArg(x) 12121 return true 12122 } 12123 break 12124 } 12125 // match: (TST x (SLLconst [c] y)) 12126 // result: (TSTshiftLL x y [c]) 12127 for { 12128 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12129 x := v_0 12130 if v_1.Op != OpARMSLLconst { 12131 continue 12132 } 12133 c := auxIntToInt32(v_1.AuxInt) 12134 y := v_1.Args[0] 12135 v.reset(OpARMTSTshiftLL) 12136 v.AuxInt = int32ToAuxInt(c) 12137 v.AddArg2(x, y) 12138 return true 12139 } 12140 break 12141 } 12142 // match: (TST x (SRLconst [c] y)) 12143 // result: (TSTshiftRL x y [c]) 12144 for { 12145 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12146 x := v_0 12147 if v_1.Op != OpARMSRLconst { 12148 continue 12149 } 12150 c := auxIntToInt32(v_1.AuxInt) 12151 y := v_1.Args[0] 12152 v.reset(OpARMTSTshiftRL) 12153 v.AuxInt = int32ToAuxInt(c) 12154 v.AddArg2(x, y) 12155 return true 12156 } 12157 break 12158 } 12159 // match: (TST x (SRAconst [c] y)) 12160 // result: (TSTshiftRA x y [c]) 12161 for { 12162 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12163 x := v_0 12164 if v_1.Op != OpARMSRAconst { 12165 continue 12166 } 12167 c := auxIntToInt32(v_1.AuxInt) 12168 y := v_1.Args[0] 12169 v.reset(OpARMTSTshiftRA) 12170 v.AuxInt = int32ToAuxInt(c) 12171 v.AddArg2(x, y) 12172 return true 12173 } 12174 break 12175 } 12176 // match: (TST x (SLL y z)) 12177 // result: (TSTshiftLLreg x y z) 12178 for { 12179 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12180 x := v_0 12181 if v_1.Op != OpARMSLL { 12182 continue 12183 } 12184 z := v_1.Args[1] 12185 y := v_1.Args[0] 12186 v.reset(OpARMTSTshiftLLreg) 12187 v.AddArg3(x, y, z) 12188 return true 12189 } 12190 break 12191 } 12192 // match: (TST x (SRL y z)) 12193 // result: (TSTshiftRLreg x y z) 12194 for { 12195 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12196 x := v_0 12197 if v_1.Op != OpARMSRL { 12198 continue 12199 } 12200 z := v_1.Args[1] 12201 y := v_1.Args[0] 12202 v.reset(OpARMTSTshiftRLreg) 12203 v.AddArg3(x, y, z) 12204 return true 12205 } 12206 break 12207 } 12208 // match: (TST x (SRA y z)) 12209 // result: (TSTshiftRAreg x y z) 12210 for { 12211 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12212 x := v_0 12213 if v_1.Op != OpARMSRA { 12214 continue 12215 } 12216 z := v_1.Args[1] 12217 y := v_1.Args[0] 12218 v.reset(OpARMTSTshiftRAreg) 12219 v.AddArg3(x, y, z) 12220 return true 12221 } 12222 break 12223 } 12224 return false 12225 } 12226 func rewriteValueARM_OpARMTSTconst(v *Value) bool { 12227 v_0 := v.Args[0] 12228 // match: (TSTconst (MOVWconst [x]) [y]) 12229 // result: (FlagConstant [logicFlags32(x&y)]) 12230 for { 12231 y := auxIntToInt32(v.AuxInt) 12232 if v_0.Op != OpARMMOVWconst { 12233 break 12234 } 12235 x := auxIntToInt32(v_0.AuxInt) 12236 v.reset(OpARMFlagConstant) 12237 v.AuxInt = flagConstantToAuxInt(logicFlags32(x & y)) 12238 return true 12239 } 12240 return false 12241 } 12242 func rewriteValueARM_OpARMTSTshiftLL(v *Value) bool { 12243 v_1 := v.Args[1] 12244 v_0 := v.Args[0] 12245 b := v.Block 12246 // match: (TSTshiftLL (MOVWconst [c]) x [d]) 12247 // result: (TSTconst [c] (SLLconst <x.Type> x [d])) 12248 for { 12249 d := auxIntToInt32(v.AuxInt) 12250 if v_0.Op != OpARMMOVWconst { 12251 break 12252 } 12253 c := auxIntToInt32(v_0.AuxInt) 12254 x := v_1 12255 v.reset(OpARMTSTconst) 12256 v.AuxInt = int32ToAuxInt(c) 12257 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12258 v0.AuxInt = int32ToAuxInt(d) 12259 v0.AddArg(x) 12260 v.AddArg(v0) 12261 return true 12262 } 12263 // match: (TSTshiftLL x (MOVWconst [c]) [d]) 12264 // result: (TSTconst x [c<<uint64(d)]) 12265 for { 12266 d := auxIntToInt32(v.AuxInt) 12267 x := v_0 12268 if v_1.Op != OpARMMOVWconst { 12269 break 12270 } 12271 c := auxIntToInt32(v_1.AuxInt) 12272 v.reset(OpARMTSTconst) 12273 v.AuxInt = int32ToAuxInt(c << uint64(d)) 12274 v.AddArg(x) 12275 return true 12276 } 12277 return false 12278 } 12279 func rewriteValueARM_OpARMTSTshiftLLreg(v *Value) bool { 12280 v_2 := v.Args[2] 12281 v_1 := v.Args[1] 12282 v_0 := v.Args[0] 12283 b := v.Block 12284 // match: (TSTshiftLLreg (MOVWconst [c]) x y) 12285 // result: (TSTconst [c] (SLL <x.Type> x y)) 12286 for { 12287 if v_0.Op != OpARMMOVWconst { 12288 break 12289 } 12290 c := auxIntToInt32(v_0.AuxInt) 12291 x := v_1 12292 y := v_2 12293 v.reset(OpARMTSTconst) 12294 v.AuxInt = int32ToAuxInt(c) 12295 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12296 v0.AddArg2(x, y) 12297 v.AddArg(v0) 12298 return true 12299 } 12300 // match: (TSTshiftLLreg x y (MOVWconst [c])) 12301 // cond: 0 <= c && c < 32 12302 // result: (TSTshiftLL x y [c]) 12303 for { 12304 x := v_0 12305 y := v_1 12306 if v_2.Op != OpARMMOVWconst { 12307 break 12308 } 12309 c := auxIntToInt32(v_2.AuxInt) 12310 if !(0 <= c && c < 32) { 12311 break 12312 } 12313 v.reset(OpARMTSTshiftLL) 12314 v.AuxInt = int32ToAuxInt(c) 12315 v.AddArg2(x, y) 12316 return true 12317 } 12318 return false 12319 } 12320 func rewriteValueARM_OpARMTSTshiftRA(v *Value) bool { 12321 v_1 := v.Args[1] 12322 v_0 := v.Args[0] 12323 b := v.Block 12324 // match: (TSTshiftRA (MOVWconst [c]) x [d]) 12325 // result: (TSTconst [c] (SRAconst <x.Type> x [d])) 12326 for { 12327 d := auxIntToInt32(v.AuxInt) 12328 if v_0.Op != OpARMMOVWconst { 12329 break 12330 } 12331 c := auxIntToInt32(v_0.AuxInt) 12332 x := v_1 12333 v.reset(OpARMTSTconst) 12334 v.AuxInt = int32ToAuxInt(c) 12335 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12336 v0.AuxInt = int32ToAuxInt(d) 12337 v0.AddArg(x) 12338 v.AddArg(v0) 12339 return true 12340 } 12341 // match: (TSTshiftRA x (MOVWconst [c]) [d]) 12342 // result: (TSTconst x [c>>uint64(d)]) 12343 for { 12344 d := auxIntToInt32(v.AuxInt) 12345 x := v_0 12346 if v_1.Op != OpARMMOVWconst { 12347 break 12348 } 12349 c := auxIntToInt32(v_1.AuxInt) 12350 v.reset(OpARMTSTconst) 12351 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 12352 v.AddArg(x) 12353 return true 12354 } 12355 return false 12356 } 12357 func rewriteValueARM_OpARMTSTshiftRAreg(v *Value) bool { 12358 v_2 := v.Args[2] 12359 v_1 := v.Args[1] 12360 v_0 := v.Args[0] 12361 b := v.Block 12362 // match: (TSTshiftRAreg (MOVWconst [c]) x y) 12363 // result: (TSTconst [c] (SRA <x.Type> x y)) 12364 for { 12365 if v_0.Op != OpARMMOVWconst { 12366 break 12367 } 12368 c := auxIntToInt32(v_0.AuxInt) 12369 x := v_1 12370 y := v_2 12371 v.reset(OpARMTSTconst) 12372 v.AuxInt = int32ToAuxInt(c) 12373 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12374 v0.AddArg2(x, y) 12375 v.AddArg(v0) 12376 return true 12377 } 12378 // match: (TSTshiftRAreg x y (MOVWconst [c])) 12379 // cond: 0 <= c && c < 32 12380 // result: (TSTshiftRA x y [c]) 12381 for { 12382 x := v_0 12383 y := v_1 12384 if v_2.Op != OpARMMOVWconst { 12385 break 12386 } 12387 c := auxIntToInt32(v_2.AuxInt) 12388 if !(0 <= c && c < 32) { 12389 break 12390 } 12391 v.reset(OpARMTSTshiftRA) 12392 v.AuxInt = int32ToAuxInt(c) 12393 v.AddArg2(x, y) 12394 return true 12395 } 12396 return false 12397 } 12398 func rewriteValueARM_OpARMTSTshiftRL(v *Value) bool { 12399 v_1 := v.Args[1] 12400 v_0 := v.Args[0] 12401 b := v.Block 12402 // match: (TSTshiftRL (MOVWconst [c]) x [d]) 12403 // result: (TSTconst [c] (SRLconst <x.Type> x [d])) 12404 for { 12405 d := auxIntToInt32(v.AuxInt) 12406 if v_0.Op != OpARMMOVWconst { 12407 break 12408 } 12409 c := auxIntToInt32(v_0.AuxInt) 12410 x := v_1 12411 v.reset(OpARMTSTconst) 12412 v.AuxInt = int32ToAuxInt(c) 12413 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12414 v0.AuxInt = int32ToAuxInt(d) 12415 v0.AddArg(x) 12416 v.AddArg(v0) 12417 return true 12418 } 12419 // match: (TSTshiftRL x (MOVWconst [c]) [d]) 12420 // result: (TSTconst x [int32(uint32(c)>>uint64(d))]) 12421 for { 12422 d := auxIntToInt32(v.AuxInt) 12423 x := v_0 12424 if v_1.Op != OpARMMOVWconst { 12425 break 12426 } 12427 c := auxIntToInt32(v_1.AuxInt) 12428 v.reset(OpARMTSTconst) 12429 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 12430 v.AddArg(x) 12431 return true 12432 } 12433 return false 12434 } 12435 func rewriteValueARM_OpARMTSTshiftRLreg(v *Value) bool { 12436 v_2 := v.Args[2] 12437 v_1 := v.Args[1] 12438 v_0 := v.Args[0] 12439 b := v.Block 12440 // match: (TSTshiftRLreg (MOVWconst [c]) x y) 12441 // result: (TSTconst [c] (SRL <x.Type> x y)) 12442 for { 12443 if v_0.Op != OpARMMOVWconst { 12444 break 12445 } 12446 c := auxIntToInt32(v_0.AuxInt) 12447 x := v_1 12448 y := v_2 12449 v.reset(OpARMTSTconst) 12450 v.AuxInt = int32ToAuxInt(c) 12451 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12452 v0.AddArg2(x, y) 12453 v.AddArg(v0) 12454 return true 12455 } 12456 // match: (TSTshiftRLreg x y (MOVWconst [c])) 12457 // cond: 0 <= c && c < 32 12458 // result: (TSTshiftRL x y [c]) 12459 for { 12460 x := v_0 12461 y := v_1 12462 if v_2.Op != OpARMMOVWconst { 12463 break 12464 } 12465 c := auxIntToInt32(v_2.AuxInt) 12466 if !(0 <= c && c < 32) { 12467 break 12468 } 12469 v.reset(OpARMTSTshiftRL) 12470 v.AuxInt = int32ToAuxInt(c) 12471 v.AddArg2(x, y) 12472 return true 12473 } 12474 return false 12475 } 12476 func rewriteValueARM_OpARMXOR(v *Value) bool { 12477 v_1 := v.Args[1] 12478 v_0 := v.Args[0] 12479 // match: (XOR x (MOVWconst [c])) 12480 // result: (XORconst [c] x) 12481 for { 12482 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12483 x := v_0 12484 if v_1.Op != OpARMMOVWconst { 12485 continue 12486 } 12487 c := auxIntToInt32(v_1.AuxInt) 12488 v.reset(OpARMXORconst) 12489 v.AuxInt = int32ToAuxInt(c) 12490 v.AddArg(x) 12491 return true 12492 } 12493 break 12494 } 12495 // match: (XOR x (SLLconst [c] y)) 12496 // result: (XORshiftLL x y [c]) 12497 for { 12498 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12499 x := v_0 12500 if v_1.Op != OpARMSLLconst { 12501 continue 12502 } 12503 c := auxIntToInt32(v_1.AuxInt) 12504 y := v_1.Args[0] 12505 v.reset(OpARMXORshiftLL) 12506 v.AuxInt = int32ToAuxInt(c) 12507 v.AddArg2(x, y) 12508 return true 12509 } 12510 break 12511 } 12512 // match: (XOR x (SRLconst [c] y)) 12513 // result: (XORshiftRL x y [c]) 12514 for { 12515 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12516 x := v_0 12517 if v_1.Op != OpARMSRLconst { 12518 continue 12519 } 12520 c := auxIntToInt32(v_1.AuxInt) 12521 y := v_1.Args[0] 12522 v.reset(OpARMXORshiftRL) 12523 v.AuxInt = int32ToAuxInt(c) 12524 v.AddArg2(x, y) 12525 return true 12526 } 12527 break 12528 } 12529 // match: (XOR x (SRAconst [c] y)) 12530 // result: (XORshiftRA x y [c]) 12531 for { 12532 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12533 x := v_0 12534 if v_1.Op != OpARMSRAconst { 12535 continue 12536 } 12537 c := auxIntToInt32(v_1.AuxInt) 12538 y := v_1.Args[0] 12539 v.reset(OpARMXORshiftRA) 12540 v.AuxInt = int32ToAuxInt(c) 12541 v.AddArg2(x, y) 12542 return true 12543 } 12544 break 12545 } 12546 // match: (XOR x (SRRconst [c] y)) 12547 // result: (XORshiftRR x y [c]) 12548 for { 12549 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12550 x := v_0 12551 if v_1.Op != OpARMSRRconst { 12552 continue 12553 } 12554 c := auxIntToInt32(v_1.AuxInt) 12555 y := v_1.Args[0] 12556 v.reset(OpARMXORshiftRR) 12557 v.AuxInt = int32ToAuxInt(c) 12558 v.AddArg2(x, y) 12559 return true 12560 } 12561 break 12562 } 12563 // match: (XOR x (SLL y z)) 12564 // result: (XORshiftLLreg x y z) 12565 for { 12566 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12567 x := v_0 12568 if v_1.Op != OpARMSLL { 12569 continue 12570 } 12571 z := v_1.Args[1] 12572 y := v_1.Args[0] 12573 v.reset(OpARMXORshiftLLreg) 12574 v.AddArg3(x, y, z) 12575 return true 12576 } 12577 break 12578 } 12579 // match: (XOR x (SRL y z)) 12580 // result: (XORshiftRLreg x y z) 12581 for { 12582 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12583 x := v_0 12584 if v_1.Op != OpARMSRL { 12585 continue 12586 } 12587 z := v_1.Args[1] 12588 y := v_1.Args[0] 12589 v.reset(OpARMXORshiftRLreg) 12590 v.AddArg3(x, y, z) 12591 return true 12592 } 12593 break 12594 } 12595 // match: (XOR x (SRA y z)) 12596 // result: (XORshiftRAreg x y z) 12597 for { 12598 for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { 12599 x := v_0 12600 if v_1.Op != OpARMSRA { 12601 continue 12602 } 12603 z := v_1.Args[1] 12604 y := v_1.Args[0] 12605 v.reset(OpARMXORshiftRAreg) 12606 v.AddArg3(x, y, z) 12607 return true 12608 } 12609 break 12610 } 12611 // match: (XOR x x) 12612 // result: (MOVWconst [0]) 12613 for { 12614 x := v_0 12615 if x != v_1 { 12616 break 12617 } 12618 v.reset(OpARMMOVWconst) 12619 v.AuxInt = int32ToAuxInt(0) 12620 return true 12621 } 12622 return false 12623 } 12624 func rewriteValueARM_OpARMXORconst(v *Value) bool { 12625 v_0 := v.Args[0] 12626 // match: (XORconst [0] x) 12627 // result: x 12628 for { 12629 if auxIntToInt32(v.AuxInt) != 0 { 12630 break 12631 } 12632 x := v_0 12633 v.copyOf(x) 12634 return true 12635 } 12636 // match: (XORconst [c] (MOVWconst [d])) 12637 // result: (MOVWconst [c^d]) 12638 for { 12639 c := auxIntToInt32(v.AuxInt) 12640 if v_0.Op != OpARMMOVWconst { 12641 break 12642 } 12643 d := auxIntToInt32(v_0.AuxInt) 12644 v.reset(OpARMMOVWconst) 12645 v.AuxInt = int32ToAuxInt(c ^ d) 12646 return true 12647 } 12648 // match: (XORconst [c] (XORconst [d] x)) 12649 // result: (XORconst [c^d] x) 12650 for { 12651 c := auxIntToInt32(v.AuxInt) 12652 if v_0.Op != OpARMXORconst { 12653 break 12654 } 12655 d := auxIntToInt32(v_0.AuxInt) 12656 x := v_0.Args[0] 12657 v.reset(OpARMXORconst) 12658 v.AuxInt = int32ToAuxInt(c ^ d) 12659 v.AddArg(x) 12660 return true 12661 } 12662 return false 12663 } 12664 func rewriteValueARM_OpARMXORshiftLL(v *Value) bool { 12665 v_1 := v.Args[1] 12666 v_0 := v.Args[0] 12667 b := v.Block 12668 typ := &b.Func.Config.Types 12669 // match: (XORshiftLL (MOVWconst [c]) x [d]) 12670 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 12671 for { 12672 d := auxIntToInt32(v.AuxInt) 12673 if v_0.Op != OpARMMOVWconst { 12674 break 12675 } 12676 c := auxIntToInt32(v_0.AuxInt) 12677 x := v_1 12678 v.reset(OpARMXORconst) 12679 v.AuxInt = int32ToAuxInt(c) 12680 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12681 v0.AuxInt = int32ToAuxInt(d) 12682 v0.AddArg(x) 12683 v.AddArg(v0) 12684 return true 12685 } 12686 // match: (XORshiftLL x (MOVWconst [c]) [d]) 12687 // result: (XORconst x [c<<uint64(d)]) 12688 for { 12689 d := auxIntToInt32(v.AuxInt) 12690 x := v_0 12691 if v_1.Op != OpARMMOVWconst { 12692 break 12693 } 12694 c := auxIntToInt32(v_1.AuxInt) 12695 v.reset(OpARMXORconst) 12696 v.AuxInt = int32ToAuxInt(c << uint64(d)) 12697 v.AddArg(x) 12698 return true 12699 } 12700 // match: (XORshiftLL <typ.UInt16> [8] (BFXU <typ.UInt16> [int32(armBFAuxInt(8, 8))] x) x) 12701 // result: (REV16 x) 12702 for { 12703 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)) { 12704 break 12705 } 12706 x := v_0.Args[0] 12707 if x != v_1 { 12708 break 12709 } 12710 v.reset(OpARMREV16) 12711 v.AddArg(x) 12712 return true 12713 } 12714 // match: (XORshiftLL <typ.UInt16> [8] (SRLconst <typ.UInt16> [24] (SLLconst [16] x)) x) 12715 // cond: buildcfg.GOARM.Version>=6 12716 // result: (REV16 x) 12717 for { 12718 if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMSRLconst || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != 24 { 12719 break 12720 } 12721 v_0_0 := v_0.Args[0] 12722 if v_0_0.Op != OpARMSLLconst || auxIntToInt32(v_0_0.AuxInt) != 16 { 12723 break 12724 } 12725 x := v_0_0.Args[0] 12726 if x != v_1 || !(buildcfg.GOARM.Version >= 6) { 12727 break 12728 } 12729 v.reset(OpARMREV16) 12730 v.AddArg(x) 12731 return true 12732 } 12733 // match: (XORshiftLL (SLLconst x [c]) x [c]) 12734 // result: (MOVWconst [0]) 12735 for { 12736 c := auxIntToInt32(v.AuxInt) 12737 if v_0.Op != OpARMSLLconst || auxIntToInt32(v_0.AuxInt) != c { 12738 break 12739 } 12740 x := v_0.Args[0] 12741 if x != v_1 { 12742 break 12743 } 12744 v.reset(OpARMMOVWconst) 12745 v.AuxInt = int32ToAuxInt(0) 12746 return true 12747 } 12748 return false 12749 } 12750 func rewriteValueARM_OpARMXORshiftLLreg(v *Value) bool { 12751 v_2 := v.Args[2] 12752 v_1 := v.Args[1] 12753 v_0 := v.Args[0] 12754 b := v.Block 12755 // match: (XORshiftLLreg (MOVWconst [c]) x y) 12756 // result: (XORconst [c] (SLL <x.Type> x y)) 12757 for { 12758 if v_0.Op != OpARMMOVWconst { 12759 break 12760 } 12761 c := auxIntToInt32(v_0.AuxInt) 12762 x := v_1 12763 y := v_2 12764 v.reset(OpARMXORconst) 12765 v.AuxInt = int32ToAuxInt(c) 12766 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12767 v0.AddArg2(x, y) 12768 v.AddArg(v0) 12769 return true 12770 } 12771 // match: (XORshiftLLreg x y (MOVWconst [c])) 12772 // cond: 0 <= c && c < 32 12773 // result: (XORshiftLL x y [c]) 12774 for { 12775 x := v_0 12776 y := v_1 12777 if v_2.Op != OpARMMOVWconst { 12778 break 12779 } 12780 c := auxIntToInt32(v_2.AuxInt) 12781 if !(0 <= c && c < 32) { 12782 break 12783 } 12784 v.reset(OpARMXORshiftLL) 12785 v.AuxInt = int32ToAuxInt(c) 12786 v.AddArg2(x, y) 12787 return true 12788 } 12789 return false 12790 } 12791 func rewriteValueARM_OpARMXORshiftRA(v *Value) bool { 12792 v_1 := v.Args[1] 12793 v_0 := v.Args[0] 12794 b := v.Block 12795 // match: (XORshiftRA (MOVWconst [c]) x [d]) 12796 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 12797 for { 12798 d := auxIntToInt32(v.AuxInt) 12799 if v_0.Op != OpARMMOVWconst { 12800 break 12801 } 12802 c := auxIntToInt32(v_0.AuxInt) 12803 x := v_1 12804 v.reset(OpARMXORconst) 12805 v.AuxInt = int32ToAuxInt(c) 12806 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12807 v0.AuxInt = int32ToAuxInt(d) 12808 v0.AddArg(x) 12809 v.AddArg(v0) 12810 return true 12811 } 12812 // match: (XORshiftRA x (MOVWconst [c]) [d]) 12813 // result: (XORconst x [c>>uint64(d)]) 12814 for { 12815 d := auxIntToInt32(v.AuxInt) 12816 x := v_0 12817 if v_1.Op != OpARMMOVWconst { 12818 break 12819 } 12820 c := auxIntToInt32(v_1.AuxInt) 12821 v.reset(OpARMXORconst) 12822 v.AuxInt = int32ToAuxInt(c >> uint64(d)) 12823 v.AddArg(x) 12824 return true 12825 } 12826 // match: (XORshiftRA (SRAconst x [c]) x [c]) 12827 // result: (MOVWconst [0]) 12828 for { 12829 c := auxIntToInt32(v.AuxInt) 12830 if v_0.Op != OpARMSRAconst || auxIntToInt32(v_0.AuxInt) != c { 12831 break 12832 } 12833 x := v_0.Args[0] 12834 if x != v_1 { 12835 break 12836 } 12837 v.reset(OpARMMOVWconst) 12838 v.AuxInt = int32ToAuxInt(0) 12839 return true 12840 } 12841 return false 12842 } 12843 func rewriteValueARM_OpARMXORshiftRAreg(v *Value) bool { 12844 v_2 := v.Args[2] 12845 v_1 := v.Args[1] 12846 v_0 := v.Args[0] 12847 b := v.Block 12848 // match: (XORshiftRAreg (MOVWconst [c]) x y) 12849 // result: (XORconst [c] (SRA <x.Type> x y)) 12850 for { 12851 if v_0.Op != OpARMMOVWconst { 12852 break 12853 } 12854 c := auxIntToInt32(v_0.AuxInt) 12855 x := v_1 12856 y := v_2 12857 v.reset(OpARMXORconst) 12858 v.AuxInt = int32ToAuxInt(c) 12859 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12860 v0.AddArg2(x, y) 12861 v.AddArg(v0) 12862 return true 12863 } 12864 // match: (XORshiftRAreg x y (MOVWconst [c])) 12865 // cond: 0 <= c && c < 32 12866 // result: (XORshiftRA x y [c]) 12867 for { 12868 x := v_0 12869 y := v_1 12870 if v_2.Op != OpARMMOVWconst { 12871 break 12872 } 12873 c := auxIntToInt32(v_2.AuxInt) 12874 if !(0 <= c && c < 32) { 12875 break 12876 } 12877 v.reset(OpARMXORshiftRA) 12878 v.AuxInt = int32ToAuxInt(c) 12879 v.AddArg2(x, y) 12880 return true 12881 } 12882 return false 12883 } 12884 func rewriteValueARM_OpARMXORshiftRL(v *Value) bool { 12885 v_1 := v.Args[1] 12886 v_0 := v.Args[0] 12887 b := v.Block 12888 // match: (XORshiftRL (MOVWconst [c]) x [d]) 12889 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 12890 for { 12891 d := auxIntToInt32(v.AuxInt) 12892 if v_0.Op != OpARMMOVWconst { 12893 break 12894 } 12895 c := auxIntToInt32(v_0.AuxInt) 12896 x := v_1 12897 v.reset(OpARMXORconst) 12898 v.AuxInt = int32ToAuxInt(c) 12899 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12900 v0.AuxInt = int32ToAuxInt(d) 12901 v0.AddArg(x) 12902 v.AddArg(v0) 12903 return true 12904 } 12905 // match: (XORshiftRL x (MOVWconst [c]) [d]) 12906 // result: (XORconst x [int32(uint32(c)>>uint64(d))]) 12907 for { 12908 d := auxIntToInt32(v.AuxInt) 12909 x := v_0 12910 if v_1.Op != OpARMMOVWconst { 12911 break 12912 } 12913 c := auxIntToInt32(v_1.AuxInt) 12914 v.reset(OpARMXORconst) 12915 v.AuxInt = int32ToAuxInt(int32(uint32(c) >> uint64(d))) 12916 v.AddArg(x) 12917 return true 12918 } 12919 // match: (XORshiftRL (SRLconst x [c]) x [c]) 12920 // result: (MOVWconst [0]) 12921 for { 12922 c := auxIntToInt32(v.AuxInt) 12923 if v_0.Op != OpARMSRLconst || auxIntToInt32(v_0.AuxInt) != c { 12924 break 12925 } 12926 x := v_0.Args[0] 12927 if x != v_1 { 12928 break 12929 } 12930 v.reset(OpARMMOVWconst) 12931 v.AuxInt = int32ToAuxInt(0) 12932 return true 12933 } 12934 return false 12935 } 12936 func rewriteValueARM_OpARMXORshiftRLreg(v *Value) bool { 12937 v_2 := v.Args[2] 12938 v_1 := v.Args[1] 12939 v_0 := v.Args[0] 12940 b := v.Block 12941 // match: (XORshiftRLreg (MOVWconst [c]) x y) 12942 // result: (XORconst [c] (SRL <x.Type> x y)) 12943 for { 12944 if v_0.Op != OpARMMOVWconst { 12945 break 12946 } 12947 c := auxIntToInt32(v_0.AuxInt) 12948 x := v_1 12949 y := v_2 12950 v.reset(OpARMXORconst) 12951 v.AuxInt = int32ToAuxInt(c) 12952 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12953 v0.AddArg2(x, y) 12954 v.AddArg(v0) 12955 return true 12956 } 12957 // match: (XORshiftRLreg x y (MOVWconst [c])) 12958 // cond: 0 <= c && c < 32 12959 // result: (XORshiftRL x y [c]) 12960 for { 12961 x := v_0 12962 y := v_1 12963 if v_2.Op != OpARMMOVWconst { 12964 break 12965 } 12966 c := auxIntToInt32(v_2.AuxInt) 12967 if !(0 <= c && c < 32) { 12968 break 12969 } 12970 v.reset(OpARMXORshiftRL) 12971 v.AuxInt = int32ToAuxInt(c) 12972 v.AddArg2(x, y) 12973 return true 12974 } 12975 return false 12976 } 12977 func rewriteValueARM_OpARMXORshiftRR(v *Value) bool { 12978 v_1 := v.Args[1] 12979 v_0 := v.Args[0] 12980 b := v.Block 12981 // match: (XORshiftRR (MOVWconst [c]) x [d]) 12982 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 12983 for { 12984 d := auxIntToInt32(v.AuxInt) 12985 if v_0.Op != OpARMMOVWconst { 12986 break 12987 } 12988 c := auxIntToInt32(v_0.AuxInt) 12989 x := v_1 12990 v.reset(OpARMXORconst) 12991 v.AuxInt = int32ToAuxInt(c) 12992 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 12993 v0.AuxInt = int32ToAuxInt(d) 12994 v0.AddArg(x) 12995 v.AddArg(v0) 12996 return true 12997 } 12998 // match: (XORshiftRR x (MOVWconst [c]) [d]) 12999 // result: (XORconst x [int32(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 13000 for { 13001 d := auxIntToInt32(v.AuxInt) 13002 x := v_0 13003 if v_1.Op != OpARMMOVWconst { 13004 break 13005 } 13006 c := auxIntToInt32(v_1.AuxInt) 13007 v.reset(OpARMXORconst) 13008 v.AuxInt = int32ToAuxInt(int32(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d))) 13009 v.AddArg(x) 13010 return true 13011 } 13012 return false 13013 } 13014 func rewriteValueARM_OpAddr(v *Value) bool { 13015 v_0 := v.Args[0] 13016 // match: (Addr {sym} base) 13017 // result: (MOVWaddr {sym} base) 13018 for { 13019 sym := auxToSym(v.Aux) 13020 base := v_0 13021 v.reset(OpARMMOVWaddr) 13022 v.Aux = symToAux(sym) 13023 v.AddArg(base) 13024 return true 13025 } 13026 } 13027 func rewriteValueARM_OpAvg32u(v *Value) bool { 13028 v_1 := v.Args[1] 13029 v_0 := v.Args[0] 13030 b := v.Block 13031 // match: (Avg32u <t> x y) 13032 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 13033 for { 13034 t := v.Type 13035 x := v_0 13036 y := v_1 13037 v.reset(OpARMADD) 13038 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13039 v0.AuxInt = int32ToAuxInt(1) 13040 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 13041 v1.AddArg2(x, y) 13042 v0.AddArg(v1) 13043 v.AddArg2(v0, y) 13044 return true 13045 } 13046 } 13047 func rewriteValueARM_OpBitLen32(v *Value) bool { 13048 v_0 := v.Args[0] 13049 b := v.Block 13050 // match: (BitLen32 <t> x) 13051 // result: (RSBconst [32] (CLZ <t> x)) 13052 for { 13053 t := v.Type 13054 x := v_0 13055 v.reset(OpARMRSBconst) 13056 v.AuxInt = int32ToAuxInt(32) 13057 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13058 v0.AddArg(x) 13059 v.AddArg(v0) 13060 return true 13061 } 13062 } 13063 func rewriteValueARM_OpBswap32(v *Value) bool { 13064 v_0 := v.Args[0] 13065 b := v.Block 13066 // match: (Bswap32 <t> x) 13067 // cond: buildcfg.GOARM.Version==5 13068 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 13069 for { 13070 t := v.Type 13071 x := v_0 13072 if !(buildcfg.GOARM.Version == 5) { 13073 break 13074 } 13075 v.reset(OpARMXOR) 13076 v.Type = t 13077 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13078 v0.AuxInt = int32ToAuxInt(8) 13079 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 13080 v1.AuxInt = int32ToAuxInt(0xff0000) 13081 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 13082 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13083 v3.AuxInt = int32ToAuxInt(16) 13084 v3.AddArg(x) 13085 v2.AddArg2(x, v3) 13086 v1.AddArg(v2) 13087 v0.AddArg(v1) 13088 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13089 v4.AuxInt = int32ToAuxInt(8) 13090 v4.AddArg(x) 13091 v.AddArg2(v0, v4) 13092 return true 13093 } 13094 // match: (Bswap32 x) 13095 // cond: buildcfg.GOARM.Version>=6 13096 // result: (REV x) 13097 for { 13098 x := v_0 13099 if !(buildcfg.GOARM.Version >= 6) { 13100 break 13101 } 13102 v.reset(OpARMREV) 13103 v.AddArg(x) 13104 return true 13105 } 13106 return false 13107 } 13108 func rewriteValueARM_OpConst16(v *Value) bool { 13109 // match: (Const16 [val]) 13110 // result: (MOVWconst [int32(val)]) 13111 for { 13112 val := auxIntToInt16(v.AuxInt) 13113 v.reset(OpARMMOVWconst) 13114 v.AuxInt = int32ToAuxInt(int32(val)) 13115 return true 13116 } 13117 } 13118 func rewriteValueARM_OpConst32(v *Value) bool { 13119 // match: (Const32 [val]) 13120 // result: (MOVWconst [int32(val)]) 13121 for { 13122 val := auxIntToInt32(v.AuxInt) 13123 v.reset(OpARMMOVWconst) 13124 v.AuxInt = int32ToAuxInt(int32(val)) 13125 return true 13126 } 13127 } 13128 func rewriteValueARM_OpConst32F(v *Value) bool { 13129 // match: (Const32F [val]) 13130 // result: (MOVFconst [float64(val)]) 13131 for { 13132 val := auxIntToFloat32(v.AuxInt) 13133 v.reset(OpARMMOVFconst) 13134 v.AuxInt = float64ToAuxInt(float64(val)) 13135 return true 13136 } 13137 } 13138 func rewriteValueARM_OpConst64F(v *Value) bool { 13139 // match: (Const64F [val]) 13140 // result: (MOVDconst [float64(val)]) 13141 for { 13142 val := auxIntToFloat64(v.AuxInt) 13143 v.reset(OpARMMOVDconst) 13144 v.AuxInt = float64ToAuxInt(float64(val)) 13145 return true 13146 } 13147 } 13148 func rewriteValueARM_OpConst8(v *Value) bool { 13149 // match: (Const8 [val]) 13150 // result: (MOVWconst [int32(val)]) 13151 for { 13152 val := auxIntToInt8(v.AuxInt) 13153 v.reset(OpARMMOVWconst) 13154 v.AuxInt = int32ToAuxInt(int32(val)) 13155 return true 13156 } 13157 } 13158 func rewriteValueARM_OpConstBool(v *Value) bool { 13159 // match: (ConstBool [t]) 13160 // result: (MOVWconst [b2i32(t)]) 13161 for { 13162 t := auxIntToBool(v.AuxInt) 13163 v.reset(OpARMMOVWconst) 13164 v.AuxInt = int32ToAuxInt(b2i32(t)) 13165 return true 13166 } 13167 } 13168 func rewriteValueARM_OpConstNil(v *Value) bool { 13169 // match: (ConstNil) 13170 // result: (MOVWconst [0]) 13171 for { 13172 v.reset(OpARMMOVWconst) 13173 v.AuxInt = int32ToAuxInt(0) 13174 return true 13175 } 13176 } 13177 func rewriteValueARM_OpCtz16(v *Value) bool { 13178 v_0 := v.Args[0] 13179 b := v.Block 13180 typ := &b.Func.Config.Types 13181 // match: (Ctz16 <t> x) 13182 // cond: buildcfg.GOARM.Version<=6 13183 // 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]))) 13184 for { 13185 t := v.Type 13186 x := v_0 13187 if !(buildcfg.GOARM.Version <= 6) { 13188 break 13189 } 13190 v.reset(OpARMRSBconst) 13191 v.AuxInt = int32ToAuxInt(32) 13192 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13193 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32) 13194 v1.AuxInt = int32ToAuxInt(1) 13195 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32) 13196 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) 13197 v3.AuxInt = int32ToAuxInt(0x10000) 13198 v3.AddArg(x) 13199 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32) 13200 v4.AuxInt = int32ToAuxInt(0) 13201 v4.AddArg(v3) 13202 v2.AddArg2(v3, v4) 13203 v1.AddArg(v2) 13204 v0.AddArg(v1) 13205 v.AddArg(v0) 13206 return true 13207 } 13208 // match: (Ctz16 <t> x) 13209 // cond: buildcfg.GOARM.Version==7 13210 // result: (CLZ <t> (RBIT <typ.UInt32> (ORconst <typ.UInt32> [0x10000] x))) 13211 for { 13212 t := v.Type 13213 x := v_0 13214 if !(buildcfg.GOARM.Version == 7) { 13215 break 13216 } 13217 v.reset(OpARMCLZ) 13218 v.Type = t 13219 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32) 13220 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) 13221 v1.AuxInt = int32ToAuxInt(0x10000) 13222 v1.AddArg(x) 13223 v0.AddArg(v1) 13224 v.AddArg(v0) 13225 return true 13226 } 13227 return false 13228 } 13229 func rewriteValueARM_OpCtz32(v *Value) bool { 13230 v_0 := v.Args[0] 13231 b := v.Block 13232 // match: (Ctz32 <t> x) 13233 // cond: buildcfg.GOARM.Version<=6 13234 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 13235 for { 13236 t := v.Type 13237 x := v_0 13238 if !(buildcfg.GOARM.Version <= 6) { 13239 break 13240 } 13241 v.reset(OpARMRSBconst) 13242 v.AuxInt = int32ToAuxInt(32) 13243 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13244 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 13245 v1.AuxInt = int32ToAuxInt(1) 13246 v2 := b.NewValue0(v.Pos, OpARMAND, t) 13247 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 13248 v3.AuxInt = int32ToAuxInt(0) 13249 v3.AddArg(x) 13250 v2.AddArg2(x, v3) 13251 v1.AddArg(v2) 13252 v0.AddArg(v1) 13253 v.AddArg(v0) 13254 return true 13255 } 13256 // match: (Ctz32 <t> x) 13257 // cond: buildcfg.GOARM.Version==7 13258 // result: (CLZ <t> (RBIT <t> x)) 13259 for { 13260 t := v.Type 13261 x := v_0 13262 if !(buildcfg.GOARM.Version == 7) { 13263 break 13264 } 13265 v.reset(OpARMCLZ) 13266 v.Type = t 13267 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 13268 v0.AddArg(x) 13269 v.AddArg(v0) 13270 return true 13271 } 13272 return false 13273 } 13274 func rewriteValueARM_OpCtz8(v *Value) bool { 13275 v_0 := v.Args[0] 13276 b := v.Block 13277 typ := &b.Func.Config.Types 13278 // match: (Ctz8 <t> x) 13279 // cond: buildcfg.GOARM.Version<=6 13280 // 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]))) 13281 for { 13282 t := v.Type 13283 x := v_0 13284 if !(buildcfg.GOARM.Version <= 6) { 13285 break 13286 } 13287 v.reset(OpARMRSBconst) 13288 v.AuxInt = int32ToAuxInt(32) 13289 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13290 v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32) 13291 v1.AuxInt = int32ToAuxInt(1) 13292 v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32) 13293 v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) 13294 v3.AuxInt = int32ToAuxInt(0x100) 13295 v3.AddArg(x) 13296 v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32) 13297 v4.AuxInt = int32ToAuxInt(0) 13298 v4.AddArg(v3) 13299 v2.AddArg2(v3, v4) 13300 v1.AddArg(v2) 13301 v0.AddArg(v1) 13302 v.AddArg(v0) 13303 return true 13304 } 13305 // match: (Ctz8 <t> x) 13306 // cond: buildcfg.GOARM.Version==7 13307 // result: (CLZ <t> (RBIT <typ.UInt32> (ORconst <typ.UInt32> [0x100] x))) 13308 for { 13309 t := v.Type 13310 x := v_0 13311 if !(buildcfg.GOARM.Version == 7) { 13312 break 13313 } 13314 v.reset(OpARMCLZ) 13315 v.Type = t 13316 v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32) 13317 v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) 13318 v1.AuxInt = int32ToAuxInt(0x100) 13319 v1.AddArg(x) 13320 v0.AddArg(v1) 13321 v.AddArg(v0) 13322 return true 13323 } 13324 return false 13325 } 13326 func rewriteValueARM_OpDiv16(v *Value) bool { 13327 v_1 := v.Args[1] 13328 v_0 := v.Args[0] 13329 b := v.Block 13330 typ := &b.Func.Config.Types 13331 // match: (Div16 x y) 13332 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 13333 for { 13334 x := v_0 13335 y := v_1 13336 v.reset(OpDiv32) 13337 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13338 v0.AddArg(x) 13339 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13340 v1.AddArg(y) 13341 v.AddArg2(v0, v1) 13342 return true 13343 } 13344 } 13345 func rewriteValueARM_OpDiv16u(v *Value) bool { 13346 v_1 := v.Args[1] 13347 v_0 := v.Args[0] 13348 b := v.Block 13349 typ := &b.Func.Config.Types 13350 // match: (Div16u x y) 13351 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 13352 for { 13353 x := v_0 13354 y := v_1 13355 v.reset(OpDiv32u) 13356 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13357 v0.AddArg(x) 13358 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13359 v1.AddArg(y) 13360 v.AddArg2(v0, v1) 13361 return true 13362 } 13363 } 13364 func rewriteValueARM_OpDiv32(v *Value) bool { 13365 v_1 := v.Args[1] 13366 v_0 := v.Args[0] 13367 b := v.Block 13368 typ := &b.Func.Config.Types 13369 // match: (Div32 x y) 13370 // 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))) 13371 for { 13372 x := v_0 13373 y := v_1 13374 v.reset(OpARMSUB) 13375 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 13376 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 13377 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 13378 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 13379 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 13380 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 13381 v5.AddArg(x) 13382 v4.AddArg2(x, v5) 13383 v3.AddArg2(v4, v5) 13384 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 13385 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 13386 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 13387 v8.AddArg(y) 13388 v7.AddArg2(y, v8) 13389 v6.AddArg2(v7, v8) 13390 v2.AddArg2(v3, v6) 13391 v1.AddArg(v2) 13392 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 13393 v10 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 13394 v10.AddArg2(x, y) 13395 v9.AddArg(v10) 13396 v0.AddArg2(v1, v9) 13397 v.AddArg2(v0, v9) 13398 return true 13399 } 13400 } 13401 func rewriteValueARM_OpDiv32u(v *Value) bool { 13402 v_1 := v.Args[1] 13403 v_0 := v.Args[0] 13404 b := v.Block 13405 typ := &b.Func.Config.Types 13406 // match: (Div32u x y) 13407 // result: (Select0 <typ.UInt32> (CALLudiv x y)) 13408 for { 13409 x := v_0 13410 y := v_1 13411 v.reset(OpSelect0) 13412 v.Type = typ.UInt32 13413 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 13414 v0.AddArg2(x, y) 13415 v.AddArg(v0) 13416 return true 13417 } 13418 } 13419 func rewriteValueARM_OpDiv8(v *Value) bool { 13420 v_1 := v.Args[1] 13421 v_0 := v.Args[0] 13422 b := v.Block 13423 typ := &b.Func.Config.Types 13424 // match: (Div8 x y) 13425 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 13426 for { 13427 x := v_0 13428 y := v_1 13429 v.reset(OpDiv32) 13430 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13431 v0.AddArg(x) 13432 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13433 v1.AddArg(y) 13434 v.AddArg2(v0, v1) 13435 return true 13436 } 13437 } 13438 func rewriteValueARM_OpDiv8u(v *Value) bool { 13439 v_1 := v.Args[1] 13440 v_0 := v.Args[0] 13441 b := v.Block 13442 typ := &b.Func.Config.Types 13443 // match: (Div8u x y) 13444 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 13445 for { 13446 x := v_0 13447 y := v_1 13448 v.reset(OpDiv32u) 13449 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13450 v0.AddArg(x) 13451 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13452 v1.AddArg(y) 13453 v.AddArg2(v0, v1) 13454 return true 13455 } 13456 } 13457 func rewriteValueARM_OpEq16(v *Value) bool { 13458 v_1 := v.Args[1] 13459 v_0 := v.Args[0] 13460 b := v.Block 13461 typ := &b.Func.Config.Types 13462 // match: (Eq16 x y) 13463 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13464 for { 13465 x := v_0 13466 y := v_1 13467 v.reset(OpARMEqual) 13468 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13469 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13470 v1.AddArg(x) 13471 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13472 v2.AddArg(y) 13473 v0.AddArg2(v1, v2) 13474 v.AddArg(v0) 13475 return true 13476 } 13477 } 13478 func rewriteValueARM_OpEq32(v *Value) bool { 13479 v_1 := v.Args[1] 13480 v_0 := v.Args[0] 13481 b := v.Block 13482 // match: (Eq32 x y) 13483 // result: (Equal (CMP x y)) 13484 for { 13485 x := v_0 13486 y := v_1 13487 v.reset(OpARMEqual) 13488 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13489 v0.AddArg2(x, y) 13490 v.AddArg(v0) 13491 return true 13492 } 13493 } 13494 func rewriteValueARM_OpEq32F(v *Value) bool { 13495 v_1 := v.Args[1] 13496 v_0 := v.Args[0] 13497 b := v.Block 13498 // match: (Eq32F x y) 13499 // result: (Equal (CMPF x y)) 13500 for { 13501 x := v_0 13502 y := v_1 13503 v.reset(OpARMEqual) 13504 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 13505 v0.AddArg2(x, y) 13506 v.AddArg(v0) 13507 return true 13508 } 13509 } 13510 func rewriteValueARM_OpEq64F(v *Value) bool { 13511 v_1 := v.Args[1] 13512 v_0 := v.Args[0] 13513 b := v.Block 13514 // match: (Eq64F x y) 13515 // result: (Equal (CMPD x y)) 13516 for { 13517 x := v_0 13518 y := v_1 13519 v.reset(OpARMEqual) 13520 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 13521 v0.AddArg2(x, y) 13522 v.AddArg(v0) 13523 return true 13524 } 13525 } 13526 func rewriteValueARM_OpEq8(v *Value) bool { 13527 v_1 := v.Args[1] 13528 v_0 := v.Args[0] 13529 b := v.Block 13530 typ := &b.Func.Config.Types 13531 // match: (Eq8 x y) 13532 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13533 for { 13534 x := v_0 13535 y := v_1 13536 v.reset(OpARMEqual) 13537 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13538 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13539 v1.AddArg(x) 13540 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13541 v2.AddArg(y) 13542 v0.AddArg2(v1, v2) 13543 v.AddArg(v0) 13544 return true 13545 } 13546 } 13547 func rewriteValueARM_OpEqB(v *Value) bool { 13548 v_1 := v.Args[1] 13549 v_0 := v.Args[0] 13550 b := v.Block 13551 typ := &b.Func.Config.Types 13552 // match: (EqB x y) 13553 // result: (XORconst [1] (XOR <typ.Bool> x y)) 13554 for { 13555 x := v_0 13556 y := v_1 13557 v.reset(OpARMXORconst) 13558 v.AuxInt = int32ToAuxInt(1) 13559 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool) 13560 v0.AddArg2(x, y) 13561 v.AddArg(v0) 13562 return true 13563 } 13564 } 13565 func rewriteValueARM_OpEqPtr(v *Value) bool { 13566 v_1 := v.Args[1] 13567 v_0 := v.Args[0] 13568 b := v.Block 13569 // match: (EqPtr x y) 13570 // result: (Equal (CMP x y)) 13571 for { 13572 x := v_0 13573 y := v_1 13574 v.reset(OpARMEqual) 13575 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13576 v0.AddArg2(x, y) 13577 v.AddArg(v0) 13578 return true 13579 } 13580 } 13581 func rewriteValueARM_OpFMA(v *Value) bool { 13582 v_2 := v.Args[2] 13583 v_1 := v.Args[1] 13584 v_0 := v.Args[0] 13585 // match: (FMA x y z) 13586 // result: (FMULAD z x y) 13587 for { 13588 x := v_0 13589 y := v_1 13590 z := v_2 13591 v.reset(OpARMFMULAD) 13592 v.AddArg3(z, x, y) 13593 return true 13594 } 13595 } 13596 func rewriteValueARM_OpIsInBounds(v *Value) bool { 13597 v_1 := v.Args[1] 13598 v_0 := v.Args[0] 13599 b := v.Block 13600 // match: (IsInBounds idx len) 13601 // result: (LessThanU (CMP idx len)) 13602 for { 13603 idx := v_0 13604 len := v_1 13605 v.reset(OpARMLessThanU) 13606 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13607 v0.AddArg2(idx, len) 13608 v.AddArg(v0) 13609 return true 13610 } 13611 } 13612 func rewriteValueARM_OpIsNonNil(v *Value) bool { 13613 v_0 := v.Args[0] 13614 b := v.Block 13615 // match: (IsNonNil ptr) 13616 // result: (NotEqual (CMPconst [0] ptr)) 13617 for { 13618 ptr := v_0 13619 v.reset(OpARMNotEqual) 13620 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 13621 v0.AuxInt = int32ToAuxInt(0) 13622 v0.AddArg(ptr) 13623 v.AddArg(v0) 13624 return true 13625 } 13626 } 13627 func rewriteValueARM_OpIsSliceInBounds(v *Value) bool { 13628 v_1 := v.Args[1] 13629 v_0 := v.Args[0] 13630 b := v.Block 13631 // match: (IsSliceInBounds idx len) 13632 // result: (LessEqualU (CMP idx len)) 13633 for { 13634 idx := v_0 13635 len := v_1 13636 v.reset(OpARMLessEqualU) 13637 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13638 v0.AddArg2(idx, len) 13639 v.AddArg(v0) 13640 return true 13641 } 13642 } 13643 func rewriteValueARM_OpLeq16(v *Value) bool { 13644 v_1 := v.Args[1] 13645 v_0 := v.Args[0] 13646 b := v.Block 13647 typ := &b.Func.Config.Types 13648 // match: (Leq16 x y) 13649 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 13650 for { 13651 x := v_0 13652 y := v_1 13653 v.reset(OpARMLessEqual) 13654 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13655 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13656 v1.AddArg(x) 13657 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13658 v2.AddArg(y) 13659 v0.AddArg2(v1, v2) 13660 v.AddArg(v0) 13661 return true 13662 } 13663 } 13664 func rewriteValueARM_OpLeq16U(v *Value) bool { 13665 v_1 := v.Args[1] 13666 v_0 := v.Args[0] 13667 b := v.Block 13668 typ := &b.Func.Config.Types 13669 // match: (Leq16U x y) 13670 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13671 for { 13672 x := v_0 13673 y := v_1 13674 v.reset(OpARMLessEqualU) 13675 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13676 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13677 v1.AddArg(x) 13678 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13679 v2.AddArg(y) 13680 v0.AddArg2(v1, v2) 13681 v.AddArg(v0) 13682 return true 13683 } 13684 } 13685 func rewriteValueARM_OpLeq32(v *Value) bool { 13686 v_1 := v.Args[1] 13687 v_0 := v.Args[0] 13688 b := v.Block 13689 // match: (Leq32 x y) 13690 // result: (LessEqual (CMP x y)) 13691 for { 13692 x := v_0 13693 y := v_1 13694 v.reset(OpARMLessEqual) 13695 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13696 v0.AddArg2(x, y) 13697 v.AddArg(v0) 13698 return true 13699 } 13700 } 13701 func rewriteValueARM_OpLeq32F(v *Value) bool { 13702 v_1 := v.Args[1] 13703 v_0 := v.Args[0] 13704 b := v.Block 13705 // match: (Leq32F x y) 13706 // result: (GreaterEqual (CMPF y x)) 13707 for { 13708 x := v_0 13709 y := v_1 13710 v.reset(OpARMGreaterEqual) 13711 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 13712 v0.AddArg2(y, x) 13713 v.AddArg(v0) 13714 return true 13715 } 13716 } 13717 func rewriteValueARM_OpLeq32U(v *Value) bool { 13718 v_1 := v.Args[1] 13719 v_0 := v.Args[0] 13720 b := v.Block 13721 // match: (Leq32U x y) 13722 // result: (LessEqualU (CMP x y)) 13723 for { 13724 x := v_0 13725 y := v_1 13726 v.reset(OpARMLessEqualU) 13727 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13728 v0.AddArg2(x, y) 13729 v.AddArg(v0) 13730 return true 13731 } 13732 } 13733 func rewriteValueARM_OpLeq64F(v *Value) bool { 13734 v_1 := v.Args[1] 13735 v_0 := v.Args[0] 13736 b := v.Block 13737 // match: (Leq64F x y) 13738 // result: (GreaterEqual (CMPD y x)) 13739 for { 13740 x := v_0 13741 y := v_1 13742 v.reset(OpARMGreaterEqual) 13743 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 13744 v0.AddArg2(y, x) 13745 v.AddArg(v0) 13746 return true 13747 } 13748 } 13749 func rewriteValueARM_OpLeq8(v *Value) bool { 13750 v_1 := v.Args[1] 13751 v_0 := v.Args[0] 13752 b := v.Block 13753 typ := &b.Func.Config.Types 13754 // match: (Leq8 x y) 13755 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 13756 for { 13757 x := v_0 13758 y := v_1 13759 v.reset(OpARMLessEqual) 13760 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13761 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13762 v1.AddArg(x) 13763 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13764 v2.AddArg(y) 13765 v0.AddArg2(v1, v2) 13766 v.AddArg(v0) 13767 return true 13768 } 13769 } 13770 func rewriteValueARM_OpLeq8U(v *Value) bool { 13771 v_1 := v.Args[1] 13772 v_0 := v.Args[0] 13773 b := v.Block 13774 typ := &b.Func.Config.Types 13775 // match: (Leq8U x y) 13776 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13777 for { 13778 x := v_0 13779 y := v_1 13780 v.reset(OpARMLessEqualU) 13781 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13782 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13783 v1.AddArg(x) 13784 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13785 v2.AddArg(y) 13786 v0.AddArg2(v1, v2) 13787 v.AddArg(v0) 13788 return true 13789 } 13790 } 13791 func rewriteValueARM_OpLess16(v *Value) bool { 13792 v_1 := v.Args[1] 13793 v_0 := v.Args[0] 13794 b := v.Block 13795 typ := &b.Func.Config.Types 13796 // match: (Less16 x y) 13797 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 13798 for { 13799 x := v_0 13800 y := v_1 13801 v.reset(OpARMLessThan) 13802 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13803 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13804 v1.AddArg(x) 13805 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 13806 v2.AddArg(y) 13807 v0.AddArg2(v1, v2) 13808 v.AddArg(v0) 13809 return true 13810 } 13811 } 13812 func rewriteValueARM_OpLess16U(v *Value) bool { 13813 v_1 := v.Args[1] 13814 v_0 := v.Args[0] 13815 b := v.Block 13816 typ := &b.Func.Config.Types 13817 // match: (Less16U x y) 13818 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13819 for { 13820 x := v_0 13821 y := v_1 13822 v.reset(OpARMLessThanU) 13823 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13824 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13825 v1.AddArg(x) 13826 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 13827 v2.AddArg(y) 13828 v0.AddArg2(v1, v2) 13829 v.AddArg(v0) 13830 return true 13831 } 13832 } 13833 func rewriteValueARM_OpLess32(v *Value) bool { 13834 v_1 := v.Args[1] 13835 v_0 := v.Args[0] 13836 b := v.Block 13837 // match: (Less32 x y) 13838 // result: (LessThan (CMP x y)) 13839 for { 13840 x := v_0 13841 y := v_1 13842 v.reset(OpARMLessThan) 13843 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13844 v0.AddArg2(x, y) 13845 v.AddArg(v0) 13846 return true 13847 } 13848 } 13849 func rewriteValueARM_OpLess32F(v *Value) bool { 13850 v_1 := v.Args[1] 13851 v_0 := v.Args[0] 13852 b := v.Block 13853 // match: (Less32F x y) 13854 // result: (GreaterThan (CMPF y x)) 13855 for { 13856 x := v_0 13857 y := v_1 13858 v.reset(OpARMGreaterThan) 13859 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 13860 v0.AddArg2(y, x) 13861 v.AddArg(v0) 13862 return true 13863 } 13864 } 13865 func rewriteValueARM_OpLess32U(v *Value) bool { 13866 v_1 := v.Args[1] 13867 v_0 := v.Args[0] 13868 b := v.Block 13869 // match: (Less32U x y) 13870 // result: (LessThanU (CMP x y)) 13871 for { 13872 x := v_0 13873 y := v_1 13874 v.reset(OpARMLessThanU) 13875 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13876 v0.AddArg2(x, y) 13877 v.AddArg(v0) 13878 return true 13879 } 13880 } 13881 func rewriteValueARM_OpLess64F(v *Value) bool { 13882 v_1 := v.Args[1] 13883 v_0 := v.Args[0] 13884 b := v.Block 13885 // match: (Less64F x y) 13886 // result: (GreaterThan (CMPD y x)) 13887 for { 13888 x := v_0 13889 y := v_1 13890 v.reset(OpARMGreaterThan) 13891 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 13892 v0.AddArg2(y, x) 13893 v.AddArg(v0) 13894 return true 13895 } 13896 } 13897 func rewriteValueARM_OpLess8(v *Value) bool { 13898 v_1 := v.Args[1] 13899 v_0 := v.Args[0] 13900 b := v.Block 13901 typ := &b.Func.Config.Types 13902 // match: (Less8 x y) 13903 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 13904 for { 13905 x := v_0 13906 y := v_1 13907 v.reset(OpARMLessThan) 13908 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13909 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13910 v1.AddArg(x) 13911 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 13912 v2.AddArg(y) 13913 v0.AddArg2(v1, v2) 13914 v.AddArg(v0) 13915 return true 13916 } 13917 } 13918 func rewriteValueARM_OpLess8U(v *Value) bool { 13919 v_1 := v.Args[1] 13920 v_0 := v.Args[0] 13921 b := v.Block 13922 typ := &b.Func.Config.Types 13923 // match: (Less8U x y) 13924 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13925 for { 13926 x := v_0 13927 y := v_1 13928 v.reset(OpARMLessThanU) 13929 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 13930 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13931 v1.AddArg(x) 13932 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 13933 v2.AddArg(y) 13934 v0.AddArg2(v1, v2) 13935 v.AddArg(v0) 13936 return true 13937 } 13938 } 13939 func rewriteValueARM_OpLoad(v *Value) bool { 13940 v_1 := v.Args[1] 13941 v_0 := v.Args[0] 13942 // match: (Load <t> ptr mem) 13943 // cond: t.IsBoolean() 13944 // result: (MOVBUload ptr mem) 13945 for { 13946 t := v.Type 13947 ptr := v_0 13948 mem := v_1 13949 if !(t.IsBoolean()) { 13950 break 13951 } 13952 v.reset(OpARMMOVBUload) 13953 v.AddArg2(ptr, mem) 13954 return true 13955 } 13956 // match: (Load <t> ptr mem) 13957 // cond: (is8BitInt(t) && t.IsSigned()) 13958 // result: (MOVBload ptr mem) 13959 for { 13960 t := v.Type 13961 ptr := v_0 13962 mem := v_1 13963 if !(is8BitInt(t) && t.IsSigned()) { 13964 break 13965 } 13966 v.reset(OpARMMOVBload) 13967 v.AddArg2(ptr, mem) 13968 return true 13969 } 13970 // match: (Load <t> ptr mem) 13971 // cond: (is8BitInt(t) && !t.IsSigned()) 13972 // result: (MOVBUload ptr mem) 13973 for { 13974 t := v.Type 13975 ptr := v_0 13976 mem := v_1 13977 if !(is8BitInt(t) && !t.IsSigned()) { 13978 break 13979 } 13980 v.reset(OpARMMOVBUload) 13981 v.AddArg2(ptr, mem) 13982 return true 13983 } 13984 // match: (Load <t> ptr mem) 13985 // cond: (is16BitInt(t) && t.IsSigned()) 13986 // result: (MOVHload ptr mem) 13987 for { 13988 t := v.Type 13989 ptr := v_0 13990 mem := v_1 13991 if !(is16BitInt(t) && t.IsSigned()) { 13992 break 13993 } 13994 v.reset(OpARMMOVHload) 13995 v.AddArg2(ptr, mem) 13996 return true 13997 } 13998 // match: (Load <t> ptr mem) 13999 // cond: (is16BitInt(t) && !t.IsSigned()) 14000 // result: (MOVHUload ptr mem) 14001 for { 14002 t := v.Type 14003 ptr := v_0 14004 mem := v_1 14005 if !(is16BitInt(t) && !t.IsSigned()) { 14006 break 14007 } 14008 v.reset(OpARMMOVHUload) 14009 v.AddArg2(ptr, mem) 14010 return true 14011 } 14012 // match: (Load <t> ptr mem) 14013 // cond: (is32BitInt(t) || isPtr(t)) 14014 // result: (MOVWload ptr mem) 14015 for { 14016 t := v.Type 14017 ptr := v_0 14018 mem := v_1 14019 if !(is32BitInt(t) || isPtr(t)) { 14020 break 14021 } 14022 v.reset(OpARMMOVWload) 14023 v.AddArg2(ptr, mem) 14024 return true 14025 } 14026 // match: (Load <t> ptr mem) 14027 // cond: is32BitFloat(t) 14028 // result: (MOVFload ptr mem) 14029 for { 14030 t := v.Type 14031 ptr := v_0 14032 mem := v_1 14033 if !(is32BitFloat(t)) { 14034 break 14035 } 14036 v.reset(OpARMMOVFload) 14037 v.AddArg2(ptr, mem) 14038 return true 14039 } 14040 // match: (Load <t> ptr mem) 14041 // cond: is64BitFloat(t) 14042 // result: (MOVDload ptr mem) 14043 for { 14044 t := v.Type 14045 ptr := v_0 14046 mem := v_1 14047 if !(is64BitFloat(t)) { 14048 break 14049 } 14050 v.reset(OpARMMOVDload) 14051 v.AddArg2(ptr, mem) 14052 return true 14053 } 14054 return false 14055 } 14056 func rewriteValueARM_OpLocalAddr(v *Value) bool { 14057 v_1 := v.Args[1] 14058 v_0 := v.Args[0] 14059 b := v.Block 14060 typ := &b.Func.Config.Types 14061 // match: (LocalAddr <t> {sym} base mem) 14062 // cond: t.Elem().HasPointers() 14063 // result: (MOVWaddr {sym} (SPanchored base mem)) 14064 for { 14065 t := v.Type 14066 sym := auxToSym(v.Aux) 14067 base := v_0 14068 mem := v_1 14069 if !(t.Elem().HasPointers()) { 14070 break 14071 } 14072 v.reset(OpARMMOVWaddr) 14073 v.Aux = symToAux(sym) 14074 v0 := b.NewValue0(v.Pos, OpSPanchored, typ.Uintptr) 14075 v0.AddArg2(base, mem) 14076 v.AddArg(v0) 14077 return true 14078 } 14079 // match: (LocalAddr <t> {sym} base _) 14080 // cond: !t.Elem().HasPointers() 14081 // result: (MOVWaddr {sym} base) 14082 for { 14083 t := v.Type 14084 sym := auxToSym(v.Aux) 14085 base := v_0 14086 if !(!t.Elem().HasPointers()) { 14087 break 14088 } 14089 v.reset(OpARMMOVWaddr) 14090 v.Aux = symToAux(sym) 14091 v.AddArg(base) 14092 return true 14093 } 14094 return false 14095 } 14096 func rewriteValueARM_OpLsh16x16(v *Value) bool { 14097 v_1 := v.Args[1] 14098 v_0 := v.Args[0] 14099 b := v.Block 14100 typ := &b.Func.Config.Types 14101 // match: (Lsh16x16 x y) 14102 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14103 for { 14104 x := v_0 14105 y := v_1 14106 v.reset(OpARMCMOVWHSconst) 14107 v.AuxInt = int32ToAuxInt(0) 14108 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14109 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14110 v1.AddArg(y) 14111 v0.AddArg2(x, v1) 14112 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14113 v2.AuxInt = int32ToAuxInt(256) 14114 v2.AddArg(v1) 14115 v.AddArg2(v0, v2) 14116 return true 14117 } 14118 } 14119 func rewriteValueARM_OpLsh16x32(v *Value) bool { 14120 v_1 := v.Args[1] 14121 v_0 := v.Args[0] 14122 b := v.Block 14123 // match: (Lsh16x32 x y) 14124 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14125 for { 14126 x := v_0 14127 y := v_1 14128 v.reset(OpARMCMOVWHSconst) 14129 v.AuxInt = int32ToAuxInt(0) 14130 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14131 v0.AddArg2(x, y) 14132 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14133 v1.AuxInt = int32ToAuxInt(256) 14134 v1.AddArg(y) 14135 v.AddArg2(v0, v1) 14136 return true 14137 } 14138 } 14139 func rewriteValueARM_OpLsh16x64(v *Value) bool { 14140 v_1 := v.Args[1] 14141 v_0 := v.Args[0] 14142 // match: (Lsh16x64 x (Const64 [c])) 14143 // cond: uint64(c) < 16 14144 // result: (SLLconst x [int32(c)]) 14145 for { 14146 x := v_0 14147 if v_1.Op != OpConst64 { 14148 break 14149 } 14150 c := auxIntToInt64(v_1.AuxInt) 14151 if !(uint64(c) < 16) { 14152 break 14153 } 14154 v.reset(OpARMSLLconst) 14155 v.AuxInt = int32ToAuxInt(int32(c)) 14156 v.AddArg(x) 14157 return true 14158 } 14159 // match: (Lsh16x64 _ (Const64 [c])) 14160 // cond: uint64(c) >= 16 14161 // result: (Const16 [0]) 14162 for { 14163 if v_1.Op != OpConst64 { 14164 break 14165 } 14166 c := auxIntToInt64(v_1.AuxInt) 14167 if !(uint64(c) >= 16) { 14168 break 14169 } 14170 v.reset(OpConst16) 14171 v.AuxInt = int16ToAuxInt(0) 14172 return true 14173 } 14174 return false 14175 } 14176 func rewriteValueARM_OpLsh16x8(v *Value) bool { 14177 v_1 := v.Args[1] 14178 v_0 := v.Args[0] 14179 b := v.Block 14180 typ := &b.Func.Config.Types 14181 // match: (Lsh16x8 x y) 14182 // result: (SLL x (ZeroExt8to32 y)) 14183 for { 14184 x := v_0 14185 y := v_1 14186 v.reset(OpARMSLL) 14187 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14188 v0.AddArg(y) 14189 v.AddArg2(x, v0) 14190 return true 14191 } 14192 } 14193 func rewriteValueARM_OpLsh32x16(v *Value) bool { 14194 v_1 := v.Args[1] 14195 v_0 := v.Args[0] 14196 b := v.Block 14197 typ := &b.Func.Config.Types 14198 // match: (Lsh32x16 x y) 14199 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14200 for { 14201 x := v_0 14202 y := v_1 14203 v.reset(OpARMCMOVWHSconst) 14204 v.AuxInt = int32ToAuxInt(0) 14205 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14206 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14207 v1.AddArg(y) 14208 v0.AddArg2(x, v1) 14209 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14210 v2.AuxInt = int32ToAuxInt(256) 14211 v2.AddArg(v1) 14212 v.AddArg2(v0, v2) 14213 return true 14214 } 14215 } 14216 func rewriteValueARM_OpLsh32x32(v *Value) bool { 14217 v_1 := v.Args[1] 14218 v_0 := v.Args[0] 14219 b := v.Block 14220 // match: (Lsh32x32 x y) 14221 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14222 for { 14223 x := v_0 14224 y := v_1 14225 v.reset(OpARMCMOVWHSconst) 14226 v.AuxInt = int32ToAuxInt(0) 14227 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14228 v0.AddArg2(x, y) 14229 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14230 v1.AuxInt = int32ToAuxInt(256) 14231 v1.AddArg(y) 14232 v.AddArg2(v0, v1) 14233 return true 14234 } 14235 } 14236 func rewriteValueARM_OpLsh32x64(v *Value) bool { 14237 v_1 := v.Args[1] 14238 v_0 := v.Args[0] 14239 // match: (Lsh32x64 x (Const64 [c])) 14240 // cond: uint64(c) < 32 14241 // result: (SLLconst x [int32(c)]) 14242 for { 14243 x := v_0 14244 if v_1.Op != OpConst64 { 14245 break 14246 } 14247 c := auxIntToInt64(v_1.AuxInt) 14248 if !(uint64(c) < 32) { 14249 break 14250 } 14251 v.reset(OpARMSLLconst) 14252 v.AuxInt = int32ToAuxInt(int32(c)) 14253 v.AddArg(x) 14254 return true 14255 } 14256 // match: (Lsh32x64 _ (Const64 [c])) 14257 // cond: uint64(c) >= 32 14258 // result: (Const32 [0]) 14259 for { 14260 if v_1.Op != OpConst64 { 14261 break 14262 } 14263 c := auxIntToInt64(v_1.AuxInt) 14264 if !(uint64(c) >= 32) { 14265 break 14266 } 14267 v.reset(OpConst32) 14268 v.AuxInt = int32ToAuxInt(0) 14269 return true 14270 } 14271 return false 14272 } 14273 func rewriteValueARM_OpLsh32x8(v *Value) bool { 14274 v_1 := v.Args[1] 14275 v_0 := v.Args[0] 14276 b := v.Block 14277 typ := &b.Func.Config.Types 14278 // match: (Lsh32x8 x y) 14279 // result: (SLL x (ZeroExt8to32 y)) 14280 for { 14281 x := v_0 14282 y := v_1 14283 v.reset(OpARMSLL) 14284 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14285 v0.AddArg(y) 14286 v.AddArg2(x, v0) 14287 return true 14288 } 14289 } 14290 func rewriteValueARM_OpLsh8x16(v *Value) bool { 14291 v_1 := v.Args[1] 14292 v_0 := v.Args[0] 14293 b := v.Block 14294 typ := &b.Func.Config.Types 14295 // match: (Lsh8x16 x y) 14296 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14297 for { 14298 x := v_0 14299 y := v_1 14300 v.reset(OpARMCMOVWHSconst) 14301 v.AuxInt = int32ToAuxInt(0) 14302 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14303 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14304 v1.AddArg(y) 14305 v0.AddArg2(x, v1) 14306 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14307 v2.AuxInt = int32ToAuxInt(256) 14308 v2.AddArg(v1) 14309 v.AddArg2(v0, v2) 14310 return true 14311 } 14312 } 14313 func rewriteValueARM_OpLsh8x32(v *Value) bool { 14314 v_1 := v.Args[1] 14315 v_0 := v.Args[0] 14316 b := v.Block 14317 // match: (Lsh8x32 x y) 14318 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14319 for { 14320 x := v_0 14321 y := v_1 14322 v.reset(OpARMCMOVWHSconst) 14323 v.AuxInt = int32ToAuxInt(0) 14324 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14325 v0.AddArg2(x, y) 14326 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 14327 v1.AuxInt = int32ToAuxInt(256) 14328 v1.AddArg(y) 14329 v.AddArg2(v0, v1) 14330 return true 14331 } 14332 } 14333 func rewriteValueARM_OpLsh8x64(v *Value) bool { 14334 v_1 := v.Args[1] 14335 v_0 := v.Args[0] 14336 // match: (Lsh8x64 x (Const64 [c])) 14337 // cond: uint64(c) < 8 14338 // result: (SLLconst x [int32(c)]) 14339 for { 14340 x := v_0 14341 if v_1.Op != OpConst64 { 14342 break 14343 } 14344 c := auxIntToInt64(v_1.AuxInt) 14345 if !(uint64(c) < 8) { 14346 break 14347 } 14348 v.reset(OpARMSLLconst) 14349 v.AuxInt = int32ToAuxInt(int32(c)) 14350 v.AddArg(x) 14351 return true 14352 } 14353 // match: (Lsh8x64 _ (Const64 [c])) 14354 // cond: uint64(c) >= 8 14355 // result: (Const8 [0]) 14356 for { 14357 if v_1.Op != OpConst64 { 14358 break 14359 } 14360 c := auxIntToInt64(v_1.AuxInt) 14361 if !(uint64(c) >= 8) { 14362 break 14363 } 14364 v.reset(OpConst8) 14365 v.AuxInt = int8ToAuxInt(0) 14366 return true 14367 } 14368 return false 14369 } 14370 func rewriteValueARM_OpLsh8x8(v *Value) bool { 14371 v_1 := v.Args[1] 14372 v_0 := v.Args[0] 14373 b := v.Block 14374 typ := &b.Func.Config.Types 14375 // match: (Lsh8x8 x y) 14376 // result: (SLL x (ZeroExt8to32 y)) 14377 for { 14378 x := v_0 14379 y := v_1 14380 v.reset(OpARMSLL) 14381 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14382 v0.AddArg(y) 14383 v.AddArg2(x, v0) 14384 return true 14385 } 14386 } 14387 func rewriteValueARM_OpMod16(v *Value) bool { 14388 v_1 := v.Args[1] 14389 v_0 := v.Args[0] 14390 b := v.Block 14391 typ := &b.Func.Config.Types 14392 // match: (Mod16 x y) 14393 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 14394 for { 14395 x := v_0 14396 y := v_1 14397 v.reset(OpMod32) 14398 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 14399 v0.AddArg(x) 14400 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 14401 v1.AddArg(y) 14402 v.AddArg2(v0, v1) 14403 return true 14404 } 14405 } 14406 func rewriteValueARM_OpMod16u(v *Value) bool { 14407 v_1 := v.Args[1] 14408 v_0 := v.Args[0] 14409 b := v.Block 14410 typ := &b.Func.Config.Types 14411 // match: (Mod16u x y) 14412 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 14413 for { 14414 x := v_0 14415 y := v_1 14416 v.reset(OpMod32u) 14417 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14418 v0.AddArg(x) 14419 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14420 v1.AddArg(y) 14421 v.AddArg2(v0, v1) 14422 return true 14423 } 14424 } 14425 func rewriteValueARM_OpMod32(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: (Mod32 x y) 14431 // 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)) 14432 for { 14433 x := v_0 14434 y := v_1 14435 v.reset(OpARMSUB) 14436 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14437 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) 14438 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 14439 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 14440 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14441 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14442 v5.AddArg(x) 14443 v4.AddArg2(x, v5) 14444 v3.AddArg2(v4, v5) 14445 v6 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 14446 v7 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14447 v8 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14448 v8.AddArg(y) 14449 v7.AddArg2(y, v8) 14450 v6.AddArg2(v7, v8) 14451 v2.AddArg2(v3, v6) 14452 v1.AddArg(v2) 14453 v0.AddArg2(v1, v5) 14454 v.AddArg2(v0, v5) 14455 return true 14456 } 14457 } 14458 func rewriteValueARM_OpMod32u(v *Value) bool { 14459 v_1 := v.Args[1] 14460 v_0 := v.Args[0] 14461 b := v.Block 14462 typ := &b.Func.Config.Types 14463 // match: (Mod32u x y) 14464 // result: (Select1 <typ.UInt32> (CALLudiv x y)) 14465 for { 14466 x := v_0 14467 y := v_1 14468 v.reset(OpSelect1) 14469 v.Type = typ.UInt32 14470 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 14471 v0.AddArg2(x, y) 14472 v.AddArg(v0) 14473 return true 14474 } 14475 } 14476 func rewriteValueARM_OpMod8(v *Value) bool { 14477 v_1 := v.Args[1] 14478 v_0 := v.Args[0] 14479 b := v.Block 14480 typ := &b.Func.Config.Types 14481 // match: (Mod8 x y) 14482 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 14483 for { 14484 x := v_0 14485 y := v_1 14486 v.reset(OpMod32) 14487 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 14488 v0.AddArg(x) 14489 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 14490 v1.AddArg(y) 14491 v.AddArg2(v0, v1) 14492 return true 14493 } 14494 } 14495 func rewriteValueARM_OpMod8u(v *Value) bool { 14496 v_1 := v.Args[1] 14497 v_0 := v.Args[0] 14498 b := v.Block 14499 typ := &b.Func.Config.Types 14500 // match: (Mod8u x y) 14501 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 14502 for { 14503 x := v_0 14504 y := v_1 14505 v.reset(OpMod32u) 14506 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14507 v0.AddArg(x) 14508 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14509 v1.AddArg(y) 14510 v.AddArg2(v0, v1) 14511 return true 14512 } 14513 } 14514 func rewriteValueARM_OpMove(v *Value) bool { 14515 v_2 := v.Args[2] 14516 v_1 := v.Args[1] 14517 v_0 := v.Args[0] 14518 b := v.Block 14519 config := b.Func.Config 14520 typ := &b.Func.Config.Types 14521 // match: (Move [0] _ _ mem) 14522 // result: mem 14523 for { 14524 if auxIntToInt64(v.AuxInt) != 0 { 14525 break 14526 } 14527 mem := v_2 14528 v.copyOf(mem) 14529 return true 14530 } 14531 // match: (Move [1] dst src mem) 14532 // result: (MOVBstore dst (MOVBUload src mem) mem) 14533 for { 14534 if auxIntToInt64(v.AuxInt) != 1 { 14535 break 14536 } 14537 dst := v_0 14538 src := v_1 14539 mem := v_2 14540 v.reset(OpARMMOVBstore) 14541 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14542 v0.AddArg2(src, mem) 14543 v.AddArg3(dst, v0, mem) 14544 return true 14545 } 14546 // match: (Move [2] {t} dst src mem) 14547 // cond: t.Alignment()%2 == 0 14548 // result: (MOVHstore dst (MOVHUload src mem) mem) 14549 for { 14550 if auxIntToInt64(v.AuxInt) != 2 { 14551 break 14552 } 14553 t := auxToType(v.Aux) 14554 dst := v_0 14555 src := v_1 14556 mem := v_2 14557 if !(t.Alignment()%2 == 0) { 14558 break 14559 } 14560 v.reset(OpARMMOVHstore) 14561 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 14562 v0.AddArg2(src, mem) 14563 v.AddArg3(dst, v0, mem) 14564 return true 14565 } 14566 // match: (Move [2] dst src mem) 14567 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 14568 for { 14569 if auxIntToInt64(v.AuxInt) != 2 { 14570 break 14571 } 14572 dst := v_0 14573 src := v_1 14574 mem := v_2 14575 v.reset(OpARMMOVBstore) 14576 v.AuxInt = int32ToAuxInt(1) 14577 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14578 v0.AuxInt = int32ToAuxInt(1) 14579 v0.AddArg2(src, mem) 14580 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14581 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14582 v2.AddArg2(src, mem) 14583 v1.AddArg3(dst, v2, mem) 14584 v.AddArg3(dst, v0, v1) 14585 return true 14586 } 14587 // match: (Move [4] {t} dst src mem) 14588 // cond: t.Alignment()%4 == 0 14589 // result: (MOVWstore dst (MOVWload src mem) mem) 14590 for { 14591 if auxIntToInt64(v.AuxInt) != 4 { 14592 break 14593 } 14594 t := auxToType(v.Aux) 14595 dst := v_0 14596 src := v_1 14597 mem := v_2 14598 if !(t.Alignment()%4 == 0) { 14599 break 14600 } 14601 v.reset(OpARMMOVWstore) 14602 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32) 14603 v0.AddArg2(src, mem) 14604 v.AddArg3(dst, v0, mem) 14605 return true 14606 } 14607 // match: (Move [4] {t} dst src mem) 14608 // cond: t.Alignment()%2 == 0 14609 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 14610 for { 14611 if auxIntToInt64(v.AuxInt) != 4 { 14612 break 14613 } 14614 t := auxToType(v.Aux) 14615 dst := v_0 14616 src := v_1 14617 mem := v_2 14618 if !(t.Alignment()%2 == 0) { 14619 break 14620 } 14621 v.reset(OpARMMOVHstore) 14622 v.AuxInt = int32ToAuxInt(2) 14623 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 14624 v0.AuxInt = int32ToAuxInt(2) 14625 v0.AddArg2(src, mem) 14626 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 14627 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 14628 v2.AddArg2(src, mem) 14629 v1.AddArg3(dst, v2, mem) 14630 v.AddArg3(dst, v0, v1) 14631 return true 14632 } 14633 // match: (Move [4] dst src mem) 14634 // 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)))) 14635 for { 14636 if auxIntToInt64(v.AuxInt) != 4 { 14637 break 14638 } 14639 dst := v_0 14640 src := v_1 14641 mem := v_2 14642 v.reset(OpARMMOVBstore) 14643 v.AuxInt = int32ToAuxInt(3) 14644 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14645 v0.AuxInt = int32ToAuxInt(3) 14646 v0.AddArg2(src, mem) 14647 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14648 v1.AuxInt = int32ToAuxInt(2) 14649 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14650 v2.AuxInt = int32ToAuxInt(2) 14651 v2.AddArg2(src, mem) 14652 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14653 v3.AuxInt = int32ToAuxInt(1) 14654 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14655 v4.AuxInt = int32ToAuxInt(1) 14656 v4.AddArg2(src, mem) 14657 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14658 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14659 v6.AddArg2(src, mem) 14660 v5.AddArg3(dst, v6, mem) 14661 v3.AddArg3(dst, v4, v5) 14662 v1.AddArg3(dst, v2, v3) 14663 v.AddArg3(dst, v0, v1) 14664 return true 14665 } 14666 // match: (Move [3] dst src mem) 14667 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 14668 for { 14669 if auxIntToInt64(v.AuxInt) != 3 { 14670 break 14671 } 14672 dst := v_0 14673 src := v_1 14674 mem := v_2 14675 v.reset(OpARMMOVBstore) 14676 v.AuxInt = int32ToAuxInt(2) 14677 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14678 v0.AuxInt = int32ToAuxInt(2) 14679 v0.AddArg2(src, mem) 14680 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14681 v1.AuxInt = int32ToAuxInt(1) 14682 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14683 v2.AuxInt = int32ToAuxInt(1) 14684 v2.AddArg2(src, mem) 14685 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 14686 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 14687 v4.AddArg2(src, mem) 14688 v3.AddArg3(dst, v4, mem) 14689 v1.AddArg3(dst, v2, v3) 14690 v.AddArg3(dst, v0, v1) 14691 return true 14692 } 14693 // match: (Move [s] {t} dst src mem) 14694 // cond: s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && !config.noDuffDevice && logLargeCopy(v, s) 14695 // result: (DUFFCOPY [8 * (128 - s/4)] dst src mem) 14696 for { 14697 s := auxIntToInt64(v.AuxInt) 14698 t := auxToType(v.Aux) 14699 dst := v_0 14700 src := v_1 14701 mem := v_2 14702 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && !config.noDuffDevice && logLargeCopy(v, s)) { 14703 break 14704 } 14705 v.reset(OpARMDUFFCOPY) 14706 v.AuxInt = int64ToAuxInt(8 * (128 - s/4)) 14707 v.AddArg3(dst, src, mem) 14708 return true 14709 } 14710 // match: (Move [s] {t} dst src mem) 14711 // cond: ((s > 512 || config.noDuffDevice) || t.Alignment()%4 != 0) && logLargeCopy(v, s) 14712 // result: (LoweredMove [t.Alignment()] dst src (ADDconst <src.Type> src [int32(s-moveSize(t.Alignment(), config))]) mem) 14713 for { 14714 s := auxIntToInt64(v.AuxInt) 14715 t := auxToType(v.Aux) 14716 dst := v_0 14717 src := v_1 14718 mem := v_2 14719 if !(((s > 512 || config.noDuffDevice) || t.Alignment()%4 != 0) && logLargeCopy(v, s)) { 14720 break 14721 } 14722 v.reset(OpARMLoweredMove) 14723 v.AuxInt = int64ToAuxInt(t.Alignment()) 14724 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 14725 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config))) 14726 v0.AddArg(src) 14727 v.AddArg4(dst, src, v0, mem) 14728 return true 14729 } 14730 return false 14731 } 14732 func rewriteValueARM_OpNeg16(v *Value) bool { 14733 v_0 := v.Args[0] 14734 // match: (Neg16 x) 14735 // result: (RSBconst [0] x) 14736 for { 14737 x := v_0 14738 v.reset(OpARMRSBconst) 14739 v.AuxInt = int32ToAuxInt(0) 14740 v.AddArg(x) 14741 return true 14742 } 14743 } 14744 func rewriteValueARM_OpNeg32(v *Value) bool { 14745 v_0 := v.Args[0] 14746 // match: (Neg32 x) 14747 // result: (RSBconst [0] x) 14748 for { 14749 x := v_0 14750 v.reset(OpARMRSBconst) 14751 v.AuxInt = int32ToAuxInt(0) 14752 v.AddArg(x) 14753 return true 14754 } 14755 } 14756 func rewriteValueARM_OpNeg8(v *Value) bool { 14757 v_0 := v.Args[0] 14758 // match: (Neg8 x) 14759 // result: (RSBconst [0] x) 14760 for { 14761 x := v_0 14762 v.reset(OpARMRSBconst) 14763 v.AuxInt = int32ToAuxInt(0) 14764 v.AddArg(x) 14765 return true 14766 } 14767 } 14768 func rewriteValueARM_OpNeq16(v *Value) bool { 14769 v_1 := v.Args[1] 14770 v_0 := v.Args[0] 14771 b := v.Block 14772 typ := &b.Func.Config.Types 14773 // match: (Neq16 x y) 14774 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14775 for { 14776 x := v_0 14777 y := v_1 14778 v.reset(OpARMNotEqual) 14779 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14780 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14781 v1.AddArg(x) 14782 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14783 v2.AddArg(y) 14784 v0.AddArg2(v1, v2) 14785 v.AddArg(v0) 14786 return true 14787 } 14788 } 14789 func rewriteValueARM_OpNeq32(v *Value) bool { 14790 v_1 := v.Args[1] 14791 v_0 := v.Args[0] 14792 b := v.Block 14793 // match: (Neq32 x y) 14794 // result: (NotEqual (CMP x y)) 14795 for { 14796 x := v_0 14797 y := v_1 14798 v.reset(OpARMNotEqual) 14799 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14800 v0.AddArg2(x, y) 14801 v.AddArg(v0) 14802 return true 14803 } 14804 } 14805 func rewriteValueARM_OpNeq32F(v *Value) bool { 14806 v_1 := v.Args[1] 14807 v_0 := v.Args[0] 14808 b := v.Block 14809 // match: (Neq32F x y) 14810 // result: (NotEqual (CMPF x y)) 14811 for { 14812 x := v_0 14813 y := v_1 14814 v.reset(OpARMNotEqual) 14815 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 14816 v0.AddArg2(x, y) 14817 v.AddArg(v0) 14818 return true 14819 } 14820 } 14821 func rewriteValueARM_OpNeq64F(v *Value) bool { 14822 v_1 := v.Args[1] 14823 v_0 := v.Args[0] 14824 b := v.Block 14825 // match: (Neq64F x y) 14826 // result: (NotEqual (CMPD x y)) 14827 for { 14828 x := v_0 14829 y := v_1 14830 v.reset(OpARMNotEqual) 14831 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 14832 v0.AddArg2(x, y) 14833 v.AddArg(v0) 14834 return true 14835 } 14836 } 14837 func rewriteValueARM_OpNeq8(v *Value) bool { 14838 v_1 := v.Args[1] 14839 v_0 := v.Args[0] 14840 b := v.Block 14841 typ := &b.Func.Config.Types 14842 // match: (Neq8 x y) 14843 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14844 for { 14845 x := v_0 14846 y := v_1 14847 v.reset(OpARMNotEqual) 14848 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14849 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14850 v1.AddArg(x) 14851 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14852 v2.AddArg(y) 14853 v0.AddArg2(v1, v2) 14854 v.AddArg(v0) 14855 return true 14856 } 14857 } 14858 func rewriteValueARM_OpNeqPtr(v *Value) bool { 14859 v_1 := v.Args[1] 14860 v_0 := v.Args[0] 14861 b := v.Block 14862 // match: (NeqPtr x y) 14863 // result: (NotEqual (CMP x y)) 14864 for { 14865 x := v_0 14866 y := v_1 14867 v.reset(OpARMNotEqual) 14868 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14869 v0.AddArg2(x, y) 14870 v.AddArg(v0) 14871 return true 14872 } 14873 } 14874 func rewriteValueARM_OpNot(v *Value) bool { 14875 v_0 := v.Args[0] 14876 // match: (Not x) 14877 // result: (XORconst [1] x) 14878 for { 14879 x := v_0 14880 v.reset(OpARMXORconst) 14881 v.AuxInt = int32ToAuxInt(1) 14882 v.AddArg(x) 14883 return true 14884 } 14885 } 14886 func rewriteValueARM_OpOffPtr(v *Value) bool { 14887 v_0 := v.Args[0] 14888 // match: (OffPtr [off] ptr:(SP)) 14889 // result: (MOVWaddr [int32(off)] ptr) 14890 for { 14891 off := auxIntToInt64(v.AuxInt) 14892 ptr := v_0 14893 if ptr.Op != OpSP { 14894 break 14895 } 14896 v.reset(OpARMMOVWaddr) 14897 v.AuxInt = int32ToAuxInt(int32(off)) 14898 v.AddArg(ptr) 14899 return true 14900 } 14901 // match: (OffPtr [off] ptr) 14902 // result: (ADDconst [int32(off)] ptr) 14903 for { 14904 off := auxIntToInt64(v.AuxInt) 14905 ptr := v_0 14906 v.reset(OpARMADDconst) 14907 v.AuxInt = int32ToAuxInt(int32(off)) 14908 v.AddArg(ptr) 14909 return true 14910 } 14911 } 14912 func rewriteValueARM_OpPanicBounds(v *Value) bool { 14913 v_2 := v.Args[2] 14914 v_1 := v.Args[1] 14915 v_0 := v.Args[0] 14916 // match: (PanicBounds [kind] x y mem) 14917 // cond: boundsABI(kind) == 0 14918 // result: (LoweredPanicBoundsA [kind] x y mem) 14919 for { 14920 kind := auxIntToInt64(v.AuxInt) 14921 x := v_0 14922 y := v_1 14923 mem := v_2 14924 if !(boundsABI(kind) == 0) { 14925 break 14926 } 14927 v.reset(OpARMLoweredPanicBoundsA) 14928 v.AuxInt = int64ToAuxInt(kind) 14929 v.AddArg3(x, y, mem) 14930 return true 14931 } 14932 // match: (PanicBounds [kind] x y mem) 14933 // cond: boundsABI(kind) == 1 14934 // result: (LoweredPanicBoundsB [kind] x y mem) 14935 for { 14936 kind := auxIntToInt64(v.AuxInt) 14937 x := v_0 14938 y := v_1 14939 mem := v_2 14940 if !(boundsABI(kind) == 1) { 14941 break 14942 } 14943 v.reset(OpARMLoweredPanicBoundsB) 14944 v.AuxInt = int64ToAuxInt(kind) 14945 v.AddArg3(x, y, mem) 14946 return true 14947 } 14948 // match: (PanicBounds [kind] x y mem) 14949 // cond: boundsABI(kind) == 2 14950 // result: (LoweredPanicBoundsC [kind] x y mem) 14951 for { 14952 kind := auxIntToInt64(v.AuxInt) 14953 x := v_0 14954 y := v_1 14955 mem := v_2 14956 if !(boundsABI(kind) == 2) { 14957 break 14958 } 14959 v.reset(OpARMLoweredPanicBoundsC) 14960 v.AuxInt = int64ToAuxInt(kind) 14961 v.AddArg3(x, y, mem) 14962 return true 14963 } 14964 return false 14965 } 14966 func rewriteValueARM_OpPanicExtend(v *Value) bool { 14967 v_3 := v.Args[3] 14968 v_2 := v.Args[2] 14969 v_1 := v.Args[1] 14970 v_0 := v.Args[0] 14971 // match: (PanicExtend [kind] hi lo y mem) 14972 // cond: boundsABI(kind) == 0 14973 // result: (LoweredPanicExtendA [kind] hi lo y mem) 14974 for { 14975 kind := auxIntToInt64(v.AuxInt) 14976 hi := v_0 14977 lo := v_1 14978 y := v_2 14979 mem := v_3 14980 if !(boundsABI(kind) == 0) { 14981 break 14982 } 14983 v.reset(OpARMLoweredPanicExtendA) 14984 v.AuxInt = int64ToAuxInt(kind) 14985 v.AddArg4(hi, lo, y, mem) 14986 return true 14987 } 14988 // match: (PanicExtend [kind] hi lo y mem) 14989 // cond: boundsABI(kind) == 1 14990 // result: (LoweredPanicExtendB [kind] hi lo y mem) 14991 for { 14992 kind := auxIntToInt64(v.AuxInt) 14993 hi := v_0 14994 lo := v_1 14995 y := v_2 14996 mem := v_3 14997 if !(boundsABI(kind) == 1) { 14998 break 14999 } 15000 v.reset(OpARMLoweredPanicExtendB) 15001 v.AuxInt = int64ToAuxInt(kind) 15002 v.AddArg4(hi, lo, y, mem) 15003 return true 15004 } 15005 // match: (PanicExtend [kind] hi lo y mem) 15006 // cond: boundsABI(kind) == 2 15007 // result: (LoweredPanicExtendC [kind] hi lo y mem) 15008 for { 15009 kind := auxIntToInt64(v.AuxInt) 15010 hi := v_0 15011 lo := v_1 15012 y := v_2 15013 mem := v_3 15014 if !(boundsABI(kind) == 2) { 15015 break 15016 } 15017 v.reset(OpARMLoweredPanicExtendC) 15018 v.AuxInt = int64ToAuxInt(kind) 15019 v.AddArg4(hi, lo, y, mem) 15020 return true 15021 } 15022 return false 15023 } 15024 func rewriteValueARM_OpRotateLeft16(v *Value) bool { 15025 v_1 := v.Args[1] 15026 v_0 := v.Args[0] 15027 b := v.Block 15028 typ := &b.Func.Config.Types 15029 // match: (RotateLeft16 <t> x (MOVWconst [c])) 15030 // result: (Or16 (Lsh16x32 <t> x (MOVWconst [c&15])) (Rsh16Ux32 <t> x (MOVWconst [-c&15]))) 15031 for { 15032 t := v.Type 15033 x := v_0 15034 if v_1.Op != OpARMMOVWconst { 15035 break 15036 } 15037 c := auxIntToInt32(v_1.AuxInt) 15038 v.reset(OpOr16) 15039 v0 := b.NewValue0(v.Pos, OpLsh16x32, t) 15040 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15041 v1.AuxInt = int32ToAuxInt(c & 15) 15042 v0.AddArg2(x, v1) 15043 v2 := b.NewValue0(v.Pos, OpRsh16Ux32, t) 15044 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15045 v3.AuxInt = int32ToAuxInt(-c & 15) 15046 v2.AddArg2(x, v3) 15047 v.AddArg2(v0, v2) 15048 return true 15049 } 15050 return false 15051 } 15052 func rewriteValueARM_OpRotateLeft32(v *Value) bool { 15053 v_1 := v.Args[1] 15054 v_0 := v.Args[0] 15055 b := v.Block 15056 // match: (RotateLeft32 x y) 15057 // result: (SRR x (RSBconst [0] <y.Type> y)) 15058 for { 15059 x := v_0 15060 y := v_1 15061 v.reset(OpARMSRR) 15062 v0 := b.NewValue0(v.Pos, OpARMRSBconst, y.Type) 15063 v0.AuxInt = int32ToAuxInt(0) 15064 v0.AddArg(y) 15065 v.AddArg2(x, v0) 15066 return true 15067 } 15068 } 15069 func rewriteValueARM_OpRotateLeft8(v *Value) bool { 15070 v_1 := v.Args[1] 15071 v_0 := v.Args[0] 15072 b := v.Block 15073 typ := &b.Func.Config.Types 15074 // match: (RotateLeft8 <t> x (MOVWconst [c])) 15075 // result: (Or8 (Lsh8x32 <t> x (MOVWconst [c&7])) (Rsh8Ux32 <t> x (MOVWconst [-c&7]))) 15076 for { 15077 t := v.Type 15078 x := v_0 15079 if v_1.Op != OpARMMOVWconst { 15080 break 15081 } 15082 c := auxIntToInt32(v_1.AuxInt) 15083 v.reset(OpOr8) 15084 v0 := b.NewValue0(v.Pos, OpLsh8x32, t) 15085 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15086 v1.AuxInt = int32ToAuxInt(c & 7) 15087 v0.AddArg2(x, v1) 15088 v2 := b.NewValue0(v.Pos, OpRsh8Ux32, t) 15089 v3 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15090 v3.AuxInt = int32ToAuxInt(-c & 7) 15091 v2.AddArg2(x, v3) 15092 v.AddArg2(v0, v2) 15093 return true 15094 } 15095 return false 15096 } 15097 func rewriteValueARM_OpRsh16Ux16(v *Value) bool { 15098 v_1 := v.Args[1] 15099 v_0 := v.Args[0] 15100 b := v.Block 15101 typ := &b.Func.Config.Types 15102 // match: (Rsh16Ux16 x y) 15103 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15104 for { 15105 x := v_0 15106 y := v_1 15107 v.reset(OpARMCMOVWHSconst) 15108 v.AuxInt = int32ToAuxInt(0) 15109 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15110 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15111 v1.AddArg(x) 15112 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15113 v2.AddArg(y) 15114 v0.AddArg2(v1, v2) 15115 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15116 v3.AuxInt = int32ToAuxInt(256) 15117 v3.AddArg(v2) 15118 v.AddArg2(v0, v3) 15119 return true 15120 } 15121 } 15122 func rewriteValueARM_OpRsh16Ux32(v *Value) bool { 15123 v_1 := v.Args[1] 15124 v_0 := v.Args[0] 15125 b := v.Block 15126 typ := &b.Func.Config.Types 15127 // match: (Rsh16Ux32 x y) 15128 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 15129 for { 15130 x := v_0 15131 y := v_1 15132 v.reset(OpARMCMOVWHSconst) 15133 v.AuxInt = int32ToAuxInt(0) 15134 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15135 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15136 v1.AddArg(x) 15137 v0.AddArg2(v1, y) 15138 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15139 v2.AuxInt = int32ToAuxInt(256) 15140 v2.AddArg(y) 15141 v.AddArg2(v0, v2) 15142 return true 15143 } 15144 } 15145 func rewriteValueARM_OpRsh16Ux64(v *Value) bool { 15146 v_1 := v.Args[1] 15147 v_0 := v.Args[0] 15148 b := v.Block 15149 typ := &b.Func.Config.Types 15150 // match: (Rsh16Ux64 x (Const64 [c])) 15151 // cond: uint64(c) < 16 15152 // result: (SRLconst (SLLconst <typ.UInt32> x [16]) [int32(c+16)]) 15153 for { 15154 x := v_0 15155 if v_1.Op != OpConst64 { 15156 break 15157 } 15158 c := auxIntToInt64(v_1.AuxInt) 15159 if !(uint64(c) < 16) { 15160 break 15161 } 15162 v.reset(OpARMSRLconst) 15163 v.AuxInt = int32ToAuxInt(int32(c + 16)) 15164 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15165 v0.AuxInt = int32ToAuxInt(16) 15166 v0.AddArg(x) 15167 v.AddArg(v0) 15168 return true 15169 } 15170 // match: (Rsh16Ux64 _ (Const64 [c])) 15171 // cond: uint64(c) >= 16 15172 // result: (Const16 [0]) 15173 for { 15174 if v_1.Op != OpConst64 { 15175 break 15176 } 15177 c := auxIntToInt64(v_1.AuxInt) 15178 if !(uint64(c) >= 16) { 15179 break 15180 } 15181 v.reset(OpConst16) 15182 v.AuxInt = int16ToAuxInt(0) 15183 return true 15184 } 15185 return false 15186 } 15187 func rewriteValueARM_OpRsh16Ux8(v *Value) bool { 15188 v_1 := v.Args[1] 15189 v_0 := v.Args[0] 15190 b := v.Block 15191 typ := &b.Func.Config.Types 15192 // match: (Rsh16Ux8 x y) 15193 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 15194 for { 15195 x := v_0 15196 y := v_1 15197 v.reset(OpARMSRL) 15198 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15199 v0.AddArg(x) 15200 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15201 v1.AddArg(y) 15202 v.AddArg2(v0, v1) 15203 return true 15204 } 15205 } 15206 func rewriteValueARM_OpRsh16x16(v *Value) bool { 15207 v_1 := v.Args[1] 15208 v_0 := v.Args[0] 15209 b := v.Block 15210 typ := &b.Func.Config.Types 15211 // match: (Rsh16x16 x y) 15212 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15213 for { 15214 x := v_0 15215 y := v_1 15216 v.reset(OpARMSRAcond) 15217 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15218 v0.AddArg(x) 15219 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15220 v1.AddArg(y) 15221 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15222 v2.AuxInt = int32ToAuxInt(256) 15223 v2.AddArg(v1) 15224 v.AddArg3(v0, v1, v2) 15225 return true 15226 } 15227 } 15228 func rewriteValueARM_OpRsh16x32(v *Value) bool { 15229 v_1 := v.Args[1] 15230 v_0 := v.Args[0] 15231 b := v.Block 15232 typ := &b.Func.Config.Types 15233 // match: (Rsh16x32 x y) 15234 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 15235 for { 15236 x := v_0 15237 y := v_1 15238 v.reset(OpARMSRAcond) 15239 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15240 v0.AddArg(x) 15241 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15242 v1.AuxInt = int32ToAuxInt(256) 15243 v1.AddArg(y) 15244 v.AddArg3(v0, y, v1) 15245 return true 15246 } 15247 } 15248 func rewriteValueARM_OpRsh16x64(v *Value) bool { 15249 v_1 := v.Args[1] 15250 v_0 := v.Args[0] 15251 b := v.Block 15252 typ := &b.Func.Config.Types 15253 // match: (Rsh16x64 x (Const64 [c])) 15254 // cond: uint64(c) < 16 15255 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [int32(c+16)]) 15256 for { 15257 x := v_0 15258 if v_1.Op != OpConst64 { 15259 break 15260 } 15261 c := auxIntToInt64(v_1.AuxInt) 15262 if !(uint64(c) < 16) { 15263 break 15264 } 15265 v.reset(OpARMSRAconst) 15266 v.AuxInt = int32ToAuxInt(int32(c + 16)) 15267 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15268 v0.AuxInt = int32ToAuxInt(16) 15269 v0.AddArg(x) 15270 v.AddArg(v0) 15271 return true 15272 } 15273 // match: (Rsh16x64 x (Const64 [c])) 15274 // cond: uint64(c) >= 16 15275 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [31]) 15276 for { 15277 x := v_0 15278 if v_1.Op != OpConst64 { 15279 break 15280 } 15281 c := auxIntToInt64(v_1.AuxInt) 15282 if !(uint64(c) >= 16) { 15283 break 15284 } 15285 v.reset(OpARMSRAconst) 15286 v.AuxInt = int32ToAuxInt(31) 15287 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15288 v0.AuxInt = int32ToAuxInt(16) 15289 v0.AddArg(x) 15290 v.AddArg(v0) 15291 return true 15292 } 15293 return false 15294 } 15295 func rewriteValueARM_OpRsh16x8(v *Value) bool { 15296 v_1 := v.Args[1] 15297 v_0 := v.Args[0] 15298 b := v.Block 15299 typ := &b.Func.Config.Types 15300 // match: (Rsh16x8 x y) 15301 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 15302 for { 15303 x := v_0 15304 y := v_1 15305 v.reset(OpARMSRA) 15306 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15307 v0.AddArg(x) 15308 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15309 v1.AddArg(y) 15310 v.AddArg2(v0, v1) 15311 return true 15312 } 15313 } 15314 func rewriteValueARM_OpRsh32Ux16(v *Value) bool { 15315 v_1 := v.Args[1] 15316 v_0 := v.Args[0] 15317 b := v.Block 15318 typ := &b.Func.Config.Types 15319 // match: (Rsh32Ux16 x y) 15320 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15321 for { 15322 x := v_0 15323 y := v_1 15324 v.reset(OpARMCMOVWHSconst) 15325 v.AuxInt = int32ToAuxInt(0) 15326 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15327 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15328 v1.AddArg(y) 15329 v0.AddArg2(x, v1) 15330 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15331 v2.AuxInt = int32ToAuxInt(256) 15332 v2.AddArg(v1) 15333 v.AddArg2(v0, v2) 15334 return true 15335 } 15336 } 15337 func rewriteValueARM_OpRsh32Ux32(v *Value) bool { 15338 v_1 := v.Args[1] 15339 v_0 := v.Args[0] 15340 b := v.Block 15341 // match: (Rsh32Ux32 x y) 15342 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 15343 for { 15344 x := v_0 15345 y := v_1 15346 v.reset(OpARMCMOVWHSconst) 15347 v.AuxInt = int32ToAuxInt(0) 15348 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15349 v0.AddArg2(x, y) 15350 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15351 v1.AuxInt = int32ToAuxInt(256) 15352 v1.AddArg(y) 15353 v.AddArg2(v0, v1) 15354 return true 15355 } 15356 } 15357 func rewriteValueARM_OpRsh32Ux64(v *Value) bool { 15358 v_1 := v.Args[1] 15359 v_0 := v.Args[0] 15360 // match: (Rsh32Ux64 x (Const64 [c])) 15361 // cond: uint64(c) < 32 15362 // result: (SRLconst x [int32(c)]) 15363 for { 15364 x := v_0 15365 if v_1.Op != OpConst64 { 15366 break 15367 } 15368 c := auxIntToInt64(v_1.AuxInt) 15369 if !(uint64(c) < 32) { 15370 break 15371 } 15372 v.reset(OpARMSRLconst) 15373 v.AuxInt = int32ToAuxInt(int32(c)) 15374 v.AddArg(x) 15375 return true 15376 } 15377 // match: (Rsh32Ux64 _ (Const64 [c])) 15378 // cond: uint64(c) >= 32 15379 // result: (Const32 [0]) 15380 for { 15381 if v_1.Op != OpConst64 { 15382 break 15383 } 15384 c := auxIntToInt64(v_1.AuxInt) 15385 if !(uint64(c) >= 32) { 15386 break 15387 } 15388 v.reset(OpConst32) 15389 v.AuxInt = int32ToAuxInt(0) 15390 return true 15391 } 15392 return false 15393 } 15394 func rewriteValueARM_OpRsh32Ux8(v *Value) bool { 15395 v_1 := v.Args[1] 15396 v_0 := v.Args[0] 15397 b := v.Block 15398 typ := &b.Func.Config.Types 15399 // match: (Rsh32Ux8 x y) 15400 // result: (SRL x (ZeroExt8to32 y)) 15401 for { 15402 x := v_0 15403 y := v_1 15404 v.reset(OpARMSRL) 15405 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15406 v0.AddArg(y) 15407 v.AddArg2(x, v0) 15408 return true 15409 } 15410 } 15411 func rewriteValueARM_OpRsh32x16(v *Value) bool { 15412 v_1 := v.Args[1] 15413 v_0 := v.Args[0] 15414 b := v.Block 15415 typ := &b.Func.Config.Types 15416 // match: (Rsh32x16 x y) 15417 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15418 for { 15419 x := v_0 15420 y := v_1 15421 v.reset(OpARMSRAcond) 15422 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15423 v0.AddArg(y) 15424 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15425 v1.AuxInt = int32ToAuxInt(256) 15426 v1.AddArg(v0) 15427 v.AddArg3(x, v0, v1) 15428 return true 15429 } 15430 } 15431 func rewriteValueARM_OpRsh32x32(v *Value) bool { 15432 v_1 := v.Args[1] 15433 v_0 := v.Args[0] 15434 b := v.Block 15435 // match: (Rsh32x32 x y) 15436 // result: (SRAcond x y (CMPconst [256] y)) 15437 for { 15438 x := v_0 15439 y := v_1 15440 v.reset(OpARMSRAcond) 15441 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15442 v0.AuxInt = int32ToAuxInt(256) 15443 v0.AddArg(y) 15444 v.AddArg3(x, y, v0) 15445 return true 15446 } 15447 } 15448 func rewriteValueARM_OpRsh32x64(v *Value) bool { 15449 v_1 := v.Args[1] 15450 v_0 := v.Args[0] 15451 // match: (Rsh32x64 x (Const64 [c])) 15452 // cond: uint64(c) < 32 15453 // result: (SRAconst x [int32(c)]) 15454 for { 15455 x := v_0 15456 if v_1.Op != OpConst64 { 15457 break 15458 } 15459 c := auxIntToInt64(v_1.AuxInt) 15460 if !(uint64(c) < 32) { 15461 break 15462 } 15463 v.reset(OpARMSRAconst) 15464 v.AuxInt = int32ToAuxInt(int32(c)) 15465 v.AddArg(x) 15466 return true 15467 } 15468 // match: (Rsh32x64 x (Const64 [c])) 15469 // cond: uint64(c) >= 32 15470 // result: (SRAconst x [31]) 15471 for { 15472 x := v_0 15473 if v_1.Op != OpConst64 { 15474 break 15475 } 15476 c := auxIntToInt64(v_1.AuxInt) 15477 if !(uint64(c) >= 32) { 15478 break 15479 } 15480 v.reset(OpARMSRAconst) 15481 v.AuxInt = int32ToAuxInt(31) 15482 v.AddArg(x) 15483 return true 15484 } 15485 return false 15486 } 15487 func rewriteValueARM_OpRsh32x8(v *Value) bool { 15488 v_1 := v.Args[1] 15489 v_0 := v.Args[0] 15490 b := v.Block 15491 typ := &b.Func.Config.Types 15492 // match: (Rsh32x8 x y) 15493 // result: (SRA x (ZeroExt8to32 y)) 15494 for { 15495 x := v_0 15496 y := v_1 15497 v.reset(OpARMSRA) 15498 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15499 v0.AddArg(y) 15500 v.AddArg2(x, v0) 15501 return true 15502 } 15503 } 15504 func rewriteValueARM_OpRsh8Ux16(v *Value) bool { 15505 v_1 := v.Args[1] 15506 v_0 := v.Args[0] 15507 b := v.Block 15508 typ := &b.Func.Config.Types 15509 // match: (Rsh8Ux16 x y) 15510 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15511 for { 15512 x := v_0 15513 y := v_1 15514 v.reset(OpARMCMOVWHSconst) 15515 v.AuxInt = int32ToAuxInt(0) 15516 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15517 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15518 v1.AddArg(x) 15519 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15520 v2.AddArg(y) 15521 v0.AddArg2(v1, v2) 15522 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15523 v3.AuxInt = int32ToAuxInt(256) 15524 v3.AddArg(v2) 15525 v.AddArg2(v0, v3) 15526 return true 15527 } 15528 } 15529 func rewriteValueARM_OpRsh8Ux32(v *Value) bool { 15530 v_1 := v.Args[1] 15531 v_0 := v.Args[0] 15532 b := v.Block 15533 typ := &b.Func.Config.Types 15534 // match: (Rsh8Ux32 x y) 15535 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 15536 for { 15537 x := v_0 15538 y := v_1 15539 v.reset(OpARMCMOVWHSconst) 15540 v.AuxInt = int32ToAuxInt(0) 15541 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15542 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15543 v1.AddArg(x) 15544 v0.AddArg2(v1, y) 15545 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15546 v2.AuxInt = int32ToAuxInt(256) 15547 v2.AddArg(y) 15548 v.AddArg2(v0, v2) 15549 return true 15550 } 15551 } 15552 func rewriteValueARM_OpRsh8Ux64(v *Value) bool { 15553 v_1 := v.Args[1] 15554 v_0 := v.Args[0] 15555 b := v.Block 15556 typ := &b.Func.Config.Types 15557 // match: (Rsh8Ux64 x (Const64 [c])) 15558 // cond: uint64(c) < 8 15559 // result: (SRLconst (SLLconst <typ.UInt32> x [24]) [int32(c+24)]) 15560 for { 15561 x := v_0 15562 if v_1.Op != OpConst64 { 15563 break 15564 } 15565 c := auxIntToInt64(v_1.AuxInt) 15566 if !(uint64(c) < 8) { 15567 break 15568 } 15569 v.reset(OpARMSRLconst) 15570 v.AuxInt = int32ToAuxInt(int32(c + 24)) 15571 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15572 v0.AuxInt = int32ToAuxInt(24) 15573 v0.AddArg(x) 15574 v.AddArg(v0) 15575 return true 15576 } 15577 // match: (Rsh8Ux64 _ (Const64 [c])) 15578 // cond: uint64(c) >= 8 15579 // result: (Const8 [0]) 15580 for { 15581 if v_1.Op != OpConst64 { 15582 break 15583 } 15584 c := auxIntToInt64(v_1.AuxInt) 15585 if !(uint64(c) >= 8) { 15586 break 15587 } 15588 v.reset(OpConst8) 15589 v.AuxInt = int8ToAuxInt(0) 15590 return true 15591 } 15592 return false 15593 } 15594 func rewriteValueARM_OpRsh8Ux8(v *Value) bool { 15595 v_1 := v.Args[1] 15596 v_0 := v.Args[0] 15597 b := v.Block 15598 typ := &b.Func.Config.Types 15599 // match: (Rsh8Ux8 x y) 15600 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 15601 for { 15602 x := v_0 15603 y := v_1 15604 v.reset(OpARMSRL) 15605 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15606 v0.AddArg(x) 15607 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15608 v1.AddArg(y) 15609 v.AddArg2(v0, v1) 15610 return true 15611 } 15612 } 15613 func rewriteValueARM_OpRsh8x16(v *Value) bool { 15614 v_1 := v.Args[1] 15615 v_0 := v.Args[0] 15616 b := v.Block 15617 typ := &b.Func.Config.Types 15618 // match: (Rsh8x16 x y) 15619 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15620 for { 15621 x := v_0 15622 y := v_1 15623 v.reset(OpARMSRAcond) 15624 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15625 v0.AddArg(x) 15626 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15627 v1.AddArg(y) 15628 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15629 v2.AuxInt = int32ToAuxInt(256) 15630 v2.AddArg(v1) 15631 v.AddArg3(v0, v1, v2) 15632 return true 15633 } 15634 } 15635 func rewriteValueARM_OpRsh8x32(v *Value) bool { 15636 v_1 := v.Args[1] 15637 v_0 := v.Args[0] 15638 b := v.Block 15639 typ := &b.Func.Config.Types 15640 // match: (Rsh8x32 x y) 15641 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 15642 for { 15643 x := v_0 15644 y := v_1 15645 v.reset(OpARMSRAcond) 15646 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15647 v0.AddArg(x) 15648 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15649 v1.AuxInt = int32ToAuxInt(256) 15650 v1.AddArg(y) 15651 v.AddArg3(v0, y, v1) 15652 return true 15653 } 15654 } 15655 func rewriteValueARM_OpRsh8x64(v *Value) bool { 15656 v_1 := v.Args[1] 15657 v_0 := v.Args[0] 15658 b := v.Block 15659 typ := &b.Func.Config.Types 15660 // match: (Rsh8x64 x (Const64 [c])) 15661 // cond: uint64(c) < 8 15662 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [int32(c+24)]) 15663 for { 15664 x := v_0 15665 if v_1.Op != OpConst64 { 15666 break 15667 } 15668 c := auxIntToInt64(v_1.AuxInt) 15669 if !(uint64(c) < 8) { 15670 break 15671 } 15672 v.reset(OpARMSRAconst) 15673 v.AuxInt = int32ToAuxInt(int32(c + 24)) 15674 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15675 v0.AuxInt = int32ToAuxInt(24) 15676 v0.AddArg(x) 15677 v.AddArg(v0) 15678 return true 15679 } 15680 // match: (Rsh8x64 x (Const64 [c])) 15681 // cond: uint64(c) >= 8 15682 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [31]) 15683 for { 15684 x := v_0 15685 if v_1.Op != OpConst64 { 15686 break 15687 } 15688 c := auxIntToInt64(v_1.AuxInt) 15689 if !(uint64(c) >= 8) { 15690 break 15691 } 15692 v.reset(OpARMSRAconst) 15693 v.AuxInt = int32ToAuxInt(31) 15694 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 15695 v0.AuxInt = int32ToAuxInt(24) 15696 v0.AddArg(x) 15697 v.AddArg(v0) 15698 return true 15699 } 15700 return false 15701 } 15702 func rewriteValueARM_OpRsh8x8(v *Value) bool { 15703 v_1 := v.Args[1] 15704 v_0 := v.Args[0] 15705 b := v.Block 15706 typ := &b.Func.Config.Types 15707 // match: (Rsh8x8 x y) 15708 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 15709 for { 15710 x := v_0 15711 y := v_1 15712 v.reset(OpARMSRA) 15713 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15714 v0.AddArg(x) 15715 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15716 v1.AddArg(y) 15717 v.AddArg2(v0, v1) 15718 return true 15719 } 15720 } 15721 func rewriteValueARM_OpSelect0(v *Value) bool { 15722 v_0 := v.Args[0] 15723 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 15724 // result: x 15725 for { 15726 if v_0.Op != OpARMCALLudiv { 15727 break 15728 } 15729 _ = v_0.Args[1] 15730 x := v_0.Args[0] 15731 v_0_1 := v_0.Args[1] 15732 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 { 15733 break 15734 } 15735 v.copyOf(x) 15736 return true 15737 } 15738 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 15739 // cond: isPowerOfTwo32(c) 15740 // result: (SRLconst [int32(log32(c))] x) 15741 for { 15742 if v_0.Op != OpARMCALLudiv { 15743 break 15744 } 15745 _ = v_0.Args[1] 15746 x := v_0.Args[0] 15747 v_0_1 := v_0.Args[1] 15748 if v_0_1.Op != OpARMMOVWconst { 15749 break 15750 } 15751 c := auxIntToInt32(v_0_1.AuxInt) 15752 if !(isPowerOfTwo32(c)) { 15753 break 15754 } 15755 v.reset(OpARMSRLconst) 15756 v.AuxInt = int32ToAuxInt(int32(log32(c))) 15757 v.AddArg(x) 15758 return true 15759 } 15760 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 15761 // cond: d != 0 15762 // result: (MOVWconst [int32(uint32(c)/uint32(d))]) 15763 for { 15764 if v_0.Op != OpARMCALLudiv { 15765 break 15766 } 15767 _ = v_0.Args[1] 15768 v_0_0 := v_0.Args[0] 15769 if v_0_0.Op != OpARMMOVWconst { 15770 break 15771 } 15772 c := auxIntToInt32(v_0_0.AuxInt) 15773 v_0_1 := v_0.Args[1] 15774 if v_0_1.Op != OpARMMOVWconst { 15775 break 15776 } 15777 d := auxIntToInt32(v_0_1.AuxInt) 15778 if !(d != 0) { 15779 break 15780 } 15781 v.reset(OpARMMOVWconst) 15782 v.AuxInt = int32ToAuxInt(int32(uint32(c) / uint32(d))) 15783 return true 15784 } 15785 return false 15786 } 15787 func rewriteValueARM_OpSelect1(v *Value) bool { 15788 v_0 := v.Args[0] 15789 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 15790 // result: (MOVWconst [0]) 15791 for { 15792 if v_0.Op != OpARMCALLudiv { 15793 break 15794 } 15795 _ = v_0.Args[1] 15796 v_0_1 := v_0.Args[1] 15797 if v_0_1.Op != OpARMMOVWconst || auxIntToInt32(v_0_1.AuxInt) != 1 { 15798 break 15799 } 15800 v.reset(OpARMMOVWconst) 15801 v.AuxInt = int32ToAuxInt(0) 15802 return true 15803 } 15804 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 15805 // cond: isPowerOfTwo32(c) 15806 // result: (ANDconst [c-1] x) 15807 for { 15808 if v_0.Op != OpARMCALLudiv { 15809 break 15810 } 15811 _ = v_0.Args[1] 15812 x := v_0.Args[0] 15813 v_0_1 := v_0.Args[1] 15814 if v_0_1.Op != OpARMMOVWconst { 15815 break 15816 } 15817 c := auxIntToInt32(v_0_1.AuxInt) 15818 if !(isPowerOfTwo32(c)) { 15819 break 15820 } 15821 v.reset(OpARMANDconst) 15822 v.AuxInt = int32ToAuxInt(c - 1) 15823 v.AddArg(x) 15824 return true 15825 } 15826 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 15827 // cond: d != 0 15828 // result: (MOVWconst [int32(uint32(c)%uint32(d))]) 15829 for { 15830 if v_0.Op != OpARMCALLudiv { 15831 break 15832 } 15833 _ = v_0.Args[1] 15834 v_0_0 := v_0.Args[0] 15835 if v_0_0.Op != OpARMMOVWconst { 15836 break 15837 } 15838 c := auxIntToInt32(v_0_0.AuxInt) 15839 v_0_1 := v_0.Args[1] 15840 if v_0_1.Op != OpARMMOVWconst { 15841 break 15842 } 15843 d := auxIntToInt32(v_0_1.AuxInt) 15844 if !(d != 0) { 15845 break 15846 } 15847 v.reset(OpARMMOVWconst) 15848 v.AuxInt = int32ToAuxInt(int32(uint32(c) % uint32(d))) 15849 return true 15850 } 15851 return false 15852 } 15853 func rewriteValueARM_OpSignmask(v *Value) bool { 15854 v_0 := v.Args[0] 15855 // match: (Signmask x) 15856 // result: (SRAconst x [31]) 15857 for { 15858 x := v_0 15859 v.reset(OpARMSRAconst) 15860 v.AuxInt = int32ToAuxInt(31) 15861 v.AddArg(x) 15862 return true 15863 } 15864 } 15865 func rewriteValueARM_OpSlicemask(v *Value) bool { 15866 v_0 := v.Args[0] 15867 b := v.Block 15868 // match: (Slicemask <t> x) 15869 // result: (SRAconst (RSBconst <t> [0] x) [31]) 15870 for { 15871 t := v.Type 15872 x := v_0 15873 v.reset(OpARMSRAconst) 15874 v.AuxInt = int32ToAuxInt(31) 15875 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 15876 v0.AuxInt = int32ToAuxInt(0) 15877 v0.AddArg(x) 15878 v.AddArg(v0) 15879 return true 15880 } 15881 } 15882 func rewriteValueARM_OpStore(v *Value) bool { 15883 v_2 := v.Args[2] 15884 v_1 := v.Args[1] 15885 v_0 := v.Args[0] 15886 // match: (Store {t} ptr val mem) 15887 // cond: t.Size() == 1 15888 // result: (MOVBstore ptr val mem) 15889 for { 15890 t := auxToType(v.Aux) 15891 ptr := v_0 15892 val := v_1 15893 mem := v_2 15894 if !(t.Size() == 1) { 15895 break 15896 } 15897 v.reset(OpARMMOVBstore) 15898 v.AddArg3(ptr, val, mem) 15899 return true 15900 } 15901 // match: (Store {t} ptr val mem) 15902 // cond: t.Size() == 2 15903 // result: (MOVHstore ptr val mem) 15904 for { 15905 t := auxToType(v.Aux) 15906 ptr := v_0 15907 val := v_1 15908 mem := v_2 15909 if !(t.Size() == 2) { 15910 break 15911 } 15912 v.reset(OpARMMOVHstore) 15913 v.AddArg3(ptr, val, mem) 15914 return true 15915 } 15916 // match: (Store {t} ptr val mem) 15917 // cond: t.Size() == 4 && !t.IsFloat() 15918 // result: (MOVWstore ptr val mem) 15919 for { 15920 t := auxToType(v.Aux) 15921 ptr := v_0 15922 val := v_1 15923 mem := v_2 15924 if !(t.Size() == 4 && !t.IsFloat()) { 15925 break 15926 } 15927 v.reset(OpARMMOVWstore) 15928 v.AddArg3(ptr, val, mem) 15929 return true 15930 } 15931 // match: (Store {t} ptr val mem) 15932 // cond: t.Size() == 4 && t.IsFloat() 15933 // result: (MOVFstore ptr val mem) 15934 for { 15935 t := auxToType(v.Aux) 15936 ptr := v_0 15937 val := v_1 15938 mem := v_2 15939 if !(t.Size() == 4 && t.IsFloat()) { 15940 break 15941 } 15942 v.reset(OpARMMOVFstore) 15943 v.AddArg3(ptr, val, mem) 15944 return true 15945 } 15946 // match: (Store {t} ptr val mem) 15947 // cond: t.Size() == 8 && t.IsFloat() 15948 // result: (MOVDstore ptr val mem) 15949 for { 15950 t := auxToType(v.Aux) 15951 ptr := v_0 15952 val := v_1 15953 mem := v_2 15954 if !(t.Size() == 8 && t.IsFloat()) { 15955 break 15956 } 15957 v.reset(OpARMMOVDstore) 15958 v.AddArg3(ptr, val, mem) 15959 return true 15960 } 15961 return false 15962 } 15963 func rewriteValueARM_OpZero(v *Value) bool { 15964 v_1 := v.Args[1] 15965 v_0 := v.Args[0] 15966 b := v.Block 15967 config := b.Func.Config 15968 typ := &b.Func.Config.Types 15969 // match: (Zero [0] _ mem) 15970 // result: mem 15971 for { 15972 if auxIntToInt64(v.AuxInt) != 0 { 15973 break 15974 } 15975 mem := v_1 15976 v.copyOf(mem) 15977 return true 15978 } 15979 // match: (Zero [1] ptr mem) 15980 // result: (MOVBstore ptr (MOVWconst [0]) mem) 15981 for { 15982 if auxIntToInt64(v.AuxInt) != 1 { 15983 break 15984 } 15985 ptr := v_0 15986 mem := v_1 15987 v.reset(OpARMMOVBstore) 15988 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 15989 v0.AuxInt = int32ToAuxInt(0) 15990 v.AddArg3(ptr, v0, mem) 15991 return true 15992 } 15993 // match: (Zero [2] {t} ptr mem) 15994 // cond: t.Alignment()%2 == 0 15995 // result: (MOVHstore ptr (MOVWconst [0]) mem) 15996 for { 15997 if auxIntToInt64(v.AuxInt) != 2 { 15998 break 15999 } 16000 t := auxToType(v.Aux) 16001 ptr := v_0 16002 mem := v_1 16003 if !(t.Alignment()%2 == 0) { 16004 break 16005 } 16006 v.reset(OpARMMOVHstore) 16007 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16008 v0.AuxInt = int32ToAuxInt(0) 16009 v.AddArg3(ptr, v0, mem) 16010 return true 16011 } 16012 // match: (Zero [2] ptr mem) 16013 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 16014 for { 16015 if auxIntToInt64(v.AuxInt) != 2 { 16016 break 16017 } 16018 ptr := v_0 16019 mem := v_1 16020 v.reset(OpARMMOVBstore) 16021 v.AuxInt = int32ToAuxInt(1) 16022 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16023 v0.AuxInt = int32ToAuxInt(0) 16024 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16025 v1.AuxInt = int32ToAuxInt(0) 16026 v1.AddArg3(ptr, v0, mem) 16027 v.AddArg3(ptr, v0, v1) 16028 return true 16029 } 16030 // match: (Zero [4] {t} ptr mem) 16031 // cond: t.Alignment()%4 == 0 16032 // result: (MOVWstore ptr (MOVWconst [0]) mem) 16033 for { 16034 if auxIntToInt64(v.AuxInt) != 4 { 16035 break 16036 } 16037 t := auxToType(v.Aux) 16038 ptr := v_0 16039 mem := v_1 16040 if !(t.Alignment()%4 == 0) { 16041 break 16042 } 16043 v.reset(OpARMMOVWstore) 16044 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16045 v0.AuxInt = int32ToAuxInt(0) 16046 v.AddArg3(ptr, v0, mem) 16047 return true 16048 } 16049 // match: (Zero [4] {t} ptr mem) 16050 // cond: t.Alignment()%2 == 0 16051 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 16052 for { 16053 if auxIntToInt64(v.AuxInt) != 4 { 16054 break 16055 } 16056 t := auxToType(v.Aux) 16057 ptr := v_0 16058 mem := v_1 16059 if !(t.Alignment()%2 == 0) { 16060 break 16061 } 16062 v.reset(OpARMMOVHstore) 16063 v.AuxInt = int32ToAuxInt(2) 16064 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16065 v0.AuxInt = int32ToAuxInt(0) 16066 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 16067 v1.AuxInt = int32ToAuxInt(0) 16068 v1.AddArg3(ptr, v0, mem) 16069 v.AddArg3(ptr, v0, v1) 16070 return true 16071 } 16072 // match: (Zero [4] ptr mem) 16073 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 16074 for { 16075 if auxIntToInt64(v.AuxInt) != 4 { 16076 break 16077 } 16078 ptr := v_0 16079 mem := v_1 16080 v.reset(OpARMMOVBstore) 16081 v.AuxInt = int32ToAuxInt(3) 16082 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16083 v0.AuxInt = int32ToAuxInt(0) 16084 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16085 v1.AuxInt = int32ToAuxInt(2) 16086 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16087 v2.AuxInt = int32ToAuxInt(1) 16088 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16089 v3.AuxInt = int32ToAuxInt(0) 16090 v3.AddArg3(ptr, v0, mem) 16091 v2.AddArg3(ptr, v0, v3) 16092 v1.AddArg3(ptr, v0, v2) 16093 v.AddArg3(ptr, v0, v1) 16094 return true 16095 } 16096 // match: (Zero [3] ptr mem) 16097 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 16098 for { 16099 if auxIntToInt64(v.AuxInt) != 3 { 16100 break 16101 } 16102 ptr := v_0 16103 mem := v_1 16104 v.reset(OpARMMOVBstore) 16105 v.AuxInt = int32ToAuxInt(2) 16106 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16107 v0.AuxInt = int32ToAuxInt(0) 16108 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16109 v1.AuxInt = int32ToAuxInt(1) 16110 v2 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16111 v2.AuxInt = int32ToAuxInt(0) 16112 v2.AddArg3(ptr, v0, mem) 16113 v1.AddArg3(ptr, v0, v2) 16114 v.AddArg3(ptr, v0, v1) 16115 return true 16116 } 16117 // match: (Zero [s] {t} ptr mem) 16118 // cond: s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && !config.noDuffDevice 16119 // result: (DUFFZERO [4 * (128 - s/4)] ptr (MOVWconst [0]) mem) 16120 for { 16121 s := auxIntToInt64(v.AuxInt) 16122 t := auxToType(v.Aux) 16123 ptr := v_0 16124 mem := v_1 16125 if !(s%4 == 0 && s > 4 && s <= 512 && t.Alignment()%4 == 0 && !config.noDuffDevice) { 16126 break 16127 } 16128 v.reset(OpARMDUFFZERO) 16129 v.AuxInt = int64ToAuxInt(4 * (128 - s/4)) 16130 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16131 v0.AuxInt = int32ToAuxInt(0) 16132 v.AddArg3(ptr, v0, mem) 16133 return true 16134 } 16135 // match: (Zero [s] {t} ptr mem) 16136 // cond: (s > 512 || config.noDuffDevice) || t.Alignment()%4 != 0 16137 // result: (LoweredZero [t.Alignment()] ptr (ADDconst <ptr.Type> ptr [int32(s-moveSize(t.Alignment(), config))]) (MOVWconst [0]) mem) 16138 for { 16139 s := auxIntToInt64(v.AuxInt) 16140 t := auxToType(v.Aux) 16141 ptr := v_0 16142 mem := v_1 16143 if !((s > 512 || config.noDuffDevice) || t.Alignment()%4 != 0) { 16144 break 16145 } 16146 v.reset(OpARMLoweredZero) 16147 v.AuxInt = int64ToAuxInt(t.Alignment()) 16148 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 16149 v0.AuxInt = int32ToAuxInt(int32(s - moveSize(t.Alignment(), config))) 16150 v0.AddArg(ptr) 16151 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 16152 v1.AuxInt = int32ToAuxInt(0) 16153 v.AddArg4(ptr, v0, v1, mem) 16154 return true 16155 } 16156 return false 16157 } 16158 func rewriteValueARM_OpZeromask(v *Value) bool { 16159 v_0 := v.Args[0] 16160 b := v.Block 16161 typ := &b.Func.Config.Types 16162 // match: (Zeromask x) 16163 // result: (SRAconst (RSBshiftRL <typ.Int32> x x [1]) [31]) 16164 for { 16165 x := v_0 16166 v.reset(OpARMSRAconst) 16167 v.AuxInt = int32ToAuxInt(31) 16168 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32) 16169 v0.AuxInt = int32ToAuxInt(1) 16170 v0.AddArg2(x, x) 16171 v.AddArg(v0) 16172 return true 16173 } 16174 } 16175 func rewriteBlockARM(b *Block) bool { 16176 switch b.Kind { 16177 case BlockARMEQ: 16178 // match: (EQ (FlagConstant [fc]) yes no) 16179 // cond: fc.eq() 16180 // result: (First yes no) 16181 for b.Controls[0].Op == OpARMFlagConstant { 16182 v_0 := b.Controls[0] 16183 fc := auxIntToFlagConstant(v_0.AuxInt) 16184 if !(fc.eq()) { 16185 break 16186 } 16187 b.Reset(BlockFirst) 16188 return true 16189 } 16190 // match: (EQ (FlagConstant [fc]) yes no) 16191 // cond: !fc.eq() 16192 // result: (First no yes) 16193 for b.Controls[0].Op == OpARMFlagConstant { 16194 v_0 := b.Controls[0] 16195 fc := auxIntToFlagConstant(v_0.AuxInt) 16196 if !(!fc.eq()) { 16197 break 16198 } 16199 b.Reset(BlockFirst) 16200 b.swapSuccessors() 16201 return true 16202 } 16203 // match: (EQ (InvertFlags cmp) yes no) 16204 // result: (EQ cmp yes no) 16205 for b.Controls[0].Op == OpARMInvertFlags { 16206 v_0 := b.Controls[0] 16207 cmp := v_0.Args[0] 16208 b.resetWithControl(BlockARMEQ, cmp) 16209 return true 16210 } 16211 // match: (EQ (CMP x (RSBconst [0] y))) 16212 // result: (EQ (CMN x y)) 16213 for b.Controls[0].Op == OpARMCMP { 16214 v_0 := b.Controls[0] 16215 _ = v_0.Args[1] 16216 x := v_0.Args[0] 16217 v_0_1 := v_0.Args[1] 16218 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 { 16219 break 16220 } 16221 y := v_0_1.Args[0] 16222 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 16223 v0.AddArg2(x, y) 16224 b.resetWithControl(BlockARMEQ, v0) 16225 return true 16226 } 16227 // match: (EQ (CMN x (RSBconst [0] y))) 16228 // result: (EQ (CMP x y)) 16229 for b.Controls[0].Op == OpARMCMN { 16230 v_0 := b.Controls[0] 16231 _ = v_0.Args[1] 16232 v_0_0 := v_0.Args[0] 16233 v_0_1 := v_0.Args[1] 16234 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 { 16235 x := v_0_0 16236 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 { 16237 continue 16238 } 16239 y := v_0_1.Args[0] 16240 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 16241 v0.AddArg2(x, y) 16242 b.resetWithControl(BlockARMEQ, v0) 16243 return true 16244 } 16245 break 16246 } 16247 // match: (EQ (CMPconst [0] l:(SUB x y)) yes no) 16248 // cond: l.Uses==1 16249 // result: (EQ (CMP x y) yes no) 16250 for b.Controls[0].Op == OpARMCMPconst { 16251 v_0 := b.Controls[0] 16252 if auxIntToInt32(v_0.AuxInt) != 0 { 16253 break 16254 } 16255 l := v_0.Args[0] 16256 if l.Op != OpARMSUB { 16257 break 16258 } 16259 y := l.Args[1] 16260 x := l.Args[0] 16261 if !(l.Uses == 1) { 16262 break 16263 } 16264 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 16265 v0.AddArg2(x, y) 16266 b.resetWithControl(BlockARMEQ, v0) 16267 return true 16268 } 16269 // match: (EQ (CMPconst [0] l:(MULS x y a)) yes no) 16270 // cond: l.Uses==1 16271 // result: (EQ (CMP a (MUL <x.Type> x y)) yes no) 16272 for b.Controls[0].Op == OpARMCMPconst { 16273 v_0 := b.Controls[0] 16274 if auxIntToInt32(v_0.AuxInt) != 0 { 16275 break 16276 } 16277 l := v_0.Args[0] 16278 if l.Op != OpARMMULS { 16279 break 16280 } 16281 a := l.Args[2] 16282 x := l.Args[0] 16283 y := l.Args[1] 16284 if !(l.Uses == 1) { 16285 break 16286 } 16287 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 16288 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 16289 v1.AddArg2(x, y) 16290 v0.AddArg2(a, v1) 16291 b.resetWithControl(BlockARMEQ, v0) 16292 return true 16293 } 16294 // match: (EQ (CMPconst [0] l:(SUBconst [c] x)) yes no) 16295 // cond: l.Uses==1 16296 // result: (EQ (CMPconst [c] x) yes no) 16297 for b.Controls[0].Op == OpARMCMPconst { 16298 v_0 := b.Controls[0] 16299 if auxIntToInt32(v_0.AuxInt) != 0 { 16300 break 16301 } 16302 l := v_0.Args[0] 16303 if l.Op != OpARMSUBconst { 16304 break 16305 } 16306 c := auxIntToInt32(l.AuxInt) 16307 x := l.Args[0] 16308 if !(l.Uses == 1) { 16309 break 16310 } 16311 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 16312 v0.AuxInt = int32ToAuxInt(c) 16313 v0.AddArg(x) 16314 b.resetWithControl(BlockARMEQ, v0) 16315 return true 16316 } 16317 // match: (EQ (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 16318 // cond: l.Uses==1 16319 // result: (EQ (CMPshiftLL x y [c]) yes no) 16320 for b.Controls[0].Op == OpARMCMPconst { 16321 v_0 := b.Controls[0] 16322 if auxIntToInt32(v_0.AuxInt) != 0 { 16323 break 16324 } 16325 l := v_0.Args[0] 16326 if l.Op != OpARMSUBshiftLL { 16327 break 16328 } 16329 c := auxIntToInt32(l.AuxInt) 16330 y := l.Args[1] 16331 x := l.Args[0] 16332 if !(l.Uses == 1) { 16333 break 16334 } 16335 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 16336 v0.AuxInt = int32ToAuxInt(c) 16337 v0.AddArg2(x, y) 16338 b.resetWithControl(BlockARMEQ, v0) 16339 return true 16340 } 16341 // match: (EQ (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 16342 // cond: l.Uses==1 16343 // result: (EQ (CMPshiftRL x y [c]) yes no) 16344 for b.Controls[0].Op == OpARMCMPconst { 16345 v_0 := b.Controls[0] 16346 if auxIntToInt32(v_0.AuxInt) != 0 { 16347 break 16348 } 16349 l := v_0.Args[0] 16350 if l.Op != OpARMSUBshiftRL { 16351 break 16352 } 16353 c := auxIntToInt32(l.AuxInt) 16354 y := l.Args[1] 16355 x := l.Args[0] 16356 if !(l.Uses == 1) { 16357 break 16358 } 16359 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 16360 v0.AuxInt = int32ToAuxInt(c) 16361 v0.AddArg2(x, y) 16362 b.resetWithControl(BlockARMEQ, v0) 16363 return true 16364 } 16365 // match: (EQ (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 16366 // cond: l.Uses==1 16367 // result: (EQ (CMPshiftRA x y [c]) yes no) 16368 for b.Controls[0].Op == OpARMCMPconst { 16369 v_0 := b.Controls[0] 16370 if auxIntToInt32(v_0.AuxInt) != 0 { 16371 break 16372 } 16373 l := v_0.Args[0] 16374 if l.Op != OpARMSUBshiftRA { 16375 break 16376 } 16377 c := auxIntToInt32(l.AuxInt) 16378 y := l.Args[1] 16379 x := l.Args[0] 16380 if !(l.Uses == 1) { 16381 break 16382 } 16383 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 16384 v0.AuxInt = int32ToAuxInt(c) 16385 v0.AddArg2(x, y) 16386 b.resetWithControl(BlockARMEQ, v0) 16387 return true 16388 } 16389 // match: (EQ (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 16390 // cond: l.Uses==1 16391 // result: (EQ (CMPshiftLLreg x y z) yes no) 16392 for b.Controls[0].Op == OpARMCMPconst { 16393 v_0 := b.Controls[0] 16394 if auxIntToInt32(v_0.AuxInt) != 0 { 16395 break 16396 } 16397 l := v_0.Args[0] 16398 if l.Op != OpARMSUBshiftLLreg { 16399 break 16400 } 16401 z := l.Args[2] 16402 x := l.Args[0] 16403 y := l.Args[1] 16404 if !(l.Uses == 1) { 16405 break 16406 } 16407 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 16408 v0.AddArg3(x, y, z) 16409 b.resetWithControl(BlockARMEQ, v0) 16410 return true 16411 } 16412 // match: (EQ (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 16413 // cond: l.Uses==1 16414 // result: (EQ (CMPshiftRLreg x y z) yes no) 16415 for b.Controls[0].Op == OpARMCMPconst { 16416 v_0 := b.Controls[0] 16417 if auxIntToInt32(v_0.AuxInt) != 0 { 16418 break 16419 } 16420 l := v_0.Args[0] 16421 if l.Op != OpARMSUBshiftRLreg { 16422 break 16423 } 16424 z := l.Args[2] 16425 x := l.Args[0] 16426 y := l.Args[1] 16427 if !(l.Uses == 1) { 16428 break 16429 } 16430 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 16431 v0.AddArg3(x, y, z) 16432 b.resetWithControl(BlockARMEQ, v0) 16433 return true 16434 } 16435 // match: (EQ (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 16436 // cond: l.Uses==1 16437 // result: (EQ (CMPshiftRAreg x y z) yes no) 16438 for b.Controls[0].Op == OpARMCMPconst { 16439 v_0 := b.Controls[0] 16440 if auxIntToInt32(v_0.AuxInt) != 0 { 16441 break 16442 } 16443 l := v_0.Args[0] 16444 if l.Op != OpARMSUBshiftRAreg { 16445 break 16446 } 16447 z := l.Args[2] 16448 x := l.Args[0] 16449 y := l.Args[1] 16450 if !(l.Uses == 1) { 16451 break 16452 } 16453 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 16454 v0.AddArg3(x, y, z) 16455 b.resetWithControl(BlockARMEQ, v0) 16456 return true 16457 } 16458 // match: (EQ (CMPconst [0] l:(ADD x y)) yes no) 16459 // cond: l.Uses==1 16460 // result: (EQ (CMN x y) yes no) 16461 for b.Controls[0].Op == OpARMCMPconst { 16462 v_0 := b.Controls[0] 16463 if auxIntToInt32(v_0.AuxInt) != 0 { 16464 break 16465 } 16466 l := v_0.Args[0] 16467 if l.Op != OpARMADD { 16468 break 16469 } 16470 _ = l.Args[1] 16471 l_0 := l.Args[0] 16472 l_1 := l.Args[1] 16473 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 16474 x := l_0 16475 y := l_1 16476 if !(l.Uses == 1) { 16477 continue 16478 } 16479 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 16480 v0.AddArg2(x, y) 16481 b.resetWithControl(BlockARMEQ, v0) 16482 return true 16483 } 16484 break 16485 } 16486 // match: (EQ (CMPconst [0] l:(MULA x y a)) yes no) 16487 // cond: l.Uses==1 16488 // result: (EQ (CMN a (MUL <x.Type> x y)) yes no) 16489 for b.Controls[0].Op == OpARMCMPconst { 16490 v_0 := b.Controls[0] 16491 if auxIntToInt32(v_0.AuxInt) != 0 { 16492 break 16493 } 16494 l := v_0.Args[0] 16495 if l.Op != OpARMMULA { 16496 break 16497 } 16498 a := l.Args[2] 16499 x := l.Args[0] 16500 y := l.Args[1] 16501 if !(l.Uses == 1) { 16502 break 16503 } 16504 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 16505 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 16506 v1.AddArg2(x, y) 16507 v0.AddArg2(a, v1) 16508 b.resetWithControl(BlockARMEQ, v0) 16509 return true 16510 } 16511 // match: (EQ (CMPconst [0] l:(ADDconst [c] x)) yes no) 16512 // cond: l.Uses==1 16513 // result: (EQ (CMNconst [c] x) yes no) 16514 for b.Controls[0].Op == OpARMCMPconst { 16515 v_0 := b.Controls[0] 16516 if auxIntToInt32(v_0.AuxInt) != 0 { 16517 break 16518 } 16519 l := v_0.Args[0] 16520 if l.Op != OpARMADDconst { 16521 break 16522 } 16523 c := auxIntToInt32(l.AuxInt) 16524 x := l.Args[0] 16525 if !(l.Uses == 1) { 16526 break 16527 } 16528 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 16529 v0.AuxInt = int32ToAuxInt(c) 16530 v0.AddArg(x) 16531 b.resetWithControl(BlockARMEQ, v0) 16532 return true 16533 } 16534 // match: (EQ (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 16535 // cond: l.Uses==1 16536 // result: (EQ (CMNshiftLL x y [c]) yes no) 16537 for b.Controls[0].Op == OpARMCMPconst { 16538 v_0 := b.Controls[0] 16539 if auxIntToInt32(v_0.AuxInt) != 0 { 16540 break 16541 } 16542 l := v_0.Args[0] 16543 if l.Op != OpARMADDshiftLL { 16544 break 16545 } 16546 c := auxIntToInt32(l.AuxInt) 16547 y := l.Args[1] 16548 x := l.Args[0] 16549 if !(l.Uses == 1) { 16550 break 16551 } 16552 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 16553 v0.AuxInt = int32ToAuxInt(c) 16554 v0.AddArg2(x, y) 16555 b.resetWithControl(BlockARMEQ, v0) 16556 return true 16557 } 16558 // match: (EQ (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 16559 // cond: l.Uses==1 16560 // result: (EQ (CMNshiftRL x y [c]) yes no) 16561 for b.Controls[0].Op == OpARMCMPconst { 16562 v_0 := b.Controls[0] 16563 if auxIntToInt32(v_0.AuxInt) != 0 { 16564 break 16565 } 16566 l := v_0.Args[0] 16567 if l.Op != OpARMADDshiftRL { 16568 break 16569 } 16570 c := auxIntToInt32(l.AuxInt) 16571 y := l.Args[1] 16572 x := l.Args[0] 16573 if !(l.Uses == 1) { 16574 break 16575 } 16576 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 16577 v0.AuxInt = int32ToAuxInt(c) 16578 v0.AddArg2(x, y) 16579 b.resetWithControl(BlockARMEQ, v0) 16580 return true 16581 } 16582 // match: (EQ (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 16583 // cond: l.Uses==1 16584 // result: (EQ (CMNshiftRA x y [c]) yes no) 16585 for b.Controls[0].Op == OpARMCMPconst { 16586 v_0 := b.Controls[0] 16587 if auxIntToInt32(v_0.AuxInt) != 0 { 16588 break 16589 } 16590 l := v_0.Args[0] 16591 if l.Op != OpARMADDshiftRA { 16592 break 16593 } 16594 c := auxIntToInt32(l.AuxInt) 16595 y := l.Args[1] 16596 x := l.Args[0] 16597 if !(l.Uses == 1) { 16598 break 16599 } 16600 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 16601 v0.AuxInt = int32ToAuxInt(c) 16602 v0.AddArg2(x, y) 16603 b.resetWithControl(BlockARMEQ, v0) 16604 return true 16605 } 16606 // match: (EQ (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 16607 // cond: l.Uses==1 16608 // result: (EQ (CMNshiftLLreg x y z) yes no) 16609 for b.Controls[0].Op == OpARMCMPconst { 16610 v_0 := b.Controls[0] 16611 if auxIntToInt32(v_0.AuxInt) != 0 { 16612 break 16613 } 16614 l := v_0.Args[0] 16615 if l.Op != OpARMADDshiftLLreg { 16616 break 16617 } 16618 z := l.Args[2] 16619 x := l.Args[0] 16620 y := l.Args[1] 16621 if !(l.Uses == 1) { 16622 break 16623 } 16624 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 16625 v0.AddArg3(x, y, z) 16626 b.resetWithControl(BlockARMEQ, v0) 16627 return true 16628 } 16629 // match: (EQ (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 16630 // cond: l.Uses==1 16631 // result: (EQ (CMNshiftRLreg x y z) yes no) 16632 for b.Controls[0].Op == OpARMCMPconst { 16633 v_0 := b.Controls[0] 16634 if auxIntToInt32(v_0.AuxInt) != 0 { 16635 break 16636 } 16637 l := v_0.Args[0] 16638 if l.Op != OpARMADDshiftRLreg { 16639 break 16640 } 16641 z := l.Args[2] 16642 x := l.Args[0] 16643 y := l.Args[1] 16644 if !(l.Uses == 1) { 16645 break 16646 } 16647 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 16648 v0.AddArg3(x, y, z) 16649 b.resetWithControl(BlockARMEQ, v0) 16650 return true 16651 } 16652 // match: (EQ (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 16653 // cond: l.Uses==1 16654 // result: (EQ (CMNshiftRAreg x y z) yes no) 16655 for b.Controls[0].Op == OpARMCMPconst { 16656 v_0 := b.Controls[0] 16657 if auxIntToInt32(v_0.AuxInt) != 0 { 16658 break 16659 } 16660 l := v_0.Args[0] 16661 if l.Op != OpARMADDshiftRAreg { 16662 break 16663 } 16664 z := l.Args[2] 16665 x := l.Args[0] 16666 y := l.Args[1] 16667 if !(l.Uses == 1) { 16668 break 16669 } 16670 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 16671 v0.AddArg3(x, y, z) 16672 b.resetWithControl(BlockARMEQ, v0) 16673 return true 16674 } 16675 // match: (EQ (CMPconst [0] l:(AND x y)) yes no) 16676 // cond: l.Uses==1 16677 // result: (EQ (TST x y) yes no) 16678 for b.Controls[0].Op == OpARMCMPconst { 16679 v_0 := b.Controls[0] 16680 if auxIntToInt32(v_0.AuxInt) != 0 { 16681 break 16682 } 16683 l := v_0.Args[0] 16684 if l.Op != OpARMAND { 16685 break 16686 } 16687 _ = l.Args[1] 16688 l_0 := l.Args[0] 16689 l_1 := l.Args[1] 16690 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 16691 x := l_0 16692 y := l_1 16693 if !(l.Uses == 1) { 16694 continue 16695 } 16696 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 16697 v0.AddArg2(x, y) 16698 b.resetWithControl(BlockARMEQ, v0) 16699 return true 16700 } 16701 break 16702 } 16703 // match: (EQ (CMPconst [0] l:(ANDconst [c] x)) yes no) 16704 // cond: l.Uses==1 16705 // result: (EQ (TSTconst [c] x) yes no) 16706 for b.Controls[0].Op == OpARMCMPconst { 16707 v_0 := b.Controls[0] 16708 if auxIntToInt32(v_0.AuxInt) != 0 { 16709 break 16710 } 16711 l := v_0.Args[0] 16712 if l.Op != OpARMANDconst { 16713 break 16714 } 16715 c := auxIntToInt32(l.AuxInt) 16716 x := l.Args[0] 16717 if !(l.Uses == 1) { 16718 break 16719 } 16720 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 16721 v0.AuxInt = int32ToAuxInt(c) 16722 v0.AddArg(x) 16723 b.resetWithControl(BlockARMEQ, v0) 16724 return true 16725 } 16726 // match: (EQ (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 16727 // cond: l.Uses==1 16728 // result: (EQ (TSTshiftLL x y [c]) yes no) 16729 for b.Controls[0].Op == OpARMCMPconst { 16730 v_0 := b.Controls[0] 16731 if auxIntToInt32(v_0.AuxInt) != 0 { 16732 break 16733 } 16734 l := v_0.Args[0] 16735 if l.Op != OpARMANDshiftLL { 16736 break 16737 } 16738 c := auxIntToInt32(l.AuxInt) 16739 y := l.Args[1] 16740 x := l.Args[0] 16741 if !(l.Uses == 1) { 16742 break 16743 } 16744 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 16745 v0.AuxInt = int32ToAuxInt(c) 16746 v0.AddArg2(x, y) 16747 b.resetWithControl(BlockARMEQ, v0) 16748 return true 16749 } 16750 // match: (EQ (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 16751 // cond: l.Uses==1 16752 // result: (EQ (TSTshiftRL x y [c]) yes no) 16753 for b.Controls[0].Op == OpARMCMPconst { 16754 v_0 := b.Controls[0] 16755 if auxIntToInt32(v_0.AuxInt) != 0 { 16756 break 16757 } 16758 l := v_0.Args[0] 16759 if l.Op != OpARMANDshiftRL { 16760 break 16761 } 16762 c := auxIntToInt32(l.AuxInt) 16763 y := l.Args[1] 16764 x := l.Args[0] 16765 if !(l.Uses == 1) { 16766 break 16767 } 16768 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 16769 v0.AuxInt = int32ToAuxInt(c) 16770 v0.AddArg2(x, y) 16771 b.resetWithControl(BlockARMEQ, v0) 16772 return true 16773 } 16774 // match: (EQ (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 16775 // cond: l.Uses==1 16776 // result: (EQ (TSTshiftRA x y [c]) yes no) 16777 for b.Controls[0].Op == OpARMCMPconst { 16778 v_0 := b.Controls[0] 16779 if auxIntToInt32(v_0.AuxInt) != 0 { 16780 break 16781 } 16782 l := v_0.Args[0] 16783 if l.Op != OpARMANDshiftRA { 16784 break 16785 } 16786 c := auxIntToInt32(l.AuxInt) 16787 y := l.Args[1] 16788 x := l.Args[0] 16789 if !(l.Uses == 1) { 16790 break 16791 } 16792 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 16793 v0.AuxInt = int32ToAuxInt(c) 16794 v0.AddArg2(x, y) 16795 b.resetWithControl(BlockARMEQ, v0) 16796 return true 16797 } 16798 // match: (EQ (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 16799 // cond: l.Uses==1 16800 // result: (EQ (TSTshiftLLreg x y z) yes no) 16801 for b.Controls[0].Op == OpARMCMPconst { 16802 v_0 := b.Controls[0] 16803 if auxIntToInt32(v_0.AuxInt) != 0 { 16804 break 16805 } 16806 l := v_0.Args[0] 16807 if l.Op != OpARMANDshiftLLreg { 16808 break 16809 } 16810 z := l.Args[2] 16811 x := l.Args[0] 16812 y := l.Args[1] 16813 if !(l.Uses == 1) { 16814 break 16815 } 16816 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 16817 v0.AddArg3(x, y, z) 16818 b.resetWithControl(BlockARMEQ, v0) 16819 return true 16820 } 16821 // match: (EQ (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 16822 // cond: l.Uses==1 16823 // result: (EQ (TSTshiftRLreg x y z) yes no) 16824 for b.Controls[0].Op == OpARMCMPconst { 16825 v_0 := b.Controls[0] 16826 if auxIntToInt32(v_0.AuxInt) != 0 { 16827 break 16828 } 16829 l := v_0.Args[0] 16830 if l.Op != OpARMANDshiftRLreg { 16831 break 16832 } 16833 z := l.Args[2] 16834 x := l.Args[0] 16835 y := l.Args[1] 16836 if !(l.Uses == 1) { 16837 break 16838 } 16839 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 16840 v0.AddArg3(x, y, z) 16841 b.resetWithControl(BlockARMEQ, v0) 16842 return true 16843 } 16844 // match: (EQ (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 16845 // cond: l.Uses==1 16846 // result: (EQ (TSTshiftRAreg x y z) yes no) 16847 for b.Controls[0].Op == OpARMCMPconst { 16848 v_0 := b.Controls[0] 16849 if auxIntToInt32(v_0.AuxInt) != 0 { 16850 break 16851 } 16852 l := v_0.Args[0] 16853 if l.Op != OpARMANDshiftRAreg { 16854 break 16855 } 16856 z := l.Args[2] 16857 x := l.Args[0] 16858 y := l.Args[1] 16859 if !(l.Uses == 1) { 16860 break 16861 } 16862 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 16863 v0.AddArg3(x, y, z) 16864 b.resetWithControl(BlockARMEQ, v0) 16865 return true 16866 } 16867 // match: (EQ (CMPconst [0] l:(XOR x y)) yes no) 16868 // cond: l.Uses==1 16869 // result: (EQ (TEQ x y) yes no) 16870 for b.Controls[0].Op == OpARMCMPconst { 16871 v_0 := b.Controls[0] 16872 if auxIntToInt32(v_0.AuxInt) != 0 { 16873 break 16874 } 16875 l := v_0.Args[0] 16876 if l.Op != OpARMXOR { 16877 break 16878 } 16879 _ = l.Args[1] 16880 l_0 := l.Args[0] 16881 l_1 := l.Args[1] 16882 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 16883 x := l_0 16884 y := l_1 16885 if !(l.Uses == 1) { 16886 continue 16887 } 16888 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 16889 v0.AddArg2(x, y) 16890 b.resetWithControl(BlockARMEQ, v0) 16891 return true 16892 } 16893 break 16894 } 16895 // match: (EQ (CMPconst [0] l:(XORconst [c] x)) yes no) 16896 // cond: l.Uses==1 16897 // result: (EQ (TEQconst [c] x) yes no) 16898 for b.Controls[0].Op == OpARMCMPconst { 16899 v_0 := b.Controls[0] 16900 if auxIntToInt32(v_0.AuxInt) != 0 { 16901 break 16902 } 16903 l := v_0.Args[0] 16904 if l.Op != OpARMXORconst { 16905 break 16906 } 16907 c := auxIntToInt32(l.AuxInt) 16908 x := l.Args[0] 16909 if !(l.Uses == 1) { 16910 break 16911 } 16912 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 16913 v0.AuxInt = int32ToAuxInt(c) 16914 v0.AddArg(x) 16915 b.resetWithControl(BlockARMEQ, v0) 16916 return true 16917 } 16918 // match: (EQ (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 16919 // cond: l.Uses==1 16920 // result: (EQ (TEQshiftLL x y [c]) yes no) 16921 for b.Controls[0].Op == OpARMCMPconst { 16922 v_0 := b.Controls[0] 16923 if auxIntToInt32(v_0.AuxInt) != 0 { 16924 break 16925 } 16926 l := v_0.Args[0] 16927 if l.Op != OpARMXORshiftLL { 16928 break 16929 } 16930 c := auxIntToInt32(l.AuxInt) 16931 y := l.Args[1] 16932 x := l.Args[0] 16933 if !(l.Uses == 1) { 16934 break 16935 } 16936 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 16937 v0.AuxInt = int32ToAuxInt(c) 16938 v0.AddArg2(x, y) 16939 b.resetWithControl(BlockARMEQ, v0) 16940 return true 16941 } 16942 // match: (EQ (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 16943 // cond: l.Uses==1 16944 // result: (EQ (TEQshiftRL x y [c]) yes no) 16945 for b.Controls[0].Op == OpARMCMPconst { 16946 v_0 := b.Controls[0] 16947 if auxIntToInt32(v_0.AuxInt) != 0 { 16948 break 16949 } 16950 l := v_0.Args[0] 16951 if l.Op != OpARMXORshiftRL { 16952 break 16953 } 16954 c := auxIntToInt32(l.AuxInt) 16955 y := l.Args[1] 16956 x := l.Args[0] 16957 if !(l.Uses == 1) { 16958 break 16959 } 16960 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 16961 v0.AuxInt = int32ToAuxInt(c) 16962 v0.AddArg2(x, y) 16963 b.resetWithControl(BlockARMEQ, v0) 16964 return true 16965 } 16966 // match: (EQ (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 16967 // cond: l.Uses==1 16968 // result: (EQ (TEQshiftRA x y [c]) yes no) 16969 for b.Controls[0].Op == OpARMCMPconst { 16970 v_0 := b.Controls[0] 16971 if auxIntToInt32(v_0.AuxInt) != 0 { 16972 break 16973 } 16974 l := v_0.Args[0] 16975 if l.Op != OpARMXORshiftRA { 16976 break 16977 } 16978 c := auxIntToInt32(l.AuxInt) 16979 y := l.Args[1] 16980 x := l.Args[0] 16981 if !(l.Uses == 1) { 16982 break 16983 } 16984 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 16985 v0.AuxInt = int32ToAuxInt(c) 16986 v0.AddArg2(x, y) 16987 b.resetWithControl(BlockARMEQ, v0) 16988 return true 16989 } 16990 // match: (EQ (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 16991 // cond: l.Uses==1 16992 // result: (EQ (TEQshiftLLreg x y z) yes no) 16993 for b.Controls[0].Op == OpARMCMPconst { 16994 v_0 := b.Controls[0] 16995 if auxIntToInt32(v_0.AuxInt) != 0 { 16996 break 16997 } 16998 l := v_0.Args[0] 16999 if l.Op != OpARMXORshiftLLreg { 17000 break 17001 } 17002 z := l.Args[2] 17003 x := l.Args[0] 17004 y := l.Args[1] 17005 if !(l.Uses == 1) { 17006 break 17007 } 17008 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 17009 v0.AddArg3(x, y, z) 17010 b.resetWithControl(BlockARMEQ, v0) 17011 return true 17012 } 17013 // match: (EQ (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 17014 // cond: l.Uses==1 17015 // result: (EQ (TEQshiftRLreg x y z) yes no) 17016 for b.Controls[0].Op == OpARMCMPconst { 17017 v_0 := b.Controls[0] 17018 if auxIntToInt32(v_0.AuxInt) != 0 { 17019 break 17020 } 17021 l := v_0.Args[0] 17022 if l.Op != OpARMXORshiftRLreg { 17023 break 17024 } 17025 z := l.Args[2] 17026 x := l.Args[0] 17027 y := l.Args[1] 17028 if !(l.Uses == 1) { 17029 break 17030 } 17031 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 17032 v0.AddArg3(x, y, z) 17033 b.resetWithControl(BlockARMEQ, v0) 17034 return true 17035 } 17036 // match: (EQ (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 17037 // cond: l.Uses==1 17038 // result: (EQ (TEQshiftRAreg x y z) yes no) 17039 for b.Controls[0].Op == OpARMCMPconst { 17040 v_0 := b.Controls[0] 17041 if auxIntToInt32(v_0.AuxInt) != 0 { 17042 break 17043 } 17044 l := v_0.Args[0] 17045 if l.Op != OpARMXORshiftRAreg { 17046 break 17047 } 17048 z := l.Args[2] 17049 x := l.Args[0] 17050 y := l.Args[1] 17051 if !(l.Uses == 1) { 17052 break 17053 } 17054 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 17055 v0.AddArg3(x, y, z) 17056 b.resetWithControl(BlockARMEQ, v0) 17057 return true 17058 } 17059 case BlockARMGE: 17060 // match: (GE (FlagConstant [fc]) yes no) 17061 // cond: fc.ge() 17062 // result: (First yes no) 17063 for b.Controls[0].Op == OpARMFlagConstant { 17064 v_0 := b.Controls[0] 17065 fc := auxIntToFlagConstant(v_0.AuxInt) 17066 if !(fc.ge()) { 17067 break 17068 } 17069 b.Reset(BlockFirst) 17070 return true 17071 } 17072 // match: (GE (FlagConstant [fc]) yes no) 17073 // cond: !fc.ge() 17074 // result: (First no yes) 17075 for b.Controls[0].Op == OpARMFlagConstant { 17076 v_0 := b.Controls[0] 17077 fc := auxIntToFlagConstant(v_0.AuxInt) 17078 if !(!fc.ge()) { 17079 break 17080 } 17081 b.Reset(BlockFirst) 17082 b.swapSuccessors() 17083 return true 17084 } 17085 // match: (GE (InvertFlags cmp) yes no) 17086 // result: (LE cmp yes no) 17087 for b.Controls[0].Op == OpARMInvertFlags { 17088 v_0 := b.Controls[0] 17089 cmp := v_0.Args[0] 17090 b.resetWithControl(BlockARMLE, cmp) 17091 return true 17092 } 17093 // match: (GE (CMPconst [0] l:(SUB x y)) yes no) 17094 // cond: l.Uses==1 17095 // result: (GEnoov (CMP x y) yes no) 17096 for b.Controls[0].Op == OpARMCMPconst { 17097 v_0 := b.Controls[0] 17098 if auxIntToInt32(v_0.AuxInt) != 0 { 17099 break 17100 } 17101 l := v_0.Args[0] 17102 if l.Op != OpARMSUB { 17103 break 17104 } 17105 y := l.Args[1] 17106 x := l.Args[0] 17107 if !(l.Uses == 1) { 17108 break 17109 } 17110 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 17111 v0.AddArg2(x, y) 17112 b.resetWithControl(BlockARMGEnoov, v0) 17113 return true 17114 } 17115 // match: (GE (CMPconst [0] l:(MULS x y a)) yes no) 17116 // cond: l.Uses==1 17117 // result: (GEnoov (CMP a (MUL <x.Type> x y)) yes no) 17118 for b.Controls[0].Op == OpARMCMPconst { 17119 v_0 := b.Controls[0] 17120 if auxIntToInt32(v_0.AuxInt) != 0 { 17121 break 17122 } 17123 l := v_0.Args[0] 17124 if l.Op != OpARMMULS { 17125 break 17126 } 17127 a := l.Args[2] 17128 x := l.Args[0] 17129 y := l.Args[1] 17130 if !(l.Uses == 1) { 17131 break 17132 } 17133 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 17134 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 17135 v1.AddArg2(x, y) 17136 v0.AddArg2(a, v1) 17137 b.resetWithControl(BlockARMGEnoov, v0) 17138 return true 17139 } 17140 // match: (GE (CMPconst [0] l:(SUBconst [c] x)) yes no) 17141 // cond: l.Uses==1 17142 // result: (GEnoov (CMPconst [c] x) yes no) 17143 for b.Controls[0].Op == OpARMCMPconst { 17144 v_0 := b.Controls[0] 17145 if auxIntToInt32(v_0.AuxInt) != 0 { 17146 break 17147 } 17148 l := v_0.Args[0] 17149 if l.Op != OpARMSUBconst { 17150 break 17151 } 17152 c := auxIntToInt32(l.AuxInt) 17153 x := l.Args[0] 17154 if !(l.Uses == 1) { 17155 break 17156 } 17157 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 17158 v0.AuxInt = int32ToAuxInt(c) 17159 v0.AddArg(x) 17160 b.resetWithControl(BlockARMGEnoov, v0) 17161 return true 17162 } 17163 // match: (GE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 17164 // cond: l.Uses==1 17165 // result: (GEnoov (CMPshiftLL x y [c]) yes no) 17166 for b.Controls[0].Op == OpARMCMPconst { 17167 v_0 := b.Controls[0] 17168 if auxIntToInt32(v_0.AuxInt) != 0 { 17169 break 17170 } 17171 l := v_0.Args[0] 17172 if l.Op != OpARMSUBshiftLL { 17173 break 17174 } 17175 c := auxIntToInt32(l.AuxInt) 17176 y := l.Args[1] 17177 x := l.Args[0] 17178 if !(l.Uses == 1) { 17179 break 17180 } 17181 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 17182 v0.AuxInt = int32ToAuxInt(c) 17183 v0.AddArg2(x, y) 17184 b.resetWithControl(BlockARMGEnoov, v0) 17185 return true 17186 } 17187 // match: (GE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 17188 // cond: l.Uses==1 17189 // result: (GEnoov (CMPshiftRL x y [c]) yes no) 17190 for b.Controls[0].Op == OpARMCMPconst { 17191 v_0 := b.Controls[0] 17192 if auxIntToInt32(v_0.AuxInt) != 0 { 17193 break 17194 } 17195 l := v_0.Args[0] 17196 if l.Op != OpARMSUBshiftRL { 17197 break 17198 } 17199 c := auxIntToInt32(l.AuxInt) 17200 y := l.Args[1] 17201 x := l.Args[0] 17202 if !(l.Uses == 1) { 17203 break 17204 } 17205 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 17206 v0.AuxInt = int32ToAuxInt(c) 17207 v0.AddArg2(x, y) 17208 b.resetWithControl(BlockARMGEnoov, v0) 17209 return true 17210 } 17211 // match: (GE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 17212 // cond: l.Uses==1 17213 // result: (GEnoov (CMPshiftRA x y [c]) yes no) 17214 for b.Controls[0].Op == OpARMCMPconst { 17215 v_0 := b.Controls[0] 17216 if auxIntToInt32(v_0.AuxInt) != 0 { 17217 break 17218 } 17219 l := v_0.Args[0] 17220 if l.Op != OpARMSUBshiftRA { 17221 break 17222 } 17223 c := auxIntToInt32(l.AuxInt) 17224 y := l.Args[1] 17225 x := l.Args[0] 17226 if !(l.Uses == 1) { 17227 break 17228 } 17229 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 17230 v0.AuxInt = int32ToAuxInt(c) 17231 v0.AddArg2(x, y) 17232 b.resetWithControl(BlockARMGEnoov, v0) 17233 return true 17234 } 17235 // match: (GE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 17236 // cond: l.Uses==1 17237 // result: (GEnoov (CMPshiftLLreg x y z) yes no) 17238 for b.Controls[0].Op == OpARMCMPconst { 17239 v_0 := b.Controls[0] 17240 if auxIntToInt32(v_0.AuxInt) != 0 { 17241 break 17242 } 17243 l := v_0.Args[0] 17244 if l.Op != OpARMSUBshiftLLreg { 17245 break 17246 } 17247 z := l.Args[2] 17248 x := l.Args[0] 17249 y := l.Args[1] 17250 if !(l.Uses == 1) { 17251 break 17252 } 17253 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 17254 v0.AddArg3(x, y, z) 17255 b.resetWithControl(BlockARMGEnoov, v0) 17256 return true 17257 } 17258 // match: (GE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 17259 // cond: l.Uses==1 17260 // result: (GEnoov (CMPshiftRLreg x y z) yes no) 17261 for b.Controls[0].Op == OpARMCMPconst { 17262 v_0 := b.Controls[0] 17263 if auxIntToInt32(v_0.AuxInt) != 0 { 17264 break 17265 } 17266 l := v_0.Args[0] 17267 if l.Op != OpARMSUBshiftRLreg { 17268 break 17269 } 17270 z := l.Args[2] 17271 x := l.Args[0] 17272 y := l.Args[1] 17273 if !(l.Uses == 1) { 17274 break 17275 } 17276 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 17277 v0.AddArg3(x, y, z) 17278 b.resetWithControl(BlockARMGEnoov, v0) 17279 return true 17280 } 17281 // match: (GE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 17282 // cond: l.Uses==1 17283 // result: (GEnoov (CMPshiftRAreg x y z) yes no) 17284 for b.Controls[0].Op == OpARMCMPconst { 17285 v_0 := b.Controls[0] 17286 if auxIntToInt32(v_0.AuxInt) != 0 { 17287 break 17288 } 17289 l := v_0.Args[0] 17290 if l.Op != OpARMSUBshiftRAreg { 17291 break 17292 } 17293 z := l.Args[2] 17294 x := l.Args[0] 17295 y := l.Args[1] 17296 if !(l.Uses == 1) { 17297 break 17298 } 17299 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 17300 v0.AddArg3(x, y, z) 17301 b.resetWithControl(BlockARMGEnoov, v0) 17302 return true 17303 } 17304 // match: (GE (CMPconst [0] l:(ADD x y)) yes no) 17305 // cond: l.Uses==1 17306 // result: (GEnoov (CMN x y) yes no) 17307 for b.Controls[0].Op == OpARMCMPconst { 17308 v_0 := b.Controls[0] 17309 if auxIntToInt32(v_0.AuxInt) != 0 { 17310 break 17311 } 17312 l := v_0.Args[0] 17313 if l.Op != OpARMADD { 17314 break 17315 } 17316 _ = l.Args[1] 17317 l_0 := l.Args[0] 17318 l_1 := l.Args[1] 17319 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 17320 x := l_0 17321 y := l_1 17322 if !(l.Uses == 1) { 17323 continue 17324 } 17325 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 17326 v0.AddArg2(x, y) 17327 b.resetWithControl(BlockARMGEnoov, v0) 17328 return true 17329 } 17330 break 17331 } 17332 // match: (GE (CMPconst [0] l:(MULA x y a)) yes no) 17333 // cond: l.Uses==1 17334 // result: (GEnoov (CMN a (MUL <x.Type> x y)) yes no) 17335 for b.Controls[0].Op == OpARMCMPconst { 17336 v_0 := b.Controls[0] 17337 if auxIntToInt32(v_0.AuxInt) != 0 { 17338 break 17339 } 17340 l := v_0.Args[0] 17341 if l.Op != OpARMMULA { 17342 break 17343 } 17344 a := l.Args[2] 17345 x := l.Args[0] 17346 y := l.Args[1] 17347 if !(l.Uses == 1) { 17348 break 17349 } 17350 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 17351 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 17352 v1.AddArg2(x, y) 17353 v0.AddArg2(a, v1) 17354 b.resetWithControl(BlockARMGEnoov, v0) 17355 return true 17356 } 17357 // match: (GE (CMPconst [0] l:(ADDconst [c] x)) yes no) 17358 // cond: l.Uses==1 17359 // result: (GEnoov (CMNconst [c] x) yes no) 17360 for b.Controls[0].Op == OpARMCMPconst { 17361 v_0 := b.Controls[0] 17362 if auxIntToInt32(v_0.AuxInt) != 0 { 17363 break 17364 } 17365 l := v_0.Args[0] 17366 if l.Op != OpARMADDconst { 17367 break 17368 } 17369 c := auxIntToInt32(l.AuxInt) 17370 x := l.Args[0] 17371 if !(l.Uses == 1) { 17372 break 17373 } 17374 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 17375 v0.AuxInt = int32ToAuxInt(c) 17376 v0.AddArg(x) 17377 b.resetWithControl(BlockARMGEnoov, v0) 17378 return true 17379 } 17380 // match: (GE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 17381 // cond: l.Uses==1 17382 // result: (GEnoov (CMNshiftLL x y [c]) yes no) 17383 for b.Controls[0].Op == OpARMCMPconst { 17384 v_0 := b.Controls[0] 17385 if auxIntToInt32(v_0.AuxInt) != 0 { 17386 break 17387 } 17388 l := v_0.Args[0] 17389 if l.Op != OpARMADDshiftLL { 17390 break 17391 } 17392 c := auxIntToInt32(l.AuxInt) 17393 y := l.Args[1] 17394 x := l.Args[0] 17395 if !(l.Uses == 1) { 17396 break 17397 } 17398 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 17399 v0.AuxInt = int32ToAuxInt(c) 17400 v0.AddArg2(x, y) 17401 b.resetWithControl(BlockARMGEnoov, v0) 17402 return true 17403 } 17404 // match: (GE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 17405 // cond: l.Uses==1 17406 // result: (GEnoov (CMNshiftRL x y [c]) yes no) 17407 for b.Controls[0].Op == OpARMCMPconst { 17408 v_0 := b.Controls[0] 17409 if auxIntToInt32(v_0.AuxInt) != 0 { 17410 break 17411 } 17412 l := v_0.Args[0] 17413 if l.Op != OpARMADDshiftRL { 17414 break 17415 } 17416 c := auxIntToInt32(l.AuxInt) 17417 y := l.Args[1] 17418 x := l.Args[0] 17419 if !(l.Uses == 1) { 17420 break 17421 } 17422 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 17423 v0.AuxInt = int32ToAuxInt(c) 17424 v0.AddArg2(x, y) 17425 b.resetWithControl(BlockARMGEnoov, v0) 17426 return true 17427 } 17428 // match: (GE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 17429 // cond: l.Uses==1 17430 // result: (GEnoov (CMNshiftRA x y [c]) yes no) 17431 for b.Controls[0].Op == OpARMCMPconst { 17432 v_0 := b.Controls[0] 17433 if auxIntToInt32(v_0.AuxInt) != 0 { 17434 break 17435 } 17436 l := v_0.Args[0] 17437 if l.Op != OpARMADDshiftRA { 17438 break 17439 } 17440 c := auxIntToInt32(l.AuxInt) 17441 y := l.Args[1] 17442 x := l.Args[0] 17443 if !(l.Uses == 1) { 17444 break 17445 } 17446 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 17447 v0.AuxInt = int32ToAuxInt(c) 17448 v0.AddArg2(x, y) 17449 b.resetWithControl(BlockARMGEnoov, v0) 17450 return true 17451 } 17452 // match: (GE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 17453 // cond: l.Uses==1 17454 // result: (GEnoov (CMNshiftLLreg x y z) yes no) 17455 for b.Controls[0].Op == OpARMCMPconst { 17456 v_0 := b.Controls[0] 17457 if auxIntToInt32(v_0.AuxInt) != 0 { 17458 break 17459 } 17460 l := v_0.Args[0] 17461 if l.Op != OpARMADDshiftLLreg { 17462 break 17463 } 17464 z := l.Args[2] 17465 x := l.Args[0] 17466 y := l.Args[1] 17467 if !(l.Uses == 1) { 17468 break 17469 } 17470 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 17471 v0.AddArg3(x, y, z) 17472 b.resetWithControl(BlockARMGEnoov, v0) 17473 return true 17474 } 17475 // match: (GE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 17476 // cond: l.Uses==1 17477 // result: (GEnoov (CMNshiftRLreg x y z) yes no) 17478 for b.Controls[0].Op == OpARMCMPconst { 17479 v_0 := b.Controls[0] 17480 if auxIntToInt32(v_0.AuxInt) != 0 { 17481 break 17482 } 17483 l := v_0.Args[0] 17484 if l.Op != OpARMADDshiftRLreg { 17485 break 17486 } 17487 z := l.Args[2] 17488 x := l.Args[0] 17489 y := l.Args[1] 17490 if !(l.Uses == 1) { 17491 break 17492 } 17493 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 17494 v0.AddArg3(x, y, z) 17495 b.resetWithControl(BlockARMGEnoov, v0) 17496 return true 17497 } 17498 // match: (GE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 17499 // cond: l.Uses==1 17500 // result: (GEnoov (CMNshiftRAreg x y z) yes no) 17501 for b.Controls[0].Op == OpARMCMPconst { 17502 v_0 := b.Controls[0] 17503 if auxIntToInt32(v_0.AuxInt) != 0 { 17504 break 17505 } 17506 l := v_0.Args[0] 17507 if l.Op != OpARMADDshiftRAreg { 17508 break 17509 } 17510 z := l.Args[2] 17511 x := l.Args[0] 17512 y := l.Args[1] 17513 if !(l.Uses == 1) { 17514 break 17515 } 17516 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 17517 v0.AddArg3(x, y, z) 17518 b.resetWithControl(BlockARMGEnoov, v0) 17519 return true 17520 } 17521 // match: (GE (CMPconst [0] l:(AND x y)) yes no) 17522 // cond: l.Uses==1 17523 // result: (GEnoov (TST x y) yes no) 17524 for b.Controls[0].Op == OpARMCMPconst { 17525 v_0 := b.Controls[0] 17526 if auxIntToInt32(v_0.AuxInt) != 0 { 17527 break 17528 } 17529 l := v_0.Args[0] 17530 if l.Op != OpARMAND { 17531 break 17532 } 17533 _ = l.Args[1] 17534 l_0 := l.Args[0] 17535 l_1 := l.Args[1] 17536 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 17537 x := l_0 17538 y := l_1 17539 if !(l.Uses == 1) { 17540 continue 17541 } 17542 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 17543 v0.AddArg2(x, y) 17544 b.resetWithControl(BlockARMGEnoov, v0) 17545 return true 17546 } 17547 break 17548 } 17549 // match: (GE (CMPconst [0] l:(ANDconst [c] x)) yes no) 17550 // cond: l.Uses==1 17551 // result: (GEnoov (TSTconst [c] x) yes no) 17552 for b.Controls[0].Op == OpARMCMPconst { 17553 v_0 := b.Controls[0] 17554 if auxIntToInt32(v_0.AuxInt) != 0 { 17555 break 17556 } 17557 l := v_0.Args[0] 17558 if l.Op != OpARMANDconst { 17559 break 17560 } 17561 c := auxIntToInt32(l.AuxInt) 17562 x := l.Args[0] 17563 if !(l.Uses == 1) { 17564 break 17565 } 17566 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 17567 v0.AuxInt = int32ToAuxInt(c) 17568 v0.AddArg(x) 17569 b.resetWithControl(BlockARMGEnoov, v0) 17570 return true 17571 } 17572 // match: (GE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 17573 // cond: l.Uses==1 17574 // result: (GEnoov (TSTshiftLL x y [c]) yes no) 17575 for b.Controls[0].Op == OpARMCMPconst { 17576 v_0 := b.Controls[0] 17577 if auxIntToInt32(v_0.AuxInt) != 0 { 17578 break 17579 } 17580 l := v_0.Args[0] 17581 if l.Op != OpARMANDshiftLL { 17582 break 17583 } 17584 c := auxIntToInt32(l.AuxInt) 17585 y := l.Args[1] 17586 x := l.Args[0] 17587 if !(l.Uses == 1) { 17588 break 17589 } 17590 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 17591 v0.AuxInt = int32ToAuxInt(c) 17592 v0.AddArg2(x, y) 17593 b.resetWithControl(BlockARMGEnoov, v0) 17594 return true 17595 } 17596 // match: (GE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 17597 // cond: l.Uses==1 17598 // result: (GEnoov (TSTshiftRL x y [c]) yes no) 17599 for b.Controls[0].Op == OpARMCMPconst { 17600 v_0 := b.Controls[0] 17601 if auxIntToInt32(v_0.AuxInt) != 0 { 17602 break 17603 } 17604 l := v_0.Args[0] 17605 if l.Op != OpARMANDshiftRL { 17606 break 17607 } 17608 c := auxIntToInt32(l.AuxInt) 17609 y := l.Args[1] 17610 x := l.Args[0] 17611 if !(l.Uses == 1) { 17612 break 17613 } 17614 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 17615 v0.AuxInt = int32ToAuxInt(c) 17616 v0.AddArg2(x, y) 17617 b.resetWithControl(BlockARMGEnoov, v0) 17618 return true 17619 } 17620 // match: (GE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 17621 // cond: l.Uses==1 17622 // result: (GEnoov (TSTshiftRA x y [c]) yes no) 17623 for b.Controls[0].Op == OpARMCMPconst { 17624 v_0 := b.Controls[0] 17625 if auxIntToInt32(v_0.AuxInt) != 0 { 17626 break 17627 } 17628 l := v_0.Args[0] 17629 if l.Op != OpARMANDshiftRA { 17630 break 17631 } 17632 c := auxIntToInt32(l.AuxInt) 17633 y := l.Args[1] 17634 x := l.Args[0] 17635 if !(l.Uses == 1) { 17636 break 17637 } 17638 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 17639 v0.AuxInt = int32ToAuxInt(c) 17640 v0.AddArg2(x, y) 17641 b.resetWithControl(BlockARMGEnoov, v0) 17642 return true 17643 } 17644 // match: (GE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 17645 // cond: l.Uses==1 17646 // result: (GEnoov (TSTshiftLLreg x y z) yes no) 17647 for b.Controls[0].Op == OpARMCMPconst { 17648 v_0 := b.Controls[0] 17649 if auxIntToInt32(v_0.AuxInt) != 0 { 17650 break 17651 } 17652 l := v_0.Args[0] 17653 if l.Op != OpARMANDshiftLLreg { 17654 break 17655 } 17656 z := l.Args[2] 17657 x := l.Args[0] 17658 y := l.Args[1] 17659 if !(l.Uses == 1) { 17660 break 17661 } 17662 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 17663 v0.AddArg3(x, y, z) 17664 b.resetWithControl(BlockARMGEnoov, v0) 17665 return true 17666 } 17667 // match: (GE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 17668 // cond: l.Uses==1 17669 // result: (GEnoov (TSTshiftRLreg x y z) yes no) 17670 for b.Controls[0].Op == OpARMCMPconst { 17671 v_0 := b.Controls[0] 17672 if auxIntToInt32(v_0.AuxInt) != 0 { 17673 break 17674 } 17675 l := v_0.Args[0] 17676 if l.Op != OpARMANDshiftRLreg { 17677 break 17678 } 17679 z := l.Args[2] 17680 x := l.Args[0] 17681 y := l.Args[1] 17682 if !(l.Uses == 1) { 17683 break 17684 } 17685 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 17686 v0.AddArg3(x, y, z) 17687 b.resetWithControl(BlockARMGEnoov, v0) 17688 return true 17689 } 17690 // match: (GE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 17691 // cond: l.Uses==1 17692 // result: (GEnoov (TSTshiftRAreg x y z) yes no) 17693 for b.Controls[0].Op == OpARMCMPconst { 17694 v_0 := b.Controls[0] 17695 if auxIntToInt32(v_0.AuxInt) != 0 { 17696 break 17697 } 17698 l := v_0.Args[0] 17699 if l.Op != OpARMANDshiftRAreg { 17700 break 17701 } 17702 z := l.Args[2] 17703 x := l.Args[0] 17704 y := l.Args[1] 17705 if !(l.Uses == 1) { 17706 break 17707 } 17708 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 17709 v0.AddArg3(x, y, z) 17710 b.resetWithControl(BlockARMGEnoov, v0) 17711 return true 17712 } 17713 // match: (GE (CMPconst [0] l:(XOR x y)) yes no) 17714 // cond: l.Uses==1 17715 // result: (GEnoov (TEQ x y) yes no) 17716 for b.Controls[0].Op == OpARMCMPconst { 17717 v_0 := b.Controls[0] 17718 if auxIntToInt32(v_0.AuxInt) != 0 { 17719 break 17720 } 17721 l := v_0.Args[0] 17722 if l.Op != OpARMXOR { 17723 break 17724 } 17725 _ = l.Args[1] 17726 l_0 := l.Args[0] 17727 l_1 := l.Args[1] 17728 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 17729 x := l_0 17730 y := l_1 17731 if !(l.Uses == 1) { 17732 continue 17733 } 17734 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 17735 v0.AddArg2(x, y) 17736 b.resetWithControl(BlockARMGEnoov, v0) 17737 return true 17738 } 17739 break 17740 } 17741 // match: (GE (CMPconst [0] l:(XORconst [c] x)) yes no) 17742 // cond: l.Uses==1 17743 // result: (GEnoov (TEQconst [c] x) yes no) 17744 for b.Controls[0].Op == OpARMCMPconst { 17745 v_0 := b.Controls[0] 17746 if auxIntToInt32(v_0.AuxInt) != 0 { 17747 break 17748 } 17749 l := v_0.Args[0] 17750 if l.Op != OpARMXORconst { 17751 break 17752 } 17753 c := auxIntToInt32(l.AuxInt) 17754 x := l.Args[0] 17755 if !(l.Uses == 1) { 17756 break 17757 } 17758 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 17759 v0.AuxInt = int32ToAuxInt(c) 17760 v0.AddArg(x) 17761 b.resetWithControl(BlockARMGEnoov, v0) 17762 return true 17763 } 17764 // match: (GE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 17765 // cond: l.Uses==1 17766 // result: (GEnoov (TEQshiftLL x y [c]) yes no) 17767 for b.Controls[0].Op == OpARMCMPconst { 17768 v_0 := b.Controls[0] 17769 if auxIntToInt32(v_0.AuxInt) != 0 { 17770 break 17771 } 17772 l := v_0.Args[0] 17773 if l.Op != OpARMXORshiftLL { 17774 break 17775 } 17776 c := auxIntToInt32(l.AuxInt) 17777 y := l.Args[1] 17778 x := l.Args[0] 17779 if !(l.Uses == 1) { 17780 break 17781 } 17782 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 17783 v0.AuxInt = int32ToAuxInt(c) 17784 v0.AddArg2(x, y) 17785 b.resetWithControl(BlockARMGEnoov, v0) 17786 return true 17787 } 17788 // match: (GE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 17789 // cond: l.Uses==1 17790 // result: (GEnoov (TEQshiftRL x y [c]) yes no) 17791 for b.Controls[0].Op == OpARMCMPconst { 17792 v_0 := b.Controls[0] 17793 if auxIntToInt32(v_0.AuxInt) != 0 { 17794 break 17795 } 17796 l := v_0.Args[0] 17797 if l.Op != OpARMXORshiftRL { 17798 break 17799 } 17800 c := auxIntToInt32(l.AuxInt) 17801 y := l.Args[1] 17802 x := l.Args[0] 17803 if !(l.Uses == 1) { 17804 break 17805 } 17806 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 17807 v0.AuxInt = int32ToAuxInt(c) 17808 v0.AddArg2(x, y) 17809 b.resetWithControl(BlockARMGEnoov, v0) 17810 return true 17811 } 17812 // match: (GE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 17813 // cond: l.Uses==1 17814 // result: (GEnoov (TEQshiftRA x y [c]) yes no) 17815 for b.Controls[0].Op == OpARMCMPconst { 17816 v_0 := b.Controls[0] 17817 if auxIntToInt32(v_0.AuxInt) != 0 { 17818 break 17819 } 17820 l := v_0.Args[0] 17821 if l.Op != OpARMXORshiftRA { 17822 break 17823 } 17824 c := auxIntToInt32(l.AuxInt) 17825 y := l.Args[1] 17826 x := l.Args[0] 17827 if !(l.Uses == 1) { 17828 break 17829 } 17830 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 17831 v0.AuxInt = int32ToAuxInt(c) 17832 v0.AddArg2(x, y) 17833 b.resetWithControl(BlockARMGEnoov, v0) 17834 return true 17835 } 17836 // match: (GE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 17837 // cond: l.Uses==1 17838 // result: (GEnoov (TEQshiftLLreg x y z) yes no) 17839 for b.Controls[0].Op == OpARMCMPconst { 17840 v_0 := b.Controls[0] 17841 if auxIntToInt32(v_0.AuxInt) != 0 { 17842 break 17843 } 17844 l := v_0.Args[0] 17845 if l.Op != OpARMXORshiftLLreg { 17846 break 17847 } 17848 z := l.Args[2] 17849 x := l.Args[0] 17850 y := l.Args[1] 17851 if !(l.Uses == 1) { 17852 break 17853 } 17854 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 17855 v0.AddArg3(x, y, z) 17856 b.resetWithControl(BlockARMGEnoov, v0) 17857 return true 17858 } 17859 // match: (GE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 17860 // cond: l.Uses==1 17861 // result: (GEnoov (TEQshiftRLreg x y z) yes no) 17862 for b.Controls[0].Op == OpARMCMPconst { 17863 v_0 := b.Controls[0] 17864 if auxIntToInt32(v_0.AuxInt) != 0 { 17865 break 17866 } 17867 l := v_0.Args[0] 17868 if l.Op != OpARMXORshiftRLreg { 17869 break 17870 } 17871 z := l.Args[2] 17872 x := l.Args[0] 17873 y := l.Args[1] 17874 if !(l.Uses == 1) { 17875 break 17876 } 17877 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 17878 v0.AddArg3(x, y, z) 17879 b.resetWithControl(BlockARMGEnoov, v0) 17880 return true 17881 } 17882 // match: (GE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 17883 // cond: l.Uses==1 17884 // result: (GEnoov (TEQshiftRAreg x y z) yes no) 17885 for b.Controls[0].Op == OpARMCMPconst { 17886 v_0 := b.Controls[0] 17887 if auxIntToInt32(v_0.AuxInt) != 0 { 17888 break 17889 } 17890 l := v_0.Args[0] 17891 if l.Op != OpARMXORshiftRAreg { 17892 break 17893 } 17894 z := l.Args[2] 17895 x := l.Args[0] 17896 y := l.Args[1] 17897 if !(l.Uses == 1) { 17898 break 17899 } 17900 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 17901 v0.AddArg3(x, y, z) 17902 b.resetWithControl(BlockARMGEnoov, v0) 17903 return true 17904 } 17905 case BlockARMGEnoov: 17906 // match: (GEnoov (FlagConstant [fc]) yes no) 17907 // cond: fc.geNoov() 17908 // result: (First yes no) 17909 for b.Controls[0].Op == OpARMFlagConstant { 17910 v_0 := b.Controls[0] 17911 fc := auxIntToFlagConstant(v_0.AuxInt) 17912 if !(fc.geNoov()) { 17913 break 17914 } 17915 b.Reset(BlockFirst) 17916 return true 17917 } 17918 // match: (GEnoov (FlagConstant [fc]) yes no) 17919 // cond: !fc.geNoov() 17920 // result: (First no yes) 17921 for b.Controls[0].Op == OpARMFlagConstant { 17922 v_0 := b.Controls[0] 17923 fc := auxIntToFlagConstant(v_0.AuxInt) 17924 if !(!fc.geNoov()) { 17925 break 17926 } 17927 b.Reset(BlockFirst) 17928 b.swapSuccessors() 17929 return true 17930 } 17931 // match: (GEnoov (InvertFlags cmp) yes no) 17932 // result: (LEnoov cmp yes no) 17933 for b.Controls[0].Op == OpARMInvertFlags { 17934 v_0 := b.Controls[0] 17935 cmp := v_0.Args[0] 17936 b.resetWithControl(BlockARMLEnoov, cmp) 17937 return true 17938 } 17939 case BlockARMGT: 17940 // match: (GT (FlagConstant [fc]) yes no) 17941 // cond: fc.gt() 17942 // result: (First yes no) 17943 for b.Controls[0].Op == OpARMFlagConstant { 17944 v_0 := b.Controls[0] 17945 fc := auxIntToFlagConstant(v_0.AuxInt) 17946 if !(fc.gt()) { 17947 break 17948 } 17949 b.Reset(BlockFirst) 17950 return true 17951 } 17952 // match: (GT (FlagConstant [fc]) yes no) 17953 // cond: !fc.gt() 17954 // result: (First no yes) 17955 for b.Controls[0].Op == OpARMFlagConstant { 17956 v_0 := b.Controls[0] 17957 fc := auxIntToFlagConstant(v_0.AuxInt) 17958 if !(!fc.gt()) { 17959 break 17960 } 17961 b.Reset(BlockFirst) 17962 b.swapSuccessors() 17963 return true 17964 } 17965 // match: (GT (InvertFlags cmp) yes no) 17966 // result: (LT cmp yes no) 17967 for b.Controls[0].Op == OpARMInvertFlags { 17968 v_0 := b.Controls[0] 17969 cmp := v_0.Args[0] 17970 b.resetWithControl(BlockARMLT, cmp) 17971 return true 17972 } 17973 // match: (GT (CMPconst [0] l:(SUB x y)) yes no) 17974 // cond: l.Uses==1 17975 // result: (GTnoov (CMP x y) yes no) 17976 for b.Controls[0].Op == OpARMCMPconst { 17977 v_0 := b.Controls[0] 17978 if auxIntToInt32(v_0.AuxInt) != 0 { 17979 break 17980 } 17981 l := v_0.Args[0] 17982 if l.Op != OpARMSUB { 17983 break 17984 } 17985 y := l.Args[1] 17986 x := l.Args[0] 17987 if !(l.Uses == 1) { 17988 break 17989 } 17990 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 17991 v0.AddArg2(x, y) 17992 b.resetWithControl(BlockARMGTnoov, v0) 17993 return true 17994 } 17995 // match: (GT (CMPconst [0] l:(MULS x y a)) yes no) 17996 // cond: l.Uses==1 17997 // result: (GTnoov (CMP a (MUL <x.Type> x y)) yes no) 17998 for b.Controls[0].Op == OpARMCMPconst { 17999 v_0 := b.Controls[0] 18000 if auxIntToInt32(v_0.AuxInt) != 0 { 18001 break 18002 } 18003 l := v_0.Args[0] 18004 if l.Op != OpARMMULS { 18005 break 18006 } 18007 a := l.Args[2] 18008 x := l.Args[0] 18009 y := l.Args[1] 18010 if !(l.Uses == 1) { 18011 break 18012 } 18013 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 18014 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 18015 v1.AddArg2(x, y) 18016 v0.AddArg2(a, v1) 18017 b.resetWithControl(BlockARMGTnoov, v0) 18018 return true 18019 } 18020 // match: (GT (CMPconst [0] l:(SUBconst [c] x)) yes no) 18021 // cond: l.Uses==1 18022 // result: (GTnoov (CMPconst [c] x) yes no) 18023 for b.Controls[0].Op == OpARMCMPconst { 18024 v_0 := b.Controls[0] 18025 if auxIntToInt32(v_0.AuxInt) != 0 { 18026 break 18027 } 18028 l := v_0.Args[0] 18029 if l.Op != OpARMSUBconst { 18030 break 18031 } 18032 c := auxIntToInt32(l.AuxInt) 18033 x := l.Args[0] 18034 if !(l.Uses == 1) { 18035 break 18036 } 18037 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 18038 v0.AuxInt = int32ToAuxInt(c) 18039 v0.AddArg(x) 18040 b.resetWithControl(BlockARMGTnoov, v0) 18041 return true 18042 } 18043 // match: (GT (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 18044 // cond: l.Uses==1 18045 // result: (GTnoov (CMPshiftLL x y [c]) yes no) 18046 for b.Controls[0].Op == OpARMCMPconst { 18047 v_0 := b.Controls[0] 18048 if auxIntToInt32(v_0.AuxInt) != 0 { 18049 break 18050 } 18051 l := v_0.Args[0] 18052 if l.Op != OpARMSUBshiftLL { 18053 break 18054 } 18055 c := auxIntToInt32(l.AuxInt) 18056 y := l.Args[1] 18057 x := l.Args[0] 18058 if !(l.Uses == 1) { 18059 break 18060 } 18061 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 18062 v0.AuxInt = int32ToAuxInt(c) 18063 v0.AddArg2(x, y) 18064 b.resetWithControl(BlockARMGTnoov, v0) 18065 return true 18066 } 18067 // match: (GT (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 18068 // cond: l.Uses==1 18069 // result: (GTnoov (CMPshiftRL x y [c]) yes no) 18070 for b.Controls[0].Op == OpARMCMPconst { 18071 v_0 := b.Controls[0] 18072 if auxIntToInt32(v_0.AuxInt) != 0 { 18073 break 18074 } 18075 l := v_0.Args[0] 18076 if l.Op != OpARMSUBshiftRL { 18077 break 18078 } 18079 c := auxIntToInt32(l.AuxInt) 18080 y := l.Args[1] 18081 x := l.Args[0] 18082 if !(l.Uses == 1) { 18083 break 18084 } 18085 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 18086 v0.AuxInt = int32ToAuxInt(c) 18087 v0.AddArg2(x, y) 18088 b.resetWithControl(BlockARMGTnoov, v0) 18089 return true 18090 } 18091 // match: (GT (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 18092 // cond: l.Uses==1 18093 // result: (GTnoov (CMPshiftRA x y [c]) yes no) 18094 for b.Controls[0].Op == OpARMCMPconst { 18095 v_0 := b.Controls[0] 18096 if auxIntToInt32(v_0.AuxInt) != 0 { 18097 break 18098 } 18099 l := v_0.Args[0] 18100 if l.Op != OpARMSUBshiftRA { 18101 break 18102 } 18103 c := auxIntToInt32(l.AuxInt) 18104 y := l.Args[1] 18105 x := l.Args[0] 18106 if !(l.Uses == 1) { 18107 break 18108 } 18109 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 18110 v0.AuxInt = int32ToAuxInt(c) 18111 v0.AddArg2(x, y) 18112 b.resetWithControl(BlockARMGTnoov, v0) 18113 return true 18114 } 18115 // match: (GT (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 18116 // cond: l.Uses==1 18117 // result: (GTnoov (CMPshiftLLreg x y z) yes no) 18118 for b.Controls[0].Op == OpARMCMPconst { 18119 v_0 := b.Controls[0] 18120 if auxIntToInt32(v_0.AuxInt) != 0 { 18121 break 18122 } 18123 l := v_0.Args[0] 18124 if l.Op != OpARMSUBshiftLLreg { 18125 break 18126 } 18127 z := l.Args[2] 18128 x := l.Args[0] 18129 y := l.Args[1] 18130 if !(l.Uses == 1) { 18131 break 18132 } 18133 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 18134 v0.AddArg3(x, y, z) 18135 b.resetWithControl(BlockARMGTnoov, v0) 18136 return true 18137 } 18138 // match: (GT (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 18139 // cond: l.Uses==1 18140 // result: (GTnoov (CMPshiftRLreg x y z) yes no) 18141 for b.Controls[0].Op == OpARMCMPconst { 18142 v_0 := b.Controls[0] 18143 if auxIntToInt32(v_0.AuxInt) != 0 { 18144 break 18145 } 18146 l := v_0.Args[0] 18147 if l.Op != OpARMSUBshiftRLreg { 18148 break 18149 } 18150 z := l.Args[2] 18151 x := l.Args[0] 18152 y := l.Args[1] 18153 if !(l.Uses == 1) { 18154 break 18155 } 18156 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 18157 v0.AddArg3(x, y, z) 18158 b.resetWithControl(BlockARMGTnoov, v0) 18159 return true 18160 } 18161 // match: (GT (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 18162 // cond: l.Uses==1 18163 // result: (GTnoov (CMPshiftRAreg x y z) yes no) 18164 for b.Controls[0].Op == OpARMCMPconst { 18165 v_0 := b.Controls[0] 18166 if auxIntToInt32(v_0.AuxInt) != 0 { 18167 break 18168 } 18169 l := v_0.Args[0] 18170 if l.Op != OpARMSUBshiftRAreg { 18171 break 18172 } 18173 z := l.Args[2] 18174 x := l.Args[0] 18175 y := l.Args[1] 18176 if !(l.Uses == 1) { 18177 break 18178 } 18179 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 18180 v0.AddArg3(x, y, z) 18181 b.resetWithControl(BlockARMGTnoov, v0) 18182 return true 18183 } 18184 // match: (GT (CMPconst [0] l:(ADD x y)) yes no) 18185 // cond: l.Uses==1 18186 // result: (GTnoov (CMN x y) yes no) 18187 for b.Controls[0].Op == OpARMCMPconst { 18188 v_0 := b.Controls[0] 18189 if auxIntToInt32(v_0.AuxInt) != 0 { 18190 break 18191 } 18192 l := v_0.Args[0] 18193 if l.Op != OpARMADD { 18194 break 18195 } 18196 _ = l.Args[1] 18197 l_0 := l.Args[0] 18198 l_1 := l.Args[1] 18199 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 18200 x := l_0 18201 y := l_1 18202 if !(l.Uses == 1) { 18203 continue 18204 } 18205 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 18206 v0.AddArg2(x, y) 18207 b.resetWithControl(BlockARMGTnoov, v0) 18208 return true 18209 } 18210 break 18211 } 18212 // match: (GT (CMPconst [0] l:(ADDconst [c] x)) yes no) 18213 // cond: l.Uses==1 18214 // result: (GTnoov (CMNconst [c] x) yes no) 18215 for b.Controls[0].Op == OpARMCMPconst { 18216 v_0 := b.Controls[0] 18217 if auxIntToInt32(v_0.AuxInt) != 0 { 18218 break 18219 } 18220 l := v_0.Args[0] 18221 if l.Op != OpARMADDconst { 18222 break 18223 } 18224 c := auxIntToInt32(l.AuxInt) 18225 x := l.Args[0] 18226 if !(l.Uses == 1) { 18227 break 18228 } 18229 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 18230 v0.AuxInt = int32ToAuxInt(c) 18231 v0.AddArg(x) 18232 b.resetWithControl(BlockARMGTnoov, v0) 18233 return true 18234 } 18235 // match: (GT (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 18236 // cond: l.Uses==1 18237 // result: (GTnoov (CMNshiftLL x y [c]) yes no) 18238 for b.Controls[0].Op == OpARMCMPconst { 18239 v_0 := b.Controls[0] 18240 if auxIntToInt32(v_0.AuxInt) != 0 { 18241 break 18242 } 18243 l := v_0.Args[0] 18244 if l.Op != OpARMADDshiftLL { 18245 break 18246 } 18247 c := auxIntToInt32(l.AuxInt) 18248 y := l.Args[1] 18249 x := l.Args[0] 18250 if !(l.Uses == 1) { 18251 break 18252 } 18253 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 18254 v0.AuxInt = int32ToAuxInt(c) 18255 v0.AddArg2(x, y) 18256 b.resetWithControl(BlockARMGTnoov, v0) 18257 return true 18258 } 18259 // match: (GT (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 18260 // cond: l.Uses==1 18261 // result: (GTnoov (CMNshiftRL x y [c]) yes no) 18262 for b.Controls[0].Op == OpARMCMPconst { 18263 v_0 := b.Controls[0] 18264 if auxIntToInt32(v_0.AuxInt) != 0 { 18265 break 18266 } 18267 l := v_0.Args[0] 18268 if l.Op != OpARMADDshiftRL { 18269 break 18270 } 18271 c := auxIntToInt32(l.AuxInt) 18272 y := l.Args[1] 18273 x := l.Args[0] 18274 if !(l.Uses == 1) { 18275 break 18276 } 18277 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 18278 v0.AuxInt = int32ToAuxInt(c) 18279 v0.AddArg2(x, y) 18280 b.resetWithControl(BlockARMGTnoov, v0) 18281 return true 18282 } 18283 // match: (GT (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 18284 // cond: l.Uses==1 18285 // result: (GTnoov (CMNshiftRA x y [c]) yes no) 18286 for b.Controls[0].Op == OpARMCMPconst { 18287 v_0 := b.Controls[0] 18288 if auxIntToInt32(v_0.AuxInt) != 0 { 18289 break 18290 } 18291 l := v_0.Args[0] 18292 if l.Op != OpARMADDshiftRA { 18293 break 18294 } 18295 c := auxIntToInt32(l.AuxInt) 18296 y := l.Args[1] 18297 x := l.Args[0] 18298 if !(l.Uses == 1) { 18299 break 18300 } 18301 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 18302 v0.AuxInt = int32ToAuxInt(c) 18303 v0.AddArg2(x, y) 18304 b.resetWithControl(BlockARMGTnoov, v0) 18305 return true 18306 } 18307 // match: (GT (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 18308 // cond: l.Uses==1 18309 // result: (GTnoov (CMNshiftLLreg x y z) yes no) 18310 for b.Controls[0].Op == OpARMCMPconst { 18311 v_0 := b.Controls[0] 18312 if auxIntToInt32(v_0.AuxInt) != 0 { 18313 break 18314 } 18315 l := v_0.Args[0] 18316 if l.Op != OpARMADDshiftLLreg { 18317 break 18318 } 18319 z := l.Args[2] 18320 x := l.Args[0] 18321 y := l.Args[1] 18322 if !(l.Uses == 1) { 18323 break 18324 } 18325 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 18326 v0.AddArg3(x, y, z) 18327 b.resetWithControl(BlockARMGTnoov, v0) 18328 return true 18329 } 18330 // match: (GT (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 18331 // cond: l.Uses==1 18332 // result: (GTnoov (CMNshiftRLreg x y z) yes no) 18333 for b.Controls[0].Op == OpARMCMPconst { 18334 v_0 := b.Controls[0] 18335 if auxIntToInt32(v_0.AuxInt) != 0 { 18336 break 18337 } 18338 l := v_0.Args[0] 18339 if l.Op != OpARMADDshiftRLreg { 18340 break 18341 } 18342 z := l.Args[2] 18343 x := l.Args[0] 18344 y := l.Args[1] 18345 if !(l.Uses == 1) { 18346 break 18347 } 18348 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 18349 v0.AddArg3(x, y, z) 18350 b.resetWithControl(BlockARMGTnoov, v0) 18351 return true 18352 } 18353 // match: (GT (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 18354 // cond: l.Uses==1 18355 // result: (GTnoov (CMNshiftRAreg x y z) yes no) 18356 for b.Controls[0].Op == OpARMCMPconst { 18357 v_0 := b.Controls[0] 18358 if auxIntToInt32(v_0.AuxInt) != 0 { 18359 break 18360 } 18361 l := v_0.Args[0] 18362 if l.Op != OpARMADDshiftRAreg { 18363 break 18364 } 18365 z := l.Args[2] 18366 x := l.Args[0] 18367 y := l.Args[1] 18368 if !(l.Uses == 1) { 18369 break 18370 } 18371 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 18372 v0.AddArg3(x, y, z) 18373 b.resetWithControl(BlockARMGTnoov, v0) 18374 return true 18375 } 18376 // match: (GT (CMPconst [0] l:(MULA x y a)) yes no) 18377 // cond: l.Uses==1 18378 // result: (GTnoov (CMN a (MUL <x.Type> x y)) yes no) 18379 for b.Controls[0].Op == OpARMCMPconst { 18380 v_0 := b.Controls[0] 18381 if auxIntToInt32(v_0.AuxInt) != 0 { 18382 break 18383 } 18384 l := v_0.Args[0] 18385 if l.Op != OpARMMULA { 18386 break 18387 } 18388 a := l.Args[2] 18389 x := l.Args[0] 18390 y := l.Args[1] 18391 if !(l.Uses == 1) { 18392 break 18393 } 18394 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 18395 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 18396 v1.AddArg2(x, y) 18397 v0.AddArg2(a, v1) 18398 b.resetWithControl(BlockARMGTnoov, v0) 18399 return true 18400 } 18401 // match: (GT (CMPconst [0] l:(AND x y)) yes no) 18402 // cond: l.Uses==1 18403 // result: (GTnoov (TST x y) yes no) 18404 for b.Controls[0].Op == OpARMCMPconst { 18405 v_0 := b.Controls[0] 18406 if auxIntToInt32(v_0.AuxInt) != 0 { 18407 break 18408 } 18409 l := v_0.Args[0] 18410 if l.Op != OpARMAND { 18411 break 18412 } 18413 _ = l.Args[1] 18414 l_0 := l.Args[0] 18415 l_1 := l.Args[1] 18416 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 18417 x := l_0 18418 y := l_1 18419 if !(l.Uses == 1) { 18420 continue 18421 } 18422 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 18423 v0.AddArg2(x, y) 18424 b.resetWithControl(BlockARMGTnoov, v0) 18425 return true 18426 } 18427 break 18428 } 18429 // match: (GT (CMPconst [0] l:(ANDconst [c] x)) yes no) 18430 // cond: l.Uses==1 18431 // result: (GTnoov (TSTconst [c] x) yes no) 18432 for b.Controls[0].Op == OpARMCMPconst { 18433 v_0 := b.Controls[0] 18434 if auxIntToInt32(v_0.AuxInt) != 0 { 18435 break 18436 } 18437 l := v_0.Args[0] 18438 if l.Op != OpARMANDconst { 18439 break 18440 } 18441 c := auxIntToInt32(l.AuxInt) 18442 x := l.Args[0] 18443 if !(l.Uses == 1) { 18444 break 18445 } 18446 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 18447 v0.AuxInt = int32ToAuxInt(c) 18448 v0.AddArg(x) 18449 b.resetWithControl(BlockARMGTnoov, v0) 18450 return true 18451 } 18452 // match: (GT (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 18453 // cond: l.Uses==1 18454 // result: (GTnoov (TSTshiftLL x y [c]) yes no) 18455 for b.Controls[0].Op == OpARMCMPconst { 18456 v_0 := b.Controls[0] 18457 if auxIntToInt32(v_0.AuxInt) != 0 { 18458 break 18459 } 18460 l := v_0.Args[0] 18461 if l.Op != OpARMANDshiftLL { 18462 break 18463 } 18464 c := auxIntToInt32(l.AuxInt) 18465 y := l.Args[1] 18466 x := l.Args[0] 18467 if !(l.Uses == 1) { 18468 break 18469 } 18470 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 18471 v0.AuxInt = int32ToAuxInt(c) 18472 v0.AddArg2(x, y) 18473 b.resetWithControl(BlockARMGTnoov, v0) 18474 return true 18475 } 18476 // match: (GT (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 18477 // cond: l.Uses==1 18478 // result: (GTnoov (TSTshiftRL x y [c]) yes no) 18479 for b.Controls[0].Op == OpARMCMPconst { 18480 v_0 := b.Controls[0] 18481 if auxIntToInt32(v_0.AuxInt) != 0 { 18482 break 18483 } 18484 l := v_0.Args[0] 18485 if l.Op != OpARMANDshiftRL { 18486 break 18487 } 18488 c := auxIntToInt32(l.AuxInt) 18489 y := l.Args[1] 18490 x := l.Args[0] 18491 if !(l.Uses == 1) { 18492 break 18493 } 18494 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 18495 v0.AuxInt = int32ToAuxInt(c) 18496 v0.AddArg2(x, y) 18497 b.resetWithControl(BlockARMGTnoov, v0) 18498 return true 18499 } 18500 // match: (GT (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 18501 // cond: l.Uses==1 18502 // result: (GTnoov (TSTshiftRA x y [c]) yes no) 18503 for b.Controls[0].Op == OpARMCMPconst { 18504 v_0 := b.Controls[0] 18505 if auxIntToInt32(v_0.AuxInt) != 0 { 18506 break 18507 } 18508 l := v_0.Args[0] 18509 if l.Op != OpARMANDshiftRA { 18510 break 18511 } 18512 c := auxIntToInt32(l.AuxInt) 18513 y := l.Args[1] 18514 x := l.Args[0] 18515 if !(l.Uses == 1) { 18516 break 18517 } 18518 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 18519 v0.AuxInt = int32ToAuxInt(c) 18520 v0.AddArg2(x, y) 18521 b.resetWithControl(BlockARMGTnoov, v0) 18522 return true 18523 } 18524 // match: (GT (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 18525 // cond: l.Uses==1 18526 // result: (GTnoov (TSTshiftLLreg x y z) yes no) 18527 for b.Controls[0].Op == OpARMCMPconst { 18528 v_0 := b.Controls[0] 18529 if auxIntToInt32(v_0.AuxInt) != 0 { 18530 break 18531 } 18532 l := v_0.Args[0] 18533 if l.Op != OpARMANDshiftLLreg { 18534 break 18535 } 18536 z := l.Args[2] 18537 x := l.Args[0] 18538 y := l.Args[1] 18539 if !(l.Uses == 1) { 18540 break 18541 } 18542 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 18543 v0.AddArg3(x, y, z) 18544 b.resetWithControl(BlockARMGTnoov, v0) 18545 return true 18546 } 18547 // match: (GT (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 18548 // cond: l.Uses==1 18549 // result: (GTnoov (TSTshiftRLreg x y z) yes no) 18550 for b.Controls[0].Op == OpARMCMPconst { 18551 v_0 := b.Controls[0] 18552 if auxIntToInt32(v_0.AuxInt) != 0 { 18553 break 18554 } 18555 l := v_0.Args[0] 18556 if l.Op != OpARMANDshiftRLreg { 18557 break 18558 } 18559 z := l.Args[2] 18560 x := l.Args[0] 18561 y := l.Args[1] 18562 if !(l.Uses == 1) { 18563 break 18564 } 18565 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 18566 v0.AddArg3(x, y, z) 18567 b.resetWithControl(BlockARMGTnoov, v0) 18568 return true 18569 } 18570 // match: (GT (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 18571 // cond: l.Uses==1 18572 // result: (GTnoov (TSTshiftRAreg x y z) yes no) 18573 for b.Controls[0].Op == OpARMCMPconst { 18574 v_0 := b.Controls[0] 18575 if auxIntToInt32(v_0.AuxInt) != 0 { 18576 break 18577 } 18578 l := v_0.Args[0] 18579 if l.Op != OpARMANDshiftRAreg { 18580 break 18581 } 18582 z := l.Args[2] 18583 x := l.Args[0] 18584 y := l.Args[1] 18585 if !(l.Uses == 1) { 18586 break 18587 } 18588 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 18589 v0.AddArg3(x, y, z) 18590 b.resetWithControl(BlockARMGTnoov, v0) 18591 return true 18592 } 18593 // match: (GT (CMPconst [0] l:(XOR x y)) yes no) 18594 // cond: l.Uses==1 18595 // result: (GTnoov (TEQ x y) yes no) 18596 for b.Controls[0].Op == OpARMCMPconst { 18597 v_0 := b.Controls[0] 18598 if auxIntToInt32(v_0.AuxInt) != 0 { 18599 break 18600 } 18601 l := v_0.Args[0] 18602 if l.Op != OpARMXOR { 18603 break 18604 } 18605 _ = l.Args[1] 18606 l_0 := l.Args[0] 18607 l_1 := l.Args[1] 18608 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 18609 x := l_0 18610 y := l_1 18611 if !(l.Uses == 1) { 18612 continue 18613 } 18614 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 18615 v0.AddArg2(x, y) 18616 b.resetWithControl(BlockARMGTnoov, v0) 18617 return true 18618 } 18619 break 18620 } 18621 // match: (GT (CMPconst [0] l:(XORconst [c] x)) yes no) 18622 // cond: l.Uses==1 18623 // result: (GTnoov (TEQconst [c] x) yes no) 18624 for b.Controls[0].Op == OpARMCMPconst { 18625 v_0 := b.Controls[0] 18626 if auxIntToInt32(v_0.AuxInt) != 0 { 18627 break 18628 } 18629 l := v_0.Args[0] 18630 if l.Op != OpARMXORconst { 18631 break 18632 } 18633 c := auxIntToInt32(l.AuxInt) 18634 x := l.Args[0] 18635 if !(l.Uses == 1) { 18636 break 18637 } 18638 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 18639 v0.AuxInt = int32ToAuxInt(c) 18640 v0.AddArg(x) 18641 b.resetWithControl(BlockARMGTnoov, v0) 18642 return true 18643 } 18644 // match: (GT (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 18645 // cond: l.Uses==1 18646 // result: (GTnoov (TEQshiftLL x y [c]) yes no) 18647 for b.Controls[0].Op == OpARMCMPconst { 18648 v_0 := b.Controls[0] 18649 if auxIntToInt32(v_0.AuxInt) != 0 { 18650 break 18651 } 18652 l := v_0.Args[0] 18653 if l.Op != OpARMXORshiftLL { 18654 break 18655 } 18656 c := auxIntToInt32(l.AuxInt) 18657 y := l.Args[1] 18658 x := l.Args[0] 18659 if !(l.Uses == 1) { 18660 break 18661 } 18662 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 18663 v0.AuxInt = int32ToAuxInt(c) 18664 v0.AddArg2(x, y) 18665 b.resetWithControl(BlockARMGTnoov, v0) 18666 return true 18667 } 18668 // match: (GT (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 18669 // cond: l.Uses==1 18670 // result: (GTnoov (TEQshiftRL x y [c]) yes no) 18671 for b.Controls[0].Op == OpARMCMPconst { 18672 v_0 := b.Controls[0] 18673 if auxIntToInt32(v_0.AuxInt) != 0 { 18674 break 18675 } 18676 l := v_0.Args[0] 18677 if l.Op != OpARMXORshiftRL { 18678 break 18679 } 18680 c := auxIntToInt32(l.AuxInt) 18681 y := l.Args[1] 18682 x := l.Args[0] 18683 if !(l.Uses == 1) { 18684 break 18685 } 18686 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 18687 v0.AuxInt = int32ToAuxInt(c) 18688 v0.AddArg2(x, y) 18689 b.resetWithControl(BlockARMGTnoov, v0) 18690 return true 18691 } 18692 // match: (GT (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 18693 // cond: l.Uses==1 18694 // result: (GTnoov (TEQshiftRA x y [c]) yes no) 18695 for b.Controls[0].Op == OpARMCMPconst { 18696 v_0 := b.Controls[0] 18697 if auxIntToInt32(v_0.AuxInt) != 0 { 18698 break 18699 } 18700 l := v_0.Args[0] 18701 if l.Op != OpARMXORshiftRA { 18702 break 18703 } 18704 c := auxIntToInt32(l.AuxInt) 18705 y := l.Args[1] 18706 x := l.Args[0] 18707 if !(l.Uses == 1) { 18708 break 18709 } 18710 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 18711 v0.AuxInt = int32ToAuxInt(c) 18712 v0.AddArg2(x, y) 18713 b.resetWithControl(BlockARMGTnoov, v0) 18714 return true 18715 } 18716 // match: (GT (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 18717 // cond: l.Uses==1 18718 // result: (GTnoov (TEQshiftLLreg x y z) yes no) 18719 for b.Controls[0].Op == OpARMCMPconst { 18720 v_0 := b.Controls[0] 18721 if auxIntToInt32(v_0.AuxInt) != 0 { 18722 break 18723 } 18724 l := v_0.Args[0] 18725 if l.Op != OpARMXORshiftLLreg { 18726 break 18727 } 18728 z := l.Args[2] 18729 x := l.Args[0] 18730 y := l.Args[1] 18731 if !(l.Uses == 1) { 18732 break 18733 } 18734 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 18735 v0.AddArg3(x, y, z) 18736 b.resetWithControl(BlockARMGTnoov, v0) 18737 return true 18738 } 18739 // match: (GT (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 18740 // cond: l.Uses==1 18741 // result: (GTnoov (TEQshiftRLreg x y z) yes no) 18742 for b.Controls[0].Op == OpARMCMPconst { 18743 v_0 := b.Controls[0] 18744 if auxIntToInt32(v_0.AuxInt) != 0 { 18745 break 18746 } 18747 l := v_0.Args[0] 18748 if l.Op != OpARMXORshiftRLreg { 18749 break 18750 } 18751 z := l.Args[2] 18752 x := l.Args[0] 18753 y := l.Args[1] 18754 if !(l.Uses == 1) { 18755 break 18756 } 18757 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 18758 v0.AddArg3(x, y, z) 18759 b.resetWithControl(BlockARMGTnoov, v0) 18760 return true 18761 } 18762 // match: (GT (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 18763 // cond: l.Uses==1 18764 // result: (GTnoov (TEQshiftRAreg x y z) yes no) 18765 for b.Controls[0].Op == OpARMCMPconst { 18766 v_0 := b.Controls[0] 18767 if auxIntToInt32(v_0.AuxInt) != 0 { 18768 break 18769 } 18770 l := v_0.Args[0] 18771 if l.Op != OpARMXORshiftRAreg { 18772 break 18773 } 18774 z := l.Args[2] 18775 x := l.Args[0] 18776 y := l.Args[1] 18777 if !(l.Uses == 1) { 18778 break 18779 } 18780 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 18781 v0.AddArg3(x, y, z) 18782 b.resetWithControl(BlockARMGTnoov, v0) 18783 return true 18784 } 18785 case BlockARMGTnoov: 18786 // match: (GTnoov (FlagConstant [fc]) yes no) 18787 // cond: fc.gtNoov() 18788 // result: (First yes no) 18789 for b.Controls[0].Op == OpARMFlagConstant { 18790 v_0 := b.Controls[0] 18791 fc := auxIntToFlagConstant(v_0.AuxInt) 18792 if !(fc.gtNoov()) { 18793 break 18794 } 18795 b.Reset(BlockFirst) 18796 return true 18797 } 18798 // match: (GTnoov (FlagConstant [fc]) yes no) 18799 // cond: !fc.gtNoov() 18800 // result: (First no yes) 18801 for b.Controls[0].Op == OpARMFlagConstant { 18802 v_0 := b.Controls[0] 18803 fc := auxIntToFlagConstant(v_0.AuxInt) 18804 if !(!fc.gtNoov()) { 18805 break 18806 } 18807 b.Reset(BlockFirst) 18808 b.swapSuccessors() 18809 return true 18810 } 18811 // match: (GTnoov (InvertFlags cmp) yes no) 18812 // result: (LTnoov cmp yes no) 18813 for b.Controls[0].Op == OpARMInvertFlags { 18814 v_0 := b.Controls[0] 18815 cmp := v_0.Args[0] 18816 b.resetWithControl(BlockARMLTnoov, cmp) 18817 return true 18818 } 18819 case BlockIf: 18820 // match: (If (Equal cc) yes no) 18821 // result: (EQ cc yes no) 18822 for b.Controls[0].Op == OpARMEqual { 18823 v_0 := b.Controls[0] 18824 cc := v_0.Args[0] 18825 b.resetWithControl(BlockARMEQ, cc) 18826 return true 18827 } 18828 // match: (If (NotEqual cc) yes no) 18829 // result: (NE cc yes no) 18830 for b.Controls[0].Op == OpARMNotEqual { 18831 v_0 := b.Controls[0] 18832 cc := v_0.Args[0] 18833 b.resetWithControl(BlockARMNE, cc) 18834 return true 18835 } 18836 // match: (If (LessThan cc) yes no) 18837 // result: (LT cc yes no) 18838 for b.Controls[0].Op == OpARMLessThan { 18839 v_0 := b.Controls[0] 18840 cc := v_0.Args[0] 18841 b.resetWithControl(BlockARMLT, cc) 18842 return true 18843 } 18844 // match: (If (LessThanU cc) yes no) 18845 // result: (ULT cc yes no) 18846 for b.Controls[0].Op == OpARMLessThanU { 18847 v_0 := b.Controls[0] 18848 cc := v_0.Args[0] 18849 b.resetWithControl(BlockARMULT, cc) 18850 return true 18851 } 18852 // match: (If (LessEqual cc) yes no) 18853 // result: (LE cc yes no) 18854 for b.Controls[0].Op == OpARMLessEqual { 18855 v_0 := b.Controls[0] 18856 cc := v_0.Args[0] 18857 b.resetWithControl(BlockARMLE, cc) 18858 return true 18859 } 18860 // match: (If (LessEqualU cc) yes no) 18861 // result: (ULE cc yes no) 18862 for b.Controls[0].Op == OpARMLessEqualU { 18863 v_0 := b.Controls[0] 18864 cc := v_0.Args[0] 18865 b.resetWithControl(BlockARMULE, cc) 18866 return true 18867 } 18868 // match: (If (GreaterThan cc) yes no) 18869 // result: (GT cc yes no) 18870 for b.Controls[0].Op == OpARMGreaterThan { 18871 v_0 := b.Controls[0] 18872 cc := v_0.Args[0] 18873 b.resetWithControl(BlockARMGT, cc) 18874 return true 18875 } 18876 // match: (If (GreaterThanU cc) yes no) 18877 // result: (UGT cc yes no) 18878 for b.Controls[0].Op == OpARMGreaterThanU { 18879 v_0 := b.Controls[0] 18880 cc := v_0.Args[0] 18881 b.resetWithControl(BlockARMUGT, cc) 18882 return true 18883 } 18884 // match: (If (GreaterEqual cc) yes no) 18885 // result: (GE cc yes no) 18886 for b.Controls[0].Op == OpARMGreaterEqual { 18887 v_0 := b.Controls[0] 18888 cc := v_0.Args[0] 18889 b.resetWithControl(BlockARMGE, cc) 18890 return true 18891 } 18892 // match: (If (GreaterEqualU cc) yes no) 18893 // result: (UGE cc yes no) 18894 for b.Controls[0].Op == OpARMGreaterEqualU { 18895 v_0 := b.Controls[0] 18896 cc := v_0.Args[0] 18897 b.resetWithControl(BlockARMUGE, cc) 18898 return true 18899 } 18900 // match: (If cond yes no) 18901 // result: (NE (CMPconst [0] cond) yes no) 18902 for { 18903 cond := b.Controls[0] 18904 v0 := b.NewValue0(cond.Pos, OpARMCMPconst, types.TypeFlags) 18905 v0.AuxInt = int32ToAuxInt(0) 18906 v0.AddArg(cond) 18907 b.resetWithControl(BlockARMNE, v0) 18908 return true 18909 } 18910 case BlockARMLE: 18911 // match: (LE (FlagConstant [fc]) yes no) 18912 // cond: fc.le() 18913 // result: (First yes no) 18914 for b.Controls[0].Op == OpARMFlagConstant { 18915 v_0 := b.Controls[0] 18916 fc := auxIntToFlagConstant(v_0.AuxInt) 18917 if !(fc.le()) { 18918 break 18919 } 18920 b.Reset(BlockFirst) 18921 return true 18922 } 18923 // match: (LE (FlagConstant [fc]) yes no) 18924 // cond: !fc.le() 18925 // result: (First no yes) 18926 for b.Controls[0].Op == OpARMFlagConstant { 18927 v_0 := b.Controls[0] 18928 fc := auxIntToFlagConstant(v_0.AuxInt) 18929 if !(!fc.le()) { 18930 break 18931 } 18932 b.Reset(BlockFirst) 18933 b.swapSuccessors() 18934 return true 18935 } 18936 // match: (LE (InvertFlags cmp) yes no) 18937 // result: (GE cmp yes no) 18938 for b.Controls[0].Op == OpARMInvertFlags { 18939 v_0 := b.Controls[0] 18940 cmp := v_0.Args[0] 18941 b.resetWithControl(BlockARMGE, cmp) 18942 return true 18943 } 18944 // match: (LE (CMPconst [0] l:(SUB x y)) yes no) 18945 // cond: l.Uses==1 18946 // result: (LEnoov (CMP x y) yes no) 18947 for b.Controls[0].Op == OpARMCMPconst { 18948 v_0 := b.Controls[0] 18949 if auxIntToInt32(v_0.AuxInt) != 0 { 18950 break 18951 } 18952 l := v_0.Args[0] 18953 if l.Op != OpARMSUB { 18954 break 18955 } 18956 y := l.Args[1] 18957 x := l.Args[0] 18958 if !(l.Uses == 1) { 18959 break 18960 } 18961 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 18962 v0.AddArg2(x, y) 18963 b.resetWithControl(BlockARMLEnoov, v0) 18964 return true 18965 } 18966 // match: (LE (CMPconst [0] l:(MULS x y a)) yes no) 18967 // cond: l.Uses==1 18968 // result: (LEnoov (CMP a (MUL <x.Type> x y)) yes no) 18969 for b.Controls[0].Op == OpARMCMPconst { 18970 v_0 := b.Controls[0] 18971 if auxIntToInt32(v_0.AuxInt) != 0 { 18972 break 18973 } 18974 l := v_0.Args[0] 18975 if l.Op != OpARMMULS { 18976 break 18977 } 18978 a := l.Args[2] 18979 x := l.Args[0] 18980 y := l.Args[1] 18981 if !(l.Uses == 1) { 18982 break 18983 } 18984 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 18985 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 18986 v1.AddArg2(x, y) 18987 v0.AddArg2(a, v1) 18988 b.resetWithControl(BlockARMLEnoov, v0) 18989 return true 18990 } 18991 // match: (LE (CMPconst [0] l:(SUBconst [c] x)) yes no) 18992 // cond: l.Uses==1 18993 // result: (LEnoov (CMPconst [c] x) yes no) 18994 for b.Controls[0].Op == OpARMCMPconst { 18995 v_0 := b.Controls[0] 18996 if auxIntToInt32(v_0.AuxInt) != 0 { 18997 break 18998 } 18999 l := v_0.Args[0] 19000 if l.Op != OpARMSUBconst { 19001 break 19002 } 19003 c := auxIntToInt32(l.AuxInt) 19004 x := l.Args[0] 19005 if !(l.Uses == 1) { 19006 break 19007 } 19008 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 19009 v0.AuxInt = int32ToAuxInt(c) 19010 v0.AddArg(x) 19011 b.resetWithControl(BlockARMLEnoov, v0) 19012 return true 19013 } 19014 // match: (LE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 19015 // cond: l.Uses==1 19016 // result: (LEnoov (CMPshiftLL x y [c]) yes no) 19017 for b.Controls[0].Op == OpARMCMPconst { 19018 v_0 := b.Controls[0] 19019 if auxIntToInt32(v_0.AuxInt) != 0 { 19020 break 19021 } 19022 l := v_0.Args[0] 19023 if l.Op != OpARMSUBshiftLL { 19024 break 19025 } 19026 c := auxIntToInt32(l.AuxInt) 19027 y := l.Args[1] 19028 x := l.Args[0] 19029 if !(l.Uses == 1) { 19030 break 19031 } 19032 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 19033 v0.AuxInt = int32ToAuxInt(c) 19034 v0.AddArg2(x, y) 19035 b.resetWithControl(BlockARMLEnoov, v0) 19036 return true 19037 } 19038 // match: (LE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 19039 // cond: l.Uses==1 19040 // result: (LEnoov (CMPshiftRL x y [c]) yes no) 19041 for b.Controls[0].Op == OpARMCMPconst { 19042 v_0 := b.Controls[0] 19043 if auxIntToInt32(v_0.AuxInt) != 0 { 19044 break 19045 } 19046 l := v_0.Args[0] 19047 if l.Op != OpARMSUBshiftRL { 19048 break 19049 } 19050 c := auxIntToInt32(l.AuxInt) 19051 y := l.Args[1] 19052 x := l.Args[0] 19053 if !(l.Uses == 1) { 19054 break 19055 } 19056 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 19057 v0.AuxInt = int32ToAuxInt(c) 19058 v0.AddArg2(x, y) 19059 b.resetWithControl(BlockARMLEnoov, v0) 19060 return true 19061 } 19062 // match: (LE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 19063 // cond: l.Uses==1 19064 // result: (LEnoov (CMPshiftRA x y [c]) yes no) 19065 for b.Controls[0].Op == OpARMCMPconst { 19066 v_0 := b.Controls[0] 19067 if auxIntToInt32(v_0.AuxInt) != 0 { 19068 break 19069 } 19070 l := v_0.Args[0] 19071 if l.Op != OpARMSUBshiftRA { 19072 break 19073 } 19074 c := auxIntToInt32(l.AuxInt) 19075 y := l.Args[1] 19076 x := l.Args[0] 19077 if !(l.Uses == 1) { 19078 break 19079 } 19080 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 19081 v0.AuxInt = int32ToAuxInt(c) 19082 v0.AddArg2(x, y) 19083 b.resetWithControl(BlockARMLEnoov, v0) 19084 return true 19085 } 19086 // match: (LE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 19087 // cond: l.Uses==1 19088 // result: (LEnoov (CMPshiftLLreg x y z) yes no) 19089 for b.Controls[0].Op == OpARMCMPconst { 19090 v_0 := b.Controls[0] 19091 if auxIntToInt32(v_0.AuxInt) != 0 { 19092 break 19093 } 19094 l := v_0.Args[0] 19095 if l.Op != OpARMSUBshiftLLreg { 19096 break 19097 } 19098 z := l.Args[2] 19099 x := l.Args[0] 19100 y := l.Args[1] 19101 if !(l.Uses == 1) { 19102 break 19103 } 19104 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 19105 v0.AddArg3(x, y, z) 19106 b.resetWithControl(BlockARMLEnoov, v0) 19107 return true 19108 } 19109 // match: (LE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 19110 // cond: l.Uses==1 19111 // result: (LEnoov (CMPshiftRLreg x y z) yes no) 19112 for b.Controls[0].Op == OpARMCMPconst { 19113 v_0 := b.Controls[0] 19114 if auxIntToInt32(v_0.AuxInt) != 0 { 19115 break 19116 } 19117 l := v_0.Args[0] 19118 if l.Op != OpARMSUBshiftRLreg { 19119 break 19120 } 19121 z := l.Args[2] 19122 x := l.Args[0] 19123 y := l.Args[1] 19124 if !(l.Uses == 1) { 19125 break 19126 } 19127 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 19128 v0.AddArg3(x, y, z) 19129 b.resetWithControl(BlockARMLEnoov, v0) 19130 return true 19131 } 19132 // match: (LE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 19133 // cond: l.Uses==1 19134 // result: (LEnoov (CMPshiftRAreg x y z) yes no) 19135 for b.Controls[0].Op == OpARMCMPconst { 19136 v_0 := b.Controls[0] 19137 if auxIntToInt32(v_0.AuxInt) != 0 { 19138 break 19139 } 19140 l := v_0.Args[0] 19141 if l.Op != OpARMSUBshiftRAreg { 19142 break 19143 } 19144 z := l.Args[2] 19145 x := l.Args[0] 19146 y := l.Args[1] 19147 if !(l.Uses == 1) { 19148 break 19149 } 19150 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 19151 v0.AddArg3(x, y, z) 19152 b.resetWithControl(BlockARMLEnoov, v0) 19153 return true 19154 } 19155 // match: (LE (CMPconst [0] l:(ADD x y)) yes no) 19156 // cond: l.Uses==1 19157 // result: (LEnoov (CMN x y) yes no) 19158 for b.Controls[0].Op == OpARMCMPconst { 19159 v_0 := b.Controls[0] 19160 if auxIntToInt32(v_0.AuxInt) != 0 { 19161 break 19162 } 19163 l := v_0.Args[0] 19164 if l.Op != OpARMADD { 19165 break 19166 } 19167 _ = l.Args[1] 19168 l_0 := l.Args[0] 19169 l_1 := l.Args[1] 19170 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 19171 x := l_0 19172 y := l_1 19173 if !(l.Uses == 1) { 19174 continue 19175 } 19176 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 19177 v0.AddArg2(x, y) 19178 b.resetWithControl(BlockARMLEnoov, v0) 19179 return true 19180 } 19181 break 19182 } 19183 // match: (LE (CMPconst [0] l:(MULA x y a)) yes no) 19184 // cond: l.Uses==1 19185 // result: (LEnoov (CMN a (MUL <x.Type> x y)) yes no) 19186 for b.Controls[0].Op == OpARMCMPconst { 19187 v_0 := b.Controls[0] 19188 if auxIntToInt32(v_0.AuxInt) != 0 { 19189 break 19190 } 19191 l := v_0.Args[0] 19192 if l.Op != OpARMMULA { 19193 break 19194 } 19195 a := l.Args[2] 19196 x := l.Args[0] 19197 y := l.Args[1] 19198 if !(l.Uses == 1) { 19199 break 19200 } 19201 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 19202 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 19203 v1.AddArg2(x, y) 19204 v0.AddArg2(a, v1) 19205 b.resetWithControl(BlockARMLEnoov, v0) 19206 return true 19207 } 19208 // match: (LE (CMPconst [0] l:(ADDconst [c] x)) yes no) 19209 // cond: l.Uses==1 19210 // result: (LEnoov (CMNconst [c] x) yes no) 19211 for b.Controls[0].Op == OpARMCMPconst { 19212 v_0 := b.Controls[0] 19213 if auxIntToInt32(v_0.AuxInt) != 0 { 19214 break 19215 } 19216 l := v_0.Args[0] 19217 if l.Op != OpARMADDconst { 19218 break 19219 } 19220 c := auxIntToInt32(l.AuxInt) 19221 x := l.Args[0] 19222 if !(l.Uses == 1) { 19223 break 19224 } 19225 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 19226 v0.AuxInt = int32ToAuxInt(c) 19227 v0.AddArg(x) 19228 b.resetWithControl(BlockARMLEnoov, v0) 19229 return true 19230 } 19231 // match: (LE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 19232 // cond: l.Uses==1 19233 // result: (LEnoov (CMNshiftLL x y [c]) yes no) 19234 for b.Controls[0].Op == OpARMCMPconst { 19235 v_0 := b.Controls[0] 19236 if auxIntToInt32(v_0.AuxInt) != 0 { 19237 break 19238 } 19239 l := v_0.Args[0] 19240 if l.Op != OpARMADDshiftLL { 19241 break 19242 } 19243 c := auxIntToInt32(l.AuxInt) 19244 y := l.Args[1] 19245 x := l.Args[0] 19246 if !(l.Uses == 1) { 19247 break 19248 } 19249 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 19250 v0.AuxInt = int32ToAuxInt(c) 19251 v0.AddArg2(x, y) 19252 b.resetWithControl(BlockARMLEnoov, v0) 19253 return true 19254 } 19255 // match: (LE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 19256 // cond: l.Uses==1 19257 // result: (LEnoov (CMNshiftRL x y [c]) yes no) 19258 for b.Controls[0].Op == OpARMCMPconst { 19259 v_0 := b.Controls[0] 19260 if auxIntToInt32(v_0.AuxInt) != 0 { 19261 break 19262 } 19263 l := v_0.Args[0] 19264 if l.Op != OpARMADDshiftRL { 19265 break 19266 } 19267 c := auxIntToInt32(l.AuxInt) 19268 y := l.Args[1] 19269 x := l.Args[0] 19270 if !(l.Uses == 1) { 19271 break 19272 } 19273 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 19274 v0.AuxInt = int32ToAuxInt(c) 19275 v0.AddArg2(x, y) 19276 b.resetWithControl(BlockARMLEnoov, v0) 19277 return true 19278 } 19279 // match: (LE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 19280 // cond: l.Uses==1 19281 // result: (LEnoov (CMNshiftRA x y [c]) yes no) 19282 for b.Controls[0].Op == OpARMCMPconst { 19283 v_0 := b.Controls[0] 19284 if auxIntToInt32(v_0.AuxInt) != 0 { 19285 break 19286 } 19287 l := v_0.Args[0] 19288 if l.Op != OpARMADDshiftRA { 19289 break 19290 } 19291 c := auxIntToInt32(l.AuxInt) 19292 y := l.Args[1] 19293 x := l.Args[0] 19294 if !(l.Uses == 1) { 19295 break 19296 } 19297 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 19298 v0.AuxInt = int32ToAuxInt(c) 19299 v0.AddArg2(x, y) 19300 b.resetWithControl(BlockARMLEnoov, v0) 19301 return true 19302 } 19303 // match: (LE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 19304 // cond: l.Uses==1 19305 // result: (LEnoov (CMNshiftLLreg x y z) yes no) 19306 for b.Controls[0].Op == OpARMCMPconst { 19307 v_0 := b.Controls[0] 19308 if auxIntToInt32(v_0.AuxInt) != 0 { 19309 break 19310 } 19311 l := v_0.Args[0] 19312 if l.Op != OpARMADDshiftLLreg { 19313 break 19314 } 19315 z := l.Args[2] 19316 x := l.Args[0] 19317 y := l.Args[1] 19318 if !(l.Uses == 1) { 19319 break 19320 } 19321 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 19322 v0.AddArg3(x, y, z) 19323 b.resetWithControl(BlockARMLEnoov, v0) 19324 return true 19325 } 19326 // match: (LE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 19327 // cond: l.Uses==1 19328 // result: (LEnoov (CMNshiftRLreg x y z) yes no) 19329 for b.Controls[0].Op == OpARMCMPconst { 19330 v_0 := b.Controls[0] 19331 if auxIntToInt32(v_0.AuxInt) != 0 { 19332 break 19333 } 19334 l := v_0.Args[0] 19335 if l.Op != OpARMADDshiftRLreg { 19336 break 19337 } 19338 z := l.Args[2] 19339 x := l.Args[0] 19340 y := l.Args[1] 19341 if !(l.Uses == 1) { 19342 break 19343 } 19344 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 19345 v0.AddArg3(x, y, z) 19346 b.resetWithControl(BlockARMLEnoov, v0) 19347 return true 19348 } 19349 // match: (LE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 19350 // cond: l.Uses==1 19351 // result: (LEnoov (CMNshiftRAreg x y z) yes no) 19352 for b.Controls[0].Op == OpARMCMPconst { 19353 v_0 := b.Controls[0] 19354 if auxIntToInt32(v_0.AuxInt) != 0 { 19355 break 19356 } 19357 l := v_0.Args[0] 19358 if l.Op != OpARMADDshiftRAreg { 19359 break 19360 } 19361 z := l.Args[2] 19362 x := l.Args[0] 19363 y := l.Args[1] 19364 if !(l.Uses == 1) { 19365 break 19366 } 19367 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 19368 v0.AddArg3(x, y, z) 19369 b.resetWithControl(BlockARMLEnoov, v0) 19370 return true 19371 } 19372 // match: (LE (CMPconst [0] l:(AND x y)) yes no) 19373 // cond: l.Uses==1 19374 // result: (LEnoov (TST x y) yes no) 19375 for b.Controls[0].Op == OpARMCMPconst { 19376 v_0 := b.Controls[0] 19377 if auxIntToInt32(v_0.AuxInt) != 0 { 19378 break 19379 } 19380 l := v_0.Args[0] 19381 if l.Op != OpARMAND { 19382 break 19383 } 19384 _ = l.Args[1] 19385 l_0 := l.Args[0] 19386 l_1 := l.Args[1] 19387 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 19388 x := l_0 19389 y := l_1 19390 if !(l.Uses == 1) { 19391 continue 19392 } 19393 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 19394 v0.AddArg2(x, y) 19395 b.resetWithControl(BlockARMLEnoov, v0) 19396 return true 19397 } 19398 break 19399 } 19400 // match: (LE (CMPconst [0] l:(ANDconst [c] x)) yes no) 19401 // cond: l.Uses==1 19402 // result: (LEnoov (TSTconst [c] x) yes no) 19403 for b.Controls[0].Op == OpARMCMPconst { 19404 v_0 := b.Controls[0] 19405 if auxIntToInt32(v_0.AuxInt) != 0 { 19406 break 19407 } 19408 l := v_0.Args[0] 19409 if l.Op != OpARMANDconst { 19410 break 19411 } 19412 c := auxIntToInt32(l.AuxInt) 19413 x := l.Args[0] 19414 if !(l.Uses == 1) { 19415 break 19416 } 19417 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 19418 v0.AuxInt = int32ToAuxInt(c) 19419 v0.AddArg(x) 19420 b.resetWithControl(BlockARMLEnoov, v0) 19421 return true 19422 } 19423 // match: (LE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 19424 // cond: l.Uses==1 19425 // result: (LEnoov (TSTshiftLL x y [c]) yes no) 19426 for b.Controls[0].Op == OpARMCMPconst { 19427 v_0 := b.Controls[0] 19428 if auxIntToInt32(v_0.AuxInt) != 0 { 19429 break 19430 } 19431 l := v_0.Args[0] 19432 if l.Op != OpARMANDshiftLL { 19433 break 19434 } 19435 c := auxIntToInt32(l.AuxInt) 19436 y := l.Args[1] 19437 x := l.Args[0] 19438 if !(l.Uses == 1) { 19439 break 19440 } 19441 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 19442 v0.AuxInt = int32ToAuxInt(c) 19443 v0.AddArg2(x, y) 19444 b.resetWithControl(BlockARMLEnoov, v0) 19445 return true 19446 } 19447 // match: (LE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 19448 // cond: l.Uses==1 19449 // result: (LEnoov (TSTshiftRL x y [c]) yes no) 19450 for b.Controls[0].Op == OpARMCMPconst { 19451 v_0 := b.Controls[0] 19452 if auxIntToInt32(v_0.AuxInt) != 0 { 19453 break 19454 } 19455 l := v_0.Args[0] 19456 if l.Op != OpARMANDshiftRL { 19457 break 19458 } 19459 c := auxIntToInt32(l.AuxInt) 19460 y := l.Args[1] 19461 x := l.Args[0] 19462 if !(l.Uses == 1) { 19463 break 19464 } 19465 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 19466 v0.AuxInt = int32ToAuxInt(c) 19467 v0.AddArg2(x, y) 19468 b.resetWithControl(BlockARMLEnoov, v0) 19469 return true 19470 } 19471 // match: (LE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 19472 // cond: l.Uses==1 19473 // result: (LEnoov (TSTshiftRA x y [c]) yes no) 19474 for b.Controls[0].Op == OpARMCMPconst { 19475 v_0 := b.Controls[0] 19476 if auxIntToInt32(v_0.AuxInt) != 0 { 19477 break 19478 } 19479 l := v_0.Args[0] 19480 if l.Op != OpARMANDshiftRA { 19481 break 19482 } 19483 c := auxIntToInt32(l.AuxInt) 19484 y := l.Args[1] 19485 x := l.Args[0] 19486 if !(l.Uses == 1) { 19487 break 19488 } 19489 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 19490 v0.AuxInt = int32ToAuxInt(c) 19491 v0.AddArg2(x, y) 19492 b.resetWithControl(BlockARMLEnoov, v0) 19493 return true 19494 } 19495 // match: (LE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 19496 // cond: l.Uses==1 19497 // result: (LEnoov (TSTshiftLLreg x y z) yes no) 19498 for b.Controls[0].Op == OpARMCMPconst { 19499 v_0 := b.Controls[0] 19500 if auxIntToInt32(v_0.AuxInt) != 0 { 19501 break 19502 } 19503 l := v_0.Args[0] 19504 if l.Op != OpARMANDshiftLLreg { 19505 break 19506 } 19507 z := l.Args[2] 19508 x := l.Args[0] 19509 y := l.Args[1] 19510 if !(l.Uses == 1) { 19511 break 19512 } 19513 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 19514 v0.AddArg3(x, y, z) 19515 b.resetWithControl(BlockARMLEnoov, v0) 19516 return true 19517 } 19518 // match: (LE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 19519 // cond: l.Uses==1 19520 // result: (LEnoov (TSTshiftRLreg x y z) yes no) 19521 for b.Controls[0].Op == OpARMCMPconst { 19522 v_0 := b.Controls[0] 19523 if auxIntToInt32(v_0.AuxInt) != 0 { 19524 break 19525 } 19526 l := v_0.Args[0] 19527 if l.Op != OpARMANDshiftRLreg { 19528 break 19529 } 19530 z := l.Args[2] 19531 x := l.Args[0] 19532 y := l.Args[1] 19533 if !(l.Uses == 1) { 19534 break 19535 } 19536 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 19537 v0.AddArg3(x, y, z) 19538 b.resetWithControl(BlockARMLEnoov, v0) 19539 return true 19540 } 19541 // match: (LE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 19542 // cond: l.Uses==1 19543 // result: (LEnoov (TSTshiftRAreg x y z) yes no) 19544 for b.Controls[0].Op == OpARMCMPconst { 19545 v_0 := b.Controls[0] 19546 if auxIntToInt32(v_0.AuxInt) != 0 { 19547 break 19548 } 19549 l := v_0.Args[0] 19550 if l.Op != OpARMANDshiftRAreg { 19551 break 19552 } 19553 z := l.Args[2] 19554 x := l.Args[0] 19555 y := l.Args[1] 19556 if !(l.Uses == 1) { 19557 break 19558 } 19559 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 19560 v0.AddArg3(x, y, z) 19561 b.resetWithControl(BlockARMLEnoov, v0) 19562 return true 19563 } 19564 // match: (LE (CMPconst [0] l:(XOR x y)) yes no) 19565 // cond: l.Uses==1 19566 // result: (LEnoov (TEQ x y) yes no) 19567 for b.Controls[0].Op == OpARMCMPconst { 19568 v_0 := b.Controls[0] 19569 if auxIntToInt32(v_0.AuxInt) != 0 { 19570 break 19571 } 19572 l := v_0.Args[0] 19573 if l.Op != OpARMXOR { 19574 break 19575 } 19576 _ = l.Args[1] 19577 l_0 := l.Args[0] 19578 l_1 := l.Args[1] 19579 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 19580 x := l_0 19581 y := l_1 19582 if !(l.Uses == 1) { 19583 continue 19584 } 19585 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 19586 v0.AddArg2(x, y) 19587 b.resetWithControl(BlockARMLEnoov, v0) 19588 return true 19589 } 19590 break 19591 } 19592 // match: (LE (CMPconst [0] l:(XORconst [c] x)) yes no) 19593 // cond: l.Uses==1 19594 // result: (LEnoov (TEQconst [c] x) yes no) 19595 for b.Controls[0].Op == OpARMCMPconst { 19596 v_0 := b.Controls[0] 19597 if auxIntToInt32(v_0.AuxInt) != 0 { 19598 break 19599 } 19600 l := v_0.Args[0] 19601 if l.Op != OpARMXORconst { 19602 break 19603 } 19604 c := auxIntToInt32(l.AuxInt) 19605 x := l.Args[0] 19606 if !(l.Uses == 1) { 19607 break 19608 } 19609 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 19610 v0.AuxInt = int32ToAuxInt(c) 19611 v0.AddArg(x) 19612 b.resetWithControl(BlockARMLEnoov, v0) 19613 return true 19614 } 19615 // match: (LE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 19616 // cond: l.Uses==1 19617 // result: (LEnoov (TEQshiftLL x y [c]) yes no) 19618 for b.Controls[0].Op == OpARMCMPconst { 19619 v_0 := b.Controls[0] 19620 if auxIntToInt32(v_0.AuxInt) != 0 { 19621 break 19622 } 19623 l := v_0.Args[0] 19624 if l.Op != OpARMXORshiftLL { 19625 break 19626 } 19627 c := auxIntToInt32(l.AuxInt) 19628 y := l.Args[1] 19629 x := l.Args[0] 19630 if !(l.Uses == 1) { 19631 break 19632 } 19633 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 19634 v0.AuxInt = int32ToAuxInt(c) 19635 v0.AddArg2(x, y) 19636 b.resetWithControl(BlockARMLEnoov, v0) 19637 return true 19638 } 19639 // match: (LE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 19640 // cond: l.Uses==1 19641 // result: (LEnoov (TEQshiftRL x y [c]) yes no) 19642 for b.Controls[0].Op == OpARMCMPconst { 19643 v_0 := b.Controls[0] 19644 if auxIntToInt32(v_0.AuxInt) != 0 { 19645 break 19646 } 19647 l := v_0.Args[0] 19648 if l.Op != OpARMXORshiftRL { 19649 break 19650 } 19651 c := auxIntToInt32(l.AuxInt) 19652 y := l.Args[1] 19653 x := l.Args[0] 19654 if !(l.Uses == 1) { 19655 break 19656 } 19657 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 19658 v0.AuxInt = int32ToAuxInt(c) 19659 v0.AddArg2(x, y) 19660 b.resetWithControl(BlockARMLEnoov, v0) 19661 return true 19662 } 19663 // match: (LE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 19664 // cond: l.Uses==1 19665 // result: (LEnoov (TEQshiftRA x y [c]) yes no) 19666 for b.Controls[0].Op == OpARMCMPconst { 19667 v_0 := b.Controls[0] 19668 if auxIntToInt32(v_0.AuxInt) != 0 { 19669 break 19670 } 19671 l := v_0.Args[0] 19672 if l.Op != OpARMXORshiftRA { 19673 break 19674 } 19675 c := auxIntToInt32(l.AuxInt) 19676 y := l.Args[1] 19677 x := l.Args[0] 19678 if !(l.Uses == 1) { 19679 break 19680 } 19681 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 19682 v0.AuxInt = int32ToAuxInt(c) 19683 v0.AddArg2(x, y) 19684 b.resetWithControl(BlockARMLEnoov, v0) 19685 return true 19686 } 19687 // match: (LE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 19688 // cond: l.Uses==1 19689 // result: (LEnoov (TEQshiftLLreg x y z) yes no) 19690 for b.Controls[0].Op == OpARMCMPconst { 19691 v_0 := b.Controls[0] 19692 if auxIntToInt32(v_0.AuxInt) != 0 { 19693 break 19694 } 19695 l := v_0.Args[0] 19696 if l.Op != OpARMXORshiftLLreg { 19697 break 19698 } 19699 z := l.Args[2] 19700 x := l.Args[0] 19701 y := l.Args[1] 19702 if !(l.Uses == 1) { 19703 break 19704 } 19705 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 19706 v0.AddArg3(x, y, z) 19707 b.resetWithControl(BlockARMLEnoov, v0) 19708 return true 19709 } 19710 // match: (LE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 19711 // cond: l.Uses==1 19712 // result: (LEnoov (TEQshiftRLreg x y z) yes no) 19713 for b.Controls[0].Op == OpARMCMPconst { 19714 v_0 := b.Controls[0] 19715 if auxIntToInt32(v_0.AuxInt) != 0 { 19716 break 19717 } 19718 l := v_0.Args[0] 19719 if l.Op != OpARMXORshiftRLreg { 19720 break 19721 } 19722 z := l.Args[2] 19723 x := l.Args[0] 19724 y := l.Args[1] 19725 if !(l.Uses == 1) { 19726 break 19727 } 19728 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 19729 v0.AddArg3(x, y, z) 19730 b.resetWithControl(BlockARMLEnoov, v0) 19731 return true 19732 } 19733 // match: (LE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 19734 // cond: l.Uses==1 19735 // result: (LEnoov (TEQshiftRAreg x y z) yes no) 19736 for b.Controls[0].Op == OpARMCMPconst { 19737 v_0 := b.Controls[0] 19738 if auxIntToInt32(v_0.AuxInt) != 0 { 19739 break 19740 } 19741 l := v_0.Args[0] 19742 if l.Op != OpARMXORshiftRAreg { 19743 break 19744 } 19745 z := l.Args[2] 19746 x := l.Args[0] 19747 y := l.Args[1] 19748 if !(l.Uses == 1) { 19749 break 19750 } 19751 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 19752 v0.AddArg3(x, y, z) 19753 b.resetWithControl(BlockARMLEnoov, v0) 19754 return true 19755 } 19756 case BlockARMLEnoov: 19757 // match: (LEnoov (FlagConstant [fc]) yes no) 19758 // cond: fc.leNoov() 19759 // result: (First yes no) 19760 for b.Controls[0].Op == OpARMFlagConstant { 19761 v_0 := b.Controls[0] 19762 fc := auxIntToFlagConstant(v_0.AuxInt) 19763 if !(fc.leNoov()) { 19764 break 19765 } 19766 b.Reset(BlockFirst) 19767 return true 19768 } 19769 // match: (LEnoov (FlagConstant [fc]) yes no) 19770 // cond: !fc.leNoov() 19771 // result: (First no yes) 19772 for b.Controls[0].Op == OpARMFlagConstant { 19773 v_0 := b.Controls[0] 19774 fc := auxIntToFlagConstant(v_0.AuxInt) 19775 if !(!fc.leNoov()) { 19776 break 19777 } 19778 b.Reset(BlockFirst) 19779 b.swapSuccessors() 19780 return true 19781 } 19782 // match: (LEnoov (InvertFlags cmp) yes no) 19783 // result: (GEnoov cmp yes no) 19784 for b.Controls[0].Op == OpARMInvertFlags { 19785 v_0 := b.Controls[0] 19786 cmp := v_0.Args[0] 19787 b.resetWithControl(BlockARMGEnoov, cmp) 19788 return true 19789 } 19790 case BlockARMLT: 19791 // match: (LT (FlagConstant [fc]) yes no) 19792 // cond: fc.lt() 19793 // result: (First yes no) 19794 for b.Controls[0].Op == OpARMFlagConstant { 19795 v_0 := b.Controls[0] 19796 fc := auxIntToFlagConstant(v_0.AuxInt) 19797 if !(fc.lt()) { 19798 break 19799 } 19800 b.Reset(BlockFirst) 19801 return true 19802 } 19803 // match: (LT (FlagConstant [fc]) yes no) 19804 // cond: !fc.lt() 19805 // result: (First no yes) 19806 for b.Controls[0].Op == OpARMFlagConstant { 19807 v_0 := b.Controls[0] 19808 fc := auxIntToFlagConstant(v_0.AuxInt) 19809 if !(!fc.lt()) { 19810 break 19811 } 19812 b.Reset(BlockFirst) 19813 b.swapSuccessors() 19814 return true 19815 } 19816 // match: (LT (InvertFlags cmp) yes no) 19817 // result: (GT cmp yes no) 19818 for b.Controls[0].Op == OpARMInvertFlags { 19819 v_0 := b.Controls[0] 19820 cmp := v_0.Args[0] 19821 b.resetWithControl(BlockARMGT, cmp) 19822 return true 19823 } 19824 // match: (LT (CMPconst [0] l:(SUB x y)) yes no) 19825 // cond: l.Uses==1 19826 // result: (LTnoov (CMP x y) yes no) 19827 for b.Controls[0].Op == OpARMCMPconst { 19828 v_0 := b.Controls[0] 19829 if auxIntToInt32(v_0.AuxInt) != 0 { 19830 break 19831 } 19832 l := v_0.Args[0] 19833 if l.Op != OpARMSUB { 19834 break 19835 } 19836 y := l.Args[1] 19837 x := l.Args[0] 19838 if !(l.Uses == 1) { 19839 break 19840 } 19841 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 19842 v0.AddArg2(x, y) 19843 b.resetWithControl(BlockARMLTnoov, v0) 19844 return true 19845 } 19846 // match: (LT (CMPconst [0] l:(MULS x y a)) yes no) 19847 // cond: l.Uses==1 19848 // result: (LTnoov (CMP a (MUL <x.Type> x y)) yes no) 19849 for b.Controls[0].Op == OpARMCMPconst { 19850 v_0 := b.Controls[0] 19851 if auxIntToInt32(v_0.AuxInt) != 0 { 19852 break 19853 } 19854 l := v_0.Args[0] 19855 if l.Op != OpARMMULS { 19856 break 19857 } 19858 a := l.Args[2] 19859 x := l.Args[0] 19860 y := l.Args[1] 19861 if !(l.Uses == 1) { 19862 break 19863 } 19864 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 19865 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 19866 v1.AddArg2(x, y) 19867 v0.AddArg2(a, v1) 19868 b.resetWithControl(BlockARMLTnoov, v0) 19869 return true 19870 } 19871 // match: (LT (CMPconst [0] l:(SUBconst [c] x)) yes no) 19872 // cond: l.Uses==1 19873 // result: (LTnoov (CMPconst [c] x) yes no) 19874 for b.Controls[0].Op == OpARMCMPconst { 19875 v_0 := b.Controls[0] 19876 if auxIntToInt32(v_0.AuxInt) != 0 { 19877 break 19878 } 19879 l := v_0.Args[0] 19880 if l.Op != OpARMSUBconst { 19881 break 19882 } 19883 c := auxIntToInt32(l.AuxInt) 19884 x := l.Args[0] 19885 if !(l.Uses == 1) { 19886 break 19887 } 19888 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 19889 v0.AuxInt = int32ToAuxInt(c) 19890 v0.AddArg(x) 19891 b.resetWithControl(BlockARMLTnoov, v0) 19892 return true 19893 } 19894 // match: (LT (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 19895 // cond: l.Uses==1 19896 // result: (LTnoov (CMPshiftLL x y [c]) yes no) 19897 for b.Controls[0].Op == OpARMCMPconst { 19898 v_0 := b.Controls[0] 19899 if auxIntToInt32(v_0.AuxInt) != 0 { 19900 break 19901 } 19902 l := v_0.Args[0] 19903 if l.Op != OpARMSUBshiftLL { 19904 break 19905 } 19906 c := auxIntToInt32(l.AuxInt) 19907 y := l.Args[1] 19908 x := l.Args[0] 19909 if !(l.Uses == 1) { 19910 break 19911 } 19912 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 19913 v0.AuxInt = int32ToAuxInt(c) 19914 v0.AddArg2(x, y) 19915 b.resetWithControl(BlockARMLTnoov, v0) 19916 return true 19917 } 19918 // match: (LT (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 19919 // cond: l.Uses==1 19920 // result: (LTnoov (CMPshiftRL x y [c]) yes no) 19921 for b.Controls[0].Op == OpARMCMPconst { 19922 v_0 := b.Controls[0] 19923 if auxIntToInt32(v_0.AuxInt) != 0 { 19924 break 19925 } 19926 l := v_0.Args[0] 19927 if l.Op != OpARMSUBshiftRL { 19928 break 19929 } 19930 c := auxIntToInt32(l.AuxInt) 19931 y := l.Args[1] 19932 x := l.Args[0] 19933 if !(l.Uses == 1) { 19934 break 19935 } 19936 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 19937 v0.AuxInt = int32ToAuxInt(c) 19938 v0.AddArg2(x, y) 19939 b.resetWithControl(BlockARMLTnoov, v0) 19940 return true 19941 } 19942 // match: (LT (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 19943 // cond: l.Uses==1 19944 // result: (LTnoov (CMPshiftRA x y [c]) yes no) 19945 for b.Controls[0].Op == OpARMCMPconst { 19946 v_0 := b.Controls[0] 19947 if auxIntToInt32(v_0.AuxInt) != 0 { 19948 break 19949 } 19950 l := v_0.Args[0] 19951 if l.Op != OpARMSUBshiftRA { 19952 break 19953 } 19954 c := auxIntToInt32(l.AuxInt) 19955 y := l.Args[1] 19956 x := l.Args[0] 19957 if !(l.Uses == 1) { 19958 break 19959 } 19960 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 19961 v0.AuxInt = int32ToAuxInt(c) 19962 v0.AddArg2(x, y) 19963 b.resetWithControl(BlockARMLTnoov, v0) 19964 return true 19965 } 19966 // match: (LT (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 19967 // cond: l.Uses==1 19968 // result: (LTnoov (CMPshiftLLreg x y z) yes no) 19969 for b.Controls[0].Op == OpARMCMPconst { 19970 v_0 := b.Controls[0] 19971 if auxIntToInt32(v_0.AuxInt) != 0 { 19972 break 19973 } 19974 l := v_0.Args[0] 19975 if l.Op != OpARMSUBshiftLLreg { 19976 break 19977 } 19978 z := l.Args[2] 19979 x := l.Args[0] 19980 y := l.Args[1] 19981 if !(l.Uses == 1) { 19982 break 19983 } 19984 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 19985 v0.AddArg3(x, y, z) 19986 b.resetWithControl(BlockARMLTnoov, v0) 19987 return true 19988 } 19989 // match: (LT (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 19990 // cond: l.Uses==1 19991 // result: (LTnoov (CMPshiftRLreg x y z) yes no) 19992 for b.Controls[0].Op == OpARMCMPconst { 19993 v_0 := b.Controls[0] 19994 if auxIntToInt32(v_0.AuxInt) != 0 { 19995 break 19996 } 19997 l := v_0.Args[0] 19998 if l.Op != OpARMSUBshiftRLreg { 19999 break 20000 } 20001 z := l.Args[2] 20002 x := l.Args[0] 20003 y := l.Args[1] 20004 if !(l.Uses == 1) { 20005 break 20006 } 20007 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 20008 v0.AddArg3(x, y, z) 20009 b.resetWithControl(BlockARMLTnoov, v0) 20010 return true 20011 } 20012 // match: (LT (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 20013 // cond: l.Uses==1 20014 // result: (LTnoov (CMPshiftRAreg x y z) yes no) 20015 for b.Controls[0].Op == OpARMCMPconst { 20016 v_0 := b.Controls[0] 20017 if auxIntToInt32(v_0.AuxInt) != 0 { 20018 break 20019 } 20020 l := v_0.Args[0] 20021 if l.Op != OpARMSUBshiftRAreg { 20022 break 20023 } 20024 z := l.Args[2] 20025 x := l.Args[0] 20026 y := l.Args[1] 20027 if !(l.Uses == 1) { 20028 break 20029 } 20030 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 20031 v0.AddArg3(x, y, z) 20032 b.resetWithControl(BlockARMLTnoov, v0) 20033 return true 20034 } 20035 // match: (LT (CMPconst [0] l:(ADD x y)) yes no) 20036 // cond: l.Uses==1 20037 // result: (LTnoov (CMN x y) yes no) 20038 for b.Controls[0].Op == OpARMCMPconst { 20039 v_0 := b.Controls[0] 20040 if auxIntToInt32(v_0.AuxInt) != 0 { 20041 break 20042 } 20043 l := v_0.Args[0] 20044 if l.Op != OpARMADD { 20045 break 20046 } 20047 _ = l.Args[1] 20048 l_0 := l.Args[0] 20049 l_1 := l.Args[1] 20050 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 20051 x := l_0 20052 y := l_1 20053 if !(l.Uses == 1) { 20054 continue 20055 } 20056 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 20057 v0.AddArg2(x, y) 20058 b.resetWithControl(BlockARMLTnoov, v0) 20059 return true 20060 } 20061 break 20062 } 20063 // match: (LT (CMPconst [0] l:(MULA x y a)) yes no) 20064 // cond: l.Uses==1 20065 // result: (LTnoov (CMN a (MUL <x.Type> x y)) yes no) 20066 for b.Controls[0].Op == OpARMCMPconst { 20067 v_0 := b.Controls[0] 20068 if auxIntToInt32(v_0.AuxInt) != 0 { 20069 break 20070 } 20071 l := v_0.Args[0] 20072 if l.Op != OpARMMULA { 20073 break 20074 } 20075 a := l.Args[2] 20076 x := l.Args[0] 20077 y := l.Args[1] 20078 if !(l.Uses == 1) { 20079 break 20080 } 20081 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 20082 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 20083 v1.AddArg2(x, y) 20084 v0.AddArg2(a, v1) 20085 b.resetWithControl(BlockARMLTnoov, v0) 20086 return true 20087 } 20088 // match: (LT (CMPconst [0] l:(ADDconst [c] x)) yes no) 20089 // cond: l.Uses==1 20090 // result: (LTnoov (CMNconst [c] x) yes no) 20091 for b.Controls[0].Op == OpARMCMPconst { 20092 v_0 := b.Controls[0] 20093 if auxIntToInt32(v_0.AuxInt) != 0 { 20094 break 20095 } 20096 l := v_0.Args[0] 20097 if l.Op != OpARMADDconst { 20098 break 20099 } 20100 c := auxIntToInt32(l.AuxInt) 20101 x := l.Args[0] 20102 if !(l.Uses == 1) { 20103 break 20104 } 20105 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 20106 v0.AuxInt = int32ToAuxInt(c) 20107 v0.AddArg(x) 20108 b.resetWithControl(BlockARMLTnoov, v0) 20109 return true 20110 } 20111 // match: (LT (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 20112 // cond: l.Uses==1 20113 // result: (LTnoov (CMNshiftLL x y [c]) yes no) 20114 for b.Controls[0].Op == OpARMCMPconst { 20115 v_0 := b.Controls[0] 20116 if auxIntToInt32(v_0.AuxInt) != 0 { 20117 break 20118 } 20119 l := v_0.Args[0] 20120 if l.Op != OpARMADDshiftLL { 20121 break 20122 } 20123 c := auxIntToInt32(l.AuxInt) 20124 y := l.Args[1] 20125 x := l.Args[0] 20126 if !(l.Uses == 1) { 20127 break 20128 } 20129 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 20130 v0.AuxInt = int32ToAuxInt(c) 20131 v0.AddArg2(x, y) 20132 b.resetWithControl(BlockARMLTnoov, v0) 20133 return true 20134 } 20135 // match: (LT (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 20136 // cond: l.Uses==1 20137 // result: (LTnoov (CMNshiftRL x y [c]) yes no) 20138 for b.Controls[0].Op == OpARMCMPconst { 20139 v_0 := b.Controls[0] 20140 if auxIntToInt32(v_0.AuxInt) != 0 { 20141 break 20142 } 20143 l := v_0.Args[0] 20144 if l.Op != OpARMADDshiftRL { 20145 break 20146 } 20147 c := auxIntToInt32(l.AuxInt) 20148 y := l.Args[1] 20149 x := l.Args[0] 20150 if !(l.Uses == 1) { 20151 break 20152 } 20153 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 20154 v0.AuxInt = int32ToAuxInt(c) 20155 v0.AddArg2(x, y) 20156 b.resetWithControl(BlockARMLTnoov, v0) 20157 return true 20158 } 20159 // match: (LT (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 20160 // cond: l.Uses==1 20161 // result: (LTnoov (CMNshiftRA x y [c]) yes no) 20162 for b.Controls[0].Op == OpARMCMPconst { 20163 v_0 := b.Controls[0] 20164 if auxIntToInt32(v_0.AuxInt) != 0 { 20165 break 20166 } 20167 l := v_0.Args[0] 20168 if l.Op != OpARMADDshiftRA { 20169 break 20170 } 20171 c := auxIntToInt32(l.AuxInt) 20172 y := l.Args[1] 20173 x := l.Args[0] 20174 if !(l.Uses == 1) { 20175 break 20176 } 20177 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 20178 v0.AuxInt = int32ToAuxInt(c) 20179 v0.AddArg2(x, y) 20180 b.resetWithControl(BlockARMLTnoov, v0) 20181 return true 20182 } 20183 // match: (LT (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 20184 // cond: l.Uses==1 20185 // result: (LTnoov (CMNshiftLLreg x y z) yes no) 20186 for b.Controls[0].Op == OpARMCMPconst { 20187 v_0 := b.Controls[0] 20188 if auxIntToInt32(v_0.AuxInt) != 0 { 20189 break 20190 } 20191 l := v_0.Args[0] 20192 if l.Op != OpARMADDshiftLLreg { 20193 break 20194 } 20195 z := l.Args[2] 20196 x := l.Args[0] 20197 y := l.Args[1] 20198 if !(l.Uses == 1) { 20199 break 20200 } 20201 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 20202 v0.AddArg3(x, y, z) 20203 b.resetWithControl(BlockARMLTnoov, v0) 20204 return true 20205 } 20206 // match: (LT (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 20207 // cond: l.Uses==1 20208 // result: (LTnoov (CMNshiftRLreg x y z) yes no) 20209 for b.Controls[0].Op == OpARMCMPconst { 20210 v_0 := b.Controls[0] 20211 if auxIntToInt32(v_0.AuxInt) != 0 { 20212 break 20213 } 20214 l := v_0.Args[0] 20215 if l.Op != OpARMADDshiftRLreg { 20216 break 20217 } 20218 z := l.Args[2] 20219 x := l.Args[0] 20220 y := l.Args[1] 20221 if !(l.Uses == 1) { 20222 break 20223 } 20224 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 20225 v0.AddArg3(x, y, z) 20226 b.resetWithControl(BlockARMLTnoov, v0) 20227 return true 20228 } 20229 // match: (LT (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 20230 // cond: l.Uses==1 20231 // result: (LTnoov (CMNshiftRAreg x y z) yes no) 20232 for b.Controls[0].Op == OpARMCMPconst { 20233 v_0 := b.Controls[0] 20234 if auxIntToInt32(v_0.AuxInt) != 0 { 20235 break 20236 } 20237 l := v_0.Args[0] 20238 if l.Op != OpARMADDshiftRAreg { 20239 break 20240 } 20241 z := l.Args[2] 20242 x := l.Args[0] 20243 y := l.Args[1] 20244 if !(l.Uses == 1) { 20245 break 20246 } 20247 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 20248 v0.AddArg3(x, y, z) 20249 b.resetWithControl(BlockARMLTnoov, v0) 20250 return true 20251 } 20252 // match: (LT (CMPconst [0] l:(AND x y)) yes no) 20253 // cond: l.Uses==1 20254 // result: (LTnoov (TST x y) yes no) 20255 for b.Controls[0].Op == OpARMCMPconst { 20256 v_0 := b.Controls[0] 20257 if auxIntToInt32(v_0.AuxInt) != 0 { 20258 break 20259 } 20260 l := v_0.Args[0] 20261 if l.Op != OpARMAND { 20262 break 20263 } 20264 _ = l.Args[1] 20265 l_0 := l.Args[0] 20266 l_1 := l.Args[1] 20267 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 20268 x := l_0 20269 y := l_1 20270 if !(l.Uses == 1) { 20271 continue 20272 } 20273 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 20274 v0.AddArg2(x, y) 20275 b.resetWithControl(BlockARMLTnoov, v0) 20276 return true 20277 } 20278 break 20279 } 20280 // match: (LT (CMPconst [0] l:(ANDconst [c] x)) yes no) 20281 // cond: l.Uses==1 20282 // result: (LTnoov (TSTconst [c] x) yes no) 20283 for b.Controls[0].Op == OpARMCMPconst { 20284 v_0 := b.Controls[0] 20285 if auxIntToInt32(v_0.AuxInt) != 0 { 20286 break 20287 } 20288 l := v_0.Args[0] 20289 if l.Op != OpARMANDconst { 20290 break 20291 } 20292 c := auxIntToInt32(l.AuxInt) 20293 x := l.Args[0] 20294 if !(l.Uses == 1) { 20295 break 20296 } 20297 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 20298 v0.AuxInt = int32ToAuxInt(c) 20299 v0.AddArg(x) 20300 b.resetWithControl(BlockARMLTnoov, v0) 20301 return true 20302 } 20303 // match: (LT (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 20304 // cond: l.Uses==1 20305 // result: (LTnoov (TSTshiftLL x y [c]) yes no) 20306 for b.Controls[0].Op == OpARMCMPconst { 20307 v_0 := b.Controls[0] 20308 if auxIntToInt32(v_0.AuxInt) != 0 { 20309 break 20310 } 20311 l := v_0.Args[0] 20312 if l.Op != OpARMANDshiftLL { 20313 break 20314 } 20315 c := auxIntToInt32(l.AuxInt) 20316 y := l.Args[1] 20317 x := l.Args[0] 20318 if !(l.Uses == 1) { 20319 break 20320 } 20321 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 20322 v0.AuxInt = int32ToAuxInt(c) 20323 v0.AddArg2(x, y) 20324 b.resetWithControl(BlockARMLTnoov, v0) 20325 return true 20326 } 20327 // match: (LT (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 20328 // cond: l.Uses==1 20329 // result: (LTnoov (TSTshiftRL x y [c]) yes no) 20330 for b.Controls[0].Op == OpARMCMPconst { 20331 v_0 := b.Controls[0] 20332 if auxIntToInt32(v_0.AuxInt) != 0 { 20333 break 20334 } 20335 l := v_0.Args[0] 20336 if l.Op != OpARMANDshiftRL { 20337 break 20338 } 20339 c := auxIntToInt32(l.AuxInt) 20340 y := l.Args[1] 20341 x := l.Args[0] 20342 if !(l.Uses == 1) { 20343 break 20344 } 20345 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 20346 v0.AuxInt = int32ToAuxInt(c) 20347 v0.AddArg2(x, y) 20348 b.resetWithControl(BlockARMLTnoov, v0) 20349 return true 20350 } 20351 // match: (LT (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 20352 // cond: l.Uses==1 20353 // result: (LTnoov (TSTshiftRA x y [c]) yes no) 20354 for b.Controls[0].Op == OpARMCMPconst { 20355 v_0 := b.Controls[0] 20356 if auxIntToInt32(v_0.AuxInt) != 0 { 20357 break 20358 } 20359 l := v_0.Args[0] 20360 if l.Op != OpARMANDshiftRA { 20361 break 20362 } 20363 c := auxIntToInt32(l.AuxInt) 20364 y := l.Args[1] 20365 x := l.Args[0] 20366 if !(l.Uses == 1) { 20367 break 20368 } 20369 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 20370 v0.AuxInt = int32ToAuxInt(c) 20371 v0.AddArg2(x, y) 20372 b.resetWithControl(BlockARMLTnoov, v0) 20373 return true 20374 } 20375 // match: (LT (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 20376 // cond: l.Uses==1 20377 // result: (LTnoov (TSTshiftLLreg x y z) yes no) 20378 for b.Controls[0].Op == OpARMCMPconst { 20379 v_0 := b.Controls[0] 20380 if auxIntToInt32(v_0.AuxInt) != 0 { 20381 break 20382 } 20383 l := v_0.Args[0] 20384 if l.Op != OpARMANDshiftLLreg { 20385 break 20386 } 20387 z := l.Args[2] 20388 x := l.Args[0] 20389 y := l.Args[1] 20390 if !(l.Uses == 1) { 20391 break 20392 } 20393 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 20394 v0.AddArg3(x, y, z) 20395 b.resetWithControl(BlockARMLTnoov, v0) 20396 return true 20397 } 20398 // match: (LT (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 20399 // cond: l.Uses==1 20400 // result: (LTnoov (TSTshiftRLreg x y z) yes no) 20401 for b.Controls[0].Op == OpARMCMPconst { 20402 v_0 := b.Controls[0] 20403 if auxIntToInt32(v_0.AuxInt) != 0 { 20404 break 20405 } 20406 l := v_0.Args[0] 20407 if l.Op != OpARMANDshiftRLreg { 20408 break 20409 } 20410 z := l.Args[2] 20411 x := l.Args[0] 20412 y := l.Args[1] 20413 if !(l.Uses == 1) { 20414 break 20415 } 20416 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 20417 v0.AddArg3(x, y, z) 20418 b.resetWithControl(BlockARMLTnoov, v0) 20419 return true 20420 } 20421 // match: (LT (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 20422 // cond: l.Uses==1 20423 // result: (LTnoov (TSTshiftRAreg x y z) yes no) 20424 for b.Controls[0].Op == OpARMCMPconst { 20425 v_0 := b.Controls[0] 20426 if auxIntToInt32(v_0.AuxInt) != 0 { 20427 break 20428 } 20429 l := v_0.Args[0] 20430 if l.Op != OpARMANDshiftRAreg { 20431 break 20432 } 20433 z := l.Args[2] 20434 x := l.Args[0] 20435 y := l.Args[1] 20436 if !(l.Uses == 1) { 20437 break 20438 } 20439 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 20440 v0.AddArg3(x, y, z) 20441 b.resetWithControl(BlockARMLTnoov, v0) 20442 return true 20443 } 20444 // match: (LT (CMPconst [0] l:(XOR x y)) yes no) 20445 // cond: l.Uses==1 20446 // result: (LTnoov (TEQ x y) yes no) 20447 for b.Controls[0].Op == OpARMCMPconst { 20448 v_0 := b.Controls[0] 20449 if auxIntToInt32(v_0.AuxInt) != 0 { 20450 break 20451 } 20452 l := v_0.Args[0] 20453 if l.Op != OpARMXOR { 20454 break 20455 } 20456 _ = l.Args[1] 20457 l_0 := l.Args[0] 20458 l_1 := l.Args[1] 20459 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 20460 x := l_0 20461 y := l_1 20462 if !(l.Uses == 1) { 20463 continue 20464 } 20465 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 20466 v0.AddArg2(x, y) 20467 b.resetWithControl(BlockARMLTnoov, v0) 20468 return true 20469 } 20470 break 20471 } 20472 // match: (LT (CMPconst [0] l:(XORconst [c] x)) yes no) 20473 // cond: l.Uses==1 20474 // result: (LTnoov (TEQconst [c] x) yes no) 20475 for b.Controls[0].Op == OpARMCMPconst { 20476 v_0 := b.Controls[0] 20477 if auxIntToInt32(v_0.AuxInt) != 0 { 20478 break 20479 } 20480 l := v_0.Args[0] 20481 if l.Op != OpARMXORconst { 20482 break 20483 } 20484 c := auxIntToInt32(l.AuxInt) 20485 x := l.Args[0] 20486 if !(l.Uses == 1) { 20487 break 20488 } 20489 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 20490 v0.AuxInt = int32ToAuxInt(c) 20491 v0.AddArg(x) 20492 b.resetWithControl(BlockARMLTnoov, v0) 20493 return true 20494 } 20495 // match: (LT (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 20496 // cond: l.Uses==1 20497 // result: (LTnoov (TEQshiftLL x y [c]) yes no) 20498 for b.Controls[0].Op == OpARMCMPconst { 20499 v_0 := b.Controls[0] 20500 if auxIntToInt32(v_0.AuxInt) != 0 { 20501 break 20502 } 20503 l := v_0.Args[0] 20504 if l.Op != OpARMXORshiftLL { 20505 break 20506 } 20507 c := auxIntToInt32(l.AuxInt) 20508 y := l.Args[1] 20509 x := l.Args[0] 20510 if !(l.Uses == 1) { 20511 break 20512 } 20513 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 20514 v0.AuxInt = int32ToAuxInt(c) 20515 v0.AddArg2(x, y) 20516 b.resetWithControl(BlockARMLTnoov, v0) 20517 return true 20518 } 20519 // match: (LT (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 20520 // cond: l.Uses==1 20521 // result: (LTnoov (TEQshiftRL x y [c]) yes no) 20522 for b.Controls[0].Op == OpARMCMPconst { 20523 v_0 := b.Controls[0] 20524 if auxIntToInt32(v_0.AuxInt) != 0 { 20525 break 20526 } 20527 l := v_0.Args[0] 20528 if l.Op != OpARMXORshiftRL { 20529 break 20530 } 20531 c := auxIntToInt32(l.AuxInt) 20532 y := l.Args[1] 20533 x := l.Args[0] 20534 if !(l.Uses == 1) { 20535 break 20536 } 20537 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 20538 v0.AuxInt = int32ToAuxInt(c) 20539 v0.AddArg2(x, y) 20540 b.resetWithControl(BlockARMLTnoov, v0) 20541 return true 20542 } 20543 // match: (LT (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 20544 // cond: l.Uses==1 20545 // result: (LTnoov (TEQshiftRA x y [c]) yes no) 20546 for b.Controls[0].Op == OpARMCMPconst { 20547 v_0 := b.Controls[0] 20548 if auxIntToInt32(v_0.AuxInt) != 0 { 20549 break 20550 } 20551 l := v_0.Args[0] 20552 if l.Op != OpARMXORshiftRA { 20553 break 20554 } 20555 c := auxIntToInt32(l.AuxInt) 20556 y := l.Args[1] 20557 x := l.Args[0] 20558 if !(l.Uses == 1) { 20559 break 20560 } 20561 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 20562 v0.AuxInt = int32ToAuxInt(c) 20563 v0.AddArg2(x, y) 20564 b.resetWithControl(BlockARMLTnoov, v0) 20565 return true 20566 } 20567 // match: (LT (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 20568 // cond: l.Uses==1 20569 // result: (LTnoov (TEQshiftLLreg x y z) yes no) 20570 for b.Controls[0].Op == OpARMCMPconst { 20571 v_0 := b.Controls[0] 20572 if auxIntToInt32(v_0.AuxInt) != 0 { 20573 break 20574 } 20575 l := v_0.Args[0] 20576 if l.Op != OpARMXORshiftLLreg { 20577 break 20578 } 20579 z := l.Args[2] 20580 x := l.Args[0] 20581 y := l.Args[1] 20582 if !(l.Uses == 1) { 20583 break 20584 } 20585 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 20586 v0.AddArg3(x, y, z) 20587 b.resetWithControl(BlockARMLTnoov, v0) 20588 return true 20589 } 20590 // match: (LT (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 20591 // cond: l.Uses==1 20592 // result: (LTnoov (TEQshiftRLreg x y z) yes no) 20593 for b.Controls[0].Op == OpARMCMPconst { 20594 v_0 := b.Controls[0] 20595 if auxIntToInt32(v_0.AuxInt) != 0 { 20596 break 20597 } 20598 l := v_0.Args[0] 20599 if l.Op != OpARMXORshiftRLreg { 20600 break 20601 } 20602 z := l.Args[2] 20603 x := l.Args[0] 20604 y := l.Args[1] 20605 if !(l.Uses == 1) { 20606 break 20607 } 20608 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 20609 v0.AddArg3(x, y, z) 20610 b.resetWithControl(BlockARMLTnoov, v0) 20611 return true 20612 } 20613 // match: (LT (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 20614 // cond: l.Uses==1 20615 // result: (LTnoov (TEQshiftRAreg x y z) yes no) 20616 for b.Controls[0].Op == OpARMCMPconst { 20617 v_0 := b.Controls[0] 20618 if auxIntToInt32(v_0.AuxInt) != 0 { 20619 break 20620 } 20621 l := v_0.Args[0] 20622 if l.Op != OpARMXORshiftRAreg { 20623 break 20624 } 20625 z := l.Args[2] 20626 x := l.Args[0] 20627 y := l.Args[1] 20628 if !(l.Uses == 1) { 20629 break 20630 } 20631 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 20632 v0.AddArg3(x, y, z) 20633 b.resetWithControl(BlockARMLTnoov, v0) 20634 return true 20635 } 20636 case BlockARMLTnoov: 20637 // match: (LTnoov (FlagConstant [fc]) yes no) 20638 // cond: fc.ltNoov() 20639 // result: (First yes no) 20640 for b.Controls[0].Op == OpARMFlagConstant { 20641 v_0 := b.Controls[0] 20642 fc := auxIntToFlagConstant(v_0.AuxInt) 20643 if !(fc.ltNoov()) { 20644 break 20645 } 20646 b.Reset(BlockFirst) 20647 return true 20648 } 20649 // match: (LTnoov (FlagConstant [fc]) yes no) 20650 // cond: !fc.ltNoov() 20651 // result: (First no yes) 20652 for b.Controls[0].Op == OpARMFlagConstant { 20653 v_0 := b.Controls[0] 20654 fc := auxIntToFlagConstant(v_0.AuxInt) 20655 if !(!fc.ltNoov()) { 20656 break 20657 } 20658 b.Reset(BlockFirst) 20659 b.swapSuccessors() 20660 return true 20661 } 20662 // match: (LTnoov (InvertFlags cmp) yes no) 20663 // result: (GTnoov cmp yes no) 20664 for b.Controls[0].Op == OpARMInvertFlags { 20665 v_0 := b.Controls[0] 20666 cmp := v_0.Args[0] 20667 b.resetWithControl(BlockARMGTnoov, cmp) 20668 return true 20669 } 20670 case BlockARMNE: 20671 // match: (NE (CMPconst [0] (Equal cc)) yes no) 20672 // result: (EQ cc yes no) 20673 for b.Controls[0].Op == OpARMCMPconst { 20674 v_0 := b.Controls[0] 20675 if auxIntToInt32(v_0.AuxInt) != 0 { 20676 break 20677 } 20678 v_0_0 := v_0.Args[0] 20679 if v_0_0.Op != OpARMEqual { 20680 break 20681 } 20682 cc := v_0_0.Args[0] 20683 b.resetWithControl(BlockARMEQ, cc) 20684 return true 20685 } 20686 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 20687 // result: (NE cc yes no) 20688 for b.Controls[0].Op == OpARMCMPconst { 20689 v_0 := b.Controls[0] 20690 if auxIntToInt32(v_0.AuxInt) != 0 { 20691 break 20692 } 20693 v_0_0 := v_0.Args[0] 20694 if v_0_0.Op != OpARMNotEqual { 20695 break 20696 } 20697 cc := v_0_0.Args[0] 20698 b.resetWithControl(BlockARMNE, cc) 20699 return true 20700 } 20701 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 20702 // result: (LT cc yes no) 20703 for b.Controls[0].Op == OpARMCMPconst { 20704 v_0 := b.Controls[0] 20705 if auxIntToInt32(v_0.AuxInt) != 0 { 20706 break 20707 } 20708 v_0_0 := v_0.Args[0] 20709 if v_0_0.Op != OpARMLessThan { 20710 break 20711 } 20712 cc := v_0_0.Args[0] 20713 b.resetWithControl(BlockARMLT, cc) 20714 return true 20715 } 20716 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 20717 // result: (ULT cc yes no) 20718 for b.Controls[0].Op == OpARMCMPconst { 20719 v_0 := b.Controls[0] 20720 if auxIntToInt32(v_0.AuxInt) != 0 { 20721 break 20722 } 20723 v_0_0 := v_0.Args[0] 20724 if v_0_0.Op != OpARMLessThanU { 20725 break 20726 } 20727 cc := v_0_0.Args[0] 20728 b.resetWithControl(BlockARMULT, cc) 20729 return true 20730 } 20731 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 20732 // result: (LE cc yes no) 20733 for b.Controls[0].Op == OpARMCMPconst { 20734 v_0 := b.Controls[0] 20735 if auxIntToInt32(v_0.AuxInt) != 0 { 20736 break 20737 } 20738 v_0_0 := v_0.Args[0] 20739 if v_0_0.Op != OpARMLessEqual { 20740 break 20741 } 20742 cc := v_0_0.Args[0] 20743 b.resetWithControl(BlockARMLE, cc) 20744 return true 20745 } 20746 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 20747 // result: (ULE cc yes no) 20748 for b.Controls[0].Op == OpARMCMPconst { 20749 v_0 := b.Controls[0] 20750 if auxIntToInt32(v_0.AuxInt) != 0 { 20751 break 20752 } 20753 v_0_0 := v_0.Args[0] 20754 if v_0_0.Op != OpARMLessEqualU { 20755 break 20756 } 20757 cc := v_0_0.Args[0] 20758 b.resetWithControl(BlockARMULE, cc) 20759 return true 20760 } 20761 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 20762 // result: (GT cc yes no) 20763 for b.Controls[0].Op == OpARMCMPconst { 20764 v_0 := b.Controls[0] 20765 if auxIntToInt32(v_0.AuxInt) != 0 { 20766 break 20767 } 20768 v_0_0 := v_0.Args[0] 20769 if v_0_0.Op != OpARMGreaterThan { 20770 break 20771 } 20772 cc := v_0_0.Args[0] 20773 b.resetWithControl(BlockARMGT, cc) 20774 return true 20775 } 20776 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 20777 // result: (UGT cc yes no) 20778 for b.Controls[0].Op == OpARMCMPconst { 20779 v_0 := b.Controls[0] 20780 if auxIntToInt32(v_0.AuxInt) != 0 { 20781 break 20782 } 20783 v_0_0 := v_0.Args[0] 20784 if v_0_0.Op != OpARMGreaterThanU { 20785 break 20786 } 20787 cc := v_0_0.Args[0] 20788 b.resetWithControl(BlockARMUGT, cc) 20789 return true 20790 } 20791 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 20792 // result: (GE cc yes no) 20793 for b.Controls[0].Op == OpARMCMPconst { 20794 v_0 := b.Controls[0] 20795 if auxIntToInt32(v_0.AuxInt) != 0 { 20796 break 20797 } 20798 v_0_0 := v_0.Args[0] 20799 if v_0_0.Op != OpARMGreaterEqual { 20800 break 20801 } 20802 cc := v_0_0.Args[0] 20803 b.resetWithControl(BlockARMGE, cc) 20804 return true 20805 } 20806 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 20807 // result: (UGE cc yes no) 20808 for b.Controls[0].Op == OpARMCMPconst { 20809 v_0 := b.Controls[0] 20810 if auxIntToInt32(v_0.AuxInt) != 0 { 20811 break 20812 } 20813 v_0_0 := v_0.Args[0] 20814 if v_0_0.Op != OpARMGreaterEqualU { 20815 break 20816 } 20817 cc := v_0_0.Args[0] 20818 b.resetWithControl(BlockARMUGE, cc) 20819 return true 20820 } 20821 // match: (NE (FlagConstant [fc]) yes no) 20822 // cond: fc.ne() 20823 // result: (First yes no) 20824 for b.Controls[0].Op == OpARMFlagConstant { 20825 v_0 := b.Controls[0] 20826 fc := auxIntToFlagConstant(v_0.AuxInt) 20827 if !(fc.ne()) { 20828 break 20829 } 20830 b.Reset(BlockFirst) 20831 return true 20832 } 20833 // match: (NE (FlagConstant [fc]) yes no) 20834 // cond: !fc.ne() 20835 // result: (First no yes) 20836 for b.Controls[0].Op == OpARMFlagConstant { 20837 v_0 := b.Controls[0] 20838 fc := auxIntToFlagConstant(v_0.AuxInt) 20839 if !(!fc.ne()) { 20840 break 20841 } 20842 b.Reset(BlockFirst) 20843 b.swapSuccessors() 20844 return true 20845 } 20846 // match: (NE (InvertFlags cmp) yes no) 20847 // result: (NE cmp yes no) 20848 for b.Controls[0].Op == OpARMInvertFlags { 20849 v_0 := b.Controls[0] 20850 cmp := v_0.Args[0] 20851 b.resetWithControl(BlockARMNE, cmp) 20852 return true 20853 } 20854 // match: (NE (CMP x (RSBconst [0] y))) 20855 // result: (NE (CMN x y)) 20856 for b.Controls[0].Op == OpARMCMP { 20857 v_0 := b.Controls[0] 20858 _ = v_0.Args[1] 20859 x := v_0.Args[0] 20860 v_0_1 := v_0.Args[1] 20861 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 { 20862 break 20863 } 20864 y := v_0_1.Args[0] 20865 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 20866 v0.AddArg2(x, y) 20867 b.resetWithControl(BlockARMNE, v0) 20868 return true 20869 } 20870 // match: (NE (CMN x (RSBconst [0] y))) 20871 // result: (NE (CMP x y)) 20872 for b.Controls[0].Op == OpARMCMN { 20873 v_0 := b.Controls[0] 20874 _ = v_0.Args[1] 20875 v_0_0 := v_0.Args[0] 20876 v_0_1 := v_0.Args[1] 20877 for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 { 20878 x := v_0_0 20879 if v_0_1.Op != OpARMRSBconst || auxIntToInt32(v_0_1.AuxInt) != 0 { 20880 continue 20881 } 20882 y := v_0_1.Args[0] 20883 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 20884 v0.AddArg2(x, y) 20885 b.resetWithControl(BlockARMNE, v0) 20886 return true 20887 } 20888 break 20889 } 20890 // match: (NE (CMPconst [0] l:(SUB x y)) yes no) 20891 // cond: l.Uses==1 20892 // result: (NE (CMP x y) yes no) 20893 for b.Controls[0].Op == OpARMCMPconst { 20894 v_0 := b.Controls[0] 20895 if auxIntToInt32(v_0.AuxInt) != 0 { 20896 break 20897 } 20898 l := v_0.Args[0] 20899 if l.Op != OpARMSUB { 20900 break 20901 } 20902 y := l.Args[1] 20903 x := l.Args[0] 20904 if !(l.Uses == 1) { 20905 break 20906 } 20907 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 20908 v0.AddArg2(x, y) 20909 b.resetWithControl(BlockARMNE, v0) 20910 return true 20911 } 20912 // match: (NE (CMPconst [0] l:(MULS x y a)) yes no) 20913 // cond: l.Uses==1 20914 // result: (NE (CMP a (MUL <x.Type> x y)) yes no) 20915 for b.Controls[0].Op == OpARMCMPconst { 20916 v_0 := b.Controls[0] 20917 if auxIntToInt32(v_0.AuxInt) != 0 { 20918 break 20919 } 20920 l := v_0.Args[0] 20921 if l.Op != OpARMMULS { 20922 break 20923 } 20924 a := l.Args[2] 20925 x := l.Args[0] 20926 y := l.Args[1] 20927 if !(l.Uses == 1) { 20928 break 20929 } 20930 v0 := b.NewValue0(v_0.Pos, OpARMCMP, types.TypeFlags) 20931 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 20932 v1.AddArg2(x, y) 20933 v0.AddArg2(a, v1) 20934 b.resetWithControl(BlockARMNE, v0) 20935 return true 20936 } 20937 // match: (NE (CMPconst [0] l:(SUBconst [c] x)) yes no) 20938 // cond: l.Uses==1 20939 // result: (NE (CMPconst [c] x) yes no) 20940 for b.Controls[0].Op == OpARMCMPconst { 20941 v_0 := b.Controls[0] 20942 if auxIntToInt32(v_0.AuxInt) != 0 { 20943 break 20944 } 20945 l := v_0.Args[0] 20946 if l.Op != OpARMSUBconst { 20947 break 20948 } 20949 c := auxIntToInt32(l.AuxInt) 20950 x := l.Args[0] 20951 if !(l.Uses == 1) { 20952 break 20953 } 20954 v0 := b.NewValue0(v_0.Pos, OpARMCMPconst, types.TypeFlags) 20955 v0.AuxInt = int32ToAuxInt(c) 20956 v0.AddArg(x) 20957 b.resetWithControl(BlockARMNE, v0) 20958 return true 20959 } 20960 // match: (NE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 20961 // cond: l.Uses==1 20962 // result: (NE (CMPshiftLL x y [c]) yes no) 20963 for b.Controls[0].Op == OpARMCMPconst { 20964 v_0 := b.Controls[0] 20965 if auxIntToInt32(v_0.AuxInt) != 0 { 20966 break 20967 } 20968 l := v_0.Args[0] 20969 if l.Op != OpARMSUBshiftLL { 20970 break 20971 } 20972 c := auxIntToInt32(l.AuxInt) 20973 y := l.Args[1] 20974 x := l.Args[0] 20975 if !(l.Uses == 1) { 20976 break 20977 } 20978 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLL, types.TypeFlags) 20979 v0.AuxInt = int32ToAuxInt(c) 20980 v0.AddArg2(x, y) 20981 b.resetWithControl(BlockARMNE, v0) 20982 return true 20983 } 20984 // match: (NE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 20985 // cond: l.Uses==1 20986 // result: (NE (CMPshiftRL x y [c]) yes no) 20987 for b.Controls[0].Op == OpARMCMPconst { 20988 v_0 := b.Controls[0] 20989 if auxIntToInt32(v_0.AuxInt) != 0 { 20990 break 20991 } 20992 l := v_0.Args[0] 20993 if l.Op != OpARMSUBshiftRL { 20994 break 20995 } 20996 c := auxIntToInt32(l.AuxInt) 20997 y := l.Args[1] 20998 x := l.Args[0] 20999 if !(l.Uses == 1) { 21000 break 21001 } 21002 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRL, types.TypeFlags) 21003 v0.AuxInt = int32ToAuxInt(c) 21004 v0.AddArg2(x, y) 21005 b.resetWithControl(BlockARMNE, v0) 21006 return true 21007 } 21008 // match: (NE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 21009 // cond: l.Uses==1 21010 // result: (NE (CMPshiftRA x y [c]) yes no) 21011 for b.Controls[0].Op == OpARMCMPconst { 21012 v_0 := b.Controls[0] 21013 if auxIntToInt32(v_0.AuxInt) != 0 { 21014 break 21015 } 21016 l := v_0.Args[0] 21017 if l.Op != OpARMSUBshiftRA { 21018 break 21019 } 21020 c := auxIntToInt32(l.AuxInt) 21021 y := l.Args[1] 21022 x := l.Args[0] 21023 if !(l.Uses == 1) { 21024 break 21025 } 21026 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRA, types.TypeFlags) 21027 v0.AuxInt = int32ToAuxInt(c) 21028 v0.AddArg2(x, y) 21029 b.resetWithControl(BlockARMNE, v0) 21030 return true 21031 } 21032 // match: (NE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 21033 // cond: l.Uses==1 21034 // result: (NE (CMPshiftLLreg x y z) yes no) 21035 for b.Controls[0].Op == OpARMCMPconst { 21036 v_0 := b.Controls[0] 21037 if auxIntToInt32(v_0.AuxInt) != 0 { 21038 break 21039 } 21040 l := v_0.Args[0] 21041 if l.Op != OpARMSUBshiftLLreg { 21042 break 21043 } 21044 z := l.Args[2] 21045 x := l.Args[0] 21046 y := l.Args[1] 21047 if !(l.Uses == 1) { 21048 break 21049 } 21050 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 21051 v0.AddArg3(x, y, z) 21052 b.resetWithControl(BlockARMNE, v0) 21053 return true 21054 } 21055 // match: (NE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 21056 // cond: l.Uses==1 21057 // result: (NE (CMPshiftRLreg x y z) yes no) 21058 for b.Controls[0].Op == OpARMCMPconst { 21059 v_0 := b.Controls[0] 21060 if auxIntToInt32(v_0.AuxInt) != 0 { 21061 break 21062 } 21063 l := v_0.Args[0] 21064 if l.Op != OpARMSUBshiftRLreg { 21065 break 21066 } 21067 z := l.Args[2] 21068 x := l.Args[0] 21069 y := l.Args[1] 21070 if !(l.Uses == 1) { 21071 break 21072 } 21073 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 21074 v0.AddArg3(x, y, z) 21075 b.resetWithControl(BlockARMNE, v0) 21076 return true 21077 } 21078 // match: (NE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 21079 // cond: l.Uses==1 21080 // result: (NE (CMPshiftRAreg x y z) yes no) 21081 for b.Controls[0].Op == OpARMCMPconst { 21082 v_0 := b.Controls[0] 21083 if auxIntToInt32(v_0.AuxInt) != 0 { 21084 break 21085 } 21086 l := v_0.Args[0] 21087 if l.Op != OpARMSUBshiftRAreg { 21088 break 21089 } 21090 z := l.Args[2] 21091 x := l.Args[0] 21092 y := l.Args[1] 21093 if !(l.Uses == 1) { 21094 break 21095 } 21096 v0 := b.NewValue0(v_0.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 21097 v0.AddArg3(x, y, z) 21098 b.resetWithControl(BlockARMNE, v0) 21099 return true 21100 } 21101 // match: (NE (CMPconst [0] l:(ADD x y)) yes no) 21102 // cond: l.Uses==1 21103 // result: (NE (CMN x y) yes no) 21104 for b.Controls[0].Op == OpARMCMPconst { 21105 v_0 := b.Controls[0] 21106 if auxIntToInt32(v_0.AuxInt) != 0 { 21107 break 21108 } 21109 l := v_0.Args[0] 21110 if l.Op != OpARMADD { 21111 break 21112 } 21113 _ = l.Args[1] 21114 l_0 := l.Args[0] 21115 l_1 := l.Args[1] 21116 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 21117 x := l_0 21118 y := l_1 21119 if !(l.Uses == 1) { 21120 continue 21121 } 21122 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 21123 v0.AddArg2(x, y) 21124 b.resetWithControl(BlockARMNE, v0) 21125 return true 21126 } 21127 break 21128 } 21129 // match: (NE (CMPconst [0] l:(MULA x y a)) yes no) 21130 // cond: l.Uses==1 21131 // result: (NE (CMN a (MUL <x.Type> x y)) yes no) 21132 for b.Controls[0].Op == OpARMCMPconst { 21133 v_0 := b.Controls[0] 21134 if auxIntToInt32(v_0.AuxInt) != 0 { 21135 break 21136 } 21137 l := v_0.Args[0] 21138 if l.Op != OpARMMULA { 21139 break 21140 } 21141 a := l.Args[2] 21142 x := l.Args[0] 21143 y := l.Args[1] 21144 if !(l.Uses == 1) { 21145 break 21146 } 21147 v0 := b.NewValue0(v_0.Pos, OpARMCMN, types.TypeFlags) 21148 v1 := b.NewValue0(v_0.Pos, OpARMMUL, x.Type) 21149 v1.AddArg2(x, y) 21150 v0.AddArg2(a, v1) 21151 b.resetWithControl(BlockARMNE, v0) 21152 return true 21153 } 21154 // match: (NE (CMPconst [0] l:(ADDconst [c] x)) yes no) 21155 // cond: l.Uses==1 21156 // result: (NE (CMNconst [c] x) yes no) 21157 for b.Controls[0].Op == OpARMCMPconst { 21158 v_0 := b.Controls[0] 21159 if auxIntToInt32(v_0.AuxInt) != 0 { 21160 break 21161 } 21162 l := v_0.Args[0] 21163 if l.Op != OpARMADDconst { 21164 break 21165 } 21166 c := auxIntToInt32(l.AuxInt) 21167 x := l.Args[0] 21168 if !(l.Uses == 1) { 21169 break 21170 } 21171 v0 := b.NewValue0(v_0.Pos, OpARMCMNconst, types.TypeFlags) 21172 v0.AuxInt = int32ToAuxInt(c) 21173 v0.AddArg(x) 21174 b.resetWithControl(BlockARMNE, v0) 21175 return true 21176 } 21177 // match: (NE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 21178 // cond: l.Uses==1 21179 // result: (NE (CMNshiftLL x y [c]) yes no) 21180 for b.Controls[0].Op == OpARMCMPconst { 21181 v_0 := b.Controls[0] 21182 if auxIntToInt32(v_0.AuxInt) != 0 { 21183 break 21184 } 21185 l := v_0.Args[0] 21186 if l.Op != OpARMADDshiftLL { 21187 break 21188 } 21189 c := auxIntToInt32(l.AuxInt) 21190 y := l.Args[1] 21191 x := l.Args[0] 21192 if !(l.Uses == 1) { 21193 break 21194 } 21195 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLL, types.TypeFlags) 21196 v0.AuxInt = int32ToAuxInt(c) 21197 v0.AddArg2(x, y) 21198 b.resetWithControl(BlockARMNE, v0) 21199 return true 21200 } 21201 // match: (NE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 21202 // cond: l.Uses==1 21203 // result: (NE (CMNshiftRL x y [c]) yes no) 21204 for b.Controls[0].Op == OpARMCMPconst { 21205 v_0 := b.Controls[0] 21206 if auxIntToInt32(v_0.AuxInt) != 0 { 21207 break 21208 } 21209 l := v_0.Args[0] 21210 if l.Op != OpARMADDshiftRL { 21211 break 21212 } 21213 c := auxIntToInt32(l.AuxInt) 21214 y := l.Args[1] 21215 x := l.Args[0] 21216 if !(l.Uses == 1) { 21217 break 21218 } 21219 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRL, types.TypeFlags) 21220 v0.AuxInt = int32ToAuxInt(c) 21221 v0.AddArg2(x, y) 21222 b.resetWithControl(BlockARMNE, v0) 21223 return true 21224 } 21225 // match: (NE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 21226 // cond: l.Uses==1 21227 // result: (NE (CMNshiftRA x y [c]) yes no) 21228 for b.Controls[0].Op == OpARMCMPconst { 21229 v_0 := b.Controls[0] 21230 if auxIntToInt32(v_0.AuxInt) != 0 { 21231 break 21232 } 21233 l := v_0.Args[0] 21234 if l.Op != OpARMADDshiftRA { 21235 break 21236 } 21237 c := auxIntToInt32(l.AuxInt) 21238 y := l.Args[1] 21239 x := l.Args[0] 21240 if !(l.Uses == 1) { 21241 break 21242 } 21243 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRA, types.TypeFlags) 21244 v0.AuxInt = int32ToAuxInt(c) 21245 v0.AddArg2(x, y) 21246 b.resetWithControl(BlockARMNE, v0) 21247 return true 21248 } 21249 // match: (NE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 21250 // cond: l.Uses==1 21251 // result: (NE (CMNshiftLLreg x y z) yes no) 21252 for b.Controls[0].Op == OpARMCMPconst { 21253 v_0 := b.Controls[0] 21254 if auxIntToInt32(v_0.AuxInt) != 0 { 21255 break 21256 } 21257 l := v_0.Args[0] 21258 if l.Op != OpARMADDshiftLLreg { 21259 break 21260 } 21261 z := l.Args[2] 21262 x := l.Args[0] 21263 y := l.Args[1] 21264 if !(l.Uses == 1) { 21265 break 21266 } 21267 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 21268 v0.AddArg3(x, y, z) 21269 b.resetWithControl(BlockARMNE, v0) 21270 return true 21271 } 21272 // match: (NE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 21273 // cond: l.Uses==1 21274 // result: (NE (CMNshiftRLreg x y z) yes no) 21275 for b.Controls[0].Op == OpARMCMPconst { 21276 v_0 := b.Controls[0] 21277 if auxIntToInt32(v_0.AuxInt) != 0 { 21278 break 21279 } 21280 l := v_0.Args[0] 21281 if l.Op != OpARMADDshiftRLreg { 21282 break 21283 } 21284 z := l.Args[2] 21285 x := l.Args[0] 21286 y := l.Args[1] 21287 if !(l.Uses == 1) { 21288 break 21289 } 21290 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 21291 v0.AddArg3(x, y, z) 21292 b.resetWithControl(BlockARMNE, v0) 21293 return true 21294 } 21295 // match: (NE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 21296 // cond: l.Uses==1 21297 // result: (NE (CMNshiftRAreg x y z) yes no) 21298 for b.Controls[0].Op == OpARMCMPconst { 21299 v_0 := b.Controls[0] 21300 if auxIntToInt32(v_0.AuxInt) != 0 { 21301 break 21302 } 21303 l := v_0.Args[0] 21304 if l.Op != OpARMADDshiftRAreg { 21305 break 21306 } 21307 z := l.Args[2] 21308 x := l.Args[0] 21309 y := l.Args[1] 21310 if !(l.Uses == 1) { 21311 break 21312 } 21313 v0 := b.NewValue0(v_0.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 21314 v0.AddArg3(x, y, z) 21315 b.resetWithControl(BlockARMNE, v0) 21316 return true 21317 } 21318 // match: (NE (CMPconst [0] l:(AND x y)) yes no) 21319 // cond: l.Uses==1 21320 // result: (NE (TST x y) yes no) 21321 for b.Controls[0].Op == OpARMCMPconst { 21322 v_0 := b.Controls[0] 21323 if auxIntToInt32(v_0.AuxInt) != 0 { 21324 break 21325 } 21326 l := v_0.Args[0] 21327 if l.Op != OpARMAND { 21328 break 21329 } 21330 _ = l.Args[1] 21331 l_0 := l.Args[0] 21332 l_1 := l.Args[1] 21333 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 21334 x := l_0 21335 y := l_1 21336 if !(l.Uses == 1) { 21337 continue 21338 } 21339 v0 := b.NewValue0(v_0.Pos, OpARMTST, types.TypeFlags) 21340 v0.AddArg2(x, y) 21341 b.resetWithControl(BlockARMNE, v0) 21342 return true 21343 } 21344 break 21345 } 21346 // match: (NE (CMPconst [0] l:(ANDconst [c] x)) yes no) 21347 // cond: l.Uses==1 21348 // result: (NE (TSTconst [c] x) yes no) 21349 for b.Controls[0].Op == OpARMCMPconst { 21350 v_0 := b.Controls[0] 21351 if auxIntToInt32(v_0.AuxInt) != 0 { 21352 break 21353 } 21354 l := v_0.Args[0] 21355 if l.Op != OpARMANDconst { 21356 break 21357 } 21358 c := auxIntToInt32(l.AuxInt) 21359 x := l.Args[0] 21360 if !(l.Uses == 1) { 21361 break 21362 } 21363 v0 := b.NewValue0(v_0.Pos, OpARMTSTconst, types.TypeFlags) 21364 v0.AuxInt = int32ToAuxInt(c) 21365 v0.AddArg(x) 21366 b.resetWithControl(BlockARMNE, v0) 21367 return true 21368 } 21369 // match: (NE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 21370 // cond: l.Uses==1 21371 // result: (NE (TSTshiftLL x y [c]) yes no) 21372 for b.Controls[0].Op == OpARMCMPconst { 21373 v_0 := b.Controls[0] 21374 if auxIntToInt32(v_0.AuxInt) != 0 { 21375 break 21376 } 21377 l := v_0.Args[0] 21378 if l.Op != OpARMANDshiftLL { 21379 break 21380 } 21381 c := auxIntToInt32(l.AuxInt) 21382 y := l.Args[1] 21383 x := l.Args[0] 21384 if !(l.Uses == 1) { 21385 break 21386 } 21387 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLL, types.TypeFlags) 21388 v0.AuxInt = int32ToAuxInt(c) 21389 v0.AddArg2(x, y) 21390 b.resetWithControl(BlockARMNE, v0) 21391 return true 21392 } 21393 // match: (NE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 21394 // cond: l.Uses==1 21395 // result: (NE (TSTshiftRL x y [c]) yes no) 21396 for b.Controls[0].Op == OpARMCMPconst { 21397 v_0 := b.Controls[0] 21398 if auxIntToInt32(v_0.AuxInt) != 0 { 21399 break 21400 } 21401 l := v_0.Args[0] 21402 if l.Op != OpARMANDshiftRL { 21403 break 21404 } 21405 c := auxIntToInt32(l.AuxInt) 21406 y := l.Args[1] 21407 x := l.Args[0] 21408 if !(l.Uses == 1) { 21409 break 21410 } 21411 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRL, types.TypeFlags) 21412 v0.AuxInt = int32ToAuxInt(c) 21413 v0.AddArg2(x, y) 21414 b.resetWithControl(BlockARMNE, v0) 21415 return true 21416 } 21417 // match: (NE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 21418 // cond: l.Uses==1 21419 // result: (NE (TSTshiftRA x y [c]) yes no) 21420 for b.Controls[0].Op == OpARMCMPconst { 21421 v_0 := b.Controls[0] 21422 if auxIntToInt32(v_0.AuxInt) != 0 { 21423 break 21424 } 21425 l := v_0.Args[0] 21426 if l.Op != OpARMANDshiftRA { 21427 break 21428 } 21429 c := auxIntToInt32(l.AuxInt) 21430 y := l.Args[1] 21431 x := l.Args[0] 21432 if !(l.Uses == 1) { 21433 break 21434 } 21435 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRA, types.TypeFlags) 21436 v0.AuxInt = int32ToAuxInt(c) 21437 v0.AddArg2(x, y) 21438 b.resetWithControl(BlockARMNE, v0) 21439 return true 21440 } 21441 // match: (NE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 21442 // cond: l.Uses==1 21443 // result: (NE (TSTshiftLLreg x y z) yes no) 21444 for b.Controls[0].Op == OpARMCMPconst { 21445 v_0 := b.Controls[0] 21446 if auxIntToInt32(v_0.AuxInt) != 0 { 21447 break 21448 } 21449 l := v_0.Args[0] 21450 if l.Op != OpARMANDshiftLLreg { 21451 break 21452 } 21453 z := l.Args[2] 21454 x := l.Args[0] 21455 y := l.Args[1] 21456 if !(l.Uses == 1) { 21457 break 21458 } 21459 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 21460 v0.AddArg3(x, y, z) 21461 b.resetWithControl(BlockARMNE, v0) 21462 return true 21463 } 21464 // match: (NE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 21465 // cond: l.Uses==1 21466 // result: (NE (TSTshiftRLreg x y z) yes no) 21467 for b.Controls[0].Op == OpARMCMPconst { 21468 v_0 := b.Controls[0] 21469 if auxIntToInt32(v_0.AuxInt) != 0 { 21470 break 21471 } 21472 l := v_0.Args[0] 21473 if l.Op != OpARMANDshiftRLreg { 21474 break 21475 } 21476 z := l.Args[2] 21477 x := l.Args[0] 21478 y := l.Args[1] 21479 if !(l.Uses == 1) { 21480 break 21481 } 21482 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 21483 v0.AddArg3(x, y, z) 21484 b.resetWithControl(BlockARMNE, v0) 21485 return true 21486 } 21487 // match: (NE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 21488 // cond: l.Uses==1 21489 // result: (NE (TSTshiftRAreg x y z) yes no) 21490 for b.Controls[0].Op == OpARMCMPconst { 21491 v_0 := b.Controls[0] 21492 if auxIntToInt32(v_0.AuxInt) != 0 { 21493 break 21494 } 21495 l := v_0.Args[0] 21496 if l.Op != OpARMANDshiftRAreg { 21497 break 21498 } 21499 z := l.Args[2] 21500 x := l.Args[0] 21501 y := l.Args[1] 21502 if !(l.Uses == 1) { 21503 break 21504 } 21505 v0 := b.NewValue0(v_0.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 21506 v0.AddArg3(x, y, z) 21507 b.resetWithControl(BlockARMNE, v0) 21508 return true 21509 } 21510 // match: (NE (CMPconst [0] l:(XOR x y)) yes no) 21511 // cond: l.Uses==1 21512 // result: (NE (TEQ x y) yes no) 21513 for b.Controls[0].Op == OpARMCMPconst { 21514 v_0 := b.Controls[0] 21515 if auxIntToInt32(v_0.AuxInt) != 0 { 21516 break 21517 } 21518 l := v_0.Args[0] 21519 if l.Op != OpARMXOR { 21520 break 21521 } 21522 _ = l.Args[1] 21523 l_0 := l.Args[0] 21524 l_1 := l.Args[1] 21525 for _i0 := 0; _i0 <= 1; _i0, l_0, l_1 = _i0+1, l_1, l_0 { 21526 x := l_0 21527 y := l_1 21528 if !(l.Uses == 1) { 21529 continue 21530 } 21531 v0 := b.NewValue0(v_0.Pos, OpARMTEQ, types.TypeFlags) 21532 v0.AddArg2(x, y) 21533 b.resetWithControl(BlockARMNE, v0) 21534 return true 21535 } 21536 break 21537 } 21538 // match: (NE (CMPconst [0] l:(XORconst [c] x)) yes no) 21539 // cond: l.Uses==1 21540 // result: (NE (TEQconst [c] x) yes no) 21541 for b.Controls[0].Op == OpARMCMPconst { 21542 v_0 := b.Controls[0] 21543 if auxIntToInt32(v_0.AuxInt) != 0 { 21544 break 21545 } 21546 l := v_0.Args[0] 21547 if l.Op != OpARMXORconst { 21548 break 21549 } 21550 c := auxIntToInt32(l.AuxInt) 21551 x := l.Args[0] 21552 if !(l.Uses == 1) { 21553 break 21554 } 21555 v0 := b.NewValue0(v_0.Pos, OpARMTEQconst, types.TypeFlags) 21556 v0.AuxInt = int32ToAuxInt(c) 21557 v0.AddArg(x) 21558 b.resetWithControl(BlockARMNE, v0) 21559 return true 21560 } 21561 // match: (NE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 21562 // cond: l.Uses==1 21563 // result: (NE (TEQshiftLL x y [c]) yes no) 21564 for b.Controls[0].Op == OpARMCMPconst { 21565 v_0 := b.Controls[0] 21566 if auxIntToInt32(v_0.AuxInt) != 0 { 21567 break 21568 } 21569 l := v_0.Args[0] 21570 if l.Op != OpARMXORshiftLL { 21571 break 21572 } 21573 c := auxIntToInt32(l.AuxInt) 21574 y := l.Args[1] 21575 x := l.Args[0] 21576 if !(l.Uses == 1) { 21577 break 21578 } 21579 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLL, types.TypeFlags) 21580 v0.AuxInt = int32ToAuxInt(c) 21581 v0.AddArg2(x, y) 21582 b.resetWithControl(BlockARMNE, v0) 21583 return true 21584 } 21585 // match: (NE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 21586 // cond: l.Uses==1 21587 // result: (NE (TEQshiftRL x y [c]) yes no) 21588 for b.Controls[0].Op == OpARMCMPconst { 21589 v_0 := b.Controls[0] 21590 if auxIntToInt32(v_0.AuxInt) != 0 { 21591 break 21592 } 21593 l := v_0.Args[0] 21594 if l.Op != OpARMXORshiftRL { 21595 break 21596 } 21597 c := auxIntToInt32(l.AuxInt) 21598 y := l.Args[1] 21599 x := l.Args[0] 21600 if !(l.Uses == 1) { 21601 break 21602 } 21603 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRL, types.TypeFlags) 21604 v0.AuxInt = int32ToAuxInt(c) 21605 v0.AddArg2(x, y) 21606 b.resetWithControl(BlockARMNE, v0) 21607 return true 21608 } 21609 // match: (NE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 21610 // cond: l.Uses==1 21611 // result: (NE (TEQshiftRA x y [c]) yes no) 21612 for b.Controls[0].Op == OpARMCMPconst { 21613 v_0 := b.Controls[0] 21614 if auxIntToInt32(v_0.AuxInt) != 0 { 21615 break 21616 } 21617 l := v_0.Args[0] 21618 if l.Op != OpARMXORshiftRA { 21619 break 21620 } 21621 c := auxIntToInt32(l.AuxInt) 21622 y := l.Args[1] 21623 x := l.Args[0] 21624 if !(l.Uses == 1) { 21625 break 21626 } 21627 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRA, types.TypeFlags) 21628 v0.AuxInt = int32ToAuxInt(c) 21629 v0.AddArg2(x, y) 21630 b.resetWithControl(BlockARMNE, v0) 21631 return true 21632 } 21633 // match: (NE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 21634 // cond: l.Uses==1 21635 // result: (NE (TEQshiftLLreg x y z) yes no) 21636 for b.Controls[0].Op == OpARMCMPconst { 21637 v_0 := b.Controls[0] 21638 if auxIntToInt32(v_0.AuxInt) != 0 { 21639 break 21640 } 21641 l := v_0.Args[0] 21642 if l.Op != OpARMXORshiftLLreg { 21643 break 21644 } 21645 z := l.Args[2] 21646 x := l.Args[0] 21647 y := l.Args[1] 21648 if !(l.Uses == 1) { 21649 break 21650 } 21651 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 21652 v0.AddArg3(x, y, z) 21653 b.resetWithControl(BlockARMNE, v0) 21654 return true 21655 } 21656 // match: (NE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 21657 // cond: l.Uses==1 21658 // result: (NE (TEQshiftRLreg x y z) yes no) 21659 for b.Controls[0].Op == OpARMCMPconst { 21660 v_0 := b.Controls[0] 21661 if auxIntToInt32(v_0.AuxInt) != 0 { 21662 break 21663 } 21664 l := v_0.Args[0] 21665 if l.Op != OpARMXORshiftRLreg { 21666 break 21667 } 21668 z := l.Args[2] 21669 x := l.Args[0] 21670 y := l.Args[1] 21671 if !(l.Uses == 1) { 21672 break 21673 } 21674 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 21675 v0.AddArg3(x, y, z) 21676 b.resetWithControl(BlockARMNE, v0) 21677 return true 21678 } 21679 // match: (NE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 21680 // cond: l.Uses==1 21681 // result: (NE (TEQshiftRAreg x y z) yes no) 21682 for b.Controls[0].Op == OpARMCMPconst { 21683 v_0 := b.Controls[0] 21684 if auxIntToInt32(v_0.AuxInt) != 0 { 21685 break 21686 } 21687 l := v_0.Args[0] 21688 if l.Op != OpARMXORshiftRAreg { 21689 break 21690 } 21691 z := l.Args[2] 21692 x := l.Args[0] 21693 y := l.Args[1] 21694 if !(l.Uses == 1) { 21695 break 21696 } 21697 v0 := b.NewValue0(v_0.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 21698 v0.AddArg3(x, y, z) 21699 b.resetWithControl(BlockARMNE, v0) 21700 return true 21701 } 21702 case BlockARMUGE: 21703 // match: (UGE (FlagConstant [fc]) yes no) 21704 // cond: fc.uge() 21705 // result: (First yes no) 21706 for b.Controls[0].Op == OpARMFlagConstant { 21707 v_0 := b.Controls[0] 21708 fc := auxIntToFlagConstant(v_0.AuxInt) 21709 if !(fc.uge()) { 21710 break 21711 } 21712 b.Reset(BlockFirst) 21713 return true 21714 } 21715 // match: (UGE (FlagConstant [fc]) yes no) 21716 // cond: !fc.uge() 21717 // result: (First no yes) 21718 for b.Controls[0].Op == OpARMFlagConstant { 21719 v_0 := b.Controls[0] 21720 fc := auxIntToFlagConstant(v_0.AuxInt) 21721 if !(!fc.uge()) { 21722 break 21723 } 21724 b.Reset(BlockFirst) 21725 b.swapSuccessors() 21726 return true 21727 } 21728 // match: (UGE (InvertFlags cmp) yes no) 21729 // result: (ULE cmp yes no) 21730 for b.Controls[0].Op == OpARMInvertFlags { 21731 v_0 := b.Controls[0] 21732 cmp := v_0.Args[0] 21733 b.resetWithControl(BlockARMULE, cmp) 21734 return true 21735 } 21736 case BlockARMUGT: 21737 // match: (UGT (FlagConstant [fc]) yes no) 21738 // cond: fc.ugt() 21739 // result: (First yes no) 21740 for b.Controls[0].Op == OpARMFlagConstant { 21741 v_0 := b.Controls[0] 21742 fc := auxIntToFlagConstant(v_0.AuxInt) 21743 if !(fc.ugt()) { 21744 break 21745 } 21746 b.Reset(BlockFirst) 21747 return true 21748 } 21749 // match: (UGT (FlagConstant [fc]) yes no) 21750 // cond: !fc.ugt() 21751 // result: (First no yes) 21752 for b.Controls[0].Op == OpARMFlagConstant { 21753 v_0 := b.Controls[0] 21754 fc := auxIntToFlagConstant(v_0.AuxInt) 21755 if !(!fc.ugt()) { 21756 break 21757 } 21758 b.Reset(BlockFirst) 21759 b.swapSuccessors() 21760 return true 21761 } 21762 // match: (UGT (InvertFlags cmp) yes no) 21763 // result: (ULT cmp yes no) 21764 for b.Controls[0].Op == OpARMInvertFlags { 21765 v_0 := b.Controls[0] 21766 cmp := v_0.Args[0] 21767 b.resetWithControl(BlockARMULT, cmp) 21768 return true 21769 } 21770 case BlockARMULE: 21771 // match: (ULE (FlagConstant [fc]) yes no) 21772 // cond: fc.ule() 21773 // result: (First yes no) 21774 for b.Controls[0].Op == OpARMFlagConstant { 21775 v_0 := b.Controls[0] 21776 fc := auxIntToFlagConstant(v_0.AuxInt) 21777 if !(fc.ule()) { 21778 break 21779 } 21780 b.Reset(BlockFirst) 21781 return true 21782 } 21783 // match: (ULE (FlagConstant [fc]) yes no) 21784 // cond: !fc.ule() 21785 // result: (First no yes) 21786 for b.Controls[0].Op == OpARMFlagConstant { 21787 v_0 := b.Controls[0] 21788 fc := auxIntToFlagConstant(v_0.AuxInt) 21789 if !(!fc.ule()) { 21790 break 21791 } 21792 b.Reset(BlockFirst) 21793 b.swapSuccessors() 21794 return true 21795 } 21796 // match: (ULE (InvertFlags cmp) yes no) 21797 // result: (UGE cmp yes no) 21798 for b.Controls[0].Op == OpARMInvertFlags { 21799 v_0 := b.Controls[0] 21800 cmp := v_0.Args[0] 21801 b.resetWithControl(BlockARMUGE, cmp) 21802 return true 21803 } 21804 case BlockARMULT: 21805 // match: (ULT (FlagConstant [fc]) yes no) 21806 // cond: fc.ult() 21807 // result: (First yes no) 21808 for b.Controls[0].Op == OpARMFlagConstant { 21809 v_0 := b.Controls[0] 21810 fc := auxIntToFlagConstant(v_0.AuxInt) 21811 if !(fc.ult()) { 21812 break 21813 } 21814 b.Reset(BlockFirst) 21815 return true 21816 } 21817 // match: (ULT (FlagConstant [fc]) yes no) 21818 // cond: !fc.ult() 21819 // result: (First no yes) 21820 for b.Controls[0].Op == OpARMFlagConstant { 21821 v_0 := b.Controls[0] 21822 fc := auxIntToFlagConstant(v_0.AuxInt) 21823 if !(!fc.ult()) { 21824 break 21825 } 21826 b.Reset(BlockFirst) 21827 b.swapSuccessors() 21828 return true 21829 } 21830 // match: (ULT (InvertFlags cmp) yes no) 21831 // result: (UGT cmp yes no) 21832 for b.Controls[0].Op == OpARMInvertFlags { 21833 v_0 := b.Controls[0] 21834 cmp := v_0.Args[0] 21835 b.resetWithControl(BlockARMUGT, cmp) 21836 return true 21837 } 21838 } 21839 return false 21840 }