github.com/slayercat/go@v0.0.0-20170428012452-c51559813f61/src/cmd/compile/internal/ssa/rewriteARM.go (about) 1 // Code generated from gen/ARM.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 10 var _ = math.MinInt8 // in case not otherwise used 11 var _ = obj.ANOP // in case not otherwise used 12 var _ = objabi.GOROOT // in case not otherwise used 13 14 func rewriteValueARM(v *Value) bool { 15 switch v.Op { 16 case OpARMADC: 17 return rewriteValueARM_OpARMADC_0(v) || rewriteValueARM_OpARMADC_10(v) || rewriteValueARM_OpARMADC_20(v) 18 case OpARMADCconst: 19 return rewriteValueARM_OpARMADCconst_0(v) 20 case OpARMADCshiftLL: 21 return rewriteValueARM_OpARMADCshiftLL_0(v) 22 case OpARMADCshiftLLreg: 23 return rewriteValueARM_OpARMADCshiftLLreg_0(v) 24 case OpARMADCshiftRA: 25 return rewriteValueARM_OpARMADCshiftRA_0(v) 26 case OpARMADCshiftRAreg: 27 return rewriteValueARM_OpARMADCshiftRAreg_0(v) 28 case OpARMADCshiftRL: 29 return rewriteValueARM_OpARMADCshiftRL_0(v) 30 case OpARMADCshiftRLreg: 31 return rewriteValueARM_OpARMADCshiftRLreg_0(v) 32 case OpARMADD: 33 return rewriteValueARM_OpARMADD_0(v) || rewriteValueARM_OpARMADD_10(v) 34 case OpARMADDS: 35 return rewriteValueARM_OpARMADDS_0(v) || rewriteValueARM_OpARMADDS_10(v) 36 case OpARMADDSshiftLL: 37 return rewriteValueARM_OpARMADDSshiftLL_0(v) 38 case OpARMADDSshiftLLreg: 39 return rewriteValueARM_OpARMADDSshiftLLreg_0(v) 40 case OpARMADDSshiftRA: 41 return rewriteValueARM_OpARMADDSshiftRA_0(v) 42 case OpARMADDSshiftRAreg: 43 return rewriteValueARM_OpARMADDSshiftRAreg_0(v) 44 case OpARMADDSshiftRL: 45 return rewriteValueARM_OpARMADDSshiftRL_0(v) 46 case OpARMADDSshiftRLreg: 47 return rewriteValueARM_OpARMADDSshiftRLreg_0(v) 48 case OpARMADDconst: 49 return rewriteValueARM_OpARMADDconst_0(v) 50 case OpARMADDshiftLL: 51 return rewriteValueARM_OpARMADDshiftLL_0(v) 52 case OpARMADDshiftLLreg: 53 return rewriteValueARM_OpARMADDshiftLLreg_0(v) 54 case OpARMADDshiftRA: 55 return rewriteValueARM_OpARMADDshiftRA_0(v) 56 case OpARMADDshiftRAreg: 57 return rewriteValueARM_OpARMADDshiftRAreg_0(v) 58 case OpARMADDshiftRL: 59 return rewriteValueARM_OpARMADDshiftRL_0(v) 60 case OpARMADDshiftRLreg: 61 return rewriteValueARM_OpARMADDshiftRLreg_0(v) 62 case OpARMAND: 63 return rewriteValueARM_OpARMAND_0(v) || rewriteValueARM_OpARMAND_10(v) || rewriteValueARM_OpARMAND_20(v) 64 case OpARMANDconst: 65 return rewriteValueARM_OpARMANDconst_0(v) 66 case OpARMANDshiftLL: 67 return rewriteValueARM_OpARMANDshiftLL_0(v) 68 case OpARMANDshiftLLreg: 69 return rewriteValueARM_OpARMANDshiftLLreg_0(v) 70 case OpARMANDshiftRA: 71 return rewriteValueARM_OpARMANDshiftRA_0(v) 72 case OpARMANDshiftRAreg: 73 return rewriteValueARM_OpARMANDshiftRAreg_0(v) 74 case OpARMANDshiftRL: 75 return rewriteValueARM_OpARMANDshiftRL_0(v) 76 case OpARMANDshiftRLreg: 77 return rewriteValueARM_OpARMANDshiftRLreg_0(v) 78 case OpARMBIC: 79 return rewriteValueARM_OpARMBIC_0(v) 80 case OpARMBICconst: 81 return rewriteValueARM_OpARMBICconst_0(v) 82 case OpARMBICshiftLL: 83 return rewriteValueARM_OpARMBICshiftLL_0(v) 84 case OpARMBICshiftLLreg: 85 return rewriteValueARM_OpARMBICshiftLLreg_0(v) 86 case OpARMBICshiftRA: 87 return rewriteValueARM_OpARMBICshiftRA_0(v) 88 case OpARMBICshiftRAreg: 89 return rewriteValueARM_OpARMBICshiftRAreg_0(v) 90 case OpARMBICshiftRL: 91 return rewriteValueARM_OpARMBICshiftRL_0(v) 92 case OpARMBICshiftRLreg: 93 return rewriteValueARM_OpARMBICshiftRLreg_0(v) 94 case OpARMCMOVWHSconst: 95 return rewriteValueARM_OpARMCMOVWHSconst_0(v) 96 case OpARMCMOVWLSconst: 97 return rewriteValueARM_OpARMCMOVWLSconst_0(v) 98 case OpARMCMP: 99 return rewriteValueARM_OpARMCMP_0(v) || rewriteValueARM_OpARMCMP_10(v) 100 case OpARMCMPD: 101 return rewriteValueARM_OpARMCMPD_0(v) 102 case OpARMCMPF: 103 return rewriteValueARM_OpARMCMPF_0(v) 104 case OpARMCMPconst: 105 return rewriteValueARM_OpARMCMPconst_0(v) 106 case OpARMCMPshiftLL: 107 return rewriteValueARM_OpARMCMPshiftLL_0(v) 108 case OpARMCMPshiftLLreg: 109 return rewriteValueARM_OpARMCMPshiftLLreg_0(v) 110 case OpARMCMPshiftRA: 111 return rewriteValueARM_OpARMCMPshiftRA_0(v) 112 case OpARMCMPshiftRAreg: 113 return rewriteValueARM_OpARMCMPshiftRAreg_0(v) 114 case OpARMCMPshiftRL: 115 return rewriteValueARM_OpARMCMPshiftRL_0(v) 116 case OpARMCMPshiftRLreg: 117 return rewriteValueARM_OpARMCMPshiftRLreg_0(v) 118 case OpARMEqual: 119 return rewriteValueARM_OpARMEqual_0(v) 120 case OpARMGreaterEqual: 121 return rewriteValueARM_OpARMGreaterEqual_0(v) 122 case OpARMGreaterEqualU: 123 return rewriteValueARM_OpARMGreaterEqualU_0(v) 124 case OpARMGreaterThan: 125 return rewriteValueARM_OpARMGreaterThan_0(v) 126 case OpARMGreaterThanU: 127 return rewriteValueARM_OpARMGreaterThanU_0(v) 128 case OpARMLessEqual: 129 return rewriteValueARM_OpARMLessEqual_0(v) 130 case OpARMLessEqualU: 131 return rewriteValueARM_OpARMLessEqualU_0(v) 132 case OpARMLessThan: 133 return rewriteValueARM_OpARMLessThan_0(v) 134 case OpARMLessThanU: 135 return rewriteValueARM_OpARMLessThanU_0(v) 136 case OpARMMOVBUload: 137 return rewriteValueARM_OpARMMOVBUload_0(v) 138 case OpARMMOVBUreg: 139 return rewriteValueARM_OpARMMOVBUreg_0(v) 140 case OpARMMOVBload: 141 return rewriteValueARM_OpARMMOVBload_0(v) 142 case OpARMMOVBreg: 143 return rewriteValueARM_OpARMMOVBreg_0(v) 144 case OpARMMOVBstore: 145 return rewriteValueARM_OpARMMOVBstore_0(v) 146 case OpARMMOVDload: 147 return rewriteValueARM_OpARMMOVDload_0(v) 148 case OpARMMOVDstore: 149 return rewriteValueARM_OpARMMOVDstore_0(v) 150 case OpARMMOVFload: 151 return rewriteValueARM_OpARMMOVFload_0(v) 152 case OpARMMOVFstore: 153 return rewriteValueARM_OpARMMOVFstore_0(v) 154 case OpARMMOVHUload: 155 return rewriteValueARM_OpARMMOVHUload_0(v) 156 case OpARMMOVHUreg: 157 return rewriteValueARM_OpARMMOVHUreg_0(v) 158 case OpARMMOVHload: 159 return rewriteValueARM_OpARMMOVHload_0(v) 160 case OpARMMOVHreg: 161 return rewriteValueARM_OpARMMOVHreg_0(v) 162 case OpARMMOVHstore: 163 return rewriteValueARM_OpARMMOVHstore_0(v) 164 case OpARMMOVWload: 165 return rewriteValueARM_OpARMMOVWload_0(v) 166 case OpARMMOVWloadidx: 167 return rewriteValueARM_OpARMMOVWloadidx_0(v) 168 case OpARMMOVWloadshiftLL: 169 return rewriteValueARM_OpARMMOVWloadshiftLL_0(v) 170 case OpARMMOVWloadshiftRA: 171 return rewriteValueARM_OpARMMOVWloadshiftRA_0(v) 172 case OpARMMOVWloadshiftRL: 173 return rewriteValueARM_OpARMMOVWloadshiftRL_0(v) 174 case OpARMMOVWreg: 175 return rewriteValueARM_OpARMMOVWreg_0(v) 176 case OpARMMOVWstore: 177 return rewriteValueARM_OpARMMOVWstore_0(v) 178 case OpARMMOVWstoreidx: 179 return rewriteValueARM_OpARMMOVWstoreidx_0(v) 180 case OpARMMOVWstoreshiftLL: 181 return rewriteValueARM_OpARMMOVWstoreshiftLL_0(v) 182 case OpARMMOVWstoreshiftRA: 183 return rewriteValueARM_OpARMMOVWstoreshiftRA_0(v) 184 case OpARMMOVWstoreshiftRL: 185 return rewriteValueARM_OpARMMOVWstoreshiftRL_0(v) 186 case OpARMMUL: 187 return rewriteValueARM_OpARMMUL_0(v) || rewriteValueARM_OpARMMUL_10(v) || rewriteValueARM_OpARMMUL_20(v) 188 case OpARMMULA: 189 return rewriteValueARM_OpARMMULA_0(v) || rewriteValueARM_OpARMMULA_10(v) || rewriteValueARM_OpARMMULA_20(v) 190 case OpARMMVN: 191 return rewriteValueARM_OpARMMVN_0(v) 192 case OpARMMVNshiftLL: 193 return rewriteValueARM_OpARMMVNshiftLL_0(v) 194 case OpARMMVNshiftLLreg: 195 return rewriteValueARM_OpARMMVNshiftLLreg_0(v) 196 case OpARMMVNshiftRA: 197 return rewriteValueARM_OpARMMVNshiftRA_0(v) 198 case OpARMMVNshiftRAreg: 199 return rewriteValueARM_OpARMMVNshiftRAreg_0(v) 200 case OpARMMVNshiftRL: 201 return rewriteValueARM_OpARMMVNshiftRL_0(v) 202 case OpARMMVNshiftRLreg: 203 return rewriteValueARM_OpARMMVNshiftRLreg_0(v) 204 case OpARMNotEqual: 205 return rewriteValueARM_OpARMNotEqual_0(v) 206 case OpARMOR: 207 return rewriteValueARM_OpARMOR_0(v) || rewriteValueARM_OpARMOR_10(v) 208 case OpARMORconst: 209 return rewriteValueARM_OpARMORconst_0(v) 210 case OpARMORshiftLL: 211 return rewriteValueARM_OpARMORshiftLL_0(v) 212 case OpARMORshiftLLreg: 213 return rewriteValueARM_OpARMORshiftLLreg_0(v) 214 case OpARMORshiftRA: 215 return rewriteValueARM_OpARMORshiftRA_0(v) 216 case OpARMORshiftRAreg: 217 return rewriteValueARM_OpARMORshiftRAreg_0(v) 218 case OpARMORshiftRL: 219 return rewriteValueARM_OpARMORshiftRL_0(v) 220 case OpARMORshiftRLreg: 221 return rewriteValueARM_OpARMORshiftRLreg_0(v) 222 case OpARMRSB: 223 return rewriteValueARM_OpARMRSB_0(v) || rewriteValueARM_OpARMRSB_10(v) 224 case OpARMRSBSshiftLL: 225 return rewriteValueARM_OpARMRSBSshiftLL_0(v) 226 case OpARMRSBSshiftLLreg: 227 return rewriteValueARM_OpARMRSBSshiftLLreg_0(v) 228 case OpARMRSBSshiftRA: 229 return rewriteValueARM_OpARMRSBSshiftRA_0(v) 230 case OpARMRSBSshiftRAreg: 231 return rewriteValueARM_OpARMRSBSshiftRAreg_0(v) 232 case OpARMRSBSshiftRL: 233 return rewriteValueARM_OpARMRSBSshiftRL_0(v) 234 case OpARMRSBSshiftRLreg: 235 return rewriteValueARM_OpARMRSBSshiftRLreg_0(v) 236 case OpARMRSBconst: 237 return rewriteValueARM_OpARMRSBconst_0(v) 238 case OpARMRSBshiftLL: 239 return rewriteValueARM_OpARMRSBshiftLL_0(v) 240 case OpARMRSBshiftLLreg: 241 return rewriteValueARM_OpARMRSBshiftLLreg_0(v) 242 case OpARMRSBshiftRA: 243 return rewriteValueARM_OpARMRSBshiftRA_0(v) 244 case OpARMRSBshiftRAreg: 245 return rewriteValueARM_OpARMRSBshiftRAreg_0(v) 246 case OpARMRSBshiftRL: 247 return rewriteValueARM_OpARMRSBshiftRL_0(v) 248 case OpARMRSBshiftRLreg: 249 return rewriteValueARM_OpARMRSBshiftRLreg_0(v) 250 case OpARMRSCconst: 251 return rewriteValueARM_OpARMRSCconst_0(v) 252 case OpARMRSCshiftLL: 253 return rewriteValueARM_OpARMRSCshiftLL_0(v) 254 case OpARMRSCshiftLLreg: 255 return rewriteValueARM_OpARMRSCshiftLLreg_0(v) 256 case OpARMRSCshiftRA: 257 return rewriteValueARM_OpARMRSCshiftRA_0(v) 258 case OpARMRSCshiftRAreg: 259 return rewriteValueARM_OpARMRSCshiftRAreg_0(v) 260 case OpARMRSCshiftRL: 261 return rewriteValueARM_OpARMRSCshiftRL_0(v) 262 case OpARMRSCshiftRLreg: 263 return rewriteValueARM_OpARMRSCshiftRLreg_0(v) 264 case OpARMSBC: 265 return rewriteValueARM_OpARMSBC_0(v) || rewriteValueARM_OpARMSBC_10(v) 266 case OpARMSBCconst: 267 return rewriteValueARM_OpARMSBCconst_0(v) 268 case OpARMSBCshiftLL: 269 return rewriteValueARM_OpARMSBCshiftLL_0(v) 270 case OpARMSBCshiftLLreg: 271 return rewriteValueARM_OpARMSBCshiftLLreg_0(v) 272 case OpARMSBCshiftRA: 273 return rewriteValueARM_OpARMSBCshiftRA_0(v) 274 case OpARMSBCshiftRAreg: 275 return rewriteValueARM_OpARMSBCshiftRAreg_0(v) 276 case OpARMSBCshiftRL: 277 return rewriteValueARM_OpARMSBCshiftRL_0(v) 278 case OpARMSBCshiftRLreg: 279 return rewriteValueARM_OpARMSBCshiftRLreg_0(v) 280 case OpARMSLL: 281 return rewriteValueARM_OpARMSLL_0(v) 282 case OpARMSLLconst: 283 return rewriteValueARM_OpARMSLLconst_0(v) 284 case OpARMSRA: 285 return rewriteValueARM_OpARMSRA_0(v) 286 case OpARMSRAcond: 287 return rewriteValueARM_OpARMSRAcond_0(v) 288 case OpARMSRAconst: 289 return rewriteValueARM_OpARMSRAconst_0(v) 290 case OpARMSRL: 291 return rewriteValueARM_OpARMSRL_0(v) 292 case OpARMSRLconst: 293 return rewriteValueARM_OpARMSRLconst_0(v) 294 case OpARMSUB: 295 return rewriteValueARM_OpARMSUB_0(v) || rewriteValueARM_OpARMSUB_10(v) 296 case OpARMSUBS: 297 return rewriteValueARM_OpARMSUBS_0(v) || rewriteValueARM_OpARMSUBS_10(v) 298 case OpARMSUBSshiftLL: 299 return rewriteValueARM_OpARMSUBSshiftLL_0(v) 300 case OpARMSUBSshiftLLreg: 301 return rewriteValueARM_OpARMSUBSshiftLLreg_0(v) 302 case OpARMSUBSshiftRA: 303 return rewriteValueARM_OpARMSUBSshiftRA_0(v) 304 case OpARMSUBSshiftRAreg: 305 return rewriteValueARM_OpARMSUBSshiftRAreg_0(v) 306 case OpARMSUBSshiftRL: 307 return rewriteValueARM_OpARMSUBSshiftRL_0(v) 308 case OpARMSUBSshiftRLreg: 309 return rewriteValueARM_OpARMSUBSshiftRLreg_0(v) 310 case OpARMSUBconst: 311 return rewriteValueARM_OpARMSUBconst_0(v) 312 case OpARMSUBshiftLL: 313 return rewriteValueARM_OpARMSUBshiftLL_0(v) 314 case OpARMSUBshiftLLreg: 315 return rewriteValueARM_OpARMSUBshiftLLreg_0(v) 316 case OpARMSUBshiftRA: 317 return rewriteValueARM_OpARMSUBshiftRA_0(v) 318 case OpARMSUBshiftRAreg: 319 return rewriteValueARM_OpARMSUBshiftRAreg_0(v) 320 case OpARMSUBshiftRL: 321 return rewriteValueARM_OpARMSUBshiftRL_0(v) 322 case OpARMSUBshiftRLreg: 323 return rewriteValueARM_OpARMSUBshiftRLreg_0(v) 324 case OpARMXOR: 325 return rewriteValueARM_OpARMXOR_0(v) || rewriteValueARM_OpARMXOR_10(v) 326 case OpARMXORconst: 327 return rewriteValueARM_OpARMXORconst_0(v) 328 case OpARMXORshiftLL: 329 return rewriteValueARM_OpARMXORshiftLL_0(v) 330 case OpARMXORshiftLLreg: 331 return rewriteValueARM_OpARMXORshiftLLreg_0(v) 332 case OpARMXORshiftRA: 333 return rewriteValueARM_OpARMXORshiftRA_0(v) 334 case OpARMXORshiftRAreg: 335 return rewriteValueARM_OpARMXORshiftRAreg_0(v) 336 case OpARMXORshiftRL: 337 return rewriteValueARM_OpARMXORshiftRL_0(v) 338 case OpARMXORshiftRLreg: 339 return rewriteValueARM_OpARMXORshiftRLreg_0(v) 340 case OpARMXORshiftRR: 341 return rewriteValueARM_OpARMXORshiftRR_0(v) 342 case OpAdd16: 343 return rewriteValueARM_OpAdd16_0(v) 344 case OpAdd32: 345 return rewriteValueARM_OpAdd32_0(v) 346 case OpAdd32F: 347 return rewriteValueARM_OpAdd32F_0(v) 348 case OpAdd32carry: 349 return rewriteValueARM_OpAdd32carry_0(v) 350 case OpAdd32withcarry: 351 return rewriteValueARM_OpAdd32withcarry_0(v) 352 case OpAdd64F: 353 return rewriteValueARM_OpAdd64F_0(v) 354 case OpAdd8: 355 return rewriteValueARM_OpAdd8_0(v) 356 case OpAddPtr: 357 return rewriteValueARM_OpAddPtr_0(v) 358 case OpAddr: 359 return rewriteValueARM_OpAddr_0(v) 360 case OpAnd16: 361 return rewriteValueARM_OpAnd16_0(v) 362 case OpAnd32: 363 return rewriteValueARM_OpAnd32_0(v) 364 case OpAnd8: 365 return rewriteValueARM_OpAnd8_0(v) 366 case OpAndB: 367 return rewriteValueARM_OpAndB_0(v) 368 case OpAvg32u: 369 return rewriteValueARM_OpAvg32u_0(v) 370 case OpBitLen32: 371 return rewriteValueARM_OpBitLen32_0(v) 372 case OpBswap32: 373 return rewriteValueARM_OpBswap32_0(v) 374 case OpClosureCall: 375 return rewriteValueARM_OpClosureCall_0(v) 376 case OpCom16: 377 return rewriteValueARM_OpCom16_0(v) 378 case OpCom32: 379 return rewriteValueARM_OpCom32_0(v) 380 case OpCom8: 381 return rewriteValueARM_OpCom8_0(v) 382 case OpConst16: 383 return rewriteValueARM_OpConst16_0(v) 384 case OpConst32: 385 return rewriteValueARM_OpConst32_0(v) 386 case OpConst32F: 387 return rewriteValueARM_OpConst32F_0(v) 388 case OpConst64F: 389 return rewriteValueARM_OpConst64F_0(v) 390 case OpConst8: 391 return rewriteValueARM_OpConst8_0(v) 392 case OpConstBool: 393 return rewriteValueARM_OpConstBool_0(v) 394 case OpConstNil: 395 return rewriteValueARM_OpConstNil_0(v) 396 case OpConvert: 397 return rewriteValueARM_OpConvert_0(v) 398 case OpCtz32: 399 return rewriteValueARM_OpCtz32_0(v) 400 case OpCvt32Fto32: 401 return rewriteValueARM_OpCvt32Fto32_0(v) 402 case OpCvt32Fto32U: 403 return rewriteValueARM_OpCvt32Fto32U_0(v) 404 case OpCvt32Fto64F: 405 return rewriteValueARM_OpCvt32Fto64F_0(v) 406 case OpCvt32Uto32F: 407 return rewriteValueARM_OpCvt32Uto32F_0(v) 408 case OpCvt32Uto64F: 409 return rewriteValueARM_OpCvt32Uto64F_0(v) 410 case OpCvt32to32F: 411 return rewriteValueARM_OpCvt32to32F_0(v) 412 case OpCvt32to64F: 413 return rewriteValueARM_OpCvt32to64F_0(v) 414 case OpCvt64Fto32: 415 return rewriteValueARM_OpCvt64Fto32_0(v) 416 case OpCvt64Fto32F: 417 return rewriteValueARM_OpCvt64Fto32F_0(v) 418 case OpCvt64Fto32U: 419 return rewriteValueARM_OpCvt64Fto32U_0(v) 420 case OpDiv16: 421 return rewriteValueARM_OpDiv16_0(v) 422 case OpDiv16u: 423 return rewriteValueARM_OpDiv16u_0(v) 424 case OpDiv32: 425 return rewriteValueARM_OpDiv32_0(v) 426 case OpDiv32F: 427 return rewriteValueARM_OpDiv32F_0(v) 428 case OpDiv32u: 429 return rewriteValueARM_OpDiv32u_0(v) 430 case OpDiv64F: 431 return rewriteValueARM_OpDiv64F_0(v) 432 case OpDiv8: 433 return rewriteValueARM_OpDiv8_0(v) 434 case OpDiv8u: 435 return rewriteValueARM_OpDiv8u_0(v) 436 case OpEq16: 437 return rewriteValueARM_OpEq16_0(v) 438 case OpEq32: 439 return rewriteValueARM_OpEq32_0(v) 440 case OpEq32F: 441 return rewriteValueARM_OpEq32F_0(v) 442 case OpEq64F: 443 return rewriteValueARM_OpEq64F_0(v) 444 case OpEq8: 445 return rewriteValueARM_OpEq8_0(v) 446 case OpEqB: 447 return rewriteValueARM_OpEqB_0(v) 448 case OpEqPtr: 449 return rewriteValueARM_OpEqPtr_0(v) 450 case OpGeq16: 451 return rewriteValueARM_OpGeq16_0(v) 452 case OpGeq16U: 453 return rewriteValueARM_OpGeq16U_0(v) 454 case OpGeq32: 455 return rewriteValueARM_OpGeq32_0(v) 456 case OpGeq32F: 457 return rewriteValueARM_OpGeq32F_0(v) 458 case OpGeq32U: 459 return rewriteValueARM_OpGeq32U_0(v) 460 case OpGeq64F: 461 return rewriteValueARM_OpGeq64F_0(v) 462 case OpGeq8: 463 return rewriteValueARM_OpGeq8_0(v) 464 case OpGeq8U: 465 return rewriteValueARM_OpGeq8U_0(v) 466 case OpGetClosurePtr: 467 return rewriteValueARM_OpGetClosurePtr_0(v) 468 case OpGreater16: 469 return rewriteValueARM_OpGreater16_0(v) 470 case OpGreater16U: 471 return rewriteValueARM_OpGreater16U_0(v) 472 case OpGreater32: 473 return rewriteValueARM_OpGreater32_0(v) 474 case OpGreater32F: 475 return rewriteValueARM_OpGreater32F_0(v) 476 case OpGreater32U: 477 return rewriteValueARM_OpGreater32U_0(v) 478 case OpGreater64F: 479 return rewriteValueARM_OpGreater64F_0(v) 480 case OpGreater8: 481 return rewriteValueARM_OpGreater8_0(v) 482 case OpGreater8U: 483 return rewriteValueARM_OpGreater8U_0(v) 484 case OpHmul32: 485 return rewriteValueARM_OpHmul32_0(v) 486 case OpHmul32u: 487 return rewriteValueARM_OpHmul32u_0(v) 488 case OpInterCall: 489 return rewriteValueARM_OpInterCall_0(v) 490 case OpIsInBounds: 491 return rewriteValueARM_OpIsInBounds_0(v) 492 case OpIsNonNil: 493 return rewriteValueARM_OpIsNonNil_0(v) 494 case OpIsSliceInBounds: 495 return rewriteValueARM_OpIsSliceInBounds_0(v) 496 case OpLeq16: 497 return rewriteValueARM_OpLeq16_0(v) 498 case OpLeq16U: 499 return rewriteValueARM_OpLeq16U_0(v) 500 case OpLeq32: 501 return rewriteValueARM_OpLeq32_0(v) 502 case OpLeq32F: 503 return rewriteValueARM_OpLeq32F_0(v) 504 case OpLeq32U: 505 return rewriteValueARM_OpLeq32U_0(v) 506 case OpLeq64F: 507 return rewriteValueARM_OpLeq64F_0(v) 508 case OpLeq8: 509 return rewriteValueARM_OpLeq8_0(v) 510 case OpLeq8U: 511 return rewriteValueARM_OpLeq8U_0(v) 512 case OpLess16: 513 return rewriteValueARM_OpLess16_0(v) 514 case OpLess16U: 515 return rewriteValueARM_OpLess16U_0(v) 516 case OpLess32: 517 return rewriteValueARM_OpLess32_0(v) 518 case OpLess32F: 519 return rewriteValueARM_OpLess32F_0(v) 520 case OpLess32U: 521 return rewriteValueARM_OpLess32U_0(v) 522 case OpLess64F: 523 return rewriteValueARM_OpLess64F_0(v) 524 case OpLess8: 525 return rewriteValueARM_OpLess8_0(v) 526 case OpLess8U: 527 return rewriteValueARM_OpLess8U_0(v) 528 case OpLoad: 529 return rewriteValueARM_OpLoad_0(v) 530 case OpLsh16x16: 531 return rewriteValueARM_OpLsh16x16_0(v) 532 case OpLsh16x32: 533 return rewriteValueARM_OpLsh16x32_0(v) 534 case OpLsh16x64: 535 return rewriteValueARM_OpLsh16x64_0(v) 536 case OpLsh16x8: 537 return rewriteValueARM_OpLsh16x8_0(v) 538 case OpLsh32x16: 539 return rewriteValueARM_OpLsh32x16_0(v) 540 case OpLsh32x32: 541 return rewriteValueARM_OpLsh32x32_0(v) 542 case OpLsh32x64: 543 return rewriteValueARM_OpLsh32x64_0(v) 544 case OpLsh32x8: 545 return rewriteValueARM_OpLsh32x8_0(v) 546 case OpLsh8x16: 547 return rewriteValueARM_OpLsh8x16_0(v) 548 case OpLsh8x32: 549 return rewriteValueARM_OpLsh8x32_0(v) 550 case OpLsh8x64: 551 return rewriteValueARM_OpLsh8x64_0(v) 552 case OpLsh8x8: 553 return rewriteValueARM_OpLsh8x8_0(v) 554 case OpMod16: 555 return rewriteValueARM_OpMod16_0(v) 556 case OpMod16u: 557 return rewriteValueARM_OpMod16u_0(v) 558 case OpMod32: 559 return rewriteValueARM_OpMod32_0(v) 560 case OpMod32u: 561 return rewriteValueARM_OpMod32u_0(v) 562 case OpMod8: 563 return rewriteValueARM_OpMod8_0(v) 564 case OpMod8u: 565 return rewriteValueARM_OpMod8u_0(v) 566 case OpMove: 567 return rewriteValueARM_OpMove_0(v) 568 case OpMul16: 569 return rewriteValueARM_OpMul16_0(v) 570 case OpMul32: 571 return rewriteValueARM_OpMul32_0(v) 572 case OpMul32F: 573 return rewriteValueARM_OpMul32F_0(v) 574 case OpMul32uhilo: 575 return rewriteValueARM_OpMul32uhilo_0(v) 576 case OpMul64F: 577 return rewriteValueARM_OpMul64F_0(v) 578 case OpMul8: 579 return rewriteValueARM_OpMul8_0(v) 580 case OpNeg16: 581 return rewriteValueARM_OpNeg16_0(v) 582 case OpNeg32: 583 return rewriteValueARM_OpNeg32_0(v) 584 case OpNeg32F: 585 return rewriteValueARM_OpNeg32F_0(v) 586 case OpNeg64F: 587 return rewriteValueARM_OpNeg64F_0(v) 588 case OpNeg8: 589 return rewriteValueARM_OpNeg8_0(v) 590 case OpNeq16: 591 return rewriteValueARM_OpNeq16_0(v) 592 case OpNeq32: 593 return rewriteValueARM_OpNeq32_0(v) 594 case OpNeq32F: 595 return rewriteValueARM_OpNeq32F_0(v) 596 case OpNeq64F: 597 return rewriteValueARM_OpNeq64F_0(v) 598 case OpNeq8: 599 return rewriteValueARM_OpNeq8_0(v) 600 case OpNeqB: 601 return rewriteValueARM_OpNeqB_0(v) 602 case OpNeqPtr: 603 return rewriteValueARM_OpNeqPtr_0(v) 604 case OpNilCheck: 605 return rewriteValueARM_OpNilCheck_0(v) 606 case OpNot: 607 return rewriteValueARM_OpNot_0(v) 608 case OpOffPtr: 609 return rewriteValueARM_OpOffPtr_0(v) 610 case OpOr16: 611 return rewriteValueARM_OpOr16_0(v) 612 case OpOr32: 613 return rewriteValueARM_OpOr32_0(v) 614 case OpOr8: 615 return rewriteValueARM_OpOr8_0(v) 616 case OpOrB: 617 return rewriteValueARM_OpOrB_0(v) 618 case OpRound32F: 619 return rewriteValueARM_OpRound32F_0(v) 620 case OpRound64F: 621 return rewriteValueARM_OpRound64F_0(v) 622 case OpRsh16Ux16: 623 return rewriteValueARM_OpRsh16Ux16_0(v) 624 case OpRsh16Ux32: 625 return rewriteValueARM_OpRsh16Ux32_0(v) 626 case OpRsh16Ux64: 627 return rewriteValueARM_OpRsh16Ux64_0(v) 628 case OpRsh16Ux8: 629 return rewriteValueARM_OpRsh16Ux8_0(v) 630 case OpRsh16x16: 631 return rewriteValueARM_OpRsh16x16_0(v) 632 case OpRsh16x32: 633 return rewriteValueARM_OpRsh16x32_0(v) 634 case OpRsh16x64: 635 return rewriteValueARM_OpRsh16x64_0(v) 636 case OpRsh16x8: 637 return rewriteValueARM_OpRsh16x8_0(v) 638 case OpRsh32Ux16: 639 return rewriteValueARM_OpRsh32Ux16_0(v) 640 case OpRsh32Ux32: 641 return rewriteValueARM_OpRsh32Ux32_0(v) 642 case OpRsh32Ux64: 643 return rewriteValueARM_OpRsh32Ux64_0(v) 644 case OpRsh32Ux8: 645 return rewriteValueARM_OpRsh32Ux8_0(v) 646 case OpRsh32x16: 647 return rewriteValueARM_OpRsh32x16_0(v) 648 case OpRsh32x32: 649 return rewriteValueARM_OpRsh32x32_0(v) 650 case OpRsh32x64: 651 return rewriteValueARM_OpRsh32x64_0(v) 652 case OpRsh32x8: 653 return rewriteValueARM_OpRsh32x8_0(v) 654 case OpRsh8Ux16: 655 return rewriteValueARM_OpRsh8Ux16_0(v) 656 case OpRsh8Ux32: 657 return rewriteValueARM_OpRsh8Ux32_0(v) 658 case OpRsh8Ux64: 659 return rewriteValueARM_OpRsh8Ux64_0(v) 660 case OpRsh8Ux8: 661 return rewriteValueARM_OpRsh8Ux8_0(v) 662 case OpRsh8x16: 663 return rewriteValueARM_OpRsh8x16_0(v) 664 case OpRsh8x32: 665 return rewriteValueARM_OpRsh8x32_0(v) 666 case OpRsh8x64: 667 return rewriteValueARM_OpRsh8x64_0(v) 668 case OpRsh8x8: 669 return rewriteValueARM_OpRsh8x8_0(v) 670 case OpSelect0: 671 return rewriteValueARM_OpSelect0_0(v) 672 case OpSelect1: 673 return rewriteValueARM_OpSelect1_0(v) 674 case OpSignExt16to32: 675 return rewriteValueARM_OpSignExt16to32_0(v) 676 case OpSignExt8to16: 677 return rewriteValueARM_OpSignExt8to16_0(v) 678 case OpSignExt8to32: 679 return rewriteValueARM_OpSignExt8to32_0(v) 680 case OpSignmask: 681 return rewriteValueARM_OpSignmask_0(v) 682 case OpSlicemask: 683 return rewriteValueARM_OpSlicemask_0(v) 684 case OpSqrt: 685 return rewriteValueARM_OpSqrt_0(v) 686 case OpStaticCall: 687 return rewriteValueARM_OpStaticCall_0(v) 688 case OpStore: 689 return rewriteValueARM_OpStore_0(v) 690 case OpSub16: 691 return rewriteValueARM_OpSub16_0(v) 692 case OpSub32: 693 return rewriteValueARM_OpSub32_0(v) 694 case OpSub32F: 695 return rewriteValueARM_OpSub32F_0(v) 696 case OpSub32carry: 697 return rewriteValueARM_OpSub32carry_0(v) 698 case OpSub32withcarry: 699 return rewriteValueARM_OpSub32withcarry_0(v) 700 case OpSub64F: 701 return rewriteValueARM_OpSub64F_0(v) 702 case OpSub8: 703 return rewriteValueARM_OpSub8_0(v) 704 case OpSubPtr: 705 return rewriteValueARM_OpSubPtr_0(v) 706 case OpTrunc16to8: 707 return rewriteValueARM_OpTrunc16to8_0(v) 708 case OpTrunc32to16: 709 return rewriteValueARM_OpTrunc32to16_0(v) 710 case OpTrunc32to8: 711 return rewriteValueARM_OpTrunc32to8_0(v) 712 case OpXor16: 713 return rewriteValueARM_OpXor16_0(v) 714 case OpXor32: 715 return rewriteValueARM_OpXor32_0(v) 716 case OpXor8: 717 return rewriteValueARM_OpXor8_0(v) 718 case OpZero: 719 return rewriteValueARM_OpZero_0(v) 720 case OpZeroExt16to32: 721 return rewriteValueARM_OpZeroExt16to32_0(v) 722 case OpZeroExt8to16: 723 return rewriteValueARM_OpZeroExt8to16_0(v) 724 case OpZeroExt8to32: 725 return rewriteValueARM_OpZeroExt8to32_0(v) 726 case OpZeromask: 727 return rewriteValueARM_OpZeromask_0(v) 728 } 729 return false 730 } 731 func rewriteValueARM_OpARMADC_0(v *Value) bool { 732 // match: (ADC (MOVWconst [c]) x flags) 733 // cond: 734 // result: (ADCconst [c] x flags) 735 for { 736 v_0 := v.Args[0] 737 if v_0.Op != OpARMMOVWconst { 738 break 739 } 740 c := v_0.AuxInt 741 x := v.Args[1] 742 flags := v.Args[2] 743 v.reset(OpARMADCconst) 744 v.AuxInt = c 745 v.AddArg(x) 746 v.AddArg(flags) 747 return true 748 } 749 // match: (ADC x (MOVWconst [c]) flags) 750 // cond: 751 // result: (ADCconst [c] x flags) 752 for { 753 x := v.Args[0] 754 v_1 := v.Args[1] 755 if v_1.Op != OpARMMOVWconst { 756 break 757 } 758 c := v_1.AuxInt 759 flags := v.Args[2] 760 v.reset(OpARMADCconst) 761 v.AuxInt = c 762 v.AddArg(x) 763 v.AddArg(flags) 764 return true 765 } 766 // match: (ADC x (MOVWconst [c]) flags) 767 // cond: 768 // result: (ADCconst [c] x flags) 769 for { 770 x := v.Args[0] 771 v_1 := v.Args[1] 772 if v_1.Op != OpARMMOVWconst { 773 break 774 } 775 c := v_1.AuxInt 776 flags := v.Args[2] 777 v.reset(OpARMADCconst) 778 v.AuxInt = c 779 v.AddArg(x) 780 v.AddArg(flags) 781 return true 782 } 783 // match: (ADC (MOVWconst [c]) x flags) 784 // cond: 785 // result: (ADCconst [c] x flags) 786 for { 787 v_0 := v.Args[0] 788 if v_0.Op != OpARMMOVWconst { 789 break 790 } 791 c := v_0.AuxInt 792 x := v.Args[1] 793 flags := v.Args[2] 794 v.reset(OpARMADCconst) 795 v.AuxInt = c 796 v.AddArg(x) 797 v.AddArg(flags) 798 return true 799 } 800 // match: (ADC x (SLLconst [c] y) flags) 801 // cond: 802 // result: (ADCshiftLL x y [c] flags) 803 for { 804 x := v.Args[0] 805 v_1 := v.Args[1] 806 if v_1.Op != OpARMSLLconst { 807 break 808 } 809 c := v_1.AuxInt 810 y := v_1.Args[0] 811 flags := v.Args[2] 812 v.reset(OpARMADCshiftLL) 813 v.AuxInt = c 814 v.AddArg(x) 815 v.AddArg(y) 816 v.AddArg(flags) 817 return true 818 } 819 // match: (ADC (SLLconst [c] y) x flags) 820 // cond: 821 // result: (ADCshiftLL x y [c] flags) 822 for { 823 v_0 := v.Args[0] 824 if v_0.Op != OpARMSLLconst { 825 break 826 } 827 c := v_0.AuxInt 828 y := v_0.Args[0] 829 x := v.Args[1] 830 flags := v.Args[2] 831 v.reset(OpARMADCshiftLL) 832 v.AuxInt = c 833 v.AddArg(x) 834 v.AddArg(y) 835 v.AddArg(flags) 836 return true 837 } 838 // match: (ADC (SLLconst [c] y) x flags) 839 // cond: 840 // result: (ADCshiftLL x y [c] flags) 841 for { 842 v_0 := v.Args[0] 843 if v_0.Op != OpARMSLLconst { 844 break 845 } 846 c := v_0.AuxInt 847 y := v_0.Args[0] 848 x := v.Args[1] 849 flags := v.Args[2] 850 v.reset(OpARMADCshiftLL) 851 v.AuxInt = c 852 v.AddArg(x) 853 v.AddArg(y) 854 v.AddArg(flags) 855 return true 856 } 857 // match: (ADC x (SLLconst [c] y) flags) 858 // cond: 859 // result: (ADCshiftLL x y [c] flags) 860 for { 861 x := v.Args[0] 862 v_1 := v.Args[1] 863 if v_1.Op != OpARMSLLconst { 864 break 865 } 866 c := v_1.AuxInt 867 y := v_1.Args[0] 868 flags := v.Args[2] 869 v.reset(OpARMADCshiftLL) 870 v.AuxInt = c 871 v.AddArg(x) 872 v.AddArg(y) 873 v.AddArg(flags) 874 return true 875 } 876 // match: (ADC x (SRLconst [c] y) flags) 877 // cond: 878 // result: (ADCshiftRL x y [c] flags) 879 for { 880 x := v.Args[0] 881 v_1 := v.Args[1] 882 if v_1.Op != OpARMSRLconst { 883 break 884 } 885 c := v_1.AuxInt 886 y := v_1.Args[0] 887 flags := v.Args[2] 888 v.reset(OpARMADCshiftRL) 889 v.AuxInt = c 890 v.AddArg(x) 891 v.AddArg(y) 892 v.AddArg(flags) 893 return true 894 } 895 // match: (ADC (SRLconst [c] y) x flags) 896 // cond: 897 // result: (ADCshiftRL x y [c] flags) 898 for { 899 v_0 := v.Args[0] 900 if v_0.Op != OpARMSRLconst { 901 break 902 } 903 c := v_0.AuxInt 904 y := v_0.Args[0] 905 x := v.Args[1] 906 flags := v.Args[2] 907 v.reset(OpARMADCshiftRL) 908 v.AuxInt = c 909 v.AddArg(x) 910 v.AddArg(y) 911 v.AddArg(flags) 912 return true 913 } 914 return false 915 } 916 func rewriteValueARM_OpARMADC_10(v *Value) bool { 917 // match: (ADC (SRLconst [c] y) x flags) 918 // cond: 919 // result: (ADCshiftRL x y [c] flags) 920 for { 921 v_0 := v.Args[0] 922 if v_0.Op != OpARMSRLconst { 923 break 924 } 925 c := v_0.AuxInt 926 y := v_0.Args[0] 927 x := v.Args[1] 928 flags := v.Args[2] 929 v.reset(OpARMADCshiftRL) 930 v.AuxInt = c 931 v.AddArg(x) 932 v.AddArg(y) 933 v.AddArg(flags) 934 return true 935 } 936 // match: (ADC x (SRLconst [c] y) flags) 937 // cond: 938 // result: (ADCshiftRL x y [c] flags) 939 for { 940 x := v.Args[0] 941 v_1 := v.Args[1] 942 if v_1.Op != OpARMSRLconst { 943 break 944 } 945 c := v_1.AuxInt 946 y := v_1.Args[0] 947 flags := v.Args[2] 948 v.reset(OpARMADCshiftRL) 949 v.AuxInt = c 950 v.AddArg(x) 951 v.AddArg(y) 952 v.AddArg(flags) 953 return true 954 } 955 // match: (ADC x (SRAconst [c] y) flags) 956 // cond: 957 // result: (ADCshiftRA x y [c] flags) 958 for { 959 x := v.Args[0] 960 v_1 := v.Args[1] 961 if v_1.Op != OpARMSRAconst { 962 break 963 } 964 c := v_1.AuxInt 965 y := v_1.Args[0] 966 flags := v.Args[2] 967 v.reset(OpARMADCshiftRA) 968 v.AuxInt = c 969 v.AddArg(x) 970 v.AddArg(y) 971 v.AddArg(flags) 972 return true 973 } 974 // match: (ADC (SRAconst [c] y) x flags) 975 // cond: 976 // result: (ADCshiftRA x y [c] flags) 977 for { 978 v_0 := v.Args[0] 979 if v_0.Op != OpARMSRAconst { 980 break 981 } 982 c := v_0.AuxInt 983 y := v_0.Args[0] 984 x := v.Args[1] 985 flags := v.Args[2] 986 v.reset(OpARMADCshiftRA) 987 v.AuxInt = c 988 v.AddArg(x) 989 v.AddArg(y) 990 v.AddArg(flags) 991 return true 992 } 993 // match: (ADC (SRAconst [c] y) x flags) 994 // cond: 995 // result: (ADCshiftRA x y [c] flags) 996 for { 997 v_0 := v.Args[0] 998 if v_0.Op != OpARMSRAconst { 999 break 1000 } 1001 c := v_0.AuxInt 1002 y := v_0.Args[0] 1003 x := v.Args[1] 1004 flags := v.Args[2] 1005 v.reset(OpARMADCshiftRA) 1006 v.AuxInt = c 1007 v.AddArg(x) 1008 v.AddArg(y) 1009 v.AddArg(flags) 1010 return true 1011 } 1012 // match: (ADC x (SRAconst [c] y) flags) 1013 // cond: 1014 // result: (ADCshiftRA x y [c] flags) 1015 for { 1016 x := v.Args[0] 1017 v_1 := v.Args[1] 1018 if v_1.Op != OpARMSRAconst { 1019 break 1020 } 1021 c := v_1.AuxInt 1022 y := v_1.Args[0] 1023 flags := v.Args[2] 1024 v.reset(OpARMADCshiftRA) 1025 v.AuxInt = c 1026 v.AddArg(x) 1027 v.AddArg(y) 1028 v.AddArg(flags) 1029 return true 1030 } 1031 // match: (ADC x (SLL y z) flags) 1032 // cond: 1033 // result: (ADCshiftLLreg x y z flags) 1034 for { 1035 x := v.Args[0] 1036 v_1 := v.Args[1] 1037 if v_1.Op != OpARMSLL { 1038 break 1039 } 1040 y := v_1.Args[0] 1041 z := v_1.Args[1] 1042 flags := v.Args[2] 1043 v.reset(OpARMADCshiftLLreg) 1044 v.AddArg(x) 1045 v.AddArg(y) 1046 v.AddArg(z) 1047 v.AddArg(flags) 1048 return true 1049 } 1050 // match: (ADC (SLL y z) x flags) 1051 // cond: 1052 // result: (ADCshiftLLreg x y z flags) 1053 for { 1054 v_0 := v.Args[0] 1055 if v_0.Op != OpARMSLL { 1056 break 1057 } 1058 y := v_0.Args[0] 1059 z := v_0.Args[1] 1060 x := v.Args[1] 1061 flags := v.Args[2] 1062 v.reset(OpARMADCshiftLLreg) 1063 v.AddArg(x) 1064 v.AddArg(y) 1065 v.AddArg(z) 1066 v.AddArg(flags) 1067 return true 1068 } 1069 // match: (ADC (SLL y z) x flags) 1070 // cond: 1071 // result: (ADCshiftLLreg x y z flags) 1072 for { 1073 v_0 := v.Args[0] 1074 if v_0.Op != OpARMSLL { 1075 break 1076 } 1077 y := v_0.Args[0] 1078 z := v_0.Args[1] 1079 x := v.Args[1] 1080 flags := v.Args[2] 1081 v.reset(OpARMADCshiftLLreg) 1082 v.AddArg(x) 1083 v.AddArg(y) 1084 v.AddArg(z) 1085 v.AddArg(flags) 1086 return true 1087 } 1088 // match: (ADC x (SLL y z) flags) 1089 // cond: 1090 // result: (ADCshiftLLreg x y z flags) 1091 for { 1092 x := v.Args[0] 1093 v_1 := v.Args[1] 1094 if v_1.Op != OpARMSLL { 1095 break 1096 } 1097 y := v_1.Args[0] 1098 z := v_1.Args[1] 1099 flags := v.Args[2] 1100 v.reset(OpARMADCshiftLLreg) 1101 v.AddArg(x) 1102 v.AddArg(y) 1103 v.AddArg(z) 1104 v.AddArg(flags) 1105 return true 1106 } 1107 return false 1108 } 1109 func rewriteValueARM_OpARMADC_20(v *Value) bool { 1110 // match: (ADC x (SRL y z) flags) 1111 // cond: 1112 // result: (ADCshiftRLreg x y z flags) 1113 for { 1114 x := v.Args[0] 1115 v_1 := v.Args[1] 1116 if v_1.Op != OpARMSRL { 1117 break 1118 } 1119 y := v_1.Args[0] 1120 z := v_1.Args[1] 1121 flags := v.Args[2] 1122 v.reset(OpARMADCshiftRLreg) 1123 v.AddArg(x) 1124 v.AddArg(y) 1125 v.AddArg(z) 1126 v.AddArg(flags) 1127 return true 1128 } 1129 // match: (ADC (SRL y z) x flags) 1130 // cond: 1131 // result: (ADCshiftRLreg x y z flags) 1132 for { 1133 v_0 := v.Args[0] 1134 if v_0.Op != OpARMSRL { 1135 break 1136 } 1137 y := v_0.Args[0] 1138 z := v_0.Args[1] 1139 x := v.Args[1] 1140 flags := v.Args[2] 1141 v.reset(OpARMADCshiftRLreg) 1142 v.AddArg(x) 1143 v.AddArg(y) 1144 v.AddArg(z) 1145 v.AddArg(flags) 1146 return true 1147 } 1148 // match: (ADC (SRL y z) x flags) 1149 // cond: 1150 // result: (ADCshiftRLreg x y z flags) 1151 for { 1152 v_0 := v.Args[0] 1153 if v_0.Op != OpARMSRL { 1154 break 1155 } 1156 y := v_0.Args[0] 1157 z := v_0.Args[1] 1158 x := v.Args[1] 1159 flags := v.Args[2] 1160 v.reset(OpARMADCshiftRLreg) 1161 v.AddArg(x) 1162 v.AddArg(y) 1163 v.AddArg(z) 1164 v.AddArg(flags) 1165 return true 1166 } 1167 // match: (ADC x (SRL y z) flags) 1168 // cond: 1169 // result: (ADCshiftRLreg x y z flags) 1170 for { 1171 x := v.Args[0] 1172 v_1 := v.Args[1] 1173 if v_1.Op != OpARMSRL { 1174 break 1175 } 1176 y := v_1.Args[0] 1177 z := v_1.Args[1] 1178 flags := v.Args[2] 1179 v.reset(OpARMADCshiftRLreg) 1180 v.AddArg(x) 1181 v.AddArg(y) 1182 v.AddArg(z) 1183 v.AddArg(flags) 1184 return true 1185 } 1186 // match: (ADC x (SRA y z) flags) 1187 // cond: 1188 // result: (ADCshiftRAreg x y z flags) 1189 for { 1190 x := v.Args[0] 1191 v_1 := v.Args[1] 1192 if v_1.Op != OpARMSRA { 1193 break 1194 } 1195 y := v_1.Args[0] 1196 z := v_1.Args[1] 1197 flags := v.Args[2] 1198 v.reset(OpARMADCshiftRAreg) 1199 v.AddArg(x) 1200 v.AddArg(y) 1201 v.AddArg(z) 1202 v.AddArg(flags) 1203 return true 1204 } 1205 // match: (ADC (SRA y z) x flags) 1206 // cond: 1207 // result: (ADCshiftRAreg x y z flags) 1208 for { 1209 v_0 := v.Args[0] 1210 if v_0.Op != OpARMSRA { 1211 break 1212 } 1213 y := v_0.Args[0] 1214 z := v_0.Args[1] 1215 x := v.Args[1] 1216 flags := v.Args[2] 1217 v.reset(OpARMADCshiftRAreg) 1218 v.AddArg(x) 1219 v.AddArg(y) 1220 v.AddArg(z) 1221 v.AddArg(flags) 1222 return true 1223 } 1224 // match: (ADC (SRA y z) x flags) 1225 // cond: 1226 // result: (ADCshiftRAreg x y z flags) 1227 for { 1228 v_0 := v.Args[0] 1229 if v_0.Op != OpARMSRA { 1230 break 1231 } 1232 y := v_0.Args[0] 1233 z := v_0.Args[1] 1234 x := v.Args[1] 1235 flags := v.Args[2] 1236 v.reset(OpARMADCshiftRAreg) 1237 v.AddArg(x) 1238 v.AddArg(y) 1239 v.AddArg(z) 1240 v.AddArg(flags) 1241 return true 1242 } 1243 // match: (ADC x (SRA y z) flags) 1244 // cond: 1245 // result: (ADCshiftRAreg x y z flags) 1246 for { 1247 x := v.Args[0] 1248 v_1 := v.Args[1] 1249 if v_1.Op != OpARMSRA { 1250 break 1251 } 1252 y := v_1.Args[0] 1253 z := v_1.Args[1] 1254 flags := v.Args[2] 1255 v.reset(OpARMADCshiftRAreg) 1256 v.AddArg(x) 1257 v.AddArg(y) 1258 v.AddArg(z) 1259 v.AddArg(flags) 1260 return true 1261 } 1262 return false 1263 } 1264 func rewriteValueARM_OpARMADCconst_0(v *Value) bool { 1265 // match: (ADCconst [c] (ADDconst [d] x) flags) 1266 // cond: 1267 // result: (ADCconst [int64(int32(c+d))] x flags) 1268 for { 1269 c := v.AuxInt 1270 v_0 := v.Args[0] 1271 if v_0.Op != OpARMADDconst { 1272 break 1273 } 1274 d := v_0.AuxInt 1275 x := v_0.Args[0] 1276 flags := v.Args[1] 1277 v.reset(OpARMADCconst) 1278 v.AuxInt = int64(int32(c + d)) 1279 v.AddArg(x) 1280 v.AddArg(flags) 1281 return true 1282 } 1283 // match: (ADCconst [c] (SUBconst [d] x) flags) 1284 // cond: 1285 // result: (ADCconst [int64(int32(c-d))] x flags) 1286 for { 1287 c := v.AuxInt 1288 v_0 := v.Args[0] 1289 if v_0.Op != OpARMSUBconst { 1290 break 1291 } 1292 d := v_0.AuxInt 1293 x := v_0.Args[0] 1294 flags := v.Args[1] 1295 v.reset(OpARMADCconst) 1296 v.AuxInt = int64(int32(c - d)) 1297 v.AddArg(x) 1298 v.AddArg(flags) 1299 return true 1300 } 1301 return false 1302 } 1303 func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { 1304 b := v.Block 1305 _ = b 1306 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1307 // cond: 1308 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1309 for { 1310 d := v.AuxInt 1311 v_0 := v.Args[0] 1312 if v_0.Op != OpARMMOVWconst { 1313 break 1314 } 1315 c := v_0.AuxInt 1316 x := v.Args[1] 1317 flags := v.Args[2] 1318 v.reset(OpARMADCconst) 1319 v.AuxInt = c 1320 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1321 v0.AuxInt = d 1322 v0.AddArg(x) 1323 v.AddArg(v0) 1324 v.AddArg(flags) 1325 return true 1326 } 1327 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1328 // cond: 1329 // result: (ADCconst x [int64(uint32(c)<<uint64(d))] flags) 1330 for { 1331 d := v.AuxInt 1332 x := v.Args[0] 1333 v_1 := v.Args[1] 1334 if v_1.Op != OpARMMOVWconst { 1335 break 1336 } 1337 c := v_1.AuxInt 1338 flags := v.Args[2] 1339 v.reset(OpARMADCconst) 1340 v.AuxInt = int64(uint32(c) << uint64(d)) 1341 v.AddArg(x) 1342 v.AddArg(flags) 1343 return true 1344 } 1345 return false 1346 } 1347 func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { 1348 b := v.Block 1349 _ = b 1350 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1351 // cond: 1352 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1353 for { 1354 v_0 := v.Args[0] 1355 if v_0.Op != OpARMMOVWconst { 1356 break 1357 } 1358 c := v_0.AuxInt 1359 x := v.Args[1] 1360 y := v.Args[2] 1361 flags := v.Args[3] 1362 v.reset(OpARMADCconst) 1363 v.AuxInt = c 1364 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1365 v0.AddArg(x) 1366 v0.AddArg(y) 1367 v.AddArg(v0) 1368 v.AddArg(flags) 1369 return true 1370 } 1371 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1372 // cond: 1373 // result: (ADCshiftLL x y [c] flags) 1374 for { 1375 x := v.Args[0] 1376 y := v.Args[1] 1377 v_2 := v.Args[2] 1378 if v_2.Op != OpARMMOVWconst { 1379 break 1380 } 1381 c := v_2.AuxInt 1382 flags := v.Args[3] 1383 v.reset(OpARMADCshiftLL) 1384 v.AuxInt = c 1385 v.AddArg(x) 1386 v.AddArg(y) 1387 v.AddArg(flags) 1388 return true 1389 } 1390 return false 1391 } 1392 func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { 1393 b := v.Block 1394 _ = b 1395 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1396 // cond: 1397 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1398 for { 1399 d := v.AuxInt 1400 v_0 := v.Args[0] 1401 if v_0.Op != OpARMMOVWconst { 1402 break 1403 } 1404 c := v_0.AuxInt 1405 x := v.Args[1] 1406 flags := v.Args[2] 1407 v.reset(OpARMADCconst) 1408 v.AuxInt = c 1409 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1410 v0.AuxInt = d 1411 v0.AddArg(x) 1412 v.AddArg(v0) 1413 v.AddArg(flags) 1414 return true 1415 } 1416 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1417 // cond: 1418 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1419 for { 1420 d := v.AuxInt 1421 x := v.Args[0] 1422 v_1 := v.Args[1] 1423 if v_1.Op != OpARMMOVWconst { 1424 break 1425 } 1426 c := v_1.AuxInt 1427 flags := v.Args[2] 1428 v.reset(OpARMADCconst) 1429 v.AuxInt = int64(int32(c) >> uint64(d)) 1430 v.AddArg(x) 1431 v.AddArg(flags) 1432 return true 1433 } 1434 return false 1435 } 1436 func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { 1437 b := v.Block 1438 _ = b 1439 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1440 // cond: 1441 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1442 for { 1443 v_0 := v.Args[0] 1444 if v_0.Op != OpARMMOVWconst { 1445 break 1446 } 1447 c := v_0.AuxInt 1448 x := v.Args[1] 1449 y := v.Args[2] 1450 flags := v.Args[3] 1451 v.reset(OpARMADCconst) 1452 v.AuxInt = c 1453 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1454 v0.AddArg(x) 1455 v0.AddArg(y) 1456 v.AddArg(v0) 1457 v.AddArg(flags) 1458 return true 1459 } 1460 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1461 // cond: 1462 // result: (ADCshiftRA x y [c] flags) 1463 for { 1464 x := v.Args[0] 1465 y := v.Args[1] 1466 v_2 := v.Args[2] 1467 if v_2.Op != OpARMMOVWconst { 1468 break 1469 } 1470 c := v_2.AuxInt 1471 flags := v.Args[3] 1472 v.reset(OpARMADCshiftRA) 1473 v.AuxInt = c 1474 v.AddArg(x) 1475 v.AddArg(y) 1476 v.AddArg(flags) 1477 return true 1478 } 1479 return false 1480 } 1481 func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { 1482 b := v.Block 1483 _ = b 1484 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1485 // cond: 1486 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1487 for { 1488 d := v.AuxInt 1489 v_0 := v.Args[0] 1490 if v_0.Op != OpARMMOVWconst { 1491 break 1492 } 1493 c := v_0.AuxInt 1494 x := v.Args[1] 1495 flags := v.Args[2] 1496 v.reset(OpARMADCconst) 1497 v.AuxInt = c 1498 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1499 v0.AuxInt = d 1500 v0.AddArg(x) 1501 v.AddArg(v0) 1502 v.AddArg(flags) 1503 return true 1504 } 1505 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1506 // cond: 1507 // result: (ADCconst x [int64(uint32(c)>>uint64(d))] flags) 1508 for { 1509 d := v.AuxInt 1510 x := v.Args[0] 1511 v_1 := v.Args[1] 1512 if v_1.Op != OpARMMOVWconst { 1513 break 1514 } 1515 c := v_1.AuxInt 1516 flags := v.Args[2] 1517 v.reset(OpARMADCconst) 1518 v.AuxInt = int64(uint32(c) >> uint64(d)) 1519 v.AddArg(x) 1520 v.AddArg(flags) 1521 return true 1522 } 1523 return false 1524 } 1525 func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { 1526 b := v.Block 1527 _ = b 1528 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1529 // cond: 1530 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1531 for { 1532 v_0 := v.Args[0] 1533 if v_0.Op != OpARMMOVWconst { 1534 break 1535 } 1536 c := v_0.AuxInt 1537 x := v.Args[1] 1538 y := v.Args[2] 1539 flags := v.Args[3] 1540 v.reset(OpARMADCconst) 1541 v.AuxInt = c 1542 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1543 v0.AddArg(x) 1544 v0.AddArg(y) 1545 v.AddArg(v0) 1546 v.AddArg(flags) 1547 return true 1548 } 1549 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1550 // cond: 1551 // result: (ADCshiftRL x y [c] flags) 1552 for { 1553 x := v.Args[0] 1554 y := v.Args[1] 1555 v_2 := v.Args[2] 1556 if v_2.Op != OpARMMOVWconst { 1557 break 1558 } 1559 c := v_2.AuxInt 1560 flags := v.Args[3] 1561 v.reset(OpARMADCshiftRL) 1562 v.AuxInt = c 1563 v.AddArg(x) 1564 v.AddArg(y) 1565 v.AddArg(flags) 1566 return true 1567 } 1568 return false 1569 } 1570 func rewriteValueARM_OpARMADD_0(v *Value) bool { 1571 // match: (ADD x (MOVWconst [c])) 1572 // cond: 1573 // result: (ADDconst [c] x) 1574 for { 1575 x := v.Args[0] 1576 v_1 := v.Args[1] 1577 if v_1.Op != OpARMMOVWconst { 1578 break 1579 } 1580 c := v_1.AuxInt 1581 v.reset(OpARMADDconst) 1582 v.AuxInt = c 1583 v.AddArg(x) 1584 return true 1585 } 1586 // match: (ADD (MOVWconst [c]) x) 1587 // cond: 1588 // result: (ADDconst [c] x) 1589 for { 1590 v_0 := v.Args[0] 1591 if v_0.Op != OpARMMOVWconst { 1592 break 1593 } 1594 c := v_0.AuxInt 1595 x := v.Args[1] 1596 v.reset(OpARMADDconst) 1597 v.AuxInt = c 1598 v.AddArg(x) 1599 return true 1600 } 1601 // match: (ADD x (SLLconst [c] y)) 1602 // cond: 1603 // result: (ADDshiftLL x y [c]) 1604 for { 1605 x := v.Args[0] 1606 v_1 := v.Args[1] 1607 if v_1.Op != OpARMSLLconst { 1608 break 1609 } 1610 c := v_1.AuxInt 1611 y := v_1.Args[0] 1612 v.reset(OpARMADDshiftLL) 1613 v.AuxInt = c 1614 v.AddArg(x) 1615 v.AddArg(y) 1616 return true 1617 } 1618 // match: (ADD (SLLconst [c] y) x) 1619 // cond: 1620 // result: (ADDshiftLL x y [c]) 1621 for { 1622 v_0 := v.Args[0] 1623 if v_0.Op != OpARMSLLconst { 1624 break 1625 } 1626 c := v_0.AuxInt 1627 y := v_0.Args[0] 1628 x := v.Args[1] 1629 v.reset(OpARMADDshiftLL) 1630 v.AuxInt = c 1631 v.AddArg(x) 1632 v.AddArg(y) 1633 return true 1634 } 1635 // match: (ADD x (SRLconst [c] y)) 1636 // cond: 1637 // result: (ADDshiftRL x y [c]) 1638 for { 1639 x := v.Args[0] 1640 v_1 := v.Args[1] 1641 if v_1.Op != OpARMSRLconst { 1642 break 1643 } 1644 c := v_1.AuxInt 1645 y := v_1.Args[0] 1646 v.reset(OpARMADDshiftRL) 1647 v.AuxInt = c 1648 v.AddArg(x) 1649 v.AddArg(y) 1650 return true 1651 } 1652 // match: (ADD (SRLconst [c] y) x) 1653 // cond: 1654 // result: (ADDshiftRL x y [c]) 1655 for { 1656 v_0 := v.Args[0] 1657 if v_0.Op != OpARMSRLconst { 1658 break 1659 } 1660 c := v_0.AuxInt 1661 y := v_0.Args[0] 1662 x := v.Args[1] 1663 v.reset(OpARMADDshiftRL) 1664 v.AuxInt = c 1665 v.AddArg(x) 1666 v.AddArg(y) 1667 return true 1668 } 1669 // match: (ADD x (SRAconst [c] y)) 1670 // cond: 1671 // result: (ADDshiftRA x y [c]) 1672 for { 1673 x := v.Args[0] 1674 v_1 := v.Args[1] 1675 if v_1.Op != OpARMSRAconst { 1676 break 1677 } 1678 c := v_1.AuxInt 1679 y := v_1.Args[0] 1680 v.reset(OpARMADDshiftRA) 1681 v.AuxInt = c 1682 v.AddArg(x) 1683 v.AddArg(y) 1684 return true 1685 } 1686 // match: (ADD (SRAconst [c] y) x) 1687 // cond: 1688 // result: (ADDshiftRA x y [c]) 1689 for { 1690 v_0 := v.Args[0] 1691 if v_0.Op != OpARMSRAconst { 1692 break 1693 } 1694 c := v_0.AuxInt 1695 y := v_0.Args[0] 1696 x := v.Args[1] 1697 v.reset(OpARMADDshiftRA) 1698 v.AuxInt = c 1699 v.AddArg(x) 1700 v.AddArg(y) 1701 return true 1702 } 1703 // match: (ADD x (SLL y z)) 1704 // cond: 1705 // result: (ADDshiftLLreg x y z) 1706 for { 1707 x := v.Args[0] 1708 v_1 := v.Args[1] 1709 if v_1.Op != OpARMSLL { 1710 break 1711 } 1712 y := v_1.Args[0] 1713 z := v_1.Args[1] 1714 v.reset(OpARMADDshiftLLreg) 1715 v.AddArg(x) 1716 v.AddArg(y) 1717 v.AddArg(z) 1718 return true 1719 } 1720 // match: (ADD (SLL y z) x) 1721 // cond: 1722 // result: (ADDshiftLLreg x y z) 1723 for { 1724 v_0 := v.Args[0] 1725 if v_0.Op != OpARMSLL { 1726 break 1727 } 1728 y := v_0.Args[0] 1729 z := v_0.Args[1] 1730 x := v.Args[1] 1731 v.reset(OpARMADDshiftLLreg) 1732 v.AddArg(x) 1733 v.AddArg(y) 1734 v.AddArg(z) 1735 return true 1736 } 1737 return false 1738 } 1739 func rewriteValueARM_OpARMADD_10(v *Value) bool { 1740 b := v.Block 1741 _ = b 1742 // match: (ADD x (SRL y z)) 1743 // cond: 1744 // result: (ADDshiftRLreg x y z) 1745 for { 1746 x := v.Args[0] 1747 v_1 := v.Args[1] 1748 if v_1.Op != OpARMSRL { 1749 break 1750 } 1751 y := v_1.Args[0] 1752 z := v_1.Args[1] 1753 v.reset(OpARMADDshiftRLreg) 1754 v.AddArg(x) 1755 v.AddArg(y) 1756 v.AddArg(z) 1757 return true 1758 } 1759 // match: (ADD (SRL y z) x) 1760 // cond: 1761 // result: (ADDshiftRLreg x y z) 1762 for { 1763 v_0 := v.Args[0] 1764 if v_0.Op != OpARMSRL { 1765 break 1766 } 1767 y := v_0.Args[0] 1768 z := v_0.Args[1] 1769 x := v.Args[1] 1770 v.reset(OpARMADDshiftRLreg) 1771 v.AddArg(x) 1772 v.AddArg(y) 1773 v.AddArg(z) 1774 return true 1775 } 1776 // match: (ADD x (SRA y z)) 1777 // cond: 1778 // result: (ADDshiftRAreg x y z) 1779 for { 1780 x := v.Args[0] 1781 v_1 := v.Args[1] 1782 if v_1.Op != OpARMSRA { 1783 break 1784 } 1785 y := v_1.Args[0] 1786 z := v_1.Args[1] 1787 v.reset(OpARMADDshiftRAreg) 1788 v.AddArg(x) 1789 v.AddArg(y) 1790 v.AddArg(z) 1791 return true 1792 } 1793 // match: (ADD (SRA y z) x) 1794 // cond: 1795 // result: (ADDshiftRAreg x y z) 1796 for { 1797 v_0 := v.Args[0] 1798 if v_0.Op != OpARMSRA { 1799 break 1800 } 1801 y := v_0.Args[0] 1802 z := v_0.Args[1] 1803 x := v.Args[1] 1804 v.reset(OpARMADDshiftRAreg) 1805 v.AddArg(x) 1806 v.AddArg(y) 1807 v.AddArg(z) 1808 return true 1809 } 1810 // match: (ADD x (RSBconst [0] y)) 1811 // cond: 1812 // result: (SUB x y) 1813 for { 1814 x := v.Args[0] 1815 v_1 := v.Args[1] 1816 if v_1.Op != OpARMRSBconst { 1817 break 1818 } 1819 if v_1.AuxInt != 0 { 1820 break 1821 } 1822 y := v_1.Args[0] 1823 v.reset(OpARMSUB) 1824 v.AddArg(x) 1825 v.AddArg(y) 1826 return true 1827 } 1828 // match: (ADD (RSBconst [0] y) x) 1829 // cond: 1830 // result: (SUB x y) 1831 for { 1832 v_0 := v.Args[0] 1833 if v_0.Op != OpARMRSBconst { 1834 break 1835 } 1836 if v_0.AuxInt != 0 { 1837 break 1838 } 1839 y := v_0.Args[0] 1840 x := v.Args[1] 1841 v.reset(OpARMSUB) 1842 v.AddArg(x) 1843 v.AddArg(y) 1844 return true 1845 } 1846 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 1847 // cond: 1848 // result: (RSBconst [c+d] (ADD <t> x y)) 1849 for { 1850 t := v.Type 1851 v_0 := v.Args[0] 1852 if v_0.Op != OpARMRSBconst { 1853 break 1854 } 1855 c := v_0.AuxInt 1856 x := v_0.Args[0] 1857 v_1 := v.Args[1] 1858 if v_1.Op != OpARMRSBconst { 1859 break 1860 } 1861 d := v_1.AuxInt 1862 y := v_1.Args[0] 1863 v.reset(OpARMRSBconst) 1864 v.AuxInt = c + d 1865 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1866 v0.AddArg(x) 1867 v0.AddArg(y) 1868 v.AddArg(v0) 1869 return true 1870 } 1871 // match: (ADD <t> (RSBconst [d] y) (RSBconst [c] x)) 1872 // cond: 1873 // result: (RSBconst [c+d] (ADD <t> x y)) 1874 for { 1875 t := v.Type 1876 v_0 := v.Args[0] 1877 if v_0.Op != OpARMRSBconst { 1878 break 1879 } 1880 d := v_0.AuxInt 1881 y := v_0.Args[0] 1882 v_1 := v.Args[1] 1883 if v_1.Op != OpARMRSBconst { 1884 break 1885 } 1886 c := v_1.AuxInt 1887 x := v_1.Args[0] 1888 v.reset(OpARMRSBconst) 1889 v.AuxInt = c + d 1890 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1891 v0.AddArg(x) 1892 v0.AddArg(y) 1893 v.AddArg(v0) 1894 return true 1895 } 1896 // match: (ADD (MUL x y) a) 1897 // cond: 1898 // result: (MULA x y a) 1899 for { 1900 v_0 := v.Args[0] 1901 if v_0.Op != OpARMMUL { 1902 break 1903 } 1904 x := v_0.Args[0] 1905 y := v_0.Args[1] 1906 a := v.Args[1] 1907 v.reset(OpARMMULA) 1908 v.AddArg(x) 1909 v.AddArg(y) 1910 v.AddArg(a) 1911 return true 1912 } 1913 // match: (ADD a (MUL x y)) 1914 // cond: 1915 // result: (MULA x y a) 1916 for { 1917 a := v.Args[0] 1918 v_1 := v.Args[1] 1919 if v_1.Op != OpARMMUL { 1920 break 1921 } 1922 x := v_1.Args[0] 1923 y := v_1.Args[1] 1924 v.reset(OpARMMULA) 1925 v.AddArg(x) 1926 v.AddArg(y) 1927 v.AddArg(a) 1928 return true 1929 } 1930 return false 1931 } 1932 func rewriteValueARM_OpARMADDS_0(v *Value) bool { 1933 // match: (ADDS x (MOVWconst [c])) 1934 // cond: 1935 // result: (ADDSconst [c] x) 1936 for { 1937 x := v.Args[0] 1938 v_1 := v.Args[1] 1939 if v_1.Op != OpARMMOVWconst { 1940 break 1941 } 1942 c := v_1.AuxInt 1943 v.reset(OpARMADDSconst) 1944 v.AuxInt = c 1945 v.AddArg(x) 1946 return true 1947 } 1948 // match: (ADDS (MOVWconst [c]) x) 1949 // cond: 1950 // result: (ADDSconst [c] x) 1951 for { 1952 v_0 := v.Args[0] 1953 if v_0.Op != OpARMMOVWconst { 1954 break 1955 } 1956 c := v_0.AuxInt 1957 x := v.Args[1] 1958 v.reset(OpARMADDSconst) 1959 v.AuxInt = c 1960 v.AddArg(x) 1961 return true 1962 } 1963 // match: (ADDS x (SLLconst [c] y)) 1964 // cond: 1965 // result: (ADDSshiftLL x y [c]) 1966 for { 1967 x := v.Args[0] 1968 v_1 := v.Args[1] 1969 if v_1.Op != OpARMSLLconst { 1970 break 1971 } 1972 c := v_1.AuxInt 1973 y := v_1.Args[0] 1974 v.reset(OpARMADDSshiftLL) 1975 v.AuxInt = c 1976 v.AddArg(x) 1977 v.AddArg(y) 1978 return true 1979 } 1980 // match: (ADDS (SLLconst [c] y) x) 1981 // cond: 1982 // result: (ADDSshiftLL x y [c]) 1983 for { 1984 v_0 := v.Args[0] 1985 if v_0.Op != OpARMSLLconst { 1986 break 1987 } 1988 c := v_0.AuxInt 1989 y := v_0.Args[0] 1990 x := v.Args[1] 1991 v.reset(OpARMADDSshiftLL) 1992 v.AuxInt = c 1993 v.AddArg(x) 1994 v.AddArg(y) 1995 return true 1996 } 1997 // match: (ADDS x (SRLconst [c] y)) 1998 // cond: 1999 // result: (ADDSshiftRL x y [c]) 2000 for { 2001 x := v.Args[0] 2002 v_1 := v.Args[1] 2003 if v_1.Op != OpARMSRLconst { 2004 break 2005 } 2006 c := v_1.AuxInt 2007 y := v_1.Args[0] 2008 v.reset(OpARMADDSshiftRL) 2009 v.AuxInt = c 2010 v.AddArg(x) 2011 v.AddArg(y) 2012 return true 2013 } 2014 // match: (ADDS (SRLconst [c] y) x) 2015 // cond: 2016 // result: (ADDSshiftRL x y [c]) 2017 for { 2018 v_0 := v.Args[0] 2019 if v_0.Op != OpARMSRLconst { 2020 break 2021 } 2022 c := v_0.AuxInt 2023 y := v_0.Args[0] 2024 x := v.Args[1] 2025 v.reset(OpARMADDSshiftRL) 2026 v.AuxInt = c 2027 v.AddArg(x) 2028 v.AddArg(y) 2029 return true 2030 } 2031 // match: (ADDS x (SRAconst [c] y)) 2032 // cond: 2033 // result: (ADDSshiftRA x y [c]) 2034 for { 2035 x := v.Args[0] 2036 v_1 := v.Args[1] 2037 if v_1.Op != OpARMSRAconst { 2038 break 2039 } 2040 c := v_1.AuxInt 2041 y := v_1.Args[0] 2042 v.reset(OpARMADDSshiftRA) 2043 v.AuxInt = c 2044 v.AddArg(x) 2045 v.AddArg(y) 2046 return true 2047 } 2048 // match: (ADDS (SRAconst [c] y) x) 2049 // cond: 2050 // result: (ADDSshiftRA x y [c]) 2051 for { 2052 v_0 := v.Args[0] 2053 if v_0.Op != OpARMSRAconst { 2054 break 2055 } 2056 c := v_0.AuxInt 2057 y := v_0.Args[0] 2058 x := v.Args[1] 2059 v.reset(OpARMADDSshiftRA) 2060 v.AuxInt = c 2061 v.AddArg(x) 2062 v.AddArg(y) 2063 return true 2064 } 2065 // match: (ADDS x (SLL y z)) 2066 // cond: 2067 // result: (ADDSshiftLLreg x y z) 2068 for { 2069 x := v.Args[0] 2070 v_1 := v.Args[1] 2071 if v_1.Op != OpARMSLL { 2072 break 2073 } 2074 y := v_1.Args[0] 2075 z := v_1.Args[1] 2076 v.reset(OpARMADDSshiftLLreg) 2077 v.AddArg(x) 2078 v.AddArg(y) 2079 v.AddArg(z) 2080 return true 2081 } 2082 // match: (ADDS (SLL y z) x) 2083 // cond: 2084 // result: (ADDSshiftLLreg x y z) 2085 for { 2086 v_0 := v.Args[0] 2087 if v_0.Op != OpARMSLL { 2088 break 2089 } 2090 y := v_0.Args[0] 2091 z := v_0.Args[1] 2092 x := v.Args[1] 2093 v.reset(OpARMADDSshiftLLreg) 2094 v.AddArg(x) 2095 v.AddArg(y) 2096 v.AddArg(z) 2097 return true 2098 } 2099 return false 2100 } 2101 func rewriteValueARM_OpARMADDS_10(v *Value) bool { 2102 // match: (ADDS x (SRL y z)) 2103 // cond: 2104 // result: (ADDSshiftRLreg x y z) 2105 for { 2106 x := v.Args[0] 2107 v_1 := v.Args[1] 2108 if v_1.Op != OpARMSRL { 2109 break 2110 } 2111 y := v_1.Args[0] 2112 z := v_1.Args[1] 2113 v.reset(OpARMADDSshiftRLreg) 2114 v.AddArg(x) 2115 v.AddArg(y) 2116 v.AddArg(z) 2117 return true 2118 } 2119 // match: (ADDS (SRL y z) x) 2120 // cond: 2121 // result: (ADDSshiftRLreg x y z) 2122 for { 2123 v_0 := v.Args[0] 2124 if v_0.Op != OpARMSRL { 2125 break 2126 } 2127 y := v_0.Args[0] 2128 z := v_0.Args[1] 2129 x := v.Args[1] 2130 v.reset(OpARMADDSshiftRLreg) 2131 v.AddArg(x) 2132 v.AddArg(y) 2133 v.AddArg(z) 2134 return true 2135 } 2136 // match: (ADDS x (SRA y z)) 2137 // cond: 2138 // result: (ADDSshiftRAreg x y z) 2139 for { 2140 x := v.Args[0] 2141 v_1 := v.Args[1] 2142 if v_1.Op != OpARMSRA { 2143 break 2144 } 2145 y := v_1.Args[0] 2146 z := v_1.Args[1] 2147 v.reset(OpARMADDSshiftRAreg) 2148 v.AddArg(x) 2149 v.AddArg(y) 2150 v.AddArg(z) 2151 return true 2152 } 2153 // match: (ADDS (SRA y z) x) 2154 // cond: 2155 // result: (ADDSshiftRAreg x y z) 2156 for { 2157 v_0 := v.Args[0] 2158 if v_0.Op != OpARMSRA { 2159 break 2160 } 2161 y := v_0.Args[0] 2162 z := v_0.Args[1] 2163 x := v.Args[1] 2164 v.reset(OpARMADDSshiftRAreg) 2165 v.AddArg(x) 2166 v.AddArg(y) 2167 v.AddArg(z) 2168 return true 2169 } 2170 return false 2171 } 2172 func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { 2173 b := v.Block 2174 _ = b 2175 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 2176 // cond: 2177 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 2178 for { 2179 d := v.AuxInt 2180 v_0 := v.Args[0] 2181 if v_0.Op != OpARMMOVWconst { 2182 break 2183 } 2184 c := v_0.AuxInt 2185 x := v.Args[1] 2186 v.reset(OpARMADDSconst) 2187 v.AuxInt = c 2188 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2189 v0.AuxInt = d 2190 v0.AddArg(x) 2191 v.AddArg(v0) 2192 return true 2193 } 2194 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 2195 // cond: 2196 // result: (ADDSconst x [int64(uint32(c)<<uint64(d))]) 2197 for { 2198 d := v.AuxInt 2199 x := v.Args[0] 2200 v_1 := v.Args[1] 2201 if v_1.Op != OpARMMOVWconst { 2202 break 2203 } 2204 c := v_1.AuxInt 2205 v.reset(OpARMADDSconst) 2206 v.AuxInt = int64(uint32(c) << uint64(d)) 2207 v.AddArg(x) 2208 return true 2209 } 2210 return false 2211 } 2212 func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { 2213 b := v.Block 2214 _ = b 2215 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 2216 // cond: 2217 // result: (ADDSconst [c] (SLL <x.Type> x y)) 2218 for { 2219 v_0 := v.Args[0] 2220 if v_0.Op != OpARMMOVWconst { 2221 break 2222 } 2223 c := v_0.AuxInt 2224 x := v.Args[1] 2225 y := v.Args[2] 2226 v.reset(OpARMADDSconst) 2227 v.AuxInt = c 2228 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2229 v0.AddArg(x) 2230 v0.AddArg(y) 2231 v.AddArg(v0) 2232 return true 2233 } 2234 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 2235 // cond: 2236 // result: (ADDSshiftLL x y [c]) 2237 for { 2238 x := v.Args[0] 2239 y := v.Args[1] 2240 v_2 := v.Args[2] 2241 if v_2.Op != OpARMMOVWconst { 2242 break 2243 } 2244 c := v_2.AuxInt 2245 v.reset(OpARMADDSshiftLL) 2246 v.AuxInt = c 2247 v.AddArg(x) 2248 v.AddArg(y) 2249 return true 2250 } 2251 return false 2252 } 2253 func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { 2254 b := v.Block 2255 _ = b 2256 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 2257 // cond: 2258 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 2259 for { 2260 d := v.AuxInt 2261 v_0 := v.Args[0] 2262 if v_0.Op != OpARMMOVWconst { 2263 break 2264 } 2265 c := v_0.AuxInt 2266 x := v.Args[1] 2267 v.reset(OpARMADDSconst) 2268 v.AuxInt = c 2269 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2270 v0.AuxInt = d 2271 v0.AddArg(x) 2272 v.AddArg(v0) 2273 return true 2274 } 2275 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 2276 // cond: 2277 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 2278 for { 2279 d := v.AuxInt 2280 x := v.Args[0] 2281 v_1 := v.Args[1] 2282 if v_1.Op != OpARMMOVWconst { 2283 break 2284 } 2285 c := v_1.AuxInt 2286 v.reset(OpARMADDSconst) 2287 v.AuxInt = int64(int32(c) >> uint64(d)) 2288 v.AddArg(x) 2289 return true 2290 } 2291 return false 2292 } 2293 func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { 2294 b := v.Block 2295 _ = b 2296 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 2297 // cond: 2298 // result: (ADDSconst [c] (SRA <x.Type> x y)) 2299 for { 2300 v_0 := v.Args[0] 2301 if v_0.Op != OpARMMOVWconst { 2302 break 2303 } 2304 c := v_0.AuxInt 2305 x := v.Args[1] 2306 y := v.Args[2] 2307 v.reset(OpARMADDSconst) 2308 v.AuxInt = c 2309 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2310 v0.AddArg(x) 2311 v0.AddArg(y) 2312 v.AddArg(v0) 2313 return true 2314 } 2315 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 2316 // cond: 2317 // result: (ADDSshiftRA x y [c]) 2318 for { 2319 x := v.Args[0] 2320 y := v.Args[1] 2321 v_2 := v.Args[2] 2322 if v_2.Op != OpARMMOVWconst { 2323 break 2324 } 2325 c := v_2.AuxInt 2326 v.reset(OpARMADDSshiftRA) 2327 v.AuxInt = c 2328 v.AddArg(x) 2329 v.AddArg(y) 2330 return true 2331 } 2332 return false 2333 } 2334 func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { 2335 b := v.Block 2336 _ = b 2337 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2338 // cond: 2339 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2340 for { 2341 d := v.AuxInt 2342 v_0 := v.Args[0] 2343 if v_0.Op != OpARMMOVWconst { 2344 break 2345 } 2346 c := v_0.AuxInt 2347 x := v.Args[1] 2348 v.reset(OpARMADDSconst) 2349 v.AuxInt = c 2350 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2351 v0.AuxInt = d 2352 v0.AddArg(x) 2353 v.AddArg(v0) 2354 return true 2355 } 2356 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2357 // cond: 2358 // result: (ADDSconst x [int64(uint32(c)>>uint64(d))]) 2359 for { 2360 d := v.AuxInt 2361 x := v.Args[0] 2362 v_1 := v.Args[1] 2363 if v_1.Op != OpARMMOVWconst { 2364 break 2365 } 2366 c := v_1.AuxInt 2367 v.reset(OpARMADDSconst) 2368 v.AuxInt = int64(uint32(c) >> uint64(d)) 2369 v.AddArg(x) 2370 return true 2371 } 2372 return false 2373 } 2374 func rewriteValueARM_OpARMADDSshiftRLreg_0(v *Value) bool { 2375 b := v.Block 2376 _ = b 2377 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2378 // cond: 2379 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2380 for { 2381 v_0 := v.Args[0] 2382 if v_0.Op != OpARMMOVWconst { 2383 break 2384 } 2385 c := v_0.AuxInt 2386 x := v.Args[1] 2387 y := v.Args[2] 2388 v.reset(OpARMADDSconst) 2389 v.AuxInt = c 2390 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2391 v0.AddArg(x) 2392 v0.AddArg(y) 2393 v.AddArg(v0) 2394 return true 2395 } 2396 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2397 // cond: 2398 // result: (ADDSshiftRL x y [c]) 2399 for { 2400 x := v.Args[0] 2401 y := v.Args[1] 2402 v_2 := v.Args[2] 2403 if v_2.Op != OpARMMOVWconst { 2404 break 2405 } 2406 c := v_2.AuxInt 2407 v.reset(OpARMADDSshiftRL) 2408 v.AuxInt = c 2409 v.AddArg(x) 2410 v.AddArg(y) 2411 return true 2412 } 2413 return false 2414 } 2415 func rewriteValueARM_OpARMADDconst_0(v *Value) bool { 2416 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2417 // cond: 2418 // result: (MOVWaddr [off1+off2] {sym} ptr) 2419 for { 2420 off1 := v.AuxInt 2421 v_0 := v.Args[0] 2422 if v_0.Op != OpARMMOVWaddr { 2423 break 2424 } 2425 off2 := v_0.AuxInt 2426 sym := v_0.Aux 2427 ptr := v_0.Args[0] 2428 v.reset(OpARMMOVWaddr) 2429 v.AuxInt = off1 + off2 2430 v.Aux = sym 2431 v.AddArg(ptr) 2432 return true 2433 } 2434 // match: (ADDconst [0] x) 2435 // cond: 2436 // result: x 2437 for { 2438 if v.AuxInt != 0 { 2439 break 2440 } 2441 x := v.Args[0] 2442 v.reset(OpCopy) 2443 v.Type = x.Type 2444 v.AddArg(x) 2445 return true 2446 } 2447 // match: (ADDconst [c] (MOVWconst [d])) 2448 // cond: 2449 // result: (MOVWconst [int64(int32(c+d))]) 2450 for { 2451 c := v.AuxInt 2452 v_0 := v.Args[0] 2453 if v_0.Op != OpARMMOVWconst { 2454 break 2455 } 2456 d := v_0.AuxInt 2457 v.reset(OpARMMOVWconst) 2458 v.AuxInt = int64(int32(c + d)) 2459 return true 2460 } 2461 // match: (ADDconst [c] (ADDconst [d] x)) 2462 // cond: 2463 // result: (ADDconst [int64(int32(c+d))] x) 2464 for { 2465 c := v.AuxInt 2466 v_0 := v.Args[0] 2467 if v_0.Op != OpARMADDconst { 2468 break 2469 } 2470 d := v_0.AuxInt 2471 x := v_0.Args[0] 2472 v.reset(OpARMADDconst) 2473 v.AuxInt = int64(int32(c + d)) 2474 v.AddArg(x) 2475 return true 2476 } 2477 // match: (ADDconst [c] (SUBconst [d] x)) 2478 // cond: 2479 // result: (ADDconst [int64(int32(c-d))] x) 2480 for { 2481 c := v.AuxInt 2482 v_0 := v.Args[0] 2483 if v_0.Op != OpARMSUBconst { 2484 break 2485 } 2486 d := v_0.AuxInt 2487 x := v_0.Args[0] 2488 v.reset(OpARMADDconst) 2489 v.AuxInt = int64(int32(c - d)) 2490 v.AddArg(x) 2491 return true 2492 } 2493 // match: (ADDconst [c] (RSBconst [d] x)) 2494 // cond: 2495 // result: (RSBconst [int64(int32(c+d))] x) 2496 for { 2497 c := v.AuxInt 2498 v_0 := v.Args[0] 2499 if v_0.Op != OpARMRSBconst { 2500 break 2501 } 2502 d := v_0.AuxInt 2503 x := v_0.Args[0] 2504 v.reset(OpARMRSBconst) 2505 v.AuxInt = int64(int32(c + d)) 2506 v.AddArg(x) 2507 return true 2508 } 2509 return false 2510 } 2511 func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { 2512 b := v.Block 2513 _ = b 2514 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2515 // cond: 2516 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2517 for { 2518 d := v.AuxInt 2519 v_0 := v.Args[0] 2520 if v_0.Op != OpARMMOVWconst { 2521 break 2522 } 2523 c := v_0.AuxInt 2524 x := v.Args[1] 2525 v.reset(OpARMADDconst) 2526 v.AuxInt = c 2527 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2528 v0.AuxInt = d 2529 v0.AddArg(x) 2530 v.AddArg(v0) 2531 return true 2532 } 2533 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2534 // cond: 2535 // result: (ADDconst x [int64(uint32(c)<<uint64(d))]) 2536 for { 2537 d := v.AuxInt 2538 x := v.Args[0] 2539 v_1 := v.Args[1] 2540 if v_1.Op != OpARMMOVWconst { 2541 break 2542 } 2543 c := v_1.AuxInt 2544 v.reset(OpARMADDconst) 2545 v.AuxInt = int64(uint32(c) << uint64(d)) 2546 v.AddArg(x) 2547 return true 2548 } 2549 // match: (ADDshiftLL [c] (SRLconst x [32-c]) x) 2550 // cond: 2551 // result: (SRRconst [32-c] x) 2552 for { 2553 c := v.AuxInt 2554 v_0 := v.Args[0] 2555 if v_0.Op != OpARMSRLconst { 2556 break 2557 } 2558 if v_0.AuxInt != 32-c { 2559 break 2560 } 2561 x := v_0.Args[0] 2562 if x != v.Args[1] { 2563 break 2564 } 2565 v.reset(OpARMSRRconst) 2566 v.AuxInt = 32 - c 2567 v.AddArg(x) 2568 return true 2569 } 2570 return false 2571 } 2572 func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { 2573 b := v.Block 2574 _ = b 2575 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2576 // cond: 2577 // result: (ADDconst [c] (SLL <x.Type> x y)) 2578 for { 2579 v_0 := v.Args[0] 2580 if v_0.Op != OpARMMOVWconst { 2581 break 2582 } 2583 c := v_0.AuxInt 2584 x := v.Args[1] 2585 y := v.Args[2] 2586 v.reset(OpARMADDconst) 2587 v.AuxInt = c 2588 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2589 v0.AddArg(x) 2590 v0.AddArg(y) 2591 v.AddArg(v0) 2592 return true 2593 } 2594 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2595 // cond: 2596 // result: (ADDshiftLL x y [c]) 2597 for { 2598 x := v.Args[0] 2599 y := v.Args[1] 2600 v_2 := v.Args[2] 2601 if v_2.Op != OpARMMOVWconst { 2602 break 2603 } 2604 c := v_2.AuxInt 2605 v.reset(OpARMADDshiftLL) 2606 v.AuxInt = c 2607 v.AddArg(x) 2608 v.AddArg(y) 2609 return true 2610 } 2611 return false 2612 } 2613 func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { 2614 b := v.Block 2615 _ = b 2616 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 2617 // cond: 2618 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 2619 for { 2620 d := v.AuxInt 2621 v_0 := v.Args[0] 2622 if v_0.Op != OpARMMOVWconst { 2623 break 2624 } 2625 c := v_0.AuxInt 2626 x := v.Args[1] 2627 v.reset(OpARMADDconst) 2628 v.AuxInt = c 2629 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2630 v0.AuxInt = d 2631 v0.AddArg(x) 2632 v.AddArg(v0) 2633 return true 2634 } 2635 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 2636 // cond: 2637 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 2638 for { 2639 d := v.AuxInt 2640 x := v.Args[0] 2641 v_1 := v.Args[1] 2642 if v_1.Op != OpARMMOVWconst { 2643 break 2644 } 2645 c := v_1.AuxInt 2646 v.reset(OpARMADDconst) 2647 v.AuxInt = int64(int32(c) >> uint64(d)) 2648 v.AddArg(x) 2649 return true 2650 } 2651 return false 2652 } 2653 func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { 2654 b := v.Block 2655 _ = b 2656 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 2657 // cond: 2658 // result: (ADDconst [c] (SRA <x.Type> x y)) 2659 for { 2660 v_0 := v.Args[0] 2661 if v_0.Op != OpARMMOVWconst { 2662 break 2663 } 2664 c := v_0.AuxInt 2665 x := v.Args[1] 2666 y := v.Args[2] 2667 v.reset(OpARMADDconst) 2668 v.AuxInt = c 2669 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2670 v0.AddArg(x) 2671 v0.AddArg(y) 2672 v.AddArg(v0) 2673 return true 2674 } 2675 // match: (ADDshiftRAreg x y (MOVWconst [c])) 2676 // cond: 2677 // result: (ADDshiftRA x y [c]) 2678 for { 2679 x := v.Args[0] 2680 y := v.Args[1] 2681 v_2 := v.Args[2] 2682 if v_2.Op != OpARMMOVWconst { 2683 break 2684 } 2685 c := v_2.AuxInt 2686 v.reset(OpARMADDshiftRA) 2687 v.AuxInt = c 2688 v.AddArg(x) 2689 v.AddArg(y) 2690 return true 2691 } 2692 return false 2693 } 2694 func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { 2695 b := v.Block 2696 _ = b 2697 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 2698 // cond: 2699 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 2700 for { 2701 d := v.AuxInt 2702 v_0 := v.Args[0] 2703 if v_0.Op != OpARMMOVWconst { 2704 break 2705 } 2706 c := v_0.AuxInt 2707 x := v.Args[1] 2708 v.reset(OpARMADDconst) 2709 v.AuxInt = c 2710 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2711 v0.AuxInt = d 2712 v0.AddArg(x) 2713 v.AddArg(v0) 2714 return true 2715 } 2716 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 2717 // cond: 2718 // result: (ADDconst x [int64(uint32(c)>>uint64(d))]) 2719 for { 2720 d := v.AuxInt 2721 x := v.Args[0] 2722 v_1 := v.Args[1] 2723 if v_1.Op != OpARMMOVWconst { 2724 break 2725 } 2726 c := v_1.AuxInt 2727 v.reset(OpARMADDconst) 2728 v.AuxInt = int64(uint32(c) >> uint64(d)) 2729 v.AddArg(x) 2730 return true 2731 } 2732 // match: (ADDshiftRL [c] (SLLconst x [32-c]) x) 2733 // cond: 2734 // result: (SRRconst [ c] x) 2735 for { 2736 c := v.AuxInt 2737 v_0 := v.Args[0] 2738 if v_0.Op != OpARMSLLconst { 2739 break 2740 } 2741 if v_0.AuxInt != 32-c { 2742 break 2743 } 2744 x := v_0.Args[0] 2745 if x != v.Args[1] { 2746 break 2747 } 2748 v.reset(OpARMSRRconst) 2749 v.AuxInt = c 2750 v.AddArg(x) 2751 return true 2752 } 2753 return false 2754 } 2755 func rewriteValueARM_OpARMADDshiftRLreg_0(v *Value) bool { 2756 b := v.Block 2757 _ = b 2758 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 2759 // cond: 2760 // result: (ADDconst [c] (SRL <x.Type> x y)) 2761 for { 2762 v_0 := v.Args[0] 2763 if v_0.Op != OpARMMOVWconst { 2764 break 2765 } 2766 c := v_0.AuxInt 2767 x := v.Args[1] 2768 y := v.Args[2] 2769 v.reset(OpARMADDconst) 2770 v.AuxInt = c 2771 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2772 v0.AddArg(x) 2773 v0.AddArg(y) 2774 v.AddArg(v0) 2775 return true 2776 } 2777 // match: (ADDshiftRLreg x y (MOVWconst [c])) 2778 // cond: 2779 // result: (ADDshiftRL x y [c]) 2780 for { 2781 x := v.Args[0] 2782 y := v.Args[1] 2783 v_2 := v.Args[2] 2784 if v_2.Op != OpARMMOVWconst { 2785 break 2786 } 2787 c := v_2.AuxInt 2788 v.reset(OpARMADDshiftRL) 2789 v.AuxInt = c 2790 v.AddArg(x) 2791 v.AddArg(y) 2792 return true 2793 } 2794 return false 2795 } 2796 func rewriteValueARM_OpARMAND_0(v *Value) bool { 2797 // match: (AND x (MOVWconst [c])) 2798 // cond: 2799 // result: (ANDconst [c] x) 2800 for { 2801 x := v.Args[0] 2802 v_1 := v.Args[1] 2803 if v_1.Op != OpARMMOVWconst { 2804 break 2805 } 2806 c := v_1.AuxInt 2807 v.reset(OpARMANDconst) 2808 v.AuxInt = c 2809 v.AddArg(x) 2810 return true 2811 } 2812 // match: (AND (MOVWconst [c]) x) 2813 // cond: 2814 // result: (ANDconst [c] x) 2815 for { 2816 v_0 := v.Args[0] 2817 if v_0.Op != OpARMMOVWconst { 2818 break 2819 } 2820 c := v_0.AuxInt 2821 x := v.Args[1] 2822 v.reset(OpARMANDconst) 2823 v.AuxInt = c 2824 v.AddArg(x) 2825 return true 2826 } 2827 // match: (AND x (SLLconst [c] y)) 2828 // cond: 2829 // result: (ANDshiftLL x y [c]) 2830 for { 2831 x := v.Args[0] 2832 v_1 := v.Args[1] 2833 if v_1.Op != OpARMSLLconst { 2834 break 2835 } 2836 c := v_1.AuxInt 2837 y := v_1.Args[0] 2838 v.reset(OpARMANDshiftLL) 2839 v.AuxInt = c 2840 v.AddArg(x) 2841 v.AddArg(y) 2842 return true 2843 } 2844 // match: (AND (SLLconst [c] y) x) 2845 // cond: 2846 // result: (ANDshiftLL x y [c]) 2847 for { 2848 v_0 := v.Args[0] 2849 if v_0.Op != OpARMSLLconst { 2850 break 2851 } 2852 c := v_0.AuxInt 2853 y := v_0.Args[0] 2854 x := v.Args[1] 2855 v.reset(OpARMANDshiftLL) 2856 v.AuxInt = c 2857 v.AddArg(x) 2858 v.AddArg(y) 2859 return true 2860 } 2861 // match: (AND x (SRLconst [c] y)) 2862 // cond: 2863 // result: (ANDshiftRL x y [c]) 2864 for { 2865 x := v.Args[0] 2866 v_1 := v.Args[1] 2867 if v_1.Op != OpARMSRLconst { 2868 break 2869 } 2870 c := v_1.AuxInt 2871 y := v_1.Args[0] 2872 v.reset(OpARMANDshiftRL) 2873 v.AuxInt = c 2874 v.AddArg(x) 2875 v.AddArg(y) 2876 return true 2877 } 2878 // match: (AND (SRLconst [c] y) x) 2879 // cond: 2880 // result: (ANDshiftRL x y [c]) 2881 for { 2882 v_0 := v.Args[0] 2883 if v_0.Op != OpARMSRLconst { 2884 break 2885 } 2886 c := v_0.AuxInt 2887 y := v_0.Args[0] 2888 x := v.Args[1] 2889 v.reset(OpARMANDshiftRL) 2890 v.AuxInt = c 2891 v.AddArg(x) 2892 v.AddArg(y) 2893 return true 2894 } 2895 // match: (AND x (SRAconst [c] y)) 2896 // cond: 2897 // result: (ANDshiftRA x y [c]) 2898 for { 2899 x := v.Args[0] 2900 v_1 := v.Args[1] 2901 if v_1.Op != OpARMSRAconst { 2902 break 2903 } 2904 c := v_1.AuxInt 2905 y := v_1.Args[0] 2906 v.reset(OpARMANDshiftRA) 2907 v.AuxInt = c 2908 v.AddArg(x) 2909 v.AddArg(y) 2910 return true 2911 } 2912 // match: (AND (SRAconst [c] y) x) 2913 // cond: 2914 // result: (ANDshiftRA x y [c]) 2915 for { 2916 v_0 := v.Args[0] 2917 if v_0.Op != OpARMSRAconst { 2918 break 2919 } 2920 c := v_0.AuxInt 2921 y := v_0.Args[0] 2922 x := v.Args[1] 2923 v.reset(OpARMANDshiftRA) 2924 v.AuxInt = c 2925 v.AddArg(x) 2926 v.AddArg(y) 2927 return true 2928 } 2929 // match: (AND x (SLL y z)) 2930 // cond: 2931 // result: (ANDshiftLLreg x y z) 2932 for { 2933 x := v.Args[0] 2934 v_1 := v.Args[1] 2935 if v_1.Op != OpARMSLL { 2936 break 2937 } 2938 y := v_1.Args[0] 2939 z := v_1.Args[1] 2940 v.reset(OpARMANDshiftLLreg) 2941 v.AddArg(x) 2942 v.AddArg(y) 2943 v.AddArg(z) 2944 return true 2945 } 2946 // match: (AND (SLL y z) x) 2947 // cond: 2948 // result: (ANDshiftLLreg x y z) 2949 for { 2950 v_0 := v.Args[0] 2951 if v_0.Op != OpARMSLL { 2952 break 2953 } 2954 y := v_0.Args[0] 2955 z := v_0.Args[1] 2956 x := v.Args[1] 2957 v.reset(OpARMANDshiftLLreg) 2958 v.AddArg(x) 2959 v.AddArg(y) 2960 v.AddArg(z) 2961 return true 2962 } 2963 return false 2964 } 2965 func rewriteValueARM_OpARMAND_10(v *Value) bool { 2966 // match: (AND x (SRL y z)) 2967 // cond: 2968 // result: (ANDshiftRLreg x y z) 2969 for { 2970 x := v.Args[0] 2971 v_1 := v.Args[1] 2972 if v_1.Op != OpARMSRL { 2973 break 2974 } 2975 y := v_1.Args[0] 2976 z := v_1.Args[1] 2977 v.reset(OpARMANDshiftRLreg) 2978 v.AddArg(x) 2979 v.AddArg(y) 2980 v.AddArg(z) 2981 return true 2982 } 2983 // match: (AND (SRL y z) x) 2984 // cond: 2985 // result: (ANDshiftRLreg x y z) 2986 for { 2987 v_0 := v.Args[0] 2988 if v_0.Op != OpARMSRL { 2989 break 2990 } 2991 y := v_0.Args[0] 2992 z := v_0.Args[1] 2993 x := v.Args[1] 2994 v.reset(OpARMANDshiftRLreg) 2995 v.AddArg(x) 2996 v.AddArg(y) 2997 v.AddArg(z) 2998 return true 2999 } 3000 // match: (AND x (SRA y z)) 3001 // cond: 3002 // result: (ANDshiftRAreg x y z) 3003 for { 3004 x := v.Args[0] 3005 v_1 := v.Args[1] 3006 if v_1.Op != OpARMSRA { 3007 break 3008 } 3009 y := v_1.Args[0] 3010 z := v_1.Args[1] 3011 v.reset(OpARMANDshiftRAreg) 3012 v.AddArg(x) 3013 v.AddArg(y) 3014 v.AddArg(z) 3015 return true 3016 } 3017 // match: (AND (SRA y z) x) 3018 // cond: 3019 // result: (ANDshiftRAreg x y z) 3020 for { 3021 v_0 := v.Args[0] 3022 if v_0.Op != OpARMSRA { 3023 break 3024 } 3025 y := v_0.Args[0] 3026 z := v_0.Args[1] 3027 x := v.Args[1] 3028 v.reset(OpARMANDshiftRAreg) 3029 v.AddArg(x) 3030 v.AddArg(y) 3031 v.AddArg(z) 3032 return true 3033 } 3034 // match: (AND x x) 3035 // cond: 3036 // result: x 3037 for { 3038 x := v.Args[0] 3039 if x != v.Args[1] { 3040 break 3041 } 3042 v.reset(OpCopy) 3043 v.Type = x.Type 3044 v.AddArg(x) 3045 return true 3046 } 3047 // match: (AND x (MVN y)) 3048 // cond: 3049 // result: (BIC x y) 3050 for { 3051 x := v.Args[0] 3052 v_1 := v.Args[1] 3053 if v_1.Op != OpARMMVN { 3054 break 3055 } 3056 y := v_1.Args[0] 3057 v.reset(OpARMBIC) 3058 v.AddArg(x) 3059 v.AddArg(y) 3060 return true 3061 } 3062 // match: (AND (MVN y) x) 3063 // cond: 3064 // result: (BIC x y) 3065 for { 3066 v_0 := v.Args[0] 3067 if v_0.Op != OpARMMVN { 3068 break 3069 } 3070 y := v_0.Args[0] 3071 x := v.Args[1] 3072 v.reset(OpARMBIC) 3073 v.AddArg(x) 3074 v.AddArg(y) 3075 return true 3076 } 3077 // match: (AND x (MVNshiftLL y [c])) 3078 // cond: 3079 // result: (BICshiftLL x y [c]) 3080 for { 3081 x := v.Args[0] 3082 v_1 := v.Args[1] 3083 if v_1.Op != OpARMMVNshiftLL { 3084 break 3085 } 3086 c := v_1.AuxInt 3087 y := v_1.Args[0] 3088 v.reset(OpARMBICshiftLL) 3089 v.AuxInt = c 3090 v.AddArg(x) 3091 v.AddArg(y) 3092 return true 3093 } 3094 // match: (AND (MVNshiftLL y [c]) x) 3095 // cond: 3096 // result: (BICshiftLL x y [c]) 3097 for { 3098 v_0 := v.Args[0] 3099 if v_0.Op != OpARMMVNshiftLL { 3100 break 3101 } 3102 c := v_0.AuxInt 3103 y := v_0.Args[0] 3104 x := v.Args[1] 3105 v.reset(OpARMBICshiftLL) 3106 v.AuxInt = c 3107 v.AddArg(x) 3108 v.AddArg(y) 3109 return true 3110 } 3111 // match: (AND x (MVNshiftRL y [c])) 3112 // cond: 3113 // result: (BICshiftRL x y [c]) 3114 for { 3115 x := v.Args[0] 3116 v_1 := v.Args[1] 3117 if v_1.Op != OpARMMVNshiftRL { 3118 break 3119 } 3120 c := v_1.AuxInt 3121 y := v_1.Args[0] 3122 v.reset(OpARMBICshiftRL) 3123 v.AuxInt = c 3124 v.AddArg(x) 3125 v.AddArg(y) 3126 return true 3127 } 3128 return false 3129 } 3130 func rewriteValueARM_OpARMAND_20(v *Value) bool { 3131 // match: (AND (MVNshiftRL y [c]) x) 3132 // cond: 3133 // result: (BICshiftRL x y [c]) 3134 for { 3135 v_0 := v.Args[0] 3136 if v_0.Op != OpARMMVNshiftRL { 3137 break 3138 } 3139 c := v_0.AuxInt 3140 y := v_0.Args[0] 3141 x := v.Args[1] 3142 v.reset(OpARMBICshiftRL) 3143 v.AuxInt = c 3144 v.AddArg(x) 3145 v.AddArg(y) 3146 return true 3147 } 3148 // match: (AND x (MVNshiftRA y [c])) 3149 // cond: 3150 // result: (BICshiftRA x y [c]) 3151 for { 3152 x := v.Args[0] 3153 v_1 := v.Args[1] 3154 if v_1.Op != OpARMMVNshiftRA { 3155 break 3156 } 3157 c := v_1.AuxInt 3158 y := v_1.Args[0] 3159 v.reset(OpARMBICshiftRA) 3160 v.AuxInt = c 3161 v.AddArg(x) 3162 v.AddArg(y) 3163 return true 3164 } 3165 // match: (AND (MVNshiftRA y [c]) x) 3166 // cond: 3167 // result: (BICshiftRA x y [c]) 3168 for { 3169 v_0 := v.Args[0] 3170 if v_0.Op != OpARMMVNshiftRA { 3171 break 3172 } 3173 c := v_0.AuxInt 3174 y := v_0.Args[0] 3175 x := v.Args[1] 3176 v.reset(OpARMBICshiftRA) 3177 v.AuxInt = c 3178 v.AddArg(x) 3179 v.AddArg(y) 3180 return true 3181 } 3182 return false 3183 } 3184 func rewriteValueARM_OpARMANDconst_0(v *Value) bool { 3185 // match: (ANDconst [0] _) 3186 // cond: 3187 // result: (MOVWconst [0]) 3188 for { 3189 if v.AuxInt != 0 { 3190 break 3191 } 3192 v.reset(OpARMMOVWconst) 3193 v.AuxInt = 0 3194 return true 3195 } 3196 // match: (ANDconst [c] x) 3197 // cond: int32(c)==-1 3198 // result: x 3199 for { 3200 c := v.AuxInt 3201 x := v.Args[0] 3202 if !(int32(c) == -1) { 3203 break 3204 } 3205 v.reset(OpCopy) 3206 v.Type = x.Type 3207 v.AddArg(x) 3208 return true 3209 } 3210 // match: (ANDconst [c] (MOVWconst [d])) 3211 // cond: 3212 // result: (MOVWconst [c&d]) 3213 for { 3214 c := v.AuxInt 3215 v_0 := v.Args[0] 3216 if v_0.Op != OpARMMOVWconst { 3217 break 3218 } 3219 d := v_0.AuxInt 3220 v.reset(OpARMMOVWconst) 3221 v.AuxInt = c & d 3222 return true 3223 } 3224 // match: (ANDconst [c] (ANDconst [d] x)) 3225 // cond: 3226 // result: (ANDconst [c&d] x) 3227 for { 3228 c := v.AuxInt 3229 v_0 := v.Args[0] 3230 if v_0.Op != OpARMANDconst { 3231 break 3232 } 3233 d := v_0.AuxInt 3234 x := v_0.Args[0] 3235 v.reset(OpARMANDconst) 3236 v.AuxInt = c & d 3237 v.AddArg(x) 3238 return true 3239 } 3240 return false 3241 } 3242 func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { 3243 b := v.Block 3244 _ = b 3245 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 3246 // cond: 3247 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 3248 for { 3249 d := v.AuxInt 3250 v_0 := v.Args[0] 3251 if v_0.Op != OpARMMOVWconst { 3252 break 3253 } 3254 c := v_0.AuxInt 3255 x := v.Args[1] 3256 v.reset(OpARMANDconst) 3257 v.AuxInt = c 3258 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3259 v0.AuxInt = d 3260 v0.AddArg(x) 3261 v.AddArg(v0) 3262 return true 3263 } 3264 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 3265 // cond: 3266 // result: (ANDconst x [int64(uint32(c)<<uint64(d))]) 3267 for { 3268 d := v.AuxInt 3269 x := v.Args[0] 3270 v_1 := v.Args[1] 3271 if v_1.Op != OpARMMOVWconst { 3272 break 3273 } 3274 c := v_1.AuxInt 3275 v.reset(OpARMANDconst) 3276 v.AuxInt = int64(uint32(c) << uint64(d)) 3277 v.AddArg(x) 3278 return true 3279 } 3280 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 3281 // cond: c==d 3282 // result: y 3283 for { 3284 d := v.AuxInt 3285 x := v.Args[0] 3286 y := v.Args[1] 3287 if y.Op != OpARMSLLconst { 3288 break 3289 } 3290 c := y.AuxInt 3291 if x != y.Args[0] { 3292 break 3293 } 3294 if !(c == d) { 3295 break 3296 } 3297 v.reset(OpCopy) 3298 v.Type = y.Type 3299 v.AddArg(y) 3300 return true 3301 } 3302 return false 3303 } 3304 func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { 3305 b := v.Block 3306 _ = b 3307 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 3308 // cond: 3309 // result: (ANDconst [c] (SLL <x.Type> x y)) 3310 for { 3311 v_0 := v.Args[0] 3312 if v_0.Op != OpARMMOVWconst { 3313 break 3314 } 3315 c := v_0.AuxInt 3316 x := v.Args[1] 3317 y := v.Args[2] 3318 v.reset(OpARMANDconst) 3319 v.AuxInt = c 3320 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3321 v0.AddArg(x) 3322 v0.AddArg(y) 3323 v.AddArg(v0) 3324 return true 3325 } 3326 // match: (ANDshiftLLreg x y (MOVWconst [c])) 3327 // cond: 3328 // result: (ANDshiftLL x y [c]) 3329 for { 3330 x := v.Args[0] 3331 y := v.Args[1] 3332 v_2 := v.Args[2] 3333 if v_2.Op != OpARMMOVWconst { 3334 break 3335 } 3336 c := v_2.AuxInt 3337 v.reset(OpARMANDshiftLL) 3338 v.AuxInt = c 3339 v.AddArg(x) 3340 v.AddArg(y) 3341 return true 3342 } 3343 return false 3344 } 3345 func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { 3346 b := v.Block 3347 _ = b 3348 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 3349 // cond: 3350 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 3351 for { 3352 d := v.AuxInt 3353 v_0 := v.Args[0] 3354 if v_0.Op != OpARMMOVWconst { 3355 break 3356 } 3357 c := v_0.AuxInt 3358 x := v.Args[1] 3359 v.reset(OpARMANDconst) 3360 v.AuxInt = c 3361 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3362 v0.AuxInt = d 3363 v0.AddArg(x) 3364 v.AddArg(v0) 3365 return true 3366 } 3367 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3368 // cond: 3369 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3370 for { 3371 d := v.AuxInt 3372 x := v.Args[0] 3373 v_1 := v.Args[1] 3374 if v_1.Op != OpARMMOVWconst { 3375 break 3376 } 3377 c := v_1.AuxInt 3378 v.reset(OpARMANDconst) 3379 v.AuxInt = int64(int32(c) >> uint64(d)) 3380 v.AddArg(x) 3381 return true 3382 } 3383 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3384 // cond: c==d 3385 // result: y 3386 for { 3387 d := v.AuxInt 3388 x := v.Args[0] 3389 y := v.Args[1] 3390 if y.Op != OpARMSRAconst { 3391 break 3392 } 3393 c := y.AuxInt 3394 if x != y.Args[0] { 3395 break 3396 } 3397 if !(c == d) { 3398 break 3399 } 3400 v.reset(OpCopy) 3401 v.Type = y.Type 3402 v.AddArg(y) 3403 return true 3404 } 3405 return false 3406 } 3407 func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { 3408 b := v.Block 3409 _ = b 3410 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3411 // cond: 3412 // result: (ANDconst [c] (SRA <x.Type> x y)) 3413 for { 3414 v_0 := v.Args[0] 3415 if v_0.Op != OpARMMOVWconst { 3416 break 3417 } 3418 c := v_0.AuxInt 3419 x := v.Args[1] 3420 y := v.Args[2] 3421 v.reset(OpARMANDconst) 3422 v.AuxInt = c 3423 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3424 v0.AddArg(x) 3425 v0.AddArg(y) 3426 v.AddArg(v0) 3427 return true 3428 } 3429 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3430 // cond: 3431 // result: (ANDshiftRA x y [c]) 3432 for { 3433 x := v.Args[0] 3434 y := v.Args[1] 3435 v_2 := v.Args[2] 3436 if v_2.Op != OpARMMOVWconst { 3437 break 3438 } 3439 c := v_2.AuxInt 3440 v.reset(OpARMANDshiftRA) 3441 v.AuxInt = c 3442 v.AddArg(x) 3443 v.AddArg(y) 3444 return true 3445 } 3446 return false 3447 } 3448 func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { 3449 b := v.Block 3450 _ = b 3451 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3452 // cond: 3453 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3454 for { 3455 d := v.AuxInt 3456 v_0 := v.Args[0] 3457 if v_0.Op != OpARMMOVWconst { 3458 break 3459 } 3460 c := v_0.AuxInt 3461 x := v.Args[1] 3462 v.reset(OpARMANDconst) 3463 v.AuxInt = c 3464 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3465 v0.AuxInt = d 3466 v0.AddArg(x) 3467 v.AddArg(v0) 3468 return true 3469 } 3470 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3471 // cond: 3472 // result: (ANDconst x [int64(uint32(c)>>uint64(d))]) 3473 for { 3474 d := v.AuxInt 3475 x := v.Args[0] 3476 v_1 := v.Args[1] 3477 if v_1.Op != OpARMMOVWconst { 3478 break 3479 } 3480 c := v_1.AuxInt 3481 v.reset(OpARMANDconst) 3482 v.AuxInt = int64(uint32(c) >> uint64(d)) 3483 v.AddArg(x) 3484 return true 3485 } 3486 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3487 // cond: c==d 3488 // result: y 3489 for { 3490 d := v.AuxInt 3491 x := v.Args[0] 3492 y := v.Args[1] 3493 if y.Op != OpARMSRLconst { 3494 break 3495 } 3496 c := y.AuxInt 3497 if x != y.Args[0] { 3498 break 3499 } 3500 if !(c == d) { 3501 break 3502 } 3503 v.reset(OpCopy) 3504 v.Type = y.Type 3505 v.AddArg(y) 3506 return true 3507 } 3508 return false 3509 } 3510 func rewriteValueARM_OpARMANDshiftRLreg_0(v *Value) bool { 3511 b := v.Block 3512 _ = b 3513 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 3514 // cond: 3515 // result: (ANDconst [c] (SRL <x.Type> x y)) 3516 for { 3517 v_0 := v.Args[0] 3518 if v_0.Op != OpARMMOVWconst { 3519 break 3520 } 3521 c := v_0.AuxInt 3522 x := v.Args[1] 3523 y := v.Args[2] 3524 v.reset(OpARMANDconst) 3525 v.AuxInt = c 3526 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3527 v0.AddArg(x) 3528 v0.AddArg(y) 3529 v.AddArg(v0) 3530 return true 3531 } 3532 // match: (ANDshiftRLreg x y (MOVWconst [c])) 3533 // cond: 3534 // result: (ANDshiftRL x y [c]) 3535 for { 3536 x := v.Args[0] 3537 y := v.Args[1] 3538 v_2 := v.Args[2] 3539 if v_2.Op != OpARMMOVWconst { 3540 break 3541 } 3542 c := v_2.AuxInt 3543 v.reset(OpARMANDshiftRL) 3544 v.AuxInt = c 3545 v.AddArg(x) 3546 v.AddArg(y) 3547 return true 3548 } 3549 return false 3550 } 3551 func rewriteValueARM_OpARMBIC_0(v *Value) bool { 3552 // match: (BIC x (MOVWconst [c])) 3553 // cond: 3554 // result: (BICconst [c] x) 3555 for { 3556 x := v.Args[0] 3557 v_1 := v.Args[1] 3558 if v_1.Op != OpARMMOVWconst { 3559 break 3560 } 3561 c := v_1.AuxInt 3562 v.reset(OpARMBICconst) 3563 v.AuxInt = c 3564 v.AddArg(x) 3565 return true 3566 } 3567 // match: (BIC x (SLLconst [c] y)) 3568 // cond: 3569 // result: (BICshiftLL x y [c]) 3570 for { 3571 x := v.Args[0] 3572 v_1 := v.Args[1] 3573 if v_1.Op != OpARMSLLconst { 3574 break 3575 } 3576 c := v_1.AuxInt 3577 y := v_1.Args[0] 3578 v.reset(OpARMBICshiftLL) 3579 v.AuxInt = c 3580 v.AddArg(x) 3581 v.AddArg(y) 3582 return true 3583 } 3584 // match: (BIC x (SRLconst [c] y)) 3585 // cond: 3586 // result: (BICshiftRL x y [c]) 3587 for { 3588 x := v.Args[0] 3589 v_1 := v.Args[1] 3590 if v_1.Op != OpARMSRLconst { 3591 break 3592 } 3593 c := v_1.AuxInt 3594 y := v_1.Args[0] 3595 v.reset(OpARMBICshiftRL) 3596 v.AuxInt = c 3597 v.AddArg(x) 3598 v.AddArg(y) 3599 return true 3600 } 3601 // match: (BIC x (SRAconst [c] y)) 3602 // cond: 3603 // result: (BICshiftRA x y [c]) 3604 for { 3605 x := v.Args[0] 3606 v_1 := v.Args[1] 3607 if v_1.Op != OpARMSRAconst { 3608 break 3609 } 3610 c := v_1.AuxInt 3611 y := v_1.Args[0] 3612 v.reset(OpARMBICshiftRA) 3613 v.AuxInt = c 3614 v.AddArg(x) 3615 v.AddArg(y) 3616 return true 3617 } 3618 // match: (BIC x (SLL y z)) 3619 // cond: 3620 // result: (BICshiftLLreg x y z) 3621 for { 3622 x := v.Args[0] 3623 v_1 := v.Args[1] 3624 if v_1.Op != OpARMSLL { 3625 break 3626 } 3627 y := v_1.Args[0] 3628 z := v_1.Args[1] 3629 v.reset(OpARMBICshiftLLreg) 3630 v.AddArg(x) 3631 v.AddArg(y) 3632 v.AddArg(z) 3633 return true 3634 } 3635 // match: (BIC x (SRL y z)) 3636 // cond: 3637 // result: (BICshiftRLreg x y z) 3638 for { 3639 x := v.Args[0] 3640 v_1 := v.Args[1] 3641 if v_1.Op != OpARMSRL { 3642 break 3643 } 3644 y := v_1.Args[0] 3645 z := v_1.Args[1] 3646 v.reset(OpARMBICshiftRLreg) 3647 v.AddArg(x) 3648 v.AddArg(y) 3649 v.AddArg(z) 3650 return true 3651 } 3652 // match: (BIC x (SRA y z)) 3653 // cond: 3654 // result: (BICshiftRAreg x y z) 3655 for { 3656 x := v.Args[0] 3657 v_1 := v.Args[1] 3658 if v_1.Op != OpARMSRA { 3659 break 3660 } 3661 y := v_1.Args[0] 3662 z := v_1.Args[1] 3663 v.reset(OpARMBICshiftRAreg) 3664 v.AddArg(x) 3665 v.AddArg(y) 3666 v.AddArg(z) 3667 return true 3668 } 3669 // match: (BIC x x) 3670 // cond: 3671 // result: (MOVWconst [0]) 3672 for { 3673 x := v.Args[0] 3674 if x != v.Args[1] { 3675 break 3676 } 3677 v.reset(OpARMMOVWconst) 3678 v.AuxInt = 0 3679 return true 3680 } 3681 return false 3682 } 3683 func rewriteValueARM_OpARMBICconst_0(v *Value) bool { 3684 // match: (BICconst [0] x) 3685 // cond: 3686 // result: x 3687 for { 3688 if v.AuxInt != 0 { 3689 break 3690 } 3691 x := v.Args[0] 3692 v.reset(OpCopy) 3693 v.Type = x.Type 3694 v.AddArg(x) 3695 return true 3696 } 3697 // match: (BICconst [c] _) 3698 // cond: int32(c)==-1 3699 // result: (MOVWconst [0]) 3700 for { 3701 c := v.AuxInt 3702 if !(int32(c) == -1) { 3703 break 3704 } 3705 v.reset(OpARMMOVWconst) 3706 v.AuxInt = 0 3707 return true 3708 } 3709 // match: (BICconst [c] (MOVWconst [d])) 3710 // cond: 3711 // result: (MOVWconst [d&^c]) 3712 for { 3713 c := v.AuxInt 3714 v_0 := v.Args[0] 3715 if v_0.Op != OpARMMOVWconst { 3716 break 3717 } 3718 d := v_0.AuxInt 3719 v.reset(OpARMMOVWconst) 3720 v.AuxInt = d &^ c 3721 return true 3722 } 3723 return false 3724 } 3725 func rewriteValueARM_OpARMBICshiftLL_0(v *Value) bool { 3726 // match: (BICshiftLL x (MOVWconst [c]) [d]) 3727 // cond: 3728 // result: (BICconst x [int64(uint32(c)<<uint64(d))]) 3729 for { 3730 d := v.AuxInt 3731 x := v.Args[0] 3732 v_1 := v.Args[1] 3733 if v_1.Op != OpARMMOVWconst { 3734 break 3735 } 3736 c := v_1.AuxInt 3737 v.reset(OpARMBICconst) 3738 v.AuxInt = int64(uint32(c) << uint64(d)) 3739 v.AddArg(x) 3740 return true 3741 } 3742 // match: (BICshiftLL x (SLLconst x [c]) [d]) 3743 // cond: c==d 3744 // result: (MOVWconst [0]) 3745 for { 3746 d := v.AuxInt 3747 x := v.Args[0] 3748 v_1 := v.Args[1] 3749 if v_1.Op != OpARMSLLconst { 3750 break 3751 } 3752 c := v_1.AuxInt 3753 if x != v_1.Args[0] { 3754 break 3755 } 3756 if !(c == d) { 3757 break 3758 } 3759 v.reset(OpARMMOVWconst) 3760 v.AuxInt = 0 3761 return true 3762 } 3763 return false 3764 } 3765 func rewriteValueARM_OpARMBICshiftLLreg_0(v *Value) bool { 3766 // match: (BICshiftLLreg x y (MOVWconst [c])) 3767 // cond: 3768 // result: (BICshiftLL x y [c]) 3769 for { 3770 x := v.Args[0] 3771 y := v.Args[1] 3772 v_2 := v.Args[2] 3773 if v_2.Op != OpARMMOVWconst { 3774 break 3775 } 3776 c := v_2.AuxInt 3777 v.reset(OpARMBICshiftLL) 3778 v.AuxInt = c 3779 v.AddArg(x) 3780 v.AddArg(y) 3781 return true 3782 } 3783 return false 3784 } 3785 func rewriteValueARM_OpARMBICshiftRA_0(v *Value) bool { 3786 // match: (BICshiftRA x (MOVWconst [c]) [d]) 3787 // cond: 3788 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 3789 for { 3790 d := v.AuxInt 3791 x := v.Args[0] 3792 v_1 := v.Args[1] 3793 if v_1.Op != OpARMMOVWconst { 3794 break 3795 } 3796 c := v_1.AuxInt 3797 v.reset(OpARMBICconst) 3798 v.AuxInt = int64(int32(c) >> uint64(d)) 3799 v.AddArg(x) 3800 return true 3801 } 3802 // match: (BICshiftRA x (SRAconst x [c]) [d]) 3803 // cond: c==d 3804 // result: (MOVWconst [0]) 3805 for { 3806 d := v.AuxInt 3807 x := v.Args[0] 3808 v_1 := v.Args[1] 3809 if v_1.Op != OpARMSRAconst { 3810 break 3811 } 3812 c := v_1.AuxInt 3813 if x != v_1.Args[0] { 3814 break 3815 } 3816 if !(c == d) { 3817 break 3818 } 3819 v.reset(OpARMMOVWconst) 3820 v.AuxInt = 0 3821 return true 3822 } 3823 return false 3824 } 3825 func rewriteValueARM_OpARMBICshiftRAreg_0(v *Value) bool { 3826 // match: (BICshiftRAreg x y (MOVWconst [c])) 3827 // cond: 3828 // result: (BICshiftRA x y [c]) 3829 for { 3830 x := v.Args[0] 3831 y := v.Args[1] 3832 v_2 := v.Args[2] 3833 if v_2.Op != OpARMMOVWconst { 3834 break 3835 } 3836 c := v_2.AuxInt 3837 v.reset(OpARMBICshiftRA) 3838 v.AuxInt = c 3839 v.AddArg(x) 3840 v.AddArg(y) 3841 return true 3842 } 3843 return false 3844 } 3845 func rewriteValueARM_OpARMBICshiftRL_0(v *Value) bool { 3846 // match: (BICshiftRL x (MOVWconst [c]) [d]) 3847 // cond: 3848 // result: (BICconst x [int64(uint32(c)>>uint64(d))]) 3849 for { 3850 d := v.AuxInt 3851 x := v.Args[0] 3852 v_1 := v.Args[1] 3853 if v_1.Op != OpARMMOVWconst { 3854 break 3855 } 3856 c := v_1.AuxInt 3857 v.reset(OpARMBICconst) 3858 v.AuxInt = int64(uint32(c) >> uint64(d)) 3859 v.AddArg(x) 3860 return true 3861 } 3862 // match: (BICshiftRL x (SRLconst x [c]) [d]) 3863 // cond: c==d 3864 // result: (MOVWconst [0]) 3865 for { 3866 d := v.AuxInt 3867 x := v.Args[0] 3868 v_1 := v.Args[1] 3869 if v_1.Op != OpARMSRLconst { 3870 break 3871 } 3872 c := v_1.AuxInt 3873 if x != v_1.Args[0] { 3874 break 3875 } 3876 if !(c == d) { 3877 break 3878 } 3879 v.reset(OpARMMOVWconst) 3880 v.AuxInt = 0 3881 return true 3882 } 3883 return false 3884 } 3885 func rewriteValueARM_OpARMBICshiftRLreg_0(v *Value) bool { 3886 // match: (BICshiftRLreg x y (MOVWconst [c])) 3887 // cond: 3888 // result: (BICshiftRL x y [c]) 3889 for { 3890 x := v.Args[0] 3891 y := v.Args[1] 3892 v_2 := v.Args[2] 3893 if v_2.Op != OpARMMOVWconst { 3894 break 3895 } 3896 c := v_2.AuxInt 3897 v.reset(OpARMBICshiftRL) 3898 v.AuxInt = c 3899 v.AddArg(x) 3900 v.AddArg(y) 3901 return true 3902 } 3903 return false 3904 } 3905 func rewriteValueARM_OpARMCMOVWHSconst_0(v *Value) bool { 3906 // match: (CMOVWHSconst _ (FlagEQ) [c]) 3907 // cond: 3908 // result: (MOVWconst [c]) 3909 for { 3910 c := v.AuxInt 3911 v_1 := v.Args[1] 3912 if v_1.Op != OpARMFlagEQ { 3913 break 3914 } 3915 v.reset(OpARMMOVWconst) 3916 v.AuxInt = c 3917 return true 3918 } 3919 // match: (CMOVWHSconst x (FlagLT_ULT)) 3920 // cond: 3921 // result: x 3922 for { 3923 x := v.Args[0] 3924 v_1 := v.Args[1] 3925 if v_1.Op != OpARMFlagLT_ULT { 3926 break 3927 } 3928 v.reset(OpCopy) 3929 v.Type = x.Type 3930 v.AddArg(x) 3931 return true 3932 } 3933 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 3934 // cond: 3935 // result: (MOVWconst [c]) 3936 for { 3937 c := v.AuxInt 3938 v_1 := v.Args[1] 3939 if v_1.Op != OpARMFlagLT_UGT { 3940 break 3941 } 3942 v.reset(OpARMMOVWconst) 3943 v.AuxInt = c 3944 return true 3945 } 3946 // match: (CMOVWHSconst x (FlagGT_ULT)) 3947 // cond: 3948 // result: x 3949 for { 3950 x := v.Args[0] 3951 v_1 := v.Args[1] 3952 if v_1.Op != OpARMFlagGT_ULT { 3953 break 3954 } 3955 v.reset(OpCopy) 3956 v.Type = x.Type 3957 v.AddArg(x) 3958 return true 3959 } 3960 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 3961 // cond: 3962 // result: (MOVWconst [c]) 3963 for { 3964 c := v.AuxInt 3965 v_1 := v.Args[1] 3966 if v_1.Op != OpARMFlagGT_UGT { 3967 break 3968 } 3969 v.reset(OpARMMOVWconst) 3970 v.AuxInt = c 3971 return true 3972 } 3973 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 3974 // cond: 3975 // result: (CMOVWLSconst x flags [c]) 3976 for { 3977 c := v.AuxInt 3978 x := v.Args[0] 3979 v_1 := v.Args[1] 3980 if v_1.Op != OpARMInvertFlags { 3981 break 3982 } 3983 flags := v_1.Args[0] 3984 v.reset(OpARMCMOVWLSconst) 3985 v.AuxInt = c 3986 v.AddArg(x) 3987 v.AddArg(flags) 3988 return true 3989 } 3990 return false 3991 } 3992 func rewriteValueARM_OpARMCMOVWLSconst_0(v *Value) bool { 3993 // match: (CMOVWLSconst _ (FlagEQ) [c]) 3994 // cond: 3995 // result: (MOVWconst [c]) 3996 for { 3997 c := v.AuxInt 3998 v_1 := v.Args[1] 3999 if v_1.Op != OpARMFlagEQ { 4000 break 4001 } 4002 v.reset(OpARMMOVWconst) 4003 v.AuxInt = c 4004 return true 4005 } 4006 // match: (CMOVWLSconst _ (FlagLT_ULT) [c]) 4007 // cond: 4008 // result: (MOVWconst [c]) 4009 for { 4010 c := v.AuxInt 4011 v_1 := v.Args[1] 4012 if v_1.Op != OpARMFlagLT_ULT { 4013 break 4014 } 4015 v.reset(OpARMMOVWconst) 4016 v.AuxInt = c 4017 return true 4018 } 4019 // match: (CMOVWLSconst x (FlagLT_UGT)) 4020 // cond: 4021 // result: x 4022 for { 4023 x := v.Args[0] 4024 v_1 := v.Args[1] 4025 if v_1.Op != OpARMFlagLT_UGT { 4026 break 4027 } 4028 v.reset(OpCopy) 4029 v.Type = x.Type 4030 v.AddArg(x) 4031 return true 4032 } 4033 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 4034 // cond: 4035 // result: (MOVWconst [c]) 4036 for { 4037 c := v.AuxInt 4038 v_1 := v.Args[1] 4039 if v_1.Op != OpARMFlagGT_ULT { 4040 break 4041 } 4042 v.reset(OpARMMOVWconst) 4043 v.AuxInt = c 4044 return true 4045 } 4046 // match: (CMOVWLSconst x (FlagGT_UGT)) 4047 // cond: 4048 // result: x 4049 for { 4050 x := v.Args[0] 4051 v_1 := v.Args[1] 4052 if v_1.Op != OpARMFlagGT_UGT { 4053 break 4054 } 4055 v.reset(OpCopy) 4056 v.Type = x.Type 4057 v.AddArg(x) 4058 return true 4059 } 4060 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 4061 // cond: 4062 // result: (CMOVWHSconst x flags [c]) 4063 for { 4064 c := v.AuxInt 4065 x := v.Args[0] 4066 v_1 := v.Args[1] 4067 if v_1.Op != OpARMInvertFlags { 4068 break 4069 } 4070 flags := v_1.Args[0] 4071 v.reset(OpARMCMOVWHSconst) 4072 v.AuxInt = c 4073 v.AddArg(x) 4074 v.AddArg(flags) 4075 return true 4076 } 4077 return false 4078 } 4079 func rewriteValueARM_OpARMCMP_0(v *Value) bool { 4080 b := v.Block 4081 _ = b 4082 // match: (CMP x (MOVWconst [c])) 4083 // cond: 4084 // result: (CMPconst [c] x) 4085 for { 4086 x := v.Args[0] 4087 v_1 := v.Args[1] 4088 if v_1.Op != OpARMMOVWconst { 4089 break 4090 } 4091 c := v_1.AuxInt 4092 v.reset(OpARMCMPconst) 4093 v.AuxInt = c 4094 v.AddArg(x) 4095 return true 4096 } 4097 // match: (CMP (MOVWconst [c]) x) 4098 // cond: 4099 // result: (InvertFlags (CMPconst [c] x)) 4100 for { 4101 v_0 := v.Args[0] 4102 if v_0.Op != OpARMMOVWconst { 4103 break 4104 } 4105 c := v_0.AuxInt 4106 x := v.Args[1] 4107 v.reset(OpARMInvertFlags) 4108 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4109 v0.AuxInt = c 4110 v0.AddArg(x) 4111 v.AddArg(v0) 4112 return true 4113 } 4114 // match: (CMP x (SLLconst [c] y)) 4115 // cond: 4116 // result: (CMPshiftLL x y [c]) 4117 for { 4118 x := v.Args[0] 4119 v_1 := v.Args[1] 4120 if v_1.Op != OpARMSLLconst { 4121 break 4122 } 4123 c := v_1.AuxInt 4124 y := v_1.Args[0] 4125 v.reset(OpARMCMPshiftLL) 4126 v.AuxInt = c 4127 v.AddArg(x) 4128 v.AddArg(y) 4129 return true 4130 } 4131 // match: (CMP (SLLconst [c] y) x) 4132 // cond: 4133 // result: (InvertFlags (CMPshiftLL x y [c])) 4134 for { 4135 v_0 := v.Args[0] 4136 if v_0.Op != OpARMSLLconst { 4137 break 4138 } 4139 c := v_0.AuxInt 4140 y := v_0.Args[0] 4141 x := v.Args[1] 4142 v.reset(OpARMInvertFlags) 4143 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, TypeFlags) 4144 v0.AuxInt = c 4145 v0.AddArg(x) 4146 v0.AddArg(y) 4147 v.AddArg(v0) 4148 return true 4149 } 4150 // match: (CMP x (SRLconst [c] y)) 4151 // cond: 4152 // result: (CMPshiftRL x y [c]) 4153 for { 4154 x := v.Args[0] 4155 v_1 := v.Args[1] 4156 if v_1.Op != OpARMSRLconst { 4157 break 4158 } 4159 c := v_1.AuxInt 4160 y := v_1.Args[0] 4161 v.reset(OpARMCMPshiftRL) 4162 v.AuxInt = c 4163 v.AddArg(x) 4164 v.AddArg(y) 4165 return true 4166 } 4167 // match: (CMP (SRLconst [c] y) x) 4168 // cond: 4169 // result: (InvertFlags (CMPshiftRL x y [c])) 4170 for { 4171 v_0 := v.Args[0] 4172 if v_0.Op != OpARMSRLconst { 4173 break 4174 } 4175 c := v_0.AuxInt 4176 y := v_0.Args[0] 4177 x := v.Args[1] 4178 v.reset(OpARMInvertFlags) 4179 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, TypeFlags) 4180 v0.AuxInt = c 4181 v0.AddArg(x) 4182 v0.AddArg(y) 4183 v.AddArg(v0) 4184 return true 4185 } 4186 // match: (CMP x (SRAconst [c] y)) 4187 // cond: 4188 // result: (CMPshiftRA x y [c]) 4189 for { 4190 x := v.Args[0] 4191 v_1 := v.Args[1] 4192 if v_1.Op != OpARMSRAconst { 4193 break 4194 } 4195 c := v_1.AuxInt 4196 y := v_1.Args[0] 4197 v.reset(OpARMCMPshiftRA) 4198 v.AuxInt = c 4199 v.AddArg(x) 4200 v.AddArg(y) 4201 return true 4202 } 4203 // match: (CMP (SRAconst [c] y) x) 4204 // cond: 4205 // result: (InvertFlags (CMPshiftRA x y [c])) 4206 for { 4207 v_0 := v.Args[0] 4208 if v_0.Op != OpARMSRAconst { 4209 break 4210 } 4211 c := v_0.AuxInt 4212 y := v_0.Args[0] 4213 x := v.Args[1] 4214 v.reset(OpARMInvertFlags) 4215 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, TypeFlags) 4216 v0.AuxInt = c 4217 v0.AddArg(x) 4218 v0.AddArg(y) 4219 v.AddArg(v0) 4220 return true 4221 } 4222 // match: (CMP x (SLL y z)) 4223 // cond: 4224 // result: (CMPshiftLLreg x y z) 4225 for { 4226 x := v.Args[0] 4227 v_1 := v.Args[1] 4228 if v_1.Op != OpARMSLL { 4229 break 4230 } 4231 y := v_1.Args[0] 4232 z := v_1.Args[1] 4233 v.reset(OpARMCMPshiftLLreg) 4234 v.AddArg(x) 4235 v.AddArg(y) 4236 v.AddArg(z) 4237 return true 4238 } 4239 // match: (CMP (SLL y z) x) 4240 // cond: 4241 // result: (InvertFlags (CMPshiftLLreg x y z)) 4242 for { 4243 v_0 := v.Args[0] 4244 if v_0.Op != OpARMSLL { 4245 break 4246 } 4247 y := v_0.Args[0] 4248 z := v_0.Args[1] 4249 x := v.Args[1] 4250 v.reset(OpARMInvertFlags) 4251 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, TypeFlags) 4252 v0.AddArg(x) 4253 v0.AddArg(y) 4254 v0.AddArg(z) 4255 v.AddArg(v0) 4256 return true 4257 } 4258 return false 4259 } 4260 func rewriteValueARM_OpARMCMP_10(v *Value) bool { 4261 b := v.Block 4262 _ = b 4263 // match: (CMP x (SRL y z)) 4264 // cond: 4265 // result: (CMPshiftRLreg x y z) 4266 for { 4267 x := v.Args[0] 4268 v_1 := v.Args[1] 4269 if v_1.Op != OpARMSRL { 4270 break 4271 } 4272 y := v_1.Args[0] 4273 z := v_1.Args[1] 4274 v.reset(OpARMCMPshiftRLreg) 4275 v.AddArg(x) 4276 v.AddArg(y) 4277 v.AddArg(z) 4278 return true 4279 } 4280 // match: (CMP (SRL y z) x) 4281 // cond: 4282 // result: (InvertFlags (CMPshiftRLreg x y z)) 4283 for { 4284 v_0 := v.Args[0] 4285 if v_0.Op != OpARMSRL { 4286 break 4287 } 4288 y := v_0.Args[0] 4289 z := v_0.Args[1] 4290 x := v.Args[1] 4291 v.reset(OpARMInvertFlags) 4292 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, TypeFlags) 4293 v0.AddArg(x) 4294 v0.AddArg(y) 4295 v0.AddArg(z) 4296 v.AddArg(v0) 4297 return true 4298 } 4299 // match: (CMP x (SRA y z)) 4300 // cond: 4301 // result: (CMPshiftRAreg x y z) 4302 for { 4303 x := v.Args[0] 4304 v_1 := v.Args[1] 4305 if v_1.Op != OpARMSRA { 4306 break 4307 } 4308 y := v_1.Args[0] 4309 z := v_1.Args[1] 4310 v.reset(OpARMCMPshiftRAreg) 4311 v.AddArg(x) 4312 v.AddArg(y) 4313 v.AddArg(z) 4314 return true 4315 } 4316 // match: (CMP (SRA y z) x) 4317 // cond: 4318 // result: (InvertFlags (CMPshiftRAreg x y z)) 4319 for { 4320 v_0 := v.Args[0] 4321 if v_0.Op != OpARMSRA { 4322 break 4323 } 4324 y := v_0.Args[0] 4325 z := v_0.Args[1] 4326 x := v.Args[1] 4327 v.reset(OpARMInvertFlags) 4328 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, TypeFlags) 4329 v0.AddArg(x) 4330 v0.AddArg(y) 4331 v0.AddArg(z) 4332 v.AddArg(v0) 4333 return true 4334 } 4335 return false 4336 } 4337 func rewriteValueARM_OpARMCMPD_0(v *Value) bool { 4338 // match: (CMPD x (MOVDconst [0])) 4339 // cond: 4340 // result: (CMPD0 x) 4341 for { 4342 x := v.Args[0] 4343 v_1 := v.Args[1] 4344 if v_1.Op != OpARMMOVDconst { 4345 break 4346 } 4347 if v_1.AuxInt != 0 { 4348 break 4349 } 4350 v.reset(OpARMCMPD0) 4351 v.AddArg(x) 4352 return true 4353 } 4354 return false 4355 } 4356 func rewriteValueARM_OpARMCMPF_0(v *Value) bool { 4357 // match: (CMPF x (MOVFconst [0])) 4358 // cond: 4359 // result: (CMPF0 x) 4360 for { 4361 x := v.Args[0] 4362 v_1 := v.Args[1] 4363 if v_1.Op != OpARMMOVFconst { 4364 break 4365 } 4366 if v_1.AuxInt != 0 { 4367 break 4368 } 4369 v.reset(OpARMCMPF0) 4370 v.AddArg(x) 4371 return true 4372 } 4373 return false 4374 } 4375 func rewriteValueARM_OpARMCMPconst_0(v *Value) bool { 4376 // match: (CMPconst (MOVWconst [x]) [y]) 4377 // cond: int32(x)==int32(y) 4378 // result: (FlagEQ) 4379 for { 4380 y := v.AuxInt 4381 v_0 := v.Args[0] 4382 if v_0.Op != OpARMMOVWconst { 4383 break 4384 } 4385 x := v_0.AuxInt 4386 if !(int32(x) == int32(y)) { 4387 break 4388 } 4389 v.reset(OpARMFlagEQ) 4390 return true 4391 } 4392 // match: (CMPconst (MOVWconst [x]) [y]) 4393 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 4394 // result: (FlagLT_ULT) 4395 for { 4396 y := v.AuxInt 4397 v_0 := v.Args[0] 4398 if v_0.Op != OpARMMOVWconst { 4399 break 4400 } 4401 x := v_0.AuxInt 4402 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 4403 break 4404 } 4405 v.reset(OpARMFlagLT_ULT) 4406 return true 4407 } 4408 // match: (CMPconst (MOVWconst [x]) [y]) 4409 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 4410 // result: (FlagLT_UGT) 4411 for { 4412 y := v.AuxInt 4413 v_0 := v.Args[0] 4414 if v_0.Op != OpARMMOVWconst { 4415 break 4416 } 4417 x := v_0.AuxInt 4418 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 4419 break 4420 } 4421 v.reset(OpARMFlagLT_UGT) 4422 return true 4423 } 4424 // match: (CMPconst (MOVWconst [x]) [y]) 4425 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 4426 // result: (FlagGT_ULT) 4427 for { 4428 y := v.AuxInt 4429 v_0 := v.Args[0] 4430 if v_0.Op != OpARMMOVWconst { 4431 break 4432 } 4433 x := v_0.AuxInt 4434 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 4435 break 4436 } 4437 v.reset(OpARMFlagGT_ULT) 4438 return true 4439 } 4440 // match: (CMPconst (MOVWconst [x]) [y]) 4441 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 4442 // result: (FlagGT_UGT) 4443 for { 4444 y := v.AuxInt 4445 v_0 := v.Args[0] 4446 if v_0.Op != OpARMMOVWconst { 4447 break 4448 } 4449 x := v_0.AuxInt 4450 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 4451 break 4452 } 4453 v.reset(OpARMFlagGT_UGT) 4454 return true 4455 } 4456 // match: (CMPconst (MOVBUreg _) [c]) 4457 // cond: 0xff < c 4458 // result: (FlagLT_ULT) 4459 for { 4460 c := v.AuxInt 4461 v_0 := v.Args[0] 4462 if v_0.Op != OpARMMOVBUreg { 4463 break 4464 } 4465 if !(0xff < c) { 4466 break 4467 } 4468 v.reset(OpARMFlagLT_ULT) 4469 return true 4470 } 4471 // match: (CMPconst (MOVHUreg _) [c]) 4472 // cond: 0xffff < c 4473 // result: (FlagLT_ULT) 4474 for { 4475 c := v.AuxInt 4476 v_0 := v.Args[0] 4477 if v_0.Op != OpARMMOVHUreg { 4478 break 4479 } 4480 if !(0xffff < c) { 4481 break 4482 } 4483 v.reset(OpARMFlagLT_ULT) 4484 return true 4485 } 4486 // match: (CMPconst (ANDconst _ [m]) [n]) 4487 // cond: 0 <= int32(m) && int32(m) < int32(n) 4488 // result: (FlagLT_ULT) 4489 for { 4490 n := v.AuxInt 4491 v_0 := v.Args[0] 4492 if v_0.Op != OpARMANDconst { 4493 break 4494 } 4495 m := v_0.AuxInt 4496 if !(0 <= int32(m) && int32(m) < int32(n)) { 4497 break 4498 } 4499 v.reset(OpARMFlagLT_ULT) 4500 return true 4501 } 4502 // match: (CMPconst (SRLconst _ [c]) [n]) 4503 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 4504 // result: (FlagLT_ULT) 4505 for { 4506 n := v.AuxInt 4507 v_0 := v.Args[0] 4508 if v_0.Op != OpARMSRLconst { 4509 break 4510 } 4511 c := v_0.AuxInt 4512 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 4513 break 4514 } 4515 v.reset(OpARMFlagLT_ULT) 4516 return true 4517 } 4518 return false 4519 } 4520 func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { 4521 b := v.Block 4522 _ = b 4523 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 4524 // cond: 4525 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 4526 for { 4527 d := v.AuxInt 4528 v_0 := v.Args[0] 4529 if v_0.Op != OpARMMOVWconst { 4530 break 4531 } 4532 c := v_0.AuxInt 4533 x := v.Args[1] 4534 v.reset(OpARMInvertFlags) 4535 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4536 v0.AuxInt = c 4537 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4538 v1.AuxInt = d 4539 v1.AddArg(x) 4540 v0.AddArg(v1) 4541 v.AddArg(v0) 4542 return true 4543 } 4544 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 4545 // cond: 4546 // result: (CMPconst x [int64(uint32(c)<<uint64(d))]) 4547 for { 4548 d := v.AuxInt 4549 x := v.Args[0] 4550 v_1 := v.Args[1] 4551 if v_1.Op != OpARMMOVWconst { 4552 break 4553 } 4554 c := v_1.AuxInt 4555 v.reset(OpARMCMPconst) 4556 v.AuxInt = int64(uint32(c) << uint64(d)) 4557 v.AddArg(x) 4558 return true 4559 } 4560 return false 4561 } 4562 func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { 4563 b := v.Block 4564 _ = b 4565 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 4566 // cond: 4567 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 4568 for { 4569 v_0 := v.Args[0] 4570 if v_0.Op != OpARMMOVWconst { 4571 break 4572 } 4573 c := v_0.AuxInt 4574 x := v.Args[1] 4575 y := v.Args[2] 4576 v.reset(OpARMInvertFlags) 4577 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4578 v0.AuxInt = c 4579 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4580 v1.AddArg(x) 4581 v1.AddArg(y) 4582 v0.AddArg(v1) 4583 v.AddArg(v0) 4584 return true 4585 } 4586 // match: (CMPshiftLLreg x y (MOVWconst [c])) 4587 // cond: 4588 // result: (CMPshiftLL x y [c]) 4589 for { 4590 x := v.Args[0] 4591 y := v.Args[1] 4592 v_2 := v.Args[2] 4593 if v_2.Op != OpARMMOVWconst { 4594 break 4595 } 4596 c := v_2.AuxInt 4597 v.reset(OpARMCMPshiftLL) 4598 v.AuxInt = c 4599 v.AddArg(x) 4600 v.AddArg(y) 4601 return true 4602 } 4603 return false 4604 } 4605 func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { 4606 b := v.Block 4607 _ = b 4608 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 4609 // cond: 4610 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 4611 for { 4612 d := v.AuxInt 4613 v_0 := v.Args[0] 4614 if v_0.Op != OpARMMOVWconst { 4615 break 4616 } 4617 c := v_0.AuxInt 4618 x := v.Args[1] 4619 v.reset(OpARMInvertFlags) 4620 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4621 v0.AuxInt = c 4622 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4623 v1.AuxInt = d 4624 v1.AddArg(x) 4625 v0.AddArg(v1) 4626 v.AddArg(v0) 4627 return true 4628 } 4629 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 4630 // cond: 4631 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 4632 for { 4633 d := v.AuxInt 4634 x := v.Args[0] 4635 v_1 := v.Args[1] 4636 if v_1.Op != OpARMMOVWconst { 4637 break 4638 } 4639 c := v_1.AuxInt 4640 v.reset(OpARMCMPconst) 4641 v.AuxInt = int64(int32(c) >> uint64(d)) 4642 v.AddArg(x) 4643 return true 4644 } 4645 return false 4646 } 4647 func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { 4648 b := v.Block 4649 _ = b 4650 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 4651 // cond: 4652 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 4653 for { 4654 v_0 := v.Args[0] 4655 if v_0.Op != OpARMMOVWconst { 4656 break 4657 } 4658 c := v_0.AuxInt 4659 x := v.Args[1] 4660 y := v.Args[2] 4661 v.reset(OpARMInvertFlags) 4662 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4663 v0.AuxInt = c 4664 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4665 v1.AddArg(x) 4666 v1.AddArg(y) 4667 v0.AddArg(v1) 4668 v.AddArg(v0) 4669 return true 4670 } 4671 // match: (CMPshiftRAreg x y (MOVWconst [c])) 4672 // cond: 4673 // result: (CMPshiftRA x y [c]) 4674 for { 4675 x := v.Args[0] 4676 y := v.Args[1] 4677 v_2 := v.Args[2] 4678 if v_2.Op != OpARMMOVWconst { 4679 break 4680 } 4681 c := v_2.AuxInt 4682 v.reset(OpARMCMPshiftRA) 4683 v.AuxInt = c 4684 v.AddArg(x) 4685 v.AddArg(y) 4686 return true 4687 } 4688 return false 4689 } 4690 func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { 4691 b := v.Block 4692 _ = b 4693 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 4694 // cond: 4695 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 4696 for { 4697 d := v.AuxInt 4698 v_0 := v.Args[0] 4699 if v_0.Op != OpARMMOVWconst { 4700 break 4701 } 4702 c := v_0.AuxInt 4703 x := v.Args[1] 4704 v.reset(OpARMInvertFlags) 4705 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4706 v0.AuxInt = c 4707 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 4708 v1.AuxInt = d 4709 v1.AddArg(x) 4710 v0.AddArg(v1) 4711 v.AddArg(v0) 4712 return true 4713 } 4714 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 4715 // cond: 4716 // result: (CMPconst x [int64(uint32(c)>>uint64(d))]) 4717 for { 4718 d := v.AuxInt 4719 x := v.Args[0] 4720 v_1 := v.Args[1] 4721 if v_1.Op != OpARMMOVWconst { 4722 break 4723 } 4724 c := v_1.AuxInt 4725 v.reset(OpARMCMPconst) 4726 v.AuxInt = int64(uint32(c) >> uint64(d)) 4727 v.AddArg(x) 4728 return true 4729 } 4730 return false 4731 } 4732 func rewriteValueARM_OpARMCMPshiftRLreg_0(v *Value) bool { 4733 b := v.Block 4734 _ = b 4735 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 4736 // cond: 4737 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 4738 for { 4739 v_0 := v.Args[0] 4740 if v_0.Op != OpARMMOVWconst { 4741 break 4742 } 4743 c := v_0.AuxInt 4744 x := v.Args[1] 4745 y := v.Args[2] 4746 v.reset(OpARMInvertFlags) 4747 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 4748 v0.AuxInt = c 4749 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 4750 v1.AddArg(x) 4751 v1.AddArg(y) 4752 v0.AddArg(v1) 4753 v.AddArg(v0) 4754 return true 4755 } 4756 // match: (CMPshiftRLreg x y (MOVWconst [c])) 4757 // cond: 4758 // result: (CMPshiftRL x y [c]) 4759 for { 4760 x := v.Args[0] 4761 y := v.Args[1] 4762 v_2 := v.Args[2] 4763 if v_2.Op != OpARMMOVWconst { 4764 break 4765 } 4766 c := v_2.AuxInt 4767 v.reset(OpARMCMPshiftRL) 4768 v.AuxInt = c 4769 v.AddArg(x) 4770 v.AddArg(y) 4771 return true 4772 } 4773 return false 4774 } 4775 func rewriteValueARM_OpARMEqual_0(v *Value) bool { 4776 // match: (Equal (FlagEQ)) 4777 // cond: 4778 // result: (MOVWconst [1]) 4779 for { 4780 v_0 := v.Args[0] 4781 if v_0.Op != OpARMFlagEQ { 4782 break 4783 } 4784 v.reset(OpARMMOVWconst) 4785 v.AuxInt = 1 4786 return true 4787 } 4788 // match: (Equal (FlagLT_ULT)) 4789 // cond: 4790 // result: (MOVWconst [0]) 4791 for { 4792 v_0 := v.Args[0] 4793 if v_0.Op != OpARMFlagLT_ULT { 4794 break 4795 } 4796 v.reset(OpARMMOVWconst) 4797 v.AuxInt = 0 4798 return true 4799 } 4800 // match: (Equal (FlagLT_UGT)) 4801 // cond: 4802 // result: (MOVWconst [0]) 4803 for { 4804 v_0 := v.Args[0] 4805 if v_0.Op != OpARMFlagLT_UGT { 4806 break 4807 } 4808 v.reset(OpARMMOVWconst) 4809 v.AuxInt = 0 4810 return true 4811 } 4812 // match: (Equal (FlagGT_ULT)) 4813 // cond: 4814 // result: (MOVWconst [0]) 4815 for { 4816 v_0 := v.Args[0] 4817 if v_0.Op != OpARMFlagGT_ULT { 4818 break 4819 } 4820 v.reset(OpARMMOVWconst) 4821 v.AuxInt = 0 4822 return true 4823 } 4824 // match: (Equal (FlagGT_UGT)) 4825 // cond: 4826 // result: (MOVWconst [0]) 4827 for { 4828 v_0 := v.Args[0] 4829 if v_0.Op != OpARMFlagGT_UGT { 4830 break 4831 } 4832 v.reset(OpARMMOVWconst) 4833 v.AuxInt = 0 4834 return true 4835 } 4836 // match: (Equal (InvertFlags x)) 4837 // cond: 4838 // result: (Equal x) 4839 for { 4840 v_0 := v.Args[0] 4841 if v_0.Op != OpARMInvertFlags { 4842 break 4843 } 4844 x := v_0.Args[0] 4845 v.reset(OpARMEqual) 4846 v.AddArg(x) 4847 return true 4848 } 4849 return false 4850 } 4851 func rewriteValueARM_OpARMGreaterEqual_0(v *Value) bool { 4852 // match: (GreaterEqual (FlagEQ)) 4853 // cond: 4854 // result: (MOVWconst [1]) 4855 for { 4856 v_0 := v.Args[0] 4857 if v_0.Op != OpARMFlagEQ { 4858 break 4859 } 4860 v.reset(OpARMMOVWconst) 4861 v.AuxInt = 1 4862 return true 4863 } 4864 // match: (GreaterEqual (FlagLT_ULT)) 4865 // cond: 4866 // result: (MOVWconst [0]) 4867 for { 4868 v_0 := v.Args[0] 4869 if v_0.Op != OpARMFlagLT_ULT { 4870 break 4871 } 4872 v.reset(OpARMMOVWconst) 4873 v.AuxInt = 0 4874 return true 4875 } 4876 // match: (GreaterEqual (FlagLT_UGT)) 4877 // cond: 4878 // result: (MOVWconst [0]) 4879 for { 4880 v_0 := v.Args[0] 4881 if v_0.Op != OpARMFlagLT_UGT { 4882 break 4883 } 4884 v.reset(OpARMMOVWconst) 4885 v.AuxInt = 0 4886 return true 4887 } 4888 // match: (GreaterEqual (FlagGT_ULT)) 4889 // cond: 4890 // result: (MOVWconst [1]) 4891 for { 4892 v_0 := v.Args[0] 4893 if v_0.Op != OpARMFlagGT_ULT { 4894 break 4895 } 4896 v.reset(OpARMMOVWconst) 4897 v.AuxInt = 1 4898 return true 4899 } 4900 // match: (GreaterEqual (FlagGT_UGT)) 4901 // cond: 4902 // result: (MOVWconst [1]) 4903 for { 4904 v_0 := v.Args[0] 4905 if v_0.Op != OpARMFlagGT_UGT { 4906 break 4907 } 4908 v.reset(OpARMMOVWconst) 4909 v.AuxInt = 1 4910 return true 4911 } 4912 // match: (GreaterEqual (InvertFlags x)) 4913 // cond: 4914 // result: (LessEqual x) 4915 for { 4916 v_0 := v.Args[0] 4917 if v_0.Op != OpARMInvertFlags { 4918 break 4919 } 4920 x := v_0.Args[0] 4921 v.reset(OpARMLessEqual) 4922 v.AddArg(x) 4923 return true 4924 } 4925 return false 4926 } 4927 func rewriteValueARM_OpARMGreaterEqualU_0(v *Value) bool { 4928 // match: (GreaterEqualU (FlagEQ)) 4929 // cond: 4930 // result: (MOVWconst [1]) 4931 for { 4932 v_0 := v.Args[0] 4933 if v_0.Op != OpARMFlagEQ { 4934 break 4935 } 4936 v.reset(OpARMMOVWconst) 4937 v.AuxInt = 1 4938 return true 4939 } 4940 // match: (GreaterEqualU (FlagLT_ULT)) 4941 // cond: 4942 // result: (MOVWconst [0]) 4943 for { 4944 v_0 := v.Args[0] 4945 if v_0.Op != OpARMFlagLT_ULT { 4946 break 4947 } 4948 v.reset(OpARMMOVWconst) 4949 v.AuxInt = 0 4950 return true 4951 } 4952 // match: (GreaterEqualU (FlagLT_UGT)) 4953 // cond: 4954 // result: (MOVWconst [1]) 4955 for { 4956 v_0 := v.Args[0] 4957 if v_0.Op != OpARMFlagLT_UGT { 4958 break 4959 } 4960 v.reset(OpARMMOVWconst) 4961 v.AuxInt = 1 4962 return true 4963 } 4964 // match: (GreaterEqualU (FlagGT_ULT)) 4965 // cond: 4966 // result: (MOVWconst [0]) 4967 for { 4968 v_0 := v.Args[0] 4969 if v_0.Op != OpARMFlagGT_ULT { 4970 break 4971 } 4972 v.reset(OpARMMOVWconst) 4973 v.AuxInt = 0 4974 return true 4975 } 4976 // match: (GreaterEqualU (FlagGT_UGT)) 4977 // cond: 4978 // result: (MOVWconst [1]) 4979 for { 4980 v_0 := v.Args[0] 4981 if v_0.Op != OpARMFlagGT_UGT { 4982 break 4983 } 4984 v.reset(OpARMMOVWconst) 4985 v.AuxInt = 1 4986 return true 4987 } 4988 // match: (GreaterEqualU (InvertFlags x)) 4989 // cond: 4990 // result: (LessEqualU x) 4991 for { 4992 v_0 := v.Args[0] 4993 if v_0.Op != OpARMInvertFlags { 4994 break 4995 } 4996 x := v_0.Args[0] 4997 v.reset(OpARMLessEqualU) 4998 v.AddArg(x) 4999 return true 5000 } 5001 return false 5002 } 5003 func rewriteValueARM_OpARMGreaterThan_0(v *Value) bool { 5004 // match: (GreaterThan (FlagEQ)) 5005 // cond: 5006 // result: (MOVWconst [0]) 5007 for { 5008 v_0 := v.Args[0] 5009 if v_0.Op != OpARMFlagEQ { 5010 break 5011 } 5012 v.reset(OpARMMOVWconst) 5013 v.AuxInt = 0 5014 return true 5015 } 5016 // match: (GreaterThan (FlagLT_ULT)) 5017 // cond: 5018 // result: (MOVWconst [0]) 5019 for { 5020 v_0 := v.Args[0] 5021 if v_0.Op != OpARMFlagLT_ULT { 5022 break 5023 } 5024 v.reset(OpARMMOVWconst) 5025 v.AuxInt = 0 5026 return true 5027 } 5028 // match: (GreaterThan (FlagLT_UGT)) 5029 // cond: 5030 // result: (MOVWconst [0]) 5031 for { 5032 v_0 := v.Args[0] 5033 if v_0.Op != OpARMFlagLT_UGT { 5034 break 5035 } 5036 v.reset(OpARMMOVWconst) 5037 v.AuxInt = 0 5038 return true 5039 } 5040 // match: (GreaterThan (FlagGT_ULT)) 5041 // cond: 5042 // result: (MOVWconst [1]) 5043 for { 5044 v_0 := v.Args[0] 5045 if v_0.Op != OpARMFlagGT_ULT { 5046 break 5047 } 5048 v.reset(OpARMMOVWconst) 5049 v.AuxInt = 1 5050 return true 5051 } 5052 // match: (GreaterThan (FlagGT_UGT)) 5053 // cond: 5054 // result: (MOVWconst [1]) 5055 for { 5056 v_0 := v.Args[0] 5057 if v_0.Op != OpARMFlagGT_UGT { 5058 break 5059 } 5060 v.reset(OpARMMOVWconst) 5061 v.AuxInt = 1 5062 return true 5063 } 5064 // match: (GreaterThan (InvertFlags x)) 5065 // cond: 5066 // result: (LessThan x) 5067 for { 5068 v_0 := v.Args[0] 5069 if v_0.Op != OpARMInvertFlags { 5070 break 5071 } 5072 x := v_0.Args[0] 5073 v.reset(OpARMLessThan) 5074 v.AddArg(x) 5075 return true 5076 } 5077 return false 5078 } 5079 func rewriteValueARM_OpARMGreaterThanU_0(v *Value) bool { 5080 // match: (GreaterThanU (FlagEQ)) 5081 // cond: 5082 // result: (MOVWconst [0]) 5083 for { 5084 v_0 := v.Args[0] 5085 if v_0.Op != OpARMFlagEQ { 5086 break 5087 } 5088 v.reset(OpARMMOVWconst) 5089 v.AuxInt = 0 5090 return true 5091 } 5092 // match: (GreaterThanU (FlagLT_ULT)) 5093 // cond: 5094 // result: (MOVWconst [0]) 5095 for { 5096 v_0 := v.Args[0] 5097 if v_0.Op != OpARMFlagLT_ULT { 5098 break 5099 } 5100 v.reset(OpARMMOVWconst) 5101 v.AuxInt = 0 5102 return true 5103 } 5104 // match: (GreaterThanU (FlagLT_UGT)) 5105 // cond: 5106 // result: (MOVWconst [1]) 5107 for { 5108 v_0 := v.Args[0] 5109 if v_0.Op != OpARMFlagLT_UGT { 5110 break 5111 } 5112 v.reset(OpARMMOVWconst) 5113 v.AuxInt = 1 5114 return true 5115 } 5116 // match: (GreaterThanU (FlagGT_ULT)) 5117 // cond: 5118 // result: (MOVWconst [0]) 5119 for { 5120 v_0 := v.Args[0] 5121 if v_0.Op != OpARMFlagGT_ULT { 5122 break 5123 } 5124 v.reset(OpARMMOVWconst) 5125 v.AuxInt = 0 5126 return true 5127 } 5128 // match: (GreaterThanU (FlagGT_UGT)) 5129 // cond: 5130 // result: (MOVWconst [1]) 5131 for { 5132 v_0 := v.Args[0] 5133 if v_0.Op != OpARMFlagGT_UGT { 5134 break 5135 } 5136 v.reset(OpARMMOVWconst) 5137 v.AuxInt = 1 5138 return true 5139 } 5140 // match: (GreaterThanU (InvertFlags x)) 5141 // cond: 5142 // result: (LessThanU x) 5143 for { 5144 v_0 := v.Args[0] 5145 if v_0.Op != OpARMInvertFlags { 5146 break 5147 } 5148 x := v_0.Args[0] 5149 v.reset(OpARMLessThanU) 5150 v.AddArg(x) 5151 return true 5152 } 5153 return false 5154 } 5155 func rewriteValueARM_OpARMLessEqual_0(v *Value) bool { 5156 // match: (LessEqual (FlagEQ)) 5157 // cond: 5158 // result: (MOVWconst [1]) 5159 for { 5160 v_0 := v.Args[0] 5161 if v_0.Op != OpARMFlagEQ { 5162 break 5163 } 5164 v.reset(OpARMMOVWconst) 5165 v.AuxInt = 1 5166 return true 5167 } 5168 // match: (LessEqual (FlagLT_ULT)) 5169 // cond: 5170 // result: (MOVWconst [1]) 5171 for { 5172 v_0 := v.Args[0] 5173 if v_0.Op != OpARMFlagLT_ULT { 5174 break 5175 } 5176 v.reset(OpARMMOVWconst) 5177 v.AuxInt = 1 5178 return true 5179 } 5180 // match: (LessEqual (FlagLT_UGT)) 5181 // cond: 5182 // result: (MOVWconst [1]) 5183 for { 5184 v_0 := v.Args[0] 5185 if v_0.Op != OpARMFlagLT_UGT { 5186 break 5187 } 5188 v.reset(OpARMMOVWconst) 5189 v.AuxInt = 1 5190 return true 5191 } 5192 // match: (LessEqual (FlagGT_ULT)) 5193 // cond: 5194 // result: (MOVWconst [0]) 5195 for { 5196 v_0 := v.Args[0] 5197 if v_0.Op != OpARMFlagGT_ULT { 5198 break 5199 } 5200 v.reset(OpARMMOVWconst) 5201 v.AuxInt = 0 5202 return true 5203 } 5204 // match: (LessEqual (FlagGT_UGT)) 5205 // cond: 5206 // result: (MOVWconst [0]) 5207 for { 5208 v_0 := v.Args[0] 5209 if v_0.Op != OpARMFlagGT_UGT { 5210 break 5211 } 5212 v.reset(OpARMMOVWconst) 5213 v.AuxInt = 0 5214 return true 5215 } 5216 // match: (LessEqual (InvertFlags x)) 5217 // cond: 5218 // result: (GreaterEqual x) 5219 for { 5220 v_0 := v.Args[0] 5221 if v_0.Op != OpARMInvertFlags { 5222 break 5223 } 5224 x := v_0.Args[0] 5225 v.reset(OpARMGreaterEqual) 5226 v.AddArg(x) 5227 return true 5228 } 5229 return false 5230 } 5231 func rewriteValueARM_OpARMLessEqualU_0(v *Value) bool { 5232 // match: (LessEqualU (FlagEQ)) 5233 // cond: 5234 // result: (MOVWconst [1]) 5235 for { 5236 v_0 := v.Args[0] 5237 if v_0.Op != OpARMFlagEQ { 5238 break 5239 } 5240 v.reset(OpARMMOVWconst) 5241 v.AuxInt = 1 5242 return true 5243 } 5244 // match: (LessEqualU (FlagLT_ULT)) 5245 // cond: 5246 // result: (MOVWconst [1]) 5247 for { 5248 v_0 := v.Args[0] 5249 if v_0.Op != OpARMFlagLT_ULT { 5250 break 5251 } 5252 v.reset(OpARMMOVWconst) 5253 v.AuxInt = 1 5254 return true 5255 } 5256 // match: (LessEqualU (FlagLT_UGT)) 5257 // cond: 5258 // result: (MOVWconst [0]) 5259 for { 5260 v_0 := v.Args[0] 5261 if v_0.Op != OpARMFlagLT_UGT { 5262 break 5263 } 5264 v.reset(OpARMMOVWconst) 5265 v.AuxInt = 0 5266 return true 5267 } 5268 // match: (LessEqualU (FlagGT_ULT)) 5269 // cond: 5270 // result: (MOVWconst [1]) 5271 for { 5272 v_0 := v.Args[0] 5273 if v_0.Op != OpARMFlagGT_ULT { 5274 break 5275 } 5276 v.reset(OpARMMOVWconst) 5277 v.AuxInt = 1 5278 return true 5279 } 5280 // match: (LessEqualU (FlagGT_UGT)) 5281 // cond: 5282 // result: (MOVWconst [0]) 5283 for { 5284 v_0 := v.Args[0] 5285 if v_0.Op != OpARMFlagGT_UGT { 5286 break 5287 } 5288 v.reset(OpARMMOVWconst) 5289 v.AuxInt = 0 5290 return true 5291 } 5292 // match: (LessEqualU (InvertFlags x)) 5293 // cond: 5294 // result: (GreaterEqualU x) 5295 for { 5296 v_0 := v.Args[0] 5297 if v_0.Op != OpARMInvertFlags { 5298 break 5299 } 5300 x := v_0.Args[0] 5301 v.reset(OpARMGreaterEqualU) 5302 v.AddArg(x) 5303 return true 5304 } 5305 return false 5306 } 5307 func rewriteValueARM_OpARMLessThan_0(v *Value) bool { 5308 // match: (LessThan (FlagEQ)) 5309 // cond: 5310 // result: (MOVWconst [0]) 5311 for { 5312 v_0 := v.Args[0] 5313 if v_0.Op != OpARMFlagEQ { 5314 break 5315 } 5316 v.reset(OpARMMOVWconst) 5317 v.AuxInt = 0 5318 return true 5319 } 5320 // match: (LessThan (FlagLT_ULT)) 5321 // cond: 5322 // result: (MOVWconst [1]) 5323 for { 5324 v_0 := v.Args[0] 5325 if v_0.Op != OpARMFlagLT_ULT { 5326 break 5327 } 5328 v.reset(OpARMMOVWconst) 5329 v.AuxInt = 1 5330 return true 5331 } 5332 // match: (LessThan (FlagLT_UGT)) 5333 // cond: 5334 // result: (MOVWconst [1]) 5335 for { 5336 v_0 := v.Args[0] 5337 if v_0.Op != OpARMFlagLT_UGT { 5338 break 5339 } 5340 v.reset(OpARMMOVWconst) 5341 v.AuxInt = 1 5342 return true 5343 } 5344 // match: (LessThan (FlagGT_ULT)) 5345 // cond: 5346 // result: (MOVWconst [0]) 5347 for { 5348 v_0 := v.Args[0] 5349 if v_0.Op != OpARMFlagGT_ULT { 5350 break 5351 } 5352 v.reset(OpARMMOVWconst) 5353 v.AuxInt = 0 5354 return true 5355 } 5356 // match: (LessThan (FlagGT_UGT)) 5357 // cond: 5358 // result: (MOVWconst [0]) 5359 for { 5360 v_0 := v.Args[0] 5361 if v_0.Op != OpARMFlagGT_UGT { 5362 break 5363 } 5364 v.reset(OpARMMOVWconst) 5365 v.AuxInt = 0 5366 return true 5367 } 5368 // match: (LessThan (InvertFlags x)) 5369 // cond: 5370 // result: (GreaterThan x) 5371 for { 5372 v_0 := v.Args[0] 5373 if v_0.Op != OpARMInvertFlags { 5374 break 5375 } 5376 x := v_0.Args[0] 5377 v.reset(OpARMGreaterThan) 5378 v.AddArg(x) 5379 return true 5380 } 5381 return false 5382 } 5383 func rewriteValueARM_OpARMLessThanU_0(v *Value) bool { 5384 // match: (LessThanU (FlagEQ)) 5385 // cond: 5386 // result: (MOVWconst [0]) 5387 for { 5388 v_0 := v.Args[0] 5389 if v_0.Op != OpARMFlagEQ { 5390 break 5391 } 5392 v.reset(OpARMMOVWconst) 5393 v.AuxInt = 0 5394 return true 5395 } 5396 // match: (LessThanU (FlagLT_ULT)) 5397 // cond: 5398 // result: (MOVWconst [1]) 5399 for { 5400 v_0 := v.Args[0] 5401 if v_0.Op != OpARMFlagLT_ULT { 5402 break 5403 } 5404 v.reset(OpARMMOVWconst) 5405 v.AuxInt = 1 5406 return true 5407 } 5408 // match: (LessThanU (FlagLT_UGT)) 5409 // cond: 5410 // result: (MOVWconst [0]) 5411 for { 5412 v_0 := v.Args[0] 5413 if v_0.Op != OpARMFlagLT_UGT { 5414 break 5415 } 5416 v.reset(OpARMMOVWconst) 5417 v.AuxInt = 0 5418 return true 5419 } 5420 // match: (LessThanU (FlagGT_ULT)) 5421 // cond: 5422 // result: (MOVWconst [1]) 5423 for { 5424 v_0 := v.Args[0] 5425 if v_0.Op != OpARMFlagGT_ULT { 5426 break 5427 } 5428 v.reset(OpARMMOVWconst) 5429 v.AuxInt = 1 5430 return true 5431 } 5432 // match: (LessThanU (FlagGT_UGT)) 5433 // cond: 5434 // result: (MOVWconst [0]) 5435 for { 5436 v_0 := v.Args[0] 5437 if v_0.Op != OpARMFlagGT_UGT { 5438 break 5439 } 5440 v.reset(OpARMMOVWconst) 5441 v.AuxInt = 0 5442 return true 5443 } 5444 // match: (LessThanU (InvertFlags x)) 5445 // cond: 5446 // result: (GreaterThanU x) 5447 for { 5448 v_0 := v.Args[0] 5449 if v_0.Op != OpARMInvertFlags { 5450 break 5451 } 5452 x := v_0.Args[0] 5453 v.reset(OpARMGreaterThanU) 5454 v.AddArg(x) 5455 return true 5456 } 5457 return false 5458 } 5459 func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { 5460 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 5461 // cond: 5462 // result: (MOVBUload [off1+off2] {sym} ptr mem) 5463 for { 5464 off1 := v.AuxInt 5465 sym := v.Aux 5466 v_0 := v.Args[0] 5467 if v_0.Op != OpARMADDconst { 5468 break 5469 } 5470 off2 := v_0.AuxInt 5471 ptr := v_0.Args[0] 5472 mem := v.Args[1] 5473 v.reset(OpARMMOVBUload) 5474 v.AuxInt = off1 + off2 5475 v.Aux = sym 5476 v.AddArg(ptr) 5477 v.AddArg(mem) 5478 return true 5479 } 5480 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5481 // cond: canMergeSym(sym1,sym2) 5482 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5483 for { 5484 off1 := v.AuxInt 5485 sym1 := v.Aux 5486 v_0 := v.Args[0] 5487 if v_0.Op != OpARMMOVWaddr { 5488 break 5489 } 5490 off2 := v_0.AuxInt 5491 sym2 := v_0.Aux 5492 ptr := v_0.Args[0] 5493 mem := v.Args[1] 5494 if !(canMergeSym(sym1, sym2)) { 5495 break 5496 } 5497 v.reset(OpARMMOVBUload) 5498 v.AuxInt = off1 + off2 5499 v.Aux = mergeSym(sym1, sym2) 5500 v.AddArg(ptr) 5501 v.AddArg(mem) 5502 return true 5503 } 5504 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5505 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type) 5506 // result: x 5507 for { 5508 off := v.AuxInt 5509 sym := v.Aux 5510 ptr := v.Args[0] 5511 v_1 := v.Args[1] 5512 if v_1.Op != OpARMMOVBstore { 5513 break 5514 } 5515 off2 := v_1.AuxInt 5516 sym2 := v_1.Aux 5517 ptr2 := v_1.Args[0] 5518 x := v_1.Args[1] 5519 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type)) { 5520 break 5521 } 5522 v.reset(OpCopy) 5523 v.Type = x.Type 5524 v.AddArg(x) 5525 return true 5526 } 5527 return false 5528 } 5529 func rewriteValueARM_OpARMMOVBUreg_0(v *Value) bool { 5530 // match: (MOVBUreg x:(MOVBUload _ _)) 5531 // cond: 5532 // result: (MOVWreg x) 5533 for { 5534 x := v.Args[0] 5535 if x.Op != OpARMMOVBUload { 5536 break 5537 } 5538 v.reset(OpARMMOVWreg) 5539 v.AddArg(x) 5540 return true 5541 } 5542 // match: (MOVBUreg (ANDconst [c] x)) 5543 // cond: 5544 // result: (ANDconst [c&0xff] x) 5545 for { 5546 v_0 := v.Args[0] 5547 if v_0.Op != OpARMANDconst { 5548 break 5549 } 5550 c := v_0.AuxInt 5551 x := v_0.Args[0] 5552 v.reset(OpARMANDconst) 5553 v.AuxInt = c & 0xff 5554 v.AddArg(x) 5555 return true 5556 } 5557 // match: (MOVBUreg x:(MOVBUreg _)) 5558 // cond: 5559 // result: (MOVWreg x) 5560 for { 5561 x := v.Args[0] 5562 if x.Op != OpARMMOVBUreg { 5563 break 5564 } 5565 v.reset(OpARMMOVWreg) 5566 v.AddArg(x) 5567 return true 5568 } 5569 // match: (MOVBUreg (MOVWconst [c])) 5570 // cond: 5571 // result: (MOVWconst [int64(uint8(c))]) 5572 for { 5573 v_0 := v.Args[0] 5574 if v_0.Op != OpARMMOVWconst { 5575 break 5576 } 5577 c := v_0.AuxInt 5578 v.reset(OpARMMOVWconst) 5579 v.AuxInt = int64(uint8(c)) 5580 return true 5581 } 5582 return false 5583 } 5584 func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { 5585 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 5586 // cond: 5587 // result: (MOVBload [off1+off2] {sym} ptr mem) 5588 for { 5589 off1 := v.AuxInt 5590 sym := v.Aux 5591 v_0 := v.Args[0] 5592 if v_0.Op != OpARMADDconst { 5593 break 5594 } 5595 off2 := v_0.AuxInt 5596 ptr := v_0.Args[0] 5597 mem := v.Args[1] 5598 v.reset(OpARMMOVBload) 5599 v.AuxInt = off1 + off2 5600 v.Aux = sym 5601 v.AddArg(ptr) 5602 v.AddArg(mem) 5603 return true 5604 } 5605 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5606 // cond: canMergeSym(sym1,sym2) 5607 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5608 for { 5609 off1 := v.AuxInt 5610 sym1 := v.Aux 5611 v_0 := v.Args[0] 5612 if v_0.Op != OpARMMOVWaddr { 5613 break 5614 } 5615 off2 := v_0.AuxInt 5616 sym2 := v_0.Aux 5617 ptr := v_0.Args[0] 5618 mem := v.Args[1] 5619 if !(canMergeSym(sym1, sym2)) { 5620 break 5621 } 5622 v.reset(OpARMMOVBload) 5623 v.AuxInt = off1 + off2 5624 v.Aux = mergeSym(sym1, sym2) 5625 v.AddArg(ptr) 5626 v.AddArg(mem) 5627 return true 5628 } 5629 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5630 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type) 5631 // result: x 5632 for { 5633 off := v.AuxInt 5634 sym := v.Aux 5635 ptr := v.Args[0] 5636 v_1 := v.Args[1] 5637 if v_1.Op != OpARMMOVBstore { 5638 break 5639 } 5640 off2 := v_1.AuxInt 5641 sym2 := v_1.Aux 5642 ptr2 := v_1.Args[0] 5643 x := v_1.Args[1] 5644 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type)) { 5645 break 5646 } 5647 v.reset(OpCopy) 5648 v.Type = x.Type 5649 v.AddArg(x) 5650 return true 5651 } 5652 return false 5653 } 5654 func rewriteValueARM_OpARMMOVBreg_0(v *Value) bool { 5655 // match: (MOVBreg x:(MOVBload _ _)) 5656 // cond: 5657 // result: (MOVWreg x) 5658 for { 5659 x := v.Args[0] 5660 if x.Op != OpARMMOVBload { 5661 break 5662 } 5663 v.reset(OpARMMOVWreg) 5664 v.AddArg(x) 5665 return true 5666 } 5667 // match: (MOVBreg (ANDconst [c] x)) 5668 // cond: c & 0x80 == 0 5669 // result: (ANDconst [c&0x7f] x) 5670 for { 5671 v_0 := v.Args[0] 5672 if v_0.Op != OpARMANDconst { 5673 break 5674 } 5675 c := v_0.AuxInt 5676 x := v_0.Args[0] 5677 if !(c&0x80 == 0) { 5678 break 5679 } 5680 v.reset(OpARMANDconst) 5681 v.AuxInt = c & 0x7f 5682 v.AddArg(x) 5683 return true 5684 } 5685 // match: (MOVBreg x:(MOVBreg _)) 5686 // cond: 5687 // result: (MOVWreg x) 5688 for { 5689 x := v.Args[0] 5690 if x.Op != OpARMMOVBreg { 5691 break 5692 } 5693 v.reset(OpARMMOVWreg) 5694 v.AddArg(x) 5695 return true 5696 } 5697 // match: (MOVBreg (MOVWconst [c])) 5698 // cond: 5699 // result: (MOVWconst [int64(int8(c))]) 5700 for { 5701 v_0 := v.Args[0] 5702 if v_0.Op != OpARMMOVWconst { 5703 break 5704 } 5705 c := v_0.AuxInt 5706 v.reset(OpARMMOVWconst) 5707 v.AuxInt = int64(int8(c)) 5708 return true 5709 } 5710 return false 5711 } 5712 func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { 5713 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5714 // cond: 5715 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 5716 for { 5717 off1 := v.AuxInt 5718 sym := v.Aux 5719 v_0 := v.Args[0] 5720 if v_0.Op != OpARMADDconst { 5721 break 5722 } 5723 off2 := v_0.AuxInt 5724 ptr := v_0.Args[0] 5725 val := v.Args[1] 5726 mem := v.Args[2] 5727 v.reset(OpARMMOVBstore) 5728 v.AuxInt = off1 + off2 5729 v.Aux = sym 5730 v.AddArg(ptr) 5731 v.AddArg(val) 5732 v.AddArg(mem) 5733 return true 5734 } 5735 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5736 // cond: canMergeSym(sym1,sym2) 5737 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5738 for { 5739 off1 := v.AuxInt 5740 sym1 := v.Aux 5741 v_0 := v.Args[0] 5742 if v_0.Op != OpARMMOVWaddr { 5743 break 5744 } 5745 off2 := v_0.AuxInt 5746 sym2 := v_0.Aux 5747 ptr := v_0.Args[0] 5748 val := v.Args[1] 5749 mem := v.Args[2] 5750 if !(canMergeSym(sym1, sym2)) { 5751 break 5752 } 5753 v.reset(OpARMMOVBstore) 5754 v.AuxInt = off1 + off2 5755 v.Aux = mergeSym(sym1, sym2) 5756 v.AddArg(ptr) 5757 v.AddArg(val) 5758 v.AddArg(mem) 5759 return true 5760 } 5761 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 5762 // cond: 5763 // result: (MOVBstore [off] {sym} ptr x mem) 5764 for { 5765 off := v.AuxInt 5766 sym := v.Aux 5767 ptr := v.Args[0] 5768 v_1 := v.Args[1] 5769 if v_1.Op != OpARMMOVBreg { 5770 break 5771 } 5772 x := v_1.Args[0] 5773 mem := v.Args[2] 5774 v.reset(OpARMMOVBstore) 5775 v.AuxInt = off 5776 v.Aux = sym 5777 v.AddArg(ptr) 5778 v.AddArg(x) 5779 v.AddArg(mem) 5780 return true 5781 } 5782 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 5783 // cond: 5784 // result: (MOVBstore [off] {sym} ptr x mem) 5785 for { 5786 off := v.AuxInt 5787 sym := v.Aux 5788 ptr := v.Args[0] 5789 v_1 := v.Args[1] 5790 if v_1.Op != OpARMMOVBUreg { 5791 break 5792 } 5793 x := v_1.Args[0] 5794 mem := v.Args[2] 5795 v.reset(OpARMMOVBstore) 5796 v.AuxInt = off 5797 v.Aux = sym 5798 v.AddArg(ptr) 5799 v.AddArg(x) 5800 v.AddArg(mem) 5801 return true 5802 } 5803 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 5804 // cond: 5805 // result: (MOVBstore [off] {sym} ptr x mem) 5806 for { 5807 off := v.AuxInt 5808 sym := v.Aux 5809 ptr := v.Args[0] 5810 v_1 := v.Args[1] 5811 if v_1.Op != OpARMMOVHreg { 5812 break 5813 } 5814 x := v_1.Args[0] 5815 mem := v.Args[2] 5816 v.reset(OpARMMOVBstore) 5817 v.AuxInt = off 5818 v.Aux = sym 5819 v.AddArg(ptr) 5820 v.AddArg(x) 5821 v.AddArg(mem) 5822 return true 5823 } 5824 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 5825 // cond: 5826 // result: (MOVBstore [off] {sym} ptr x mem) 5827 for { 5828 off := v.AuxInt 5829 sym := v.Aux 5830 ptr := v.Args[0] 5831 v_1 := v.Args[1] 5832 if v_1.Op != OpARMMOVHUreg { 5833 break 5834 } 5835 x := v_1.Args[0] 5836 mem := v.Args[2] 5837 v.reset(OpARMMOVBstore) 5838 v.AuxInt = off 5839 v.Aux = sym 5840 v.AddArg(ptr) 5841 v.AddArg(x) 5842 v.AddArg(mem) 5843 return true 5844 } 5845 return false 5846 } 5847 func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { 5848 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 5849 // cond: 5850 // result: (MOVDload [off1+off2] {sym} ptr mem) 5851 for { 5852 off1 := v.AuxInt 5853 sym := v.Aux 5854 v_0 := v.Args[0] 5855 if v_0.Op != OpARMADDconst { 5856 break 5857 } 5858 off2 := v_0.AuxInt 5859 ptr := v_0.Args[0] 5860 mem := v.Args[1] 5861 v.reset(OpARMMOVDload) 5862 v.AuxInt = off1 + off2 5863 v.Aux = sym 5864 v.AddArg(ptr) 5865 v.AddArg(mem) 5866 return true 5867 } 5868 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5869 // cond: canMergeSym(sym1,sym2) 5870 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5871 for { 5872 off1 := v.AuxInt 5873 sym1 := v.Aux 5874 v_0 := v.Args[0] 5875 if v_0.Op != OpARMMOVWaddr { 5876 break 5877 } 5878 off2 := v_0.AuxInt 5879 sym2 := v_0.Aux 5880 ptr := v_0.Args[0] 5881 mem := v.Args[1] 5882 if !(canMergeSym(sym1, sym2)) { 5883 break 5884 } 5885 v.reset(OpARMMOVDload) 5886 v.AuxInt = off1 + off2 5887 v.Aux = mergeSym(sym1, sym2) 5888 v.AddArg(ptr) 5889 v.AddArg(mem) 5890 return true 5891 } 5892 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 5893 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5894 // result: x 5895 for { 5896 off := v.AuxInt 5897 sym := v.Aux 5898 ptr := v.Args[0] 5899 v_1 := v.Args[1] 5900 if v_1.Op != OpARMMOVDstore { 5901 break 5902 } 5903 off2 := v_1.AuxInt 5904 sym2 := v_1.Aux 5905 ptr2 := v_1.Args[0] 5906 x := v_1.Args[1] 5907 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5908 break 5909 } 5910 v.reset(OpCopy) 5911 v.Type = x.Type 5912 v.AddArg(x) 5913 return true 5914 } 5915 return false 5916 } 5917 func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { 5918 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 5919 // cond: 5920 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 5921 for { 5922 off1 := v.AuxInt 5923 sym := v.Aux 5924 v_0 := v.Args[0] 5925 if v_0.Op != OpARMADDconst { 5926 break 5927 } 5928 off2 := v_0.AuxInt 5929 ptr := v_0.Args[0] 5930 val := v.Args[1] 5931 mem := v.Args[2] 5932 v.reset(OpARMMOVDstore) 5933 v.AuxInt = off1 + off2 5934 v.Aux = sym 5935 v.AddArg(ptr) 5936 v.AddArg(val) 5937 v.AddArg(mem) 5938 return true 5939 } 5940 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 5941 // cond: canMergeSym(sym1,sym2) 5942 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 5943 for { 5944 off1 := v.AuxInt 5945 sym1 := v.Aux 5946 v_0 := v.Args[0] 5947 if v_0.Op != OpARMMOVWaddr { 5948 break 5949 } 5950 off2 := v_0.AuxInt 5951 sym2 := v_0.Aux 5952 ptr := v_0.Args[0] 5953 val := v.Args[1] 5954 mem := v.Args[2] 5955 if !(canMergeSym(sym1, sym2)) { 5956 break 5957 } 5958 v.reset(OpARMMOVDstore) 5959 v.AuxInt = off1 + off2 5960 v.Aux = mergeSym(sym1, sym2) 5961 v.AddArg(ptr) 5962 v.AddArg(val) 5963 v.AddArg(mem) 5964 return true 5965 } 5966 return false 5967 } 5968 func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { 5969 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 5970 // cond: 5971 // result: (MOVFload [off1+off2] {sym} ptr mem) 5972 for { 5973 off1 := v.AuxInt 5974 sym := v.Aux 5975 v_0 := v.Args[0] 5976 if v_0.Op != OpARMADDconst { 5977 break 5978 } 5979 off2 := v_0.AuxInt 5980 ptr := v_0.Args[0] 5981 mem := v.Args[1] 5982 v.reset(OpARMMOVFload) 5983 v.AuxInt = off1 + off2 5984 v.Aux = sym 5985 v.AddArg(ptr) 5986 v.AddArg(mem) 5987 return true 5988 } 5989 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5990 // cond: canMergeSym(sym1,sym2) 5991 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5992 for { 5993 off1 := v.AuxInt 5994 sym1 := v.Aux 5995 v_0 := v.Args[0] 5996 if v_0.Op != OpARMMOVWaddr { 5997 break 5998 } 5999 off2 := v_0.AuxInt 6000 sym2 := v_0.Aux 6001 ptr := v_0.Args[0] 6002 mem := v.Args[1] 6003 if !(canMergeSym(sym1, sym2)) { 6004 break 6005 } 6006 v.reset(OpARMMOVFload) 6007 v.AuxInt = off1 + off2 6008 v.Aux = mergeSym(sym1, sym2) 6009 v.AddArg(ptr) 6010 v.AddArg(mem) 6011 return true 6012 } 6013 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 6014 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6015 // result: x 6016 for { 6017 off := v.AuxInt 6018 sym := v.Aux 6019 ptr := v.Args[0] 6020 v_1 := v.Args[1] 6021 if v_1.Op != OpARMMOVFstore { 6022 break 6023 } 6024 off2 := v_1.AuxInt 6025 sym2 := v_1.Aux 6026 ptr2 := v_1.Args[0] 6027 x := v_1.Args[1] 6028 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6029 break 6030 } 6031 v.reset(OpCopy) 6032 v.Type = x.Type 6033 v.AddArg(x) 6034 return true 6035 } 6036 return false 6037 } 6038 func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { 6039 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6040 // cond: 6041 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 6042 for { 6043 off1 := v.AuxInt 6044 sym := v.Aux 6045 v_0 := v.Args[0] 6046 if v_0.Op != OpARMADDconst { 6047 break 6048 } 6049 off2 := v_0.AuxInt 6050 ptr := v_0.Args[0] 6051 val := v.Args[1] 6052 mem := v.Args[2] 6053 v.reset(OpARMMOVFstore) 6054 v.AuxInt = off1 + off2 6055 v.Aux = sym 6056 v.AddArg(ptr) 6057 v.AddArg(val) 6058 v.AddArg(mem) 6059 return true 6060 } 6061 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6062 // cond: canMergeSym(sym1,sym2) 6063 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6064 for { 6065 off1 := v.AuxInt 6066 sym1 := v.Aux 6067 v_0 := v.Args[0] 6068 if v_0.Op != OpARMMOVWaddr { 6069 break 6070 } 6071 off2 := v_0.AuxInt 6072 sym2 := v_0.Aux 6073 ptr := v_0.Args[0] 6074 val := v.Args[1] 6075 mem := v.Args[2] 6076 if !(canMergeSym(sym1, sym2)) { 6077 break 6078 } 6079 v.reset(OpARMMOVFstore) 6080 v.AuxInt = off1 + off2 6081 v.Aux = mergeSym(sym1, sym2) 6082 v.AddArg(ptr) 6083 v.AddArg(val) 6084 v.AddArg(mem) 6085 return true 6086 } 6087 return false 6088 } 6089 func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { 6090 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 6091 // cond: 6092 // result: (MOVHUload [off1+off2] {sym} ptr mem) 6093 for { 6094 off1 := v.AuxInt 6095 sym := v.Aux 6096 v_0 := v.Args[0] 6097 if v_0.Op != OpARMADDconst { 6098 break 6099 } 6100 off2 := v_0.AuxInt 6101 ptr := v_0.Args[0] 6102 mem := v.Args[1] 6103 v.reset(OpARMMOVHUload) 6104 v.AuxInt = off1 + off2 6105 v.Aux = sym 6106 v.AddArg(ptr) 6107 v.AddArg(mem) 6108 return true 6109 } 6110 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6111 // cond: canMergeSym(sym1,sym2) 6112 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6113 for { 6114 off1 := v.AuxInt 6115 sym1 := v.Aux 6116 v_0 := v.Args[0] 6117 if v_0.Op != OpARMMOVWaddr { 6118 break 6119 } 6120 off2 := v_0.AuxInt 6121 sym2 := v_0.Aux 6122 ptr := v_0.Args[0] 6123 mem := v.Args[1] 6124 if !(canMergeSym(sym1, sym2)) { 6125 break 6126 } 6127 v.reset(OpARMMOVHUload) 6128 v.AuxInt = off1 + off2 6129 v.Aux = mergeSym(sym1, sym2) 6130 v.AddArg(ptr) 6131 v.AddArg(mem) 6132 return true 6133 } 6134 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 6135 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type) 6136 // result: x 6137 for { 6138 off := v.AuxInt 6139 sym := v.Aux 6140 ptr := v.Args[0] 6141 v_1 := v.Args[1] 6142 if v_1.Op != OpARMMOVHstore { 6143 break 6144 } 6145 off2 := v_1.AuxInt 6146 sym2 := v_1.Aux 6147 ptr2 := v_1.Args[0] 6148 x := v_1.Args[1] 6149 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && !isSigned(x.Type)) { 6150 break 6151 } 6152 v.reset(OpCopy) 6153 v.Type = x.Type 6154 v.AddArg(x) 6155 return true 6156 } 6157 return false 6158 } 6159 func rewriteValueARM_OpARMMOVHUreg_0(v *Value) bool { 6160 // match: (MOVHUreg x:(MOVBUload _ _)) 6161 // cond: 6162 // result: (MOVWreg x) 6163 for { 6164 x := v.Args[0] 6165 if x.Op != OpARMMOVBUload { 6166 break 6167 } 6168 v.reset(OpARMMOVWreg) 6169 v.AddArg(x) 6170 return true 6171 } 6172 // match: (MOVHUreg x:(MOVHUload _ _)) 6173 // cond: 6174 // result: (MOVWreg x) 6175 for { 6176 x := v.Args[0] 6177 if x.Op != OpARMMOVHUload { 6178 break 6179 } 6180 v.reset(OpARMMOVWreg) 6181 v.AddArg(x) 6182 return true 6183 } 6184 // match: (MOVHUreg (ANDconst [c] x)) 6185 // cond: 6186 // result: (ANDconst [c&0xffff] x) 6187 for { 6188 v_0 := v.Args[0] 6189 if v_0.Op != OpARMANDconst { 6190 break 6191 } 6192 c := v_0.AuxInt 6193 x := v_0.Args[0] 6194 v.reset(OpARMANDconst) 6195 v.AuxInt = c & 0xffff 6196 v.AddArg(x) 6197 return true 6198 } 6199 // match: (MOVHUreg x:(MOVBUreg _)) 6200 // cond: 6201 // result: (MOVWreg x) 6202 for { 6203 x := v.Args[0] 6204 if x.Op != OpARMMOVBUreg { 6205 break 6206 } 6207 v.reset(OpARMMOVWreg) 6208 v.AddArg(x) 6209 return true 6210 } 6211 // match: (MOVHUreg x:(MOVHUreg _)) 6212 // cond: 6213 // result: (MOVWreg x) 6214 for { 6215 x := v.Args[0] 6216 if x.Op != OpARMMOVHUreg { 6217 break 6218 } 6219 v.reset(OpARMMOVWreg) 6220 v.AddArg(x) 6221 return true 6222 } 6223 // match: (MOVHUreg (MOVWconst [c])) 6224 // cond: 6225 // result: (MOVWconst [int64(uint16(c))]) 6226 for { 6227 v_0 := v.Args[0] 6228 if v_0.Op != OpARMMOVWconst { 6229 break 6230 } 6231 c := v_0.AuxInt 6232 v.reset(OpARMMOVWconst) 6233 v.AuxInt = int64(uint16(c)) 6234 return true 6235 } 6236 return false 6237 } 6238 func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { 6239 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 6240 // cond: 6241 // result: (MOVHload [off1+off2] {sym} ptr mem) 6242 for { 6243 off1 := v.AuxInt 6244 sym := v.Aux 6245 v_0 := v.Args[0] 6246 if v_0.Op != OpARMADDconst { 6247 break 6248 } 6249 off2 := v_0.AuxInt 6250 ptr := v_0.Args[0] 6251 mem := v.Args[1] 6252 v.reset(OpARMMOVHload) 6253 v.AuxInt = off1 + off2 6254 v.Aux = sym 6255 v.AddArg(ptr) 6256 v.AddArg(mem) 6257 return true 6258 } 6259 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6260 // cond: canMergeSym(sym1,sym2) 6261 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6262 for { 6263 off1 := v.AuxInt 6264 sym1 := v.Aux 6265 v_0 := v.Args[0] 6266 if v_0.Op != OpARMMOVWaddr { 6267 break 6268 } 6269 off2 := v_0.AuxInt 6270 sym2 := v_0.Aux 6271 ptr := v_0.Args[0] 6272 mem := v.Args[1] 6273 if !(canMergeSym(sym1, sym2)) { 6274 break 6275 } 6276 v.reset(OpARMMOVHload) 6277 v.AuxInt = off1 + off2 6278 v.Aux = mergeSym(sym1, sym2) 6279 v.AddArg(ptr) 6280 v.AddArg(mem) 6281 return true 6282 } 6283 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 6284 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type) 6285 // result: x 6286 for { 6287 off := v.AuxInt 6288 sym := v.Aux 6289 ptr := v.Args[0] 6290 v_1 := v.Args[1] 6291 if v_1.Op != OpARMMOVHstore { 6292 break 6293 } 6294 off2 := v_1.AuxInt 6295 sym2 := v_1.Aux 6296 ptr2 := v_1.Args[0] 6297 x := v_1.Args[1] 6298 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) && isSigned(x.Type)) { 6299 break 6300 } 6301 v.reset(OpCopy) 6302 v.Type = x.Type 6303 v.AddArg(x) 6304 return true 6305 } 6306 return false 6307 } 6308 func rewriteValueARM_OpARMMOVHreg_0(v *Value) bool { 6309 // match: (MOVHreg x:(MOVBload _ _)) 6310 // cond: 6311 // result: (MOVWreg x) 6312 for { 6313 x := v.Args[0] 6314 if x.Op != OpARMMOVBload { 6315 break 6316 } 6317 v.reset(OpARMMOVWreg) 6318 v.AddArg(x) 6319 return true 6320 } 6321 // match: (MOVHreg x:(MOVBUload _ _)) 6322 // cond: 6323 // result: (MOVWreg x) 6324 for { 6325 x := v.Args[0] 6326 if x.Op != OpARMMOVBUload { 6327 break 6328 } 6329 v.reset(OpARMMOVWreg) 6330 v.AddArg(x) 6331 return true 6332 } 6333 // match: (MOVHreg x:(MOVHload _ _)) 6334 // cond: 6335 // result: (MOVWreg x) 6336 for { 6337 x := v.Args[0] 6338 if x.Op != OpARMMOVHload { 6339 break 6340 } 6341 v.reset(OpARMMOVWreg) 6342 v.AddArg(x) 6343 return true 6344 } 6345 // match: (MOVHreg (ANDconst [c] x)) 6346 // cond: c & 0x8000 == 0 6347 // result: (ANDconst [c&0x7fff] x) 6348 for { 6349 v_0 := v.Args[0] 6350 if v_0.Op != OpARMANDconst { 6351 break 6352 } 6353 c := v_0.AuxInt 6354 x := v_0.Args[0] 6355 if !(c&0x8000 == 0) { 6356 break 6357 } 6358 v.reset(OpARMANDconst) 6359 v.AuxInt = c & 0x7fff 6360 v.AddArg(x) 6361 return true 6362 } 6363 // match: (MOVHreg x:(MOVBreg _)) 6364 // cond: 6365 // result: (MOVWreg x) 6366 for { 6367 x := v.Args[0] 6368 if x.Op != OpARMMOVBreg { 6369 break 6370 } 6371 v.reset(OpARMMOVWreg) 6372 v.AddArg(x) 6373 return true 6374 } 6375 // match: (MOVHreg x:(MOVBUreg _)) 6376 // cond: 6377 // result: (MOVWreg x) 6378 for { 6379 x := v.Args[0] 6380 if x.Op != OpARMMOVBUreg { 6381 break 6382 } 6383 v.reset(OpARMMOVWreg) 6384 v.AddArg(x) 6385 return true 6386 } 6387 // match: (MOVHreg x:(MOVHreg _)) 6388 // cond: 6389 // result: (MOVWreg x) 6390 for { 6391 x := v.Args[0] 6392 if x.Op != OpARMMOVHreg { 6393 break 6394 } 6395 v.reset(OpARMMOVWreg) 6396 v.AddArg(x) 6397 return true 6398 } 6399 // match: (MOVHreg (MOVWconst [c])) 6400 // cond: 6401 // result: (MOVWconst [int64(int16(c))]) 6402 for { 6403 v_0 := v.Args[0] 6404 if v_0.Op != OpARMMOVWconst { 6405 break 6406 } 6407 c := v_0.AuxInt 6408 v.reset(OpARMMOVWconst) 6409 v.AuxInt = int64(int16(c)) 6410 return true 6411 } 6412 return false 6413 } 6414 func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { 6415 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6416 // cond: 6417 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 6418 for { 6419 off1 := v.AuxInt 6420 sym := v.Aux 6421 v_0 := v.Args[0] 6422 if v_0.Op != OpARMADDconst { 6423 break 6424 } 6425 off2 := v_0.AuxInt 6426 ptr := v_0.Args[0] 6427 val := v.Args[1] 6428 mem := v.Args[2] 6429 v.reset(OpARMMOVHstore) 6430 v.AuxInt = off1 + off2 6431 v.Aux = sym 6432 v.AddArg(ptr) 6433 v.AddArg(val) 6434 v.AddArg(mem) 6435 return true 6436 } 6437 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6438 // cond: canMergeSym(sym1,sym2) 6439 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6440 for { 6441 off1 := v.AuxInt 6442 sym1 := v.Aux 6443 v_0 := v.Args[0] 6444 if v_0.Op != OpARMMOVWaddr { 6445 break 6446 } 6447 off2 := v_0.AuxInt 6448 sym2 := v_0.Aux 6449 ptr := v_0.Args[0] 6450 val := v.Args[1] 6451 mem := v.Args[2] 6452 if !(canMergeSym(sym1, sym2)) { 6453 break 6454 } 6455 v.reset(OpARMMOVHstore) 6456 v.AuxInt = off1 + off2 6457 v.Aux = mergeSym(sym1, sym2) 6458 v.AddArg(ptr) 6459 v.AddArg(val) 6460 v.AddArg(mem) 6461 return true 6462 } 6463 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 6464 // cond: 6465 // result: (MOVHstore [off] {sym} ptr x mem) 6466 for { 6467 off := v.AuxInt 6468 sym := v.Aux 6469 ptr := v.Args[0] 6470 v_1 := v.Args[1] 6471 if v_1.Op != OpARMMOVHreg { 6472 break 6473 } 6474 x := v_1.Args[0] 6475 mem := v.Args[2] 6476 v.reset(OpARMMOVHstore) 6477 v.AuxInt = off 6478 v.Aux = sym 6479 v.AddArg(ptr) 6480 v.AddArg(x) 6481 v.AddArg(mem) 6482 return true 6483 } 6484 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 6485 // cond: 6486 // result: (MOVHstore [off] {sym} ptr x mem) 6487 for { 6488 off := v.AuxInt 6489 sym := v.Aux 6490 ptr := v.Args[0] 6491 v_1 := v.Args[1] 6492 if v_1.Op != OpARMMOVHUreg { 6493 break 6494 } 6495 x := v_1.Args[0] 6496 mem := v.Args[2] 6497 v.reset(OpARMMOVHstore) 6498 v.AuxInt = off 6499 v.Aux = sym 6500 v.AddArg(ptr) 6501 v.AddArg(x) 6502 v.AddArg(mem) 6503 return true 6504 } 6505 return false 6506 } 6507 func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { 6508 b := v.Block 6509 _ = b 6510 config := b.Func.Config 6511 _ = config 6512 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 6513 // cond: 6514 // result: (MOVWload [off1+off2] {sym} ptr mem) 6515 for { 6516 off1 := v.AuxInt 6517 sym := v.Aux 6518 v_0 := v.Args[0] 6519 if v_0.Op != OpARMADDconst { 6520 break 6521 } 6522 off2 := v_0.AuxInt 6523 ptr := v_0.Args[0] 6524 mem := v.Args[1] 6525 v.reset(OpARMMOVWload) 6526 v.AuxInt = off1 + off2 6527 v.Aux = sym 6528 v.AddArg(ptr) 6529 v.AddArg(mem) 6530 return true 6531 } 6532 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6533 // cond: canMergeSym(sym1,sym2) 6534 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6535 for { 6536 off1 := v.AuxInt 6537 sym1 := v.Aux 6538 v_0 := v.Args[0] 6539 if v_0.Op != OpARMMOVWaddr { 6540 break 6541 } 6542 off2 := v_0.AuxInt 6543 sym2 := v_0.Aux 6544 ptr := v_0.Args[0] 6545 mem := v.Args[1] 6546 if !(canMergeSym(sym1, sym2)) { 6547 break 6548 } 6549 v.reset(OpARMMOVWload) 6550 v.AuxInt = off1 + off2 6551 v.Aux = mergeSym(sym1, sym2) 6552 v.AddArg(ptr) 6553 v.AddArg(mem) 6554 return true 6555 } 6556 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 6557 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6558 // result: x 6559 for { 6560 off := v.AuxInt 6561 sym := v.Aux 6562 ptr := v.Args[0] 6563 v_1 := v.Args[1] 6564 if v_1.Op != OpARMMOVWstore { 6565 break 6566 } 6567 off2 := v_1.AuxInt 6568 sym2 := v_1.Aux 6569 ptr2 := v_1.Args[0] 6570 x := v_1.Args[1] 6571 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6572 break 6573 } 6574 v.reset(OpCopy) 6575 v.Type = x.Type 6576 v.AddArg(x) 6577 return true 6578 } 6579 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 6580 // cond: sym == nil && !config.nacl 6581 // result: (MOVWloadidx ptr idx mem) 6582 for { 6583 if v.AuxInt != 0 { 6584 break 6585 } 6586 sym := v.Aux 6587 v_0 := v.Args[0] 6588 if v_0.Op != OpARMADD { 6589 break 6590 } 6591 ptr := v_0.Args[0] 6592 idx := v_0.Args[1] 6593 mem := v.Args[1] 6594 if !(sym == nil && !config.nacl) { 6595 break 6596 } 6597 v.reset(OpARMMOVWloadidx) 6598 v.AddArg(ptr) 6599 v.AddArg(idx) 6600 v.AddArg(mem) 6601 return true 6602 } 6603 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 6604 // cond: sym == nil && !config.nacl 6605 // result: (MOVWloadshiftLL ptr idx [c] mem) 6606 for { 6607 if v.AuxInt != 0 { 6608 break 6609 } 6610 sym := v.Aux 6611 v_0 := v.Args[0] 6612 if v_0.Op != OpARMADDshiftLL { 6613 break 6614 } 6615 c := v_0.AuxInt 6616 ptr := v_0.Args[0] 6617 idx := v_0.Args[1] 6618 mem := v.Args[1] 6619 if !(sym == nil && !config.nacl) { 6620 break 6621 } 6622 v.reset(OpARMMOVWloadshiftLL) 6623 v.AuxInt = c 6624 v.AddArg(ptr) 6625 v.AddArg(idx) 6626 v.AddArg(mem) 6627 return true 6628 } 6629 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 6630 // cond: sym == nil && !config.nacl 6631 // result: (MOVWloadshiftRL ptr idx [c] mem) 6632 for { 6633 if v.AuxInt != 0 { 6634 break 6635 } 6636 sym := v.Aux 6637 v_0 := v.Args[0] 6638 if v_0.Op != OpARMADDshiftRL { 6639 break 6640 } 6641 c := v_0.AuxInt 6642 ptr := v_0.Args[0] 6643 idx := v_0.Args[1] 6644 mem := v.Args[1] 6645 if !(sym == nil && !config.nacl) { 6646 break 6647 } 6648 v.reset(OpARMMOVWloadshiftRL) 6649 v.AuxInt = c 6650 v.AddArg(ptr) 6651 v.AddArg(idx) 6652 v.AddArg(mem) 6653 return true 6654 } 6655 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 6656 // cond: sym == nil && !config.nacl 6657 // result: (MOVWloadshiftRA ptr idx [c] mem) 6658 for { 6659 if v.AuxInt != 0 { 6660 break 6661 } 6662 sym := v.Aux 6663 v_0 := v.Args[0] 6664 if v_0.Op != OpARMADDshiftRA { 6665 break 6666 } 6667 c := v_0.AuxInt 6668 ptr := v_0.Args[0] 6669 idx := v_0.Args[1] 6670 mem := v.Args[1] 6671 if !(sym == nil && !config.nacl) { 6672 break 6673 } 6674 v.reset(OpARMMOVWloadshiftRA) 6675 v.AuxInt = c 6676 v.AddArg(ptr) 6677 v.AddArg(idx) 6678 v.AddArg(mem) 6679 return true 6680 } 6681 return false 6682 } 6683 func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { 6684 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 6685 // cond: isSamePtr(ptr, ptr2) 6686 // result: x 6687 for { 6688 ptr := v.Args[0] 6689 idx := v.Args[1] 6690 v_2 := v.Args[2] 6691 if v_2.Op != OpARMMOVWstoreidx { 6692 break 6693 } 6694 ptr2 := v_2.Args[0] 6695 if idx != v_2.Args[1] { 6696 break 6697 } 6698 x := v_2.Args[2] 6699 if !(isSamePtr(ptr, ptr2)) { 6700 break 6701 } 6702 v.reset(OpCopy) 6703 v.Type = x.Type 6704 v.AddArg(x) 6705 return true 6706 } 6707 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 6708 // cond: 6709 // result: (MOVWload [c] ptr mem) 6710 for { 6711 ptr := v.Args[0] 6712 v_1 := v.Args[1] 6713 if v_1.Op != OpARMMOVWconst { 6714 break 6715 } 6716 c := v_1.AuxInt 6717 mem := v.Args[2] 6718 v.reset(OpARMMOVWload) 6719 v.AuxInt = c 6720 v.AddArg(ptr) 6721 v.AddArg(mem) 6722 return true 6723 } 6724 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 6725 // cond: 6726 // result: (MOVWload [c] ptr mem) 6727 for { 6728 v_0 := v.Args[0] 6729 if v_0.Op != OpARMMOVWconst { 6730 break 6731 } 6732 c := v_0.AuxInt 6733 ptr := v.Args[1] 6734 mem := v.Args[2] 6735 v.reset(OpARMMOVWload) 6736 v.AuxInt = c 6737 v.AddArg(ptr) 6738 v.AddArg(mem) 6739 return true 6740 } 6741 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 6742 // cond: 6743 // result: (MOVWloadshiftLL ptr idx [c] mem) 6744 for { 6745 ptr := v.Args[0] 6746 v_1 := v.Args[1] 6747 if v_1.Op != OpARMSLLconst { 6748 break 6749 } 6750 c := v_1.AuxInt 6751 idx := v_1.Args[0] 6752 mem := v.Args[2] 6753 v.reset(OpARMMOVWloadshiftLL) 6754 v.AuxInt = c 6755 v.AddArg(ptr) 6756 v.AddArg(idx) 6757 v.AddArg(mem) 6758 return true 6759 } 6760 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 6761 // cond: 6762 // result: (MOVWloadshiftLL ptr idx [c] mem) 6763 for { 6764 v_0 := v.Args[0] 6765 if v_0.Op != OpARMSLLconst { 6766 break 6767 } 6768 c := v_0.AuxInt 6769 idx := v_0.Args[0] 6770 ptr := v.Args[1] 6771 mem := v.Args[2] 6772 v.reset(OpARMMOVWloadshiftLL) 6773 v.AuxInt = c 6774 v.AddArg(ptr) 6775 v.AddArg(idx) 6776 v.AddArg(mem) 6777 return true 6778 } 6779 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 6780 // cond: 6781 // result: (MOVWloadshiftRL ptr idx [c] mem) 6782 for { 6783 ptr := v.Args[0] 6784 v_1 := v.Args[1] 6785 if v_1.Op != OpARMSRLconst { 6786 break 6787 } 6788 c := v_1.AuxInt 6789 idx := v_1.Args[0] 6790 mem := v.Args[2] 6791 v.reset(OpARMMOVWloadshiftRL) 6792 v.AuxInt = c 6793 v.AddArg(ptr) 6794 v.AddArg(idx) 6795 v.AddArg(mem) 6796 return true 6797 } 6798 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 6799 // cond: 6800 // result: (MOVWloadshiftRL ptr idx [c] mem) 6801 for { 6802 v_0 := v.Args[0] 6803 if v_0.Op != OpARMSRLconst { 6804 break 6805 } 6806 c := v_0.AuxInt 6807 idx := v_0.Args[0] 6808 ptr := v.Args[1] 6809 mem := v.Args[2] 6810 v.reset(OpARMMOVWloadshiftRL) 6811 v.AuxInt = c 6812 v.AddArg(ptr) 6813 v.AddArg(idx) 6814 v.AddArg(mem) 6815 return true 6816 } 6817 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 6818 // cond: 6819 // result: (MOVWloadshiftRA ptr idx [c] mem) 6820 for { 6821 ptr := v.Args[0] 6822 v_1 := v.Args[1] 6823 if v_1.Op != OpARMSRAconst { 6824 break 6825 } 6826 c := v_1.AuxInt 6827 idx := v_1.Args[0] 6828 mem := v.Args[2] 6829 v.reset(OpARMMOVWloadshiftRA) 6830 v.AuxInt = c 6831 v.AddArg(ptr) 6832 v.AddArg(idx) 6833 v.AddArg(mem) 6834 return true 6835 } 6836 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 6837 // cond: 6838 // result: (MOVWloadshiftRA ptr idx [c] mem) 6839 for { 6840 v_0 := v.Args[0] 6841 if v_0.Op != OpARMSRAconst { 6842 break 6843 } 6844 c := v_0.AuxInt 6845 idx := v_0.Args[0] 6846 ptr := v.Args[1] 6847 mem := v.Args[2] 6848 v.reset(OpARMMOVWloadshiftRA) 6849 v.AuxInt = c 6850 v.AddArg(ptr) 6851 v.AddArg(idx) 6852 v.AddArg(mem) 6853 return true 6854 } 6855 return false 6856 } 6857 func rewriteValueARM_OpARMMOVWloadshiftLL_0(v *Value) bool { 6858 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 6859 // cond: c==d && isSamePtr(ptr, ptr2) 6860 // result: x 6861 for { 6862 c := v.AuxInt 6863 ptr := v.Args[0] 6864 idx := v.Args[1] 6865 v_2 := v.Args[2] 6866 if v_2.Op != OpARMMOVWstoreshiftLL { 6867 break 6868 } 6869 d := v_2.AuxInt 6870 ptr2 := v_2.Args[0] 6871 if idx != v_2.Args[1] { 6872 break 6873 } 6874 x := v_2.Args[2] 6875 if !(c == d && isSamePtr(ptr, ptr2)) { 6876 break 6877 } 6878 v.reset(OpCopy) 6879 v.Type = x.Type 6880 v.AddArg(x) 6881 return true 6882 } 6883 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 6884 // cond: 6885 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 6886 for { 6887 d := v.AuxInt 6888 ptr := v.Args[0] 6889 v_1 := v.Args[1] 6890 if v_1.Op != OpARMMOVWconst { 6891 break 6892 } 6893 c := v_1.AuxInt 6894 mem := v.Args[2] 6895 v.reset(OpARMMOVWload) 6896 v.AuxInt = int64(uint32(c) << uint64(d)) 6897 v.AddArg(ptr) 6898 v.AddArg(mem) 6899 return true 6900 } 6901 return false 6902 } 6903 func rewriteValueARM_OpARMMOVWloadshiftRA_0(v *Value) bool { 6904 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 6905 // cond: c==d && isSamePtr(ptr, ptr2) 6906 // result: x 6907 for { 6908 c := v.AuxInt 6909 ptr := v.Args[0] 6910 idx := v.Args[1] 6911 v_2 := v.Args[2] 6912 if v_2.Op != OpARMMOVWstoreshiftRA { 6913 break 6914 } 6915 d := v_2.AuxInt 6916 ptr2 := v_2.Args[0] 6917 if idx != v_2.Args[1] { 6918 break 6919 } 6920 x := v_2.Args[2] 6921 if !(c == d && isSamePtr(ptr, ptr2)) { 6922 break 6923 } 6924 v.reset(OpCopy) 6925 v.Type = x.Type 6926 v.AddArg(x) 6927 return true 6928 } 6929 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 6930 // cond: 6931 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 6932 for { 6933 d := v.AuxInt 6934 ptr := v.Args[0] 6935 v_1 := v.Args[1] 6936 if v_1.Op != OpARMMOVWconst { 6937 break 6938 } 6939 c := v_1.AuxInt 6940 mem := v.Args[2] 6941 v.reset(OpARMMOVWload) 6942 v.AuxInt = int64(int32(c) >> uint64(d)) 6943 v.AddArg(ptr) 6944 v.AddArg(mem) 6945 return true 6946 } 6947 return false 6948 } 6949 func rewriteValueARM_OpARMMOVWloadshiftRL_0(v *Value) bool { 6950 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 6951 // cond: c==d && isSamePtr(ptr, ptr2) 6952 // result: x 6953 for { 6954 c := v.AuxInt 6955 ptr := v.Args[0] 6956 idx := v.Args[1] 6957 v_2 := v.Args[2] 6958 if v_2.Op != OpARMMOVWstoreshiftRL { 6959 break 6960 } 6961 d := v_2.AuxInt 6962 ptr2 := v_2.Args[0] 6963 if idx != v_2.Args[1] { 6964 break 6965 } 6966 x := v_2.Args[2] 6967 if !(c == d && isSamePtr(ptr, ptr2)) { 6968 break 6969 } 6970 v.reset(OpCopy) 6971 v.Type = x.Type 6972 v.AddArg(x) 6973 return true 6974 } 6975 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 6976 // cond: 6977 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 6978 for { 6979 d := v.AuxInt 6980 ptr := v.Args[0] 6981 v_1 := v.Args[1] 6982 if v_1.Op != OpARMMOVWconst { 6983 break 6984 } 6985 c := v_1.AuxInt 6986 mem := v.Args[2] 6987 v.reset(OpARMMOVWload) 6988 v.AuxInt = int64(uint32(c) >> uint64(d)) 6989 v.AddArg(ptr) 6990 v.AddArg(mem) 6991 return true 6992 } 6993 return false 6994 } 6995 func rewriteValueARM_OpARMMOVWreg_0(v *Value) bool { 6996 // match: (MOVWreg x) 6997 // cond: x.Uses == 1 6998 // result: (MOVWnop x) 6999 for { 7000 x := v.Args[0] 7001 if !(x.Uses == 1) { 7002 break 7003 } 7004 v.reset(OpARMMOVWnop) 7005 v.AddArg(x) 7006 return true 7007 } 7008 // match: (MOVWreg (MOVWconst [c])) 7009 // cond: 7010 // result: (MOVWconst [c]) 7011 for { 7012 v_0 := v.Args[0] 7013 if v_0.Op != OpARMMOVWconst { 7014 break 7015 } 7016 c := v_0.AuxInt 7017 v.reset(OpARMMOVWconst) 7018 v.AuxInt = c 7019 return true 7020 } 7021 return false 7022 } 7023 func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { 7024 b := v.Block 7025 _ = b 7026 config := b.Func.Config 7027 _ = config 7028 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7029 // cond: 7030 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 7031 for { 7032 off1 := v.AuxInt 7033 sym := v.Aux 7034 v_0 := v.Args[0] 7035 if v_0.Op != OpARMADDconst { 7036 break 7037 } 7038 off2 := v_0.AuxInt 7039 ptr := v_0.Args[0] 7040 val := v.Args[1] 7041 mem := v.Args[2] 7042 v.reset(OpARMMOVWstore) 7043 v.AuxInt = off1 + off2 7044 v.Aux = sym 7045 v.AddArg(ptr) 7046 v.AddArg(val) 7047 v.AddArg(mem) 7048 return true 7049 } 7050 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7051 // cond: canMergeSym(sym1,sym2) 7052 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7053 for { 7054 off1 := v.AuxInt 7055 sym1 := v.Aux 7056 v_0 := v.Args[0] 7057 if v_0.Op != OpARMMOVWaddr { 7058 break 7059 } 7060 off2 := v_0.AuxInt 7061 sym2 := v_0.Aux 7062 ptr := v_0.Args[0] 7063 val := v.Args[1] 7064 mem := v.Args[2] 7065 if !(canMergeSym(sym1, sym2)) { 7066 break 7067 } 7068 v.reset(OpARMMOVWstore) 7069 v.AuxInt = off1 + off2 7070 v.Aux = mergeSym(sym1, sym2) 7071 v.AddArg(ptr) 7072 v.AddArg(val) 7073 v.AddArg(mem) 7074 return true 7075 } 7076 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 7077 // cond: sym == nil && !config.nacl 7078 // result: (MOVWstoreidx ptr idx val mem) 7079 for { 7080 if v.AuxInt != 0 { 7081 break 7082 } 7083 sym := v.Aux 7084 v_0 := v.Args[0] 7085 if v_0.Op != OpARMADD { 7086 break 7087 } 7088 ptr := v_0.Args[0] 7089 idx := v_0.Args[1] 7090 val := v.Args[1] 7091 mem := v.Args[2] 7092 if !(sym == nil && !config.nacl) { 7093 break 7094 } 7095 v.reset(OpARMMOVWstoreidx) 7096 v.AddArg(ptr) 7097 v.AddArg(idx) 7098 v.AddArg(val) 7099 v.AddArg(mem) 7100 return true 7101 } 7102 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 7103 // cond: sym == nil && !config.nacl 7104 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7105 for { 7106 if v.AuxInt != 0 { 7107 break 7108 } 7109 sym := v.Aux 7110 v_0 := v.Args[0] 7111 if v_0.Op != OpARMADDshiftLL { 7112 break 7113 } 7114 c := v_0.AuxInt 7115 ptr := v_0.Args[0] 7116 idx := v_0.Args[1] 7117 val := v.Args[1] 7118 mem := v.Args[2] 7119 if !(sym == nil && !config.nacl) { 7120 break 7121 } 7122 v.reset(OpARMMOVWstoreshiftLL) 7123 v.AuxInt = c 7124 v.AddArg(ptr) 7125 v.AddArg(idx) 7126 v.AddArg(val) 7127 v.AddArg(mem) 7128 return true 7129 } 7130 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 7131 // cond: sym == nil && !config.nacl 7132 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7133 for { 7134 if v.AuxInt != 0 { 7135 break 7136 } 7137 sym := v.Aux 7138 v_0 := v.Args[0] 7139 if v_0.Op != OpARMADDshiftRL { 7140 break 7141 } 7142 c := v_0.AuxInt 7143 ptr := v_0.Args[0] 7144 idx := v_0.Args[1] 7145 val := v.Args[1] 7146 mem := v.Args[2] 7147 if !(sym == nil && !config.nacl) { 7148 break 7149 } 7150 v.reset(OpARMMOVWstoreshiftRL) 7151 v.AuxInt = c 7152 v.AddArg(ptr) 7153 v.AddArg(idx) 7154 v.AddArg(val) 7155 v.AddArg(mem) 7156 return true 7157 } 7158 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 7159 // cond: sym == nil && !config.nacl 7160 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7161 for { 7162 if v.AuxInt != 0 { 7163 break 7164 } 7165 sym := v.Aux 7166 v_0 := v.Args[0] 7167 if v_0.Op != OpARMADDshiftRA { 7168 break 7169 } 7170 c := v_0.AuxInt 7171 ptr := v_0.Args[0] 7172 idx := v_0.Args[1] 7173 val := v.Args[1] 7174 mem := v.Args[2] 7175 if !(sym == nil && !config.nacl) { 7176 break 7177 } 7178 v.reset(OpARMMOVWstoreshiftRA) 7179 v.AuxInt = c 7180 v.AddArg(ptr) 7181 v.AddArg(idx) 7182 v.AddArg(val) 7183 v.AddArg(mem) 7184 return true 7185 } 7186 return false 7187 } 7188 func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { 7189 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 7190 // cond: 7191 // result: (MOVWstore [c] ptr val mem) 7192 for { 7193 ptr := v.Args[0] 7194 v_1 := v.Args[1] 7195 if v_1.Op != OpARMMOVWconst { 7196 break 7197 } 7198 c := v_1.AuxInt 7199 val := v.Args[2] 7200 mem := v.Args[3] 7201 v.reset(OpARMMOVWstore) 7202 v.AuxInt = c 7203 v.AddArg(ptr) 7204 v.AddArg(val) 7205 v.AddArg(mem) 7206 return true 7207 } 7208 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 7209 // cond: 7210 // result: (MOVWstore [c] ptr val mem) 7211 for { 7212 v_0 := v.Args[0] 7213 if v_0.Op != OpARMMOVWconst { 7214 break 7215 } 7216 c := v_0.AuxInt 7217 ptr := v.Args[1] 7218 val := v.Args[2] 7219 mem := v.Args[3] 7220 v.reset(OpARMMOVWstore) 7221 v.AuxInt = c 7222 v.AddArg(ptr) 7223 v.AddArg(val) 7224 v.AddArg(mem) 7225 return true 7226 } 7227 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 7228 // cond: 7229 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7230 for { 7231 ptr := v.Args[0] 7232 v_1 := v.Args[1] 7233 if v_1.Op != OpARMSLLconst { 7234 break 7235 } 7236 c := v_1.AuxInt 7237 idx := v_1.Args[0] 7238 val := v.Args[2] 7239 mem := v.Args[3] 7240 v.reset(OpARMMOVWstoreshiftLL) 7241 v.AuxInt = c 7242 v.AddArg(ptr) 7243 v.AddArg(idx) 7244 v.AddArg(val) 7245 v.AddArg(mem) 7246 return true 7247 } 7248 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 7249 // cond: 7250 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7251 for { 7252 v_0 := v.Args[0] 7253 if v_0.Op != OpARMSLLconst { 7254 break 7255 } 7256 c := v_0.AuxInt 7257 idx := v_0.Args[0] 7258 ptr := v.Args[1] 7259 val := v.Args[2] 7260 mem := v.Args[3] 7261 v.reset(OpARMMOVWstoreshiftLL) 7262 v.AuxInt = c 7263 v.AddArg(ptr) 7264 v.AddArg(idx) 7265 v.AddArg(val) 7266 v.AddArg(mem) 7267 return true 7268 } 7269 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 7270 // cond: 7271 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7272 for { 7273 ptr := v.Args[0] 7274 v_1 := v.Args[1] 7275 if v_1.Op != OpARMSRLconst { 7276 break 7277 } 7278 c := v_1.AuxInt 7279 idx := v_1.Args[0] 7280 val := v.Args[2] 7281 mem := v.Args[3] 7282 v.reset(OpARMMOVWstoreshiftRL) 7283 v.AuxInt = c 7284 v.AddArg(ptr) 7285 v.AddArg(idx) 7286 v.AddArg(val) 7287 v.AddArg(mem) 7288 return true 7289 } 7290 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 7291 // cond: 7292 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7293 for { 7294 v_0 := v.Args[0] 7295 if v_0.Op != OpARMSRLconst { 7296 break 7297 } 7298 c := v_0.AuxInt 7299 idx := v_0.Args[0] 7300 ptr := v.Args[1] 7301 val := v.Args[2] 7302 mem := v.Args[3] 7303 v.reset(OpARMMOVWstoreshiftRL) 7304 v.AuxInt = c 7305 v.AddArg(ptr) 7306 v.AddArg(idx) 7307 v.AddArg(val) 7308 v.AddArg(mem) 7309 return true 7310 } 7311 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 7312 // cond: 7313 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7314 for { 7315 ptr := v.Args[0] 7316 v_1 := v.Args[1] 7317 if v_1.Op != OpARMSRAconst { 7318 break 7319 } 7320 c := v_1.AuxInt 7321 idx := v_1.Args[0] 7322 val := v.Args[2] 7323 mem := v.Args[3] 7324 v.reset(OpARMMOVWstoreshiftRA) 7325 v.AuxInt = c 7326 v.AddArg(ptr) 7327 v.AddArg(idx) 7328 v.AddArg(val) 7329 v.AddArg(mem) 7330 return true 7331 } 7332 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 7333 // cond: 7334 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7335 for { 7336 v_0 := v.Args[0] 7337 if v_0.Op != OpARMSRAconst { 7338 break 7339 } 7340 c := v_0.AuxInt 7341 idx := v_0.Args[0] 7342 ptr := v.Args[1] 7343 val := v.Args[2] 7344 mem := v.Args[3] 7345 v.reset(OpARMMOVWstoreshiftRA) 7346 v.AuxInt = c 7347 v.AddArg(ptr) 7348 v.AddArg(idx) 7349 v.AddArg(val) 7350 v.AddArg(mem) 7351 return true 7352 } 7353 return false 7354 } 7355 func rewriteValueARM_OpARMMOVWstoreshiftLL_0(v *Value) bool { 7356 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 7357 // cond: 7358 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 7359 for { 7360 d := v.AuxInt 7361 ptr := v.Args[0] 7362 v_1 := v.Args[1] 7363 if v_1.Op != OpARMMOVWconst { 7364 break 7365 } 7366 c := v_1.AuxInt 7367 val := v.Args[2] 7368 mem := v.Args[3] 7369 v.reset(OpARMMOVWstore) 7370 v.AuxInt = int64(uint32(c) << uint64(d)) 7371 v.AddArg(ptr) 7372 v.AddArg(val) 7373 v.AddArg(mem) 7374 return true 7375 } 7376 return false 7377 } 7378 func rewriteValueARM_OpARMMOVWstoreshiftRA_0(v *Value) bool { 7379 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 7380 // cond: 7381 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 7382 for { 7383 d := v.AuxInt 7384 ptr := v.Args[0] 7385 v_1 := v.Args[1] 7386 if v_1.Op != OpARMMOVWconst { 7387 break 7388 } 7389 c := v_1.AuxInt 7390 val := v.Args[2] 7391 mem := v.Args[3] 7392 v.reset(OpARMMOVWstore) 7393 v.AuxInt = int64(int32(c) >> uint64(d)) 7394 v.AddArg(ptr) 7395 v.AddArg(val) 7396 v.AddArg(mem) 7397 return true 7398 } 7399 return false 7400 } 7401 func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { 7402 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 7403 // cond: 7404 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 7405 for { 7406 d := v.AuxInt 7407 ptr := v.Args[0] 7408 v_1 := v.Args[1] 7409 if v_1.Op != OpARMMOVWconst { 7410 break 7411 } 7412 c := v_1.AuxInt 7413 val := v.Args[2] 7414 mem := v.Args[3] 7415 v.reset(OpARMMOVWstore) 7416 v.AuxInt = int64(uint32(c) >> uint64(d)) 7417 v.AddArg(ptr) 7418 v.AddArg(val) 7419 v.AddArg(mem) 7420 return true 7421 } 7422 return false 7423 } 7424 func rewriteValueARM_OpARMMUL_0(v *Value) bool { 7425 // match: (MUL x (MOVWconst [c])) 7426 // cond: int32(c) == -1 7427 // result: (RSBconst [0] x) 7428 for { 7429 x := v.Args[0] 7430 v_1 := v.Args[1] 7431 if v_1.Op != OpARMMOVWconst { 7432 break 7433 } 7434 c := v_1.AuxInt 7435 if !(int32(c) == -1) { 7436 break 7437 } 7438 v.reset(OpARMRSBconst) 7439 v.AuxInt = 0 7440 v.AddArg(x) 7441 return true 7442 } 7443 // match: (MUL (MOVWconst [c]) x) 7444 // cond: int32(c) == -1 7445 // result: (RSBconst [0] x) 7446 for { 7447 v_0 := v.Args[0] 7448 if v_0.Op != OpARMMOVWconst { 7449 break 7450 } 7451 c := v_0.AuxInt 7452 x := v.Args[1] 7453 if !(int32(c) == -1) { 7454 break 7455 } 7456 v.reset(OpARMRSBconst) 7457 v.AuxInt = 0 7458 v.AddArg(x) 7459 return true 7460 } 7461 // match: (MUL _ (MOVWconst [0])) 7462 // cond: 7463 // result: (MOVWconst [0]) 7464 for { 7465 v_1 := v.Args[1] 7466 if v_1.Op != OpARMMOVWconst { 7467 break 7468 } 7469 if v_1.AuxInt != 0 { 7470 break 7471 } 7472 v.reset(OpARMMOVWconst) 7473 v.AuxInt = 0 7474 return true 7475 } 7476 // match: (MUL (MOVWconst [0]) _) 7477 // cond: 7478 // result: (MOVWconst [0]) 7479 for { 7480 v_0 := v.Args[0] 7481 if v_0.Op != OpARMMOVWconst { 7482 break 7483 } 7484 if v_0.AuxInt != 0 { 7485 break 7486 } 7487 v.reset(OpARMMOVWconst) 7488 v.AuxInt = 0 7489 return true 7490 } 7491 // match: (MUL x (MOVWconst [1])) 7492 // cond: 7493 // result: x 7494 for { 7495 x := v.Args[0] 7496 v_1 := v.Args[1] 7497 if v_1.Op != OpARMMOVWconst { 7498 break 7499 } 7500 if v_1.AuxInt != 1 { 7501 break 7502 } 7503 v.reset(OpCopy) 7504 v.Type = x.Type 7505 v.AddArg(x) 7506 return true 7507 } 7508 // match: (MUL (MOVWconst [1]) x) 7509 // cond: 7510 // result: x 7511 for { 7512 v_0 := v.Args[0] 7513 if v_0.Op != OpARMMOVWconst { 7514 break 7515 } 7516 if v_0.AuxInt != 1 { 7517 break 7518 } 7519 x := v.Args[1] 7520 v.reset(OpCopy) 7521 v.Type = x.Type 7522 v.AddArg(x) 7523 return true 7524 } 7525 // match: (MUL x (MOVWconst [c])) 7526 // cond: isPowerOfTwo(c) 7527 // result: (SLLconst [log2(c)] x) 7528 for { 7529 x := v.Args[0] 7530 v_1 := v.Args[1] 7531 if v_1.Op != OpARMMOVWconst { 7532 break 7533 } 7534 c := v_1.AuxInt 7535 if !(isPowerOfTwo(c)) { 7536 break 7537 } 7538 v.reset(OpARMSLLconst) 7539 v.AuxInt = log2(c) 7540 v.AddArg(x) 7541 return true 7542 } 7543 // match: (MUL (MOVWconst [c]) x) 7544 // cond: isPowerOfTwo(c) 7545 // result: (SLLconst [log2(c)] x) 7546 for { 7547 v_0 := v.Args[0] 7548 if v_0.Op != OpARMMOVWconst { 7549 break 7550 } 7551 c := v_0.AuxInt 7552 x := v.Args[1] 7553 if !(isPowerOfTwo(c)) { 7554 break 7555 } 7556 v.reset(OpARMSLLconst) 7557 v.AuxInt = log2(c) 7558 v.AddArg(x) 7559 return true 7560 } 7561 // match: (MUL x (MOVWconst [c])) 7562 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7563 // result: (ADDshiftLL x x [log2(c-1)]) 7564 for { 7565 x := v.Args[0] 7566 v_1 := v.Args[1] 7567 if v_1.Op != OpARMMOVWconst { 7568 break 7569 } 7570 c := v_1.AuxInt 7571 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7572 break 7573 } 7574 v.reset(OpARMADDshiftLL) 7575 v.AuxInt = log2(c - 1) 7576 v.AddArg(x) 7577 v.AddArg(x) 7578 return true 7579 } 7580 // match: (MUL (MOVWconst [c]) x) 7581 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7582 // result: (ADDshiftLL x x [log2(c-1)]) 7583 for { 7584 v_0 := v.Args[0] 7585 if v_0.Op != OpARMMOVWconst { 7586 break 7587 } 7588 c := v_0.AuxInt 7589 x := v.Args[1] 7590 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7591 break 7592 } 7593 v.reset(OpARMADDshiftLL) 7594 v.AuxInt = log2(c - 1) 7595 v.AddArg(x) 7596 v.AddArg(x) 7597 return true 7598 } 7599 return false 7600 } 7601 func rewriteValueARM_OpARMMUL_10(v *Value) bool { 7602 b := v.Block 7603 _ = b 7604 // match: (MUL x (MOVWconst [c])) 7605 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7606 // result: (RSBshiftLL x x [log2(c+1)]) 7607 for { 7608 x := v.Args[0] 7609 v_1 := v.Args[1] 7610 if v_1.Op != OpARMMOVWconst { 7611 break 7612 } 7613 c := v_1.AuxInt 7614 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7615 break 7616 } 7617 v.reset(OpARMRSBshiftLL) 7618 v.AuxInt = log2(c + 1) 7619 v.AddArg(x) 7620 v.AddArg(x) 7621 return true 7622 } 7623 // match: (MUL (MOVWconst [c]) x) 7624 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7625 // result: (RSBshiftLL x x [log2(c+1)]) 7626 for { 7627 v_0 := v.Args[0] 7628 if v_0.Op != OpARMMOVWconst { 7629 break 7630 } 7631 c := v_0.AuxInt 7632 x := v.Args[1] 7633 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7634 break 7635 } 7636 v.reset(OpARMRSBshiftLL) 7637 v.AuxInt = log2(c + 1) 7638 v.AddArg(x) 7639 v.AddArg(x) 7640 return true 7641 } 7642 // match: (MUL x (MOVWconst [c])) 7643 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7644 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7645 for { 7646 x := v.Args[0] 7647 v_1 := v.Args[1] 7648 if v_1.Op != OpARMMOVWconst { 7649 break 7650 } 7651 c := v_1.AuxInt 7652 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7653 break 7654 } 7655 v.reset(OpARMSLLconst) 7656 v.AuxInt = log2(c / 3) 7657 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7658 v0.AuxInt = 1 7659 v0.AddArg(x) 7660 v0.AddArg(x) 7661 v.AddArg(v0) 7662 return true 7663 } 7664 // match: (MUL (MOVWconst [c]) x) 7665 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7666 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 7667 for { 7668 v_0 := v.Args[0] 7669 if v_0.Op != OpARMMOVWconst { 7670 break 7671 } 7672 c := v_0.AuxInt 7673 x := v.Args[1] 7674 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7675 break 7676 } 7677 v.reset(OpARMSLLconst) 7678 v.AuxInt = log2(c / 3) 7679 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7680 v0.AuxInt = 1 7681 v0.AddArg(x) 7682 v0.AddArg(x) 7683 v.AddArg(v0) 7684 return true 7685 } 7686 // match: (MUL x (MOVWconst [c])) 7687 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7688 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7689 for { 7690 x := v.Args[0] 7691 v_1 := v.Args[1] 7692 if v_1.Op != OpARMMOVWconst { 7693 break 7694 } 7695 c := v_1.AuxInt 7696 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7697 break 7698 } 7699 v.reset(OpARMSLLconst) 7700 v.AuxInt = log2(c / 5) 7701 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7702 v0.AuxInt = 2 7703 v0.AddArg(x) 7704 v0.AddArg(x) 7705 v.AddArg(v0) 7706 return true 7707 } 7708 // match: (MUL (MOVWconst [c]) x) 7709 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 7710 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 7711 for { 7712 v_0 := v.Args[0] 7713 if v_0.Op != OpARMMOVWconst { 7714 break 7715 } 7716 c := v_0.AuxInt 7717 x := v.Args[1] 7718 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 7719 break 7720 } 7721 v.reset(OpARMSLLconst) 7722 v.AuxInt = log2(c / 5) 7723 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7724 v0.AuxInt = 2 7725 v0.AddArg(x) 7726 v0.AddArg(x) 7727 v.AddArg(v0) 7728 return true 7729 } 7730 // match: (MUL x (MOVWconst [c])) 7731 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7732 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7733 for { 7734 x := v.Args[0] 7735 v_1 := v.Args[1] 7736 if v_1.Op != OpARMMOVWconst { 7737 break 7738 } 7739 c := v_1.AuxInt 7740 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7741 break 7742 } 7743 v.reset(OpARMSLLconst) 7744 v.AuxInt = log2(c / 7) 7745 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7746 v0.AuxInt = 3 7747 v0.AddArg(x) 7748 v0.AddArg(x) 7749 v.AddArg(v0) 7750 return true 7751 } 7752 // match: (MUL (MOVWconst [c]) x) 7753 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 7754 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 7755 for { 7756 v_0 := v.Args[0] 7757 if v_0.Op != OpARMMOVWconst { 7758 break 7759 } 7760 c := v_0.AuxInt 7761 x := v.Args[1] 7762 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 7763 break 7764 } 7765 v.reset(OpARMSLLconst) 7766 v.AuxInt = log2(c / 7) 7767 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7768 v0.AuxInt = 3 7769 v0.AddArg(x) 7770 v0.AddArg(x) 7771 v.AddArg(v0) 7772 return true 7773 } 7774 // match: (MUL x (MOVWconst [c])) 7775 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7776 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7777 for { 7778 x := v.Args[0] 7779 v_1 := v.Args[1] 7780 if v_1.Op != OpARMMOVWconst { 7781 break 7782 } 7783 c := v_1.AuxInt 7784 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7785 break 7786 } 7787 v.reset(OpARMSLLconst) 7788 v.AuxInt = log2(c / 9) 7789 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7790 v0.AuxInt = 3 7791 v0.AddArg(x) 7792 v0.AddArg(x) 7793 v.AddArg(v0) 7794 return true 7795 } 7796 // match: (MUL (MOVWconst [c]) x) 7797 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 7798 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 7799 for { 7800 v_0 := v.Args[0] 7801 if v_0.Op != OpARMMOVWconst { 7802 break 7803 } 7804 c := v_0.AuxInt 7805 x := v.Args[1] 7806 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 7807 break 7808 } 7809 v.reset(OpARMSLLconst) 7810 v.AuxInt = log2(c / 9) 7811 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7812 v0.AuxInt = 3 7813 v0.AddArg(x) 7814 v0.AddArg(x) 7815 v.AddArg(v0) 7816 return true 7817 } 7818 return false 7819 } 7820 func rewriteValueARM_OpARMMUL_20(v *Value) bool { 7821 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 7822 // cond: 7823 // result: (MOVWconst [int64(int32(c*d))]) 7824 for { 7825 v_0 := v.Args[0] 7826 if v_0.Op != OpARMMOVWconst { 7827 break 7828 } 7829 c := v_0.AuxInt 7830 v_1 := v.Args[1] 7831 if v_1.Op != OpARMMOVWconst { 7832 break 7833 } 7834 d := v_1.AuxInt 7835 v.reset(OpARMMOVWconst) 7836 v.AuxInt = int64(int32(c * d)) 7837 return true 7838 } 7839 // match: (MUL (MOVWconst [d]) (MOVWconst [c])) 7840 // cond: 7841 // result: (MOVWconst [int64(int32(c*d))]) 7842 for { 7843 v_0 := v.Args[0] 7844 if v_0.Op != OpARMMOVWconst { 7845 break 7846 } 7847 d := v_0.AuxInt 7848 v_1 := v.Args[1] 7849 if v_1.Op != OpARMMOVWconst { 7850 break 7851 } 7852 c := v_1.AuxInt 7853 v.reset(OpARMMOVWconst) 7854 v.AuxInt = int64(int32(c * d)) 7855 return true 7856 } 7857 return false 7858 } 7859 func rewriteValueARM_OpARMMULA_0(v *Value) bool { 7860 b := v.Block 7861 _ = b 7862 // match: (MULA x (MOVWconst [c]) a) 7863 // cond: int32(c) == -1 7864 // result: (SUB a x) 7865 for { 7866 x := v.Args[0] 7867 v_1 := v.Args[1] 7868 if v_1.Op != OpARMMOVWconst { 7869 break 7870 } 7871 c := v_1.AuxInt 7872 a := v.Args[2] 7873 if !(int32(c) == -1) { 7874 break 7875 } 7876 v.reset(OpARMSUB) 7877 v.AddArg(a) 7878 v.AddArg(x) 7879 return true 7880 } 7881 // match: (MULA _ (MOVWconst [0]) a) 7882 // cond: 7883 // result: a 7884 for { 7885 v_1 := v.Args[1] 7886 if v_1.Op != OpARMMOVWconst { 7887 break 7888 } 7889 if v_1.AuxInt != 0 { 7890 break 7891 } 7892 a := v.Args[2] 7893 v.reset(OpCopy) 7894 v.Type = a.Type 7895 v.AddArg(a) 7896 return true 7897 } 7898 // match: (MULA x (MOVWconst [1]) a) 7899 // cond: 7900 // result: (ADD x a) 7901 for { 7902 x := v.Args[0] 7903 v_1 := v.Args[1] 7904 if v_1.Op != OpARMMOVWconst { 7905 break 7906 } 7907 if v_1.AuxInt != 1 { 7908 break 7909 } 7910 a := v.Args[2] 7911 v.reset(OpARMADD) 7912 v.AddArg(x) 7913 v.AddArg(a) 7914 return true 7915 } 7916 // match: (MULA x (MOVWconst [c]) a) 7917 // cond: isPowerOfTwo(c) 7918 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 7919 for { 7920 x := v.Args[0] 7921 v_1 := v.Args[1] 7922 if v_1.Op != OpARMMOVWconst { 7923 break 7924 } 7925 c := v_1.AuxInt 7926 a := v.Args[2] 7927 if !(isPowerOfTwo(c)) { 7928 break 7929 } 7930 v.reset(OpARMADD) 7931 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 7932 v0.AuxInt = log2(c) 7933 v0.AddArg(x) 7934 v.AddArg(v0) 7935 v.AddArg(a) 7936 return true 7937 } 7938 // match: (MULA x (MOVWconst [c]) a) 7939 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 7940 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 7941 for { 7942 x := v.Args[0] 7943 v_1 := v.Args[1] 7944 if v_1.Op != OpARMMOVWconst { 7945 break 7946 } 7947 c := v_1.AuxInt 7948 a := v.Args[2] 7949 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 7950 break 7951 } 7952 v.reset(OpARMADD) 7953 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 7954 v0.AuxInt = log2(c - 1) 7955 v0.AddArg(x) 7956 v0.AddArg(x) 7957 v.AddArg(v0) 7958 v.AddArg(a) 7959 return true 7960 } 7961 // match: (MULA x (MOVWconst [c]) a) 7962 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 7963 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 7964 for { 7965 x := v.Args[0] 7966 v_1 := v.Args[1] 7967 if v_1.Op != OpARMMOVWconst { 7968 break 7969 } 7970 c := v_1.AuxInt 7971 a := v.Args[2] 7972 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 7973 break 7974 } 7975 v.reset(OpARMADD) 7976 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 7977 v0.AuxInt = log2(c + 1) 7978 v0.AddArg(x) 7979 v0.AddArg(x) 7980 v.AddArg(v0) 7981 v.AddArg(a) 7982 return true 7983 } 7984 // match: (MULA x (MOVWconst [c]) a) 7985 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 7986 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 7987 for { 7988 x := v.Args[0] 7989 v_1 := v.Args[1] 7990 if v_1.Op != OpARMMOVWconst { 7991 break 7992 } 7993 c := v_1.AuxInt 7994 a := v.Args[2] 7995 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 7996 break 7997 } 7998 v.reset(OpARMADD) 7999 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8000 v0.AuxInt = log2(c / 3) 8001 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8002 v1.AuxInt = 1 8003 v1.AddArg(x) 8004 v1.AddArg(x) 8005 v0.AddArg(v1) 8006 v.AddArg(v0) 8007 v.AddArg(a) 8008 return true 8009 } 8010 // match: (MULA x (MOVWconst [c]) a) 8011 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8012 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 8013 for { 8014 x := v.Args[0] 8015 v_1 := v.Args[1] 8016 if v_1.Op != OpARMMOVWconst { 8017 break 8018 } 8019 c := v_1.AuxInt 8020 a := v.Args[2] 8021 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8022 break 8023 } 8024 v.reset(OpARMADD) 8025 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8026 v0.AuxInt = log2(c / 5) 8027 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8028 v1.AuxInt = 2 8029 v1.AddArg(x) 8030 v1.AddArg(x) 8031 v0.AddArg(v1) 8032 v.AddArg(v0) 8033 v.AddArg(a) 8034 return true 8035 } 8036 // match: (MULA x (MOVWconst [c]) a) 8037 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8038 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 8039 for { 8040 x := v.Args[0] 8041 v_1 := v.Args[1] 8042 if v_1.Op != OpARMMOVWconst { 8043 break 8044 } 8045 c := v_1.AuxInt 8046 a := v.Args[2] 8047 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8048 break 8049 } 8050 v.reset(OpARMADD) 8051 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8052 v0.AuxInt = log2(c / 7) 8053 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8054 v1.AuxInt = 3 8055 v1.AddArg(x) 8056 v1.AddArg(x) 8057 v0.AddArg(v1) 8058 v.AddArg(v0) 8059 v.AddArg(a) 8060 return true 8061 } 8062 // match: (MULA x (MOVWconst [c]) a) 8063 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8064 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 8065 for { 8066 x := v.Args[0] 8067 v_1 := v.Args[1] 8068 if v_1.Op != OpARMMOVWconst { 8069 break 8070 } 8071 c := v_1.AuxInt 8072 a := v.Args[2] 8073 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8074 break 8075 } 8076 v.reset(OpARMADD) 8077 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8078 v0.AuxInt = log2(c / 9) 8079 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8080 v1.AuxInt = 3 8081 v1.AddArg(x) 8082 v1.AddArg(x) 8083 v0.AddArg(v1) 8084 v.AddArg(v0) 8085 v.AddArg(a) 8086 return true 8087 } 8088 return false 8089 } 8090 func rewriteValueARM_OpARMMULA_10(v *Value) bool { 8091 b := v.Block 8092 _ = b 8093 // match: (MULA (MOVWconst [c]) x a) 8094 // cond: int32(c) == -1 8095 // result: (SUB a x) 8096 for { 8097 v_0 := v.Args[0] 8098 if v_0.Op != OpARMMOVWconst { 8099 break 8100 } 8101 c := v_0.AuxInt 8102 x := v.Args[1] 8103 a := v.Args[2] 8104 if !(int32(c) == -1) { 8105 break 8106 } 8107 v.reset(OpARMSUB) 8108 v.AddArg(a) 8109 v.AddArg(x) 8110 return true 8111 } 8112 // match: (MULA (MOVWconst [0]) _ a) 8113 // cond: 8114 // result: a 8115 for { 8116 v_0 := v.Args[0] 8117 if v_0.Op != OpARMMOVWconst { 8118 break 8119 } 8120 if v_0.AuxInt != 0 { 8121 break 8122 } 8123 a := v.Args[2] 8124 v.reset(OpCopy) 8125 v.Type = a.Type 8126 v.AddArg(a) 8127 return true 8128 } 8129 // match: (MULA (MOVWconst [1]) x a) 8130 // cond: 8131 // result: (ADD x a) 8132 for { 8133 v_0 := v.Args[0] 8134 if v_0.Op != OpARMMOVWconst { 8135 break 8136 } 8137 if v_0.AuxInt != 1 { 8138 break 8139 } 8140 x := v.Args[1] 8141 a := v.Args[2] 8142 v.reset(OpARMADD) 8143 v.AddArg(x) 8144 v.AddArg(a) 8145 return true 8146 } 8147 // match: (MULA (MOVWconst [c]) x a) 8148 // cond: isPowerOfTwo(c) 8149 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 8150 for { 8151 v_0 := v.Args[0] 8152 if v_0.Op != OpARMMOVWconst { 8153 break 8154 } 8155 c := v_0.AuxInt 8156 x := v.Args[1] 8157 a := v.Args[2] 8158 if !(isPowerOfTwo(c)) { 8159 break 8160 } 8161 v.reset(OpARMADD) 8162 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8163 v0.AuxInt = log2(c) 8164 v0.AddArg(x) 8165 v.AddArg(v0) 8166 v.AddArg(a) 8167 return true 8168 } 8169 // match: (MULA (MOVWconst [c]) x a) 8170 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 8171 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 8172 for { 8173 v_0 := v.Args[0] 8174 if v_0.Op != OpARMMOVWconst { 8175 break 8176 } 8177 c := v_0.AuxInt 8178 x := v.Args[1] 8179 a := v.Args[2] 8180 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 8181 break 8182 } 8183 v.reset(OpARMADD) 8184 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8185 v0.AuxInt = log2(c - 1) 8186 v0.AddArg(x) 8187 v0.AddArg(x) 8188 v.AddArg(v0) 8189 v.AddArg(a) 8190 return true 8191 } 8192 // match: (MULA (MOVWconst [c]) x a) 8193 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 8194 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 8195 for { 8196 v_0 := v.Args[0] 8197 if v_0.Op != OpARMMOVWconst { 8198 break 8199 } 8200 c := v_0.AuxInt 8201 x := v.Args[1] 8202 a := v.Args[2] 8203 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 8204 break 8205 } 8206 v.reset(OpARMADD) 8207 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8208 v0.AuxInt = log2(c + 1) 8209 v0.AddArg(x) 8210 v0.AddArg(x) 8211 v.AddArg(v0) 8212 v.AddArg(a) 8213 return true 8214 } 8215 // match: (MULA (MOVWconst [c]) x a) 8216 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 8217 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 8218 for { 8219 v_0 := v.Args[0] 8220 if v_0.Op != OpARMMOVWconst { 8221 break 8222 } 8223 c := v_0.AuxInt 8224 x := v.Args[1] 8225 a := v.Args[2] 8226 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 8227 break 8228 } 8229 v.reset(OpARMADD) 8230 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8231 v0.AuxInt = log2(c / 3) 8232 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8233 v1.AuxInt = 1 8234 v1.AddArg(x) 8235 v1.AddArg(x) 8236 v0.AddArg(v1) 8237 v.AddArg(v0) 8238 v.AddArg(a) 8239 return true 8240 } 8241 // match: (MULA (MOVWconst [c]) x a) 8242 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8243 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 8244 for { 8245 v_0 := v.Args[0] 8246 if v_0.Op != OpARMMOVWconst { 8247 break 8248 } 8249 c := v_0.AuxInt 8250 x := v.Args[1] 8251 a := v.Args[2] 8252 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8253 break 8254 } 8255 v.reset(OpARMADD) 8256 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8257 v0.AuxInt = log2(c / 5) 8258 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8259 v1.AuxInt = 2 8260 v1.AddArg(x) 8261 v1.AddArg(x) 8262 v0.AddArg(v1) 8263 v.AddArg(v0) 8264 v.AddArg(a) 8265 return true 8266 } 8267 // match: (MULA (MOVWconst [c]) x a) 8268 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8269 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 8270 for { 8271 v_0 := v.Args[0] 8272 if v_0.Op != OpARMMOVWconst { 8273 break 8274 } 8275 c := v_0.AuxInt 8276 x := v.Args[1] 8277 a := v.Args[2] 8278 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8279 break 8280 } 8281 v.reset(OpARMADD) 8282 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8283 v0.AuxInt = log2(c / 7) 8284 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8285 v1.AuxInt = 3 8286 v1.AddArg(x) 8287 v1.AddArg(x) 8288 v0.AddArg(v1) 8289 v.AddArg(v0) 8290 v.AddArg(a) 8291 return true 8292 } 8293 // match: (MULA (MOVWconst [c]) x a) 8294 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8295 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 8296 for { 8297 v_0 := v.Args[0] 8298 if v_0.Op != OpARMMOVWconst { 8299 break 8300 } 8301 c := v_0.AuxInt 8302 x := v.Args[1] 8303 a := v.Args[2] 8304 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8305 break 8306 } 8307 v.reset(OpARMADD) 8308 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8309 v0.AuxInt = log2(c / 9) 8310 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8311 v1.AuxInt = 3 8312 v1.AddArg(x) 8313 v1.AddArg(x) 8314 v0.AddArg(v1) 8315 v.AddArg(v0) 8316 v.AddArg(a) 8317 return true 8318 } 8319 return false 8320 } 8321 func rewriteValueARM_OpARMMULA_20(v *Value) bool { 8322 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 8323 // cond: 8324 // result: (ADDconst [int64(int32(c*d))] a) 8325 for { 8326 v_0 := v.Args[0] 8327 if v_0.Op != OpARMMOVWconst { 8328 break 8329 } 8330 c := v_0.AuxInt 8331 v_1 := v.Args[1] 8332 if v_1.Op != OpARMMOVWconst { 8333 break 8334 } 8335 d := v_1.AuxInt 8336 a := v.Args[2] 8337 v.reset(OpARMADDconst) 8338 v.AuxInt = int64(int32(c * d)) 8339 v.AddArg(a) 8340 return true 8341 } 8342 return false 8343 } 8344 func rewriteValueARM_OpARMMVN_0(v *Value) bool { 8345 // match: (MVN (MOVWconst [c])) 8346 // cond: 8347 // result: (MOVWconst [^c]) 8348 for { 8349 v_0 := v.Args[0] 8350 if v_0.Op != OpARMMOVWconst { 8351 break 8352 } 8353 c := v_0.AuxInt 8354 v.reset(OpARMMOVWconst) 8355 v.AuxInt = ^c 8356 return true 8357 } 8358 // match: (MVN (SLLconst [c] x)) 8359 // cond: 8360 // result: (MVNshiftLL x [c]) 8361 for { 8362 v_0 := v.Args[0] 8363 if v_0.Op != OpARMSLLconst { 8364 break 8365 } 8366 c := v_0.AuxInt 8367 x := v_0.Args[0] 8368 v.reset(OpARMMVNshiftLL) 8369 v.AuxInt = c 8370 v.AddArg(x) 8371 return true 8372 } 8373 // match: (MVN (SRLconst [c] x)) 8374 // cond: 8375 // result: (MVNshiftRL x [c]) 8376 for { 8377 v_0 := v.Args[0] 8378 if v_0.Op != OpARMSRLconst { 8379 break 8380 } 8381 c := v_0.AuxInt 8382 x := v_0.Args[0] 8383 v.reset(OpARMMVNshiftRL) 8384 v.AuxInt = c 8385 v.AddArg(x) 8386 return true 8387 } 8388 // match: (MVN (SRAconst [c] x)) 8389 // cond: 8390 // result: (MVNshiftRA x [c]) 8391 for { 8392 v_0 := v.Args[0] 8393 if v_0.Op != OpARMSRAconst { 8394 break 8395 } 8396 c := v_0.AuxInt 8397 x := v_0.Args[0] 8398 v.reset(OpARMMVNshiftRA) 8399 v.AuxInt = c 8400 v.AddArg(x) 8401 return true 8402 } 8403 // match: (MVN (SLL x y)) 8404 // cond: 8405 // result: (MVNshiftLLreg x y) 8406 for { 8407 v_0 := v.Args[0] 8408 if v_0.Op != OpARMSLL { 8409 break 8410 } 8411 x := v_0.Args[0] 8412 y := v_0.Args[1] 8413 v.reset(OpARMMVNshiftLLreg) 8414 v.AddArg(x) 8415 v.AddArg(y) 8416 return true 8417 } 8418 // match: (MVN (SRL x y)) 8419 // cond: 8420 // result: (MVNshiftRLreg x y) 8421 for { 8422 v_0 := v.Args[0] 8423 if v_0.Op != OpARMSRL { 8424 break 8425 } 8426 x := v_0.Args[0] 8427 y := v_0.Args[1] 8428 v.reset(OpARMMVNshiftRLreg) 8429 v.AddArg(x) 8430 v.AddArg(y) 8431 return true 8432 } 8433 // match: (MVN (SRA x y)) 8434 // cond: 8435 // result: (MVNshiftRAreg x y) 8436 for { 8437 v_0 := v.Args[0] 8438 if v_0.Op != OpARMSRA { 8439 break 8440 } 8441 x := v_0.Args[0] 8442 y := v_0.Args[1] 8443 v.reset(OpARMMVNshiftRAreg) 8444 v.AddArg(x) 8445 v.AddArg(y) 8446 return true 8447 } 8448 return false 8449 } 8450 func rewriteValueARM_OpARMMVNshiftLL_0(v *Value) bool { 8451 // match: (MVNshiftLL (MOVWconst [c]) [d]) 8452 // cond: 8453 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 8454 for { 8455 d := v.AuxInt 8456 v_0 := v.Args[0] 8457 if v_0.Op != OpARMMOVWconst { 8458 break 8459 } 8460 c := v_0.AuxInt 8461 v.reset(OpARMMOVWconst) 8462 v.AuxInt = ^int64(uint32(c) << uint64(d)) 8463 return true 8464 } 8465 return false 8466 } 8467 func rewriteValueARM_OpARMMVNshiftLLreg_0(v *Value) bool { 8468 // match: (MVNshiftLLreg x (MOVWconst [c])) 8469 // cond: 8470 // result: (MVNshiftLL x [c]) 8471 for { 8472 x := v.Args[0] 8473 v_1 := v.Args[1] 8474 if v_1.Op != OpARMMOVWconst { 8475 break 8476 } 8477 c := v_1.AuxInt 8478 v.reset(OpARMMVNshiftLL) 8479 v.AuxInt = c 8480 v.AddArg(x) 8481 return true 8482 } 8483 return false 8484 } 8485 func rewriteValueARM_OpARMMVNshiftRA_0(v *Value) bool { 8486 // match: (MVNshiftRA (MOVWconst [c]) [d]) 8487 // cond: 8488 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 8489 for { 8490 d := v.AuxInt 8491 v_0 := v.Args[0] 8492 if v_0.Op != OpARMMOVWconst { 8493 break 8494 } 8495 c := v_0.AuxInt 8496 v.reset(OpARMMOVWconst) 8497 v.AuxInt = ^int64(int32(c) >> uint64(d)) 8498 return true 8499 } 8500 return false 8501 } 8502 func rewriteValueARM_OpARMMVNshiftRAreg_0(v *Value) bool { 8503 // match: (MVNshiftRAreg x (MOVWconst [c])) 8504 // cond: 8505 // result: (MVNshiftRA x [c]) 8506 for { 8507 x := v.Args[0] 8508 v_1 := v.Args[1] 8509 if v_1.Op != OpARMMOVWconst { 8510 break 8511 } 8512 c := v_1.AuxInt 8513 v.reset(OpARMMVNshiftRA) 8514 v.AuxInt = c 8515 v.AddArg(x) 8516 return true 8517 } 8518 return false 8519 } 8520 func rewriteValueARM_OpARMMVNshiftRL_0(v *Value) bool { 8521 // match: (MVNshiftRL (MOVWconst [c]) [d]) 8522 // cond: 8523 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 8524 for { 8525 d := v.AuxInt 8526 v_0 := v.Args[0] 8527 if v_0.Op != OpARMMOVWconst { 8528 break 8529 } 8530 c := v_0.AuxInt 8531 v.reset(OpARMMOVWconst) 8532 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 8533 return true 8534 } 8535 return false 8536 } 8537 func rewriteValueARM_OpARMMVNshiftRLreg_0(v *Value) bool { 8538 // match: (MVNshiftRLreg x (MOVWconst [c])) 8539 // cond: 8540 // result: (MVNshiftRL x [c]) 8541 for { 8542 x := v.Args[0] 8543 v_1 := v.Args[1] 8544 if v_1.Op != OpARMMOVWconst { 8545 break 8546 } 8547 c := v_1.AuxInt 8548 v.reset(OpARMMVNshiftRL) 8549 v.AuxInt = c 8550 v.AddArg(x) 8551 return true 8552 } 8553 return false 8554 } 8555 func rewriteValueARM_OpARMNotEqual_0(v *Value) bool { 8556 // match: (NotEqual (FlagEQ)) 8557 // cond: 8558 // result: (MOVWconst [0]) 8559 for { 8560 v_0 := v.Args[0] 8561 if v_0.Op != OpARMFlagEQ { 8562 break 8563 } 8564 v.reset(OpARMMOVWconst) 8565 v.AuxInt = 0 8566 return true 8567 } 8568 // match: (NotEqual (FlagLT_ULT)) 8569 // cond: 8570 // result: (MOVWconst [1]) 8571 for { 8572 v_0 := v.Args[0] 8573 if v_0.Op != OpARMFlagLT_ULT { 8574 break 8575 } 8576 v.reset(OpARMMOVWconst) 8577 v.AuxInt = 1 8578 return true 8579 } 8580 // match: (NotEqual (FlagLT_UGT)) 8581 // cond: 8582 // result: (MOVWconst [1]) 8583 for { 8584 v_0 := v.Args[0] 8585 if v_0.Op != OpARMFlagLT_UGT { 8586 break 8587 } 8588 v.reset(OpARMMOVWconst) 8589 v.AuxInt = 1 8590 return true 8591 } 8592 // match: (NotEqual (FlagGT_ULT)) 8593 // cond: 8594 // result: (MOVWconst [1]) 8595 for { 8596 v_0 := v.Args[0] 8597 if v_0.Op != OpARMFlagGT_ULT { 8598 break 8599 } 8600 v.reset(OpARMMOVWconst) 8601 v.AuxInt = 1 8602 return true 8603 } 8604 // match: (NotEqual (FlagGT_UGT)) 8605 // cond: 8606 // result: (MOVWconst [1]) 8607 for { 8608 v_0 := v.Args[0] 8609 if v_0.Op != OpARMFlagGT_UGT { 8610 break 8611 } 8612 v.reset(OpARMMOVWconst) 8613 v.AuxInt = 1 8614 return true 8615 } 8616 // match: (NotEqual (InvertFlags x)) 8617 // cond: 8618 // result: (NotEqual x) 8619 for { 8620 v_0 := v.Args[0] 8621 if v_0.Op != OpARMInvertFlags { 8622 break 8623 } 8624 x := v_0.Args[0] 8625 v.reset(OpARMNotEqual) 8626 v.AddArg(x) 8627 return true 8628 } 8629 return false 8630 } 8631 func rewriteValueARM_OpARMOR_0(v *Value) bool { 8632 // match: (OR x (MOVWconst [c])) 8633 // cond: 8634 // result: (ORconst [c] x) 8635 for { 8636 x := v.Args[0] 8637 v_1 := v.Args[1] 8638 if v_1.Op != OpARMMOVWconst { 8639 break 8640 } 8641 c := v_1.AuxInt 8642 v.reset(OpARMORconst) 8643 v.AuxInt = c 8644 v.AddArg(x) 8645 return true 8646 } 8647 // match: (OR (MOVWconst [c]) x) 8648 // cond: 8649 // result: (ORconst [c] x) 8650 for { 8651 v_0 := v.Args[0] 8652 if v_0.Op != OpARMMOVWconst { 8653 break 8654 } 8655 c := v_0.AuxInt 8656 x := v.Args[1] 8657 v.reset(OpARMORconst) 8658 v.AuxInt = c 8659 v.AddArg(x) 8660 return true 8661 } 8662 // match: (OR x (SLLconst [c] y)) 8663 // cond: 8664 // result: (ORshiftLL x y [c]) 8665 for { 8666 x := v.Args[0] 8667 v_1 := v.Args[1] 8668 if v_1.Op != OpARMSLLconst { 8669 break 8670 } 8671 c := v_1.AuxInt 8672 y := v_1.Args[0] 8673 v.reset(OpARMORshiftLL) 8674 v.AuxInt = c 8675 v.AddArg(x) 8676 v.AddArg(y) 8677 return true 8678 } 8679 // match: (OR (SLLconst [c] y) x) 8680 // cond: 8681 // result: (ORshiftLL x y [c]) 8682 for { 8683 v_0 := v.Args[0] 8684 if v_0.Op != OpARMSLLconst { 8685 break 8686 } 8687 c := v_0.AuxInt 8688 y := v_0.Args[0] 8689 x := v.Args[1] 8690 v.reset(OpARMORshiftLL) 8691 v.AuxInt = c 8692 v.AddArg(x) 8693 v.AddArg(y) 8694 return true 8695 } 8696 // match: (OR x (SRLconst [c] y)) 8697 // cond: 8698 // result: (ORshiftRL x y [c]) 8699 for { 8700 x := v.Args[0] 8701 v_1 := v.Args[1] 8702 if v_1.Op != OpARMSRLconst { 8703 break 8704 } 8705 c := v_1.AuxInt 8706 y := v_1.Args[0] 8707 v.reset(OpARMORshiftRL) 8708 v.AuxInt = c 8709 v.AddArg(x) 8710 v.AddArg(y) 8711 return true 8712 } 8713 // match: (OR (SRLconst [c] y) x) 8714 // cond: 8715 // result: (ORshiftRL x y [c]) 8716 for { 8717 v_0 := v.Args[0] 8718 if v_0.Op != OpARMSRLconst { 8719 break 8720 } 8721 c := v_0.AuxInt 8722 y := v_0.Args[0] 8723 x := v.Args[1] 8724 v.reset(OpARMORshiftRL) 8725 v.AuxInt = c 8726 v.AddArg(x) 8727 v.AddArg(y) 8728 return true 8729 } 8730 // match: (OR x (SRAconst [c] y)) 8731 // cond: 8732 // result: (ORshiftRA x y [c]) 8733 for { 8734 x := v.Args[0] 8735 v_1 := v.Args[1] 8736 if v_1.Op != OpARMSRAconst { 8737 break 8738 } 8739 c := v_1.AuxInt 8740 y := v_1.Args[0] 8741 v.reset(OpARMORshiftRA) 8742 v.AuxInt = c 8743 v.AddArg(x) 8744 v.AddArg(y) 8745 return true 8746 } 8747 // match: (OR (SRAconst [c] y) x) 8748 // cond: 8749 // result: (ORshiftRA x y [c]) 8750 for { 8751 v_0 := v.Args[0] 8752 if v_0.Op != OpARMSRAconst { 8753 break 8754 } 8755 c := v_0.AuxInt 8756 y := v_0.Args[0] 8757 x := v.Args[1] 8758 v.reset(OpARMORshiftRA) 8759 v.AuxInt = c 8760 v.AddArg(x) 8761 v.AddArg(y) 8762 return true 8763 } 8764 // match: (OR x (SLL y z)) 8765 // cond: 8766 // result: (ORshiftLLreg x y z) 8767 for { 8768 x := v.Args[0] 8769 v_1 := v.Args[1] 8770 if v_1.Op != OpARMSLL { 8771 break 8772 } 8773 y := v_1.Args[0] 8774 z := v_1.Args[1] 8775 v.reset(OpARMORshiftLLreg) 8776 v.AddArg(x) 8777 v.AddArg(y) 8778 v.AddArg(z) 8779 return true 8780 } 8781 // match: (OR (SLL y z) x) 8782 // cond: 8783 // result: (ORshiftLLreg x y z) 8784 for { 8785 v_0 := v.Args[0] 8786 if v_0.Op != OpARMSLL { 8787 break 8788 } 8789 y := v_0.Args[0] 8790 z := v_0.Args[1] 8791 x := v.Args[1] 8792 v.reset(OpARMORshiftLLreg) 8793 v.AddArg(x) 8794 v.AddArg(y) 8795 v.AddArg(z) 8796 return true 8797 } 8798 return false 8799 } 8800 func rewriteValueARM_OpARMOR_10(v *Value) bool { 8801 // match: (OR x (SRL y z)) 8802 // cond: 8803 // result: (ORshiftRLreg x y z) 8804 for { 8805 x := v.Args[0] 8806 v_1 := v.Args[1] 8807 if v_1.Op != OpARMSRL { 8808 break 8809 } 8810 y := v_1.Args[0] 8811 z := v_1.Args[1] 8812 v.reset(OpARMORshiftRLreg) 8813 v.AddArg(x) 8814 v.AddArg(y) 8815 v.AddArg(z) 8816 return true 8817 } 8818 // match: (OR (SRL y z) x) 8819 // cond: 8820 // result: (ORshiftRLreg x y z) 8821 for { 8822 v_0 := v.Args[0] 8823 if v_0.Op != OpARMSRL { 8824 break 8825 } 8826 y := v_0.Args[0] 8827 z := v_0.Args[1] 8828 x := v.Args[1] 8829 v.reset(OpARMORshiftRLreg) 8830 v.AddArg(x) 8831 v.AddArg(y) 8832 v.AddArg(z) 8833 return true 8834 } 8835 // match: (OR x (SRA y z)) 8836 // cond: 8837 // result: (ORshiftRAreg x y z) 8838 for { 8839 x := v.Args[0] 8840 v_1 := v.Args[1] 8841 if v_1.Op != OpARMSRA { 8842 break 8843 } 8844 y := v_1.Args[0] 8845 z := v_1.Args[1] 8846 v.reset(OpARMORshiftRAreg) 8847 v.AddArg(x) 8848 v.AddArg(y) 8849 v.AddArg(z) 8850 return true 8851 } 8852 // match: (OR (SRA y z) x) 8853 // cond: 8854 // result: (ORshiftRAreg x y z) 8855 for { 8856 v_0 := v.Args[0] 8857 if v_0.Op != OpARMSRA { 8858 break 8859 } 8860 y := v_0.Args[0] 8861 z := v_0.Args[1] 8862 x := v.Args[1] 8863 v.reset(OpARMORshiftRAreg) 8864 v.AddArg(x) 8865 v.AddArg(y) 8866 v.AddArg(z) 8867 return true 8868 } 8869 // match: (OR x x) 8870 // cond: 8871 // result: x 8872 for { 8873 x := v.Args[0] 8874 if x != v.Args[1] { 8875 break 8876 } 8877 v.reset(OpCopy) 8878 v.Type = x.Type 8879 v.AddArg(x) 8880 return true 8881 } 8882 return false 8883 } 8884 func rewriteValueARM_OpARMORconst_0(v *Value) bool { 8885 // match: (ORconst [0] x) 8886 // cond: 8887 // result: x 8888 for { 8889 if v.AuxInt != 0 { 8890 break 8891 } 8892 x := v.Args[0] 8893 v.reset(OpCopy) 8894 v.Type = x.Type 8895 v.AddArg(x) 8896 return true 8897 } 8898 // match: (ORconst [c] _) 8899 // cond: int32(c)==-1 8900 // result: (MOVWconst [-1]) 8901 for { 8902 c := v.AuxInt 8903 if !(int32(c) == -1) { 8904 break 8905 } 8906 v.reset(OpARMMOVWconst) 8907 v.AuxInt = -1 8908 return true 8909 } 8910 // match: (ORconst [c] (MOVWconst [d])) 8911 // cond: 8912 // result: (MOVWconst [c|d]) 8913 for { 8914 c := v.AuxInt 8915 v_0 := v.Args[0] 8916 if v_0.Op != OpARMMOVWconst { 8917 break 8918 } 8919 d := v_0.AuxInt 8920 v.reset(OpARMMOVWconst) 8921 v.AuxInt = c | d 8922 return true 8923 } 8924 // match: (ORconst [c] (ORconst [d] x)) 8925 // cond: 8926 // result: (ORconst [c|d] x) 8927 for { 8928 c := v.AuxInt 8929 v_0 := v.Args[0] 8930 if v_0.Op != OpARMORconst { 8931 break 8932 } 8933 d := v_0.AuxInt 8934 x := v_0.Args[0] 8935 v.reset(OpARMORconst) 8936 v.AuxInt = c | d 8937 v.AddArg(x) 8938 return true 8939 } 8940 return false 8941 } 8942 func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { 8943 b := v.Block 8944 _ = b 8945 // match: (ORshiftLL (MOVWconst [c]) x [d]) 8946 // cond: 8947 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 8948 for { 8949 d := v.AuxInt 8950 v_0 := v.Args[0] 8951 if v_0.Op != OpARMMOVWconst { 8952 break 8953 } 8954 c := v_0.AuxInt 8955 x := v.Args[1] 8956 v.reset(OpARMORconst) 8957 v.AuxInt = c 8958 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8959 v0.AuxInt = d 8960 v0.AddArg(x) 8961 v.AddArg(v0) 8962 return true 8963 } 8964 // match: (ORshiftLL x (MOVWconst [c]) [d]) 8965 // cond: 8966 // result: (ORconst x [int64(uint32(c)<<uint64(d))]) 8967 for { 8968 d := v.AuxInt 8969 x := v.Args[0] 8970 v_1 := v.Args[1] 8971 if v_1.Op != OpARMMOVWconst { 8972 break 8973 } 8974 c := v_1.AuxInt 8975 v.reset(OpARMORconst) 8976 v.AuxInt = int64(uint32(c) << uint64(d)) 8977 v.AddArg(x) 8978 return true 8979 } 8980 // match: (ORshiftLL [c] (SRLconst x [32-c]) x) 8981 // cond: 8982 // result: (SRRconst [32-c] x) 8983 for { 8984 c := v.AuxInt 8985 v_0 := v.Args[0] 8986 if v_0.Op != OpARMSRLconst { 8987 break 8988 } 8989 if v_0.AuxInt != 32-c { 8990 break 8991 } 8992 x := v_0.Args[0] 8993 if x != v.Args[1] { 8994 break 8995 } 8996 v.reset(OpARMSRRconst) 8997 v.AuxInt = 32 - c 8998 v.AddArg(x) 8999 return true 9000 } 9001 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 9002 // cond: c==d 9003 // result: y 9004 for { 9005 d := v.AuxInt 9006 x := v.Args[0] 9007 y := v.Args[1] 9008 if y.Op != OpARMSLLconst { 9009 break 9010 } 9011 c := y.AuxInt 9012 if x != y.Args[0] { 9013 break 9014 } 9015 if !(c == d) { 9016 break 9017 } 9018 v.reset(OpCopy) 9019 v.Type = y.Type 9020 v.AddArg(y) 9021 return true 9022 } 9023 return false 9024 } 9025 func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { 9026 b := v.Block 9027 _ = b 9028 // match: (ORshiftLLreg (MOVWconst [c]) x y) 9029 // cond: 9030 // result: (ORconst [c] (SLL <x.Type> x y)) 9031 for { 9032 v_0 := v.Args[0] 9033 if v_0.Op != OpARMMOVWconst { 9034 break 9035 } 9036 c := v_0.AuxInt 9037 x := v.Args[1] 9038 y := v.Args[2] 9039 v.reset(OpARMORconst) 9040 v.AuxInt = c 9041 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9042 v0.AddArg(x) 9043 v0.AddArg(y) 9044 v.AddArg(v0) 9045 return true 9046 } 9047 // match: (ORshiftLLreg x y (MOVWconst [c])) 9048 // cond: 9049 // result: (ORshiftLL x y [c]) 9050 for { 9051 x := v.Args[0] 9052 y := v.Args[1] 9053 v_2 := v.Args[2] 9054 if v_2.Op != OpARMMOVWconst { 9055 break 9056 } 9057 c := v_2.AuxInt 9058 v.reset(OpARMORshiftLL) 9059 v.AuxInt = c 9060 v.AddArg(x) 9061 v.AddArg(y) 9062 return true 9063 } 9064 return false 9065 } 9066 func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { 9067 b := v.Block 9068 _ = b 9069 // match: (ORshiftRA (MOVWconst [c]) x [d]) 9070 // cond: 9071 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 9072 for { 9073 d := v.AuxInt 9074 v_0 := v.Args[0] 9075 if v_0.Op != OpARMMOVWconst { 9076 break 9077 } 9078 c := v_0.AuxInt 9079 x := v.Args[1] 9080 v.reset(OpARMORconst) 9081 v.AuxInt = c 9082 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9083 v0.AuxInt = d 9084 v0.AddArg(x) 9085 v.AddArg(v0) 9086 return true 9087 } 9088 // match: (ORshiftRA x (MOVWconst [c]) [d]) 9089 // cond: 9090 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 9091 for { 9092 d := v.AuxInt 9093 x := v.Args[0] 9094 v_1 := v.Args[1] 9095 if v_1.Op != OpARMMOVWconst { 9096 break 9097 } 9098 c := v_1.AuxInt 9099 v.reset(OpARMORconst) 9100 v.AuxInt = int64(int32(c) >> uint64(d)) 9101 v.AddArg(x) 9102 return true 9103 } 9104 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 9105 // cond: c==d 9106 // result: y 9107 for { 9108 d := v.AuxInt 9109 x := v.Args[0] 9110 y := v.Args[1] 9111 if y.Op != OpARMSRAconst { 9112 break 9113 } 9114 c := y.AuxInt 9115 if x != y.Args[0] { 9116 break 9117 } 9118 if !(c == d) { 9119 break 9120 } 9121 v.reset(OpCopy) 9122 v.Type = y.Type 9123 v.AddArg(y) 9124 return true 9125 } 9126 return false 9127 } 9128 func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { 9129 b := v.Block 9130 _ = b 9131 // match: (ORshiftRAreg (MOVWconst [c]) x y) 9132 // cond: 9133 // result: (ORconst [c] (SRA <x.Type> x y)) 9134 for { 9135 v_0 := v.Args[0] 9136 if v_0.Op != OpARMMOVWconst { 9137 break 9138 } 9139 c := v_0.AuxInt 9140 x := v.Args[1] 9141 y := v.Args[2] 9142 v.reset(OpARMORconst) 9143 v.AuxInt = c 9144 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9145 v0.AddArg(x) 9146 v0.AddArg(y) 9147 v.AddArg(v0) 9148 return true 9149 } 9150 // match: (ORshiftRAreg x y (MOVWconst [c])) 9151 // cond: 9152 // result: (ORshiftRA x y [c]) 9153 for { 9154 x := v.Args[0] 9155 y := v.Args[1] 9156 v_2 := v.Args[2] 9157 if v_2.Op != OpARMMOVWconst { 9158 break 9159 } 9160 c := v_2.AuxInt 9161 v.reset(OpARMORshiftRA) 9162 v.AuxInt = c 9163 v.AddArg(x) 9164 v.AddArg(y) 9165 return true 9166 } 9167 return false 9168 } 9169 func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { 9170 b := v.Block 9171 _ = b 9172 // match: (ORshiftRL (MOVWconst [c]) x [d]) 9173 // cond: 9174 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 9175 for { 9176 d := v.AuxInt 9177 v_0 := v.Args[0] 9178 if v_0.Op != OpARMMOVWconst { 9179 break 9180 } 9181 c := v_0.AuxInt 9182 x := v.Args[1] 9183 v.reset(OpARMORconst) 9184 v.AuxInt = c 9185 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9186 v0.AuxInt = d 9187 v0.AddArg(x) 9188 v.AddArg(v0) 9189 return true 9190 } 9191 // match: (ORshiftRL x (MOVWconst [c]) [d]) 9192 // cond: 9193 // result: (ORconst x [int64(uint32(c)>>uint64(d))]) 9194 for { 9195 d := v.AuxInt 9196 x := v.Args[0] 9197 v_1 := v.Args[1] 9198 if v_1.Op != OpARMMOVWconst { 9199 break 9200 } 9201 c := v_1.AuxInt 9202 v.reset(OpARMORconst) 9203 v.AuxInt = int64(uint32(c) >> uint64(d)) 9204 v.AddArg(x) 9205 return true 9206 } 9207 // match: (ORshiftRL [c] (SLLconst x [32-c]) x) 9208 // cond: 9209 // result: (SRRconst [ c] x) 9210 for { 9211 c := v.AuxInt 9212 v_0 := v.Args[0] 9213 if v_0.Op != OpARMSLLconst { 9214 break 9215 } 9216 if v_0.AuxInt != 32-c { 9217 break 9218 } 9219 x := v_0.Args[0] 9220 if x != v.Args[1] { 9221 break 9222 } 9223 v.reset(OpARMSRRconst) 9224 v.AuxInt = c 9225 v.AddArg(x) 9226 return true 9227 } 9228 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 9229 // cond: c==d 9230 // result: y 9231 for { 9232 d := v.AuxInt 9233 x := v.Args[0] 9234 y := v.Args[1] 9235 if y.Op != OpARMSRLconst { 9236 break 9237 } 9238 c := y.AuxInt 9239 if x != y.Args[0] { 9240 break 9241 } 9242 if !(c == d) { 9243 break 9244 } 9245 v.reset(OpCopy) 9246 v.Type = y.Type 9247 v.AddArg(y) 9248 return true 9249 } 9250 return false 9251 } 9252 func rewriteValueARM_OpARMORshiftRLreg_0(v *Value) bool { 9253 b := v.Block 9254 _ = b 9255 // match: (ORshiftRLreg (MOVWconst [c]) x y) 9256 // cond: 9257 // result: (ORconst [c] (SRL <x.Type> x y)) 9258 for { 9259 v_0 := v.Args[0] 9260 if v_0.Op != OpARMMOVWconst { 9261 break 9262 } 9263 c := v_0.AuxInt 9264 x := v.Args[1] 9265 y := v.Args[2] 9266 v.reset(OpARMORconst) 9267 v.AuxInt = c 9268 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9269 v0.AddArg(x) 9270 v0.AddArg(y) 9271 v.AddArg(v0) 9272 return true 9273 } 9274 // match: (ORshiftRLreg x y (MOVWconst [c])) 9275 // cond: 9276 // result: (ORshiftRL x y [c]) 9277 for { 9278 x := v.Args[0] 9279 y := v.Args[1] 9280 v_2 := v.Args[2] 9281 if v_2.Op != OpARMMOVWconst { 9282 break 9283 } 9284 c := v_2.AuxInt 9285 v.reset(OpARMORshiftRL) 9286 v.AuxInt = c 9287 v.AddArg(x) 9288 v.AddArg(y) 9289 return true 9290 } 9291 return false 9292 } 9293 func rewriteValueARM_OpARMRSB_0(v *Value) bool { 9294 // match: (RSB (MOVWconst [c]) x) 9295 // cond: 9296 // result: (SUBconst [c] x) 9297 for { 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(OpARMSUBconst) 9305 v.AuxInt = c 9306 v.AddArg(x) 9307 return true 9308 } 9309 // match: (RSB x (MOVWconst [c])) 9310 // cond: 9311 // result: (RSBconst [c] x) 9312 for { 9313 x := v.Args[0] 9314 v_1 := v.Args[1] 9315 if v_1.Op != OpARMMOVWconst { 9316 break 9317 } 9318 c := v_1.AuxInt 9319 v.reset(OpARMRSBconst) 9320 v.AuxInt = c 9321 v.AddArg(x) 9322 return true 9323 } 9324 // match: (RSB x (SLLconst [c] y)) 9325 // cond: 9326 // result: (RSBshiftLL x y [c]) 9327 for { 9328 x := v.Args[0] 9329 v_1 := v.Args[1] 9330 if v_1.Op != OpARMSLLconst { 9331 break 9332 } 9333 c := v_1.AuxInt 9334 y := v_1.Args[0] 9335 v.reset(OpARMRSBshiftLL) 9336 v.AuxInt = c 9337 v.AddArg(x) 9338 v.AddArg(y) 9339 return true 9340 } 9341 // match: (RSB (SLLconst [c] y) x) 9342 // cond: 9343 // result: (SUBshiftLL x y [c]) 9344 for { 9345 v_0 := v.Args[0] 9346 if v_0.Op != OpARMSLLconst { 9347 break 9348 } 9349 c := v_0.AuxInt 9350 y := v_0.Args[0] 9351 x := v.Args[1] 9352 v.reset(OpARMSUBshiftLL) 9353 v.AuxInt = c 9354 v.AddArg(x) 9355 v.AddArg(y) 9356 return true 9357 } 9358 // match: (RSB x (SRLconst [c] y)) 9359 // cond: 9360 // result: (RSBshiftRL x y [c]) 9361 for { 9362 x := v.Args[0] 9363 v_1 := v.Args[1] 9364 if v_1.Op != OpARMSRLconst { 9365 break 9366 } 9367 c := v_1.AuxInt 9368 y := v_1.Args[0] 9369 v.reset(OpARMRSBshiftRL) 9370 v.AuxInt = c 9371 v.AddArg(x) 9372 v.AddArg(y) 9373 return true 9374 } 9375 // match: (RSB (SRLconst [c] y) x) 9376 // cond: 9377 // result: (SUBshiftRL x y [c]) 9378 for { 9379 v_0 := v.Args[0] 9380 if v_0.Op != OpARMSRLconst { 9381 break 9382 } 9383 c := v_0.AuxInt 9384 y := v_0.Args[0] 9385 x := v.Args[1] 9386 v.reset(OpARMSUBshiftRL) 9387 v.AuxInt = c 9388 v.AddArg(x) 9389 v.AddArg(y) 9390 return true 9391 } 9392 // match: (RSB x (SRAconst [c] y)) 9393 // cond: 9394 // result: (RSBshiftRA x y [c]) 9395 for { 9396 x := v.Args[0] 9397 v_1 := v.Args[1] 9398 if v_1.Op != OpARMSRAconst { 9399 break 9400 } 9401 c := v_1.AuxInt 9402 y := v_1.Args[0] 9403 v.reset(OpARMRSBshiftRA) 9404 v.AuxInt = c 9405 v.AddArg(x) 9406 v.AddArg(y) 9407 return true 9408 } 9409 // match: (RSB (SRAconst [c] y) x) 9410 // cond: 9411 // result: (SUBshiftRA x y [c]) 9412 for { 9413 v_0 := v.Args[0] 9414 if v_0.Op != OpARMSRAconst { 9415 break 9416 } 9417 c := v_0.AuxInt 9418 y := v_0.Args[0] 9419 x := v.Args[1] 9420 v.reset(OpARMSUBshiftRA) 9421 v.AuxInt = c 9422 v.AddArg(x) 9423 v.AddArg(y) 9424 return true 9425 } 9426 // match: (RSB x (SLL y z)) 9427 // cond: 9428 // result: (RSBshiftLLreg x y z) 9429 for { 9430 x := v.Args[0] 9431 v_1 := v.Args[1] 9432 if v_1.Op != OpARMSLL { 9433 break 9434 } 9435 y := v_1.Args[0] 9436 z := v_1.Args[1] 9437 v.reset(OpARMRSBshiftLLreg) 9438 v.AddArg(x) 9439 v.AddArg(y) 9440 v.AddArg(z) 9441 return true 9442 } 9443 // match: (RSB (SLL y z) x) 9444 // cond: 9445 // result: (SUBshiftLLreg x y z) 9446 for { 9447 v_0 := v.Args[0] 9448 if v_0.Op != OpARMSLL { 9449 break 9450 } 9451 y := v_0.Args[0] 9452 z := v_0.Args[1] 9453 x := v.Args[1] 9454 v.reset(OpARMSUBshiftLLreg) 9455 v.AddArg(x) 9456 v.AddArg(y) 9457 v.AddArg(z) 9458 return true 9459 } 9460 return false 9461 } 9462 func rewriteValueARM_OpARMRSB_10(v *Value) bool { 9463 // match: (RSB x (SRL y z)) 9464 // cond: 9465 // result: (RSBshiftRLreg x y z) 9466 for { 9467 x := v.Args[0] 9468 v_1 := v.Args[1] 9469 if v_1.Op != OpARMSRL { 9470 break 9471 } 9472 y := v_1.Args[0] 9473 z := v_1.Args[1] 9474 v.reset(OpARMRSBshiftRLreg) 9475 v.AddArg(x) 9476 v.AddArg(y) 9477 v.AddArg(z) 9478 return true 9479 } 9480 // match: (RSB (SRL y z) x) 9481 // cond: 9482 // result: (SUBshiftRLreg x y z) 9483 for { 9484 v_0 := v.Args[0] 9485 if v_0.Op != OpARMSRL { 9486 break 9487 } 9488 y := v_0.Args[0] 9489 z := v_0.Args[1] 9490 x := v.Args[1] 9491 v.reset(OpARMSUBshiftRLreg) 9492 v.AddArg(x) 9493 v.AddArg(y) 9494 v.AddArg(z) 9495 return true 9496 } 9497 // match: (RSB x (SRA y z)) 9498 // cond: 9499 // result: (RSBshiftRAreg x y z) 9500 for { 9501 x := v.Args[0] 9502 v_1 := v.Args[1] 9503 if v_1.Op != OpARMSRA { 9504 break 9505 } 9506 y := v_1.Args[0] 9507 z := v_1.Args[1] 9508 v.reset(OpARMRSBshiftRAreg) 9509 v.AddArg(x) 9510 v.AddArg(y) 9511 v.AddArg(z) 9512 return true 9513 } 9514 // match: (RSB (SRA y z) x) 9515 // cond: 9516 // result: (SUBshiftRAreg x y z) 9517 for { 9518 v_0 := v.Args[0] 9519 if v_0.Op != OpARMSRA { 9520 break 9521 } 9522 y := v_0.Args[0] 9523 z := v_0.Args[1] 9524 x := v.Args[1] 9525 v.reset(OpARMSUBshiftRAreg) 9526 v.AddArg(x) 9527 v.AddArg(y) 9528 v.AddArg(z) 9529 return true 9530 } 9531 // match: (RSB x x) 9532 // cond: 9533 // result: (MOVWconst [0]) 9534 for { 9535 x := v.Args[0] 9536 if x != v.Args[1] { 9537 break 9538 } 9539 v.reset(OpARMMOVWconst) 9540 v.AuxInt = 0 9541 return true 9542 } 9543 return false 9544 } 9545 func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { 9546 b := v.Block 9547 _ = b 9548 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 9549 // cond: 9550 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 9551 for { 9552 d := v.AuxInt 9553 v_0 := v.Args[0] 9554 if v_0.Op != OpARMMOVWconst { 9555 break 9556 } 9557 c := v_0.AuxInt 9558 x := v.Args[1] 9559 v.reset(OpARMSUBSconst) 9560 v.AuxInt = c 9561 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9562 v0.AuxInt = d 9563 v0.AddArg(x) 9564 v.AddArg(v0) 9565 return true 9566 } 9567 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 9568 // cond: 9569 // result: (RSBSconst x [int64(uint32(c)<<uint64(d))]) 9570 for { 9571 d := v.AuxInt 9572 x := v.Args[0] 9573 v_1 := v.Args[1] 9574 if v_1.Op != OpARMMOVWconst { 9575 break 9576 } 9577 c := v_1.AuxInt 9578 v.reset(OpARMRSBSconst) 9579 v.AuxInt = int64(uint32(c) << uint64(d)) 9580 v.AddArg(x) 9581 return true 9582 } 9583 return false 9584 } 9585 func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { 9586 b := v.Block 9587 _ = b 9588 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 9589 // cond: 9590 // result: (SUBSconst [c] (SLL <x.Type> x y)) 9591 for { 9592 v_0 := v.Args[0] 9593 if v_0.Op != OpARMMOVWconst { 9594 break 9595 } 9596 c := v_0.AuxInt 9597 x := v.Args[1] 9598 y := v.Args[2] 9599 v.reset(OpARMSUBSconst) 9600 v.AuxInt = c 9601 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9602 v0.AddArg(x) 9603 v0.AddArg(y) 9604 v.AddArg(v0) 9605 return true 9606 } 9607 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 9608 // cond: 9609 // result: (RSBSshiftLL x y [c]) 9610 for { 9611 x := v.Args[0] 9612 y := v.Args[1] 9613 v_2 := v.Args[2] 9614 if v_2.Op != OpARMMOVWconst { 9615 break 9616 } 9617 c := v_2.AuxInt 9618 v.reset(OpARMRSBSshiftLL) 9619 v.AuxInt = c 9620 v.AddArg(x) 9621 v.AddArg(y) 9622 return true 9623 } 9624 return false 9625 } 9626 func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { 9627 b := v.Block 9628 _ = b 9629 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 9630 // cond: 9631 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 9632 for { 9633 d := v.AuxInt 9634 v_0 := v.Args[0] 9635 if v_0.Op != OpARMMOVWconst { 9636 break 9637 } 9638 c := v_0.AuxInt 9639 x := v.Args[1] 9640 v.reset(OpARMSUBSconst) 9641 v.AuxInt = c 9642 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9643 v0.AuxInt = d 9644 v0.AddArg(x) 9645 v.AddArg(v0) 9646 return true 9647 } 9648 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 9649 // cond: 9650 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 9651 for { 9652 d := v.AuxInt 9653 x := v.Args[0] 9654 v_1 := v.Args[1] 9655 if v_1.Op != OpARMMOVWconst { 9656 break 9657 } 9658 c := v_1.AuxInt 9659 v.reset(OpARMRSBSconst) 9660 v.AuxInt = int64(int32(c) >> uint64(d)) 9661 v.AddArg(x) 9662 return true 9663 } 9664 return false 9665 } 9666 func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { 9667 b := v.Block 9668 _ = b 9669 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 9670 // cond: 9671 // result: (SUBSconst [c] (SRA <x.Type> x y)) 9672 for { 9673 v_0 := v.Args[0] 9674 if v_0.Op != OpARMMOVWconst { 9675 break 9676 } 9677 c := v_0.AuxInt 9678 x := v.Args[1] 9679 y := v.Args[2] 9680 v.reset(OpARMSUBSconst) 9681 v.AuxInt = c 9682 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9683 v0.AddArg(x) 9684 v0.AddArg(y) 9685 v.AddArg(v0) 9686 return true 9687 } 9688 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 9689 // cond: 9690 // result: (RSBSshiftRA x y [c]) 9691 for { 9692 x := v.Args[0] 9693 y := v.Args[1] 9694 v_2 := v.Args[2] 9695 if v_2.Op != OpARMMOVWconst { 9696 break 9697 } 9698 c := v_2.AuxInt 9699 v.reset(OpARMRSBSshiftRA) 9700 v.AuxInt = c 9701 v.AddArg(x) 9702 v.AddArg(y) 9703 return true 9704 } 9705 return false 9706 } 9707 func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { 9708 b := v.Block 9709 _ = b 9710 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 9711 // cond: 9712 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 9713 for { 9714 d := v.AuxInt 9715 v_0 := v.Args[0] 9716 if v_0.Op != OpARMMOVWconst { 9717 break 9718 } 9719 c := v_0.AuxInt 9720 x := v.Args[1] 9721 v.reset(OpARMSUBSconst) 9722 v.AuxInt = c 9723 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9724 v0.AuxInt = d 9725 v0.AddArg(x) 9726 v.AddArg(v0) 9727 return true 9728 } 9729 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 9730 // cond: 9731 // result: (RSBSconst x [int64(uint32(c)>>uint64(d))]) 9732 for { 9733 d := v.AuxInt 9734 x := v.Args[0] 9735 v_1 := v.Args[1] 9736 if v_1.Op != OpARMMOVWconst { 9737 break 9738 } 9739 c := v_1.AuxInt 9740 v.reset(OpARMRSBSconst) 9741 v.AuxInt = int64(uint32(c) >> uint64(d)) 9742 v.AddArg(x) 9743 return true 9744 } 9745 return false 9746 } 9747 func rewriteValueARM_OpARMRSBSshiftRLreg_0(v *Value) bool { 9748 b := v.Block 9749 _ = b 9750 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 9751 // cond: 9752 // result: (SUBSconst [c] (SRL <x.Type> x y)) 9753 for { 9754 v_0 := v.Args[0] 9755 if v_0.Op != OpARMMOVWconst { 9756 break 9757 } 9758 c := v_0.AuxInt 9759 x := v.Args[1] 9760 y := v.Args[2] 9761 v.reset(OpARMSUBSconst) 9762 v.AuxInt = c 9763 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 9764 v0.AddArg(x) 9765 v0.AddArg(y) 9766 v.AddArg(v0) 9767 return true 9768 } 9769 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 9770 // cond: 9771 // result: (RSBSshiftRL x y [c]) 9772 for { 9773 x := v.Args[0] 9774 y := v.Args[1] 9775 v_2 := v.Args[2] 9776 if v_2.Op != OpARMMOVWconst { 9777 break 9778 } 9779 c := v_2.AuxInt 9780 v.reset(OpARMRSBSshiftRL) 9781 v.AuxInt = c 9782 v.AddArg(x) 9783 v.AddArg(y) 9784 return true 9785 } 9786 return false 9787 } 9788 func rewriteValueARM_OpARMRSBconst_0(v *Value) bool { 9789 // match: (RSBconst [c] (MOVWconst [d])) 9790 // cond: 9791 // result: (MOVWconst [int64(int32(c-d))]) 9792 for { 9793 c := v.AuxInt 9794 v_0 := v.Args[0] 9795 if v_0.Op != OpARMMOVWconst { 9796 break 9797 } 9798 d := v_0.AuxInt 9799 v.reset(OpARMMOVWconst) 9800 v.AuxInt = int64(int32(c - d)) 9801 return true 9802 } 9803 // match: (RSBconst [c] (RSBconst [d] x)) 9804 // cond: 9805 // result: (ADDconst [int64(int32(c-d))] x) 9806 for { 9807 c := v.AuxInt 9808 v_0 := v.Args[0] 9809 if v_0.Op != OpARMRSBconst { 9810 break 9811 } 9812 d := v_0.AuxInt 9813 x := v_0.Args[0] 9814 v.reset(OpARMADDconst) 9815 v.AuxInt = int64(int32(c - d)) 9816 v.AddArg(x) 9817 return true 9818 } 9819 // match: (RSBconst [c] (ADDconst [d] x)) 9820 // cond: 9821 // result: (RSBconst [int64(int32(c-d))] x) 9822 for { 9823 c := v.AuxInt 9824 v_0 := v.Args[0] 9825 if v_0.Op != OpARMADDconst { 9826 break 9827 } 9828 d := v_0.AuxInt 9829 x := v_0.Args[0] 9830 v.reset(OpARMRSBconst) 9831 v.AuxInt = int64(int32(c - d)) 9832 v.AddArg(x) 9833 return true 9834 } 9835 // match: (RSBconst [c] (SUBconst [d] x)) 9836 // cond: 9837 // result: (RSBconst [int64(int32(c+d))] x) 9838 for { 9839 c := v.AuxInt 9840 v_0 := v.Args[0] 9841 if v_0.Op != OpARMSUBconst { 9842 break 9843 } 9844 d := v_0.AuxInt 9845 x := v_0.Args[0] 9846 v.reset(OpARMRSBconst) 9847 v.AuxInt = int64(int32(c + d)) 9848 v.AddArg(x) 9849 return true 9850 } 9851 return false 9852 } 9853 func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { 9854 b := v.Block 9855 _ = b 9856 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 9857 // cond: 9858 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 9859 for { 9860 d := v.AuxInt 9861 v_0 := v.Args[0] 9862 if v_0.Op != OpARMMOVWconst { 9863 break 9864 } 9865 c := v_0.AuxInt 9866 x := v.Args[1] 9867 v.reset(OpARMSUBconst) 9868 v.AuxInt = c 9869 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9870 v0.AuxInt = d 9871 v0.AddArg(x) 9872 v.AddArg(v0) 9873 return true 9874 } 9875 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 9876 // cond: 9877 // result: (RSBconst x [int64(uint32(c)<<uint64(d))]) 9878 for { 9879 d := v.AuxInt 9880 x := v.Args[0] 9881 v_1 := v.Args[1] 9882 if v_1.Op != OpARMMOVWconst { 9883 break 9884 } 9885 c := v_1.AuxInt 9886 v.reset(OpARMRSBconst) 9887 v.AuxInt = int64(uint32(c) << uint64(d)) 9888 v.AddArg(x) 9889 return true 9890 } 9891 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 9892 // cond: c==d 9893 // result: (MOVWconst [0]) 9894 for { 9895 d := v.AuxInt 9896 x := v.Args[0] 9897 v_1 := v.Args[1] 9898 if v_1.Op != OpARMSLLconst { 9899 break 9900 } 9901 c := v_1.AuxInt 9902 if x != v_1.Args[0] { 9903 break 9904 } 9905 if !(c == d) { 9906 break 9907 } 9908 v.reset(OpARMMOVWconst) 9909 v.AuxInt = 0 9910 return true 9911 } 9912 return false 9913 } 9914 func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { 9915 b := v.Block 9916 _ = b 9917 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 9918 // cond: 9919 // result: (SUBconst [c] (SLL <x.Type> x y)) 9920 for { 9921 v_0 := v.Args[0] 9922 if v_0.Op != OpARMMOVWconst { 9923 break 9924 } 9925 c := v_0.AuxInt 9926 x := v.Args[1] 9927 y := v.Args[2] 9928 v.reset(OpARMSUBconst) 9929 v.AuxInt = c 9930 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9931 v0.AddArg(x) 9932 v0.AddArg(y) 9933 v.AddArg(v0) 9934 return true 9935 } 9936 // match: (RSBshiftLLreg x y (MOVWconst [c])) 9937 // cond: 9938 // result: (RSBshiftLL x y [c]) 9939 for { 9940 x := v.Args[0] 9941 y := v.Args[1] 9942 v_2 := v.Args[2] 9943 if v_2.Op != OpARMMOVWconst { 9944 break 9945 } 9946 c := v_2.AuxInt 9947 v.reset(OpARMRSBshiftLL) 9948 v.AuxInt = c 9949 v.AddArg(x) 9950 v.AddArg(y) 9951 return true 9952 } 9953 return false 9954 } 9955 func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { 9956 b := v.Block 9957 _ = b 9958 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 9959 // cond: 9960 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 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 v.reset(OpARMSUBconst) 9970 v.AuxInt = c 9971 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9972 v0.AuxInt = d 9973 v0.AddArg(x) 9974 v.AddArg(v0) 9975 return true 9976 } 9977 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 9978 // cond: 9979 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 9980 for { 9981 d := v.AuxInt 9982 x := v.Args[0] 9983 v_1 := v.Args[1] 9984 if v_1.Op != OpARMMOVWconst { 9985 break 9986 } 9987 c := v_1.AuxInt 9988 v.reset(OpARMRSBconst) 9989 v.AuxInt = int64(int32(c) >> uint64(d)) 9990 v.AddArg(x) 9991 return true 9992 } 9993 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 9994 // cond: c==d 9995 // result: (MOVWconst [0]) 9996 for { 9997 d := v.AuxInt 9998 x := v.Args[0] 9999 v_1 := v.Args[1] 10000 if v_1.Op != OpARMSRAconst { 10001 break 10002 } 10003 c := v_1.AuxInt 10004 if x != v_1.Args[0] { 10005 break 10006 } 10007 if !(c == d) { 10008 break 10009 } 10010 v.reset(OpARMMOVWconst) 10011 v.AuxInt = 0 10012 return true 10013 } 10014 return false 10015 } 10016 func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { 10017 b := v.Block 10018 _ = b 10019 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 10020 // cond: 10021 // result: (SUBconst [c] (SRA <x.Type> x y)) 10022 for { 10023 v_0 := v.Args[0] 10024 if v_0.Op != OpARMMOVWconst { 10025 break 10026 } 10027 c := v_0.AuxInt 10028 x := v.Args[1] 10029 y := v.Args[2] 10030 v.reset(OpARMSUBconst) 10031 v.AuxInt = c 10032 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10033 v0.AddArg(x) 10034 v0.AddArg(y) 10035 v.AddArg(v0) 10036 return true 10037 } 10038 // match: (RSBshiftRAreg x y (MOVWconst [c])) 10039 // cond: 10040 // result: (RSBshiftRA x y [c]) 10041 for { 10042 x := v.Args[0] 10043 y := v.Args[1] 10044 v_2 := v.Args[2] 10045 if v_2.Op != OpARMMOVWconst { 10046 break 10047 } 10048 c := v_2.AuxInt 10049 v.reset(OpARMRSBshiftRA) 10050 v.AuxInt = c 10051 v.AddArg(x) 10052 v.AddArg(y) 10053 return true 10054 } 10055 return false 10056 } 10057 func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { 10058 b := v.Block 10059 _ = b 10060 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 10061 // cond: 10062 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 10063 for { 10064 d := v.AuxInt 10065 v_0 := v.Args[0] 10066 if v_0.Op != OpARMMOVWconst { 10067 break 10068 } 10069 c := v_0.AuxInt 10070 x := v.Args[1] 10071 v.reset(OpARMSUBconst) 10072 v.AuxInt = c 10073 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10074 v0.AuxInt = d 10075 v0.AddArg(x) 10076 v.AddArg(v0) 10077 return true 10078 } 10079 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 10080 // cond: 10081 // result: (RSBconst x [int64(uint32(c)>>uint64(d))]) 10082 for { 10083 d := v.AuxInt 10084 x := v.Args[0] 10085 v_1 := v.Args[1] 10086 if v_1.Op != OpARMMOVWconst { 10087 break 10088 } 10089 c := v_1.AuxInt 10090 v.reset(OpARMRSBconst) 10091 v.AuxInt = int64(uint32(c) >> uint64(d)) 10092 v.AddArg(x) 10093 return true 10094 } 10095 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 10096 // cond: c==d 10097 // result: (MOVWconst [0]) 10098 for { 10099 d := v.AuxInt 10100 x := v.Args[0] 10101 v_1 := v.Args[1] 10102 if v_1.Op != OpARMSRLconst { 10103 break 10104 } 10105 c := v_1.AuxInt 10106 if x != v_1.Args[0] { 10107 break 10108 } 10109 if !(c == d) { 10110 break 10111 } 10112 v.reset(OpARMMOVWconst) 10113 v.AuxInt = 0 10114 return true 10115 } 10116 return false 10117 } 10118 func rewriteValueARM_OpARMRSBshiftRLreg_0(v *Value) bool { 10119 b := v.Block 10120 _ = b 10121 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 10122 // cond: 10123 // result: (SUBconst [c] (SRL <x.Type> x y)) 10124 for { 10125 v_0 := v.Args[0] 10126 if v_0.Op != OpARMMOVWconst { 10127 break 10128 } 10129 c := v_0.AuxInt 10130 x := v.Args[1] 10131 y := v.Args[2] 10132 v.reset(OpARMSUBconst) 10133 v.AuxInt = c 10134 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10135 v0.AddArg(x) 10136 v0.AddArg(y) 10137 v.AddArg(v0) 10138 return true 10139 } 10140 // match: (RSBshiftRLreg x y (MOVWconst [c])) 10141 // cond: 10142 // result: (RSBshiftRL x y [c]) 10143 for { 10144 x := v.Args[0] 10145 y := v.Args[1] 10146 v_2 := v.Args[2] 10147 if v_2.Op != OpARMMOVWconst { 10148 break 10149 } 10150 c := v_2.AuxInt 10151 v.reset(OpARMRSBshiftRL) 10152 v.AuxInt = c 10153 v.AddArg(x) 10154 v.AddArg(y) 10155 return true 10156 } 10157 return false 10158 } 10159 func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { 10160 // match: (RSCconst [c] (ADDconst [d] x) flags) 10161 // cond: 10162 // result: (RSCconst [int64(int32(c-d))] x flags) 10163 for { 10164 c := v.AuxInt 10165 v_0 := v.Args[0] 10166 if v_0.Op != OpARMADDconst { 10167 break 10168 } 10169 d := v_0.AuxInt 10170 x := v_0.Args[0] 10171 flags := v.Args[1] 10172 v.reset(OpARMRSCconst) 10173 v.AuxInt = int64(int32(c - d)) 10174 v.AddArg(x) 10175 v.AddArg(flags) 10176 return true 10177 } 10178 // match: (RSCconst [c] (SUBconst [d] x) flags) 10179 // cond: 10180 // result: (RSCconst [int64(int32(c+d))] x flags) 10181 for { 10182 c := v.AuxInt 10183 v_0 := v.Args[0] 10184 if v_0.Op != OpARMSUBconst { 10185 break 10186 } 10187 d := v_0.AuxInt 10188 x := v_0.Args[0] 10189 flags := v.Args[1] 10190 v.reset(OpARMRSCconst) 10191 v.AuxInt = int64(int32(c + d)) 10192 v.AddArg(x) 10193 v.AddArg(flags) 10194 return true 10195 } 10196 return false 10197 } 10198 func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { 10199 b := v.Block 10200 _ = b 10201 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 10202 // cond: 10203 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 10204 for { 10205 d := v.AuxInt 10206 v_0 := v.Args[0] 10207 if v_0.Op != OpARMMOVWconst { 10208 break 10209 } 10210 c := v_0.AuxInt 10211 x := v.Args[1] 10212 flags := v.Args[2] 10213 v.reset(OpARMSBCconst) 10214 v.AuxInt = c 10215 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10216 v0.AuxInt = d 10217 v0.AddArg(x) 10218 v.AddArg(v0) 10219 v.AddArg(flags) 10220 return true 10221 } 10222 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 10223 // cond: 10224 // result: (RSCconst x [int64(uint32(c)<<uint64(d))] flags) 10225 for { 10226 d := v.AuxInt 10227 x := v.Args[0] 10228 v_1 := v.Args[1] 10229 if v_1.Op != OpARMMOVWconst { 10230 break 10231 } 10232 c := v_1.AuxInt 10233 flags := v.Args[2] 10234 v.reset(OpARMRSCconst) 10235 v.AuxInt = int64(uint32(c) << uint64(d)) 10236 v.AddArg(x) 10237 v.AddArg(flags) 10238 return true 10239 } 10240 return false 10241 } 10242 func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { 10243 b := v.Block 10244 _ = b 10245 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 10246 // cond: 10247 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 10248 for { 10249 v_0 := v.Args[0] 10250 if v_0.Op != OpARMMOVWconst { 10251 break 10252 } 10253 c := v_0.AuxInt 10254 x := v.Args[1] 10255 y := v.Args[2] 10256 flags := v.Args[3] 10257 v.reset(OpARMSBCconst) 10258 v.AuxInt = c 10259 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10260 v0.AddArg(x) 10261 v0.AddArg(y) 10262 v.AddArg(v0) 10263 v.AddArg(flags) 10264 return true 10265 } 10266 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 10267 // cond: 10268 // result: (RSCshiftLL x y [c] flags) 10269 for { 10270 x := v.Args[0] 10271 y := v.Args[1] 10272 v_2 := v.Args[2] 10273 if v_2.Op != OpARMMOVWconst { 10274 break 10275 } 10276 c := v_2.AuxInt 10277 flags := v.Args[3] 10278 v.reset(OpARMRSCshiftLL) 10279 v.AuxInt = c 10280 v.AddArg(x) 10281 v.AddArg(y) 10282 v.AddArg(flags) 10283 return true 10284 } 10285 return false 10286 } 10287 func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { 10288 b := v.Block 10289 _ = b 10290 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 10291 // cond: 10292 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 10293 for { 10294 d := v.AuxInt 10295 v_0 := v.Args[0] 10296 if v_0.Op != OpARMMOVWconst { 10297 break 10298 } 10299 c := v_0.AuxInt 10300 x := v.Args[1] 10301 flags := v.Args[2] 10302 v.reset(OpARMSBCconst) 10303 v.AuxInt = c 10304 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10305 v0.AuxInt = d 10306 v0.AddArg(x) 10307 v.AddArg(v0) 10308 v.AddArg(flags) 10309 return true 10310 } 10311 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 10312 // cond: 10313 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 10314 for { 10315 d := v.AuxInt 10316 x := v.Args[0] 10317 v_1 := v.Args[1] 10318 if v_1.Op != OpARMMOVWconst { 10319 break 10320 } 10321 c := v_1.AuxInt 10322 flags := v.Args[2] 10323 v.reset(OpARMRSCconst) 10324 v.AuxInt = int64(int32(c) >> uint64(d)) 10325 v.AddArg(x) 10326 v.AddArg(flags) 10327 return true 10328 } 10329 return false 10330 } 10331 func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { 10332 b := v.Block 10333 _ = b 10334 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 10335 // cond: 10336 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 10337 for { 10338 v_0 := v.Args[0] 10339 if v_0.Op != OpARMMOVWconst { 10340 break 10341 } 10342 c := v_0.AuxInt 10343 x := v.Args[1] 10344 y := v.Args[2] 10345 flags := v.Args[3] 10346 v.reset(OpARMSBCconst) 10347 v.AuxInt = c 10348 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10349 v0.AddArg(x) 10350 v0.AddArg(y) 10351 v.AddArg(v0) 10352 v.AddArg(flags) 10353 return true 10354 } 10355 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 10356 // cond: 10357 // result: (RSCshiftRA x y [c] flags) 10358 for { 10359 x := v.Args[0] 10360 y := v.Args[1] 10361 v_2 := v.Args[2] 10362 if v_2.Op != OpARMMOVWconst { 10363 break 10364 } 10365 c := v_2.AuxInt 10366 flags := v.Args[3] 10367 v.reset(OpARMRSCshiftRA) 10368 v.AuxInt = c 10369 v.AddArg(x) 10370 v.AddArg(y) 10371 v.AddArg(flags) 10372 return true 10373 } 10374 return false 10375 } 10376 func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { 10377 b := v.Block 10378 _ = b 10379 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 10380 // cond: 10381 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 10382 for { 10383 d := v.AuxInt 10384 v_0 := v.Args[0] 10385 if v_0.Op != OpARMMOVWconst { 10386 break 10387 } 10388 c := v_0.AuxInt 10389 x := v.Args[1] 10390 flags := v.Args[2] 10391 v.reset(OpARMSBCconst) 10392 v.AuxInt = c 10393 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10394 v0.AuxInt = d 10395 v0.AddArg(x) 10396 v.AddArg(v0) 10397 v.AddArg(flags) 10398 return true 10399 } 10400 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 10401 // cond: 10402 // result: (RSCconst x [int64(uint32(c)>>uint64(d))] flags) 10403 for { 10404 d := v.AuxInt 10405 x := v.Args[0] 10406 v_1 := v.Args[1] 10407 if v_1.Op != OpARMMOVWconst { 10408 break 10409 } 10410 c := v_1.AuxInt 10411 flags := v.Args[2] 10412 v.reset(OpARMRSCconst) 10413 v.AuxInt = int64(uint32(c) >> uint64(d)) 10414 v.AddArg(x) 10415 v.AddArg(flags) 10416 return true 10417 } 10418 return false 10419 } 10420 func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { 10421 b := v.Block 10422 _ = b 10423 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 10424 // cond: 10425 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 10426 for { 10427 v_0 := v.Args[0] 10428 if v_0.Op != OpARMMOVWconst { 10429 break 10430 } 10431 c := v_0.AuxInt 10432 x := v.Args[1] 10433 y := v.Args[2] 10434 flags := v.Args[3] 10435 v.reset(OpARMSBCconst) 10436 v.AuxInt = c 10437 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10438 v0.AddArg(x) 10439 v0.AddArg(y) 10440 v.AddArg(v0) 10441 v.AddArg(flags) 10442 return true 10443 } 10444 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 10445 // cond: 10446 // result: (RSCshiftRL x y [c] flags) 10447 for { 10448 x := v.Args[0] 10449 y := v.Args[1] 10450 v_2 := v.Args[2] 10451 if v_2.Op != OpARMMOVWconst { 10452 break 10453 } 10454 c := v_2.AuxInt 10455 flags := v.Args[3] 10456 v.reset(OpARMRSCshiftRL) 10457 v.AuxInt = c 10458 v.AddArg(x) 10459 v.AddArg(y) 10460 v.AddArg(flags) 10461 return true 10462 } 10463 return false 10464 } 10465 func rewriteValueARM_OpARMSBC_0(v *Value) bool { 10466 // match: (SBC (MOVWconst [c]) x flags) 10467 // cond: 10468 // result: (RSCconst [c] x flags) 10469 for { 10470 v_0 := v.Args[0] 10471 if v_0.Op != OpARMMOVWconst { 10472 break 10473 } 10474 c := v_0.AuxInt 10475 x := v.Args[1] 10476 flags := v.Args[2] 10477 v.reset(OpARMRSCconst) 10478 v.AuxInt = c 10479 v.AddArg(x) 10480 v.AddArg(flags) 10481 return true 10482 } 10483 // match: (SBC x (MOVWconst [c]) flags) 10484 // cond: 10485 // result: (SBCconst [c] x flags) 10486 for { 10487 x := v.Args[0] 10488 v_1 := v.Args[1] 10489 if v_1.Op != OpARMMOVWconst { 10490 break 10491 } 10492 c := v_1.AuxInt 10493 flags := v.Args[2] 10494 v.reset(OpARMSBCconst) 10495 v.AuxInt = c 10496 v.AddArg(x) 10497 v.AddArg(flags) 10498 return true 10499 } 10500 // match: (SBC x (SLLconst [c] y) flags) 10501 // cond: 10502 // result: (SBCshiftLL x y [c] flags) 10503 for { 10504 x := v.Args[0] 10505 v_1 := v.Args[1] 10506 if v_1.Op != OpARMSLLconst { 10507 break 10508 } 10509 c := v_1.AuxInt 10510 y := v_1.Args[0] 10511 flags := v.Args[2] 10512 v.reset(OpARMSBCshiftLL) 10513 v.AuxInt = c 10514 v.AddArg(x) 10515 v.AddArg(y) 10516 v.AddArg(flags) 10517 return true 10518 } 10519 // match: (SBC (SLLconst [c] y) x flags) 10520 // cond: 10521 // result: (RSCshiftLL x y [c] flags) 10522 for { 10523 v_0 := v.Args[0] 10524 if v_0.Op != OpARMSLLconst { 10525 break 10526 } 10527 c := v_0.AuxInt 10528 y := v_0.Args[0] 10529 x := v.Args[1] 10530 flags := v.Args[2] 10531 v.reset(OpARMRSCshiftLL) 10532 v.AuxInt = c 10533 v.AddArg(x) 10534 v.AddArg(y) 10535 v.AddArg(flags) 10536 return true 10537 } 10538 // match: (SBC x (SRLconst [c] y) flags) 10539 // cond: 10540 // result: (SBCshiftRL x y [c] flags) 10541 for { 10542 x := v.Args[0] 10543 v_1 := v.Args[1] 10544 if v_1.Op != OpARMSRLconst { 10545 break 10546 } 10547 c := v_1.AuxInt 10548 y := v_1.Args[0] 10549 flags := v.Args[2] 10550 v.reset(OpARMSBCshiftRL) 10551 v.AuxInt = c 10552 v.AddArg(x) 10553 v.AddArg(y) 10554 v.AddArg(flags) 10555 return true 10556 } 10557 // match: (SBC (SRLconst [c] y) x flags) 10558 // cond: 10559 // result: (RSCshiftRL x y [c] flags) 10560 for { 10561 v_0 := v.Args[0] 10562 if v_0.Op != OpARMSRLconst { 10563 break 10564 } 10565 c := v_0.AuxInt 10566 y := v_0.Args[0] 10567 x := v.Args[1] 10568 flags := v.Args[2] 10569 v.reset(OpARMRSCshiftRL) 10570 v.AuxInt = c 10571 v.AddArg(x) 10572 v.AddArg(y) 10573 v.AddArg(flags) 10574 return true 10575 } 10576 // match: (SBC x (SRAconst [c] y) flags) 10577 // cond: 10578 // result: (SBCshiftRA x y [c] flags) 10579 for { 10580 x := v.Args[0] 10581 v_1 := v.Args[1] 10582 if v_1.Op != OpARMSRAconst { 10583 break 10584 } 10585 c := v_1.AuxInt 10586 y := v_1.Args[0] 10587 flags := v.Args[2] 10588 v.reset(OpARMSBCshiftRA) 10589 v.AuxInt = c 10590 v.AddArg(x) 10591 v.AddArg(y) 10592 v.AddArg(flags) 10593 return true 10594 } 10595 // match: (SBC (SRAconst [c] y) x flags) 10596 // cond: 10597 // result: (RSCshiftRA x y [c] flags) 10598 for { 10599 v_0 := v.Args[0] 10600 if v_0.Op != OpARMSRAconst { 10601 break 10602 } 10603 c := v_0.AuxInt 10604 y := v_0.Args[0] 10605 x := v.Args[1] 10606 flags := v.Args[2] 10607 v.reset(OpARMRSCshiftRA) 10608 v.AuxInt = c 10609 v.AddArg(x) 10610 v.AddArg(y) 10611 v.AddArg(flags) 10612 return true 10613 } 10614 // match: (SBC x (SLL y z) flags) 10615 // cond: 10616 // result: (SBCshiftLLreg x y z flags) 10617 for { 10618 x := v.Args[0] 10619 v_1 := v.Args[1] 10620 if v_1.Op != OpARMSLL { 10621 break 10622 } 10623 y := v_1.Args[0] 10624 z := v_1.Args[1] 10625 flags := v.Args[2] 10626 v.reset(OpARMSBCshiftLLreg) 10627 v.AddArg(x) 10628 v.AddArg(y) 10629 v.AddArg(z) 10630 v.AddArg(flags) 10631 return true 10632 } 10633 // match: (SBC (SLL y z) x flags) 10634 // cond: 10635 // result: (RSCshiftLLreg x y z flags) 10636 for { 10637 v_0 := v.Args[0] 10638 if v_0.Op != OpARMSLL { 10639 break 10640 } 10641 y := v_0.Args[0] 10642 z := v_0.Args[1] 10643 x := v.Args[1] 10644 flags := v.Args[2] 10645 v.reset(OpARMRSCshiftLLreg) 10646 v.AddArg(x) 10647 v.AddArg(y) 10648 v.AddArg(z) 10649 v.AddArg(flags) 10650 return true 10651 } 10652 return false 10653 } 10654 func rewriteValueARM_OpARMSBC_10(v *Value) bool { 10655 // match: (SBC x (SRL y z) flags) 10656 // cond: 10657 // result: (SBCshiftRLreg x y z flags) 10658 for { 10659 x := v.Args[0] 10660 v_1 := v.Args[1] 10661 if v_1.Op != OpARMSRL { 10662 break 10663 } 10664 y := v_1.Args[0] 10665 z := v_1.Args[1] 10666 flags := v.Args[2] 10667 v.reset(OpARMSBCshiftRLreg) 10668 v.AddArg(x) 10669 v.AddArg(y) 10670 v.AddArg(z) 10671 v.AddArg(flags) 10672 return true 10673 } 10674 // match: (SBC (SRL y z) x flags) 10675 // cond: 10676 // result: (RSCshiftRLreg x y z flags) 10677 for { 10678 v_0 := v.Args[0] 10679 if v_0.Op != OpARMSRL { 10680 break 10681 } 10682 y := v_0.Args[0] 10683 z := v_0.Args[1] 10684 x := v.Args[1] 10685 flags := v.Args[2] 10686 v.reset(OpARMRSCshiftRLreg) 10687 v.AddArg(x) 10688 v.AddArg(y) 10689 v.AddArg(z) 10690 v.AddArg(flags) 10691 return true 10692 } 10693 // match: (SBC x (SRA y z) flags) 10694 // cond: 10695 // result: (SBCshiftRAreg x y z flags) 10696 for { 10697 x := v.Args[0] 10698 v_1 := v.Args[1] 10699 if v_1.Op != OpARMSRA { 10700 break 10701 } 10702 y := v_1.Args[0] 10703 z := v_1.Args[1] 10704 flags := v.Args[2] 10705 v.reset(OpARMSBCshiftRAreg) 10706 v.AddArg(x) 10707 v.AddArg(y) 10708 v.AddArg(z) 10709 v.AddArg(flags) 10710 return true 10711 } 10712 // match: (SBC (SRA y z) x flags) 10713 // cond: 10714 // result: (RSCshiftRAreg x y z flags) 10715 for { 10716 v_0 := v.Args[0] 10717 if v_0.Op != OpARMSRA { 10718 break 10719 } 10720 y := v_0.Args[0] 10721 z := v_0.Args[1] 10722 x := v.Args[1] 10723 flags := v.Args[2] 10724 v.reset(OpARMRSCshiftRAreg) 10725 v.AddArg(x) 10726 v.AddArg(y) 10727 v.AddArg(z) 10728 v.AddArg(flags) 10729 return true 10730 } 10731 return false 10732 } 10733 func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { 10734 // match: (SBCconst [c] (ADDconst [d] x) flags) 10735 // cond: 10736 // result: (SBCconst [int64(int32(c-d))] x flags) 10737 for { 10738 c := v.AuxInt 10739 v_0 := v.Args[0] 10740 if v_0.Op != OpARMADDconst { 10741 break 10742 } 10743 d := v_0.AuxInt 10744 x := v_0.Args[0] 10745 flags := v.Args[1] 10746 v.reset(OpARMSBCconst) 10747 v.AuxInt = int64(int32(c - d)) 10748 v.AddArg(x) 10749 v.AddArg(flags) 10750 return true 10751 } 10752 // match: (SBCconst [c] (SUBconst [d] x) flags) 10753 // cond: 10754 // result: (SBCconst [int64(int32(c+d))] x flags) 10755 for { 10756 c := v.AuxInt 10757 v_0 := v.Args[0] 10758 if v_0.Op != OpARMSUBconst { 10759 break 10760 } 10761 d := v_0.AuxInt 10762 x := v_0.Args[0] 10763 flags := v.Args[1] 10764 v.reset(OpARMSBCconst) 10765 v.AuxInt = int64(int32(c + d)) 10766 v.AddArg(x) 10767 v.AddArg(flags) 10768 return true 10769 } 10770 return false 10771 } 10772 func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { 10773 b := v.Block 10774 _ = b 10775 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 10776 // cond: 10777 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 10778 for { 10779 d := v.AuxInt 10780 v_0 := v.Args[0] 10781 if v_0.Op != OpARMMOVWconst { 10782 break 10783 } 10784 c := v_0.AuxInt 10785 x := v.Args[1] 10786 flags := v.Args[2] 10787 v.reset(OpARMRSCconst) 10788 v.AuxInt = c 10789 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10790 v0.AuxInt = d 10791 v0.AddArg(x) 10792 v.AddArg(v0) 10793 v.AddArg(flags) 10794 return true 10795 } 10796 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 10797 // cond: 10798 // result: (SBCconst x [int64(uint32(c)<<uint64(d))] flags) 10799 for { 10800 d := v.AuxInt 10801 x := v.Args[0] 10802 v_1 := v.Args[1] 10803 if v_1.Op != OpARMMOVWconst { 10804 break 10805 } 10806 c := v_1.AuxInt 10807 flags := v.Args[2] 10808 v.reset(OpARMSBCconst) 10809 v.AuxInt = int64(uint32(c) << uint64(d)) 10810 v.AddArg(x) 10811 v.AddArg(flags) 10812 return true 10813 } 10814 return false 10815 } 10816 func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { 10817 b := v.Block 10818 _ = b 10819 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 10820 // cond: 10821 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 10822 for { 10823 v_0 := v.Args[0] 10824 if v_0.Op != OpARMMOVWconst { 10825 break 10826 } 10827 c := v_0.AuxInt 10828 x := v.Args[1] 10829 y := v.Args[2] 10830 flags := v.Args[3] 10831 v.reset(OpARMRSCconst) 10832 v.AuxInt = c 10833 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10834 v0.AddArg(x) 10835 v0.AddArg(y) 10836 v.AddArg(v0) 10837 v.AddArg(flags) 10838 return true 10839 } 10840 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 10841 // cond: 10842 // result: (SBCshiftLL x y [c] flags) 10843 for { 10844 x := v.Args[0] 10845 y := v.Args[1] 10846 v_2 := v.Args[2] 10847 if v_2.Op != OpARMMOVWconst { 10848 break 10849 } 10850 c := v_2.AuxInt 10851 flags := v.Args[3] 10852 v.reset(OpARMSBCshiftLL) 10853 v.AuxInt = c 10854 v.AddArg(x) 10855 v.AddArg(y) 10856 v.AddArg(flags) 10857 return true 10858 } 10859 return false 10860 } 10861 func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { 10862 b := v.Block 10863 _ = b 10864 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 10865 // cond: 10866 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 10867 for { 10868 d := v.AuxInt 10869 v_0 := v.Args[0] 10870 if v_0.Op != OpARMMOVWconst { 10871 break 10872 } 10873 c := v_0.AuxInt 10874 x := v.Args[1] 10875 flags := v.Args[2] 10876 v.reset(OpARMRSCconst) 10877 v.AuxInt = c 10878 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10879 v0.AuxInt = d 10880 v0.AddArg(x) 10881 v.AddArg(v0) 10882 v.AddArg(flags) 10883 return true 10884 } 10885 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 10886 // cond: 10887 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 10888 for { 10889 d := v.AuxInt 10890 x := v.Args[0] 10891 v_1 := v.Args[1] 10892 if v_1.Op != OpARMMOVWconst { 10893 break 10894 } 10895 c := v_1.AuxInt 10896 flags := v.Args[2] 10897 v.reset(OpARMSBCconst) 10898 v.AuxInt = int64(int32(c) >> uint64(d)) 10899 v.AddArg(x) 10900 v.AddArg(flags) 10901 return true 10902 } 10903 return false 10904 } 10905 func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { 10906 b := v.Block 10907 _ = b 10908 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 10909 // cond: 10910 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 10911 for { 10912 v_0 := v.Args[0] 10913 if v_0.Op != OpARMMOVWconst { 10914 break 10915 } 10916 c := v_0.AuxInt 10917 x := v.Args[1] 10918 y := v.Args[2] 10919 flags := v.Args[3] 10920 v.reset(OpARMRSCconst) 10921 v.AuxInt = c 10922 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10923 v0.AddArg(x) 10924 v0.AddArg(y) 10925 v.AddArg(v0) 10926 v.AddArg(flags) 10927 return true 10928 } 10929 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 10930 // cond: 10931 // result: (SBCshiftRA x y [c] flags) 10932 for { 10933 x := v.Args[0] 10934 y := v.Args[1] 10935 v_2 := v.Args[2] 10936 if v_2.Op != OpARMMOVWconst { 10937 break 10938 } 10939 c := v_2.AuxInt 10940 flags := v.Args[3] 10941 v.reset(OpARMSBCshiftRA) 10942 v.AuxInt = c 10943 v.AddArg(x) 10944 v.AddArg(y) 10945 v.AddArg(flags) 10946 return true 10947 } 10948 return false 10949 } 10950 func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { 10951 b := v.Block 10952 _ = b 10953 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 10954 // cond: 10955 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 10956 for { 10957 d := v.AuxInt 10958 v_0 := v.Args[0] 10959 if v_0.Op != OpARMMOVWconst { 10960 break 10961 } 10962 c := v_0.AuxInt 10963 x := v.Args[1] 10964 flags := v.Args[2] 10965 v.reset(OpARMRSCconst) 10966 v.AuxInt = c 10967 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10968 v0.AuxInt = d 10969 v0.AddArg(x) 10970 v.AddArg(v0) 10971 v.AddArg(flags) 10972 return true 10973 } 10974 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 10975 // cond: 10976 // result: (SBCconst x [int64(uint32(c)>>uint64(d))] flags) 10977 for { 10978 d := v.AuxInt 10979 x := v.Args[0] 10980 v_1 := v.Args[1] 10981 if v_1.Op != OpARMMOVWconst { 10982 break 10983 } 10984 c := v_1.AuxInt 10985 flags := v.Args[2] 10986 v.reset(OpARMSBCconst) 10987 v.AuxInt = int64(uint32(c) >> uint64(d)) 10988 v.AddArg(x) 10989 v.AddArg(flags) 10990 return true 10991 } 10992 return false 10993 } 10994 func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { 10995 b := v.Block 10996 _ = b 10997 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 10998 // cond: 10999 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 11000 for { 11001 v_0 := v.Args[0] 11002 if v_0.Op != OpARMMOVWconst { 11003 break 11004 } 11005 c := v_0.AuxInt 11006 x := v.Args[1] 11007 y := v.Args[2] 11008 flags := v.Args[3] 11009 v.reset(OpARMRSCconst) 11010 v.AuxInt = c 11011 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11012 v0.AddArg(x) 11013 v0.AddArg(y) 11014 v.AddArg(v0) 11015 v.AddArg(flags) 11016 return true 11017 } 11018 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 11019 // cond: 11020 // result: (SBCshiftRL x y [c] flags) 11021 for { 11022 x := v.Args[0] 11023 y := v.Args[1] 11024 v_2 := v.Args[2] 11025 if v_2.Op != OpARMMOVWconst { 11026 break 11027 } 11028 c := v_2.AuxInt 11029 flags := v.Args[3] 11030 v.reset(OpARMSBCshiftRL) 11031 v.AuxInt = c 11032 v.AddArg(x) 11033 v.AddArg(y) 11034 v.AddArg(flags) 11035 return true 11036 } 11037 return false 11038 } 11039 func rewriteValueARM_OpARMSLL_0(v *Value) bool { 11040 // match: (SLL x (MOVWconst [c])) 11041 // cond: 11042 // result: (SLLconst x [c&31]) 11043 for { 11044 x := v.Args[0] 11045 v_1 := v.Args[1] 11046 if v_1.Op != OpARMMOVWconst { 11047 break 11048 } 11049 c := v_1.AuxInt 11050 v.reset(OpARMSLLconst) 11051 v.AuxInt = c & 31 11052 v.AddArg(x) 11053 return true 11054 } 11055 return false 11056 } 11057 func rewriteValueARM_OpARMSLLconst_0(v *Value) bool { 11058 // match: (SLLconst [c] (MOVWconst [d])) 11059 // cond: 11060 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 11061 for { 11062 c := v.AuxInt 11063 v_0 := v.Args[0] 11064 if v_0.Op != OpARMMOVWconst { 11065 break 11066 } 11067 d := v_0.AuxInt 11068 v.reset(OpARMMOVWconst) 11069 v.AuxInt = int64(uint32(d) << uint64(c)) 11070 return true 11071 } 11072 return false 11073 } 11074 func rewriteValueARM_OpARMSRA_0(v *Value) bool { 11075 // match: (SRA x (MOVWconst [c])) 11076 // cond: 11077 // result: (SRAconst x [c&31]) 11078 for { 11079 x := v.Args[0] 11080 v_1 := v.Args[1] 11081 if v_1.Op != OpARMMOVWconst { 11082 break 11083 } 11084 c := v_1.AuxInt 11085 v.reset(OpARMSRAconst) 11086 v.AuxInt = c & 31 11087 v.AddArg(x) 11088 return true 11089 } 11090 return false 11091 } 11092 func rewriteValueARM_OpARMSRAcond_0(v *Value) bool { 11093 // match: (SRAcond x _ (FlagEQ)) 11094 // cond: 11095 // result: (SRAconst x [31]) 11096 for { 11097 x := v.Args[0] 11098 v_2 := v.Args[2] 11099 if v_2.Op != OpARMFlagEQ { 11100 break 11101 } 11102 v.reset(OpARMSRAconst) 11103 v.AuxInt = 31 11104 v.AddArg(x) 11105 return true 11106 } 11107 // match: (SRAcond x y (FlagLT_ULT)) 11108 // cond: 11109 // result: (SRA x y) 11110 for { 11111 x := v.Args[0] 11112 y := v.Args[1] 11113 v_2 := v.Args[2] 11114 if v_2.Op != OpARMFlagLT_ULT { 11115 break 11116 } 11117 v.reset(OpARMSRA) 11118 v.AddArg(x) 11119 v.AddArg(y) 11120 return true 11121 } 11122 // match: (SRAcond x _ (FlagLT_UGT)) 11123 // cond: 11124 // result: (SRAconst x [31]) 11125 for { 11126 x := v.Args[0] 11127 v_2 := v.Args[2] 11128 if v_2.Op != OpARMFlagLT_UGT { 11129 break 11130 } 11131 v.reset(OpARMSRAconst) 11132 v.AuxInt = 31 11133 v.AddArg(x) 11134 return true 11135 } 11136 // match: (SRAcond x y (FlagGT_ULT)) 11137 // cond: 11138 // result: (SRA x y) 11139 for { 11140 x := v.Args[0] 11141 y := v.Args[1] 11142 v_2 := v.Args[2] 11143 if v_2.Op != OpARMFlagGT_ULT { 11144 break 11145 } 11146 v.reset(OpARMSRA) 11147 v.AddArg(x) 11148 v.AddArg(y) 11149 return true 11150 } 11151 // match: (SRAcond x _ (FlagGT_UGT)) 11152 // cond: 11153 // result: (SRAconst x [31]) 11154 for { 11155 x := v.Args[0] 11156 v_2 := v.Args[2] 11157 if v_2.Op != OpARMFlagGT_UGT { 11158 break 11159 } 11160 v.reset(OpARMSRAconst) 11161 v.AuxInt = 31 11162 v.AddArg(x) 11163 return true 11164 } 11165 return false 11166 } 11167 func rewriteValueARM_OpARMSRAconst_0(v *Value) bool { 11168 // match: (SRAconst [c] (MOVWconst [d])) 11169 // cond: 11170 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 11171 for { 11172 c := v.AuxInt 11173 v_0 := v.Args[0] 11174 if v_0.Op != OpARMMOVWconst { 11175 break 11176 } 11177 d := v_0.AuxInt 11178 v.reset(OpARMMOVWconst) 11179 v.AuxInt = int64(int32(d) >> uint64(c)) 11180 return true 11181 } 11182 return false 11183 } 11184 func rewriteValueARM_OpARMSRL_0(v *Value) bool { 11185 // match: (SRL x (MOVWconst [c])) 11186 // cond: 11187 // result: (SRLconst x [c&31]) 11188 for { 11189 x := v.Args[0] 11190 v_1 := v.Args[1] 11191 if v_1.Op != OpARMMOVWconst { 11192 break 11193 } 11194 c := v_1.AuxInt 11195 v.reset(OpARMSRLconst) 11196 v.AuxInt = c & 31 11197 v.AddArg(x) 11198 return true 11199 } 11200 return false 11201 } 11202 func rewriteValueARM_OpARMSRLconst_0(v *Value) bool { 11203 // match: (SRLconst [c] (MOVWconst [d])) 11204 // cond: 11205 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 11206 for { 11207 c := v.AuxInt 11208 v_0 := v.Args[0] 11209 if v_0.Op != OpARMMOVWconst { 11210 break 11211 } 11212 d := v_0.AuxInt 11213 v.reset(OpARMMOVWconst) 11214 v.AuxInt = int64(uint32(d) >> uint64(c)) 11215 return true 11216 } 11217 return false 11218 } 11219 func rewriteValueARM_OpARMSUB_0(v *Value) bool { 11220 // match: (SUB (MOVWconst [c]) x) 11221 // cond: 11222 // result: (RSBconst [c] x) 11223 for { 11224 v_0 := v.Args[0] 11225 if v_0.Op != OpARMMOVWconst { 11226 break 11227 } 11228 c := v_0.AuxInt 11229 x := v.Args[1] 11230 v.reset(OpARMRSBconst) 11231 v.AuxInt = c 11232 v.AddArg(x) 11233 return true 11234 } 11235 // match: (SUB x (MOVWconst [c])) 11236 // cond: 11237 // result: (SUBconst [c] x) 11238 for { 11239 x := v.Args[0] 11240 v_1 := v.Args[1] 11241 if v_1.Op != OpARMMOVWconst { 11242 break 11243 } 11244 c := v_1.AuxInt 11245 v.reset(OpARMSUBconst) 11246 v.AuxInt = c 11247 v.AddArg(x) 11248 return true 11249 } 11250 // match: (SUB x (SLLconst [c] y)) 11251 // cond: 11252 // result: (SUBshiftLL x y [c]) 11253 for { 11254 x := v.Args[0] 11255 v_1 := v.Args[1] 11256 if v_1.Op != OpARMSLLconst { 11257 break 11258 } 11259 c := v_1.AuxInt 11260 y := v_1.Args[0] 11261 v.reset(OpARMSUBshiftLL) 11262 v.AuxInt = c 11263 v.AddArg(x) 11264 v.AddArg(y) 11265 return true 11266 } 11267 // match: (SUB (SLLconst [c] y) x) 11268 // cond: 11269 // result: (RSBshiftLL x y [c]) 11270 for { 11271 v_0 := v.Args[0] 11272 if v_0.Op != OpARMSLLconst { 11273 break 11274 } 11275 c := v_0.AuxInt 11276 y := v_0.Args[0] 11277 x := v.Args[1] 11278 v.reset(OpARMRSBshiftLL) 11279 v.AuxInt = c 11280 v.AddArg(x) 11281 v.AddArg(y) 11282 return true 11283 } 11284 // match: (SUB x (SRLconst [c] y)) 11285 // cond: 11286 // result: (SUBshiftRL x y [c]) 11287 for { 11288 x := v.Args[0] 11289 v_1 := v.Args[1] 11290 if v_1.Op != OpARMSRLconst { 11291 break 11292 } 11293 c := v_1.AuxInt 11294 y := v_1.Args[0] 11295 v.reset(OpARMSUBshiftRL) 11296 v.AuxInt = c 11297 v.AddArg(x) 11298 v.AddArg(y) 11299 return true 11300 } 11301 // match: (SUB (SRLconst [c] y) x) 11302 // cond: 11303 // result: (RSBshiftRL x y [c]) 11304 for { 11305 v_0 := v.Args[0] 11306 if v_0.Op != OpARMSRLconst { 11307 break 11308 } 11309 c := v_0.AuxInt 11310 y := v_0.Args[0] 11311 x := v.Args[1] 11312 v.reset(OpARMRSBshiftRL) 11313 v.AuxInt = c 11314 v.AddArg(x) 11315 v.AddArg(y) 11316 return true 11317 } 11318 // match: (SUB x (SRAconst [c] y)) 11319 // cond: 11320 // result: (SUBshiftRA x y [c]) 11321 for { 11322 x := v.Args[0] 11323 v_1 := v.Args[1] 11324 if v_1.Op != OpARMSRAconst { 11325 break 11326 } 11327 c := v_1.AuxInt 11328 y := v_1.Args[0] 11329 v.reset(OpARMSUBshiftRA) 11330 v.AuxInt = c 11331 v.AddArg(x) 11332 v.AddArg(y) 11333 return true 11334 } 11335 // match: (SUB (SRAconst [c] y) x) 11336 // cond: 11337 // result: (RSBshiftRA x y [c]) 11338 for { 11339 v_0 := v.Args[0] 11340 if v_0.Op != OpARMSRAconst { 11341 break 11342 } 11343 c := v_0.AuxInt 11344 y := v_0.Args[0] 11345 x := v.Args[1] 11346 v.reset(OpARMRSBshiftRA) 11347 v.AuxInt = c 11348 v.AddArg(x) 11349 v.AddArg(y) 11350 return true 11351 } 11352 // match: (SUB x (SLL y z)) 11353 // cond: 11354 // result: (SUBshiftLLreg x y z) 11355 for { 11356 x := v.Args[0] 11357 v_1 := v.Args[1] 11358 if v_1.Op != OpARMSLL { 11359 break 11360 } 11361 y := v_1.Args[0] 11362 z := v_1.Args[1] 11363 v.reset(OpARMSUBshiftLLreg) 11364 v.AddArg(x) 11365 v.AddArg(y) 11366 v.AddArg(z) 11367 return true 11368 } 11369 // match: (SUB (SLL y z) x) 11370 // cond: 11371 // result: (RSBshiftLLreg x y z) 11372 for { 11373 v_0 := v.Args[0] 11374 if v_0.Op != OpARMSLL { 11375 break 11376 } 11377 y := v_0.Args[0] 11378 z := v_0.Args[1] 11379 x := v.Args[1] 11380 v.reset(OpARMRSBshiftLLreg) 11381 v.AddArg(x) 11382 v.AddArg(y) 11383 v.AddArg(z) 11384 return true 11385 } 11386 return false 11387 } 11388 func rewriteValueARM_OpARMSUB_10(v *Value) bool { 11389 // match: (SUB x (SRL y z)) 11390 // cond: 11391 // result: (SUBshiftRLreg x y z) 11392 for { 11393 x := v.Args[0] 11394 v_1 := v.Args[1] 11395 if v_1.Op != OpARMSRL { 11396 break 11397 } 11398 y := v_1.Args[0] 11399 z := v_1.Args[1] 11400 v.reset(OpARMSUBshiftRLreg) 11401 v.AddArg(x) 11402 v.AddArg(y) 11403 v.AddArg(z) 11404 return true 11405 } 11406 // match: (SUB (SRL y z) x) 11407 // cond: 11408 // result: (RSBshiftRLreg x y z) 11409 for { 11410 v_0 := v.Args[0] 11411 if v_0.Op != OpARMSRL { 11412 break 11413 } 11414 y := v_0.Args[0] 11415 z := v_0.Args[1] 11416 x := v.Args[1] 11417 v.reset(OpARMRSBshiftRLreg) 11418 v.AddArg(x) 11419 v.AddArg(y) 11420 v.AddArg(z) 11421 return true 11422 } 11423 // match: (SUB x (SRA y z)) 11424 // cond: 11425 // result: (SUBshiftRAreg x y z) 11426 for { 11427 x := v.Args[0] 11428 v_1 := v.Args[1] 11429 if v_1.Op != OpARMSRA { 11430 break 11431 } 11432 y := v_1.Args[0] 11433 z := v_1.Args[1] 11434 v.reset(OpARMSUBshiftRAreg) 11435 v.AddArg(x) 11436 v.AddArg(y) 11437 v.AddArg(z) 11438 return true 11439 } 11440 // match: (SUB (SRA y z) x) 11441 // cond: 11442 // result: (RSBshiftRAreg x y z) 11443 for { 11444 v_0 := v.Args[0] 11445 if v_0.Op != OpARMSRA { 11446 break 11447 } 11448 y := v_0.Args[0] 11449 z := v_0.Args[1] 11450 x := v.Args[1] 11451 v.reset(OpARMRSBshiftRAreg) 11452 v.AddArg(x) 11453 v.AddArg(y) 11454 v.AddArg(z) 11455 return true 11456 } 11457 // match: (SUB x x) 11458 // cond: 11459 // result: (MOVWconst [0]) 11460 for { 11461 x := v.Args[0] 11462 if x != v.Args[1] { 11463 break 11464 } 11465 v.reset(OpARMMOVWconst) 11466 v.AuxInt = 0 11467 return true 11468 } 11469 return false 11470 } 11471 func rewriteValueARM_OpARMSUBS_0(v *Value) bool { 11472 // match: (SUBS x (MOVWconst [c])) 11473 // cond: 11474 // result: (SUBSconst [c] x) 11475 for { 11476 x := v.Args[0] 11477 v_1 := v.Args[1] 11478 if v_1.Op != OpARMMOVWconst { 11479 break 11480 } 11481 c := v_1.AuxInt 11482 v.reset(OpARMSUBSconst) 11483 v.AuxInt = c 11484 v.AddArg(x) 11485 return true 11486 } 11487 // match: (SUBS x (SLLconst [c] y)) 11488 // cond: 11489 // result: (SUBSshiftLL x y [c]) 11490 for { 11491 x := v.Args[0] 11492 v_1 := v.Args[1] 11493 if v_1.Op != OpARMSLLconst { 11494 break 11495 } 11496 c := v_1.AuxInt 11497 y := v_1.Args[0] 11498 v.reset(OpARMSUBSshiftLL) 11499 v.AuxInt = c 11500 v.AddArg(x) 11501 v.AddArg(y) 11502 return true 11503 } 11504 // match: (SUBS (SLLconst [c] y) x) 11505 // cond: 11506 // result: (RSBSshiftLL x y [c]) 11507 for { 11508 v_0 := v.Args[0] 11509 if v_0.Op != OpARMSLLconst { 11510 break 11511 } 11512 c := v_0.AuxInt 11513 y := v_0.Args[0] 11514 x := v.Args[1] 11515 v.reset(OpARMRSBSshiftLL) 11516 v.AuxInt = c 11517 v.AddArg(x) 11518 v.AddArg(y) 11519 return true 11520 } 11521 // match: (SUBS x (SRLconst [c] y)) 11522 // cond: 11523 // result: (SUBSshiftRL x y [c]) 11524 for { 11525 x := v.Args[0] 11526 v_1 := v.Args[1] 11527 if v_1.Op != OpARMSRLconst { 11528 break 11529 } 11530 c := v_1.AuxInt 11531 y := v_1.Args[0] 11532 v.reset(OpARMSUBSshiftRL) 11533 v.AuxInt = c 11534 v.AddArg(x) 11535 v.AddArg(y) 11536 return true 11537 } 11538 // match: (SUBS (SRLconst [c] y) x) 11539 // cond: 11540 // result: (RSBSshiftRL x y [c]) 11541 for { 11542 v_0 := v.Args[0] 11543 if v_0.Op != OpARMSRLconst { 11544 break 11545 } 11546 c := v_0.AuxInt 11547 y := v_0.Args[0] 11548 x := v.Args[1] 11549 v.reset(OpARMRSBSshiftRL) 11550 v.AuxInt = c 11551 v.AddArg(x) 11552 v.AddArg(y) 11553 return true 11554 } 11555 // match: (SUBS x (SRAconst [c] y)) 11556 // cond: 11557 // result: (SUBSshiftRA x y [c]) 11558 for { 11559 x := v.Args[0] 11560 v_1 := v.Args[1] 11561 if v_1.Op != OpARMSRAconst { 11562 break 11563 } 11564 c := v_1.AuxInt 11565 y := v_1.Args[0] 11566 v.reset(OpARMSUBSshiftRA) 11567 v.AuxInt = c 11568 v.AddArg(x) 11569 v.AddArg(y) 11570 return true 11571 } 11572 // match: (SUBS (SRAconst [c] y) x) 11573 // cond: 11574 // result: (RSBSshiftRA x y [c]) 11575 for { 11576 v_0 := v.Args[0] 11577 if v_0.Op != OpARMSRAconst { 11578 break 11579 } 11580 c := v_0.AuxInt 11581 y := v_0.Args[0] 11582 x := v.Args[1] 11583 v.reset(OpARMRSBSshiftRA) 11584 v.AuxInt = c 11585 v.AddArg(x) 11586 v.AddArg(y) 11587 return true 11588 } 11589 // match: (SUBS x (SLL y z)) 11590 // cond: 11591 // result: (SUBSshiftLLreg x y z) 11592 for { 11593 x := v.Args[0] 11594 v_1 := v.Args[1] 11595 if v_1.Op != OpARMSLL { 11596 break 11597 } 11598 y := v_1.Args[0] 11599 z := v_1.Args[1] 11600 v.reset(OpARMSUBSshiftLLreg) 11601 v.AddArg(x) 11602 v.AddArg(y) 11603 v.AddArg(z) 11604 return true 11605 } 11606 // match: (SUBS (SLL y z) x) 11607 // cond: 11608 // result: (RSBSshiftLLreg x y z) 11609 for { 11610 v_0 := v.Args[0] 11611 if v_0.Op != OpARMSLL { 11612 break 11613 } 11614 y := v_0.Args[0] 11615 z := v_0.Args[1] 11616 x := v.Args[1] 11617 v.reset(OpARMRSBSshiftLLreg) 11618 v.AddArg(x) 11619 v.AddArg(y) 11620 v.AddArg(z) 11621 return true 11622 } 11623 // match: (SUBS x (SRL y z)) 11624 // cond: 11625 // result: (SUBSshiftRLreg x y z) 11626 for { 11627 x := v.Args[0] 11628 v_1 := v.Args[1] 11629 if v_1.Op != OpARMSRL { 11630 break 11631 } 11632 y := v_1.Args[0] 11633 z := v_1.Args[1] 11634 v.reset(OpARMSUBSshiftRLreg) 11635 v.AddArg(x) 11636 v.AddArg(y) 11637 v.AddArg(z) 11638 return true 11639 } 11640 return false 11641 } 11642 func rewriteValueARM_OpARMSUBS_10(v *Value) bool { 11643 // match: (SUBS (SRL y z) x) 11644 // cond: 11645 // result: (RSBSshiftRLreg x y z) 11646 for { 11647 v_0 := v.Args[0] 11648 if v_0.Op != OpARMSRL { 11649 break 11650 } 11651 y := v_0.Args[0] 11652 z := v_0.Args[1] 11653 x := v.Args[1] 11654 v.reset(OpARMRSBSshiftRLreg) 11655 v.AddArg(x) 11656 v.AddArg(y) 11657 v.AddArg(z) 11658 return true 11659 } 11660 // match: (SUBS x (SRA y z)) 11661 // cond: 11662 // result: (SUBSshiftRAreg x y z) 11663 for { 11664 x := v.Args[0] 11665 v_1 := v.Args[1] 11666 if v_1.Op != OpARMSRA { 11667 break 11668 } 11669 y := v_1.Args[0] 11670 z := v_1.Args[1] 11671 v.reset(OpARMSUBSshiftRAreg) 11672 v.AddArg(x) 11673 v.AddArg(y) 11674 v.AddArg(z) 11675 return true 11676 } 11677 // match: (SUBS (SRA y z) x) 11678 // cond: 11679 // result: (RSBSshiftRAreg x y z) 11680 for { 11681 v_0 := v.Args[0] 11682 if v_0.Op != OpARMSRA { 11683 break 11684 } 11685 y := v_0.Args[0] 11686 z := v_0.Args[1] 11687 x := v.Args[1] 11688 v.reset(OpARMRSBSshiftRAreg) 11689 v.AddArg(x) 11690 v.AddArg(y) 11691 v.AddArg(z) 11692 return true 11693 } 11694 return false 11695 } 11696 func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { 11697 b := v.Block 11698 _ = b 11699 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 11700 // cond: 11701 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 11702 for { 11703 d := v.AuxInt 11704 v_0 := v.Args[0] 11705 if v_0.Op != OpARMMOVWconst { 11706 break 11707 } 11708 c := v_0.AuxInt 11709 x := v.Args[1] 11710 v.reset(OpARMRSBSconst) 11711 v.AuxInt = c 11712 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11713 v0.AuxInt = d 11714 v0.AddArg(x) 11715 v.AddArg(v0) 11716 return true 11717 } 11718 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 11719 // cond: 11720 // result: (SUBSconst x [int64(uint32(c)<<uint64(d))]) 11721 for { 11722 d := v.AuxInt 11723 x := v.Args[0] 11724 v_1 := v.Args[1] 11725 if v_1.Op != OpARMMOVWconst { 11726 break 11727 } 11728 c := v_1.AuxInt 11729 v.reset(OpARMSUBSconst) 11730 v.AuxInt = int64(uint32(c) << uint64(d)) 11731 v.AddArg(x) 11732 return true 11733 } 11734 return false 11735 } 11736 func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { 11737 b := v.Block 11738 _ = b 11739 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 11740 // cond: 11741 // result: (RSBSconst [c] (SLL <x.Type> x y)) 11742 for { 11743 v_0 := v.Args[0] 11744 if v_0.Op != OpARMMOVWconst { 11745 break 11746 } 11747 c := v_0.AuxInt 11748 x := v.Args[1] 11749 y := v.Args[2] 11750 v.reset(OpARMRSBSconst) 11751 v.AuxInt = c 11752 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11753 v0.AddArg(x) 11754 v0.AddArg(y) 11755 v.AddArg(v0) 11756 return true 11757 } 11758 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 11759 // cond: 11760 // result: (SUBSshiftLL x y [c]) 11761 for { 11762 x := v.Args[0] 11763 y := v.Args[1] 11764 v_2 := v.Args[2] 11765 if v_2.Op != OpARMMOVWconst { 11766 break 11767 } 11768 c := v_2.AuxInt 11769 v.reset(OpARMSUBSshiftLL) 11770 v.AuxInt = c 11771 v.AddArg(x) 11772 v.AddArg(y) 11773 return true 11774 } 11775 return false 11776 } 11777 func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { 11778 b := v.Block 11779 _ = b 11780 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 11781 // cond: 11782 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 11783 for { 11784 d := v.AuxInt 11785 v_0 := v.Args[0] 11786 if v_0.Op != OpARMMOVWconst { 11787 break 11788 } 11789 c := v_0.AuxInt 11790 x := v.Args[1] 11791 v.reset(OpARMRSBSconst) 11792 v.AuxInt = c 11793 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11794 v0.AuxInt = d 11795 v0.AddArg(x) 11796 v.AddArg(v0) 11797 return true 11798 } 11799 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 11800 // cond: 11801 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 11802 for { 11803 d := v.AuxInt 11804 x := v.Args[0] 11805 v_1 := v.Args[1] 11806 if v_1.Op != OpARMMOVWconst { 11807 break 11808 } 11809 c := v_1.AuxInt 11810 v.reset(OpARMSUBSconst) 11811 v.AuxInt = int64(int32(c) >> uint64(d)) 11812 v.AddArg(x) 11813 return true 11814 } 11815 return false 11816 } 11817 func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { 11818 b := v.Block 11819 _ = b 11820 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 11821 // cond: 11822 // result: (RSBSconst [c] (SRA <x.Type> x y)) 11823 for { 11824 v_0 := v.Args[0] 11825 if v_0.Op != OpARMMOVWconst { 11826 break 11827 } 11828 c := v_0.AuxInt 11829 x := v.Args[1] 11830 y := v.Args[2] 11831 v.reset(OpARMRSBSconst) 11832 v.AuxInt = c 11833 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11834 v0.AddArg(x) 11835 v0.AddArg(y) 11836 v.AddArg(v0) 11837 return true 11838 } 11839 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 11840 // cond: 11841 // result: (SUBSshiftRA x y [c]) 11842 for { 11843 x := v.Args[0] 11844 y := v.Args[1] 11845 v_2 := v.Args[2] 11846 if v_2.Op != OpARMMOVWconst { 11847 break 11848 } 11849 c := v_2.AuxInt 11850 v.reset(OpARMSUBSshiftRA) 11851 v.AuxInt = c 11852 v.AddArg(x) 11853 v.AddArg(y) 11854 return true 11855 } 11856 return false 11857 } 11858 func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { 11859 b := v.Block 11860 _ = b 11861 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 11862 // cond: 11863 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 11864 for { 11865 d := v.AuxInt 11866 v_0 := v.Args[0] 11867 if v_0.Op != OpARMMOVWconst { 11868 break 11869 } 11870 c := v_0.AuxInt 11871 x := v.Args[1] 11872 v.reset(OpARMRSBSconst) 11873 v.AuxInt = c 11874 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11875 v0.AuxInt = d 11876 v0.AddArg(x) 11877 v.AddArg(v0) 11878 return true 11879 } 11880 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 11881 // cond: 11882 // result: (SUBSconst x [int64(uint32(c)>>uint64(d))]) 11883 for { 11884 d := v.AuxInt 11885 x := v.Args[0] 11886 v_1 := v.Args[1] 11887 if v_1.Op != OpARMMOVWconst { 11888 break 11889 } 11890 c := v_1.AuxInt 11891 v.reset(OpARMSUBSconst) 11892 v.AuxInt = int64(uint32(c) >> uint64(d)) 11893 v.AddArg(x) 11894 return true 11895 } 11896 return false 11897 } 11898 func rewriteValueARM_OpARMSUBSshiftRLreg_0(v *Value) bool { 11899 b := v.Block 11900 _ = b 11901 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 11902 // cond: 11903 // result: (RSBSconst [c] (SRL <x.Type> x y)) 11904 for { 11905 v_0 := v.Args[0] 11906 if v_0.Op != OpARMMOVWconst { 11907 break 11908 } 11909 c := v_0.AuxInt 11910 x := v.Args[1] 11911 y := v.Args[2] 11912 v.reset(OpARMRSBSconst) 11913 v.AuxInt = c 11914 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11915 v0.AddArg(x) 11916 v0.AddArg(y) 11917 v.AddArg(v0) 11918 return true 11919 } 11920 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 11921 // cond: 11922 // result: (SUBSshiftRL x y [c]) 11923 for { 11924 x := v.Args[0] 11925 y := v.Args[1] 11926 v_2 := v.Args[2] 11927 if v_2.Op != OpARMMOVWconst { 11928 break 11929 } 11930 c := v_2.AuxInt 11931 v.reset(OpARMSUBSshiftRL) 11932 v.AuxInt = c 11933 v.AddArg(x) 11934 v.AddArg(y) 11935 return true 11936 } 11937 return false 11938 } 11939 func rewriteValueARM_OpARMSUBconst_0(v *Value) bool { 11940 // match: (SUBconst [0] x) 11941 // cond: 11942 // result: x 11943 for { 11944 if v.AuxInt != 0 { 11945 break 11946 } 11947 x := v.Args[0] 11948 v.reset(OpCopy) 11949 v.Type = x.Type 11950 v.AddArg(x) 11951 return true 11952 } 11953 // match: (SUBconst [c] (MOVWconst [d])) 11954 // cond: 11955 // result: (MOVWconst [int64(int32(d-c))]) 11956 for { 11957 c := v.AuxInt 11958 v_0 := v.Args[0] 11959 if v_0.Op != OpARMMOVWconst { 11960 break 11961 } 11962 d := v_0.AuxInt 11963 v.reset(OpARMMOVWconst) 11964 v.AuxInt = int64(int32(d - c)) 11965 return true 11966 } 11967 // match: (SUBconst [c] (SUBconst [d] x)) 11968 // cond: 11969 // result: (ADDconst [int64(int32(-c-d))] x) 11970 for { 11971 c := v.AuxInt 11972 v_0 := v.Args[0] 11973 if v_0.Op != OpARMSUBconst { 11974 break 11975 } 11976 d := v_0.AuxInt 11977 x := v_0.Args[0] 11978 v.reset(OpARMADDconst) 11979 v.AuxInt = int64(int32(-c - d)) 11980 v.AddArg(x) 11981 return true 11982 } 11983 // match: (SUBconst [c] (ADDconst [d] x)) 11984 // cond: 11985 // result: (ADDconst [int64(int32(-c+d))] x) 11986 for { 11987 c := v.AuxInt 11988 v_0 := v.Args[0] 11989 if v_0.Op != OpARMADDconst { 11990 break 11991 } 11992 d := v_0.AuxInt 11993 x := v_0.Args[0] 11994 v.reset(OpARMADDconst) 11995 v.AuxInt = int64(int32(-c + d)) 11996 v.AddArg(x) 11997 return true 11998 } 11999 // match: (SUBconst [c] (RSBconst [d] x)) 12000 // cond: 12001 // result: (RSBconst [int64(int32(-c+d))] x) 12002 for { 12003 c := v.AuxInt 12004 v_0 := v.Args[0] 12005 if v_0.Op != OpARMRSBconst { 12006 break 12007 } 12008 d := v_0.AuxInt 12009 x := v_0.Args[0] 12010 v.reset(OpARMRSBconst) 12011 v.AuxInt = int64(int32(-c + d)) 12012 v.AddArg(x) 12013 return true 12014 } 12015 return false 12016 } 12017 func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { 12018 b := v.Block 12019 _ = b 12020 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 12021 // cond: 12022 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 12023 for { 12024 d := v.AuxInt 12025 v_0 := v.Args[0] 12026 if v_0.Op != OpARMMOVWconst { 12027 break 12028 } 12029 c := v_0.AuxInt 12030 x := v.Args[1] 12031 v.reset(OpARMRSBconst) 12032 v.AuxInt = c 12033 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12034 v0.AuxInt = d 12035 v0.AddArg(x) 12036 v.AddArg(v0) 12037 return true 12038 } 12039 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 12040 // cond: 12041 // result: (SUBconst x [int64(uint32(c)<<uint64(d))]) 12042 for { 12043 d := v.AuxInt 12044 x := v.Args[0] 12045 v_1 := v.Args[1] 12046 if v_1.Op != OpARMMOVWconst { 12047 break 12048 } 12049 c := v_1.AuxInt 12050 v.reset(OpARMSUBconst) 12051 v.AuxInt = int64(uint32(c) << uint64(d)) 12052 v.AddArg(x) 12053 return true 12054 } 12055 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 12056 // cond: c==d 12057 // result: (MOVWconst [0]) 12058 for { 12059 d := v.AuxInt 12060 x := v.Args[0] 12061 v_1 := v.Args[1] 12062 if v_1.Op != OpARMSLLconst { 12063 break 12064 } 12065 c := v_1.AuxInt 12066 if x != v_1.Args[0] { 12067 break 12068 } 12069 if !(c == d) { 12070 break 12071 } 12072 v.reset(OpARMMOVWconst) 12073 v.AuxInt = 0 12074 return true 12075 } 12076 return false 12077 } 12078 func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { 12079 b := v.Block 12080 _ = b 12081 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 12082 // cond: 12083 // result: (RSBconst [c] (SLL <x.Type> x y)) 12084 for { 12085 v_0 := v.Args[0] 12086 if v_0.Op != OpARMMOVWconst { 12087 break 12088 } 12089 c := v_0.AuxInt 12090 x := v.Args[1] 12091 y := v.Args[2] 12092 v.reset(OpARMRSBconst) 12093 v.AuxInt = c 12094 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12095 v0.AddArg(x) 12096 v0.AddArg(y) 12097 v.AddArg(v0) 12098 return true 12099 } 12100 // match: (SUBshiftLLreg x y (MOVWconst [c])) 12101 // cond: 12102 // result: (SUBshiftLL x y [c]) 12103 for { 12104 x := v.Args[0] 12105 y := v.Args[1] 12106 v_2 := v.Args[2] 12107 if v_2.Op != OpARMMOVWconst { 12108 break 12109 } 12110 c := v_2.AuxInt 12111 v.reset(OpARMSUBshiftLL) 12112 v.AuxInt = c 12113 v.AddArg(x) 12114 v.AddArg(y) 12115 return true 12116 } 12117 return false 12118 } 12119 func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { 12120 b := v.Block 12121 _ = b 12122 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 12123 // cond: 12124 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 12125 for { 12126 d := v.AuxInt 12127 v_0 := v.Args[0] 12128 if v_0.Op != OpARMMOVWconst { 12129 break 12130 } 12131 c := v_0.AuxInt 12132 x := v.Args[1] 12133 v.reset(OpARMRSBconst) 12134 v.AuxInt = c 12135 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12136 v0.AuxInt = d 12137 v0.AddArg(x) 12138 v.AddArg(v0) 12139 return true 12140 } 12141 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 12142 // cond: 12143 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 12144 for { 12145 d := v.AuxInt 12146 x := v.Args[0] 12147 v_1 := v.Args[1] 12148 if v_1.Op != OpARMMOVWconst { 12149 break 12150 } 12151 c := v_1.AuxInt 12152 v.reset(OpARMSUBconst) 12153 v.AuxInt = int64(int32(c) >> uint64(d)) 12154 v.AddArg(x) 12155 return true 12156 } 12157 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 12158 // cond: c==d 12159 // result: (MOVWconst [0]) 12160 for { 12161 d := v.AuxInt 12162 x := v.Args[0] 12163 v_1 := v.Args[1] 12164 if v_1.Op != OpARMSRAconst { 12165 break 12166 } 12167 c := v_1.AuxInt 12168 if x != v_1.Args[0] { 12169 break 12170 } 12171 if !(c == d) { 12172 break 12173 } 12174 v.reset(OpARMMOVWconst) 12175 v.AuxInt = 0 12176 return true 12177 } 12178 return false 12179 } 12180 func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { 12181 b := v.Block 12182 _ = b 12183 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 12184 // cond: 12185 // result: (RSBconst [c] (SRA <x.Type> x y)) 12186 for { 12187 v_0 := v.Args[0] 12188 if v_0.Op != OpARMMOVWconst { 12189 break 12190 } 12191 c := v_0.AuxInt 12192 x := v.Args[1] 12193 y := v.Args[2] 12194 v.reset(OpARMRSBconst) 12195 v.AuxInt = c 12196 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12197 v0.AddArg(x) 12198 v0.AddArg(y) 12199 v.AddArg(v0) 12200 return true 12201 } 12202 // match: (SUBshiftRAreg x y (MOVWconst [c])) 12203 // cond: 12204 // result: (SUBshiftRA x y [c]) 12205 for { 12206 x := v.Args[0] 12207 y := v.Args[1] 12208 v_2 := v.Args[2] 12209 if v_2.Op != OpARMMOVWconst { 12210 break 12211 } 12212 c := v_2.AuxInt 12213 v.reset(OpARMSUBshiftRA) 12214 v.AuxInt = c 12215 v.AddArg(x) 12216 v.AddArg(y) 12217 return true 12218 } 12219 return false 12220 } 12221 func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { 12222 b := v.Block 12223 _ = b 12224 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 12225 // cond: 12226 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 12227 for { 12228 d := v.AuxInt 12229 v_0 := v.Args[0] 12230 if v_0.Op != OpARMMOVWconst { 12231 break 12232 } 12233 c := v_0.AuxInt 12234 x := v.Args[1] 12235 v.reset(OpARMRSBconst) 12236 v.AuxInt = c 12237 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12238 v0.AuxInt = d 12239 v0.AddArg(x) 12240 v.AddArg(v0) 12241 return true 12242 } 12243 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 12244 // cond: 12245 // result: (SUBconst x [int64(uint32(c)>>uint64(d))]) 12246 for { 12247 d := v.AuxInt 12248 x := v.Args[0] 12249 v_1 := v.Args[1] 12250 if v_1.Op != OpARMMOVWconst { 12251 break 12252 } 12253 c := v_1.AuxInt 12254 v.reset(OpARMSUBconst) 12255 v.AuxInt = int64(uint32(c) >> uint64(d)) 12256 v.AddArg(x) 12257 return true 12258 } 12259 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 12260 // cond: c==d 12261 // result: (MOVWconst [0]) 12262 for { 12263 d := v.AuxInt 12264 x := v.Args[0] 12265 v_1 := v.Args[1] 12266 if v_1.Op != OpARMSRLconst { 12267 break 12268 } 12269 c := v_1.AuxInt 12270 if x != v_1.Args[0] { 12271 break 12272 } 12273 if !(c == d) { 12274 break 12275 } 12276 v.reset(OpARMMOVWconst) 12277 v.AuxInt = 0 12278 return true 12279 } 12280 return false 12281 } 12282 func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { 12283 b := v.Block 12284 _ = b 12285 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 12286 // cond: 12287 // result: (RSBconst [c] (SRL <x.Type> x y)) 12288 for { 12289 v_0 := v.Args[0] 12290 if v_0.Op != OpARMMOVWconst { 12291 break 12292 } 12293 c := v_0.AuxInt 12294 x := v.Args[1] 12295 y := v.Args[2] 12296 v.reset(OpARMRSBconst) 12297 v.AuxInt = c 12298 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12299 v0.AddArg(x) 12300 v0.AddArg(y) 12301 v.AddArg(v0) 12302 return true 12303 } 12304 // match: (SUBshiftRLreg x y (MOVWconst [c])) 12305 // cond: 12306 // result: (SUBshiftRL x y [c]) 12307 for { 12308 x := v.Args[0] 12309 y := v.Args[1] 12310 v_2 := v.Args[2] 12311 if v_2.Op != OpARMMOVWconst { 12312 break 12313 } 12314 c := v_2.AuxInt 12315 v.reset(OpARMSUBshiftRL) 12316 v.AuxInt = c 12317 v.AddArg(x) 12318 v.AddArg(y) 12319 return true 12320 } 12321 return false 12322 } 12323 func rewriteValueARM_OpARMXOR_0(v *Value) bool { 12324 // match: (XOR x (MOVWconst [c])) 12325 // cond: 12326 // result: (XORconst [c] x) 12327 for { 12328 x := v.Args[0] 12329 v_1 := v.Args[1] 12330 if v_1.Op != OpARMMOVWconst { 12331 break 12332 } 12333 c := v_1.AuxInt 12334 v.reset(OpARMXORconst) 12335 v.AuxInt = c 12336 v.AddArg(x) 12337 return true 12338 } 12339 // match: (XOR (MOVWconst [c]) x) 12340 // cond: 12341 // result: (XORconst [c] x) 12342 for { 12343 v_0 := v.Args[0] 12344 if v_0.Op != OpARMMOVWconst { 12345 break 12346 } 12347 c := v_0.AuxInt 12348 x := v.Args[1] 12349 v.reset(OpARMXORconst) 12350 v.AuxInt = c 12351 v.AddArg(x) 12352 return true 12353 } 12354 // match: (XOR x (SLLconst [c] y)) 12355 // cond: 12356 // result: (XORshiftLL x y [c]) 12357 for { 12358 x := v.Args[0] 12359 v_1 := v.Args[1] 12360 if v_1.Op != OpARMSLLconst { 12361 break 12362 } 12363 c := v_1.AuxInt 12364 y := v_1.Args[0] 12365 v.reset(OpARMXORshiftLL) 12366 v.AuxInt = c 12367 v.AddArg(x) 12368 v.AddArg(y) 12369 return true 12370 } 12371 // match: (XOR (SLLconst [c] y) x) 12372 // cond: 12373 // result: (XORshiftLL x y [c]) 12374 for { 12375 v_0 := v.Args[0] 12376 if v_0.Op != OpARMSLLconst { 12377 break 12378 } 12379 c := v_0.AuxInt 12380 y := v_0.Args[0] 12381 x := v.Args[1] 12382 v.reset(OpARMXORshiftLL) 12383 v.AuxInt = c 12384 v.AddArg(x) 12385 v.AddArg(y) 12386 return true 12387 } 12388 // match: (XOR x (SRLconst [c] y)) 12389 // cond: 12390 // result: (XORshiftRL x y [c]) 12391 for { 12392 x := v.Args[0] 12393 v_1 := v.Args[1] 12394 if v_1.Op != OpARMSRLconst { 12395 break 12396 } 12397 c := v_1.AuxInt 12398 y := v_1.Args[0] 12399 v.reset(OpARMXORshiftRL) 12400 v.AuxInt = c 12401 v.AddArg(x) 12402 v.AddArg(y) 12403 return true 12404 } 12405 // match: (XOR (SRLconst [c] y) x) 12406 // cond: 12407 // result: (XORshiftRL x y [c]) 12408 for { 12409 v_0 := v.Args[0] 12410 if v_0.Op != OpARMSRLconst { 12411 break 12412 } 12413 c := v_0.AuxInt 12414 y := v_0.Args[0] 12415 x := v.Args[1] 12416 v.reset(OpARMXORshiftRL) 12417 v.AuxInt = c 12418 v.AddArg(x) 12419 v.AddArg(y) 12420 return true 12421 } 12422 // match: (XOR x (SRAconst [c] y)) 12423 // cond: 12424 // result: (XORshiftRA x y [c]) 12425 for { 12426 x := v.Args[0] 12427 v_1 := v.Args[1] 12428 if v_1.Op != OpARMSRAconst { 12429 break 12430 } 12431 c := v_1.AuxInt 12432 y := v_1.Args[0] 12433 v.reset(OpARMXORshiftRA) 12434 v.AuxInt = c 12435 v.AddArg(x) 12436 v.AddArg(y) 12437 return true 12438 } 12439 // match: (XOR (SRAconst [c] y) x) 12440 // cond: 12441 // result: (XORshiftRA x y [c]) 12442 for { 12443 v_0 := v.Args[0] 12444 if v_0.Op != OpARMSRAconst { 12445 break 12446 } 12447 c := v_0.AuxInt 12448 y := v_0.Args[0] 12449 x := v.Args[1] 12450 v.reset(OpARMXORshiftRA) 12451 v.AuxInt = c 12452 v.AddArg(x) 12453 v.AddArg(y) 12454 return true 12455 } 12456 // match: (XOR x (SRRconst [c] y)) 12457 // cond: 12458 // result: (XORshiftRR x y [c]) 12459 for { 12460 x := v.Args[0] 12461 v_1 := v.Args[1] 12462 if v_1.Op != OpARMSRRconst { 12463 break 12464 } 12465 c := v_1.AuxInt 12466 y := v_1.Args[0] 12467 v.reset(OpARMXORshiftRR) 12468 v.AuxInt = c 12469 v.AddArg(x) 12470 v.AddArg(y) 12471 return true 12472 } 12473 // match: (XOR (SRRconst [c] y) x) 12474 // cond: 12475 // result: (XORshiftRR x y [c]) 12476 for { 12477 v_0 := v.Args[0] 12478 if v_0.Op != OpARMSRRconst { 12479 break 12480 } 12481 c := v_0.AuxInt 12482 y := v_0.Args[0] 12483 x := v.Args[1] 12484 v.reset(OpARMXORshiftRR) 12485 v.AuxInt = c 12486 v.AddArg(x) 12487 v.AddArg(y) 12488 return true 12489 } 12490 return false 12491 } 12492 func rewriteValueARM_OpARMXOR_10(v *Value) bool { 12493 // match: (XOR x (SLL y z)) 12494 // cond: 12495 // result: (XORshiftLLreg x y z) 12496 for { 12497 x := v.Args[0] 12498 v_1 := v.Args[1] 12499 if v_1.Op != OpARMSLL { 12500 break 12501 } 12502 y := v_1.Args[0] 12503 z := v_1.Args[1] 12504 v.reset(OpARMXORshiftLLreg) 12505 v.AddArg(x) 12506 v.AddArg(y) 12507 v.AddArg(z) 12508 return true 12509 } 12510 // match: (XOR (SLL y z) x) 12511 // cond: 12512 // result: (XORshiftLLreg x y z) 12513 for { 12514 v_0 := v.Args[0] 12515 if v_0.Op != OpARMSLL { 12516 break 12517 } 12518 y := v_0.Args[0] 12519 z := v_0.Args[1] 12520 x := v.Args[1] 12521 v.reset(OpARMXORshiftLLreg) 12522 v.AddArg(x) 12523 v.AddArg(y) 12524 v.AddArg(z) 12525 return true 12526 } 12527 // match: (XOR x (SRL y z)) 12528 // cond: 12529 // result: (XORshiftRLreg x y z) 12530 for { 12531 x := v.Args[0] 12532 v_1 := v.Args[1] 12533 if v_1.Op != OpARMSRL { 12534 break 12535 } 12536 y := v_1.Args[0] 12537 z := v_1.Args[1] 12538 v.reset(OpARMXORshiftRLreg) 12539 v.AddArg(x) 12540 v.AddArg(y) 12541 v.AddArg(z) 12542 return true 12543 } 12544 // match: (XOR (SRL y z) x) 12545 // cond: 12546 // result: (XORshiftRLreg x y z) 12547 for { 12548 v_0 := v.Args[0] 12549 if v_0.Op != OpARMSRL { 12550 break 12551 } 12552 y := v_0.Args[0] 12553 z := v_0.Args[1] 12554 x := v.Args[1] 12555 v.reset(OpARMXORshiftRLreg) 12556 v.AddArg(x) 12557 v.AddArg(y) 12558 v.AddArg(z) 12559 return true 12560 } 12561 // match: (XOR x (SRA y z)) 12562 // cond: 12563 // result: (XORshiftRAreg x y z) 12564 for { 12565 x := v.Args[0] 12566 v_1 := v.Args[1] 12567 if v_1.Op != OpARMSRA { 12568 break 12569 } 12570 y := v_1.Args[0] 12571 z := v_1.Args[1] 12572 v.reset(OpARMXORshiftRAreg) 12573 v.AddArg(x) 12574 v.AddArg(y) 12575 v.AddArg(z) 12576 return true 12577 } 12578 // match: (XOR (SRA y z) x) 12579 // cond: 12580 // result: (XORshiftRAreg x y z) 12581 for { 12582 v_0 := v.Args[0] 12583 if v_0.Op != OpARMSRA { 12584 break 12585 } 12586 y := v_0.Args[0] 12587 z := v_0.Args[1] 12588 x := v.Args[1] 12589 v.reset(OpARMXORshiftRAreg) 12590 v.AddArg(x) 12591 v.AddArg(y) 12592 v.AddArg(z) 12593 return true 12594 } 12595 // match: (XOR x x) 12596 // cond: 12597 // result: (MOVWconst [0]) 12598 for { 12599 x := v.Args[0] 12600 if x != v.Args[1] { 12601 break 12602 } 12603 v.reset(OpARMMOVWconst) 12604 v.AuxInt = 0 12605 return true 12606 } 12607 return false 12608 } 12609 func rewriteValueARM_OpARMXORconst_0(v *Value) bool { 12610 // match: (XORconst [0] x) 12611 // cond: 12612 // result: x 12613 for { 12614 if v.AuxInt != 0 { 12615 break 12616 } 12617 x := v.Args[0] 12618 v.reset(OpCopy) 12619 v.Type = x.Type 12620 v.AddArg(x) 12621 return true 12622 } 12623 // match: (XORconst [c] (MOVWconst [d])) 12624 // cond: 12625 // result: (MOVWconst [c^d]) 12626 for { 12627 c := v.AuxInt 12628 v_0 := v.Args[0] 12629 if v_0.Op != OpARMMOVWconst { 12630 break 12631 } 12632 d := v_0.AuxInt 12633 v.reset(OpARMMOVWconst) 12634 v.AuxInt = c ^ d 12635 return true 12636 } 12637 // match: (XORconst [c] (XORconst [d] x)) 12638 // cond: 12639 // result: (XORconst [c^d] x) 12640 for { 12641 c := v.AuxInt 12642 v_0 := v.Args[0] 12643 if v_0.Op != OpARMXORconst { 12644 break 12645 } 12646 d := v_0.AuxInt 12647 x := v_0.Args[0] 12648 v.reset(OpARMXORconst) 12649 v.AuxInt = c ^ d 12650 v.AddArg(x) 12651 return true 12652 } 12653 return false 12654 } 12655 func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { 12656 b := v.Block 12657 _ = b 12658 // match: (XORshiftLL (MOVWconst [c]) x [d]) 12659 // cond: 12660 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 12661 for { 12662 d := v.AuxInt 12663 v_0 := v.Args[0] 12664 if v_0.Op != OpARMMOVWconst { 12665 break 12666 } 12667 c := v_0.AuxInt 12668 x := v.Args[1] 12669 v.reset(OpARMXORconst) 12670 v.AuxInt = c 12671 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12672 v0.AuxInt = d 12673 v0.AddArg(x) 12674 v.AddArg(v0) 12675 return true 12676 } 12677 // match: (XORshiftLL x (MOVWconst [c]) [d]) 12678 // cond: 12679 // result: (XORconst x [int64(uint32(c)<<uint64(d))]) 12680 for { 12681 d := v.AuxInt 12682 x := v.Args[0] 12683 v_1 := v.Args[1] 12684 if v_1.Op != OpARMMOVWconst { 12685 break 12686 } 12687 c := v_1.AuxInt 12688 v.reset(OpARMXORconst) 12689 v.AuxInt = int64(uint32(c) << uint64(d)) 12690 v.AddArg(x) 12691 return true 12692 } 12693 // match: (XORshiftLL [c] (SRLconst x [32-c]) x) 12694 // cond: 12695 // result: (SRRconst [32-c] x) 12696 for { 12697 c := v.AuxInt 12698 v_0 := v.Args[0] 12699 if v_0.Op != OpARMSRLconst { 12700 break 12701 } 12702 if v_0.AuxInt != 32-c { 12703 break 12704 } 12705 x := v_0.Args[0] 12706 if x != v.Args[1] { 12707 break 12708 } 12709 v.reset(OpARMSRRconst) 12710 v.AuxInt = 32 - c 12711 v.AddArg(x) 12712 return true 12713 } 12714 // match: (XORshiftLL x (SLLconst x [c]) [d]) 12715 // cond: c==d 12716 // result: (MOVWconst [0]) 12717 for { 12718 d := v.AuxInt 12719 x := v.Args[0] 12720 v_1 := v.Args[1] 12721 if v_1.Op != OpARMSLLconst { 12722 break 12723 } 12724 c := v_1.AuxInt 12725 if x != v_1.Args[0] { 12726 break 12727 } 12728 if !(c == d) { 12729 break 12730 } 12731 v.reset(OpARMMOVWconst) 12732 v.AuxInt = 0 12733 return true 12734 } 12735 return false 12736 } 12737 func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { 12738 b := v.Block 12739 _ = b 12740 // match: (XORshiftLLreg (MOVWconst [c]) x y) 12741 // cond: 12742 // result: (XORconst [c] (SLL <x.Type> x y)) 12743 for { 12744 v_0 := v.Args[0] 12745 if v_0.Op != OpARMMOVWconst { 12746 break 12747 } 12748 c := v_0.AuxInt 12749 x := v.Args[1] 12750 y := v.Args[2] 12751 v.reset(OpARMXORconst) 12752 v.AuxInt = c 12753 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12754 v0.AddArg(x) 12755 v0.AddArg(y) 12756 v.AddArg(v0) 12757 return true 12758 } 12759 // match: (XORshiftLLreg x y (MOVWconst [c])) 12760 // cond: 12761 // result: (XORshiftLL x y [c]) 12762 for { 12763 x := v.Args[0] 12764 y := v.Args[1] 12765 v_2 := v.Args[2] 12766 if v_2.Op != OpARMMOVWconst { 12767 break 12768 } 12769 c := v_2.AuxInt 12770 v.reset(OpARMXORshiftLL) 12771 v.AuxInt = c 12772 v.AddArg(x) 12773 v.AddArg(y) 12774 return true 12775 } 12776 return false 12777 } 12778 func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { 12779 b := v.Block 12780 _ = b 12781 // match: (XORshiftRA (MOVWconst [c]) x [d]) 12782 // cond: 12783 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 12784 for { 12785 d := v.AuxInt 12786 v_0 := v.Args[0] 12787 if v_0.Op != OpARMMOVWconst { 12788 break 12789 } 12790 c := v_0.AuxInt 12791 x := v.Args[1] 12792 v.reset(OpARMXORconst) 12793 v.AuxInt = c 12794 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12795 v0.AuxInt = d 12796 v0.AddArg(x) 12797 v.AddArg(v0) 12798 return true 12799 } 12800 // match: (XORshiftRA x (MOVWconst [c]) [d]) 12801 // cond: 12802 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 12803 for { 12804 d := v.AuxInt 12805 x := v.Args[0] 12806 v_1 := v.Args[1] 12807 if v_1.Op != OpARMMOVWconst { 12808 break 12809 } 12810 c := v_1.AuxInt 12811 v.reset(OpARMXORconst) 12812 v.AuxInt = int64(int32(c) >> uint64(d)) 12813 v.AddArg(x) 12814 return true 12815 } 12816 // match: (XORshiftRA x (SRAconst x [c]) [d]) 12817 // cond: c==d 12818 // result: (MOVWconst [0]) 12819 for { 12820 d := v.AuxInt 12821 x := v.Args[0] 12822 v_1 := v.Args[1] 12823 if v_1.Op != OpARMSRAconst { 12824 break 12825 } 12826 c := v_1.AuxInt 12827 if x != v_1.Args[0] { 12828 break 12829 } 12830 if !(c == d) { 12831 break 12832 } 12833 v.reset(OpARMMOVWconst) 12834 v.AuxInt = 0 12835 return true 12836 } 12837 return false 12838 } 12839 func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { 12840 b := v.Block 12841 _ = b 12842 // match: (XORshiftRAreg (MOVWconst [c]) x y) 12843 // cond: 12844 // result: (XORconst [c] (SRA <x.Type> x y)) 12845 for { 12846 v_0 := v.Args[0] 12847 if v_0.Op != OpARMMOVWconst { 12848 break 12849 } 12850 c := v_0.AuxInt 12851 x := v.Args[1] 12852 y := v.Args[2] 12853 v.reset(OpARMXORconst) 12854 v.AuxInt = c 12855 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12856 v0.AddArg(x) 12857 v0.AddArg(y) 12858 v.AddArg(v0) 12859 return true 12860 } 12861 // match: (XORshiftRAreg x y (MOVWconst [c])) 12862 // cond: 12863 // result: (XORshiftRA x y [c]) 12864 for { 12865 x := v.Args[0] 12866 y := v.Args[1] 12867 v_2 := v.Args[2] 12868 if v_2.Op != OpARMMOVWconst { 12869 break 12870 } 12871 c := v_2.AuxInt 12872 v.reset(OpARMXORshiftRA) 12873 v.AuxInt = c 12874 v.AddArg(x) 12875 v.AddArg(y) 12876 return true 12877 } 12878 return false 12879 } 12880 func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { 12881 b := v.Block 12882 _ = b 12883 // match: (XORshiftRL (MOVWconst [c]) x [d]) 12884 // cond: 12885 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 12886 for { 12887 d := v.AuxInt 12888 v_0 := v.Args[0] 12889 if v_0.Op != OpARMMOVWconst { 12890 break 12891 } 12892 c := v_0.AuxInt 12893 x := v.Args[1] 12894 v.reset(OpARMXORconst) 12895 v.AuxInt = c 12896 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12897 v0.AuxInt = d 12898 v0.AddArg(x) 12899 v.AddArg(v0) 12900 return true 12901 } 12902 // match: (XORshiftRL x (MOVWconst [c]) [d]) 12903 // cond: 12904 // result: (XORconst x [int64(uint32(c)>>uint64(d))]) 12905 for { 12906 d := v.AuxInt 12907 x := v.Args[0] 12908 v_1 := v.Args[1] 12909 if v_1.Op != OpARMMOVWconst { 12910 break 12911 } 12912 c := v_1.AuxInt 12913 v.reset(OpARMXORconst) 12914 v.AuxInt = int64(uint32(c) >> uint64(d)) 12915 v.AddArg(x) 12916 return true 12917 } 12918 // match: (XORshiftRL [c] (SLLconst x [32-c]) x) 12919 // cond: 12920 // result: (SRRconst [ c] x) 12921 for { 12922 c := v.AuxInt 12923 v_0 := v.Args[0] 12924 if v_0.Op != OpARMSLLconst { 12925 break 12926 } 12927 if v_0.AuxInt != 32-c { 12928 break 12929 } 12930 x := v_0.Args[0] 12931 if x != v.Args[1] { 12932 break 12933 } 12934 v.reset(OpARMSRRconst) 12935 v.AuxInt = c 12936 v.AddArg(x) 12937 return true 12938 } 12939 // match: (XORshiftRL x (SRLconst x [c]) [d]) 12940 // cond: c==d 12941 // result: (MOVWconst [0]) 12942 for { 12943 d := v.AuxInt 12944 x := v.Args[0] 12945 v_1 := v.Args[1] 12946 if v_1.Op != OpARMSRLconst { 12947 break 12948 } 12949 c := v_1.AuxInt 12950 if x != v_1.Args[0] { 12951 break 12952 } 12953 if !(c == d) { 12954 break 12955 } 12956 v.reset(OpARMMOVWconst) 12957 v.AuxInt = 0 12958 return true 12959 } 12960 return false 12961 } 12962 func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { 12963 b := v.Block 12964 _ = b 12965 // match: (XORshiftRLreg (MOVWconst [c]) x y) 12966 // cond: 12967 // result: (XORconst [c] (SRL <x.Type> x y)) 12968 for { 12969 v_0 := v.Args[0] 12970 if v_0.Op != OpARMMOVWconst { 12971 break 12972 } 12973 c := v_0.AuxInt 12974 x := v.Args[1] 12975 y := v.Args[2] 12976 v.reset(OpARMXORconst) 12977 v.AuxInt = c 12978 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12979 v0.AddArg(x) 12980 v0.AddArg(y) 12981 v.AddArg(v0) 12982 return true 12983 } 12984 // match: (XORshiftRLreg x y (MOVWconst [c])) 12985 // cond: 12986 // result: (XORshiftRL x y [c]) 12987 for { 12988 x := v.Args[0] 12989 y := v.Args[1] 12990 v_2 := v.Args[2] 12991 if v_2.Op != OpARMMOVWconst { 12992 break 12993 } 12994 c := v_2.AuxInt 12995 v.reset(OpARMXORshiftRL) 12996 v.AuxInt = c 12997 v.AddArg(x) 12998 v.AddArg(y) 12999 return true 13000 } 13001 return false 13002 } 13003 func rewriteValueARM_OpARMXORshiftRR_0(v *Value) bool { 13004 b := v.Block 13005 _ = b 13006 // match: (XORshiftRR (MOVWconst [c]) x [d]) 13007 // cond: 13008 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 13009 for { 13010 d := v.AuxInt 13011 v_0 := v.Args[0] 13012 if v_0.Op != OpARMMOVWconst { 13013 break 13014 } 13015 c := v_0.AuxInt 13016 x := v.Args[1] 13017 v.reset(OpARMXORconst) 13018 v.AuxInt = c 13019 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 13020 v0.AuxInt = d 13021 v0.AddArg(x) 13022 v.AddArg(v0) 13023 return true 13024 } 13025 // match: (XORshiftRR x (MOVWconst [c]) [d]) 13026 // cond: 13027 // result: (XORconst x [int64(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 13028 for { 13029 d := v.AuxInt 13030 x := v.Args[0] 13031 v_1 := v.Args[1] 13032 if v_1.Op != OpARMMOVWconst { 13033 break 13034 } 13035 c := v_1.AuxInt 13036 v.reset(OpARMXORconst) 13037 v.AuxInt = int64(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)) 13038 v.AddArg(x) 13039 return true 13040 } 13041 return false 13042 } 13043 func rewriteValueARM_OpAdd16_0(v *Value) bool { 13044 // match: (Add16 x y) 13045 // cond: 13046 // result: (ADD x y) 13047 for { 13048 x := v.Args[0] 13049 y := v.Args[1] 13050 v.reset(OpARMADD) 13051 v.AddArg(x) 13052 v.AddArg(y) 13053 return true 13054 } 13055 } 13056 func rewriteValueARM_OpAdd32_0(v *Value) bool { 13057 // match: (Add32 x y) 13058 // cond: 13059 // result: (ADD x y) 13060 for { 13061 x := v.Args[0] 13062 y := v.Args[1] 13063 v.reset(OpARMADD) 13064 v.AddArg(x) 13065 v.AddArg(y) 13066 return true 13067 } 13068 } 13069 func rewriteValueARM_OpAdd32F_0(v *Value) bool { 13070 // match: (Add32F x y) 13071 // cond: 13072 // result: (ADDF x y) 13073 for { 13074 x := v.Args[0] 13075 y := v.Args[1] 13076 v.reset(OpARMADDF) 13077 v.AddArg(x) 13078 v.AddArg(y) 13079 return true 13080 } 13081 } 13082 func rewriteValueARM_OpAdd32carry_0(v *Value) bool { 13083 // match: (Add32carry x y) 13084 // cond: 13085 // result: (ADDS x y) 13086 for { 13087 x := v.Args[0] 13088 y := v.Args[1] 13089 v.reset(OpARMADDS) 13090 v.AddArg(x) 13091 v.AddArg(y) 13092 return true 13093 } 13094 } 13095 func rewriteValueARM_OpAdd32withcarry_0(v *Value) bool { 13096 // match: (Add32withcarry x y c) 13097 // cond: 13098 // result: (ADC x y c) 13099 for { 13100 x := v.Args[0] 13101 y := v.Args[1] 13102 c := v.Args[2] 13103 v.reset(OpARMADC) 13104 v.AddArg(x) 13105 v.AddArg(y) 13106 v.AddArg(c) 13107 return true 13108 } 13109 } 13110 func rewriteValueARM_OpAdd64F_0(v *Value) bool { 13111 // match: (Add64F x y) 13112 // cond: 13113 // result: (ADDD x y) 13114 for { 13115 x := v.Args[0] 13116 y := v.Args[1] 13117 v.reset(OpARMADDD) 13118 v.AddArg(x) 13119 v.AddArg(y) 13120 return true 13121 } 13122 } 13123 func rewriteValueARM_OpAdd8_0(v *Value) bool { 13124 // match: (Add8 x y) 13125 // cond: 13126 // result: (ADD x y) 13127 for { 13128 x := v.Args[0] 13129 y := v.Args[1] 13130 v.reset(OpARMADD) 13131 v.AddArg(x) 13132 v.AddArg(y) 13133 return true 13134 } 13135 } 13136 func rewriteValueARM_OpAddPtr_0(v *Value) bool { 13137 // match: (AddPtr x y) 13138 // cond: 13139 // result: (ADD x y) 13140 for { 13141 x := v.Args[0] 13142 y := v.Args[1] 13143 v.reset(OpARMADD) 13144 v.AddArg(x) 13145 v.AddArg(y) 13146 return true 13147 } 13148 } 13149 func rewriteValueARM_OpAddr_0(v *Value) bool { 13150 // match: (Addr {sym} base) 13151 // cond: 13152 // result: (MOVWaddr {sym} base) 13153 for { 13154 sym := v.Aux 13155 base := v.Args[0] 13156 v.reset(OpARMMOVWaddr) 13157 v.Aux = sym 13158 v.AddArg(base) 13159 return true 13160 } 13161 } 13162 func rewriteValueARM_OpAnd16_0(v *Value) bool { 13163 // match: (And16 x y) 13164 // cond: 13165 // result: (AND x y) 13166 for { 13167 x := v.Args[0] 13168 y := v.Args[1] 13169 v.reset(OpARMAND) 13170 v.AddArg(x) 13171 v.AddArg(y) 13172 return true 13173 } 13174 } 13175 func rewriteValueARM_OpAnd32_0(v *Value) bool { 13176 // match: (And32 x y) 13177 // cond: 13178 // result: (AND x y) 13179 for { 13180 x := v.Args[0] 13181 y := v.Args[1] 13182 v.reset(OpARMAND) 13183 v.AddArg(x) 13184 v.AddArg(y) 13185 return true 13186 } 13187 } 13188 func rewriteValueARM_OpAnd8_0(v *Value) bool { 13189 // match: (And8 x y) 13190 // cond: 13191 // result: (AND x y) 13192 for { 13193 x := v.Args[0] 13194 y := v.Args[1] 13195 v.reset(OpARMAND) 13196 v.AddArg(x) 13197 v.AddArg(y) 13198 return true 13199 } 13200 } 13201 func rewriteValueARM_OpAndB_0(v *Value) bool { 13202 // match: (AndB x y) 13203 // cond: 13204 // result: (AND x y) 13205 for { 13206 x := v.Args[0] 13207 y := v.Args[1] 13208 v.reset(OpARMAND) 13209 v.AddArg(x) 13210 v.AddArg(y) 13211 return true 13212 } 13213 } 13214 func rewriteValueARM_OpAvg32u_0(v *Value) bool { 13215 b := v.Block 13216 _ = b 13217 // match: (Avg32u <t> x y) 13218 // cond: 13219 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 13220 for { 13221 t := v.Type 13222 x := v.Args[0] 13223 y := v.Args[1] 13224 v.reset(OpARMADD) 13225 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13226 v0.AuxInt = 1 13227 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 13228 v1.AddArg(x) 13229 v1.AddArg(y) 13230 v0.AddArg(v1) 13231 v.AddArg(v0) 13232 v.AddArg(y) 13233 return true 13234 } 13235 } 13236 func rewriteValueARM_OpBitLen32_0(v *Value) bool { 13237 b := v.Block 13238 _ = b 13239 // match: (BitLen32 <t> x) 13240 // cond: 13241 // result: (RSBconst [32] (CLZ <t> x)) 13242 for { 13243 t := v.Type 13244 x := v.Args[0] 13245 v.reset(OpARMRSBconst) 13246 v.AuxInt = 32 13247 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13248 v0.AddArg(x) 13249 v.AddArg(v0) 13250 return true 13251 } 13252 } 13253 func rewriteValueARM_OpBswap32_0(v *Value) bool { 13254 b := v.Block 13255 _ = b 13256 // match: (Bswap32 <t> x) 13257 // cond: objabi.GOARM==5 13258 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 13259 for { 13260 t := v.Type 13261 x := v.Args[0] 13262 if !(objabi.GOARM == 5) { 13263 break 13264 } 13265 v.reset(OpARMXOR) 13266 v.Type = t 13267 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 13268 v0.AuxInt = 8 13269 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 13270 v1.AuxInt = 0xff0000 13271 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 13272 v2.AddArg(x) 13273 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13274 v3.AuxInt = 16 13275 v3.AddArg(x) 13276 v2.AddArg(v3) 13277 v1.AddArg(v2) 13278 v0.AddArg(v1) 13279 v.AddArg(v0) 13280 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 13281 v4.AuxInt = 8 13282 v4.AddArg(x) 13283 v.AddArg(v4) 13284 return true 13285 } 13286 // match: (Bswap32 x) 13287 // cond: objabi.GOARM>=6 13288 // result: (REV x) 13289 for { 13290 x := v.Args[0] 13291 if !(objabi.GOARM >= 6) { 13292 break 13293 } 13294 v.reset(OpARMREV) 13295 v.AddArg(x) 13296 return true 13297 } 13298 return false 13299 } 13300 func rewriteValueARM_OpClosureCall_0(v *Value) bool { 13301 // match: (ClosureCall [argwid] entry closure mem) 13302 // cond: 13303 // result: (CALLclosure [argwid] entry closure mem) 13304 for { 13305 argwid := v.AuxInt 13306 entry := v.Args[0] 13307 closure := v.Args[1] 13308 mem := v.Args[2] 13309 v.reset(OpARMCALLclosure) 13310 v.AuxInt = argwid 13311 v.AddArg(entry) 13312 v.AddArg(closure) 13313 v.AddArg(mem) 13314 return true 13315 } 13316 } 13317 func rewriteValueARM_OpCom16_0(v *Value) bool { 13318 // match: (Com16 x) 13319 // cond: 13320 // result: (MVN x) 13321 for { 13322 x := v.Args[0] 13323 v.reset(OpARMMVN) 13324 v.AddArg(x) 13325 return true 13326 } 13327 } 13328 func rewriteValueARM_OpCom32_0(v *Value) bool { 13329 // match: (Com32 x) 13330 // cond: 13331 // result: (MVN x) 13332 for { 13333 x := v.Args[0] 13334 v.reset(OpARMMVN) 13335 v.AddArg(x) 13336 return true 13337 } 13338 } 13339 func rewriteValueARM_OpCom8_0(v *Value) bool { 13340 // match: (Com8 x) 13341 // cond: 13342 // result: (MVN x) 13343 for { 13344 x := v.Args[0] 13345 v.reset(OpARMMVN) 13346 v.AddArg(x) 13347 return true 13348 } 13349 } 13350 func rewriteValueARM_OpConst16_0(v *Value) bool { 13351 // match: (Const16 [val]) 13352 // cond: 13353 // result: (MOVWconst [val]) 13354 for { 13355 val := v.AuxInt 13356 v.reset(OpARMMOVWconst) 13357 v.AuxInt = val 13358 return true 13359 } 13360 } 13361 func rewriteValueARM_OpConst32_0(v *Value) bool { 13362 // match: (Const32 [val]) 13363 // cond: 13364 // result: (MOVWconst [val]) 13365 for { 13366 val := v.AuxInt 13367 v.reset(OpARMMOVWconst) 13368 v.AuxInt = val 13369 return true 13370 } 13371 } 13372 func rewriteValueARM_OpConst32F_0(v *Value) bool { 13373 // match: (Const32F [val]) 13374 // cond: 13375 // result: (MOVFconst [val]) 13376 for { 13377 val := v.AuxInt 13378 v.reset(OpARMMOVFconst) 13379 v.AuxInt = val 13380 return true 13381 } 13382 } 13383 func rewriteValueARM_OpConst64F_0(v *Value) bool { 13384 // match: (Const64F [val]) 13385 // cond: 13386 // result: (MOVDconst [val]) 13387 for { 13388 val := v.AuxInt 13389 v.reset(OpARMMOVDconst) 13390 v.AuxInt = val 13391 return true 13392 } 13393 } 13394 func rewriteValueARM_OpConst8_0(v *Value) bool { 13395 // match: (Const8 [val]) 13396 // cond: 13397 // result: (MOVWconst [val]) 13398 for { 13399 val := v.AuxInt 13400 v.reset(OpARMMOVWconst) 13401 v.AuxInt = val 13402 return true 13403 } 13404 } 13405 func rewriteValueARM_OpConstBool_0(v *Value) bool { 13406 // match: (ConstBool [b]) 13407 // cond: 13408 // result: (MOVWconst [b]) 13409 for { 13410 b := v.AuxInt 13411 v.reset(OpARMMOVWconst) 13412 v.AuxInt = b 13413 return true 13414 } 13415 } 13416 func rewriteValueARM_OpConstNil_0(v *Value) bool { 13417 // match: (ConstNil) 13418 // cond: 13419 // result: (MOVWconst [0]) 13420 for { 13421 v.reset(OpARMMOVWconst) 13422 v.AuxInt = 0 13423 return true 13424 } 13425 } 13426 func rewriteValueARM_OpConvert_0(v *Value) bool { 13427 // match: (Convert x mem) 13428 // cond: 13429 // result: (MOVWconvert x mem) 13430 for { 13431 x := v.Args[0] 13432 mem := v.Args[1] 13433 v.reset(OpARMMOVWconvert) 13434 v.AddArg(x) 13435 v.AddArg(mem) 13436 return true 13437 } 13438 } 13439 func rewriteValueARM_OpCtz32_0(v *Value) bool { 13440 b := v.Block 13441 _ = b 13442 // match: (Ctz32 <t> x) 13443 // cond: objabi.GOARM<=6 13444 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 13445 for { 13446 t := v.Type 13447 x := v.Args[0] 13448 if !(objabi.GOARM <= 6) { 13449 break 13450 } 13451 v.reset(OpARMRSBconst) 13452 v.AuxInt = 32 13453 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 13454 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 13455 v1.AuxInt = 1 13456 v2 := b.NewValue0(v.Pos, OpARMAND, t) 13457 v2.AddArg(x) 13458 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 13459 v3.AuxInt = 0 13460 v3.AddArg(x) 13461 v2.AddArg(v3) 13462 v1.AddArg(v2) 13463 v0.AddArg(v1) 13464 v.AddArg(v0) 13465 return true 13466 } 13467 // match: (Ctz32 <t> x) 13468 // cond: objabi.GOARM==7 13469 // result: (CLZ <t> (RBIT <t> x)) 13470 for { 13471 t := v.Type 13472 x := v.Args[0] 13473 if !(objabi.GOARM == 7) { 13474 break 13475 } 13476 v.reset(OpARMCLZ) 13477 v.Type = t 13478 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 13479 v0.AddArg(x) 13480 v.AddArg(v0) 13481 return true 13482 } 13483 return false 13484 } 13485 func rewriteValueARM_OpCvt32Fto32_0(v *Value) bool { 13486 // match: (Cvt32Fto32 x) 13487 // cond: 13488 // result: (MOVFW x) 13489 for { 13490 x := v.Args[0] 13491 v.reset(OpARMMOVFW) 13492 v.AddArg(x) 13493 return true 13494 } 13495 } 13496 func rewriteValueARM_OpCvt32Fto32U_0(v *Value) bool { 13497 // match: (Cvt32Fto32U x) 13498 // cond: 13499 // result: (MOVFWU x) 13500 for { 13501 x := v.Args[0] 13502 v.reset(OpARMMOVFWU) 13503 v.AddArg(x) 13504 return true 13505 } 13506 } 13507 func rewriteValueARM_OpCvt32Fto64F_0(v *Value) bool { 13508 // match: (Cvt32Fto64F x) 13509 // cond: 13510 // result: (MOVFD x) 13511 for { 13512 x := v.Args[0] 13513 v.reset(OpARMMOVFD) 13514 v.AddArg(x) 13515 return true 13516 } 13517 } 13518 func rewriteValueARM_OpCvt32Uto32F_0(v *Value) bool { 13519 // match: (Cvt32Uto32F x) 13520 // cond: 13521 // result: (MOVWUF x) 13522 for { 13523 x := v.Args[0] 13524 v.reset(OpARMMOVWUF) 13525 v.AddArg(x) 13526 return true 13527 } 13528 } 13529 func rewriteValueARM_OpCvt32Uto64F_0(v *Value) bool { 13530 // match: (Cvt32Uto64F x) 13531 // cond: 13532 // result: (MOVWUD x) 13533 for { 13534 x := v.Args[0] 13535 v.reset(OpARMMOVWUD) 13536 v.AddArg(x) 13537 return true 13538 } 13539 } 13540 func rewriteValueARM_OpCvt32to32F_0(v *Value) bool { 13541 // match: (Cvt32to32F x) 13542 // cond: 13543 // result: (MOVWF x) 13544 for { 13545 x := v.Args[0] 13546 v.reset(OpARMMOVWF) 13547 v.AddArg(x) 13548 return true 13549 } 13550 } 13551 func rewriteValueARM_OpCvt32to64F_0(v *Value) bool { 13552 // match: (Cvt32to64F x) 13553 // cond: 13554 // result: (MOVWD x) 13555 for { 13556 x := v.Args[0] 13557 v.reset(OpARMMOVWD) 13558 v.AddArg(x) 13559 return true 13560 } 13561 } 13562 func rewriteValueARM_OpCvt64Fto32_0(v *Value) bool { 13563 // match: (Cvt64Fto32 x) 13564 // cond: 13565 // result: (MOVDW x) 13566 for { 13567 x := v.Args[0] 13568 v.reset(OpARMMOVDW) 13569 v.AddArg(x) 13570 return true 13571 } 13572 } 13573 func rewriteValueARM_OpCvt64Fto32F_0(v *Value) bool { 13574 // match: (Cvt64Fto32F x) 13575 // cond: 13576 // result: (MOVDF x) 13577 for { 13578 x := v.Args[0] 13579 v.reset(OpARMMOVDF) 13580 v.AddArg(x) 13581 return true 13582 } 13583 } 13584 func rewriteValueARM_OpCvt64Fto32U_0(v *Value) bool { 13585 // match: (Cvt64Fto32U x) 13586 // cond: 13587 // result: (MOVDWU x) 13588 for { 13589 x := v.Args[0] 13590 v.reset(OpARMMOVDWU) 13591 v.AddArg(x) 13592 return true 13593 } 13594 } 13595 func rewriteValueARM_OpDiv16_0(v *Value) bool { 13596 b := v.Block 13597 _ = b 13598 types := &b.Func.Config.Types 13599 _ = types 13600 // match: (Div16 x y) 13601 // cond: 13602 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 13603 for { 13604 x := v.Args[0] 13605 y := v.Args[1] 13606 v.reset(OpDiv32) 13607 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 13608 v0.AddArg(x) 13609 v.AddArg(v0) 13610 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 13611 v1.AddArg(y) 13612 v.AddArg(v1) 13613 return true 13614 } 13615 } 13616 func rewriteValueARM_OpDiv16u_0(v *Value) bool { 13617 b := v.Block 13618 _ = b 13619 types := &b.Func.Config.Types 13620 _ = types 13621 // match: (Div16u x y) 13622 // cond: 13623 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 13624 for { 13625 x := v.Args[0] 13626 y := v.Args[1] 13627 v.reset(OpDiv32u) 13628 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13629 v0.AddArg(x) 13630 v.AddArg(v0) 13631 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13632 v1.AddArg(y) 13633 v.AddArg(v1) 13634 return true 13635 } 13636 } 13637 func rewriteValueARM_OpDiv32_0(v *Value) bool { 13638 b := v.Block 13639 _ = b 13640 types := &b.Func.Config.Types 13641 _ = types 13642 // match: (Div32 x y) 13643 // cond: 13644 // result: (SUB (XOR <types.UInt32> (Select0 <types.UInt32> (CALLudiv (SUB <types.UInt32> (XOR x <types.UInt32> (Signmask x)) (Signmask x)) (SUB <types.UInt32> (XOR y <types.UInt32> (Signmask y)) (Signmask y)))) (Signmask (XOR <types.UInt32> x y))) (Signmask (XOR <types.UInt32> x y))) 13645 for { 13646 x := v.Args[0] 13647 y := v.Args[1] 13648 v.reset(OpARMSUB) 13649 v0 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13650 v1 := b.NewValue0(v.Pos, OpSelect0, types.UInt32) 13651 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, MakeTuple(types.UInt32, types.UInt32)) 13652 v3 := b.NewValue0(v.Pos, OpARMSUB, types.UInt32) 13653 v4 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13654 v4.AddArg(x) 13655 v5 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13656 v5.AddArg(x) 13657 v4.AddArg(v5) 13658 v3.AddArg(v4) 13659 v6 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13660 v6.AddArg(x) 13661 v3.AddArg(v6) 13662 v2.AddArg(v3) 13663 v7 := b.NewValue0(v.Pos, OpARMSUB, types.UInt32) 13664 v8 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13665 v8.AddArg(y) 13666 v9 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13667 v9.AddArg(y) 13668 v8.AddArg(v9) 13669 v7.AddArg(v8) 13670 v10 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13671 v10.AddArg(y) 13672 v7.AddArg(v10) 13673 v2.AddArg(v7) 13674 v1.AddArg(v2) 13675 v0.AddArg(v1) 13676 v11 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13677 v12 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13678 v12.AddArg(x) 13679 v12.AddArg(y) 13680 v11.AddArg(v12) 13681 v0.AddArg(v11) 13682 v.AddArg(v0) 13683 v13 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 13684 v14 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 13685 v14.AddArg(x) 13686 v14.AddArg(y) 13687 v13.AddArg(v14) 13688 v.AddArg(v13) 13689 return true 13690 } 13691 } 13692 func rewriteValueARM_OpDiv32F_0(v *Value) bool { 13693 // match: (Div32F x y) 13694 // cond: 13695 // result: (DIVF x y) 13696 for { 13697 x := v.Args[0] 13698 y := v.Args[1] 13699 v.reset(OpARMDIVF) 13700 v.AddArg(x) 13701 v.AddArg(y) 13702 return true 13703 } 13704 } 13705 func rewriteValueARM_OpDiv32u_0(v *Value) bool { 13706 b := v.Block 13707 _ = b 13708 types := &b.Func.Config.Types 13709 _ = types 13710 // match: (Div32u x y) 13711 // cond: 13712 // result: (Select0 <types.UInt32> (CALLudiv x y)) 13713 for { 13714 x := v.Args[0] 13715 y := v.Args[1] 13716 v.reset(OpSelect0) 13717 v.Type = types.UInt32 13718 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, MakeTuple(types.UInt32, types.UInt32)) 13719 v0.AddArg(x) 13720 v0.AddArg(y) 13721 v.AddArg(v0) 13722 return true 13723 } 13724 } 13725 func rewriteValueARM_OpDiv64F_0(v *Value) bool { 13726 // match: (Div64F x y) 13727 // cond: 13728 // result: (DIVD x y) 13729 for { 13730 x := v.Args[0] 13731 y := v.Args[1] 13732 v.reset(OpARMDIVD) 13733 v.AddArg(x) 13734 v.AddArg(y) 13735 return true 13736 } 13737 } 13738 func rewriteValueARM_OpDiv8_0(v *Value) bool { 13739 b := v.Block 13740 _ = b 13741 types := &b.Func.Config.Types 13742 _ = types 13743 // match: (Div8 x y) 13744 // cond: 13745 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 13746 for { 13747 x := v.Args[0] 13748 y := v.Args[1] 13749 v.reset(OpDiv32) 13750 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 13751 v0.AddArg(x) 13752 v.AddArg(v0) 13753 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 13754 v1.AddArg(y) 13755 v.AddArg(v1) 13756 return true 13757 } 13758 } 13759 func rewriteValueARM_OpDiv8u_0(v *Value) bool { 13760 b := v.Block 13761 _ = b 13762 types := &b.Func.Config.Types 13763 _ = types 13764 // match: (Div8u x y) 13765 // cond: 13766 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 13767 for { 13768 x := v.Args[0] 13769 y := v.Args[1] 13770 v.reset(OpDiv32u) 13771 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13772 v0.AddArg(x) 13773 v.AddArg(v0) 13774 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13775 v1.AddArg(y) 13776 v.AddArg(v1) 13777 return true 13778 } 13779 } 13780 func rewriteValueARM_OpEq16_0(v *Value) bool { 13781 b := v.Block 13782 _ = b 13783 types := &b.Func.Config.Types 13784 _ = types 13785 // match: (Eq16 x y) 13786 // cond: 13787 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13788 for { 13789 x := v.Args[0] 13790 y := v.Args[1] 13791 v.reset(OpARMEqual) 13792 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13793 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13794 v1.AddArg(x) 13795 v0.AddArg(v1) 13796 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13797 v2.AddArg(y) 13798 v0.AddArg(v2) 13799 v.AddArg(v0) 13800 return true 13801 } 13802 } 13803 func rewriteValueARM_OpEq32_0(v *Value) bool { 13804 b := v.Block 13805 _ = b 13806 // match: (Eq32 x y) 13807 // cond: 13808 // result: (Equal (CMP x y)) 13809 for { 13810 x := v.Args[0] 13811 y := v.Args[1] 13812 v.reset(OpARMEqual) 13813 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13814 v0.AddArg(x) 13815 v0.AddArg(y) 13816 v.AddArg(v0) 13817 return true 13818 } 13819 } 13820 func rewriteValueARM_OpEq32F_0(v *Value) bool { 13821 b := v.Block 13822 _ = b 13823 // match: (Eq32F x y) 13824 // cond: 13825 // result: (Equal (CMPF x y)) 13826 for { 13827 x := v.Args[0] 13828 y := v.Args[1] 13829 v.reset(OpARMEqual) 13830 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 13831 v0.AddArg(x) 13832 v0.AddArg(y) 13833 v.AddArg(v0) 13834 return true 13835 } 13836 } 13837 func rewriteValueARM_OpEq64F_0(v *Value) bool { 13838 b := v.Block 13839 _ = b 13840 // match: (Eq64F x y) 13841 // cond: 13842 // result: (Equal (CMPD x y)) 13843 for { 13844 x := v.Args[0] 13845 y := v.Args[1] 13846 v.reset(OpARMEqual) 13847 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 13848 v0.AddArg(x) 13849 v0.AddArg(y) 13850 v.AddArg(v0) 13851 return true 13852 } 13853 } 13854 func rewriteValueARM_OpEq8_0(v *Value) bool { 13855 b := v.Block 13856 _ = b 13857 types := &b.Func.Config.Types 13858 _ = types 13859 // match: (Eq8 x y) 13860 // cond: 13861 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 13862 for { 13863 x := v.Args[0] 13864 y := v.Args[1] 13865 v.reset(OpARMEqual) 13866 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13867 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13868 v1.AddArg(x) 13869 v0.AddArg(v1) 13870 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 13871 v2.AddArg(y) 13872 v0.AddArg(v2) 13873 v.AddArg(v0) 13874 return true 13875 } 13876 } 13877 func rewriteValueARM_OpEqB_0(v *Value) bool { 13878 b := v.Block 13879 _ = b 13880 types := &b.Func.Config.Types 13881 _ = types 13882 // match: (EqB x y) 13883 // cond: 13884 // result: (XORconst [1] (XOR <types.Bool> x y)) 13885 for { 13886 x := v.Args[0] 13887 y := v.Args[1] 13888 v.reset(OpARMXORconst) 13889 v.AuxInt = 1 13890 v0 := b.NewValue0(v.Pos, OpARMXOR, types.Bool) 13891 v0.AddArg(x) 13892 v0.AddArg(y) 13893 v.AddArg(v0) 13894 return true 13895 } 13896 } 13897 func rewriteValueARM_OpEqPtr_0(v *Value) bool { 13898 b := v.Block 13899 _ = b 13900 // match: (EqPtr x y) 13901 // cond: 13902 // result: (Equal (CMP x y)) 13903 for { 13904 x := v.Args[0] 13905 y := v.Args[1] 13906 v.reset(OpARMEqual) 13907 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13908 v0.AddArg(x) 13909 v0.AddArg(y) 13910 v.AddArg(v0) 13911 return true 13912 } 13913 } 13914 func rewriteValueARM_OpGeq16_0(v *Value) bool { 13915 b := v.Block 13916 _ = b 13917 types := &b.Func.Config.Types 13918 _ = types 13919 // match: (Geq16 x y) 13920 // cond: 13921 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 13922 for { 13923 x := v.Args[0] 13924 y := v.Args[1] 13925 v.reset(OpARMGreaterEqual) 13926 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13927 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 13928 v1.AddArg(x) 13929 v0.AddArg(v1) 13930 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 13931 v2.AddArg(y) 13932 v0.AddArg(v2) 13933 v.AddArg(v0) 13934 return true 13935 } 13936 } 13937 func rewriteValueARM_OpGeq16U_0(v *Value) bool { 13938 b := v.Block 13939 _ = b 13940 types := &b.Func.Config.Types 13941 _ = types 13942 // match: (Geq16U x y) 13943 // cond: 13944 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 13945 for { 13946 x := v.Args[0] 13947 y := v.Args[1] 13948 v.reset(OpARMGreaterEqualU) 13949 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13950 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13951 v1.AddArg(x) 13952 v0.AddArg(v1) 13953 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 13954 v2.AddArg(y) 13955 v0.AddArg(v2) 13956 v.AddArg(v0) 13957 return true 13958 } 13959 } 13960 func rewriteValueARM_OpGeq32_0(v *Value) bool { 13961 b := v.Block 13962 _ = b 13963 // match: (Geq32 x y) 13964 // cond: 13965 // result: (GreaterEqual (CMP x y)) 13966 for { 13967 x := v.Args[0] 13968 y := v.Args[1] 13969 v.reset(OpARMGreaterEqual) 13970 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 13971 v0.AddArg(x) 13972 v0.AddArg(y) 13973 v.AddArg(v0) 13974 return true 13975 } 13976 } 13977 func rewriteValueARM_OpGeq32F_0(v *Value) bool { 13978 b := v.Block 13979 _ = b 13980 // match: (Geq32F x y) 13981 // cond: 13982 // result: (GreaterEqual (CMPF x y)) 13983 for { 13984 x := v.Args[0] 13985 y := v.Args[1] 13986 v.reset(OpARMGreaterEqual) 13987 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 13988 v0.AddArg(x) 13989 v0.AddArg(y) 13990 v.AddArg(v0) 13991 return true 13992 } 13993 } 13994 func rewriteValueARM_OpGeq32U_0(v *Value) bool { 13995 b := v.Block 13996 _ = b 13997 // match: (Geq32U x y) 13998 // cond: 13999 // result: (GreaterEqualU (CMP x y)) 14000 for { 14001 x := v.Args[0] 14002 y := v.Args[1] 14003 v.reset(OpARMGreaterEqualU) 14004 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14005 v0.AddArg(x) 14006 v0.AddArg(y) 14007 v.AddArg(v0) 14008 return true 14009 } 14010 } 14011 func rewriteValueARM_OpGeq64F_0(v *Value) bool { 14012 b := v.Block 14013 _ = b 14014 // match: (Geq64F x y) 14015 // cond: 14016 // result: (GreaterEqual (CMPD x y)) 14017 for { 14018 x := v.Args[0] 14019 y := v.Args[1] 14020 v.reset(OpARMGreaterEqual) 14021 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14022 v0.AddArg(x) 14023 v0.AddArg(y) 14024 v.AddArg(v0) 14025 return true 14026 } 14027 } 14028 func rewriteValueARM_OpGeq8_0(v *Value) bool { 14029 b := v.Block 14030 _ = b 14031 types := &b.Func.Config.Types 14032 _ = types 14033 // match: (Geq8 x y) 14034 // cond: 14035 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 14036 for { 14037 x := v.Args[0] 14038 y := v.Args[1] 14039 v.reset(OpARMGreaterEqual) 14040 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14041 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14042 v1.AddArg(x) 14043 v0.AddArg(v1) 14044 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14045 v2.AddArg(y) 14046 v0.AddArg(v2) 14047 v.AddArg(v0) 14048 return true 14049 } 14050 } 14051 func rewriteValueARM_OpGeq8U_0(v *Value) bool { 14052 b := v.Block 14053 _ = b 14054 types := &b.Func.Config.Types 14055 _ = types 14056 // match: (Geq8U x y) 14057 // cond: 14058 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14059 for { 14060 x := v.Args[0] 14061 y := v.Args[1] 14062 v.reset(OpARMGreaterEqualU) 14063 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14064 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14065 v1.AddArg(x) 14066 v0.AddArg(v1) 14067 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14068 v2.AddArg(y) 14069 v0.AddArg(v2) 14070 v.AddArg(v0) 14071 return true 14072 } 14073 } 14074 func rewriteValueARM_OpGetClosurePtr_0(v *Value) bool { 14075 // match: (GetClosurePtr) 14076 // cond: 14077 // result: (LoweredGetClosurePtr) 14078 for { 14079 v.reset(OpARMLoweredGetClosurePtr) 14080 return true 14081 } 14082 } 14083 func rewriteValueARM_OpGreater16_0(v *Value) bool { 14084 b := v.Block 14085 _ = b 14086 types := &b.Func.Config.Types 14087 _ = types 14088 // match: (Greater16 x y) 14089 // cond: 14090 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 14091 for { 14092 x := v.Args[0] 14093 y := v.Args[1] 14094 v.reset(OpARMGreaterThan) 14095 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14096 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14097 v1.AddArg(x) 14098 v0.AddArg(v1) 14099 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14100 v2.AddArg(y) 14101 v0.AddArg(v2) 14102 v.AddArg(v0) 14103 return true 14104 } 14105 } 14106 func rewriteValueARM_OpGreater16U_0(v *Value) bool { 14107 b := v.Block 14108 _ = b 14109 types := &b.Func.Config.Types 14110 _ = types 14111 // match: (Greater16U x y) 14112 // cond: 14113 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14114 for { 14115 x := v.Args[0] 14116 y := v.Args[1] 14117 v.reset(OpARMGreaterThanU) 14118 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14119 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14120 v1.AddArg(x) 14121 v0.AddArg(v1) 14122 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14123 v2.AddArg(y) 14124 v0.AddArg(v2) 14125 v.AddArg(v0) 14126 return true 14127 } 14128 } 14129 func rewriteValueARM_OpGreater32_0(v *Value) bool { 14130 b := v.Block 14131 _ = b 14132 // match: (Greater32 x y) 14133 // cond: 14134 // result: (GreaterThan (CMP x y)) 14135 for { 14136 x := v.Args[0] 14137 y := v.Args[1] 14138 v.reset(OpARMGreaterThan) 14139 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14140 v0.AddArg(x) 14141 v0.AddArg(y) 14142 v.AddArg(v0) 14143 return true 14144 } 14145 } 14146 func rewriteValueARM_OpGreater32F_0(v *Value) bool { 14147 b := v.Block 14148 _ = b 14149 // match: (Greater32F x y) 14150 // cond: 14151 // result: (GreaterThan (CMPF x y)) 14152 for { 14153 x := v.Args[0] 14154 y := v.Args[1] 14155 v.reset(OpARMGreaterThan) 14156 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 14157 v0.AddArg(x) 14158 v0.AddArg(y) 14159 v.AddArg(v0) 14160 return true 14161 } 14162 } 14163 func rewriteValueARM_OpGreater32U_0(v *Value) bool { 14164 b := v.Block 14165 _ = b 14166 // match: (Greater32U x y) 14167 // cond: 14168 // result: (GreaterThanU (CMP x y)) 14169 for { 14170 x := v.Args[0] 14171 y := v.Args[1] 14172 v.reset(OpARMGreaterThanU) 14173 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14174 v0.AddArg(x) 14175 v0.AddArg(y) 14176 v.AddArg(v0) 14177 return true 14178 } 14179 } 14180 func rewriteValueARM_OpGreater64F_0(v *Value) bool { 14181 b := v.Block 14182 _ = b 14183 // match: (Greater64F x y) 14184 // cond: 14185 // result: (GreaterThan (CMPD x y)) 14186 for { 14187 x := v.Args[0] 14188 y := v.Args[1] 14189 v.reset(OpARMGreaterThan) 14190 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14191 v0.AddArg(x) 14192 v0.AddArg(y) 14193 v.AddArg(v0) 14194 return true 14195 } 14196 } 14197 func rewriteValueARM_OpGreater8_0(v *Value) bool { 14198 b := v.Block 14199 _ = b 14200 types := &b.Func.Config.Types 14201 _ = types 14202 // match: (Greater8 x y) 14203 // cond: 14204 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 14205 for { 14206 x := v.Args[0] 14207 y := v.Args[1] 14208 v.reset(OpARMGreaterThan) 14209 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14210 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14211 v1.AddArg(x) 14212 v0.AddArg(v1) 14213 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14214 v2.AddArg(y) 14215 v0.AddArg(v2) 14216 v.AddArg(v0) 14217 return true 14218 } 14219 } 14220 func rewriteValueARM_OpGreater8U_0(v *Value) bool { 14221 b := v.Block 14222 _ = b 14223 types := &b.Func.Config.Types 14224 _ = types 14225 // match: (Greater8U x y) 14226 // cond: 14227 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14228 for { 14229 x := v.Args[0] 14230 y := v.Args[1] 14231 v.reset(OpARMGreaterThanU) 14232 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14233 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14234 v1.AddArg(x) 14235 v0.AddArg(v1) 14236 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14237 v2.AddArg(y) 14238 v0.AddArg(v2) 14239 v.AddArg(v0) 14240 return true 14241 } 14242 } 14243 func rewriteValueARM_OpHmul32_0(v *Value) bool { 14244 // match: (Hmul32 x y) 14245 // cond: 14246 // result: (HMUL x y) 14247 for { 14248 x := v.Args[0] 14249 y := v.Args[1] 14250 v.reset(OpARMHMUL) 14251 v.AddArg(x) 14252 v.AddArg(y) 14253 return true 14254 } 14255 } 14256 func rewriteValueARM_OpHmul32u_0(v *Value) bool { 14257 // match: (Hmul32u x y) 14258 // cond: 14259 // result: (HMULU x y) 14260 for { 14261 x := v.Args[0] 14262 y := v.Args[1] 14263 v.reset(OpARMHMULU) 14264 v.AddArg(x) 14265 v.AddArg(y) 14266 return true 14267 } 14268 } 14269 func rewriteValueARM_OpInterCall_0(v *Value) bool { 14270 // match: (InterCall [argwid] entry mem) 14271 // cond: 14272 // result: (CALLinter [argwid] entry mem) 14273 for { 14274 argwid := v.AuxInt 14275 entry := v.Args[0] 14276 mem := v.Args[1] 14277 v.reset(OpARMCALLinter) 14278 v.AuxInt = argwid 14279 v.AddArg(entry) 14280 v.AddArg(mem) 14281 return true 14282 } 14283 } 14284 func rewriteValueARM_OpIsInBounds_0(v *Value) bool { 14285 b := v.Block 14286 _ = b 14287 // match: (IsInBounds idx len) 14288 // cond: 14289 // result: (LessThanU (CMP idx len)) 14290 for { 14291 idx := v.Args[0] 14292 len := v.Args[1] 14293 v.reset(OpARMLessThanU) 14294 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14295 v0.AddArg(idx) 14296 v0.AddArg(len) 14297 v.AddArg(v0) 14298 return true 14299 } 14300 } 14301 func rewriteValueARM_OpIsNonNil_0(v *Value) bool { 14302 b := v.Block 14303 _ = b 14304 // match: (IsNonNil ptr) 14305 // cond: 14306 // result: (NotEqual (CMPconst [0] ptr)) 14307 for { 14308 ptr := v.Args[0] 14309 v.reset(OpARMNotEqual) 14310 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14311 v0.AuxInt = 0 14312 v0.AddArg(ptr) 14313 v.AddArg(v0) 14314 return true 14315 } 14316 } 14317 func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { 14318 b := v.Block 14319 _ = b 14320 // match: (IsSliceInBounds idx len) 14321 // cond: 14322 // result: (LessEqualU (CMP idx len)) 14323 for { 14324 idx := v.Args[0] 14325 len := v.Args[1] 14326 v.reset(OpARMLessEqualU) 14327 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14328 v0.AddArg(idx) 14329 v0.AddArg(len) 14330 v.AddArg(v0) 14331 return true 14332 } 14333 } 14334 func rewriteValueARM_OpLeq16_0(v *Value) bool { 14335 b := v.Block 14336 _ = b 14337 types := &b.Func.Config.Types 14338 _ = types 14339 // match: (Leq16 x y) 14340 // cond: 14341 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 14342 for { 14343 x := v.Args[0] 14344 y := v.Args[1] 14345 v.reset(OpARMLessEqual) 14346 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14347 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14348 v1.AddArg(x) 14349 v0.AddArg(v1) 14350 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14351 v2.AddArg(y) 14352 v0.AddArg(v2) 14353 v.AddArg(v0) 14354 return true 14355 } 14356 } 14357 func rewriteValueARM_OpLeq16U_0(v *Value) bool { 14358 b := v.Block 14359 _ = b 14360 types := &b.Func.Config.Types 14361 _ = types 14362 // match: (Leq16U x y) 14363 // cond: 14364 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14365 for { 14366 x := v.Args[0] 14367 y := v.Args[1] 14368 v.reset(OpARMLessEqualU) 14369 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14370 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14371 v1.AddArg(x) 14372 v0.AddArg(v1) 14373 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14374 v2.AddArg(y) 14375 v0.AddArg(v2) 14376 v.AddArg(v0) 14377 return true 14378 } 14379 } 14380 func rewriteValueARM_OpLeq32_0(v *Value) bool { 14381 b := v.Block 14382 _ = b 14383 // match: (Leq32 x y) 14384 // cond: 14385 // result: (LessEqual (CMP x y)) 14386 for { 14387 x := v.Args[0] 14388 y := v.Args[1] 14389 v.reset(OpARMLessEqual) 14390 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14391 v0.AddArg(x) 14392 v0.AddArg(y) 14393 v.AddArg(v0) 14394 return true 14395 } 14396 } 14397 func rewriteValueARM_OpLeq32F_0(v *Value) bool { 14398 b := v.Block 14399 _ = b 14400 // match: (Leq32F x y) 14401 // cond: 14402 // result: (GreaterEqual (CMPF y x)) 14403 for { 14404 x := v.Args[0] 14405 y := v.Args[1] 14406 v.reset(OpARMGreaterEqual) 14407 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 14408 v0.AddArg(y) 14409 v0.AddArg(x) 14410 v.AddArg(v0) 14411 return true 14412 } 14413 } 14414 func rewriteValueARM_OpLeq32U_0(v *Value) bool { 14415 b := v.Block 14416 _ = b 14417 // match: (Leq32U x y) 14418 // cond: 14419 // result: (LessEqualU (CMP x y)) 14420 for { 14421 x := v.Args[0] 14422 y := v.Args[1] 14423 v.reset(OpARMLessEqualU) 14424 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14425 v0.AddArg(x) 14426 v0.AddArg(y) 14427 v.AddArg(v0) 14428 return true 14429 } 14430 } 14431 func rewriteValueARM_OpLeq64F_0(v *Value) bool { 14432 b := v.Block 14433 _ = b 14434 // match: (Leq64F x y) 14435 // cond: 14436 // result: (GreaterEqual (CMPD y x)) 14437 for { 14438 x := v.Args[0] 14439 y := v.Args[1] 14440 v.reset(OpARMGreaterEqual) 14441 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14442 v0.AddArg(y) 14443 v0.AddArg(x) 14444 v.AddArg(v0) 14445 return true 14446 } 14447 } 14448 func rewriteValueARM_OpLeq8_0(v *Value) bool { 14449 b := v.Block 14450 _ = b 14451 types := &b.Func.Config.Types 14452 _ = types 14453 // match: (Leq8 x y) 14454 // cond: 14455 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 14456 for { 14457 x := v.Args[0] 14458 y := v.Args[1] 14459 v.reset(OpARMLessEqual) 14460 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14461 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14462 v1.AddArg(x) 14463 v0.AddArg(v1) 14464 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14465 v2.AddArg(y) 14466 v0.AddArg(v2) 14467 v.AddArg(v0) 14468 return true 14469 } 14470 } 14471 func rewriteValueARM_OpLeq8U_0(v *Value) bool { 14472 b := v.Block 14473 _ = b 14474 types := &b.Func.Config.Types 14475 _ = types 14476 // match: (Leq8U x y) 14477 // cond: 14478 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14479 for { 14480 x := v.Args[0] 14481 y := v.Args[1] 14482 v.reset(OpARMLessEqualU) 14483 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14484 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14485 v1.AddArg(x) 14486 v0.AddArg(v1) 14487 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14488 v2.AddArg(y) 14489 v0.AddArg(v2) 14490 v.AddArg(v0) 14491 return true 14492 } 14493 } 14494 func rewriteValueARM_OpLess16_0(v *Value) bool { 14495 b := v.Block 14496 _ = b 14497 types := &b.Func.Config.Types 14498 _ = types 14499 // match: (Less16 x y) 14500 // cond: 14501 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 14502 for { 14503 x := v.Args[0] 14504 y := v.Args[1] 14505 v.reset(OpARMLessThan) 14506 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14507 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14508 v1.AddArg(x) 14509 v0.AddArg(v1) 14510 v2 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 14511 v2.AddArg(y) 14512 v0.AddArg(v2) 14513 v.AddArg(v0) 14514 return true 14515 } 14516 } 14517 func rewriteValueARM_OpLess16U_0(v *Value) bool { 14518 b := v.Block 14519 _ = b 14520 types := &b.Func.Config.Types 14521 _ = types 14522 // match: (Less16U x y) 14523 // cond: 14524 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14525 for { 14526 x := v.Args[0] 14527 y := v.Args[1] 14528 v.reset(OpARMLessThanU) 14529 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14530 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14531 v1.AddArg(x) 14532 v0.AddArg(v1) 14533 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14534 v2.AddArg(y) 14535 v0.AddArg(v2) 14536 v.AddArg(v0) 14537 return true 14538 } 14539 } 14540 func rewriteValueARM_OpLess32_0(v *Value) bool { 14541 b := v.Block 14542 _ = b 14543 // match: (Less32 x y) 14544 // cond: 14545 // result: (LessThan (CMP x y)) 14546 for { 14547 x := v.Args[0] 14548 y := v.Args[1] 14549 v.reset(OpARMLessThan) 14550 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14551 v0.AddArg(x) 14552 v0.AddArg(y) 14553 v.AddArg(v0) 14554 return true 14555 } 14556 } 14557 func rewriteValueARM_OpLess32F_0(v *Value) bool { 14558 b := v.Block 14559 _ = b 14560 // match: (Less32F x y) 14561 // cond: 14562 // result: (GreaterThan (CMPF y x)) 14563 for { 14564 x := v.Args[0] 14565 y := v.Args[1] 14566 v.reset(OpARMGreaterThan) 14567 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 14568 v0.AddArg(y) 14569 v0.AddArg(x) 14570 v.AddArg(v0) 14571 return true 14572 } 14573 } 14574 func rewriteValueARM_OpLess32U_0(v *Value) bool { 14575 b := v.Block 14576 _ = b 14577 // match: (Less32U x y) 14578 // cond: 14579 // result: (LessThanU (CMP x y)) 14580 for { 14581 x := v.Args[0] 14582 y := v.Args[1] 14583 v.reset(OpARMLessThanU) 14584 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14585 v0.AddArg(x) 14586 v0.AddArg(y) 14587 v.AddArg(v0) 14588 return true 14589 } 14590 } 14591 func rewriteValueARM_OpLess64F_0(v *Value) bool { 14592 b := v.Block 14593 _ = b 14594 // match: (Less64F x y) 14595 // cond: 14596 // result: (GreaterThan (CMPD y x)) 14597 for { 14598 x := v.Args[0] 14599 y := v.Args[1] 14600 v.reset(OpARMGreaterThan) 14601 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 14602 v0.AddArg(y) 14603 v0.AddArg(x) 14604 v.AddArg(v0) 14605 return true 14606 } 14607 } 14608 func rewriteValueARM_OpLess8_0(v *Value) bool { 14609 b := v.Block 14610 _ = b 14611 types := &b.Func.Config.Types 14612 _ = types 14613 // match: (Less8 x y) 14614 // cond: 14615 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 14616 for { 14617 x := v.Args[0] 14618 y := v.Args[1] 14619 v.reset(OpARMLessThan) 14620 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14621 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14622 v1.AddArg(x) 14623 v0.AddArg(v1) 14624 v2 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 14625 v2.AddArg(y) 14626 v0.AddArg(v2) 14627 v.AddArg(v0) 14628 return true 14629 } 14630 } 14631 func rewriteValueARM_OpLess8U_0(v *Value) bool { 14632 b := v.Block 14633 _ = b 14634 types := &b.Func.Config.Types 14635 _ = types 14636 // match: (Less8U x y) 14637 // cond: 14638 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14639 for { 14640 x := v.Args[0] 14641 y := v.Args[1] 14642 v.reset(OpARMLessThanU) 14643 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 14644 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14645 v1.AddArg(x) 14646 v0.AddArg(v1) 14647 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14648 v2.AddArg(y) 14649 v0.AddArg(v2) 14650 v.AddArg(v0) 14651 return true 14652 } 14653 } 14654 func rewriteValueARM_OpLoad_0(v *Value) bool { 14655 // match: (Load <t> ptr mem) 14656 // cond: t.IsBoolean() 14657 // result: (MOVBUload ptr mem) 14658 for { 14659 t := v.Type 14660 ptr := v.Args[0] 14661 mem := v.Args[1] 14662 if !(t.IsBoolean()) { 14663 break 14664 } 14665 v.reset(OpARMMOVBUload) 14666 v.AddArg(ptr) 14667 v.AddArg(mem) 14668 return true 14669 } 14670 // match: (Load <t> ptr mem) 14671 // cond: (is8BitInt(t) && isSigned(t)) 14672 // result: (MOVBload ptr mem) 14673 for { 14674 t := v.Type 14675 ptr := v.Args[0] 14676 mem := v.Args[1] 14677 if !(is8BitInt(t) && isSigned(t)) { 14678 break 14679 } 14680 v.reset(OpARMMOVBload) 14681 v.AddArg(ptr) 14682 v.AddArg(mem) 14683 return true 14684 } 14685 // match: (Load <t> ptr mem) 14686 // cond: (is8BitInt(t) && !isSigned(t)) 14687 // result: (MOVBUload ptr mem) 14688 for { 14689 t := v.Type 14690 ptr := v.Args[0] 14691 mem := v.Args[1] 14692 if !(is8BitInt(t) && !isSigned(t)) { 14693 break 14694 } 14695 v.reset(OpARMMOVBUload) 14696 v.AddArg(ptr) 14697 v.AddArg(mem) 14698 return true 14699 } 14700 // match: (Load <t> ptr mem) 14701 // cond: (is16BitInt(t) && isSigned(t)) 14702 // result: (MOVHload ptr mem) 14703 for { 14704 t := v.Type 14705 ptr := v.Args[0] 14706 mem := v.Args[1] 14707 if !(is16BitInt(t) && isSigned(t)) { 14708 break 14709 } 14710 v.reset(OpARMMOVHload) 14711 v.AddArg(ptr) 14712 v.AddArg(mem) 14713 return true 14714 } 14715 // match: (Load <t> ptr mem) 14716 // cond: (is16BitInt(t) && !isSigned(t)) 14717 // result: (MOVHUload ptr mem) 14718 for { 14719 t := v.Type 14720 ptr := v.Args[0] 14721 mem := v.Args[1] 14722 if !(is16BitInt(t) && !isSigned(t)) { 14723 break 14724 } 14725 v.reset(OpARMMOVHUload) 14726 v.AddArg(ptr) 14727 v.AddArg(mem) 14728 return true 14729 } 14730 // match: (Load <t> ptr mem) 14731 // cond: (is32BitInt(t) || isPtr(t)) 14732 // result: (MOVWload ptr mem) 14733 for { 14734 t := v.Type 14735 ptr := v.Args[0] 14736 mem := v.Args[1] 14737 if !(is32BitInt(t) || isPtr(t)) { 14738 break 14739 } 14740 v.reset(OpARMMOVWload) 14741 v.AddArg(ptr) 14742 v.AddArg(mem) 14743 return true 14744 } 14745 // match: (Load <t> ptr mem) 14746 // cond: is32BitFloat(t) 14747 // result: (MOVFload ptr mem) 14748 for { 14749 t := v.Type 14750 ptr := v.Args[0] 14751 mem := v.Args[1] 14752 if !(is32BitFloat(t)) { 14753 break 14754 } 14755 v.reset(OpARMMOVFload) 14756 v.AddArg(ptr) 14757 v.AddArg(mem) 14758 return true 14759 } 14760 // match: (Load <t> ptr mem) 14761 // cond: is64BitFloat(t) 14762 // result: (MOVDload ptr mem) 14763 for { 14764 t := v.Type 14765 ptr := v.Args[0] 14766 mem := v.Args[1] 14767 if !(is64BitFloat(t)) { 14768 break 14769 } 14770 v.reset(OpARMMOVDload) 14771 v.AddArg(ptr) 14772 v.AddArg(mem) 14773 return true 14774 } 14775 return false 14776 } 14777 func rewriteValueARM_OpLsh16x16_0(v *Value) bool { 14778 b := v.Block 14779 _ = b 14780 types := &b.Func.Config.Types 14781 _ = types 14782 // match: (Lsh16x16 x y) 14783 // cond: 14784 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14785 for { 14786 x := v.Args[0] 14787 y := v.Args[1] 14788 v.reset(OpARMCMOVWHSconst) 14789 v.AuxInt = 0 14790 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14791 v0.AddArg(x) 14792 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14793 v1.AddArg(y) 14794 v0.AddArg(v1) 14795 v.AddArg(v0) 14796 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14797 v2.AuxInt = 256 14798 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14799 v3.AddArg(y) 14800 v2.AddArg(v3) 14801 v.AddArg(v2) 14802 return true 14803 } 14804 } 14805 func rewriteValueARM_OpLsh16x32_0(v *Value) bool { 14806 b := v.Block 14807 _ = b 14808 // match: (Lsh16x32 x y) 14809 // cond: 14810 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14811 for { 14812 x := v.Args[0] 14813 y := v.Args[1] 14814 v.reset(OpARMCMOVWHSconst) 14815 v.AuxInt = 0 14816 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14817 v0.AddArg(x) 14818 v0.AddArg(y) 14819 v.AddArg(v0) 14820 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14821 v1.AuxInt = 256 14822 v1.AddArg(y) 14823 v.AddArg(v1) 14824 return true 14825 } 14826 } 14827 func rewriteValueARM_OpLsh16x64_0(v *Value) bool { 14828 // match: (Lsh16x64 x (Const64 [c])) 14829 // cond: uint64(c) < 16 14830 // result: (SLLconst x [c]) 14831 for { 14832 x := v.Args[0] 14833 v_1 := v.Args[1] 14834 if v_1.Op != OpConst64 { 14835 break 14836 } 14837 c := v_1.AuxInt 14838 if !(uint64(c) < 16) { 14839 break 14840 } 14841 v.reset(OpARMSLLconst) 14842 v.AuxInt = c 14843 v.AddArg(x) 14844 return true 14845 } 14846 // match: (Lsh16x64 _ (Const64 [c])) 14847 // cond: uint64(c) >= 16 14848 // result: (Const16 [0]) 14849 for { 14850 v_1 := v.Args[1] 14851 if v_1.Op != OpConst64 { 14852 break 14853 } 14854 c := v_1.AuxInt 14855 if !(uint64(c) >= 16) { 14856 break 14857 } 14858 v.reset(OpConst16) 14859 v.AuxInt = 0 14860 return true 14861 } 14862 return false 14863 } 14864 func rewriteValueARM_OpLsh16x8_0(v *Value) bool { 14865 b := v.Block 14866 _ = b 14867 types := &b.Func.Config.Types 14868 _ = types 14869 // match: (Lsh16x8 x y) 14870 // cond: 14871 // result: (SLL x (ZeroExt8to32 y)) 14872 for { 14873 x := v.Args[0] 14874 y := v.Args[1] 14875 v.reset(OpARMSLL) 14876 v.AddArg(x) 14877 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14878 v0.AddArg(y) 14879 v.AddArg(v0) 14880 return true 14881 } 14882 } 14883 func rewriteValueARM_OpLsh32x16_0(v *Value) bool { 14884 b := v.Block 14885 _ = b 14886 types := &b.Func.Config.Types 14887 _ = types 14888 // match: (Lsh32x16 x y) 14889 // cond: 14890 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14891 for { 14892 x := v.Args[0] 14893 y := v.Args[1] 14894 v.reset(OpARMCMOVWHSconst) 14895 v.AuxInt = 0 14896 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14897 v0.AddArg(x) 14898 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14899 v1.AddArg(y) 14900 v0.AddArg(v1) 14901 v.AddArg(v0) 14902 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14903 v2.AuxInt = 256 14904 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 14905 v3.AddArg(y) 14906 v2.AddArg(v3) 14907 v.AddArg(v2) 14908 return true 14909 } 14910 } 14911 func rewriteValueARM_OpLsh32x32_0(v *Value) bool { 14912 b := v.Block 14913 _ = b 14914 // match: (Lsh32x32 x y) 14915 // cond: 14916 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 14917 for { 14918 x := v.Args[0] 14919 y := v.Args[1] 14920 v.reset(OpARMCMOVWHSconst) 14921 v.AuxInt = 0 14922 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14923 v0.AddArg(x) 14924 v0.AddArg(y) 14925 v.AddArg(v0) 14926 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 14927 v1.AuxInt = 256 14928 v1.AddArg(y) 14929 v.AddArg(v1) 14930 return true 14931 } 14932 } 14933 func rewriteValueARM_OpLsh32x64_0(v *Value) bool { 14934 // match: (Lsh32x64 x (Const64 [c])) 14935 // cond: uint64(c) < 32 14936 // result: (SLLconst x [c]) 14937 for { 14938 x := v.Args[0] 14939 v_1 := v.Args[1] 14940 if v_1.Op != OpConst64 { 14941 break 14942 } 14943 c := v_1.AuxInt 14944 if !(uint64(c) < 32) { 14945 break 14946 } 14947 v.reset(OpARMSLLconst) 14948 v.AuxInt = c 14949 v.AddArg(x) 14950 return true 14951 } 14952 // match: (Lsh32x64 _ (Const64 [c])) 14953 // cond: uint64(c) >= 32 14954 // result: (Const32 [0]) 14955 for { 14956 v_1 := v.Args[1] 14957 if v_1.Op != OpConst64 { 14958 break 14959 } 14960 c := v_1.AuxInt 14961 if !(uint64(c) >= 32) { 14962 break 14963 } 14964 v.reset(OpConst32) 14965 v.AuxInt = 0 14966 return true 14967 } 14968 return false 14969 } 14970 func rewriteValueARM_OpLsh32x8_0(v *Value) bool { 14971 b := v.Block 14972 _ = b 14973 types := &b.Func.Config.Types 14974 _ = types 14975 // match: (Lsh32x8 x y) 14976 // cond: 14977 // result: (SLL x (ZeroExt8to32 y)) 14978 for { 14979 x := v.Args[0] 14980 y := v.Args[1] 14981 v.reset(OpARMSLL) 14982 v.AddArg(x) 14983 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 14984 v0.AddArg(y) 14985 v.AddArg(v0) 14986 return true 14987 } 14988 } 14989 func rewriteValueARM_OpLsh8x16_0(v *Value) bool { 14990 b := v.Block 14991 _ = b 14992 types := &b.Func.Config.Types 14993 _ = types 14994 // match: (Lsh8x16 x y) 14995 // cond: 14996 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 14997 for { 14998 x := v.Args[0] 14999 y := v.Args[1] 15000 v.reset(OpARMCMOVWHSconst) 15001 v.AuxInt = 0 15002 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15003 v0.AddArg(x) 15004 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15005 v1.AddArg(y) 15006 v0.AddArg(v1) 15007 v.AddArg(v0) 15008 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15009 v2.AuxInt = 256 15010 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15011 v3.AddArg(y) 15012 v2.AddArg(v3) 15013 v.AddArg(v2) 15014 return true 15015 } 15016 } 15017 func rewriteValueARM_OpLsh8x32_0(v *Value) bool { 15018 b := v.Block 15019 _ = b 15020 // match: (Lsh8x32 x y) 15021 // cond: 15022 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 15023 for { 15024 x := v.Args[0] 15025 y := v.Args[1] 15026 v.reset(OpARMCMOVWHSconst) 15027 v.AuxInt = 0 15028 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15029 v0.AddArg(x) 15030 v0.AddArg(y) 15031 v.AddArg(v0) 15032 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15033 v1.AuxInt = 256 15034 v1.AddArg(y) 15035 v.AddArg(v1) 15036 return true 15037 } 15038 } 15039 func rewriteValueARM_OpLsh8x64_0(v *Value) bool { 15040 // match: (Lsh8x64 x (Const64 [c])) 15041 // cond: uint64(c) < 8 15042 // result: (SLLconst x [c]) 15043 for { 15044 x := v.Args[0] 15045 v_1 := v.Args[1] 15046 if v_1.Op != OpConst64 { 15047 break 15048 } 15049 c := v_1.AuxInt 15050 if !(uint64(c) < 8) { 15051 break 15052 } 15053 v.reset(OpARMSLLconst) 15054 v.AuxInt = c 15055 v.AddArg(x) 15056 return true 15057 } 15058 // match: (Lsh8x64 _ (Const64 [c])) 15059 // cond: uint64(c) >= 8 15060 // result: (Const8 [0]) 15061 for { 15062 v_1 := v.Args[1] 15063 if v_1.Op != OpConst64 { 15064 break 15065 } 15066 c := v_1.AuxInt 15067 if !(uint64(c) >= 8) { 15068 break 15069 } 15070 v.reset(OpConst8) 15071 v.AuxInt = 0 15072 return true 15073 } 15074 return false 15075 } 15076 func rewriteValueARM_OpLsh8x8_0(v *Value) bool { 15077 b := v.Block 15078 _ = b 15079 types := &b.Func.Config.Types 15080 _ = types 15081 // match: (Lsh8x8 x y) 15082 // cond: 15083 // result: (SLL x (ZeroExt8to32 y)) 15084 for { 15085 x := v.Args[0] 15086 y := v.Args[1] 15087 v.reset(OpARMSLL) 15088 v.AddArg(x) 15089 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15090 v0.AddArg(y) 15091 v.AddArg(v0) 15092 return true 15093 } 15094 } 15095 func rewriteValueARM_OpMod16_0(v *Value) bool { 15096 b := v.Block 15097 _ = b 15098 types := &b.Func.Config.Types 15099 _ = types 15100 // match: (Mod16 x y) 15101 // cond: 15102 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 15103 for { 15104 x := v.Args[0] 15105 y := v.Args[1] 15106 v.reset(OpMod32) 15107 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 15108 v0.AddArg(x) 15109 v.AddArg(v0) 15110 v1 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 15111 v1.AddArg(y) 15112 v.AddArg(v1) 15113 return true 15114 } 15115 } 15116 func rewriteValueARM_OpMod16u_0(v *Value) bool { 15117 b := v.Block 15118 _ = b 15119 types := &b.Func.Config.Types 15120 _ = types 15121 // match: (Mod16u x y) 15122 // cond: 15123 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 15124 for { 15125 x := v.Args[0] 15126 y := v.Args[1] 15127 v.reset(OpMod32u) 15128 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15129 v0.AddArg(x) 15130 v.AddArg(v0) 15131 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15132 v1.AddArg(y) 15133 v.AddArg(v1) 15134 return true 15135 } 15136 } 15137 func rewriteValueARM_OpMod32_0(v *Value) bool { 15138 b := v.Block 15139 _ = b 15140 types := &b.Func.Config.Types 15141 _ = types 15142 // match: (Mod32 x y) 15143 // cond: 15144 // result: (SUB (XOR <types.UInt32> (Select1 <types.UInt32> (CALLudiv (SUB <types.UInt32> (XOR <types.UInt32> x (Signmask x)) (Signmask x)) (SUB <types.UInt32> (XOR <types.UInt32> y (Signmask y)) (Signmask y)))) (Signmask x)) (Signmask x)) 15145 for { 15146 x := v.Args[0] 15147 y := v.Args[1] 15148 v.reset(OpARMSUB) 15149 v0 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 15150 v1 := b.NewValue0(v.Pos, OpSelect1, types.UInt32) 15151 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, MakeTuple(types.UInt32, types.UInt32)) 15152 v3 := b.NewValue0(v.Pos, OpARMSUB, types.UInt32) 15153 v4 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 15154 v4.AddArg(x) 15155 v5 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15156 v5.AddArg(x) 15157 v4.AddArg(v5) 15158 v3.AddArg(v4) 15159 v6 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15160 v6.AddArg(x) 15161 v3.AddArg(v6) 15162 v2.AddArg(v3) 15163 v7 := b.NewValue0(v.Pos, OpARMSUB, types.UInt32) 15164 v8 := b.NewValue0(v.Pos, OpARMXOR, types.UInt32) 15165 v8.AddArg(y) 15166 v9 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15167 v9.AddArg(y) 15168 v8.AddArg(v9) 15169 v7.AddArg(v8) 15170 v10 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15171 v10.AddArg(y) 15172 v7.AddArg(v10) 15173 v2.AddArg(v7) 15174 v1.AddArg(v2) 15175 v0.AddArg(v1) 15176 v11 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15177 v11.AddArg(x) 15178 v0.AddArg(v11) 15179 v.AddArg(v0) 15180 v12 := b.NewValue0(v.Pos, OpSignmask, types.Int32) 15181 v12.AddArg(x) 15182 v.AddArg(v12) 15183 return true 15184 } 15185 } 15186 func rewriteValueARM_OpMod32u_0(v *Value) bool { 15187 b := v.Block 15188 _ = b 15189 types := &b.Func.Config.Types 15190 _ = types 15191 // match: (Mod32u x y) 15192 // cond: 15193 // result: (Select1 <types.UInt32> (CALLudiv x y)) 15194 for { 15195 x := v.Args[0] 15196 y := v.Args[1] 15197 v.reset(OpSelect1) 15198 v.Type = types.UInt32 15199 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, MakeTuple(types.UInt32, types.UInt32)) 15200 v0.AddArg(x) 15201 v0.AddArg(y) 15202 v.AddArg(v0) 15203 return true 15204 } 15205 } 15206 func rewriteValueARM_OpMod8_0(v *Value) bool { 15207 b := v.Block 15208 _ = b 15209 types := &b.Func.Config.Types 15210 _ = types 15211 // match: (Mod8 x y) 15212 // cond: 15213 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 15214 for { 15215 x := v.Args[0] 15216 y := v.Args[1] 15217 v.reset(OpMod32) 15218 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 15219 v0.AddArg(x) 15220 v.AddArg(v0) 15221 v1 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 15222 v1.AddArg(y) 15223 v.AddArg(v1) 15224 return true 15225 } 15226 } 15227 func rewriteValueARM_OpMod8u_0(v *Value) bool { 15228 b := v.Block 15229 _ = b 15230 types := &b.Func.Config.Types 15231 _ = types 15232 // match: (Mod8u x y) 15233 // cond: 15234 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 15235 for { 15236 x := v.Args[0] 15237 y := v.Args[1] 15238 v.reset(OpMod32u) 15239 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15240 v0.AddArg(x) 15241 v.AddArg(v0) 15242 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15243 v1.AddArg(y) 15244 v.AddArg(v1) 15245 return true 15246 } 15247 } 15248 func rewriteValueARM_OpMove_0(v *Value) bool { 15249 b := v.Block 15250 _ = b 15251 config := b.Func.Config 15252 _ = config 15253 types := &b.Func.Config.Types 15254 _ = types 15255 // match: (Move [0] _ _ mem) 15256 // cond: 15257 // result: mem 15258 for { 15259 if v.AuxInt != 0 { 15260 break 15261 } 15262 mem := v.Args[2] 15263 v.reset(OpCopy) 15264 v.Type = mem.Type 15265 v.AddArg(mem) 15266 return true 15267 } 15268 // match: (Move [1] dst src mem) 15269 // cond: 15270 // result: (MOVBstore dst (MOVBUload src mem) mem) 15271 for { 15272 if v.AuxInt != 1 { 15273 break 15274 } 15275 dst := v.Args[0] 15276 src := v.Args[1] 15277 mem := v.Args[2] 15278 v.reset(OpARMMOVBstore) 15279 v.AddArg(dst) 15280 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15281 v0.AddArg(src) 15282 v0.AddArg(mem) 15283 v.AddArg(v0) 15284 v.AddArg(mem) 15285 return true 15286 } 15287 // match: (Move [2] {t} dst src mem) 15288 // cond: t.(Type).Alignment()%2 == 0 15289 // result: (MOVHstore dst (MOVHUload src mem) mem) 15290 for { 15291 if v.AuxInt != 2 { 15292 break 15293 } 15294 t := v.Aux 15295 dst := v.Args[0] 15296 src := v.Args[1] 15297 mem := v.Args[2] 15298 if !(t.(Type).Alignment()%2 == 0) { 15299 break 15300 } 15301 v.reset(OpARMMOVHstore) 15302 v.AddArg(dst) 15303 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, types.UInt16) 15304 v0.AddArg(src) 15305 v0.AddArg(mem) 15306 v.AddArg(v0) 15307 v.AddArg(mem) 15308 return true 15309 } 15310 // match: (Move [2] dst src mem) 15311 // cond: 15312 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 15313 for { 15314 if v.AuxInt != 2 { 15315 break 15316 } 15317 dst := v.Args[0] 15318 src := v.Args[1] 15319 mem := v.Args[2] 15320 v.reset(OpARMMOVBstore) 15321 v.AuxInt = 1 15322 v.AddArg(dst) 15323 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15324 v0.AuxInt = 1 15325 v0.AddArg(src) 15326 v0.AddArg(mem) 15327 v.AddArg(v0) 15328 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15329 v1.AddArg(dst) 15330 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15331 v2.AddArg(src) 15332 v2.AddArg(mem) 15333 v1.AddArg(v2) 15334 v1.AddArg(mem) 15335 v.AddArg(v1) 15336 return true 15337 } 15338 // match: (Move [4] {t} dst src mem) 15339 // cond: t.(Type).Alignment()%4 == 0 15340 // result: (MOVWstore dst (MOVWload src mem) mem) 15341 for { 15342 if v.AuxInt != 4 { 15343 break 15344 } 15345 t := v.Aux 15346 dst := v.Args[0] 15347 src := v.Args[1] 15348 mem := v.Args[2] 15349 if !(t.(Type).Alignment()%4 == 0) { 15350 break 15351 } 15352 v.reset(OpARMMOVWstore) 15353 v.AddArg(dst) 15354 v0 := b.NewValue0(v.Pos, OpARMMOVWload, types.UInt32) 15355 v0.AddArg(src) 15356 v0.AddArg(mem) 15357 v.AddArg(v0) 15358 v.AddArg(mem) 15359 return true 15360 } 15361 // match: (Move [4] {t} dst src mem) 15362 // cond: t.(Type).Alignment()%2 == 0 15363 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 15364 for { 15365 if v.AuxInt != 4 { 15366 break 15367 } 15368 t := v.Aux 15369 dst := v.Args[0] 15370 src := v.Args[1] 15371 mem := v.Args[2] 15372 if !(t.(Type).Alignment()%2 == 0) { 15373 break 15374 } 15375 v.reset(OpARMMOVHstore) 15376 v.AuxInt = 2 15377 v.AddArg(dst) 15378 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, types.UInt16) 15379 v0.AuxInt = 2 15380 v0.AddArg(src) 15381 v0.AddArg(mem) 15382 v.AddArg(v0) 15383 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, TypeMem) 15384 v1.AddArg(dst) 15385 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, types.UInt16) 15386 v2.AddArg(src) 15387 v2.AddArg(mem) 15388 v1.AddArg(v2) 15389 v1.AddArg(mem) 15390 v.AddArg(v1) 15391 return true 15392 } 15393 // match: (Move [4] dst src mem) 15394 // cond: 15395 // 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)))) 15396 for { 15397 if v.AuxInt != 4 { 15398 break 15399 } 15400 dst := v.Args[0] 15401 src := v.Args[1] 15402 mem := v.Args[2] 15403 v.reset(OpARMMOVBstore) 15404 v.AuxInt = 3 15405 v.AddArg(dst) 15406 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15407 v0.AuxInt = 3 15408 v0.AddArg(src) 15409 v0.AddArg(mem) 15410 v.AddArg(v0) 15411 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15412 v1.AuxInt = 2 15413 v1.AddArg(dst) 15414 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15415 v2.AuxInt = 2 15416 v2.AddArg(src) 15417 v2.AddArg(mem) 15418 v1.AddArg(v2) 15419 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15420 v3.AuxInt = 1 15421 v3.AddArg(dst) 15422 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15423 v4.AuxInt = 1 15424 v4.AddArg(src) 15425 v4.AddArg(mem) 15426 v3.AddArg(v4) 15427 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15428 v5.AddArg(dst) 15429 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15430 v6.AddArg(src) 15431 v6.AddArg(mem) 15432 v5.AddArg(v6) 15433 v5.AddArg(mem) 15434 v3.AddArg(v5) 15435 v1.AddArg(v3) 15436 v.AddArg(v1) 15437 return true 15438 } 15439 // match: (Move [3] dst src mem) 15440 // cond: 15441 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 15442 for { 15443 if v.AuxInt != 3 { 15444 break 15445 } 15446 dst := v.Args[0] 15447 src := v.Args[1] 15448 mem := v.Args[2] 15449 v.reset(OpARMMOVBstore) 15450 v.AuxInt = 2 15451 v.AddArg(dst) 15452 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15453 v0.AuxInt = 2 15454 v0.AddArg(src) 15455 v0.AddArg(mem) 15456 v.AddArg(v0) 15457 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15458 v1.AuxInt = 1 15459 v1.AddArg(dst) 15460 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15461 v2.AuxInt = 1 15462 v2.AddArg(src) 15463 v2.AddArg(mem) 15464 v1.AddArg(v2) 15465 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 15466 v3.AddArg(dst) 15467 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, types.UInt8) 15468 v4.AddArg(src) 15469 v4.AddArg(mem) 15470 v3.AddArg(v4) 15471 v3.AddArg(mem) 15472 v1.AddArg(v3) 15473 v.AddArg(v1) 15474 return true 15475 } 15476 // match: (Move [s] {t} dst src mem) 15477 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(Type).Alignment()%4 == 0 && !config.noDuffDevice 15478 // result: (DUFFCOPY [8 * (128 - int64(s/4))] dst src mem) 15479 for { 15480 s := v.AuxInt 15481 t := v.Aux 15482 dst := v.Args[0] 15483 src := v.Args[1] 15484 mem := v.Args[2] 15485 if !(s%4 == 0 && s > 4 && s <= 512 && t.(Type).Alignment()%4 == 0 && !config.noDuffDevice) { 15486 break 15487 } 15488 v.reset(OpARMDUFFCOPY) 15489 v.AuxInt = 8 * (128 - int64(s/4)) 15490 v.AddArg(dst) 15491 v.AddArg(src) 15492 v.AddArg(mem) 15493 return true 15494 } 15495 // match: (Move [s] {t} dst src mem) 15496 // cond: (s > 512 || config.noDuffDevice) || t.(Type).Alignment()%4 != 0 15497 // result: (LoweredMove [t.(Type).Alignment()] dst src (ADDconst <src.Type> src [s-moveSize(t.(Type).Alignment(), config)]) mem) 15498 for { 15499 s := v.AuxInt 15500 t := v.Aux 15501 dst := v.Args[0] 15502 src := v.Args[1] 15503 mem := v.Args[2] 15504 if !((s > 512 || config.noDuffDevice) || t.(Type).Alignment()%4 != 0) { 15505 break 15506 } 15507 v.reset(OpARMLoweredMove) 15508 v.AuxInt = t.(Type).Alignment() 15509 v.AddArg(dst) 15510 v.AddArg(src) 15511 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 15512 v0.AuxInt = s - moveSize(t.(Type).Alignment(), config) 15513 v0.AddArg(src) 15514 v.AddArg(v0) 15515 v.AddArg(mem) 15516 return true 15517 } 15518 return false 15519 } 15520 func rewriteValueARM_OpMul16_0(v *Value) bool { 15521 // match: (Mul16 x y) 15522 // cond: 15523 // result: (MUL x y) 15524 for { 15525 x := v.Args[0] 15526 y := v.Args[1] 15527 v.reset(OpARMMUL) 15528 v.AddArg(x) 15529 v.AddArg(y) 15530 return true 15531 } 15532 } 15533 func rewriteValueARM_OpMul32_0(v *Value) bool { 15534 // match: (Mul32 x y) 15535 // cond: 15536 // result: (MUL x y) 15537 for { 15538 x := v.Args[0] 15539 y := v.Args[1] 15540 v.reset(OpARMMUL) 15541 v.AddArg(x) 15542 v.AddArg(y) 15543 return true 15544 } 15545 } 15546 func rewriteValueARM_OpMul32F_0(v *Value) bool { 15547 // match: (Mul32F x y) 15548 // cond: 15549 // result: (MULF x y) 15550 for { 15551 x := v.Args[0] 15552 y := v.Args[1] 15553 v.reset(OpARMMULF) 15554 v.AddArg(x) 15555 v.AddArg(y) 15556 return true 15557 } 15558 } 15559 func rewriteValueARM_OpMul32uhilo_0(v *Value) bool { 15560 // match: (Mul32uhilo x y) 15561 // cond: 15562 // result: (MULLU x y) 15563 for { 15564 x := v.Args[0] 15565 y := v.Args[1] 15566 v.reset(OpARMMULLU) 15567 v.AddArg(x) 15568 v.AddArg(y) 15569 return true 15570 } 15571 } 15572 func rewriteValueARM_OpMul64F_0(v *Value) bool { 15573 // match: (Mul64F x y) 15574 // cond: 15575 // result: (MULD x y) 15576 for { 15577 x := v.Args[0] 15578 y := v.Args[1] 15579 v.reset(OpARMMULD) 15580 v.AddArg(x) 15581 v.AddArg(y) 15582 return true 15583 } 15584 } 15585 func rewriteValueARM_OpMul8_0(v *Value) bool { 15586 // match: (Mul8 x y) 15587 // cond: 15588 // result: (MUL x y) 15589 for { 15590 x := v.Args[0] 15591 y := v.Args[1] 15592 v.reset(OpARMMUL) 15593 v.AddArg(x) 15594 v.AddArg(y) 15595 return true 15596 } 15597 } 15598 func rewriteValueARM_OpNeg16_0(v *Value) bool { 15599 // match: (Neg16 x) 15600 // cond: 15601 // result: (RSBconst [0] x) 15602 for { 15603 x := v.Args[0] 15604 v.reset(OpARMRSBconst) 15605 v.AuxInt = 0 15606 v.AddArg(x) 15607 return true 15608 } 15609 } 15610 func rewriteValueARM_OpNeg32_0(v *Value) bool { 15611 // match: (Neg32 x) 15612 // cond: 15613 // result: (RSBconst [0] x) 15614 for { 15615 x := v.Args[0] 15616 v.reset(OpARMRSBconst) 15617 v.AuxInt = 0 15618 v.AddArg(x) 15619 return true 15620 } 15621 } 15622 func rewriteValueARM_OpNeg32F_0(v *Value) bool { 15623 // match: (Neg32F x) 15624 // cond: 15625 // result: (NEGF x) 15626 for { 15627 x := v.Args[0] 15628 v.reset(OpARMNEGF) 15629 v.AddArg(x) 15630 return true 15631 } 15632 } 15633 func rewriteValueARM_OpNeg64F_0(v *Value) bool { 15634 // match: (Neg64F x) 15635 // cond: 15636 // result: (NEGD x) 15637 for { 15638 x := v.Args[0] 15639 v.reset(OpARMNEGD) 15640 v.AddArg(x) 15641 return true 15642 } 15643 } 15644 func rewriteValueARM_OpNeg8_0(v *Value) bool { 15645 // match: (Neg8 x) 15646 // cond: 15647 // result: (RSBconst [0] x) 15648 for { 15649 x := v.Args[0] 15650 v.reset(OpARMRSBconst) 15651 v.AuxInt = 0 15652 v.AddArg(x) 15653 return true 15654 } 15655 } 15656 func rewriteValueARM_OpNeq16_0(v *Value) bool { 15657 b := v.Block 15658 _ = b 15659 types := &b.Func.Config.Types 15660 _ = types 15661 // match: (Neq16 x y) 15662 // cond: 15663 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 15664 for { 15665 x := v.Args[0] 15666 y := v.Args[1] 15667 v.reset(OpARMNotEqual) 15668 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15669 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15670 v1.AddArg(x) 15671 v0.AddArg(v1) 15672 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15673 v2.AddArg(y) 15674 v0.AddArg(v2) 15675 v.AddArg(v0) 15676 return true 15677 } 15678 } 15679 func rewriteValueARM_OpNeq32_0(v *Value) bool { 15680 b := v.Block 15681 _ = b 15682 // match: (Neq32 x y) 15683 // cond: 15684 // result: (NotEqual (CMP x y)) 15685 for { 15686 x := v.Args[0] 15687 y := v.Args[1] 15688 v.reset(OpARMNotEqual) 15689 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15690 v0.AddArg(x) 15691 v0.AddArg(y) 15692 v.AddArg(v0) 15693 return true 15694 } 15695 } 15696 func rewriteValueARM_OpNeq32F_0(v *Value) bool { 15697 b := v.Block 15698 _ = b 15699 // match: (Neq32F x y) 15700 // cond: 15701 // result: (NotEqual (CMPF x y)) 15702 for { 15703 x := v.Args[0] 15704 y := v.Args[1] 15705 v.reset(OpARMNotEqual) 15706 v0 := b.NewValue0(v.Pos, OpARMCMPF, TypeFlags) 15707 v0.AddArg(x) 15708 v0.AddArg(y) 15709 v.AddArg(v0) 15710 return true 15711 } 15712 } 15713 func rewriteValueARM_OpNeq64F_0(v *Value) bool { 15714 b := v.Block 15715 _ = b 15716 // match: (Neq64F x y) 15717 // cond: 15718 // result: (NotEqual (CMPD x y)) 15719 for { 15720 x := v.Args[0] 15721 y := v.Args[1] 15722 v.reset(OpARMNotEqual) 15723 v0 := b.NewValue0(v.Pos, OpARMCMPD, TypeFlags) 15724 v0.AddArg(x) 15725 v0.AddArg(y) 15726 v.AddArg(v0) 15727 return true 15728 } 15729 } 15730 func rewriteValueARM_OpNeq8_0(v *Value) bool { 15731 b := v.Block 15732 _ = b 15733 types := &b.Func.Config.Types 15734 _ = types 15735 // match: (Neq8 x y) 15736 // cond: 15737 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15738 for { 15739 x := v.Args[0] 15740 y := v.Args[1] 15741 v.reset(OpARMNotEqual) 15742 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15743 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15744 v1.AddArg(x) 15745 v0.AddArg(v1) 15746 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 15747 v2.AddArg(y) 15748 v0.AddArg(v2) 15749 v.AddArg(v0) 15750 return true 15751 } 15752 } 15753 func rewriteValueARM_OpNeqB_0(v *Value) bool { 15754 // match: (NeqB x y) 15755 // cond: 15756 // result: (XOR x y) 15757 for { 15758 x := v.Args[0] 15759 y := v.Args[1] 15760 v.reset(OpARMXOR) 15761 v.AddArg(x) 15762 v.AddArg(y) 15763 return true 15764 } 15765 } 15766 func rewriteValueARM_OpNeqPtr_0(v *Value) bool { 15767 b := v.Block 15768 _ = b 15769 // match: (NeqPtr x y) 15770 // cond: 15771 // result: (NotEqual (CMP x y)) 15772 for { 15773 x := v.Args[0] 15774 y := v.Args[1] 15775 v.reset(OpARMNotEqual) 15776 v0 := b.NewValue0(v.Pos, OpARMCMP, TypeFlags) 15777 v0.AddArg(x) 15778 v0.AddArg(y) 15779 v.AddArg(v0) 15780 return true 15781 } 15782 } 15783 func rewriteValueARM_OpNilCheck_0(v *Value) bool { 15784 // match: (NilCheck ptr mem) 15785 // cond: 15786 // result: (LoweredNilCheck ptr mem) 15787 for { 15788 ptr := v.Args[0] 15789 mem := v.Args[1] 15790 v.reset(OpARMLoweredNilCheck) 15791 v.AddArg(ptr) 15792 v.AddArg(mem) 15793 return true 15794 } 15795 } 15796 func rewriteValueARM_OpNot_0(v *Value) bool { 15797 // match: (Not x) 15798 // cond: 15799 // result: (XORconst [1] x) 15800 for { 15801 x := v.Args[0] 15802 v.reset(OpARMXORconst) 15803 v.AuxInt = 1 15804 v.AddArg(x) 15805 return true 15806 } 15807 } 15808 func rewriteValueARM_OpOffPtr_0(v *Value) bool { 15809 // match: (OffPtr [off] ptr:(SP)) 15810 // cond: 15811 // result: (MOVWaddr [off] ptr) 15812 for { 15813 off := v.AuxInt 15814 ptr := v.Args[0] 15815 if ptr.Op != OpSP { 15816 break 15817 } 15818 v.reset(OpARMMOVWaddr) 15819 v.AuxInt = off 15820 v.AddArg(ptr) 15821 return true 15822 } 15823 // match: (OffPtr [off] ptr) 15824 // cond: 15825 // result: (ADDconst [off] ptr) 15826 for { 15827 off := v.AuxInt 15828 ptr := v.Args[0] 15829 v.reset(OpARMADDconst) 15830 v.AuxInt = off 15831 v.AddArg(ptr) 15832 return true 15833 } 15834 } 15835 func rewriteValueARM_OpOr16_0(v *Value) bool { 15836 // match: (Or16 x y) 15837 // cond: 15838 // result: (OR x y) 15839 for { 15840 x := v.Args[0] 15841 y := v.Args[1] 15842 v.reset(OpARMOR) 15843 v.AddArg(x) 15844 v.AddArg(y) 15845 return true 15846 } 15847 } 15848 func rewriteValueARM_OpOr32_0(v *Value) bool { 15849 // match: (Or32 x y) 15850 // cond: 15851 // result: (OR x y) 15852 for { 15853 x := v.Args[0] 15854 y := v.Args[1] 15855 v.reset(OpARMOR) 15856 v.AddArg(x) 15857 v.AddArg(y) 15858 return true 15859 } 15860 } 15861 func rewriteValueARM_OpOr8_0(v *Value) bool { 15862 // match: (Or8 x y) 15863 // cond: 15864 // result: (OR x y) 15865 for { 15866 x := v.Args[0] 15867 y := v.Args[1] 15868 v.reset(OpARMOR) 15869 v.AddArg(x) 15870 v.AddArg(y) 15871 return true 15872 } 15873 } 15874 func rewriteValueARM_OpOrB_0(v *Value) bool { 15875 // match: (OrB x y) 15876 // cond: 15877 // result: (OR x y) 15878 for { 15879 x := v.Args[0] 15880 y := v.Args[1] 15881 v.reset(OpARMOR) 15882 v.AddArg(x) 15883 v.AddArg(y) 15884 return true 15885 } 15886 } 15887 func rewriteValueARM_OpRound32F_0(v *Value) bool { 15888 // match: (Round32F x) 15889 // cond: 15890 // result: x 15891 for { 15892 x := v.Args[0] 15893 v.reset(OpCopy) 15894 v.Type = x.Type 15895 v.AddArg(x) 15896 return true 15897 } 15898 } 15899 func rewriteValueARM_OpRound64F_0(v *Value) bool { 15900 // match: (Round64F x) 15901 // cond: 15902 // result: x 15903 for { 15904 x := v.Args[0] 15905 v.reset(OpCopy) 15906 v.Type = x.Type 15907 v.AddArg(x) 15908 return true 15909 } 15910 } 15911 func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { 15912 b := v.Block 15913 _ = b 15914 types := &b.Func.Config.Types 15915 _ = types 15916 // match: (Rsh16Ux16 x y) 15917 // cond: 15918 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15919 for { 15920 x := v.Args[0] 15921 y := v.Args[1] 15922 v.reset(OpARMCMOVWHSconst) 15923 v.AuxInt = 0 15924 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15925 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15926 v1.AddArg(x) 15927 v0.AddArg(v1) 15928 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15929 v2.AddArg(y) 15930 v0.AddArg(v2) 15931 v.AddArg(v0) 15932 v3 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15933 v3.AuxInt = 256 15934 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15935 v4.AddArg(y) 15936 v3.AddArg(v4) 15937 v.AddArg(v3) 15938 return true 15939 } 15940 } 15941 func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { 15942 b := v.Block 15943 _ = b 15944 types := &b.Func.Config.Types 15945 _ = types 15946 // match: (Rsh16Ux32 x y) 15947 // cond: 15948 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 15949 for { 15950 x := v.Args[0] 15951 y := v.Args[1] 15952 v.reset(OpARMCMOVWHSconst) 15953 v.AuxInt = 0 15954 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15955 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 15956 v1.AddArg(x) 15957 v0.AddArg(v1) 15958 v0.AddArg(y) 15959 v.AddArg(v0) 15960 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 15961 v2.AuxInt = 256 15962 v2.AddArg(y) 15963 v.AddArg(v2) 15964 return true 15965 } 15966 } 15967 func rewriteValueARM_OpRsh16Ux64_0(v *Value) bool { 15968 b := v.Block 15969 _ = b 15970 types := &b.Func.Config.Types 15971 _ = types 15972 // match: (Rsh16Ux64 x (Const64 [c])) 15973 // cond: uint64(c) < 16 15974 // result: (SRLconst (SLLconst <types.UInt32> x [16]) [c+16]) 15975 for { 15976 x := v.Args[0] 15977 v_1 := v.Args[1] 15978 if v_1.Op != OpConst64 { 15979 break 15980 } 15981 c := v_1.AuxInt 15982 if !(uint64(c) < 16) { 15983 break 15984 } 15985 v.reset(OpARMSRLconst) 15986 v.AuxInt = c + 16 15987 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 15988 v0.AuxInt = 16 15989 v0.AddArg(x) 15990 v.AddArg(v0) 15991 return true 15992 } 15993 // match: (Rsh16Ux64 _ (Const64 [c])) 15994 // cond: uint64(c) >= 16 15995 // result: (Const16 [0]) 15996 for { 15997 v_1 := v.Args[1] 15998 if v_1.Op != OpConst64 { 15999 break 16000 } 16001 c := v_1.AuxInt 16002 if !(uint64(c) >= 16) { 16003 break 16004 } 16005 v.reset(OpConst16) 16006 v.AuxInt = 0 16007 return true 16008 } 16009 return false 16010 } 16011 func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { 16012 b := v.Block 16013 _ = b 16014 types := &b.Func.Config.Types 16015 _ = types 16016 // match: (Rsh16Ux8 x y) 16017 // cond: 16018 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 16019 for { 16020 x := v.Args[0] 16021 y := v.Args[1] 16022 v.reset(OpARMSRL) 16023 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16024 v0.AddArg(x) 16025 v.AddArg(v0) 16026 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16027 v1.AddArg(y) 16028 v.AddArg(v1) 16029 return true 16030 } 16031 } 16032 func rewriteValueARM_OpRsh16x16_0(v *Value) bool { 16033 b := v.Block 16034 _ = b 16035 types := &b.Func.Config.Types 16036 _ = types 16037 // match: (Rsh16x16 x y) 16038 // cond: 16039 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16040 for { 16041 x := v.Args[0] 16042 y := v.Args[1] 16043 v.reset(OpARMSRAcond) 16044 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 16045 v0.AddArg(x) 16046 v.AddArg(v0) 16047 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16048 v1.AddArg(y) 16049 v.AddArg(v1) 16050 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16051 v2.AuxInt = 256 16052 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16053 v3.AddArg(y) 16054 v2.AddArg(v3) 16055 v.AddArg(v2) 16056 return true 16057 } 16058 } 16059 func rewriteValueARM_OpRsh16x32_0(v *Value) bool { 16060 b := v.Block 16061 _ = b 16062 types := &b.Func.Config.Types 16063 _ = types 16064 // match: (Rsh16x32 x y) 16065 // cond: 16066 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 16067 for { 16068 x := v.Args[0] 16069 y := v.Args[1] 16070 v.reset(OpARMSRAcond) 16071 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 16072 v0.AddArg(x) 16073 v.AddArg(v0) 16074 v.AddArg(y) 16075 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16076 v1.AuxInt = 256 16077 v1.AddArg(y) 16078 v.AddArg(v1) 16079 return true 16080 } 16081 } 16082 func rewriteValueARM_OpRsh16x64_0(v *Value) bool { 16083 b := v.Block 16084 _ = b 16085 types := &b.Func.Config.Types 16086 _ = types 16087 // match: (Rsh16x64 x (Const64 [c])) 16088 // cond: uint64(c) < 16 16089 // result: (SRAconst (SLLconst <types.UInt32> x [16]) [c+16]) 16090 for { 16091 x := v.Args[0] 16092 v_1 := v.Args[1] 16093 if v_1.Op != OpConst64 { 16094 break 16095 } 16096 c := v_1.AuxInt 16097 if !(uint64(c) < 16) { 16098 break 16099 } 16100 v.reset(OpARMSRAconst) 16101 v.AuxInt = c + 16 16102 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16103 v0.AuxInt = 16 16104 v0.AddArg(x) 16105 v.AddArg(v0) 16106 return true 16107 } 16108 // match: (Rsh16x64 x (Const64 [c])) 16109 // cond: uint64(c) >= 16 16110 // result: (SRAconst (SLLconst <types.UInt32> x [16]) [31]) 16111 for { 16112 x := v.Args[0] 16113 v_1 := v.Args[1] 16114 if v_1.Op != OpConst64 { 16115 break 16116 } 16117 c := v_1.AuxInt 16118 if !(uint64(c) >= 16) { 16119 break 16120 } 16121 v.reset(OpARMSRAconst) 16122 v.AuxInt = 31 16123 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16124 v0.AuxInt = 16 16125 v0.AddArg(x) 16126 v.AddArg(v0) 16127 return true 16128 } 16129 return false 16130 } 16131 func rewriteValueARM_OpRsh16x8_0(v *Value) bool { 16132 b := v.Block 16133 _ = b 16134 types := &b.Func.Config.Types 16135 _ = types 16136 // match: (Rsh16x8 x y) 16137 // cond: 16138 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 16139 for { 16140 x := v.Args[0] 16141 y := v.Args[1] 16142 v.reset(OpARMSRA) 16143 v0 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 16144 v0.AddArg(x) 16145 v.AddArg(v0) 16146 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16147 v1.AddArg(y) 16148 v.AddArg(v1) 16149 return true 16150 } 16151 } 16152 func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { 16153 b := v.Block 16154 _ = b 16155 types := &b.Func.Config.Types 16156 _ = types 16157 // match: (Rsh32Ux16 x y) 16158 // cond: 16159 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 16160 for { 16161 x := v.Args[0] 16162 y := v.Args[1] 16163 v.reset(OpARMCMOVWHSconst) 16164 v.AuxInt = 0 16165 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16166 v0.AddArg(x) 16167 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16168 v1.AddArg(y) 16169 v0.AddArg(v1) 16170 v.AddArg(v0) 16171 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16172 v2.AuxInt = 256 16173 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16174 v3.AddArg(y) 16175 v2.AddArg(v3) 16176 v.AddArg(v2) 16177 return true 16178 } 16179 } 16180 func rewriteValueARM_OpRsh32Ux32_0(v *Value) bool { 16181 b := v.Block 16182 _ = b 16183 // match: (Rsh32Ux32 x y) 16184 // cond: 16185 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 16186 for { 16187 x := v.Args[0] 16188 y := v.Args[1] 16189 v.reset(OpARMCMOVWHSconst) 16190 v.AuxInt = 0 16191 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16192 v0.AddArg(x) 16193 v0.AddArg(y) 16194 v.AddArg(v0) 16195 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16196 v1.AuxInt = 256 16197 v1.AddArg(y) 16198 v.AddArg(v1) 16199 return true 16200 } 16201 } 16202 func rewriteValueARM_OpRsh32Ux64_0(v *Value) bool { 16203 // match: (Rsh32Ux64 x (Const64 [c])) 16204 // cond: uint64(c) < 32 16205 // result: (SRLconst x [c]) 16206 for { 16207 x := v.Args[0] 16208 v_1 := v.Args[1] 16209 if v_1.Op != OpConst64 { 16210 break 16211 } 16212 c := v_1.AuxInt 16213 if !(uint64(c) < 32) { 16214 break 16215 } 16216 v.reset(OpARMSRLconst) 16217 v.AuxInt = c 16218 v.AddArg(x) 16219 return true 16220 } 16221 // match: (Rsh32Ux64 _ (Const64 [c])) 16222 // cond: uint64(c) >= 32 16223 // result: (Const32 [0]) 16224 for { 16225 v_1 := v.Args[1] 16226 if v_1.Op != OpConst64 { 16227 break 16228 } 16229 c := v_1.AuxInt 16230 if !(uint64(c) >= 32) { 16231 break 16232 } 16233 v.reset(OpConst32) 16234 v.AuxInt = 0 16235 return true 16236 } 16237 return false 16238 } 16239 func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { 16240 b := v.Block 16241 _ = b 16242 types := &b.Func.Config.Types 16243 _ = types 16244 // match: (Rsh32Ux8 x y) 16245 // cond: 16246 // result: (SRL x (ZeroExt8to32 y)) 16247 for { 16248 x := v.Args[0] 16249 y := v.Args[1] 16250 v.reset(OpARMSRL) 16251 v.AddArg(x) 16252 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16253 v0.AddArg(y) 16254 v.AddArg(v0) 16255 return true 16256 } 16257 } 16258 func rewriteValueARM_OpRsh32x16_0(v *Value) bool { 16259 b := v.Block 16260 _ = b 16261 types := &b.Func.Config.Types 16262 _ = types 16263 // match: (Rsh32x16 x y) 16264 // cond: 16265 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16266 for { 16267 x := v.Args[0] 16268 y := v.Args[1] 16269 v.reset(OpARMSRAcond) 16270 v.AddArg(x) 16271 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16272 v0.AddArg(y) 16273 v.AddArg(v0) 16274 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16275 v1.AuxInt = 256 16276 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16277 v2.AddArg(y) 16278 v1.AddArg(v2) 16279 v.AddArg(v1) 16280 return true 16281 } 16282 } 16283 func rewriteValueARM_OpRsh32x32_0(v *Value) bool { 16284 b := v.Block 16285 _ = b 16286 // match: (Rsh32x32 x y) 16287 // cond: 16288 // result: (SRAcond x y (CMPconst [256] y)) 16289 for { 16290 x := v.Args[0] 16291 y := v.Args[1] 16292 v.reset(OpARMSRAcond) 16293 v.AddArg(x) 16294 v.AddArg(y) 16295 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16296 v0.AuxInt = 256 16297 v0.AddArg(y) 16298 v.AddArg(v0) 16299 return true 16300 } 16301 } 16302 func rewriteValueARM_OpRsh32x64_0(v *Value) bool { 16303 // match: (Rsh32x64 x (Const64 [c])) 16304 // cond: uint64(c) < 32 16305 // result: (SRAconst x [c]) 16306 for { 16307 x := v.Args[0] 16308 v_1 := v.Args[1] 16309 if v_1.Op != OpConst64 { 16310 break 16311 } 16312 c := v_1.AuxInt 16313 if !(uint64(c) < 32) { 16314 break 16315 } 16316 v.reset(OpARMSRAconst) 16317 v.AuxInt = c 16318 v.AddArg(x) 16319 return true 16320 } 16321 // match: (Rsh32x64 x (Const64 [c])) 16322 // cond: uint64(c) >= 32 16323 // result: (SRAconst x [31]) 16324 for { 16325 x := v.Args[0] 16326 v_1 := v.Args[1] 16327 if v_1.Op != OpConst64 { 16328 break 16329 } 16330 c := v_1.AuxInt 16331 if !(uint64(c) >= 32) { 16332 break 16333 } 16334 v.reset(OpARMSRAconst) 16335 v.AuxInt = 31 16336 v.AddArg(x) 16337 return true 16338 } 16339 return false 16340 } 16341 func rewriteValueARM_OpRsh32x8_0(v *Value) bool { 16342 b := v.Block 16343 _ = b 16344 types := &b.Func.Config.Types 16345 _ = types 16346 // match: (Rsh32x8 x y) 16347 // cond: 16348 // result: (SRA x (ZeroExt8to32 y)) 16349 for { 16350 x := v.Args[0] 16351 y := v.Args[1] 16352 v.reset(OpARMSRA) 16353 v.AddArg(x) 16354 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16355 v0.AddArg(y) 16356 v.AddArg(v0) 16357 return true 16358 } 16359 } 16360 func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { 16361 b := v.Block 16362 _ = b 16363 types := &b.Func.Config.Types 16364 _ = types 16365 // match: (Rsh8Ux16 x y) 16366 // cond: 16367 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 16368 for { 16369 x := v.Args[0] 16370 y := v.Args[1] 16371 v.reset(OpARMCMOVWHSconst) 16372 v.AuxInt = 0 16373 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16374 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16375 v1.AddArg(x) 16376 v0.AddArg(v1) 16377 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16378 v2.AddArg(y) 16379 v0.AddArg(v2) 16380 v.AddArg(v0) 16381 v3 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16382 v3.AuxInt = 256 16383 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16384 v4.AddArg(y) 16385 v3.AddArg(v4) 16386 v.AddArg(v3) 16387 return true 16388 } 16389 } 16390 func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { 16391 b := v.Block 16392 _ = b 16393 types := &b.Func.Config.Types 16394 _ = types 16395 // match: (Rsh8Ux32 x y) 16396 // cond: 16397 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 16398 for { 16399 x := v.Args[0] 16400 y := v.Args[1] 16401 v.reset(OpARMCMOVWHSconst) 16402 v.AuxInt = 0 16403 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16404 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16405 v1.AddArg(x) 16406 v0.AddArg(v1) 16407 v0.AddArg(y) 16408 v.AddArg(v0) 16409 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16410 v2.AuxInt = 256 16411 v2.AddArg(y) 16412 v.AddArg(v2) 16413 return true 16414 } 16415 } 16416 func rewriteValueARM_OpRsh8Ux64_0(v *Value) bool { 16417 b := v.Block 16418 _ = b 16419 types := &b.Func.Config.Types 16420 _ = types 16421 // match: (Rsh8Ux64 x (Const64 [c])) 16422 // cond: uint64(c) < 8 16423 // result: (SRLconst (SLLconst <types.UInt32> x [24]) [c+24]) 16424 for { 16425 x := v.Args[0] 16426 v_1 := v.Args[1] 16427 if v_1.Op != OpConst64 { 16428 break 16429 } 16430 c := v_1.AuxInt 16431 if !(uint64(c) < 8) { 16432 break 16433 } 16434 v.reset(OpARMSRLconst) 16435 v.AuxInt = c + 24 16436 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16437 v0.AuxInt = 24 16438 v0.AddArg(x) 16439 v.AddArg(v0) 16440 return true 16441 } 16442 // match: (Rsh8Ux64 _ (Const64 [c])) 16443 // cond: uint64(c) >= 8 16444 // result: (Const8 [0]) 16445 for { 16446 v_1 := v.Args[1] 16447 if v_1.Op != OpConst64 { 16448 break 16449 } 16450 c := v_1.AuxInt 16451 if !(uint64(c) >= 8) { 16452 break 16453 } 16454 v.reset(OpConst8) 16455 v.AuxInt = 0 16456 return true 16457 } 16458 return false 16459 } 16460 func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { 16461 b := v.Block 16462 _ = b 16463 types := &b.Func.Config.Types 16464 _ = types 16465 // match: (Rsh8Ux8 x y) 16466 // cond: 16467 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 16468 for { 16469 x := v.Args[0] 16470 y := v.Args[1] 16471 v.reset(OpARMSRL) 16472 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16473 v0.AddArg(x) 16474 v.AddArg(v0) 16475 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16476 v1.AddArg(y) 16477 v.AddArg(v1) 16478 return true 16479 } 16480 } 16481 func rewriteValueARM_OpRsh8x16_0(v *Value) bool { 16482 b := v.Block 16483 _ = b 16484 types := &b.Func.Config.Types 16485 _ = types 16486 // match: (Rsh8x16 x y) 16487 // cond: 16488 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 16489 for { 16490 x := v.Args[0] 16491 y := v.Args[1] 16492 v.reset(OpARMSRAcond) 16493 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 16494 v0.AddArg(x) 16495 v.AddArg(v0) 16496 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16497 v1.AddArg(y) 16498 v.AddArg(v1) 16499 v2 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16500 v2.AuxInt = 256 16501 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 16502 v3.AddArg(y) 16503 v2.AddArg(v3) 16504 v.AddArg(v2) 16505 return true 16506 } 16507 } 16508 func rewriteValueARM_OpRsh8x32_0(v *Value) bool { 16509 b := v.Block 16510 _ = b 16511 types := &b.Func.Config.Types 16512 _ = types 16513 // match: (Rsh8x32 x y) 16514 // cond: 16515 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 16516 for { 16517 x := v.Args[0] 16518 y := v.Args[1] 16519 v.reset(OpARMSRAcond) 16520 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 16521 v0.AddArg(x) 16522 v.AddArg(v0) 16523 v.AddArg(y) 16524 v1 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 16525 v1.AuxInt = 256 16526 v1.AddArg(y) 16527 v.AddArg(v1) 16528 return true 16529 } 16530 } 16531 func rewriteValueARM_OpRsh8x64_0(v *Value) bool { 16532 b := v.Block 16533 _ = b 16534 types := &b.Func.Config.Types 16535 _ = types 16536 // match: (Rsh8x64 x (Const64 [c])) 16537 // cond: uint64(c) < 8 16538 // result: (SRAconst (SLLconst <types.UInt32> x [24]) [c+24]) 16539 for { 16540 x := v.Args[0] 16541 v_1 := v.Args[1] 16542 if v_1.Op != OpConst64 { 16543 break 16544 } 16545 c := v_1.AuxInt 16546 if !(uint64(c) < 8) { 16547 break 16548 } 16549 v.reset(OpARMSRAconst) 16550 v.AuxInt = c + 24 16551 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16552 v0.AuxInt = 24 16553 v0.AddArg(x) 16554 v.AddArg(v0) 16555 return true 16556 } 16557 // match: (Rsh8x64 x (Const64 [c])) 16558 // cond: uint64(c) >= 8 16559 // result: (SRAconst (SLLconst <types.UInt32> x [24]) [31]) 16560 for { 16561 x := v.Args[0] 16562 v_1 := v.Args[1] 16563 if v_1.Op != OpConst64 { 16564 break 16565 } 16566 c := v_1.AuxInt 16567 if !(uint64(c) >= 8) { 16568 break 16569 } 16570 v.reset(OpARMSRAconst) 16571 v.AuxInt = 31 16572 v0 := b.NewValue0(v.Pos, OpARMSLLconst, types.UInt32) 16573 v0.AuxInt = 24 16574 v0.AddArg(x) 16575 v.AddArg(v0) 16576 return true 16577 } 16578 return false 16579 } 16580 func rewriteValueARM_OpRsh8x8_0(v *Value) bool { 16581 b := v.Block 16582 _ = b 16583 types := &b.Func.Config.Types 16584 _ = types 16585 // match: (Rsh8x8 x y) 16586 // cond: 16587 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 16588 for { 16589 x := v.Args[0] 16590 y := v.Args[1] 16591 v.reset(OpARMSRA) 16592 v0 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 16593 v0.AddArg(x) 16594 v.AddArg(v0) 16595 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 16596 v1.AddArg(y) 16597 v.AddArg(v1) 16598 return true 16599 } 16600 } 16601 func rewriteValueARM_OpSelect0_0(v *Value) bool { 16602 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 16603 // cond: 16604 // result: x 16605 for { 16606 v_0 := v.Args[0] 16607 if v_0.Op != OpARMCALLudiv { 16608 break 16609 } 16610 x := v_0.Args[0] 16611 v_0_1 := v_0.Args[1] 16612 if v_0_1.Op != OpARMMOVWconst { 16613 break 16614 } 16615 if v_0_1.AuxInt != 1 { 16616 break 16617 } 16618 v.reset(OpCopy) 16619 v.Type = x.Type 16620 v.AddArg(x) 16621 return true 16622 } 16623 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 16624 // cond: isPowerOfTwo(c) 16625 // result: (SRLconst [log2(c)] x) 16626 for { 16627 v_0 := v.Args[0] 16628 if v_0.Op != OpARMCALLudiv { 16629 break 16630 } 16631 x := v_0.Args[0] 16632 v_0_1 := v_0.Args[1] 16633 if v_0_1.Op != OpARMMOVWconst { 16634 break 16635 } 16636 c := v_0_1.AuxInt 16637 if !(isPowerOfTwo(c)) { 16638 break 16639 } 16640 v.reset(OpARMSRLconst) 16641 v.AuxInt = log2(c) 16642 v.AddArg(x) 16643 return true 16644 } 16645 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 16646 // cond: 16647 // result: (MOVWconst [int64(uint32(c)/uint32(d))]) 16648 for { 16649 v_0 := v.Args[0] 16650 if v_0.Op != OpARMCALLudiv { 16651 break 16652 } 16653 v_0_0 := v_0.Args[0] 16654 if v_0_0.Op != OpARMMOVWconst { 16655 break 16656 } 16657 c := v_0_0.AuxInt 16658 v_0_1 := v_0.Args[1] 16659 if v_0_1.Op != OpARMMOVWconst { 16660 break 16661 } 16662 d := v_0_1.AuxInt 16663 v.reset(OpARMMOVWconst) 16664 v.AuxInt = int64(uint32(c) / uint32(d)) 16665 return true 16666 } 16667 return false 16668 } 16669 func rewriteValueARM_OpSelect1_0(v *Value) bool { 16670 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 16671 // cond: 16672 // result: (MOVWconst [0]) 16673 for { 16674 v_0 := v.Args[0] 16675 if v_0.Op != OpARMCALLudiv { 16676 break 16677 } 16678 v_0_1 := v_0.Args[1] 16679 if v_0_1.Op != OpARMMOVWconst { 16680 break 16681 } 16682 if v_0_1.AuxInt != 1 { 16683 break 16684 } 16685 v.reset(OpARMMOVWconst) 16686 v.AuxInt = 0 16687 return true 16688 } 16689 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 16690 // cond: isPowerOfTwo(c) 16691 // result: (ANDconst [c-1] x) 16692 for { 16693 v_0 := v.Args[0] 16694 if v_0.Op != OpARMCALLudiv { 16695 break 16696 } 16697 x := v_0.Args[0] 16698 v_0_1 := v_0.Args[1] 16699 if v_0_1.Op != OpARMMOVWconst { 16700 break 16701 } 16702 c := v_0_1.AuxInt 16703 if !(isPowerOfTwo(c)) { 16704 break 16705 } 16706 v.reset(OpARMANDconst) 16707 v.AuxInt = c - 1 16708 v.AddArg(x) 16709 return true 16710 } 16711 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 16712 // cond: 16713 // result: (MOVWconst [int64(uint32(c)%uint32(d))]) 16714 for { 16715 v_0 := v.Args[0] 16716 if v_0.Op != OpARMCALLudiv { 16717 break 16718 } 16719 v_0_0 := v_0.Args[0] 16720 if v_0_0.Op != OpARMMOVWconst { 16721 break 16722 } 16723 c := v_0_0.AuxInt 16724 v_0_1 := v_0.Args[1] 16725 if v_0_1.Op != OpARMMOVWconst { 16726 break 16727 } 16728 d := v_0_1.AuxInt 16729 v.reset(OpARMMOVWconst) 16730 v.AuxInt = int64(uint32(c) % uint32(d)) 16731 return true 16732 } 16733 return false 16734 } 16735 func rewriteValueARM_OpSignExt16to32_0(v *Value) bool { 16736 // match: (SignExt16to32 x) 16737 // cond: 16738 // result: (MOVHreg x) 16739 for { 16740 x := v.Args[0] 16741 v.reset(OpARMMOVHreg) 16742 v.AddArg(x) 16743 return true 16744 } 16745 } 16746 func rewriteValueARM_OpSignExt8to16_0(v *Value) bool { 16747 // match: (SignExt8to16 x) 16748 // cond: 16749 // result: (MOVBreg x) 16750 for { 16751 x := v.Args[0] 16752 v.reset(OpARMMOVBreg) 16753 v.AddArg(x) 16754 return true 16755 } 16756 } 16757 func rewriteValueARM_OpSignExt8to32_0(v *Value) bool { 16758 // match: (SignExt8to32 x) 16759 // cond: 16760 // result: (MOVBreg x) 16761 for { 16762 x := v.Args[0] 16763 v.reset(OpARMMOVBreg) 16764 v.AddArg(x) 16765 return true 16766 } 16767 } 16768 func rewriteValueARM_OpSignmask_0(v *Value) bool { 16769 // match: (Signmask x) 16770 // cond: 16771 // result: (SRAconst x [31]) 16772 for { 16773 x := v.Args[0] 16774 v.reset(OpARMSRAconst) 16775 v.AuxInt = 31 16776 v.AddArg(x) 16777 return true 16778 } 16779 } 16780 func rewriteValueARM_OpSlicemask_0(v *Value) bool { 16781 b := v.Block 16782 _ = b 16783 // match: (Slicemask <t> x) 16784 // cond: 16785 // result: (SRAconst (RSBconst <t> [0] x) [31]) 16786 for { 16787 t := v.Type 16788 x := v.Args[0] 16789 v.reset(OpARMSRAconst) 16790 v.AuxInt = 31 16791 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 16792 v0.AuxInt = 0 16793 v0.AddArg(x) 16794 v.AddArg(v0) 16795 return true 16796 } 16797 } 16798 func rewriteValueARM_OpSqrt_0(v *Value) bool { 16799 // match: (Sqrt x) 16800 // cond: 16801 // result: (SQRTD x) 16802 for { 16803 x := v.Args[0] 16804 v.reset(OpARMSQRTD) 16805 v.AddArg(x) 16806 return true 16807 } 16808 } 16809 func rewriteValueARM_OpStaticCall_0(v *Value) bool { 16810 // match: (StaticCall [argwid] {target} mem) 16811 // cond: 16812 // result: (CALLstatic [argwid] {target} mem) 16813 for { 16814 argwid := v.AuxInt 16815 target := v.Aux 16816 mem := v.Args[0] 16817 v.reset(OpARMCALLstatic) 16818 v.AuxInt = argwid 16819 v.Aux = target 16820 v.AddArg(mem) 16821 return true 16822 } 16823 } 16824 func rewriteValueARM_OpStore_0(v *Value) bool { 16825 // match: (Store {t} ptr val mem) 16826 // cond: t.(Type).Size() == 1 16827 // result: (MOVBstore ptr val mem) 16828 for { 16829 t := v.Aux 16830 ptr := v.Args[0] 16831 val := v.Args[1] 16832 mem := v.Args[2] 16833 if !(t.(Type).Size() == 1) { 16834 break 16835 } 16836 v.reset(OpARMMOVBstore) 16837 v.AddArg(ptr) 16838 v.AddArg(val) 16839 v.AddArg(mem) 16840 return true 16841 } 16842 // match: (Store {t} ptr val mem) 16843 // cond: t.(Type).Size() == 2 16844 // result: (MOVHstore ptr val mem) 16845 for { 16846 t := v.Aux 16847 ptr := v.Args[0] 16848 val := v.Args[1] 16849 mem := v.Args[2] 16850 if !(t.(Type).Size() == 2) { 16851 break 16852 } 16853 v.reset(OpARMMOVHstore) 16854 v.AddArg(ptr) 16855 v.AddArg(val) 16856 v.AddArg(mem) 16857 return true 16858 } 16859 // match: (Store {t} ptr val mem) 16860 // cond: t.(Type).Size() == 4 && !is32BitFloat(val.Type) 16861 // result: (MOVWstore ptr val mem) 16862 for { 16863 t := v.Aux 16864 ptr := v.Args[0] 16865 val := v.Args[1] 16866 mem := v.Args[2] 16867 if !(t.(Type).Size() == 4 && !is32BitFloat(val.Type)) { 16868 break 16869 } 16870 v.reset(OpARMMOVWstore) 16871 v.AddArg(ptr) 16872 v.AddArg(val) 16873 v.AddArg(mem) 16874 return true 16875 } 16876 // match: (Store {t} ptr val mem) 16877 // cond: t.(Type).Size() == 4 && is32BitFloat(val.Type) 16878 // result: (MOVFstore ptr val mem) 16879 for { 16880 t := v.Aux 16881 ptr := v.Args[0] 16882 val := v.Args[1] 16883 mem := v.Args[2] 16884 if !(t.(Type).Size() == 4 && is32BitFloat(val.Type)) { 16885 break 16886 } 16887 v.reset(OpARMMOVFstore) 16888 v.AddArg(ptr) 16889 v.AddArg(val) 16890 v.AddArg(mem) 16891 return true 16892 } 16893 // match: (Store {t} ptr val mem) 16894 // cond: t.(Type).Size() == 8 && is64BitFloat(val.Type) 16895 // result: (MOVDstore ptr val mem) 16896 for { 16897 t := v.Aux 16898 ptr := v.Args[0] 16899 val := v.Args[1] 16900 mem := v.Args[2] 16901 if !(t.(Type).Size() == 8 && is64BitFloat(val.Type)) { 16902 break 16903 } 16904 v.reset(OpARMMOVDstore) 16905 v.AddArg(ptr) 16906 v.AddArg(val) 16907 v.AddArg(mem) 16908 return true 16909 } 16910 return false 16911 } 16912 func rewriteValueARM_OpSub16_0(v *Value) bool { 16913 // match: (Sub16 x y) 16914 // cond: 16915 // result: (SUB x y) 16916 for { 16917 x := v.Args[0] 16918 y := v.Args[1] 16919 v.reset(OpARMSUB) 16920 v.AddArg(x) 16921 v.AddArg(y) 16922 return true 16923 } 16924 } 16925 func rewriteValueARM_OpSub32_0(v *Value) bool { 16926 // match: (Sub32 x y) 16927 // cond: 16928 // result: (SUB x y) 16929 for { 16930 x := v.Args[0] 16931 y := v.Args[1] 16932 v.reset(OpARMSUB) 16933 v.AddArg(x) 16934 v.AddArg(y) 16935 return true 16936 } 16937 } 16938 func rewriteValueARM_OpSub32F_0(v *Value) bool { 16939 // match: (Sub32F x y) 16940 // cond: 16941 // result: (SUBF x y) 16942 for { 16943 x := v.Args[0] 16944 y := v.Args[1] 16945 v.reset(OpARMSUBF) 16946 v.AddArg(x) 16947 v.AddArg(y) 16948 return true 16949 } 16950 } 16951 func rewriteValueARM_OpSub32carry_0(v *Value) bool { 16952 // match: (Sub32carry x y) 16953 // cond: 16954 // result: (SUBS x y) 16955 for { 16956 x := v.Args[0] 16957 y := v.Args[1] 16958 v.reset(OpARMSUBS) 16959 v.AddArg(x) 16960 v.AddArg(y) 16961 return true 16962 } 16963 } 16964 func rewriteValueARM_OpSub32withcarry_0(v *Value) bool { 16965 // match: (Sub32withcarry x y c) 16966 // cond: 16967 // result: (SBC x y c) 16968 for { 16969 x := v.Args[0] 16970 y := v.Args[1] 16971 c := v.Args[2] 16972 v.reset(OpARMSBC) 16973 v.AddArg(x) 16974 v.AddArg(y) 16975 v.AddArg(c) 16976 return true 16977 } 16978 } 16979 func rewriteValueARM_OpSub64F_0(v *Value) bool { 16980 // match: (Sub64F x y) 16981 // cond: 16982 // result: (SUBD x y) 16983 for { 16984 x := v.Args[0] 16985 y := v.Args[1] 16986 v.reset(OpARMSUBD) 16987 v.AddArg(x) 16988 v.AddArg(y) 16989 return true 16990 } 16991 } 16992 func rewriteValueARM_OpSub8_0(v *Value) bool { 16993 // match: (Sub8 x y) 16994 // cond: 16995 // result: (SUB x y) 16996 for { 16997 x := v.Args[0] 16998 y := v.Args[1] 16999 v.reset(OpARMSUB) 17000 v.AddArg(x) 17001 v.AddArg(y) 17002 return true 17003 } 17004 } 17005 func rewriteValueARM_OpSubPtr_0(v *Value) bool { 17006 // match: (SubPtr x y) 17007 // cond: 17008 // result: (SUB x y) 17009 for { 17010 x := v.Args[0] 17011 y := v.Args[1] 17012 v.reset(OpARMSUB) 17013 v.AddArg(x) 17014 v.AddArg(y) 17015 return true 17016 } 17017 } 17018 func rewriteValueARM_OpTrunc16to8_0(v *Value) bool { 17019 // match: (Trunc16to8 x) 17020 // cond: 17021 // result: x 17022 for { 17023 x := v.Args[0] 17024 v.reset(OpCopy) 17025 v.Type = x.Type 17026 v.AddArg(x) 17027 return true 17028 } 17029 } 17030 func rewriteValueARM_OpTrunc32to16_0(v *Value) bool { 17031 // match: (Trunc32to16 x) 17032 // cond: 17033 // result: x 17034 for { 17035 x := v.Args[0] 17036 v.reset(OpCopy) 17037 v.Type = x.Type 17038 v.AddArg(x) 17039 return true 17040 } 17041 } 17042 func rewriteValueARM_OpTrunc32to8_0(v *Value) bool { 17043 // match: (Trunc32to8 x) 17044 // cond: 17045 // result: x 17046 for { 17047 x := v.Args[0] 17048 v.reset(OpCopy) 17049 v.Type = x.Type 17050 v.AddArg(x) 17051 return true 17052 } 17053 } 17054 func rewriteValueARM_OpXor16_0(v *Value) bool { 17055 // match: (Xor16 x y) 17056 // cond: 17057 // result: (XOR x y) 17058 for { 17059 x := v.Args[0] 17060 y := v.Args[1] 17061 v.reset(OpARMXOR) 17062 v.AddArg(x) 17063 v.AddArg(y) 17064 return true 17065 } 17066 } 17067 func rewriteValueARM_OpXor32_0(v *Value) bool { 17068 // match: (Xor32 x y) 17069 // cond: 17070 // result: (XOR x y) 17071 for { 17072 x := v.Args[0] 17073 y := v.Args[1] 17074 v.reset(OpARMXOR) 17075 v.AddArg(x) 17076 v.AddArg(y) 17077 return true 17078 } 17079 } 17080 func rewriteValueARM_OpXor8_0(v *Value) bool { 17081 // match: (Xor8 x y) 17082 // cond: 17083 // result: (XOR x y) 17084 for { 17085 x := v.Args[0] 17086 y := v.Args[1] 17087 v.reset(OpARMXOR) 17088 v.AddArg(x) 17089 v.AddArg(y) 17090 return true 17091 } 17092 } 17093 func rewriteValueARM_OpZero_0(v *Value) bool { 17094 b := v.Block 17095 _ = b 17096 config := b.Func.Config 17097 _ = config 17098 types := &b.Func.Config.Types 17099 _ = types 17100 // match: (Zero [0] _ mem) 17101 // cond: 17102 // result: mem 17103 for { 17104 if v.AuxInt != 0 { 17105 break 17106 } 17107 mem := v.Args[1] 17108 v.reset(OpCopy) 17109 v.Type = mem.Type 17110 v.AddArg(mem) 17111 return true 17112 } 17113 // match: (Zero [1] ptr mem) 17114 // cond: 17115 // result: (MOVBstore ptr (MOVWconst [0]) mem) 17116 for { 17117 if v.AuxInt != 1 { 17118 break 17119 } 17120 ptr := v.Args[0] 17121 mem := v.Args[1] 17122 v.reset(OpARMMOVBstore) 17123 v.AddArg(ptr) 17124 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17125 v0.AuxInt = 0 17126 v.AddArg(v0) 17127 v.AddArg(mem) 17128 return true 17129 } 17130 // match: (Zero [2] {t} ptr mem) 17131 // cond: t.(Type).Alignment()%2 == 0 17132 // result: (MOVHstore ptr (MOVWconst [0]) mem) 17133 for { 17134 if v.AuxInt != 2 { 17135 break 17136 } 17137 t := v.Aux 17138 ptr := v.Args[0] 17139 mem := v.Args[1] 17140 if !(t.(Type).Alignment()%2 == 0) { 17141 break 17142 } 17143 v.reset(OpARMMOVHstore) 17144 v.AddArg(ptr) 17145 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17146 v0.AuxInt = 0 17147 v.AddArg(v0) 17148 v.AddArg(mem) 17149 return true 17150 } 17151 // match: (Zero [2] ptr mem) 17152 // cond: 17153 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 17154 for { 17155 if v.AuxInt != 2 { 17156 break 17157 } 17158 ptr := v.Args[0] 17159 mem := v.Args[1] 17160 v.reset(OpARMMOVBstore) 17161 v.AuxInt = 1 17162 v.AddArg(ptr) 17163 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17164 v0.AuxInt = 0 17165 v.AddArg(v0) 17166 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17167 v1.AuxInt = 0 17168 v1.AddArg(ptr) 17169 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17170 v2.AuxInt = 0 17171 v1.AddArg(v2) 17172 v1.AddArg(mem) 17173 v.AddArg(v1) 17174 return true 17175 } 17176 // match: (Zero [4] {t} ptr mem) 17177 // cond: t.(Type).Alignment()%4 == 0 17178 // result: (MOVWstore ptr (MOVWconst [0]) mem) 17179 for { 17180 if v.AuxInt != 4 { 17181 break 17182 } 17183 t := v.Aux 17184 ptr := v.Args[0] 17185 mem := v.Args[1] 17186 if !(t.(Type).Alignment()%4 == 0) { 17187 break 17188 } 17189 v.reset(OpARMMOVWstore) 17190 v.AddArg(ptr) 17191 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17192 v0.AuxInt = 0 17193 v.AddArg(v0) 17194 v.AddArg(mem) 17195 return true 17196 } 17197 // match: (Zero [4] {t} ptr mem) 17198 // cond: t.(Type).Alignment()%2 == 0 17199 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 17200 for { 17201 if v.AuxInt != 4 { 17202 break 17203 } 17204 t := v.Aux 17205 ptr := v.Args[0] 17206 mem := v.Args[1] 17207 if !(t.(Type).Alignment()%2 == 0) { 17208 break 17209 } 17210 v.reset(OpARMMOVHstore) 17211 v.AuxInt = 2 17212 v.AddArg(ptr) 17213 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17214 v0.AuxInt = 0 17215 v.AddArg(v0) 17216 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, TypeMem) 17217 v1.AuxInt = 0 17218 v1.AddArg(ptr) 17219 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17220 v2.AuxInt = 0 17221 v1.AddArg(v2) 17222 v1.AddArg(mem) 17223 v.AddArg(v1) 17224 return true 17225 } 17226 // match: (Zero [4] ptr mem) 17227 // cond: 17228 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 17229 for { 17230 if v.AuxInt != 4 { 17231 break 17232 } 17233 ptr := v.Args[0] 17234 mem := v.Args[1] 17235 v.reset(OpARMMOVBstore) 17236 v.AuxInt = 3 17237 v.AddArg(ptr) 17238 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17239 v0.AuxInt = 0 17240 v.AddArg(v0) 17241 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17242 v1.AuxInt = 2 17243 v1.AddArg(ptr) 17244 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17245 v2.AuxInt = 0 17246 v1.AddArg(v2) 17247 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17248 v3.AuxInt = 1 17249 v3.AddArg(ptr) 17250 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17251 v4.AuxInt = 0 17252 v3.AddArg(v4) 17253 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17254 v5.AuxInt = 0 17255 v5.AddArg(ptr) 17256 v6 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17257 v6.AuxInt = 0 17258 v5.AddArg(v6) 17259 v5.AddArg(mem) 17260 v3.AddArg(v5) 17261 v1.AddArg(v3) 17262 v.AddArg(v1) 17263 return true 17264 } 17265 // match: (Zero [3] ptr mem) 17266 // cond: 17267 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 17268 for { 17269 if v.AuxInt != 3 { 17270 break 17271 } 17272 ptr := v.Args[0] 17273 mem := v.Args[1] 17274 v.reset(OpARMMOVBstore) 17275 v.AuxInt = 2 17276 v.AddArg(ptr) 17277 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17278 v0.AuxInt = 0 17279 v.AddArg(v0) 17280 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17281 v1.AuxInt = 1 17282 v1.AddArg(ptr) 17283 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17284 v2.AuxInt = 0 17285 v1.AddArg(v2) 17286 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, TypeMem) 17287 v3.AuxInt = 0 17288 v3.AddArg(ptr) 17289 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17290 v4.AuxInt = 0 17291 v3.AddArg(v4) 17292 v3.AddArg(mem) 17293 v1.AddArg(v3) 17294 v.AddArg(v1) 17295 return true 17296 } 17297 // match: (Zero [s] {t} ptr mem) 17298 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(Type).Alignment()%4 == 0 && !config.noDuffDevice 17299 // result: (DUFFZERO [4 * (128 - int64(s/4))] ptr (MOVWconst [0]) mem) 17300 for { 17301 s := v.AuxInt 17302 t := v.Aux 17303 ptr := v.Args[0] 17304 mem := v.Args[1] 17305 if !(s%4 == 0 && s > 4 && s <= 512 && t.(Type).Alignment()%4 == 0 && !config.noDuffDevice) { 17306 break 17307 } 17308 v.reset(OpARMDUFFZERO) 17309 v.AuxInt = 4 * (128 - int64(s/4)) 17310 v.AddArg(ptr) 17311 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17312 v0.AuxInt = 0 17313 v.AddArg(v0) 17314 v.AddArg(mem) 17315 return true 17316 } 17317 // match: (Zero [s] {t} ptr mem) 17318 // cond: (s > 512 || config.noDuffDevice) || t.(Type).Alignment()%4 != 0 17319 // result: (LoweredZero [t.(Type).Alignment()] ptr (ADDconst <ptr.Type> ptr [s-moveSize(t.(Type).Alignment(), config)]) (MOVWconst [0]) mem) 17320 for { 17321 s := v.AuxInt 17322 t := v.Aux 17323 ptr := v.Args[0] 17324 mem := v.Args[1] 17325 if !((s > 512 || config.noDuffDevice) || t.(Type).Alignment()%4 != 0) { 17326 break 17327 } 17328 v.reset(OpARMLoweredZero) 17329 v.AuxInt = t.(Type).Alignment() 17330 v.AddArg(ptr) 17331 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 17332 v0.AuxInt = s - moveSize(t.(Type).Alignment(), config) 17333 v0.AddArg(ptr) 17334 v.AddArg(v0) 17335 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, types.UInt32) 17336 v1.AuxInt = 0 17337 v.AddArg(v1) 17338 v.AddArg(mem) 17339 return true 17340 } 17341 return false 17342 } 17343 func rewriteValueARM_OpZeroExt16to32_0(v *Value) bool { 17344 // match: (ZeroExt16to32 x) 17345 // cond: 17346 // result: (MOVHUreg x) 17347 for { 17348 x := v.Args[0] 17349 v.reset(OpARMMOVHUreg) 17350 v.AddArg(x) 17351 return true 17352 } 17353 } 17354 func rewriteValueARM_OpZeroExt8to16_0(v *Value) bool { 17355 // match: (ZeroExt8to16 x) 17356 // cond: 17357 // result: (MOVBUreg x) 17358 for { 17359 x := v.Args[0] 17360 v.reset(OpARMMOVBUreg) 17361 v.AddArg(x) 17362 return true 17363 } 17364 } 17365 func rewriteValueARM_OpZeroExt8to32_0(v *Value) bool { 17366 // match: (ZeroExt8to32 x) 17367 // cond: 17368 // result: (MOVBUreg x) 17369 for { 17370 x := v.Args[0] 17371 v.reset(OpARMMOVBUreg) 17372 v.AddArg(x) 17373 return true 17374 } 17375 } 17376 func rewriteValueARM_OpZeromask_0(v *Value) bool { 17377 b := v.Block 17378 _ = b 17379 types := &b.Func.Config.Types 17380 _ = types 17381 // match: (Zeromask x) 17382 // cond: 17383 // result: (SRAconst (RSBshiftRL <types.Int32> x x [1]) [31]) 17384 for { 17385 x := v.Args[0] 17386 v.reset(OpARMSRAconst) 17387 v.AuxInt = 31 17388 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, types.Int32) 17389 v0.AuxInt = 1 17390 v0.AddArg(x) 17391 v0.AddArg(x) 17392 v.AddArg(v0) 17393 return true 17394 } 17395 } 17396 func rewriteBlockARM(b *Block) bool { 17397 config := b.Func.Config 17398 _ = config 17399 fe := b.Func.fe 17400 _ = fe 17401 types := &config.Types 17402 _ = types 17403 switch b.Kind { 17404 case BlockARMEQ: 17405 // match: (EQ (FlagEQ) yes no) 17406 // cond: 17407 // result: (First nil yes no) 17408 for { 17409 v := b.Control 17410 if v.Op != OpARMFlagEQ { 17411 break 17412 } 17413 b.Kind = BlockFirst 17414 b.SetControl(nil) 17415 return true 17416 } 17417 // match: (EQ (FlagLT_ULT) yes no) 17418 // cond: 17419 // result: (First nil no yes) 17420 for { 17421 v := b.Control 17422 if v.Op != OpARMFlagLT_ULT { 17423 break 17424 } 17425 b.Kind = BlockFirst 17426 b.SetControl(nil) 17427 b.swapSuccessors() 17428 return true 17429 } 17430 // match: (EQ (FlagLT_UGT) yes no) 17431 // cond: 17432 // result: (First nil no yes) 17433 for { 17434 v := b.Control 17435 if v.Op != OpARMFlagLT_UGT { 17436 break 17437 } 17438 b.Kind = BlockFirst 17439 b.SetControl(nil) 17440 b.swapSuccessors() 17441 return true 17442 } 17443 // match: (EQ (FlagGT_ULT) yes no) 17444 // cond: 17445 // result: (First nil no yes) 17446 for { 17447 v := b.Control 17448 if v.Op != OpARMFlagGT_ULT { 17449 break 17450 } 17451 b.Kind = BlockFirst 17452 b.SetControl(nil) 17453 b.swapSuccessors() 17454 return true 17455 } 17456 // match: (EQ (FlagGT_UGT) yes no) 17457 // cond: 17458 // result: (First nil no yes) 17459 for { 17460 v := b.Control 17461 if v.Op != OpARMFlagGT_UGT { 17462 break 17463 } 17464 b.Kind = BlockFirst 17465 b.SetControl(nil) 17466 b.swapSuccessors() 17467 return true 17468 } 17469 // match: (EQ (InvertFlags cmp) yes no) 17470 // cond: 17471 // result: (EQ cmp yes no) 17472 for { 17473 v := b.Control 17474 if v.Op != OpARMInvertFlags { 17475 break 17476 } 17477 cmp := v.Args[0] 17478 b.Kind = BlockARMEQ 17479 b.SetControl(cmp) 17480 return true 17481 } 17482 case BlockARMGE: 17483 // match: (GE (FlagEQ) yes no) 17484 // cond: 17485 // result: (First nil yes no) 17486 for { 17487 v := b.Control 17488 if v.Op != OpARMFlagEQ { 17489 break 17490 } 17491 b.Kind = BlockFirst 17492 b.SetControl(nil) 17493 return true 17494 } 17495 // match: (GE (FlagLT_ULT) yes no) 17496 // cond: 17497 // result: (First nil no yes) 17498 for { 17499 v := b.Control 17500 if v.Op != OpARMFlagLT_ULT { 17501 break 17502 } 17503 b.Kind = BlockFirst 17504 b.SetControl(nil) 17505 b.swapSuccessors() 17506 return true 17507 } 17508 // match: (GE (FlagLT_UGT) yes no) 17509 // cond: 17510 // result: (First nil no yes) 17511 for { 17512 v := b.Control 17513 if v.Op != OpARMFlagLT_UGT { 17514 break 17515 } 17516 b.Kind = BlockFirst 17517 b.SetControl(nil) 17518 b.swapSuccessors() 17519 return true 17520 } 17521 // match: (GE (FlagGT_ULT) yes no) 17522 // cond: 17523 // result: (First nil yes no) 17524 for { 17525 v := b.Control 17526 if v.Op != OpARMFlagGT_ULT { 17527 break 17528 } 17529 b.Kind = BlockFirst 17530 b.SetControl(nil) 17531 return true 17532 } 17533 // match: (GE (FlagGT_UGT) yes no) 17534 // cond: 17535 // result: (First nil yes no) 17536 for { 17537 v := b.Control 17538 if v.Op != OpARMFlagGT_UGT { 17539 break 17540 } 17541 b.Kind = BlockFirst 17542 b.SetControl(nil) 17543 return true 17544 } 17545 // match: (GE (InvertFlags cmp) yes no) 17546 // cond: 17547 // result: (LE cmp yes no) 17548 for { 17549 v := b.Control 17550 if v.Op != OpARMInvertFlags { 17551 break 17552 } 17553 cmp := v.Args[0] 17554 b.Kind = BlockARMLE 17555 b.SetControl(cmp) 17556 return true 17557 } 17558 case BlockARMGT: 17559 // match: (GT (FlagEQ) yes no) 17560 // cond: 17561 // result: (First nil no yes) 17562 for { 17563 v := b.Control 17564 if v.Op != OpARMFlagEQ { 17565 break 17566 } 17567 b.Kind = BlockFirst 17568 b.SetControl(nil) 17569 b.swapSuccessors() 17570 return true 17571 } 17572 // match: (GT (FlagLT_ULT) yes no) 17573 // cond: 17574 // result: (First nil no yes) 17575 for { 17576 v := b.Control 17577 if v.Op != OpARMFlagLT_ULT { 17578 break 17579 } 17580 b.Kind = BlockFirst 17581 b.SetControl(nil) 17582 b.swapSuccessors() 17583 return true 17584 } 17585 // match: (GT (FlagLT_UGT) yes no) 17586 // cond: 17587 // result: (First nil no yes) 17588 for { 17589 v := b.Control 17590 if v.Op != OpARMFlagLT_UGT { 17591 break 17592 } 17593 b.Kind = BlockFirst 17594 b.SetControl(nil) 17595 b.swapSuccessors() 17596 return true 17597 } 17598 // match: (GT (FlagGT_ULT) yes no) 17599 // cond: 17600 // result: (First nil yes no) 17601 for { 17602 v := b.Control 17603 if v.Op != OpARMFlagGT_ULT { 17604 break 17605 } 17606 b.Kind = BlockFirst 17607 b.SetControl(nil) 17608 return true 17609 } 17610 // match: (GT (FlagGT_UGT) yes no) 17611 // cond: 17612 // result: (First nil yes no) 17613 for { 17614 v := b.Control 17615 if v.Op != OpARMFlagGT_UGT { 17616 break 17617 } 17618 b.Kind = BlockFirst 17619 b.SetControl(nil) 17620 return true 17621 } 17622 // match: (GT (InvertFlags cmp) yes no) 17623 // cond: 17624 // result: (LT cmp yes no) 17625 for { 17626 v := b.Control 17627 if v.Op != OpARMInvertFlags { 17628 break 17629 } 17630 cmp := v.Args[0] 17631 b.Kind = BlockARMLT 17632 b.SetControl(cmp) 17633 return true 17634 } 17635 case BlockIf: 17636 // match: (If (Equal cc) yes no) 17637 // cond: 17638 // result: (EQ cc yes no) 17639 for { 17640 v := b.Control 17641 if v.Op != OpARMEqual { 17642 break 17643 } 17644 cc := v.Args[0] 17645 b.Kind = BlockARMEQ 17646 b.SetControl(cc) 17647 return true 17648 } 17649 // match: (If (NotEqual cc) yes no) 17650 // cond: 17651 // result: (NE cc yes no) 17652 for { 17653 v := b.Control 17654 if v.Op != OpARMNotEqual { 17655 break 17656 } 17657 cc := v.Args[0] 17658 b.Kind = BlockARMNE 17659 b.SetControl(cc) 17660 return true 17661 } 17662 // match: (If (LessThan cc) yes no) 17663 // cond: 17664 // result: (LT cc yes no) 17665 for { 17666 v := b.Control 17667 if v.Op != OpARMLessThan { 17668 break 17669 } 17670 cc := v.Args[0] 17671 b.Kind = BlockARMLT 17672 b.SetControl(cc) 17673 return true 17674 } 17675 // match: (If (LessThanU cc) yes no) 17676 // cond: 17677 // result: (ULT cc yes no) 17678 for { 17679 v := b.Control 17680 if v.Op != OpARMLessThanU { 17681 break 17682 } 17683 cc := v.Args[0] 17684 b.Kind = BlockARMULT 17685 b.SetControl(cc) 17686 return true 17687 } 17688 // match: (If (LessEqual cc) yes no) 17689 // cond: 17690 // result: (LE cc yes no) 17691 for { 17692 v := b.Control 17693 if v.Op != OpARMLessEqual { 17694 break 17695 } 17696 cc := v.Args[0] 17697 b.Kind = BlockARMLE 17698 b.SetControl(cc) 17699 return true 17700 } 17701 // match: (If (LessEqualU cc) yes no) 17702 // cond: 17703 // result: (ULE cc yes no) 17704 for { 17705 v := b.Control 17706 if v.Op != OpARMLessEqualU { 17707 break 17708 } 17709 cc := v.Args[0] 17710 b.Kind = BlockARMULE 17711 b.SetControl(cc) 17712 return true 17713 } 17714 // match: (If (GreaterThan cc) yes no) 17715 // cond: 17716 // result: (GT cc yes no) 17717 for { 17718 v := b.Control 17719 if v.Op != OpARMGreaterThan { 17720 break 17721 } 17722 cc := v.Args[0] 17723 b.Kind = BlockARMGT 17724 b.SetControl(cc) 17725 return true 17726 } 17727 // match: (If (GreaterThanU cc) yes no) 17728 // cond: 17729 // result: (UGT cc yes no) 17730 for { 17731 v := b.Control 17732 if v.Op != OpARMGreaterThanU { 17733 break 17734 } 17735 cc := v.Args[0] 17736 b.Kind = BlockARMUGT 17737 b.SetControl(cc) 17738 return true 17739 } 17740 // match: (If (GreaterEqual cc) yes no) 17741 // cond: 17742 // result: (GE cc yes no) 17743 for { 17744 v := b.Control 17745 if v.Op != OpARMGreaterEqual { 17746 break 17747 } 17748 cc := v.Args[0] 17749 b.Kind = BlockARMGE 17750 b.SetControl(cc) 17751 return true 17752 } 17753 // match: (If (GreaterEqualU cc) yes no) 17754 // cond: 17755 // result: (UGE cc yes no) 17756 for { 17757 v := b.Control 17758 if v.Op != OpARMGreaterEqualU { 17759 break 17760 } 17761 cc := v.Args[0] 17762 b.Kind = BlockARMUGE 17763 b.SetControl(cc) 17764 return true 17765 } 17766 // match: (If cond yes no) 17767 // cond: 17768 // result: (NE (CMPconst [0] cond) yes no) 17769 for { 17770 v := b.Control 17771 _ = v 17772 cond := b.Control 17773 b.Kind = BlockARMNE 17774 v0 := b.NewValue0(v.Pos, OpARMCMPconst, TypeFlags) 17775 v0.AuxInt = 0 17776 v0.AddArg(cond) 17777 b.SetControl(v0) 17778 return true 17779 } 17780 case BlockARMLE: 17781 // match: (LE (FlagEQ) yes no) 17782 // cond: 17783 // result: (First nil yes no) 17784 for { 17785 v := b.Control 17786 if v.Op != OpARMFlagEQ { 17787 break 17788 } 17789 b.Kind = BlockFirst 17790 b.SetControl(nil) 17791 return true 17792 } 17793 // match: (LE (FlagLT_ULT) yes no) 17794 // cond: 17795 // result: (First nil yes no) 17796 for { 17797 v := b.Control 17798 if v.Op != OpARMFlagLT_ULT { 17799 break 17800 } 17801 b.Kind = BlockFirst 17802 b.SetControl(nil) 17803 return true 17804 } 17805 // match: (LE (FlagLT_UGT) yes no) 17806 // cond: 17807 // result: (First nil yes no) 17808 for { 17809 v := b.Control 17810 if v.Op != OpARMFlagLT_UGT { 17811 break 17812 } 17813 b.Kind = BlockFirst 17814 b.SetControl(nil) 17815 return true 17816 } 17817 // match: (LE (FlagGT_ULT) yes no) 17818 // cond: 17819 // result: (First nil no yes) 17820 for { 17821 v := b.Control 17822 if v.Op != OpARMFlagGT_ULT { 17823 break 17824 } 17825 b.Kind = BlockFirst 17826 b.SetControl(nil) 17827 b.swapSuccessors() 17828 return true 17829 } 17830 // match: (LE (FlagGT_UGT) yes no) 17831 // cond: 17832 // result: (First nil no yes) 17833 for { 17834 v := b.Control 17835 if v.Op != OpARMFlagGT_UGT { 17836 break 17837 } 17838 b.Kind = BlockFirst 17839 b.SetControl(nil) 17840 b.swapSuccessors() 17841 return true 17842 } 17843 // match: (LE (InvertFlags cmp) yes no) 17844 // cond: 17845 // result: (GE cmp yes no) 17846 for { 17847 v := b.Control 17848 if v.Op != OpARMInvertFlags { 17849 break 17850 } 17851 cmp := v.Args[0] 17852 b.Kind = BlockARMGE 17853 b.SetControl(cmp) 17854 return true 17855 } 17856 case BlockARMLT: 17857 // match: (LT (FlagEQ) yes no) 17858 // cond: 17859 // result: (First nil no yes) 17860 for { 17861 v := b.Control 17862 if v.Op != OpARMFlagEQ { 17863 break 17864 } 17865 b.Kind = BlockFirst 17866 b.SetControl(nil) 17867 b.swapSuccessors() 17868 return true 17869 } 17870 // match: (LT (FlagLT_ULT) yes no) 17871 // cond: 17872 // result: (First nil yes no) 17873 for { 17874 v := b.Control 17875 if v.Op != OpARMFlagLT_ULT { 17876 break 17877 } 17878 b.Kind = BlockFirst 17879 b.SetControl(nil) 17880 return true 17881 } 17882 // match: (LT (FlagLT_UGT) yes no) 17883 // cond: 17884 // result: (First nil yes no) 17885 for { 17886 v := b.Control 17887 if v.Op != OpARMFlagLT_UGT { 17888 break 17889 } 17890 b.Kind = BlockFirst 17891 b.SetControl(nil) 17892 return true 17893 } 17894 // match: (LT (FlagGT_ULT) yes no) 17895 // cond: 17896 // result: (First nil no yes) 17897 for { 17898 v := b.Control 17899 if v.Op != OpARMFlagGT_ULT { 17900 break 17901 } 17902 b.Kind = BlockFirst 17903 b.SetControl(nil) 17904 b.swapSuccessors() 17905 return true 17906 } 17907 // match: (LT (FlagGT_UGT) yes no) 17908 // cond: 17909 // result: (First nil no yes) 17910 for { 17911 v := b.Control 17912 if v.Op != OpARMFlagGT_UGT { 17913 break 17914 } 17915 b.Kind = BlockFirst 17916 b.SetControl(nil) 17917 b.swapSuccessors() 17918 return true 17919 } 17920 // match: (LT (InvertFlags cmp) yes no) 17921 // cond: 17922 // result: (GT cmp yes no) 17923 for { 17924 v := b.Control 17925 if v.Op != OpARMInvertFlags { 17926 break 17927 } 17928 cmp := v.Args[0] 17929 b.Kind = BlockARMGT 17930 b.SetControl(cmp) 17931 return true 17932 } 17933 case BlockARMNE: 17934 // match: (NE (CMPconst [0] (Equal cc)) yes no) 17935 // cond: 17936 // result: (EQ cc yes no) 17937 for { 17938 v := b.Control 17939 if v.Op != OpARMCMPconst { 17940 break 17941 } 17942 if v.AuxInt != 0 { 17943 break 17944 } 17945 v_0 := v.Args[0] 17946 if v_0.Op != OpARMEqual { 17947 break 17948 } 17949 cc := v_0.Args[0] 17950 b.Kind = BlockARMEQ 17951 b.SetControl(cc) 17952 return true 17953 } 17954 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 17955 // cond: 17956 // result: (NE cc yes no) 17957 for { 17958 v := b.Control 17959 if v.Op != OpARMCMPconst { 17960 break 17961 } 17962 if v.AuxInt != 0 { 17963 break 17964 } 17965 v_0 := v.Args[0] 17966 if v_0.Op != OpARMNotEqual { 17967 break 17968 } 17969 cc := v_0.Args[0] 17970 b.Kind = BlockARMNE 17971 b.SetControl(cc) 17972 return true 17973 } 17974 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 17975 // cond: 17976 // result: (LT cc yes no) 17977 for { 17978 v := b.Control 17979 if v.Op != OpARMCMPconst { 17980 break 17981 } 17982 if v.AuxInt != 0 { 17983 break 17984 } 17985 v_0 := v.Args[0] 17986 if v_0.Op != OpARMLessThan { 17987 break 17988 } 17989 cc := v_0.Args[0] 17990 b.Kind = BlockARMLT 17991 b.SetControl(cc) 17992 return true 17993 } 17994 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 17995 // cond: 17996 // result: (ULT cc yes no) 17997 for { 17998 v := b.Control 17999 if v.Op != OpARMCMPconst { 18000 break 18001 } 18002 if v.AuxInt != 0 { 18003 break 18004 } 18005 v_0 := v.Args[0] 18006 if v_0.Op != OpARMLessThanU { 18007 break 18008 } 18009 cc := v_0.Args[0] 18010 b.Kind = BlockARMULT 18011 b.SetControl(cc) 18012 return true 18013 } 18014 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 18015 // cond: 18016 // result: (LE cc yes no) 18017 for { 18018 v := b.Control 18019 if v.Op != OpARMCMPconst { 18020 break 18021 } 18022 if v.AuxInt != 0 { 18023 break 18024 } 18025 v_0 := v.Args[0] 18026 if v_0.Op != OpARMLessEqual { 18027 break 18028 } 18029 cc := v_0.Args[0] 18030 b.Kind = BlockARMLE 18031 b.SetControl(cc) 18032 return true 18033 } 18034 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 18035 // cond: 18036 // result: (ULE cc yes no) 18037 for { 18038 v := b.Control 18039 if v.Op != OpARMCMPconst { 18040 break 18041 } 18042 if v.AuxInt != 0 { 18043 break 18044 } 18045 v_0 := v.Args[0] 18046 if v_0.Op != OpARMLessEqualU { 18047 break 18048 } 18049 cc := v_0.Args[0] 18050 b.Kind = BlockARMULE 18051 b.SetControl(cc) 18052 return true 18053 } 18054 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 18055 // cond: 18056 // result: (GT cc yes no) 18057 for { 18058 v := b.Control 18059 if v.Op != OpARMCMPconst { 18060 break 18061 } 18062 if v.AuxInt != 0 { 18063 break 18064 } 18065 v_0 := v.Args[0] 18066 if v_0.Op != OpARMGreaterThan { 18067 break 18068 } 18069 cc := v_0.Args[0] 18070 b.Kind = BlockARMGT 18071 b.SetControl(cc) 18072 return true 18073 } 18074 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 18075 // cond: 18076 // result: (UGT cc yes no) 18077 for { 18078 v := b.Control 18079 if v.Op != OpARMCMPconst { 18080 break 18081 } 18082 if v.AuxInt != 0 { 18083 break 18084 } 18085 v_0 := v.Args[0] 18086 if v_0.Op != OpARMGreaterThanU { 18087 break 18088 } 18089 cc := v_0.Args[0] 18090 b.Kind = BlockARMUGT 18091 b.SetControl(cc) 18092 return true 18093 } 18094 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 18095 // cond: 18096 // result: (GE cc yes no) 18097 for { 18098 v := b.Control 18099 if v.Op != OpARMCMPconst { 18100 break 18101 } 18102 if v.AuxInt != 0 { 18103 break 18104 } 18105 v_0 := v.Args[0] 18106 if v_0.Op != OpARMGreaterEqual { 18107 break 18108 } 18109 cc := v_0.Args[0] 18110 b.Kind = BlockARMGE 18111 b.SetControl(cc) 18112 return true 18113 } 18114 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 18115 // cond: 18116 // result: (UGE cc yes no) 18117 for { 18118 v := b.Control 18119 if v.Op != OpARMCMPconst { 18120 break 18121 } 18122 if v.AuxInt != 0 { 18123 break 18124 } 18125 v_0 := v.Args[0] 18126 if v_0.Op != OpARMGreaterEqualU { 18127 break 18128 } 18129 cc := v_0.Args[0] 18130 b.Kind = BlockARMUGE 18131 b.SetControl(cc) 18132 return true 18133 } 18134 // match: (NE (FlagEQ) yes no) 18135 // cond: 18136 // result: (First nil no yes) 18137 for { 18138 v := b.Control 18139 if v.Op != OpARMFlagEQ { 18140 break 18141 } 18142 b.Kind = BlockFirst 18143 b.SetControl(nil) 18144 b.swapSuccessors() 18145 return true 18146 } 18147 // match: (NE (FlagLT_ULT) yes no) 18148 // cond: 18149 // result: (First nil yes no) 18150 for { 18151 v := b.Control 18152 if v.Op != OpARMFlagLT_ULT { 18153 break 18154 } 18155 b.Kind = BlockFirst 18156 b.SetControl(nil) 18157 return true 18158 } 18159 // match: (NE (FlagLT_UGT) yes no) 18160 // cond: 18161 // result: (First nil yes no) 18162 for { 18163 v := b.Control 18164 if v.Op != OpARMFlagLT_UGT { 18165 break 18166 } 18167 b.Kind = BlockFirst 18168 b.SetControl(nil) 18169 return true 18170 } 18171 // match: (NE (FlagGT_ULT) yes no) 18172 // cond: 18173 // result: (First nil yes no) 18174 for { 18175 v := b.Control 18176 if v.Op != OpARMFlagGT_ULT { 18177 break 18178 } 18179 b.Kind = BlockFirst 18180 b.SetControl(nil) 18181 return true 18182 } 18183 // match: (NE (FlagGT_UGT) yes no) 18184 // cond: 18185 // result: (First nil yes no) 18186 for { 18187 v := b.Control 18188 if v.Op != OpARMFlagGT_UGT { 18189 break 18190 } 18191 b.Kind = BlockFirst 18192 b.SetControl(nil) 18193 return true 18194 } 18195 // match: (NE (InvertFlags cmp) yes no) 18196 // cond: 18197 // result: (NE cmp yes no) 18198 for { 18199 v := b.Control 18200 if v.Op != OpARMInvertFlags { 18201 break 18202 } 18203 cmp := v.Args[0] 18204 b.Kind = BlockARMNE 18205 b.SetControl(cmp) 18206 return true 18207 } 18208 case BlockARMUGE: 18209 // match: (UGE (FlagEQ) yes no) 18210 // cond: 18211 // result: (First nil yes no) 18212 for { 18213 v := b.Control 18214 if v.Op != OpARMFlagEQ { 18215 break 18216 } 18217 b.Kind = BlockFirst 18218 b.SetControl(nil) 18219 return true 18220 } 18221 // match: (UGE (FlagLT_ULT) yes no) 18222 // cond: 18223 // result: (First nil no yes) 18224 for { 18225 v := b.Control 18226 if v.Op != OpARMFlagLT_ULT { 18227 break 18228 } 18229 b.Kind = BlockFirst 18230 b.SetControl(nil) 18231 b.swapSuccessors() 18232 return true 18233 } 18234 // match: (UGE (FlagLT_UGT) yes no) 18235 // cond: 18236 // result: (First nil yes no) 18237 for { 18238 v := b.Control 18239 if v.Op != OpARMFlagLT_UGT { 18240 break 18241 } 18242 b.Kind = BlockFirst 18243 b.SetControl(nil) 18244 return true 18245 } 18246 // match: (UGE (FlagGT_ULT) yes no) 18247 // cond: 18248 // result: (First nil no yes) 18249 for { 18250 v := b.Control 18251 if v.Op != OpARMFlagGT_ULT { 18252 break 18253 } 18254 b.Kind = BlockFirst 18255 b.SetControl(nil) 18256 b.swapSuccessors() 18257 return true 18258 } 18259 // match: (UGE (FlagGT_UGT) yes no) 18260 // cond: 18261 // result: (First nil yes no) 18262 for { 18263 v := b.Control 18264 if v.Op != OpARMFlagGT_UGT { 18265 break 18266 } 18267 b.Kind = BlockFirst 18268 b.SetControl(nil) 18269 return true 18270 } 18271 // match: (UGE (InvertFlags cmp) yes no) 18272 // cond: 18273 // result: (ULE cmp yes no) 18274 for { 18275 v := b.Control 18276 if v.Op != OpARMInvertFlags { 18277 break 18278 } 18279 cmp := v.Args[0] 18280 b.Kind = BlockARMULE 18281 b.SetControl(cmp) 18282 return true 18283 } 18284 case BlockARMUGT: 18285 // match: (UGT (FlagEQ) yes no) 18286 // cond: 18287 // result: (First nil no yes) 18288 for { 18289 v := b.Control 18290 if v.Op != OpARMFlagEQ { 18291 break 18292 } 18293 b.Kind = BlockFirst 18294 b.SetControl(nil) 18295 b.swapSuccessors() 18296 return true 18297 } 18298 // match: (UGT (FlagLT_ULT) yes no) 18299 // cond: 18300 // result: (First nil no yes) 18301 for { 18302 v := b.Control 18303 if v.Op != OpARMFlagLT_ULT { 18304 break 18305 } 18306 b.Kind = BlockFirst 18307 b.SetControl(nil) 18308 b.swapSuccessors() 18309 return true 18310 } 18311 // match: (UGT (FlagLT_UGT) yes no) 18312 // cond: 18313 // result: (First nil yes no) 18314 for { 18315 v := b.Control 18316 if v.Op != OpARMFlagLT_UGT { 18317 break 18318 } 18319 b.Kind = BlockFirst 18320 b.SetControl(nil) 18321 return true 18322 } 18323 // match: (UGT (FlagGT_ULT) yes no) 18324 // cond: 18325 // result: (First nil no yes) 18326 for { 18327 v := b.Control 18328 if v.Op != OpARMFlagGT_ULT { 18329 break 18330 } 18331 b.Kind = BlockFirst 18332 b.SetControl(nil) 18333 b.swapSuccessors() 18334 return true 18335 } 18336 // match: (UGT (FlagGT_UGT) yes no) 18337 // cond: 18338 // result: (First nil yes no) 18339 for { 18340 v := b.Control 18341 if v.Op != OpARMFlagGT_UGT { 18342 break 18343 } 18344 b.Kind = BlockFirst 18345 b.SetControl(nil) 18346 return true 18347 } 18348 // match: (UGT (InvertFlags cmp) yes no) 18349 // cond: 18350 // result: (ULT cmp yes no) 18351 for { 18352 v := b.Control 18353 if v.Op != OpARMInvertFlags { 18354 break 18355 } 18356 cmp := v.Args[0] 18357 b.Kind = BlockARMULT 18358 b.SetControl(cmp) 18359 return true 18360 } 18361 case BlockARMULE: 18362 // match: (ULE (FlagEQ) yes no) 18363 // cond: 18364 // result: (First nil yes no) 18365 for { 18366 v := b.Control 18367 if v.Op != OpARMFlagEQ { 18368 break 18369 } 18370 b.Kind = BlockFirst 18371 b.SetControl(nil) 18372 return true 18373 } 18374 // match: (ULE (FlagLT_ULT) yes no) 18375 // cond: 18376 // result: (First nil yes no) 18377 for { 18378 v := b.Control 18379 if v.Op != OpARMFlagLT_ULT { 18380 break 18381 } 18382 b.Kind = BlockFirst 18383 b.SetControl(nil) 18384 return true 18385 } 18386 // match: (ULE (FlagLT_UGT) yes no) 18387 // cond: 18388 // result: (First nil no yes) 18389 for { 18390 v := b.Control 18391 if v.Op != OpARMFlagLT_UGT { 18392 break 18393 } 18394 b.Kind = BlockFirst 18395 b.SetControl(nil) 18396 b.swapSuccessors() 18397 return true 18398 } 18399 // match: (ULE (FlagGT_ULT) yes no) 18400 // cond: 18401 // result: (First nil yes no) 18402 for { 18403 v := b.Control 18404 if v.Op != OpARMFlagGT_ULT { 18405 break 18406 } 18407 b.Kind = BlockFirst 18408 b.SetControl(nil) 18409 return true 18410 } 18411 // match: (ULE (FlagGT_UGT) yes no) 18412 // cond: 18413 // result: (First nil no yes) 18414 for { 18415 v := b.Control 18416 if v.Op != OpARMFlagGT_UGT { 18417 break 18418 } 18419 b.Kind = BlockFirst 18420 b.SetControl(nil) 18421 b.swapSuccessors() 18422 return true 18423 } 18424 // match: (ULE (InvertFlags cmp) yes no) 18425 // cond: 18426 // result: (UGE cmp yes no) 18427 for { 18428 v := b.Control 18429 if v.Op != OpARMInvertFlags { 18430 break 18431 } 18432 cmp := v.Args[0] 18433 b.Kind = BlockARMUGE 18434 b.SetControl(cmp) 18435 return true 18436 } 18437 case BlockARMULT: 18438 // match: (ULT (FlagEQ) yes no) 18439 // cond: 18440 // result: (First nil no yes) 18441 for { 18442 v := b.Control 18443 if v.Op != OpARMFlagEQ { 18444 break 18445 } 18446 b.Kind = BlockFirst 18447 b.SetControl(nil) 18448 b.swapSuccessors() 18449 return true 18450 } 18451 // match: (ULT (FlagLT_ULT) yes no) 18452 // cond: 18453 // result: (First nil yes no) 18454 for { 18455 v := b.Control 18456 if v.Op != OpARMFlagLT_ULT { 18457 break 18458 } 18459 b.Kind = BlockFirst 18460 b.SetControl(nil) 18461 return true 18462 } 18463 // match: (ULT (FlagLT_UGT) yes no) 18464 // cond: 18465 // result: (First nil no yes) 18466 for { 18467 v := b.Control 18468 if v.Op != OpARMFlagLT_UGT { 18469 break 18470 } 18471 b.Kind = BlockFirst 18472 b.SetControl(nil) 18473 b.swapSuccessors() 18474 return true 18475 } 18476 // match: (ULT (FlagGT_ULT) yes no) 18477 // cond: 18478 // result: (First nil yes no) 18479 for { 18480 v := b.Control 18481 if v.Op != OpARMFlagGT_ULT { 18482 break 18483 } 18484 b.Kind = BlockFirst 18485 b.SetControl(nil) 18486 return true 18487 } 18488 // match: (ULT (FlagGT_UGT) yes no) 18489 // cond: 18490 // result: (First nil no yes) 18491 for { 18492 v := b.Control 18493 if v.Op != OpARMFlagGT_UGT { 18494 break 18495 } 18496 b.Kind = BlockFirst 18497 b.SetControl(nil) 18498 b.swapSuccessors() 18499 return true 18500 } 18501 // match: (ULT (InvertFlags cmp) yes no) 18502 // cond: 18503 // result: (UGT cmp yes no) 18504 for { 18505 v := b.Control 18506 if v.Op != OpARMInvertFlags { 18507 break 18508 } 18509 cmp := v.Args[0] 18510 b.Kind = BlockARMUGT 18511 b.SetControl(cmp) 18512 return true 18513 } 18514 } 18515 return false 18516 }