github.com/FenixAra/go@v0.0.0-20170127160404-96ea0918e670/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 OpLrot16: 534 return rewriteValueARM_OpLrot16(v, config) 535 case OpLrot32: 536 return rewriteValueARM_OpLrot32(v, config) 537 case OpLrot8: 538 return rewriteValueARM_OpLrot8(v, config) 539 case OpLsh16x16: 540 return rewriteValueARM_OpLsh16x16(v, config) 541 case OpLsh16x32: 542 return rewriteValueARM_OpLsh16x32(v, config) 543 case OpLsh16x64: 544 return rewriteValueARM_OpLsh16x64(v, config) 545 case OpLsh16x8: 546 return rewriteValueARM_OpLsh16x8(v, config) 547 case OpLsh32x16: 548 return rewriteValueARM_OpLsh32x16(v, config) 549 case OpLsh32x32: 550 return rewriteValueARM_OpLsh32x32(v, config) 551 case OpLsh32x64: 552 return rewriteValueARM_OpLsh32x64(v, config) 553 case OpLsh32x8: 554 return rewriteValueARM_OpLsh32x8(v, config) 555 case OpLsh8x16: 556 return rewriteValueARM_OpLsh8x16(v, config) 557 case OpLsh8x32: 558 return rewriteValueARM_OpLsh8x32(v, config) 559 case OpLsh8x64: 560 return rewriteValueARM_OpLsh8x64(v, config) 561 case OpLsh8x8: 562 return rewriteValueARM_OpLsh8x8(v, config) 563 case OpMod16: 564 return rewriteValueARM_OpMod16(v, config) 565 case OpMod16u: 566 return rewriteValueARM_OpMod16u(v, config) 567 case OpMod32: 568 return rewriteValueARM_OpMod32(v, config) 569 case OpMod32u: 570 return rewriteValueARM_OpMod32u(v, config) 571 case OpMod8: 572 return rewriteValueARM_OpMod8(v, config) 573 case OpMod8u: 574 return rewriteValueARM_OpMod8u(v, config) 575 case OpMove: 576 return rewriteValueARM_OpMove(v, config) 577 case OpMul16: 578 return rewriteValueARM_OpMul16(v, config) 579 case OpMul32: 580 return rewriteValueARM_OpMul32(v, config) 581 case OpMul32F: 582 return rewriteValueARM_OpMul32F(v, config) 583 case OpMul32uhilo: 584 return rewriteValueARM_OpMul32uhilo(v, config) 585 case OpMul64F: 586 return rewriteValueARM_OpMul64F(v, config) 587 case OpMul8: 588 return rewriteValueARM_OpMul8(v, config) 589 case OpNeg16: 590 return rewriteValueARM_OpNeg16(v, config) 591 case OpNeg32: 592 return rewriteValueARM_OpNeg32(v, config) 593 case OpNeg32F: 594 return rewriteValueARM_OpNeg32F(v, config) 595 case OpNeg64F: 596 return rewriteValueARM_OpNeg64F(v, config) 597 case OpNeg8: 598 return rewriteValueARM_OpNeg8(v, config) 599 case OpNeq16: 600 return rewriteValueARM_OpNeq16(v, config) 601 case OpNeq32: 602 return rewriteValueARM_OpNeq32(v, config) 603 case OpNeq32F: 604 return rewriteValueARM_OpNeq32F(v, config) 605 case OpNeq64F: 606 return rewriteValueARM_OpNeq64F(v, config) 607 case OpNeq8: 608 return rewriteValueARM_OpNeq8(v, config) 609 case OpNeqB: 610 return rewriteValueARM_OpNeqB(v, config) 611 case OpNeqPtr: 612 return rewriteValueARM_OpNeqPtr(v, config) 613 case OpNilCheck: 614 return rewriteValueARM_OpNilCheck(v, config) 615 case OpNot: 616 return rewriteValueARM_OpNot(v, config) 617 case OpOffPtr: 618 return rewriteValueARM_OpOffPtr(v, config) 619 case OpOr16: 620 return rewriteValueARM_OpOr16(v, config) 621 case OpOr32: 622 return rewriteValueARM_OpOr32(v, config) 623 case OpOr8: 624 return rewriteValueARM_OpOr8(v, config) 625 case OpOrB: 626 return rewriteValueARM_OpOrB(v, config) 627 case OpRsh16Ux16: 628 return rewriteValueARM_OpRsh16Ux16(v, config) 629 case OpRsh16Ux32: 630 return rewriteValueARM_OpRsh16Ux32(v, config) 631 case OpRsh16Ux64: 632 return rewriteValueARM_OpRsh16Ux64(v, config) 633 case OpRsh16Ux8: 634 return rewriteValueARM_OpRsh16Ux8(v, config) 635 case OpRsh16x16: 636 return rewriteValueARM_OpRsh16x16(v, config) 637 case OpRsh16x32: 638 return rewriteValueARM_OpRsh16x32(v, config) 639 case OpRsh16x64: 640 return rewriteValueARM_OpRsh16x64(v, config) 641 case OpRsh16x8: 642 return rewriteValueARM_OpRsh16x8(v, config) 643 case OpRsh32Ux16: 644 return rewriteValueARM_OpRsh32Ux16(v, config) 645 case OpRsh32Ux32: 646 return rewriteValueARM_OpRsh32Ux32(v, config) 647 case OpRsh32Ux64: 648 return rewriteValueARM_OpRsh32Ux64(v, config) 649 case OpRsh32Ux8: 650 return rewriteValueARM_OpRsh32Ux8(v, config) 651 case OpRsh32x16: 652 return rewriteValueARM_OpRsh32x16(v, config) 653 case OpRsh32x32: 654 return rewriteValueARM_OpRsh32x32(v, config) 655 case OpRsh32x64: 656 return rewriteValueARM_OpRsh32x64(v, config) 657 case OpRsh32x8: 658 return rewriteValueARM_OpRsh32x8(v, config) 659 case OpRsh8Ux16: 660 return rewriteValueARM_OpRsh8Ux16(v, config) 661 case OpRsh8Ux32: 662 return rewriteValueARM_OpRsh8Ux32(v, config) 663 case OpRsh8Ux64: 664 return rewriteValueARM_OpRsh8Ux64(v, config) 665 case OpRsh8Ux8: 666 return rewriteValueARM_OpRsh8Ux8(v, config) 667 case OpRsh8x16: 668 return rewriteValueARM_OpRsh8x16(v, config) 669 case OpRsh8x32: 670 return rewriteValueARM_OpRsh8x32(v, config) 671 case OpRsh8x64: 672 return rewriteValueARM_OpRsh8x64(v, config) 673 case OpRsh8x8: 674 return rewriteValueARM_OpRsh8x8(v, config) 675 case OpSelect0: 676 return rewriteValueARM_OpSelect0(v, config) 677 case OpSelect1: 678 return rewriteValueARM_OpSelect1(v, config) 679 case OpSignExt16to32: 680 return rewriteValueARM_OpSignExt16to32(v, config) 681 case OpSignExt8to16: 682 return rewriteValueARM_OpSignExt8to16(v, config) 683 case OpSignExt8to32: 684 return rewriteValueARM_OpSignExt8to32(v, config) 685 case OpSignmask: 686 return rewriteValueARM_OpSignmask(v, config) 687 case OpSlicemask: 688 return rewriteValueARM_OpSlicemask(v, config) 689 case OpSqrt: 690 return rewriteValueARM_OpSqrt(v, config) 691 case OpStaticCall: 692 return rewriteValueARM_OpStaticCall(v, config) 693 case OpStore: 694 return rewriteValueARM_OpStore(v, config) 695 case OpSub16: 696 return rewriteValueARM_OpSub16(v, config) 697 case OpSub32: 698 return rewriteValueARM_OpSub32(v, config) 699 case OpSub32F: 700 return rewriteValueARM_OpSub32F(v, config) 701 case OpSub32carry: 702 return rewriteValueARM_OpSub32carry(v, config) 703 case OpSub32withcarry: 704 return rewriteValueARM_OpSub32withcarry(v, config) 705 case OpSub64F: 706 return rewriteValueARM_OpSub64F(v, config) 707 case OpSub8: 708 return rewriteValueARM_OpSub8(v, config) 709 case OpSubPtr: 710 return rewriteValueARM_OpSubPtr(v, config) 711 case OpTrunc16to8: 712 return rewriteValueARM_OpTrunc16to8(v, config) 713 case OpTrunc32to16: 714 return rewriteValueARM_OpTrunc32to16(v, config) 715 case OpTrunc32to8: 716 return rewriteValueARM_OpTrunc32to8(v, config) 717 case OpXor16: 718 return rewriteValueARM_OpXor16(v, config) 719 case OpXor32: 720 return rewriteValueARM_OpXor32(v, config) 721 case OpXor8: 722 return rewriteValueARM_OpXor8(v, config) 723 case OpZero: 724 return rewriteValueARM_OpZero(v, config) 725 case OpZeroExt16to32: 726 return rewriteValueARM_OpZeroExt16to32(v, config) 727 case OpZeroExt8to16: 728 return rewriteValueARM_OpZeroExt8to16(v, config) 729 case OpZeroExt8to32: 730 return rewriteValueARM_OpZeroExt8to32(v, config) 731 case OpZeromask: 732 return rewriteValueARM_OpZeromask(v, config) 733 } 734 return false 735 } 736 func rewriteValueARM_OpARMADC(v *Value, config *Config) bool { 737 b := v.Block 738 _ = b 739 // match: (ADC (MOVWconst [c]) x flags) 740 // cond: 741 // result: (ADCconst [c] x flags) 742 for { 743 v_0 := v.Args[0] 744 if v_0.Op != OpARMMOVWconst { 745 break 746 } 747 c := v_0.AuxInt 748 x := v.Args[1] 749 flags := v.Args[2] 750 v.reset(OpARMADCconst) 751 v.AuxInt = c 752 v.AddArg(x) 753 v.AddArg(flags) 754 return true 755 } 756 // match: (ADC x (MOVWconst [c]) flags) 757 // cond: 758 // result: (ADCconst [c] x flags) 759 for { 760 x := v.Args[0] 761 v_1 := v.Args[1] 762 if v_1.Op != OpARMMOVWconst { 763 break 764 } 765 c := v_1.AuxInt 766 flags := v.Args[2] 767 v.reset(OpARMADCconst) 768 v.AuxInt = c 769 v.AddArg(x) 770 v.AddArg(flags) 771 return true 772 } 773 // match: (ADC x (SLLconst [c] y) flags) 774 // cond: 775 // result: (ADCshiftLL x y [c] flags) 776 for { 777 x := v.Args[0] 778 v_1 := v.Args[1] 779 if v_1.Op != OpARMSLLconst { 780 break 781 } 782 c := v_1.AuxInt 783 y := v_1.Args[0] 784 flags := v.Args[2] 785 v.reset(OpARMADCshiftLL) 786 v.AuxInt = c 787 v.AddArg(x) 788 v.AddArg(y) 789 v.AddArg(flags) 790 return true 791 } 792 // match: (ADC (SLLconst [c] y) x flags) 793 // cond: 794 // result: (ADCshiftLL x y [c] flags) 795 for { 796 v_0 := v.Args[0] 797 if v_0.Op != OpARMSLLconst { 798 break 799 } 800 c := v_0.AuxInt 801 y := v_0.Args[0] 802 x := v.Args[1] 803 flags := v.Args[2] 804 v.reset(OpARMADCshiftLL) 805 v.AuxInt = c 806 v.AddArg(x) 807 v.AddArg(y) 808 v.AddArg(flags) 809 return true 810 } 811 // match: (ADC x (SRLconst [c] y) flags) 812 // cond: 813 // result: (ADCshiftRL x y [c] flags) 814 for { 815 x := v.Args[0] 816 v_1 := v.Args[1] 817 if v_1.Op != OpARMSRLconst { 818 break 819 } 820 c := v_1.AuxInt 821 y := v_1.Args[0] 822 flags := v.Args[2] 823 v.reset(OpARMADCshiftRL) 824 v.AuxInt = c 825 v.AddArg(x) 826 v.AddArg(y) 827 v.AddArg(flags) 828 return true 829 } 830 // match: (ADC (SRLconst [c] y) x flags) 831 // cond: 832 // result: (ADCshiftRL x y [c] flags) 833 for { 834 v_0 := v.Args[0] 835 if v_0.Op != OpARMSRLconst { 836 break 837 } 838 c := v_0.AuxInt 839 y := v_0.Args[0] 840 x := v.Args[1] 841 flags := v.Args[2] 842 v.reset(OpARMADCshiftRL) 843 v.AuxInt = c 844 v.AddArg(x) 845 v.AddArg(y) 846 v.AddArg(flags) 847 return true 848 } 849 // match: (ADC x (SRAconst [c] y) flags) 850 // cond: 851 // result: (ADCshiftRA x y [c] flags) 852 for { 853 x := v.Args[0] 854 v_1 := v.Args[1] 855 if v_1.Op != OpARMSRAconst { 856 break 857 } 858 c := v_1.AuxInt 859 y := v_1.Args[0] 860 flags := v.Args[2] 861 v.reset(OpARMADCshiftRA) 862 v.AuxInt = c 863 v.AddArg(x) 864 v.AddArg(y) 865 v.AddArg(flags) 866 return true 867 } 868 // match: (ADC (SRAconst [c] y) x flags) 869 // cond: 870 // result: (ADCshiftRA x y [c] flags) 871 for { 872 v_0 := v.Args[0] 873 if v_0.Op != OpARMSRAconst { 874 break 875 } 876 c := v_0.AuxInt 877 y := v_0.Args[0] 878 x := v.Args[1] 879 flags := v.Args[2] 880 v.reset(OpARMADCshiftRA) 881 v.AuxInt = c 882 v.AddArg(x) 883 v.AddArg(y) 884 v.AddArg(flags) 885 return true 886 } 887 // match: (ADC x (SLL y z) flags) 888 // cond: 889 // result: (ADCshiftLLreg x y z flags) 890 for { 891 x := v.Args[0] 892 v_1 := v.Args[1] 893 if v_1.Op != OpARMSLL { 894 break 895 } 896 y := v_1.Args[0] 897 z := v_1.Args[1] 898 flags := v.Args[2] 899 v.reset(OpARMADCshiftLLreg) 900 v.AddArg(x) 901 v.AddArg(y) 902 v.AddArg(z) 903 v.AddArg(flags) 904 return true 905 } 906 // match: (ADC (SLL y z) x flags) 907 // cond: 908 // result: (ADCshiftLLreg x y z flags) 909 for { 910 v_0 := v.Args[0] 911 if v_0.Op != OpARMSLL { 912 break 913 } 914 y := v_0.Args[0] 915 z := v_0.Args[1] 916 x := v.Args[1] 917 flags := v.Args[2] 918 v.reset(OpARMADCshiftLLreg) 919 v.AddArg(x) 920 v.AddArg(y) 921 v.AddArg(z) 922 v.AddArg(flags) 923 return true 924 } 925 // match: (ADC x (SRL y z) flags) 926 // cond: 927 // result: (ADCshiftRLreg x y z flags) 928 for { 929 x := v.Args[0] 930 v_1 := v.Args[1] 931 if v_1.Op != OpARMSRL { 932 break 933 } 934 y := v_1.Args[0] 935 z := v_1.Args[1] 936 flags := v.Args[2] 937 v.reset(OpARMADCshiftRLreg) 938 v.AddArg(x) 939 v.AddArg(y) 940 v.AddArg(z) 941 v.AddArg(flags) 942 return true 943 } 944 // match: (ADC (SRL y z) x flags) 945 // cond: 946 // result: (ADCshiftRLreg x y z flags) 947 for { 948 v_0 := v.Args[0] 949 if v_0.Op != OpARMSRL { 950 break 951 } 952 y := v_0.Args[0] 953 z := v_0.Args[1] 954 x := v.Args[1] 955 flags := v.Args[2] 956 v.reset(OpARMADCshiftRLreg) 957 v.AddArg(x) 958 v.AddArg(y) 959 v.AddArg(z) 960 v.AddArg(flags) 961 return true 962 } 963 // match: (ADC x (SRA y z) flags) 964 // cond: 965 // result: (ADCshiftRAreg x y z flags) 966 for { 967 x := v.Args[0] 968 v_1 := v.Args[1] 969 if v_1.Op != OpARMSRA { 970 break 971 } 972 y := v_1.Args[0] 973 z := v_1.Args[1] 974 flags := v.Args[2] 975 v.reset(OpARMADCshiftRAreg) 976 v.AddArg(x) 977 v.AddArg(y) 978 v.AddArg(z) 979 v.AddArg(flags) 980 return true 981 } 982 // match: (ADC (SRA y z) x flags) 983 // cond: 984 // result: (ADCshiftRAreg x y z flags) 985 for { 986 v_0 := v.Args[0] 987 if v_0.Op != OpARMSRA { 988 break 989 } 990 y := v_0.Args[0] 991 z := v_0.Args[1] 992 x := v.Args[1] 993 flags := v.Args[2] 994 v.reset(OpARMADCshiftRAreg) 995 v.AddArg(x) 996 v.AddArg(y) 997 v.AddArg(z) 998 v.AddArg(flags) 999 return true 1000 } 1001 return false 1002 } 1003 func rewriteValueARM_OpARMADCconst(v *Value, config *Config) bool { 1004 b := v.Block 1005 _ = b 1006 // match: (ADCconst [c] (ADDconst [d] x) flags) 1007 // cond: 1008 // result: (ADCconst [int64(int32(c+d))] x flags) 1009 for { 1010 c := v.AuxInt 1011 v_0 := v.Args[0] 1012 if v_0.Op != OpARMADDconst { 1013 break 1014 } 1015 d := v_0.AuxInt 1016 x := v_0.Args[0] 1017 flags := v.Args[1] 1018 v.reset(OpARMADCconst) 1019 v.AuxInt = int64(int32(c + d)) 1020 v.AddArg(x) 1021 v.AddArg(flags) 1022 return true 1023 } 1024 // match: (ADCconst [c] (SUBconst [d] x) flags) 1025 // cond: 1026 // result: (ADCconst [int64(int32(c-d))] x flags) 1027 for { 1028 c := v.AuxInt 1029 v_0 := v.Args[0] 1030 if v_0.Op != OpARMSUBconst { 1031 break 1032 } 1033 d := v_0.AuxInt 1034 x := v_0.Args[0] 1035 flags := v.Args[1] 1036 v.reset(OpARMADCconst) 1037 v.AuxInt = int64(int32(c - d)) 1038 v.AddArg(x) 1039 v.AddArg(flags) 1040 return true 1041 } 1042 return false 1043 } 1044 func rewriteValueARM_OpARMADCshiftLL(v *Value, config *Config) bool { 1045 b := v.Block 1046 _ = b 1047 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1048 // cond: 1049 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1050 for { 1051 d := v.AuxInt 1052 v_0 := v.Args[0] 1053 if v_0.Op != OpARMMOVWconst { 1054 break 1055 } 1056 c := v_0.AuxInt 1057 x := v.Args[1] 1058 flags := v.Args[2] 1059 v.reset(OpARMADCconst) 1060 v.AuxInt = c 1061 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 1062 v0.AuxInt = d 1063 v0.AddArg(x) 1064 v.AddArg(v0) 1065 v.AddArg(flags) 1066 return true 1067 } 1068 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1069 // cond: 1070 // result: (ADCconst x [int64(uint32(c)<<uint64(d))] flags) 1071 for { 1072 d := v.AuxInt 1073 x := v.Args[0] 1074 v_1 := v.Args[1] 1075 if v_1.Op != OpARMMOVWconst { 1076 break 1077 } 1078 c := v_1.AuxInt 1079 flags := v.Args[2] 1080 v.reset(OpARMADCconst) 1081 v.AuxInt = int64(uint32(c) << uint64(d)) 1082 v.AddArg(x) 1083 v.AddArg(flags) 1084 return true 1085 } 1086 return false 1087 } 1088 func rewriteValueARM_OpARMADCshiftLLreg(v *Value, config *Config) bool { 1089 b := v.Block 1090 _ = b 1091 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1092 // cond: 1093 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1094 for { 1095 v_0 := v.Args[0] 1096 if v_0.Op != OpARMMOVWconst { 1097 break 1098 } 1099 c := v_0.AuxInt 1100 x := v.Args[1] 1101 y := v.Args[2] 1102 flags := v.Args[3] 1103 v.reset(OpARMADCconst) 1104 v.AuxInt = c 1105 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 1106 v0.AddArg(x) 1107 v0.AddArg(y) 1108 v.AddArg(v0) 1109 v.AddArg(flags) 1110 return true 1111 } 1112 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1113 // cond: 1114 // result: (ADCshiftLL x y [c] flags) 1115 for { 1116 x := v.Args[0] 1117 y := v.Args[1] 1118 v_2 := v.Args[2] 1119 if v_2.Op != OpARMMOVWconst { 1120 break 1121 } 1122 c := v_2.AuxInt 1123 flags := v.Args[3] 1124 v.reset(OpARMADCshiftLL) 1125 v.AuxInt = c 1126 v.AddArg(x) 1127 v.AddArg(y) 1128 v.AddArg(flags) 1129 return true 1130 } 1131 return false 1132 } 1133 func rewriteValueARM_OpARMADCshiftRA(v *Value, config *Config) bool { 1134 b := v.Block 1135 _ = b 1136 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1137 // cond: 1138 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1139 for { 1140 d := v.AuxInt 1141 v_0 := v.Args[0] 1142 if v_0.Op != OpARMMOVWconst { 1143 break 1144 } 1145 c := v_0.AuxInt 1146 x := v.Args[1] 1147 flags := v.Args[2] 1148 v.reset(OpARMADCconst) 1149 v.AuxInt = c 1150 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 1151 v0.AuxInt = d 1152 v0.AddArg(x) 1153 v.AddArg(v0) 1154 v.AddArg(flags) 1155 return true 1156 } 1157 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1158 // cond: 1159 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1160 for { 1161 d := v.AuxInt 1162 x := v.Args[0] 1163 v_1 := v.Args[1] 1164 if v_1.Op != OpARMMOVWconst { 1165 break 1166 } 1167 c := v_1.AuxInt 1168 flags := v.Args[2] 1169 v.reset(OpARMADCconst) 1170 v.AuxInt = int64(int32(c) >> uint64(d)) 1171 v.AddArg(x) 1172 v.AddArg(flags) 1173 return true 1174 } 1175 return false 1176 } 1177 func rewriteValueARM_OpARMADCshiftRAreg(v *Value, config *Config) bool { 1178 b := v.Block 1179 _ = b 1180 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1181 // cond: 1182 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1183 for { 1184 v_0 := v.Args[0] 1185 if v_0.Op != OpARMMOVWconst { 1186 break 1187 } 1188 c := v_0.AuxInt 1189 x := v.Args[1] 1190 y := v.Args[2] 1191 flags := v.Args[3] 1192 v.reset(OpARMADCconst) 1193 v.AuxInt = c 1194 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 1195 v0.AddArg(x) 1196 v0.AddArg(y) 1197 v.AddArg(v0) 1198 v.AddArg(flags) 1199 return true 1200 } 1201 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1202 // cond: 1203 // result: (ADCshiftRA x y [c] flags) 1204 for { 1205 x := v.Args[0] 1206 y := v.Args[1] 1207 v_2 := v.Args[2] 1208 if v_2.Op != OpARMMOVWconst { 1209 break 1210 } 1211 c := v_2.AuxInt 1212 flags := v.Args[3] 1213 v.reset(OpARMADCshiftRA) 1214 v.AuxInt = c 1215 v.AddArg(x) 1216 v.AddArg(y) 1217 v.AddArg(flags) 1218 return true 1219 } 1220 return false 1221 } 1222 func rewriteValueARM_OpARMADCshiftRL(v *Value, config *Config) bool { 1223 b := v.Block 1224 _ = b 1225 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1226 // cond: 1227 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1228 for { 1229 d := v.AuxInt 1230 v_0 := v.Args[0] 1231 if v_0.Op != OpARMMOVWconst { 1232 break 1233 } 1234 c := v_0.AuxInt 1235 x := v.Args[1] 1236 flags := v.Args[2] 1237 v.reset(OpARMADCconst) 1238 v.AuxInt = c 1239 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 1240 v0.AuxInt = d 1241 v0.AddArg(x) 1242 v.AddArg(v0) 1243 v.AddArg(flags) 1244 return true 1245 } 1246 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1247 // cond: 1248 // result: (ADCconst x [int64(uint32(c)>>uint64(d))] flags) 1249 for { 1250 d := v.AuxInt 1251 x := v.Args[0] 1252 v_1 := v.Args[1] 1253 if v_1.Op != OpARMMOVWconst { 1254 break 1255 } 1256 c := v_1.AuxInt 1257 flags := v.Args[2] 1258 v.reset(OpARMADCconst) 1259 v.AuxInt = int64(uint32(c) >> uint64(d)) 1260 v.AddArg(x) 1261 v.AddArg(flags) 1262 return true 1263 } 1264 return false 1265 } 1266 func rewriteValueARM_OpARMADCshiftRLreg(v *Value, config *Config) bool { 1267 b := v.Block 1268 _ = b 1269 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1270 // cond: 1271 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1272 for { 1273 v_0 := v.Args[0] 1274 if v_0.Op != OpARMMOVWconst { 1275 break 1276 } 1277 c := v_0.AuxInt 1278 x := v.Args[1] 1279 y := v.Args[2] 1280 flags := v.Args[3] 1281 v.reset(OpARMADCconst) 1282 v.AuxInt = c 1283 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 1284 v0.AddArg(x) 1285 v0.AddArg(y) 1286 v.AddArg(v0) 1287 v.AddArg(flags) 1288 return true 1289 } 1290 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1291 // cond: 1292 // result: (ADCshiftRL x y [c] flags) 1293 for { 1294 x := v.Args[0] 1295 y := v.Args[1] 1296 v_2 := v.Args[2] 1297 if v_2.Op != OpARMMOVWconst { 1298 break 1299 } 1300 c := v_2.AuxInt 1301 flags := v.Args[3] 1302 v.reset(OpARMADCshiftRL) 1303 v.AuxInt = c 1304 v.AddArg(x) 1305 v.AddArg(y) 1306 v.AddArg(flags) 1307 return true 1308 } 1309 return false 1310 } 1311 func rewriteValueARM_OpARMADD(v *Value, config *Config) bool { 1312 b := v.Block 1313 _ = b 1314 // match: (ADD (MOVWconst [c]) x) 1315 // cond: 1316 // result: (ADDconst [c] x) 1317 for { 1318 v_0 := v.Args[0] 1319 if v_0.Op != OpARMMOVWconst { 1320 break 1321 } 1322 c := v_0.AuxInt 1323 x := v.Args[1] 1324 v.reset(OpARMADDconst) 1325 v.AuxInt = c 1326 v.AddArg(x) 1327 return true 1328 } 1329 // match: (ADD x (MOVWconst [c])) 1330 // cond: 1331 // result: (ADDconst [c] x) 1332 for { 1333 x := v.Args[0] 1334 v_1 := v.Args[1] 1335 if v_1.Op != OpARMMOVWconst { 1336 break 1337 } 1338 c := v_1.AuxInt 1339 v.reset(OpARMADDconst) 1340 v.AuxInt = c 1341 v.AddArg(x) 1342 return true 1343 } 1344 // match: (ADD x (SLLconst [c] y)) 1345 // cond: 1346 // result: (ADDshiftLL x y [c]) 1347 for { 1348 x := v.Args[0] 1349 v_1 := v.Args[1] 1350 if v_1.Op != OpARMSLLconst { 1351 break 1352 } 1353 c := v_1.AuxInt 1354 y := v_1.Args[0] 1355 v.reset(OpARMADDshiftLL) 1356 v.AuxInt = c 1357 v.AddArg(x) 1358 v.AddArg(y) 1359 return true 1360 } 1361 // match: (ADD (SLLconst [c] y) x) 1362 // cond: 1363 // result: (ADDshiftLL x y [c]) 1364 for { 1365 v_0 := v.Args[0] 1366 if v_0.Op != OpARMSLLconst { 1367 break 1368 } 1369 c := v_0.AuxInt 1370 y := v_0.Args[0] 1371 x := v.Args[1] 1372 v.reset(OpARMADDshiftLL) 1373 v.AuxInt = c 1374 v.AddArg(x) 1375 v.AddArg(y) 1376 return true 1377 } 1378 // match: (ADD x (SRLconst [c] y)) 1379 // cond: 1380 // result: (ADDshiftRL x y [c]) 1381 for { 1382 x := v.Args[0] 1383 v_1 := v.Args[1] 1384 if v_1.Op != OpARMSRLconst { 1385 break 1386 } 1387 c := v_1.AuxInt 1388 y := v_1.Args[0] 1389 v.reset(OpARMADDshiftRL) 1390 v.AuxInt = c 1391 v.AddArg(x) 1392 v.AddArg(y) 1393 return true 1394 } 1395 // match: (ADD (SRLconst [c] y) x) 1396 // cond: 1397 // result: (ADDshiftRL x y [c]) 1398 for { 1399 v_0 := v.Args[0] 1400 if v_0.Op != OpARMSRLconst { 1401 break 1402 } 1403 c := v_0.AuxInt 1404 y := v_0.Args[0] 1405 x := v.Args[1] 1406 v.reset(OpARMADDshiftRL) 1407 v.AuxInt = c 1408 v.AddArg(x) 1409 v.AddArg(y) 1410 return true 1411 } 1412 // match: (ADD x (SRAconst [c] y)) 1413 // cond: 1414 // result: (ADDshiftRA x y [c]) 1415 for { 1416 x := v.Args[0] 1417 v_1 := v.Args[1] 1418 if v_1.Op != OpARMSRAconst { 1419 break 1420 } 1421 c := v_1.AuxInt 1422 y := v_1.Args[0] 1423 v.reset(OpARMADDshiftRA) 1424 v.AuxInt = c 1425 v.AddArg(x) 1426 v.AddArg(y) 1427 return true 1428 } 1429 // match: (ADD (SRAconst [c] y) x) 1430 // cond: 1431 // result: (ADDshiftRA x y [c]) 1432 for { 1433 v_0 := v.Args[0] 1434 if v_0.Op != OpARMSRAconst { 1435 break 1436 } 1437 c := v_0.AuxInt 1438 y := v_0.Args[0] 1439 x := v.Args[1] 1440 v.reset(OpARMADDshiftRA) 1441 v.AuxInt = c 1442 v.AddArg(x) 1443 v.AddArg(y) 1444 return true 1445 } 1446 // match: (ADD x (SLL y z)) 1447 // cond: 1448 // result: (ADDshiftLLreg x y z) 1449 for { 1450 x := v.Args[0] 1451 v_1 := v.Args[1] 1452 if v_1.Op != OpARMSLL { 1453 break 1454 } 1455 y := v_1.Args[0] 1456 z := v_1.Args[1] 1457 v.reset(OpARMADDshiftLLreg) 1458 v.AddArg(x) 1459 v.AddArg(y) 1460 v.AddArg(z) 1461 return true 1462 } 1463 // match: (ADD (SLL y z) x) 1464 // cond: 1465 // result: (ADDshiftLLreg x y z) 1466 for { 1467 v_0 := v.Args[0] 1468 if v_0.Op != OpARMSLL { 1469 break 1470 } 1471 y := v_0.Args[0] 1472 z := v_0.Args[1] 1473 x := v.Args[1] 1474 v.reset(OpARMADDshiftLLreg) 1475 v.AddArg(x) 1476 v.AddArg(y) 1477 v.AddArg(z) 1478 return true 1479 } 1480 // match: (ADD x (SRL y z)) 1481 // cond: 1482 // result: (ADDshiftRLreg x y z) 1483 for { 1484 x := v.Args[0] 1485 v_1 := v.Args[1] 1486 if v_1.Op != OpARMSRL { 1487 break 1488 } 1489 y := v_1.Args[0] 1490 z := v_1.Args[1] 1491 v.reset(OpARMADDshiftRLreg) 1492 v.AddArg(x) 1493 v.AddArg(y) 1494 v.AddArg(z) 1495 return true 1496 } 1497 // match: (ADD (SRL y z) x) 1498 // cond: 1499 // result: (ADDshiftRLreg x y z) 1500 for { 1501 v_0 := v.Args[0] 1502 if v_0.Op != OpARMSRL { 1503 break 1504 } 1505 y := v_0.Args[0] 1506 z := v_0.Args[1] 1507 x := v.Args[1] 1508 v.reset(OpARMADDshiftRLreg) 1509 v.AddArg(x) 1510 v.AddArg(y) 1511 v.AddArg(z) 1512 return true 1513 } 1514 // match: (ADD x (SRA y z)) 1515 // cond: 1516 // result: (ADDshiftRAreg x y z) 1517 for { 1518 x := v.Args[0] 1519 v_1 := v.Args[1] 1520 if v_1.Op != OpARMSRA { 1521 break 1522 } 1523 y := v_1.Args[0] 1524 z := v_1.Args[1] 1525 v.reset(OpARMADDshiftRAreg) 1526 v.AddArg(x) 1527 v.AddArg(y) 1528 v.AddArg(z) 1529 return true 1530 } 1531 // match: (ADD (SRA y z) x) 1532 // cond: 1533 // result: (ADDshiftRAreg x y z) 1534 for { 1535 v_0 := v.Args[0] 1536 if v_0.Op != OpARMSRA { 1537 break 1538 } 1539 y := v_0.Args[0] 1540 z := v_0.Args[1] 1541 x := v.Args[1] 1542 v.reset(OpARMADDshiftRAreg) 1543 v.AddArg(x) 1544 v.AddArg(y) 1545 v.AddArg(z) 1546 return true 1547 } 1548 // match: (ADD x (RSBconst [0] y)) 1549 // cond: 1550 // result: (SUB x y) 1551 for { 1552 x := v.Args[0] 1553 v_1 := v.Args[1] 1554 if v_1.Op != OpARMRSBconst { 1555 break 1556 } 1557 if v_1.AuxInt != 0 { 1558 break 1559 } 1560 y := v_1.Args[0] 1561 v.reset(OpARMSUB) 1562 v.AddArg(x) 1563 v.AddArg(y) 1564 return true 1565 } 1566 // match: (ADD (RSBconst [0] y) x) 1567 // cond: 1568 // result: (SUB x y) 1569 for { 1570 v_0 := v.Args[0] 1571 if v_0.Op != OpARMRSBconst { 1572 break 1573 } 1574 if v_0.AuxInt != 0 { 1575 break 1576 } 1577 y := v_0.Args[0] 1578 x := v.Args[1] 1579 v.reset(OpARMSUB) 1580 v.AddArg(x) 1581 v.AddArg(y) 1582 return true 1583 } 1584 // match: (ADD (MUL x y) a) 1585 // cond: 1586 // result: (MULA x y a) 1587 for { 1588 v_0 := v.Args[0] 1589 if v_0.Op != OpARMMUL { 1590 break 1591 } 1592 x := v_0.Args[0] 1593 y := v_0.Args[1] 1594 a := v.Args[1] 1595 v.reset(OpARMMULA) 1596 v.AddArg(x) 1597 v.AddArg(y) 1598 v.AddArg(a) 1599 return true 1600 } 1601 // match: (ADD a (MUL x y)) 1602 // cond: 1603 // result: (MULA x y a) 1604 for { 1605 a := v.Args[0] 1606 v_1 := v.Args[1] 1607 if v_1.Op != OpARMMUL { 1608 break 1609 } 1610 x := v_1.Args[0] 1611 y := v_1.Args[1] 1612 v.reset(OpARMMULA) 1613 v.AddArg(x) 1614 v.AddArg(y) 1615 v.AddArg(a) 1616 return true 1617 } 1618 return false 1619 } 1620 func rewriteValueARM_OpARMADDS(v *Value, config *Config) bool { 1621 b := v.Block 1622 _ = b 1623 // match: (ADDS (MOVWconst [c]) x) 1624 // cond: 1625 // result: (ADDSconst [c] x) 1626 for { 1627 v_0 := v.Args[0] 1628 if v_0.Op != OpARMMOVWconst { 1629 break 1630 } 1631 c := v_0.AuxInt 1632 x := v.Args[1] 1633 v.reset(OpARMADDSconst) 1634 v.AuxInt = c 1635 v.AddArg(x) 1636 return true 1637 } 1638 // match: (ADDS x (MOVWconst [c])) 1639 // cond: 1640 // result: (ADDSconst [c] x) 1641 for { 1642 x := v.Args[0] 1643 v_1 := v.Args[1] 1644 if v_1.Op != OpARMMOVWconst { 1645 break 1646 } 1647 c := v_1.AuxInt 1648 v.reset(OpARMADDSconst) 1649 v.AuxInt = c 1650 v.AddArg(x) 1651 return true 1652 } 1653 // match: (ADDS x (SLLconst [c] y)) 1654 // cond: 1655 // result: (ADDSshiftLL x y [c]) 1656 for { 1657 x := v.Args[0] 1658 v_1 := v.Args[1] 1659 if v_1.Op != OpARMSLLconst { 1660 break 1661 } 1662 c := v_1.AuxInt 1663 y := v_1.Args[0] 1664 v.reset(OpARMADDSshiftLL) 1665 v.AuxInt = c 1666 v.AddArg(x) 1667 v.AddArg(y) 1668 return true 1669 } 1670 // match: (ADDS (SLLconst [c] y) x) 1671 // cond: 1672 // result: (ADDSshiftLL x y [c]) 1673 for { 1674 v_0 := v.Args[0] 1675 if v_0.Op != OpARMSLLconst { 1676 break 1677 } 1678 c := v_0.AuxInt 1679 y := v_0.Args[0] 1680 x := v.Args[1] 1681 v.reset(OpARMADDSshiftLL) 1682 v.AuxInt = c 1683 v.AddArg(x) 1684 v.AddArg(y) 1685 return true 1686 } 1687 // match: (ADDS x (SRLconst [c] y)) 1688 // cond: 1689 // result: (ADDSshiftRL x y [c]) 1690 for { 1691 x := v.Args[0] 1692 v_1 := v.Args[1] 1693 if v_1.Op != OpARMSRLconst { 1694 break 1695 } 1696 c := v_1.AuxInt 1697 y := v_1.Args[0] 1698 v.reset(OpARMADDSshiftRL) 1699 v.AuxInt = c 1700 v.AddArg(x) 1701 v.AddArg(y) 1702 return true 1703 } 1704 // match: (ADDS (SRLconst [c] y) x) 1705 // cond: 1706 // result: (ADDSshiftRL x y [c]) 1707 for { 1708 v_0 := v.Args[0] 1709 if v_0.Op != OpARMSRLconst { 1710 break 1711 } 1712 c := v_0.AuxInt 1713 y := v_0.Args[0] 1714 x := v.Args[1] 1715 v.reset(OpARMADDSshiftRL) 1716 v.AuxInt = c 1717 v.AddArg(x) 1718 v.AddArg(y) 1719 return true 1720 } 1721 // match: (ADDS x (SRAconst [c] y)) 1722 // cond: 1723 // result: (ADDSshiftRA x y [c]) 1724 for { 1725 x := v.Args[0] 1726 v_1 := v.Args[1] 1727 if v_1.Op != OpARMSRAconst { 1728 break 1729 } 1730 c := v_1.AuxInt 1731 y := v_1.Args[0] 1732 v.reset(OpARMADDSshiftRA) 1733 v.AuxInt = c 1734 v.AddArg(x) 1735 v.AddArg(y) 1736 return true 1737 } 1738 // match: (ADDS (SRAconst [c] y) x) 1739 // cond: 1740 // result: (ADDSshiftRA x y [c]) 1741 for { 1742 v_0 := v.Args[0] 1743 if v_0.Op != OpARMSRAconst { 1744 break 1745 } 1746 c := v_0.AuxInt 1747 y := v_0.Args[0] 1748 x := v.Args[1] 1749 v.reset(OpARMADDSshiftRA) 1750 v.AuxInt = c 1751 v.AddArg(x) 1752 v.AddArg(y) 1753 return true 1754 } 1755 // match: (ADDS x (SLL y z)) 1756 // cond: 1757 // result: (ADDSshiftLLreg x y z) 1758 for { 1759 x := v.Args[0] 1760 v_1 := v.Args[1] 1761 if v_1.Op != OpARMSLL { 1762 break 1763 } 1764 y := v_1.Args[0] 1765 z := v_1.Args[1] 1766 v.reset(OpARMADDSshiftLLreg) 1767 v.AddArg(x) 1768 v.AddArg(y) 1769 v.AddArg(z) 1770 return true 1771 } 1772 // match: (ADDS (SLL y z) x) 1773 // cond: 1774 // result: (ADDSshiftLLreg x y z) 1775 for { 1776 v_0 := v.Args[0] 1777 if v_0.Op != OpARMSLL { 1778 break 1779 } 1780 y := v_0.Args[0] 1781 z := v_0.Args[1] 1782 x := v.Args[1] 1783 v.reset(OpARMADDSshiftLLreg) 1784 v.AddArg(x) 1785 v.AddArg(y) 1786 v.AddArg(z) 1787 return true 1788 } 1789 // match: (ADDS x (SRL y z)) 1790 // cond: 1791 // result: (ADDSshiftRLreg x y z) 1792 for { 1793 x := v.Args[0] 1794 v_1 := v.Args[1] 1795 if v_1.Op != OpARMSRL { 1796 break 1797 } 1798 y := v_1.Args[0] 1799 z := v_1.Args[1] 1800 v.reset(OpARMADDSshiftRLreg) 1801 v.AddArg(x) 1802 v.AddArg(y) 1803 v.AddArg(z) 1804 return true 1805 } 1806 // match: (ADDS (SRL y z) x) 1807 // cond: 1808 // result: (ADDSshiftRLreg x y z) 1809 for { 1810 v_0 := v.Args[0] 1811 if v_0.Op != OpARMSRL { 1812 break 1813 } 1814 y := v_0.Args[0] 1815 z := v_0.Args[1] 1816 x := v.Args[1] 1817 v.reset(OpARMADDSshiftRLreg) 1818 v.AddArg(x) 1819 v.AddArg(y) 1820 v.AddArg(z) 1821 return true 1822 } 1823 // match: (ADDS x (SRA y z)) 1824 // cond: 1825 // result: (ADDSshiftRAreg x y z) 1826 for { 1827 x := v.Args[0] 1828 v_1 := v.Args[1] 1829 if v_1.Op != OpARMSRA { 1830 break 1831 } 1832 y := v_1.Args[0] 1833 z := v_1.Args[1] 1834 v.reset(OpARMADDSshiftRAreg) 1835 v.AddArg(x) 1836 v.AddArg(y) 1837 v.AddArg(z) 1838 return true 1839 } 1840 // match: (ADDS (SRA y z) x) 1841 // cond: 1842 // result: (ADDSshiftRAreg x y z) 1843 for { 1844 v_0 := v.Args[0] 1845 if v_0.Op != OpARMSRA { 1846 break 1847 } 1848 y := v_0.Args[0] 1849 z := v_0.Args[1] 1850 x := v.Args[1] 1851 v.reset(OpARMADDSshiftRAreg) 1852 v.AddArg(x) 1853 v.AddArg(y) 1854 v.AddArg(z) 1855 return true 1856 } 1857 return false 1858 } 1859 func rewriteValueARM_OpARMADDSshiftLL(v *Value, config *Config) bool { 1860 b := v.Block 1861 _ = b 1862 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 1863 // cond: 1864 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 1865 for { 1866 d := v.AuxInt 1867 v_0 := v.Args[0] 1868 if v_0.Op != OpARMMOVWconst { 1869 break 1870 } 1871 c := v_0.AuxInt 1872 x := v.Args[1] 1873 v.reset(OpARMADDSconst) 1874 v.AuxInt = c 1875 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 1876 v0.AuxInt = d 1877 v0.AddArg(x) 1878 v.AddArg(v0) 1879 return true 1880 } 1881 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 1882 // cond: 1883 // result: (ADDSconst x [int64(uint32(c)<<uint64(d))]) 1884 for { 1885 d := v.AuxInt 1886 x := v.Args[0] 1887 v_1 := v.Args[1] 1888 if v_1.Op != OpARMMOVWconst { 1889 break 1890 } 1891 c := v_1.AuxInt 1892 v.reset(OpARMADDSconst) 1893 v.AuxInt = int64(uint32(c) << uint64(d)) 1894 v.AddArg(x) 1895 return true 1896 } 1897 return false 1898 } 1899 func rewriteValueARM_OpARMADDSshiftLLreg(v *Value, config *Config) bool { 1900 b := v.Block 1901 _ = b 1902 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 1903 // cond: 1904 // result: (ADDSconst [c] (SLL <x.Type> x y)) 1905 for { 1906 v_0 := v.Args[0] 1907 if v_0.Op != OpARMMOVWconst { 1908 break 1909 } 1910 c := v_0.AuxInt 1911 x := v.Args[1] 1912 y := v.Args[2] 1913 v.reset(OpARMADDSconst) 1914 v.AuxInt = c 1915 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 1916 v0.AddArg(x) 1917 v0.AddArg(y) 1918 v.AddArg(v0) 1919 return true 1920 } 1921 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 1922 // cond: 1923 // result: (ADDSshiftLL x y [c]) 1924 for { 1925 x := v.Args[0] 1926 y := v.Args[1] 1927 v_2 := v.Args[2] 1928 if v_2.Op != OpARMMOVWconst { 1929 break 1930 } 1931 c := v_2.AuxInt 1932 v.reset(OpARMADDSshiftLL) 1933 v.AuxInt = c 1934 v.AddArg(x) 1935 v.AddArg(y) 1936 return true 1937 } 1938 return false 1939 } 1940 func rewriteValueARM_OpARMADDSshiftRA(v *Value, config *Config) bool { 1941 b := v.Block 1942 _ = b 1943 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 1944 // cond: 1945 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 1946 for { 1947 d := v.AuxInt 1948 v_0 := v.Args[0] 1949 if v_0.Op != OpARMMOVWconst { 1950 break 1951 } 1952 c := v_0.AuxInt 1953 x := v.Args[1] 1954 v.reset(OpARMADDSconst) 1955 v.AuxInt = c 1956 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 1957 v0.AuxInt = d 1958 v0.AddArg(x) 1959 v.AddArg(v0) 1960 return true 1961 } 1962 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 1963 // cond: 1964 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 1965 for { 1966 d := v.AuxInt 1967 x := v.Args[0] 1968 v_1 := v.Args[1] 1969 if v_1.Op != OpARMMOVWconst { 1970 break 1971 } 1972 c := v_1.AuxInt 1973 v.reset(OpARMADDSconst) 1974 v.AuxInt = int64(int32(c) >> uint64(d)) 1975 v.AddArg(x) 1976 return true 1977 } 1978 return false 1979 } 1980 func rewriteValueARM_OpARMADDSshiftRAreg(v *Value, config *Config) bool { 1981 b := v.Block 1982 _ = b 1983 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 1984 // cond: 1985 // result: (ADDSconst [c] (SRA <x.Type> x y)) 1986 for { 1987 v_0 := v.Args[0] 1988 if v_0.Op != OpARMMOVWconst { 1989 break 1990 } 1991 c := v_0.AuxInt 1992 x := v.Args[1] 1993 y := v.Args[2] 1994 v.reset(OpARMADDSconst) 1995 v.AuxInt = c 1996 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 1997 v0.AddArg(x) 1998 v0.AddArg(y) 1999 v.AddArg(v0) 2000 return true 2001 } 2002 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 2003 // cond: 2004 // result: (ADDSshiftRA x y [c]) 2005 for { 2006 x := v.Args[0] 2007 y := v.Args[1] 2008 v_2 := v.Args[2] 2009 if v_2.Op != OpARMMOVWconst { 2010 break 2011 } 2012 c := v_2.AuxInt 2013 v.reset(OpARMADDSshiftRA) 2014 v.AuxInt = c 2015 v.AddArg(x) 2016 v.AddArg(y) 2017 return true 2018 } 2019 return false 2020 } 2021 func rewriteValueARM_OpARMADDSshiftRL(v *Value, config *Config) bool { 2022 b := v.Block 2023 _ = b 2024 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2025 // cond: 2026 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2027 for { 2028 d := v.AuxInt 2029 v_0 := v.Args[0] 2030 if v_0.Op != OpARMMOVWconst { 2031 break 2032 } 2033 c := v_0.AuxInt 2034 x := v.Args[1] 2035 v.reset(OpARMADDSconst) 2036 v.AuxInt = c 2037 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 2038 v0.AuxInt = d 2039 v0.AddArg(x) 2040 v.AddArg(v0) 2041 return true 2042 } 2043 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2044 // cond: 2045 // result: (ADDSconst x [int64(uint32(c)>>uint64(d))]) 2046 for { 2047 d := v.AuxInt 2048 x := v.Args[0] 2049 v_1 := v.Args[1] 2050 if v_1.Op != OpARMMOVWconst { 2051 break 2052 } 2053 c := v_1.AuxInt 2054 v.reset(OpARMADDSconst) 2055 v.AuxInt = int64(uint32(c) >> uint64(d)) 2056 v.AddArg(x) 2057 return true 2058 } 2059 return false 2060 } 2061 func rewriteValueARM_OpARMADDSshiftRLreg(v *Value, config *Config) bool { 2062 b := v.Block 2063 _ = b 2064 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2065 // cond: 2066 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2067 for { 2068 v_0 := v.Args[0] 2069 if v_0.Op != OpARMMOVWconst { 2070 break 2071 } 2072 c := v_0.AuxInt 2073 x := v.Args[1] 2074 y := v.Args[2] 2075 v.reset(OpARMADDSconst) 2076 v.AuxInt = c 2077 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 2078 v0.AddArg(x) 2079 v0.AddArg(y) 2080 v.AddArg(v0) 2081 return true 2082 } 2083 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2084 // cond: 2085 // result: (ADDSshiftRL x y [c]) 2086 for { 2087 x := v.Args[0] 2088 y := v.Args[1] 2089 v_2 := v.Args[2] 2090 if v_2.Op != OpARMMOVWconst { 2091 break 2092 } 2093 c := v_2.AuxInt 2094 v.reset(OpARMADDSshiftRL) 2095 v.AuxInt = c 2096 v.AddArg(x) 2097 v.AddArg(y) 2098 return true 2099 } 2100 return false 2101 } 2102 func rewriteValueARM_OpARMADDconst(v *Value, config *Config) bool { 2103 b := v.Block 2104 _ = b 2105 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2106 // cond: 2107 // result: (MOVWaddr [off1+off2] {sym} ptr) 2108 for { 2109 off1 := v.AuxInt 2110 v_0 := v.Args[0] 2111 if v_0.Op != OpARMMOVWaddr { 2112 break 2113 } 2114 off2 := v_0.AuxInt 2115 sym := v_0.Aux 2116 ptr := v_0.Args[0] 2117 v.reset(OpARMMOVWaddr) 2118 v.AuxInt = off1 + off2 2119 v.Aux = sym 2120 v.AddArg(ptr) 2121 return true 2122 } 2123 // match: (ADDconst [0] x) 2124 // cond: 2125 // result: x 2126 for { 2127 if v.AuxInt != 0 { 2128 break 2129 } 2130 x := v.Args[0] 2131 v.reset(OpCopy) 2132 v.Type = x.Type 2133 v.AddArg(x) 2134 return true 2135 } 2136 // match: (ADDconst [c] (MOVWconst [d])) 2137 // cond: 2138 // result: (MOVWconst [int64(int32(c+d))]) 2139 for { 2140 c := v.AuxInt 2141 v_0 := v.Args[0] 2142 if v_0.Op != OpARMMOVWconst { 2143 break 2144 } 2145 d := v_0.AuxInt 2146 v.reset(OpARMMOVWconst) 2147 v.AuxInt = int64(int32(c + d)) 2148 return true 2149 } 2150 // match: (ADDconst [c] (ADDconst [d] x)) 2151 // cond: 2152 // result: (ADDconst [int64(int32(c+d))] x) 2153 for { 2154 c := v.AuxInt 2155 v_0 := v.Args[0] 2156 if v_0.Op != OpARMADDconst { 2157 break 2158 } 2159 d := v_0.AuxInt 2160 x := v_0.Args[0] 2161 v.reset(OpARMADDconst) 2162 v.AuxInt = int64(int32(c + d)) 2163 v.AddArg(x) 2164 return true 2165 } 2166 // match: (ADDconst [c] (SUBconst [d] x)) 2167 // cond: 2168 // result: (ADDconst [int64(int32(c-d))] x) 2169 for { 2170 c := v.AuxInt 2171 v_0 := v.Args[0] 2172 if v_0.Op != OpARMSUBconst { 2173 break 2174 } 2175 d := v_0.AuxInt 2176 x := v_0.Args[0] 2177 v.reset(OpARMADDconst) 2178 v.AuxInt = int64(int32(c - d)) 2179 v.AddArg(x) 2180 return true 2181 } 2182 // match: (ADDconst [c] (RSBconst [d] x)) 2183 // cond: 2184 // result: (RSBconst [int64(int32(c+d))] x) 2185 for { 2186 c := v.AuxInt 2187 v_0 := v.Args[0] 2188 if v_0.Op != OpARMRSBconst { 2189 break 2190 } 2191 d := v_0.AuxInt 2192 x := v_0.Args[0] 2193 v.reset(OpARMRSBconst) 2194 v.AuxInt = int64(int32(c + d)) 2195 v.AddArg(x) 2196 return true 2197 } 2198 return false 2199 } 2200 func rewriteValueARM_OpARMADDshiftLL(v *Value, config *Config) bool { 2201 b := v.Block 2202 _ = b 2203 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2204 // cond: 2205 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2206 for { 2207 d := v.AuxInt 2208 v_0 := v.Args[0] 2209 if v_0.Op != OpARMMOVWconst { 2210 break 2211 } 2212 c := v_0.AuxInt 2213 x := v.Args[1] 2214 v.reset(OpARMADDconst) 2215 v.AuxInt = c 2216 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 2217 v0.AuxInt = d 2218 v0.AddArg(x) 2219 v.AddArg(v0) 2220 return true 2221 } 2222 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2223 // cond: 2224 // result: (ADDconst x [int64(uint32(c)<<uint64(d))]) 2225 for { 2226 d := v.AuxInt 2227 x := v.Args[0] 2228 v_1 := v.Args[1] 2229 if v_1.Op != OpARMMOVWconst { 2230 break 2231 } 2232 c := v_1.AuxInt 2233 v.reset(OpARMADDconst) 2234 v.AuxInt = int64(uint32(c) << uint64(d)) 2235 v.AddArg(x) 2236 return true 2237 } 2238 return false 2239 } 2240 func rewriteValueARM_OpARMADDshiftLLreg(v *Value, config *Config) bool { 2241 b := v.Block 2242 _ = b 2243 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2244 // cond: 2245 // result: (ADDconst [c] (SLL <x.Type> x y)) 2246 for { 2247 v_0 := v.Args[0] 2248 if v_0.Op != OpARMMOVWconst { 2249 break 2250 } 2251 c := v_0.AuxInt 2252 x := v.Args[1] 2253 y := v.Args[2] 2254 v.reset(OpARMADDconst) 2255 v.AuxInt = c 2256 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 2257 v0.AddArg(x) 2258 v0.AddArg(y) 2259 v.AddArg(v0) 2260 return true 2261 } 2262 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2263 // cond: 2264 // result: (ADDshiftLL x y [c]) 2265 for { 2266 x := v.Args[0] 2267 y := v.Args[1] 2268 v_2 := v.Args[2] 2269 if v_2.Op != OpARMMOVWconst { 2270 break 2271 } 2272 c := v_2.AuxInt 2273 v.reset(OpARMADDshiftLL) 2274 v.AuxInt = c 2275 v.AddArg(x) 2276 v.AddArg(y) 2277 return true 2278 } 2279 return false 2280 } 2281 func rewriteValueARM_OpARMADDshiftRA(v *Value, config *Config) bool { 2282 b := v.Block 2283 _ = b 2284 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 2285 // cond: 2286 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 2287 for { 2288 d := v.AuxInt 2289 v_0 := v.Args[0] 2290 if v_0.Op != OpARMMOVWconst { 2291 break 2292 } 2293 c := v_0.AuxInt 2294 x := v.Args[1] 2295 v.reset(OpARMADDconst) 2296 v.AuxInt = c 2297 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 2298 v0.AuxInt = d 2299 v0.AddArg(x) 2300 v.AddArg(v0) 2301 return true 2302 } 2303 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 2304 // cond: 2305 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 2306 for { 2307 d := v.AuxInt 2308 x := v.Args[0] 2309 v_1 := v.Args[1] 2310 if v_1.Op != OpARMMOVWconst { 2311 break 2312 } 2313 c := v_1.AuxInt 2314 v.reset(OpARMADDconst) 2315 v.AuxInt = int64(int32(c) >> uint64(d)) 2316 v.AddArg(x) 2317 return true 2318 } 2319 return false 2320 } 2321 func rewriteValueARM_OpARMADDshiftRAreg(v *Value, config *Config) bool { 2322 b := v.Block 2323 _ = b 2324 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 2325 // cond: 2326 // result: (ADDconst [c] (SRA <x.Type> x y)) 2327 for { 2328 v_0 := v.Args[0] 2329 if v_0.Op != OpARMMOVWconst { 2330 break 2331 } 2332 c := v_0.AuxInt 2333 x := v.Args[1] 2334 y := v.Args[2] 2335 v.reset(OpARMADDconst) 2336 v.AuxInt = c 2337 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 2338 v0.AddArg(x) 2339 v0.AddArg(y) 2340 v.AddArg(v0) 2341 return true 2342 } 2343 // match: (ADDshiftRAreg x y (MOVWconst [c])) 2344 // cond: 2345 // result: (ADDshiftRA x y [c]) 2346 for { 2347 x := v.Args[0] 2348 y := v.Args[1] 2349 v_2 := v.Args[2] 2350 if v_2.Op != OpARMMOVWconst { 2351 break 2352 } 2353 c := v_2.AuxInt 2354 v.reset(OpARMADDshiftRA) 2355 v.AuxInt = c 2356 v.AddArg(x) 2357 v.AddArg(y) 2358 return true 2359 } 2360 return false 2361 } 2362 func rewriteValueARM_OpARMADDshiftRL(v *Value, config *Config) bool { 2363 b := v.Block 2364 _ = b 2365 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 2366 // cond: 2367 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 2368 for { 2369 d := v.AuxInt 2370 v_0 := v.Args[0] 2371 if v_0.Op != OpARMMOVWconst { 2372 break 2373 } 2374 c := v_0.AuxInt 2375 x := v.Args[1] 2376 v.reset(OpARMADDconst) 2377 v.AuxInt = c 2378 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 2379 v0.AuxInt = d 2380 v0.AddArg(x) 2381 v.AddArg(v0) 2382 return true 2383 } 2384 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 2385 // cond: 2386 // result: (ADDconst x [int64(uint32(c)>>uint64(d))]) 2387 for { 2388 d := v.AuxInt 2389 x := v.Args[0] 2390 v_1 := v.Args[1] 2391 if v_1.Op != OpARMMOVWconst { 2392 break 2393 } 2394 c := v_1.AuxInt 2395 v.reset(OpARMADDconst) 2396 v.AuxInt = int64(uint32(c) >> uint64(d)) 2397 v.AddArg(x) 2398 return true 2399 } 2400 return false 2401 } 2402 func rewriteValueARM_OpARMADDshiftRLreg(v *Value, config *Config) bool { 2403 b := v.Block 2404 _ = b 2405 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 2406 // cond: 2407 // result: (ADDconst [c] (SRL <x.Type> x y)) 2408 for { 2409 v_0 := v.Args[0] 2410 if v_0.Op != OpARMMOVWconst { 2411 break 2412 } 2413 c := v_0.AuxInt 2414 x := v.Args[1] 2415 y := v.Args[2] 2416 v.reset(OpARMADDconst) 2417 v.AuxInt = c 2418 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 2419 v0.AddArg(x) 2420 v0.AddArg(y) 2421 v.AddArg(v0) 2422 return true 2423 } 2424 // match: (ADDshiftRLreg x y (MOVWconst [c])) 2425 // cond: 2426 // result: (ADDshiftRL x y [c]) 2427 for { 2428 x := v.Args[0] 2429 y := v.Args[1] 2430 v_2 := v.Args[2] 2431 if v_2.Op != OpARMMOVWconst { 2432 break 2433 } 2434 c := v_2.AuxInt 2435 v.reset(OpARMADDshiftRL) 2436 v.AuxInt = c 2437 v.AddArg(x) 2438 v.AddArg(y) 2439 return true 2440 } 2441 return false 2442 } 2443 func rewriteValueARM_OpARMAND(v *Value, config *Config) bool { 2444 b := v.Block 2445 _ = b 2446 // match: (AND (MOVWconst [c]) x) 2447 // cond: 2448 // result: (ANDconst [c] x) 2449 for { 2450 v_0 := v.Args[0] 2451 if v_0.Op != OpARMMOVWconst { 2452 break 2453 } 2454 c := v_0.AuxInt 2455 x := v.Args[1] 2456 v.reset(OpARMANDconst) 2457 v.AuxInt = c 2458 v.AddArg(x) 2459 return true 2460 } 2461 // match: (AND x (MOVWconst [c])) 2462 // cond: 2463 // result: (ANDconst [c] x) 2464 for { 2465 x := v.Args[0] 2466 v_1 := v.Args[1] 2467 if v_1.Op != OpARMMOVWconst { 2468 break 2469 } 2470 c := v_1.AuxInt 2471 v.reset(OpARMANDconst) 2472 v.AuxInt = c 2473 v.AddArg(x) 2474 return true 2475 } 2476 // match: (AND x (SLLconst [c] y)) 2477 // cond: 2478 // result: (ANDshiftLL x y [c]) 2479 for { 2480 x := v.Args[0] 2481 v_1 := v.Args[1] 2482 if v_1.Op != OpARMSLLconst { 2483 break 2484 } 2485 c := v_1.AuxInt 2486 y := v_1.Args[0] 2487 v.reset(OpARMANDshiftLL) 2488 v.AuxInt = c 2489 v.AddArg(x) 2490 v.AddArg(y) 2491 return true 2492 } 2493 // match: (AND (SLLconst [c] y) x) 2494 // cond: 2495 // result: (ANDshiftLL x y [c]) 2496 for { 2497 v_0 := v.Args[0] 2498 if v_0.Op != OpARMSLLconst { 2499 break 2500 } 2501 c := v_0.AuxInt 2502 y := v_0.Args[0] 2503 x := v.Args[1] 2504 v.reset(OpARMANDshiftLL) 2505 v.AuxInt = c 2506 v.AddArg(x) 2507 v.AddArg(y) 2508 return true 2509 } 2510 // match: (AND x (SRLconst [c] y)) 2511 // cond: 2512 // result: (ANDshiftRL x y [c]) 2513 for { 2514 x := v.Args[0] 2515 v_1 := v.Args[1] 2516 if v_1.Op != OpARMSRLconst { 2517 break 2518 } 2519 c := v_1.AuxInt 2520 y := v_1.Args[0] 2521 v.reset(OpARMANDshiftRL) 2522 v.AuxInt = c 2523 v.AddArg(x) 2524 v.AddArg(y) 2525 return true 2526 } 2527 // match: (AND (SRLconst [c] y) x) 2528 // cond: 2529 // result: (ANDshiftRL x y [c]) 2530 for { 2531 v_0 := v.Args[0] 2532 if v_0.Op != OpARMSRLconst { 2533 break 2534 } 2535 c := v_0.AuxInt 2536 y := v_0.Args[0] 2537 x := v.Args[1] 2538 v.reset(OpARMANDshiftRL) 2539 v.AuxInt = c 2540 v.AddArg(x) 2541 v.AddArg(y) 2542 return true 2543 } 2544 // match: (AND x (SRAconst [c] y)) 2545 // cond: 2546 // result: (ANDshiftRA x y [c]) 2547 for { 2548 x := v.Args[0] 2549 v_1 := v.Args[1] 2550 if v_1.Op != OpARMSRAconst { 2551 break 2552 } 2553 c := v_1.AuxInt 2554 y := v_1.Args[0] 2555 v.reset(OpARMANDshiftRA) 2556 v.AuxInt = c 2557 v.AddArg(x) 2558 v.AddArg(y) 2559 return true 2560 } 2561 // match: (AND (SRAconst [c] y) x) 2562 // cond: 2563 // result: (ANDshiftRA x y [c]) 2564 for { 2565 v_0 := v.Args[0] 2566 if v_0.Op != OpARMSRAconst { 2567 break 2568 } 2569 c := v_0.AuxInt 2570 y := v_0.Args[0] 2571 x := v.Args[1] 2572 v.reset(OpARMANDshiftRA) 2573 v.AuxInt = c 2574 v.AddArg(x) 2575 v.AddArg(y) 2576 return true 2577 } 2578 // match: (AND x (SLL y z)) 2579 // cond: 2580 // result: (ANDshiftLLreg x y z) 2581 for { 2582 x := v.Args[0] 2583 v_1 := v.Args[1] 2584 if v_1.Op != OpARMSLL { 2585 break 2586 } 2587 y := v_1.Args[0] 2588 z := v_1.Args[1] 2589 v.reset(OpARMANDshiftLLreg) 2590 v.AddArg(x) 2591 v.AddArg(y) 2592 v.AddArg(z) 2593 return true 2594 } 2595 // match: (AND (SLL y z) x) 2596 // cond: 2597 // result: (ANDshiftLLreg x y z) 2598 for { 2599 v_0 := v.Args[0] 2600 if v_0.Op != OpARMSLL { 2601 break 2602 } 2603 y := v_0.Args[0] 2604 z := v_0.Args[1] 2605 x := v.Args[1] 2606 v.reset(OpARMANDshiftLLreg) 2607 v.AddArg(x) 2608 v.AddArg(y) 2609 v.AddArg(z) 2610 return true 2611 } 2612 // match: (AND x (SRL y z)) 2613 // cond: 2614 // result: (ANDshiftRLreg x y z) 2615 for { 2616 x := v.Args[0] 2617 v_1 := v.Args[1] 2618 if v_1.Op != OpARMSRL { 2619 break 2620 } 2621 y := v_1.Args[0] 2622 z := v_1.Args[1] 2623 v.reset(OpARMANDshiftRLreg) 2624 v.AddArg(x) 2625 v.AddArg(y) 2626 v.AddArg(z) 2627 return true 2628 } 2629 // match: (AND (SRL y z) x) 2630 // cond: 2631 // result: (ANDshiftRLreg x y z) 2632 for { 2633 v_0 := v.Args[0] 2634 if v_0.Op != OpARMSRL { 2635 break 2636 } 2637 y := v_0.Args[0] 2638 z := v_0.Args[1] 2639 x := v.Args[1] 2640 v.reset(OpARMANDshiftRLreg) 2641 v.AddArg(x) 2642 v.AddArg(y) 2643 v.AddArg(z) 2644 return true 2645 } 2646 // match: (AND x (SRA y z)) 2647 // cond: 2648 // result: (ANDshiftRAreg x y z) 2649 for { 2650 x := v.Args[0] 2651 v_1 := v.Args[1] 2652 if v_1.Op != OpARMSRA { 2653 break 2654 } 2655 y := v_1.Args[0] 2656 z := v_1.Args[1] 2657 v.reset(OpARMANDshiftRAreg) 2658 v.AddArg(x) 2659 v.AddArg(y) 2660 v.AddArg(z) 2661 return true 2662 } 2663 // match: (AND (SRA y z) x) 2664 // cond: 2665 // result: (ANDshiftRAreg x y z) 2666 for { 2667 v_0 := v.Args[0] 2668 if v_0.Op != OpARMSRA { 2669 break 2670 } 2671 y := v_0.Args[0] 2672 z := v_0.Args[1] 2673 x := v.Args[1] 2674 v.reset(OpARMANDshiftRAreg) 2675 v.AddArg(x) 2676 v.AddArg(y) 2677 v.AddArg(z) 2678 return true 2679 } 2680 // match: (AND x x) 2681 // cond: 2682 // result: x 2683 for { 2684 x := v.Args[0] 2685 if x != v.Args[1] { 2686 break 2687 } 2688 v.reset(OpCopy) 2689 v.Type = x.Type 2690 v.AddArg(x) 2691 return true 2692 } 2693 // match: (AND x (MVN y)) 2694 // cond: 2695 // result: (BIC x y) 2696 for { 2697 x := v.Args[0] 2698 v_1 := v.Args[1] 2699 if v_1.Op != OpARMMVN { 2700 break 2701 } 2702 y := v_1.Args[0] 2703 v.reset(OpARMBIC) 2704 v.AddArg(x) 2705 v.AddArg(y) 2706 return true 2707 } 2708 // match: (AND (MVN y) x) 2709 // cond: 2710 // result: (BIC x y) 2711 for { 2712 v_0 := v.Args[0] 2713 if v_0.Op != OpARMMVN { 2714 break 2715 } 2716 y := v_0.Args[0] 2717 x := v.Args[1] 2718 v.reset(OpARMBIC) 2719 v.AddArg(x) 2720 v.AddArg(y) 2721 return true 2722 } 2723 // match: (AND x (MVNshiftLL y [c])) 2724 // cond: 2725 // result: (BICshiftLL x y [c]) 2726 for { 2727 x := v.Args[0] 2728 v_1 := v.Args[1] 2729 if v_1.Op != OpARMMVNshiftLL { 2730 break 2731 } 2732 c := v_1.AuxInt 2733 y := v_1.Args[0] 2734 v.reset(OpARMBICshiftLL) 2735 v.AuxInt = c 2736 v.AddArg(x) 2737 v.AddArg(y) 2738 return true 2739 } 2740 // match: (AND (MVNshiftLL y [c]) x) 2741 // cond: 2742 // result: (BICshiftLL x y [c]) 2743 for { 2744 v_0 := v.Args[0] 2745 if v_0.Op != OpARMMVNshiftLL { 2746 break 2747 } 2748 c := v_0.AuxInt 2749 y := v_0.Args[0] 2750 x := v.Args[1] 2751 v.reset(OpARMBICshiftLL) 2752 v.AuxInt = c 2753 v.AddArg(x) 2754 v.AddArg(y) 2755 return true 2756 } 2757 // match: (AND x (MVNshiftRL y [c])) 2758 // cond: 2759 // result: (BICshiftRL x y [c]) 2760 for { 2761 x := v.Args[0] 2762 v_1 := v.Args[1] 2763 if v_1.Op != OpARMMVNshiftRL { 2764 break 2765 } 2766 c := v_1.AuxInt 2767 y := v_1.Args[0] 2768 v.reset(OpARMBICshiftRL) 2769 v.AuxInt = c 2770 v.AddArg(x) 2771 v.AddArg(y) 2772 return true 2773 } 2774 // match: (AND (MVNshiftRL y [c]) x) 2775 // cond: 2776 // result: (BICshiftRL x y [c]) 2777 for { 2778 v_0 := v.Args[0] 2779 if v_0.Op != OpARMMVNshiftRL { 2780 break 2781 } 2782 c := v_0.AuxInt 2783 y := v_0.Args[0] 2784 x := v.Args[1] 2785 v.reset(OpARMBICshiftRL) 2786 v.AuxInt = c 2787 v.AddArg(x) 2788 v.AddArg(y) 2789 return true 2790 } 2791 // match: (AND x (MVNshiftRA y [c])) 2792 // cond: 2793 // result: (BICshiftRA x y [c]) 2794 for { 2795 x := v.Args[0] 2796 v_1 := v.Args[1] 2797 if v_1.Op != OpARMMVNshiftRA { 2798 break 2799 } 2800 c := v_1.AuxInt 2801 y := v_1.Args[0] 2802 v.reset(OpARMBICshiftRA) 2803 v.AuxInt = c 2804 v.AddArg(x) 2805 v.AddArg(y) 2806 return true 2807 } 2808 // match: (AND (MVNshiftRA y [c]) x) 2809 // cond: 2810 // result: (BICshiftRA x y [c]) 2811 for { 2812 v_0 := v.Args[0] 2813 if v_0.Op != OpARMMVNshiftRA { 2814 break 2815 } 2816 c := v_0.AuxInt 2817 y := v_0.Args[0] 2818 x := v.Args[1] 2819 v.reset(OpARMBICshiftRA) 2820 v.AuxInt = c 2821 v.AddArg(x) 2822 v.AddArg(y) 2823 return true 2824 } 2825 return false 2826 } 2827 func rewriteValueARM_OpARMANDconst(v *Value, config *Config) bool { 2828 b := v.Block 2829 _ = b 2830 // match: (ANDconst [0] _) 2831 // cond: 2832 // result: (MOVWconst [0]) 2833 for { 2834 if v.AuxInt != 0 { 2835 break 2836 } 2837 v.reset(OpARMMOVWconst) 2838 v.AuxInt = 0 2839 return true 2840 } 2841 // match: (ANDconst [c] x) 2842 // cond: int32(c)==-1 2843 // result: x 2844 for { 2845 c := v.AuxInt 2846 x := v.Args[0] 2847 if !(int32(c) == -1) { 2848 break 2849 } 2850 v.reset(OpCopy) 2851 v.Type = x.Type 2852 v.AddArg(x) 2853 return true 2854 } 2855 // match: (ANDconst [c] (MOVWconst [d])) 2856 // cond: 2857 // result: (MOVWconst [c&d]) 2858 for { 2859 c := v.AuxInt 2860 v_0 := v.Args[0] 2861 if v_0.Op != OpARMMOVWconst { 2862 break 2863 } 2864 d := v_0.AuxInt 2865 v.reset(OpARMMOVWconst) 2866 v.AuxInt = c & d 2867 return true 2868 } 2869 // match: (ANDconst [c] (ANDconst [d] x)) 2870 // cond: 2871 // result: (ANDconst [c&d] x) 2872 for { 2873 c := v.AuxInt 2874 v_0 := v.Args[0] 2875 if v_0.Op != OpARMANDconst { 2876 break 2877 } 2878 d := v_0.AuxInt 2879 x := v_0.Args[0] 2880 v.reset(OpARMANDconst) 2881 v.AuxInt = c & d 2882 v.AddArg(x) 2883 return true 2884 } 2885 return false 2886 } 2887 func rewriteValueARM_OpARMANDshiftLL(v *Value, config *Config) bool { 2888 b := v.Block 2889 _ = b 2890 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 2891 // cond: 2892 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 2893 for { 2894 d := v.AuxInt 2895 v_0 := v.Args[0] 2896 if v_0.Op != OpARMMOVWconst { 2897 break 2898 } 2899 c := v_0.AuxInt 2900 x := v.Args[1] 2901 v.reset(OpARMANDconst) 2902 v.AuxInt = c 2903 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 2904 v0.AuxInt = d 2905 v0.AddArg(x) 2906 v.AddArg(v0) 2907 return true 2908 } 2909 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 2910 // cond: 2911 // result: (ANDconst x [int64(uint32(c)<<uint64(d))]) 2912 for { 2913 d := v.AuxInt 2914 x := v.Args[0] 2915 v_1 := v.Args[1] 2916 if v_1.Op != OpARMMOVWconst { 2917 break 2918 } 2919 c := v_1.AuxInt 2920 v.reset(OpARMANDconst) 2921 v.AuxInt = int64(uint32(c) << uint64(d)) 2922 v.AddArg(x) 2923 return true 2924 } 2925 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 2926 // cond: c==d 2927 // result: y 2928 for { 2929 d := v.AuxInt 2930 x := v.Args[0] 2931 y := v.Args[1] 2932 if y.Op != OpARMSLLconst { 2933 break 2934 } 2935 c := y.AuxInt 2936 if x != y.Args[0] { 2937 break 2938 } 2939 if !(c == d) { 2940 break 2941 } 2942 v.reset(OpCopy) 2943 v.Type = y.Type 2944 v.AddArg(y) 2945 return true 2946 } 2947 return false 2948 } 2949 func rewriteValueARM_OpARMANDshiftLLreg(v *Value, config *Config) bool { 2950 b := v.Block 2951 _ = b 2952 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 2953 // cond: 2954 // result: (ANDconst [c] (SLL <x.Type> x y)) 2955 for { 2956 v_0 := v.Args[0] 2957 if v_0.Op != OpARMMOVWconst { 2958 break 2959 } 2960 c := v_0.AuxInt 2961 x := v.Args[1] 2962 y := v.Args[2] 2963 v.reset(OpARMANDconst) 2964 v.AuxInt = c 2965 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 2966 v0.AddArg(x) 2967 v0.AddArg(y) 2968 v.AddArg(v0) 2969 return true 2970 } 2971 // match: (ANDshiftLLreg x y (MOVWconst [c])) 2972 // cond: 2973 // result: (ANDshiftLL x y [c]) 2974 for { 2975 x := v.Args[0] 2976 y := v.Args[1] 2977 v_2 := v.Args[2] 2978 if v_2.Op != OpARMMOVWconst { 2979 break 2980 } 2981 c := v_2.AuxInt 2982 v.reset(OpARMANDshiftLL) 2983 v.AuxInt = c 2984 v.AddArg(x) 2985 v.AddArg(y) 2986 return true 2987 } 2988 return false 2989 } 2990 func rewriteValueARM_OpARMANDshiftRA(v *Value, config *Config) bool { 2991 b := v.Block 2992 _ = b 2993 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 2994 // cond: 2995 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 2996 for { 2997 d := v.AuxInt 2998 v_0 := v.Args[0] 2999 if v_0.Op != OpARMMOVWconst { 3000 break 3001 } 3002 c := v_0.AuxInt 3003 x := v.Args[1] 3004 v.reset(OpARMANDconst) 3005 v.AuxInt = c 3006 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 3007 v0.AuxInt = d 3008 v0.AddArg(x) 3009 v.AddArg(v0) 3010 return true 3011 } 3012 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3013 // cond: 3014 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3015 for { 3016 d := v.AuxInt 3017 x := v.Args[0] 3018 v_1 := v.Args[1] 3019 if v_1.Op != OpARMMOVWconst { 3020 break 3021 } 3022 c := v_1.AuxInt 3023 v.reset(OpARMANDconst) 3024 v.AuxInt = int64(int32(c) >> uint64(d)) 3025 v.AddArg(x) 3026 return true 3027 } 3028 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3029 // cond: c==d 3030 // result: y 3031 for { 3032 d := v.AuxInt 3033 x := v.Args[0] 3034 y := v.Args[1] 3035 if y.Op != OpARMSRAconst { 3036 break 3037 } 3038 c := y.AuxInt 3039 if x != y.Args[0] { 3040 break 3041 } 3042 if !(c == d) { 3043 break 3044 } 3045 v.reset(OpCopy) 3046 v.Type = y.Type 3047 v.AddArg(y) 3048 return true 3049 } 3050 return false 3051 } 3052 func rewriteValueARM_OpARMANDshiftRAreg(v *Value, config *Config) bool { 3053 b := v.Block 3054 _ = b 3055 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3056 // cond: 3057 // result: (ANDconst [c] (SRA <x.Type> x y)) 3058 for { 3059 v_0 := v.Args[0] 3060 if v_0.Op != OpARMMOVWconst { 3061 break 3062 } 3063 c := v_0.AuxInt 3064 x := v.Args[1] 3065 y := v.Args[2] 3066 v.reset(OpARMANDconst) 3067 v.AuxInt = c 3068 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 3069 v0.AddArg(x) 3070 v0.AddArg(y) 3071 v.AddArg(v0) 3072 return true 3073 } 3074 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3075 // cond: 3076 // result: (ANDshiftRA x y [c]) 3077 for { 3078 x := v.Args[0] 3079 y := v.Args[1] 3080 v_2 := v.Args[2] 3081 if v_2.Op != OpARMMOVWconst { 3082 break 3083 } 3084 c := v_2.AuxInt 3085 v.reset(OpARMANDshiftRA) 3086 v.AuxInt = c 3087 v.AddArg(x) 3088 v.AddArg(y) 3089 return true 3090 } 3091 return false 3092 } 3093 func rewriteValueARM_OpARMANDshiftRL(v *Value, config *Config) bool { 3094 b := v.Block 3095 _ = b 3096 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3097 // cond: 3098 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3099 for { 3100 d := v.AuxInt 3101 v_0 := v.Args[0] 3102 if v_0.Op != OpARMMOVWconst { 3103 break 3104 } 3105 c := v_0.AuxInt 3106 x := v.Args[1] 3107 v.reset(OpARMANDconst) 3108 v.AuxInt = c 3109 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 3110 v0.AuxInt = d 3111 v0.AddArg(x) 3112 v.AddArg(v0) 3113 return true 3114 } 3115 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3116 // cond: 3117 // result: (ANDconst x [int64(uint32(c)>>uint64(d))]) 3118 for { 3119 d := v.AuxInt 3120 x := v.Args[0] 3121 v_1 := v.Args[1] 3122 if v_1.Op != OpARMMOVWconst { 3123 break 3124 } 3125 c := v_1.AuxInt 3126 v.reset(OpARMANDconst) 3127 v.AuxInt = int64(uint32(c) >> uint64(d)) 3128 v.AddArg(x) 3129 return true 3130 } 3131 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3132 // cond: c==d 3133 // result: y 3134 for { 3135 d := v.AuxInt 3136 x := v.Args[0] 3137 y := v.Args[1] 3138 if y.Op != OpARMSRLconst { 3139 break 3140 } 3141 c := y.AuxInt 3142 if x != y.Args[0] { 3143 break 3144 } 3145 if !(c == d) { 3146 break 3147 } 3148 v.reset(OpCopy) 3149 v.Type = y.Type 3150 v.AddArg(y) 3151 return true 3152 } 3153 return false 3154 } 3155 func rewriteValueARM_OpARMANDshiftRLreg(v *Value, config *Config) bool { 3156 b := v.Block 3157 _ = b 3158 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 3159 // cond: 3160 // result: (ANDconst [c] (SRL <x.Type> x y)) 3161 for { 3162 v_0 := v.Args[0] 3163 if v_0.Op != OpARMMOVWconst { 3164 break 3165 } 3166 c := v_0.AuxInt 3167 x := v.Args[1] 3168 y := v.Args[2] 3169 v.reset(OpARMANDconst) 3170 v.AuxInt = c 3171 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 3172 v0.AddArg(x) 3173 v0.AddArg(y) 3174 v.AddArg(v0) 3175 return true 3176 } 3177 // match: (ANDshiftRLreg x y (MOVWconst [c])) 3178 // cond: 3179 // result: (ANDshiftRL x y [c]) 3180 for { 3181 x := v.Args[0] 3182 y := v.Args[1] 3183 v_2 := v.Args[2] 3184 if v_2.Op != OpARMMOVWconst { 3185 break 3186 } 3187 c := v_2.AuxInt 3188 v.reset(OpARMANDshiftRL) 3189 v.AuxInt = c 3190 v.AddArg(x) 3191 v.AddArg(y) 3192 return true 3193 } 3194 return false 3195 } 3196 func rewriteValueARM_OpARMBIC(v *Value, config *Config) bool { 3197 b := v.Block 3198 _ = b 3199 // match: (BIC x (MOVWconst [c])) 3200 // cond: 3201 // result: (BICconst [c] x) 3202 for { 3203 x := v.Args[0] 3204 v_1 := v.Args[1] 3205 if v_1.Op != OpARMMOVWconst { 3206 break 3207 } 3208 c := v_1.AuxInt 3209 v.reset(OpARMBICconst) 3210 v.AuxInt = c 3211 v.AddArg(x) 3212 return true 3213 } 3214 // match: (BIC x (SLLconst [c] y)) 3215 // cond: 3216 // result: (BICshiftLL x y [c]) 3217 for { 3218 x := v.Args[0] 3219 v_1 := v.Args[1] 3220 if v_1.Op != OpARMSLLconst { 3221 break 3222 } 3223 c := v_1.AuxInt 3224 y := v_1.Args[0] 3225 v.reset(OpARMBICshiftLL) 3226 v.AuxInt = c 3227 v.AddArg(x) 3228 v.AddArg(y) 3229 return true 3230 } 3231 // match: (BIC x (SRLconst [c] y)) 3232 // cond: 3233 // result: (BICshiftRL x y [c]) 3234 for { 3235 x := v.Args[0] 3236 v_1 := v.Args[1] 3237 if v_1.Op != OpARMSRLconst { 3238 break 3239 } 3240 c := v_1.AuxInt 3241 y := v_1.Args[0] 3242 v.reset(OpARMBICshiftRL) 3243 v.AuxInt = c 3244 v.AddArg(x) 3245 v.AddArg(y) 3246 return true 3247 } 3248 // match: (BIC x (SRAconst [c] y)) 3249 // cond: 3250 // result: (BICshiftRA x y [c]) 3251 for { 3252 x := v.Args[0] 3253 v_1 := v.Args[1] 3254 if v_1.Op != OpARMSRAconst { 3255 break 3256 } 3257 c := v_1.AuxInt 3258 y := v_1.Args[0] 3259 v.reset(OpARMBICshiftRA) 3260 v.AuxInt = c 3261 v.AddArg(x) 3262 v.AddArg(y) 3263 return true 3264 } 3265 // match: (BIC x (SLL y z)) 3266 // cond: 3267 // result: (BICshiftLLreg x y z) 3268 for { 3269 x := v.Args[0] 3270 v_1 := v.Args[1] 3271 if v_1.Op != OpARMSLL { 3272 break 3273 } 3274 y := v_1.Args[0] 3275 z := v_1.Args[1] 3276 v.reset(OpARMBICshiftLLreg) 3277 v.AddArg(x) 3278 v.AddArg(y) 3279 v.AddArg(z) 3280 return true 3281 } 3282 // match: (BIC x (SRL y z)) 3283 // cond: 3284 // result: (BICshiftRLreg x y z) 3285 for { 3286 x := v.Args[0] 3287 v_1 := v.Args[1] 3288 if v_1.Op != OpARMSRL { 3289 break 3290 } 3291 y := v_1.Args[0] 3292 z := v_1.Args[1] 3293 v.reset(OpARMBICshiftRLreg) 3294 v.AddArg(x) 3295 v.AddArg(y) 3296 v.AddArg(z) 3297 return true 3298 } 3299 // match: (BIC x (SRA y z)) 3300 // cond: 3301 // result: (BICshiftRAreg x y z) 3302 for { 3303 x := v.Args[0] 3304 v_1 := v.Args[1] 3305 if v_1.Op != OpARMSRA { 3306 break 3307 } 3308 y := v_1.Args[0] 3309 z := v_1.Args[1] 3310 v.reset(OpARMBICshiftRAreg) 3311 v.AddArg(x) 3312 v.AddArg(y) 3313 v.AddArg(z) 3314 return true 3315 } 3316 // match: (BIC x x) 3317 // cond: 3318 // result: (MOVWconst [0]) 3319 for { 3320 x := v.Args[0] 3321 if x != v.Args[1] { 3322 break 3323 } 3324 v.reset(OpARMMOVWconst) 3325 v.AuxInt = 0 3326 return true 3327 } 3328 return false 3329 } 3330 func rewriteValueARM_OpARMBICconst(v *Value, config *Config) bool { 3331 b := v.Block 3332 _ = b 3333 // match: (BICconst [0] x) 3334 // cond: 3335 // result: x 3336 for { 3337 if v.AuxInt != 0 { 3338 break 3339 } 3340 x := v.Args[0] 3341 v.reset(OpCopy) 3342 v.Type = x.Type 3343 v.AddArg(x) 3344 return true 3345 } 3346 // match: (BICconst [c] _) 3347 // cond: int32(c)==-1 3348 // result: (MOVWconst [0]) 3349 for { 3350 c := v.AuxInt 3351 if !(int32(c) == -1) { 3352 break 3353 } 3354 v.reset(OpARMMOVWconst) 3355 v.AuxInt = 0 3356 return true 3357 } 3358 // match: (BICconst [c] (MOVWconst [d])) 3359 // cond: 3360 // result: (MOVWconst [d&^c]) 3361 for { 3362 c := v.AuxInt 3363 v_0 := v.Args[0] 3364 if v_0.Op != OpARMMOVWconst { 3365 break 3366 } 3367 d := v_0.AuxInt 3368 v.reset(OpARMMOVWconst) 3369 v.AuxInt = d &^ c 3370 return true 3371 } 3372 return false 3373 } 3374 func rewriteValueARM_OpARMBICshiftLL(v *Value, config *Config) bool { 3375 b := v.Block 3376 _ = b 3377 // match: (BICshiftLL x (MOVWconst [c]) [d]) 3378 // cond: 3379 // result: (BICconst x [int64(uint32(c)<<uint64(d))]) 3380 for { 3381 d := v.AuxInt 3382 x := v.Args[0] 3383 v_1 := v.Args[1] 3384 if v_1.Op != OpARMMOVWconst { 3385 break 3386 } 3387 c := v_1.AuxInt 3388 v.reset(OpARMBICconst) 3389 v.AuxInt = int64(uint32(c) << uint64(d)) 3390 v.AddArg(x) 3391 return true 3392 } 3393 // match: (BICshiftLL x (SLLconst x [c]) [d]) 3394 // cond: c==d 3395 // result: (MOVWconst [0]) 3396 for { 3397 d := v.AuxInt 3398 x := v.Args[0] 3399 v_1 := v.Args[1] 3400 if v_1.Op != OpARMSLLconst { 3401 break 3402 } 3403 c := v_1.AuxInt 3404 if x != v_1.Args[0] { 3405 break 3406 } 3407 if !(c == d) { 3408 break 3409 } 3410 v.reset(OpARMMOVWconst) 3411 v.AuxInt = 0 3412 return true 3413 } 3414 return false 3415 } 3416 func rewriteValueARM_OpARMBICshiftLLreg(v *Value, config *Config) bool { 3417 b := v.Block 3418 _ = b 3419 // match: (BICshiftLLreg x y (MOVWconst [c])) 3420 // cond: 3421 // result: (BICshiftLL x y [c]) 3422 for { 3423 x := v.Args[0] 3424 y := v.Args[1] 3425 v_2 := v.Args[2] 3426 if v_2.Op != OpARMMOVWconst { 3427 break 3428 } 3429 c := v_2.AuxInt 3430 v.reset(OpARMBICshiftLL) 3431 v.AuxInt = c 3432 v.AddArg(x) 3433 v.AddArg(y) 3434 return true 3435 } 3436 return false 3437 } 3438 func rewriteValueARM_OpARMBICshiftRA(v *Value, config *Config) bool { 3439 b := v.Block 3440 _ = b 3441 // match: (BICshiftRA x (MOVWconst [c]) [d]) 3442 // cond: 3443 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 3444 for { 3445 d := v.AuxInt 3446 x := v.Args[0] 3447 v_1 := v.Args[1] 3448 if v_1.Op != OpARMMOVWconst { 3449 break 3450 } 3451 c := v_1.AuxInt 3452 v.reset(OpARMBICconst) 3453 v.AuxInt = int64(int32(c) >> uint64(d)) 3454 v.AddArg(x) 3455 return true 3456 } 3457 // match: (BICshiftRA x (SRAconst x [c]) [d]) 3458 // cond: c==d 3459 // result: (MOVWconst [0]) 3460 for { 3461 d := v.AuxInt 3462 x := v.Args[0] 3463 v_1 := v.Args[1] 3464 if v_1.Op != OpARMSRAconst { 3465 break 3466 } 3467 c := v_1.AuxInt 3468 if x != v_1.Args[0] { 3469 break 3470 } 3471 if !(c == d) { 3472 break 3473 } 3474 v.reset(OpARMMOVWconst) 3475 v.AuxInt = 0 3476 return true 3477 } 3478 return false 3479 } 3480 func rewriteValueARM_OpARMBICshiftRAreg(v *Value, config *Config) bool { 3481 b := v.Block 3482 _ = b 3483 // match: (BICshiftRAreg x y (MOVWconst [c])) 3484 // cond: 3485 // result: (BICshiftRA x y [c]) 3486 for { 3487 x := v.Args[0] 3488 y := v.Args[1] 3489 v_2 := v.Args[2] 3490 if v_2.Op != OpARMMOVWconst { 3491 break 3492 } 3493 c := v_2.AuxInt 3494 v.reset(OpARMBICshiftRA) 3495 v.AuxInt = c 3496 v.AddArg(x) 3497 v.AddArg(y) 3498 return true 3499 } 3500 return false 3501 } 3502 func rewriteValueARM_OpARMBICshiftRL(v *Value, config *Config) bool { 3503 b := v.Block 3504 _ = b 3505 // match: (BICshiftRL x (MOVWconst [c]) [d]) 3506 // cond: 3507 // result: (BICconst x [int64(uint32(c)>>uint64(d))]) 3508 for { 3509 d := v.AuxInt 3510 x := v.Args[0] 3511 v_1 := v.Args[1] 3512 if v_1.Op != OpARMMOVWconst { 3513 break 3514 } 3515 c := v_1.AuxInt 3516 v.reset(OpARMBICconst) 3517 v.AuxInt = int64(uint32(c) >> uint64(d)) 3518 v.AddArg(x) 3519 return true 3520 } 3521 // match: (BICshiftRL x (SRLconst x [c]) [d]) 3522 // cond: c==d 3523 // result: (MOVWconst [0]) 3524 for { 3525 d := v.AuxInt 3526 x := v.Args[0] 3527 v_1 := v.Args[1] 3528 if v_1.Op != OpARMSRLconst { 3529 break 3530 } 3531 c := v_1.AuxInt 3532 if x != v_1.Args[0] { 3533 break 3534 } 3535 if !(c == d) { 3536 break 3537 } 3538 v.reset(OpARMMOVWconst) 3539 v.AuxInt = 0 3540 return true 3541 } 3542 return false 3543 } 3544 func rewriteValueARM_OpARMBICshiftRLreg(v *Value, config *Config) bool { 3545 b := v.Block 3546 _ = b 3547 // match: (BICshiftRLreg x y (MOVWconst [c])) 3548 // cond: 3549 // result: (BICshiftRL x y [c]) 3550 for { 3551 x := v.Args[0] 3552 y := v.Args[1] 3553 v_2 := v.Args[2] 3554 if v_2.Op != OpARMMOVWconst { 3555 break 3556 } 3557 c := v_2.AuxInt 3558 v.reset(OpARMBICshiftRL) 3559 v.AuxInt = c 3560 v.AddArg(x) 3561 v.AddArg(y) 3562 return true 3563 } 3564 return false 3565 } 3566 func rewriteValueARM_OpARMCMOVWHSconst(v *Value, config *Config) bool { 3567 b := v.Block 3568 _ = b 3569 // match: (CMOVWHSconst _ (FlagEQ) [c]) 3570 // cond: 3571 // result: (MOVWconst [c]) 3572 for { 3573 c := v.AuxInt 3574 v_1 := v.Args[1] 3575 if v_1.Op != OpARMFlagEQ { 3576 break 3577 } 3578 v.reset(OpARMMOVWconst) 3579 v.AuxInt = c 3580 return true 3581 } 3582 // match: (CMOVWHSconst x (FlagLT_ULT)) 3583 // cond: 3584 // result: x 3585 for { 3586 x := v.Args[0] 3587 v_1 := v.Args[1] 3588 if v_1.Op != OpARMFlagLT_ULT { 3589 break 3590 } 3591 v.reset(OpCopy) 3592 v.Type = x.Type 3593 v.AddArg(x) 3594 return true 3595 } 3596 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 3597 // cond: 3598 // result: (MOVWconst [c]) 3599 for { 3600 c := v.AuxInt 3601 v_1 := v.Args[1] 3602 if v_1.Op != OpARMFlagLT_UGT { 3603 break 3604 } 3605 v.reset(OpARMMOVWconst) 3606 v.AuxInt = c 3607 return true 3608 } 3609 // match: (CMOVWHSconst x (FlagGT_ULT)) 3610 // cond: 3611 // result: x 3612 for { 3613 x := v.Args[0] 3614 v_1 := v.Args[1] 3615 if v_1.Op != OpARMFlagGT_ULT { 3616 break 3617 } 3618 v.reset(OpCopy) 3619 v.Type = x.Type 3620 v.AddArg(x) 3621 return true 3622 } 3623 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 3624 // cond: 3625 // result: (MOVWconst [c]) 3626 for { 3627 c := v.AuxInt 3628 v_1 := v.Args[1] 3629 if v_1.Op != OpARMFlagGT_UGT { 3630 break 3631 } 3632 v.reset(OpARMMOVWconst) 3633 v.AuxInt = c 3634 return true 3635 } 3636 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 3637 // cond: 3638 // result: (CMOVWLSconst x flags [c]) 3639 for { 3640 c := v.AuxInt 3641 x := v.Args[0] 3642 v_1 := v.Args[1] 3643 if v_1.Op != OpARMInvertFlags { 3644 break 3645 } 3646 flags := v_1.Args[0] 3647 v.reset(OpARMCMOVWLSconst) 3648 v.AuxInt = c 3649 v.AddArg(x) 3650 v.AddArg(flags) 3651 return true 3652 } 3653 return false 3654 } 3655 func rewriteValueARM_OpARMCMOVWLSconst(v *Value, config *Config) bool { 3656 b := v.Block 3657 _ = b 3658 // match: (CMOVWLSconst _ (FlagEQ) [c]) 3659 // cond: 3660 // result: (MOVWconst [c]) 3661 for { 3662 c := v.AuxInt 3663 v_1 := v.Args[1] 3664 if v_1.Op != OpARMFlagEQ { 3665 break 3666 } 3667 v.reset(OpARMMOVWconst) 3668 v.AuxInt = c 3669 return true 3670 } 3671 // match: (CMOVWLSconst _ (FlagLT_ULT) [c]) 3672 // cond: 3673 // result: (MOVWconst [c]) 3674 for { 3675 c := v.AuxInt 3676 v_1 := v.Args[1] 3677 if v_1.Op != OpARMFlagLT_ULT { 3678 break 3679 } 3680 v.reset(OpARMMOVWconst) 3681 v.AuxInt = c 3682 return true 3683 } 3684 // match: (CMOVWLSconst x (FlagLT_UGT)) 3685 // cond: 3686 // result: x 3687 for { 3688 x := v.Args[0] 3689 v_1 := v.Args[1] 3690 if v_1.Op != OpARMFlagLT_UGT { 3691 break 3692 } 3693 v.reset(OpCopy) 3694 v.Type = x.Type 3695 v.AddArg(x) 3696 return true 3697 } 3698 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 3699 // cond: 3700 // result: (MOVWconst [c]) 3701 for { 3702 c := v.AuxInt 3703 v_1 := v.Args[1] 3704 if v_1.Op != OpARMFlagGT_ULT { 3705 break 3706 } 3707 v.reset(OpARMMOVWconst) 3708 v.AuxInt = c 3709 return true 3710 } 3711 // match: (CMOVWLSconst x (FlagGT_UGT)) 3712 // cond: 3713 // result: x 3714 for { 3715 x := v.Args[0] 3716 v_1 := v.Args[1] 3717 if v_1.Op != OpARMFlagGT_UGT { 3718 break 3719 } 3720 v.reset(OpCopy) 3721 v.Type = x.Type 3722 v.AddArg(x) 3723 return true 3724 } 3725 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 3726 // cond: 3727 // result: (CMOVWHSconst x flags [c]) 3728 for { 3729 c := v.AuxInt 3730 x := v.Args[0] 3731 v_1 := v.Args[1] 3732 if v_1.Op != OpARMInvertFlags { 3733 break 3734 } 3735 flags := v_1.Args[0] 3736 v.reset(OpARMCMOVWHSconst) 3737 v.AuxInt = c 3738 v.AddArg(x) 3739 v.AddArg(flags) 3740 return true 3741 } 3742 return false 3743 } 3744 func rewriteValueARM_OpARMCMP(v *Value, config *Config) bool { 3745 b := v.Block 3746 _ = b 3747 // match: (CMP x (MOVWconst [c])) 3748 // cond: 3749 // result: (CMPconst [c] x) 3750 for { 3751 x := v.Args[0] 3752 v_1 := v.Args[1] 3753 if v_1.Op != OpARMMOVWconst { 3754 break 3755 } 3756 c := v_1.AuxInt 3757 v.reset(OpARMCMPconst) 3758 v.AuxInt = c 3759 v.AddArg(x) 3760 return true 3761 } 3762 // match: (CMP (MOVWconst [c]) x) 3763 // cond: 3764 // result: (InvertFlags (CMPconst [c] x)) 3765 for { 3766 v_0 := v.Args[0] 3767 if v_0.Op != OpARMMOVWconst { 3768 break 3769 } 3770 c := v_0.AuxInt 3771 x := v.Args[1] 3772 v.reset(OpARMInvertFlags) 3773 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 3774 v0.AuxInt = c 3775 v0.AddArg(x) 3776 v.AddArg(v0) 3777 return true 3778 } 3779 // match: (CMP x (SLLconst [c] y)) 3780 // cond: 3781 // result: (CMPshiftLL x y [c]) 3782 for { 3783 x := v.Args[0] 3784 v_1 := v.Args[1] 3785 if v_1.Op != OpARMSLLconst { 3786 break 3787 } 3788 c := v_1.AuxInt 3789 y := v_1.Args[0] 3790 v.reset(OpARMCMPshiftLL) 3791 v.AuxInt = c 3792 v.AddArg(x) 3793 v.AddArg(y) 3794 return true 3795 } 3796 // match: (CMP (SLLconst [c] y) x) 3797 // cond: 3798 // result: (InvertFlags (CMPshiftLL x y [c])) 3799 for { 3800 v_0 := v.Args[0] 3801 if v_0.Op != OpARMSLLconst { 3802 break 3803 } 3804 c := v_0.AuxInt 3805 y := v_0.Args[0] 3806 x := v.Args[1] 3807 v.reset(OpARMInvertFlags) 3808 v0 := b.NewValue0(v.Line, OpARMCMPshiftLL, TypeFlags) 3809 v0.AuxInt = c 3810 v0.AddArg(x) 3811 v0.AddArg(y) 3812 v.AddArg(v0) 3813 return true 3814 } 3815 // match: (CMP x (SRLconst [c] y)) 3816 // cond: 3817 // result: (CMPshiftRL x y [c]) 3818 for { 3819 x := v.Args[0] 3820 v_1 := v.Args[1] 3821 if v_1.Op != OpARMSRLconst { 3822 break 3823 } 3824 c := v_1.AuxInt 3825 y := v_1.Args[0] 3826 v.reset(OpARMCMPshiftRL) 3827 v.AuxInt = c 3828 v.AddArg(x) 3829 v.AddArg(y) 3830 return true 3831 } 3832 // match: (CMP (SRLconst [c] y) x) 3833 // cond: 3834 // result: (InvertFlags (CMPshiftRL x y [c])) 3835 for { 3836 v_0 := v.Args[0] 3837 if v_0.Op != OpARMSRLconst { 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.Line, OpARMCMPshiftRL, 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 (SRAconst [c] y)) 3852 // cond: 3853 // result: (CMPshiftRA x y [c]) 3854 for { 3855 x := v.Args[0] 3856 v_1 := v.Args[1] 3857 if v_1.Op != OpARMSRAconst { 3858 break 3859 } 3860 c := v_1.AuxInt 3861 y := v_1.Args[0] 3862 v.reset(OpARMCMPshiftRA) 3863 v.AuxInt = c 3864 v.AddArg(x) 3865 v.AddArg(y) 3866 return true 3867 } 3868 // match: (CMP (SRAconst [c] y) x) 3869 // cond: 3870 // result: (InvertFlags (CMPshiftRA x y [c])) 3871 for { 3872 v_0 := v.Args[0] 3873 if v_0.Op != OpARMSRAconst { 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.Line, OpARMCMPshiftRA, 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 (SLL y z)) 3888 // cond: 3889 // result: (CMPshiftLLreg x y z) 3890 for { 3891 x := v.Args[0] 3892 v_1 := v.Args[1] 3893 if v_1.Op != OpARMSLL { 3894 break 3895 } 3896 y := v_1.Args[0] 3897 z := v_1.Args[1] 3898 v.reset(OpARMCMPshiftLLreg) 3899 v.AddArg(x) 3900 v.AddArg(y) 3901 v.AddArg(z) 3902 return true 3903 } 3904 // match: (CMP (SLL y z) x) 3905 // cond: 3906 // result: (InvertFlags (CMPshiftLLreg x y z)) 3907 for { 3908 v_0 := v.Args[0] 3909 if v_0.Op != OpARMSLL { 3910 break 3911 } 3912 y := v_0.Args[0] 3913 z := v_0.Args[1] 3914 x := v.Args[1] 3915 v.reset(OpARMInvertFlags) 3916 v0 := b.NewValue0(v.Line, OpARMCMPshiftLLreg, TypeFlags) 3917 v0.AddArg(x) 3918 v0.AddArg(y) 3919 v0.AddArg(z) 3920 v.AddArg(v0) 3921 return true 3922 } 3923 // match: (CMP x (SRL y z)) 3924 // cond: 3925 // result: (CMPshiftRLreg x y z) 3926 for { 3927 x := v.Args[0] 3928 v_1 := v.Args[1] 3929 if v_1.Op != OpARMSRL { 3930 break 3931 } 3932 y := v_1.Args[0] 3933 z := v_1.Args[1] 3934 v.reset(OpARMCMPshiftRLreg) 3935 v.AddArg(x) 3936 v.AddArg(y) 3937 v.AddArg(z) 3938 return true 3939 } 3940 // match: (CMP (SRL y z) x) 3941 // cond: 3942 // result: (InvertFlags (CMPshiftRLreg x y z)) 3943 for { 3944 v_0 := v.Args[0] 3945 if v_0.Op != OpARMSRL { 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.Line, OpARMCMPshiftRLreg, 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 (SRA y z)) 3960 // cond: 3961 // result: (CMPshiftRAreg x y z) 3962 for { 3963 x := v.Args[0] 3964 v_1 := v.Args[1] 3965 if v_1.Op != OpARMSRA { 3966 break 3967 } 3968 y := v_1.Args[0] 3969 z := v_1.Args[1] 3970 v.reset(OpARMCMPshiftRAreg) 3971 v.AddArg(x) 3972 v.AddArg(y) 3973 v.AddArg(z) 3974 return true 3975 } 3976 // match: (CMP (SRA y z) x) 3977 // cond: 3978 // result: (InvertFlags (CMPshiftRAreg x y z)) 3979 for { 3980 v_0 := v.Args[0] 3981 if v_0.Op != OpARMSRA { 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.Line, OpARMCMPshiftRAreg, TypeFlags) 3989 v0.AddArg(x) 3990 v0.AddArg(y) 3991 v0.AddArg(z) 3992 v.AddArg(v0) 3993 return true 3994 } 3995 return false 3996 } 3997 func rewriteValueARM_OpARMCMPD(v *Value, config *Config) bool { 3998 b := v.Block 3999 _ = b 4000 // match: (CMPD x (MOVDconst [0])) 4001 // cond: 4002 // result: (CMPD0 x) 4003 for { 4004 x := v.Args[0] 4005 v_1 := v.Args[1] 4006 if v_1.Op != OpARMMOVDconst { 4007 break 4008 } 4009 if v_1.AuxInt != 0 { 4010 break 4011 } 4012 v.reset(OpARMCMPD0) 4013 v.AddArg(x) 4014 return true 4015 } 4016 return false 4017 } 4018 func rewriteValueARM_OpARMCMPF(v *Value, config *Config) bool { 4019 b := v.Block 4020 _ = b 4021 // match: (CMPF x (MOVFconst [0])) 4022 // cond: 4023 // result: (CMPF0 x) 4024 for { 4025 x := v.Args[0] 4026 v_1 := v.Args[1] 4027 if v_1.Op != OpARMMOVFconst { 4028 break 4029 } 4030 if v_1.AuxInt != 0 { 4031 break 4032 } 4033 v.reset(OpARMCMPF0) 4034 v.AddArg(x) 4035 return true 4036 } 4037 return false 4038 } 4039 func rewriteValueARM_OpARMCMPconst(v *Value, config *Config) bool { 4040 b := v.Block 4041 _ = b 4042 // match: (CMPconst (MOVWconst [x]) [y]) 4043 // cond: int32(x)==int32(y) 4044 // result: (FlagEQ) 4045 for { 4046 y := v.AuxInt 4047 v_0 := v.Args[0] 4048 if v_0.Op != OpARMMOVWconst { 4049 break 4050 } 4051 x := v_0.AuxInt 4052 if !(int32(x) == int32(y)) { 4053 break 4054 } 4055 v.reset(OpARMFlagEQ) 4056 return true 4057 } 4058 // match: (CMPconst (MOVWconst [x]) [y]) 4059 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 4060 // result: (FlagLT_ULT) 4061 for { 4062 y := v.AuxInt 4063 v_0 := v.Args[0] 4064 if v_0.Op != OpARMMOVWconst { 4065 break 4066 } 4067 x := v_0.AuxInt 4068 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 4069 break 4070 } 4071 v.reset(OpARMFlagLT_ULT) 4072 return true 4073 } 4074 // match: (CMPconst (MOVWconst [x]) [y]) 4075 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 4076 // result: (FlagLT_UGT) 4077 for { 4078 y := v.AuxInt 4079 v_0 := v.Args[0] 4080 if v_0.Op != OpARMMOVWconst { 4081 break 4082 } 4083 x := v_0.AuxInt 4084 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 4085 break 4086 } 4087 v.reset(OpARMFlagLT_UGT) 4088 return true 4089 } 4090 // match: (CMPconst (MOVWconst [x]) [y]) 4091 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 4092 // result: (FlagGT_ULT) 4093 for { 4094 y := v.AuxInt 4095 v_0 := v.Args[0] 4096 if v_0.Op != OpARMMOVWconst { 4097 break 4098 } 4099 x := v_0.AuxInt 4100 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 4101 break 4102 } 4103 v.reset(OpARMFlagGT_ULT) 4104 return true 4105 } 4106 // match: (CMPconst (MOVWconst [x]) [y]) 4107 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 4108 // result: (FlagGT_UGT) 4109 for { 4110 y := v.AuxInt 4111 v_0 := v.Args[0] 4112 if v_0.Op != OpARMMOVWconst { 4113 break 4114 } 4115 x := v_0.AuxInt 4116 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 4117 break 4118 } 4119 v.reset(OpARMFlagGT_UGT) 4120 return true 4121 } 4122 // match: (CMPconst (MOVBUreg _) [c]) 4123 // cond: 0xff < c 4124 // result: (FlagLT_ULT) 4125 for { 4126 c := v.AuxInt 4127 v_0 := v.Args[0] 4128 if v_0.Op != OpARMMOVBUreg { 4129 break 4130 } 4131 if !(0xff < c) { 4132 break 4133 } 4134 v.reset(OpARMFlagLT_ULT) 4135 return true 4136 } 4137 // match: (CMPconst (MOVHUreg _) [c]) 4138 // cond: 0xffff < c 4139 // result: (FlagLT_ULT) 4140 for { 4141 c := v.AuxInt 4142 v_0 := v.Args[0] 4143 if v_0.Op != OpARMMOVHUreg { 4144 break 4145 } 4146 if !(0xffff < c) { 4147 break 4148 } 4149 v.reset(OpARMFlagLT_ULT) 4150 return true 4151 } 4152 // match: (CMPconst (ANDconst _ [m]) [n]) 4153 // cond: 0 <= int32(m) && int32(m) < int32(n) 4154 // result: (FlagLT_ULT) 4155 for { 4156 n := v.AuxInt 4157 v_0 := v.Args[0] 4158 if v_0.Op != OpARMANDconst { 4159 break 4160 } 4161 m := v_0.AuxInt 4162 if !(0 <= int32(m) && int32(m) < int32(n)) { 4163 break 4164 } 4165 v.reset(OpARMFlagLT_ULT) 4166 return true 4167 } 4168 // match: (CMPconst (SRLconst _ [c]) [n]) 4169 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 4170 // result: (FlagLT_ULT) 4171 for { 4172 n := v.AuxInt 4173 v_0 := v.Args[0] 4174 if v_0.Op != OpARMSRLconst { 4175 break 4176 } 4177 c := v_0.AuxInt 4178 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 4179 break 4180 } 4181 v.reset(OpARMFlagLT_ULT) 4182 return true 4183 } 4184 return false 4185 } 4186 func rewriteValueARM_OpARMCMPshiftLL(v *Value, config *Config) bool { 4187 b := v.Block 4188 _ = b 4189 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 4190 // cond: 4191 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 4192 for { 4193 d := v.AuxInt 4194 v_0 := v.Args[0] 4195 if v_0.Op != OpARMMOVWconst { 4196 break 4197 } 4198 c := v_0.AuxInt 4199 x := v.Args[1] 4200 v.reset(OpARMInvertFlags) 4201 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 4202 v0.AuxInt = c 4203 v1 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 4204 v1.AuxInt = d 4205 v1.AddArg(x) 4206 v0.AddArg(v1) 4207 v.AddArg(v0) 4208 return true 4209 } 4210 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 4211 // cond: 4212 // result: (CMPconst x [int64(uint32(c)<<uint64(d))]) 4213 for { 4214 d := v.AuxInt 4215 x := v.Args[0] 4216 v_1 := v.Args[1] 4217 if v_1.Op != OpARMMOVWconst { 4218 break 4219 } 4220 c := v_1.AuxInt 4221 v.reset(OpARMCMPconst) 4222 v.AuxInt = int64(uint32(c) << uint64(d)) 4223 v.AddArg(x) 4224 return true 4225 } 4226 return false 4227 } 4228 func rewriteValueARM_OpARMCMPshiftLLreg(v *Value, config *Config) bool { 4229 b := v.Block 4230 _ = b 4231 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 4232 // cond: 4233 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 4234 for { 4235 v_0 := v.Args[0] 4236 if v_0.Op != OpARMMOVWconst { 4237 break 4238 } 4239 c := v_0.AuxInt 4240 x := v.Args[1] 4241 y := v.Args[2] 4242 v.reset(OpARMInvertFlags) 4243 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 4244 v0.AuxInt = c 4245 v1 := b.NewValue0(v.Line, OpARMSLL, x.Type) 4246 v1.AddArg(x) 4247 v1.AddArg(y) 4248 v0.AddArg(v1) 4249 v.AddArg(v0) 4250 return true 4251 } 4252 // match: (CMPshiftLLreg x y (MOVWconst [c])) 4253 // cond: 4254 // result: (CMPshiftLL x y [c]) 4255 for { 4256 x := v.Args[0] 4257 y := v.Args[1] 4258 v_2 := v.Args[2] 4259 if v_2.Op != OpARMMOVWconst { 4260 break 4261 } 4262 c := v_2.AuxInt 4263 v.reset(OpARMCMPshiftLL) 4264 v.AuxInt = c 4265 v.AddArg(x) 4266 v.AddArg(y) 4267 return true 4268 } 4269 return false 4270 } 4271 func rewriteValueARM_OpARMCMPshiftRA(v *Value, config *Config) bool { 4272 b := v.Block 4273 _ = b 4274 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 4275 // cond: 4276 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 4277 for { 4278 d := v.AuxInt 4279 v_0 := v.Args[0] 4280 if v_0.Op != OpARMMOVWconst { 4281 break 4282 } 4283 c := v_0.AuxInt 4284 x := v.Args[1] 4285 v.reset(OpARMInvertFlags) 4286 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 4287 v0.AuxInt = c 4288 v1 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 4289 v1.AuxInt = d 4290 v1.AddArg(x) 4291 v0.AddArg(v1) 4292 v.AddArg(v0) 4293 return true 4294 } 4295 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 4296 // cond: 4297 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 4298 for { 4299 d := v.AuxInt 4300 x := v.Args[0] 4301 v_1 := v.Args[1] 4302 if v_1.Op != OpARMMOVWconst { 4303 break 4304 } 4305 c := v_1.AuxInt 4306 v.reset(OpARMCMPconst) 4307 v.AuxInt = int64(int32(c) >> uint64(d)) 4308 v.AddArg(x) 4309 return true 4310 } 4311 return false 4312 } 4313 func rewriteValueARM_OpARMCMPshiftRAreg(v *Value, config *Config) bool { 4314 b := v.Block 4315 _ = b 4316 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 4317 // cond: 4318 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 4319 for { 4320 v_0 := v.Args[0] 4321 if v_0.Op != OpARMMOVWconst { 4322 break 4323 } 4324 c := v_0.AuxInt 4325 x := v.Args[1] 4326 y := v.Args[2] 4327 v.reset(OpARMInvertFlags) 4328 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 4329 v0.AuxInt = c 4330 v1 := b.NewValue0(v.Line, OpARMSRA, x.Type) 4331 v1.AddArg(x) 4332 v1.AddArg(y) 4333 v0.AddArg(v1) 4334 v.AddArg(v0) 4335 return true 4336 } 4337 // match: (CMPshiftRAreg x y (MOVWconst [c])) 4338 // cond: 4339 // result: (CMPshiftRA x y [c]) 4340 for { 4341 x := v.Args[0] 4342 y := v.Args[1] 4343 v_2 := v.Args[2] 4344 if v_2.Op != OpARMMOVWconst { 4345 break 4346 } 4347 c := v_2.AuxInt 4348 v.reset(OpARMCMPshiftRA) 4349 v.AuxInt = c 4350 v.AddArg(x) 4351 v.AddArg(y) 4352 return true 4353 } 4354 return false 4355 } 4356 func rewriteValueARM_OpARMCMPshiftRL(v *Value, config *Config) bool { 4357 b := v.Block 4358 _ = b 4359 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 4360 // cond: 4361 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 4362 for { 4363 d := v.AuxInt 4364 v_0 := v.Args[0] 4365 if v_0.Op != OpARMMOVWconst { 4366 break 4367 } 4368 c := v_0.AuxInt 4369 x := v.Args[1] 4370 v.reset(OpARMInvertFlags) 4371 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 4372 v0.AuxInt = c 4373 v1 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 4374 v1.AuxInt = d 4375 v1.AddArg(x) 4376 v0.AddArg(v1) 4377 v.AddArg(v0) 4378 return true 4379 } 4380 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 4381 // cond: 4382 // result: (CMPconst x [int64(uint32(c)>>uint64(d))]) 4383 for { 4384 d := v.AuxInt 4385 x := v.Args[0] 4386 v_1 := v.Args[1] 4387 if v_1.Op != OpARMMOVWconst { 4388 break 4389 } 4390 c := v_1.AuxInt 4391 v.reset(OpARMCMPconst) 4392 v.AuxInt = int64(uint32(c) >> uint64(d)) 4393 v.AddArg(x) 4394 return true 4395 } 4396 return false 4397 } 4398 func rewriteValueARM_OpARMCMPshiftRLreg(v *Value, config *Config) bool { 4399 b := v.Block 4400 _ = b 4401 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 4402 // cond: 4403 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 4404 for { 4405 v_0 := v.Args[0] 4406 if v_0.Op != OpARMMOVWconst { 4407 break 4408 } 4409 c := v_0.AuxInt 4410 x := v.Args[1] 4411 y := v.Args[2] 4412 v.reset(OpARMInvertFlags) 4413 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 4414 v0.AuxInt = c 4415 v1 := b.NewValue0(v.Line, OpARMSRL, x.Type) 4416 v1.AddArg(x) 4417 v1.AddArg(y) 4418 v0.AddArg(v1) 4419 v.AddArg(v0) 4420 return true 4421 } 4422 // match: (CMPshiftRLreg x y (MOVWconst [c])) 4423 // cond: 4424 // result: (CMPshiftRL x y [c]) 4425 for { 4426 x := v.Args[0] 4427 y := v.Args[1] 4428 v_2 := v.Args[2] 4429 if v_2.Op != OpARMMOVWconst { 4430 break 4431 } 4432 c := v_2.AuxInt 4433 v.reset(OpARMCMPshiftRL) 4434 v.AuxInt = c 4435 v.AddArg(x) 4436 v.AddArg(y) 4437 return true 4438 } 4439 return false 4440 } 4441 func rewriteValueARM_OpARMEqual(v *Value, config *Config) bool { 4442 b := v.Block 4443 _ = b 4444 // match: (Equal (FlagEQ)) 4445 // cond: 4446 // result: (MOVWconst [1]) 4447 for { 4448 v_0 := v.Args[0] 4449 if v_0.Op != OpARMFlagEQ { 4450 break 4451 } 4452 v.reset(OpARMMOVWconst) 4453 v.AuxInt = 1 4454 return true 4455 } 4456 // match: (Equal (FlagLT_ULT)) 4457 // cond: 4458 // result: (MOVWconst [0]) 4459 for { 4460 v_0 := v.Args[0] 4461 if v_0.Op != OpARMFlagLT_ULT { 4462 break 4463 } 4464 v.reset(OpARMMOVWconst) 4465 v.AuxInt = 0 4466 return true 4467 } 4468 // match: (Equal (FlagLT_UGT)) 4469 // cond: 4470 // result: (MOVWconst [0]) 4471 for { 4472 v_0 := v.Args[0] 4473 if v_0.Op != OpARMFlagLT_UGT { 4474 break 4475 } 4476 v.reset(OpARMMOVWconst) 4477 v.AuxInt = 0 4478 return true 4479 } 4480 // match: (Equal (FlagGT_ULT)) 4481 // cond: 4482 // result: (MOVWconst [0]) 4483 for { 4484 v_0 := v.Args[0] 4485 if v_0.Op != OpARMFlagGT_ULT { 4486 break 4487 } 4488 v.reset(OpARMMOVWconst) 4489 v.AuxInt = 0 4490 return true 4491 } 4492 // match: (Equal (FlagGT_UGT)) 4493 // cond: 4494 // result: (MOVWconst [0]) 4495 for { 4496 v_0 := v.Args[0] 4497 if v_0.Op != OpARMFlagGT_UGT { 4498 break 4499 } 4500 v.reset(OpARMMOVWconst) 4501 v.AuxInt = 0 4502 return true 4503 } 4504 // match: (Equal (InvertFlags x)) 4505 // cond: 4506 // result: (Equal x) 4507 for { 4508 v_0 := v.Args[0] 4509 if v_0.Op != OpARMInvertFlags { 4510 break 4511 } 4512 x := v_0.Args[0] 4513 v.reset(OpARMEqual) 4514 v.AddArg(x) 4515 return true 4516 } 4517 return false 4518 } 4519 func rewriteValueARM_OpARMGreaterEqual(v *Value, config *Config) bool { 4520 b := v.Block 4521 _ = b 4522 // match: (GreaterEqual (FlagEQ)) 4523 // cond: 4524 // result: (MOVWconst [1]) 4525 for { 4526 v_0 := v.Args[0] 4527 if v_0.Op != OpARMFlagEQ { 4528 break 4529 } 4530 v.reset(OpARMMOVWconst) 4531 v.AuxInt = 1 4532 return true 4533 } 4534 // match: (GreaterEqual (FlagLT_ULT)) 4535 // cond: 4536 // result: (MOVWconst [0]) 4537 for { 4538 v_0 := v.Args[0] 4539 if v_0.Op != OpARMFlagLT_ULT { 4540 break 4541 } 4542 v.reset(OpARMMOVWconst) 4543 v.AuxInt = 0 4544 return true 4545 } 4546 // match: (GreaterEqual (FlagLT_UGT)) 4547 // cond: 4548 // result: (MOVWconst [0]) 4549 for { 4550 v_0 := v.Args[0] 4551 if v_0.Op != OpARMFlagLT_UGT { 4552 break 4553 } 4554 v.reset(OpARMMOVWconst) 4555 v.AuxInt = 0 4556 return true 4557 } 4558 // match: (GreaterEqual (FlagGT_ULT)) 4559 // cond: 4560 // result: (MOVWconst [1]) 4561 for { 4562 v_0 := v.Args[0] 4563 if v_0.Op != OpARMFlagGT_ULT { 4564 break 4565 } 4566 v.reset(OpARMMOVWconst) 4567 v.AuxInt = 1 4568 return true 4569 } 4570 // match: (GreaterEqual (FlagGT_UGT)) 4571 // cond: 4572 // result: (MOVWconst [1]) 4573 for { 4574 v_0 := v.Args[0] 4575 if v_0.Op != OpARMFlagGT_UGT { 4576 break 4577 } 4578 v.reset(OpARMMOVWconst) 4579 v.AuxInt = 1 4580 return true 4581 } 4582 // match: (GreaterEqual (InvertFlags x)) 4583 // cond: 4584 // result: (LessEqual x) 4585 for { 4586 v_0 := v.Args[0] 4587 if v_0.Op != OpARMInvertFlags { 4588 break 4589 } 4590 x := v_0.Args[0] 4591 v.reset(OpARMLessEqual) 4592 v.AddArg(x) 4593 return true 4594 } 4595 return false 4596 } 4597 func rewriteValueARM_OpARMGreaterEqualU(v *Value, config *Config) bool { 4598 b := v.Block 4599 _ = b 4600 // match: (GreaterEqualU (FlagEQ)) 4601 // cond: 4602 // result: (MOVWconst [1]) 4603 for { 4604 v_0 := v.Args[0] 4605 if v_0.Op != OpARMFlagEQ { 4606 break 4607 } 4608 v.reset(OpARMMOVWconst) 4609 v.AuxInt = 1 4610 return true 4611 } 4612 // match: (GreaterEqualU (FlagLT_ULT)) 4613 // cond: 4614 // result: (MOVWconst [0]) 4615 for { 4616 v_0 := v.Args[0] 4617 if v_0.Op != OpARMFlagLT_ULT { 4618 break 4619 } 4620 v.reset(OpARMMOVWconst) 4621 v.AuxInt = 0 4622 return true 4623 } 4624 // match: (GreaterEqualU (FlagLT_UGT)) 4625 // cond: 4626 // result: (MOVWconst [1]) 4627 for { 4628 v_0 := v.Args[0] 4629 if v_0.Op != OpARMFlagLT_UGT { 4630 break 4631 } 4632 v.reset(OpARMMOVWconst) 4633 v.AuxInt = 1 4634 return true 4635 } 4636 // match: (GreaterEqualU (FlagGT_ULT)) 4637 // cond: 4638 // result: (MOVWconst [0]) 4639 for { 4640 v_0 := v.Args[0] 4641 if v_0.Op != OpARMFlagGT_ULT { 4642 break 4643 } 4644 v.reset(OpARMMOVWconst) 4645 v.AuxInt = 0 4646 return true 4647 } 4648 // match: (GreaterEqualU (FlagGT_UGT)) 4649 // cond: 4650 // result: (MOVWconst [1]) 4651 for { 4652 v_0 := v.Args[0] 4653 if v_0.Op != OpARMFlagGT_UGT { 4654 break 4655 } 4656 v.reset(OpARMMOVWconst) 4657 v.AuxInt = 1 4658 return true 4659 } 4660 // match: (GreaterEqualU (InvertFlags x)) 4661 // cond: 4662 // result: (LessEqualU x) 4663 for { 4664 v_0 := v.Args[0] 4665 if v_0.Op != OpARMInvertFlags { 4666 break 4667 } 4668 x := v_0.Args[0] 4669 v.reset(OpARMLessEqualU) 4670 v.AddArg(x) 4671 return true 4672 } 4673 return false 4674 } 4675 func rewriteValueARM_OpARMGreaterThan(v *Value, config *Config) bool { 4676 b := v.Block 4677 _ = b 4678 // match: (GreaterThan (FlagEQ)) 4679 // cond: 4680 // result: (MOVWconst [0]) 4681 for { 4682 v_0 := v.Args[0] 4683 if v_0.Op != OpARMFlagEQ { 4684 break 4685 } 4686 v.reset(OpARMMOVWconst) 4687 v.AuxInt = 0 4688 return true 4689 } 4690 // match: (GreaterThan (FlagLT_ULT)) 4691 // cond: 4692 // result: (MOVWconst [0]) 4693 for { 4694 v_0 := v.Args[0] 4695 if v_0.Op != OpARMFlagLT_ULT { 4696 break 4697 } 4698 v.reset(OpARMMOVWconst) 4699 v.AuxInt = 0 4700 return true 4701 } 4702 // match: (GreaterThan (FlagLT_UGT)) 4703 // cond: 4704 // result: (MOVWconst [0]) 4705 for { 4706 v_0 := v.Args[0] 4707 if v_0.Op != OpARMFlagLT_UGT { 4708 break 4709 } 4710 v.reset(OpARMMOVWconst) 4711 v.AuxInt = 0 4712 return true 4713 } 4714 // match: (GreaterThan (FlagGT_ULT)) 4715 // cond: 4716 // result: (MOVWconst [1]) 4717 for { 4718 v_0 := v.Args[0] 4719 if v_0.Op != OpARMFlagGT_ULT { 4720 break 4721 } 4722 v.reset(OpARMMOVWconst) 4723 v.AuxInt = 1 4724 return true 4725 } 4726 // match: (GreaterThan (FlagGT_UGT)) 4727 // cond: 4728 // result: (MOVWconst [1]) 4729 for { 4730 v_0 := v.Args[0] 4731 if v_0.Op != OpARMFlagGT_UGT { 4732 break 4733 } 4734 v.reset(OpARMMOVWconst) 4735 v.AuxInt = 1 4736 return true 4737 } 4738 // match: (GreaterThan (InvertFlags x)) 4739 // cond: 4740 // result: (LessThan x) 4741 for { 4742 v_0 := v.Args[0] 4743 if v_0.Op != OpARMInvertFlags { 4744 break 4745 } 4746 x := v_0.Args[0] 4747 v.reset(OpARMLessThan) 4748 v.AddArg(x) 4749 return true 4750 } 4751 return false 4752 } 4753 func rewriteValueARM_OpARMGreaterThanU(v *Value, config *Config) bool { 4754 b := v.Block 4755 _ = b 4756 // match: (GreaterThanU (FlagEQ)) 4757 // cond: 4758 // result: (MOVWconst [0]) 4759 for { 4760 v_0 := v.Args[0] 4761 if v_0.Op != OpARMFlagEQ { 4762 break 4763 } 4764 v.reset(OpARMMOVWconst) 4765 v.AuxInt = 0 4766 return true 4767 } 4768 // match: (GreaterThanU (FlagLT_ULT)) 4769 // cond: 4770 // result: (MOVWconst [0]) 4771 for { 4772 v_0 := v.Args[0] 4773 if v_0.Op != OpARMFlagLT_ULT { 4774 break 4775 } 4776 v.reset(OpARMMOVWconst) 4777 v.AuxInt = 0 4778 return true 4779 } 4780 // match: (GreaterThanU (FlagLT_UGT)) 4781 // cond: 4782 // result: (MOVWconst [1]) 4783 for { 4784 v_0 := v.Args[0] 4785 if v_0.Op != OpARMFlagLT_UGT { 4786 break 4787 } 4788 v.reset(OpARMMOVWconst) 4789 v.AuxInt = 1 4790 return true 4791 } 4792 // match: (GreaterThanU (FlagGT_ULT)) 4793 // cond: 4794 // result: (MOVWconst [0]) 4795 for { 4796 v_0 := v.Args[0] 4797 if v_0.Op != OpARMFlagGT_ULT { 4798 break 4799 } 4800 v.reset(OpARMMOVWconst) 4801 v.AuxInt = 0 4802 return true 4803 } 4804 // match: (GreaterThanU (FlagGT_UGT)) 4805 // cond: 4806 // result: (MOVWconst [1]) 4807 for { 4808 v_0 := v.Args[0] 4809 if v_0.Op != OpARMFlagGT_UGT { 4810 break 4811 } 4812 v.reset(OpARMMOVWconst) 4813 v.AuxInt = 1 4814 return true 4815 } 4816 // match: (GreaterThanU (InvertFlags x)) 4817 // cond: 4818 // result: (LessThanU x) 4819 for { 4820 v_0 := v.Args[0] 4821 if v_0.Op != OpARMInvertFlags { 4822 break 4823 } 4824 x := v_0.Args[0] 4825 v.reset(OpARMLessThanU) 4826 v.AddArg(x) 4827 return true 4828 } 4829 return false 4830 } 4831 func rewriteValueARM_OpARMLessEqual(v *Value, config *Config) bool { 4832 b := v.Block 4833 _ = b 4834 // match: (LessEqual (FlagEQ)) 4835 // cond: 4836 // result: (MOVWconst [1]) 4837 for { 4838 v_0 := v.Args[0] 4839 if v_0.Op != OpARMFlagEQ { 4840 break 4841 } 4842 v.reset(OpARMMOVWconst) 4843 v.AuxInt = 1 4844 return true 4845 } 4846 // match: (LessEqual (FlagLT_ULT)) 4847 // cond: 4848 // result: (MOVWconst [1]) 4849 for { 4850 v_0 := v.Args[0] 4851 if v_0.Op != OpARMFlagLT_ULT { 4852 break 4853 } 4854 v.reset(OpARMMOVWconst) 4855 v.AuxInt = 1 4856 return true 4857 } 4858 // match: (LessEqual (FlagLT_UGT)) 4859 // cond: 4860 // result: (MOVWconst [1]) 4861 for { 4862 v_0 := v.Args[0] 4863 if v_0.Op != OpARMFlagLT_UGT { 4864 break 4865 } 4866 v.reset(OpARMMOVWconst) 4867 v.AuxInt = 1 4868 return true 4869 } 4870 // match: (LessEqual (FlagGT_ULT)) 4871 // cond: 4872 // result: (MOVWconst [0]) 4873 for { 4874 v_0 := v.Args[0] 4875 if v_0.Op != OpARMFlagGT_ULT { 4876 break 4877 } 4878 v.reset(OpARMMOVWconst) 4879 v.AuxInt = 0 4880 return true 4881 } 4882 // match: (LessEqual (FlagGT_UGT)) 4883 // cond: 4884 // result: (MOVWconst [0]) 4885 for { 4886 v_0 := v.Args[0] 4887 if v_0.Op != OpARMFlagGT_UGT { 4888 break 4889 } 4890 v.reset(OpARMMOVWconst) 4891 v.AuxInt = 0 4892 return true 4893 } 4894 // match: (LessEqual (InvertFlags x)) 4895 // cond: 4896 // result: (GreaterEqual x) 4897 for { 4898 v_0 := v.Args[0] 4899 if v_0.Op != OpARMInvertFlags { 4900 break 4901 } 4902 x := v_0.Args[0] 4903 v.reset(OpARMGreaterEqual) 4904 v.AddArg(x) 4905 return true 4906 } 4907 return false 4908 } 4909 func rewriteValueARM_OpARMLessEqualU(v *Value, config *Config) bool { 4910 b := v.Block 4911 _ = b 4912 // match: (LessEqualU (FlagEQ)) 4913 // cond: 4914 // result: (MOVWconst [1]) 4915 for { 4916 v_0 := v.Args[0] 4917 if v_0.Op != OpARMFlagEQ { 4918 break 4919 } 4920 v.reset(OpARMMOVWconst) 4921 v.AuxInt = 1 4922 return true 4923 } 4924 // match: (LessEqualU (FlagLT_ULT)) 4925 // cond: 4926 // result: (MOVWconst [1]) 4927 for { 4928 v_0 := v.Args[0] 4929 if v_0.Op != OpARMFlagLT_ULT { 4930 break 4931 } 4932 v.reset(OpARMMOVWconst) 4933 v.AuxInt = 1 4934 return true 4935 } 4936 // match: (LessEqualU (FlagLT_UGT)) 4937 // cond: 4938 // result: (MOVWconst [0]) 4939 for { 4940 v_0 := v.Args[0] 4941 if v_0.Op != OpARMFlagLT_UGT { 4942 break 4943 } 4944 v.reset(OpARMMOVWconst) 4945 v.AuxInt = 0 4946 return true 4947 } 4948 // match: (LessEqualU (FlagGT_ULT)) 4949 // cond: 4950 // result: (MOVWconst [1]) 4951 for { 4952 v_0 := v.Args[0] 4953 if v_0.Op != OpARMFlagGT_ULT { 4954 break 4955 } 4956 v.reset(OpARMMOVWconst) 4957 v.AuxInt = 1 4958 return true 4959 } 4960 // match: (LessEqualU (FlagGT_UGT)) 4961 // cond: 4962 // result: (MOVWconst [0]) 4963 for { 4964 v_0 := v.Args[0] 4965 if v_0.Op != OpARMFlagGT_UGT { 4966 break 4967 } 4968 v.reset(OpARMMOVWconst) 4969 v.AuxInt = 0 4970 return true 4971 } 4972 // match: (LessEqualU (InvertFlags x)) 4973 // cond: 4974 // result: (GreaterEqualU x) 4975 for { 4976 v_0 := v.Args[0] 4977 if v_0.Op != OpARMInvertFlags { 4978 break 4979 } 4980 x := v_0.Args[0] 4981 v.reset(OpARMGreaterEqualU) 4982 v.AddArg(x) 4983 return true 4984 } 4985 return false 4986 } 4987 func rewriteValueARM_OpARMLessThan(v *Value, config *Config) bool { 4988 b := v.Block 4989 _ = b 4990 // match: (LessThan (FlagEQ)) 4991 // cond: 4992 // result: (MOVWconst [0]) 4993 for { 4994 v_0 := v.Args[0] 4995 if v_0.Op != OpARMFlagEQ { 4996 break 4997 } 4998 v.reset(OpARMMOVWconst) 4999 v.AuxInt = 0 5000 return true 5001 } 5002 // match: (LessThan (FlagLT_ULT)) 5003 // cond: 5004 // result: (MOVWconst [1]) 5005 for { 5006 v_0 := v.Args[0] 5007 if v_0.Op != OpARMFlagLT_ULT { 5008 break 5009 } 5010 v.reset(OpARMMOVWconst) 5011 v.AuxInt = 1 5012 return true 5013 } 5014 // match: (LessThan (FlagLT_UGT)) 5015 // cond: 5016 // result: (MOVWconst [1]) 5017 for { 5018 v_0 := v.Args[0] 5019 if v_0.Op != OpARMFlagLT_UGT { 5020 break 5021 } 5022 v.reset(OpARMMOVWconst) 5023 v.AuxInt = 1 5024 return true 5025 } 5026 // match: (LessThan (FlagGT_ULT)) 5027 // cond: 5028 // result: (MOVWconst [0]) 5029 for { 5030 v_0 := v.Args[0] 5031 if v_0.Op != OpARMFlagGT_ULT { 5032 break 5033 } 5034 v.reset(OpARMMOVWconst) 5035 v.AuxInt = 0 5036 return true 5037 } 5038 // match: (LessThan (FlagGT_UGT)) 5039 // cond: 5040 // result: (MOVWconst [0]) 5041 for { 5042 v_0 := v.Args[0] 5043 if v_0.Op != OpARMFlagGT_UGT { 5044 break 5045 } 5046 v.reset(OpARMMOVWconst) 5047 v.AuxInt = 0 5048 return true 5049 } 5050 // match: (LessThan (InvertFlags x)) 5051 // cond: 5052 // result: (GreaterThan x) 5053 for { 5054 v_0 := v.Args[0] 5055 if v_0.Op != OpARMInvertFlags { 5056 break 5057 } 5058 x := v_0.Args[0] 5059 v.reset(OpARMGreaterThan) 5060 v.AddArg(x) 5061 return true 5062 } 5063 return false 5064 } 5065 func rewriteValueARM_OpARMLessThanU(v *Value, config *Config) bool { 5066 b := v.Block 5067 _ = b 5068 // match: (LessThanU (FlagEQ)) 5069 // cond: 5070 // result: (MOVWconst [0]) 5071 for { 5072 v_0 := v.Args[0] 5073 if v_0.Op != OpARMFlagEQ { 5074 break 5075 } 5076 v.reset(OpARMMOVWconst) 5077 v.AuxInt = 0 5078 return true 5079 } 5080 // match: (LessThanU (FlagLT_ULT)) 5081 // cond: 5082 // result: (MOVWconst [1]) 5083 for { 5084 v_0 := v.Args[0] 5085 if v_0.Op != OpARMFlagLT_ULT { 5086 break 5087 } 5088 v.reset(OpARMMOVWconst) 5089 v.AuxInt = 1 5090 return true 5091 } 5092 // match: (LessThanU (FlagLT_UGT)) 5093 // cond: 5094 // result: (MOVWconst [0]) 5095 for { 5096 v_0 := v.Args[0] 5097 if v_0.Op != OpARMFlagLT_UGT { 5098 break 5099 } 5100 v.reset(OpARMMOVWconst) 5101 v.AuxInt = 0 5102 return true 5103 } 5104 // match: (LessThanU (FlagGT_ULT)) 5105 // cond: 5106 // result: (MOVWconst [1]) 5107 for { 5108 v_0 := v.Args[0] 5109 if v_0.Op != OpARMFlagGT_ULT { 5110 break 5111 } 5112 v.reset(OpARMMOVWconst) 5113 v.AuxInt = 1 5114 return true 5115 } 5116 // match: (LessThanU (FlagGT_UGT)) 5117 // cond: 5118 // result: (MOVWconst [0]) 5119 for { 5120 v_0 := v.Args[0] 5121 if v_0.Op != OpARMFlagGT_UGT { 5122 break 5123 } 5124 v.reset(OpARMMOVWconst) 5125 v.AuxInt = 0 5126 return true 5127 } 5128 // match: (LessThanU (InvertFlags x)) 5129 // cond: 5130 // result: (GreaterThanU x) 5131 for { 5132 v_0 := v.Args[0] 5133 if v_0.Op != OpARMInvertFlags { 5134 break 5135 } 5136 x := v_0.Args[0] 5137 v.reset(OpARMGreaterThanU) 5138 v.AddArg(x) 5139 return true 5140 } 5141 return false 5142 } 5143 func rewriteValueARM_OpARMMOVBUload(v *Value, config *Config) bool { 5144 b := v.Block 5145 _ = b 5146 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 5147 // cond: 5148 // result: (MOVBUload [off1+off2] {sym} ptr mem) 5149 for { 5150 off1 := v.AuxInt 5151 sym := v.Aux 5152 v_0 := v.Args[0] 5153 if v_0.Op != OpARMADDconst { 5154 break 5155 } 5156 off2 := v_0.AuxInt 5157 ptr := v_0.Args[0] 5158 mem := v.Args[1] 5159 v.reset(OpARMMOVBUload) 5160 v.AuxInt = off1 + off2 5161 v.Aux = sym 5162 v.AddArg(ptr) 5163 v.AddArg(mem) 5164 return true 5165 } 5166 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5167 // cond: canMergeSym(sym1,sym2) 5168 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5169 for { 5170 off1 := v.AuxInt 5171 sym1 := v.Aux 5172 v_0 := v.Args[0] 5173 if v_0.Op != OpARMMOVWaddr { 5174 break 5175 } 5176 off2 := v_0.AuxInt 5177 sym2 := v_0.Aux 5178 ptr := v_0.Args[0] 5179 mem := v.Args[1] 5180 if !(canMergeSym(sym1, sym2)) { 5181 break 5182 } 5183 v.reset(OpARMMOVBUload) 5184 v.AuxInt = off1 + off2 5185 v.Aux = mergeSym(sym1, sym2) 5186 v.AddArg(ptr) 5187 v.AddArg(mem) 5188 return true 5189 } 5190 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5191 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type) 5192 // result: x 5193 for { 5194 off := v.AuxInt 5195 sym := v.Aux 5196 ptr := v.Args[0] 5197 v_1 := v.Args[1] 5198 if v_1.Op != OpARMMOVBstore { 5199 break 5200 } 5201 off2 := v_1.AuxInt 5202 sym2 := v_1.Aux 5203 ptr2 := v_1.Args[0] 5204 x := v_1.Args[1] 5205 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type)) { 5206 break 5207 } 5208 v.reset(OpCopy) 5209 v.Type = x.Type 5210 v.AddArg(x) 5211 return true 5212 } 5213 return false 5214 } 5215 func rewriteValueARM_OpARMMOVBUreg(v *Value, config *Config) bool { 5216 b := v.Block 5217 _ = b 5218 // match: (MOVBUreg x:(MOVBUload _ _)) 5219 // cond: 5220 // result: (MOVWreg x) 5221 for { 5222 x := v.Args[0] 5223 if x.Op != OpARMMOVBUload { 5224 break 5225 } 5226 v.reset(OpARMMOVWreg) 5227 v.AddArg(x) 5228 return true 5229 } 5230 // match: (MOVBUreg (ANDconst [c] x)) 5231 // cond: 5232 // result: (ANDconst [c&0xff] x) 5233 for { 5234 v_0 := v.Args[0] 5235 if v_0.Op != OpARMANDconst { 5236 break 5237 } 5238 c := v_0.AuxInt 5239 x := v_0.Args[0] 5240 v.reset(OpARMANDconst) 5241 v.AuxInt = c & 0xff 5242 v.AddArg(x) 5243 return true 5244 } 5245 // match: (MOVBUreg x:(MOVBUreg _)) 5246 // cond: 5247 // result: (MOVWreg x) 5248 for { 5249 x := v.Args[0] 5250 if x.Op != OpARMMOVBUreg { 5251 break 5252 } 5253 v.reset(OpARMMOVWreg) 5254 v.AddArg(x) 5255 return true 5256 } 5257 // match: (MOVBUreg (MOVWconst [c])) 5258 // cond: 5259 // result: (MOVWconst [int64(uint8(c))]) 5260 for { 5261 v_0 := v.Args[0] 5262 if v_0.Op != OpARMMOVWconst { 5263 break 5264 } 5265 c := v_0.AuxInt 5266 v.reset(OpARMMOVWconst) 5267 v.AuxInt = int64(uint8(c)) 5268 return true 5269 } 5270 return false 5271 } 5272 func rewriteValueARM_OpARMMOVBload(v *Value, config *Config) bool { 5273 b := v.Block 5274 _ = b 5275 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 5276 // cond: 5277 // result: (MOVBload [off1+off2] {sym} ptr mem) 5278 for { 5279 off1 := v.AuxInt 5280 sym := v.Aux 5281 v_0 := v.Args[0] 5282 if v_0.Op != OpARMADDconst { 5283 break 5284 } 5285 off2 := v_0.AuxInt 5286 ptr := v_0.Args[0] 5287 mem := v.Args[1] 5288 v.reset(OpARMMOVBload) 5289 v.AuxInt = off1 + off2 5290 v.Aux = sym 5291 v.AddArg(ptr) 5292 v.AddArg(mem) 5293 return true 5294 } 5295 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5296 // cond: canMergeSym(sym1,sym2) 5297 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5298 for { 5299 off1 := v.AuxInt 5300 sym1 := v.Aux 5301 v_0 := v.Args[0] 5302 if v_0.Op != OpARMMOVWaddr { 5303 break 5304 } 5305 off2 := v_0.AuxInt 5306 sym2 := v_0.Aux 5307 ptr := v_0.Args[0] 5308 mem := v.Args[1] 5309 if !(canMergeSym(sym1, sym2)) { 5310 break 5311 } 5312 v.reset(OpARMMOVBload) 5313 v.AuxInt = off1 + off2 5314 v.Aux = mergeSym(sym1, sym2) 5315 v.AddArg(ptr) 5316 v.AddArg(mem) 5317 return true 5318 } 5319 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5320 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type) 5321 // result: x 5322 for { 5323 off := v.AuxInt 5324 sym := v.Aux 5325 ptr := v.Args[0] 5326 v_1 := v.Args[1] 5327 if v_1.Op != OpARMMOVBstore { 5328 break 5329 } 5330 off2 := v_1.AuxInt 5331 sym2 := v_1.Aux 5332 ptr2 := v_1.Args[0] 5333 x := v_1.Args[1] 5334 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type)) { 5335 break 5336 } 5337 v.reset(OpCopy) 5338 v.Type = x.Type 5339 v.AddArg(x) 5340 return true 5341 } 5342 return false 5343 } 5344 func rewriteValueARM_OpARMMOVBreg(v *Value, config *Config) bool { 5345 b := v.Block 5346 _ = b 5347 // match: (MOVBreg x:(MOVBload _ _)) 5348 // cond: 5349 // result: (MOVWreg x) 5350 for { 5351 x := v.Args[0] 5352 if x.Op != OpARMMOVBload { 5353 break 5354 } 5355 v.reset(OpARMMOVWreg) 5356 v.AddArg(x) 5357 return true 5358 } 5359 // match: (MOVBreg (ANDconst [c] x)) 5360 // cond: c & 0x80 == 0 5361 // result: (ANDconst [c&0x7f] x) 5362 for { 5363 v_0 := v.Args[0] 5364 if v_0.Op != OpARMANDconst { 5365 break 5366 } 5367 c := v_0.AuxInt 5368 x := v_0.Args[0] 5369 if !(c&0x80 == 0) { 5370 break 5371 } 5372 v.reset(OpARMANDconst) 5373 v.AuxInt = c & 0x7f 5374 v.AddArg(x) 5375 return true 5376 } 5377 // match: (MOVBreg x:(MOVBreg _)) 5378 // cond: 5379 // result: (MOVWreg x) 5380 for { 5381 x := v.Args[0] 5382 if x.Op != OpARMMOVBreg { 5383 break 5384 } 5385 v.reset(OpARMMOVWreg) 5386 v.AddArg(x) 5387 return true 5388 } 5389 // match: (MOVBreg (MOVWconst [c])) 5390 // cond: 5391 // result: (MOVWconst [int64(int8(c))]) 5392 for { 5393 v_0 := v.Args[0] 5394 if v_0.Op != OpARMMOVWconst { 5395 break 5396 } 5397 c := v_0.AuxInt 5398 v.reset(OpARMMOVWconst) 5399 v.AuxInt = int64(int8(c)) 5400 return true 5401 } 5402 return false 5403 } 5404 func rewriteValueARM_OpARMMOVBstore(v *Value, config *Config) bool { 5405 b := v.Block 5406 _ = b 5407 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5408 // cond: 5409 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 5410 for { 5411 off1 := v.AuxInt 5412 sym := v.Aux 5413 v_0 := v.Args[0] 5414 if v_0.Op != OpARMADDconst { 5415 break 5416 } 5417 off2 := v_0.AuxInt 5418 ptr := v_0.Args[0] 5419 val := v.Args[1] 5420 mem := v.Args[2] 5421 v.reset(OpARMMOVBstore) 5422 v.AuxInt = off1 + off2 5423 v.Aux = sym 5424 v.AddArg(ptr) 5425 v.AddArg(val) 5426 v.AddArg(mem) 5427 return true 5428 } 5429 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5430 // cond: canMergeSym(sym1,sym2) 5431 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5432 for { 5433 off1 := v.AuxInt 5434 sym1 := v.Aux 5435 v_0 := v.Args[0] 5436 if v_0.Op != OpARMMOVWaddr { 5437 break 5438 } 5439 off2 := v_0.AuxInt 5440 sym2 := v_0.Aux 5441 ptr := v_0.Args[0] 5442 val := v.Args[1] 5443 mem := v.Args[2] 5444 if !(canMergeSym(sym1, sym2)) { 5445 break 5446 } 5447 v.reset(OpARMMOVBstore) 5448 v.AuxInt = off1 + off2 5449 v.Aux = mergeSym(sym1, sym2) 5450 v.AddArg(ptr) 5451 v.AddArg(val) 5452 v.AddArg(mem) 5453 return true 5454 } 5455 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 5456 // cond: 5457 // result: (MOVBstore [off] {sym} ptr x mem) 5458 for { 5459 off := v.AuxInt 5460 sym := v.Aux 5461 ptr := v.Args[0] 5462 v_1 := v.Args[1] 5463 if v_1.Op != OpARMMOVBreg { 5464 break 5465 } 5466 x := v_1.Args[0] 5467 mem := v.Args[2] 5468 v.reset(OpARMMOVBstore) 5469 v.AuxInt = off 5470 v.Aux = sym 5471 v.AddArg(ptr) 5472 v.AddArg(x) 5473 v.AddArg(mem) 5474 return true 5475 } 5476 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 5477 // cond: 5478 // result: (MOVBstore [off] {sym} ptr x mem) 5479 for { 5480 off := v.AuxInt 5481 sym := v.Aux 5482 ptr := v.Args[0] 5483 v_1 := v.Args[1] 5484 if v_1.Op != OpARMMOVBUreg { 5485 break 5486 } 5487 x := v_1.Args[0] 5488 mem := v.Args[2] 5489 v.reset(OpARMMOVBstore) 5490 v.AuxInt = off 5491 v.Aux = sym 5492 v.AddArg(ptr) 5493 v.AddArg(x) 5494 v.AddArg(mem) 5495 return true 5496 } 5497 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 5498 // cond: 5499 // result: (MOVBstore [off] {sym} ptr x mem) 5500 for { 5501 off := v.AuxInt 5502 sym := v.Aux 5503 ptr := v.Args[0] 5504 v_1 := v.Args[1] 5505 if v_1.Op != OpARMMOVHreg { 5506 break 5507 } 5508 x := v_1.Args[0] 5509 mem := v.Args[2] 5510 v.reset(OpARMMOVBstore) 5511 v.AuxInt = off 5512 v.Aux = sym 5513 v.AddArg(ptr) 5514 v.AddArg(x) 5515 v.AddArg(mem) 5516 return true 5517 } 5518 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 5519 // cond: 5520 // result: (MOVBstore [off] {sym} ptr x mem) 5521 for { 5522 off := v.AuxInt 5523 sym := v.Aux 5524 ptr := v.Args[0] 5525 v_1 := v.Args[1] 5526 if v_1.Op != OpARMMOVHUreg { 5527 break 5528 } 5529 x := v_1.Args[0] 5530 mem := v.Args[2] 5531 v.reset(OpARMMOVBstore) 5532 v.AuxInt = off 5533 v.Aux = sym 5534 v.AddArg(ptr) 5535 v.AddArg(x) 5536 v.AddArg(mem) 5537 return true 5538 } 5539 return false 5540 } 5541 func rewriteValueARM_OpARMMOVDload(v *Value, config *Config) bool { 5542 b := v.Block 5543 _ = b 5544 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 5545 // cond: 5546 // result: (MOVDload [off1+off2] {sym} ptr mem) 5547 for { 5548 off1 := v.AuxInt 5549 sym := v.Aux 5550 v_0 := v.Args[0] 5551 if v_0.Op != OpARMADDconst { 5552 break 5553 } 5554 off2 := v_0.AuxInt 5555 ptr := v_0.Args[0] 5556 mem := v.Args[1] 5557 v.reset(OpARMMOVDload) 5558 v.AuxInt = off1 + off2 5559 v.Aux = sym 5560 v.AddArg(ptr) 5561 v.AddArg(mem) 5562 return true 5563 } 5564 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5565 // cond: canMergeSym(sym1,sym2) 5566 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5567 for { 5568 off1 := v.AuxInt 5569 sym1 := v.Aux 5570 v_0 := v.Args[0] 5571 if v_0.Op != OpARMMOVWaddr { 5572 break 5573 } 5574 off2 := v_0.AuxInt 5575 sym2 := v_0.Aux 5576 ptr := v_0.Args[0] 5577 mem := v.Args[1] 5578 if !(canMergeSym(sym1, sym2)) { 5579 break 5580 } 5581 v.reset(OpARMMOVDload) 5582 v.AuxInt = off1 + off2 5583 v.Aux = mergeSym(sym1, sym2) 5584 v.AddArg(ptr) 5585 v.AddArg(mem) 5586 return true 5587 } 5588 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 5589 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5590 // result: x 5591 for { 5592 off := v.AuxInt 5593 sym := v.Aux 5594 ptr := v.Args[0] 5595 v_1 := v.Args[1] 5596 if v_1.Op != OpARMMOVDstore { 5597 break 5598 } 5599 off2 := v_1.AuxInt 5600 sym2 := v_1.Aux 5601 ptr2 := v_1.Args[0] 5602 x := v_1.Args[1] 5603 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5604 break 5605 } 5606 v.reset(OpCopy) 5607 v.Type = x.Type 5608 v.AddArg(x) 5609 return true 5610 } 5611 return false 5612 } 5613 func rewriteValueARM_OpARMMOVDstore(v *Value, config *Config) bool { 5614 b := v.Block 5615 _ = b 5616 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5617 // cond: 5618 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 5619 for { 5620 off1 := v.AuxInt 5621 sym := v.Aux 5622 v_0 := v.Args[0] 5623 if v_0.Op != OpARMADDconst { 5624 break 5625 } 5626 off2 := v_0.AuxInt 5627 ptr := v_0.Args[0] 5628 val := v.Args[1] 5629 mem := v.Args[2] 5630 v.reset(OpARMMOVDstore) 5631 v.AuxInt = off1 + off2 5632 v.Aux = sym 5633 v.AddArg(ptr) 5634 v.AddArg(val) 5635 v.AddArg(mem) 5636 return true 5637 } 5638 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5639 // cond: canMergeSym(sym1,sym2) 5640 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5641 for { 5642 off1 := v.AuxInt 5643 sym1 := v.Aux 5644 v_0 := v.Args[0] 5645 if v_0.Op != OpARMMOVWaddr { 5646 break 5647 } 5648 off2 := v_0.AuxInt 5649 sym2 := v_0.Aux 5650 ptr := v_0.Args[0] 5651 val := v.Args[1] 5652 mem := v.Args[2] 5653 if !(canMergeSym(sym1, sym2)) { 5654 break 5655 } 5656 v.reset(OpARMMOVDstore) 5657 v.AuxInt = off1 + off2 5658 v.Aux = mergeSym(sym1, sym2) 5659 v.AddArg(ptr) 5660 v.AddArg(val) 5661 v.AddArg(mem) 5662 return true 5663 } 5664 return false 5665 } 5666 func rewriteValueARM_OpARMMOVFload(v *Value, config *Config) bool { 5667 b := v.Block 5668 _ = b 5669 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 5670 // cond: 5671 // result: (MOVFload [off1+off2] {sym} ptr mem) 5672 for { 5673 off1 := v.AuxInt 5674 sym := v.Aux 5675 v_0 := v.Args[0] 5676 if v_0.Op != OpARMADDconst { 5677 break 5678 } 5679 off2 := v_0.AuxInt 5680 ptr := v_0.Args[0] 5681 mem := v.Args[1] 5682 v.reset(OpARMMOVFload) 5683 v.AuxInt = off1 + off2 5684 v.Aux = sym 5685 v.AddArg(ptr) 5686 v.AddArg(mem) 5687 return true 5688 } 5689 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5690 // cond: canMergeSym(sym1,sym2) 5691 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5692 for { 5693 off1 := v.AuxInt 5694 sym1 := v.Aux 5695 v_0 := v.Args[0] 5696 if v_0.Op != OpARMMOVWaddr { 5697 break 5698 } 5699 off2 := v_0.AuxInt 5700 sym2 := v_0.Aux 5701 ptr := v_0.Args[0] 5702 mem := v.Args[1] 5703 if !(canMergeSym(sym1, sym2)) { 5704 break 5705 } 5706 v.reset(OpARMMOVFload) 5707 v.AuxInt = off1 + off2 5708 v.Aux = mergeSym(sym1, sym2) 5709 v.AddArg(ptr) 5710 v.AddArg(mem) 5711 return true 5712 } 5713 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 5714 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5715 // result: x 5716 for { 5717 off := v.AuxInt 5718 sym := v.Aux 5719 ptr := v.Args[0] 5720 v_1 := v.Args[1] 5721 if v_1.Op != OpARMMOVFstore { 5722 break 5723 } 5724 off2 := v_1.AuxInt 5725 sym2 := v_1.Aux 5726 ptr2 := v_1.Args[0] 5727 x := v_1.Args[1] 5728 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5729 break 5730 } 5731 v.reset(OpCopy) 5732 v.Type = x.Type 5733 v.AddArg(x) 5734 return true 5735 } 5736 return false 5737 } 5738 func rewriteValueARM_OpARMMOVFstore(v *Value, config *Config) bool { 5739 b := v.Block 5740 _ = b 5741 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5742 // cond: 5743 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 5744 for { 5745 off1 := v.AuxInt 5746 sym := v.Aux 5747 v_0 := v.Args[0] 5748 if v_0.Op != OpARMADDconst { 5749 break 5750 } 5751 off2 := v_0.AuxInt 5752 ptr := v_0.Args[0] 5753 val := v.Args[1] 5754 mem := v.Args[2] 5755 v.reset(OpARMMOVFstore) 5756 v.AuxInt = off1 + off2 5757 v.Aux = sym 5758 v.AddArg(ptr) 5759 v.AddArg(val) 5760 v.AddArg(mem) 5761 return true 5762 } 5763 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5764 // cond: canMergeSym(sym1,sym2) 5765 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5766 for { 5767 off1 := v.AuxInt 5768 sym1 := v.Aux 5769 v_0 := v.Args[0] 5770 if v_0.Op != OpARMMOVWaddr { 5771 break 5772 } 5773 off2 := v_0.AuxInt 5774 sym2 := v_0.Aux 5775 ptr := v_0.Args[0] 5776 val := v.Args[1] 5777 mem := v.Args[2] 5778 if !(canMergeSym(sym1, sym2)) { 5779 break 5780 } 5781 v.reset(OpARMMOVFstore) 5782 v.AuxInt = off1 + off2 5783 v.Aux = mergeSym(sym1, sym2) 5784 v.AddArg(ptr) 5785 v.AddArg(val) 5786 v.AddArg(mem) 5787 return true 5788 } 5789 return false 5790 } 5791 func rewriteValueARM_OpARMMOVHUload(v *Value, config *Config) bool { 5792 b := v.Block 5793 _ = b 5794 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 5795 // cond: 5796 // result: (MOVHUload [off1+off2] {sym} ptr mem) 5797 for { 5798 off1 := v.AuxInt 5799 sym := v.Aux 5800 v_0 := v.Args[0] 5801 if v_0.Op != OpARMADDconst { 5802 break 5803 } 5804 off2 := v_0.AuxInt 5805 ptr := v_0.Args[0] 5806 mem := v.Args[1] 5807 v.reset(OpARMMOVHUload) 5808 v.AuxInt = off1 + off2 5809 v.Aux = sym 5810 v.AddArg(ptr) 5811 v.AddArg(mem) 5812 return true 5813 } 5814 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5815 // cond: canMergeSym(sym1,sym2) 5816 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5817 for { 5818 off1 := v.AuxInt 5819 sym1 := v.Aux 5820 v_0 := v.Args[0] 5821 if v_0.Op != OpARMMOVWaddr { 5822 break 5823 } 5824 off2 := v_0.AuxInt 5825 sym2 := v_0.Aux 5826 ptr := v_0.Args[0] 5827 mem := v.Args[1] 5828 if !(canMergeSym(sym1, sym2)) { 5829 break 5830 } 5831 v.reset(OpARMMOVHUload) 5832 v.AuxInt = off1 + off2 5833 v.Aux = mergeSym(sym1, sym2) 5834 v.AddArg(ptr) 5835 v.AddArg(mem) 5836 return true 5837 } 5838 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5839 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type) 5840 // result: x 5841 for { 5842 off := v.AuxInt 5843 sym := v.Aux 5844 ptr := v.Args[0] 5845 v_1 := v.Args[1] 5846 if v_1.Op != OpARMMOVHstore { 5847 break 5848 } 5849 off2 := v_1.AuxInt 5850 sym2 := v_1.Aux 5851 ptr2 := v_1.Args[0] 5852 x := v_1.Args[1] 5853 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type)) { 5854 break 5855 } 5856 v.reset(OpCopy) 5857 v.Type = x.Type 5858 v.AddArg(x) 5859 return true 5860 } 5861 return false 5862 } 5863 func rewriteValueARM_OpARMMOVHUreg(v *Value, config *Config) bool { 5864 b := v.Block 5865 _ = b 5866 // match: (MOVHUreg x:(MOVBUload _ _)) 5867 // cond: 5868 // result: (MOVWreg x) 5869 for { 5870 x := v.Args[0] 5871 if x.Op != OpARMMOVBUload { 5872 break 5873 } 5874 v.reset(OpARMMOVWreg) 5875 v.AddArg(x) 5876 return true 5877 } 5878 // match: (MOVHUreg x:(MOVHUload _ _)) 5879 // cond: 5880 // result: (MOVWreg x) 5881 for { 5882 x := v.Args[0] 5883 if x.Op != OpARMMOVHUload { 5884 break 5885 } 5886 v.reset(OpARMMOVWreg) 5887 v.AddArg(x) 5888 return true 5889 } 5890 // match: (MOVHUreg (ANDconst [c] x)) 5891 // cond: 5892 // result: (ANDconst [c&0xffff] x) 5893 for { 5894 v_0 := v.Args[0] 5895 if v_0.Op != OpARMANDconst { 5896 break 5897 } 5898 c := v_0.AuxInt 5899 x := v_0.Args[0] 5900 v.reset(OpARMANDconst) 5901 v.AuxInt = c & 0xffff 5902 v.AddArg(x) 5903 return true 5904 } 5905 // match: (MOVHUreg x:(MOVBUreg _)) 5906 // cond: 5907 // result: (MOVWreg x) 5908 for { 5909 x := v.Args[0] 5910 if x.Op != OpARMMOVBUreg { 5911 break 5912 } 5913 v.reset(OpARMMOVWreg) 5914 v.AddArg(x) 5915 return true 5916 } 5917 // match: (MOVHUreg x:(MOVHUreg _)) 5918 // cond: 5919 // result: (MOVWreg x) 5920 for { 5921 x := v.Args[0] 5922 if x.Op != OpARMMOVHUreg { 5923 break 5924 } 5925 v.reset(OpARMMOVWreg) 5926 v.AddArg(x) 5927 return true 5928 } 5929 // match: (MOVHUreg (MOVWconst [c])) 5930 // cond: 5931 // result: (MOVWconst [int64(uint16(c))]) 5932 for { 5933 v_0 := v.Args[0] 5934 if v_0.Op != OpARMMOVWconst { 5935 break 5936 } 5937 c := v_0.AuxInt 5938 v.reset(OpARMMOVWconst) 5939 v.AuxInt = int64(uint16(c)) 5940 return true 5941 } 5942 return false 5943 } 5944 func rewriteValueARM_OpARMMOVHload(v *Value, config *Config) bool { 5945 b := v.Block 5946 _ = b 5947 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 5948 // cond: 5949 // result: (MOVHload [off1+off2] {sym} ptr mem) 5950 for { 5951 off1 := v.AuxInt 5952 sym := v.Aux 5953 v_0 := v.Args[0] 5954 if v_0.Op != OpARMADDconst { 5955 break 5956 } 5957 off2 := v_0.AuxInt 5958 ptr := v_0.Args[0] 5959 mem := v.Args[1] 5960 v.reset(OpARMMOVHload) 5961 v.AuxInt = off1 + off2 5962 v.Aux = sym 5963 v.AddArg(ptr) 5964 v.AddArg(mem) 5965 return true 5966 } 5967 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5968 // cond: canMergeSym(sym1,sym2) 5969 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5970 for { 5971 off1 := v.AuxInt 5972 sym1 := v.Aux 5973 v_0 := v.Args[0] 5974 if v_0.Op != OpARMMOVWaddr { 5975 break 5976 } 5977 off2 := v_0.AuxInt 5978 sym2 := v_0.Aux 5979 ptr := v_0.Args[0] 5980 mem := v.Args[1] 5981 if !(canMergeSym(sym1, sym2)) { 5982 break 5983 } 5984 v.reset(OpARMMOVHload) 5985 v.AuxInt = off1 + off2 5986 v.Aux = mergeSym(sym1, sym2) 5987 v.AddArg(ptr) 5988 v.AddArg(mem) 5989 return true 5990 } 5991 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5992 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type) 5993 // result: x 5994 for { 5995 off := v.AuxInt 5996 sym := v.Aux 5997 ptr := v.Args[0] 5998 v_1 := v.Args[1] 5999 if v_1.Op != OpARMMOVHstore { 6000 break 6001 } 6002 off2 := v_1.AuxInt 6003 sym2 := v_1.Aux 6004 ptr2 := v_1.Args[0] 6005 x := v_1.Args[1] 6006 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type)) { 6007 break 6008 } 6009 v.reset(OpCopy) 6010 v.Type = x.Type 6011 v.AddArg(x) 6012 return true 6013 } 6014 return false 6015 } 6016 func rewriteValueARM_OpARMMOVHreg(v *Value, config *Config) bool { 6017 b := v.Block 6018 _ = b 6019 // match: (MOVHreg x:(MOVBload _ _)) 6020 // cond: 6021 // result: (MOVWreg x) 6022 for { 6023 x := v.Args[0] 6024 if x.Op != OpARMMOVBload { 6025 break 6026 } 6027 v.reset(OpARMMOVWreg) 6028 v.AddArg(x) 6029 return true 6030 } 6031 // match: (MOVHreg x:(MOVBUload _ _)) 6032 // cond: 6033 // result: (MOVWreg x) 6034 for { 6035 x := v.Args[0] 6036 if x.Op != OpARMMOVBUload { 6037 break 6038 } 6039 v.reset(OpARMMOVWreg) 6040 v.AddArg(x) 6041 return true 6042 } 6043 // match: (MOVHreg x:(MOVHload _ _)) 6044 // cond: 6045 // result: (MOVWreg x) 6046 for { 6047 x := v.Args[0] 6048 if x.Op != OpARMMOVHload { 6049 break 6050 } 6051 v.reset(OpARMMOVWreg) 6052 v.AddArg(x) 6053 return true 6054 } 6055 // match: (MOVHreg (ANDconst [c] x)) 6056 // cond: c & 0x8000 == 0 6057 // result: (ANDconst [c&0x7fff] x) 6058 for { 6059 v_0 := v.Args[0] 6060 if v_0.Op != OpARMANDconst { 6061 break 6062 } 6063 c := v_0.AuxInt 6064 x := v_0.Args[0] 6065 if !(c&0x8000 == 0) { 6066 break 6067 } 6068 v.reset(OpARMANDconst) 6069 v.AuxInt = c & 0x7fff 6070 v.AddArg(x) 6071 return true 6072 } 6073 // match: (MOVHreg x:(MOVBreg _)) 6074 // cond: 6075 // result: (MOVWreg x) 6076 for { 6077 x := v.Args[0] 6078 if x.Op != OpARMMOVBreg { 6079 break 6080 } 6081 v.reset(OpARMMOVWreg) 6082 v.AddArg(x) 6083 return true 6084 } 6085 // match: (MOVHreg x:(MOVBUreg _)) 6086 // cond: 6087 // result: (MOVWreg x) 6088 for { 6089 x := v.Args[0] 6090 if x.Op != OpARMMOVBUreg { 6091 break 6092 } 6093 v.reset(OpARMMOVWreg) 6094 v.AddArg(x) 6095 return true 6096 } 6097 // match: (MOVHreg x:(MOVHreg _)) 6098 // cond: 6099 // result: (MOVWreg x) 6100 for { 6101 x := v.Args[0] 6102 if x.Op != OpARMMOVHreg { 6103 break 6104 } 6105 v.reset(OpARMMOVWreg) 6106 v.AddArg(x) 6107 return true 6108 } 6109 // match: (MOVHreg (MOVWconst [c])) 6110 // cond: 6111 // result: (MOVWconst [int64(int16(c))]) 6112 for { 6113 v_0 := v.Args[0] 6114 if v_0.Op != OpARMMOVWconst { 6115 break 6116 } 6117 c := v_0.AuxInt 6118 v.reset(OpARMMOVWconst) 6119 v.AuxInt = int64(int16(c)) 6120 return true 6121 } 6122 return false 6123 } 6124 func rewriteValueARM_OpARMMOVHstore(v *Value, config *Config) bool { 6125 b := v.Block 6126 _ = b 6127 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6128 // cond: 6129 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 6130 for { 6131 off1 := v.AuxInt 6132 sym := v.Aux 6133 v_0 := v.Args[0] 6134 if v_0.Op != OpARMADDconst { 6135 break 6136 } 6137 off2 := v_0.AuxInt 6138 ptr := v_0.Args[0] 6139 val := v.Args[1] 6140 mem := v.Args[2] 6141 v.reset(OpARMMOVHstore) 6142 v.AuxInt = off1 + off2 6143 v.Aux = sym 6144 v.AddArg(ptr) 6145 v.AddArg(val) 6146 v.AddArg(mem) 6147 return true 6148 } 6149 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6150 // cond: canMergeSym(sym1,sym2) 6151 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6152 for { 6153 off1 := v.AuxInt 6154 sym1 := v.Aux 6155 v_0 := v.Args[0] 6156 if v_0.Op != OpARMMOVWaddr { 6157 break 6158 } 6159 off2 := v_0.AuxInt 6160 sym2 := v_0.Aux 6161 ptr := v_0.Args[0] 6162 val := v.Args[1] 6163 mem := v.Args[2] 6164 if !(canMergeSym(sym1, sym2)) { 6165 break 6166 } 6167 v.reset(OpARMMOVHstore) 6168 v.AuxInt = off1 + off2 6169 v.Aux = mergeSym(sym1, sym2) 6170 v.AddArg(ptr) 6171 v.AddArg(val) 6172 v.AddArg(mem) 6173 return true 6174 } 6175 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 6176 // cond: 6177 // result: (MOVHstore [off] {sym} ptr x mem) 6178 for { 6179 off := v.AuxInt 6180 sym := v.Aux 6181 ptr := v.Args[0] 6182 v_1 := v.Args[1] 6183 if v_1.Op != OpARMMOVHreg { 6184 break 6185 } 6186 x := v_1.Args[0] 6187 mem := v.Args[2] 6188 v.reset(OpARMMOVHstore) 6189 v.AuxInt = off 6190 v.Aux = sym 6191 v.AddArg(ptr) 6192 v.AddArg(x) 6193 v.AddArg(mem) 6194 return true 6195 } 6196 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 6197 // cond: 6198 // result: (MOVHstore [off] {sym} ptr x mem) 6199 for { 6200 off := v.AuxInt 6201 sym := v.Aux 6202 ptr := v.Args[0] 6203 v_1 := v.Args[1] 6204 if v_1.Op != OpARMMOVHUreg { 6205 break 6206 } 6207 x := v_1.Args[0] 6208 mem := v.Args[2] 6209 v.reset(OpARMMOVHstore) 6210 v.AuxInt = off 6211 v.Aux = sym 6212 v.AddArg(ptr) 6213 v.AddArg(x) 6214 v.AddArg(mem) 6215 return true 6216 } 6217 return false 6218 } 6219 func rewriteValueARM_OpARMMOVWload(v *Value, config *Config) bool { 6220 b := v.Block 6221 _ = b 6222 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 6223 // cond: 6224 // result: (MOVWload [off1+off2] {sym} ptr mem) 6225 for { 6226 off1 := v.AuxInt 6227 sym := v.Aux 6228 v_0 := v.Args[0] 6229 if v_0.Op != OpARMADDconst { 6230 break 6231 } 6232 off2 := v_0.AuxInt 6233 ptr := v_0.Args[0] 6234 mem := v.Args[1] 6235 v.reset(OpARMMOVWload) 6236 v.AuxInt = off1 + off2 6237 v.Aux = sym 6238 v.AddArg(ptr) 6239 v.AddArg(mem) 6240 return true 6241 } 6242 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6243 // cond: canMergeSym(sym1,sym2) 6244 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6245 for { 6246 off1 := v.AuxInt 6247 sym1 := v.Aux 6248 v_0 := v.Args[0] 6249 if v_0.Op != OpARMMOVWaddr { 6250 break 6251 } 6252 off2 := v_0.AuxInt 6253 sym2 := v_0.Aux 6254 ptr := v_0.Args[0] 6255 mem := v.Args[1] 6256 if !(canMergeSym(sym1, sym2)) { 6257 break 6258 } 6259 v.reset(OpARMMOVWload) 6260 v.AuxInt = off1 + off2 6261 v.Aux = mergeSym(sym1, sym2) 6262 v.AddArg(ptr) 6263 v.AddArg(mem) 6264 return true 6265 } 6266 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6267 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6268 // result: x 6269 for { 6270 off := v.AuxInt 6271 sym := v.Aux 6272 ptr := v.Args[0] 6273 v_1 := v.Args[1] 6274 if v_1.Op != OpARMMOVWstore { 6275 break 6276 } 6277 off2 := v_1.AuxInt 6278 sym2 := v_1.Aux 6279 ptr2 := v_1.Args[0] 6280 x := v_1.Args[1] 6281 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6282 break 6283 } 6284 v.reset(OpCopy) 6285 v.Type = x.Type 6286 v.AddArg(x) 6287 return true 6288 } 6289 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 6290 // cond: sym == nil && !config.nacl 6291 // result: (MOVWloadidx ptr idx mem) 6292 for { 6293 if v.AuxInt != 0 { 6294 break 6295 } 6296 sym := v.Aux 6297 v_0 := v.Args[0] 6298 if v_0.Op != OpARMADD { 6299 break 6300 } 6301 ptr := v_0.Args[0] 6302 idx := v_0.Args[1] 6303 mem := v.Args[1] 6304 if !(sym == nil && !config.nacl) { 6305 break 6306 } 6307 v.reset(OpARMMOVWloadidx) 6308 v.AddArg(ptr) 6309 v.AddArg(idx) 6310 v.AddArg(mem) 6311 return true 6312 } 6313 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 6314 // cond: sym == nil && !config.nacl 6315 // result: (MOVWloadshiftLL ptr idx [c] mem) 6316 for { 6317 if v.AuxInt != 0 { 6318 break 6319 } 6320 sym := v.Aux 6321 v_0 := v.Args[0] 6322 if v_0.Op != OpARMADDshiftLL { 6323 break 6324 } 6325 c := v_0.AuxInt 6326 ptr := v_0.Args[0] 6327 idx := v_0.Args[1] 6328 mem := v.Args[1] 6329 if !(sym == nil && !config.nacl) { 6330 break 6331 } 6332 v.reset(OpARMMOVWloadshiftLL) 6333 v.AuxInt = c 6334 v.AddArg(ptr) 6335 v.AddArg(idx) 6336 v.AddArg(mem) 6337 return true 6338 } 6339 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 6340 // cond: sym == nil && !config.nacl 6341 // result: (MOVWloadshiftRL ptr idx [c] mem) 6342 for { 6343 if v.AuxInt != 0 { 6344 break 6345 } 6346 sym := v.Aux 6347 v_0 := v.Args[0] 6348 if v_0.Op != OpARMADDshiftRL { 6349 break 6350 } 6351 c := v_0.AuxInt 6352 ptr := v_0.Args[0] 6353 idx := v_0.Args[1] 6354 mem := v.Args[1] 6355 if !(sym == nil && !config.nacl) { 6356 break 6357 } 6358 v.reset(OpARMMOVWloadshiftRL) 6359 v.AuxInt = c 6360 v.AddArg(ptr) 6361 v.AddArg(idx) 6362 v.AddArg(mem) 6363 return true 6364 } 6365 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 6366 // cond: sym == nil && !config.nacl 6367 // result: (MOVWloadshiftRA ptr idx [c] mem) 6368 for { 6369 if v.AuxInt != 0 { 6370 break 6371 } 6372 sym := v.Aux 6373 v_0 := v.Args[0] 6374 if v_0.Op != OpARMADDshiftRA { 6375 break 6376 } 6377 c := v_0.AuxInt 6378 ptr := v_0.Args[0] 6379 idx := v_0.Args[1] 6380 mem := v.Args[1] 6381 if !(sym == nil && !config.nacl) { 6382 break 6383 } 6384 v.reset(OpARMMOVWloadshiftRA) 6385 v.AuxInt = c 6386 v.AddArg(ptr) 6387 v.AddArg(idx) 6388 v.AddArg(mem) 6389 return true 6390 } 6391 return false 6392 } 6393 func rewriteValueARM_OpARMMOVWloadidx(v *Value, config *Config) bool { 6394 b := v.Block 6395 _ = b 6396 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 6397 // cond: isSamePtr(ptr, ptr2) 6398 // result: x 6399 for { 6400 ptr := v.Args[0] 6401 idx := v.Args[1] 6402 v_2 := v.Args[2] 6403 if v_2.Op != OpARMMOVWstoreidx { 6404 break 6405 } 6406 ptr2 := v_2.Args[0] 6407 if idx != v_2.Args[1] { 6408 break 6409 } 6410 x := v_2.Args[2] 6411 if !(isSamePtr(ptr, ptr2)) { 6412 break 6413 } 6414 v.reset(OpCopy) 6415 v.Type = x.Type 6416 v.AddArg(x) 6417 return true 6418 } 6419 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 6420 // cond: 6421 // result: (MOVWload [c] ptr mem) 6422 for { 6423 ptr := v.Args[0] 6424 v_1 := v.Args[1] 6425 if v_1.Op != OpARMMOVWconst { 6426 break 6427 } 6428 c := v_1.AuxInt 6429 mem := v.Args[2] 6430 v.reset(OpARMMOVWload) 6431 v.AuxInt = c 6432 v.AddArg(ptr) 6433 v.AddArg(mem) 6434 return true 6435 } 6436 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 6437 // cond: 6438 // result: (MOVWload [c] ptr mem) 6439 for { 6440 v_0 := v.Args[0] 6441 if v_0.Op != OpARMMOVWconst { 6442 break 6443 } 6444 c := v_0.AuxInt 6445 ptr := v.Args[1] 6446 mem := v.Args[2] 6447 v.reset(OpARMMOVWload) 6448 v.AuxInt = c 6449 v.AddArg(ptr) 6450 v.AddArg(mem) 6451 return true 6452 } 6453 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 6454 // cond: 6455 // result: (MOVWloadshiftLL ptr idx [c] mem) 6456 for { 6457 ptr := v.Args[0] 6458 v_1 := v.Args[1] 6459 if v_1.Op != OpARMSLLconst { 6460 break 6461 } 6462 c := v_1.AuxInt 6463 idx := v_1.Args[0] 6464 mem := v.Args[2] 6465 v.reset(OpARMMOVWloadshiftLL) 6466 v.AuxInt = c 6467 v.AddArg(ptr) 6468 v.AddArg(idx) 6469 v.AddArg(mem) 6470 return true 6471 } 6472 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 6473 // cond: 6474 // result: (MOVWloadshiftLL ptr idx [c] mem) 6475 for { 6476 v_0 := v.Args[0] 6477 if v_0.Op != OpARMSLLconst { 6478 break 6479 } 6480 c := v_0.AuxInt 6481 idx := v_0.Args[0] 6482 ptr := v.Args[1] 6483 mem := v.Args[2] 6484 v.reset(OpARMMOVWloadshiftLL) 6485 v.AuxInt = c 6486 v.AddArg(ptr) 6487 v.AddArg(idx) 6488 v.AddArg(mem) 6489 return true 6490 } 6491 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 6492 // cond: 6493 // result: (MOVWloadshiftRL ptr idx [c] mem) 6494 for { 6495 ptr := v.Args[0] 6496 v_1 := v.Args[1] 6497 if v_1.Op != OpARMSRLconst { 6498 break 6499 } 6500 c := v_1.AuxInt 6501 idx := v_1.Args[0] 6502 mem := v.Args[2] 6503 v.reset(OpARMMOVWloadshiftRL) 6504 v.AuxInt = c 6505 v.AddArg(ptr) 6506 v.AddArg(idx) 6507 v.AddArg(mem) 6508 return true 6509 } 6510 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 6511 // cond: 6512 // result: (MOVWloadshiftRL ptr idx [c] mem) 6513 for { 6514 v_0 := v.Args[0] 6515 if v_0.Op != OpARMSRLconst { 6516 break 6517 } 6518 c := v_0.AuxInt 6519 idx := v_0.Args[0] 6520 ptr := v.Args[1] 6521 mem := v.Args[2] 6522 v.reset(OpARMMOVWloadshiftRL) 6523 v.AuxInt = c 6524 v.AddArg(ptr) 6525 v.AddArg(idx) 6526 v.AddArg(mem) 6527 return true 6528 } 6529 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 6530 // cond: 6531 // result: (MOVWloadshiftRA ptr idx [c] mem) 6532 for { 6533 ptr := v.Args[0] 6534 v_1 := v.Args[1] 6535 if v_1.Op != OpARMSRAconst { 6536 break 6537 } 6538 c := v_1.AuxInt 6539 idx := v_1.Args[0] 6540 mem := v.Args[2] 6541 v.reset(OpARMMOVWloadshiftRA) 6542 v.AuxInt = c 6543 v.AddArg(ptr) 6544 v.AddArg(idx) 6545 v.AddArg(mem) 6546 return true 6547 } 6548 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 6549 // cond: 6550 // result: (MOVWloadshiftRA ptr idx [c] mem) 6551 for { 6552 v_0 := v.Args[0] 6553 if v_0.Op != OpARMSRAconst { 6554 break 6555 } 6556 c := v_0.AuxInt 6557 idx := v_0.Args[0] 6558 ptr := v.Args[1] 6559 mem := v.Args[2] 6560 v.reset(OpARMMOVWloadshiftRA) 6561 v.AuxInt = c 6562 v.AddArg(ptr) 6563 v.AddArg(idx) 6564 v.AddArg(mem) 6565 return true 6566 } 6567 return false 6568 } 6569 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value, config *Config) bool { 6570 b := v.Block 6571 _ = b 6572 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 6573 // cond: c==d && isSamePtr(ptr, ptr2) 6574 // result: x 6575 for { 6576 c := v.AuxInt 6577 ptr := v.Args[0] 6578 idx := v.Args[1] 6579 v_2 := v.Args[2] 6580 if v_2.Op != OpARMMOVWstoreshiftLL { 6581 break 6582 } 6583 d := v_2.AuxInt 6584 ptr2 := v_2.Args[0] 6585 if idx != v_2.Args[1] { 6586 break 6587 } 6588 x := v_2.Args[2] 6589 if !(c == d && isSamePtr(ptr, ptr2)) { 6590 break 6591 } 6592 v.reset(OpCopy) 6593 v.Type = x.Type 6594 v.AddArg(x) 6595 return true 6596 } 6597 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 6598 // cond: 6599 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 6600 for { 6601 d := v.AuxInt 6602 ptr := v.Args[0] 6603 v_1 := v.Args[1] 6604 if v_1.Op != OpARMMOVWconst { 6605 break 6606 } 6607 c := v_1.AuxInt 6608 mem := v.Args[2] 6609 v.reset(OpARMMOVWload) 6610 v.AuxInt = int64(uint32(c) << uint64(d)) 6611 v.AddArg(ptr) 6612 v.AddArg(mem) 6613 return true 6614 } 6615 return false 6616 } 6617 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value, config *Config) bool { 6618 b := v.Block 6619 _ = b 6620 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 6621 // cond: c==d && isSamePtr(ptr, ptr2) 6622 // result: x 6623 for { 6624 c := v.AuxInt 6625 ptr := v.Args[0] 6626 idx := v.Args[1] 6627 v_2 := v.Args[2] 6628 if v_2.Op != OpARMMOVWstoreshiftRA { 6629 break 6630 } 6631 d := v_2.AuxInt 6632 ptr2 := v_2.Args[0] 6633 if idx != v_2.Args[1] { 6634 break 6635 } 6636 x := v_2.Args[2] 6637 if !(c == d && isSamePtr(ptr, ptr2)) { 6638 break 6639 } 6640 v.reset(OpCopy) 6641 v.Type = x.Type 6642 v.AddArg(x) 6643 return true 6644 } 6645 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 6646 // cond: 6647 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 6648 for { 6649 d := v.AuxInt 6650 ptr := v.Args[0] 6651 v_1 := v.Args[1] 6652 if v_1.Op != OpARMMOVWconst { 6653 break 6654 } 6655 c := v_1.AuxInt 6656 mem := v.Args[2] 6657 v.reset(OpARMMOVWload) 6658 v.AuxInt = int64(int32(c) >> uint64(d)) 6659 v.AddArg(ptr) 6660 v.AddArg(mem) 6661 return true 6662 } 6663 return false 6664 } 6665 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value, config *Config) bool { 6666 b := v.Block 6667 _ = b 6668 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 6669 // cond: c==d && isSamePtr(ptr, ptr2) 6670 // result: x 6671 for { 6672 c := v.AuxInt 6673 ptr := v.Args[0] 6674 idx := v.Args[1] 6675 v_2 := v.Args[2] 6676 if v_2.Op != OpARMMOVWstoreshiftRL { 6677 break 6678 } 6679 d := v_2.AuxInt 6680 ptr2 := v_2.Args[0] 6681 if idx != v_2.Args[1] { 6682 break 6683 } 6684 x := v_2.Args[2] 6685 if !(c == d && isSamePtr(ptr, ptr2)) { 6686 break 6687 } 6688 v.reset(OpCopy) 6689 v.Type = x.Type 6690 v.AddArg(x) 6691 return true 6692 } 6693 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 6694 // cond: 6695 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 6696 for { 6697 d := v.AuxInt 6698 ptr := v.Args[0] 6699 v_1 := v.Args[1] 6700 if v_1.Op != OpARMMOVWconst { 6701 break 6702 } 6703 c := v_1.AuxInt 6704 mem := v.Args[2] 6705 v.reset(OpARMMOVWload) 6706 v.AuxInt = int64(uint32(c) >> uint64(d)) 6707 v.AddArg(ptr) 6708 v.AddArg(mem) 6709 return true 6710 } 6711 return false 6712 } 6713 func rewriteValueARM_OpARMMOVWreg(v *Value, config *Config) bool { 6714 b := v.Block 6715 _ = b 6716 // match: (MOVWreg x) 6717 // cond: x.Uses == 1 6718 // result: (MOVWnop x) 6719 for { 6720 x := v.Args[0] 6721 if !(x.Uses == 1) { 6722 break 6723 } 6724 v.reset(OpARMMOVWnop) 6725 v.AddArg(x) 6726 return true 6727 } 6728 // match: (MOVWreg (MOVWconst [c])) 6729 // cond: 6730 // result: (MOVWconst [c]) 6731 for { 6732 v_0 := v.Args[0] 6733 if v_0.Op != OpARMMOVWconst { 6734 break 6735 } 6736 c := v_0.AuxInt 6737 v.reset(OpARMMOVWconst) 6738 v.AuxInt = c 6739 return true 6740 } 6741 return false 6742 } 6743 func rewriteValueARM_OpARMMOVWstore(v *Value, config *Config) bool { 6744 b := v.Block 6745 _ = b 6746 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6747 // cond: 6748 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6749 for { 6750 off1 := v.AuxInt 6751 sym := v.Aux 6752 v_0 := v.Args[0] 6753 if v_0.Op != OpARMADDconst { 6754 break 6755 } 6756 off2 := v_0.AuxInt 6757 ptr := v_0.Args[0] 6758 val := v.Args[1] 6759 mem := v.Args[2] 6760 v.reset(OpARMMOVWstore) 6761 v.AuxInt = off1 + off2 6762 v.Aux = sym 6763 v.AddArg(ptr) 6764 v.AddArg(val) 6765 v.AddArg(mem) 6766 return true 6767 } 6768 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6769 // cond: canMergeSym(sym1,sym2) 6770 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6771 for { 6772 off1 := v.AuxInt 6773 sym1 := v.Aux 6774 v_0 := v.Args[0] 6775 if v_0.Op != OpARMMOVWaddr { 6776 break 6777 } 6778 off2 := v_0.AuxInt 6779 sym2 := v_0.Aux 6780 ptr := v_0.Args[0] 6781 val := v.Args[1] 6782 mem := v.Args[2] 6783 if !(canMergeSym(sym1, sym2)) { 6784 break 6785 } 6786 v.reset(OpARMMOVWstore) 6787 v.AuxInt = off1 + off2 6788 v.Aux = mergeSym(sym1, sym2) 6789 v.AddArg(ptr) 6790 v.AddArg(val) 6791 v.AddArg(mem) 6792 return true 6793 } 6794 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 6795 // cond: sym == nil && !config.nacl 6796 // result: (MOVWstoreidx ptr idx val mem) 6797 for { 6798 if v.AuxInt != 0 { 6799 break 6800 } 6801 sym := v.Aux 6802 v_0 := v.Args[0] 6803 if v_0.Op != OpARMADD { 6804 break 6805 } 6806 ptr := v_0.Args[0] 6807 idx := v_0.Args[1] 6808 val := v.Args[1] 6809 mem := v.Args[2] 6810 if !(sym == nil && !config.nacl) { 6811 break 6812 } 6813 v.reset(OpARMMOVWstoreidx) 6814 v.AddArg(ptr) 6815 v.AddArg(idx) 6816 v.AddArg(val) 6817 v.AddArg(mem) 6818 return true 6819 } 6820 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 6821 // cond: sym == nil && !config.nacl 6822 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6823 for { 6824 if v.AuxInt != 0 { 6825 break 6826 } 6827 sym := v.Aux 6828 v_0 := v.Args[0] 6829 if v_0.Op != OpARMADDshiftLL { 6830 break 6831 } 6832 c := v_0.AuxInt 6833 ptr := v_0.Args[0] 6834 idx := v_0.Args[1] 6835 val := v.Args[1] 6836 mem := v.Args[2] 6837 if !(sym == nil && !config.nacl) { 6838 break 6839 } 6840 v.reset(OpARMMOVWstoreshiftLL) 6841 v.AuxInt = c 6842 v.AddArg(ptr) 6843 v.AddArg(idx) 6844 v.AddArg(val) 6845 v.AddArg(mem) 6846 return true 6847 } 6848 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 6849 // cond: sym == nil && !config.nacl 6850 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6851 for { 6852 if v.AuxInt != 0 { 6853 break 6854 } 6855 sym := v.Aux 6856 v_0 := v.Args[0] 6857 if v_0.Op != OpARMADDshiftRL { 6858 break 6859 } 6860 c := v_0.AuxInt 6861 ptr := v_0.Args[0] 6862 idx := v_0.Args[1] 6863 val := v.Args[1] 6864 mem := v.Args[2] 6865 if !(sym == nil && !config.nacl) { 6866 break 6867 } 6868 v.reset(OpARMMOVWstoreshiftRL) 6869 v.AuxInt = c 6870 v.AddArg(ptr) 6871 v.AddArg(idx) 6872 v.AddArg(val) 6873 v.AddArg(mem) 6874 return true 6875 } 6876 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 6877 // cond: sym == nil && !config.nacl 6878 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6879 for { 6880 if v.AuxInt != 0 { 6881 break 6882 } 6883 sym := v.Aux 6884 v_0 := v.Args[0] 6885 if v_0.Op != OpARMADDshiftRA { 6886 break 6887 } 6888 c := v_0.AuxInt 6889 ptr := v_0.Args[0] 6890 idx := v_0.Args[1] 6891 val := v.Args[1] 6892 mem := v.Args[2] 6893 if !(sym == nil && !config.nacl) { 6894 break 6895 } 6896 v.reset(OpARMMOVWstoreshiftRA) 6897 v.AuxInt = c 6898 v.AddArg(ptr) 6899 v.AddArg(idx) 6900 v.AddArg(val) 6901 v.AddArg(mem) 6902 return true 6903 } 6904 return false 6905 } 6906 func rewriteValueARM_OpARMMOVWstoreidx(v *Value, config *Config) bool { 6907 b := v.Block 6908 _ = b 6909 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 6910 // cond: 6911 // result: (MOVWstore [c] ptr val mem) 6912 for { 6913 ptr := v.Args[0] 6914 v_1 := v.Args[1] 6915 if v_1.Op != OpARMMOVWconst { 6916 break 6917 } 6918 c := v_1.AuxInt 6919 val := v.Args[2] 6920 mem := v.Args[3] 6921 v.reset(OpARMMOVWstore) 6922 v.AuxInt = c 6923 v.AddArg(ptr) 6924 v.AddArg(val) 6925 v.AddArg(mem) 6926 return true 6927 } 6928 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 6929 // cond: 6930 // result: (MOVWstore [c] ptr val mem) 6931 for { 6932 v_0 := v.Args[0] 6933 if v_0.Op != OpARMMOVWconst { 6934 break 6935 } 6936 c := v_0.AuxInt 6937 ptr := v.Args[1] 6938 val := v.Args[2] 6939 mem := v.Args[3] 6940 v.reset(OpARMMOVWstore) 6941 v.AuxInt = c 6942 v.AddArg(ptr) 6943 v.AddArg(val) 6944 v.AddArg(mem) 6945 return true 6946 } 6947 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 6948 // cond: 6949 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6950 for { 6951 ptr := v.Args[0] 6952 v_1 := v.Args[1] 6953 if v_1.Op != OpARMSLLconst { 6954 break 6955 } 6956 c := v_1.AuxInt 6957 idx := v_1.Args[0] 6958 val := v.Args[2] 6959 mem := v.Args[3] 6960 v.reset(OpARMMOVWstoreshiftLL) 6961 v.AuxInt = c 6962 v.AddArg(ptr) 6963 v.AddArg(idx) 6964 v.AddArg(val) 6965 v.AddArg(mem) 6966 return true 6967 } 6968 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 6969 // cond: 6970 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6971 for { 6972 v_0 := v.Args[0] 6973 if v_0.Op != OpARMSLLconst { 6974 break 6975 } 6976 c := v_0.AuxInt 6977 idx := v_0.Args[0] 6978 ptr := v.Args[1] 6979 val := v.Args[2] 6980 mem := v.Args[3] 6981 v.reset(OpARMMOVWstoreshiftLL) 6982 v.AuxInt = c 6983 v.AddArg(ptr) 6984 v.AddArg(idx) 6985 v.AddArg(val) 6986 v.AddArg(mem) 6987 return true 6988 } 6989 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 6990 // cond: 6991 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6992 for { 6993 ptr := v.Args[0] 6994 v_1 := v.Args[1] 6995 if v_1.Op != OpARMSRLconst { 6996 break 6997 } 6998 c := v_1.AuxInt 6999 idx := v_1.Args[0] 7000 val := v.Args[2] 7001 mem := v.Args[3] 7002 v.reset(OpARMMOVWstoreshiftRL) 7003 v.AuxInt = c 7004 v.AddArg(ptr) 7005 v.AddArg(idx) 7006 v.AddArg(val) 7007 v.AddArg(mem) 7008 return true 7009 } 7010 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 7011 // cond: 7012 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7013 for { 7014 v_0 := v.Args[0] 7015 if v_0.Op != OpARMSRLconst { 7016 break 7017 } 7018 c := v_0.AuxInt 7019 idx := v_0.Args[0] 7020 ptr := v.Args[1] 7021 val := v.Args[2] 7022 mem := v.Args[3] 7023 v.reset(OpARMMOVWstoreshiftRL) 7024 v.AuxInt = c 7025 v.AddArg(ptr) 7026 v.AddArg(idx) 7027 v.AddArg(val) 7028 v.AddArg(mem) 7029 return true 7030 } 7031 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 7032 // cond: 7033 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7034 for { 7035 ptr := v.Args[0] 7036 v_1 := v.Args[1] 7037 if v_1.Op != OpARMSRAconst { 7038 break 7039 } 7040 c := v_1.AuxInt 7041 idx := v_1.Args[0] 7042 val := v.Args[2] 7043 mem := v.Args[3] 7044 v.reset(OpARMMOVWstoreshiftRA) 7045 v.AuxInt = c 7046 v.AddArg(ptr) 7047 v.AddArg(idx) 7048 v.AddArg(val) 7049 v.AddArg(mem) 7050 return true 7051 } 7052 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 7053 // cond: 7054 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7055 for { 7056 v_0 := v.Args[0] 7057 if v_0.Op != OpARMSRAconst { 7058 break 7059 } 7060 c := v_0.AuxInt 7061 idx := v_0.Args[0] 7062 ptr := v.Args[1] 7063 val := v.Args[2] 7064 mem := v.Args[3] 7065 v.reset(OpARMMOVWstoreshiftRA) 7066 v.AuxInt = c 7067 v.AddArg(ptr) 7068 v.AddArg(idx) 7069 v.AddArg(val) 7070 v.AddArg(mem) 7071 return true 7072 } 7073 return false 7074 } 7075 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value, config *Config) bool { 7076 b := v.Block 7077 _ = b 7078 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 7079 // cond: 7080 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 7081 for { 7082 d := v.AuxInt 7083 ptr := v.Args[0] 7084 v_1 := v.Args[1] 7085 if v_1.Op != OpARMMOVWconst { 7086 break 7087 } 7088 c := v_1.AuxInt 7089 val := v.Args[2] 7090 mem := v.Args[3] 7091 v.reset(OpARMMOVWstore) 7092 v.AuxInt = int64(uint32(c) << uint64(d)) 7093 v.AddArg(ptr) 7094 v.AddArg(val) 7095 v.AddArg(mem) 7096 return true 7097 } 7098 return false 7099 } 7100 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value, config *Config) bool { 7101 b := v.Block 7102 _ = b 7103 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 7104 // cond: 7105 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 7106 for { 7107 d := v.AuxInt 7108 ptr := v.Args[0] 7109 v_1 := v.Args[1] 7110 if v_1.Op != OpARMMOVWconst { 7111 break 7112 } 7113 c := v_1.AuxInt 7114 val := v.Args[2] 7115 mem := v.Args[3] 7116 v.reset(OpARMMOVWstore) 7117 v.AuxInt = int64(int32(c) >> uint64(d)) 7118 v.AddArg(ptr) 7119 v.AddArg(val) 7120 v.AddArg(mem) 7121 return true 7122 } 7123 return false 7124 } 7125 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value, config *Config) bool { 7126 b := v.Block 7127 _ = b 7128 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 7129 // cond: 7130 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 7131 for { 7132 d := v.AuxInt 7133 ptr := v.Args[0] 7134 v_1 := v.Args[1] 7135 if v_1.Op != OpARMMOVWconst { 7136 break 7137 } 7138 c := v_1.AuxInt 7139 val := v.Args[2] 7140 mem := v.Args[3] 7141 v.reset(OpARMMOVWstore) 7142 v.AuxInt = int64(uint32(c) >> uint64(d)) 7143 v.AddArg(ptr) 7144 v.AddArg(val) 7145 v.AddArg(mem) 7146 return true 7147 } 7148 return false 7149 } 7150 func rewriteValueARM_OpARMMUL(v *Value, config *Config) bool { 7151 b := v.Block 7152 _ = b 7153 // match: (MUL x (MOVWconst [c])) 7154 // cond: int32(c) == -1 7155 // result: (RSBconst [0] x) 7156 for { 7157 x := v.Args[0] 7158 v_1 := v.Args[1] 7159 if v_1.Op != OpARMMOVWconst { 7160 break 7161 } 7162 c := v_1.AuxInt 7163 if !(int32(c) == -1) { 7164 break 7165 } 7166 v.reset(OpARMRSBconst) 7167 v.AuxInt = 0 7168 v.AddArg(x) 7169 return true 7170 } 7171 // match: (MUL _ (MOVWconst [0])) 7172 // cond: 7173 // result: (MOVWconst [0]) 7174 for { 7175 v_1 := v.Args[1] 7176 if v_1.Op != OpARMMOVWconst { 7177 break 7178 } 7179 if v_1.AuxInt != 0 { 7180 break 7181 } 7182 v.reset(OpARMMOVWconst) 7183 v.AuxInt = 0 7184 return true 7185 } 7186 // match: (MUL x (MOVWconst [1])) 7187 // cond: 7188 // result: x 7189 for { 7190 x := v.Args[0] 7191 v_1 := v.Args[1] 7192 if v_1.Op != OpARMMOVWconst { 7193 break 7194 } 7195 if v_1.AuxInt != 1 { 7196 break 7197 } 7198 v.reset(OpCopy) 7199 v.Type = x.Type 7200 v.AddArg(x) 7201 return true 7202 } 7203 // match: (MUL x (MOVWconst [c])) 7204 // cond: isPowerOfTwo(c) 7205 // result: (SLLconst [log2(c)] x) 7206 for { 7207 x := v.Args[0] 7208 v_1 := v.Args[1] 7209 if v_1.Op != OpARMMOVWconst { 7210 break 7211 } 7212 c := v_1.AuxInt 7213 if !(isPowerOfTwo(c)) { 7214 break 7215 } 7216 v.reset(OpARMSLLconst) 7217 v.AuxInt = log2(c) 7218 v.AddArg(x) 7219 return true 7220 } 7221 // match: (MUL x (MOVWconst [c])) 7222 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7223 // result: (ADDshiftLL x x [log2(c-1)]) 7224 for { 7225 x := v.Args[0] 7226 v_1 := v.Args[1] 7227 if v_1.Op != OpARMMOVWconst { 7228 break 7229 } 7230 c := v_1.AuxInt 7231 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7232 break 7233 } 7234 v.reset(OpARMADDshiftLL) 7235 v.AuxInt = log2(c - 1) 7236 v.AddArg(x) 7237 v.AddArg(x) 7238 return true 7239 } 7240 // match: (MUL x (MOVWconst [c])) 7241 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7242 // result: (RSBshiftLL x x [log2(c+1)]) 7243 for { 7244 x := v.Args[0] 7245 v_1 := v.Args[1] 7246 if v_1.Op != OpARMMOVWconst { 7247 break 7248 } 7249 c := v_1.AuxInt 7250 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7251 break 7252 } 7253 v.reset(OpARMRSBshiftLL) 7254 v.AuxInt = log2(c + 1) 7255 v.AddArg(x) 7256 v.AddArg(x) 7257 return true 7258 } 7259 // match: (MUL x (MOVWconst [c])) 7260 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7261 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7262 for { 7263 x := v.Args[0] 7264 v_1 := v.Args[1] 7265 if v_1.Op != OpARMMOVWconst { 7266 break 7267 } 7268 c := v_1.AuxInt 7269 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7270 break 7271 } 7272 v.reset(OpARMSLLconst) 7273 v.AuxInt = log2(c / 3) 7274 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7275 v0.AuxInt = 1 7276 v0.AddArg(x) 7277 v0.AddArg(x) 7278 v.AddArg(v0) 7279 return true 7280 } 7281 // match: (MUL x (MOVWconst [c])) 7282 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7283 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7284 for { 7285 x := v.Args[0] 7286 v_1 := v.Args[1] 7287 if v_1.Op != OpARMMOVWconst { 7288 break 7289 } 7290 c := v_1.AuxInt 7291 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7292 break 7293 } 7294 v.reset(OpARMSLLconst) 7295 v.AuxInt = log2(c / 5) 7296 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7297 v0.AuxInt = 2 7298 v0.AddArg(x) 7299 v0.AddArg(x) 7300 v.AddArg(v0) 7301 return true 7302 } 7303 // match: (MUL x (MOVWconst [c])) 7304 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7305 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7306 for { 7307 x := v.Args[0] 7308 v_1 := v.Args[1] 7309 if v_1.Op != OpARMMOVWconst { 7310 break 7311 } 7312 c := v_1.AuxInt 7313 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7314 break 7315 } 7316 v.reset(OpARMSLLconst) 7317 v.AuxInt = log2(c / 7) 7318 v0 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7319 v0.AuxInt = 3 7320 v0.AddArg(x) 7321 v0.AddArg(x) 7322 v.AddArg(v0) 7323 return true 7324 } 7325 // match: (MUL x (MOVWconst [c])) 7326 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7327 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7328 for { 7329 x := v.Args[0] 7330 v_1 := v.Args[1] 7331 if v_1.Op != OpARMMOVWconst { 7332 break 7333 } 7334 c := v_1.AuxInt 7335 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7336 break 7337 } 7338 v.reset(OpARMSLLconst) 7339 v.AuxInt = log2(c / 9) 7340 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7341 v0.AuxInt = 3 7342 v0.AddArg(x) 7343 v0.AddArg(x) 7344 v.AddArg(v0) 7345 return true 7346 } 7347 // match: (MUL (MOVWconst [c]) x) 7348 // cond: int32(c) == -1 7349 // result: (RSBconst [0] x) 7350 for { 7351 v_0 := v.Args[0] 7352 if v_0.Op != OpARMMOVWconst { 7353 break 7354 } 7355 c := v_0.AuxInt 7356 x := v.Args[1] 7357 if !(int32(c) == -1) { 7358 break 7359 } 7360 v.reset(OpARMRSBconst) 7361 v.AuxInt = 0 7362 v.AddArg(x) 7363 return true 7364 } 7365 // match: (MUL (MOVWconst [0]) _) 7366 // cond: 7367 // result: (MOVWconst [0]) 7368 for { 7369 v_0 := v.Args[0] 7370 if v_0.Op != OpARMMOVWconst { 7371 break 7372 } 7373 if v_0.AuxInt != 0 { 7374 break 7375 } 7376 v.reset(OpARMMOVWconst) 7377 v.AuxInt = 0 7378 return true 7379 } 7380 // match: (MUL (MOVWconst [1]) x) 7381 // cond: 7382 // result: x 7383 for { 7384 v_0 := v.Args[0] 7385 if v_0.Op != OpARMMOVWconst { 7386 break 7387 } 7388 if v_0.AuxInt != 1 { 7389 break 7390 } 7391 x := v.Args[1] 7392 v.reset(OpCopy) 7393 v.Type = x.Type 7394 v.AddArg(x) 7395 return true 7396 } 7397 // match: (MUL (MOVWconst [c]) x) 7398 // cond: isPowerOfTwo(c) 7399 // result: (SLLconst [log2(c)] x) 7400 for { 7401 v_0 := v.Args[0] 7402 if v_0.Op != OpARMMOVWconst { 7403 break 7404 } 7405 c := v_0.AuxInt 7406 x := v.Args[1] 7407 if !(isPowerOfTwo(c)) { 7408 break 7409 } 7410 v.reset(OpARMSLLconst) 7411 v.AuxInt = log2(c) 7412 v.AddArg(x) 7413 return true 7414 } 7415 // match: (MUL (MOVWconst [c]) x) 7416 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7417 // result: (ADDshiftLL x x [log2(c-1)]) 7418 for { 7419 v_0 := v.Args[0] 7420 if v_0.Op != OpARMMOVWconst { 7421 break 7422 } 7423 c := v_0.AuxInt 7424 x := v.Args[1] 7425 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7426 break 7427 } 7428 v.reset(OpARMADDshiftLL) 7429 v.AuxInt = log2(c - 1) 7430 v.AddArg(x) 7431 v.AddArg(x) 7432 return true 7433 } 7434 // match: (MUL (MOVWconst [c]) x) 7435 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7436 // result: (RSBshiftLL x x [log2(c+1)]) 7437 for { 7438 v_0 := v.Args[0] 7439 if v_0.Op != OpARMMOVWconst { 7440 break 7441 } 7442 c := v_0.AuxInt 7443 x := v.Args[1] 7444 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7445 break 7446 } 7447 v.reset(OpARMRSBshiftLL) 7448 v.AuxInt = log2(c + 1) 7449 v.AddArg(x) 7450 v.AddArg(x) 7451 return true 7452 } 7453 // match: (MUL (MOVWconst [c]) x) 7454 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7455 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7456 for { 7457 v_0 := v.Args[0] 7458 if v_0.Op != OpARMMOVWconst { 7459 break 7460 } 7461 c := v_0.AuxInt 7462 x := v.Args[1] 7463 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7464 break 7465 } 7466 v.reset(OpARMSLLconst) 7467 v.AuxInt = log2(c / 3) 7468 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7469 v0.AuxInt = 1 7470 v0.AddArg(x) 7471 v0.AddArg(x) 7472 v.AddArg(v0) 7473 return true 7474 } 7475 // match: (MUL (MOVWconst [c]) x) 7476 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7477 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7478 for { 7479 v_0 := v.Args[0] 7480 if v_0.Op != OpARMMOVWconst { 7481 break 7482 } 7483 c := v_0.AuxInt 7484 x := v.Args[1] 7485 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7486 break 7487 } 7488 v.reset(OpARMSLLconst) 7489 v.AuxInt = log2(c / 5) 7490 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7491 v0.AuxInt = 2 7492 v0.AddArg(x) 7493 v0.AddArg(x) 7494 v.AddArg(v0) 7495 return true 7496 } 7497 // match: (MUL (MOVWconst [c]) x) 7498 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7499 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7500 for { 7501 v_0 := v.Args[0] 7502 if v_0.Op != OpARMMOVWconst { 7503 break 7504 } 7505 c := v_0.AuxInt 7506 x := v.Args[1] 7507 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7508 break 7509 } 7510 v.reset(OpARMSLLconst) 7511 v.AuxInt = log2(c / 7) 7512 v0 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7513 v0.AuxInt = 3 7514 v0.AddArg(x) 7515 v0.AddArg(x) 7516 v.AddArg(v0) 7517 return true 7518 } 7519 // match: (MUL (MOVWconst [c]) x) 7520 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7521 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7522 for { 7523 v_0 := v.Args[0] 7524 if v_0.Op != OpARMMOVWconst { 7525 break 7526 } 7527 c := v_0.AuxInt 7528 x := v.Args[1] 7529 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7530 break 7531 } 7532 v.reset(OpARMSLLconst) 7533 v.AuxInt = log2(c / 9) 7534 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7535 v0.AuxInt = 3 7536 v0.AddArg(x) 7537 v0.AddArg(x) 7538 v.AddArg(v0) 7539 return true 7540 } 7541 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 7542 // cond: 7543 // result: (MOVWconst [int64(int32(c*d))]) 7544 for { 7545 v_0 := v.Args[0] 7546 if v_0.Op != OpARMMOVWconst { 7547 break 7548 } 7549 c := v_0.AuxInt 7550 v_1 := v.Args[1] 7551 if v_1.Op != OpARMMOVWconst { 7552 break 7553 } 7554 d := v_1.AuxInt 7555 v.reset(OpARMMOVWconst) 7556 v.AuxInt = int64(int32(c * d)) 7557 return true 7558 } 7559 return false 7560 } 7561 func rewriteValueARM_OpARMMULA(v *Value, config *Config) bool { 7562 b := v.Block 7563 _ = b 7564 // match: (MULA x (MOVWconst [c]) a) 7565 // cond: int32(c) == -1 7566 // result: (SUB a x) 7567 for { 7568 x := v.Args[0] 7569 v_1 := v.Args[1] 7570 if v_1.Op != OpARMMOVWconst { 7571 break 7572 } 7573 c := v_1.AuxInt 7574 a := v.Args[2] 7575 if !(int32(c) == -1) { 7576 break 7577 } 7578 v.reset(OpARMSUB) 7579 v.AddArg(a) 7580 v.AddArg(x) 7581 return true 7582 } 7583 // match: (MULA _ (MOVWconst [0]) a) 7584 // cond: 7585 // result: a 7586 for { 7587 v_1 := v.Args[1] 7588 if v_1.Op != OpARMMOVWconst { 7589 break 7590 } 7591 if v_1.AuxInt != 0 { 7592 break 7593 } 7594 a := v.Args[2] 7595 v.reset(OpCopy) 7596 v.Type = a.Type 7597 v.AddArg(a) 7598 return true 7599 } 7600 // match: (MULA x (MOVWconst [1]) a) 7601 // cond: 7602 // result: (ADD x a) 7603 for { 7604 x := v.Args[0] 7605 v_1 := v.Args[1] 7606 if v_1.Op != OpARMMOVWconst { 7607 break 7608 } 7609 if v_1.AuxInt != 1 { 7610 break 7611 } 7612 a := v.Args[2] 7613 v.reset(OpARMADD) 7614 v.AddArg(x) 7615 v.AddArg(a) 7616 return true 7617 } 7618 // match: (MULA x (MOVWconst [c]) a) 7619 // cond: isPowerOfTwo(c) 7620 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 7621 for { 7622 x := v.Args[0] 7623 v_1 := v.Args[1] 7624 if v_1.Op != OpARMMOVWconst { 7625 break 7626 } 7627 c := v_1.AuxInt 7628 a := v.Args[2] 7629 if !(isPowerOfTwo(c)) { 7630 break 7631 } 7632 v.reset(OpARMADD) 7633 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7634 v0.AuxInt = log2(c) 7635 v0.AddArg(x) 7636 v.AddArg(v0) 7637 v.AddArg(a) 7638 return true 7639 } 7640 // match: (MULA x (MOVWconst [c]) a) 7641 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7642 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 7643 for { 7644 x := v.Args[0] 7645 v_1 := v.Args[1] 7646 if v_1.Op != OpARMMOVWconst { 7647 break 7648 } 7649 c := v_1.AuxInt 7650 a := v.Args[2] 7651 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7652 break 7653 } 7654 v.reset(OpARMADD) 7655 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7656 v0.AuxInt = log2(c - 1) 7657 v0.AddArg(x) 7658 v0.AddArg(x) 7659 v.AddArg(v0) 7660 v.AddArg(a) 7661 return true 7662 } 7663 // match: (MULA x (MOVWconst [c]) a) 7664 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7665 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 7666 for { 7667 x := v.Args[0] 7668 v_1 := v.Args[1] 7669 if v_1.Op != OpARMMOVWconst { 7670 break 7671 } 7672 c := v_1.AuxInt 7673 a := v.Args[2] 7674 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7675 break 7676 } 7677 v.reset(OpARMADD) 7678 v0 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7679 v0.AuxInt = log2(c + 1) 7680 v0.AddArg(x) 7681 v0.AddArg(x) 7682 v.AddArg(v0) 7683 v.AddArg(a) 7684 return true 7685 } 7686 // match: (MULA x (MOVWconst [c]) a) 7687 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7688 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 7689 for { 7690 x := v.Args[0] 7691 v_1 := v.Args[1] 7692 if v_1.Op != OpARMMOVWconst { 7693 break 7694 } 7695 c := v_1.AuxInt 7696 a := v.Args[2] 7697 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7698 break 7699 } 7700 v.reset(OpARMADD) 7701 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7702 v0.AuxInt = log2(c / 3) 7703 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7704 v1.AuxInt = 1 7705 v1.AddArg(x) 7706 v1.AddArg(x) 7707 v0.AddArg(v1) 7708 v.AddArg(v0) 7709 v.AddArg(a) 7710 return true 7711 } 7712 // match: (MULA x (MOVWconst [c]) a) 7713 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7714 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 7715 for { 7716 x := v.Args[0] 7717 v_1 := v.Args[1] 7718 if v_1.Op != OpARMMOVWconst { 7719 break 7720 } 7721 c := v_1.AuxInt 7722 a := v.Args[2] 7723 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7724 break 7725 } 7726 v.reset(OpARMADD) 7727 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7728 v0.AuxInt = log2(c / 5) 7729 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7730 v1.AuxInt = 2 7731 v1.AddArg(x) 7732 v1.AddArg(x) 7733 v0.AddArg(v1) 7734 v.AddArg(v0) 7735 v.AddArg(a) 7736 return true 7737 } 7738 // match: (MULA x (MOVWconst [c]) a) 7739 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7740 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 7741 for { 7742 x := v.Args[0] 7743 v_1 := v.Args[1] 7744 if v_1.Op != OpARMMOVWconst { 7745 break 7746 } 7747 c := v_1.AuxInt 7748 a := v.Args[2] 7749 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7750 break 7751 } 7752 v.reset(OpARMADD) 7753 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7754 v0.AuxInt = log2(c / 7) 7755 v1 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7756 v1.AuxInt = 3 7757 v1.AddArg(x) 7758 v1.AddArg(x) 7759 v0.AddArg(v1) 7760 v.AddArg(v0) 7761 v.AddArg(a) 7762 return true 7763 } 7764 // match: (MULA x (MOVWconst [c]) a) 7765 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7766 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 7767 for { 7768 x := v.Args[0] 7769 v_1 := v.Args[1] 7770 if v_1.Op != OpARMMOVWconst { 7771 break 7772 } 7773 c := v_1.AuxInt 7774 a := v.Args[2] 7775 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7776 break 7777 } 7778 v.reset(OpARMADD) 7779 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7780 v0.AuxInt = log2(c / 9) 7781 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7782 v1.AuxInt = 3 7783 v1.AddArg(x) 7784 v1.AddArg(x) 7785 v0.AddArg(v1) 7786 v.AddArg(v0) 7787 v.AddArg(a) 7788 return true 7789 } 7790 // match: (MULA (MOVWconst [c]) x a) 7791 // cond: int32(c) == -1 7792 // result: (SUB a x) 7793 for { 7794 v_0 := v.Args[0] 7795 if v_0.Op != OpARMMOVWconst { 7796 break 7797 } 7798 c := v_0.AuxInt 7799 x := v.Args[1] 7800 a := v.Args[2] 7801 if !(int32(c) == -1) { 7802 break 7803 } 7804 v.reset(OpARMSUB) 7805 v.AddArg(a) 7806 v.AddArg(x) 7807 return true 7808 } 7809 // match: (MULA (MOVWconst [0]) _ a) 7810 // cond: 7811 // result: a 7812 for { 7813 v_0 := v.Args[0] 7814 if v_0.Op != OpARMMOVWconst { 7815 break 7816 } 7817 if v_0.AuxInt != 0 { 7818 break 7819 } 7820 a := v.Args[2] 7821 v.reset(OpCopy) 7822 v.Type = a.Type 7823 v.AddArg(a) 7824 return true 7825 } 7826 // match: (MULA (MOVWconst [1]) x a) 7827 // cond: 7828 // result: (ADD x a) 7829 for { 7830 v_0 := v.Args[0] 7831 if v_0.Op != OpARMMOVWconst { 7832 break 7833 } 7834 if v_0.AuxInt != 1 { 7835 break 7836 } 7837 x := v.Args[1] 7838 a := v.Args[2] 7839 v.reset(OpARMADD) 7840 v.AddArg(x) 7841 v.AddArg(a) 7842 return true 7843 } 7844 // match: (MULA (MOVWconst [c]) x a) 7845 // cond: isPowerOfTwo(c) 7846 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 7847 for { 7848 v_0 := v.Args[0] 7849 if v_0.Op != OpARMMOVWconst { 7850 break 7851 } 7852 c := v_0.AuxInt 7853 x := v.Args[1] 7854 a := v.Args[2] 7855 if !(isPowerOfTwo(c)) { 7856 break 7857 } 7858 v.reset(OpARMADD) 7859 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7860 v0.AuxInt = log2(c) 7861 v0.AddArg(x) 7862 v.AddArg(v0) 7863 v.AddArg(a) 7864 return true 7865 } 7866 // match: (MULA (MOVWconst [c]) x a) 7867 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7868 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 7869 for { 7870 v_0 := v.Args[0] 7871 if v_0.Op != OpARMMOVWconst { 7872 break 7873 } 7874 c := v_0.AuxInt 7875 x := v.Args[1] 7876 a := v.Args[2] 7877 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7878 break 7879 } 7880 v.reset(OpARMADD) 7881 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7882 v0.AuxInt = log2(c - 1) 7883 v0.AddArg(x) 7884 v0.AddArg(x) 7885 v.AddArg(v0) 7886 v.AddArg(a) 7887 return true 7888 } 7889 // match: (MULA (MOVWconst [c]) x a) 7890 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7891 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 7892 for { 7893 v_0 := v.Args[0] 7894 if v_0.Op != OpARMMOVWconst { 7895 break 7896 } 7897 c := v_0.AuxInt 7898 x := v.Args[1] 7899 a := v.Args[2] 7900 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7901 break 7902 } 7903 v.reset(OpARMADD) 7904 v0 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7905 v0.AuxInt = log2(c + 1) 7906 v0.AddArg(x) 7907 v0.AddArg(x) 7908 v.AddArg(v0) 7909 v.AddArg(a) 7910 return true 7911 } 7912 // match: (MULA (MOVWconst [c]) x a) 7913 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7914 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 7915 for { 7916 v_0 := v.Args[0] 7917 if v_0.Op != OpARMMOVWconst { 7918 break 7919 } 7920 c := v_0.AuxInt 7921 x := v.Args[1] 7922 a := v.Args[2] 7923 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7924 break 7925 } 7926 v.reset(OpARMADD) 7927 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7928 v0.AuxInt = log2(c / 3) 7929 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7930 v1.AuxInt = 1 7931 v1.AddArg(x) 7932 v1.AddArg(x) 7933 v0.AddArg(v1) 7934 v.AddArg(v0) 7935 v.AddArg(a) 7936 return true 7937 } 7938 // match: (MULA (MOVWconst [c]) x a) 7939 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7940 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 7941 for { 7942 v_0 := v.Args[0] 7943 if v_0.Op != OpARMMOVWconst { 7944 break 7945 } 7946 c := v_0.AuxInt 7947 x := v.Args[1] 7948 a := v.Args[2] 7949 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7950 break 7951 } 7952 v.reset(OpARMADD) 7953 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7954 v0.AuxInt = log2(c / 5) 7955 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7956 v1.AuxInt = 2 7957 v1.AddArg(x) 7958 v1.AddArg(x) 7959 v0.AddArg(v1) 7960 v.AddArg(v0) 7961 v.AddArg(a) 7962 return true 7963 } 7964 // match: (MULA (MOVWconst [c]) x a) 7965 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7966 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 7967 for { 7968 v_0 := v.Args[0] 7969 if v_0.Op != OpARMMOVWconst { 7970 break 7971 } 7972 c := v_0.AuxInt 7973 x := v.Args[1] 7974 a := v.Args[2] 7975 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7976 break 7977 } 7978 v.reset(OpARMADD) 7979 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7980 v0.AuxInt = log2(c / 7) 7981 v1 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7982 v1.AuxInt = 3 7983 v1.AddArg(x) 7984 v1.AddArg(x) 7985 v0.AddArg(v1) 7986 v.AddArg(v0) 7987 v.AddArg(a) 7988 return true 7989 } 7990 // match: (MULA (MOVWconst [c]) x a) 7991 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7992 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 7993 for { 7994 v_0 := v.Args[0] 7995 if v_0.Op != OpARMMOVWconst { 7996 break 7997 } 7998 c := v_0.AuxInt 7999 x := v.Args[1] 8000 a := v.Args[2] 8001 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8002 break 8003 } 8004 v.reset(OpARMADD) 8005 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 8006 v0.AuxInt = log2(c / 9) 8007 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 8008 v1.AuxInt = 3 8009 v1.AddArg(x) 8010 v1.AddArg(x) 8011 v0.AddArg(v1) 8012 v.AddArg(v0) 8013 v.AddArg(a) 8014 return true 8015 } 8016 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 8017 // cond: 8018 // result: (ADDconst [int64(int32(c*d))] a) 8019 for { 8020 v_0 := v.Args[0] 8021 if v_0.Op != OpARMMOVWconst { 8022 break 8023 } 8024 c := v_0.AuxInt 8025 v_1 := v.Args[1] 8026 if v_1.Op != OpARMMOVWconst { 8027 break 8028 } 8029 d := v_1.AuxInt 8030 a := v.Args[2] 8031 v.reset(OpARMADDconst) 8032 v.AuxInt = int64(int32(c * d)) 8033 v.AddArg(a) 8034 return true 8035 } 8036 return false 8037 } 8038 func rewriteValueARM_OpARMMVN(v *Value, config *Config) bool { 8039 b := v.Block 8040 _ = b 8041 // match: (MVN (MOVWconst [c])) 8042 // cond: 8043 // result: (MOVWconst [^c]) 8044 for { 8045 v_0 := v.Args[0] 8046 if v_0.Op != OpARMMOVWconst { 8047 break 8048 } 8049 c := v_0.AuxInt 8050 v.reset(OpARMMOVWconst) 8051 v.AuxInt = ^c 8052 return true 8053 } 8054 // match: (MVN (SLLconst [c] x)) 8055 // cond: 8056 // result: (MVNshiftLL x [c]) 8057 for { 8058 v_0 := v.Args[0] 8059 if v_0.Op != OpARMSLLconst { 8060 break 8061 } 8062 c := v_0.AuxInt 8063 x := v_0.Args[0] 8064 v.reset(OpARMMVNshiftLL) 8065 v.AuxInt = c 8066 v.AddArg(x) 8067 return true 8068 } 8069 // match: (MVN (SRLconst [c] x)) 8070 // cond: 8071 // result: (MVNshiftRL x [c]) 8072 for { 8073 v_0 := v.Args[0] 8074 if v_0.Op != OpARMSRLconst { 8075 break 8076 } 8077 c := v_0.AuxInt 8078 x := v_0.Args[0] 8079 v.reset(OpARMMVNshiftRL) 8080 v.AuxInt = c 8081 v.AddArg(x) 8082 return true 8083 } 8084 // match: (MVN (SRAconst [c] x)) 8085 // cond: 8086 // result: (MVNshiftRA x [c]) 8087 for { 8088 v_0 := v.Args[0] 8089 if v_0.Op != OpARMSRAconst { 8090 break 8091 } 8092 c := v_0.AuxInt 8093 x := v_0.Args[0] 8094 v.reset(OpARMMVNshiftRA) 8095 v.AuxInt = c 8096 v.AddArg(x) 8097 return true 8098 } 8099 // match: (MVN (SLL x y)) 8100 // cond: 8101 // result: (MVNshiftLLreg x y) 8102 for { 8103 v_0 := v.Args[0] 8104 if v_0.Op != OpARMSLL { 8105 break 8106 } 8107 x := v_0.Args[0] 8108 y := v_0.Args[1] 8109 v.reset(OpARMMVNshiftLLreg) 8110 v.AddArg(x) 8111 v.AddArg(y) 8112 return true 8113 } 8114 // match: (MVN (SRL x y)) 8115 // cond: 8116 // result: (MVNshiftRLreg x y) 8117 for { 8118 v_0 := v.Args[0] 8119 if v_0.Op != OpARMSRL { 8120 break 8121 } 8122 x := v_0.Args[0] 8123 y := v_0.Args[1] 8124 v.reset(OpARMMVNshiftRLreg) 8125 v.AddArg(x) 8126 v.AddArg(y) 8127 return true 8128 } 8129 // match: (MVN (SRA x y)) 8130 // cond: 8131 // result: (MVNshiftRAreg x y) 8132 for { 8133 v_0 := v.Args[0] 8134 if v_0.Op != OpARMSRA { 8135 break 8136 } 8137 x := v_0.Args[0] 8138 y := v_0.Args[1] 8139 v.reset(OpARMMVNshiftRAreg) 8140 v.AddArg(x) 8141 v.AddArg(y) 8142 return true 8143 } 8144 return false 8145 } 8146 func rewriteValueARM_OpARMMVNshiftLL(v *Value, config *Config) bool { 8147 b := v.Block 8148 _ = b 8149 // match: (MVNshiftLL (MOVWconst [c]) [d]) 8150 // cond: 8151 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 8152 for { 8153 d := v.AuxInt 8154 v_0 := v.Args[0] 8155 if v_0.Op != OpARMMOVWconst { 8156 break 8157 } 8158 c := v_0.AuxInt 8159 v.reset(OpARMMOVWconst) 8160 v.AuxInt = ^int64(uint32(c) << uint64(d)) 8161 return true 8162 } 8163 return false 8164 } 8165 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value, config *Config) bool { 8166 b := v.Block 8167 _ = b 8168 // match: (MVNshiftLLreg x (MOVWconst [c])) 8169 // cond: 8170 // result: (MVNshiftLL x [c]) 8171 for { 8172 x := v.Args[0] 8173 v_1 := v.Args[1] 8174 if v_1.Op != OpARMMOVWconst { 8175 break 8176 } 8177 c := v_1.AuxInt 8178 v.reset(OpARMMVNshiftLL) 8179 v.AuxInt = c 8180 v.AddArg(x) 8181 return true 8182 } 8183 return false 8184 } 8185 func rewriteValueARM_OpARMMVNshiftRA(v *Value, config *Config) bool { 8186 b := v.Block 8187 _ = b 8188 // match: (MVNshiftRA (MOVWconst [c]) [d]) 8189 // cond: 8190 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 8191 for { 8192 d := v.AuxInt 8193 v_0 := v.Args[0] 8194 if v_0.Op != OpARMMOVWconst { 8195 break 8196 } 8197 c := v_0.AuxInt 8198 v.reset(OpARMMOVWconst) 8199 v.AuxInt = ^int64(int32(c) >> uint64(d)) 8200 return true 8201 } 8202 return false 8203 } 8204 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value, config *Config) bool { 8205 b := v.Block 8206 _ = b 8207 // match: (MVNshiftRAreg x (MOVWconst [c])) 8208 // cond: 8209 // result: (MVNshiftRA x [c]) 8210 for { 8211 x := v.Args[0] 8212 v_1 := v.Args[1] 8213 if v_1.Op != OpARMMOVWconst { 8214 break 8215 } 8216 c := v_1.AuxInt 8217 v.reset(OpARMMVNshiftRA) 8218 v.AuxInt = c 8219 v.AddArg(x) 8220 return true 8221 } 8222 return false 8223 } 8224 func rewriteValueARM_OpARMMVNshiftRL(v *Value, config *Config) bool { 8225 b := v.Block 8226 _ = b 8227 // match: (MVNshiftRL (MOVWconst [c]) [d]) 8228 // cond: 8229 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 8230 for { 8231 d := v.AuxInt 8232 v_0 := v.Args[0] 8233 if v_0.Op != OpARMMOVWconst { 8234 break 8235 } 8236 c := v_0.AuxInt 8237 v.reset(OpARMMOVWconst) 8238 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 8239 return true 8240 } 8241 return false 8242 } 8243 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value, config *Config) bool { 8244 b := v.Block 8245 _ = b 8246 // match: (MVNshiftRLreg x (MOVWconst [c])) 8247 // cond: 8248 // result: (MVNshiftRL x [c]) 8249 for { 8250 x := v.Args[0] 8251 v_1 := v.Args[1] 8252 if v_1.Op != OpARMMOVWconst { 8253 break 8254 } 8255 c := v_1.AuxInt 8256 v.reset(OpARMMVNshiftRL) 8257 v.AuxInt = c 8258 v.AddArg(x) 8259 return true 8260 } 8261 return false 8262 } 8263 func rewriteValueARM_OpARMNotEqual(v *Value, config *Config) bool { 8264 b := v.Block 8265 _ = b 8266 // match: (NotEqual (FlagEQ)) 8267 // cond: 8268 // result: (MOVWconst [0]) 8269 for { 8270 v_0 := v.Args[0] 8271 if v_0.Op != OpARMFlagEQ { 8272 break 8273 } 8274 v.reset(OpARMMOVWconst) 8275 v.AuxInt = 0 8276 return true 8277 } 8278 // match: (NotEqual (FlagLT_ULT)) 8279 // cond: 8280 // result: (MOVWconst [1]) 8281 for { 8282 v_0 := v.Args[0] 8283 if v_0.Op != OpARMFlagLT_ULT { 8284 break 8285 } 8286 v.reset(OpARMMOVWconst) 8287 v.AuxInt = 1 8288 return true 8289 } 8290 // match: (NotEqual (FlagLT_UGT)) 8291 // cond: 8292 // result: (MOVWconst [1]) 8293 for { 8294 v_0 := v.Args[0] 8295 if v_0.Op != OpARMFlagLT_UGT { 8296 break 8297 } 8298 v.reset(OpARMMOVWconst) 8299 v.AuxInt = 1 8300 return true 8301 } 8302 // match: (NotEqual (FlagGT_ULT)) 8303 // cond: 8304 // result: (MOVWconst [1]) 8305 for { 8306 v_0 := v.Args[0] 8307 if v_0.Op != OpARMFlagGT_ULT { 8308 break 8309 } 8310 v.reset(OpARMMOVWconst) 8311 v.AuxInt = 1 8312 return true 8313 } 8314 // match: (NotEqual (FlagGT_UGT)) 8315 // cond: 8316 // result: (MOVWconst [1]) 8317 for { 8318 v_0 := v.Args[0] 8319 if v_0.Op != OpARMFlagGT_UGT { 8320 break 8321 } 8322 v.reset(OpARMMOVWconst) 8323 v.AuxInt = 1 8324 return true 8325 } 8326 // match: (NotEqual (InvertFlags x)) 8327 // cond: 8328 // result: (NotEqual x) 8329 for { 8330 v_0 := v.Args[0] 8331 if v_0.Op != OpARMInvertFlags { 8332 break 8333 } 8334 x := v_0.Args[0] 8335 v.reset(OpARMNotEqual) 8336 v.AddArg(x) 8337 return true 8338 } 8339 return false 8340 } 8341 func rewriteValueARM_OpARMOR(v *Value, config *Config) bool { 8342 b := v.Block 8343 _ = b 8344 // match: (OR (MOVWconst [c]) x) 8345 // cond: 8346 // result: (ORconst [c] x) 8347 for { 8348 v_0 := v.Args[0] 8349 if v_0.Op != OpARMMOVWconst { 8350 break 8351 } 8352 c := v_0.AuxInt 8353 x := v.Args[1] 8354 v.reset(OpARMORconst) 8355 v.AuxInt = c 8356 v.AddArg(x) 8357 return true 8358 } 8359 // match: (OR x (MOVWconst [c])) 8360 // cond: 8361 // result: (ORconst [c] x) 8362 for { 8363 x := v.Args[0] 8364 v_1 := v.Args[1] 8365 if v_1.Op != OpARMMOVWconst { 8366 break 8367 } 8368 c := v_1.AuxInt 8369 v.reset(OpARMORconst) 8370 v.AuxInt = c 8371 v.AddArg(x) 8372 return true 8373 } 8374 // match: (OR x (SLLconst [c] y)) 8375 // cond: 8376 // result: (ORshiftLL x y [c]) 8377 for { 8378 x := v.Args[0] 8379 v_1 := v.Args[1] 8380 if v_1.Op != OpARMSLLconst { 8381 break 8382 } 8383 c := v_1.AuxInt 8384 y := v_1.Args[0] 8385 v.reset(OpARMORshiftLL) 8386 v.AuxInt = c 8387 v.AddArg(x) 8388 v.AddArg(y) 8389 return true 8390 } 8391 // match: (OR (SLLconst [c] y) x) 8392 // cond: 8393 // result: (ORshiftLL x y [c]) 8394 for { 8395 v_0 := v.Args[0] 8396 if v_0.Op != OpARMSLLconst { 8397 break 8398 } 8399 c := v_0.AuxInt 8400 y := v_0.Args[0] 8401 x := v.Args[1] 8402 v.reset(OpARMORshiftLL) 8403 v.AuxInt = c 8404 v.AddArg(x) 8405 v.AddArg(y) 8406 return true 8407 } 8408 // match: (OR x (SRLconst [c] y)) 8409 // cond: 8410 // result: (ORshiftRL x y [c]) 8411 for { 8412 x := v.Args[0] 8413 v_1 := v.Args[1] 8414 if v_1.Op != OpARMSRLconst { 8415 break 8416 } 8417 c := v_1.AuxInt 8418 y := v_1.Args[0] 8419 v.reset(OpARMORshiftRL) 8420 v.AuxInt = c 8421 v.AddArg(x) 8422 v.AddArg(y) 8423 return true 8424 } 8425 // match: (OR (SRLconst [c] y) x) 8426 // cond: 8427 // result: (ORshiftRL x y [c]) 8428 for { 8429 v_0 := v.Args[0] 8430 if v_0.Op != OpARMSRLconst { 8431 break 8432 } 8433 c := v_0.AuxInt 8434 y := v_0.Args[0] 8435 x := v.Args[1] 8436 v.reset(OpARMORshiftRL) 8437 v.AuxInt = c 8438 v.AddArg(x) 8439 v.AddArg(y) 8440 return true 8441 } 8442 // match: (OR x (SRAconst [c] y)) 8443 // cond: 8444 // result: (ORshiftRA x y [c]) 8445 for { 8446 x := v.Args[0] 8447 v_1 := v.Args[1] 8448 if v_1.Op != OpARMSRAconst { 8449 break 8450 } 8451 c := v_1.AuxInt 8452 y := v_1.Args[0] 8453 v.reset(OpARMORshiftRA) 8454 v.AuxInt = c 8455 v.AddArg(x) 8456 v.AddArg(y) 8457 return true 8458 } 8459 // match: (OR (SRAconst [c] y) x) 8460 // cond: 8461 // result: (ORshiftRA x y [c]) 8462 for { 8463 v_0 := v.Args[0] 8464 if v_0.Op != OpARMSRAconst { 8465 break 8466 } 8467 c := v_0.AuxInt 8468 y := v_0.Args[0] 8469 x := v.Args[1] 8470 v.reset(OpARMORshiftRA) 8471 v.AuxInt = c 8472 v.AddArg(x) 8473 v.AddArg(y) 8474 return true 8475 } 8476 // match: (OR x (SLL y z)) 8477 // cond: 8478 // result: (ORshiftLLreg x y z) 8479 for { 8480 x := v.Args[0] 8481 v_1 := v.Args[1] 8482 if v_1.Op != OpARMSLL { 8483 break 8484 } 8485 y := v_1.Args[0] 8486 z := v_1.Args[1] 8487 v.reset(OpARMORshiftLLreg) 8488 v.AddArg(x) 8489 v.AddArg(y) 8490 v.AddArg(z) 8491 return true 8492 } 8493 // match: (OR (SLL y z) x) 8494 // cond: 8495 // result: (ORshiftLLreg x y z) 8496 for { 8497 v_0 := v.Args[0] 8498 if v_0.Op != OpARMSLL { 8499 break 8500 } 8501 y := v_0.Args[0] 8502 z := v_0.Args[1] 8503 x := v.Args[1] 8504 v.reset(OpARMORshiftLLreg) 8505 v.AddArg(x) 8506 v.AddArg(y) 8507 v.AddArg(z) 8508 return true 8509 } 8510 // match: (OR x (SRL y z)) 8511 // cond: 8512 // result: (ORshiftRLreg x y z) 8513 for { 8514 x := v.Args[0] 8515 v_1 := v.Args[1] 8516 if v_1.Op != OpARMSRL { 8517 break 8518 } 8519 y := v_1.Args[0] 8520 z := v_1.Args[1] 8521 v.reset(OpARMORshiftRLreg) 8522 v.AddArg(x) 8523 v.AddArg(y) 8524 v.AddArg(z) 8525 return true 8526 } 8527 // match: (OR (SRL y z) x) 8528 // cond: 8529 // result: (ORshiftRLreg x y z) 8530 for { 8531 v_0 := v.Args[0] 8532 if v_0.Op != OpARMSRL { 8533 break 8534 } 8535 y := v_0.Args[0] 8536 z := v_0.Args[1] 8537 x := v.Args[1] 8538 v.reset(OpARMORshiftRLreg) 8539 v.AddArg(x) 8540 v.AddArg(y) 8541 v.AddArg(z) 8542 return true 8543 } 8544 // match: (OR x (SRA y z)) 8545 // cond: 8546 // result: (ORshiftRAreg x y z) 8547 for { 8548 x := v.Args[0] 8549 v_1 := v.Args[1] 8550 if v_1.Op != OpARMSRA { 8551 break 8552 } 8553 y := v_1.Args[0] 8554 z := v_1.Args[1] 8555 v.reset(OpARMORshiftRAreg) 8556 v.AddArg(x) 8557 v.AddArg(y) 8558 v.AddArg(z) 8559 return true 8560 } 8561 // match: (OR (SRA y z) x) 8562 // cond: 8563 // result: (ORshiftRAreg x y z) 8564 for { 8565 v_0 := v.Args[0] 8566 if v_0.Op != OpARMSRA { 8567 break 8568 } 8569 y := v_0.Args[0] 8570 z := v_0.Args[1] 8571 x := v.Args[1] 8572 v.reset(OpARMORshiftRAreg) 8573 v.AddArg(x) 8574 v.AddArg(y) 8575 v.AddArg(z) 8576 return true 8577 } 8578 // match: (OR x x) 8579 // cond: 8580 // result: x 8581 for { 8582 x := v.Args[0] 8583 if x != v.Args[1] { 8584 break 8585 } 8586 v.reset(OpCopy) 8587 v.Type = x.Type 8588 v.AddArg(x) 8589 return true 8590 } 8591 return false 8592 } 8593 func rewriteValueARM_OpARMORconst(v *Value, config *Config) bool { 8594 b := v.Block 8595 _ = b 8596 // match: (ORconst [0] x) 8597 // cond: 8598 // result: x 8599 for { 8600 if v.AuxInt != 0 { 8601 break 8602 } 8603 x := v.Args[0] 8604 v.reset(OpCopy) 8605 v.Type = x.Type 8606 v.AddArg(x) 8607 return true 8608 } 8609 // match: (ORconst [c] _) 8610 // cond: int32(c)==-1 8611 // result: (MOVWconst [-1]) 8612 for { 8613 c := v.AuxInt 8614 if !(int32(c) == -1) { 8615 break 8616 } 8617 v.reset(OpARMMOVWconst) 8618 v.AuxInt = -1 8619 return true 8620 } 8621 // match: (ORconst [c] (MOVWconst [d])) 8622 // cond: 8623 // result: (MOVWconst [c|d]) 8624 for { 8625 c := v.AuxInt 8626 v_0 := v.Args[0] 8627 if v_0.Op != OpARMMOVWconst { 8628 break 8629 } 8630 d := v_0.AuxInt 8631 v.reset(OpARMMOVWconst) 8632 v.AuxInt = c | d 8633 return true 8634 } 8635 // match: (ORconst [c] (ORconst [d] x)) 8636 // cond: 8637 // result: (ORconst [c|d] x) 8638 for { 8639 c := v.AuxInt 8640 v_0 := v.Args[0] 8641 if v_0.Op != OpARMORconst { 8642 break 8643 } 8644 d := v_0.AuxInt 8645 x := v_0.Args[0] 8646 v.reset(OpARMORconst) 8647 v.AuxInt = c | d 8648 v.AddArg(x) 8649 return true 8650 } 8651 return false 8652 } 8653 func rewriteValueARM_OpARMORshiftLL(v *Value, config *Config) bool { 8654 b := v.Block 8655 _ = b 8656 // match: (ORshiftLL (MOVWconst [c]) x [d]) 8657 // cond: 8658 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 8659 for { 8660 d := v.AuxInt 8661 v_0 := v.Args[0] 8662 if v_0.Op != OpARMMOVWconst { 8663 break 8664 } 8665 c := v_0.AuxInt 8666 x := v.Args[1] 8667 v.reset(OpARMORconst) 8668 v.AuxInt = c 8669 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 8670 v0.AuxInt = d 8671 v0.AddArg(x) 8672 v.AddArg(v0) 8673 return true 8674 } 8675 // match: (ORshiftLL x (MOVWconst [c]) [d]) 8676 // cond: 8677 // result: (ORconst x [int64(uint32(c)<<uint64(d))]) 8678 for { 8679 d := v.AuxInt 8680 x := v.Args[0] 8681 v_1 := v.Args[1] 8682 if v_1.Op != OpARMMOVWconst { 8683 break 8684 } 8685 c := v_1.AuxInt 8686 v.reset(OpARMORconst) 8687 v.AuxInt = int64(uint32(c) << uint64(d)) 8688 v.AddArg(x) 8689 return true 8690 } 8691 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 8692 // cond: c==d 8693 // result: y 8694 for { 8695 d := v.AuxInt 8696 x := v.Args[0] 8697 y := v.Args[1] 8698 if y.Op != OpARMSLLconst { 8699 break 8700 } 8701 c := y.AuxInt 8702 if x != y.Args[0] { 8703 break 8704 } 8705 if !(c == d) { 8706 break 8707 } 8708 v.reset(OpCopy) 8709 v.Type = y.Type 8710 v.AddArg(y) 8711 return true 8712 } 8713 return false 8714 } 8715 func rewriteValueARM_OpARMORshiftLLreg(v *Value, config *Config) bool { 8716 b := v.Block 8717 _ = b 8718 // match: (ORshiftLLreg (MOVWconst [c]) x y) 8719 // cond: 8720 // result: (ORconst [c] (SLL <x.Type> x y)) 8721 for { 8722 v_0 := v.Args[0] 8723 if v_0.Op != OpARMMOVWconst { 8724 break 8725 } 8726 c := v_0.AuxInt 8727 x := v.Args[1] 8728 y := v.Args[2] 8729 v.reset(OpARMORconst) 8730 v.AuxInt = c 8731 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 8732 v0.AddArg(x) 8733 v0.AddArg(y) 8734 v.AddArg(v0) 8735 return true 8736 } 8737 // match: (ORshiftLLreg x y (MOVWconst [c])) 8738 // cond: 8739 // result: (ORshiftLL x y [c]) 8740 for { 8741 x := v.Args[0] 8742 y := v.Args[1] 8743 v_2 := v.Args[2] 8744 if v_2.Op != OpARMMOVWconst { 8745 break 8746 } 8747 c := v_2.AuxInt 8748 v.reset(OpARMORshiftLL) 8749 v.AuxInt = c 8750 v.AddArg(x) 8751 v.AddArg(y) 8752 return true 8753 } 8754 return false 8755 } 8756 func rewriteValueARM_OpARMORshiftRA(v *Value, config *Config) bool { 8757 b := v.Block 8758 _ = b 8759 // match: (ORshiftRA (MOVWconst [c]) x [d]) 8760 // cond: 8761 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 8762 for { 8763 d := v.AuxInt 8764 v_0 := v.Args[0] 8765 if v_0.Op != OpARMMOVWconst { 8766 break 8767 } 8768 c := v_0.AuxInt 8769 x := v.Args[1] 8770 v.reset(OpARMORconst) 8771 v.AuxInt = c 8772 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 8773 v0.AuxInt = d 8774 v0.AddArg(x) 8775 v.AddArg(v0) 8776 return true 8777 } 8778 // match: (ORshiftRA x (MOVWconst [c]) [d]) 8779 // cond: 8780 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 8781 for { 8782 d := v.AuxInt 8783 x := v.Args[0] 8784 v_1 := v.Args[1] 8785 if v_1.Op != OpARMMOVWconst { 8786 break 8787 } 8788 c := v_1.AuxInt 8789 v.reset(OpARMORconst) 8790 v.AuxInt = int64(int32(c) >> uint64(d)) 8791 v.AddArg(x) 8792 return true 8793 } 8794 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 8795 // cond: c==d 8796 // result: y 8797 for { 8798 d := v.AuxInt 8799 x := v.Args[0] 8800 y := v.Args[1] 8801 if y.Op != OpARMSRAconst { 8802 break 8803 } 8804 c := y.AuxInt 8805 if x != y.Args[0] { 8806 break 8807 } 8808 if !(c == d) { 8809 break 8810 } 8811 v.reset(OpCopy) 8812 v.Type = y.Type 8813 v.AddArg(y) 8814 return true 8815 } 8816 return false 8817 } 8818 func rewriteValueARM_OpARMORshiftRAreg(v *Value, config *Config) bool { 8819 b := v.Block 8820 _ = b 8821 // match: (ORshiftRAreg (MOVWconst [c]) x y) 8822 // cond: 8823 // result: (ORconst [c] (SRA <x.Type> x y)) 8824 for { 8825 v_0 := v.Args[0] 8826 if v_0.Op != OpARMMOVWconst { 8827 break 8828 } 8829 c := v_0.AuxInt 8830 x := v.Args[1] 8831 y := v.Args[2] 8832 v.reset(OpARMORconst) 8833 v.AuxInt = c 8834 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 8835 v0.AddArg(x) 8836 v0.AddArg(y) 8837 v.AddArg(v0) 8838 return true 8839 } 8840 // match: (ORshiftRAreg x y (MOVWconst [c])) 8841 // cond: 8842 // result: (ORshiftRA x y [c]) 8843 for { 8844 x := v.Args[0] 8845 y := v.Args[1] 8846 v_2 := v.Args[2] 8847 if v_2.Op != OpARMMOVWconst { 8848 break 8849 } 8850 c := v_2.AuxInt 8851 v.reset(OpARMORshiftRA) 8852 v.AuxInt = c 8853 v.AddArg(x) 8854 v.AddArg(y) 8855 return true 8856 } 8857 return false 8858 } 8859 func rewriteValueARM_OpARMORshiftRL(v *Value, config *Config) bool { 8860 b := v.Block 8861 _ = b 8862 // match: (ORshiftRL (MOVWconst [c]) x [d]) 8863 // cond: 8864 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 8865 for { 8866 d := v.AuxInt 8867 v_0 := v.Args[0] 8868 if v_0.Op != OpARMMOVWconst { 8869 break 8870 } 8871 c := v_0.AuxInt 8872 x := v.Args[1] 8873 v.reset(OpARMORconst) 8874 v.AuxInt = c 8875 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 8876 v0.AuxInt = d 8877 v0.AddArg(x) 8878 v.AddArg(v0) 8879 return true 8880 } 8881 // match: (ORshiftRL x (MOVWconst [c]) [d]) 8882 // cond: 8883 // result: (ORconst x [int64(uint32(c)>>uint64(d))]) 8884 for { 8885 d := v.AuxInt 8886 x := v.Args[0] 8887 v_1 := v.Args[1] 8888 if v_1.Op != OpARMMOVWconst { 8889 break 8890 } 8891 c := v_1.AuxInt 8892 v.reset(OpARMORconst) 8893 v.AuxInt = int64(uint32(c) >> uint64(d)) 8894 v.AddArg(x) 8895 return true 8896 } 8897 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 8898 // cond: c==d 8899 // result: y 8900 for { 8901 d := v.AuxInt 8902 x := v.Args[0] 8903 y := v.Args[1] 8904 if y.Op != OpARMSRLconst { 8905 break 8906 } 8907 c := y.AuxInt 8908 if x != y.Args[0] { 8909 break 8910 } 8911 if !(c == d) { 8912 break 8913 } 8914 v.reset(OpCopy) 8915 v.Type = y.Type 8916 v.AddArg(y) 8917 return true 8918 } 8919 return false 8920 } 8921 func rewriteValueARM_OpARMORshiftRLreg(v *Value, config *Config) bool { 8922 b := v.Block 8923 _ = b 8924 // match: (ORshiftRLreg (MOVWconst [c]) x y) 8925 // cond: 8926 // result: (ORconst [c] (SRL <x.Type> x y)) 8927 for { 8928 v_0 := v.Args[0] 8929 if v_0.Op != OpARMMOVWconst { 8930 break 8931 } 8932 c := v_0.AuxInt 8933 x := v.Args[1] 8934 y := v.Args[2] 8935 v.reset(OpARMORconst) 8936 v.AuxInt = c 8937 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 8938 v0.AddArg(x) 8939 v0.AddArg(y) 8940 v.AddArg(v0) 8941 return true 8942 } 8943 // match: (ORshiftRLreg x y (MOVWconst [c])) 8944 // cond: 8945 // result: (ORshiftRL x y [c]) 8946 for { 8947 x := v.Args[0] 8948 y := v.Args[1] 8949 v_2 := v.Args[2] 8950 if v_2.Op != OpARMMOVWconst { 8951 break 8952 } 8953 c := v_2.AuxInt 8954 v.reset(OpARMORshiftRL) 8955 v.AuxInt = c 8956 v.AddArg(x) 8957 v.AddArg(y) 8958 return true 8959 } 8960 return false 8961 } 8962 func rewriteValueARM_OpARMRSB(v *Value, config *Config) bool { 8963 b := v.Block 8964 _ = b 8965 // match: (RSB (MOVWconst [c]) x) 8966 // cond: 8967 // result: (SUBconst [c] x) 8968 for { 8969 v_0 := v.Args[0] 8970 if v_0.Op != OpARMMOVWconst { 8971 break 8972 } 8973 c := v_0.AuxInt 8974 x := v.Args[1] 8975 v.reset(OpARMSUBconst) 8976 v.AuxInt = c 8977 v.AddArg(x) 8978 return true 8979 } 8980 // match: (RSB x (MOVWconst [c])) 8981 // cond: 8982 // result: (RSBconst [c] x) 8983 for { 8984 x := v.Args[0] 8985 v_1 := v.Args[1] 8986 if v_1.Op != OpARMMOVWconst { 8987 break 8988 } 8989 c := v_1.AuxInt 8990 v.reset(OpARMRSBconst) 8991 v.AuxInt = c 8992 v.AddArg(x) 8993 return true 8994 } 8995 // match: (RSB x (SLLconst [c] y)) 8996 // cond: 8997 // result: (RSBshiftLL x y [c]) 8998 for { 8999 x := v.Args[0] 9000 v_1 := v.Args[1] 9001 if v_1.Op != OpARMSLLconst { 9002 break 9003 } 9004 c := v_1.AuxInt 9005 y := v_1.Args[0] 9006 v.reset(OpARMRSBshiftLL) 9007 v.AuxInt = c 9008 v.AddArg(x) 9009 v.AddArg(y) 9010 return true 9011 } 9012 // match: (RSB (SLLconst [c] y) x) 9013 // cond: 9014 // result: (SUBshiftLL x y [c]) 9015 for { 9016 v_0 := v.Args[0] 9017 if v_0.Op != OpARMSLLconst { 9018 break 9019 } 9020 c := v_0.AuxInt 9021 y := v_0.Args[0] 9022 x := v.Args[1] 9023 v.reset(OpARMSUBshiftLL) 9024 v.AuxInt = c 9025 v.AddArg(x) 9026 v.AddArg(y) 9027 return true 9028 } 9029 // match: (RSB x (SRLconst [c] y)) 9030 // cond: 9031 // result: (RSBshiftRL x y [c]) 9032 for { 9033 x := v.Args[0] 9034 v_1 := v.Args[1] 9035 if v_1.Op != OpARMSRLconst { 9036 break 9037 } 9038 c := v_1.AuxInt 9039 y := v_1.Args[0] 9040 v.reset(OpARMRSBshiftRL) 9041 v.AuxInt = c 9042 v.AddArg(x) 9043 v.AddArg(y) 9044 return true 9045 } 9046 // match: (RSB (SRLconst [c] y) x) 9047 // cond: 9048 // result: (SUBshiftRL x y [c]) 9049 for { 9050 v_0 := v.Args[0] 9051 if v_0.Op != OpARMSRLconst { 9052 break 9053 } 9054 c := v_0.AuxInt 9055 y := v_0.Args[0] 9056 x := v.Args[1] 9057 v.reset(OpARMSUBshiftRL) 9058 v.AuxInt = c 9059 v.AddArg(x) 9060 v.AddArg(y) 9061 return true 9062 } 9063 // match: (RSB x (SRAconst [c] y)) 9064 // cond: 9065 // result: (RSBshiftRA x y [c]) 9066 for { 9067 x := v.Args[0] 9068 v_1 := v.Args[1] 9069 if v_1.Op != OpARMSRAconst { 9070 break 9071 } 9072 c := v_1.AuxInt 9073 y := v_1.Args[0] 9074 v.reset(OpARMRSBshiftRA) 9075 v.AuxInt = c 9076 v.AddArg(x) 9077 v.AddArg(y) 9078 return true 9079 } 9080 // match: (RSB (SRAconst [c] y) x) 9081 // cond: 9082 // result: (SUBshiftRA x y [c]) 9083 for { 9084 v_0 := v.Args[0] 9085 if v_0.Op != OpARMSRAconst { 9086 break 9087 } 9088 c := v_0.AuxInt 9089 y := v_0.Args[0] 9090 x := v.Args[1] 9091 v.reset(OpARMSUBshiftRA) 9092 v.AuxInt = c 9093 v.AddArg(x) 9094 v.AddArg(y) 9095 return true 9096 } 9097 // match: (RSB x (SLL y z)) 9098 // cond: 9099 // result: (RSBshiftLLreg x y z) 9100 for { 9101 x := v.Args[0] 9102 v_1 := v.Args[1] 9103 if v_1.Op != OpARMSLL { 9104 break 9105 } 9106 y := v_1.Args[0] 9107 z := v_1.Args[1] 9108 v.reset(OpARMRSBshiftLLreg) 9109 v.AddArg(x) 9110 v.AddArg(y) 9111 v.AddArg(z) 9112 return true 9113 } 9114 // match: (RSB (SLL y z) x) 9115 // cond: 9116 // result: (SUBshiftLLreg x y z) 9117 for { 9118 v_0 := v.Args[0] 9119 if v_0.Op != OpARMSLL { 9120 break 9121 } 9122 y := v_0.Args[0] 9123 z := v_0.Args[1] 9124 x := v.Args[1] 9125 v.reset(OpARMSUBshiftLLreg) 9126 v.AddArg(x) 9127 v.AddArg(y) 9128 v.AddArg(z) 9129 return true 9130 } 9131 // match: (RSB x (SRL y z)) 9132 // cond: 9133 // result: (RSBshiftRLreg x y z) 9134 for { 9135 x := v.Args[0] 9136 v_1 := v.Args[1] 9137 if v_1.Op != OpARMSRL { 9138 break 9139 } 9140 y := v_1.Args[0] 9141 z := v_1.Args[1] 9142 v.reset(OpARMRSBshiftRLreg) 9143 v.AddArg(x) 9144 v.AddArg(y) 9145 v.AddArg(z) 9146 return true 9147 } 9148 // match: (RSB (SRL y z) x) 9149 // cond: 9150 // result: (SUBshiftRLreg x y z) 9151 for { 9152 v_0 := v.Args[0] 9153 if v_0.Op != OpARMSRL { 9154 break 9155 } 9156 y := v_0.Args[0] 9157 z := v_0.Args[1] 9158 x := v.Args[1] 9159 v.reset(OpARMSUBshiftRLreg) 9160 v.AddArg(x) 9161 v.AddArg(y) 9162 v.AddArg(z) 9163 return true 9164 } 9165 // match: (RSB x (SRA y z)) 9166 // cond: 9167 // result: (RSBshiftRAreg x y z) 9168 for { 9169 x := v.Args[0] 9170 v_1 := v.Args[1] 9171 if v_1.Op != OpARMSRA { 9172 break 9173 } 9174 y := v_1.Args[0] 9175 z := v_1.Args[1] 9176 v.reset(OpARMRSBshiftRAreg) 9177 v.AddArg(x) 9178 v.AddArg(y) 9179 v.AddArg(z) 9180 return true 9181 } 9182 // match: (RSB (SRA y z) x) 9183 // cond: 9184 // result: (SUBshiftRAreg x y z) 9185 for { 9186 v_0 := v.Args[0] 9187 if v_0.Op != OpARMSRA { 9188 break 9189 } 9190 y := v_0.Args[0] 9191 z := v_0.Args[1] 9192 x := v.Args[1] 9193 v.reset(OpARMSUBshiftRAreg) 9194 v.AddArg(x) 9195 v.AddArg(y) 9196 v.AddArg(z) 9197 return true 9198 } 9199 // match: (RSB x x) 9200 // cond: 9201 // result: (MOVWconst [0]) 9202 for { 9203 x := v.Args[0] 9204 if x != v.Args[1] { 9205 break 9206 } 9207 v.reset(OpARMMOVWconst) 9208 v.AuxInt = 0 9209 return true 9210 } 9211 return false 9212 } 9213 func rewriteValueARM_OpARMRSBSshiftLL(v *Value, config *Config) bool { 9214 b := v.Block 9215 _ = b 9216 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 9217 // cond: 9218 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 9219 for { 9220 d := v.AuxInt 9221 v_0 := v.Args[0] 9222 if v_0.Op != OpARMMOVWconst { 9223 break 9224 } 9225 c := v_0.AuxInt 9226 x := v.Args[1] 9227 v.reset(OpARMSUBSconst) 9228 v.AuxInt = c 9229 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 9230 v0.AuxInt = d 9231 v0.AddArg(x) 9232 v.AddArg(v0) 9233 return true 9234 } 9235 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 9236 // cond: 9237 // result: (RSBSconst x [int64(uint32(c)<<uint64(d))]) 9238 for { 9239 d := v.AuxInt 9240 x := v.Args[0] 9241 v_1 := v.Args[1] 9242 if v_1.Op != OpARMMOVWconst { 9243 break 9244 } 9245 c := v_1.AuxInt 9246 v.reset(OpARMRSBSconst) 9247 v.AuxInt = int64(uint32(c) << uint64(d)) 9248 v.AddArg(x) 9249 return true 9250 } 9251 return false 9252 } 9253 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value, config *Config) bool { 9254 b := v.Block 9255 _ = b 9256 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 9257 // cond: 9258 // result: (SUBSconst [c] (SLL <x.Type> x y)) 9259 for { 9260 v_0 := v.Args[0] 9261 if v_0.Op != OpARMMOVWconst { 9262 break 9263 } 9264 c := v_0.AuxInt 9265 x := v.Args[1] 9266 y := v.Args[2] 9267 v.reset(OpARMSUBSconst) 9268 v.AuxInt = c 9269 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 9270 v0.AddArg(x) 9271 v0.AddArg(y) 9272 v.AddArg(v0) 9273 return true 9274 } 9275 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 9276 // cond: 9277 // result: (RSBSshiftLL x y [c]) 9278 for { 9279 x := v.Args[0] 9280 y := v.Args[1] 9281 v_2 := v.Args[2] 9282 if v_2.Op != OpARMMOVWconst { 9283 break 9284 } 9285 c := v_2.AuxInt 9286 v.reset(OpARMRSBSshiftLL) 9287 v.AuxInt = c 9288 v.AddArg(x) 9289 v.AddArg(y) 9290 return true 9291 } 9292 return false 9293 } 9294 func rewriteValueARM_OpARMRSBSshiftRA(v *Value, config *Config) bool { 9295 b := v.Block 9296 _ = b 9297 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 9298 // cond: 9299 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 9300 for { 9301 d := v.AuxInt 9302 v_0 := v.Args[0] 9303 if v_0.Op != OpARMMOVWconst { 9304 break 9305 } 9306 c := v_0.AuxInt 9307 x := v.Args[1] 9308 v.reset(OpARMSUBSconst) 9309 v.AuxInt = c 9310 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 9311 v0.AuxInt = d 9312 v0.AddArg(x) 9313 v.AddArg(v0) 9314 return true 9315 } 9316 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 9317 // cond: 9318 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 9319 for { 9320 d := v.AuxInt 9321 x := v.Args[0] 9322 v_1 := v.Args[1] 9323 if v_1.Op != OpARMMOVWconst { 9324 break 9325 } 9326 c := v_1.AuxInt 9327 v.reset(OpARMRSBSconst) 9328 v.AuxInt = int64(int32(c) >> uint64(d)) 9329 v.AddArg(x) 9330 return true 9331 } 9332 return false 9333 } 9334 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value, config *Config) bool { 9335 b := v.Block 9336 _ = b 9337 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 9338 // cond: 9339 // result: (SUBSconst [c] (SRA <x.Type> x y)) 9340 for { 9341 v_0 := v.Args[0] 9342 if v_0.Op != OpARMMOVWconst { 9343 break 9344 } 9345 c := v_0.AuxInt 9346 x := v.Args[1] 9347 y := v.Args[2] 9348 v.reset(OpARMSUBSconst) 9349 v.AuxInt = c 9350 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 9351 v0.AddArg(x) 9352 v0.AddArg(y) 9353 v.AddArg(v0) 9354 return true 9355 } 9356 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 9357 // cond: 9358 // result: (RSBSshiftRA x y [c]) 9359 for { 9360 x := v.Args[0] 9361 y := v.Args[1] 9362 v_2 := v.Args[2] 9363 if v_2.Op != OpARMMOVWconst { 9364 break 9365 } 9366 c := v_2.AuxInt 9367 v.reset(OpARMRSBSshiftRA) 9368 v.AuxInt = c 9369 v.AddArg(x) 9370 v.AddArg(y) 9371 return true 9372 } 9373 return false 9374 } 9375 func rewriteValueARM_OpARMRSBSshiftRL(v *Value, config *Config) bool { 9376 b := v.Block 9377 _ = b 9378 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 9379 // cond: 9380 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 9381 for { 9382 d := v.AuxInt 9383 v_0 := v.Args[0] 9384 if v_0.Op != OpARMMOVWconst { 9385 break 9386 } 9387 c := v_0.AuxInt 9388 x := v.Args[1] 9389 v.reset(OpARMSUBSconst) 9390 v.AuxInt = c 9391 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 9392 v0.AuxInt = d 9393 v0.AddArg(x) 9394 v.AddArg(v0) 9395 return true 9396 } 9397 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 9398 // cond: 9399 // result: (RSBSconst x [int64(uint32(c)>>uint64(d))]) 9400 for { 9401 d := v.AuxInt 9402 x := v.Args[0] 9403 v_1 := v.Args[1] 9404 if v_1.Op != OpARMMOVWconst { 9405 break 9406 } 9407 c := v_1.AuxInt 9408 v.reset(OpARMRSBSconst) 9409 v.AuxInt = int64(uint32(c) >> uint64(d)) 9410 v.AddArg(x) 9411 return true 9412 } 9413 return false 9414 } 9415 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value, config *Config) bool { 9416 b := v.Block 9417 _ = b 9418 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 9419 // cond: 9420 // result: (SUBSconst [c] (SRL <x.Type> x y)) 9421 for { 9422 v_0 := v.Args[0] 9423 if v_0.Op != OpARMMOVWconst { 9424 break 9425 } 9426 c := v_0.AuxInt 9427 x := v.Args[1] 9428 y := v.Args[2] 9429 v.reset(OpARMSUBSconst) 9430 v.AuxInt = c 9431 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 9432 v0.AddArg(x) 9433 v0.AddArg(y) 9434 v.AddArg(v0) 9435 return true 9436 } 9437 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 9438 // cond: 9439 // result: (RSBSshiftRL x y [c]) 9440 for { 9441 x := v.Args[0] 9442 y := v.Args[1] 9443 v_2 := v.Args[2] 9444 if v_2.Op != OpARMMOVWconst { 9445 break 9446 } 9447 c := v_2.AuxInt 9448 v.reset(OpARMRSBSshiftRL) 9449 v.AuxInt = c 9450 v.AddArg(x) 9451 v.AddArg(y) 9452 return true 9453 } 9454 return false 9455 } 9456 func rewriteValueARM_OpARMRSBconst(v *Value, config *Config) bool { 9457 b := v.Block 9458 _ = b 9459 // match: (RSBconst [c] (MOVWconst [d])) 9460 // cond: 9461 // result: (MOVWconst [int64(int32(c-d))]) 9462 for { 9463 c := v.AuxInt 9464 v_0 := v.Args[0] 9465 if v_0.Op != OpARMMOVWconst { 9466 break 9467 } 9468 d := v_0.AuxInt 9469 v.reset(OpARMMOVWconst) 9470 v.AuxInt = int64(int32(c - d)) 9471 return true 9472 } 9473 // match: (RSBconst [c] (RSBconst [d] x)) 9474 // cond: 9475 // result: (ADDconst [int64(int32(c-d))] x) 9476 for { 9477 c := v.AuxInt 9478 v_0 := v.Args[0] 9479 if v_0.Op != OpARMRSBconst { 9480 break 9481 } 9482 d := v_0.AuxInt 9483 x := v_0.Args[0] 9484 v.reset(OpARMADDconst) 9485 v.AuxInt = int64(int32(c - d)) 9486 v.AddArg(x) 9487 return true 9488 } 9489 // match: (RSBconst [c] (ADDconst [d] x)) 9490 // cond: 9491 // result: (RSBconst [int64(int32(c-d))] x) 9492 for { 9493 c := v.AuxInt 9494 v_0 := v.Args[0] 9495 if v_0.Op != OpARMADDconst { 9496 break 9497 } 9498 d := v_0.AuxInt 9499 x := v_0.Args[0] 9500 v.reset(OpARMRSBconst) 9501 v.AuxInt = int64(int32(c - d)) 9502 v.AddArg(x) 9503 return true 9504 } 9505 // match: (RSBconst [c] (SUBconst [d] x)) 9506 // cond: 9507 // result: (RSBconst [int64(int32(c+d))] x) 9508 for { 9509 c := v.AuxInt 9510 v_0 := v.Args[0] 9511 if v_0.Op != OpARMSUBconst { 9512 break 9513 } 9514 d := v_0.AuxInt 9515 x := v_0.Args[0] 9516 v.reset(OpARMRSBconst) 9517 v.AuxInt = int64(int32(c + d)) 9518 v.AddArg(x) 9519 return true 9520 } 9521 return false 9522 } 9523 func rewriteValueARM_OpARMRSBshiftLL(v *Value, config *Config) bool { 9524 b := v.Block 9525 _ = b 9526 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 9527 // cond: 9528 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 9529 for { 9530 d := v.AuxInt 9531 v_0 := v.Args[0] 9532 if v_0.Op != OpARMMOVWconst { 9533 break 9534 } 9535 c := v_0.AuxInt 9536 x := v.Args[1] 9537 v.reset(OpARMSUBconst) 9538 v.AuxInt = c 9539 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 9540 v0.AuxInt = d 9541 v0.AddArg(x) 9542 v.AddArg(v0) 9543 return true 9544 } 9545 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 9546 // cond: 9547 // result: (RSBconst x [int64(uint32(c)<<uint64(d))]) 9548 for { 9549 d := v.AuxInt 9550 x := v.Args[0] 9551 v_1 := v.Args[1] 9552 if v_1.Op != OpARMMOVWconst { 9553 break 9554 } 9555 c := v_1.AuxInt 9556 v.reset(OpARMRSBconst) 9557 v.AuxInt = int64(uint32(c) << uint64(d)) 9558 v.AddArg(x) 9559 return true 9560 } 9561 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 9562 // cond: c==d 9563 // result: (MOVWconst [0]) 9564 for { 9565 d := v.AuxInt 9566 x := v.Args[0] 9567 v_1 := v.Args[1] 9568 if v_1.Op != OpARMSLLconst { 9569 break 9570 } 9571 c := v_1.AuxInt 9572 if x != v_1.Args[0] { 9573 break 9574 } 9575 if !(c == d) { 9576 break 9577 } 9578 v.reset(OpARMMOVWconst) 9579 v.AuxInt = 0 9580 return true 9581 } 9582 return false 9583 } 9584 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value, config *Config) bool { 9585 b := v.Block 9586 _ = b 9587 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 9588 // cond: 9589 // result: (SUBconst [c] (SLL <x.Type> x y)) 9590 for { 9591 v_0 := v.Args[0] 9592 if v_0.Op != OpARMMOVWconst { 9593 break 9594 } 9595 c := v_0.AuxInt 9596 x := v.Args[1] 9597 y := v.Args[2] 9598 v.reset(OpARMSUBconst) 9599 v.AuxInt = c 9600 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 9601 v0.AddArg(x) 9602 v0.AddArg(y) 9603 v.AddArg(v0) 9604 return true 9605 } 9606 // match: (RSBshiftLLreg x y (MOVWconst [c])) 9607 // cond: 9608 // result: (RSBshiftLL x y [c]) 9609 for { 9610 x := v.Args[0] 9611 y := v.Args[1] 9612 v_2 := v.Args[2] 9613 if v_2.Op != OpARMMOVWconst { 9614 break 9615 } 9616 c := v_2.AuxInt 9617 v.reset(OpARMRSBshiftLL) 9618 v.AuxInt = c 9619 v.AddArg(x) 9620 v.AddArg(y) 9621 return true 9622 } 9623 return false 9624 } 9625 func rewriteValueARM_OpARMRSBshiftRA(v *Value, config *Config) bool { 9626 b := v.Block 9627 _ = b 9628 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 9629 // cond: 9630 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 9631 for { 9632 d := v.AuxInt 9633 v_0 := v.Args[0] 9634 if v_0.Op != OpARMMOVWconst { 9635 break 9636 } 9637 c := v_0.AuxInt 9638 x := v.Args[1] 9639 v.reset(OpARMSUBconst) 9640 v.AuxInt = c 9641 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 9642 v0.AuxInt = d 9643 v0.AddArg(x) 9644 v.AddArg(v0) 9645 return true 9646 } 9647 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 9648 // cond: 9649 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 9650 for { 9651 d := v.AuxInt 9652 x := v.Args[0] 9653 v_1 := v.Args[1] 9654 if v_1.Op != OpARMMOVWconst { 9655 break 9656 } 9657 c := v_1.AuxInt 9658 v.reset(OpARMRSBconst) 9659 v.AuxInt = int64(int32(c) >> uint64(d)) 9660 v.AddArg(x) 9661 return true 9662 } 9663 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 9664 // cond: c==d 9665 // result: (MOVWconst [0]) 9666 for { 9667 d := v.AuxInt 9668 x := v.Args[0] 9669 v_1 := v.Args[1] 9670 if v_1.Op != OpARMSRAconst { 9671 break 9672 } 9673 c := v_1.AuxInt 9674 if x != v_1.Args[0] { 9675 break 9676 } 9677 if !(c == d) { 9678 break 9679 } 9680 v.reset(OpARMMOVWconst) 9681 v.AuxInt = 0 9682 return true 9683 } 9684 return false 9685 } 9686 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value, config *Config) bool { 9687 b := v.Block 9688 _ = b 9689 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 9690 // cond: 9691 // result: (SUBconst [c] (SRA <x.Type> x y)) 9692 for { 9693 v_0 := v.Args[0] 9694 if v_0.Op != OpARMMOVWconst { 9695 break 9696 } 9697 c := v_0.AuxInt 9698 x := v.Args[1] 9699 y := v.Args[2] 9700 v.reset(OpARMSUBconst) 9701 v.AuxInt = c 9702 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 9703 v0.AddArg(x) 9704 v0.AddArg(y) 9705 v.AddArg(v0) 9706 return true 9707 } 9708 // match: (RSBshiftRAreg x y (MOVWconst [c])) 9709 // cond: 9710 // result: (RSBshiftRA x y [c]) 9711 for { 9712 x := v.Args[0] 9713 y := v.Args[1] 9714 v_2 := v.Args[2] 9715 if v_2.Op != OpARMMOVWconst { 9716 break 9717 } 9718 c := v_2.AuxInt 9719 v.reset(OpARMRSBshiftRA) 9720 v.AuxInt = c 9721 v.AddArg(x) 9722 v.AddArg(y) 9723 return true 9724 } 9725 return false 9726 } 9727 func rewriteValueARM_OpARMRSBshiftRL(v *Value, config *Config) bool { 9728 b := v.Block 9729 _ = b 9730 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 9731 // cond: 9732 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 9733 for { 9734 d := v.AuxInt 9735 v_0 := v.Args[0] 9736 if v_0.Op != OpARMMOVWconst { 9737 break 9738 } 9739 c := v_0.AuxInt 9740 x := v.Args[1] 9741 v.reset(OpARMSUBconst) 9742 v.AuxInt = c 9743 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 9744 v0.AuxInt = d 9745 v0.AddArg(x) 9746 v.AddArg(v0) 9747 return true 9748 } 9749 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 9750 // cond: 9751 // result: (RSBconst x [int64(uint32(c)>>uint64(d))]) 9752 for { 9753 d := v.AuxInt 9754 x := v.Args[0] 9755 v_1 := v.Args[1] 9756 if v_1.Op != OpARMMOVWconst { 9757 break 9758 } 9759 c := v_1.AuxInt 9760 v.reset(OpARMRSBconst) 9761 v.AuxInt = int64(uint32(c) >> uint64(d)) 9762 v.AddArg(x) 9763 return true 9764 } 9765 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 9766 // cond: c==d 9767 // result: (MOVWconst [0]) 9768 for { 9769 d := v.AuxInt 9770 x := v.Args[0] 9771 v_1 := v.Args[1] 9772 if v_1.Op != OpARMSRLconst { 9773 break 9774 } 9775 c := v_1.AuxInt 9776 if x != v_1.Args[0] { 9777 break 9778 } 9779 if !(c == d) { 9780 break 9781 } 9782 v.reset(OpARMMOVWconst) 9783 v.AuxInt = 0 9784 return true 9785 } 9786 return false 9787 } 9788 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value, config *Config) bool { 9789 b := v.Block 9790 _ = b 9791 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 9792 // cond: 9793 // result: (SUBconst [c] (SRL <x.Type> x y)) 9794 for { 9795 v_0 := v.Args[0] 9796 if v_0.Op != OpARMMOVWconst { 9797 break 9798 } 9799 c := v_0.AuxInt 9800 x := v.Args[1] 9801 y := v.Args[2] 9802 v.reset(OpARMSUBconst) 9803 v.AuxInt = c 9804 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 9805 v0.AddArg(x) 9806 v0.AddArg(y) 9807 v.AddArg(v0) 9808 return true 9809 } 9810 // match: (RSBshiftRLreg x y (MOVWconst [c])) 9811 // cond: 9812 // result: (RSBshiftRL x y [c]) 9813 for { 9814 x := v.Args[0] 9815 y := v.Args[1] 9816 v_2 := v.Args[2] 9817 if v_2.Op != OpARMMOVWconst { 9818 break 9819 } 9820 c := v_2.AuxInt 9821 v.reset(OpARMRSBshiftRL) 9822 v.AuxInt = c 9823 v.AddArg(x) 9824 v.AddArg(y) 9825 return true 9826 } 9827 return false 9828 } 9829 func rewriteValueARM_OpARMRSCconst(v *Value, config *Config) bool { 9830 b := v.Block 9831 _ = b 9832 // match: (RSCconst [c] (ADDconst [d] x) flags) 9833 // cond: 9834 // result: (RSCconst [int64(int32(c-d))] x flags) 9835 for { 9836 c := v.AuxInt 9837 v_0 := v.Args[0] 9838 if v_0.Op != OpARMADDconst { 9839 break 9840 } 9841 d := v_0.AuxInt 9842 x := v_0.Args[0] 9843 flags := v.Args[1] 9844 v.reset(OpARMRSCconst) 9845 v.AuxInt = int64(int32(c - d)) 9846 v.AddArg(x) 9847 v.AddArg(flags) 9848 return true 9849 } 9850 // match: (RSCconst [c] (SUBconst [d] x) flags) 9851 // cond: 9852 // result: (RSCconst [int64(int32(c+d))] x flags) 9853 for { 9854 c := v.AuxInt 9855 v_0 := v.Args[0] 9856 if v_0.Op != OpARMSUBconst { 9857 break 9858 } 9859 d := v_0.AuxInt 9860 x := v_0.Args[0] 9861 flags := v.Args[1] 9862 v.reset(OpARMRSCconst) 9863 v.AuxInt = int64(int32(c + d)) 9864 v.AddArg(x) 9865 v.AddArg(flags) 9866 return true 9867 } 9868 return false 9869 } 9870 func rewriteValueARM_OpARMRSCshiftLL(v *Value, config *Config) bool { 9871 b := v.Block 9872 _ = b 9873 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 9874 // cond: 9875 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 9876 for { 9877 d := v.AuxInt 9878 v_0 := v.Args[0] 9879 if v_0.Op != OpARMMOVWconst { 9880 break 9881 } 9882 c := v_0.AuxInt 9883 x := v.Args[1] 9884 flags := v.Args[2] 9885 v.reset(OpARMSBCconst) 9886 v.AuxInt = c 9887 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 9888 v0.AuxInt = d 9889 v0.AddArg(x) 9890 v.AddArg(v0) 9891 v.AddArg(flags) 9892 return true 9893 } 9894 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 9895 // cond: 9896 // result: (RSCconst x [int64(uint32(c)<<uint64(d))] flags) 9897 for { 9898 d := v.AuxInt 9899 x := v.Args[0] 9900 v_1 := v.Args[1] 9901 if v_1.Op != OpARMMOVWconst { 9902 break 9903 } 9904 c := v_1.AuxInt 9905 flags := v.Args[2] 9906 v.reset(OpARMRSCconst) 9907 v.AuxInt = int64(uint32(c) << uint64(d)) 9908 v.AddArg(x) 9909 v.AddArg(flags) 9910 return true 9911 } 9912 return false 9913 } 9914 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value, config *Config) bool { 9915 b := v.Block 9916 _ = b 9917 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 9918 // cond: 9919 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 9920 for { 9921 v_0 := v.Args[0] 9922 if v_0.Op != OpARMMOVWconst { 9923 break 9924 } 9925 c := v_0.AuxInt 9926 x := v.Args[1] 9927 y := v.Args[2] 9928 flags := v.Args[3] 9929 v.reset(OpARMSBCconst) 9930 v.AuxInt = c 9931 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 9932 v0.AddArg(x) 9933 v0.AddArg(y) 9934 v.AddArg(v0) 9935 v.AddArg(flags) 9936 return true 9937 } 9938 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 9939 // cond: 9940 // result: (RSCshiftLL x y [c] flags) 9941 for { 9942 x := v.Args[0] 9943 y := v.Args[1] 9944 v_2 := v.Args[2] 9945 if v_2.Op != OpARMMOVWconst { 9946 break 9947 } 9948 c := v_2.AuxInt 9949 flags := v.Args[3] 9950 v.reset(OpARMRSCshiftLL) 9951 v.AuxInt = c 9952 v.AddArg(x) 9953 v.AddArg(y) 9954 v.AddArg(flags) 9955 return true 9956 } 9957 return false 9958 } 9959 func rewriteValueARM_OpARMRSCshiftRA(v *Value, config *Config) bool { 9960 b := v.Block 9961 _ = b 9962 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 9963 // cond: 9964 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 9965 for { 9966 d := v.AuxInt 9967 v_0 := v.Args[0] 9968 if v_0.Op != OpARMMOVWconst { 9969 break 9970 } 9971 c := v_0.AuxInt 9972 x := v.Args[1] 9973 flags := v.Args[2] 9974 v.reset(OpARMSBCconst) 9975 v.AuxInt = c 9976 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 9977 v0.AuxInt = d 9978 v0.AddArg(x) 9979 v.AddArg(v0) 9980 v.AddArg(flags) 9981 return true 9982 } 9983 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 9984 // cond: 9985 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 9986 for { 9987 d := v.AuxInt 9988 x := v.Args[0] 9989 v_1 := v.Args[1] 9990 if v_1.Op != OpARMMOVWconst { 9991 break 9992 } 9993 c := v_1.AuxInt 9994 flags := v.Args[2] 9995 v.reset(OpARMRSCconst) 9996 v.AuxInt = int64(int32(c) >> uint64(d)) 9997 v.AddArg(x) 9998 v.AddArg(flags) 9999 return true 10000 } 10001 return false 10002 } 10003 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value, config *Config) bool { 10004 b := v.Block 10005 _ = b 10006 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 10007 // cond: 10008 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 10009 for { 10010 v_0 := v.Args[0] 10011 if v_0.Op != OpARMMOVWconst { 10012 break 10013 } 10014 c := v_0.AuxInt 10015 x := v.Args[1] 10016 y := v.Args[2] 10017 flags := v.Args[3] 10018 v.reset(OpARMSBCconst) 10019 v.AuxInt = c 10020 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 10021 v0.AddArg(x) 10022 v0.AddArg(y) 10023 v.AddArg(v0) 10024 v.AddArg(flags) 10025 return true 10026 } 10027 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 10028 // cond: 10029 // result: (RSCshiftRA x y [c] flags) 10030 for { 10031 x := v.Args[0] 10032 y := v.Args[1] 10033 v_2 := v.Args[2] 10034 if v_2.Op != OpARMMOVWconst { 10035 break 10036 } 10037 c := v_2.AuxInt 10038 flags := v.Args[3] 10039 v.reset(OpARMRSCshiftRA) 10040 v.AuxInt = c 10041 v.AddArg(x) 10042 v.AddArg(y) 10043 v.AddArg(flags) 10044 return true 10045 } 10046 return false 10047 } 10048 func rewriteValueARM_OpARMRSCshiftRL(v *Value, config *Config) bool { 10049 b := v.Block 10050 _ = b 10051 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 10052 // cond: 10053 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 10054 for { 10055 d := v.AuxInt 10056 v_0 := v.Args[0] 10057 if v_0.Op != OpARMMOVWconst { 10058 break 10059 } 10060 c := v_0.AuxInt 10061 x := v.Args[1] 10062 flags := v.Args[2] 10063 v.reset(OpARMSBCconst) 10064 v.AuxInt = c 10065 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 10066 v0.AuxInt = d 10067 v0.AddArg(x) 10068 v.AddArg(v0) 10069 v.AddArg(flags) 10070 return true 10071 } 10072 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 10073 // cond: 10074 // result: (RSCconst x [int64(uint32(c)>>uint64(d))] flags) 10075 for { 10076 d := v.AuxInt 10077 x := v.Args[0] 10078 v_1 := v.Args[1] 10079 if v_1.Op != OpARMMOVWconst { 10080 break 10081 } 10082 c := v_1.AuxInt 10083 flags := v.Args[2] 10084 v.reset(OpARMRSCconst) 10085 v.AuxInt = int64(uint32(c) >> uint64(d)) 10086 v.AddArg(x) 10087 v.AddArg(flags) 10088 return true 10089 } 10090 return false 10091 } 10092 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value, config *Config) bool { 10093 b := v.Block 10094 _ = b 10095 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 10096 // cond: 10097 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 10098 for { 10099 v_0 := v.Args[0] 10100 if v_0.Op != OpARMMOVWconst { 10101 break 10102 } 10103 c := v_0.AuxInt 10104 x := v.Args[1] 10105 y := v.Args[2] 10106 flags := v.Args[3] 10107 v.reset(OpARMSBCconst) 10108 v.AuxInt = c 10109 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 10110 v0.AddArg(x) 10111 v0.AddArg(y) 10112 v.AddArg(v0) 10113 v.AddArg(flags) 10114 return true 10115 } 10116 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 10117 // cond: 10118 // result: (RSCshiftRL x y [c] flags) 10119 for { 10120 x := v.Args[0] 10121 y := v.Args[1] 10122 v_2 := v.Args[2] 10123 if v_2.Op != OpARMMOVWconst { 10124 break 10125 } 10126 c := v_2.AuxInt 10127 flags := v.Args[3] 10128 v.reset(OpARMRSCshiftRL) 10129 v.AuxInt = c 10130 v.AddArg(x) 10131 v.AddArg(y) 10132 v.AddArg(flags) 10133 return true 10134 } 10135 return false 10136 } 10137 func rewriteValueARM_OpARMSBC(v *Value, config *Config) bool { 10138 b := v.Block 10139 _ = b 10140 // match: (SBC (MOVWconst [c]) x flags) 10141 // cond: 10142 // result: (RSCconst [c] x flags) 10143 for { 10144 v_0 := v.Args[0] 10145 if v_0.Op != OpARMMOVWconst { 10146 break 10147 } 10148 c := v_0.AuxInt 10149 x := v.Args[1] 10150 flags := v.Args[2] 10151 v.reset(OpARMRSCconst) 10152 v.AuxInt = c 10153 v.AddArg(x) 10154 v.AddArg(flags) 10155 return true 10156 } 10157 // match: (SBC x (MOVWconst [c]) flags) 10158 // cond: 10159 // result: (SBCconst [c] x flags) 10160 for { 10161 x := v.Args[0] 10162 v_1 := v.Args[1] 10163 if v_1.Op != OpARMMOVWconst { 10164 break 10165 } 10166 c := v_1.AuxInt 10167 flags := v.Args[2] 10168 v.reset(OpARMSBCconst) 10169 v.AuxInt = c 10170 v.AddArg(x) 10171 v.AddArg(flags) 10172 return true 10173 } 10174 // match: (SBC x (SLLconst [c] y) flags) 10175 // cond: 10176 // result: (SBCshiftLL x y [c] flags) 10177 for { 10178 x := v.Args[0] 10179 v_1 := v.Args[1] 10180 if v_1.Op != OpARMSLLconst { 10181 break 10182 } 10183 c := v_1.AuxInt 10184 y := v_1.Args[0] 10185 flags := v.Args[2] 10186 v.reset(OpARMSBCshiftLL) 10187 v.AuxInt = c 10188 v.AddArg(x) 10189 v.AddArg(y) 10190 v.AddArg(flags) 10191 return true 10192 } 10193 // match: (SBC (SLLconst [c] y) x flags) 10194 // cond: 10195 // result: (RSCshiftLL x y [c] flags) 10196 for { 10197 v_0 := v.Args[0] 10198 if v_0.Op != OpARMSLLconst { 10199 break 10200 } 10201 c := v_0.AuxInt 10202 y := v_0.Args[0] 10203 x := v.Args[1] 10204 flags := v.Args[2] 10205 v.reset(OpARMRSCshiftLL) 10206 v.AuxInt = c 10207 v.AddArg(x) 10208 v.AddArg(y) 10209 v.AddArg(flags) 10210 return true 10211 } 10212 // match: (SBC x (SRLconst [c] y) flags) 10213 // cond: 10214 // result: (SBCshiftRL x y [c] flags) 10215 for { 10216 x := v.Args[0] 10217 v_1 := v.Args[1] 10218 if v_1.Op != OpARMSRLconst { 10219 break 10220 } 10221 c := v_1.AuxInt 10222 y := v_1.Args[0] 10223 flags := v.Args[2] 10224 v.reset(OpARMSBCshiftRL) 10225 v.AuxInt = c 10226 v.AddArg(x) 10227 v.AddArg(y) 10228 v.AddArg(flags) 10229 return true 10230 } 10231 // match: (SBC (SRLconst [c] y) x flags) 10232 // cond: 10233 // result: (RSCshiftRL x y [c] flags) 10234 for { 10235 v_0 := v.Args[0] 10236 if v_0.Op != OpARMSRLconst { 10237 break 10238 } 10239 c := v_0.AuxInt 10240 y := v_0.Args[0] 10241 x := v.Args[1] 10242 flags := v.Args[2] 10243 v.reset(OpARMRSCshiftRL) 10244 v.AuxInt = c 10245 v.AddArg(x) 10246 v.AddArg(y) 10247 v.AddArg(flags) 10248 return true 10249 } 10250 // match: (SBC x (SRAconst [c] y) flags) 10251 // cond: 10252 // result: (SBCshiftRA x y [c] flags) 10253 for { 10254 x := v.Args[0] 10255 v_1 := v.Args[1] 10256 if v_1.Op != OpARMSRAconst { 10257 break 10258 } 10259 c := v_1.AuxInt 10260 y := v_1.Args[0] 10261 flags := v.Args[2] 10262 v.reset(OpARMSBCshiftRA) 10263 v.AuxInt = c 10264 v.AddArg(x) 10265 v.AddArg(y) 10266 v.AddArg(flags) 10267 return true 10268 } 10269 // match: (SBC (SRAconst [c] y) x flags) 10270 // cond: 10271 // result: (RSCshiftRA x y [c] flags) 10272 for { 10273 v_0 := v.Args[0] 10274 if v_0.Op != OpARMSRAconst { 10275 break 10276 } 10277 c := v_0.AuxInt 10278 y := v_0.Args[0] 10279 x := v.Args[1] 10280 flags := v.Args[2] 10281 v.reset(OpARMRSCshiftRA) 10282 v.AuxInt = c 10283 v.AddArg(x) 10284 v.AddArg(y) 10285 v.AddArg(flags) 10286 return true 10287 } 10288 // match: (SBC x (SLL y z) flags) 10289 // cond: 10290 // result: (SBCshiftLLreg x y z flags) 10291 for { 10292 x := v.Args[0] 10293 v_1 := v.Args[1] 10294 if v_1.Op != OpARMSLL { 10295 break 10296 } 10297 y := v_1.Args[0] 10298 z := v_1.Args[1] 10299 flags := v.Args[2] 10300 v.reset(OpARMSBCshiftLLreg) 10301 v.AddArg(x) 10302 v.AddArg(y) 10303 v.AddArg(z) 10304 v.AddArg(flags) 10305 return true 10306 } 10307 // match: (SBC (SLL y z) x flags) 10308 // cond: 10309 // result: (RSCshiftLLreg x y z flags) 10310 for { 10311 v_0 := v.Args[0] 10312 if v_0.Op != OpARMSLL { 10313 break 10314 } 10315 y := v_0.Args[0] 10316 z := v_0.Args[1] 10317 x := v.Args[1] 10318 flags := v.Args[2] 10319 v.reset(OpARMRSCshiftLLreg) 10320 v.AddArg(x) 10321 v.AddArg(y) 10322 v.AddArg(z) 10323 v.AddArg(flags) 10324 return true 10325 } 10326 // match: (SBC x (SRL y z) flags) 10327 // cond: 10328 // result: (SBCshiftRLreg x y z flags) 10329 for { 10330 x := v.Args[0] 10331 v_1 := v.Args[1] 10332 if v_1.Op != OpARMSRL { 10333 break 10334 } 10335 y := v_1.Args[0] 10336 z := v_1.Args[1] 10337 flags := v.Args[2] 10338 v.reset(OpARMSBCshiftRLreg) 10339 v.AddArg(x) 10340 v.AddArg(y) 10341 v.AddArg(z) 10342 v.AddArg(flags) 10343 return true 10344 } 10345 // match: (SBC (SRL y z) x flags) 10346 // cond: 10347 // result: (RSCshiftRLreg x y z flags) 10348 for { 10349 v_0 := v.Args[0] 10350 if v_0.Op != OpARMSRL { 10351 break 10352 } 10353 y := v_0.Args[0] 10354 z := v_0.Args[1] 10355 x := v.Args[1] 10356 flags := v.Args[2] 10357 v.reset(OpARMRSCshiftRLreg) 10358 v.AddArg(x) 10359 v.AddArg(y) 10360 v.AddArg(z) 10361 v.AddArg(flags) 10362 return true 10363 } 10364 // match: (SBC x (SRA y z) flags) 10365 // cond: 10366 // result: (SBCshiftRAreg x y z flags) 10367 for { 10368 x := v.Args[0] 10369 v_1 := v.Args[1] 10370 if v_1.Op != OpARMSRA { 10371 break 10372 } 10373 y := v_1.Args[0] 10374 z := v_1.Args[1] 10375 flags := v.Args[2] 10376 v.reset(OpARMSBCshiftRAreg) 10377 v.AddArg(x) 10378 v.AddArg(y) 10379 v.AddArg(z) 10380 v.AddArg(flags) 10381 return true 10382 } 10383 // match: (SBC (SRA y z) x flags) 10384 // cond: 10385 // result: (RSCshiftRAreg x y z flags) 10386 for { 10387 v_0 := v.Args[0] 10388 if v_0.Op != OpARMSRA { 10389 break 10390 } 10391 y := v_0.Args[0] 10392 z := v_0.Args[1] 10393 x := v.Args[1] 10394 flags := v.Args[2] 10395 v.reset(OpARMRSCshiftRAreg) 10396 v.AddArg(x) 10397 v.AddArg(y) 10398 v.AddArg(z) 10399 v.AddArg(flags) 10400 return true 10401 } 10402 return false 10403 } 10404 func rewriteValueARM_OpARMSBCconst(v *Value, config *Config) bool { 10405 b := v.Block 10406 _ = b 10407 // match: (SBCconst [c] (ADDconst [d] x) flags) 10408 // cond: 10409 // result: (SBCconst [int64(int32(c-d))] x flags) 10410 for { 10411 c := v.AuxInt 10412 v_0 := v.Args[0] 10413 if v_0.Op != OpARMADDconst { 10414 break 10415 } 10416 d := v_0.AuxInt 10417 x := v_0.Args[0] 10418 flags := v.Args[1] 10419 v.reset(OpARMSBCconst) 10420 v.AuxInt = int64(int32(c - d)) 10421 v.AddArg(x) 10422 v.AddArg(flags) 10423 return true 10424 } 10425 // match: (SBCconst [c] (SUBconst [d] x) flags) 10426 // cond: 10427 // result: (SBCconst [int64(int32(c+d))] x flags) 10428 for { 10429 c := v.AuxInt 10430 v_0 := v.Args[0] 10431 if v_0.Op != OpARMSUBconst { 10432 break 10433 } 10434 d := v_0.AuxInt 10435 x := v_0.Args[0] 10436 flags := v.Args[1] 10437 v.reset(OpARMSBCconst) 10438 v.AuxInt = int64(int32(c + d)) 10439 v.AddArg(x) 10440 v.AddArg(flags) 10441 return true 10442 } 10443 return false 10444 } 10445 func rewriteValueARM_OpARMSBCshiftLL(v *Value, config *Config) bool { 10446 b := v.Block 10447 _ = b 10448 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 10449 // cond: 10450 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 10451 for { 10452 d := v.AuxInt 10453 v_0 := v.Args[0] 10454 if v_0.Op != OpARMMOVWconst { 10455 break 10456 } 10457 c := v_0.AuxInt 10458 x := v.Args[1] 10459 flags := v.Args[2] 10460 v.reset(OpARMRSCconst) 10461 v.AuxInt = c 10462 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 10463 v0.AuxInt = d 10464 v0.AddArg(x) 10465 v.AddArg(v0) 10466 v.AddArg(flags) 10467 return true 10468 } 10469 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 10470 // cond: 10471 // result: (SBCconst x [int64(uint32(c)<<uint64(d))] flags) 10472 for { 10473 d := v.AuxInt 10474 x := v.Args[0] 10475 v_1 := v.Args[1] 10476 if v_1.Op != OpARMMOVWconst { 10477 break 10478 } 10479 c := v_1.AuxInt 10480 flags := v.Args[2] 10481 v.reset(OpARMSBCconst) 10482 v.AuxInt = int64(uint32(c) << uint64(d)) 10483 v.AddArg(x) 10484 v.AddArg(flags) 10485 return true 10486 } 10487 return false 10488 } 10489 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value, config *Config) bool { 10490 b := v.Block 10491 _ = b 10492 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 10493 // cond: 10494 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 10495 for { 10496 v_0 := v.Args[0] 10497 if v_0.Op != OpARMMOVWconst { 10498 break 10499 } 10500 c := v_0.AuxInt 10501 x := v.Args[1] 10502 y := v.Args[2] 10503 flags := v.Args[3] 10504 v.reset(OpARMRSCconst) 10505 v.AuxInt = c 10506 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 10507 v0.AddArg(x) 10508 v0.AddArg(y) 10509 v.AddArg(v0) 10510 v.AddArg(flags) 10511 return true 10512 } 10513 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 10514 // cond: 10515 // result: (SBCshiftLL x y [c] flags) 10516 for { 10517 x := v.Args[0] 10518 y := v.Args[1] 10519 v_2 := v.Args[2] 10520 if v_2.Op != OpARMMOVWconst { 10521 break 10522 } 10523 c := v_2.AuxInt 10524 flags := v.Args[3] 10525 v.reset(OpARMSBCshiftLL) 10526 v.AuxInt = c 10527 v.AddArg(x) 10528 v.AddArg(y) 10529 v.AddArg(flags) 10530 return true 10531 } 10532 return false 10533 } 10534 func rewriteValueARM_OpARMSBCshiftRA(v *Value, config *Config) bool { 10535 b := v.Block 10536 _ = b 10537 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 10538 // cond: 10539 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 10540 for { 10541 d := v.AuxInt 10542 v_0 := v.Args[0] 10543 if v_0.Op != OpARMMOVWconst { 10544 break 10545 } 10546 c := v_0.AuxInt 10547 x := v.Args[1] 10548 flags := v.Args[2] 10549 v.reset(OpARMRSCconst) 10550 v.AuxInt = c 10551 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 10552 v0.AuxInt = d 10553 v0.AddArg(x) 10554 v.AddArg(v0) 10555 v.AddArg(flags) 10556 return true 10557 } 10558 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 10559 // cond: 10560 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 10561 for { 10562 d := v.AuxInt 10563 x := v.Args[0] 10564 v_1 := v.Args[1] 10565 if v_1.Op != OpARMMOVWconst { 10566 break 10567 } 10568 c := v_1.AuxInt 10569 flags := v.Args[2] 10570 v.reset(OpARMSBCconst) 10571 v.AuxInt = int64(int32(c) >> uint64(d)) 10572 v.AddArg(x) 10573 v.AddArg(flags) 10574 return true 10575 } 10576 return false 10577 } 10578 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value, config *Config) bool { 10579 b := v.Block 10580 _ = b 10581 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 10582 // cond: 10583 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 10584 for { 10585 v_0 := v.Args[0] 10586 if v_0.Op != OpARMMOVWconst { 10587 break 10588 } 10589 c := v_0.AuxInt 10590 x := v.Args[1] 10591 y := v.Args[2] 10592 flags := v.Args[3] 10593 v.reset(OpARMRSCconst) 10594 v.AuxInt = c 10595 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 10596 v0.AddArg(x) 10597 v0.AddArg(y) 10598 v.AddArg(v0) 10599 v.AddArg(flags) 10600 return true 10601 } 10602 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 10603 // cond: 10604 // result: (SBCshiftRA x y [c] flags) 10605 for { 10606 x := v.Args[0] 10607 y := v.Args[1] 10608 v_2 := v.Args[2] 10609 if v_2.Op != OpARMMOVWconst { 10610 break 10611 } 10612 c := v_2.AuxInt 10613 flags := v.Args[3] 10614 v.reset(OpARMSBCshiftRA) 10615 v.AuxInt = c 10616 v.AddArg(x) 10617 v.AddArg(y) 10618 v.AddArg(flags) 10619 return true 10620 } 10621 return false 10622 } 10623 func rewriteValueARM_OpARMSBCshiftRL(v *Value, config *Config) bool { 10624 b := v.Block 10625 _ = b 10626 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 10627 // cond: 10628 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 10629 for { 10630 d := v.AuxInt 10631 v_0 := v.Args[0] 10632 if v_0.Op != OpARMMOVWconst { 10633 break 10634 } 10635 c := v_0.AuxInt 10636 x := v.Args[1] 10637 flags := v.Args[2] 10638 v.reset(OpARMRSCconst) 10639 v.AuxInt = c 10640 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 10641 v0.AuxInt = d 10642 v0.AddArg(x) 10643 v.AddArg(v0) 10644 v.AddArg(flags) 10645 return true 10646 } 10647 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 10648 // cond: 10649 // result: (SBCconst x [int64(uint32(c)>>uint64(d))] flags) 10650 for { 10651 d := v.AuxInt 10652 x := v.Args[0] 10653 v_1 := v.Args[1] 10654 if v_1.Op != OpARMMOVWconst { 10655 break 10656 } 10657 c := v_1.AuxInt 10658 flags := v.Args[2] 10659 v.reset(OpARMSBCconst) 10660 v.AuxInt = int64(uint32(c) >> uint64(d)) 10661 v.AddArg(x) 10662 v.AddArg(flags) 10663 return true 10664 } 10665 return false 10666 } 10667 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value, config *Config) bool { 10668 b := v.Block 10669 _ = b 10670 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 10671 // cond: 10672 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 10673 for { 10674 v_0 := v.Args[0] 10675 if v_0.Op != OpARMMOVWconst { 10676 break 10677 } 10678 c := v_0.AuxInt 10679 x := v.Args[1] 10680 y := v.Args[2] 10681 flags := v.Args[3] 10682 v.reset(OpARMRSCconst) 10683 v.AuxInt = c 10684 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 10685 v0.AddArg(x) 10686 v0.AddArg(y) 10687 v.AddArg(v0) 10688 v.AddArg(flags) 10689 return true 10690 } 10691 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 10692 // cond: 10693 // result: (SBCshiftRL x y [c] flags) 10694 for { 10695 x := v.Args[0] 10696 y := v.Args[1] 10697 v_2 := v.Args[2] 10698 if v_2.Op != OpARMMOVWconst { 10699 break 10700 } 10701 c := v_2.AuxInt 10702 flags := v.Args[3] 10703 v.reset(OpARMSBCshiftRL) 10704 v.AuxInt = c 10705 v.AddArg(x) 10706 v.AddArg(y) 10707 v.AddArg(flags) 10708 return true 10709 } 10710 return false 10711 } 10712 func rewriteValueARM_OpARMSLL(v *Value, config *Config) bool { 10713 b := v.Block 10714 _ = b 10715 // match: (SLL x (MOVWconst [c])) 10716 // cond: 10717 // result: (SLLconst x [c&31]) 10718 for { 10719 x := v.Args[0] 10720 v_1 := v.Args[1] 10721 if v_1.Op != OpARMMOVWconst { 10722 break 10723 } 10724 c := v_1.AuxInt 10725 v.reset(OpARMSLLconst) 10726 v.AuxInt = c & 31 10727 v.AddArg(x) 10728 return true 10729 } 10730 return false 10731 } 10732 func rewriteValueARM_OpARMSLLconst(v *Value, config *Config) bool { 10733 b := v.Block 10734 _ = b 10735 // match: (SLLconst [c] (MOVWconst [d])) 10736 // cond: 10737 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 10738 for { 10739 c := v.AuxInt 10740 v_0 := v.Args[0] 10741 if v_0.Op != OpARMMOVWconst { 10742 break 10743 } 10744 d := v_0.AuxInt 10745 v.reset(OpARMMOVWconst) 10746 v.AuxInt = int64(uint32(d) << uint64(c)) 10747 return true 10748 } 10749 return false 10750 } 10751 func rewriteValueARM_OpARMSRA(v *Value, config *Config) bool { 10752 b := v.Block 10753 _ = b 10754 // match: (SRA x (MOVWconst [c])) 10755 // cond: 10756 // result: (SRAconst x [c&31]) 10757 for { 10758 x := v.Args[0] 10759 v_1 := v.Args[1] 10760 if v_1.Op != OpARMMOVWconst { 10761 break 10762 } 10763 c := v_1.AuxInt 10764 v.reset(OpARMSRAconst) 10765 v.AuxInt = c & 31 10766 v.AddArg(x) 10767 return true 10768 } 10769 return false 10770 } 10771 func rewriteValueARM_OpARMSRAcond(v *Value, config *Config) bool { 10772 b := v.Block 10773 _ = b 10774 // match: (SRAcond x _ (FlagEQ)) 10775 // cond: 10776 // result: (SRAconst x [31]) 10777 for { 10778 x := v.Args[0] 10779 v_2 := v.Args[2] 10780 if v_2.Op != OpARMFlagEQ { 10781 break 10782 } 10783 v.reset(OpARMSRAconst) 10784 v.AuxInt = 31 10785 v.AddArg(x) 10786 return true 10787 } 10788 // match: (SRAcond x y (FlagLT_ULT)) 10789 // cond: 10790 // result: (SRA x y) 10791 for { 10792 x := v.Args[0] 10793 y := v.Args[1] 10794 v_2 := v.Args[2] 10795 if v_2.Op != OpARMFlagLT_ULT { 10796 break 10797 } 10798 v.reset(OpARMSRA) 10799 v.AddArg(x) 10800 v.AddArg(y) 10801 return true 10802 } 10803 // match: (SRAcond x _ (FlagLT_UGT)) 10804 // cond: 10805 // result: (SRAconst x [31]) 10806 for { 10807 x := v.Args[0] 10808 v_2 := v.Args[2] 10809 if v_2.Op != OpARMFlagLT_UGT { 10810 break 10811 } 10812 v.reset(OpARMSRAconst) 10813 v.AuxInt = 31 10814 v.AddArg(x) 10815 return true 10816 } 10817 // match: (SRAcond x y (FlagGT_ULT)) 10818 // cond: 10819 // result: (SRA x y) 10820 for { 10821 x := v.Args[0] 10822 y := v.Args[1] 10823 v_2 := v.Args[2] 10824 if v_2.Op != OpARMFlagGT_ULT { 10825 break 10826 } 10827 v.reset(OpARMSRA) 10828 v.AddArg(x) 10829 v.AddArg(y) 10830 return true 10831 } 10832 // match: (SRAcond x _ (FlagGT_UGT)) 10833 // cond: 10834 // result: (SRAconst x [31]) 10835 for { 10836 x := v.Args[0] 10837 v_2 := v.Args[2] 10838 if v_2.Op != OpARMFlagGT_UGT { 10839 break 10840 } 10841 v.reset(OpARMSRAconst) 10842 v.AuxInt = 31 10843 v.AddArg(x) 10844 return true 10845 } 10846 return false 10847 } 10848 func rewriteValueARM_OpARMSRAconst(v *Value, config *Config) bool { 10849 b := v.Block 10850 _ = b 10851 // match: (SRAconst [c] (MOVWconst [d])) 10852 // cond: 10853 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 10854 for { 10855 c := v.AuxInt 10856 v_0 := v.Args[0] 10857 if v_0.Op != OpARMMOVWconst { 10858 break 10859 } 10860 d := v_0.AuxInt 10861 v.reset(OpARMMOVWconst) 10862 v.AuxInt = int64(int32(d) >> uint64(c)) 10863 return true 10864 } 10865 return false 10866 } 10867 func rewriteValueARM_OpARMSRL(v *Value, config *Config) bool { 10868 b := v.Block 10869 _ = b 10870 // match: (SRL x (MOVWconst [c])) 10871 // cond: 10872 // result: (SRLconst x [c&31]) 10873 for { 10874 x := v.Args[0] 10875 v_1 := v.Args[1] 10876 if v_1.Op != OpARMMOVWconst { 10877 break 10878 } 10879 c := v_1.AuxInt 10880 v.reset(OpARMSRLconst) 10881 v.AuxInt = c & 31 10882 v.AddArg(x) 10883 return true 10884 } 10885 return false 10886 } 10887 func rewriteValueARM_OpARMSRLconst(v *Value, config *Config) bool { 10888 b := v.Block 10889 _ = b 10890 // match: (SRLconst [c] (MOVWconst [d])) 10891 // cond: 10892 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 10893 for { 10894 c := v.AuxInt 10895 v_0 := v.Args[0] 10896 if v_0.Op != OpARMMOVWconst { 10897 break 10898 } 10899 d := v_0.AuxInt 10900 v.reset(OpARMMOVWconst) 10901 v.AuxInt = int64(uint32(d) >> uint64(c)) 10902 return true 10903 } 10904 return false 10905 } 10906 func rewriteValueARM_OpARMSUB(v *Value, config *Config) bool { 10907 b := v.Block 10908 _ = b 10909 // match: (SUB (MOVWconst [c]) x) 10910 // cond: 10911 // result: (RSBconst [c] x) 10912 for { 10913 v_0 := v.Args[0] 10914 if v_0.Op != OpARMMOVWconst { 10915 break 10916 } 10917 c := v_0.AuxInt 10918 x := v.Args[1] 10919 v.reset(OpARMRSBconst) 10920 v.AuxInt = c 10921 v.AddArg(x) 10922 return true 10923 } 10924 // match: (SUB x (MOVWconst [c])) 10925 // cond: 10926 // result: (SUBconst [c] x) 10927 for { 10928 x := v.Args[0] 10929 v_1 := v.Args[1] 10930 if v_1.Op != OpARMMOVWconst { 10931 break 10932 } 10933 c := v_1.AuxInt 10934 v.reset(OpARMSUBconst) 10935 v.AuxInt = c 10936 v.AddArg(x) 10937 return true 10938 } 10939 // match: (SUB x (SLLconst [c] y)) 10940 // cond: 10941 // result: (SUBshiftLL x y [c]) 10942 for { 10943 x := v.Args[0] 10944 v_1 := v.Args[1] 10945 if v_1.Op != OpARMSLLconst { 10946 break 10947 } 10948 c := v_1.AuxInt 10949 y := v_1.Args[0] 10950 v.reset(OpARMSUBshiftLL) 10951 v.AuxInt = c 10952 v.AddArg(x) 10953 v.AddArg(y) 10954 return true 10955 } 10956 // match: (SUB (SLLconst [c] y) x) 10957 // cond: 10958 // result: (RSBshiftLL x y [c]) 10959 for { 10960 v_0 := v.Args[0] 10961 if v_0.Op != OpARMSLLconst { 10962 break 10963 } 10964 c := v_0.AuxInt 10965 y := v_0.Args[0] 10966 x := v.Args[1] 10967 v.reset(OpARMRSBshiftLL) 10968 v.AuxInt = c 10969 v.AddArg(x) 10970 v.AddArg(y) 10971 return true 10972 } 10973 // match: (SUB x (SRLconst [c] y)) 10974 // cond: 10975 // result: (SUBshiftRL x y [c]) 10976 for { 10977 x := v.Args[0] 10978 v_1 := v.Args[1] 10979 if v_1.Op != OpARMSRLconst { 10980 break 10981 } 10982 c := v_1.AuxInt 10983 y := v_1.Args[0] 10984 v.reset(OpARMSUBshiftRL) 10985 v.AuxInt = c 10986 v.AddArg(x) 10987 v.AddArg(y) 10988 return true 10989 } 10990 // match: (SUB (SRLconst [c] y) x) 10991 // cond: 10992 // result: (RSBshiftRL x y [c]) 10993 for { 10994 v_0 := v.Args[0] 10995 if v_0.Op != OpARMSRLconst { 10996 break 10997 } 10998 c := v_0.AuxInt 10999 y := v_0.Args[0] 11000 x := v.Args[1] 11001 v.reset(OpARMRSBshiftRL) 11002 v.AuxInt = c 11003 v.AddArg(x) 11004 v.AddArg(y) 11005 return true 11006 } 11007 // match: (SUB x (SRAconst [c] y)) 11008 // cond: 11009 // result: (SUBshiftRA x y [c]) 11010 for { 11011 x := v.Args[0] 11012 v_1 := v.Args[1] 11013 if v_1.Op != OpARMSRAconst { 11014 break 11015 } 11016 c := v_1.AuxInt 11017 y := v_1.Args[0] 11018 v.reset(OpARMSUBshiftRA) 11019 v.AuxInt = c 11020 v.AddArg(x) 11021 v.AddArg(y) 11022 return true 11023 } 11024 // match: (SUB (SRAconst [c] y) x) 11025 // cond: 11026 // result: (RSBshiftRA x y [c]) 11027 for { 11028 v_0 := v.Args[0] 11029 if v_0.Op != OpARMSRAconst { 11030 break 11031 } 11032 c := v_0.AuxInt 11033 y := v_0.Args[0] 11034 x := v.Args[1] 11035 v.reset(OpARMRSBshiftRA) 11036 v.AuxInt = c 11037 v.AddArg(x) 11038 v.AddArg(y) 11039 return true 11040 } 11041 // match: (SUB x (SLL y z)) 11042 // cond: 11043 // result: (SUBshiftLLreg x y z) 11044 for { 11045 x := v.Args[0] 11046 v_1 := v.Args[1] 11047 if v_1.Op != OpARMSLL { 11048 break 11049 } 11050 y := v_1.Args[0] 11051 z := v_1.Args[1] 11052 v.reset(OpARMSUBshiftLLreg) 11053 v.AddArg(x) 11054 v.AddArg(y) 11055 v.AddArg(z) 11056 return true 11057 } 11058 // match: (SUB (SLL y z) x) 11059 // cond: 11060 // result: (RSBshiftLLreg x y z) 11061 for { 11062 v_0 := v.Args[0] 11063 if v_0.Op != OpARMSLL { 11064 break 11065 } 11066 y := v_0.Args[0] 11067 z := v_0.Args[1] 11068 x := v.Args[1] 11069 v.reset(OpARMRSBshiftLLreg) 11070 v.AddArg(x) 11071 v.AddArg(y) 11072 v.AddArg(z) 11073 return true 11074 } 11075 // match: (SUB x (SRL y z)) 11076 // cond: 11077 // result: (SUBshiftRLreg x y z) 11078 for { 11079 x := v.Args[0] 11080 v_1 := v.Args[1] 11081 if v_1.Op != OpARMSRL { 11082 break 11083 } 11084 y := v_1.Args[0] 11085 z := v_1.Args[1] 11086 v.reset(OpARMSUBshiftRLreg) 11087 v.AddArg(x) 11088 v.AddArg(y) 11089 v.AddArg(z) 11090 return true 11091 } 11092 // match: (SUB (SRL y z) x) 11093 // cond: 11094 // result: (RSBshiftRLreg x y z) 11095 for { 11096 v_0 := v.Args[0] 11097 if v_0.Op != OpARMSRL { 11098 break 11099 } 11100 y := v_0.Args[0] 11101 z := v_0.Args[1] 11102 x := v.Args[1] 11103 v.reset(OpARMRSBshiftRLreg) 11104 v.AddArg(x) 11105 v.AddArg(y) 11106 v.AddArg(z) 11107 return true 11108 } 11109 // match: (SUB x (SRA y z)) 11110 // cond: 11111 // result: (SUBshiftRAreg x y z) 11112 for { 11113 x := v.Args[0] 11114 v_1 := v.Args[1] 11115 if v_1.Op != OpARMSRA { 11116 break 11117 } 11118 y := v_1.Args[0] 11119 z := v_1.Args[1] 11120 v.reset(OpARMSUBshiftRAreg) 11121 v.AddArg(x) 11122 v.AddArg(y) 11123 v.AddArg(z) 11124 return true 11125 } 11126 // match: (SUB (SRA y z) x) 11127 // cond: 11128 // result: (RSBshiftRAreg x y z) 11129 for { 11130 v_0 := v.Args[0] 11131 if v_0.Op != OpARMSRA { 11132 break 11133 } 11134 y := v_0.Args[0] 11135 z := v_0.Args[1] 11136 x := v.Args[1] 11137 v.reset(OpARMRSBshiftRAreg) 11138 v.AddArg(x) 11139 v.AddArg(y) 11140 v.AddArg(z) 11141 return true 11142 } 11143 // match: (SUB x x) 11144 // cond: 11145 // result: (MOVWconst [0]) 11146 for { 11147 x := v.Args[0] 11148 if x != v.Args[1] { 11149 break 11150 } 11151 v.reset(OpARMMOVWconst) 11152 v.AuxInt = 0 11153 return true 11154 } 11155 return false 11156 } 11157 func rewriteValueARM_OpARMSUBS(v *Value, config *Config) bool { 11158 b := v.Block 11159 _ = b 11160 // match: (SUBS (MOVWconst [c]) x) 11161 // cond: 11162 // result: (RSBSconst [c] x) 11163 for { 11164 v_0 := v.Args[0] 11165 if v_0.Op != OpARMMOVWconst { 11166 break 11167 } 11168 c := v_0.AuxInt 11169 x := v.Args[1] 11170 v.reset(OpARMRSBSconst) 11171 v.AuxInt = c 11172 v.AddArg(x) 11173 return true 11174 } 11175 // match: (SUBS x (MOVWconst [c])) 11176 // cond: 11177 // result: (SUBSconst [c] x) 11178 for { 11179 x := v.Args[0] 11180 v_1 := v.Args[1] 11181 if v_1.Op != OpARMMOVWconst { 11182 break 11183 } 11184 c := v_1.AuxInt 11185 v.reset(OpARMSUBSconst) 11186 v.AuxInt = c 11187 v.AddArg(x) 11188 return true 11189 } 11190 // match: (SUBS x (SLLconst [c] y)) 11191 // cond: 11192 // result: (SUBSshiftLL x y [c]) 11193 for { 11194 x := v.Args[0] 11195 v_1 := v.Args[1] 11196 if v_1.Op != OpARMSLLconst { 11197 break 11198 } 11199 c := v_1.AuxInt 11200 y := v_1.Args[0] 11201 v.reset(OpARMSUBSshiftLL) 11202 v.AuxInt = c 11203 v.AddArg(x) 11204 v.AddArg(y) 11205 return true 11206 } 11207 // match: (SUBS (SLLconst [c] y) x) 11208 // cond: 11209 // result: (RSBSshiftLL x y [c]) 11210 for { 11211 v_0 := v.Args[0] 11212 if v_0.Op != OpARMSLLconst { 11213 break 11214 } 11215 c := v_0.AuxInt 11216 y := v_0.Args[0] 11217 x := v.Args[1] 11218 v.reset(OpARMRSBSshiftLL) 11219 v.AuxInt = c 11220 v.AddArg(x) 11221 v.AddArg(y) 11222 return true 11223 } 11224 // match: (SUBS x (SRLconst [c] y)) 11225 // cond: 11226 // result: (SUBSshiftRL x y [c]) 11227 for { 11228 x := v.Args[0] 11229 v_1 := v.Args[1] 11230 if v_1.Op != OpARMSRLconst { 11231 break 11232 } 11233 c := v_1.AuxInt 11234 y := v_1.Args[0] 11235 v.reset(OpARMSUBSshiftRL) 11236 v.AuxInt = c 11237 v.AddArg(x) 11238 v.AddArg(y) 11239 return true 11240 } 11241 // match: (SUBS (SRLconst [c] y) x) 11242 // cond: 11243 // result: (RSBSshiftRL x y [c]) 11244 for { 11245 v_0 := v.Args[0] 11246 if v_0.Op != OpARMSRLconst { 11247 break 11248 } 11249 c := v_0.AuxInt 11250 y := v_0.Args[0] 11251 x := v.Args[1] 11252 v.reset(OpARMRSBSshiftRL) 11253 v.AuxInt = c 11254 v.AddArg(x) 11255 v.AddArg(y) 11256 return true 11257 } 11258 // match: (SUBS x (SRAconst [c] y)) 11259 // cond: 11260 // result: (SUBSshiftRA x y [c]) 11261 for { 11262 x := v.Args[0] 11263 v_1 := v.Args[1] 11264 if v_1.Op != OpARMSRAconst { 11265 break 11266 } 11267 c := v_1.AuxInt 11268 y := v_1.Args[0] 11269 v.reset(OpARMSUBSshiftRA) 11270 v.AuxInt = c 11271 v.AddArg(x) 11272 v.AddArg(y) 11273 return true 11274 } 11275 // match: (SUBS (SRAconst [c] y) x) 11276 // cond: 11277 // result: (RSBSshiftRA x y [c]) 11278 for { 11279 v_0 := v.Args[0] 11280 if v_0.Op != OpARMSRAconst { 11281 break 11282 } 11283 c := v_0.AuxInt 11284 y := v_0.Args[0] 11285 x := v.Args[1] 11286 v.reset(OpARMRSBSshiftRA) 11287 v.AuxInt = c 11288 v.AddArg(x) 11289 v.AddArg(y) 11290 return true 11291 } 11292 // match: (SUBS x (SLL y z)) 11293 // cond: 11294 // result: (SUBSshiftLLreg x y z) 11295 for { 11296 x := v.Args[0] 11297 v_1 := v.Args[1] 11298 if v_1.Op != OpARMSLL { 11299 break 11300 } 11301 y := v_1.Args[0] 11302 z := v_1.Args[1] 11303 v.reset(OpARMSUBSshiftLLreg) 11304 v.AddArg(x) 11305 v.AddArg(y) 11306 v.AddArg(z) 11307 return true 11308 } 11309 // match: (SUBS (SLL y z) x) 11310 // cond: 11311 // result: (RSBSshiftLLreg x y z) 11312 for { 11313 v_0 := v.Args[0] 11314 if v_0.Op != OpARMSLL { 11315 break 11316 } 11317 y := v_0.Args[0] 11318 z := v_0.Args[1] 11319 x := v.Args[1] 11320 v.reset(OpARMRSBSshiftLLreg) 11321 v.AddArg(x) 11322 v.AddArg(y) 11323 v.AddArg(z) 11324 return true 11325 } 11326 // match: (SUBS x (SRL y z)) 11327 // cond: 11328 // result: (SUBSshiftRLreg x y z) 11329 for { 11330 x := v.Args[0] 11331 v_1 := v.Args[1] 11332 if v_1.Op != OpARMSRL { 11333 break 11334 } 11335 y := v_1.Args[0] 11336 z := v_1.Args[1] 11337 v.reset(OpARMSUBSshiftRLreg) 11338 v.AddArg(x) 11339 v.AddArg(y) 11340 v.AddArg(z) 11341 return true 11342 } 11343 // match: (SUBS (SRL y z) x) 11344 // cond: 11345 // result: (RSBSshiftRLreg x y z) 11346 for { 11347 v_0 := v.Args[0] 11348 if v_0.Op != OpARMSRL { 11349 break 11350 } 11351 y := v_0.Args[0] 11352 z := v_0.Args[1] 11353 x := v.Args[1] 11354 v.reset(OpARMRSBSshiftRLreg) 11355 v.AddArg(x) 11356 v.AddArg(y) 11357 v.AddArg(z) 11358 return true 11359 } 11360 // match: (SUBS x (SRA y z)) 11361 // cond: 11362 // result: (SUBSshiftRAreg x y z) 11363 for { 11364 x := v.Args[0] 11365 v_1 := v.Args[1] 11366 if v_1.Op != OpARMSRA { 11367 break 11368 } 11369 y := v_1.Args[0] 11370 z := v_1.Args[1] 11371 v.reset(OpARMSUBSshiftRAreg) 11372 v.AddArg(x) 11373 v.AddArg(y) 11374 v.AddArg(z) 11375 return true 11376 } 11377 // match: (SUBS (SRA y z) x) 11378 // cond: 11379 // result: (RSBSshiftRAreg x y z) 11380 for { 11381 v_0 := v.Args[0] 11382 if v_0.Op != OpARMSRA { 11383 break 11384 } 11385 y := v_0.Args[0] 11386 z := v_0.Args[1] 11387 x := v.Args[1] 11388 v.reset(OpARMRSBSshiftRAreg) 11389 v.AddArg(x) 11390 v.AddArg(y) 11391 v.AddArg(z) 11392 return true 11393 } 11394 return false 11395 } 11396 func rewriteValueARM_OpARMSUBSshiftLL(v *Value, config *Config) bool { 11397 b := v.Block 11398 _ = b 11399 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 11400 // cond: 11401 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 11402 for { 11403 d := v.AuxInt 11404 v_0 := v.Args[0] 11405 if v_0.Op != OpARMMOVWconst { 11406 break 11407 } 11408 c := v_0.AuxInt 11409 x := v.Args[1] 11410 v.reset(OpARMRSBSconst) 11411 v.AuxInt = c 11412 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 11413 v0.AuxInt = d 11414 v0.AddArg(x) 11415 v.AddArg(v0) 11416 return true 11417 } 11418 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 11419 // cond: 11420 // result: (SUBSconst x [int64(uint32(c)<<uint64(d))]) 11421 for { 11422 d := v.AuxInt 11423 x := v.Args[0] 11424 v_1 := v.Args[1] 11425 if v_1.Op != OpARMMOVWconst { 11426 break 11427 } 11428 c := v_1.AuxInt 11429 v.reset(OpARMSUBSconst) 11430 v.AuxInt = int64(uint32(c) << uint64(d)) 11431 v.AddArg(x) 11432 return true 11433 } 11434 return false 11435 } 11436 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value, config *Config) bool { 11437 b := v.Block 11438 _ = b 11439 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 11440 // cond: 11441 // result: (RSBSconst [c] (SLL <x.Type> x y)) 11442 for { 11443 v_0 := v.Args[0] 11444 if v_0.Op != OpARMMOVWconst { 11445 break 11446 } 11447 c := v_0.AuxInt 11448 x := v.Args[1] 11449 y := v.Args[2] 11450 v.reset(OpARMRSBSconst) 11451 v.AuxInt = c 11452 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 11453 v0.AddArg(x) 11454 v0.AddArg(y) 11455 v.AddArg(v0) 11456 return true 11457 } 11458 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 11459 // cond: 11460 // result: (SUBSshiftLL x y [c]) 11461 for { 11462 x := v.Args[0] 11463 y := v.Args[1] 11464 v_2 := v.Args[2] 11465 if v_2.Op != OpARMMOVWconst { 11466 break 11467 } 11468 c := v_2.AuxInt 11469 v.reset(OpARMSUBSshiftLL) 11470 v.AuxInt = c 11471 v.AddArg(x) 11472 v.AddArg(y) 11473 return true 11474 } 11475 return false 11476 } 11477 func rewriteValueARM_OpARMSUBSshiftRA(v *Value, config *Config) bool { 11478 b := v.Block 11479 _ = b 11480 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 11481 // cond: 11482 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 11483 for { 11484 d := v.AuxInt 11485 v_0 := v.Args[0] 11486 if v_0.Op != OpARMMOVWconst { 11487 break 11488 } 11489 c := v_0.AuxInt 11490 x := v.Args[1] 11491 v.reset(OpARMRSBSconst) 11492 v.AuxInt = c 11493 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 11494 v0.AuxInt = d 11495 v0.AddArg(x) 11496 v.AddArg(v0) 11497 return true 11498 } 11499 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 11500 // cond: 11501 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 11502 for { 11503 d := v.AuxInt 11504 x := v.Args[0] 11505 v_1 := v.Args[1] 11506 if v_1.Op != OpARMMOVWconst { 11507 break 11508 } 11509 c := v_1.AuxInt 11510 v.reset(OpARMSUBSconst) 11511 v.AuxInt = int64(int32(c) >> uint64(d)) 11512 v.AddArg(x) 11513 return true 11514 } 11515 return false 11516 } 11517 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value, config *Config) bool { 11518 b := v.Block 11519 _ = b 11520 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 11521 // cond: 11522 // result: (RSBSconst [c] (SRA <x.Type> x y)) 11523 for { 11524 v_0 := v.Args[0] 11525 if v_0.Op != OpARMMOVWconst { 11526 break 11527 } 11528 c := v_0.AuxInt 11529 x := v.Args[1] 11530 y := v.Args[2] 11531 v.reset(OpARMRSBSconst) 11532 v.AuxInt = c 11533 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 11534 v0.AddArg(x) 11535 v0.AddArg(y) 11536 v.AddArg(v0) 11537 return true 11538 } 11539 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 11540 // cond: 11541 // result: (SUBSshiftRA x y [c]) 11542 for { 11543 x := v.Args[0] 11544 y := v.Args[1] 11545 v_2 := v.Args[2] 11546 if v_2.Op != OpARMMOVWconst { 11547 break 11548 } 11549 c := v_2.AuxInt 11550 v.reset(OpARMSUBSshiftRA) 11551 v.AuxInt = c 11552 v.AddArg(x) 11553 v.AddArg(y) 11554 return true 11555 } 11556 return false 11557 } 11558 func rewriteValueARM_OpARMSUBSshiftRL(v *Value, config *Config) bool { 11559 b := v.Block 11560 _ = b 11561 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 11562 // cond: 11563 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 11564 for { 11565 d := v.AuxInt 11566 v_0 := v.Args[0] 11567 if v_0.Op != OpARMMOVWconst { 11568 break 11569 } 11570 c := v_0.AuxInt 11571 x := v.Args[1] 11572 v.reset(OpARMRSBSconst) 11573 v.AuxInt = c 11574 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 11575 v0.AuxInt = d 11576 v0.AddArg(x) 11577 v.AddArg(v0) 11578 return true 11579 } 11580 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 11581 // cond: 11582 // result: (SUBSconst x [int64(uint32(c)>>uint64(d))]) 11583 for { 11584 d := v.AuxInt 11585 x := v.Args[0] 11586 v_1 := v.Args[1] 11587 if v_1.Op != OpARMMOVWconst { 11588 break 11589 } 11590 c := v_1.AuxInt 11591 v.reset(OpARMSUBSconst) 11592 v.AuxInt = int64(uint32(c) >> uint64(d)) 11593 v.AddArg(x) 11594 return true 11595 } 11596 return false 11597 } 11598 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value, config *Config) bool { 11599 b := v.Block 11600 _ = b 11601 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 11602 // cond: 11603 // result: (RSBSconst [c] (SRL <x.Type> x y)) 11604 for { 11605 v_0 := v.Args[0] 11606 if v_0.Op != OpARMMOVWconst { 11607 break 11608 } 11609 c := v_0.AuxInt 11610 x := v.Args[1] 11611 y := v.Args[2] 11612 v.reset(OpARMRSBSconst) 11613 v.AuxInt = c 11614 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 11615 v0.AddArg(x) 11616 v0.AddArg(y) 11617 v.AddArg(v0) 11618 return true 11619 } 11620 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 11621 // cond: 11622 // result: (SUBSshiftRL x y [c]) 11623 for { 11624 x := v.Args[0] 11625 y := v.Args[1] 11626 v_2 := v.Args[2] 11627 if v_2.Op != OpARMMOVWconst { 11628 break 11629 } 11630 c := v_2.AuxInt 11631 v.reset(OpARMSUBSshiftRL) 11632 v.AuxInt = c 11633 v.AddArg(x) 11634 v.AddArg(y) 11635 return true 11636 } 11637 return false 11638 } 11639 func rewriteValueARM_OpARMSUBconst(v *Value, config *Config) bool { 11640 b := v.Block 11641 _ = b 11642 // match: (SUBconst [0] x) 11643 // cond: 11644 // result: x 11645 for { 11646 if v.AuxInt != 0 { 11647 break 11648 } 11649 x := v.Args[0] 11650 v.reset(OpCopy) 11651 v.Type = x.Type 11652 v.AddArg(x) 11653 return true 11654 } 11655 // match: (SUBconst [c] (MOVWconst [d])) 11656 // cond: 11657 // result: (MOVWconst [int64(int32(d-c))]) 11658 for { 11659 c := v.AuxInt 11660 v_0 := v.Args[0] 11661 if v_0.Op != OpARMMOVWconst { 11662 break 11663 } 11664 d := v_0.AuxInt 11665 v.reset(OpARMMOVWconst) 11666 v.AuxInt = int64(int32(d - c)) 11667 return true 11668 } 11669 // match: (SUBconst [c] (SUBconst [d] x)) 11670 // cond: 11671 // result: (ADDconst [int64(int32(-c-d))] x) 11672 for { 11673 c := v.AuxInt 11674 v_0 := v.Args[0] 11675 if v_0.Op != OpARMSUBconst { 11676 break 11677 } 11678 d := v_0.AuxInt 11679 x := v_0.Args[0] 11680 v.reset(OpARMADDconst) 11681 v.AuxInt = int64(int32(-c - d)) 11682 v.AddArg(x) 11683 return true 11684 } 11685 // match: (SUBconst [c] (ADDconst [d] x)) 11686 // cond: 11687 // result: (ADDconst [int64(int32(-c+d))] x) 11688 for { 11689 c := v.AuxInt 11690 v_0 := v.Args[0] 11691 if v_0.Op != OpARMADDconst { 11692 break 11693 } 11694 d := v_0.AuxInt 11695 x := v_0.Args[0] 11696 v.reset(OpARMADDconst) 11697 v.AuxInt = int64(int32(-c + d)) 11698 v.AddArg(x) 11699 return true 11700 } 11701 // match: (SUBconst [c] (RSBconst [d] x)) 11702 // cond: 11703 // result: (RSBconst [int64(int32(-c+d))] x) 11704 for { 11705 c := v.AuxInt 11706 v_0 := v.Args[0] 11707 if v_0.Op != OpARMRSBconst { 11708 break 11709 } 11710 d := v_0.AuxInt 11711 x := v_0.Args[0] 11712 v.reset(OpARMRSBconst) 11713 v.AuxInt = int64(int32(-c + d)) 11714 v.AddArg(x) 11715 return true 11716 } 11717 return false 11718 } 11719 func rewriteValueARM_OpARMSUBshiftLL(v *Value, config *Config) bool { 11720 b := v.Block 11721 _ = b 11722 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 11723 // cond: 11724 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 11725 for { 11726 d := v.AuxInt 11727 v_0 := v.Args[0] 11728 if v_0.Op != OpARMMOVWconst { 11729 break 11730 } 11731 c := v_0.AuxInt 11732 x := v.Args[1] 11733 v.reset(OpARMRSBconst) 11734 v.AuxInt = c 11735 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 11736 v0.AuxInt = d 11737 v0.AddArg(x) 11738 v.AddArg(v0) 11739 return true 11740 } 11741 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 11742 // cond: 11743 // result: (SUBconst x [int64(uint32(c)<<uint64(d))]) 11744 for { 11745 d := v.AuxInt 11746 x := v.Args[0] 11747 v_1 := v.Args[1] 11748 if v_1.Op != OpARMMOVWconst { 11749 break 11750 } 11751 c := v_1.AuxInt 11752 v.reset(OpARMSUBconst) 11753 v.AuxInt = int64(uint32(c) << uint64(d)) 11754 v.AddArg(x) 11755 return true 11756 } 11757 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 11758 // cond: c==d 11759 // result: (MOVWconst [0]) 11760 for { 11761 d := v.AuxInt 11762 x := v.Args[0] 11763 v_1 := v.Args[1] 11764 if v_1.Op != OpARMSLLconst { 11765 break 11766 } 11767 c := v_1.AuxInt 11768 if x != v_1.Args[0] { 11769 break 11770 } 11771 if !(c == d) { 11772 break 11773 } 11774 v.reset(OpARMMOVWconst) 11775 v.AuxInt = 0 11776 return true 11777 } 11778 return false 11779 } 11780 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value, config *Config) bool { 11781 b := v.Block 11782 _ = b 11783 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 11784 // cond: 11785 // result: (RSBconst [c] (SLL <x.Type> x y)) 11786 for { 11787 v_0 := v.Args[0] 11788 if v_0.Op != OpARMMOVWconst { 11789 break 11790 } 11791 c := v_0.AuxInt 11792 x := v.Args[1] 11793 y := v.Args[2] 11794 v.reset(OpARMRSBconst) 11795 v.AuxInt = c 11796 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 11797 v0.AddArg(x) 11798 v0.AddArg(y) 11799 v.AddArg(v0) 11800 return true 11801 } 11802 // match: (SUBshiftLLreg x y (MOVWconst [c])) 11803 // cond: 11804 // result: (SUBshiftLL x y [c]) 11805 for { 11806 x := v.Args[0] 11807 y := v.Args[1] 11808 v_2 := v.Args[2] 11809 if v_2.Op != OpARMMOVWconst { 11810 break 11811 } 11812 c := v_2.AuxInt 11813 v.reset(OpARMSUBshiftLL) 11814 v.AuxInt = c 11815 v.AddArg(x) 11816 v.AddArg(y) 11817 return true 11818 } 11819 return false 11820 } 11821 func rewriteValueARM_OpARMSUBshiftRA(v *Value, config *Config) bool { 11822 b := v.Block 11823 _ = b 11824 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 11825 // cond: 11826 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 11827 for { 11828 d := v.AuxInt 11829 v_0 := v.Args[0] 11830 if v_0.Op != OpARMMOVWconst { 11831 break 11832 } 11833 c := v_0.AuxInt 11834 x := v.Args[1] 11835 v.reset(OpARMRSBconst) 11836 v.AuxInt = c 11837 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 11838 v0.AuxInt = d 11839 v0.AddArg(x) 11840 v.AddArg(v0) 11841 return true 11842 } 11843 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 11844 // cond: 11845 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 11846 for { 11847 d := v.AuxInt 11848 x := v.Args[0] 11849 v_1 := v.Args[1] 11850 if v_1.Op != OpARMMOVWconst { 11851 break 11852 } 11853 c := v_1.AuxInt 11854 v.reset(OpARMSUBconst) 11855 v.AuxInt = int64(int32(c) >> uint64(d)) 11856 v.AddArg(x) 11857 return true 11858 } 11859 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 11860 // cond: c==d 11861 // result: (MOVWconst [0]) 11862 for { 11863 d := v.AuxInt 11864 x := v.Args[0] 11865 v_1 := v.Args[1] 11866 if v_1.Op != OpARMSRAconst { 11867 break 11868 } 11869 c := v_1.AuxInt 11870 if x != v_1.Args[0] { 11871 break 11872 } 11873 if !(c == d) { 11874 break 11875 } 11876 v.reset(OpARMMOVWconst) 11877 v.AuxInt = 0 11878 return true 11879 } 11880 return false 11881 } 11882 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value, config *Config) bool { 11883 b := v.Block 11884 _ = b 11885 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 11886 // cond: 11887 // result: (RSBconst [c] (SRA <x.Type> x y)) 11888 for { 11889 v_0 := v.Args[0] 11890 if v_0.Op != OpARMMOVWconst { 11891 break 11892 } 11893 c := v_0.AuxInt 11894 x := v.Args[1] 11895 y := v.Args[2] 11896 v.reset(OpARMRSBconst) 11897 v.AuxInt = c 11898 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 11899 v0.AddArg(x) 11900 v0.AddArg(y) 11901 v.AddArg(v0) 11902 return true 11903 } 11904 // match: (SUBshiftRAreg x y (MOVWconst [c])) 11905 // cond: 11906 // result: (SUBshiftRA x y [c]) 11907 for { 11908 x := v.Args[0] 11909 y := v.Args[1] 11910 v_2 := v.Args[2] 11911 if v_2.Op != OpARMMOVWconst { 11912 break 11913 } 11914 c := v_2.AuxInt 11915 v.reset(OpARMSUBshiftRA) 11916 v.AuxInt = c 11917 v.AddArg(x) 11918 v.AddArg(y) 11919 return true 11920 } 11921 return false 11922 } 11923 func rewriteValueARM_OpARMSUBshiftRL(v *Value, config *Config) bool { 11924 b := v.Block 11925 _ = b 11926 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 11927 // cond: 11928 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 11929 for { 11930 d := v.AuxInt 11931 v_0 := v.Args[0] 11932 if v_0.Op != OpARMMOVWconst { 11933 break 11934 } 11935 c := v_0.AuxInt 11936 x := v.Args[1] 11937 v.reset(OpARMRSBconst) 11938 v.AuxInt = c 11939 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 11940 v0.AuxInt = d 11941 v0.AddArg(x) 11942 v.AddArg(v0) 11943 return true 11944 } 11945 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 11946 // cond: 11947 // result: (SUBconst x [int64(uint32(c)>>uint64(d))]) 11948 for { 11949 d := v.AuxInt 11950 x := v.Args[0] 11951 v_1 := v.Args[1] 11952 if v_1.Op != OpARMMOVWconst { 11953 break 11954 } 11955 c := v_1.AuxInt 11956 v.reset(OpARMSUBconst) 11957 v.AuxInt = int64(uint32(c) >> uint64(d)) 11958 v.AddArg(x) 11959 return true 11960 } 11961 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 11962 // cond: c==d 11963 // result: (MOVWconst [0]) 11964 for { 11965 d := v.AuxInt 11966 x := v.Args[0] 11967 v_1 := v.Args[1] 11968 if v_1.Op != OpARMSRLconst { 11969 break 11970 } 11971 c := v_1.AuxInt 11972 if x != v_1.Args[0] { 11973 break 11974 } 11975 if !(c == d) { 11976 break 11977 } 11978 v.reset(OpARMMOVWconst) 11979 v.AuxInt = 0 11980 return true 11981 } 11982 return false 11983 } 11984 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value, config *Config) bool { 11985 b := v.Block 11986 _ = b 11987 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 11988 // cond: 11989 // result: (RSBconst [c] (SRL <x.Type> x y)) 11990 for { 11991 v_0 := v.Args[0] 11992 if v_0.Op != OpARMMOVWconst { 11993 break 11994 } 11995 c := v_0.AuxInt 11996 x := v.Args[1] 11997 y := v.Args[2] 11998 v.reset(OpARMRSBconst) 11999 v.AuxInt = c 12000 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 12001 v0.AddArg(x) 12002 v0.AddArg(y) 12003 v.AddArg(v0) 12004 return true 12005 } 12006 // match: (SUBshiftRLreg x y (MOVWconst [c])) 12007 // cond: 12008 // result: (SUBshiftRL x y [c]) 12009 for { 12010 x := v.Args[0] 12011 y := v.Args[1] 12012 v_2 := v.Args[2] 12013 if v_2.Op != OpARMMOVWconst { 12014 break 12015 } 12016 c := v_2.AuxInt 12017 v.reset(OpARMSUBshiftRL) 12018 v.AuxInt = c 12019 v.AddArg(x) 12020 v.AddArg(y) 12021 return true 12022 } 12023 return false 12024 } 12025 func rewriteValueARM_OpARMXOR(v *Value, config *Config) bool { 12026 b := v.Block 12027 _ = b 12028 // match: (XOR (MOVWconst [c]) x) 12029 // cond: 12030 // result: (XORconst [c] x) 12031 for { 12032 v_0 := v.Args[0] 12033 if v_0.Op != OpARMMOVWconst { 12034 break 12035 } 12036 c := v_0.AuxInt 12037 x := v.Args[1] 12038 v.reset(OpARMXORconst) 12039 v.AuxInt = c 12040 v.AddArg(x) 12041 return true 12042 } 12043 // match: (XOR x (MOVWconst [c])) 12044 // cond: 12045 // result: (XORconst [c] x) 12046 for { 12047 x := v.Args[0] 12048 v_1 := v.Args[1] 12049 if v_1.Op != OpARMMOVWconst { 12050 break 12051 } 12052 c := v_1.AuxInt 12053 v.reset(OpARMXORconst) 12054 v.AuxInt = c 12055 v.AddArg(x) 12056 return true 12057 } 12058 // match: (XOR x (SLLconst [c] y)) 12059 // cond: 12060 // result: (XORshiftLL x y [c]) 12061 for { 12062 x := v.Args[0] 12063 v_1 := v.Args[1] 12064 if v_1.Op != OpARMSLLconst { 12065 break 12066 } 12067 c := v_1.AuxInt 12068 y := v_1.Args[0] 12069 v.reset(OpARMXORshiftLL) 12070 v.AuxInt = c 12071 v.AddArg(x) 12072 v.AddArg(y) 12073 return true 12074 } 12075 // match: (XOR (SLLconst [c] y) x) 12076 // cond: 12077 // result: (XORshiftLL x y [c]) 12078 for { 12079 v_0 := v.Args[0] 12080 if v_0.Op != OpARMSLLconst { 12081 break 12082 } 12083 c := v_0.AuxInt 12084 y := v_0.Args[0] 12085 x := v.Args[1] 12086 v.reset(OpARMXORshiftLL) 12087 v.AuxInt = c 12088 v.AddArg(x) 12089 v.AddArg(y) 12090 return true 12091 } 12092 // match: (XOR x (SRLconst [c] y)) 12093 // cond: 12094 // result: (XORshiftRL x y [c]) 12095 for { 12096 x := v.Args[0] 12097 v_1 := v.Args[1] 12098 if v_1.Op != OpARMSRLconst { 12099 break 12100 } 12101 c := v_1.AuxInt 12102 y := v_1.Args[0] 12103 v.reset(OpARMXORshiftRL) 12104 v.AuxInt = c 12105 v.AddArg(x) 12106 v.AddArg(y) 12107 return true 12108 } 12109 // match: (XOR (SRLconst [c] y) x) 12110 // cond: 12111 // result: (XORshiftRL x y [c]) 12112 for { 12113 v_0 := v.Args[0] 12114 if v_0.Op != OpARMSRLconst { 12115 break 12116 } 12117 c := v_0.AuxInt 12118 y := v_0.Args[0] 12119 x := v.Args[1] 12120 v.reset(OpARMXORshiftRL) 12121 v.AuxInt = c 12122 v.AddArg(x) 12123 v.AddArg(y) 12124 return true 12125 } 12126 // match: (XOR x (SRAconst [c] y)) 12127 // cond: 12128 // result: (XORshiftRA x y [c]) 12129 for { 12130 x := v.Args[0] 12131 v_1 := v.Args[1] 12132 if v_1.Op != OpARMSRAconst { 12133 break 12134 } 12135 c := v_1.AuxInt 12136 y := v_1.Args[0] 12137 v.reset(OpARMXORshiftRA) 12138 v.AuxInt = c 12139 v.AddArg(x) 12140 v.AddArg(y) 12141 return true 12142 } 12143 // match: (XOR (SRAconst [c] y) x) 12144 // cond: 12145 // result: (XORshiftRA x y [c]) 12146 for { 12147 v_0 := v.Args[0] 12148 if v_0.Op != OpARMSRAconst { 12149 break 12150 } 12151 c := v_0.AuxInt 12152 y := v_0.Args[0] 12153 x := v.Args[1] 12154 v.reset(OpARMXORshiftRA) 12155 v.AuxInt = c 12156 v.AddArg(x) 12157 v.AddArg(y) 12158 return true 12159 } 12160 // match: (XOR x (SRRconst [c] y)) 12161 // cond: 12162 // result: (XORshiftRR x y [c]) 12163 for { 12164 x := v.Args[0] 12165 v_1 := v.Args[1] 12166 if v_1.Op != OpARMSRRconst { 12167 break 12168 } 12169 c := v_1.AuxInt 12170 y := v_1.Args[0] 12171 v.reset(OpARMXORshiftRR) 12172 v.AuxInt = c 12173 v.AddArg(x) 12174 v.AddArg(y) 12175 return true 12176 } 12177 // match: (XOR (SRRconst [c] y) x) 12178 // cond: 12179 // result: (XORshiftRR x y [c]) 12180 for { 12181 v_0 := v.Args[0] 12182 if v_0.Op != OpARMSRRconst { 12183 break 12184 } 12185 c := v_0.AuxInt 12186 y := v_0.Args[0] 12187 x := v.Args[1] 12188 v.reset(OpARMXORshiftRR) 12189 v.AuxInt = c 12190 v.AddArg(x) 12191 v.AddArg(y) 12192 return true 12193 } 12194 // match: (XOR x (SLL y z)) 12195 // cond: 12196 // result: (XORshiftLLreg x y z) 12197 for { 12198 x := v.Args[0] 12199 v_1 := v.Args[1] 12200 if v_1.Op != OpARMSLL { 12201 break 12202 } 12203 y := v_1.Args[0] 12204 z := v_1.Args[1] 12205 v.reset(OpARMXORshiftLLreg) 12206 v.AddArg(x) 12207 v.AddArg(y) 12208 v.AddArg(z) 12209 return true 12210 } 12211 // match: (XOR (SLL y z) x) 12212 // cond: 12213 // result: (XORshiftLLreg x y z) 12214 for { 12215 v_0 := v.Args[0] 12216 if v_0.Op != OpARMSLL { 12217 break 12218 } 12219 y := v_0.Args[0] 12220 z := v_0.Args[1] 12221 x := v.Args[1] 12222 v.reset(OpARMXORshiftLLreg) 12223 v.AddArg(x) 12224 v.AddArg(y) 12225 v.AddArg(z) 12226 return true 12227 } 12228 // match: (XOR x (SRL y z)) 12229 // cond: 12230 // result: (XORshiftRLreg x y z) 12231 for { 12232 x := v.Args[0] 12233 v_1 := v.Args[1] 12234 if v_1.Op != OpARMSRL { 12235 break 12236 } 12237 y := v_1.Args[0] 12238 z := v_1.Args[1] 12239 v.reset(OpARMXORshiftRLreg) 12240 v.AddArg(x) 12241 v.AddArg(y) 12242 v.AddArg(z) 12243 return true 12244 } 12245 // match: (XOR (SRL y z) x) 12246 // cond: 12247 // result: (XORshiftRLreg x y z) 12248 for { 12249 v_0 := v.Args[0] 12250 if v_0.Op != OpARMSRL { 12251 break 12252 } 12253 y := v_0.Args[0] 12254 z := v_0.Args[1] 12255 x := v.Args[1] 12256 v.reset(OpARMXORshiftRLreg) 12257 v.AddArg(x) 12258 v.AddArg(y) 12259 v.AddArg(z) 12260 return true 12261 } 12262 // match: (XOR x (SRA y z)) 12263 // cond: 12264 // result: (XORshiftRAreg x y z) 12265 for { 12266 x := v.Args[0] 12267 v_1 := v.Args[1] 12268 if v_1.Op != OpARMSRA { 12269 break 12270 } 12271 y := v_1.Args[0] 12272 z := v_1.Args[1] 12273 v.reset(OpARMXORshiftRAreg) 12274 v.AddArg(x) 12275 v.AddArg(y) 12276 v.AddArg(z) 12277 return true 12278 } 12279 // match: (XOR (SRA y z) x) 12280 // cond: 12281 // result: (XORshiftRAreg x y z) 12282 for { 12283 v_0 := v.Args[0] 12284 if v_0.Op != OpARMSRA { 12285 break 12286 } 12287 y := v_0.Args[0] 12288 z := v_0.Args[1] 12289 x := v.Args[1] 12290 v.reset(OpARMXORshiftRAreg) 12291 v.AddArg(x) 12292 v.AddArg(y) 12293 v.AddArg(z) 12294 return true 12295 } 12296 // match: (XOR x x) 12297 // cond: 12298 // result: (MOVWconst [0]) 12299 for { 12300 x := v.Args[0] 12301 if x != v.Args[1] { 12302 break 12303 } 12304 v.reset(OpARMMOVWconst) 12305 v.AuxInt = 0 12306 return true 12307 } 12308 return false 12309 } 12310 func rewriteValueARM_OpARMXORconst(v *Value, config *Config) bool { 12311 b := v.Block 12312 _ = b 12313 // match: (XORconst [0] x) 12314 // cond: 12315 // result: x 12316 for { 12317 if v.AuxInt != 0 { 12318 break 12319 } 12320 x := v.Args[0] 12321 v.reset(OpCopy) 12322 v.Type = x.Type 12323 v.AddArg(x) 12324 return true 12325 } 12326 // match: (XORconst [c] (MOVWconst [d])) 12327 // cond: 12328 // result: (MOVWconst [c^d]) 12329 for { 12330 c := v.AuxInt 12331 v_0 := v.Args[0] 12332 if v_0.Op != OpARMMOVWconst { 12333 break 12334 } 12335 d := v_0.AuxInt 12336 v.reset(OpARMMOVWconst) 12337 v.AuxInt = c ^ d 12338 return true 12339 } 12340 // match: (XORconst [c] (XORconst [d] x)) 12341 // cond: 12342 // result: (XORconst [c^d] x) 12343 for { 12344 c := v.AuxInt 12345 v_0 := v.Args[0] 12346 if v_0.Op != OpARMXORconst { 12347 break 12348 } 12349 d := v_0.AuxInt 12350 x := v_0.Args[0] 12351 v.reset(OpARMXORconst) 12352 v.AuxInt = c ^ d 12353 v.AddArg(x) 12354 return true 12355 } 12356 return false 12357 } 12358 func rewriteValueARM_OpARMXORshiftLL(v *Value, config *Config) bool { 12359 b := v.Block 12360 _ = b 12361 // match: (XORshiftLL (MOVWconst [c]) x [d]) 12362 // cond: 12363 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 12364 for { 12365 d := v.AuxInt 12366 v_0 := v.Args[0] 12367 if v_0.Op != OpARMMOVWconst { 12368 break 12369 } 12370 c := v_0.AuxInt 12371 x := v.Args[1] 12372 v.reset(OpARMXORconst) 12373 v.AuxInt = c 12374 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 12375 v0.AuxInt = d 12376 v0.AddArg(x) 12377 v.AddArg(v0) 12378 return true 12379 } 12380 // match: (XORshiftLL x (MOVWconst [c]) [d]) 12381 // cond: 12382 // result: (XORconst x [int64(uint32(c)<<uint64(d))]) 12383 for { 12384 d := v.AuxInt 12385 x := v.Args[0] 12386 v_1 := v.Args[1] 12387 if v_1.Op != OpARMMOVWconst { 12388 break 12389 } 12390 c := v_1.AuxInt 12391 v.reset(OpARMXORconst) 12392 v.AuxInt = int64(uint32(c) << uint64(d)) 12393 v.AddArg(x) 12394 return true 12395 } 12396 // match: (XORshiftLL x (SLLconst x [c]) [d]) 12397 // cond: c==d 12398 // result: (MOVWconst [0]) 12399 for { 12400 d := v.AuxInt 12401 x := v.Args[0] 12402 v_1 := v.Args[1] 12403 if v_1.Op != OpARMSLLconst { 12404 break 12405 } 12406 c := v_1.AuxInt 12407 if x != v_1.Args[0] { 12408 break 12409 } 12410 if !(c == d) { 12411 break 12412 } 12413 v.reset(OpARMMOVWconst) 12414 v.AuxInt = 0 12415 return true 12416 } 12417 return false 12418 } 12419 func rewriteValueARM_OpARMXORshiftLLreg(v *Value, config *Config) bool { 12420 b := v.Block 12421 _ = b 12422 // match: (XORshiftLLreg (MOVWconst [c]) x y) 12423 // cond: 12424 // result: (XORconst [c] (SLL <x.Type> x y)) 12425 for { 12426 v_0 := v.Args[0] 12427 if v_0.Op != OpARMMOVWconst { 12428 break 12429 } 12430 c := v_0.AuxInt 12431 x := v.Args[1] 12432 y := v.Args[2] 12433 v.reset(OpARMXORconst) 12434 v.AuxInt = c 12435 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 12436 v0.AddArg(x) 12437 v0.AddArg(y) 12438 v.AddArg(v0) 12439 return true 12440 } 12441 // match: (XORshiftLLreg x y (MOVWconst [c])) 12442 // cond: 12443 // result: (XORshiftLL x y [c]) 12444 for { 12445 x := v.Args[0] 12446 y := v.Args[1] 12447 v_2 := v.Args[2] 12448 if v_2.Op != OpARMMOVWconst { 12449 break 12450 } 12451 c := v_2.AuxInt 12452 v.reset(OpARMXORshiftLL) 12453 v.AuxInt = c 12454 v.AddArg(x) 12455 v.AddArg(y) 12456 return true 12457 } 12458 return false 12459 } 12460 func rewriteValueARM_OpARMXORshiftRA(v *Value, config *Config) bool { 12461 b := v.Block 12462 _ = b 12463 // match: (XORshiftRA (MOVWconst [c]) x [d]) 12464 // cond: 12465 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 12466 for { 12467 d := v.AuxInt 12468 v_0 := v.Args[0] 12469 if v_0.Op != OpARMMOVWconst { 12470 break 12471 } 12472 c := v_0.AuxInt 12473 x := v.Args[1] 12474 v.reset(OpARMXORconst) 12475 v.AuxInt = c 12476 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 12477 v0.AuxInt = d 12478 v0.AddArg(x) 12479 v.AddArg(v0) 12480 return true 12481 } 12482 // match: (XORshiftRA x (MOVWconst [c]) [d]) 12483 // cond: 12484 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 12485 for { 12486 d := v.AuxInt 12487 x := v.Args[0] 12488 v_1 := v.Args[1] 12489 if v_1.Op != OpARMMOVWconst { 12490 break 12491 } 12492 c := v_1.AuxInt 12493 v.reset(OpARMXORconst) 12494 v.AuxInt = int64(int32(c) >> uint64(d)) 12495 v.AddArg(x) 12496 return true 12497 } 12498 // match: (XORshiftRA x (SRAconst x [c]) [d]) 12499 // cond: c==d 12500 // result: (MOVWconst [0]) 12501 for { 12502 d := v.AuxInt 12503 x := v.Args[0] 12504 v_1 := v.Args[1] 12505 if v_1.Op != OpARMSRAconst { 12506 break 12507 } 12508 c := v_1.AuxInt 12509 if x != v_1.Args[0] { 12510 break 12511 } 12512 if !(c == d) { 12513 break 12514 } 12515 v.reset(OpARMMOVWconst) 12516 v.AuxInt = 0 12517 return true 12518 } 12519 return false 12520 } 12521 func rewriteValueARM_OpARMXORshiftRAreg(v *Value, config *Config) bool { 12522 b := v.Block 12523 _ = b 12524 // match: (XORshiftRAreg (MOVWconst [c]) x y) 12525 // cond: 12526 // result: (XORconst [c] (SRA <x.Type> x y)) 12527 for { 12528 v_0 := v.Args[0] 12529 if v_0.Op != OpARMMOVWconst { 12530 break 12531 } 12532 c := v_0.AuxInt 12533 x := v.Args[1] 12534 y := v.Args[2] 12535 v.reset(OpARMXORconst) 12536 v.AuxInt = c 12537 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 12538 v0.AddArg(x) 12539 v0.AddArg(y) 12540 v.AddArg(v0) 12541 return true 12542 } 12543 // match: (XORshiftRAreg x y (MOVWconst [c])) 12544 // cond: 12545 // result: (XORshiftRA x y [c]) 12546 for { 12547 x := v.Args[0] 12548 y := v.Args[1] 12549 v_2 := v.Args[2] 12550 if v_2.Op != OpARMMOVWconst { 12551 break 12552 } 12553 c := v_2.AuxInt 12554 v.reset(OpARMXORshiftRA) 12555 v.AuxInt = c 12556 v.AddArg(x) 12557 v.AddArg(y) 12558 return true 12559 } 12560 return false 12561 } 12562 func rewriteValueARM_OpARMXORshiftRL(v *Value, config *Config) bool { 12563 b := v.Block 12564 _ = b 12565 // match: (XORshiftRL (MOVWconst [c]) x [d]) 12566 // cond: 12567 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 12568 for { 12569 d := v.AuxInt 12570 v_0 := v.Args[0] 12571 if v_0.Op != OpARMMOVWconst { 12572 break 12573 } 12574 c := v_0.AuxInt 12575 x := v.Args[1] 12576 v.reset(OpARMXORconst) 12577 v.AuxInt = c 12578 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 12579 v0.AuxInt = d 12580 v0.AddArg(x) 12581 v.AddArg(v0) 12582 return true 12583 } 12584 // match: (XORshiftRL x (MOVWconst [c]) [d]) 12585 // cond: 12586 // result: (XORconst x [int64(uint32(c)>>uint64(d))]) 12587 for { 12588 d := v.AuxInt 12589 x := v.Args[0] 12590 v_1 := v.Args[1] 12591 if v_1.Op != OpARMMOVWconst { 12592 break 12593 } 12594 c := v_1.AuxInt 12595 v.reset(OpARMXORconst) 12596 v.AuxInt = int64(uint32(c) >> uint64(d)) 12597 v.AddArg(x) 12598 return true 12599 } 12600 // match: (XORshiftRL x (SRLconst x [c]) [d]) 12601 // cond: c==d 12602 // result: (MOVWconst [0]) 12603 for { 12604 d := v.AuxInt 12605 x := v.Args[0] 12606 v_1 := v.Args[1] 12607 if v_1.Op != OpARMSRLconst { 12608 break 12609 } 12610 c := v_1.AuxInt 12611 if x != v_1.Args[0] { 12612 break 12613 } 12614 if !(c == d) { 12615 break 12616 } 12617 v.reset(OpARMMOVWconst) 12618 v.AuxInt = 0 12619 return true 12620 } 12621 return false 12622 } 12623 func rewriteValueARM_OpARMXORshiftRLreg(v *Value, config *Config) bool { 12624 b := v.Block 12625 _ = b 12626 // match: (XORshiftRLreg (MOVWconst [c]) x y) 12627 // cond: 12628 // result: (XORconst [c] (SRL <x.Type> x y)) 12629 for { 12630 v_0 := v.Args[0] 12631 if v_0.Op != OpARMMOVWconst { 12632 break 12633 } 12634 c := v_0.AuxInt 12635 x := v.Args[1] 12636 y := v.Args[2] 12637 v.reset(OpARMXORconst) 12638 v.AuxInt = c 12639 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 12640 v0.AddArg(x) 12641 v0.AddArg(y) 12642 v.AddArg(v0) 12643 return true 12644 } 12645 // match: (XORshiftRLreg x y (MOVWconst [c])) 12646 // cond: 12647 // result: (XORshiftRL x y [c]) 12648 for { 12649 x := v.Args[0] 12650 y := v.Args[1] 12651 v_2 := v.Args[2] 12652 if v_2.Op != OpARMMOVWconst { 12653 break 12654 } 12655 c := v_2.AuxInt 12656 v.reset(OpARMXORshiftRL) 12657 v.AuxInt = c 12658 v.AddArg(x) 12659 v.AddArg(y) 12660 return true 12661 } 12662 return false 12663 } 12664 func rewriteValueARM_OpARMXORshiftRR(v *Value, config *Config) bool { 12665 b := v.Block 12666 _ = b 12667 // match: (XORshiftRR (MOVWconst [c]) x [d]) 12668 // cond: 12669 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 12670 for { 12671 d := v.AuxInt 12672 v_0 := v.Args[0] 12673 if v_0.Op != OpARMMOVWconst { 12674 break 12675 } 12676 c := v_0.AuxInt 12677 x := v.Args[1] 12678 v.reset(OpARMXORconst) 12679 v.AuxInt = c 12680 v0 := b.NewValue0(v.Line, OpARMSRRconst, x.Type) 12681 v0.AuxInt = d 12682 v0.AddArg(x) 12683 v.AddArg(v0) 12684 return true 12685 } 12686 // match: (XORshiftRR x (MOVWconst [c]) [d]) 12687 // cond: 12688 // result: (XORconst x [int64(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 12689 for { 12690 d := v.AuxInt 12691 x := v.Args[0] 12692 v_1 := v.Args[1] 12693 if v_1.Op != OpARMMOVWconst { 12694 break 12695 } 12696 c := v_1.AuxInt 12697 v.reset(OpARMXORconst) 12698 v.AuxInt = int64(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)) 12699 v.AddArg(x) 12700 return true 12701 } 12702 return false 12703 } 12704 func rewriteValueARM_OpAdd16(v *Value, config *Config) bool { 12705 b := v.Block 12706 _ = b 12707 // match: (Add16 x y) 12708 // cond: 12709 // result: (ADD x y) 12710 for { 12711 x := v.Args[0] 12712 y := v.Args[1] 12713 v.reset(OpARMADD) 12714 v.AddArg(x) 12715 v.AddArg(y) 12716 return true 12717 } 12718 } 12719 func rewriteValueARM_OpAdd32(v *Value, config *Config) bool { 12720 b := v.Block 12721 _ = b 12722 // match: (Add32 x y) 12723 // cond: 12724 // result: (ADD x y) 12725 for { 12726 x := v.Args[0] 12727 y := v.Args[1] 12728 v.reset(OpARMADD) 12729 v.AddArg(x) 12730 v.AddArg(y) 12731 return true 12732 } 12733 } 12734 func rewriteValueARM_OpAdd32F(v *Value, config *Config) bool { 12735 b := v.Block 12736 _ = b 12737 // match: (Add32F x y) 12738 // cond: 12739 // result: (ADDF x y) 12740 for { 12741 x := v.Args[0] 12742 y := v.Args[1] 12743 v.reset(OpARMADDF) 12744 v.AddArg(x) 12745 v.AddArg(y) 12746 return true 12747 } 12748 } 12749 func rewriteValueARM_OpAdd32carry(v *Value, config *Config) bool { 12750 b := v.Block 12751 _ = b 12752 // match: (Add32carry x y) 12753 // cond: 12754 // result: (ADDS x y) 12755 for { 12756 x := v.Args[0] 12757 y := v.Args[1] 12758 v.reset(OpARMADDS) 12759 v.AddArg(x) 12760 v.AddArg(y) 12761 return true 12762 } 12763 } 12764 func rewriteValueARM_OpAdd32withcarry(v *Value, config *Config) bool { 12765 b := v.Block 12766 _ = b 12767 // match: (Add32withcarry x y c) 12768 // cond: 12769 // result: (ADC x y c) 12770 for { 12771 x := v.Args[0] 12772 y := v.Args[1] 12773 c := v.Args[2] 12774 v.reset(OpARMADC) 12775 v.AddArg(x) 12776 v.AddArg(y) 12777 v.AddArg(c) 12778 return true 12779 } 12780 } 12781 func rewriteValueARM_OpAdd64F(v *Value, config *Config) bool { 12782 b := v.Block 12783 _ = b 12784 // match: (Add64F x y) 12785 // cond: 12786 // result: (ADDD x y) 12787 for { 12788 x := v.Args[0] 12789 y := v.Args[1] 12790 v.reset(OpARMADDD) 12791 v.AddArg(x) 12792 v.AddArg(y) 12793 return true 12794 } 12795 } 12796 func rewriteValueARM_OpAdd8(v *Value, config *Config) bool { 12797 b := v.Block 12798 _ = b 12799 // match: (Add8 x y) 12800 // cond: 12801 // result: (ADD x y) 12802 for { 12803 x := v.Args[0] 12804 y := v.Args[1] 12805 v.reset(OpARMADD) 12806 v.AddArg(x) 12807 v.AddArg(y) 12808 return true 12809 } 12810 } 12811 func rewriteValueARM_OpAddPtr(v *Value, config *Config) bool { 12812 b := v.Block 12813 _ = b 12814 // match: (AddPtr x y) 12815 // cond: 12816 // result: (ADD x y) 12817 for { 12818 x := v.Args[0] 12819 y := v.Args[1] 12820 v.reset(OpARMADD) 12821 v.AddArg(x) 12822 v.AddArg(y) 12823 return true 12824 } 12825 } 12826 func rewriteValueARM_OpAddr(v *Value, config *Config) bool { 12827 b := v.Block 12828 _ = b 12829 // match: (Addr {sym} base) 12830 // cond: 12831 // result: (MOVWaddr {sym} base) 12832 for { 12833 sym := v.Aux 12834 base := v.Args[0] 12835 v.reset(OpARMMOVWaddr) 12836 v.Aux = sym 12837 v.AddArg(base) 12838 return true 12839 } 12840 } 12841 func rewriteValueARM_OpAnd16(v *Value, config *Config) bool { 12842 b := v.Block 12843 _ = b 12844 // match: (And16 x y) 12845 // cond: 12846 // result: (AND x y) 12847 for { 12848 x := v.Args[0] 12849 y := v.Args[1] 12850 v.reset(OpARMAND) 12851 v.AddArg(x) 12852 v.AddArg(y) 12853 return true 12854 } 12855 } 12856 func rewriteValueARM_OpAnd32(v *Value, config *Config) bool { 12857 b := v.Block 12858 _ = b 12859 // match: (And32 x y) 12860 // cond: 12861 // result: (AND x y) 12862 for { 12863 x := v.Args[0] 12864 y := v.Args[1] 12865 v.reset(OpARMAND) 12866 v.AddArg(x) 12867 v.AddArg(y) 12868 return true 12869 } 12870 } 12871 func rewriteValueARM_OpAnd8(v *Value, config *Config) bool { 12872 b := v.Block 12873 _ = b 12874 // match: (And8 x y) 12875 // cond: 12876 // result: (AND x y) 12877 for { 12878 x := v.Args[0] 12879 y := v.Args[1] 12880 v.reset(OpARMAND) 12881 v.AddArg(x) 12882 v.AddArg(y) 12883 return true 12884 } 12885 } 12886 func rewriteValueARM_OpAndB(v *Value, config *Config) bool { 12887 b := v.Block 12888 _ = b 12889 // match: (AndB x y) 12890 // cond: 12891 // result: (AND x y) 12892 for { 12893 x := v.Args[0] 12894 y := v.Args[1] 12895 v.reset(OpARMAND) 12896 v.AddArg(x) 12897 v.AddArg(y) 12898 return true 12899 } 12900 } 12901 func rewriteValueARM_OpBswap32(v *Value, config *Config) bool { 12902 b := v.Block 12903 _ = b 12904 // match: (Bswap32 <t> x) 12905 // cond: 12906 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 12907 for { 12908 t := v.Type 12909 x := v.Args[0] 12910 v.reset(OpARMXOR) 12911 v.Type = t 12912 v0 := b.NewValue0(v.Line, OpARMSRLconst, t) 12913 v0.AuxInt = 8 12914 v1 := b.NewValue0(v.Line, OpARMBICconst, t) 12915 v1.AuxInt = 0xff0000 12916 v2 := b.NewValue0(v.Line, OpARMXOR, t) 12917 v2.AddArg(x) 12918 v3 := b.NewValue0(v.Line, OpARMSRRconst, t) 12919 v3.AuxInt = 16 12920 v3.AddArg(x) 12921 v2.AddArg(v3) 12922 v1.AddArg(v2) 12923 v0.AddArg(v1) 12924 v.AddArg(v0) 12925 v4 := b.NewValue0(v.Line, OpARMSRRconst, t) 12926 v4.AuxInt = 8 12927 v4.AddArg(x) 12928 v.AddArg(v4) 12929 return true 12930 } 12931 } 12932 func rewriteValueARM_OpClosureCall(v *Value, config *Config) bool { 12933 b := v.Block 12934 _ = b 12935 // match: (ClosureCall [argwid] entry closure mem) 12936 // cond: 12937 // result: (CALLclosure [argwid] entry closure mem) 12938 for { 12939 argwid := v.AuxInt 12940 entry := v.Args[0] 12941 closure := v.Args[1] 12942 mem := v.Args[2] 12943 v.reset(OpARMCALLclosure) 12944 v.AuxInt = argwid 12945 v.AddArg(entry) 12946 v.AddArg(closure) 12947 v.AddArg(mem) 12948 return true 12949 } 12950 } 12951 func rewriteValueARM_OpCom16(v *Value, config *Config) bool { 12952 b := v.Block 12953 _ = b 12954 // match: (Com16 x) 12955 // cond: 12956 // result: (MVN x) 12957 for { 12958 x := v.Args[0] 12959 v.reset(OpARMMVN) 12960 v.AddArg(x) 12961 return true 12962 } 12963 } 12964 func rewriteValueARM_OpCom32(v *Value, config *Config) bool { 12965 b := v.Block 12966 _ = b 12967 // match: (Com32 x) 12968 // cond: 12969 // result: (MVN x) 12970 for { 12971 x := v.Args[0] 12972 v.reset(OpARMMVN) 12973 v.AddArg(x) 12974 return true 12975 } 12976 } 12977 func rewriteValueARM_OpCom8(v *Value, config *Config) bool { 12978 b := v.Block 12979 _ = b 12980 // match: (Com8 x) 12981 // cond: 12982 // result: (MVN x) 12983 for { 12984 x := v.Args[0] 12985 v.reset(OpARMMVN) 12986 v.AddArg(x) 12987 return true 12988 } 12989 } 12990 func rewriteValueARM_OpConst16(v *Value, config *Config) bool { 12991 b := v.Block 12992 _ = b 12993 // match: (Const16 [val]) 12994 // cond: 12995 // result: (MOVWconst [val]) 12996 for { 12997 val := v.AuxInt 12998 v.reset(OpARMMOVWconst) 12999 v.AuxInt = val 13000 return true 13001 } 13002 } 13003 func rewriteValueARM_OpConst32(v *Value, config *Config) bool { 13004 b := v.Block 13005 _ = b 13006 // match: (Const32 [val]) 13007 // cond: 13008 // result: (MOVWconst [val]) 13009 for { 13010 val := v.AuxInt 13011 v.reset(OpARMMOVWconst) 13012 v.AuxInt = val 13013 return true 13014 } 13015 } 13016 func rewriteValueARM_OpConst32F(v *Value, config *Config) bool { 13017 b := v.Block 13018 _ = b 13019 // match: (Const32F [val]) 13020 // cond: 13021 // result: (MOVFconst [val]) 13022 for { 13023 val := v.AuxInt 13024 v.reset(OpARMMOVFconst) 13025 v.AuxInt = val 13026 return true 13027 } 13028 } 13029 func rewriteValueARM_OpConst64F(v *Value, config *Config) bool { 13030 b := v.Block 13031 _ = b 13032 // match: (Const64F [val]) 13033 // cond: 13034 // result: (MOVDconst [val]) 13035 for { 13036 val := v.AuxInt 13037 v.reset(OpARMMOVDconst) 13038 v.AuxInt = val 13039 return true 13040 } 13041 } 13042 func rewriteValueARM_OpConst8(v *Value, config *Config) bool { 13043 b := v.Block 13044 _ = b 13045 // match: (Const8 [val]) 13046 // cond: 13047 // result: (MOVWconst [val]) 13048 for { 13049 val := v.AuxInt 13050 v.reset(OpARMMOVWconst) 13051 v.AuxInt = val 13052 return true 13053 } 13054 } 13055 func rewriteValueARM_OpConstBool(v *Value, config *Config) bool { 13056 b := v.Block 13057 _ = b 13058 // match: (ConstBool [b]) 13059 // cond: 13060 // result: (MOVWconst [b]) 13061 for { 13062 b := v.AuxInt 13063 v.reset(OpARMMOVWconst) 13064 v.AuxInt = b 13065 return true 13066 } 13067 } 13068 func rewriteValueARM_OpConstNil(v *Value, config *Config) bool { 13069 b := v.Block 13070 _ = b 13071 // match: (ConstNil) 13072 // cond: 13073 // result: (MOVWconst [0]) 13074 for { 13075 v.reset(OpARMMOVWconst) 13076 v.AuxInt = 0 13077 return true 13078 } 13079 } 13080 func rewriteValueARM_OpConvert(v *Value, config *Config) bool { 13081 b := v.Block 13082 _ = b 13083 // match: (Convert x mem) 13084 // cond: 13085 // result: (MOVWconvert x mem) 13086 for { 13087 x := v.Args[0] 13088 mem := v.Args[1] 13089 v.reset(OpARMMOVWconvert) 13090 v.AddArg(x) 13091 v.AddArg(mem) 13092 return true 13093 } 13094 } 13095 func rewriteValueARM_OpCtz32(v *Value, config *Config) bool { 13096 b := v.Block 13097 _ = b 13098 // match: (Ctz32 <t> x) 13099 // cond: 13100 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 13101 for { 13102 t := v.Type 13103 x := v.Args[0] 13104 v.reset(OpARMRSBconst) 13105 v.AuxInt = 32 13106 v0 := b.NewValue0(v.Line, OpARMCLZ, t) 13107 v1 := b.NewValue0(v.Line, OpARMSUBconst, t) 13108 v1.AuxInt = 1 13109 v2 := b.NewValue0(v.Line, OpARMAND, t) 13110 v2.AddArg(x) 13111 v3 := b.NewValue0(v.Line, OpARMRSBconst, t) 13112 v3.AuxInt = 0 13113 v3.AddArg(x) 13114 v2.AddArg(v3) 13115 v1.AddArg(v2) 13116 v0.AddArg(v1) 13117 v.AddArg(v0) 13118 return true 13119 } 13120 } 13121 func rewriteValueARM_OpCvt32Fto32(v *Value, config *Config) bool { 13122 b := v.Block 13123 _ = b 13124 // match: (Cvt32Fto32 x) 13125 // cond: 13126 // result: (MOVFW x) 13127 for { 13128 x := v.Args[0] 13129 v.reset(OpARMMOVFW) 13130 v.AddArg(x) 13131 return true 13132 } 13133 } 13134 func rewriteValueARM_OpCvt32Fto32U(v *Value, config *Config) bool { 13135 b := v.Block 13136 _ = b 13137 // match: (Cvt32Fto32U x) 13138 // cond: 13139 // result: (MOVFWU x) 13140 for { 13141 x := v.Args[0] 13142 v.reset(OpARMMOVFWU) 13143 v.AddArg(x) 13144 return true 13145 } 13146 } 13147 func rewriteValueARM_OpCvt32Fto64F(v *Value, config *Config) bool { 13148 b := v.Block 13149 _ = b 13150 // match: (Cvt32Fto64F x) 13151 // cond: 13152 // result: (MOVFD x) 13153 for { 13154 x := v.Args[0] 13155 v.reset(OpARMMOVFD) 13156 v.AddArg(x) 13157 return true 13158 } 13159 } 13160 func rewriteValueARM_OpCvt32Uto32F(v *Value, config *Config) bool { 13161 b := v.Block 13162 _ = b 13163 // match: (Cvt32Uto32F x) 13164 // cond: 13165 // result: (MOVWUF x) 13166 for { 13167 x := v.Args[0] 13168 v.reset(OpARMMOVWUF) 13169 v.AddArg(x) 13170 return true 13171 } 13172 } 13173 func rewriteValueARM_OpCvt32Uto64F(v *Value, config *Config) bool { 13174 b := v.Block 13175 _ = b 13176 // match: (Cvt32Uto64F x) 13177 // cond: 13178 // result: (MOVWUD x) 13179 for { 13180 x := v.Args[0] 13181 v.reset(OpARMMOVWUD) 13182 v.AddArg(x) 13183 return true 13184 } 13185 } 13186 func rewriteValueARM_OpCvt32to32F(v *Value, config *Config) bool { 13187 b := v.Block 13188 _ = b 13189 // match: (Cvt32to32F x) 13190 // cond: 13191 // result: (MOVWF x) 13192 for { 13193 x := v.Args[0] 13194 v.reset(OpARMMOVWF) 13195 v.AddArg(x) 13196 return true 13197 } 13198 } 13199 func rewriteValueARM_OpCvt32to64F(v *Value, config *Config) bool { 13200 b := v.Block 13201 _ = b 13202 // match: (Cvt32to64F x) 13203 // cond: 13204 // result: (MOVWD x) 13205 for { 13206 x := v.Args[0] 13207 v.reset(OpARMMOVWD) 13208 v.AddArg(x) 13209 return true 13210 } 13211 } 13212 func rewriteValueARM_OpCvt64Fto32(v *Value, config *Config) bool { 13213 b := v.Block 13214 _ = b 13215 // match: (Cvt64Fto32 x) 13216 // cond: 13217 // result: (MOVDW x) 13218 for { 13219 x := v.Args[0] 13220 v.reset(OpARMMOVDW) 13221 v.AddArg(x) 13222 return true 13223 } 13224 } 13225 func rewriteValueARM_OpCvt64Fto32F(v *Value, config *Config) bool { 13226 b := v.Block 13227 _ = b 13228 // match: (Cvt64Fto32F x) 13229 // cond: 13230 // result: (MOVDF x) 13231 for { 13232 x := v.Args[0] 13233 v.reset(OpARMMOVDF) 13234 v.AddArg(x) 13235 return true 13236 } 13237 } 13238 func rewriteValueARM_OpCvt64Fto32U(v *Value, config *Config) bool { 13239 b := v.Block 13240 _ = b 13241 // match: (Cvt64Fto32U x) 13242 // cond: 13243 // result: (MOVDWU x) 13244 for { 13245 x := v.Args[0] 13246 v.reset(OpARMMOVDWU) 13247 v.AddArg(x) 13248 return true 13249 } 13250 } 13251 func rewriteValueARM_OpDeferCall(v *Value, config *Config) bool { 13252 b := v.Block 13253 _ = b 13254 // match: (DeferCall [argwid] mem) 13255 // cond: 13256 // result: (CALLdefer [argwid] mem) 13257 for { 13258 argwid := v.AuxInt 13259 mem := v.Args[0] 13260 v.reset(OpARMCALLdefer) 13261 v.AuxInt = argwid 13262 v.AddArg(mem) 13263 return true 13264 } 13265 } 13266 func rewriteValueARM_OpDiv16(v *Value, config *Config) bool { 13267 b := v.Block 13268 _ = b 13269 // match: (Div16 x y) 13270 // cond: 13271 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 13272 for { 13273 x := v.Args[0] 13274 y := v.Args[1] 13275 v.reset(OpDiv32) 13276 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13277 v0.AddArg(x) 13278 v.AddArg(v0) 13279 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13280 v1.AddArg(y) 13281 v.AddArg(v1) 13282 return true 13283 } 13284 } 13285 func rewriteValueARM_OpDiv16u(v *Value, config *Config) bool { 13286 b := v.Block 13287 _ = b 13288 // match: (Div16u x y) 13289 // cond: 13290 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 13291 for { 13292 x := v.Args[0] 13293 y := v.Args[1] 13294 v.reset(OpDiv32u) 13295 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13296 v0.AddArg(x) 13297 v.AddArg(v0) 13298 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13299 v1.AddArg(y) 13300 v.AddArg(v1) 13301 return true 13302 } 13303 } 13304 func rewriteValueARM_OpDiv32(v *Value, config *Config) bool { 13305 b := v.Block 13306 _ = b 13307 // match: (Div32 x y) 13308 // cond: 13309 // 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))) 13310 for { 13311 x := v.Args[0] 13312 y := v.Args[1] 13313 v.reset(OpARMSUB) 13314 v0 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13315 v1 := b.NewValue0(v.Line, OpSelect0, config.fe.TypeUInt32()) 13316 v2 := b.NewValue0(v.Line, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 13317 v3 := b.NewValue0(v.Line, OpARMSUB, config.fe.TypeUInt32()) 13318 v4 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13319 v4.AddArg(x) 13320 v5 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13321 v5.AddArg(x) 13322 v4.AddArg(v5) 13323 v3.AddArg(v4) 13324 v6 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13325 v6.AddArg(x) 13326 v3.AddArg(v6) 13327 v2.AddArg(v3) 13328 v7 := b.NewValue0(v.Line, OpARMSUB, config.fe.TypeUInt32()) 13329 v8 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13330 v8.AddArg(y) 13331 v9 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13332 v9.AddArg(y) 13333 v8.AddArg(v9) 13334 v7.AddArg(v8) 13335 v10 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13336 v10.AddArg(y) 13337 v7.AddArg(v10) 13338 v2.AddArg(v7) 13339 v1.AddArg(v2) 13340 v0.AddArg(v1) 13341 v11 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13342 v12 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13343 v12.AddArg(x) 13344 v12.AddArg(y) 13345 v11.AddArg(v12) 13346 v0.AddArg(v11) 13347 v.AddArg(v0) 13348 v13 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13349 v14 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13350 v14.AddArg(x) 13351 v14.AddArg(y) 13352 v13.AddArg(v14) 13353 v.AddArg(v13) 13354 return true 13355 } 13356 } 13357 func rewriteValueARM_OpDiv32F(v *Value, config *Config) bool { 13358 b := v.Block 13359 _ = b 13360 // match: (Div32F x y) 13361 // cond: 13362 // result: (DIVF x y) 13363 for { 13364 x := v.Args[0] 13365 y := v.Args[1] 13366 v.reset(OpARMDIVF) 13367 v.AddArg(x) 13368 v.AddArg(y) 13369 return true 13370 } 13371 } 13372 func rewriteValueARM_OpDiv32u(v *Value, config *Config) bool { 13373 b := v.Block 13374 _ = b 13375 // match: (Div32u x y) 13376 // cond: 13377 // result: (Select0 <config.fe.TypeUInt32()> (UDIVrtcall x y)) 13378 for { 13379 x := v.Args[0] 13380 y := v.Args[1] 13381 v.reset(OpSelect0) 13382 v.Type = config.fe.TypeUInt32() 13383 v0 := b.NewValue0(v.Line, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 13384 v0.AddArg(x) 13385 v0.AddArg(y) 13386 v.AddArg(v0) 13387 return true 13388 } 13389 } 13390 func rewriteValueARM_OpDiv64F(v *Value, config *Config) bool { 13391 b := v.Block 13392 _ = b 13393 // match: (Div64F x y) 13394 // cond: 13395 // result: (DIVD x y) 13396 for { 13397 x := v.Args[0] 13398 y := v.Args[1] 13399 v.reset(OpARMDIVD) 13400 v.AddArg(x) 13401 v.AddArg(y) 13402 return true 13403 } 13404 } 13405 func rewriteValueARM_OpDiv8(v *Value, config *Config) bool { 13406 b := v.Block 13407 _ = b 13408 // match: (Div8 x y) 13409 // cond: 13410 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 13411 for { 13412 x := v.Args[0] 13413 y := v.Args[1] 13414 v.reset(OpDiv32) 13415 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13416 v0.AddArg(x) 13417 v.AddArg(v0) 13418 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13419 v1.AddArg(y) 13420 v.AddArg(v1) 13421 return true 13422 } 13423 } 13424 func rewriteValueARM_OpDiv8u(v *Value, config *Config) bool { 13425 b := v.Block 13426 _ = b 13427 // match: (Div8u x y) 13428 // cond: 13429 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 13430 for { 13431 x := v.Args[0] 13432 y := v.Args[1] 13433 v.reset(OpDiv32u) 13434 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13435 v0.AddArg(x) 13436 v.AddArg(v0) 13437 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13438 v1.AddArg(y) 13439 v.AddArg(v1) 13440 return true 13441 } 13442 } 13443 func rewriteValueARM_OpEq16(v *Value, config *Config) bool { 13444 b := v.Block 13445 _ = b 13446 // match: (Eq16 x y) 13447 // cond: 13448 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13449 for { 13450 x := v.Args[0] 13451 y := v.Args[1] 13452 v.reset(OpARMEqual) 13453 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13454 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13455 v1.AddArg(x) 13456 v0.AddArg(v1) 13457 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13458 v2.AddArg(y) 13459 v0.AddArg(v2) 13460 v.AddArg(v0) 13461 return true 13462 } 13463 } 13464 func rewriteValueARM_OpEq32(v *Value, config *Config) bool { 13465 b := v.Block 13466 _ = b 13467 // match: (Eq32 x y) 13468 // cond: 13469 // result: (Equal (CMP x y)) 13470 for { 13471 x := v.Args[0] 13472 y := v.Args[1] 13473 v.reset(OpARMEqual) 13474 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13475 v0.AddArg(x) 13476 v0.AddArg(y) 13477 v.AddArg(v0) 13478 return true 13479 } 13480 } 13481 func rewriteValueARM_OpEq32F(v *Value, config *Config) bool { 13482 b := v.Block 13483 _ = b 13484 // match: (Eq32F x y) 13485 // cond: 13486 // result: (Equal (CMPF x y)) 13487 for { 13488 x := v.Args[0] 13489 y := v.Args[1] 13490 v.reset(OpARMEqual) 13491 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 13492 v0.AddArg(x) 13493 v0.AddArg(y) 13494 v.AddArg(v0) 13495 return true 13496 } 13497 } 13498 func rewriteValueARM_OpEq64F(v *Value, config *Config) bool { 13499 b := v.Block 13500 _ = b 13501 // match: (Eq64F x y) 13502 // cond: 13503 // result: (Equal (CMPD x y)) 13504 for { 13505 x := v.Args[0] 13506 y := v.Args[1] 13507 v.reset(OpARMEqual) 13508 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 13509 v0.AddArg(x) 13510 v0.AddArg(y) 13511 v.AddArg(v0) 13512 return true 13513 } 13514 } 13515 func rewriteValueARM_OpEq8(v *Value, config *Config) bool { 13516 b := v.Block 13517 _ = b 13518 // match: (Eq8 x y) 13519 // cond: 13520 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13521 for { 13522 x := v.Args[0] 13523 y := v.Args[1] 13524 v.reset(OpARMEqual) 13525 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13526 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13527 v1.AddArg(x) 13528 v0.AddArg(v1) 13529 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13530 v2.AddArg(y) 13531 v0.AddArg(v2) 13532 v.AddArg(v0) 13533 return true 13534 } 13535 } 13536 func rewriteValueARM_OpEqB(v *Value, config *Config) bool { 13537 b := v.Block 13538 _ = b 13539 // match: (EqB x y) 13540 // cond: 13541 // result: (XORconst [1] (XOR <config.fe.TypeBool()> x y)) 13542 for { 13543 x := v.Args[0] 13544 y := v.Args[1] 13545 v.reset(OpARMXORconst) 13546 v.AuxInt = 1 13547 v0 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeBool()) 13548 v0.AddArg(x) 13549 v0.AddArg(y) 13550 v.AddArg(v0) 13551 return true 13552 } 13553 } 13554 func rewriteValueARM_OpEqPtr(v *Value, config *Config) bool { 13555 b := v.Block 13556 _ = b 13557 // match: (EqPtr x y) 13558 // cond: 13559 // result: (Equal (CMP x y)) 13560 for { 13561 x := v.Args[0] 13562 y := v.Args[1] 13563 v.reset(OpARMEqual) 13564 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13565 v0.AddArg(x) 13566 v0.AddArg(y) 13567 v.AddArg(v0) 13568 return true 13569 } 13570 } 13571 func rewriteValueARM_OpGeq16(v *Value, config *Config) bool { 13572 b := v.Block 13573 _ = b 13574 // match: (Geq16 x y) 13575 // cond: 13576 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 13577 for { 13578 x := v.Args[0] 13579 y := v.Args[1] 13580 v.reset(OpARMGreaterEqual) 13581 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13582 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13583 v1.AddArg(x) 13584 v0.AddArg(v1) 13585 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13586 v2.AddArg(y) 13587 v0.AddArg(v2) 13588 v.AddArg(v0) 13589 return true 13590 } 13591 } 13592 func rewriteValueARM_OpGeq16U(v *Value, config *Config) bool { 13593 b := v.Block 13594 _ = b 13595 // match: (Geq16U x y) 13596 // cond: 13597 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13598 for { 13599 x := v.Args[0] 13600 y := v.Args[1] 13601 v.reset(OpARMGreaterEqualU) 13602 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13603 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13604 v1.AddArg(x) 13605 v0.AddArg(v1) 13606 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13607 v2.AddArg(y) 13608 v0.AddArg(v2) 13609 v.AddArg(v0) 13610 return true 13611 } 13612 } 13613 func rewriteValueARM_OpGeq32(v *Value, config *Config) bool { 13614 b := v.Block 13615 _ = b 13616 // match: (Geq32 x y) 13617 // cond: 13618 // result: (GreaterEqual (CMP x y)) 13619 for { 13620 x := v.Args[0] 13621 y := v.Args[1] 13622 v.reset(OpARMGreaterEqual) 13623 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13624 v0.AddArg(x) 13625 v0.AddArg(y) 13626 v.AddArg(v0) 13627 return true 13628 } 13629 } 13630 func rewriteValueARM_OpGeq32F(v *Value, config *Config) bool { 13631 b := v.Block 13632 _ = b 13633 // match: (Geq32F x y) 13634 // cond: 13635 // result: (GreaterEqual (CMPF x y)) 13636 for { 13637 x := v.Args[0] 13638 y := v.Args[1] 13639 v.reset(OpARMGreaterEqual) 13640 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 13641 v0.AddArg(x) 13642 v0.AddArg(y) 13643 v.AddArg(v0) 13644 return true 13645 } 13646 } 13647 func rewriteValueARM_OpGeq32U(v *Value, config *Config) bool { 13648 b := v.Block 13649 _ = b 13650 // match: (Geq32U x y) 13651 // cond: 13652 // result: (GreaterEqualU (CMP x y)) 13653 for { 13654 x := v.Args[0] 13655 y := v.Args[1] 13656 v.reset(OpARMGreaterEqualU) 13657 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13658 v0.AddArg(x) 13659 v0.AddArg(y) 13660 v.AddArg(v0) 13661 return true 13662 } 13663 } 13664 func rewriteValueARM_OpGeq64F(v *Value, config *Config) bool { 13665 b := v.Block 13666 _ = b 13667 // match: (Geq64F x y) 13668 // cond: 13669 // result: (GreaterEqual (CMPD x y)) 13670 for { 13671 x := v.Args[0] 13672 y := v.Args[1] 13673 v.reset(OpARMGreaterEqual) 13674 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 13675 v0.AddArg(x) 13676 v0.AddArg(y) 13677 v.AddArg(v0) 13678 return true 13679 } 13680 } 13681 func rewriteValueARM_OpGeq8(v *Value, config *Config) bool { 13682 b := v.Block 13683 _ = b 13684 // match: (Geq8 x y) 13685 // cond: 13686 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 13687 for { 13688 x := v.Args[0] 13689 y := v.Args[1] 13690 v.reset(OpARMGreaterEqual) 13691 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13692 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13693 v1.AddArg(x) 13694 v0.AddArg(v1) 13695 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13696 v2.AddArg(y) 13697 v0.AddArg(v2) 13698 v.AddArg(v0) 13699 return true 13700 } 13701 } 13702 func rewriteValueARM_OpGeq8U(v *Value, config *Config) bool { 13703 b := v.Block 13704 _ = b 13705 // match: (Geq8U x y) 13706 // cond: 13707 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13708 for { 13709 x := v.Args[0] 13710 y := v.Args[1] 13711 v.reset(OpARMGreaterEqualU) 13712 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13713 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13714 v1.AddArg(x) 13715 v0.AddArg(v1) 13716 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13717 v2.AddArg(y) 13718 v0.AddArg(v2) 13719 v.AddArg(v0) 13720 return true 13721 } 13722 } 13723 func rewriteValueARM_OpGetClosurePtr(v *Value, config *Config) bool { 13724 b := v.Block 13725 _ = b 13726 // match: (GetClosurePtr) 13727 // cond: 13728 // result: (LoweredGetClosurePtr) 13729 for { 13730 v.reset(OpARMLoweredGetClosurePtr) 13731 return true 13732 } 13733 } 13734 func rewriteValueARM_OpGoCall(v *Value, config *Config) bool { 13735 b := v.Block 13736 _ = b 13737 // match: (GoCall [argwid] mem) 13738 // cond: 13739 // result: (CALLgo [argwid] mem) 13740 for { 13741 argwid := v.AuxInt 13742 mem := v.Args[0] 13743 v.reset(OpARMCALLgo) 13744 v.AuxInt = argwid 13745 v.AddArg(mem) 13746 return true 13747 } 13748 } 13749 func rewriteValueARM_OpGreater16(v *Value, config *Config) bool { 13750 b := v.Block 13751 _ = b 13752 // match: (Greater16 x y) 13753 // cond: 13754 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 13755 for { 13756 x := v.Args[0] 13757 y := v.Args[1] 13758 v.reset(OpARMGreaterThan) 13759 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13760 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13761 v1.AddArg(x) 13762 v0.AddArg(v1) 13763 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13764 v2.AddArg(y) 13765 v0.AddArg(v2) 13766 v.AddArg(v0) 13767 return true 13768 } 13769 } 13770 func rewriteValueARM_OpGreater16U(v *Value, config *Config) bool { 13771 b := v.Block 13772 _ = b 13773 // match: (Greater16U x y) 13774 // cond: 13775 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13776 for { 13777 x := v.Args[0] 13778 y := v.Args[1] 13779 v.reset(OpARMGreaterThanU) 13780 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13781 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13782 v1.AddArg(x) 13783 v0.AddArg(v1) 13784 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13785 v2.AddArg(y) 13786 v0.AddArg(v2) 13787 v.AddArg(v0) 13788 return true 13789 } 13790 } 13791 func rewriteValueARM_OpGreater32(v *Value, config *Config) bool { 13792 b := v.Block 13793 _ = b 13794 // match: (Greater32 x y) 13795 // cond: 13796 // result: (GreaterThan (CMP x y)) 13797 for { 13798 x := v.Args[0] 13799 y := v.Args[1] 13800 v.reset(OpARMGreaterThan) 13801 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13802 v0.AddArg(x) 13803 v0.AddArg(y) 13804 v.AddArg(v0) 13805 return true 13806 } 13807 } 13808 func rewriteValueARM_OpGreater32F(v *Value, config *Config) bool { 13809 b := v.Block 13810 _ = b 13811 // match: (Greater32F x y) 13812 // cond: 13813 // result: (GreaterThan (CMPF x y)) 13814 for { 13815 x := v.Args[0] 13816 y := v.Args[1] 13817 v.reset(OpARMGreaterThan) 13818 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 13819 v0.AddArg(x) 13820 v0.AddArg(y) 13821 v.AddArg(v0) 13822 return true 13823 } 13824 } 13825 func rewriteValueARM_OpGreater32U(v *Value, config *Config) bool { 13826 b := v.Block 13827 _ = b 13828 // match: (Greater32U x y) 13829 // cond: 13830 // result: (GreaterThanU (CMP x y)) 13831 for { 13832 x := v.Args[0] 13833 y := v.Args[1] 13834 v.reset(OpARMGreaterThanU) 13835 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13836 v0.AddArg(x) 13837 v0.AddArg(y) 13838 v.AddArg(v0) 13839 return true 13840 } 13841 } 13842 func rewriteValueARM_OpGreater64F(v *Value, config *Config) bool { 13843 b := v.Block 13844 _ = b 13845 // match: (Greater64F x y) 13846 // cond: 13847 // result: (GreaterThan (CMPD x y)) 13848 for { 13849 x := v.Args[0] 13850 y := v.Args[1] 13851 v.reset(OpARMGreaterThan) 13852 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 13853 v0.AddArg(x) 13854 v0.AddArg(y) 13855 v.AddArg(v0) 13856 return true 13857 } 13858 } 13859 func rewriteValueARM_OpGreater8(v *Value, config *Config) bool { 13860 b := v.Block 13861 _ = b 13862 // match: (Greater8 x y) 13863 // cond: 13864 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 13865 for { 13866 x := v.Args[0] 13867 y := v.Args[1] 13868 v.reset(OpARMGreaterThan) 13869 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13870 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13871 v1.AddArg(x) 13872 v0.AddArg(v1) 13873 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13874 v2.AddArg(y) 13875 v0.AddArg(v2) 13876 v.AddArg(v0) 13877 return true 13878 } 13879 } 13880 func rewriteValueARM_OpGreater8U(v *Value, config *Config) bool { 13881 b := v.Block 13882 _ = b 13883 // match: (Greater8U x y) 13884 // cond: 13885 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13886 for { 13887 x := v.Args[0] 13888 y := v.Args[1] 13889 v.reset(OpARMGreaterThanU) 13890 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13891 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13892 v1.AddArg(x) 13893 v0.AddArg(v1) 13894 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13895 v2.AddArg(y) 13896 v0.AddArg(v2) 13897 v.AddArg(v0) 13898 return true 13899 } 13900 } 13901 func rewriteValueARM_OpHmul16(v *Value, config *Config) bool { 13902 b := v.Block 13903 _ = b 13904 // match: (Hmul16 x y) 13905 // cond: 13906 // result: (SRAconst (MUL <config.fe.TypeInt32()> (SignExt16to32 x) (SignExt16to32 y)) [16]) 13907 for { 13908 x := v.Args[0] 13909 y := v.Args[1] 13910 v.reset(OpARMSRAconst) 13911 v.AuxInt = 16 13912 v0 := b.NewValue0(v.Line, OpARMMUL, config.fe.TypeInt32()) 13913 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13914 v1.AddArg(x) 13915 v0.AddArg(v1) 13916 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13917 v2.AddArg(y) 13918 v0.AddArg(v2) 13919 v.AddArg(v0) 13920 return true 13921 } 13922 } 13923 func rewriteValueARM_OpHmul16u(v *Value, config *Config) bool { 13924 b := v.Block 13925 _ = b 13926 // match: (Hmul16u x y) 13927 // cond: 13928 // result: (SRLconst (MUL <config.fe.TypeUInt32()> (ZeroExt16to32 x) (ZeroExt16to32 y)) [16]) 13929 for { 13930 x := v.Args[0] 13931 y := v.Args[1] 13932 v.reset(OpARMSRLconst) 13933 v.AuxInt = 16 13934 v0 := b.NewValue0(v.Line, OpARMMUL, config.fe.TypeUInt32()) 13935 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13936 v1.AddArg(x) 13937 v0.AddArg(v1) 13938 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13939 v2.AddArg(y) 13940 v0.AddArg(v2) 13941 v.AddArg(v0) 13942 return true 13943 } 13944 } 13945 func rewriteValueARM_OpHmul32(v *Value, config *Config) bool { 13946 b := v.Block 13947 _ = b 13948 // match: (Hmul32 x y) 13949 // cond: 13950 // result: (HMUL x y) 13951 for { 13952 x := v.Args[0] 13953 y := v.Args[1] 13954 v.reset(OpARMHMUL) 13955 v.AddArg(x) 13956 v.AddArg(y) 13957 return true 13958 } 13959 } 13960 func rewriteValueARM_OpHmul32u(v *Value, config *Config) bool { 13961 b := v.Block 13962 _ = b 13963 // match: (Hmul32u x y) 13964 // cond: 13965 // result: (HMULU x y) 13966 for { 13967 x := v.Args[0] 13968 y := v.Args[1] 13969 v.reset(OpARMHMULU) 13970 v.AddArg(x) 13971 v.AddArg(y) 13972 return true 13973 } 13974 } 13975 func rewriteValueARM_OpHmul8(v *Value, config *Config) bool { 13976 b := v.Block 13977 _ = b 13978 // match: (Hmul8 x y) 13979 // cond: 13980 // result: (SRAconst (MUL <config.fe.TypeInt16()> (SignExt8to32 x) (SignExt8to32 y)) [8]) 13981 for { 13982 x := v.Args[0] 13983 y := v.Args[1] 13984 v.reset(OpARMSRAconst) 13985 v.AuxInt = 8 13986 v0 := b.NewValue0(v.Line, OpARMMUL, config.fe.TypeInt16()) 13987 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13988 v1.AddArg(x) 13989 v0.AddArg(v1) 13990 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13991 v2.AddArg(y) 13992 v0.AddArg(v2) 13993 v.AddArg(v0) 13994 return true 13995 } 13996 } 13997 func rewriteValueARM_OpHmul8u(v *Value, config *Config) bool { 13998 b := v.Block 13999 _ = b 14000 // match: (Hmul8u x y) 14001 // cond: 14002 // result: (SRLconst (MUL <config.fe.TypeUInt16()> (ZeroExt8to32 x) (ZeroExt8to32 y)) [8]) 14003 for { 14004 x := v.Args[0] 14005 y := v.Args[1] 14006 v.reset(OpARMSRLconst) 14007 v.AuxInt = 8 14008 v0 := b.NewValue0(v.Line, OpARMMUL, config.fe.TypeUInt16()) 14009 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14010 v1.AddArg(x) 14011 v0.AddArg(v1) 14012 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14013 v2.AddArg(y) 14014 v0.AddArg(v2) 14015 v.AddArg(v0) 14016 return true 14017 } 14018 } 14019 func rewriteValueARM_OpInterCall(v *Value, config *Config) bool { 14020 b := v.Block 14021 _ = b 14022 // match: (InterCall [argwid] entry mem) 14023 // cond: 14024 // result: (CALLinter [argwid] entry mem) 14025 for { 14026 argwid := v.AuxInt 14027 entry := v.Args[0] 14028 mem := v.Args[1] 14029 v.reset(OpARMCALLinter) 14030 v.AuxInt = argwid 14031 v.AddArg(entry) 14032 v.AddArg(mem) 14033 return true 14034 } 14035 } 14036 func rewriteValueARM_OpIsInBounds(v *Value, config *Config) bool { 14037 b := v.Block 14038 _ = b 14039 // match: (IsInBounds idx len) 14040 // cond: 14041 // result: (LessThanU (CMP idx len)) 14042 for { 14043 idx := v.Args[0] 14044 len := v.Args[1] 14045 v.reset(OpARMLessThanU) 14046 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14047 v0.AddArg(idx) 14048 v0.AddArg(len) 14049 v.AddArg(v0) 14050 return true 14051 } 14052 } 14053 func rewriteValueARM_OpIsNonNil(v *Value, config *Config) bool { 14054 b := v.Block 14055 _ = b 14056 // match: (IsNonNil ptr) 14057 // cond: 14058 // result: (NotEqual (CMPconst [0] ptr)) 14059 for { 14060 ptr := v.Args[0] 14061 v.reset(OpARMNotEqual) 14062 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 14063 v0.AuxInt = 0 14064 v0.AddArg(ptr) 14065 v.AddArg(v0) 14066 return true 14067 } 14068 } 14069 func rewriteValueARM_OpIsSliceInBounds(v *Value, config *Config) bool { 14070 b := v.Block 14071 _ = b 14072 // match: (IsSliceInBounds idx len) 14073 // cond: 14074 // result: (LessEqualU (CMP idx len)) 14075 for { 14076 idx := v.Args[0] 14077 len := v.Args[1] 14078 v.reset(OpARMLessEqualU) 14079 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14080 v0.AddArg(idx) 14081 v0.AddArg(len) 14082 v.AddArg(v0) 14083 return true 14084 } 14085 } 14086 func rewriteValueARM_OpLeq16(v *Value, config *Config) bool { 14087 b := v.Block 14088 _ = b 14089 // match: (Leq16 x y) 14090 // cond: 14091 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 14092 for { 14093 x := v.Args[0] 14094 y := v.Args[1] 14095 v.reset(OpARMLessEqual) 14096 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14097 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14098 v1.AddArg(x) 14099 v0.AddArg(v1) 14100 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14101 v2.AddArg(y) 14102 v0.AddArg(v2) 14103 v.AddArg(v0) 14104 return true 14105 } 14106 } 14107 func rewriteValueARM_OpLeq16U(v *Value, config *Config) bool { 14108 b := v.Block 14109 _ = b 14110 // match: (Leq16U x y) 14111 // cond: 14112 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14113 for { 14114 x := v.Args[0] 14115 y := v.Args[1] 14116 v.reset(OpARMLessEqualU) 14117 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14118 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14119 v1.AddArg(x) 14120 v0.AddArg(v1) 14121 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14122 v2.AddArg(y) 14123 v0.AddArg(v2) 14124 v.AddArg(v0) 14125 return true 14126 } 14127 } 14128 func rewriteValueARM_OpLeq32(v *Value, config *Config) bool { 14129 b := v.Block 14130 _ = b 14131 // match: (Leq32 x y) 14132 // cond: 14133 // result: (LessEqual (CMP x y)) 14134 for { 14135 x := v.Args[0] 14136 y := v.Args[1] 14137 v.reset(OpARMLessEqual) 14138 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14139 v0.AddArg(x) 14140 v0.AddArg(y) 14141 v.AddArg(v0) 14142 return true 14143 } 14144 } 14145 func rewriteValueARM_OpLeq32F(v *Value, config *Config) bool { 14146 b := v.Block 14147 _ = b 14148 // match: (Leq32F x y) 14149 // cond: 14150 // result: (GreaterEqual (CMPF y x)) 14151 for { 14152 x := v.Args[0] 14153 y := v.Args[1] 14154 v.reset(OpARMGreaterEqual) 14155 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 14156 v0.AddArg(y) 14157 v0.AddArg(x) 14158 v.AddArg(v0) 14159 return true 14160 } 14161 } 14162 func rewriteValueARM_OpLeq32U(v *Value, config *Config) bool { 14163 b := v.Block 14164 _ = b 14165 // match: (Leq32U x y) 14166 // cond: 14167 // result: (LessEqualU (CMP x y)) 14168 for { 14169 x := v.Args[0] 14170 y := v.Args[1] 14171 v.reset(OpARMLessEqualU) 14172 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14173 v0.AddArg(x) 14174 v0.AddArg(y) 14175 v.AddArg(v0) 14176 return true 14177 } 14178 } 14179 func rewriteValueARM_OpLeq64F(v *Value, config *Config) bool { 14180 b := v.Block 14181 _ = b 14182 // match: (Leq64F x y) 14183 // cond: 14184 // result: (GreaterEqual (CMPD y x)) 14185 for { 14186 x := v.Args[0] 14187 y := v.Args[1] 14188 v.reset(OpARMGreaterEqual) 14189 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 14190 v0.AddArg(y) 14191 v0.AddArg(x) 14192 v.AddArg(v0) 14193 return true 14194 } 14195 } 14196 func rewriteValueARM_OpLeq8(v *Value, config *Config) bool { 14197 b := v.Block 14198 _ = b 14199 // match: (Leq8 x y) 14200 // cond: 14201 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 14202 for { 14203 x := v.Args[0] 14204 y := v.Args[1] 14205 v.reset(OpARMLessEqual) 14206 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14207 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 14208 v1.AddArg(x) 14209 v0.AddArg(v1) 14210 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 14211 v2.AddArg(y) 14212 v0.AddArg(v2) 14213 v.AddArg(v0) 14214 return true 14215 } 14216 } 14217 func rewriteValueARM_OpLeq8U(v *Value, config *Config) bool { 14218 b := v.Block 14219 _ = b 14220 // match: (Leq8U x y) 14221 // cond: 14222 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14223 for { 14224 x := v.Args[0] 14225 y := v.Args[1] 14226 v.reset(OpARMLessEqualU) 14227 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14228 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14229 v1.AddArg(x) 14230 v0.AddArg(v1) 14231 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14232 v2.AddArg(y) 14233 v0.AddArg(v2) 14234 v.AddArg(v0) 14235 return true 14236 } 14237 } 14238 func rewriteValueARM_OpLess16(v *Value, config *Config) bool { 14239 b := v.Block 14240 _ = b 14241 // match: (Less16 x y) 14242 // cond: 14243 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 14244 for { 14245 x := v.Args[0] 14246 y := v.Args[1] 14247 v.reset(OpARMLessThan) 14248 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14249 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14250 v1.AddArg(x) 14251 v0.AddArg(v1) 14252 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14253 v2.AddArg(y) 14254 v0.AddArg(v2) 14255 v.AddArg(v0) 14256 return true 14257 } 14258 } 14259 func rewriteValueARM_OpLess16U(v *Value, config *Config) bool { 14260 b := v.Block 14261 _ = b 14262 // match: (Less16U x y) 14263 // cond: 14264 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14265 for { 14266 x := v.Args[0] 14267 y := v.Args[1] 14268 v.reset(OpARMLessThanU) 14269 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14270 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14271 v1.AddArg(x) 14272 v0.AddArg(v1) 14273 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14274 v2.AddArg(y) 14275 v0.AddArg(v2) 14276 v.AddArg(v0) 14277 return true 14278 } 14279 } 14280 func rewriteValueARM_OpLess32(v *Value, config *Config) bool { 14281 b := v.Block 14282 _ = b 14283 // match: (Less32 x y) 14284 // cond: 14285 // result: (LessThan (CMP x y)) 14286 for { 14287 x := v.Args[0] 14288 y := v.Args[1] 14289 v.reset(OpARMLessThan) 14290 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14291 v0.AddArg(x) 14292 v0.AddArg(y) 14293 v.AddArg(v0) 14294 return true 14295 } 14296 } 14297 func rewriteValueARM_OpLess32F(v *Value, config *Config) bool { 14298 b := v.Block 14299 _ = b 14300 // match: (Less32F x y) 14301 // cond: 14302 // result: (GreaterThan (CMPF y x)) 14303 for { 14304 x := v.Args[0] 14305 y := v.Args[1] 14306 v.reset(OpARMGreaterThan) 14307 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 14308 v0.AddArg(y) 14309 v0.AddArg(x) 14310 v.AddArg(v0) 14311 return true 14312 } 14313 } 14314 func rewriteValueARM_OpLess32U(v *Value, config *Config) bool { 14315 b := v.Block 14316 _ = b 14317 // match: (Less32U x y) 14318 // cond: 14319 // result: (LessThanU (CMP x y)) 14320 for { 14321 x := v.Args[0] 14322 y := v.Args[1] 14323 v.reset(OpARMLessThanU) 14324 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14325 v0.AddArg(x) 14326 v0.AddArg(y) 14327 v.AddArg(v0) 14328 return true 14329 } 14330 } 14331 func rewriteValueARM_OpLess64F(v *Value, config *Config) bool { 14332 b := v.Block 14333 _ = b 14334 // match: (Less64F x y) 14335 // cond: 14336 // result: (GreaterThan (CMPD y x)) 14337 for { 14338 x := v.Args[0] 14339 y := v.Args[1] 14340 v.reset(OpARMGreaterThan) 14341 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 14342 v0.AddArg(y) 14343 v0.AddArg(x) 14344 v.AddArg(v0) 14345 return true 14346 } 14347 } 14348 func rewriteValueARM_OpLess8(v *Value, config *Config) bool { 14349 b := v.Block 14350 _ = b 14351 // match: (Less8 x y) 14352 // cond: 14353 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 14354 for { 14355 x := v.Args[0] 14356 y := v.Args[1] 14357 v.reset(OpARMLessThan) 14358 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14359 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 14360 v1.AddArg(x) 14361 v0.AddArg(v1) 14362 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 14363 v2.AddArg(y) 14364 v0.AddArg(v2) 14365 v.AddArg(v0) 14366 return true 14367 } 14368 } 14369 func rewriteValueARM_OpLess8U(v *Value, config *Config) bool { 14370 b := v.Block 14371 _ = b 14372 // match: (Less8U x y) 14373 // cond: 14374 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14375 for { 14376 x := v.Args[0] 14377 y := v.Args[1] 14378 v.reset(OpARMLessThanU) 14379 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14380 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14381 v1.AddArg(x) 14382 v0.AddArg(v1) 14383 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14384 v2.AddArg(y) 14385 v0.AddArg(v2) 14386 v.AddArg(v0) 14387 return true 14388 } 14389 } 14390 func rewriteValueARM_OpLoad(v *Value, config *Config) bool { 14391 b := v.Block 14392 _ = b 14393 // match: (Load <t> ptr mem) 14394 // cond: t.IsBoolean() 14395 // result: (MOVBUload ptr mem) 14396 for { 14397 t := v.Type 14398 ptr := v.Args[0] 14399 mem := v.Args[1] 14400 if !(t.IsBoolean()) { 14401 break 14402 } 14403 v.reset(OpARMMOVBUload) 14404 v.AddArg(ptr) 14405 v.AddArg(mem) 14406 return true 14407 } 14408 // match: (Load <t> ptr mem) 14409 // cond: (is8BitInt(t) && isSigned(t)) 14410 // result: (MOVBload ptr mem) 14411 for { 14412 t := v.Type 14413 ptr := v.Args[0] 14414 mem := v.Args[1] 14415 if !(is8BitInt(t) && isSigned(t)) { 14416 break 14417 } 14418 v.reset(OpARMMOVBload) 14419 v.AddArg(ptr) 14420 v.AddArg(mem) 14421 return true 14422 } 14423 // match: (Load <t> ptr mem) 14424 // cond: (is8BitInt(t) && !isSigned(t)) 14425 // result: (MOVBUload ptr mem) 14426 for { 14427 t := v.Type 14428 ptr := v.Args[0] 14429 mem := v.Args[1] 14430 if !(is8BitInt(t) && !isSigned(t)) { 14431 break 14432 } 14433 v.reset(OpARMMOVBUload) 14434 v.AddArg(ptr) 14435 v.AddArg(mem) 14436 return true 14437 } 14438 // match: (Load <t> ptr mem) 14439 // cond: (is16BitInt(t) && isSigned(t)) 14440 // result: (MOVHload ptr mem) 14441 for { 14442 t := v.Type 14443 ptr := v.Args[0] 14444 mem := v.Args[1] 14445 if !(is16BitInt(t) && isSigned(t)) { 14446 break 14447 } 14448 v.reset(OpARMMOVHload) 14449 v.AddArg(ptr) 14450 v.AddArg(mem) 14451 return true 14452 } 14453 // match: (Load <t> ptr mem) 14454 // cond: (is16BitInt(t) && !isSigned(t)) 14455 // result: (MOVHUload ptr mem) 14456 for { 14457 t := v.Type 14458 ptr := v.Args[0] 14459 mem := v.Args[1] 14460 if !(is16BitInt(t) && !isSigned(t)) { 14461 break 14462 } 14463 v.reset(OpARMMOVHUload) 14464 v.AddArg(ptr) 14465 v.AddArg(mem) 14466 return true 14467 } 14468 // match: (Load <t> ptr mem) 14469 // cond: (is32BitInt(t) || isPtr(t)) 14470 // result: (MOVWload ptr mem) 14471 for { 14472 t := v.Type 14473 ptr := v.Args[0] 14474 mem := v.Args[1] 14475 if !(is32BitInt(t) || isPtr(t)) { 14476 break 14477 } 14478 v.reset(OpARMMOVWload) 14479 v.AddArg(ptr) 14480 v.AddArg(mem) 14481 return true 14482 } 14483 // match: (Load <t> ptr mem) 14484 // cond: is32BitFloat(t) 14485 // result: (MOVFload ptr mem) 14486 for { 14487 t := v.Type 14488 ptr := v.Args[0] 14489 mem := v.Args[1] 14490 if !(is32BitFloat(t)) { 14491 break 14492 } 14493 v.reset(OpARMMOVFload) 14494 v.AddArg(ptr) 14495 v.AddArg(mem) 14496 return true 14497 } 14498 // match: (Load <t> ptr mem) 14499 // cond: is64BitFloat(t) 14500 // result: (MOVDload ptr mem) 14501 for { 14502 t := v.Type 14503 ptr := v.Args[0] 14504 mem := v.Args[1] 14505 if !(is64BitFloat(t)) { 14506 break 14507 } 14508 v.reset(OpARMMOVDload) 14509 v.AddArg(ptr) 14510 v.AddArg(mem) 14511 return true 14512 } 14513 return false 14514 } 14515 func rewriteValueARM_OpLrot16(v *Value, config *Config) bool { 14516 b := v.Block 14517 _ = b 14518 // match: (Lrot16 <t> x [c]) 14519 // cond: 14520 // result: (OR (SLLconst <t> x [c&15]) (SRLconst <t> x [16-c&15])) 14521 for { 14522 t := v.Type 14523 c := v.AuxInt 14524 x := v.Args[0] 14525 v.reset(OpARMOR) 14526 v0 := b.NewValue0(v.Line, OpARMSLLconst, t) 14527 v0.AuxInt = c & 15 14528 v0.AddArg(x) 14529 v.AddArg(v0) 14530 v1 := b.NewValue0(v.Line, OpARMSRLconst, t) 14531 v1.AuxInt = 16 - c&15 14532 v1.AddArg(x) 14533 v.AddArg(v1) 14534 return true 14535 } 14536 } 14537 func rewriteValueARM_OpLrot32(v *Value, config *Config) bool { 14538 b := v.Block 14539 _ = b 14540 // match: (Lrot32 x [c]) 14541 // cond: 14542 // result: (SRRconst x [32-c&31]) 14543 for { 14544 c := v.AuxInt 14545 x := v.Args[0] 14546 v.reset(OpARMSRRconst) 14547 v.AuxInt = 32 - c&31 14548 v.AddArg(x) 14549 return true 14550 } 14551 } 14552 func rewriteValueARM_OpLrot8(v *Value, config *Config) bool { 14553 b := v.Block 14554 _ = b 14555 // match: (Lrot8 <t> x [c]) 14556 // cond: 14557 // result: (OR (SLLconst <t> x [c&7]) (SRLconst <t> x [8-c&7])) 14558 for { 14559 t := v.Type 14560 c := v.AuxInt 14561 x := v.Args[0] 14562 v.reset(OpARMOR) 14563 v0 := b.NewValue0(v.Line, OpARMSLLconst, t) 14564 v0.AuxInt = c & 7 14565 v0.AddArg(x) 14566 v.AddArg(v0) 14567 v1 := b.NewValue0(v.Line, OpARMSRLconst, t) 14568 v1.AuxInt = 8 - c&7 14569 v1.AddArg(x) 14570 v.AddArg(v1) 14571 return true 14572 } 14573 } 14574 func rewriteValueARM_OpLsh16x16(v *Value, config *Config) bool { 14575 b := v.Block 14576 _ = b 14577 // match: (Lsh16x16 x y) 14578 // cond: 14579 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14580 for { 14581 x := v.Args[0] 14582 y := v.Args[1] 14583 v.reset(OpARMCMOVWHSconst) 14584 v.AuxInt = 0 14585 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 14586 v0.AddArg(x) 14587 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14588 v1.AddArg(y) 14589 v0.AddArg(v1) 14590 v.AddArg(v0) 14591 v2 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 14592 v2.AuxInt = 256 14593 v3 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14594 v3.AddArg(y) 14595 v2.AddArg(v3) 14596 v.AddArg(v2) 14597 return true 14598 } 14599 } 14600 func rewriteValueARM_OpLsh16x32(v *Value, config *Config) bool { 14601 b := v.Block 14602 _ = b 14603 // match: (Lsh16x32 x y) 14604 // cond: 14605 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14606 for { 14607 x := v.Args[0] 14608 y := v.Args[1] 14609 v.reset(OpARMCMOVWHSconst) 14610 v.AuxInt = 0 14611 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 14612 v0.AddArg(x) 14613 v0.AddArg(y) 14614 v.AddArg(v0) 14615 v1 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 14616 v1.AuxInt = 256 14617 v1.AddArg(y) 14618 v.AddArg(v1) 14619 return true 14620 } 14621 } 14622 func rewriteValueARM_OpLsh16x64(v *Value, config *Config) bool { 14623 b := v.Block 14624 _ = b 14625 // match: (Lsh16x64 x (Const64 [c])) 14626 // cond: uint64(c) < 16 14627 // result: (SLLconst x [c]) 14628 for { 14629 x := v.Args[0] 14630 v_1 := v.Args[1] 14631 if v_1.Op != OpConst64 { 14632 break 14633 } 14634 c := v_1.AuxInt 14635 if !(uint64(c) < 16) { 14636 break 14637 } 14638 v.reset(OpARMSLLconst) 14639 v.AuxInt = c 14640 v.AddArg(x) 14641 return true 14642 } 14643 // match: (Lsh16x64 _ (Const64 [c])) 14644 // cond: uint64(c) >= 16 14645 // result: (Const16 [0]) 14646 for { 14647 v_1 := v.Args[1] 14648 if v_1.Op != OpConst64 { 14649 break 14650 } 14651 c := v_1.AuxInt 14652 if !(uint64(c) >= 16) { 14653 break 14654 } 14655 v.reset(OpConst16) 14656 v.AuxInt = 0 14657 return true 14658 } 14659 return false 14660 } 14661 func rewriteValueARM_OpLsh16x8(v *Value, config *Config) bool { 14662 b := v.Block 14663 _ = b 14664 // match: (Lsh16x8 x y) 14665 // cond: 14666 // result: (SLL x (ZeroExt8to32 y)) 14667 for { 14668 x := v.Args[0] 14669 y := v.Args[1] 14670 v.reset(OpARMSLL) 14671 v.AddArg(x) 14672 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14673 v0.AddArg(y) 14674 v.AddArg(v0) 14675 return true 14676 } 14677 } 14678 func rewriteValueARM_OpLsh32x16(v *Value, config *Config) bool { 14679 b := v.Block 14680 _ = b 14681 // match: (Lsh32x16 x y) 14682 // cond: 14683 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14684 for { 14685 x := v.Args[0] 14686 y := v.Args[1] 14687 v.reset(OpARMCMOVWHSconst) 14688 v.AuxInt = 0 14689 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 14690 v0.AddArg(x) 14691 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14692 v1.AddArg(y) 14693 v0.AddArg(v1) 14694 v.AddArg(v0) 14695 v2 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 14696 v2.AuxInt = 256 14697 v3 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14698 v3.AddArg(y) 14699 v2.AddArg(v3) 14700 v.AddArg(v2) 14701 return true 14702 } 14703 } 14704 func rewriteValueARM_OpLsh32x32(v *Value, config *Config) bool { 14705 b := v.Block 14706 _ = b 14707 // match: (Lsh32x32 x y) 14708 // cond: 14709 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14710 for { 14711 x := v.Args[0] 14712 y := v.Args[1] 14713 v.reset(OpARMCMOVWHSconst) 14714 v.AuxInt = 0 14715 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 14716 v0.AddArg(x) 14717 v0.AddArg(y) 14718 v.AddArg(v0) 14719 v1 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 14720 v1.AuxInt = 256 14721 v1.AddArg(y) 14722 v.AddArg(v1) 14723 return true 14724 } 14725 } 14726 func rewriteValueARM_OpLsh32x64(v *Value, config *Config) bool { 14727 b := v.Block 14728 _ = b 14729 // match: (Lsh32x64 x (Const64 [c])) 14730 // cond: uint64(c) < 32 14731 // result: (SLLconst x [c]) 14732 for { 14733 x := v.Args[0] 14734 v_1 := v.Args[1] 14735 if v_1.Op != OpConst64 { 14736 break 14737 } 14738 c := v_1.AuxInt 14739 if !(uint64(c) < 32) { 14740 break 14741 } 14742 v.reset(OpARMSLLconst) 14743 v.AuxInt = c 14744 v.AddArg(x) 14745 return true 14746 } 14747 // match: (Lsh32x64 _ (Const64 [c])) 14748 // cond: uint64(c) >= 32 14749 // result: (Const32 [0]) 14750 for { 14751 v_1 := v.Args[1] 14752 if v_1.Op != OpConst64 { 14753 break 14754 } 14755 c := v_1.AuxInt 14756 if !(uint64(c) >= 32) { 14757 break 14758 } 14759 v.reset(OpConst32) 14760 v.AuxInt = 0 14761 return true 14762 } 14763 return false 14764 } 14765 func rewriteValueARM_OpLsh32x8(v *Value, config *Config) bool { 14766 b := v.Block 14767 _ = b 14768 // match: (Lsh32x8 x y) 14769 // cond: 14770 // result: (SLL x (ZeroExt8to32 y)) 14771 for { 14772 x := v.Args[0] 14773 y := v.Args[1] 14774 v.reset(OpARMSLL) 14775 v.AddArg(x) 14776 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14777 v0.AddArg(y) 14778 v.AddArg(v0) 14779 return true 14780 } 14781 } 14782 func rewriteValueARM_OpLsh8x16(v *Value, config *Config) bool { 14783 b := v.Block 14784 _ = b 14785 // match: (Lsh8x16 x y) 14786 // cond: 14787 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14788 for { 14789 x := v.Args[0] 14790 y := v.Args[1] 14791 v.reset(OpARMCMOVWHSconst) 14792 v.AuxInt = 0 14793 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 14794 v0.AddArg(x) 14795 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14796 v1.AddArg(y) 14797 v0.AddArg(v1) 14798 v.AddArg(v0) 14799 v2 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 14800 v2.AuxInt = 256 14801 v3 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14802 v3.AddArg(y) 14803 v2.AddArg(v3) 14804 v.AddArg(v2) 14805 return true 14806 } 14807 } 14808 func rewriteValueARM_OpLsh8x32(v *Value, config *Config) bool { 14809 b := v.Block 14810 _ = b 14811 // match: (Lsh8x32 x y) 14812 // cond: 14813 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14814 for { 14815 x := v.Args[0] 14816 y := v.Args[1] 14817 v.reset(OpARMCMOVWHSconst) 14818 v.AuxInt = 0 14819 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 14820 v0.AddArg(x) 14821 v0.AddArg(y) 14822 v.AddArg(v0) 14823 v1 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 14824 v1.AuxInt = 256 14825 v1.AddArg(y) 14826 v.AddArg(v1) 14827 return true 14828 } 14829 } 14830 func rewriteValueARM_OpLsh8x64(v *Value, config *Config) bool { 14831 b := v.Block 14832 _ = b 14833 // match: (Lsh8x64 x (Const64 [c])) 14834 // cond: uint64(c) < 8 14835 // result: (SLLconst x [c]) 14836 for { 14837 x := v.Args[0] 14838 v_1 := v.Args[1] 14839 if v_1.Op != OpConst64 { 14840 break 14841 } 14842 c := v_1.AuxInt 14843 if !(uint64(c) < 8) { 14844 break 14845 } 14846 v.reset(OpARMSLLconst) 14847 v.AuxInt = c 14848 v.AddArg(x) 14849 return true 14850 } 14851 // match: (Lsh8x64 _ (Const64 [c])) 14852 // cond: uint64(c) >= 8 14853 // result: (Const8 [0]) 14854 for { 14855 v_1 := v.Args[1] 14856 if v_1.Op != OpConst64 { 14857 break 14858 } 14859 c := v_1.AuxInt 14860 if !(uint64(c) >= 8) { 14861 break 14862 } 14863 v.reset(OpConst8) 14864 v.AuxInt = 0 14865 return true 14866 } 14867 return false 14868 } 14869 func rewriteValueARM_OpLsh8x8(v *Value, config *Config) bool { 14870 b := v.Block 14871 _ = b 14872 // match: (Lsh8x8 x y) 14873 // cond: 14874 // result: (SLL x (ZeroExt8to32 y)) 14875 for { 14876 x := v.Args[0] 14877 y := v.Args[1] 14878 v.reset(OpARMSLL) 14879 v.AddArg(x) 14880 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14881 v0.AddArg(y) 14882 v.AddArg(v0) 14883 return true 14884 } 14885 } 14886 func rewriteValueARM_OpMod16(v *Value, config *Config) bool { 14887 b := v.Block 14888 _ = b 14889 // match: (Mod16 x y) 14890 // cond: 14891 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 14892 for { 14893 x := v.Args[0] 14894 y := v.Args[1] 14895 v.reset(OpMod32) 14896 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14897 v0.AddArg(x) 14898 v.AddArg(v0) 14899 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14900 v1.AddArg(y) 14901 v.AddArg(v1) 14902 return true 14903 } 14904 } 14905 func rewriteValueARM_OpMod16u(v *Value, config *Config) bool { 14906 b := v.Block 14907 _ = b 14908 // match: (Mod16u x y) 14909 // cond: 14910 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 14911 for { 14912 x := v.Args[0] 14913 y := v.Args[1] 14914 v.reset(OpMod32u) 14915 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14916 v0.AddArg(x) 14917 v.AddArg(v0) 14918 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14919 v1.AddArg(y) 14920 v.AddArg(v1) 14921 return true 14922 } 14923 } 14924 func rewriteValueARM_OpMod32(v *Value, config *Config) bool { 14925 b := v.Block 14926 _ = b 14927 // match: (Mod32 x y) 14928 // cond: 14929 // 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)) 14930 for { 14931 x := v.Args[0] 14932 y := v.Args[1] 14933 v.reset(OpARMSUB) 14934 v0 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 14935 v1 := b.NewValue0(v.Line, OpSelect1, config.fe.TypeUInt32()) 14936 v2 := b.NewValue0(v.Line, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 14937 v3 := b.NewValue0(v.Line, OpARMSUB, config.fe.TypeUInt32()) 14938 v4 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 14939 v4.AddArg(x) 14940 v5 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 14941 v5.AddArg(x) 14942 v4.AddArg(v5) 14943 v3.AddArg(v4) 14944 v6 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 14945 v6.AddArg(x) 14946 v3.AddArg(v6) 14947 v2.AddArg(v3) 14948 v7 := b.NewValue0(v.Line, OpARMSUB, config.fe.TypeUInt32()) 14949 v8 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 14950 v8.AddArg(y) 14951 v9 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 14952 v9.AddArg(y) 14953 v8.AddArg(v9) 14954 v7.AddArg(v8) 14955 v10 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 14956 v10.AddArg(y) 14957 v7.AddArg(v10) 14958 v2.AddArg(v7) 14959 v1.AddArg(v2) 14960 v0.AddArg(v1) 14961 v11 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 14962 v11.AddArg(x) 14963 v0.AddArg(v11) 14964 v.AddArg(v0) 14965 v12 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 14966 v12.AddArg(x) 14967 v.AddArg(v12) 14968 return true 14969 } 14970 } 14971 func rewriteValueARM_OpMod32u(v *Value, config *Config) bool { 14972 b := v.Block 14973 _ = b 14974 // match: (Mod32u x y) 14975 // cond: 14976 // result: (Select1 <config.fe.TypeUInt32()> (UDIVrtcall x y)) 14977 for { 14978 x := v.Args[0] 14979 y := v.Args[1] 14980 v.reset(OpSelect1) 14981 v.Type = config.fe.TypeUInt32() 14982 v0 := b.NewValue0(v.Line, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 14983 v0.AddArg(x) 14984 v0.AddArg(y) 14985 v.AddArg(v0) 14986 return true 14987 } 14988 } 14989 func rewriteValueARM_OpMod8(v *Value, config *Config) bool { 14990 b := v.Block 14991 _ = b 14992 // match: (Mod8 x y) 14993 // cond: 14994 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 14995 for { 14996 x := v.Args[0] 14997 y := v.Args[1] 14998 v.reset(OpMod32) 14999 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 15000 v0.AddArg(x) 15001 v.AddArg(v0) 15002 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 15003 v1.AddArg(y) 15004 v.AddArg(v1) 15005 return true 15006 } 15007 } 15008 func rewriteValueARM_OpMod8u(v *Value, config *Config) bool { 15009 b := v.Block 15010 _ = b 15011 // match: (Mod8u x y) 15012 // cond: 15013 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 15014 for { 15015 x := v.Args[0] 15016 y := v.Args[1] 15017 v.reset(OpMod32u) 15018 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 15019 v0.AddArg(x) 15020 v.AddArg(v0) 15021 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 15022 v1.AddArg(y) 15023 v.AddArg(v1) 15024 return true 15025 } 15026 } 15027 func rewriteValueARM_OpMove(v *Value, config *Config) bool { 15028 b := v.Block 15029 _ = b 15030 // match: (Move [s] _ _ mem) 15031 // cond: SizeAndAlign(s).Size() == 0 15032 // result: mem 15033 for { 15034 s := v.AuxInt 15035 mem := v.Args[2] 15036 if !(SizeAndAlign(s).Size() == 0) { 15037 break 15038 } 15039 v.reset(OpCopy) 15040 v.Type = mem.Type 15041 v.AddArg(mem) 15042 return true 15043 } 15044 // match: (Move [s] dst src mem) 15045 // cond: SizeAndAlign(s).Size() == 1 15046 // result: (MOVBstore dst (MOVBUload src mem) mem) 15047 for { 15048 s := v.AuxInt 15049 dst := v.Args[0] 15050 src := v.Args[1] 15051 mem := v.Args[2] 15052 if !(SizeAndAlign(s).Size() == 1) { 15053 break 15054 } 15055 v.reset(OpARMMOVBstore) 15056 v.AddArg(dst) 15057 v0 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15058 v0.AddArg(src) 15059 v0.AddArg(mem) 15060 v.AddArg(v0) 15061 v.AddArg(mem) 15062 return true 15063 } 15064 // match: (Move [s] dst src mem) 15065 // cond: SizeAndAlign(s).Size() == 2 && SizeAndAlign(s).Align()%2 == 0 15066 // result: (MOVHstore dst (MOVHUload src mem) mem) 15067 for { 15068 s := v.AuxInt 15069 dst := v.Args[0] 15070 src := v.Args[1] 15071 mem := v.Args[2] 15072 if !(SizeAndAlign(s).Size() == 2 && SizeAndAlign(s).Align()%2 == 0) { 15073 break 15074 } 15075 v.reset(OpARMMOVHstore) 15076 v.AddArg(dst) 15077 v0 := b.NewValue0(v.Line, OpARMMOVHUload, config.fe.TypeUInt16()) 15078 v0.AddArg(src) 15079 v0.AddArg(mem) 15080 v.AddArg(v0) 15081 v.AddArg(mem) 15082 return true 15083 } 15084 // match: (Move [s] dst src mem) 15085 // cond: SizeAndAlign(s).Size() == 2 15086 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 15087 for { 15088 s := v.AuxInt 15089 dst := v.Args[0] 15090 src := v.Args[1] 15091 mem := v.Args[2] 15092 if !(SizeAndAlign(s).Size() == 2) { 15093 break 15094 } 15095 v.reset(OpARMMOVBstore) 15096 v.AuxInt = 1 15097 v.AddArg(dst) 15098 v0 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15099 v0.AuxInt = 1 15100 v0.AddArg(src) 15101 v0.AddArg(mem) 15102 v.AddArg(v0) 15103 v1 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 15104 v1.AddArg(dst) 15105 v2 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15106 v2.AddArg(src) 15107 v2.AddArg(mem) 15108 v1.AddArg(v2) 15109 v1.AddArg(mem) 15110 v.AddArg(v1) 15111 return true 15112 } 15113 // match: (Move [s] dst src mem) 15114 // cond: SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%4 == 0 15115 // result: (MOVWstore dst (MOVWload src mem) mem) 15116 for { 15117 s := v.AuxInt 15118 dst := v.Args[0] 15119 src := v.Args[1] 15120 mem := v.Args[2] 15121 if !(SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%4 == 0) { 15122 break 15123 } 15124 v.reset(OpARMMOVWstore) 15125 v.AddArg(dst) 15126 v0 := b.NewValue0(v.Line, OpARMMOVWload, config.fe.TypeUInt32()) 15127 v0.AddArg(src) 15128 v0.AddArg(mem) 15129 v.AddArg(v0) 15130 v.AddArg(mem) 15131 return true 15132 } 15133 // match: (Move [s] dst src mem) 15134 // cond: SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%2 == 0 15135 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 15136 for { 15137 s := v.AuxInt 15138 dst := v.Args[0] 15139 src := v.Args[1] 15140 mem := v.Args[2] 15141 if !(SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%2 == 0) { 15142 break 15143 } 15144 v.reset(OpARMMOVHstore) 15145 v.AuxInt = 2 15146 v.AddArg(dst) 15147 v0 := b.NewValue0(v.Line, OpARMMOVHUload, config.fe.TypeUInt16()) 15148 v0.AuxInt = 2 15149 v0.AddArg(src) 15150 v0.AddArg(mem) 15151 v.AddArg(v0) 15152 v1 := b.NewValue0(v.Line, OpARMMOVHstore, TypeMem) 15153 v1.AddArg(dst) 15154 v2 := b.NewValue0(v.Line, OpARMMOVHUload, config.fe.TypeUInt16()) 15155 v2.AddArg(src) 15156 v2.AddArg(mem) 15157 v1.AddArg(v2) 15158 v1.AddArg(mem) 15159 v.AddArg(v1) 15160 return true 15161 } 15162 // match: (Move [s] dst src mem) 15163 // cond: SizeAndAlign(s).Size() == 4 15164 // 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)))) 15165 for { 15166 s := v.AuxInt 15167 dst := v.Args[0] 15168 src := v.Args[1] 15169 mem := v.Args[2] 15170 if !(SizeAndAlign(s).Size() == 4) { 15171 break 15172 } 15173 v.reset(OpARMMOVBstore) 15174 v.AuxInt = 3 15175 v.AddArg(dst) 15176 v0 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15177 v0.AuxInt = 3 15178 v0.AddArg(src) 15179 v0.AddArg(mem) 15180 v.AddArg(v0) 15181 v1 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 15182 v1.AuxInt = 2 15183 v1.AddArg(dst) 15184 v2 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15185 v2.AuxInt = 2 15186 v2.AddArg(src) 15187 v2.AddArg(mem) 15188 v1.AddArg(v2) 15189 v3 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 15190 v3.AuxInt = 1 15191 v3.AddArg(dst) 15192 v4 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15193 v4.AuxInt = 1 15194 v4.AddArg(src) 15195 v4.AddArg(mem) 15196 v3.AddArg(v4) 15197 v5 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 15198 v5.AddArg(dst) 15199 v6 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15200 v6.AddArg(src) 15201 v6.AddArg(mem) 15202 v5.AddArg(v6) 15203 v5.AddArg(mem) 15204 v3.AddArg(v5) 15205 v1.AddArg(v3) 15206 v.AddArg(v1) 15207 return true 15208 } 15209 // match: (Move [s] dst src mem) 15210 // cond: SizeAndAlign(s).Size() == 3 15211 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 15212 for { 15213 s := v.AuxInt 15214 dst := v.Args[0] 15215 src := v.Args[1] 15216 mem := v.Args[2] 15217 if !(SizeAndAlign(s).Size() == 3) { 15218 break 15219 } 15220 v.reset(OpARMMOVBstore) 15221 v.AuxInt = 2 15222 v.AddArg(dst) 15223 v0 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15224 v0.AuxInt = 2 15225 v0.AddArg(src) 15226 v0.AddArg(mem) 15227 v.AddArg(v0) 15228 v1 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 15229 v1.AuxInt = 1 15230 v1.AddArg(dst) 15231 v2 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15232 v2.AuxInt = 1 15233 v2.AddArg(src) 15234 v2.AddArg(mem) 15235 v1.AddArg(v2) 15236 v3 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 15237 v3.AddArg(dst) 15238 v4 := b.NewValue0(v.Line, OpARMMOVBUload, config.fe.TypeUInt8()) 15239 v4.AddArg(src) 15240 v4.AddArg(mem) 15241 v3.AddArg(v4) 15242 v3.AddArg(mem) 15243 v1.AddArg(v3) 15244 v.AddArg(v1) 15245 return true 15246 } 15247 // match: (Move [s] dst src mem) 15248 // cond: SizeAndAlign(s).Size()%4 == 0 && SizeAndAlign(s).Size() > 4 && SizeAndAlign(s).Size() <= 512 && SizeAndAlign(s).Align()%4 == 0 && !config.noDuffDevice 15249 // result: (DUFFCOPY [8 * (128 - int64(SizeAndAlign(s).Size()/4))] dst src mem) 15250 for { 15251 s := v.AuxInt 15252 dst := v.Args[0] 15253 src := v.Args[1] 15254 mem := v.Args[2] 15255 if !(SizeAndAlign(s).Size()%4 == 0 && SizeAndAlign(s).Size() > 4 && SizeAndAlign(s).Size() <= 512 && SizeAndAlign(s).Align()%4 == 0 && !config.noDuffDevice) { 15256 break 15257 } 15258 v.reset(OpARMDUFFCOPY) 15259 v.AuxInt = 8 * (128 - int64(SizeAndAlign(s).Size()/4)) 15260 v.AddArg(dst) 15261 v.AddArg(src) 15262 v.AddArg(mem) 15263 return true 15264 } 15265 // match: (Move [s] dst src mem) 15266 // cond: (SizeAndAlign(s).Size() > 512 || config.noDuffDevice) || SizeAndAlign(s).Align()%4 != 0 15267 // result: (LoweredMove [SizeAndAlign(s).Align()] dst src (ADDconst <src.Type> src [SizeAndAlign(s).Size()-moveSize(SizeAndAlign(s).Align(), config)]) mem) 15268 for { 15269 s := v.AuxInt 15270 dst := v.Args[0] 15271 src := v.Args[1] 15272 mem := v.Args[2] 15273 if !((SizeAndAlign(s).Size() > 512 || config.noDuffDevice) || SizeAndAlign(s).Align()%4 != 0) { 15274 break 15275 } 15276 v.reset(OpARMLoweredMove) 15277 v.AuxInt = SizeAndAlign(s).Align() 15278 v.AddArg(dst) 15279 v.AddArg(src) 15280 v0 := b.NewValue0(v.Line, OpARMADDconst, src.Type) 15281 v0.AuxInt = SizeAndAlign(s).Size() - moveSize(SizeAndAlign(s).Align(), config) 15282 v0.AddArg(src) 15283 v.AddArg(v0) 15284 v.AddArg(mem) 15285 return true 15286 } 15287 return false 15288 } 15289 func rewriteValueARM_OpMul16(v *Value, config *Config) bool { 15290 b := v.Block 15291 _ = b 15292 // match: (Mul16 x y) 15293 // cond: 15294 // result: (MUL x y) 15295 for { 15296 x := v.Args[0] 15297 y := v.Args[1] 15298 v.reset(OpARMMUL) 15299 v.AddArg(x) 15300 v.AddArg(y) 15301 return true 15302 } 15303 } 15304 func rewriteValueARM_OpMul32(v *Value, config *Config) bool { 15305 b := v.Block 15306 _ = b 15307 // match: (Mul32 x y) 15308 // cond: 15309 // result: (MUL x y) 15310 for { 15311 x := v.Args[0] 15312 y := v.Args[1] 15313 v.reset(OpARMMUL) 15314 v.AddArg(x) 15315 v.AddArg(y) 15316 return true 15317 } 15318 } 15319 func rewriteValueARM_OpMul32F(v *Value, config *Config) bool { 15320 b := v.Block 15321 _ = b 15322 // match: (Mul32F x y) 15323 // cond: 15324 // result: (MULF x y) 15325 for { 15326 x := v.Args[0] 15327 y := v.Args[1] 15328 v.reset(OpARMMULF) 15329 v.AddArg(x) 15330 v.AddArg(y) 15331 return true 15332 } 15333 } 15334 func rewriteValueARM_OpMul32uhilo(v *Value, config *Config) bool { 15335 b := v.Block 15336 _ = b 15337 // match: (Mul32uhilo x y) 15338 // cond: 15339 // result: (MULLU x y) 15340 for { 15341 x := v.Args[0] 15342 y := v.Args[1] 15343 v.reset(OpARMMULLU) 15344 v.AddArg(x) 15345 v.AddArg(y) 15346 return true 15347 } 15348 } 15349 func rewriteValueARM_OpMul64F(v *Value, config *Config) bool { 15350 b := v.Block 15351 _ = b 15352 // match: (Mul64F x y) 15353 // cond: 15354 // result: (MULD x y) 15355 for { 15356 x := v.Args[0] 15357 y := v.Args[1] 15358 v.reset(OpARMMULD) 15359 v.AddArg(x) 15360 v.AddArg(y) 15361 return true 15362 } 15363 } 15364 func rewriteValueARM_OpMul8(v *Value, config *Config) bool { 15365 b := v.Block 15366 _ = b 15367 // match: (Mul8 x y) 15368 // cond: 15369 // result: (MUL x y) 15370 for { 15371 x := v.Args[0] 15372 y := v.Args[1] 15373 v.reset(OpARMMUL) 15374 v.AddArg(x) 15375 v.AddArg(y) 15376 return true 15377 } 15378 } 15379 func rewriteValueARM_OpNeg16(v *Value, config *Config) bool { 15380 b := v.Block 15381 _ = b 15382 // match: (Neg16 x) 15383 // cond: 15384 // result: (RSBconst [0] x) 15385 for { 15386 x := v.Args[0] 15387 v.reset(OpARMRSBconst) 15388 v.AuxInt = 0 15389 v.AddArg(x) 15390 return true 15391 } 15392 } 15393 func rewriteValueARM_OpNeg32(v *Value, config *Config) bool { 15394 b := v.Block 15395 _ = b 15396 // match: (Neg32 x) 15397 // cond: 15398 // result: (RSBconst [0] x) 15399 for { 15400 x := v.Args[0] 15401 v.reset(OpARMRSBconst) 15402 v.AuxInt = 0 15403 v.AddArg(x) 15404 return true 15405 } 15406 } 15407 func rewriteValueARM_OpNeg32F(v *Value, config *Config) bool { 15408 b := v.Block 15409 _ = b 15410 // match: (Neg32F x) 15411 // cond: 15412 // result: (NEGF x) 15413 for { 15414 x := v.Args[0] 15415 v.reset(OpARMNEGF) 15416 v.AddArg(x) 15417 return true 15418 } 15419 } 15420 func rewriteValueARM_OpNeg64F(v *Value, config *Config) bool { 15421 b := v.Block 15422 _ = b 15423 // match: (Neg64F x) 15424 // cond: 15425 // result: (NEGD x) 15426 for { 15427 x := v.Args[0] 15428 v.reset(OpARMNEGD) 15429 v.AddArg(x) 15430 return true 15431 } 15432 } 15433 func rewriteValueARM_OpNeg8(v *Value, config *Config) bool { 15434 b := v.Block 15435 _ = b 15436 // match: (Neg8 x) 15437 // cond: 15438 // result: (RSBconst [0] x) 15439 for { 15440 x := v.Args[0] 15441 v.reset(OpARMRSBconst) 15442 v.AuxInt = 0 15443 v.AddArg(x) 15444 return true 15445 } 15446 } 15447 func rewriteValueARM_OpNeq16(v *Value, config *Config) bool { 15448 b := v.Block 15449 _ = b 15450 // match: (Neq16 x y) 15451 // cond: 15452 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 15453 for { 15454 x := v.Args[0] 15455 y := v.Args[1] 15456 v.reset(OpARMNotEqual) 15457 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 15458 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15459 v1.AddArg(x) 15460 v0.AddArg(v1) 15461 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15462 v2.AddArg(y) 15463 v0.AddArg(v2) 15464 v.AddArg(v0) 15465 return true 15466 } 15467 } 15468 func rewriteValueARM_OpNeq32(v *Value, config *Config) bool { 15469 b := v.Block 15470 _ = b 15471 // match: (Neq32 x y) 15472 // cond: 15473 // result: (NotEqual (CMP x y)) 15474 for { 15475 x := v.Args[0] 15476 y := v.Args[1] 15477 v.reset(OpARMNotEqual) 15478 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 15479 v0.AddArg(x) 15480 v0.AddArg(y) 15481 v.AddArg(v0) 15482 return true 15483 } 15484 } 15485 func rewriteValueARM_OpNeq32F(v *Value, config *Config) bool { 15486 b := v.Block 15487 _ = b 15488 // match: (Neq32F x y) 15489 // cond: 15490 // result: (NotEqual (CMPF x y)) 15491 for { 15492 x := v.Args[0] 15493 y := v.Args[1] 15494 v.reset(OpARMNotEqual) 15495 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 15496 v0.AddArg(x) 15497 v0.AddArg(y) 15498 v.AddArg(v0) 15499 return true 15500 } 15501 } 15502 func rewriteValueARM_OpNeq64F(v *Value, config *Config) bool { 15503 b := v.Block 15504 _ = b 15505 // match: (Neq64F x y) 15506 // cond: 15507 // result: (NotEqual (CMPD x y)) 15508 for { 15509 x := v.Args[0] 15510 y := v.Args[1] 15511 v.reset(OpARMNotEqual) 15512 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 15513 v0.AddArg(x) 15514 v0.AddArg(y) 15515 v.AddArg(v0) 15516 return true 15517 } 15518 } 15519 func rewriteValueARM_OpNeq8(v *Value, config *Config) bool { 15520 b := v.Block 15521 _ = b 15522 // match: (Neq8 x y) 15523 // cond: 15524 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15525 for { 15526 x := v.Args[0] 15527 y := v.Args[1] 15528 v.reset(OpARMNotEqual) 15529 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 15530 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 15531 v1.AddArg(x) 15532 v0.AddArg(v1) 15533 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 15534 v2.AddArg(y) 15535 v0.AddArg(v2) 15536 v.AddArg(v0) 15537 return true 15538 } 15539 } 15540 func rewriteValueARM_OpNeqB(v *Value, config *Config) bool { 15541 b := v.Block 15542 _ = b 15543 // match: (NeqB x y) 15544 // cond: 15545 // result: (XOR x y) 15546 for { 15547 x := v.Args[0] 15548 y := v.Args[1] 15549 v.reset(OpARMXOR) 15550 v.AddArg(x) 15551 v.AddArg(y) 15552 return true 15553 } 15554 } 15555 func rewriteValueARM_OpNeqPtr(v *Value, config *Config) bool { 15556 b := v.Block 15557 _ = b 15558 // match: (NeqPtr x y) 15559 // cond: 15560 // result: (NotEqual (CMP x y)) 15561 for { 15562 x := v.Args[0] 15563 y := v.Args[1] 15564 v.reset(OpARMNotEqual) 15565 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 15566 v0.AddArg(x) 15567 v0.AddArg(y) 15568 v.AddArg(v0) 15569 return true 15570 } 15571 } 15572 func rewriteValueARM_OpNilCheck(v *Value, config *Config) bool { 15573 b := v.Block 15574 _ = b 15575 // match: (NilCheck ptr mem) 15576 // cond: 15577 // result: (LoweredNilCheck ptr mem) 15578 for { 15579 ptr := v.Args[0] 15580 mem := v.Args[1] 15581 v.reset(OpARMLoweredNilCheck) 15582 v.AddArg(ptr) 15583 v.AddArg(mem) 15584 return true 15585 } 15586 } 15587 func rewriteValueARM_OpNot(v *Value, config *Config) bool { 15588 b := v.Block 15589 _ = b 15590 // match: (Not x) 15591 // cond: 15592 // result: (XORconst [1] x) 15593 for { 15594 x := v.Args[0] 15595 v.reset(OpARMXORconst) 15596 v.AuxInt = 1 15597 v.AddArg(x) 15598 return true 15599 } 15600 } 15601 func rewriteValueARM_OpOffPtr(v *Value, config *Config) bool { 15602 b := v.Block 15603 _ = b 15604 // match: (OffPtr [off] ptr:(SP)) 15605 // cond: 15606 // result: (MOVWaddr [off] ptr) 15607 for { 15608 off := v.AuxInt 15609 ptr := v.Args[0] 15610 if ptr.Op != OpSP { 15611 break 15612 } 15613 v.reset(OpARMMOVWaddr) 15614 v.AuxInt = off 15615 v.AddArg(ptr) 15616 return true 15617 } 15618 // match: (OffPtr [off] ptr) 15619 // cond: 15620 // result: (ADDconst [off] ptr) 15621 for { 15622 off := v.AuxInt 15623 ptr := v.Args[0] 15624 v.reset(OpARMADDconst) 15625 v.AuxInt = off 15626 v.AddArg(ptr) 15627 return true 15628 } 15629 } 15630 func rewriteValueARM_OpOr16(v *Value, config *Config) bool { 15631 b := v.Block 15632 _ = b 15633 // match: (Or16 x y) 15634 // cond: 15635 // result: (OR x y) 15636 for { 15637 x := v.Args[0] 15638 y := v.Args[1] 15639 v.reset(OpARMOR) 15640 v.AddArg(x) 15641 v.AddArg(y) 15642 return true 15643 } 15644 } 15645 func rewriteValueARM_OpOr32(v *Value, config *Config) bool { 15646 b := v.Block 15647 _ = b 15648 // match: (Or32 x y) 15649 // cond: 15650 // result: (OR x y) 15651 for { 15652 x := v.Args[0] 15653 y := v.Args[1] 15654 v.reset(OpARMOR) 15655 v.AddArg(x) 15656 v.AddArg(y) 15657 return true 15658 } 15659 } 15660 func rewriteValueARM_OpOr8(v *Value, config *Config) bool { 15661 b := v.Block 15662 _ = b 15663 // match: (Or8 x y) 15664 // cond: 15665 // result: (OR x y) 15666 for { 15667 x := v.Args[0] 15668 y := v.Args[1] 15669 v.reset(OpARMOR) 15670 v.AddArg(x) 15671 v.AddArg(y) 15672 return true 15673 } 15674 } 15675 func rewriteValueARM_OpOrB(v *Value, config *Config) bool { 15676 b := v.Block 15677 _ = b 15678 // match: (OrB x y) 15679 // cond: 15680 // result: (OR x y) 15681 for { 15682 x := v.Args[0] 15683 y := v.Args[1] 15684 v.reset(OpARMOR) 15685 v.AddArg(x) 15686 v.AddArg(y) 15687 return true 15688 } 15689 } 15690 func rewriteValueARM_OpRsh16Ux16(v *Value, config *Config) bool { 15691 b := v.Block 15692 _ = b 15693 // match: (Rsh16Ux16 x y) 15694 // cond: 15695 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15696 for { 15697 x := v.Args[0] 15698 y := v.Args[1] 15699 v.reset(OpARMCMOVWHSconst) 15700 v.AuxInt = 0 15701 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 15702 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15703 v1.AddArg(x) 15704 v0.AddArg(v1) 15705 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15706 v2.AddArg(y) 15707 v0.AddArg(v2) 15708 v.AddArg(v0) 15709 v3 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 15710 v3.AuxInt = 256 15711 v4 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15712 v4.AddArg(y) 15713 v3.AddArg(v4) 15714 v.AddArg(v3) 15715 return true 15716 } 15717 } 15718 func rewriteValueARM_OpRsh16Ux32(v *Value, config *Config) bool { 15719 b := v.Block 15720 _ = b 15721 // match: (Rsh16Ux32 x y) 15722 // cond: 15723 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 15724 for { 15725 x := v.Args[0] 15726 y := v.Args[1] 15727 v.reset(OpARMCMOVWHSconst) 15728 v.AuxInt = 0 15729 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 15730 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15731 v1.AddArg(x) 15732 v0.AddArg(v1) 15733 v0.AddArg(y) 15734 v.AddArg(v0) 15735 v2 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 15736 v2.AuxInt = 256 15737 v2.AddArg(y) 15738 v.AddArg(v2) 15739 return true 15740 } 15741 } 15742 func rewriteValueARM_OpRsh16Ux64(v *Value, config *Config) bool { 15743 b := v.Block 15744 _ = b 15745 // match: (Rsh16Ux64 x (Const64 [c])) 15746 // cond: uint64(c) < 16 15747 // result: (SRLconst (SLLconst <config.fe.TypeUInt32()> x [16]) [c+16]) 15748 for { 15749 x := v.Args[0] 15750 v_1 := v.Args[1] 15751 if v_1.Op != OpConst64 { 15752 break 15753 } 15754 c := v_1.AuxInt 15755 if !(uint64(c) < 16) { 15756 break 15757 } 15758 v.reset(OpARMSRLconst) 15759 v.AuxInt = c + 16 15760 v0 := b.NewValue0(v.Line, OpARMSLLconst, config.fe.TypeUInt32()) 15761 v0.AuxInt = 16 15762 v0.AddArg(x) 15763 v.AddArg(v0) 15764 return true 15765 } 15766 // match: (Rsh16Ux64 _ (Const64 [c])) 15767 // cond: uint64(c) >= 16 15768 // result: (Const16 [0]) 15769 for { 15770 v_1 := v.Args[1] 15771 if v_1.Op != OpConst64 { 15772 break 15773 } 15774 c := v_1.AuxInt 15775 if !(uint64(c) >= 16) { 15776 break 15777 } 15778 v.reset(OpConst16) 15779 v.AuxInt = 0 15780 return true 15781 } 15782 return false 15783 } 15784 func rewriteValueARM_OpRsh16Ux8(v *Value, config *Config) bool { 15785 b := v.Block 15786 _ = b 15787 // match: (Rsh16Ux8 x y) 15788 // cond: 15789 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 15790 for { 15791 x := v.Args[0] 15792 y := v.Args[1] 15793 v.reset(OpARMSRL) 15794 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15795 v0.AddArg(x) 15796 v.AddArg(v0) 15797 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 15798 v1.AddArg(y) 15799 v.AddArg(v1) 15800 return true 15801 } 15802 } 15803 func rewriteValueARM_OpRsh16x16(v *Value, config *Config) bool { 15804 b := v.Block 15805 _ = b 15806 // match: (Rsh16x16 x y) 15807 // cond: 15808 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 15809 for { 15810 x := v.Args[0] 15811 y := v.Args[1] 15812 v.reset(OpARMSRAcond) 15813 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 15814 v0.AddArg(x) 15815 v.AddArg(v0) 15816 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15817 v1.AddArg(y) 15818 v.AddArg(v1) 15819 v2 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 15820 v2.AuxInt = 256 15821 v3 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15822 v3.AddArg(y) 15823 v2.AddArg(v3) 15824 v.AddArg(v2) 15825 return true 15826 } 15827 } 15828 func rewriteValueARM_OpRsh16x32(v *Value, config *Config) bool { 15829 b := v.Block 15830 _ = b 15831 // match: (Rsh16x32 x y) 15832 // cond: 15833 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 15834 for { 15835 x := v.Args[0] 15836 y := v.Args[1] 15837 v.reset(OpARMSRAcond) 15838 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 15839 v0.AddArg(x) 15840 v.AddArg(v0) 15841 v.AddArg(y) 15842 v1 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 15843 v1.AuxInt = 256 15844 v1.AddArg(y) 15845 v.AddArg(v1) 15846 return true 15847 } 15848 } 15849 func rewriteValueARM_OpRsh16x64(v *Value, config *Config) bool { 15850 b := v.Block 15851 _ = b 15852 // match: (Rsh16x64 x (Const64 [c])) 15853 // cond: uint64(c) < 16 15854 // result: (SRAconst (SLLconst <config.fe.TypeUInt32()> x [16]) [c+16]) 15855 for { 15856 x := v.Args[0] 15857 v_1 := v.Args[1] 15858 if v_1.Op != OpConst64 { 15859 break 15860 } 15861 c := v_1.AuxInt 15862 if !(uint64(c) < 16) { 15863 break 15864 } 15865 v.reset(OpARMSRAconst) 15866 v.AuxInt = c + 16 15867 v0 := b.NewValue0(v.Line, OpARMSLLconst, config.fe.TypeUInt32()) 15868 v0.AuxInt = 16 15869 v0.AddArg(x) 15870 v.AddArg(v0) 15871 return true 15872 } 15873 // match: (Rsh16x64 x (Const64 [c])) 15874 // cond: uint64(c) >= 16 15875 // result: (SRAconst (SLLconst <config.fe.TypeUInt32()> x [16]) [31]) 15876 for { 15877 x := v.Args[0] 15878 v_1 := v.Args[1] 15879 if v_1.Op != OpConst64 { 15880 break 15881 } 15882 c := v_1.AuxInt 15883 if !(uint64(c) >= 16) { 15884 break 15885 } 15886 v.reset(OpARMSRAconst) 15887 v.AuxInt = 31 15888 v0 := b.NewValue0(v.Line, OpARMSLLconst, config.fe.TypeUInt32()) 15889 v0.AuxInt = 16 15890 v0.AddArg(x) 15891 v.AddArg(v0) 15892 return true 15893 } 15894 return false 15895 } 15896 func rewriteValueARM_OpRsh16x8(v *Value, config *Config) bool { 15897 b := v.Block 15898 _ = b 15899 // match: (Rsh16x8 x y) 15900 // cond: 15901 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 15902 for { 15903 x := v.Args[0] 15904 y := v.Args[1] 15905 v.reset(OpARMSRA) 15906 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 15907 v0.AddArg(x) 15908 v.AddArg(v0) 15909 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 15910 v1.AddArg(y) 15911 v.AddArg(v1) 15912 return true 15913 } 15914 } 15915 func rewriteValueARM_OpRsh32Ux16(v *Value, config *Config) bool { 15916 b := v.Block 15917 _ = b 15918 // match: (Rsh32Ux16 x y) 15919 // cond: 15920 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15921 for { 15922 x := v.Args[0] 15923 y := v.Args[1] 15924 v.reset(OpARMCMOVWHSconst) 15925 v.AuxInt = 0 15926 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 15927 v0.AddArg(x) 15928 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15929 v1.AddArg(y) 15930 v0.AddArg(v1) 15931 v.AddArg(v0) 15932 v2 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 15933 v2.AuxInt = 256 15934 v3 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 15935 v3.AddArg(y) 15936 v2.AddArg(v3) 15937 v.AddArg(v2) 15938 return true 15939 } 15940 } 15941 func rewriteValueARM_OpRsh32Ux32(v *Value, config *Config) bool { 15942 b := v.Block 15943 _ = b 15944 // match: (Rsh32Ux32 x y) 15945 // cond: 15946 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 15947 for { 15948 x := v.Args[0] 15949 y := v.Args[1] 15950 v.reset(OpARMCMOVWHSconst) 15951 v.AuxInt = 0 15952 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 15953 v0.AddArg(x) 15954 v0.AddArg(y) 15955 v.AddArg(v0) 15956 v1 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 15957 v1.AuxInt = 256 15958 v1.AddArg(y) 15959 v.AddArg(v1) 15960 return true 15961 } 15962 } 15963 func rewriteValueARM_OpRsh32Ux64(v *Value, config *Config) bool { 15964 b := v.Block 15965 _ = b 15966 // match: (Rsh32Ux64 x (Const64 [c])) 15967 // cond: uint64(c) < 32 15968 // result: (SRLconst x [c]) 15969 for { 15970 x := v.Args[0] 15971 v_1 := v.Args[1] 15972 if v_1.Op != OpConst64 { 15973 break 15974 } 15975 c := v_1.AuxInt 15976 if !(uint64(c) < 32) { 15977 break 15978 } 15979 v.reset(OpARMSRLconst) 15980 v.AuxInt = c 15981 v.AddArg(x) 15982 return true 15983 } 15984 // match: (Rsh32Ux64 _ (Const64 [c])) 15985 // cond: uint64(c) >= 32 15986 // result: (Const32 [0]) 15987 for { 15988 v_1 := v.Args[1] 15989 if v_1.Op != OpConst64 { 15990 break 15991 } 15992 c := v_1.AuxInt 15993 if !(uint64(c) >= 32) { 15994 break 15995 } 15996 v.reset(OpConst32) 15997 v.AuxInt = 0 15998 return true 15999 } 16000 return false 16001 } 16002 func rewriteValueARM_OpRsh32Ux8(v *Value, config *Config) bool { 16003 b := v.Block 16004 _ = b 16005 // match: (Rsh32Ux8 x y) 16006 // cond: 16007 // result: (SRL x (ZeroExt8to32 y)) 16008 for { 16009 x := v.Args[0] 16010 y := v.Args[1] 16011 v.reset(OpARMSRL) 16012 v.AddArg(x) 16013 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 16014 v0.AddArg(y) 16015 v.AddArg(v0) 16016 return true 16017 } 16018 } 16019 func rewriteValueARM_OpRsh32x16(v *Value, config *Config) bool { 16020 b := v.Block 16021 _ = b 16022 // match: (Rsh32x16 x y) 16023 // cond: 16024 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16025 for { 16026 x := v.Args[0] 16027 y := v.Args[1] 16028 v.reset(OpARMSRAcond) 16029 v.AddArg(x) 16030 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 16031 v0.AddArg(y) 16032 v.AddArg(v0) 16033 v1 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 16034 v1.AuxInt = 256 16035 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 16036 v2.AddArg(y) 16037 v1.AddArg(v2) 16038 v.AddArg(v1) 16039 return true 16040 } 16041 } 16042 func rewriteValueARM_OpRsh32x32(v *Value, config *Config) bool { 16043 b := v.Block 16044 _ = b 16045 // match: (Rsh32x32 x y) 16046 // cond: 16047 // result: (SRAcond x y (CMPconst [256] y)) 16048 for { 16049 x := v.Args[0] 16050 y := v.Args[1] 16051 v.reset(OpARMSRAcond) 16052 v.AddArg(x) 16053 v.AddArg(y) 16054 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 16055 v0.AuxInt = 256 16056 v0.AddArg(y) 16057 v.AddArg(v0) 16058 return true 16059 } 16060 } 16061 func rewriteValueARM_OpRsh32x64(v *Value, config *Config) bool { 16062 b := v.Block 16063 _ = b 16064 // match: (Rsh32x64 x (Const64 [c])) 16065 // cond: uint64(c) < 32 16066 // result: (SRAconst x [c]) 16067 for { 16068 x := v.Args[0] 16069 v_1 := v.Args[1] 16070 if v_1.Op != OpConst64 { 16071 break 16072 } 16073 c := v_1.AuxInt 16074 if !(uint64(c) < 32) { 16075 break 16076 } 16077 v.reset(OpARMSRAconst) 16078 v.AuxInt = c 16079 v.AddArg(x) 16080 return true 16081 } 16082 // match: (Rsh32x64 x (Const64 [c])) 16083 // cond: uint64(c) >= 32 16084 // result: (SRAconst x [31]) 16085 for { 16086 x := v.Args[0] 16087 v_1 := v.Args[1] 16088 if v_1.Op != OpConst64 { 16089 break 16090 } 16091 c := v_1.AuxInt 16092 if !(uint64(c) >= 32) { 16093 break 16094 } 16095 v.reset(OpARMSRAconst) 16096 v.AuxInt = 31 16097 v.AddArg(x) 16098 return true 16099 } 16100 return false 16101 } 16102 func rewriteValueARM_OpRsh32x8(v *Value, config *Config) bool { 16103 b := v.Block 16104 _ = b 16105 // match: (Rsh32x8 x y) 16106 // cond: 16107 // result: (SRA x (ZeroExt8to32 y)) 16108 for { 16109 x := v.Args[0] 16110 y := v.Args[1] 16111 v.reset(OpARMSRA) 16112 v.AddArg(x) 16113 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 16114 v0.AddArg(y) 16115 v.AddArg(v0) 16116 return true 16117 } 16118 } 16119 func rewriteValueARM_OpRsh8Ux16(v *Value, config *Config) bool { 16120 b := v.Block 16121 _ = b 16122 // match: (Rsh8Ux16 x y) 16123 // cond: 16124 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 16125 for { 16126 x := v.Args[0] 16127 y := v.Args[1] 16128 v.reset(OpARMCMOVWHSconst) 16129 v.AuxInt = 0 16130 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 16131 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 16132 v1.AddArg(x) 16133 v0.AddArg(v1) 16134 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 16135 v2.AddArg(y) 16136 v0.AddArg(v2) 16137 v.AddArg(v0) 16138 v3 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 16139 v3.AuxInt = 256 16140 v4 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 16141 v4.AddArg(y) 16142 v3.AddArg(v4) 16143 v.AddArg(v3) 16144 return true 16145 } 16146 } 16147 func rewriteValueARM_OpRsh8Ux32(v *Value, config *Config) bool { 16148 b := v.Block 16149 _ = b 16150 // match: (Rsh8Ux32 x y) 16151 // cond: 16152 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 16153 for { 16154 x := v.Args[0] 16155 y := v.Args[1] 16156 v.reset(OpARMCMOVWHSconst) 16157 v.AuxInt = 0 16158 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 16159 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 16160 v1.AddArg(x) 16161 v0.AddArg(v1) 16162 v0.AddArg(y) 16163 v.AddArg(v0) 16164 v2 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 16165 v2.AuxInt = 256 16166 v2.AddArg(y) 16167 v.AddArg(v2) 16168 return true 16169 } 16170 } 16171 func rewriteValueARM_OpRsh8Ux64(v *Value, config *Config) bool { 16172 b := v.Block 16173 _ = b 16174 // match: (Rsh8Ux64 x (Const64 [c])) 16175 // cond: uint64(c) < 8 16176 // result: (SRLconst (SLLconst <config.fe.TypeUInt32()> x [24]) [c+24]) 16177 for { 16178 x := v.Args[0] 16179 v_1 := v.Args[1] 16180 if v_1.Op != OpConst64 { 16181 break 16182 } 16183 c := v_1.AuxInt 16184 if !(uint64(c) < 8) { 16185 break 16186 } 16187 v.reset(OpARMSRLconst) 16188 v.AuxInt = c + 24 16189 v0 := b.NewValue0(v.Line, OpARMSLLconst, config.fe.TypeUInt32()) 16190 v0.AuxInt = 24 16191 v0.AddArg(x) 16192 v.AddArg(v0) 16193 return true 16194 } 16195 // match: (Rsh8Ux64 _ (Const64 [c])) 16196 // cond: uint64(c) >= 8 16197 // result: (Const8 [0]) 16198 for { 16199 v_1 := v.Args[1] 16200 if v_1.Op != OpConst64 { 16201 break 16202 } 16203 c := v_1.AuxInt 16204 if !(uint64(c) >= 8) { 16205 break 16206 } 16207 v.reset(OpConst8) 16208 v.AuxInt = 0 16209 return true 16210 } 16211 return false 16212 } 16213 func rewriteValueARM_OpRsh8Ux8(v *Value, config *Config) bool { 16214 b := v.Block 16215 _ = b 16216 // match: (Rsh8Ux8 x y) 16217 // cond: 16218 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 16219 for { 16220 x := v.Args[0] 16221 y := v.Args[1] 16222 v.reset(OpARMSRL) 16223 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 16224 v0.AddArg(x) 16225 v.AddArg(v0) 16226 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 16227 v1.AddArg(y) 16228 v.AddArg(v1) 16229 return true 16230 } 16231 } 16232 func rewriteValueARM_OpRsh8x16(v *Value, config *Config) bool { 16233 b := v.Block 16234 _ = b 16235 // match: (Rsh8x16 x y) 16236 // cond: 16237 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16238 for { 16239 x := v.Args[0] 16240 y := v.Args[1] 16241 v.reset(OpARMSRAcond) 16242 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 16243 v0.AddArg(x) 16244 v.AddArg(v0) 16245 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 16246 v1.AddArg(y) 16247 v.AddArg(v1) 16248 v2 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 16249 v2.AuxInt = 256 16250 v3 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 16251 v3.AddArg(y) 16252 v2.AddArg(v3) 16253 v.AddArg(v2) 16254 return true 16255 } 16256 } 16257 func rewriteValueARM_OpRsh8x32(v *Value, config *Config) bool { 16258 b := v.Block 16259 _ = b 16260 // match: (Rsh8x32 x y) 16261 // cond: 16262 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 16263 for { 16264 x := v.Args[0] 16265 y := v.Args[1] 16266 v.reset(OpARMSRAcond) 16267 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 16268 v0.AddArg(x) 16269 v.AddArg(v0) 16270 v.AddArg(y) 16271 v1 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 16272 v1.AuxInt = 256 16273 v1.AddArg(y) 16274 v.AddArg(v1) 16275 return true 16276 } 16277 } 16278 func rewriteValueARM_OpRsh8x64(v *Value, config *Config) bool { 16279 b := v.Block 16280 _ = b 16281 // match: (Rsh8x64 x (Const64 [c])) 16282 // cond: uint64(c) < 8 16283 // result: (SRAconst (SLLconst <config.fe.TypeUInt32()> x [24]) [c+24]) 16284 for { 16285 x := v.Args[0] 16286 v_1 := v.Args[1] 16287 if v_1.Op != OpConst64 { 16288 break 16289 } 16290 c := v_1.AuxInt 16291 if !(uint64(c) < 8) { 16292 break 16293 } 16294 v.reset(OpARMSRAconst) 16295 v.AuxInt = c + 24 16296 v0 := b.NewValue0(v.Line, OpARMSLLconst, config.fe.TypeUInt32()) 16297 v0.AuxInt = 24 16298 v0.AddArg(x) 16299 v.AddArg(v0) 16300 return true 16301 } 16302 // match: (Rsh8x64 x (Const64 [c])) 16303 // cond: uint64(c) >= 8 16304 // result: (SRAconst (SLLconst <config.fe.TypeUInt32()> x [24]) [31]) 16305 for { 16306 x := v.Args[0] 16307 v_1 := v.Args[1] 16308 if v_1.Op != OpConst64 { 16309 break 16310 } 16311 c := v_1.AuxInt 16312 if !(uint64(c) >= 8) { 16313 break 16314 } 16315 v.reset(OpARMSRAconst) 16316 v.AuxInt = 31 16317 v0 := b.NewValue0(v.Line, OpARMSLLconst, config.fe.TypeUInt32()) 16318 v0.AuxInt = 24 16319 v0.AddArg(x) 16320 v.AddArg(v0) 16321 return true 16322 } 16323 return false 16324 } 16325 func rewriteValueARM_OpRsh8x8(v *Value, config *Config) bool { 16326 b := v.Block 16327 _ = b 16328 // match: (Rsh8x8 x y) 16329 // cond: 16330 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 16331 for { 16332 x := v.Args[0] 16333 y := v.Args[1] 16334 v.reset(OpARMSRA) 16335 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 16336 v0.AddArg(x) 16337 v.AddArg(v0) 16338 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 16339 v1.AddArg(y) 16340 v.AddArg(v1) 16341 return true 16342 } 16343 } 16344 func rewriteValueARM_OpSelect0(v *Value, config *Config) bool { 16345 b := v.Block 16346 _ = b 16347 // match: (Select0 (UDIVrtcall x (MOVWconst [1]))) 16348 // cond: 16349 // result: x 16350 for { 16351 v_0 := v.Args[0] 16352 if v_0.Op != OpARMUDIVrtcall { 16353 break 16354 } 16355 x := v_0.Args[0] 16356 v_0_1 := v_0.Args[1] 16357 if v_0_1.Op != OpARMMOVWconst { 16358 break 16359 } 16360 if v_0_1.AuxInt != 1 { 16361 break 16362 } 16363 v.reset(OpCopy) 16364 v.Type = x.Type 16365 v.AddArg(x) 16366 return true 16367 } 16368 // match: (Select0 (UDIVrtcall x (MOVWconst [c]))) 16369 // cond: isPowerOfTwo(c) 16370 // result: (SRLconst [log2(c)] x) 16371 for { 16372 v_0 := v.Args[0] 16373 if v_0.Op != OpARMUDIVrtcall { 16374 break 16375 } 16376 x := v_0.Args[0] 16377 v_0_1 := v_0.Args[1] 16378 if v_0_1.Op != OpARMMOVWconst { 16379 break 16380 } 16381 c := v_0_1.AuxInt 16382 if !(isPowerOfTwo(c)) { 16383 break 16384 } 16385 v.reset(OpARMSRLconst) 16386 v.AuxInt = log2(c) 16387 v.AddArg(x) 16388 return true 16389 } 16390 // match: (Select0 (UDIVrtcall (MOVWconst [c]) (MOVWconst [d]))) 16391 // cond: 16392 // result: (MOVWconst [int64(uint32(c)/uint32(d))]) 16393 for { 16394 v_0 := v.Args[0] 16395 if v_0.Op != OpARMUDIVrtcall { 16396 break 16397 } 16398 v_0_0 := v_0.Args[0] 16399 if v_0_0.Op != OpARMMOVWconst { 16400 break 16401 } 16402 c := v_0_0.AuxInt 16403 v_0_1 := v_0.Args[1] 16404 if v_0_1.Op != OpARMMOVWconst { 16405 break 16406 } 16407 d := v_0_1.AuxInt 16408 v.reset(OpARMMOVWconst) 16409 v.AuxInt = int64(uint32(c) / uint32(d)) 16410 return true 16411 } 16412 return false 16413 } 16414 func rewriteValueARM_OpSelect1(v *Value, config *Config) bool { 16415 b := v.Block 16416 _ = b 16417 // match: (Select1 (UDIVrtcall _ (MOVWconst [1]))) 16418 // cond: 16419 // result: (MOVWconst [0]) 16420 for { 16421 v_0 := v.Args[0] 16422 if v_0.Op != OpARMUDIVrtcall { 16423 break 16424 } 16425 v_0_1 := v_0.Args[1] 16426 if v_0_1.Op != OpARMMOVWconst { 16427 break 16428 } 16429 if v_0_1.AuxInt != 1 { 16430 break 16431 } 16432 v.reset(OpARMMOVWconst) 16433 v.AuxInt = 0 16434 return true 16435 } 16436 // match: (Select1 (UDIVrtcall x (MOVWconst [c]))) 16437 // cond: isPowerOfTwo(c) 16438 // result: (ANDconst [c-1] x) 16439 for { 16440 v_0 := v.Args[0] 16441 if v_0.Op != OpARMUDIVrtcall { 16442 break 16443 } 16444 x := v_0.Args[0] 16445 v_0_1 := v_0.Args[1] 16446 if v_0_1.Op != OpARMMOVWconst { 16447 break 16448 } 16449 c := v_0_1.AuxInt 16450 if !(isPowerOfTwo(c)) { 16451 break 16452 } 16453 v.reset(OpARMANDconst) 16454 v.AuxInt = c - 1 16455 v.AddArg(x) 16456 return true 16457 } 16458 // match: (Select1 (UDIVrtcall (MOVWconst [c]) (MOVWconst [d]))) 16459 // cond: 16460 // result: (MOVWconst [int64(uint32(c)%uint32(d))]) 16461 for { 16462 v_0 := v.Args[0] 16463 if v_0.Op != OpARMUDIVrtcall { 16464 break 16465 } 16466 v_0_0 := v_0.Args[0] 16467 if v_0_0.Op != OpARMMOVWconst { 16468 break 16469 } 16470 c := v_0_0.AuxInt 16471 v_0_1 := v_0.Args[1] 16472 if v_0_1.Op != OpARMMOVWconst { 16473 break 16474 } 16475 d := v_0_1.AuxInt 16476 v.reset(OpARMMOVWconst) 16477 v.AuxInt = int64(uint32(c) % uint32(d)) 16478 return true 16479 } 16480 return false 16481 } 16482 func rewriteValueARM_OpSignExt16to32(v *Value, config *Config) bool { 16483 b := v.Block 16484 _ = b 16485 // match: (SignExt16to32 x) 16486 // cond: 16487 // result: (MOVHreg x) 16488 for { 16489 x := v.Args[0] 16490 v.reset(OpARMMOVHreg) 16491 v.AddArg(x) 16492 return true 16493 } 16494 } 16495 func rewriteValueARM_OpSignExt8to16(v *Value, config *Config) bool { 16496 b := v.Block 16497 _ = b 16498 // match: (SignExt8to16 x) 16499 // cond: 16500 // result: (MOVBreg x) 16501 for { 16502 x := v.Args[0] 16503 v.reset(OpARMMOVBreg) 16504 v.AddArg(x) 16505 return true 16506 } 16507 } 16508 func rewriteValueARM_OpSignExt8to32(v *Value, config *Config) bool { 16509 b := v.Block 16510 _ = b 16511 // match: (SignExt8to32 x) 16512 // cond: 16513 // result: (MOVBreg x) 16514 for { 16515 x := v.Args[0] 16516 v.reset(OpARMMOVBreg) 16517 v.AddArg(x) 16518 return true 16519 } 16520 } 16521 func rewriteValueARM_OpSignmask(v *Value, config *Config) bool { 16522 b := v.Block 16523 _ = b 16524 // match: (Signmask x) 16525 // cond: 16526 // result: (SRAconst x [31]) 16527 for { 16528 x := v.Args[0] 16529 v.reset(OpARMSRAconst) 16530 v.AuxInt = 31 16531 v.AddArg(x) 16532 return true 16533 } 16534 } 16535 func rewriteValueARM_OpSlicemask(v *Value, config *Config) bool { 16536 b := v.Block 16537 _ = b 16538 // match: (Slicemask <t> x) 16539 // cond: 16540 // result: (MVN (SRAconst <t> (SUBconst <t> x [1]) [31])) 16541 for { 16542 t := v.Type 16543 x := v.Args[0] 16544 v.reset(OpARMMVN) 16545 v0 := b.NewValue0(v.Line, OpARMSRAconst, t) 16546 v0.AuxInt = 31 16547 v1 := b.NewValue0(v.Line, OpARMSUBconst, t) 16548 v1.AuxInt = 1 16549 v1.AddArg(x) 16550 v0.AddArg(v1) 16551 v.AddArg(v0) 16552 return true 16553 } 16554 } 16555 func rewriteValueARM_OpSqrt(v *Value, config *Config) bool { 16556 b := v.Block 16557 _ = b 16558 // match: (Sqrt x) 16559 // cond: 16560 // result: (SQRTD x) 16561 for { 16562 x := v.Args[0] 16563 v.reset(OpARMSQRTD) 16564 v.AddArg(x) 16565 return true 16566 } 16567 } 16568 func rewriteValueARM_OpStaticCall(v *Value, config *Config) bool { 16569 b := v.Block 16570 _ = b 16571 // match: (StaticCall [argwid] {target} mem) 16572 // cond: 16573 // result: (CALLstatic [argwid] {target} mem) 16574 for { 16575 argwid := v.AuxInt 16576 target := v.Aux 16577 mem := v.Args[0] 16578 v.reset(OpARMCALLstatic) 16579 v.AuxInt = argwid 16580 v.Aux = target 16581 v.AddArg(mem) 16582 return true 16583 } 16584 } 16585 func rewriteValueARM_OpStore(v *Value, config *Config) bool { 16586 b := v.Block 16587 _ = b 16588 // match: (Store [1] ptr val mem) 16589 // cond: 16590 // result: (MOVBstore ptr val mem) 16591 for { 16592 if v.AuxInt != 1 { 16593 break 16594 } 16595 ptr := v.Args[0] 16596 val := v.Args[1] 16597 mem := v.Args[2] 16598 v.reset(OpARMMOVBstore) 16599 v.AddArg(ptr) 16600 v.AddArg(val) 16601 v.AddArg(mem) 16602 return true 16603 } 16604 // match: (Store [2] ptr val mem) 16605 // cond: 16606 // result: (MOVHstore ptr val mem) 16607 for { 16608 if v.AuxInt != 2 { 16609 break 16610 } 16611 ptr := v.Args[0] 16612 val := v.Args[1] 16613 mem := v.Args[2] 16614 v.reset(OpARMMOVHstore) 16615 v.AddArg(ptr) 16616 v.AddArg(val) 16617 v.AddArg(mem) 16618 return true 16619 } 16620 // match: (Store [4] ptr val mem) 16621 // cond: !is32BitFloat(val.Type) 16622 // result: (MOVWstore ptr val mem) 16623 for { 16624 if v.AuxInt != 4 { 16625 break 16626 } 16627 ptr := v.Args[0] 16628 val := v.Args[1] 16629 mem := v.Args[2] 16630 if !(!is32BitFloat(val.Type)) { 16631 break 16632 } 16633 v.reset(OpARMMOVWstore) 16634 v.AddArg(ptr) 16635 v.AddArg(val) 16636 v.AddArg(mem) 16637 return true 16638 } 16639 // match: (Store [4] ptr val mem) 16640 // cond: is32BitFloat(val.Type) 16641 // result: (MOVFstore ptr val mem) 16642 for { 16643 if v.AuxInt != 4 { 16644 break 16645 } 16646 ptr := v.Args[0] 16647 val := v.Args[1] 16648 mem := v.Args[2] 16649 if !(is32BitFloat(val.Type)) { 16650 break 16651 } 16652 v.reset(OpARMMOVFstore) 16653 v.AddArg(ptr) 16654 v.AddArg(val) 16655 v.AddArg(mem) 16656 return true 16657 } 16658 // match: (Store [8] ptr val mem) 16659 // cond: is64BitFloat(val.Type) 16660 // result: (MOVDstore ptr val mem) 16661 for { 16662 if v.AuxInt != 8 { 16663 break 16664 } 16665 ptr := v.Args[0] 16666 val := v.Args[1] 16667 mem := v.Args[2] 16668 if !(is64BitFloat(val.Type)) { 16669 break 16670 } 16671 v.reset(OpARMMOVDstore) 16672 v.AddArg(ptr) 16673 v.AddArg(val) 16674 v.AddArg(mem) 16675 return true 16676 } 16677 return false 16678 } 16679 func rewriteValueARM_OpSub16(v *Value, config *Config) bool { 16680 b := v.Block 16681 _ = b 16682 // match: (Sub16 x y) 16683 // cond: 16684 // result: (SUB x y) 16685 for { 16686 x := v.Args[0] 16687 y := v.Args[1] 16688 v.reset(OpARMSUB) 16689 v.AddArg(x) 16690 v.AddArg(y) 16691 return true 16692 } 16693 } 16694 func rewriteValueARM_OpSub32(v *Value, config *Config) bool { 16695 b := v.Block 16696 _ = b 16697 // match: (Sub32 x y) 16698 // cond: 16699 // result: (SUB x y) 16700 for { 16701 x := v.Args[0] 16702 y := v.Args[1] 16703 v.reset(OpARMSUB) 16704 v.AddArg(x) 16705 v.AddArg(y) 16706 return true 16707 } 16708 } 16709 func rewriteValueARM_OpSub32F(v *Value, config *Config) bool { 16710 b := v.Block 16711 _ = b 16712 // match: (Sub32F x y) 16713 // cond: 16714 // result: (SUBF x y) 16715 for { 16716 x := v.Args[0] 16717 y := v.Args[1] 16718 v.reset(OpARMSUBF) 16719 v.AddArg(x) 16720 v.AddArg(y) 16721 return true 16722 } 16723 } 16724 func rewriteValueARM_OpSub32carry(v *Value, config *Config) bool { 16725 b := v.Block 16726 _ = b 16727 // match: (Sub32carry x y) 16728 // cond: 16729 // result: (SUBS x y) 16730 for { 16731 x := v.Args[0] 16732 y := v.Args[1] 16733 v.reset(OpARMSUBS) 16734 v.AddArg(x) 16735 v.AddArg(y) 16736 return true 16737 } 16738 } 16739 func rewriteValueARM_OpSub32withcarry(v *Value, config *Config) bool { 16740 b := v.Block 16741 _ = b 16742 // match: (Sub32withcarry x y c) 16743 // cond: 16744 // result: (SBC x y c) 16745 for { 16746 x := v.Args[0] 16747 y := v.Args[1] 16748 c := v.Args[2] 16749 v.reset(OpARMSBC) 16750 v.AddArg(x) 16751 v.AddArg(y) 16752 v.AddArg(c) 16753 return true 16754 } 16755 } 16756 func rewriteValueARM_OpSub64F(v *Value, config *Config) bool { 16757 b := v.Block 16758 _ = b 16759 // match: (Sub64F x y) 16760 // cond: 16761 // result: (SUBD x y) 16762 for { 16763 x := v.Args[0] 16764 y := v.Args[1] 16765 v.reset(OpARMSUBD) 16766 v.AddArg(x) 16767 v.AddArg(y) 16768 return true 16769 } 16770 } 16771 func rewriteValueARM_OpSub8(v *Value, config *Config) bool { 16772 b := v.Block 16773 _ = b 16774 // match: (Sub8 x y) 16775 // cond: 16776 // result: (SUB x y) 16777 for { 16778 x := v.Args[0] 16779 y := v.Args[1] 16780 v.reset(OpARMSUB) 16781 v.AddArg(x) 16782 v.AddArg(y) 16783 return true 16784 } 16785 } 16786 func rewriteValueARM_OpSubPtr(v *Value, config *Config) bool { 16787 b := v.Block 16788 _ = b 16789 // match: (SubPtr x y) 16790 // cond: 16791 // result: (SUB x y) 16792 for { 16793 x := v.Args[0] 16794 y := v.Args[1] 16795 v.reset(OpARMSUB) 16796 v.AddArg(x) 16797 v.AddArg(y) 16798 return true 16799 } 16800 } 16801 func rewriteValueARM_OpTrunc16to8(v *Value, config *Config) bool { 16802 b := v.Block 16803 _ = b 16804 // match: (Trunc16to8 x) 16805 // cond: 16806 // result: x 16807 for { 16808 x := v.Args[0] 16809 v.reset(OpCopy) 16810 v.Type = x.Type 16811 v.AddArg(x) 16812 return true 16813 } 16814 } 16815 func rewriteValueARM_OpTrunc32to16(v *Value, config *Config) bool { 16816 b := v.Block 16817 _ = b 16818 // match: (Trunc32to16 x) 16819 // cond: 16820 // result: x 16821 for { 16822 x := v.Args[0] 16823 v.reset(OpCopy) 16824 v.Type = x.Type 16825 v.AddArg(x) 16826 return true 16827 } 16828 } 16829 func rewriteValueARM_OpTrunc32to8(v *Value, config *Config) bool { 16830 b := v.Block 16831 _ = b 16832 // match: (Trunc32to8 x) 16833 // cond: 16834 // result: x 16835 for { 16836 x := v.Args[0] 16837 v.reset(OpCopy) 16838 v.Type = x.Type 16839 v.AddArg(x) 16840 return true 16841 } 16842 } 16843 func rewriteValueARM_OpXor16(v *Value, config *Config) bool { 16844 b := v.Block 16845 _ = b 16846 // match: (Xor16 x y) 16847 // cond: 16848 // result: (XOR x y) 16849 for { 16850 x := v.Args[0] 16851 y := v.Args[1] 16852 v.reset(OpARMXOR) 16853 v.AddArg(x) 16854 v.AddArg(y) 16855 return true 16856 } 16857 } 16858 func rewriteValueARM_OpXor32(v *Value, config *Config) bool { 16859 b := v.Block 16860 _ = b 16861 // match: (Xor32 x y) 16862 // cond: 16863 // result: (XOR x y) 16864 for { 16865 x := v.Args[0] 16866 y := v.Args[1] 16867 v.reset(OpARMXOR) 16868 v.AddArg(x) 16869 v.AddArg(y) 16870 return true 16871 } 16872 } 16873 func rewriteValueARM_OpXor8(v *Value, config *Config) bool { 16874 b := v.Block 16875 _ = b 16876 // match: (Xor8 x y) 16877 // cond: 16878 // result: (XOR x y) 16879 for { 16880 x := v.Args[0] 16881 y := v.Args[1] 16882 v.reset(OpARMXOR) 16883 v.AddArg(x) 16884 v.AddArg(y) 16885 return true 16886 } 16887 } 16888 func rewriteValueARM_OpZero(v *Value, config *Config) bool { 16889 b := v.Block 16890 _ = b 16891 // match: (Zero [s] _ mem) 16892 // cond: SizeAndAlign(s).Size() == 0 16893 // result: mem 16894 for { 16895 s := v.AuxInt 16896 mem := v.Args[1] 16897 if !(SizeAndAlign(s).Size() == 0) { 16898 break 16899 } 16900 v.reset(OpCopy) 16901 v.Type = mem.Type 16902 v.AddArg(mem) 16903 return true 16904 } 16905 // match: (Zero [s] ptr mem) 16906 // cond: SizeAndAlign(s).Size() == 1 16907 // result: (MOVBstore ptr (MOVWconst [0]) mem) 16908 for { 16909 s := v.AuxInt 16910 ptr := v.Args[0] 16911 mem := v.Args[1] 16912 if !(SizeAndAlign(s).Size() == 1) { 16913 break 16914 } 16915 v.reset(OpARMMOVBstore) 16916 v.AddArg(ptr) 16917 v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 16918 v0.AuxInt = 0 16919 v.AddArg(v0) 16920 v.AddArg(mem) 16921 return true 16922 } 16923 // match: (Zero [s] ptr mem) 16924 // cond: SizeAndAlign(s).Size() == 2 && SizeAndAlign(s).Align()%2 == 0 16925 // result: (MOVHstore ptr (MOVWconst [0]) mem) 16926 for { 16927 s := v.AuxInt 16928 ptr := v.Args[0] 16929 mem := v.Args[1] 16930 if !(SizeAndAlign(s).Size() == 2 && SizeAndAlign(s).Align()%2 == 0) { 16931 break 16932 } 16933 v.reset(OpARMMOVHstore) 16934 v.AddArg(ptr) 16935 v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 16936 v0.AuxInt = 0 16937 v.AddArg(v0) 16938 v.AddArg(mem) 16939 return true 16940 } 16941 // match: (Zero [s] ptr mem) 16942 // cond: SizeAndAlign(s).Size() == 2 16943 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 16944 for { 16945 s := v.AuxInt 16946 ptr := v.Args[0] 16947 mem := v.Args[1] 16948 if !(SizeAndAlign(s).Size() == 2) { 16949 break 16950 } 16951 v.reset(OpARMMOVBstore) 16952 v.AuxInt = 1 16953 v.AddArg(ptr) 16954 v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 16955 v0.AuxInt = 0 16956 v.AddArg(v0) 16957 v1 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 16958 v1.AuxInt = 0 16959 v1.AddArg(ptr) 16960 v2 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 16961 v2.AuxInt = 0 16962 v1.AddArg(v2) 16963 v1.AddArg(mem) 16964 v.AddArg(v1) 16965 return true 16966 } 16967 // match: (Zero [s] ptr mem) 16968 // cond: SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%4 == 0 16969 // result: (MOVWstore ptr (MOVWconst [0]) mem) 16970 for { 16971 s := v.AuxInt 16972 ptr := v.Args[0] 16973 mem := v.Args[1] 16974 if !(SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%4 == 0) { 16975 break 16976 } 16977 v.reset(OpARMMOVWstore) 16978 v.AddArg(ptr) 16979 v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 16980 v0.AuxInt = 0 16981 v.AddArg(v0) 16982 v.AddArg(mem) 16983 return true 16984 } 16985 // match: (Zero [s] ptr mem) 16986 // cond: SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%2 == 0 16987 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 16988 for { 16989 s := v.AuxInt 16990 ptr := v.Args[0] 16991 mem := v.Args[1] 16992 if !(SizeAndAlign(s).Size() == 4 && SizeAndAlign(s).Align()%2 == 0) { 16993 break 16994 } 16995 v.reset(OpARMMOVHstore) 16996 v.AuxInt = 2 16997 v.AddArg(ptr) 16998 v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 16999 v0.AuxInt = 0 17000 v.AddArg(v0) 17001 v1 := b.NewValue0(v.Line, OpARMMOVHstore, TypeMem) 17002 v1.AuxInt = 0 17003 v1.AddArg(ptr) 17004 v2 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17005 v2.AuxInt = 0 17006 v1.AddArg(v2) 17007 v1.AddArg(mem) 17008 v.AddArg(v1) 17009 return true 17010 } 17011 // match: (Zero [s] ptr mem) 17012 // cond: SizeAndAlign(s).Size() == 4 17013 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 17014 for { 17015 s := v.AuxInt 17016 ptr := v.Args[0] 17017 mem := v.Args[1] 17018 if !(SizeAndAlign(s).Size() == 4) { 17019 break 17020 } 17021 v.reset(OpARMMOVBstore) 17022 v.AuxInt = 3 17023 v.AddArg(ptr) 17024 v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17025 v0.AuxInt = 0 17026 v.AddArg(v0) 17027 v1 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 17028 v1.AuxInt = 2 17029 v1.AddArg(ptr) 17030 v2 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17031 v2.AuxInt = 0 17032 v1.AddArg(v2) 17033 v3 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 17034 v3.AuxInt = 1 17035 v3.AddArg(ptr) 17036 v4 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17037 v4.AuxInt = 0 17038 v3.AddArg(v4) 17039 v5 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 17040 v5.AuxInt = 0 17041 v5.AddArg(ptr) 17042 v6 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17043 v6.AuxInt = 0 17044 v5.AddArg(v6) 17045 v5.AddArg(mem) 17046 v3.AddArg(v5) 17047 v1.AddArg(v3) 17048 v.AddArg(v1) 17049 return true 17050 } 17051 // match: (Zero [s] ptr mem) 17052 // cond: SizeAndAlign(s).Size() == 3 17053 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 17054 for { 17055 s := v.AuxInt 17056 ptr := v.Args[0] 17057 mem := v.Args[1] 17058 if !(SizeAndAlign(s).Size() == 3) { 17059 break 17060 } 17061 v.reset(OpARMMOVBstore) 17062 v.AuxInt = 2 17063 v.AddArg(ptr) 17064 v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17065 v0.AuxInt = 0 17066 v.AddArg(v0) 17067 v1 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 17068 v1.AuxInt = 1 17069 v1.AddArg(ptr) 17070 v2 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17071 v2.AuxInt = 0 17072 v1.AddArg(v2) 17073 v3 := b.NewValue0(v.Line, OpARMMOVBstore, TypeMem) 17074 v3.AuxInt = 0 17075 v3.AddArg(ptr) 17076 v4 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17077 v4.AuxInt = 0 17078 v3.AddArg(v4) 17079 v3.AddArg(mem) 17080 v1.AddArg(v3) 17081 v.AddArg(v1) 17082 return true 17083 } 17084 // match: (Zero [s] ptr mem) 17085 // cond: SizeAndAlign(s).Size()%4 == 0 && SizeAndAlign(s).Size() > 4 && SizeAndAlign(s).Size() <= 512 && SizeAndAlign(s).Align()%4 == 0 && !config.noDuffDevice 17086 // result: (DUFFZERO [4 * (128 - int64(SizeAndAlign(s).Size()/4))] ptr (MOVWconst [0]) mem) 17087 for { 17088 s := v.AuxInt 17089 ptr := v.Args[0] 17090 mem := v.Args[1] 17091 if !(SizeAndAlign(s).Size()%4 == 0 && SizeAndAlign(s).Size() > 4 && SizeAndAlign(s).Size() <= 512 && SizeAndAlign(s).Align()%4 == 0 && !config.noDuffDevice) { 17092 break 17093 } 17094 v.reset(OpARMDUFFZERO) 17095 v.AuxInt = 4 * (128 - int64(SizeAndAlign(s).Size()/4)) 17096 v.AddArg(ptr) 17097 v0 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17098 v0.AuxInt = 0 17099 v.AddArg(v0) 17100 v.AddArg(mem) 17101 return true 17102 } 17103 // match: (Zero [s] ptr mem) 17104 // cond: (SizeAndAlign(s).Size() > 512 || config.noDuffDevice) || SizeAndAlign(s).Align()%4 != 0 17105 // result: (LoweredZero [SizeAndAlign(s).Align()] ptr (ADDconst <ptr.Type> ptr [SizeAndAlign(s).Size()-moveSize(SizeAndAlign(s).Align(), config)]) (MOVWconst [0]) mem) 17106 for { 17107 s := v.AuxInt 17108 ptr := v.Args[0] 17109 mem := v.Args[1] 17110 if !((SizeAndAlign(s).Size() > 512 || config.noDuffDevice) || SizeAndAlign(s).Align()%4 != 0) { 17111 break 17112 } 17113 v.reset(OpARMLoweredZero) 17114 v.AuxInt = SizeAndAlign(s).Align() 17115 v.AddArg(ptr) 17116 v0 := b.NewValue0(v.Line, OpARMADDconst, ptr.Type) 17117 v0.AuxInt = SizeAndAlign(s).Size() - moveSize(SizeAndAlign(s).Align(), config) 17118 v0.AddArg(ptr) 17119 v.AddArg(v0) 17120 v1 := b.NewValue0(v.Line, OpARMMOVWconst, config.fe.TypeUInt32()) 17121 v1.AuxInt = 0 17122 v.AddArg(v1) 17123 v.AddArg(mem) 17124 return true 17125 } 17126 return false 17127 } 17128 func rewriteValueARM_OpZeroExt16to32(v *Value, config *Config) bool { 17129 b := v.Block 17130 _ = b 17131 // match: (ZeroExt16to32 x) 17132 // cond: 17133 // result: (MOVHUreg x) 17134 for { 17135 x := v.Args[0] 17136 v.reset(OpARMMOVHUreg) 17137 v.AddArg(x) 17138 return true 17139 } 17140 } 17141 func rewriteValueARM_OpZeroExt8to16(v *Value, config *Config) bool { 17142 b := v.Block 17143 _ = b 17144 // match: (ZeroExt8to16 x) 17145 // cond: 17146 // result: (MOVBUreg x) 17147 for { 17148 x := v.Args[0] 17149 v.reset(OpARMMOVBUreg) 17150 v.AddArg(x) 17151 return true 17152 } 17153 } 17154 func rewriteValueARM_OpZeroExt8to32(v *Value, config *Config) bool { 17155 b := v.Block 17156 _ = b 17157 // match: (ZeroExt8to32 x) 17158 // cond: 17159 // result: (MOVBUreg x) 17160 for { 17161 x := v.Args[0] 17162 v.reset(OpARMMOVBUreg) 17163 v.AddArg(x) 17164 return true 17165 } 17166 } 17167 func rewriteValueARM_OpZeromask(v *Value, config *Config) bool { 17168 b := v.Block 17169 _ = b 17170 // match: (Zeromask x) 17171 // cond: 17172 // result: (SRAconst (RSBshiftRL <config.fe.TypeInt32()> x x [1]) [31]) 17173 for { 17174 x := v.Args[0] 17175 v.reset(OpARMSRAconst) 17176 v.AuxInt = 31 17177 v0 := b.NewValue0(v.Line, OpARMRSBshiftRL, config.fe.TypeInt32()) 17178 v0.AuxInt = 1 17179 v0.AddArg(x) 17180 v0.AddArg(x) 17181 v.AddArg(v0) 17182 return true 17183 } 17184 } 17185 func rewriteBlockARM(b *Block, config *Config) bool { 17186 switch b.Kind { 17187 case BlockARMEQ: 17188 // match: (EQ (FlagEQ) yes no) 17189 // cond: 17190 // result: (First nil yes no) 17191 for { 17192 v := b.Control 17193 if v.Op != OpARMFlagEQ { 17194 break 17195 } 17196 yes := b.Succs[0] 17197 no := b.Succs[1] 17198 b.Kind = BlockFirst 17199 b.SetControl(nil) 17200 _ = yes 17201 _ = no 17202 return true 17203 } 17204 // match: (EQ (FlagLT_ULT) yes no) 17205 // cond: 17206 // result: (First nil no yes) 17207 for { 17208 v := b.Control 17209 if v.Op != OpARMFlagLT_ULT { 17210 break 17211 } 17212 yes := b.Succs[0] 17213 no := b.Succs[1] 17214 b.Kind = BlockFirst 17215 b.SetControl(nil) 17216 b.swapSuccessors() 17217 _ = no 17218 _ = yes 17219 return true 17220 } 17221 // match: (EQ (FlagLT_UGT) yes no) 17222 // cond: 17223 // result: (First nil no yes) 17224 for { 17225 v := b.Control 17226 if v.Op != OpARMFlagLT_UGT { 17227 break 17228 } 17229 yes := b.Succs[0] 17230 no := b.Succs[1] 17231 b.Kind = BlockFirst 17232 b.SetControl(nil) 17233 b.swapSuccessors() 17234 _ = no 17235 _ = yes 17236 return true 17237 } 17238 // match: (EQ (FlagGT_ULT) yes no) 17239 // cond: 17240 // result: (First nil no yes) 17241 for { 17242 v := b.Control 17243 if v.Op != OpARMFlagGT_ULT { 17244 break 17245 } 17246 yes := b.Succs[0] 17247 no := b.Succs[1] 17248 b.Kind = BlockFirst 17249 b.SetControl(nil) 17250 b.swapSuccessors() 17251 _ = no 17252 _ = yes 17253 return true 17254 } 17255 // match: (EQ (FlagGT_UGT) yes no) 17256 // cond: 17257 // result: (First nil no yes) 17258 for { 17259 v := b.Control 17260 if v.Op != OpARMFlagGT_UGT { 17261 break 17262 } 17263 yes := b.Succs[0] 17264 no := b.Succs[1] 17265 b.Kind = BlockFirst 17266 b.SetControl(nil) 17267 b.swapSuccessors() 17268 _ = no 17269 _ = yes 17270 return true 17271 } 17272 // match: (EQ (InvertFlags cmp) yes no) 17273 // cond: 17274 // result: (EQ cmp yes no) 17275 for { 17276 v := b.Control 17277 if v.Op != OpARMInvertFlags { 17278 break 17279 } 17280 cmp := v.Args[0] 17281 yes := b.Succs[0] 17282 no := b.Succs[1] 17283 b.Kind = BlockARMEQ 17284 b.SetControl(cmp) 17285 _ = yes 17286 _ = no 17287 return true 17288 } 17289 case BlockARMGE: 17290 // match: (GE (FlagEQ) yes no) 17291 // cond: 17292 // result: (First nil yes no) 17293 for { 17294 v := b.Control 17295 if v.Op != OpARMFlagEQ { 17296 break 17297 } 17298 yes := b.Succs[0] 17299 no := b.Succs[1] 17300 b.Kind = BlockFirst 17301 b.SetControl(nil) 17302 _ = yes 17303 _ = no 17304 return true 17305 } 17306 // match: (GE (FlagLT_ULT) yes no) 17307 // cond: 17308 // result: (First nil no yes) 17309 for { 17310 v := b.Control 17311 if v.Op != OpARMFlagLT_ULT { 17312 break 17313 } 17314 yes := b.Succs[0] 17315 no := b.Succs[1] 17316 b.Kind = BlockFirst 17317 b.SetControl(nil) 17318 b.swapSuccessors() 17319 _ = no 17320 _ = yes 17321 return true 17322 } 17323 // match: (GE (FlagLT_UGT) yes no) 17324 // cond: 17325 // result: (First nil no yes) 17326 for { 17327 v := b.Control 17328 if v.Op != OpARMFlagLT_UGT { 17329 break 17330 } 17331 yes := b.Succs[0] 17332 no := b.Succs[1] 17333 b.Kind = BlockFirst 17334 b.SetControl(nil) 17335 b.swapSuccessors() 17336 _ = no 17337 _ = yes 17338 return true 17339 } 17340 // match: (GE (FlagGT_ULT) yes no) 17341 // cond: 17342 // result: (First nil yes no) 17343 for { 17344 v := b.Control 17345 if v.Op != OpARMFlagGT_ULT { 17346 break 17347 } 17348 yes := b.Succs[0] 17349 no := b.Succs[1] 17350 b.Kind = BlockFirst 17351 b.SetControl(nil) 17352 _ = yes 17353 _ = no 17354 return true 17355 } 17356 // match: (GE (FlagGT_UGT) yes no) 17357 // cond: 17358 // result: (First nil yes no) 17359 for { 17360 v := b.Control 17361 if v.Op != OpARMFlagGT_UGT { 17362 break 17363 } 17364 yes := b.Succs[0] 17365 no := b.Succs[1] 17366 b.Kind = BlockFirst 17367 b.SetControl(nil) 17368 _ = yes 17369 _ = no 17370 return true 17371 } 17372 // match: (GE (InvertFlags cmp) yes no) 17373 // cond: 17374 // result: (LE cmp yes no) 17375 for { 17376 v := b.Control 17377 if v.Op != OpARMInvertFlags { 17378 break 17379 } 17380 cmp := v.Args[0] 17381 yes := b.Succs[0] 17382 no := b.Succs[1] 17383 b.Kind = BlockARMLE 17384 b.SetControl(cmp) 17385 _ = yes 17386 _ = no 17387 return true 17388 } 17389 case BlockARMGT: 17390 // match: (GT (FlagEQ) yes no) 17391 // cond: 17392 // result: (First nil no yes) 17393 for { 17394 v := b.Control 17395 if v.Op != OpARMFlagEQ { 17396 break 17397 } 17398 yes := b.Succs[0] 17399 no := b.Succs[1] 17400 b.Kind = BlockFirst 17401 b.SetControl(nil) 17402 b.swapSuccessors() 17403 _ = no 17404 _ = yes 17405 return true 17406 } 17407 // match: (GT (FlagLT_ULT) yes no) 17408 // cond: 17409 // result: (First nil no yes) 17410 for { 17411 v := b.Control 17412 if v.Op != OpARMFlagLT_ULT { 17413 break 17414 } 17415 yes := b.Succs[0] 17416 no := b.Succs[1] 17417 b.Kind = BlockFirst 17418 b.SetControl(nil) 17419 b.swapSuccessors() 17420 _ = no 17421 _ = yes 17422 return true 17423 } 17424 // match: (GT (FlagLT_UGT) yes no) 17425 // cond: 17426 // result: (First nil no yes) 17427 for { 17428 v := b.Control 17429 if v.Op != OpARMFlagLT_UGT { 17430 break 17431 } 17432 yes := b.Succs[0] 17433 no := b.Succs[1] 17434 b.Kind = BlockFirst 17435 b.SetControl(nil) 17436 b.swapSuccessors() 17437 _ = no 17438 _ = yes 17439 return true 17440 } 17441 // match: (GT (FlagGT_ULT) yes no) 17442 // cond: 17443 // result: (First nil yes no) 17444 for { 17445 v := b.Control 17446 if v.Op != OpARMFlagGT_ULT { 17447 break 17448 } 17449 yes := b.Succs[0] 17450 no := b.Succs[1] 17451 b.Kind = BlockFirst 17452 b.SetControl(nil) 17453 _ = yes 17454 _ = no 17455 return true 17456 } 17457 // match: (GT (FlagGT_UGT) yes no) 17458 // cond: 17459 // result: (First nil yes no) 17460 for { 17461 v := b.Control 17462 if v.Op != OpARMFlagGT_UGT { 17463 break 17464 } 17465 yes := b.Succs[0] 17466 no := b.Succs[1] 17467 b.Kind = BlockFirst 17468 b.SetControl(nil) 17469 _ = yes 17470 _ = no 17471 return true 17472 } 17473 // match: (GT (InvertFlags cmp) yes no) 17474 // cond: 17475 // result: (LT cmp yes no) 17476 for { 17477 v := b.Control 17478 if v.Op != OpARMInvertFlags { 17479 break 17480 } 17481 cmp := v.Args[0] 17482 yes := b.Succs[0] 17483 no := b.Succs[1] 17484 b.Kind = BlockARMLT 17485 b.SetControl(cmp) 17486 _ = yes 17487 _ = no 17488 return true 17489 } 17490 case BlockIf: 17491 // match: (If (Equal cc) yes no) 17492 // cond: 17493 // result: (EQ cc yes no) 17494 for { 17495 v := b.Control 17496 if v.Op != OpARMEqual { 17497 break 17498 } 17499 cc := v.Args[0] 17500 yes := b.Succs[0] 17501 no := b.Succs[1] 17502 b.Kind = BlockARMEQ 17503 b.SetControl(cc) 17504 _ = yes 17505 _ = no 17506 return true 17507 } 17508 // match: (If (NotEqual cc) yes no) 17509 // cond: 17510 // result: (NE cc yes no) 17511 for { 17512 v := b.Control 17513 if v.Op != OpARMNotEqual { 17514 break 17515 } 17516 cc := v.Args[0] 17517 yes := b.Succs[0] 17518 no := b.Succs[1] 17519 b.Kind = BlockARMNE 17520 b.SetControl(cc) 17521 _ = yes 17522 _ = no 17523 return true 17524 } 17525 // match: (If (LessThan cc) yes no) 17526 // cond: 17527 // result: (LT cc yes no) 17528 for { 17529 v := b.Control 17530 if v.Op != OpARMLessThan { 17531 break 17532 } 17533 cc := v.Args[0] 17534 yes := b.Succs[0] 17535 no := b.Succs[1] 17536 b.Kind = BlockARMLT 17537 b.SetControl(cc) 17538 _ = yes 17539 _ = no 17540 return true 17541 } 17542 // match: (If (LessThanU cc) yes no) 17543 // cond: 17544 // result: (ULT cc yes no) 17545 for { 17546 v := b.Control 17547 if v.Op != OpARMLessThanU { 17548 break 17549 } 17550 cc := v.Args[0] 17551 yes := b.Succs[0] 17552 no := b.Succs[1] 17553 b.Kind = BlockARMULT 17554 b.SetControl(cc) 17555 _ = yes 17556 _ = no 17557 return true 17558 } 17559 // match: (If (LessEqual cc) yes no) 17560 // cond: 17561 // result: (LE cc yes no) 17562 for { 17563 v := b.Control 17564 if v.Op != OpARMLessEqual { 17565 break 17566 } 17567 cc := v.Args[0] 17568 yes := b.Succs[0] 17569 no := b.Succs[1] 17570 b.Kind = BlockARMLE 17571 b.SetControl(cc) 17572 _ = yes 17573 _ = no 17574 return true 17575 } 17576 // match: (If (LessEqualU cc) yes no) 17577 // cond: 17578 // result: (ULE cc yes no) 17579 for { 17580 v := b.Control 17581 if v.Op != OpARMLessEqualU { 17582 break 17583 } 17584 cc := v.Args[0] 17585 yes := b.Succs[0] 17586 no := b.Succs[1] 17587 b.Kind = BlockARMULE 17588 b.SetControl(cc) 17589 _ = yes 17590 _ = no 17591 return true 17592 } 17593 // match: (If (GreaterThan cc) yes no) 17594 // cond: 17595 // result: (GT cc yes no) 17596 for { 17597 v := b.Control 17598 if v.Op != OpARMGreaterThan { 17599 break 17600 } 17601 cc := v.Args[0] 17602 yes := b.Succs[0] 17603 no := b.Succs[1] 17604 b.Kind = BlockARMGT 17605 b.SetControl(cc) 17606 _ = yes 17607 _ = no 17608 return true 17609 } 17610 // match: (If (GreaterThanU cc) yes no) 17611 // cond: 17612 // result: (UGT cc yes no) 17613 for { 17614 v := b.Control 17615 if v.Op != OpARMGreaterThanU { 17616 break 17617 } 17618 cc := v.Args[0] 17619 yes := b.Succs[0] 17620 no := b.Succs[1] 17621 b.Kind = BlockARMUGT 17622 b.SetControl(cc) 17623 _ = yes 17624 _ = no 17625 return true 17626 } 17627 // match: (If (GreaterEqual cc) yes no) 17628 // cond: 17629 // result: (GE cc yes no) 17630 for { 17631 v := b.Control 17632 if v.Op != OpARMGreaterEqual { 17633 break 17634 } 17635 cc := v.Args[0] 17636 yes := b.Succs[0] 17637 no := b.Succs[1] 17638 b.Kind = BlockARMGE 17639 b.SetControl(cc) 17640 _ = yes 17641 _ = no 17642 return true 17643 } 17644 // match: (If (GreaterEqualU cc) yes no) 17645 // cond: 17646 // result: (UGE cc yes no) 17647 for { 17648 v := b.Control 17649 if v.Op != OpARMGreaterEqualU { 17650 break 17651 } 17652 cc := v.Args[0] 17653 yes := b.Succs[0] 17654 no := b.Succs[1] 17655 b.Kind = BlockARMUGE 17656 b.SetControl(cc) 17657 _ = yes 17658 _ = no 17659 return true 17660 } 17661 // match: (If cond yes no) 17662 // cond: 17663 // result: (NE (CMPconst [0] cond) yes no) 17664 for { 17665 v := b.Control 17666 _ = v 17667 cond := b.Control 17668 yes := b.Succs[0] 17669 no := b.Succs[1] 17670 b.Kind = BlockARMNE 17671 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 17672 v0.AuxInt = 0 17673 v0.AddArg(cond) 17674 b.SetControl(v0) 17675 _ = yes 17676 _ = no 17677 return true 17678 } 17679 case BlockARMLE: 17680 // match: (LE (FlagEQ) yes no) 17681 // cond: 17682 // result: (First nil yes no) 17683 for { 17684 v := b.Control 17685 if v.Op != OpARMFlagEQ { 17686 break 17687 } 17688 yes := b.Succs[0] 17689 no := b.Succs[1] 17690 b.Kind = BlockFirst 17691 b.SetControl(nil) 17692 _ = yes 17693 _ = no 17694 return true 17695 } 17696 // match: (LE (FlagLT_ULT) yes no) 17697 // cond: 17698 // result: (First nil yes no) 17699 for { 17700 v := b.Control 17701 if v.Op != OpARMFlagLT_ULT { 17702 break 17703 } 17704 yes := b.Succs[0] 17705 no := b.Succs[1] 17706 b.Kind = BlockFirst 17707 b.SetControl(nil) 17708 _ = yes 17709 _ = no 17710 return true 17711 } 17712 // match: (LE (FlagLT_UGT) yes no) 17713 // cond: 17714 // result: (First nil yes no) 17715 for { 17716 v := b.Control 17717 if v.Op != OpARMFlagLT_UGT { 17718 break 17719 } 17720 yes := b.Succs[0] 17721 no := b.Succs[1] 17722 b.Kind = BlockFirst 17723 b.SetControl(nil) 17724 _ = yes 17725 _ = no 17726 return true 17727 } 17728 // match: (LE (FlagGT_ULT) yes no) 17729 // cond: 17730 // result: (First nil no yes) 17731 for { 17732 v := b.Control 17733 if v.Op != OpARMFlagGT_ULT { 17734 break 17735 } 17736 yes := b.Succs[0] 17737 no := b.Succs[1] 17738 b.Kind = BlockFirst 17739 b.SetControl(nil) 17740 b.swapSuccessors() 17741 _ = no 17742 _ = yes 17743 return true 17744 } 17745 // match: (LE (FlagGT_UGT) yes no) 17746 // cond: 17747 // result: (First nil no yes) 17748 for { 17749 v := b.Control 17750 if v.Op != OpARMFlagGT_UGT { 17751 break 17752 } 17753 yes := b.Succs[0] 17754 no := b.Succs[1] 17755 b.Kind = BlockFirst 17756 b.SetControl(nil) 17757 b.swapSuccessors() 17758 _ = no 17759 _ = yes 17760 return true 17761 } 17762 // match: (LE (InvertFlags cmp) yes no) 17763 // cond: 17764 // result: (GE cmp yes no) 17765 for { 17766 v := b.Control 17767 if v.Op != OpARMInvertFlags { 17768 break 17769 } 17770 cmp := v.Args[0] 17771 yes := b.Succs[0] 17772 no := b.Succs[1] 17773 b.Kind = BlockARMGE 17774 b.SetControl(cmp) 17775 _ = yes 17776 _ = no 17777 return true 17778 } 17779 case BlockARMLT: 17780 // match: (LT (FlagEQ) yes no) 17781 // cond: 17782 // result: (First nil no yes) 17783 for { 17784 v := b.Control 17785 if v.Op != OpARMFlagEQ { 17786 break 17787 } 17788 yes := b.Succs[0] 17789 no := b.Succs[1] 17790 b.Kind = BlockFirst 17791 b.SetControl(nil) 17792 b.swapSuccessors() 17793 _ = no 17794 _ = yes 17795 return true 17796 } 17797 // match: (LT (FlagLT_ULT) yes no) 17798 // cond: 17799 // result: (First nil yes no) 17800 for { 17801 v := b.Control 17802 if v.Op != OpARMFlagLT_ULT { 17803 break 17804 } 17805 yes := b.Succs[0] 17806 no := b.Succs[1] 17807 b.Kind = BlockFirst 17808 b.SetControl(nil) 17809 _ = yes 17810 _ = no 17811 return true 17812 } 17813 // match: (LT (FlagLT_UGT) yes no) 17814 // cond: 17815 // result: (First nil yes no) 17816 for { 17817 v := b.Control 17818 if v.Op != OpARMFlagLT_UGT { 17819 break 17820 } 17821 yes := b.Succs[0] 17822 no := b.Succs[1] 17823 b.Kind = BlockFirst 17824 b.SetControl(nil) 17825 _ = yes 17826 _ = no 17827 return true 17828 } 17829 // match: (LT (FlagGT_ULT) yes no) 17830 // cond: 17831 // result: (First nil no yes) 17832 for { 17833 v := b.Control 17834 if v.Op != OpARMFlagGT_ULT { 17835 break 17836 } 17837 yes := b.Succs[0] 17838 no := b.Succs[1] 17839 b.Kind = BlockFirst 17840 b.SetControl(nil) 17841 b.swapSuccessors() 17842 _ = no 17843 _ = yes 17844 return true 17845 } 17846 // match: (LT (FlagGT_UGT) yes no) 17847 // cond: 17848 // result: (First nil no yes) 17849 for { 17850 v := b.Control 17851 if v.Op != OpARMFlagGT_UGT { 17852 break 17853 } 17854 yes := b.Succs[0] 17855 no := b.Succs[1] 17856 b.Kind = BlockFirst 17857 b.SetControl(nil) 17858 b.swapSuccessors() 17859 _ = no 17860 _ = yes 17861 return true 17862 } 17863 // match: (LT (InvertFlags cmp) yes no) 17864 // cond: 17865 // result: (GT cmp yes no) 17866 for { 17867 v := b.Control 17868 if v.Op != OpARMInvertFlags { 17869 break 17870 } 17871 cmp := v.Args[0] 17872 yes := b.Succs[0] 17873 no := b.Succs[1] 17874 b.Kind = BlockARMGT 17875 b.SetControl(cmp) 17876 _ = yes 17877 _ = no 17878 return true 17879 } 17880 case BlockARMNE: 17881 // match: (NE (CMPconst [0] (Equal cc)) yes no) 17882 // cond: 17883 // result: (EQ cc yes no) 17884 for { 17885 v := b.Control 17886 if v.Op != OpARMCMPconst { 17887 break 17888 } 17889 if v.AuxInt != 0 { 17890 break 17891 } 17892 v_0 := v.Args[0] 17893 if v_0.Op != OpARMEqual { 17894 break 17895 } 17896 cc := v_0.Args[0] 17897 yes := b.Succs[0] 17898 no := b.Succs[1] 17899 b.Kind = BlockARMEQ 17900 b.SetControl(cc) 17901 _ = yes 17902 _ = no 17903 return true 17904 } 17905 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 17906 // cond: 17907 // result: (NE cc yes no) 17908 for { 17909 v := b.Control 17910 if v.Op != OpARMCMPconst { 17911 break 17912 } 17913 if v.AuxInt != 0 { 17914 break 17915 } 17916 v_0 := v.Args[0] 17917 if v_0.Op != OpARMNotEqual { 17918 break 17919 } 17920 cc := v_0.Args[0] 17921 yes := b.Succs[0] 17922 no := b.Succs[1] 17923 b.Kind = BlockARMNE 17924 b.SetControl(cc) 17925 _ = yes 17926 _ = no 17927 return true 17928 } 17929 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 17930 // cond: 17931 // result: (LT cc yes no) 17932 for { 17933 v := b.Control 17934 if v.Op != OpARMCMPconst { 17935 break 17936 } 17937 if v.AuxInt != 0 { 17938 break 17939 } 17940 v_0 := v.Args[0] 17941 if v_0.Op != OpARMLessThan { 17942 break 17943 } 17944 cc := v_0.Args[0] 17945 yes := b.Succs[0] 17946 no := b.Succs[1] 17947 b.Kind = BlockARMLT 17948 b.SetControl(cc) 17949 _ = yes 17950 _ = no 17951 return true 17952 } 17953 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 17954 // cond: 17955 // result: (ULT cc yes no) 17956 for { 17957 v := b.Control 17958 if v.Op != OpARMCMPconst { 17959 break 17960 } 17961 if v.AuxInt != 0 { 17962 break 17963 } 17964 v_0 := v.Args[0] 17965 if v_0.Op != OpARMLessThanU { 17966 break 17967 } 17968 cc := v_0.Args[0] 17969 yes := b.Succs[0] 17970 no := b.Succs[1] 17971 b.Kind = BlockARMULT 17972 b.SetControl(cc) 17973 _ = yes 17974 _ = no 17975 return true 17976 } 17977 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 17978 // cond: 17979 // result: (LE cc yes no) 17980 for { 17981 v := b.Control 17982 if v.Op != OpARMCMPconst { 17983 break 17984 } 17985 if v.AuxInt != 0 { 17986 break 17987 } 17988 v_0 := v.Args[0] 17989 if v_0.Op != OpARMLessEqual { 17990 break 17991 } 17992 cc := v_0.Args[0] 17993 yes := b.Succs[0] 17994 no := b.Succs[1] 17995 b.Kind = BlockARMLE 17996 b.SetControl(cc) 17997 _ = yes 17998 _ = no 17999 return true 18000 } 18001 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 18002 // cond: 18003 // result: (ULE cc yes no) 18004 for { 18005 v := b.Control 18006 if v.Op != OpARMCMPconst { 18007 break 18008 } 18009 if v.AuxInt != 0 { 18010 break 18011 } 18012 v_0 := v.Args[0] 18013 if v_0.Op != OpARMLessEqualU { 18014 break 18015 } 18016 cc := v_0.Args[0] 18017 yes := b.Succs[0] 18018 no := b.Succs[1] 18019 b.Kind = BlockARMULE 18020 b.SetControl(cc) 18021 _ = yes 18022 _ = no 18023 return true 18024 } 18025 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 18026 // cond: 18027 // result: (GT cc yes no) 18028 for { 18029 v := b.Control 18030 if v.Op != OpARMCMPconst { 18031 break 18032 } 18033 if v.AuxInt != 0 { 18034 break 18035 } 18036 v_0 := v.Args[0] 18037 if v_0.Op != OpARMGreaterThan { 18038 break 18039 } 18040 cc := v_0.Args[0] 18041 yes := b.Succs[0] 18042 no := b.Succs[1] 18043 b.Kind = BlockARMGT 18044 b.SetControl(cc) 18045 _ = yes 18046 _ = no 18047 return true 18048 } 18049 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 18050 // cond: 18051 // result: (UGT cc yes no) 18052 for { 18053 v := b.Control 18054 if v.Op != OpARMCMPconst { 18055 break 18056 } 18057 if v.AuxInt != 0 { 18058 break 18059 } 18060 v_0 := v.Args[0] 18061 if v_0.Op != OpARMGreaterThanU { 18062 break 18063 } 18064 cc := v_0.Args[0] 18065 yes := b.Succs[0] 18066 no := b.Succs[1] 18067 b.Kind = BlockARMUGT 18068 b.SetControl(cc) 18069 _ = yes 18070 _ = no 18071 return true 18072 } 18073 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 18074 // cond: 18075 // result: (GE cc yes no) 18076 for { 18077 v := b.Control 18078 if v.Op != OpARMCMPconst { 18079 break 18080 } 18081 if v.AuxInt != 0 { 18082 break 18083 } 18084 v_0 := v.Args[0] 18085 if v_0.Op != OpARMGreaterEqual { 18086 break 18087 } 18088 cc := v_0.Args[0] 18089 yes := b.Succs[0] 18090 no := b.Succs[1] 18091 b.Kind = BlockARMGE 18092 b.SetControl(cc) 18093 _ = yes 18094 _ = no 18095 return true 18096 } 18097 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 18098 // cond: 18099 // result: (UGE cc yes no) 18100 for { 18101 v := b.Control 18102 if v.Op != OpARMCMPconst { 18103 break 18104 } 18105 if v.AuxInt != 0 { 18106 break 18107 } 18108 v_0 := v.Args[0] 18109 if v_0.Op != OpARMGreaterEqualU { 18110 break 18111 } 18112 cc := v_0.Args[0] 18113 yes := b.Succs[0] 18114 no := b.Succs[1] 18115 b.Kind = BlockARMUGE 18116 b.SetControl(cc) 18117 _ = yes 18118 _ = no 18119 return true 18120 } 18121 // match: (NE (FlagEQ) yes no) 18122 // cond: 18123 // result: (First nil no yes) 18124 for { 18125 v := b.Control 18126 if v.Op != OpARMFlagEQ { 18127 break 18128 } 18129 yes := b.Succs[0] 18130 no := b.Succs[1] 18131 b.Kind = BlockFirst 18132 b.SetControl(nil) 18133 b.swapSuccessors() 18134 _ = no 18135 _ = yes 18136 return true 18137 } 18138 // match: (NE (FlagLT_ULT) yes no) 18139 // cond: 18140 // result: (First nil yes no) 18141 for { 18142 v := b.Control 18143 if v.Op != OpARMFlagLT_ULT { 18144 break 18145 } 18146 yes := b.Succs[0] 18147 no := b.Succs[1] 18148 b.Kind = BlockFirst 18149 b.SetControl(nil) 18150 _ = yes 18151 _ = no 18152 return true 18153 } 18154 // match: (NE (FlagLT_UGT) yes no) 18155 // cond: 18156 // result: (First nil yes no) 18157 for { 18158 v := b.Control 18159 if v.Op != OpARMFlagLT_UGT { 18160 break 18161 } 18162 yes := b.Succs[0] 18163 no := b.Succs[1] 18164 b.Kind = BlockFirst 18165 b.SetControl(nil) 18166 _ = yes 18167 _ = no 18168 return true 18169 } 18170 // match: (NE (FlagGT_ULT) yes no) 18171 // cond: 18172 // result: (First nil yes no) 18173 for { 18174 v := b.Control 18175 if v.Op != OpARMFlagGT_ULT { 18176 break 18177 } 18178 yes := b.Succs[0] 18179 no := b.Succs[1] 18180 b.Kind = BlockFirst 18181 b.SetControl(nil) 18182 _ = yes 18183 _ = no 18184 return true 18185 } 18186 // match: (NE (FlagGT_UGT) yes no) 18187 // cond: 18188 // result: (First nil yes no) 18189 for { 18190 v := b.Control 18191 if v.Op != OpARMFlagGT_UGT { 18192 break 18193 } 18194 yes := b.Succs[0] 18195 no := b.Succs[1] 18196 b.Kind = BlockFirst 18197 b.SetControl(nil) 18198 _ = yes 18199 _ = no 18200 return true 18201 } 18202 // match: (NE (InvertFlags cmp) yes no) 18203 // cond: 18204 // result: (NE cmp yes no) 18205 for { 18206 v := b.Control 18207 if v.Op != OpARMInvertFlags { 18208 break 18209 } 18210 cmp := v.Args[0] 18211 yes := b.Succs[0] 18212 no := b.Succs[1] 18213 b.Kind = BlockARMNE 18214 b.SetControl(cmp) 18215 _ = yes 18216 _ = no 18217 return true 18218 } 18219 case BlockARMUGE: 18220 // match: (UGE (FlagEQ) yes no) 18221 // cond: 18222 // result: (First nil yes no) 18223 for { 18224 v := b.Control 18225 if v.Op != OpARMFlagEQ { 18226 break 18227 } 18228 yes := b.Succs[0] 18229 no := b.Succs[1] 18230 b.Kind = BlockFirst 18231 b.SetControl(nil) 18232 _ = yes 18233 _ = no 18234 return true 18235 } 18236 // match: (UGE (FlagLT_ULT) yes no) 18237 // cond: 18238 // result: (First nil no yes) 18239 for { 18240 v := b.Control 18241 if v.Op != OpARMFlagLT_ULT { 18242 break 18243 } 18244 yes := b.Succs[0] 18245 no := b.Succs[1] 18246 b.Kind = BlockFirst 18247 b.SetControl(nil) 18248 b.swapSuccessors() 18249 _ = no 18250 _ = yes 18251 return true 18252 } 18253 // match: (UGE (FlagLT_UGT) yes no) 18254 // cond: 18255 // result: (First nil yes no) 18256 for { 18257 v := b.Control 18258 if v.Op != OpARMFlagLT_UGT { 18259 break 18260 } 18261 yes := b.Succs[0] 18262 no := b.Succs[1] 18263 b.Kind = BlockFirst 18264 b.SetControl(nil) 18265 _ = yes 18266 _ = no 18267 return true 18268 } 18269 // match: (UGE (FlagGT_ULT) yes no) 18270 // cond: 18271 // result: (First nil no yes) 18272 for { 18273 v := b.Control 18274 if v.Op != OpARMFlagGT_ULT { 18275 break 18276 } 18277 yes := b.Succs[0] 18278 no := b.Succs[1] 18279 b.Kind = BlockFirst 18280 b.SetControl(nil) 18281 b.swapSuccessors() 18282 _ = no 18283 _ = yes 18284 return true 18285 } 18286 // match: (UGE (FlagGT_UGT) yes no) 18287 // cond: 18288 // result: (First nil yes no) 18289 for { 18290 v := b.Control 18291 if v.Op != OpARMFlagGT_UGT { 18292 break 18293 } 18294 yes := b.Succs[0] 18295 no := b.Succs[1] 18296 b.Kind = BlockFirst 18297 b.SetControl(nil) 18298 _ = yes 18299 _ = no 18300 return true 18301 } 18302 // match: (UGE (InvertFlags cmp) yes no) 18303 // cond: 18304 // result: (ULE cmp yes no) 18305 for { 18306 v := b.Control 18307 if v.Op != OpARMInvertFlags { 18308 break 18309 } 18310 cmp := v.Args[0] 18311 yes := b.Succs[0] 18312 no := b.Succs[1] 18313 b.Kind = BlockARMULE 18314 b.SetControl(cmp) 18315 _ = yes 18316 _ = no 18317 return true 18318 } 18319 case BlockARMUGT: 18320 // match: (UGT (FlagEQ) yes no) 18321 // cond: 18322 // result: (First nil no yes) 18323 for { 18324 v := b.Control 18325 if v.Op != OpARMFlagEQ { 18326 break 18327 } 18328 yes := b.Succs[0] 18329 no := b.Succs[1] 18330 b.Kind = BlockFirst 18331 b.SetControl(nil) 18332 b.swapSuccessors() 18333 _ = no 18334 _ = yes 18335 return true 18336 } 18337 // match: (UGT (FlagLT_ULT) yes no) 18338 // cond: 18339 // result: (First nil no yes) 18340 for { 18341 v := b.Control 18342 if v.Op != OpARMFlagLT_ULT { 18343 break 18344 } 18345 yes := b.Succs[0] 18346 no := b.Succs[1] 18347 b.Kind = BlockFirst 18348 b.SetControl(nil) 18349 b.swapSuccessors() 18350 _ = no 18351 _ = yes 18352 return true 18353 } 18354 // match: (UGT (FlagLT_UGT) yes no) 18355 // cond: 18356 // result: (First nil yes no) 18357 for { 18358 v := b.Control 18359 if v.Op != OpARMFlagLT_UGT { 18360 break 18361 } 18362 yes := b.Succs[0] 18363 no := b.Succs[1] 18364 b.Kind = BlockFirst 18365 b.SetControl(nil) 18366 _ = yes 18367 _ = no 18368 return true 18369 } 18370 // match: (UGT (FlagGT_ULT) yes no) 18371 // cond: 18372 // result: (First nil no yes) 18373 for { 18374 v := b.Control 18375 if v.Op != OpARMFlagGT_ULT { 18376 break 18377 } 18378 yes := b.Succs[0] 18379 no := b.Succs[1] 18380 b.Kind = BlockFirst 18381 b.SetControl(nil) 18382 b.swapSuccessors() 18383 _ = no 18384 _ = yes 18385 return true 18386 } 18387 // match: (UGT (FlagGT_UGT) yes no) 18388 // cond: 18389 // result: (First nil yes no) 18390 for { 18391 v := b.Control 18392 if v.Op != OpARMFlagGT_UGT { 18393 break 18394 } 18395 yes := b.Succs[0] 18396 no := b.Succs[1] 18397 b.Kind = BlockFirst 18398 b.SetControl(nil) 18399 _ = yes 18400 _ = no 18401 return true 18402 } 18403 // match: (UGT (InvertFlags cmp) yes no) 18404 // cond: 18405 // result: (ULT cmp yes no) 18406 for { 18407 v := b.Control 18408 if v.Op != OpARMInvertFlags { 18409 break 18410 } 18411 cmp := v.Args[0] 18412 yes := b.Succs[0] 18413 no := b.Succs[1] 18414 b.Kind = BlockARMULT 18415 b.SetControl(cmp) 18416 _ = yes 18417 _ = no 18418 return true 18419 } 18420 case BlockARMULE: 18421 // match: (ULE (FlagEQ) yes no) 18422 // cond: 18423 // result: (First nil yes no) 18424 for { 18425 v := b.Control 18426 if v.Op != OpARMFlagEQ { 18427 break 18428 } 18429 yes := b.Succs[0] 18430 no := b.Succs[1] 18431 b.Kind = BlockFirst 18432 b.SetControl(nil) 18433 _ = yes 18434 _ = no 18435 return true 18436 } 18437 // match: (ULE (FlagLT_ULT) yes no) 18438 // cond: 18439 // result: (First nil yes no) 18440 for { 18441 v := b.Control 18442 if v.Op != OpARMFlagLT_ULT { 18443 break 18444 } 18445 yes := b.Succs[0] 18446 no := b.Succs[1] 18447 b.Kind = BlockFirst 18448 b.SetControl(nil) 18449 _ = yes 18450 _ = no 18451 return true 18452 } 18453 // match: (ULE (FlagLT_UGT) yes no) 18454 // cond: 18455 // result: (First nil no yes) 18456 for { 18457 v := b.Control 18458 if v.Op != OpARMFlagLT_UGT { 18459 break 18460 } 18461 yes := b.Succs[0] 18462 no := b.Succs[1] 18463 b.Kind = BlockFirst 18464 b.SetControl(nil) 18465 b.swapSuccessors() 18466 _ = no 18467 _ = yes 18468 return true 18469 } 18470 // match: (ULE (FlagGT_ULT) yes no) 18471 // cond: 18472 // result: (First nil yes no) 18473 for { 18474 v := b.Control 18475 if v.Op != OpARMFlagGT_ULT { 18476 break 18477 } 18478 yes := b.Succs[0] 18479 no := b.Succs[1] 18480 b.Kind = BlockFirst 18481 b.SetControl(nil) 18482 _ = yes 18483 _ = no 18484 return true 18485 } 18486 // match: (ULE (FlagGT_UGT) yes no) 18487 // cond: 18488 // result: (First nil no yes) 18489 for { 18490 v := b.Control 18491 if v.Op != OpARMFlagGT_UGT { 18492 break 18493 } 18494 yes := b.Succs[0] 18495 no := b.Succs[1] 18496 b.Kind = BlockFirst 18497 b.SetControl(nil) 18498 b.swapSuccessors() 18499 _ = no 18500 _ = yes 18501 return true 18502 } 18503 // match: (ULE (InvertFlags cmp) yes no) 18504 // cond: 18505 // result: (UGE cmp yes no) 18506 for { 18507 v := b.Control 18508 if v.Op != OpARMInvertFlags { 18509 break 18510 } 18511 cmp := v.Args[0] 18512 yes := b.Succs[0] 18513 no := b.Succs[1] 18514 b.Kind = BlockARMUGE 18515 b.SetControl(cmp) 18516 _ = yes 18517 _ = no 18518 return true 18519 } 18520 case BlockARMULT: 18521 // match: (ULT (FlagEQ) yes no) 18522 // cond: 18523 // result: (First nil no yes) 18524 for { 18525 v := b.Control 18526 if v.Op != OpARMFlagEQ { 18527 break 18528 } 18529 yes := b.Succs[0] 18530 no := b.Succs[1] 18531 b.Kind = BlockFirst 18532 b.SetControl(nil) 18533 b.swapSuccessors() 18534 _ = no 18535 _ = yes 18536 return true 18537 } 18538 // match: (ULT (FlagLT_ULT) yes no) 18539 // cond: 18540 // result: (First nil yes no) 18541 for { 18542 v := b.Control 18543 if v.Op != OpARMFlagLT_ULT { 18544 break 18545 } 18546 yes := b.Succs[0] 18547 no := b.Succs[1] 18548 b.Kind = BlockFirst 18549 b.SetControl(nil) 18550 _ = yes 18551 _ = no 18552 return true 18553 } 18554 // match: (ULT (FlagLT_UGT) yes no) 18555 // cond: 18556 // result: (First nil no yes) 18557 for { 18558 v := b.Control 18559 if v.Op != OpARMFlagLT_UGT { 18560 break 18561 } 18562 yes := b.Succs[0] 18563 no := b.Succs[1] 18564 b.Kind = BlockFirst 18565 b.SetControl(nil) 18566 b.swapSuccessors() 18567 _ = no 18568 _ = yes 18569 return true 18570 } 18571 // match: (ULT (FlagGT_ULT) yes no) 18572 // cond: 18573 // result: (First nil yes no) 18574 for { 18575 v := b.Control 18576 if v.Op != OpARMFlagGT_ULT { 18577 break 18578 } 18579 yes := b.Succs[0] 18580 no := b.Succs[1] 18581 b.Kind = BlockFirst 18582 b.SetControl(nil) 18583 _ = yes 18584 _ = no 18585 return true 18586 } 18587 // match: (ULT (FlagGT_UGT) yes no) 18588 // cond: 18589 // result: (First nil no yes) 18590 for { 18591 v := b.Control 18592 if v.Op != OpARMFlagGT_UGT { 18593 break 18594 } 18595 yes := b.Succs[0] 18596 no := b.Succs[1] 18597 b.Kind = BlockFirst 18598 b.SetControl(nil) 18599 b.swapSuccessors() 18600 _ = no 18601 _ = yes 18602 return true 18603 } 18604 // match: (ULT (InvertFlags cmp) yes no) 18605 // cond: 18606 // result: (UGT cmp yes no) 18607 for { 18608 v := b.Control 18609 if v.Op != OpARMInvertFlags { 18610 break 18611 } 18612 cmp := v.Args[0] 18613 yes := b.Succs[0] 18614 no := b.Succs[1] 18615 b.Kind = BlockARMUGT 18616 b.SetControl(cmp) 18617 _ = yes 18618 _ = no 18619 return true 18620 } 18621 } 18622 return false 18623 }