github.com/tidwall/go@v0.0.0-20170415222209-6694a6888b7d/src/cmd/compile/internal/ssa/rewriteARM.go (about) 1 // Code generated from gen/ARM.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 9 var _ = math.MinInt8 // in case not otherwise used 10 var _ = obj.ANOP // in case not otherwise used 11 func rewriteValueARM(v *Value) bool { 12 switch v.Op { 13 case OpARMADC: 14 return rewriteValueARM_OpARMADC(v) 15 case OpARMADCconst: 16 return rewriteValueARM_OpARMADCconst(v) 17 case OpARMADCshiftLL: 18 return rewriteValueARM_OpARMADCshiftLL(v) 19 case OpARMADCshiftLLreg: 20 return rewriteValueARM_OpARMADCshiftLLreg(v) 21 case OpARMADCshiftRA: 22 return rewriteValueARM_OpARMADCshiftRA(v) 23 case OpARMADCshiftRAreg: 24 return rewriteValueARM_OpARMADCshiftRAreg(v) 25 case OpARMADCshiftRL: 26 return rewriteValueARM_OpARMADCshiftRL(v) 27 case OpARMADCshiftRLreg: 28 return rewriteValueARM_OpARMADCshiftRLreg(v) 29 case OpARMADD: 30 return rewriteValueARM_OpARMADD(v) 31 case OpARMADDS: 32 return rewriteValueARM_OpARMADDS(v) 33 case OpARMADDSshiftLL: 34 return rewriteValueARM_OpARMADDSshiftLL(v) 35 case OpARMADDSshiftLLreg: 36 return rewriteValueARM_OpARMADDSshiftLLreg(v) 37 case OpARMADDSshiftRA: 38 return rewriteValueARM_OpARMADDSshiftRA(v) 39 case OpARMADDSshiftRAreg: 40 return rewriteValueARM_OpARMADDSshiftRAreg(v) 41 case OpARMADDSshiftRL: 42 return rewriteValueARM_OpARMADDSshiftRL(v) 43 case OpARMADDSshiftRLreg: 44 return rewriteValueARM_OpARMADDSshiftRLreg(v) 45 case OpARMADDconst: 46 return rewriteValueARM_OpARMADDconst(v) 47 case OpARMADDshiftLL: 48 return rewriteValueARM_OpARMADDshiftLL(v) 49 case OpARMADDshiftLLreg: 50 return rewriteValueARM_OpARMADDshiftLLreg(v) 51 case OpARMADDshiftRA: 52 return rewriteValueARM_OpARMADDshiftRA(v) 53 case OpARMADDshiftRAreg: 54 return rewriteValueARM_OpARMADDshiftRAreg(v) 55 case OpARMADDshiftRL: 56 return rewriteValueARM_OpARMADDshiftRL(v) 57 case OpARMADDshiftRLreg: 58 return rewriteValueARM_OpARMADDshiftRLreg(v) 59 case OpARMAND: 60 return rewriteValueARM_OpARMAND(v) 61 case OpARMANDconst: 62 return rewriteValueARM_OpARMANDconst(v) 63 case OpARMANDshiftLL: 64 return rewriteValueARM_OpARMANDshiftLL(v) 65 case OpARMANDshiftLLreg: 66 return rewriteValueARM_OpARMANDshiftLLreg(v) 67 case OpARMANDshiftRA: 68 return rewriteValueARM_OpARMANDshiftRA(v) 69 case OpARMANDshiftRAreg: 70 return rewriteValueARM_OpARMANDshiftRAreg(v) 71 case OpARMANDshiftRL: 72 return rewriteValueARM_OpARMANDshiftRL(v) 73 case OpARMANDshiftRLreg: 74 return rewriteValueARM_OpARMANDshiftRLreg(v) 75 case OpARMBIC: 76 return rewriteValueARM_OpARMBIC(v) 77 case OpARMBICconst: 78 return rewriteValueARM_OpARMBICconst(v) 79 case OpARMBICshiftLL: 80 return rewriteValueARM_OpARMBICshiftLL(v) 81 case OpARMBICshiftLLreg: 82 return rewriteValueARM_OpARMBICshiftLLreg(v) 83 case OpARMBICshiftRA: 84 return rewriteValueARM_OpARMBICshiftRA(v) 85 case OpARMBICshiftRAreg: 86 return rewriteValueARM_OpARMBICshiftRAreg(v) 87 case OpARMBICshiftRL: 88 return rewriteValueARM_OpARMBICshiftRL(v) 89 case OpARMBICshiftRLreg: 90 return rewriteValueARM_OpARMBICshiftRLreg(v) 91 case OpARMCMOVWHSconst: 92 return rewriteValueARM_OpARMCMOVWHSconst(v) 93 case OpARMCMOVWLSconst: 94 return rewriteValueARM_OpARMCMOVWLSconst(v) 95 case OpARMCMP: 96 return rewriteValueARM_OpARMCMP(v) 97 case OpARMCMPD: 98 return rewriteValueARM_OpARMCMPD(v) 99 case OpARMCMPF: 100 return rewriteValueARM_OpARMCMPF(v) 101 case OpARMCMPconst: 102 return rewriteValueARM_OpARMCMPconst(v) 103 case OpARMCMPshiftLL: 104 return rewriteValueARM_OpARMCMPshiftLL(v) 105 case OpARMCMPshiftLLreg: 106 return rewriteValueARM_OpARMCMPshiftLLreg(v) 107 case OpARMCMPshiftRA: 108 return rewriteValueARM_OpARMCMPshiftRA(v) 109 case OpARMCMPshiftRAreg: 110 return rewriteValueARM_OpARMCMPshiftRAreg(v) 111 case OpARMCMPshiftRL: 112 return rewriteValueARM_OpARMCMPshiftRL(v) 113 case OpARMCMPshiftRLreg: 114 return rewriteValueARM_OpARMCMPshiftRLreg(v) 115 case OpARMEqual: 116 return rewriteValueARM_OpARMEqual(v) 117 case OpARMGreaterEqual: 118 return rewriteValueARM_OpARMGreaterEqual(v) 119 case OpARMGreaterEqualU: 120 return rewriteValueARM_OpARMGreaterEqualU(v) 121 case OpARMGreaterThan: 122 return rewriteValueARM_OpARMGreaterThan(v) 123 case OpARMGreaterThanU: 124 return rewriteValueARM_OpARMGreaterThanU(v) 125 case OpARMLessEqual: 126 return rewriteValueARM_OpARMLessEqual(v) 127 case OpARMLessEqualU: 128 return rewriteValueARM_OpARMLessEqualU(v) 129 case OpARMLessThan: 130 return rewriteValueARM_OpARMLessThan(v) 131 case OpARMLessThanU: 132 return rewriteValueARM_OpARMLessThanU(v) 133 case OpARMMOVBUload: 134 return rewriteValueARM_OpARMMOVBUload(v) 135 case OpARMMOVBUreg: 136 return rewriteValueARM_OpARMMOVBUreg(v) 137 case OpARMMOVBload: 138 return rewriteValueARM_OpARMMOVBload(v) 139 case OpARMMOVBreg: 140 return rewriteValueARM_OpARMMOVBreg(v) 141 case OpARMMOVBstore: 142 return rewriteValueARM_OpARMMOVBstore(v) 143 case OpARMMOVDload: 144 return rewriteValueARM_OpARMMOVDload(v) 145 case OpARMMOVDstore: 146 return rewriteValueARM_OpARMMOVDstore(v) 147 case OpARMMOVFload: 148 return rewriteValueARM_OpARMMOVFload(v) 149 case OpARMMOVFstore: 150 return rewriteValueARM_OpARMMOVFstore(v) 151 case OpARMMOVHUload: 152 return rewriteValueARM_OpARMMOVHUload(v) 153 case OpARMMOVHUreg: 154 return rewriteValueARM_OpARMMOVHUreg(v) 155 case OpARMMOVHload: 156 return rewriteValueARM_OpARMMOVHload(v) 157 case OpARMMOVHreg: 158 return rewriteValueARM_OpARMMOVHreg(v) 159 case OpARMMOVHstore: 160 return rewriteValueARM_OpARMMOVHstore(v) 161 case OpARMMOVWload: 162 return rewriteValueARM_OpARMMOVWload(v) 163 case OpARMMOVWloadidx: 164 return rewriteValueARM_OpARMMOVWloadidx(v) 165 case OpARMMOVWloadshiftLL: 166 return rewriteValueARM_OpARMMOVWloadshiftLL(v) 167 case OpARMMOVWloadshiftRA: 168 return rewriteValueARM_OpARMMOVWloadshiftRA(v) 169 case OpARMMOVWloadshiftRL: 170 return rewriteValueARM_OpARMMOVWloadshiftRL(v) 171 case OpARMMOVWreg: 172 return rewriteValueARM_OpARMMOVWreg(v) 173 case OpARMMOVWstore: 174 return rewriteValueARM_OpARMMOVWstore(v) 175 case OpARMMOVWstoreidx: 176 return rewriteValueARM_OpARMMOVWstoreidx(v) 177 case OpARMMOVWstoreshiftLL: 178 return rewriteValueARM_OpARMMOVWstoreshiftLL(v) 179 case OpARMMOVWstoreshiftRA: 180 return rewriteValueARM_OpARMMOVWstoreshiftRA(v) 181 case OpARMMOVWstoreshiftRL: 182 return rewriteValueARM_OpARMMOVWstoreshiftRL(v) 183 case OpARMMUL: 184 return rewriteValueARM_OpARMMUL(v) 185 case OpARMMULA: 186 return rewriteValueARM_OpARMMULA(v) 187 case OpARMMVN: 188 return rewriteValueARM_OpARMMVN(v) 189 case OpARMMVNshiftLL: 190 return rewriteValueARM_OpARMMVNshiftLL(v) 191 case OpARMMVNshiftLLreg: 192 return rewriteValueARM_OpARMMVNshiftLLreg(v) 193 case OpARMMVNshiftRA: 194 return rewriteValueARM_OpARMMVNshiftRA(v) 195 case OpARMMVNshiftRAreg: 196 return rewriteValueARM_OpARMMVNshiftRAreg(v) 197 case OpARMMVNshiftRL: 198 return rewriteValueARM_OpARMMVNshiftRL(v) 199 case OpARMMVNshiftRLreg: 200 return rewriteValueARM_OpARMMVNshiftRLreg(v) 201 case OpARMNotEqual: 202 return rewriteValueARM_OpARMNotEqual(v) 203 case OpARMOR: 204 return rewriteValueARM_OpARMOR(v) 205 case OpARMORconst: 206 return rewriteValueARM_OpARMORconst(v) 207 case OpARMORshiftLL: 208 return rewriteValueARM_OpARMORshiftLL(v) 209 case OpARMORshiftLLreg: 210 return rewriteValueARM_OpARMORshiftLLreg(v) 211 case OpARMORshiftRA: 212 return rewriteValueARM_OpARMORshiftRA(v) 213 case OpARMORshiftRAreg: 214 return rewriteValueARM_OpARMORshiftRAreg(v) 215 case OpARMORshiftRL: 216 return rewriteValueARM_OpARMORshiftRL(v) 217 case OpARMORshiftRLreg: 218 return rewriteValueARM_OpARMORshiftRLreg(v) 219 case OpARMRSB: 220 return rewriteValueARM_OpARMRSB(v) 221 case OpARMRSBSshiftLL: 222 return rewriteValueARM_OpARMRSBSshiftLL(v) 223 case OpARMRSBSshiftLLreg: 224 return rewriteValueARM_OpARMRSBSshiftLLreg(v) 225 case OpARMRSBSshiftRA: 226 return rewriteValueARM_OpARMRSBSshiftRA(v) 227 case OpARMRSBSshiftRAreg: 228 return rewriteValueARM_OpARMRSBSshiftRAreg(v) 229 case OpARMRSBSshiftRL: 230 return rewriteValueARM_OpARMRSBSshiftRL(v) 231 case OpARMRSBSshiftRLreg: 232 return rewriteValueARM_OpARMRSBSshiftRLreg(v) 233 case OpARMRSBconst: 234 return rewriteValueARM_OpARMRSBconst(v) 235 case OpARMRSBshiftLL: 236 return rewriteValueARM_OpARMRSBshiftLL(v) 237 case OpARMRSBshiftLLreg: 238 return rewriteValueARM_OpARMRSBshiftLLreg(v) 239 case OpARMRSBshiftRA: 240 return rewriteValueARM_OpARMRSBshiftRA(v) 241 case OpARMRSBshiftRAreg: 242 return rewriteValueARM_OpARMRSBshiftRAreg(v) 243 case OpARMRSBshiftRL: 244 return rewriteValueARM_OpARMRSBshiftRL(v) 245 case OpARMRSBshiftRLreg: 246 return rewriteValueARM_OpARMRSBshiftRLreg(v) 247 case OpARMRSCconst: 248 return rewriteValueARM_OpARMRSCconst(v) 249 case OpARMRSCshiftLL: 250 return rewriteValueARM_OpARMRSCshiftLL(v) 251 case OpARMRSCshiftLLreg: 252 return rewriteValueARM_OpARMRSCshiftLLreg(v) 253 case OpARMRSCshiftRA: 254 return rewriteValueARM_OpARMRSCshiftRA(v) 255 case OpARMRSCshiftRAreg: 256 return rewriteValueARM_OpARMRSCshiftRAreg(v) 257 case OpARMRSCshiftRL: 258 return rewriteValueARM_OpARMRSCshiftRL(v) 259 case OpARMRSCshiftRLreg: 260 return rewriteValueARM_OpARMRSCshiftRLreg(v) 261 case OpARMSBC: 262 return rewriteValueARM_OpARMSBC(v) 263 case OpARMSBCconst: 264 return rewriteValueARM_OpARMSBCconst(v) 265 case OpARMSBCshiftLL: 266 return rewriteValueARM_OpARMSBCshiftLL(v) 267 case OpARMSBCshiftLLreg: 268 return rewriteValueARM_OpARMSBCshiftLLreg(v) 269 case OpARMSBCshiftRA: 270 return rewriteValueARM_OpARMSBCshiftRA(v) 271 case OpARMSBCshiftRAreg: 272 return rewriteValueARM_OpARMSBCshiftRAreg(v) 273 case OpARMSBCshiftRL: 274 return rewriteValueARM_OpARMSBCshiftRL(v) 275 case OpARMSBCshiftRLreg: 276 return rewriteValueARM_OpARMSBCshiftRLreg(v) 277 case OpARMSLL: 278 return rewriteValueARM_OpARMSLL(v) 279 case OpARMSLLconst: 280 return rewriteValueARM_OpARMSLLconst(v) 281 case OpARMSRA: 282 return rewriteValueARM_OpARMSRA(v) 283 case OpARMSRAcond: 284 return rewriteValueARM_OpARMSRAcond(v) 285 case OpARMSRAconst: 286 return rewriteValueARM_OpARMSRAconst(v) 287 case OpARMSRL: 288 return rewriteValueARM_OpARMSRL(v) 289 case OpARMSRLconst: 290 return rewriteValueARM_OpARMSRLconst(v) 291 case OpARMSUB: 292 return rewriteValueARM_OpARMSUB(v) 293 case OpARMSUBS: 294 return rewriteValueARM_OpARMSUBS(v) 295 case OpARMSUBSshiftLL: 296 return rewriteValueARM_OpARMSUBSshiftLL(v) 297 case OpARMSUBSshiftLLreg: 298 return rewriteValueARM_OpARMSUBSshiftLLreg(v) 299 case OpARMSUBSshiftRA: 300 return rewriteValueARM_OpARMSUBSshiftRA(v) 301 case OpARMSUBSshiftRAreg: 302 return rewriteValueARM_OpARMSUBSshiftRAreg(v) 303 case OpARMSUBSshiftRL: 304 return rewriteValueARM_OpARMSUBSshiftRL(v) 305 case OpARMSUBSshiftRLreg: 306 return rewriteValueARM_OpARMSUBSshiftRLreg(v) 307 case OpARMSUBconst: 308 return rewriteValueARM_OpARMSUBconst(v) 309 case OpARMSUBshiftLL: 310 return rewriteValueARM_OpARMSUBshiftLL(v) 311 case OpARMSUBshiftLLreg: 312 return rewriteValueARM_OpARMSUBshiftLLreg(v) 313 case OpARMSUBshiftRA: 314 return rewriteValueARM_OpARMSUBshiftRA(v) 315 case OpARMSUBshiftRAreg: 316 return rewriteValueARM_OpARMSUBshiftRAreg(v) 317 case OpARMSUBshiftRL: 318 return rewriteValueARM_OpARMSUBshiftRL(v) 319 case OpARMSUBshiftRLreg: 320 return rewriteValueARM_OpARMSUBshiftRLreg(v) 321 case OpARMXOR: 322 return rewriteValueARM_OpARMXOR(v) 323 case OpARMXORconst: 324 return rewriteValueARM_OpARMXORconst(v) 325 case OpARMXORshiftLL: 326 return rewriteValueARM_OpARMXORshiftLL(v) 327 case OpARMXORshiftLLreg: 328 return rewriteValueARM_OpARMXORshiftLLreg(v) 329 case OpARMXORshiftRA: 330 return rewriteValueARM_OpARMXORshiftRA(v) 331 case OpARMXORshiftRAreg: 332 return rewriteValueARM_OpARMXORshiftRAreg(v) 333 case OpARMXORshiftRL: 334 return rewriteValueARM_OpARMXORshiftRL(v) 335 case OpARMXORshiftRLreg: 336 return rewriteValueARM_OpARMXORshiftRLreg(v) 337 case OpARMXORshiftRR: 338 return rewriteValueARM_OpARMXORshiftRR(v) 339 case OpAdd16: 340 return rewriteValueARM_OpAdd16(v) 341 case OpAdd32: 342 return rewriteValueARM_OpAdd32(v) 343 case OpAdd32F: 344 return rewriteValueARM_OpAdd32F(v) 345 case OpAdd32carry: 346 return rewriteValueARM_OpAdd32carry(v) 347 case OpAdd32withcarry: 348 return rewriteValueARM_OpAdd32withcarry(v) 349 case OpAdd64F: 350 return rewriteValueARM_OpAdd64F(v) 351 case OpAdd8: 352 return rewriteValueARM_OpAdd8(v) 353 case OpAddPtr: 354 return rewriteValueARM_OpAddPtr(v) 355 case OpAddr: 356 return rewriteValueARM_OpAddr(v) 357 case OpAnd16: 358 return rewriteValueARM_OpAnd16(v) 359 case OpAnd32: 360 return rewriteValueARM_OpAnd32(v) 361 case OpAnd8: 362 return rewriteValueARM_OpAnd8(v) 363 case OpAndB: 364 return rewriteValueARM_OpAndB(v) 365 case OpAvg32u: 366 return rewriteValueARM_OpAvg32u(v) 367 case OpBitLen32: 368 return rewriteValueARM_OpBitLen32(v) 369 case OpBswap32: 370 return rewriteValueARM_OpBswap32(v) 371 case OpClosureCall: 372 return rewriteValueARM_OpClosureCall(v) 373 case OpCom16: 374 return rewriteValueARM_OpCom16(v) 375 case OpCom32: 376 return rewriteValueARM_OpCom32(v) 377 case OpCom8: 378 return rewriteValueARM_OpCom8(v) 379 case OpConst16: 380 return rewriteValueARM_OpConst16(v) 381 case OpConst32: 382 return rewriteValueARM_OpConst32(v) 383 case OpConst32F: 384 return rewriteValueARM_OpConst32F(v) 385 case OpConst64F: 386 return rewriteValueARM_OpConst64F(v) 387 case OpConst8: 388 return rewriteValueARM_OpConst8(v) 389 case OpConstBool: 390 return rewriteValueARM_OpConstBool(v) 391 case OpConstNil: 392 return rewriteValueARM_OpConstNil(v) 393 case OpConvert: 394 return rewriteValueARM_OpConvert(v) 395 case OpCtz32: 396 return rewriteValueARM_OpCtz32(v) 397 case OpCvt32Fto32: 398 return rewriteValueARM_OpCvt32Fto32(v) 399 case OpCvt32Fto32U: 400 return rewriteValueARM_OpCvt32Fto32U(v) 401 case OpCvt32Fto64F: 402 return rewriteValueARM_OpCvt32Fto64F(v) 403 case OpCvt32Uto32F: 404 return rewriteValueARM_OpCvt32Uto32F(v) 405 case OpCvt32Uto64F: 406 return rewriteValueARM_OpCvt32Uto64F(v) 407 case OpCvt32to32F: 408 return rewriteValueARM_OpCvt32to32F(v) 409 case OpCvt32to64F: 410 return rewriteValueARM_OpCvt32to64F(v) 411 case OpCvt64Fto32: 412 return rewriteValueARM_OpCvt64Fto32(v) 413 case OpCvt64Fto32F: 414 return rewriteValueARM_OpCvt64Fto32F(v) 415 case OpCvt64Fto32U: 416 return rewriteValueARM_OpCvt64Fto32U(v) 417 case OpDiv16: 418 return rewriteValueARM_OpDiv16(v) 419 case OpDiv16u: 420 return rewriteValueARM_OpDiv16u(v) 421 case OpDiv32: 422 return rewriteValueARM_OpDiv32(v) 423 case OpDiv32F: 424 return rewriteValueARM_OpDiv32F(v) 425 case OpDiv32u: 426 return rewriteValueARM_OpDiv32u(v) 427 case OpDiv64F: 428 return rewriteValueARM_OpDiv64F(v) 429 case OpDiv8: 430 return rewriteValueARM_OpDiv8(v) 431 case OpDiv8u: 432 return rewriteValueARM_OpDiv8u(v) 433 case OpEq16: 434 return rewriteValueARM_OpEq16(v) 435 case OpEq32: 436 return rewriteValueARM_OpEq32(v) 437 case OpEq32F: 438 return rewriteValueARM_OpEq32F(v) 439 case OpEq64F: 440 return rewriteValueARM_OpEq64F(v) 441 case OpEq8: 442 return rewriteValueARM_OpEq8(v) 443 case OpEqB: 444 return rewriteValueARM_OpEqB(v) 445 case OpEqPtr: 446 return rewriteValueARM_OpEqPtr(v) 447 case OpGeq16: 448 return rewriteValueARM_OpGeq16(v) 449 case OpGeq16U: 450 return rewriteValueARM_OpGeq16U(v) 451 case OpGeq32: 452 return rewriteValueARM_OpGeq32(v) 453 case OpGeq32F: 454 return rewriteValueARM_OpGeq32F(v) 455 case OpGeq32U: 456 return rewriteValueARM_OpGeq32U(v) 457 case OpGeq64F: 458 return rewriteValueARM_OpGeq64F(v) 459 case OpGeq8: 460 return rewriteValueARM_OpGeq8(v) 461 case OpGeq8U: 462 return rewriteValueARM_OpGeq8U(v) 463 case OpGetClosurePtr: 464 return rewriteValueARM_OpGetClosurePtr(v) 465 case OpGreater16: 466 return rewriteValueARM_OpGreater16(v) 467 case OpGreater16U: 468 return rewriteValueARM_OpGreater16U(v) 469 case OpGreater32: 470 return rewriteValueARM_OpGreater32(v) 471 case OpGreater32F: 472 return rewriteValueARM_OpGreater32F(v) 473 case OpGreater32U: 474 return rewriteValueARM_OpGreater32U(v) 475 case OpGreater64F: 476 return rewriteValueARM_OpGreater64F(v) 477 case OpGreater8: 478 return rewriteValueARM_OpGreater8(v) 479 case OpGreater8U: 480 return rewriteValueARM_OpGreater8U(v) 481 case OpHmul32: 482 return rewriteValueARM_OpHmul32(v) 483 case OpHmul32u: 484 return rewriteValueARM_OpHmul32u(v) 485 case OpInterCall: 486 return rewriteValueARM_OpInterCall(v) 487 case OpIsInBounds: 488 return rewriteValueARM_OpIsInBounds(v) 489 case OpIsNonNil: 490 return rewriteValueARM_OpIsNonNil(v) 491 case OpIsSliceInBounds: 492 return rewriteValueARM_OpIsSliceInBounds(v) 493 case OpLeq16: 494 return rewriteValueARM_OpLeq16(v) 495 case OpLeq16U: 496 return rewriteValueARM_OpLeq16U(v) 497 case OpLeq32: 498 return rewriteValueARM_OpLeq32(v) 499 case OpLeq32F: 500 return rewriteValueARM_OpLeq32F(v) 501 case OpLeq32U: 502 return rewriteValueARM_OpLeq32U(v) 503 case OpLeq64F: 504 return rewriteValueARM_OpLeq64F(v) 505 case OpLeq8: 506 return rewriteValueARM_OpLeq8(v) 507 case OpLeq8U: 508 return rewriteValueARM_OpLeq8U(v) 509 case OpLess16: 510 return rewriteValueARM_OpLess16(v) 511 case OpLess16U: 512 return rewriteValueARM_OpLess16U(v) 513 case OpLess32: 514 return rewriteValueARM_OpLess32(v) 515 case OpLess32F: 516 return rewriteValueARM_OpLess32F(v) 517 case OpLess32U: 518 return rewriteValueARM_OpLess32U(v) 519 case OpLess64F: 520 return rewriteValueARM_OpLess64F(v) 521 case OpLess8: 522 return rewriteValueARM_OpLess8(v) 523 case OpLess8U: 524 return rewriteValueARM_OpLess8U(v) 525 case OpLoad: 526 return rewriteValueARM_OpLoad(v) 527 case OpLsh16x16: 528 return rewriteValueARM_OpLsh16x16(v) 529 case OpLsh16x32: 530 return rewriteValueARM_OpLsh16x32(v) 531 case OpLsh16x64: 532 return rewriteValueARM_OpLsh16x64(v) 533 case OpLsh16x8: 534 return rewriteValueARM_OpLsh16x8(v) 535 case OpLsh32x16: 536 return rewriteValueARM_OpLsh32x16(v) 537 case OpLsh32x32: 538 return rewriteValueARM_OpLsh32x32(v) 539 case OpLsh32x64: 540 return rewriteValueARM_OpLsh32x64(v) 541 case OpLsh32x8: 542 return rewriteValueARM_OpLsh32x8(v) 543 case OpLsh8x16: 544 return rewriteValueARM_OpLsh8x16(v) 545 case OpLsh8x32: 546 return rewriteValueARM_OpLsh8x32(v) 547 case OpLsh8x64: 548 return rewriteValueARM_OpLsh8x64(v) 549 case OpLsh8x8: 550 return rewriteValueARM_OpLsh8x8(v) 551 case OpMod16: 552 return rewriteValueARM_OpMod16(v) 553 case OpMod16u: 554 return rewriteValueARM_OpMod16u(v) 555 case OpMod32: 556 return rewriteValueARM_OpMod32(v) 557 case OpMod32u: 558 return rewriteValueARM_OpMod32u(v) 559 case OpMod8: 560 return rewriteValueARM_OpMod8(v) 561 case OpMod8u: 562 return rewriteValueARM_OpMod8u(v) 563 case OpMove: 564 return rewriteValueARM_OpMove(v) 565 case OpMul16: 566 return rewriteValueARM_OpMul16(v) 567 case OpMul32: 568 return rewriteValueARM_OpMul32(v) 569 case OpMul32F: 570 return rewriteValueARM_OpMul32F(v) 571 case OpMul32uhilo: 572 return rewriteValueARM_OpMul32uhilo(v) 573 case OpMul64F: 574 return rewriteValueARM_OpMul64F(v) 575 case OpMul8: 576 return rewriteValueARM_OpMul8(v) 577 case OpNeg16: 578 return rewriteValueARM_OpNeg16(v) 579 case OpNeg32: 580 return rewriteValueARM_OpNeg32(v) 581 case OpNeg32F: 582 return rewriteValueARM_OpNeg32F(v) 583 case OpNeg64F: 584 return rewriteValueARM_OpNeg64F(v) 585 case OpNeg8: 586 return rewriteValueARM_OpNeg8(v) 587 case OpNeq16: 588 return rewriteValueARM_OpNeq16(v) 589 case OpNeq32: 590 return rewriteValueARM_OpNeq32(v) 591 case OpNeq32F: 592 return rewriteValueARM_OpNeq32F(v) 593 case OpNeq64F: 594 return rewriteValueARM_OpNeq64F(v) 595 case OpNeq8: 596 return rewriteValueARM_OpNeq8(v) 597 case OpNeqB: 598 return rewriteValueARM_OpNeqB(v) 599 case OpNeqPtr: 600 return rewriteValueARM_OpNeqPtr(v) 601 case OpNilCheck: 602 return rewriteValueARM_OpNilCheck(v) 603 case OpNot: 604 return rewriteValueARM_OpNot(v) 605 case OpOffPtr: 606 return rewriteValueARM_OpOffPtr(v) 607 case OpOr16: 608 return rewriteValueARM_OpOr16(v) 609 case OpOr32: 610 return rewriteValueARM_OpOr32(v) 611 case OpOr8: 612 return rewriteValueARM_OpOr8(v) 613 case OpOrB: 614 return rewriteValueARM_OpOrB(v) 615 case OpRound32F: 616 return rewriteValueARM_OpRound32F(v) 617 case OpRound64F: 618 return rewriteValueARM_OpRound64F(v) 619 case OpRsh16Ux16: 620 return rewriteValueARM_OpRsh16Ux16(v) 621 case OpRsh16Ux32: 622 return rewriteValueARM_OpRsh16Ux32(v) 623 case OpRsh16Ux64: 624 return rewriteValueARM_OpRsh16Ux64(v) 625 case OpRsh16Ux8: 626 return rewriteValueARM_OpRsh16Ux8(v) 627 case OpRsh16x16: 628 return rewriteValueARM_OpRsh16x16(v) 629 case OpRsh16x32: 630 return rewriteValueARM_OpRsh16x32(v) 631 case OpRsh16x64: 632 return rewriteValueARM_OpRsh16x64(v) 633 case OpRsh16x8: 634 return rewriteValueARM_OpRsh16x8(v) 635 case OpRsh32Ux16: 636 return rewriteValueARM_OpRsh32Ux16(v) 637 case OpRsh32Ux32: 638 return rewriteValueARM_OpRsh32Ux32(v) 639 case OpRsh32Ux64: 640 return rewriteValueARM_OpRsh32Ux64(v) 641 case OpRsh32Ux8: 642 return rewriteValueARM_OpRsh32Ux8(v) 643 case OpRsh32x16: 644 return rewriteValueARM_OpRsh32x16(v) 645 case OpRsh32x32: 646 return rewriteValueARM_OpRsh32x32(v) 647 case OpRsh32x64: 648 return rewriteValueARM_OpRsh32x64(v) 649 case OpRsh32x8: 650 return rewriteValueARM_OpRsh32x8(v) 651 case OpRsh8Ux16: 652 return rewriteValueARM_OpRsh8Ux16(v) 653 case OpRsh8Ux32: 654 return rewriteValueARM_OpRsh8Ux32(v) 655 case OpRsh8Ux64: 656 return rewriteValueARM_OpRsh8Ux64(v) 657 case OpRsh8Ux8: 658 return rewriteValueARM_OpRsh8Ux8(v) 659 case OpRsh8x16: 660 return rewriteValueARM_OpRsh8x16(v) 661 case OpRsh8x32: 662 return rewriteValueARM_OpRsh8x32(v) 663 case OpRsh8x64: 664 return rewriteValueARM_OpRsh8x64(v) 665 case OpRsh8x8: 666 return rewriteValueARM_OpRsh8x8(v) 667 case OpSelect0: 668 return rewriteValueARM_OpSelect0(v) 669 case OpSelect1: 670 return rewriteValueARM_OpSelect1(v) 671 case OpSignExt16to32: 672 return rewriteValueARM_OpSignExt16to32(v) 673 case OpSignExt8to16: 674 return rewriteValueARM_OpSignExt8to16(v) 675 case OpSignExt8to32: 676 return rewriteValueARM_OpSignExt8to32(v) 677 case OpSignmask: 678 return rewriteValueARM_OpSignmask(v) 679 case OpSlicemask: 680 return rewriteValueARM_OpSlicemask(v) 681 case OpSqrt: 682 return rewriteValueARM_OpSqrt(v) 683 case OpStaticCall: 684 return rewriteValueARM_OpStaticCall(v) 685 case OpStore: 686 return rewriteValueARM_OpStore(v) 687 case OpSub16: 688 return rewriteValueARM_OpSub16(v) 689 case OpSub32: 690 return rewriteValueARM_OpSub32(v) 691 case OpSub32F: 692 return rewriteValueARM_OpSub32F(v) 693 case OpSub32carry: 694 return rewriteValueARM_OpSub32carry(v) 695 case OpSub32withcarry: 696 return rewriteValueARM_OpSub32withcarry(v) 697 case OpSub64F: 698 return rewriteValueARM_OpSub64F(v) 699 case OpSub8: 700 return rewriteValueARM_OpSub8(v) 701 case OpSubPtr: 702 return rewriteValueARM_OpSubPtr(v) 703 case OpTrunc16to8: 704 return rewriteValueARM_OpTrunc16to8(v) 705 case OpTrunc32to16: 706 return rewriteValueARM_OpTrunc32to16(v) 707 case OpTrunc32to8: 708 return rewriteValueARM_OpTrunc32to8(v) 709 case OpXor16: 710 return rewriteValueARM_OpXor16(v) 711 case OpXor32: 712 return rewriteValueARM_OpXor32(v) 713 case OpXor8: 714 return rewriteValueARM_OpXor8(v) 715 case OpZero: 716 return rewriteValueARM_OpZero(v) 717 case OpZeroExt16to32: 718 return rewriteValueARM_OpZeroExt16to32(v) 719 case OpZeroExt8to16: 720 return rewriteValueARM_OpZeroExt8to16(v) 721 case OpZeroExt8to32: 722 return rewriteValueARM_OpZeroExt8to32(v) 723 case OpZeromask: 724 return rewriteValueARM_OpZeromask(v) 725 } 726 return false 727 } 728 func rewriteValueARM_OpARMADC(v *Value) bool { 729 // match: (ADC (MOVWconst [c]) x flags) 730 // cond: 731 // result: (ADCconst [c] x flags) 732 for { 733 v_0 := v.Args[0] 734 if v_0.Op != OpARMMOVWconst { 735 break 736 } 737 c := v_0.AuxInt 738 x := v.Args[1] 739 flags := v.Args[2] 740 v.reset(OpARMADCconst) 741 v.AuxInt = c 742 v.AddArg(x) 743 v.AddArg(flags) 744 return true 745 } 746 // match: (ADC x (MOVWconst [c]) flags) 747 // cond: 748 // result: (ADCconst [c] x flags) 749 for { 750 x := v.Args[0] 751 v_1 := v.Args[1] 752 if v_1.Op != OpARMMOVWconst { 753 break 754 } 755 c := v_1.AuxInt 756 flags := v.Args[2] 757 v.reset(OpARMADCconst) 758 v.AuxInt = c 759 v.AddArg(x) 760 v.AddArg(flags) 761 return true 762 } 763 // match: (ADC x (MOVWconst [c]) flags) 764 // cond: 765 // result: (ADCconst [c] x flags) 766 for { 767 x := v.Args[0] 768 v_1 := v.Args[1] 769 if v_1.Op != OpARMMOVWconst { 770 break 771 } 772 c := v_1.AuxInt 773 flags := v.Args[2] 774 v.reset(OpARMADCconst) 775 v.AuxInt = c 776 v.AddArg(x) 777 v.AddArg(flags) 778 return true 779 } 780 // match: (ADC (MOVWconst [c]) x flags) 781 // cond: 782 // result: (ADCconst [c] x flags) 783 for { 784 v_0 := v.Args[0] 785 if v_0.Op != OpARMMOVWconst { 786 break 787 } 788 c := v_0.AuxInt 789 x := v.Args[1] 790 flags := v.Args[2] 791 v.reset(OpARMADCconst) 792 v.AuxInt = c 793 v.AddArg(x) 794 v.AddArg(flags) 795 return true 796 } 797 // match: (ADC x (SLLconst [c] y) flags) 798 // cond: 799 // result: (ADCshiftLL x y [c] flags) 800 for { 801 x := v.Args[0] 802 v_1 := v.Args[1] 803 if v_1.Op != OpARMSLLconst { 804 break 805 } 806 c := v_1.AuxInt 807 y := v_1.Args[0] 808 flags := v.Args[2] 809 v.reset(OpARMADCshiftLL) 810 v.AuxInt = c 811 v.AddArg(x) 812 v.AddArg(y) 813 v.AddArg(flags) 814 return true 815 } 816 // match: (ADC (SLLconst [c] y) x flags) 817 // cond: 818 // result: (ADCshiftLL x y [c] flags) 819 for { 820 v_0 := v.Args[0] 821 if v_0.Op != OpARMSLLconst { 822 break 823 } 824 c := v_0.AuxInt 825 y := v_0.Args[0] 826 x := v.Args[1] 827 flags := v.Args[2] 828 v.reset(OpARMADCshiftLL) 829 v.AuxInt = c 830 v.AddArg(x) 831 v.AddArg(y) 832 v.AddArg(flags) 833 return true 834 } 835 // match: (ADC (SLLconst [c] y) x flags) 836 // cond: 837 // result: (ADCshiftLL x y [c] flags) 838 for { 839 v_0 := v.Args[0] 840 if v_0.Op != OpARMSLLconst { 841 break 842 } 843 c := v_0.AuxInt 844 y := v_0.Args[0] 845 x := v.Args[1] 846 flags := v.Args[2] 847 v.reset(OpARMADCshiftLL) 848 v.AuxInt = c 849 v.AddArg(x) 850 v.AddArg(y) 851 v.AddArg(flags) 852 return true 853 } 854 // match: (ADC x (SLLconst [c] y) flags) 855 // cond: 856 // result: (ADCshiftLL x y [c] flags) 857 for { 858 x := v.Args[0] 859 v_1 := v.Args[1] 860 if v_1.Op != OpARMSLLconst { 861 break 862 } 863 c := v_1.AuxInt 864 y := v_1.Args[0] 865 flags := v.Args[2] 866 v.reset(OpARMADCshiftLL) 867 v.AuxInt = c 868 v.AddArg(x) 869 v.AddArg(y) 870 v.AddArg(flags) 871 return true 872 } 873 // match: (ADC x (SRLconst [c] y) flags) 874 // cond: 875 // result: (ADCshiftRL x y [c] flags) 876 for { 877 x := v.Args[0] 878 v_1 := v.Args[1] 879 if v_1.Op != OpARMSRLconst { 880 break 881 } 882 c := v_1.AuxInt 883 y := v_1.Args[0] 884 flags := v.Args[2] 885 v.reset(OpARMADCshiftRL) 886 v.AuxInt = c 887 v.AddArg(x) 888 v.AddArg(y) 889 v.AddArg(flags) 890 return true 891 } 892 // match: (ADC (SRLconst [c] y) x flags) 893 // cond: 894 // result: (ADCshiftRL x y [c] flags) 895 for { 896 v_0 := v.Args[0] 897 if v_0.Op != OpARMSRLconst { 898 break 899 } 900 c := v_0.AuxInt 901 y := v_0.Args[0] 902 x := v.Args[1] 903 flags := v.Args[2] 904 v.reset(OpARMADCshiftRL) 905 v.AuxInt = c 906 v.AddArg(x) 907 v.AddArg(y) 908 v.AddArg(flags) 909 return true 910 } 911 // match: (ADC (SRLconst [c] y) x flags) 912 // cond: 913 // result: (ADCshiftRL x y [c] flags) 914 for { 915 v_0 := v.Args[0] 916 if v_0.Op != OpARMSRLconst { 917 break 918 } 919 c := v_0.AuxInt 920 y := v_0.Args[0] 921 x := v.Args[1] 922 flags := v.Args[2] 923 v.reset(OpARMADCshiftRL) 924 v.AuxInt = c 925 v.AddArg(x) 926 v.AddArg(y) 927 v.AddArg(flags) 928 return true 929 } 930 // match: (ADC x (SRLconst [c] y) flags) 931 // cond: 932 // result: (ADCshiftRL x y [c] flags) 933 for { 934 x := v.Args[0] 935 v_1 := v.Args[1] 936 if v_1.Op != OpARMSRLconst { 937 break 938 } 939 c := v_1.AuxInt 940 y := v_1.Args[0] 941 flags := v.Args[2] 942 v.reset(OpARMADCshiftRL) 943 v.AuxInt = c 944 v.AddArg(x) 945 v.AddArg(y) 946 v.AddArg(flags) 947 return true 948 } 949 // match: (ADC x (SRAconst [c] y) flags) 950 // cond: 951 // result: (ADCshiftRA x y [c] flags) 952 for { 953 x := v.Args[0] 954 v_1 := v.Args[1] 955 if v_1.Op != OpARMSRAconst { 956 break 957 } 958 c := v_1.AuxInt 959 y := v_1.Args[0] 960 flags := v.Args[2] 961 v.reset(OpARMADCshiftRA) 962 v.AuxInt = c 963 v.AddArg(x) 964 v.AddArg(y) 965 v.AddArg(flags) 966 return true 967 } 968 // match: (ADC (SRAconst [c] y) x flags) 969 // cond: 970 // result: (ADCshiftRA x y [c] flags) 971 for { 972 v_0 := v.Args[0] 973 if v_0.Op != OpARMSRAconst { 974 break 975 } 976 c := v_0.AuxInt 977 y := v_0.Args[0] 978 x := v.Args[1] 979 flags := v.Args[2] 980 v.reset(OpARMADCshiftRA) 981 v.AuxInt = c 982 v.AddArg(x) 983 v.AddArg(y) 984 v.AddArg(flags) 985 return true 986 } 987 // match: (ADC (SRAconst [c] y) x flags) 988 // cond: 989 // result: (ADCshiftRA x y [c] flags) 990 for { 991 v_0 := v.Args[0] 992 if v_0.Op != OpARMSRAconst { 993 break 994 } 995 c := v_0.AuxInt 996 y := v_0.Args[0] 997 x := v.Args[1] 998 flags := v.Args[2] 999 v.reset(OpARMADCshiftRA) 1000 v.AuxInt = c 1001 v.AddArg(x) 1002 v.AddArg(y) 1003 v.AddArg(flags) 1004 return true 1005 } 1006 // match: (ADC x (SRAconst [c] y) flags) 1007 // cond: 1008 // result: (ADCshiftRA x y [c] flags) 1009 for { 1010 x := v.Args[0] 1011 v_1 := v.Args[1] 1012 if v_1.Op != OpARMSRAconst { 1013 break 1014 } 1015 c := v_1.AuxInt 1016 y := v_1.Args[0] 1017 flags := v.Args[2] 1018 v.reset(OpARMADCshiftRA) 1019 v.AuxInt = c 1020 v.AddArg(x) 1021 v.AddArg(y) 1022 v.AddArg(flags) 1023 return true 1024 } 1025 // match: (ADC x (SLL y z) flags) 1026 // cond: 1027 // result: (ADCshiftLLreg x y z flags) 1028 for { 1029 x := v.Args[0] 1030 v_1 := v.Args[1] 1031 if v_1.Op != OpARMSLL { 1032 break 1033 } 1034 y := v_1.Args[0] 1035 z := v_1.Args[1] 1036 flags := v.Args[2] 1037 v.reset(OpARMADCshiftLLreg) 1038 v.AddArg(x) 1039 v.AddArg(y) 1040 v.AddArg(z) 1041 v.AddArg(flags) 1042 return true 1043 } 1044 // match: (ADC (SLL y z) x flags) 1045 // cond: 1046 // result: (ADCshiftLLreg x y z flags) 1047 for { 1048 v_0 := v.Args[0] 1049 if v_0.Op != OpARMSLL { 1050 break 1051 } 1052 y := v_0.Args[0] 1053 z := v_0.Args[1] 1054 x := v.Args[1] 1055 flags := v.Args[2] 1056 v.reset(OpARMADCshiftLLreg) 1057 v.AddArg(x) 1058 v.AddArg(y) 1059 v.AddArg(z) 1060 v.AddArg(flags) 1061 return true 1062 } 1063 // match: (ADC (SLL y z) x flags) 1064 // cond: 1065 // result: (ADCshiftLLreg x y z flags) 1066 for { 1067 v_0 := v.Args[0] 1068 if v_0.Op != OpARMSLL { 1069 break 1070 } 1071 y := v_0.Args[0] 1072 z := v_0.Args[1] 1073 x := v.Args[1] 1074 flags := v.Args[2] 1075 v.reset(OpARMADCshiftLLreg) 1076 v.AddArg(x) 1077 v.AddArg(y) 1078 v.AddArg(z) 1079 v.AddArg(flags) 1080 return true 1081 } 1082 // match: (ADC x (SLL y z) flags) 1083 // cond: 1084 // result: (ADCshiftLLreg x y z flags) 1085 for { 1086 x := v.Args[0] 1087 v_1 := v.Args[1] 1088 if v_1.Op != OpARMSLL { 1089 break 1090 } 1091 y := v_1.Args[0] 1092 z := v_1.Args[1] 1093 flags := v.Args[2] 1094 v.reset(OpARMADCshiftLLreg) 1095 v.AddArg(x) 1096 v.AddArg(y) 1097 v.AddArg(z) 1098 v.AddArg(flags) 1099 return true 1100 } 1101 // match: (ADC x (SRL y z) flags) 1102 // cond: 1103 // result: (ADCshiftRLreg x y z flags) 1104 for { 1105 x := v.Args[0] 1106 v_1 := v.Args[1] 1107 if v_1.Op != OpARMSRL { 1108 break 1109 } 1110 y := v_1.Args[0] 1111 z := v_1.Args[1] 1112 flags := v.Args[2] 1113 v.reset(OpARMADCshiftRLreg) 1114 v.AddArg(x) 1115 v.AddArg(y) 1116 v.AddArg(z) 1117 v.AddArg(flags) 1118 return true 1119 } 1120 // match: (ADC (SRL y z) x flags) 1121 // cond: 1122 // result: (ADCshiftRLreg x y z flags) 1123 for { 1124 v_0 := v.Args[0] 1125 if v_0.Op != OpARMSRL { 1126 break 1127 } 1128 y := v_0.Args[0] 1129 z := v_0.Args[1] 1130 x := v.Args[1] 1131 flags := v.Args[2] 1132 v.reset(OpARMADCshiftRLreg) 1133 v.AddArg(x) 1134 v.AddArg(y) 1135 v.AddArg(z) 1136 v.AddArg(flags) 1137 return true 1138 } 1139 // match: (ADC (SRL y z) x flags) 1140 // cond: 1141 // result: (ADCshiftRLreg x y z flags) 1142 for { 1143 v_0 := v.Args[0] 1144 if v_0.Op != OpARMSRL { 1145 break 1146 } 1147 y := v_0.Args[0] 1148 z := v_0.Args[1] 1149 x := v.Args[1] 1150 flags := v.Args[2] 1151 v.reset(OpARMADCshiftRLreg) 1152 v.AddArg(x) 1153 v.AddArg(y) 1154 v.AddArg(z) 1155 v.AddArg(flags) 1156 return true 1157 } 1158 // match: (ADC x (SRL y z) flags) 1159 // cond: 1160 // result: (ADCshiftRLreg x y z flags) 1161 for { 1162 x := v.Args[0] 1163 v_1 := v.Args[1] 1164 if v_1.Op != OpARMSRL { 1165 break 1166 } 1167 y := v_1.Args[0] 1168 z := v_1.Args[1] 1169 flags := v.Args[2] 1170 v.reset(OpARMADCshiftRLreg) 1171 v.AddArg(x) 1172 v.AddArg(y) 1173 v.AddArg(z) 1174 v.AddArg(flags) 1175 return true 1176 } 1177 // match: (ADC x (SRA y z) flags) 1178 // cond: 1179 // result: (ADCshiftRAreg x y z flags) 1180 for { 1181 x := v.Args[0] 1182 v_1 := v.Args[1] 1183 if v_1.Op != OpARMSRA { 1184 break 1185 } 1186 y := v_1.Args[0] 1187 z := v_1.Args[1] 1188 flags := v.Args[2] 1189 v.reset(OpARMADCshiftRAreg) 1190 v.AddArg(x) 1191 v.AddArg(y) 1192 v.AddArg(z) 1193 v.AddArg(flags) 1194 return true 1195 } 1196 // match: (ADC (SRA y z) x flags) 1197 // cond: 1198 // result: (ADCshiftRAreg x y z flags) 1199 for { 1200 v_0 := v.Args[0] 1201 if v_0.Op != OpARMSRA { 1202 break 1203 } 1204 y := v_0.Args[0] 1205 z := v_0.Args[1] 1206 x := v.Args[1] 1207 flags := v.Args[2] 1208 v.reset(OpARMADCshiftRAreg) 1209 v.AddArg(x) 1210 v.AddArg(y) 1211 v.AddArg(z) 1212 v.AddArg(flags) 1213 return true 1214 } 1215 // match: (ADC (SRA y z) x flags) 1216 // cond: 1217 // result: (ADCshiftRAreg x y z flags) 1218 for { 1219 v_0 := v.Args[0] 1220 if v_0.Op != OpARMSRA { 1221 break 1222 } 1223 y := v_0.Args[0] 1224 z := v_0.Args[1] 1225 x := v.Args[1] 1226 flags := v.Args[2] 1227 v.reset(OpARMADCshiftRAreg) 1228 v.AddArg(x) 1229 v.AddArg(y) 1230 v.AddArg(z) 1231 v.AddArg(flags) 1232 return true 1233 } 1234 // match: (ADC x (SRA y z) flags) 1235 // cond: 1236 // result: (ADCshiftRAreg x y z flags) 1237 for { 1238 x := v.Args[0] 1239 v_1 := v.Args[1] 1240 if v_1.Op != OpARMSRA { 1241 break 1242 } 1243 y := v_1.Args[0] 1244 z := v_1.Args[1] 1245 flags := v.Args[2] 1246 v.reset(OpARMADCshiftRAreg) 1247 v.AddArg(x) 1248 v.AddArg(y) 1249 v.AddArg(z) 1250 v.AddArg(flags) 1251 return true 1252 } 1253 return false 1254 } 1255 func rewriteValueARM_OpARMADCconst(v *Value) bool { 1256 // match: (ADCconst [c] (ADDconst [d] x) flags) 1257 // cond: 1258 // result: (ADCconst [int64(int32(c+d))] x flags) 1259 for { 1260 c := v.AuxInt 1261 v_0 := v.Args[0] 1262 if v_0.Op != OpARMADDconst { 1263 break 1264 } 1265 d := v_0.AuxInt 1266 x := v_0.Args[0] 1267 flags := v.Args[1] 1268 v.reset(OpARMADCconst) 1269 v.AuxInt = int64(int32(c + d)) 1270 v.AddArg(x) 1271 v.AddArg(flags) 1272 return true 1273 } 1274 // match: (ADCconst [c] (SUBconst [d] x) flags) 1275 // cond: 1276 // result: (ADCconst [int64(int32(c-d))] x flags) 1277 for { 1278 c := v.AuxInt 1279 v_0 := v.Args[0] 1280 if v_0.Op != OpARMSUBconst { 1281 break 1282 } 1283 d := v_0.AuxInt 1284 x := v_0.Args[0] 1285 flags := v.Args[1] 1286 v.reset(OpARMADCconst) 1287 v.AuxInt = int64(int32(c - d)) 1288 v.AddArg(x) 1289 v.AddArg(flags) 1290 return true 1291 } 1292 return false 1293 } 1294 func rewriteValueARM_OpARMADCshiftLL(v *Value) bool { 1295 b := v.Block 1296 _ = b 1297 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1298 // cond: 1299 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1300 for { 1301 d := v.AuxInt 1302 v_0 := v.Args[0] 1303 if v_0.Op != OpARMMOVWconst { 1304 break 1305 } 1306 c := v_0.AuxInt 1307 x := v.Args[1] 1308 flags := v.Args[2] 1309 v.reset(OpARMADCconst) 1310 v.AuxInt = c 1311 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1312 v0.AuxInt = d 1313 v0.AddArg(x) 1314 v.AddArg(v0) 1315 v.AddArg(flags) 1316 return true 1317 } 1318 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1319 // cond: 1320 // result: (ADCconst x [int64(uint32(c)<<uint64(d))] flags) 1321 for { 1322 d := v.AuxInt 1323 x := v.Args[0] 1324 v_1 := v.Args[1] 1325 if v_1.Op != OpARMMOVWconst { 1326 break 1327 } 1328 c := v_1.AuxInt 1329 flags := v.Args[2] 1330 v.reset(OpARMADCconst) 1331 v.AuxInt = int64(uint32(c) << uint64(d)) 1332 v.AddArg(x) 1333 v.AddArg(flags) 1334 return true 1335 } 1336 return false 1337 } 1338 func rewriteValueARM_OpARMADCshiftLLreg(v *Value) bool { 1339 b := v.Block 1340 _ = b 1341 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1342 // cond: 1343 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1344 for { 1345 v_0 := v.Args[0] 1346 if v_0.Op != OpARMMOVWconst { 1347 break 1348 } 1349 c := v_0.AuxInt 1350 x := v.Args[1] 1351 y := v.Args[2] 1352 flags := v.Args[3] 1353 v.reset(OpARMADCconst) 1354 v.AuxInt = c 1355 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1356 v0.AddArg(x) 1357 v0.AddArg(y) 1358 v.AddArg(v0) 1359 v.AddArg(flags) 1360 return true 1361 } 1362 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1363 // cond: 1364 // result: (ADCshiftLL x y [c] flags) 1365 for { 1366 x := v.Args[0] 1367 y := v.Args[1] 1368 v_2 := v.Args[2] 1369 if v_2.Op != OpARMMOVWconst { 1370 break 1371 } 1372 c := v_2.AuxInt 1373 flags := v.Args[3] 1374 v.reset(OpARMADCshiftLL) 1375 v.AuxInt = c 1376 v.AddArg(x) 1377 v.AddArg(y) 1378 v.AddArg(flags) 1379 return true 1380 } 1381 return false 1382 } 1383 func rewriteValueARM_OpARMADCshiftRA(v *Value) bool { 1384 b := v.Block 1385 _ = b 1386 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1387 // cond: 1388 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1389 for { 1390 d := v.AuxInt 1391 v_0 := v.Args[0] 1392 if v_0.Op != OpARMMOVWconst { 1393 break 1394 } 1395 c := v_0.AuxInt 1396 x := v.Args[1] 1397 flags := v.Args[2] 1398 v.reset(OpARMADCconst) 1399 v.AuxInt = c 1400 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1401 v0.AuxInt = d 1402 v0.AddArg(x) 1403 v.AddArg(v0) 1404 v.AddArg(flags) 1405 return true 1406 } 1407 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1408 // cond: 1409 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1410 for { 1411 d := v.AuxInt 1412 x := v.Args[0] 1413 v_1 := v.Args[1] 1414 if v_1.Op != OpARMMOVWconst { 1415 break 1416 } 1417 c := v_1.AuxInt 1418 flags := v.Args[2] 1419 v.reset(OpARMADCconst) 1420 v.AuxInt = int64(int32(c) >> uint64(d)) 1421 v.AddArg(x) 1422 v.AddArg(flags) 1423 return true 1424 } 1425 return false 1426 } 1427 func rewriteValueARM_OpARMADCshiftRAreg(v *Value) bool { 1428 b := v.Block 1429 _ = b 1430 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1431 // cond: 1432 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1433 for { 1434 v_0 := v.Args[0] 1435 if v_0.Op != OpARMMOVWconst { 1436 break 1437 } 1438 c := v_0.AuxInt 1439 x := v.Args[1] 1440 y := v.Args[2] 1441 flags := v.Args[3] 1442 v.reset(OpARMADCconst) 1443 v.AuxInt = c 1444 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1445 v0.AddArg(x) 1446 v0.AddArg(y) 1447 v.AddArg(v0) 1448 v.AddArg(flags) 1449 return true 1450 } 1451 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1452 // cond: 1453 // result: (ADCshiftRA x y [c] flags) 1454 for { 1455 x := v.Args[0] 1456 y := v.Args[1] 1457 v_2 := v.Args[2] 1458 if v_2.Op != OpARMMOVWconst { 1459 break 1460 } 1461 c := v_2.AuxInt 1462 flags := v.Args[3] 1463 v.reset(OpARMADCshiftRA) 1464 v.AuxInt = c 1465 v.AddArg(x) 1466 v.AddArg(y) 1467 v.AddArg(flags) 1468 return true 1469 } 1470 return false 1471 } 1472 func rewriteValueARM_OpARMADCshiftRL(v *Value) bool { 1473 b := v.Block 1474 _ = b 1475 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1476 // cond: 1477 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1478 for { 1479 d := v.AuxInt 1480 v_0 := v.Args[0] 1481 if v_0.Op != OpARMMOVWconst { 1482 break 1483 } 1484 c := v_0.AuxInt 1485 x := v.Args[1] 1486 flags := v.Args[2] 1487 v.reset(OpARMADCconst) 1488 v.AuxInt = c 1489 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1490 v0.AuxInt = d 1491 v0.AddArg(x) 1492 v.AddArg(v0) 1493 v.AddArg(flags) 1494 return true 1495 } 1496 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1497 // cond: 1498 // result: (ADCconst x [int64(uint32(c)>>uint64(d))] flags) 1499 for { 1500 d := v.AuxInt 1501 x := v.Args[0] 1502 v_1 := v.Args[1] 1503 if v_1.Op != OpARMMOVWconst { 1504 break 1505 } 1506 c := v_1.AuxInt 1507 flags := v.Args[2] 1508 v.reset(OpARMADCconst) 1509 v.AuxInt = int64(uint32(c) >> uint64(d)) 1510 v.AddArg(x) 1511 v.AddArg(flags) 1512 return true 1513 } 1514 return false 1515 } 1516 func rewriteValueARM_OpARMADCshiftRLreg(v *Value) bool { 1517 b := v.Block 1518 _ = b 1519 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1520 // cond: 1521 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1522 for { 1523 v_0 := v.Args[0] 1524 if v_0.Op != OpARMMOVWconst { 1525 break 1526 } 1527 c := v_0.AuxInt 1528 x := v.Args[1] 1529 y := v.Args[2] 1530 flags := v.Args[3] 1531 v.reset(OpARMADCconst) 1532 v.AuxInt = c 1533 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1534 v0.AddArg(x) 1535 v0.AddArg(y) 1536 v.AddArg(v0) 1537 v.AddArg(flags) 1538 return true 1539 } 1540 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1541 // cond: 1542 // result: (ADCshiftRL x y [c] flags) 1543 for { 1544 x := v.Args[0] 1545 y := v.Args[1] 1546 v_2 := v.Args[2] 1547 if v_2.Op != OpARMMOVWconst { 1548 break 1549 } 1550 c := v_2.AuxInt 1551 flags := v.Args[3] 1552 v.reset(OpARMADCshiftRL) 1553 v.AuxInt = c 1554 v.AddArg(x) 1555 v.AddArg(y) 1556 v.AddArg(flags) 1557 return true 1558 } 1559 return false 1560 } 1561 func rewriteValueARM_OpARMADD(v *Value) bool { 1562 b := v.Block 1563 _ = b 1564 // match: (ADD x (MOVWconst [c])) 1565 // cond: 1566 // result: (ADDconst [c] x) 1567 for { 1568 x := v.Args[0] 1569 v_1 := v.Args[1] 1570 if v_1.Op != OpARMMOVWconst { 1571 break 1572 } 1573 c := v_1.AuxInt 1574 v.reset(OpARMADDconst) 1575 v.AuxInt = c 1576 v.AddArg(x) 1577 return true 1578 } 1579 // match: (ADD (MOVWconst [c]) x) 1580 // cond: 1581 // result: (ADDconst [c] x) 1582 for { 1583 v_0 := v.Args[0] 1584 if v_0.Op != OpARMMOVWconst { 1585 break 1586 } 1587 c := v_0.AuxInt 1588 x := v.Args[1] 1589 v.reset(OpARMADDconst) 1590 v.AuxInt = c 1591 v.AddArg(x) 1592 return true 1593 } 1594 // match: (ADD x (SLLconst [c] y)) 1595 // cond: 1596 // result: (ADDshiftLL x y [c]) 1597 for { 1598 x := v.Args[0] 1599 v_1 := v.Args[1] 1600 if v_1.Op != OpARMSLLconst { 1601 break 1602 } 1603 c := v_1.AuxInt 1604 y := v_1.Args[0] 1605 v.reset(OpARMADDshiftLL) 1606 v.AuxInt = c 1607 v.AddArg(x) 1608 v.AddArg(y) 1609 return true 1610 } 1611 // match: (ADD (SLLconst [c] y) x) 1612 // cond: 1613 // result: (ADDshiftLL x y [c]) 1614 for { 1615 v_0 := v.Args[0] 1616 if v_0.Op != OpARMSLLconst { 1617 break 1618 } 1619 c := v_0.AuxInt 1620 y := v_0.Args[0] 1621 x := v.Args[1] 1622 v.reset(OpARMADDshiftLL) 1623 v.AuxInt = c 1624 v.AddArg(x) 1625 v.AddArg(y) 1626 return true 1627 } 1628 // match: (ADD x (SRLconst [c] y)) 1629 // cond: 1630 // result: (ADDshiftRL x y [c]) 1631 for { 1632 x := v.Args[0] 1633 v_1 := v.Args[1] 1634 if v_1.Op != OpARMSRLconst { 1635 break 1636 } 1637 c := v_1.AuxInt 1638 y := v_1.Args[0] 1639 v.reset(OpARMADDshiftRL) 1640 v.AuxInt = c 1641 v.AddArg(x) 1642 v.AddArg(y) 1643 return true 1644 } 1645 // match: (ADD (SRLconst [c] y) x) 1646 // cond: 1647 // result: (ADDshiftRL x y [c]) 1648 for { 1649 v_0 := v.Args[0] 1650 if v_0.Op != OpARMSRLconst { 1651 break 1652 } 1653 c := v_0.AuxInt 1654 y := v_0.Args[0] 1655 x := v.Args[1] 1656 v.reset(OpARMADDshiftRL) 1657 v.AuxInt = c 1658 v.AddArg(x) 1659 v.AddArg(y) 1660 return true 1661 } 1662 // match: (ADD x (SRAconst [c] y)) 1663 // cond: 1664 // result: (ADDshiftRA x y [c]) 1665 for { 1666 x := v.Args[0] 1667 v_1 := v.Args[1] 1668 if v_1.Op != OpARMSRAconst { 1669 break 1670 } 1671 c := v_1.AuxInt 1672 y := v_1.Args[0] 1673 v.reset(OpARMADDshiftRA) 1674 v.AuxInt = c 1675 v.AddArg(x) 1676 v.AddArg(y) 1677 return true 1678 } 1679 // match: (ADD (SRAconst [c] y) x) 1680 // cond: 1681 // result: (ADDshiftRA x y [c]) 1682 for { 1683 v_0 := v.Args[0] 1684 if v_0.Op != OpARMSRAconst { 1685 break 1686 } 1687 c := v_0.AuxInt 1688 y := v_0.Args[0] 1689 x := v.Args[1] 1690 v.reset(OpARMADDshiftRA) 1691 v.AuxInt = c 1692 v.AddArg(x) 1693 v.AddArg(y) 1694 return true 1695 } 1696 // match: (ADD x (SLL y z)) 1697 // cond: 1698 // result: (ADDshiftLLreg x y z) 1699 for { 1700 x := v.Args[0] 1701 v_1 := v.Args[1] 1702 if v_1.Op != OpARMSLL { 1703 break 1704 } 1705 y := v_1.Args[0] 1706 z := v_1.Args[1] 1707 v.reset(OpARMADDshiftLLreg) 1708 v.AddArg(x) 1709 v.AddArg(y) 1710 v.AddArg(z) 1711 return true 1712 } 1713 // match: (ADD (SLL y z) x) 1714 // cond: 1715 // result: (ADDshiftLLreg x y z) 1716 for { 1717 v_0 := v.Args[0] 1718 if v_0.Op != OpARMSLL { 1719 break 1720 } 1721 y := v_0.Args[0] 1722 z := v_0.Args[1] 1723 x := v.Args[1] 1724 v.reset(OpARMADDshiftLLreg) 1725 v.AddArg(x) 1726 v.AddArg(y) 1727 v.AddArg(z) 1728 return true 1729 } 1730 // match: (ADD x (SRL y z)) 1731 // cond: 1732 // result: (ADDshiftRLreg x y z) 1733 for { 1734 x := v.Args[0] 1735 v_1 := v.Args[1] 1736 if v_1.Op != OpARMSRL { 1737 break 1738 } 1739 y := v_1.Args[0] 1740 z := v_1.Args[1] 1741 v.reset(OpARMADDshiftRLreg) 1742 v.AddArg(x) 1743 v.AddArg(y) 1744 v.AddArg(z) 1745 return true 1746 } 1747 // match: (ADD (SRL y z) x) 1748 // cond: 1749 // result: (ADDshiftRLreg x y z) 1750 for { 1751 v_0 := v.Args[0] 1752 if v_0.Op != OpARMSRL { 1753 break 1754 } 1755 y := v_0.Args[0] 1756 z := v_0.Args[1] 1757 x := v.Args[1] 1758 v.reset(OpARMADDshiftRLreg) 1759 v.AddArg(x) 1760 v.AddArg(y) 1761 v.AddArg(z) 1762 return true 1763 } 1764 // match: (ADD x (SRA y z)) 1765 // cond: 1766 // result: (ADDshiftRAreg x y z) 1767 for { 1768 x := v.Args[0] 1769 v_1 := v.Args[1] 1770 if v_1.Op != OpARMSRA { 1771 break 1772 } 1773 y := v_1.Args[0] 1774 z := v_1.Args[1] 1775 v.reset(OpARMADDshiftRAreg) 1776 v.AddArg(x) 1777 v.AddArg(y) 1778 v.AddArg(z) 1779 return true 1780 } 1781 // match: (ADD (SRA y z) x) 1782 // cond: 1783 // result: (ADDshiftRAreg x y z) 1784 for { 1785 v_0 := v.Args[0] 1786 if v_0.Op != OpARMSRA { 1787 break 1788 } 1789 y := v_0.Args[0] 1790 z := v_0.Args[1] 1791 x := v.Args[1] 1792 v.reset(OpARMADDshiftRAreg) 1793 v.AddArg(x) 1794 v.AddArg(y) 1795 v.AddArg(z) 1796 return true 1797 } 1798 // match: (ADD x (RSBconst [0] y)) 1799 // cond: 1800 // result: (SUB x y) 1801 for { 1802 x := v.Args[0] 1803 v_1 := v.Args[1] 1804 if v_1.Op != OpARMRSBconst { 1805 break 1806 } 1807 if v_1.AuxInt != 0 { 1808 break 1809 } 1810 y := v_1.Args[0] 1811 v.reset(OpARMSUB) 1812 v.AddArg(x) 1813 v.AddArg(y) 1814 return true 1815 } 1816 // match: (ADD (RSBconst [0] y) x) 1817 // cond: 1818 // result: (SUB x y) 1819 for { 1820 v_0 := v.Args[0] 1821 if v_0.Op != OpARMRSBconst { 1822 break 1823 } 1824 if v_0.AuxInt != 0 { 1825 break 1826 } 1827 y := v_0.Args[0] 1828 x := v.Args[1] 1829 v.reset(OpARMSUB) 1830 v.AddArg(x) 1831 v.AddArg(y) 1832 return true 1833 } 1834 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 1835 // cond: 1836 // result: (RSBconst [c+d] (ADD <t> x y)) 1837 for { 1838 t := v.Type 1839 v_0 := v.Args[0] 1840 if v_0.Op != OpARMRSBconst { 1841 break 1842 } 1843 c := v_0.AuxInt 1844 x := v_0.Args[0] 1845 v_1 := v.Args[1] 1846 if v_1.Op != OpARMRSBconst { 1847 break 1848 } 1849 d := v_1.AuxInt 1850 y := v_1.Args[0] 1851 v.reset(OpARMRSBconst) 1852 v.AuxInt = c + d 1853 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1854 v0.AddArg(x) 1855 v0.AddArg(y) 1856 v.AddArg(v0) 1857 return true 1858 } 1859 // match: (ADD <t> (RSBconst [d] y) (RSBconst [c] x)) 1860 // cond: 1861 // result: (RSBconst [c+d] (ADD <t> x y)) 1862 for { 1863 t := v.Type 1864 v_0 := v.Args[0] 1865 if v_0.Op != OpARMRSBconst { 1866 break 1867 } 1868 d := v_0.AuxInt 1869 y := v_0.Args[0] 1870 v_1 := v.Args[1] 1871 if v_1.Op != OpARMRSBconst { 1872 break 1873 } 1874 c := v_1.AuxInt 1875 x := v_1.Args[0] 1876 v.reset(OpARMRSBconst) 1877 v.AuxInt = c + d 1878 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1879 v0.AddArg(x) 1880 v0.AddArg(y) 1881 v.AddArg(v0) 1882 return true 1883 } 1884 // match: (ADD (MUL x y) a) 1885 // cond: 1886 // result: (MULA x y a) 1887 for { 1888 v_0 := v.Args[0] 1889 if v_0.Op != OpARMMUL { 1890 break 1891 } 1892 x := v_0.Args[0] 1893 y := v_0.Args[1] 1894 a := v.Args[1] 1895 v.reset(OpARMMULA) 1896 v.AddArg(x) 1897 v.AddArg(y) 1898 v.AddArg(a) 1899 return true 1900 } 1901 // match: (ADD a (MUL x y)) 1902 // cond: 1903 // result: (MULA x y a) 1904 for { 1905 a := v.Args[0] 1906 v_1 := v.Args[1] 1907 if v_1.Op != OpARMMUL { 1908 break 1909 } 1910 x := v_1.Args[0] 1911 y := v_1.Args[1] 1912 v.reset(OpARMMULA) 1913 v.AddArg(x) 1914 v.AddArg(y) 1915 v.AddArg(a) 1916 return true 1917 } 1918 return false 1919 } 1920 func rewriteValueARM_OpARMADDS(v *Value) bool { 1921 // match: (ADDS x (MOVWconst [c])) 1922 // cond: 1923 // result: (ADDSconst [c] x) 1924 for { 1925 x := v.Args[0] 1926 v_1 := v.Args[1] 1927 if v_1.Op != OpARMMOVWconst { 1928 break 1929 } 1930 c := v_1.AuxInt 1931 v.reset(OpARMADDSconst) 1932 v.AuxInt = c 1933 v.AddArg(x) 1934 return true 1935 } 1936 // match: (ADDS (MOVWconst [c]) x) 1937 // cond: 1938 // result: (ADDSconst [c] x) 1939 for { 1940 v_0 := v.Args[0] 1941 if v_0.Op != OpARMMOVWconst { 1942 break 1943 } 1944 c := v_0.AuxInt 1945 x := v.Args[1] 1946 v.reset(OpARMADDSconst) 1947 v.AuxInt = c 1948 v.AddArg(x) 1949 return true 1950 } 1951 // match: (ADDS x (SLLconst [c] y)) 1952 // cond: 1953 // result: (ADDSshiftLL x y [c]) 1954 for { 1955 x := v.Args[0] 1956 v_1 := v.Args[1] 1957 if v_1.Op != OpARMSLLconst { 1958 break 1959 } 1960 c := v_1.AuxInt 1961 y := v_1.Args[0] 1962 v.reset(OpARMADDSshiftLL) 1963 v.AuxInt = c 1964 v.AddArg(x) 1965 v.AddArg(y) 1966 return true 1967 } 1968 // match: (ADDS (SLLconst [c] y) x) 1969 // cond: 1970 // result: (ADDSshiftLL x y [c]) 1971 for { 1972 v_0 := v.Args[0] 1973 if v_0.Op != OpARMSLLconst { 1974 break 1975 } 1976 c := v_0.AuxInt 1977 y := v_0.Args[0] 1978 x := v.Args[1] 1979 v.reset(OpARMADDSshiftLL) 1980 v.AuxInt = c 1981 v.AddArg(x) 1982 v.AddArg(y) 1983 return true 1984 } 1985 // match: (ADDS x (SRLconst [c] y)) 1986 // cond: 1987 // result: (ADDSshiftRL x y [c]) 1988 for { 1989 x := v.Args[0] 1990 v_1 := v.Args[1] 1991 if v_1.Op != OpARMSRLconst { 1992 break 1993 } 1994 c := v_1.AuxInt 1995 y := v_1.Args[0] 1996 v.reset(OpARMADDSshiftRL) 1997 v.AuxInt = c 1998 v.AddArg(x) 1999 v.AddArg(y) 2000 return true 2001 } 2002 // match: (ADDS (SRLconst [c] y) x) 2003 // cond: 2004 // result: (ADDSshiftRL x y [c]) 2005 for { 2006 v_0 := v.Args[0] 2007 if v_0.Op != OpARMSRLconst { 2008 break 2009 } 2010 c := v_0.AuxInt 2011 y := v_0.Args[0] 2012 x := v.Args[1] 2013 v.reset(OpARMADDSshiftRL) 2014 v.AuxInt = c 2015 v.AddArg(x) 2016 v.AddArg(y) 2017 return true 2018 } 2019 // match: (ADDS x (SRAconst [c] y)) 2020 // cond: 2021 // result: (ADDSshiftRA x y [c]) 2022 for { 2023 x := v.Args[0] 2024 v_1 := v.Args[1] 2025 if v_1.Op != OpARMSRAconst { 2026 break 2027 } 2028 c := v_1.AuxInt 2029 y := v_1.Args[0] 2030 v.reset(OpARMADDSshiftRA) 2031 v.AuxInt = c 2032 v.AddArg(x) 2033 v.AddArg(y) 2034 return true 2035 } 2036 // match: (ADDS (SRAconst [c] y) x) 2037 // cond: 2038 // result: (ADDSshiftRA x y [c]) 2039 for { 2040 v_0 := v.Args[0] 2041 if v_0.Op != OpARMSRAconst { 2042 break 2043 } 2044 c := v_0.AuxInt 2045 y := v_0.Args[0] 2046 x := v.Args[1] 2047 v.reset(OpARMADDSshiftRA) 2048 v.AuxInt = c 2049 v.AddArg(x) 2050 v.AddArg(y) 2051 return true 2052 } 2053 // match: (ADDS x (SLL y z)) 2054 // cond: 2055 // result: (ADDSshiftLLreg x y z) 2056 for { 2057 x := v.Args[0] 2058 v_1 := v.Args[1] 2059 if v_1.Op != OpARMSLL { 2060 break 2061 } 2062 y := v_1.Args[0] 2063 z := v_1.Args[1] 2064 v.reset(OpARMADDSshiftLLreg) 2065 v.AddArg(x) 2066 v.AddArg(y) 2067 v.AddArg(z) 2068 return true 2069 } 2070 // match: (ADDS (SLL y z) x) 2071 // cond: 2072 // result: (ADDSshiftLLreg x y z) 2073 for { 2074 v_0 := v.Args[0] 2075 if v_0.Op != OpARMSLL { 2076 break 2077 } 2078 y := v_0.Args[0] 2079 z := v_0.Args[1] 2080 x := v.Args[1] 2081 v.reset(OpARMADDSshiftLLreg) 2082 v.AddArg(x) 2083 v.AddArg(y) 2084 v.AddArg(z) 2085 return true 2086 } 2087 // match: (ADDS x (SRL y z)) 2088 // cond: 2089 // result: (ADDSshiftRLreg x y z) 2090 for { 2091 x := v.Args[0] 2092 v_1 := v.Args[1] 2093 if v_1.Op != OpARMSRL { 2094 break 2095 } 2096 y := v_1.Args[0] 2097 z := v_1.Args[1] 2098 v.reset(OpARMADDSshiftRLreg) 2099 v.AddArg(x) 2100 v.AddArg(y) 2101 v.AddArg(z) 2102 return true 2103 } 2104 // match: (ADDS (SRL y z) x) 2105 // cond: 2106 // result: (ADDSshiftRLreg x y z) 2107 for { 2108 v_0 := v.Args[0] 2109 if v_0.Op != OpARMSRL { 2110 break 2111 } 2112 y := v_0.Args[0] 2113 z := v_0.Args[1] 2114 x := v.Args[1] 2115 v.reset(OpARMADDSshiftRLreg) 2116 v.AddArg(x) 2117 v.AddArg(y) 2118 v.AddArg(z) 2119 return true 2120 } 2121 // match: (ADDS x (SRA y z)) 2122 // cond: 2123 // result: (ADDSshiftRAreg x y z) 2124 for { 2125 x := v.Args[0] 2126 v_1 := v.Args[1] 2127 if v_1.Op != OpARMSRA { 2128 break 2129 } 2130 y := v_1.Args[0] 2131 z := v_1.Args[1] 2132 v.reset(OpARMADDSshiftRAreg) 2133 v.AddArg(x) 2134 v.AddArg(y) 2135 v.AddArg(z) 2136 return true 2137 } 2138 // match: (ADDS (SRA y z) x) 2139 // cond: 2140 // result: (ADDSshiftRAreg x y z) 2141 for { 2142 v_0 := v.Args[0] 2143 if v_0.Op != OpARMSRA { 2144 break 2145 } 2146 y := v_0.Args[0] 2147 z := v_0.Args[1] 2148 x := v.Args[1] 2149 v.reset(OpARMADDSshiftRAreg) 2150 v.AddArg(x) 2151 v.AddArg(y) 2152 v.AddArg(z) 2153 return true 2154 } 2155 return false 2156 } 2157 func rewriteValueARM_OpARMADDSshiftLL(v *Value) bool { 2158 b := v.Block 2159 _ = b 2160 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 2161 // cond: 2162 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 2163 for { 2164 d := v.AuxInt 2165 v_0 := v.Args[0] 2166 if v_0.Op != OpARMMOVWconst { 2167 break 2168 } 2169 c := v_0.AuxInt 2170 x := v.Args[1] 2171 v.reset(OpARMADDSconst) 2172 v.AuxInt = c 2173 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2174 v0.AuxInt = d 2175 v0.AddArg(x) 2176 v.AddArg(v0) 2177 return true 2178 } 2179 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 2180 // cond: 2181 // result: (ADDSconst x [int64(uint32(c)<<uint64(d))]) 2182 for { 2183 d := v.AuxInt 2184 x := v.Args[0] 2185 v_1 := v.Args[1] 2186 if v_1.Op != OpARMMOVWconst { 2187 break 2188 } 2189 c := v_1.AuxInt 2190 v.reset(OpARMADDSconst) 2191 v.AuxInt = int64(uint32(c) << uint64(d)) 2192 v.AddArg(x) 2193 return true 2194 } 2195 return false 2196 } 2197 func rewriteValueARM_OpARMADDSshiftLLreg(v *Value) bool { 2198 b := v.Block 2199 _ = b 2200 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 2201 // cond: 2202 // result: (ADDSconst [c] (SLL <x.Type> x y)) 2203 for { 2204 v_0 := v.Args[0] 2205 if v_0.Op != OpARMMOVWconst { 2206 break 2207 } 2208 c := v_0.AuxInt 2209 x := v.Args[1] 2210 y := v.Args[2] 2211 v.reset(OpARMADDSconst) 2212 v.AuxInt = c 2213 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2214 v0.AddArg(x) 2215 v0.AddArg(y) 2216 v.AddArg(v0) 2217 return true 2218 } 2219 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 2220 // cond: 2221 // result: (ADDSshiftLL x y [c]) 2222 for { 2223 x := v.Args[0] 2224 y := v.Args[1] 2225 v_2 := v.Args[2] 2226 if v_2.Op != OpARMMOVWconst { 2227 break 2228 } 2229 c := v_2.AuxInt 2230 v.reset(OpARMADDSshiftLL) 2231 v.AuxInt = c 2232 v.AddArg(x) 2233 v.AddArg(y) 2234 return true 2235 } 2236 return false 2237 } 2238 func rewriteValueARM_OpARMADDSshiftRA(v *Value) bool { 2239 b := v.Block 2240 _ = b 2241 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 2242 // cond: 2243 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 2244 for { 2245 d := v.AuxInt 2246 v_0 := v.Args[0] 2247 if v_0.Op != OpARMMOVWconst { 2248 break 2249 } 2250 c := v_0.AuxInt 2251 x := v.Args[1] 2252 v.reset(OpARMADDSconst) 2253 v.AuxInt = c 2254 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2255 v0.AuxInt = d 2256 v0.AddArg(x) 2257 v.AddArg(v0) 2258 return true 2259 } 2260 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 2261 // cond: 2262 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 2263 for { 2264 d := v.AuxInt 2265 x := v.Args[0] 2266 v_1 := v.Args[1] 2267 if v_1.Op != OpARMMOVWconst { 2268 break 2269 } 2270 c := v_1.AuxInt 2271 v.reset(OpARMADDSconst) 2272 v.AuxInt = int64(int32(c) >> uint64(d)) 2273 v.AddArg(x) 2274 return true 2275 } 2276 return false 2277 } 2278 func rewriteValueARM_OpARMADDSshiftRAreg(v *Value) bool { 2279 b := v.Block 2280 _ = b 2281 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 2282 // cond: 2283 // result: (ADDSconst [c] (SRA <x.Type> x y)) 2284 for { 2285 v_0 := v.Args[0] 2286 if v_0.Op != OpARMMOVWconst { 2287 break 2288 } 2289 c := v_0.AuxInt 2290 x := v.Args[1] 2291 y := v.Args[2] 2292 v.reset(OpARMADDSconst) 2293 v.AuxInt = c 2294 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2295 v0.AddArg(x) 2296 v0.AddArg(y) 2297 v.AddArg(v0) 2298 return true 2299 } 2300 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 2301 // cond: 2302 // result: (ADDSshiftRA x y [c]) 2303 for { 2304 x := v.Args[0] 2305 y := v.Args[1] 2306 v_2 := v.Args[2] 2307 if v_2.Op != OpARMMOVWconst { 2308 break 2309 } 2310 c := v_2.AuxInt 2311 v.reset(OpARMADDSshiftRA) 2312 v.AuxInt = c 2313 v.AddArg(x) 2314 v.AddArg(y) 2315 return true 2316 } 2317 return false 2318 } 2319 func rewriteValueARM_OpARMADDSshiftRL(v *Value) bool { 2320 b := v.Block 2321 _ = b 2322 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2323 // cond: 2324 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2325 for { 2326 d := v.AuxInt 2327 v_0 := v.Args[0] 2328 if v_0.Op != OpARMMOVWconst { 2329 break 2330 } 2331 c := v_0.AuxInt 2332 x := v.Args[1] 2333 v.reset(OpARMADDSconst) 2334 v.AuxInt = c 2335 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2336 v0.AuxInt = d 2337 v0.AddArg(x) 2338 v.AddArg(v0) 2339 return true 2340 } 2341 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2342 // cond: 2343 // result: (ADDSconst x [int64(uint32(c)>>uint64(d))]) 2344 for { 2345 d := v.AuxInt 2346 x := v.Args[0] 2347 v_1 := v.Args[1] 2348 if v_1.Op != OpARMMOVWconst { 2349 break 2350 } 2351 c := v_1.AuxInt 2352 v.reset(OpARMADDSconst) 2353 v.AuxInt = int64(uint32(c) >> uint64(d)) 2354 v.AddArg(x) 2355 return true 2356 } 2357 return false 2358 } 2359 func rewriteValueARM_OpARMADDSshiftRLreg(v *Value) bool { 2360 b := v.Block 2361 _ = b 2362 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2363 // cond: 2364 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2365 for { 2366 v_0 := v.Args[0] 2367 if v_0.Op != OpARMMOVWconst { 2368 break 2369 } 2370 c := v_0.AuxInt 2371 x := v.Args[1] 2372 y := v.Args[2] 2373 v.reset(OpARMADDSconst) 2374 v.AuxInt = c 2375 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2376 v0.AddArg(x) 2377 v0.AddArg(y) 2378 v.AddArg(v0) 2379 return true 2380 } 2381 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2382 // cond: 2383 // result: (ADDSshiftRL x y [c]) 2384 for { 2385 x := v.Args[0] 2386 y := v.Args[1] 2387 v_2 := v.Args[2] 2388 if v_2.Op != OpARMMOVWconst { 2389 break 2390 } 2391 c := v_2.AuxInt 2392 v.reset(OpARMADDSshiftRL) 2393 v.AuxInt = c 2394 v.AddArg(x) 2395 v.AddArg(y) 2396 return true 2397 } 2398 return false 2399 } 2400 func rewriteValueARM_OpARMADDconst(v *Value) bool { 2401 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2402 // cond: 2403 // result: (MOVWaddr [off1+off2] {sym} ptr) 2404 for { 2405 off1 := v.AuxInt 2406 v_0 := v.Args[0] 2407 if v_0.Op != OpARMMOVWaddr { 2408 break 2409 } 2410 off2 := v_0.AuxInt 2411 sym := v_0.Aux 2412 ptr := v_0.Args[0] 2413 v.reset(OpARMMOVWaddr) 2414 v.AuxInt = off1 + off2 2415 v.Aux = sym 2416 v.AddArg(ptr) 2417 return true 2418 } 2419 // match: (ADDconst [0] x) 2420 // cond: 2421 // result: x 2422 for { 2423 if v.AuxInt != 0 { 2424 break 2425 } 2426 x := v.Args[0] 2427 v.reset(OpCopy) 2428 v.Type = x.Type 2429 v.AddArg(x) 2430 return true 2431 } 2432 // match: (ADDconst [c] (MOVWconst [d])) 2433 // cond: 2434 // result: (MOVWconst [int64(int32(c+d))]) 2435 for { 2436 c := v.AuxInt 2437 v_0 := v.Args[0] 2438 if v_0.Op != OpARMMOVWconst { 2439 break 2440 } 2441 d := v_0.AuxInt 2442 v.reset(OpARMMOVWconst) 2443 v.AuxInt = int64(int32(c + d)) 2444 return true 2445 } 2446 // match: (ADDconst [c] (ADDconst [d] x)) 2447 // cond: 2448 // result: (ADDconst [int64(int32(c+d))] x) 2449 for { 2450 c := v.AuxInt 2451 v_0 := v.Args[0] 2452 if v_0.Op != OpARMADDconst { 2453 break 2454 } 2455 d := v_0.AuxInt 2456 x := v_0.Args[0] 2457 v.reset(OpARMADDconst) 2458 v.AuxInt = int64(int32(c + d)) 2459 v.AddArg(x) 2460 return true 2461 } 2462 // match: (ADDconst [c] (SUBconst [d] x)) 2463 // cond: 2464 // result: (ADDconst [int64(int32(c-d))] x) 2465 for { 2466 c := v.AuxInt 2467 v_0 := v.Args[0] 2468 if v_0.Op != OpARMSUBconst { 2469 break 2470 } 2471 d := v_0.AuxInt 2472 x := v_0.Args[0] 2473 v.reset(OpARMADDconst) 2474 v.AuxInt = int64(int32(c - d)) 2475 v.AddArg(x) 2476 return true 2477 } 2478 // match: (ADDconst [c] (RSBconst [d] x)) 2479 // cond: 2480 // result: (RSBconst [int64(int32(c+d))] x) 2481 for { 2482 c := v.AuxInt 2483 v_0 := v.Args[0] 2484 if v_0.Op != OpARMRSBconst { 2485 break 2486 } 2487 d := v_0.AuxInt 2488 x := v_0.Args[0] 2489 v.reset(OpARMRSBconst) 2490 v.AuxInt = int64(int32(c + d)) 2491 v.AddArg(x) 2492 return true 2493 } 2494 return false 2495 } 2496 func rewriteValueARM_OpARMADDshiftLL(v *Value) bool { 2497 b := v.Block 2498 _ = b 2499 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2500 // cond: 2501 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2502 for { 2503 d := v.AuxInt 2504 v_0 := v.Args[0] 2505 if v_0.Op != OpARMMOVWconst { 2506 break 2507 } 2508 c := v_0.AuxInt 2509 x := v.Args[1] 2510 v.reset(OpARMADDconst) 2511 v.AuxInt = c 2512 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2513 v0.AuxInt = d 2514 v0.AddArg(x) 2515 v.AddArg(v0) 2516 return true 2517 } 2518 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2519 // cond: 2520 // result: (ADDconst x [int64(uint32(c)<<uint64(d))]) 2521 for { 2522 d := v.AuxInt 2523 x := v.Args[0] 2524 v_1 := v.Args[1] 2525 if v_1.Op != OpARMMOVWconst { 2526 break 2527 } 2528 c := v_1.AuxInt 2529 v.reset(OpARMADDconst) 2530 v.AuxInt = int64(uint32(c) << uint64(d)) 2531 v.AddArg(x) 2532 return true 2533 } 2534 // match: (ADDshiftLL [c] (SRLconst x [32-c]) x) 2535 // cond: 2536 // result: (SRRconst [32-c] x) 2537 for { 2538 c := v.AuxInt 2539 v_0 := v.Args[0] 2540 if v_0.Op != OpARMSRLconst { 2541 break 2542 } 2543 if v_0.AuxInt != 32-c { 2544 break 2545 } 2546 x := v_0.Args[0] 2547 if x != v.Args[1] { 2548 break 2549 } 2550 v.reset(OpARMSRRconst) 2551 v.AuxInt = 32 - c 2552 v.AddArg(x) 2553 return true 2554 } 2555 return false 2556 } 2557 func rewriteValueARM_OpARMADDshiftLLreg(v *Value) bool { 2558 b := v.Block 2559 _ = b 2560 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2561 // cond: 2562 // result: (ADDconst [c] (SLL <x.Type> x y)) 2563 for { 2564 v_0 := v.Args[0] 2565 if v_0.Op != OpARMMOVWconst { 2566 break 2567 } 2568 c := v_0.AuxInt 2569 x := v.Args[1] 2570 y := v.Args[2] 2571 v.reset(OpARMADDconst) 2572 v.AuxInt = c 2573 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2574 v0.AddArg(x) 2575 v0.AddArg(y) 2576 v.AddArg(v0) 2577 return true 2578 } 2579 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2580 // cond: 2581 // result: (ADDshiftLL x y [c]) 2582 for { 2583 x := v.Args[0] 2584 y := v.Args[1] 2585 v_2 := v.Args[2] 2586 if v_2.Op != OpARMMOVWconst { 2587 break 2588 } 2589 c := v_2.AuxInt 2590 v.reset(OpARMADDshiftLL) 2591 v.AuxInt = c 2592 v.AddArg(x) 2593 v.AddArg(y) 2594 return true 2595 } 2596 return false 2597 } 2598 func rewriteValueARM_OpARMADDshiftRA(v *Value) bool { 2599 b := v.Block 2600 _ = b 2601 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 2602 // cond: 2603 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 2604 for { 2605 d := v.AuxInt 2606 v_0 := v.Args[0] 2607 if v_0.Op != OpARMMOVWconst { 2608 break 2609 } 2610 c := v_0.AuxInt 2611 x := v.Args[1] 2612 v.reset(OpARMADDconst) 2613 v.AuxInt = c 2614 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2615 v0.AuxInt = d 2616 v0.AddArg(x) 2617 v.AddArg(v0) 2618 return true 2619 } 2620 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 2621 // cond: 2622 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 2623 for { 2624 d := v.AuxInt 2625 x := v.Args[0] 2626 v_1 := v.Args[1] 2627 if v_1.Op != OpARMMOVWconst { 2628 break 2629 } 2630 c := v_1.AuxInt 2631 v.reset(OpARMADDconst) 2632 v.AuxInt = int64(int32(c) >> uint64(d)) 2633 v.AddArg(x) 2634 return true 2635 } 2636 return false 2637 } 2638 func rewriteValueARM_OpARMADDshiftRAreg(v *Value) bool { 2639 b := v.Block 2640 _ = b 2641 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 2642 // cond: 2643 // result: (ADDconst [c] (SRA <x.Type> x y)) 2644 for { 2645 v_0 := v.Args[0] 2646 if v_0.Op != OpARMMOVWconst { 2647 break 2648 } 2649 c := v_0.AuxInt 2650 x := v.Args[1] 2651 y := v.Args[2] 2652 v.reset(OpARMADDconst) 2653 v.AuxInt = c 2654 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2655 v0.AddArg(x) 2656 v0.AddArg(y) 2657 v.AddArg(v0) 2658 return true 2659 } 2660 // match: (ADDshiftRAreg x y (MOVWconst [c])) 2661 // cond: 2662 // result: (ADDshiftRA x y [c]) 2663 for { 2664 x := v.Args[0] 2665 y := v.Args[1] 2666 v_2 := v.Args[2] 2667 if v_2.Op != OpARMMOVWconst { 2668 break 2669 } 2670 c := v_2.AuxInt 2671 v.reset(OpARMADDshiftRA) 2672 v.AuxInt = c 2673 v.AddArg(x) 2674 v.AddArg(y) 2675 return true 2676 } 2677 return false 2678 } 2679 func rewriteValueARM_OpARMADDshiftRL(v *Value) bool { 2680 b := v.Block 2681 _ = b 2682 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 2683 // cond: 2684 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 2685 for { 2686 d := v.AuxInt 2687 v_0 := v.Args[0] 2688 if v_0.Op != OpARMMOVWconst { 2689 break 2690 } 2691 c := v_0.AuxInt 2692 x := v.Args[1] 2693 v.reset(OpARMADDconst) 2694 v.AuxInt = c 2695 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2696 v0.AuxInt = d 2697 v0.AddArg(x) 2698 v.AddArg(v0) 2699 return true 2700 } 2701 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 2702 // cond: 2703 // result: (ADDconst x [int64(uint32(c)>>uint64(d))]) 2704 for { 2705 d := v.AuxInt 2706 x := v.Args[0] 2707 v_1 := v.Args[1] 2708 if v_1.Op != OpARMMOVWconst { 2709 break 2710 } 2711 c := v_1.AuxInt 2712 v.reset(OpARMADDconst) 2713 v.AuxInt = int64(uint32(c) >> uint64(d)) 2714 v.AddArg(x) 2715 return true 2716 } 2717 // match: (ADDshiftRL [c] (SLLconst x [32-c]) x) 2718 // cond: 2719 // result: (SRRconst [ c] x) 2720 for { 2721 c := v.AuxInt 2722 v_0 := v.Args[0] 2723 if v_0.Op != OpARMSLLconst { 2724 break 2725 } 2726 if v_0.AuxInt != 32-c { 2727 break 2728 } 2729 x := v_0.Args[0] 2730 if x != v.Args[1] { 2731 break 2732 } 2733 v.reset(OpARMSRRconst) 2734 v.AuxInt = c 2735 v.AddArg(x) 2736 return true 2737 } 2738 return false 2739 } 2740 func rewriteValueARM_OpARMADDshiftRLreg(v *Value) bool { 2741 b := v.Block 2742 _ = b 2743 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 2744 // cond: 2745 // result: (ADDconst [c] (SRL <x.Type> x y)) 2746 for { 2747 v_0 := v.Args[0] 2748 if v_0.Op != OpARMMOVWconst { 2749 break 2750 } 2751 c := v_0.AuxInt 2752 x := v.Args[1] 2753 y := v.Args[2] 2754 v.reset(OpARMADDconst) 2755 v.AuxInt = c 2756 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2757 v0.AddArg(x) 2758 v0.AddArg(y) 2759 v.AddArg(v0) 2760 return true 2761 } 2762 // match: (ADDshiftRLreg x y (MOVWconst [c])) 2763 // cond: 2764 // result: (ADDshiftRL x y [c]) 2765 for { 2766 x := v.Args[0] 2767 y := v.Args[1] 2768 v_2 := v.Args[2] 2769 if v_2.Op != OpARMMOVWconst { 2770 break 2771 } 2772 c := v_2.AuxInt 2773 v.reset(OpARMADDshiftRL) 2774 v.AuxInt = c 2775 v.AddArg(x) 2776 v.AddArg(y) 2777 return true 2778 } 2779 return false 2780 } 2781 func rewriteValueARM_OpARMAND(v *Value) bool { 2782 // match: (AND x (MOVWconst [c])) 2783 // cond: 2784 // result: (ANDconst [c] x) 2785 for { 2786 x := v.Args[0] 2787 v_1 := v.Args[1] 2788 if v_1.Op != OpARMMOVWconst { 2789 break 2790 } 2791 c := v_1.AuxInt 2792 v.reset(OpARMANDconst) 2793 v.AuxInt = c 2794 v.AddArg(x) 2795 return true 2796 } 2797 // match: (AND (MOVWconst [c]) x) 2798 // cond: 2799 // result: (ANDconst [c] x) 2800 for { 2801 v_0 := v.Args[0] 2802 if v_0.Op != OpARMMOVWconst { 2803 break 2804 } 2805 c := v_0.AuxInt 2806 x := v.Args[1] 2807 v.reset(OpARMANDconst) 2808 v.AuxInt = c 2809 v.AddArg(x) 2810 return true 2811 } 2812 // match: (AND x (SLLconst [c] y)) 2813 // cond: 2814 // result: (ANDshiftLL x y [c]) 2815 for { 2816 x := v.Args[0] 2817 v_1 := v.Args[1] 2818 if v_1.Op != OpARMSLLconst { 2819 break 2820 } 2821 c := v_1.AuxInt 2822 y := v_1.Args[0] 2823 v.reset(OpARMANDshiftLL) 2824 v.AuxInt = c 2825 v.AddArg(x) 2826 v.AddArg(y) 2827 return true 2828 } 2829 // match: (AND (SLLconst [c] y) x) 2830 // cond: 2831 // result: (ANDshiftLL x y [c]) 2832 for { 2833 v_0 := v.Args[0] 2834 if v_0.Op != OpARMSLLconst { 2835 break 2836 } 2837 c := v_0.AuxInt 2838 y := v_0.Args[0] 2839 x := v.Args[1] 2840 v.reset(OpARMANDshiftLL) 2841 v.AuxInt = c 2842 v.AddArg(x) 2843 v.AddArg(y) 2844 return true 2845 } 2846 // match: (AND x (SRLconst [c] y)) 2847 // cond: 2848 // result: (ANDshiftRL x y [c]) 2849 for { 2850 x := v.Args[0] 2851 v_1 := v.Args[1] 2852 if v_1.Op != OpARMSRLconst { 2853 break 2854 } 2855 c := v_1.AuxInt 2856 y := v_1.Args[0] 2857 v.reset(OpARMANDshiftRL) 2858 v.AuxInt = c 2859 v.AddArg(x) 2860 v.AddArg(y) 2861 return true 2862 } 2863 // match: (AND (SRLconst [c] y) x) 2864 // cond: 2865 // result: (ANDshiftRL x y [c]) 2866 for { 2867 v_0 := v.Args[0] 2868 if v_0.Op != OpARMSRLconst { 2869 break 2870 } 2871 c := v_0.AuxInt 2872 y := v_0.Args[0] 2873 x := v.Args[1] 2874 v.reset(OpARMANDshiftRL) 2875 v.AuxInt = c 2876 v.AddArg(x) 2877 v.AddArg(y) 2878 return true 2879 } 2880 // match: (AND x (SRAconst [c] y)) 2881 // cond: 2882 // result: (ANDshiftRA x y [c]) 2883 for { 2884 x := v.Args[0] 2885 v_1 := v.Args[1] 2886 if v_1.Op != OpARMSRAconst { 2887 break 2888 } 2889 c := v_1.AuxInt 2890 y := v_1.Args[0] 2891 v.reset(OpARMANDshiftRA) 2892 v.AuxInt = c 2893 v.AddArg(x) 2894 v.AddArg(y) 2895 return true 2896 } 2897 // match: (AND (SRAconst [c] y) x) 2898 // cond: 2899 // result: (ANDshiftRA x y [c]) 2900 for { 2901 v_0 := v.Args[0] 2902 if v_0.Op != OpARMSRAconst { 2903 break 2904 } 2905 c := v_0.AuxInt 2906 y := v_0.Args[0] 2907 x := v.Args[1] 2908 v.reset(OpARMANDshiftRA) 2909 v.AuxInt = c 2910 v.AddArg(x) 2911 v.AddArg(y) 2912 return true 2913 } 2914 // match: (AND x (SLL y z)) 2915 // cond: 2916 // result: (ANDshiftLLreg x y z) 2917 for { 2918 x := v.Args[0] 2919 v_1 := v.Args[1] 2920 if v_1.Op != OpARMSLL { 2921 break 2922 } 2923 y := v_1.Args[0] 2924 z := v_1.Args[1] 2925 v.reset(OpARMANDshiftLLreg) 2926 v.AddArg(x) 2927 v.AddArg(y) 2928 v.AddArg(z) 2929 return true 2930 } 2931 // match: (AND (SLL y z) x) 2932 // cond: 2933 // result: (ANDshiftLLreg x y z) 2934 for { 2935 v_0 := v.Args[0] 2936 if v_0.Op != OpARMSLL { 2937 break 2938 } 2939 y := v_0.Args[0] 2940 z := v_0.Args[1] 2941 x := v.Args[1] 2942 v.reset(OpARMANDshiftLLreg) 2943 v.AddArg(x) 2944 v.AddArg(y) 2945 v.AddArg(z) 2946 return true 2947 } 2948 // match: (AND x (SRL y z)) 2949 // cond: 2950 // result: (ANDshiftRLreg x y z) 2951 for { 2952 x := v.Args[0] 2953 v_1 := v.Args[1] 2954 if v_1.Op != OpARMSRL { 2955 break 2956 } 2957 y := v_1.Args[0] 2958 z := v_1.Args[1] 2959 v.reset(OpARMANDshiftRLreg) 2960 v.AddArg(x) 2961 v.AddArg(y) 2962 v.AddArg(z) 2963 return true 2964 } 2965 // match: (AND (SRL y z) x) 2966 // cond: 2967 // result: (ANDshiftRLreg x y z) 2968 for { 2969 v_0 := v.Args[0] 2970 if v_0.Op != OpARMSRL { 2971 break 2972 } 2973 y := v_0.Args[0] 2974 z := v_0.Args[1] 2975 x := v.Args[1] 2976 v.reset(OpARMANDshiftRLreg) 2977 v.AddArg(x) 2978 v.AddArg(y) 2979 v.AddArg(z) 2980 return true 2981 } 2982 // match: (AND x (SRA y z)) 2983 // cond: 2984 // result: (ANDshiftRAreg x y z) 2985 for { 2986 x := v.Args[0] 2987 v_1 := v.Args[1] 2988 if v_1.Op != OpARMSRA { 2989 break 2990 } 2991 y := v_1.Args[0] 2992 z := v_1.Args[1] 2993 v.reset(OpARMANDshiftRAreg) 2994 v.AddArg(x) 2995 v.AddArg(y) 2996 v.AddArg(z) 2997 return true 2998 } 2999 // match: (AND (SRA y z) x) 3000 // cond: 3001 // result: (ANDshiftRAreg x y z) 3002 for { 3003 v_0 := v.Args[0] 3004 if v_0.Op != OpARMSRA { 3005 break 3006 } 3007 y := v_0.Args[0] 3008 z := v_0.Args[1] 3009 x := v.Args[1] 3010 v.reset(OpARMANDshiftRAreg) 3011 v.AddArg(x) 3012 v.AddArg(y) 3013 v.AddArg(z) 3014 return true 3015 } 3016 // match: (AND x x) 3017 // cond: 3018 // result: x 3019 for { 3020 x := v.Args[0] 3021 if x != v.Args[1] { 3022 break 3023 } 3024 v.reset(OpCopy) 3025 v.Type = x.Type 3026 v.AddArg(x) 3027 return true 3028 } 3029 // match: (AND x (MVN y)) 3030 // cond: 3031 // result: (BIC x y) 3032 for { 3033 x := v.Args[0] 3034 v_1 := v.Args[1] 3035 if v_1.Op != OpARMMVN { 3036 break 3037 } 3038 y := v_1.Args[0] 3039 v.reset(OpARMBIC) 3040 v.AddArg(x) 3041 v.AddArg(y) 3042 return true 3043 } 3044 // match: (AND (MVN y) x) 3045 // cond: 3046 // result: (BIC x y) 3047 for { 3048 v_0 := v.Args[0] 3049 if v_0.Op != OpARMMVN { 3050 break 3051 } 3052 y := v_0.Args[0] 3053 x := v.Args[1] 3054 v.reset(OpARMBIC) 3055 v.AddArg(x) 3056 v.AddArg(y) 3057 return true 3058 } 3059 // match: (AND x (MVNshiftLL y [c])) 3060 // cond: 3061 // result: (BICshiftLL x y [c]) 3062 for { 3063 x := v.Args[0] 3064 v_1 := v.Args[1] 3065 if v_1.Op != OpARMMVNshiftLL { 3066 break 3067 } 3068 c := v_1.AuxInt 3069 y := v_1.Args[0] 3070 v.reset(OpARMBICshiftLL) 3071 v.AuxInt = c 3072 v.AddArg(x) 3073 v.AddArg(y) 3074 return true 3075 } 3076 // match: (AND (MVNshiftLL y [c]) x) 3077 // cond: 3078 // result: (BICshiftLL x y [c]) 3079 for { 3080 v_0 := v.Args[0] 3081 if v_0.Op != OpARMMVNshiftLL { 3082 break 3083 } 3084 c := v_0.AuxInt 3085 y := v_0.Args[0] 3086 x := v.Args[1] 3087 v.reset(OpARMBICshiftLL) 3088 v.AuxInt = c 3089 v.AddArg(x) 3090 v.AddArg(y) 3091 return true 3092 } 3093 // match: (AND x (MVNshiftRL y [c])) 3094 // cond: 3095 // result: (BICshiftRL x y [c]) 3096 for { 3097 x := v.Args[0] 3098 v_1 := v.Args[1] 3099 if v_1.Op != OpARMMVNshiftRL { 3100 break 3101 } 3102 c := v_1.AuxInt 3103 y := v_1.Args[0] 3104 v.reset(OpARMBICshiftRL) 3105 v.AuxInt = c 3106 v.AddArg(x) 3107 v.AddArg(y) 3108 return true 3109 } 3110 // match: (AND (MVNshiftRL y [c]) x) 3111 // cond: 3112 // result: (BICshiftRL x y [c]) 3113 for { 3114 v_0 := v.Args[0] 3115 if v_0.Op != OpARMMVNshiftRL { 3116 break 3117 } 3118 c := v_0.AuxInt 3119 y := v_0.Args[0] 3120 x := v.Args[1] 3121 v.reset(OpARMBICshiftRL) 3122 v.AuxInt = c 3123 v.AddArg(x) 3124 v.AddArg(y) 3125 return true 3126 } 3127 // match: (AND x (MVNshiftRA y [c])) 3128 // cond: 3129 // result: (BICshiftRA x y [c]) 3130 for { 3131 x := v.Args[0] 3132 v_1 := v.Args[1] 3133 if v_1.Op != OpARMMVNshiftRA { 3134 break 3135 } 3136 c := v_1.AuxInt 3137 y := v_1.Args[0] 3138 v.reset(OpARMBICshiftRA) 3139 v.AuxInt = c 3140 v.AddArg(x) 3141 v.AddArg(y) 3142 return true 3143 } 3144 // match: (AND (MVNshiftRA y [c]) x) 3145 // cond: 3146 // result: (BICshiftRA x y [c]) 3147 for { 3148 v_0 := v.Args[0] 3149 if v_0.Op != OpARMMVNshiftRA { 3150 break 3151 } 3152 c := v_0.AuxInt 3153 y := v_0.Args[0] 3154 x := v.Args[1] 3155 v.reset(OpARMBICshiftRA) 3156 v.AuxInt = c 3157 v.AddArg(x) 3158 v.AddArg(y) 3159 return true 3160 } 3161 return false 3162 } 3163 func rewriteValueARM_OpARMANDconst(v *Value) bool { 3164 // match: (ANDconst [0] _) 3165 // cond: 3166 // result: (MOVWconst [0]) 3167 for { 3168 if v.AuxInt != 0 { 3169 break 3170 } 3171 v.reset(OpARMMOVWconst) 3172 v.AuxInt = 0 3173 return true 3174 } 3175 // match: (ANDconst [c] x) 3176 // cond: int32(c)==-1 3177 // result: x 3178 for { 3179 c := v.AuxInt 3180 x := v.Args[0] 3181 if !(int32(c) == -1) { 3182 break 3183 } 3184 v.reset(OpCopy) 3185 v.Type = x.Type 3186 v.AddArg(x) 3187 return true 3188 } 3189 // match: (ANDconst [c] (MOVWconst [d])) 3190 // cond: 3191 // result: (MOVWconst [c&d]) 3192 for { 3193 c := v.AuxInt 3194 v_0 := v.Args[0] 3195 if v_0.Op != OpARMMOVWconst { 3196 break 3197 } 3198 d := v_0.AuxInt 3199 v.reset(OpARMMOVWconst) 3200 v.AuxInt = c & d 3201 return true 3202 } 3203 // match: (ANDconst [c] (ANDconst [d] x)) 3204 // cond: 3205 // result: (ANDconst [c&d] x) 3206 for { 3207 c := v.AuxInt 3208 v_0 := v.Args[0] 3209 if v_0.Op != OpARMANDconst { 3210 break 3211 } 3212 d := v_0.AuxInt 3213 x := v_0.Args[0] 3214 v.reset(OpARMANDconst) 3215 v.AuxInt = c & d 3216 v.AddArg(x) 3217 return true 3218 } 3219 return false 3220 } 3221 func rewriteValueARM_OpARMANDshiftLL(v *Value) bool { 3222 b := v.Block 3223 _ = b 3224 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 3225 // cond: 3226 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 3227 for { 3228 d := v.AuxInt 3229 v_0 := v.Args[0] 3230 if v_0.Op != OpARMMOVWconst { 3231 break 3232 } 3233 c := v_0.AuxInt 3234 x := v.Args[1] 3235 v.reset(OpARMANDconst) 3236 v.AuxInt = c 3237 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3238 v0.AuxInt = d 3239 v0.AddArg(x) 3240 v.AddArg(v0) 3241 return true 3242 } 3243 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 3244 // cond: 3245 // result: (ANDconst x [int64(uint32(c)<<uint64(d))]) 3246 for { 3247 d := v.AuxInt 3248 x := v.Args[0] 3249 v_1 := v.Args[1] 3250 if v_1.Op != OpARMMOVWconst { 3251 break 3252 } 3253 c := v_1.AuxInt 3254 v.reset(OpARMANDconst) 3255 v.AuxInt = int64(uint32(c) << uint64(d)) 3256 v.AddArg(x) 3257 return true 3258 } 3259 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 3260 // cond: c==d 3261 // result: y 3262 for { 3263 d := v.AuxInt 3264 x := v.Args[0] 3265 y := v.Args[1] 3266 if y.Op != OpARMSLLconst { 3267 break 3268 } 3269 c := y.AuxInt 3270 if x != y.Args[0] { 3271 break 3272 } 3273 if !(c == d) { 3274 break 3275 } 3276 v.reset(OpCopy) 3277 v.Type = y.Type 3278 v.AddArg(y) 3279 return true 3280 } 3281 return false 3282 } 3283 func rewriteValueARM_OpARMANDshiftLLreg(v *Value) bool { 3284 b := v.Block 3285 _ = b 3286 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 3287 // cond: 3288 // result: (ANDconst [c] (SLL <x.Type> x y)) 3289 for { 3290 v_0 := v.Args[0] 3291 if v_0.Op != OpARMMOVWconst { 3292 break 3293 } 3294 c := v_0.AuxInt 3295 x := v.Args[1] 3296 y := v.Args[2] 3297 v.reset(OpARMANDconst) 3298 v.AuxInt = c 3299 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3300 v0.AddArg(x) 3301 v0.AddArg(y) 3302 v.AddArg(v0) 3303 return true 3304 } 3305 // match: (ANDshiftLLreg x y (MOVWconst [c])) 3306 // cond: 3307 // result: (ANDshiftLL x y [c]) 3308 for { 3309 x := v.Args[0] 3310 y := v.Args[1] 3311 v_2 := v.Args[2] 3312 if v_2.Op != OpARMMOVWconst { 3313 break 3314 } 3315 c := v_2.AuxInt 3316 v.reset(OpARMANDshiftLL) 3317 v.AuxInt = c 3318 v.AddArg(x) 3319 v.AddArg(y) 3320 return true 3321 } 3322 return false 3323 } 3324 func rewriteValueARM_OpARMANDshiftRA(v *Value) bool { 3325 b := v.Block 3326 _ = b 3327 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 3328 // cond: 3329 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 3330 for { 3331 d := v.AuxInt 3332 v_0 := v.Args[0] 3333 if v_0.Op != OpARMMOVWconst { 3334 break 3335 } 3336 c := v_0.AuxInt 3337 x := v.Args[1] 3338 v.reset(OpARMANDconst) 3339 v.AuxInt = c 3340 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3341 v0.AuxInt = d 3342 v0.AddArg(x) 3343 v.AddArg(v0) 3344 return true 3345 } 3346 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3347 // cond: 3348 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3349 for { 3350 d := v.AuxInt 3351 x := v.Args[0] 3352 v_1 := v.Args[1] 3353 if v_1.Op != OpARMMOVWconst { 3354 break 3355 } 3356 c := v_1.AuxInt 3357 v.reset(OpARMANDconst) 3358 v.AuxInt = int64(int32(c) >> uint64(d)) 3359 v.AddArg(x) 3360 return true 3361 } 3362 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3363 // cond: c==d 3364 // result: y 3365 for { 3366 d := v.AuxInt 3367 x := v.Args[0] 3368 y := v.Args[1] 3369 if y.Op != OpARMSRAconst { 3370 break 3371 } 3372 c := y.AuxInt 3373 if x != y.Args[0] { 3374 break 3375 } 3376 if !(c == d) { 3377 break 3378 } 3379 v.reset(OpCopy) 3380 v.Type = y.Type 3381 v.AddArg(y) 3382 return true 3383 } 3384 return false 3385 } 3386 func rewriteValueARM_OpARMANDshiftRAreg(v *Value) bool { 3387 b := v.Block 3388 _ = b 3389 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3390 // cond: 3391 // result: (ANDconst [c] (SRA <x.Type> x y)) 3392 for { 3393 v_0 := v.Args[0] 3394 if v_0.Op != OpARMMOVWconst { 3395 break 3396 } 3397 c := v_0.AuxInt 3398 x := v.Args[1] 3399 y := v.Args[2] 3400 v.reset(OpARMANDconst) 3401 v.AuxInt = c 3402 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3403 v0.AddArg(x) 3404 v0.AddArg(y) 3405 v.AddArg(v0) 3406 return true 3407 } 3408 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3409 // cond: 3410 // result: (ANDshiftRA x y [c]) 3411 for { 3412 x := v.Args[0] 3413 y := v.Args[1] 3414 v_2 := v.Args[2] 3415 if v_2.Op != OpARMMOVWconst { 3416 break 3417 } 3418 c := v_2.AuxInt 3419 v.reset(OpARMANDshiftRA) 3420 v.AuxInt = c 3421 v.AddArg(x) 3422 v.AddArg(y) 3423 return true 3424 } 3425 return false 3426 } 3427 func rewriteValueARM_OpARMANDshiftRL(v *Value) bool { 3428 b := v.Block 3429 _ = b 3430 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3431 // cond: 3432 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3433 for { 3434 d := v.AuxInt 3435 v_0 := v.Args[0] 3436 if v_0.Op != OpARMMOVWconst { 3437 break 3438 } 3439 c := v_0.AuxInt 3440 x := v.Args[1] 3441 v.reset(OpARMANDconst) 3442 v.AuxInt = c 3443 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3444 v0.AuxInt = d 3445 v0.AddArg(x) 3446 v.AddArg(v0) 3447 return true 3448 } 3449 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3450 // cond: 3451 // result: (ANDconst x [int64(uint32(c)>>uint64(d))]) 3452 for { 3453 d := v.AuxInt 3454 x := v.Args[0] 3455 v_1 := v.Args[1] 3456 if v_1.Op != OpARMMOVWconst { 3457 break 3458 } 3459 c := v_1.AuxInt 3460 v.reset(OpARMANDconst) 3461 v.AuxInt = int64(uint32(c) >> uint64(d)) 3462 v.AddArg(x) 3463 return true 3464 } 3465 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3466 // cond: c==d 3467 // result: y 3468 for { 3469 d := v.AuxInt 3470 x := v.Args[0] 3471 y := v.Args[1] 3472 if y.Op != OpARMSRLconst { 3473 break 3474 } 3475 c := y.AuxInt 3476 if x != y.Args[0] { 3477 break 3478 } 3479 if !(c == d) { 3480 break 3481 } 3482 v.reset(OpCopy) 3483 v.Type = y.Type 3484 v.AddArg(y) 3485 return true 3486 } 3487 return false 3488 } 3489 func rewriteValueARM_OpARMANDshiftRLreg(v *Value) bool { 3490 b := v.Block 3491 _ = b 3492 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 3493 // cond: 3494 // result: (ANDconst [c] (SRL <x.Type> x y)) 3495 for { 3496 v_0 := v.Args[0] 3497 if v_0.Op != OpARMMOVWconst { 3498 break 3499 } 3500 c := v_0.AuxInt 3501 x := v.Args[1] 3502 y := v.Args[2] 3503 v.reset(OpARMANDconst) 3504 v.AuxInt = c 3505 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3506 v0.AddArg(x) 3507 v0.AddArg(y) 3508 v.AddArg(v0) 3509 return true 3510 } 3511 // match: (ANDshiftRLreg x y (MOVWconst [c])) 3512 // cond: 3513 // result: (ANDshiftRL x y [c]) 3514 for { 3515 x := v.Args[0] 3516 y := v.Args[1] 3517 v_2 := v.Args[2] 3518 if v_2.Op != OpARMMOVWconst { 3519 break 3520 } 3521 c := v_2.AuxInt 3522 v.reset(OpARMANDshiftRL) 3523 v.AuxInt = c 3524 v.AddArg(x) 3525 v.AddArg(y) 3526 return true 3527 } 3528 return false 3529 } 3530 func rewriteValueARM_OpARMBIC(v *Value) bool { 3531 // match: (BIC x (MOVWconst [c])) 3532 // cond: 3533 // result: (BICconst [c] x) 3534 for { 3535 x := v.Args[0] 3536 v_1 := v.Args[1] 3537 if v_1.Op != OpARMMOVWconst { 3538 break 3539 } 3540 c := v_1.AuxInt 3541 v.reset(OpARMBICconst) 3542 v.AuxInt = c 3543 v.AddArg(x) 3544 return true 3545 } 3546 // match: (BIC x (SLLconst [c] y)) 3547 // cond: 3548 // result: (BICshiftLL x y [c]) 3549 for { 3550 x := v.Args[0] 3551 v_1 := v.Args[1] 3552 if v_1.Op != OpARMSLLconst { 3553 break 3554 } 3555 c := v_1.AuxInt 3556 y := v_1.Args[0] 3557 v.reset(OpARMBICshiftLL) 3558 v.AuxInt = c 3559 v.AddArg(x) 3560 v.AddArg(y) 3561 return true 3562 } 3563 // match: (BIC x (SRLconst [c] y)) 3564 // cond: 3565 // result: (BICshiftRL x y [c]) 3566 for { 3567 x := v.Args[0] 3568 v_1 := v.Args[1] 3569 if v_1.Op != OpARMSRLconst { 3570 break 3571 } 3572 c := v_1.AuxInt 3573 y := v_1.Args[0] 3574 v.reset(OpARMBICshiftRL) 3575 v.AuxInt = c 3576 v.AddArg(x) 3577 v.AddArg(y) 3578 return true 3579 } 3580 // match: (BIC x (SRAconst [c] y)) 3581 // cond: 3582 // result: (BICshiftRA x y [c]) 3583 for { 3584 x := v.Args[0] 3585 v_1 := v.Args[1] 3586 if v_1.Op != OpARMSRAconst { 3587 break 3588 } 3589 c := v_1.AuxInt 3590 y := v_1.Args[0] 3591 v.reset(OpARMBICshiftRA) 3592 v.AuxInt = c 3593 v.AddArg(x) 3594 v.AddArg(y) 3595 return true 3596 } 3597 // match: (BIC x (SLL y z)) 3598 // cond: 3599 // result: (BICshiftLLreg x y z) 3600 for { 3601 x := v.Args[0] 3602 v_1 := v.Args[1] 3603 if v_1.Op != OpARMSLL { 3604 break 3605 } 3606 y := v_1.Args[0] 3607 z := v_1.Args[1] 3608 v.reset(OpARMBICshiftLLreg) 3609 v.AddArg(x) 3610 v.AddArg(y) 3611 v.AddArg(z) 3612 return true 3613 } 3614 // match: (BIC x (SRL y z)) 3615 // cond: 3616 // result: (BICshiftRLreg x y z) 3617 for { 3618 x := v.Args[0] 3619 v_1 := v.Args[1] 3620 if v_1.Op != OpARMSRL { 3621 break 3622 } 3623 y := v_1.Args[0] 3624 z := v_1.Args[1] 3625 v.reset(OpARMBICshiftRLreg) 3626 v.AddArg(x) 3627 v.AddArg(y) 3628 v.AddArg(z) 3629 return true 3630 } 3631 // match: (BIC x (SRA y z)) 3632 // cond: 3633 // result: (BICshiftRAreg x y z) 3634 for { 3635 x := v.Args[0] 3636 v_1 := v.Args[1] 3637 if v_1.Op != OpARMSRA { 3638 break 3639 } 3640 y := v_1.Args[0] 3641 z := v_1.Args[1] 3642 v.reset(OpARMBICshiftRAreg) 3643 v.AddArg(x) 3644 v.AddArg(y) 3645 v.AddArg(z) 3646 return true 3647 } 3648 // match: (BIC x x) 3649 // cond: 3650 // result: (MOVWconst [0]) 3651 for { 3652 x := v.Args[0] 3653 if x != v.Args[1] { 3654 break 3655 } 3656 v.reset(OpARMMOVWconst) 3657 v.AuxInt = 0 3658 return true 3659 } 3660 return false 3661 } 3662 func rewriteValueARM_OpARMBICconst(v *Value) bool { 3663 // match: (BICconst [0] x) 3664 // cond: 3665 // result: x 3666 for { 3667 if v.AuxInt != 0 { 3668 break 3669 } 3670 x := v.Args[0] 3671 v.reset(OpCopy) 3672 v.Type = x.Type 3673 v.AddArg(x) 3674 return true 3675 } 3676 // match: (BICconst [c] _) 3677 // cond: int32(c)==-1 3678 // result: (MOVWconst [0]) 3679 for { 3680 c := v.AuxInt 3681 if !(int32(c) == -1) { 3682 break 3683 } 3684 v.reset(OpARMMOVWconst) 3685 v.AuxInt = 0 3686 return true 3687 } 3688 // match: (BICconst [c] (MOVWconst [d])) 3689 // cond: 3690 // result: (MOVWconst [d&^c]) 3691 for { 3692 c := v.AuxInt 3693 v_0 := v.Args[0] 3694 if v_0.Op != OpARMMOVWconst { 3695 break 3696 } 3697 d := v_0.AuxInt 3698 v.reset(OpARMMOVWconst) 3699 v.AuxInt = d &^ c 3700 return true 3701 } 3702 return false 3703 } 3704 func rewriteValueARM_OpARMBICshiftLL(v *Value) bool { 3705 // match: (BICshiftLL x (MOVWconst [c]) [d]) 3706 // cond: 3707 // result: (BICconst x [int64(uint32(c)<<uint64(d))]) 3708 for { 3709 d := v.AuxInt 3710 x := v.Args[0] 3711 v_1 := v.Args[1] 3712 if v_1.Op != OpARMMOVWconst { 3713 break 3714 } 3715 c := v_1.AuxInt 3716 v.reset(OpARMBICconst) 3717 v.AuxInt = int64(uint32(c) << uint64(d)) 3718 v.AddArg(x) 3719 return true 3720 } 3721 // match: (BICshiftLL x (SLLconst x [c]) [d]) 3722 // cond: c==d 3723 // result: (MOVWconst [0]) 3724 for { 3725 d := v.AuxInt 3726 x := v.Args[0] 3727 v_1 := v.Args[1] 3728 if v_1.Op != OpARMSLLconst { 3729 break 3730 } 3731 c := v_1.AuxInt 3732 if x != v_1.Args[0] { 3733 break 3734 } 3735 if !(c == d) { 3736 break 3737 } 3738 v.reset(OpARMMOVWconst) 3739 v.AuxInt = 0 3740 return true 3741 } 3742 return false 3743 } 3744 func rewriteValueARM_OpARMBICshiftLLreg(v *Value) bool { 3745 // match: (BICshiftLLreg x y (MOVWconst [c])) 3746 // cond: 3747 // result: (BICshiftLL x y [c]) 3748 for { 3749 x := v.Args[0] 3750 y := v.Args[1] 3751 v_2 := v.Args[2] 3752 if v_2.Op != OpARMMOVWconst { 3753 break 3754 } 3755 c := v_2.AuxInt 3756 v.reset(OpARMBICshiftLL) 3757 v.AuxInt = c 3758 v.AddArg(x) 3759 v.AddArg(y) 3760 return true 3761 } 3762 return false 3763 } 3764 func rewriteValueARM_OpARMBICshiftRA(v *Value) bool { 3765 // match: (BICshiftRA x (MOVWconst [c]) [d]) 3766 // cond: 3767 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 3768 for { 3769 d := v.AuxInt 3770 x := v.Args[0] 3771 v_1 := v.Args[1] 3772 if v_1.Op != OpARMMOVWconst { 3773 break 3774 } 3775 c := v_1.AuxInt 3776 v.reset(OpARMBICconst) 3777 v.AuxInt = int64(int32(c) >> uint64(d)) 3778 v.AddArg(x) 3779 return true 3780 } 3781 // match: (BICshiftRA x (SRAconst x [c]) [d]) 3782 // cond: c==d 3783 // result: (MOVWconst [0]) 3784 for { 3785 d := v.AuxInt 3786 x := v.Args[0] 3787 v_1 := v.Args[1] 3788 if v_1.Op != OpARMSRAconst { 3789 break 3790 } 3791 c := v_1.AuxInt 3792 if x != v_1.Args[0] { 3793 break 3794 } 3795 if !(c == d) { 3796 break 3797 } 3798 v.reset(OpARMMOVWconst) 3799 v.AuxInt = 0 3800 return true 3801 } 3802 return false 3803 } 3804 func rewriteValueARM_OpARMBICshiftRAreg(v *Value) bool { 3805 // match: (BICshiftRAreg x y (MOVWconst [c])) 3806 // cond: 3807 // result: (BICshiftRA x y [c]) 3808 for { 3809 x := v.Args[0] 3810 y := v.Args[1] 3811 v_2 := v.Args[2] 3812 if v_2.Op != OpARMMOVWconst { 3813 break 3814 } 3815 c := v_2.AuxInt 3816 v.reset(OpARMBICshiftRA) 3817 v.AuxInt = c 3818 v.AddArg(x) 3819 v.AddArg(y) 3820 return true 3821 } 3822 return false 3823 } 3824 func rewriteValueARM_OpARMBICshiftRL(v *Value) bool { 3825 // match: (BICshiftRL x (MOVWconst [c]) [d]) 3826 // cond: 3827 // result: (BICconst x [int64(uint32(c)>>uint64(d))]) 3828 for { 3829 d := v.AuxInt 3830 x := v.Args[0] 3831 v_1 := v.Args[1] 3832 if v_1.Op != OpARMMOVWconst { 3833 break 3834 } 3835 c := v_1.AuxInt 3836 v.reset(OpARMBICconst) 3837 v.AuxInt = int64(uint32(c) >> uint64(d)) 3838 v.AddArg(x) 3839 return true 3840 } 3841 // match: (BICshiftRL x (SRLconst x [c]) [d]) 3842 // cond: c==d 3843 // result: (MOVWconst [0]) 3844 for { 3845 d := v.AuxInt 3846 x := v.Args[0] 3847 v_1 := v.Args[1] 3848 if v_1.Op != OpARMSRLconst { 3849 break 3850 } 3851 c := v_1.AuxInt 3852 if x != v_1.Args[0] { 3853 break 3854 } 3855 if !(c == d) { 3856 break 3857 } 3858 v.reset(OpARMMOVWconst) 3859 v.AuxInt = 0 3860 return true 3861 } 3862 return false 3863 } 3864 func rewriteValueARM_OpARMBICshiftRLreg(v *Value) bool { 3865 // match: (BICshiftRLreg x y (MOVWconst [c])) 3866 // cond: 3867 // result: (BICshiftRL x y [c]) 3868 for { 3869 x := v.Args[0] 3870 y := v.Args[1] 3871 v_2 := v.Args[2] 3872 if v_2.Op != OpARMMOVWconst { 3873 break 3874 } 3875 c := v_2.AuxInt 3876 v.reset(OpARMBICshiftRL) 3877 v.AuxInt = c 3878 v.AddArg(x) 3879 v.AddArg(y) 3880 return true 3881 } 3882 return false 3883 } 3884 func rewriteValueARM_OpARMCMOVWHSconst(v *Value) bool { 3885 // match: (CMOVWHSconst _ (FlagEQ) [c]) 3886 // cond: 3887 // result: (MOVWconst [c]) 3888 for { 3889 c := v.AuxInt 3890 v_1 := v.Args[1] 3891 if v_1.Op != OpARMFlagEQ { 3892 break 3893 } 3894 v.reset(OpARMMOVWconst) 3895 v.AuxInt = c 3896 return true 3897 } 3898 // match: (CMOVWHSconst x (FlagLT_ULT)) 3899 // cond: 3900 // result: x 3901 for { 3902 x := v.Args[0] 3903 v_1 := v.Args[1] 3904 if v_1.Op != OpARMFlagLT_ULT { 3905 break 3906 } 3907 v.reset(OpCopy) 3908 v.Type = x.Type 3909 v.AddArg(x) 3910 return true 3911 } 3912 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 3913 // cond: 3914 // result: (MOVWconst [c]) 3915 for { 3916 c := v.AuxInt 3917 v_1 := v.Args[1] 3918 if v_1.Op != OpARMFlagLT_UGT { 3919 break 3920 } 3921 v.reset(OpARMMOVWconst) 3922 v.AuxInt = c 3923 return true 3924 } 3925 // match: (CMOVWHSconst x (FlagGT_ULT)) 3926 // cond: 3927 // result: x 3928 for { 3929 x := v.Args[0] 3930 v_1 := v.Args[1] 3931 if v_1.Op != OpARMFlagGT_ULT { 3932 break 3933 } 3934 v.reset(OpCopy) 3935 v.Type = x.Type 3936 v.AddArg(x) 3937 return true 3938 } 3939 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 3940 // cond: 3941 // result: (MOVWconst [c]) 3942 for { 3943 c := v.AuxInt 3944 v_1 := v.Args[1] 3945 if v_1.Op != OpARMFlagGT_UGT { 3946 break 3947 } 3948 v.reset(OpARMMOVWconst) 3949 v.AuxInt = c 3950 return true 3951 } 3952 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 3953 // cond: 3954 // result: (CMOVWLSconst x flags [c]) 3955 for { 3956 c := v.AuxInt 3957 x := v.Args[0] 3958 v_1 := v.Args[1] 3959 if v_1.Op != OpARMInvertFlags { 3960 break 3961 } 3962 flags := v_1.Args[0] 3963 v.reset(OpARMCMOVWLSconst) 3964 v.AuxInt = c 3965 v.AddArg(x) 3966 v.AddArg(flags) 3967 return true 3968 } 3969 return false 3970 } 3971 func rewriteValueARM_OpARMCMOVWLSconst(v *Value) bool { 3972 // match: (CMOVWLSconst _ (FlagEQ) [c]) 3973 // cond: 3974 // result: (MOVWconst [c]) 3975 for { 3976 c := v.AuxInt 3977 v_1 := v.Args[1] 3978 if v_1.Op != OpARMFlagEQ { 3979 break 3980 } 3981 v.reset(OpARMMOVWconst) 3982 v.AuxInt = c 3983 return true 3984 } 3985 // match: (CMOVWLSconst _ (FlagLT_ULT) [c]) 3986 // cond: 3987 // result: (MOVWconst [c]) 3988 for { 3989 c := v.AuxInt 3990 v_1 := v.Args[1] 3991 if v_1.Op != OpARMFlagLT_ULT { 3992 break 3993 } 3994 v.reset(OpARMMOVWconst) 3995 v.AuxInt = c 3996 return true 3997 } 3998 // match: (CMOVWLSconst x (FlagLT_UGT)) 3999 // cond: 4000 // result: x 4001 for { 4002 x := v.Args[0] 4003 v_1 := v.Args[1] 4004 if v_1.Op != OpARMFlagLT_UGT { 4005 break 4006 } 4007 v.reset(OpCopy) 4008 v.Type = x.Type 4009 v.AddArg(x) 4010 return true 4011 } 4012 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 4013 // cond: 4014 // result: (MOVWconst [c]) 4015 for { 4016 c := v.AuxInt 4017 v_1 := v.Args[1] 4018 if v_1.Op != OpARMFlagGT_ULT { 4019 break 4020 } 4021 v.reset(OpARMMOVWconst) 4022 v.AuxInt = c 4023 return true 4024 } 4025 // match: (CMOVWLSconst x (FlagGT_UGT)) 4026 // cond: 4027 // result: x 4028 for { 4029 x := v.Args[0] 4030 v_1 := v.Args[1] 4031 if v_1.Op != OpARMFlagGT_UGT { 4032 break 4033 } 4034 v.reset(OpCopy) 4035 v.Type = x.Type 4036 v.AddArg(x) 4037 return true 4038 } 4039 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 4040 // cond: 4041 // result: (CMOVWHSconst x flags [c]) 4042 for { 4043 c := v.AuxInt 4044 x := v.Args[0] 4045 v_1 := v.Args[1] 4046 if v_1.Op != OpARMInvertFlags { 4047 break 4048 } 4049 flags := v_1.Args[0] 4050 v.reset(OpARMCMOVWHSconst) 4051 v.AuxInt = c 4052 v.AddArg(x) 4053 v.AddArg(flags) 4054 return true 4055 } 4056 return false 4057 } 4058 func rewriteValueARM_OpARMCMP(v *Value) bool { 4059 b := v.Block 4060 _ = b 4061 // match: (CMP x (MOVWconst [c])) 4062 // cond: 4063 // result: (CMPconst [c] x) 4064 for { 4065 x := v.Args[0] 4066 v_1 := v.Args[1] 4067 if v_1.Op != OpARMMOVWconst { 4068 break 4069 } 4070 c := v_1.AuxInt 4071 v.reset(OpARMCMPconst) 4072 v.AuxInt = c 4073 v.AddArg(x) 4074 return true 4075 } 4076 // match: (CMP (MOVWconst [c]) x) 4077 // cond: 4078 // result: (InvertFlags (CMPconst [c] x)) 4079 for { 4080 v_0 := v.Args[0] 4081 if v_0.Op != OpARMMOVWconst { 4082 break 4083 } 4084 c := v_0.AuxInt 4085 x := v.Args[1] 4086 v.reset(OpARMInvertFlags) 4087 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4088 v0.AuxInt = c 4089 v0.AddArg(x) 4090 v.AddArg(v0) 4091 return true 4092 } 4093 // match: (CMP x (SLLconst [c] y)) 4094 // cond: 4095 // result: (CMPshiftLL x y [c]) 4096 for { 4097 x := v.Args[0] 4098 v_1 := v.Args[1] 4099 if v_1.Op != OpARMSLLconst { 4100 break 4101 } 4102 c := v_1.AuxInt 4103 y := v_1.Args[0] 4104 v.reset(OpARMCMPshiftLL) 4105 v.AuxInt = c 4106 v.AddArg(x) 4107 v.AddArg(y) 4108 return true 4109 } 4110 // match: (CMP (SLLconst [c] y) x) 4111 // cond: 4112 // result: (InvertFlags (CMPshiftLL x y [c])) 4113 for { 4114 v_0 := v.Args[0] 4115 if v_0.Op != OpARMSLLconst { 4116 break 4117 } 4118 c := v_0.AuxInt 4119 y := v_0.Args[0] 4120 x := v.Args[1] 4121 v.reset(OpARMInvertFlags) 4122 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, TypeFlags) 4123 v0.AuxInt = c 4124 v0.AddArg(x) 4125 v0.AddArg(y) 4126 v.AddArg(v0) 4127 return true 4128 } 4129 // match: (CMP x (SRLconst [c] y)) 4130 // cond: 4131 // result: (CMPshiftRL x y [c]) 4132 for { 4133 x := v.Args[0] 4134 v_1 := v.Args[1] 4135 if v_1.Op != OpARMSRLconst { 4136 break 4137 } 4138 c := v_1.AuxInt 4139 y := v_1.Args[0] 4140 v.reset(OpARMCMPshiftRL) 4141 v.AuxInt = c 4142 v.AddArg(x) 4143 v.AddArg(y) 4144 return true 4145 } 4146 // match: (CMP (SRLconst [c] y) x) 4147 // cond: 4148 // result: (InvertFlags (CMPshiftRL x y [c])) 4149 for { 4150 v_0 := v.Args[0] 4151 if v_0.Op != OpARMSRLconst { 4152 break 4153 } 4154 c := v_0.AuxInt 4155 y := v_0.Args[0] 4156 x := v.Args[1] 4157 v.reset(OpARMInvertFlags) 4158 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, TypeFlags) 4159 v0.AuxInt = c 4160 v0.AddArg(x) 4161 v0.AddArg(y) 4162 v.AddArg(v0) 4163 return true 4164 } 4165 // match: (CMP x (SRAconst [c] y)) 4166 // cond: 4167 // result: (CMPshiftRA x y [c]) 4168 for { 4169 x := v.Args[0] 4170 v_1 := v.Args[1] 4171 if v_1.Op != OpARMSRAconst { 4172 break 4173 } 4174 c := v_1.AuxInt 4175 y := v_1.Args[0] 4176 v.reset(OpARMCMPshiftRA) 4177 v.AuxInt = c 4178 v.AddArg(x) 4179 v.AddArg(y) 4180 return true 4181 } 4182 // match: (CMP (SRAconst [c] y) x) 4183 // cond: 4184 // result: (InvertFlags (CMPshiftRA x y [c])) 4185 for { 4186 v_0 := v.Args[0] 4187 if v_0.Op != OpARMSRAconst { 4188 break 4189 } 4190 c := v_0.AuxInt 4191 y := v_0.Args[0] 4192 x := v.Args[1] 4193 v.reset(OpARMInvertFlags) 4194 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, TypeFlags) 4195 v0.AuxInt = c 4196 v0.AddArg(x) 4197 v0.AddArg(y) 4198 v.AddArg(v0) 4199 return true 4200 } 4201 // match: (CMP x (SLL y z)) 4202 // cond: 4203 // result: (CMPshiftLLreg x y z) 4204 for { 4205 x := v.Args[0] 4206 v_1 := v.Args[1] 4207 if v_1.Op != OpARMSLL { 4208 break 4209 } 4210 y := v_1.Args[0] 4211 z := v_1.Args[1] 4212 v.reset(OpARMCMPshiftLLreg) 4213 v.AddArg(x) 4214 v.AddArg(y) 4215 v.AddArg(z) 4216 return true 4217 } 4218 // match: (CMP (SLL y z) x) 4219 // cond: 4220 // result: (InvertFlags (CMPshiftLLreg x y z)) 4221 for { 4222 v_0 := v.Args[0] 4223 if v_0.Op != OpARMSLL { 4224 break 4225 } 4226 y := v_0.Args[0] 4227 z := v_0.Args[1] 4228 x := v.Args[1] 4229 v.reset(OpARMInvertFlags) 4230 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, TypeFlags) 4231 v0.AddArg(x) 4232 v0.AddArg(y) 4233 v0.AddArg(z) 4234 v.AddArg(v0) 4235 return true 4236 } 4237 // match: (CMP x (SRL y z)) 4238 // cond: 4239 // result: (CMPshiftRLreg x y z) 4240 for { 4241 x := v.Args[0] 4242 v_1 := v.Args[1] 4243 if v_1.Op != OpARMSRL { 4244 break 4245 } 4246 y := v_1.Args[0] 4247 z := v_1.Args[1] 4248 v.reset(OpARMCMPshiftRLreg) 4249 v.AddArg(x) 4250 v.AddArg(y) 4251 v.AddArg(z) 4252 return true 4253 } 4254 // match: (CMP (SRL y z) x) 4255 // cond: 4256 // result: (InvertFlags (CMPshiftRLreg x y z)) 4257 for { 4258 v_0 := v.Args[0] 4259 if v_0.Op != OpARMSRL { 4260 break 4261 } 4262 y := v_0.Args[0] 4263 z := v_0.Args[1] 4264 x := v.Args[1] 4265 v.reset(OpARMInvertFlags) 4266 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, TypeFlags) 4267 v0.AddArg(x) 4268 v0.AddArg(y) 4269 v0.AddArg(z) 4270 v.AddArg(v0) 4271 return true 4272 } 4273 // match: (CMP x (SRA y z)) 4274 // cond: 4275 // result: (CMPshiftRAreg x y z) 4276 for { 4277 x := v.Args[0] 4278 v_1 := v.Args[1] 4279 if v_1.Op != OpARMSRA { 4280 break 4281 } 4282 y := v_1.Args[0] 4283 z := v_1.Args[1] 4284 v.reset(OpARMCMPshiftRAreg) 4285 v.AddArg(x) 4286 v.AddArg(y) 4287 v.AddArg(z) 4288 return true 4289 } 4290 // match: (CMP (SRA y z) x) 4291 // cond: 4292 // result: (InvertFlags (CMPshiftRAreg x y z)) 4293 for { 4294 v_0 := v.Args[0] 4295 if v_0.Op != OpARMSRA { 4296 break 4297 } 4298 y := v_0.Args[0] 4299 z := v_0.Args[1] 4300 x := v.Args[1] 4301 v.reset(OpARMInvertFlags) 4302 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, TypeFlags) 4303 v0.AddArg(x) 4304 v0.AddArg(y) 4305 v0.AddArg(z) 4306 v.AddArg(v0) 4307 return true 4308 } 4309 return false 4310 } 4311 func rewriteValueARM_OpARMCMPD(v *Value) bool { 4312 // match: (CMPD x (MOVDconst [0])) 4313 // cond: 4314 // result: (CMPD0 x) 4315 for { 4316 x := v.Args[0] 4317 v_1 := v.Args[1] 4318 if v_1.Op != OpARMMOVDconst { 4319 break 4320 } 4321 if v_1.AuxInt != 0 { 4322 break 4323 } 4324 v.reset(OpARMCMPD0) 4325 v.AddArg(x) 4326 return true 4327 } 4328 return false 4329 } 4330 func rewriteValueARM_OpARMCMPF(v *Value) bool { 4331 // match: (CMPF x (MOVFconst [0])) 4332 // cond: 4333 // result: (CMPF0 x) 4334 for { 4335 x := v.Args[0] 4336 v_1 := v.Args[1] 4337 if v_1.Op != OpARMMOVFconst { 4338 break 4339 } 4340 if v_1.AuxInt != 0 { 4341 break 4342 } 4343 v.reset(OpARMCMPF0) 4344 v.AddArg(x) 4345 return true 4346 } 4347 return false 4348 } 4349 func rewriteValueARM_OpARMCMPconst(v *Value) bool { 4350 // match: (CMPconst (MOVWconst [x]) [y]) 4351 // cond: int32(x)==int32(y) 4352 // result: (FlagEQ) 4353 for { 4354 y := v.AuxInt 4355 v_0 := v.Args[0] 4356 if v_0.Op != OpARMMOVWconst { 4357 break 4358 } 4359 x := v_0.AuxInt 4360 if !(int32(x) == int32(y)) { 4361 break 4362 } 4363 v.reset(OpARMFlagEQ) 4364 return true 4365 } 4366 // match: (CMPconst (MOVWconst [x]) [y]) 4367 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 4368 // result: (FlagLT_ULT) 4369 for { 4370 y := v.AuxInt 4371 v_0 := v.Args[0] 4372 if v_0.Op != OpARMMOVWconst { 4373 break 4374 } 4375 x := v_0.AuxInt 4376 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 4377 break 4378 } 4379 v.reset(OpARMFlagLT_ULT) 4380 return true 4381 } 4382 // match: (CMPconst (MOVWconst [x]) [y]) 4383 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 4384 // result: (FlagLT_UGT) 4385 for { 4386 y := v.AuxInt 4387 v_0 := v.Args[0] 4388 if v_0.Op != OpARMMOVWconst { 4389 break 4390 } 4391 x := v_0.AuxInt 4392 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 4393 break 4394 } 4395 v.reset(OpARMFlagLT_UGT) 4396 return true 4397 } 4398 // match: (CMPconst (MOVWconst [x]) [y]) 4399 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 4400 // result: (FlagGT_ULT) 4401 for { 4402 y := v.AuxInt 4403 v_0 := v.Args[0] 4404 if v_0.Op != OpARMMOVWconst { 4405 break 4406 } 4407 x := v_0.AuxInt 4408 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 4409 break 4410 } 4411 v.reset(OpARMFlagGT_ULT) 4412 return true 4413 } 4414 // match: (CMPconst (MOVWconst [x]) [y]) 4415 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 4416 // result: (FlagGT_UGT) 4417 for { 4418 y := v.AuxInt 4419 v_0 := v.Args[0] 4420 if v_0.Op != OpARMMOVWconst { 4421 break 4422 } 4423 x := v_0.AuxInt 4424 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 4425 break 4426 } 4427 v.reset(OpARMFlagGT_UGT) 4428 return true 4429 } 4430 // match: (CMPconst (MOVBUreg _) [c]) 4431 // cond: 0xff < c 4432 // result: (FlagLT_ULT) 4433 for { 4434 c := v.AuxInt 4435 v_0 := v.Args[0] 4436 if v_0.Op != OpARMMOVBUreg { 4437 break 4438 } 4439 if !(0xff < c) { 4440 break 4441 } 4442 v.reset(OpARMFlagLT_ULT) 4443 return true 4444 } 4445 // match: (CMPconst (MOVHUreg _) [c]) 4446 // cond: 0xffff < c 4447 // result: (FlagLT_ULT) 4448 for { 4449 c := v.AuxInt 4450 v_0 := v.Args[0] 4451 if v_0.Op != OpARMMOVHUreg { 4452 break 4453 } 4454 if !(0xffff < c) { 4455 break 4456 } 4457 v.reset(OpARMFlagLT_ULT) 4458 return true 4459 } 4460 // match: (CMPconst (ANDconst _ [m]) [n]) 4461 // cond: 0 <= int32(m) && int32(m) < int32(n) 4462 // result: (FlagLT_ULT) 4463 for { 4464 n := v.AuxInt 4465 v_0 := v.Args[0] 4466 if v_0.Op != OpARMANDconst { 4467 break 4468 } 4469 m := v_0.AuxInt 4470 if !(0 <= int32(m) && int32(m) < int32(n)) { 4471 break 4472 } 4473 v.reset(OpARMFlagLT_ULT) 4474 return true 4475 } 4476 // match: (CMPconst (SRLconst _ [c]) [n]) 4477 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 4478 // result: (FlagLT_ULT) 4479 for { 4480 n := v.AuxInt 4481 v_0 := v.Args[0] 4482 if v_0.Op != OpARMSRLconst { 4483 break 4484 } 4485 c := v_0.AuxInt 4486 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 4487 break 4488 } 4489 v.reset(OpARMFlagLT_ULT) 4490 return true 4491 } 4492 return false 4493 } 4494 func rewriteValueARM_OpARMCMPshiftLL(v *Value) bool { 4495 b := v.Block 4496 _ = b 4497 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 4498 // cond: 4499 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 4500 for { 4501 d := v.AuxInt 4502 v_0 := v.Args[0] 4503 if v_0.Op != OpARMMOVWconst { 4504 break 4505 } 4506 c := v_0.AuxInt 4507 x := v.Args[1] 4508 v.reset(OpARMInvertFlags) 4509 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4510 v0.AuxInt = c 4511 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4512 v1.AuxInt = d 4513 v1.AddArg(x) 4514 v0.AddArg(v1) 4515 v.AddArg(v0) 4516 return true 4517 } 4518 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 4519 // cond: 4520 // result: (CMPconst x [int64(uint32(c)<<uint64(d))]) 4521 for { 4522 d := v.AuxInt 4523 x := v.Args[0] 4524 v_1 := v.Args[1] 4525 if v_1.Op != OpARMMOVWconst { 4526 break 4527 } 4528 c := v_1.AuxInt 4529 v.reset(OpARMCMPconst) 4530 v.AuxInt = int64(uint32(c) << uint64(d)) 4531 v.AddArg(x) 4532 return true 4533 } 4534 return false 4535 } 4536 func rewriteValueARM_OpARMCMPshiftLLreg(v *Value) bool { 4537 b := v.Block 4538 _ = b 4539 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 4540 // cond: 4541 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 4542 for { 4543 v_0 := v.Args[0] 4544 if v_0.Op != OpARMMOVWconst { 4545 break 4546 } 4547 c := v_0.AuxInt 4548 x := v.Args[1] 4549 y := v.Args[2] 4550 v.reset(OpARMInvertFlags) 4551 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4552 v0.AuxInt = c 4553 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4554 v1.AddArg(x) 4555 v1.AddArg(y) 4556 v0.AddArg(v1) 4557 v.AddArg(v0) 4558 return true 4559 } 4560 // match: (CMPshiftLLreg x y (MOVWconst [c])) 4561 // cond: 4562 // result: (CMPshiftLL x y [c]) 4563 for { 4564 x := v.Args[0] 4565 y := v.Args[1] 4566 v_2 := v.Args[2] 4567 if v_2.Op != OpARMMOVWconst { 4568 break 4569 } 4570 c := v_2.AuxInt 4571 v.reset(OpARMCMPshiftLL) 4572 v.AuxInt = c 4573 v.AddArg(x) 4574 v.AddArg(y) 4575 return true 4576 } 4577 return false 4578 } 4579 func rewriteValueARM_OpARMCMPshiftRA(v *Value) bool { 4580 b := v.Block 4581 _ = b 4582 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 4583 // cond: 4584 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 4585 for { 4586 d := v.AuxInt 4587 v_0 := v.Args[0] 4588 if v_0.Op != OpARMMOVWconst { 4589 break 4590 } 4591 c := v_0.AuxInt 4592 x := v.Args[1] 4593 v.reset(OpARMInvertFlags) 4594 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4595 v0.AuxInt = c 4596 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4597 v1.AuxInt = d 4598 v1.AddArg(x) 4599 v0.AddArg(v1) 4600 v.AddArg(v0) 4601 return true 4602 } 4603 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 4604 // cond: 4605 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 4606 for { 4607 d := v.AuxInt 4608 x := v.Args[0] 4609 v_1 := v.Args[1] 4610 if v_1.Op != OpARMMOVWconst { 4611 break 4612 } 4613 c := v_1.AuxInt 4614 v.reset(OpARMCMPconst) 4615 v.AuxInt = int64(int32(c) >> uint64(d)) 4616 v.AddArg(x) 4617 return true 4618 } 4619 return false 4620 } 4621 func rewriteValueARM_OpARMCMPshiftRAreg(v *Value) bool { 4622 b := v.Block 4623 _ = b 4624 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 4625 // cond: 4626 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 4627 for { 4628 v_0 := v.Args[0] 4629 if v_0.Op != OpARMMOVWconst { 4630 break 4631 } 4632 c := v_0.AuxInt 4633 x := v.Args[1] 4634 y := v.Args[2] 4635 v.reset(OpARMInvertFlags) 4636 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4637 v0.AuxInt = c 4638 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4639 v1.AddArg(x) 4640 v1.AddArg(y) 4641 v0.AddArg(v1) 4642 v.AddArg(v0) 4643 return true 4644 } 4645 // match: (CMPshiftRAreg x y (MOVWconst [c])) 4646 // cond: 4647 // result: (CMPshiftRA x y [c]) 4648 for { 4649 x := v.Args[0] 4650 y := v.Args[1] 4651 v_2 := v.Args[2] 4652 if v_2.Op != OpARMMOVWconst { 4653 break 4654 } 4655 c := v_2.AuxInt 4656 v.reset(OpARMCMPshiftRA) 4657 v.AuxInt = c 4658 v.AddArg(x) 4659 v.AddArg(y) 4660 return true 4661 } 4662 return false 4663 } 4664 func rewriteValueARM_OpARMCMPshiftRL(v *Value) bool { 4665 b := v.Block 4666 _ = b 4667 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 4668 // cond: 4669 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 4670 for { 4671 d := v.AuxInt 4672 v_0 := v.Args[0] 4673 if v_0.Op != OpARMMOVWconst { 4674 break 4675 } 4676 c := v_0.AuxInt 4677 x := v.Args[1] 4678 v.reset(OpARMInvertFlags) 4679 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4680 v0.AuxInt = c 4681 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 4682 v1.AuxInt = d 4683 v1.AddArg(x) 4684 v0.AddArg(v1) 4685 v.AddArg(v0) 4686 return true 4687 } 4688 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 4689 // cond: 4690 // result: (CMPconst x [int64(uint32(c)>>uint64(d))]) 4691 for { 4692 d := v.AuxInt 4693 x := v.Args[0] 4694 v_1 := v.Args[1] 4695 if v_1.Op != OpARMMOVWconst { 4696 break 4697 } 4698 c := v_1.AuxInt 4699 v.reset(OpARMCMPconst) 4700 v.AuxInt = int64(uint32(c) >> uint64(d)) 4701 v.AddArg(x) 4702 return true 4703 } 4704 return false 4705 } 4706 func rewriteValueARM_OpARMCMPshiftRLreg(v *Value) bool { 4707 b := v.Block 4708 _ = b 4709 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 4710 // cond: 4711 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 4712 for { 4713 v_0 := v.Args[0] 4714 if v_0.Op != OpARMMOVWconst { 4715 break 4716 } 4717 c := v_0.AuxInt 4718 x := v.Args[1] 4719 y := v.Args[2] 4720 v.reset(OpARMInvertFlags) 4721 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4722 v0.AuxInt = c 4723 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 4724 v1.AddArg(x) 4725 v1.AddArg(y) 4726 v0.AddArg(v1) 4727 v.AddArg(v0) 4728 return true 4729 } 4730 // match: (CMPshiftRLreg x y (MOVWconst [c])) 4731 // cond: 4732 // result: (CMPshiftRL x y [c]) 4733 for { 4734 x := v.Args[0] 4735 y := v.Args[1] 4736 v_2 := v.Args[2] 4737 if v_2.Op != OpARMMOVWconst { 4738 break 4739 } 4740 c := v_2.AuxInt 4741 v.reset(OpARMCMPshiftRL) 4742 v.AuxInt = c 4743 v.AddArg(x) 4744 v.AddArg(y) 4745 return true 4746 } 4747 return false 4748 } 4749 func rewriteValueARM_OpARMEqual(v *Value) bool { 4750 // match: (Equal (FlagEQ)) 4751 // cond: 4752 // result: (MOVWconst [1]) 4753 for { 4754 v_0 := v.Args[0] 4755 if v_0.Op != OpARMFlagEQ { 4756 break 4757 } 4758 v.reset(OpARMMOVWconst) 4759 v.AuxInt = 1 4760 return true 4761 } 4762 // match: (Equal (FlagLT_ULT)) 4763 // cond: 4764 // result: (MOVWconst [0]) 4765 for { 4766 v_0 := v.Args[0] 4767 if v_0.Op != OpARMFlagLT_ULT { 4768 break 4769 } 4770 v.reset(OpARMMOVWconst) 4771 v.AuxInt = 0 4772 return true 4773 } 4774 // match: (Equal (FlagLT_UGT)) 4775 // cond: 4776 // result: (MOVWconst [0]) 4777 for { 4778 v_0 := v.Args[0] 4779 if v_0.Op != OpARMFlagLT_UGT { 4780 break 4781 } 4782 v.reset(OpARMMOVWconst) 4783 v.AuxInt = 0 4784 return true 4785 } 4786 // match: (Equal (FlagGT_ULT)) 4787 // cond: 4788 // result: (MOVWconst [0]) 4789 for { 4790 v_0 := v.Args[0] 4791 if v_0.Op != OpARMFlagGT_ULT { 4792 break 4793 } 4794 v.reset(OpARMMOVWconst) 4795 v.AuxInt = 0 4796 return true 4797 } 4798 // match: (Equal (FlagGT_UGT)) 4799 // cond: 4800 // result: (MOVWconst [0]) 4801 for { 4802 v_0 := v.Args[0] 4803 if v_0.Op != OpARMFlagGT_UGT { 4804 break 4805 } 4806 v.reset(OpARMMOVWconst) 4807 v.AuxInt = 0 4808 return true 4809 } 4810 // match: (Equal (InvertFlags x)) 4811 // cond: 4812 // result: (Equal x) 4813 for { 4814 v_0 := v.Args[0] 4815 if v_0.Op != OpARMInvertFlags { 4816 break 4817 } 4818 x := v_0.Args[0] 4819 v.reset(OpARMEqual) 4820 v.AddArg(x) 4821 return true 4822 } 4823 return false 4824 } 4825 func rewriteValueARM_OpARMGreaterEqual(v *Value) bool { 4826 // match: (GreaterEqual (FlagEQ)) 4827 // cond: 4828 // result: (MOVWconst [1]) 4829 for { 4830 v_0 := v.Args[0] 4831 if v_0.Op != OpARMFlagEQ { 4832 break 4833 } 4834 v.reset(OpARMMOVWconst) 4835 v.AuxInt = 1 4836 return true 4837 } 4838 // match: (GreaterEqual (FlagLT_ULT)) 4839 // cond: 4840 // result: (MOVWconst [0]) 4841 for { 4842 v_0 := v.Args[0] 4843 if v_0.Op != OpARMFlagLT_ULT { 4844 break 4845 } 4846 v.reset(OpARMMOVWconst) 4847 v.AuxInt = 0 4848 return true 4849 } 4850 // match: (GreaterEqual (FlagLT_UGT)) 4851 // cond: 4852 // result: (MOVWconst [0]) 4853 for { 4854 v_0 := v.Args[0] 4855 if v_0.Op != OpARMFlagLT_UGT { 4856 break 4857 } 4858 v.reset(OpARMMOVWconst) 4859 v.AuxInt = 0 4860 return true 4861 } 4862 // match: (GreaterEqual (FlagGT_ULT)) 4863 // cond: 4864 // result: (MOVWconst [1]) 4865 for { 4866 v_0 := v.Args[0] 4867 if v_0.Op != OpARMFlagGT_ULT { 4868 break 4869 } 4870 v.reset(OpARMMOVWconst) 4871 v.AuxInt = 1 4872 return true 4873 } 4874 // match: (GreaterEqual (FlagGT_UGT)) 4875 // cond: 4876 // result: (MOVWconst [1]) 4877 for { 4878 v_0 := v.Args[0] 4879 if v_0.Op != OpARMFlagGT_UGT { 4880 break 4881 } 4882 v.reset(OpARMMOVWconst) 4883 v.AuxInt = 1 4884 return true 4885 } 4886 // match: (GreaterEqual (InvertFlags x)) 4887 // cond: 4888 // result: (LessEqual x) 4889 for { 4890 v_0 := v.Args[0] 4891 if v_0.Op != OpARMInvertFlags { 4892 break 4893 } 4894 x := v_0.Args[0] 4895 v.reset(OpARMLessEqual) 4896 v.AddArg(x) 4897 return true 4898 } 4899 return false 4900 } 4901 func rewriteValueARM_OpARMGreaterEqualU(v *Value) bool { 4902 // match: (GreaterEqualU (FlagEQ)) 4903 // cond: 4904 // result: (MOVWconst [1]) 4905 for { 4906 v_0 := v.Args[0] 4907 if v_0.Op != OpARMFlagEQ { 4908 break 4909 } 4910 v.reset(OpARMMOVWconst) 4911 v.AuxInt = 1 4912 return true 4913 } 4914 // match: (GreaterEqualU (FlagLT_ULT)) 4915 // cond: 4916 // result: (MOVWconst [0]) 4917 for { 4918 v_0 := v.Args[0] 4919 if v_0.Op != OpARMFlagLT_ULT { 4920 break 4921 } 4922 v.reset(OpARMMOVWconst) 4923 v.AuxInt = 0 4924 return true 4925 } 4926 // match: (GreaterEqualU (FlagLT_UGT)) 4927 // cond: 4928 // result: (MOVWconst [1]) 4929 for { 4930 v_0 := v.Args[0] 4931 if v_0.Op != OpARMFlagLT_UGT { 4932 break 4933 } 4934 v.reset(OpARMMOVWconst) 4935 v.AuxInt = 1 4936 return true 4937 } 4938 // match: (GreaterEqualU (FlagGT_ULT)) 4939 // cond: 4940 // result: (MOVWconst [0]) 4941 for { 4942 v_0 := v.Args[0] 4943 if v_0.Op != OpARMFlagGT_ULT { 4944 break 4945 } 4946 v.reset(OpARMMOVWconst) 4947 v.AuxInt = 0 4948 return true 4949 } 4950 // match: (GreaterEqualU (FlagGT_UGT)) 4951 // cond: 4952 // result: (MOVWconst [1]) 4953 for { 4954 v_0 := v.Args[0] 4955 if v_0.Op != OpARMFlagGT_UGT { 4956 break 4957 } 4958 v.reset(OpARMMOVWconst) 4959 v.AuxInt = 1 4960 return true 4961 } 4962 // match: (GreaterEqualU (InvertFlags x)) 4963 // cond: 4964 // result: (LessEqualU x) 4965 for { 4966 v_0 := v.Args[0] 4967 if v_0.Op != OpARMInvertFlags { 4968 break 4969 } 4970 x := v_0.Args[0] 4971 v.reset(OpARMLessEqualU) 4972 v.AddArg(x) 4973 return true 4974 } 4975 return false 4976 } 4977 func rewriteValueARM_OpARMGreaterThan(v *Value) bool { 4978 // match: (GreaterThan (FlagEQ)) 4979 // cond: 4980 // result: (MOVWconst [0]) 4981 for { 4982 v_0 := v.Args[0] 4983 if v_0.Op != OpARMFlagEQ { 4984 break 4985 } 4986 v.reset(OpARMMOVWconst) 4987 v.AuxInt = 0 4988 return true 4989 } 4990 // match: (GreaterThan (FlagLT_ULT)) 4991 // cond: 4992 // result: (MOVWconst [0]) 4993 for { 4994 v_0 := v.Args[0] 4995 if v_0.Op != OpARMFlagLT_ULT { 4996 break 4997 } 4998 v.reset(OpARMMOVWconst) 4999 v.AuxInt = 0 5000 return true 5001 } 5002 // match: (GreaterThan (FlagLT_UGT)) 5003 // cond: 5004 // result: (MOVWconst [0]) 5005 for { 5006 v_0 := v.Args[0] 5007 if v_0.Op != OpARMFlagLT_UGT { 5008 break 5009 } 5010 v.reset(OpARMMOVWconst) 5011 v.AuxInt = 0 5012 return true 5013 } 5014 // match: (GreaterThan (FlagGT_ULT)) 5015 // cond: 5016 // result: (MOVWconst [1]) 5017 for { 5018 v_0 := v.Args[0] 5019 if v_0.Op != OpARMFlagGT_ULT { 5020 break 5021 } 5022 v.reset(OpARMMOVWconst) 5023 v.AuxInt = 1 5024 return true 5025 } 5026 // match: (GreaterThan (FlagGT_UGT)) 5027 // cond: 5028 // result: (MOVWconst [1]) 5029 for { 5030 v_0 := v.Args[0] 5031 if v_0.Op != OpARMFlagGT_UGT { 5032 break 5033 } 5034 v.reset(OpARMMOVWconst) 5035 v.AuxInt = 1 5036 return true 5037 } 5038 // match: (GreaterThan (InvertFlags x)) 5039 // cond: 5040 // result: (LessThan x) 5041 for { 5042 v_0 := v.Args[0] 5043 if v_0.Op != OpARMInvertFlags { 5044 break 5045 } 5046 x := v_0.Args[0] 5047 v.reset(OpARMLessThan) 5048 v.AddArg(x) 5049 return true 5050 } 5051 return false 5052 } 5053 func rewriteValueARM_OpARMGreaterThanU(v *Value) bool { 5054 // match: (GreaterThanU (FlagEQ)) 5055 // cond: 5056 // result: (MOVWconst [0]) 5057 for { 5058 v_0 := v.Args[0] 5059 if v_0.Op != OpARMFlagEQ { 5060 break 5061 } 5062 v.reset(OpARMMOVWconst) 5063 v.AuxInt = 0 5064 return true 5065 } 5066 // match: (GreaterThanU (FlagLT_ULT)) 5067 // cond: 5068 // result: (MOVWconst [0]) 5069 for { 5070 v_0 := v.Args[0] 5071 if v_0.Op != OpARMFlagLT_ULT { 5072 break 5073 } 5074 v.reset(OpARMMOVWconst) 5075 v.AuxInt = 0 5076 return true 5077 } 5078 // match: (GreaterThanU (FlagLT_UGT)) 5079 // cond: 5080 // result: (MOVWconst [1]) 5081 for { 5082 v_0 := v.Args[0] 5083 if v_0.Op != OpARMFlagLT_UGT { 5084 break 5085 } 5086 v.reset(OpARMMOVWconst) 5087 v.AuxInt = 1 5088 return true 5089 } 5090 // match: (GreaterThanU (FlagGT_ULT)) 5091 // cond: 5092 // result: (MOVWconst [0]) 5093 for { 5094 v_0 := v.Args[0] 5095 if v_0.Op != OpARMFlagGT_ULT { 5096 break 5097 } 5098 v.reset(OpARMMOVWconst) 5099 v.AuxInt = 0 5100 return true 5101 } 5102 // match: (GreaterThanU (FlagGT_UGT)) 5103 // cond: 5104 // result: (MOVWconst [1]) 5105 for { 5106 v_0 := v.Args[0] 5107 if v_0.Op != OpARMFlagGT_UGT { 5108 break 5109 } 5110 v.reset(OpARMMOVWconst) 5111 v.AuxInt = 1 5112 return true 5113 } 5114 // match: (GreaterThanU (InvertFlags x)) 5115 // cond: 5116 // result: (LessThanU x) 5117 for { 5118 v_0 := v.Args[0] 5119 if v_0.Op != OpARMInvertFlags { 5120 break 5121 } 5122 x := v_0.Args[0] 5123 v.reset(OpARMLessThanU) 5124 v.AddArg(x) 5125 return true 5126 } 5127 return false 5128 } 5129 func rewriteValueARM_OpARMLessEqual(v *Value) bool { 5130 // match: (LessEqual (FlagEQ)) 5131 // cond: 5132 // result: (MOVWconst [1]) 5133 for { 5134 v_0 := v.Args[0] 5135 if v_0.Op != OpARMFlagEQ { 5136 break 5137 } 5138 v.reset(OpARMMOVWconst) 5139 v.AuxInt = 1 5140 return true 5141 } 5142 // match: (LessEqual (FlagLT_ULT)) 5143 // cond: 5144 // result: (MOVWconst [1]) 5145 for { 5146 v_0 := v.Args[0] 5147 if v_0.Op != OpARMFlagLT_ULT { 5148 break 5149 } 5150 v.reset(OpARMMOVWconst) 5151 v.AuxInt = 1 5152 return true 5153 } 5154 // match: (LessEqual (FlagLT_UGT)) 5155 // cond: 5156 // result: (MOVWconst [1]) 5157 for { 5158 v_0 := v.Args[0] 5159 if v_0.Op != OpARMFlagLT_UGT { 5160 break 5161 } 5162 v.reset(OpARMMOVWconst) 5163 v.AuxInt = 1 5164 return true 5165 } 5166 // match: (LessEqual (FlagGT_ULT)) 5167 // cond: 5168 // result: (MOVWconst [0]) 5169 for { 5170 v_0 := v.Args[0] 5171 if v_0.Op != OpARMFlagGT_ULT { 5172 break 5173 } 5174 v.reset(OpARMMOVWconst) 5175 v.AuxInt = 0 5176 return true 5177 } 5178 // match: (LessEqual (FlagGT_UGT)) 5179 // cond: 5180 // result: (MOVWconst [0]) 5181 for { 5182 v_0 := v.Args[0] 5183 if v_0.Op != OpARMFlagGT_UGT { 5184 break 5185 } 5186 v.reset(OpARMMOVWconst) 5187 v.AuxInt = 0 5188 return true 5189 } 5190 // match: (LessEqual (InvertFlags x)) 5191 // cond: 5192 // result: (GreaterEqual x) 5193 for { 5194 v_0 := v.Args[0] 5195 if v_0.Op != OpARMInvertFlags { 5196 break 5197 } 5198 x := v_0.Args[0] 5199 v.reset(OpARMGreaterEqual) 5200 v.AddArg(x) 5201 return true 5202 } 5203 return false 5204 } 5205 func rewriteValueARM_OpARMLessEqualU(v *Value) bool { 5206 // match: (LessEqualU (FlagEQ)) 5207 // cond: 5208 // result: (MOVWconst [1]) 5209 for { 5210 v_0 := v.Args[0] 5211 if v_0.Op != OpARMFlagEQ { 5212 break 5213 } 5214 v.reset(OpARMMOVWconst) 5215 v.AuxInt = 1 5216 return true 5217 } 5218 // match: (LessEqualU (FlagLT_ULT)) 5219 // cond: 5220 // result: (MOVWconst [1]) 5221 for { 5222 v_0 := v.Args[0] 5223 if v_0.Op != OpARMFlagLT_ULT { 5224 break 5225 } 5226 v.reset(OpARMMOVWconst) 5227 v.AuxInt = 1 5228 return true 5229 } 5230 // match: (LessEqualU (FlagLT_UGT)) 5231 // cond: 5232 // result: (MOVWconst [0]) 5233 for { 5234 v_0 := v.Args[0] 5235 if v_0.Op != OpARMFlagLT_UGT { 5236 break 5237 } 5238 v.reset(OpARMMOVWconst) 5239 v.AuxInt = 0 5240 return true 5241 } 5242 // match: (LessEqualU (FlagGT_ULT)) 5243 // cond: 5244 // result: (MOVWconst [1]) 5245 for { 5246 v_0 := v.Args[0] 5247 if v_0.Op != OpARMFlagGT_ULT { 5248 break 5249 } 5250 v.reset(OpARMMOVWconst) 5251 v.AuxInt = 1 5252 return true 5253 } 5254 // match: (LessEqualU (FlagGT_UGT)) 5255 // cond: 5256 // result: (MOVWconst [0]) 5257 for { 5258 v_0 := v.Args[0] 5259 if v_0.Op != OpARMFlagGT_UGT { 5260 break 5261 } 5262 v.reset(OpARMMOVWconst) 5263 v.AuxInt = 0 5264 return true 5265 } 5266 // match: (LessEqualU (InvertFlags x)) 5267 // cond: 5268 // result: (GreaterEqualU x) 5269 for { 5270 v_0 := v.Args[0] 5271 if v_0.Op != OpARMInvertFlags { 5272 break 5273 } 5274 x := v_0.Args[0] 5275 v.reset(OpARMGreaterEqualU) 5276 v.AddArg(x) 5277 return true 5278 } 5279 return false 5280 } 5281 func rewriteValueARM_OpARMLessThan(v *Value) bool { 5282 // match: (LessThan (FlagEQ)) 5283 // cond: 5284 // result: (MOVWconst [0]) 5285 for { 5286 v_0 := v.Args[0] 5287 if v_0.Op != OpARMFlagEQ { 5288 break 5289 } 5290 v.reset(OpARMMOVWconst) 5291 v.AuxInt = 0 5292 return true 5293 } 5294 // match: (LessThan (FlagLT_ULT)) 5295 // cond: 5296 // result: (MOVWconst [1]) 5297 for { 5298 v_0 := v.Args[0] 5299 if v_0.Op != OpARMFlagLT_ULT { 5300 break 5301 } 5302 v.reset(OpARMMOVWconst) 5303 v.AuxInt = 1 5304 return true 5305 } 5306 // match: (LessThan (FlagLT_UGT)) 5307 // cond: 5308 // result: (MOVWconst [1]) 5309 for { 5310 v_0 := v.Args[0] 5311 if v_0.Op != OpARMFlagLT_UGT { 5312 break 5313 } 5314 v.reset(OpARMMOVWconst) 5315 v.AuxInt = 1 5316 return true 5317 } 5318 // match: (LessThan (FlagGT_ULT)) 5319 // cond: 5320 // result: (MOVWconst [0]) 5321 for { 5322 v_0 := v.Args[0] 5323 if v_0.Op != OpARMFlagGT_ULT { 5324 break 5325 } 5326 v.reset(OpARMMOVWconst) 5327 v.AuxInt = 0 5328 return true 5329 } 5330 // match: (LessThan (FlagGT_UGT)) 5331 // cond: 5332 // result: (MOVWconst [0]) 5333 for { 5334 v_0 := v.Args[0] 5335 if v_0.Op != OpARMFlagGT_UGT { 5336 break 5337 } 5338 v.reset(OpARMMOVWconst) 5339 v.AuxInt = 0 5340 return true 5341 } 5342 // match: (LessThan (InvertFlags x)) 5343 // cond: 5344 // result: (GreaterThan x) 5345 for { 5346 v_0 := v.Args[0] 5347 if v_0.Op != OpARMInvertFlags { 5348 break 5349 } 5350 x := v_0.Args[0] 5351 v.reset(OpARMGreaterThan) 5352 v.AddArg(x) 5353 return true 5354 } 5355 return false 5356 } 5357 func rewriteValueARM_OpARMLessThanU(v *Value) bool { 5358 // match: (LessThanU (FlagEQ)) 5359 // cond: 5360 // result: (MOVWconst [0]) 5361 for { 5362 v_0 := v.Args[0] 5363 if v_0.Op != OpARMFlagEQ { 5364 break 5365 } 5366 v.reset(OpARMMOVWconst) 5367 v.AuxInt = 0 5368 return true 5369 } 5370 // match: (LessThanU (FlagLT_ULT)) 5371 // cond: 5372 // result: (MOVWconst [1]) 5373 for { 5374 v_0 := v.Args[0] 5375 if v_0.Op != OpARMFlagLT_ULT { 5376 break 5377 } 5378 v.reset(OpARMMOVWconst) 5379 v.AuxInt = 1 5380 return true 5381 } 5382 // match: (LessThanU (FlagLT_UGT)) 5383 // cond: 5384 // result: (MOVWconst [0]) 5385 for { 5386 v_0 := v.Args[0] 5387 if v_0.Op != OpARMFlagLT_UGT { 5388 break 5389 } 5390 v.reset(OpARMMOVWconst) 5391 v.AuxInt = 0 5392 return true 5393 } 5394 // match: (LessThanU (FlagGT_ULT)) 5395 // cond: 5396 // result: (MOVWconst [1]) 5397 for { 5398 v_0 := v.Args[0] 5399 if v_0.Op != OpARMFlagGT_ULT { 5400 break 5401 } 5402 v.reset(OpARMMOVWconst) 5403 v.AuxInt = 1 5404 return true 5405 } 5406 // match: (LessThanU (FlagGT_UGT)) 5407 // cond: 5408 // result: (MOVWconst [0]) 5409 for { 5410 v_0 := v.Args[0] 5411 if v_0.Op != OpARMFlagGT_UGT { 5412 break 5413 } 5414 v.reset(OpARMMOVWconst) 5415 v.AuxInt = 0 5416 return true 5417 } 5418 // match: (LessThanU (InvertFlags x)) 5419 // cond: 5420 // result: (GreaterThanU x) 5421 for { 5422 v_0 := v.Args[0] 5423 if v_0.Op != OpARMInvertFlags { 5424 break 5425 } 5426 x := v_0.Args[0] 5427 v.reset(OpARMGreaterThanU) 5428 v.AddArg(x) 5429 return true 5430 } 5431 return false 5432 } 5433 func rewriteValueARM_OpARMMOVBUload(v *Value) bool { 5434 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 5435 // cond: 5436 // result: (MOVBUload [off1+off2] {sym} ptr mem) 5437 for { 5438 off1 := v.AuxInt 5439 sym := v.Aux 5440 v_0 := v.Args[0] 5441 if v_0.Op != OpARMADDconst { 5442 break 5443 } 5444 off2 := v_0.AuxInt 5445 ptr := v_0.Args[0] 5446 mem := v.Args[1] 5447 v.reset(OpARMMOVBUload) 5448 v.AuxInt = off1 + off2 5449 v.Aux = sym 5450 v.AddArg(ptr) 5451 v.AddArg(mem) 5452 return true 5453 } 5454 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5455 // cond: canMergeSym(sym1,sym2) 5456 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5457 for { 5458 off1 := v.AuxInt 5459 sym1 := v.Aux 5460 v_0 := v.Args[0] 5461 if v_0.Op != OpARMMOVWaddr { 5462 break 5463 } 5464 off2 := v_0.AuxInt 5465 sym2 := v_0.Aux 5466 ptr := v_0.Args[0] 5467 mem := v.Args[1] 5468 if !(canMergeSym(sym1, sym2)) { 5469 break 5470 } 5471 v.reset(OpARMMOVBUload) 5472 v.AuxInt = off1 + off2 5473 v.Aux = mergeSym(sym1, sym2) 5474 v.AddArg(ptr) 5475 v.AddArg(mem) 5476 return true 5477 } 5478 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5479 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type) 5480 // result: x 5481 for { 5482 off := v.AuxInt 5483 sym := v.Aux 5484 ptr := v.Args[0] 5485 v_1 := v.Args[1] 5486 if v_1.Op != OpARMMOVBstore { 5487 break 5488 } 5489 off2 := v_1.AuxInt 5490 sym2 := v_1.Aux 5491 ptr2 := v_1.Args[0] 5492 x := v_1.Args[1] 5493 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type)) { 5494 break 5495 } 5496 v.reset(OpCopy) 5497 v.Type = x.Type 5498 v.AddArg(x) 5499 return true 5500 } 5501 return false 5502 } 5503 func rewriteValueARM_OpARMMOVBUreg(v *Value) bool { 5504 // match: (MOVBUreg x:(MOVBUload _ _)) 5505 // cond: 5506 // result: (MOVWreg x) 5507 for { 5508 x := v.Args[0] 5509 if x.Op != OpARMMOVBUload { 5510 break 5511 } 5512 v.reset(OpARMMOVWreg) 5513 v.AddArg(x) 5514 return true 5515 } 5516 // match: (MOVBUreg (ANDconst [c] x)) 5517 // cond: 5518 // result: (ANDconst [c&0xff] x) 5519 for { 5520 v_0 := v.Args[0] 5521 if v_0.Op != OpARMANDconst { 5522 break 5523 } 5524 c := v_0.AuxInt 5525 x := v_0.Args[0] 5526 v.reset(OpARMANDconst) 5527 v.AuxInt = c & 0xff 5528 v.AddArg(x) 5529 return true 5530 } 5531 // match: (MOVBUreg x:(MOVBUreg _)) 5532 // cond: 5533 // result: (MOVWreg x) 5534 for { 5535 x := v.Args[0] 5536 if x.Op != OpARMMOVBUreg { 5537 break 5538 } 5539 v.reset(OpARMMOVWreg) 5540 v.AddArg(x) 5541 return true 5542 } 5543 // match: (MOVBUreg (MOVWconst [c])) 5544 // cond: 5545 // result: (MOVWconst [int64(uint8(c))]) 5546 for { 5547 v_0 := v.Args[0] 5548 if v_0.Op != OpARMMOVWconst { 5549 break 5550 } 5551 c := v_0.AuxInt 5552 v.reset(OpARMMOVWconst) 5553 v.AuxInt = int64(uint8(c)) 5554 return true 5555 } 5556 return false 5557 } 5558 func rewriteValueARM_OpARMMOVBload(v *Value) bool { 5559 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 5560 // cond: 5561 // result: (MOVBload [off1+off2] {sym} ptr mem) 5562 for { 5563 off1 := v.AuxInt 5564 sym := v.Aux 5565 v_0 := v.Args[0] 5566 if v_0.Op != OpARMADDconst { 5567 break 5568 } 5569 off2 := v_0.AuxInt 5570 ptr := v_0.Args[0] 5571 mem := v.Args[1] 5572 v.reset(OpARMMOVBload) 5573 v.AuxInt = off1 + off2 5574 v.Aux = sym 5575 v.AddArg(ptr) 5576 v.AddArg(mem) 5577 return true 5578 } 5579 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5580 // cond: canMergeSym(sym1,sym2) 5581 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5582 for { 5583 off1 := v.AuxInt 5584 sym1 := v.Aux 5585 v_0 := v.Args[0] 5586 if v_0.Op != OpARMMOVWaddr { 5587 break 5588 } 5589 off2 := v_0.AuxInt 5590 sym2 := v_0.Aux 5591 ptr := v_0.Args[0] 5592 mem := v.Args[1] 5593 if !(canMergeSym(sym1, sym2)) { 5594 break 5595 } 5596 v.reset(OpARMMOVBload) 5597 v.AuxInt = off1 + off2 5598 v.Aux = mergeSym(sym1, sym2) 5599 v.AddArg(ptr) 5600 v.AddArg(mem) 5601 return true 5602 } 5603 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5604 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type) 5605 // result: x 5606 for { 5607 off := v.AuxInt 5608 sym := v.Aux 5609 ptr := v.Args[0] 5610 v_1 := v.Args[1] 5611 if v_1.Op != OpARMMOVBstore { 5612 break 5613 } 5614 off2 := v_1.AuxInt 5615 sym2 := v_1.Aux 5616 ptr2 := v_1.Args[0] 5617 x := v_1.Args[1] 5618 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type)) { 5619 break 5620 } 5621 v.reset(OpCopy) 5622 v.Type = x.Type 5623 v.AddArg(x) 5624 return true 5625 } 5626 return false 5627 } 5628 func rewriteValueARM_OpARMMOVBreg(v *Value) bool { 5629 // match: (MOVBreg x:(MOVBload _ _)) 5630 // cond: 5631 // result: (MOVWreg x) 5632 for { 5633 x := v.Args[0] 5634 if x.Op != OpARMMOVBload { 5635 break 5636 } 5637 v.reset(OpARMMOVWreg) 5638 v.AddArg(x) 5639 return true 5640 } 5641 // match: (MOVBreg (ANDconst [c] x)) 5642 // cond: c & 0x80 == 0 5643 // result: (ANDconst [c&0x7f] x) 5644 for { 5645 v_0 := v.Args[0] 5646 if v_0.Op != OpARMANDconst { 5647 break 5648 } 5649 c := v_0.AuxInt 5650 x := v_0.Args[0] 5651 if !(c&0x80 == 0) { 5652 break 5653 } 5654 v.reset(OpARMANDconst) 5655 v.AuxInt = c & 0x7f 5656 v.AddArg(x) 5657 return true 5658 } 5659 // match: (MOVBreg x:(MOVBreg _)) 5660 // cond: 5661 // result: (MOVWreg x) 5662 for { 5663 x := v.Args[0] 5664 if x.Op != OpARMMOVBreg { 5665 break 5666 } 5667 v.reset(OpARMMOVWreg) 5668 v.AddArg(x) 5669 return true 5670 } 5671 // match: (MOVBreg (MOVWconst [c])) 5672 // cond: 5673 // result: (MOVWconst [int64(int8(c))]) 5674 for { 5675 v_0 := v.Args[0] 5676 if v_0.Op != OpARMMOVWconst { 5677 break 5678 } 5679 c := v_0.AuxInt 5680 v.reset(OpARMMOVWconst) 5681 v.AuxInt = int64(int8(c)) 5682 return true 5683 } 5684 return false 5685 } 5686 func rewriteValueARM_OpARMMOVBstore(v *Value) bool { 5687 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5688 // cond: 5689 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 5690 for { 5691 off1 := v.AuxInt 5692 sym := v.Aux 5693 v_0 := v.Args[0] 5694 if v_0.Op != OpARMADDconst { 5695 break 5696 } 5697 off2 := v_0.AuxInt 5698 ptr := v_0.Args[0] 5699 val := v.Args[1] 5700 mem := v.Args[2] 5701 v.reset(OpARMMOVBstore) 5702 v.AuxInt = off1 + off2 5703 v.Aux = sym 5704 v.AddArg(ptr) 5705 v.AddArg(val) 5706 v.AddArg(mem) 5707 return true 5708 } 5709 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5710 // cond: canMergeSym(sym1,sym2) 5711 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5712 for { 5713 off1 := v.AuxInt 5714 sym1 := v.Aux 5715 v_0 := v.Args[0] 5716 if v_0.Op != OpARMMOVWaddr { 5717 break 5718 } 5719 off2 := v_0.AuxInt 5720 sym2 := v_0.Aux 5721 ptr := v_0.Args[0] 5722 val := v.Args[1] 5723 mem := v.Args[2] 5724 if !(canMergeSym(sym1, sym2)) { 5725 break 5726 } 5727 v.reset(OpARMMOVBstore) 5728 v.AuxInt = off1 + off2 5729 v.Aux = mergeSym(sym1, sym2) 5730 v.AddArg(ptr) 5731 v.AddArg(val) 5732 v.AddArg(mem) 5733 return true 5734 } 5735 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 5736 // cond: 5737 // result: (MOVBstore [off] {sym} ptr x mem) 5738 for { 5739 off := v.AuxInt 5740 sym := v.Aux 5741 ptr := v.Args[0] 5742 v_1 := v.Args[1] 5743 if v_1.Op != OpARMMOVBreg { 5744 break 5745 } 5746 x := v_1.Args[0] 5747 mem := v.Args[2] 5748 v.reset(OpARMMOVBstore) 5749 v.AuxInt = off 5750 v.Aux = sym 5751 v.AddArg(ptr) 5752 v.AddArg(x) 5753 v.AddArg(mem) 5754 return true 5755 } 5756 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 5757 // cond: 5758 // result: (MOVBstore [off] {sym} ptr x mem) 5759 for { 5760 off := v.AuxInt 5761 sym := v.Aux 5762 ptr := v.Args[0] 5763 v_1 := v.Args[1] 5764 if v_1.Op != OpARMMOVBUreg { 5765 break 5766 } 5767 x := v_1.Args[0] 5768 mem := v.Args[2] 5769 v.reset(OpARMMOVBstore) 5770 v.AuxInt = off 5771 v.Aux = sym 5772 v.AddArg(ptr) 5773 v.AddArg(x) 5774 v.AddArg(mem) 5775 return true 5776 } 5777 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 5778 // cond: 5779 // result: (MOVBstore [off] {sym} ptr x mem) 5780 for { 5781 off := v.AuxInt 5782 sym := v.Aux 5783 ptr := v.Args[0] 5784 v_1 := v.Args[1] 5785 if v_1.Op != OpARMMOVHreg { 5786 break 5787 } 5788 x := v_1.Args[0] 5789 mem := v.Args[2] 5790 v.reset(OpARMMOVBstore) 5791 v.AuxInt = off 5792 v.Aux = sym 5793 v.AddArg(ptr) 5794 v.AddArg(x) 5795 v.AddArg(mem) 5796 return true 5797 } 5798 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 5799 // cond: 5800 // result: (MOVBstore [off] {sym} ptr x mem) 5801 for { 5802 off := v.AuxInt 5803 sym := v.Aux 5804 ptr := v.Args[0] 5805 v_1 := v.Args[1] 5806 if v_1.Op != OpARMMOVHUreg { 5807 break 5808 } 5809 x := v_1.Args[0] 5810 mem := v.Args[2] 5811 v.reset(OpARMMOVBstore) 5812 v.AuxInt = off 5813 v.Aux = sym 5814 v.AddArg(ptr) 5815 v.AddArg(x) 5816 v.AddArg(mem) 5817 return true 5818 } 5819 return false 5820 } 5821 func rewriteValueARM_OpARMMOVDload(v *Value) bool { 5822 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 5823 // cond: 5824 // result: (MOVDload [off1+off2] {sym} ptr mem) 5825 for { 5826 off1 := v.AuxInt 5827 sym := v.Aux 5828 v_0 := v.Args[0] 5829 if v_0.Op != OpARMADDconst { 5830 break 5831 } 5832 off2 := v_0.AuxInt 5833 ptr := v_0.Args[0] 5834 mem := v.Args[1] 5835 v.reset(OpARMMOVDload) 5836 v.AuxInt = off1 + off2 5837 v.Aux = sym 5838 v.AddArg(ptr) 5839 v.AddArg(mem) 5840 return true 5841 } 5842 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5843 // cond: canMergeSym(sym1,sym2) 5844 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5845 for { 5846 off1 := v.AuxInt 5847 sym1 := v.Aux 5848 v_0 := v.Args[0] 5849 if v_0.Op != OpARMMOVWaddr { 5850 break 5851 } 5852 off2 := v_0.AuxInt 5853 sym2 := v_0.Aux 5854 ptr := v_0.Args[0] 5855 mem := v.Args[1] 5856 if !(canMergeSym(sym1, sym2)) { 5857 break 5858 } 5859 v.reset(OpARMMOVDload) 5860 v.AuxInt = off1 + off2 5861 v.Aux = mergeSym(sym1, sym2) 5862 v.AddArg(ptr) 5863 v.AddArg(mem) 5864 return true 5865 } 5866 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 5867 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5868 // result: x 5869 for { 5870 off := v.AuxInt 5871 sym := v.Aux 5872 ptr := v.Args[0] 5873 v_1 := v.Args[1] 5874 if v_1.Op != OpARMMOVDstore { 5875 break 5876 } 5877 off2 := v_1.AuxInt 5878 sym2 := v_1.Aux 5879 ptr2 := v_1.Args[0] 5880 x := v_1.Args[1] 5881 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5882 break 5883 } 5884 v.reset(OpCopy) 5885 v.Type = x.Type 5886 v.AddArg(x) 5887 return true 5888 } 5889 return false 5890 } 5891 func rewriteValueARM_OpARMMOVDstore(v *Value) bool { 5892 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5893 // cond: 5894 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 5895 for { 5896 off1 := v.AuxInt 5897 sym := v.Aux 5898 v_0 := v.Args[0] 5899 if v_0.Op != OpARMADDconst { 5900 break 5901 } 5902 off2 := v_0.AuxInt 5903 ptr := v_0.Args[0] 5904 val := v.Args[1] 5905 mem := v.Args[2] 5906 v.reset(OpARMMOVDstore) 5907 v.AuxInt = off1 + off2 5908 v.Aux = sym 5909 v.AddArg(ptr) 5910 v.AddArg(val) 5911 v.AddArg(mem) 5912 return true 5913 } 5914 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5915 // cond: canMergeSym(sym1,sym2) 5916 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5917 for { 5918 off1 := v.AuxInt 5919 sym1 := v.Aux 5920 v_0 := v.Args[0] 5921 if v_0.Op != OpARMMOVWaddr { 5922 break 5923 } 5924 off2 := v_0.AuxInt 5925 sym2 := v_0.Aux 5926 ptr := v_0.Args[0] 5927 val := v.Args[1] 5928 mem := v.Args[2] 5929 if !(canMergeSym(sym1, sym2)) { 5930 break 5931 } 5932 v.reset(OpARMMOVDstore) 5933 v.AuxInt = off1 + off2 5934 v.Aux = mergeSym(sym1, sym2) 5935 v.AddArg(ptr) 5936 v.AddArg(val) 5937 v.AddArg(mem) 5938 return true 5939 } 5940 return false 5941 } 5942 func rewriteValueARM_OpARMMOVFload(v *Value) bool { 5943 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 5944 // cond: 5945 // result: (MOVFload [off1+off2] {sym} ptr mem) 5946 for { 5947 off1 := v.AuxInt 5948 sym := v.Aux 5949 v_0 := v.Args[0] 5950 if v_0.Op != OpARMADDconst { 5951 break 5952 } 5953 off2 := v_0.AuxInt 5954 ptr := v_0.Args[0] 5955 mem := v.Args[1] 5956 v.reset(OpARMMOVFload) 5957 v.AuxInt = off1 + off2 5958 v.Aux = sym 5959 v.AddArg(ptr) 5960 v.AddArg(mem) 5961 return true 5962 } 5963 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5964 // cond: canMergeSym(sym1,sym2) 5965 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5966 for { 5967 off1 := v.AuxInt 5968 sym1 := v.Aux 5969 v_0 := v.Args[0] 5970 if v_0.Op != OpARMMOVWaddr { 5971 break 5972 } 5973 off2 := v_0.AuxInt 5974 sym2 := v_0.Aux 5975 ptr := v_0.Args[0] 5976 mem := v.Args[1] 5977 if !(canMergeSym(sym1, sym2)) { 5978 break 5979 } 5980 v.reset(OpARMMOVFload) 5981 v.AuxInt = off1 + off2 5982 v.Aux = mergeSym(sym1, sym2) 5983 v.AddArg(ptr) 5984 v.AddArg(mem) 5985 return true 5986 } 5987 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 5988 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5989 // result: x 5990 for { 5991 off := v.AuxInt 5992 sym := v.Aux 5993 ptr := v.Args[0] 5994 v_1 := v.Args[1] 5995 if v_1.Op != OpARMMOVFstore { 5996 break 5997 } 5998 off2 := v_1.AuxInt 5999 sym2 := v_1.Aux 6000 ptr2 := v_1.Args[0] 6001 x := v_1.Args[1] 6002 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6003 break 6004 } 6005 v.reset(OpCopy) 6006 v.Type = x.Type 6007 v.AddArg(x) 6008 return true 6009 } 6010 return false 6011 } 6012 func rewriteValueARM_OpARMMOVFstore(v *Value) bool { 6013 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6014 // cond: 6015 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 6016 for { 6017 off1 := v.AuxInt 6018 sym := v.Aux 6019 v_0 := v.Args[0] 6020 if v_0.Op != OpARMADDconst { 6021 break 6022 } 6023 off2 := v_0.AuxInt 6024 ptr := v_0.Args[0] 6025 val := v.Args[1] 6026 mem := v.Args[2] 6027 v.reset(OpARMMOVFstore) 6028 v.AuxInt = off1 + off2 6029 v.Aux = sym 6030 v.AddArg(ptr) 6031 v.AddArg(val) 6032 v.AddArg(mem) 6033 return true 6034 } 6035 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6036 // cond: canMergeSym(sym1,sym2) 6037 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6038 for { 6039 off1 := v.AuxInt 6040 sym1 := v.Aux 6041 v_0 := v.Args[0] 6042 if v_0.Op != OpARMMOVWaddr { 6043 break 6044 } 6045 off2 := v_0.AuxInt 6046 sym2 := v_0.Aux 6047 ptr := v_0.Args[0] 6048 val := v.Args[1] 6049 mem := v.Args[2] 6050 if !(canMergeSym(sym1, sym2)) { 6051 break 6052 } 6053 v.reset(OpARMMOVFstore) 6054 v.AuxInt = off1 + off2 6055 v.Aux = mergeSym(sym1, sym2) 6056 v.AddArg(ptr) 6057 v.AddArg(val) 6058 v.AddArg(mem) 6059 return true 6060 } 6061 return false 6062 } 6063 func rewriteValueARM_OpARMMOVHUload(v *Value) bool { 6064 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 6065 // cond: 6066 // result: (MOVHUload [off1+off2] {sym} ptr mem) 6067 for { 6068 off1 := v.AuxInt 6069 sym := v.Aux 6070 v_0 := v.Args[0] 6071 if v_0.Op != OpARMADDconst { 6072 break 6073 } 6074 off2 := v_0.AuxInt 6075 ptr := v_0.Args[0] 6076 mem := v.Args[1] 6077 v.reset(OpARMMOVHUload) 6078 v.AuxInt = off1 + off2 6079 v.Aux = sym 6080 v.AddArg(ptr) 6081 v.AddArg(mem) 6082 return true 6083 } 6084 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6085 // cond: canMergeSym(sym1,sym2) 6086 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6087 for { 6088 off1 := v.AuxInt 6089 sym1 := v.Aux 6090 v_0 := v.Args[0] 6091 if v_0.Op != OpARMMOVWaddr { 6092 break 6093 } 6094 off2 := v_0.AuxInt 6095 sym2 := v_0.Aux 6096 ptr := v_0.Args[0] 6097 mem := v.Args[1] 6098 if !(canMergeSym(sym1, sym2)) { 6099 break 6100 } 6101 v.reset(OpARMMOVHUload) 6102 v.AuxInt = off1 + off2 6103 v.Aux = mergeSym(sym1, sym2) 6104 v.AddArg(ptr) 6105 v.AddArg(mem) 6106 return true 6107 } 6108 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 6109 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type) 6110 // result: x 6111 for { 6112 off := v.AuxInt 6113 sym := v.Aux 6114 ptr := v.Args[0] 6115 v_1 := v.Args[1] 6116 if v_1.Op != OpARMMOVHstore { 6117 break 6118 } 6119 off2 := v_1.AuxInt 6120 sym2 := v_1.Aux 6121 ptr2 := v_1.Args[0] 6122 x := v_1.Args[1] 6123 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type)) { 6124 break 6125 } 6126 v.reset(OpCopy) 6127 v.Type = x.Type 6128 v.AddArg(x) 6129 return true 6130 } 6131 return false 6132 } 6133 func rewriteValueARM_OpARMMOVHUreg(v *Value) bool { 6134 // match: (MOVHUreg x:(MOVBUload _ _)) 6135 // cond: 6136 // result: (MOVWreg x) 6137 for { 6138 x := v.Args[0] 6139 if x.Op != OpARMMOVBUload { 6140 break 6141 } 6142 v.reset(OpARMMOVWreg) 6143 v.AddArg(x) 6144 return true 6145 } 6146 // match: (MOVHUreg x:(MOVHUload _ _)) 6147 // cond: 6148 // result: (MOVWreg x) 6149 for { 6150 x := v.Args[0] 6151 if x.Op != OpARMMOVHUload { 6152 break 6153 } 6154 v.reset(OpARMMOVWreg) 6155 v.AddArg(x) 6156 return true 6157 } 6158 // match: (MOVHUreg (ANDconst [c] x)) 6159 // cond: 6160 // result: (ANDconst [c&0xffff] x) 6161 for { 6162 v_0 := v.Args[0] 6163 if v_0.Op != OpARMANDconst { 6164 break 6165 } 6166 c := v_0.AuxInt 6167 x := v_0.Args[0] 6168 v.reset(OpARMANDconst) 6169 v.AuxInt = c & 0xffff 6170 v.AddArg(x) 6171 return true 6172 } 6173 // match: (MOVHUreg x:(MOVBUreg _)) 6174 // cond: 6175 // result: (MOVWreg x) 6176 for { 6177 x := v.Args[0] 6178 if x.Op != OpARMMOVBUreg { 6179 break 6180 } 6181 v.reset(OpARMMOVWreg) 6182 v.AddArg(x) 6183 return true 6184 } 6185 // match: (MOVHUreg x:(MOVHUreg _)) 6186 // cond: 6187 // result: (MOVWreg x) 6188 for { 6189 x := v.Args[0] 6190 if x.Op != OpARMMOVHUreg { 6191 break 6192 } 6193 v.reset(OpARMMOVWreg) 6194 v.AddArg(x) 6195 return true 6196 } 6197 // match: (MOVHUreg (MOVWconst [c])) 6198 // cond: 6199 // result: (MOVWconst [int64(uint16(c))]) 6200 for { 6201 v_0 := v.Args[0] 6202 if v_0.Op != OpARMMOVWconst { 6203 break 6204 } 6205 c := v_0.AuxInt 6206 v.reset(OpARMMOVWconst) 6207 v.AuxInt = int64(uint16(c)) 6208 return true 6209 } 6210 return false 6211 } 6212 func rewriteValueARM_OpARMMOVHload(v *Value) bool { 6213 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 6214 // cond: 6215 // result: (MOVHload [off1+off2] {sym} ptr mem) 6216 for { 6217 off1 := v.AuxInt 6218 sym := v.Aux 6219 v_0 := v.Args[0] 6220 if v_0.Op != OpARMADDconst { 6221 break 6222 } 6223 off2 := v_0.AuxInt 6224 ptr := v_0.Args[0] 6225 mem := v.Args[1] 6226 v.reset(OpARMMOVHload) 6227 v.AuxInt = off1 + off2 6228 v.Aux = sym 6229 v.AddArg(ptr) 6230 v.AddArg(mem) 6231 return true 6232 } 6233 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6234 // cond: canMergeSym(sym1,sym2) 6235 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6236 for { 6237 off1 := v.AuxInt 6238 sym1 := v.Aux 6239 v_0 := v.Args[0] 6240 if v_0.Op != OpARMMOVWaddr { 6241 break 6242 } 6243 off2 := v_0.AuxInt 6244 sym2 := v_0.Aux 6245 ptr := v_0.Args[0] 6246 mem := v.Args[1] 6247 if !(canMergeSym(sym1, sym2)) { 6248 break 6249 } 6250 v.reset(OpARMMOVHload) 6251 v.AuxInt = off1 + off2 6252 v.Aux = mergeSym(sym1, sym2) 6253 v.AddArg(ptr) 6254 v.AddArg(mem) 6255 return true 6256 } 6257 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 6258 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type) 6259 // result: x 6260 for { 6261 off := v.AuxInt 6262 sym := v.Aux 6263 ptr := v.Args[0] 6264 v_1 := v.Args[1] 6265 if v_1.Op != OpARMMOVHstore { 6266 break 6267 } 6268 off2 := v_1.AuxInt 6269 sym2 := v_1.Aux 6270 ptr2 := v_1.Args[0] 6271 x := v_1.Args[1] 6272 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type)) { 6273 break 6274 } 6275 v.reset(OpCopy) 6276 v.Type = x.Type 6277 v.AddArg(x) 6278 return true 6279 } 6280 return false 6281 } 6282 func rewriteValueARM_OpARMMOVHreg(v *Value) bool { 6283 // match: (MOVHreg x:(MOVBload _ _)) 6284 // cond: 6285 // result: (MOVWreg x) 6286 for { 6287 x := v.Args[0] 6288 if x.Op != OpARMMOVBload { 6289 break 6290 } 6291 v.reset(OpARMMOVWreg) 6292 v.AddArg(x) 6293 return true 6294 } 6295 // match: (MOVHreg x:(MOVBUload _ _)) 6296 // cond: 6297 // result: (MOVWreg x) 6298 for { 6299 x := v.Args[0] 6300 if x.Op != OpARMMOVBUload { 6301 break 6302 } 6303 v.reset(OpARMMOVWreg) 6304 v.AddArg(x) 6305 return true 6306 } 6307 // match: (MOVHreg x:(MOVHload _ _)) 6308 // cond: 6309 // result: (MOVWreg x) 6310 for { 6311 x := v.Args[0] 6312 if x.Op != OpARMMOVHload { 6313 break 6314 } 6315 v.reset(OpARMMOVWreg) 6316 v.AddArg(x) 6317 return true 6318 } 6319 // match: (MOVHreg (ANDconst [c] x)) 6320 // cond: c & 0x8000 == 0 6321 // result: (ANDconst [c&0x7fff] x) 6322 for { 6323 v_0 := v.Args[0] 6324 if v_0.Op != OpARMANDconst { 6325 break 6326 } 6327 c := v_0.AuxInt 6328 x := v_0.Args[0] 6329 if !(c&0x8000 == 0) { 6330 break 6331 } 6332 v.reset(OpARMANDconst) 6333 v.AuxInt = c & 0x7fff 6334 v.AddArg(x) 6335 return true 6336 } 6337 // match: (MOVHreg x:(MOVBreg _)) 6338 // cond: 6339 // result: (MOVWreg x) 6340 for { 6341 x := v.Args[0] 6342 if x.Op != OpARMMOVBreg { 6343 break 6344 } 6345 v.reset(OpARMMOVWreg) 6346 v.AddArg(x) 6347 return true 6348 } 6349 // match: (MOVHreg x:(MOVBUreg _)) 6350 // cond: 6351 // result: (MOVWreg x) 6352 for { 6353 x := v.Args[0] 6354 if x.Op != OpARMMOVBUreg { 6355 break 6356 } 6357 v.reset(OpARMMOVWreg) 6358 v.AddArg(x) 6359 return true 6360 } 6361 // match: (MOVHreg x:(MOVHreg _)) 6362 // cond: 6363 // result: (MOVWreg x) 6364 for { 6365 x := v.Args[0] 6366 if x.Op != OpARMMOVHreg { 6367 break 6368 } 6369 v.reset(OpARMMOVWreg) 6370 v.AddArg(x) 6371 return true 6372 } 6373 // match: (MOVHreg (MOVWconst [c])) 6374 // cond: 6375 // result: (MOVWconst [int64(int16(c))]) 6376 for { 6377 v_0 := v.Args[0] 6378 if v_0.Op != OpARMMOVWconst { 6379 break 6380 } 6381 c := v_0.AuxInt 6382 v.reset(OpARMMOVWconst) 6383 v.AuxInt = int64(int16(c)) 6384 return true 6385 } 6386 return false 6387 } 6388 func rewriteValueARM_OpARMMOVHstore(v *Value) bool { 6389 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6390 // cond: 6391 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 6392 for { 6393 off1 := v.AuxInt 6394 sym := v.Aux 6395 v_0 := v.Args[0] 6396 if v_0.Op != OpARMADDconst { 6397 break 6398 } 6399 off2 := v_0.AuxInt 6400 ptr := v_0.Args[0] 6401 val := v.Args[1] 6402 mem := v.Args[2] 6403 v.reset(OpARMMOVHstore) 6404 v.AuxInt = off1 + off2 6405 v.Aux = sym 6406 v.AddArg(ptr) 6407 v.AddArg(val) 6408 v.AddArg(mem) 6409 return true 6410 } 6411 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6412 // cond: canMergeSym(sym1,sym2) 6413 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6414 for { 6415 off1 := v.AuxInt 6416 sym1 := v.Aux 6417 v_0 := v.Args[0] 6418 if v_0.Op != OpARMMOVWaddr { 6419 break 6420 } 6421 off2 := v_0.AuxInt 6422 sym2 := v_0.Aux 6423 ptr := v_0.Args[0] 6424 val := v.Args[1] 6425 mem := v.Args[2] 6426 if !(canMergeSym(sym1, sym2)) { 6427 break 6428 } 6429 v.reset(OpARMMOVHstore) 6430 v.AuxInt = off1 + off2 6431 v.Aux = mergeSym(sym1, sym2) 6432 v.AddArg(ptr) 6433 v.AddArg(val) 6434 v.AddArg(mem) 6435 return true 6436 } 6437 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 6438 // cond: 6439 // result: (MOVHstore [off] {sym} ptr x mem) 6440 for { 6441 off := v.AuxInt 6442 sym := v.Aux 6443 ptr := v.Args[0] 6444 v_1 := v.Args[1] 6445 if v_1.Op != OpARMMOVHreg { 6446 break 6447 } 6448 x := v_1.Args[0] 6449 mem := v.Args[2] 6450 v.reset(OpARMMOVHstore) 6451 v.AuxInt = off 6452 v.Aux = sym 6453 v.AddArg(ptr) 6454 v.AddArg(x) 6455 v.AddArg(mem) 6456 return true 6457 } 6458 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 6459 // cond: 6460 // result: (MOVHstore [off] {sym} ptr x mem) 6461 for { 6462 off := v.AuxInt 6463 sym := v.Aux 6464 ptr := v.Args[0] 6465 v_1 := v.Args[1] 6466 if v_1.Op != OpARMMOVHUreg { 6467 break 6468 } 6469 x := v_1.Args[0] 6470 mem := v.Args[2] 6471 v.reset(OpARMMOVHstore) 6472 v.AuxInt = off 6473 v.Aux = sym 6474 v.AddArg(ptr) 6475 v.AddArg(x) 6476 v.AddArg(mem) 6477 return true 6478 } 6479 return false 6480 } 6481 func rewriteValueARM_OpARMMOVWload(v *Value) bool { 6482 b := v.Block 6483 _ = b 6484 config := b.Func.Config 6485 _ = config 6486 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 6487 // cond: 6488 // result: (MOVWload [off1+off2] {sym} ptr mem) 6489 for { 6490 off1 := v.AuxInt 6491 sym := v.Aux 6492 v_0 := v.Args[0] 6493 if v_0.Op != OpARMADDconst { 6494 break 6495 } 6496 off2 := v_0.AuxInt 6497 ptr := v_0.Args[0] 6498 mem := v.Args[1] 6499 v.reset(OpARMMOVWload) 6500 v.AuxInt = off1 + off2 6501 v.Aux = sym 6502 v.AddArg(ptr) 6503 v.AddArg(mem) 6504 return true 6505 } 6506 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6507 // cond: canMergeSym(sym1,sym2) 6508 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6509 for { 6510 off1 := v.AuxInt 6511 sym1 := v.Aux 6512 v_0 := v.Args[0] 6513 if v_0.Op != OpARMMOVWaddr { 6514 break 6515 } 6516 off2 := v_0.AuxInt 6517 sym2 := v_0.Aux 6518 ptr := v_0.Args[0] 6519 mem := v.Args[1] 6520 if !(canMergeSym(sym1, sym2)) { 6521 break 6522 } 6523 v.reset(OpARMMOVWload) 6524 v.AuxInt = off1 + off2 6525 v.Aux = mergeSym(sym1, sym2) 6526 v.AddArg(ptr) 6527 v.AddArg(mem) 6528 return true 6529 } 6530 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6531 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6532 // result: x 6533 for { 6534 off := v.AuxInt 6535 sym := v.Aux 6536 ptr := v.Args[0] 6537 v_1 := v.Args[1] 6538 if v_1.Op != OpARMMOVWstore { 6539 break 6540 } 6541 off2 := v_1.AuxInt 6542 sym2 := v_1.Aux 6543 ptr2 := v_1.Args[0] 6544 x := v_1.Args[1] 6545 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6546 break 6547 } 6548 v.reset(OpCopy) 6549 v.Type = x.Type 6550 v.AddArg(x) 6551 return true 6552 } 6553 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 6554 // cond: sym == nil && !config.nacl 6555 // result: (MOVWloadidx ptr idx mem) 6556 for { 6557 if v.AuxInt != 0 { 6558 break 6559 } 6560 sym := v.Aux 6561 v_0 := v.Args[0] 6562 if v_0.Op != OpARMADD { 6563 break 6564 } 6565 ptr := v_0.Args[0] 6566 idx := v_0.Args[1] 6567 mem := v.Args[1] 6568 if !(sym == nil && !config.nacl) { 6569 break 6570 } 6571 v.reset(OpARMMOVWloadidx) 6572 v.AddArg(ptr) 6573 v.AddArg(idx) 6574 v.AddArg(mem) 6575 return true 6576 } 6577 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 6578 // cond: sym == nil && !config.nacl 6579 // result: (MOVWloadshiftLL ptr idx [c] mem) 6580 for { 6581 if v.AuxInt != 0 { 6582 break 6583 } 6584 sym := v.Aux 6585 v_0 := v.Args[0] 6586 if v_0.Op != OpARMADDshiftLL { 6587 break 6588 } 6589 c := v_0.AuxInt 6590 ptr := v_0.Args[0] 6591 idx := v_0.Args[1] 6592 mem := v.Args[1] 6593 if !(sym == nil && !config.nacl) { 6594 break 6595 } 6596 v.reset(OpARMMOVWloadshiftLL) 6597 v.AuxInt = c 6598 v.AddArg(ptr) 6599 v.AddArg(idx) 6600 v.AddArg(mem) 6601 return true 6602 } 6603 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 6604 // cond: sym == nil && !config.nacl 6605 // result: (MOVWloadshiftRL ptr idx [c] mem) 6606 for { 6607 if v.AuxInt != 0 { 6608 break 6609 } 6610 sym := v.Aux 6611 v_0 := v.Args[0] 6612 if v_0.Op != OpARMADDshiftRL { 6613 break 6614 } 6615 c := v_0.AuxInt 6616 ptr := v_0.Args[0] 6617 idx := v_0.Args[1] 6618 mem := v.Args[1] 6619 if !(sym == nil && !config.nacl) { 6620 break 6621 } 6622 v.reset(OpARMMOVWloadshiftRL) 6623 v.AuxInt = c 6624 v.AddArg(ptr) 6625 v.AddArg(idx) 6626 v.AddArg(mem) 6627 return true 6628 } 6629 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 6630 // cond: sym == nil && !config.nacl 6631 // result: (MOVWloadshiftRA ptr idx [c] mem) 6632 for { 6633 if v.AuxInt != 0 { 6634 break 6635 } 6636 sym := v.Aux 6637 v_0 := v.Args[0] 6638 if v_0.Op != OpARMADDshiftRA { 6639 break 6640 } 6641 c := v_0.AuxInt 6642 ptr := v_0.Args[0] 6643 idx := v_0.Args[1] 6644 mem := v.Args[1] 6645 if !(sym == nil && !config.nacl) { 6646 break 6647 } 6648 v.reset(OpARMMOVWloadshiftRA) 6649 v.AuxInt = c 6650 v.AddArg(ptr) 6651 v.AddArg(idx) 6652 v.AddArg(mem) 6653 return true 6654 } 6655 return false 6656 } 6657 func rewriteValueARM_OpARMMOVWloadidx(v *Value) bool { 6658 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 6659 // cond: isSamePtr(ptr, ptr2) 6660 // result: x 6661 for { 6662 ptr := v.Args[0] 6663 idx := v.Args[1] 6664 v_2 := v.Args[2] 6665 if v_2.Op != OpARMMOVWstoreidx { 6666 break 6667 } 6668 ptr2 := v_2.Args[0] 6669 if idx != v_2.Args[1] { 6670 break 6671 } 6672 x := v_2.Args[2] 6673 if !(isSamePtr(ptr, ptr2)) { 6674 break 6675 } 6676 v.reset(OpCopy) 6677 v.Type = x.Type 6678 v.AddArg(x) 6679 return true 6680 } 6681 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 6682 // cond: 6683 // result: (MOVWload [c] ptr mem) 6684 for { 6685 ptr := v.Args[0] 6686 v_1 := v.Args[1] 6687 if v_1.Op != OpARMMOVWconst { 6688 break 6689 } 6690 c := v_1.AuxInt 6691 mem := v.Args[2] 6692 v.reset(OpARMMOVWload) 6693 v.AuxInt = c 6694 v.AddArg(ptr) 6695 v.AddArg(mem) 6696 return true 6697 } 6698 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 6699 // cond: 6700 // result: (MOVWload [c] ptr mem) 6701 for { 6702 v_0 := v.Args[0] 6703 if v_0.Op != OpARMMOVWconst { 6704 break 6705 } 6706 c := v_0.AuxInt 6707 ptr := v.Args[1] 6708 mem := v.Args[2] 6709 v.reset(OpARMMOVWload) 6710 v.AuxInt = c 6711 v.AddArg(ptr) 6712 v.AddArg(mem) 6713 return true 6714 } 6715 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 6716 // cond: 6717 // result: (MOVWloadshiftLL ptr idx [c] mem) 6718 for { 6719 ptr := v.Args[0] 6720 v_1 := v.Args[1] 6721 if v_1.Op != OpARMSLLconst { 6722 break 6723 } 6724 c := v_1.AuxInt 6725 idx := v_1.Args[0] 6726 mem := v.Args[2] 6727 v.reset(OpARMMOVWloadshiftLL) 6728 v.AuxInt = c 6729 v.AddArg(ptr) 6730 v.AddArg(idx) 6731 v.AddArg(mem) 6732 return true 6733 } 6734 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 6735 // cond: 6736 // result: (MOVWloadshiftLL ptr idx [c] mem) 6737 for { 6738 v_0 := v.Args[0] 6739 if v_0.Op != OpARMSLLconst { 6740 break 6741 } 6742 c := v_0.AuxInt 6743 idx := v_0.Args[0] 6744 ptr := v.Args[1] 6745 mem := v.Args[2] 6746 v.reset(OpARMMOVWloadshiftLL) 6747 v.AuxInt = c 6748 v.AddArg(ptr) 6749 v.AddArg(idx) 6750 v.AddArg(mem) 6751 return true 6752 } 6753 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 6754 // cond: 6755 // result: (MOVWloadshiftRL ptr idx [c] mem) 6756 for { 6757 ptr := v.Args[0] 6758 v_1 := v.Args[1] 6759 if v_1.Op != OpARMSRLconst { 6760 break 6761 } 6762 c := v_1.AuxInt 6763 idx := v_1.Args[0] 6764 mem := v.Args[2] 6765 v.reset(OpARMMOVWloadshiftRL) 6766 v.AuxInt = c 6767 v.AddArg(ptr) 6768 v.AddArg(idx) 6769 v.AddArg(mem) 6770 return true 6771 } 6772 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 6773 // cond: 6774 // result: (MOVWloadshiftRL ptr idx [c] mem) 6775 for { 6776 v_0 := v.Args[0] 6777 if v_0.Op != OpARMSRLconst { 6778 break 6779 } 6780 c := v_0.AuxInt 6781 idx := v_0.Args[0] 6782 ptr := v.Args[1] 6783 mem := v.Args[2] 6784 v.reset(OpARMMOVWloadshiftRL) 6785 v.AuxInt = c 6786 v.AddArg(ptr) 6787 v.AddArg(idx) 6788 v.AddArg(mem) 6789 return true 6790 } 6791 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 6792 // cond: 6793 // result: (MOVWloadshiftRA ptr idx [c] mem) 6794 for { 6795 ptr := v.Args[0] 6796 v_1 := v.Args[1] 6797 if v_1.Op != OpARMSRAconst { 6798 break 6799 } 6800 c := v_1.AuxInt 6801 idx := v_1.Args[0] 6802 mem := v.Args[2] 6803 v.reset(OpARMMOVWloadshiftRA) 6804 v.AuxInt = c 6805 v.AddArg(ptr) 6806 v.AddArg(idx) 6807 v.AddArg(mem) 6808 return true 6809 } 6810 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 6811 // cond: 6812 // result: (MOVWloadshiftRA ptr idx [c] mem) 6813 for { 6814 v_0 := v.Args[0] 6815 if v_0.Op != OpARMSRAconst { 6816 break 6817 } 6818 c := v_0.AuxInt 6819 idx := v_0.Args[0] 6820 ptr := v.Args[1] 6821 mem := v.Args[2] 6822 v.reset(OpARMMOVWloadshiftRA) 6823 v.AuxInt = c 6824 v.AddArg(ptr) 6825 v.AddArg(idx) 6826 v.AddArg(mem) 6827 return true 6828 } 6829 return false 6830 } 6831 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value) bool { 6832 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 6833 // cond: c==d && isSamePtr(ptr, ptr2) 6834 // result: x 6835 for { 6836 c := v.AuxInt 6837 ptr := v.Args[0] 6838 idx := v.Args[1] 6839 v_2 := v.Args[2] 6840 if v_2.Op != OpARMMOVWstoreshiftLL { 6841 break 6842 } 6843 d := v_2.AuxInt 6844 ptr2 := v_2.Args[0] 6845 if idx != v_2.Args[1] { 6846 break 6847 } 6848 x := v_2.Args[2] 6849 if !(c == d && isSamePtr(ptr, ptr2)) { 6850 break 6851 } 6852 v.reset(OpCopy) 6853 v.Type = x.Type 6854 v.AddArg(x) 6855 return true 6856 } 6857 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 6858 // cond: 6859 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 6860 for { 6861 d := v.AuxInt 6862 ptr := v.Args[0] 6863 v_1 := v.Args[1] 6864 if v_1.Op != OpARMMOVWconst { 6865 break 6866 } 6867 c := v_1.AuxInt 6868 mem := v.Args[2] 6869 v.reset(OpARMMOVWload) 6870 v.AuxInt = int64(uint32(c) << uint64(d)) 6871 v.AddArg(ptr) 6872 v.AddArg(mem) 6873 return true 6874 } 6875 return false 6876 } 6877 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value) bool { 6878 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 6879 // cond: c==d && isSamePtr(ptr, ptr2) 6880 // result: x 6881 for { 6882 c := v.AuxInt 6883 ptr := v.Args[0] 6884 idx := v.Args[1] 6885 v_2 := v.Args[2] 6886 if v_2.Op != OpARMMOVWstoreshiftRA { 6887 break 6888 } 6889 d := v_2.AuxInt 6890 ptr2 := v_2.Args[0] 6891 if idx != v_2.Args[1] { 6892 break 6893 } 6894 x := v_2.Args[2] 6895 if !(c == d && isSamePtr(ptr, ptr2)) { 6896 break 6897 } 6898 v.reset(OpCopy) 6899 v.Type = x.Type 6900 v.AddArg(x) 6901 return true 6902 } 6903 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 6904 // cond: 6905 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 6906 for { 6907 d := v.AuxInt 6908 ptr := v.Args[0] 6909 v_1 := v.Args[1] 6910 if v_1.Op != OpARMMOVWconst { 6911 break 6912 } 6913 c := v_1.AuxInt 6914 mem := v.Args[2] 6915 v.reset(OpARMMOVWload) 6916 v.AuxInt = int64(int32(c) >> uint64(d)) 6917 v.AddArg(ptr) 6918 v.AddArg(mem) 6919 return true 6920 } 6921 return false 6922 } 6923 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value) bool { 6924 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 6925 // cond: c==d && isSamePtr(ptr, ptr2) 6926 // result: x 6927 for { 6928 c := v.AuxInt 6929 ptr := v.Args[0] 6930 idx := v.Args[1] 6931 v_2 := v.Args[2] 6932 if v_2.Op != OpARMMOVWstoreshiftRL { 6933 break 6934 } 6935 d := v_2.AuxInt 6936 ptr2 := v_2.Args[0] 6937 if idx != v_2.Args[1] { 6938 break 6939 } 6940 x := v_2.Args[2] 6941 if !(c == d && isSamePtr(ptr, ptr2)) { 6942 break 6943 } 6944 v.reset(OpCopy) 6945 v.Type = x.Type 6946 v.AddArg(x) 6947 return true 6948 } 6949 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 6950 // cond: 6951 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 6952 for { 6953 d := v.AuxInt 6954 ptr := v.Args[0] 6955 v_1 := v.Args[1] 6956 if v_1.Op != OpARMMOVWconst { 6957 break 6958 } 6959 c := v_1.AuxInt 6960 mem := v.Args[2] 6961 v.reset(OpARMMOVWload) 6962 v.AuxInt = int64(uint32(c) >> uint64(d)) 6963 v.AddArg(ptr) 6964 v.AddArg(mem) 6965 return true 6966 } 6967 return false 6968 } 6969 func rewriteValueARM_OpARMMOVWreg(v *Value) bool { 6970 // match: (MOVWreg x) 6971 // cond: x.Uses == 1 6972 // result: (MOVWnop x) 6973 for { 6974 x := v.Args[0] 6975 if !(x.Uses == 1) { 6976 break 6977 } 6978 v.reset(OpARMMOVWnop) 6979 v.AddArg(x) 6980 return true 6981 } 6982 // match: (MOVWreg (MOVWconst [c])) 6983 // cond: 6984 // result: (MOVWconst [c]) 6985 for { 6986 v_0 := v.Args[0] 6987 if v_0.Op != OpARMMOVWconst { 6988 break 6989 } 6990 c := v_0.AuxInt 6991 v.reset(OpARMMOVWconst) 6992 v.AuxInt = c 6993 return true 6994 } 6995 return false 6996 } 6997 func rewriteValueARM_OpARMMOVWstore(v *Value) bool { 6998 b := v.Block 6999 _ = b 7000 config := b.Func.Config 7001 _ = config 7002 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7003 // cond: 7004 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 7005 for { 7006 off1 := v.AuxInt 7007 sym := v.Aux 7008 v_0 := v.Args[0] 7009 if v_0.Op != OpARMADDconst { 7010 break 7011 } 7012 off2 := v_0.AuxInt 7013 ptr := v_0.Args[0] 7014 val := v.Args[1] 7015 mem := v.Args[2] 7016 v.reset(OpARMMOVWstore) 7017 v.AuxInt = off1 + off2 7018 v.Aux = sym 7019 v.AddArg(ptr) 7020 v.AddArg(val) 7021 v.AddArg(mem) 7022 return true 7023 } 7024 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7025 // cond: canMergeSym(sym1,sym2) 7026 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7027 for { 7028 off1 := v.AuxInt 7029 sym1 := v.Aux 7030 v_0 := v.Args[0] 7031 if v_0.Op != OpARMMOVWaddr { 7032 break 7033 } 7034 off2 := v_0.AuxInt 7035 sym2 := v_0.Aux 7036 ptr := v_0.Args[0] 7037 val := v.Args[1] 7038 mem := v.Args[2] 7039 if !(canMergeSym(sym1, sym2)) { 7040 break 7041 } 7042 v.reset(OpARMMOVWstore) 7043 v.AuxInt = off1 + off2 7044 v.Aux = mergeSym(sym1, sym2) 7045 v.AddArg(ptr) 7046 v.AddArg(val) 7047 v.AddArg(mem) 7048 return true 7049 } 7050 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 7051 // cond: sym == nil && !config.nacl 7052 // result: (MOVWstoreidx ptr idx val mem) 7053 for { 7054 if v.AuxInt != 0 { 7055 break 7056 } 7057 sym := v.Aux 7058 v_0 := v.Args[0] 7059 if v_0.Op != OpARMADD { 7060 break 7061 } 7062 ptr := v_0.Args[0] 7063 idx := v_0.Args[1] 7064 val := v.Args[1] 7065 mem := v.Args[2] 7066 if !(sym == nil && !config.nacl) { 7067 break 7068 } 7069 v.reset(OpARMMOVWstoreidx) 7070 v.AddArg(ptr) 7071 v.AddArg(idx) 7072 v.AddArg(val) 7073 v.AddArg(mem) 7074 return true 7075 } 7076 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 7077 // cond: sym == nil && !config.nacl 7078 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7079 for { 7080 if v.AuxInt != 0 { 7081 break 7082 } 7083 sym := v.Aux 7084 v_0 := v.Args[0] 7085 if v_0.Op != OpARMADDshiftLL { 7086 break 7087 } 7088 c := v_0.AuxInt 7089 ptr := v_0.Args[0] 7090 idx := v_0.Args[1] 7091 val := v.Args[1] 7092 mem := v.Args[2] 7093 if !(sym == nil && !config.nacl) { 7094 break 7095 } 7096 v.reset(OpARMMOVWstoreshiftLL) 7097 v.AuxInt = c 7098 v.AddArg(ptr) 7099 v.AddArg(idx) 7100 v.AddArg(val) 7101 v.AddArg(mem) 7102 return true 7103 } 7104 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 7105 // cond: sym == nil && !config.nacl 7106 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7107 for { 7108 if v.AuxInt != 0 { 7109 break 7110 } 7111 sym := v.Aux 7112 v_0 := v.Args[0] 7113 if v_0.Op != OpARMADDshiftRL { 7114 break 7115 } 7116 c := v_0.AuxInt 7117 ptr := v_0.Args[0] 7118 idx := v_0.Args[1] 7119 val := v.Args[1] 7120 mem := v.Args[2] 7121 if !(sym == nil && !config.nacl) { 7122 break 7123 } 7124 v.reset(OpARMMOVWstoreshiftRL) 7125 v.AuxInt = c 7126 v.AddArg(ptr) 7127 v.AddArg(idx) 7128 v.AddArg(val) 7129 v.AddArg(mem) 7130 return true 7131 } 7132 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 7133 // cond: sym == nil && !config.nacl 7134 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7135 for { 7136 if v.AuxInt != 0 { 7137 break 7138 } 7139 sym := v.Aux 7140 v_0 := v.Args[0] 7141 if v_0.Op != OpARMADDshiftRA { 7142 break 7143 } 7144 c := v_0.AuxInt 7145 ptr := v_0.Args[0] 7146 idx := v_0.Args[1] 7147 val := v.Args[1] 7148 mem := v.Args[2] 7149 if !(sym == nil && !config.nacl) { 7150 break 7151 } 7152 v.reset(OpARMMOVWstoreshiftRA) 7153 v.AuxInt = c 7154 v.AddArg(ptr) 7155 v.AddArg(idx) 7156 v.AddArg(val) 7157 v.AddArg(mem) 7158 return true 7159 } 7160 return false 7161 } 7162 func rewriteValueARM_OpARMMOVWstoreidx(v *Value) bool { 7163 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 7164 // cond: 7165 // result: (MOVWstore [c] ptr val mem) 7166 for { 7167 ptr := v.Args[0] 7168 v_1 := v.Args[1] 7169 if v_1.Op != OpARMMOVWconst { 7170 break 7171 } 7172 c := v_1.AuxInt 7173 val := v.Args[2] 7174 mem := v.Args[3] 7175 v.reset(OpARMMOVWstore) 7176 v.AuxInt = c 7177 v.AddArg(ptr) 7178 v.AddArg(val) 7179 v.AddArg(mem) 7180 return true 7181 } 7182 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 7183 // cond: 7184 // result: (MOVWstore [c] ptr val mem) 7185 for { 7186 v_0 := v.Args[0] 7187 if v_0.Op != OpARMMOVWconst { 7188 break 7189 } 7190 c := v_0.AuxInt 7191 ptr := v.Args[1] 7192 val := v.Args[2] 7193 mem := v.Args[3] 7194 v.reset(OpARMMOVWstore) 7195 v.AuxInt = c 7196 v.AddArg(ptr) 7197 v.AddArg(val) 7198 v.AddArg(mem) 7199 return true 7200 } 7201 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 7202 // cond: 7203 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7204 for { 7205 ptr := v.Args[0] 7206 v_1 := v.Args[1] 7207 if v_1.Op != OpARMSLLconst { 7208 break 7209 } 7210 c := v_1.AuxInt 7211 idx := v_1.Args[0] 7212 val := v.Args[2] 7213 mem := v.Args[3] 7214 v.reset(OpARMMOVWstoreshiftLL) 7215 v.AuxInt = c 7216 v.AddArg(ptr) 7217 v.AddArg(idx) 7218 v.AddArg(val) 7219 v.AddArg(mem) 7220 return true 7221 } 7222 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 7223 // cond: 7224 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7225 for { 7226 v_0 := v.Args[0] 7227 if v_0.Op != OpARMSLLconst { 7228 break 7229 } 7230 c := v_0.AuxInt 7231 idx := v_0.Args[0] 7232 ptr := v.Args[1] 7233 val := v.Args[2] 7234 mem := v.Args[3] 7235 v.reset(OpARMMOVWstoreshiftLL) 7236 v.AuxInt = c 7237 v.AddArg(ptr) 7238 v.AddArg(idx) 7239 v.AddArg(val) 7240 v.AddArg(mem) 7241 return true 7242 } 7243 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 7244 // cond: 7245 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7246 for { 7247 ptr := v.Args[0] 7248 v_1 := v.Args[1] 7249 if v_1.Op != OpARMSRLconst { 7250 break 7251 } 7252 c := v_1.AuxInt 7253 idx := v_1.Args[0] 7254 val := v.Args[2] 7255 mem := v.Args[3] 7256 v.reset(OpARMMOVWstoreshiftRL) 7257 v.AuxInt = c 7258 v.AddArg(ptr) 7259 v.AddArg(idx) 7260 v.AddArg(val) 7261 v.AddArg(mem) 7262 return true 7263 } 7264 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 7265 // cond: 7266 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7267 for { 7268 v_0 := v.Args[0] 7269 if v_0.Op != OpARMSRLconst { 7270 break 7271 } 7272 c := v_0.AuxInt 7273 idx := v_0.Args[0] 7274 ptr := v.Args[1] 7275 val := v.Args[2] 7276 mem := v.Args[3] 7277 v.reset(OpARMMOVWstoreshiftRL) 7278 v.AuxInt = c 7279 v.AddArg(ptr) 7280 v.AddArg(idx) 7281 v.AddArg(val) 7282 v.AddArg(mem) 7283 return true 7284 } 7285 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 7286 // cond: 7287 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7288 for { 7289 ptr := v.Args[0] 7290 v_1 := v.Args[1] 7291 if v_1.Op != OpARMSRAconst { 7292 break 7293 } 7294 c := v_1.AuxInt 7295 idx := v_1.Args[0] 7296 val := v.Args[2] 7297 mem := v.Args[3] 7298 v.reset(OpARMMOVWstoreshiftRA) 7299 v.AuxInt = c 7300 v.AddArg(ptr) 7301 v.AddArg(idx) 7302 v.AddArg(val) 7303 v.AddArg(mem) 7304 return true 7305 } 7306 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 7307 // cond: 7308 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7309 for { 7310 v_0 := v.Args[0] 7311 if v_0.Op != OpARMSRAconst { 7312 break 7313 } 7314 c := v_0.AuxInt 7315 idx := v_0.Args[0] 7316 ptr := v.Args[1] 7317 val := v.Args[2] 7318 mem := v.Args[3] 7319 v.reset(OpARMMOVWstoreshiftRA) 7320 v.AuxInt = c 7321 v.AddArg(ptr) 7322 v.AddArg(idx) 7323 v.AddArg(val) 7324 v.AddArg(mem) 7325 return true 7326 } 7327 return false 7328 } 7329 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value) bool { 7330 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 7331 // cond: 7332 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 7333 for { 7334 d := v.AuxInt 7335 ptr := v.Args[0] 7336 v_1 := v.Args[1] 7337 if v_1.Op != OpARMMOVWconst { 7338 break 7339 } 7340 c := v_1.AuxInt 7341 val := v.Args[2] 7342 mem := v.Args[3] 7343 v.reset(OpARMMOVWstore) 7344 v.AuxInt = int64(uint32(c) << uint64(d)) 7345 v.AddArg(ptr) 7346 v.AddArg(val) 7347 v.AddArg(mem) 7348 return true 7349 } 7350 return false 7351 } 7352 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value) bool { 7353 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 7354 // cond: 7355 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 7356 for { 7357 d := v.AuxInt 7358 ptr := v.Args[0] 7359 v_1 := v.Args[1] 7360 if v_1.Op != OpARMMOVWconst { 7361 break 7362 } 7363 c := v_1.AuxInt 7364 val := v.Args[2] 7365 mem := v.Args[3] 7366 v.reset(OpARMMOVWstore) 7367 v.AuxInt = int64(int32(c) >> uint64(d)) 7368 v.AddArg(ptr) 7369 v.AddArg(val) 7370 v.AddArg(mem) 7371 return true 7372 } 7373 return false 7374 } 7375 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value) bool { 7376 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 7377 // cond: 7378 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 7379 for { 7380 d := v.AuxInt 7381 ptr := v.Args[0] 7382 v_1 := v.Args[1] 7383 if v_1.Op != OpARMMOVWconst { 7384 break 7385 } 7386 c := v_1.AuxInt 7387 val := v.Args[2] 7388 mem := v.Args[3] 7389 v.reset(OpARMMOVWstore) 7390 v.AuxInt = int64(uint32(c) >> uint64(d)) 7391 v.AddArg(ptr) 7392 v.AddArg(val) 7393 v.AddArg(mem) 7394 return true 7395 } 7396 return false 7397 } 7398 func rewriteValueARM_OpARMMUL(v *Value) bool { 7399 b := v.Block 7400 _ = b 7401 // match: (MUL x (MOVWconst [c])) 7402 // cond: int32(c) == -1 7403 // result: (RSBconst [0] x) 7404 for { 7405 x := v.Args[0] 7406 v_1 := v.Args[1] 7407 if v_1.Op != OpARMMOVWconst { 7408 break 7409 } 7410 c := v_1.AuxInt 7411 if !(int32(c) == -1) { 7412 break 7413 } 7414 v.reset(OpARMRSBconst) 7415 v.AuxInt = 0 7416 v.AddArg(x) 7417 return true 7418 } 7419 // match: (MUL (MOVWconst [c]) x) 7420 // cond: int32(c) == -1 7421 // result: (RSBconst [0] x) 7422 for { 7423 v_0 := v.Args[0] 7424 if v_0.Op != OpARMMOVWconst { 7425 break 7426 } 7427 c := v_0.AuxInt 7428 x := v.Args[1] 7429 if !(int32(c) == -1) { 7430 break 7431 } 7432 v.reset(OpARMRSBconst) 7433 v.AuxInt = 0 7434 v.AddArg(x) 7435 return true 7436 } 7437 // match: (MUL _ (MOVWconst [0])) 7438 // cond: 7439 // result: (MOVWconst [0]) 7440 for { 7441 v_1 := v.Args[1] 7442 if v_1.Op != OpARMMOVWconst { 7443 break 7444 } 7445 if v_1.AuxInt != 0 { 7446 break 7447 } 7448 v.reset(OpARMMOVWconst) 7449 v.AuxInt = 0 7450 return true 7451 } 7452 // match: (MUL (MOVWconst [0]) _) 7453 // cond: 7454 // result: (MOVWconst [0]) 7455 for { 7456 v_0 := v.Args[0] 7457 if v_0.Op != OpARMMOVWconst { 7458 break 7459 } 7460 if v_0.AuxInt != 0 { 7461 break 7462 } 7463 v.reset(OpARMMOVWconst) 7464 v.AuxInt = 0 7465 return true 7466 } 7467 // match: (MUL x (MOVWconst [1])) 7468 // cond: 7469 // result: x 7470 for { 7471 x := v.Args[0] 7472 v_1 := v.Args[1] 7473 if v_1.Op != OpARMMOVWconst { 7474 break 7475 } 7476 if v_1.AuxInt != 1 { 7477 break 7478 } 7479 v.reset(OpCopy) 7480 v.Type = x.Type 7481 v.AddArg(x) 7482 return true 7483 } 7484 // match: (MUL (MOVWconst [1]) x) 7485 // cond: 7486 // result: x 7487 for { 7488 v_0 := v.Args[0] 7489 if v_0.Op != OpARMMOVWconst { 7490 break 7491 } 7492 if v_0.AuxInt != 1 { 7493 break 7494 } 7495 x := v.Args[1] 7496 v.reset(OpCopy) 7497 v.Type = x.Type 7498 v.AddArg(x) 7499 return true 7500 } 7501 // match: (MUL x (MOVWconst [c])) 7502 // cond: isPowerOfTwo(c) 7503 // result: (SLLconst [log2(c)] x) 7504 for { 7505 x := v.Args[0] 7506 v_1 := v.Args[1] 7507 if v_1.Op != OpARMMOVWconst { 7508 break 7509 } 7510 c := v_1.AuxInt 7511 if !(isPowerOfTwo(c)) { 7512 break 7513 } 7514 v.reset(OpARMSLLconst) 7515 v.AuxInt = log2(c) 7516 v.AddArg(x) 7517 return true 7518 } 7519 // match: (MUL (MOVWconst [c]) x) 7520 // cond: isPowerOfTwo(c) 7521 // result: (SLLconst [log2(c)] x) 7522 for { 7523 v_0 := v.Args[0] 7524 if v_0.Op != OpARMMOVWconst { 7525 break 7526 } 7527 c := v_0.AuxInt 7528 x := v.Args[1] 7529 if !(isPowerOfTwo(c)) { 7530 break 7531 } 7532 v.reset(OpARMSLLconst) 7533 v.AuxInt = log2(c) 7534 v.AddArg(x) 7535 return true 7536 } 7537 // match: (MUL x (MOVWconst [c])) 7538 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7539 // result: (ADDshiftLL x x [log2(c-1)]) 7540 for { 7541 x := v.Args[0] 7542 v_1 := v.Args[1] 7543 if v_1.Op != OpARMMOVWconst { 7544 break 7545 } 7546 c := v_1.AuxInt 7547 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7548 break 7549 } 7550 v.reset(OpARMADDshiftLL) 7551 v.AuxInt = log2(c - 1) 7552 v.AddArg(x) 7553 v.AddArg(x) 7554 return true 7555 } 7556 // match: (MUL (MOVWconst [c]) x) 7557 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7558 // result: (ADDshiftLL x x [log2(c-1)]) 7559 for { 7560 v_0 := v.Args[0] 7561 if v_0.Op != OpARMMOVWconst { 7562 break 7563 } 7564 c := v_0.AuxInt 7565 x := v.Args[1] 7566 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7567 break 7568 } 7569 v.reset(OpARMADDshiftLL) 7570 v.AuxInt = log2(c - 1) 7571 v.AddArg(x) 7572 v.AddArg(x) 7573 return true 7574 } 7575 // match: (MUL x (MOVWconst [c])) 7576 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7577 // result: (RSBshiftLL x x [log2(c+1)]) 7578 for { 7579 x := v.Args[0] 7580 v_1 := v.Args[1] 7581 if v_1.Op != OpARMMOVWconst { 7582 break 7583 } 7584 c := v_1.AuxInt 7585 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7586 break 7587 } 7588 v.reset(OpARMRSBshiftLL) 7589 v.AuxInt = log2(c + 1) 7590 v.AddArg(x) 7591 v.AddArg(x) 7592 return true 7593 } 7594 // match: (MUL (MOVWconst [c]) x) 7595 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7596 // result: (RSBshiftLL x x [log2(c+1)]) 7597 for { 7598 v_0 := v.Args[0] 7599 if v_0.Op != OpARMMOVWconst { 7600 break 7601 } 7602 c := v_0.AuxInt 7603 x := v.Args[1] 7604 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7605 break 7606 } 7607 v.reset(OpARMRSBshiftLL) 7608 v.AuxInt = log2(c + 1) 7609 v.AddArg(x) 7610 v.AddArg(x) 7611 return true 7612 } 7613 // match: (MUL x (MOVWconst [c])) 7614 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7615 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7616 for { 7617 x := v.Args[0] 7618 v_1 := v.Args[1] 7619 if v_1.Op != OpARMMOVWconst { 7620 break 7621 } 7622 c := v_1.AuxInt 7623 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7624 break 7625 } 7626 v.reset(OpARMSLLconst) 7627 v.AuxInt = log2(c / 3) 7628 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7629 v0.AuxInt = 1 7630 v0.AddArg(x) 7631 v0.AddArg(x) 7632 v.AddArg(v0) 7633 return true 7634 } 7635 // match: (MUL (MOVWconst [c]) x) 7636 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7637 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7638 for { 7639 v_0 := v.Args[0] 7640 if v_0.Op != OpARMMOVWconst { 7641 break 7642 } 7643 c := v_0.AuxInt 7644 x := v.Args[1] 7645 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7646 break 7647 } 7648 v.reset(OpARMSLLconst) 7649 v.AuxInt = log2(c / 3) 7650 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7651 v0.AuxInt = 1 7652 v0.AddArg(x) 7653 v0.AddArg(x) 7654 v.AddArg(v0) 7655 return true 7656 } 7657 // match: (MUL x (MOVWconst [c])) 7658 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7659 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7660 for { 7661 x := v.Args[0] 7662 v_1 := v.Args[1] 7663 if v_1.Op != OpARMMOVWconst { 7664 break 7665 } 7666 c := v_1.AuxInt 7667 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7668 break 7669 } 7670 v.reset(OpARMSLLconst) 7671 v.AuxInt = log2(c / 5) 7672 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7673 v0.AuxInt = 2 7674 v0.AddArg(x) 7675 v0.AddArg(x) 7676 v.AddArg(v0) 7677 return true 7678 } 7679 // match: (MUL (MOVWconst [c]) x) 7680 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7681 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7682 for { 7683 v_0 := v.Args[0] 7684 if v_0.Op != OpARMMOVWconst { 7685 break 7686 } 7687 c := v_0.AuxInt 7688 x := v.Args[1] 7689 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7690 break 7691 } 7692 v.reset(OpARMSLLconst) 7693 v.AuxInt = log2(c / 5) 7694 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7695 v0.AuxInt = 2 7696 v0.AddArg(x) 7697 v0.AddArg(x) 7698 v.AddArg(v0) 7699 return true 7700 } 7701 // match: (MUL x (MOVWconst [c])) 7702 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7703 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7704 for { 7705 x := v.Args[0] 7706 v_1 := v.Args[1] 7707 if v_1.Op != OpARMMOVWconst { 7708 break 7709 } 7710 c := v_1.AuxInt 7711 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7712 break 7713 } 7714 v.reset(OpARMSLLconst) 7715 v.AuxInt = log2(c / 7) 7716 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7717 v0.AuxInt = 3 7718 v0.AddArg(x) 7719 v0.AddArg(x) 7720 v.AddArg(v0) 7721 return true 7722 } 7723 // match: (MUL (MOVWconst [c]) x) 7724 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7725 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7726 for { 7727 v_0 := v.Args[0] 7728 if v_0.Op != OpARMMOVWconst { 7729 break 7730 } 7731 c := v_0.AuxInt 7732 x := v.Args[1] 7733 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7734 break 7735 } 7736 v.reset(OpARMSLLconst) 7737 v.AuxInt = log2(c / 7) 7738 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7739 v0.AuxInt = 3 7740 v0.AddArg(x) 7741 v0.AddArg(x) 7742 v.AddArg(v0) 7743 return true 7744 } 7745 // match: (MUL x (MOVWconst [c])) 7746 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7747 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7748 for { 7749 x := v.Args[0] 7750 v_1 := v.Args[1] 7751 if v_1.Op != OpARMMOVWconst { 7752 break 7753 } 7754 c := v_1.AuxInt 7755 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7756 break 7757 } 7758 v.reset(OpARMSLLconst) 7759 v.AuxInt = log2(c / 9) 7760 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7761 v0.AuxInt = 3 7762 v0.AddArg(x) 7763 v0.AddArg(x) 7764 v.AddArg(v0) 7765 return true 7766 } 7767 // match: (MUL (MOVWconst [c]) x) 7768 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7769 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7770 for { 7771 v_0 := v.Args[0] 7772 if v_0.Op != OpARMMOVWconst { 7773 break 7774 } 7775 c := v_0.AuxInt 7776 x := v.Args[1] 7777 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7778 break 7779 } 7780 v.reset(OpARMSLLconst) 7781 v.AuxInt = log2(c / 9) 7782 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7783 v0.AuxInt = 3 7784 v0.AddArg(x) 7785 v0.AddArg(x) 7786 v.AddArg(v0) 7787 return true 7788 } 7789 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 7790 // cond: 7791 // result: (MOVWconst [int64(int32(c*d))]) 7792 for { 7793 v_0 := v.Args[0] 7794 if v_0.Op != OpARMMOVWconst { 7795 break 7796 } 7797 c := v_0.AuxInt 7798 v_1 := v.Args[1] 7799 if v_1.Op != OpARMMOVWconst { 7800 break 7801 } 7802 d := v_1.AuxInt 7803 v.reset(OpARMMOVWconst) 7804 v.AuxInt = int64(int32(c * d)) 7805 return true 7806 } 7807 // match: (MUL (MOVWconst [d]) (MOVWconst [c])) 7808 // cond: 7809 // result: (MOVWconst [int64(int32(c*d))]) 7810 for { 7811 v_0 := v.Args[0] 7812 if v_0.Op != OpARMMOVWconst { 7813 break 7814 } 7815 d := v_0.AuxInt 7816 v_1 := v.Args[1] 7817 if v_1.Op != OpARMMOVWconst { 7818 break 7819 } 7820 c := v_1.AuxInt 7821 v.reset(OpARMMOVWconst) 7822 v.AuxInt = int64(int32(c * d)) 7823 return true 7824 } 7825 return false 7826 } 7827 func rewriteValueARM_OpARMMULA(v *Value) bool { 7828 b := v.Block 7829 _ = b 7830 // match: (MULA x (MOVWconst [c]) a) 7831 // cond: int32(c) == -1 7832 // result: (SUB a x) 7833 for { 7834 x := v.Args[0] 7835 v_1 := v.Args[1] 7836 if v_1.Op != OpARMMOVWconst { 7837 break 7838 } 7839 c := v_1.AuxInt 7840 a := v.Args[2] 7841 if !(int32(c) == -1) { 7842 break 7843 } 7844 v.reset(OpARMSUB) 7845 v.AddArg(a) 7846 v.AddArg(x) 7847 return true 7848 } 7849 // match: (MULA _ (MOVWconst [0]) a) 7850 // cond: 7851 // result: a 7852 for { 7853 v_1 := v.Args[1] 7854 if v_1.Op != OpARMMOVWconst { 7855 break 7856 } 7857 if v_1.AuxInt != 0 { 7858 break 7859 } 7860 a := v.Args[2] 7861 v.reset(OpCopy) 7862 v.Type = a.Type 7863 v.AddArg(a) 7864 return true 7865 } 7866 // match: (MULA x (MOVWconst [1]) a) 7867 // cond: 7868 // result: (ADD x a) 7869 for { 7870 x := v.Args[0] 7871 v_1 := v.Args[1] 7872 if v_1.Op != OpARMMOVWconst { 7873 break 7874 } 7875 if v_1.AuxInt != 1 { 7876 break 7877 } 7878 a := v.Args[2] 7879 v.reset(OpARMADD) 7880 v.AddArg(x) 7881 v.AddArg(a) 7882 return true 7883 } 7884 // match: (MULA x (MOVWconst [c]) a) 7885 // cond: isPowerOfTwo(c) 7886 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 7887 for { 7888 x := v.Args[0] 7889 v_1 := v.Args[1] 7890 if v_1.Op != OpARMMOVWconst { 7891 break 7892 } 7893 c := v_1.AuxInt 7894 a := v.Args[2] 7895 if !(isPowerOfTwo(c)) { 7896 break 7897 } 7898 v.reset(OpARMADD) 7899 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7900 v0.AuxInt = log2(c) 7901 v0.AddArg(x) 7902 v.AddArg(v0) 7903 v.AddArg(a) 7904 return true 7905 } 7906 // match: (MULA x (MOVWconst [c]) a) 7907 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7908 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 7909 for { 7910 x := v.Args[0] 7911 v_1 := v.Args[1] 7912 if v_1.Op != OpARMMOVWconst { 7913 break 7914 } 7915 c := v_1.AuxInt 7916 a := v.Args[2] 7917 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7918 break 7919 } 7920 v.reset(OpARMADD) 7921 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7922 v0.AuxInt = log2(c - 1) 7923 v0.AddArg(x) 7924 v0.AddArg(x) 7925 v.AddArg(v0) 7926 v.AddArg(a) 7927 return true 7928 } 7929 // match: (MULA x (MOVWconst [c]) a) 7930 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7931 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 7932 for { 7933 x := v.Args[0] 7934 v_1 := v.Args[1] 7935 if v_1.Op != OpARMMOVWconst { 7936 break 7937 } 7938 c := v_1.AuxInt 7939 a := v.Args[2] 7940 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7941 break 7942 } 7943 v.reset(OpARMADD) 7944 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7945 v0.AuxInt = log2(c + 1) 7946 v0.AddArg(x) 7947 v0.AddArg(x) 7948 v.AddArg(v0) 7949 v.AddArg(a) 7950 return true 7951 } 7952 // match: (MULA x (MOVWconst [c]) a) 7953 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7954 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 7955 for { 7956 x := v.Args[0] 7957 v_1 := v.Args[1] 7958 if v_1.Op != OpARMMOVWconst { 7959 break 7960 } 7961 c := v_1.AuxInt 7962 a := v.Args[2] 7963 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7964 break 7965 } 7966 v.reset(OpARMADD) 7967 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7968 v0.AuxInt = log2(c / 3) 7969 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7970 v1.AuxInt = 1 7971 v1.AddArg(x) 7972 v1.AddArg(x) 7973 v0.AddArg(v1) 7974 v.AddArg(v0) 7975 v.AddArg(a) 7976 return true 7977 } 7978 // match: (MULA x (MOVWconst [c]) a) 7979 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7980 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 7981 for { 7982 x := v.Args[0] 7983 v_1 := v.Args[1] 7984 if v_1.Op != OpARMMOVWconst { 7985 break 7986 } 7987 c := v_1.AuxInt 7988 a := v.Args[2] 7989 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7990 break 7991 } 7992 v.reset(OpARMADD) 7993 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7994 v0.AuxInt = log2(c / 5) 7995 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7996 v1.AuxInt = 2 7997 v1.AddArg(x) 7998 v1.AddArg(x) 7999 v0.AddArg(v1) 8000 v.AddArg(v0) 8001 v.AddArg(a) 8002 return true 8003 } 8004 // match: (MULA x (MOVWconst [c]) a) 8005 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8006 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 8007 for { 8008 x := v.Args[0] 8009 v_1 := v.Args[1] 8010 if v_1.Op != OpARMMOVWconst { 8011 break 8012 } 8013 c := v_1.AuxInt 8014 a := v.Args[2] 8015 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8016 break 8017 } 8018 v.reset(OpARMADD) 8019 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8020 v0.AuxInt = log2(c / 7) 8021 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8022 v1.AuxInt = 3 8023 v1.AddArg(x) 8024 v1.AddArg(x) 8025 v0.AddArg(v1) 8026 v.AddArg(v0) 8027 v.AddArg(a) 8028 return true 8029 } 8030 // match: (MULA x (MOVWconst [c]) a) 8031 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8032 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 8033 for { 8034 x := v.Args[0] 8035 v_1 := v.Args[1] 8036 if v_1.Op != OpARMMOVWconst { 8037 break 8038 } 8039 c := v_1.AuxInt 8040 a := v.Args[2] 8041 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8042 break 8043 } 8044 v.reset(OpARMADD) 8045 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8046 v0.AuxInt = log2(c / 9) 8047 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8048 v1.AuxInt = 3 8049 v1.AddArg(x) 8050 v1.AddArg(x) 8051 v0.AddArg(v1) 8052 v.AddArg(v0) 8053 v.AddArg(a) 8054 return true 8055 } 8056 // match: (MULA (MOVWconst [c]) x a) 8057 // cond: int32(c) == -1 8058 // result: (SUB a x) 8059 for { 8060 v_0 := v.Args[0] 8061 if v_0.Op != OpARMMOVWconst { 8062 break 8063 } 8064 c := v_0.AuxInt 8065 x := v.Args[1] 8066 a := v.Args[2] 8067 if !(int32(c) == -1) { 8068 break 8069 } 8070 v.reset(OpARMSUB) 8071 v.AddArg(a) 8072 v.AddArg(x) 8073 return true 8074 } 8075 // match: (MULA (MOVWconst [0]) _ a) 8076 // cond: 8077 // result: a 8078 for { 8079 v_0 := v.Args[0] 8080 if v_0.Op != OpARMMOVWconst { 8081 break 8082 } 8083 if v_0.AuxInt != 0 { 8084 break 8085 } 8086 a := v.Args[2] 8087 v.reset(OpCopy) 8088 v.Type = a.Type 8089 v.AddArg(a) 8090 return true 8091 } 8092 // match: (MULA (MOVWconst [1]) x a) 8093 // cond: 8094 // result: (ADD x a) 8095 for { 8096 v_0 := v.Args[0] 8097 if v_0.Op != OpARMMOVWconst { 8098 break 8099 } 8100 if v_0.AuxInt != 1 { 8101 break 8102 } 8103 x := v.Args[1] 8104 a := v.Args[2] 8105 v.reset(OpARMADD) 8106 v.AddArg(x) 8107 v.AddArg(a) 8108 return true 8109 } 8110 // match: (MULA (MOVWconst [c]) x a) 8111 // cond: isPowerOfTwo(c) 8112 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 8113 for { 8114 v_0 := v.Args[0] 8115 if v_0.Op != OpARMMOVWconst { 8116 break 8117 } 8118 c := v_0.AuxInt 8119 x := v.Args[1] 8120 a := v.Args[2] 8121 if !(isPowerOfTwo(c)) { 8122 break 8123 } 8124 v.reset(OpARMADD) 8125 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8126 v0.AuxInt = log2(c) 8127 v0.AddArg(x) 8128 v.AddArg(v0) 8129 v.AddArg(a) 8130 return true 8131 } 8132 // match: (MULA (MOVWconst [c]) x a) 8133 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 8134 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 8135 for { 8136 v_0 := v.Args[0] 8137 if v_0.Op != OpARMMOVWconst { 8138 break 8139 } 8140 c := v_0.AuxInt 8141 x := v.Args[1] 8142 a := v.Args[2] 8143 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 8144 break 8145 } 8146 v.reset(OpARMADD) 8147 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8148 v0.AuxInt = log2(c - 1) 8149 v0.AddArg(x) 8150 v0.AddArg(x) 8151 v.AddArg(v0) 8152 v.AddArg(a) 8153 return true 8154 } 8155 // match: (MULA (MOVWconst [c]) x a) 8156 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 8157 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 8158 for { 8159 v_0 := v.Args[0] 8160 if v_0.Op != OpARMMOVWconst { 8161 break 8162 } 8163 c := v_0.AuxInt 8164 x := v.Args[1] 8165 a := v.Args[2] 8166 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 8167 break 8168 } 8169 v.reset(OpARMADD) 8170 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8171 v0.AuxInt = log2(c + 1) 8172 v0.AddArg(x) 8173 v0.AddArg(x) 8174 v.AddArg(v0) 8175 v.AddArg(a) 8176 return true 8177 } 8178 // match: (MULA (MOVWconst [c]) x a) 8179 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 8180 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 8181 for { 8182 v_0 := v.Args[0] 8183 if v_0.Op != OpARMMOVWconst { 8184 break 8185 } 8186 c := v_0.AuxInt 8187 x := v.Args[1] 8188 a := v.Args[2] 8189 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 8190 break 8191 } 8192 v.reset(OpARMADD) 8193 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8194 v0.AuxInt = log2(c / 3) 8195 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8196 v1.AuxInt = 1 8197 v1.AddArg(x) 8198 v1.AddArg(x) 8199 v0.AddArg(v1) 8200 v.AddArg(v0) 8201 v.AddArg(a) 8202 return true 8203 } 8204 // match: (MULA (MOVWconst [c]) x a) 8205 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8206 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 8207 for { 8208 v_0 := v.Args[0] 8209 if v_0.Op != OpARMMOVWconst { 8210 break 8211 } 8212 c := v_0.AuxInt 8213 x := v.Args[1] 8214 a := v.Args[2] 8215 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8216 break 8217 } 8218 v.reset(OpARMADD) 8219 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8220 v0.AuxInt = log2(c / 5) 8221 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8222 v1.AuxInt = 2 8223 v1.AddArg(x) 8224 v1.AddArg(x) 8225 v0.AddArg(v1) 8226 v.AddArg(v0) 8227 v.AddArg(a) 8228 return true 8229 } 8230 // match: (MULA (MOVWconst [c]) x a) 8231 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8232 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 8233 for { 8234 v_0 := v.Args[0] 8235 if v_0.Op != OpARMMOVWconst { 8236 break 8237 } 8238 c := v_0.AuxInt 8239 x := v.Args[1] 8240 a := v.Args[2] 8241 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8242 break 8243 } 8244 v.reset(OpARMADD) 8245 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8246 v0.AuxInt = log2(c / 7) 8247 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8248 v1.AuxInt = 3 8249 v1.AddArg(x) 8250 v1.AddArg(x) 8251 v0.AddArg(v1) 8252 v.AddArg(v0) 8253 v.AddArg(a) 8254 return true 8255 } 8256 // match: (MULA (MOVWconst [c]) x a) 8257 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8258 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 8259 for { 8260 v_0 := v.Args[0] 8261 if v_0.Op != OpARMMOVWconst { 8262 break 8263 } 8264 c := v_0.AuxInt 8265 x := v.Args[1] 8266 a := v.Args[2] 8267 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8268 break 8269 } 8270 v.reset(OpARMADD) 8271 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8272 v0.AuxInt = log2(c / 9) 8273 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8274 v1.AuxInt = 3 8275 v1.AddArg(x) 8276 v1.AddArg(x) 8277 v0.AddArg(v1) 8278 v.AddArg(v0) 8279 v.AddArg(a) 8280 return true 8281 } 8282 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 8283 // cond: 8284 // result: (ADDconst [int64(int32(c*d))] a) 8285 for { 8286 v_0 := v.Args[0] 8287 if v_0.Op != OpARMMOVWconst { 8288 break 8289 } 8290 c := v_0.AuxInt 8291 v_1 := v.Args[1] 8292 if v_1.Op != OpARMMOVWconst { 8293 break 8294 } 8295 d := v_1.AuxInt 8296 a := v.Args[2] 8297 v.reset(OpARMADDconst) 8298 v.AuxInt = int64(int32(c * d)) 8299 v.AddArg(a) 8300 return true 8301 } 8302 return false 8303 } 8304 func rewriteValueARM_OpARMMVN(v *Value) bool { 8305 // match: (MVN (MOVWconst [c])) 8306 // cond: 8307 // result: (MOVWconst [^c]) 8308 for { 8309 v_0 := v.Args[0] 8310 if v_0.Op != OpARMMOVWconst { 8311 break 8312 } 8313 c := v_0.AuxInt 8314 v.reset(OpARMMOVWconst) 8315 v.AuxInt = ^c 8316 return true 8317 } 8318 // match: (MVN (SLLconst [c] x)) 8319 // cond: 8320 // result: (MVNshiftLL x [c]) 8321 for { 8322 v_0 := v.Args[0] 8323 if v_0.Op != OpARMSLLconst { 8324 break 8325 } 8326 c := v_0.AuxInt 8327 x := v_0.Args[0] 8328 v.reset(OpARMMVNshiftLL) 8329 v.AuxInt = c 8330 v.AddArg(x) 8331 return true 8332 } 8333 // match: (MVN (SRLconst [c] x)) 8334 // cond: 8335 // result: (MVNshiftRL x [c]) 8336 for { 8337 v_0 := v.Args[0] 8338 if v_0.Op != OpARMSRLconst { 8339 break 8340 } 8341 c := v_0.AuxInt 8342 x := v_0.Args[0] 8343 v.reset(OpARMMVNshiftRL) 8344 v.AuxInt = c 8345 v.AddArg(x) 8346 return true 8347 } 8348 // match: (MVN (SRAconst [c] x)) 8349 // cond: 8350 // result: (MVNshiftRA x [c]) 8351 for { 8352 v_0 := v.Args[0] 8353 if v_0.Op != OpARMSRAconst { 8354 break 8355 } 8356 c := v_0.AuxInt 8357 x := v_0.Args[0] 8358 v.reset(OpARMMVNshiftRA) 8359 v.AuxInt = c 8360 v.AddArg(x) 8361 return true 8362 } 8363 // match: (MVN (SLL x y)) 8364 // cond: 8365 // result: (MVNshiftLLreg x y) 8366 for { 8367 v_0 := v.Args[0] 8368 if v_0.Op != OpARMSLL { 8369 break 8370 } 8371 x := v_0.Args[0] 8372 y := v_0.Args[1] 8373 v.reset(OpARMMVNshiftLLreg) 8374 v.AddArg(x) 8375 v.AddArg(y) 8376 return true 8377 } 8378 // match: (MVN (SRL x y)) 8379 // cond: 8380 // result: (MVNshiftRLreg x y) 8381 for { 8382 v_0 := v.Args[0] 8383 if v_0.Op != OpARMSRL { 8384 break 8385 } 8386 x := v_0.Args[0] 8387 y := v_0.Args[1] 8388 v.reset(OpARMMVNshiftRLreg) 8389 v.AddArg(x) 8390 v.AddArg(y) 8391 return true 8392 } 8393 // match: (MVN (SRA x y)) 8394 // cond: 8395 // result: (MVNshiftRAreg x y) 8396 for { 8397 v_0 := v.Args[0] 8398 if v_0.Op != OpARMSRA { 8399 break 8400 } 8401 x := v_0.Args[0] 8402 y := v_0.Args[1] 8403 v.reset(OpARMMVNshiftRAreg) 8404 v.AddArg(x) 8405 v.AddArg(y) 8406 return true 8407 } 8408 return false 8409 } 8410 func rewriteValueARM_OpARMMVNshiftLL(v *Value) bool { 8411 // match: (MVNshiftLL (MOVWconst [c]) [d]) 8412 // cond: 8413 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 8414 for { 8415 d := v.AuxInt 8416 v_0 := v.Args[0] 8417 if v_0.Op != OpARMMOVWconst { 8418 break 8419 } 8420 c := v_0.AuxInt 8421 v.reset(OpARMMOVWconst) 8422 v.AuxInt = ^int64(uint32(c) << uint64(d)) 8423 return true 8424 } 8425 return false 8426 } 8427 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value) bool { 8428 // match: (MVNshiftLLreg x (MOVWconst [c])) 8429 // cond: 8430 // result: (MVNshiftLL x [c]) 8431 for { 8432 x := v.Args[0] 8433 v_1 := v.Args[1] 8434 if v_1.Op != OpARMMOVWconst { 8435 break 8436 } 8437 c := v_1.AuxInt 8438 v.reset(OpARMMVNshiftLL) 8439 v.AuxInt = c 8440 v.AddArg(x) 8441 return true 8442 } 8443 return false 8444 } 8445 func rewriteValueARM_OpARMMVNshiftRA(v *Value) bool { 8446 // match: (MVNshiftRA (MOVWconst [c]) [d]) 8447 // cond: 8448 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 8449 for { 8450 d := v.AuxInt 8451 v_0 := v.Args[0] 8452 if v_0.Op != OpARMMOVWconst { 8453 break 8454 } 8455 c := v_0.AuxInt 8456 v.reset(OpARMMOVWconst) 8457 v.AuxInt = ^int64(int32(c) >> uint64(d)) 8458 return true 8459 } 8460 return false 8461 } 8462 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value) bool { 8463 // match: (MVNshiftRAreg x (MOVWconst [c])) 8464 // cond: 8465 // result: (MVNshiftRA x [c]) 8466 for { 8467 x := v.Args[0] 8468 v_1 := v.Args[1] 8469 if v_1.Op != OpARMMOVWconst { 8470 break 8471 } 8472 c := v_1.AuxInt 8473 v.reset(OpARMMVNshiftRA) 8474 v.AuxInt = c 8475 v.AddArg(x) 8476 return true 8477 } 8478 return false 8479 } 8480 func rewriteValueARM_OpARMMVNshiftRL(v *Value) bool { 8481 // match: (MVNshiftRL (MOVWconst [c]) [d]) 8482 // cond: 8483 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 8484 for { 8485 d := v.AuxInt 8486 v_0 := v.Args[0] 8487 if v_0.Op != OpARMMOVWconst { 8488 break 8489 } 8490 c := v_0.AuxInt 8491 v.reset(OpARMMOVWconst) 8492 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 8493 return true 8494 } 8495 return false 8496 } 8497 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value) bool { 8498 // match: (MVNshiftRLreg x (MOVWconst [c])) 8499 // cond: 8500 // result: (MVNshiftRL x [c]) 8501 for { 8502 x := v.Args[0] 8503 v_1 := v.Args[1] 8504 if v_1.Op != OpARMMOVWconst { 8505 break 8506 } 8507 c := v_1.AuxInt 8508 v.reset(OpARMMVNshiftRL) 8509 v.AuxInt = c 8510 v.AddArg(x) 8511 return true 8512 } 8513 return false 8514 } 8515 func rewriteValueARM_OpARMNotEqual(v *Value) bool { 8516 // match: (NotEqual (FlagEQ)) 8517 // cond: 8518 // result: (MOVWconst [0]) 8519 for { 8520 v_0 := v.Args[0] 8521 if v_0.Op != OpARMFlagEQ { 8522 break 8523 } 8524 v.reset(OpARMMOVWconst) 8525 v.AuxInt = 0 8526 return true 8527 } 8528 // match: (NotEqual (FlagLT_ULT)) 8529 // cond: 8530 // result: (MOVWconst [1]) 8531 for { 8532 v_0 := v.Args[0] 8533 if v_0.Op != OpARMFlagLT_ULT { 8534 break 8535 } 8536 v.reset(OpARMMOVWconst) 8537 v.AuxInt = 1 8538 return true 8539 } 8540 // match: (NotEqual (FlagLT_UGT)) 8541 // cond: 8542 // result: (MOVWconst [1]) 8543 for { 8544 v_0 := v.Args[0] 8545 if v_0.Op != OpARMFlagLT_UGT { 8546 break 8547 } 8548 v.reset(OpARMMOVWconst) 8549 v.AuxInt = 1 8550 return true 8551 } 8552 // match: (NotEqual (FlagGT_ULT)) 8553 // cond: 8554 // result: (MOVWconst [1]) 8555 for { 8556 v_0 := v.Args[0] 8557 if v_0.Op != OpARMFlagGT_ULT { 8558 break 8559 } 8560 v.reset(OpARMMOVWconst) 8561 v.AuxInt = 1 8562 return true 8563 } 8564 // match: (NotEqual (FlagGT_UGT)) 8565 // cond: 8566 // result: (MOVWconst [1]) 8567 for { 8568 v_0 := v.Args[0] 8569 if v_0.Op != OpARMFlagGT_UGT { 8570 break 8571 } 8572 v.reset(OpARMMOVWconst) 8573 v.AuxInt = 1 8574 return true 8575 } 8576 // match: (NotEqual (InvertFlags x)) 8577 // cond: 8578 // result: (NotEqual x) 8579 for { 8580 v_0 := v.Args[0] 8581 if v_0.Op != OpARMInvertFlags { 8582 break 8583 } 8584 x := v_0.Args[0] 8585 v.reset(OpARMNotEqual) 8586 v.AddArg(x) 8587 return true 8588 } 8589 return false 8590 } 8591 func rewriteValueARM_OpARMOR(v *Value) bool { 8592 // match: (OR x (MOVWconst [c])) 8593 // cond: 8594 // result: (ORconst [c] x) 8595 for { 8596 x := v.Args[0] 8597 v_1 := v.Args[1] 8598 if v_1.Op != OpARMMOVWconst { 8599 break 8600 } 8601 c := v_1.AuxInt 8602 v.reset(OpARMORconst) 8603 v.AuxInt = c 8604 v.AddArg(x) 8605 return true 8606 } 8607 // match: (OR (MOVWconst [c]) x) 8608 // cond: 8609 // result: (ORconst [c] x) 8610 for { 8611 v_0 := v.Args[0] 8612 if v_0.Op != OpARMMOVWconst { 8613 break 8614 } 8615 c := v_0.AuxInt 8616 x := v.Args[1] 8617 v.reset(OpARMORconst) 8618 v.AuxInt = c 8619 v.AddArg(x) 8620 return true 8621 } 8622 // match: (OR x (SLLconst [c] y)) 8623 // cond: 8624 // result: (ORshiftLL x y [c]) 8625 for { 8626 x := v.Args[0] 8627 v_1 := v.Args[1] 8628 if v_1.Op != OpARMSLLconst { 8629 break 8630 } 8631 c := v_1.AuxInt 8632 y := v_1.Args[0] 8633 v.reset(OpARMORshiftLL) 8634 v.AuxInt = c 8635 v.AddArg(x) 8636 v.AddArg(y) 8637 return true 8638 } 8639 // match: (OR (SLLconst [c] y) x) 8640 // cond: 8641 // result: (ORshiftLL x y [c]) 8642 for { 8643 v_0 := v.Args[0] 8644 if v_0.Op != OpARMSLLconst { 8645 break 8646 } 8647 c := v_0.AuxInt 8648 y := v_0.Args[0] 8649 x := v.Args[1] 8650 v.reset(OpARMORshiftLL) 8651 v.AuxInt = c 8652 v.AddArg(x) 8653 v.AddArg(y) 8654 return true 8655 } 8656 // match: (OR x (SRLconst [c] y)) 8657 // cond: 8658 // result: (ORshiftRL x y [c]) 8659 for { 8660 x := v.Args[0] 8661 v_1 := v.Args[1] 8662 if v_1.Op != OpARMSRLconst { 8663 break 8664 } 8665 c := v_1.AuxInt 8666 y := v_1.Args[0] 8667 v.reset(OpARMORshiftRL) 8668 v.AuxInt = c 8669 v.AddArg(x) 8670 v.AddArg(y) 8671 return true 8672 } 8673 // match: (OR (SRLconst [c] y) x) 8674 // cond: 8675 // result: (ORshiftRL x y [c]) 8676 for { 8677 v_0 := v.Args[0] 8678 if v_0.Op != OpARMSRLconst { 8679 break 8680 } 8681 c := v_0.AuxInt 8682 y := v_0.Args[0] 8683 x := v.Args[1] 8684 v.reset(OpARMORshiftRL) 8685 v.AuxInt = c 8686 v.AddArg(x) 8687 v.AddArg(y) 8688 return true 8689 } 8690 // match: (OR x (SRAconst [c] y)) 8691 // cond: 8692 // result: (ORshiftRA x y [c]) 8693 for { 8694 x := v.Args[0] 8695 v_1 := v.Args[1] 8696 if v_1.Op != OpARMSRAconst { 8697 break 8698 } 8699 c := v_1.AuxInt 8700 y := v_1.Args[0] 8701 v.reset(OpARMORshiftRA) 8702 v.AuxInt = c 8703 v.AddArg(x) 8704 v.AddArg(y) 8705 return true 8706 } 8707 // match: (OR (SRAconst [c] y) x) 8708 // cond: 8709 // result: (ORshiftRA x y [c]) 8710 for { 8711 v_0 := v.Args[0] 8712 if v_0.Op != OpARMSRAconst { 8713 break 8714 } 8715 c := v_0.AuxInt 8716 y := v_0.Args[0] 8717 x := v.Args[1] 8718 v.reset(OpARMORshiftRA) 8719 v.AuxInt = c 8720 v.AddArg(x) 8721 v.AddArg(y) 8722 return true 8723 } 8724 // match: (OR x (SLL y z)) 8725 // cond: 8726 // result: (ORshiftLLreg x y z) 8727 for { 8728 x := v.Args[0] 8729 v_1 := v.Args[1] 8730 if v_1.Op != OpARMSLL { 8731 break 8732 } 8733 y := v_1.Args[0] 8734 z := v_1.Args[1] 8735 v.reset(OpARMORshiftLLreg) 8736 v.AddArg(x) 8737 v.AddArg(y) 8738 v.AddArg(z) 8739 return true 8740 } 8741 // match: (OR (SLL y z) x) 8742 // cond: 8743 // result: (ORshiftLLreg x y z) 8744 for { 8745 v_0 := v.Args[0] 8746 if v_0.Op != OpARMSLL { 8747 break 8748 } 8749 y := v_0.Args[0] 8750 z := v_0.Args[1] 8751 x := v.Args[1] 8752 v.reset(OpARMORshiftLLreg) 8753 v.AddArg(x) 8754 v.AddArg(y) 8755 v.AddArg(z) 8756 return true 8757 } 8758 // match: (OR x (SRL y z)) 8759 // cond: 8760 // result: (ORshiftRLreg x y z) 8761 for { 8762 x := v.Args[0] 8763 v_1 := v.Args[1] 8764 if v_1.Op != OpARMSRL { 8765 break 8766 } 8767 y := v_1.Args[0] 8768 z := v_1.Args[1] 8769 v.reset(OpARMORshiftRLreg) 8770 v.AddArg(x) 8771 v.AddArg(y) 8772 v.AddArg(z) 8773 return true 8774 } 8775 // match: (OR (SRL y z) x) 8776 // cond: 8777 // result: (ORshiftRLreg x y z) 8778 for { 8779 v_0 := v.Args[0] 8780 if v_0.Op != OpARMSRL { 8781 break 8782 } 8783 y := v_0.Args[0] 8784 z := v_0.Args[1] 8785 x := v.Args[1] 8786 v.reset(OpARMORshiftRLreg) 8787 v.AddArg(x) 8788 v.AddArg(y) 8789 v.AddArg(z) 8790 return true 8791 } 8792 // match: (OR x (SRA y z)) 8793 // cond: 8794 // result: (ORshiftRAreg x y z) 8795 for { 8796 x := v.Args[0] 8797 v_1 := v.Args[1] 8798 if v_1.Op != OpARMSRA { 8799 break 8800 } 8801 y := v_1.Args[0] 8802 z := v_1.Args[1] 8803 v.reset(OpARMORshiftRAreg) 8804 v.AddArg(x) 8805 v.AddArg(y) 8806 v.AddArg(z) 8807 return true 8808 } 8809 // match: (OR (SRA y z) x) 8810 // cond: 8811 // result: (ORshiftRAreg x y z) 8812 for { 8813 v_0 := v.Args[0] 8814 if v_0.Op != OpARMSRA { 8815 break 8816 } 8817 y := v_0.Args[0] 8818 z := v_0.Args[1] 8819 x := v.Args[1] 8820 v.reset(OpARMORshiftRAreg) 8821 v.AddArg(x) 8822 v.AddArg(y) 8823 v.AddArg(z) 8824 return true 8825 } 8826 // match: (OR x x) 8827 // cond: 8828 // result: x 8829 for { 8830 x := v.Args[0] 8831 if x != v.Args[1] { 8832 break 8833 } 8834 v.reset(OpCopy) 8835 v.Type = x.Type 8836 v.AddArg(x) 8837 return true 8838 } 8839 return false 8840 } 8841 func rewriteValueARM_OpARMORconst(v *Value) bool { 8842 // match: (ORconst [0] x) 8843 // cond: 8844 // result: x 8845 for { 8846 if v.AuxInt != 0 { 8847 break 8848 } 8849 x := v.Args[0] 8850 v.reset(OpCopy) 8851 v.Type = x.Type 8852 v.AddArg(x) 8853 return true 8854 } 8855 // match: (ORconst [c] _) 8856 // cond: int32(c)==-1 8857 // result: (MOVWconst [-1]) 8858 for { 8859 c := v.AuxInt 8860 if !(int32(c) == -1) { 8861 break 8862 } 8863 v.reset(OpARMMOVWconst) 8864 v.AuxInt = -1 8865 return true 8866 } 8867 // match: (ORconst [c] (MOVWconst [d])) 8868 // cond: 8869 // result: (MOVWconst [c|d]) 8870 for { 8871 c := v.AuxInt 8872 v_0 := v.Args[0] 8873 if v_0.Op != OpARMMOVWconst { 8874 break 8875 } 8876 d := v_0.AuxInt 8877 v.reset(OpARMMOVWconst) 8878 v.AuxInt = c | d 8879 return true 8880 } 8881 // match: (ORconst [c] (ORconst [d] x)) 8882 // cond: 8883 // result: (ORconst [c|d] x) 8884 for { 8885 c := v.AuxInt 8886 v_0 := v.Args[0] 8887 if v_0.Op != OpARMORconst { 8888 break 8889 } 8890 d := v_0.AuxInt 8891 x := v_0.Args[0] 8892 v.reset(OpARMORconst) 8893 v.AuxInt = c | d 8894 v.AddArg(x) 8895 return true 8896 } 8897 return false 8898 } 8899 func rewriteValueARM_OpARMORshiftLL(v *Value) bool { 8900 b := v.Block 8901 _ = b 8902 // match: (ORshiftLL (MOVWconst [c]) x [d]) 8903 // cond: 8904 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 8905 for { 8906 d := v.AuxInt 8907 v_0 := v.Args[0] 8908 if v_0.Op != OpARMMOVWconst { 8909 break 8910 } 8911 c := v_0.AuxInt 8912 x := v.Args[1] 8913 v.reset(OpARMORconst) 8914 v.AuxInt = c 8915 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8916 v0.AuxInt = d 8917 v0.AddArg(x) 8918 v.AddArg(v0) 8919 return true 8920 } 8921 // match: (ORshiftLL x (MOVWconst [c]) [d]) 8922 // cond: 8923 // result: (ORconst x [int64(uint32(c)<<uint64(d))]) 8924 for { 8925 d := v.AuxInt 8926 x := v.Args[0] 8927 v_1 := v.Args[1] 8928 if v_1.Op != OpARMMOVWconst { 8929 break 8930 } 8931 c := v_1.AuxInt 8932 v.reset(OpARMORconst) 8933 v.AuxInt = int64(uint32(c) << uint64(d)) 8934 v.AddArg(x) 8935 return true 8936 } 8937 // match: (ORshiftLL [c] (SRLconst x [32-c]) x) 8938 // cond: 8939 // result: (SRRconst [32-c] x) 8940 for { 8941 c := v.AuxInt 8942 v_0 := v.Args[0] 8943 if v_0.Op != OpARMSRLconst { 8944 break 8945 } 8946 if v_0.AuxInt != 32-c { 8947 break 8948 } 8949 x := v_0.Args[0] 8950 if x != v.Args[1] { 8951 break 8952 } 8953 v.reset(OpARMSRRconst) 8954 v.AuxInt = 32 - c 8955 v.AddArg(x) 8956 return true 8957 } 8958 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 8959 // cond: c==d 8960 // result: y 8961 for { 8962 d := v.AuxInt 8963 x := v.Args[0] 8964 y := v.Args[1] 8965 if y.Op != OpARMSLLconst { 8966 break 8967 } 8968 c := y.AuxInt 8969 if x != y.Args[0] { 8970 break 8971 } 8972 if !(c == d) { 8973 break 8974 } 8975 v.reset(OpCopy) 8976 v.Type = y.Type 8977 v.AddArg(y) 8978 return true 8979 } 8980 return false 8981 } 8982 func rewriteValueARM_OpARMORshiftLLreg(v *Value) bool { 8983 b := v.Block 8984 _ = b 8985 // match: (ORshiftLLreg (MOVWconst [c]) x y) 8986 // cond: 8987 // result: (ORconst [c] (SLL <x.Type> x y)) 8988 for { 8989 v_0 := v.Args[0] 8990 if v_0.Op != OpARMMOVWconst { 8991 break 8992 } 8993 c := v_0.AuxInt 8994 x := v.Args[1] 8995 y := v.Args[2] 8996 v.reset(OpARMORconst) 8997 v.AuxInt = c 8998 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 8999 v0.AddArg(x) 9000 v0.AddArg(y) 9001 v.AddArg(v0) 9002 return true 9003 } 9004 // match: (ORshiftLLreg x y (MOVWconst [c])) 9005 // cond: 9006 // result: (ORshiftLL x y [c]) 9007 for { 9008 x := v.Args[0] 9009 y := v.Args[1] 9010 v_2 := v.Args[2] 9011 if v_2.Op != OpARMMOVWconst { 9012 break 9013 } 9014 c := v_2.AuxInt 9015 v.reset(OpARMORshiftLL) 9016 v.AuxInt = c 9017 v.AddArg(x) 9018 v.AddArg(y) 9019 return true 9020 } 9021 return false 9022 } 9023 func rewriteValueARM_OpARMORshiftRA(v *Value) bool { 9024 b := v.Block 9025 _ = b 9026 // match: (ORshiftRA (MOVWconst [c]) x [d]) 9027 // cond: 9028 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 9029 for { 9030 d := v.AuxInt 9031 v_0 := v.Args[0] 9032 if v_0.Op != OpARMMOVWconst { 9033 break 9034 } 9035 c := v_0.AuxInt 9036 x := v.Args[1] 9037 v.reset(OpARMORconst) 9038 v.AuxInt = c 9039 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9040 v0.AuxInt = d 9041 v0.AddArg(x) 9042 v.AddArg(v0) 9043 return true 9044 } 9045 // match: (ORshiftRA x (MOVWconst [c]) [d]) 9046 // cond: 9047 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 9048 for { 9049 d := v.AuxInt 9050 x := v.Args[0] 9051 v_1 := v.Args[1] 9052 if v_1.Op != OpARMMOVWconst { 9053 break 9054 } 9055 c := v_1.AuxInt 9056 v.reset(OpARMORconst) 9057 v.AuxInt = int64(int32(c) >> uint64(d)) 9058 v.AddArg(x) 9059 return true 9060 } 9061 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 9062 // cond: c==d 9063 // result: y 9064 for { 9065 d := v.AuxInt 9066 x := v.Args[0] 9067 y := v.Args[1] 9068 if y.Op != OpARMSRAconst { 9069 break 9070 } 9071 c := y.AuxInt 9072 if x != y.Args[0] { 9073 break 9074 } 9075 if !(c == d) { 9076 break 9077 } 9078 v.reset(OpCopy) 9079 v.Type = y.Type 9080 v.AddArg(y) 9081 return true 9082 } 9083 return false 9084 } 9085 func rewriteValueARM_OpARMORshiftRAreg(v *Value) bool { 9086 b := v.Block 9087 _ = b 9088 // match: (ORshiftRAreg (MOVWconst [c]) x y) 9089 // cond: 9090 // result: (ORconst [c] (SRA <x.Type> x y)) 9091 for { 9092 v_0 := v.Args[0] 9093 if v_0.Op != OpARMMOVWconst { 9094 break 9095 } 9096 c := v_0.AuxInt 9097 x := v.Args[1] 9098 y := v.Args[2] 9099 v.reset(OpARMORconst) 9100 v.AuxInt = c 9101 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9102 v0.AddArg(x) 9103 v0.AddArg(y) 9104 v.AddArg(v0) 9105 return true 9106 } 9107 // match: (ORshiftRAreg x y (MOVWconst [c])) 9108 // cond: 9109 // result: (ORshiftRA x y [c]) 9110 for { 9111 x := v.Args[0] 9112 y := v.Args[1] 9113 v_2 := v.Args[2] 9114 if v_2.Op != OpARMMOVWconst { 9115 break 9116 } 9117 c := v_2.AuxInt 9118 v.reset(OpARMORshiftRA) 9119 v.AuxInt = c 9120 v.AddArg(x) 9121 v.AddArg(y) 9122 return true 9123 } 9124 return false 9125 } 9126 func rewriteValueARM_OpARMORshiftRL(v *Value) bool { 9127 b := v.Block 9128 _ = b 9129 // match: (ORshiftRL (MOVWconst [c]) x [d]) 9130 // cond: 9131 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 9132 for { 9133 d := v.AuxInt 9134 v_0 := v.Args[0] 9135 if v_0.Op != OpARMMOVWconst { 9136 break 9137 } 9138 c := v_0.AuxInt 9139 x := v.Args[1] 9140 v.reset(OpARMORconst) 9141 v.AuxInt = c 9142 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9143 v0.AuxInt = d 9144 v0.AddArg(x) 9145 v.AddArg(v0) 9146 return true 9147 } 9148 // match: (ORshiftRL x (MOVWconst [c]) [d]) 9149 // cond: 9150 // result: (ORconst x [int64(uint32(c)>>uint64(d))]) 9151 for { 9152 d := v.AuxInt 9153 x := v.Args[0] 9154 v_1 := v.Args[1] 9155 if v_1.Op != OpARMMOVWconst { 9156 break 9157 } 9158 c := v_1.AuxInt 9159 v.reset(OpARMORconst) 9160 v.AuxInt = int64(uint32(c) >> uint64(d)) 9161 v.AddArg(x) 9162 return true 9163 } 9164 // match: (ORshiftRL [c] (SLLconst x [32-c]) x) 9165 // cond: 9166 // result: (SRRconst [ c] x) 9167 for { 9168 c := v.AuxInt 9169 v_0 := v.Args[0] 9170 if v_0.Op != OpARMSLLconst { 9171 break 9172 } 9173 if v_0.AuxInt != 32-c { 9174 break 9175 } 9176 x := v_0.Args[0] 9177 if x != v.Args[1] { 9178 break 9179 } 9180 v.reset(OpARMSRRconst) 9181 v.AuxInt = c 9182 v.AddArg(x) 9183 return true 9184 } 9185 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 9186 // cond: c==d 9187 // result: y 9188 for { 9189 d := v.AuxInt 9190 x := v.Args[0] 9191 y := v.Args[1] 9192 if y.Op != OpARMSRLconst { 9193 break 9194 } 9195 c := y.AuxInt 9196 if x != y.Args[0] { 9197 break 9198 } 9199 if !(c == d) { 9200 break 9201 } 9202 v.reset(OpCopy) 9203 v.Type = y.Type 9204 v.AddArg(y) 9205 return true 9206 } 9207 return false 9208 } 9209 func rewriteValueARM_OpARMORshiftRLreg(v *Value) bool { 9210 b := v.Block 9211 _ = b 9212 // match: (ORshiftRLreg (MOVWconst [c]) x y) 9213 // cond: 9214 // result: (ORconst [c] (SRL <x.Type> x y)) 9215 for { 9216 v_0 := v.Args[0] 9217 if v_0.Op != OpARMMOVWconst { 9218 break 9219 } 9220 c := v_0.AuxInt 9221 x := v.Args[1] 9222 y := v.Args[2] 9223 v.reset(OpARMORconst) 9224 v.AuxInt = c 9225 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9226 v0.AddArg(x) 9227 v0.AddArg(y) 9228 v.AddArg(v0) 9229 return true 9230 } 9231 // match: (ORshiftRLreg x y (MOVWconst [c])) 9232 // cond: 9233 // result: (ORshiftRL x y [c]) 9234 for { 9235 x := v.Args[0] 9236 y := v.Args[1] 9237 v_2 := v.Args[2] 9238 if v_2.Op != OpARMMOVWconst { 9239 break 9240 } 9241 c := v_2.AuxInt 9242 v.reset(OpARMORshiftRL) 9243 v.AuxInt = c 9244 v.AddArg(x) 9245 v.AddArg(y) 9246 return true 9247 } 9248 return false 9249 } 9250 func rewriteValueARM_OpARMRSB(v *Value) bool { 9251 // match: (RSB (MOVWconst [c]) x) 9252 // cond: 9253 // result: (SUBconst [c] x) 9254 for { 9255 v_0 := v.Args[0] 9256 if v_0.Op != OpARMMOVWconst { 9257 break 9258 } 9259 c := v_0.AuxInt 9260 x := v.Args[1] 9261 v.reset(OpARMSUBconst) 9262 v.AuxInt = c 9263 v.AddArg(x) 9264 return true 9265 } 9266 // match: (RSB x (MOVWconst [c])) 9267 // cond: 9268 // result: (RSBconst [c] x) 9269 for { 9270 x := v.Args[0] 9271 v_1 := v.Args[1] 9272 if v_1.Op != OpARMMOVWconst { 9273 break 9274 } 9275 c := v_1.AuxInt 9276 v.reset(OpARMRSBconst) 9277 v.AuxInt = c 9278 v.AddArg(x) 9279 return true 9280 } 9281 // match: (RSB x (SLLconst [c] y)) 9282 // cond: 9283 // result: (RSBshiftLL x y [c]) 9284 for { 9285 x := v.Args[0] 9286 v_1 := v.Args[1] 9287 if v_1.Op != OpARMSLLconst { 9288 break 9289 } 9290 c := v_1.AuxInt 9291 y := v_1.Args[0] 9292 v.reset(OpARMRSBshiftLL) 9293 v.AuxInt = c 9294 v.AddArg(x) 9295 v.AddArg(y) 9296 return true 9297 } 9298 // match: (RSB (SLLconst [c] y) x) 9299 // cond: 9300 // result: (SUBshiftLL x y [c]) 9301 for { 9302 v_0 := v.Args[0] 9303 if v_0.Op != OpARMSLLconst { 9304 break 9305 } 9306 c := v_0.AuxInt 9307 y := v_0.Args[0] 9308 x := v.Args[1] 9309 v.reset(OpARMSUBshiftLL) 9310 v.AuxInt = c 9311 v.AddArg(x) 9312 v.AddArg(y) 9313 return true 9314 } 9315 // match: (RSB x (SRLconst [c] y)) 9316 // cond: 9317 // result: (RSBshiftRL x y [c]) 9318 for { 9319 x := v.Args[0] 9320 v_1 := v.Args[1] 9321 if v_1.Op != OpARMSRLconst { 9322 break 9323 } 9324 c := v_1.AuxInt 9325 y := v_1.Args[0] 9326 v.reset(OpARMRSBshiftRL) 9327 v.AuxInt = c 9328 v.AddArg(x) 9329 v.AddArg(y) 9330 return true 9331 } 9332 // match: (RSB (SRLconst [c] y) x) 9333 // cond: 9334 // result: (SUBshiftRL x y [c]) 9335 for { 9336 v_0 := v.Args[0] 9337 if v_0.Op != OpARMSRLconst { 9338 break 9339 } 9340 c := v_0.AuxInt 9341 y := v_0.Args[0] 9342 x := v.Args[1] 9343 v.reset(OpARMSUBshiftRL) 9344 v.AuxInt = c 9345 v.AddArg(x) 9346 v.AddArg(y) 9347 return true 9348 } 9349 // match: (RSB x (SRAconst [c] y)) 9350 // cond: 9351 // result: (RSBshiftRA x y [c]) 9352 for { 9353 x := v.Args[0] 9354 v_1 := v.Args[1] 9355 if v_1.Op != OpARMSRAconst { 9356 break 9357 } 9358 c := v_1.AuxInt 9359 y := v_1.Args[0] 9360 v.reset(OpARMRSBshiftRA) 9361 v.AuxInt = c 9362 v.AddArg(x) 9363 v.AddArg(y) 9364 return true 9365 } 9366 // match: (RSB (SRAconst [c] y) x) 9367 // cond: 9368 // result: (SUBshiftRA x y [c]) 9369 for { 9370 v_0 := v.Args[0] 9371 if v_0.Op != OpARMSRAconst { 9372 break 9373 } 9374 c := v_0.AuxInt 9375 y := v_0.Args[0] 9376 x := v.Args[1] 9377 v.reset(OpARMSUBshiftRA) 9378 v.AuxInt = c 9379 v.AddArg(x) 9380 v.AddArg(y) 9381 return true 9382 } 9383 // match: (RSB x (SLL y z)) 9384 // cond: 9385 // result: (RSBshiftLLreg x y z) 9386 for { 9387 x := v.Args[0] 9388 v_1 := v.Args[1] 9389 if v_1.Op != OpARMSLL { 9390 break 9391 } 9392 y := v_1.Args[0] 9393 z := v_1.Args[1] 9394 v.reset(OpARMRSBshiftLLreg) 9395 v.AddArg(x) 9396 v.AddArg(y) 9397 v.AddArg(z) 9398 return true 9399 } 9400 // match: (RSB (SLL y z) x) 9401 // cond: 9402 // result: (SUBshiftLLreg x y z) 9403 for { 9404 v_0 := v.Args[0] 9405 if v_0.Op != OpARMSLL { 9406 break 9407 } 9408 y := v_0.Args[0] 9409 z := v_0.Args[1] 9410 x := v.Args[1] 9411 v.reset(OpARMSUBshiftLLreg) 9412 v.AddArg(x) 9413 v.AddArg(y) 9414 v.AddArg(z) 9415 return true 9416 } 9417 // match: (RSB x (SRL y z)) 9418 // cond: 9419 // result: (RSBshiftRLreg x y z) 9420 for { 9421 x := v.Args[0] 9422 v_1 := v.Args[1] 9423 if v_1.Op != OpARMSRL { 9424 break 9425 } 9426 y := v_1.Args[0] 9427 z := v_1.Args[1] 9428 v.reset(OpARMRSBshiftRLreg) 9429 v.AddArg(x) 9430 v.AddArg(y) 9431 v.AddArg(z) 9432 return true 9433 } 9434 // match: (RSB (SRL y z) x) 9435 // cond: 9436 // result: (SUBshiftRLreg x y z) 9437 for { 9438 v_0 := v.Args[0] 9439 if v_0.Op != OpARMSRL { 9440 break 9441 } 9442 y := v_0.Args[0] 9443 z := v_0.Args[1] 9444 x := v.Args[1] 9445 v.reset(OpARMSUBshiftRLreg) 9446 v.AddArg(x) 9447 v.AddArg(y) 9448 v.AddArg(z) 9449 return true 9450 } 9451 // match: (RSB x (SRA y z)) 9452 // cond: 9453 // result: (RSBshiftRAreg x y z) 9454 for { 9455 x := v.Args[0] 9456 v_1 := v.Args[1] 9457 if v_1.Op != OpARMSRA { 9458 break 9459 } 9460 y := v_1.Args[0] 9461 z := v_1.Args[1] 9462 v.reset(OpARMRSBshiftRAreg) 9463 v.AddArg(x) 9464 v.AddArg(y) 9465 v.AddArg(z) 9466 return true 9467 } 9468 // match: (RSB (SRA y z) x) 9469 // cond: 9470 // result: (SUBshiftRAreg x y z) 9471 for { 9472 v_0 := v.Args[0] 9473 if v_0.Op != OpARMSRA { 9474 break 9475 } 9476 y := v_0.Args[0] 9477 z := v_0.Args[1] 9478 x := v.Args[1] 9479 v.reset(OpARMSUBshiftRAreg) 9480 v.AddArg(x) 9481 v.AddArg(y) 9482 v.AddArg(z) 9483 return true 9484 } 9485 // match: (RSB x x) 9486 // cond: 9487 // result: (MOVWconst [0]) 9488 for { 9489 x := v.Args[0] 9490 if x != v.Args[1] { 9491 break 9492 } 9493 v.reset(OpARMMOVWconst) 9494 v.AuxInt = 0 9495 return true 9496 } 9497 return false 9498 } 9499 func rewriteValueARM_OpARMRSBSshiftLL(v *Value) bool { 9500 b := v.Block 9501 _ = b 9502 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 9503 // cond: 9504 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 9505 for { 9506 d := v.AuxInt 9507 v_0 := v.Args[0] 9508 if v_0.Op != OpARMMOVWconst { 9509 break 9510 } 9511 c := v_0.AuxInt 9512 x := v.Args[1] 9513 v.reset(OpARMSUBSconst) 9514 v.AuxInt = c 9515 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9516 v0.AuxInt = d 9517 v0.AddArg(x) 9518 v.AddArg(v0) 9519 return true 9520 } 9521 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 9522 // cond: 9523 // result: (RSBSconst x [int64(uint32(c)<<uint64(d))]) 9524 for { 9525 d := v.AuxInt 9526 x := v.Args[0] 9527 v_1 := v.Args[1] 9528 if v_1.Op != OpARMMOVWconst { 9529 break 9530 } 9531 c := v_1.AuxInt 9532 v.reset(OpARMRSBSconst) 9533 v.AuxInt = int64(uint32(c) << uint64(d)) 9534 v.AddArg(x) 9535 return true 9536 } 9537 return false 9538 } 9539 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value) bool { 9540 b := v.Block 9541 _ = b 9542 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 9543 // cond: 9544 // result: (SUBSconst [c] (SLL <x.Type> x y)) 9545 for { 9546 v_0 := v.Args[0] 9547 if v_0.Op != OpARMMOVWconst { 9548 break 9549 } 9550 c := v_0.AuxInt 9551 x := v.Args[1] 9552 y := v.Args[2] 9553 v.reset(OpARMSUBSconst) 9554 v.AuxInt = c 9555 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9556 v0.AddArg(x) 9557 v0.AddArg(y) 9558 v.AddArg(v0) 9559 return true 9560 } 9561 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 9562 // cond: 9563 // result: (RSBSshiftLL x y [c]) 9564 for { 9565 x := v.Args[0] 9566 y := v.Args[1] 9567 v_2 := v.Args[2] 9568 if v_2.Op != OpARMMOVWconst { 9569 break 9570 } 9571 c := v_2.AuxInt 9572 v.reset(OpARMRSBSshiftLL) 9573 v.AuxInt = c 9574 v.AddArg(x) 9575 v.AddArg(y) 9576 return true 9577 } 9578 return false 9579 } 9580 func rewriteValueARM_OpARMRSBSshiftRA(v *Value) bool { 9581 b := v.Block 9582 _ = b 9583 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 9584 // cond: 9585 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 9586 for { 9587 d := v.AuxInt 9588 v_0 := v.Args[0] 9589 if v_0.Op != OpARMMOVWconst { 9590 break 9591 } 9592 c := v_0.AuxInt 9593 x := v.Args[1] 9594 v.reset(OpARMSUBSconst) 9595 v.AuxInt = c 9596 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9597 v0.AuxInt = d 9598 v0.AddArg(x) 9599 v.AddArg(v0) 9600 return true 9601 } 9602 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 9603 // cond: 9604 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 9605 for { 9606 d := v.AuxInt 9607 x := v.Args[0] 9608 v_1 := v.Args[1] 9609 if v_1.Op != OpARMMOVWconst { 9610 break 9611 } 9612 c := v_1.AuxInt 9613 v.reset(OpARMRSBSconst) 9614 v.AuxInt = int64(int32(c) >> uint64(d)) 9615 v.AddArg(x) 9616 return true 9617 } 9618 return false 9619 } 9620 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value) bool { 9621 b := v.Block 9622 _ = b 9623 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 9624 // cond: 9625 // result: (SUBSconst [c] (SRA <x.Type> x y)) 9626 for { 9627 v_0 := v.Args[0] 9628 if v_0.Op != OpARMMOVWconst { 9629 break 9630 } 9631 c := v_0.AuxInt 9632 x := v.Args[1] 9633 y := v.Args[2] 9634 v.reset(OpARMSUBSconst) 9635 v.AuxInt = c 9636 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9637 v0.AddArg(x) 9638 v0.AddArg(y) 9639 v.AddArg(v0) 9640 return true 9641 } 9642 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 9643 // cond: 9644 // result: (RSBSshiftRA x y [c]) 9645 for { 9646 x := v.Args[0] 9647 y := v.Args[1] 9648 v_2 := v.Args[2] 9649 if v_2.Op != OpARMMOVWconst { 9650 break 9651 } 9652 c := v_2.AuxInt 9653 v.reset(OpARMRSBSshiftRA) 9654 v.AuxInt = c 9655 v.AddArg(x) 9656 v.AddArg(y) 9657 return true 9658 } 9659 return false 9660 } 9661 func rewriteValueARM_OpARMRSBSshiftRL(v *Value) bool { 9662 b := v.Block 9663 _ = b 9664 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 9665 // cond: 9666 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 9667 for { 9668 d := v.AuxInt 9669 v_0 := v.Args[0] 9670 if v_0.Op != OpARMMOVWconst { 9671 break 9672 } 9673 c := v_0.AuxInt 9674 x := v.Args[1] 9675 v.reset(OpARMSUBSconst) 9676 v.AuxInt = c 9677 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9678 v0.AuxInt = d 9679 v0.AddArg(x) 9680 v.AddArg(v0) 9681 return true 9682 } 9683 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 9684 // cond: 9685 // result: (RSBSconst x [int64(uint32(c)>>uint64(d))]) 9686 for { 9687 d := v.AuxInt 9688 x := v.Args[0] 9689 v_1 := v.Args[1] 9690 if v_1.Op != OpARMMOVWconst { 9691 break 9692 } 9693 c := v_1.AuxInt 9694 v.reset(OpARMRSBSconst) 9695 v.AuxInt = int64(uint32(c) >> uint64(d)) 9696 v.AddArg(x) 9697 return true 9698 } 9699 return false 9700 } 9701 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value) bool { 9702 b := v.Block 9703 _ = b 9704 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 9705 // cond: 9706 // result: (SUBSconst [c] (SRL <x.Type> x y)) 9707 for { 9708 v_0 := v.Args[0] 9709 if v_0.Op != OpARMMOVWconst { 9710 break 9711 } 9712 c := v_0.AuxInt 9713 x := v.Args[1] 9714 y := v.Args[2] 9715 v.reset(OpARMSUBSconst) 9716 v.AuxInt = c 9717 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9718 v0.AddArg(x) 9719 v0.AddArg(y) 9720 v.AddArg(v0) 9721 return true 9722 } 9723 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 9724 // cond: 9725 // result: (RSBSshiftRL x y [c]) 9726 for { 9727 x := v.Args[0] 9728 y := v.Args[1] 9729 v_2 := v.Args[2] 9730 if v_2.Op != OpARMMOVWconst { 9731 break 9732 } 9733 c := v_2.AuxInt 9734 v.reset(OpARMRSBSshiftRL) 9735 v.AuxInt = c 9736 v.AddArg(x) 9737 v.AddArg(y) 9738 return true 9739 } 9740 return false 9741 } 9742 func rewriteValueARM_OpARMRSBconst(v *Value) bool { 9743 // match: (RSBconst [c] (MOVWconst [d])) 9744 // cond: 9745 // result: (MOVWconst [int64(int32(c-d))]) 9746 for { 9747 c := v.AuxInt 9748 v_0 := v.Args[0] 9749 if v_0.Op != OpARMMOVWconst { 9750 break 9751 } 9752 d := v_0.AuxInt 9753 v.reset(OpARMMOVWconst) 9754 v.AuxInt = int64(int32(c - d)) 9755 return true 9756 } 9757 // match: (RSBconst [c] (RSBconst [d] x)) 9758 // cond: 9759 // result: (ADDconst [int64(int32(c-d))] x) 9760 for { 9761 c := v.AuxInt 9762 v_0 := v.Args[0] 9763 if v_0.Op != OpARMRSBconst { 9764 break 9765 } 9766 d := v_0.AuxInt 9767 x := v_0.Args[0] 9768 v.reset(OpARMADDconst) 9769 v.AuxInt = int64(int32(c - d)) 9770 v.AddArg(x) 9771 return true 9772 } 9773 // match: (RSBconst [c] (ADDconst [d] x)) 9774 // cond: 9775 // result: (RSBconst [int64(int32(c-d))] x) 9776 for { 9777 c := v.AuxInt 9778 v_0 := v.Args[0] 9779 if v_0.Op != OpARMADDconst { 9780 break 9781 } 9782 d := v_0.AuxInt 9783 x := v_0.Args[0] 9784 v.reset(OpARMRSBconst) 9785 v.AuxInt = int64(int32(c - d)) 9786 v.AddArg(x) 9787 return true 9788 } 9789 // match: (RSBconst [c] (SUBconst [d] x)) 9790 // cond: 9791 // result: (RSBconst [int64(int32(c+d))] x) 9792 for { 9793 c := v.AuxInt 9794 v_0 := v.Args[0] 9795 if v_0.Op != OpARMSUBconst { 9796 break 9797 } 9798 d := v_0.AuxInt 9799 x := v_0.Args[0] 9800 v.reset(OpARMRSBconst) 9801 v.AuxInt = int64(int32(c + d)) 9802 v.AddArg(x) 9803 return true 9804 } 9805 return false 9806 } 9807 func rewriteValueARM_OpARMRSBshiftLL(v *Value) bool { 9808 b := v.Block 9809 _ = b 9810 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 9811 // cond: 9812 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 9813 for { 9814 d := v.AuxInt 9815 v_0 := v.Args[0] 9816 if v_0.Op != OpARMMOVWconst { 9817 break 9818 } 9819 c := v_0.AuxInt 9820 x := v.Args[1] 9821 v.reset(OpARMSUBconst) 9822 v.AuxInt = c 9823 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9824 v0.AuxInt = d 9825 v0.AddArg(x) 9826 v.AddArg(v0) 9827 return true 9828 } 9829 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 9830 // cond: 9831 // result: (RSBconst x [int64(uint32(c)<<uint64(d))]) 9832 for { 9833 d := v.AuxInt 9834 x := v.Args[0] 9835 v_1 := v.Args[1] 9836 if v_1.Op != OpARMMOVWconst { 9837 break 9838 } 9839 c := v_1.AuxInt 9840 v.reset(OpARMRSBconst) 9841 v.AuxInt = int64(uint32(c) << uint64(d)) 9842 v.AddArg(x) 9843 return true 9844 } 9845 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 9846 // cond: c==d 9847 // result: (MOVWconst [0]) 9848 for { 9849 d := v.AuxInt 9850 x := v.Args[0] 9851 v_1 := v.Args[1] 9852 if v_1.Op != OpARMSLLconst { 9853 break 9854 } 9855 c := v_1.AuxInt 9856 if x != v_1.Args[0] { 9857 break 9858 } 9859 if !(c == d) { 9860 break 9861 } 9862 v.reset(OpARMMOVWconst) 9863 v.AuxInt = 0 9864 return true 9865 } 9866 return false 9867 } 9868 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value) bool { 9869 b := v.Block 9870 _ = b 9871 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 9872 // cond: 9873 // result: (SUBconst [c] (SLL <x.Type> x y)) 9874 for { 9875 v_0 := v.Args[0] 9876 if v_0.Op != OpARMMOVWconst { 9877 break 9878 } 9879 c := v_0.AuxInt 9880 x := v.Args[1] 9881 y := v.Args[2] 9882 v.reset(OpARMSUBconst) 9883 v.AuxInt = c 9884 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9885 v0.AddArg(x) 9886 v0.AddArg(y) 9887 v.AddArg(v0) 9888 return true 9889 } 9890 // match: (RSBshiftLLreg x y (MOVWconst [c])) 9891 // cond: 9892 // result: (RSBshiftLL x y [c]) 9893 for { 9894 x := v.Args[0] 9895 y := v.Args[1] 9896 v_2 := v.Args[2] 9897 if v_2.Op != OpARMMOVWconst { 9898 break 9899 } 9900 c := v_2.AuxInt 9901 v.reset(OpARMRSBshiftLL) 9902 v.AuxInt = c 9903 v.AddArg(x) 9904 v.AddArg(y) 9905 return true 9906 } 9907 return false 9908 } 9909 func rewriteValueARM_OpARMRSBshiftRA(v *Value) bool { 9910 b := v.Block 9911 _ = b 9912 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 9913 // cond: 9914 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 9915 for { 9916 d := v.AuxInt 9917 v_0 := v.Args[0] 9918 if v_0.Op != OpARMMOVWconst { 9919 break 9920 } 9921 c := v_0.AuxInt 9922 x := v.Args[1] 9923 v.reset(OpARMSUBconst) 9924 v.AuxInt = c 9925 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9926 v0.AuxInt = d 9927 v0.AddArg(x) 9928 v.AddArg(v0) 9929 return true 9930 } 9931 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 9932 // cond: 9933 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 9934 for { 9935 d := v.AuxInt 9936 x := v.Args[0] 9937 v_1 := v.Args[1] 9938 if v_1.Op != OpARMMOVWconst { 9939 break 9940 } 9941 c := v_1.AuxInt 9942 v.reset(OpARMRSBconst) 9943 v.AuxInt = int64(int32(c) >> uint64(d)) 9944 v.AddArg(x) 9945 return true 9946 } 9947 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 9948 // cond: c==d 9949 // result: (MOVWconst [0]) 9950 for { 9951 d := v.AuxInt 9952 x := v.Args[0] 9953 v_1 := v.Args[1] 9954 if v_1.Op != OpARMSRAconst { 9955 break 9956 } 9957 c := v_1.AuxInt 9958 if x != v_1.Args[0] { 9959 break 9960 } 9961 if !(c == d) { 9962 break 9963 } 9964 v.reset(OpARMMOVWconst) 9965 v.AuxInt = 0 9966 return true 9967 } 9968 return false 9969 } 9970 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value) bool { 9971 b := v.Block 9972 _ = b 9973 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 9974 // cond: 9975 // result: (SUBconst [c] (SRA <x.Type> x y)) 9976 for { 9977 v_0 := v.Args[0] 9978 if v_0.Op != OpARMMOVWconst { 9979 break 9980 } 9981 c := v_0.AuxInt 9982 x := v.Args[1] 9983 y := v.Args[2] 9984 v.reset(OpARMSUBconst) 9985 v.AuxInt = c 9986 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9987 v0.AddArg(x) 9988 v0.AddArg(y) 9989 v.AddArg(v0) 9990 return true 9991 } 9992 // match: (RSBshiftRAreg x y (MOVWconst [c])) 9993 // cond: 9994 // result: (RSBshiftRA x y [c]) 9995 for { 9996 x := v.Args[0] 9997 y := v.Args[1] 9998 v_2 := v.Args[2] 9999 if v_2.Op != OpARMMOVWconst { 10000 break 10001 } 10002 c := v_2.AuxInt 10003 v.reset(OpARMRSBshiftRA) 10004 v.AuxInt = c 10005 v.AddArg(x) 10006 v.AddArg(y) 10007 return true 10008 } 10009 return false 10010 } 10011 func rewriteValueARM_OpARMRSBshiftRL(v *Value) bool { 10012 b := v.Block 10013 _ = b 10014 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 10015 // cond: 10016 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 10017 for { 10018 d := v.AuxInt 10019 v_0 := v.Args[0] 10020 if v_0.Op != OpARMMOVWconst { 10021 break 10022 } 10023 c := v_0.AuxInt 10024 x := v.Args[1] 10025 v.reset(OpARMSUBconst) 10026 v.AuxInt = c 10027 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10028 v0.AuxInt = d 10029 v0.AddArg(x) 10030 v.AddArg(v0) 10031 return true 10032 } 10033 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 10034 // cond: 10035 // result: (RSBconst x [int64(uint32(c)>>uint64(d))]) 10036 for { 10037 d := v.AuxInt 10038 x := v.Args[0] 10039 v_1 := v.Args[1] 10040 if v_1.Op != OpARMMOVWconst { 10041 break 10042 } 10043 c := v_1.AuxInt 10044 v.reset(OpARMRSBconst) 10045 v.AuxInt = int64(uint32(c) >> uint64(d)) 10046 v.AddArg(x) 10047 return true 10048 } 10049 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 10050 // cond: c==d 10051 // result: (MOVWconst [0]) 10052 for { 10053 d := v.AuxInt 10054 x := v.Args[0] 10055 v_1 := v.Args[1] 10056 if v_1.Op != OpARMSRLconst { 10057 break 10058 } 10059 c := v_1.AuxInt 10060 if x != v_1.Args[0] { 10061 break 10062 } 10063 if !(c == d) { 10064 break 10065 } 10066 v.reset(OpARMMOVWconst) 10067 v.AuxInt = 0 10068 return true 10069 } 10070 return false 10071 } 10072 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value) bool { 10073 b := v.Block 10074 _ = b 10075 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 10076 // cond: 10077 // result: (SUBconst [c] (SRL <x.Type> x y)) 10078 for { 10079 v_0 := v.Args[0] 10080 if v_0.Op != OpARMMOVWconst { 10081 break 10082 } 10083 c := v_0.AuxInt 10084 x := v.Args[1] 10085 y := v.Args[2] 10086 v.reset(OpARMSUBconst) 10087 v.AuxInt = c 10088 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10089 v0.AddArg(x) 10090 v0.AddArg(y) 10091 v.AddArg(v0) 10092 return true 10093 } 10094 // match: (RSBshiftRLreg x y (MOVWconst [c])) 10095 // cond: 10096 // result: (RSBshiftRL x y [c]) 10097 for { 10098 x := v.Args[0] 10099 y := v.Args[1] 10100 v_2 := v.Args[2] 10101 if v_2.Op != OpARMMOVWconst { 10102 break 10103 } 10104 c := v_2.AuxInt 10105 v.reset(OpARMRSBshiftRL) 10106 v.AuxInt = c 10107 v.AddArg(x) 10108 v.AddArg(y) 10109 return true 10110 } 10111 return false 10112 } 10113 func rewriteValueARM_OpARMRSCconst(v *Value) bool { 10114 // match: (RSCconst [c] (ADDconst [d] x) flags) 10115 // cond: 10116 // result: (RSCconst [int64(int32(c-d))] x flags) 10117 for { 10118 c := v.AuxInt 10119 v_0 := v.Args[0] 10120 if v_0.Op != OpARMADDconst { 10121 break 10122 } 10123 d := v_0.AuxInt 10124 x := v_0.Args[0] 10125 flags := v.Args[1] 10126 v.reset(OpARMRSCconst) 10127 v.AuxInt = int64(int32(c - d)) 10128 v.AddArg(x) 10129 v.AddArg(flags) 10130 return true 10131 } 10132 // match: (RSCconst [c] (SUBconst [d] x) flags) 10133 // cond: 10134 // result: (RSCconst [int64(int32(c+d))] x flags) 10135 for { 10136 c := v.AuxInt 10137 v_0 := v.Args[0] 10138 if v_0.Op != OpARMSUBconst { 10139 break 10140 } 10141 d := v_0.AuxInt 10142 x := v_0.Args[0] 10143 flags := v.Args[1] 10144 v.reset(OpARMRSCconst) 10145 v.AuxInt = int64(int32(c + d)) 10146 v.AddArg(x) 10147 v.AddArg(flags) 10148 return true 10149 } 10150 return false 10151 } 10152 func rewriteValueARM_OpARMRSCshiftLL(v *Value) bool { 10153 b := v.Block 10154 _ = b 10155 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 10156 // cond: 10157 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 10158 for { 10159 d := v.AuxInt 10160 v_0 := v.Args[0] 10161 if v_0.Op != OpARMMOVWconst { 10162 break 10163 } 10164 c := v_0.AuxInt 10165 x := v.Args[1] 10166 flags := v.Args[2] 10167 v.reset(OpARMSBCconst) 10168 v.AuxInt = c 10169 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10170 v0.AuxInt = d 10171 v0.AddArg(x) 10172 v.AddArg(v0) 10173 v.AddArg(flags) 10174 return true 10175 } 10176 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 10177 // cond: 10178 // result: (RSCconst x [int64(uint32(c)<<uint64(d))] flags) 10179 for { 10180 d := v.AuxInt 10181 x := v.Args[0] 10182 v_1 := v.Args[1] 10183 if v_1.Op != OpARMMOVWconst { 10184 break 10185 } 10186 c := v_1.AuxInt 10187 flags := v.Args[2] 10188 v.reset(OpARMRSCconst) 10189 v.AuxInt = int64(uint32(c) << uint64(d)) 10190 v.AddArg(x) 10191 v.AddArg(flags) 10192 return true 10193 } 10194 return false 10195 } 10196 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value) bool { 10197 b := v.Block 10198 _ = b 10199 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 10200 // cond: 10201 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 10202 for { 10203 v_0 := v.Args[0] 10204 if v_0.Op != OpARMMOVWconst { 10205 break 10206 } 10207 c := v_0.AuxInt 10208 x := v.Args[1] 10209 y := v.Args[2] 10210 flags := v.Args[3] 10211 v.reset(OpARMSBCconst) 10212 v.AuxInt = c 10213 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10214 v0.AddArg(x) 10215 v0.AddArg(y) 10216 v.AddArg(v0) 10217 v.AddArg(flags) 10218 return true 10219 } 10220 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 10221 // cond: 10222 // result: (RSCshiftLL x y [c] flags) 10223 for { 10224 x := v.Args[0] 10225 y := v.Args[1] 10226 v_2 := v.Args[2] 10227 if v_2.Op != OpARMMOVWconst { 10228 break 10229 } 10230 c := v_2.AuxInt 10231 flags := v.Args[3] 10232 v.reset(OpARMRSCshiftLL) 10233 v.AuxInt = c 10234 v.AddArg(x) 10235 v.AddArg(y) 10236 v.AddArg(flags) 10237 return true 10238 } 10239 return false 10240 } 10241 func rewriteValueARM_OpARMRSCshiftRA(v *Value) bool { 10242 b := v.Block 10243 _ = b 10244 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 10245 // cond: 10246 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 10247 for { 10248 d := v.AuxInt 10249 v_0 := v.Args[0] 10250 if v_0.Op != OpARMMOVWconst { 10251 break 10252 } 10253 c := v_0.AuxInt 10254 x := v.Args[1] 10255 flags := v.Args[2] 10256 v.reset(OpARMSBCconst) 10257 v.AuxInt = c 10258 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10259 v0.AuxInt = d 10260 v0.AddArg(x) 10261 v.AddArg(v0) 10262 v.AddArg(flags) 10263 return true 10264 } 10265 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 10266 // cond: 10267 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 10268 for { 10269 d := v.AuxInt 10270 x := v.Args[0] 10271 v_1 := v.Args[1] 10272 if v_1.Op != OpARMMOVWconst { 10273 break 10274 } 10275 c := v_1.AuxInt 10276 flags := v.Args[2] 10277 v.reset(OpARMRSCconst) 10278 v.AuxInt = int64(int32(c) >> uint64(d)) 10279 v.AddArg(x) 10280 v.AddArg(flags) 10281 return true 10282 } 10283 return false 10284 } 10285 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value) bool { 10286 b := v.Block 10287 _ = b 10288 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 10289 // cond: 10290 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 10291 for { 10292 v_0 := v.Args[0] 10293 if v_0.Op != OpARMMOVWconst { 10294 break 10295 } 10296 c := v_0.AuxInt 10297 x := v.Args[1] 10298 y := v.Args[2] 10299 flags := v.Args[3] 10300 v.reset(OpARMSBCconst) 10301 v.AuxInt = c 10302 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10303 v0.AddArg(x) 10304 v0.AddArg(y) 10305 v.AddArg(v0) 10306 v.AddArg(flags) 10307 return true 10308 } 10309 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 10310 // cond: 10311 // result: (RSCshiftRA x y [c] flags) 10312 for { 10313 x := v.Args[0] 10314 y := v.Args[1] 10315 v_2 := v.Args[2] 10316 if v_2.Op != OpARMMOVWconst { 10317 break 10318 } 10319 c := v_2.AuxInt 10320 flags := v.Args[3] 10321 v.reset(OpARMRSCshiftRA) 10322 v.AuxInt = c 10323 v.AddArg(x) 10324 v.AddArg(y) 10325 v.AddArg(flags) 10326 return true 10327 } 10328 return false 10329 } 10330 func rewriteValueARM_OpARMRSCshiftRL(v *Value) bool { 10331 b := v.Block 10332 _ = b 10333 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 10334 // cond: 10335 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 10336 for { 10337 d := v.AuxInt 10338 v_0 := v.Args[0] 10339 if v_0.Op != OpARMMOVWconst { 10340 break 10341 } 10342 c := v_0.AuxInt 10343 x := v.Args[1] 10344 flags := v.Args[2] 10345 v.reset(OpARMSBCconst) 10346 v.AuxInt = c 10347 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10348 v0.AuxInt = d 10349 v0.AddArg(x) 10350 v.AddArg(v0) 10351 v.AddArg(flags) 10352 return true 10353 } 10354 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 10355 // cond: 10356 // result: (RSCconst x [int64(uint32(c)>>uint64(d))] flags) 10357 for { 10358 d := v.AuxInt 10359 x := v.Args[0] 10360 v_1 := v.Args[1] 10361 if v_1.Op != OpARMMOVWconst { 10362 break 10363 } 10364 c := v_1.AuxInt 10365 flags := v.Args[2] 10366 v.reset(OpARMRSCconst) 10367 v.AuxInt = int64(uint32(c) >> uint64(d)) 10368 v.AddArg(x) 10369 v.AddArg(flags) 10370 return true 10371 } 10372 return false 10373 } 10374 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value) bool { 10375 b := v.Block 10376 _ = b 10377 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 10378 // cond: 10379 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 10380 for { 10381 v_0 := v.Args[0] 10382 if v_0.Op != OpARMMOVWconst { 10383 break 10384 } 10385 c := v_0.AuxInt 10386 x := v.Args[1] 10387 y := v.Args[2] 10388 flags := v.Args[3] 10389 v.reset(OpARMSBCconst) 10390 v.AuxInt = c 10391 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10392 v0.AddArg(x) 10393 v0.AddArg(y) 10394 v.AddArg(v0) 10395 v.AddArg(flags) 10396 return true 10397 } 10398 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 10399 // cond: 10400 // result: (RSCshiftRL x y [c] flags) 10401 for { 10402 x := v.Args[0] 10403 y := v.Args[1] 10404 v_2 := v.Args[2] 10405 if v_2.Op != OpARMMOVWconst { 10406 break 10407 } 10408 c := v_2.AuxInt 10409 flags := v.Args[3] 10410 v.reset(OpARMRSCshiftRL) 10411 v.AuxInt = c 10412 v.AddArg(x) 10413 v.AddArg(y) 10414 v.AddArg(flags) 10415 return true 10416 } 10417 return false 10418 } 10419 func rewriteValueARM_OpARMSBC(v *Value) bool { 10420 // match: (SBC (MOVWconst [c]) x flags) 10421 // cond: 10422 // result: (RSCconst [c] x flags) 10423 for { 10424 v_0 := v.Args[0] 10425 if v_0.Op != OpARMMOVWconst { 10426 break 10427 } 10428 c := v_0.AuxInt 10429 x := v.Args[1] 10430 flags := v.Args[2] 10431 v.reset(OpARMRSCconst) 10432 v.AuxInt = c 10433 v.AddArg(x) 10434 v.AddArg(flags) 10435 return true 10436 } 10437 // match: (SBC x (MOVWconst [c]) flags) 10438 // cond: 10439 // result: (SBCconst [c] x flags) 10440 for { 10441 x := v.Args[0] 10442 v_1 := v.Args[1] 10443 if v_1.Op != OpARMMOVWconst { 10444 break 10445 } 10446 c := v_1.AuxInt 10447 flags := v.Args[2] 10448 v.reset(OpARMSBCconst) 10449 v.AuxInt = c 10450 v.AddArg(x) 10451 v.AddArg(flags) 10452 return true 10453 } 10454 // match: (SBC x (SLLconst [c] y) flags) 10455 // cond: 10456 // result: (SBCshiftLL x y [c] flags) 10457 for { 10458 x := v.Args[0] 10459 v_1 := v.Args[1] 10460 if v_1.Op != OpARMSLLconst { 10461 break 10462 } 10463 c := v_1.AuxInt 10464 y := v_1.Args[0] 10465 flags := v.Args[2] 10466 v.reset(OpARMSBCshiftLL) 10467 v.AuxInt = c 10468 v.AddArg(x) 10469 v.AddArg(y) 10470 v.AddArg(flags) 10471 return true 10472 } 10473 // match: (SBC (SLLconst [c] y) x flags) 10474 // cond: 10475 // result: (RSCshiftLL x y [c] flags) 10476 for { 10477 v_0 := v.Args[0] 10478 if v_0.Op != OpARMSLLconst { 10479 break 10480 } 10481 c := v_0.AuxInt 10482 y := v_0.Args[0] 10483 x := v.Args[1] 10484 flags := v.Args[2] 10485 v.reset(OpARMRSCshiftLL) 10486 v.AuxInt = c 10487 v.AddArg(x) 10488 v.AddArg(y) 10489 v.AddArg(flags) 10490 return true 10491 } 10492 // match: (SBC x (SRLconst [c] y) flags) 10493 // cond: 10494 // result: (SBCshiftRL x y [c] flags) 10495 for { 10496 x := v.Args[0] 10497 v_1 := v.Args[1] 10498 if v_1.Op != OpARMSRLconst { 10499 break 10500 } 10501 c := v_1.AuxInt 10502 y := v_1.Args[0] 10503 flags := v.Args[2] 10504 v.reset(OpARMSBCshiftRL) 10505 v.AuxInt = c 10506 v.AddArg(x) 10507 v.AddArg(y) 10508 v.AddArg(flags) 10509 return true 10510 } 10511 // match: (SBC (SRLconst [c] y) x flags) 10512 // cond: 10513 // result: (RSCshiftRL x y [c] flags) 10514 for { 10515 v_0 := v.Args[0] 10516 if v_0.Op != OpARMSRLconst { 10517 break 10518 } 10519 c := v_0.AuxInt 10520 y := v_0.Args[0] 10521 x := v.Args[1] 10522 flags := v.Args[2] 10523 v.reset(OpARMRSCshiftRL) 10524 v.AuxInt = c 10525 v.AddArg(x) 10526 v.AddArg(y) 10527 v.AddArg(flags) 10528 return true 10529 } 10530 // match: (SBC x (SRAconst [c] y) flags) 10531 // cond: 10532 // result: (SBCshiftRA x y [c] flags) 10533 for { 10534 x := v.Args[0] 10535 v_1 := v.Args[1] 10536 if v_1.Op != OpARMSRAconst { 10537 break 10538 } 10539 c := v_1.AuxInt 10540 y := v_1.Args[0] 10541 flags := v.Args[2] 10542 v.reset(OpARMSBCshiftRA) 10543 v.AuxInt = c 10544 v.AddArg(x) 10545 v.AddArg(y) 10546 v.AddArg(flags) 10547 return true 10548 } 10549 // match: (SBC (SRAconst [c] y) x flags) 10550 // cond: 10551 // result: (RSCshiftRA x y [c] flags) 10552 for { 10553 v_0 := v.Args[0] 10554 if v_0.Op != OpARMSRAconst { 10555 break 10556 } 10557 c := v_0.AuxInt 10558 y := v_0.Args[0] 10559 x := v.Args[1] 10560 flags := v.Args[2] 10561 v.reset(OpARMRSCshiftRA) 10562 v.AuxInt = c 10563 v.AddArg(x) 10564 v.AddArg(y) 10565 v.AddArg(flags) 10566 return true 10567 } 10568 // match: (SBC x (SLL y z) flags) 10569 // cond: 10570 // result: (SBCshiftLLreg x y z flags) 10571 for { 10572 x := v.Args[0] 10573 v_1 := v.Args[1] 10574 if v_1.Op != OpARMSLL { 10575 break 10576 } 10577 y := v_1.Args[0] 10578 z := v_1.Args[1] 10579 flags := v.Args[2] 10580 v.reset(OpARMSBCshiftLLreg) 10581 v.AddArg(x) 10582 v.AddArg(y) 10583 v.AddArg(z) 10584 v.AddArg(flags) 10585 return true 10586 } 10587 // match: (SBC (SLL y z) x flags) 10588 // cond: 10589 // result: (RSCshiftLLreg x y z flags) 10590 for { 10591 v_0 := v.Args[0] 10592 if v_0.Op != OpARMSLL { 10593 break 10594 } 10595 y := v_0.Args[0] 10596 z := v_0.Args[1] 10597 x := v.Args[1] 10598 flags := v.Args[2] 10599 v.reset(OpARMRSCshiftLLreg) 10600 v.AddArg(x) 10601 v.AddArg(y) 10602 v.AddArg(z) 10603 v.AddArg(flags) 10604 return true 10605 } 10606 // match: (SBC x (SRL y z) flags) 10607 // cond: 10608 // result: (SBCshiftRLreg x y z flags) 10609 for { 10610 x := v.Args[0] 10611 v_1 := v.Args[1] 10612 if v_1.Op != OpARMSRL { 10613 break 10614 } 10615 y := v_1.Args[0] 10616 z := v_1.Args[1] 10617 flags := v.Args[2] 10618 v.reset(OpARMSBCshiftRLreg) 10619 v.AddArg(x) 10620 v.AddArg(y) 10621 v.AddArg(z) 10622 v.AddArg(flags) 10623 return true 10624 } 10625 // match: (SBC (SRL y z) x flags) 10626 // cond: 10627 // result: (RSCshiftRLreg x y z flags) 10628 for { 10629 v_0 := v.Args[0] 10630 if v_0.Op != OpARMSRL { 10631 break 10632 } 10633 y := v_0.Args[0] 10634 z := v_0.Args[1] 10635 x := v.Args[1] 10636 flags := v.Args[2] 10637 v.reset(OpARMRSCshiftRLreg) 10638 v.AddArg(x) 10639 v.AddArg(y) 10640 v.AddArg(z) 10641 v.AddArg(flags) 10642 return true 10643 } 10644 // match: (SBC x (SRA y z) flags) 10645 // cond: 10646 // result: (SBCshiftRAreg x y z flags) 10647 for { 10648 x := v.Args[0] 10649 v_1 := v.Args[1] 10650 if v_1.Op != OpARMSRA { 10651 break 10652 } 10653 y := v_1.Args[0] 10654 z := v_1.Args[1] 10655 flags := v.Args[2] 10656 v.reset(OpARMSBCshiftRAreg) 10657 v.AddArg(x) 10658 v.AddArg(y) 10659 v.AddArg(z) 10660 v.AddArg(flags) 10661 return true 10662 } 10663 // match: (SBC (SRA y z) x flags) 10664 // cond: 10665 // result: (RSCshiftRAreg x y z flags) 10666 for { 10667 v_0 := v.Args[0] 10668 if v_0.Op != OpARMSRA { 10669 break 10670 } 10671 y := v_0.Args[0] 10672 z := v_0.Args[1] 10673 x := v.Args[1] 10674 flags := v.Args[2] 10675 v.reset(OpARMRSCshiftRAreg) 10676 v.AddArg(x) 10677 v.AddArg(y) 10678 v.AddArg(z) 10679 v.AddArg(flags) 10680 return true 10681 } 10682 return false 10683 } 10684 func rewriteValueARM_OpARMSBCconst(v *Value) bool { 10685 // match: (SBCconst [c] (ADDconst [d] x) flags) 10686 // cond: 10687 // result: (SBCconst [int64(int32(c-d))] x flags) 10688 for { 10689 c := v.AuxInt 10690 v_0 := v.Args[0] 10691 if v_0.Op != OpARMADDconst { 10692 break 10693 } 10694 d := v_0.AuxInt 10695 x := v_0.Args[0] 10696 flags := v.Args[1] 10697 v.reset(OpARMSBCconst) 10698 v.AuxInt = int64(int32(c - d)) 10699 v.AddArg(x) 10700 v.AddArg(flags) 10701 return true 10702 } 10703 // match: (SBCconst [c] (SUBconst [d] x) flags) 10704 // cond: 10705 // result: (SBCconst [int64(int32(c+d))] x flags) 10706 for { 10707 c := v.AuxInt 10708 v_0 := v.Args[0] 10709 if v_0.Op != OpARMSUBconst { 10710 break 10711 } 10712 d := v_0.AuxInt 10713 x := v_0.Args[0] 10714 flags := v.Args[1] 10715 v.reset(OpARMSBCconst) 10716 v.AuxInt = int64(int32(c + d)) 10717 v.AddArg(x) 10718 v.AddArg(flags) 10719 return true 10720 } 10721 return false 10722 } 10723 func rewriteValueARM_OpARMSBCshiftLL(v *Value) bool { 10724 b := v.Block 10725 _ = b 10726 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 10727 // cond: 10728 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 10729 for { 10730 d := v.AuxInt 10731 v_0 := v.Args[0] 10732 if v_0.Op != OpARMMOVWconst { 10733 break 10734 } 10735 c := v_0.AuxInt 10736 x := v.Args[1] 10737 flags := v.Args[2] 10738 v.reset(OpARMRSCconst) 10739 v.AuxInt = c 10740 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10741 v0.AuxInt = d 10742 v0.AddArg(x) 10743 v.AddArg(v0) 10744 v.AddArg(flags) 10745 return true 10746 } 10747 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 10748 // cond: 10749 // result: (SBCconst x [int64(uint32(c)<<uint64(d))] flags) 10750 for { 10751 d := v.AuxInt 10752 x := v.Args[0] 10753 v_1 := v.Args[1] 10754 if v_1.Op != OpARMMOVWconst { 10755 break 10756 } 10757 c := v_1.AuxInt 10758 flags := v.Args[2] 10759 v.reset(OpARMSBCconst) 10760 v.AuxInt = int64(uint32(c) << uint64(d)) 10761 v.AddArg(x) 10762 v.AddArg(flags) 10763 return true 10764 } 10765 return false 10766 } 10767 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value) bool { 10768 b := v.Block 10769 _ = b 10770 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 10771 // cond: 10772 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 10773 for { 10774 v_0 := v.Args[0] 10775 if v_0.Op != OpARMMOVWconst { 10776 break 10777 } 10778 c := v_0.AuxInt 10779 x := v.Args[1] 10780 y := v.Args[2] 10781 flags := v.Args[3] 10782 v.reset(OpARMRSCconst) 10783 v.AuxInt = c 10784 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10785 v0.AddArg(x) 10786 v0.AddArg(y) 10787 v.AddArg(v0) 10788 v.AddArg(flags) 10789 return true 10790 } 10791 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 10792 // cond: 10793 // result: (SBCshiftLL x y [c] flags) 10794 for { 10795 x := v.Args[0] 10796 y := v.Args[1] 10797 v_2 := v.Args[2] 10798 if v_2.Op != OpARMMOVWconst { 10799 break 10800 } 10801 c := v_2.AuxInt 10802 flags := v.Args[3] 10803 v.reset(OpARMSBCshiftLL) 10804 v.AuxInt = c 10805 v.AddArg(x) 10806 v.AddArg(y) 10807 v.AddArg(flags) 10808 return true 10809 } 10810 return false 10811 } 10812 func rewriteValueARM_OpARMSBCshiftRA(v *Value) bool { 10813 b := v.Block 10814 _ = b 10815 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 10816 // cond: 10817 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 10818 for { 10819 d := v.AuxInt 10820 v_0 := v.Args[0] 10821 if v_0.Op != OpARMMOVWconst { 10822 break 10823 } 10824 c := v_0.AuxInt 10825 x := v.Args[1] 10826 flags := v.Args[2] 10827 v.reset(OpARMRSCconst) 10828 v.AuxInt = c 10829 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10830 v0.AuxInt = d 10831 v0.AddArg(x) 10832 v.AddArg(v0) 10833 v.AddArg(flags) 10834 return true 10835 } 10836 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 10837 // cond: 10838 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 10839 for { 10840 d := v.AuxInt 10841 x := v.Args[0] 10842 v_1 := v.Args[1] 10843 if v_1.Op != OpARMMOVWconst { 10844 break 10845 } 10846 c := v_1.AuxInt 10847 flags := v.Args[2] 10848 v.reset(OpARMSBCconst) 10849 v.AuxInt = int64(int32(c) >> uint64(d)) 10850 v.AddArg(x) 10851 v.AddArg(flags) 10852 return true 10853 } 10854 return false 10855 } 10856 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value) bool { 10857 b := v.Block 10858 _ = b 10859 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 10860 // cond: 10861 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 10862 for { 10863 v_0 := v.Args[0] 10864 if v_0.Op != OpARMMOVWconst { 10865 break 10866 } 10867 c := v_0.AuxInt 10868 x := v.Args[1] 10869 y := v.Args[2] 10870 flags := v.Args[3] 10871 v.reset(OpARMRSCconst) 10872 v.AuxInt = c 10873 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10874 v0.AddArg(x) 10875 v0.AddArg(y) 10876 v.AddArg(v0) 10877 v.AddArg(flags) 10878 return true 10879 } 10880 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 10881 // cond: 10882 // result: (SBCshiftRA x y [c] flags) 10883 for { 10884 x := v.Args[0] 10885 y := v.Args[1] 10886 v_2 := v.Args[2] 10887 if v_2.Op != OpARMMOVWconst { 10888 break 10889 } 10890 c := v_2.AuxInt 10891 flags := v.Args[3] 10892 v.reset(OpARMSBCshiftRA) 10893 v.AuxInt = c 10894 v.AddArg(x) 10895 v.AddArg(y) 10896 v.AddArg(flags) 10897 return true 10898 } 10899 return false 10900 } 10901 func rewriteValueARM_OpARMSBCshiftRL(v *Value) bool { 10902 b := v.Block 10903 _ = b 10904 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 10905 // cond: 10906 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 10907 for { 10908 d := v.AuxInt 10909 v_0 := v.Args[0] 10910 if v_0.Op != OpARMMOVWconst { 10911 break 10912 } 10913 c := v_0.AuxInt 10914 x := v.Args[1] 10915 flags := v.Args[2] 10916 v.reset(OpARMRSCconst) 10917 v.AuxInt = c 10918 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10919 v0.AuxInt = d 10920 v0.AddArg(x) 10921 v.AddArg(v0) 10922 v.AddArg(flags) 10923 return true 10924 } 10925 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 10926 // cond: 10927 // result: (SBCconst x [int64(uint32(c)>>uint64(d))] flags) 10928 for { 10929 d := v.AuxInt 10930 x := v.Args[0] 10931 v_1 := v.Args[1] 10932 if v_1.Op != OpARMMOVWconst { 10933 break 10934 } 10935 c := v_1.AuxInt 10936 flags := v.Args[2] 10937 v.reset(OpARMSBCconst) 10938 v.AuxInt = int64(uint32(c) >> uint64(d)) 10939 v.AddArg(x) 10940 v.AddArg(flags) 10941 return true 10942 } 10943 return false 10944 } 10945 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value) bool { 10946 b := v.Block 10947 _ = b 10948 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 10949 // cond: 10950 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 10951 for { 10952 v_0 := v.Args[0] 10953 if v_0.Op != OpARMMOVWconst { 10954 break 10955 } 10956 c := v_0.AuxInt 10957 x := v.Args[1] 10958 y := v.Args[2] 10959 flags := v.Args[3] 10960 v.reset(OpARMRSCconst) 10961 v.AuxInt = c 10962 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10963 v0.AddArg(x) 10964 v0.AddArg(y) 10965 v.AddArg(v0) 10966 v.AddArg(flags) 10967 return true 10968 } 10969 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 10970 // cond: 10971 // result: (SBCshiftRL x y [c] flags) 10972 for { 10973 x := v.Args[0] 10974 y := v.Args[1] 10975 v_2 := v.Args[2] 10976 if v_2.Op != OpARMMOVWconst { 10977 break 10978 } 10979 c := v_2.AuxInt 10980 flags := v.Args[3] 10981 v.reset(OpARMSBCshiftRL) 10982 v.AuxInt = c 10983 v.AddArg(x) 10984 v.AddArg(y) 10985 v.AddArg(flags) 10986 return true 10987 } 10988 return false 10989 } 10990 func rewriteValueARM_OpARMSLL(v *Value) bool { 10991 // match: (SLL x (MOVWconst [c])) 10992 // cond: 10993 // result: (SLLconst x [c&31]) 10994 for { 10995 x := v.Args[0] 10996 v_1 := v.Args[1] 10997 if v_1.Op != OpARMMOVWconst { 10998 break 10999 } 11000 c := v_1.AuxInt 11001 v.reset(OpARMSLLconst) 11002 v.AuxInt = c & 31 11003 v.AddArg(x) 11004 return true 11005 } 11006 return false 11007 } 11008 func rewriteValueARM_OpARMSLLconst(v *Value) bool { 11009 // match: (SLLconst [c] (MOVWconst [d])) 11010 // cond: 11011 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 11012 for { 11013 c := v.AuxInt 11014 v_0 := v.Args[0] 11015 if v_0.Op != OpARMMOVWconst { 11016 break 11017 } 11018 d := v_0.AuxInt 11019 v.reset(OpARMMOVWconst) 11020 v.AuxInt = int64(uint32(d) << uint64(c)) 11021 return true 11022 } 11023 return false 11024 } 11025 func rewriteValueARM_OpARMSRA(v *Value) bool { 11026 // match: (SRA x (MOVWconst [c])) 11027 // cond: 11028 // result: (SRAconst x [c&31]) 11029 for { 11030 x := v.Args[0] 11031 v_1 := v.Args[1] 11032 if v_1.Op != OpARMMOVWconst { 11033 break 11034 } 11035 c := v_1.AuxInt 11036 v.reset(OpARMSRAconst) 11037 v.AuxInt = c & 31 11038 v.AddArg(x) 11039 return true 11040 } 11041 return false 11042 } 11043 func rewriteValueARM_OpARMSRAcond(v *Value) bool { 11044 // match: (SRAcond x _ (FlagEQ)) 11045 // cond: 11046 // result: (SRAconst x [31]) 11047 for { 11048 x := v.Args[0] 11049 v_2 := v.Args[2] 11050 if v_2.Op != OpARMFlagEQ { 11051 break 11052 } 11053 v.reset(OpARMSRAconst) 11054 v.AuxInt = 31 11055 v.AddArg(x) 11056 return true 11057 } 11058 // match: (SRAcond x y (FlagLT_ULT)) 11059 // cond: 11060 // result: (SRA x y) 11061 for { 11062 x := v.Args[0] 11063 y := v.Args[1] 11064 v_2 := v.Args[2] 11065 if v_2.Op != OpARMFlagLT_ULT { 11066 break 11067 } 11068 v.reset(OpARMSRA) 11069 v.AddArg(x) 11070 v.AddArg(y) 11071 return true 11072 } 11073 // match: (SRAcond x _ (FlagLT_UGT)) 11074 // cond: 11075 // result: (SRAconst x [31]) 11076 for { 11077 x := v.Args[0] 11078 v_2 := v.Args[2] 11079 if v_2.Op != OpARMFlagLT_UGT { 11080 break 11081 } 11082 v.reset(OpARMSRAconst) 11083 v.AuxInt = 31 11084 v.AddArg(x) 11085 return true 11086 } 11087 // match: (SRAcond x y (FlagGT_ULT)) 11088 // cond: 11089 // result: (SRA x y) 11090 for { 11091 x := v.Args[0] 11092 y := v.Args[1] 11093 v_2 := v.Args[2] 11094 if v_2.Op != OpARMFlagGT_ULT { 11095 break 11096 } 11097 v.reset(OpARMSRA) 11098 v.AddArg(x) 11099 v.AddArg(y) 11100 return true 11101 } 11102 // match: (SRAcond x _ (FlagGT_UGT)) 11103 // cond: 11104 // result: (SRAconst x [31]) 11105 for { 11106 x := v.Args[0] 11107 v_2 := v.Args[2] 11108 if v_2.Op != OpARMFlagGT_UGT { 11109 break 11110 } 11111 v.reset(OpARMSRAconst) 11112 v.AuxInt = 31 11113 v.AddArg(x) 11114 return true 11115 } 11116 return false 11117 } 11118 func rewriteValueARM_OpARMSRAconst(v *Value) bool { 11119 // match: (SRAconst [c] (MOVWconst [d])) 11120 // cond: 11121 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 11122 for { 11123 c := v.AuxInt 11124 v_0 := v.Args[0] 11125 if v_0.Op != OpARMMOVWconst { 11126 break 11127 } 11128 d := v_0.AuxInt 11129 v.reset(OpARMMOVWconst) 11130 v.AuxInt = int64(int32(d) >> uint64(c)) 11131 return true 11132 } 11133 return false 11134 } 11135 func rewriteValueARM_OpARMSRL(v *Value) bool { 11136 // match: (SRL x (MOVWconst [c])) 11137 // cond: 11138 // result: (SRLconst x [c&31]) 11139 for { 11140 x := v.Args[0] 11141 v_1 := v.Args[1] 11142 if v_1.Op != OpARMMOVWconst { 11143 break 11144 } 11145 c := v_1.AuxInt 11146 v.reset(OpARMSRLconst) 11147 v.AuxInt = c & 31 11148 v.AddArg(x) 11149 return true 11150 } 11151 return false 11152 } 11153 func rewriteValueARM_OpARMSRLconst(v *Value) bool { 11154 // match: (SRLconst [c] (MOVWconst [d])) 11155 // cond: 11156 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 11157 for { 11158 c := v.AuxInt 11159 v_0 := v.Args[0] 11160 if v_0.Op != OpARMMOVWconst { 11161 break 11162 } 11163 d := v_0.AuxInt 11164 v.reset(OpARMMOVWconst) 11165 v.AuxInt = int64(uint32(d) >> uint64(c)) 11166 return true 11167 } 11168 return false 11169 } 11170 func rewriteValueARM_OpARMSUB(v *Value) bool { 11171 // match: (SUB (MOVWconst [c]) x) 11172 // cond: 11173 // result: (RSBconst [c] x) 11174 for { 11175 v_0 := v.Args[0] 11176 if v_0.Op != OpARMMOVWconst { 11177 break 11178 } 11179 c := v_0.AuxInt 11180 x := v.Args[1] 11181 v.reset(OpARMRSBconst) 11182 v.AuxInt = c 11183 v.AddArg(x) 11184 return true 11185 } 11186 // match: (SUB x (MOVWconst [c])) 11187 // cond: 11188 // result: (SUBconst [c] x) 11189 for { 11190 x := v.Args[0] 11191 v_1 := v.Args[1] 11192 if v_1.Op != OpARMMOVWconst { 11193 break 11194 } 11195 c := v_1.AuxInt 11196 v.reset(OpARMSUBconst) 11197 v.AuxInt = c 11198 v.AddArg(x) 11199 return true 11200 } 11201 // match: (SUB x (SLLconst [c] y)) 11202 // cond: 11203 // result: (SUBshiftLL x y [c]) 11204 for { 11205 x := v.Args[0] 11206 v_1 := v.Args[1] 11207 if v_1.Op != OpARMSLLconst { 11208 break 11209 } 11210 c := v_1.AuxInt 11211 y := v_1.Args[0] 11212 v.reset(OpARMSUBshiftLL) 11213 v.AuxInt = c 11214 v.AddArg(x) 11215 v.AddArg(y) 11216 return true 11217 } 11218 // match: (SUB (SLLconst [c] y) x) 11219 // cond: 11220 // result: (RSBshiftLL x y [c]) 11221 for { 11222 v_0 := v.Args[0] 11223 if v_0.Op != OpARMSLLconst { 11224 break 11225 } 11226 c := v_0.AuxInt 11227 y := v_0.Args[0] 11228 x := v.Args[1] 11229 v.reset(OpARMRSBshiftLL) 11230 v.AuxInt = c 11231 v.AddArg(x) 11232 v.AddArg(y) 11233 return true 11234 } 11235 // match: (SUB x (SRLconst [c] y)) 11236 // cond: 11237 // result: (SUBshiftRL x y [c]) 11238 for { 11239 x := v.Args[0] 11240 v_1 := v.Args[1] 11241 if v_1.Op != OpARMSRLconst { 11242 break 11243 } 11244 c := v_1.AuxInt 11245 y := v_1.Args[0] 11246 v.reset(OpARMSUBshiftRL) 11247 v.AuxInt = c 11248 v.AddArg(x) 11249 v.AddArg(y) 11250 return true 11251 } 11252 // match: (SUB (SRLconst [c] y) x) 11253 // cond: 11254 // result: (RSBshiftRL x y [c]) 11255 for { 11256 v_0 := v.Args[0] 11257 if v_0.Op != OpARMSRLconst { 11258 break 11259 } 11260 c := v_0.AuxInt 11261 y := v_0.Args[0] 11262 x := v.Args[1] 11263 v.reset(OpARMRSBshiftRL) 11264 v.AuxInt = c 11265 v.AddArg(x) 11266 v.AddArg(y) 11267 return true 11268 } 11269 // match: (SUB x (SRAconst [c] y)) 11270 // cond: 11271 // result: (SUBshiftRA x y [c]) 11272 for { 11273 x := v.Args[0] 11274 v_1 := v.Args[1] 11275 if v_1.Op != OpARMSRAconst { 11276 break 11277 } 11278 c := v_1.AuxInt 11279 y := v_1.Args[0] 11280 v.reset(OpARMSUBshiftRA) 11281 v.AuxInt = c 11282 v.AddArg(x) 11283 v.AddArg(y) 11284 return true 11285 } 11286 // match: (SUB (SRAconst [c] y) x) 11287 // cond: 11288 // result: (RSBshiftRA x y [c]) 11289 for { 11290 v_0 := v.Args[0] 11291 if v_0.Op != OpARMSRAconst { 11292 break 11293 } 11294 c := v_0.AuxInt 11295 y := v_0.Args[0] 11296 x := v.Args[1] 11297 v.reset(OpARMRSBshiftRA) 11298 v.AuxInt = c 11299 v.AddArg(x) 11300 v.AddArg(y) 11301 return true 11302 } 11303 // match: (SUB x (SLL y z)) 11304 // cond: 11305 // result: (SUBshiftLLreg x y z) 11306 for { 11307 x := v.Args[0] 11308 v_1 := v.Args[1] 11309 if v_1.Op != OpARMSLL { 11310 break 11311 } 11312 y := v_1.Args[0] 11313 z := v_1.Args[1] 11314 v.reset(OpARMSUBshiftLLreg) 11315 v.AddArg(x) 11316 v.AddArg(y) 11317 v.AddArg(z) 11318 return true 11319 } 11320 // match: (SUB (SLL y z) x) 11321 // cond: 11322 // result: (RSBshiftLLreg x y z) 11323 for { 11324 v_0 := v.Args[0] 11325 if v_0.Op != OpARMSLL { 11326 break 11327 } 11328 y := v_0.Args[0] 11329 z := v_0.Args[1] 11330 x := v.Args[1] 11331 v.reset(OpARMRSBshiftLLreg) 11332 v.AddArg(x) 11333 v.AddArg(y) 11334 v.AddArg(z) 11335 return true 11336 } 11337 // match: (SUB x (SRL y z)) 11338 // cond: 11339 // result: (SUBshiftRLreg x y z) 11340 for { 11341 x := v.Args[0] 11342 v_1 := v.Args[1] 11343 if v_1.Op != OpARMSRL { 11344 break 11345 } 11346 y := v_1.Args[0] 11347 z := v_1.Args[1] 11348 v.reset(OpARMSUBshiftRLreg) 11349 v.AddArg(x) 11350 v.AddArg(y) 11351 v.AddArg(z) 11352 return true 11353 } 11354 // match: (SUB (SRL y z) x) 11355 // cond: 11356 // result: (RSBshiftRLreg x y z) 11357 for { 11358 v_0 := v.Args[0] 11359 if v_0.Op != OpARMSRL { 11360 break 11361 } 11362 y := v_0.Args[0] 11363 z := v_0.Args[1] 11364 x := v.Args[1] 11365 v.reset(OpARMRSBshiftRLreg) 11366 v.AddArg(x) 11367 v.AddArg(y) 11368 v.AddArg(z) 11369 return true 11370 } 11371 // match: (SUB x (SRA y z)) 11372 // cond: 11373 // result: (SUBshiftRAreg x y z) 11374 for { 11375 x := v.Args[0] 11376 v_1 := v.Args[1] 11377 if v_1.Op != OpARMSRA { 11378 break 11379 } 11380 y := v_1.Args[0] 11381 z := v_1.Args[1] 11382 v.reset(OpARMSUBshiftRAreg) 11383 v.AddArg(x) 11384 v.AddArg(y) 11385 v.AddArg(z) 11386 return true 11387 } 11388 // match: (SUB (SRA y z) x) 11389 // cond: 11390 // result: (RSBshiftRAreg x y z) 11391 for { 11392 v_0 := v.Args[0] 11393 if v_0.Op != OpARMSRA { 11394 break 11395 } 11396 y := v_0.Args[0] 11397 z := v_0.Args[1] 11398 x := v.Args[1] 11399 v.reset(OpARMRSBshiftRAreg) 11400 v.AddArg(x) 11401 v.AddArg(y) 11402 v.AddArg(z) 11403 return true 11404 } 11405 // match: (SUB x x) 11406 // cond: 11407 // result: (MOVWconst [0]) 11408 for { 11409 x := v.Args[0] 11410 if x != v.Args[1] { 11411 break 11412 } 11413 v.reset(OpARMMOVWconst) 11414 v.AuxInt = 0 11415 return true 11416 } 11417 return false 11418 } 11419 func rewriteValueARM_OpARMSUBS(v *Value) bool { 11420 // match: (SUBS x (MOVWconst [c])) 11421 // cond: 11422 // result: (SUBSconst [c] x) 11423 for { 11424 x := v.Args[0] 11425 v_1 := v.Args[1] 11426 if v_1.Op != OpARMMOVWconst { 11427 break 11428 } 11429 c := v_1.AuxInt 11430 v.reset(OpARMSUBSconst) 11431 v.AuxInt = c 11432 v.AddArg(x) 11433 return true 11434 } 11435 // match: (SUBS x (SLLconst [c] y)) 11436 // cond: 11437 // result: (SUBSshiftLL x y [c]) 11438 for { 11439 x := v.Args[0] 11440 v_1 := v.Args[1] 11441 if v_1.Op != OpARMSLLconst { 11442 break 11443 } 11444 c := v_1.AuxInt 11445 y := v_1.Args[0] 11446 v.reset(OpARMSUBSshiftLL) 11447 v.AuxInt = c 11448 v.AddArg(x) 11449 v.AddArg(y) 11450 return true 11451 } 11452 // match: (SUBS (SLLconst [c] y) x) 11453 // cond: 11454 // result: (RSBSshiftLL x y [c]) 11455 for { 11456 v_0 := v.Args[0] 11457 if v_0.Op != OpARMSLLconst { 11458 break 11459 } 11460 c := v_0.AuxInt 11461 y := v_0.Args[0] 11462 x := v.Args[1] 11463 v.reset(OpARMRSBSshiftLL) 11464 v.AuxInt = c 11465 v.AddArg(x) 11466 v.AddArg(y) 11467 return true 11468 } 11469 // match: (SUBS x (SRLconst [c] y)) 11470 // cond: 11471 // result: (SUBSshiftRL x y [c]) 11472 for { 11473 x := v.Args[0] 11474 v_1 := v.Args[1] 11475 if v_1.Op != OpARMSRLconst { 11476 break 11477 } 11478 c := v_1.AuxInt 11479 y := v_1.Args[0] 11480 v.reset(OpARMSUBSshiftRL) 11481 v.AuxInt = c 11482 v.AddArg(x) 11483 v.AddArg(y) 11484 return true 11485 } 11486 // match: (SUBS (SRLconst [c] y) x) 11487 // cond: 11488 // result: (RSBSshiftRL x y [c]) 11489 for { 11490 v_0 := v.Args[0] 11491 if v_0.Op != OpARMSRLconst { 11492 break 11493 } 11494 c := v_0.AuxInt 11495 y := v_0.Args[0] 11496 x := v.Args[1] 11497 v.reset(OpARMRSBSshiftRL) 11498 v.AuxInt = c 11499 v.AddArg(x) 11500 v.AddArg(y) 11501 return true 11502 } 11503 // match: (SUBS x (SRAconst [c] y)) 11504 // cond: 11505 // result: (SUBSshiftRA x y [c]) 11506 for { 11507 x := v.Args[0] 11508 v_1 := v.Args[1] 11509 if v_1.Op != OpARMSRAconst { 11510 break 11511 } 11512 c := v_1.AuxInt 11513 y := v_1.Args[0] 11514 v.reset(OpARMSUBSshiftRA) 11515 v.AuxInt = c 11516 v.AddArg(x) 11517 v.AddArg(y) 11518 return true 11519 } 11520 // match: (SUBS (SRAconst [c] y) x) 11521 // cond: 11522 // result: (RSBSshiftRA x y [c]) 11523 for { 11524 v_0 := v.Args[0] 11525 if v_0.Op != OpARMSRAconst { 11526 break 11527 } 11528 c := v_0.AuxInt 11529 y := v_0.Args[0] 11530 x := v.Args[1] 11531 v.reset(OpARMRSBSshiftRA) 11532 v.AuxInt = c 11533 v.AddArg(x) 11534 v.AddArg(y) 11535 return true 11536 } 11537 // match: (SUBS x (SLL y z)) 11538 // cond: 11539 // result: (SUBSshiftLLreg x y z) 11540 for { 11541 x := v.Args[0] 11542 v_1 := v.Args[1] 11543 if v_1.Op != OpARMSLL { 11544 break 11545 } 11546 y := v_1.Args[0] 11547 z := v_1.Args[1] 11548 v.reset(OpARMSUBSshiftLLreg) 11549 v.AddArg(x) 11550 v.AddArg(y) 11551 v.AddArg(z) 11552 return true 11553 } 11554 // match: (SUBS (SLL y z) x) 11555 // cond: 11556 // result: (RSBSshiftLLreg x y z) 11557 for { 11558 v_0 := v.Args[0] 11559 if v_0.Op != OpARMSLL { 11560 break 11561 } 11562 y := v_0.Args[0] 11563 z := v_0.Args[1] 11564 x := v.Args[1] 11565 v.reset(OpARMRSBSshiftLLreg) 11566 v.AddArg(x) 11567 v.AddArg(y) 11568 v.AddArg(z) 11569 return true 11570 } 11571 // match: (SUBS x (SRL y z)) 11572 // cond: 11573 // result: (SUBSshiftRLreg x y z) 11574 for { 11575 x := v.Args[0] 11576 v_1 := v.Args[1] 11577 if v_1.Op != OpARMSRL { 11578 break 11579 } 11580 y := v_1.Args[0] 11581 z := v_1.Args[1] 11582 v.reset(OpARMSUBSshiftRLreg) 11583 v.AddArg(x) 11584 v.AddArg(y) 11585 v.AddArg(z) 11586 return true 11587 } 11588 // match: (SUBS (SRL y z) x) 11589 // cond: 11590 // result: (RSBSshiftRLreg x y z) 11591 for { 11592 v_0 := v.Args[0] 11593 if v_0.Op != OpARMSRL { 11594 break 11595 } 11596 y := v_0.Args[0] 11597 z := v_0.Args[1] 11598 x := v.Args[1] 11599 v.reset(OpARMRSBSshiftRLreg) 11600 v.AddArg(x) 11601 v.AddArg(y) 11602 v.AddArg(z) 11603 return true 11604 } 11605 // match: (SUBS x (SRA y z)) 11606 // cond: 11607 // result: (SUBSshiftRAreg x y z) 11608 for { 11609 x := v.Args[0] 11610 v_1 := v.Args[1] 11611 if v_1.Op != OpARMSRA { 11612 break 11613 } 11614 y := v_1.Args[0] 11615 z := v_1.Args[1] 11616 v.reset(OpARMSUBSshiftRAreg) 11617 v.AddArg(x) 11618 v.AddArg(y) 11619 v.AddArg(z) 11620 return true 11621 } 11622 // match: (SUBS (SRA y z) x) 11623 // cond: 11624 // result: (RSBSshiftRAreg x y z) 11625 for { 11626 v_0 := v.Args[0] 11627 if v_0.Op != OpARMSRA { 11628 break 11629 } 11630 y := v_0.Args[0] 11631 z := v_0.Args[1] 11632 x := v.Args[1] 11633 v.reset(OpARMRSBSshiftRAreg) 11634 v.AddArg(x) 11635 v.AddArg(y) 11636 v.AddArg(z) 11637 return true 11638 } 11639 return false 11640 } 11641 func rewriteValueARM_OpARMSUBSshiftLL(v *Value) bool { 11642 b := v.Block 11643 _ = b 11644 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 11645 // cond: 11646 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 11647 for { 11648 d := v.AuxInt 11649 v_0 := v.Args[0] 11650 if v_0.Op != OpARMMOVWconst { 11651 break 11652 } 11653 c := v_0.AuxInt 11654 x := v.Args[1] 11655 v.reset(OpARMRSBSconst) 11656 v.AuxInt = c 11657 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11658 v0.AuxInt = d 11659 v0.AddArg(x) 11660 v.AddArg(v0) 11661 return true 11662 } 11663 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 11664 // cond: 11665 // result: (SUBSconst x [int64(uint32(c)<<uint64(d))]) 11666 for { 11667 d := v.AuxInt 11668 x := v.Args[0] 11669 v_1 := v.Args[1] 11670 if v_1.Op != OpARMMOVWconst { 11671 break 11672 } 11673 c := v_1.AuxInt 11674 v.reset(OpARMSUBSconst) 11675 v.AuxInt = int64(uint32(c) << uint64(d)) 11676 v.AddArg(x) 11677 return true 11678 } 11679 return false 11680 } 11681 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value) bool { 11682 b := v.Block 11683 _ = b 11684 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 11685 // cond: 11686 // result: (RSBSconst [c] (SLL <x.Type> x y)) 11687 for { 11688 v_0 := v.Args[0] 11689 if v_0.Op != OpARMMOVWconst { 11690 break 11691 } 11692 c := v_0.AuxInt 11693 x := v.Args[1] 11694 y := v.Args[2] 11695 v.reset(OpARMRSBSconst) 11696 v.AuxInt = c 11697 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11698 v0.AddArg(x) 11699 v0.AddArg(y) 11700 v.AddArg(v0) 11701 return true 11702 } 11703 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 11704 // cond: 11705 // result: (SUBSshiftLL x y [c]) 11706 for { 11707 x := v.Args[0] 11708 y := v.Args[1] 11709 v_2 := v.Args[2] 11710 if v_2.Op != OpARMMOVWconst { 11711 break 11712 } 11713 c := v_2.AuxInt 11714 v.reset(OpARMSUBSshiftLL) 11715 v.AuxInt = c 11716 v.AddArg(x) 11717 v.AddArg(y) 11718 return true 11719 } 11720 return false 11721 } 11722 func rewriteValueARM_OpARMSUBSshiftRA(v *Value) bool { 11723 b := v.Block 11724 _ = b 11725 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 11726 // cond: 11727 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 11728 for { 11729 d := v.AuxInt 11730 v_0 := v.Args[0] 11731 if v_0.Op != OpARMMOVWconst { 11732 break 11733 } 11734 c := v_0.AuxInt 11735 x := v.Args[1] 11736 v.reset(OpARMRSBSconst) 11737 v.AuxInt = c 11738 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11739 v0.AuxInt = d 11740 v0.AddArg(x) 11741 v.AddArg(v0) 11742 return true 11743 } 11744 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 11745 // cond: 11746 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 11747 for { 11748 d := v.AuxInt 11749 x := v.Args[0] 11750 v_1 := v.Args[1] 11751 if v_1.Op != OpARMMOVWconst { 11752 break 11753 } 11754 c := v_1.AuxInt 11755 v.reset(OpARMSUBSconst) 11756 v.AuxInt = int64(int32(c) >> uint64(d)) 11757 v.AddArg(x) 11758 return true 11759 } 11760 return false 11761 } 11762 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value) bool { 11763 b := v.Block 11764 _ = b 11765 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 11766 // cond: 11767 // result: (RSBSconst [c] (SRA <x.Type> x y)) 11768 for { 11769 v_0 := v.Args[0] 11770 if v_0.Op != OpARMMOVWconst { 11771 break 11772 } 11773 c := v_0.AuxInt 11774 x := v.Args[1] 11775 y := v.Args[2] 11776 v.reset(OpARMRSBSconst) 11777 v.AuxInt = c 11778 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11779 v0.AddArg(x) 11780 v0.AddArg(y) 11781 v.AddArg(v0) 11782 return true 11783 } 11784 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 11785 // cond: 11786 // result: (SUBSshiftRA x y [c]) 11787 for { 11788 x := v.Args[0] 11789 y := v.Args[1] 11790 v_2 := v.Args[2] 11791 if v_2.Op != OpARMMOVWconst { 11792 break 11793 } 11794 c := v_2.AuxInt 11795 v.reset(OpARMSUBSshiftRA) 11796 v.AuxInt = c 11797 v.AddArg(x) 11798 v.AddArg(y) 11799 return true 11800 } 11801 return false 11802 } 11803 func rewriteValueARM_OpARMSUBSshiftRL(v *Value) bool { 11804 b := v.Block 11805 _ = b 11806 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 11807 // cond: 11808 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 11809 for { 11810 d := v.AuxInt 11811 v_0 := v.Args[0] 11812 if v_0.Op != OpARMMOVWconst { 11813 break 11814 } 11815 c := v_0.AuxInt 11816 x := v.Args[1] 11817 v.reset(OpARMRSBSconst) 11818 v.AuxInt = c 11819 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11820 v0.AuxInt = d 11821 v0.AddArg(x) 11822 v.AddArg(v0) 11823 return true 11824 } 11825 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 11826 // cond: 11827 // result: (SUBSconst x [int64(uint32(c)>>uint64(d))]) 11828 for { 11829 d := v.AuxInt 11830 x := v.Args[0] 11831 v_1 := v.Args[1] 11832 if v_1.Op != OpARMMOVWconst { 11833 break 11834 } 11835 c := v_1.AuxInt 11836 v.reset(OpARMSUBSconst) 11837 v.AuxInt = int64(uint32(c) >> uint64(d)) 11838 v.AddArg(x) 11839 return true 11840 } 11841 return false 11842 } 11843 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value) bool { 11844 b := v.Block 11845 _ = b 11846 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 11847 // cond: 11848 // result: (RSBSconst [c] (SRL <x.Type> x y)) 11849 for { 11850 v_0 := v.Args[0] 11851 if v_0.Op != OpARMMOVWconst { 11852 break 11853 } 11854 c := v_0.AuxInt 11855 x := v.Args[1] 11856 y := v.Args[2] 11857 v.reset(OpARMRSBSconst) 11858 v.AuxInt = c 11859 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11860 v0.AddArg(x) 11861 v0.AddArg(y) 11862 v.AddArg(v0) 11863 return true 11864 } 11865 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 11866 // cond: 11867 // result: (SUBSshiftRL x y [c]) 11868 for { 11869 x := v.Args[0] 11870 y := v.Args[1] 11871 v_2 := v.Args[2] 11872 if v_2.Op != OpARMMOVWconst { 11873 break 11874 } 11875 c := v_2.AuxInt 11876 v.reset(OpARMSUBSshiftRL) 11877 v.AuxInt = c 11878 v.AddArg(x) 11879 v.AddArg(y) 11880 return true 11881 } 11882 return false 11883 } 11884 func rewriteValueARM_OpARMSUBconst(v *Value) bool { 11885 // match: (SUBconst [0] x) 11886 // cond: 11887 // result: x 11888 for { 11889 if v.AuxInt != 0 { 11890 break 11891 } 11892 x := v.Args[0] 11893 v.reset(OpCopy) 11894 v.Type = x.Type 11895 v.AddArg(x) 11896 return true 11897 } 11898 // match: (SUBconst [c] (MOVWconst [d])) 11899 // cond: 11900 // result: (MOVWconst [int64(int32(d-c))]) 11901 for { 11902 c := v.AuxInt 11903 v_0 := v.Args[0] 11904 if v_0.Op != OpARMMOVWconst { 11905 break 11906 } 11907 d := v_0.AuxInt 11908 v.reset(OpARMMOVWconst) 11909 v.AuxInt = int64(int32(d - c)) 11910 return true 11911 } 11912 // match: (SUBconst [c] (SUBconst [d] x)) 11913 // cond: 11914 // result: (ADDconst [int64(int32(-c-d))] x) 11915 for { 11916 c := v.AuxInt 11917 v_0 := v.Args[0] 11918 if v_0.Op != OpARMSUBconst { 11919 break 11920 } 11921 d := v_0.AuxInt 11922 x := v_0.Args[0] 11923 v.reset(OpARMADDconst) 11924 v.AuxInt = int64(int32(-c - d)) 11925 v.AddArg(x) 11926 return true 11927 } 11928 // match: (SUBconst [c] (ADDconst [d] x)) 11929 // cond: 11930 // result: (ADDconst [int64(int32(-c+d))] x) 11931 for { 11932 c := v.AuxInt 11933 v_0 := v.Args[0] 11934 if v_0.Op != OpARMADDconst { 11935 break 11936 } 11937 d := v_0.AuxInt 11938 x := v_0.Args[0] 11939 v.reset(OpARMADDconst) 11940 v.AuxInt = int64(int32(-c + d)) 11941 v.AddArg(x) 11942 return true 11943 } 11944 // match: (SUBconst [c] (RSBconst [d] x)) 11945 // cond: 11946 // result: (RSBconst [int64(int32(-c+d))] x) 11947 for { 11948 c := v.AuxInt 11949 v_0 := v.Args[0] 11950 if v_0.Op != OpARMRSBconst { 11951 break 11952 } 11953 d := v_0.AuxInt 11954 x := v_0.Args[0] 11955 v.reset(OpARMRSBconst) 11956 v.AuxInt = int64(int32(-c + d)) 11957 v.AddArg(x) 11958 return true 11959 } 11960 return false 11961 } 11962 func rewriteValueARM_OpARMSUBshiftLL(v *Value) bool { 11963 b := v.Block 11964 _ = b 11965 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 11966 // cond: 11967 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 11968 for { 11969 d := v.AuxInt 11970 v_0 := v.Args[0] 11971 if v_0.Op != OpARMMOVWconst { 11972 break 11973 } 11974 c := v_0.AuxInt 11975 x := v.Args[1] 11976 v.reset(OpARMRSBconst) 11977 v.AuxInt = c 11978 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11979 v0.AuxInt = d 11980 v0.AddArg(x) 11981 v.AddArg(v0) 11982 return true 11983 } 11984 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 11985 // cond: 11986 // result: (SUBconst x [int64(uint32(c)<<uint64(d))]) 11987 for { 11988 d := v.AuxInt 11989 x := v.Args[0] 11990 v_1 := v.Args[1] 11991 if v_1.Op != OpARMMOVWconst { 11992 break 11993 } 11994 c := v_1.AuxInt 11995 v.reset(OpARMSUBconst) 11996 v.AuxInt = int64(uint32(c) << uint64(d)) 11997 v.AddArg(x) 11998 return true 11999 } 12000 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 12001 // cond: c==d 12002 // result: (MOVWconst [0]) 12003 for { 12004 d := v.AuxInt 12005 x := v.Args[0] 12006 v_1 := v.Args[1] 12007 if v_1.Op != OpARMSLLconst { 12008 break 12009 } 12010 c := v_1.AuxInt 12011 if x != v_1.Args[0] { 12012 break 12013 } 12014 if !(c == d) { 12015 break 12016 } 12017 v.reset(OpARMMOVWconst) 12018 v.AuxInt = 0 12019 return true 12020 } 12021 return false 12022 } 12023 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value) bool { 12024 b := v.Block 12025 _ = b 12026 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 12027 // cond: 12028 // result: (RSBconst [c] (SLL <x.Type> x y)) 12029 for { 12030 v_0 := v.Args[0] 12031 if v_0.Op != OpARMMOVWconst { 12032 break 12033 } 12034 c := v_0.AuxInt 12035 x := v.Args[1] 12036 y := v.Args[2] 12037 v.reset(OpARMRSBconst) 12038 v.AuxInt = c 12039 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12040 v0.AddArg(x) 12041 v0.AddArg(y) 12042 v.AddArg(v0) 12043 return true 12044 } 12045 // match: (SUBshiftLLreg x y (MOVWconst [c])) 12046 // cond: 12047 // result: (SUBshiftLL x y [c]) 12048 for { 12049 x := v.Args[0] 12050 y := v.Args[1] 12051 v_2 := v.Args[2] 12052 if v_2.Op != OpARMMOVWconst { 12053 break 12054 } 12055 c := v_2.AuxInt 12056 v.reset(OpARMSUBshiftLL) 12057 v.AuxInt = c 12058 v.AddArg(x) 12059 v.AddArg(y) 12060 return true 12061 } 12062 return false 12063 } 12064 func rewriteValueARM_OpARMSUBshiftRA(v *Value) bool { 12065 b := v.Block 12066 _ = b 12067 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 12068 // cond: 12069 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 12070 for { 12071 d := v.AuxInt 12072 v_0 := v.Args[0] 12073 if v_0.Op != OpARMMOVWconst { 12074 break 12075 } 12076 c := v_0.AuxInt 12077 x := v.Args[1] 12078 v.reset(OpARMRSBconst) 12079 v.AuxInt = c 12080 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12081 v0.AuxInt = d 12082 v0.AddArg(x) 12083 v.AddArg(v0) 12084 return true 12085 } 12086 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 12087 // cond: 12088 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 12089 for { 12090 d := v.AuxInt 12091 x := v.Args[0] 12092 v_1 := v.Args[1] 12093 if v_1.Op != OpARMMOVWconst { 12094 break 12095 } 12096 c := v_1.AuxInt 12097 v.reset(OpARMSUBconst) 12098 v.AuxInt = int64(int32(c) >> uint64(d)) 12099 v.AddArg(x) 12100 return true 12101 } 12102 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 12103 // cond: c==d 12104 // result: (MOVWconst [0]) 12105 for { 12106 d := v.AuxInt 12107 x := v.Args[0] 12108 v_1 := v.Args[1] 12109 if v_1.Op != OpARMSRAconst { 12110 break 12111 } 12112 c := v_1.AuxInt 12113 if x != v_1.Args[0] { 12114 break 12115 } 12116 if !(c == d) { 12117 break 12118 } 12119 v.reset(OpARMMOVWconst) 12120 v.AuxInt = 0 12121 return true 12122 } 12123 return false 12124 } 12125 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value) bool { 12126 b := v.Block 12127 _ = b 12128 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 12129 // cond: 12130 // result: (RSBconst [c] (SRA <x.Type> x y)) 12131 for { 12132 v_0 := v.Args[0] 12133 if v_0.Op != OpARMMOVWconst { 12134 break 12135 } 12136 c := v_0.AuxInt 12137 x := v.Args[1] 12138 y := v.Args[2] 12139 v.reset(OpARMRSBconst) 12140 v.AuxInt = c 12141 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12142 v0.AddArg(x) 12143 v0.AddArg(y) 12144 v.AddArg(v0) 12145 return true 12146 } 12147 // match: (SUBshiftRAreg x y (MOVWconst [c])) 12148 // cond: 12149 // result: (SUBshiftRA x y [c]) 12150 for { 12151 x := v.Args[0] 12152 y := v.Args[1] 12153 v_2 := v.Args[2] 12154 if v_2.Op != OpARMMOVWconst { 12155 break 12156 } 12157 c := v_2.AuxInt 12158 v.reset(OpARMSUBshiftRA) 12159 v.AuxInt = c 12160 v.AddArg(x) 12161 v.AddArg(y) 12162 return true 12163 } 12164 return false 12165 } 12166 func rewriteValueARM_OpARMSUBshiftRL(v *Value) bool { 12167 b := v.Block 12168 _ = b 12169 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 12170 // cond: 12171 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 12172 for { 12173 d := v.AuxInt 12174 v_0 := v.Args[0] 12175 if v_0.Op != OpARMMOVWconst { 12176 break 12177 } 12178 c := v_0.AuxInt 12179 x := v.Args[1] 12180 v.reset(OpARMRSBconst) 12181 v.AuxInt = c 12182 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12183 v0.AuxInt = d 12184 v0.AddArg(x) 12185 v.AddArg(v0) 12186 return true 12187 } 12188 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 12189 // cond: 12190 // result: (SUBconst x [int64(uint32(c)>>uint64(d))]) 12191 for { 12192 d := v.AuxInt 12193 x := v.Args[0] 12194 v_1 := v.Args[1] 12195 if v_1.Op != OpARMMOVWconst { 12196 break 12197 } 12198 c := v_1.AuxInt 12199 v.reset(OpARMSUBconst) 12200 v.AuxInt = int64(uint32(c) >> uint64(d)) 12201 v.AddArg(x) 12202 return true 12203 } 12204 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 12205 // cond: c==d 12206 // result: (MOVWconst [0]) 12207 for { 12208 d := v.AuxInt 12209 x := v.Args[0] 12210 v_1 := v.Args[1] 12211 if v_1.Op != OpARMSRLconst { 12212 break 12213 } 12214 c := v_1.AuxInt 12215 if x != v_1.Args[0] { 12216 break 12217 } 12218 if !(c == d) { 12219 break 12220 } 12221 v.reset(OpARMMOVWconst) 12222 v.AuxInt = 0 12223 return true 12224 } 12225 return false 12226 } 12227 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value) bool { 12228 b := v.Block 12229 _ = b 12230 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 12231 // cond: 12232 // result: (RSBconst [c] (SRL <x.Type> x y)) 12233 for { 12234 v_0 := v.Args[0] 12235 if v_0.Op != OpARMMOVWconst { 12236 break 12237 } 12238 c := v_0.AuxInt 12239 x := v.Args[1] 12240 y := v.Args[2] 12241 v.reset(OpARMRSBconst) 12242 v.AuxInt = c 12243 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12244 v0.AddArg(x) 12245 v0.AddArg(y) 12246 v.AddArg(v0) 12247 return true 12248 } 12249 // match: (SUBshiftRLreg x y (MOVWconst [c])) 12250 // cond: 12251 // result: (SUBshiftRL x y [c]) 12252 for { 12253 x := v.Args[0] 12254 y := v.Args[1] 12255 v_2 := v.Args[2] 12256 if v_2.Op != OpARMMOVWconst { 12257 break 12258 } 12259 c := v_2.AuxInt 12260 v.reset(OpARMSUBshiftRL) 12261 v.AuxInt = c 12262 v.AddArg(x) 12263 v.AddArg(y) 12264 return true 12265 } 12266 return false 12267 } 12268 func rewriteValueARM_OpARMXOR(v *Value) bool { 12269 // match: (XOR x (MOVWconst [c])) 12270 // cond: 12271 // result: (XORconst [c] x) 12272 for { 12273 x := v.Args[0] 12274 v_1 := v.Args[1] 12275 if v_1.Op != OpARMMOVWconst { 12276 break 12277 } 12278 c := v_1.AuxInt 12279 v.reset(OpARMXORconst) 12280 v.AuxInt = c 12281 v.AddArg(x) 12282 return true 12283 } 12284 // match: (XOR (MOVWconst [c]) x) 12285 // cond: 12286 // result: (XORconst [c] x) 12287 for { 12288 v_0 := v.Args[0] 12289 if v_0.Op != OpARMMOVWconst { 12290 break 12291 } 12292 c := v_0.AuxInt 12293 x := v.Args[1] 12294 v.reset(OpARMXORconst) 12295 v.AuxInt = c 12296 v.AddArg(x) 12297 return true 12298 } 12299 // match: (XOR x (SLLconst [c] y)) 12300 // cond: 12301 // result: (XORshiftLL x y [c]) 12302 for { 12303 x := v.Args[0] 12304 v_1 := v.Args[1] 12305 if v_1.Op != OpARMSLLconst { 12306 break 12307 } 12308 c := v_1.AuxInt 12309 y := v_1.Args[0] 12310 v.reset(OpARMXORshiftLL) 12311 v.AuxInt = c 12312 v.AddArg(x) 12313 v.AddArg(y) 12314 return true 12315 } 12316 // match: (XOR (SLLconst [c] y) x) 12317 // cond: 12318 // result: (XORshiftLL x y [c]) 12319 for { 12320 v_0 := v.Args[0] 12321 if v_0.Op != OpARMSLLconst { 12322 break 12323 } 12324 c := v_0.AuxInt 12325 y := v_0.Args[0] 12326 x := v.Args[1] 12327 v.reset(OpARMXORshiftLL) 12328 v.AuxInt = c 12329 v.AddArg(x) 12330 v.AddArg(y) 12331 return true 12332 } 12333 // match: (XOR x (SRLconst [c] y)) 12334 // cond: 12335 // result: (XORshiftRL x y [c]) 12336 for { 12337 x := v.Args[0] 12338 v_1 := v.Args[1] 12339 if v_1.Op != OpARMSRLconst { 12340 break 12341 } 12342 c := v_1.AuxInt 12343 y := v_1.Args[0] 12344 v.reset(OpARMXORshiftRL) 12345 v.AuxInt = c 12346 v.AddArg(x) 12347 v.AddArg(y) 12348 return true 12349 } 12350 // match: (XOR (SRLconst [c] y) x) 12351 // cond: 12352 // result: (XORshiftRL x y [c]) 12353 for { 12354 v_0 := v.Args[0] 12355 if v_0.Op != OpARMSRLconst { 12356 break 12357 } 12358 c := v_0.AuxInt 12359 y := v_0.Args[0] 12360 x := v.Args[1] 12361 v.reset(OpARMXORshiftRL) 12362 v.AuxInt = c 12363 v.AddArg(x) 12364 v.AddArg(y) 12365 return true 12366 } 12367 // match: (XOR x (SRAconst [c] y)) 12368 // cond: 12369 // result: (XORshiftRA x y [c]) 12370 for { 12371 x := v.Args[0] 12372 v_1 := v.Args[1] 12373 if v_1.Op != OpARMSRAconst { 12374 break 12375 } 12376 c := v_1.AuxInt 12377 y := v_1.Args[0] 12378 v.reset(OpARMXORshiftRA) 12379 v.AuxInt = c 12380 v.AddArg(x) 12381 v.AddArg(y) 12382 return true 12383 } 12384 // match: (XOR (SRAconst [c] y) x) 12385 // cond: 12386 // result: (XORshiftRA x y [c]) 12387 for { 12388 v_0 := v.Args[0] 12389 if v_0.Op != OpARMSRAconst { 12390 break 12391 } 12392 c := v_0.AuxInt 12393 y := v_0.Args[0] 12394 x := v.Args[1] 12395 v.reset(OpARMXORshiftRA) 12396 v.AuxInt = c 12397 v.AddArg(x) 12398 v.AddArg(y) 12399 return true 12400 } 12401 // match: (XOR x (SRRconst [c] y)) 12402 // cond: 12403 // result: (XORshiftRR x y [c]) 12404 for { 12405 x := v.Args[0] 12406 v_1 := v.Args[1] 12407 if v_1.Op != OpARMSRRconst { 12408 break 12409 } 12410 c := v_1.AuxInt 12411 y := v_1.Args[0] 12412 v.reset(OpARMXORshiftRR) 12413 v.AuxInt = c 12414 v.AddArg(x) 12415 v.AddArg(y) 12416 return true 12417 } 12418 // match: (XOR (SRRconst [c] y) x) 12419 // cond: 12420 // result: (XORshiftRR x y [c]) 12421 for { 12422 v_0 := v.Args[0] 12423 if v_0.Op != OpARMSRRconst { 12424 break 12425 } 12426 c := v_0.AuxInt 12427 y := v_0.Args[0] 12428 x := v.Args[1] 12429 v.reset(OpARMXORshiftRR) 12430 v.AuxInt = c 12431 v.AddArg(x) 12432 v.AddArg(y) 12433 return true 12434 } 12435 // match: (XOR x (SLL y z)) 12436 // cond: 12437 // result: (XORshiftLLreg x y z) 12438 for { 12439 x := v.Args[0] 12440 v_1 := v.Args[1] 12441 if v_1.Op != OpARMSLL { 12442 break 12443 } 12444 y := v_1.Args[0] 12445 z := v_1.Args[1] 12446 v.reset(OpARMXORshiftLLreg) 12447 v.AddArg(x) 12448 v.AddArg(y) 12449 v.AddArg(z) 12450 return true 12451 } 12452 // match: (XOR (SLL y z) x) 12453 // cond: 12454 // result: (XORshiftLLreg x y z) 12455 for { 12456 v_0 := v.Args[0] 12457 if v_0.Op != OpARMSLL { 12458 break 12459 } 12460 y := v_0.Args[0] 12461 z := v_0.Args[1] 12462 x := v.Args[1] 12463 v.reset(OpARMXORshiftLLreg) 12464 v.AddArg(x) 12465 v.AddArg(y) 12466 v.AddArg(z) 12467 return true 12468 } 12469 // match: (XOR x (SRL y z)) 12470 // cond: 12471 // result: (XORshiftRLreg x y z) 12472 for { 12473 x := v.Args[0] 12474 v_1 := v.Args[1] 12475 if v_1.Op != OpARMSRL { 12476 break 12477 } 12478 y := v_1.Args[0] 12479 z := v_1.Args[1] 12480 v.reset(OpARMXORshiftRLreg) 12481 v.AddArg(x) 12482 v.AddArg(y) 12483 v.AddArg(z) 12484 return true 12485 } 12486 // match: (XOR (SRL y z) x) 12487 // cond: 12488 // result: (XORshiftRLreg x y z) 12489 for { 12490 v_0 := v.Args[0] 12491 if v_0.Op != OpARMSRL { 12492 break 12493 } 12494 y := v_0.Args[0] 12495 z := v_0.Args[1] 12496 x := v.Args[1] 12497 v.reset(OpARMXORshiftRLreg) 12498 v.AddArg(x) 12499 v.AddArg(y) 12500 v.AddArg(z) 12501 return true 12502 } 12503 // match: (XOR x (SRA y z)) 12504 // cond: 12505 // result: (XORshiftRAreg x y z) 12506 for { 12507 x := v.Args[0] 12508 v_1 := v.Args[1] 12509 if v_1.Op != OpARMSRA { 12510 break 12511 } 12512 y := v_1.Args[0] 12513 z := v_1.Args[1] 12514 v.reset(OpARMXORshiftRAreg) 12515 v.AddArg(x) 12516 v.AddArg(y) 12517 v.AddArg(z) 12518 return true 12519 } 12520 // match: (XOR (SRA y z) x) 12521 // cond: 12522 // result: (XORshiftRAreg x y z) 12523 for { 12524 v_0 := v.Args[0] 12525 if v_0.Op != OpARMSRA { 12526 break 12527 } 12528 y := v_0.Args[0] 12529 z := v_0.Args[1] 12530 x := v.Args[1] 12531 v.reset(OpARMXORshiftRAreg) 12532 v.AddArg(x) 12533 v.AddArg(y) 12534 v.AddArg(z) 12535 return true 12536 } 12537 // match: (XOR x x) 12538 // cond: 12539 // result: (MOVWconst [0]) 12540 for { 12541 x := v.Args[0] 12542 if x != v.Args[1] { 12543 break 12544 } 12545 v.reset(OpARMMOVWconst) 12546 v.AuxInt = 0 12547 return true 12548 } 12549 return false 12550 } 12551 func rewriteValueARM_OpARMXORconst(v *Value) bool { 12552 // match: (XORconst [0] x) 12553 // cond: 12554 // result: x 12555 for { 12556 if v.AuxInt != 0 { 12557 break 12558 } 12559 x := v.Args[0] 12560 v.reset(OpCopy) 12561 v.Type = x.Type 12562 v.AddArg(x) 12563 return true 12564 } 12565 // match: (XORconst [c] (MOVWconst [d])) 12566 // cond: 12567 // result: (MOVWconst [c^d]) 12568 for { 12569 c := v.AuxInt 12570 v_0 := v.Args[0] 12571 if v_0.Op != OpARMMOVWconst { 12572 break 12573 } 12574 d := v_0.AuxInt 12575 v.reset(OpARMMOVWconst) 12576 v.AuxInt = c ^ d 12577 return true 12578 } 12579 // match: (XORconst [c] (XORconst [d] x)) 12580 // cond: 12581 // result: (XORconst [c^d] x) 12582 for { 12583 c := v.AuxInt 12584 v_0 := v.Args[0] 12585 if v_0.Op != OpARMXORconst { 12586 break 12587 } 12588 d := v_0.AuxInt 12589 x := v_0.Args[0] 12590 v.reset(OpARMXORconst) 12591 v.AuxInt = c ^ d 12592 v.AddArg(x) 12593 return true 12594 } 12595 return false 12596 } 12597 func rewriteValueARM_OpARMXORshiftLL(v *Value) bool { 12598 b := v.Block 12599 _ = b 12600 // match: (XORshiftLL (MOVWconst [c]) x [d]) 12601 // cond: 12602 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 12603 for { 12604 d := v.AuxInt 12605 v_0 := v.Args[0] 12606 if v_0.Op != OpARMMOVWconst { 12607 break 12608 } 12609 c := v_0.AuxInt 12610 x := v.Args[1] 12611 v.reset(OpARMXORconst) 12612 v.AuxInt = c 12613 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12614 v0.AuxInt = d 12615 v0.AddArg(x) 12616 v.AddArg(v0) 12617 return true 12618 } 12619 // match: (XORshiftLL x (MOVWconst [c]) [d]) 12620 // cond: 12621 // result: (XORconst x [int64(uint32(c)<<uint64(d))]) 12622 for { 12623 d := v.AuxInt 12624 x := v.Args[0] 12625 v_1 := v.Args[1] 12626 if v_1.Op != OpARMMOVWconst { 12627 break 12628 } 12629 c := v_1.AuxInt 12630 v.reset(OpARMXORconst) 12631 v.AuxInt = int64(uint32(c) << uint64(d)) 12632 v.AddArg(x) 12633 return true 12634 } 12635 // match: (XORshiftLL [c] (SRLconst x [32-c]) x) 12636 // cond: 12637 // result: (SRRconst [32-c] x) 12638 for { 12639 c := v.AuxInt 12640 v_0 := v.Args[0] 12641 if v_0.Op != OpARMSRLconst { 12642 break 12643 } 12644 if v_0.AuxInt != 32-c { 12645 break 12646 } 12647 x := v_0.Args[0] 12648 if x != v.Args[1] { 12649 break 12650 } 12651 v.reset(OpARMSRRconst) 12652 v.AuxInt = 32 - c 12653 v.AddArg(x) 12654 return true 12655 } 12656 // match: (XORshiftLL x (SLLconst x [c]) [d]) 12657 // cond: c==d 12658 // result: (MOVWconst [0]) 12659 for { 12660 d := v.AuxInt 12661 x := v.Args[0] 12662 v_1 := v.Args[1] 12663 if v_1.Op != OpARMSLLconst { 12664 break 12665 } 12666 c := v_1.AuxInt 12667 if x != v_1.Args[0] { 12668 break 12669 } 12670 if !(c == d) { 12671 break 12672 } 12673 v.reset(OpARMMOVWconst) 12674 v.AuxInt = 0 12675 return true 12676 } 12677 return false 12678 } 12679 func rewriteValueARM_OpARMXORshiftLLreg(v *Value) bool { 12680 b := v.Block 12681 _ = b 12682 // match: (XORshiftLLreg (MOVWconst [c]) x y) 12683 // cond: 12684 // result: (XORconst [c] (SLL <x.Type> x y)) 12685 for { 12686 v_0 := v.Args[0] 12687 if v_0.Op != OpARMMOVWconst { 12688 break 12689 } 12690 c := v_0.AuxInt 12691 x := v.Args[1] 12692 y := v.Args[2] 12693 v.reset(OpARMXORconst) 12694 v.AuxInt = c 12695 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12696 v0.AddArg(x) 12697 v0.AddArg(y) 12698 v.AddArg(v0) 12699 return true 12700 } 12701 // match: (XORshiftLLreg x y (MOVWconst [c])) 12702 // cond: 12703 // result: (XORshiftLL x y [c]) 12704 for { 12705 x := v.Args[0] 12706 y := v.Args[1] 12707 v_2 := v.Args[2] 12708 if v_2.Op != OpARMMOVWconst { 12709 break 12710 } 12711 c := v_2.AuxInt 12712 v.reset(OpARMXORshiftLL) 12713 v.AuxInt = c 12714 v.AddArg(x) 12715 v.AddArg(y) 12716 return true 12717 } 12718 return false 12719 } 12720 func rewriteValueARM_OpARMXORshiftRA(v *Value) bool { 12721 b := v.Block 12722 _ = b 12723 // match: (XORshiftRA (MOVWconst [c]) x [d]) 12724 // cond: 12725 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 12726 for { 12727 d := v.AuxInt 12728 v_0 := v.Args[0] 12729 if v_0.Op != OpARMMOVWconst { 12730 break 12731 } 12732 c := v_0.AuxInt 12733 x := v.Args[1] 12734 v.reset(OpARMXORconst) 12735 v.AuxInt = c 12736 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12737 v0.AuxInt = d 12738 v0.AddArg(x) 12739 v.AddArg(v0) 12740 return true 12741 } 12742 // match: (XORshiftRA x (MOVWconst [c]) [d]) 12743 // cond: 12744 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 12745 for { 12746 d := v.AuxInt 12747 x := v.Args[0] 12748 v_1 := v.Args[1] 12749 if v_1.Op != OpARMMOVWconst { 12750 break 12751 } 12752 c := v_1.AuxInt 12753 v.reset(OpARMXORconst) 12754 v.AuxInt = int64(int32(c) >> uint64(d)) 12755 v.AddArg(x) 12756 return true 12757 } 12758 // match: (XORshiftRA x (SRAconst x [c]) [d]) 12759 // cond: c==d 12760 // result: (MOVWconst [0]) 12761 for { 12762 d := v.AuxInt 12763 x := v.Args[0] 12764 v_1 := v.Args[1] 12765 if v_1.Op != OpARMSRAconst { 12766 break 12767 } 12768 c := v_1.AuxInt 12769 if x != v_1.Args[0] { 12770 break 12771 } 12772 if !(c == d) { 12773 break 12774 } 12775 v.reset(OpARMMOVWconst) 12776 v.AuxInt = 0 12777 return true 12778 } 12779 return false 12780 } 12781 func rewriteValueARM_OpARMXORshiftRAreg(v *Value) bool { 12782 b := v.Block 12783 _ = b 12784 // match: (XORshiftRAreg (MOVWconst [c]) x y) 12785 // cond: 12786 // result: (XORconst [c] (SRA <x.Type> x y)) 12787 for { 12788 v_0 := v.Args[0] 12789 if v_0.Op != OpARMMOVWconst { 12790 break 12791 } 12792 c := v_0.AuxInt 12793 x := v.Args[1] 12794 y := v.Args[2] 12795 v.reset(OpARMXORconst) 12796 v.AuxInt = c 12797 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12798 v0.AddArg(x) 12799 v0.AddArg(y) 12800 v.AddArg(v0) 12801 return true 12802 } 12803 // match: (XORshiftRAreg x y (MOVWconst [c])) 12804 // cond: 12805 // result: (XORshiftRA x y [c]) 12806 for { 12807 x := v.Args[0] 12808 y := v.Args[1] 12809 v_2 := v.Args[2] 12810 if v_2.Op != OpARMMOVWconst { 12811 break 12812 } 12813 c := v_2.AuxInt 12814 v.reset(OpARMXORshiftRA) 12815 v.AuxInt = c 12816 v.AddArg(x) 12817 v.AddArg(y) 12818 return true 12819 } 12820 return false 12821 } 12822 func rewriteValueARM_OpARMXORshiftRL(v *Value) bool { 12823 b := v.Block 12824 _ = b 12825 // match: (XORshiftRL (MOVWconst [c]) x [d]) 12826 // cond: 12827 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 12828 for { 12829 d := v.AuxInt 12830 v_0 := v.Args[0] 12831 if v_0.Op != OpARMMOVWconst { 12832 break 12833 } 12834 c := v_0.AuxInt 12835 x := v.Args[1] 12836 v.reset(OpARMXORconst) 12837 v.AuxInt = c 12838 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12839 v0.AuxInt = d 12840 v0.AddArg(x) 12841 v.AddArg(v0) 12842 return true 12843 } 12844 // match: (XORshiftRL x (MOVWconst [c]) [d]) 12845 // cond: 12846 // result: (XORconst x [int64(uint32(c)>>uint64(d))]) 12847 for { 12848 d := v.AuxInt 12849 x := v.Args[0] 12850 v_1 := v.Args[1] 12851 if v_1.Op != OpARMMOVWconst { 12852 break 12853 } 12854 c := v_1.AuxInt 12855 v.reset(OpARMXORconst) 12856 v.AuxInt = int64(uint32(c) >> uint64(d)) 12857 v.AddArg(x) 12858 return true 12859 } 12860 // match: (XORshiftRL [c] (SLLconst x [32-c]) x) 12861 // cond: 12862 // result: (SRRconst [ c] x) 12863 for { 12864 c := v.AuxInt 12865 v_0 := v.Args[0] 12866 if v_0.Op != OpARMSLLconst { 12867 break 12868 } 12869 if v_0.AuxInt != 32-c { 12870 break 12871 } 12872 x := v_0.Args[0] 12873 if x != v.Args[1] { 12874 break 12875 } 12876 v.reset(OpARMSRRconst) 12877 v.AuxInt = c 12878 v.AddArg(x) 12879 return true 12880 } 12881 // match: (XORshiftRL x (SRLconst x [c]) [d]) 12882 // cond: c==d 12883 // result: (MOVWconst [0]) 12884 for { 12885 d := v.AuxInt 12886 x := v.Args[0] 12887 v_1 := v.Args[1] 12888 if v_1.Op != OpARMSRLconst { 12889 break 12890 } 12891 c := v_1.AuxInt 12892 if x != v_1.Args[0] { 12893 break 12894 } 12895 if !(c == d) { 12896 break 12897 } 12898 v.reset(OpARMMOVWconst) 12899 v.AuxInt = 0 12900 return true 12901 } 12902 return false 12903 } 12904 func rewriteValueARM_OpARMXORshiftRLreg(v *Value) bool { 12905 b := v.Block 12906 _ = b 12907 // match: (XORshiftRLreg (MOVWconst [c]) x y) 12908 // cond: 12909 // result: (XORconst [c] (SRL <x.Type> x y)) 12910 for { 12911 v_0 := v.Args[0] 12912 if v_0.Op != OpARMMOVWconst { 12913 break 12914 } 12915 c := v_0.AuxInt 12916 x := v.Args[1] 12917 y := v.Args[2] 12918 v.reset(OpARMXORconst) 12919 v.AuxInt = c 12920 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12921 v0.AddArg(x) 12922 v0.AddArg(y) 12923 v.AddArg(v0) 12924 return true 12925 } 12926 // match: (XORshiftRLreg x y (MOVWconst [c])) 12927 // cond: 12928 // result: (XORshiftRL x y [c]) 12929 for { 12930 x := v.Args[0] 12931 y := v.Args[1] 12932 v_2 := v.Args[2] 12933 if v_2.Op != OpARMMOVWconst { 12934 break 12935 } 12936 c := v_2.AuxInt 12937 v.reset(OpARMXORshiftRL) 12938 v.AuxInt = c 12939 v.AddArg(x) 12940 v.AddArg(y) 12941 return true 12942 } 12943 return false 12944 } 12945 func rewriteValueARM_OpARMXORshiftRR(v *Value) bool { 12946 b := v.Block 12947 _ = b 12948 // match: (XORshiftRR (MOVWconst [c]) x [d]) 12949 // cond: 12950 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 12951 for { 12952 d := v.AuxInt 12953 v_0 := v.Args[0] 12954 if v_0.Op != OpARMMOVWconst { 12955 break 12956 } 12957 c := v_0.AuxInt 12958 x := v.Args[1] 12959 v.reset(OpARMXORconst) 12960 v.AuxInt = c 12961 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 12962 v0.AuxInt = d 12963 v0.AddArg(x) 12964 v.AddArg(v0) 12965 return true 12966 } 12967 // match: (XORshiftRR x (MOVWconst [c]) [d]) 12968 // cond: 12969 // result: (XORconst x [int64(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 12970 for { 12971 d := v.AuxInt 12972 x := v.Args[0] 12973 v_1 := v.Args[1] 12974 if v_1.Op != OpARMMOVWconst { 12975 break 12976 } 12977 c := v_1.AuxInt 12978 v.reset(OpARMXORconst) 12979 v.AuxInt = int64(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)) 12980 v.AddArg(x) 12981 return true 12982 } 12983 return false 12984 } 12985 func rewriteValueARM_OpAdd16(v *Value) bool { 12986 // match: (Add16 x y) 12987 // cond: 12988 // result: (ADD x y) 12989 for { 12990 x := v.Args[0] 12991 y := v.Args[1] 12992 v.reset(OpARMADD) 12993 v.AddArg(x) 12994 v.AddArg(y) 12995 return true 12996 } 12997 } 12998 func rewriteValueARM_OpAdd32(v *Value) bool { 12999 // match: (Add32 x y) 13000 // cond: 13001 // result: (ADD x y) 13002 for { 13003 x := v.Args[0] 13004 y := v.Args[1] 13005 v.reset(OpARMADD) 13006 v.AddArg(x) 13007 v.AddArg(y) 13008 return true 13009 } 13010 } 13011 func rewriteValueARM_OpAdd32F(v *Value) bool { 13012 // match: (Add32F x y) 13013 // cond: 13014 // result: (ADDF x y) 13015 for { 13016 x := v.Args[0] 13017 y := v.Args[1] 13018 v.reset(OpARMADDF) 13019 v.AddArg(x) 13020 v.AddArg(y) 13021 return true 13022 } 13023 } 13024 func rewriteValueARM_OpAdd32carry(v *Value) bool { 13025 // match: (Add32carry x y) 13026 // cond: 13027 // result: (ADDS x y) 13028 for { 13029 x := v.Args[0] 13030 y := v.Args[1] 13031 v.reset(OpARMADDS) 13032 v.AddArg(x) 13033 v.AddArg(y) 13034 return true 13035 } 13036 } 13037 func rewriteValueARM_OpAdd32withcarry(v *Value) bool { 13038 // match: (Add32withcarry x y c) 13039 // cond: 13040 // result: (ADC x y c) 13041 for { 13042 x := v.Args[0] 13043 y := v.Args[1] 13044 c := v.Args[2] 13045 v.reset(OpARMADC) 13046 v.AddArg(x) 13047 v.AddArg(y) 13048 v.AddArg(c) 13049 return true 13050 } 13051 } 13052 func rewriteValueARM_OpAdd64F(v *Value) bool { 13053 // match: (Add64F x y) 13054 // cond: 13055 // result: (ADDD x y) 13056 for { 13057 x := v.Args[0] 13058 y := v.Args[1] 13059 v.reset(OpARMADDD) 13060 v.AddArg(x) 13061 v.AddArg(y) 13062 return true 13063 } 13064 } 13065 func rewriteValueARM_OpAdd8(v *Value) bool { 13066 // match: (Add8 x y) 13067 // cond: 13068 // result: (ADD x y) 13069 for { 13070 x := v.Args[0] 13071 y := v.Args[1] 13072 v.reset(OpARMADD) 13073 v.AddArg(x) 13074 v.AddArg(y) 13075 return true 13076 } 13077 } 13078 func rewriteValueARM_OpAddPtr(v *Value) bool { 13079 // match: (AddPtr x y) 13080 // cond: 13081 // result: (ADD x y) 13082 for { 13083 x := v.Args[0] 13084 y := v.Args[1] 13085 v.reset(OpARMADD) 13086 v.AddArg(x) 13087 v.AddArg(y) 13088 return true 13089 } 13090 } 13091 func rewriteValueARM_OpAddr(v *Value) bool { 13092 // match: (Addr {sym} base) 13093 // cond: 13094 // result: (MOVWaddr {sym} base) 13095 for { 13096 sym := v.Aux 13097 base := v.Args[0] 13098 v.reset(OpARMMOVWaddr) 13099 v.Aux = sym 13100 v.AddArg(base) 13101 return true 13102 } 13103 } 13104 func rewriteValueARM_OpAnd16(v *Value) bool { 13105 // match: (And16 x y) 13106 // cond: 13107 // result: (AND x y) 13108 for { 13109 x := v.Args[0] 13110 y := v.Args[1] 13111 v.reset(OpARMAND) 13112 v.AddArg(x) 13113 v.AddArg(y) 13114 return true 13115 } 13116 } 13117 func rewriteValueARM_OpAnd32(v *Value) bool { 13118 // match: (And32 x y) 13119 // cond: 13120 // result: (AND x y) 13121 for { 13122 x := v.Args[0] 13123 y := v.Args[1] 13124 v.reset(OpARMAND) 13125 v.AddArg(x) 13126 v.AddArg(y) 13127 return true 13128 } 13129 } 13130 func rewriteValueARM_OpAnd8(v *Value) bool { 13131 // match: (And8 x y) 13132 // cond: 13133 // result: (AND x y) 13134 for { 13135 x := v.Args[0] 13136 y := v.Args[1] 13137 v.reset(OpARMAND) 13138 v.AddArg(x) 13139 v.AddArg(y) 13140 return true 13141 } 13142 } 13143 func rewriteValueARM_OpAndB(v *Value) bool { 13144 // match: (AndB x y) 13145 // cond: 13146 // result: (AND x y) 13147 for { 13148 x := v.Args[0] 13149 y := v.Args[1] 13150 v.reset(OpARMAND) 13151 v.AddArg(x) 13152 v.AddArg(y) 13153 return true 13154 } 13155 } 13156 func rewriteValueARM_OpAvg32u(v *Value) bool { 13157 b := v.Block 13158 _ = b 13159 // match: (Avg32u <t> x y) 13160 // cond: 13161 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 13162 for { 13163 t := v.Type 13164 x := v.Args[0] 13165 y := v.Args[1] 13166 v.reset(OpARMADD) 13167 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13168 v0.AuxInt = 1 13169 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 13170 v1.AddArg(x) 13171 v1.AddArg(y) 13172 v0.AddArg(v1) 13173 v.AddArg(v0) 13174 v.AddArg(y) 13175 return true 13176 } 13177 } 13178 func rewriteValueARM_OpBitLen32(v *Value) bool { 13179 b := v.Block 13180 _ = b 13181 // match: (BitLen32 <t> x) 13182 // cond: 13183 // result: (RSBconst [32] (CLZ <t> x)) 13184 for { 13185 t := v.Type 13186 x := v.Args[0] 13187 v.reset(OpARMRSBconst) 13188 v.AuxInt = 32 13189 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13190 v0.AddArg(x) 13191 v.AddArg(v0) 13192 return true 13193 } 13194 } 13195 func rewriteValueARM_OpBswap32(v *Value) bool { 13196 b := v.Block 13197 _ = b 13198 // match: (Bswap32 <t> x) 13199 // cond: obj.GOARM==5 13200 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 13201 for { 13202 t := v.Type 13203 x := v.Args[0] 13204 if !(obj.GOARM == 5) { 13205 break 13206 } 13207 v.reset(OpARMXOR) 13208 v.Type = t 13209 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13210 v0.AuxInt = 8 13211 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 13212 v1.AuxInt = 0xff0000 13213 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 13214 v2.AddArg(x) 13215 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13216 v3.AuxInt = 16 13217 v3.AddArg(x) 13218 v2.AddArg(v3) 13219 v1.AddArg(v2) 13220 v0.AddArg(v1) 13221 v.AddArg(v0) 13222 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13223 v4.AuxInt = 8 13224 v4.AddArg(x) 13225 v.AddArg(v4) 13226 return true 13227 } 13228 // match: (Bswap32 x) 13229 // cond: obj.GOARM>=6 13230 // result: (REV x) 13231 for { 13232 x := v.Args[0] 13233 if !(obj.GOARM >= 6) { 13234 break 13235 } 13236 v.reset(OpARMREV) 13237 v.AddArg(x) 13238 return true 13239 } 13240 return false 13241 } 13242 func rewriteValueARM_OpClosureCall(v *Value) bool { 13243 // match: (ClosureCall [argwid] entry closure mem) 13244 // cond: 13245 // result: (CALLclosure [argwid] entry closure mem) 13246 for { 13247 argwid := v.AuxInt 13248 entry := v.Args[0] 13249 closure := v.Args[1] 13250 mem := v.Args[2] 13251 v.reset(OpARMCALLclosure) 13252 v.AuxInt = argwid 13253 v.AddArg(entry) 13254 v.AddArg(closure) 13255 v.AddArg(mem) 13256 return true 13257 } 13258 } 13259 func rewriteValueARM_OpCom16(v *Value) bool { 13260 // match: (Com16 x) 13261 // cond: 13262 // result: (MVN x) 13263 for { 13264 x := v.Args[0] 13265 v.reset(OpARMMVN) 13266 v.AddArg(x) 13267 return true 13268 } 13269 } 13270 func rewriteValueARM_OpCom32(v *Value) bool { 13271 // match: (Com32 x) 13272 // cond: 13273 // result: (MVN x) 13274 for { 13275 x := v.Args[0] 13276 v.reset(OpARMMVN) 13277 v.AddArg(x) 13278 return true 13279 } 13280 } 13281 func rewriteValueARM_OpCom8(v *Value) bool { 13282 // match: (Com8 x) 13283 // cond: 13284 // result: (MVN x) 13285 for { 13286 x := v.Args[0] 13287 v.reset(OpARMMVN) 13288 v.AddArg(x) 13289 return true 13290 } 13291 } 13292 func rewriteValueARM_OpConst16(v *Value) bool { 13293 // match: (Const16 [val]) 13294 // cond: 13295 // result: (MOVWconst [val]) 13296 for { 13297 val := v.AuxInt 13298 v.reset(OpARMMOVWconst) 13299 v.AuxInt = val 13300 return true 13301 } 13302 } 13303 func rewriteValueARM_OpConst32(v *Value) bool { 13304 // match: (Const32 [val]) 13305 // cond: 13306 // result: (MOVWconst [val]) 13307 for { 13308 val := v.AuxInt 13309 v.reset(OpARMMOVWconst) 13310 v.AuxInt = val 13311 return true 13312 } 13313 } 13314 func rewriteValueARM_OpConst32F(v *Value) bool { 13315 // match: (Const32F [val]) 13316 // cond: 13317 // result: (MOVFconst [val]) 13318 for { 13319 val := v.AuxInt 13320 v.reset(OpARMMOVFconst) 13321 v.AuxInt = val 13322 return true 13323 } 13324 } 13325 func rewriteValueARM_OpConst64F(v *Value) bool { 13326 // match: (Const64F [val]) 13327 // cond: 13328 // result: (MOVDconst [val]) 13329 for { 13330 val := v.AuxInt 13331 v.reset(OpARMMOVDconst) 13332 v.AuxInt = val 13333 return true 13334 } 13335 } 13336 func rewriteValueARM_OpConst8(v *Value) bool { 13337 // match: (Const8 [val]) 13338 // cond: 13339 // result: (MOVWconst [val]) 13340 for { 13341 val := v.AuxInt 13342 v.reset(OpARMMOVWconst) 13343 v.AuxInt = val 13344 return true 13345 } 13346 } 13347 func rewriteValueARM_OpConstBool(v *Value) bool { 13348 // match: (ConstBool [b]) 13349 // cond: 13350 // result: (MOVWconst [b]) 13351 for { 13352 b := v.AuxInt 13353 v.reset(OpARMMOVWconst) 13354 v.AuxInt = b 13355 return true 13356 } 13357 } 13358 func rewriteValueARM_OpConstNil(v *Value) bool { 13359 // match: (ConstNil) 13360 // cond: 13361 // result: (MOVWconst [0]) 13362 for { 13363 v.reset(OpARMMOVWconst) 13364 v.AuxInt = 0 13365 return true 13366 } 13367 } 13368 func rewriteValueARM_OpConvert(v *Value) bool { 13369 // match: (Convert x mem) 13370 // cond: 13371 // result: (MOVWconvert x mem) 13372 for { 13373 x := v.Args[0] 13374 mem := v.Args[1] 13375 v.reset(OpARMMOVWconvert) 13376 v.AddArg(x) 13377 v.AddArg(mem) 13378 return true 13379 } 13380 } 13381 func rewriteValueARM_OpCtz32(v *Value) bool { 13382 b := v.Block 13383 _ = b 13384 // match: (Ctz32 <t> x) 13385 // cond: obj.GOARM<=6 13386 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 13387 for { 13388 t := v.Type 13389 x := v.Args[0] 13390 if !(obj.GOARM <= 6) { 13391 break 13392 } 13393 v.reset(OpARMRSBconst) 13394 v.AuxInt = 32 13395 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13396 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 13397 v1.AuxInt = 1 13398 v2 := b.NewValue0(v.Pos, OpARMAND, t) 13399 v2.AddArg(x) 13400 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 13401 v3.AuxInt = 0 13402 v3.AddArg(x) 13403 v2.AddArg(v3) 13404 v1.AddArg(v2) 13405 v0.AddArg(v1) 13406 v.AddArg(v0) 13407 return true 13408 } 13409 // match: (Ctz32 <t> x) 13410 // cond: obj.GOARM==7 13411 // result: (CLZ <t> (RBIT <t> x)) 13412 for { 13413 t := v.Type 13414 x := v.Args[0] 13415 if !(obj.GOARM == 7) { 13416 break 13417 } 13418 v.reset(OpARMCLZ) 13419 v.Type = t 13420 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 13421 v0.AddArg(x) 13422 v.AddArg(v0) 13423 return true 13424 } 13425 return false 13426 } 13427 func rewriteValueARM_OpCvt32Fto32(v *Value) bool { 13428 // match: (Cvt32Fto32 x) 13429 // cond: 13430 // result: (MOVFW x) 13431 for { 13432 x := v.Args[0] 13433 v.reset(OpARMMOVFW) 13434 v.AddArg(x) 13435 return true 13436 } 13437 } 13438 func rewriteValueARM_OpCvt32Fto32U(v *Value) bool { 13439 // match: (Cvt32Fto32U x) 13440 // cond: 13441 // result: (MOVFWU x) 13442 for { 13443 x := v.Args[0] 13444 v.reset(OpARMMOVFWU) 13445 v.AddArg(x) 13446 return true 13447 } 13448 } 13449 func rewriteValueARM_OpCvt32Fto64F(v *Value) bool { 13450 // match: (Cvt32Fto64F x) 13451 // cond: 13452 // result: (MOVFD x) 13453 for { 13454 x := v.Args[0] 13455 v.reset(OpARMMOVFD) 13456 v.AddArg(x) 13457 return true 13458 } 13459 } 13460 func rewriteValueARM_OpCvt32Uto32F(v *Value) bool { 13461 // match: (Cvt32Uto32F x) 13462 // cond: 13463 // result: (MOVWUF x) 13464 for { 13465 x := v.Args[0] 13466 v.reset(OpARMMOVWUF) 13467 v.AddArg(x) 13468 return true 13469 } 13470 } 13471 func rewriteValueARM_OpCvt32Uto64F(v *Value) bool { 13472 // match: (Cvt32Uto64F x) 13473 // cond: 13474 // result: (MOVWUD x) 13475 for { 13476 x := v.Args[0] 13477 v.reset(OpARMMOVWUD) 13478 v.AddArg(x) 13479 return true 13480 } 13481 } 13482 func rewriteValueARM_OpCvt32to32F(v *Value) bool { 13483 // match: (Cvt32to32F x) 13484 // cond: 13485 // result: (MOVWF x) 13486 for { 13487 x := v.Args[0] 13488 v.reset(OpARMMOVWF) 13489 v.AddArg(x) 13490 return true 13491 } 13492 } 13493 func rewriteValueARM_OpCvt32to64F(v *Value) bool { 13494 // match: (Cvt32to64F x) 13495 // cond: 13496 // result: (MOVWD x) 13497 for { 13498 x := v.Args[0] 13499 v.reset(OpARMMOVWD) 13500 v.AddArg(x) 13501 return true 13502 } 13503 } 13504 func rewriteValueARM_OpCvt64Fto32(v *Value) bool { 13505 // match: (Cvt64Fto32 x) 13506 // cond: 13507 // result: (MOVDW x) 13508 for { 13509 x := v.Args[0] 13510 v.reset(OpARMMOVDW) 13511 v.AddArg(x) 13512 return true 13513 } 13514 } 13515 func rewriteValueARM_OpCvt64Fto32F(v *Value) bool { 13516 // match: (Cvt64Fto32F x) 13517 // cond: 13518 // result: (MOVDF x) 13519 for { 13520 x := v.Args[0] 13521 v.reset(OpARMMOVDF) 13522 v.AddArg(x) 13523 return true 13524 } 13525 } 13526 func rewriteValueARM_OpCvt64Fto32U(v *Value) bool { 13527 // match: (Cvt64Fto32U x) 13528 // cond: 13529 // result: (MOVDWU x) 13530 for { 13531 x := v.Args[0] 13532 v.reset(OpARMMOVDWU) 13533 v.AddArg(x) 13534 return true 13535 } 13536 } 13537 func rewriteValueARM_OpDiv16(v *Value) bool { 13538 b := v.Block 13539 _ = b 13540 types := &b.Func.Config.Types 13541 _ = types 13542 // match: (Div16 x y) 13543 // cond: 13544 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 13545 for { 13546 x := v.Args[0] 13547 y := v.Args[1] 13548 v.reset(OpDiv32) 13549 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 13550 v0.AddArg(x) 13551 v.AddArg(v0) 13552 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 13553 v1.AddArg(y) 13554 v.AddArg(v1) 13555 return true 13556 } 13557 } 13558 func rewriteValueARM_OpDiv16u(v *Value) bool { 13559 b := v.Block 13560 _ = b 13561 types := &b.Func.Config.Types 13562 _ = types 13563 // match: (Div16u x y) 13564 // cond: 13565 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 13566 for { 13567 x := v.Args[0] 13568 y := v.Args[1] 13569 v.reset(OpDiv32u) 13570 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13571 v0.AddArg(x) 13572 v.AddArg(v0) 13573 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13574 v1.AddArg(y) 13575 v.AddArg(v1) 13576 return true 13577 } 13578 } 13579 func rewriteValueARM_OpDiv32(v *Value) bool { 13580 b := v.Block 13581 _ = b 13582 config := b.Func.Config 13583 _ = config 13584 types := &b.Func.Config.Types 13585 _ = types 13586 // match: (Div32 x y) 13587 // cond: 13588 // result: (SUB (XOR <types.UInt32> (Select0 <types.UInt32> (CALLudiv {config.ctxt.Lookup("udiv", 0)} (SUB <types.UInt32> (XOR x <types.UInt32> (Signmask x)) (Signmask x)) (SUB <types.UInt32> (XOR y <types.UInt32> (Signmask y)) (Signmask y)))) (Signmask (XOR <types.UInt32> x y))) (Signmask (XOR <types.UInt32> x y))) 13589 for { 13590 x := v.Args[0] 13591 y := v.Args[1] 13592 v.reset(OpARMSUB) 13593 v0 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13594 v1 := b.NewValue0(v.Pos, OpSelect0, types.UInt32) 13595 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, MakeTuple(types.UInt32, types.UInt32)) 13596 v2.Aux = config.ctxt.Lookup("udiv", 0) 13597 v3 := b.NewValue0(v.Pos, OpARMSUB, types.UInt32) 13598 v4 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13599 v4.AddArg(x) 13600 v5 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13601 v5.AddArg(x) 13602 v4.AddArg(v5) 13603 v3.AddArg(v4) 13604 v6 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13605 v6.AddArg(x) 13606 v3.AddArg(v6) 13607 v2.AddArg(v3) 13608 v7 := b.NewValue0(v.Pos, OpARMSUB, types.UInt32) 13609 v8 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13610 v8.AddArg(y) 13611 v9 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13612 v9.AddArg(y) 13613 v8.AddArg(v9) 13614 v7.AddArg(v8) 13615 v10 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13616 v10.AddArg(y) 13617 v7.AddArg(v10) 13618 v2.AddArg(v7) 13619 v1.AddArg(v2) 13620 v0.AddArg(v1) 13621 v11 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13622 v12 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13623 v12.AddArg(x) 13624 v12.AddArg(y) 13625 v11.AddArg(v12) 13626 v0.AddArg(v11) 13627 v.AddArg(v0) 13628 v13 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13629 v14 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13630 v14.AddArg(x) 13631 v14.AddArg(y) 13632 v13.AddArg(v14) 13633 v.AddArg(v13) 13634 return true 13635 } 13636 } 13637 func rewriteValueARM_OpDiv32F(v *Value) bool { 13638 // match: (Div32F x y) 13639 // cond: 13640 // result: (DIVF x y) 13641 for { 13642 x := v.Args[0] 13643 y := v.Args[1] 13644 v.reset(OpARMDIVF) 13645 v.AddArg(x) 13646 v.AddArg(y) 13647 return true 13648 } 13649 } 13650 func rewriteValueARM_OpDiv32u(v *Value) bool { 13651 b := v.Block 13652 _ = b 13653 config := b.Func.Config 13654 _ = config 13655 types := &b.Func.Config.Types 13656 _ = types 13657 // match: (Div32u x y) 13658 // cond: 13659 // result: (Select0 <types.UInt32> (CALLudiv {config.ctxt.Lookup("udiv", 0)} x y)) 13660 for { 13661 x := v.Args[0] 13662 y := v.Args[1] 13663 v.reset(OpSelect0) 13664 v.Type = types.UInt32 13665 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, MakeTuple(types.UInt32, types.UInt32)) 13666 v0.Aux = config.ctxt.Lookup("udiv", 0) 13667 v0.AddArg(x) 13668 v0.AddArg(y) 13669 v.AddArg(v0) 13670 return true 13671 } 13672 } 13673 func rewriteValueARM_OpDiv64F(v *Value) bool { 13674 // match: (Div64F x y) 13675 // cond: 13676 // result: (DIVD x y) 13677 for { 13678 x := v.Args[0] 13679 y := v.Args[1] 13680 v.reset(OpARMDIVD) 13681 v.AddArg(x) 13682 v.AddArg(y) 13683 return true 13684 } 13685 } 13686 func rewriteValueARM_OpDiv8(v *Value) bool { 13687 b := v.Block 13688 _ = b 13689 types := &b.Func.Config.Types 13690 _ = types 13691 // match: (Div8 x y) 13692 // cond: 13693 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 13694 for { 13695 x := v.Args[0] 13696 y := v.Args[1] 13697 v.reset(OpDiv32) 13698 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 13699 v0.AddArg(x) 13700 v.AddArg(v0) 13701 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 13702 v1.AddArg(y) 13703 v.AddArg(v1) 13704 return true 13705 } 13706 } 13707 func rewriteValueARM_OpDiv8u(v *Value) bool { 13708 b := v.Block 13709 _ = b 13710 types := &b.Func.Config.Types 13711 _ = types 13712 // match: (Div8u x y) 13713 // cond: 13714 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 13715 for { 13716 x := v.Args[0] 13717 y := v.Args[1] 13718 v.reset(OpDiv32u) 13719 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13720 v0.AddArg(x) 13721 v.AddArg(v0) 13722 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13723 v1.AddArg(y) 13724 v.AddArg(v1) 13725 return true 13726 } 13727 } 13728 func rewriteValueARM_OpEq16(v *Value) bool { 13729 b := v.Block 13730 _ = b 13731 types := &b.Func.Config.Types 13732 _ = types 13733 // match: (Eq16 x y) 13734 // cond: 13735 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13736 for { 13737 x := v.Args[0] 13738 y := v.Args[1] 13739 v.reset(OpARMEqual) 13740 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13741 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13742 v1.AddArg(x) 13743 v0.AddArg(v1) 13744 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13745 v2.AddArg(y) 13746 v0.AddArg(v2) 13747 v.AddArg(v0) 13748 return true 13749 } 13750 } 13751 func rewriteValueARM_OpEq32(v *Value) bool { 13752 b := v.Block 13753 _ = b 13754 // match: (Eq32 x y) 13755 // cond: 13756 // result: (Equal (CMP x y)) 13757 for { 13758 x := v.Args[0] 13759 y := v.Args[1] 13760 v.reset(OpARMEqual) 13761 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13762 v0.AddArg(x) 13763 v0.AddArg(y) 13764 v.AddArg(v0) 13765 return true 13766 } 13767 } 13768 func rewriteValueARM_OpEq32F(v *Value) bool { 13769 b := v.Block 13770 _ = b 13771 // match: (Eq32F x y) 13772 // cond: 13773 // result: (Equal (CMPF x y)) 13774 for { 13775 x := v.Args[0] 13776 y := v.Args[1] 13777 v.reset(OpARMEqual) 13778 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 13779 v0.AddArg(x) 13780 v0.AddArg(y) 13781 v.AddArg(v0) 13782 return true 13783 } 13784 } 13785 func rewriteValueARM_OpEq64F(v *Value) bool { 13786 b := v.Block 13787 _ = b 13788 // match: (Eq64F x y) 13789 // cond: 13790 // result: (Equal (CMPD x y)) 13791 for { 13792 x := v.Args[0] 13793 y := v.Args[1] 13794 v.reset(OpARMEqual) 13795 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 13796 v0.AddArg(x) 13797 v0.AddArg(y) 13798 v.AddArg(v0) 13799 return true 13800 } 13801 } 13802 func rewriteValueARM_OpEq8(v *Value) bool { 13803 b := v.Block 13804 _ = b 13805 types := &b.Func.Config.Types 13806 _ = types 13807 // match: (Eq8 x y) 13808 // cond: 13809 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13810 for { 13811 x := v.Args[0] 13812 y := v.Args[1] 13813 v.reset(OpARMEqual) 13814 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13815 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13816 v1.AddArg(x) 13817 v0.AddArg(v1) 13818 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13819 v2.AddArg(y) 13820 v0.AddArg(v2) 13821 v.AddArg(v0) 13822 return true 13823 } 13824 } 13825 func rewriteValueARM_OpEqB(v *Value) bool { 13826 b := v.Block 13827 _ = b 13828 types := &b.Func.Config.Types 13829 _ = types 13830 // match: (EqB x y) 13831 // cond: 13832 // result: (XORconst [1] (XOR <types.Bool> x y)) 13833 for { 13834 x := v.Args[0] 13835 y := v.Args[1] 13836 v.reset(OpARMXORconst) 13837 v.AuxInt = 1 13838 v0 := b.NewValue0(v.Pos, OpARMXOR, types.Bool) 13839 v0.AddArg(x) 13840 v0.AddArg(y) 13841 v.AddArg(v0) 13842 return true 13843 } 13844 } 13845 func rewriteValueARM_OpEqPtr(v *Value) bool { 13846 b := v.Block 13847 _ = b 13848 // match: (EqPtr x y) 13849 // cond: 13850 // result: (Equal (CMP x y)) 13851 for { 13852 x := v.Args[0] 13853 y := v.Args[1] 13854 v.reset(OpARMEqual) 13855 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13856 v0.AddArg(x) 13857 v0.AddArg(y) 13858 v.AddArg(v0) 13859 return true 13860 } 13861 } 13862 func rewriteValueARM_OpGeq16(v *Value) bool { 13863 b := v.Block 13864 _ = b 13865 types := &b.Func.Config.Types 13866 _ = types 13867 // match: (Geq16 x y) 13868 // cond: 13869 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 13870 for { 13871 x := v.Args[0] 13872 y := v.Args[1] 13873 v.reset(OpARMGreaterEqual) 13874 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13875 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 13876 v1.AddArg(x) 13877 v0.AddArg(v1) 13878 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 13879 v2.AddArg(y) 13880 v0.AddArg(v2) 13881 v.AddArg(v0) 13882 return true 13883 } 13884 } 13885 func rewriteValueARM_OpGeq16U(v *Value) bool { 13886 b := v.Block 13887 _ = b 13888 types := &b.Func.Config.Types 13889 _ = types 13890 // match: (Geq16U x y) 13891 // cond: 13892 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13893 for { 13894 x := v.Args[0] 13895 y := v.Args[1] 13896 v.reset(OpARMGreaterEqualU) 13897 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13898 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13899 v1.AddArg(x) 13900 v0.AddArg(v1) 13901 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13902 v2.AddArg(y) 13903 v0.AddArg(v2) 13904 v.AddArg(v0) 13905 return true 13906 } 13907 } 13908 func rewriteValueARM_OpGeq32(v *Value) bool { 13909 b := v.Block 13910 _ = b 13911 // match: (Geq32 x y) 13912 // cond: 13913 // result: (GreaterEqual (CMP x y)) 13914 for { 13915 x := v.Args[0] 13916 y := v.Args[1] 13917 v.reset(OpARMGreaterEqual) 13918 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13919 v0.AddArg(x) 13920 v0.AddArg(y) 13921 v.AddArg(v0) 13922 return true 13923 } 13924 } 13925 func rewriteValueARM_OpGeq32F(v *Value) bool { 13926 b := v.Block 13927 _ = b 13928 // match: (Geq32F x y) 13929 // cond: 13930 // result: (GreaterEqual (CMPF x y)) 13931 for { 13932 x := v.Args[0] 13933 y := v.Args[1] 13934 v.reset(OpARMGreaterEqual) 13935 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 13936 v0.AddArg(x) 13937 v0.AddArg(y) 13938 v.AddArg(v0) 13939 return true 13940 } 13941 } 13942 func rewriteValueARM_OpGeq32U(v *Value) bool { 13943 b := v.Block 13944 _ = b 13945 // match: (Geq32U x y) 13946 // cond: 13947 // result: (GreaterEqualU (CMP x y)) 13948 for { 13949 x := v.Args[0] 13950 y := v.Args[1] 13951 v.reset(OpARMGreaterEqualU) 13952 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13953 v0.AddArg(x) 13954 v0.AddArg(y) 13955 v.AddArg(v0) 13956 return true 13957 } 13958 } 13959 func rewriteValueARM_OpGeq64F(v *Value) bool { 13960 b := v.Block 13961 _ = b 13962 // match: (Geq64F x y) 13963 // cond: 13964 // result: (GreaterEqual (CMPD x y)) 13965 for { 13966 x := v.Args[0] 13967 y := v.Args[1] 13968 v.reset(OpARMGreaterEqual) 13969 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 13970 v0.AddArg(x) 13971 v0.AddArg(y) 13972 v.AddArg(v0) 13973 return true 13974 } 13975 } 13976 func rewriteValueARM_OpGeq8(v *Value) bool { 13977 b := v.Block 13978 _ = b 13979 types := &b.Func.Config.Types 13980 _ = types 13981 // match: (Geq8 x y) 13982 // cond: 13983 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 13984 for { 13985 x := v.Args[0] 13986 y := v.Args[1] 13987 v.reset(OpARMGreaterEqual) 13988 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13989 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 13990 v1.AddArg(x) 13991 v0.AddArg(v1) 13992 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 13993 v2.AddArg(y) 13994 v0.AddArg(v2) 13995 v.AddArg(v0) 13996 return true 13997 } 13998 } 13999 func rewriteValueARM_OpGeq8U(v *Value) bool { 14000 b := v.Block 14001 _ = b 14002 types := &b.Func.Config.Types 14003 _ = types 14004 // match: (Geq8U x y) 14005 // cond: 14006 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14007 for { 14008 x := v.Args[0] 14009 y := v.Args[1] 14010 v.reset(OpARMGreaterEqualU) 14011 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14012 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14013 v1.AddArg(x) 14014 v0.AddArg(v1) 14015 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14016 v2.AddArg(y) 14017 v0.AddArg(v2) 14018 v.AddArg(v0) 14019 return true 14020 } 14021 } 14022 func rewriteValueARM_OpGetClosurePtr(v *Value) bool { 14023 // match: (GetClosurePtr) 14024 // cond: 14025 // result: (LoweredGetClosurePtr) 14026 for { 14027 v.reset(OpARMLoweredGetClosurePtr) 14028 return true 14029 } 14030 } 14031 func rewriteValueARM_OpGreater16(v *Value) bool { 14032 b := v.Block 14033 _ = b 14034 types := &b.Func.Config.Types 14035 _ = types 14036 // match: (Greater16 x y) 14037 // cond: 14038 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 14039 for { 14040 x := v.Args[0] 14041 y := v.Args[1] 14042 v.reset(OpARMGreaterThan) 14043 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14044 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14045 v1.AddArg(x) 14046 v0.AddArg(v1) 14047 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14048 v2.AddArg(y) 14049 v0.AddArg(v2) 14050 v.AddArg(v0) 14051 return true 14052 } 14053 } 14054 func rewriteValueARM_OpGreater16U(v *Value) bool { 14055 b := v.Block 14056 _ = b 14057 types := &b.Func.Config.Types 14058 _ = types 14059 // match: (Greater16U x y) 14060 // cond: 14061 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14062 for { 14063 x := v.Args[0] 14064 y := v.Args[1] 14065 v.reset(OpARMGreaterThanU) 14066 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14067 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14068 v1.AddArg(x) 14069 v0.AddArg(v1) 14070 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14071 v2.AddArg(y) 14072 v0.AddArg(v2) 14073 v.AddArg(v0) 14074 return true 14075 } 14076 } 14077 func rewriteValueARM_OpGreater32(v *Value) bool { 14078 b := v.Block 14079 _ = b 14080 // match: (Greater32 x y) 14081 // cond: 14082 // result: (GreaterThan (CMP x y)) 14083 for { 14084 x := v.Args[0] 14085 y := v.Args[1] 14086 v.reset(OpARMGreaterThan) 14087 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14088 v0.AddArg(x) 14089 v0.AddArg(y) 14090 v.AddArg(v0) 14091 return true 14092 } 14093 } 14094 func rewriteValueARM_OpGreater32F(v *Value) bool { 14095 b := v.Block 14096 _ = b 14097 // match: (Greater32F x y) 14098 // cond: 14099 // result: (GreaterThan (CMPF x y)) 14100 for { 14101 x := v.Args[0] 14102 y := v.Args[1] 14103 v.reset(OpARMGreaterThan) 14104 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 14105 v0.AddArg(x) 14106 v0.AddArg(y) 14107 v.AddArg(v0) 14108 return true 14109 } 14110 } 14111 func rewriteValueARM_OpGreater32U(v *Value) bool { 14112 b := v.Block 14113 _ = b 14114 // match: (Greater32U x y) 14115 // cond: 14116 // result: (GreaterThanU (CMP x y)) 14117 for { 14118 x := v.Args[0] 14119 y := v.Args[1] 14120 v.reset(OpARMGreaterThanU) 14121 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14122 v0.AddArg(x) 14123 v0.AddArg(y) 14124 v.AddArg(v0) 14125 return true 14126 } 14127 } 14128 func rewriteValueARM_OpGreater64F(v *Value) bool { 14129 b := v.Block 14130 _ = b 14131 // match: (Greater64F x y) 14132 // cond: 14133 // result: (GreaterThan (CMPD x y)) 14134 for { 14135 x := v.Args[0] 14136 y := v.Args[1] 14137 v.reset(OpARMGreaterThan) 14138 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14139 v0.AddArg(x) 14140 v0.AddArg(y) 14141 v.AddArg(v0) 14142 return true 14143 } 14144 } 14145 func rewriteValueARM_OpGreater8(v *Value) bool { 14146 b := v.Block 14147 _ = b 14148 types := &b.Func.Config.Types 14149 _ = types 14150 // match: (Greater8 x y) 14151 // cond: 14152 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 14153 for { 14154 x := v.Args[0] 14155 y := v.Args[1] 14156 v.reset(OpARMGreaterThan) 14157 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14158 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14159 v1.AddArg(x) 14160 v0.AddArg(v1) 14161 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14162 v2.AddArg(y) 14163 v0.AddArg(v2) 14164 v.AddArg(v0) 14165 return true 14166 } 14167 } 14168 func rewriteValueARM_OpGreater8U(v *Value) bool { 14169 b := v.Block 14170 _ = b 14171 types := &b.Func.Config.Types 14172 _ = types 14173 // match: (Greater8U x y) 14174 // cond: 14175 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14176 for { 14177 x := v.Args[0] 14178 y := v.Args[1] 14179 v.reset(OpARMGreaterThanU) 14180 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14181 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14182 v1.AddArg(x) 14183 v0.AddArg(v1) 14184 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14185 v2.AddArg(y) 14186 v0.AddArg(v2) 14187 v.AddArg(v0) 14188 return true 14189 } 14190 } 14191 func rewriteValueARM_OpHmul32(v *Value) bool { 14192 // match: (Hmul32 x y) 14193 // cond: 14194 // result: (HMUL x y) 14195 for { 14196 x := v.Args[0] 14197 y := v.Args[1] 14198 v.reset(OpARMHMUL) 14199 v.AddArg(x) 14200 v.AddArg(y) 14201 return true 14202 } 14203 } 14204 func rewriteValueARM_OpHmul32u(v *Value) bool { 14205 // match: (Hmul32u x y) 14206 // cond: 14207 // result: (HMULU x y) 14208 for { 14209 x := v.Args[0] 14210 y := v.Args[1] 14211 v.reset(OpARMHMULU) 14212 v.AddArg(x) 14213 v.AddArg(y) 14214 return true 14215 } 14216 } 14217 func rewriteValueARM_OpInterCall(v *Value) bool { 14218 // match: (InterCall [argwid] entry mem) 14219 // cond: 14220 // result: (CALLinter [argwid] entry mem) 14221 for { 14222 argwid := v.AuxInt 14223 entry := v.Args[0] 14224 mem := v.Args[1] 14225 v.reset(OpARMCALLinter) 14226 v.AuxInt = argwid 14227 v.AddArg(entry) 14228 v.AddArg(mem) 14229 return true 14230 } 14231 } 14232 func rewriteValueARM_OpIsInBounds(v *Value) bool { 14233 b := v.Block 14234 _ = b 14235 // match: (IsInBounds idx len) 14236 // cond: 14237 // result: (LessThanU (CMP idx len)) 14238 for { 14239 idx := v.Args[0] 14240 len := v.Args[1] 14241 v.reset(OpARMLessThanU) 14242 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14243 v0.AddArg(idx) 14244 v0.AddArg(len) 14245 v.AddArg(v0) 14246 return true 14247 } 14248 } 14249 func rewriteValueARM_OpIsNonNil(v *Value) bool { 14250 b := v.Block 14251 _ = b 14252 // match: (IsNonNil ptr) 14253 // cond: 14254 // result: (NotEqual (CMPconst [0] ptr)) 14255 for { 14256 ptr := v.Args[0] 14257 v.reset(OpARMNotEqual) 14258 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14259 v0.AuxInt = 0 14260 v0.AddArg(ptr) 14261 v.AddArg(v0) 14262 return true 14263 } 14264 } 14265 func rewriteValueARM_OpIsSliceInBounds(v *Value) bool { 14266 b := v.Block 14267 _ = b 14268 // match: (IsSliceInBounds idx len) 14269 // cond: 14270 // result: (LessEqualU (CMP idx len)) 14271 for { 14272 idx := v.Args[0] 14273 len := v.Args[1] 14274 v.reset(OpARMLessEqualU) 14275 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14276 v0.AddArg(idx) 14277 v0.AddArg(len) 14278 v.AddArg(v0) 14279 return true 14280 } 14281 } 14282 func rewriteValueARM_OpLeq16(v *Value) bool { 14283 b := v.Block 14284 _ = b 14285 types := &b.Func.Config.Types 14286 _ = types 14287 // match: (Leq16 x y) 14288 // cond: 14289 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 14290 for { 14291 x := v.Args[0] 14292 y := v.Args[1] 14293 v.reset(OpARMLessEqual) 14294 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14295 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14296 v1.AddArg(x) 14297 v0.AddArg(v1) 14298 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14299 v2.AddArg(y) 14300 v0.AddArg(v2) 14301 v.AddArg(v0) 14302 return true 14303 } 14304 } 14305 func rewriteValueARM_OpLeq16U(v *Value) bool { 14306 b := v.Block 14307 _ = b 14308 types := &b.Func.Config.Types 14309 _ = types 14310 // match: (Leq16U x y) 14311 // cond: 14312 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14313 for { 14314 x := v.Args[0] 14315 y := v.Args[1] 14316 v.reset(OpARMLessEqualU) 14317 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14318 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14319 v1.AddArg(x) 14320 v0.AddArg(v1) 14321 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14322 v2.AddArg(y) 14323 v0.AddArg(v2) 14324 v.AddArg(v0) 14325 return true 14326 } 14327 } 14328 func rewriteValueARM_OpLeq32(v *Value) bool { 14329 b := v.Block 14330 _ = b 14331 // match: (Leq32 x y) 14332 // cond: 14333 // result: (LessEqual (CMP x y)) 14334 for { 14335 x := v.Args[0] 14336 y := v.Args[1] 14337 v.reset(OpARMLessEqual) 14338 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14339 v0.AddArg(x) 14340 v0.AddArg(y) 14341 v.AddArg(v0) 14342 return true 14343 } 14344 } 14345 func rewriteValueARM_OpLeq32F(v *Value) bool { 14346 b := v.Block 14347 _ = b 14348 // match: (Leq32F x y) 14349 // cond: 14350 // result: (GreaterEqual (CMPF y x)) 14351 for { 14352 x := v.Args[0] 14353 y := v.Args[1] 14354 v.reset(OpARMGreaterEqual) 14355 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 14356 v0.AddArg(y) 14357 v0.AddArg(x) 14358 v.AddArg(v0) 14359 return true 14360 } 14361 } 14362 func rewriteValueARM_OpLeq32U(v *Value) bool { 14363 b := v.Block 14364 _ = b 14365 // match: (Leq32U x y) 14366 // cond: 14367 // result: (LessEqualU (CMP x y)) 14368 for { 14369 x := v.Args[0] 14370 y := v.Args[1] 14371 v.reset(OpARMLessEqualU) 14372 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14373 v0.AddArg(x) 14374 v0.AddArg(y) 14375 v.AddArg(v0) 14376 return true 14377 } 14378 } 14379 func rewriteValueARM_OpLeq64F(v *Value) bool { 14380 b := v.Block 14381 _ = b 14382 // match: (Leq64F x y) 14383 // cond: 14384 // result: (GreaterEqual (CMPD y x)) 14385 for { 14386 x := v.Args[0] 14387 y := v.Args[1] 14388 v.reset(OpARMGreaterEqual) 14389 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14390 v0.AddArg(y) 14391 v0.AddArg(x) 14392 v.AddArg(v0) 14393 return true 14394 } 14395 } 14396 func rewriteValueARM_OpLeq8(v *Value) bool { 14397 b := v.Block 14398 _ = b 14399 types := &b.Func.Config.Types 14400 _ = types 14401 // match: (Leq8 x y) 14402 // cond: 14403 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 14404 for { 14405 x := v.Args[0] 14406 y := v.Args[1] 14407 v.reset(OpARMLessEqual) 14408 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14409 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14410 v1.AddArg(x) 14411 v0.AddArg(v1) 14412 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14413 v2.AddArg(y) 14414 v0.AddArg(v2) 14415 v.AddArg(v0) 14416 return true 14417 } 14418 } 14419 func rewriteValueARM_OpLeq8U(v *Value) bool { 14420 b := v.Block 14421 _ = b 14422 types := &b.Func.Config.Types 14423 _ = types 14424 // match: (Leq8U x y) 14425 // cond: 14426 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14427 for { 14428 x := v.Args[0] 14429 y := v.Args[1] 14430 v.reset(OpARMLessEqualU) 14431 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14432 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14433 v1.AddArg(x) 14434 v0.AddArg(v1) 14435 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14436 v2.AddArg(y) 14437 v0.AddArg(v2) 14438 v.AddArg(v0) 14439 return true 14440 } 14441 } 14442 func rewriteValueARM_OpLess16(v *Value) bool { 14443 b := v.Block 14444 _ = b 14445 types := &b.Func.Config.Types 14446 _ = types 14447 // match: (Less16 x y) 14448 // cond: 14449 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 14450 for { 14451 x := v.Args[0] 14452 y := v.Args[1] 14453 v.reset(OpARMLessThan) 14454 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14455 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14456 v1.AddArg(x) 14457 v0.AddArg(v1) 14458 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14459 v2.AddArg(y) 14460 v0.AddArg(v2) 14461 v.AddArg(v0) 14462 return true 14463 } 14464 } 14465 func rewriteValueARM_OpLess16U(v *Value) bool { 14466 b := v.Block 14467 _ = b 14468 types := &b.Func.Config.Types 14469 _ = types 14470 // match: (Less16U x y) 14471 // cond: 14472 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14473 for { 14474 x := v.Args[0] 14475 y := v.Args[1] 14476 v.reset(OpARMLessThanU) 14477 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14478 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14479 v1.AddArg(x) 14480 v0.AddArg(v1) 14481 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14482 v2.AddArg(y) 14483 v0.AddArg(v2) 14484 v.AddArg(v0) 14485 return true 14486 } 14487 } 14488 func rewriteValueARM_OpLess32(v *Value) bool { 14489 b := v.Block 14490 _ = b 14491 // match: (Less32 x y) 14492 // cond: 14493 // result: (LessThan (CMP x y)) 14494 for { 14495 x := v.Args[0] 14496 y := v.Args[1] 14497 v.reset(OpARMLessThan) 14498 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14499 v0.AddArg(x) 14500 v0.AddArg(y) 14501 v.AddArg(v0) 14502 return true 14503 } 14504 } 14505 func rewriteValueARM_OpLess32F(v *Value) bool { 14506 b := v.Block 14507 _ = b 14508 // match: (Less32F x y) 14509 // cond: 14510 // result: (GreaterThan (CMPF y x)) 14511 for { 14512 x := v.Args[0] 14513 y := v.Args[1] 14514 v.reset(OpARMGreaterThan) 14515 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 14516 v0.AddArg(y) 14517 v0.AddArg(x) 14518 v.AddArg(v0) 14519 return true 14520 } 14521 } 14522 func rewriteValueARM_OpLess32U(v *Value) bool { 14523 b := v.Block 14524 _ = b 14525 // match: (Less32U x y) 14526 // cond: 14527 // result: (LessThanU (CMP x y)) 14528 for { 14529 x := v.Args[0] 14530 y := v.Args[1] 14531 v.reset(OpARMLessThanU) 14532 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14533 v0.AddArg(x) 14534 v0.AddArg(y) 14535 v.AddArg(v0) 14536 return true 14537 } 14538 } 14539 func rewriteValueARM_OpLess64F(v *Value) bool { 14540 b := v.Block 14541 _ = b 14542 // match: (Less64F x y) 14543 // cond: 14544 // result: (GreaterThan (CMPD y x)) 14545 for { 14546 x := v.Args[0] 14547 y := v.Args[1] 14548 v.reset(OpARMGreaterThan) 14549 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14550 v0.AddArg(y) 14551 v0.AddArg(x) 14552 v.AddArg(v0) 14553 return true 14554 } 14555 } 14556 func rewriteValueARM_OpLess8(v *Value) bool { 14557 b := v.Block 14558 _ = b 14559 types := &b.Func.Config.Types 14560 _ = types 14561 // match: (Less8 x y) 14562 // cond: 14563 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 14564 for { 14565 x := v.Args[0] 14566 y := v.Args[1] 14567 v.reset(OpARMLessThan) 14568 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14569 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14570 v1.AddArg(x) 14571 v0.AddArg(v1) 14572 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14573 v2.AddArg(y) 14574 v0.AddArg(v2) 14575 v.AddArg(v0) 14576 return true 14577 } 14578 } 14579 func rewriteValueARM_OpLess8U(v *Value) bool { 14580 b := v.Block 14581 _ = b 14582 types := &b.Func.Config.Types 14583 _ = types 14584 // match: (Less8U x y) 14585 // cond: 14586 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14587 for { 14588 x := v.Args[0] 14589 y := v.Args[1] 14590 v.reset(OpARMLessThanU) 14591 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14592 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14593 v1.AddArg(x) 14594 v0.AddArg(v1) 14595 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14596 v2.AddArg(y) 14597 v0.AddArg(v2) 14598 v.AddArg(v0) 14599 return true 14600 } 14601 } 14602 func rewriteValueARM_OpLoad(v *Value) bool { 14603 // match: (Load <t> ptr mem) 14604 // cond: t.IsBoolean() 14605 // result: (MOVBUload ptr mem) 14606 for { 14607 t := v.Type 14608 ptr := v.Args[0] 14609 mem := v.Args[1] 14610 if !(t.IsBoolean()) { 14611 break 14612 } 14613 v.reset(OpARMMOVBUload) 14614 v.AddArg(ptr) 14615 v.AddArg(mem) 14616 return true 14617 } 14618 // match: (Load <t> ptr mem) 14619 // cond: (is8BitInt(t) && isSigned(t)) 14620 // result: (MOVBload ptr mem) 14621 for { 14622 t := v.Type 14623 ptr := v.Args[0] 14624 mem := v.Args[1] 14625 if !(is8BitInt(t) && isSigned(t)) { 14626 break 14627 } 14628 v.reset(OpARMMOVBload) 14629 v.AddArg(ptr) 14630 v.AddArg(mem) 14631 return true 14632 } 14633 // match: (Load <t> ptr mem) 14634 // cond: (is8BitInt(t) && !isSigned(t)) 14635 // result: (MOVBUload ptr mem) 14636 for { 14637 t := v.Type 14638 ptr := v.Args[0] 14639 mem := v.Args[1] 14640 if !(is8BitInt(t) && !isSigned(t)) { 14641 break 14642 } 14643 v.reset(OpARMMOVBUload) 14644 v.AddArg(ptr) 14645 v.AddArg(mem) 14646 return true 14647 } 14648 // match: (Load <t> ptr mem) 14649 // cond: (is16BitInt(t) && isSigned(t)) 14650 // result: (MOVHload ptr mem) 14651 for { 14652 t := v.Type 14653 ptr := v.Args[0] 14654 mem := v.Args[1] 14655 if !(is16BitInt(t) && isSigned(t)) { 14656 break 14657 } 14658 v.reset(OpARMMOVHload) 14659 v.AddArg(ptr) 14660 v.AddArg(mem) 14661 return true 14662 } 14663 // match: (Load <t> ptr mem) 14664 // cond: (is16BitInt(t) && !isSigned(t)) 14665 // result: (MOVHUload ptr mem) 14666 for { 14667 t := v.Type 14668 ptr := v.Args[0] 14669 mem := v.Args[1] 14670 if !(is16BitInt(t) && !isSigned(t)) { 14671 break 14672 } 14673 v.reset(OpARMMOVHUload) 14674 v.AddArg(ptr) 14675 v.AddArg(mem) 14676 return true 14677 } 14678 // match: (Load <t> ptr mem) 14679 // cond: (is32BitInt(t) || isPtr(t)) 14680 // result: (MOVWload ptr mem) 14681 for { 14682 t := v.Type 14683 ptr := v.Args[0] 14684 mem := v.Args[1] 14685 if !(is32BitInt(t) || isPtr(t)) { 14686 break 14687 } 14688 v.reset(OpARMMOVWload) 14689 v.AddArg(ptr) 14690 v.AddArg(mem) 14691 return true 14692 } 14693 // match: (Load <t> ptr mem) 14694 // cond: is32BitFloat(t) 14695 // result: (MOVFload ptr mem) 14696 for { 14697 t := v.Type 14698 ptr := v.Args[0] 14699 mem := v.Args[1] 14700 if !(is32BitFloat(t)) { 14701 break 14702 } 14703 v.reset(OpARMMOVFload) 14704 v.AddArg(ptr) 14705 v.AddArg(mem) 14706 return true 14707 } 14708 // match: (Load <t> ptr mem) 14709 // cond: is64BitFloat(t) 14710 // result: (MOVDload ptr mem) 14711 for { 14712 t := v.Type 14713 ptr := v.Args[0] 14714 mem := v.Args[1] 14715 if !(is64BitFloat(t)) { 14716 break 14717 } 14718 v.reset(OpARMMOVDload) 14719 v.AddArg(ptr) 14720 v.AddArg(mem) 14721 return true 14722 } 14723 return false 14724 } 14725 func rewriteValueARM_OpLsh16x16(v *Value) bool { 14726 b := v.Block 14727 _ = b 14728 types := &b.Func.Config.Types 14729 _ = types 14730 // match: (Lsh16x16 x y) 14731 // cond: 14732 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14733 for { 14734 x := v.Args[0] 14735 y := v.Args[1] 14736 v.reset(OpARMCMOVWHSconst) 14737 v.AuxInt = 0 14738 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14739 v0.AddArg(x) 14740 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14741 v1.AddArg(y) 14742 v0.AddArg(v1) 14743 v.AddArg(v0) 14744 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14745 v2.AuxInt = 256 14746 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14747 v3.AddArg(y) 14748 v2.AddArg(v3) 14749 v.AddArg(v2) 14750 return true 14751 } 14752 } 14753 func rewriteValueARM_OpLsh16x32(v *Value) bool { 14754 b := v.Block 14755 _ = b 14756 // match: (Lsh16x32 x y) 14757 // cond: 14758 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14759 for { 14760 x := v.Args[0] 14761 y := v.Args[1] 14762 v.reset(OpARMCMOVWHSconst) 14763 v.AuxInt = 0 14764 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14765 v0.AddArg(x) 14766 v0.AddArg(y) 14767 v.AddArg(v0) 14768 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14769 v1.AuxInt = 256 14770 v1.AddArg(y) 14771 v.AddArg(v1) 14772 return true 14773 } 14774 } 14775 func rewriteValueARM_OpLsh16x64(v *Value) bool { 14776 // match: (Lsh16x64 x (Const64 [c])) 14777 // cond: uint64(c) < 16 14778 // result: (SLLconst x [c]) 14779 for { 14780 x := v.Args[0] 14781 v_1 := v.Args[1] 14782 if v_1.Op != OpConst64 { 14783 break 14784 } 14785 c := v_1.AuxInt 14786 if !(uint64(c) < 16) { 14787 break 14788 } 14789 v.reset(OpARMSLLconst) 14790 v.AuxInt = c 14791 v.AddArg(x) 14792 return true 14793 } 14794 // match: (Lsh16x64 _ (Const64 [c])) 14795 // cond: uint64(c) >= 16 14796 // result: (Const16 [0]) 14797 for { 14798 v_1 := v.Args[1] 14799 if v_1.Op != OpConst64 { 14800 break 14801 } 14802 c := v_1.AuxInt 14803 if !(uint64(c) >= 16) { 14804 break 14805 } 14806 v.reset(OpConst16) 14807 v.AuxInt = 0 14808 return true 14809 } 14810 return false 14811 } 14812 func rewriteValueARM_OpLsh16x8(v *Value) bool { 14813 b := v.Block 14814 _ = b 14815 types := &b.Func.Config.Types 14816 _ = types 14817 // match: (Lsh16x8 x y) 14818 // cond: 14819 // result: (SLL x (ZeroExt8to32 y)) 14820 for { 14821 x := v.Args[0] 14822 y := v.Args[1] 14823 v.reset(OpARMSLL) 14824 v.AddArg(x) 14825 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14826 v0.AddArg(y) 14827 v.AddArg(v0) 14828 return true 14829 } 14830 } 14831 func rewriteValueARM_OpLsh32x16(v *Value) bool { 14832 b := v.Block 14833 _ = b 14834 types := &b.Func.Config.Types 14835 _ = types 14836 // match: (Lsh32x16 x y) 14837 // cond: 14838 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14839 for { 14840 x := v.Args[0] 14841 y := v.Args[1] 14842 v.reset(OpARMCMOVWHSconst) 14843 v.AuxInt = 0 14844 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14845 v0.AddArg(x) 14846 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14847 v1.AddArg(y) 14848 v0.AddArg(v1) 14849 v.AddArg(v0) 14850 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14851 v2.AuxInt = 256 14852 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14853 v3.AddArg(y) 14854 v2.AddArg(v3) 14855 v.AddArg(v2) 14856 return true 14857 } 14858 } 14859 func rewriteValueARM_OpLsh32x32(v *Value) bool { 14860 b := v.Block 14861 _ = b 14862 // match: (Lsh32x32 x y) 14863 // cond: 14864 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14865 for { 14866 x := v.Args[0] 14867 y := v.Args[1] 14868 v.reset(OpARMCMOVWHSconst) 14869 v.AuxInt = 0 14870 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14871 v0.AddArg(x) 14872 v0.AddArg(y) 14873 v.AddArg(v0) 14874 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14875 v1.AuxInt = 256 14876 v1.AddArg(y) 14877 v.AddArg(v1) 14878 return true 14879 } 14880 } 14881 func rewriteValueARM_OpLsh32x64(v *Value) bool { 14882 // match: (Lsh32x64 x (Const64 [c])) 14883 // cond: uint64(c) < 32 14884 // result: (SLLconst x [c]) 14885 for { 14886 x := v.Args[0] 14887 v_1 := v.Args[1] 14888 if v_1.Op != OpConst64 { 14889 break 14890 } 14891 c := v_1.AuxInt 14892 if !(uint64(c) < 32) { 14893 break 14894 } 14895 v.reset(OpARMSLLconst) 14896 v.AuxInt = c 14897 v.AddArg(x) 14898 return true 14899 } 14900 // match: (Lsh32x64 _ (Const64 [c])) 14901 // cond: uint64(c) >= 32 14902 // result: (Const32 [0]) 14903 for { 14904 v_1 := v.Args[1] 14905 if v_1.Op != OpConst64 { 14906 break 14907 } 14908 c := v_1.AuxInt 14909 if !(uint64(c) >= 32) { 14910 break 14911 } 14912 v.reset(OpConst32) 14913 v.AuxInt = 0 14914 return true 14915 } 14916 return false 14917 } 14918 func rewriteValueARM_OpLsh32x8(v *Value) bool { 14919 b := v.Block 14920 _ = b 14921 types := &b.Func.Config.Types 14922 _ = types 14923 // match: (Lsh32x8 x y) 14924 // cond: 14925 // result: (SLL x (ZeroExt8to32 y)) 14926 for { 14927 x := v.Args[0] 14928 y := v.Args[1] 14929 v.reset(OpARMSLL) 14930 v.AddArg(x) 14931 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14932 v0.AddArg(y) 14933 v.AddArg(v0) 14934 return true 14935 } 14936 } 14937 func rewriteValueARM_OpLsh8x16(v *Value) bool { 14938 b := v.Block 14939 _ = b 14940 types := &b.Func.Config.Types 14941 _ = types 14942 // match: (Lsh8x16 x y) 14943 // cond: 14944 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14945 for { 14946 x := v.Args[0] 14947 y := v.Args[1] 14948 v.reset(OpARMCMOVWHSconst) 14949 v.AuxInt = 0 14950 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14951 v0.AddArg(x) 14952 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14953 v1.AddArg(y) 14954 v0.AddArg(v1) 14955 v.AddArg(v0) 14956 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14957 v2.AuxInt = 256 14958 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14959 v3.AddArg(y) 14960 v2.AddArg(v3) 14961 v.AddArg(v2) 14962 return true 14963 } 14964 } 14965 func rewriteValueARM_OpLsh8x32(v *Value) bool { 14966 b := v.Block 14967 _ = b 14968 // match: (Lsh8x32 x y) 14969 // cond: 14970 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14971 for { 14972 x := v.Args[0] 14973 y := v.Args[1] 14974 v.reset(OpARMCMOVWHSconst) 14975 v.AuxInt = 0 14976 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14977 v0.AddArg(x) 14978 v0.AddArg(y) 14979 v.AddArg(v0) 14980 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14981 v1.AuxInt = 256 14982 v1.AddArg(y) 14983 v.AddArg(v1) 14984 return true 14985 } 14986 } 14987 func rewriteValueARM_OpLsh8x64(v *Value) bool { 14988 // match: (Lsh8x64 x (Const64 [c])) 14989 // cond: uint64(c) < 8 14990 // result: (SLLconst x [c]) 14991 for { 14992 x := v.Args[0] 14993 v_1 := v.Args[1] 14994 if v_1.Op != OpConst64 { 14995 break 14996 } 14997 c := v_1.AuxInt 14998 if !(uint64(c) < 8) { 14999 break 15000 } 15001 v.reset(OpARMSLLconst) 15002 v.AuxInt = c 15003 v.AddArg(x) 15004 return true 15005 } 15006 // match: (Lsh8x64 _ (Const64 [c])) 15007 // cond: uint64(c) >= 8 15008 // result: (Const8 [0]) 15009 for { 15010 v_1 := v.Args[1] 15011 if v_1.Op != OpConst64 { 15012 break 15013 } 15014 c := v_1.AuxInt 15015 if !(uint64(c) >= 8) { 15016 break 15017 } 15018 v.reset(OpConst8) 15019 v.AuxInt = 0 15020 return true 15021 } 15022 return false 15023 } 15024 func rewriteValueARM_OpLsh8x8(v *Value) bool { 15025 b := v.Block 15026 _ = b 15027 types := &b.Func.Config.Types 15028 _ = types 15029 // match: (Lsh8x8 x y) 15030 // cond: 15031 // result: (SLL x (ZeroExt8to32 y)) 15032 for { 15033 x := v.Args[0] 15034 y := v.Args[1] 15035 v.reset(OpARMSLL) 15036 v.AddArg(x) 15037 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15038 v0.AddArg(y) 15039 v.AddArg(v0) 15040 return true 15041 } 15042 } 15043 func rewriteValueARM_OpMod16(v *Value) bool { 15044 b := v.Block 15045 _ = b 15046 types := &b.Func.Config.Types 15047 _ = types 15048 // match: (Mod16 x y) 15049 // cond: 15050 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 15051 for { 15052 x := v.Args[0] 15053 y := v.Args[1] 15054 v.reset(OpMod32) 15055 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 15056 v0.AddArg(x) 15057 v.AddArg(v0) 15058 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 15059 v1.AddArg(y) 15060 v.AddArg(v1) 15061 return true 15062 } 15063 } 15064 func rewriteValueARM_OpMod16u(v *Value) bool { 15065 b := v.Block 15066 _ = b 15067 types := &b.Func.Config.Types 15068 _ = types 15069 // match: (Mod16u x y) 15070 // cond: 15071 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 15072 for { 15073 x := v.Args[0] 15074 y := v.Args[1] 15075 v.reset(OpMod32u) 15076 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15077 v0.AddArg(x) 15078 v.AddArg(v0) 15079 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15080 v1.AddArg(y) 15081 v.AddArg(v1) 15082 return true 15083 } 15084 } 15085 func rewriteValueARM_OpMod32(v *Value) bool { 15086 b := v.Block 15087 _ = b 15088 config := b.Func.Config 15089 _ = config 15090 types := &b.Func.Config.Types 15091 _ = types 15092 // match: (Mod32 x y) 15093 // cond: 15094 // result: (SUB (XOR <types.UInt32> (Select1 <types.UInt32> (CALLudiv {config.ctxt.Lookup("udiv", 0)} (SUB <types.UInt32> (XOR <types.UInt32> x (Signmask x)) (Signmask x)) (SUB <types.UInt32> (XOR <types.UInt32> y (Signmask y)) (Signmask y)))) (Signmask x)) (Signmask x)) 15095 for { 15096 x := v.Args[0] 15097 y := v.Args[1] 15098 v.reset(OpARMSUB) 15099 v0 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 15100 v1 := b.NewValue0(v.Pos, OpSelect1, types.UInt32) 15101 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, MakeTuple(types.UInt32, types.UInt32)) 15102 v2.Aux = config.ctxt.Lookup("udiv", 0) 15103 v3 := b.NewValue0(v.Pos, OpARMSUB, types.UInt32) 15104 v4 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 15105 v4.AddArg(x) 15106 v5 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15107 v5.AddArg(x) 15108 v4.AddArg(v5) 15109 v3.AddArg(v4) 15110 v6 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15111 v6.AddArg(x) 15112 v3.AddArg(v6) 15113 v2.AddArg(v3) 15114 v7 := b.NewValue0(v.Pos, OpARMSUB, types.UInt32) 15115 v8 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 15116 v8.AddArg(y) 15117 v9 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15118 v9.AddArg(y) 15119 v8.AddArg(v9) 15120 v7.AddArg(v8) 15121 v10 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15122 v10.AddArg(y) 15123 v7.AddArg(v10) 15124 v2.AddArg(v7) 15125 v1.AddArg(v2) 15126 v0.AddArg(v1) 15127 v11 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15128 v11.AddArg(x) 15129 v0.AddArg(v11) 15130 v.AddArg(v0) 15131 v12 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15132 v12.AddArg(x) 15133 v.AddArg(v12) 15134 return true 15135 } 15136 } 15137 func rewriteValueARM_OpMod32u(v *Value) bool { 15138 b := v.Block 15139 _ = b 15140 config := b.Func.Config 15141 _ = config 15142 types := &b.Func.Config.Types 15143 _ = types 15144 // match: (Mod32u x y) 15145 // cond: 15146 // result: (Select1 <types.UInt32> (CALLudiv {config.ctxt.Lookup("udiv", 0)} x y)) 15147 for { 15148 x := v.Args[0] 15149 y := v.Args[1] 15150 v.reset(OpSelect1) 15151 v.Type = types.UInt32 15152 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, MakeTuple(types.UInt32, types.UInt32)) 15153 v0.Aux = config.ctxt.Lookup("udiv", 0) 15154 v0.AddArg(x) 15155 v0.AddArg(y) 15156 v.AddArg(v0) 15157 return true 15158 } 15159 } 15160 func rewriteValueARM_OpMod8(v *Value) bool { 15161 b := v.Block 15162 _ = b 15163 types := &b.Func.Config.Types 15164 _ = types 15165 // match: (Mod8 x y) 15166 // cond: 15167 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 15168 for { 15169 x := v.Args[0] 15170 y := v.Args[1] 15171 v.reset(OpMod32) 15172 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 15173 v0.AddArg(x) 15174 v.AddArg(v0) 15175 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 15176 v1.AddArg(y) 15177 v.AddArg(v1) 15178 return true 15179 } 15180 } 15181 func rewriteValueARM_OpMod8u(v *Value) bool { 15182 b := v.Block 15183 _ = b 15184 types := &b.Func.Config.Types 15185 _ = types 15186 // match: (Mod8u x y) 15187 // cond: 15188 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 15189 for { 15190 x := v.Args[0] 15191 y := v.Args[1] 15192 v.reset(OpMod32u) 15193 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15194 v0.AddArg(x) 15195 v.AddArg(v0) 15196 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15197 v1.AddArg(y) 15198 v.AddArg(v1) 15199 return true 15200 } 15201 } 15202 func rewriteValueARM_OpMove(v *Value) bool { 15203 b := v.Block 15204 _ = b 15205 config := b.Func.Config 15206 _ = config 15207 types := &b.Func.Config.Types 15208 _ = types 15209 // match: (Move [0] _ _ mem) 15210 // cond: 15211 // result: mem 15212 for { 15213 if v.AuxInt != 0 { 15214 break 15215 } 15216 mem := v.Args[2] 15217 v.reset(OpCopy) 15218 v.Type = mem.Type 15219 v.AddArg(mem) 15220 return true 15221 } 15222 // match: (Move [1] dst src mem) 15223 // cond: 15224 // result: (MOVBstore dst (MOVBUload src mem) mem) 15225 for { 15226 if v.AuxInt != 1 { 15227 break 15228 } 15229 dst := v.Args[0] 15230 src := v.Args[1] 15231 mem := v.Args[2] 15232 v.reset(OpARMMOVBstore) 15233 v.AddArg(dst) 15234 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15235 v0.AddArg(src) 15236 v0.AddArg(mem) 15237 v.AddArg(v0) 15238 v.AddArg(mem) 15239 return true 15240 } 15241 // match: (Move [2] {t} dst src mem) 15242 // cond: t.(Type).Alignment()%2 == 0 15243 // result: (MOVHstore dst (MOVHUload src mem) mem) 15244 for { 15245 if v.AuxInt != 2 { 15246 break 15247 } 15248 t := v.Aux 15249 dst := v.Args[0] 15250 src := v.Args[1] 15251 mem := v.Args[2] 15252 if !(t.(Type).Alignment()%2 == 0) { 15253 break 15254 } 15255 v.reset(OpARMMOVHstore) 15256 v.AddArg(dst) 15257 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, types.UInt16) 15258 v0.AddArg(src) 15259 v0.AddArg(mem) 15260 v.AddArg(v0) 15261 v.AddArg(mem) 15262 return true 15263 } 15264 // match: (Move [2] dst src mem) 15265 // cond: 15266 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 15267 for { 15268 if v.AuxInt != 2 { 15269 break 15270 } 15271 dst := v.Args[0] 15272 src := v.Args[1] 15273 mem := v.Args[2] 15274 v.reset(OpARMMOVBstore) 15275 v.AuxInt = 1 15276 v.AddArg(dst) 15277 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15278 v0.AuxInt = 1 15279 v0.AddArg(src) 15280 v0.AddArg(mem) 15281 v.AddArg(v0) 15282 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15283 v1.AddArg(dst) 15284 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15285 v2.AddArg(src) 15286 v2.AddArg(mem) 15287 v1.AddArg(v2) 15288 v1.AddArg(mem) 15289 v.AddArg(v1) 15290 return true 15291 } 15292 // match: (Move [4] {t} dst src mem) 15293 // cond: t.(Type).Alignment()%4 == 0 15294 // result: (MOVWstore dst (MOVWload src mem) mem) 15295 for { 15296 if v.AuxInt != 4 { 15297 break 15298 } 15299 t := v.Aux 15300 dst := v.Args[0] 15301 src := v.Args[1] 15302 mem := v.Args[2] 15303 if !(t.(Type).Alignment()%4 == 0) { 15304 break 15305 } 15306 v.reset(OpARMMOVWstore) 15307 v.AddArg(dst) 15308 v0 := b.NewValue0(v.Pos, OpARMMOVWload, types.UInt32) 15309 v0.AddArg(src) 15310 v0.AddArg(mem) 15311 v.AddArg(v0) 15312 v.AddArg(mem) 15313 return true 15314 } 15315 // match: (Move [4] {t} dst src mem) 15316 // cond: t.(Type).Alignment()%2 == 0 15317 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 15318 for { 15319 if v.AuxInt != 4 { 15320 break 15321 } 15322 t := v.Aux 15323 dst := v.Args[0] 15324 src := v.Args[1] 15325 mem := v.Args[2] 15326 if !(t.(Type).Alignment()%2 == 0) { 15327 break 15328 } 15329 v.reset(OpARMMOVHstore) 15330 v.AuxInt = 2 15331 v.AddArg(dst) 15332 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, types.UInt16) 15333 v0.AuxInt = 2 15334 v0.AddArg(src) 15335 v0.AddArg(mem) 15336 v.AddArg(v0) 15337 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, TypeMem) 15338 v1.AddArg(dst) 15339 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, types.UInt16) 15340 v2.AddArg(src) 15341 v2.AddArg(mem) 15342 v1.AddArg(v2) 15343 v1.AddArg(mem) 15344 v.AddArg(v1) 15345 return true 15346 } 15347 // match: (Move [4] dst src mem) 15348 // cond: 15349 // 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)))) 15350 for { 15351 if v.AuxInt != 4 { 15352 break 15353 } 15354 dst := v.Args[0] 15355 src := v.Args[1] 15356 mem := v.Args[2] 15357 v.reset(OpARMMOVBstore) 15358 v.AuxInt = 3 15359 v.AddArg(dst) 15360 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15361 v0.AuxInt = 3 15362 v0.AddArg(src) 15363 v0.AddArg(mem) 15364 v.AddArg(v0) 15365 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15366 v1.AuxInt = 2 15367 v1.AddArg(dst) 15368 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15369 v2.AuxInt = 2 15370 v2.AddArg(src) 15371 v2.AddArg(mem) 15372 v1.AddArg(v2) 15373 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15374 v3.AuxInt = 1 15375 v3.AddArg(dst) 15376 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15377 v4.AuxInt = 1 15378 v4.AddArg(src) 15379 v4.AddArg(mem) 15380 v3.AddArg(v4) 15381 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15382 v5.AddArg(dst) 15383 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15384 v6.AddArg(src) 15385 v6.AddArg(mem) 15386 v5.AddArg(v6) 15387 v5.AddArg(mem) 15388 v3.AddArg(v5) 15389 v1.AddArg(v3) 15390 v.AddArg(v1) 15391 return true 15392 } 15393 // match: (Move [3] dst src mem) 15394 // cond: 15395 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 15396 for { 15397 if v.AuxInt != 3 { 15398 break 15399 } 15400 dst := v.Args[0] 15401 src := v.Args[1] 15402 mem := v.Args[2] 15403 v.reset(OpARMMOVBstore) 15404 v.AuxInt = 2 15405 v.AddArg(dst) 15406 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15407 v0.AuxInt = 2 15408 v0.AddArg(src) 15409 v0.AddArg(mem) 15410 v.AddArg(v0) 15411 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15412 v1.AuxInt = 1 15413 v1.AddArg(dst) 15414 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15415 v2.AuxInt = 1 15416 v2.AddArg(src) 15417 v2.AddArg(mem) 15418 v1.AddArg(v2) 15419 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15420 v3.AddArg(dst) 15421 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15422 v4.AddArg(src) 15423 v4.AddArg(mem) 15424 v3.AddArg(v4) 15425 v3.AddArg(mem) 15426 v1.AddArg(v3) 15427 v.AddArg(v1) 15428 return true 15429 } 15430 // match: (Move [s] {t} dst src mem) 15431 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(Type).Alignment()%4 == 0 && !config.noDuffDevice 15432 // result: (DUFFCOPY [8 * (128 - int64(s/4))] dst src mem) 15433 for { 15434 s := v.AuxInt 15435 t := v.Aux 15436 dst := v.Args[0] 15437 src := v.Args[1] 15438 mem := v.Args[2] 15439 if !(s%4 == 0 && s > 4 && s <= 512 && t.(Type).Alignment()%4 == 0 && !config.noDuffDevice) { 15440 break 15441 } 15442 v.reset(OpARMDUFFCOPY) 15443 v.AuxInt = 8 * (128 - int64(s/4)) 15444 v.AddArg(dst) 15445 v.AddArg(src) 15446 v.AddArg(mem) 15447 return true 15448 } 15449 // match: (Move [s] {t} dst src mem) 15450 // cond: (s > 512 || config.noDuffDevice) || t.(Type).Alignment()%4 != 0 15451 // result: (LoweredMove [t.(Type).Alignment()] dst src (ADDconst <src.Type> src [s-moveSize(t.(Type).Alignment(), config)]) mem) 15452 for { 15453 s := v.AuxInt 15454 t := v.Aux 15455 dst := v.Args[0] 15456 src := v.Args[1] 15457 mem := v.Args[2] 15458 if !((s > 512 || config.noDuffDevice) || t.(Type).Alignment()%4 != 0) { 15459 break 15460 } 15461 v.reset(OpARMLoweredMove) 15462 v.AuxInt = t.(Type).Alignment() 15463 v.AddArg(dst) 15464 v.AddArg(src) 15465 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 15466 v0.AuxInt = s - moveSize(t.(Type).Alignment(), config) 15467 v0.AddArg(src) 15468 v.AddArg(v0) 15469 v.AddArg(mem) 15470 return true 15471 } 15472 return false 15473 } 15474 func rewriteValueARM_OpMul16(v *Value) bool { 15475 // match: (Mul16 x y) 15476 // cond: 15477 // result: (MUL x y) 15478 for { 15479 x := v.Args[0] 15480 y := v.Args[1] 15481 v.reset(OpARMMUL) 15482 v.AddArg(x) 15483 v.AddArg(y) 15484 return true 15485 } 15486 } 15487 func rewriteValueARM_OpMul32(v *Value) bool { 15488 // match: (Mul32 x y) 15489 // cond: 15490 // result: (MUL x y) 15491 for { 15492 x := v.Args[0] 15493 y := v.Args[1] 15494 v.reset(OpARMMUL) 15495 v.AddArg(x) 15496 v.AddArg(y) 15497 return true 15498 } 15499 } 15500 func rewriteValueARM_OpMul32F(v *Value) bool { 15501 // match: (Mul32F x y) 15502 // cond: 15503 // result: (MULF x y) 15504 for { 15505 x := v.Args[0] 15506 y := v.Args[1] 15507 v.reset(OpARMMULF) 15508 v.AddArg(x) 15509 v.AddArg(y) 15510 return true 15511 } 15512 } 15513 func rewriteValueARM_OpMul32uhilo(v *Value) bool { 15514 // match: (Mul32uhilo x y) 15515 // cond: 15516 // result: (MULLU x y) 15517 for { 15518 x := v.Args[0] 15519 y := v.Args[1] 15520 v.reset(OpARMMULLU) 15521 v.AddArg(x) 15522 v.AddArg(y) 15523 return true 15524 } 15525 } 15526 func rewriteValueARM_OpMul64F(v *Value) bool { 15527 // match: (Mul64F x y) 15528 // cond: 15529 // result: (MULD x y) 15530 for { 15531 x := v.Args[0] 15532 y := v.Args[1] 15533 v.reset(OpARMMULD) 15534 v.AddArg(x) 15535 v.AddArg(y) 15536 return true 15537 } 15538 } 15539 func rewriteValueARM_OpMul8(v *Value) bool { 15540 // match: (Mul8 x y) 15541 // cond: 15542 // result: (MUL x y) 15543 for { 15544 x := v.Args[0] 15545 y := v.Args[1] 15546 v.reset(OpARMMUL) 15547 v.AddArg(x) 15548 v.AddArg(y) 15549 return true 15550 } 15551 } 15552 func rewriteValueARM_OpNeg16(v *Value) bool { 15553 // match: (Neg16 x) 15554 // cond: 15555 // result: (RSBconst [0] x) 15556 for { 15557 x := v.Args[0] 15558 v.reset(OpARMRSBconst) 15559 v.AuxInt = 0 15560 v.AddArg(x) 15561 return true 15562 } 15563 } 15564 func rewriteValueARM_OpNeg32(v *Value) bool { 15565 // match: (Neg32 x) 15566 // cond: 15567 // result: (RSBconst [0] x) 15568 for { 15569 x := v.Args[0] 15570 v.reset(OpARMRSBconst) 15571 v.AuxInt = 0 15572 v.AddArg(x) 15573 return true 15574 } 15575 } 15576 func rewriteValueARM_OpNeg32F(v *Value) bool { 15577 // match: (Neg32F x) 15578 // cond: 15579 // result: (NEGF x) 15580 for { 15581 x := v.Args[0] 15582 v.reset(OpARMNEGF) 15583 v.AddArg(x) 15584 return true 15585 } 15586 } 15587 func rewriteValueARM_OpNeg64F(v *Value) bool { 15588 // match: (Neg64F x) 15589 // cond: 15590 // result: (NEGD x) 15591 for { 15592 x := v.Args[0] 15593 v.reset(OpARMNEGD) 15594 v.AddArg(x) 15595 return true 15596 } 15597 } 15598 func rewriteValueARM_OpNeg8(v *Value) bool { 15599 // match: (Neg8 x) 15600 // cond: 15601 // result: (RSBconst [0] x) 15602 for { 15603 x := v.Args[0] 15604 v.reset(OpARMRSBconst) 15605 v.AuxInt = 0 15606 v.AddArg(x) 15607 return true 15608 } 15609 } 15610 func rewriteValueARM_OpNeq16(v *Value) bool { 15611 b := v.Block 15612 _ = b 15613 types := &b.Func.Config.Types 15614 _ = types 15615 // match: (Neq16 x y) 15616 // cond: 15617 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 15618 for { 15619 x := v.Args[0] 15620 y := v.Args[1] 15621 v.reset(OpARMNotEqual) 15622 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15623 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15624 v1.AddArg(x) 15625 v0.AddArg(v1) 15626 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15627 v2.AddArg(y) 15628 v0.AddArg(v2) 15629 v.AddArg(v0) 15630 return true 15631 } 15632 } 15633 func rewriteValueARM_OpNeq32(v *Value) bool { 15634 b := v.Block 15635 _ = b 15636 // match: (Neq32 x y) 15637 // cond: 15638 // result: (NotEqual (CMP x y)) 15639 for { 15640 x := v.Args[0] 15641 y := v.Args[1] 15642 v.reset(OpARMNotEqual) 15643 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15644 v0.AddArg(x) 15645 v0.AddArg(y) 15646 v.AddArg(v0) 15647 return true 15648 } 15649 } 15650 func rewriteValueARM_OpNeq32F(v *Value) bool { 15651 b := v.Block 15652 _ = b 15653 // match: (Neq32F x y) 15654 // cond: 15655 // result: (NotEqual (CMPF x y)) 15656 for { 15657 x := v.Args[0] 15658 y := v.Args[1] 15659 v.reset(OpARMNotEqual) 15660 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 15661 v0.AddArg(x) 15662 v0.AddArg(y) 15663 v.AddArg(v0) 15664 return true 15665 } 15666 } 15667 func rewriteValueARM_OpNeq64F(v *Value) bool { 15668 b := v.Block 15669 _ = b 15670 // match: (Neq64F x y) 15671 // cond: 15672 // result: (NotEqual (CMPD x y)) 15673 for { 15674 x := v.Args[0] 15675 y := v.Args[1] 15676 v.reset(OpARMNotEqual) 15677 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 15678 v0.AddArg(x) 15679 v0.AddArg(y) 15680 v.AddArg(v0) 15681 return true 15682 } 15683 } 15684 func rewriteValueARM_OpNeq8(v *Value) bool { 15685 b := v.Block 15686 _ = b 15687 types := &b.Func.Config.Types 15688 _ = types 15689 // match: (Neq8 x y) 15690 // cond: 15691 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15692 for { 15693 x := v.Args[0] 15694 y := v.Args[1] 15695 v.reset(OpARMNotEqual) 15696 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15697 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15698 v1.AddArg(x) 15699 v0.AddArg(v1) 15700 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15701 v2.AddArg(y) 15702 v0.AddArg(v2) 15703 v.AddArg(v0) 15704 return true 15705 } 15706 } 15707 func rewriteValueARM_OpNeqB(v *Value) bool { 15708 // match: (NeqB x y) 15709 // cond: 15710 // result: (XOR x y) 15711 for { 15712 x := v.Args[0] 15713 y := v.Args[1] 15714 v.reset(OpARMXOR) 15715 v.AddArg(x) 15716 v.AddArg(y) 15717 return true 15718 } 15719 } 15720 func rewriteValueARM_OpNeqPtr(v *Value) bool { 15721 b := v.Block 15722 _ = b 15723 // match: (NeqPtr x y) 15724 // cond: 15725 // result: (NotEqual (CMP x y)) 15726 for { 15727 x := v.Args[0] 15728 y := v.Args[1] 15729 v.reset(OpARMNotEqual) 15730 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15731 v0.AddArg(x) 15732 v0.AddArg(y) 15733 v.AddArg(v0) 15734 return true 15735 } 15736 } 15737 func rewriteValueARM_OpNilCheck(v *Value) bool { 15738 // match: (NilCheck ptr mem) 15739 // cond: 15740 // result: (LoweredNilCheck ptr mem) 15741 for { 15742 ptr := v.Args[0] 15743 mem := v.Args[1] 15744 v.reset(OpARMLoweredNilCheck) 15745 v.AddArg(ptr) 15746 v.AddArg(mem) 15747 return true 15748 } 15749 } 15750 func rewriteValueARM_OpNot(v *Value) bool { 15751 // match: (Not x) 15752 // cond: 15753 // result: (XORconst [1] x) 15754 for { 15755 x := v.Args[0] 15756 v.reset(OpARMXORconst) 15757 v.AuxInt = 1 15758 v.AddArg(x) 15759 return true 15760 } 15761 } 15762 func rewriteValueARM_OpOffPtr(v *Value) bool { 15763 // match: (OffPtr [off] ptr:(SP)) 15764 // cond: 15765 // result: (MOVWaddr [off] ptr) 15766 for { 15767 off := v.AuxInt 15768 ptr := v.Args[0] 15769 if ptr.Op != OpSP { 15770 break 15771 } 15772 v.reset(OpARMMOVWaddr) 15773 v.AuxInt = off 15774 v.AddArg(ptr) 15775 return true 15776 } 15777 // match: (OffPtr [off] ptr) 15778 // cond: 15779 // result: (ADDconst [off] ptr) 15780 for { 15781 off := v.AuxInt 15782 ptr := v.Args[0] 15783 v.reset(OpARMADDconst) 15784 v.AuxInt = off 15785 v.AddArg(ptr) 15786 return true 15787 } 15788 } 15789 func rewriteValueARM_OpOr16(v *Value) bool { 15790 // match: (Or16 x y) 15791 // cond: 15792 // result: (OR x y) 15793 for { 15794 x := v.Args[0] 15795 y := v.Args[1] 15796 v.reset(OpARMOR) 15797 v.AddArg(x) 15798 v.AddArg(y) 15799 return true 15800 } 15801 } 15802 func rewriteValueARM_OpOr32(v *Value) bool { 15803 // match: (Or32 x y) 15804 // cond: 15805 // result: (OR x y) 15806 for { 15807 x := v.Args[0] 15808 y := v.Args[1] 15809 v.reset(OpARMOR) 15810 v.AddArg(x) 15811 v.AddArg(y) 15812 return true 15813 } 15814 } 15815 func rewriteValueARM_OpOr8(v *Value) bool { 15816 // match: (Or8 x y) 15817 // cond: 15818 // result: (OR x y) 15819 for { 15820 x := v.Args[0] 15821 y := v.Args[1] 15822 v.reset(OpARMOR) 15823 v.AddArg(x) 15824 v.AddArg(y) 15825 return true 15826 } 15827 } 15828 func rewriteValueARM_OpOrB(v *Value) bool { 15829 // match: (OrB x y) 15830 // cond: 15831 // result: (OR x y) 15832 for { 15833 x := v.Args[0] 15834 y := v.Args[1] 15835 v.reset(OpARMOR) 15836 v.AddArg(x) 15837 v.AddArg(y) 15838 return true 15839 } 15840 } 15841 func rewriteValueARM_OpRound32F(v *Value) bool { 15842 // match: (Round32F x) 15843 // cond: 15844 // result: x 15845 for { 15846 x := v.Args[0] 15847 v.reset(OpCopy) 15848 v.Type = x.Type 15849 v.AddArg(x) 15850 return true 15851 } 15852 } 15853 func rewriteValueARM_OpRound64F(v *Value) bool { 15854 // match: (Round64F x) 15855 // cond: 15856 // result: x 15857 for { 15858 x := v.Args[0] 15859 v.reset(OpCopy) 15860 v.Type = x.Type 15861 v.AddArg(x) 15862 return true 15863 } 15864 } 15865 func rewriteValueARM_OpRsh16Ux16(v *Value) bool { 15866 b := v.Block 15867 _ = b 15868 types := &b.Func.Config.Types 15869 _ = types 15870 // match: (Rsh16Ux16 x y) 15871 // cond: 15872 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15873 for { 15874 x := v.Args[0] 15875 y := v.Args[1] 15876 v.reset(OpARMCMOVWHSconst) 15877 v.AuxInt = 0 15878 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15879 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15880 v1.AddArg(x) 15881 v0.AddArg(v1) 15882 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15883 v2.AddArg(y) 15884 v0.AddArg(v2) 15885 v.AddArg(v0) 15886 v3 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15887 v3.AuxInt = 256 15888 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15889 v4.AddArg(y) 15890 v3.AddArg(v4) 15891 v.AddArg(v3) 15892 return true 15893 } 15894 } 15895 func rewriteValueARM_OpRsh16Ux32(v *Value) bool { 15896 b := v.Block 15897 _ = b 15898 types := &b.Func.Config.Types 15899 _ = types 15900 // match: (Rsh16Ux32 x y) 15901 // cond: 15902 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 15903 for { 15904 x := v.Args[0] 15905 y := v.Args[1] 15906 v.reset(OpARMCMOVWHSconst) 15907 v.AuxInt = 0 15908 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15909 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15910 v1.AddArg(x) 15911 v0.AddArg(v1) 15912 v0.AddArg(y) 15913 v.AddArg(v0) 15914 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15915 v2.AuxInt = 256 15916 v2.AddArg(y) 15917 v.AddArg(v2) 15918 return true 15919 } 15920 } 15921 func rewriteValueARM_OpRsh16Ux64(v *Value) bool { 15922 b := v.Block 15923 _ = b 15924 types := &b.Func.Config.Types 15925 _ = types 15926 // match: (Rsh16Ux64 x (Const64 [c])) 15927 // cond: uint64(c) < 16 15928 // result: (SRLconst (SLLconst <types.UInt32> x [16]) [c+16]) 15929 for { 15930 x := v.Args[0] 15931 v_1 := v.Args[1] 15932 if v_1.Op != OpConst64 { 15933 break 15934 } 15935 c := v_1.AuxInt 15936 if !(uint64(c) < 16) { 15937 break 15938 } 15939 v.reset(OpARMSRLconst) 15940 v.AuxInt = c + 16 15941 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 15942 v0.AuxInt = 16 15943 v0.AddArg(x) 15944 v.AddArg(v0) 15945 return true 15946 } 15947 // match: (Rsh16Ux64 _ (Const64 [c])) 15948 // cond: uint64(c) >= 16 15949 // result: (Const16 [0]) 15950 for { 15951 v_1 := v.Args[1] 15952 if v_1.Op != OpConst64 { 15953 break 15954 } 15955 c := v_1.AuxInt 15956 if !(uint64(c) >= 16) { 15957 break 15958 } 15959 v.reset(OpConst16) 15960 v.AuxInt = 0 15961 return true 15962 } 15963 return false 15964 } 15965 func rewriteValueARM_OpRsh16Ux8(v *Value) bool { 15966 b := v.Block 15967 _ = b 15968 types := &b.Func.Config.Types 15969 _ = types 15970 // match: (Rsh16Ux8 x y) 15971 // cond: 15972 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 15973 for { 15974 x := v.Args[0] 15975 y := v.Args[1] 15976 v.reset(OpARMSRL) 15977 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15978 v0.AddArg(x) 15979 v.AddArg(v0) 15980 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15981 v1.AddArg(y) 15982 v.AddArg(v1) 15983 return true 15984 } 15985 } 15986 func rewriteValueARM_OpRsh16x16(v *Value) bool { 15987 b := v.Block 15988 _ = b 15989 types := &b.Func.Config.Types 15990 _ = types 15991 // match: (Rsh16x16 x y) 15992 // cond: 15993 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15994 for { 15995 x := v.Args[0] 15996 y := v.Args[1] 15997 v.reset(OpARMSRAcond) 15998 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 15999 v0.AddArg(x) 16000 v.AddArg(v0) 16001 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16002 v1.AddArg(y) 16003 v.AddArg(v1) 16004 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16005 v2.AuxInt = 256 16006 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16007 v3.AddArg(y) 16008 v2.AddArg(v3) 16009 v.AddArg(v2) 16010 return true 16011 } 16012 } 16013 func rewriteValueARM_OpRsh16x32(v *Value) bool { 16014 b := v.Block 16015 _ = b 16016 types := &b.Func.Config.Types 16017 _ = types 16018 // match: (Rsh16x32 x y) 16019 // cond: 16020 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 16021 for { 16022 x := v.Args[0] 16023 y := v.Args[1] 16024 v.reset(OpARMSRAcond) 16025 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 16026 v0.AddArg(x) 16027 v.AddArg(v0) 16028 v.AddArg(y) 16029 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16030 v1.AuxInt = 256 16031 v1.AddArg(y) 16032 v.AddArg(v1) 16033 return true 16034 } 16035 } 16036 func rewriteValueARM_OpRsh16x64(v *Value) bool { 16037 b := v.Block 16038 _ = b 16039 types := &b.Func.Config.Types 16040 _ = types 16041 // match: (Rsh16x64 x (Const64 [c])) 16042 // cond: uint64(c) < 16 16043 // result: (SRAconst (SLLconst <types.UInt32> x [16]) [c+16]) 16044 for { 16045 x := v.Args[0] 16046 v_1 := v.Args[1] 16047 if v_1.Op != OpConst64 { 16048 break 16049 } 16050 c := v_1.AuxInt 16051 if !(uint64(c) < 16) { 16052 break 16053 } 16054 v.reset(OpARMSRAconst) 16055 v.AuxInt = c + 16 16056 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16057 v0.AuxInt = 16 16058 v0.AddArg(x) 16059 v.AddArg(v0) 16060 return true 16061 } 16062 // match: (Rsh16x64 x (Const64 [c])) 16063 // cond: uint64(c) >= 16 16064 // result: (SRAconst (SLLconst <types.UInt32> x [16]) [31]) 16065 for { 16066 x := v.Args[0] 16067 v_1 := v.Args[1] 16068 if v_1.Op != OpConst64 { 16069 break 16070 } 16071 c := v_1.AuxInt 16072 if !(uint64(c) >= 16) { 16073 break 16074 } 16075 v.reset(OpARMSRAconst) 16076 v.AuxInt = 31 16077 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16078 v0.AuxInt = 16 16079 v0.AddArg(x) 16080 v.AddArg(v0) 16081 return true 16082 } 16083 return false 16084 } 16085 func rewriteValueARM_OpRsh16x8(v *Value) bool { 16086 b := v.Block 16087 _ = b 16088 types := &b.Func.Config.Types 16089 _ = types 16090 // match: (Rsh16x8 x y) 16091 // cond: 16092 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 16093 for { 16094 x := v.Args[0] 16095 y := v.Args[1] 16096 v.reset(OpARMSRA) 16097 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 16098 v0.AddArg(x) 16099 v.AddArg(v0) 16100 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16101 v1.AddArg(y) 16102 v.AddArg(v1) 16103 return true 16104 } 16105 } 16106 func rewriteValueARM_OpRsh32Ux16(v *Value) bool { 16107 b := v.Block 16108 _ = b 16109 types := &b.Func.Config.Types 16110 _ = types 16111 // match: (Rsh32Ux16 x y) 16112 // cond: 16113 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 16114 for { 16115 x := v.Args[0] 16116 y := v.Args[1] 16117 v.reset(OpARMCMOVWHSconst) 16118 v.AuxInt = 0 16119 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16120 v0.AddArg(x) 16121 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16122 v1.AddArg(y) 16123 v0.AddArg(v1) 16124 v.AddArg(v0) 16125 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16126 v2.AuxInt = 256 16127 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16128 v3.AddArg(y) 16129 v2.AddArg(v3) 16130 v.AddArg(v2) 16131 return true 16132 } 16133 } 16134 func rewriteValueARM_OpRsh32Ux32(v *Value) bool { 16135 b := v.Block 16136 _ = b 16137 // match: (Rsh32Ux32 x y) 16138 // cond: 16139 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 16140 for { 16141 x := v.Args[0] 16142 y := v.Args[1] 16143 v.reset(OpARMCMOVWHSconst) 16144 v.AuxInt = 0 16145 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16146 v0.AddArg(x) 16147 v0.AddArg(y) 16148 v.AddArg(v0) 16149 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16150 v1.AuxInt = 256 16151 v1.AddArg(y) 16152 v.AddArg(v1) 16153 return true 16154 } 16155 } 16156 func rewriteValueARM_OpRsh32Ux64(v *Value) bool { 16157 // match: (Rsh32Ux64 x (Const64 [c])) 16158 // cond: uint64(c) < 32 16159 // result: (SRLconst x [c]) 16160 for { 16161 x := v.Args[0] 16162 v_1 := v.Args[1] 16163 if v_1.Op != OpConst64 { 16164 break 16165 } 16166 c := v_1.AuxInt 16167 if !(uint64(c) < 32) { 16168 break 16169 } 16170 v.reset(OpARMSRLconst) 16171 v.AuxInt = c 16172 v.AddArg(x) 16173 return true 16174 } 16175 // match: (Rsh32Ux64 _ (Const64 [c])) 16176 // cond: uint64(c) >= 32 16177 // result: (Const32 [0]) 16178 for { 16179 v_1 := v.Args[1] 16180 if v_1.Op != OpConst64 { 16181 break 16182 } 16183 c := v_1.AuxInt 16184 if !(uint64(c) >= 32) { 16185 break 16186 } 16187 v.reset(OpConst32) 16188 v.AuxInt = 0 16189 return true 16190 } 16191 return false 16192 } 16193 func rewriteValueARM_OpRsh32Ux8(v *Value) bool { 16194 b := v.Block 16195 _ = b 16196 types := &b.Func.Config.Types 16197 _ = types 16198 // match: (Rsh32Ux8 x y) 16199 // cond: 16200 // result: (SRL x (ZeroExt8to32 y)) 16201 for { 16202 x := v.Args[0] 16203 y := v.Args[1] 16204 v.reset(OpARMSRL) 16205 v.AddArg(x) 16206 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16207 v0.AddArg(y) 16208 v.AddArg(v0) 16209 return true 16210 } 16211 } 16212 func rewriteValueARM_OpRsh32x16(v *Value) bool { 16213 b := v.Block 16214 _ = b 16215 types := &b.Func.Config.Types 16216 _ = types 16217 // match: (Rsh32x16 x y) 16218 // cond: 16219 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16220 for { 16221 x := v.Args[0] 16222 y := v.Args[1] 16223 v.reset(OpARMSRAcond) 16224 v.AddArg(x) 16225 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16226 v0.AddArg(y) 16227 v.AddArg(v0) 16228 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16229 v1.AuxInt = 256 16230 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16231 v2.AddArg(y) 16232 v1.AddArg(v2) 16233 v.AddArg(v1) 16234 return true 16235 } 16236 } 16237 func rewriteValueARM_OpRsh32x32(v *Value) bool { 16238 b := v.Block 16239 _ = b 16240 // match: (Rsh32x32 x y) 16241 // cond: 16242 // result: (SRAcond x y (CMPconst [256] y)) 16243 for { 16244 x := v.Args[0] 16245 y := v.Args[1] 16246 v.reset(OpARMSRAcond) 16247 v.AddArg(x) 16248 v.AddArg(y) 16249 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16250 v0.AuxInt = 256 16251 v0.AddArg(y) 16252 v.AddArg(v0) 16253 return true 16254 } 16255 } 16256 func rewriteValueARM_OpRsh32x64(v *Value) bool { 16257 // match: (Rsh32x64 x (Const64 [c])) 16258 // cond: uint64(c) < 32 16259 // result: (SRAconst x [c]) 16260 for { 16261 x := v.Args[0] 16262 v_1 := v.Args[1] 16263 if v_1.Op != OpConst64 { 16264 break 16265 } 16266 c := v_1.AuxInt 16267 if !(uint64(c) < 32) { 16268 break 16269 } 16270 v.reset(OpARMSRAconst) 16271 v.AuxInt = c 16272 v.AddArg(x) 16273 return true 16274 } 16275 // match: (Rsh32x64 x (Const64 [c])) 16276 // cond: uint64(c) >= 32 16277 // result: (SRAconst x [31]) 16278 for { 16279 x := v.Args[0] 16280 v_1 := v.Args[1] 16281 if v_1.Op != OpConst64 { 16282 break 16283 } 16284 c := v_1.AuxInt 16285 if !(uint64(c) >= 32) { 16286 break 16287 } 16288 v.reset(OpARMSRAconst) 16289 v.AuxInt = 31 16290 v.AddArg(x) 16291 return true 16292 } 16293 return false 16294 } 16295 func rewriteValueARM_OpRsh32x8(v *Value) bool { 16296 b := v.Block 16297 _ = b 16298 types := &b.Func.Config.Types 16299 _ = types 16300 // match: (Rsh32x8 x y) 16301 // cond: 16302 // result: (SRA x (ZeroExt8to32 y)) 16303 for { 16304 x := v.Args[0] 16305 y := v.Args[1] 16306 v.reset(OpARMSRA) 16307 v.AddArg(x) 16308 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16309 v0.AddArg(y) 16310 v.AddArg(v0) 16311 return true 16312 } 16313 } 16314 func rewriteValueARM_OpRsh8Ux16(v *Value) bool { 16315 b := v.Block 16316 _ = b 16317 types := &b.Func.Config.Types 16318 _ = types 16319 // match: (Rsh8Ux16 x y) 16320 // cond: 16321 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 16322 for { 16323 x := v.Args[0] 16324 y := v.Args[1] 16325 v.reset(OpARMCMOVWHSconst) 16326 v.AuxInt = 0 16327 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16328 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16329 v1.AddArg(x) 16330 v0.AddArg(v1) 16331 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16332 v2.AddArg(y) 16333 v0.AddArg(v2) 16334 v.AddArg(v0) 16335 v3 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16336 v3.AuxInt = 256 16337 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16338 v4.AddArg(y) 16339 v3.AddArg(v4) 16340 v.AddArg(v3) 16341 return true 16342 } 16343 } 16344 func rewriteValueARM_OpRsh8Ux32(v *Value) bool { 16345 b := v.Block 16346 _ = b 16347 types := &b.Func.Config.Types 16348 _ = types 16349 // match: (Rsh8Ux32 x y) 16350 // cond: 16351 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 16352 for { 16353 x := v.Args[0] 16354 y := v.Args[1] 16355 v.reset(OpARMCMOVWHSconst) 16356 v.AuxInt = 0 16357 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16358 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16359 v1.AddArg(x) 16360 v0.AddArg(v1) 16361 v0.AddArg(y) 16362 v.AddArg(v0) 16363 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16364 v2.AuxInt = 256 16365 v2.AddArg(y) 16366 v.AddArg(v2) 16367 return true 16368 } 16369 } 16370 func rewriteValueARM_OpRsh8Ux64(v *Value) bool { 16371 b := v.Block 16372 _ = b 16373 types := &b.Func.Config.Types 16374 _ = types 16375 // match: (Rsh8Ux64 x (Const64 [c])) 16376 // cond: uint64(c) < 8 16377 // result: (SRLconst (SLLconst <types.UInt32> x [24]) [c+24]) 16378 for { 16379 x := v.Args[0] 16380 v_1 := v.Args[1] 16381 if v_1.Op != OpConst64 { 16382 break 16383 } 16384 c := v_1.AuxInt 16385 if !(uint64(c) < 8) { 16386 break 16387 } 16388 v.reset(OpARMSRLconst) 16389 v.AuxInt = c + 24 16390 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16391 v0.AuxInt = 24 16392 v0.AddArg(x) 16393 v.AddArg(v0) 16394 return true 16395 } 16396 // match: (Rsh8Ux64 _ (Const64 [c])) 16397 // cond: uint64(c) >= 8 16398 // result: (Const8 [0]) 16399 for { 16400 v_1 := v.Args[1] 16401 if v_1.Op != OpConst64 { 16402 break 16403 } 16404 c := v_1.AuxInt 16405 if !(uint64(c) >= 8) { 16406 break 16407 } 16408 v.reset(OpConst8) 16409 v.AuxInt = 0 16410 return true 16411 } 16412 return false 16413 } 16414 func rewriteValueARM_OpRsh8Ux8(v *Value) bool { 16415 b := v.Block 16416 _ = b 16417 types := &b.Func.Config.Types 16418 _ = types 16419 // match: (Rsh8Ux8 x y) 16420 // cond: 16421 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 16422 for { 16423 x := v.Args[0] 16424 y := v.Args[1] 16425 v.reset(OpARMSRL) 16426 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16427 v0.AddArg(x) 16428 v.AddArg(v0) 16429 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16430 v1.AddArg(y) 16431 v.AddArg(v1) 16432 return true 16433 } 16434 } 16435 func rewriteValueARM_OpRsh8x16(v *Value) bool { 16436 b := v.Block 16437 _ = b 16438 types := &b.Func.Config.Types 16439 _ = types 16440 // match: (Rsh8x16 x y) 16441 // cond: 16442 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16443 for { 16444 x := v.Args[0] 16445 y := v.Args[1] 16446 v.reset(OpARMSRAcond) 16447 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 16448 v0.AddArg(x) 16449 v.AddArg(v0) 16450 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16451 v1.AddArg(y) 16452 v.AddArg(v1) 16453 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16454 v2.AuxInt = 256 16455 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16456 v3.AddArg(y) 16457 v2.AddArg(v3) 16458 v.AddArg(v2) 16459 return true 16460 } 16461 } 16462 func rewriteValueARM_OpRsh8x32(v *Value) bool { 16463 b := v.Block 16464 _ = b 16465 types := &b.Func.Config.Types 16466 _ = types 16467 // match: (Rsh8x32 x y) 16468 // cond: 16469 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 16470 for { 16471 x := v.Args[0] 16472 y := v.Args[1] 16473 v.reset(OpARMSRAcond) 16474 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 16475 v0.AddArg(x) 16476 v.AddArg(v0) 16477 v.AddArg(y) 16478 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16479 v1.AuxInt = 256 16480 v1.AddArg(y) 16481 v.AddArg(v1) 16482 return true 16483 } 16484 } 16485 func rewriteValueARM_OpRsh8x64(v *Value) bool { 16486 b := v.Block 16487 _ = b 16488 types := &b.Func.Config.Types 16489 _ = types 16490 // match: (Rsh8x64 x (Const64 [c])) 16491 // cond: uint64(c) < 8 16492 // result: (SRAconst (SLLconst <types.UInt32> x [24]) [c+24]) 16493 for { 16494 x := v.Args[0] 16495 v_1 := v.Args[1] 16496 if v_1.Op != OpConst64 { 16497 break 16498 } 16499 c := v_1.AuxInt 16500 if !(uint64(c) < 8) { 16501 break 16502 } 16503 v.reset(OpARMSRAconst) 16504 v.AuxInt = c + 24 16505 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16506 v0.AuxInt = 24 16507 v0.AddArg(x) 16508 v.AddArg(v0) 16509 return true 16510 } 16511 // match: (Rsh8x64 x (Const64 [c])) 16512 // cond: uint64(c) >= 8 16513 // result: (SRAconst (SLLconst <types.UInt32> x [24]) [31]) 16514 for { 16515 x := v.Args[0] 16516 v_1 := v.Args[1] 16517 if v_1.Op != OpConst64 { 16518 break 16519 } 16520 c := v_1.AuxInt 16521 if !(uint64(c) >= 8) { 16522 break 16523 } 16524 v.reset(OpARMSRAconst) 16525 v.AuxInt = 31 16526 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16527 v0.AuxInt = 24 16528 v0.AddArg(x) 16529 v.AddArg(v0) 16530 return true 16531 } 16532 return false 16533 } 16534 func rewriteValueARM_OpRsh8x8(v *Value) bool { 16535 b := v.Block 16536 _ = b 16537 types := &b.Func.Config.Types 16538 _ = types 16539 // match: (Rsh8x8 x y) 16540 // cond: 16541 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 16542 for { 16543 x := v.Args[0] 16544 y := v.Args[1] 16545 v.reset(OpARMSRA) 16546 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 16547 v0.AddArg(x) 16548 v.AddArg(v0) 16549 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16550 v1.AddArg(y) 16551 v.AddArg(v1) 16552 return true 16553 } 16554 } 16555 func rewriteValueARM_OpSelect0(v *Value) bool { 16556 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 16557 // cond: 16558 // result: x 16559 for { 16560 v_0 := v.Args[0] 16561 if v_0.Op != OpARMCALLudiv { 16562 break 16563 } 16564 x := v_0.Args[0] 16565 v_0_1 := v_0.Args[1] 16566 if v_0_1.Op != OpARMMOVWconst { 16567 break 16568 } 16569 if v_0_1.AuxInt != 1 { 16570 break 16571 } 16572 v.reset(OpCopy) 16573 v.Type = x.Type 16574 v.AddArg(x) 16575 return true 16576 } 16577 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 16578 // cond: isPowerOfTwo(c) 16579 // result: (SRLconst [log2(c)] x) 16580 for { 16581 v_0 := v.Args[0] 16582 if v_0.Op != OpARMCALLudiv { 16583 break 16584 } 16585 x := v_0.Args[0] 16586 v_0_1 := v_0.Args[1] 16587 if v_0_1.Op != OpARMMOVWconst { 16588 break 16589 } 16590 c := v_0_1.AuxInt 16591 if !(isPowerOfTwo(c)) { 16592 break 16593 } 16594 v.reset(OpARMSRLconst) 16595 v.AuxInt = log2(c) 16596 v.AddArg(x) 16597 return true 16598 } 16599 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 16600 // cond: 16601 // result: (MOVWconst [int64(uint32(c)/uint32(d))]) 16602 for { 16603 v_0 := v.Args[0] 16604 if v_0.Op != OpARMCALLudiv { 16605 break 16606 } 16607 v_0_0 := v_0.Args[0] 16608 if v_0_0.Op != OpARMMOVWconst { 16609 break 16610 } 16611 c := v_0_0.AuxInt 16612 v_0_1 := v_0.Args[1] 16613 if v_0_1.Op != OpARMMOVWconst { 16614 break 16615 } 16616 d := v_0_1.AuxInt 16617 v.reset(OpARMMOVWconst) 16618 v.AuxInt = int64(uint32(c) / uint32(d)) 16619 return true 16620 } 16621 return false 16622 } 16623 func rewriteValueARM_OpSelect1(v *Value) bool { 16624 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 16625 // cond: 16626 // result: (MOVWconst [0]) 16627 for { 16628 v_0 := v.Args[0] 16629 if v_0.Op != OpARMCALLudiv { 16630 break 16631 } 16632 v_0_1 := v_0.Args[1] 16633 if v_0_1.Op != OpARMMOVWconst { 16634 break 16635 } 16636 if v_0_1.AuxInt != 1 { 16637 break 16638 } 16639 v.reset(OpARMMOVWconst) 16640 v.AuxInt = 0 16641 return true 16642 } 16643 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 16644 // cond: isPowerOfTwo(c) 16645 // result: (ANDconst [c-1] x) 16646 for { 16647 v_0 := v.Args[0] 16648 if v_0.Op != OpARMCALLudiv { 16649 break 16650 } 16651 x := v_0.Args[0] 16652 v_0_1 := v_0.Args[1] 16653 if v_0_1.Op != OpARMMOVWconst { 16654 break 16655 } 16656 c := v_0_1.AuxInt 16657 if !(isPowerOfTwo(c)) { 16658 break 16659 } 16660 v.reset(OpARMANDconst) 16661 v.AuxInt = c - 1 16662 v.AddArg(x) 16663 return true 16664 } 16665 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 16666 // cond: 16667 // result: (MOVWconst [int64(uint32(c)%uint32(d))]) 16668 for { 16669 v_0 := v.Args[0] 16670 if v_0.Op != OpARMCALLudiv { 16671 break 16672 } 16673 v_0_0 := v_0.Args[0] 16674 if v_0_0.Op != OpARMMOVWconst { 16675 break 16676 } 16677 c := v_0_0.AuxInt 16678 v_0_1 := v_0.Args[1] 16679 if v_0_1.Op != OpARMMOVWconst { 16680 break 16681 } 16682 d := v_0_1.AuxInt 16683 v.reset(OpARMMOVWconst) 16684 v.AuxInt = int64(uint32(c) % uint32(d)) 16685 return true 16686 } 16687 return false 16688 } 16689 func rewriteValueARM_OpSignExt16to32(v *Value) bool { 16690 // match: (SignExt16to32 x) 16691 // cond: 16692 // result: (MOVHreg x) 16693 for { 16694 x := v.Args[0] 16695 v.reset(OpARMMOVHreg) 16696 v.AddArg(x) 16697 return true 16698 } 16699 } 16700 func rewriteValueARM_OpSignExt8to16(v *Value) bool { 16701 // match: (SignExt8to16 x) 16702 // cond: 16703 // result: (MOVBreg x) 16704 for { 16705 x := v.Args[0] 16706 v.reset(OpARMMOVBreg) 16707 v.AddArg(x) 16708 return true 16709 } 16710 } 16711 func rewriteValueARM_OpSignExt8to32(v *Value) bool { 16712 // match: (SignExt8to32 x) 16713 // cond: 16714 // result: (MOVBreg x) 16715 for { 16716 x := v.Args[0] 16717 v.reset(OpARMMOVBreg) 16718 v.AddArg(x) 16719 return true 16720 } 16721 } 16722 func rewriteValueARM_OpSignmask(v *Value) bool { 16723 // match: (Signmask x) 16724 // cond: 16725 // result: (SRAconst x [31]) 16726 for { 16727 x := v.Args[0] 16728 v.reset(OpARMSRAconst) 16729 v.AuxInt = 31 16730 v.AddArg(x) 16731 return true 16732 } 16733 } 16734 func rewriteValueARM_OpSlicemask(v *Value) bool { 16735 b := v.Block 16736 _ = b 16737 // match: (Slicemask <t> x) 16738 // cond: 16739 // result: (SRAconst (RSBconst <t> [0] x) [31]) 16740 for { 16741 t := v.Type 16742 x := v.Args[0] 16743 v.reset(OpARMSRAconst) 16744 v.AuxInt = 31 16745 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 16746 v0.AuxInt = 0 16747 v0.AddArg(x) 16748 v.AddArg(v0) 16749 return true 16750 } 16751 } 16752 func rewriteValueARM_OpSqrt(v *Value) bool { 16753 // match: (Sqrt x) 16754 // cond: 16755 // result: (SQRTD x) 16756 for { 16757 x := v.Args[0] 16758 v.reset(OpARMSQRTD) 16759 v.AddArg(x) 16760 return true 16761 } 16762 } 16763 func rewriteValueARM_OpStaticCall(v *Value) bool { 16764 // match: (StaticCall [argwid] {target} mem) 16765 // cond: 16766 // result: (CALLstatic [argwid] {target} mem) 16767 for { 16768 argwid := v.AuxInt 16769 target := v.Aux 16770 mem := v.Args[0] 16771 v.reset(OpARMCALLstatic) 16772 v.AuxInt = argwid 16773 v.Aux = target 16774 v.AddArg(mem) 16775 return true 16776 } 16777 } 16778 func rewriteValueARM_OpStore(v *Value) bool { 16779 // match: (Store {t} ptr val mem) 16780 // cond: t.(Type).Size() == 1 16781 // result: (MOVBstore ptr val mem) 16782 for { 16783 t := v.Aux 16784 ptr := v.Args[0] 16785 val := v.Args[1] 16786 mem := v.Args[2] 16787 if !(t.(Type).Size() == 1) { 16788 break 16789 } 16790 v.reset(OpARMMOVBstore) 16791 v.AddArg(ptr) 16792 v.AddArg(val) 16793 v.AddArg(mem) 16794 return true 16795 } 16796 // match: (Store {t} ptr val mem) 16797 // cond: t.(Type).Size() == 2 16798 // result: (MOVHstore ptr val mem) 16799 for { 16800 t := v.Aux 16801 ptr := v.Args[0] 16802 val := v.Args[1] 16803 mem := v.Args[2] 16804 if !(t.(Type).Size() == 2) { 16805 break 16806 } 16807 v.reset(OpARMMOVHstore) 16808 v.AddArg(ptr) 16809 v.AddArg(val) 16810 v.AddArg(mem) 16811 return true 16812 } 16813 // match: (Store {t} ptr val mem) 16814 // cond: t.(Type).Size() == 4 && !is32BitFloat(val.Type) 16815 // result: (MOVWstore ptr val mem) 16816 for { 16817 t := v.Aux 16818 ptr := v.Args[0] 16819 val := v.Args[1] 16820 mem := v.Args[2] 16821 if !(t.(Type).Size() == 4 && !is32BitFloat(val.Type)) { 16822 break 16823 } 16824 v.reset(OpARMMOVWstore) 16825 v.AddArg(ptr) 16826 v.AddArg(val) 16827 v.AddArg(mem) 16828 return true 16829 } 16830 // match: (Store {t} ptr val mem) 16831 // cond: t.(Type).Size() == 4 && is32BitFloat(val.Type) 16832 // result: (MOVFstore ptr val mem) 16833 for { 16834 t := v.Aux 16835 ptr := v.Args[0] 16836 val := v.Args[1] 16837 mem := v.Args[2] 16838 if !(t.(Type).Size() == 4 && is32BitFloat(val.Type)) { 16839 break 16840 } 16841 v.reset(OpARMMOVFstore) 16842 v.AddArg(ptr) 16843 v.AddArg(val) 16844 v.AddArg(mem) 16845 return true 16846 } 16847 // match: (Store {t} ptr val mem) 16848 // cond: t.(Type).Size() == 8 && is64BitFloat(val.Type) 16849 // result: (MOVDstore ptr val mem) 16850 for { 16851 t := v.Aux 16852 ptr := v.Args[0] 16853 val := v.Args[1] 16854 mem := v.Args[2] 16855 if !(t.(Type).Size() == 8 && is64BitFloat(val.Type)) { 16856 break 16857 } 16858 v.reset(OpARMMOVDstore) 16859 v.AddArg(ptr) 16860 v.AddArg(val) 16861 v.AddArg(mem) 16862 return true 16863 } 16864 return false 16865 } 16866 func rewriteValueARM_OpSub16(v *Value) bool { 16867 // match: (Sub16 x y) 16868 // cond: 16869 // result: (SUB x y) 16870 for { 16871 x := v.Args[0] 16872 y := v.Args[1] 16873 v.reset(OpARMSUB) 16874 v.AddArg(x) 16875 v.AddArg(y) 16876 return true 16877 } 16878 } 16879 func rewriteValueARM_OpSub32(v *Value) bool { 16880 // match: (Sub32 x y) 16881 // cond: 16882 // result: (SUB x y) 16883 for { 16884 x := v.Args[0] 16885 y := v.Args[1] 16886 v.reset(OpARMSUB) 16887 v.AddArg(x) 16888 v.AddArg(y) 16889 return true 16890 } 16891 } 16892 func rewriteValueARM_OpSub32F(v *Value) bool { 16893 // match: (Sub32F x y) 16894 // cond: 16895 // result: (SUBF x y) 16896 for { 16897 x := v.Args[0] 16898 y := v.Args[1] 16899 v.reset(OpARMSUBF) 16900 v.AddArg(x) 16901 v.AddArg(y) 16902 return true 16903 } 16904 } 16905 func rewriteValueARM_OpSub32carry(v *Value) bool { 16906 // match: (Sub32carry x y) 16907 // cond: 16908 // result: (SUBS x y) 16909 for { 16910 x := v.Args[0] 16911 y := v.Args[1] 16912 v.reset(OpARMSUBS) 16913 v.AddArg(x) 16914 v.AddArg(y) 16915 return true 16916 } 16917 } 16918 func rewriteValueARM_OpSub32withcarry(v *Value) bool { 16919 // match: (Sub32withcarry x y c) 16920 // cond: 16921 // result: (SBC x y c) 16922 for { 16923 x := v.Args[0] 16924 y := v.Args[1] 16925 c := v.Args[2] 16926 v.reset(OpARMSBC) 16927 v.AddArg(x) 16928 v.AddArg(y) 16929 v.AddArg(c) 16930 return true 16931 } 16932 } 16933 func rewriteValueARM_OpSub64F(v *Value) bool { 16934 // match: (Sub64F x y) 16935 // cond: 16936 // result: (SUBD x y) 16937 for { 16938 x := v.Args[0] 16939 y := v.Args[1] 16940 v.reset(OpARMSUBD) 16941 v.AddArg(x) 16942 v.AddArg(y) 16943 return true 16944 } 16945 } 16946 func rewriteValueARM_OpSub8(v *Value) bool { 16947 // match: (Sub8 x y) 16948 // cond: 16949 // result: (SUB x y) 16950 for { 16951 x := v.Args[0] 16952 y := v.Args[1] 16953 v.reset(OpARMSUB) 16954 v.AddArg(x) 16955 v.AddArg(y) 16956 return true 16957 } 16958 } 16959 func rewriteValueARM_OpSubPtr(v *Value) bool { 16960 // match: (SubPtr x y) 16961 // cond: 16962 // result: (SUB x y) 16963 for { 16964 x := v.Args[0] 16965 y := v.Args[1] 16966 v.reset(OpARMSUB) 16967 v.AddArg(x) 16968 v.AddArg(y) 16969 return true 16970 } 16971 } 16972 func rewriteValueARM_OpTrunc16to8(v *Value) bool { 16973 // match: (Trunc16to8 x) 16974 // cond: 16975 // result: x 16976 for { 16977 x := v.Args[0] 16978 v.reset(OpCopy) 16979 v.Type = x.Type 16980 v.AddArg(x) 16981 return true 16982 } 16983 } 16984 func rewriteValueARM_OpTrunc32to16(v *Value) bool { 16985 // match: (Trunc32to16 x) 16986 // cond: 16987 // result: x 16988 for { 16989 x := v.Args[0] 16990 v.reset(OpCopy) 16991 v.Type = x.Type 16992 v.AddArg(x) 16993 return true 16994 } 16995 } 16996 func rewriteValueARM_OpTrunc32to8(v *Value) bool { 16997 // match: (Trunc32to8 x) 16998 // cond: 16999 // result: x 17000 for { 17001 x := v.Args[0] 17002 v.reset(OpCopy) 17003 v.Type = x.Type 17004 v.AddArg(x) 17005 return true 17006 } 17007 } 17008 func rewriteValueARM_OpXor16(v *Value) bool { 17009 // match: (Xor16 x y) 17010 // cond: 17011 // result: (XOR x y) 17012 for { 17013 x := v.Args[0] 17014 y := v.Args[1] 17015 v.reset(OpARMXOR) 17016 v.AddArg(x) 17017 v.AddArg(y) 17018 return true 17019 } 17020 } 17021 func rewriteValueARM_OpXor32(v *Value) bool { 17022 // match: (Xor32 x y) 17023 // cond: 17024 // result: (XOR x y) 17025 for { 17026 x := v.Args[0] 17027 y := v.Args[1] 17028 v.reset(OpARMXOR) 17029 v.AddArg(x) 17030 v.AddArg(y) 17031 return true 17032 } 17033 } 17034 func rewriteValueARM_OpXor8(v *Value) bool { 17035 // match: (Xor8 x y) 17036 // cond: 17037 // result: (XOR x y) 17038 for { 17039 x := v.Args[0] 17040 y := v.Args[1] 17041 v.reset(OpARMXOR) 17042 v.AddArg(x) 17043 v.AddArg(y) 17044 return true 17045 } 17046 } 17047 func rewriteValueARM_OpZero(v *Value) bool { 17048 b := v.Block 17049 _ = b 17050 config := b.Func.Config 17051 _ = config 17052 types := &b.Func.Config.Types 17053 _ = types 17054 // match: (Zero [0] _ mem) 17055 // cond: 17056 // result: mem 17057 for { 17058 if v.AuxInt != 0 { 17059 break 17060 } 17061 mem := v.Args[1] 17062 v.reset(OpCopy) 17063 v.Type = mem.Type 17064 v.AddArg(mem) 17065 return true 17066 } 17067 // match: (Zero [1] ptr mem) 17068 // cond: 17069 // result: (MOVBstore ptr (MOVWconst [0]) mem) 17070 for { 17071 if v.AuxInt != 1 { 17072 break 17073 } 17074 ptr := v.Args[0] 17075 mem := v.Args[1] 17076 v.reset(OpARMMOVBstore) 17077 v.AddArg(ptr) 17078 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17079 v0.AuxInt = 0 17080 v.AddArg(v0) 17081 v.AddArg(mem) 17082 return true 17083 } 17084 // match: (Zero [2] {t} ptr mem) 17085 // cond: t.(Type).Alignment()%2 == 0 17086 // result: (MOVHstore ptr (MOVWconst [0]) mem) 17087 for { 17088 if v.AuxInt != 2 { 17089 break 17090 } 17091 t := v.Aux 17092 ptr := v.Args[0] 17093 mem := v.Args[1] 17094 if !(t.(Type).Alignment()%2 == 0) { 17095 break 17096 } 17097 v.reset(OpARMMOVHstore) 17098 v.AddArg(ptr) 17099 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17100 v0.AuxInt = 0 17101 v.AddArg(v0) 17102 v.AddArg(mem) 17103 return true 17104 } 17105 // match: (Zero [2] ptr mem) 17106 // cond: 17107 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 17108 for { 17109 if v.AuxInt != 2 { 17110 break 17111 } 17112 ptr := v.Args[0] 17113 mem := v.Args[1] 17114 v.reset(OpARMMOVBstore) 17115 v.AuxInt = 1 17116 v.AddArg(ptr) 17117 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17118 v0.AuxInt = 0 17119 v.AddArg(v0) 17120 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17121 v1.AuxInt = 0 17122 v1.AddArg(ptr) 17123 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17124 v2.AuxInt = 0 17125 v1.AddArg(v2) 17126 v1.AddArg(mem) 17127 v.AddArg(v1) 17128 return true 17129 } 17130 // match: (Zero [4] {t} ptr mem) 17131 // cond: t.(Type).Alignment()%4 == 0 17132 // result: (MOVWstore ptr (MOVWconst [0]) mem) 17133 for { 17134 if v.AuxInt != 4 { 17135 break 17136 } 17137 t := v.Aux 17138 ptr := v.Args[0] 17139 mem := v.Args[1] 17140 if !(t.(Type).Alignment()%4 == 0) { 17141 break 17142 } 17143 v.reset(OpARMMOVWstore) 17144 v.AddArg(ptr) 17145 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17146 v0.AuxInt = 0 17147 v.AddArg(v0) 17148 v.AddArg(mem) 17149 return true 17150 } 17151 // match: (Zero [4] {t} ptr mem) 17152 // cond: t.(Type).Alignment()%2 == 0 17153 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 17154 for { 17155 if v.AuxInt != 4 { 17156 break 17157 } 17158 t := v.Aux 17159 ptr := v.Args[0] 17160 mem := v.Args[1] 17161 if !(t.(Type).Alignment()%2 == 0) { 17162 break 17163 } 17164 v.reset(OpARMMOVHstore) 17165 v.AuxInt = 2 17166 v.AddArg(ptr) 17167 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17168 v0.AuxInt = 0 17169 v.AddArg(v0) 17170 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, TypeMem) 17171 v1.AuxInt = 0 17172 v1.AddArg(ptr) 17173 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17174 v2.AuxInt = 0 17175 v1.AddArg(v2) 17176 v1.AddArg(mem) 17177 v.AddArg(v1) 17178 return true 17179 } 17180 // match: (Zero [4] ptr mem) 17181 // cond: 17182 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 17183 for { 17184 if v.AuxInt != 4 { 17185 break 17186 } 17187 ptr := v.Args[0] 17188 mem := v.Args[1] 17189 v.reset(OpARMMOVBstore) 17190 v.AuxInt = 3 17191 v.AddArg(ptr) 17192 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17193 v0.AuxInt = 0 17194 v.AddArg(v0) 17195 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17196 v1.AuxInt = 2 17197 v1.AddArg(ptr) 17198 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17199 v2.AuxInt = 0 17200 v1.AddArg(v2) 17201 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17202 v3.AuxInt = 1 17203 v3.AddArg(ptr) 17204 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17205 v4.AuxInt = 0 17206 v3.AddArg(v4) 17207 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17208 v5.AuxInt = 0 17209 v5.AddArg(ptr) 17210 v6 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17211 v6.AuxInt = 0 17212 v5.AddArg(v6) 17213 v5.AddArg(mem) 17214 v3.AddArg(v5) 17215 v1.AddArg(v3) 17216 v.AddArg(v1) 17217 return true 17218 } 17219 // match: (Zero [3] ptr mem) 17220 // cond: 17221 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 17222 for { 17223 if v.AuxInt != 3 { 17224 break 17225 } 17226 ptr := v.Args[0] 17227 mem := v.Args[1] 17228 v.reset(OpARMMOVBstore) 17229 v.AuxInt = 2 17230 v.AddArg(ptr) 17231 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17232 v0.AuxInt = 0 17233 v.AddArg(v0) 17234 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17235 v1.AuxInt = 1 17236 v1.AddArg(ptr) 17237 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17238 v2.AuxInt = 0 17239 v1.AddArg(v2) 17240 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17241 v3.AuxInt = 0 17242 v3.AddArg(ptr) 17243 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17244 v4.AuxInt = 0 17245 v3.AddArg(v4) 17246 v3.AddArg(mem) 17247 v1.AddArg(v3) 17248 v.AddArg(v1) 17249 return true 17250 } 17251 // match: (Zero [s] {t} ptr mem) 17252 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(Type).Alignment()%4 == 0 && !config.noDuffDevice 17253 // result: (DUFFZERO [4 * (128 - int64(s/4))] ptr (MOVWconst [0]) mem) 17254 for { 17255 s := v.AuxInt 17256 t := v.Aux 17257 ptr := v.Args[0] 17258 mem := v.Args[1] 17259 if !(s%4 == 0 && s > 4 && s <= 512 && t.(Type).Alignment()%4 == 0 && !config.noDuffDevice) { 17260 break 17261 } 17262 v.reset(OpARMDUFFZERO) 17263 v.AuxInt = 4 * (128 - int64(s/4)) 17264 v.AddArg(ptr) 17265 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17266 v0.AuxInt = 0 17267 v.AddArg(v0) 17268 v.AddArg(mem) 17269 return true 17270 } 17271 // match: (Zero [s] {t} ptr mem) 17272 // cond: (s > 512 || config.noDuffDevice) || t.(Type).Alignment()%4 != 0 17273 // result: (LoweredZero [t.(Type).Alignment()] ptr (ADDconst <ptr.Type> ptr [s-moveSize(t.(Type).Alignment(), config)]) (MOVWconst [0]) mem) 17274 for { 17275 s := v.AuxInt 17276 t := v.Aux 17277 ptr := v.Args[0] 17278 mem := v.Args[1] 17279 if !((s > 512 || config.noDuffDevice) || t.(Type).Alignment()%4 != 0) { 17280 break 17281 } 17282 v.reset(OpARMLoweredZero) 17283 v.AuxInt = t.(Type).Alignment() 17284 v.AddArg(ptr) 17285 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 17286 v0.AuxInt = s - moveSize(t.(Type).Alignment(), config) 17287 v0.AddArg(ptr) 17288 v.AddArg(v0) 17289 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17290 v1.AuxInt = 0 17291 v.AddArg(v1) 17292 v.AddArg(mem) 17293 return true 17294 } 17295 return false 17296 } 17297 func rewriteValueARM_OpZeroExt16to32(v *Value) bool { 17298 // match: (ZeroExt16to32 x) 17299 // cond: 17300 // result: (MOVHUreg x) 17301 for { 17302 x := v.Args[0] 17303 v.reset(OpARMMOVHUreg) 17304 v.AddArg(x) 17305 return true 17306 } 17307 } 17308 func rewriteValueARM_OpZeroExt8to16(v *Value) bool { 17309 // match: (ZeroExt8to16 x) 17310 // cond: 17311 // result: (MOVBUreg x) 17312 for { 17313 x := v.Args[0] 17314 v.reset(OpARMMOVBUreg) 17315 v.AddArg(x) 17316 return true 17317 } 17318 } 17319 func rewriteValueARM_OpZeroExt8to32(v *Value) bool { 17320 // match: (ZeroExt8to32 x) 17321 // cond: 17322 // result: (MOVBUreg x) 17323 for { 17324 x := v.Args[0] 17325 v.reset(OpARMMOVBUreg) 17326 v.AddArg(x) 17327 return true 17328 } 17329 } 17330 func rewriteValueARM_OpZeromask(v *Value) bool { 17331 b := v.Block 17332 _ = b 17333 types := &b.Func.Config.Types 17334 _ = types 17335 // match: (Zeromask x) 17336 // cond: 17337 // result: (SRAconst (RSBshiftRL <types.Int32> x x [1]) [31]) 17338 for { 17339 x := v.Args[0] 17340 v.reset(OpARMSRAconst) 17341 v.AuxInt = 31 17342 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, types.Int32) 17343 v0.AuxInt = 1 17344 v0.AddArg(x) 17345 v0.AddArg(x) 17346 v.AddArg(v0) 17347 return true 17348 } 17349 } 17350 func rewriteBlockARM(b *Block) bool { 17351 config := b.Func.Config 17352 _ = config 17353 fe := b.Func.fe 17354 _ = fe 17355 types := &config.Types 17356 _ = types 17357 switch b.Kind { 17358 case BlockARMEQ: 17359 // match: (EQ (FlagEQ) yes no) 17360 // cond: 17361 // result: (First nil yes no) 17362 for { 17363 v := b.Control 17364 if v.Op != OpARMFlagEQ { 17365 break 17366 } 17367 yes := b.Succs[0] 17368 no := b.Succs[1] 17369 b.Kind = BlockFirst 17370 b.SetControl(nil) 17371 _ = yes 17372 _ = no 17373 return true 17374 } 17375 // match: (EQ (FlagLT_ULT) yes no) 17376 // cond: 17377 // result: (First nil no yes) 17378 for { 17379 v := b.Control 17380 if v.Op != OpARMFlagLT_ULT { 17381 break 17382 } 17383 yes := b.Succs[0] 17384 no := b.Succs[1] 17385 b.Kind = BlockFirst 17386 b.SetControl(nil) 17387 b.swapSuccessors() 17388 _ = no 17389 _ = yes 17390 return true 17391 } 17392 // match: (EQ (FlagLT_UGT) yes no) 17393 // cond: 17394 // result: (First nil no yes) 17395 for { 17396 v := b.Control 17397 if v.Op != OpARMFlagLT_UGT { 17398 break 17399 } 17400 yes := b.Succs[0] 17401 no := b.Succs[1] 17402 b.Kind = BlockFirst 17403 b.SetControl(nil) 17404 b.swapSuccessors() 17405 _ = no 17406 _ = yes 17407 return true 17408 } 17409 // match: (EQ (FlagGT_ULT) yes no) 17410 // cond: 17411 // result: (First nil no yes) 17412 for { 17413 v := b.Control 17414 if v.Op != OpARMFlagGT_ULT { 17415 break 17416 } 17417 yes := b.Succs[0] 17418 no := b.Succs[1] 17419 b.Kind = BlockFirst 17420 b.SetControl(nil) 17421 b.swapSuccessors() 17422 _ = no 17423 _ = yes 17424 return true 17425 } 17426 // match: (EQ (FlagGT_UGT) yes no) 17427 // cond: 17428 // result: (First nil no yes) 17429 for { 17430 v := b.Control 17431 if v.Op != OpARMFlagGT_UGT { 17432 break 17433 } 17434 yes := b.Succs[0] 17435 no := b.Succs[1] 17436 b.Kind = BlockFirst 17437 b.SetControl(nil) 17438 b.swapSuccessors() 17439 _ = no 17440 _ = yes 17441 return true 17442 } 17443 // match: (EQ (InvertFlags cmp) yes no) 17444 // cond: 17445 // result: (EQ cmp yes no) 17446 for { 17447 v := b.Control 17448 if v.Op != OpARMInvertFlags { 17449 break 17450 } 17451 cmp := v.Args[0] 17452 yes := b.Succs[0] 17453 no := b.Succs[1] 17454 b.Kind = BlockARMEQ 17455 b.SetControl(cmp) 17456 _ = yes 17457 _ = no 17458 return true 17459 } 17460 case BlockARMGE: 17461 // match: (GE (FlagEQ) yes no) 17462 // cond: 17463 // result: (First nil yes no) 17464 for { 17465 v := b.Control 17466 if v.Op != OpARMFlagEQ { 17467 break 17468 } 17469 yes := b.Succs[0] 17470 no := b.Succs[1] 17471 b.Kind = BlockFirst 17472 b.SetControl(nil) 17473 _ = yes 17474 _ = no 17475 return true 17476 } 17477 // match: (GE (FlagLT_ULT) yes no) 17478 // cond: 17479 // result: (First nil no yes) 17480 for { 17481 v := b.Control 17482 if v.Op != OpARMFlagLT_ULT { 17483 break 17484 } 17485 yes := b.Succs[0] 17486 no := b.Succs[1] 17487 b.Kind = BlockFirst 17488 b.SetControl(nil) 17489 b.swapSuccessors() 17490 _ = no 17491 _ = yes 17492 return true 17493 } 17494 // match: (GE (FlagLT_UGT) yes no) 17495 // cond: 17496 // result: (First nil no yes) 17497 for { 17498 v := b.Control 17499 if v.Op != OpARMFlagLT_UGT { 17500 break 17501 } 17502 yes := b.Succs[0] 17503 no := b.Succs[1] 17504 b.Kind = BlockFirst 17505 b.SetControl(nil) 17506 b.swapSuccessors() 17507 _ = no 17508 _ = yes 17509 return true 17510 } 17511 // match: (GE (FlagGT_ULT) yes no) 17512 // cond: 17513 // result: (First nil yes no) 17514 for { 17515 v := b.Control 17516 if v.Op != OpARMFlagGT_ULT { 17517 break 17518 } 17519 yes := b.Succs[0] 17520 no := b.Succs[1] 17521 b.Kind = BlockFirst 17522 b.SetControl(nil) 17523 _ = yes 17524 _ = no 17525 return true 17526 } 17527 // match: (GE (FlagGT_UGT) yes no) 17528 // cond: 17529 // result: (First nil yes no) 17530 for { 17531 v := b.Control 17532 if v.Op != OpARMFlagGT_UGT { 17533 break 17534 } 17535 yes := b.Succs[0] 17536 no := b.Succs[1] 17537 b.Kind = BlockFirst 17538 b.SetControl(nil) 17539 _ = yes 17540 _ = no 17541 return true 17542 } 17543 // match: (GE (InvertFlags cmp) yes no) 17544 // cond: 17545 // result: (LE cmp yes no) 17546 for { 17547 v := b.Control 17548 if v.Op != OpARMInvertFlags { 17549 break 17550 } 17551 cmp := v.Args[0] 17552 yes := b.Succs[0] 17553 no := b.Succs[1] 17554 b.Kind = BlockARMLE 17555 b.SetControl(cmp) 17556 _ = yes 17557 _ = no 17558 return true 17559 } 17560 case BlockARMGT: 17561 // match: (GT (FlagEQ) yes no) 17562 // cond: 17563 // result: (First nil no yes) 17564 for { 17565 v := b.Control 17566 if v.Op != OpARMFlagEQ { 17567 break 17568 } 17569 yes := b.Succs[0] 17570 no := b.Succs[1] 17571 b.Kind = BlockFirst 17572 b.SetControl(nil) 17573 b.swapSuccessors() 17574 _ = no 17575 _ = yes 17576 return true 17577 } 17578 // match: (GT (FlagLT_ULT) yes no) 17579 // cond: 17580 // result: (First nil no yes) 17581 for { 17582 v := b.Control 17583 if v.Op != OpARMFlagLT_ULT { 17584 break 17585 } 17586 yes := b.Succs[0] 17587 no := b.Succs[1] 17588 b.Kind = BlockFirst 17589 b.SetControl(nil) 17590 b.swapSuccessors() 17591 _ = no 17592 _ = yes 17593 return true 17594 } 17595 // match: (GT (FlagLT_UGT) yes no) 17596 // cond: 17597 // result: (First nil no yes) 17598 for { 17599 v := b.Control 17600 if v.Op != OpARMFlagLT_UGT { 17601 break 17602 } 17603 yes := b.Succs[0] 17604 no := b.Succs[1] 17605 b.Kind = BlockFirst 17606 b.SetControl(nil) 17607 b.swapSuccessors() 17608 _ = no 17609 _ = yes 17610 return true 17611 } 17612 // match: (GT (FlagGT_ULT) yes no) 17613 // cond: 17614 // result: (First nil yes no) 17615 for { 17616 v := b.Control 17617 if v.Op != OpARMFlagGT_ULT { 17618 break 17619 } 17620 yes := b.Succs[0] 17621 no := b.Succs[1] 17622 b.Kind = BlockFirst 17623 b.SetControl(nil) 17624 _ = yes 17625 _ = no 17626 return true 17627 } 17628 // match: (GT (FlagGT_UGT) yes no) 17629 // cond: 17630 // result: (First nil yes no) 17631 for { 17632 v := b.Control 17633 if v.Op != OpARMFlagGT_UGT { 17634 break 17635 } 17636 yes := b.Succs[0] 17637 no := b.Succs[1] 17638 b.Kind = BlockFirst 17639 b.SetControl(nil) 17640 _ = yes 17641 _ = no 17642 return true 17643 } 17644 // match: (GT (InvertFlags cmp) yes no) 17645 // cond: 17646 // result: (LT cmp yes no) 17647 for { 17648 v := b.Control 17649 if v.Op != OpARMInvertFlags { 17650 break 17651 } 17652 cmp := v.Args[0] 17653 yes := b.Succs[0] 17654 no := b.Succs[1] 17655 b.Kind = BlockARMLT 17656 b.SetControl(cmp) 17657 _ = yes 17658 _ = no 17659 return true 17660 } 17661 case BlockIf: 17662 // match: (If (Equal cc) yes no) 17663 // cond: 17664 // result: (EQ cc yes no) 17665 for { 17666 v := b.Control 17667 if v.Op != OpARMEqual { 17668 break 17669 } 17670 cc := v.Args[0] 17671 yes := b.Succs[0] 17672 no := b.Succs[1] 17673 b.Kind = BlockARMEQ 17674 b.SetControl(cc) 17675 _ = yes 17676 _ = no 17677 return true 17678 } 17679 // match: (If (NotEqual cc) yes no) 17680 // cond: 17681 // result: (NE cc yes no) 17682 for { 17683 v := b.Control 17684 if v.Op != OpARMNotEqual { 17685 break 17686 } 17687 cc := v.Args[0] 17688 yes := b.Succs[0] 17689 no := b.Succs[1] 17690 b.Kind = BlockARMNE 17691 b.SetControl(cc) 17692 _ = yes 17693 _ = no 17694 return true 17695 } 17696 // match: (If (LessThan cc) yes no) 17697 // cond: 17698 // result: (LT cc yes no) 17699 for { 17700 v := b.Control 17701 if v.Op != OpARMLessThan { 17702 break 17703 } 17704 cc := v.Args[0] 17705 yes := b.Succs[0] 17706 no := b.Succs[1] 17707 b.Kind = BlockARMLT 17708 b.SetControl(cc) 17709 _ = yes 17710 _ = no 17711 return true 17712 } 17713 // match: (If (LessThanU cc) yes no) 17714 // cond: 17715 // result: (ULT cc yes no) 17716 for { 17717 v := b.Control 17718 if v.Op != OpARMLessThanU { 17719 break 17720 } 17721 cc := v.Args[0] 17722 yes := b.Succs[0] 17723 no := b.Succs[1] 17724 b.Kind = BlockARMULT 17725 b.SetControl(cc) 17726 _ = yes 17727 _ = no 17728 return true 17729 } 17730 // match: (If (LessEqual cc) yes no) 17731 // cond: 17732 // result: (LE cc yes no) 17733 for { 17734 v := b.Control 17735 if v.Op != OpARMLessEqual { 17736 break 17737 } 17738 cc := v.Args[0] 17739 yes := b.Succs[0] 17740 no := b.Succs[1] 17741 b.Kind = BlockARMLE 17742 b.SetControl(cc) 17743 _ = yes 17744 _ = no 17745 return true 17746 } 17747 // match: (If (LessEqualU cc) yes no) 17748 // cond: 17749 // result: (ULE cc yes no) 17750 for { 17751 v := b.Control 17752 if v.Op != OpARMLessEqualU { 17753 break 17754 } 17755 cc := v.Args[0] 17756 yes := b.Succs[0] 17757 no := b.Succs[1] 17758 b.Kind = BlockARMULE 17759 b.SetControl(cc) 17760 _ = yes 17761 _ = no 17762 return true 17763 } 17764 // match: (If (GreaterThan cc) yes no) 17765 // cond: 17766 // result: (GT cc yes no) 17767 for { 17768 v := b.Control 17769 if v.Op != OpARMGreaterThan { 17770 break 17771 } 17772 cc := v.Args[0] 17773 yes := b.Succs[0] 17774 no := b.Succs[1] 17775 b.Kind = BlockARMGT 17776 b.SetControl(cc) 17777 _ = yes 17778 _ = no 17779 return true 17780 } 17781 // match: (If (GreaterThanU cc) yes no) 17782 // cond: 17783 // result: (UGT cc yes no) 17784 for { 17785 v := b.Control 17786 if v.Op != OpARMGreaterThanU { 17787 break 17788 } 17789 cc := v.Args[0] 17790 yes := b.Succs[0] 17791 no := b.Succs[1] 17792 b.Kind = BlockARMUGT 17793 b.SetControl(cc) 17794 _ = yes 17795 _ = no 17796 return true 17797 } 17798 // match: (If (GreaterEqual cc) yes no) 17799 // cond: 17800 // result: (GE cc yes no) 17801 for { 17802 v := b.Control 17803 if v.Op != OpARMGreaterEqual { 17804 break 17805 } 17806 cc := v.Args[0] 17807 yes := b.Succs[0] 17808 no := b.Succs[1] 17809 b.Kind = BlockARMGE 17810 b.SetControl(cc) 17811 _ = yes 17812 _ = no 17813 return true 17814 } 17815 // match: (If (GreaterEqualU cc) yes no) 17816 // cond: 17817 // result: (UGE cc yes no) 17818 for { 17819 v := b.Control 17820 if v.Op != OpARMGreaterEqualU { 17821 break 17822 } 17823 cc := v.Args[0] 17824 yes := b.Succs[0] 17825 no := b.Succs[1] 17826 b.Kind = BlockARMUGE 17827 b.SetControl(cc) 17828 _ = yes 17829 _ = no 17830 return true 17831 } 17832 // match: (If cond yes no) 17833 // cond: 17834 // result: (NE (CMPconst [0] cond) yes no) 17835 for { 17836 v := b.Control 17837 _ = v 17838 cond := b.Control 17839 yes := b.Succs[0] 17840 no := b.Succs[1] 17841 b.Kind = BlockARMNE 17842 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 17843 v0.AuxInt = 0 17844 v0.AddArg(cond) 17845 b.SetControl(v0) 17846 _ = yes 17847 _ = no 17848 return true 17849 } 17850 case BlockARMLE: 17851 // match: (LE (FlagEQ) yes no) 17852 // cond: 17853 // result: (First nil yes no) 17854 for { 17855 v := b.Control 17856 if v.Op != OpARMFlagEQ { 17857 break 17858 } 17859 yes := b.Succs[0] 17860 no := b.Succs[1] 17861 b.Kind = BlockFirst 17862 b.SetControl(nil) 17863 _ = yes 17864 _ = no 17865 return true 17866 } 17867 // match: (LE (FlagLT_ULT) yes no) 17868 // cond: 17869 // result: (First nil yes no) 17870 for { 17871 v := b.Control 17872 if v.Op != OpARMFlagLT_ULT { 17873 break 17874 } 17875 yes := b.Succs[0] 17876 no := b.Succs[1] 17877 b.Kind = BlockFirst 17878 b.SetControl(nil) 17879 _ = yes 17880 _ = no 17881 return true 17882 } 17883 // match: (LE (FlagLT_UGT) yes no) 17884 // cond: 17885 // result: (First nil yes no) 17886 for { 17887 v := b.Control 17888 if v.Op != OpARMFlagLT_UGT { 17889 break 17890 } 17891 yes := b.Succs[0] 17892 no := b.Succs[1] 17893 b.Kind = BlockFirst 17894 b.SetControl(nil) 17895 _ = yes 17896 _ = no 17897 return true 17898 } 17899 // match: (LE (FlagGT_ULT) yes no) 17900 // cond: 17901 // result: (First nil no yes) 17902 for { 17903 v := b.Control 17904 if v.Op != OpARMFlagGT_ULT { 17905 break 17906 } 17907 yes := b.Succs[0] 17908 no := b.Succs[1] 17909 b.Kind = BlockFirst 17910 b.SetControl(nil) 17911 b.swapSuccessors() 17912 _ = no 17913 _ = yes 17914 return true 17915 } 17916 // match: (LE (FlagGT_UGT) yes no) 17917 // cond: 17918 // result: (First nil no yes) 17919 for { 17920 v := b.Control 17921 if v.Op != OpARMFlagGT_UGT { 17922 break 17923 } 17924 yes := b.Succs[0] 17925 no := b.Succs[1] 17926 b.Kind = BlockFirst 17927 b.SetControl(nil) 17928 b.swapSuccessors() 17929 _ = no 17930 _ = yes 17931 return true 17932 } 17933 // match: (LE (InvertFlags cmp) yes no) 17934 // cond: 17935 // result: (GE cmp yes no) 17936 for { 17937 v := b.Control 17938 if v.Op != OpARMInvertFlags { 17939 break 17940 } 17941 cmp := v.Args[0] 17942 yes := b.Succs[0] 17943 no := b.Succs[1] 17944 b.Kind = BlockARMGE 17945 b.SetControl(cmp) 17946 _ = yes 17947 _ = no 17948 return true 17949 } 17950 case BlockARMLT: 17951 // match: (LT (FlagEQ) yes no) 17952 // cond: 17953 // result: (First nil no yes) 17954 for { 17955 v := b.Control 17956 if v.Op != OpARMFlagEQ { 17957 break 17958 } 17959 yes := b.Succs[0] 17960 no := b.Succs[1] 17961 b.Kind = BlockFirst 17962 b.SetControl(nil) 17963 b.swapSuccessors() 17964 _ = no 17965 _ = yes 17966 return true 17967 } 17968 // match: (LT (FlagLT_ULT) yes no) 17969 // cond: 17970 // result: (First nil yes no) 17971 for { 17972 v := b.Control 17973 if v.Op != OpARMFlagLT_ULT { 17974 break 17975 } 17976 yes := b.Succs[0] 17977 no := b.Succs[1] 17978 b.Kind = BlockFirst 17979 b.SetControl(nil) 17980 _ = yes 17981 _ = no 17982 return true 17983 } 17984 // match: (LT (FlagLT_UGT) yes no) 17985 // cond: 17986 // result: (First nil yes no) 17987 for { 17988 v := b.Control 17989 if v.Op != OpARMFlagLT_UGT { 17990 break 17991 } 17992 yes := b.Succs[0] 17993 no := b.Succs[1] 17994 b.Kind = BlockFirst 17995 b.SetControl(nil) 17996 _ = yes 17997 _ = no 17998 return true 17999 } 18000 // match: (LT (FlagGT_ULT) yes no) 18001 // cond: 18002 // result: (First nil no yes) 18003 for { 18004 v := b.Control 18005 if v.Op != OpARMFlagGT_ULT { 18006 break 18007 } 18008 yes := b.Succs[0] 18009 no := b.Succs[1] 18010 b.Kind = BlockFirst 18011 b.SetControl(nil) 18012 b.swapSuccessors() 18013 _ = no 18014 _ = yes 18015 return true 18016 } 18017 // match: (LT (FlagGT_UGT) yes no) 18018 // cond: 18019 // result: (First nil no yes) 18020 for { 18021 v := b.Control 18022 if v.Op != OpARMFlagGT_UGT { 18023 break 18024 } 18025 yes := b.Succs[0] 18026 no := b.Succs[1] 18027 b.Kind = BlockFirst 18028 b.SetControl(nil) 18029 b.swapSuccessors() 18030 _ = no 18031 _ = yes 18032 return true 18033 } 18034 // match: (LT (InvertFlags cmp) yes no) 18035 // cond: 18036 // result: (GT cmp yes no) 18037 for { 18038 v := b.Control 18039 if v.Op != OpARMInvertFlags { 18040 break 18041 } 18042 cmp := v.Args[0] 18043 yes := b.Succs[0] 18044 no := b.Succs[1] 18045 b.Kind = BlockARMGT 18046 b.SetControl(cmp) 18047 _ = yes 18048 _ = no 18049 return true 18050 } 18051 case BlockARMNE: 18052 // match: (NE (CMPconst [0] (Equal cc)) yes no) 18053 // cond: 18054 // result: (EQ cc yes no) 18055 for { 18056 v := b.Control 18057 if v.Op != OpARMCMPconst { 18058 break 18059 } 18060 if v.AuxInt != 0 { 18061 break 18062 } 18063 v_0 := v.Args[0] 18064 if v_0.Op != OpARMEqual { 18065 break 18066 } 18067 cc := v_0.Args[0] 18068 yes := b.Succs[0] 18069 no := b.Succs[1] 18070 b.Kind = BlockARMEQ 18071 b.SetControl(cc) 18072 _ = yes 18073 _ = no 18074 return true 18075 } 18076 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 18077 // cond: 18078 // result: (NE cc yes no) 18079 for { 18080 v := b.Control 18081 if v.Op != OpARMCMPconst { 18082 break 18083 } 18084 if v.AuxInt != 0 { 18085 break 18086 } 18087 v_0 := v.Args[0] 18088 if v_0.Op != OpARMNotEqual { 18089 break 18090 } 18091 cc := v_0.Args[0] 18092 yes := b.Succs[0] 18093 no := b.Succs[1] 18094 b.Kind = BlockARMNE 18095 b.SetControl(cc) 18096 _ = yes 18097 _ = no 18098 return true 18099 } 18100 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 18101 // cond: 18102 // result: (LT cc yes no) 18103 for { 18104 v := b.Control 18105 if v.Op != OpARMCMPconst { 18106 break 18107 } 18108 if v.AuxInt != 0 { 18109 break 18110 } 18111 v_0 := v.Args[0] 18112 if v_0.Op != OpARMLessThan { 18113 break 18114 } 18115 cc := v_0.Args[0] 18116 yes := b.Succs[0] 18117 no := b.Succs[1] 18118 b.Kind = BlockARMLT 18119 b.SetControl(cc) 18120 _ = yes 18121 _ = no 18122 return true 18123 } 18124 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 18125 // cond: 18126 // result: (ULT cc yes no) 18127 for { 18128 v := b.Control 18129 if v.Op != OpARMCMPconst { 18130 break 18131 } 18132 if v.AuxInt != 0 { 18133 break 18134 } 18135 v_0 := v.Args[0] 18136 if v_0.Op != OpARMLessThanU { 18137 break 18138 } 18139 cc := v_0.Args[0] 18140 yes := b.Succs[0] 18141 no := b.Succs[1] 18142 b.Kind = BlockARMULT 18143 b.SetControl(cc) 18144 _ = yes 18145 _ = no 18146 return true 18147 } 18148 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 18149 // cond: 18150 // result: (LE cc yes no) 18151 for { 18152 v := b.Control 18153 if v.Op != OpARMCMPconst { 18154 break 18155 } 18156 if v.AuxInt != 0 { 18157 break 18158 } 18159 v_0 := v.Args[0] 18160 if v_0.Op != OpARMLessEqual { 18161 break 18162 } 18163 cc := v_0.Args[0] 18164 yes := b.Succs[0] 18165 no := b.Succs[1] 18166 b.Kind = BlockARMLE 18167 b.SetControl(cc) 18168 _ = yes 18169 _ = no 18170 return true 18171 } 18172 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 18173 // cond: 18174 // result: (ULE cc yes no) 18175 for { 18176 v := b.Control 18177 if v.Op != OpARMCMPconst { 18178 break 18179 } 18180 if v.AuxInt != 0 { 18181 break 18182 } 18183 v_0 := v.Args[0] 18184 if v_0.Op != OpARMLessEqualU { 18185 break 18186 } 18187 cc := v_0.Args[0] 18188 yes := b.Succs[0] 18189 no := b.Succs[1] 18190 b.Kind = BlockARMULE 18191 b.SetControl(cc) 18192 _ = yes 18193 _ = no 18194 return true 18195 } 18196 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 18197 // cond: 18198 // result: (GT cc yes no) 18199 for { 18200 v := b.Control 18201 if v.Op != OpARMCMPconst { 18202 break 18203 } 18204 if v.AuxInt != 0 { 18205 break 18206 } 18207 v_0 := v.Args[0] 18208 if v_0.Op != OpARMGreaterThan { 18209 break 18210 } 18211 cc := v_0.Args[0] 18212 yes := b.Succs[0] 18213 no := b.Succs[1] 18214 b.Kind = BlockARMGT 18215 b.SetControl(cc) 18216 _ = yes 18217 _ = no 18218 return true 18219 } 18220 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 18221 // cond: 18222 // result: (UGT cc yes no) 18223 for { 18224 v := b.Control 18225 if v.Op != OpARMCMPconst { 18226 break 18227 } 18228 if v.AuxInt != 0 { 18229 break 18230 } 18231 v_0 := v.Args[0] 18232 if v_0.Op != OpARMGreaterThanU { 18233 break 18234 } 18235 cc := v_0.Args[0] 18236 yes := b.Succs[0] 18237 no := b.Succs[1] 18238 b.Kind = BlockARMUGT 18239 b.SetControl(cc) 18240 _ = yes 18241 _ = no 18242 return true 18243 } 18244 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 18245 // cond: 18246 // result: (GE cc yes no) 18247 for { 18248 v := b.Control 18249 if v.Op != OpARMCMPconst { 18250 break 18251 } 18252 if v.AuxInt != 0 { 18253 break 18254 } 18255 v_0 := v.Args[0] 18256 if v_0.Op != OpARMGreaterEqual { 18257 break 18258 } 18259 cc := v_0.Args[0] 18260 yes := b.Succs[0] 18261 no := b.Succs[1] 18262 b.Kind = BlockARMGE 18263 b.SetControl(cc) 18264 _ = yes 18265 _ = no 18266 return true 18267 } 18268 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 18269 // cond: 18270 // result: (UGE cc yes no) 18271 for { 18272 v := b.Control 18273 if v.Op != OpARMCMPconst { 18274 break 18275 } 18276 if v.AuxInt != 0 { 18277 break 18278 } 18279 v_0 := v.Args[0] 18280 if v_0.Op != OpARMGreaterEqualU { 18281 break 18282 } 18283 cc := v_0.Args[0] 18284 yes := b.Succs[0] 18285 no := b.Succs[1] 18286 b.Kind = BlockARMUGE 18287 b.SetControl(cc) 18288 _ = yes 18289 _ = no 18290 return true 18291 } 18292 // match: (NE (FlagEQ) yes no) 18293 // cond: 18294 // result: (First nil no yes) 18295 for { 18296 v := b.Control 18297 if v.Op != OpARMFlagEQ { 18298 break 18299 } 18300 yes := b.Succs[0] 18301 no := b.Succs[1] 18302 b.Kind = BlockFirst 18303 b.SetControl(nil) 18304 b.swapSuccessors() 18305 _ = no 18306 _ = yes 18307 return true 18308 } 18309 // match: (NE (FlagLT_ULT) yes no) 18310 // cond: 18311 // result: (First nil yes no) 18312 for { 18313 v := b.Control 18314 if v.Op != OpARMFlagLT_ULT { 18315 break 18316 } 18317 yes := b.Succs[0] 18318 no := b.Succs[1] 18319 b.Kind = BlockFirst 18320 b.SetControl(nil) 18321 _ = yes 18322 _ = no 18323 return true 18324 } 18325 // match: (NE (FlagLT_UGT) yes no) 18326 // cond: 18327 // result: (First nil yes no) 18328 for { 18329 v := b.Control 18330 if v.Op != OpARMFlagLT_UGT { 18331 break 18332 } 18333 yes := b.Succs[0] 18334 no := b.Succs[1] 18335 b.Kind = BlockFirst 18336 b.SetControl(nil) 18337 _ = yes 18338 _ = no 18339 return true 18340 } 18341 // match: (NE (FlagGT_ULT) yes no) 18342 // cond: 18343 // result: (First nil yes no) 18344 for { 18345 v := b.Control 18346 if v.Op != OpARMFlagGT_ULT { 18347 break 18348 } 18349 yes := b.Succs[0] 18350 no := b.Succs[1] 18351 b.Kind = BlockFirst 18352 b.SetControl(nil) 18353 _ = yes 18354 _ = no 18355 return true 18356 } 18357 // match: (NE (FlagGT_UGT) yes no) 18358 // cond: 18359 // result: (First nil yes no) 18360 for { 18361 v := b.Control 18362 if v.Op != OpARMFlagGT_UGT { 18363 break 18364 } 18365 yes := b.Succs[0] 18366 no := b.Succs[1] 18367 b.Kind = BlockFirst 18368 b.SetControl(nil) 18369 _ = yes 18370 _ = no 18371 return true 18372 } 18373 // match: (NE (InvertFlags cmp) yes no) 18374 // cond: 18375 // result: (NE cmp yes no) 18376 for { 18377 v := b.Control 18378 if v.Op != OpARMInvertFlags { 18379 break 18380 } 18381 cmp := v.Args[0] 18382 yes := b.Succs[0] 18383 no := b.Succs[1] 18384 b.Kind = BlockARMNE 18385 b.SetControl(cmp) 18386 _ = yes 18387 _ = no 18388 return true 18389 } 18390 case BlockARMUGE: 18391 // match: (UGE (FlagEQ) yes no) 18392 // cond: 18393 // result: (First nil yes no) 18394 for { 18395 v := b.Control 18396 if v.Op != OpARMFlagEQ { 18397 break 18398 } 18399 yes := b.Succs[0] 18400 no := b.Succs[1] 18401 b.Kind = BlockFirst 18402 b.SetControl(nil) 18403 _ = yes 18404 _ = no 18405 return true 18406 } 18407 // match: (UGE (FlagLT_ULT) yes no) 18408 // cond: 18409 // result: (First nil no yes) 18410 for { 18411 v := b.Control 18412 if v.Op != OpARMFlagLT_ULT { 18413 break 18414 } 18415 yes := b.Succs[0] 18416 no := b.Succs[1] 18417 b.Kind = BlockFirst 18418 b.SetControl(nil) 18419 b.swapSuccessors() 18420 _ = no 18421 _ = yes 18422 return true 18423 } 18424 // match: (UGE (FlagLT_UGT) yes no) 18425 // cond: 18426 // result: (First nil yes no) 18427 for { 18428 v := b.Control 18429 if v.Op != OpARMFlagLT_UGT { 18430 break 18431 } 18432 yes := b.Succs[0] 18433 no := b.Succs[1] 18434 b.Kind = BlockFirst 18435 b.SetControl(nil) 18436 _ = yes 18437 _ = no 18438 return true 18439 } 18440 // match: (UGE (FlagGT_ULT) yes no) 18441 // cond: 18442 // result: (First nil no yes) 18443 for { 18444 v := b.Control 18445 if v.Op != OpARMFlagGT_ULT { 18446 break 18447 } 18448 yes := b.Succs[0] 18449 no := b.Succs[1] 18450 b.Kind = BlockFirst 18451 b.SetControl(nil) 18452 b.swapSuccessors() 18453 _ = no 18454 _ = yes 18455 return true 18456 } 18457 // match: (UGE (FlagGT_UGT) yes no) 18458 // cond: 18459 // result: (First nil yes no) 18460 for { 18461 v := b.Control 18462 if v.Op != OpARMFlagGT_UGT { 18463 break 18464 } 18465 yes := b.Succs[0] 18466 no := b.Succs[1] 18467 b.Kind = BlockFirst 18468 b.SetControl(nil) 18469 _ = yes 18470 _ = no 18471 return true 18472 } 18473 // match: (UGE (InvertFlags cmp) yes no) 18474 // cond: 18475 // result: (ULE cmp yes no) 18476 for { 18477 v := b.Control 18478 if v.Op != OpARMInvertFlags { 18479 break 18480 } 18481 cmp := v.Args[0] 18482 yes := b.Succs[0] 18483 no := b.Succs[1] 18484 b.Kind = BlockARMULE 18485 b.SetControl(cmp) 18486 _ = yes 18487 _ = no 18488 return true 18489 } 18490 case BlockARMUGT: 18491 // match: (UGT (FlagEQ) yes no) 18492 // cond: 18493 // result: (First nil no yes) 18494 for { 18495 v := b.Control 18496 if v.Op != OpARMFlagEQ { 18497 break 18498 } 18499 yes := b.Succs[0] 18500 no := b.Succs[1] 18501 b.Kind = BlockFirst 18502 b.SetControl(nil) 18503 b.swapSuccessors() 18504 _ = no 18505 _ = yes 18506 return true 18507 } 18508 // match: (UGT (FlagLT_ULT) yes no) 18509 // cond: 18510 // result: (First nil no yes) 18511 for { 18512 v := b.Control 18513 if v.Op != OpARMFlagLT_ULT { 18514 break 18515 } 18516 yes := b.Succs[0] 18517 no := b.Succs[1] 18518 b.Kind = BlockFirst 18519 b.SetControl(nil) 18520 b.swapSuccessors() 18521 _ = no 18522 _ = yes 18523 return true 18524 } 18525 // match: (UGT (FlagLT_UGT) yes no) 18526 // cond: 18527 // result: (First nil yes no) 18528 for { 18529 v := b.Control 18530 if v.Op != OpARMFlagLT_UGT { 18531 break 18532 } 18533 yes := b.Succs[0] 18534 no := b.Succs[1] 18535 b.Kind = BlockFirst 18536 b.SetControl(nil) 18537 _ = yes 18538 _ = no 18539 return true 18540 } 18541 // match: (UGT (FlagGT_ULT) yes no) 18542 // cond: 18543 // result: (First nil no yes) 18544 for { 18545 v := b.Control 18546 if v.Op != OpARMFlagGT_ULT { 18547 break 18548 } 18549 yes := b.Succs[0] 18550 no := b.Succs[1] 18551 b.Kind = BlockFirst 18552 b.SetControl(nil) 18553 b.swapSuccessors() 18554 _ = no 18555 _ = yes 18556 return true 18557 } 18558 // match: (UGT (FlagGT_UGT) yes no) 18559 // cond: 18560 // result: (First nil yes no) 18561 for { 18562 v := b.Control 18563 if v.Op != OpARMFlagGT_UGT { 18564 break 18565 } 18566 yes := b.Succs[0] 18567 no := b.Succs[1] 18568 b.Kind = BlockFirst 18569 b.SetControl(nil) 18570 _ = yes 18571 _ = no 18572 return true 18573 } 18574 // match: (UGT (InvertFlags cmp) yes no) 18575 // cond: 18576 // result: (ULT cmp yes no) 18577 for { 18578 v := b.Control 18579 if v.Op != OpARMInvertFlags { 18580 break 18581 } 18582 cmp := v.Args[0] 18583 yes := b.Succs[0] 18584 no := b.Succs[1] 18585 b.Kind = BlockARMULT 18586 b.SetControl(cmp) 18587 _ = yes 18588 _ = no 18589 return true 18590 } 18591 case BlockARMULE: 18592 // match: (ULE (FlagEQ) yes no) 18593 // cond: 18594 // result: (First nil yes no) 18595 for { 18596 v := b.Control 18597 if v.Op != OpARMFlagEQ { 18598 break 18599 } 18600 yes := b.Succs[0] 18601 no := b.Succs[1] 18602 b.Kind = BlockFirst 18603 b.SetControl(nil) 18604 _ = yes 18605 _ = no 18606 return true 18607 } 18608 // match: (ULE (FlagLT_ULT) yes no) 18609 // cond: 18610 // result: (First nil yes no) 18611 for { 18612 v := b.Control 18613 if v.Op != OpARMFlagLT_ULT { 18614 break 18615 } 18616 yes := b.Succs[0] 18617 no := b.Succs[1] 18618 b.Kind = BlockFirst 18619 b.SetControl(nil) 18620 _ = yes 18621 _ = no 18622 return true 18623 } 18624 // match: (ULE (FlagLT_UGT) yes no) 18625 // cond: 18626 // result: (First nil no yes) 18627 for { 18628 v := b.Control 18629 if v.Op != OpARMFlagLT_UGT { 18630 break 18631 } 18632 yes := b.Succs[0] 18633 no := b.Succs[1] 18634 b.Kind = BlockFirst 18635 b.SetControl(nil) 18636 b.swapSuccessors() 18637 _ = no 18638 _ = yes 18639 return true 18640 } 18641 // match: (ULE (FlagGT_ULT) yes no) 18642 // cond: 18643 // result: (First nil yes no) 18644 for { 18645 v := b.Control 18646 if v.Op != OpARMFlagGT_ULT { 18647 break 18648 } 18649 yes := b.Succs[0] 18650 no := b.Succs[1] 18651 b.Kind = BlockFirst 18652 b.SetControl(nil) 18653 _ = yes 18654 _ = no 18655 return true 18656 } 18657 // match: (ULE (FlagGT_UGT) yes no) 18658 // cond: 18659 // result: (First nil no yes) 18660 for { 18661 v := b.Control 18662 if v.Op != OpARMFlagGT_UGT { 18663 break 18664 } 18665 yes := b.Succs[0] 18666 no := b.Succs[1] 18667 b.Kind = BlockFirst 18668 b.SetControl(nil) 18669 b.swapSuccessors() 18670 _ = no 18671 _ = yes 18672 return true 18673 } 18674 // match: (ULE (InvertFlags cmp) yes no) 18675 // cond: 18676 // result: (UGE cmp yes no) 18677 for { 18678 v := b.Control 18679 if v.Op != OpARMInvertFlags { 18680 break 18681 } 18682 cmp := v.Args[0] 18683 yes := b.Succs[0] 18684 no := b.Succs[1] 18685 b.Kind = BlockARMUGE 18686 b.SetControl(cmp) 18687 _ = yes 18688 _ = no 18689 return true 18690 } 18691 case BlockARMULT: 18692 // match: (ULT (FlagEQ) yes no) 18693 // cond: 18694 // result: (First nil no yes) 18695 for { 18696 v := b.Control 18697 if v.Op != OpARMFlagEQ { 18698 break 18699 } 18700 yes := b.Succs[0] 18701 no := b.Succs[1] 18702 b.Kind = BlockFirst 18703 b.SetControl(nil) 18704 b.swapSuccessors() 18705 _ = no 18706 _ = yes 18707 return true 18708 } 18709 // match: (ULT (FlagLT_ULT) yes no) 18710 // cond: 18711 // result: (First nil yes no) 18712 for { 18713 v := b.Control 18714 if v.Op != OpARMFlagLT_ULT { 18715 break 18716 } 18717 yes := b.Succs[0] 18718 no := b.Succs[1] 18719 b.Kind = BlockFirst 18720 b.SetControl(nil) 18721 _ = yes 18722 _ = no 18723 return true 18724 } 18725 // match: (ULT (FlagLT_UGT) yes no) 18726 // cond: 18727 // result: (First nil no yes) 18728 for { 18729 v := b.Control 18730 if v.Op != OpARMFlagLT_UGT { 18731 break 18732 } 18733 yes := b.Succs[0] 18734 no := b.Succs[1] 18735 b.Kind = BlockFirst 18736 b.SetControl(nil) 18737 b.swapSuccessors() 18738 _ = no 18739 _ = yes 18740 return true 18741 } 18742 // match: (ULT (FlagGT_ULT) yes no) 18743 // cond: 18744 // result: (First nil yes no) 18745 for { 18746 v := b.Control 18747 if v.Op != OpARMFlagGT_ULT { 18748 break 18749 } 18750 yes := b.Succs[0] 18751 no := b.Succs[1] 18752 b.Kind = BlockFirst 18753 b.SetControl(nil) 18754 _ = yes 18755 _ = no 18756 return true 18757 } 18758 // match: (ULT (FlagGT_UGT) yes no) 18759 // cond: 18760 // result: (First nil no yes) 18761 for { 18762 v := b.Control 18763 if v.Op != OpARMFlagGT_UGT { 18764 break 18765 } 18766 yes := b.Succs[0] 18767 no := b.Succs[1] 18768 b.Kind = BlockFirst 18769 b.SetControl(nil) 18770 b.swapSuccessors() 18771 _ = no 18772 _ = yes 18773 return true 18774 } 18775 // match: (ULT (InvertFlags cmp) yes no) 18776 // cond: 18777 // result: (UGT cmp yes no) 18778 for { 18779 v := b.Control 18780 if v.Op != OpARMInvertFlags { 18781 break 18782 } 18783 cmp := v.Args[0] 18784 yes := b.Succs[0] 18785 no := b.Succs[1] 18786 b.Kind = BlockARMUGT 18787 b.SetControl(cmp) 18788 _ = yes 18789 _ = no 18790 return true 18791 } 18792 } 18793 return false 18794 }