github.com/riscv/riscv-go@v0.0.0-20200123204226-124ebd6fcc8e/src/cmd/compile/internal/ssa/rewriteARM.go (about) 1 // autogenerated from gen/ARM.rules: do not edit! 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 8 var _ = math.MinInt8 // in case not otherwise used 9 func rewriteValueARM(v *Value, config *Config) bool { 10 switch v.Op { 11 case OpARMADC: 12 return rewriteValueARM_OpARMADC(v, config) 13 case OpARMADCconst: 14 return rewriteValueARM_OpARMADCconst(v, config) 15 case OpARMADCshiftLL: 16 return rewriteValueARM_OpARMADCshiftLL(v, config) 17 case OpARMADCshiftLLreg: 18 return rewriteValueARM_OpARMADCshiftLLreg(v, config) 19 case OpARMADCshiftRA: 20 return rewriteValueARM_OpARMADCshiftRA(v, config) 21 case OpARMADCshiftRAreg: 22 return rewriteValueARM_OpARMADCshiftRAreg(v, config) 23 case OpARMADCshiftRL: 24 return rewriteValueARM_OpARMADCshiftRL(v, config) 25 case OpARMADCshiftRLreg: 26 return rewriteValueARM_OpARMADCshiftRLreg(v, config) 27 case OpARMADD: 28 return rewriteValueARM_OpARMADD(v, config) 29 case OpARMADDS: 30 return rewriteValueARM_OpARMADDS(v, config) 31 case OpARMADDSshiftLL: 32 return rewriteValueARM_OpARMADDSshiftLL(v, config) 33 case OpARMADDSshiftLLreg: 34 return rewriteValueARM_OpARMADDSshiftLLreg(v, config) 35 case OpARMADDSshiftRA: 36 return rewriteValueARM_OpARMADDSshiftRA(v, config) 37 case OpARMADDSshiftRAreg: 38 return rewriteValueARM_OpARMADDSshiftRAreg(v, config) 39 case OpARMADDSshiftRL: 40 return rewriteValueARM_OpARMADDSshiftRL(v, config) 41 case OpARMADDSshiftRLreg: 42 return rewriteValueARM_OpARMADDSshiftRLreg(v, config) 43 case OpARMADDconst: 44 return rewriteValueARM_OpARMADDconst(v, config) 45 case OpARMADDshiftLL: 46 return rewriteValueARM_OpARMADDshiftLL(v, config) 47 case OpARMADDshiftLLreg: 48 return rewriteValueARM_OpARMADDshiftLLreg(v, config) 49 case OpARMADDshiftRA: 50 return rewriteValueARM_OpARMADDshiftRA(v, config) 51 case OpARMADDshiftRAreg: 52 return rewriteValueARM_OpARMADDshiftRAreg(v, config) 53 case OpARMADDshiftRL: 54 return rewriteValueARM_OpARMADDshiftRL(v, config) 55 case OpARMADDshiftRLreg: 56 return rewriteValueARM_OpARMADDshiftRLreg(v, config) 57 case OpARMAND: 58 return rewriteValueARM_OpARMAND(v, config) 59 case OpARMANDconst: 60 return rewriteValueARM_OpARMANDconst(v, config) 61 case OpARMANDshiftLL: 62 return rewriteValueARM_OpARMANDshiftLL(v, config) 63 case OpARMANDshiftLLreg: 64 return rewriteValueARM_OpARMANDshiftLLreg(v, config) 65 case OpARMANDshiftRA: 66 return rewriteValueARM_OpARMANDshiftRA(v, config) 67 case OpARMANDshiftRAreg: 68 return rewriteValueARM_OpARMANDshiftRAreg(v, config) 69 case OpARMANDshiftRL: 70 return rewriteValueARM_OpARMANDshiftRL(v, config) 71 case OpARMANDshiftRLreg: 72 return rewriteValueARM_OpARMANDshiftRLreg(v, config) 73 case OpARMBIC: 74 return rewriteValueARM_OpARMBIC(v, config) 75 case OpARMBICconst: 76 return rewriteValueARM_OpARMBICconst(v, config) 77 case OpARMBICshiftLL: 78 return rewriteValueARM_OpARMBICshiftLL(v, config) 79 case OpARMBICshiftLLreg: 80 return rewriteValueARM_OpARMBICshiftLLreg(v, config) 81 case OpARMBICshiftRA: 82 return rewriteValueARM_OpARMBICshiftRA(v, config) 83 case OpARMBICshiftRAreg: 84 return rewriteValueARM_OpARMBICshiftRAreg(v, config) 85 case OpARMBICshiftRL: 86 return rewriteValueARM_OpARMBICshiftRL(v, config) 87 case OpARMBICshiftRLreg: 88 return rewriteValueARM_OpARMBICshiftRLreg(v, config) 89 case OpARMCMOVWHSconst: 90 return rewriteValueARM_OpARMCMOVWHSconst(v, config) 91 case OpARMCMOVWLSconst: 92 return rewriteValueARM_OpARMCMOVWLSconst(v, config) 93 case OpARMCMP: 94 return rewriteValueARM_OpARMCMP(v, config) 95 case OpARMCMPD: 96 return rewriteValueARM_OpARMCMPD(v, config) 97 case OpARMCMPF: 98 return rewriteValueARM_OpARMCMPF(v, config) 99 case OpARMCMPconst: 100 return rewriteValueARM_OpARMCMPconst(v, config) 101 case OpARMCMPshiftLL: 102 return rewriteValueARM_OpARMCMPshiftLL(v, config) 103 case OpARMCMPshiftLLreg: 104 return rewriteValueARM_OpARMCMPshiftLLreg(v, config) 105 case OpARMCMPshiftRA: 106 return rewriteValueARM_OpARMCMPshiftRA(v, config) 107 case OpARMCMPshiftRAreg: 108 return rewriteValueARM_OpARMCMPshiftRAreg(v, config) 109 case OpARMCMPshiftRL: 110 return rewriteValueARM_OpARMCMPshiftRL(v, config) 111 case OpARMCMPshiftRLreg: 112 return rewriteValueARM_OpARMCMPshiftRLreg(v, config) 113 case OpARMEqual: 114 return rewriteValueARM_OpARMEqual(v, config) 115 case OpARMGreaterEqual: 116 return rewriteValueARM_OpARMGreaterEqual(v, config) 117 case OpARMGreaterEqualU: 118 return rewriteValueARM_OpARMGreaterEqualU(v, config) 119 case OpARMGreaterThan: 120 return rewriteValueARM_OpARMGreaterThan(v, config) 121 case OpARMGreaterThanU: 122 return rewriteValueARM_OpARMGreaterThanU(v, config) 123 case OpARMLessEqual: 124 return rewriteValueARM_OpARMLessEqual(v, config) 125 case OpARMLessEqualU: 126 return rewriteValueARM_OpARMLessEqualU(v, config) 127 case OpARMLessThan: 128 return rewriteValueARM_OpARMLessThan(v, config) 129 case OpARMLessThanU: 130 return rewriteValueARM_OpARMLessThanU(v, config) 131 case OpARMMOVBUload: 132 return rewriteValueARM_OpARMMOVBUload(v, config) 133 case OpARMMOVBUreg: 134 return rewriteValueARM_OpARMMOVBUreg(v, config) 135 case OpARMMOVBload: 136 return rewriteValueARM_OpARMMOVBload(v, config) 137 case OpARMMOVBreg: 138 return rewriteValueARM_OpARMMOVBreg(v, config) 139 case OpARMMOVBstore: 140 return rewriteValueARM_OpARMMOVBstore(v, config) 141 case OpARMMOVDload: 142 return rewriteValueARM_OpARMMOVDload(v, config) 143 case OpARMMOVDstore: 144 return rewriteValueARM_OpARMMOVDstore(v, config) 145 case OpARMMOVFload: 146 return rewriteValueARM_OpARMMOVFload(v, config) 147 case OpARMMOVFstore: 148 return rewriteValueARM_OpARMMOVFstore(v, config) 149 case OpARMMOVHUload: 150 return rewriteValueARM_OpARMMOVHUload(v, config) 151 case OpARMMOVHUreg: 152 return rewriteValueARM_OpARMMOVHUreg(v, config) 153 case OpARMMOVHload: 154 return rewriteValueARM_OpARMMOVHload(v, config) 155 case OpARMMOVHreg: 156 return rewriteValueARM_OpARMMOVHreg(v, config) 157 case OpARMMOVHstore: 158 return rewriteValueARM_OpARMMOVHstore(v, config) 159 case OpARMMOVWload: 160 return rewriteValueARM_OpARMMOVWload(v, config) 161 case OpARMMOVWloadidx: 162 return rewriteValueARM_OpARMMOVWloadidx(v, config) 163 case OpARMMOVWloadshiftLL: 164 return rewriteValueARM_OpARMMOVWloadshiftLL(v, config) 165 case OpARMMOVWloadshiftRA: 166 return rewriteValueARM_OpARMMOVWloadshiftRA(v, config) 167 case OpARMMOVWloadshiftRL: 168 return rewriteValueARM_OpARMMOVWloadshiftRL(v, config) 169 case OpARMMOVWreg: 170 return rewriteValueARM_OpARMMOVWreg(v, config) 171 case OpARMMOVWstore: 172 return rewriteValueARM_OpARMMOVWstore(v, config) 173 case OpARMMOVWstoreidx: 174 return rewriteValueARM_OpARMMOVWstoreidx(v, config) 175 case OpARMMOVWstoreshiftLL: 176 return rewriteValueARM_OpARMMOVWstoreshiftLL(v, config) 177 case OpARMMOVWstoreshiftRA: 178 return rewriteValueARM_OpARMMOVWstoreshiftRA(v, config) 179 case OpARMMOVWstoreshiftRL: 180 return rewriteValueARM_OpARMMOVWstoreshiftRL(v, config) 181 case OpARMMUL: 182 return rewriteValueARM_OpARMMUL(v, config) 183 case OpARMMULA: 184 return rewriteValueARM_OpARMMULA(v, config) 185 case OpARMMVN: 186 return rewriteValueARM_OpARMMVN(v, config) 187 case OpARMMVNshiftLL: 188 return rewriteValueARM_OpARMMVNshiftLL(v, config) 189 case OpARMMVNshiftLLreg: 190 return rewriteValueARM_OpARMMVNshiftLLreg(v, config) 191 case OpARMMVNshiftRA: 192 return rewriteValueARM_OpARMMVNshiftRA(v, config) 193 case OpARMMVNshiftRAreg: 194 return rewriteValueARM_OpARMMVNshiftRAreg(v, config) 195 case OpARMMVNshiftRL: 196 return rewriteValueARM_OpARMMVNshiftRL(v, config) 197 case OpARMMVNshiftRLreg: 198 return rewriteValueARM_OpARMMVNshiftRLreg(v, config) 199 case OpARMNotEqual: 200 return rewriteValueARM_OpARMNotEqual(v, config) 201 case OpARMOR: 202 return rewriteValueARM_OpARMOR(v, config) 203 case OpARMORconst: 204 return rewriteValueARM_OpARMORconst(v, config) 205 case OpARMORshiftLL: 206 return rewriteValueARM_OpARMORshiftLL(v, config) 207 case OpARMORshiftLLreg: 208 return rewriteValueARM_OpARMORshiftLLreg(v, config) 209 case OpARMORshiftRA: 210 return rewriteValueARM_OpARMORshiftRA(v, config) 211 case OpARMORshiftRAreg: 212 return rewriteValueARM_OpARMORshiftRAreg(v, config) 213 case OpARMORshiftRL: 214 return rewriteValueARM_OpARMORshiftRL(v, config) 215 case OpARMORshiftRLreg: 216 return rewriteValueARM_OpARMORshiftRLreg(v, config) 217 case OpARMRSB: 218 return rewriteValueARM_OpARMRSB(v, config) 219 case OpARMRSBSshiftLL: 220 return rewriteValueARM_OpARMRSBSshiftLL(v, config) 221 case OpARMRSBSshiftLLreg: 222 return rewriteValueARM_OpARMRSBSshiftLLreg(v, config) 223 case OpARMRSBSshiftRA: 224 return rewriteValueARM_OpARMRSBSshiftRA(v, config) 225 case OpARMRSBSshiftRAreg: 226 return rewriteValueARM_OpARMRSBSshiftRAreg(v, config) 227 case OpARMRSBSshiftRL: 228 return rewriteValueARM_OpARMRSBSshiftRL(v, config) 229 case OpARMRSBSshiftRLreg: 230 return rewriteValueARM_OpARMRSBSshiftRLreg(v, config) 231 case OpARMRSBconst: 232 return rewriteValueARM_OpARMRSBconst(v, config) 233 case OpARMRSBshiftLL: 234 return rewriteValueARM_OpARMRSBshiftLL(v, config) 235 case OpARMRSBshiftLLreg: 236 return rewriteValueARM_OpARMRSBshiftLLreg(v, config) 237 case OpARMRSBshiftRA: 238 return rewriteValueARM_OpARMRSBshiftRA(v, config) 239 case OpARMRSBshiftRAreg: 240 return rewriteValueARM_OpARMRSBshiftRAreg(v, config) 241 case OpARMRSBshiftRL: 242 return rewriteValueARM_OpARMRSBshiftRL(v, config) 243 case OpARMRSBshiftRLreg: 244 return rewriteValueARM_OpARMRSBshiftRLreg(v, config) 245 case OpARMRSCconst: 246 return rewriteValueARM_OpARMRSCconst(v, config) 247 case OpARMRSCshiftLL: 248 return rewriteValueARM_OpARMRSCshiftLL(v, config) 249 case OpARMRSCshiftLLreg: 250 return rewriteValueARM_OpARMRSCshiftLLreg(v, config) 251 case OpARMRSCshiftRA: 252 return rewriteValueARM_OpARMRSCshiftRA(v, config) 253 case OpARMRSCshiftRAreg: 254 return rewriteValueARM_OpARMRSCshiftRAreg(v, config) 255 case OpARMRSCshiftRL: 256 return rewriteValueARM_OpARMRSCshiftRL(v, config) 257 case OpARMRSCshiftRLreg: 258 return rewriteValueARM_OpARMRSCshiftRLreg(v, config) 259 case OpARMSBC: 260 return rewriteValueARM_OpARMSBC(v, config) 261 case OpARMSBCconst: 262 return rewriteValueARM_OpARMSBCconst(v, config) 263 case OpARMSBCshiftLL: 264 return rewriteValueARM_OpARMSBCshiftLL(v, config) 265 case OpARMSBCshiftLLreg: 266 return rewriteValueARM_OpARMSBCshiftLLreg(v, config) 267 case OpARMSBCshiftRA: 268 return rewriteValueARM_OpARMSBCshiftRA(v, config) 269 case OpARMSBCshiftRAreg: 270 return rewriteValueARM_OpARMSBCshiftRAreg(v, config) 271 case OpARMSBCshiftRL: 272 return rewriteValueARM_OpARMSBCshiftRL(v, config) 273 case OpARMSBCshiftRLreg: 274 return rewriteValueARM_OpARMSBCshiftRLreg(v, config) 275 case OpARMSLL: 276 return rewriteValueARM_OpARMSLL(v, config) 277 case OpARMSLLconst: 278 return rewriteValueARM_OpARMSLLconst(v, config) 279 case OpARMSRA: 280 return rewriteValueARM_OpARMSRA(v, config) 281 case OpARMSRAcond: 282 return rewriteValueARM_OpARMSRAcond(v, config) 283 case OpARMSRAconst: 284 return rewriteValueARM_OpARMSRAconst(v, config) 285 case OpARMSRL: 286 return rewriteValueARM_OpARMSRL(v, config) 287 case OpARMSRLconst: 288 return rewriteValueARM_OpARMSRLconst(v, config) 289 case OpARMSUB: 290 return rewriteValueARM_OpARMSUB(v, config) 291 case OpARMSUBS: 292 return rewriteValueARM_OpARMSUBS(v, config) 293 case OpARMSUBSshiftLL: 294 return rewriteValueARM_OpARMSUBSshiftLL(v, config) 295 case OpARMSUBSshiftLLreg: 296 return rewriteValueARM_OpARMSUBSshiftLLreg(v, config) 297 case OpARMSUBSshiftRA: 298 return rewriteValueARM_OpARMSUBSshiftRA(v, config) 299 case OpARMSUBSshiftRAreg: 300 return rewriteValueARM_OpARMSUBSshiftRAreg(v, config) 301 case OpARMSUBSshiftRL: 302 return rewriteValueARM_OpARMSUBSshiftRL(v, config) 303 case OpARMSUBSshiftRLreg: 304 return rewriteValueARM_OpARMSUBSshiftRLreg(v, config) 305 case OpARMSUBconst: 306 return rewriteValueARM_OpARMSUBconst(v, config) 307 case OpARMSUBshiftLL: 308 return rewriteValueARM_OpARMSUBshiftLL(v, config) 309 case OpARMSUBshiftLLreg: 310 return rewriteValueARM_OpARMSUBshiftLLreg(v, config) 311 case OpARMSUBshiftRA: 312 return rewriteValueARM_OpARMSUBshiftRA(v, config) 313 case OpARMSUBshiftRAreg: 314 return rewriteValueARM_OpARMSUBshiftRAreg(v, config) 315 case OpARMSUBshiftRL: 316 return rewriteValueARM_OpARMSUBshiftRL(v, config) 317 case OpARMSUBshiftRLreg: 318 return rewriteValueARM_OpARMSUBshiftRLreg(v, config) 319 case OpARMXOR: 320 return rewriteValueARM_OpARMXOR(v, config) 321 case OpARMXORconst: 322 return rewriteValueARM_OpARMXORconst(v, config) 323 case OpARMXORshiftLL: 324 return rewriteValueARM_OpARMXORshiftLL(v, config) 325 case OpARMXORshiftLLreg: 326 return rewriteValueARM_OpARMXORshiftLLreg(v, config) 327 case OpARMXORshiftRA: 328 return rewriteValueARM_OpARMXORshiftRA(v, config) 329 case OpARMXORshiftRAreg: 330 return rewriteValueARM_OpARMXORshiftRAreg(v, config) 331 case OpARMXORshiftRL: 332 return rewriteValueARM_OpARMXORshiftRL(v, config) 333 case OpARMXORshiftRLreg: 334 return rewriteValueARM_OpARMXORshiftRLreg(v, config) 335 case OpARMXORshiftRR: 336 return rewriteValueARM_OpARMXORshiftRR(v, config) 337 case OpAdd16: 338 return rewriteValueARM_OpAdd16(v, config) 339 case OpAdd32: 340 return rewriteValueARM_OpAdd32(v, config) 341 case OpAdd32F: 342 return rewriteValueARM_OpAdd32F(v, config) 343 case OpAdd32carry: 344 return rewriteValueARM_OpAdd32carry(v, config) 345 case OpAdd32withcarry: 346 return rewriteValueARM_OpAdd32withcarry(v, config) 347 case OpAdd64F: 348 return rewriteValueARM_OpAdd64F(v, config) 349 case OpAdd8: 350 return rewriteValueARM_OpAdd8(v, config) 351 case OpAddPtr: 352 return rewriteValueARM_OpAddPtr(v, config) 353 case OpAddr: 354 return rewriteValueARM_OpAddr(v, config) 355 case OpAnd16: 356 return rewriteValueARM_OpAnd16(v, config) 357 case OpAnd32: 358 return rewriteValueARM_OpAnd32(v, config) 359 case OpAnd8: 360 return rewriteValueARM_OpAnd8(v, config) 361 case OpAndB: 362 return rewriteValueARM_OpAndB(v, config) 363 case OpBswap32: 364 return rewriteValueARM_OpBswap32(v, config) 365 case OpClosureCall: 366 return rewriteValueARM_OpClosureCall(v, config) 367 case OpCom16: 368 return rewriteValueARM_OpCom16(v, config) 369 case OpCom32: 370 return rewriteValueARM_OpCom32(v, config) 371 case OpCom8: 372 return rewriteValueARM_OpCom8(v, config) 373 case OpConst16: 374 return rewriteValueARM_OpConst16(v, config) 375 case OpConst32: 376 return rewriteValueARM_OpConst32(v, config) 377 case OpConst32F: 378 return rewriteValueARM_OpConst32F(v, config) 379 case OpConst64F: 380 return rewriteValueARM_OpConst64F(v, config) 381 case OpConst8: 382 return rewriteValueARM_OpConst8(v, config) 383 case OpConstBool: 384 return rewriteValueARM_OpConstBool(v, config) 385 case OpConstNil: 386 return rewriteValueARM_OpConstNil(v, config) 387 case OpConvert: 388 return rewriteValueARM_OpConvert(v, config) 389 case OpCtz32: 390 return rewriteValueARM_OpCtz32(v, config) 391 case OpCvt32Fto32: 392 return rewriteValueARM_OpCvt32Fto32(v, config) 393 case OpCvt32Fto32U: 394 return rewriteValueARM_OpCvt32Fto32U(v, config) 395 case OpCvt32Fto64F: 396 return rewriteValueARM_OpCvt32Fto64F(v, config) 397 case OpCvt32Uto32F: 398 return rewriteValueARM_OpCvt32Uto32F(v, config) 399 case OpCvt32Uto64F: 400 return rewriteValueARM_OpCvt32Uto64F(v, config) 401 case OpCvt32to32F: 402 return rewriteValueARM_OpCvt32to32F(v, config) 403 case OpCvt32to64F: 404 return rewriteValueARM_OpCvt32to64F(v, config) 405 case OpCvt64Fto32: 406 return rewriteValueARM_OpCvt64Fto32(v, config) 407 case OpCvt64Fto32F: 408 return rewriteValueARM_OpCvt64Fto32F(v, config) 409 case OpCvt64Fto32U: 410 return rewriteValueARM_OpCvt64Fto32U(v, config) 411 case OpDeferCall: 412 return rewriteValueARM_OpDeferCall(v, config) 413 case OpDiv16: 414 return rewriteValueARM_OpDiv16(v, config) 415 case OpDiv16u: 416 return rewriteValueARM_OpDiv16u(v, config) 417 case OpDiv32: 418 return rewriteValueARM_OpDiv32(v, config) 419 case OpDiv32F: 420 return rewriteValueARM_OpDiv32F(v, config) 421 case OpDiv32u: 422 return rewriteValueARM_OpDiv32u(v, config) 423 case OpDiv64F: 424 return rewriteValueARM_OpDiv64F(v, config) 425 case OpDiv8: 426 return rewriteValueARM_OpDiv8(v, config) 427 case OpDiv8u: 428 return rewriteValueARM_OpDiv8u(v, config) 429 case OpEq16: 430 return rewriteValueARM_OpEq16(v, config) 431 case OpEq32: 432 return rewriteValueARM_OpEq32(v, config) 433 case OpEq32F: 434 return rewriteValueARM_OpEq32F(v, config) 435 case OpEq64F: 436 return rewriteValueARM_OpEq64F(v, config) 437 case OpEq8: 438 return rewriteValueARM_OpEq8(v, config) 439 case OpEqB: 440 return rewriteValueARM_OpEqB(v, config) 441 case OpEqPtr: 442 return rewriteValueARM_OpEqPtr(v, config) 443 case OpGeq16: 444 return rewriteValueARM_OpGeq16(v, config) 445 case OpGeq16U: 446 return rewriteValueARM_OpGeq16U(v, config) 447 case OpGeq32: 448 return rewriteValueARM_OpGeq32(v, config) 449 case OpGeq32F: 450 return rewriteValueARM_OpGeq32F(v, config) 451 case OpGeq32U: 452 return rewriteValueARM_OpGeq32U(v, config) 453 case OpGeq64F: 454 return rewriteValueARM_OpGeq64F(v, config) 455 case OpGeq8: 456 return rewriteValueARM_OpGeq8(v, config) 457 case OpGeq8U: 458 return rewriteValueARM_OpGeq8U(v, config) 459 case OpGetClosurePtr: 460 return rewriteValueARM_OpGetClosurePtr(v, config) 461 case OpGoCall: 462 return rewriteValueARM_OpGoCall(v, config) 463 case OpGreater16: 464 return rewriteValueARM_OpGreater16(v, config) 465 case OpGreater16U: 466 return rewriteValueARM_OpGreater16U(v, config) 467 case OpGreater32: 468 return rewriteValueARM_OpGreater32(v, config) 469 case OpGreater32F: 470 return rewriteValueARM_OpGreater32F(v, config) 471 case OpGreater32U: 472 return rewriteValueARM_OpGreater32U(v, config) 473 case OpGreater64F: 474 return rewriteValueARM_OpGreater64F(v, config) 475 case OpGreater8: 476 return rewriteValueARM_OpGreater8(v, config) 477 case OpGreater8U: 478 return rewriteValueARM_OpGreater8U(v, config) 479 case OpHmul16: 480 return rewriteValueARM_OpHmul16(v, config) 481 case OpHmul16u: 482 return rewriteValueARM_OpHmul16u(v, config) 483 case OpHmul32: 484 return rewriteValueARM_OpHmul32(v, config) 485 case OpHmul32u: 486 return rewriteValueARM_OpHmul32u(v, config) 487 case OpHmul8: 488 return rewriteValueARM_OpHmul8(v, config) 489 case OpHmul8u: 490 return rewriteValueARM_OpHmul8u(v, config) 491 case OpInterCall: 492 return rewriteValueARM_OpInterCall(v, config) 493 case OpIsInBounds: 494 return rewriteValueARM_OpIsInBounds(v, config) 495 case OpIsNonNil: 496 return rewriteValueARM_OpIsNonNil(v, config) 497 case OpIsSliceInBounds: 498 return rewriteValueARM_OpIsSliceInBounds(v, config) 499 case OpLeq16: 500 return rewriteValueARM_OpLeq16(v, config) 501 case OpLeq16U: 502 return rewriteValueARM_OpLeq16U(v, config) 503 case OpLeq32: 504 return rewriteValueARM_OpLeq32(v, config) 505 case OpLeq32F: 506 return rewriteValueARM_OpLeq32F(v, config) 507 case OpLeq32U: 508 return rewriteValueARM_OpLeq32U(v, config) 509 case OpLeq64F: 510 return rewriteValueARM_OpLeq64F(v, config) 511 case OpLeq8: 512 return rewriteValueARM_OpLeq8(v, config) 513 case OpLeq8U: 514 return rewriteValueARM_OpLeq8U(v, config) 515 case OpLess16: 516 return rewriteValueARM_OpLess16(v, config) 517 case OpLess16U: 518 return rewriteValueARM_OpLess16U(v, config) 519 case OpLess32: 520 return rewriteValueARM_OpLess32(v, config) 521 case OpLess32F: 522 return rewriteValueARM_OpLess32F(v, config) 523 case OpLess32U: 524 return rewriteValueARM_OpLess32U(v, config) 525 case OpLess64F: 526 return rewriteValueARM_OpLess64F(v, config) 527 case OpLess8: 528 return rewriteValueARM_OpLess8(v, config) 529 case OpLess8U: 530 return rewriteValueARM_OpLess8U(v, config) 531 case OpLoad: 532 return rewriteValueARM_OpLoad(v, config) 533 case OpLsh16x16: 534 return rewriteValueARM_OpLsh16x16(v, config) 535 case OpLsh16x32: 536 return rewriteValueARM_OpLsh16x32(v, config) 537 case OpLsh16x64: 538 return rewriteValueARM_OpLsh16x64(v, config) 539 case OpLsh16x8: 540 return rewriteValueARM_OpLsh16x8(v, config) 541 case OpLsh32x16: 542 return rewriteValueARM_OpLsh32x16(v, config) 543 case OpLsh32x32: 544 return rewriteValueARM_OpLsh32x32(v, config) 545 case OpLsh32x64: 546 return rewriteValueARM_OpLsh32x64(v, config) 547 case OpLsh32x8: 548 return rewriteValueARM_OpLsh32x8(v, config) 549 case OpLsh8x16: 550 return rewriteValueARM_OpLsh8x16(v, config) 551 case OpLsh8x32: 552 return rewriteValueARM_OpLsh8x32(v, config) 553 case OpLsh8x64: 554 return rewriteValueARM_OpLsh8x64(v, config) 555 case OpLsh8x8: 556 return rewriteValueARM_OpLsh8x8(v, config) 557 case OpMod16: 558 return rewriteValueARM_OpMod16(v, config) 559 case OpMod16u: 560 return rewriteValueARM_OpMod16u(v, config) 561 case OpMod32: 562 return rewriteValueARM_OpMod32(v, config) 563 case OpMod32u: 564 return rewriteValueARM_OpMod32u(v, config) 565 case OpMod8: 566 return rewriteValueARM_OpMod8(v, config) 567 case OpMod8u: 568 return rewriteValueARM_OpMod8u(v, config) 569 case OpMove: 570 return rewriteValueARM_OpMove(v, config) 571 case OpMul16: 572 return rewriteValueARM_OpMul16(v, config) 573 case OpMul32: 574 return rewriteValueARM_OpMul32(v, config) 575 case OpMul32F: 576 return rewriteValueARM_OpMul32F(v, config) 577 case OpMul32uhilo: 578 return rewriteValueARM_OpMul32uhilo(v, config) 579 case OpMul64F: 580 return rewriteValueARM_OpMul64F(v, config) 581 case OpMul8: 582 return rewriteValueARM_OpMul8(v, config) 583 case OpNeg16: 584 return rewriteValueARM_OpNeg16(v, config) 585 case OpNeg32: 586 return rewriteValueARM_OpNeg32(v, config) 587 case OpNeg32F: 588 return rewriteValueARM_OpNeg32F(v, config) 589 case OpNeg64F: 590 return rewriteValueARM_OpNeg64F(v, config) 591 case OpNeg8: 592 return rewriteValueARM_OpNeg8(v, config) 593 case OpNeq16: 594 return rewriteValueARM_OpNeq16(v, config) 595 case OpNeq32: 596 return rewriteValueARM_OpNeq32(v, config) 597 case OpNeq32F: 598 return rewriteValueARM_OpNeq32F(v, config) 599 case OpNeq64F: 600 return rewriteValueARM_OpNeq64F(v, config) 601 case OpNeq8: 602 return rewriteValueARM_OpNeq8(v, config) 603 case OpNeqB: 604 return rewriteValueARM_OpNeqB(v, config) 605 case OpNeqPtr: 606 return rewriteValueARM_OpNeqPtr(v, config) 607 case OpNilCheck: 608 return rewriteValueARM_OpNilCheck(v, config) 609 case OpNot: 610 return rewriteValueARM_OpNot(v, config) 611 case OpOffPtr: 612 return rewriteValueARM_OpOffPtr(v, config) 613 case OpOr16: 614 return rewriteValueARM_OpOr16(v, config) 615 case OpOr32: 616 return rewriteValueARM_OpOr32(v, config) 617 case OpOr8: 618 return rewriteValueARM_OpOr8(v, config) 619 case OpOrB: 620 return rewriteValueARM_OpOrB(v, config) 621 case OpRsh16Ux16: 622 return rewriteValueARM_OpRsh16Ux16(v, config) 623 case OpRsh16Ux32: 624 return rewriteValueARM_OpRsh16Ux32(v, config) 625 case OpRsh16Ux64: 626 return rewriteValueARM_OpRsh16Ux64(v, config) 627 case OpRsh16Ux8: 628 return rewriteValueARM_OpRsh16Ux8(v, config) 629 case OpRsh16x16: 630 return rewriteValueARM_OpRsh16x16(v, config) 631 case OpRsh16x32: 632 return rewriteValueARM_OpRsh16x32(v, config) 633 case OpRsh16x64: 634 return rewriteValueARM_OpRsh16x64(v, config) 635 case OpRsh16x8: 636 return rewriteValueARM_OpRsh16x8(v, config) 637 case OpRsh32Ux16: 638 return rewriteValueARM_OpRsh32Ux16(v, config) 639 case OpRsh32Ux32: 640 return rewriteValueARM_OpRsh32Ux32(v, config) 641 case OpRsh32Ux64: 642 return rewriteValueARM_OpRsh32Ux64(v, config) 643 case OpRsh32Ux8: 644 return rewriteValueARM_OpRsh32Ux8(v, config) 645 case OpRsh32x16: 646 return rewriteValueARM_OpRsh32x16(v, config) 647 case OpRsh32x32: 648 return rewriteValueARM_OpRsh32x32(v, config) 649 case OpRsh32x64: 650 return rewriteValueARM_OpRsh32x64(v, config) 651 case OpRsh32x8: 652 return rewriteValueARM_OpRsh32x8(v, config) 653 case OpRsh8Ux16: 654 return rewriteValueARM_OpRsh8Ux16(v, config) 655 case OpRsh8Ux32: 656 return rewriteValueARM_OpRsh8Ux32(v, config) 657 case OpRsh8Ux64: 658 return rewriteValueARM_OpRsh8Ux64(v, config) 659 case OpRsh8Ux8: 660 return rewriteValueARM_OpRsh8Ux8(v, config) 661 case OpRsh8x16: 662 return rewriteValueARM_OpRsh8x16(v, config) 663 case OpRsh8x32: 664 return rewriteValueARM_OpRsh8x32(v, config) 665 case OpRsh8x64: 666 return rewriteValueARM_OpRsh8x64(v, config) 667 case OpRsh8x8: 668 return rewriteValueARM_OpRsh8x8(v, config) 669 case OpSelect0: 670 return rewriteValueARM_OpSelect0(v, config) 671 case OpSelect1: 672 return rewriteValueARM_OpSelect1(v, config) 673 case OpSignExt16to32: 674 return rewriteValueARM_OpSignExt16to32(v, config) 675 case OpSignExt8to16: 676 return rewriteValueARM_OpSignExt8to16(v, config) 677 case OpSignExt8to32: 678 return rewriteValueARM_OpSignExt8to32(v, config) 679 case OpSignmask: 680 return rewriteValueARM_OpSignmask(v, config) 681 case OpSlicemask: 682 return rewriteValueARM_OpSlicemask(v, config) 683 case OpSqrt: 684 return rewriteValueARM_OpSqrt(v, config) 685 case OpStaticCall: 686 return rewriteValueARM_OpStaticCall(v, config) 687 case OpStore: 688 return rewriteValueARM_OpStore(v, config) 689 case OpSub16: 690 return rewriteValueARM_OpSub16(v, config) 691 case OpSub32: 692 return rewriteValueARM_OpSub32(v, config) 693 case OpSub32F: 694 return rewriteValueARM_OpSub32F(v, config) 695 case OpSub32carry: 696 return rewriteValueARM_OpSub32carry(v, config) 697 case OpSub32withcarry: 698 return rewriteValueARM_OpSub32withcarry(v, config) 699 case OpSub64F: 700 return rewriteValueARM_OpSub64F(v, config) 701 case OpSub8: 702 return rewriteValueARM_OpSub8(v, config) 703 case OpSubPtr: 704 return rewriteValueARM_OpSubPtr(v, config) 705 case OpTrunc16to8: 706 return rewriteValueARM_OpTrunc16to8(v, config) 707 case OpTrunc32to16: 708 return rewriteValueARM_OpTrunc32to16(v, config) 709 case OpTrunc32to8: 710 return rewriteValueARM_OpTrunc32to8(v, config) 711 case OpXor16: 712 return rewriteValueARM_OpXor16(v, config) 713 case OpXor32: 714 return rewriteValueARM_OpXor32(v, config) 715 case OpXor8: 716 return rewriteValueARM_OpXor8(v, config) 717 case OpZero: 718 return rewriteValueARM_OpZero(v, config) 719 case OpZeroExt16to32: 720 return rewriteValueARM_OpZeroExt16to32(v, config) 721 case OpZeroExt8to16: 722 return rewriteValueARM_OpZeroExt8to16(v, config) 723 case OpZeroExt8to32: 724 return rewriteValueARM_OpZeroExt8to32(v, config) 725 case OpZeromask: 726 return rewriteValueARM_OpZeromask(v, config) 727 } 728 return false 729 } 730 func rewriteValueARM_OpARMADC(v *Value, config *Config) bool { 731 b := v.Block 732 _ = b 733 // match: (ADC (MOVWconst [c]) x flags) 734 // cond: 735 // result: (ADCconst [c] x flags) 736 for { 737 v_0 := v.Args[0] 738 if v_0.Op != OpARMMOVWconst { 739 break 740 } 741 c := v_0.AuxInt 742 x := v.Args[1] 743 flags := v.Args[2] 744 v.reset(OpARMADCconst) 745 v.AuxInt = c 746 v.AddArg(x) 747 v.AddArg(flags) 748 return true 749 } 750 // match: (ADC x (MOVWconst [c]) flags) 751 // cond: 752 // result: (ADCconst [c] x flags) 753 for { 754 x := v.Args[0] 755 v_1 := v.Args[1] 756 if v_1.Op != OpARMMOVWconst { 757 break 758 } 759 c := v_1.AuxInt 760 flags := v.Args[2] 761 v.reset(OpARMADCconst) 762 v.AuxInt = c 763 v.AddArg(x) 764 v.AddArg(flags) 765 return true 766 } 767 // match: (ADC x (SLLconst [c] y) flags) 768 // cond: 769 // result: (ADCshiftLL x y [c] flags) 770 for { 771 x := v.Args[0] 772 v_1 := v.Args[1] 773 if v_1.Op != OpARMSLLconst { 774 break 775 } 776 c := v_1.AuxInt 777 y := v_1.Args[0] 778 flags := v.Args[2] 779 v.reset(OpARMADCshiftLL) 780 v.AuxInt = c 781 v.AddArg(x) 782 v.AddArg(y) 783 v.AddArg(flags) 784 return true 785 } 786 // match: (ADC (SLLconst [c] y) x flags) 787 // cond: 788 // result: (ADCshiftLL x y [c] flags) 789 for { 790 v_0 := v.Args[0] 791 if v_0.Op != OpARMSLLconst { 792 break 793 } 794 c := v_0.AuxInt 795 y := v_0.Args[0] 796 x := v.Args[1] 797 flags := v.Args[2] 798 v.reset(OpARMADCshiftLL) 799 v.AuxInt = c 800 v.AddArg(x) 801 v.AddArg(y) 802 v.AddArg(flags) 803 return true 804 } 805 // match: (ADC x (SRLconst [c] y) flags) 806 // cond: 807 // result: (ADCshiftRL x y [c] flags) 808 for { 809 x := v.Args[0] 810 v_1 := v.Args[1] 811 if v_1.Op != OpARMSRLconst { 812 break 813 } 814 c := v_1.AuxInt 815 y := v_1.Args[0] 816 flags := v.Args[2] 817 v.reset(OpARMADCshiftRL) 818 v.AuxInt = c 819 v.AddArg(x) 820 v.AddArg(y) 821 v.AddArg(flags) 822 return true 823 } 824 // match: (ADC (SRLconst [c] y) x flags) 825 // cond: 826 // result: (ADCshiftRL x y [c] flags) 827 for { 828 v_0 := v.Args[0] 829 if v_0.Op != OpARMSRLconst { 830 break 831 } 832 c := v_0.AuxInt 833 y := v_0.Args[0] 834 x := v.Args[1] 835 flags := v.Args[2] 836 v.reset(OpARMADCshiftRL) 837 v.AuxInt = c 838 v.AddArg(x) 839 v.AddArg(y) 840 v.AddArg(flags) 841 return true 842 } 843 // match: (ADC x (SRAconst [c] y) flags) 844 // cond: 845 // result: (ADCshiftRA x y [c] flags) 846 for { 847 x := v.Args[0] 848 v_1 := v.Args[1] 849 if v_1.Op != OpARMSRAconst { 850 break 851 } 852 c := v_1.AuxInt 853 y := v_1.Args[0] 854 flags := v.Args[2] 855 v.reset(OpARMADCshiftRA) 856 v.AuxInt = c 857 v.AddArg(x) 858 v.AddArg(y) 859 v.AddArg(flags) 860 return true 861 } 862 // match: (ADC (SRAconst [c] y) x flags) 863 // cond: 864 // result: (ADCshiftRA x y [c] flags) 865 for { 866 v_0 := v.Args[0] 867 if v_0.Op != OpARMSRAconst { 868 break 869 } 870 c := v_0.AuxInt 871 y := v_0.Args[0] 872 x := v.Args[1] 873 flags := v.Args[2] 874 v.reset(OpARMADCshiftRA) 875 v.AuxInt = c 876 v.AddArg(x) 877 v.AddArg(y) 878 v.AddArg(flags) 879 return true 880 } 881 // match: (ADC x (SLL y z) flags) 882 // cond: 883 // result: (ADCshiftLLreg x y z flags) 884 for { 885 x := v.Args[0] 886 v_1 := v.Args[1] 887 if v_1.Op != OpARMSLL { 888 break 889 } 890 y := v_1.Args[0] 891 z := v_1.Args[1] 892 flags := v.Args[2] 893 v.reset(OpARMADCshiftLLreg) 894 v.AddArg(x) 895 v.AddArg(y) 896 v.AddArg(z) 897 v.AddArg(flags) 898 return true 899 } 900 // match: (ADC (SLL y z) x flags) 901 // cond: 902 // result: (ADCshiftLLreg x y z flags) 903 for { 904 v_0 := v.Args[0] 905 if v_0.Op != OpARMSLL { 906 break 907 } 908 y := v_0.Args[0] 909 z := v_0.Args[1] 910 x := v.Args[1] 911 flags := v.Args[2] 912 v.reset(OpARMADCshiftLLreg) 913 v.AddArg(x) 914 v.AddArg(y) 915 v.AddArg(z) 916 v.AddArg(flags) 917 return true 918 } 919 // match: (ADC x (SRL y z) flags) 920 // cond: 921 // result: (ADCshiftRLreg x y z flags) 922 for { 923 x := v.Args[0] 924 v_1 := v.Args[1] 925 if v_1.Op != OpARMSRL { 926 break 927 } 928 y := v_1.Args[0] 929 z := v_1.Args[1] 930 flags := v.Args[2] 931 v.reset(OpARMADCshiftRLreg) 932 v.AddArg(x) 933 v.AddArg(y) 934 v.AddArg(z) 935 v.AddArg(flags) 936 return true 937 } 938 // match: (ADC (SRL y z) x flags) 939 // cond: 940 // result: (ADCshiftRLreg x y z flags) 941 for { 942 v_0 := v.Args[0] 943 if v_0.Op != OpARMSRL { 944 break 945 } 946 y := v_0.Args[0] 947 z := v_0.Args[1] 948 x := v.Args[1] 949 flags := v.Args[2] 950 v.reset(OpARMADCshiftRLreg) 951 v.AddArg(x) 952 v.AddArg(y) 953 v.AddArg(z) 954 v.AddArg(flags) 955 return true 956 } 957 // match: (ADC x (SRA y z) flags) 958 // cond: 959 // result: (ADCshiftRAreg x y z flags) 960 for { 961 x := v.Args[0] 962 v_1 := v.Args[1] 963 if v_1.Op != OpARMSRA { 964 break 965 } 966 y := v_1.Args[0] 967 z := v_1.Args[1] 968 flags := v.Args[2] 969 v.reset(OpARMADCshiftRAreg) 970 v.AddArg(x) 971 v.AddArg(y) 972 v.AddArg(z) 973 v.AddArg(flags) 974 return true 975 } 976 // match: (ADC (SRA y z) x flags) 977 // cond: 978 // result: (ADCshiftRAreg x y z flags) 979 for { 980 v_0 := v.Args[0] 981 if v_0.Op != OpARMSRA { 982 break 983 } 984 y := v_0.Args[0] 985 z := v_0.Args[1] 986 x := v.Args[1] 987 flags := v.Args[2] 988 v.reset(OpARMADCshiftRAreg) 989 v.AddArg(x) 990 v.AddArg(y) 991 v.AddArg(z) 992 v.AddArg(flags) 993 return true 994 } 995 return false 996 } 997 func rewriteValueARM_OpARMADCconst(v *Value, config *Config) bool { 998 b := v.Block 999 _ = b 1000 // match: (ADCconst [c] (ADDconst [d] x) flags) 1001 // cond: 1002 // result: (ADCconst [int64(int32(c+d))] x flags) 1003 for { 1004 c := v.AuxInt 1005 v_0 := v.Args[0] 1006 if v_0.Op != OpARMADDconst { 1007 break 1008 } 1009 d := v_0.AuxInt 1010 x := v_0.Args[0] 1011 flags := v.Args[1] 1012 v.reset(OpARMADCconst) 1013 v.AuxInt = int64(int32(c + d)) 1014 v.AddArg(x) 1015 v.AddArg(flags) 1016 return true 1017 } 1018 // match: (ADCconst [c] (SUBconst [d] x) flags) 1019 // cond: 1020 // result: (ADCconst [int64(int32(c-d))] x flags) 1021 for { 1022 c := v.AuxInt 1023 v_0 := v.Args[0] 1024 if v_0.Op != OpARMSUBconst { 1025 break 1026 } 1027 d := v_0.AuxInt 1028 x := v_0.Args[0] 1029 flags := v.Args[1] 1030 v.reset(OpARMADCconst) 1031 v.AuxInt = int64(int32(c - d)) 1032 v.AddArg(x) 1033 v.AddArg(flags) 1034 return true 1035 } 1036 return false 1037 } 1038 func rewriteValueARM_OpARMADCshiftLL(v *Value, config *Config) bool { 1039 b := v.Block 1040 _ = b 1041 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1042 // cond: 1043 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1044 for { 1045 d := v.AuxInt 1046 v_0 := v.Args[0] 1047 if v_0.Op != OpARMMOVWconst { 1048 break 1049 } 1050 c := v_0.AuxInt 1051 x := v.Args[1] 1052 flags := v.Args[2] 1053 v.reset(OpARMADCconst) 1054 v.AuxInt = c 1055 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1056 v0.AuxInt = d 1057 v0.AddArg(x) 1058 v.AddArg(v0) 1059 v.AddArg(flags) 1060 return true 1061 } 1062 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1063 // cond: 1064 // result: (ADCconst x [int64(uint32(c)<<uint64(d))] flags) 1065 for { 1066 d := v.AuxInt 1067 x := v.Args[0] 1068 v_1 := v.Args[1] 1069 if v_1.Op != OpARMMOVWconst { 1070 break 1071 } 1072 c := v_1.AuxInt 1073 flags := v.Args[2] 1074 v.reset(OpARMADCconst) 1075 v.AuxInt = int64(uint32(c) << uint64(d)) 1076 v.AddArg(x) 1077 v.AddArg(flags) 1078 return true 1079 } 1080 return false 1081 } 1082 func rewriteValueARM_OpARMADCshiftLLreg(v *Value, config *Config) bool { 1083 b := v.Block 1084 _ = b 1085 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1086 // cond: 1087 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1088 for { 1089 v_0 := v.Args[0] 1090 if v_0.Op != OpARMMOVWconst { 1091 break 1092 } 1093 c := v_0.AuxInt 1094 x := v.Args[1] 1095 y := v.Args[2] 1096 flags := v.Args[3] 1097 v.reset(OpARMADCconst) 1098 v.AuxInt = c 1099 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1100 v0.AddArg(x) 1101 v0.AddArg(y) 1102 v.AddArg(v0) 1103 v.AddArg(flags) 1104 return true 1105 } 1106 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1107 // cond: 1108 // result: (ADCshiftLL x y [c] flags) 1109 for { 1110 x := v.Args[0] 1111 y := v.Args[1] 1112 v_2 := v.Args[2] 1113 if v_2.Op != OpARMMOVWconst { 1114 break 1115 } 1116 c := v_2.AuxInt 1117 flags := v.Args[3] 1118 v.reset(OpARMADCshiftLL) 1119 v.AuxInt = c 1120 v.AddArg(x) 1121 v.AddArg(y) 1122 v.AddArg(flags) 1123 return true 1124 } 1125 return false 1126 } 1127 func rewriteValueARM_OpARMADCshiftRA(v *Value, config *Config) bool { 1128 b := v.Block 1129 _ = b 1130 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1131 // cond: 1132 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1133 for { 1134 d := v.AuxInt 1135 v_0 := v.Args[0] 1136 if v_0.Op != OpARMMOVWconst { 1137 break 1138 } 1139 c := v_0.AuxInt 1140 x := v.Args[1] 1141 flags := v.Args[2] 1142 v.reset(OpARMADCconst) 1143 v.AuxInt = c 1144 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1145 v0.AuxInt = d 1146 v0.AddArg(x) 1147 v.AddArg(v0) 1148 v.AddArg(flags) 1149 return true 1150 } 1151 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1152 // cond: 1153 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1154 for { 1155 d := v.AuxInt 1156 x := v.Args[0] 1157 v_1 := v.Args[1] 1158 if v_1.Op != OpARMMOVWconst { 1159 break 1160 } 1161 c := v_1.AuxInt 1162 flags := v.Args[2] 1163 v.reset(OpARMADCconst) 1164 v.AuxInt = int64(int32(c) >> uint64(d)) 1165 v.AddArg(x) 1166 v.AddArg(flags) 1167 return true 1168 } 1169 return false 1170 } 1171 func rewriteValueARM_OpARMADCshiftRAreg(v *Value, config *Config) bool { 1172 b := v.Block 1173 _ = b 1174 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1175 // cond: 1176 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1177 for { 1178 v_0 := v.Args[0] 1179 if v_0.Op != OpARMMOVWconst { 1180 break 1181 } 1182 c := v_0.AuxInt 1183 x := v.Args[1] 1184 y := v.Args[2] 1185 flags := v.Args[3] 1186 v.reset(OpARMADCconst) 1187 v.AuxInt = c 1188 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1189 v0.AddArg(x) 1190 v0.AddArg(y) 1191 v.AddArg(v0) 1192 v.AddArg(flags) 1193 return true 1194 } 1195 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1196 // cond: 1197 // result: (ADCshiftRA x y [c] flags) 1198 for { 1199 x := v.Args[0] 1200 y := v.Args[1] 1201 v_2 := v.Args[2] 1202 if v_2.Op != OpARMMOVWconst { 1203 break 1204 } 1205 c := v_2.AuxInt 1206 flags := v.Args[3] 1207 v.reset(OpARMADCshiftRA) 1208 v.AuxInt = c 1209 v.AddArg(x) 1210 v.AddArg(y) 1211 v.AddArg(flags) 1212 return true 1213 } 1214 return false 1215 } 1216 func rewriteValueARM_OpARMADCshiftRL(v *Value, config *Config) bool { 1217 b := v.Block 1218 _ = b 1219 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1220 // cond: 1221 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1222 for { 1223 d := v.AuxInt 1224 v_0 := v.Args[0] 1225 if v_0.Op != OpARMMOVWconst { 1226 break 1227 } 1228 c := v_0.AuxInt 1229 x := v.Args[1] 1230 flags := v.Args[2] 1231 v.reset(OpARMADCconst) 1232 v.AuxInt = c 1233 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1234 v0.AuxInt = d 1235 v0.AddArg(x) 1236 v.AddArg(v0) 1237 v.AddArg(flags) 1238 return true 1239 } 1240 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1241 // cond: 1242 // result: (ADCconst x [int64(uint32(c)>>uint64(d))] flags) 1243 for { 1244 d := v.AuxInt 1245 x := v.Args[0] 1246 v_1 := v.Args[1] 1247 if v_1.Op != OpARMMOVWconst { 1248 break 1249 } 1250 c := v_1.AuxInt 1251 flags := v.Args[2] 1252 v.reset(OpARMADCconst) 1253 v.AuxInt = int64(uint32(c) >> uint64(d)) 1254 v.AddArg(x) 1255 v.AddArg(flags) 1256 return true 1257 } 1258 return false 1259 } 1260 func rewriteValueARM_OpARMADCshiftRLreg(v *Value, config *Config) bool { 1261 b := v.Block 1262 _ = b 1263 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1264 // cond: 1265 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1266 for { 1267 v_0 := v.Args[0] 1268 if v_0.Op != OpARMMOVWconst { 1269 break 1270 } 1271 c := v_0.AuxInt 1272 x := v.Args[1] 1273 y := v.Args[2] 1274 flags := v.Args[3] 1275 v.reset(OpARMADCconst) 1276 v.AuxInt = c 1277 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1278 v0.AddArg(x) 1279 v0.AddArg(y) 1280 v.AddArg(v0) 1281 v.AddArg(flags) 1282 return true 1283 } 1284 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1285 // cond: 1286 // result: (ADCshiftRL x y [c] flags) 1287 for { 1288 x := v.Args[0] 1289 y := v.Args[1] 1290 v_2 := v.Args[2] 1291 if v_2.Op != OpARMMOVWconst { 1292 break 1293 } 1294 c := v_2.AuxInt 1295 flags := v.Args[3] 1296 v.reset(OpARMADCshiftRL) 1297 v.AuxInt = c 1298 v.AddArg(x) 1299 v.AddArg(y) 1300 v.AddArg(flags) 1301 return true 1302 } 1303 return false 1304 } 1305 func rewriteValueARM_OpARMADD(v *Value, config *Config) bool { 1306 b := v.Block 1307 _ = b 1308 // match: (ADD (MOVWconst [c]) x) 1309 // cond: 1310 // result: (ADDconst [c] x) 1311 for { 1312 v_0 := v.Args[0] 1313 if v_0.Op != OpARMMOVWconst { 1314 break 1315 } 1316 c := v_0.AuxInt 1317 x := v.Args[1] 1318 v.reset(OpARMADDconst) 1319 v.AuxInt = c 1320 v.AddArg(x) 1321 return true 1322 } 1323 // match: (ADD x (MOVWconst [c])) 1324 // cond: 1325 // result: (ADDconst [c] x) 1326 for { 1327 x := v.Args[0] 1328 v_1 := v.Args[1] 1329 if v_1.Op != OpARMMOVWconst { 1330 break 1331 } 1332 c := v_1.AuxInt 1333 v.reset(OpARMADDconst) 1334 v.AuxInt = c 1335 v.AddArg(x) 1336 return true 1337 } 1338 // match: (ADD x (SLLconst [c] y)) 1339 // cond: 1340 // result: (ADDshiftLL x y [c]) 1341 for { 1342 x := v.Args[0] 1343 v_1 := v.Args[1] 1344 if v_1.Op != OpARMSLLconst { 1345 break 1346 } 1347 c := v_1.AuxInt 1348 y := v_1.Args[0] 1349 v.reset(OpARMADDshiftLL) 1350 v.AuxInt = c 1351 v.AddArg(x) 1352 v.AddArg(y) 1353 return true 1354 } 1355 // match: (ADD (SLLconst [c] y) x) 1356 // cond: 1357 // result: (ADDshiftLL x y [c]) 1358 for { 1359 v_0 := v.Args[0] 1360 if v_0.Op != OpARMSLLconst { 1361 break 1362 } 1363 c := v_0.AuxInt 1364 y := v_0.Args[0] 1365 x := v.Args[1] 1366 v.reset(OpARMADDshiftLL) 1367 v.AuxInt = c 1368 v.AddArg(x) 1369 v.AddArg(y) 1370 return true 1371 } 1372 // match: (ADD x (SRLconst [c] y)) 1373 // cond: 1374 // result: (ADDshiftRL x y [c]) 1375 for { 1376 x := v.Args[0] 1377 v_1 := v.Args[1] 1378 if v_1.Op != OpARMSRLconst { 1379 break 1380 } 1381 c := v_1.AuxInt 1382 y := v_1.Args[0] 1383 v.reset(OpARMADDshiftRL) 1384 v.AuxInt = c 1385 v.AddArg(x) 1386 v.AddArg(y) 1387 return true 1388 } 1389 // match: (ADD (SRLconst [c] y) x) 1390 // cond: 1391 // result: (ADDshiftRL x y [c]) 1392 for { 1393 v_0 := v.Args[0] 1394 if v_0.Op != OpARMSRLconst { 1395 break 1396 } 1397 c := v_0.AuxInt 1398 y := v_0.Args[0] 1399 x := v.Args[1] 1400 v.reset(OpARMADDshiftRL) 1401 v.AuxInt = c 1402 v.AddArg(x) 1403 v.AddArg(y) 1404 return true 1405 } 1406 // match: (ADD x (SRAconst [c] y)) 1407 // cond: 1408 // result: (ADDshiftRA x y [c]) 1409 for { 1410 x := v.Args[0] 1411 v_1 := v.Args[1] 1412 if v_1.Op != OpARMSRAconst { 1413 break 1414 } 1415 c := v_1.AuxInt 1416 y := v_1.Args[0] 1417 v.reset(OpARMADDshiftRA) 1418 v.AuxInt = c 1419 v.AddArg(x) 1420 v.AddArg(y) 1421 return true 1422 } 1423 // match: (ADD (SRAconst [c] y) x) 1424 // cond: 1425 // result: (ADDshiftRA x y [c]) 1426 for { 1427 v_0 := v.Args[0] 1428 if v_0.Op != OpARMSRAconst { 1429 break 1430 } 1431 c := v_0.AuxInt 1432 y := v_0.Args[0] 1433 x := v.Args[1] 1434 v.reset(OpARMADDshiftRA) 1435 v.AuxInt = c 1436 v.AddArg(x) 1437 v.AddArg(y) 1438 return true 1439 } 1440 // match: (ADD x (SLL y z)) 1441 // cond: 1442 // result: (ADDshiftLLreg x y z) 1443 for { 1444 x := v.Args[0] 1445 v_1 := v.Args[1] 1446 if v_1.Op != OpARMSLL { 1447 break 1448 } 1449 y := v_1.Args[0] 1450 z := v_1.Args[1] 1451 v.reset(OpARMADDshiftLLreg) 1452 v.AddArg(x) 1453 v.AddArg(y) 1454 v.AddArg(z) 1455 return true 1456 } 1457 // match: (ADD (SLL y z) x) 1458 // cond: 1459 // result: (ADDshiftLLreg x y z) 1460 for { 1461 v_0 := v.Args[0] 1462 if v_0.Op != OpARMSLL { 1463 break 1464 } 1465 y := v_0.Args[0] 1466 z := v_0.Args[1] 1467 x := v.Args[1] 1468 v.reset(OpARMADDshiftLLreg) 1469 v.AddArg(x) 1470 v.AddArg(y) 1471 v.AddArg(z) 1472 return true 1473 } 1474 // match: (ADD x (SRL y z)) 1475 // cond: 1476 // result: (ADDshiftRLreg x y z) 1477 for { 1478 x := v.Args[0] 1479 v_1 := v.Args[1] 1480 if v_1.Op != OpARMSRL { 1481 break 1482 } 1483 y := v_1.Args[0] 1484 z := v_1.Args[1] 1485 v.reset(OpARMADDshiftRLreg) 1486 v.AddArg(x) 1487 v.AddArg(y) 1488 v.AddArg(z) 1489 return true 1490 } 1491 // match: (ADD (SRL y z) x) 1492 // cond: 1493 // result: (ADDshiftRLreg x y z) 1494 for { 1495 v_0 := v.Args[0] 1496 if v_0.Op != OpARMSRL { 1497 break 1498 } 1499 y := v_0.Args[0] 1500 z := v_0.Args[1] 1501 x := v.Args[1] 1502 v.reset(OpARMADDshiftRLreg) 1503 v.AddArg(x) 1504 v.AddArg(y) 1505 v.AddArg(z) 1506 return true 1507 } 1508 // match: (ADD x (SRA y z)) 1509 // cond: 1510 // result: (ADDshiftRAreg x y z) 1511 for { 1512 x := v.Args[0] 1513 v_1 := v.Args[1] 1514 if v_1.Op != OpARMSRA { 1515 break 1516 } 1517 y := v_1.Args[0] 1518 z := v_1.Args[1] 1519 v.reset(OpARMADDshiftRAreg) 1520 v.AddArg(x) 1521 v.AddArg(y) 1522 v.AddArg(z) 1523 return true 1524 } 1525 // match: (ADD (SRA y z) x) 1526 // cond: 1527 // result: (ADDshiftRAreg x y z) 1528 for { 1529 v_0 := v.Args[0] 1530 if v_0.Op != OpARMSRA { 1531 break 1532 } 1533 y := v_0.Args[0] 1534 z := v_0.Args[1] 1535 x := v.Args[1] 1536 v.reset(OpARMADDshiftRAreg) 1537 v.AddArg(x) 1538 v.AddArg(y) 1539 v.AddArg(z) 1540 return true 1541 } 1542 // match: (ADD x (RSBconst [0] y)) 1543 // cond: 1544 // result: (SUB x y) 1545 for { 1546 x := v.Args[0] 1547 v_1 := v.Args[1] 1548 if v_1.Op != OpARMRSBconst { 1549 break 1550 } 1551 if v_1.AuxInt != 0 { 1552 break 1553 } 1554 y := v_1.Args[0] 1555 v.reset(OpARMSUB) 1556 v.AddArg(x) 1557 v.AddArg(y) 1558 return true 1559 } 1560 // match: (ADD (RSBconst [0] y) x) 1561 // cond: 1562 // result: (SUB x y) 1563 for { 1564 v_0 := v.Args[0] 1565 if v_0.Op != OpARMRSBconst { 1566 break 1567 } 1568 if v_0.AuxInt != 0 { 1569 break 1570 } 1571 y := v_0.Args[0] 1572 x := v.Args[1] 1573 v.reset(OpARMSUB) 1574 v.AddArg(x) 1575 v.AddArg(y) 1576 return true 1577 } 1578 // match: (ADD (MUL x y) a) 1579 // cond: 1580 // result: (MULA x y a) 1581 for { 1582 v_0 := v.Args[0] 1583 if v_0.Op != OpARMMUL { 1584 break 1585 } 1586 x := v_0.Args[0] 1587 y := v_0.Args[1] 1588 a := v.Args[1] 1589 v.reset(OpARMMULA) 1590 v.AddArg(x) 1591 v.AddArg(y) 1592 v.AddArg(a) 1593 return true 1594 } 1595 // match: (ADD a (MUL x y)) 1596 // cond: 1597 // result: (MULA x y a) 1598 for { 1599 a := v.Args[0] 1600 v_1 := v.Args[1] 1601 if v_1.Op != OpARMMUL { 1602 break 1603 } 1604 x := v_1.Args[0] 1605 y := v_1.Args[1] 1606 v.reset(OpARMMULA) 1607 v.AddArg(x) 1608 v.AddArg(y) 1609 v.AddArg(a) 1610 return true 1611 } 1612 return false 1613 } 1614 func rewriteValueARM_OpARMADDS(v *Value, config *Config) bool { 1615 b := v.Block 1616 _ = b 1617 // match: (ADDS (MOVWconst [c]) x) 1618 // cond: 1619 // result: (ADDSconst [c] x) 1620 for { 1621 v_0 := v.Args[0] 1622 if v_0.Op != OpARMMOVWconst { 1623 break 1624 } 1625 c := v_0.AuxInt 1626 x := v.Args[1] 1627 v.reset(OpARMADDSconst) 1628 v.AuxInt = c 1629 v.AddArg(x) 1630 return true 1631 } 1632 // match: (ADDS x (MOVWconst [c])) 1633 // cond: 1634 // result: (ADDSconst [c] x) 1635 for { 1636 x := v.Args[0] 1637 v_1 := v.Args[1] 1638 if v_1.Op != OpARMMOVWconst { 1639 break 1640 } 1641 c := v_1.AuxInt 1642 v.reset(OpARMADDSconst) 1643 v.AuxInt = c 1644 v.AddArg(x) 1645 return true 1646 } 1647 // match: (ADDS x (SLLconst [c] y)) 1648 // cond: 1649 // result: (ADDSshiftLL x y [c]) 1650 for { 1651 x := v.Args[0] 1652 v_1 := v.Args[1] 1653 if v_1.Op != OpARMSLLconst { 1654 break 1655 } 1656 c := v_1.AuxInt 1657 y := v_1.Args[0] 1658 v.reset(OpARMADDSshiftLL) 1659 v.AuxInt = c 1660 v.AddArg(x) 1661 v.AddArg(y) 1662 return true 1663 } 1664 // match: (ADDS (SLLconst [c] y) x) 1665 // cond: 1666 // result: (ADDSshiftLL x y [c]) 1667 for { 1668 v_0 := v.Args[0] 1669 if v_0.Op != OpARMSLLconst { 1670 break 1671 } 1672 c := v_0.AuxInt 1673 y := v_0.Args[0] 1674 x := v.Args[1] 1675 v.reset(OpARMADDSshiftLL) 1676 v.AuxInt = c 1677 v.AddArg(x) 1678 v.AddArg(y) 1679 return true 1680 } 1681 // match: (ADDS x (SRLconst [c] y)) 1682 // cond: 1683 // result: (ADDSshiftRL x y [c]) 1684 for { 1685 x := v.Args[0] 1686 v_1 := v.Args[1] 1687 if v_1.Op != OpARMSRLconst { 1688 break 1689 } 1690 c := v_1.AuxInt 1691 y := v_1.Args[0] 1692 v.reset(OpARMADDSshiftRL) 1693 v.AuxInt = c 1694 v.AddArg(x) 1695 v.AddArg(y) 1696 return true 1697 } 1698 // match: (ADDS (SRLconst [c] y) x) 1699 // cond: 1700 // result: (ADDSshiftRL x y [c]) 1701 for { 1702 v_0 := v.Args[0] 1703 if v_0.Op != OpARMSRLconst { 1704 break 1705 } 1706 c := v_0.AuxInt 1707 y := v_0.Args[0] 1708 x := v.Args[1] 1709 v.reset(OpARMADDSshiftRL) 1710 v.AuxInt = c 1711 v.AddArg(x) 1712 v.AddArg(y) 1713 return true 1714 } 1715 // match: (ADDS x (SRAconst [c] y)) 1716 // cond: 1717 // result: (ADDSshiftRA x y [c]) 1718 for { 1719 x := v.Args[0] 1720 v_1 := v.Args[1] 1721 if v_1.Op != OpARMSRAconst { 1722 break 1723 } 1724 c := v_1.AuxInt 1725 y := v_1.Args[0] 1726 v.reset(OpARMADDSshiftRA) 1727 v.AuxInt = c 1728 v.AddArg(x) 1729 v.AddArg(y) 1730 return true 1731 } 1732 // match: (ADDS (SRAconst [c] y) x) 1733 // cond: 1734 // result: (ADDSshiftRA x y [c]) 1735 for { 1736 v_0 := v.Args[0] 1737 if v_0.Op != OpARMSRAconst { 1738 break 1739 } 1740 c := v_0.AuxInt 1741 y := v_0.Args[0] 1742 x := v.Args[1] 1743 v.reset(OpARMADDSshiftRA) 1744 v.AuxInt = c 1745 v.AddArg(x) 1746 v.AddArg(y) 1747 return true 1748 } 1749 // match: (ADDS x (SLL y z)) 1750 // cond: 1751 // result: (ADDSshiftLLreg x y z) 1752 for { 1753 x := v.Args[0] 1754 v_1 := v.Args[1] 1755 if v_1.Op != OpARMSLL { 1756 break 1757 } 1758 y := v_1.Args[0] 1759 z := v_1.Args[1] 1760 v.reset(OpARMADDSshiftLLreg) 1761 v.AddArg(x) 1762 v.AddArg(y) 1763 v.AddArg(z) 1764 return true 1765 } 1766 // match: (ADDS (SLL y z) x) 1767 // cond: 1768 // result: (ADDSshiftLLreg x y z) 1769 for { 1770 v_0 := v.Args[0] 1771 if v_0.Op != OpARMSLL { 1772 break 1773 } 1774 y := v_0.Args[0] 1775 z := v_0.Args[1] 1776 x := v.Args[1] 1777 v.reset(OpARMADDSshiftLLreg) 1778 v.AddArg(x) 1779 v.AddArg(y) 1780 v.AddArg(z) 1781 return true 1782 } 1783 // match: (ADDS x (SRL y z)) 1784 // cond: 1785 // result: (ADDSshiftRLreg x y z) 1786 for { 1787 x := v.Args[0] 1788 v_1 := v.Args[1] 1789 if v_1.Op != OpARMSRL { 1790 break 1791 } 1792 y := v_1.Args[0] 1793 z := v_1.Args[1] 1794 v.reset(OpARMADDSshiftRLreg) 1795 v.AddArg(x) 1796 v.AddArg(y) 1797 v.AddArg(z) 1798 return true 1799 } 1800 // match: (ADDS (SRL y z) x) 1801 // cond: 1802 // result: (ADDSshiftRLreg x y z) 1803 for { 1804 v_0 := v.Args[0] 1805 if v_0.Op != OpARMSRL { 1806 break 1807 } 1808 y := v_0.Args[0] 1809 z := v_0.Args[1] 1810 x := v.Args[1] 1811 v.reset(OpARMADDSshiftRLreg) 1812 v.AddArg(x) 1813 v.AddArg(y) 1814 v.AddArg(z) 1815 return true 1816 } 1817 // match: (ADDS x (SRA y z)) 1818 // cond: 1819 // result: (ADDSshiftRAreg x y z) 1820 for { 1821 x := v.Args[0] 1822 v_1 := v.Args[1] 1823 if v_1.Op != OpARMSRA { 1824 break 1825 } 1826 y := v_1.Args[0] 1827 z := v_1.Args[1] 1828 v.reset(OpARMADDSshiftRAreg) 1829 v.AddArg(x) 1830 v.AddArg(y) 1831 v.AddArg(z) 1832 return true 1833 } 1834 // match: (ADDS (SRA y z) x) 1835 // cond: 1836 // result: (ADDSshiftRAreg x y z) 1837 for { 1838 v_0 := v.Args[0] 1839 if v_0.Op != OpARMSRA { 1840 break 1841 } 1842 y := v_0.Args[0] 1843 z := v_0.Args[1] 1844 x := v.Args[1] 1845 v.reset(OpARMADDSshiftRAreg) 1846 v.AddArg(x) 1847 v.AddArg(y) 1848 v.AddArg(z) 1849 return true 1850 } 1851 return false 1852 } 1853 func rewriteValueARM_OpARMADDSshiftLL(v *Value, config *Config) bool { 1854 b := v.Block 1855 _ = b 1856 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 1857 // cond: 1858 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 1859 for { 1860 d := v.AuxInt 1861 v_0 := v.Args[0] 1862 if v_0.Op != OpARMMOVWconst { 1863 break 1864 } 1865 c := v_0.AuxInt 1866 x := v.Args[1] 1867 v.reset(OpARMADDSconst) 1868 v.AuxInt = c 1869 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1870 v0.AuxInt = d 1871 v0.AddArg(x) 1872 v.AddArg(v0) 1873 return true 1874 } 1875 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 1876 // cond: 1877 // result: (ADDSconst x [int64(uint32(c)<<uint64(d))]) 1878 for { 1879 d := v.AuxInt 1880 x := v.Args[0] 1881 v_1 := v.Args[1] 1882 if v_1.Op != OpARMMOVWconst { 1883 break 1884 } 1885 c := v_1.AuxInt 1886 v.reset(OpARMADDSconst) 1887 v.AuxInt = int64(uint32(c) << uint64(d)) 1888 v.AddArg(x) 1889 return true 1890 } 1891 return false 1892 } 1893 func rewriteValueARM_OpARMADDSshiftLLreg(v *Value, config *Config) bool { 1894 b := v.Block 1895 _ = b 1896 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 1897 // cond: 1898 // result: (ADDSconst [c] (SLL <x.Type> x y)) 1899 for { 1900 v_0 := v.Args[0] 1901 if v_0.Op != OpARMMOVWconst { 1902 break 1903 } 1904 c := v_0.AuxInt 1905 x := v.Args[1] 1906 y := v.Args[2] 1907 v.reset(OpARMADDSconst) 1908 v.AuxInt = c 1909 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1910 v0.AddArg(x) 1911 v0.AddArg(y) 1912 v.AddArg(v0) 1913 return true 1914 } 1915 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 1916 // cond: 1917 // result: (ADDSshiftLL x y [c]) 1918 for { 1919 x := v.Args[0] 1920 y := v.Args[1] 1921 v_2 := v.Args[2] 1922 if v_2.Op != OpARMMOVWconst { 1923 break 1924 } 1925 c := v_2.AuxInt 1926 v.reset(OpARMADDSshiftLL) 1927 v.AuxInt = c 1928 v.AddArg(x) 1929 v.AddArg(y) 1930 return true 1931 } 1932 return false 1933 } 1934 func rewriteValueARM_OpARMADDSshiftRA(v *Value, config *Config) bool { 1935 b := v.Block 1936 _ = b 1937 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 1938 // cond: 1939 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 1940 for { 1941 d := v.AuxInt 1942 v_0 := v.Args[0] 1943 if v_0.Op != OpARMMOVWconst { 1944 break 1945 } 1946 c := v_0.AuxInt 1947 x := v.Args[1] 1948 v.reset(OpARMADDSconst) 1949 v.AuxInt = c 1950 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1951 v0.AuxInt = d 1952 v0.AddArg(x) 1953 v.AddArg(v0) 1954 return true 1955 } 1956 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 1957 // cond: 1958 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 1959 for { 1960 d := v.AuxInt 1961 x := v.Args[0] 1962 v_1 := v.Args[1] 1963 if v_1.Op != OpARMMOVWconst { 1964 break 1965 } 1966 c := v_1.AuxInt 1967 v.reset(OpARMADDSconst) 1968 v.AuxInt = int64(int32(c) >> uint64(d)) 1969 v.AddArg(x) 1970 return true 1971 } 1972 return false 1973 } 1974 func rewriteValueARM_OpARMADDSshiftRAreg(v *Value, config *Config) bool { 1975 b := v.Block 1976 _ = b 1977 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 1978 // cond: 1979 // result: (ADDSconst [c] (SRA <x.Type> x y)) 1980 for { 1981 v_0 := v.Args[0] 1982 if v_0.Op != OpARMMOVWconst { 1983 break 1984 } 1985 c := v_0.AuxInt 1986 x := v.Args[1] 1987 y := v.Args[2] 1988 v.reset(OpARMADDSconst) 1989 v.AuxInt = c 1990 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1991 v0.AddArg(x) 1992 v0.AddArg(y) 1993 v.AddArg(v0) 1994 return true 1995 } 1996 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 1997 // cond: 1998 // result: (ADDSshiftRA x y [c]) 1999 for { 2000 x := v.Args[0] 2001 y := v.Args[1] 2002 v_2 := v.Args[2] 2003 if v_2.Op != OpARMMOVWconst { 2004 break 2005 } 2006 c := v_2.AuxInt 2007 v.reset(OpARMADDSshiftRA) 2008 v.AuxInt = c 2009 v.AddArg(x) 2010 v.AddArg(y) 2011 return true 2012 } 2013 return false 2014 } 2015 func rewriteValueARM_OpARMADDSshiftRL(v *Value, config *Config) bool { 2016 b := v.Block 2017 _ = b 2018 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2019 // cond: 2020 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2021 for { 2022 d := v.AuxInt 2023 v_0 := v.Args[0] 2024 if v_0.Op != OpARMMOVWconst { 2025 break 2026 } 2027 c := v_0.AuxInt 2028 x := v.Args[1] 2029 v.reset(OpARMADDSconst) 2030 v.AuxInt = c 2031 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2032 v0.AuxInt = d 2033 v0.AddArg(x) 2034 v.AddArg(v0) 2035 return true 2036 } 2037 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2038 // cond: 2039 // result: (ADDSconst x [int64(uint32(c)>>uint64(d))]) 2040 for { 2041 d := v.AuxInt 2042 x := v.Args[0] 2043 v_1 := v.Args[1] 2044 if v_1.Op != OpARMMOVWconst { 2045 break 2046 } 2047 c := v_1.AuxInt 2048 v.reset(OpARMADDSconst) 2049 v.AuxInt = int64(uint32(c) >> uint64(d)) 2050 v.AddArg(x) 2051 return true 2052 } 2053 return false 2054 } 2055 func rewriteValueARM_OpARMADDSshiftRLreg(v *Value, config *Config) bool { 2056 b := v.Block 2057 _ = b 2058 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2059 // cond: 2060 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2061 for { 2062 v_0 := v.Args[0] 2063 if v_0.Op != OpARMMOVWconst { 2064 break 2065 } 2066 c := v_0.AuxInt 2067 x := v.Args[1] 2068 y := v.Args[2] 2069 v.reset(OpARMADDSconst) 2070 v.AuxInt = c 2071 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2072 v0.AddArg(x) 2073 v0.AddArg(y) 2074 v.AddArg(v0) 2075 return true 2076 } 2077 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2078 // cond: 2079 // result: (ADDSshiftRL x y [c]) 2080 for { 2081 x := v.Args[0] 2082 y := v.Args[1] 2083 v_2 := v.Args[2] 2084 if v_2.Op != OpARMMOVWconst { 2085 break 2086 } 2087 c := v_2.AuxInt 2088 v.reset(OpARMADDSshiftRL) 2089 v.AuxInt = c 2090 v.AddArg(x) 2091 v.AddArg(y) 2092 return true 2093 } 2094 return false 2095 } 2096 func rewriteValueARM_OpARMADDconst(v *Value, config *Config) bool { 2097 b := v.Block 2098 _ = b 2099 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2100 // cond: 2101 // result: (MOVWaddr [off1+off2] {sym} ptr) 2102 for { 2103 off1 := v.AuxInt 2104 v_0 := v.Args[0] 2105 if v_0.Op != OpARMMOVWaddr { 2106 break 2107 } 2108 off2 := v_0.AuxInt 2109 sym := v_0.Aux 2110 ptr := v_0.Args[0] 2111 v.reset(OpARMMOVWaddr) 2112 v.AuxInt = off1 + off2 2113 v.Aux = sym 2114 v.AddArg(ptr) 2115 return true 2116 } 2117 // match: (ADDconst [0] x) 2118 // cond: 2119 // result: x 2120 for { 2121 if v.AuxInt != 0 { 2122 break 2123 } 2124 x := v.Args[0] 2125 v.reset(OpCopy) 2126 v.Type = x.Type 2127 v.AddArg(x) 2128 return true 2129 } 2130 // match: (ADDconst [c] (MOVWconst [d])) 2131 // cond: 2132 // result: (MOVWconst [int64(int32(c+d))]) 2133 for { 2134 c := v.AuxInt 2135 v_0 := v.Args[0] 2136 if v_0.Op != OpARMMOVWconst { 2137 break 2138 } 2139 d := v_0.AuxInt 2140 v.reset(OpARMMOVWconst) 2141 v.AuxInt = int64(int32(c + d)) 2142 return true 2143 } 2144 // match: (ADDconst [c] (ADDconst [d] x)) 2145 // cond: 2146 // result: (ADDconst [int64(int32(c+d))] x) 2147 for { 2148 c := v.AuxInt 2149 v_0 := v.Args[0] 2150 if v_0.Op != OpARMADDconst { 2151 break 2152 } 2153 d := v_0.AuxInt 2154 x := v_0.Args[0] 2155 v.reset(OpARMADDconst) 2156 v.AuxInt = int64(int32(c + d)) 2157 v.AddArg(x) 2158 return true 2159 } 2160 // match: (ADDconst [c] (SUBconst [d] x)) 2161 // cond: 2162 // result: (ADDconst [int64(int32(c-d))] x) 2163 for { 2164 c := v.AuxInt 2165 v_0 := v.Args[0] 2166 if v_0.Op != OpARMSUBconst { 2167 break 2168 } 2169 d := v_0.AuxInt 2170 x := v_0.Args[0] 2171 v.reset(OpARMADDconst) 2172 v.AuxInt = int64(int32(c - d)) 2173 v.AddArg(x) 2174 return true 2175 } 2176 // match: (ADDconst [c] (RSBconst [d] x)) 2177 // cond: 2178 // result: (RSBconst [int64(int32(c+d))] x) 2179 for { 2180 c := v.AuxInt 2181 v_0 := v.Args[0] 2182 if v_0.Op != OpARMRSBconst { 2183 break 2184 } 2185 d := v_0.AuxInt 2186 x := v_0.Args[0] 2187 v.reset(OpARMRSBconst) 2188 v.AuxInt = int64(int32(c + d)) 2189 v.AddArg(x) 2190 return true 2191 } 2192 return false 2193 } 2194 func rewriteValueARM_OpARMADDshiftLL(v *Value, config *Config) bool { 2195 b := v.Block 2196 _ = b 2197 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2198 // cond: 2199 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2200 for { 2201 d := v.AuxInt 2202 v_0 := v.Args[0] 2203 if v_0.Op != OpARMMOVWconst { 2204 break 2205 } 2206 c := v_0.AuxInt 2207 x := v.Args[1] 2208 v.reset(OpARMADDconst) 2209 v.AuxInt = c 2210 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2211 v0.AuxInt = d 2212 v0.AddArg(x) 2213 v.AddArg(v0) 2214 return true 2215 } 2216 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2217 // cond: 2218 // result: (ADDconst x [int64(uint32(c)<<uint64(d))]) 2219 for { 2220 d := v.AuxInt 2221 x := v.Args[0] 2222 v_1 := v.Args[1] 2223 if v_1.Op != OpARMMOVWconst { 2224 break 2225 } 2226 c := v_1.AuxInt 2227 v.reset(OpARMADDconst) 2228 v.AuxInt = int64(uint32(c) << uint64(d)) 2229 v.AddArg(x) 2230 return true 2231 } 2232 // match: (ADDshiftLL [c] (SRLconst x [32-c]) x) 2233 // cond: 2234 // result: (SRRconst [32-c] x) 2235 for { 2236 c := v.AuxInt 2237 v_0 := v.Args[0] 2238 if v_0.Op != OpARMSRLconst { 2239 break 2240 } 2241 if v_0.AuxInt != 32-c { 2242 break 2243 } 2244 x := v_0.Args[0] 2245 if x != v.Args[1] { 2246 break 2247 } 2248 v.reset(OpARMSRRconst) 2249 v.AuxInt = 32 - c 2250 v.AddArg(x) 2251 return true 2252 } 2253 return false 2254 } 2255 func rewriteValueARM_OpARMADDshiftLLreg(v *Value, config *Config) bool { 2256 b := v.Block 2257 _ = b 2258 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2259 // cond: 2260 // result: (ADDconst [c] (SLL <x.Type> x y)) 2261 for { 2262 v_0 := v.Args[0] 2263 if v_0.Op != OpARMMOVWconst { 2264 break 2265 } 2266 c := v_0.AuxInt 2267 x := v.Args[1] 2268 y := v.Args[2] 2269 v.reset(OpARMADDconst) 2270 v.AuxInt = c 2271 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2272 v0.AddArg(x) 2273 v0.AddArg(y) 2274 v.AddArg(v0) 2275 return true 2276 } 2277 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2278 // cond: 2279 // result: (ADDshiftLL x y [c]) 2280 for { 2281 x := v.Args[0] 2282 y := v.Args[1] 2283 v_2 := v.Args[2] 2284 if v_2.Op != OpARMMOVWconst { 2285 break 2286 } 2287 c := v_2.AuxInt 2288 v.reset(OpARMADDshiftLL) 2289 v.AuxInt = c 2290 v.AddArg(x) 2291 v.AddArg(y) 2292 return true 2293 } 2294 return false 2295 } 2296 func rewriteValueARM_OpARMADDshiftRA(v *Value, config *Config) bool { 2297 b := v.Block 2298 _ = b 2299 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 2300 // cond: 2301 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 2302 for { 2303 d := v.AuxInt 2304 v_0 := v.Args[0] 2305 if v_0.Op != OpARMMOVWconst { 2306 break 2307 } 2308 c := v_0.AuxInt 2309 x := v.Args[1] 2310 v.reset(OpARMADDconst) 2311 v.AuxInt = c 2312 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2313 v0.AuxInt = d 2314 v0.AddArg(x) 2315 v.AddArg(v0) 2316 return true 2317 } 2318 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 2319 // cond: 2320 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 2321 for { 2322 d := v.AuxInt 2323 x := v.Args[0] 2324 v_1 := v.Args[1] 2325 if v_1.Op != OpARMMOVWconst { 2326 break 2327 } 2328 c := v_1.AuxInt 2329 v.reset(OpARMADDconst) 2330 v.AuxInt = int64(int32(c) >> uint64(d)) 2331 v.AddArg(x) 2332 return true 2333 } 2334 return false 2335 } 2336 func rewriteValueARM_OpARMADDshiftRAreg(v *Value, config *Config) bool { 2337 b := v.Block 2338 _ = b 2339 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 2340 // cond: 2341 // result: (ADDconst [c] (SRA <x.Type> x y)) 2342 for { 2343 v_0 := v.Args[0] 2344 if v_0.Op != OpARMMOVWconst { 2345 break 2346 } 2347 c := v_0.AuxInt 2348 x := v.Args[1] 2349 y := v.Args[2] 2350 v.reset(OpARMADDconst) 2351 v.AuxInt = c 2352 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2353 v0.AddArg(x) 2354 v0.AddArg(y) 2355 v.AddArg(v0) 2356 return true 2357 } 2358 // match: (ADDshiftRAreg x y (MOVWconst [c])) 2359 // cond: 2360 // result: (ADDshiftRA x y [c]) 2361 for { 2362 x := v.Args[0] 2363 y := v.Args[1] 2364 v_2 := v.Args[2] 2365 if v_2.Op != OpARMMOVWconst { 2366 break 2367 } 2368 c := v_2.AuxInt 2369 v.reset(OpARMADDshiftRA) 2370 v.AuxInt = c 2371 v.AddArg(x) 2372 v.AddArg(y) 2373 return true 2374 } 2375 return false 2376 } 2377 func rewriteValueARM_OpARMADDshiftRL(v *Value, config *Config) bool { 2378 b := v.Block 2379 _ = b 2380 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 2381 // cond: 2382 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 2383 for { 2384 d := v.AuxInt 2385 v_0 := v.Args[0] 2386 if v_0.Op != OpARMMOVWconst { 2387 break 2388 } 2389 c := v_0.AuxInt 2390 x := v.Args[1] 2391 v.reset(OpARMADDconst) 2392 v.AuxInt = c 2393 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2394 v0.AuxInt = d 2395 v0.AddArg(x) 2396 v.AddArg(v0) 2397 return true 2398 } 2399 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 2400 // cond: 2401 // result: (ADDconst x [int64(uint32(c)>>uint64(d))]) 2402 for { 2403 d := v.AuxInt 2404 x := v.Args[0] 2405 v_1 := v.Args[1] 2406 if v_1.Op != OpARMMOVWconst { 2407 break 2408 } 2409 c := v_1.AuxInt 2410 v.reset(OpARMADDconst) 2411 v.AuxInt = int64(uint32(c) >> uint64(d)) 2412 v.AddArg(x) 2413 return true 2414 } 2415 // match: (ADDshiftRL [c] (SLLconst x [32-c]) x) 2416 // cond: 2417 // result: (SRRconst [ c] x) 2418 for { 2419 c := v.AuxInt 2420 v_0 := v.Args[0] 2421 if v_0.Op != OpARMSLLconst { 2422 break 2423 } 2424 if v_0.AuxInt != 32-c { 2425 break 2426 } 2427 x := v_0.Args[0] 2428 if x != v.Args[1] { 2429 break 2430 } 2431 v.reset(OpARMSRRconst) 2432 v.AuxInt = c 2433 v.AddArg(x) 2434 return true 2435 } 2436 return false 2437 } 2438 func rewriteValueARM_OpARMADDshiftRLreg(v *Value, config *Config) bool { 2439 b := v.Block 2440 _ = b 2441 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 2442 // cond: 2443 // result: (ADDconst [c] (SRL <x.Type> x y)) 2444 for { 2445 v_0 := v.Args[0] 2446 if v_0.Op != OpARMMOVWconst { 2447 break 2448 } 2449 c := v_0.AuxInt 2450 x := v.Args[1] 2451 y := v.Args[2] 2452 v.reset(OpARMADDconst) 2453 v.AuxInt = c 2454 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2455 v0.AddArg(x) 2456 v0.AddArg(y) 2457 v.AddArg(v0) 2458 return true 2459 } 2460 // match: (ADDshiftRLreg x y (MOVWconst [c])) 2461 // cond: 2462 // result: (ADDshiftRL x y [c]) 2463 for { 2464 x := v.Args[0] 2465 y := v.Args[1] 2466 v_2 := v.Args[2] 2467 if v_2.Op != OpARMMOVWconst { 2468 break 2469 } 2470 c := v_2.AuxInt 2471 v.reset(OpARMADDshiftRL) 2472 v.AuxInt = c 2473 v.AddArg(x) 2474 v.AddArg(y) 2475 return true 2476 } 2477 return false 2478 } 2479 func rewriteValueARM_OpARMAND(v *Value, config *Config) bool { 2480 b := v.Block 2481 _ = b 2482 // match: (AND (MOVWconst [c]) x) 2483 // cond: 2484 // result: (ANDconst [c] x) 2485 for { 2486 v_0 := v.Args[0] 2487 if v_0.Op != OpARMMOVWconst { 2488 break 2489 } 2490 c := v_0.AuxInt 2491 x := v.Args[1] 2492 v.reset(OpARMANDconst) 2493 v.AuxInt = c 2494 v.AddArg(x) 2495 return true 2496 } 2497 // match: (AND x (MOVWconst [c])) 2498 // cond: 2499 // result: (ANDconst [c] x) 2500 for { 2501 x := v.Args[0] 2502 v_1 := v.Args[1] 2503 if v_1.Op != OpARMMOVWconst { 2504 break 2505 } 2506 c := v_1.AuxInt 2507 v.reset(OpARMANDconst) 2508 v.AuxInt = c 2509 v.AddArg(x) 2510 return true 2511 } 2512 // match: (AND x (SLLconst [c] y)) 2513 // cond: 2514 // result: (ANDshiftLL x y [c]) 2515 for { 2516 x := v.Args[0] 2517 v_1 := v.Args[1] 2518 if v_1.Op != OpARMSLLconst { 2519 break 2520 } 2521 c := v_1.AuxInt 2522 y := v_1.Args[0] 2523 v.reset(OpARMANDshiftLL) 2524 v.AuxInt = c 2525 v.AddArg(x) 2526 v.AddArg(y) 2527 return true 2528 } 2529 // match: (AND (SLLconst [c] y) x) 2530 // cond: 2531 // result: (ANDshiftLL x y [c]) 2532 for { 2533 v_0 := v.Args[0] 2534 if v_0.Op != OpARMSLLconst { 2535 break 2536 } 2537 c := v_0.AuxInt 2538 y := v_0.Args[0] 2539 x := v.Args[1] 2540 v.reset(OpARMANDshiftLL) 2541 v.AuxInt = c 2542 v.AddArg(x) 2543 v.AddArg(y) 2544 return true 2545 } 2546 // match: (AND x (SRLconst [c] y)) 2547 // cond: 2548 // result: (ANDshiftRL x y [c]) 2549 for { 2550 x := v.Args[0] 2551 v_1 := v.Args[1] 2552 if v_1.Op != OpARMSRLconst { 2553 break 2554 } 2555 c := v_1.AuxInt 2556 y := v_1.Args[0] 2557 v.reset(OpARMANDshiftRL) 2558 v.AuxInt = c 2559 v.AddArg(x) 2560 v.AddArg(y) 2561 return true 2562 } 2563 // match: (AND (SRLconst [c] y) x) 2564 // cond: 2565 // result: (ANDshiftRL x y [c]) 2566 for { 2567 v_0 := v.Args[0] 2568 if v_0.Op != OpARMSRLconst { 2569 break 2570 } 2571 c := v_0.AuxInt 2572 y := v_0.Args[0] 2573 x := v.Args[1] 2574 v.reset(OpARMANDshiftRL) 2575 v.AuxInt = c 2576 v.AddArg(x) 2577 v.AddArg(y) 2578 return true 2579 } 2580 // match: (AND x (SRAconst [c] y)) 2581 // cond: 2582 // result: (ANDshiftRA x y [c]) 2583 for { 2584 x := v.Args[0] 2585 v_1 := v.Args[1] 2586 if v_1.Op != OpARMSRAconst { 2587 break 2588 } 2589 c := v_1.AuxInt 2590 y := v_1.Args[0] 2591 v.reset(OpARMANDshiftRA) 2592 v.AuxInt = c 2593 v.AddArg(x) 2594 v.AddArg(y) 2595 return true 2596 } 2597 // match: (AND (SRAconst [c] y) x) 2598 // cond: 2599 // result: (ANDshiftRA x y [c]) 2600 for { 2601 v_0 := v.Args[0] 2602 if v_0.Op != OpARMSRAconst { 2603 break 2604 } 2605 c := v_0.AuxInt 2606 y := v_0.Args[0] 2607 x := v.Args[1] 2608 v.reset(OpARMANDshiftRA) 2609 v.AuxInt = c 2610 v.AddArg(x) 2611 v.AddArg(y) 2612 return true 2613 } 2614 // match: (AND x (SLL y z)) 2615 // cond: 2616 // result: (ANDshiftLLreg x y z) 2617 for { 2618 x := v.Args[0] 2619 v_1 := v.Args[1] 2620 if v_1.Op != OpARMSLL { 2621 break 2622 } 2623 y := v_1.Args[0] 2624 z := v_1.Args[1] 2625 v.reset(OpARMANDshiftLLreg) 2626 v.AddArg(x) 2627 v.AddArg(y) 2628 v.AddArg(z) 2629 return true 2630 } 2631 // match: (AND (SLL y z) x) 2632 // cond: 2633 // result: (ANDshiftLLreg x y z) 2634 for { 2635 v_0 := v.Args[0] 2636 if v_0.Op != OpARMSLL { 2637 break 2638 } 2639 y := v_0.Args[0] 2640 z := v_0.Args[1] 2641 x := v.Args[1] 2642 v.reset(OpARMANDshiftLLreg) 2643 v.AddArg(x) 2644 v.AddArg(y) 2645 v.AddArg(z) 2646 return true 2647 } 2648 // match: (AND x (SRL y z)) 2649 // cond: 2650 // result: (ANDshiftRLreg x y z) 2651 for { 2652 x := v.Args[0] 2653 v_1 := v.Args[1] 2654 if v_1.Op != OpARMSRL { 2655 break 2656 } 2657 y := v_1.Args[0] 2658 z := v_1.Args[1] 2659 v.reset(OpARMANDshiftRLreg) 2660 v.AddArg(x) 2661 v.AddArg(y) 2662 v.AddArg(z) 2663 return true 2664 } 2665 // match: (AND (SRL y z) x) 2666 // cond: 2667 // result: (ANDshiftRLreg x y z) 2668 for { 2669 v_0 := v.Args[0] 2670 if v_0.Op != OpARMSRL { 2671 break 2672 } 2673 y := v_0.Args[0] 2674 z := v_0.Args[1] 2675 x := v.Args[1] 2676 v.reset(OpARMANDshiftRLreg) 2677 v.AddArg(x) 2678 v.AddArg(y) 2679 v.AddArg(z) 2680 return true 2681 } 2682 // match: (AND x (SRA y z)) 2683 // cond: 2684 // result: (ANDshiftRAreg x y z) 2685 for { 2686 x := v.Args[0] 2687 v_1 := v.Args[1] 2688 if v_1.Op != OpARMSRA { 2689 break 2690 } 2691 y := v_1.Args[0] 2692 z := v_1.Args[1] 2693 v.reset(OpARMANDshiftRAreg) 2694 v.AddArg(x) 2695 v.AddArg(y) 2696 v.AddArg(z) 2697 return true 2698 } 2699 // match: (AND (SRA y z) x) 2700 // cond: 2701 // result: (ANDshiftRAreg x y z) 2702 for { 2703 v_0 := v.Args[0] 2704 if v_0.Op != OpARMSRA { 2705 break 2706 } 2707 y := v_0.Args[0] 2708 z := v_0.Args[1] 2709 x := v.Args[1] 2710 v.reset(OpARMANDshiftRAreg) 2711 v.AddArg(x) 2712 v.AddArg(y) 2713 v.AddArg(z) 2714 return true 2715 } 2716 // match: (AND x x) 2717 // cond: 2718 // result: x 2719 for { 2720 x := v.Args[0] 2721 if x != v.Args[1] { 2722 break 2723 } 2724 v.reset(OpCopy) 2725 v.Type = x.Type 2726 v.AddArg(x) 2727 return true 2728 } 2729 // match: (AND x (MVN y)) 2730 // cond: 2731 // result: (BIC x y) 2732 for { 2733 x := v.Args[0] 2734 v_1 := v.Args[1] 2735 if v_1.Op != OpARMMVN { 2736 break 2737 } 2738 y := v_1.Args[0] 2739 v.reset(OpARMBIC) 2740 v.AddArg(x) 2741 v.AddArg(y) 2742 return true 2743 } 2744 // match: (AND (MVN y) x) 2745 // cond: 2746 // result: (BIC x y) 2747 for { 2748 v_0 := v.Args[0] 2749 if v_0.Op != OpARMMVN { 2750 break 2751 } 2752 y := v_0.Args[0] 2753 x := v.Args[1] 2754 v.reset(OpARMBIC) 2755 v.AddArg(x) 2756 v.AddArg(y) 2757 return true 2758 } 2759 // match: (AND x (MVNshiftLL y [c])) 2760 // cond: 2761 // result: (BICshiftLL x y [c]) 2762 for { 2763 x := v.Args[0] 2764 v_1 := v.Args[1] 2765 if v_1.Op != OpARMMVNshiftLL { 2766 break 2767 } 2768 c := v_1.AuxInt 2769 y := v_1.Args[0] 2770 v.reset(OpARMBICshiftLL) 2771 v.AuxInt = c 2772 v.AddArg(x) 2773 v.AddArg(y) 2774 return true 2775 } 2776 // match: (AND (MVNshiftLL y [c]) x) 2777 // cond: 2778 // result: (BICshiftLL x y [c]) 2779 for { 2780 v_0 := v.Args[0] 2781 if v_0.Op != OpARMMVNshiftLL { 2782 break 2783 } 2784 c := v_0.AuxInt 2785 y := v_0.Args[0] 2786 x := v.Args[1] 2787 v.reset(OpARMBICshiftLL) 2788 v.AuxInt = c 2789 v.AddArg(x) 2790 v.AddArg(y) 2791 return true 2792 } 2793 // match: (AND x (MVNshiftRL y [c])) 2794 // cond: 2795 // result: (BICshiftRL x y [c]) 2796 for { 2797 x := v.Args[0] 2798 v_1 := v.Args[1] 2799 if v_1.Op != OpARMMVNshiftRL { 2800 break 2801 } 2802 c := v_1.AuxInt 2803 y := v_1.Args[0] 2804 v.reset(OpARMBICshiftRL) 2805 v.AuxInt = c 2806 v.AddArg(x) 2807 v.AddArg(y) 2808 return true 2809 } 2810 // match: (AND (MVNshiftRL y [c]) x) 2811 // cond: 2812 // result: (BICshiftRL x y [c]) 2813 for { 2814 v_0 := v.Args[0] 2815 if v_0.Op != OpARMMVNshiftRL { 2816 break 2817 } 2818 c := v_0.AuxInt 2819 y := v_0.Args[0] 2820 x := v.Args[1] 2821 v.reset(OpARMBICshiftRL) 2822 v.AuxInt = c 2823 v.AddArg(x) 2824 v.AddArg(y) 2825 return true 2826 } 2827 // match: (AND x (MVNshiftRA y [c])) 2828 // cond: 2829 // result: (BICshiftRA x y [c]) 2830 for { 2831 x := v.Args[0] 2832 v_1 := v.Args[1] 2833 if v_1.Op != OpARMMVNshiftRA { 2834 break 2835 } 2836 c := v_1.AuxInt 2837 y := v_1.Args[0] 2838 v.reset(OpARMBICshiftRA) 2839 v.AuxInt = c 2840 v.AddArg(x) 2841 v.AddArg(y) 2842 return true 2843 } 2844 // match: (AND (MVNshiftRA y [c]) x) 2845 // cond: 2846 // result: (BICshiftRA x y [c]) 2847 for { 2848 v_0 := v.Args[0] 2849 if v_0.Op != OpARMMVNshiftRA { 2850 break 2851 } 2852 c := v_0.AuxInt 2853 y := v_0.Args[0] 2854 x := v.Args[1] 2855 v.reset(OpARMBICshiftRA) 2856 v.AuxInt = c 2857 v.AddArg(x) 2858 v.AddArg(y) 2859 return true 2860 } 2861 return false 2862 } 2863 func rewriteValueARM_OpARMANDconst(v *Value, config *Config) bool { 2864 b := v.Block 2865 _ = b 2866 // match: (ANDconst [0] _) 2867 // cond: 2868 // result: (MOVWconst [0]) 2869 for { 2870 if v.AuxInt != 0 { 2871 break 2872 } 2873 v.reset(OpARMMOVWconst) 2874 v.AuxInt = 0 2875 return true 2876 } 2877 // match: (ANDconst [c] x) 2878 // cond: int32(c)==-1 2879 // result: x 2880 for { 2881 c := v.AuxInt 2882 x := v.Args[0] 2883 if !(int32(c) == -1) { 2884 break 2885 } 2886 v.reset(OpCopy) 2887 v.Type = x.Type 2888 v.AddArg(x) 2889 return true 2890 } 2891 // match: (ANDconst [c] (MOVWconst [d])) 2892 // cond: 2893 // result: (MOVWconst [c&d]) 2894 for { 2895 c := v.AuxInt 2896 v_0 := v.Args[0] 2897 if v_0.Op != OpARMMOVWconst { 2898 break 2899 } 2900 d := v_0.AuxInt 2901 v.reset(OpARMMOVWconst) 2902 v.AuxInt = c & d 2903 return true 2904 } 2905 // match: (ANDconst [c] (ANDconst [d] x)) 2906 // cond: 2907 // result: (ANDconst [c&d] x) 2908 for { 2909 c := v.AuxInt 2910 v_0 := v.Args[0] 2911 if v_0.Op != OpARMANDconst { 2912 break 2913 } 2914 d := v_0.AuxInt 2915 x := v_0.Args[0] 2916 v.reset(OpARMANDconst) 2917 v.AuxInt = c & d 2918 v.AddArg(x) 2919 return true 2920 } 2921 return false 2922 } 2923 func rewriteValueARM_OpARMANDshiftLL(v *Value, config *Config) bool { 2924 b := v.Block 2925 _ = b 2926 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 2927 // cond: 2928 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 2929 for { 2930 d := v.AuxInt 2931 v_0 := v.Args[0] 2932 if v_0.Op != OpARMMOVWconst { 2933 break 2934 } 2935 c := v_0.AuxInt 2936 x := v.Args[1] 2937 v.reset(OpARMANDconst) 2938 v.AuxInt = c 2939 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2940 v0.AuxInt = d 2941 v0.AddArg(x) 2942 v.AddArg(v0) 2943 return true 2944 } 2945 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 2946 // cond: 2947 // result: (ANDconst x [int64(uint32(c)<<uint64(d))]) 2948 for { 2949 d := v.AuxInt 2950 x := v.Args[0] 2951 v_1 := v.Args[1] 2952 if v_1.Op != OpARMMOVWconst { 2953 break 2954 } 2955 c := v_1.AuxInt 2956 v.reset(OpARMANDconst) 2957 v.AuxInt = int64(uint32(c) << uint64(d)) 2958 v.AddArg(x) 2959 return true 2960 } 2961 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 2962 // cond: c==d 2963 // result: y 2964 for { 2965 d := v.AuxInt 2966 x := v.Args[0] 2967 y := v.Args[1] 2968 if y.Op != OpARMSLLconst { 2969 break 2970 } 2971 c := y.AuxInt 2972 if x != y.Args[0] { 2973 break 2974 } 2975 if !(c == d) { 2976 break 2977 } 2978 v.reset(OpCopy) 2979 v.Type = y.Type 2980 v.AddArg(y) 2981 return true 2982 } 2983 return false 2984 } 2985 func rewriteValueARM_OpARMANDshiftLLreg(v *Value, config *Config) bool { 2986 b := v.Block 2987 _ = b 2988 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 2989 // cond: 2990 // result: (ANDconst [c] (SLL <x.Type> x y)) 2991 for { 2992 v_0 := v.Args[0] 2993 if v_0.Op != OpARMMOVWconst { 2994 break 2995 } 2996 c := v_0.AuxInt 2997 x := v.Args[1] 2998 y := v.Args[2] 2999 v.reset(OpARMANDconst) 3000 v.AuxInt = c 3001 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3002 v0.AddArg(x) 3003 v0.AddArg(y) 3004 v.AddArg(v0) 3005 return true 3006 } 3007 // match: (ANDshiftLLreg x y (MOVWconst [c])) 3008 // cond: 3009 // result: (ANDshiftLL x y [c]) 3010 for { 3011 x := v.Args[0] 3012 y := v.Args[1] 3013 v_2 := v.Args[2] 3014 if v_2.Op != OpARMMOVWconst { 3015 break 3016 } 3017 c := v_2.AuxInt 3018 v.reset(OpARMANDshiftLL) 3019 v.AuxInt = c 3020 v.AddArg(x) 3021 v.AddArg(y) 3022 return true 3023 } 3024 return false 3025 } 3026 func rewriteValueARM_OpARMANDshiftRA(v *Value, config *Config) bool { 3027 b := v.Block 3028 _ = b 3029 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 3030 // cond: 3031 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 3032 for { 3033 d := v.AuxInt 3034 v_0 := v.Args[0] 3035 if v_0.Op != OpARMMOVWconst { 3036 break 3037 } 3038 c := v_0.AuxInt 3039 x := v.Args[1] 3040 v.reset(OpARMANDconst) 3041 v.AuxInt = c 3042 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3043 v0.AuxInt = d 3044 v0.AddArg(x) 3045 v.AddArg(v0) 3046 return true 3047 } 3048 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3049 // cond: 3050 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3051 for { 3052 d := v.AuxInt 3053 x := v.Args[0] 3054 v_1 := v.Args[1] 3055 if v_1.Op != OpARMMOVWconst { 3056 break 3057 } 3058 c := v_1.AuxInt 3059 v.reset(OpARMANDconst) 3060 v.AuxInt = int64(int32(c) >> uint64(d)) 3061 v.AddArg(x) 3062 return true 3063 } 3064 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3065 // cond: c==d 3066 // result: y 3067 for { 3068 d := v.AuxInt 3069 x := v.Args[0] 3070 y := v.Args[1] 3071 if y.Op != OpARMSRAconst { 3072 break 3073 } 3074 c := y.AuxInt 3075 if x != y.Args[0] { 3076 break 3077 } 3078 if !(c == d) { 3079 break 3080 } 3081 v.reset(OpCopy) 3082 v.Type = y.Type 3083 v.AddArg(y) 3084 return true 3085 } 3086 return false 3087 } 3088 func rewriteValueARM_OpARMANDshiftRAreg(v *Value, config *Config) bool { 3089 b := v.Block 3090 _ = b 3091 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3092 // cond: 3093 // result: (ANDconst [c] (SRA <x.Type> x y)) 3094 for { 3095 v_0 := v.Args[0] 3096 if v_0.Op != OpARMMOVWconst { 3097 break 3098 } 3099 c := v_0.AuxInt 3100 x := v.Args[1] 3101 y := v.Args[2] 3102 v.reset(OpARMANDconst) 3103 v.AuxInt = c 3104 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3105 v0.AddArg(x) 3106 v0.AddArg(y) 3107 v.AddArg(v0) 3108 return true 3109 } 3110 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3111 // cond: 3112 // result: (ANDshiftRA x y [c]) 3113 for { 3114 x := v.Args[0] 3115 y := v.Args[1] 3116 v_2 := v.Args[2] 3117 if v_2.Op != OpARMMOVWconst { 3118 break 3119 } 3120 c := v_2.AuxInt 3121 v.reset(OpARMANDshiftRA) 3122 v.AuxInt = c 3123 v.AddArg(x) 3124 v.AddArg(y) 3125 return true 3126 } 3127 return false 3128 } 3129 func rewriteValueARM_OpARMANDshiftRL(v *Value, config *Config) bool { 3130 b := v.Block 3131 _ = b 3132 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3133 // cond: 3134 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3135 for { 3136 d := v.AuxInt 3137 v_0 := v.Args[0] 3138 if v_0.Op != OpARMMOVWconst { 3139 break 3140 } 3141 c := v_0.AuxInt 3142 x := v.Args[1] 3143 v.reset(OpARMANDconst) 3144 v.AuxInt = c 3145 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3146 v0.AuxInt = d 3147 v0.AddArg(x) 3148 v.AddArg(v0) 3149 return true 3150 } 3151 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3152 // cond: 3153 // result: (ANDconst x [int64(uint32(c)>>uint64(d))]) 3154 for { 3155 d := v.AuxInt 3156 x := v.Args[0] 3157 v_1 := v.Args[1] 3158 if v_1.Op != OpARMMOVWconst { 3159 break 3160 } 3161 c := v_1.AuxInt 3162 v.reset(OpARMANDconst) 3163 v.AuxInt = int64(uint32(c) >> uint64(d)) 3164 v.AddArg(x) 3165 return true 3166 } 3167 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3168 // cond: c==d 3169 // result: y 3170 for { 3171 d := v.AuxInt 3172 x := v.Args[0] 3173 y := v.Args[1] 3174 if y.Op != OpARMSRLconst { 3175 break 3176 } 3177 c := y.AuxInt 3178 if x != y.Args[0] { 3179 break 3180 } 3181 if !(c == d) { 3182 break 3183 } 3184 v.reset(OpCopy) 3185 v.Type = y.Type 3186 v.AddArg(y) 3187 return true 3188 } 3189 return false 3190 } 3191 func rewriteValueARM_OpARMANDshiftRLreg(v *Value, config *Config) bool { 3192 b := v.Block 3193 _ = b 3194 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 3195 // cond: 3196 // result: (ANDconst [c] (SRL <x.Type> x y)) 3197 for { 3198 v_0 := v.Args[0] 3199 if v_0.Op != OpARMMOVWconst { 3200 break 3201 } 3202 c := v_0.AuxInt 3203 x := v.Args[1] 3204 y := v.Args[2] 3205 v.reset(OpARMANDconst) 3206 v.AuxInt = c 3207 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3208 v0.AddArg(x) 3209 v0.AddArg(y) 3210 v.AddArg(v0) 3211 return true 3212 } 3213 // match: (ANDshiftRLreg x y (MOVWconst [c])) 3214 // cond: 3215 // result: (ANDshiftRL x y [c]) 3216 for { 3217 x := v.Args[0] 3218 y := v.Args[1] 3219 v_2 := v.Args[2] 3220 if v_2.Op != OpARMMOVWconst { 3221 break 3222 } 3223 c := v_2.AuxInt 3224 v.reset(OpARMANDshiftRL) 3225 v.AuxInt = c 3226 v.AddArg(x) 3227 v.AddArg(y) 3228 return true 3229 } 3230 return false 3231 } 3232 func rewriteValueARM_OpARMBIC(v *Value, config *Config) bool { 3233 b := v.Block 3234 _ = b 3235 // match: (BIC x (MOVWconst [c])) 3236 // cond: 3237 // result: (BICconst [c] x) 3238 for { 3239 x := v.Args[0] 3240 v_1 := v.Args[1] 3241 if v_1.Op != OpARMMOVWconst { 3242 break 3243 } 3244 c := v_1.AuxInt 3245 v.reset(OpARMBICconst) 3246 v.AuxInt = c 3247 v.AddArg(x) 3248 return true 3249 } 3250 // match: (BIC x (SLLconst [c] y)) 3251 // cond: 3252 // result: (BICshiftLL x y [c]) 3253 for { 3254 x := v.Args[0] 3255 v_1 := v.Args[1] 3256 if v_1.Op != OpARMSLLconst { 3257 break 3258 } 3259 c := v_1.AuxInt 3260 y := v_1.Args[0] 3261 v.reset(OpARMBICshiftLL) 3262 v.AuxInt = c 3263 v.AddArg(x) 3264 v.AddArg(y) 3265 return true 3266 } 3267 // match: (BIC x (SRLconst [c] y)) 3268 // cond: 3269 // result: (BICshiftRL x y [c]) 3270 for { 3271 x := v.Args[0] 3272 v_1 := v.Args[1] 3273 if v_1.Op != OpARMSRLconst { 3274 break 3275 } 3276 c := v_1.AuxInt 3277 y := v_1.Args[0] 3278 v.reset(OpARMBICshiftRL) 3279 v.AuxInt = c 3280 v.AddArg(x) 3281 v.AddArg(y) 3282 return true 3283 } 3284 // match: (BIC x (SRAconst [c] y)) 3285 // cond: 3286 // result: (BICshiftRA x y [c]) 3287 for { 3288 x := v.Args[0] 3289 v_1 := v.Args[1] 3290 if v_1.Op != OpARMSRAconst { 3291 break 3292 } 3293 c := v_1.AuxInt 3294 y := v_1.Args[0] 3295 v.reset(OpARMBICshiftRA) 3296 v.AuxInt = c 3297 v.AddArg(x) 3298 v.AddArg(y) 3299 return true 3300 } 3301 // match: (BIC x (SLL y z)) 3302 // cond: 3303 // result: (BICshiftLLreg x y z) 3304 for { 3305 x := v.Args[0] 3306 v_1 := v.Args[1] 3307 if v_1.Op != OpARMSLL { 3308 break 3309 } 3310 y := v_1.Args[0] 3311 z := v_1.Args[1] 3312 v.reset(OpARMBICshiftLLreg) 3313 v.AddArg(x) 3314 v.AddArg(y) 3315 v.AddArg(z) 3316 return true 3317 } 3318 // match: (BIC x (SRL y z)) 3319 // cond: 3320 // result: (BICshiftRLreg x y z) 3321 for { 3322 x := v.Args[0] 3323 v_1 := v.Args[1] 3324 if v_1.Op != OpARMSRL { 3325 break 3326 } 3327 y := v_1.Args[0] 3328 z := v_1.Args[1] 3329 v.reset(OpARMBICshiftRLreg) 3330 v.AddArg(x) 3331 v.AddArg(y) 3332 v.AddArg(z) 3333 return true 3334 } 3335 // match: (BIC x (SRA y z)) 3336 // cond: 3337 // result: (BICshiftRAreg x y z) 3338 for { 3339 x := v.Args[0] 3340 v_1 := v.Args[1] 3341 if v_1.Op != OpARMSRA { 3342 break 3343 } 3344 y := v_1.Args[0] 3345 z := v_1.Args[1] 3346 v.reset(OpARMBICshiftRAreg) 3347 v.AddArg(x) 3348 v.AddArg(y) 3349 v.AddArg(z) 3350 return true 3351 } 3352 // match: (BIC x x) 3353 // cond: 3354 // result: (MOVWconst [0]) 3355 for { 3356 x := v.Args[0] 3357 if x != v.Args[1] { 3358 break 3359 } 3360 v.reset(OpARMMOVWconst) 3361 v.AuxInt = 0 3362 return true 3363 } 3364 return false 3365 } 3366 func rewriteValueARM_OpARMBICconst(v *Value, config *Config) bool { 3367 b := v.Block 3368 _ = b 3369 // match: (BICconst [0] x) 3370 // cond: 3371 // result: x 3372 for { 3373 if v.AuxInt != 0 { 3374 break 3375 } 3376 x := v.Args[0] 3377 v.reset(OpCopy) 3378 v.Type = x.Type 3379 v.AddArg(x) 3380 return true 3381 } 3382 // match: (BICconst [c] _) 3383 // cond: int32(c)==-1 3384 // result: (MOVWconst [0]) 3385 for { 3386 c := v.AuxInt 3387 if !(int32(c) == -1) { 3388 break 3389 } 3390 v.reset(OpARMMOVWconst) 3391 v.AuxInt = 0 3392 return true 3393 } 3394 // match: (BICconst [c] (MOVWconst [d])) 3395 // cond: 3396 // result: (MOVWconst [d&^c]) 3397 for { 3398 c := v.AuxInt 3399 v_0 := v.Args[0] 3400 if v_0.Op != OpARMMOVWconst { 3401 break 3402 } 3403 d := v_0.AuxInt 3404 v.reset(OpARMMOVWconst) 3405 v.AuxInt = d &^ c 3406 return true 3407 } 3408 return false 3409 } 3410 func rewriteValueARM_OpARMBICshiftLL(v *Value, config *Config) bool { 3411 b := v.Block 3412 _ = b 3413 // match: (BICshiftLL x (MOVWconst [c]) [d]) 3414 // cond: 3415 // result: (BICconst x [int64(uint32(c)<<uint64(d))]) 3416 for { 3417 d := v.AuxInt 3418 x := v.Args[0] 3419 v_1 := v.Args[1] 3420 if v_1.Op != OpARMMOVWconst { 3421 break 3422 } 3423 c := v_1.AuxInt 3424 v.reset(OpARMBICconst) 3425 v.AuxInt = int64(uint32(c) << uint64(d)) 3426 v.AddArg(x) 3427 return true 3428 } 3429 // match: (BICshiftLL x (SLLconst x [c]) [d]) 3430 // cond: c==d 3431 // result: (MOVWconst [0]) 3432 for { 3433 d := v.AuxInt 3434 x := v.Args[0] 3435 v_1 := v.Args[1] 3436 if v_1.Op != OpARMSLLconst { 3437 break 3438 } 3439 c := v_1.AuxInt 3440 if x != v_1.Args[0] { 3441 break 3442 } 3443 if !(c == d) { 3444 break 3445 } 3446 v.reset(OpARMMOVWconst) 3447 v.AuxInt = 0 3448 return true 3449 } 3450 return false 3451 } 3452 func rewriteValueARM_OpARMBICshiftLLreg(v *Value, config *Config) bool { 3453 b := v.Block 3454 _ = b 3455 // match: (BICshiftLLreg x y (MOVWconst [c])) 3456 // cond: 3457 // result: (BICshiftLL x y [c]) 3458 for { 3459 x := v.Args[0] 3460 y := v.Args[1] 3461 v_2 := v.Args[2] 3462 if v_2.Op != OpARMMOVWconst { 3463 break 3464 } 3465 c := v_2.AuxInt 3466 v.reset(OpARMBICshiftLL) 3467 v.AuxInt = c 3468 v.AddArg(x) 3469 v.AddArg(y) 3470 return true 3471 } 3472 return false 3473 } 3474 func rewriteValueARM_OpARMBICshiftRA(v *Value, config *Config) bool { 3475 b := v.Block 3476 _ = b 3477 // match: (BICshiftRA x (MOVWconst [c]) [d]) 3478 // cond: 3479 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 3480 for { 3481 d := v.AuxInt 3482 x := v.Args[0] 3483 v_1 := v.Args[1] 3484 if v_1.Op != OpARMMOVWconst { 3485 break 3486 } 3487 c := v_1.AuxInt 3488 v.reset(OpARMBICconst) 3489 v.AuxInt = int64(int32(c) >> uint64(d)) 3490 v.AddArg(x) 3491 return true 3492 } 3493 // match: (BICshiftRA x (SRAconst x [c]) [d]) 3494 // cond: c==d 3495 // result: (MOVWconst [0]) 3496 for { 3497 d := v.AuxInt 3498 x := v.Args[0] 3499 v_1 := v.Args[1] 3500 if v_1.Op != OpARMSRAconst { 3501 break 3502 } 3503 c := v_1.AuxInt 3504 if x != v_1.Args[0] { 3505 break 3506 } 3507 if !(c == d) { 3508 break 3509 } 3510 v.reset(OpARMMOVWconst) 3511 v.AuxInt = 0 3512 return true 3513 } 3514 return false 3515 } 3516 func rewriteValueARM_OpARMBICshiftRAreg(v *Value, config *Config) bool { 3517 b := v.Block 3518 _ = b 3519 // match: (BICshiftRAreg x y (MOVWconst [c])) 3520 // cond: 3521 // result: (BICshiftRA x y [c]) 3522 for { 3523 x := v.Args[0] 3524 y := v.Args[1] 3525 v_2 := v.Args[2] 3526 if v_2.Op != OpARMMOVWconst { 3527 break 3528 } 3529 c := v_2.AuxInt 3530 v.reset(OpARMBICshiftRA) 3531 v.AuxInt = c 3532 v.AddArg(x) 3533 v.AddArg(y) 3534 return true 3535 } 3536 return false 3537 } 3538 func rewriteValueARM_OpARMBICshiftRL(v *Value, config *Config) bool { 3539 b := v.Block 3540 _ = b 3541 // match: (BICshiftRL x (MOVWconst [c]) [d]) 3542 // cond: 3543 // result: (BICconst x [int64(uint32(c)>>uint64(d))]) 3544 for { 3545 d := v.AuxInt 3546 x := v.Args[0] 3547 v_1 := v.Args[1] 3548 if v_1.Op != OpARMMOVWconst { 3549 break 3550 } 3551 c := v_1.AuxInt 3552 v.reset(OpARMBICconst) 3553 v.AuxInt = int64(uint32(c) >> uint64(d)) 3554 v.AddArg(x) 3555 return true 3556 } 3557 // match: (BICshiftRL x (SRLconst x [c]) [d]) 3558 // cond: c==d 3559 // result: (MOVWconst [0]) 3560 for { 3561 d := v.AuxInt 3562 x := v.Args[0] 3563 v_1 := v.Args[1] 3564 if v_1.Op != OpARMSRLconst { 3565 break 3566 } 3567 c := v_1.AuxInt 3568 if x != v_1.Args[0] { 3569 break 3570 } 3571 if !(c == d) { 3572 break 3573 } 3574 v.reset(OpARMMOVWconst) 3575 v.AuxInt = 0 3576 return true 3577 } 3578 return false 3579 } 3580 func rewriteValueARM_OpARMBICshiftRLreg(v *Value, config *Config) bool { 3581 b := v.Block 3582 _ = b 3583 // match: (BICshiftRLreg x y (MOVWconst [c])) 3584 // cond: 3585 // result: (BICshiftRL x y [c]) 3586 for { 3587 x := v.Args[0] 3588 y := v.Args[1] 3589 v_2 := v.Args[2] 3590 if v_2.Op != OpARMMOVWconst { 3591 break 3592 } 3593 c := v_2.AuxInt 3594 v.reset(OpARMBICshiftRL) 3595 v.AuxInt = c 3596 v.AddArg(x) 3597 v.AddArg(y) 3598 return true 3599 } 3600 return false 3601 } 3602 func rewriteValueARM_OpARMCMOVWHSconst(v *Value, config *Config) bool { 3603 b := v.Block 3604 _ = b 3605 // match: (CMOVWHSconst _ (FlagEQ) [c]) 3606 // cond: 3607 // result: (MOVWconst [c]) 3608 for { 3609 c := v.AuxInt 3610 v_1 := v.Args[1] 3611 if v_1.Op != OpARMFlagEQ { 3612 break 3613 } 3614 v.reset(OpARMMOVWconst) 3615 v.AuxInt = c 3616 return true 3617 } 3618 // match: (CMOVWHSconst x (FlagLT_ULT)) 3619 // cond: 3620 // result: x 3621 for { 3622 x := v.Args[0] 3623 v_1 := v.Args[1] 3624 if v_1.Op != OpARMFlagLT_ULT { 3625 break 3626 } 3627 v.reset(OpCopy) 3628 v.Type = x.Type 3629 v.AddArg(x) 3630 return true 3631 } 3632 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 3633 // cond: 3634 // result: (MOVWconst [c]) 3635 for { 3636 c := v.AuxInt 3637 v_1 := v.Args[1] 3638 if v_1.Op != OpARMFlagLT_UGT { 3639 break 3640 } 3641 v.reset(OpARMMOVWconst) 3642 v.AuxInt = c 3643 return true 3644 } 3645 // match: (CMOVWHSconst x (FlagGT_ULT)) 3646 // cond: 3647 // result: x 3648 for { 3649 x := v.Args[0] 3650 v_1 := v.Args[1] 3651 if v_1.Op != OpARMFlagGT_ULT { 3652 break 3653 } 3654 v.reset(OpCopy) 3655 v.Type = x.Type 3656 v.AddArg(x) 3657 return true 3658 } 3659 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 3660 // cond: 3661 // result: (MOVWconst [c]) 3662 for { 3663 c := v.AuxInt 3664 v_1 := v.Args[1] 3665 if v_1.Op != OpARMFlagGT_UGT { 3666 break 3667 } 3668 v.reset(OpARMMOVWconst) 3669 v.AuxInt = c 3670 return true 3671 } 3672 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 3673 // cond: 3674 // result: (CMOVWLSconst x flags [c]) 3675 for { 3676 c := v.AuxInt 3677 x := v.Args[0] 3678 v_1 := v.Args[1] 3679 if v_1.Op != OpARMInvertFlags { 3680 break 3681 } 3682 flags := v_1.Args[0] 3683 v.reset(OpARMCMOVWLSconst) 3684 v.AuxInt = c 3685 v.AddArg(x) 3686 v.AddArg(flags) 3687 return true 3688 } 3689 return false 3690 } 3691 func rewriteValueARM_OpARMCMOVWLSconst(v *Value, config *Config) bool { 3692 b := v.Block 3693 _ = b 3694 // match: (CMOVWLSconst _ (FlagEQ) [c]) 3695 // cond: 3696 // result: (MOVWconst [c]) 3697 for { 3698 c := v.AuxInt 3699 v_1 := v.Args[1] 3700 if v_1.Op != OpARMFlagEQ { 3701 break 3702 } 3703 v.reset(OpARMMOVWconst) 3704 v.AuxInt = c 3705 return true 3706 } 3707 // match: (CMOVWLSconst _ (FlagLT_ULT) [c]) 3708 // cond: 3709 // result: (MOVWconst [c]) 3710 for { 3711 c := v.AuxInt 3712 v_1 := v.Args[1] 3713 if v_1.Op != OpARMFlagLT_ULT { 3714 break 3715 } 3716 v.reset(OpARMMOVWconst) 3717 v.AuxInt = c 3718 return true 3719 } 3720 // match: (CMOVWLSconst x (FlagLT_UGT)) 3721 // cond: 3722 // result: x 3723 for { 3724 x := v.Args[0] 3725 v_1 := v.Args[1] 3726 if v_1.Op != OpARMFlagLT_UGT { 3727 break 3728 } 3729 v.reset(OpCopy) 3730 v.Type = x.Type 3731 v.AddArg(x) 3732 return true 3733 } 3734 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 3735 // cond: 3736 // result: (MOVWconst [c]) 3737 for { 3738 c := v.AuxInt 3739 v_1 := v.Args[1] 3740 if v_1.Op != OpARMFlagGT_ULT { 3741 break 3742 } 3743 v.reset(OpARMMOVWconst) 3744 v.AuxInt = c 3745 return true 3746 } 3747 // match: (CMOVWLSconst x (FlagGT_UGT)) 3748 // cond: 3749 // result: x 3750 for { 3751 x := v.Args[0] 3752 v_1 := v.Args[1] 3753 if v_1.Op != OpARMFlagGT_UGT { 3754 break 3755 } 3756 v.reset(OpCopy) 3757 v.Type = x.Type 3758 v.AddArg(x) 3759 return true 3760 } 3761 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 3762 // cond: 3763 // result: (CMOVWHSconst x flags [c]) 3764 for { 3765 c := v.AuxInt 3766 x := v.Args[0] 3767 v_1 := v.Args[1] 3768 if v_1.Op != OpARMInvertFlags { 3769 break 3770 } 3771 flags := v_1.Args[0] 3772 v.reset(OpARMCMOVWHSconst) 3773 v.AuxInt = c 3774 v.AddArg(x) 3775 v.AddArg(flags) 3776 return true 3777 } 3778 return false 3779 } 3780 func rewriteValueARM_OpARMCMP(v *Value, config *Config) bool { 3781 b := v.Block 3782 _ = b 3783 // match: (CMP x (MOVWconst [c])) 3784 // cond: 3785 // result: (CMPconst [c] x) 3786 for { 3787 x := v.Args[0] 3788 v_1 := v.Args[1] 3789 if v_1.Op != OpARMMOVWconst { 3790 break 3791 } 3792 c := v_1.AuxInt 3793 v.reset(OpARMCMPconst) 3794 v.AuxInt = c 3795 v.AddArg(x) 3796 return true 3797 } 3798 // match: (CMP (MOVWconst [c]) x) 3799 // cond: 3800 // result: (InvertFlags (CMPconst [c] x)) 3801 for { 3802 v_0 := v.Args[0] 3803 if v_0.Op != OpARMMOVWconst { 3804 break 3805 } 3806 c := v_0.AuxInt 3807 x := v.Args[1] 3808 v.reset(OpARMInvertFlags) 3809 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 3810 v0.AuxInt = c 3811 v0.AddArg(x) 3812 v.AddArg(v0) 3813 return true 3814 } 3815 // match: (CMP x (SLLconst [c] y)) 3816 // cond: 3817 // result: (CMPshiftLL x y [c]) 3818 for { 3819 x := v.Args[0] 3820 v_1 := v.Args[1] 3821 if v_1.Op != OpARMSLLconst { 3822 break 3823 } 3824 c := v_1.AuxInt 3825 y := v_1.Args[0] 3826 v.reset(OpARMCMPshiftLL) 3827 v.AuxInt = c 3828 v.AddArg(x) 3829 v.AddArg(y) 3830 return true 3831 } 3832 // match: (CMP (SLLconst [c] y) x) 3833 // cond: 3834 // result: (InvertFlags (CMPshiftLL x y [c])) 3835 for { 3836 v_0 := v.Args[0] 3837 if v_0.Op != OpARMSLLconst { 3838 break 3839 } 3840 c := v_0.AuxInt 3841 y := v_0.Args[0] 3842 x := v.Args[1] 3843 v.reset(OpARMInvertFlags) 3844 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, TypeFlags) 3845 v0.AuxInt = c 3846 v0.AddArg(x) 3847 v0.AddArg(y) 3848 v.AddArg(v0) 3849 return true 3850 } 3851 // match: (CMP x (SRLconst [c] y)) 3852 // cond: 3853 // result: (CMPshiftRL x y [c]) 3854 for { 3855 x := v.Args[0] 3856 v_1 := v.Args[1] 3857 if v_1.Op != OpARMSRLconst { 3858 break 3859 } 3860 c := v_1.AuxInt 3861 y := v_1.Args[0] 3862 v.reset(OpARMCMPshiftRL) 3863 v.AuxInt = c 3864 v.AddArg(x) 3865 v.AddArg(y) 3866 return true 3867 } 3868 // match: (CMP (SRLconst [c] y) x) 3869 // cond: 3870 // result: (InvertFlags (CMPshiftRL x y [c])) 3871 for { 3872 v_0 := v.Args[0] 3873 if v_0.Op != OpARMSRLconst { 3874 break 3875 } 3876 c := v_0.AuxInt 3877 y := v_0.Args[0] 3878 x := v.Args[1] 3879 v.reset(OpARMInvertFlags) 3880 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, TypeFlags) 3881 v0.AuxInt = c 3882 v0.AddArg(x) 3883 v0.AddArg(y) 3884 v.AddArg(v0) 3885 return true 3886 } 3887 // match: (CMP x (SRAconst [c] y)) 3888 // cond: 3889 // result: (CMPshiftRA x y [c]) 3890 for { 3891 x := v.Args[0] 3892 v_1 := v.Args[1] 3893 if v_1.Op != OpARMSRAconst { 3894 break 3895 } 3896 c := v_1.AuxInt 3897 y := v_1.Args[0] 3898 v.reset(OpARMCMPshiftRA) 3899 v.AuxInt = c 3900 v.AddArg(x) 3901 v.AddArg(y) 3902 return true 3903 } 3904 // match: (CMP (SRAconst [c] y) x) 3905 // cond: 3906 // result: (InvertFlags (CMPshiftRA x y [c])) 3907 for { 3908 v_0 := v.Args[0] 3909 if v_0.Op != OpARMSRAconst { 3910 break 3911 } 3912 c := v_0.AuxInt 3913 y := v_0.Args[0] 3914 x := v.Args[1] 3915 v.reset(OpARMInvertFlags) 3916 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, TypeFlags) 3917 v0.AuxInt = c 3918 v0.AddArg(x) 3919 v0.AddArg(y) 3920 v.AddArg(v0) 3921 return true 3922 } 3923 // match: (CMP x (SLL y z)) 3924 // cond: 3925 // result: (CMPshiftLLreg x y z) 3926 for { 3927 x := v.Args[0] 3928 v_1 := v.Args[1] 3929 if v_1.Op != OpARMSLL { 3930 break 3931 } 3932 y := v_1.Args[0] 3933 z := v_1.Args[1] 3934 v.reset(OpARMCMPshiftLLreg) 3935 v.AddArg(x) 3936 v.AddArg(y) 3937 v.AddArg(z) 3938 return true 3939 } 3940 // match: (CMP (SLL y z) x) 3941 // cond: 3942 // result: (InvertFlags (CMPshiftLLreg x y z)) 3943 for { 3944 v_0 := v.Args[0] 3945 if v_0.Op != OpARMSLL { 3946 break 3947 } 3948 y := v_0.Args[0] 3949 z := v_0.Args[1] 3950 x := v.Args[1] 3951 v.reset(OpARMInvertFlags) 3952 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, TypeFlags) 3953 v0.AddArg(x) 3954 v0.AddArg(y) 3955 v0.AddArg(z) 3956 v.AddArg(v0) 3957 return true 3958 } 3959 // match: (CMP x (SRL y z)) 3960 // cond: 3961 // result: (CMPshiftRLreg x y z) 3962 for { 3963 x := v.Args[0] 3964 v_1 := v.Args[1] 3965 if v_1.Op != OpARMSRL { 3966 break 3967 } 3968 y := v_1.Args[0] 3969 z := v_1.Args[1] 3970 v.reset(OpARMCMPshiftRLreg) 3971 v.AddArg(x) 3972 v.AddArg(y) 3973 v.AddArg(z) 3974 return true 3975 } 3976 // match: (CMP (SRL y z) x) 3977 // cond: 3978 // result: (InvertFlags (CMPshiftRLreg x y z)) 3979 for { 3980 v_0 := v.Args[0] 3981 if v_0.Op != OpARMSRL { 3982 break 3983 } 3984 y := v_0.Args[0] 3985 z := v_0.Args[1] 3986 x := v.Args[1] 3987 v.reset(OpARMInvertFlags) 3988 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, TypeFlags) 3989 v0.AddArg(x) 3990 v0.AddArg(y) 3991 v0.AddArg(z) 3992 v.AddArg(v0) 3993 return true 3994 } 3995 // match: (CMP x (SRA y z)) 3996 // cond: 3997 // result: (CMPshiftRAreg x y z) 3998 for { 3999 x := v.Args[0] 4000 v_1 := v.Args[1] 4001 if v_1.Op != OpARMSRA { 4002 break 4003 } 4004 y := v_1.Args[0] 4005 z := v_1.Args[1] 4006 v.reset(OpARMCMPshiftRAreg) 4007 v.AddArg(x) 4008 v.AddArg(y) 4009 v.AddArg(z) 4010 return true 4011 } 4012 // match: (CMP (SRA y z) x) 4013 // cond: 4014 // result: (InvertFlags (CMPshiftRAreg x y z)) 4015 for { 4016 v_0 := v.Args[0] 4017 if v_0.Op != OpARMSRA { 4018 break 4019 } 4020 y := v_0.Args[0] 4021 z := v_0.Args[1] 4022 x := v.Args[1] 4023 v.reset(OpARMInvertFlags) 4024 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, TypeFlags) 4025 v0.AddArg(x) 4026 v0.AddArg(y) 4027 v0.AddArg(z) 4028 v.AddArg(v0) 4029 return true 4030 } 4031 return false 4032 } 4033 func rewriteValueARM_OpARMCMPD(v *Value, config *Config) bool { 4034 b := v.Block 4035 _ = b 4036 // match: (CMPD x (MOVDconst [0])) 4037 // cond: 4038 // result: (CMPD0 x) 4039 for { 4040 x := v.Args[0] 4041 v_1 := v.Args[1] 4042 if v_1.Op != OpARMMOVDconst { 4043 break 4044 } 4045 if v_1.AuxInt != 0 { 4046 break 4047 } 4048 v.reset(OpARMCMPD0) 4049 v.AddArg(x) 4050 return true 4051 } 4052 return false 4053 } 4054 func rewriteValueARM_OpARMCMPF(v *Value, config *Config) bool { 4055 b := v.Block 4056 _ = b 4057 // match: (CMPF x (MOVFconst [0])) 4058 // cond: 4059 // result: (CMPF0 x) 4060 for { 4061 x := v.Args[0] 4062 v_1 := v.Args[1] 4063 if v_1.Op != OpARMMOVFconst { 4064 break 4065 } 4066 if v_1.AuxInt != 0 { 4067 break 4068 } 4069 v.reset(OpARMCMPF0) 4070 v.AddArg(x) 4071 return true 4072 } 4073 return false 4074 } 4075 func rewriteValueARM_OpARMCMPconst(v *Value, config *Config) bool { 4076 b := v.Block 4077 _ = b 4078 // match: (CMPconst (MOVWconst [x]) [y]) 4079 // cond: int32(x)==int32(y) 4080 // result: (FlagEQ) 4081 for { 4082 y := v.AuxInt 4083 v_0 := v.Args[0] 4084 if v_0.Op != OpARMMOVWconst { 4085 break 4086 } 4087 x := v_0.AuxInt 4088 if !(int32(x) == int32(y)) { 4089 break 4090 } 4091 v.reset(OpARMFlagEQ) 4092 return true 4093 } 4094 // match: (CMPconst (MOVWconst [x]) [y]) 4095 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 4096 // result: (FlagLT_ULT) 4097 for { 4098 y := v.AuxInt 4099 v_0 := v.Args[0] 4100 if v_0.Op != OpARMMOVWconst { 4101 break 4102 } 4103 x := v_0.AuxInt 4104 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 4105 break 4106 } 4107 v.reset(OpARMFlagLT_ULT) 4108 return true 4109 } 4110 // match: (CMPconst (MOVWconst [x]) [y]) 4111 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 4112 // result: (FlagLT_UGT) 4113 for { 4114 y := v.AuxInt 4115 v_0 := v.Args[0] 4116 if v_0.Op != OpARMMOVWconst { 4117 break 4118 } 4119 x := v_0.AuxInt 4120 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 4121 break 4122 } 4123 v.reset(OpARMFlagLT_UGT) 4124 return true 4125 } 4126 // match: (CMPconst (MOVWconst [x]) [y]) 4127 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 4128 // result: (FlagGT_ULT) 4129 for { 4130 y := v.AuxInt 4131 v_0 := v.Args[0] 4132 if v_0.Op != OpARMMOVWconst { 4133 break 4134 } 4135 x := v_0.AuxInt 4136 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 4137 break 4138 } 4139 v.reset(OpARMFlagGT_ULT) 4140 return true 4141 } 4142 // match: (CMPconst (MOVWconst [x]) [y]) 4143 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 4144 // result: (FlagGT_UGT) 4145 for { 4146 y := v.AuxInt 4147 v_0 := v.Args[0] 4148 if v_0.Op != OpARMMOVWconst { 4149 break 4150 } 4151 x := v_0.AuxInt 4152 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 4153 break 4154 } 4155 v.reset(OpARMFlagGT_UGT) 4156 return true 4157 } 4158 // match: (CMPconst (MOVBUreg _) [c]) 4159 // cond: 0xff < c 4160 // result: (FlagLT_ULT) 4161 for { 4162 c := v.AuxInt 4163 v_0 := v.Args[0] 4164 if v_0.Op != OpARMMOVBUreg { 4165 break 4166 } 4167 if !(0xff < c) { 4168 break 4169 } 4170 v.reset(OpARMFlagLT_ULT) 4171 return true 4172 } 4173 // match: (CMPconst (MOVHUreg _) [c]) 4174 // cond: 0xffff < c 4175 // result: (FlagLT_ULT) 4176 for { 4177 c := v.AuxInt 4178 v_0 := v.Args[0] 4179 if v_0.Op != OpARMMOVHUreg { 4180 break 4181 } 4182 if !(0xffff < c) { 4183 break 4184 } 4185 v.reset(OpARMFlagLT_ULT) 4186 return true 4187 } 4188 // match: (CMPconst (ANDconst _ [m]) [n]) 4189 // cond: 0 <= int32(m) && int32(m) < int32(n) 4190 // result: (FlagLT_ULT) 4191 for { 4192 n := v.AuxInt 4193 v_0 := v.Args[0] 4194 if v_0.Op != OpARMANDconst { 4195 break 4196 } 4197 m := v_0.AuxInt 4198 if !(0 <= int32(m) && int32(m) < int32(n)) { 4199 break 4200 } 4201 v.reset(OpARMFlagLT_ULT) 4202 return true 4203 } 4204 // match: (CMPconst (SRLconst _ [c]) [n]) 4205 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 4206 // result: (FlagLT_ULT) 4207 for { 4208 n := v.AuxInt 4209 v_0 := v.Args[0] 4210 if v_0.Op != OpARMSRLconst { 4211 break 4212 } 4213 c := v_0.AuxInt 4214 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 4215 break 4216 } 4217 v.reset(OpARMFlagLT_ULT) 4218 return true 4219 } 4220 return false 4221 } 4222 func rewriteValueARM_OpARMCMPshiftLL(v *Value, config *Config) bool { 4223 b := v.Block 4224 _ = b 4225 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 4226 // cond: 4227 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 4228 for { 4229 d := v.AuxInt 4230 v_0 := v.Args[0] 4231 if v_0.Op != OpARMMOVWconst { 4232 break 4233 } 4234 c := v_0.AuxInt 4235 x := v.Args[1] 4236 v.reset(OpARMInvertFlags) 4237 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4238 v0.AuxInt = c 4239 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4240 v1.AuxInt = d 4241 v1.AddArg(x) 4242 v0.AddArg(v1) 4243 v.AddArg(v0) 4244 return true 4245 } 4246 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 4247 // cond: 4248 // result: (CMPconst x [int64(uint32(c)<<uint64(d))]) 4249 for { 4250 d := v.AuxInt 4251 x := v.Args[0] 4252 v_1 := v.Args[1] 4253 if v_1.Op != OpARMMOVWconst { 4254 break 4255 } 4256 c := v_1.AuxInt 4257 v.reset(OpARMCMPconst) 4258 v.AuxInt = int64(uint32(c) << uint64(d)) 4259 v.AddArg(x) 4260 return true 4261 } 4262 return false 4263 } 4264 func rewriteValueARM_OpARMCMPshiftLLreg(v *Value, config *Config) bool { 4265 b := v.Block 4266 _ = b 4267 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 4268 // cond: 4269 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 4270 for { 4271 v_0 := v.Args[0] 4272 if v_0.Op != OpARMMOVWconst { 4273 break 4274 } 4275 c := v_0.AuxInt 4276 x := v.Args[1] 4277 y := v.Args[2] 4278 v.reset(OpARMInvertFlags) 4279 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4280 v0.AuxInt = c 4281 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4282 v1.AddArg(x) 4283 v1.AddArg(y) 4284 v0.AddArg(v1) 4285 v.AddArg(v0) 4286 return true 4287 } 4288 // match: (CMPshiftLLreg x y (MOVWconst [c])) 4289 // cond: 4290 // result: (CMPshiftLL x y [c]) 4291 for { 4292 x := v.Args[0] 4293 y := v.Args[1] 4294 v_2 := v.Args[2] 4295 if v_2.Op != OpARMMOVWconst { 4296 break 4297 } 4298 c := v_2.AuxInt 4299 v.reset(OpARMCMPshiftLL) 4300 v.AuxInt = c 4301 v.AddArg(x) 4302 v.AddArg(y) 4303 return true 4304 } 4305 return false 4306 } 4307 func rewriteValueARM_OpARMCMPshiftRA(v *Value, config *Config) bool { 4308 b := v.Block 4309 _ = b 4310 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 4311 // cond: 4312 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 4313 for { 4314 d := v.AuxInt 4315 v_0 := v.Args[0] 4316 if v_0.Op != OpARMMOVWconst { 4317 break 4318 } 4319 c := v_0.AuxInt 4320 x := v.Args[1] 4321 v.reset(OpARMInvertFlags) 4322 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4323 v0.AuxInt = c 4324 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4325 v1.AuxInt = d 4326 v1.AddArg(x) 4327 v0.AddArg(v1) 4328 v.AddArg(v0) 4329 return true 4330 } 4331 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 4332 // cond: 4333 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 4334 for { 4335 d := v.AuxInt 4336 x := v.Args[0] 4337 v_1 := v.Args[1] 4338 if v_1.Op != OpARMMOVWconst { 4339 break 4340 } 4341 c := v_1.AuxInt 4342 v.reset(OpARMCMPconst) 4343 v.AuxInt = int64(int32(c) >> uint64(d)) 4344 v.AddArg(x) 4345 return true 4346 } 4347 return false 4348 } 4349 func rewriteValueARM_OpARMCMPshiftRAreg(v *Value, config *Config) bool { 4350 b := v.Block 4351 _ = b 4352 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 4353 // cond: 4354 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 4355 for { 4356 v_0 := v.Args[0] 4357 if v_0.Op != OpARMMOVWconst { 4358 break 4359 } 4360 c := v_0.AuxInt 4361 x := v.Args[1] 4362 y := v.Args[2] 4363 v.reset(OpARMInvertFlags) 4364 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4365 v0.AuxInt = c 4366 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4367 v1.AddArg(x) 4368 v1.AddArg(y) 4369 v0.AddArg(v1) 4370 v.AddArg(v0) 4371 return true 4372 } 4373 // match: (CMPshiftRAreg x y (MOVWconst [c])) 4374 // cond: 4375 // result: (CMPshiftRA x y [c]) 4376 for { 4377 x := v.Args[0] 4378 y := v.Args[1] 4379 v_2 := v.Args[2] 4380 if v_2.Op != OpARMMOVWconst { 4381 break 4382 } 4383 c := v_2.AuxInt 4384 v.reset(OpARMCMPshiftRA) 4385 v.AuxInt = c 4386 v.AddArg(x) 4387 v.AddArg(y) 4388 return true 4389 } 4390 return false 4391 } 4392 func rewriteValueARM_OpARMCMPshiftRL(v *Value, config *Config) bool { 4393 b := v.Block 4394 _ = b 4395 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 4396 // cond: 4397 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 4398 for { 4399 d := v.AuxInt 4400 v_0 := v.Args[0] 4401 if v_0.Op != OpARMMOVWconst { 4402 break 4403 } 4404 c := v_0.AuxInt 4405 x := v.Args[1] 4406 v.reset(OpARMInvertFlags) 4407 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4408 v0.AuxInt = c 4409 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 4410 v1.AuxInt = d 4411 v1.AddArg(x) 4412 v0.AddArg(v1) 4413 v.AddArg(v0) 4414 return true 4415 } 4416 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 4417 // cond: 4418 // result: (CMPconst x [int64(uint32(c)>>uint64(d))]) 4419 for { 4420 d := v.AuxInt 4421 x := v.Args[0] 4422 v_1 := v.Args[1] 4423 if v_1.Op != OpARMMOVWconst { 4424 break 4425 } 4426 c := v_1.AuxInt 4427 v.reset(OpARMCMPconst) 4428 v.AuxInt = int64(uint32(c) >> uint64(d)) 4429 v.AddArg(x) 4430 return true 4431 } 4432 return false 4433 } 4434 func rewriteValueARM_OpARMCMPshiftRLreg(v *Value, config *Config) bool { 4435 b := v.Block 4436 _ = b 4437 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 4438 // cond: 4439 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 4440 for { 4441 v_0 := v.Args[0] 4442 if v_0.Op != OpARMMOVWconst { 4443 break 4444 } 4445 c := v_0.AuxInt 4446 x := v.Args[1] 4447 y := v.Args[2] 4448 v.reset(OpARMInvertFlags) 4449 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4450 v0.AuxInt = c 4451 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 4452 v1.AddArg(x) 4453 v1.AddArg(y) 4454 v0.AddArg(v1) 4455 v.AddArg(v0) 4456 return true 4457 } 4458 // match: (CMPshiftRLreg x y (MOVWconst [c])) 4459 // cond: 4460 // result: (CMPshiftRL x y [c]) 4461 for { 4462 x := v.Args[0] 4463 y := v.Args[1] 4464 v_2 := v.Args[2] 4465 if v_2.Op != OpARMMOVWconst { 4466 break 4467 } 4468 c := v_2.AuxInt 4469 v.reset(OpARMCMPshiftRL) 4470 v.AuxInt = c 4471 v.AddArg(x) 4472 v.AddArg(y) 4473 return true 4474 } 4475 return false 4476 } 4477 func rewriteValueARM_OpARMEqual(v *Value, config *Config) bool { 4478 b := v.Block 4479 _ = b 4480 // match: (Equal (FlagEQ)) 4481 // cond: 4482 // result: (MOVWconst [1]) 4483 for { 4484 v_0 := v.Args[0] 4485 if v_0.Op != OpARMFlagEQ { 4486 break 4487 } 4488 v.reset(OpARMMOVWconst) 4489 v.AuxInt = 1 4490 return true 4491 } 4492 // match: (Equal (FlagLT_ULT)) 4493 // cond: 4494 // result: (MOVWconst [0]) 4495 for { 4496 v_0 := v.Args[0] 4497 if v_0.Op != OpARMFlagLT_ULT { 4498 break 4499 } 4500 v.reset(OpARMMOVWconst) 4501 v.AuxInt = 0 4502 return true 4503 } 4504 // match: (Equal (FlagLT_UGT)) 4505 // cond: 4506 // result: (MOVWconst [0]) 4507 for { 4508 v_0 := v.Args[0] 4509 if v_0.Op != OpARMFlagLT_UGT { 4510 break 4511 } 4512 v.reset(OpARMMOVWconst) 4513 v.AuxInt = 0 4514 return true 4515 } 4516 // match: (Equal (FlagGT_ULT)) 4517 // cond: 4518 // result: (MOVWconst [0]) 4519 for { 4520 v_0 := v.Args[0] 4521 if v_0.Op != OpARMFlagGT_ULT { 4522 break 4523 } 4524 v.reset(OpARMMOVWconst) 4525 v.AuxInt = 0 4526 return true 4527 } 4528 // match: (Equal (FlagGT_UGT)) 4529 // cond: 4530 // result: (MOVWconst [0]) 4531 for { 4532 v_0 := v.Args[0] 4533 if v_0.Op != OpARMFlagGT_UGT { 4534 break 4535 } 4536 v.reset(OpARMMOVWconst) 4537 v.AuxInt = 0 4538 return true 4539 } 4540 // match: (Equal (InvertFlags x)) 4541 // cond: 4542 // result: (Equal x) 4543 for { 4544 v_0 := v.Args[0] 4545 if v_0.Op != OpARMInvertFlags { 4546 break 4547 } 4548 x := v_0.Args[0] 4549 v.reset(OpARMEqual) 4550 v.AddArg(x) 4551 return true 4552 } 4553 return false 4554 } 4555 func rewriteValueARM_OpARMGreaterEqual(v *Value, config *Config) bool { 4556 b := v.Block 4557 _ = b 4558 // match: (GreaterEqual (FlagEQ)) 4559 // cond: 4560 // result: (MOVWconst [1]) 4561 for { 4562 v_0 := v.Args[0] 4563 if v_0.Op != OpARMFlagEQ { 4564 break 4565 } 4566 v.reset(OpARMMOVWconst) 4567 v.AuxInt = 1 4568 return true 4569 } 4570 // match: (GreaterEqual (FlagLT_ULT)) 4571 // cond: 4572 // result: (MOVWconst [0]) 4573 for { 4574 v_0 := v.Args[0] 4575 if v_0.Op != OpARMFlagLT_ULT { 4576 break 4577 } 4578 v.reset(OpARMMOVWconst) 4579 v.AuxInt = 0 4580 return true 4581 } 4582 // match: (GreaterEqual (FlagLT_UGT)) 4583 // cond: 4584 // result: (MOVWconst [0]) 4585 for { 4586 v_0 := v.Args[0] 4587 if v_0.Op != OpARMFlagLT_UGT { 4588 break 4589 } 4590 v.reset(OpARMMOVWconst) 4591 v.AuxInt = 0 4592 return true 4593 } 4594 // match: (GreaterEqual (FlagGT_ULT)) 4595 // cond: 4596 // result: (MOVWconst [1]) 4597 for { 4598 v_0 := v.Args[0] 4599 if v_0.Op != OpARMFlagGT_ULT { 4600 break 4601 } 4602 v.reset(OpARMMOVWconst) 4603 v.AuxInt = 1 4604 return true 4605 } 4606 // match: (GreaterEqual (FlagGT_UGT)) 4607 // cond: 4608 // result: (MOVWconst [1]) 4609 for { 4610 v_0 := v.Args[0] 4611 if v_0.Op != OpARMFlagGT_UGT { 4612 break 4613 } 4614 v.reset(OpARMMOVWconst) 4615 v.AuxInt = 1 4616 return true 4617 } 4618 // match: (GreaterEqual (InvertFlags x)) 4619 // cond: 4620 // result: (LessEqual x) 4621 for { 4622 v_0 := v.Args[0] 4623 if v_0.Op != OpARMInvertFlags { 4624 break 4625 } 4626 x := v_0.Args[0] 4627 v.reset(OpARMLessEqual) 4628 v.AddArg(x) 4629 return true 4630 } 4631 return false 4632 } 4633 func rewriteValueARM_OpARMGreaterEqualU(v *Value, config *Config) bool { 4634 b := v.Block 4635 _ = b 4636 // match: (GreaterEqualU (FlagEQ)) 4637 // cond: 4638 // result: (MOVWconst [1]) 4639 for { 4640 v_0 := v.Args[0] 4641 if v_0.Op != OpARMFlagEQ { 4642 break 4643 } 4644 v.reset(OpARMMOVWconst) 4645 v.AuxInt = 1 4646 return true 4647 } 4648 // match: (GreaterEqualU (FlagLT_ULT)) 4649 // cond: 4650 // result: (MOVWconst [0]) 4651 for { 4652 v_0 := v.Args[0] 4653 if v_0.Op != OpARMFlagLT_ULT { 4654 break 4655 } 4656 v.reset(OpARMMOVWconst) 4657 v.AuxInt = 0 4658 return true 4659 } 4660 // match: (GreaterEqualU (FlagLT_UGT)) 4661 // cond: 4662 // result: (MOVWconst [1]) 4663 for { 4664 v_0 := v.Args[0] 4665 if v_0.Op != OpARMFlagLT_UGT { 4666 break 4667 } 4668 v.reset(OpARMMOVWconst) 4669 v.AuxInt = 1 4670 return true 4671 } 4672 // match: (GreaterEqualU (FlagGT_ULT)) 4673 // cond: 4674 // result: (MOVWconst [0]) 4675 for { 4676 v_0 := v.Args[0] 4677 if v_0.Op != OpARMFlagGT_ULT { 4678 break 4679 } 4680 v.reset(OpARMMOVWconst) 4681 v.AuxInt = 0 4682 return true 4683 } 4684 // match: (GreaterEqualU (FlagGT_UGT)) 4685 // cond: 4686 // result: (MOVWconst [1]) 4687 for { 4688 v_0 := v.Args[0] 4689 if v_0.Op != OpARMFlagGT_UGT { 4690 break 4691 } 4692 v.reset(OpARMMOVWconst) 4693 v.AuxInt = 1 4694 return true 4695 } 4696 // match: (GreaterEqualU (InvertFlags x)) 4697 // cond: 4698 // result: (LessEqualU x) 4699 for { 4700 v_0 := v.Args[0] 4701 if v_0.Op != OpARMInvertFlags { 4702 break 4703 } 4704 x := v_0.Args[0] 4705 v.reset(OpARMLessEqualU) 4706 v.AddArg(x) 4707 return true 4708 } 4709 return false 4710 } 4711 func rewriteValueARM_OpARMGreaterThan(v *Value, config *Config) bool { 4712 b := v.Block 4713 _ = b 4714 // match: (GreaterThan (FlagEQ)) 4715 // cond: 4716 // result: (MOVWconst [0]) 4717 for { 4718 v_0 := v.Args[0] 4719 if v_0.Op != OpARMFlagEQ { 4720 break 4721 } 4722 v.reset(OpARMMOVWconst) 4723 v.AuxInt = 0 4724 return true 4725 } 4726 // match: (GreaterThan (FlagLT_ULT)) 4727 // cond: 4728 // result: (MOVWconst [0]) 4729 for { 4730 v_0 := v.Args[0] 4731 if v_0.Op != OpARMFlagLT_ULT { 4732 break 4733 } 4734 v.reset(OpARMMOVWconst) 4735 v.AuxInt = 0 4736 return true 4737 } 4738 // match: (GreaterThan (FlagLT_UGT)) 4739 // cond: 4740 // result: (MOVWconst [0]) 4741 for { 4742 v_0 := v.Args[0] 4743 if v_0.Op != OpARMFlagLT_UGT { 4744 break 4745 } 4746 v.reset(OpARMMOVWconst) 4747 v.AuxInt = 0 4748 return true 4749 } 4750 // match: (GreaterThan (FlagGT_ULT)) 4751 // cond: 4752 // result: (MOVWconst [1]) 4753 for { 4754 v_0 := v.Args[0] 4755 if v_0.Op != OpARMFlagGT_ULT { 4756 break 4757 } 4758 v.reset(OpARMMOVWconst) 4759 v.AuxInt = 1 4760 return true 4761 } 4762 // match: (GreaterThan (FlagGT_UGT)) 4763 // cond: 4764 // result: (MOVWconst [1]) 4765 for { 4766 v_0 := v.Args[0] 4767 if v_0.Op != OpARMFlagGT_UGT { 4768 break 4769 } 4770 v.reset(OpARMMOVWconst) 4771 v.AuxInt = 1 4772 return true 4773 } 4774 // match: (GreaterThan (InvertFlags x)) 4775 // cond: 4776 // result: (LessThan x) 4777 for { 4778 v_0 := v.Args[0] 4779 if v_0.Op != OpARMInvertFlags { 4780 break 4781 } 4782 x := v_0.Args[0] 4783 v.reset(OpARMLessThan) 4784 v.AddArg(x) 4785 return true 4786 } 4787 return false 4788 } 4789 func rewriteValueARM_OpARMGreaterThanU(v *Value, config *Config) bool { 4790 b := v.Block 4791 _ = b 4792 // match: (GreaterThanU (FlagEQ)) 4793 // cond: 4794 // result: (MOVWconst [0]) 4795 for { 4796 v_0 := v.Args[0] 4797 if v_0.Op != OpARMFlagEQ { 4798 break 4799 } 4800 v.reset(OpARMMOVWconst) 4801 v.AuxInt = 0 4802 return true 4803 } 4804 // match: (GreaterThanU (FlagLT_ULT)) 4805 // cond: 4806 // result: (MOVWconst [0]) 4807 for { 4808 v_0 := v.Args[0] 4809 if v_0.Op != OpARMFlagLT_ULT { 4810 break 4811 } 4812 v.reset(OpARMMOVWconst) 4813 v.AuxInt = 0 4814 return true 4815 } 4816 // match: (GreaterThanU (FlagLT_UGT)) 4817 // cond: 4818 // result: (MOVWconst [1]) 4819 for { 4820 v_0 := v.Args[0] 4821 if v_0.Op != OpARMFlagLT_UGT { 4822 break 4823 } 4824 v.reset(OpARMMOVWconst) 4825 v.AuxInt = 1 4826 return true 4827 } 4828 // match: (GreaterThanU (FlagGT_ULT)) 4829 // cond: 4830 // result: (MOVWconst [0]) 4831 for { 4832 v_0 := v.Args[0] 4833 if v_0.Op != OpARMFlagGT_ULT { 4834 break 4835 } 4836 v.reset(OpARMMOVWconst) 4837 v.AuxInt = 0 4838 return true 4839 } 4840 // match: (GreaterThanU (FlagGT_UGT)) 4841 // cond: 4842 // result: (MOVWconst [1]) 4843 for { 4844 v_0 := v.Args[0] 4845 if v_0.Op != OpARMFlagGT_UGT { 4846 break 4847 } 4848 v.reset(OpARMMOVWconst) 4849 v.AuxInt = 1 4850 return true 4851 } 4852 // match: (GreaterThanU (InvertFlags x)) 4853 // cond: 4854 // result: (LessThanU x) 4855 for { 4856 v_0 := v.Args[0] 4857 if v_0.Op != OpARMInvertFlags { 4858 break 4859 } 4860 x := v_0.Args[0] 4861 v.reset(OpARMLessThanU) 4862 v.AddArg(x) 4863 return true 4864 } 4865 return false 4866 } 4867 func rewriteValueARM_OpARMLessEqual(v *Value, config *Config) bool { 4868 b := v.Block 4869 _ = b 4870 // match: (LessEqual (FlagEQ)) 4871 // cond: 4872 // result: (MOVWconst [1]) 4873 for { 4874 v_0 := v.Args[0] 4875 if v_0.Op != OpARMFlagEQ { 4876 break 4877 } 4878 v.reset(OpARMMOVWconst) 4879 v.AuxInt = 1 4880 return true 4881 } 4882 // match: (LessEqual (FlagLT_ULT)) 4883 // cond: 4884 // result: (MOVWconst [1]) 4885 for { 4886 v_0 := v.Args[0] 4887 if v_0.Op != OpARMFlagLT_ULT { 4888 break 4889 } 4890 v.reset(OpARMMOVWconst) 4891 v.AuxInt = 1 4892 return true 4893 } 4894 // match: (LessEqual (FlagLT_UGT)) 4895 // cond: 4896 // result: (MOVWconst [1]) 4897 for { 4898 v_0 := v.Args[0] 4899 if v_0.Op != OpARMFlagLT_UGT { 4900 break 4901 } 4902 v.reset(OpARMMOVWconst) 4903 v.AuxInt = 1 4904 return true 4905 } 4906 // match: (LessEqual (FlagGT_ULT)) 4907 // cond: 4908 // result: (MOVWconst [0]) 4909 for { 4910 v_0 := v.Args[0] 4911 if v_0.Op != OpARMFlagGT_ULT { 4912 break 4913 } 4914 v.reset(OpARMMOVWconst) 4915 v.AuxInt = 0 4916 return true 4917 } 4918 // match: (LessEqual (FlagGT_UGT)) 4919 // cond: 4920 // result: (MOVWconst [0]) 4921 for { 4922 v_0 := v.Args[0] 4923 if v_0.Op != OpARMFlagGT_UGT { 4924 break 4925 } 4926 v.reset(OpARMMOVWconst) 4927 v.AuxInt = 0 4928 return true 4929 } 4930 // match: (LessEqual (InvertFlags x)) 4931 // cond: 4932 // result: (GreaterEqual x) 4933 for { 4934 v_0 := v.Args[0] 4935 if v_0.Op != OpARMInvertFlags { 4936 break 4937 } 4938 x := v_0.Args[0] 4939 v.reset(OpARMGreaterEqual) 4940 v.AddArg(x) 4941 return true 4942 } 4943 return false 4944 } 4945 func rewriteValueARM_OpARMLessEqualU(v *Value, config *Config) bool { 4946 b := v.Block 4947 _ = b 4948 // match: (LessEqualU (FlagEQ)) 4949 // cond: 4950 // result: (MOVWconst [1]) 4951 for { 4952 v_0 := v.Args[0] 4953 if v_0.Op != OpARMFlagEQ { 4954 break 4955 } 4956 v.reset(OpARMMOVWconst) 4957 v.AuxInt = 1 4958 return true 4959 } 4960 // match: (LessEqualU (FlagLT_ULT)) 4961 // cond: 4962 // result: (MOVWconst [1]) 4963 for { 4964 v_0 := v.Args[0] 4965 if v_0.Op != OpARMFlagLT_ULT { 4966 break 4967 } 4968 v.reset(OpARMMOVWconst) 4969 v.AuxInt = 1 4970 return true 4971 } 4972 // match: (LessEqualU (FlagLT_UGT)) 4973 // cond: 4974 // result: (MOVWconst [0]) 4975 for { 4976 v_0 := v.Args[0] 4977 if v_0.Op != OpARMFlagLT_UGT { 4978 break 4979 } 4980 v.reset(OpARMMOVWconst) 4981 v.AuxInt = 0 4982 return true 4983 } 4984 // match: (LessEqualU (FlagGT_ULT)) 4985 // cond: 4986 // result: (MOVWconst [1]) 4987 for { 4988 v_0 := v.Args[0] 4989 if v_0.Op != OpARMFlagGT_ULT { 4990 break 4991 } 4992 v.reset(OpARMMOVWconst) 4993 v.AuxInt = 1 4994 return true 4995 } 4996 // match: (LessEqualU (FlagGT_UGT)) 4997 // cond: 4998 // result: (MOVWconst [0]) 4999 for { 5000 v_0 := v.Args[0] 5001 if v_0.Op != OpARMFlagGT_UGT { 5002 break 5003 } 5004 v.reset(OpARMMOVWconst) 5005 v.AuxInt = 0 5006 return true 5007 } 5008 // match: (LessEqualU (InvertFlags x)) 5009 // cond: 5010 // result: (GreaterEqualU x) 5011 for { 5012 v_0 := v.Args[0] 5013 if v_0.Op != OpARMInvertFlags { 5014 break 5015 } 5016 x := v_0.Args[0] 5017 v.reset(OpARMGreaterEqualU) 5018 v.AddArg(x) 5019 return true 5020 } 5021 return false 5022 } 5023 func rewriteValueARM_OpARMLessThan(v *Value, config *Config) bool { 5024 b := v.Block 5025 _ = b 5026 // match: (LessThan (FlagEQ)) 5027 // cond: 5028 // result: (MOVWconst [0]) 5029 for { 5030 v_0 := v.Args[0] 5031 if v_0.Op != OpARMFlagEQ { 5032 break 5033 } 5034 v.reset(OpARMMOVWconst) 5035 v.AuxInt = 0 5036 return true 5037 } 5038 // match: (LessThan (FlagLT_ULT)) 5039 // cond: 5040 // result: (MOVWconst [1]) 5041 for { 5042 v_0 := v.Args[0] 5043 if v_0.Op != OpARMFlagLT_ULT { 5044 break 5045 } 5046 v.reset(OpARMMOVWconst) 5047 v.AuxInt = 1 5048 return true 5049 } 5050 // match: (LessThan (FlagLT_UGT)) 5051 // cond: 5052 // result: (MOVWconst [1]) 5053 for { 5054 v_0 := v.Args[0] 5055 if v_0.Op != OpARMFlagLT_UGT { 5056 break 5057 } 5058 v.reset(OpARMMOVWconst) 5059 v.AuxInt = 1 5060 return true 5061 } 5062 // match: (LessThan (FlagGT_ULT)) 5063 // cond: 5064 // result: (MOVWconst [0]) 5065 for { 5066 v_0 := v.Args[0] 5067 if v_0.Op != OpARMFlagGT_ULT { 5068 break 5069 } 5070 v.reset(OpARMMOVWconst) 5071 v.AuxInt = 0 5072 return true 5073 } 5074 // match: (LessThan (FlagGT_UGT)) 5075 // cond: 5076 // result: (MOVWconst [0]) 5077 for { 5078 v_0 := v.Args[0] 5079 if v_0.Op != OpARMFlagGT_UGT { 5080 break 5081 } 5082 v.reset(OpARMMOVWconst) 5083 v.AuxInt = 0 5084 return true 5085 } 5086 // match: (LessThan (InvertFlags x)) 5087 // cond: 5088 // result: (GreaterThan x) 5089 for { 5090 v_0 := v.Args[0] 5091 if v_0.Op != OpARMInvertFlags { 5092 break 5093 } 5094 x := v_0.Args[0] 5095 v.reset(OpARMGreaterThan) 5096 v.AddArg(x) 5097 return true 5098 } 5099 return false 5100 } 5101 func rewriteValueARM_OpARMLessThanU(v *Value, config *Config) bool { 5102 b := v.Block 5103 _ = b 5104 // match: (LessThanU (FlagEQ)) 5105 // cond: 5106 // result: (MOVWconst [0]) 5107 for { 5108 v_0 := v.Args[0] 5109 if v_0.Op != OpARMFlagEQ { 5110 break 5111 } 5112 v.reset(OpARMMOVWconst) 5113 v.AuxInt = 0 5114 return true 5115 } 5116 // match: (LessThanU (FlagLT_ULT)) 5117 // cond: 5118 // result: (MOVWconst [1]) 5119 for { 5120 v_0 := v.Args[0] 5121 if v_0.Op != OpARMFlagLT_ULT { 5122 break 5123 } 5124 v.reset(OpARMMOVWconst) 5125 v.AuxInt = 1 5126 return true 5127 } 5128 // match: (LessThanU (FlagLT_UGT)) 5129 // cond: 5130 // result: (MOVWconst [0]) 5131 for { 5132 v_0 := v.Args[0] 5133 if v_0.Op != OpARMFlagLT_UGT { 5134 break 5135 } 5136 v.reset(OpARMMOVWconst) 5137 v.AuxInt = 0 5138 return true 5139 } 5140 // match: (LessThanU (FlagGT_ULT)) 5141 // cond: 5142 // result: (MOVWconst [1]) 5143 for { 5144 v_0 := v.Args[0] 5145 if v_0.Op != OpARMFlagGT_ULT { 5146 break 5147 } 5148 v.reset(OpARMMOVWconst) 5149 v.AuxInt = 1 5150 return true 5151 } 5152 // match: (LessThanU (FlagGT_UGT)) 5153 // cond: 5154 // result: (MOVWconst [0]) 5155 for { 5156 v_0 := v.Args[0] 5157 if v_0.Op != OpARMFlagGT_UGT { 5158 break 5159 } 5160 v.reset(OpARMMOVWconst) 5161 v.AuxInt = 0 5162 return true 5163 } 5164 // match: (LessThanU (InvertFlags x)) 5165 // cond: 5166 // result: (GreaterThanU x) 5167 for { 5168 v_0 := v.Args[0] 5169 if v_0.Op != OpARMInvertFlags { 5170 break 5171 } 5172 x := v_0.Args[0] 5173 v.reset(OpARMGreaterThanU) 5174 v.AddArg(x) 5175 return true 5176 } 5177 return false 5178 } 5179 func rewriteValueARM_OpARMMOVBUload(v *Value, config *Config) bool { 5180 b := v.Block 5181 _ = b 5182 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 5183 // cond: 5184 // result: (MOVBUload [off1+off2] {sym} ptr mem) 5185 for { 5186 off1 := v.AuxInt 5187 sym := v.Aux 5188 v_0 := v.Args[0] 5189 if v_0.Op != OpARMADDconst { 5190 break 5191 } 5192 off2 := v_0.AuxInt 5193 ptr := v_0.Args[0] 5194 mem := v.Args[1] 5195 v.reset(OpARMMOVBUload) 5196 v.AuxInt = off1 + off2 5197 v.Aux = sym 5198 v.AddArg(ptr) 5199 v.AddArg(mem) 5200 return true 5201 } 5202 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5203 // cond: canMergeSym(sym1,sym2) 5204 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5205 for { 5206 off1 := v.AuxInt 5207 sym1 := v.Aux 5208 v_0 := v.Args[0] 5209 if v_0.Op != OpARMMOVWaddr { 5210 break 5211 } 5212 off2 := v_0.AuxInt 5213 sym2 := v_0.Aux 5214 ptr := v_0.Args[0] 5215 mem := v.Args[1] 5216 if !(canMergeSym(sym1, sym2)) { 5217 break 5218 } 5219 v.reset(OpARMMOVBUload) 5220 v.AuxInt = off1 + off2 5221 v.Aux = mergeSym(sym1, sym2) 5222 v.AddArg(ptr) 5223 v.AddArg(mem) 5224 return true 5225 } 5226 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5227 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type) 5228 // result: x 5229 for { 5230 off := v.AuxInt 5231 sym := v.Aux 5232 ptr := v.Args[0] 5233 v_1 := v.Args[1] 5234 if v_1.Op != OpARMMOVBstore { 5235 break 5236 } 5237 off2 := v_1.AuxInt 5238 sym2 := v_1.Aux 5239 ptr2 := v_1.Args[0] 5240 x := v_1.Args[1] 5241 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type)) { 5242 break 5243 } 5244 v.reset(OpCopy) 5245 v.Type = x.Type 5246 v.AddArg(x) 5247 return true 5248 } 5249 return false 5250 } 5251 func rewriteValueARM_OpARMMOVBUreg(v *Value, config *Config) bool { 5252 b := v.Block 5253 _ = b 5254 // match: (MOVBUreg x:(MOVBUload _ _)) 5255 // cond: 5256 // result: (MOVWreg x) 5257 for { 5258 x := v.Args[0] 5259 if x.Op != OpARMMOVBUload { 5260 break 5261 } 5262 v.reset(OpARMMOVWreg) 5263 v.AddArg(x) 5264 return true 5265 } 5266 // match: (MOVBUreg (ANDconst [c] x)) 5267 // cond: 5268 // result: (ANDconst [c&0xff] x) 5269 for { 5270 v_0 := v.Args[0] 5271 if v_0.Op != OpARMANDconst { 5272 break 5273 } 5274 c := v_0.AuxInt 5275 x := v_0.Args[0] 5276 v.reset(OpARMANDconst) 5277 v.AuxInt = c & 0xff 5278 v.AddArg(x) 5279 return true 5280 } 5281 // match: (MOVBUreg x:(MOVBUreg _)) 5282 // cond: 5283 // result: (MOVWreg x) 5284 for { 5285 x := v.Args[0] 5286 if x.Op != OpARMMOVBUreg { 5287 break 5288 } 5289 v.reset(OpARMMOVWreg) 5290 v.AddArg(x) 5291 return true 5292 } 5293 // match: (MOVBUreg (MOVWconst [c])) 5294 // cond: 5295 // result: (MOVWconst [int64(uint8(c))]) 5296 for { 5297 v_0 := v.Args[0] 5298 if v_0.Op != OpARMMOVWconst { 5299 break 5300 } 5301 c := v_0.AuxInt 5302 v.reset(OpARMMOVWconst) 5303 v.AuxInt = int64(uint8(c)) 5304 return true 5305 } 5306 return false 5307 } 5308 func rewriteValueARM_OpARMMOVBload(v *Value, config *Config) bool { 5309 b := v.Block 5310 _ = b 5311 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 5312 // cond: 5313 // result: (MOVBload [off1+off2] {sym} ptr mem) 5314 for { 5315 off1 := v.AuxInt 5316 sym := v.Aux 5317 v_0 := v.Args[0] 5318 if v_0.Op != OpARMADDconst { 5319 break 5320 } 5321 off2 := v_0.AuxInt 5322 ptr := v_0.Args[0] 5323 mem := v.Args[1] 5324 v.reset(OpARMMOVBload) 5325 v.AuxInt = off1 + off2 5326 v.Aux = sym 5327 v.AddArg(ptr) 5328 v.AddArg(mem) 5329 return true 5330 } 5331 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5332 // cond: canMergeSym(sym1,sym2) 5333 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5334 for { 5335 off1 := v.AuxInt 5336 sym1 := v.Aux 5337 v_0 := v.Args[0] 5338 if v_0.Op != OpARMMOVWaddr { 5339 break 5340 } 5341 off2 := v_0.AuxInt 5342 sym2 := v_0.Aux 5343 ptr := v_0.Args[0] 5344 mem := v.Args[1] 5345 if !(canMergeSym(sym1, sym2)) { 5346 break 5347 } 5348 v.reset(OpARMMOVBload) 5349 v.AuxInt = off1 + off2 5350 v.Aux = mergeSym(sym1, sym2) 5351 v.AddArg(ptr) 5352 v.AddArg(mem) 5353 return true 5354 } 5355 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5356 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type) 5357 // result: x 5358 for { 5359 off := v.AuxInt 5360 sym := v.Aux 5361 ptr := v.Args[0] 5362 v_1 := v.Args[1] 5363 if v_1.Op != OpARMMOVBstore { 5364 break 5365 } 5366 off2 := v_1.AuxInt 5367 sym2 := v_1.Aux 5368 ptr2 := v_1.Args[0] 5369 x := v_1.Args[1] 5370 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type)) { 5371 break 5372 } 5373 v.reset(OpCopy) 5374 v.Type = x.Type 5375 v.AddArg(x) 5376 return true 5377 } 5378 return false 5379 } 5380 func rewriteValueARM_OpARMMOVBreg(v *Value, config *Config) bool { 5381 b := v.Block 5382 _ = b 5383 // match: (MOVBreg x:(MOVBload _ _)) 5384 // cond: 5385 // result: (MOVWreg x) 5386 for { 5387 x := v.Args[0] 5388 if x.Op != OpARMMOVBload { 5389 break 5390 } 5391 v.reset(OpARMMOVWreg) 5392 v.AddArg(x) 5393 return true 5394 } 5395 // match: (MOVBreg (ANDconst [c] x)) 5396 // cond: c & 0x80 == 0 5397 // result: (ANDconst [c&0x7f] x) 5398 for { 5399 v_0 := v.Args[0] 5400 if v_0.Op != OpARMANDconst { 5401 break 5402 } 5403 c := v_0.AuxInt 5404 x := v_0.Args[0] 5405 if !(c&0x80 == 0) { 5406 break 5407 } 5408 v.reset(OpARMANDconst) 5409 v.AuxInt = c & 0x7f 5410 v.AddArg(x) 5411 return true 5412 } 5413 // match: (MOVBreg x:(MOVBreg _)) 5414 // cond: 5415 // result: (MOVWreg x) 5416 for { 5417 x := v.Args[0] 5418 if x.Op != OpARMMOVBreg { 5419 break 5420 } 5421 v.reset(OpARMMOVWreg) 5422 v.AddArg(x) 5423 return true 5424 } 5425 // match: (MOVBreg (MOVWconst [c])) 5426 // cond: 5427 // result: (MOVWconst [int64(int8(c))]) 5428 for { 5429 v_0 := v.Args[0] 5430 if v_0.Op != OpARMMOVWconst { 5431 break 5432 } 5433 c := v_0.AuxInt 5434 v.reset(OpARMMOVWconst) 5435 v.AuxInt = int64(int8(c)) 5436 return true 5437 } 5438 return false 5439 } 5440 func rewriteValueARM_OpARMMOVBstore(v *Value, config *Config) bool { 5441 b := v.Block 5442 _ = b 5443 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5444 // cond: 5445 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 5446 for { 5447 off1 := v.AuxInt 5448 sym := v.Aux 5449 v_0 := v.Args[0] 5450 if v_0.Op != OpARMADDconst { 5451 break 5452 } 5453 off2 := v_0.AuxInt 5454 ptr := v_0.Args[0] 5455 val := v.Args[1] 5456 mem := v.Args[2] 5457 v.reset(OpARMMOVBstore) 5458 v.AuxInt = off1 + off2 5459 v.Aux = sym 5460 v.AddArg(ptr) 5461 v.AddArg(val) 5462 v.AddArg(mem) 5463 return true 5464 } 5465 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5466 // cond: canMergeSym(sym1,sym2) 5467 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5468 for { 5469 off1 := v.AuxInt 5470 sym1 := v.Aux 5471 v_0 := v.Args[0] 5472 if v_0.Op != OpARMMOVWaddr { 5473 break 5474 } 5475 off2 := v_0.AuxInt 5476 sym2 := v_0.Aux 5477 ptr := v_0.Args[0] 5478 val := v.Args[1] 5479 mem := v.Args[2] 5480 if !(canMergeSym(sym1, sym2)) { 5481 break 5482 } 5483 v.reset(OpARMMOVBstore) 5484 v.AuxInt = off1 + off2 5485 v.Aux = mergeSym(sym1, sym2) 5486 v.AddArg(ptr) 5487 v.AddArg(val) 5488 v.AddArg(mem) 5489 return true 5490 } 5491 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 5492 // cond: 5493 // result: (MOVBstore [off] {sym} ptr x mem) 5494 for { 5495 off := v.AuxInt 5496 sym := v.Aux 5497 ptr := v.Args[0] 5498 v_1 := v.Args[1] 5499 if v_1.Op != OpARMMOVBreg { 5500 break 5501 } 5502 x := v_1.Args[0] 5503 mem := v.Args[2] 5504 v.reset(OpARMMOVBstore) 5505 v.AuxInt = off 5506 v.Aux = sym 5507 v.AddArg(ptr) 5508 v.AddArg(x) 5509 v.AddArg(mem) 5510 return true 5511 } 5512 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 5513 // cond: 5514 // result: (MOVBstore [off] {sym} ptr x mem) 5515 for { 5516 off := v.AuxInt 5517 sym := v.Aux 5518 ptr := v.Args[0] 5519 v_1 := v.Args[1] 5520 if v_1.Op != OpARMMOVBUreg { 5521 break 5522 } 5523 x := v_1.Args[0] 5524 mem := v.Args[2] 5525 v.reset(OpARMMOVBstore) 5526 v.AuxInt = off 5527 v.Aux = sym 5528 v.AddArg(ptr) 5529 v.AddArg(x) 5530 v.AddArg(mem) 5531 return true 5532 } 5533 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 5534 // cond: 5535 // result: (MOVBstore [off] {sym} ptr x mem) 5536 for { 5537 off := v.AuxInt 5538 sym := v.Aux 5539 ptr := v.Args[0] 5540 v_1 := v.Args[1] 5541 if v_1.Op != OpARMMOVHreg { 5542 break 5543 } 5544 x := v_1.Args[0] 5545 mem := v.Args[2] 5546 v.reset(OpARMMOVBstore) 5547 v.AuxInt = off 5548 v.Aux = sym 5549 v.AddArg(ptr) 5550 v.AddArg(x) 5551 v.AddArg(mem) 5552 return true 5553 } 5554 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 5555 // cond: 5556 // result: (MOVBstore [off] {sym} ptr x mem) 5557 for { 5558 off := v.AuxInt 5559 sym := v.Aux 5560 ptr := v.Args[0] 5561 v_1 := v.Args[1] 5562 if v_1.Op != OpARMMOVHUreg { 5563 break 5564 } 5565 x := v_1.Args[0] 5566 mem := v.Args[2] 5567 v.reset(OpARMMOVBstore) 5568 v.AuxInt = off 5569 v.Aux = sym 5570 v.AddArg(ptr) 5571 v.AddArg(x) 5572 v.AddArg(mem) 5573 return true 5574 } 5575 return false 5576 } 5577 func rewriteValueARM_OpARMMOVDload(v *Value, config *Config) bool { 5578 b := v.Block 5579 _ = b 5580 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 5581 // cond: 5582 // result: (MOVDload [off1+off2] {sym} ptr mem) 5583 for { 5584 off1 := v.AuxInt 5585 sym := v.Aux 5586 v_0 := v.Args[0] 5587 if v_0.Op != OpARMADDconst { 5588 break 5589 } 5590 off2 := v_0.AuxInt 5591 ptr := v_0.Args[0] 5592 mem := v.Args[1] 5593 v.reset(OpARMMOVDload) 5594 v.AuxInt = off1 + off2 5595 v.Aux = sym 5596 v.AddArg(ptr) 5597 v.AddArg(mem) 5598 return true 5599 } 5600 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5601 // cond: canMergeSym(sym1,sym2) 5602 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5603 for { 5604 off1 := v.AuxInt 5605 sym1 := v.Aux 5606 v_0 := v.Args[0] 5607 if v_0.Op != OpARMMOVWaddr { 5608 break 5609 } 5610 off2 := v_0.AuxInt 5611 sym2 := v_0.Aux 5612 ptr := v_0.Args[0] 5613 mem := v.Args[1] 5614 if !(canMergeSym(sym1, sym2)) { 5615 break 5616 } 5617 v.reset(OpARMMOVDload) 5618 v.AuxInt = off1 + off2 5619 v.Aux = mergeSym(sym1, sym2) 5620 v.AddArg(ptr) 5621 v.AddArg(mem) 5622 return true 5623 } 5624 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 5625 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5626 // result: x 5627 for { 5628 off := v.AuxInt 5629 sym := v.Aux 5630 ptr := v.Args[0] 5631 v_1 := v.Args[1] 5632 if v_1.Op != OpARMMOVDstore { 5633 break 5634 } 5635 off2 := v_1.AuxInt 5636 sym2 := v_1.Aux 5637 ptr2 := v_1.Args[0] 5638 x := v_1.Args[1] 5639 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5640 break 5641 } 5642 v.reset(OpCopy) 5643 v.Type = x.Type 5644 v.AddArg(x) 5645 return true 5646 } 5647 return false 5648 } 5649 func rewriteValueARM_OpARMMOVDstore(v *Value, config *Config) bool { 5650 b := v.Block 5651 _ = b 5652 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5653 // cond: 5654 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 5655 for { 5656 off1 := v.AuxInt 5657 sym := v.Aux 5658 v_0 := v.Args[0] 5659 if v_0.Op != OpARMADDconst { 5660 break 5661 } 5662 off2 := v_0.AuxInt 5663 ptr := v_0.Args[0] 5664 val := v.Args[1] 5665 mem := v.Args[2] 5666 v.reset(OpARMMOVDstore) 5667 v.AuxInt = off1 + off2 5668 v.Aux = sym 5669 v.AddArg(ptr) 5670 v.AddArg(val) 5671 v.AddArg(mem) 5672 return true 5673 } 5674 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5675 // cond: canMergeSym(sym1,sym2) 5676 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5677 for { 5678 off1 := v.AuxInt 5679 sym1 := v.Aux 5680 v_0 := v.Args[0] 5681 if v_0.Op != OpARMMOVWaddr { 5682 break 5683 } 5684 off2 := v_0.AuxInt 5685 sym2 := v_0.Aux 5686 ptr := v_0.Args[0] 5687 val := v.Args[1] 5688 mem := v.Args[2] 5689 if !(canMergeSym(sym1, sym2)) { 5690 break 5691 } 5692 v.reset(OpARMMOVDstore) 5693 v.AuxInt = off1 + off2 5694 v.Aux = mergeSym(sym1, sym2) 5695 v.AddArg(ptr) 5696 v.AddArg(val) 5697 v.AddArg(mem) 5698 return true 5699 } 5700 return false 5701 } 5702 func rewriteValueARM_OpARMMOVFload(v *Value, config *Config) bool { 5703 b := v.Block 5704 _ = b 5705 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 5706 // cond: 5707 // result: (MOVFload [off1+off2] {sym} ptr mem) 5708 for { 5709 off1 := v.AuxInt 5710 sym := v.Aux 5711 v_0 := v.Args[0] 5712 if v_0.Op != OpARMADDconst { 5713 break 5714 } 5715 off2 := v_0.AuxInt 5716 ptr := v_0.Args[0] 5717 mem := v.Args[1] 5718 v.reset(OpARMMOVFload) 5719 v.AuxInt = off1 + off2 5720 v.Aux = sym 5721 v.AddArg(ptr) 5722 v.AddArg(mem) 5723 return true 5724 } 5725 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5726 // cond: canMergeSym(sym1,sym2) 5727 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5728 for { 5729 off1 := v.AuxInt 5730 sym1 := v.Aux 5731 v_0 := v.Args[0] 5732 if v_0.Op != OpARMMOVWaddr { 5733 break 5734 } 5735 off2 := v_0.AuxInt 5736 sym2 := v_0.Aux 5737 ptr := v_0.Args[0] 5738 mem := v.Args[1] 5739 if !(canMergeSym(sym1, sym2)) { 5740 break 5741 } 5742 v.reset(OpARMMOVFload) 5743 v.AuxInt = off1 + off2 5744 v.Aux = mergeSym(sym1, sym2) 5745 v.AddArg(ptr) 5746 v.AddArg(mem) 5747 return true 5748 } 5749 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 5750 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5751 // result: x 5752 for { 5753 off := v.AuxInt 5754 sym := v.Aux 5755 ptr := v.Args[0] 5756 v_1 := v.Args[1] 5757 if v_1.Op != OpARMMOVFstore { 5758 break 5759 } 5760 off2 := v_1.AuxInt 5761 sym2 := v_1.Aux 5762 ptr2 := v_1.Args[0] 5763 x := v_1.Args[1] 5764 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5765 break 5766 } 5767 v.reset(OpCopy) 5768 v.Type = x.Type 5769 v.AddArg(x) 5770 return true 5771 } 5772 return false 5773 } 5774 func rewriteValueARM_OpARMMOVFstore(v *Value, config *Config) bool { 5775 b := v.Block 5776 _ = b 5777 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5778 // cond: 5779 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 5780 for { 5781 off1 := v.AuxInt 5782 sym := v.Aux 5783 v_0 := v.Args[0] 5784 if v_0.Op != OpARMADDconst { 5785 break 5786 } 5787 off2 := v_0.AuxInt 5788 ptr := v_0.Args[0] 5789 val := v.Args[1] 5790 mem := v.Args[2] 5791 v.reset(OpARMMOVFstore) 5792 v.AuxInt = off1 + off2 5793 v.Aux = sym 5794 v.AddArg(ptr) 5795 v.AddArg(val) 5796 v.AddArg(mem) 5797 return true 5798 } 5799 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5800 // cond: canMergeSym(sym1,sym2) 5801 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5802 for { 5803 off1 := v.AuxInt 5804 sym1 := v.Aux 5805 v_0 := v.Args[0] 5806 if v_0.Op != OpARMMOVWaddr { 5807 break 5808 } 5809 off2 := v_0.AuxInt 5810 sym2 := v_0.Aux 5811 ptr := v_0.Args[0] 5812 val := v.Args[1] 5813 mem := v.Args[2] 5814 if !(canMergeSym(sym1, sym2)) { 5815 break 5816 } 5817 v.reset(OpARMMOVFstore) 5818 v.AuxInt = off1 + off2 5819 v.Aux = mergeSym(sym1, sym2) 5820 v.AddArg(ptr) 5821 v.AddArg(val) 5822 v.AddArg(mem) 5823 return true 5824 } 5825 return false 5826 } 5827 func rewriteValueARM_OpARMMOVHUload(v *Value, config *Config) bool { 5828 b := v.Block 5829 _ = b 5830 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 5831 // cond: 5832 // result: (MOVHUload [off1+off2] {sym} ptr mem) 5833 for { 5834 off1 := v.AuxInt 5835 sym := v.Aux 5836 v_0 := v.Args[0] 5837 if v_0.Op != OpARMADDconst { 5838 break 5839 } 5840 off2 := v_0.AuxInt 5841 ptr := v_0.Args[0] 5842 mem := v.Args[1] 5843 v.reset(OpARMMOVHUload) 5844 v.AuxInt = off1 + off2 5845 v.Aux = sym 5846 v.AddArg(ptr) 5847 v.AddArg(mem) 5848 return true 5849 } 5850 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5851 // cond: canMergeSym(sym1,sym2) 5852 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5853 for { 5854 off1 := v.AuxInt 5855 sym1 := v.Aux 5856 v_0 := v.Args[0] 5857 if v_0.Op != OpARMMOVWaddr { 5858 break 5859 } 5860 off2 := v_0.AuxInt 5861 sym2 := v_0.Aux 5862 ptr := v_0.Args[0] 5863 mem := v.Args[1] 5864 if !(canMergeSym(sym1, sym2)) { 5865 break 5866 } 5867 v.reset(OpARMMOVHUload) 5868 v.AuxInt = off1 + off2 5869 v.Aux = mergeSym(sym1, sym2) 5870 v.AddArg(ptr) 5871 v.AddArg(mem) 5872 return true 5873 } 5874 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5875 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type) 5876 // result: x 5877 for { 5878 off := v.AuxInt 5879 sym := v.Aux 5880 ptr := v.Args[0] 5881 v_1 := v.Args[1] 5882 if v_1.Op != OpARMMOVHstore { 5883 break 5884 } 5885 off2 := v_1.AuxInt 5886 sym2 := v_1.Aux 5887 ptr2 := v_1.Args[0] 5888 x := v_1.Args[1] 5889 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type)) { 5890 break 5891 } 5892 v.reset(OpCopy) 5893 v.Type = x.Type 5894 v.AddArg(x) 5895 return true 5896 } 5897 return false 5898 } 5899 func rewriteValueARM_OpARMMOVHUreg(v *Value, config *Config) bool { 5900 b := v.Block 5901 _ = b 5902 // match: (MOVHUreg x:(MOVBUload _ _)) 5903 // cond: 5904 // result: (MOVWreg x) 5905 for { 5906 x := v.Args[0] 5907 if x.Op != OpARMMOVBUload { 5908 break 5909 } 5910 v.reset(OpARMMOVWreg) 5911 v.AddArg(x) 5912 return true 5913 } 5914 // match: (MOVHUreg x:(MOVHUload _ _)) 5915 // cond: 5916 // result: (MOVWreg x) 5917 for { 5918 x := v.Args[0] 5919 if x.Op != OpARMMOVHUload { 5920 break 5921 } 5922 v.reset(OpARMMOVWreg) 5923 v.AddArg(x) 5924 return true 5925 } 5926 // match: (MOVHUreg (ANDconst [c] x)) 5927 // cond: 5928 // result: (ANDconst [c&0xffff] x) 5929 for { 5930 v_0 := v.Args[0] 5931 if v_0.Op != OpARMANDconst { 5932 break 5933 } 5934 c := v_0.AuxInt 5935 x := v_0.Args[0] 5936 v.reset(OpARMANDconst) 5937 v.AuxInt = c & 0xffff 5938 v.AddArg(x) 5939 return true 5940 } 5941 // match: (MOVHUreg x:(MOVBUreg _)) 5942 // cond: 5943 // result: (MOVWreg x) 5944 for { 5945 x := v.Args[0] 5946 if x.Op != OpARMMOVBUreg { 5947 break 5948 } 5949 v.reset(OpARMMOVWreg) 5950 v.AddArg(x) 5951 return true 5952 } 5953 // match: (MOVHUreg x:(MOVHUreg _)) 5954 // cond: 5955 // result: (MOVWreg x) 5956 for { 5957 x := v.Args[0] 5958 if x.Op != OpARMMOVHUreg { 5959 break 5960 } 5961 v.reset(OpARMMOVWreg) 5962 v.AddArg(x) 5963 return true 5964 } 5965 // match: (MOVHUreg (MOVWconst [c])) 5966 // cond: 5967 // result: (MOVWconst [int64(uint16(c))]) 5968 for { 5969 v_0 := v.Args[0] 5970 if v_0.Op != OpARMMOVWconst { 5971 break 5972 } 5973 c := v_0.AuxInt 5974 v.reset(OpARMMOVWconst) 5975 v.AuxInt = int64(uint16(c)) 5976 return true 5977 } 5978 return false 5979 } 5980 func rewriteValueARM_OpARMMOVHload(v *Value, config *Config) bool { 5981 b := v.Block 5982 _ = b 5983 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 5984 // cond: 5985 // result: (MOVHload [off1+off2] {sym} ptr mem) 5986 for { 5987 off1 := v.AuxInt 5988 sym := v.Aux 5989 v_0 := v.Args[0] 5990 if v_0.Op != OpARMADDconst { 5991 break 5992 } 5993 off2 := v_0.AuxInt 5994 ptr := v_0.Args[0] 5995 mem := v.Args[1] 5996 v.reset(OpARMMOVHload) 5997 v.AuxInt = off1 + off2 5998 v.Aux = sym 5999 v.AddArg(ptr) 6000 v.AddArg(mem) 6001 return true 6002 } 6003 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6004 // cond: canMergeSym(sym1,sym2) 6005 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6006 for { 6007 off1 := v.AuxInt 6008 sym1 := v.Aux 6009 v_0 := v.Args[0] 6010 if v_0.Op != OpARMMOVWaddr { 6011 break 6012 } 6013 off2 := v_0.AuxInt 6014 sym2 := v_0.Aux 6015 ptr := v_0.Args[0] 6016 mem := v.Args[1] 6017 if !(canMergeSym(sym1, sym2)) { 6018 break 6019 } 6020 v.reset(OpARMMOVHload) 6021 v.AuxInt = off1 + off2 6022 v.Aux = mergeSym(sym1, sym2) 6023 v.AddArg(ptr) 6024 v.AddArg(mem) 6025 return true 6026 } 6027 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 6028 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type) 6029 // result: x 6030 for { 6031 off := v.AuxInt 6032 sym := v.Aux 6033 ptr := v.Args[0] 6034 v_1 := v.Args[1] 6035 if v_1.Op != OpARMMOVHstore { 6036 break 6037 } 6038 off2 := v_1.AuxInt 6039 sym2 := v_1.Aux 6040 ptr2 := v_1.Args[0] 6041 x := v_1.Args[1] 6042 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type)) { 6043 break 6044 } 6045 v.reset(OpCopy) 6046 v.Type = x.Type 6047 v.AddArg(x) 6048 return true 6049 } 6050 return false 6051 } 6052 func rewriteValueARM_OpARMMOVHreg(v *Value, config *Config) bool { 6053 b := v.Block 6054 _ = b 6055 // match: (MOVHreg x:(MOVBload _ _)) 6056 // cond: 6057 // result: (MOVWreg x) 6058 for { 6059 x := v.Args[0] 6060 if x.Op != OpARMMOVBload { 6061 break 6062 } 6063 v.reset(OpARMMOVWreg) 6064 v.AddArg(x) 6065 return true 6066 } 6067 // match: (MOVHreg x:(MOVBUload _ _)) 6068 // cond: 6069 // result: (MOVWreg x) 6070 for { 6071 x := v.Args[0] 6072 if x.Op != OpARMMOVBUload { 6073 break 6074 } 6075 v.reset(OpARMMOVWreg) 6076 v.AddArg(x) 6077 return true 6078 } 6079 // match: (MOVHreg x:(MOVHload _ _)) 6080 // cond: 6081 // result: (MOVWreg x) 6082 for { 6083 x := v.Args[0] 6084 if x.Op != OpARMMOVHload { 6085 break 6086 } 6087 v.reset(OpARMMOVWreg) 6088 v.AddArg(x) 6089 return true 6090 } 6091 // match: (MOVHreg (ANDconst [c] x)) 6092 // cond: c & 0x8000 == 0 6093 // result: (ANDconst [c&0x7fff] x) 6094 for { 6095 v_0 := v.Args[0] 6096 if v_0.Op != OpARMANDconst { 6097 break 6098 } 6099 c := v_0.AuxInt 6100 x := v_0.Args[0] 6101 if !(c&0x8000 == 0) { 6102 break 6103 } 6104 v.reset(OpARMANDconst) 6105 v.AuxInt = c & 0x7fff 6106 v.AddArg(x) 6107 return true 6108 } 6109 // match: (MOVHreg x:(MOVBreg _)) 6110 // cond: 6111 // result: (MOVWreg x) 6112 for { 6113 x := v.Args[0] 6114 if x.Op != OpARMMOVBreg { 6115 break 6116 } 6117 v.reset(OpARMMOVWreg) 6118 v.AddArg(x) 6119 return true 6120 } 6121 // match: (MOVHreg x:(MOVBUreg _)) 6122 // cond: 6123 // result: (MOVWreg x) 6124 for { 6125 x := v.Args[0] 6126 if x.Op != OpARMMOVBUreg { 6127 break 6128 } 6129 v.reset(OpARMMOVWreg) 6130 v.AddArg(x) 6131 return true 6132 } 6133 // match: (MOVHreg x:(MOVHreg _)) 6134 // cond: 6135 // result: (MOVWreg x) 6136 for { 6137 x := v.Args[0] 6138 if x.Op != OpARMMOVHreg { 6139 break 6140 } 6141 v.reset(OpARMMOVWreg) 6142 v.AddArg(x) 6143 return true 6144 } 6145 // match: (MOVHreg (MOVWconst [c])) 6146 // cond: 6147 // result: (MOVWconst [int64(int16(c))]) 6148 for { 6149 v_0 := v.Args[0] 6150 if v_0.Op != OpARMMOVWconst { 6151 break 6152 } 6153 c := v_0.AuxInt 6154 v.reset(OpARMMOVWconst) 6155 v.AuxInt = int64(int16(c)) 6156 return true 6157 } 6158 return false 6159 } 6160 func rewriteValueARM_OpARMMOVHstore(v *Value, config *Config) bool { 6161 b := v.Block 6162 _ = b 6163 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6164 // cond: 6165 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 6166 for { 6167 off1 := v.AuxInt 6168 sym := v.Aux 6169 v_0 := v.Args[0] 6170 if v_0.Op != OpARMADDconst { 6171 break 6172 } 6173 off2 := v_0.AuxInt 6174 ptr := v_0.Args[0] 6175 val := v.Args[1] 6176 mem := v.Args[2] 6177 v.reset(OpARMMOVHstore) 6178 v.AuxInt = off1 + off2 6179 v.Aux = sym 6180 v.AddArg(ptr) 6181 v.AddArg(val) 6182 v.AddArg(mem) 6183 return true 6184 } 6185 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6186 // cond: canMergeSym(sym1,sym2) 6187 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6188 for { 6189 off1 := v.AuxInt 6190 sym1 := v.Aux 6191 v_0 := v.Args[0] 6192 if v_0.Op != OpARMMOVWaddr { 6193 break 6194 } 6195 off2 := v_0.AuxInt 6196 sym2 := v_0.Aux 6197 ptr := v_0.Args[0] 6198 val := v.Args[1] 6199 mem := v.Args[2] 6200 if !(canMergeSym(sym1, sym2)) { 6201 break 6202 } 6203 v.reset(OpARMMOVHstore) 6204 v.AuxInt = off1 + off2 6205 v.Aux = mergeSym(sym1, sym2) 6206 v.AddArg(ptr) 6207 v.AddArg(val) 6208 v.AddArg(mem) 6209 return true 6210 } 6211 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 6212 // cond: 6213 // result: (MOVHstore [off] {sym} ptr x mem) 6214 for { 6215 off := v.AuxInt 6216 sym := v.Aux 6217 ptr := v.Args[0] 6218 v_1 := v.Args[1] 6219 if v_1.Op != OpARMMOVHreg { 6220 break 6221 } 6222 x := v_1.Args[0] 6223 mem := v.Args[2] 6224 v.reset(OpARMMOVHstore) 6225 v.AuxInt = off 6226 v.Aux = sym 6227 v.AddArg(ptr) 6228 v.AddArg(x) 6229 v.AddArg(mem) 6230 return true 6231 } 6232 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 6233 // cond: 6234 // result: (MOVHstore [off] {sym} ptr x mem) 6235 for { 6236 off := v.AuxInt 6237 sym := v.Aux 6238 ptr := v.Args[0] 6239 v_1 := v.Args[1] 6240 if v_1.Op != OpARMMOVHUreg { 6241 break 6242 } 6243 x := v_1.Args[0] 6244 mem := v.Args[2] 6245 v.reset(OpARMMOVHstore) 6246 v.AuxInt = off 6247 v.Aux = sym 6248 v.AddArg(ptr) 6249 v.AddArg(x) 6250 v.AddArg(mem) 6251 return true 6252 } 6253 return false 6254 } 6255 func rewriteValueARM_OpARMMOVWload(v *Value, config *Config) bool { 6256 b := v.Block 6257 _ = b 6258 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 6259 // cond: 6260 // result: (MOVWload [off1+off2] {sym} ptr mem) 6261 for { 6262 off1 := v.AuxInt 6263 sym := v.Aux 6264 v_0 := v.Args[0] 6265 if v_0.Op != OpARMADDconst { 6266 break 6267 } 6268 off2 := v_0.AuxInt 6269 ptr := v_0.Args[0] 6270 mem := v.Args[1] 6271 v.reset(OpARMMOVWload) 6272 v.AuxInt = off1 + off2 6273 v.Aux = sym 6274 v.AddArg(ptr) 6275 v.AddArg(mem) 6276 return true 6277 } 6278 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6279 // cond: canMergeSym(sym1,sym2) 6280 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6281 for { 6282 off1 := v.AuxInt 6283 sym1 := v.Aux 6284 v_0 := v.Args[0] 6285 if v_0.Op != OpARMMOVWaddr { 6286 break 6287 } 6288 off2 := v_0.AuxInt 6289 sym2 := v_0.Aux 6290 ptr := v_0.Args[0] 6291 mem := v.Args[1] 6292 if !(canMergeSym(sym1, sym2)) { 6293 break 6294 } 6295 v.reset(OpARMMOVWload) 6296 v.AuxInt = off1 + off2 6297 v.Aux = mergeSym(sym1, sym2) 6298 v.AddArg(ptr) 6299 v.AddArg(mem) 6300 return true 6301 } 6302 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6303 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6304 // result: x 6305 for { 6306 off := v.AuxInt 6307 sym := v.Aux 6308 ptr := v.Args[0] 6309 v_1 := v.Args[1] 6310 if v_1.Op != OpARMMOVWstore { 6311 break 6312 } 6313 off2 := v_1.AuxInt 6314 sym2 := v_1.Aux 6315 ptr2 := v_1.Args[0] 6316 x := v_1.Args[1] 6317 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6318 break 6319 } 6320 v.reset(OpCopy) 6321 v.Type = x.Type 6322 v.AddArg(x) 6323 return true 6324 } 6325 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 6326 // cond: sym == nil && !config.nacl 6327 // result: (MOVWloadidx ptr idx mem) 6328 for { 6329 if v.AuxInt != 0 { 6330 break 6331 } 6332 sym := v.Aux 6333 v_0 := v.Args[0] 6334 if v_0.Op != OpARMADD { 6335 break 6336 } 6337 ptr := v_0.Args[0] 6338 idx := v_0.Args[1] 6339 mem := v.Args[1] 6340 if !(sym == nil && !config.nacl) { 6341 break 6342 } 6343 v.reset(OpARMMOVWloadidx) 6344 v.AddArg(ptr) 6345 v.AddArg(idx) 6346 v.AddArg(mem) 6347 return true 6348 } 6349 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 6350 // cond: sym == nil && !config.nacl 6351 // result: (MOVWloadshiftLL ptr idx [c] mem) 6352 for { 6353 if v.AuxInt != 0 { 6354 break 6355 } 6356 sym := v.Aux 6357 v_0 := v.Args[0] 6358 if v_0.Op != OpARMADDshiftLL { 6359 break 6360 } 6361 c := v_0.AuxInt 6362 ptr := v_0.Args[0] 6363 idx := v_0.Args[1] 6364 mem := v.Args[1] 6365 if !(sym == nil && !config.nacl) { 6366 break 6367 } 6368 v.reset(OpARMMOVWloadshiftLL) 6369 v.AuxInt = c 6370 v.AddArg(ptr) 6371 v.AddArg(idx) 6372 v.AddArg(mem) 6373 return true 6374 } 6375 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 6376 // cond: sym == nil && !config.nacl 6377 // result: (MOVWloadshiftRL ptr idx [c] mem) 6378 for { 6379 if v.AuxInt != 0 { 6380 break 6381 } 6382 sym := v.Aux 6383 v_0 := v.Args[0] 6384 if v_0.Op != OpARMADDshiftRL { 6385 break 6386 } 6387 c := v_0.AuxInt 6388 ptr := v_0.Args[0] 6389 idx := v_0.Args[1] 6390 mem := v.Args[1] 6391 if !(sym == nil && !config.nacl) { 6392 break 6393 } 6394 v.reset(OpARMMOVWloadshiftRL) 6395 v.AuxInt = c 6396 v.AddArg(ptr) 6397 v.AddArg(idx) 6398 v.AddArg(mem) 6399 return true 6400 } 6401 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 6402 // cond: sym == nil && !config.nacl 6403 // result: (MOVWloadshiftRA ptr idx [c] mem) 6404 for { 6405 if v.AuxInt != 0 { 6406 break 6407 } 6408 sym := v.Aux 6409 v_0 := v.Args[0] 6410 if v_0.Op != OpARMADDshiftRA { 6411 break 6412 } 6413 c := v_0.AuxInt 6414 ptr := v_0.Args[0] 6415 idx := v_0.Args[1] 6416 mem := v.Args[1] 6417 if !(sym == nil && !config.nacl) { 6418 break 6419 } 6420 v.reset(OpARMMOVWloadshiftRA) 6421 v.AuxInt = c 6422 v.AddArg(ptr) 6423 v.AddArg(idx) 6424 v.AddArg(mem) 6425 return true 6426 } 6427 return false 6428 } 6429 func rewriteValueARM_OpARMMOVWloadidx(v *Value, config *Config) bool { 6430 b := v.Block 6431 _ = b 6432 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 6433 // cond: isSamePtr(ptr, ptr2) 6434 // result: x 6435 for { 6436 ptr := v.Args[0] 6437 idx := v.Args[1] 6438 v_2 := v.Args[2] 6439 if v_2.Op != OpARMMOVWstoreidx { 6440 break 6441 } 6442 ptr2 := v_2.Args[0] 6443 if idx != v_2.Args[1] { 6444 break 6445 } 6446 x := v_2.Args[2] 6447 if !(isSamePtr(ptr, ptr2)) { 6448 break 6449 } 6450 v.reset(OpCopy) 6451 v.Type = x.Type 6452 v.AddArg(x) 6453 return true 6454 } 6455 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 6456 // cond: 6457 // result: (MOVWload [c] ptr mem) 6458 for { 6459 ptr := v.Args[0] 6460 v_1 := v.Args[1] 6461 if v_1.Op != OpARMMOVWconst { 6462 break 6463 } 6464 c := v_1.AuxInt 6465 mem := v.Args[2] 6466 v.reset(OpARMMOVWload) 6467 v.AuxInt = c 6468 v.AddArg(ptr) 6469 v.AddArg(mem) 6470 return true 6471 } 6472 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 6473 // cond: 6474 // result: (MOVWload [c] ptr mem) 6475 for { 6476 v_0 := v.Args[0] 6477 if v_0.Op != OpARMMOVWconst { 6478 break 6479 } 6480 c := v_0.AuxInt 6481 ptr := v.Args[1] 6482 mem := v.Args[2] 6483 v.reset(OpARMMOVWload) 6484 v.AuxInt = c 6485 v.AddArg(ptr) 6486 v.AddArg(mem) 6487 return true 6488 } 6489 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 6490 // cond: 6491 // result: (MOVWloadshiftLL ptr idx [c] mem) 6492 for { 6493 ptr := v.Args[0] 6494 v_1 := v.Args[1] 6495 if v_1.Op != OpARMSLLconst { 6496 break 6497 } 6498 c := v_1.AuxInt 6499 idx := v_1.Args[0] 6500 mem := v.Args[2] 6501 v.reset(OpARMMOVWloadshiftLL) 6502 v.AuxInt = c 6503 v.AddArg(ptr) 6504 v.AddArg(idx) 6505 v.AddArg(mem) 6506 return true 6507 } 6508 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 6509 // cond: 6510 // result: (MOVWloadshiftLL ptr idx [c] mem) 6511 for { 6512 v_0 := v.Args[0] 6513 if v_0.Op != OpARMSLLconst { 6514 break 6515 } 6516 c := v_0.AuxInt 6517 idx := v_0.Args[0] 6518 ptr := v.Args[1] 6519 mem := v.Args[2] 6520 v.reset(OpARMMOVWloadshiftLL) 6521 v.AuxInt = c 6522 v.AddArg(ptr) 6523 v.AddArg(idx) 6524 v.AddArg(mem) 6525 return true 6526 } 6527 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 6528 // cond: 6529 // result: (MOVWloadshiftRL ptr idx [c] mem) 6530 for { 6531 ptr := v.Args[0] 6532 v_1 := v.Args[1] 6533 if v_1.Op != OpARMSRLconst { 6534 break 6535 } 6536 c := v_1.AuxInt 6537 idx := v_1.Args[0] 6538 mem := v.Args[2] 6539 v.reset(OpARMMOVWloadshiftRL) 6540 v.AuxInt = c 6541 v.AddArg(ptr) 6542 v.AddArg(idx) 6543 v.AddArg(mem) 6544 return true 6545 } 6546 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 6547 // cond: 6548 // result: (MOVWloadshiftRL ptr idx [c] mem) 6549 for { 6550 v_0 := v.Args[0] 6551 if v_0.Op != OpARMSRLconst { 6552 break 6553 } 6554 c := v_0.AuxInt 6555 idx := v_0.Args[0] 6556 ptr := v.Args[1] 6557 mem := v.Args[2] 6558 v.reset(OpARMMOVWloadshiftRL) 6559 v.AuxInt = c 6560 v.AddArg(ptr) 6561 v.AddArg(idx) 6562 v.AddArg(mem) 6563 return true 6564 } 6565 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 6566 // cond: 6567 // result: (MOVWloadshiftRA ptr idx [c] mem) 6568 for { 6569 ptr := v.Args[0] 6570 v_1 := v.Args[1] 6571 if v_1.Op != OpARMSRAconst { 6572 break 6573 } 6574 c := v_1.AuxInt 6575 idx := v_1.Args[0] 6576 mem := v.Args[2] 6577 v.reset(OpARMMOVWloadshiftRA) 6578 v.AuxInt = c 6579 v.AddArg(ptr) 6580 v.AddArg(idx) 6581 v.AddArg(mem) 6582 return true 6583 } 6584 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 6585 // cond: 6586 // result: (MOVWloadshiftRA ptr idx [c] mem) 6587 for { 6588 v_0 := v.Args[0] 6589 if v_0.Op != OpARMSRAconst { 6590 break 6591 } 6592 c := v_0.AuxInt 6593 idx := v_0.Args[0] 6594 ptr := v.Args[1] 6595 mem := v.Args[2] 6596 v.reset(OpARMMOVWloadshiftRA) 6597 v.AuxInt = c 6598 v.AddArg(ptr) 6599 v.AddArg(idx) 6600 v.AddArg(mem) 6601 return true 6602 } 6603 return false 6604 } 6605 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value, config *Config) bool { 6606 b := v.Block 6607 _ = b 6608 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 6609 // cond: c==d && isSamePtr(ptr, ptr2) 6610 // result: x 6611 for { 6612 c := v.AuxInt 6613 ptr := v.Args[0] 6614 idx := v.Args[1] 6615 v_2 := v.Args[2] 6616 if v_2.Op != OpARMMOVWstoreshiftLL { 6617 break 6618 } 6619 d := v_2.AuxInt 6620 ptr2 := v_2.Args[0] 6621 if idx != v_2.Args[1] { 6622 break 6623 } 6624 x := v_2.Args[2] 6625 if !(c == d && isSamePtr(ptr, ptr2)) { 6626 break 6627 } 6628 v.reset(OpCopy) 6629 v.Type = x.Type 6630 v.AddArg(x) 6631 return true 6632 } 6633 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 6634 // cond: 6635 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 6636 for { 6637 d := v.AuxInt 6638 ptr := v.Args[0] 6639 v_1 := v.Args[1] 6640 if v_1.Op != OpARMMOVWconst { 6641 break 6642 } 6643 c := v_1.AuxInt 6644 mem := v.Args[2] 6645 v.reset(OpARMMOVWload) 6646 v.AuxInt = int64(uint32(c) << uint64(d)) 6647 v.AddArg(ptr) 6648 v.AddArg(mem) 6649 return true 6650 } 6651 return false 6652 } 6653 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value, config *Config) bool { 6654 b := v.Block 6655 _ = b 6656 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 6657 // cond: c==d && isSamePtr(ptr, ptr2) 6658 // result: x 6659 for { 6660 c := v.AuxInt 6661 ptr := v.Args[0] 6662 idx := v.Args[1] 6663 v_2 := v.Args[2] 6664 if v_2.Op != OpARMMOVWstoreshiftRA { 6665 break 6666 } 6667 d := v_2.AuxInt 6668 ptr2 := v_2.Args[0] 6669 if idx != v_2.Args[1] { 6670 break 6671 } 6672 x := v_2.Args[2] 6673 if !(c == d && 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: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 6682 // cond: 6683 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 6684 for { 6685 d := v.AuxInt 6686 ptr := v.Args[0] 6687 v_1 := v.Args[1] 6688 if v_1.Op != OpARMMOVWconst { 6689 break 6690 } 6691 c := v_1.AuxInt 6692 mem := v.Args[2] 6693 v.reset(OpARMMOVWload) 6694 v.AuxInt = int64(int32(c) >> uint64(d)) 6695 v.AddArg(ptr) 6696 v.AddArg(mem) 6697 return true 6698 } 6699 return false 6700 } 6701 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value, config *Config) bool { 6702 b := v.Block 6703 _ = b 6704 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 6705 // cond: c==d && isSamePtr(ptr, ptr2) 6706 // result: x 6707 for { 6708 c := v.AuxInt 6709 ptr := v.Args[0] 6710 idx := v.Args[1] 6711 v_2 := v.Args[2] 6712 if v_2.Op != OpARMMOVWstoreshiftRL { 6713 break 6714 } 6715 d := v_2.AuxInt 6716 ptr2 := v_2.Args[0] 6717 if idx != v_2.Args[1] { 6718 break 6719 } 6720 x := v_2.Args[2] 6721 if !(c == d && isSamePtr(ptr, ptr2)) { 6722 break 6723 } 6724 v.reset(OpCopy) 6725 v.Type = x.Type 6726 v.AddArg(x) 6727 return true 6728 } 6729 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 6730 // cond: 6731 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 6732 for { 6733 d := v.AuxInt 6734 ptr := v.Args[0] 6735 v_1 := v.Args[1] 6736 if v_1.Op != OpARMMOVWconst { 6737 break 6738 } 6739 c := v_1.AuxInt 6740 mem := v.Args[2] 6741 v.reset(OpARMMOVWload) 6742 v.AuxInt = int64(uint32(c) >> uint64(d)) 6743 v.AddArg(ptr) 6744 v.AddArg(mem) 6745 return true 6746 } 6747 return false 6748 } 6749 func rewriteValueARM_OpARMMOVWreg(v *Value, config *Config) bool { 6750 b := v.Block 6751 _ = b 6752 // match: (MOVWreg x) 6753 // cond: x.Uses == 1 6754 // result: (MOVWnop x) 6755 for { 6756 x := v.Args[0] 6757 if !(x.Uses == 1) { 6758 break 6759 } 6760 v.reset(OpARMMOVWnop) 6761 v.AddArg(x) 6762 return true 6763 } 6764 // match: (MOVWreg (MOVWconst [c])) 6765 // cond: 6766 // result: (MOVWconst [c]) 6767 for { 6768 v_0 := v.Args[0] 6769 if v_0.Op != OpARMMOVWconst { 6770 break 6771 } 6772 c := v_0.AuxInt 6773 v.reset(OpARMMOVWconst) 6774 v.AuxInt = c 6775 return true 6776 } 6777 return false 6778 } 6779 func rewriteValueARM_OpARMMOVWstore(v *Value, config *Config) bool { 6780 b := v.Block 6781 _ = b 6782 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6783 // cond: 6784 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6785 for { 6786 off1 := v.AuxInt 6787 sym := v.Aux 6788 v_0 := v.Args[0] 6789 if v_0.Op != OpARMADDconst { 6790 break 6791 } 6792 off2 := v_0.AuxInt 6793 ptr := v_0.Args[0] 6794 val := v.Args[1] 6795 mem := v.Args[2] 6796 v.reset(OpARMMOVWstore) 6797 v.AuxInt = off1 + off2 6798 v.Aux = sym 6799 v.AddArg(ptr) 6800 v.AddArg(val) 6801 v.AddArg(mem) 6802 return true 6803 } 6804 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6805 // cond: canMergeSym(sym1,sym2) 6806 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6807 for { 6808 off1 := v.AuxInt 6809 sym1 := v.Aux 6810 v_0 := v.Args[0] 6811 if v_0.Op != OpARMMOVWaddr { 6812 break 6813 } 6814 off2 := v_0.AuxInt 6815 sym2 := v_0.Aux 6816 ptr := v_0.Args[0] 6817 val := v.Args[1] 6818 mem := v.Args[2] 6819 if !(canMergeSym(sym1, sym2)) { 6820 break 6821 } 6822 v.reset(OpARMMOVWstore) 6823 v.AuxInt = off1 + off2 6824 v.Aux = mergeSym(sym1, sym2) 6825 v.AddArg(ptr) 6826 v.AddArg(val) 6827 v.AddArg(mem) 6828 return true 6829 } 6830 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 6831 // cond: sym == nil && !config.nacl 6832 // result: (MOVWstoreidx ptr idx val mem) 6833 for { 6834 if v.AuxInt != 0 { 6835 break 6836 } 6837 sym := v.Aux 6838 v_0 := v.Args[0] 6839 if v_0.Op != OpARMADD { 6840 break 6841 } 6842 ptr := v_0.Args[0] 6843 idx := v_0.Args[1] 6844 val := v.Args[1] 6845 mem := v.Args[2] 6846 if !(sym == nil && !config.nacl) { 6847 break 6848 } 6849 v.reset(OpARMMOVWstoreidx) 6850 v.AddArg(ptr) 6851 v.AddArg(idx) 6852 v.AddArg(val) 6853 v.AddArg(mem) 6854 return true 6855 } 6856 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 6857 // cond: sym == nil && !config.nacl 6858 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6859 for { 6860 if v.AuxInt != 0 { 6861 break 6862 } 6863 sym := v.Aux 6864 v_0 := v.Args[0] 6865 if v_0.Op != OpARMADDshiftLL { 6866 break 6867 } 6868 c := v_0.AuxInt 6869 ptr := v_0.Args[0] 6870 idx := v_0.Args[1] 6871 val := v.Args[1] 6872 mem := v.Args[2] 6873 if !(sym == nil && !config.nacl) { 6874 break 6875 } 6876 v.reset(OpARMMOVWstoreshiftLL) 6877 v.AuxInt = c 6878 v.AddArg(ptr) 6879 v.AddArg(idx) 6880 v.AddArg(val) 6881 v.AddArg(mem) 6882 return true 6883 } 6884 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 6885 // cond: sym == nil && !config.nacl 6886 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6887 for { 6888 if v.AuxInt != 0 { 6889 break 6890 } 6891 sym := v.Aux 6892 v_0 := v.Args[0] 6893 if v_0.Op != OpARMADDshiftRL { 6894 break 6895 } 6896 c := v_0.AuxInt 6897 ptr := v_0.Args[0] 6898 idx := v_0.Args[1] 6899 val := v.Args[1] 6900 mem := v.Args[2] 6901 if !(sym == nil && !config.nacl) { 6902 break 6903 } 6904 v.reset(OpARMMOVWstoreshiftRL) 6905 v.AuxInt = c 6906 v.AddArg(ptr) 6907 v.AddArg(idx) 6908 v.AddArg(val) 6909 v.AddArg(mem) 6910 return true 6911 } 6912 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 6913 // cond: sym == nil && !config.nacl 6914 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6915 for { 6916 if v.AuxInt != 0 { 6917 break 6918 } 6919 sym := v.Aux 6920 v_0 := v.Args[0] 6921 if v_0.Op != OpARMADDshiftRA { 6922 break 6923 } 6924 c := v_0.AuxInt 6925 ptr := v_0.Args[0] 6926 idx := v_0.Args[1] 6927 val := v.Args[1] 6928 mem := v.Args[2] 6929 if !(sym == nil && !config.nacl) { 6930 break 6931 } 6932 v.reset(OpARMMOVWstoreshiftRA) 6933 v.AuxInt = c 6934 v.AddArg(ptr) 6935 v.AddArg(idx) 6936 v.AddArg(val) 6937 v.AddArg(mem) 6938 return true 6939 } 6940 return false 6941 } 6942 func rewriteValueARM_OpARMMOVWstoreidx(v *Value, config *Config) bool { 6943 b := v.Block 6944 _ = b 6945 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 6946 // cond: 6947 // result: (MOVWstore [c] ptr val mem) 6948 for { 6949 ptr := v.Args[0] 6950 v_1 := v.Args[1] 6951 if v_1.Op != OpARMMOVWconst { 6952 break 6953 } 6954 c := v_1.AuxInt 6955 val := v.Args[2] 6956 mem := v.Args[3] 6957 v.reset(OpARMMOVWstore) 6958 v.AuxInt = c 6959 v.AddArg(ptr) 6960 v.AddArg(val) 6961 v.AddArg(mem) 6962 return true 6963 } 6964 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 6965 // cond: 6966 // result: (MOVWstore [c] ptr val mem) 6967 for { 6968 v_0 := v.Args[0] 6969 if v_0.Op != OpARMMOVWconst { 6970 break 6971 } 6972 c := v_0.AuxInt 6973 ptr := v.Args[1] 6974 val := v.Args[2] 6975 mem := v.Args[3] 6976 v.reset(OpARMMOVWstore) 6977 v.AuxInt = c 6978 v.AddArg(ptr) 6979 v.AddArg(val) 6980 v.AddArg(mem) 6981 return true 6982 } 6983 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 6984 // cond: 6985 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6986 for { 6987 ptr := v.Args[0] 6988 v_1 := v.Args[1] 6989 if v_1.Op != OpARMSLLconst { 6990 break 6991 } 6992 c := v_1.AuxInt 6993 idx := v_1.Args[0] 6994 val := v.Args[2] 6995 mem := v.Args[3] 6996 v.reset(OpARMMOVWstoreshiftLL) 6997 v.AuxInt = c 6998 v.AddArg(ptr) 6999 v.AddArg(idx) 7000 v.AddArg(val) 7001 v.AddArg(mem) 7002 return true 7003 } 7004 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 7005 // cond: 7006 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7007 for { 7008 v_0 := v.Args[0] 7009 if v_0.Op != OpARMSLLconst { 7010 break 7011 } 7012 c := v_0.AuxInt 7013 idx := v_0.Args[0] 7014 ptr := v.Args[1] 7015 val := v.Args[2] 7016 mem := v.Args[3] 7017 v.reset(OpARMMOVWstoreshiftLL) 7018 v.AuxInt = c 7019 v.AddArg(ptr) 7020 v.AddArg(idx) 7021 v.AddArg(val) 7022 v.AddArg(mem) 7023 return true 7024 } 7025 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 7026 // cond: 7027 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7028 for { 7029 ptr := v.Args[0] 7030 v_1 := v.Args[1] 7031 if v_1.Op != OpARMSRLconst { 7032 break 7033 } 7034 c := v_1.AuxInt 7035 idx := v_1.Args[0] 7036 val := v.Args[2] 7037 mem := v.Args[3] 7038 v.reset(OpARMMOVWstoreshiftRL) 7039 v.AuxInt = c 7040 v.AddArg(ptr) 7041 v.AddArg(idx) 7042 v.AddArg(val) 7043 v.AddArg(mem) 7044 return true 7045 } 7046 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 7047 // cond: 7048 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7049 for { 7050 v_0 := v.Args[0] 7051 if v_0.Op != OpARMSRLconst { 7052 break 7053 } 7054 c := v_0.AuxInt 7055 idx := v_0.Args[0] 7056 ptr := v.Args[1] 7057 val := v.Args[2] 7058 mem := v.Args[3] 7059 v.reset(OpARMMOVWstoreshiftRL) 7060 v.AuxInt = c 7061 v.AddArg(ptr) 7062 v.AddArg(idx) 7063 v.AddArg(val) 7064 v.AddArg(mem) 7065 return true 7066 } 7067 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 7068 // cond: 7069 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7070 for { 7071 ptr := v.Args[0] 7072 v_1 := v.Args[1] 7073 if v_1.Op != OpARMSRAconst { 7074 break 7075 } 7076 c := v_1.AuxInt 7077 idx := v_1.Args[0] 7078 val := v.Args[2] 7079 mem := v.Args[3] 7080 v.reset(OpARMMOVWstoreshiftRA) 7081 v.AuxInt = c 7082 v.AddArg(ptr) 7083 v.AddArg(idx) 7084 v.AddArg(val) 7085 v.AddArg(mem) 7086 return true 7087 } 7088 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 7089 // cond: 7090 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7091 for { 7092 v_0 := v.Args[0] 7093 if v_0.Op != OpARMSRAconst { 7094 break 7095 } 7096 c := v_0.AuxInt 7097 idx := v_0.Args[0] 7098 ptr := v.Args[1] 7099 val := v.Args[2] 7100 mem := v.Args[3] 7101 v.reset(OpARMMOVWstoreshiftRA) 7102 v.AuxInt = c 7103 v.AddArg(ptr) 7104 v.AddArg(idx) 7105 v.AddArg(val) 7106 v.AddArg(mem) 7107 return true 7108 } 7109 return false 7110 } 7111 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value, config *Config) bool { 7112 b := v.Block 7113 _ = b 7114 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 7115 // cond: 7116 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 7117 for { 7118 d := v.AuxInt 7119 ptr := v.Args[0] 7120 v_1 := v.Args[1] 7121 if v_1.Op != OpARMMOVWconst { 7122 break 7123 } 7124 c := v_1.AuxInt 7125 val := v.Args[2] 7126 mem := v.Args[3] 7127 v.reset(OpARMMOVWstore) 7128 v.AuxInt = int64(uint32(c) << uint64(d)) 7129 v.AddArg(ptr) 7130 v.AddArg(val) 7131 v.AddArg(mem) 7132 return true 7133 } 7134 return false 7135 } 7136 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value, config *Config) bool { 7137 b := v.Block 7138 _ = b 7139 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 7140 // cond: 7141 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 7142 for { 7143 d := v.AuxInt 7144 ptr := v.Args[0] 7145 v_1 := v.Args[1] 7146 if v_1.Op != OpARMMOVWconst { 7147 break 7148 } 7149 c := v_1.AuxInt 7150 val := v.Args[2] 7151 mem := v.Args[3] 7152 v.reset(OpARMMOVWstore) 7153 v.AuxInt = int64(int32(c) >> uint64(d)) 7154 v.AddArg(ptr) 7155 v.AddArg(val) 7156 v.AddArg(mem) 7157 return true 7158 } 7159 return false 7160 } 7161 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value, config *Config) bool { 7162 b := v.Block 7163 _ = b 7164 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 7165 // cond: 7166 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 7167 for { 7168 d := v.AuxInt 7169 ptr := v.Args[0] 7170 v_1 := v.Args[1] 7171 if v_1.Op != OpARMMOVWconst { 7172 break 7173 } 7174 c := v_1.AuxInt 7175 val := v.Args[2] 7176 mem := v.Args[3] 7177 v.reset(OpARMMOVWstore) 7178 v.AuxInt = int64(uint32(c) >> uint64(d)) 7179 v.AddArg(ptr) 7180 v.AddArg(val) 7181 v.AddArg(mem) 7182 return true 7183 } 7184 return false 7185 } 7186 func rewriteValueARM_OpARMMUL(v *Value, config *Config) bool { 7187 b := v.Block 7188 _ = b 7189 // match: (MUL x (MOVWconst [c])) 7190 // cond: int32(c) == -1 7191 // result: (RSBconst [0] x) 7192 for { 7193 x := v.Args[0] 7194 v_1 := v.Args[1] 7195 if v_1.Op != OpARMMOVWconst { 7196 break 7197 } 7198 c := v_1.AuxInt 7199 if !(int32(c) == -1) { 7200 break 7201 } 7202 v.reset(OpARMRSBconst) 7203 v.AuxInt = 0 7204 v.AddArg(x) 7205 return true 7206 } 7207 // match: (MUL _ (MOVWconst [0])) 7208 // cond: 7209 // result: (MOVWconst [0]) 7210 for { 7211 v_1 := v.Args[1] 7212 if v_1.Op != OpARMMOVWconst { 7213 break 7214 } 7215 if v_1.AuxInt != 0 { 7216 break 7217 } 7218 v.reset(OpARMMOVWconst) 7219 v.AuxInt = 0 7220 return true 7221 } 7222 // match: (MUL x (MOVWconst [1])) 7223 // cond: 7224 // result: x 7225 for { 7226 x := v.Args[0] 7227 v_1 := v.Args[1] 7228 if v_1.Op != OpARMMOVWconst { 7229 break 7230 } 7231 if v_1.AuxInt != 1 { 7232 break 7233 } 7234 v.reset(OpCopy) 7235 v.Type = x.Type 7236 v.AddArg(x) 7237 return true 7238 } 7239 // match: (MUL x (MOVWconst [c])) 7240 // cond: isPowerOfTwo(c) 7241 // result: (SLLconst [log2(c)] x) 7242 for { 7243 x := v.Args[0] 7244 v_1 := v.Args[1] 7245 if v_1.Op != OpARMMOVWconst { 7246 break 7247 } 7248 c := v_1.AuxInt 7249 if !(isPowerOfTwo(c)) { 7250 break 7251 } 7252 v.reset(OpARMSLLconst) 7253 v.AuxInt = log2(c) 7254 v.AddArg(x) 7255 return true 7256 } 7257 // match: (MUL x (MOVWconst [c])) 7258 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7259 // result: (ADDshiftLL x x [log2(c-1)]) 7260 for { 7261 x := v.Args[0] 7262 v_1 := v.Args[1] 7263 if v_1.Op != OpARMMOVWconst { 7264 break 7265 } 7266 c := v_1.AuxInt 7267 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7268 break 7269 } 7270 v.reset(OpARMADDshiftLL) 7271 v.AuxInt = log2(c - 1) 7272 v.AddArg(x) 7273 v.AddArg(x) 7274 return true 7275 } 7276 // match: (MUL x (MOVWconst [c])) 7277 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7278 // result: (RSBshiftLL x x [log2(c+1)]) 7279 for { 7280 x := v.Args[0] 7281 v_1 := v.Args[1] 7282 if v_1.Op != OpARMMOVWconst { 7283 break 7284 } 7285 c := v_1.AuxInt 7286 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7287 break 7288 } 7289 v.reset(OpARMRSBshiftLL) 7290 v.AuxInt = log2(c + 1) 7291 v.AddArg(x) 7292 v.AddArg(x) 7293 return true 7294 } 7295 // match: (MUL x (MOVWconst [c])) 7296 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7297 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7298 for { 7299 x := v.Args[0] 7300 v_1 := v.Args[1] 7301 if v_1.Op != OpARMMOVWconst { 7302 break 7303 } 7304 c := v_1.AuxInt 7305 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7306 break 7307 } 7308 v.reset(OpARMSLLconst) 7309 v.AuxInt = log2(c / 3) 7310 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7311 v0.AuxInt = 1 7312 v0.AddArg(x) 7313 v0.AddArg(x) 7314 v.AddArg(v0) 7315 return true 7316 } 7317 // match: (MUL x (MOVWconst [c])) 7318 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7319 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7320 for { 7321 x := v.Args[0] 7322 v_1 := v.Args[1] 7323 if v_1.Op != OpARMMOVWconst { 7324 break 7325 } 7326 c := v_1.AuxInt 7327 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7328 break 7329 } 7330 v.reset(OpARMSLLconst) 7331 v.AuxInt = log2(c / 5) 7332 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7333 v0.AuxInt = 2 7334 v0.AddArg(x) 7335 v0.AddArg(x) 7336 v.AddArg(v0) 7337 return true 7338 } 7339 // match: (MUL x (MOVWconst [c])) 7340 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7341 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7342 for { 7343 x := v.Args[0] 7344 v_1 := v.Args[1] 7345 if v_1.Op != OpARMMOVWconst { 7346 break 7347 } 7348 c := v_1.AuxInt 7349 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7350 break 7351 } 7352 v.reset(OpARMSLLconst) 7353 v.AuxInt = log2(c / 7) 7354 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7355 v0.AuxInt = 3 7356 v0.AddArg(x) 7357 v0.AddArg(x) 7358 v.AddArg(v0) 7359 return true 7360 } 7361 // match: (MUL x (MOVWconst [c])) 7362 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7363 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7364 for { 7365 x := v.Args[0] 7366 v_1 := v.Args[1] 7367 if v_1.Op != OpARMMOVWconst { 7368 break 7369 } 7370 c := v_1.AuxInt 7371 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7372 break 7373 } 7374 v.reset(OpARMSLLconst) 7375 v.AuxInt = log2(c / 9) 7376 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7377 v0.AuxInt = 3 7378 v0.AddArg(x) 7379 v0.AddArg(x) 7380 v.AddArg(v0) 7381 return true 7382 } 7383 // match: (MUL (MOVWconst [c]) x) 7384 // cond: int32(c) == -1 7385 // result: (RSBconst [0] x) 7386 for { 7387 v_0 := v.Args[0] 7388 if v_0.Op != OpARMMOVWconst { 7389 break 7390 } 7391 c := v_0.AuxInt 7392 x := v.Args[1] 7393 if !(int32(c) == -1) { 7394 break 7395 } 7396 v.reset(OpARMRSBconst) 7397 v.AuxInt = 0 7398 v.AddArg(x) 7399 return true 7400 } 7401 // match: (MUL (MOVWconst [0]) _) 7402 // cond: 7403 // result: (MOVWconst [0]) 7404 for { 7405 v_0 := v.Args[0] 7406 if v_0.Op != OpARMMOVWconst { 7407 break 7408 } 7409 if v_0.AuxInt != 0 { 7410 break 7411 } 7412 v.reset(OpARMMOVWconst) 7413 v.AuxInt = 0 7414 return true 7415 } 7416 // match: (MUL (MOVWconst [1]) x) 7417 // cond: 7418 // result: x 7419 for { 7420 v_0 := v.Args[0] 7421 if v_0.Op != OpARMMOVWconst { 7422 break 7423 } 7424 if v_0.AuxInt != 1 { 7425 break 7426 } 7427 x := v.Args[1] 7428 v.reset(OpCopy) 7429 v.Type = x.Type 7430 v.AddArg(x) 7431 return true 7432 } 7433 // match: (MUL (MOVWconst [c]) x) 7434 // cond: isPowerOfTwo(c) 7435 // result: (SLLconst [log2(c)] x) 7436 for { 7437 v_0 := v.Args[0] 7438 if v_0.Op != OpARMMOVWconst { 7439 break 7440 } 7441 c := v_0.AuxInt 7442 x := v.Args[1] 7443 if !(isPowerOfTwo(c)) { 7444 break 7445 } 7446 v.reset(OpARMSLLconst) 7447 v.AuxInt = log2(c) 7448 v.AddArg(x) 7449 return true 7450 } 7451 // match: (MUL (MOVWconst [c]) x) 7452 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7453 // result: (ADDshiftLL x x [log2(c-1)]) 7454 for { 7455 v_0 := v.Args[0] 7456 if v_0.Op != OpARMMOVWconst { 7457 break 7458 } 7459 c := v_0.AuxInt 7460 x := v.Args[1] 7461 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7462 break 7463 } 7464 v.reset(OpARMADDshiftLL) 7465 v.AuxInt = log2(c - 1) 7466 v.AddArg(x) 7467 v.AddArg(x) 7468 return true 7469 } 7470 // match: (MUL (MOVWconst [c]) x) 7471 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7472 // result: (RSBshiftLL x x [log2(c+1)]) 7473 for { 7474 v_0 := v.Args[0] 7475 if v_0.Op != OpARMMOVWconst { 7476 break 7477 } 7478 c := v_0.AuxInt 7479 x := v.Args[1] 7480 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7481 break 7482 } 7483 v.reset(OpARMRSBshiftLL) 7484 v.AuxInt = log2(c + 1) 7485 v.AddArg(x) 7486 v.AddArg(x) 7487 return true 7488 } 7489 // match: (MUL (MOVWconst [c]) x) 7490 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7491 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7492 for { 7493 v_0 := v.Args[0] 7494 if v_0.Op != OpARMMOVWconst { 7495 break 7496 } 7497 c := v_0.AuxInt 7498 x := v.Args[1] 7499 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7500 break 7501 } 7502 v.reset(OpARMSLLconst) 7503 v.AuxInt = log2(c / 3) 7504 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7505 v0.AuxInt = 1 7506 v0.AddArg(x) 7507 v0.AddArg(x) 7508 v.AddArg(v0) 7509 return true 7510 } 7511 // match: (MUL (MOVWconst [c]) x) 7512 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7513 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7514 for { 7515 v_0 := v.Args[0] 7516 if v_0.Op != OpARMMOVWconst { 7517 break 7518 } 7519 c := v_0.AuxInt 7520 x := v.Args[1] 7521 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7522 break 7523 } 7524 v.reset(OpARMSLLconst) 7525 v.AuxInt = log2(c / 5) 7526 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7527 v0.AuxInt = 2 7528 v0.AddArg(x) 7529 v0.AddArg(x) 7530 v.AddArg(v0) 7531 return true 7532 } 7533 // match: (MUL (MOVWconst [c]) x) 7534 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7535 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7536 for { 7537 v_0 := v.Args[0] 7538 if v_0.Op != OpARMMOVWconst { 7539 break 7540 } 7541 c := v_0.AuxInt 7542 x := v.Args[1] 7543 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7544 break 7545 } 7546 v.reset(OpARMSLLconst) 7547 v.AuxInt = log2(c / 7) 7548 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7549 v0.AuxInt = 3 7550 v0.AddArg(x) 7551 v0.AddArg(x) 7552 v.AddArg(v0) 7553 return true 7554 } 7555 // match: (MUL (MOVWconst [c]) x) 7556 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7557 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7558 for { 7559 v_0 := v.Args[0] 7560 if v_0.Op != OpARMMOVWconst { 7561 break 7562 } 7563 c := v_0.AuxInt 7564 x := v.Args[1] 7565 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7566 break 7567 } 7568 v.reset(OpARMSLLconst) 7569 v.AuxInt = log2(c / 9) 7570 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7571 v0.AuxInt = 3 7572 v0.AddArg(x) 7573 v0.AddArg(x) 7574 v.AddArg(v0) 7575 return true 7576 } 7577 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 7578 // cond: 7579 // result: (MOVWconst [int64(int32(c*d))]) 7580 for { 7581 v_0 := v.Args[0] 7582 if v_0.Op != OpARMMOVWconst { 7583 break 7584 } 7585 c := v_0.AuxInt 7586 v_1 := v.Args[1] 7587 if v_1.Op != OpARMMOVWconst { 7588 break 7589 } 7590 d := v_1.AuxInt 7591 v.reset(OpARMMOVWconst) 7592 v.AuxInt = int64(int32(c * d)) 7593 return true 7594 } 7595 return false 7596 } 7597 func rewriteValueARM_OpARMMULA(v *Value, config *Config) bool { 7598 b := v.Block 7599 _ = b 7600 // match: (MULA x (MOVWconst [c]) a) 7601 // cond: int32(c) == -1 7602 // result: (SUB a x) 7603 for { 7604 x := v.Args[0] 7605 v_1 := v.Args[1] 7606 if v_1.Op != OpARMMOVWconst { 7607 break 7608 } 7609 c := v_1.AuxInt 7610 a := v.Args[2] 7611 if !(int32(c) == -1) { 7612 break 7613 } 7614 v.reset(OpARMSUB) 7615 v.AddArg(a) 7616 v.AddArg(x) 7617 return true 7618 } 7619 // match: (MULA _ (MOVWconst [0]) a) 7620 // cond: 7621 // result: a 7622 for { 7623 v_1 := v.Args[1] 7624 if v_1.Op != OpARMMOVWconst { 7625 break 7626 } 7627 if v_1.AuxInt != 0 { 7628 break 7629 } 7630 a := v.Args[2] 7631 v.reset(OpCopy) 7632 v.Type = a.Type 7633 v.AddArg(a) 7634 return true 7635 } 7636 // match: (MULA x (MOVWconst [1]) a) 7637 // cond: 7638 // result: (ADD x a) 7639 for { 7640 x := v.Args[0] 7641 v_1 := v.Args[1] 7642 if v_1.Op != OpARMMOVWconst { 7643 break 7644 } 7645 if v_1.AuxInt != 1 { 7646 break 7647 } 7648 a := v.Args[2] 7649 v.reset(OpARMADD) 7650 v.AddArg(x) 7651 v.AddArg(a) 7652 return true 7653 } 7654 // match: (MULA x (MOVWconst [c]) a) 7655 // cond: isPowerOfTwo(c) 7656 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 7657 for { 7658 x := v.Args[0] 7659 v_1 := v.Args[1] 7660 if v_1.Op != OpARMMOVWconst { 7661 break 7662 } 7663 c := v_1.AuxInt 7664 a := v.Args[2] 7665 if !(isPowerOfTwo(c)) { 7666 break 7667 } 7668 v.reset(OpARMADD) 7669 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7670 v0.AuxInt = log2(c) 7671 v0.AddArg(x) 7672 v.AddArg(v0) 7673 v.AddArg(a) 7674 return true 7675 } 7676 // match: (MULA x (MOVWconst [c]) a) 7677 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7678 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 7679 for { 7680 x := v.Args[0] 7681 v_1 := v.Args[1] 7682 if v_1.Op != OpARMMOVWconst { 7683 break 7684 } 7685 c := v_1.AuxInt 7686 a := v.Args[2] 7687 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7688 break 7689 } 7690 v.reset(OpARMADD) 7691 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7692 v0.AuxInt = log2(c - 1) 7693 v0.AddArg(x) 7694 v0.AddArg(x) 7695 v.AddArg(v0) 7696 v.AddArg(a) 7697 return true 7698 } 7699 // match: (MULA x (MOVWconst [c]) a) 7700 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7701 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 7702 for { 7703 x := v.Args[0] 7704 v_1 := v.Args[1] 7705 if v_1.Op != OpARMMOVWconst { 7706 break 7707 } 7708 c := v_1.AuxInt 7709 a := v.Args[2] 7710 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7711 break 7712 } 7713 v.reset(OpARMADD) 7714 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7715 v0.AuxInt = log2(c + 1) 7716 v0.AddArg(x) 7717 v0.AddArg(x) 7718 v.AddArg(v0) 7719 v.AddArg(a) 7720 return true 7721 } 7722 // match: (MULA x (MOVWconst [c]) a) 7723 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7724 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 7725 for { 7726 x := v.Args[0] 7727 v_1 := v.Args[1] 7728 if v_1.Op != OpARMMOVWconst { 7729 break 7730 } 7731 c := v_1.AuxInt 7732 a := v.Args[2] 7733 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7734 break 7735 } 7736 v.reset(OpARMADD) 7737 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7738 v0.AuxInt = log2(c / 3) 7739 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7740 v1.AuxInt = 1 7741 v1.AddArg(x) 7742 v1.AddArg(x) 7743 v0.AddArg(v1) 7744 v.AddArg(v0) 7745 v.AddArg(a) 7746 return true 7747 } 7748 // match: (MULA x (MOVWconst [c]) a) 7749 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7750 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 7751 for { 7752 x := v.Args[0] 7753 v_1 := v.Args[1] 7754 if v_1.Op != OpARMMOVWconst { 7755 break 7756 } 7757 c := v_1.AuxInt 7758 a := v.Args[2] 7759 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7760 break 7761 } 7762 v.reset(OpARMADD) 7763 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7764 v0.AuxInt = log2(c / 5) 7765 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7766 v1.AuxInt = 2 7767 v1.AddArg(x) 7768 v1.AddArg(x) 7769 v0.AddArg(v1) 7770 v.AddArg(v0) 7771 v.AddArg(a) 7772 return true 7773 } 7774 // match: (MULA x (MOVWconst [c]) a) 7775 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7776 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 7777 for { 7778 x := v.Args[0] 7779 v_1 := v.Args[1] 7780 if v_1.Op != OpARMMOVWconst { 7781 break 7782 } 7783 c := v_1.AuxInt 7784 a := v.Args[2] 7785 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7786 break 7787 } 7788 v.reset(OpARMADD) 7789 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7790 v0.AuxInt = log2(c / 7) 7791 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7792 v1.AuxInt = 3 7793 v1.AddArg(x) 7794 v1.AddArg(x) 7795 v0.AddArg(v1) 7796 v.AddArg(v0) 7797 v.AddArg(a) 7798 return true 7799 } 7800 // match: (MULA x (MOVWconst [c]) a) 7801 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7802 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 7803 for { 7804 x := v.Args[0] 7805 v_1 := v.Args[1] 7806 if v_1.Op != OpARMMOVWconst { 7807 break 7808 } 7809 c := v_1.AuxInt 7810 a := v.Args[2] 7811 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7812 break 7813 } 7814 v.reset(OpARMADD) 7815 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7816 v0.AuxInt = log2(c / 9) 7817 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7818 v1.AuxInt = 3 7819 v1.AddArg(x) 7820 v1.AddArg(x) 7821 v0.AddArg(v1) 7822 v.AddArg(v0) 7823 v.AddArg(a) 7824 return true 7825 } 7826 // match: (MULA (MOVWconst [c]) x a) 7827 // cond: int32(c) == -1 7828 // result: (SUB a x) 7829 for { 7830 v_0 := v.Args[0] 7831 if v_0.Op != OpARMMOVWconst { 7832 break 7833 } 7834 c := v_0.AuxInt 7835 x := v.Args[1] 7836 a := v.Args[2] 7837 if !(int32(c) == -1) { 7838 break 7839 } 7840 v.reset(OpARMSUB) 7841 v.AddArg(a) 7842 v.AddArg(x) 7843 return true 7844 } 7845 // match: (MULA (MOVWconst [0]) _ a) 7846 // cond: 7847 // result: a 7848 for { 7849 v_0 := v.Args[0] 7850 if v_0.Op != OpARMMOVWconst { 7851 break 7852 } 7853 if v_0.AuxInt != 0 { 7854 break 7855 } 7856 a := v.Args[2] 7857 v.reset(OpCopy) 7858 v.Type = a.Type 7859 v.AddArg(a) 7860 return true 7861 } 7862 // match: (MULA (MOVWconst [1]) x a) 7863 // cond: 7864 // result: (ADD x a) 7865 for { 7866 v_0 := v.Args[0] 7867 if v_0.Op != OpARMMOVWconst { 7868 break 7869 } 7870 if v_0.AuxInt != 1 { 7871 break 7872 } 7873 x := v.Args[1] 7874 a := v.Args[2] 7875 v.reset(OpARMADD) 7876 v.AddArg(x) 7877 v.AddArg(a) 7878 return true 7879 } 7880 // match: (MULA (MOVWconst [c]) x a) 7881 // cond: isPowerOfTwo(c) 7882 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 7883 for { 7884 v_0 := v.Args[0] 7885 if v_0.Op != OpARMMOVWconst { 7886 break 7887 } 7888 c := v_0.AuxInt 7889 x := v.Args[1] 7890 a := v.Args[2] 7891 if !(isPowerOfTwo(c)) { 7892 break 7893 } 7894 v.reset(OpARMADD) 7895 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7896 v0.AuxInt = log2(c) 7897 v0.AddArg(x) 7898 v.AddArg(v0) 7899 v.AddArg(a) 7900 return true 7901 } 7902 // match: (MULA (MOVWconst [c]) x a) 7903 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7904 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 7905 for { 7906 v_0 := v.Args[0] 7907 if v_0.Op != OpARMMOVWconst { 7908 break 7909 } 7910 c := v_0.AuxInt 7911 x := v.Args[1] 7912 a := v.Args[2] 7913 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7914 break 7915 } 7916 v.reset(OpARMADD) 7917 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7918 v0.AuxInt = log2(c - 1) 7919 v0.AddArg(x) 7920 v0.AddArg(x) 7921 v.AddArg(v0) 7922 v.AddArg(a) 7923 return true 7924 } 7925 // match: (MULA (MOVWconst [c]) x a) 7926 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7927 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 7928 for { 7929 v_0 := v.Args[0] 7930 if v_0.Op != OpARMMOVWconst { 7931 break 7932 } 7933 c := v_0.AuxInt 7934 x := v.Args[1] 7935 a := v.Args[2] 7936 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7937 break 7938 } 7939 v.reset(OpARMADD) 7940 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7941 v0.AuxInt = log2(c + 1) 7942 v0.AddArg(x) 7943 v0.AddArg(x) 7944 v.AddArg(v0) 7945 v.AddArg(a) 7946 return true 7947 } 7948 // match: (MULA (MOVWconst [c]) x a) 7949 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7950 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 7951 for { 7952 v_0 := v.Args[0] 7953 if v_0.Op != OpARMMOVWconst { 7954 break 7955 } 7956 c := v_0.AuxInt 7957 x := v.Args[1] 7958 a := v.Args[2] 7959 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7960 break 7961 } 7962 v.reset(OpARMADD) 7963 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7964 v0.AuxInt = log2(c / 3) 7965 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7966 v1.AuxInt = 1 7967 v1.AddArg(x) 7968 v1.AddArg(x) 7969 v0.AddArg(v1) 7970 v.AddArg(v0) 7971 v.AddArg(a) 7972 return true 7973 } 7974 // match: (MULA (MOVWconst [c]) x a) 7975 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7976 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 7977 for { 7978 v_0 := v.Args[0] 7979 if v_0.Op != OpARMMOVWconst { 7980 break 7981 } 7982 c := v_0.AuxInt 7983 x := v.Args[1] 7984 a := v.Args[2] 7985 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7986 break 7987 } 7988 v.reset(OpARMADD) 7989 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7990 v0.AuxInt = log2(c / 5) 7991 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7992 v1.AuxInt = 2 7993 v1.AddArg(x) 7994 v1.AddArg(x) 7995 v0.AddArg(v1) 7996 v.AddArg(v0) 7997 v.AddArg(a) 7998 return true 7999 } 8000 // match: (MULA (MOVWconst [c]) x a) 8001 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8002 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 8003 for { 8004 v_0 := v.Args[0] 8005 if v_0.Op != OpARMMOVWconst { 8006 break 8007 } 8008 c := v_0.AuxInt 8009 x := v.Args[1] 8010 a := v.Args[2] 8011 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8012 break 8013 } 8014 v.reset(OpARMADD) 8015 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8016 v0.AuxInt = log2(c / 7) 8017 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8018 v1.AuxInt = 3 8019 v1.AddArg(x) 8020 v1.AddArg(x) 8021 v0.AddArg(v1) 8022 v.AddArg(v0) 8023 v.AddArg(a) 8024 return true 8025 } 8026 // match: (MULA (MOVWconst [c]) x a) 8027 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8028 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 8029 for { 8030 v_0 := v.Args[0] 8031 if v_0.Op != OpARMMOVWconst { 8032 break 8033 } 8034 c := v_0.AuxInt 8035 x := v.Args[1] 8036 a := v.Args[2] 8037 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8038 break 8039 } 8040 v.reset(OpARMADD) 8041 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8042 v0.AuxInt = log2(c / 9) 8043 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8044 v1.AuxInt = 3 8045 v1.AddArg(x) 8046 v1.AddArg(x) 8047 v0.AddArg(v1) 8048 v.AddArg(v0) 8049 v.AddArg(a) 8050 return true 8051 } 8052 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 8053 // cond: 8054 // result: (ADDconst [int64(int32(c*d))] a) 8055 for { 8056 v_0 := v.Args[0] 8057 if v_0.Op != OpARMMOVWconst { 8058 break 8059 } 8060 c := v_0.AuxInt 8061 v_1 := v.Args[1] 8062 if v_1.Op != OpARMMOVWconst { 8063 break 8064 } 8065 d := v_1.AuxInt 8066 a := v.Args[2] 8067 v.reset(OpARMADDconst) 8068 v.AuxInt = int64(int32(c * d)) 8069 v.AddArg(a) 8070 return true 8071 } 8072 return false 8073 } 8074 func rewriteValueARM_OpARMMVN(v *Value, config *Config) bool { 8075 b := v.Block 8076 _ = b 8077 // match: (MVN (MOVWconst [c])) 8078 // cond: 8079 // result: (MOVWconst [^c]) 8080 for { 8081 v_0 := v.Args[0] 8082 if v_0.Op != OpARMMOVWconst { 8083 break 8084 } 8085 c := v_0.AuxInt 8086 v.reset(OpARMMOVWconst) 8087 v.AuxInt = ^c 8088 return true 8089 } 8090 // match: (MVN (SLLconst [c] x)) 8091 // cond: 8092 // result: (MVNshiftLL x [c]) 8093 for { 8094 v_0 := v.Args[0] 8095 if v_0.Op != OpARMSLLconst { 8096 break 8097 } 8098 c := v_0.AuxInt 8099 x := v_0.Args[0] 8100 v.reset(OpARMMVNshiftLL) 8101 v.AuxInt = c 8102 v.AddArg(x) 8103 return true 8104 } 8105 // match: (MVN (SRLconst [c] x)) 8106 // cond: 8107 // result: (MVNshiftRL x [c]) 8108 for { 8109 v_0 := v.Args[0] 8110 if v_0.Op != OpARMSRLconst { 8111 break 8112 } 8113 c := v_0.AuxInt 8114 x := v_0.Args[0] 8115 v.reset(OpARMMVNshiftRL) 8116 v.AuxInt = c 8117 v.AddArg(x) 8118 return true 8119 } 8120 // match: (MVN (SRAconst [c] x)) 8121 // cond: 8122 // result: (MVNshiftRA x [c]) 8123 for { 8124 v_0 := v.Args[0] 8125 if v_0.Op != OpARMSRAconst { 8126 break 8127 } 8128 c := v_0.AuxInt 8129 x := v_0.Args[0] 8130 v.reset(OpARMMVNshiftRA) 8131 v.AuxInt = c 8132 v.AddArg(x) 8133 return true 8134 } 8135 // match: (MVN (SLL x y)) 8136 // cond: 8137 // result: (MVNshiftLLreg x y) 8138 for { 8139 v_0 := v.Args[0] 8140 if v_0.Op != OpARMSLL { 8141 break 8142 } 8143 x := v_0.Args[0] 8144 y := v_0.Args[1] 8145 v.reset(OpARMMVNshiftLLreg) 8146 v.AddArg(x) 8147 v.AddArg(y) 8148 return true 8149 } 8150 // match: (MVN (SRL x y)) 8151 // cond: 8152 // result: (MVNshiftRLreg x y) 8153 for { 8154 v_0 := v.Args[0] 8155 if v_0.Op != OpARMSRL { 8156 break 8157 } 8158 x := v_0.Args[0] 8159 y := v_0.Args[1] 8160 v.reset(OpARMMVNshiftRLreg) 8161 v.AddArg(x) 8162 v.AddArg(y) 8163 return true 8164 } 8165 // match: (MVN (SRA x y)) 8166 // cond: 8167 // result: (MVNshiftRAreg x y) 8168 for { 8169 v_0 := v.Args[0] 8170 if v_0.Op != OpARMSRA { 8171 break 8172 } 8173 x := v_0.Args[0] 8174 y := v_0.Args[1] 8175 v.reset(OpARMMVNshiftRAreg) 8176 v.AddArg(x) 8177 v.AddArg(y) 8178 return true 8179 } 8180 return false 8181 } 8182 func rewriteValueARM_OpARMMVNshiftLL(v *Value, config *Config) bool { 8183 b := v.Block 8184 _ = b 8185 // match: (MVNshiftLL (MOVWconst [c]) [d]) 8186 // cond: 8187 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 8188 for { 8189 d := v.AuxInt 8190 v_0 := v.Args[0] 8191 if v_0.Op != OpARMMOVWconst { 8192 break 8193 } 8194 c := v_0.AuxInt 8195 v.reset(OpARMMOVWconst) 8196 v.AuxInt = ^int64(uint32(c) << uint64(d)) 8197 return true 8198 } 8199 return false 8200 } 8201 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value, config *Config) bool { 8202 b := v.Block 8203 _ = b 8204 // match: (MVNshiftLLreg x (MOVWconst [c])) 8205 // cond: 8206 // result: (MVNshiftLL x [c]) 8207 for { 8208 x := v.Args[0] 8209 v_1 := v.Args[1] 8210 if v_1.Op != OpARMMOVWconst { 8211 break 8212 } 8213 c := v_1.AuxInt 8214 v.reset(OpARMMVNshiftLL) 8215 v.AuxInt = c 8216 v.AddArg(x) 8217 return true 8218 } 8219 return false 8220 } 8221 func rewriteValueARM_OpARMMVNshiftRA(v *Value, config *Config) bool { 8222 b := v.Block 8223 _ = b 8224 // match: (MVNshiftRA (MOVWconst [c]) [d]) 8225 // cond: 8226 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 8227 for { 8228 d := v.AuxInt 8229 v_0 := v.Args[0] 8230 if v_0.Op != OpARMMOVWconst { 8231 break 8232 } 8233 c := v_0.AuxInt 8234 v.reset(OpARMMOVWconst) 8235 v.AuxInt = ^int64(int32(c) >> uint64(d)) 8236 return true 8237 } 8238 return false 8239 } 8240 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value, config *Config) bool { 8241 b := v.Block 8242 _ = b 8243 // match: (MVNshiftRAreg x (MOVWconst [c])) 8244 // cond: 8245 // result: (MVNshiftRA x [c]) 8246 for { 8247 x := v.Args[0] 8248 v_1 := v.Args[1] 8249 if v_1.Op != OpARMMOVWconst { 8250 break 8251 } 8252 c := v_1.AuxInt 8253 v.reset(OpARMMVNshiftRA) 8254 v.AuxInt = c 8255 v.AddArg(x) 8256 return true 8257 } 8258 return false 8259 } 8260 func rewriteValueARM_OpARMMVNshiftRL(v *Value, config *Config) bool { 8261 b := v.Block 8262 _ = b 8263 // match: (MVNshiftRL (MOVWconst [c]) [d]) 8264 // cond: 8265 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 8266 for { 8267 d := v.AuxInt 8268 v_0 := v.Args[0] 8269 if v_0.Op != OpARMMOVWconst { 8270 break 8271 } 8272 c := v_0.AuxInt 8273 v.reset(OpARMMOVWconst) 8274 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 8275 return true 8276 } 8277 return false 8278 } 8279 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value, config *Config) bool { 8280 b := v.Block 8281 _ = b 8282 // match: (MVNshiftRLreg x (MOVWconst [c])) 8283 // cond: 8284 // result: (MVNshiftRL x [c]) 8285 for { 8286 x := v.Args[0] 8287 v_1 := v.Args[1] 8288 if v_1.Op != OpARMMOVWconst { 8289 break 8290 } 8291 c := v_1.AuxInt 8292 v.reset(OpARMMVNshiftRL) 8293 v.AuxInt = c 8294 v.AddArg(x) 8295 return true 8296 } 8297 return false 8298 } 8299 func rewriteValueARM_OpARMNotEqual(v *Value, config *Config) bool { 8300 b := v.Block 8301 _ = b 8302 // match: (NotEqual (FlagEQ)) 8303 // cond: 8304 // result: (MOVWconst [0]) 8305 for { 8306 v_0 := v.Args[0] 8307 if v_0.Op != OpARMFlagEQ { 8308 break 8309 } 8310 v.reset(OpARMMOVWconst) 8311 v.AuxInt = 0 8312 return true 8313 } 8314 // match: (NotEqual (FlagLT_ULT)) 8315 // cond: 8316 // result: (MOVWconst [1]) 8317 for { 8318 v_0 := v.Args[0] 8319 if v_0.Op != OpARMFlagLT_ULT { 8320 break 8321 } 8322 v.reset(OpARMMOVWconst) 8323 v.AuxInt = 1 8324 return true 8325 } 8326 // match: (NotEqual (FlagLT_UGT)) 8327 // cond: 8328 // result: (MOVWconst [1]) 8329 for { 8330 v_0 := v.Args[0] 8331 if v_0.Op != OpARMFlagLT_UGT { 8332 break 8333 } 8334 v.reset(OpARMMOVWconst) 8335 v.AuxInt = 1 8336 return true 8337 } 8338 // match: (NotEqual (FlagGT_ULT)) 8339 // cond: 8340 // result: (MOVWconst [1]) 8341 for { 8342 v_0 := v.Args[0] 8343 if v_0.Op != OpARMFlagGT_ULT { 8344 break 8345 } 8346 v.reset(OpARMMOVWconst) 8347 v.AuxInt = 1 8348 return true 8349 } 8350 // match: (NotEqual (FlagGT_UGT)) 8351 // cond: 8352 // result: (MOVWconst [1]) 8353 for { 8354 v_0 := v.Args[0] 8355 if v_0.Op != OpARMFlagGT_UGT { 8356 break 8357 } 8358 v.reset(OpARMMOVWconst) 8359 v.AuxInt = 1 8360 return true 8361 } 8362 // match: (NotEqual (InvertFlags x)) 8363 // cond: 8364 // result: (NotEqual x) 8365 for { 8366 v_0 := v.Args[0] 8367 if v_0.Op != OpARMInvertFlags { 8368 break 8369 } 8370 x := v_0.Args[0] 8371 v.reset(OpARMNotEqual) 8372 v.AddArg(x) 8373 return true 8374 } 8375 return false 8376 } 8377 func rewriteValueARM_OpARMOR(v *Value, config *Config) bool { 8378 b := v.Block 8379 _ = b 8380 // match: (OR (MOVWconst [c]) x) 8381 // cond: 8382 // result: (ORconst [c] x) 8383 for { 8384 v_0 := v.Args[0] 8385 if v_0.Op != OpARMMOVWconst { 8386 break 8387 } 8388 c := v_0.AuxInt 8389 x := v.Args[1] 8390 v.reset(OpARMORconst) 8391 v.AuxInt = c 8392 v.AddArg(x) 8393 return true 8394 } 8395 // match: (OR x (MOVWconst [c])) 8396 // cond: 8397 // result: (ORconst [c] x) 8398 for { 8399 x := v.Args[0] 8400 v_1 := v.Args[1] 8401 if v_1.Op != OpARMMOVWconst { 8402 break 8403 } 8404 c := v_1.AuxInt 8405 v.reset(OpARMORconst) 8406 v.AuxInt = c 8407 v.AddArg(x) 8408 return true 8409 } 8410 // match: (OR x (SLLconst [c] y)) 8411 // cond: 8412 // result: (ORshiftLL x y [c]) 8413 for { 8414 x := v.Args[0] 8415 v_1 := v.Args[1] 8416 if v_1.Op != OpARMSLLconst { 8417 break 8418 } 8419 c := v_1.AuxInt 8420 y := v_1.Args[0] 8421 v.reset(OpARMORshiftLL) 8422 v.AuxInt = c 8423 v.AddArg(x) 8424 v.AddArg(y) 8425 return true 8426 } 8427 // match: (OR (SLLconst [c] y) x) 8428 // cond: 8429 // result: (ORshiftLL x y [c]) 8430 for { 8431 v_0 := v.Args[0] 8432 if v_0.Op != OpARMSLLconst { 8433 break 8434 } 8435 c := v_0.AuxInt 8436 y := v_0.Args[0] 8437 x := v.Args[1] 8438 v.reset(OpARMORshiftLL) 8439 v.AuxInt = c 8440 v.AddArg(x) 8441 v.AddArg(y) 8442 return true 8443 } 8444 // match: (OR x (SRLconst [c] y)) 8445 // cond: 8446 // result: (ORshiftRL x y [c]) 8447 for { 8448 x := v.Args[0] 8449 v_1 := v.Args[1] 8450 if v_1.Op != OpARMSRLconst { 8451 break 8452 } 8453 c := v_1.AuxInt 8454 y := v_1.Args[0] 8455 v.reset(OpARMORshiftRL) 8456 v.AuxInt = c 8457 v.AddArg(x) 8458 v.AddArg(y) 8459 return true 8460 } 8461 // match: (OR (SRLconst [c] y) x) 8462 // cond: 8463 // result: (ORshiftRL x y [c]) 8464 for { 8465 v_0 := v.Args[0] 8466 if v_0.Op != OpARMSRLconst { 8467 break 8468 } 8469 c := v_0.AuxInt 8470 y := v_0.Args[0] 8471 x := v.Args[1] 8472 v.reset(OpARMORshiftRL) 8473 v.AuxInt = c 8474 v.AddArg(x) 8475 v.AddArg(y) 8476 return true 8477 } 8478 // match: (OR x (SRAconst [c] y)) 8479 // cond: 8480 // result: (ORshiftRA x y [c]) 8481 for { 8482 x := v.Args[0] 8483 v_1 := v.Args[1] 8484 if v_1.Op != OpARMSRAconst { 8485 break 8486 } 8487 c := v_1.AuxInt 8488 y := v_1.Args[0] 8489 v.reset(OpARMORshiftRA) 8490 v.AuxInt = c 8491 v.AddArg(x) 8492 v.AddArg(y) 8493 return true 8494 } 8495 // match: (OR (SRAconst [c] y) x) 8496 // cond: 8497 // result: (ORshiftRA x y [c]) 8498 for { 8499 v_0 := v.Args[0] 8500 if v_0.Op != OpARMSRAconst { 8501 break 8502 } 8503 c := v_0.AuxInt 8504 y := v_0.Args[0] 8505 x := v.Args[1] 8506 v.reset(OpARMORshiftRA) 8507 v.AuxInt = c 8508 v.AddArg(x) 8509 v.AddArg(y) 8510 return true 8511 } 8512 // match: (OR x (SLL y z)) 8513 // cond: 8514 // result: (ORshiftLLreg x y z) 8515 for { 8516 x := v.Args[0] 8517 v_1 := v.Args[1] 8518 if v_1.Op != OpARMSLL { 8519 break 8520 } 8521 y := v_1.Args[0] 8522 z := v_1.Args[1] 8523 v.reset(OpARMORshiftLLreg) 8524 v.AddArg(x) 8525 v.AddArg(y) 8526 v.AddArg(z) 8527 return true 8528 } 8529 // match: (OR (SLL y z) x) 8530 // cond: 8531 // result: (ORshiftLLreg x y z) 8532 for { 8533 v_0 := v.Args[0] 8534 if v_0.Op != OpARMSLL { 8535 break 8536 } 8537 y := v_0.Args[0] 8538 z := v_0.Args[1] 8539 x := v.Args[1] 8540 v.reset(OpARMORshiftLLreg) 8541 v.AddArg(x) 8542 v.AddArg(y) 8543 v.AddArg(z) 8544 return true 8545 } 8546 // match: (OR x (SRL y z)) 8547 // cond: 8548 // result: (ORshiftRLreg x y z) 8549 for { 8550 x := v.Args[0] 8551 v_1 := v.Args[1] 8552 if v_1.Op != OpARMSRL { 8553 break 8554 } 8555 y := v_1.Args[0] 8556 z := v_1.Args[1] 8557 v.reset(OpARMORshiftRLreg) 8558 v.AddArg(x) 8559 v.AddArg(y) 8560 v.AddArg(z) 8561 return true 8562 } 8563 // match: (OR (SRL y z) x) 8564 // cond: 8565 // result: (ORshiftRLreg x y z) 8566 for { 8567 v_0 := v.Args[0] 8568 if v_0.Op != OpARMSRL { 8569 break 8570 } 8571 y := v_0.Args[0] 8572 z := v_0.Args[1] 8573 x := v.Args[1] 8574 v.reset(OpARMORshiftRLreg) 8575 v.AddArg(x) 8576 v.AddArg(y) 8577 v.AddArg(z) 8578 return true 8579 } 8580 // match: (OR x (SRA y z)) 8581 // cond: 8582 // result: (ORshiftRAreg x y z) 8583 for { 8584 x := v.Args[0] 8585 v_1 := v.Args[1] 8586 if v_1.Op != OpARMSRA { 8587 break 8588 } 8589 y := v_1.Args[0] 8590 z := v_1.Args[1] 8591 v.reset(OpARMORshiftRAreg) 8592 v.AddArg(x) 8593 v.AddArg(y) 8594 v.AddArg(z) 8595 return true 8596 } 8597 // match: (OR (SRA y z) x) 8598 // cond: 8599 // result: (ORshiftRAreg x y z) 8600 for { 8601 v_0 := v.Args[0] 8602 if v_0.Op != OpARMSRA { 8603 break 8604 } 8605 y := v_0.Args[0] 8606 z := v_0.Args[1] 8607 x := v.Args[1] 8608 v.reset(OpARMORshiftRAreg) 8609 v.AddArg(x) 8610 v.AddArg(y) 8611 v.AddArg(z) 8612 return true 8613 } 8614 // match: (OR x x) 8615 // cond: 8616 // result: x 8617 for { 8618 x := v.Args[0] 8619 if x != v.Args[1] { 8620 break 8621 } 8622 v.reset(OpCopy) 8623 v.Type = x.Type 8624 v.AddArg(x) 8625 return true 8626 } 8627 return false 8628 } 8629 func rewriteValueARM_OpARMORconst(v *Value, config *Config) bool { 8630 b := v.Block 8631 _ = b 8632 // match: (ORconst [0] x) 8633 // cond: 8634 // result: x 8635 for { 8636 if v.AuxInt != 0 { 8637 break 8638 } 8639 x := v.Args[0] 8640 v.reset(OpCopy) 8641 v.Type = x.Type 8642 v.AddArg(x) 8643 return true 8644 } 8645 // match: (ORconst [c] _) 8646 // cond: int32(c)==-1 8647 // result: (MOVWconst [-1]) 8648 for { 8649 c := v.AuxInt 8650 if !(int32(c) == -1) { 8651 break 8652 } 8653 v.reset(OpARMMOVWconst) 8654 v.AuxInt = -1 8655 return true 8656 } 8657 // match: (ORconst [c] (MOVWconst [d])) 8658 // cond: 8659 // result: (MOVWconst [c|d]) 8660 for { 8661 c := v.AuxInt 8662 v_0 := v.Args[0] 8663 if v_0.Op != OpARMMOVWconst { 8664 break 8665 } 8666 d := v_0.AuxInt 8667 v.reset(OpARMMOVWconst) 8668 v.AuxInt = c | d 8669 return true 8670 } 8671 // match: (ORconst [c] (ORconst [d] x)) 8672 // cond: 8673 // result: (ORconst [c|d] x) 8674 for { 8675 c := v.AuxInt 8676 v_0 := v.Args[0] 8677 if v_0.Op != OpARMORconst { 8678 break 8679 } 8680 d := v_0.AuxInt 8681 x := v_0.Args[0] 8682 v.reset(OpARMORconst) 8683 v.AuxInt = c | d 8684 v.AddArg(x) 8685 return true 8686 } 8687 return false 8688 } 8689 func rewriteValueARM_OpARMORshiftLL(v *Value, config *Config) bool { 8690 b := v.Block 8691 _ = b 8692 // match: (ORshiftLL (MOVWconst [c]) x [d]) 8693 // cond: 8694 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 8695 for { 8696 d := v.AuxInt 8697 v_0 := v.Args[0] 8698 if v_0.Op != OpARMMOVWconst { 8699 break 8700 } 8701 c := v_0.AuxInt 8702 x := v.Args[1] 8703 v.reset(OpARMORconst) 8704 v.AuxInt = c 8705 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8706 v0.AuxInt = d 8707 v0.AddArg(x) 8708 v.AddArg(v0) 8709 return true 8710 } 8711 // match: (ORshiftLL x (MOVWconst [c]) [d]) 8712 // cond: 8713 // result: (ORconst x [int64(uint32(c)<<uint64(d))]) 8714 for { 8715 d := v.AuxInt 8716 x := v.Args[0] 8717 v_1 := v.Args[1] 8718 if v_1.Op != OpARMMOVWconst { 8719 break 8720 } 8721 c := v_1.AuxInt 8722 v.reset(OpARMORconst) 8723 v.AuxInt = int64(uint32(c) << uint64(d)) 8724 v.AddArg(x) 8725 return true 8726 } 8727 // match: ( ORshiftLL [c] (SRLconst x [32-c]) x) 8728 // cond: 8729 // result: (SRRconst [32-c] x) 8730 for { 8731 c := v.AuxInt 8732 v_0 := v.Args[0] 8733 if v_0.Op != OpARMSRLconst { 8734 break 8735 } 8736 if v_0.AuxInt != 32-c { 8737 break 8738 } 8739 x := v_0.Args[0] 8740 if x != v.Args[1] { 8741 break 8742 } 8743 v.reset(OpARMSRRconst) 8744 v.AuxInt = 32 - c 8745 v.AddArg(x) 8746 return true 8747 } 8748 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 8749 // cond: c==d 8750 // result: y 8751 for { 8752 d := v.AuxInt 8753 x := v.Args[0] 8754 y := v.Args[1] 8755 if y.Op != OpARMSLLconst { 8756 break 8757 } 8758 c := y.AuxInt 8759 if x != y.Args[0] { 8760 break 8761 } 8762 if !(c == d) { 8763 break 8764 } 8765 v.reset(OpCopy) 8766 v.Type = y.Type 8767 v.AddArg(y) 8768 return true 8769 } 8770 return false 8771 } 8772 func rewriteValueARM_OpARMORshiftLLreg(v *Value, config *Config) bool { 8773 b := v.Block 8774 _ = b 8775 // match: (ORshiftLLreg (MOVWconst [c]) x y) 8776 // cond: 8777 // result: (ORconst [c] (SLL <x.Type> x y)) 8778 for { 8779 v_0 := v.Args[0] 8780 if v_0.Op != OpARMMOVWconst { 8781 break 8782 } 8783 c := v_0.AuxInt 8784 x := v.Args[1] 8785 y := v.Args[2] 8786 v.reset(OpARMORconst) 8787 v.AuxInt = c 8788 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 8789 v0.AddArg(x) 8790 v0.AddArg(y) 8791 v.AddArg(v0) 8792 return true 8793 } 8794 // match: (ORshiftLLreg x y (MOVWconst [c])) 8795 // cond: 8796 // result: (ORshiftLL x y [c]) 8797 for { 8798 x := v.Args[0] 8799 y := v.Args[1] 8800 v_2 := v.Args[2] 8801 if v_2.Op != OpARMMOVWconst { 8802 break 8803 } 8804 c := v_2.AuxInt 8805 v.reset(OpARMORshiftLL) 8806 v.AuxInt = c 8807 v.AddArg(x) 8808 v.AddArg(y) 8809 return true 8810 } 8811 return false 8812 } 8813 func rewriteValueARM_OpARMORshiftRA(v *Value, config *Config) bool { 8814 b := v.Block 8815 _ = b 8816 // match: (ORshiftRA (MOVWconst [c]) x [d]) 8817 // cond: 8818 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 8819 for { 8820 d := v.AuxInt 8821 v_0 := v.Args[0] 8822 if v_0.Op != OpARMMOVWconst { 8823 break 8824 } 8825 c := v_0.AuxInt 8826 x := v.Args[1] 8827 v.reset(OpARMORconst) 8828 v.AuxInt = c 8829 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 8830 v0.AuxInt = d 8831 v0.AddArg(x) 8832 v.AddArg(v0) 8833 return true 8834 } 8835 // match: (ORshiftRA x (MOVWconst [c]) [d]) 8836 // cond: 8837 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 8838 for { 8839 d := v.AuxInt 8840 x := v.Args[0] 8841 v_1 := v.Args[1] 8842 if v_1.Op != OpARMMOVWconst { 8843 break 8844 } 8845 c := v_1.AuxInt 8846 v.reset(OpARMORconst) 8847 v.AuxInt = int64(int32(c) >> uint64(d)) 8848 v.AddArg(x) 8849 return true 8850 } 8851 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 8852 // cond: c==d 8853 // result: y 8854 for { 8855 d := v.AuxInt 8856 x := v.Args[0] 8857 y := v.Args[1] 8858 if y.Op != OpARMSRAconst { 8859 break 8860 } 8861 c := y.AuxInt 8862 if x != y.Args[0] { 8863 break 8864 } 8865 if !(c == d) { 8866 break 8867 } 8868 v.reset(OpCopy) 8869 v.Type = y.Type 8870 v.AddArg(y) 8871 return true 8872 } 8873 return false 8874 } 8875 func rewriteValueARM_OpARMORshiftRAreg(v *Value, config *Config) bool { 8876 b := v.Block 8877 _ = b 8878 // match: (ORshiftRAreg (MOVWconst [c]) x y) 8879 // cond: 8880 // result: (ORconst [c] (SRA <x.Type> x y)) 8881 for { 8882 v_0 := v.Args[0] 8883 if v_0.Op != OpARMMOVWconst { 8884 break 8885 } 8886 c := v_0.AuxInt 8887 x := v.Args[1] 8888 y := v.Args[2] 8889 v.reset(OpARMORconst) 8890 v.AuxInt = c 8891 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 8892 v0.AddArg(x) 8893 v0.AddArg(y) 8894 v.AddArg(v0) 8895 return true 8896 } 8897 // match: (ORshiftRAreg x y (MOVWconst [c])) 8898 // cond: 8899 // result: (ORshiftRA x y [c]) 8900 for { 8901 x := v.Args[0] 8902 y := v.Args[1] 8903 v_2 := v.Args[2] 8904 if v_2.Op != OpARMMOVWconst { 8905 break 8906 } 8907 c := v_2.AuxInt 8908 v.reset(OpARMORshiftRA) 8909 v.AuxInt = c 8910 v.AddArg(x) 8911 v.AddArg(y) 8912 return true 8913 } 8914 return false 8915 } 8916 func rewriteValueARM_OpARMORshiftRL(v *Value, config *Config) bool { 8917 b := v.Block 8918 _ = b 8919 // match: (ORshiftRL (MOVWconst [c]) x [d]) 8920 // cond: 8921 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 8922 for { 8923 d := v.AuxInt 8924 v_0 := v.Args[0] 8925 if v_0.Op != OpARMMOVWconst { 8926 break 8927 } 8928 c := v_0.AuxInt 8929 x := v.Args[1] 8930 v.reset(OpARMORconst) 8931 v.AuxInt = c 8932 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 8933 v0.AuxInt = d 8934 v0.AddArg(x) 8935 v.AddArg(v0) 8936 return true 8937 } 8938 // match: (ORshiftRL x (MOVWconst [c]) [d]) 8939 // cond: 8940 // result: (ORconst x [int64(uint32(c)>>uint64(d))]) 8941 for { 8942 d := v.AuxInt 8943 x := v.Args[0] 8944 v_1 := v.Args[1] 8945 if v_1.Op != OpARMMOVWconst { 8946 break 8947 } 8948 c := v_1.AuxInt 8949 v.reset(OpARMORconst) 8950 v.AuxInt = int64(uint32(c) >> uint64(d)) 8951 v.AddArg(x) 8952 return true 8953 } 8954 // match: ( ORshiftRL [c] (SLLconst x [32-c]) x) 8955 // cond: 8956 // result: (SRRconst [ c] x) 8957 for { 8958 c := v.AuxInt 8959 v_0 := v.Args[0] 8960 if v_0.Op != OpARMSLLconst { 8961 break 8962 } 8963 if v_0.AuxInt != 32-c { 8964 break 8965 } 8966 x := v_0.Args[0] 8967 if x != v.Args[1] { 8968 break 8969 } 8970 v.reset(OpARMSRRconst) 8971 v.AuxInt = c 8972 v.AddArg(x) 8973 return true 8974 } 8975 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 8976 // cond: c==d 8977 // result: y 8978 for { 8979 d := v.AuxInt 8980 x := v.Args[0] 8981 y := v.Args[1] 8982 if y.Op != OpARMSRLconst { 8983 break 8984 } 8985 c := y.AuxInt 8986 if x != y.Args[0] { 8987 break 8988 } 8989 if !(c == d) { 8990 break 8991 } 8992 v.reset(OpCopy) 8993 v.Type = y.Type 8994 v.AddArg(y) 8995 return true 8996 } 8997 return false 8998 } 8999 func rewriteValueARM_OpARMORshiftRLreg(v *Value, config *Config) bool { 9000 b := v.Block 9001 _ = b 9002 // match: (ORshiftRLreg (MOVWconst [c]) x y) 9003 // cond: 9004 // result: (ORconst [c] (SRL <x.Type> x y)) 9005 for { 9006 v_0 := v.Args[0] 9007 if v_0.Op != OpARMMOVWconst { 9008 break 9009 } 9010 c := v_0.AuxInt 9011 x := v.Args[1] 9012 y := v.Args[2] 9013 v.reset(OpARMORconst) 9014 v.AuxInt = c 9015 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9016 v0.AddArg(x) 9017 v0.AddArg(y) 9018 v.AddArg(v0) 9019 return true 9020 } 9021 // match: (ORshiftRLreg x y (MOVWconst [c])) 9022 // cond: 9023 // result: (ORshiftRL x y [c]) 9024 for { 9025 x := v.Args[0] 9026 y := v.Args[1] 9027 v_2 := v.Args[2] 9028 if v_2.Op != OpARMMOVWconst { 9029 break 9030 } 9031 c := v_2.AuxInt 9032 v.reset(OpARMORshiftRL) 9033 v.AuxInt = c 9034 v.AddArg(x) 9035 v.AddArg(y) 9036 return true 9037 } 9038 return false 9039 } 9040 func rewriteValueARM_OpARMRSB(v *Value, config *Config) bool { 9041 b := v.Block 9042 _ = b 9043 // match: (RSB (MOVWconst [c]) x) 9044 // cond: 9045 // result: (SUBconst [c] x) 9046 for { 9047 v_0 := v.Args[0] 9048 if v_0.Op != OpARMMOVWconst { 9049 break 9050 } 9051 c := v_0.AuxInt 9052 x := v.Args[1] 9053 v.reset(OpARMSUBconst) 9054 v.AuxInt = c 9055 v.AddArg(x) 9056 return true 9057 } 9058 // match: (RSB x (MOVWconst [c])) 9059 // cond: 9060 // result: (RSBconst [c] x) 9061 for { 9062 x := v.Args[0] 9063 v_1 := v.Args[1] 9064 if v_1.Op != OpARMMOVWconst { 9065 break 9066 } 9067 c := v_1.AuxInt 9068 v.reset(OpARMRSBconst) 9069 v.AuxInt = c 9070 v.AddArg(x) 9071 return true 9072 } 9073 // match: (RSB x (SLLconst [c] y)) 9074 // cond: 9075 // result: (RSBshiftLL x y [c]) 9076 for { 9077 x := v.Args[0] 9078 v_1 := v.Args[1] 9079 if v_1.Op != OpARMSLLconst { 9080 break 9081 } 9082 c := v_1.AuxInt 9083 y := v_1.Args[0] 9084 v.reset(OpARMRSBshiftLL) 9085 v.AuxInt = c 9086 v.AddArg(x) 9087 v.AddArg(y) 9088 return true 9089 } 9090 // match: (RSB (SLLconst [c] y) x) 9091 // cond: 9092 // result: (SUBshiftLL x y [c]) 9093 for { 9094 v_0 := v.Args[0] 9095 if v_0.Op != OpARMSLLconst { 9096 break 9097 } 9098 c := v_0.AuxInt 9099 y := v_0.Args[0] 9100 x := v.Args[1] 9101 v.reset(OpARMSUBshiftLL) 9102 v.AuxInt = c 9103 v.AddArg(x) 9104 v.AddArg(y) 9105 return true 9106 } 9107 // match: (RSB x (SRLconst [c] y)) 9108 // cond: 9109 // result: (RSBshiftRL x y [c]) 9110 for { 9111 x := v.Args[0] 9112 v_1 := v.Args[1] 9113 if v_1.Op != OpARMSRLconst { 9114 break 9115 } 9116 c := v_1.AuxInt 9117 y := v_1.Args[0] 9118 v.reset(OpARMRSBshiftRL) 9119 v.AuxInt = c 9120 v.AddArg(x) 9121 v.AddArg(y) 9122 return true 9123 } 9124 // match: (RSB (SRLconst [c] y) x) 9125 // cond: 9126 // result: (SUBshiftRL x y [c]) 9127 for { 9128 v_0 := v.Args[0] 9129 if v_0.Op != OpARMSRLconst { 9130 break 9131 } 9132 c := v_0.AuxInt 9133 y := v_0.Args[0] 9134 x := v.Args[1] 9135 v.reset(OpARMSUBshiftRL) 9136 v.AuxInt = c 9137 v.AddArg(x) 9138 v.AddArg(y) 9139 return true 9140 } 9141 // match: (RSB x (SRAconst [c] y)) 9142 // cond: 9143 // result: (RSBshiftRA x y [c]) 9144 for { 9145 x := v.Args[0] 9146 v_1 := v.Args[1] 9147 if v_1.Op != OpARMSRAconst { 9148 break 9149 } 9150 c := v_1.AuxInt 9151 y := v_1.Args[0] 9152 v.reset(OpARMRSBshiftRA) 9153 v.AuxInt = c 9154 v.AddArg(x) 9155 v.AddArg(y) 9156 return true 9157 } 9158 // match: (RSB (SRAconst [c] y) x) 9159 // cond: 9160 // result: (SUBshiftRA x y [c]) 9161 for { 9162 v_0 := v.Args[0] 9163 if v_0.Op != OpARMSRAconst { 9164 break 9165 } 9166 c := v_0.AuxInt 9167 y := v_0.Args[0] 9168 x := v.Args[1] 9169 v.reset(OpARMSUBshiftRA) 9170 v.AuxInt = c 9171 v.AddArg(x) 9172 v.AddArg(y) 9173 return true 9174 } 9175 // match: (RSB x (SLL y z)) 9176 // cond: 9177 // result: (RSBshiftLLreg x y z) 9178 for { 9179 x := v.Args[0] 9180 v_1 := v.Args[1] 9181 if v_1.Op != OpARMSLL { 9182 break 9183 } 9184 y := v_1.Args[0] 9185 z := v_1.Args[1] 9186 v.reset(OpARMRSBshiftLLreg) 9187 v.AddArg(x) 9188 v.AddArg(y) 9189 v.AddArg(z) 9190 return true 9191 } 9192 // match: (RSB (SLL y z) x) 9193 // cond: 9194 // result: (SUBshiftLLreg x y z) 9195 for { 9196 v_0 := v.Args[0] 9197 if v_0.Op != OpARMSLL { 9198 break 9199 } 9200 y := v_0.Args[0] 9201 z := v_0.Args[1] 9202 x := v.Args[1] 9203 v.reset(OpARMSUBshiftLLreg) 9204 v.AddArg(x) 9205 v.AddArg(y) 9206 v.AddArg(z) 9207 return true 9208 } 9209 // match: (RSB x (SRL y z)) 9210 // cond: 9211 // result: (RSBshiftRLreg x y z) 9212 for { 9213 x := v.Args[0] 9214 v_1 := v.Args[1] 9215 if v_1.Op != OpARMSRL { 9216 break 9217 } 9218 y := v_1.Args[0] 9219 z := v_1.Args[1] 9220 v.reset(OpARMRSBshiftRLreg) 9221 v.AddArg(x) 9222 v.AddArg(y) 9223 v.AddArg(z) 9224 return true 9225 } 9226 // match: (RSB (SRL y z) x) 9227 // cond: 9228 // result: (SUBshiftRLreg x y z) 9229 for { 9230 v_0 := v.Args[0] 9231 if v_0.Op != OpARMSRL { 9232 break 9233 } 9234 y := v_0.Args[0] 9235 z := v_0.Args[1] 9236 x := v.Args[1] 9237 v.reset(OpARMSUBshiftRLreg) 9238 v.AddArg(x) 9239 v.AddArg(y) 9240 v.AddArg(z) 9241 return true 9242 } 9243 // match: (RSB x (SRA y z)) 9244 // cond: 9245 // result: (RSBshiftRAreg x y z) 9246 for { 9247 x := v.Args[0] 9248 v_1 := v.Args[1] 9249 if v_1.Op != OpARMSRA { 9250 break 9251 } 9252 y := v_1.Args[0] 9253 z := v_1.Args[1] 9254 v.reset(OpARMRSBshiftRAreg) 9255 v.AddArg(x) 9256 v.AddArg(y) 9257 v.AddArg(z) 9258 return true 9259 } 9260 // match: (RSB (SRA y z) x) 9261 // cond: 9262 // result: (SUBshiftRAreg x y z) 9263 for { 9264 v_0 := v.Args[0] 9265 if v_0.Op != OpARMSRA { 9266 break 9267 } 9268 y := v_0.Args[0] 9269 z := v_0.Args[1] 9270 x := v.Args[1] 9271 v.reset(OpARMSUBshiftRAreg) 9272 v.AddArg(x) 9273 v.AddArg(y) 9274 v.AddArg(z) 9275 return true 9276 } 9277 // match: (RSB x x) 9278 // cond: 9279 // result: (MOVWconst [0]) 9280 for { 9281 x := v.Args[0] 9282 if x != v.Args[1] { 9283 break 9284 } 9285 v.reset(OpARMMOVWconst) 9286 v.AuxInt = 0 9287 return true 9288 } 9289 return false 9290 } 9291 func rewriteValueARM_OpARMRSBSshiftLL(v *Value, config *Config) bool { 9292 b := v.Block 9293 _ = b 9294 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 9295 // cond: 9296 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 9297 for { 9298 d := v.AuxInt 9299 v_0 := v.Args[0] 9300 if v_0.Op != OpARMMOVWconst { 9301 break 9302 } 9303 c := v_0.AuxInt 9304 x := v.Args[1] 9305 v.reset(OpARMSUBSconst) 9306 v.AuxInt = c 9307 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9308 v0.AuxInt = d 9309 v0.AddArg(x) 9310 v.AddArg(v0) 9311 return true 9312 } 9313 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 9314 // cond: 9315 // result: (RSBSconst x [int64(uint32(c)<<uint64(d))]) 9316 for { 9317 d := v.AuxInt 9318 x := v.Args[0] 9319 v_1 := v.Args[1] 9320 if v_1.Op != OpARMMOVWconst { 9321 break 9322 } 9323 c := v_1.AuxInt 9324 v.reset(OpARMRSBSconst) 9325 v.AuxInt = int64(uint32(c) << uint64(d)) 9326 v.AddArg(x) 9327 return true 9328 } 9329 return false 9330 } 9331 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value, config *Config) bool { 9332 b := v.Block 9333 _ = b 9334 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 9335 // cond: 9336 // result: (SUBSconst [c] (SLL <x.Type> x y)) 9337 for { 9338 v_0 := v.Args[0] 9339 if v_0.Op != OpARMMOVWconst { 9340 break 9341 } 9342 c := v_0.AuxInt 9343 x := v.Args[1] 9344 y := v.Args[2] 9345 v.reset(OpARMSUBSconst) 9346 v.AuxInt = c 9347 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9348 v0.AddArg(x) 9349 v0.AddArg(y) 9350 v.AddArg(v0) 9351 return true 9352 } 9353 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 9354 // cond: 9355 // result: (RSBSshiftLL x y [c]) 9356 for { 9357 x := v.Args[0] 9358 y := v.Args[1] 9359 v_2 := v.Args[2] 9360 if v_2.Op != OpARMMOVWconst { 9361 break 9362 } 9363 c := v_2.AuxInt 9364 v.reset(OpARMRSBSshiftLL) 9365 v.AuxInt = c 9366 v.AddArg(x) 9367 v.AddArg(y) 9368 return true 9369 } 9370 return false 9371 } 9372 func rewriteValueARM_OpARMRSBSshiftRA(v *Value, config *Config) bool { 9373 b := v.Block 9374 _ = b 9375 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 9376 // cond: 9377 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 9378 for { 9379 d := v.AuxInt 9380 v_0 := v.Args[0] 9381 if v_0.Op != OpARMMOVWconst { 9382 break 9383 } 9384 c := v_0.AuxInt 9385 x := v.Args[1] 9386 v.reset(OpARMSUBSconst) 9387 v.AuxInt = c 9388 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9389 v0.AuxInt = d 9390 v0.AddArg(x) 9391 v.AddArg(v0) 9392 return true 9393 } 9394 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 9395 // cond: 9396 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 9397 for { 9398 d := v.AuxInt 9399 x := v.Args[0] 9400 v_1 := v.Args[1] 9401 if v_1.Op != OpARMMOVWconst { 9402 break 9403 } 9404 c := v_1.AuxInt 9405 v.reset(OpARMRSBSconst) 9406 v.AuxInt = int64(int32(c) >> uint64(d)) 9407 v.AddArg(x) 9408 return true 9409 } 9410 return false 9411 } 9412 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value, config *Config) bool { 9413 b := v.Block 9414 _ = b 9415 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 9416 // cond: 9417 // result: (SUBSconst [c] (SRA <x.Type> x y)) 9418 for { 9419 v_0 := v.Args[0] 9420 if v_0.Op != OpARMMOVWconst { 9421 break 9422 } 9423 c := v_0.AuxInt 9424 x := v.Args[1] 9425 y := v.Args[2] 9426 v.reset(OpARMSUBSconst) 9427 v.AuxInt = c 9428 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9429 v0.AddArg(x) 9430 v0.AddArg(y) 9431 v.AddArg(v0) 9432 return true 9433 } 9434 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 9435 // cond: 9436 // result: (RSBSshiftRA x y [c]) 9437 for { 9438 x := v.Args[0] 9439 y := v.Args[1] 9440 v_2 := v.Args[2] 9441 if v_2.Op != OpARMMOVWconst { 9442 break 9443 } 9444 c := v_2.AuxInt 9445 v.reset(OpARMRSBSshiftRA) 9446 v.AuxInt = c 9447 v.AddArg(x) 9448 v.AddArg(y) 9449 return true 9450 } 9451 return false 9452 } 9453 func rewriteValueARM_OpARMRSBSshiftRL(v *Value, config *Config) bool { 9454 b := v.Block 9455 _ = b 9456 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 9457 // cond: 9458 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 9459 for { 9460 d := v.AuxInt 9461 v_0 := v.Args[0] 9462 if v_0.Op != OpARMMOVWconst { 9463 break 9464 } 9465 c := v_0.AuxInt 9466 x := v.Args[1] 9467 v.reset(OpARMSUBSconst) 9468 v.AuxInt = c 9469 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9470 v0.AuxInt = d 9471 v0.AddArg(x) 9472 v.AddArg(v0) 9473 return true 9474 } 9475 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 9476 // cond: 9477 // result: (RSBSconst x [int64(uint32(c)>>uint64(d))]) 9478 for { 9479 d := v.AuxInt 9480 x := v.Args[0] 9481 v_1 := v.Args[1] 9482 if v_1.Op != OpARMMOVWconst { 9483 break 9484 } 9485 c := v_1.AuxInt 9486 v.reset(OpARMRSBSconst) 9487 v.AuxInt = int64(uint32(c) >> uint64(d)) 9488 v.AddArg(x) 9489 return true 9490 } 9491 return false 9492 } 9493 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value, config *Config) bool { 9494 b := v.Block 9495 _ = b 9496 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 9497 // cond: 9498 // result: (SUBSconst [c] (SRL <x.Type> x y)) 9499 for { 9500 v_0 := v.Args[0] 9501 if v_0.Op != OpARMMOVWconst { 9502 break 9503 } 9504 c := v_0.AuxInt 9505 x := v.Args[1] 9506 y := v.Args[2] 9507 v.reset(OpARMSUBSconst) 9508 v.AuxInt = c 9509 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9510 v0.AddArg(x) 9511 v0.AddArg(y) 9512 v.AddArg(v0) 9513 return true 9514 } 9515 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 9516 // cond: 9517 // result: (RSBSshiftRL x y [c]) 9518 for { 9519 x := v.Args[0] 9520 y := v.Args[1] 9521 v_2 := v.Args[2] 9522 if v_2.Op != OpARMMOVWconst { 9523 break 9524 } 9525 c := v_2.AuxInt 9526 v.reset(OpARMRSBSshiftRL) 9527 v.AuxInt = c 9528 v.AddArg(x) 9529 v.AddArg(y) 9530 return true 9531 } 9532 return false 9533 } 9534 func rewriteValueARM_OpARMRSBconst(v *Value, config *Config) bool { 9535 b := v.Block 9536 _ = b 9537 // match: (RSBconst [c] (MOVWconst [d])) 9538 // cond: 9539 // result: (MOVWconst [int64(int32(c-d))]) 9540 for { 9541 c := v.AuxInt 9542 v_0 := v.Args[0] 9543 if v_0.Op != OpARMMOVWconst { 9544 break 9545 } 9546 d := v_0.AuxInt 9547 v.reset(OpARMMOVWconst) 9548 v.AuxInt = int64(int32(c - d)) 9549 return true 9550 } 9551 // match: (RSBconst [c] (RSBconst [d] x)) 9552 // cond: 9553 // result: (ADDconst [int64(int32(c-d))] x) 9554 for { 9555 c := v.AuxInt 9556 v_0 := v.Args[0] 9557 if v_0.Op != OpARMRSBconst { 9558 break 9559 } 9560 d := v_0.AuxInt 9561 x := v_0.Args[0] 9562 v.reset(OpARMADDconst) 9563 v.AuxInt = int64(int32(c - d)) 9564 v.AddArg(x) 9565 return true 9566 } 9567 // match: (RSBconst [c] (ADDconst [d] x)) 9568 // cond: 9569 // result: (RSBconst [int64(int32(c-d))] x) 9570 for { 9571 c := v.AuxInt 9572 v_0 := v.Args[0] 9573 if v_0.Op != OpARMADDconst { 9574 break 9575 } 9576 d := v_0.AuxInt 9577 x := v_0.Args[0] 9578 v.reset(OpARMRSBconst) 9579 v.AuxInt = int64(int32(c - d)) 9580 v.AddArg(x) 9581 return true 9582 } 9583 // match: (RSBconst [c] (SUBconst [d] x)) 9584 // cond: 9585 // result: (RSBconst [int64(int32(c+d))] x) 9586 for { 9587 c := v.AuxInt 9588 v_0 := v.Args[0] 9589 if v_0.Op != OpARMSUBconst { 9590 break 9591 } 9592 d := v_0.AuxInt 9593 x := v_0.Args[0] 9594 v.reset(OpARMRSBconst) 9595 v.AuxInt = int64(int32(c + d)) 9596 v.AddArg(x) 9597 return true 9598 } 9599 return false 9600 } 9601 func rewriteValueARM_OpARMRSBshiftLL(v *Value, config *Config) bool { 9602 b := v.Block 9603 _ = b 9604 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 9605 // cond: 9606 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 9607 for { 9608 d := v.AuxInt 9609 v_0 := v.Args[0] 9610 if v_0.Op != OpARMMOVWconst { 9611 break 9612 } 9613 c := v_0.AuxInt 9614 x := v.Args[1] 9615 v.reset(OpARMSUBconst) 9616 v.AuxInt = c 9617 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9618 v0.AuxInt = d 9619 v0.AddArg(x) 9620 v.AddArg(v0) 9621 return true 9622 } 9623 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 9624 // cond: 9625 // result: (RSBconst x [int64(uint32(c)<<uint64(d))]) 9626 for { 9627 d := v.AuxInt 9628 x := v.Args[0] 9629 v_1 := v.Args[1] 9630 if v_1.Op != OpARMMOVWconst { 9631 break 9632 } 9633 c := v_1.AuxInt 9634 v.reset(OpARMRSBconst) 9635 v.AuxInt = int64(uint32(c) << uint64(d)) 9636 v.AddArg(x) 9637 return true 9638 } 9639 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 9640 // cond: c==d 9641 // result: (MOVWconst [0]) 9642 for { 9643 d := v.AuxInt 9644 x := v.Args[0] 9645 v_1 := v.Args[1] 9646 if v_1.Op != OpARMSLLconst { 9647 break 9648 } 9649 c := v_1.AuxInt 9650 if x != v_1.Args[0] { 9651 break 9652 } 9653 if !(c == d) { 9654 break 9655 } 9656 v.reset(OpARMMOVWconst) 9657 v.AuxInt = 0 9658 return true 9659 } 9660 return false 9661 } 9662 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value, config *Config) bool { 9663 b := v.Block 9664 _ = b 9665 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 9666 // cond: 9667 // result: (SUBconst [c] (SLL <x.Type> x y)) 9668 for { 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 y := v.Args[2] 9676 v.reset(OpARMSUBconst) 9677 v.AuxInt = c 9678 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9679 v0.AddArg(x) 9680 v0.AddArg(y) 9681 v.AddArg(v0) 9682 return true 9683 } 9684 // match: (RSBshiftLLreg x y (MOVWconst [c])) 9685 // cond: 9686 // result: (RSBshiftLL x y [c]) 9687 for { 9688 x := v.Args[0] 9689 y := v.Args[1] 9690 v_2 := v.Args[2] 9691 if v_2.Op != OpARMMOVWconst { 9692 break 9693 } 9694 c := v_2.AuxInt 9695 v.reset(OpARMRSBshiftLL) 9696 v.AuxInt = c 9697 v.AddArg(x) 9698 v.AddArg(y) 9699 return true 9700 } 9701 return false 9702 } 9703 func rewriteValueARM_OpARMRSBshiftRA(v *Value, config *Config) bool { 9704 b := v.Block 9705 _ = b 9706 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 9707 // cond: 9708 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 9709 for { 9710 d := v.AuxInt 9711 v_0 := v.Args[0] 9712 if v_0.Op != OpARMMOVWconst { 9713 break 9714 } 9715 c := v_0.AuxInt 9716 x := v.Args[1] 9717 v.reset(OpARMSUBconst) 9718 v.AuxInt = c 9719 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9720 v0.AuxInt = d 9721 v0.AddArg(x) 9722 v.AddArg(v0) 9723 return true 9724 } 9725 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 9726 // cond: 9727 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 9728 for { 9729 d := v.AuxInt 9730 x := v.Args[0] 9731 v_1 := v.Args[1] 9732 if v_1.Op != OpARMMOVWconst { 9733 break 9734 } 9735 c := v_1.AuxInt 9736 v.reset(OpARMRSBconst) 9737 v.AuxInt = int64(int32(c) >> uint64(d)) 9738 v.AddArg(x) 9739 return true 9740 } 9741 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 9742 // cond: c==d 9743 // result: (MOVWconst [0]) 9744 for { 9745 d := v.AuxInt 9746 x := v.Args[0] 9747 v_1 := v.Args[1] 9748 if v_1.Op != OpARMSRAconst { 9749 break 9750 } 9751 c := v_1.AuxInt 9752 if x != v_1.Args[0] { 9753 break 9754 } 9755 if !(c == d) { 9756 break 9757 } 9758 v.reset(OpARMMOVWconst) 9759 v.AuxInt = 0 9760 return true 9761 } 9762 return false 9763 } 9764 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value, config *Config) bool { 9765 b := v.Block 9766 _ = b 9767 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 9768 // cond: 9769 // result: (SUBconst [c] (SRA <x.Type> x y)) 9770 for { 9771 v_0 := v.Args[0] 9772 if v_0.Op != OpARMMOVWconst { 9773 break 9774 } 9775 c := v_0.AuxInt 9776 x := v.Args[1] 9777 y := v.Args[2] 9778 v.reset(OpARMSUBconst) 9779 v.AuxInt = c 9780 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9781 v0.AddArg(x) 9782 v0.AddArg(y) 9783 v.AddArg(v0) 9784 return true 9785 } 9786 // match: (RSBshiftRAreg x y (MOVWconst [c])) 9787 // cond: 9788 // result: (RSBshiftRA x y [c]) 9789 for { 9790 x := v.Args[0] 9791 y := v.Args[1] 9792 v_2 := v.Args[2] 9793 if v_2.Op != OpARMMOVWconst { 9794 break 9795 } 9796 c := v_2.AuxInt 9797 v.reset(OpARMRSBshiftRA) 9798 v.AuxInt = c 9799 v.AddArg(x) 9800 v.AddArg(y) 9801 return true 9802 } 9803 return false 9804 } 9805 func rewriteValueARM_OpARMRSBshiftRL(v *Value, config *Config) bool { 9806 b := v.Block 9807 _ = b 9808 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 9809 // cond: 9810 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 9811 for { 9812 d := v.AuxInt 9813 v_0 := v.Args[0] 9814 if v_0.Op != OpARMMOVWconst { 9815 break 9816 } 9817 c := v_0.AuxInt 9818 x := v.Args[1] 9819 v.reset(OpARMSUBconst) 9820 v.AuxInt = c 9821 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9822 v0.AuxInt = d 9823 v0.AddArg(x) 9824 v.AddArg(v0) 9825 return true 9826 } 9827 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 9828 // cond: 9829 // result: (RSBconst x [int64(uint32(c)>>uint64(d))]) 9830 for { 9831 d := v.AuxInt 9832 x := v.Args[0] 9833 v_1 := v.Args[1] 9834 if v_1.Op != OpARMMOVWconst { 9835 break 9836 } 9837 c := v_1.AuxInt 9838 v.reset(OpARMRSBconst) 9839 v.AuxInt = int64(uint32(c) >> uint64(d)) 9840 v.AddArg(x) 9841 return true 9842 } 9843 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 9844 // cond: c==d 9845 // result: (MOVWconst [0]) 9846 for { 9847 d := v.AuxInt 9848 x := v.Args[0] 9849 v_1 := v.Args[1] 9850 if v_1.Op != OpARMSRLconst { 9851 break 9852 } 9853 c := v_1.AuxInt 9854 if x != v_1.Args[0] { 9855 break 9856 } 9857 if !(c == d) { 9858 break 9859 } 9860 v.reset(OpARMMOVWconst) 9861 v.AuxInt = 0 9862 return true 9863 } 9864 return false 9865 } 9866 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value, config *Config) bool { 9867 b := v.Block 9868 _ = b 9869 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 9870 // cond: 9871 // result: (SUBconst [c] (SRL <x.Type> x y)) 9872 for { 9873 v_0 := v.Args[0] 9874 if v_0.Op != OpARMMOVWconst { 9875 break 9876 } 9877 c := v_0.AuxInt 9878 x := v.Args[1] 9879 y := v.Args[2] 9880 v.reset(OpARMSUBconst) 9881 v.AuxInt = c 9882 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9883 v0.AddArg(x) 9884 v0.AddArg(y) 9885 v.AddArg(v0) 9886 return true 9887 } 9888 // match: (RSBshiftRLreg x y (MOVWconst [c])) 9889 // cond: 9890 // result: (RSBshiftRL x y [c]) 9891 for { 9892 x := v.Args[0] 9893 y := v.Args[1] 9894 v_2 := v.Args[2] 9895 if v_2.Op != OpARMMOVWconst { 9896 break 9897 } 9898 c := v_2.AuxInt 9899 v.reset(OpARMRSBshiftRL) 9900 v.AuxInt = c 9901 v.AddArg(x) 9902 v.AddArg(y) 9903 return true 9904 } 9905 return false 9906 } 9907 func rewriteValueARM_OpARMRSCconst(v *Value, config *Config) bool { 9908 b := v.Block 9909 _ = b 9910 // match: (RSCconst [c] (ADDconst [d] x) flags) 9911 // cond: 9912 // result: (RSCconst [int64(int32(c-d))] x flags) 9913 for { 9914 c := v.AuxInt 9915 v_0 := v.Args[0] 9916 if v_0.Op != OpARMADDconst { 9917 break 9918 } 9919 d := v_0.AuxInt 9920 x := v_0.Args[0] 9921 flags := v.Args[1] 9922 v.reset(OpARMRSCconst) 9923 v.AuxInt = int64(int32(c - d)) 9924 v.AddArg(x) 9925 v.AddArg(flags) 9926 return true 9927 } 9928 // match: (RSCconst [c] (SUBconst [d] x) flags) 9929 // cond: 9930 // result: (RSCconst [int64(int32(c+d))] x flags) 9931 for { 9932 c := v.AuxInt 9933 v_0 := v.Args[0] 9934 if v_0.Op != OpARMSUBconst { 9935 break 9936 } 9937 d := v_0.AuxInt 9938 x := v_0.Args[0] 9939 flags := v.Args[1] 9940 v.reset(OpARMRSCconst) 9941 v.AuxInt = int64(int32(c + d)) 9942 v.AddArg(x) 9943 v.AddArg(flags) 9944 return true 9945 } 9946 return false 9947 } 9948 func rewriteValueARM_OpARMRSCshiftLL(v *Value, config *Config) bool { 9949 b := v.Block 9950 _ = b 9951 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 9952 // cond: 9953 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 9954 for { 9955 d := v.AuxInt 9956 v_0 := v.Args[0] 9957 if v_0.Op != OpARMMOVWconst { 9958 break 9959 } 9960 c := v_0.AuxInt 9961 x := v.Args[1] 9962 flags := v.Args[2] 9963 v.reset(OpARMSBCconst) 9964 v.AuxInt = c 9965 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9966 v0.AuxInt = d 9967 v0.AddArg(x) 9968 v.AddArg(v0) 9969 v.AddArg(flags) 9970 return true 9971 } 9972 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 9973 // cond: 9974 // result: (RSCconst x [int64(uint32(c)<<uint64(d))] flags) 9975 for { 9976 d := v.AuxInt 9977 x := v.Args[0] 9978 v_1 := v.Args[1] 9979 if v_1.Op != OpARMMOVWconst { 9980 break 9981 } 9982 c := v_1.AuxInt 9983 flags := v.Args[2] 9984 v.reset(OpARMRSCconst) 9985 v.AuxInt = int64(uint32(c) << uint64(d)) 9986 v.AddArg(x) 9987 v.AddArg(flags) 9988 return true 9989 } 9990 return false 9991 } 9992 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value, config *Config) bool { 9993 b := v.Block 9994 _ = b 9995 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 9996 // cond: 9997 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 9998 for { 9999 v_0 := v.Args[0] 10000 if v_0.Op != OpARMMOVWconst { 10001 break 10002 } 10003 c := v_0.AuxInt 10004 x := v.Args[1] 10005 y := v.Args[2] 10006 flags := v.Args[3] 10007 v.reset(OpARMSBCconst) 10008 v.AuxInt = c 10009 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10010 v0.AddArg(x) 10011 v0.AddArg(y) 10012 v.AddArg(v0) 10013 v.AddArg(flags) 10014 return true 10015 } 10016 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 10017 // cond: 10018 // result: (RSCshiftLL x y [c] flags) 10019 for { 10020 x := v.Args[0] 10021 y := v.Args[1] 10022 v_2 := v.Args[2] 10023 if v_2.Op != OpARMMOVWconst { 10024 break 10025 } 10026 c := v_2.AuxInt 10027 flags := v.Args[3] 10028 v.reset(OpARMRSCshiftLL) 10029 v.AuxInt = c 10030 v.AddArg(x) 10031 v.AddArg(y) 10032 v.AddArg(flags) 10033 return true 10034 } 10035 return false 10036 } 10037 func rewriteValueARM_OpARMRSCshiftRA(v *Value, config *Config) bool { 10038 b := v.Block 10039 _ = b 10040 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 10041 // cond: 10042 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 10043 for { 10044 d := v.AuxInt 10045 v_0 := v.Args[0] 10046 if v_0.Op != OpARMMOVWconst { 10047 break 10048 } 10049 c := v_0.AuxInt 10050 x := v.Args[1] 10051 flags := v.Args[2] 10052 v.reset(OpARMSBCconst) 10053 v.AuxInt = c 10054 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10055 v0.AuxInt = d 10056 v0.AddArg(x) 10057 v.AddArg(v0) 10058 v.AddArg(flags) 10059 return true 10060 } 10061 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 10062 // cond: 10063 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 10064 for { 10065 d := v.AuxInt 10066 x := v.Args[0] 10067 v_1 := v.Args[1] 10068 if v_1.Op != OpARMMOVWconst { 10069 break 10070 } 10071 c := v_1.AuxInt 10072 flags := v.Args[2] 10073 v.reset(OpARMRSCconst) 10074 v.AuxInt = int64(int32(c) >> uint64(d)) 10075 v.AddArg(x) 10076 v.AddArg(flags) 10077 return true 10078 } 10079 return false 10080 } 10081 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value, config *Config) bool { 10082 b := v.Block 10083 _ = b 10084 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 10085 // cond: 10086 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 10087 for { 10088 v_0 := v.Args[0] 10089 if v_0.Op != OpARMMOVWconst { 10090 break 10091 } 10092 c := v_0.AuxInt 10093 x := v.Args[1] 10094 y := v.Args[2] 10095 flags := v.Args[3] 10096 v.reset(OpARMSBCconst) 10097 v.AuxInt = c 10098 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10099 v0.AddArg(x) 10100 v0.AddArg(y) 10101 v.AddArg(v0) 10102 v.AddArg(flags) 10103 return true 10104 } 10105 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 10106 // cond: 10107 // result: (RSCshiftRA x y [c] flags) 10108 for { 10109 x := v.Args[0] 10110 y := v.Args[1] 10111 v_2 := v.Args[2] 10112 if v_2.Op != OpARMMOVWconst { 10113 break 10114 } 10115 c := v_2.AuxInt 10116 flags := v.Args[3] 10117 v.reset(OpARMRSCshiftRA) 10118 v.AuxInt = c 10119 v.AddArg(x) 10120 v.AddArg(y) 10121 v.AddArg(flags) 10122 return true 10123 } 10124 return false 10125 } 10126 func rewriteValueARM_OpARMRSCshiftRL(v *Value, config *Config) bool { 10127 b := v.Block 10128 _ = b 10129 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 10130 // cond: 10131 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 10132 for { 10133 d := v.AuxInt 10134 v_0 := v.Args[0] 10135 if v_0.Op != OpARMMOVWconst { 10136 break 10137 } 10138 c := v_0.AuxInt 10139 x := v.Args[1] 10140 flags := v.Args[2] 10141 v.reset(OpARMSBCconst) 10142 v.AuxInt = c 10143 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10144 v0.AuxInt = d 10145 v0.AddArg(x) 10146 v.AddArg(v0) 10147 v.AddArg(flags) 10148 return true 10149 } 10150 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 10151 // cond: 10152 // result: (RSCconst x [int64(uint32(c)>>uint64(d))] flags) 10153 for { 10154 d := v.AuxInt 10155 x := v.Args[0] 10156 v_1 := v.Args[1] 10157 if v_1.Op != OpARMMOVWconst { 10158 break 10159 } 10160 c := v_1.AuxInt 10161 flags := v.Args[2] 10162 v.reset(OpARMRSCconst) 10163 v.AuxInt = int64(uint32(c) >> uint64(d)) 10164 v.AddArg(x) 10165 v.AddArg(flags) 10166 return true 10167 } 10168 return false 10169 } 10170 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value, config *Config) bool { 10171 b := v.Block 10172 _ = b 10173 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 10174 // cond: 10175 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 10176 for { 10177 v_0 := v.Args[0] 10178 if v_0.Op != OpARMMOVWconst { 10179 break 10180 } 10181 c := v_0.AuxInt 10182 x := v.Args[1] 10183 y := v.Args[2] 10184 flags := v.Args[3] 10185 v.reset(OpARMSBCconst) 10186 v.AuxInt = c 10187 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10188 v0.AddArg(x) 10189 v0.AddArg(y) 10190 v.AddArg(v0) 10191 v.AddArg(flags) 10192 return true 10193 } 10194 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 10195 // cond: 10196 // result: (RSCshiftRL x y [c] flags) 10197 for { 10198 x := v.Args[0] 10199 y := v.Args[1] 10200 v_2 := v.Args[2] 10201 if v_2.Op != OpARMMOVWconst { 10202 break 10203 } 10204 c := v_2.AuxInt 10205 flags := v.Args[3] 10206 v.reset(OpARMRSCshiftRL) 10207 v.AuxInt = c 10208 v.AddArg(x) 10209 v.AddArg(y) 10210 v.AddArg(flags) 10211 return true 10212 } 10213 return false 10214 } 10215 func rewriteValueARM_OpARMSBC(v *Value, config *Config) bool { 10216 b := v.Block 10217 _ = b 10218 // match: (SBC (MOVWconst [c]) x flags) 10219 // cond: 10220 // result: (RSCconst [c] x flags) 10221 for { 10222 v_0 := v.Args[0] 10223 if v_0.Op != OpARMMOVWconst { 10224 break 10225 } 10226 c := v_0.AuxInt 10227 x := v.Args[1] 10228 flags := v.Args[2] 10229 v.reset(OpARMRSCconst) 10230 v.AuxInt = c 10231 v.AddArg(x) 10232 v.AddArg(flags) 10233 return true 10234 } 10235 // match: (SBC x (MOVWconst [c]) flags) 10236 // cond: 10237 // result: (SBCconst [c] x flags) 10238 for { 10239 x := v.Args[0] 10240 v_1 := v.Args[1] 10241 if v_1.Op != OpARMMOVWconst { 10242 break 10243 } 10244 c := v_1.AuxInt 10245 flags := v.Args[2] 10246 v.reset(OpARMSBCconst) 10247 v.AuxInt = c 10248 v.AddArg(x) 10249 v.AddArg(flags) 10250 return true 10251 } 10252 // match: (SBC x (SLLconst [c] y) flags) 10253 // cond: 10254 // result: (SBCshiftLL x y [c] flags) 10255 for { 10256 x := v.Args[0] 10257 v_1 := v.Args[1] 10258 if v_1.Op != OpARMSLLconst { 10259 break 10260 } 10261 c := v_1.AuxInt 10262 y := v_1.Args[0] 10263 flags := v.Args[2] 10264 v.reset(OpARMSBCshiftLL) 10265 v.AuxInt = c 10266 v.AddArg(x) 10267 v.AddArg(y) 10268 v.AddArg(flags) 10269 return true 10270 } 10271 // match: (SBC (SLLconst [c] y) x flags) 10272 // cond: 10273 // result: (RSCshiftLL x y [c] flags) 10274 for { 10275 v_0 := v.Args[0] 10276 if v_0.Op != OpARMSLLconst { 10277 break 10278 } 10279 c := v_0.AuxInt 10280 y := v_0.Args[0] 10281 x := v.Args[1] 10282 flags := v.Args[2] 10283 v.reset(OpARMRSCshiftLL) 10284 v.AuxInt = c 10285 v.AddArg(x) 10286 v.AddArg(y) 10287 v.AddArg(flags) 10288 return true 10289 } 10290 // match: (SBC x (SRLconst [c] y) flags) 10291 // cond: 10292 // result: (SBCshiftRL x y [c] flags) 10293 for { 10294 x := v.Args[0] 10295 v_1 := v.Args[1] 10296 if v_1.Op != OpARMSRLconst { 10297 break 10298 } 10299 c := v_1.AuxInt 10300 y := v_1.Args[0] 10301 flags := v.Args[2] 10302 v.reset(OpARMSBCshiftRL) 10303 v.AuxInt = c 10304 v.AddArg(x) 10305 v.AddArg(y) 10306 v.AddArg(flags) 10307 return true 10308 } 10309 // match: (SBC (SRLconst [c] y) x flags) 10310 // cond: 10311 // result: (RSCshiftRL x y [c] flags) 10312 for { 10313 v_0 := v.Args[0] 10314 if v_0.Op != OpARMSRLconst { 10315 break 10316 } 10317 c := v_0.AuxInt 10318 y := v_0.Args[0] 10319 x := v.Args[1] 10320 flags := v.Args[2] 10321 v.reset(OpARMRSCshiftRL) 10322 v.AuxInt = c 10323 v.AddArg(x) 10324 v.AddArg(y) 10325 v.AddArg(flags) 10326 return true 10327 } 10328 // match: (SBC x (SRAconst [c] y) flags) 10329 // cond: 10330 // result: (SBCshiftRA x y [c] flags) 10331 for { 10332 x := v.Args[0] 10333 v_1 := v.Args[1] 10334 if v_1.Op != OpARMSRAconst { 10335 break 10336 } 10337 c := v_1.AuxInt 10338 y := v_1.Args[0] 10339 flags := v.Args[2] 10340 v.reset(OpARMSBCshiftRA) 10341 v.AuxInt = c 10342 v.AddArg(x) 10343 v.AddArg(y) 10344 v.AddArg(flags) 10345 return true 10346 } 10347 // match: (SBC (SRAconst [c] y) x flags) 10348 // cond: 10349 // result: (RSCshiftRA x y [c] flags) 10350 for { 10351 v_0 := v.Args[0] 10352 if v_0.Op != OpARMSRAconst { 10353 break 10354 } 10355 c := v_0.AuxInt 10356 y := v_0.Args[0] 10357 x := v.Args[1] 10358 flags := v.Args[2] 10359 v.reset(OpARMRSCshiftRA) 10360 v.AuxInt = c 10361 v.AddArg(x) 10362 v.AddArg(y) 10363 v.AddArg(flags) 10364 return true 10365 } 10366 // match: (SBC x (SLL y z) flags) 10367 // cond: 10368 // result: (SBCshiftLLreg x y z flags) 10369 for { 10370 x := v.Args[0] 10371 v_1 := v.Args[1] 10372 if v_1.Op != OpARMSLL { 10373 break 10374 } 10375 y := v_1.Args[0] 10376 z := v_1.Args[1] 10377 flags := v.Args[2] 10378 v.reset(OpARMSBCshiftLLreg) 10379 v.AddArg(x) 10380 v.AddArg(y) 10381 v.AddArg(z) 10382 v.AddArg(flags) 10383 return true 10384 } 10385 // match: (SBC (SLL y z) x flags) 10386 // cond: 10387 // result: (RSCshiftLLreg x y z flags) 10388 for { 10389 v_0 := v.Args[0] 10390 if v_0.Op != OpARMSLL { 10391 break 10392 } 10393 y := v_0.Args[0] 10394 z := v_0.Args[1] 10395 x := v.Args[1] 10396 flags := v.Args[2] 10397 v.reset(OpARMRSCshiftLLreg) 10398 v.AddArg(x) 10399 v.AddArg(y) 10400 v.AddArg(z) 10401 v.AddArg(flags) 10402 return true 10403 } 10404 // match: (SBC x (SRL y z) flags) 10405 // cond: 10406 // result: (SBCshiftRLreg x y z flags) 10407 for { 10408 x := v.Args[0] 10409 v_1 := v.Args[1] 10410 if v_1.Op != OpARMSRL { 10411 break 10412 } 10413 y := v_1.Args[0] 10414 z := v_1.Args[1] 10415 flags := v.Args[2] 10416 v.reset(OpARMSBCshiftRLreg) 10417 v.AddArg(x) 10418 v.AddArg(y) 10419 v.AddArg(z) 10420 v.AddArg(flags) 10421 return true 10422 } 10423 // match: (SBC (SRL y z) x flags) 10424 // cond: 10425 // result: (RSCshiftRLreg x y z flags) 10426 for { 10427 v_0 := v.Args[0] 10428 if v_0.Op != OpARMSRL { 10429 break 10430 } 10431 y := v_0.Args[0] 10432 z := v_0.Args[1] 10433 x := v.Args[1] 10434 flags := v.Args[2] 10435 v.reset(OpARMRSCshiftRLreg) 10436 v.AddArg(x) 10437 v.AddArg(y) 10438 v.AddArg(z) 10439 v.AddArg(flags) 10440 return true 10441 } 10442 // match: (SBC x (SRA y z) flags) 10443 // cond: 10444 // result: (SBCshiftRAreg x y z flags) 10445 for { 10446 x := v.Args[0] 10447 v_1 := v.Args[1] 10448 if v_1.Op != OpARMSRA { 10449 break 10450 } 10451 y := v_1.Args[0] 10452 z := v_1.Args[1] 10453 flags := v.Args[2] 10454 v.reset(OpARMSBCshiftRAreg) 10455 v.AddArg(x) 10456 v.AddArg(y) 10457 v.AddArg(z) 10458 v.AddArg(flags) 10459 return true 10460 } 10461 // match: (SBC (SRA y z) x flags) 10462 // cond: 10463 // result: (RSCshiftRAreg x y z flags) 10464 for { 10465 v_0 := v.Args[0] 10466 if v_0.Op != OpARMSRA { 10467 break 10468 } 10469 y := v_0.Args[0] 10470 z := v_0.Args[1] 10471 x := v.Args[1] 10472 flags := v.Args[2] 10473 v.reset(OpARMRSCshiftRAreg) 10474 v.AddArg(x) 10475 v.AddArg(y) 10476 v.AddArg(z) 10477 v.AddArg(flags) 10478 return true 10479 } 10480 return false 10481 } 10482 func rewriteValueARM_OpARMSBCconst(v *Value, config *Config) bool { 10483 b := v.Block 10484 _ = b 10485 // match: (SBCconst [c] (ADDconst [d] x) flags) 10486 // cond: 10487 // result: (SBCconst [int64(int32(c-d))] x flags) 10488 for { 10489 c := v.AuxInt 10490 v_0 := v.Args[0] 10491 if v_0.Op != OpARMADDconst { 10492 break 10493 } 10494 d := v_0.AuxInt 10495 x := v_0.Args[0] 10496 flags := v.Args[1] 10497 v.reset(OpARMSBCconst) 10498 v.AuxInt = int64(int32(c - d)) 10499 v.AddArg(x) 10500 v.AddArg(flags) 10501 return true 10502 } 10503 // match: (SBCconst [c] (SUBconst [d] x) flags) 10504 // cond: 10505 // result: (SBCconst [int64(int32(c+d))] x flags) 10506 for { 10507 c := v.AuxInt 10508 v_0 := v.Args[0] 10509 if v_0.Op != OpARMSUBconst { 10510 break 10511 } 10512 d := v_0.AuxInt 10513 x := v_0.Args[0] 10514 flags := v.Args[1] 10515 v.reset(OpARMSBCconst) 10516 v.AuxInt = int64(int32(c + d)) 10517 v.AddArg(x) 10518 v.AddArg(flags) 10519 return true 10520 } 10521 return false 10522 } 10523 func rewriteValueARM_OpARMSBCshiftLL(v *Value, config *Config) bool { 10524 b := v.Block 10525 _ = b 10526 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 10527 // cond: 10528 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 10529 for { 10530 d := v.AuxInt 10531 v_0 := v.Args[0] 10532 if v_0.Op != OpARMMOVWconst { 10533 break 10534 } 10535 c := v_0.AuxInt 10536 x := v.Args[1] 10537 flags := v.Args[2] 10538 v.reset(OpARMRSCconst) 10539 v.AuxInt = c 10540 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10541 v0.AuxInt = d 10542 v0.AddArg(x) 10543 v.AddArg(v0) 10544 v.AddArg(flags) 10545 return true 10546 } 10547 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 10548 // cond: 10549 // result: (SBCconst x [int64(uint32(c)<<uint64(d))] flags) 10550 for { 10551 d := v.AuxInt 10552 x := v.Args[0] 10553 v_1 := v.Args[1] 10554 if v_1.Op != OpARMMOVWconst { 10555 break 10556 } 10557 c := v_1.AuxInt 10558 flags := v.Args[2] 10559 v.reset(OpARMSBCconst) 10560 v.AuxInt = int64(uint32(c) << uint64(d)) 10561 v.AddArg(x) 10562 v.AddArg(flags) 10563 return true 10564 } 10565 return false 10566 } 10567 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value, config *Config) bool { 10568 b := v.Block 10569 _ = b 10570 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 10571 // cond: 10572 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 10573 for { 10574 v_0 := v.Args[0] 10575 if v_0.Op != OpARMMOVWconst { 10576 break 10577 } 10578 c := v_0.AuxInt 10579 x := v.Args[1] 10580 y := v.Args[2] 10581 flags := v.Args[3] 10582 v.reset(OpARMRSCconst) 10583 v.AuxInt = c 10584 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10585 v0.AddArg(x) 10586 v0.AddArg(y) 10587 v.AddArg(v0) 10588 v.AddArg(flags) 10589 return true 10590 } 10591 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 10592 // cond: 10593 // result: (SBCshiftLL x y [c] flags) 10594 for { 10595 x := v.Args[0] 10596 y := v.Args[1] 10597 v_2 := v.Args[2] 10598 if v_2.Op != OpARMMOVWconst { 10599 break 10600 } 10601 c := v_2.AuxInt 10602 flags := v.Args[3] 10603 v.reset(OpARMSBCshiftLL) 10604 v.AuxInt = c 10605 v.AddArg(x) 10606 v.AddArg(y) 10607 v.AddArg(flags) 10608 return true 10609 } 10610 return false 10611 } 10612 func rewriteValueARM_OpARMSBCshiftRA(v *Value, config *Config) bool { 10613 b := v.Block 10614 _ = b 10615 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 10616 // cond: 10617 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 10618 for { 10619 d := v.AuxInt 10620 v_0 := v.Args[0] 10621 if v_0.Op != OpARMMOVWconst { 10622 break 10623 } 10624 c := v_0.AuxInt 10625 x := v.Args[1] 10626 flags := v.Args[2] 10627 v.reset(OpARMRSCconst) 10628 v.AuxInt = c 10629 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10630 v0.AuxInt = d 10631 v0.AddArg(x) 10632 v.AddArg(v0) 10633 v.AddArg(flags) 10634 return true 10635 } 10636 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 10637 // cond: 10638 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 10639 for { 10640 d := v.AuxInt 10641 x := v.Args[0] 10642 v_1 := v.Args[1] 10643 if v_1.Op != OpARMMOVWconst { 10644 break 10645 } 10646 c := v_1.AuxInt 10647 flags := v.Args[2] 10648 v.reset(OpARMSBCconst) 10649 v.AuxInt = int64(int32(c) >> uint64(d)) 10650 v.AddArg(x) 10651 v.AddArg(flags) 10652 return true 10653 } 10654 return false 10655 } 10656 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value, config *Config) bool { 10657 b := v.Block 10658 _ = b 10659 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 10660 // cond: 10661 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 10662 for { 10663 v_0 := v.Args[0] 10664 if v_0.Op != OpARMMOVWconst { 10665 break 10666 } 10667 c := v_0.AuxInt 10668 x := v.Args[1] 10669 y := v.Args[2] 10670 flags := v.Args[3] 10671 v.reset(OpARMRSCconst) 10672 v.AuxInt = c 10673 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10674 v0.AddArg(x) 10675 v0.AddArg(y) 10676 v.AddArg(v0) 10677 v.AddArg(flags) 10678 return true 10679 } 10680 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 10681 // cond: 10682 // result: (SBCshiftRA x y [c] flags) 10683 for { 10684 x := v.Args[0] 10685 y := v.Args[1] 10686 v_2 := v.Args[2] 10687 if v_2.Op != OpARMMOVWconst { 10688 break 10689 } 10690 c := v_2.AuxInt 10691 flags := v.Args[3] 10692 v.reset(OpARMSBCshiftRA) 10693 v.AuxInt = c 10694 v.AddArg(x) 10695 v.AddArg(y) 10696 v.AddArg(flags) 10697 return true 10698 } 10699 return false 10700 } 10701 func rewriteValueARM_OpARMSBCshiftRL(v *Value, config *Config) bool { 10702 b := v.Block 10703 _ = b 10704 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 10705 // cond: 10706 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 10707 for { 10708 d := v.AuxInt 10709 v_0 := v.Args[0] 10710 if v_0.Op != OpARMMOVWconst { 10711 break 10712 } 10713 c := v_0.AuxInt 10714 x := v.Args[1] 10715 flags := v.Args[2] 10716 v.reset(OpARMRSCconst) 10717 v.AuxInt = c 10718 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10719 v0.AuxInt = d 10720 v0.AddArg(x) 10721 v.AddArg(v0) 10722 v.AddArg(flags) 10723 return true 10724 } 10725 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 10726 // cond: 10727 // result: (SBCconst x [int64(uint32(c)>>uint64(d))] flags) 10728 for { 10729 d := v.AuxInt 10730 x := v.Args[0] 10731 v_1 := v.Args[1] 10732 if v_1.Op != OpARMMOVWconst { 10733 break 10734 } 10735 c := v_1.AuxInt 10736 flags := v.Args[2] 10737 v.reset(OpARMSBCconst) 10738 v.AuxInt = int64(uint32(c) >> uint64(d)) 10739 v.AddArg(x) 10740 v.AddArg(flags) 10741 return true 10742 } 10743 return false 10744 } 10745 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value, config *Config) bool { 10746 b := v.Block 10747 _ = b 10748 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 10749 // cond: 10750 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 10751 for { 10752 v_0 := v.Args[0] 10753 if v_0.Op != OpARMMOVWconst { 10754 break 10755 } 10756 c := v_0.AuxInt 10757 x := v.Args[1] 10758 y := v.Args[2] 10759 flags := v.Args[3] 10760 v.reset(OpARMRSCconst) 10761 v.AuxInt = c 10762 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10763 v0.AddArg(x) 10764 v0.AddArg(y) 10765 v.AddArg(v0) 10766 v.AddArg(flags) 10767 return true 10768 } 10769 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 10770 // cond: 10771 // result: (SBCshiftRL x y [c] flags) 10772 for { 10773 x := v.Args[0] 10774 y := v.Args[1] 10775 v_2 := v.Args[2] 10776 if v_2.Op != OpARMMOVWconst { 10777 break 10778 } 10779 c := v_2.AuxInt 10780 flags := v.Args[3] 10781 v.reset(OpARMSBCshiftRL) 10782 v.AuxInt = c 10783 v.AddArg(x) 10784 v.AddArg(y) 10785 v.AddArg(flags) 10786 return true 10787 } 10788 return false 10789 } 10790 func rewriteValueARM_OpARMSLL(v *Value, config *Config) bool { 10791 b := v.Block 10792 _ = b 10793 // match: (SLL x (MOVWconst [c])) 10794 // cond: 10795 // result: (SLLconst x [c&31]) 10796 for { 10797 x := v.Args[0] 10798 v_1 := v.Args[1] 10799 if v_1.Op != OpARMMOVWconst { 10800 break 10801 } 10802 c := v_1.AuxInt 10803 v.reset(OpARMSLLconst) 10804 v.AuxInt = c & 31 10805 v.AddArg(x) 10806 return true 10807 } 10808 return false 10809 } 10810 func rewriteValueARM_OpARMSLLconst(v *Value, config *Config) bool { 10811 b := v.Block 10812 _ = b 10813 // match: (SLLconst [c] (MOVWconst [d])) 10814 // cond: 10815 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 10816 for { 10817 c := v.AuxInt 10818 v_0 := v.Args[0] 10819 if v_0.Op != OpARMMOVWconst { 10820 break 10821 } 10822 d := v_0.AuxInt 10823 v.reset(OpARMMOVWconst) 10824 v.AuxInt = int64(uint32(d) << uint64(c)) 10825 return true 10826 } 10827 return false 10828 } 10829 func rewriteValueARM_OpARMSRA(v *Value, config *Config) bool { 10830 b := v.Block 10831 _ = b 10832 // match: (SRA x (MOVWconst [c])) 10833 // cond: 10834 // result: (SRAconst x [c&31]) 10835 for { 10836 x := v.Args[0] 10837 v_1 := v.Args[1] 10838 if v_1.Op != OpARMMOVWconst { 10839 break 10840 } 10841 c := v_1.AuxInt 10842 v.reset(OpARMSRAconst) 10843 v.AuxInt = c & 31 10844 v.AddArg(x) 10845 return true 10846 } 10847 return false 10848 } 10849 func rewriteValueARM_OpARMSRAcond(v *Value, config *Config) bool { 10850 b := v.Block 10851 _ = b 10852 // match: (SRAcond x _ (FlagEQ)) 10853 // cond: 10854 // result: (SRAconst x [31]) 10855 for { 10856 x := v.Args[0] 10857 v_2 := v.Args[2] 10858 if v_2.Op != OpARMFlagEQ { 10859 break 10860 } 10861 v.reset(OpARMSRAconst) 10862 v.AuxInt = 31 10863 v.AddArg(x) 10864 return true 10865 } 10866 // match: (SRAcond x y (FlagLT_ULT)) 10867 // cond: 10868 // result: (SRA x y) 10869 for { 10870 x := v.Args[0] 10871 y := v.Args[1] 10872 v_2 := v.Args[2] 10873 if v_2.Op != OpARMFlagLT_ULT { 10874 break 10875 } 10876 v.reset(OpARMSRA) 10877 v.AddArg(x) 10878 v.AddArg(y) 10879 return true 10880 } 10881 // match: (SRAcond x _ (FlagLT_UGT)) 10882 // cond: 10883 // result: (SRAconst x [31]) 10884 for { 10885 x := v.Args[0] 10886 v_2 := v.Args[2] 10887 if v_2.Op != OpARMFlagLT_UGT { 10888 break 10889 } 10890 v.reset(OpARMSRAconst) 10891 v.AuxInt = 31 10892 v.AddArg(x) 10893 return true 10894 } 10895 // match: (SRAcond x y (FlagGT_ULT)) 10896 // cond: 10897 // result: (SRA x y) 10898 for { 10899 x := v.Args[0] 10900 y := v.Args[1] 10901 v_2 := v.Args[2] 10902 if v_2.Op != OpARMFlagGT_ULT { 10903 break 10904 } 10905 v.reset(OpARMSRA) 10906 v.AddArg(x) 10907 v.AddArg(y) 10908 return true 10909 } 10910 // match: (SRAcond x _ (FlagGT_UGT)) 10911 // cond: 10912 // result: (SRAconst x [31]) 10913 for { 10914 x := v.Args[0] 10915 v_2 := v.Args[2] 10916 if v_2.Op != OpARMFlagGT_UGT { 10917 break 10918 } 10919 v.reset(OpARMSRAconst) 10920 v.AuxInt = 31 10921 v.AddArg(x) 10922 return true 10923 } 10924 return false 10925 } 10926 func rewriteValueARM_OpARMSRAconst(v *Value, config *Config) bool { 10927 b := v.Block 10928 _ = b 10929 // match: (SRAconst [c] (MOVWconst [d])) 10930 // cond: 10931 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 10932 for { 10933 c := v.AuxInt 10934 v_0 := v.Args[0] 10935 if v_0.Op != OpARMMOVWconst { 10936 break 10937 } 10938 d := v_0.AuxInt 10939 v.reset(OpARMMOVWconst) 10940 v.AuxInt = int64(int32(d) >> uint64(c)) 10941 return true 10942 } 10943 return false 10944 } 10945 func rewriteValueARM_OpARMSRL(v *Value, config *Config) bool { 10946 b := v.Block 10947 _ = b 10948 // match: (SRL x (MOVWconst [c])) 10949 // cond: 10950 // result: (SRLconst x [c&31]) 10951 for { 10952 x := v.Args[0] 10953 v_1 := v.Args[1] 10954 if v_1.Op != OpARMMOVWconst { 10955 break 10956 } 10957 c := v_1.AuxInt 10958 v.reset(OpARMSRLconst) 10959 v.AuxInt = c & 31 10960 v.AddArg(x) 10961 return true 10962 } 10963 return false 10964 } 10965 func rewriteValueARM_OpARMSRLconst(v *Value, config *Config) bool { 10966 b := v.Block 10967 _ = b 10968 // match: (SRLconst [c] (MOVWconst [d])) 10969 // cond: 10970 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 10971 for { 10972 c := v.AuxInt 10973 v_0 := v.Args[0] 10974 if v_0.Op != OpARMMOVWconst { 10975 break 10976 } 10977 d := v_0.AuxInt 10978 v.reset(OpARMMOVWconst) 10979 v.AuxInt = int64(uint32(d) >> uint64(c)) 10980 return true 10981 } 10982 return false 10983 } 10984 func rewriteValueARM_OpARMSUB(v *Value, config *Config) bool { 10985 b := v.Block 10986 _ = b 10987 // match: (SUB (MOVWconst [c]) x) 10988 // cond: 10989 // result: (RSBconst [c] x) 10990 for { 10991 v_0 := v.Args[0] 10992 if v_0.Op != OpARMMOVWconst { 10993 break 10994 } 10995 c := v_0.AuxInt 10996 x := v.Args[1] 10997 v.reset(OpARMRSBconst) 10998 v.AuxInt = c 10999 v.AddArg(x) 11000 return true 11001 } 11002 // match: (SUB x (MOVWconst [c])) 11003 // cond: 11004 // result: (SUBconst [c] x) 11005 for { 11006 x := v.Args[0] 11007 v_1 := v.Args[1] 11008 if v_1.Op != OpARMMOVWconst { 11009 break 11010 } 11011 c := v_1.AuxInt 11012 v.reset(OpARMSUBconst) 11013 v.AuxInt = c 11014 v.AddArg(x) 11015 return true 11016 } 11017 // match: (SUB x (SLLconst [c] y)) 11018 // cond: 11019 // result: (SUBshiftLL x y [c]) 11020 for { 11021 x := v.Args[0] 11022 v_1 := v.Args[1] 11023 if v_1.Op != OpARMSLLconst { 11024 break 11025 } 11026 c := v_1.AuxInt 11027 y := v_1.Args[0] 11028 v.reset(OpARMSUBshiftLL) 11029 v.AuxInt = c 11030 v.AddArg(x) 11031 v.AddArg(y) 11032 return true 11033 } 11034 // match: (SUB (SLLconst [c] y) x) 11035 // cond: 11036 // result: (RSBshiftLL x y [c]) 11037 for { 11038 v_0 := v.Args[0] 11039 if v_0.Op != OpARMSLLconst { 11040 break 11041 } 11042 c := v_0.AuxInt 11043 y := v_0.Args[0] 11044 x := v.Args[1] 11045 v.reset(OpARMRSBshiftLL) 11046 v.AuxInt = c 11047 v.AddArg(x) 11048 v.AddArg(y) 11049 return true 11050 } 11051 // match: (SUB x (SRLconst [c] y)) 11052 // cond: 11053 // result: (SUBshiftRL x y [c]) 11054 for { 11055 x := v.Args[0] 11056 v_1 := v.Args[1] 11057 if v_1.Op != OpARMSRLconst { 11058 break 11059 } 11060 c := v_1.AuxInt 11061 y := v_1.Args[0] 11062 v.reset(OpARMSUBshiftRL) 11063 v.AuxInt = c 11064 v.AddArg(x) 11065 v.AddArg(y) 11066 return true 11067 } 11068 // match: (SUB (SRLconst [c] y) x) 11069 // cond: 11070 // result: (RSBshiftRL x y [c]) 11071 for { 11072 v_0 := v.Args[0] 11073 if v_0.Op != OpARMSRLconst { 11074 break 11075 } 11076 c := v_0.AuxInt 11077 y := v_0.Args[0] 11078 x := v.Args[1] 11079 v.reset(OpARMRSBshiftRL) 11080 v.AuxInt = c 11081 v.AddArg(x) 11082 v.AddArg(y) 11083 return true 11084 } 11085 // match: (SUB x (SRAconst [c] y)) 11086 // cond: 11087 // result: (SUBshiftRA x y [c]) 11088 for { 11089 x := v.Args[0] 11090 v_1 := v.Args[1] 11091 if v_1.Op != OpARMSRAconst { 11092 break 11093 } 11094 c := v_1.AuxInt 11095 y := v_1.Args[0] 11096 v.reset(OpARMSUBshiftRA) 11097 v.AuxInt = c 11098 v.AddArg(x) 11099 v.AddArg(y) 11100 return true 11101 } 11102 // match: (SUB (SRAconst [c] y) x) 11103 // cond: 11104 // result: (RSBshiftRA x y [c]) 11105 for { 11106 v_0 := v.Args[0] 11107 if v_0.Op != OpARMSRAconst { 11108 break 11109 } 11110 c := v_0.AuxInt 11111 y := v_0.Args[0] 11112 x := v.Args[1] 11113 v.reset(OpARMRSBshiftRA) 11114 v.AuxInt = c 11115 v.AddArg(x) 11116 v.AddArg(y) 11117 return true 11118 } 11119 // match: (SUB x (SLL y z)) 11120 // cond: 11121 // result: (SUBshiftLLreg x y z) 11122 for { 11123 x := v.Args[0] 11124 v_1 := v.Args[1] 11125 if v_1.Op != OpARMSLL { 11126 break 11127 } 11128 y := v_1.Args[0] 11129 z := v_1.Args[1] 11130 v.reset(OpARMSUBshiftLLreg) 11131 v.AddArg(x) 11132 v.AddArg(y) 11133 v.AddArg(z) 11134 return true 11135 } 11136 // match: (SUB (SLL y z) x) 11137 // cond: 11138 // result: (RSBshiftLLreg x y z) 11139 for { 11140 v_0 := v.Args[0] 11141 if v_0.Op != OpARMSLL { 11142 break 11143 } 11144 y := v_0.Args[0] 11145 z := v_0.Args[1] 11146 x := v.Args[1] 11147 v.reset(OpARMRSBshiftLLreg) 11148 v.AddArg(x) 11149 v.AddArg(y) 11150 v.AddArg(z) 11151 return true 11152 } 11153 // match: (SUB x (SRL y z)) 11154 // cond: 11155 // result: (SUBshiftRLreg x y z) 11156 for { 11157 x := v.Args[0] 11158 v_1 := v.Args[1] 11159 if v_1.Op != OpARMSRL { 11160 break 11161 } 11162 y := v_1.Args[0] 11163 z := v_1.Args[1] 11164 v.reset(OpARMSUBshiftRLreg) 11165 v.AddArg(x) 11166 v.AddArg(y) 11167 v.AddArg(z) 11168 return true 11169 } 11170 // match: (SUB (SRL y z) x) 11171 // cond: 11172 // result: (RSBshiftRLreg x y z) 11173 for { 11174 v_0 := v.Args[0] 11175 if v_0.Op != OpARMSRL { 11176 break 11177 } 11178 y := v_0.Args[0] 11179 z := v_0.Args[1] 11180 x := v.Args[1] 11181 v.reset(OpARMRSBshiftRLreg) 11182 v.AddArg(x) 11183 v.AddArg(y) 11184 v.AddArg(z) 11185 return true 11186 } 11187 // match: (SUB x (SRA y z)) 11188 // cond: 11189 // result: (SUBshiftRAreg x y z) 11190 for { 11191 x := v.Args[0] 11192 v_1 := v.Args[1] 11193 if v_1.Op != OpARMSRA { 11194 break 11195 } 11196 y := v_1.Args[0] 11197 z := v_1.Args[1] 11198 v.reset(OpARMSUBshiftRAreg) 11199 v.AddArg(x) 11200 v.AddArg(y) 11201 v.AddArg(z) 11202 return true 11203 } 11204 // match: (SUB (SRA y z) x) 11205 // cond: 11206 // result: (RSBshiftRAreg x y z) 11207 for { 11208 v_0 := v.Args[0] 11209 if v_0.Op != OpARMSRA { 11210 break 11211 } 11212 y := v_0.Args[0] 11213 z := v_0.Args[1] 11214 x := v.Args[1] 11215 v.reset(OpARMRSBshiftRAreg) 11216 v.AddArg(x) 11217 v.AddArg(y) 11218 v.AddArg(z) 11219 return true 11220 } 11221 // match: (SUB x x) 11222 // cond: 11223 // result: (MOVWconst [0]) 11224 for { 11225 x := v.Args[0] 11226 if x != v.Args[1] { 11227 break 11228 } 11229 v.reset(OpARMMOVWconst) 11230 v.AuxInt = 0 11231 return true 11232 } 11233 return false 11234 } 11235 func rewriteValueARM_OpARMSUBS(v *Value, config *Config) bool { 11236 b := v.Block 11237 _ = b 11238 // match: (SUBS (MOVWconst [c]) x) 11239 // cond: 11240 // result: (RSBSconst [c] x) 11241 for { 11242 v_0 := v.Args[0] 11243 if v_0.Op != OpARMMOVWconst { 11244 break 11245 } 11246 c := v_0.AuxInt 11247 x := v.Args[1] 11248 v.reset(OpARMRSBSconst) 11249 v.AuxInt = c 11250 v.AddArg(x) 11251 return true 11252 } 11253 // match: (SUBS x (MOVWconst [c])) 11254 // cond: 11255 // result: (SUBSconst [c] x) 11256 for { 11257 x := v.Args[0] 11258 v_1 := v.Args[1] 11259 if v_1.Op != OpARMMOVWconst { 11260 break 11261 } 11262 c := v_1.AuxInt 11263 v.reset(OpARMSUBSconst) 11264 v.AuxInt = c 11265 v.AddArg(x) 11266 return true 11267 } 11268 // match: (SUBS x (SLLconst [c] y)) 11269 // cond: 11270 // result: (SUBSshiftLL x y [c]) 11271 for { 11272 x := v.Args[0] 11273 v_1 := v.Args[1] 11274 if v_1.Op != OpARMSLLconst { 11275 break 11276 } 11277 c := v_1.AuxInt 11278 y := v_1.Args[0] 11279 v.reset(OpARMSUBSshiftLL) 11280 v.AuxInt = c 11281 v.AddArg(x) 11282 v.AddArg(y) 11283 return true 11284 } 11285 // match: (SUBS (SLLconst [c] y) x) 11286 // cond: 11287 // result: (RSBSshiftLL x y [c]) 11288 for { 11289 v_0 := v.Args[0] 11290 if v_0.Op != OpARMSLLconst { 11291 break 11292 } 11293 c := v_0.AuxInt 11294 y := v_0.Args[0] 11295 x := v.Args[1] 11296 v.reset(OpARMRSBSshiftLL) 11297 v.AuxInt = c 11298 v.AddArg(x) 11299 v.AddArg(y) 11300 return true 11301 } 11302 // match: (SUBS x (SRLconst [c] y)) 11303 // cond: 11304 // result: (SUBSshiftRL x y [c]) 11305 for { 11306 x := v.Args[0] 11307 v_1 := v.Args[1] 11308 if v_1.Op != OpARMSRLconst { 11309 break 11310 } 11311 c := v_1.AuxInt 11312 y := v_1.Args[0] 11313 v.reset(OpARMSUBSshiftRL) 11314 v.AuxInt = c 11315 v.AddArg(x) 11316 v.AddArg(y) 11317 return true 11318 } 11319 // match: (SUBS (SRLconst [c] y) x) 11320 // cond: 11321 // result: (RSBSshiftRL x y [c]) 11322 for { 11323 v_0 := v.Args[0] 11324 if v_0.Op != OpARMSRLconst { 11325 break 11326 } 11327 c := v_0.AuxInt 11328 y := v_0.Args[0] 11329 x := v.Args[1] 11330 v.reset(OpARMRSBSshiftRL) 11331 v.AuxInt = c 11332 v.AddArg(x) 11333 v.AddArg(y) 11334 return true 11335 } 11336 // match: (SUBS x (SRAconst [c] y)) 11337 // cond: 11338 // result: (SUBSshiftRA x y [c]) 11339 for { 11340 x := v.Args[0] 11341 v_1 := v.Args[1] 11342 if v_1.Op != OpARMSRAconst { 11343 break 11344 } 11345 c := v_1.AuxInt 11346 y := v_1.Args[0] 11347 v.reset(OpARMSUBSshiftRA) 11348 v.AuxInt = c 11349 v.AddArg(x) 11350 v.AddArg(y) 11351 return true 11352 } 11353 // match: (SUBS (SRAconst [c] y) x) 11354 // cond: 11355 // result: (RSBSshiftRA x y [c]) 11356 for { 11357 v_0 := v.Args[0] 11358 if v_0.Op != OpARMSRAconst { 11359 break 11360 } 11361 c := v_0.AuxInt 11362 y := v_0.Args[0] 11363 x := v.Args[1] 11364 v.reset(OpARMRSBSshiftRA) 11365 v.AuxInt = c 11366 v.AddArg(x) 11367 v.AddArg(y) 11368 return true 11369 } 11370 // match: (SUBS x (SLL y z)) 11371 // cond: 11372 // result: (SUBSshiftLLreg x y z) 11373 for { 11374 x := v.Args[0] 11375 v_1 := v.Args[1] 11376 if v_1.Op != OpARMSLL { 11377 break 11378 } 11379 y := v_1.Args[0] 11380 z := v_1.Args[1] 11381 v.reset(OpARMSUBSshiftLLreg) 11382 v.AddArg(x) 11383 v.AddArg(y) 11384 v.AddArg(z) 11385 return true 11386 } 11387 // match: (SUBS (SLL y z) x) 11388 // cond: 11389 // result: (RSBSshiftLLreg x y z) 11390 for { 11391 v_0 := v.Args[0] 11392 if v_0.Op != OpARMSLL { 11393 break 11394 } 11395 y := v_0.Args[0] 11396 z := v_0.Args[1] 11397 x := v.Args[1] 11398 v.reset(OpARMRSBSshiftLLreg) 11399 v.AddArg(x) 11400 v.AddArg(y) 11401 v.AddArg(z) 11402 return true 11403 } 11404 // match: (SUBS x (SRL y z)) 11405 // cond: 11406 // result: (SUBSshiftRLreg x y z) 11407 for { 11408 x := v.Args[0] 11409 v_1 := v.Args[1] 11410 if v_1.Op != OpARMSRL { 11411 break 11412 } 11413 y := v_1.Args[0] 11414 z := v_1.Args[1] 11415 v.reset(OpARMSUBSshiftRLreg) 11416 v.AddArg(x) 11417 v.AddArg(y) 11418 v.AddArg(z) 11419 return true 11420 } 11421 // match: (SUBS (SRL y z) x) 11422 // cond: 11423 // result: (RSBSshiftRLreg x y z) 11424 for { 11425 v_0 := v.Args[0] 11426 if v_0.Op != OpARMSRL { 11427 break 11428 } 11429 y := v_0.Args[0] 11430 z := v_0.Args[1] 11431 x := v.Args[1] 11432 v.reset(OpARMRSBSshiftRLreg) 11433 v.AddArg(x) 11434 v.AddArg(y) 11435 v.AddArg(z) 11436 return true 11437 } 11438 // match: (SUBS x (SRA y z)) 11439 // cond: 11440 // result: (SUBSshiftRAreg x y z) 11441 for { 11442 x := v.Args[0] 11443 v_1 := v.Args[1] 11444 if v_1.Op != OpARMSRA { 11445 break 11446 } 11447 y := v_1.Args[0] 11448 z := v_1.Args[1] 11449 v.reset(OpARMSUBSshiftRAreg) 11450 v.AddArg(x) 11451 v.AddArg(y) 11452 v.AddArg(z) 11453 return true 11454 } 11455 // match: (SUBS (SRA y z) x) 11456 // cond: 11457 // result: (RSBSshiftRAreg x y z) 11458 for { 11459 v_0 := v.Args[0] 11460 if v_0.Op != OpARMSRA { 11461 break 11462 } 11463 y := v_0.Args[0] 11464 z := v_0.Args[1] 11465 x := v.Args[1] 11466 v.reset(OpARMRSBSshiftRAreg) 11467 v.AddArg(x) 11468 v.AddArg(y) 11469 v.AddArg(z) 11470 return true 11471 } 11472 return false 11473 } 11474 func rewriteValueARM_OpARMSUBSshiftLL(v *Value, config *Config) bool { 11475 b := v.Block 11476 _ = b 11477 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 11478 // cond: 11479 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 11480 for { 11481 d := v.AuxInt 11482 v_0 := v.Args[0] 11483 if v_0.Op != OpARMMOVWconst { 11484 break 11485 } 11486 c := v_0.AuxInt 11487 x := v.Args[1] 11488 v.reset(OpARMRSBSconst) 11489 v.AuxInt = c 11490 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11491 v0.AuxInt = d 11492 v0.AddArg(x) 11493 v.AddArg(v0) 11494 return true 11495 } 11496 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 11497 // cond: 11498 // result: (SUBSconst x [int64(uint32(c)<<uint64(d))]) 11499 for { 11500 d := v.AuxInt 11501 x := v.Args[0] 11502 v_1 := v.Args[1] 11503 if v_1.Op != OpARMMOVWconst { 11504 break 11505 } 11506 c := v_1.AuxInt 11507 v.reset(OpARMSUBSconst) 11508 v.AuxInt = int64(uint32(c) << uint64(d)) 11509 v.AddArg(x) 11510 return true 11511 } 11512 return false 11513 } 11514 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value, config *Config) bool { 11515 b := v.Block 11516 _ = b 11517 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 11518 // cond: 11519 // result: (RSBSconst [c] (SLL <x.Type> x y)) 11520 for { 11521 v_0 := v.Args[0] 11522 if v_0.Op != OpARMMOVWconst { 11523 break 11524 } 11525 c := v_0.AuxInt 11526 x := v.Args[1] 11527 y := v.Args[2] 11528 v.reset(OpARMRSBSconst) 11529 v.AuxInt = c 11530 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11531 v0.AddArg(x) 11532 v0.AddArg(y) 11533 v.AddArg(v0) 11534 return true 11535 } 11536 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 11537 // cond: 11538 // result: (SUBSshiftLL x y [c]) 11539 for { 11540 x := v.Args[0] 11541 y := v.Args[1] 11542 v_2 := v.Args[2] 11543 if v_2.Op != OpARMMOVWconst { 11544 break 11545 } 11546 c := v_2.AuxInt 11547 v.reset(OpARMSUBSshiftLL) 11548 v.AuxInt = c 11549 v.AddArg(x) 11550 v.AddArg(y) 11551 return true 11552 } 11553 return false 11554 } 11555 func rewriteValueARM_OpARMSUBSshiftRA(v *Value, config *Config) bool { 11556 b := v.Block 11557 _ = b 11558 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 11559 // cond: 11560 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 11561 for { 11562 d := v.AuxInt 11563 v_0 := v.Args[0] 11564 if v_0.Op != OpARMMOVWconst { 11565 break 11566 } 11567 c := v_0.AuxInt 11568 x := v.Args[1] 11569 v.reset(OpARMRSBSconst) 11570 v.AuxInt = c 11571 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11572 v0.AuxInt = d 11573 v0.AddArg(x) 11574 v.AddArg(v0) 11575 return true 11576 } 11577 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 11578 // cond: 11579 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 11580 for { 11581 d := v.AuxInt 11582 x := v.Args[0] 11583 v_1 := v.Args[1] 11584 if v_1.Op != OpARMMOVWconst { 11585 break 11586 } 11587 c := v_1.AuxInt 11588 v.reset(OpARMSUBSconst) 11589 v.AuxInt = int64(int32(c) >> uint64(d)) 11590 v.AddArg(x) 11591 return true 11592 } 11593 return false 11594 } 11595 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value, config *Config) bool { 11596 b := v.Block 11597 _ = b 11598 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 11599 // cond: 11600 // result: (RSBSconst [c] (SRA <x.Type> x y)) 11601 for { 11602 v_0 := v.Args[0] 11603 if v_0.Op != OpARMMOVWconst { 11604 break 11605 } 11606 c := v_0.AuxInt 11607 x := v.Args[1] 11608 y := v.Args[2] 11609 v.reset(OpARMRSBSconst) 11610 v.AuxInt = c 11611 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11612 v0.AddArg(x) 11613 v0.AddArg(y) 11614 v.AddArg(v0) 11615 return true 11616 } 11617 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 11618 // cond: 11619 // result: (SUBSshiftRA x y [c]) 11620 for { 11621 x := v.Args[0] 11622 y := v.Args[1] 11623 v_2 := v.Args[2] 11624 if v_2.Op != OpARMMOVWconst { 11625 break 11626 } 11627 c := v_2.AuxInt 11628 v.reset(OpARMSUBSshiftRA) 11629 v.AuxInt = c 11630 v.AddArg(x) 11631 v.AddArg(y) 11632 return true 11633 } 11634 return false 11635 } 11636 func rewriteValueARM_OpARMSUBSshiftRL(v *Value, config *Config) bool { 11637 b := v.Block 11638 _ = b 11639 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 11640 // cond: 11641 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 11642 for { 11643 d := v.AuxInt 11644 v_0 := v.Args[0] 11645 if v_0.Op != OpARMMOVWconst { 11646 break 11647 } 11648 c := v_0.AuxInt 11649 x := v.Args[1] 11650 v.reset(OpARMRSBSconst) 11651 v.AuxInt = c 11652 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11653 v0.AuxInt = d 11654 v0.AddArg(x) 11655 v.AddArg(v0) 11656 return true 11657 } 11658 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 11659 // cond: 11660 // result: (SUBSconst x [int64(uint32(c)>>uint64(d))]) 11661 for { 11662 d := v.AuxInt 11663 x := v.Args[0] 11664 v_1 := v.Args[1] 11665 if v_1.Op != OpARMMOVWconst { 11666 break 11667 } 11668 c := v_1.AuxInt 11669 v.reset(OpARMSUBSconst) 11670 v.AuxInt = int64(uint32(c) >> uint64(d)) 11671 v.AddArg(x) 11672 return true 11673 } 11674 return false 11675 } 11676 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value, config *Config) bool { 11677 b := v.Block 11678 _ = b 11679 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 11680 // cond: 11681 // result: (RSBSconst [c] (SRL <x.Type> x y)) 11682 for { 11683 v_0 := v.Args[0] 11684 if v_0.Op != OpARMMOVWconst { 11685 break 11686 } 11687 c := v_0.AuxInt 11688 x := v.Args[1] 11689 y := v.Args[2] 11690 v.reset(OpARMRSBSconst) 11691 v.AuxInt = c 11692 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11693 v0.AddArg(x) 11694 v0.AddArg(y) 11695 v.AddArg(v0) 11696 return true 11697 } 11698 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 11699 // cond: 11700 // result: (SUBSshiftRL x y [c]) 11701 for { 11702 x := v.Args[0] 11703 y := v.Args[1] 11704 v_2 := v.Args[2] 11705 if v_2.Op != OpARMMOVWconst { 11706 break 11707 } 11708 c := v_2.AuxInt 11709 v.reset(OpARMSUBSshiftRL) 11710 v.AuxInt = c 11711 v.AddArg(x) 11712 v.AddArg(y) 11713 return true 11714 } 11715 return false 11716 } 11717 func rewriteValueARM_OpARMSUBconst(v *Value, config *Config) bool { 11718 b := v.Block 11719 _ = b 11720 // match: (SUBconst [0] x) 11721 // cond: 11722 // result: x 11723 for { 11724 if v.AuxInt != 0 { 11725 break 11726 } 11727 x := v.Args[0] 11728 v.reset(OpCopy) 11729 v.Type = x.Type 11730 v.AddArg(x) 11731 return true 11732 } 11733 // match: (SUBconst [c] (MOVWconst [d])) 11734 // cond: 11735 // result: (MOVWconst [int64(int32(d-c))]) 11736 for { 11737 c := v.AuxInt 11738 v_0 := v.Args[0] 11739 if v_0.Op != OpARMMOVWconst { 11740 break 11741 } 11742 d := v_0.AuxInt 11743 v.reset(OpARMMOVWconst) 11744 v.AuxInt = int64(int32(d - c)) 11745 return true 11746 } 11747 // match: (SUBconst [c] (SUBconst [d] x)) 11748 // cond: 11749 // result: (ADDconst [int64(int32(-c-d))] x) 11750 for { 11751 c := v.AuxInt 11752 v_0 := v.Args[0] 11753 if v_0.Op != OpARMSUBconst { 11754 break 11755 } 11756 d := v_0.AuxInt 11757 x := v_0.Args[0] 11758 v.reset(OpARMADDconst) 11759 v.AuxInt = int64(int32(-c - d)) 11760 v.AddArg(x) 11761 return true 11762 } 11763 // match: (SUBconst [c] (ADDconst [d] x)) 11764 // cond: 11765 // result: (ADDconst [int64(int32(-c+d))] x) 11766 for { 11767 c := v.AuxInt 11768 v_0 := v.Args[0] 11769 if v_0.Op != OpARMADDconst { 11770 break 11771 } 11772 d := v_0.AuxInt 11773 x := v_0.Args[0] 11774 v.reset(OpARMADDconst) 11775 v.AuxInt = int64(int32(-c + d)) 11776 v.AddArg(x) 11777 return true 11778 } 11779 // match: (SUBconst [c] (RSBconst [d] x)) 11780 // cond: 11781 // result: (RSBconst [int64(int32(-c+d))] x) 11782 for { 11783 c := v.AuxInt 11784 v_0 := v.Args[0] 11785 if v_0.Op != OpARMRSBconst { 11786 break 11787 } 11788 d := v_0.AuxInt 11789 x := v_0.Args[0] 11790 v.reset(OpARMRSBconst) 11791 v.AuxInt = int64(int32(-c + d)) 11792 v.AddArg(x) 11793 return true 11794 } 11795 return false 11796 } 11797 func rewriteValueARM_OpARMSUBshiftLL(v *Value, config *Config) bool { 11798 b := v.Block 11799 _ = b 11800 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 11801 // cond: 11802 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 11803 for { 11804 d := v.AuxInt 11805 v_0 := v.Args[0] 11806 if v_0.Op != OpARMMOVWconst { 11807 break 11808 } 11809 c := v_0.AuxInt 11810 x := v.Args[1] 11811 v.reset(OpARMRSBconst) 11812 v.AuxInt = c 11813 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11814 v0.AuxInt = d 11815 v0.AddArg(x) 11816 v.AddArg(v0) 11817 return true 11818 } 11819 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 11820 // cond: 11821 // result: (SUBconst x [int64(uint32(c)<<uint64(d))]) 11822 for { 11823 d := v.AuxInt 11824 x := v.Args[0] 11825 v_1 := v.Args[1] 11826 if v_1.Op != OpARMMOVWconst { 11827 break 11828 } 11829 c := v_1.AuxInt 11830 v.reset(OpARMSUBconst) 11831 v.AuxInt = int64(uint32(c) << uint64(d)) 11832 v.AddArg(x) 11833 return true 11834 } 11835 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 11836 // cond: c==d 11837 // result: (MOVWconst [0]) 11838 for { 11839 d := v.AuxInt 11840 x := v.Args[0] 11841 v_1 := v.Args[1] 11842 if v_1.Op != OpARMSLLconst { 11843 break 11844 } 11845 c := v_1.AuxInt 11846 if x != v_1.Args[0] { 11847 break 11848 } 11849 if !(c == d) { 11850 break 11851 } 11852 v.reset(OpARMMOVWconst) 11853 v.AuxInt = 0 11854 return true 11855 } 11856 return false 11857 } 11858 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value, config *Config) bool { 11859 b := v.Block 11860 _ = b 11861 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 11862 // cond: 11863 // result: (RSBconst [c] (SLL <x.Type> x y)) 11864 for { 11865 v_0 := v.Args[0] 11866 if v_0.Op != OpARMMOVWconst { 11867 break 11868 } 11869 c := v_0.AuxInt 11870 x := v.Args[1] 11871 y := v.Args[2] 11872 v.reset(OpARMRSBconst) 11873 v.AuxInt = c 11874 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11875 v0.AddArg(x) 11876 v0.AddArg(y) 11877 v.AddArg(v0) 11878 return true 11879 } 11880 // match: (SUBshiftLLreg x y (MOVWconst [c])) 11881 // cond: 11882 // result: (SUBshiftLL x y [c]) 11883 for { 11884 x := v.Args[0] 11885 y := v.Args[1] 11886 v_2 := v.Args[2] 11887 if v_2.Op != OpARMMOVWconst { 11888 break 11889 } 11890 c := v_2.AuxInt 11891 v.reset(OpARMSUBshiftLL) 11892 v.AuxInt = c 11893 v.AddArg(x) 11894 v.AddArg(y) 11895 return true 11896 } 11897 return false 11898 } 11899 func rewriteValueARM_OpARMSUBshiftRA(v *Value, config *Config) bool { 11900 b := v.Block 11901 _ = b 11902 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 11903 // cond: 11904 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 11905 for { 11906 d := v.AuxInt 11907 v_0 := v.Args[0] 11908 if v_0.Op != OpARMMOVWconst { 11909 break 11910 } 11911 c := v_0.AuxInt 11912 x := v.Args[1] 11913 v.reset(OpARMRSBconst) 11914 v.AuxInt = c 11915 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11916 v0.AuxInt = d 11917 v0.AddArg(x) 11918 v.AddArg(v0) 11919 return true 11920 } 11921 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 11922 // cond: 11923 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 11924 for { 11925 d := v.AuxInt 11926 x := v.Args[0] 11927 v_1 := v.Args[1] 11928 if v_1.Op != OpARMMOVWconst { 11929 break 11930 } 11931 c := v_1.AuxInt 11932 v.reset(OpARMSUBconst) 11933 v.AuxInt = int64(int32(c) >> uint64(d)) 11934 v.AddArg(x) 11935 return true 11936 } 11937 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 11938 // cond: c==d 11939 // result: (MOVWconst [0]) 11940 for { 11941 d := v.AuxInt 11942 x := v.Args[0] 11943 v_1 := v.Args[1] 11944 if v_1.Op != OpARMSRAconst { 11945 break 11946 } 11947 c := v_1.AuxInt 11948 if x != v_1.Args[0] { 11949 break 11950 } 11951 if !(c == d) { 11952 break 11953 } 11954 v.reset(OpARMMOVWconst) 11955 v.AuxInt = 0 11956 return true 11957 } 11958 return false 11959 } 11960 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value, config *Config) bool { 11961 b := v.Block 11962 _ = b 11963 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 11964 // cond: 11965 // result: (RSBconst [c] (SRA <x.Type> x y)) 11966 for { 11967 v_0 := v.Args[0] 11968 if v_0.Op != OpARMMOVWconst { 11969 break 11970 } 11971 c := v_0.AuxInt 11972 x := v.Args[1] 11973 y := v.Args[2] 11974 v.reset(OpARMRSBconst) 11975 v.AuxInt = c 11976 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11977 v0.AddArg(x) 11978 v0.AddArg(y) 11979 v.AddArg(v0) 11980 return true 11981 } 11982 // match: (SUBshiftRAreg x y (MOVWconst [c])) 11983 // cond: 11984 // result: (SUBshiftRA x y [c]) 11985 for { 11986 x := v.Args[0] 11987 y := v.Args[1] 11988 v_2 := v.Args[2] 11989 if v_2.Op != OpARMMOVWconst { 11990 break 11991 } 11992 c := v_2.AuxInt 11993 v.reset(OpARMSUBshiftRA) 11994 v.AuxInt = c 11995 v.AddArg(x) 11996 v.AddArg(y) 11997 return true 11998 } 11999 return false 12000 } 12001 func rewriteValueARM_OpARMSUBshiftRL(v *Value, config *Config) bool { 12002 b := v.Block 12003 _ = b 12004 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 12005 // cond: 12006 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 12007 for { 12008 d := v.AuxInt 12009 v_0 := v.Args[0] 12010 if v_0.Op != OpARMMOVWconst { 12011 break 12012 } 12013 c := v_0.AuxInt 12014 x := v.Args[1] 12015 v.reset(OpARMRSBconst) 12016 v.AuxInt = c 12017 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12018 v0.AuxInt = d 12019 v0.AddArg(x) 12020 v.AddArg(v0) 12021 return true 12022 } 12023 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 12024 // cond: 12025 // result: (SUBconst x [int64(uint32(c)>>uint64(d))]) 12026 for { 12027 d := v.AuxInt 12028 x := v.Args[0] 12029 v_1 := v.Args[1] 12030 if v_1.Op != OpARMMOVWconst { 12031 break 12032 } 12033 c := v_1.AuxInt 12034 v.reset(OpARMSUBconst) 12035 v.AuxInt = int64(uint32(c) >> uint64(d)) 12036 v.AddArg(x) 12037 return true 12038 } 12039 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 12040 // cond: c==d 12041 // result: (MOVWconst [0]) 12042 for { 12043 d := v.AuxInt 12044 x := v.Args[0] 12045 v_1 := v.Args[1] 12046 if v_1.Op != OpARMSRLconst { 12047 break 12048 } 12049 c := v_1.AuxInt 12050 if x != v_1.Args[0] { 12051 break 12052 } 12053 if !(c == d) { 12054 break 12055 } 12056 v.reset(OpARMMOVWconst) 12057 v.AuxInt = 0 12058 return true 12059 } 12060 return false 12061 } 12062 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value, config *Config) bool { 12063 b := v.Block 12064 _ = b 12065 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 12066 // cond: 12067 // result: (RSBconst [c] (SRL <x.Type> x y)) 12068 for { 12069 v_0 := v.Args[0] 12070 if v_0.Op != OpARMMOVWconst { 12071 break 12072 } 12073 c := v_0.AuxInt 12074 x := v.Args[1] 12075 y := v.Args[2] 12076 v.reset(OpARMRSBconst) 12077 v.AuxInt = c 12078 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12079 v0.AddArg(x) 12080 v0.AddArg(y) 12081 v.AddArg(v0) 12082 return true 12083 } 12084 // match: (SUBshiftRLreg x y (MOVWconst [c])) 12085 // cond: 12086 // result: (SUBshiftRL x y [c]) 12087 for { 12088 x := v.Args[0] 12089 y := v.Args[1] 12090 v_2 := v.Args[2] 12091 if v_2.Op != OpARMMOVWconst { 12092 break 12093 } 12094 c := v_2.AuxInt 12095 v.reset(OpARMSUBshiftRL) 12096 v.AuxInt = c 12097 v.AddArg(x) 12098 v.AddArg(y) 12099 return true 12100 } 12101 return false 12102 } 12103 func rewriteValueARM_OpARMXOR(v *Value, config *Config) bool { 12104 b := v.Block 12105 _ = b 12106 // match: (XOR (MOVWconst [c]) x) 12107 // cond: 12108 // result: (XORconst [c] x) 12109 for { 12110 v_0 := v.Args[0] 12111 if v_0.Op != OpARMMOVWconst { 12112 break 12113 } 12114 c := v_0.AuxInt 12115 x := v.Args[1] 12116 v.reset(OpARMXORconst) 12117 v.AuxInt = c 12118 v.AddArg(x) 12119 return true 12120 } 12121 // match: (XOR x (MOVWconst [c])) 12122 // cond: 12123 // result: (XORconst [c] x) 12124 for { 12125 x := v.Args[0] 12126 v_1 := v.Args[1] 12127 if v_1.Op != OpARMMOVWconst { 12128 break 12129 } 12130 c := v_1.AuxInt 12131 v.reset(OpARMXORconst) 12132 v.AuxInt = c 12133 v.AddArg(x) 12134 return true 12135 } 12136 // match: (XOR x (SLLconst [c] y)) 12137 // cond: 12138 // result: (XORshiftLL x y [c]) 12139 for { 12140 x := v.Args[0] 12141 v_1 := v.Args[1] 12142 if v_1.Op != OpARMSLLconst { 12143 break 12144 } 12145 c := v_1.AuxInt 12146 y := v_1.Args[0] 12147 v.reset(OpARMXORshiftLL) 12148 v.AuxInt = c 12149 v.AddArg(x) 12150 v.AddArg(y) 12151 return true 12152 } 12153 // match: (XOR (SLLconst [c] y) x) 12154 // cond: 12155 // result: (XORshiftLL x y [c]) 12156 for { 12157 v_0 := v.Args[0] 12158 if v_0.Op != OpARMSLLconst { 12159 break 12160 } 12161 c := v_0.AuxInt 12162 y := v_0.Args[0] 12163 x := v.Args[1] 12164 v.reset(OpARMXORshiftLL) 12165 v.AuxInt = c 12166 v.AddArg(x) 12167 v.AddArg(y) 12168 return true 12169 } 12170 // match: (XOR x (SRLconst [c] y)) 12171 // cond: 12172 // result: (XORshiftRL x y [c]) 12173 for { 12174 x := v.Args[0] 12175 v_1 := v.Args[1] 12176 if v_1.Op != OpARMSRLconst { 12177 break 12178 } 12179 c := v_1.AuxInt 12180 y := v_1.Args[0] 12181 v.reset(OpARMXORshiftRL) 12182 v.AuxInt = c 12183 v.AddArg(x) 12184 v.AddArg(y) 12185 return true 12186 } 12187 // match: (XOR (SRLconst [c] y) x) 12188 // cond: 12189 // result: (XORshiftRL x y [c]) 12190 for { 12191 v_0 := v.Args[0] 12192 if v_0.Op != OpARMSRLconst { 12193 break 12194 } 12195 c := v_0.AuxInt 12196 y := v_0.Args[0] 12197 x := v.Args[1] 12198 v.reset(OpARMXORshiftRL) 12199 v.AuxInt = c 12200 v.AddArg(x) 12201 v.AddArg(y) 12202 return true 12203 } 12204 // match: (XOR x (SRAconst [c] y)) 12205 // cond: 12206 // result: (XORshiftRA x y [c]) 12207 for { 12208 x := v.Args[0] 12209 v_1 := v.Args[1] 12210 if v_1.Op != OpARMSRAconst { 12211 break 12212 } 12213 c := v_1.AuxInt 12214 y := v_1.Args[0] 12215 v.reset(OpARMXORshiftRA) 12216 v.AuxInt = c 12217 v.AddArg(x) 12218 v.AddArg(y) 12219 return true 12220 } 12221 // match: (XOR (SRAconst [c] y) x) 12222 // cond: 12223 // result: (XORshiftRA x y [c]) 12224 for { 12225 v_0 := v.Args[0] 12226 if v_0.Op != OpARMSRAconst { 12227 break 12228 } 12229 c := v_0.AuxInt 12230 y := v_0.Args[0] 12231 x := v.Args[1] 12232 v.reset(OpARMXORshiftRA) 12233 v.AuxInt = c 12234 v.AddArg(x) 12235 v.AddArg(y) 12236 return true 12237 } 12238 // match: (XOR x (SRRconst [c] y)) 12239 // cond: 12240 // result: (XORshiftRR x y [c]) 12241 for { 12242 x := v.Args[0] 12243 v_1 := v.Args[1] 12244 if v_1.Op != OpARMSRRconst { 12245 break 12246 } 12247 c := v_1.AuxInt 12248 y := v_1.Args[0] 12249 v.reset(OpARMXORshiftRR) 12250 v.AuxInt = c 12251 v.AddArg(x) 12252 v.AddArg(y) 12253 return true 12254 } 12255 // match: (XOR (SRRconst [c] y) x) 12256 // cond: 12257 // result: (XORshiftRR x y [c]) 12258 for { 12259 v_0 := v.Args[0] 12260 if v_0.Op != OpARMSRRconst { 12261 break 12262 } 12263 c := v_0.AuxInt 12264 y := v_0.Args[0] 12265 x := v.Args[1] 12266 v.reset(OpARMXORshiftRR) 12267 v.AuxInt = c 12268 v.AddArg(x) 12269 v.AddArg(y) 12270 return true 12271 } 12272 // match: (XOR x (SLL y z)) 12273 // cond: 12274 // result: (XORshiftLLreg x y z) 12275 for { 12276 x := v.Args[0] 12277 v_1 := v.Args[1] 12278 if v_1.Op != OpARMSLL { 12279 break 12280 } 12281 y := v_1.Args[0] 12282 z := v_1.Args[1] 12283 v.reset(OpARMXORshiftLLreg) 12284 v.AddArg(x) 12285 v.AddArg(y) 12286 v.AddArg(z) 12287 return true 12288 } 12289 // match: (XOR (SLL y z) x) 12290 // cond: 12291 // result: (XORshiftLLreg x y z) 12292 for { 12293 v_0 := v.Args[0] 12294 if v_0.Op != OpARMSLL { 12295 break 12296 } 12297 y := v_0.Args[0] 12298 z := v_0.Args[1] 12299 x := v.Args[1] 12300 v.reset(OpARMXORshiftLLreg) 12301 v.AddArg(x) 12302 v.AddArg(y) 12303 v.AddArg(z) 12304 return true 12305 } 12306 // match: (XOR x (SRL y z)) 12307 // cond: 12308 // result: (XORshiftRLreg x y z) 12309 for { 12310 x := v.Args[0] 12311 v_1 := v.Args[1] 12312 if v_1.Op != OpARMSRL { 12313 break 12314 } 12315 y := v_1.Args[0] 12316 z := v_1.Args[1] 12317 v.reset(OpARMXORshiftRLreg) 12318 v.AddArg(x) 12319 v.AddArg(y) 12320 v.AddArg(z) 12321 return true 12322 } 12323 // match: (XOR (SRL y z) x) 12324 // cond: 12325 // result: (XORshiftRLreg x y z) 12326 for { 12327 v_0 := v.Args[0] 12328 if v_0.Op != OpARMSRL { 12329 break 12330 } 12331 y := v_0.Args[0] 12332 z := v_0.Args[1] 12333 x := v.Args[1] 12334 v.reset(OpARMXORshiftRLreg) 12335 v.AddArg(x) 12336 v.AddArg(y) 12337 v.AddArg(z) 12338 return true 12339 } 12340 // match: (XOR x (SRA y z)) 12341 // cond: 12342 // result: (XORshiftRAreg x y z) 12343 for { 12344 x := v.Args[0] 12345 v_1 := v.Args[1] 12346 if v_1.Op != OpARMSRA { 12347 break 12348 } 12349 y := v_1.Args[0] 12350 z := v_1.Args[1] 12351 v.reset(OpARMXORshiftRAreg) 12352 v.AddArg(x) 12353 v.AddArg(y) 12354 v.AddArg(z) 12355 return true 12356 } 12357 // match: (XOR (SRA y z) x) 12358 // cond: 12359 // result: (XORshiftRAreg x y z) 12360 for { 12361 v_0 := v.Args[0] 12362 if v_0.Op != OpARMSRA { 12363 break 12364 } 12365 y := v_0.Args[0] 12366 z := v_0.Args[1] 12367 x := v.Args[1] 12368 v.reset(OpARMXORshiftRAreg) 12369 v.AddArg(x) 12370 v.AddArg(y) 12371 v.AddArg(z) 12372 return true 12373 } 12374 // match: (XOR x x) 12375 // cond: 12376 // result: (MOVWconst [0]) 12377 for { 12378 x := v.Args[0] 12379 if x != v.Args[1] { 12380 break 12381 } 12382 v.reset(OpARMMOVWconst) 12383 v.AuxInt = 0 12384 return true 12385 } 12386 return false 12387 } 12388 func rewriteValueARM_OpARMXORconst(v *Value, config *Config) bool { 12389 b := v.Block 12390 _ = b 12391 // match: (XORconst [0] x) 12392 // cond: 12393 // result: x 12394 for { 12395 if v.AuxInt != 0 { 12396 break 12397 } 12398 x := v.Args[0] 12399 v.reset(OpCopy) 12400 v.Type = x.Type 12401 v.AddArg(x) 12402 return true 12403 } 12404 // match: (XORconst [c] (MOVWconst [d])) 12405 // cond: 12406 // result: (MOVWconst [c^d]) 12407 for { 12408 c := v.AuxInt 12409 v_0 := v.Args[0] 12410 if v_0.Op != OpARMMOVWconst { 12411 break 12412 } 12413 d := v_0.AuxInt 12414 v.reset(OpARMMOVWconst) 12415 v.AuxInt = c ^ d 12416 return true 12417 } 12418 // match: (XORconst [c] (XORconst [d] x)) 12419 // cond: 12420 // result: (XORconst [c^d] x) 12421 for { 12422 c := v.AuxInt 12423 v_0 := v.Args[0] 12424 if v_0.Op != OpARMXORconst { 12425 break 12426 } 12427 d := v_0.AuxInt 12428 x := v_0.Args[0] 12429 v.reset(OpARMXORconst) 12430 v.AuxInt = c ^ d 12431 v.AddArg(x) 12432 return true 12433 } 12434 return false 12435 } 12436 func rewriteValueARM_OpARMXORshiftLL(v *Value, config *Config) bool { 12437 b := v.Block 12438 _ = b 12439 // match: (XORshiftLL (MOVWconst [c]) x [d]) 12440 // cond: 12441 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 12442 for { 12443 d := v.AuxInt 12444 v_0 := v.Args[0] 12445 if v_0.Op != OpARMMOVWconst { 12446 break 12447 } 12448 c := v_0.AuxInt 12449 x := v.Args[1] 12450 v.reset(OpARMXORconst) 12451 v.AuxInt = c 12452 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12453 v0.AuxInt = d 12454 v0.AddArg(x) 12455 v.AddArg(v0) 12456 return true 12457 } 12458 // match: (XORshiftLL x (MOVWconst [c]) [d]) 12459 // cond: 12460 // result: (XORconst x [int64(uint32(c)<<uint64(d))]) 12461 for { 12462 d := v.AuxInt 12463 x := v.Args[0] 12464 v_1 := v.Args[1] 12465 if v_1.Op != OpARMMOVWconst { 12466 break 12467 } 12468 c := v_1.AuxInt 12469 v.reset(OpARMXORconst) 12470 v.AuxInt = int64(uint32(c) << uint64(d)) 12471 v.AddArg(x) 12472 return true 12473 } 12474 // match: (XORshiftLL [c] (SRLconst x [32-c]) x) 12475 // cond: 12476 // result: (SRRconst [32-c] x) 12477 for { 12478 c := v.AuxInt 12479 v_0 := v.Args[0] 12480 if v_0.Op != OpARMSRLconst { 12481 break 12482 } 12483 if v_0.AuxInt != 32-c { 12484 break 12485 } 12486 x := v_0.Args[0] 12487 if x != v.Args[1] { 12488 break 12489 } 12490 v.reset(OpARMSRRconst) 12491 v.AuxInt = 32 - c 12492 v.AddArg(x) 12493 return true 12494 } 12495 // match: (XORshiftLL x (SLLconst x [c]) [d]) 12496 // cond: c==d 12497 // result: (MOVWconst [0]) 12498 for { 12499 d := v.AuxInt 12500 x := v.Args[0] 12501 v_1 := v.Args[1] 12502 if v_1.Op != OpARMSLLconst { 12503 break 12504 } 12505 c := v_1.AuxInt 12506 if x != v_1.Args[0] { 12507 break 12508 } 12509 if !(c == d) { 12510 break 12511 } 12512 v.reset(OpARMMOVWconst) 12513 v.AuxInt = 0 12514 return true 12515 } 12516 return false 12517 } 12518 func rewriteValueARM_OpARMXORshiftLLreg(v *Value, config *Config) bool { 12519 b := v.Block 12520 _ = b 12521 // match: (XORshiftLLreg (MOVWconst [c]) x y) 12522 // cond: 12523 // result: (XORconst [c] (SLL <x.Type> x y)) 12524 for { 12525 v_0 := v.Args[0] 12526 if v_0.Op != OpARMMOVWconst { 12527 break 12528 } 12529 c := v_0.AuxInt 12530 x := v.Args[1] 12531 y := v.Args[2] 12532 v.reset(OpARMXORconst) 12533 v.AuxInt = c 12534 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12535 v0.AddArg(x) 12536 v0.AddArg(y) 12537 v.AddArg(v0) 12538 return true 12539 } 12540 // match: (XORshiftLLreg x y (MOVWconst [c])) 12541 // cond: 12542 // result: (XORshiftLL x y [c]) 12543 for { 12544 x := v.Args[0] 12545 y := v.Args[1] 12546 v_2 := v.Args[2] 12547 if v_2.Op != OpARMMOVWconst { 12548 break 12549 } 12550 c := v_2.AuxInt 12551 v.reset(OpARMXORshiftLL) 12552 v.AuxInt = c 12553 v.AddArg(x) 12554 v.AddArg(y) 12555 return true 12556 } 12557 return false 12558 } 12559 func rewriteValueARM_OpARMXORshiftRA(v *Value, config *Config) bool { 12560 b := v.Block 12561 _ = b 12562 // match: (XORshiftRA (MOVWconst [c]) x [d]) 12563 // cond: 12564 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 12565 for { 12566 d := v.AuxInt 12567 v_0 := v.Args[0] 12568 if v_0.Op != OpARMMOVWconst { 12569 break 12570 } 12571 c := v_0.AuxInt 12572 x := v.Args[1] 12573 v.reset(OpARMXORconst) 12574 v.AuxInt = c 12575 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12576 v0.AuxInt = d 12577 v0.AddArg(x) 12578 v.AddArg(v0) 12579 return true 12580 } 12581 // match: (XORshiftRA x (MOVWconst [c]) [d]) 12582 // cond: 12583 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 12584 for { 12585 d := v.AuxInt 12586 x := v.Args[0] 12587 v_1 := v.Args[1] 12588 if v_1.Op != OpARMMOVWconst { 12589 break 12590 } 12591 c := v_1.AuxInt 12592 v.reset(OpARMXORconst) 12593 v.AuxInt = int64(int32(c) >> uint64(d)) 12594 v.AddArg(x) 12595 return true 12596 } 12597 // match: (XORshiftRA x (SRAconst x [c]) [d]) 12598 // cond: c==d 12599 // result: (MOVWconst [0]) 12600 for { 12601 d := v.AuxInt 12602 x := v.Args[0] 12603 v_1 := v.Args[1] 12604 if v_1.Op != OpARMSRAconst { 12605 break 12606 } 12607 c := v_1.AuxInt 12608 if x != v_1.Args[0] { 12609 break 12610 } 12611 if !(c == d) { 12612 break 12613 } 12614 v.reset(OpARMMOVWconst) 12615 v.AuxInt = 0 12616 return true 12617 } 12618 return false 12619 } 12620 func rewriteValueARM_OpARMXORshiftRAreg(v *Value, config *Config) bool { 12621 b := v.Block 12622 _ = b 12623 // match: (XORshiftRAreg (MOVWconst [c]) x y) 12624 // cond: 12625 // result: (XORconst [c] (SRA <x.Type> x y)) 12626 for { 12627 v_0 := v.Args[0] 12628 if v_0.Op != OpARMMOVWconst { 12629 break 12630 } 12631 c := v_0.AuxInt 12632 x := v.Args[1] 12633 y := v.Args[2] 12634 v.reset(OpARMXORconst) 12635 v.AuxInt = c 12636 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12637 v0.AddArg(x) 12638 v0.AddArg(y) 12639 v.AddArg(v0) 12640 return true 12641 } 12642 // match: (XORshiftRAreg x y (MOVWconst [c])) 12643 // cond: 12644 // result: (XORshiftRA x y [c]) 12645 for { 12646 x := v.Args[0] 12647 y := v.Args[1] 12648 v_2 := v.Args[2] 12649 if v_2.Op != OpARMMOVWconst { 12650 break 12651 } 12652 c := v_2.AuxInt 12653 v.reset(OpARMXORshiftRA) 12654 v.AuxInt = c 12655 v.AddArg(x) 12656 v.AddArg(y) 12657 return true 12658 } 12659 return false 12660 } 12661 func rewriteValueARM_OpARMXORshiftRL(v *Value, config *Config) bool { 12662 b := v.Block 12663 _ = b 12664 // match: (XORshiftRL (MOVWconst [c]) x [d]) 12665 // cond: 12666 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 12667 for { 12668 d := v.AuxInt 12669 v_0 := v.Args[0] 12670 if v_0.Op != OpARMMOVWconst { 12671 break 12672 } 12673 c := v_0.AuxInt 12674 x := v.Args[1] 12675 v.reset(OpARMXORconst) 12676 v.AuxInt = c 12677 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12678 v0.AuxInt = d 12679 v0.AddArg(x) 12680 v.AddArg(v0) 12681 return true 12682 } 12683 // match: (XORshiftRL x (MOVWconst [c]) [d]) 12684 // cond: 12685 // result: (XORconst x [int64(uint32(c)>>uint64(d))]) 12686 for { 12687 d := v.AuxInt 12688 x := v.Args[0] 12689 v_1 := v.Args[1] 12690 if v_1.Op != OpARMMOVWconst { 12691 break 12692 } 12693 c := v_1.AuxInt 12694 v.reset(OpARMXORconst) 12695 v.AuxInt = int64(uint32(c) >> uint64(d)) 12696 v.AddArg(x) 12697 return true 12698 } 12699 // match: (XORshiftRL [c] (SLLconst x [32-c]) x) 12700 // cond: 12701 // result: (SRRconst [ c] x) 12702 for { 12703 c := v.AuxInt 12704 v_0 := v.Args[0] 12705 if v_0.Op != OpARMSLLconst { 12706 break 12707 } 12708 if v_0.AuxInt != 32-c { 12709 break 12710 } 12711 x := v_0.Args[0] 12712 if x != v.Args[1] { 12713 break 12714 } 12715 v.reset(OpARMSRRconst) 12716 v.AuxInt = c 12717 v.AddArg(x) 12718 return true 12719 } 12720 // match: (XORshiftRL x (SRLconst x [c]) [d]) 12721 // cond: c==d 12722 // result: (MOVWconst [0]) 12723 for { 12724 d := v.AuxInt 12725 x := v.Args[0] 12726 v_1 := v.Args[1] 12727 if v_1.Op != OpARMSRLconst { 12728 break 12729 } 12730 c := v_1.AuxInt 12731 if x != v_1.Args[0] { 12732 break 12733 } 12734 if !(c == d) { 12735 break 12736 } 12737 v.reset(OpARMMOVWconst) 12738 v.AuxInt = 0 12739 return true 12740 } 12741 return false 12742 } 12743 func rewriteValueARM_OpARMXORshiftRLreg(v *Value, config *Config) bool { 12744 b := v.Block 12745 _ = b 12746 // match: (XORshiftRLreg (MOVWconst [c]) x y) 12747 // cond: 12748 // result: (XORconst [c] (SRL <x.Type> x y)) 12749 for { 12750 v_0 := v.Args[0] 12751 if v_0.Op != OpARMMOVWconst { 12752 break 12753 } 12754 c := v_0.AuxInt 12755 x := v.Args[1] 12756 y := v.Args[2] 12757 v.reset(OpARMXORconst) 12758 v.AuxInt = c 12759 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12760 v0.AddArg(x) 12761 v0.AddArg(y) 12762 v.AddArg(v0) 12763 return true 12764 } 12765 // match: (XORshiftRLreg x y (MOVWconst [c])) 12766 // cond: 12767 // result: (XORshiftRL x y [c]) 12768 for { 12769 x := v.Args[0] 12770 y := v.Args[1] 12771 v_2 := v.Args[2] 12772 if v_2.Op != OpARMMOVWconst { 12773 break 12774 } 12775 c := v_2.AuxInt 12776 v.reset(OpARMXORshiftRL) 12777 v.AuxInt = c 12778 v.AddArg(x) 12779 v.AddArg(y) 12780 return true 12781 } 12782 return false 12783 } 12784 func rewriteValueARM_OpARMXORshiftRR(v *Value, config *Config) bool { 12785 b := v.Block 12786 _ = b 12787 // match: (XORshiftRR (MOVWconst [c]) x [d]) 12788 // cond: 12789 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 12790 for { 12791 d := v.AuxInt 12792 v_0 := v.Args[0] 12793 if v_0.Op != OpARMMOVWconst { 12794 break 12795 } 12796 c := v_0.AuxInt 12797 x := v.Args[1] 12798 v.reset(OpARMXORconst) 12799 v.AuxInt = c 12800 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 12801 v0.AuxInt = d 12802 v0.AddArg(x) 12803 v.AddArg(v0) 12804 return true 12805 } 12806 // match: (XORshiftRR x (MOVWconst [c]) [d]) 12807 // cond: 12808 // result: (XORconst x [int64(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 12809 for { 12810 d := v.AuxInt 12811 x := v.Args[0] 12812 v_1 := v.Args[1] 12813 if v_1.Op != OpARMMOVWconst { 12814 break 12815 } 12816 c := v_1.AuxInt 12817 v.reset(OpARMXORconst) 12818 v.AuxInt = int64(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)) 12819 v.AddArg(x) 12820 return true 12821 } 12822 return false 12823 } 12824 func rewriteValueARM_OpAdd16(v *Value, config *Config) bool { 12825 b := v.Block 12826 _ = b 12827 // match: (Add16 x y) 12828 // cond: 12829 // result: (ADD x y) 12830 for { 12831 x := v.Args[0] 12832 y := v.Args[1] 12833 v.reset(OpARMADD) 12834 v.AddArg(x) 12835 v.AddArg(y) 12836 return true 12837 } 12838 } 12839 func rewriteValueARM_OpAdd32(v *Value, config *Config) bool { 12840 b := v.Block 12841 _ = b 12842 // match: (Add32 x y) 12843 // cond: 12844 // result: (ADD x y) 12845 for { 12846 x := v.Args[0] 12847 y := v.Args[1] 12848 v.reset(OpARMADD) 12849 v.AddArg(x) 12850 v.AddArg(y) 12851 return true 12852 } 12853 } 12854 func rewriteValueARM_OpAdd32F(v *Value, config *Config) bool { 12855 b := v.Block 12856 _ = b 12857 // match: (Add32F x y) 12858 // cond: 12859 // result: (ADDF x y) 12860 for { 12861 x := v.Args[0] 12862 y := v.Args[1] 12863 v.reset(OpARMADDF) 12864 v.AddArg(x) 12865 v.AddArg(y) 12866 return true 12867 } 12868 } 12869 func rewriteValueARM_OpAdd32carry(v *Value, config *Config) bool { 12870 b := v.Block 12871 _ = b 12872 // match: (Add32carry x y) 12873 // cond: 12874 // result: (ADDS x y) 12875 for { 12876 x := v.Args[0] 12877 y := v.Args[1] 12878 v.reset(OpARMADDS) 12879 v.AddArg(x) 12880 v.AddArg(y) 12881 return true 12882 } 12883 } 12884 func rewriteValueARM_OpAdd32withcarry(v *Value, config *Config) bool { 12885 b := v.Block 12886 _ = b 12887 // match: (Add32withcarry x y c) 12888 // cond: 12889 // result: (ADC x y c) 12890 for { 12891 x := v.Args[0] 12892 y := v.Args[1] 12893 c := v.Args[2] 12894 v.reset(OpARMADC) 12895 v.AddArg(x) 12896 v.AddArg(y) 12897 v.AddArg(c) 12898 return true 12899 } 12900 } 12901 func rewriteValueARM_OpAdd64F(v *Value, config *Config) bool { 12902 b := v.Block 12903 _ = b 12904 // match: (Add64F x y) 12905 // cond: 12906 // result: (ADDD x y) 12907 for { 12908 x := v.Args[0] 12909 y := v.Args[1] 12910 v.reset(OpARMADDD) 12911 v.AddArg(x) 12912 v.AddArg(y) 12913 return true 12914 } 12915 } 12916 func rewriteValueARM_OpAdd8(v *Value, config *Config) bool { 12917 b := v.Block 12918 _ = b 12919 // match: (Add8 x y) 12920 // cond: 12921 // result: (ADD x y) 12922 for { 12923 x := v.Args[0] 12924 y := v.Args[1] 12925 v.reset(OpARMADD) 12926 v.AddArg(x) 12927 v.AddArg(y) 12928 return true 12929 } 12930 } 12931 func rewriteValueARM_OpAddPtr(v *Value, config *Config) bool { 12932 b := v.Block 12933 _ = b 12934 // match: (AddPtr x y) 12935 // cond: 12936 // result: (ADD x y) 12937 for { 12938 x := v.Args[0] 12939 y := v.Args[1] 12940 v.reset(OpARMADD) 12941 v.AddArg(x) 12942 v.AddArg(y) 12943 return true 12944 } 12945 } 12946 func rewriteValueARM_OpAddr(v *Value, config *Config) bool { 12947 b := v.Block 12948 _ = b 12949 // match: (Addr {sym} base) 12950 // cond: 12951 // result: (MOVWaddr {sym} base) 12952 for { 12953 sym := v.Aux 12954 base := v.Args[0] 12955 v.reset(OpARMMOVWaddr) 12956 v.Aux = sym 12957 v.AddArg(base) 12958 return true 12959 } 12960 } 12961 func rewriteValueARM_OpAnd16(v *Value, config *Config) bool { 12962 b := v.Block 12963 _ = b 12964 // match: (And16 x y) 12965 // cond: 12966 // result: (AND x y) 12967 for { 12968 x := v.Args[0] 12969 y := v.Args[1] 12970 v.reset(OpARMAND) 12971 v.AddArg(x) 12972 v.AddArg(y) 12973 return true 12974 } 12975 } 12976 func rewriteValueARM_OpAnd32(v *Value, config *Config) bool { 12977 b := v.Block 12978 _ = b 12979 // match: (And32 x y) 12980 // cond: 12981 // result: (AND x y) 12982 for { 12983 x := v.Args[0] 12984 y := v.Args[1] 12985 v.reset(OpARMAND) 12986 v.AddArg(x) 12987 v.AddArg(y) 12988 return true 12989 } 12990 } 12991 func rewriteValueARM_OpAnd8(v *Value, config *Config) bool { 12992 b := v.Block 12993 _ = b 12994 // match: (And8 x y) 12995 // cond: 12996 // result: (AND x y) 12997 for { 12998 x := v.Args[0] 12999 y := v.Args[1] 13000 v.reset(OpARMAND) 13001 v.AddArg(x) 13002 v.AddArg(y) 13003 return true 13004 } 13005 } 13006 func rewriteValueARM_OpAndB(v *Value, config *Config) bool { 13007 b := v.Block 13008 _ = b 13009 // match: (AndB x y) 13010 // cond: 13011 // result: (AND x y) 13012 for { 13013 x := v.Args[0] 13014 y := v.Args[1] 13015 v.reset(OpARMAND) 13016 v.AddArg(x) 13017 v.AddArg(y) 13018 return true 13019 } 13020 } 13021 func rewriteValueARM_OpBswap32(v *Value, config *Config) bool { 13022 b := v.Block 13023 _ = b 13024 // match: (Bswap32 <t> x) 13025 // cond: 13026 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 13027 for { 13028 t := v.Type 13029 x := v.Args[0] 13030 v.reset(OpARMXOR) 13031 v.Type = t 13032 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13033 v0.AuxInt = 8 13034 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 13035 v1.AuxInt = 0xff0000 13036 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 13037 v2.AddArg(x) 13038 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13039 v3.AuxInt = 16 13040 v3.AddArg(x) 13041 v2.AddArg(v3) 13042 v1.AddArg(v2) 13043 v0.AddArg(v1) 13044 v.AddArg(v0) 13045 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13046 v4.AuxInt = 8 13047 v4.AddArg(x) 13048 v.AddArg(v4) 13049 return true 13050 } 13051 } 13052 func rewriteValueARM_OpClosureCall(v *Value, config *Config) bool { 13053 b := v.Block 13054 _ = b 13055 // match: (ClosureCall [argwid] entry closure mem) 13056 // cond: 13057 // result: (CALLclosure [argwid] entry closure mem) 13058 for { 13059 argwid := v.AuxInt 13060 entry := v.Args[0] 13061 closure := v.Args[1] 13062 mem := v.Args[2] 13063 v.reset(OpARMCALLclosure) 13064 v.AuxInt = argwid 13065 v.AddArg(entry) 13066 v.AddArg(closure) 13067 v.AddArg(mem) 13068 return true 13069 } 13070 } 13071 func rewriteValueARM_OpCom16(v *Value, config *Config) bool { 13072 b := v.Block 13073 _ = b 13074 // match: (Com16 x) 13075 // cond: 13076 // result: (MVN x) 13077 for { 13078 x := v.Args[0] 13079 v.reset(OpARMMVN) 13080 v.AddArg(x) 13081 return true 13082 } 13083 } 13084 func rewriteValueARM_OpCom32(v *Value, config *Config) bool { 13085 b := v.Block 13086 _ = b 13087 // match: (Com32 x) 13088 // cond: 13089 // result: (MVN x) 13090 for { 13091 x := v.Args[0] 13092 v.reset(OpARMMVN) 13093 v.AddArg(x) 13094 return true 13095 } 13096 } 13097 func rewriteValueARM_OpCom8(v *Value, config *Config) bool { 13098 b := v.Block 13099 _ = b 13100 // match: (Com8 x) 13101 // cond: 13102 // result: (MVN x) 13103 for { 13104 x := v.Args[0] 13105 v.reset(OpARMMVN) 13106 v.AddArg(x) 13107 return true 13108 } 13109 } 13110 func rewriteValueARM_OpConst16(v *Value, config *Config) bool { 13111 b := v.Block 13112 _ = b 13113 // match: (Const16 [val]) 13114 // cond: 13115 // result: (MOVWconst [val]) 13116 for { 13117 val := v.AuxInt 13118 v.reset(OpARMMOVWconst) 13119 v.AuxInt = val 13120 return true 13121 } 13122 } 13123 func rewriteValueARM_OpConst32(v *Value, config *Config) bool { 13124 b := v.Block 13125 _ = b 13126 // match: (Const32 [val]) 13127 // cond: 13128 // result: (MOVWconst [val]) 13129 for { 13130 val := v.AuxInt 13131 v.reset(OpARMMOVWconst) 13132 v.AuxInt = val 13133 return true 13134 } 13135 } 13136 func rewriteValueARM_OpConst32F(v *Value, config *Config) bool { 13137 b := v.Block 13138 _ = b 13139 // match: (Const32F [val]) 13140 // cond: 13141 // result: (MOVFconst [val]) 13142 for { 13143 val := v.AuxInt 13144 v.reset(OpARMMOVFconst) 13145 v.AuxInt = val 13146 return true 13147 } 13148 } 13149 func rewriteValueARM_OpConst64F(v *Value, config *Config) bool { 13150 b := v.Block 13151 _ = b 13152 // match: (Const64F [val]) 13153 // cond: 13154 // result: (MOVDconst [val]) 13155 for { 13156 val := v.AuxInt 13157 v.reset(OpARMMOVDconst) 13158 v.AuxInt = val 13159 return true 13160 } 13161 } 13162 func rewriteValueARM_OpConst8(v *Value, config *Config) bool { 13163 b := v.Block 13164 _ = b 13165 // match: (Const8 [val]) 13166 // cond: 13167 // result: (MOVWconst [val]) 13168 for { 13169 val := v.AuxInt 13170 v.reset(OpARMMOVWconst) 13171 v.AuxInt = val 13172 return true 13173 } 13174 } 13175 func rewriteValueARM_OpConstBool(v *Value, config *Config) bool { 13176 b := v.Block 13177 _ = b 13178 // match: (ConstBool [b]) 13179 // cond: 13180 // result: (MOVWconst [b]) 13181 for { 13182 b := v.AuxInt 13183 v.reset(OpARMMOVWconst) 13184 v.AuxInt = b 13185 return true 13186 } 13187 } 13188 func rewriteValueARM_OpConstNil(v *Value, config *Config) bool { 13189 b := v.Block 13190 _ = b 13191 // match: (ConstNil) 13192 // cond: 13193 // result: (MOVWconst [0]) 13194 for { 13195 v.reset(OpARMMOVWconst) 13196 v.AuxInt = 0 13197 return true 13198 } 13199 } 13200 func rewriteValueARM_OpConvert(v *Value, config *Config) bool { 13201 b := v.Block 13202 _ = b 13203 // match: (Convert x mem) 13204 // cond: 13205 // result: (MOVWconvert x mem) 13206 for { 13207 x := v.Args[0] 13208 mem := v.Args[1] 13209 v.reset(OpARMMOVWconvert) 13210 v.AddArg(x) 13211 v.AddArg(mem) 13212 return true 13213 } 13214 } 13215 func rewriteValueARM_OpCtz32(v *Value, config *Config) bool { 13216 b := v.Block 13217 _ = b 13218 // match: (Ctz32 <t> x) 13219 // cond: 13220 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 13221 for { 13222 t := v.Type 13223 x := v.Args[0] 13224 v.reset(OpARMRSBconst) 13225 v.AuxInt = 32 13226 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13227 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 13228 v1.AuxInt = 1 13229 v2 := b.NewValue0(v.Pos, OpARMAND, t) 13230 v2.AddArg(x) 13231 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 13232 v3.AuxInt = 0 13233 v3.AddArg(x) 13234 v2.AddArg(v3) 13235 v1.AddArg(v2) 13236 v0.AddArg(v1) 13237 v.AddArg(v0) 13238 return true 13239 } 13240 } 13241 func rewriteValueARM_OpCvt32Fto32(v *Value, config *Config) bool { 13242 b := v.Block 13243 _ = b 13244 // match: (Cvt32Fto32 x) 13245 // cond: 13246 // result: (MOVFW x) 13247 for { 13248 x := v.Args[0] 13249 v.reset(OpARMMOVFW) 13250 v.AddArg(x) 13251 return true 13252 } 13253 } 13254 func rewriteValueARM_OpCvt32Fto32U(v *Value, config *Config) bool { 13255 b := v.Block 13256 _ = b 13257 // match: (Cvt32Fto32U x) 13258 // cond: 13259 // result: (MOVFWU x) 13260 for { 13261 x := v.Args[0] 13262 v.reset(OpARMMOVFWU) 13263 v.AddArg(x) 13264 return true 13265 } 13266 } 13267 func rewriteValueARM_OpCvt32Fto64F(v *Value, config *Config) bool { 13268 b := v.Block 13269 _ = b 13270 // match: (Cvt32Fto64F x) 13271 // cond: 13272 // result: (MOVFD x) 13273 for { 13274 x := v.Args[0] 13275 v.reset(OpARMMOVFD) 13276 v.AddArg(x) 13277 return true 13278 } 13279 } 13280 func rewriteValueARM_OpCvt32Uto32F(v *Value, config *Config) bool { 13281 b := v.Block 13282 _ = b 13283 // match: (Cvt32Uto32F x) 13284 // cond: 13285 // result: (MOVWUF x) 13286 for { 13287 x := v.Args[0] 13288 v.reset(OpARMMOVWUF) 13289 v.AddArg(x) 13290 return true 13291 } 13292 } 13293 func rewriteValueARM_OpCvt32Uto64F(v *Value, config *Config) bool { 13294 b := v.Block 13295 _ = b 13296 // match: (Cvt32Uto64F x) 13297 // cond: 13298 // result: (MOVWUD x) 13299 for { 13300 x := v.Args[0] 13301 v.reset(OpARMMOVWUD) 13302 v.AddArg(x) 13303 return true 13304 } 13305 } 13306 func rewriteValueARM_OpCvt32to32F(v *Value, config *Config) bool { 13307 b := v.Block 13308 _ = b 13309 // match: (Cvt32to32F x) 13310 // cond: 13311 // result: (MOVWF x) 13312 for { 13313 x := v.Args[0] 13314 v.reset(OpARMMOVWF) 13315 v.AddArg(x) 13316 return true 13317 } 13318 } 13319 func rewriteValueARM_OpCvt32to64F(v *Value, config *Config) bool { 13320 b := v.Block 13321 _ = b 13322 // match: (Cvt32to64F x) 13323 // cond: 13324 // result: (MOVWD x) 13325 for { 13326 x := v.Args[0] 13327 v.reset(OpARMMOVWD) 13328 v.AddArg(x) 13329 return true 13330 } 13331 } 13332 func rewriteValueARM_OpCvt64Fto32(v *Value, config *Config) bool { 13333 b := v.Block 13334 _ = b 13335 // match: (Cvt64Fto32 x) 13336 // cond: 13337 // result: (MOVDW x) 13338 for { 13339 x := v.Args[0] 13340 v.reset(OpARMMOVDW) 13341 v.AddArg(x) 13342 return true 13343 } 13344 } 13345 func rewriteValueARM_OpCvt64Fto32F(v *Value, config *Config) bool { 13346 b := v.Block 13347 _ = b 13348 // match: (Cvt64Fto32F x) 13349 // cond: 13350 // result: (MOVDF x) 13351 for { 13352 x := v.Args[0] 13353 v.reset(OpARMMOVDF) 13354 v.AddArg(x) 13355 return true 13356 } 13357 } 13358 func rewriteValueARM_OpCvt64Fto32U(v *Value, config *Config) bool { 13359 b := v.Block 13360 _ = b 13361 // match: (Cvt64Fto32U x) 13362 // cond: 13363 // result: (MOVDWU x) 13364 for { 13365 x := v.Args[0] 13366 v.reset(OpARMMOVDWU) 13367 v.AddArg(x) 13368 return true 13369 } 13370 } 13371 func rewriteValueARM_OpDeferCall(v *Value, config *Config) bool { 13372 b := v.Block 13373 _ = b 13374 // match: (DeferCall [argwid] mem) 13375 // cond: 13376 // result: (CALLdefer [argwid] mem) 13377 for { 13378 argwid := v.AuxInt 13379 mem := v.Args[0] 13380 v.reset(OpARMCALLdefer) 13381 v.AuxInt = argwid 13382 v.AddArg(mem) 13383 return true 13384 } 13385 } 13386 func rewriteValueARM_OpDiv16(v *Value, config *Config) bool { 13387 b := v.Block 13388 _ = b 13389 // match: (Div16 x y) 13390 // cond: 13391 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 13392 for { 13393 x := v.Args[0] 13394 y := v.Args[1] 13395 v.reset(OpDiv32) 13396 v0 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 13397 v0.AddArg(x) 13398 v.AddArg(v0) 13399 v1 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 13400 v1.AddArg(y) 13401 v.AddArg(v1) 13402 return true 13403 } 13404 } 13405 func rewriteValueARM_OpDiv16u(v *Value, config *Config) bool { 13406 b := v.Block 13407 _ = b 13408 // match: (Div16u x y) 13409 // cond: 13410 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 13411 for { 13412 x := v.Args[0] 13413 y := v.Args[1] 13414 v.reset(OpDiv32u) 13415 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 13416 v0.AddArg(x) 13417 v.AddArg(v0) 13418 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 13419 v1.AddArg(y) 13420 v.AddArg(v1) 13421 return true 13422 } 13423 } 13424 func rewriteValueARM_OpDiv32(v *Value, config *Config) bool { 13425 b := v.Block 13426 _ = b 13427 // match: (Div32 x y) 13428 // cond: 13429 // result: (SUB (XOR <config.fe.TypeUInt32()> (Select0 <config.fe.TypeUInt32()> (UDIVrtcall (SUB <config.fe.TypeUInt32()> (XOR x <config.fe.TypeUInt32()> (Signmask x)) (Signmask x)) (SUB <config.fe.TypeUInt32()> (XOR y <config.fe.TypeUInt32()> (Signmask y)) (Signmask y)))) (Signmask (XOR <config.fe.TypeUInt32()> x y))) (Signmask (XOR <config.fe.TypeUInt32()> x y))) 13430 for { 13431 x := v.Args[0] 13432 y := v.Args[1] 13433 v.reset(OpARMSUB) 13434 v0 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeUInt32()) 13435 v1 := b.NewValue0(v.Pos, OpSelect0, config.fe.TypeUInt32()) 13436 v2 := b.NewValue0(v.Pos, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 13437 v3 := b.NewValue0(v.Pos, OpARMSUB, config.fe.TypeUInt32()) 13438 v4 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeUInt32()) 13439 v4.AddArg(x) 13440 v5 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 13441 v5.AddArg(x) 13442 v4.AddArg(v5) 13443 v3.AddArg(v4) 13444 v6 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 13445 v6.AddArg(x) 13446 v3.AddArg(v6) 13447 v2.AddArg(v3) 13448 v7 := b.NewValue0(v.Pos, OpARMSUB, config.fe.TypeUInt32()) 13449 v8 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeUInt32()) 13450 v8.AddArg(y) 13451 v9 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 13452 v9.AddArg(y) 13453 v8.AddArg(v9) 13454 v7.AddArg(v8) 13455 v10 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 13456 v10.AddArg(y) 13457 v7.AddArg(v10) 13458 v2.AddArg(v7) 13459 v1.AddArg(v2) 13460 v0.AddArg(v1) 13461 v11 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 13462 v12 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeUInt32()) 13463 v12.AddArg(x) 13464 v12.AddArg(y) 13465 v11.AddArg(v12) 13466 v0.AddArg(v11) 13467 v.AddArg(v0) 13468 v13 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 13469 v14 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeUInt32()) 13470 v14.AddArg(x) 13471 v14.AddArg(y) 13472 v13.AddArg(v14) 13473 v.AddArg(v13) 13474 return true 13475 } 13476 } 13477 func rewriteValueARM_OpDiv32F(v *Value, config *Config) bool { 13478 b := v.Block 13479 _ = b 13480 // match: (Div32F x y) 13481 // cond: 13482 // result: (DIVF x y) 13483 for { 13484 x := v.Args[0] 13485 y := v.Args[1] 13486 v.reset(OpARMDIVF) 13487 v.AddArg(x) 13488 v.AddArg(y) 13489 return true 13490 } 13491 } 13492 func rewriteValueARM_OpDiv32u(v *Value, config *Config) bool { 13493 b := v.Block 13494 _ = b 13495 // match: (Div32u x y) 13496 // cond: 13497 // result: (Select0 <config.fe.TypeUInt32()> (UDIVrtcall x y)) 13498 for { 13499 x := v.Args[0] 13500 y := v.Args[1] 13501 v.reset(OpSelect0) 13502 v.Type = config.fe.TypeUInt32() 13503 v0 := b.NewValue0(v.Pos, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 13504 v0.AddArg(x) 13505 v0.AddArg(y) 13506 v.AddArg(v0) 13507 return true 13508 } 13509 } 13510 func rewriteValueARM_OpDiv64F(v *Value, config *Config) bool { 13511 b := v.Block 13512 _ = b 13513 // match: (Div64F x y) 13514 // cond: 13515 // result: (DIVD x y) 13516 for { 13517 x := v.Args[0] 13518 y := v.Args[1] 13519 v.reset(OpARMDIVD) 13520 v.AddArg(x) 13521 v.AddArg(y) 13522 return true 13523 } 13524 } 13525 func rewriteValueARM_OpDiv8(v *Value, config *Config) bool { 13526 b := v.Block 13527 _ = b 13528 // match: (Div8 x y) 13529 // cond: 13530 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 13531 for { 13532 x := v.Args[0] 13533 y := v.Args[1] 13534 v.reset(OpDiv32) 13535 v0 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 13536 v0.AddArg(x) 13537 v.AddArg(v0) 13538 v1 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 13539 v1.AddArg(y) 13540 v.AddArg(v1) 13541 return true 13542 } 13543 } 13544 func rewriteValueARM_OpDiv8u(v *Value, config *Config) bool { 13545 b := v.Block 13546 _ = b 13547 // match: (Div8u x y) 13548 // cond: 13549 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 13550 for { 13551 x := v.Args[0] 13552 y := v.Args[1] 13553 v.reset(OpDiv32u) 13554 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 13555 v0.AddArg(x) 13556 v.AddArg(v0) 13557 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 13558 v1.AddArg(y) 13559 v.AddArg(v1) 13560 return true 13561 } 13562 } 13563 func rewriteValueARM_OpEq16(v *Value, config *Config) bool { 13564 b := v.Block 13565 _ = b 13566 // match: (Eq16 x y) 13567 // cond: 13568 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13569 for { 13570 x := v.Args[0] 13571 y := v.Args[1] 13572 v.reset(OpARMEqual) 13573 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13574 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 13575 v1.AddArg(x) 13576 v0.AddArg(v1) 13577 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 13578 v2.AddArg(y) 13579 v0.AddArg(v2) 13580 v.AddArg(v0) 13581 return true 13582 } 13583 } 13584 func rewriteValueARM_OpEq32(v *Value, config *Config) bool { 13585 b := v.Block 13586 _ = b 13587 // match: (Eq32 x y) 13588 // cond: 13589 // result: (Equal (CMP x y)) 13590 for { 13591 x := v.Args[0] 13592 y := v.Args[1] 13593 v.reset(OpARMEqual) 13594 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13595 v0.AddArg(x) 13596 v0.AddArg(y) 13597 v.AddArg(v0) 13598 return true 13599 } 13600 } 13601 func rewriteValueARM_OpEq32F(v *Value, config *Config) bool { 13602 b := v.Block 13603 _ = b 13604 // match: (Eq32F x y) 13605 // cond: 13606 // result: (Equal (CMPF x y)) 13607 for { 13608 x := v.Args[0] 13609 y := v.Args[1] 13610 v.reset(OpARMEqual) 13611 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 13612 v0.AddArg(x) 13613 v0.AddArg(y) 13614 v.AddArg(v0) 13615 return true 13616 } 13617 } 13618 func rewriteValueARM_OpEq64F(v *Value, config *Config) bool { 13619 b := v.Block 13620 _ = b 13621 // match: (Eq64F x y) 13622 // cond: 13623 // result: (Equal (CMPD x y)) 13624 for { 13625 x := v.Args[0] 13626 y := v.Args[1] 13627 v.reset(OpARMEqual) 13628 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 13629 v0.AddArg(x) 13630 v0.AddArg(y) 13631 v.AddArg(v0) 13632 return true 13633 } 13634 } 13635 func rewriteValueARM_OpEq8(v *Value, config *Config) bool { 13636 b := v.Block 13637 _ = b 13638 // match: (Eq8 x y) 13639 // cond: 13640 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13641 for { 13642 x := v.Args[0] 13643 y := v.Args[1] 13644 v.reset(OpARMEqual) 13645 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13646 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 13647 v1.AddArg(x) 13648 v0.AddArg(v1) 13649 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 13650 v2.AddArg(y) 13651 v0.AddArg(v2) 13652 v.AddArg(v0) 13653 return true 13654 } 13655 } 13656 func rewriteValueARM_OpEqB(v *Value, config *Config) bool { 13657 b := v.Block 13658 _ = b 13659 // match: (EqB x y) 13660 // cond: 13661 // result: (XORconst [1] (XOR <config.fe.TypeBool()> x y)) 13662 for { 13663 x := v.Args[0] 13664 y := v.Args[1] 13665 v.reset(OpARMXORconst) 13666 v.AuxInt = 1 13667 v0 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeBool()) 13668 v0.AddArg(x) 13669 v0.AddArg(y) 13670 v.AddArg(v0) 13671 return true 13672 } 13673 } 13674 func rewriteValueARM_OpEqPtr(v *Value, config *Config) bool { 13675 b := v.Block 13676 _ = b 13677 // match: (EqPtr x y) 13678 // cond: 13679 // result: (Equal (CMP x y)) 13680 for { 13681 x := v.Args[0] 13682 y := v.Args[1] 13683 v.reset(OpARMEqual) 13684 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13685 v0.AddArg(x) 13686 v0.AddArg(y) 13687 v.AddArg(v0) 13688 return true 13689 } 13690 } 13691 func rewriteValueARM_OpGeq16(v *Value, config *Config) bool { 13692 b := v.Block 13693 _ = b 13694 // match: (Geq16 x y) 13695 // cond: 13696 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 13697 for { 13698 x := v.Args[0] 13699 y := v.Args[1] 13700 v.reset(OpARMGreaterEqual) 13701 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13702 v1 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 13703 v1.AddArg(x) 13704 v0.AddArg(v1) 13705 v2 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 13706 v2.AddArg(y) 13707 v0.AddArg(v2) 13708 v.AddArg(v0) 13709 return true 13710 } 13711 } 13712 func rewriteValueARM_OpGeq16U(v *Value, config *Config) bool { 13713 b := v.Block 13714 _ = b 13715 // match: (Geq16U x y) 13716 // cond: 13717 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13718 for { 13719 x := v.Args[0] 13720 y := v.Args[1] 13721 v.reset(OpARMGreaterEqualU) 13722 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13723 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 13724 v1.AddArg(x) 13725 v0.AddArg(v1) 13726 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 13727 v2.AddArg(y) 13728 v0.AddArg(v2) 13729 v.AddArg(v0) 13730 return true 13731 } 13732 } 13733 func rewriteValueARM_OpGeq32(v *Value, config *Config) bool { 13734 b := v.Block 13735 _ = b 13736 // match: (Geq32 x y) 13737 // cond: 13738 // result: (GreaterEqual (CMP x y)) 13739 for { 13740 x := v.Args[0] 13741 y := v.Args[1] 13742 v.reset(OpARMGreaterEqual) 13743 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13744 v0.AddArg(x) 13745 v0.AddArg(y) 13746 v.AddArg(v0) 13747 return true 13748 } 13749 } 13750 func rewriteValueARM_OpGeq32F(v *Value, config *Config) bool { 13751 b := v.Block 13752 _ = b 13753 // match: (Geq32F x y) 13754 // cond: 13755 // result: (GreaterEqual (CMPF x y)) 13756 for { 13757 x := v.Args[0] 13758 y := v.Args[1] 13759 v.reset(OpARMGreaterEqual) 13760 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 13761 v0.AddArg(x) 13762 v0.AddArg(y) 13763 v.AddArg(v0) 13764 return true 13765 } 13766 } 13767 func rewriteValueARM_OpGeq32U(v *Value, config *Config) bool { 13768 b := v.Block 13769 _ = b 13770 // match: (Geq32U x y) 13771 // cond: 13772 // result: (GreaterEqualU (CMP x y)) 13773 for { 13774 x := v.Args[0] 13775 y := v.Args[1] 13776 v.reset(OpARMGreaterEqualU) 13777 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13778 v0.AddArg(x) 13779 v0.AddArg(y) 13780 v.AddArg(v0) 13781 return true 13782 } 13783 } 13784 func rewriteValueARM_OpGeq64F(v *Value, config *Config) bool { 13785 b := v.Block 13786 _ = b 13787 // match: (Geq64F x y) 13788 // cond: 13789 // result: (GreaterEqual (CMPD x y)) 13790 for { 13791 x := v.Args[0] 13792 y := v.Args[1] 13793 v.reset(OpARMGreaterEqual) 13794 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 13795 v0.AddArg(x) 13796 v0.AddArg(y) 13797 v.AddArg(v0) 13798 return true 13799 } 13800 } 13801 func rewriteValueARM_OpGeq8(v *Value, config *Config) bool { 13802 b := v.Block 13803 _ = b 13804 // match: (Geq8 x y) 13805 // cond: 13806 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 13807 for { 13808 x := v.Args[0] 13809 y := v.Args[1] 13810 v.reset(OpARMGreaterEqual) 13811 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13812 v1 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 13813 v1.AddArg(x) 13814 v0.AddArg(v1) 13815 v2 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 13816 v2.AddArg(y) 13817 v0.AddArg(v2) 13818 v.AddArg(v0) 13819 return true 13820 } 13821 } 13822 func rewriteValueARM_OpGeq8U(v *Value, config *Config) bool { 13823 b := v.Block 13824 _ = b 13825 // match: (Geq8U x y) 13826 // cond: 13827 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13828 for { 13829 x := v.Args[0] 13830 y := v.Args[1] 13831 v.reset(OpARMGreaterEqualU) 13832 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13833 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 13834 v1.AddArg(x) 13835 v0.AddArg(v1) 13836 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 13837 v2.AddArg(y) 13838 v0.AddArg(v2) 13839 v.AddArg(v0) 13840 return true 13841 } 13842 } 13843 func rewriteValueARM_OpGetClosurePtr(v *Value, config *Config) bool { 13844 b := v.Block 13845 _ = b 13846 // match: (GetClosurePtr) 13847 // cond: 13848 // result: (LoweredGetClosurePtr) 13849 for { 13850 v.reset(OpARMLoweredGetClosurePtr) 13851 return true 13852 } 13853 } 13854 func rewriteValueARM_OpGoCall(v *Value, config *Config) bool { 13855 b := v.Block 13856 _ = b 13857 // match: (GoCall [argwid] mem) 13858 // cond: 13859 // result: (CALLgo [argwid] mem) 13860 for { 13861 argwid := v.AuxInt 13862 mem := v.Args[0] 13863 v.reset(OpARMCALLgo) 13864 v.AuxInt = argwid 13865 v.AddArg(mem) 13866 return true 13867 } 13868 } 13869 func rewriteValueARM_OpGreater16(v *Value, config *Config) bool { 13870 b := v.Block 13871 _ = b 13872 // match: (Greater16 x y) 13873 // cond: 13874 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 13875 for { 13876 x := v.Args[0] 13877 y := v.Args[1] 13878 v.reset(OpARMGreaterThan) 13879 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13880 v1 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 13881 v1.AddArg(x) 13882 v0.AddArg(v1) 13883 v2 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 13884 v2.AddArg(y) 13885 v0.AddArg(v2) 13886 v.AddArg(v0) 13887 return true 13888 } 13889 } 13890 func rewriteValueARM_OpGreater16U(v *Value, config *Config) bool { 13891 b := v.Block 13892 _ = b 13893 // match: (Greater16U x y) 13894 // cond: 13895 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13896 for { 13897 x := v.Args[0] 13898 y := v.Args[1] 13899 v.reset(OpARMGreaterThanU) 13900 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13901 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 13902 v1.AddArg(x) 13903 v0.AddArg(v1) 13904 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 13905 v2.AddArg(y) 13906 v0.AddArg(v2) 13907 v.AddArg(v0) 13908 return true 13909 } 13910 } 13911 func rewriteValueARM_OpGreater32(v *Value, config *Config) bool { 13912 b := v.Block 13913 _ = b 13914 // match: (Greater32 x y) 13915 // cond: 13916 // result: (GreaterThan (CMP x y)) 13917 for { 13918 x := v.Args[0] 13919 y := v.Args[1] 13920 v.reset(OpARMGreaterThan) 13921 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13922 v0.AddArg(x) 13923 v0.AddArg(y) 13924 v.AddArg(v0) 13925 return true 13926 } 13927 } 13928 func rewriteValueARM_OpGreater32F(v *Value, config *Config) bool { 13929 b := v.Block 13930 _ = b 13931 // match: (Greater32F x y) 13932 // cond: 13933 // result: (GreaterThan (CMPF x y)) 13934 for { 13935 x := v.Args[0] 13936 y := v.Args[1] 13937 v.reset(OpARMGreaterThan) 13938 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 13939 v0.AddArg(x) 13940 v0.AddArg(y) 13941 v.AddArg(v0) 13942 return true 13943 } 13944 } 13945 func rewriteValueARM_OpGreater32U(v *Value, config *Config) bool { 13946 b := v.Block 13947 _ = b 13948 // match: (Greater32U x y) 13949 // cond: 13950 // result: (GreaterThanU (CMP x y)) 13951 for { 13952 x := v.Args[0] 13953 y := v.Args[1] 13954 v.reset(OpARMGreaterThanU) 13955 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13956 v0.AddArg(x) 13957 v0.AddArg(y) 13958 v.AddArg(v0) 13959 return true 13960 } 13961 } 13962 func rewriteValueARM_OpGreater64F(v *Value, config *Config) bool { 13963 b := v.Block 13964 _ = b 13965 // match: (Greater64F x y) 13966 // cond: 13967 // result: (GreaterThan (CMPD x y)) 13968 for { 13969 x := v.Args[0] 13970 y := v.Args[1] 13971 v.reset(OpARMGreaterThan) 13972 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 13973 v0.AddArg(x) 13974 v0.AddArg(y) 13975 v.AddArg(v0) 13976 return true 13977 } 13978 } 13979 func rewriteValueARM_OpGreater8(v *Value, config *Config) bool { 13980 b := v.Block 13981 _ = b 13982 // match: (Greater8 x y) 13983 // cond: 13984 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 13985 for { 13986 x := v.Args[0] 13987 y := v.Args[1] 13988 v.reset(OpARMGreaterThan) 13989 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13990 v1 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 13991 v1.AddArg(x) 13992 v0.AddArg(v1) 13993 v2 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 13994 v2.AddArg(y) 13995 v0.AddArg(v2) 13996 v.AddArg(v0) 13997 return true 13998 } 13999 } 14000 func rewriteValueARM_OpGreater8U(v *Value, config *Config) bool { 14001 b := v.Block 14002 _ = b 14003 // match: (Greater8U x y) 14004 // cond: 14005 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14006 for { 14007 x := v.Args[0] 14008 y := v.Args[1] 14009 v.reset(OpARMGreaterThanU) 14010 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14011 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14012 v1.AddArg(x) 14013 v0.AddArg(v1) 14014 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14015 v2.AddArg(y) 14016 v0.AddArg(v2) 14017 v.AddArg(v0) 14018 return true 14019 } 14020 } 14021 func rewriteValueARM_OpHmul16(v *Value, config *Config) bool { 14022 b := v.Block 14023 _ = b 14024 // match: (Hmul16 x y) 14025 // cond: 14026 // result: (SRAconst (MUL <config.fe.TypeInt32()> (SignExt16to32 x) (SignExt16to32 y)) [16]) 14027 for { 14028 x := v.Args[0] 14029 y := v.Args[1] 14030 v.reset(OpARMSRAconst) 14031 v.AuxInt = 16 14032 v0 := b.NewValue0(v.Pos, OpARMMUL, config.fe.TypeInt32()) 14033 v1 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 14034 v1.AddArg(x) 14035 v0.AddArg(v1) 14036 v2 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 14037 v2.AddArg(y) 14038 v0.AddArg(v2) 14039 v.AddArg(v0) 14040 return true 14041 } 14042 } 14043 func rewriteValueARM_OpHmul16u(v *Value, config *Config) bool { 14044 b := v.Block 14045 _ = b 14046 // match: (Hmul16u x y) 14047 // cond: 14048 // result: (SRLconst (MUL <config.fe.TypeUInt32()> (ZeroExt16to32 x) (ZeroExt16to32 y)) [16]) 14049 for { 14050 x := v.Args[0] 14051 y := v.Args[1] 14052 v.reset(OpARMSRLconst) 14053 v.AuxInt = 16 14054 v0 := b.NewValue0(v.Pos, OpARMMUL, config.fe.TypeUInt32()) 14055 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14056 v1.AddArg(x) 14057 v0.AddArg(v1) 14058 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14059 v2.AddArg(y) 14060 v0.AddArg(v2) 14061 v.AddArg(v0) 14062 return true 14063 } 14064 } 14065 func rewriteValueARM_OpHmul32(v *Value, config *Config) bool { 14066 b := v.Block 14067 _ = b 14068 // match: (Hmul32 x y) 14069 // cond: 14070 // result: (HMUL x y) 14071 for { 14072 x := v.Args[0] 14073 y := v.Args[1] 14074 v.reset(OpARMHMUL) 14075 v.AddArg(x) 14076 v.AddArg(y) 14077 return true 14078 } 14079 } 14080 func rewriteValueARM_OpHmul32u(v *Value, config *Config) bool { 14081 b := v.Block 14082 _ = b 14083 // match: (Hmul32u x y) 14084 // cond: 14085 // result: (HMULU x y) 14086 for { 14087 x := v.Args[0] 14088 y := v.Args[1] 14089 v.reset(OpARMHMULU) 14090 v.AddArg(x) 14091 v.AddArg(y) 14092 return true 14093 } 14094 } 14095 func rewriteValueARM_OpHmul8(v *Value, config *Config) bool { 14096 b := v.Block 14097 _ = b 14098 // match: (Hmul8 x y) 14099 // cond: 14100 // result: (SRAconst (MUL <config.fe.TypeInt16()> (SignExt8to32 x) (SignExt8to32 y)) [8]) 14101 for { 14102 x := v.Args[0] 14103 y := v.Args[1] 14104 v.reset(OpARMSRAconst) 14105 v.AuxInt = 8 14106 v0 := b.NewValue0(v.Pos, OpARMMUL, config.fe.TypeInt16()) 14107 v1 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 14108 v1.AddArg(x) 14109 v0.AddArg(v1) 14110 v2 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 14111 v2.AddArg(y) 14112 v0.AddArg(v2) 14113 v.AddArg(v0) 14114 return true 14115 } 14116 } 14117 func rewriteValueARM_OpHmul8u(v *Value, config *Config) bool { 14118 b := v.Block 14119 _ = b 14120 // match: (Hmul8u x y) 14121 // cond: 14122 // result: (SRLconst (MUL <config.fe.TypeUInt16()> (ZeroExt8to32 x) (ZeroExt8to32 y)) [8]) 14123 for { 14124 x := v.Args[0] 14125 y := v.Args[1] 14126 v.reset(OpARMSRLconst) 14127 v.AuxInt = 8 14128 v0 := b.NewValue0(v.Pos, OpARMMUL, config.fe.TypeUInt16()) 14129 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14130 v1.AddArg(x) 14131 v0.AddArg(v1) 14132 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14133 v2.AddArg(y) 14134 v0.AddArg(v2) 14135 v.AddArg(v0) 14136 return true 14137 } 14138 } 14139 func rewriteValueARM_OpInterCall(v *Value, config *Config) bool { 14140 b := v.Block 14141 _ = b 14142 // match: (InterCall [argwid] entry mem) 14143 // cond: 14144 // result: (CALLinter [argwid] entry mem) 14145 for { 14146 argwid := v.AuxInt 14147 entry := v.Args[0] 14148 mem := v.Args[1] 14149 v.reset(OpARMCALLinter) 14150 v.AuxInt = argwid 14151 v.AddArg(entry) 14152 v.AddArg(mem) 14153 return true 14154 } 14155 } 14156 func rewriteValueARM_OpIsInBounds(v *Value, config *Config) bool { 14157 b := v.Block 14158 _ = b 14159 // match: (IsInBounds idx len) 14160 // cond: 14161 // result: (LessThanU (CMP idx len)) 14162 for { 14163 idx := v.Args[0] 14164 len := v.Args[1] 14165 v.reset(OpARMLessThanU) 14166 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14167 v0.AddArg(idx) 14168 v0.AddArg(len) 14169 v.AddArg(v0) 14170 return true 14171 } 14172 } 14173 func rewriteValueARM_OpIsNonNil(v *Value, config *Config) bool { 14174 b := v.Block 14175 _ = b 14176 // match: (IsNonNil ptr) 14177 // cond: 14178 // result: (NotEqual (CMPconst [0] ptr)) 14179 for { 14180 ptr := v.Args[0] 14181 v.reset(OpARMNotEqual) 14182 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14183 v0.AuxInt = 0 14184 v0.AddArg(ptr) 14185 v.AddArg(v0) 14186 return true 14187 } 14188 } 14189 func rewriteValueARM_OpIsSliceInBounds(v *Value, config *Config) bool { 14190 b := v.Block 14191 _ = b 14192 // match: (IsSliceInBounds idx len) 14193 // cond: 14194 // result: (LessEqualU (CMP idx len)) 14195 for { 14196 idx := v.Args[0] 14197 len := v.Args[1] 14198 v.reset(OpARMLessEqualU) 14199 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14200 v0.AddArg(idx) 14201 v0.AddArg(len) 14202 v.AddArg(v0) 14203 return true 14204 } 14205 } 14206 func rewriteValueARM_OpLeq16(v *Value, config *Config) bool { 14207 b := v.Block 14208 _ = b 14209 // match: (Leq16 x y) 14210 // cond: 14211 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 14212 for { 14213 x := v.Args[0] 14214 y := v.Args[1] 14215 v.reset(OpARMLessEqual) 14216 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14217 v1 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 14218 v1.AddArg(x) 14219 v0.AddArg(v1) 14220 v2 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 14221 v2.AddArg(y) 14222 v0.AddArg(v2) 14223 v.AddArg(v0) 14224 return true 14225 } 14226 } 14227 func rewriteValueARM_OpLeq16U(v *Value, config *Config) bool { 14228 b := v.Block 14229 _ = b 14230 // match: (Leq16U x y) 14231 // cond: 14232 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14233 for { 14234 x := v.Args[0] 14235 y := v.Args[1] 14236 v.reset(OpARMLessEqualU) 14237 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14238 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14239 v1.AddArg(x) 14240 v0.AddArg(v1) 14241 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14242 v2.AddArg(y) 14243 v0.AddArg(v2) 14244 v.AddArg(v0) 14245 return true 14246 } 14247 } 14248 func rewriteValueARM_OpLeq32(v *Value, config *Config) bool { 14249 b := v.Block 14250 _ = b 14251 // match: (Leq32 x y) 14252 // cond: 14253 // result: (LessEqual (CMP x y)) 14254 for { 14255 x := v.Args[0] 14256 y := v.Args[1] 14257 v.reset(OpARMLessEqual) 14258 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14259 v0.AddArg(x) 14260 v0.AddArg(y) 14261 v.AddArg(v0) 14262 return true 14263 } 14264 } 14265 func rewriteValueARM_OpLeq32F(v *Value, config *Config) bool { 14266 b := v.Block 14267 _ = b 14268 // match: (Leq32F x y) 14269 // cond: 14270 // result: (GreaterEqual (CMPF y x)) 14271 for { 14272 x := v.Args[0] 14273 y := v.Args[1] 14274 v.reset(OpARMGreaterEqual) 14275 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 14276 v0.AddArg(y) 14277 v0.AddArg(x) 14278 v.AddArg(v0) 14279 return true 14280 } 14281 } 14282 func rewriteValueARM_OpLeq32U(v *Value, config *Config) bool { 14283 b := v.Block 14284 _ = b 14285 // match: (Leq32U x y) 14286 // cond: 14287 // result: (LessEqualU (CMP x y)) 14288 for { 14289 x := v.Args[0] 14290 y := v.Args[1] 14291 v.reset(OpARMLessEqualU) 14292 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14293 v0.AddArg(x) 14294 v0.AddArg(y) 14295 v.AddArg(v0) 14296 return true 14297 } 14298 } 14299 func rewriteValueARM_OpLeq64F(v *Value, config *Config) bool { 14300 b := v.Block 14301 _ = b 14302 // match: (Leq64F x y) 14303 // cond: 14304 // result: (GreaterEqual (CMPD y x)) 14305 for { 14306 x := v.Args[0] 14307 y := v.Args[1] 14308 v.reset(OpARMGreaterEqual) 14309 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14310 v0.AddArg(y) 14311 v0.AddArg(x) 14312 v.AddArg(v0) 14313 return true 14314 } 14315 } 14316 func rewriteValueARM_OpLeq8(v *Value, config *Config) bool { 14317 b := v.Block 14318 _ = b 14319 // match: (Leq8 x y) 14320 // cond: 14321 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 14322 for { 14323 x := v.Args[0] 14324 y := v.Args[1] 14325 v.reset(OpARMLessEqual) 14326 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14327 v1 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 14328 v1.AddArg(x) 14329 v0.AddArg(v1) 14330 v2 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 14331 v2.AddArg(y) 14332 v0.AddArg(v2) 14333 v.AddArg(v0) 14334 return true 14335 } 14336 } 14337 func rewriteValueARM_OpLeq8U(v *Value, config *Config) bool { 14338 b := v.Block 14339 _ = b 14340 // match: (Leq8U x y) 14341 // cond: 14342 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14343 for { 14344 x := v.Args[0] 14345 y := v.Args[1] 14346 v.reset(OpARMLessEqualU) 14347 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14348 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14349 v1.AddArg(x) 14350 v0.AddArg(v1) 14351 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14352 v2.AddArg(y) 14353 v0.AddArg(v2) 14354 v.AddArg(v0) 14355 return true 14356 } 14357 } 14358 func rewriteValueARM_OpLess16(v *Value, config *Config) bool { 14359 b := v.Block 14360 _ = b 14361 // match: (Less16 x y) 14362 // cond: 14363 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 14364 for { 14365 x := v.Args[0] 14366 y := v.Args[1] 14367 v.reset(OpARMLessThan) 14368 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14369 v1 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 14370 v1.AddArg(x) 14371 v0.AddArg(v1) 14372 v2 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 14373 v2.AddArg(y) 14374 v0.AddArg(v2) 14375 v.AddArg(v0) 14376 return true 14377 } 14378 } 14379 func rewriteValueARM_OpLess16U(v *Value, config *Config) bool { 14380 b := v.Block 14381 _ = b 14382 // match: (Less16U x y) 14383 // cond: 14384 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14385 for { 14386 x := v.Args[0] 14387 y := v.Args[1] 14388 v.reset(OpARMLessThanU) 14389 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14390 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14391 v1.AddArg(x) 14392 v0.AddArg(v1) 14393 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14394 v2.AddArg(y) 14395 v0.AddArg(v2) 14396 v.AddArg(v0) 14397 return true 14398 } 14399 } 14400 func rewriteValueARM_OpLess32(v *Value, config *Config) bool { 14401 b := v.Block 14402 _ = b 14403 // match: (Less32 x y) 14404 // cond: 14405 // result: (LessThan (CMP x y)) 14406 for { 14407 x := v.Args[0] 14408 y := v.Args[1] 14409 v.reset(OpARMLessThan) 14410 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14411 v0.AddArg(x) 14412 v0.AddArg(y) 14413 v.AddArg(v0) 14414 return true 14415 } 14416 } 14417 func rewriteValueARM_OpLess32F(v *Value, config *Config) bool { 14418 b := v.Block 14419 _ = b 14420 // match: (Less32F x y) 14421 // cond: 14422 // result: (GreaterThan (CMPF y x)) 14423 for { 14424 x := v.Args[0] 14425 y := v.Args[1] 14426 v.reset(OpARMGreaterThan) 14427 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 14428 v0.AddArg(y) 14429 v0.AddArg(x) 14430 v.AddArg(v0) 14431 return true 14432 } 14433 } 14434 func rewriteValueARM_OpLess32U(v *Value, config *Config) bool { 14435 b := v.Block 14436 _ = b 14437 // match: (Less32U x y) 14438 // cond: 14439 // result: (LessThanU (CMP x y)) 14440 for { 14441 x := v.Args[0] 14442 y := v.Args[1] 14443 v.reset(OpARMLessThanU) 14444 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14445 v0.AddArg(x) 14446 v0.AddArg(y) 14447 v.AddArg(v0) 14448 return true 14449 } 14450 } 14451 func rewriteValueARM_OpLess64F(v *Value, config *Config) bool { 14452 b := v.Block 14453 _ = b 14454 // match: (Less64F x y) 14455 // cond: 14456 // result: (GreaterThan (CMPD y x)) 14457 for { 14458 x := v.Args[0] 14459 y := v.Args[1] 14460 v.reset(OpARMGreaterThan) 14461 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14462 v0.AddArg(y) 14463 v0.AddArg(x) 14464 v.AddArg(v0) 14465 return true 14466 } 14467 } 14468 func rewriteValueARM_OpLess8(v *Value, config *Config) bool { 14469 b := v.Block 14470 _ = b 14471 // match: (Less8 x y) 14472 // cond: 14473 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 14474 for { 14475 x := v.Args[0] 14476 y := v.Args[1] 14477 v.reset(OpARMLessThan) 14478 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14479 v1 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 14480 v1.AddArg(x) 14481 v0.AddArg(v1) 14482 v2 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 14483 v2.AddArg(y) 14484 v0.AddArg(v2) 14485 v.AddArg(v0) 14486 return true 14487 } 14488 } 14489 func rewriteValueARM_OpLess8U(v *Value, config *Config) bool { 14490 b := v.Block 14491 _ = b 14492 // match: (Less8U x y) 14493 // cond: 14494 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14495 for { 14496 x := v.Args[0] 14497 y := v.Args[1] 14498 v.reset(OpARMLessThanU) 14499 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14500 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14501 v1.AddArg(x) 14502 v0.AddArg(v1) 14503 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14504 v2.AddArg(y) 14505 v0.AddArg(v2) 14506 v.AddArg(v0) 14507 return true 14508 } 14509 } 14510 func rewriteValueARM_OpLoad(v *Value, config *Config) bool { 14511 b := v.Block 14512 _ = b 14513 // match: (Load <t> ptr mem) 14514 // cond: t.IsBoolean() 14515 // result: (MOVBUload ptr mem) 14516 for { 14517 t := v.Type 14518 ptr := v.Args[0] 14519 mem := v.Args[1] 14520 if !(t.IsBoolean()) { 14521 break 14522 } 14523 v.reset(OpARMMOVBUload) 14524 v.AddArg(ptr) 14525 v.AddArg(mem) 14526 return true 14527 } 14528 // match: (Load <t> ptr mem) 14529 // cond: (is8BitInt(t) && isSigned(t)) 14530 // result: (MOVBload ptr mem) 14531 for { 14532 t := v.Type 14533 ptr := v.Args[0] 14534 mem := v.Args[1] 14535 if !(is8BitInt(t) && isSigned(t)) { 14536 break 14537 } 14538 v.reset(OpARMMOVBload) 14539 v.AddArg(ptr) 14540 v.AddArg(mem) 14541 return true 14542 } 14543 // match: (Load <t> ptr mem) 14544 // cond: (is8BitInt(t) && !isSigned(t)) 14545 // result: (MOVBUload ptr mem) 14546 for { 14547 t := v.Type 14548 ptr := v.Args[0] 14549 mem := v.Args[1] 14550 if !(is8BitInt(t) && !isSigned(t)) { 14551 break 14552 } 14553 v.reset(OpARMMOVBUload) 14554 v.AddArg(ptr) 14555 v.AddArg(mem) 14556 return true 14557 } 14558 // match: (Load <t> ptr mem) 14559 // cond: (is16BitInt(t) && isSigned(t)) 14560 // result: (MOVHload ptr mem) 14561 for { 14562 t := v.Type 14563 ptr := v.Args[0] 14564 mem := v.Args[1] 14565 if !(is16BitInt(t) && isSigned(t)) { 14566 break 14567 } 14568 v.reset(OpARMMOVHload) 14569 v.AddArg(ptr) 14570 v.AddArg(mem) 14571 return true 14572 } 14573 // match: (Load <t> ptr mem) 14574 // cond: (is16BitInt(t) && !isSigned(t)) 14575 // result: (MOVHUload ptr mem) 14576 for { 14577 t := v.Type 14578 ptr := v.Args[0] 14579 mem := v.Args[1] 14580 if !(is16BitInt(t) && !isSigned(t)) { 14581 break 14582 } 14583 v.reset(OpARMMOVHUload) 14584 v.AddArg(ptr) 14585 v.AddArg(mem) 14586 return true 14587 } 14588 // match: (Load <t> ptr mem) 14589 // cond: (is32BitInt(t) || isPtr(t)) 14590 // result: (MOVWload ptr mem) 14591 for { 14592 t := v.Type 14593 ptr := v.Args[0] 14594 mem := v.Args[1] 14595 if !(is32BitInt(t) || isPtr(t)) { 14596 break 14597 } 14598 v.reset(OpARMMOVWload) 14599 v.AddArg(ptr) 14600 v.AddArg(mem) 14601 return true 14602 } 14603 // match: (Load <t> ptr mem) 14604 // cond: is32BitFloat(t) 14605 // result: (MOVFload ptr mem) 14606 for { 14607 t := v.Type 14608 ptr := v.Args[0] 14609 mem := v.Args[1] 14610 if !(is32BitFloat(t)) { 14611 break 14612 } 14613 v.reset(OpARMMOVFload) 14614 v.AddArg(ptr) 14615 v.AddArg(mem) 14616 return true 14617 } 14618 // match: (Load <t> ptr mem) 14619 // cond: is64BitFloat(t) 14620 // result: (MOVDload ptr mem) 14621 for { 14622 t := v.Type 14623 ptr := v.Args[0] 14624 mem := v.Args[1] 14625 if !(is64BitFloat(t)) { 14626 break 14627 } 14628 v.reset(OpARMMOVDload) 14629 v.AddArg(ptr) 14630 v.AddArg(mem) 14631 return true 14632 } 14633 return false 14634 } 14635 func rewriteValueARM_OpLsh16x16(v *Value, config *Config) bool { 14636 b := v.Block 14637 _ = b 14638 // match: (Lsh16x16 x y) 14639 // cond: 14640 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14641 for { 14642 x := v.Args[0] 14643 y := v.Args[1] 14644 v.reset(OpARMCMOVWHSconst) 14645 v.AuxInt = 0 14646 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14647 v0.AddArg(x) 14648 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14649 v1.AddArg(y) 14650 v0.AddArg(v1) 14651 v.AddArg(v0) 14652 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14653 v2.AuxInt = 256 14654 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14655 v3.AddArg(y) 14656 v2.AddArg(v3) 14657 v.AddArg(v2) 14658 return true 14659 } 14660 } 14661 func rewriteValueARM_OpLsh16x32(v *Value, config *Config) bool { 14662 b := v.Block 14663 _ = b 14664 // match: (Lsh16x32 x y) 14665 // cond: 14666 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14667 for { 14668 x := v.Args[0] 14669 y := v.Args[1] 14670 v.reset(OpARMCMOVWHSconst) 14671 v.AuxInt = 0 14672 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14673 v0.AddArg(x) 14674 v0.AddArg(y) 14675 v.AddArg(v0) 14676 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14677 v1.AuxInt = 256 14678 v1.AddArg(y) 14679 v.AddArg(v1) 14680 return true 14681 } 14682 } 14683 func rewriteValueARM_OpLsh16x64(v *Value, config *Config) bool { 14684 b := v.Block 14685 _ = b 14686 // match: (Lsh16x64 x (Const64 [c])) 14687 // cond: uint64(c) < 16 14688 // result: (SLLconst x [c]) 14689 for { 14690 x := v.Args[0] 14691 v_1 := v.Args[1] 14692 if v_1.Op != OpConst64 { 14693 break 14694 } 14695 c := v_1.AuxInt 14696 if !(uint64(c) < 16) { 14697 break 14698 } 14699 v.reset(OpARMSLLconst) 14700 v.AuxInt = c 14701 v.AddArg(x) 14702 return true 14703 } 14704 // match: (Lsh16x64 _ (Const64 [c])) 14705 // cond: uint64(c) >= 16 14706 // result: (Const16 [0]) 14707 for { 14708 v_1 := v.Args[1] 14709 if v_1.Op != OpConst64 { 14710 break 14711 } 14712 c := v_1.AuxInt 14713 if !(uint64(c) >= 16) { 14714 break 14715 } 14716 v.reset(OpConst16) 14717 v.AuxInt = 0 14718 return true 14719 } 14720 return false 14721 } 14722 func rewriteValueARM_OpLsh16x8(v *Value, config *Config) bool { 14723 b := v.Block 14724 _ = b 14725 // match: (Lsh16x8 x y) 14726 // cond: 14727 // result: (SLL x (ZeroExt8to32 y)) 14728 for { 14729 x := v.Args[0] 14730 y := v.Args[1] 14731 v.reset(OpARMSLL) 14732 v.AddArg(x) 14733 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14734 v0.AddArg(y) 14735 v.AddArg(v0) 14736 return true 14737 } 14738 } 14739 func rewriteValueARM_OpLsh32x16(v *Value, config *Config) bool { 14740 b := v.Block 14741 _ = b 14742 // match: (Lsh32x16 x y) 14743 // cond: 14744 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14745 for { 14746 x := v.Args[0] 14747 y := v.Args[1] 14748 v.reset(OpARMCMOVWHSconst) 14749 v.AuxInt = 0 14750 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14751 v0.AddArg(x) 14752 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14753 v1.AddArg(y) 14754 v0.AddArg(v1) 14755 v.AddArg(v0) 14756 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14757 v2.AuxInt = 256 14758 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14759 v3.AddArg(y) 14760 v2.AddArg(v3) 14761 v.AddArg(v2) 14762 return true 14763 } 14764 } 14765 func rewriteValueARM_OpLsh32x32(v *Value, config *Config) bool { 14766 b := v.Block 14767 _ = b 14768 // match: (Lsh32x32 x y) 14769 // cond: 14770 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14771 for { 14772 x := v.Args[0] 14773 y := v.Args[1] 14774 v.reset(OpARMCMOVWHSconst) 14775 v.AuxInt = 0 14776 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14777 v0.AddArg(x) 14778 v0.AddArg(y) 14779 v.AddArg(v0) 14780 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14781 v1.AuxInt = 256 14782 v1.AddArg(y) 14783 v.AddArg(v1) 14784 return true 14785 } 14786 } 14787 func rewriteValueARM_OpLsh32x64(v *Value, config *Config) bool { 14788 b := v.Block 14789 _ = b 14790 // match: (Lsh32x64 x (Const64 [c])) 14791 // cond: uint64(c) < 32 14792 // result: (SLLconst x [c]) 14793 for { 14794 x := v.Args[0] 14795 v_1 := v.Args[1] 14796 if v_1.Op != OpConst64 { 14797 break 14798 } 14799 c := v_1.AuxInt 14800 if !(uint64(c) < 32) { 14801 break 14802 } 14803 v.reset(OpARMSLLconst) 14804 v.AuxInt = c 14805 v.AddArg(x) 14806 return true 14807 } 14808 // match: (Lsh32x64 _ (Const64 [c])) 14809 // cond: uint64(c) >= 32 14810 // result: (Const32 [0]) 14811 for { 14812 v_1 := v.Args[1] 14813 if v_1.Op != OpConst64 { 14814 break 14815 } 14816 c := v_1.AuxInt 14817 if !(uint64(c) >= 32) { 14818 break 14819 } 14820 v.reset(OpConst32) 14821 v.AuxInt = 0 14822 return true 14823 } 14824 return false 14825 } 14826 func rewriteValueARM_OpLsh32x8(v *Value, config *Config) bool { 14827 b := v.Block 14828 _ = b 14829 // match: (Lsh32x8 x y) 14830 // cond: 14831 // result: (SLL x (ZeroExt8to32 y)) 14832 for { 14833 x := v.Args[0] 14834 y := v.Args[1] 14835 v.reset(OpARMSLL) 14836 v.AddArg(x) 14837 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14838 v0.AddArg(y) 14839 v.AddArg(v0) 14840 return true 14841 } 14842 } 14843 func rewriteValueARM_OpLsh8x16(v *Value, config *Config) bool { 14844 b := v.Block 14845 _ = b 14846 // match: (Lsh8x16 x y) 14847 // cond: 14848 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14849 for { 14850 x := v.Args[0] 14851 y := v.Args[1] 14852 v.reset(OpARMCMOVWHSconst) 14853 v.AuxInt = 0 14854 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14855 v0.AddArg(x) 14856 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14857 v1.AddArg(y) 14858 v0.AddArg(v1) 14859 v.AddArg(v0) 14860 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14861 v2.AuxInt = 256 14862 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14863 v3.AddArg(y) 14864 v2.AddArg(v3) 14865 v.AddArg(v2) 14866 return true 14867 } 14868 } 14869 func rewriteValueARM_OpLsh8x32(v *Value, config *Config) bool { 14870 b := v.Block 14871 _ = b 14872 // match: (Lsh8x32 x y) 14873 // cond: 14874 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14875 for { 14876 x := v.Args[0] 14877 y := v.Args[1] 14878 v.reset(OpARMCMOVWHSconst) 14879 v.AuxInt = 0 14880 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14881 v0.AddArg(x) 14882 v0.AddArg(y) 14883 v.AddArg(v0) 14884 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14885 v1.AuxInt = 256 14886 v1.AddArg(y) 14887 v.AddArg(v1) 14888 return true 14889 } 14890 } 14891 func rewriteValueARM_OpLsh8x64(v *Value, config *Config) bool { 14892 b := v.Block 14893 _ = b 14894 // match: (Lsh8x64 x (Const64 [c])) 14895 // cond: uint64(c) < 8 14896 // result: (SLLconst x [c]) 14897 for { 14898 x := v.Args[0] 14899 v_1 := v.Args[1] 14900 if v_1.Op != OpConst64 { 14901 break 14902 } 14903 c := v_1.AuxInt 14904 if !(uint64(c) < 8) { 14905 break 14906 } 14907 v.reset(OpARMSLLconst) 14908 v.AuxInt = c 14909 v.AddArg(x) 14910 return true 14911 } 14912 // match: (Lsh8x64 _ (Const64 [c])) 14913 // cond: uint64(c) >= 8 14914 // result: (Const8 [0]) 14915 for { 14916 v_1 := v.Args[1] 14917 if v_1.Op != OpConst64 { 14918 break 14919 } 14920 c := v_1.AuxInt 14921 if !(uint64(c) >= 8) { 14922 break 14923 } 14924 v.reset(OpConst8) 14925 v.AuxInt = 0 14926 return true 14927 } 14928 return false 14929 } 14930 func rewriteValueARM_OpLsh8x8(v *Value, config *Config) bool { 14931 b := v.Block 14932 _ = b 14933 // match: (Lsh8x8 x y) 14934 // cond: 14935 // result: (SLL x (ZeroExt8to32 y)) 14936 for { 14937 x := v.Args[0] 14938 y := v.Args[1] 14939 v.reset(OpARMSLL) 14940 v.AddArg(x) 14941 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 14942 v0.AddArg(y) 14943 v.AddArg(v0) 14944 return true 14945 } 14946 } 14947 func rewriteValueARM_OpMod16(v *Value, config *Config) bool { 14948 b := v.Block 14949 _ = b 14950 // match: (Mod16 x y) 14951 // cond: 14952 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 14953 for { 14954 x := v.Args[0] 14955 y := v.Args[1] 14956 v.reset(OpMod32) 14957 v0 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 14958 v0.AddArg(x) 14959 v.AddArg(v0) 14960 v1 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 14961 v1.AddArg(y) 14962 v.AddArg(v1) 14963 return true 14964 } 14965 } 14966 func rewriteValueARM_OpMod16u(v *Value, config *Config) bool { 14967 b := v.Block 14968 _ = b 14969 // match: (Mod16u x y) 14970 // cond: 14971 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 14972 for { 14973 x := v.Args[0] 14974 y := v.Args[1] 14975 v.reset(OpMod32u) 14976 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14977 v0.AddArg(x) 14978 v.AddArg(v0) 14979 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 14980 v1.AddArg(y) 14981 v.AddArg(v1) 14982 return true 14983 } 14984 } 14985 func rewriteValueARM_OpMod32(v *Value, config *Config) bool { 14986 b := v.Block 14987 _ = b 14988 // match: (Mod32 x y) 14989 // cond: 14990 // result: (SUB (XOR <config.fe.TypeUInt32()> (Select1 <config.fe.TypeUInt32()> (UDIVrtcall (SUB <config.fe.TypeUInt32()> (XOR <config.fe.TypeUInt32()> x (Signmask x)) (Signmask x)) (SUB <config.fe.TypeUInt32()> (XOR <config.fe.TypeUInt32()> y (Signmask y)) (Signmask y)))) (Signmask x)) (Signmask x)) 14991 for { 14992 x := v.Args[0] 14993 y := v.Args[1] 14994 v.reset(OpARMSUB) 14995 v0 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeUInt32()) 14996 v1 := b.NewValue0(v.Pos, OpSelect1, config.fe.TypeUInt32()) 14997 v2 := b.NewValue0(v.Pos, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 14998 v3 := b.NewValue0(v.Pos, OpARMSUB, config.fe.TypeUInt32()) 14999 v4 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeUInt32()) 15000 v4.AddArg(x) 15001 v5 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 15002 v5.AddArg(x) 15003 v4.AddArg(v5) 15004 v3.AddArg(v4) 15005 v6 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 15006 v6.AddArg(x) 15007 v3.AddArg(v6) 15008 v2.AddArg(v3) 15009 v7 := b.NewValue0(v.Pos, OpARMSUB, config.fe.TypeUInt32()) 15010 v8 := b.NewValue0(v.Pos, OpARMXOR, config.fe.TypeUInt32()) 15011 v8.AddArg(y) 15012 v9 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 15013 v9.AddArg(y) 15014 v8.AddArg(v9) 15015 v7.AddArg(v8) 15016 v10 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 15017 v10.AddArg(y) 15018 v7.AddArg(v10) 15019 v2.AddArg(v7) 15020 v1.AddArg(v2) 15021 v0.AddArg(v1) 15022 v11 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 15023 v11.AddArg(x) 15024 v0.AddArg(v11) 15025 v.AddArg(v0) 15026 v12 := b.NewValue0(v.Pos, OpSignmask, config.fe.TypeInt32()) 15027 v12.AddArg(x) 15028 v.AddArg(v12) 15029 return true 15030 } 15031 } 15032 func rewriteValueARM_OpMod32u(v *Value, config *Config) bool { 15033 b := v.Block 15034 _ = b 15035 // match: (Mod32u x y) 15036 // cond: 15037 // result: (Select1 <config.fe.TypeUInt32()> (UDIVrtcall x y)) 15038 for { 15039 x := v.Args[0] 15040 y := v.Args[1] 15041 v.reset(OpSelect1) 15042 v.Type = config.fe.TypeUInt32() 15043 v0 := b.NewValue0(v.Pos, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 15044 v0.AddArg(x) 15045 v0.AddArg(y) 15046 v.AddArg(v0) 15047 return true 15048 } 15049 } 15050 func rewriteValueARM_OpMod8(v *Value, config *Config) bool { 15051 b := v.Block 15052 _ = b 15053 // match: (Mod8 x y) 15054 // cond: 15055 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 15056 for { 15057 x := v.Args[0] 15058 y := v.Args[1] 15059 v.reset(OpMod32) 15060 v0 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 15061 v0.AddArg(x) 15062 v.AddArg(v0) 15063 v1 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 15064 v1.AddArg(y) 15065 v.AddArg(v1) 15066 return true 15067 } 15068 } 15069 func rewriteValueARM_OpMod8u(v *Value, config *Config) bool { 15070 b := v.Block 15071 _ = b 15072 // match: (Mod8u x y) 15073 // cond: 15074 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 15075 for { 15076 x := v.Args[0] 15077 y := v.Args[1] 15078 v.reset(OpMod32u) 15079 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 15080 v0.AddArg(x) 15081 v.AddArg(v0) 15082 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 15083 v1.AddArg(y) 15084 v.AddArg(v1) 15085 return true 15086 } 15087 } 15088 func rewriteValueARM_OpMove(v *Value, config *Config) bool { 15089 b := v.Block 15090 _ = b 15091 // match: (Move [s] _ _ mem) 15092 // cond: SizeAndAlign(s).Size() == 0 15093 // result: mem 15094 for { 15095 s := v.AuxInt 15096 mem := v.Args[2] 15097 if !(SizeAndAlign(s).Size() == 0) { 15098 break 15099 } 15100 v.reset(OpCopy) 15101 v.Type = mem.Type 15102 v.AddArg(mem) 15103 return true 15104 } 15105 // match: (Move [s] dst src mem) 15106 // cond: SizeAndAlign(s).Size() == 1 15107 // result: (MOVBstore dst (MOVBUload src mem) mem) 15108 for { 15109 s := v.AuxInt 15110 dst := v.Args[0] 15111 src := v.Args[1] 15112 mem := v.Args[2] 15113 if !(SizeAndAlign(s).Size() == 1) { 15114 break 15115 } 15116 v.reset(OpARMMOVBstore) 15117 v.AddArg(dst) 15118 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15119 v0.AddArg(src) 15120 v0.AddArg(mem) 15121 v.AddArg(v0) 15122 v.AddArg(mem) 15123 return true 15124 } 15125 // match: (Move [s] dst src mem) 15126 // cond: SizeAndAlign(s).Size() == 2 && SizeAndAlign(s).Align()%2 == 0 15127 // result: (MOVHstore dst (MOVHUload src mem) mem) 15128 for { 15129 s := v.AuxInt 15130 dst := v.Args[0] 15131 src := v.Args[1] 15132 mem := v.Args[2] 15133 if !(SizeAndAlign(s).Size() == 2 && SizeAndAlign(s).Align()%2 == 0) { 15134 break 15135 } 15136 v.reset(OpARMMOVHstore) 15137 v.AddArg(dst) 15138 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, config.fe.TypeUInt16()) 15139 v0.AddArg(src) 15140 v0.AddArg(mem) 15141 v.AddArg(v0) 15142 v.AddArg(mem) 15143 return true 15144 } 15145 // match: (Move [s] dst src mem) 15146 // cond: SizeAndAlign(s).Size() == 2 15147 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 15148 for { 15149 s := v.AuxInt 15150 dst := v.Args[0] 15151 src := v.Args[1] 15152 mem := v.Args[2] 15153 if !(SizeAndAlign(s).Size() == 2) { 15154 break 15155 } 15156 v.reset(OpARMMOVBstore) 15157 v.AuxInt = 1 15158 v.AddArg(dst) 15159 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15160 v0.AuxInt = 1 15161 v0.AddArg(src) 15162 v0.AddArg(mem) 15163 v.AddArg(v0) 15164 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15165 v1.AddArg(dst) 15166 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15167 v2.AddArg(src) 15168 v2.AddArg(mem) 15169 v1.AddArg(v2) 15170 v1.AddArg(mem) 15171 v.AddArg(v1) 15172 return true 15173 } 15174 // match: (Move [s] dst src mem) 15175 // cond: SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%4 == 0 15176 // result: (MOVWstore dst (MOVWload src mem) mem) 15177 for { 15178 s := v.AuxInt 15179 dst := v.Args[0] 15180 src := v.Args[1] 15181 mem := v.Args[2] 15182 if !(SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%4 == 0) { 15183 break 15184 } 15185 v.reset(OpARMMOVWstore) 15186 v.AddArg(dst) 15187 v0 := b.NewValue0(v.Pos, OpARMMOVWload, config.fe.TypeUInt32()) 15188 v0.AddArg(src) 15189 v0.AddArg(mem) 15190 v.AddArg(v0) 15191 v.AddArg(mem) 15192 return true 15193 } 15194 // match: (Move [s] dst src mem) 15195 // cond: SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%2 == 0 15196 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 15197 for { 15198 s := v.AuxInt 15199 dst := v.Args[0] 15200 src := v.Args[1] 15201 mem := v.Args[2] 15202 if !(SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%2 == 0) { 15203 break 15204 } 15205 v.reset(OpARMMOVHstore) 15206 v.AuxInt = 2 15207 v.AddArg(dst) 15208 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, config.fe.TypeUInt16()) 15209 v0.AuxInt = 2 15210 v0.AddArg(src) 15211 v0.AddArg(mem) 15212 v.AddArg(v0) 15213 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, TypeMem) 15214 v1.AddArg(dst) 15215 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, config.fe.TypeUInt16()) 15216 v2.AddArg(src) 15217 v2.AddArg(mem) 15218 v1.AddArg(v2) 15219 v1.AddArg(mem) 15220 v.AddArg(v1) 15221 return true 15222 } 15223 // match: (Move [s] dst src mem) 15224 // cond: SizeAndAlign(s).Size() == 4 15225 // 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)))) 15226 for { 15227 s := v.AuxInt 15228 dst := v.Args[0] 15229 src := v.Args[1] 15230 mem := v.Args[2] 15231 if !(SizeAndAlign(s).Size() == 4) { 15232 break 15233 } 15234 v.reset(OpARMMOVBstore) 15235 v.AuxInt = 3 15236 v.AddArg(dst) 15237 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15238 v0.AuxInt = 3 15239 v0.AddArg(src) 15240 v0.AddArg(mem) 15241 v.AddArg(v0) 15242 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15243 v1.AuxInt = 2 15244 v1.AddArg(dst) 15245 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15246 v2.AuxInt = 2 15247 v2.AddArg(src) 15248 v2.AddArg(mem) 15249 v1.AddArg(v2) 15250 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15251 v3.AuxInt = 1 15252 v3.AddArg(dst) 15253 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15254 v4.AuxInt = 1 15255 v4.AddArg(src) 15256 v4.AddArg(mem) 15257 v3.AddArg(v4) 15258 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15259 v5.AddArg(dst) 15260 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15261 v6.AddArg(src) 15262 v6.AddArg(mem) 15263 v5.AddArg(v6) 15264 v5.AddArg(mem) 15265 v3.AddArg(v5) 15266 v1.AddArg(v3) 15267 v.AddArg(v1) 15268 return true 15269 } 15270 // match: (Move [s] dst src mem) 15271 // cond: SizeAndAlign(s).Size() == 3 15272 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 15273 for { 15274 s := v.AuxInt 15275 dst := v.Args[0] 15276 src := v.Args[1] 15277 mem := v.Args[2] 15278 if !(SizeAndAlign(s).Size() == 3) { 15279 break 15280 } 15281 v.reset(OpARMMOVBstore) 15282 v.AuxInt = 2 15283 v.AddArg(dst) 15284 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15285 v0.AuxInt = 2 15286 v0.AddArg(src) 15287 v0.AddArg(mem) 15288 v.AddArg(v0) 15289 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15290 v1.AuxInt = 1 15291 v1.AddArg(dst) 15292 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15293 v2.AuxInt = 1 15294 v2.AddArg(src) 15295 v2.AddArg(mem) 15296 v1.AddArg(v2) 15297 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15298 v3.AddArg(dst) 15299 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, config.fe.TypeUInt8()) 15300 v4.AddArg(src) 15301 v4.AddArg(mem) 15302 v3.AddArg(v4) 15303 v3.AddArg(mem) 15304 v1.AddArg(v3) 15305 v.AddArg(v1) 15306 return true 15307 } 15308 // match: (Move [s] dst src mem) 15309 // cond: SizeAndAlign(s).Size()%4 == 0 && SizeAndAlign(s).Size() > 4 && SizeAndAlign(s).Size() <= 512 && SizeAndAlign(s).Align()%4 == 0 && !config.noDuffDevice 15310 // result: (DUFFCOPY [8 * (128 - int64(SizeAndAlign(s).Size()/4))] dst src mem) 15311 for { 15312 s := v.AuxInt 15313 dst := v.Args[0] 15314 src := v.Args[1] 15315 mem := v.Args[2] 15316 if !(SizeAndAlign(s).Size()%4 == 0 && SizeAndAlign(s).Size() > 4 && SizeAndAlign(s).Size() <= 512 && SizeAndAlign(s).Align()%4 == 0 && !config.noDuffDevice) { 15317 break 15318 } 15319 v.reset(OpARMDUFFCOPY) 15320 v.AuxInt = 8 * (128 - int64(SizeAndAlign(s).Size()/4)) 15321 v.AddArg(dst) 15322 v.AddArg(src) 15323 v.AddArg(mem) 15324 return true 15325 } 15326 // match: (Move [s] dst src mem) 15327 // cond: (SizeAndAlign(s).Size() > 512 || config.noDuffDevice) || SizeAndAlign(s).Align()%4 != 0 15328 // result: (LoweredMove [SizeAndAlign(s).Align()] dst src (ADDconst <src.Type> src [SizeAndAlign(s).Size()-moveSize(SizeAndAlign(s).Align(), config)]) mem) 15329 for { 15330 s := v.AuxInt 15331 dst := v.Args[0] 15332 src := v.Args[1] 15333 mem := v.Args[2] 15334 if !((SizeAndAlign(s).Size() > 512 || config.noDuffDevice) || SizeAndAlign(s).Align()%4 != 0) { 15335 break 15336 } 15337 v.reset(OpARMLoweredMove) 15338 v.AuxInt = SizeAndAlign(s).Align() 15339 v.AddArg(dst) 15340 v.AddArg(src) 15341 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 15342 v0.AuxInt = SizeAndAlign(s).Size() - moveSize(SizeAndAlign(s).Align(), config) 15343 v0.AddArg(src) 15344 v.AddArg(v0) 15345 v.AddArg(mem) 15346 return true 15347 } 15348 return false 15349 } 15350 func rewriteValueARM_OpMul16(v *Value, config *Config) bool { 15351 b := v.Block 15352 _ = b 15353 // match: (Mul16 x y) 15354 // cond: 15355 // result: (MUL x y) 15356 for { 15357 x := v.Args[0] 15358 y := v.Args[1] 15359 v.reset(OpARMMUL) 15360 v.AddArg(x) 15361 v.AddArg(y) 15362 return true 15363 } 15364 } 15365 func rewriteValueARM_OpMul32(v *Value, config *Config) bool { 15366 b := v.Block 15367 _ = b 15368 // match: (Mul32 x y) 15369 // cond: 15370 // result: (MUL x y) 15371 for { 15372 x := v.Args[0] 15373 y := v.Args[1] 15374 v.reset(OpARMMUL) 15375 v.AddArg(x) 15376 v.AddArg(y) 15377 return true 15378 } 15379 } 15380 func rewriteValueARM_OpMul32F(v *Value, config *Config) bool { 15381 b := v.Block 15382 _ = b 15383 // match: (Mul32F x y) 15384 // cond: 15385 // result: (MULF x y) 15386 for { 15387 x := v.Args[0] 15388 y := v.Args[1] 15389 v.reset(OpARMMULF) 15390 v.AddArg(x) 15391 v.AddArg(y) 15392 return true 15393 } 15394 } 15395 func rewriteValueARM_OpMul32uhilo(v *Value, config *Config) bool { 15396 b := v.Block 15397 _ = b 15398 // match: (Mul32uhilo x y) 15399 // cond: 15400 // result: (MULLU x y) 15401 for { 15402 x := v.Args[0] 15403 y := v.Args[1] 15404 v.reset(OpARMMULLU) 15405 v.AddArg(x) 15406 v.AddArg(y) 15407 return true 15408 } 15409 } 15410 func rewriteValueARM_OpMul64F(v *Value, config *Config) bool { 15411 b := v.Block 15412 _ = b 15413 // match: (Mul64F x y) 15414 // cond: 15415 // result: (MULD x y) 15416 for { 15417 x := v.Args[0] 15418 y := v.Args[1] 15419 v.reset(OpARMMULD) 15420 v.AddArg(x) 15421 v.AddArg(y) 15422 return true 15423 } 15424 } 15425 func rewriteValueARM_OpMul8(v *Value, config *Config) bool { 15426 b := v.Block 15427 _ = b 15428 // match: (Mul8 x y) 15429 // cond: 15430 // result: (MUL x y) 15431 for { 15432 x := v.Args[0] 15433 y := v.Args[1] 15434 v.reset(OpARMMUL) 15435 v.AddArg(x) 15436 v.AddArg(y) 15437 return true 15438 } 15439 } 15440 func rewriteValueARM_OpNeg16(v *Value, config *Config) bool { 15441 b := v.Block 15442 _ = b 15443 // match: (Neg16 x) 15444 // cond: 15445 // result: (RSBconst [0] x) 15446 for { 15447 x := v.Args[0] 15448 v.reset(OpARMRSBconst) 15449 v.AuxInt = 0 15450 v.AddArg(x) 15451 return true 15452 } 15453 } 15454 func rewriteValueARM_OpNeg32(v *Value, config *Config) bool { 15455 b := v.Block 15456 _ = b 15457 // match: (Neg32 x) 15458 // cond: 15459 // result: (RSBconst [0] x) 15460 for { 15461 x := v.Args[0] 15462 v.reset(OpARMRSBconst) 15463 v.AuxInt = 0 15464 v.AddArg(x) 15465 return true 15466 } 15467 } 15468 func rewriteValueARM_OpNeg32F(v *Value, config *Config) bool { 15469 b := v.Block 15470 _ = b 15471 // match: (Neg32F x) 15472 // cond: 15473 // result: (NEGF x) 15474 for { 15475 x := v.Args[0] 15476 v.reset(OpARMNEGF) 15477 v.AddArg(x) 15478 return true 15479 } 15480 } 15481 func rewriteValueARM_OpNeg64F(v *Value, config *Config) bool { 15482 b := v.Block 15483 _ = b 15484 // match: (Neg64F x) 15485 // cond: 15486 // result: (NEGD x) 15487 for { 15488 x := v.Args[0] 15489 v.reset(OpARMNEGD) 15490 v.AddArg(x) 15491 return true 15492 } 15493 } 15494 func rewriteValueARM_OpNeg8(v *Value, config *Config) bool { 15495 b := v.Block 15496 _ = b 15497 // match: (Neg8 x) 15498 // cond: 15499 // result: (RSBconst [0] x) 15500 for { 15501 x := v.Args[0] 15502 v.reset(OpARMRSBconst) 15503 v.AuxInt = 0 15504 v.AddArg(x) 15505 return true 15506 } 15507 } 15508 func rewriteValueARM_OpNeq16(v *Value, config *Config) bool { 15509 b := v.Block 15510 _ = b 15511 // match: (Neq16 x y) 15512 // cond: 15513 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 15514 for { 15515 x := v.Args[0] 15516 y := v.Args[1] 15517 v.reset(OpARMNotEqual) 15518 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15519 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15520 v1.AddArg(x) 15521 v0.AddArg(v1) 15522 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15523 v2.AddArg(y) 15524 v0.AddArg(v2) 15525 v.AddArg(v0) 15526 return true 15527 } 15528 } 15529 func rewriteValueARM_OpNeq32(v *Value, config *Config) bool { 15530 b := v.Block 15531 _ = b 15532 // match: (Neq32 x y) 15533 // cond: 15534 // result: (NotEqual (CMP x y)) 15535 for { 15536 x := v.Args[0] 15537 y := v.Args[1] 15538 v.reset(OpARMNotEqual) 15539 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15540 v0.AddArg(x) 15541 v0.AddArg(y) 15542 v.AddArg(v0) 15543 return true 15544 } 15545 } 15546 func rewriteValueARM_OpNeq32F(v *Value, config *Config) bool { 15547 b := v.Block 15548 _ = b 15549 // match: (Neq32F x y) 15550 // cond: 15551 // result: (NotEqual (CMPF x y)) 15552 for { 15553 x := v.Args[0] 15554 y := v.Args[1] 15555 v.reset(OpARMNotEqual) 15556 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 15557 v0.AddArg(x) 15558 v0.AddArg(y) 15559 v.AddArg(v0) 15560 return true 15561 } 15562 } 15563 func rewriteValueARM_OpNeq64F(v *Value, config *Config) bool { 15564 b := v.Block 15565 _ = b 15566 // match: (Neq64F x y) 15567 // cond: 15568 // result: (NotEqual (CMPD x y)) 15569 for { 15570 x := v.Args[0] 15571 y := v.Args[1] 15572 v.reset(OpARMNotEqual) 15573 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 15574 v0.AddArg(x) 15575 v0.AddArg(y) 15576 v.AddArg(v0) 15577 return true 15578 } 15579 } 15580 func rewriteValueARM_OpNeq8(v *Value, config *Config) bool { 15581 b := v.Block 15582 _ = b 15583 // match: (Neq8 x y) 15584 // cond: 15585 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15586 for { 15587 x := v.Args[0] 15588 y := v.Args[1] 15589 v.reset(OpARMNotEqual) 15590 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15591 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 15592 v1.AddArg(x) 15593 v0.AddArg(v1) 15594 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 15595 v2.AddArg(y) 15596 v0.AddArg(v2) 15597 v.AddArg(v0) 15598 return true 15599 } 15600 } 15601 func rewriteValueARM_OpNeqB(v *Value, config *Config) bool { 15602 b := v.Block 15603 _ = b 15604 // match: (NeqB x y) 15605 // cond: 15606 // result: (XOR x y) 15607 for { 15608 x := v.Args[0] 15609 y := v.Args[1] 15610 v.reset(OpARMXOR) 15611 v.AddArg(x) 15612 v.AddArg(y) 15613 return true 15614 } 15615 } 15616 func rewriteValueARM_OpNeqPtr(v *Value, config *Config) bool { 15617 b := v.Block 15618 _ = b 15619 // match: (NeqPtr x y) 15620 // cond: 15621 // result: (NotEqual (CMP x y)) 15622 for { 15623 x := v.Args[0] 15624 y := v.Args[1] 15625 v.reset(OpARMNotEqual) 15626 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15627 v0.AddArg(x) 15628 v0.AddArg(y) 15629 v.AddArg(v0) 15630 return true 15631 } 15632 } 15633 func rewriteValueARM_OpNilCheck(v *Value, config *Config) bool { 15634 b := v.Block 15635 _ = b 15636 // match: (NilCheck ptr mem) 15637 // cond: 15638 // result: (LoweredNilCheck ptr mem) 15639 for { 15640 ptr := v.Args[0] 15641 mem := v.Args[1] 15642 v.reset(OpARMLoweredNilCheck) 15643 v.AddArg(ptr) 15644 v.AddArg(mem) 15645 return true 15646 } 15647 } 15648 func rewriteValueARM_OpNot(v *Value, config *Config) bool { 15649 b := v.Block 15650 _ = b 15651 // match: (Not x) 15652 // cond: 15653 // result: (XORconst [1] x) 15654 for { 15655 x := v.Args[0] 15656 v.reset(OpARMXORconst) 15657 v.AuxInt = 1 15658 v.AddArg(x) 15659 return true 15660 } 15661 } 15662 func rewriteValueARM_OpOffPtr(v *Value, config *Config) bool { 15663 b := v.Block 15664 _ = b 15665 // match: (OffPtr [off] ptr:(SP)) 15666 // cond: 15667 // result: (MOVWaddr [off] ptr) 15668 for { 15669 off := v.AuxInt 15670 ptr := v.Args[0] 15671 if ptr.Op != OpSP { 15672 break 15673 } 15674 v.reset(OpARMMOVWaddr) 15675 v.AuxInt = off 15676 v.AddArg(ptr) 15677 return true 15678 } 15679 // match: (OffPtr [off] ptr) 15680 // cond: 15681 // result: (ADDconst [off] ptr) 15682 for { 15683 off := v.AuxInt 15684 ptr := v.Args[0] 15685 v.reset(OpARMADDconst) 15686 v.AuxInt = off 15687 v.AddArg(ptr) 15688 return true 15689 } 15690 } 15691 func rewriteValueARM_OpOr16(v *Value, config *Config) bool { 15692 b := v.Block 15693 _ = b 15694 // match: (Or16 x y) 15695 // cond: 15696 // result: (OR x y) 15697 for { 15698 x := v.Args[0] 15699 y := v.Args[1] 15700 v.reset(OpARMOR) 15701 v.AddArg(x) 15702 v.AddArg(y) 15703 return true 15704 } 15705 } 15706 func rewriteValueARM_OpOr32(v *Value, config *Config) bool { 15707 b := v.Block 15708 _ = b 15709 // match: (Or32 x y) 15710 // cond: 15711 // result: (OR x y) 15712 for { 15713 x := v.Args[0] 15714 y := v.Args[1] 15715 v.reset(OpARMOR) 15716 v.AddArg(x) 15717 v.AddArg(y) 15718 return true 15719 } 15720 } 15721 func rewriteValueARM_OpOr8(v *Value, config *Config) bool { 15722 b := v.Block 15723 _ = b 15724 // match: (Or8 x y) 15725 // cond: 15726 // result: (OR x y) 15727 for { 15728 x := v.Args[0] 15729 y := v.Args[1] 15730 v.reset(OpARMOR) 15731 v.AddArg(x) 15732 v.AddArg(y) 15733 return true 15734 } 15735 } 15736 func rewriteValueARM_OpOrB(v *Value, config *Config) bool { 15737 b := v.Block 15738 _ = b 15739 // match: (OrB x y) 15740 // cond: 15741 // result: (OR x y) 15742 for { 15743 x := v.Args[0] 15744 y := v.Args[1] 15745 v.reset(OpARMOR) 15746 v.AddArg(x) 15747 v.AddArg(y) 15748 return true 15749 } 15750 } 15751 func rewriteValueARM_OpRsh16Ux16(v *Value, config *Config) bool { 15752 b := v.Block 15753 _ = b 15754 // match: (Rsh16Ux16 x y) 15755 // cond: 15756 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15757 for { 15758 x := v.Args[0] 15759 y := v.Args[1] 15760 v.reset(OpARMCMOVWHSconst) 15761 v.AuxInt = 0 15762 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15763 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15764 v1.AddArg(x) 15765 v0.AddArg(v1) 15766 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15767 v2.AddArg(y) 15768 v0.AddArg(v2) 15769 v.AddArg(v0) 15770 v3 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15771 v3.AuxInt = 256 15772 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15773 v4.AddArg(y) 15774 v3.AddArg(v4) 15775 v.AddArg(v3) 15776 return true 15777 } 15778 } 15779 func rewriteValueARM_OpRsh16Ux32(v *Value, config *Config) bool { 15780 b := v.Block 15781 _ = b 15782 // match: (Rsh16Ux32 x y) 15783 // cond: 15784 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 15785 for { 15786 x := v.Args[0] 15787 y := v.Args[1] 15788 v.reset(OpARMCMOVWHSconst) 15789 v.AuxInt = 0 15790 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15791 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15792 v1.AddArg(x) 15793 v0.AddArg(v1) 15794 v0.AddArg(y) 15795 v.AddArg(v0) 15796 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15797 v2.AuxInt = 256 15798 v2.AddArg(y) 15799 v.AddArg(v2) 15800 return true 15801 } 15802 } 15803 func rewriteValueARM_OpRsh16Ux64(v *Value, config *Config) bool { 15804 b := v.Block 15805 _ = b 15806 // match: (Rsh16Ux64 x (Const64 [c])) 15807 // cond: uint64(c) < 16 15808 // result: (SRLconst (SLLconst <config.fe.TypeUInt32()> x [16]) [c+16]) 15809 for { 15810 x := v.Args[0] 15811 v_1 := v.Args[1] 15812 if v_1.Op != OpConst64 { 15813 break 15814 } 15815 c := v_1.AuxInt 15816 if !(uint64(c) < 16) { 15817 break 15818 } 15819 v.reset(OpARMSRLconst) 15820 v.AuxInt = c + 16 15821 v0 := b.NewValue0(v.Pos, OpARMSLLconst, config.fe.TypeUInt32()) 15822 v0.AuxInt = 16 15823 v0.AddArg(x) 15824 v.AddArg(v0) 15825 return true 15826 } 15827 // match: (Rsh16Ux64 _ (Const64 [c])) 15828 // cond: uint64(c) >= 16 15829 // result: (Const16 [0]) 15830 for { 15831 v_1 := v.Args[1] 15832 if v_1.Op != OpConst64 { 15833 break 15834 } 15835 c := v_1.AuxInt 15836 if !(uint64(c) >= 16) { 15837 break 15838 } 15839 v.reset(OpConst16) 15840 v.AuxInt = 0 15841 return true 15842 } 15843 return false 15844 } 15845 func rewriteValueARM_OpRsh16Ux8(v *Value, config *Config) bool { 15846 b := v.Block 15847 _ = b 15848 // match: (Rsh16Ux8 x y) 15849 // cond: 15850 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 15851 for { 15852 x := v.Args[0] 15853 y := v.Args[1] 15854 v.reset(OpARMSRL) 15855 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15856 v0.AddArg(x) 15857 v.AddArg(v0) 15858 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 15859 v1.AddArg(y) 15860 v.AddArg(v1) 15861 return true 15862 } 15863 } 15864 func rewriteValueARM_OpRsh16x16(v *Value, config *Config) bool { 15865 b := v.Block 15866 _ = b 15867 // match: (Rsh16x16 x y) 15868 // cond: 15869 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15870 for { 15871 x := v.Args[0] 15872 y := v.Args[1] 15873 v.reset(OpARMSRAcond) 15874 v0 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 15875 v0.AddArg(x) 15876 v.AddArg(v0) 15877 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15878 v1.AddArg(y) 15879 v.AddArg(v1) 15880 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15881 v2.AuxInt = 256 15882 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15883 v3.AddArg(y) 15884 v2.AddArg(v3) 15885 v.AddArg(v2) 15886 return true 15887 } 15888 } 15889 func rewriteValueARM_OpRsh16x32(v *Value, config *Config) bool { 15890 b := v.Block 15891 _ = b 15892 // match: (Rsh16x32 x y) 15893 // cond: 15894 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 15895 for { 15896 x := v.Args[0] 15897 y := v.Args[1] 15898 v.reset(OpARMSRAcond) 15899 v0 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 15900 v0.AddArg(x) 15901 v.AddArg(v0) 15902 v.AddArg(y) 15903 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15904 v1.AuxInt = 256 15905 v1.AddArg(y) 15906 v.AddArg(v1) 15907 return true 15908 } 15909 } 15910 func rewriteValueARM_OpRsh16x64(v *Value, config *Config) bool { 15911 b := v.Block 15912 _ = b 15913 // match: (Rsh16x64 x (Const64 [c])) 15914 // cond: uint64(c) < 16 15915 // result: (SRAconst (SLLconst <config.fe.TypeUInt32()> x [16]) [c+16]) 15916 for { 15917 x := v.Args[0] 15918 v_1 := v.Args[1] 15919 if v_1.Op != OpConst64 { 15920 break 15921 } 15922 c := v_1.AuxInt 15923 if !(uint64(c) < 16) { 15924 break 15925 } 15926 v.reset(OpARMSRAconst) 15927 v.AuxInt = c + 16 15928 v0 := b.NewValue0(v.Pos, OpARMSLLconst, config.fe.TypeUInt32()) 15929 v0.AuxInt = 16 15930 v0.AddArg(x) 15931 v.AddArg(v0) 15932 return true 15933 } 15934 // match: (Rsh16x64 x (Const64 [c])) 15935 // cond: uint64(c) >= 16 15936 // result: (SRAconst (SLLconst <config.fe.TypeUInt32()> x [16]) [31]) 15937 for { 15938 x := v.Args[0] 15939 v_1 := v.Args[1] 15940 if v_1.Op != OpConst64 { 15941 break 15942 } 15943 c := v_1.AuxInt 15944 if !(uint64(c) >= 16) { 15945 break 15946 } 15947 v.reset(OpARMSRAconst) 15948 v.AuxInt = 31 15949 v0 := b.NewValue0(v.Pos, OpARMSLLconst, config.fe.TypeUInt32()) 15950 v0.AuxInt = 16 15951 v0.AddArg(x) 15952 v.AddArg(v0) 15953 return true 15954 } 15955 return false 15956 } 15957 func rewriteValueARM_OpRsh16x8(v *Value, config *Config) bool { 15958 b := v.Block 15959 _ = b 15960 // match: (Rsh16x8 x y) 15961 // cond: 15962 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 15963 for { 15964 x := v.Args[0] 15965 y := v.Args[1] 15966 v.reset(OpARMSRA) 15967 v0 := b.NewValue0(v.Pos, OpSignExt16to32, config.fe.TypeInt32()) 15968 v0.AddArg(x) 15969 v.AddArg(v0) 15970 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 15971 v1.AddArg(y) 15972 v.AddArg(v1) 15973 return true 15974 } 15975 } 15976 func rewriteValueARM_OpRsh32Ux16(v *Value, config *Config) bool { 15977 b := v.Block 15978 _ = b 15979 // match: (Rsh32Ux16 x y) 15980 // cond: 15981 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15982 for { 15983 x := v.Args[0] 15984 y := v.Args[1] 15985 v.reset(OpARMCMOVWHSconst) 15986 v.AuxInt = 0 15987 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15988 v0.AddArg(x) 15989 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15990 v1.AddArg(y) 15991 v0.AddArg(v1) 15992 v.AddArg(v0) 15993 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15994 v2.AuxInt = 256 15995 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 15996 v3.AddArg(y) 15997 v2.AddArg(v3) 15998 v.AddArg(v2) 15999 return true 16000 } 16001 } 16002 func rewriteValueARM_OpRsh32Ux32(v *Value, config *Config) bool { 16003 b := v.Block 16004 _ = b 16005 // match: (Rsh32Ux32 x y) 16006 // cond: 16007 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 16008 for { 16009 x := v.Args[0] 16010 y := v.Args[1] 16011 v.reset(OpARMCMOVWHSconst) 16012 v.AuxInt = 0 16013 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16014 v0.AddArg(x) 16015 v0.AddArg(y) 16016 v.AddArg(v0) 16017 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16018 v1.AuxInt = 256 16019 v1.AddArg(y) 16020 v.AddArg(v1) 16021 return true 16022 } 16023 } 16024 func rewriteValueARM_OpRsh32Ux64(v *Value, config *Config) bool { 16025 b := v.Block 16026 _ = b 16027 // match: (Rsh32Ux64 x (Const64 [c])) 16028 // cond: uint64(c) < 32 16029 // result: (SRLconst x [c]) 16030 for { 16031 x := v.Args[0] 16032 v_1 := v.Args[1] 16033 if v_1.Op != OpConst64 { 16034 break 16035 } 16036 c := v_1.AuxInt 16037 if !(uint64(c) < 32) { 16038 break 16039 } 16040 v.reset(OpARMSRLconst) 16041 v.AuxInt = c 16042 v.AddArg(x) 16043 return true 16044 } 16045 // match: (Rsh32Ux64 _ (Const64 [c])) 16046 // cond: uint64(c) >= 32 16047 // result: (Const32 [0]) 16048 for { 16049 v_1 := v.Args[1] 16050 if v_1.Op != OpConst64 { 16051 break 16052 } 16053 c := v_1.AuxInt 16054 if !(uint64(c) >= 32) { 16055 break 16056 } 16057 v.reset(OpConst32) 16058 v.AuxInt = 0 16059 return true 16060 } 16061 return false 16062 } 16063 func rewriteValueARM_OpRsh32Ux8(v *Value, config *Config) bool { 16064 b := v.Block 16065 _ = b 16066 // match: (Rsh32Ux8 x y) 16067 // cond: 16068 // result: (SRL x (ZeroExt8to32 y)) 16069 for { 16070 x := v.Args[0] 16071 y := v.Args[1] 16072 v.reset(OpARMSRL) 16073 v.AddArg(x) 16074 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 16075 v0.AddArg(y) 16076 v.AddArg(v0) 16077 return true 16078 } 16079 } 16080 func rewriteValueARM_OpRsh32x16(v *Value, config *Config) bool { 16081 b := v.Block 16082 _ = b 16083 // match: (Rsh32x16 x y) 16084 // cond: 16085 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16086 for { 16087 x := v.Args[0] 16088 y := v.Args[1] 16089 v.reset(OpARMSRAcond) 16090 v.AddArg(x) 16091 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 16092 v0.AddArg(y) 16093 v.AddArg(v0) 16094 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16095 v1.AuxInt = 256 16096 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 16097 v2.AddArg(y) 16098 v1.AddArg(v2) 16099 v.AddArg(v1) 16100 return true 16101 } 16102 } 16103 func rewriteValueARM_OpRsh32x32(v *Value, config *Config) bool { 16104 b := v.Block 16105 _ = b 16106 // match: (Rsh32x32 x y) 16107 // cond: 16108 // result: (SRAcond x y (CMPconst [256] y)) 16109 for { 16110 x := v.Args[0] 16111 y := v.Args[1] 16112 v.reset(OpARMSRAcond) 16113 v.AddArg(x) 16114 v.AddArg(y) 16115 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16116 v0.AuxInt = 256 16117 v0.AddArg(y) 16118 v.AddArg(v0) 16119 return true 16120 } 16121 } 16122 func rewriteValueARM_OpRsh32x64(v *Value, config *Config) bool { 16123 b := v.Block 16124 _ = b 16125 // match: (Rsh32x64 x (Const64 [c])) 16126 // cond: uint64(c) < 32 16127 // result: (SRAconst x [c]) 16128 for { 16129 x := v.Args[0] 16130 v_1 := v.Args[1] 16131 if v_1.Op != OpConst64 { 16132 break 16133 } 16134 c := v_1.AuxInt 16135 if !(uint64(c) < 32) { 16136 break 16137 } 16138 v.reset(OpARMSRAconst) 16139 v.AuxInt = c 16140 v.AddArg(x) 16141 return true 16142 } 16143 // match: (Rsh32x64 x (Const64 [c])) 16144 // cond: uint64(c) >= 32 16145 // result: (SRAconst x [31]) 16146 for { 16147 x := v.Args[0] 16148 v_1 := v.Args[1] 16149 if v_1.Op != OpConst64 { 16150 break 16151 } 16152 c := v_1.AuxInt 16153 if !(uint64(c) >= 32) { 16154 break 16155 } 16156 v.reset(OpARMSRAconst) 16157 v.AuxInt = 31 16158 v.AddArg(x) 16159 return true 16160 } 16161 return false 16162 } 16163 func rewriteValueARM_OpRsh32x8(v *Value, config *Config) bool { 16164 b := v.Block 16165 _ = b 16166 // match: (Rsh32x8 x y) 16167 // cond: 16168 // result: (SRA x (ZeroExt8to32 y)) 16169 for { 16170 x := v.Args[0] 16171 y := v.Args[1] 16172 v.reset(OpARMSRA) 16173 v.AddArg(x) 16174 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 16175 v0.AddArg(y) 16176 v.AddArg(v0) 16177 return true 16178 } 16179 } 16180 func rewriteValueARM_OpRsh8Ux16(v *Value, config *Config) bool { 16181 b := v.Block 16182 _ = b 16183 // match: (Rsh8Ux16 x y) 16184 // cond: 16185 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 16186 for { 16187 x := v.Args[0] 16188 y := v.Args[1] 16189 v.reset(OpARMCMOVWHSconst) 16190 v.AuxInt = 0 16191 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16192 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 16193 v1.AddArg(x) 16194 v0.AddArg(v1) 16195 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 16196 v2.AddArg(y) 16197 v0.AddArg(v2) 16198 v.AddArg(v0) 16199 v3 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16200 v3.AuxInt = 256 16201 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 16202 v4.AddArg(y) 16203 v3.AddArg(v4) 16204 v.AddArg(v3) 16205 return true 16206 } 16207 } 16208 func rewriteValueARM_OpRsh8Ux32(v *Value, config *Config) bool { 16209 b := v.Block 16210 _ = b 16211 // match: (Rsh8Ux32 x y) 16212 // cond: 16213 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 16214 for { 16215 x := v.Args[0] 16216 y := v.Args[1] 16217 v.reset(OpARMCMOVWHSconst) 16218 v.AuxInt = 0 16219 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16220 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 16221 v1.AddArg(x) 16222 v0.AddArg(v1) 16223 v0.AddArg(y) 16224 v.AddArg(v0) 16225 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16226 v2.AuxInt = 256 16227 v2.AddArg(y) 16228 v.AddArg(v2) 16229 return true 16230 } 16231 } 16232 func rewriteValueARM_OpRsh8Ux64(v *Value, config *Config) bool { 16233 b := v.Block 16234 _ = b 16235 // match: (Rsh8Ux64 x (Const64 [c])) 16236 // cond: uint64(c) < 8 16237 // result: (SRLconst (SLLconst <config.fe.TypeUInt32()> x [24]) [c+24]) 16238 for { 16239 x := v.Args[0] 16240 v_1 := v.Args[1] 16241 if v_1.Op != OpConst64 { 16242 break 16243 } 16244 c := v_1.AuxInt 16245 if !(uint64(c) < 8) { 16246 break 16247 } 16248 v.reset(OpARMSRLconst) 16249 v.AuxInt = c + 24 16250 v0 := b.NewValue0(v.Pos, OpARMSLLconst, config.fe.TypeUInt32()) 16251 v0.AuxInt = 24 16252 v0.AddArg(x) 16253 v.AddArg(v0) 16254 return true 16255 } 16256 // match: (Rsh8Ux64 _ (Const64 [c])) 16257 // cond: uint64(c) >= 8 16258 // result: (Const8 [0]) 16259 for { 16260 v_1 := v.Args[1] 16261 if v_1.Op != OpConst64 { 16262 break 16263 } 16264 c := v_1.AuxInt 16265 if !(uint64(c) >= 8) { 16266 break 16267 } 16268 v.reset(OpConst8) 16269 v.AuxInt = 0 16270 return true 16271 } 16272 return false 16273 } 16274 func rewriteValueARM_OpRsh8Ux8(v *Value, config *Config) bool { 16275 b := v.Block 16276 _ = b 16277 // match: (Rsh8Ux8 x y) 16278 // cond: 16279 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 16280 for { 16281 x := v.Args[0] 16282 y := v.Args[1] 16283 v.reset(OpARMSRL) 16284 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 16285 v0.AddArg(x) 16286 v.AddArg(v0) 16287 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 16288 v1.AddArg(y) 16289 v.AddArg(v1) 16290 return true 16291 } 16292 } 16293 func rewriteValueARM_OpRsh8x16(v *Value, config *Config) bool { 16294 b := v.Block 16295 _ = b 16296 // match: (Rsh8x16 x y) 16297 // cond: 16298 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16299 for { 16300 x := v.Args[0] 16301 y := v.Args[1] 16302 v.reset(OpARMSRAcond) 16303 v0 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 16304 v0.AddArg(x) 16305 v.AddArg(v0) 16306 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 16307 v1.AddArg(y) 16308 v.AddArg(v1) 16309 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16310 v2.AuxInt = 256 16311 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, config.fe.TypeUInt32()) 16312 v3.AddArg(y) 16313 v2.AddArg(v3) 16314 v.AddArg(v2) 16315 return true 16316 } 16317 } 16318 func rewriteValueARM_OpRsh8x32(v *Value, config *Config) bool { 16319 b := v.Block 16320 _ = b 16321 // match: (Rsh8x32 x y) 16322 // cond: 16323 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 16324 for { 16325 x := v.Args[0] 16326 y := v.Args[1] 16327 v.reset(OpARMSRAcond) 16328 v0 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 16329 v0.AddArg(x) 16330 v.AddArg(v0) 16331 v.AddArg(y) 16332 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16333 v1.AuxInt = 256 16334 v1.AddArg(y) 16335 v.AddArg(v1) 16336 return true 16337 } 16338 } 16339 func rewriteValueARM_OpRsh8x64(v *Value, config *Config) bool { 16340 b := v.Block 16341 _ = b 16342 // match: (Rsh8x64 x (Const64 [c])) 16343 // cond: uint64(c) < 8 16344 // result: (SRAconst (SLLconst <config.fe.TypeUInt32()> x [24]) [c+24]) 16345 for { 16346 x := v.Args[0] 16347 v_1 := v.Args[1] 16348 if v_1.Op != OpConst64 { 16349 break 16350 } 16351 c := v_1.AuxInt 16352 if !(uint64(c) < 8) { 16353 break 16354 } 16355 v.reset(OpARMSRAconst) 16356 v.AuxInt = c + 24 16357 v0 := b.NewValue0(v.Pos, OpARMSLLconst, config.fe.TypeUInt32()) 16358 v0.AuxInt = 24 16359 v0.AddArg(x) 16360 v.AddArg(v0) 16361 return true 16362 } 16363 // match: (Rsh8x64 x (Const64 [c])) 16364 // cond: uint64(c) >= 8 16365 // result: (SRAconst (SLLconst <config.fe.TypeUInt32()> x [24]) [31]) 16366 for { 16367 x := v.Args[0] 16368 v_1 := v.Args[1] 16369 if v_1.Op != OpConst64 { 16370 break 16371 } 16372 c := v_1.AuxInt 16373 if !(uint64(c) >= 8) { 16374 break 16375 } 16376 v.reset(OpARMSRAconst) 16377 v.AuxInt = 31 16378 v0 := b.NewValue0(v.Pos, OpARMSLLconst, config.fe.TypeUInt32()) 16379 v0.AuxInt = 24 16380 v0.AddArg(x) 16381 v.AddArg(v0) 16382 return true 16383 } 16384 return false 16385 } 16386 func rewriteValueARM_OpRsh8x8(v *Value, config *Config) bool { 16387 b := v.Block 16388 _ = b 16389 // match: (Rsh8x8 x y) 16390 // cond: 16391 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 16392 for { 16393 x := v.Args[0] 16394 y := v.Args[1] 16395 v.reset(OpARMSRA) 16396 v0 := b.NewValue0(v.Pos, OpSignExt8to32, config.fe.TypeInt32()) 16397 v0.AddArg(x) 16398 v.AddArg(v0) 16399 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, config.fe.TypeUInt32()) 16400 v1.AddArg(y) 16401 v.AddArg(v1) 16402 return true 16403 } 16404 } 16405 func rewriteValueARM_OpSelect0(v *Value, config *Config) bool { 16406 b := v.Block 16407 _ = b 16408 // match: (Select0 (UDIVrtcall x (MOVWconst [1]))) 16409 // cond: 16410 // result: x 16411 for { 16412 v_0 := v.Args[0] 16413 if v_0.Op != OpARMUDIVrtcall { 16414 break 16415 } 16416 x := v_0.Args[0] 16417 v_0_1 := v_0.Args[1] 16418 if v_0_1.Op != OpARMMOVWconst { 16419 break 16420 } 16421 if v_0_1.AuxInt != 1 { 16422 break 16423 } 16424 v.reset(OpCopy) 16425 v.Type = x.Type 16426 v.AddArg(x) 16427 return true 16428 } 16429 // match: (Select0 (UDIVrtcall x (MOVWconst [c]))) 16430 // cond: isPowerOfTwo(c) 16431 // result: (SRLconst [log2(c)] x) 16432 for { 16433 v_0 := v.Args[0] 16434 if v_0.Op != OpARMUDIVrtcall { 16435 break 16436 } 16437 x := v_0.Args[0] 16438 v_0_1 := v_0.Args[1] 16439 if v_0_1.Op != OpARMMOVWconst { 16440 break 16441 } 16442 c := v_0_1.AuxInt 16443 if !(isPowerOfTwo(c)) { 16444 break 16445 } 16446 v.reset(OpARMSRLconst) 16447 v.AuxInt = log2(c) 16448 v.AddArg(x) 16449 return true 16450 } 16451 // match: (Select0 (UDIVrtcall (MOVWconst [c]) (MOVWconst [d]))) 16452 // cond: 16453 // result: (MOVWconst [int64(uint32(c)/uint32(d))]) 16454 for { 16455 v_0 := v.Args[0] 16456 if v_0.Op != OpARMUDIVrtcall { 16457 break 16458 } 16459 v_0_0 := v_0.Args[0] 16460 if v_0_0.Op != OpARMMOVWconst { 16461 break 16462 } 16463 c := v_0_0.AuxInt 16464 v_0_1 := v_0.Args[1] 16465 if v_0_1.Op != OpARMMOVWconst { 16466 break 16467 } 16468 d := v_0_1.AuxInt 16469 v.reset(OpARMMOVWconst) 16470 v.AuxInt = int64(uint32(c) / uint32(d)) 16471 return true 16472 } 16473 return false 16474 } 16475 func rewriteValueARM_OpSelect1(v *Value, config *Config) bool { 16476 b := v.Block 16477 _ = b 16478 // match: (Select1 (UDIVrtcall _ (MOVWconst [1]))) 16479 // cond: 16480 // result: (MOVWconst [0]) 16481 for { 16482 v_0 := v.Args[0] 16483 if v_0.Op != OpARMUDIVrtcall { 16484 break 16485 } 16486 v_0_1 := v_0.Args[1] 16487 if v_0_1.Op != OpARMMOVWconst { 16488 break 16489 } 16490 if v_0_1.AuxInt != 1 { 16491 break 16492 } 16493 v.reset(OpARMMOVWconst) 16494 v.AuxInt = 0 16495 return true 16496 } 16497 // match: (Select1 (UDIVrtcall x (MOVWconst [c]))) 16498 // cond: isPowerOfTwo(c) 16499 // result: (ANDconst [c-1] x) 16500 for { 16501 v_0 := v.Args[0] 16502 if v_0.Op != OpARMUDIVrtcall { 16503 break 16504 } 16505 x := v_0.Args[0] 16506 v_0_1 := v_0.Args[1] 16507 if v_0_1.Op != OpARMMOVWconst { 16508 break 16509 } 16510 c := v_0_1.AuxInt 16511 if !(isPowerOfTwo(c)) { 16512 break 16513 } 16514 v.reset(OpARMANDconst) 16515 v.AuxInt = c - 1 16516 v.AddArg(x) 16517 return true 16518 } 16519 // match: (Select1 (UDIVrtcall (MOVWconst [c]) (MOVWconst [d]))) 16520 // cond: 16521 // result: (MOVWconst [int64(uint32(c)%uint32(d))]) 16522 for { 16523 v_0 := v.Args[0] 16524 if v_0.Op != OpARMUDIVrtcall { 16525 break 16526 } 16527 v_0_0 := v_0.Args[0] 16528 if v_0_0.Op != OpARMMOVWconst { 16529 break 16530 } 16531 c := v_0_0.AuxInt 16532 v_0_1 := v_0.Args[1] 16533 if v_0_1.Op != OpARMMOVWconst { 16534 break 16535 } 16536 d := v_0_1.AuxInt 16537 v.reset(OpARMMOVWconst) 16538 v.AuxInt = int64(uint32(c) % uint32(d)) 16539 return true 16540 } 16541 return false 16542 } 16543 func rewriteValueARM_OpSignExt16to32(v *Value, config *Config) bool { 16544 b := v.Block 16545 _ = b 16546 // match: (SignExt16to32 x) 16547 // cond: 16548 // result: (MOVHreg x) 16549 for { 16550 x := v.Args[0] 16551 v.reset(OpARMMOVHreg) 16552 v.AddArg(x) 16553 return true 16554 } 16555 } 16556 func rewriteValueARM_OpSignExt8to16(v *Value, config *Config) bool { 16557 b := v.Block 16558 _ = b 16559 // match: (SignExt8to16 x) 16560 // cond: 16561 // result: (MOVBreg x) 16562 for { 16563 x := v.Args[0] 16564 v.reset(OpARMMOVBreg) 16565 v.AddArg(x) 16566 return true 16567 } 16568 } 16569 func rewriteValueARM_OpSignExt8to32(v *Value, config *Config) bool { 16570 b := v.Block 16571 _ = b 16572 // match: (SignExt8to32 x) 16573 // cond: 16574 // result: (MOVBreg x) 16575 for { 16576 x := v.Args[0] 16577 v.reset(OpARMMOVBreg) 16578 v.AddArg(x) 16579 return true 16580 } 16581 } 16582 func rewriteValueARM_OpSignmask(v *Value, config *Config) bool { 16583 b := v.Block 16584 _ = b 16585 // match: (Signmask x) 16586 // cond: 16587 // result: (SRAconst x [31]) 16588 for { 16589 x := v.Args[0] 16590 v.reset(OpARMSRAconst) 16591 v.AuxInt = 31 16592 v.AddArg(x) 16593 return true 16594 } 16595 } 16596 func rewriteValueARM_OpSlicemask(v *Value, config *Config) bool { 16597 b := v.Block 16598 _ = b 16599 // match: (Slicemask <t> x) 16600 // cond: 16601 // result: (SRAconst (RSBconst <t> [0] x) [31]) 16602 for { 16603 t := v.Type 16604 x := v.Args[0] 16605 v.reset(OpARMSRAconst) 16606 v.AuxInt = 31 16607 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 16608 v0.AuxInt = 0 16609 v0.AddArg(x) 16610 v.AddArg(v0) 16611 return true 16612 } 16613 } 16614 func rewriteValueARM_OpSqrt(v *Value, config *Config) bool { 16615 b := v.Block 16616 _ = b 16617 // match: (Sqrt x) 16618 // cond: 16619 // result: (SQRTD x) 16620 for { 16621 x := v.Args[0] 16622 v.reset(OpARMSQRTD) 16623 v.AddArg(x) 16624 return true 16625 } 16626 } 16627 func rewriteValueARM_OpStaticCall(v *Value, config *Config) bool { 16628 b := v.Block 16629 _ = b 16630 // match: (StaticCall [argwid] {target} mem) 16631 // cond: 16632 // result: (CALLstatic [argwid] {target} mem) 16633 for { 16634 argwid := v.AuxInt 16635 target := v.Aux 16636 mem := v.Args[0] 16637 v.reset(OpARMCALLstatic) 16638 v.AuxInt = argwid 16639 v.Aux = target 16640 v.AddArg(mem) 16641 return true 16642 } 16643 } 16644 func rewriteValueARM_OpStore(v *Value, config *Config) bool { 16645 b := v.Block 16646 _ = b 16647 // match: (Store [1] ptr val mem) 16648 // cond: 16649 // result: (MOVBstore ptr val mem) 16650 for { 16651 if v.AuxInt != 1 { 16652 break 16653 } 16654 ptr := v.Args[0] 16655 val := v.Args[1] 16656 mem := v.Args[2] 16657 v.reset(OpARMMOVBstore) 16658 v.AddArg(ptr) 16659 v.AddArg(val) 16660 v.AddArg(mem) 16661 return true 16662 } 16663 // match: (Store [2] ptr val mem) 16664 // cond: 16665 // result: (MOVHstore ptr val mem) 16666 for { 16667 if v.AuxInt != 2 { 16668 break 16669 } 16670 ptr := v.Args[0] 16671 val := v.Args[1] 16672 mem := v.Args[2] 16673 v.reset(OpARMMOVHstore) 16674 v.AddArg(ptr) 16675 v.AddArg(val) 16676 v.AddArg(mem) 16677 return true 16678 } 16679 // match: (Store [4] ptr val mem) 16680 // cond: !is32BitFloat(val.Type) 16681 // result: (MOVWstore ptr val mem) 16682 for { 16683 if v.AuxInt != 4 { 16684 break 16685 } 16686 ptr := v.Args[0] 16687 val := v.Args[1] 16688 mem := v.Args[2] 16689 if !(!is32BitFloat(val.Type)) { 16690 break 16691 } 16692 v.reset(OpARMMOVWstore) 16693 v.AddArg(ptr) 16694 v.AddArg(val) 16695 v.AddArg(mem) 16696 return true 16697 } 16698 // match: (Store [4] ptr val mem) 16699 // cond: is32BitFloat(val.Type) 16700 // result: (MOVFstore ptr val mem) 16701 for { 16702 if v.AuxInt != 4 { 16703 break 16704 } 16705 ptr := v.Args[0] 16706 val := v.Args[1] 16707 mem := v.Args[2] 16708 if !(is32BitFloat(val.Type)) { 16709 break 16710 } 16711 v.reset(OpARMMOVFstore) 16712 v.AddArg(ptr) 16713 v.AddArg(val) 16714 v.AddArg(mem) 16715 return true 16716 } 16717 // match: (Store [8] ptr val mem) 16718 // cond: is64BitFloat(val.Type) 16719 // result: (MOVDstore ptr val mem) 16720 for { 16721 if v.AuxInt != 8 { 16722 break 16723 } 16724 ptr := v.Args[0] 16725 val := v.Args[1] 16726 mem := v.Args[2] 16727 if !(is64BitFloat(val.Type)) { 16728 break 16729 } 16730 v.reset(OpARMMOVDstore) 16731 v.AddArg(ptr) 16732 v.AddArg(val) 16733 v.AddArg(mem) 16734 return true 16735 } 16736 return false 16737 } 16738 func rewriteValueARM_OpSub16(v *Value, config *Config) bool { 16739 b := v.Block 16740 _ = b 16741 // match: (Sub16 x y) 16742 // cond: 16743 // result: (SUB x y) 16744 for { 16745 x := v.Args[0] 16746 y := v.Args[1] 16747 v.reset(OpARMSUB) 16748 v.AddArg(x) 16749 v.AddArg(y) 16750 return true 16751 } 16752 } 16753 func rewriteValueARM_OpSub32(v *Value, config *Config) bool { 16754 b := v.Block 16755 _ = b 16756 // match: (Sub32 x y) 16757 // cond: 16758 // result: (SUB x y) 16759 for { 16760 x := v.Args[0] 16761 y := v.Args[1] 16762 v.reset(OpARMSUB) 16763 v.AddArg(x) 16764 v.AddArg(y) 16765 return true 16766 } 16767 } 16768 func rewriteValueARM_OpSub32F(v *Value, config *Config) bool { 16769 b := v.Block 16770 _ = b 16771 // match: (Sub32F x y) 16772 // cond: 16773 // result: (SUBF x y) 16774 for { 16775 x := v.Args[0] 16776 y := v.Args[1] 16777 v.reset(OpARMSUBF) 16778 v.AddArg(x) 16779 v.AddArg(y) 16780 return true 16781 } 16782 } 16783 func rewriteValueARM_OpSub32carry(v *Value, config *Config) bool { 16784 b := v.Block 16785 _ = b 16786 // match: (Sub32carry x y) 16787 // cond: 16788 // result: (SUBS x y) 16789 for { 16790 x := v.Args[0] 16791 y := v.Args[1] 16792 v.reset(OpARMSUBS) 16793 v.AddArg(x) 16794 v.AddArg(y) 16795 return true 16796 } 16797 } 16798 func rewriteValueARM_OpSub32withcarry(v *Value, config *Config) bool { 16799 b := v.Block 16800 _ = b 16801 // match: (Sub32withcarry x y c) 16802 // cond: 16803 // result: (SBC x y c) 16804 for { 16805 x := v.Args[0] 16806 y := v.Args[1] 16807 c := v.Args[2] 16808 v.reset(OpARMSBC) 16809 v.AddArg(x) 16810 v.AddArg(y) 16811 v.AddArg(c) 16812 return true 16813 } 16814 } 16815 func rewriteValueARM_OpSub64F(v *Value, config *Config) bool { 16816 b := v.Block 16817 _ = b 16818 // match: (Sub64F x y) 16819 // cond: 16820 // result: (SUBD x y) 16821 for { 16822 x := v.Args[0] 16823 y := v.Args[1] 16824 v.reset(OpARMSUBD) 16825 v.AddArg(x) 16826 v.AddArg(y) 16827 return true 16828 } 16829 } 16830 func rewriteValueARM_OpSub8(v *Value, config *Config) bool { 16831 b := v.Block 16832 _ = b 16833 // match: (Sub8 x y) 16834 // cond: 16835 // result: (SUB x y) 16836 for { 16837 x := v.Args[0] 16838 y := v.Args[1] 16839 v.reset(OpARMSUB) 16840 v.AddArg(x) 16841 v.AddArg(y) 16842 return true 16843 } 16844 } 16845 func rewriteValueARM_OpSubPtr(v *Value, config *Config) bool { 16846 b := v.Block 16847 _ = b 16848 // match: (SubPtr x y) 16849 // cond: 16850 // result: (SUB x y) 16851 for { 16852 x := v.Args[0] 16853 y := v.Args[1] 16854 v.reset(OpARMSUB) 16855 v.AddArg(x) 16856 v.AddArg(y) 16857 return true 16858 } 16859 } 16860 func rewriteValueARM_OpTrunc16to8(v *Value, config *Config) bool { 16861 b := v.Block 16862 _ = b 16863 // match: (Trunc16to8 x) 16864 // cond: 16865 // result: x 16866 for { 16867 x := v.Args[0] 16868 v.reset(OpCopy) 16869 v.Type = x.Type 16870 v.AddArg(x) 16871 return true 16872 } 16873 } 16874 func rewriteValueARM_OpTrunc32to16(v *Value, config *Config) bool { 16875 b := v.Block 16876 _ = b 16877 // match: (Trunc32to16 x) 16878 // cond: 16879 // result: x 16880 for { 16881 x := v.Args[0] 16882 v.reset(OpCopy) 16883 v.Type = x.Type 16884 v.AddArg(x) 16885 return true 16886 } 16887 } 16888 func rewriteValueARM_OpTrunc32to8(v *Value, config *Config) bool { 16889 b := v.Block 16890 _ = b 16891 // match: (Trunc32to8 x) 16892 // cond: 16893 // result: x 16894 for { 16895 x := v.Args[0] 16896 v.reset(OpCopy) 16897 v.Type = x.Type 16898 v.AddArg(x) 16899 return true 16900 } 16901 } 16902 func rewriteValueARM_OpXor16(v *Value, config *Config) bool { 16903 b := v.Block 16904 _ = b 16905 // match: (Xor16 x y) 16906 // cond: 16907 // result: (XOR x y) 16908 for { 16909 x := v.Args[0] 16910 y := v.Args[1] 16911 v.reset(OpARMXOR) 16912 v.AddArg(x) 16913 v.AddArg(y) 16914 return true 16915 } 16916 } 16917 func rewriteValueARM_OpXor32(v *Value, config *Config) bool { 16918 b := v.Block 16919 _ = b 16920 // match: (Xor32 x y) 16921 // cond: 16922 // result: (XOR x y) 16923 for { 16924 x := v.Args[0] 16925 y := v.Args[1] 16926 v.reset(OpARMXOR) 16927 v.AddArg(x) 16928 v.AddArg(y) 16929 return true 16930 } 16931 } 16932 func rewriteValueARM_OpXor8(v *Value, config *Config) bool { 16933 b := v.Block 16934 _ = b 16935 // match: (Xor8 x y) 16936 // cond: 16937 // result: (XOR x y) 16938 for { 16939 x := v.Args[0] 16940 y := v.Args[1] 16941 v.reset(OpARMXOR) 16942 v.AddArg(x) 16943 v.AddArg(y) 16944 return true 16945 } 16946 } 16947 func rewriteValueARM_OpZero(v *Value, config *Config) bool { 16948 b := v.Block 16949 _ = b 16950 // match: (Zero [s] _ mem) 16951 // cond: SizeAndAlign(s).Size() == 0 16952 // result: mem 16953 for { 16954 s := v.AuxInt 16955 mem := v.Args[1] 16956 if !(SizeAndAlign(s).Size() == 0) { 16957 break 16958 } 16959 v.reset(OpCopy) 16960 v.Type = mem.Type 16961 v.AddArg(mem) 16962 return true 16963 } 16964 // match: (Zero [s] ptr mem) 16965 // cond: SizeAndAlign(s).Size() == 1 16966 // result: (MOVBstore ptr (MOVWconst [0]) mem) 16967 for { 16968 s := v.AuxInt 16969 ptr := v.Args[0] 16970 mem := v.Args[1] 16971 if !(SizeAndAlign(s).Size() == 1) { 16972 break 16973 } 16974 v.reset(OpARMMOVBstore) 16975 v.AddArg(ptr) 16976 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 16977 v0.AuxInt = 0 16978 v.AddArg(v0) 16979 v.AddArg(mem) 16980 return true 16981 } 16982 // match: (Zero [s] ptr mem) 16983 // cond: SizeAndAlign(s).Size() == 2 && SizeAndAlign(s).Align()%2 == 0 16984 // result: (MOVHstore ptr (MOVWconst [0]) mem) 16985 for { 16986 s := v.AuxInt 16987 ptr := v.Args[0] 16988 mem := v.Args[1] 16989 if !(SizeAndAlign(s).Size() == 2 && SizeAndAlign(s).Align()%2 == 0) { 16990 break 16991 } 16992 v.reset(OpARMMOVHstore) 16993 v.AddArg(ptr) 16994 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 16995 v0.AuxInt = 0 16996 v.AddArg(v0) 16997 v.AddArg(mem) 16998 return true 16999 } 17000 // match: (Zero [s] ptr mem) 17001 // cond: SizeAndAlign(s).Size() == 2 17002 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 17003 for { 17004 s := v.AuxInt 17005 ptr := v.Args[0] 17006 mem := v.Args[1] 17007 if !(SizeAndAlign(s).Size() == 2) { 17008 break 17009 } 17010 v.reset(OpARMMOVBstore) 17011 v.AuxInt = 1 17012 v.AddArg(ptr) 17013 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17014 v0.AuxInt = 0 17015 v.AddArg(v0) 17016 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17017 v1.AuxInt = 0 17018 v1.AddArg(ptr) 17019 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17020 v2.AuxInt = 0 17021 v1.AddArg(v2) 17022 v1.AddArg(mem) 17023 v.AddArg(v1) 17024 return true 17025 } 17026 // match: (Zero [s] ptr mem) 17027 // cond: SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%4 == 0 17028 // result: (MOVWstore ptr (MOVWconst [0]) mem) 17029 for { 17030 s := v.AuxInt 17031 ptr := v.Args[0] 17032 mem := v.Args[1] 17033 if !(SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%4 == 0) { 17034 break 17035 } 17036 v.reset(OpARMMOVWstore) 17037 v.AddArg(ptr) 17038 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17039 v0.AuxInt = 0 17040 v.AddArg(v0) 17041 v.AddArg(mem) 17042 return true 17043 } 17044 // match: (Zero [s] ptr mem) 17045 // cond: SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%2 == 0 17046 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 17047 for { 17048 s := v.AuxInt 17049 ptr := v.Args[0] 17050 mem := v.Args[1] 17051 if !(SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%2 == 0) { 17052 break 17053 } 17054 v.reset(OpARMMOVHstore) 17055 v.AuxInt = 2 17056 v.AddArg(ptr) 17057 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17058 v0.AuxInt = 0 17059 v.AddArg(v0) 17060 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, TypeMem) 17061 v1.AuxInt = 0 17062 v1.AddArg(ptr) 17063 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17064 v2.AuxInt = 0 17065 v1.AddArg(v2) 17066 v1.AddArg(mem) 17067 v.AddArg(v1) 17068 return true 17069 } 17070 // match: (Zero [s] ptr mem) 17071 // cond: SizeAndAlign(s).Size() == 4 17072 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 17073 for { 17074 s := v.AuxInt 17075 ptr := v.Args[0] 17076 mem := v.Args[1] 17077 if !(SizeAndAlign(s).Size() == 4) { 17078 break 17079 } 17080 v.reset(OpARMMOVBstore) 17081 v.AuxInt = 3 17082 v.AddArg(ptr) 17083 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17084 v0.AuxInt = 0 17085 v.AddArg(v0) 17086 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17087 v1.AuxInt = 2 17088 v1.AddArg(ptr) 17089 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17090 v2.AuxInt = 0 17091 v1.AddArg(v2) 17092 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17093 v3.AuxInt = 1 17094 v3.AddArg(ptr) 17095 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17096 v4.AuxInt = 0 17097 v3.AddArg(v4) 17098 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17099 v5.AuxInt = 0 17100 v5.AddArg(ptr) 17101 v6 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17102 v6.AuxInt = 0 17103 v5.AddArg(v6) 17104 v5.AddArg(mem) 17105 v3.AddArg(v5) 17106 v1.AddArg(v3) 17107 v.AddArg(v1) 17108 return true 17109 } 17110 // match: (Zero [s] ptr mem) 17111 // cond: SizeAndAlign(s).Size() == 3 17112 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 17113 for { 17114 s := v.AuxInt 17115 ptr := v.Args[0] 17116 mem := v.Args[1] 17117 if !(SizeAndAlign(s).Size() == 3) { 17118 break 17119 } 17120 v.reset(OpARMMOVBstore) 17121 v.AuxInt = 2 17122 v.AddArg(ptr) 17123 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17124 v0.AuxInt = 0 17125 v.AddArg(v0) 17126 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17127 v1.AuxInt = 1 17128 v1.AddArg(ptr) 17129 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17130 v2.AuxInt = 0 17131 v1.AddArg(v2) 17132 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17133 v3.AuxInt = 0 17134 v3.AddArg(ptr) 17135 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17136 v4.AuxInt = 0 17137 v3.AddArg(v4) 17138 v3.AddArg(mem) 17139 v1.AddArg(v3) 17140 v.AddArg(v1) 17141 return true 17142 } 17143 // match: (Zero [s] ptr mem) 17144 // cond: SizeAndAlign(s).Size()%4 == 0 && SizeAndAlign(s).Size() > 4 && SizeAndAlign(s).Size() <= 512 && SizeAndAlign(s).Align()%4 == 0 && !config.noDuffDevice 17145 // result: (DUFFZERO [4 * (128 - int64(SizeAndAlign(s).Size()/4))] ptr (MOVWconst [0]) mem) 17146 for { 17147 s := v.AuxInt 17148 ptr := v.Args[0] 17149 mem := v.Args[1] 17150 if !(SizeAndAlign(s).Size()%4 == 0 && SizeAndAlign(s).Size() > 4 && SizeAndAlign(s).Size() <= 512 && SizeAndAlign(s).Align()%4 == 0 && !config.noDuffDevice) { 17151 break 17152 } 17153 v.reset(OpARMDUFFZERO) 17154 v.AuxInt = 4 * (128 - int64(SizeAndAlign(s).Size()/4)) 17155 v.AddArg(ptr) 17156 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17157 v0.AuxInt = 0 17158 v.AddArg(v0) 17159 v.AddArg(mem) 17160 return true 17161 } 17162 // match: (Zero [s] ptr mem) 17163 // cond: (SizeAndAlign(s).Size() > 512 || config.noDuffDevice) || SizeAndAlign(s).Align()%4 != 0 17164 // result: (LoweredZero [SizeAndAlign(s).Align()] ptr (ADDconst <ptr.Type> ptr [SizeAndAlign(s).Size()-moveSize(SizeAndAlign(s).Align(), config)]) (MOVWconst [0]) mem) 17165 for { 17166 s := v.AuxInt 17167 ptr := v.Args[0] 17168 mem := v.Args[1] 17169 if !((SizeAndAlign(s).Size() > 512 || config.noDuffDevice) || SizeAndAlign(s).Align()%4 != 0) { 17170 break 17171 } 17172 v.reset(OpARMLoweredZero) 17173 v.AuxInt = SizeAndAlign(s).Align() 17174 v.AddArg(ptr) 17175 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 17176 v0.AuxInt = SizeAndAlign(s).Size() - moveSize(SizeAndAlign(s).Align(), config) 17177 v0.AddArg(ptr) 17178 v.AddArg(v0) 17179 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, config.fe.TypeUInt32()) 17180 v1.AuxInt = 0 17181 v.AddArg(v1) 17182 v.AddArg(mem) 17183 return true 17184 } 17185 return false 17186 } 17187 func rewriteValueARM_OpZeroExt16to32(v *Value, config *Config) bool { 17188 b := v.Block 17189 _ = b 17190 // match: (ZeroExt16to32 x) 17191 // cond: 17192 // result: (MOVHUreg x) 17193 for { 17194 x := v.Args[0] 17195 v.reset(OpARMMOVHUreg) 17196 v.AddArg(x) 17197 return true 17198 } 17199 } 17200 func rewriteValueARM_OpZeroExt8to16(v *Value, config *Config) bool { 17201 b := v.Block 17202 _ = b 17203 // match: (ZeroExt8to16 x) 17204 // cond: 17205 // result: (MOVBUreg x) 17206 for { 17207 x := v.Args[0] 17208 v.reset(OpARMMOVBUreg) 17209 v.AddArg(x) 17210 return true 17211 } 17212 } 17213 func rewriteValueARM_OpZeroExt8to32(v *Value, config *Config) bool { 17214 b := v.Block 17215 _ = b 17216 // match: (ZeroExt8to32 x) 17217 // cond: 17218 // result: (MOVBUreg x) 17219 for { 17220 x := v.Args[0] 17221 v.reset(OpARMMOVBUreg) 17222 v.AddArg(x) 17223 return true 17224 } 17225 } 17226 func rewriteValueARM_OpZeromask(v *Value, config *Config) bool { 17227 b := v.Block 17228 _ = b 17229 // match: (Zeromask x) 17230 // cond: 17231 // result: (SRAconst (RSBshiftRL <config.fe.TypeInt32()> x x [1]) [31]) 17232 for { 17233 x := v.Args[0] 17234 v.reset(OpARMSRAconst) 17235 v.AuxInt = 31 17236 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, config.fe.TypeInt32()) 17237 v0.AuxInt = 1 17238 v0.AddArg(x) 17239 v0.AddArg(x) 17240 v.AddArg(v0) 17241 return true 17242 } 17243 } 17244 func rewriteBlockARM(b *Block, config *Config) bool { 17245 switch b.Kind { 17246 case BlockARMEQ: 17247 // match: (EQ (FlagEQ) yes no) 17248 // cond: 17249 // result: (First nil yes no) 17250 for { 17251 v := b.Control 17252 if v.Op != OpARMFlagEQ { 17253 break 17254 } 17255 yes := b.Succs[0] 17256 no := b.Succs[1] 17257 b.Kind = BlockFirst 17258 b.SetControl(nil) 17259 _ = yes 17260 _ = no 17261 return true 17262 } 17263 // match: (EQ (FlagLT_ULT) yes no) 17264 // cond: 17265 // result: (First nil no yes) 17266 for { 17267 v := b.Control 17268 if v.Op != OpARMFlagLT_ULT { 17269 break 17270 } 17271 yes := b.Succs[0] 17272 no := b.Succs[1] 17273 b.Kind = BlockFirst 17274 b.SetControl(nil) 17275 b.swapSuccessors() 17276 _ = no 17277 _ = yes 17278 return true 17279 } 17280 // match: (EQ (FlagLT_UGT) yes no) 17281 // cond: 17282 // result: (First nil no yes) 17283 for { 17284 v := b.Control 17285 if v.Op != OpARMFlagLT_UGT { 17286 break 17287 } 17288 yes := b.Succs[0] 17289 no := b.Succs[1] 17290 b.Kind = BlockFirst 17291 b.SetControl(nil) 17292 b.swapSuccessors() 17293 _ = no 17294 _ = yes 17295 return true 17296 } 17297 // match: (EQ (FlagGT_ULT) yes no) 17298 // cond: 17299 // result: (First nil no yes) 17300 for { 17301 v := b.Control 17302 if v.Op != OpARMFlagGT_ULT { 17303 break 17304 } 17305 yes := b.Succs[0] 17306 no := b.Succs[1] 17307 b.Kind = BlockFirst 17308 b.SetControl(nil) 17309 b.swapSuccessors() 17310 _ = no 17311 _ = yes 17312 return true 17313 } 17314 // match: (EQ (FlagGT_UGT) yes no) 17315 // cond: 17316 // result: (First nil no yes) 17317 for { 17318 v := b.Control 17319 if v.Op != OpARMFlagGT_UGT { 17320 break 17321 } 17322 yes := b.Succs[0] 17323 no := b.Succs[1] 17324 b.Kind = BlockFirst 17325 b.SetControl(nil) 17326 b.swapSuccessors() 17327 _ = no 17328 _ = yes 17329 return true 17330 } 17331 // match: (EQ (InvertFlags cmp) yes no) 17332 // cond: 17333 // result: (EQ cmp yes no) 17334 for { 17335 v := b.Control 17336 if v.Op != OpARMInvertFlags { 17337 break 17338 } 17339 cmp := v.Args[0] 17340 yes := b.Succs[0] 17341 no := b.Succs[1] 17342 b.Kind = BlockARMEQ 17343 b.SetControl(cmp) 17344 _ = yes 17345 _ = no 17346 return true 17347 } 17348 case BlockARMGE: 17349 // match: (GE (FlagEQ) yes no) 17350 // cond: 17351 // result: (First nil yes no) 17352 for { 17353 v := b.Control 17354 if v.Op != OpARMFlagEQ { 17355 break 17356 } 17357 yes := b.Succs[0] 17358 no := b.Succs[1] 17359 b.Kind = BlockFirst 17360 b.SetControl(nil) 17361 _ = yes 17362 _ = no 17363 return true 17364 } 17365 // match: (GE (FlagLT_ULT) yes no) 17366 // cond: 17367 // result: (First nil no yes) 17368 for { 17369 v := b.Control 17370 if v.Op != OpARMFlagLT_ULT { 17371 break 17372 } 17373 yes := b.Succs[0] 17374 no := b.Succs[1] 17375 b.Kind = BlockFirst 17376 b.SetControl(nil) 17377 b.swapSuccessors() 17378 _ = no 17379 _ = yes 17380 return true 17381 } 17382 // match: (GE (FlagLT_UGT) yes no) 17383 // cond: 17384 // result: (First nil no yes) 17385 for { 17386 v := b.Control 17387 if v.Op != OpARMFlagLT_UGT { 17388 break 17389 } 17390 yes := b.Succs[0] 17391 no := b.Succs[1] 17392 b.Kind = BlockFirst 17393 b.SetControl(nil) 17394 b.swapSuccessors() 17395 _ = no 17396 _ = yes 17397 return true 17398 } 17399 // match: (GE (FlagGT_ULT) yes no) 17400 // cond: 17401 // result: (First nil yes no) 17402 for { 17403 v := b.Control 17404 if v.Op != OpARMFlagGT_ULT { 17405 break 17406 } 17407 yes := b.Succs[0] 17408 no := b.Succs[1] 17409 b.Kind = BlockFirst 17410 b.SetControl(nil) 17411 _ = yes 17412 _ = no 17413 return true 17414 } 17415 // match: (GE (FlagGT_UGT) yes no) 17416 // cond: 17417 // result: (First nil yes no) 17418 for { 17419 v := b.Control 17420 if v.Op != OpARMFlagGT_UGT { 17421 break 17422 } 17423 yes := b.Succs[0] 17424 no := b.Succs[1] 17425 b.Kind = BlockFirst 17426 b.SetControl(nil) 17427 _ = yes 17428 _ = no 17429 return true 17430 } 17431 // match: (GE (InvertFlags cmp) yes no) 17432 // cond: 17433 // result: (LE cmp yes no) 17434 for { 17435 v := b.Control 17436 if v.Op != OpARMInvertFlags { 17437 break 17438 } 17439 cmp := v.Args[0] 17440 yes := b.Succs[0] 17441 no := b.Succs[1] 17442 b.Kind = BlockARMLE 17443 b.SetControl(cmp) 17444 _ = yes 17445 _ = no 17446 return true 17447 } 17448 case BlockARMGT: 17449 // match: (GT (FlagEQ) yes no) 17450 // cond: 17451 // result: (First nil no yes) 17452 for { 17453 v := b.Control 17454 if v.Op != OpARMFlagEQ { 17455 break 17456 } 17457 yes := b.Succs[0] 17458 no := b.Succs[1] 17459 b.Kind = BlockFirst 17460 b.SetControl(nil) 17461 b.swapSuccessors() 17462 _ = no 17463 _ = yes 17464 return true 17465 } 17466 // match: (GT (FlagLT_ULT) yes no) 17467 // cond: 17468 // result: (First nil no yes) 17469 for { 17470 v := b.Control 17471 if v.Op != OpARMFlagLT_ULT { 17472 break 17473 } 17474 yes := b.Succs[0] 17475 no := b.Succs[1] 17476 b.Kind = BlockFirst 17477 b.SetControl(nil) 17478 b.swapSuccessors() 17479 _ = no 17480 _ = yes 17481 return true 17482 } 17483 // match: (GT (FlagLT_UGT) yes no) 17484 // cond: 17485 // result: (First nil no yes) 17486 for { 17487 v := b.Control 17488 if v.Op != OpARMFlagLT_UGT { 17489 break 17490 } 17491 yes := b.Succs[0] 17492 no := b.Succs[1] 17493 b.Kind = BlockFirst 17494 b.SetControl(nil) 17495 b.swapSuccessors() 17496 _ = no 17497 _ = yes 17498 return true 17499 } 17500 // match: (GT (FlagGT_ULT) yes no) 17501 // cond: 17502 // result: (First nil yes no) 17503 for { 17504 v := b.Control 17505 if v.Op != OpARMFlagGT_ULT { 17506 break 17507 } 17508 yes := b.Succs[0] 17509 no := b.Succs[1] 17510 b.Kind = BlockFirst 17511 b.SetControl(nil) 17512 _ = yes 17513 _ = no 17514 return true 17515 } 17516 // match: (GT (FlagGT_UGT) yes no) 17517 // cond: 17518 // result: (First nil yes no) 17519 for { 17520 v := b.Control 17521 if v.Op != OpARMFlagGT_UGT { 17522 break 17523 } 17524 yes := b.Succs[0] 17525 no := b.Succs[1] 17526 b.Kind = BlockFirst 17527 b.SetControl(nil) 17528 _ = yes 17529 _ = no 17530 return true 17531 } 17532 // match: (GT (InvertFlags cmp) yes no) 17533 // cond: 17534 // result: (LT cmp yes no) 17535 for { 17536 v := b.Control 17537 if v.Op != OpARMInvertFlags { 17538 break 17539 } 17540 cmp := v.Args[0] 17541 yes := b.Succs[0] 17542 no := b.Succs[1] 17543 b.Kind = BlockARMLT 17544 b.SetControl(cmp) 17545 _ = yes 17546 _ = no 17547 return true 17548 } 17549 case BlockIf: 17550 // match: (If (Equal cc) yes no) 17551 // cond: 17552 // result: (EQ cc yes no) 17553 for { 17554 v := b.Control 17555 if v.Op != OpARMEqual { 17556 break 17557 } 17558 cc := v.Args[0] 17559 yes := b.Succs[0] 17560 no := b.Succs[1] 17561 b.Kind = BlockARMEQ 17562 b.SetControl(cc) 17563 _ = yes 17564 _ = no 17565 return true 17566 } 17567 // match: (If (NotEqual cc) yes no) 17568 // cond: 17569 // result: (NE cc yes no) 17570 for { 17571 v := b.Control 17572 if v.Op != OpARMNotEqual { 17573 break 17574 } 17575 cc := v.Args[0] 17576 yes := b.Succs[0] 17577 no := b.Succs[1] 17578 b.Kind = BlockARMNE 17579 b.SetControl(cc) 17580 _ = yes 17581 _ = no 17582 return true 17583 } 17584 // match: (If (LessThan cc) yes no) 17585 // cond: 17586 // result: (LT cc yes no) 17587 for { 17588 v := b.Control 17589 if v.Op != OpARMLessThan { 17590 break 17591 } 17592 cc := v.Args[0] 17593 yes := b.Succs[0] 17594 no := b.Succs[1] 17595 b.Kind = BlockARMLT 17596 b.SetControl(cc) 17597 _ = yes 17598 _ = no 17599 return true 17600 } 17601 // match: (If (LessThanU cc) yes no) 17602 // cond: 17603 // result: (ULT cc yes no) 17604 for { 17605 v := b.Control 17606 if v.Op != OpARMLessThanU { 17607 break 17608 } 17609 cc := v.Args[0] 17610 yes := b.Succs[0] 17611 no := b.Succs[1] 17612 b.Kind = BlockARMULT 17613 b.SetControl(cc) 17614 _ = yes 17615 _ = no 17616 return true 17617 } 17618 // match: (If (LessEqual cc) yes no) 17619 // cond: 17620 // result: (LE cc yes no) 17621 for { 17622 v := b.Control 17623 if v.Op != OpARMLessEqual { 17624 break 17625 } 17626 cc := v.Args[0] 17627 yes := b.Succs[0] 17628 no := b.Succs[1] 17629 b.Kind = BlockARMLE 17630 b.SetControl(cc) 17631 _ = yes 17632 _ = no 17633 return true 17634 } 17635 // match: (If (LessEqualU cc) yes no) 17636 // cond: 17637 // result: (ULE cc yes no) 17638 for { 17639 v := b.Control 17640 if v.Op != OpARMLessEqualU { 17641 break 17642 } 17643 cc := v.Args[0] 17644 yes := b.Succs[0] 17645 no := b.Succs[1] 17646 b.Kind = BlockARMULE 17647 b.SetControl(cc) 17648 _ = yes 17649 _ = no 17650 return true 17651 } 17652 // match: (If (GreaterThan cc) yes no) 17653 // cond: 17654 // result: (GT cc yes no) 17655 for { 17656 v := b.Control 17657 if v.Op != OpARMGreaterThan { 17658 break 17659 } 17660 cc := v.Args[0] 17661 yes := b.Succs[0] 17662 no := b.Succs[1] 17663 b.Kind = BlockARMGT 17664 b.SetControl(cc) 17665 _ = yes 17666 _ = no 17667 return true 17668 } 17669 // match: (If (GreaterThanU cc) yes no) 17670 // cond: 17671 // result: (UGT cc yes no) 17672 for { 17673 v := b.Control 17674 if v.Op != OpARMGreaterThanU { 17675 break 17676 } 17677 cc := v.Args[0] 17678 yes := b.Succs[0] 17679 no := b.Succs[1] 17680 b.Kind = BlockARMUGT 17681 b.SetControl(cc) 17682 _ = yes 17683 _ = no 17684 return true 17685 } 17686 // match: (If (GreaterEqual cc) yes no) 17687 // cond: 17688 // result: (GE cc yes no) 17689 for { 17690 v := b.Control 17691 if v.Op != OpARMGreaterEqual { 17692 break 17693 } 17694 cc := v.Args[0] 17695 yes := b.Succs[0] 17696 no := b.Succs[1] 17697 b.Kind = BlockARMGE 17698 b.SetControl(cc) 17699 _ = yes 17700 _ = no 17701 return true 17702 } 17703 // match: (If (GreaterEqualU cc) yes no) 17704 // cond: 17705 // result: (UGE cc yes no) 17706 for { 17707 v := b.Control 17708 if v.Op != OpARMGreaterEqualU { 17709 break 17710 } 17711 cc := v.Args[0] 17712 yes := b.Succs[0] 17713 no := b.Succs[1] 17714 b.Kind = BlockARMUGE 17715 b.SetControl(cc) 17716 _ = yes 17717 _ = no 17718 return true 17719 } 17720 // match: (If cond yes no) 17721 // cond: 17722 // result: (NE (CMPconst [0] cond) yes no) 17723 for { 17724 v := b.Control 17725 _ = v 17726 cond := b.Control 17727 yes := b.Succs[0] 17728 no := b.Succs[1] 17729 b.Kind = BlockARMNE 17730 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 17731 v0.AuxInt = 0 17732 v0.AddArg(cond) 17733 b.SetControl(v0) 17734 _ = yes 17735 _ = no 17736 return true 17737 } 17738 case BlockARMLE: 17739 // match: (LE (FlagEQ) yes no) 17740 // cond: 17741 // result: (First nil yes no) 17742 for { 17743 v := b.Control 17744 if v.Op != OpARMFlagEQ { 17745 break 17746 } 17747 yes := b.Succs[0] 17748 no := b.Succs[1] 17749 b.Kind = BlockFirst 17750 b.SetControl(nil) 17751 _ = yes 17752 _ = no 17753 return true 17754 } 17755 // match: (LE (FlagLT_ULT) yes no) 17756 // cond: 17757 // result: (First nil yes no) 17758 for { 17759 v := b.Control 17760 if v.Op != OpARMFlagLT_ULT { 17761 break 17762 } 17763 yes := b.Succs[0] 17764 no := b.Succs[1] 17765 b.Kind = BlockFirst 17766 b.SetControl(nil) 17767 _ = yes 17768 _ = no 17769 return true 17770 } 17771 // match: (LE (FlagLT_UGT) yes no) 17772 // cond: 17773 // result: (First nil yes no) 17774 for { 17775 v := b.Control 17776 if v.Op != OpARMFlagLT_UGT { 17777 break 17778 } 17779 yes := b.Succs[0] 17780 no := b.Succs[1] 17781 b.Kind = BlockFirst 17782 b.SetControl(nil) 17783 _ = yes 17784 _ = no 17785 return true 17786 } 17787 // match: (LE (FlagGT_ULT) yes no) 17788 // cond: 17789 // result: (First nil no yes) 17790 for { 17791 v := b.Control 17792 if v.Op != OpARMFlagGT_ULT { 17793 break 17794 } 17795 yes := b.Succs[0] 17796 no := b.Succs[1] 17797 b.Kind = BlockFirst 17798 b.SetControl(nil) 17799 b.swapSuccessors() 17800 _ = no 17801 _ = yes 17802 return true 17803 } 17804 // match: (LE (FlagGT_UGT) yes no) 17805 // cond: 17806 // result: (First nil no yes) 17807 for { 17808 v := b.Control 17809 if v.Op != OpARMFlagGT_UGT { 17810 break 17811 } 17812 yes := b.Succs[0] 17813 no := b.Succs[1] 17814 b.Kind = BlockFirst 17815 b.SetControl(nil) 17816 b.swapSuccessors() 17817 _ = no 17818 _ = yes 17819 return true 17820 } 17821 // match: (LE (InvertFlags cmp) yes no) 17822 // cond: 17823 // result: (GE cmp yes no) 17824 for { 17825 v := b.Control 17826 if v.Op != OpARMInvertFlags { 17827 break 17828 } 17829 cmp := v.Args[0] 17830 yes := b.Succs[0] 17831 no := b.Succs[1] 17832 b.Kind = BlockARMGE 17833 b.SetControl(cmp) 17834 _ = yes 17835 _ = no 17836 return true 17837 } 17838 case BlockARMLT: 17839 // match: (LT (FlagEQ) yes no) 17840 // cond: 17841 // result: (First nil no yes) 17842 for { 17843 v := b.Control 17844 if v.Op != OpARMFlagEQ { 17845 break 17846 } 17847 yes := b.Succs[0] 17848 no := b.Succs[1] 17849 b.Kind = BlockFirst 17850 b.SetControl(nil) 17851 b.swapSuccessors() 17852 _ = no 17853 _ = yes 17854 return true 17855 } 17856 // match: (LT (FlagLT_ULT) yes no) 17857 // cond: 17858 // result: (First nil yes no) 17859 for { 17860 v := b.Control 17861 if v.Op != OpARMFlagLT_ULT { 17862 break 17863 } 17864 yes := b.Succs[0] 17865 no := b.Succs[1] 17866 b.Kind = BlockFirst 17867 b.SetControl(nil) 17868 _ = yes 17869 _ = no 17870 return true 17871 } 17872 // match: (LT (FlagLT_UGT) yes no) 17873 // cond: 17874 // result: (First nil yes no) 17875 for { 17876 v := b.Control 17877 if v.Op != OpARMFlagLT_UGT { 17878 break 17879 } 17880 yes := b.Succs[0] 17881 no := b.Succs[1] 17882 b.Kind = BlockFirst 17883 b.SetControl(nil) 17884 _ = yes 17885 _ = no 17886 return true 17887 } 17888 // match: (LT (FlagGT_ULT) yes no) 17889 // cond: 17890 // result: (First nil no yes) 17891 for { 17892 v := b.Control 17893 if v.Op != OpARMFlagGT_ULT { 17894 break 17895 } 17896 yes := b.Succs[0] 17897 no := b.Succs[1] 17898 b.Kind = BlockFirst 17899 b.SetControl(nil) 17900 b.swapSuccessors() 17901 _ = no 17902 _ = yes 17903 return true 17904 } 17905 // match: (LT (FlagGT_UGT) yes no) 17906 // cond: 17907 // result: (First nil no yes) 17908 for { 17909 v := b.Control 17910 if v.Op != OpARMFlagGT_UGT { 17911 break 17912 } 17913 yes := b.Succs[0] 17914 no := b.Succs[1] 17915 b.Kind = BlockFirst 17916 b.SetControl(nil) 17917 b.swapSuccessors() 17918 _ = no 17919 _ = yes 17920 return true 17921 } 17922 // match: (LT (InvertFlags cmp) yes no) 17923 // cond: 17924 // result: (GT cmp yes no) 17925 for { 17926 v := b.Control 17927 if v.Op != OpARMInvertFlags { 17928 break 17929 } 17930 cmp := v.Args[0] 17931 yes := b.Succs[0] 17932 no := b.Succs[1] 17933 b.Kind = BlockARMGT 17934 b.SetControl(cmp) 17935 _ = yes 17936 _ = no 17937 return true 17938 } 17939 case BlockARMNE: 17940 // match: (NE (CMPconst [0] (Equal cc)) yes no) 17941 // cond: 17942 // result: (EQ cc yes no) 17943 for { 17944 v := b.Control 17945 if v.Op != OpARMCMPconst { 17946 break 17947 } 17948 if v.AuxInt != 0 { 17949 break 17950 } 17951 v_0 := v.Args[0] 17952 if v_0.Op != OpARMEqual { 17953 break 17954 } 17955 cc := v_0.Args[0] 17956 yes := b.Succs[0] 17957 no := b.Succs[1] 17958 b.Kind = BlockARMEQ 17959 b.SetControl(cc) 17960 _ = yes 17961 _ = no 17962 return true 17963 } 17964 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 17965 // cond: 17966 // result: (NE cc yes no) 17967 for { 17968 v := b.Control 17969 if v.Op != OpARMCMPconst { 17970 break 17971 } 17972 if v.AuxInt != 0 { 17973 break 17974 } 17975 v_0 := v.Args[0] 17976 if v_0.Op != OpARMNotEqual { 17977 break 17978 } 17979 cc := v_0.Args[0] 17980 yes := b.Succs[0] 17981 no := b.Succs[1] 17982 b.Kind = BlockARMNE 17983 b.SetControl(cc) 17984 _ = yes 17985 _ = no 17986 return true 17987 } 17988 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 17989 // cond: 17990 // result: (LT cc yes no) 17991 for { 17992 v := b.Control 17993 if v.Op != OpARMCMPconst { 17994 break 17995 } 17996 if v.AuxInt != 0 { 17997 break 17998 } 17999 v_0 := v.Args[0] 18000 if v_0.Op != OpARMLessThan { 18001 break 18002 } 18003 cc := v_0.Args[0] 18004 yes := b.Succs[0] 18005 no := b.Succs[1] 18006 b.Kind = BlockARMLT 18007 b.SetControl(cc) 18008 _ = yes 18009 _ = no 18010 return true 18011 } 18012 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 18013 // cond: 18014 // result: (ULT cc yes no) 18015 for { 18016 v := b.Control 18017 if v.Op != OpARMCMPconst { 18018 break 18019 } 18020 if v.AuxInt != 0 { 18021 break 18022 } 18023 v_0 := v.Args[0] 18024 if v_0.Op != OpARMLessThanU { 18025 break 18026 } 18027 cc := v_0.Args[0] 18028 yes := b.Succs[0] 18029 no := b.Succs[1] 18030 b.Kind = BlockARMULT 18031 b.SetControl(cc) 18032 _ = yes 18033 _ = no 18034 return true 18035 } 18036 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 18037 // cond: 18038 // result: (LE cc yes no) 18039 for { 18040 v := b.Control 18041 if v.Op != OpARMCMPconst { 18042 break 18043 } 18044 if v.AuxInt != 0 { 18045 break 18046 } 18047 v_0 := v.Args[0] 18048 if v_0.Op != OpARMLessEqual { 18049 break 18050 } 18051 cc := v_0.Args[0] 18052 yes := b.Succs[0] 18053 no := b.Succs[1] 18054 b.Kind = BlockARMLE 18055 b.SetControl(cc) 18056 _ = yes 18057 _ = no 18058 return true 18059 } 18060 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 18061 // cond: 18062 // result: (ULE cc yes no) 18063 for { 18064 v := b.Control 18065 if v.Op != OpARMCMPconst { 18066 break 18067 } 18068 if v.AuxInt != 0 { 18069 break 18070 } 18071 v_0 := v.Args[0] 18072 if v_0.Op != OpARMLessEqualU { 18073 break 18074 } 18075 cc := v_0.Args[0] 18076 yes := b.Succs[0] 18077 no := b.Succs[1] 18078 b.Kind = BlockARMULE 18079 b.SetControl(cc) 18080 _ = yes 18081 _ = no 18082 return true 18083 } 18084 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 18085 // cond: 18086 // result: (GT cc yes no) 18087 for { 18088 v := b.Control 18089 if v.Op != OpARMCMPconst { 18090 break 18091 } 18092 if v.AuxInt != 0 { 18093 break 18094 } 18095 v_0 := v.Args[0] 18096 if v_0.Op != OpARMGreaterThan { 18097 break 18098 } 18099 cc := v_0.Args[0] 18100 yes := b.Succs[0] 18101 no := b.Succs[1] 18102 b.Kind = BlockARMGT 18103 b.SetControl(cc) 18104 _ = yes 18105 _ = no 18106 return true 18107 } 18108 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 18109 // cond: 18110 // result: (UGT cc yes no) 18111 for { 18112 v := b.Control 18113 if v.Op != OpARMCMPconst { 18114 break 18115 } 18116 if v.AuxInt != 0 { 18117 break 18118 } 18119 v_0 := v.Args[0] 18120 if v_0.Op != OpARMGreaterThanU { 18121 break 18122 } 18123 cc := v_0.Args[0] 18124 yes := b.Succs[0] 18125 no := b.Succs[1] 18126 b.Kind = BlockARMUGT 18127 b.SetControl(cc) 18128 _ = yes 18129 _ = no 18130 return true 18131 } 18132 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 18133 // cond: 18134 // result: (GE cc yes no) 18135 for { 18136 v := b.Control 18137 if v.Op != OpARMCMPconst { 18138 break 18139 } 18140 if v.AuxInt != 0 { 18141 break 18142 } 18143 v_0 := v.Args[0] 18144 if v_0.Op != OpARMGreaterEqual { 18145 break 18146 } 18147 cc := v_0.Args[0] 18148 yes := b.Succs[0] 18149 no := b.Succs[1] 18150 b.Kind = BlockARMGE 18151 b.SetControl(cc) 18152 _ = yes 18153 _ = no 18154 return true 18155 } 18156 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 18157 // cond: 18158 // result: (UGE cc yes no) 18159 for { 18160 v := b.Control 18161 if v.Op != OpARMCMPconst { 18162 break 18163 } 18164 if v.AuxInt != 0 { 18165 break 18166 } 18167 v_0 := v.Args[0] 18168 if v_0.Op != OpARMGreaterEqualU { 18169 break 18170 } 18171 cc := v_0.Args[0] 18172 yes := b.Succs[0] 18173 no := b.Succs[1] 18174 b.Kind = BlockARMUGE 18175 b.SetControl(cc) 18176 _ = yes 18177 _ = no 18178 return true 18179 } 18180 // match: (NE (FlagEQ) yes no) 18181 // cond: 18182 // result: (First nil no yes) 18183 for { 18184 v := b.Control 18185 if v.Op != OpARMFlagEQ { 18186 break 18187 } 18188 yes := b.Succs[0] 18189 no := b.Succs[1] 18190 b.Kind = BlockFirst 18191 b.SetControl(nil) 18192 b.swapSuccessors() 18193 _ = no 18194 _ = yes 18195 return true 18196 } 18197 // match: (NE (FlagLT_ULT) yes no) 18198 // cond: 18199 // result: (First nil yes no) 18200 for { 18201 v := b.Control 18202 if v.Op != OpARMFlagLT_ULT { 18203 break 18204 } 18205 yes := b.Succs[0] 18206 no := b.Succs[1] 18207 b.Kind = BlockFirst 18208 b.SetControl(nil) 18209 _ = yes 18210 _ = no 18211 return true 18212 } 18213 // match: (NE (FlagLT_UGT) yes no) 18214 // cond: 18215 // result: (First nil yes no) 18216 for { 18217 v := b.Control 18218 if v.Op != OpARMFlagLT_UGT { 18219 break 18220 } 18221 yes := b.Succs[0] 18222 no := b.Succs[1] 18223 b.Kind = BlockFirst 18224 b.SetControl(nil) 18225 _ = yes 18226 _ = no 18227 return true 18228 } 18229 // match: (NE (FlagGT_ULT) yes no) 18230 // cond: 18231 // result: (First nil yes no) 18232 for { 18233 v := b.Control 18234 if v.Op != OpARMFlagGT_ULT { 18235 break 18236 } 18237 yes := b.Succs[0] 18238 no := b.Succs[1] 18239 b.Kind = BlockFirst 18240 b.SetControl(nil) 18241 _ = yes 18242 _ = no 18243 return true 18244 } 18245 // match: (NE (FlagGT_UGT) yes no) 18246 // cond: 18247 // result: (First nil yes no) 18248 for { 18249 v := b.Control 18250 if v.Op != OpARMFlagGT_UGT { 18251 break 18252 } 18253 yes := b.Succs[0] 18254 no := b.Succs[1] 18255 b.Kind = BlockFirst 18256 b.SetControl(nil) 18257 _ = yes 18258 _ = no 18259 return true 18260 } 18261 // match: (NE (InvertFlags cmp) yes no) 18262 // cond: 18263 // result: (NE cmp yes no) 18264 for { 18265 v := b.Control 18266 if v.Op != OpARMInvertFlags { 18267 break 18268 } 18269 cmp := v.Args[0] 18270 yes := b.Succs[0] 18271 no := b.Succs[1] 18272 b.Kind = BlockARMNE 18273 b.SetControl(cmp) 18274 _ = yes 18275 _ = no 18276 return true 18277 } 18278 case BlockARMUGE: 18279 // match: (UGE (FlagEQ) yes no) 18280 // cond: 18281 // result: (First nil yes no) 18282 for { 18283 v := b.Control 18284 if v.Op != OpARMFlagEQ { 18285 break 18286 } 18287 yes := b.Succs[0] 18288 no := b.Succs[1] 18289 b.Kind = BlockFirst 18290 b.SetControl(nil) 18291 _ = yes 18292 _ = no 18293 return true 18294 } 18295 // match: (UGE (FlagLT_ULT) yes no) 18296 // cond: 18297 // result: (First nil no yes) 18298 for { 18299 v := b.Control 18300 if v.Op != OpARMFlagLT_ULT { 18301 break 18302 } 18303 yes := b.Succs[0] 18304 no := b.Succs[1] 18305 b.Kind = BlockFirst 18306 b.SetControl(nil) 18307 b.swapSuccessors() 18308 _ = no 18309 _ = yes 18310 return true 18311 } 18312 // match: (UGE (FlagLT_UGT) yes no) 18313 // cond: 18314 // result: (First nil yes no) 18315 for { 18316 v := b.Control 18317 if v.Op != OpARMFlagLT_UGT { 18318 break 18319 } 18320 yes := b.Succs[0] 18321 no := b.Succs[1] 18322 b.Kind = BlockFirst 18323 b.SetControl(nil) 18324 _ = yes 18325 _ = no 18326 return true 18327 } 18328 // match: (UGE (FlagGT_ULT) yes no) 18329 // cond: 18330 // result: (First nil no yes) 18331 for { 18332 v := b.Control 18333 if v.Op != OpARMFlagGT_ULT { 18334 break 18335 } 18336 yes := b.Succs[0] 18337 no := b.Succs[1] 18338 b.Kind = BlockFirst 18339 b.SetControl(nil) 18340 b.swapSuccessors() 18341 _ = no 18342 _ = yes 18343 return true 18344 } 18345 // match: (UGE (FlagGT_UGT) yes no) 18346 // cond: 18347 // result: (First nil yes no) 18348 for { 18349 v := b.Control 18350 if v.Op != OpARMFlagGT_UGT { 18351 break 18352 } 18353 yes := b.Succs[0] 18354 no := b.Succs[1] 18355 b.Kind = BlockFirst 18356 b.SetControl(nil) 18357 _ = yes 18358 _ = no 18359 return true 18360 } 18361 // match: (UGE (InvertFlags cmp) yes no) 18362 // cond: 18363 // result: (ULE cmp yes no) 18364 for { 18365 v := b.Control 18366 if v.Op != OpARMInvertFlags { 18367 break 18368 } 18369 cmp := v.Args[0] 18370 yes := b.Succs[0] 18371 no := b.Succs[1] 18372 b.Kind = BlockARMULE 18373 b.SetControl(cmp) 18374 _ = yes 18375 _ = no 18376 return true 18377 } 18378 case BlockARMUGT: 18379 // match: (UGT (FlagEQ) yes no) 18380 // cond: 18381 // result: (First nil no yes) 18382 for { 18383 v := b.Control 18384 if v.Op != OpARMFlagEQ { 18385 break 18386 } 18387 yes := b.Succs[0] 18388 no := b.Succs[1] 18389 b.Kind = BlockFirst 18390 b.SetControl(nil) 18391 b.swapSuccessors() 18392 _ = no 18393 _ = yes 18394 return true 18395 } 18396 // match: (UGT (FlagLT_ULT) yes no) 18397 // cond: 18398 // result: (First nil no yes) 18399 for { 18400 v := b.Control 18401 if v.Op != OpARMFlagLT_ULT { 18402 break 18403 } 18404 yes := b.Succs[0] 18405 no := b.Succs[1] 18406 b.Kind = BlockFirst 18407 b.SetControl(nil) 18408 b.swapSuccessors() 18409 _ = no 18410 _ = yes 18411 return true 18412 } 18413 // match: (UGT (FlagLT_UGT) yes no) 18414 // cond: 18415 // result: (First nil yes no) 18416 for { 18417 v := b.Control 18418 if v.Op != OpARMFlagLT_UGT { 18419 break 18420 } 18421 yes := b.Succs[0] 18422 no := b.Succs[1] 18423 b.Kind = BlockFirst 18424 b.SetControl(nil) 18425 _ = yes 18426 _ = no 18427 return true 18428 } 18429 // match: (UGT (FlagGT_ULT) yes no) 18430 // cond: 18431 // result: (First nil no yes) 18432 for { 18433 v := b.Control 18434 if v.Op != OpARMFlagGT_ULT { 18435 break 18436 } 18437 yes := b.Succs[0] 18438 no := b.Succs[1] 18439 b.Kind = BlockFirst 18440 b.SetControl(nil) 18441 b.swapSuccessors() 18442 _ = no 18443 _ = yes 18444 return true 18445 } 18446 // match: (UGT (FlagGT_UGT) yes no) 18447 // cond: 18448 // result: (First nil yes no) 18449 for { 18450 v := b.Control 18451 if v.Op != OpARMFlagGT_UGT { 18452 break 18453 } 18454 yes := b.Succs[0] 18455 no := b.Succs[1] 18456 b.Kind = BlockFirst 18457 b.SetControl(nil) 18458 _ = yes 18459 _ = no 18460 return true 18461 } 18462 // match: (UGT (InvertFlags cmp) yes no) 18463 // cond: 18464 // result: (ULT cmp yes no) 18465 for { 18466 v := b.Control 18467 if v.Op != OpARMInvertFlags { 18468 break 18469 } 18470 cmp := v.Args[0] 18471 yes := b.Succs[0] 18472 no := b.Succs[1] 18473 b.Kind = BlockARMULT 18474 b.SetControl(cmp) 18475 _ = yes 18476 _ = no 18477 return true 18478 } 18479 case BlockARMULE: 18480 // match: (ULE (FlagEQ) yes no) 18481 // cond: 18482 // result: (First nil yes no) 18483 for { 18484 v := b.Control 18485 if v.Op != OpARMFlagEQ { 18486 break 18487 } 18488 yes := b.Succs[0] 18489 no := b.Succs[1] 18490 b.Kind = BlockFirst 18491 b.SetControl(nil) 18492 _ = yes 18493 _ = no 18494 return true 18495 } 18496 // match: (ULE (FlagLT_ULT) yes no) 18497 // cond: 18498 // result: (First nil yes no) 18499 for { 18500 v := b.Control 18501 if v.Op != OpARMFlagLT_ULT { 18502 break 18503 } 18504 yes := b.Succs[0] 18505 no := b.Succs[1] 18506 b.Kind = BlockFirst 18507 b.SetControl(nil) 18508 _ = yes 18509 _ = no 18510 return true 18511 } 18512 // match: (ULE (FlagLT_UGT) yes no) 18513 // cond: 18514 // result: (First nil no yes) 18515 for { 18516 v := b.Control 18517 if v.Op != OpARMFlagLT_UGT { 18518 break 18519 } 18520 yes := b.Succs[0] 18521 no := b.Succs[1] 18522 b.Kind = BlockFirst 18523 b.SetControl(nil) 18524 b.swapSuccessors() 18525 _ = no 18526 _ = yes 18527 return true 18528 } 18529 // match: (ULE (FlagGT_ULT) yes no) 18530 // cond: 18531 // result: (First nil yes no) 18532 for { 18533 v := b.Control 18534 if v.Op != OpARMFlagGT_ULT { 18535 break 18536 } 18537 yes := b.Succs[0] 18538 no := b.Succs[1] 18539 b.Kind = BlockFirst 18540 b.SetControl(nil) 18541 _ = yes 18542 _ = no 18543 return true 18544 } 18545 // match: (ULE (FlagGT_UGT) yes no) 18546 // cond: 18547 // result: (First nil no yes) 18548 for { 18549 v := b.Control 18550 if v.Op != OpARMFlagGT_UGT { 18551 break 18552 } 18553 yes := b.Succs[0] 18554 no := b.Succs[1] 18555 b.Kind = BlockFirst 18556 b.SetControl(nil) 18557 b.swapSuccessors() 18558 _ = no 18559 _ = yes 18560 return true 18561 } 18562 // match: (ULE (InvertFlags cmp) yes no) 18563 // cond: 18564 // result: (UGE cmp yes no) 18565 for { 18566 v := b.Control 18567 if v.Op != OpARMInvertFlags { 18568 break 18569 } 18570 cmp := v.Args[0] 18571 yes := b.Succs[0] 18572 no := b.Succs[1] 18573 b.Kind = BlockARMUGE 18574 b.SetControl(cmp) 18575 _ = yes 18576 _ = no 18577 return true 18578 } 18579 case BlockARMULT: 18580 // match: (ULT (FlagEQ) yes no) 18581 // cond: 18582 // result: (First nil no yes) 18583 for { 18584 v := b.Control 18585 if v.Op != OpARMFlagEQ { 18586 break 18587 } 18588 yes := b.Succs[0] 18589 no := b.Succs[1] 18590 b.Kind = BlockFirst 18591 b.SetControl(nil) 18592 b.swapSuccessors() 18593 _ = no 18594 _ = yes 18595 return true 18596 } 18597 // match: (ULT (FlagLT_ULT) yes no) 18598 // cond: 18599 // result: (First nil yes no) 18600 for { 18601 v := b.Control 18602 if v.Op != OpARMFlagLT_ULT { 18603 break 18604 } 18605 yes := b.Succs[0] 18606 no := b.Succs[1] 18607 b.Kind = BlockFirst 18608 b.SetControl(nil) 18609 _ = yes 18610 _ = no 18611 return true 18612 } 18613 // match: (ULT (FlagLT_UGT) yes no) 18614 // cond: 18615 // result: (First nil no yes) 18616 for { 18617 v := b.Control 18618 if v.Op != OpARMFlagLT_UGT { 18619 break 18620 } 18621 yes := b.Succs[0] 18622 no := b.Succs[1] 18623 b.Kind = BlockFirst 18624 b.SetControl(nil) 18625 b.swapSuccessors() 18626 _ = no 18627 _ = yes 18628 return true 18629 } 18630 // match: (ULT (FlagGT_ULT) yes no) 18631 // cond: 18632 // result: (First nil yes no) 18633 for { 18634 v := b.Control 18635 if v.Op != OpARMFlagGT_ULT { 18636 break 18637 } 18638 yes := b.Succs[0] 18639 no := b.Succs[1] 18640 b.Kind = BlockFirst 18641 b.SetControl(nil) 18642 _ = yes 18643 _ = no 18644 return true 18645 } 18646 // match: (ULT (FlagGT_UGT) yes no) 18647 // cond: 18648 // result: (First nil no yes) 18649 for { 18650 v := b.Control 18651 if v.Op != OpARMFlagGT_UGT { 18652 break 18653 } 18654 yes := b.Succs[0] 18655 no := b.Succs[1] 18656 b.Kind = BlockFirst 18657 b.SetControl(nil) 18658 b.swapSuccessors() 18659 _ = no 18660 _ = yes 18661 return true 18662 } 18663 // match: (ULT (InvertFlags cmp) yes no) 18664 // cond: 18665 // result: (UGT cmp yes no) 18666 for { 18667 v := b.Control 18668 if v.Op != OpARMInvertFlags { 18669 break 18670 } 18671 cmp := v.Args[0] 18672 yes := b.Succs[0] 18673 no := b.Succs[1] 18674 b.Kind = BlockARMUGT 18675 b.SetControl(cmp) 18676 _ = yes 18677 _ = no 18678 return true 18679 } 18680 } 18681 return false 18682 }