github.com/freddyisaac/sicortex-golang@v0.0.0-20231019035217-e03519e66f60/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) 5192 // result: (MOVBUreg 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)) { 5206 break 5207 } 5208 v.reset(OpARMMOVBUreg) 5209 v.AddArg(x) 5210 return true 5211 } 5212 return false 5213 } 5214 func rewriteValueARM_OpARMMOVBUreg(v *Value, config *Config) bool { 5215 b := v.Block 5216 _ = b 5217 // match: (MOVBUreg x:(MOVBUload _ _)) 5218 // cond: 5219 // result: (MOVWreg x) 5220 for { 5221 x := v.Args[0] 5222 if x.Op != OpARMMOVBUload { 5223 break 5224 } 5225 v.reset(OpARMMOVWreg) 5226 v.AddArg(x) 5227 return true 5228 } 5229 // match: (MOVBUreg (ANDconst [c] x)) 5230 // cond: 5231 // result: (ANDconst [c&0xff] x) 5232 for { 5233 v_0 := v.Args[0] 5234 if v_0.Op != OpARMANDconst { 5235 break 5236 } 5237 c := v_0.AuxInt 5238 x := v_0.Args[0] 5239 v.reset(OpARMANDconst) 5240 v.AuxInt = c & 0xff 5241 v.AddArg(x) 5242 return true 5243 } 5244 // match: (MOVBUreg x:(MOVBUreg _)) 5245 // cond: 5246 // result: (MOVWreg x) 5247 for { 5248 x := v.Args[0] 5249 if x.Op != OpARMMOVBUreg { 5250 break 5251 } 5252 v.reset(OpARMMOVWreg) 5253 v.AddArg(x) 5254 return true 5255 } 5256 // match: (MOVBUreg (MOVWconst [c])) 5257 // cond: 5258 // result: (MOVWconst [int64(uint8(c))]) 5259 for { 5260 v_0 := v.Args[0] 5261 if v_0.Op != OpARMMOVWconst { 5262 break 5263 } 5264 c := v_0.AuxInt 5265 v.reset(OpARMMOVWconst) 5266 v.AuxInt = int64(uint8(c)) 5267 return true 5268 } 5269 return false 5270 } 5271 func rewriteValueARM_OpARMMOVBload(v *Value, config *Config) bool { 5272 b := v.Block 5273 _ = b 5274 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 5275 // cond: 5276 // result: (MOVBload [off1+off2] {sym} ptr mem) 5277 for { 5278 off1 := v.AuxInt 5279 sym := v.Aux 5280 v_0 := v.Args[0] 5281 if v_0.Op != OpARMADDconst { 5282 break 5283 } 5284 off2 := v_0.AuxInt 5285 ptr := v_0.Args[0] 5286 mem := v.Args[1] 5287 v.reset(OpARMMOVBload) 5288 v.AuxInt = off1 + off2 5289 v.Aux = sym 5290 v.AddArg(ptr) 5291 v.AddArg(mem) 5292 return true 5293 } 5294 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5295 // cond: canMergeSym(sym1,sym2) 5296 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5297 for { 5298 off1 := v.AuxInt 5299 sym1 := v.Aux 5300 v_0 := v.Args[0] 5301 if v_0.Op != OpARMMOVWaddr { 5302 break 5303 } 5304 off2 := v_0.AuxInt 5305 sym2 := v_0.Aux 5306 ptr := v_0.Args[0] 5307 mem := v.Args[1] 5308 if !(canMergeSym(sym1, sym2)) { 5309 break 5310 } 5311 v.reset(OpARMMOVBload) 5312 v.AuxInt = off1 + off2 5313 v.Aux = mergeSym(sym1, sym2) 5314 v.AddArg(ptr) 5315 v.AddArg(mem) 5316 return true 5317 } 5318 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5319 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5320 // result: (MOVBreg x) 5321 for { 5322 off := v.AuxInt 5323 sym := v.Aux 5324 ptr := v.Args[0] 5325 v_1 := v.Args[1] 5326 if v_1.Op != OpARMMOVBstore { 5327 break 5328 } 5329 off2 := v_1.AuxInt 5330 sym2 := v_1.Aux 5331 ptr2 := v_1.Args[0] 5332 x := v_1.Args[1] 5333 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5334 break 5335 } 5336 v.reset(OpARMMOVBreg) 5337 v.AddArg(x) 5338 return true 5339 } 5340 return false 5341 } 5342 func rewriteValueARM_OpARMMOVBreg(v *Value, config *Config) bool { 5343 b := v.Block 5344 _ = b 5345 // match: (MOVBreg x:(MOVBload _ _)) 5346 // cond: 5347 // result: (MOVWreg x) 5348 for { 5349 x := v.Args[0] 5350 if x.Op != OpARMMOVBload { 5351 break 5352 } 5353 v.reset(OpARMMOVWreg) 5354 v.AddArg(x) 5355 return true 5356 } 5357 // match: (MOVBreg (ANDconst [c] x)) 5358 // cond: c & 0x80 == 0 5359 // result: (ANDconst [c&0x7f] x) 5360 for { 5361 v_0 := v.Args[0] 5362 if v_0.Op != OpARMANDconst { 5363 break 5364 } 5365 c := v_0.AuxInt 5366 x := v_0.Args[0] 5367 if !(c&0x80 == 0) { 5368 break 5369 } 5370 v.reset(OpARMANDconst) 5371 v.AuxInt = c & 0x7f 5372 v.AddArg(x) 5373 return true 5374 } 5375 // match: (MOVBreg x:(MOVBreg _)) 5376 // cond: 5377 // result: (MOVWreg x) 5378 for { 5379 x := v.Args[0] 5380 if x.Op != OpARMMOVBreg { 5381 break 5382 } 5383 v.reset(OpARMMOVWreg) 5384 v.AddArg(x) 5385 return true 5386 } 5387 // match: (MOVBreg (MOVWconst [c])) 5388 // cond: 5389 // result: (MOVWconst [int64(int8(c))]) 5390 for { 5391 v_0 := v.Args[0] 5392 if v_0.Op != OpARMMOVWconst { 5393 break 5394 } 5395 c := v_0.AuxInt 5396 v.reset(OpARMMOVWconst) 5397 v.AuxInt = int64(int8(c)) 5398 return true 5399 } 5400 return false 5401 } 5402 func rewriteValueARM_OpARMMOVBstore(v *Value, config *Config) bool { 5403 b := v.Block 5404 _ = b 5405 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5406 // cond: 5407 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 5408 for { 5409 off1 := v.AuxInt 5410 sym := v.Aux 5411 v_0 := v.Args[0] 5412 if v_0.Op != OpARMADDconst { 5413 break 5414 } 5415 off2 := v_0.AuxInt 5416 ptr := v_0.Args[0] 5417 val := v.Args[1] 5418 mem := v.Args[2] 5419 v.reset(OpARMMOVBstore) 5420 v.AuxInt = off1 + off2 5421 v.Aux = sym 5422 v.AddArg(ptr) 5423 v.AddArg(val) 5424 v.AddArg(mem) 5425 return true 5426 } 5427 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5428 // cond: canMergeSym(sym1,sym2) 5429 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5430 for { 5431 off1 := v.AuxInt 5432 sym1 := v.Aux 5433 v_0 := v.Args[0] 5434 if v_0.Op != OpARMMOVWaddr { 5435 break 5436 } 5437 off2 := v_0.AuxInt 5438 sym2 := v_0.Aux 5439 ptr := v_0.Args[0] 5440 val := v.Args[1] 5441 mem := v.Args[2] 5442 if !(canMergeSym(sym1, sym2)) { 5443 break 5444 } 5445 v.reset(OpARMMOVBstore) 5446 v.AuxInt = off1 + off2 5447 v.Aux = mergeSym(sym1, sym2) 5448 v.AddArg(ptr) 5449 v.AddArg(val) 5450 v.AddArg(mem) 5451 return true 5452 } 5453 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 5454 // cond: 5455 // result: (MOVBstore [off] {sym} ptr x mem) 5456 for { 5457 off := v.AuxInt 5458 sym := v.Aux 5459 ptr := v.Args[0] 5460 v_1 := v.Args[1] 5461 if v_1.Op != OpARMMOVBreg { 5462 break 5463 } 5464 x := v_1.Args[0] 5465 mem := v.Args[2] 5466 v.reset(OpARMMOVBstore) 5467 v.AuxInt = off 5468 v.Aux = sym 5469 v.AddArg(ptr) 5470 v.AddArg(x) 5471 v.AddArg(mem) 5472 return true 5473 } 5474 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 5475 // cond: 5476 // result: (MOVBstore [off] {sym} ptr x mem) 5477 for { 5478 off := v.AuxInt 5479 sym := v.Aux 5480 ptr := v.Args[0] 5481 v_1 := v.Args[1] 5482 if v_1.Op != OpARMMOVBUreg { 5483 break 5484 } 5485 x := v_1.Args[0] 5486 mem := v.Args[2] 5487 v.reset(OpARMMOVBstore) 5488 v.AuxInt = off 5489 v.Aux = sym 5490 v.AddArg(ptr) 5491 v.AddArg(x) 5492 v.AddArg(mem) 5493 return true 5494 } 5495 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 5496 // cond: 5497 // result: (MOVBstore [off] {sym} ptr x mem) 5498 for { 5499 off := v.AuxInt 5500 sym := v.Aux 5501 ptr := v.Args[0] 5502 v_1 := v.Args[1] 5503 if v_1.Op != OpARMMOVHreg { 5504 break 5505 } 5506 x := v_1.Args[0] 5507 mem := v.Args[2] 5508 v.reset(OpARMMOVBstore) 5509 v.AuxInt = off 5510 v.Aux = sym 5511 v.AddArg(ptr) 5512 v.AddArg(x) 5513 v.AddArg(mem) 5514 return true 5515 } 5516 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 5517 // cond: 5518 // result: (MOVBstore [off] {sym} ptr x mem) 5519 for { 5520 off := v.AuxInt 5521 sym := v.Aux 5522 ptr := v.Args[0] 5523 v_1 := v.Args[1] 5524 if v_1.Op != OpARMMOVHUreg { 5525 break 5526 } 5527 x := v_1.Args[0] 5528 mem := v.Args[2] 5529 v.reset(OpARMMOVBstore) 5530 v.AuxInt = off 5531 v.Aux = sym 5532 v.AddArg(ptr) 5533 v.AddArg(x) 5534 v.AddArg(mem) 5535 return true 5536 } 5537 return false 5538 } 5539 func rewriteValueARM_OpARMMOVDload(v *Value, config *Config) bool { 5540 b := v.Block 5541 _ = b 5542 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 5543 // cond: 5544 // result: (MOVDload [off1+off2] {sym} ptr mem) 5545 for { 5546 off1 := v.AuxInt 5547 sym := v.Aux 5548 v_0 := v.Args[0] 5549 if v_0.Op != OpARMADDconst { 5550 break 5551 } 5552 off2 := v_0.AuxInt 5553 ptr := v_0.Args[0] 5554 mem := v.Args[1] 5555 v.reset(OpARMMOVDload) 5556 v.AuxInt = off1 + off2 5557 v.Aux = sym 5558 v.AddArg(ptr) 5559 v.AddArg(mem) 5560 return true 5561 } 5562 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5563 // cond: canMergeSym(sym1,sym2) 5564 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5565 for { 5566 off1 := v.AuxInt 5567 sym1 := v.Aux 5568 v_0 := v.Args[0] 5569 if v_0.Op != OpARMMOVWaddr { 5570 break 5571 } 5572 off2 := v_0.AuxInt 5573 sym2 := v_0.Aux 5574 ptr := v_0.Args[0] 5575 mem := v.Args[1] 5576 if !(canMergeSym(sym1, sym2)) { 5577 break 5578 } 5579 v.reset(OpARMMOVDload) 5580 v.AuxInt = off1 + off2 5581 v.Aux = mergeSym(sym1, sym2) 5582 v.AddArg(ptr) 5583 v.AddArg(mem) 5584 return true 5585 } 5586 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 5587 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5588 // result: x 5589 for { 5590 off := v.AuxInt 5591 sym := v.Aux 5592 ptr := v.Args[0] 5593 v_1 := v.Args[1] 5594 if v_1.Op != OpARMMOVDstore { 5595 break 5596 } 5597 off2 := v_1.AuxInt 5598 sym2 := v_1.Aux 5599 ptr2 := v_1.Args[0] 5600 x := v_1.Args[1] 5601 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5602 break 5603 } 5604 v.reset(OpCopy) 5605 v.Type = x.Type 5606 v.AddArg(x) 5607 return true 5608 } 5609 return false 5610 } 5611 func rewriteValueARM_OpARMMOVDstore(v *Value, config *Config) bool { 5612 b := v.Block 5613 _ = b 5614 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5615 // cond: 5616 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 5617 for { 5618 off1 := v.AuxInt 5619 sym := v.Aux 5620 v_0 := v.Args[0] 5621 if v_0.Op != OpARMADDconst { 5622 break 5623 } 5624 off2 := v_0.AuxInt 5625 ptr := v_0.Args[0] 5626 val := v.Args[1] 5627 mem := v.Args[2] 5628 v.reset(OpARMMOVDstore) 5629 v.AuxInt = off1 + off2 5630 v.Aux = sym 5631 v.AddArg(ptr) 5632 v.AddArg(val) 5633 v.AddArg(mem) 5634 return true 5635 } 5636 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5637 // cond: canMergeSym(sym1,sym2) 5638 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5639 for { 5640 off1 := v.AuxInt 5641 sym1 := v.Aux 5642 v_0 := v.Args[0] 5643 if v_0.Op != OpARMMOVWaddr { 5644 break 5645 } 5646 off2 := v_0.AuxInt 5647 sym2 := v_0.Aux 5648 ptr := v_0.Args[0] 5649 val := v.Args[1] 5650 mem := v.Args[2] 5651 if !(canMergeSym(sym1, sym2)) { 5652 break 5653 } 5654 v.reset(OpARMMOVDstore) 5655 v.AuxInt = off1 + off2 5656 v.Aux = mergeSym(sym1, sym2) 5657 v.AddArg(ptr) 5658 v.AddArg(val) 5659 v.AddArg(mem) 5660 return true 5661 } 5662 return false 5663 } 5664 func rewriteValueARM_OpARMMOVFload(v *Value, config *Config) bool { 5665 b := v.Block 5666 _ = b 5667 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 5668 // cond: 5669 // result: (MOVFload [off1+off2] {sym} ptr mem) 5670 for { 5671 off1 := v.AuxInt 5672 sym := v.Aux 5673 v_0 := v.Args[0] 5674 if v_0.Op != OpARMADDconst { 5675 break 5676 } 5677 off2 := v_0.AuxInt 5678 ptr := v_0.Args[0] 5679 mem := v.Args[1] 5680 v.reset(OpARMMOVFload) 5681 v.AuxInt = off1 + off2 5682 v.Aux = sym 5683 v.AddArg(ptr) 5684 v.AddArg(mem) 5685 return true 5686 } 5687 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5688 // cond: canMergeSym(sym1,sym2) 5689 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5690 for { 5691 off1 := v.AuxInt 5692 sym1 := v.Aux 5693 v_0 := v.Args[0] 5694 if v_0.Op != OpARMMOVWaddr { 5695 break 5696 } 5697 off2 := v_0.AuxInt 5698 sym2 := v_0.Aux 5699 ptr := v_0.Args[0] 5700 mem := v.Args[1] 5701 if !(canMergeSym(sym1, sym2)) { 5702 break 5703 } 5704 v.reset(OpARMMOVFload) 5705 v.AuxInt = off1 + off2 5706 v.Aux = mergeSym(sym1, sym2) 5707 v.AddArg(ptr) 5708 v.AddArg(mem) 5709 return true 5710 } 5711 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 5712 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5713 // result: x 5714 for { 5715 off := v.AuxInt 5716 sym := v.Aux 5717 ptr := v.Args[0] 5718 v_1 := v.Args[1] 5719 if v_1.Op != OpARMMOVFstore { 5720 break 5721 } 5722 off2 := v_1.AuxInt 5723 sym2 := v_1.Aux 5724 ptr2 := v_1.Args[0] 5725 x := v_1.Args[1] 5726 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5727 break 5728 } 5729 v.reset(OpCopy) 5730 v.Type = x.Type 5731 v.AddArg(x) 5732 return true 5733 } 5734 return false 5735 } 5736 func rewriteValueARM_OpARMMOVFstore(v *Value, config *Config) bool { 5737 b := v.Block 5738 _ = b 5739 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5740 // cond: 5741 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 5742 for { 5743 off1 := v.AuxInt 5744 sym := v.Aux 5745 v_0 := v.Args[0] 5746 if v_0.Op != OpARMADDconst { 5747 break 5748 } 5749 off2 := v_0.AuxInt 5750 ptr := v_0.Args[0] 5751 val := v.Args[1] 5752 mem := v.Args[2] 5753 v.reset(OpARMMOVFstore) 5754 v.AuxInt = off1 + off2 5755 v.Aux = sym 5756 v.AddArg(ptr) 5757 v.AddArg(val) 5758 v.AddArg(mem) 5759 return true 5760 } 5761 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5762 // cond: canMergeSym(sym1,sym2) 5763 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5764 for { 5765 off1 := v.AuxInt 5766 sym1 := v.Aux 5767 v_0 := v.Args[0] 5768 if v_0.Op != OpARMMOVWaddr { 5769 break 5770 } 5771 off2 := v_0.AuxInt 5772 sym2 := v_0.Aux 5773 ptr := v_0.Args[0] 5774 val := v.Args[1] 5775 mem := v.Args[2] 5776 if !(canMergeSym(sym1, sym2)) { 5777 break 5778 } 5779 v.reset(OpARMMOVFstore) 5780 v.AuxInt = off1 + off2 5781 v.Aux = mergeSym(sym1, sym2) 5782 v.AddArg(ptr) 5783 v.AddArg(val) 5784 v.AddArg(mem) 5785 return true 5786 } 5787 return false 5788 } 5789 func rewriteValueARM_OpARMMOVHUload(v *Value, config *Config) bool { 5790 b := v.Block 5791 _ = b 5792 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 5793 // cond: 5794 // result: (MOVHUload [off1+off2] {sym} ptr mem) 5795 for { 5796 off1 := v.AuxInt 5797 sym := v.Aux 5798 v_0 := v.Args[0] 5799 if v_0.Op != OpARMADDconst { 5800 break 5801 } 5802 off2 := v_0.AuxInt 5803 ptr := v_0.Args[0] 5804 mem := v.Args[1] 5805 v.reset(OpARMMOVHUload) 5806 v.AuxInt = off1 + off2 5807 v.Aux = sym 5808 v.AddArg(ptr) 5809 v.AddArg(mem) 5810 return true 5811 } 5812 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5813 // cond: canMergeSym(sym1,sym2) 5814 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5815 for { 5816 off1 := v.AuxInt 5817 sym1 := v.Aux 5818 v_0 := v.Args[0] 5819 if v_0.Op != OpARMMOVWaddr { 5820 break 5821 } 5822 off2 := v_0.AuxInt 5823 sym2 := v_0.Aux 5824 ptr := v_0.Args[0] 5825 mem := v.Args[1] 5826 if !(canMergeSym(sym1, sym2)) { 5827 break 5828 } 5829 v.reset(OpARMMOVHUload) 5830 v.AuxInt = off1 + off2 5831 v.Aux = mergeSym(sym1, sym2) 5832 v.AddArg(ptr) 5833 v.AddArg(mem) 5834 return true 5835 } 5836 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5837 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5838 // result: (MOVHUreg x) 5839 for { 5840 off := v.AuxInt 5841 sym := v.Aux 5842 ptr := v.Args[0] 5843 v_1 := v.Args[1] 5844 if v_1.Op != OpARMMOVHstore { 5845 break 5846 } 5847 off2 := v_1.AuxInt 5848 sym2 := v_1.Aux 5849 ptr2 := v_1.Args[0] 5850 x := v_1.Args[1] 5851 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5852 break 5853 } 5854 v.reset(OpARMMOVHUreg) 5855 v.AddArg(x) 5856 return true 5857 } 5858 return false 5859 } 5860 func rewriteValueARM_OpARMMOVHUreg(v *Value, config *Config) bool { 5861 b := v.Block 5862 _ = b 5863 // match: (MOVHUreg x:(MOVBUload _ _)) 5864 // cond: 5865 // result: (MOVWreg x) 5866 for { 5867 x := v.Args[0] 5868 if x.Op != OpARMMOVBUload { 5869 break 5870 } 5871 v.reset(OpARMMOVWreg) 5872 v.AddArg(x) 5873 return true 5874 } 5875 // match: (MOVHUreg x:(MOVHUload _ _)) 5876 // cond: 5877 // result: (MOVWreg x) 5878 for { 5879 x := v.Args[0] 5880 if x.Op != OpARMMOVHUload { 5881 break 5882 } 5883 v.reset(OpARMMOVWreg) 5884 v.AddArg(x) 5885 return true 5886 } 5887 // match: (MOVHUreg (ANDconst [c] x)) 5888 // cond: 5889 // result: (ANDconst [c&0xffff] x) 5890 for { 5891 v_0 := v.Args[0] 5892 if v_0.Op != OpARMANDconst { 5893 break 5894 } 5895 c := v_0.AuxInt 5896 x := v_0.Args[0] 5897 v.reset(OpARMANDconst) 5898 v.AuxInt = c & 0xffff 5899 v.AddArg(x) 5900 return true 5901 } 5902 // match: (MOVHUreg x:(MOVBUreg _)) 5903 // cond: 5904 // result: (MOVWreg x) 5905 for { 5906 x := v.Args[0] 5907 if x.Op != OpARMMOVBUreg { 5908 break 5909 } 5910 v.reset(OpARMMOVWreg) 5911 v.AddArg(x) 5912 return true 5913 } 5914 // match: (MOVHUreg x:(MOVHUreg _)) 5915 // cond: 5916 // result: (MOVWreg x) 5917 for { 5918 x := v.Args[0] 5919 if x.Op != OpARMMOVHUreg { 5920 break 5921 } 5922 v.reset(OpARMMOVWreg) 5923 v.AddArg(x) 5924 return true 5925 } 5926 // match: (MOVHUreg (MOVWconst [c])) 5927 // cond: 5928 // result: (MOVWconst [int64(uint16(c))]) 5929 for { 5930 v_0 := v.Args[0] 5931 if v_0.Op != OpARMMOVWconst { 5932 break 5933 } 5934 c := v_0.AuxInt 5935 v.reset(OpARMMOVWconst) 5936 v.AuxInt = int64(uint16(c)) 5937 return true 5938 } 5939 return false 5940 } 5941 func rewriteValueARM_OpARMMOVHload(v *Value, config *Config) bool { 5942 b := v.Block 5943 _ = b 5944 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 5945 // cond: 5946 // result: (MOVHload [off1+off2] {sym} ptr mem) 5947 for { 5948 off1 := v.AuxInt 5949 sym := v.Aux 5950 v_0 := v.Args[0] 5951 if v_0.Op != OpARMADDconst { 5952 break 5953 } 5954 off2 := v_0.AuxInt 5955 ptr := v_0.Args[0] 5956 mem := v.Args[1] 5957 v.reset(OpARMMOVHload) 5958 v.AuxInt = off1 + off2 5959 v.Aux = sym 5960 v.AddArg(ptr) 5961 v.AddArg(mem) 5962 return true 5963 } 5964 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5965 // cond: canMergeSym(sym1,sym2) 5966 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5967 for { 5968 off1 := v.AuxInt 5969 sym1 := v.Aux 5970 v_0 := v.Args[0] 5971 if v_0.Op != OpARMMOVWaddr { 5972 break 5973 } 5974 off2 := v_0.AuxInt 5975 sym2 := v_0.Aux 5976 ptr := v_0.Args[0] 5977 mem := v.Args[1] 5978 if !(canMergeSym(sym1, sym2)) { 5979 break 5980 } 5981 v.reset(OpARMMOVHload) 5982 v.AuxInt = off1 + off2 5983 v.Aux = mergeSym(sym1, sym2) 5984 v.AddArg(ptr) 5985 v.AddArg(mem) 5986 return true 5987 } 5988 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 5989 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5990 // result: (MOVHreg x) 5991 for { 5992 off := v.AuxInt 5993 sym := v.Aux 5994 ptr := v.Args[0] 5995 v_1 := v.Args[1] 5996 if v_1.Op != OpARMMOVHstore { 5997 break 5998 } 5999 off2 := v_1.AuxInt 6000 sym2 := v_1.Aux 6001 ptr2 := v_1.Args[0] 6002 x := v_1.Args[1] 6003 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6004 break 6005 } 6006 v.reset(OpARMMOVHreg) 6007 v.AddArg(x) 6008 return true 6009 } 6010 return false 6011 } 6012 func rewriteValueARM_OpARMMOVHreg(v *Value, config *Config) bool { 6013 b := v.Block 6014 _ = b 6015 // match: (MOVHreg x:(MOVBload _ _)) 6016 // cond: 6017 // result: (MOVWreg x) 6018 for { 6019 x := v.Args[0] 6020 if x.Op != OpARMMOVBload { 6021 break 6022 } 6023 v.reset(OpARMMOVWreg) 6024 v.AddArg(x) 6025 return true 6026 } 6027 // match: (MOVHreg x:(MOVBUload _ _)) 6028 // cond: 6029 // result: (MOVWreg x) 6030 for { 6031 x := v.Args[0] 6032 if x.Op != OpARMMOVBUload { 6033 break 6034 } 6035 v.reset(OpARMMOVWreg) 6036 v.AddArg(x) 6037 return true 6038 } 6039 // match: (MOVHreg x:(MOVHload _ _)) 6040 // cond: 6041 // result: (MOVWreg x) 6042 for { 6043 x := v.Args[0] 6044 if x.Op != OpARMMOVHload { 6045 break 6046 } 6047 v.reset(OpARMMOVWreg) 6048 v.AddArg(x) 6049 return true 6050 } 6051 // match: (MOVHreg (ANDconst [c] x)) 6052 // cond: c & 0x8000 == 0 6053 // result: (ANDconst [c&0x7fff] x) 6054 for { 6055 v_0 := v.Args[0] 6056 if v_0.Op != OpARMANDconst { 6057 break 6058 } 6059 c := v_0.AuxInt 6060 x := v_0.Args[0] 6061 if !(c&0x8000 == 0) { 6062 break 6063 } 6064 v.reset(OpARMANDconst) 6065 v.AuxInt = c & 0x7fff 6066 v.AddArg(x) 6067 return true 6068 } 6069 // match: (MOVHreg x:(MOVBreg _)) 6070 // cond: 6071 // result: (MOVWreg x) 6072 for { 6073 x := v.Args[0] 6074 if x.Op != OpARMMOVBreg { 6075 break 6076 } 6077 v.reset(OpARMMOVWreg) 6078 v.AddArg(x) 6079 return true 6080 } 6081 // match: (MOVHreg x:(MOVBUreg _)) 6082 // cond: 6083 // result: (MOVWreg x) 6084 for { 6085 x := v.Args[0] 6086 if x.Op != OpARMMOVBUreg { 6087 break 6088 } 6089 v.reset(OpARMMOVWreg) 6090 v.AddArg(x) 6091 return true 6092 } 6093 // match: (MOVHreg x:(MOVHreg _)) 6094 // cond: 6095 // result: (MOVWreg x) 6096 for { 6097 x := v.Args[0] 6098 if x.Op != OpARMMOVHreg { 6099 break 6100 } 6101 v.reset(OpARMMOVWreg) 6102 v.AddArg(x) 6103 return true 6104 } 6105 // match: (MOVHreg (MOVWconst [c])) 6106 // cond: 6107 // result: (MOVWconst [int64(int16(c))]) 6108 for { 6109 v_0 := v.Args[0] 6110 if v_0.Op != OpARMMOVWconst { 6111 break 6112 } 6113 c := v_0.AuxInt 6114 v.reset(OpARMMOVWconst) 6115 v.AuxInt = int64(int16(c)) 6116 return true 6117 } 6118 return false 6119 } 6120 func rewriteValueARM_OpARMMOVHstore(v *Value, config *Config) bool { 6121 b := v.Block 6122 _ = b 6123 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6124 // cond: 6125 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 6126 for { 6127 off1 := v.AuxInt 6128 sym := v.Aux 6129 v_0 := v.Args[0] 6130 if v_0.Op != OpARMADDconst { 6131 break 6132 } 6133 off2 := v_0.AuxInt 6134 ptr := v_0.Args[0] 6135 val := v.Args[1] 6136 mem := v.Args[2] 6137 v.reset(OpARMMOVHstore) 6138 v.AuxInt = off1 + off2 6139 v.Aux = sym 6140 v.AddArg(ptr) 6141 v.AddArg(val) 6142 v.AddArg(mem) 6143 return true 6144 } 6145 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6146 // cond: canMergeSym(sym1,sym2) 6147 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6148 for { 6149 off1 := v.AuxInt 6150 sym1 := v.Aux 6151 v_0 := v.Args[0] 6152 if v_0.Op != OpARMMOVWaddr { 6153 break 6154 } 6155 off2 := v_0.AuxInt 6156 sym2 := v_0.Aux 6157 ptr := v_0.Args[0] 6158 val := v.Args[1] 6159 mem := v.Args[2] 6160 if !(canMergeSym(sym1, sym2)) { 6161 break 6162 } 6163 v.reset(OpARMMOVHstore) 6164 v.AuxInt = off1 + off2 6165 v.Aux = mergeSym(sym1, sym2) 6166 v.AddArg(ptr) 6167 v.AddArg(val) 6168 v.AddArg(mem) 6169 return true 6170 } 6171 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 6172 // cond: 6173 // result: (MOVHstore [off] {sym} ptr x mem) 6174 for { 6175 off := v.AuxInt 6176 sym := v.Aux 6177 ptr := v.Args[0] 6178 v_1 := v.Args[1] 6179 if v_1.Op != OpARMMOVHreg { 6180 break 6181 } 6182 x := v_1.Args[0] 6183 mem := v.Args[2] 6184 v.reset(OpARMMOVHstore) 6185 v.AuxInt = off 6186 v.Aux = sym 6187 v.AddArg(ptr) 6188 v.AddArg(x) 6189 v.AddArg(mem) 6190 return true 6191 } 6192 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 6193 // cond: 6194 // result: (MOVHstore [off] {sym} ptr x mem) 6195 for { 6196 off := v.AuxInt 6197 sym := v.Aux 6198 ptr := v.Args[0] 6199 v_1 := v.Args[1] 6200 if v_1.Op != OpARMMOVHUreg { 6201 break 6202 } 6203 x := v_1.Args[0] 6204 mem := v.Args[2] 6205 v.reset(OpARMMOVHstore) 6206 v.AuxInt = off 6207 v.Aux = sym 6208 v.AddArg(ptr) 6209 v.AddArg(x) 6210 v.AddArg(mem) 6211 return true 6212 } 6213 return false 6214 } 6215 func rewriteValueARM_OpARMMOVWload(v *Value, config *Config) bool { 6216 b := v.Block 6217 _ = b 6218 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 6219 // cond: 6220 // result: (MOVWload [off1+off2] {sym} ptr mem) 6221 for { 6222 off1 := v.AuxInt 6223 sym := v.Aux 6224 v_0 := v.Args[0] 6225 if v_0.Op != OpARMADDconst { 6226 break 6227 } 6228 off2 := v_0.AuxInt 6229 ptr := v_0.Args[0] 6230 mem := v.Args[1] 6231 v.reset(OpARMMOVWload) 6232 v.AuxInt = off1 + off2 6233 v.Aux = sym 6234 v.AddArg(ptr) 6235 v.AddArg(mem) 6236 return true 6237 } 6238 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6239 // cond: canMergeSym(sym1,sym2) 6240 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6241 for { 6242 off1 := v.AuxInt 6243 sym1 := v.Aux 6244 v_0 := v.Args[0] 6245 if v_0.Op != OpARMMOVWaddr { 6246 break 6247 } 6248 off2 := v_0.AuxInt 6249 sym2 := v_0.Aux 6250 ptr := v_0.Args[0] 6251 mem := v.Args[1] 6252 if !(canMergeSym(sym1, sym2)) { 6253 break 6254 } 6255 v.reset(OpARMMOVWload) 6256 v.AuxInt = off1 + off2 6257 v.Aux = mergeSym(sym1, sym2) 6258 v.AddArg(ptr) 6259 v.AddArg(mem) 6260 return true 6261 } 6262 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6263 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6264 // result: x 6265 for { 6266 off := v.AuxInt 6267 sym := v.Aux 6268 ptr := v.Args[0] 6269 v_1 := v.Args[1] 6270 if v_1.Op != OpARMMOVWstore { 6271 break 6272 } 6273 off2 := v_1.AuxInt 6274 sym2 := v_1.Aux 6275 ptr2 := v_1.Args[0] 6276 x := v_1.Args[1] 6277 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6278 break 6279 } 6280 v.reset(OpCopy) 6281 v.Type = x.Type 6282 v.AddArg(x) 6283 return true 6284 } 6285 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 6286 // cond: sym == nil && !config.nacl 6287 // result: (MOVWloadidx ptr idx mem) 6288 for { 6289 if v.AuxInt != 0 { 6290 break 6291 } 6292 sym := v.Aux 6293 v_0 := v.Args[0] 6294 if v_0.Op != OpARMADD { 6295 break 6296 } 6297 ptr := v_0.Args[0] 6298 idx := v_0.Args[1] 6299 mem := v.Args[1] 6300 if !(sym == nil && !config.nacl) { 6301 break 6302 } 6303 v.reset(OpARMMOVWloadidx) 6304 v.AddArg(ptr) 6305 v.AddArg(idx) 6306 v.AddArg(mem) 6307 return true 6308 } 6309 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 6310 // cond: sym == nil && !config.nacl 6311 // result: (MOVWloadshiftLL ptr idx [c] mem) 6312 for { 6313 if v.AuxInt != 0 { 6314 break 6315 } 6316 sym := v.Aux 6317 v_0 := v.Args[0] 6318 if v_0.Op != OpARMADDshiftLL { 6319 break 6320 } 6321 c := v_0.AuxInt 6322 ptr := v_0.Args[0] 6323 idx := v_0.Args[1] 6324 mem := v.Args[1] 6325 if !(sym == nil && !config.nacl) { 6326 break 6327 } 6328 v.reset(OpARMMOVWloadshiftLL) 6329 v.AuxInt = c 6330 v.AddArg(ptr) 6331 v.AddArg(idx) 6332 v.AddArg(mem) 6333 return true 6334 } 6335 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 6336 // cond: sym == nil && !config.nacl 6337 // result: (MOVWloadshiftRL ptr idx [c] mem) 6338 for { 6339 if v.AuxInt != 0 { 6340 break 6341 } 6342 sym := v.Aux 6343 v_0 := v.Args[0] 6344 if v_0.Op != OpARMADDshiftRL { 6345 break 6346 } 6347 c := v_0.AuxInt 6348 ptr := v_0.Args[0] 6349 idx := v_0.Args[1] 6350 mem := v.Args[1] 6351 if !(sym == nil && !config.nacl) { 6352 break 6353 } 6354 v.reset(OpARMMOVWloadshiftRL) 6355 v.AuxInt = c 6356 v.AddArg(ptr) 6357 v.AddArg(idx) 6358 v.AddArg(mem) 6359 return true 6360 } 6361 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 6362 // cond: sym == nil && !config.nacl 6363 // result: (MOVWloadshiftRA ptr idx [c] mem) 6364 for { 6365 if v.AuxInt != 0 { 6366 break 6367 } 6368 sym := v.Aux 6369 v_0 := v.Args[0] 6370 if v_0.Op != OpARMADDshiftRA { 6371 break 6372 } 6373 c := v_0.AuxInt 6374 ptr := v_0.Args[0] 6375 idx := v_0.Args[1] 6376 mem := v.Args[1] 6377 if !(sym == nil && !config.nacl) { 6378 break 6379 } 6380 v.reset(OpARMMOVWloadshiftRA) 6381 v.AuxInt = c 6382 v.AddArg(ptr) 6383 v.AddArg(idx) 6384 v.AddArg(mem) 6385 return true 6386 } 6387 return false 6388 } 6389 func rewriteValueARM_OpARMMOVWloadidx(v *Value, config *Config) bool { 6390 b := v.Block 6391 _ = b 6392 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 6393 // cond: isSamePtr(ptr, ptr2) 6394 // result: x 6395 for { 6396 ptr := v.Args[0] 6397 idx := v.Args[1] 6398 v_2 := v.Args[2] 6399 if v_2.Op != OpARMMOVWstoreidx { 6400 break 6401 } 6402 ptr2 := v_2.Args[0] 6403 if idx != v_2.Args[1] { 6404 break 6405 } 6406 x := v_2.Args[2] 6407 if !(isSamePtr(ptr, ptr2)) { 6408 break 6409 } 6410 v.reset(OpCopy) 6411 v.Type = x.Type 6412 v.AddArg(x) 6413 return true 6414 } 6415 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 6416 // cond: 6417 // result: (MOVWload [c] ptr mem) 6418 for { 6419 ptr := v.Args[0] 6420 v_1 := v.Args[1] 6421 if v_1.Op != OpARMMOVWconst { 6422 break 6423 } 6424 c := v_1.AuxInt 6425 mem := v.Args[2] 6426 v.reset(OpARMMOVWload) 6427 v.AuxInt = c 6428 v.AddArg(ptr) 6429 v.AddArg(mem) 6430 return true 6431 } 6432 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 6433 // cond: 6434 // result: (MOVWload [c] ptr mem) 6435 for { 6436 v_0 := v.Args[0] 6437 if v_0.Op != OpARMMOVWconst { 6438 break 6439 } 6440 c := v_0.AuxInt 6441 ptr := v.Args[1] 6442 mem := v.Args[2] 6443 v.reset(OpARMMOVWload) 6444 v.AuxInt = c 6445 v.AddArg(ptr) 6446 v.AddArg(mem) 6447 return true 6448 } 6449 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 6450 // cond: 6451 // result: (MOVWloadshiftLL ptr idx [c] mem) 6452 for { 6453 ptr := v.Args[0] 6454 v_1 := v.Args[1] 6455 if v_1.Op != OpARMSLLconst { 6456 break 6457 } 6458 c := v_1.AuxInt 6459 idx := v_1.Args[0] 6460 mem := v.Args[2] 6461 v.reset(OpARMMOVWloadshiftLL) 6462 v.AuxInt = c 6463 v.AddArg(ptr) 6464 v.AddArg(idx) 6465 v.AddArg(mem) 6466 return true 6467 } 6468 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 6469 // cond: 6470 // result: (MOVWloadshiftLL ptr idx [c] mem) 6471 for { 6472 v_0 := v.Args[0] 6473 if v_0.Op != OpARMSLLconst { 6474 break 6475 } 6476 c := v_0.AuxInt 6477 idx := v_0.Args[0] 6478 ptr := v.Args[1] 6479 mem := v.Args[2] 6480 v.reset(OpARMMOVWloadshiftLL) 6481 v.AuxInt = c 6482 v.AddArg(ptr) 6483 v.AddArg(idx) 6484 v.AddArg(mem) 6485 return true 6486 } 6487 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 6488 // cond: 6489 // result: (MOVWloadshiftRL ptr idx [c] mem) 6490 for { 6491 ptr := v.Args[0] 6492 v_1 := v.Args[1] 6493 if v_1.Op != OpARMSRLconst { 6494 break 6495 } 6496 c := v_1.AuxInt 6497 idx := v_1.Args[0] 6498 mem := v.Args[2] 6499 v.reset(OpARMMOVWloadshiftRL) 6500 v.AuxInt = c 6501 v.AddArg(ptr) 6502 v.AddArg(idx) 6503 v.AddArg(mem) 6504 return true 6505 } 6506 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 6507 // cond: 6508 // result: (MOVWloadshiftRL ptr idx [c] mem) 6509 for { 6510 v_0 := v.Args[0] 6511 if v_0.Op != OpARMSRLconst { 6512 break 6513 } 6514 c := v_0.AuxInt 6515 idx := v_0.Args[0] 6516 ptr := v.Args[1] 6517 mem := v.Args[2] 6518 v.reset(OpARMMOVWloadshiftRL) 6519 v.AuxInt = c 6520 v.AddArg(ptr) 6521 v.AddArg(idx) 6522 v.AddArg(mem) 6523 return true 6524 } 6525 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 6526 // cond: 6527 // result: (MOVWloadshiftRA ptr idx [c] mem) 6528 for { 6529 ptr := v.Args[0] 6530 v_1 := v.Args[1] 6531 if v_1.Op != OpARMSRAconst { 6532 break 6533 } 6534 c := v_1.AuxInt 6535 idx := v_1.Args[0] 6536 mem := v.Args[2] 6537 v.reset(OpARMMOVWloadshiftRA) 6538 v.AuxInt = c 6539 v.AddArg(ptr) 6540 v.AddArg(idx) 6541 v.AddArg(mem) 6542 return true 6543 } 6544 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 6545 // cond: 6546 // result: (MOVWloadshiftRA ptr idx [c] mem) 6547 for { 6548 v_0 := v.Args[0] 6549 if v_0.Op != OpARMSRAconst { 6550 break 6551 } 6552 c := v_0.AuxInt 6553 idx := v_0.Args[0] 6554 ptr := v.Args[1] 6555 mem := v.Args[2] 6556 v.reset(OpARMMOVWloadshiftRA) 6557 v.AuxInt = c 6558 v.AddArg(ptr) 6559 v.AddArg(idx) 6560 v.AddArg(mem) 6561 return true 6562 } 6563 return false 6564 } 6565 func rewriteValueARM_OpARMMOVWloadshiftLL(v *Value, config *Config) bool { 6566 b := v.Block 6567 _ = b 6568 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 6569 // cond: c==d && isSamePtr(ptr, ptr2) 6570 // result: x 6571 for { 6572 c := v.AuxInt 6573 ptr := v.Args[0] 6574 idx := v.Args[1] 6575 v_2 := v.Args[2] 6576 if v_2.Op != OpARMMOVWstoreshiftLL { 6577 break 6578 } 6579 d := v_2.AuxInt 6580 ptr2 := v_2.Args[0] 6581 if idx != v_2.Args[1] { 6582 break 6583 } 6584 x := v_2.Args[2] 6585 if !(c == d && isSamePtr(ptr, ptr2)) { 6586 break 6587 } 6588 v.reset(OpCopy) 6589 v.Type = x.Type 6590 v.AddArg(x) 6591 return true 6592 } 6593 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 6594 // cond: 6595 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 6596 for { 6597 d := v.AuxInt 6598 ptr := v.Args[0] 6599 v_1 := v.Args[1] 6600 if v_1.Op != OpARMMOVWconst { 6601 break 6602 } 6603 c := v_1.AuxInt 6604 mem := v.Args[2] 6605 v.reset(OpARMMOVWload) 6606 v.AuxInt = int64(uint32(c) << uint64(d)) 6607 v.AddArg(ptr) 6608 v.AddArg(mem) 6609 return true 6610 } 6611 return false 6612 } 6613 func rewriteValueARM_OpARMMOVWloadshiftRA(v *Value, config *Config) bool { 6614 b := v.Block 6615 _ = b 6616 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 6617 // cond: c==d && isSamePtr(ptr, ptr2) 6618 // result: x 6619 for { 6620 c := v.AuxInt 6621 ptr := v.Args[0] 6622 idx := v.Args[1] 6623 v_2 := v.Args[2] 6624 if v_2.Op != OpARMMOVWstoreshiftRA { 6625 break 6626 } 6627 d := v_2.AuxInt 6628 ptr2 := v_2.Args[0] 6629 if idx != v_2.Args[1] { 6630 break 6631 } 6632 x := v_2.Args[2] 6633 if !(c == d && isSamePtr(ptr, ptr2)) { 6634 break 6635 } 6636 v.reset(OpCopy) 6637 v.Type = x.Type 6638 v.AddArg(x) 6639 return true 6640 } 6641 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 6642 // cond: 6643 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 6644 for { 6645 d := v.AuxInt 6646 ptr := v.Args[0] 6647 v_1 := v.Args[1] 6648 if v_1.Op != OpARMMOVWconst { 6649 break 6650 } 6651 c := v_1.AuxInt 6652 mem := v.Args[2] 6653 v.reset(OpARMMOVWload) 6654 v.AuxInt = int64(int32(c) >> uint64(d)) 6655 v.AddArg(ptr) 6656 v.AddArg(mem) 6657 return true 6658 } 6659 return false 6660 } 6661 func rewriteValueARM_OpARMMOVWloadshiftRL(v *Value, config *Config) bool { 6662 b := v.Block 6663 _ = b 6664 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 6665 // cond: c==d && isSamePtr(ptr, ptr2) 6666 // result: x 6667 for { 6668 c := v.AuxInt 6669 ptr := v.Args[0] 6670 idx := v.Args[1] 6671 v_2 := v.Args[2] 6672 if v_2.Op != OpARMMOVWstoreshiftRL { 6673 break 6674 } 6675 d := v_2.AuxInt 6676 ptr2 := v_2.Args[0] 6677 if idx != v_2.Args[1] { 6678 break 6679 } 6680 x := v_2.Args[2] 6681 if !(c == d && isSamePtr(ptr, ptr2)) { 6682 break 6683 } 6684 v.reset(OpCopy) 6685 v.Type = x.Type 6686 v.AddArg(x) 6687 return true 6688 } 6689 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 6690 // cond: 6691 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 6692 for { 6693 d := v.AuxInt 6694 ptr := v.Args[0] 6695 v_1 := v.Args[1] 6696 if v_1.Op != OpARMMOVWconst { 6697 break 6698 } 6699 c := v_1.AuxInt 6700 mem := v.Args[2] 6701 v.reset(OpARMMOVWload) 6702 v.AuxInt = int64(uint32(c) >> uint64(d)) 6703 v.AddArg(ptr) 6704 v.AddArg(mem) 6705 return true 6706 } 6707 return false 6708 } 6709 func rewriteValueARM_OpARMMOVWreg(v *Value, config *Config) bool { 6710 b := v.Block 6711 _ = b 6712 // match: (MOVWreg x) 6713 // cond: x.Uses == 1 6714 // result: (MOVWnop x) 6715 for { 6716 x := v.Args[0] 6717 if !(x.Uses == 1) { 6718 break 6719 } 6720 v.reset(OpARMMOVWnop) 6721 v.AddArg(x) 6722 return true 6723 } 6724 // match: (MOVWreg (MOVWconst [c])) 6725 // cond: 6726 // result: (MOVWconst [c]) 6727 for { 6728 v_0 := v.Args[0] 6729 if v_0.Op != OpARMMOVWconst { 6730 break 6731 } 6732 c := v_0.AuxInt 6733 v.reset(OpARMMOVWconst) 6734 v.AuxInt = c 6735 return true 6736 } 6737 return false 6738 } 6739 func rewriteValueARM_OpARMMOVWstore(v *Value, config *Config) bool { 6740 b := v.Block 6741 _ = b 6742 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6743 // cond: 6744 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 6745 for { 6746 off1 := v.AuxInt 6747 sym := v.Aux 6748 v_0 := v.Args[0] 6749 if v_0.Op != OpARMADDconst { 6750 break 6751 } 6752 off2 := v_0.AuxInt 6753 ptr := v_0.Args[0] 6754 val := v.Args[1] 6755 mem := v.Args[2] 6756 v.reset(OpARMMOVWstore) 6757 v.AuxInt = off1 + off2 6758 v.Aux = sym 6759 v.AddArg(ptr) 6760 v.AddArg(val) 6761 v.AddArg(mem) 6762 return true 6763 } 6764 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6765 // cond: canMergeSym(sym1,sym2) 6766 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6767 for { 6768 off1 := v.AuxInt 6769 sym1 := v.Aux 6770 v_0 := v.Args[0] 6771 if v_0.Op != OpARMMOVWaddr { 6772 break 6773 } 6774 off2 := v_0.AuxInt 6775 sym2 := v_0.Aux 6776 ptr := v_0.Args[0] 6777 val := v.Args[1] 6778 mem := v.Args[2] 6779 if !(canMergeSym(sym1, sym2)) { 6780 break 6781 } 6782 v.reset(OpARMMOVWstore) 6783 v.AuxInt = off1 + off2 6784 v.Aux = mergeSym(sym1, sym2) 6785 v.AddArg(ptr) 6786 v.AddArg(val) 6787 v.AddArg(mem) 6788 return true 6789 } 6790 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 6791 // cond: sym == nil && !config.nacl 6792 // result: (MOVWstoreidx ptr idx val mem) 6793 for { 6794 if v.AuxInt != 0 { 6795 break 6796 } 6797 sym := v.Aux 6798 v_0 := v.Args[0] 6799 if v_0.Op != OpARMADD { 6800 break 6801 } 6802 ptr := v_0.Args[0] 6803 idx := v_0.Args[1] 6804 val := v.Args[1] 6805 mem := v.Args[2] 6806 if !(sym == nil && !config.nacl) { 6807 break 6808 } 6809 v.reset(OpARMMOVWstoreidx) 6810 v.AddArg(ptr) 6811 v.AddArg(idx) 6812 v.AddArg(val) 6813 v.AddArg(mem) 6814 return true 6815 } 6816 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 6817 // cond: sym == nil && !config.nacl 6818 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6819 for { 6820 if v.AuxInt != 0 { 6821 break 6822 } 6823 sym := v.Aux 6824 v_0 := v.Args[0] 6825 if v_0.Op != OpARMADDshiftLL { 6826 break 6827 } 6828 c := v_0.AuxInt 6829 ptr := v_0.Args[0] 6830 idx := v_0.Args[1] 6831 val := v.Args[1] 6832 mem := v.Args[2] 6833 if !(sym == nil && !config.nacl) { 6834 break 6835 } 6836 v.reset(OpARMMOVWstoreshiftLL) 6837 v.AuxInt = c 6838 v.AddArg(ptr) 6839 v.AddArg(idx) 6840 v.AddArg(val) 6841 v.AddArg(mem) 6842 return true 6843 } 6844 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 6845 // cond: sym == nil && !config.nacl 6846 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6847 for { 6848 if v.AuxInt != 0 { 6849 break 6850 } 6851 sym := v.Aux 6852 v_0 := v.Args[0] 6853 if v_0.Op != OpARMADDshiftRL { 6854 break 6855 } 6856 c := v_0.AuxInt 6857 ptr := v_0.Args[0] 6858 idx := v_0.Args[1] 6859 val := v.Args[1] 6860 mem := v.Args[2] 6861 if !(sym == nil && !config.nacl) { 6862 break 6863 } 6864 v.reset(OpARMMOVWstoreshiftRL) 6865 v.AuxInt = c 6866 v.AddArg(ptr) 6867 v.AddArg(idx) 6868 v.AddArg(val) 6869 v.AddArg(mem) 6870 return true 6871 } 6872 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 6873 // cond: sym == nil && !config.nacl 6874 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 6875 for { 6876 if v.AuxInt != 0 { 6877 break 6878 } 6879 sym := v.Aux 6880 v_0 := v.Args[0] 6881 if v_0.Op != OpARMADDshiftRA { 6882 break 6883 } 6884 c := v_0.AuxInt 6885 ptr := v_0.Args[0] 6886 idx := v_0.Args[1] 6887 val := v.Args[1] 6888 mem := v.Args[2] 6889 if !(sym == nil && !config.nacl) { 6890 break 6891 } 6892 v.reset(OpARMMOVWstoreshiftRA) 6893 v.AuxInt = c 6894 v.AddArg(ptr) 6895 v.AddArg(idx) 6896 v.AddArg(val) 6897 v.AddArg(mem) 6898 return true 6899 } 6900 return false 6901 } 6902 func rewriteValueARM_OpARMMOVWstoreidx(v *Value, config *Config) bool { 6903 b := v.Block 6904 _ = b 6905 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 6906 // cond: 6907 // result: (MOVWstore [c] ptr val mem) 6908 for { 6909 ptr := v.Args[0] 6910 v_1 := v.Args[1] 6911 if v_1.Op != OpARMMOVWconst { 6912 break 6913 } 6914 c := v_1.AuxInt 6915 val := v.Args[2] 6916 mem := v.Args[3] 6917 v.reset(OpARMMOVWstore) 6918 v.AuxInt = c 6919 v.AddArg(ptr) 6920 v.AddArg(val) 6921 v.AddArg(mem) 6922 return true 6923 } 6924 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 6925 // cond: 6926 // result: (MOVWstore [c] ptr val mem) 6927 for { 6928 v_0 := v.Args[0] 6929 if v_0.Op != OpARMMOVWconst { 6930 break 6931 } 6932 c := v_0.AuxInt 6933 ptr := v.Args[1] 6934 val := v.Args[2] 6935 mem := v.Args[3] 6936 v.reset(OpARMMOVWstore) 6937 v.AuxInt = c 6938 v.AddArg(ptr) 6939 v.AddArg(val) 6940 v.AddArg(mem) 6941 return true 6942 } 6943 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 6944 // cond: 6945 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6946 for { 6947 ptr := v.Args[0] 6948 v_1 := v.Args[1] 6949 if v_1.Op != OpARMSLLconst { 6950 break 6951 } 6952 c := v_1.AuxInt 6953 idx := v_1.Args[0] 6954 val := v.Args[2] 6955 mem := v.Args[3] 6956 v.reset(OpARMMOVWstoreshiftLL) 6957 v.AuxInt = c 6958 v.AddArg(ptr) 6959 v.AddArg(idx) 6960 v.AddArg(val) 6961 v.AddArg(mem) 6962 return true 6963 } 6964 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 6965 // cond: 6966 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 6967 for { 6968 v_0 := v.Args[0] 6969 if v_0.Op != OpARMSLLconst { 6970 break 6971 } 6972 c := v_0.AuxInt 6973 idx := v_0.Args[0] 6974 ptr := v.Args[1] 6975 val := v.Args[2] 6976 mem := v.Args[3] 6977 v.reset(OpARMMOVWstoreshiftLL) 6978 v.AuxInt = c 6979 v.AddArg(ptr) 6980 v.AddArg(idx) 6981 v.AddArg(val) 6982 v.AddArg(mem) 6983 return true 6984 } 6985 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 6986 // cond: 6987 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 6988 for { 6989 ptr := v.Args[0] 6990 v_1 := v.Args[1] 6991 if v_1.Op != OpARMSRLconst { 6992 break 6993 } 6994 c := v_1.AuxInt 6995 idx := v_1.Args[0] 6996 val := v.Args[2] 6997 mem := v.Args[3] 6998 v.reset(OpARMMOVWstoreshiftRL) 6999 v.AuxInt = c 7000 v.AddArg(ptr) 7001 v.AddArg(idx) 7002 v.AddArg(val) 7003 v.AddArg(mem) 7004 return true 7005 } 7006 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 7007 // cond: 7008 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7009 for { 7010 v_0 := v.Args[0] 7011 if v_0.Op != OpARMSRLconst { 7012 break 7013 } 7014 c := v_0.AuxInt 7015 idx := v_0.Args[0] 7016 ptr := v.Args[1] 7017 val := v.Args[2] 7018 mem := v.Args[3] 7019 v.reset(OpARMMOVWstoreshiftRL) 7020 v.AuxInt = c 7021 v.AddArg(ptr) 7022 v.AddArg(idx) 7023 v.AddArg(val) 7024 v.AddArg(mem) 7025 return true 7026 } 7027 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 7028 // cond: 7029 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7030 for { 7031 ptr := v.Args[0] 7032 v_1 := v.Args[1] 7033 if v_1.Op != OpARMSRAconst { 7034 break 7035 } 7036 c := v_1.AuxInt 7037 idx := v_1.Args[0] 7038 val := v.Args[2] 7039 mem := v.Args[3] 7040 v.reset(OpARMMOVWstoreshiftRA) 7041 v.AuxInt = c 7042 v.AddArg(ptr) 7043 v.AddArg(idx) 7044 v.AddArg(val) 7045 v.AddArg(mem) 7046 return true 7047 } 7048 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 7049 // cond: 7050 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7051 for { 7052 v_0 := v.Args[0] 7053 if v_0.Op != OpARMSRAconst { 7054 break 7055 } 7056 c := v_0.AuxInt 7057 idx := v_0.Args[0] 7058 ptr := v.Args[1] 7059 val := v.Args[2] 7060 mem := v.Args[3] 7061 v.reset(OpARMMOVWstoreshiftRA) 7062 v.AuxInt = c 7063 v.AddArg(ptr) 7064 v.AddArg(idx) 7065 v.AddArg(val) 7066 v.AddArg(mem) 7067 return true 7068 } 7069 return false 7070 } 7071 func rewriteValueARM_OpARMMOVWstoreshiftLL(v *Value, config *Config) bool { 7072 b := v.Block 7073 _ = b 7074 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 7075 // cond: 7076 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 7077 for { 7078 d := v.AuxInt 7079 ptr := v.Args[0] 7080 v_1 := v.Args[1] 7081 if v_1.Op != OpARMMOVWconst { 7082 break 7083 } 7084 c := v_1.AuxInt 7085 val := v.Args[2] 7086 mem := v.Args[3] 7087 v.reset(OpARMMOVWstore) 7088 v.AuxInt = int64(uint32(c) << uint64(d)) 7089 v.AddArg(ptr) 7090 v.AddArg(val) 7091 v.AddArg(mem) 7092 return true 7093 } 7094 return false 7095 } 7096 func rewriteValueARM_OpARMMOVWstoreshiftRA(v *Value, config *Config) bool { 7097 b := v.Block 7098 _ = b 7099 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 7100 // cond: 7101 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 7102 for { 7103 d := v.AuxInt 7104 ptr := v.Args[0] 7105 v_1 := v.Args[1] 7106 if v_1.Op != OpARMMOVWconst { 7107 break 7108 } 7109 c := v_1.AuxInt 7110 val := v.Args[2] 7111 mem := v.Args[3] 7112 v.reset(OpARMMOVWstore) 7113 v.AuxInt = int64(int32(c) >> uint64(d)) 7114 v.AddArg(ptr) 7115 v.AddArg(val) 7116 v.AddArg(mem) 7117 return true 7118 } 7119 return false 7120 } 7121 func rewriteValueARM_OpARMMOVWstoreshiftRL(v *Value, config *Config) bool { 7122 b := v.Block 7123 _ = b 7124 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 7125 // cond: 7126 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 7127 for { 7128 d := v.AuxInt 7129 ptr := v.Args[0] 7130 v_1 := v.Args[1] 7131 if v_1.Op != OpARMMOVWconst { 7132 break 7133 } 7134 c := v_1.AuxInt 7135 val := v.Args[2] 7136 mem := v.Args[3] 7137 v.reset(OpARMMOVWstore) 7138 v.AuxInt = int64(uint32(c) >> uint64(d)) 7139 v.AddArg(ptr) 7140 v.AddArg(val) 7141 v.AddArg(mem) 7142 return true 7143 } 7144 return false 7145 } 7146 func rewriteValueARM_OpARMMUL(v *Value, config *Config) bool { 7147 b := v.Block 7148 _ = b 7149 // match: (MUL x (MOVWconst [c])) 7150 // cond: int32(c) == -1 7151 // result: (RSBconst [0] x) 7152 for { 7153 x := v.Args[0] 7154 v_1 := v.Args[1] 7155 if v_1.Op != OpARMMOVWconst { 7156 break 7157 } 7158 c := v_1.AuxInt 7159 if !(int32(c) == -1) { 7160 break 7161 } 7162 v.reset(OpARMRSBconst) 7163 v.AuxInt = 0 7164 v.AddArg(x) 7165 return true 7166 } 7167 // match: (MUL _ (MOVWconst [0])) 7168 // cond: 7169 // result: (MOVWconst [0]) 7170 for { 7171 v_1 := v.Args[1] 7172 if v_1.Op != OpARMMOVWconst { 7173 break 7174 } 7175 if v_1.AuxInt != 0 { 7176 break 7177 } 7178 v.reset(OpARMMOVWconst) 7179 v.AuxInt = 0 7180 return true 7181 } 7182 // match: (MUL x (MOVWconst [1])) 7183 // cond: 7184 // result: x 7185 for { 7186 x := v.Args[0] 7187 v_1 := v.Args[1] 7188 if v_1.Op != OpARMMOVWconst { 7189 break 7190 } 7191 if v_1.AuxInt != 1 { 7192 break 7193 } 7194 v.reset(OpCopy) 7195 v.Type = x.Type 7196 v.AddArg(x) 7197 return true 7198 } 7199 // match: (MUL x (MOVWconst [c])) 7200 // cond: isPowerOfTwo(c) 7201 // result: (SLLconst [log2(c)] x) 7202 for { 7203 x := v.Args[0] 7204 v_1 := v.Args[1] 7205 if v_1.Op != OpARMMOVWconst { 7206 break 7207 } 7208 c := v_1.AuxInt 7209 if !(isPowerOfTwo(c)) { 7210 break 7211 } 7212 v.reset(OpARMSLLconst) 7213 v.AuxInt = log2(c) 7214 v.AddArg(x) 7215 return true 7216 } 7217 // match: (MUL x (MOVWconst [c])) 7218 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7219 // result: (ADDshiftLL x x [log2(c-1)]) 7220 for { 7221 x := v.Args[0] 7222 v_1 := v.Args[1] 7223 if v_1.Op != OpARMMOVWconst { 7224 break 7225 } 7226 c := v_1.AuxInt 7227 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7228 break 7229 } 7230 v.reset(OpARMADDshiftLL) 7231 v.AuxInt = log2(c - 1) 7232 v.AddArg(x) 7233 v.AddArg(x) 7234 return true 7235 } 7236 // match: (MUL x (MOVWconst [c])) 7237 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7238 // result: (RSBshiftLL x x [log2(c+1)]) 7239 for { 7240 x := v.Args[0] 7241 v_1 := v.Args[1] 7242 if v_1.Op != OpARMMOVWconst { 7243 break 7244 } 7245 c := v_1.AuxInt 7246 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7247 break 7248 } 7249 v.reset(OpARMRSBshiftLL) 7250 v.AuxInt = log2(c + 1) 7251 v.AddArg(x) 7252 v.AddArg(x) 7253 return true 7254 } 7255 // match: (MUL x (MOVWconst [c])) 7256 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7257 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7258 for { 7259 x := v.Args[0] 7260 v_1 := v.Args[1] 7261 if v_1.Op != OpARMMOVWconst { 7262 break 7263 } 7264 c := v_1.AuxInt 7265 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7266 break 7267 } 7268 v.reset(OpARMSLLconst) 7269 v.AuxInt = log2(c / 3) 7270 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7271 v0.AuxInt = 1 7272 v0.AddArg(x) 7273 v0.AddArg(x) 7274 v.AddArg(v0) 7275 return true 7276 } 7277 // match: (MUL x (MOVWconst [c])) 7278 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7279 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7280 for { 7281 x := v.Args[0] 7282 v_1 := v.Args[1] 7283 if v_1.Op != OpARMMOVWconst { 7284 break 7285 } 7286 c := v_1.AuxInt 7287 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7288 break 7289 } 7290 v.reset(OpARMSLLconst) 7291 v.AuxInt = log2(c / 5) 7292 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7293 v0.AuxInt = 2 7294 v0.AddArg(x) 7295 v0.AddArg(x) 7296 v.AddArg(v0) 7297 return true 7298 } 7299 // match: (MUL x (MOVWconst [c])) 7300 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7301 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7302 for { 7303 x := v.Args[0] 7304 v_1 := v.Args[1] 7305 if v_1.Op != OpARMMOVWconst { 7306 break 7307 } 7308 c := v_1.AuxInt 7309 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7310 break 7311 } 7312 v.reset(OpARMSLLconst) 7313 v.AuxInt = log2(c / 7) 7314 v0 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7315 v0.AuxInt = 3 7316 v0.AddArg(x) 7317 v0.AddArg(x) 7318 v.AddArg(v0) 7319 return true 7320 } 7321 // match: (MUL x (MOVWconst [c])) 7322 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7323 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7324 for { 7325 x := v.Args[0] 7326 v_1 := v.Args[1] 7327 if v_1.Op != OpARMMOVWconst { 7328 break 7329 } 7330 c := v_1.AuxInt 7331 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7332 break 7333 } 7334 v.reset(OpARMSLLconst) 7335 v.AuxInt = log2(c / 9) 7336 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7337 v0.AuxInt = 3 7338 v0.AddArg(x) 7339 v0.AddArg(x) 7340 v.AddArg(v0) 7341 return true 7342 } 7343 // match: (MUL (MOVWconst [c]) x) 7344 // cond: int32(c) == -1 7345 // result: (RSBconst [0] x) 7346 for { 7347 v_0 := v.Args[0] 7348 if v_0.Op != OpARMMOVWconst { 7349 break 7350 } 7351 c := v_0.AuxInt 7352 x := v.Args[1] 7353 if !(int32(c) == -1) { 7354 break 7355 } 7356 v.reset(OpARMRSBconst) 7357 v.AuxInt = 0 7358 v.AddArg(x) 7359 return true 7360 } 7361 // match: (MUL (MOVWconst [0]) _) 7362 // cond: 7363 // result: (MOVWconst [0]) 7364 for { 7365 v_0 := v.Args[0] 7366 if v_0.Op != OpARMMOVWconst { 7367 break 7368 } 7369 if v_0.AuxInt != 0 { 7370 break 7371 } 7372 v.reset(OpARMMOVWconst) 7373 v.AuxInt = 0 7374 return true 7375 } 7376 // match: (MUL (MOVWconst [1]) x) 7377 // cond: 7378 // result: x 7379 for { 7380 v_0 := v.Args[0] 7381 if v_0.Op != OpARMMOVWconst { 7382 break 7383 } 7384 if v_0.AuxInt != 1 { 7385 break 7386 } 7387 x := v.Args[1] 7388 v.reset(OpCopy) 7389 v.Type = x.Type 7390 v.AddArg(x) 7391 return true 7392 } 7393 // match: (MUL (MOVWconst [c]) x) 7394 // cond: isPowerOfTwo(c) 7395 // result: (SLLconst [log2(c)] x) 7396 for { 7397 v_0 := v.Args[0] 7398 if v_0.Op != OpARMMOVWconst { 7399 break 7400 } 7401 c := v_0.AuxInt 7402 x := v.Args[1] 7403 if !(isPowerOfTwo(c)) { 7404 break 7405 } 7406 v.reset(OpARMSLLconst) 7407 v.AuxInt = log2(c) 7408 v.AddArg(x) 7409 return true 7410 } 7411 // match: (MUL (MOVWconst [c]) x) 7412 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7413 // result: (ADDshiftLL x x [log2(c-1)]) 7414 for { 7415 v_0 := v.Args[0] 7416 if v_0.Op != OpARMMOVWconst { 7417 break 7418 } 7419 c := v_0.AuxInt 7420 x := v.Args[1] 7421 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7422 break 7423 } 7424 v.reset(OpARMADDshiftLL) 7425 v.AuxInt = log2(c - 1) 7426 v.AddArg(x) 7427 v.AddArg(x) 7428 return true 7429 } 7430 // match: (MUL (MOVWconst [c]) x) 7431 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7432 // result: (RSBshiftLL x x [log2(c+1)]) 7433 for { 7434 v_0 := v.Args[0] 7435 if v_0.Op != OpARMMOVWconst { 7436 break 7437 } 7438 c := v_0.AuxInt 7439 x := v.Args[1] 7440 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7441 break 7442 } 7443 v.reset(OpARMRSBshiftLL) 7444 v.AuxInt = log2(c + 1) 7445 v.AddArg(x) 7446 v.AddArg(x) 7447 return true 7448 } 7449 // match: (MUL (MOVWconst [c]) x) 7450 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7451 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7452 for { 7453 v_0 := v.Args[0] 7454 if v_0.Op != OpARMMOVWconst { 7455 break 7456 } 7457 c := v_0.AuxInt 7458 x := v.Args[1] 7459 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7460 break 7461 } 7462 v.reset(OpARMSLLconst) 7463 v.AuxInt = log2(c / 3) 7464 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7465 v0.AuxInt = 1 7466 v0.AddArg(x) 7467 v0.AddArg(x) 7468 v.AddArg(v0) 7469 return true 7470 } 7471 // match: (MUL (MOVWconst [c]) x) 7472 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7473 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7474 for { 7475 v_0 := v.Args[0] 7476 if v_0.Op != OpARMMOVWconst { 7477 break 7478 } 7479 c := v_0.AuxInt 7480 x := v.Args[1] 7481 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7482 break 7483 } 7484 v.reset(OpARMSLLconst) 7485 v.AuxInt = log2(c / 5) 7486 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7487 v0.AuxInt = 2 7488 v0.AddArg(x) 7489 v0.AddArg(x) 7490 v.AddArg(v0) 7491 return true 7492 } 7493 // match: (MUL (MOVWconst [c]) x) 7494 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7495 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7496 for { 7497 v_0 := v.Args[0] 7498 if v_0.Op != OpARMMOVWconst { 7499 break 7500 } 7501 c := v_0.AuxInt 7502 x := v.Args[1] 7503 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7504 break 7505 } 7506 v.reset(OpARMSLLconst) 7507 v.AuxInt = log2(c / 7) 7508 v0 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7509 v0.AuxInt = 3 7510 v0.AddArg(x) 7511 v0.AddArg(x) 7512 v.AddArg(v0) 7513 return true 7514 } 7515 // match: (MUL (MOVWconst [c]) x) 7516 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7517 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7518 for { 7519 v_0 := v.Args[0] 7520 if v_0.Op != OpARMMOVWconst { 7521 break 7522 } 7523 c := v_0.AuxInt 7524 x := v.Args[1] 7525 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7526 break 7527 } 7528 v.reset(OpARMSLLconst) 7529 v.AuxInt = log2(c / 9) 7530 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7531 v0.AuxInt = 3 7532 v0.AddArg(x) 7533 v0.AddArg(x) 7534 v.AddArg(v0) 7535 return true 7536 } 7537 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 7538 // cond: 7539 // result: (MOVWconst [int64(int32(c*d))]) 7540 for { 7541 v_0 := v.Args[0] 7542 if v_0.Op != OpARMMOVWconst { 7543 break 7544 } 7545 c := v_0.AuxInt 7546 v_1 := v.Args[1] 7547 if v_1.Op != OpARMMOVWconst { 7548 break 7549 } 7550 d := v_1.AuxInt 7551 v.reset(OpARMMOVWconst) 7552 v.AuxInt = int64(int32(c * d)) 7553 return true 7554 } 7555 return false 7556 } 7557 func rewriteValueARM_OpARMMULA(v *Value, config *Config) bool { 7558 b := v.Block 7559 _ = b 7560 // match: (MULA x (MOVWconst [c]) a) 7561 // cond: int32(c) == -1 7562 // result: (SUB a x) 7563 for { 7564 x := v.Args[0] 7565 v_1 := v.Args[1] 7566 if v_1.Op != OpARMMOVWconst { 7567 break 7568 } 7569 c := v_1.AuxInt 7570 a := v.Args[2] 7571 if !(int32(c) == -1) { 7572 break 7573 } 7574 v.reset(OpARMSUB) 7575 v.AddArg(a) 7576 v.AddArg(x) 7577 return true 7578 } 7579 // match: (MULA _ (MOVWconst [0]) a) 7580 // cond: 7581 // result: a 7582 for { 7583 v_1 := v.Args[1] 7584 if v_1.Op != OpARMMOVWconst { 7585 break 7586 } 7587 if v_1.AuxInt != 0 { 7588 break 7589 } 7590 a := v.Args[2] 7591 v.reset(OpCopy) 7592 v.Type = a.Type 7593 v.AddArg(a) 7594 return true 7595 } 7596 // match: (MULA x (MOVWconst [1]) a) 7597 // cond: 7598 // result: (ADD x a) 7599 for { 7600 x := v.Args[0] 7601 v_1 := v.Args[1] 7602 if v_1.Op != OpARMMOVWconst { 7603 break 7604 } 7605 if v_1.AuxInt != 1 { 7606 break 7607 } 7608 a := v.Args[2] 7609 v.reset(OpARMADD) 7610 v.AddArg(x) 7611 v.AddArg(a) 7612 return true 7613 } 7614 // match: (MULA x (MOVWconst [c]) a) 7615 // cond: isPowerOfTwo(c) 7616 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 7617 for { 7618 x := v.Args[0] 7619 v_1 := v.Args[1] 7620 if v_1.Op != OpARMMOVWconst { 7621 break 7622 } 7623 c := v_1.AuxInt 7624 a := v.Args[2] 7625 if !(isPowerOfTwo(c)) { 7626 break 7627 } 7628 v.reset(OpARMADD) 7629 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7630 v0.AuxInt = log2(c) 7631 v0.AddArg(x) 7632 v.AddArg(v0) 7633 v.AddArg(a) 7634 return true 7635 } 7636 // match: (MULA x (MOVWconst [c]) a) 7637 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7638 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 7639 for { 7640 x := v.Args[0] 7641 v_1 := v.Args[1] 7642 if v_1.Op != OpARMMOVWconst { 7643 break 7644 } 7645 c := v_1.AuxInt 7646 a := v.Args[2] 7647 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7648 break 7649 } 7650 v.reset(OpARMADD) 7651 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7652 v0.AuxInt = log2(c - 1) 7653 v0.AddArg(x) 7654 v0.AddArg(x) 7655 v.AddArg(v0) 7656 v.AddArg(a) 7657 return true 7658 } 7659 // match: (MULA x (MOVWconst [c]) a) 7660 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7661 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 7662 for { 7663 x := v.Args[0] 7664 v_1 := v.Args[1] 7665 if v_1.Op != OpARMMOVWconst { 7666 break 7667 } 7668 c := v_1.AuxInt 7669 a := v.Args[2] 7670 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7671 break 7672 } 7673 v.reset(OpARMADD) 7674 v0 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7675 v0.AuxInt = log2(c + 1) 7676 v0.AddArg(x) 7677 v0.AddArg(x) 7678 v.AddArg(v0) 7679 v.AddArg(a) 7680 return true 7681 } 7682 // match: (MULA x (MOVWconst [c]) a) 7683 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7684 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 7685 for { 7686 x := v.Args[0] 7687 v_1 := v.Args[1] 7688 if v_1.Op != OpARMMOVWconst { 7689 break 7690 } 7691 c := v_1.AuxInt 7692 a := v.Args[2] 7693 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7694 break 7695 } 7696 v.reset(OpARMADD) 7697 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7698 v0.AuxInt = log2(c / 3) 7699 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7700 v1.AuxInt = 1 7701 v1.AddArg(x) 7702 v1.AddArg(x) 7703 v0.AddArg(v1) 7704 v.AddArg(v0) 7705 v.AddArg(a) 7706 return true 7707 } 7708 // match: (MULA x (MOVWconst [c]) a) 7709 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7710 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 7711 for { 7712 x := v.Args[0] 7713 v_1 := v.Args[1] 7714 if v_1.Op != OpARMMOVWconst { 7715 break 7716 } 7717 c := v_1.AuxInt 7718 a := v.Args[2] 7719 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7720 break 7721 } 7722 v.reset(OpARMADD) 7723 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7724 v0.AuxInt = log2(c / 5) 7725 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7726 v1.AuxInt = 2 7727 v1.AddArg(x) 7728 v1.AddArg(x) 7729 v0.AddArg(v1) 7730 v.AddArg(v0) 7731 v.AddArg(a) 7732 return true 7733 } 7734 // match: (MULA x (MOVWconst [c]) a) 7735 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7736 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 7737 for { 7738 x := v.Args[0] 7739 v_1 := v.Args[1] 7740 if v_1.Op != OpARMMOVWconst { 7741 break 7742 } 7743 c := v_1.AuxInt 7744 a := v.Args[2] 7745 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7746 break 7747 } 7748 v.reset(OpARMADD) 7749 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7750 v0.AuxInt = log2(c / 7) 7751 v1 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7752 v1.AuxInt = 3 7753 v1.AddArg(x) 7754 v1.AddArg(x) 7755 v0.AddArg(v1) 7756 v.AddArg(v0) 7757 v.AddArg(a) 7758 return true 7759 } 7760 // match: (MULA x (MOVWconst [c]) a) 7761 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7762 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 7763 for { 7764 x := v.Args[0] 7765 v_1 := v.Args[1] 7766 if v_1.Op != OpARMMOVWconst { 7767 break 7768 } 7769 c := v_1.AuxInt 7770 a := v.Args[2] 7771 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7772 break 7773 } 7774 v.reset(OpARMADD) 7775 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7776 v0.AuxInt = log2(c / 9) 7777 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7778 v1.AuxInt = 3 7779 v1.AddArg(x) 7780 v1.AddArg(x) 7781 v0.AddArg(v1) 7782 v.AddArg(v0) 7783 v.AddArg(a) 7784 return true 7785 } 7786 // match: (MULA (MOVWconst [c]) x a) 7787 // cond: int32(c) == -1 7788 // result: (SUB a x) 7789 for { 7790 v_0 := v.Args[0] 7791 if v_0.Op != OpARMMOVWconst { 7792 break 7793 } 7794 c := v_0.AuxInt 7795 x := v.Args[1] 7796 a := v.Args[2] 7797 if !(int32(c) == -1) { 7798 break 7799 } 7800 v.reset(OpARMSUB) 7801 v.AddArg(a) 7802 v.AddArg(x) 7803 return true 7804 } 7805 // match: (MULA (MOVWconst [0]) _ a) 7806 // cond: 7807 // result: a 7808 for { 7809 v_0 := v.Args[0] 7810 if v_0.Op != OpARMMOVWconst { 7811 break 7812 } 7813 if v_0.AuxInt != 0 { 7814 break 7815 } 7816 a := v.Args[2] 7817 v.reset(OpCopy) 7818 v.Type = a.Type 7819 v.AddArg(a) 7820 return true 7821 } 7822 // match: (MULA (MOVWconst [1]) x a) 7823 // cond: 7824 // result: (ADD x a) 7825 for { 7826 v_0 := v.Args[0] 7827 if v_0.Op != OpARMMOVWconst { 7828 break 7829 } 7830 if v_0.AuxInt != 1 { 7831 break 7832 } 7833 x := v.Args[1] 7834 a := v.Args[2] 7835 v.reset(OpARMADD) 7836 v.AddArg(x) 7837 v.AddArg(a) 7838 return true 7839 } 7840 // match: (MULA (MOVWconst [c]) x a) 7841 // cond: isPowerOfTwo(c) 7842 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 7843 for { 7844 v_0 := v.Args[0] 7845 if v_0.Op != OpARMMOVWconst { 7846 break 7847 } 7848 c := v_0.AuxInt 7849 x := v.Args[1] 7850 a := v.Args[2] 7851 if !(isPowerOfTwo(c)) { 7852 break 7853 } 7854 v.reset(OpARMADD) 7855 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7856 v0.AuxInt = log2(c) 7857 v0.AddArg(x) 7858 v.AddArg(v0) 7859 v.AddArg(a) 7860 return true 7861 } 7862 // match: (MULA (MOVWconst [c]) x a) 7863 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7864 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 7865 for { 7866 v_0 := v.Args[0] 7867 if v_0.Op != OpARMMOVWconst { 7868 break 7869 } 7870 c := v_0.AuxInt 7871 x := v.Args[1] 7872 a := v.Args[2] 7873 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7874 break 7875 } 7876 v.reset(OpARMADD) 7877 v0 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7878 v0.AuxInt = log2(c - 1) 7879 v0.AddArg(x) 7880 v0.AddArg(x) 7881 v.AddArg(v0) 7882 v.AddArg(a) 7883 return true 7884 } 7885 // match: (MULA (MOVWconst [c]) x a) 7886 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7887 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 7888 for { 7889 v_0 := v.Args[0] 7890 if v_0.Op != OpARMMOVWconst { 7891 break 7892 } 7893 c := v_0.AuxInt 7894 x := v.Args[1] 7895 a := v.Args[2] 7896 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7897 break 7898 } 7899 v.reset(OpARMADD) 7900 v0 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7901 v0.AuxInt = log2(c + 1) 7902 v0.AddArg(x) 7903 v0.AddArg(x) 7904 v.AddArg(v0) 7905 v.AddArg(a) 7906 return true 7907 } 7908 // match: (MULA (MOVWconst [c]) x a) 7909 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7910 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 7911 for { 7912 v_0 := v.Args[0] 7913 if v_0.Op != OpARMMOVWconst { 7914 break 7915 } 7916 c := v_0.AuxInt 7917 x := v.Args[1] 7918 a := v.Args[2] 7919 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7920 break 7921 } 7922 v.reset(OpARMADD) 7923 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7924 v0.AuxInt = log2(c / 3) 7925 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7926 v1.AuxInt = 1 7927 v1.AddArg(x) 7928 v1.AddArg(x) 7929 v0.AddArg(v1) 7930 v.AddArg(v0) 7931 v.AddArg(a) 7932 return true 7933 } 7934 // match: (MULA (MOVWconst [c]) x a) 7935 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7936 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 7937 for { 7938 v_0 := v.Args[0] 7939 if v_0.Op != OpARMMOVWconst { 7940 break 7941 } 7942 c := v_0.AuxInt 7943 x := v.Args[1] 7944 a := v.Args[2] 7945 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7946 break 7947 } 7948 v.reset(OpARMADD) 7949 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7950 v0.AuxInt = log2(c / 5) 7951 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 7952 v1.AuxInt = 2 7953 v1.AddArg(x) 7954 v1.AddArg(x) 7955 v0.AddArg(v1) 7956 v.AddArg(v0) 7957 v.AddArg(a) 7958 return true 7959 } 7960 // match: (MULA (MOVWconst [c]) x a) 7961 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7962 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 7963 for { 7964 v_0 := v.Args[0] 7965 if v_0.Op != OpARMMOVWconst { 7966 break 7967 } 7968 c := v_0.AuxInt 7969 x := v.Args[1] 7970 a := v.Args[2] 7971 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7972 break 7973 } 7974 v.reset(OpARMADD) 7975 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 7976 v0.AuxInt = log2(c / 7) 7977 v1 := b.NewValue0(v.Line, OpARMRSBshiftLL, x.Type) 7978 v1.AuxInt = 3 7979 v1.AddArg(x) 7980 v1.AddArg(x) 7981 v0.AddArg(v1) 7982 v.AddArg(v0) 7983 v.AddArg(a) 7984 return true 7985 } 7986 // match: (MULA (MOVWconst [c]) x a) 7987 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7988 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 7989 for { 7990 v_0 := v.Args[0] 7991 if v_0.Op != OpARMMOVWconst { 7992 break 7993 } 7994 c := v_0.AuxInt 7995 x := v.Args[1] 7996 a := v.Args[2] 7997 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7998 break 7999 } 8000 v.reset(OpARMADD) 8001 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 8002 v0.AuxInt = log2(c / 9) 8003 v1 := b.NewValue0(v.Line, OpARMADDshiftLL, x.Type) 8004 v1.AuxInt = 3 8005 v1.AddArg(x) 8006 v1.AddArg(x) 8007 v0.AddArg(v1) 8008 v.AddArg(v0) 8009 v.AddArg(a) 8010 return true 8011 } 8012 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 8013 // cond: 8014 // result: (ADDconst [int64(int32(c*d))] a) 8015 for { 8016 v_0 := v.Args[0] 8017 if v_0.Op != OpARMMOVWconst { 8018 break 8019 } 8020 c := v_0.AuxInt 8021 v_1 := v.Args[1] 8022 if v_1.Op != OpARMMOVWconst { 8023 break 8024 } 8025 d := v_1.AuxInt 8026 a := v.Args[2] 8027 v.reset(OpARMADDconst) 8028 v.AuxInt = int64(int32(c * d)) 8029 v.AddArg(a) 8030 return true 8031 } 8032 return false 8033 } 8034 func rewriteValueARM_OpARMMVN(v *Value, config *Config) bool { 8035 b := v.Block 8036 _ = b 8037 // match: (MVN (MOVWconst [c])) 8038 // cond: 8039 // result: (MOVWconst [^c]) 8040 for { 8041 v_0 := v.Args[0] 8042 if v_0.Op != OpARMMOVWconst { 8043 break 8044 } 8045 c := v_0.AuxInt 8046 v.reset(OpARMMOVWconst) 8047 v.AuxInt = ^c 8048 return true 8049 } 8050 // match: (MVN (SLLconst [c] x)) 8051 // cond: 8052 // result: (MVNshiftLL x [c]) 8053 for { 8054 v_0 := v.Args[0] 8055 if v_0.Op != OpARMSLLconst { 8056 break 8057 } 8058 c := v_0.AuxInt 8059 x := v_0.Args[0] 8060 v.reset(OpARMMVNshiftLL) 8061 v.AuxInt = c 8062 v.AddArg(x) 8063 return true 8064 } 8065 // match: (MVN (SRLconst [c] x)) 8066 // cond: 8067 // result: (MVNshiftRL x [c]) 8068 for { 8069 v_0 := v.Args[0] 8070 if v_0.Op != OpARMSRLconst { 8071 break 8072 } 8073 c := v_0.AuxInt 8074 x := v_0.Args[0] 8075 v.reset(OpARMMVNshiftRL) 8076 v.AuxInt = c 8077 v.AddArg(x) 8078 return true 8079 } 8080 // match: (MVN (SRAconst [c] x)) 8081 // cond: 8082 // result: (MVNshiftRA x [c]) 8083 for { 8084 v_0 := v.Args[0] 8085 if v_0.Op != OpARMSRAconst { 8086 break 8087 } 8088 c := v_0.AuxInt 8089 x := v_0.Args[0] 8090 v.reset(OpARMMVNshiftRA) 8091 v.AuxInt = c 8092 v.AddArg(x) 8093 return true 8094 } 8095 // match: (MVN (SLL x y)) 8096 // cond: 8097 // result: (MVNshiftLLreg x y) 8098 for { 8099 v_0 := v.Args[0] 8100 if v_0.Op != OpARMSLL { 8101 break 8102 } 8103 x := v_0.Args[0] 8104 y := v_0.Args[1] 8105 v.reset(OpARMMVNshiftLLreg) 8106 v.AddArg(x) 8107 v.AddArg(y) 8108 return true 8109 } 8110 // match: (MVN (SRL x y)) 8111 // cond: 8112 // result: (MVNshiftRLreg x y) 8113 for { 8114 v_0 := v.Args[0] 8115 if v_0.Op != OpARMSRL { 8116 break 8117 } 8118 x := v_0.Args[0] 8119 y := v_0.Args[1] 8120 v.reset(OpARMMVNshiftRLreg) 8121 v.AddArg(x) 8122 v.AddArg(y) 8123 return true 8124 } 8125 // match: (MVN (SRA x y)) 8126 // cond: 8127 // result: (MVNshiftRAreg x y) 8128 for { 8129 v_0 := v.Args[0] 8130 if v_0.Op != OpARMSRA { 8131 break 8132 } 8133 x := v_0.Args[0] 8134 y := v_0.Args[1] 8135 v.reset(OpARMMVNshiftRAreg) 8136 v.AddArg(x) 8137 v.AddArg(y) 8138 return true 8139 } 8140 return false 8141 } 8142 func rewriteValueARM_OpARMMVNshiftLL(v *Value, config *Config) bool { 8143 b := v.Block 8144 _ = b 8145 // match: (MVNshiftLL (MOVWconst [c]) [d]) 8146 // cond: 8147 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 8148 for { 8149 d := v.AuxInt 8150 v_0 := v.Args[0] 8151 if v_0.Op != OpARMMOVWconst { 8152 break 8153 } 8154 c := v_0.AuxInt 8155 v.reset(OpARMMOVWconst) 8156 v.AuxInt = ^int64(uint32(c) << uint64(d)) 8157 return true 8158 } 8159 return false 8160 } 8161 func rewriteValueARM_OpARMMVNshiftLLreg(v *Value, config *Config) bool { 8162 b := v.Block 8163 _ = b 8164 // match: (MVNshiftLLreg x (MOVWconst [c])) 8165 // cond: 8166 // result: (MVNshiftLL x [c]) 8167 for { 8168 x := v.Args[0] 8169 v_1 := v.Args[1] 8170 if v_1.Op != OpARMMOVWconst { 8171 break 8172 } 8173 c := v_1.AuxInt 8174 v.reset(OpARMMVNshiftLL) 8175 v.AuxInt = c 8176 v.AddArg(x) 8177 return true 8178 } 8179 return false 8180 } 8181 func rewriteValueARM_OpARMMVNshiftRA(v *Value, config *Config) bool { 8182 b := v.Block 8183 _ = b 8184 // match: (MVNshiftRA (MOVWconst [c]) [d]) 8185 // cond: 8186 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 8187 for { 8188 d := v.AuxInt 8189 v_0 := v.Args[0] 8190 if v_0.Op != OpARMMOVWconst { 8191 break 8192 } 8193 c := v_0.AuxInt 8194 v.reset(OpARMMOVWconst) 8195 v.AuxInt = ^int64(int32(c) >> uint64(d)) 8196 return true 8197 } 8198 return false 8199 } 8200 func rewriteValueARM_OpARMMVNshiftRAreg(v *Value, config *Config) bool { 8201 b := v.Block 8202 _ = b 8203 // match: (MVNshiftRAreg x (MOVWconst [c])) 8204 // cond: 8205 // result: (MVNshiftRA x [c]) 8206 for { 8207 x := v.Args[0] 8208 v_1 := v.Args[1] 8209 if v_1.Op != OpARMMOVWconst { 8210 break 8211 } 8212 c := v_1.AuxInt 8213 v.reset(OpARMMVNshiftRA) 8214 v.AuxInt = c 8215 v.AddArg(x) 8216 return true 8217 } 8218 return false 8219 } 8220 func rewriteValueARM_OpARMMVNshiftRL(v *Value, config *Config) bool { 8221 b := v.Block 8222 _ = b 8223 // match: (MVNshiftRL (MOVWconst [c]) [d]) 8224 // cond: 8225 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 8226 for { 8227 d := v.AuxInt 8228 v_0 := v.Args[0] 8229 if v_0.Op != OpARMMOVWconst { 8230 break 8231 } 8232 c := v_0.AuxInt 8233 v.reset(OpARMMOVWconst) 8234 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 8235 return true 8236 } 8237 return false 8238 } 8239 func rewriteValueARM_OpARMMVNshiftRLreg(v *Value, config *Config) bool { 8240 b := v.Block 8241 _ = b 8242 // match: (MVNshiftRLreg x (MOVWconst [c])) 8243 // cond: 8244 // result: (MVNshiftRL x [c]) 8245 for { 8246 x := v.Args[0] 8247 v_1 := v.Args[1] 8248 if v_1.Op != OpARMMOVWconst { 8249 break 8250 } 8251 c := v_1.AuxInt 8252 v.reset(OpARMMVNshiftRL) 8253 v.AuxInt = c 8254 v.AddArg(x) 8255 return true 8256 } 8257 return false 8258 } 8259 func rewriteValueARM_OpARMNotEqual(v *Value, config *Config) bool { 8260 b := v.Block 8261 _ = b 8262 // match: (NotEqual (FlagEQ)) 8263 // cond: 8264 // result: (MOVWconst [0]) 8265 for { 8266 v_0 := v.Args[0] 8267 if v_0.Op != OpARMFlagEQ { 8268 break 8269 } 8270 v.reset(OpARMMOVWconst) 8271 v.AuxInt = 0 8272 return true 8273 } 8274 // match: (NotEqual (FlagLT_ULT)) 8275 // cond: 8276 // result: (MOVWconst [1]) 8277 for { 8278 v_0 := v.Args[0] 8279 if v_0.Op != OpARMFlagLT_ULT { 8280 break 8281 } 8282 v.reset(OpARMMOVWconst) 8283 v.AuxInt = 1 8284 return true 8285 } 8286 // match: (NotEqual (FlagLT_UGT)) 8287 // cond: 8288 // result: (MOVWconst [1]) 8289 for { 8290 v_0 := v.Args[0] 8291 if v_0.Op != OpARMFlagLT_UGT { 8292 break 8293 } 8294 v.reset(OpARMMOVWconst) 8295 v.AuxInt = 1 8296 return true 8297 } 8298 // match: (NotEqual (FlagGT_ULT)) 8299 // cond: 8300 // result: (MOVWconst [1]) 8301 for { 8302 v_0 := v.Args[0] 8303 if v_0.Op != OpARMFlagGT_ULT { 8304 break 8305 } 8306 v.reset(OpARMMOVWconst) 8307 v.AuxInt = 1 8308 return true 8309 } 8310 // match: (NotEqual (FlagGT_UGT)) 8311 // cond: 8312 // result: (MOVWconst [1]) 8313 for { 8314 v_0 := v.Args[0] 8315 if v_0.Op != OpARMFlagGT_UGT { 8316 break 8317 } 8318 v.reset(OpARMMOVWconst) 8319 v.AuxInt = 1 8320 return true 8321 } 8322 // match: (NotEqual (InvertFlags x)) 8323 // cond: 8324 // result: (NotEqual x) 8325 for { 8326 v_0 := v.Args[0] 8327 if v_0.Op != OpARMInvertFlags { 8328 break 8329 } 8330 x := v_0.Args[0] 8331 v.reset(OpARMNotEqual) 8332 v.AddArg(x) 8333 return true 8334 } 8335 return false 8336 } 8337 func rewriteValueARM_OpARMOR(v *Value, config *Config) bool { 8338 b := v.Block 8339 _ = b 8340 // match: (OR (MOVWconst [c]) x) 8341 // cond: 8342 // result: (ORconst [c] x) 8343 for { 8344 v_0 := v.Args[0] 8345 if v_0.Op != OpARMMOVWconst { 8346 break 8347 } 8348 c := v_0.AuxInt 8349 x := v.Args[1] 8350 v.reset(OpARMORconst) 8351 v.AuxInt = c 8352 v.AddArg(x) 8353 return true 8354 } 8355 // match: (OR x (MOVWconst [c])) 8356 // cond: 8357 // result: (ORconst [c] x) 8358 for { 8359 x := v.Args[0] 8360 v_1 := v.Args[1] 8361 if v_1.Op != OpARMMOVWconst { 8362 break 8363 } 8364 c := v_1.AuxInt 8365 v.reset(OpARMORconst) 8366 v.AuxInt = c 8367 v.AddArg(x) 8368 return true 8369 } 8370 // match: (OR x (SLLconst [c] y)) 8371 // cond: 8372 // result: (ORshiftLL x y [c]) 8373 for { 8374 x := v.Args[0] 8375 v_1 := v.Args[1] 8376 if v_1.Op != OpARMSLLconst { 8377 break 8378 } 8379 c := v_1.AuxInt 8380 y := v_1.Args[0] 8381 v.reset(OpARMORshiftLL) 8382 v.AuxInt = c 8383 v.AddArg(x) 8384 v.AddArg(y) 8385 return true 8386 } 8387 // match: (OR (SLLconst [c] y) x) 8388 // cond: 8389 // result: (ORshiftLL x y [c]) 8390 for { 8391 v_0 := v.Args[0] 8392 if v_0.Op != OpARMSLLconst { 8393 break 8394 } 8395 c := v_0.AuxInt 8396 y := v_0.Args[0] 8397 x := v.Args[1] 8398 v.reset(OpARMORshiftLL) 8399 v.AuxInt = c 8400 v.AddArg(x) 8401 v.AddArg(y) 8402 return true 8403 } 8404 // match: (OR x (SRLconst [c] y)) 8405 // cond: 8406 // result: (ORshiftRL x y [c]) 8407 for { 8408 x := v.Args[0] 8409 v_1 := v.Args[1] 8410 if v_1.Op != OpARMSRLconst { 8411 break 8412 } 8413 c := v_1.AuxInt 8414 y := v_1.Args[0] 8415 v.reset(OpARMORshiftRL) 8416 v.AuxInt = c 8417 v.AddArg(x) 8418 v.AddArg(y) 8419 return true 8420 } 8421 // match: (OR (SRLconst [c] y) x) 8422 // cond: 8423 // result: (ORshiftRL x y [c]) 8424 for { 8425 v_0 := v.Args[0] 8426 if v_0.Op != OpARMSRLconst { 8427 break 8428 } 8429 c := v_0.AuxInt 8430 y := v_0.Args[0] 8431 x := v.Args[1] 8432 v.reset(OpARMORshiftRL) 8433 v.AuxInt = c 8434 v.AddArg(x) 8435 v.AddArg(y) 8436 return true 8437 } 8438 // match: (OR x (SRAconst [c] y)) 8439 // cond: 8440 // result: (ORshiftRA x y [c]) 8441 for { 8442 x := v.Args[0] 8443 v_1 := v.Args[1] 8444 if v_1.Op != OpARMSRAconst { 8445 break 8446 } 8447 c := v_1.AuxInt 8448 y := v_1.Args[0] 8449 v.reset(OpARMORshiftRA) 8450 v.AuxInt = c 8451 v.AddArg(x) 8452 v.AddArg(y) 8453 return true 8454 } 8455 // match: (OR (SRAconst [c] y) x) 8456 // cond: 8457 // result: (ORshiftRA x y [c]) 8458 for { 8459 v_0 := v.Args[0] 8460 if v_0.Op != OpARMSRAconst { 8461 break 8462 } 8463 c := v_0.AuxInt 8464 y := v_0.Args[0] 8465 x := v.Args[1] 8466 v.reset(OpARMORshiftRA) 8467 v.AuxInt = c 8468 v.AddArg(x) 8469 v.AddArg(y) 8470 return true 8471 } 8472 // match: (OR x (SLL y z)) 8473 // cond: 8474 // result: (ORshiftLLreg x y z) 8475 for { 8476 x := v.Args[0] 8477 v_1 := v.Args[1] 8478 if v_1.Op != OpARMSLL { 8479 break 8480 } 8481 y := v_1.Args[0] 8482 z := v_1.Args[1] 8483 v.reset(OpARMORshiftLLreg) 8484 v.AddArg(x) 8485 v.AddArg(y) 8486 v.AddArg(z) 8487 return true 8488 } 8489 // match: (OR (SLL y z) x) 8490 // cond: 8491 // result: (ORshiftLLreg x y z) 8492 for { 8493 v_0 := v.Args[0] 8494 if v_0.Op != OpARMSLL { 8495 break 8496 } 8497 y := v_0.Args[0] 8498 z := v_0.Args[1] 8499 x := v.Args[1] 8500 v.reset(OpARMORshiftLLreg) 8501 v.AddArg(x) 8502 v.AddArg(y) 8503 v.AddArg(z) 8504 return true 8505 } 8506 // match: (OR x (SRL y z)) 8507 // cond: 8508 // result: (ORshiftRLreg x y z) 8509 for { 8510 x := v.Args[0] 8511 v_1 := v.Args[1] 8512 if v_1.Op != OpARMSRL { 8513 break 8514 } 8515 y := v_1.Args[0] 8516 z := v_1.Args[1] 8517 v.reset(OpARMORshiftRLreg) 8518 v.AddArg(x) 8519 v.AddArg(y) 8520 v.AddArg(z) 8521 return true 8522 } 8523 // match: (OR (SRL y z) x) 8524 // cond: 8525 // result: (ORshiftRLreg x y z) 8526 for { 8527 v_0 := v.Args[0] 8528 if v_0.Op != OpARMSRL { 8529 break 8530 } 8531 y := v_0.Args[0] 8532 z := v_0.Args[1] 8533 x := v.Args[1] 8534 v.reset(OpARMORshiftRLreg) 8535 v.AddArg(x) 8536 v.AddArg(y) 8537 v.AddArg(z) 8538 return true 8539 } 8540 // match: (OR x (SRA y z)) 8541 // cond: 8542 // result: (ORshiftRAreg x y z) 8543 for { 8544 x := v.Args[0] 8545 v_1 := v.Args[1] 8546 if v_1.Op != OpARMSRA { 8547 break 8548 } 8549 y := v_1.Args[0] 8550 z := v_1.Args[1] 8551 v.reset(OpARMORshiftRAreg) 8552 v.AddArg(x) 8553 v.AddArg(y) 8554 v.AddArg(z) 8555 return true 8556 } 8557 // match: (OR (SRA y z) x) 8558 // cond: 8559 // result: (ORshiftRAreg x y z) 8560 for { 8561 v_0 := v.Args[0] 8562 if v_0.Op != OpARMSRA { 8563 break 8564 } 8565 y := v_0.Args[0] 8566 z := v_0.Args[1] 8567 x := v.Args[1] 8568 v.reset(OpARMORshiftRAreg) 8569 v.AddArg(x) 8570 v.AddArg(y) 8571 v.AddArg(z) 8572 return true 8573 } 8574 // match: (OR x x) 8575 // cond: 8576 // result: x 8577 for { 8578 x := v.Args[0] 8579 if x != v.Args[1] { 8580 break 8581 } 8582 v.reset(OpCopy) 8583 v.Type = x.Type 8584 v.AddArg(x) 8585 return true 8586 } 8587 return false 8588 } 8589 func rewriteValueARM_OpARMORconst(v *Value, config *Config) bool { 8590 b := v.Block 8591 _ = b 8592 // match: (ORconst [0] x) 8593 // cond: 8594 // result: x 8595 for { 8596 if v.AuxInt != 0 { 8597 break 8598 } 8599 x := v.Args[0] 8600 v.reset(OpCopy) 8601 v.Type = x.Type 8602 v.AddArg(x) 8603 return true 8604 } 8605 // match: (ORconst [c] _) 8606 // cond: int32(c)==-1 8607 // result: (MOVWconst [-1]) 8608 for { 8609 c := v.AuxInt 8610 if !(int32(c) == -1) { 8611 break 8612 } 8613 v.reset(OpARMMOVWconst) 8614 v.AuxInt = -1 8615 return true 8616 } 8617 // match: (ORconst [c] (MOVWconst [d])) 8618 // cond: 8619 // result: (MOVWconst [c|d]) 8620 for { 8621 c := v.AuxInt 8622 v_0 := v.Args[0] 8623 if v_0.Op != OpARMMOVWconst { 8624 break 8625 } 8626 d := v_0.AuxInt 8627 v.reset(OpARMMOVWconst) 8628 v.AuxInt = c | d 8629 return true 8630 } 8631 // match: (ORconst [c] (ORconst [d] x)) 8632 // cond: 8633 // result: (ORconst [c|d] x) 8634 for { 8635 c := v.AuxInt 8636 v_0 := v.Args[0] 8637 if v_0.Op != OpARMORconst { 8638 break 8639 } 8640 d := v_0.AuxInt 8641 x := v_0.Args[0] 8642 v.reset(OpARMORconst) 8643 v.AuxInt = c | d 8644 v.AddArg(x) 8645 return true 8646 } 8647 return false 8648 } 8649 func rewriteValueARM_OpARMORshiftLL(v *Value, config *Config) bool { 8650 b := v.Block 8651 _ = b 8652 // match: (ORshiftLL (MOVWconst [c]) x [d]) 8653 // cond: 8654 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 8655 for { 8656 d := v.AuxInt 8657 v_0 := v.Args[0] 8658 if v_0.Op != OpARMMOVWconst { 8659 break 8660 } 8661 c := v_0.AuxInt 8662 x := v.Args[1] 8663 v.reset(OpARMORconst) 8664 v.AuxInt = c 8665 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 8666 v0.AuxInt = d 8667 v0.AddArg(x) 8668 v.AddArg(v0) 8669 return true 8670 } 8671 // match: (ORshiftLL x (MOVWconst [c]) [d]) 8672 // cond: 8673 // result: (ORconst x [int64(uint32(c)<<uint64(d))]) 8674 for { 8675 d := v.AuxInt 8676 x := v.Args[0] 8677 v_1 := v.Args[1] 8678 if v_1.Op != OpARMMOVWconst { 8679 break 8680 } 8681 c := v_1.AuxInt 8682 v.reset(OpARMORconst) 8683 v.AuxInt = int64(uint32(c) << uint64(d)) 8684 v.AddArg(x) 8685 return true 8686 } 8687 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 8688 // cond: c==d 8689 // result: y 8690 for { 8691 d := v.AuxInt 8692 x := v.Args[0] 8693 y := v.Args[1] 8694 if y.Op != OpARMSLLconst { 8695 break 8696 } 8697 c := y.AuxInt 8698 if x != y.Args[0] { 8699 break 8700 } 8701 if !(c == d) { 8702 break 8703 } 8704 v.reset(OpCopy) 8705 v.Type = y.Type 8706 v.AddArg(y) 8707 return true 8708 } 8709 return false 8710 } 8711 func rewriteValueARM_OpARMORshiftLLreg(v *Value, config *Config) bool { 8712 b := v.Block 8713 _ = b 8714 // match: (ORshiftLLreg (MOVWconst [c]) x y) 8715 // cond: 8716 // result: (ORconst [c] (SLL <x.Type> x y)) 8717 for { 8718 v_0 := v.Args[0] 8719 if v_0.Op != OpARMMOVWconst { 8720 break 8721 } 8722 c := v_0.AuxInt 8723 x := v.Args[1] 8724 y := v.Args[2] 8725 v.reset(OpARMORconst) 8726 v.AuxInt = c 8727 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 8728 v0.AddArg(x) 8729 v0.AddArg(y) 8730 v.AddArg(v0) 8731 return true 8732 } 8733 // match: (ORshiftLLreg x y (MOVWconst [c])) 8734 // cond: 8735 // result: (ORshiftLL x y [c]) 8736 for { 8737 x := v.Args[0] 8738 y := v.Args[1] 8739 v_2 := v.Args[2] 8740 if v_2.Op != OpARMMOVWconst { 8741 break 8742 } 8743 c := v_2.AuxInt 8744 v.reset(OpARMORshiftLL) 8745 v.AuxInt = c 8746 v.AddArg(x) 8747 v.AddArg(y) 8748 return true 8749 } 8750 return false 8751 } 8752 func rewriteValueARM_OpARMORshiftRA(v *Value, config *Config) bool { 8753 b := v.Block 8754 _ = b 8755 // match: (ORshiftRA (MOVWconst [c]) x [d]) 8756 // cond: 8757 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 8758 for { 8759 d := v.AuxInt 8760 v_0 := v.Args[0] 8761 if v_0.Op != OpARMMOVWconst { 8762 break 8763 } 8764 c := v_0.AuxInt 8765 x := v.Args[1] 8766 v.reset(OpARMORconst) 8767 v.AuxInt = c 8768 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 8769 v0.AuxInt = d 8770 v0.AddArg(x) 8771 v.AddArg(v0) 8772 return true 8773 } 8774 // match: (ORshiftRA x (MOVWconst [c]) [d]) 8775 // cond: 8776 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 8777 for { 8778 d := v.AuxInt 8779 x := v.Args[0] 8780 v_1 := v.Args[1] 8781 if v_1.Op != OpARMMOVWconst { 8782 break 8783 } 8784 c := v_1.AuxInt 8785 v.reset(OpARMORconst) 8786 v.AuxInt = int64(int32(c) >> uint64(d)) 8787 v.AddArg(x) 8788 return true 8789 } 8790 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 8791 // cond: c==d 8792 // result: y 8793 for { 8794 d := v.AuxInt 8795 x := v.Args[0] 8796 y := v.Args[1] 8797 if y.Op != OpARMSRAconst { 8798 break 8799 } 8800 c := y.AuxInt 8801 if x != y.Args[0] { 8802 break 8803 } 8804 if !(c == d) { 8805 break 8806 } 8807 v.reset(OpCopy) 8808 v.Type = y.Type 8809 v.AddArg(y) 8810 return true 8811 } 8812 return false 8813 } 8814 func rewriteValueARM_OpARMORshiftRAreg(v *Value, config *Config) bool { 8815 b := v.Block 8816 _ = b 8817 // match: (ORshiftRAreg (MOVWconst [c]) x y) 8818 // cond: 8819 // result: (ORconst [c] (SRA <x.Type> x y)) 8820 for { 8821 v_0 := v.Args[0] 8822 if v_0.Op != OpARMMOVWconst { 8823 break 8824 } 8825 c := v_0.AuxInt 8826 x := v.Args[1] 8827 y := v.Args[2] 8828 v.reset(OpARMORconst) 8829 v.AuxInt = c 8830 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 8831 v0.AddArg(x) 8832 v0.AddArg(y) 8833 v.AddArg(v0) 8834 return true 8835 } 8836 // match: (ORshiftRAreg x y (MOVWconst [c])) 8837 // cond: 8838 // result: (ORshiftRA x y [c]) 8839 for { 8840 x := v.Args[0] 8841 y := v.Args[1] 8842 v_2 := v.Args[2] 8843 if v_2.Op != OpARMMOVWconst { 8844 break 8845 } 8846 c := v_2.AuxInt 8847 v.reset(OpARMORshiftRA) 8848 v.AuxInt = c 8849 v.AddArg(x) 8850 v.AddArg(y) 8851 return true 8852 } 8853 return false 8854 } 8855 func rewriteValueARM_OpARMORshiftRL(v *Value, config *Config) bool { 8856 b := v.Block 8857 _ = b 8858 // match: (ORshiftRL (MOVWconst [c]) x [d]) 8859 // cond: 8860 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 8861 for { 8862 d := v.AuxInt 8863 v_0 := v.Args[0] 8864 if v_0.Op != OpARMMOVWconst { 8865 break 8866 } 8867 c := v_0.AuxInt 8868 x := v.Args[1] 8869 v.reset(OpARMORconst) 8870 v.AuxInt = c 8871 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 8872 v0.AuxInt = d 8873 v0.AddArg(x) 8874 v.AddArg(v0) 8875 return true 8876 } 8877 // match: (ORshiftRL x (MOVWconst [c]) [d]) 8878 // cond: 8879 // result: (ORconst x [int64(uint32(c)>>uint64(d))]) 8880 for { 8881 d := v.AuxInt 8882 x := v.Args[0] 8883 v_1 := v.Args[1] 8884 if v_1.Op != OpARMMOVWconst { 8885 break 8886 } 8887 c := v_1.AuxInt 8888 v.reset(OpARMORconst) 8889 v.AuxInt = int64(uint32(c) >> uint64(d)) 8890 v.AddArg(x) 8891 return true 8892 } 8893 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 8894 // cond: c==d 8895 // result: y 8896 for { 8897 d := v.AuxInt 8898 x := v.Args[0] 8899 y := v.Args[1] 8900 if y.Op != OpARMSRLconst { 8901 break 8902 } 8903 c := y.AuxInt 8904 if x != y.Args[0] { 8905 break 8906 } 8907 if !(c == d) { 8908 break 8909 } 8910 v.reset(OpCopy) 8911 v.Type = y.Type 8912 v.AddArg(y) 8913 return true 8914 } 8915 return false 8916 } 8917 func rewriteValueARM_OpARMORshiftRLreg(v *Value, config *Config) bool { 8918 b := v.Block 8919 _ = b 8920 // match: (ORshiftRLreg (MOVWconst [c]) x y) 8921 // cond: 8922 // result: (ORconst [c] (SRL <x.Type> x y)) 8923 for { 8924 v_0 := v.Args[0] 8925 if v_0.Op != OpARMMOVWconst { 8926 break 8927 } 8928 c := v_0.AuxInt 8929 x := v.Args[1] 8930 y := v.Args[2] 8931 v.reset(OpARMORconst) 8932 v.AuxInt = c 8933 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 8934 v0.AddArg(x) 8935 v0.AddArg(y) 8936 v.AddArg(v0) 8937 return true 8938 } 8939 // match: (ORshiftRLreg x y (MOVWconst [c])) 8940 // cond: 8941 // result: (ORshiftRL x y [c]) 8942 for { 8943 x := v.Args[0] 8944 y := v.Args[1] 8945 v_2 := v.Args[2] 8946 if v_2.Op != OpARMMOVWconst { 8947 break 8948 } 8949 c := v_2.AuxInt 8950 v.reset(OpARMORshiftRL) 8951 v.AuxInt = c 8952 v.AddArg(x) 8953 v.AddArg(y) 8954 return true 8955 } 8956 return false 8957 } 8958 func rewriteValueARM_OpARMRSB(v *Value, config *Config) bool { 8959 b := v.Block 8960 _ = b 8961 // match: (RSB (MOVWconst [c]) x) 8962 // cond: 8963 // result: (SUBconst [c] x) 8964 for { 8965 v_0 := v.Args[0] 8966 if v_0.Op != OpARMMOVWconst { 8967 break 8968 } 8969 c := v_0.AuxInt 8970 x := v.Args[1] 8971 v.reset(OpARMSUBconst) 8972 v.AuxInt = c 8973 v.AddArg(x) 8974 return true 8975 } 8976 // match: (RSB x (MOVWconst [c])) 8977 // cond: 8978 // result: (RSBconst [c] x) 8979 for { 8980 x := v.Args[0] 8981 v_1 := v.Args[1] 8982 if v_1.Op != OpARMMOVWconst { 8983 break 8984 } 8985 c := v_1.AuxInt 8986 v.reset(OpARMRSBconst) 8987 v.AuxInt = c 8988 v.AddArg(x) 8989 return true 8990 } 8991 // match: (RSB x (SLLconst [c] y)) 8992 // cond: 8993 // result: (RSBshiftLL x y [c]) 8994 for { 8995 x := v.Args[0] 8996 v_1 := v.Args[1] 8997 if v_1.Op != OpARMSLLconst { 8998 break 8999 } 9000 c := v_1.AuxInt 9001 y := v_1.Args[0] 9002 v.reset(OpARMRSBshiftLL) 9003 v.AuxInt = c 9004 v.AddArg(x) 9005 v.AddArg(y) 9006 return true 9007 } 9008 // match: (RSB (SLLconst [c] y) x) 9009 // cond: 9010 // result: (SUBshiftLL x y [c]) 9011 for { 9012 v_0 := v.Args[0] 9013 if v_0.Op != OpARMSLLconst { 9014 break 9015 } 9016 c := v_0.AuxInt 9017 y := v_0.Args[0] 9018 x := v.Args[1] 9019 v.reset(OpARMSUBshiftLL) 9020 v.AuxInt = c 9021 v.AddArg(x) 9022 v.AddArg(y) 9023 return true 9024 } 9025 // match: (RSB x (SRLconst [c] y)) 9026 // cond: 9027 // result: (RSBshiftRL x y [c]) 9028 for { 9029 x := v.Args[0] 9030 v_1 := v.Args[1] 9031 if v_1.Op != OpARMSRLconst { 9032 break 9033 } 9034 c := v_1.AuxInt 9035 y := v_1.Args[0] 9036 v.reset(OpARMRSBshiftRL) 9037 v.AuxInt = c 9038 v.AddArg(x) 9039 v.AddArg(y) 9040 return true 9041 } 9042 // match: (RSB (SRLconst [c] y) x) 9043 // cond: 9044 // result: (SUBshiftRL x y [c]) 9045 for { 9046 v_0 := v.Args[0] 9047 if v_0.Op != OpARMSRLconst { 9048 break 9049 } 9050 c := v_0.AuxInt 9051 y := v_0.Args[0] 9052 x := v.Args[1] 9053 v.reset(OpARMSUBshiftRL) 9054 v.AuxInt = c 9055 v.AddArg(x) 9056 v.AddArg(y) 9057 return true 9058 } 9059 // match: (RSB x (SRAconst [c] y)) 9060 // cond: 9061 // result: (RSBshiftRA x y [c]) 9062 for { 9063 x := v.Args[0] 9064 v_1 := v.Args[1] 9065 if v_1.Op != OpARMSRAconst { 9066 break 9067 } 9068 c := v_1.AuxInt 9069 y := v_1.Args[0] 9070 v.reset(OpARMRSBshiftRA) 9071 v.AuxInt = c 9072 v.AddArg(x) 9073 v.AddArg(y) 9074 return true 9075 } 9076 // match: (RSB (SRAconst [c] y) x) 9077 // cond: 9078 // result: (SUBshiftRA x y [c]) 9079 for { 9080 v_0 := v.Args[0] 9081 if v_0.Op != OpARMSRAconst { 9082 break 9083 } 9084 c := v_0.AuxInt 9085 y := v_0.Args[0] 9086 x := v.Args[1] 9087 v.reset(OpARMSUBshiftRA) 9088 v.AuxInt = c 9089 v.AddArg(x) 9090 v.AddArg(y) 9091 return true 9092 } 9093 // match: (RSB x (SLL y z)) 9094 // cond: 9095 // result: (RSBshiftLLreg x y z) 9096 for { 9097 x := v.Args[0] 9098 v_1 := v.Args[1] 9099 if v_1.Op != OpARMSLL { 9100 break 9101 } 9102 y := v_1.Args[0] 9103 z := v_1.Args[1] 9104 v.reset(OpARMRSBshiftLLreg) 9105 v.AddArg(x) 9106 v.AddArg(y) 9107 v.AddArg(z) 9108 return true 9109 } 9110 // match: (RSB (SLL y z) x) 9111 // cond: 9112 // result: (SUBshiftLLreg x y z) 9113 for { 9114 v_0 := v.Args[0] 9115 if v_0.Op != OpARMSLL { 9116 break 9117 } 9118 y := v_0.Args[0] 9119 z := v_0.Args[1] 9120 x := v.Args[1] 9121 v.reset(OpARMSUBshiftLLreg) 9122 v.AddArg(x) 9123 v.AddArg(y) 9124 v.AddArg(z) 9125 return true 9126 } 9127 // match: (RSB x (SRL y z)) 9128 // cond: 9129 // result: (RSBshiftRLreg x y z) 9130 for { 9131 x := v.Args[0] 9132 v_1 := v.Args[1] 9133 if v_1.Op != OpARMSRL { 9134 break 9135 } 9136 y := v_1.Args[0] 9137 z := v_1.Args[1] 9138 v.reset(OpARMRSBshiftRLreg) 9139 v.AddArg(x) 9140 v.AddArg(y) 9141 v.AddArg(z) 9142 return true 9143 } 9144 // match: (RSB (SRL y z) x) 9145 // cond: 9146 // result: (SUBshiftRLreg x y z) 9147 for { 9148 v_0 := v.Args[0] 9149 if v_0.Op != OpARMSRL { 9150 break 9151 } 9152 y := v_0.Args[0] 9153 z := v_0.Args[1] 9154 x := v.Args[1] 9155 v.reset(OpARMSUBshiftRLreg) 9156 v.AddArg(x) 9157 v.AddArg(y) 9158 v.AddArg(z) 9159 return true 9160 } 9161 // match: (RSB x (SRA y z)) 9162 // cond: 9163 // result: (RSBshiftRAreg x y z) 9164 for { 9165 x := v.Args[0] 9166 v_1 := v.Args[1] 9167 if v_1.Op != OpARMSRA { 9168 break 9169 } 9170 y := v_1.Args[0] 9171 z := v_1.Args[1] 9172 v.reset(OpARMRSBshiftRAreg) 9173 v.AddArg(x) 9174 v.AddArg(y) 9175 v.AddArg(z) 9176 return true 9177 } 9178 // match: (RSB (SRA y z) x) 9179 // cond: 9180 // result: (SUBshiftRAreg x y z) 9181 for { 9182 v_0 := v.Args[0] 9183 if v_0.Op != OpARMSRA { 9184 break 9185 } 9186 y := v_0.Args[0] 9187 z := v_0.Args[1] 9188 x := v.Args[1] 9189 v.reset(OpARMSUBshiftRAreg) 9190 v.AddArg(x) 9191 v.AddArg(y) 9192 v.AddArg(z) 9193 return true 9194 } 9195 // match: (RSB x x) 9196 // cond: 9197 // result: (MOVWconst [0]) 9198 for { 9199 x := v.Args[0] 9200 if x != v.Args[1] { 9201 break 9202 } 9203 v.reset(OpARMMOVWconst) 9204 v.AuxInt = 0 9205 return true 9206 } 9207 return false 9208 } 9209 func rewriteValueARM_OpARMRSBSshiftLL(v *Value, config *Config) bool { 9210 b := v.Block 9211 _ = b 9212 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 9213 // cond: 9214 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 9215 for { 9216 d := v.AuxInt 9217 v_0 := v.Args[0] 9218 if v_0.Op != OpARMMOVWconst { 9219 break 9220 } 9221 c := v_0.AuxInt 9222 x := v.Args[1] 9223 v.reset(OpARMSUBSconst) 9224 v.AuxInt = c 9225 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 9226 v0.AuxInt = d 9227 v0.AddArg(x) 9228 v.AddArg(v0) 9229 return true 9230 } 9231 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 9232 // cond: 9233 // result: (RSBSconst x [int64(uint32(c)<<uint64(d))]) 9234 for { 9235 d := v.AuxInt 9236 x := v.Args[0] 9237 v_1 := v.Args[1] 9238 if v_1.Op != OpARMMOVWconst { 9239 break 9240 } 9241 c := v_1.AuxInt 9242 v.reset(OpARMRSBSconst) 9243 v.AuxInt = int64(uint32(c) << uint64(d)) 9244 v.AddArg(x) 9245 return true 9246 } 9247 return false 9248 } 9249 func rewriteValueARM_OpARMRSBSshiftLLreg(v *Value, config *Config) bool { 9250 b := v.Block 9251 _ = b 9252 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 9253 // cond: 9254 // result: (SUBSconst [c] (SLL <x.Type> x y)) 9255 for { 9256 v_0 := v.Args[0] 9257 if v_0.Op != OpARMMOVWconst { 9258 break 9259 } 9260 c := v_0.AuxInt 9261 x := v.Args[1] 9262 y := v.Args[2] 9263 v.reset(OpARMSUBSconst) 9264 v.AuxInt = c 9265 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 9266 v0.AddArg(x) 9267 v0.AddArg(y) 9268 v.AddArg(v0) 9269 return true 9270 } 9271 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 9272 // cond: 9273 // result: (RSBSshiftLL x y [c]) 9274 for { 9275 x := v.Args[0] 9276 y := v.Args[1] 9277 v_2 := v.Args[2] 9278 if v_2.Op != OpARMMOVWconst { 9279 break 9280 } 9281 c := v_2.AuxInt 9282 v.reset(OpARMRSBSshiftLL) 9283 v.AuxInt = c 9284 v.AddArg(x) 9285 v.AddArg(y) 9286 return true 9287 } 9288 return false 9289 } 9290 func rewriteValueARM_OpARMRSBSshiftRA(v *Value, config *Config) bool { 9291 b := v.Block 9292 _ = b 9293 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 9294 // cond: 9295 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 9296 for { 9297 d := v.AuxInt 9298 v_0 := v.Args[0] 9299 if v_0.Op != OpARMMOVWconst { 9300 break 9301 } 9302 c := v_0.AuxInt 9303 x := v.Args[1] 9304 v.reset(OpARMSUBSconst) 9305 v.AuxInt = c 9306 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 9307 v0.AuxInt = d 9308 v0.AddArg(x) 9309 v.AddArg(v0) 9310 return true 9311 } 9312 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 9313 // cond: 9314 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 9315 for { 9316 d := v.AuxInt 9317 x := v.Args[0] 9318 v_1 := v.Args[1] 9319 if v_1.Op != OpARMMOVWconst { 9320 break 9321 } 9322 c := v_1.AuxInt 9323 v.reset(OpARMRSBSconst) 9324 v.AuxInt = int64(int32(c) >> uint64(d)) 9325 v.AddArg(x) 9326 return true 9327 } 9328 return false 9329 } 9330 func rewriteValueARM_OpARMRSBSshiftRAreg(v *Value, config *Config) bool { 9331 b := v.Block 9332 _ = b 9333 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 9334 // cond: 9335 // result: (SUBSconst [c] (SRA <x.Type> x y)) 9336 for { 9337 v_0 := v.Args[0] 9338 if v_0.Op != OpARMMOVWconst { 9339 break 9340 } 9341 c := v_0.AuxInt 9342 x := v.Args[1] 9343 y := v.Args[2] 9344 v.reset(OpARMSUBSconst) 9345 v.AuxInt = c 9346 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 9347 v0.AddArg(x) 9348 v0.AddArg(y) 9349 v.AddArg(v0) 9350 return true 9351 } 9352 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 9353 // cond: 9354 // result: (RSBSshiftRA x y [c]) 9355 for { 9356 x := v.Args[0] 9357 y := v.Args[1] 9358 v_2 := v.Args[2] 9359 if v_2.Op != OpARMMOVWconst { 9360 break 9361 } 9362 c := v_2.AuxInt 9363 v.reset(OpARMRSBSshiftRA) 9364 v.AuxInt = c 9365 v.AddArg(x) 9366 v.AddArg(y) 9367 return true 9368 } 9369 return false 9370 } 9371 func rewriteValueARM_OpARMRSBSshiftRL(v *Value, config *Config) bool { 9372 b := v.Block 9373 _ = b 9374 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 9375 // cond: 9376 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 9377 for { 9378 d := v.AuxInt 9379 v_0 := v.Args[0] 9380 if v_0.Op != OpARMMOVWconst { 9381 break 9382 } 9383 c := v_0.AuxInt 9384 x := v.Args[1] 9385 v.reset(OpARMSUBSconst) 9386 v.AuxInt = c 9387 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 9388 v0.AuxInt = d 9389 v0.AddArg(x) 9390 v.AddArg(v0) 9391 return true 9392 } 9393 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 9394 // cond: 9395 // result: (RSBSconst x [int64(uint32(c)>>uint64(d))]) 9396 for { 9397 d := v.AuxInt 9398 x := v.Args[0] 9399 v_1 := v.Args[1] 9400 if v_1.Op != OpARMMOVWconst { 9401 break 9402 } 9403 c := v_1.AuxInt 9404 v.reset(OpARMRSBSconst) 9405 v.AuxInt = int64(uint32(c) >> uint64(d)) 9406 v.AddArg(x) 9407 return true 9408 } 9409 return false 9410 } 9411 func rewriteValueARM_OpARMRSBSshiftRLreg(v *Value, config *Config) bool { 9412 b := v.Block 9413 _ = b 9414 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 9415 // cond: 9416 // result: (SUBSconst [c] (SRL <x.Type> x y)) 9417 for { 9418 v_0 := v.Args[0] 9419 if v_0.Op != OpARMMOVWconst { 9420 break 9421 } 9422 c := v_0.AuxInt 9423 x := v.Args[1] 9424 y := v.Args[2] 9425 v.reset(OpARMSUBSconst) 9426 v.AuxInt = c 9427 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 9428 v0.AddArg(x) 9429 v0.AddArg(y) 9430 v.AddArg(v0) 9431 return true 9432 } 9433 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 9434 // cond: 9435 // result: (RSBSshiftRL x y [c]) 9436 for { 9437 x := v.Args[0] 9438 y := v.Args[1] 9439 v_2 := v.Args[2] 9440 if v_2.Op != OpARMMOVWconst { 9441 break 9442 } 9443 c := v_2.AuxInt 9444 v.reset(OpARMRSBSshiftRL) 9445 v.AuxInt = c 9446 v.AddArg(x) 9447 v.AddArg(y) 9448 return true 9449 } 9450 return false 9451 } 9452 func rewriteValueARM_OpARMRSBconst(v *Value, config *Config) bool { 9453 b := v.Block 9454 _ = b 9455 // match: (RSBconst [c] (MOVWconst [d])) 9456 // cond: 9457 // result: (MOVWconst [int64(int32(c-d))]) 9458 for { 9459 c := v.AuxInt 9460 v_0 := v.Args[0] 9461 if v_0.Op != OpARMMOVWconst { 9462 break 9463 } 9464 d := v_0.AuxInt 9465 v.reset(OpARMMOVWconst) 9466 v.AuxInt = int64(int32(c - d)) 9467 return true 9468 } 9469 // match: (RSBconst [c] (RSBconst [d] x)) 9470 // cond: 9471 // result: (ADDconst [int64(int32(c-d))] x) 9472 for { 9473 c := v.AuxInt 9474 v_0 := v.Args[0] 9475 if v_0.Op != OpARMRSBconst { 9476 break 9477 } 9478 d := v_0.AuxInt 9479 x := v_0.Args[0] 9480 v.reset(OpARMADDconst) 9481 v.AuxInt = int64(int32(c - d)) 9482 v.AddArg(x) 9483 return true 9484 } 9485 // match: (RSBconst [c] (ADDconst [d] x)) 9486 // cond: 9487 // result: (RSBconst [int64(int32(c-d))] x) 9488 for { 9489 c := v.AuxInt 9490 v_0 := v.Args[0] 9491 if v_0.Op != OpARMADDconst { 9492 break 9493 } 9494 d := v_0.AuxInt 9495 x := v_0.Args[0] 9496 v.reset(OpARMRSBconst) 9497 v.AuxInt = int64(int32(c - d)) 9498 v.AddArg(x) 9499 return true 9500 } 9501 // match: (RSBconst [c] (SUBconst [d] x)) 9502 // cond: 9503 // result: (RSBconst [int64(int32(c+d))] x) 9504 for { 9505 c := v.AuxInt 9506 v_0 := v.Args[0] 9507 if v_0.Op != OpARMSUBconst { 9508 break 9509 } 9510 d := v_0.AuxInt 9511 x := v_0.Args[0] 9512 v.reset(OpARMRSBconst) 9513 v.AuxInt = int64(int32(c + d)) 9514 v.AddArg(x) 9515 return true 9516 } 9517 return false 9518 } 9519 func rewriteValueARM_OpARMRSBshiftLL(v *Value, config *Config) bool { 9520 b := v.Block 9521 _ = b 9522 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 9523 // cond: 9524 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 9525 for { 9526 d := v.AuxInt 9527 v_0 := v.Args[0] 9528 if v_0.Op != OpARMMOVWconst { 9529 break 9530 } 9531 c := v_0.AuxInt 9532 x := v.Args[1] 9533 v.reset(OpARMSUBconst) 9534 v.AuxInt = c 9535 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 9536 v0.AuxInt = d 9537 v0.AddArg(x) 9538 v.AddArg(v0) 9539 return true 9540 } 9541 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 9542 // cond: 9543 // result: (RSBconst x [int64(uint32(c)<<uint64(d))]) 9544 for { 9545 d := v.AuxInt 9546 x := v.Args[0] 9547 v_1 := v.Args[1] 9548 if v_1.Op != OpARMMOVWconst { 9549 break 9550 } 9551 c := v_1.AuxInt 9552 v.reset(OpARMRSBconst) 9553 v.AuxInt = int64(uint32(c) << uint64(d)) 9554 v.AddArg(x) 9555 return true 9556 } 9557 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 9558 // cond: c==d 9559 // result: (MOVWconst [0]) 9560 for { 9561 d := v.AuxInt 9562 x := v.Args[0] 9563 v_1 := v.Args[1] 9564 if v_1.Op != OpARMSLLconst { 9565 break 9566 } 9567 c := v_1.AuxInt 9568 if x != v_1.Args[0] { 9569 break 9570 } 9571 if !(c == d) { 9572 break 9573 } 9574 v.reset(OpARMMOVWconst) 9575 v.AuxInt = 0 9576 return true 9577 } 9578 return false 9579 } 9580 func rewriteValueARM_OpARMRSBshiftLLreg(v *Value, config *Config) bool { 9581 b := v.Block 9582 _ = b 9583 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 9584 // cond: 9585 // result: (SUBconst [c] (SLL <x.Type> x y)) 9586 for { 9587 v_0 := v.Args[0] 9588 if v_0.Op != OpARMMOVWconst { 9589 break 9590 } 9591 c := v_0.AuxInt 9592 x := v.Args[1] 9593 y := v.Args[2] 9594 v.reset(OpARMSUBconst) 9595 v.AuxInt = c 9596 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 9597 v0.AddArg(x) 9598 v0.AddArg(y) 9599 v.AddArg(v0) 9600 return true 9601 } 9602 // match: (RSBshiftLLreg x y (MOVWconst [c])) 9603 // cond: 9604 // result: (RSBshiftLL x y [c]) 9605 for { 9606 x := v.Args[0] 9607 y := v.Args[1] 9608 v_2 := v.Args[2] 9609 if v_2.Op != OpARMMOVWconst { 9610 break 9611 } 9612 c := v_2.AuxInt 9613 v.reset(OpARMRSBshiftLL) 9614 v.AuxInt = c 9615 v.AddArg(x) 9616 v.AddArg(y) 9617 return true 9618 } 9619 return false 9620 } 9621 func rewriteValueARM_OpARMRSBshiftRA(v *Value, config *Config) bool { 9622 b := v.Block 9623 _ = b 9624 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 9625 // cond: 9626 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 9627 for { 9628 d := v.AuxInt 9629 v_0 := v.Args[0] 9630 if v_0.Op != OpARMMOVWconst { 9631 break 9632 } 9633 c := v_0.AuxInt 9634 x := v.Args[1] 9635 v.reset(OpARMSUBconst) 9636 v.AuxInt = c 9637 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 9638 v0.AuxInt = d 9639 v0.AddArg(x) 9640 v.AddArg(v0) 9641 return true 9642 } 9643 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 9644 // cond: 9645 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 9646 for { 9647 d := v.AuxInt 9648 x := v.Args[0] 9649 v_1 := v.Args[1] 9650 if v_1.Op != OpARMMOVWconst { 9651 break 9652 } 9653 c := v_1.AuxInt 9654 v.reset(OpARMRSBconst) 9655 v.AuxInt = int64(int32(c) >> uint64(d)) 9656 v.AddArg(x) 9657 return true 9658 } 9659 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 9660 // cond: c==d 9661 // result: (MOVWconst [0]) 9662 for { 9663 d := v.AuxInt 9664 x := v.Args[0] 9665 v_1 := v.Args[1] 9666 if v_1.Op != OpARMSRAconst { 9667 break 9668 } 9669 c := v_1.AuxInt 9670 if x != v_1.Args[0] { 9671 break 9672 } 9673 if !(c == d) { 9674 break 9675 } 9676 v.reset(OpARMMOVWconst) 9677 v.AuxInt = 0 9678 return true 9679 } 9680 return false 9681 } 9682 func rewriteValueARM_OpARMRSBshiftRAreg(v *Value, config *Config) bool { 9683 b := v.Block 9684 _ = b 9685 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 9686 // cond: 9687 // result: (SUBconst [c] (SRA <x.Type> x y)) 9688 for { 9689 v_0 := v.Args[0] 9690 if v_0.Op != OpARMMOVWconst { 9691 break 9692 } 9693 c := v_0.AuxInt 9694 x := v.Args[1] 9695 y := v.Args[2] 9696 v.reset(OpARMSUBconst) 9697 v.AuxInt = c 9698 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 9699 v0.AddArg(x) 9700 v0.AddArg(y) 9701 v.AddArg(v0) 9702 return true 9703 } 9704 // match: (RSBshiftRAreg x y (MOVWconst [c])) 9705 // cond: 9706 // result: (RSBshiftRA x y [c]) 9707 for { 9708 x := v.Args[0] 9709 y := v.Args[1] 9710 v_2 := v.Args[2] 9711 if v_2.Op != OpARMMOVWconst { 9712 break 9713 } 9714 c := v_2.AuxInt 9715 v.reset(OpARMRSBshiftRA) 9716 v.AuxInt = c 9717 v.AddArg(x) 9718 v.AddArg(y) 9719 return true 9720 } 9721 return false 9722 } 9723 func rewriteValueARM_OpARMRSBshiftRL(v *Value, config *Config) bool { 9724 b := v.Block 9725 _ = b 9726 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 9727 // cond: 9728 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 9729 for { 9730 d := v.AuxInt 9731 v_0 := v.Args[0] 9732 if v_0.Op != OpARMMOVWconst { 9733 break 9734 } 9735 c := v_0.AuxInt 9736 x := v.Args[1] 9737 v.reset(OpARMSUBconst) 9738 v.AuxInt = c 9739 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 9740 v0.AuxInt = d 9741 v0.AddArg(x) 9742 v.AddArg(v0) 9743 return true 9744 } 9745 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 9746 // cond: 9747 // result: (RSBconst x [int64(uint32(c)>>uint64(d))]) 9748 for { 9749 d := v.AuxInt 9750 x := v.Args[0] 9751 v_1 := v.Args[1] 9752 if v_1.Op != OpARMMOVWconst { 9753 break 9754 } 9755 c := v_1.AuxInt 9756 v.reset(OpARMRSBconst) 9757 v.AuxInt = int64(uint32(c) >> uint64(d)) 9758 v.AddArg(x) 9759 return true 9760 } 9761 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 9762 // cond: c==d 9763 // result: (MOVWconst [0]) 9764 for { 9765 d := v.AuxInt 9766 x := v.Args[0] 9767 v_1 := v.Args[1] 9768 if v_1.Op != OpARMSRLconst { 9769 break 9770 } 9771 c := v_1.AuxInt 9772 if x != v_1.Args[0] { 9773 break 9774 } 9775 if !(c == d) { 9776 break 9777 } 9778 v.reset(OpARMMOVWconst) 9779 v.AuxInt = 0 9780 return true 9781 } 9782 return false 9783 } 9784 func rewriteValueARM_OpARMRSBshiftRLreg(v *Value, config *Config) bool { 9785 b := v.Block 9786 _ = b 9787 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 9788 // cond: 9789 // result: (SUBconst [c] (SRL <x.Type> x y)) 9790 for { 9791 v_0 := v.Args[0] 9792 if v_0.Op != OpARMMOVWconst { 9793 break 9794 } 9795 c := v_0.AuxInt 9796 x := v.Args[1] 9797 y := v.Args[2] 9798 v.reset(OpARMSUBconst) 9799 v.AuxInt = c 9800 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 9801 v0.AddArg(x) 9802 v0.AddArg(y) 9803 v.AddArg(v0) 9804 return true 9805 } 9806 // match: (RSBshiftRLreg x y (MOVWconst [c])) 9807 // cond: 9808 // result: (RSBshiftRL x y [c]) 9809 for { 9810 x := v.Args[0] 9811 y := v.Args[1] 9812 v_2 := v.Args[2] 9813 if v_2.Op != OpARMMOVWconst { 9814 break 9815 } 9816 c := v_2.AuxInt 9817 v.reset(OpARMRSBshiftRL) 9818 v.AuxInt = c 9819 v.AddArg(x) 9820 v.AddArg(y) 9821 return true 9822 } 9823 return false 9824 } 9825 func rewriteValueARM_OpARMRSCconst(v *Value, config *Config) bool { 9826 b := v.Block 9827 _ = b 9828 // match: (RSCconst [c] (ADDconst [d] x) flags) 9829 // cond: 9830 // result: (RSCconst [int64(int32(c-d))] x flags) 9831 for { 9832 c := v.AuxInt 9833 v_0 := v.Args[0] 9834 if v_0.Op != OpARMADDconst { 9835 break 9836 } 9837 d := v_0.AuxInt 9838 x := v_0.Args[0] 9839 flags := v.Args[1] 9840 v.reset(OpARMRSCconst) 9841 v.AuxInt = int64(int32(c - d)) 9842 v.AddArg(x) 9843 v.AddArg(flags) 9844 return true 9845 } 9846 // match: (RSCconst [c] (SUBconst [d] x) flags) 9847 // cond: 9848 // result: (RSCconst [int64(int32(c+d))] x flags) 9849 for { 9850 c := v.AuxInt 9851 v_0 := v.Args[0] 9852 if v_0.Op != OpARMSUBconst { 9853 break 9854 } 9855 d := v_0.AuxInt 9856 x := v_0.Args[0] 9857 flags := v.Args[1] 9858 v.reset(OpARMRSCconst) 9859 v.AuxInt = int64(int32(c + d)) 9860 v.AddArg(x) 9861 v.AddArg(flags) 9862 return true 9863 } 9864 return false 9865 } 9866 func rewriteValueARM_OpARMRSCshiftLL(v *Value, config *Config) bool { 9867 b := v.Block 9868 _ = b 9869 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 9870 // cond: 9871 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 9872 for { 9873 d := v.AuxInt 9874 v_0 := v.Args[0] 9875 if v_0.Op != OpARMMOVWconst { 9876 break 9877 } 9878 c := v_0.AuxInt 9879 x := v.Args[1] 9880 flags := v.Args[2] 9881 v.reset(OpARMSBCconst) 9882 v.AuxInt = c 9883 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 9884 v0.AuxInt = d 9885 v0.AddArg(x) 9886 v.AddArg(v0) 9887 v.AddArg(flags) 9888 return true 9889 } 9890 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 9891 // cond: 9892 // result: (RSCconst x [int64(uint32(c)<<uint64(d))] flags) 9893 for { 9894 d := v.AuxInt 9895 x := v.Args[0] 9896 v_1 := v.Args[1] 9897 if v_1.Op != OpARMMOVWconst { 9898 break 9899 } 9900 c := v_1.AuxInt 9901 flags := v.Args[2] 9902 v.reset(OpARMRSCconst) 9903 v.AuxInt = int64(uint32(c) << uint64(d)) 9904 v.AddArg(x) 9905 v.AddArg(flags) 9906 return true 9907 } 9908 return false 9909 } 9910 func rewriteValueARM_OpARMRSCshiftLLreg(v *Value, config *Config) bool { 9911 b := v.Block 9912 _ = b 9913 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 9914 // cond: 9915 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 9916 for { 9917 v_0 := v.Args[0] 9918 if v_0.Op != OpARMMOVWconst { 9919 break 9920 } 9921 c := v_0.AuxInt 9922 x := v.Args[1] 9923 y := v.Args[2] 9924 flags := v.Args[3] 9925 v.reset(OpARMSBCconst) 9926 v.AuxInt = c 9927 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 9928 v0.AddArg(x) 9929 v0.AddArg(y) 9930 v.AddArg(v0) 9931 v.AddArg(flags) 9932 return true 9933 } 9934 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 9935 // cond: 9936 // result: (RSCshiftLL x y [c] flags) 9937 for { 9938 x := v.Args[0] 9939 y := v.Args[1] 9940 v_2 := v.Args[2] 9941 if v_2.Op != OpARMMOVWconst { 9942 break 9943 } 9944 c := v_2.AuxInt 9945 flags := v.Args[3] 9946 v.reset(OpARMRSCshiftLL) 9947 v.AuxInt = c 9948 v.AddArg(x) 9949 v.AddArg(y) 9950 v.AddArg(flags) 9951 return true 9952 } 9953 return false 9954 } 9955 func rewriteValueARM_OpARMRSCshiftRA(v *Value, config *Config) bool { 9956 b := v.Block 9957 _ = b 9958 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 9959 // cond: 9960 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 9961 for { 9962 d := v.AuxInt 9963 v_0 := v.Args[0] 9964 if v_0.Op != OpARMMOVWconst { 9965 break 9966 } 9967 c := v_0.AuxInt 9968 x := v.Args[1] 9969 flags := v.Args[2] 9970 v.reset(OpARMSBCconst) 9971 v.AuxInt = c 9972 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 9973 v0.AuxInt = d 9974 v0.AddArg(x) 9975 v.AddArg(v0) 9976 v.AddArg(flags) 9977 return true 9978 } 9979 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 9980 // cond: 9981 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 9982 for { 9983 d := v.AuxInt 9984 x := v.Args[0] 9985 v_1 := v.Args[1] 9986 if v_1.Op != OpARMMOVWconst { 9987 break 9988 } 9989 c := v_1.AuxInt 9990 flags := v.Args[2] 9991 v.reset(OpARMRSCconst) 9992 v.AuxInt = int64(int32(c) >> uint64(d)) 9993 v.AddArg(x) 9994 v.AddArg(flags) 9995 return true 9996 } 9997 return false 9998 } 9999 func rewriteValueARM_OpARMRSCshiftRAreg(v *Value, config *Config) bool { 10000 b := v.Block 10001 _ = b 10002 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 10003 // cond: 10004 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 10005 for { 10006 v_0 := v.Args[0] 10007 if v_0.Op != OpARMMOVWconst { 10008 break 10009 } 10010 c := v_0.AuxInt 10011 x := v.Args[1] 10012 y := v.Args[2] 10013 flags := v.Args[3] 10014 v.reset(OpARMSBCconst) 10015 v.AuxInt = c 10016 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 10017 v0.AddArg(x) 10018 v0.AddArg(y) 10019 v.AddArg(v0) 10020 v.AddArg(flags) 10021 return true 10022 } 10023 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 10024 // cond: 10025 // result: (RSCshiftRA x y [c] flags) 10026 for { 10027 x := v.Args[0] 10028 y := v.Args[1] 10029 v_2 := v.Args[2] 10030 if v_2.Op != OpARMMOVWconst { 10031 break 10032 } 10033 c := v_2.AuxInt 10034 flags := v.Args[3] 10035 v.reset(OpARMRSCshiftRA) 10036 v.AuxInt = c 10037 v.AddArg(x) 10038 v.AddArg(y) 10039 v.AddArg(flags) 10040 return true 10041 } 10042 return false 10043 } 10044 func rewriteValueARM_OpARMRSCshiftRL(v *Value, config *Config) bool { 10045 b := v.Block 10046 _ = b 10047 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 10048 // cond: 10049 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 10050 for { 10051 d := v.AuxInt 10052 v_0 := v.Args[0] 10053 if v_0.Op != OpARMMOVWconst { 10054 break 10055 } 10056 c := v_0.AuxInt 10057 x := v.Args[1] 10058 flags := v.Args[2] 10059 v.reset(OpARMSBCconst) 10060 v.AuxInt = c 10061 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 10062 v0.AuxInt = d 10063 v0.AddArg(x) 10064 v.AddArg(v0) 10065 v.AddArg(flags) 10066 return true 10067 } 10068 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 10069 // cond: 10070 // result: (RSCconst x [int64(uint32(c)>>uint64(d))] flags) 10071 for { 10072 d := v.AuxInt 10073 x := v.Args[0] 10074 v_1 := v.Args[1] 10075 if v_1.Op != OpARMMOVWconst { 10076 break 10077 } 10078 c := v_1.AuxInt 10079 flags := v.Args[2] 10080 v.reset(OpARMRSCconst) 10081 v.AuxInt = int64(uint32(c) >> uint64(d)) 10082 v.AddArg(x) 10083 v.AddArg(flags) 10084 return true 10085 } 10086 return false 10087 } 10088 func rewriteValueARM_OpARMRSCshiftRLreg(v *Value, config *Config) bool { 10089 b := v.Block 10090 _ = b 10091 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 10092 // cond: 10093 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 10094 for { 10095 v_0 := v.Args[0] 10096 if v_0.Op != OpARMMOVWconst { 10097 break 10098 } 10099 c := v_0.AuxInt 10100 x := v.Args[1] 10101 y := v.Args[2] 10102 flags := v.Args[3] 10103 v.reset(OpARMSBCconst) 10104 v.AuxInt = c 10105 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 10106 v0.AddArg(x) 10107 v0.AddArg(y) 10108 v.AddArg(v0) 10109 v.AddArg(flags) 10110 return true 10111 } 10112 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 10113 // cond: 10114 // result: (RSCshiftRL x y [c] flags) 10115 for { 10116 x := v.Args[0] 10117 y := v.Args[1] 10118 v_2 := v.Args[2] 10119 if v_2.Op != OpARMMOVWconst { 10120 break 10121 } 10122 c := v_2.AuxInt 10123 flags := v.Args[3] 10124 v.reset(OpARMRSCshiftRL) 10125 v.AuxInt = c 10126 v.AddArg(x) 10127 v.AddArg(y) 10128 v.AddArg(flags) 10129 return true 10130 } 10131 return false 10132 } 10133 func rewriteValueARM_OpARMSBC(v *Value, config *Config) bool { 10134 b := v.Block 10135 _ = b 10136 // match: (SBC (MOVWconst [c]) x flags) 10137 // cond: 10138 // result: (RSCconst [c] x flags) 10139 for { 10140 v_0 := v.Args[0] 10141 if v_0.Op != OpARMMOVWconst { 10142 break 10143 } 10144 c := v_0.AuxInt 10145 x := v.Args[1] 10146 flags := v.Args[2] 10147 v.reset(OpARMRSCconst) 10148 v.AuxInt = c 10149 v.AddArg(x) 10150 v.AddArg(flags) 10151 return true 10152 } 10153 // match: (SBC x (MOVWconst [c]) flags) 10154 // cond: 10155 // result: (SBCconst [c] x flags) 10156 for { 10157 x := v.Args[0] 10158 v_1 := v.Args[1] 10159 if v_1.Op != OpARMMOVWconst { 10160 break 10161 } 10162 c := v_1.AuxInt 10163 flags := v.Args[2] 10164 v.reset(OpARMSBCconst) 10165 v.AuxInt = c 10166 v.AddArg(x) 10167 v.AddArg(flags) 10168 return true 10169 } 10170 // match: (SBC x (SLLconst [c] y) flags) 10171 // cond: 10172 // result: (SBCshiftLL x y [c] flags) 10173 for { 10174 x := v.Args[0] 10175 v_1 := v.Args[1] 10176 if v_1.Op != OpARMSLLconst { 10177 break 10178 } 10179 c := v_1.AuxInt 10180 y := v_1.Args[0] 10181 flags := v.Args[2] 10182 v.reset(OpARMSBCshiftLL) 10183 v.AuxInt = c 10184 v.AddArg(x) 10185 v.AddArg(y) 10186 v.AddArg(flags) 10187 return true 10188 } 10189 // match: (SBC (SLLconst [c] y) x flags) 10190 // cond: 10191 // result: (RSCshiftLL x y [c] flags) 10192 for { 10193 v_0 := v.Args[0] 10194 if v_0.Op != OpARMSLLconst { 10195 break 10196 } 10197 c := v_0.AuxInt 10198 y := v_0.Args[0] 10199 x := v.Args[1] 10200 flags := v.Args[2] 10201 v.reset(OpARMRSCshiftLL) 10202 v.AuxInt = c 10203 v.AddArg(x) 10204 v.AddArg(y) 10205 v.AddArg(flags) 10206 return true 10207 } 10208 // match: (SBC x (SRLconst [c] y) flags) 10209 // cond: 10210 // result: (SBCshiftRL x y [c] flags) 10211 for { 10212 x := v.Args[0] 10213 v_1 := v.Args[1] 10214 if v_1.Op != OpARMSRLconst { 10215 break 10216 } 10217 c := v_1.AuxInt 10218 y := v_1.Args[0] 10219 flags := v.Args[2] 10220 v.reset(OpARMSBCshiftRL) 10221 v.AuxInt = c 10222 v.AddArg(x) 10223 v.AddArg(y) 10224 v.AddArg(flags) 10225 return true 10226 } 10227 // match: (SBC (SRLconst [c] y) x flags) 10228 // cond: 10229 // result: (RSCshiftRL x y [c] flags) 10230 for { 10231 v_0 := v.Args[0] 10232 if v_0.Op != OpARMSRLconst { 10233 break 10234 } 10235 c := v_0.AuxInt 10236 y := v_0.Args[0] 10237 x := v.Args[1] 10238 flags := v.Args[2] 10239 v.reset(OpARMRSCshiftRL) 10240 v.AuxInt = c 10241 v.AddArg(x) 10242 v.AddArg(y) 10243 v.AddArg(flags) 10244 return true 10245 } 10246 // match: (SBC x (SRAconst [c] y) flags) 10247 // cond: 10248 // result: (SBCshiftRA x y [c] flags) 10249 for { 10250 x := v.Args[0] 10251 v_1 := v.Args[1] 10252 if v_1.Op != OpARMSRAconst { 10253 break 10254 } 10255 c := v_1.AuxInt 10256 y := v_1.Args[0] 10257 flags := v.Args[2] 10258 v.reset(OpARMSBCshiftRA) 10259 v.AuxInt = c 10260 v.AddArg(x) 10261 v.AddArg(y) 10262 v.AddArg(flags) 10263 return true 10264 } 10265 // match: (SBC (SRAconst [c] y) x flags) 10266 // cond: 10267 // result: (RSCshiftRA x y [c] flags) 10268 for { 10269 v_0 := v.Args[0] 10270 if v_0.Op != OpARMSRAconst { 10271 break 10272 } 10273 c := v_0.AuxInt 10274 y := v_0.Args[0] 10275 x := v.Args[1] 10276 flags := v.Args[2] 10277 v.reset(OpARMRSCshiftRA) 10278 v.AuxInt = c 10279 v.AddArg(x) 10280 v.AddArg(y) 10281 v.AddArg(flags) 10282 return true 10283 } 10284 // match: (SBC x (SLL y z) flags) 10285 // cond: 10286 // result: (SBCshiftLLreg x y z flags) 10287 for { 10288 x := v.Args[0] 10289 v_1 := v.Args[1] 10290 if v_1.Op != OpARMSLL { 10291 break 10292 } 10293 y := v_1.Args[0] 10294 z := v_1.Args[1] 10295 flags := v.Args[2] 10296 v.reset(OpARMSBCshiftLLreg) 10297 v.AddArg(x) 10298 v.AddArg(y) 10299 v.AddArg(z) 10300 v.AddArg(flags) 10301 return true 10302 } 10303 // match: (SBC (SLL y z) x flags) 10304 // cond: 10305 // result: (RSCshiftLLreg x y z flags) 10306 for { 10307 v_0 := v.Args[0] 10308 if v_0.Op != OpARMSLL { 10309 break 10310 } 10311 y := v_0.Args[0] 10312 z := v_0.Args[1] 10313 x := v.Args[1] 10314 flags := v.Args[2] 10315 v.reset(OpARMRSCshiftLLreg) 10316 v.AddArg(x) 10317 v.AddArg(y) 10318 v.AddArg(z) 10319 v.AddArg(flags) 10320 return true 10321 } 10322 // match: (SBC x (SRL y z) flags) 10323 // cond: 10324 // result: (SBCshiftRLreg x y z flags) 10325 for { 10326 x := v.Args[0] 10327 v_1 := v.Args[1] 10328 if v_1.Op != OpARMSRL { 10329 break 10330 } 10331 y := v_1.Args[0] 10332 z := v_1.Args[1] 10333 flags := v.Args[2] 10334 v.reset(OpARMSBCshiftRLreg) 10335 v.AddArg(x) 10336 v.AddArg(y) 10337 v.AddArg(z) 10338 v.AddArg(flags) 10339 return true 10340 } 10341 // match: (SBC (SRL y z) x flags) 10342 // cond: 10343 // result: (RSCshiftRLreg x y z flags) 10344 for { 10345 v_0 := v.Args[0] 10346 if v_0.Op != OpARMSRL { 10347 break 10348 } 10349 y := v_0.Args[0] 10350 z := v_0.Args[1] 10351 x := v.Args[1] 10352 flags := v.Args[2] 10353 v.reset(OpARMRSCshiftRLreg) 10354 v.AddArg(x) 10355 v.AddArg(y) 10356 v.AddArg(z) 10357 v.AddArg(flags) 10358 return true 10359 } 10360 // match: (SBC x (SRA y z) flags) 10361 // cond: 10362 // result: (SBCshiftRAreg x y z flags) 10363 for { 10364 x := v.Args[0] 10365 v_1 := v.Args[1] 10366 if v_1.Op != OpARMSRA { 10367 break 10368 } 10369 y := v_1.Args[0] 10370 z := v_1.Args[1] 10371 flags := v.Args[2] 10372 v.reset(OpARMSBCshiftRAreg) 10373 v.AddArg(x) 10374 v.AddArg(y) 10375 v.AddArg(z) 10376 v.AddArg(flags) 10377 return true 10378 } 10379 // match: (SBC (SRA y z) x flags) 10380 // cond: 10381 // result: (RSCshiftRAreg x y z flags) 10382 for { 10383 v_0 := v.Args[0] 10384 if v_0.Op != OpARMSRA { 10385 break 10386 } 10387 y := v_0.Args[0] 10388 z := v_0.Args[1] 10389 x := v.Args[1] 10390 flags := v.Args[2] 10391 v.reset(OpARMRSCshiftRAreg) 10392 v.AddArg(x) 10393 v.AddArg(y) 10394 v.AddArg(z) 10395 v.AddArg(flags) 10396 return true 10397 } 10398 return false 10399 } 10400 func rewriteValueARM_OpARMSBCconst(v *Value, config *Config) bool { 10401 b := v.Block 10402 _ = b 10403 // match: (SBCconst [c] (ADDconst [d] x) flags) 10404 // cond: 10405 // result: (SBCconst [int64(int32(c-d))] x flags) 10406 for { 10407 c := v.AuxInt 10408 v_0 := v.Args[0] 10409 if v_0.Op != OpARMADDconst { 10410 break 10411 } 10412 d := v_0.AuxInt 10413 x := v_0.Args[0] 10414 flags := v.Args[1] 10415 v.reset(OpARMSBCconst) 10416 v.AuxInt = int64(int32(c - d)) 10417 v.AddArg(x) 10418 v.AddArg(flags) 10419 return true 10420 } 10421 // match: (SBCconst [c] (SUBconst [d] x) flags) 10422 // cond: 10423 // result: (SBCconst [int64(int32(c+d))] x flags) 10424 for { 10425 c := v.AuxInt 10426 v_0 := v.Args[0] 10427 if v_0.Op != OpARMSUBconst { 10428 break 10429 } 10430 d := v_0.AuxInt 10431 x := v_0.Args[0] 10432 flags := v.Args[1] 10433 v.reset(OpARMSBCconst) 10434 v.AuxInt = int64(int32(c + d)) 10435 v.AddArg(x) 10436 v.AddArg(flags) 10437 return true 10438 } 10439 return false 10440 } 10441 func rewriteValueARM_OpARMSBCshiftLL(v *Value, config *Config) bool { 10442 b := v.Block 10443 _ = b 10444 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 10445 // cond: 10446 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 10447 for { 10448 d := v.AuxInt 10449 v_0 := v.Args[0] 10450 if v_0.Op != OpARMMOVWconst { 10451 break 10452 } 10453 c := v_0.AuxInt 10454 x := v.Args[1] 10455 flags := v.Args[2] 10456 v.reset(OpARMRSCconst) 10457 v.AuxInt = c 10458 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 10459 v0.AuxInt = d 10460 v0.AddArg(x) 10461 v.AddArg(v0) 10462 v.AddArg(flags) 10463 return true 10464 } 10465 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 10466 // cond: 10467 // result: (SBCconst x [int64(uint32(c)<<uint64(d))] flags) 10468 for { 10469 d := v.AuxInt 10470 x := v.Args[0] 10471 v_1 := v.Args[1] 10472 if v_1.Op != OpARMMOVWconst { 10473 break 10474 } 10475 c := v_1.AuxInt 10476 flags := v.Args[2] 10477 v.reset(OpARMSBCconst) 10478 v.AuxInt = int64(uint32(c) << uint64(d)) 10479 v.AddArg(x) 10480 v.AddArg(flags) 10481 return true 10482 } 10483 return false 10484 } 10485 func rewriteValueARM_OpARMSBCshiftLLreg(v *Value, config *Config) bool { 10486 b := v.Block 10487 _ = b 10488 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 10489 // cond: 10490 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 10491 for { 10492 v_0 := v.Args[0] 10493 if v_0.Op != OpARMMOVWconst { 10494 break 10495 } 10496 c := v_0.AuxInt 10497 x := v.Args[1] 10498 y := v.Args[2] 10499 flags := v.Args[3] 10500 v.reset(OpARMRSCconst) 10501 v.AuxInt = c 10502 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 10503 v0.AddArg(x) 10504 v0.AddArg(y) 10505 v.AddArg(v0) 10506 v.AddArg(flags) 10507 return true 10508 } 10509 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 10510 // cond: 10511 // result: (SBCshiftLL x y [c] flags) 10512 for { 10513 x := v.Args[0] 10514 y := v.Args[1] 10515 v_2 := v.Args[2] 10516 if v_2.Op != OpARMMOVWconst { 10517 break 10518 } 10519 c := v_2.AuxInt 10520 flags := v.Args[3] 10521 v.reset(OpARMSBCshiftLL) 10522 v.AuxInt = c 10523 v.AddArg(x) 10524 v.AddArg(y) 10525 v.AddArg(flags) 10526 return true 10527 } 10528 return false 10529 } 10530 func rewriteValueARM_OpARMSBCshiftRA(v *Value, config *Config) bool { 10531 b := v.Block 10532 _ = b 10533 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 10534 // cond: 10535 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 10536 for { 10537 d := v.AuxInt 10538 v_0 := v.Args[0] 10539 if v_0.Op != OpARMMOVWconst { 10540 break 10541 } 10542 c := v_0.AuxInt 10543 x := v.Args[1] 10544 flags := v.Args[2] 10545 v.reset(OpARMRSCconst) 10546 v.AuxInt = c 10547 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 10548 v0.AuxInt = d 10549 v0.AddArg(x) 10550 v.AddArg(v0) 10551 v.AddArg(flags) 10552 return true 10553 } 10554 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 10555 // cond: 10556 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 10557 for { 10558 d := v.AuxInt 10559 x := v.Args[0] 10560 v_1 := v.Args[1] 10561 if v_1.Op != OpARMMOVWconst { 10562 break 10563 } 10564 c := v_1.AuxInt 10565 flags := v.Args[2] 10566 v.reset(OpARMSBCconst) 10567 v.AuxInt = int64(int32(c) >> uint64(d)) 10568 v.AddArg(x) 10569 v.AddArg(flags) 10570 return true 10571 } 10572 return false 10573 } 10574 func rewriteValueARM_OpARMSBCshiftRAreg(v *Value, config *Config) bool { 10575 b := v.Block 10576 _ = b 10577 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 10578 // cond: 10579 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 10580 for { 10581 v_0 := v.Args[0] 10582 if v_0.Op != OpARMMOVWconst { 10583 break 10584 } 10585 c := v_0.AuxInt 10586 x := v.Args[1] 10587 y := v.Args[2] 10588 flags := v.Args[3] 10589 v.reset(OpARMRSCconst) 10590 v.AuxInt = c 10591 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 10592 v0.AddArg(x) 10593 v0.AddArg(y) 10594 v.AddArg(v0) 10595 v.AddArg(flags) 10596 return true 10597 } 10598 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 10599 // cond: 10600 // result: (SBCshiftRA x y [c] flags) 10601 for { 10602 x := v.Args[0] 10603 y := v.Args[1] 10604 v_2 := v.Args[2] 10605 if v_2.Op != OpARMMOVWconst { 10606 break 10607 } 10608 c := v_2.AuxInt 10609 flags := v.Args[3] 10610 v.reset(OpARMSBCshiftRA) 10611 v.AuxInt = c 10612 v.AddArg(x) 10613 v.AddArg(y) 10614 v.AddArg(flags) 10615 return true 10616 } 10617 return false 10618 } 10619 func rewriteValueARM_OpARMSBCshiftRL(v *Value, config *Config) bool { 10620 b := v.Block 10621 _ = b 10622 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 10623 // cond: 10624 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 10625 for { 10626 d := v.AuxInt 10627 v_0 := v.Args[0] 10628 if v_0.Op != OpARMMOVWconst { 10629 break 10630 } 10631 c := v_0.AuxInt 10632 x := v.Args[1] 10633 flags := v.Args[2] 10634 v.reset(OpARMRSCconst) 10635 v.AuxInt = c 10636 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 10637 v0.AuxInt = d 10638 v0.AddArg(x) 10639 v.AddArg(v0) 10640 v.AddArg(flags) 10641 return true 10642 } 10643 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 10644 // cond: 10645 // result: (SBCconst x [int64(uint32(c)>>uint64(d))] flags) 10646 for { 10647 d := v.AuxInt 10648 x := v.Args[0] 10649 v_1 := v.Args[1] 10650 if v_1.Op != OpARMMOVWconst { 10651 break 10652 } 10653 c := v_1.AuxInt 10654 flags := v.Args[2] 10655 v.reset(OpARMSBCconst) 10656 v.AuxInt = int64(uint32(c) >> uint64(d)) 10657 v.AddArg(x) 10658 v.AddArg(flags) 10659 return true 10660 } 10661 return false 10662 } 10663 func rewriteValueARM_OpARMSBCshiftRLreg(v *Value, config *Config) bool { 10664 b := v.Block 10665 _ = b 10666 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 10667 // cond: 10668 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 10669 for { 10670 v_0 := v.Args[0] 10671 if v_0.Op != OpARMMOVWconst { 10672 break 10673 } 10674 c := v_0.AuxInt 10675 x := v.Args[1] 10676 y := v.Args[2] 10677 flags := v.Args[3] 10678 v.reset(OpARMRSCconst) 10679 v.AuxInt = c 10680 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 10681 v0.AddArg(x) 10682 v0.AddArg(y) 10683 v.AddArg(v0) 10684 v.AddArg(flags) 10685 return true 10686 } 10687 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 10688 // cond: 10689 // result: (SBCshiftRL x y [c] flags) 10690 for { 10691 x := v.Args[0] 10692 y := v.Args[1] 10693 v_2 := v.Args[2] 10694 if v_2.Op != OpARMMOVWconst { 10695 break 10696 } 10697 c := v_2.AuxInt 10698 flags := v.Args[3] 10699 v.reset(OpARMSBCshiftRL) 10700 v.AuxInt = c 10701 v.AddArg(x) 10702 v.AddArg(y) 10703 v.AddArg(flags) 10704 return true 10705 } 10706 return false 10707 } 10708 func rewriteValueARM_OpARMSLL(v *Value, config *Config) bool { 10709 b := v.Block 10710 _ = b 10711 // match: (SLL x (MOVWconst [c])) 10712 // cond: 10713 // result: (SLLconst x [c&31]) 10714 for { 10715 x := v.Args[0] 10716 v_1 := v.Args[1] 10717 if v_1.Op != OpARMMOVWconst { 10718 break 10719 } 10720 c := v_1.AuxInt 10721 v.reset(OpARMSLLconst) 10722 v.AuxInt = c & 31 10723 v.AddArg(x) 10724 return true 10725 } 10726 return false 10727 } 10728 func rewriteValueARM_OpARMSLLconst(v *Value, config *Config) bool { 10729 b := v.Block 10730 _ = b 10731 // match: (SLLconst [c] (MOVWconst [d])) 10732 // cond: 10733 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 10734 for { 10735 c := v.AuxInt 10736 v_0 := v.Args[0] 10737 if v_0.Op != OpARMMOVWconst { 10738 break 10739 } 10740 d := v_0.AuxInt 10741 v.reset(OpARMMOVWconst) 10742 v.AuxInt = int64(uint32(d) << uint64(c)) 10743 return true 10744 } 10745 return false 10746 } 10747 func rewriteValueARM_OpARMSRA(v *Value, config *Config) bool { 10748 b := v.Block 10749 _ = b 10750 // match: (SRA x (MOVWconst [c])) 10751 // cond: 10752 // result: (SRAconst x [c&31]) 10753 for { 10754 x := v.Args[0] 10755 v_1 := v.Args[1] 10756 if v_1.Op != OpARMMOVWconst { 10757 break 10758 } 10759 c := v_1.AuxInt 10760 v.reset(OpARMSRAconst) 10761 v.AuxInt = c & 31 10762 v.AddArg(x) 10763 return true 10764 } 10765 return false 10766 } 10767 func rewriteValueARM_OpARMSRAcond(v *Value, config *Config) bool { 10768 b := v.Block 10769 _ = b 10770 // match: (SRAcond x _ (FlagEQ)) 10771 // cond: 10772 // result: (SRAconst x [31]) 10773 for { 10774 x := v.Args[0] 10775 v_2 := v.Args[2] 10776 if v_2.Op != OpARMFlagEQ { 10777 break 10778 } 10779 v.reset(OpARMSRAconst) 10780 v.AuxInt = 31 10781 v.AddArg(x) 10782 return true 10783 } 10784 // match: (SRAcond x y (FlagLT_ULT)) 10785 // cond: 10786 // result: (SRA x y) 10787 for { 10788 x := v.Args[0] 10789 y := v.Args[1] 10790 v_2 := v.Args[2] 10791 if v_2.Op != OpARMFlagLT_ULT { 10792 break 10793 } 10794 v.reset(OpARMSRA) 10795 v.AddArg(x) 10796 v.AddArg(y) 10797 return true 10798 } 10799 // match: (SRAcond x _ (FlagLT_UGT)) 10800 // cond: 10801 // result: (SRAconst x [31]) 10802 for { 10803 x := v.Args[0] 10804 v_2 := v.Args[2] 10805 if v_2.Op != OpARMFlagLT_UGT { 10806 break 10807 } 10808 v.reset(OpARMSRAconst) 10809 v.AuxInt = 31 10810 v.AddArg(x) 10811 return true 10812 } 10813 // match: (SRAcond x y (FlagGT_ULT)) 10814 // cond: 10815 // result: (SRA x y) 10816 for { 10817 x := v.Args[0] 10818 y := v.Args[1] 10819 v_2 := v.Args[2] 10820 if v_2.Op != OpARMFlagGT_ULT { 10821 break 10822 } 10823 v.reset(OpARMSRA) 10824 v.AddArg(x) 10825 v.AddArg(y) 10826 return true 10827 } 10828 // match: (SRAcond x _ (FlagGT_UGT)) 10829 // cond: 10830 // result: (SRAconst x [31]) 10831 for { 10832 x := v.Args[0] 10833 v_2 := v.Args[2] 10834 if v_2.Op != OpARMFlagGT_UGT { 10835 break 10836 } 10837 v.reset(OpARMSRAconst) 10838 v.AuxInt = 31 10839 v.AddArg(x) 10840 return true 10841 } 10842 return false 10843 } 10844 func rewriteValueARM_OpARMSRAconst(v *Value, config *Config) bool { 10845 b := v.Block 10846 _ = b 10847 // match: (SRAconst [c] (MOVWconst [d])) 10848 // cond: 10849 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 10850 for { 10851 c := v.AuxInt 10852 v_0 := v.Args[0] 10853 if v_0.Op != OpARMMOVWconst { 10854 break 10855 } 10856 d := v_0.AuxInt 10857 v.reset(OpARMMOVWconst) 10858 v.AuxInt = int64(int32(d) >> uint64(c)) 10859 return true 10860 } 10861 return false 10862 } 10863 func rewriteValueARM_OpARMSRL(v *Value, config *Config) bool { 10864 b := v.Block 10865 _ = b 10866 // match: (SRL x (MOVWconst [c])) 10867 // cond: 10868 // result: (SRLconst x [c&31]) 10869 for { 10870 x := v.Args[0] 10871 v_1 := v.Args[1] 10872 if v_1.Op != OpARMMOVWconst { 10873 break 10874 } 10875 c := v_1.AuxInt 10876 v.reset(OpARMSRLconst) 10877 v.AuxInt = c & 31 10878 v.AddArg(x) 10879 return true 10880 } 10881 return false 10882 } 10883 func rewriteValueARM_OpARMSRLconst(v *Value, config *Config) bool { 10884 b := v.Block 10885 _ = b 10886 // match: (SRLconst [c] (MOVWconst [d])) 10887 // cond: 10888 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 10889 for { 10890 c := v.AuxInt 10891 v_0 := v.Args[0] 10892 if v_0.Op != OpARMMOVWconst { 10893 break 10894 } 10895 d := v_0.AuxInt 10896 v.reset(OpARMMOVWconst) 10897 v.AuxInt = int64(uint32(d) >> uint64(c)) 10898 return true 10899 } 10900 return false 10901 } 10902 func rewriteValueARM_OpARMSUB(v *Value, config *Config) bool { 10903 b := v.Block 10904 _ = b 10905 // match: (SUB (MOVWconst [c]) x) 10906 // cond: 10907 // result: (RSBconst [c] x) 10908 for { 10909 v_0 := v.Args[0] 10910 if v_0.Op != OpARMMOVWconst { 10911 break 10912 } 10913 c := v_0.AuxInt 10914 x := v.Args[1] 10915 v.reset(OpARMRSBconst) 10916 v.AuxInt = c 10917 v.AddArg(x) 10918 return true 10919 } 10920 // match: (SUB x (MOVWconst [c])) 10921 // cond: 10922 // result: (SUBconst [c] x) 10923 for { 10924 x := v.Args[0] 10925 v_1 := v.Args[1] 10926 if v_1.Op != OpARMMOVWconst { 10927 break 10928 } 10929 c := v_1.AuxInt 10930 v.reset(OpARMSUBconst) 10931 v.AuxInt = c 10932 v.AddArg(x) 10933 return true 10934 } 10935 // match: (SUB x (SLLconst [c] y)) 10936 // cond: 10937 // result: (SUBshiftLL x y [c]) 10938 for { 10939 x := v.Args[0] 10940 v_1 := v.Args[1] 10941 if v_1.Op != OpARMSLLconst { 10942 break 10943 } 10944 c := v_1.AuxInt 10945 y := v_1.Args[0] 10946 v.reset(OpARMSUBshiftLL) 10947 v.AuxInt = c 10948 v.AddArg(x) 10949 v.AddArg(y) 10950 return true 10951 } 10952 // match: (SUB (SLLconst [c] y) x) 10953 // cond: 10954 // result: (RSBshiftLL x y [c]) 10955 for { 10956 v_0 := v.Args[0] 10957 if v_0.Op != OpARMSLLconst { 10958 break 10959 } 10960 c := v_0.AuxInt 10961 y := v_0.Args[0] 10962 x := v.Args[1] 10963 v.reset(OpARMRSBshiftLL) 10964 v.AuxInt = c 10965 v.AddArg(x) 10966 v.AddArg(y) 10967 return true 10968 } 10969 // match: (SUB x (SRLconst [c] y)) 10970 // cond: 10971 // result: (SUBshiftRL x y [c]) 10972 for { 10973 x := v.Args[0] 10974 v_1 := v.Args[1] 10975 if v_1.Op != OpARMSRLconst { 10976 break 10977 } 10978 c := v_1.AuxInt 10979 y := v_1.Args[0] 10980 v.reset(OpARMSUBshiftRL) 10981 v.AuxInt = c 10982 v.AddArg(x) 10983 v.AddArg(y) 10984 return true 10985 } 10986 // match: (SUB (SRLconst [c] y) x) 10987 // cond: 10988 // result: (RSBshiftRL x y [c]) 10989 for { 10990 v_0 := v.Args[0] 10991 if v_0.Op != OpARMSRLconst { 10992 break 10993 } 10994 c := v_0.AuxInt 10995 y := v_0.Args[0] 10996 x := v.Args[1] 10997 v.reset(OpARMRSBshiftRL) 10998 v.AuxInt = c 10999 v.AddArg(x) 11000 v.AddArg(y) 11001 return true 11002 } 11003 // match: (SUB x (SRAconst [c] y)) 11004 // cond: 11005 // result: (SUBshiftRA x y [c]) 11006 for { 11007 x := v.Args[0] 11008 v_1 := v.Args[1] 11009 if v_1.Op != OpARMSRAconst { 11010 break 11011 } 11012 c := v_1.AuxInt 11013 y := v_1.Args[0] 11014 v.reset(OpARMSUBshiftRA) 11015 v.AuxInt = c 11016 v.AddArg(x) 11017 v.AddArg(y) 11018 return true 11019 } 11020 // match: (SUB (SRAconst [c] y) x) 11021 // cond: 11022 // result: (RSBshiftRA x y [c]) 11023 for { 11024 v_0 := v.Args[0] 11025 if v_0.Op != OpARMSRAconst { 11026 break 11027 } 11028 c := v_0.AuxInt 11029 y := v_0.Args[0] 11030 x := v.Args[1] 11031 v.reset(OpARMRSBshiftRA) 11032 v.AuxInt = c 11033 v.AddArg(x) 11034 v.AddArg(y) 11035 return true 11036 } 11037 // match: (SUB x (SLL y z)) 11038 // cond: 11039 // result: (SUBshiftLLreg x y z) 11040 for { 11041 x := v.Args[0] 11042 v_1 := v.Args[1] 11043 if v_1.Op != OpARMSLL { 11044 break 11045 } 11046 y := v_1.Args[0] 11047 z := v_1.Args[1] 11048 v.reset(OpARMSUBshiftLLreg) 11049 v.AddArg(x) 11050 v.AddArg(y) 11051 v.AddArg(z) 11052 return true 11053 } 11054 // match: (SUB (SLL y z) x) 11055 // cond: 11056 // result: (RSBshiftLLreg x y z) 11057 for { 11058 v_0 := v.Args[0] 11059 if v_0.Op != OpARMSLL { 11060 break 11061 } 11062 y := v_0.Args[0] 11063 z := v_0.Args[1] 11064 x := v.Args[1] 11065 v.reset(OpARMRSBshiftLLreg) 11066 v.AddArg(x) 11067 v.AddArg(y) 11068 v.AddArg(z) 11069 return true 11070 } 11071 // match: (SUB x (SRL y z)) 11072 // cond: 11073 // result: (SUBshiftRLreg x y z) 11074 for { 11075 x := v.Args[0] 11076 v_1 := v.Args[1] 11077 if v_1.Op != OpARMSRL { 11078 break 11079 } 11080 y := v_1.Args[0] 11081 z := v_1.Args[1] 11082 v.reset(OpARMSUBshiftRLreg) 11083 v.AddArg(x) 11084 v.AddArg(y) 11085 v.AddArg(z) 11086 return true 11087 } 11088 // match: (SUB (SRL y z) x) 11089 // cond: 11090 // result: (RSBshiftRLreg x y z) 11091 for { 11092 v_0 := v.Args[0] 11093 if v_0.Op != OpARMSRL { 11094 break 11095 } 11096 y := v_0.Args[0] 11097 z := v_0.Args[1] 11098 x := v.Args[1] 11099 v.reset(OpARMRSBshiftRLreg) 11100 v.AddArg(x) 11101 v.AddArg(y) 11102 v.AddArg(z) 11103 return true 11104 } 11105 // match: (SUB x (SRA y z)) 11106 // cond: 11107 // result: (SUBshiftRAreg x y z) 11108 for { 11109 x := v.Args[0] 11110 v_1 := v.Args[1] 11111 if v_1.Op != OpARMSRA { 11112 break 11113 } 11114 y := v_1.Args[0] 11115 z := v_1.Args[1] 11116 v.reset(OpARMSUBshiftRAreg) 11117 v.AddArg(x) 11118 v.AddArg(y) 11119 v.AddArg(z) 11120 return true 11121 } 11122 // match: (SUB (SRA y z) x) 11123 // cond: 11124 // result: (RSBshiftRAreg x y z) 11125 for { 11126 v_0 := v.Args[0] 11127 if v_0.Op != OpARMSRA { 11128 break 11129 } 11130 y := v_0.Args[0] 11131 z := v_0.Args[1] 11132 x := v.Args[1] 11133 v.reset(OpARMRSBshiftRAreg) 11134 v.AddArg(x) 11135 v.AddArg(y) 11136 v.AddArg(z) 11137 return true 11138 } 11139 // match: (SUB x x) 11140 // cond: 11141 // result: (MOVWconst [0]) 11142 for { 11143 x := v.Args[0] 11144 if x != v.Args[1] { 11145 break 11146 } 11147 v.reset(OpARMMOVWconst) 11148 v.AuxInt = 0 11149 return true 11150 } 11151 return false 11152 } 11153 func rewriteValueARM_OpARMSUBS(v *Value, config *Config) bool { 11154 b := v.Block 11155 _ = b 11156 // match: (SUBS (MOVWconst [c]) x) 11157 // cond: 11158 // result: (RSBSconst [c] x) 11159 for { 11160 v_0 := v.Args[0] 11161 if v_0.Op != OpARMMOVWconst { 11162 break 11163 } 11164 c := v_0.AuxInt 11165 x := v.Args[1] 11166 v.reset(OpARMRSBSconst) 11167 v.AuxInt = c 11168 v.AddArg(x) 11169 return true 11170 } 11171 // match: (SUBS x (MOVWconst [c])) 11172 // cond: 11173 // result: (SUBSconst [c] x) 11174 for { 11175 x := v.Args[0] 11176 v_1 := v.Args[1] 11177 if v_1.Op != OpARMMOVWconst { 11178 break 11179 } 11180 c := v_1.AuxInt 11181 v.reset(OpARMSUBSconst) 11182 v.AuxInt = c 11183 v.AddArg(x) 11184 return true 11185 } 11186 // match: (SUBS x (SLLconst [c] y)) 11187 // cond: 11188 // result: (SUBSshiftLL x y [c]) 11189 for { 11190 x := v.Args[0] 11191 v_1 := v.Args[1] 11192 if v_1.Op != OpARMSLLconst { 11193 break 11194 } 11195 c := v_1.AuxInt 11196 y := v_1.Args[0] 11197 v.reset(OpARMSUBSshiftLL) 11198 v.AuxInt = c 11199 v.AddArg(x) 11200 v.AddArg(y) 11201 return true 11202 } 11203 // match: (SUBS (SLLconst [c] y) x) 11204 // cond: 11205 // result: (RSBSshiftLL x y [c]) 11206 for { 11207 v_0 := v.Args[0] 11208 if v_0.Op != OpARMSLLconst { 11209 break 11210 } 11211 c := v_0.AuxInt 11212 y := v_0.Args[0] 11213 x := v.Args[1] 11214 v.reset(OpARMRSBSshiftLL) 11215 v.AuxInt = c 11216 v.AddArg(x) 11217 v.AddArg(y) 11218 return true 11219 } 11220 // match: (SUBS x (SRLconst [c] y)) 11221 // cond: 11222 // result: (SUBSshiftRL x y [c]) 11223 for { 11224 x := v.Args[0] 11225 v_1 := v.Args[1] 11226 if v_1.Op != OpARMSRLconst { 11227 break 11228 } 11229 c := v_1.AuxInt 11230 y := v_1.Args[0] 11231 v.reset(OpARMSUBSshiftRL) 11232 v.AuxInt = c 11233 v.AddArg(x) 11234 v.AddArg(y) 11235 return true 11236 } 11237 // match: (SUBS (SRLconst [c] y) x) 11238 // cond: 11239 // result: (RSBSshiftRL x y [c]) 11240 for { 11241 v_0 := v.Args[0] 11242 if v_0.Op != OpARMSRLconst { 11243 break 11244 } 11245 c := v_0.AuxInt 11246 y := v_0.Args[0] 11247 x := v.Args[1] 11248 v.reset(OpARMRSBSshiftRL) 11249 v.AuxInt = c 11250 v.AddArg(x) 11251 v.AddArg(y) 11252 return true 11253 } 11254 // match: (SUBS x (SRAconst [c] y)) 11255 // cond: 11256 // result: (SUBSshiftRA x y [c]) 11257 for { 11258 x := v.Args[0] 11259 v_1 := v.Args[1] 11260 if v_1.Op != OpARMSRAconst { 11261 break 11262 } 11263 c := v_1.AuxInt 11264 y := v_1.Args[0] 11265 v.reset(OpARMSUBSshiftRA) 11266 v.AuxInt = c 11267 v.AddArg(x) 11268 v.AddArg(y) 11269 return true 11270 } 11271 // match: (SUBS (SRAconst [c] y) x) 11272 // cond: 11273 // result: (RSBSshiftRA x y [c]) 11274 for { 11275 v_0 := v.Args[0] 11276 if v_0.Op != OpARMSRAconst { 11277 break 11278 } 11279 c := v_0.AuxInt 11280 y := v_0.Args[0] 11281 x := v.Args[1] 11282 v.reset(OpARMRSBSshiftRA) 11283 v.AuxInt = c 11284 v.AddArg(x) 11285 v.AddArg(y) 11286 return true 11287 } 11288 // match: (SUBS x (SLL y z)) 11289 // cond: 11290 // result: (SUBSshiftLLreg x y z) 11291 for { 11292 x := v.Args[0] 11293 v_1 := v.Args[1] 11294 if v_1.Op != OpARMSLL { 11295 break 11296 } 11297 y := v_1.Args[0] 11298 z := v_1.Args[1] 11299 v.reset(OpARMSUBSshiftLLreg) 11300 v.AddArg(x) 11301 v.AddArg(y) 11302 v.AddArg(z) 11303 return true 11304 } 11305 // match: (SUBS (SLL y z) x) 11306 // cond: 11307 // result: (RSBSshiftLLreg x y z) 11308 for { 11309 v_0 := v.Args[0] 11310 if v_0.Op != OpARMSLL { 11311 break 11312 } 11313 y := v_0.Args[0] 11314 z := v_0.Args[1] 11315 x := v.Args[1] 11316 v.reset(OpARMRSBSshiftLLreg) 11317 v.AddArg(x) 11318 v.AddArg(y) 11319 v.AddArg(z) 11320 return true 11321 } 11322 // match: (SUBS x (SRL y z)) 11323 // cond: 11324 // result: (SUBSshiftRLreg x y z) 11325 for { 11326 x := v.Args[0] 11327 v_1 := v.Args[1] 11328 if v_1.Op != OpARMSRL { 11329 break 11330 } 11331 y := v_1.Args[0] 11332 z := v_1.Args[1] 11333 v.reset(OpARMSUBSshiftRLreg) 11334 v.AddArg(x) 11335 v.AddArg(y) 11336 v.AddArg(z) 11337 return true 11338 } 11339 // match: (SUBS (SRL y z) x) 11340 // cond: 11341 // result: (RSBSshiftRLreg x y z) 11342 for { 11343 v_0 := v.Args[0] 11344 if v_0.Op != OpARMSRL { 11345 break 11346 } 11347 y := v_0.Args[0] 11348 z := v_0.Args[1] 11349 x := v.Args[1] 11350 v.reset(OpARMRSBSshiftRLreg) 11351 v.AddArg(x) 11352 v.AddArg(y) 11353 v.AddArg(z) 11354 return true 11355 } 11356 // match: (SUBS x (SRA y z)) 11357 // cond: 11358 // result: (SUBSshiftRAreg x y z) 11359 for { 11360 x := v.Args[0] 11361 v_1 := v.Args[1] 11362 if v_1.Op != OpARMSRA { 11363 break 11364 } 11365 y := v_1.Args[0] 11366 z := v_1.Args[1] 11367 v.reset(OpARMSUBSshiftRAreg) 11368 v.AddArg(x) 11369 v.AddArg(y) 11370 v.AddArg(z) 11371 return true 11372 } 11373 // match: (SUBS (SRA y z) x) 11374 // cond: 11375 // result: (RSBSshiftRAreg x y z) 11376 for { 11377 v_0 := v.Args[0] 11378 if v_0.Op != OpARMSRA { 11379 break 11380 } 11381 y := v_0.Args[0] 11382 z := v_0.Args[1] 11383 x := v.Args[1] 11384 v.reset(OpARMRSBSshiftRAreg) 11385 v.AddArg(x) 11386 v.AddArg(y) 11387 v.AddArg(z) 11388 return true 11389 } 11390 return false 11391 } 11392 func rewriteValueARM_OpARMSUBSshiftLL(v *Value, config *Config) bool { 11393 b := v.Block 11394 _ = b 11395 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 11396 // cond: 11397 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 11398 for { 11399 d := v.AuxInt 11400 v_0 := v.Args[0] 11401 if v_0.Op != OpARMMOVWconst { 11402 break 11403 } 11404 c := v_0.AuxInt 11405 x := v.Args[1] 11406 v.reset(OpARMRSBSconst) 11407 v.AuxInt = c 11408 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 11409 v0.AuxInt = d 11410 v0.AddArg(x) 11411 v.AddArg(v0) 11412 return true 11413 } 11414 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 11415 // cond: 11416 // result: (SUBSconst x [int64(uint32(c)<<uint64(d))]) 11417 for { 11418 d := v.AuxInt 11419 x := v.Args[0] 11420 v_1 := v.Args[1] 11421 if v_1.Op != OpARMMOVWconst { 11422 break 11423 } 11424 c := v_1.AuxInt 11425 v.reset(OpARMSUBSconst) 11426 v.AuxInt = int64(uint32(c) << uint64(d)) 11427 v.AddArg(x) 11428 return true 11429 } 11430 return false 11431 } 11432 func rewriteValueARM_OpARMSUBSshiftLLreg(v *Value, config *Config) bool { 11433 b := v.Block 11434 _ = b 11435 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 11436 // cond: 11437 // result: (RSBSconst [c] (SLL <x.Type> x y)) 11438 for { 11439 v_0 := v.Args[0] 11440 if v_0.Op != OpARMMOVWconst { 11441 break 11442 } 11443 c := v_0.AuxInt 11444 x := v.Args[1] 11445 y := v.Args[2] 11446 v.reset(OpARMRSBSconst) 11447 v.AuxInt = c 11448 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 11449 v0.AddArg(x) 11450 v0.AddArg(y) 11451 v.AddArg(v0) 11452 return true 11453 } 11454 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 11455 // cond: 11456 // result: (SUBSshiftLL x y [c]) 11457 for { 11458 x := v.Args[0] 11459 y := v.Args[1] 11460 v_2 := v.Args[2] 11461 if v_2.Op != OpARMMOVWconst { 11462 break 11463 } 11464 c := v_2.AuxInt 11465 v.reset(OpARMSUBSshiftLL) 11466 v.AuxInt = c 11467 v.AddArg(x) 11468 v.AddArg(y) 11469 return true 11470 } 11471 return false 11472 } 11473 func rewriteValueARM_OpARMSUBSshiftRA(v *Value, config *Config) bool { 11474 b := v.Block 11475 _ = b 11476 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 11477 // cond: 11478 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 11479 for { 11480 d := v.AuxInt 11481 v_0 := v.Args[0] 11482 if v_0.Op != OpARMMOVWconst { 11483 break 11484 } 11485 c := v_0.AuxInt 11486 x := v.Args[1] 11487 v.reset(OpARMRSBSconst) 11488 v.AuxInt = c 11489 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 11490 v0.AuxInt = d 11491 v0.AddArg(x) 11492 v.AddArg(v0) 11493 return true 11494 } 11495 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 11496 // cond: 11497 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 11498 for { 11499 d := v.AuxInt 11500 x := v.Args[0] 11501 v_1 := v.Args[1] 11502 if v_1.Op != OpARMMOVWconst { 11503 break 11504 } 11505 c := v_1.AuxInt 11506 v.reset(OpARMSUBSconst) 11507 v.AuxInt = int64(int32(c) >> uint64(d)) 11508 v.AddArg(x) 11509 return true 11510 } 11511 return false 11512 } 11513 func rewriteValueARM_OpARMSUBSshiftRAreg(v *Value, config *Config) bool { 11514 b := v.Block 11515 _ = b 11516 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 11517 // cond: 11518 // result: (RSBSconst [c] (SRA <x.Type> x y)) 11519 for { 11520 v_0 := v.Args[0] 11521 if v_0.Op != OpARMMOVWconst { 11522 break 11523 } 11524 c := v_0.AuxInt 11525 x := v.Args[1] 11526 y := v.Args[2] 11527 v.reset(OpARMRSBSconst) 11528 v.AuxInt = c 11529 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 11530 v0.AddArg(x) 11531 v0.AddArg(y) 11532 v.AddArg(v0) 11533 return true 11534 } 11535 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 11536 // cond: 11537 // result: (SUBSshiftRA x y [c]) 11538 for { 11539 x := v.Args[0] 11540 y := v.Args[1] 11541 v_2 := v.Args[2] 11542 if v_2.Op != OpARMMOVWconst { 11543 break 11544 } 11545 c := v_2.AuxInt 11546 v.reset(OpARMSUBSshiftRA) 11547 v.AuxInt = c 11548 v.AddArg(x) 11549 v.AddArg(y) 11550 return true 11551 } 11552 return false 11553 } 11554 func rewriteValueARM_OpARMSUBSshiftRL(v *Value, config *Config) bool { 11555 b := v.Block 11556 _ = b 11557 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 11558 // cond: 11559 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 11560 for { 11561 d := v.AuxInt 11562 v_0 := v.Args[0] 11563 if v_0.Op != OpARMMOVWconst { 11564 break 11565 } 11566 c := v_0.AuxInt 11567 x := v.Args[1] 11568 v.reset(OpARMRSBSconst) 11569 v.AuxInt = c 11570 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 11571 v0.AuxInt = d 11572 v0.AddArg(x) 11573 v.AddArg(v0) 11574 return true 11575 } 11576 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 11577 // cond: 11578 // result: (SUBSconst x [int64(uint32(c)>>uint64(d))]) 11579 for { 11580 d := v.AuxInt 11581 x := v.Args[0] 11582 v_1 := v.Args[1] 11583 if v_1.Op != OpARMMOVWconst { 11584 break 11585 } 11586 c := v_1.AuxInt 11587 v.reset(OpARMSUBSconst) 11588 v.AuxInt = int64(uint32(c) >> uint64(d)) 11589 v.AddArg(x) 11590 return true 11591 } 11592 return false 11593 } 11594 func rewriteValueARM_OpARMSUBSshiftRLreg(v *Value, config *Config) bool { 11595 b := v.Block 11596 _ = b 11597 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 11598 // cond: 11599 // result: (RSBSconst [c] (SRL <x.Type> x y)) 11600 for { 11601 v_0 := v.Args[0] 11602 if v_0.Op != OpARMMOVWconst { 11603 break 11604 } 11605 c := v_0.AuxInt 11606 x := v.Args[1] 11607 y := v.Args[2] 11608 v.reset(OpARMRSBSconst) 11609 v.AuxInt = c 11610 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 11611 v0.AddArg(x) 11612 v0.AddArg(y) 11613 v.AddArg(v0) 11614 return true 11615 } 11616 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 11617 // cond: 11618 // result: (SUBSshiftRL x y [c]) 11619 for { 11620 x := v.Args[0] 11621 y := v.Args[1] 11622 v_2 := v.Args[2] 11623 if v_2.Op != OpARMMOVWconst { 11624 break 11625 } 11626 c := v_2.AuxInt 11627 v.reset(OpARMSUBSshiftRL) 11628 v.AuxInt = c 11629 v.AddArg(x) 11630 v.AddArg(y) 11631 return true 11632 } 11633 return false 11634 } 11635 func rewriteValueARM_OpARMSUBconst(v *Value, config *Config) bool { 11636 b := v.Block 11637 _ = b 11638 // match: (SUBconst [0] x) 11639 // cond: 11640 // result: x 11641 for { 11642 if v.AuxInt != 0 { 11643 break 11644 } 11645 x := v.Args[0] 11646 v.reset(OpCopy) 11647 v.Type = x.Type 11648 v.AddArg(x) 11649 return true 11650 } 11651 // match: (SUBconst [c] (MOVWconst [d])) 11652 // cond: 11653 // result: (MOVWconst [int64(int32(d-c))]) 11654 for { 11655 c := v.AuxInt 11656 v_0 := v.Args[0] 11657 if v_0.Op != OpARMMOVWconst { 11658 break 11659 } 11660 d := v_0.AuxInt 11661 v.reset(OpARMMOVWconst) 11662 v.AuxInt = int64(int32(d - c)) 11663 return true 11664 } 11665 // match: (SUBconst [c] (SUBconst [d] x)) 11666 // cond: 11667 // result: (ADDconst [int64(int32(-c-d))] x) 11668 for { 11669 c := v.AuxInt 11670 v_0 := v.Args[0] 11671 if v_0.Op != OpARMSUBconst { 11672 break 11673 } 11674 d := v_0.AuxInt 11675 x := v_0.Args[0] 11676 v.reset(OpARMADDconst) 11677 v.AuxInt = int64(int32(-c - d)) 11678 v.AddArg(x) 11679 return true 11680 } 11681 // match: (SUBconst [c] (ADDconst [d] x)) 11682 // cond: 11683 // result: (ADDconst [int64(int32(-c+d))] x) 11684 for { 11685 c := v.AuxInt 11686 v_0 := v.Args[0] 11687 if v_0.Op != OpARMADDconst { 11688 break 11689 } 11690 d := v_0.AuxInt 11691 x := v_0.Args[0] 11692 v.reset(OpARMADDconst) 11693 v.AuxInt = int64(int32(-c + d)) 11694 v.AddArg(x) 11695 return true 11696 } 11697 // match: (SUBconst [c] (RSBconst [d] x)) 11698 // cond: 11699 // result: (RSBconst [int64(int32(-c+d))] x) 11700 for { 11701 c := v.AuxInt 11702 v_0 := v.Args[0] 11703 if v_0.Op != OpARMRSBconst { 11704 break 11705 } 11706 d := v_0.AuxInt 11707 x := v_0.Args[0] 11708 v.reset(OpARMRSBconst) 11709 v.AuxInt = int64(int32(-c + d)) 11710 v.AddArg(x) 11711 return true 11712 } 11713 return false 11714 } 11715 func rewriteValueARM_OpARMSUBshiftLL(v *Value, config *Config) bool { 11716 b := v.Block 11717 _ = b 11718 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 11719 // cond: 11720 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 11721 for { 11722 d := v.AuxInt 11723 v_0 := v.Args[0] 11724 if v_0.Op != OpARMMOVWconst { 11725 break 11726 } 11727 c := v_0.AuxInt 11728 x := v.Args[1] 11729 v.reset(OpARMRSBconst) 11730 v.AuxInt = c 11731 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 11732 v0.AuxInt = d 11733 v0.AddArg(x) 11734 v.AddArg(v0) 11735 return true 11736 } 11737 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 11738 // cond: 11739 // result: (SUBconst x [int64(uint32(c)<<uint64(d))]) 11740 for { 11741 d := v.AuxInt 11742 x := v.Args[0] 11743 v_1 := v.Args[1] 11744 if v_1.Op != OpARMMOVWconst { 11745 break 11746 } 11747 c := v_1.AuxInt 11748 v.reset(OpARMSUBconst) 11749 v.AuxInt = int64(uint32(c) << uint64(d)) 11750 v.AddArg(x) 11751 return true 11752 } 11753 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 11754 // cond: c==d 11755 // result: (MOVWconst [0]) 11756 for { 11757 d := v.AuxInt 11758 x := v.Args[0] 11759 v_1 := v.Args[1] 11760 if v_1.Op != OpARMSLLconst { 11761 break 11762 } 11763 c := v_1.AuxInt 11764 if x != v_1.Args[0] { 11765 break 11766 } 11767 if !(c == d) { 11768 break 11769 } 11770 v.reset(OpARMMOVWconst) 11771 v.AuxInt = 0 11772 return true 11773 } 11774 return false 11775 } 11776 func rewriteValueARM_OpARMSUBshiftLLreg(v *Value, config *Config) bool { 11777 b := v.Block 11778 _ = b 11779 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 11780 // cond: 11781 // result: (RSBconst [c] (SLL <x.Type> x y)) 11782 for { 11783 v_0 := v.Args[0] 11784 if v_0.Op != OpARMMOVWconst { 11785 break 11786 } 11787 c := v_0.AuxInt 11788 x := v.Args[1] 11789 y := v.Args[2] 11790 v.reset(OpARMRSBconst) 11791 v.AuxInt = c 11792 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 11793 v0.AddArg(x) 11794 v0.AddArg(y) 11795 v.AddArg(v0) 11796 return true 11797 } 11798 // match: (SUBshiftLLreg x y (MOVWconst [c])) 11799 // cond: 11800 // result: (SUBshiftLL x y [c]) 11801 for { 11802 x := v.Args[0] 11803 y := v.Args[1] 11804 v_2 := v.Args[2] 11805 if v_2.Op != OpARMMOVWconst { 11806 break 11807 } 11808 c := v_2.AuxInt 11809 v.reset(OpARMSUBshiftLL) 11810 v.AuxInt = c 11811 v.AddArg(x) 11812 v.AddArg(y) 11813 return true 11814 } 11815 return false 11816 } 11817 func rewriteValueARM_OpARMSUBshiftRA(v *Value, config *Config) bool { 11818 b := v.Block 11819 _ = b 11820 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 11821 // cond: 11822 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 11823 for { 11824 d := v.AuxInt 11825 v_0 := v.Args[0] 11826 if v_0.Op != OpARMMOVWconst { 11827 break 11828 } 11829 c := v_0.AuxInt 11830 x := v.Args[1] 11831 v.reset(OpARMRSBconst) 11832 v.AuxInt = c 11833 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 11834 v0.AuxInt = d 11835 v0.AddArg(x) 11836 v.AddArg(v0) 11837 return true 11838 } 11839 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 11840 // cond: 11841 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 11842 for { 11843 d := v.AuxInt 11844 x := v.Args[0] 11845 v_1 := v.Args[1] 11846 if v_1.Op != OpARMMOVWconst { 11847 break 11848 } 11849 c := v_1.AuxInt 11850 v.reset(OpARMSUBconst) 11851 v.AuxInt = int64(int32(c) >> uint64(d)) 11852 v.AddArg(x) 11853 return true 11854 } 11855 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 11856 // cond: c==d 11857 // result: (MOVWconst [0]) 11858 for { 11859 d := v.AuxInt 11860 x := v.Args[0] 11861 v_1 := v.Args[1] 11862 if v_1.Op != OpARMSRAconst { 11863 break 11864 } 11865 c := v_1.AuxInt 11866 if x != v_1.Args[0] { 11867 break 11868 } 11869 if !(c == d) { 11870 break 11871 } 11872 v.reset(OpARMMOVWconst) 11873 v.AuxInt = 0 11874 return true 11875 } 11876 return false 11877 } 11878 func rewriteValueARM_OpARMSUBshiftRAreg(v *Value, config *Config) bool { 11879 b := v.Block 11880 _ = b 11881 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 11882 // cond: 11883 // result: (RSBconst [c] (SRA <x.Type> x y)) 11884 for { 11885 v_0 := v.Args[0] 11886 if v_0.Op != OpARMMOVWconst { 11887 break 11888 } 11889 c := v_0.AuxInt 11890 x := v.Args[1] 11891 y := v.Args[2] 11892 v.reset(OpARMRSBconst) 11893 v.AuxInt = c 11894 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 11895 v0.AddArg(x) 11896 v0.AddArg(y) 11897 v.AddArg(v0) 11898 return true 11899 } 11900 // match: (SUBshiftRAreg x y (MOVWconst [c])) 11901 // cond: 11902 // result: (SUBshiftRA x y [c]) 11903 for { 11904 x := v.Args[0] 11905 y := v.Args[1] 11906 v_2 := v.Args[2] 11907 if v_2.Op != OpARMMOVWconst { 11908 break 11909 } 11910 c := v_2.AuxInt 11911 v.reset(OpARMSUBshiftRA) 11912 v.AuxInt = c 11913 v.AddArg(x) 11914 v.AddArg(y) 11915 return true 11916 } 11917 return false 11918 } 11919 func rewriteValueARM_OpARMSUBshiftRL(v *Value, config *Config) bool { 11920 b := v.Block 11921 _ = b 11922 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 11923 // cond: 11924 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 11925 for { 11926 d := v.AuxInt 11927 v_0 := v.Args[0] 11928 if v_0.Op != OpARMMOVWconst { 11929 break 11930 } 11931 c := v_0.AuxInt 11932 x := v.Args[1] 11933 v.reset(OpARMRSBconst) 11934 v.AuxInt = c 11935 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 11936 v0.AuxInt = d 11937 v0.AddArg(x) 11938 v.AddArg(v0) 11939 return true 11940 } 11941 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 11942 // cond: 11943 // result: (SUBconst x [int64(uint32(c)>>uint64(d))]) 11944 for { 11945 d := v.AuxInt 11946 x := v.Args[0] 11947 v_1 := v.Args[1] 11948 if v_1.Op != OpARMMOVWconst { 11949 break 11950 } 11951 c := v_1.AuxInt 11952 v.reset(OpARMSUBconst) 11953 v.AuxInt = int64(uint32(c) >> uint64(d)) 11954 v.AddArg(x) 11955 return true 11956 } 11957 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 11958 // cond: c==d 11959 // result: (MOVWconst [0]) 11960 for { 11961 d := v.AuxInt 11962 x := v.Args[0] 11963 v_1 := v.Args[1] 11964 if v_1.Op != OpARMSRLconst { 11965 break 11966 } 11967 c := v_1.AuxInt 11968 if x != v_1.Args[0] { 11969 break 11970 } 11971 if !(c == d) { 11972 break 11973 } 11974 v.reset(OpARMMOVWconst) 11975 v.AuxInt = 0 11976 return true 11977 } 11978 return false 11979 } 11980 func rewriteValueARM_OpARMSUBshiftRLreg(v *Value, config *Config) bool { 11981 b := v.Block 11982 _ = b 11983 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 11984 // cond: 11985 // result: (RSBconst [c] (SRL <x.Type> x y)) 11986 for { 11987 v_0 := v.Args[0] 11988 if v_0.Op != OpARMMOVWconst { 11989 break 11990 } 11991 c := v_0.AuxInt 11992 x := v.Args[1] 11993 y := v.Args[2] 11994 v.reset(OpARMRSBconst) 11995 v.AuxInt = c 11996 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 11997 v0.AddArg(x) 11998 v0.AddArg(y) 11999 v.AddArg(v0) 12000 return true 12001 } 12002 // match: (SUBshiftRLreg x y (MOVWconst [c])) 12003 // cond: 12004 // result: (SUBshiftRL x y [c]) 12005 for { 12006 x := v.Args[0] 12007 y := v.Args[1] 12008 v_2 := v.Args[2] 12009 if v_2.Op != OpARMMOVWconst { 12010 break 12011 } 12012 c := v_2.AuxInt 12013 v.reset(OpARMSUBshiftRL) 12014 v.AuxInt = c 12015 v.AddArg(x) 12016 v.AddArg(y) 12017 return true 12018 } 12019 return false 12020 } 12021 func rewriteValueARM_OpARMXOR(v *Value, config *Config) bool { 12022 b := v.Block 12023 _ = b 12024 // match: (XOR (MOVWconst [c]) x) 12025 // cond: 12026 // result: (XORconst [c] x) 12027 for { 12028 v_0 := v.Args[0] 12029 if v_0.Op != OpARMMOVWconst { 12030 break 12031 } 12032 c := v_0.AuxInt 12033 x := v.Args[1] 12034 v.reset(OpARMXORconst) 12035 v.AuxInt = c 12036 v.AddArg(x) 12037 return true 12038 } 12039 // match: (XOR x (MOVWconst [c])) 12040 // cond: 12041 // result: (XORconst [c] x) 12042 for { 12043 x := v.Args[0] 12044 v_1 := v.Args[1] 12045 if v_1.Op != OpARMMOVWconst { 12046 break 12047 } 12048 c := v_1.AuxInt 12049 v.reset(OpARMXORconst) 12050 v.AuxInt = c 12051 v.AddArg(x) 12052 return true 12053 } 12054 // match: (XOR x (SLLconst [c] y)) 12055 // cond: 12056 // result: (XORshiftLL x y [c]) 12057 for { 12058 x := v.Args[0] 12059 v_1 := v.Args[1] 12060 if v_1.Op != OpARMSLLconst { 12061 break 12062 } 12063 c := v_1.AuxInt 12064 y := v_1.Args[0] 12065 v.reset(OpARMXORshiftLL) 12066 v.AuxInt = c 12067 v.AddArg(x) 12068 v.AddArg(y) 12069 return true 12070 } 12071 // match: (XOR (SLLconst [c] y) x) 12072 // cond: 12073 // result: (XORshiftLL x y [c]) 12074 for { 12075 v_0 := v.Args[0] 12076 if v_0.Op != OpARMSLLconst { 12077 break 12078 } 12079 c := v_0.AuxInt 12080 y := v_0.Args[0] 12081 x := v.Args[1] 12082 v.reset(OpARMXORshiftLL) 12083 v.AuxInt = c 12084 v.AddArg(x) 12085 v.AddArg(y) 12086 return true 12087 } 12088 // match: (XOR x (SRLconst [c] y)) 12089 // cond: 12090 // result: (XORshiftRL x y [c]) 12091 for { 12092 x := v.Args[0] 12093 v_1 := v.Args[1] 12094 if v_1.Op != OpARMSRLconst { 12095 break 12096 } 12097 c := v_1.AuxInt 12098 y := v_1.Args[0] 12099 v.reset(OpARMXORshiftRL) 12100 v.AuxInt = c 12101 v.AddArg(x) 12102 v.AddArg(y) 12103 return true 12104 } 12105 // match: (XOR (SRLconst [c] y) x) 12106 // cond: 12107 // result: (XORshiftRL x y [c]) 12108 for { 12109 v_0 := v.Args[0] 12110 if v_0.Op != OpARMSRLconst { 12111 break 12112 } 12113 c := v_0.AuxInt 12114 y := v_0.Args[0] 12115 x := v.Args[1] 12116 v.reset(OpARMXORshiftRL) 12117 v.AuxInt = c 12118 v.AddArg(x) 12119 v.AddArg(y) 12120 return true 12121 } 12122 // match: (XOR x (SRAconst [c] y)) 12123 // cond: 12124 // result: (XORshiftRA x y [c]) 12125 for { 12126 x := v.Args[0] 12127 v_1 := v.Args[1] 12128 if v_1.Op != OpARMSRAconst { 12129 break 12130 } 12131 c := v_1.AuxInt 12132 y := v_1.Args[0] 12133 v.reset(OpARMXORshiftRA) 12134 v.AuxInt = c 12135 v.AddArg(x) 12136 v.AddArg(y) 12137 return true 12138 } 12139 // match: (XOR (SRAconst [c] y) x) 12140 // cond: 12141 // result: (XORshiftRA x y [c]) 12142 for { 12143 v_0 := v.Args[0] 12144 if v_0.Op != OpARMSRAconst { 12145 break 12146 } 12147 c := v_0.AuxInt 12148 y := v_0.Args[0] 12149 x := v.Args[1] 12150 v.reset(OpARMXORshiftRA) 12151 v.AuxInt = c 12152 v.AddArg(x) 12153 v.AddArg(y) 12154 return true 12155 } 12156 // match: (XOR x (SRRconst [c] y)) 12157 // cond: 12158 // result: (XORshiftRR x y [c]) 12159 for { 12160 x := v.Args[0] 12161 v_1 := v.Args[1] 12162 if v_1.Op != OpARMSRRconst { 12163 break 12164 } 12165 c := v_1.AuxInt 12166 y := v_1.Args[0] 12167 v.reset(OpARMXORshiftRR) 12168 v.AuxInt = c 12169 v.AddArg(x) 12170 v.AddArg(y) 12171 return true 12172 } 12173 // match: (XOR (SRRconst [c] y) x) 12174 // cond: 12175 // result: (XORshiftRR x y [c]) 12176 for { 12177 v_0 := v.Args[0] 12178 if v_0.Op != OpARMSRRconst { 12179 break 12180 } 12181 c := v_0.AuxInt 12182 y := v_0.Args[0] 12183 x := v.Args[1] 12184 v.reset(OpARMXORshiftRR) 12185 v.AuxInt = c 12186 v.AddArg(x) 12187 v.AddArg(y) 12188 return true 12189 } 12190 // match: (XOR x (SLL y z)) 12191 // cond: 12192 // result: (XORshiftLLreg x y z) 12193 for { 12194 x := v.Args[0] 12195 v_1 := v.Args[1] 12196 if v_1.Op != OpARMSLL { 12197 break 12198 } 12199 y := v_1.Args[0] 12200 z := v_1.Args[1] 12201 v.reset(OpARMXORshiftLLreg) 12202 v.AddArg(x) 12203 v.AddArg(y) 12204 v.AddArg(z) 12205 return true 12206 } 12207 // match: (XOR (SLL y z) x) 12208 // cond: 12209 // result: (XORshiftLLreg x y z) 12210 for { 12211 v_0 := v.Args[0] 12212 if v_0.Op != OpARMSLL { 12213 break 12214 } 12215 y := v_0.Args[0] 12216 z := v_0.Args[1] 12217 x := v.Args[1] 12218 v.reset(OpARMXORshiftLLreg) 12219 v.AddArg(x) 12220 v.AddArg(y) 12221 v.AddArg(z) 12222 return true 12223 } 12224 // match: (XOR x (SRL y z)) 12225 // cond: 12226 // result: (XORshiftRLreg x y z) 12227 for { 12228 x := v.Args[0] 12229 v_1 := v.Args[1] 12230 if v_1.Op != OpARMSRL { 12231 break 12232 } 12233 y := v_1.Args[0] 12234 z := v_1.Args[1] 12235 v.reset(OpARMXORshiftRLreg) 12236 v.AddArg(x) 12237 v.AddArg(y) 12238 v.AddArg(z) 12239 return true 12240 } 12241 // match: (XOR (SRL y z) x) 12242 // cond: 12243 // result: (XORshiftRLreg x y z) 12244 for { 12245 v_0 := v.Args[0] 12246 if v_0.Op != OpARMSRL { 12247 break 12248 } 12249 y := v_0.Args[0] 12250 z := v_0.Args[1] 12251 x := v.Args[1] 12252 v.reset(OpARMXORshiftRLreg) 12253 v.AddArg(x) 12254 v.AddArg(y) 12255 v.AddArg(z) 12256 return true 12257 } 12258 // match: (XOR x (SRA y z)) 12259 // cond: 12260 // result: (XORshiftRAreg x y z) 12261 for { 12262 x := v.Args[0] 12263 v_1 := v.Args[1] 12264 if v_1.Op != OpARMSRA { 12265 break 12266 } 12267 y := v_1.Args[0] 12268 z := v_1.Args[1] 12269 v.reset(OpARMXORshiftRAreg) 12270 v.AddArg(x) 12271 v.AddArg(y) 12272 v.AddArg(z) 12273 return true 12274 } 12275 // match: (XOR (SRA y z) x) 12276 // cond: 12277 // result: (XORshiftRAreg x y z) 12278 for { 12279 v_0 := v.Args[0] 12280 if v_0.Op != OpARMSRA { 12281 break 12282 } 12283 y := v_0.Args[0] 12284 z := v_0.Args[1] 12285 x := v.Args[1] 12286 v.reset(OpARMXORshiftRAreg) 12287 v.AddArg(x) 12288 v.AddArg(y) 12289 v.AddArg(z) 12290 return true 12291 } 12292 // match: (XOR x x) 12293 // cond: 12294 // result: (MOVWconst [0]) 12295 for { 12296 x := v.Args[0] 12297 if x != v.Args[1] { 12298 break 12299 } 12300 v.reset(OpARMMOVWconst) 12301 v.AuxInt = 0 12302 return true 12303 } 12304 return false 12305 } 12306 func rewriteValueARM_OpARMXORconst(v *Value, config *Config) bool { 12307 b := v.Block 12308 _ = b 12309 // match: (XORconst [0] x) 12310 // cond: 12311 // result: x 12312 for { 12313 if v.AuxInt != 0 { 12314 break 12315 } 12316 x := v.Args[0] 12317 v.reset(OpCopy) 12318 v.Type = x.Type 12319 v.AddArg(x) 12320 return true 12321 } 12322 // match: (XORconst [c] (MOVWconst [d])) 12323 // cond: 12324 // result: (MOVWconst [c^d]) 12325 for { 12326 c := v.AuxInt 12327 v_0 := v.Args[0] 12328 if v_0.Op != OpARMMOVWconst { 12329 break 12330 } 12331 d := v_0.AuxInt 12332 v.reset(OpARMMOVWconst) 12333 v.AuxInt = c ^ d 12334 return true 12335 } 12336 // match: (XORconst [c] (XORconst [d] x)) 12337 // cond: 12338 // result: (XORconst [c^d] x) 12339 for { 12340 c := v.AuxInt 12341 v_0 := v.Args[0] 12342 if v_0.Op != OpARMXORconst { 12343 break 12344 } 12345 d := v_0.AuxInt 12346 x := v_0.Args[0] 12347 v.reset(OpARMXORconst) 12348 v.AuxInt = c ^ d 12349 v.AddArg(x) 12350 return true 12351 } 12352 return false 12353 } 12354 func rewriteValueARM_OpARMXORshiftLL(v *Value, config *Config) bool { 12355 b := v.Block 12356 _ = b 12357 // match: (XORshiftLL (MOVWconst [c]) x [d]) 12358 // cond: 12359 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 12360 for { 12361 d := v.AuxInt 12362 v_0 := v.Args[0] 12363 if v_0.Op != OpARMMOVWconst { 12364 break 12365 } 12366 c := v_0.AuxInt 12367 x := v.Args[1] 12368 v.reset(OpARMXORconst) 12369 v.AuxInt = c 12370 v0 := b.NewValue0(v.Line, OpARMSLLconst, x.Type) 12371 v0.AuxInt = d 12372 v0.AddArg(x) 12373 v.AddArg(v0) 12374 return true 12375 } 12376 // match: (XORshiftLL x (MOVWconst [c]) [d]) 12377 // cond: 12378 // result: (XORconst x [int64(uint32(c)<<uint64(d))]) 12379 for { 12380 d := v.AuxInt 12381 x := v.Args[0] 12382 v_1 := v.Args[1] 12383 if v_1.Op != OpARMMOVWconst { 12384 break 12385 } 12386 c := v_1.AuxInt 12387 v.reset(OpARMXORconst) 12388 v.AuxInt = int64(uint32(c) << uint64(d)) 12389 v.AddArg(x) 12390 return true 12391 } 12392 // match: (XORshiftLL x (SLLconst x [c]) [d]) 12393 // cond: c==d 12394 // result: (MOVWconst [0]) 12395 for { 12396 d := v.AuxInt 12397 x := v.Args[0] 12398 v_1 := v.Args[1] 12399 if v_1.Op != OpARMSLLconst { 12400 break 12401 } 12402 c := v_1.AuxInt 12403 if x != v_1.Args[0] { 12404 break 12405 } 12406 if !(c == d) { 12407 break 12408 } 12409 v.reset(OpARMMOVWconst) 12410 v.AuxInt = 0 12411 return true 12412 } 12413 return false 12414 } 12415 func rewriteValueARM_OpARMXORshiftLLreg(v *Value, config *Config) bool { 12416 b := v.Block 12417 _ = b 12418 // match: (XORshiftLLreg (MOVWconst [c]) x y) 12419 // cond: 12420 // result: (XORconst [c] (SLL <x.Type> x y)) 12421 for { 12422 v_0 := v.Args[0] 12423 if v_0.Op != OpARMMOVWconst { 12424 break 12425 } 12426 c := v_0.AuxInt 12427 x := v.Args[1] 12428 y := v.Args[2] 12429 v.reset(OpARMXORconst) 12430 v.AuxInt = c 12431 v0 := b.NewValue0(v.Line, OpARMSLL, x.Type) 12432 v0.AddArg(x) 12433 v0.AddArg(y) 12434 v.AddArg(v0) 12435 return true 12436 } 12437 // match: (XORshiftLLreg x y (MOVWconst [c])) 12438 // cond: 12439 // result: (XORshiftLL x y [c]) 12440 for { 12441 x := v.Args[0] 12442 y := v.Args[1] 12443 v_2 := v.Args[2] 12444 if v_2.Op != OpARMMOVWconst { 12445 break 12446 } 12447 c := v_2.AuxInt 12448 v.reset(OpARMXORshiftLL) 12449 v.AuxInt = c 12450 v.AddArg(x) 12451 v.AddArg(y) 12452 return true 12453 } 12454 return false 12455 } 12456 func rewriteValueARM_OpARMXORshiftRA(v *Value, config *Config) bool { 12457 b := v.Block 12458 _ = b 12459 // match: (XORshiftRA (MOVWconst [c]) x [d]) 12460 // cond: 12461 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 12462 for { 12463 d := v.AuxInt 12464 v_0 := v.Args[0] 12465 if v_0.Op != OpARMMOVWconst { 12466 break 12467 } 12468 c := v_0.AuxInt 12469 x := v.Args[1] 12470 v.reset(OpARMXORconst) 12471 v.AuxInt = c 12472 v0 := b.NewValue0(v.Line, OpARMSRAconst, x.Type) 12473 v0.AuxInt = d 12474 v0.AddArg(x) 12475 v.AddArg(v0) 12476 return true 12477 } 12478 // match: (XORshiftRA x (MOVWconst [c]) [d]) 12479 // cond: 12480 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 12481 for { 12482 d := v.AuxInt 12483 x := v.Args[0] 12484 v_1 := v.Args[1] 12485 if v_1.Op != OpARMMOVWconst { 12486 break 12487 } 12488 c := v_1.AuxInt 12489 v.reset(OpARMXORconst) 12490 v.AuxInt = int64(int32(c) >> uint64(d)) 12491 v.AddArg(x) 12492 return true 12493 } 12494 // match: (XORshiftRA x (SRAconst x [c]) [d]) 12495 // cond: c==d 12496 // result: (MOVWconst [0]) 12497 for { 12498 d := v.AuxInt 12499 x := v.Args[0] 12500 v_1 := v.Args[1] 12501 if v_1.Op != OpARMSRAconst { 12502 break 12503 } 12504 c := v_1.AuxInt 12505 if x != v_1.Args[0] { 12506 break 12507 } 12508 if !(c == d) { 12509 break 12510 } 12511 v.reset(OpARMMOVWconst) 12512 v.AuxInt = 0 12513 return true 12514 } 12515 return false 12516 } 12517 func rewriteValueARM_OpARMXORshiftRAreg(v *Value, config *Config) bool { 12518 b := v.Block 12519 _ = b 12520 // match: (XORshiftRAreg (MOVWconst [c]) x y) 12521 // cond: 12522 // result: (XORconst [c] (SRA <x.Type> x y)) 12523 for { 12524 v_0 := v.Args[0] 12525 if v_0.Op != OpARMMOVWconst { 12526 break 12527 } 12528 c := v_0.AuxInt 12529 x := v.Args[1] 12530 y := v.Args[2] 12531 v.reset(OpARMXORconst) 12532 v.AuxInt = c 12533 v0 := b.NewValue0(v.Line, OpARMSRA, x.Type) 12534 v0.AddArg(x) 12535 v0.AddArg(y) 12536 v.AddArg(v0) 12537 return true 12538 } 12539 // match: (XORshiftRAreg x y (MOVWconst [c])) 12540 // cond: 12541 // result: (XORshiftRA x y [c]) 12542 for { 12543 x := v.Args[0] 12544 y := v.Args[1] 12545 v_2 := v.Args[2] 12546 if v_2.Op != OpARMMOVWconst { 12547 break 12548 } 12549 c := v_2.AuxInt 12550 v.reset(OpARMXORshiftRA) 12551 v.AuxInt = c 12552 v.AddArg(x) 12553 v.AddArg(y) 12554 return true 12555 } 12556 return false 12557 } 12558 func rewriteValueARM_OpARMXORshiftRL(v *Value, config *Config) bool { 12559 b := v.Block 12560 _ = b 12561 // match: (XORshiftRL (MOVWconst [c]) x [d]) 12562 // cond: 12563 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 12564 for { 12565 d := v.AuxInt 12566 v_0 := v.Args[0] 12567 if v_0.Op != OpARMMOVWconst { 12568 break 12569 } 12570 c := v_0.AuxInt 12571 x := v.Args[1] 12572 v.reset(OpARMXORconst) 12573 v.AuxInt = c 12574 v0 := b.NewValue0(v.Line, OpARMSRLconst, x.Type) 12575 v0.AuxInt = d 12576 v0.AddArg(x) 12577 v.AddArg(v0) 12578 return true 12579 } 12580 // match: (XORshiftRL x (MOVWconst [c]) [d]) 12581 // cond: 12582 // result: (XORconst x [int64(uint32(c)>>uint64(d))]) 12583 for { 12584 d := v.AuxInt 12585 x := v.Args[0] 12586 v_1 := v.Args[1] 12587 if v_1.Op != OpARMMOVWconst { 12588 break 12589 } 12590 c := v_1.AuxInt 12591 v.reset(OpARMXORconst) 12592 v.AuxInt = int64(uint32(c) >> uint64(d)) 12593 v.AddArg(x) 12594 return true 12595 } 12596 // match: (XORshiftRL x (SRLconst x [c]) [d]) 12597 // cond: c==d 12598 // result: (MOVWconst [0]) 12599 for { 12600 d := v.AuxInt 12601 x := v.Args[0] 12602 v_1 := v.Args[1] 12603 if v_1.Op != OpARMSRLconst { 12604 break 12605 } 12606 c := v_1.AuxInt 12607 if x != v_1.Args[0] { 12608 break 12609 } 12610 if !(c == d) { 12611 break 12612 } 12613 v.reset(OpARMMOVWconst) 12614 v.AuxInt = 0 12615 return true 12616 } 12617 return false 12618 } 12619 func rewriteValueARM_OpARMXORshiftRLreg(v *Value, config *Config) bool { 12620 b := v.Block 12621 _ = b 12622 // match: (XORshiftRLreg (MOVWconst [c]) x y) 12623 // cond: 12624 // result: (XORconst [c] (SRL <x.Type> x y)) 12625 for { 12626 v_0 := v.Args[0] 12627 if v_0.Op != OpARMMOVWconst { 12628 break 12629 } 12630 c := v_0.AuxInt 12631 x := v.Args[1] 12632 y := v.Args[2] 12633 v.reset(OpARMXORconst) 12634 v.AuxInt = c 12635 v0 := b.NewValue0(v.Line, OpARMSRL, x.Type) 12636 v0.AddArg(x) 12637 v0.AddArg(y) 12638 v.AddArg(v0) 12639 return true 12640 } 12641 // match: (XORshiftRLreg x y (MOVWconst [c])) 12642 // cond: 12643 // result: (XORshiftRL x y [c]) 12644 for { 12645 x := v.Args[0] 12646 y := v.Args[1] 12647 v_2 := v.Args[2] 12648 if v_2.Op != OpARMMOVWconst { 12649 break 12650 } 12651 c := v_2.AuxInt 12652 v.reset(OpARMXORshiftRL) 12653 v.AuxInt = c 12654 v.AddArg(x) 12655 v.AddArg(y) 12656 return true 12657 } 12658 return false 12659 } 12660 func rewriteValueARM_OpARMXORshiftRR(v *Value, config *Config) bool { 12661 b := v.Block 12662 _ = b 12663 // match: (XORshiftRR (MOVWconst [c]) x [d]) 12664 // cond: 12665 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 12666 for { 12667 d := v.AuxInt 12668 v_0 := v.Args[0] 12669 if v_0.Op != OpARMMOVWconst { 12670 break 12671 } 12672 c := v_0.AuxInt 12673 x := v.Args[1] 12674 v.reset(OpARMXORconst) 12675 v.AuxInt = c 12676 v0 := b.NewValue0(v.Line, OpARMSRRconst, x.Type) 12677 v0.AuxInt = d 12678 v0.AddArg(x) 12679 v.AddArg(v0) 12680 return true 12681 } 12682 // match: (XORshiftRR x (MOVWconst [c]) [d]) 12683 // cond: 12684 // result: (XORconst x [int64(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 12685 for { 12686 d := v.AuxInt 12687 x := v.Args[0] 12688 v_1 := v.Args[1] 12689 if v_1.Op != OpARMMOVWconst { 12690 break 12691 } 12692 c := v_1.AuxInt 12693 v.reset(OpARMXORconst) 12694 v.AuxInt = int64(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)) 12695 v.AddArg(x) 12696 return true 12697 } 12698 return false 12699 } 12700 func rewriteValueARM_OpAdd16(v *Value, config *Config) bool { 12701 b := v.Block 12702 _ = b 12703 // match: (Add16 x y) 12704 // cond: 12705 // result: (ADD x y) 12706 for { 12707 x := v.Args[0] 12708 y := v.Args[1] 12709 v.reset(OpARMADD) 12710 v.AddArg(x) 12711 v.AddArg(y) 12712 return true 12713 } 12714 } 12715 func rewriteValueARM_OpAdd32(v *Value, config *Config) bool { 12716 b := v.Block 12717 _ = b 12718 // match: (Add32 x y) 12719 // cond: 12720 // result: (ADD x y) 12721 for { 12722 x := v.Args[0] 12723 y := v.Args[1] 12724 v.reset(OpARMADD) 12725 v.AddArg(x) 12726 v.AddArg(y) 12727 return true 12728 } 12729 } 12730 func rewriteValueARM_OpAdd32F(v *Value, config *Config) bool { 12731 b := v.Block 12732 _ = b 12733 // match: (Add32F x y) 12734 // cond: 12735 // result: (ADDF x y) 12736 for { 12737 x := v.Args[0] 12738 y := v.Args[1] 12739 v.reset(OpARMADDF) 12740 v.AddArg(x) 12741 v.AddArg(y) 12742 return true 12743 } 12744 } 12745 func rewriteValueARM_OpAdd32carry(v *Value, config *Config) bool { 12746 b := v.Block 12747 _ = b 12748 // match: (Add32carry x y) 12749 // cond: 12750 // result: (ADDS x y) 12751 for { 12752 x := v.Args[0] 12753 y := v.Args[1] 12754 v.reset(OpARMADDS) 12755 v.AddArg(x) 12756 v.AddArg(y) 12757 return true 12758 } 12759 } 12760 func rewriteValueARM_OpAdd32withcarry(v *Value, config *Config) bool { 12761 b := v.Block 12762 _ = b 12763 // match: (Add32withcarry x y c) 12764 // cond: 12765 // result: (ADC x y c) 12766 for { 12767 x := v.Args[0] 12768 y := v.Args[1] 12769 c := v.Args[2] 12770 v.reset(OpARMADC) 12771 v.AddArg(x) 12772 v.AddArg(y) 12773 v.AddArg(c) 12774 return true 12775 } 12776 } 12777 func rewriteValueARM_OpAdd64F(v *Value, config *Config) bool { 12778 b := v.Block 12779 _ = b 12780 // match: (Add64F x y) 12781 // cond: 12782 // result: (ADDD x y) 12783 for { 12784 x := v.Args[0] 12785 y := v.Args[1] 12786 v.reset(OpARMADDD) 12787 v.AddArg(x) 12788 v.AddArg(y) 12789 return true 12790 } 12791 } 12792 func rewriteValueARM_OpAdd8(v *Value, config *Config) bool { 12793 b := v.Block 12794 _ = b 12795 // match: (Add8 x y) 12796 // cond: 12797 // result: (ADD x y) 12798 for { 12799 x := v.Args[0] 12800 y := v.Args[1] 12801 v.reset(OpARMADD) 12802 v.AddArg(x) 12803 v.AddArg(y) 12804 return true 12805 } 12806 } 12807 func rewriteValueARM_OpAddPtr(v *Value, config *Config) bool { 12808 b := v.Block 12809 _ = b 12810 // match: (AddPtr x y) 12811 // cond: 12812 // result: (ADD x y) 12813 for { 12814 x := v.Args[0] 12815 y := v.Args[1] 12816 v.reset(OpARMADD) 12817 v.AddArg(x) 12818 v.AddArg(y) 12819 return true 12820 } 12821 } 12822 func rewriteValueARM_OpAddr(v *Value, config *Config) bool { 12823 b := v.Block 12824 _ = b 12825 // match: (Addr {sym} base) 12826 // cond: 12827 // result: (MOVWaddr {sym} base) 12828 for { 12829 sym := v.Aux 12830 base := v.Args[0] 12831 v.reset(OpARMMOVWaddr) 12832 v.Aux = sym 12833 v.AddArg(base) 12834 return true 12835 } 12836 } 12837 func rewriteValueARM_OpAnd16(v *Value, config *Config) bool { 12838 b := v.Block 12839 _ = b 12840 // match: (And16 x y) 12841 // cond: 12842 // result: (AND x y) 12843 for { 12844 x := v.Args[0] 12845 y := v.Args[1] 12846 v.reset(OpARMAND) 12847 v.AddArg(x) 12848 v.AddArg(y) 12849 return true 12850 } 12851 } 12852 func rewriteValueARM_OpAnd32(v *Value, config *Config) bool { 12853 b := v.Block 12854 _ = b 12855 // match: (And32 x y) 12856 // cond: 12857 // result: (AND x y) 12858 for { 12859 x := v.Args[0] 12860 y := v.Args[1] 12861 v.reset(OpARMAND) 12862 v.AddArg(x) 12863 v.AddArg(y) 12864 return true 12865 } 12866 } 12867 func rewriteValueARM_OpAnd8(v *Value, config *Config) bool { 12868 b := v.Block 12869 _ = b 12870 // match: (And8 x y) 12871 // cond: 12872 // result: (AND x y) 12873 for { 12874 x := v.Args[0] 12875 y := v.Args[1] 12876 v.reset(OpARMAND) 12877 v.AddArg(x) 12878 v.AddArg(y) 12879 return true 12880 } 12881 } 12882 func rewriteValueARM_OpAndB(v *Value, config *Config) bool { 12883 b := v.Block 12884 _ = b 12885 // match: (AndB x y) 12886 // cond: 12887 // result: (AND x y) 12888 for { 12889 x := v.Args[0] 12890 y := v.Args[1] 12891 v.reset(OpARMAND) 12892 v.AddArg(x) 12893 v.AddArg(y) 12894 return true 12895 } 12896 } 12897 func rewriteValueARM_OpBswap32(v *Value, config *Config) bool { 12898 b := v.Block 12899 _ = b 12900 // match: (Bswap32 <t> x) 12901 // cond: 12902 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 12903 for { 12904 t := v.Type 12905 x := v.Args[0] 12906 v.reset(OpARMXOR) 12907 v.Type = t 12908 v0 := b.NewValue0(v.Line, OpARMSRLconst, t) 12909 v0.AuxInt = 8 12910 v1 := b.NewValue0(v.Line, OpARMBICconst, t) 12911 v1.AuxInt = 0xff0000 12912 v2 := b.NewValue0(v.Line, OpARMXOR, t) 12913 v2.AddArg(x) 12914 v3 := b.NewValue0(v.Line, OpARMSRRconst, t) 12915 v3.AuxInt = 16 12916 v3.AddArg(x) 12917 v2.AddArg(v3) 12918 v1.AddArg(v2) 12919 v0.AddArg(v1) 12920 v.AddArg(v0) 12921 v4 := b.NewValue0(v.Line, OpARMSRRconst, t) 12922 v4.AuxInt = 8 12923 v4.AddArg(x) 12924 v.AddArg(v4) 12925 return true 12926 } 12927 } 12928 func rewriteValueARM_OpClosureCall(v *Value, config *Config) bool { 12929 b := v.Block 12930 _ = b 12931 // match: (ClosureCall [argwid] entry closure mem) 12932 // cond: 12933 // result: (CALLclosure [argwid] entry closure mem) 12934 for { 12935 argwid := v.AuxInt 12936 entry := v.Args[0] 12937 closure := v.Args[1] 12938 mem := v.Args[2] 12939 v.reset(OpARMCALLclosure) 12940 v.AuxInt = argwid 12941 v.AddArg(entry) 12942 v.AddArg(closure) 12943 v.AddArg(mem) 12944 return true 12945 } 12946 } 12947 func rewriteValueARM_OpCom16(v *Value, config *Config) bool { 12948 b := v.Block 12949 _ = b 12950 // match: (Com16 x) 12951 // cond: 12952 // result: (MVN x) 12953 for { 12954 x := v.Args[0] 12955 v.reset(OpARMMVN) 12956 v.AddArg(x) 12957 return true 12958 } 12959 } 12960 func rewriteValueARM_OpCom32(v *Value, config *Config) bool { 12961 b := v.Block 12962 _ = b 12963 // match: (Com32 x) 12964 // cond: 12965 // result: (MVN x) 12966 for { 12967 x := v.Args[0] 12968 v.reset(OpARMMVN) 12969 v.AddArg(x) 12970 return true 12971 } 12972 } 12973 func rewriteValueARM_OpCom8(v *Value, config *Config) bool { 12974 b := v.Block 12975 _ = b 12976 // match: (Com8 x) 12977 // cond: 12978 // result: (MVN x) 12979 for { 12980 x := v.Args[0] 12981 v.reset(OpARMMVN) 12982 v.AddArg(x) 12983 return true 12984 } 12985 } 12986 func rewriteValueARM_OpConst16(v *Value, config *Config) bool { 12987 b := v.Block 12988 _ = b 12989 // match: (Const16 [val]) 12990 // cond: 12991 // result: (MOVWconst [val]) 12992 for { 12993 val := v.AuxInt 12994 v.reset(OpARMMOVWconst) 12995 v.AuxInt = val 12996 return true 12997 } 12998 } 12999 func rewriteValueARM_OpConst32(v *Value, config *Config) bool { 13000 b := v.Block 13001 _ = b 13002 // match: (Const32 [val]) 13003 // cond: 13004 // result: (MOVWconst [val]) 13005 for { 13006 val := v.AuxInt 13007 v.reset(OpARMMOVWconst) 13008 v.AuxInt = val 13009 return true 13010 } 13011 } 13012 func rewriteValueARM_OpConst32F(v *Value, config *Config) bool { 13013 b := v.Block 13014 _ = b 13015 // match: (Const32F [val]) 13016 // cond: 13017 // result: (MOVFconst [val]) 13018 for { 13019 val := v.AuxInt 13020 v.reset(OpARMMOVFconst) 13021 v.AuxInt = val 13022 return true 13023 } 13024 } 13025 func rewriteValueARM_OpConst64F(v *Value, config *Config) bool { 13026 b := v.Block 13027 _ = b 13028 // match: (Const64F [val]) 13029 // cond: 13030 // result: (MOVDconst [val]) 13031 for { 13032 val := v.AuxInt 13033 v.reset(OpARMMOVDconst) 13034 v.AuxInt = val 13035 return true 13036 } 13037 } 13038 func rewriteValueARM_OpConst8(v *Value, config *Config) bool { 13039 b := v.Block 13040 _ = b 13041 // match: (Const8 [val]) 13042 // cond: 13043 // result: (MOVWconst [val]) 13044 for { 13045 val := v.AuxInt 13046 v.reset(OpARMMOVWconst) 13047 v.AuxInt = val 13048 return true 13049 } 13050 } 13051 func rewriteValueARM_OpConstBool(v *Value, config *Config) bool { 13052 b := v.Block 13053 _ = b 13054 // match: (ConstBool [b]) 13055 // cond: 13056 // result: (MOVWconst [b]) 13057 for { 13058 b := v.AuxInt 13059 v.reset(OpARMMOVWconst) 13060 v.AuxInt = b 13061 return true 13062 } 13063 } 13064 func rewriteValueARM_OpConstNil(v *Value, config *Config) bool { 13065 b := v.Block 13066 _ = b 13067 // match: (ConstNil) 13068 // cond: 13069 // result: (MOVWconst [0]) 13070 for { 13071 v.reset(OpARMMOVWconst) 13072 v.AuxInt = 0 13073 return true 13074 } 13075 } 13076 func rewriteValueARM_OpConvert(v *Value, config *Config) bool { 13077 b := v.Block 13078 _ = b 13079 // match: (Convert x mem) 13080 // cond: 13081 // result: (MOVWconvert x mem) 13082 for { 13083 x := v.Args[0] 13084 mem := v.Args[1] 13085 v.reset(OpARMMOVWconvert) 13086 v.AddArg(x) 13087 v.AddArg(mem) 13088 return true 13089 } 13090 } 13091 func rewriteValueARM_OpCtz32(v *Value, config *Config) bool { 13092 b := v.Block 13093 _ = b 13094 // match: (Ctz32 <t> x) 13095 // cond: 13096 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 13097 for { 13098 t := v.Type 13099 x := v.Args[0] 13100 v.reset(OpARMRSBconst) 13101 v.AuxInt = 32 13102 v0 := b.NewValue0(v.Line, OpARMCLZ, t) 13103 v1 := b.NewValue0(v.Line, OpARMSUBconst, t) 13104 v1.AuxInt = 1 13105 v2 := b.NewValue0(v.Line, OpARMAND, t) 13106 v2.AddArg(x) 13107 v3 := b.NewValue0(v.Line, OpARMRSBconst, t) 13108 v3.AuxInt = 0 13109 v3.AddArg(x) 13110 v2.AddArg(v3) 13111 v1.AddArg(v2) 13112 v0.AddArg(v1) 13113 v.AddArg(v0) 13114 return true 13115 } 13116 } 13117 func rewriteValueARM_OpCvt32Fto32(v *Value, config *Config) bool { 13118 b := v.Block 13119 _ = b 13120 // match: (Cvt32Fto32 x) 13121 // cond: 13122 // result: (MOVFW x) 13123 for { 13124 x := v.Args[0] 13125 v.reset(OpARMMOVFW) 13126 v.AddArg(x) 13127 return true 13128 } 13129 } 13130 func rewriteValueARM_OpCvt32Fto32U(v *Value, config *Config) bool { 13131 b := v.Block 13132 _ = b 13133 // match: (Cvt32Fto32U x) 13134 // cond: 13135 // result: (MOVFWU x) 13136 for { 13137 x := v.Args[0] 13138 v.reset(OpARMMOVFWU) 13139 v.AddArg(x) 13140 return true 13141 } 13142 } 13143 func rewriteValueARM_OpCvt32Fto64F(v *Value, config *Config) bool { 13144 b := v.Block 13145 _ = b 13146 // match: (Cvt32Fto64F x) 13147 // cond: 13148 // result: (MOVFD x) 13149 for { 13150 x := v.Args[0] 13151 v.reset(OpARMMOVFD) 13152 v.AddArg(x) 13153 return true 13154 } 13155 } 13156 func rewriteValueARM_OpCvt32Uto32F(v *Value, config *Config) bool { 13157 b := v.Block 13158 _ = b 13159 // match: (Cvt32Uto32F x) 13160 // cond: 13161 // result: (MOVWUF x) 13162 for { 13163 x := v.Args[0] 13164 v.reset(OpARMMOVWUF) 13165 v.AddArg(x) 13166 return true 13167 } 13168 } 13169 func rewriteValueARM_OpCvt32Uto64F(v *Value, config *Config) bool { 13170 b := v.Block 13171 _ = b 13172 // match: (Cvt32Uto64F x) 13173 // cond: 13174 // result: (MOVWUD x) 13175 for { 13176 x := v.Args[0] 13177 v.reset(OpARMMOVWUD) 13178 v.AddArg(x) 13179 return true 13180 } 13181 } 13182 func rewriteValueARM_OpCvt32to32F(v *Value, config *Config) bool { 13183 b := v.Block 13184 _ = b 13185 // match: (Cvt32to32F x) 13186 // cond: 13187 // result: (MOVWF x) 13188 for { 13189 x := v.Args[0] 13190 v.reset(OpARMMOVWF) 13191 v.AddArg(x) 13192 return true 13193 } 13194 } 13195 func rewriteValueARM_OpCvt32to64F(v *Value, config *Config) bool { 13196 b := v.Block 13197 _ = b 13198 // match: (Cvt32to64F x) 13199 // cond: 13200 // result: (MOVWD x) 13201 for { 13202 x := v.Args[0] 13203 v.reset(OpARMMOVWD) 13204 v.AddArg(x) 13205 return true 13206 } 13207 } 13208 func rewriteValueARM_OpCvt64Fto32(v *Value, config *Config) bool { 13209 b := v.Block 13210 _ = b 13211 // match: (Cvt64Fto32 x) 13212 // cond: 13213 // result: (MOVDW x) 13214 for { 13215 x := v.Args[0] 13216 v.reset(OpARMMOVDW) 13217 v.AddArg(x) 13218 return true 13219 } 13220 } 13221 func rewriteValueARM_OpCvt64Fto32F(v *Value, config *Config) bool { 13222 b := v.Block 13223 _ = b 13224 // match: (Cvt64Fto32F x) 13225 // cond: 13226 // result: (MOVDF x) 13227 for { 13228 x := v.Args[0] 13229 v.reset(OpARMMOVDF) 13230 v.AddArg(x) 13231 return true 13232 } 13233 } 13234 func rewriteValueARM_OpCvt64Fto32U(v *Value, config *Config) bool { 13235 b := v.Block 13236 _ = b 13237 // match: (Cvt64Fto32U x) 13238 // cond: 13239 // result: (MOVDWU x) 13240 for { 13241 x := v.Args[0] 13242 v.reset(OpARMMOVDWU) 13243 v.AddArg(x) 13244 return true 13245 } 13246 } 13247 func rewriteValueARM_OpDeferCall(v *Value, config *Config) bool { 13248 b := v.Block 13249 _ = b 13250 // match: (DeferCall [argwid] mem) 13251 // cond: 13252 // result: (CALLdefer [argwid] mem) 13253 for { 13254 argwid := v.AuxInt 13255 mem := v.Args[0] 13256 v.reset(OpARMCALLdefer) 13257 v.AuxInt = argwid 13258 v.AddArg(mem) 13259 return true 13260 } 13261 } 13262 func rewriteValueARM_OpDiv16(v *Value, config *Config) bool { 13263 b := v.Block 13264 _ = b 13265 // match: (Div16 x y) 13266 // cond: 13267 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 13268 for { 13269 x := v.Args[0] 13270 y := v.Args[1] 13271 v.reset(OpDiv32) 13272 v0 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13273 v0.AddArg(x) 13274 v.AddArg(v0) 13275 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13276 v1.AddArg(y) 13277 v.AddArg(v1) 13278 return true 13279 } 13280 } 13281 func rewriteValueARM_OpDiv16u(v *Value, config *Config) bool { 13282 b := v.Block 13283 _ = b 13284 // match: (Div16u x y) 13285 // cond: 13286 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 13287 for { 13288 x := v.Args[0] 13289 y := v.Args[1] 13290 v.reset(OpDiv32u) 13291 v0 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13292 v0.AddArg(x) 13293 v.AddArg(v0) 13294 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13295 v1.AddArg(y) 13296 v.AddArg(v1) 13297 return true 13298 } 13299 } 13300 func rewriteValueARM_OpDiv32(v *Value, config *Config) bool { 13301 b := v.Block 13302 _ = b 13303 // match: (Div32 x y) 13304 // cond: 13305 // 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))) 13306 for { 13307 x := v.Args[0] 13308 y := v.Args[1] 13309 v.reset(OpARMSUB) 13310 v0 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13311 v1 := b.NewValue0(v.Line, OpSelect0, config.fe.TypeUInt32()) 13312 v2 := b.NewValue0(v.Line, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 13313 v3 := b.NewValue0(v.Line, OpARMSUB, config.fe.TypeUInt32()) 13314 v4 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13315 v4.AddArg(x) 13316 v5 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13317 v5.AddArg(x) 13318 v4.AddArg(v5) 13319 v3.AddArg(v4) 13320 v6 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13321 v6.AddArg(x) 13322 v3.AddArg(v6) 13323 v2.AddArg(v3) 13324 v7 := b.NewValue0(v.Line, OpARMSUB, config.fe.TypeUInt32()) 13325 v8 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13326 v8.AddArg(y) 13327 v9 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13328 v9.AddArg(y) 13329 v8.AddArg(v9) 13330 v7.AddArg(v8) 13331 v10 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13332 v10.AddArg(y) 13333 v7.AddArg(v10) 13334 v2.AddArg(v7) 13335 v1.AddArg(v2) 13336 v0.AddArg(v1) 13337 v11 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13338 v12 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13339 v12.AddArg(x) 13340 v12.AddArg(y) 13341 v11.AddArg(v12) 13342 v0.AddArg(v11) 13343 v.AddArg(v0) 13344 v13 := b.NewValue0(v.Line, OpSignmask, config.fe.TypeInt32()) 13345 v14 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeUInt32()) 13346 v14.AddArg(x) 13347 v14.AddArg(y) 13348 v13.AddArg(v14) 13349 v.AddArg(v13) 13350 return true 13351 } 13352 } 13353 func rewriteValueARM_OpDiv32F(v *Value, config *Config) bool { 13354 b := v.Block 13355 _ = b 13356 // match: (Div32F x y) 13357 // cond: 13358 // result: (DIVF x y) 13359 for { 13360 x := v.Args[0] 13361 y := v.Args[1] 13362 v.reset(OpARMDIVF) 13363 v.AddArg(x) 13364 v.AddArg(y) 13365 return true 13366 } 13367 } 13368 func rewriteValueARM_OpDiv32u(v *Value, config *Config) bool { 13369 b := v.Block 13370 _ = b 13371 // match: (Div32u x y) 13372 // cond: 13373 // result: (Select0 <config.fe.TypeUInt32()> (UDIVrtcall x y)) 13374 for { 13375 x := v.Args[0] 13376 y := v.Args[1] 13377 v.reset(OpSelect0) 13378 v.Type = config.fe.TypeUInt32() 13379 v0 := b.NewValue0(v.Line, OpARMUDIVrtcall, MakeTuple(config.fe.TypeUInt32(), config.fe.TypeUInt32())) 13380 v0.AddArg(x) 13381 v0.AddArg(y) 13382 v.AddArg(v0) 13383 return true 13384 } 13385 } 13386 func rewriteValueARM_OpDiv64F(v *Value, config *Config) bool { 13387 b := v.Block 13388 _ = b 13389 // match: (Div64F x y) 13390 // cond: 13391 // result: (DIVD x y) 13392 for { 13393 x := v.Args[0] 13394 y := v.Args[1] 13395 v.reset(OpARMDIVD) 13396 v.AddArg(x) 13397 v.AddArg(y) 13398 return true 13399 } 13400 } 13401 func rewriteValueARM_OpDiv8(v *Value, config *Config) bool { 13402 b := v.Block 13403 _ = b 13404 // match: (Div8 x y) 13405 // cond: 13406 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 13407 for { 13408 x := v.Args[0] 13409 y := v.Args[1] 13410 v.reset(OpDiv32) 13411 v0 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13412 v0.AddArg(x) 13413 v.AddArg(v0) 13414 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13415 v1.AddArg(y) 13416 v.AddArg(v1) 13417 return true 13418 } 13419 } 13420 func rewriteValueARM_OpDiv8u(v *Value, config *Config) bool { 13421 b := v.Block 13422 _ = b 13423 // match: (Div8u x y) 13424 // cond: 13425 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 13426 for { 13427 x := v.Args[0] 13428 y := v.Args[1] 13429 v.reset(OpDiv32u) 13430 v0 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13431 v0.AddArg(x) 13432 v.AddArg(v0) 13433 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13434 v1.AddArg(y) 13435 v.AddArg(v1) 13436 return true 13437 } 13438 } 13439 func rewriteValueARM_OpEq16(v *Value, config *Config) bool { 13440 b := v.Block 13441 _ = b 13442 // match: (Eq16 x y) 13443 // cond: 13444 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13445 for { 13446 x := v.Args[0] 13447 y := v.Args[1] 13448 v.reset(OpARMEqual) 13449 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13450 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13451 v1.AddArg(x) 13452 v0.AddArg(v1) 13453 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13454 v2.AddArg(y) 13455 v0.AddArg(v2) 13456 v.AddArg(v0) 13457 return true 13458 } 13459 } 13460 func rewriteValueARM_OpEq32(v *Value, config *Config) bool { 13461 b := v.Block 13462 _ = b 13463 // match: (Eq32 x y) 13464 // cond: 13465 // result: (Equal (CMP x y)) 13466 for { 13467 x := v.Args[0] 13468 y := v.Args[1] 13469 v.reset(OpARMEqual) 13470 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13471 v0.AddArg(x) 13472 v0.AddArg(y) 13473 v.AddArg(v0) 13474 return true 13475 } 13476 } 13477 func rewriteValueARM_OpEq32F(v *Value, config *Config) bool { 13478 b := v.Block 13479 _ = b 13480 // match: (Eq32F x y) 13481 // cond: 13482 // result: (Equal (CMPF x y)) 13483 for { 13484 x := v.Args[0] 13485 y := v.Args[1] 13486 v.reset(OpARMEqual) 13487 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 13488 v0.AddArg(x) 13489 v0.AddArg(y) 13490 v.AddArg(v0) 13491 return true 13492 } 13493 } 13494 func rewriteValueARM_OpEq64F(v *Value, config *Config) bool { 13495 b := v.Block 13496 _ = b 13497 // match: (Eq64F x y) 13498 // cond: 13499 // result: (Equal (CMPD x y)) 13500 for { 13501 x := v.Args[0] 13502 y := v.Args[1] 13503 v.reset(OpARMEqual) 13504 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 13505 v0.AddArg(x) 13506 v0.AddArg(y) 13507 v.AddArg(v0) 13508 return true 13509 } 13510 } 13511 func rewriteValueARM_OpEq8(v *Value, config *Config) bool { 13512 b := v.Block 13513 _ = b 13514 // match: (Eq8 x y) 13515 // cond: 13516 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13517 for { 13518 x := v.Args[0] 13519 y := v.Args[1] 13520 v.reset(OpARMEqual) 13521 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13522 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13523 v1.AddArg(x) 13524 v0.AddArg(v1) 13525 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13526 v2.AddArg(y) 13527 v0.AddArg(v2) 13528 v.AddArg(v0) 13529 return true 13530 } 13531 } 13532 func rewriteValueARM_OpEqB(v *Value, config *Config) bool { 13533 b := v.Block 13534 _ = b 13535 // match: (EqB x y) 13536 // cond: 13537 // result: (XORconst [1] (XOR <config.fe.TypeBool()> x y)) 13538 for { 13539 x := v.Args[0] 13540 y := v.Args[1] 13541 v.reset(OpARMXORconst) 13542 v.AuxInt = 1 13543 v0 := b.NewValue0(v.Line, OpARMXOR, config.fe.TypeBool()) 13544 v0.AddArg(x) 13545 v0.AddArg(y) 13546 v.AddArg(v0) 13547 return true 13548 } 13549 } 13550 func rewriteValueARM_OpEqPtr(v *Value, config *Config) bool { 13551 b := v.Block 13552 _ = b 13553 // match: (EqPtr x y) 13554 // cond: 13555 // result: (Equal (CMP x y)) 13556 for { 13557 x := v.Args[0] 13558 y := v.Args[1] 13559 v.reset(OpARMEqual) 13560 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13561 v0.AddArg(x) 13562 v0.AddArg(y) 13563 v.AddArg(v0) 13564 return true 13565 } 13566 } 13567 func rewriteValueARM_OpGeq16(v *Value, config *Config) bool { 13568 b := v.Block 13569 _ = b 13570 // match: (Geq16 x y) 13571 // cond: 13572 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 13573 for { 13574 x := v.Args[0] 13575 y := v.Args[1] 13576 v.reset(OpARMGreaterEqual) 13577 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13578 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13579 v1.AddArg(x) 13580 v0.AddArg(v1) 13581 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13582 v2.AddArg(y) 13583 v0.AddArg(v2) 13584 v.AddArg(v0) 13585 return true 13586 } 13587 } 13588 func rewriteValueARM_OpGeq16U(v *Value, config *Config) bool { 13589 b := v.Block 13590 _ = b 13591 // match: (Geq16U x y) 13592 // cond: 13593 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13594 for { 13595 x := v.Args[0] 13596 y := v.Args[1] 13597 v.reset(OpARMGreaterEqualU) 13598 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13599 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13600 v1.AddArg(x) 13601 v0.AddArg(v1) 13602 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13603 v2.AddArg(y) 13604 v0.AddArg(v2) 13605 v.AddArg(v0) 13606 return true 13607 } 13608 } 13609 func rewriteValueARM_OpGeq32(v *Value, config *Config) bool { 13610 b := v.Block 13611 _ = b 13612 // match: (Geq32 x y) 13613 // cond: 13614 // result: (GreaterEqual (CMP x y)) 13615 for { 13616 x := v.Args[0] 13617 y := v.Args[1] 13618 v.reset(OpARMGreaterEqual) 13619 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13620 v0.AddArg(x) 13621 v0.AddArg(y) 13622 v.AddArg(v0) 13623 return true 13624 } 13625 } 13626 func rewriteValueARM_OpGeq32F(v *Value, config *Config) bool { 13627 b := v.Block 13628 _ = b 13629 // match: (Geq32F x y) 13630 // cond: 13631 // result: (GreaterEqual (CMPF x y)) 13632 for { 13633 x := v.Args[0] 13634 y := v.Args[1] 13635 v.reset(OpARMGreaterEqual) 13636 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 13637 v0.AddArg(x) 13638 v0.AddArg(y) 13639 v.AddArg(v0) 13640 return true 13641 } 13642 } 13643 func rewriteValueARM_OpGeq32U(v *Value, config *Config) bool { 13644 b := v.Block 13645 _ = b 13646 // match: (Geq32U x y) 13647 // cond: 13648 // result: (GreaterEqualU (CMP x y)) 13649 for { 13650 x := v.Args[0] 13651 y := v.Args[1] 13652 v.reset(OpARMGreaterEqualU) 13653 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13654 v0.AddArg(x) 13655 v0.AddArg(y) 13656 v.AddArg(v0) 13657 return true 13658 } 13659 } 13660 func rewriteValueARM_OpGeq64F(v *Value, config *Config) bool { 13661 b := v.Block 13662 _ = b 13663 // match: (Geq64F x y) 13664 // cond: 13665 // result: (GreaterEqual (CMPD x y)) 13666 for { 13667 x := v.Args[0] 13668 y := v.Args[1] 13669 v.reset(OpARMGreaterEqual) 13670 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 13671 v0.AddArg(x) 13672 v0.AddArg(y) 13673 v.AddArg(v0) 13674 return true 13675 } 13676 } 13677 func rewriteValueARM_OpGeq8(v *Value, config *Config) bool { 13678 b := v.Block 13679 _ = b 13680 // match: (Geq8 x y) 13681 // cond: 13682 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 13683 for { 13684 x := v.Args[0] 13685 y := v.Args[1] 13686 v.reset(OpARMGreaterEqual) 13687 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13688 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13689 v1.AddArg(x) 13690 v0.AddArg(v1) 13691 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13692 v2.AddArg(y) 13693 v0.AddArg(v2) 13694 v.AddArg(v0) 13695 return true 13696 } 13697 } 13698 func rewriteValueARM_OpGeq8U(v *Value, config *Config) bool { 13699 b := v.Block 13700 _ = b 13701 // match: (Geq8U x y) 13702 // cond: 13703 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13704 for { 13705 x := v.Args[0] 13706 y := v.Args[1] 13707 v.reset(OpARMGreaterEqualU) 13708 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13709 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13710 v1.AddArg(x) 13711 v0.AddArg(v1) 13712 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13713 v2.AddArg(y) 13714 v0.AddArg(v2) 13715 v.AddArg(v0) 13716 return true 13717 } 13718 } 13719 func rewriteValueARM_OpGetClosurePtr(v *Value, config *Config) bool { 13720 b := v.Block 13721 _ = b 13722 // match: (GetClosurePtr) 13723 // cond: 13724 // result: (LoweredGetClosurePtr) 13725 for { 13726 v.reset(OpARMLoweredGetClosurePtr) 13727 return true 13728 } 13729 } 13730 func rewriteValueARM_OpGoCall(v *Value, config *Config) bool { 13731 b := v.Block 13732 _ = b 13733 // match: (GoCall [argwid] mem) 13734 // cond: 13735 // result: (CALLgo [argwid] mem) 13736 for { 13737 argwid := v.AuxInt 13738 mem := v.Args[0] 13739 v.reset(OpARMCALLgo) 13740 v.AuxInt = argwid 13741 v.AddArg(mem) 13742 return true 13743 } 13744 } 13745 func rewriteValueARM_OpGreater16(v *Value, config *Config) bool { 13746 b := v.Block 13747 _ = b 13748 // match: (Greater16 x y) 13749 // cond: 13750 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 13751 for { 13752 x := v.Args[0] 13753 y := v.Args[1] 13754 v.reset(OpARMGreaterThan) 13755 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13756 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13757 v1.AddArg(x) 13758 v0.AddArg(v1) 13759 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13760 v2.AddArg(y) 13761 v0.AddArg(v2) 13762 v.AddArg(v0) 13763 return true 13764 } 13765 } 13766 func rewriteValueARM_OpGreater16U(v *Value, config *Config) bool { 13767 b := v.Block 13768 _ = b 13769 // match: (Greater16U x y) 13770 // cond: 13771 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13772 for { 13773 x := v.Args[0] 13774 y := v.Args[1] 13775 v.reset(OpARMGreaterThanU) 13776 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13777 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13778 v1.AddArg(x) 13779 v0.AddArg(v1) 13780 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13781 v2.AddArg(y) 13782 v0.AddArg(v2) 13783 v.AddArg(v0) 13784 return true 13785 } 13786 } 13787 func rewriteValueARM_OpGreater32(v *Value, config *Config) bool { 13788 b := v.Block 13789 _ = b 13790 // match: (Greater32 x y) 13791 // cond: 13792 // result: (GreaterThan (CMP x y)) 13793 for { 13794 x := v.Args[0] 13795 y := v.Args[1] 13796 v.reset(OpARMGreaterThan) 13797 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13798 v0.AddArg(x) 13799 v0.AddArg(y) 13800 v.AddArg(v0) 13801 return true 13802 } 13803 } 13804 func rewriteValueARM_OpGreater32F(v *Value, config *Config) bool { 13805 b := v.Block 13806 _ = b 13807 // match: (Greater32F x y) 13808 // cond: 13809 // result: (GreaterThan (CMPF x y)) 13810 for { 13811 x := v.Args[0] 13812 y := v.Args[1] 13813 v.reset(OpARMGreaterThan) 13814 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 13815 v0.AddArg(x) 13816 v0.AddArg(y) 13817 v.AddArg(v0) 13818 return true 13819 } 13820 } 13821 func rewriteValueARM_OpGreater32U(v *Value, config *Config) bool { 13822 b := v.Block 13823 _ = b 13824 // match: (Greater32U x y) 13825 // cond: 13826 // result: (GreaterThanU (CMP x y)) 13827 for { 13828 x := v.Args[0] 13829 y := v.Args[1] 13830 v.reset(OpARMGreaterThanU) 13831 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13832 v0.AddArg(x) 13833 v0.AddArg(y) 13834 v.AddArg(v0) 13835 return true 13836 } 13837 } 13838 func rewriteValueARM_OpGreater64F(v *Value, config *Config) bool { 13839 b := v.Block 13840 _ = b 13841 // match: (Greater64F x y) 13842 // cond: 13843 // result: (GreaterThan (CMPD x y)) 13844 for { 13845 x := v.Args[0] 13846 y := v.Args[1] 13847 v.reset(OpARMGreaterThan) 13848 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 13849 v0.AddArg(x) 13850 v0.AddArg(y) 13851 v.AddArg(v0) 13852 return true 13853 } 13854 } 13855 func rewriteValueARM_OpGreater8(v *Value, config *Config) bool { 13856 b := v.Block 13857 _ = b 13858 // match: (Greater8 x y) 13859 // cond: 13860 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 13861 for { 13862 x := v.Args[0] 13863 y := v.Args[1] 13864 v.reset(OpARMGreaterThan) 13865 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13866 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13867 v1.AddArg(x) 13868 v0.AddArg(v1) 13869 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13870 v2.AddArg(y) 13871 v0.AddArg(v2) 13872 v.AddArg(v0) 13873 return true 13874 } 13875 } 13876 func rewriteValueARM_OpGreater8U(v *Value, config *Config) bool { 13877 b := v.Block 13878 _ = b 13879 // match: (Greater8U x y) 13880 // cond: 13881 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13882 for { 13883 x := v.Args[0] 13884 y := v.Args[1] 13885 v.reset(OpARMGreaterThanU) 13886 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 13887 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13888 v1.AddArg(x) 13889 v0.AddArg(v1) 13890 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 13891 v2.AddArg(y) 13892 v0.AddArg(v2) 13893 v.AddArg(v0) 13894 return true 13895 } 13896 } 13897 func rewriteValueARM_OpHmul16(v *Value, config *Config) bool { 13898 b := v.Block 13899 _ = b 13900 // match: (Hmul16 x y) 13901 // cond: 13902 // result: (SRAconst (MUL <config.fe.TypeInt32()> (SignExt16to32 x) (SignExt16to32 y)) [16]) 13903 for { 13904 x := v.Args[0] 13905 y := v.Args[1] 13906 v.reset(OpARMSRAconst) 13907 v.AuxInt = 16 13908 v0 := b.NewValue0(v.Line, OpARMMUL, config.fe.TypeInt32()) 13909 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13910 v1.AddArg(x) 13911 v0.AddArg(v1) 13912 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 13913 v2.AddArg(y) 13914 v0.AddArg(v2) 13915 v.AddArg(v0) 13916 return true 13917 } 13918 } 13919 func rewriteValueARM_OpHmul16u(v *Value, config *Config) bool { 13920 b := v.Block 13921 _ = b 13922 // match: (Hmul16u x y) 13923 // cond: 13924 // result: (SRLconst (MUL <config.fe.TypeUInt32()> (ZeroExt16to32 x) (ZeroExt16to32 y)) [16]) 13925 for { 13926 x := v.Args[0] 13927 y := v.Args[1] 13928 v.reset(OpARMSRLconst) 13929 v.AuxInt = 16 13930 v0 := b.NewValue0(v.Line, OpARMMUL, config.fe.TypeUInt32()) 13931 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13932 v1.AddArg(x) 13933 v0.AddArg(v1) 13934 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 13935 v2.AddArg(y) 13936 v0.AddArg(v2) 13937 v.AddArg(v0) 13938 return true 13939 } 13940 } 13941 func rewriteValueARM_OpHmul32(v *Value, config *Config) bool { 13942 b := v.Block 13943 _ = b 13944 // match: (Hmul32 x y) 13945 // cond: 13946 // result: (HMUL x y) 13947 for { 13948 x := v.Args[0] 13949 y := v.Args[1] 13950 v.reset(OpARMHMUL) 13951 v.AddArg(x) 13952 v.AddArg(y) 13953 return true 13954 } 13955 } 13956 func rewriteValueARM_OpHmul32u(v *Value, config *Config) bool { 13957 b := v.Block 13958 _ = b 13959 // match: (Hmul32u x y) 13960 // cond: 13961 // result: (HMULU x y) 13962 for { 13963 x := v.Args[0] 13964 y := v.Args[1] 13965 v.reset(OpARMHMULU) 13966 v.AddArg(x) 13967 v.AddArg(y) 13968 return true 13969 } 13970 } 13971 func rewriteValueARM_OpHmul8(v *Value, config *Config) bool { 13972 b := v.Block 13973 _ = b 13974 // match: (Hmul8 x y) 13975 // cond: 13976 // result: (SRAconst (MUL <config.fe.TypeInt16()> (SignExt8to32 x) (SignExt8to32 y)) [8]) 13977 for { 13978 x := v.Args[0] 13979 y := v.Args[1] 13980 v.reset(OpARMSRAconst) 13981 v.AuxInt = 8 13982 v0 := b.NewValue0(v.Line, OpARMMUL, config.fe.TypeInt16()) 13983 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13984 v1.AddArg(x) 13985 v0.AddArg(v1) 13986 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 13987 v2.AddArg(y) 13988 v0.AddArg(v2) 13989 v.AddArg(v0) 13990 return true 13991 } 13992 } 13993 func rewriteValueARM_OpHmul8u(v *Value, config *Config) bool { 13994 b := v.Block 13995 _ = b 13996 // match: (Hmul8u x y) 13997 // cond: 13998 // result: (SRLconst (MUL <config.fe.TypeUInt16()> (ZeroExt8to32 x) (ZeroExt8to32 y)) [8]) 13999 for { 14000 x := v.Args[0] 14001 y := v.Args[1] 14002 v.reset(OpARMSRLconst) 14003 v.AuxInt = 8 14004 v0 := b.NewValue0(v.Line, OpARMMUL, config.fe.TypeUInt16()) 14005 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14006 v1.AddArg(x) 14007 v0.AddArg(v1) 14008 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14009 v2.AddArg(y) 14010 v0.AddArg(v2) 14011 v.AddArg(v0) 14012 return true 14013 } 14014 } 14015 func rewriteValueARM_OpInterCall(v *Value, config *Config) bool { 14016 b := v.Block 14017 _ = b 14018 // match: (InterCall [argwid] entry mem) 14019 // cond: 14020 // result: (CALLinter [argwid] entry mem) 14021 for { 14022 argwid := v.AuxInt 14023 entry := v.Args[0] 14024 mem := v.Args[1] 14025 v.reset(OpARMCALLinter) 14026 v.AuxInt = argwid 14027 v.AddArg(entry) 14028 v.AddArg(mem) 14029 return true 14030 } 14031 } 14032 func rewriteValueARM_OpIsInBounds(v *Value, config *Config) bool { 14033 b := v.Block 14034 _ = b 14035 // match: (IsInBounds idx len) 14036 // cond: 14037 // result: (LessThanU (CMP idx len)) 14038 for { 14039 idx := v.Args[0] 14040 len := v.Args[1] 14041 v.reset(OpARMLessThanU) 14042 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14043 v0.AddArg(idx) 14044 v0.AddArg(len) 14045 v.AddArg(v0) 14046 return true 14047 } 14048 } 14049 func rewriteValueARM_OpIsNonNil(v *Value, config *Config) bool { 14050 b := v.Block 14051 _ = b 14052 // match: (IsNonNil ptr) 14053 // cond: 14054 // result: (NotEqual (CMPconst [0] ptr)) 14055 for { 14056 ptr := v.Args[0] 14057 v.reset(OpARMNotEqual) 14058 v0 := b.NewValue0(v.Line, OpARMCMPconst, TypeFlags) 14059 v0.AuxInt = 0 14060 v0.AddArg(ptr) 14061 v.AddArg(v0) 14062 return true 14063 } 14064 } 14065 func rewriteValueARM_OpIsSliceInBounds(v *Value, config *Config) bool { 14066 b := v.Block 14067 _ = b 14068 // match: (IsSliceInBounds idx len) 14069 // cond: 14070 // result: (LessEqualU (CMP idx len)) 14071 for { 14072 idx := v.Args[0] 14073 len := v.Args[1] 14074 v.reset(OpARMLessEqualU) 14075 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14076 v0.AddArg(idx) 14077 v0.AddArg(len) 14078 v.AddArg(v0) 14079 return true 14080 } 14081 } 14082 func rewriteValueARM_OpLeq16(v *Value, config *Config) bool { 14083 b := v.Block 14084 _ = b 14085 // match: (Leq16 x y) 14086 // cond: 14087 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 14088 for { 14089 x := v.Args[0] 14090 y := v.Args[1] 14091 v.reset(OpARMLessEqual) 14092 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14093 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14094 v1.AddArg(x) 14095 v0.AddArg(v1) 14096 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14097 v2.AddArg(y) 14098 v0.AddArg(v2) 14099 v.AddArg(v0) 14100 return true 14101 } 14102 } 14103 func rewriteValueARM_OpLeq16U(v *Value, config *Config) bool { 14104 b := v.Block 14105 _ = b 14106 // match: (Leq16U x y) 14107 // cond: 14108 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14109 for { 14110 x := v.Args[0] 14111 y := v.Args[1] 14112 v.reset(OpARMLessEqualU) 14113 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14114 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14115 v1.AddArg(x) 14116 v0.AddArg(v1) 14117 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14118 v2.AddArg(y) 14119 v0.AddArg(v2) 14120 v.AddArg(v0) 14121 return true 14122 } 14123 } 14124 func rewriteValueARM_OpLeq32(v *Value, config *Config) bool { 14125 b := v.Block 14126 _ = b 14127 // match: (Leq32 x y) 14128 // cond: 14129 // result: (LessEqual (CMP x y)) 14130 for { 14131 x := v.Args[0] 14132 y := v.Args[1] 14133 v.reset(OpARMLessEqual) 14134 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14135 v0.AddArg(x) 14136 v0.AddArg(y) 14137 v.AddArg(v0) 14138 return true 14139 } 14140 } 14141 func rewriteValueARM_OpLeq32F(v *Value, config *Config) bool { 14142 b := v.Block 14143 _ = b 14144 // match: (Leq32F x y) 14145 // cond: 14146 // result: (GreaterEqual (CMPF y x)) 14147 for { 14148 x := v.Args[0] 14149 y := v.Args[1] 14150 v.reset(OpARMGreaterEqual) 14151 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 14152 v0.AddArg(y) 14153 v0.AddArg(x) 14154 v.AddArg(v0) 14155 return true 14156 } 14157 } 14158 func rewriteValueARM_OpLeq32U(v *Value, config *Config) bool { 14159 b := v.Block 14160 _ = b 14161 // match: (Leq32U x y) 14162 // cond: 14163 // result: (LessEqualU (CMP x y)) 14164 for { 14165 x := v.Args[0] 14166 y := v.Args[1] 14167 v.reset(OpARMLessEqualU) 14168 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14169 v0.AddArg(x) 14170 v0.AddArg(y) 14171 v.AddArg(v0) 14172 return true 14173 } 14174 } 14175 func rewriteValueARM_OpLeq64F(v *Value, config *Config) bool { 14176 b := v.Block 14177 _ = b 14178 // match: (Leq64F x y) 14179 // cond: 14180 // result: (GreaterEqual (CMPD y x)) 14181 for { 14182 x := v.Args[0] 14183 y := v.Args[1] 14184 v.reset(OpARMGreaterEqual) 14185 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 14186 v0.AddArg(y) 14187 v0.AddArg(x) 14188 v.AddArg(v0) 14189 return true 14190 } 14191 } 14192 func rewriteValueARM_OpLeq8(v *Value, config *Config) bool { 14193 b := v.Block 14194 _ = b 14195 // match: (Leq8 x y) 14196 // cond: 14197 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 14198 for { 14199 x := v.Args[0] 14200 y := v.Args[1] 14201 v.reset(OpARMLessEqual) 14202 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14203 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 14204 v1.AddArg(x) 14205 v0.AddArg(v1) 14206 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 14207 v2.AddArg(y) 14208 v0.AddArg(v2) 14209 v.AddArg(v0) 14210 return true 14211 } 14212 } 14213 func rewriteValueARM_OpLeq8U(v *Value, config *Config) bool { 14214 b := v.Block 14215 _ = b 14216 // match: (Leq8U x y) 14217 // cond: 14218 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14219 for { 14220 x := v.Args[0] 14221 y := v.Args[1] 14222 v.reset(OpARMLessEqualU) 14223 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14224 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14225 v1.AddArg(x) 14226 v0.AddArg(v1) 14227 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14228 v2.AddArg(y) 14229 v0.AddArg(v2) 14230 v.AddArg(v0) 14231 return true 14232 } 14233 } 14234 func rewriteValueARM_OpLess16(v *Value, config *Config) bool { 14235 b := v.Block 14236 _ = b 14237 // match: (Less16 x y) 14238 // cond: 14239 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 14240 for { 14241 x := v.Args[0] 14242 y := v.Args[1] 14243 v.reset(OpARMLessThan) 14244 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14245 v1 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14246 v1.AddArg(x) 14247 v0.AddArg(v1) 14248 v2 := b.NewValue0(v.Line, OpSignExt16to32, config.fe.TypeInt32()) 14249 v2.AddArg(y) 14250 v0.AddArg(v2) 14251 v.AddArg(v0) 14252 return true 14253 } 14254 } 14255 func rewriteValueARM_OpLess16U(v *Value, config *Config) bool { 14256 b := v.Block 14257 _ = b 14258 // match: (Less16U x y) 14259 // cond: 14260 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14261 for { 14262 x := v.Args[0] 14263 y := v.Args[1] 14264 v.reset(OpARMLessThanU) 14265 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14266 v1 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14267 v1.AddArg(x) 14268 v0.AddArg(v1) 14269 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14270 v2.AddArg(y) 14271 v0.AddArg(v2) 14272 v.AddArg(v0) 14273 return true 14274 } 14275 } 14276 func rewriteValueARM_OpLess32(v *Value, config *Config) bool { 14277 b := v.Block 14278 _ = b 14279 // match: (Less32 x y) 14280 // cond: 14281 // result: (LessThan (CMP x y)) 14282 for { 14283 x := v.Args[0] 14284 y := v.Args[1] 14285 v.reset(OpARMLessThan) 14286 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14287 v0.AddArg(x) 14288 v0.AddArg(y) 14289 v.AddArg(v0) 14290 return true 14291 } 14292 } 14293 func rewriteValueARM_OpLess32F(v *Value, config *Config) bool { 14294 b := v.Block 14295 _ = b 14296 // match: (Less32F x y) 14297 // cond: 14298 // result: (GreaterThan (CMPF y x)) 14299 for { 14300 x := v.Args[0] 14301 y := v.Args[1] 14302 v.reset(OpARMGreaterThan) 14303 v0 := b.NewValue0(v.Line, OpARMCMPF, TypeFlags) 14304 v0.AddArg(y) 14305 v0.AddArg(x) 14306 v.AddArg(v0) 14307 return true 14308 } 14309 } 14310 func rewriteValueARM_OpLess32U(v *Value, config *Config) bool { 14311 b := v.Block 14312 _ = b 14313 // match: (Less32U x y) 14314 // cond: 14315 // result: (LessThanU (CMP x y)) 14316 for { 14317 x := v.Args[0] 14318 y := v.Args[1] 14319 v.reset(OpARMLessThanU) 14320 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14321 v0.AddArg(x) 14322 v0.AddArg(y) 14323 v.AddArg(v0) 14324 return true 14325 } 14326 } 14327 func rewriteValueARM_OpLess64F(v *Value, config *Config) bool { 14328 b := v.Block 14329 _ = b 14330 // match: (Less64F x y) 14331 // cond: 14332 // result: (GreaterThan (CMPD y x)) 14333 for { 14334 x := v.Args[0] 14335 y := v.Args[1] 14336 v.reset(OpARMGreaterThan) 14337 v0 := b.NewValue0(v.Line, OpARMCMPD, TypeFlags) 14338 v0.AddArg(y) 14339 v0.AddArg(x) 14340 v.AddArg(v0) 14341 return true 14342 } 14343 } 14344 func rewriteValueARM_OpLess8(v *Value, config *Config) bool { 14345 b := v.Block 14346 _ = b 14347 // match: (Less8 x y) 14348 // cond: 14349 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 14350 for { 14351 x := v.Args[0] 14352 y := v.Args[1] 14353 v.reset(OpARMLessThan) 14354 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14355 v1 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 14356 v1.AddArg(x) 14357 v0.AddArg(v1) 14358 v2 := b.NewValue0(v.Line, OpSignExt8to32, config.fe.TypeInt32()) 14359 v2.AddArg(y) 14360 v0.AddArg(v2) 14361 v.AddArg(v0) 14362 return true 14363 } 14364 } 14365 func rewriteValueARM_OpLess8U(v *Value, config *Config) bool { 14366 b := v.Block 14367 _ = b 14368 // match: (Less8U x y) 14369 // cond: 14370 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14371 for { 14372 x := v.Args[0] 14373 y := v.Args[1] 14374 v.reset(OpARMLessThanU) 14375 v0 := b.NewValue0(v.Line, OpARMCMP, TypeFlags) 14376 v1 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14377 v1.AddArg(x) 14378 v0.AddArg(v1) 14379 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14380 v2.AddArg(y) 14381 v0.AddArg(v2) 14382 v.AddArg(v0) 14383 return true 14384 } 14385 } 14386 func rewriteValueARM_OpLoad(v *Value, config *Config) bool { 14387 b := v.Block 14388 _ = b 14389 // match: (Load <t> ptr mem) 14390 // cond: t.IsBoolean() 14391 // result: (MOVBUload ptr mem) 14392 for { 14393 t := v.Type 14394 ptr := v.Args[0] 14395 mem := v.Args[1] 14396 if !(t.IsBoolean()) { 14397 break 14398 } 14399 v.reset(OpARMMOVBUload) 14400 v.AddArg(ptr) 14401 v.AddArg(mem) 14402 return true 14403 } 14404 // match: (Load <t> ptr mem) 14405 // cond: (is8BitInt(t) && isSigned(t)) 14406 // result: (MOVBload ptr mem) 14407 for { 14408 t := v.Type 14409 ptr := v.Args[0] 14410 mem := v.Args[1] 14411 if !(is8BitInt(t) && isSigned(t)) { 14412 break 14413 } 14414 v.reset(OpARMMOVBload) 14415 v.AddArg(ptr) 14416 v.AddArg(mem) 14417 return true 14418 } 14419 // match: (Load <t> ptr mem) 14420 // cond: (is8BitInt(t) && !isSigned(t)) 14421 // result: (MOVBUload ptr mem) 14422 for { 14423 t := v.Type 14424 ptr := v.Args[0] 14425 mem := v.Args[1] 14426 if !(is8BitInt(t) && !isSigned(t)) { 14427 break 14428 } 14429 v.reset(OpARMMOVBUload) 14430 v.AddArg(ptr) 14431 v.AddArg(mem) 14432 return true 14433 } 14434 // match: (Load <t> ptr mem) 14435 // cond: (is16BitInt(t) && isSigned(t)) 14436 // result: (MOVHload ptr mem) 14437 for { 14438 t := v.Type 14439 ptr := v.Args[0] 14440 mem := v.Args[1] 14441 if !(is16BitInt(t) && isSigned(t)) { 14442 break 14443 } 14444 v.reset(OpARMMOVHload) 14445 v.AddArg(ptr) 14446 v.AddArg(mem) 14447 return true 14448 } 14449 // match: (Load <t> ptr mem) 14450 // cond: (is16BitInt(t) && !isSigned(t)) 14451 // result: (MOVHUload ptr mem) 14452 for { 14453 t := v.Type 14454 ptr := v.Args[0] 14455 mem := v.Args[1] 14456 if !(is16BitInt(t) && !isSigned(t)) { 14457 break 14458 } 14459 v.reset(OpARMMOVHUload) 14460 v.AddArg(ptr) 14461 v.AddArg(mem) 14462 return true 14463 } 14464 // match: (Load <t> ptr mem) 14465 // cond: (is32BitInt(t) || isPtr(t)) 14466 // result: (MOVWload ptr mem) 14467 for { 14468 t := v.Type 14469 ptr := v.Args[0] 14470 mem := v.Args[1] 14471 if !(is32BitInt(t) || isPtr(t)) { 14472 break 14473 } 14474 v.reset(OpARMMOVWload) 14475 v.AddArg(ptr) 14476 v.AddArg(mem) 14477 return true 14478 } 14479 // match: (Load <t> ptr mem) 14480 // cond: is32BitFloat(t) 14481 // result: (MOVFload ptr mem) 14482 for { 14483 t := v.Type 14484 ptr := v.Args[0] 14485 mem := v.Args[1] 14486 if !(is32BitFloat(t)) { 14487 break 14488 } 14489 v.reset(OpARMMOVFload) 14490 v.AddArg(ptr) 14491 v.AddArg(mem) 14492 return true 14493 } 14494 // match: (Load <t> ptr mem) 14495 // cond: is64BitFloat(t) 14496 // result: (MOVDload ptr mem) 14497 for { 14498 t := v.Type 14499 ptr := v.Args[0] 14500 mem := v.Args[1] 14501 if !(is64BitFloat(t)) { 14502 break 14503 } 14504 v.reset(OpARMMOVDload) 14505 v.AddArg(ptr) 14506 v.AddArg(mem) 14507 return true 14508 } 14509 return false 14510 } 14511 func rewriteValueARM_OpLrot16(v *Value, config *Config) bool { 14512 b := v.Block 14513 _ = b 14514 // match: (Lrot16 <t> x [c]) 14515 // cond: 14516 // result: (OR (SLLconst <t> x [c&15]) (SRLconst <t> (ZeroExt16to32 x) [16-c&15])) 14517 for { 14518 t := v.Type 14519 c := v.AuxInt 14520 x := v.Args[0] 14521 v.reset(OpARMOR) 14522 v0 := b.NewValue0(v.Line, OpARMSLLconst, t) 14523 v0.AuxInt = c & 15 14524 v0.AddArg(x) 14525 v.AddArg(v0) 14526 v1 := b.NewValue0(v.Line, OpARMSRLconst, t) 14527 v1.AuxInt = 16 - c&15 14528 v2 := b.NewValue0(v.Line, OpZeroExt16to32, config.fe.TypeUInt32()) 14529 v2.AddArg(x) 14530 v1.AddArg(v2) 14531 v.AddArg(v1) 14532 return true 14533 } 14534 } 14535 func rewriteValueARM_OpLrot32(v *Value, config *Config) bool { 14536 b := v.Block 14537 _ = b 14538 // match: (Lrot32 x [c]) 14539 // cond: 14540 // result: (SRRconst x [32-c&31]) 14541 for { 14542 c := v.AuxInt 14543 x := v.Args[0] 14544 v.reset(OpARMSRRconst) 14545 v.AuxInt = 32 - c&31 14546 v.AddArg(x) 14547 return true 14548 } 14549 } 14550 func rewriteValueARM_OpLrot8(v *Value, config *Config) bool { 14551 b := v.Block 14552 _ = b 14553 // match: (Lrot8 <t> x [c]) 14554 // cond: 14555 // result: (OR (SLLconst <t> x [c&7]) (SRLconst <t> (ZeroExt8to32 x) [8-c&7])) 14556 for { 14557 t := v.Type 14558 c := v.AuxInt 14559 x := v.Args[0] 14560 v.reset(OpARMOR) 14561 v0 := b.NewValue0(v.Line, OpARMSLLconst, t) 14562 v0.AuxInt = c & 7 14563 v0.AddArg(x) 14564 v.AddArg(v0) 14565 v1 := b.NewValue0(v.Line, OpARMSRLconst, t) 14566 v1.AuxInt = 8 - c&7 14567 v2 := b.NewValue0(v.Line, OpZeroExt8to32, config.fe.TypeUInt32()) 14568 v2.AddArg(x) 14569 v1.AddArg(v2) 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 }