github.com/Filosottile/go@v0.0.0-20170906193555-dbed9972d994/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 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValueARM(v *Value) bool { 17 switch v.Op { 18 case OpARMADC: 19 return rewriteValueARM_OpARMADC_0(v) || rewriteValueARM_OpARMADC_10(v) || rewriteValueARM_OpARMADC_20(v) 20 case OpARMADCconst: 21 return rewriteValueARM_OpARMADCconst_0(v) 22 case OpARMADCshiftLL: 23 return rewriteValueARM_OpARMADCshiftLL_0(v) 24 case OpARMADCshiftLLreg: 25 return rewriteValueARM_OpARMADCshiftLLreg_0(v) 26 case OpARMADCshiftRA: 27 return rewriteValueARM_OpARMADCshiftRA_0(v) 28 case OpARMADCshiftRAreg: 29 return rewriteValueARM_OpARMADCshiftRAreg_0(v) 30 case OpARMADCshiftRL: 31 return rewriteValueARM_OpARMADCshiftRL_0(v) 32 case OpARMADCshiftRLreg: 33 return rewriteValueARM_OpARMADCshiftRLreg_0(v) 34 case OpARMADD: 35 return rewriteValueARM_OpARMADD_0(v) || rewriteValueARM_OpARMADD_10(v) 36 case OpARMADDS: 37 return rewriteValueARM_OpARMADDS_0(v) || rewriteValueARM_OpARMADDS_10(v) 38 case OpARMADDSshiftLL: 39 return rewriteValueARM_OpARMADDSshiftLL_0(v) 40 case OpARMADDSshiftLLreg: 41 return rewriteValueARM_OpARMADDSshiftLLreg_0(v) 42 case OpARMADDSshiftRA: 43 return rewriteValueARM_OpARMADDSshiftRA_0(v) 44 case OpARMADDSshiftRAreg: 45 return rewriteValueARM_OpARMADDSshiftRAreg_0(v) 46 case OpARMADDSshiftRL: 47 return rewriteValueARM_OpARMADDSshiftRL_0(v) 48 case OpARMADDSshiftRLreg: 49 return rewriteValueARM_OpARMADDSshiftRLreg_0(v) 50 case OpARMADDconst: 51 return rewriteValueARM_OpARMADDconst_0(v) 52 case OpARMADDshiftLL: 53 return rewriteValueARM_OpARMADDshiftLL_0(v) 54 case OpARMADDshiftLLreg: 55 return rewriteValueARM_OpARMADDshiftLLreg_0(v) 56 case OpARMADDshiftRA: 57 return rewriteValueARM_OpARMADDshiftRA_0(v) 58 case OpARMADDshiftRAreg: 59 return rewriteValueARM_OpARMADDshiftRAreg_0(v) 60 case OpARMADDshiftRL: 61 return rewriteValueARM_OpARMADDshiftRL_0(v) 62 case OpARMADDshiftRLreg: 63 return rewriteValueARM_OpARMADDshiftRLreg_0(v) 64 case OpARMAND: 65 return rewriteValueARM_OpARMAND_0(v) || rewriteValueARM_OpARMAND_10(v) || rewriteValueARM_OpARMAND_20(v) 66 case OpARMANDconst: 67 return rewriteValueARM_OpARMANDconst_0(v) 68 case OpARMANDshiftLL: 69 return rewriteValueARM_OpARMANDshiftLL_0(v) 70 case OpARMANDshiftLLreg: 71 return rewriteValueARM_OpARMANDshiftLLreg_0(v) 72 case OpARMANDshiftRA: 73 return rewriteValueARM_OpARMANDshiftRA_0(v) 74 case OpARMANDshiftRAreg: 75 return rewriteValueARM_OpARMANDshiftRAreg_0(v) 76 case OpARMANDshiftRL: 77 return rewriteValueARM_OpARMANDshiftRL_0(v) 78 case OpARMANDshiftRLreg: 79 return rewriteValueARM_OpARMANDshiftRLreg_0(v) 80 case OpARMBIC: 81 return rewriteValueARM_OpARMBIC_0(v) 82 case OpARMBICconst: 83 return rewriteValueARM_OpARMBICconst_0(v) 84 case OpARMBICshiftLL: 85 return rewriteValueARM_OpARMBICshiftLL_0(v) 86 case OpARMBICshiftLLreg: 87 return rewriteValueARM_OpARMBICshiftLLreg_0(v) 88 case OpARMBICshiftRA: 89 return rewriteValueARM_OpARMBICshiftRA_0(v) 90 case OpARMBICshiftRAreg: 91 return rewriteValueARM_OpARMBICshiftRAreg_0(v) 92 case OpARMBICshiftRL: 93 return rewriteValueARM_OpARMBICshiftRL_0(v) 94 case OpARMBICshiftRLreg: 95 return rewriteValueARM_OpARMBICshiftRLreg_0(v) 96 case OpARMCMOVWHSconst: 97 return rewriteValueARM_OpARMCMOVWHSconst_0(v) 98 case OpARMCMOVWLSconst: 99 return rewriteValueARM_OpARMCMOVWLSconst_0(v) 100 case OpARMCMP: 101 return rewriteValueARM_OpARMCMP_0(v) || rewriteValueARM_OpARMCMP_10(v) 102 case OpARMCMPD: 103 return rewriteValueARM_OpARMCMPD_0(v) 104 case OpARMCMPF: 105 return rewriteValueARM_OpARMCMPF_0(v) 106 case OpARMCMPconst: 107 return rewriteValueARM_OpARMCMPconst_0(v) 108 case OpARMCMPshiftLL: 109 return rewriteValueARM_OpARMCMPshiftLL_0(v) 110 case OpARMCMPshiftLLreg: 111 return rewriteValueARM_OpARMCMPshiftLLreg_0(v) 112 case OpARMCMPshiftRA: 113 return rewriteValueARM_OpARMCMPshiftRA_0(v) 114 case OpARMCMPshiftRAreg: 115 return rewriteValueARM_OpARMCMPshiftRAreg_0(v) 116 case OpARMCMPshiftRL: 117 return rewriteValueARM_OpARMCMPshiftRL_0(v) 118 case OpARMCMPshiftRLreg: 119 return rewriteValueARM_OpARMCMPshiftRLreg_0(v) 120 case OpARMEqual: 121 return rewriteValueARM_OpARMEqual_0(v) 122 case OpARMGreaterEqual: 123 return rewriteValueARM_OpARMGreaterEqual_0(v) 124 case OpARMGreaterEqualU: 125 return rewriteValueARM_OpARMGreaterEqualU_0(v) 126 case OpARMGreaterThan: 127 return rewriteValueARM_OpARMGreaterThan_0(v) 128 case OpARMGreaterThanU: 129 return rewriteValueARM_OpARMGreaterThanU_0(v) 130 case OpARMLessEqual: 131 return rewriteValueARM_OpARMLessEqual_0(v) 132 case OpARMLessEqualU: 133 return rewriteValueARM_OpARMLessEqualU_0(v) 134 case OpARMLessThan: 135 return rewriteValueARM_OpARMLessThan_0(v) 136 case OpARMLessThanU: 137 return rewriteValueARM_OpARMLessThanU_0(v) 138 case OpARMMOVBUload: 139 return rewriteValueARM_OpARMMOVBUload_0(v) 140 case OpARMMOVBUloadidx: 141 return rewriteValueARM_OpARMMOVBUloadidx_0(v) 142 case OpARMMOVBUreg: 143 return rewriteValueARM_OpARMMOVBUreg_0(v) 144 case OpARMMOVBload: 145 return rewriteValueARM_OpARMMOVBload_0(v) 146 case OpARMMOVBloadidx: 147 return rewriteValueARM_OpARMMOVBloadidx_0(v) 148 case OpARMMOVBreg: 149 return rewriteValueARM_OpARMMOVBreg_0(v) 150 case OpARMMOVBstore: 151 return rewriteValueARM_OpARMMOVBstore_0(v) 152 case OpARMMOVBstoreidx: 153 return rewriteValueARM_OpARMMOVBstoreidx_0(v) 154 case OpARMMOVDload: 155 return rewriteValueARM_OpARMMOVDload_0(v) 156 case OpARMMOVDstore: 157 return rewriteValueARM_OpARMMOVDstore_0(v) 158 case OpARMMOVFload: 159 return rewriteValueARM_OpARMMOVFload_0(v) 160 case OpARMMOVFstore: 161 return rewriteValueARM_OpARMMOVFstore_0(v) 162 case OpARMMOVHUload: 163 return rewriteValueARM_OpARMMOVHUload_0(v) 164 case OpARMMOVHUloadidx: 165 return rewriteValueARM_OpARMMOVHUloadidx_0(v) 166 case OpARMMOVHUreg: 167 return rewriteValueARM_OpARMMOVHUreg_0(v) 168 case OpARMMOVHload: 169 return rewriteValueARM_OpARMMOVHload_0(v) 170 case OpARMMOVHloadidx: 171 return rewriteValueARM_OpARMMOVHloadidx_0(v) 172 case OpARMMOVHreg: 173 return rewriteValueARM_OpARMMOVHreg_0(v) 174 case OpARMMOVHstore: 175 return rewriteValueARM_OpARMMOVHstore_0(v) 176 case OpARMMOVHstoreidx: 177 return rewriteValueARM_OpARMMOVHstoreidx_0(v) 178 case OpARMMOVWload: 179 return rewriteValueARM_OpARMMOVWload_0(v) 180 case OpARMMOVWloadidx: 181 return rewriteValueARM_OpARMMOVWloadidx_0(v) 182 case OpARMMOVWloadshiftLL: 183 return rewriteValueARM_OpARMMOVWloadshiftLL_0(v) 184 case OpARMMOVWloadshiftRA: 185 return rewriteValueARM_OpARMMOVWloadshiftRA_0(v) 186 case OpARMMOVWloadshiftRL: 187 return rewriteValueARM_OpARMMOVWloadshiftRL_0(v) 188 case OpARMMOVWreg: 189 return rewriteValueARM_OpARMMOVWreg_0(v) 190 case OpARMMOVWstore: 191 return rewriteValueARM_OpARMMOVWstore_0(v) 192 case OpARMMOVWstoreidx: 193 return rewriteValueARM_OpARMMOVWstoreidx_0(v) 194 case OpARMMOVWstoreshiftLL: 195 return rewriteValueARM_OpARMMOVWstoreshiftLL_0(v) 196 case OpARMMOVWstoreshiftRA: 197 return rewriteValueARM_OpARMMOVWstoreshiftRA_0(v) 198 case OpARMMOVWstoreshiftRL: 199 return rewriteValueARM_OpARMMOVWstoreshiftRL_0(v) 200 case OpARMMUL: 201 return rewriteValueARM_OpARMMUL_0(v) || rewriteValueARM_OpARMMUL_10(v) || rewriteValueARM_OpARMMUL_20(v) 202 case OpARMMULA: 203 return rewriteValueARM_OpARMMULA_0(v) || rewriteValueARM_OpARMMULA_10(v) || rewriteValueARM_OpARMMULA_20(v) 204 case OpARMMULS: 205 return rewriteValueARM_OpARMMULS_0(v) || rewriteValueARM_OpARMMULS_10(v) 206 case OpARMMVN: 207 return rewriteValueARM_OpARMMVN_0(v) 208 case OpARMMVNshiftLL: 209 return rewriteValueARM_OpARMMVNshiftLL_0(v) 210 case OpARMMVNshiftLLreg: 211 return rewriteValueARM_OpARMMVNshiftLLreg_0(v) 212 case OpARMMVNshiftRA: 213 return rewriteValueARM_OpARMMVNshiftRA_0(v) 214 case OpARMMVNshiftRAreg: 215 return rewriteValueARM_OpARMMVNshiftRAreg_0(v) 216 case OpARMMVNshiftRL: 217 return rewriteValueARM_OpARMMVNshiftRL_0(v) 218 case OpARMMVNshiftRLreg: 219 return rewriteValueARM_OpARMMVNshiftRLreg_0(v) 220 case OpARMNotEqual: 221 return rewriteValueARM_OpARMNotEqual_0(v) 222 case OpARMOR: 223 return rewriteValueARM_OpARMOR_0(v) || rewriteValueARM_OpARMOR_10(v) 224 case OpARMORconst: 225 return rewriteValueARM_OpARMORconst_0(v) 226 case OpARMORshiftLL: 227 return rewriteValueARM_OpARMORshiftLL_0(v) 228 case OpARMORshiftLLreg: 229 return rewriteValueARM_OpARMORshiftLLreg_0(v) 230 case OpARMORshiftRA: 231 return rewriteValueARM_OpARMORshiftRA_0(v) 232 case OpARMORshiftRAreg: 233 return rewriteValueARM_OpARMORshiftRAreg_0(v) 234 case OpARMORshiftRL: 235 return rewriteValueARM_OpARMORshiftRL_0(v) 236 case OpARMORshiftRLreg: 237 return rewriteValueARM_OpARMORshiftRLreg_0(v) 238 case OpARMRSB: 239 return rewriteValueARM_OpARMRSB_0(v) || rewriteValueARM_OpARMRSB_10(v) 240 case OpARMRSBSshiftLL: 241 return rewriteValueARM_OpARMRSBSshiftLL_0(v) 242 case OpARMRSBSshiftLLreg: 243 return rewriteValueARM_OpARMRSBSshiftLLreg_0(v) 244 case OpARMRSBSshiftRA: 245 return rewriteValueARM_OpARMRSBSshiftRA_0(v) 246 case OpARMRSBSshiftRAreg: 247 return rewriteValueARM_OpARMRSBSshiftRAreg_0(v) 248 case OpARMRSBSshiftRL: 249 return rewriteValueARM_OpARMRSBSshiftRL_0(v) 250 case OpARMRSBSshiftRLreg: 251 return rewriteValueARM_OpARMRSBSshiftRLreg_0(v) 252 case OpARMRSBconst: 253 return rewriteValueARM_OpARMRSBconst_0(v) 254 case OpARMRSBshiftLL: 255 return rewriteValueARM_OpARMRSBshiftLL_0(v) 256 case OpARMRSBshiftLLreg: 257 return rewriteValueARM_OpARMRSBshiftLLreg_0(v) 258 case OpARMRSBshiftRA: 259 return rewriteValueARM_OpARMRSBshiftRA_0(v) 260 case OpARMRSBshiftRAreg: 261 return rewriteValueARM_OpARMRSBshiftRAreg_0(v) 262 case OpARMRSBshiftRL: 263 return rewriteValueARM_OpARMRSBshiftRL_0(v) 264 case OpARMRSBshiftRLreg: 265 return rewriteValueARM_OpARMRSBshiftRLreg_0(v) 266 case OpARMRSCconst: 267 return rewriteValueARM_OpARMRSCconst_0(v) 268 case OpARMRSCshiftLL: 269 return rewriteValueARM_OpARMRSCshiftLL_0(v) 270 case OpARMRSCshiftLLreg: 271 return rewriteValueARM_OpARMRSCshiftLLreg_0(v) 272 case OpARMRSCshiftRA: 273 return rewriteValueARM_OpARMRSCshiftRA_0(v) 274 case OpARMRSCshiftRAreg: 275 return rewriteValueARM_OpARMRSCshiftRAreg_0(v) 276 case OpARMRSCshiftRL: 277 return rewriteValueARM_OpARMRSCshiftRL_0(v) 278 case OpARMRSCshiftRLreg: 279 return rewriteValueARM_OpARMRSCshiftRLreg_0(v) 280 case OpARMSBC: 281 return rewriteValueARM_OpARMSBC_0(v) || rewriteValueARM_OpARMSBC_10(v) 282 case OpARMSBCconst: 283 return rewriteValueARM_OpARMSBCconst_0(v) 284 case OpARMSBCshiftLL: 285 return rewriteValueARM_OpARMSBCshiftLL_0(v) 286 case OpARMSBCshiftLLreg: 287 return rewriteValueARM_OpARMSBCshiftLLreg_0(v) 288 case OpARMSBCshiftRA: 289 return rewriteValueARM_OpARMSBCshiftRA_0(v) 290 case OpARMSBCshiftRAreg: 291 return rewriteValueARM_OpARMSBCshiftRAreg_0(v) 292 case OpARMSBCshiftRL: 293 return rewriteValueARM_OpARMSBCshiftRL_0(v) 294 case OpARMSBCshiftRLreg: 295 return rewriteValueARM_OpARMSBCshiftRLreg_0(v) 296 case OpARMSLL: 297 return rewriteValueARM_OpARMSLL_0(v) 298 case OpARMSLLconst: 299 return rewriteValueARM_OpARMSLLconst_0(v) 300 case OpARMSRA: 301 return rewriteValueARM_OpARMSRA_0(v) 302 case OpARMSRAcond: 303 return rewriteValueARM_OpARMSRAcond_0(v) 304 case OpARMSRAconst: 305 return rewriteValueARM_OpARMSRAconst_0(v) 306 case OpARMSRL: 307 return rewriteValueARM_OpARMSRL_0(v) 308 case OpARMSRLconst: 309 return rewriteValueARM_OpARMSRLconst_0(v) 310 case OpARMSUB: 311 return rewriteValueARM_OpARMSUB_0(v) || rewriteValueARM_OpARMSUB_10(v) 312 case OpARMSUBS: 313 return rewriteValueARM_OpARMSUBS_0(v) || rewriteValueARM_OpARMSUBS_10(v) 314 case OpARMSUBSshiftLL: 315 return rewriteValueARM_OpARMSUBSshiftLL_0(v) 316 case OpARMSUBSshiftLLreg: 317 return rewriteValueARM_OpARMSUBSshiftLLreg_0(v) 318 case OpARMSUBSshiftRA: 319 return rewriteValueARM_OpARMSUBSshiftRA_0(v) 320 case OpARMSUBSshiftRAreg: 321 return rewriteValueARM_OpARMSUBSshiftRAreg_0(v) 322 case OpARMSUBSshiftRL: 323 return rewriteValueARM_OpARMSUBSshiftRL_0(v) 324 case OpARMSUBSshiftRLreg: 325 return rewriteValueARM_OpARMSUBSshiftRLreg_0(v) 326 case OpARMSUBconst: 327 return rewriteValueARM_OpARMSUBconst_0(v) 328 case OpARMSUBshiftLL: 329 return rewriteValueARM_OpARMSUBshiftLL_0(v) 330 case OpARMSUBshiftLLreg: 331 return rewriteValueARM_OpARMSUBshiftLLreg_0(v) 332 case OpARMSUBshiftRA: 333 return rewriteValueARM_OpARMSUBshiftRA_0(v) 334 case OpARMSUBshiftRAreg: 335 return rewriteValueARM_OpARMSUBshiftRAreg_0(v) 336 case OpARMSUBshiftRL: 337 return rewriteValueARM_OpARMSUBshiftRL_0(v) 338 case OpARMSUBshiftRLreg: 339 return rewriteValueARM_OpARMSUBshiftRLreg_0(v) 340 case OpARMXOR: 341 return rewriteValueARM_OpARMXOR_0(v) || rewriteValueARM_OpARMXOR_10(v) 342 case OpARMXORconst: 343 return rewriteValueARM_OpARMXORconst_0(v) 344 case OpARMXORshiftLL: 345 return rewriteValueARM_OpARMXORshiftLL_0(v) 346 case OpARMXORshiftLLreg: 347 return rewriteValueARM_OpARMXORshiftLLreg_0(v) 348 case OpARMXORshiftRA: 349 return rewriteValueARM_OpARMXORshiftRA_0(v) 350 case OpARMXORshiftRAreg: 351 return rewriteValueARM_OpARMXORshiftRAreg_0(v) 352 case OpARMXORshiftRL: 353 return rewriteValueARM_OpARMXORshiftRL_0(v) 354 case OpARMXORshiftRLreg: 355 return rewriteValueARM_OpARMXORshiftRLreg_0(v) 356 case OpARMXORshiftRR: 357 return rewriteValueARM_OpARMXORshiftRR_0(v) 358 case OpAdd16: 359 return rewriteValueARM_OpAdd16_0(v) 360 case OpAdd32: 361 return rewriteValueARM_OpAdd32_0(v) 362 case OpAdd32F: 363 return rewriteValueARM_OpAdd32F_0(v) 364 case OpAdd32carry: 365 return rewriteValueARM_OpAdd32carry_0(v) 366 case OpAdd32withcarry: 367 return rewriteValueARM_OpAdd32withcarry_0(v) 368 case OpAdd64F: 369 return rewriteValueARM_OpAdd64F_0(v) 370 case OpAdd8: 371 return rewriteValueARM_OpAdd8_0(v) 372 case OpAddPtr: 373 return rewriteValueARM_OpAddPtr_0(v) 374 case OpAddr: 375 return rewriteValueARM_OpAddr_0(v) 376 case OpAnd16: 377 return rewriteValueARM_OpAnd16_0(v) 378 case OpAnd32: 379 return rewriteValueARM_OpAnd32_0(v) 380 case OpAnd8: 381 return rewriteValueARM_OpAnd8_0(v) 382 case OpAndB: 383 return rewriteValueARM_OpAndB_0(v) 384 case OpAvg32u: 385 return rewriteValueARM_OpAvg32u_0(v) 386 case OpBitLen32: 387 return rewriteValueARM_OpBitLen32_0(v) 388 case OpBswap32: 389 return rewriteValueARM_OpBswap32_0(v) 390 case OpClosureCall: 391 return rewriteValueARM_OpClosureCall_0(v) 392 case OpCom16: 393 return rewriteValueARM_OpCom16_0(v) 394 case OpCom32: 395 return rewriteValueARM_OpCom32_0(v) 396 case OpCom8: 397 return rewriteValueARM_OpCom8_0(v) 398 case OpConst16: 399 return rewriteValueARM_OpConst16_0(v) 400 case OpConst32: 401 return rewriteValueARM_OpConst32_0(v) 402 case OpConst32F: 403 return rewriteValueARM_OpConst32F_0(v) 404 case OpConst64F: 405 return rewriteValueARM_OpConst64F_0(v) 406 case OpConst8: 407 return rewriteValueARM_OpConst8_0(v) 408 case OpConstBool: 409 return rewriteValueARM_OpConstBool_0(v) 410 case OpConstNil: 411 return rewriteValueARM_OpConstNil_0(v) 412 case OpConvert: 413 return rewriteValueARM_OpConvert_0(v) 414 case OpCtz32: 415 return rewriteValueARM_OpCtz32_0(v) 416 case OpCvt32Fto32: 417 return rewriteValueARM_OpCvt32Fto32_0(v) 418 case OpCvt32Fto32U: 419 return rewriteValueARM_OpCvt32Fto32U_0(v) 420 case OpCvt32Fto64F: 421 return rewriteValueARM_OpCvt32Fto64F_0(v) 422 case OpCvt32Uto32F: 423 return rewriteValueARM_OpCvt32Uto32F_0(v) 424 case OpCvt32Uto64F: 425 return rewriteValueARM_OpCvt32Uto64F_0(v) 426 case OpCvt32to32F: 427 return rewriteValueARM_OpCvt32to32F_0(v) 428 case OpCvt32to64F: 429 return rewriteValueARM_OpCvt32to64F_0(v) 430 case OpCvt64Fto32: 431 return rewriteValueARM_OpCvt64Fto32_0(v) 432 case OpCvt64Fto32F: 433 return rewriteValueARM_OpCvt64Fto32F_0(v) 434 case OpCvt64Fto32U: 435 return rewriteValueARM_OpCvt64Fto32U_0(v) 436 case OpDiv16: 437 return rewriteValueARM_OpDiv16_0(v) 438 case OpDiv16u: 439 return rewriteValueARM_OpDiv16u_0(v) 440 case OpDiv32: 441 return rewriteValueARM_OpDiv32_0(v) 442 case OpDiv32F: 443 return rewriteValueARM_OpDiv32F_0(v) 444 case OpDiv32u: 445 return rewriteValueARM_OpDiv32u_0(v) 446 case OpDiv64F: 447 return rewriteValueARM_OpDiv64F_0(v) 448 case OpDiv8: 449 return rewriteValueARM_OpDiv8_0(v) 450 case OpDiv8u: 451 return rewriteValueARM_OpDiv8u_0(v) 452 case OpEq16: 453 return rewriteValueARM_OpEq16_0(v) 454 case OpEq32: 455 return rewriteValueARM_OpEq32_0(v) 456 case OpEq32F: 457 return rewriteValueARM_OpEq32F_0(v) 458 case OpEq64F: 459 return rewriteValueARM_OpEq64F_0(v) 460 case OpEq8: 461 return rewriteValueARM_OpEq8_0(v) 462 case OpEqB: 463 return rewriteValueARM_OpEqB_0(v) 464 case OpEqPtr: 465 return rewriteValueARM_OpEqPtr_0(v) 466 case OpGeq16: 467 return rewriteValueARM_OpGeq16_0(v) 468 case OpGeq16U: 469 return rewriteValueARM_OpGeq16U_0(v) 470 case OpGeq32: 471 return rewriteValueARM_OpGeq32_0(v) 472 case OpGeq32F: 473 return rewriteValueARM_OpGeq32F_0(v) 474 case OpGeq32U: 475 return rewriteValueARM_OpGeq32U_0(v) 476 case OpGeq64F: 477 return rewriteValueARM_OpGeq64F_0(v) 478 case OpGeq8: 479 return rewriteValueARM_OpGeq8_0(v) 480 case OpGeq8U: 481 return rewriteValueARM_OpGeq8U_0(v) 482 case OpGetClosurePtr: 483 return rewriteValueARM_OpGetClosurePtr_0(v) 484 case OpGreater16: 485 return rewriteValueARM_OpGreater16_0(v) 486 case OpGreater16U: 487 return rewriteValueARM_OpGreater16U_0(v) 488 case OpGreater32: 489 return rewriteValueARM_OpGreater32_0(v) 490 case OpGreater32F: 491 return rewriteValueARM_OpGreater32F_0(v) 492 case OpGreater32U: 493 return rewriteValueARM_OpGreater32U_0(v) 494 case OpGreater64F: 495 return rewriteValueARM_OpGreater64F_0(v) 496 case OpGreater8: 497 return rewriteValueARM_OpGreater8_0(v) 498 case OpGreater8U: 499 return rewriteValueARM_OpGreater8U_0(v) 500 case OpHmul32: 501 return rewriteValueARM_OpHmul32_0(v) 502 case OpHmul32u: 503 return rewriteValueARM_OpHmul32u_0(v) 504 case OpInterCall: 505 return rewriteValueARM_OpInterCall_0(v) 506 case OpIsInBounds: 507 return rewriteValueARM_OpIsInBounds_0(v) 508 case OpIsNonNil: 509 return rewriteValueARM_OpIsNonNil_0(v) 510 case OpIsSliceInBounds: 511 return rewriteValueARM_OpIsSliceInBounds_0(v) 512 case OpLeq16: 513 return rewriteValueARM_OpLeq16_0(v) 514 case OpLeq16U: 515 return rewriteValueARM_OpLeq16U_0(v) 516 case OpLeq32: 517 return rewriteValueARM_OpLeq32_0(v) 518 case OpLeq32F: 519 return rewriteValueARM_OpLeq32F_0(v) 520 case OpLeq32U: 521 return rewriteValueARM_OpLeq32U_0(v) 522 case OpLeq64F: 523 return rewriteValueARM_OpLeq64F_0(v) 524 case OpLeq8: 525 return rewriteValueARM_OpLeq8_0(v) 526 case OpLeq8U: 527 return rewriteValueARM_OpLeq8U_0(v) 528 case OpLess16: 529 return rewriteValueARM_OpLess16_0(v) 530 case OpLess16U: 531 return rewriteValueARM_OpLess16U_0(v) 532 case OpLess32: 533 return rewriteValueARM_OpLess32_0(v) 534 case OpLess32F: 535 return rewriteValueARM_OpLess32F_0(v) 536 case OpLess32U: 537 return rewriteValueARM_OpLess32U_0(v) 538 case OpLess64F: 539 return rewriteValueARM_OpLess64F_0(v) 540 case OpLess8: 541 return rewriteValueARM_OpLess8_0(v) 542 case OpLess8U: 543 return rewriteValueARM_OpLess8U_0(v) 544 case OpLoad: 545 return rewriteValueARM_OpLoad_0(v) 546 case OpLsh16x16: 547 return rewriteValueARM_OpLsh16x16_0(v) 548 case OpLsh16x32: 549 return rewriteValueARM_OpLsh16x32_0(v) 550 case OpLsh16x64: 551 return rewriteValueARM_OpLsh16x64_0(v) 552 case OpLsh16x8: 553 return rewriteValueARM_OpLsh16x8_0(v) 554 case OpLsh32x16: 555 return rewriteValueARM_OpLsh32x16_0(v) 556 case OpLsh32x32: 557 return rewriteValueARM_OpLsh32x32_0(v) 558 case OpLsh32x64: 559 return rewriteValueARM_OpLsh32x64_0(v) 560 case OpLsh32x8: 561 return rewriteValueARM_OpLsh32x8_0(v) 562 case OpLsh8x16: 563 return rewriteValueARM_OpLsh8x16_0(v) 564 case OpLsh8x32: 565 return rewriteValueARM_OpLsh8x32_0(v) 566 case OpLsh8x64: 567 return rewriteValueARM_OpLsh8x64_0(v) 568 case OpLsh8x8: 569 return rewriteValueARM_OpLsh8x8_0(v) 570 case OpMod16: 571 return rewriteValueARM_OpMod16_0(v) 572 case OpMod16u: 573 return rewriteValueARM_OpMod16u_0(v) 574 case OpMod32: 575 return rewriteValueARM_OpMod32_0(v) 576 case OpMod32u: 577 return rewriteValueARM_OpMod32u_0(v) 578 case OpMod8: 579 return rewriteValueARM_OpMod8_0(v) 580 case OpMod8u: 581 return rewriteValueARM_OpMod8u_0(v) 582 case OpMove: 583 return rewriteValueARM_OpMove_0(v) 584 case OpMul16: 585 return rewriteValueARM_OpMul16_0(v) 586 case OpMul32: 587 return rewriteValueARM_OpMul32_0(v) 588 case OpMul32F: 589 return rewriteValueARM_OpMul32F_0(v) 590 case OpMul32uhilo: 591 return rewriteValueARM_OpMul32uhilo_0(v) 592 case OpMul64F: 593 return rewriteValueARM_OpMul64F_0(v) 594 case OpMul8: 595 return rewriteValueARM_OpMul8_0(v) 596 case OpNeg16: 597 return rewriteValueARM_OpNeg16_0(v) 598 case OpNeg32: 599 return rewriteValueARM_OpNeg32_0(v) 600 case OpNeg32F: 601 return rewriteValueARM_OpNeg32F_0(v) 602 case OpNeg64F: 603 return rewriteValueARM_OpNeg64F_0(v) 604 case OpNeg8: 605 return rewriteValueARM_OpNeg8_0(v) 606 case OpNeq16: 607 return rewriteValueARM_OpNeq16_0(v) 608 case OpNeq32: 609 return rewriteValueARM_OpNeq32_0(v) 610 case OpNeq32F: 611 return rewriteValueARM_OpNeq32F_0(v) 612 case OpNeq64F: 613 return rewriteValueARM_OpNeq64F_0(v) 614 case OpNeq8: 615 return rewriteValueARM_OpNeq8_0(v) 616 case OpNeqB: 617 return rewriteValueARM_OpNeqB_0(v) 618 case OpNeqPtr: 619 return rewriteValueARM_OpNeqPtr_0(v) 620 case OpNilCheck: 621 return rewriteValueARM_OpNilCheck_0(v) 622 case OpNot: 623 return rewriteValueARM_OpNot_0(v) 624 case OpOffPtr: 625 return rewriteValueARM_OpOffPtr_0(v) 626 case OpOr16: 627 return rewriteValueARM_OpOr16_0(v) 628 case OpOr32: 629 return rewriteValueARM_OpOr32_0(v) 630 case OpOr8: 631 return rewriteValueARM_OpOr8_0(v) 632 case OpOrB: 633 return rewriteValueARM_OpOrB_0(v) 634 case OpRound32F: 635 return rewriteValueARM_OpRound32F_0(v) 636 case OpRound64F: 637 return rewriteValueARM_OpRound64F_0(v) 638 case OpRsh16Ux16: 639 return rewriteValueARM_OpRsh16Ux16_0(v) 640 case OpRsh16Ux32: 641 return rewriteValueARM_OpRsh16Ux32_0(v) 642 case OpRsh16Ux64: 643 return rewriteValueARM_OpRsh16Ux64_0(v) 644 case OpRsh16Ux8: 645 return rewriteValueARM_OpRsh16Ux8_0(v) 646 case OpRsh16x16: 647 return rewriteValueARM_OpRsh16x16_0(v) 648 case OpRsh16x32: 649 return rewriteValueARM_OpRsh16x32_0(v) 650 case OpRsh16x64: 651 return rewriteValueARM_OpRsh16x64_0(v) 652 case OpRsh16x8: 653 return rewriteValueARM_OpRsh16x8_0(v) 654 case OpRsh32Ux16: 655 return rewriteValueARM_OpRsh32Ux16_0(v) 656 case OpRsh32Ux32: 657 return rewriteValueARM_OpRsh32Ux32_0(v) 658 case OpRsh32Ux64: 659 return rewriteValueARM_OpRsh32Ux64_0(v) 660 case OpRsh32Ux8: 661 return rewriteValueARM_OpRsh32Ux8_0(v) 662 case OpRsh32x16: 663 return rewriteValueARM_OpRsh32x16_0(v) 664 case OpRsh32x32: 665 return rewriteValueARM_OpRsh32x32_0(v) 666 case OpRsh32x64: 667 return rewriteValueARM_OpRsh32x64_0(v) 668 case OpRsh32x8: 669 return rewriteValueARM_OpRsh32x8_0(v) 670 case OpRsh8Ux16: 671 return rewriteValueARM_OpRsh8Ux16_0(v) 672 case OpRsh8Ux32: 673 return rewriteValueARM_OpRsh8Ux32_0(v) 674 case OpRsh8Ux64: 675 return rewriteValueARM_OpRsh8Ux64_0(v) 676 case OpRsh8Ux8: 677 return rewriteValueARM_OpRsh8Ux8_0(v) 678 case OpRsh8x16: 679 return rewriteValueARM_OpRsh8x16_0(v) 680 case OpRsh8x32: 681 return rewriteValueARM_OpRsh8x32_0(v) 682 case OpRsh8x64: 683 return rewriteValueARM_OpRsh8x64_0(v) 684 case OpRsh8x8: 685 return rewriteValueARM_OpRsh8x8_0(v) 686 case OpSelect0: 687 return rewriteValueARM_OpSelect0_0(v) 688 case OpSelect1: 689 return rewriteValueARM_OpSelect1_0(v) 690 case OpSignExt16to32: 691 return rewriteValueARM_OpSignExt16to32_0(v) 692 case OpSignExt8to16: 693 return rewriteValueARM_OpSignExt8to16_0(v) 694 case OpSignExt8to32: 695 return rewriteValueARM_OpSignExt8to32_0(v) 696 case OpSignmask: 697 return rewriteValueARM_OpSignmask_0(v) 698 case OpSlicemask: 699 return rewriteValueARM_OpSlicemask_0(v) 700 case OpSqrt: 701 return rewriteValueARM_OpSqrt_0(v) 702 case OpStaticCall: 703 return rewriteValueARM_OpStaticCall_0(v) 704 case OpStore: 705 return rewriteValueARM_OpStore_0(v) 706 case OpSub16: 707 return rewriteValueARM_OpSub16_0(v) 708 case OpSub32: 709 return rewriteValueARM_OpSub32_0(v) 710 case OpSub32F: 711 return rewriteValueARM_OpSub32F_0(v) 712 case OpSub32carry: 713 return rewriteValueARM_OpSub32carry_0(v) 714 case OpSub32withcarry: 715 return rewriteValueARM_OpSub32withcarry_0(v) 716 case OpSub64F: 717 return rewriteValueARM_OpSub64F_0(v) 718 case OpSub8: 719 return rewriteValueARM_OpSub8_0(v) 720 case OpSubPtr: 721 return rewriteValueARM_OpSubPtr_0(v) 722 case OpTrunc16to8: 723 return rewriteValueARM_OpTrunc16to8_0(v) 724 case OpTrunc32to16: 725 return rewriteValueARM_OpTrunc32to16_0(v) 726 case OpTrunc32to8: 727 return rewriteValueARM_OpTrunc32to8_0(v) 728 case OpXor16: 729 return rewriteValueARM_OpXor16_0(v) 730 case OpXor32: 731 return rewriteValueARM_OpXor32_0(v) 732 case OpXor8: 733 return rewriteValueARM_OpXor8_0(v) 734 case OpZero: 735 return rewriteValueARM_OpZero_0(v) 736 case OpZeroExt16to32: 737 return rewriteValueARM_OpZeroExt16to32_0(v) 738 case OpZeroExt8to16: 739 return rewriteValueARM_OpZeroExt8to16_0(v) 740 case OpZeroExt8to32: 741 return rewriteValueARM_OpZeroExt8to32_0(v) 742 case OpZeromask: 743 return rewriteValueARM_OpZeromask_0(v) 744 } 745 return false 746 } 747 func rewriteValueARM_OpARMADC_0(v *Value) bool { 748 // match: (ADC (MOVWconst [c]) x flags) 749 // cond: 750 // result: (ADCconst [c] x flags) 751 for { 752 _ = v.Args[2] 753 v_0 := v.Args[0] 754 if v_0.Op != OpARMMOVWconst { 755 break 756 } 757 c := v_0.AuxInt 758 x := v.Args[1] 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 _ = v.Args[2] 771 x := v.Args[0] 772 v_1 := v.Args[1] 773 if v_1.Op != OpARMMOVWconst { 774 break 775 } 776 c := v_1.AuxInt 777 flags := v.Args[2] 778 v.reset(OpARMADCconst) 779 v.AuxInt = c 780 v.AddArg(x) 781 v.AddArg(flags) 782 return true 783 } 784 // match: (ADC x (MOVWconst [c]) flags) 785 // cond: 786 // result: (ADCconst [c] x flags) 787 for { 788 _ = v.Args[2] 789 x := v.Args[0] 790 v_1 := v.Args[1] 791 if v_1.Op != OpARMMOVWconst { 792 break 793 } 794 c := v_1.AuxInt 795 flags := v.Args[2] 796 v.reset(OpARMADCconst) 797 v.AuxInt = c 798 v.AddArg(x) 799 v.AddArg(flags) 800 return true 801 } 802 // match: (ADC (MOVWconst [c]) x flags) 803 // cond: 804 // result: (ADCconst [c] x flags) 805 for { 806 _ = v.Args[2] 807 v_0 := v.Args[0] 808 if v_0.Op != OpARMMOVWconst { 809 break 810 } 811 c := v_0.AuxInt 812 x := v.Args[1] 813 flags := v.Args[2] 814 v.reset(OpARMADCconst) 815 v.AuxInt = c 816 v.AddArg(x) 817 v.AddArg(flags) 818 return true 819 } 820 // match: (ADC x (SLLconst [c] y) flags) 821 // cond: 822 // result: (ADCshiftLL x y [c] flags) 823 for { 824 _ = v.Args[2] 825 x := v.Args[0] 826 v_1 := v.Args[1] 827 if v_1.Op != OpARMSLLconst { 828 break 829 } 830 c := v_1.AuxInt 831 y := v_1.Args[0] 832 flags := v.Args[2] 833 v.reset(OpARMADCshiftLL) 834 v.AuxInt = c 835 v.AddArg(x) 836 v.AddArg(y) 837 v.AddArg(flags) 838 return true 839 } 840 // match: (ADC (SLLconst [c] y) x flags) 841 // cond: 842 // result: (ADCshiftLL x y [c] flags) 843 for { 844 _ = v.Args[2] 845 v_0 := v.Args[0] 846 if v_0.Op != OpARMSLLconst { 847 break 848 } 849 c := v_0.AuxInt 850 y := v_0.Args[0] 851 x := v.Args[1] 852 flags := v.Args[2] 853 v.reset(OpARMADCshiftLL) 854 v.AuxInt = c 855 v.AddArg(x) 856 v.AddArg(y) 857 v.AddArg(flags) 858 return true 859 } 860 // match: (ADC (SLLconst [c] y) x flags) 861 // cond: 862 // result: (ADCshiftLL x y [c] flags) 863 for { 864 _ = v.Args[2] 865 v_0 := v.Args[0] 866 if v_0.Op != OpARMSLLconst { 867 break 868 } 869 c := v_0.AuxInt 870 y := v_0.Args[0] 871 x := v.Args[1] 872 flags := v.Args[2] 873 v.reset(OpARMADCshiftLL) 874 v.AuxInt = c 875 v.AddArg(x) 876 v.AddArg(y) 877 v.AddArg(flags) 878 return true 879 } 880 // match: (ADC x (SLLconst [c] y) flags) 881 // cond: 882 // result: (ADCshiftLL x y [c] flags) 883 for { 884 _ = v.Args[2] 885 x := v.Args[0] 886 v_1 := v.Args[1] 887 if v_1.Op != OpARMSLLconst { 888 break 889 } 890 c := v_1.AuxInt 891 y := v_1.Args[0] 892 flags := v.Args[2] 893 v.reset(OpARMADCshiftLL) 894 v.AuxInt = c 895 v.AddArg(x) 896 v.AddArg(y) 897 v.AddArg(flags) 898 return true 899 } 900 // match: (ADC x (SRLconst [c] y) flags) 901 // cond: 902 // result: (ADCshiftRL x y [c] flags) 903 for { 904 _ = v.Args[2] 905 x := v.Args[0] 906 v_1 := v.Args[1] 907 if v_1.Op != OpARMSRLconst { 908 break 909 } 910 c := v_1.AuxInt 911 y := v_1.Args[0] 912 flags := v.Args[2] 913 v.reset(OpARMADCshiftRL) 914 v.AuxInt = c 915 v.AddArg(x) 916 v.AddArg(y) 917 v.AddArg(flags) 918 return true 919 } 920 // match: (ADC (SRLconst [c] y) x flags) 921 // cond: 922 // result: (ADCshiftRL x y [c] flags) 923 for { 924 _ = v.Args[2] 925 v_0 := v.Args[0] 926 if v_0.Op != OpARMSRLconst { 927 break 928 } 929 c := v_0.AuxInt 930 y := v_0.Args[0] 931 x := v.Args[1] 932 flags := v.Args[2] 933 v.reset(OpARMADCshiftRL) 934 v.AuxInt = c 935 v.AddArg(x) 936 v.AddArg(y) 937 v.AddArg(flags) 938 return true 939 } 940 return false 941 } 942 func rewriteValueARM_OpARMADC_10(v *Value) bool { 943 // match: (ADC (SRLconst [c] y) x flags) 944 // cond: 945 // result: (ADCshiftRL x y [c] flags) 946 for { 947 _ = v.Args[2] 948 v_0 := v.Args[0] 949 if v_0.Op != OpARMSRLconst { 950 break 951 } 952 c := v_0.AuxInt 953 y := v_0.Args[0] 954 x := v.Args[1] 955 flags := v.Args[2] 956 v.reset(OpARMADCshiftRL) 957 v.AuxInt = c 958 v.AddArg(x) 959 v.AddArg(y) 960 v.AddArg(flags) 961 return true 962 } 963 // match: (ADC x (SRLconst [c] y) flags) 964 // cond: 965 // result: (ADCshiftRL x y [c] flags) 966 for { 967 _ = v.Args[2] 968 x := v.Args[0] 969 v_1 := v.Args[1] 970 if v_1.Op != OpARMSRLconst { 971 break 972 } 973 c := v_1.AuxInt 974 y := v_1.Args[0] 975 flags := v.Args[2] 976 v.reset(OpARMADCshiftRL) 977 v.AuxInt = c 978 v.AddArg(x) 979 v.AddArg(y) 980 v.AddArg(flags) 981 return true 982 } 983 // match: (ADC x (SRAconst [c] y) flags) 984 // cond: 985 // result: (ADCshiftRA x y [c] flags) 986 for { 987 _ = v.Args[2] 988 x := v.Args[0] 989 v_1 := v.Args[1] 990 if v_1.Op != OpARMSRAconst { 991 break 992 } 993 c := v_1.AuxInt 994 y := v_1.Args[0] 995 flags := v.Args[2] 996 v.reset(OpARMADCshiftRA) 997 v.AuxInt = c 998 v.AddArg(x) 999 v.AddArg(y) 1000 v.AddArg(flags) 1001 return true 1002 } 1003 // match: (ADC (SRAconst [c] y) x flags) 1004 // cond: 1005 // result: (ADCshiftRA x y [c] flags) 1006 for { 1007 _ = v.Args[2] 1008 v_0 := v.Args[0] 1009 if v_0.Op != OpARMSRAconst { 1010 break 1011 } 1012 c := v_0.AuxInt 1013 y := v_0.Args[0] 1014 x := v.Args[1] 1015 flags := v.Args[2] 1016 v.reset(OpARMADCshiftRA) 1017 v.AuxInt = c 1018 v.AddArg(x) 1019 v.AddArg(y) 1020 v.AddArg(flags) 1021 return true 1022 } 1023 // match: (ADC (SRAconst [c] y) x flags) 1024 // cond: 1025 // result: (ADCshiftRA x y [c] flags) 1026 for { 1027 _ = v.Args[2] 1028 v_0 := v.Args[0] 1029 if v_0.Op != OpARMSRAconst { 1030 break 1031 } 1032 c := v_0.AuxInt 1033 y := v_0.Args[0] 1034 x := v.Args[1] 1035 flags := v.Args[2] 1036 v.reset(OpARMADCshiftRA) 1037 v.AuxInt = c 1038 v.AddArg(x) 1039 v.AddArg(y) 1040 v.AddArg(flags) 1041 return true 1042 } 1043 // match: (ADC x (SRAconst [c] y) flags) 1044 // cond: 1045 // result: (ADCshiftRA x y [c] flags) 1046 for { 1047 _ = v.Args[2] 1048 x := v.Args[0] 1049 v_1 := v.Args[1] 1050 if v_1.Op != OpARMSRAconst { 1051 break 1052 } 1053 c := v_1.AuxInt 1054 y := v_1.Args[0] 1055 flags := v.Args[2] 1056 v.reset(OpARMADCshiftRA) 1057 v.AuxInt = c 1058 v.AddArg(x) 1059 v.AddArg(y) 1060 v.AddArg(flags) 1061 return true 1062 } 1063 // match: (ADC x (SLL y z) flags) 1064 // cond: 1065 // result: (ADCshiftLLreg x y z flags) 1066 for { 1067 _ = v.Args[2] 1068 x := v.Args[0] 1069 v_1 := v.Args[1] 1070 if v_1.Op != OpARMSLL { 1071 break 1072 } 1073 _ = v_1.Args[1] 1074 y := v_1.Args[0] 1075 z := v_1.Args[1] 1076 flags := v.Args[2] 1077 v.reset(OpARMADCshiftLLreg) 1078 v.AddArg(x) 1079 v.AddArg(y) 1080 v.AddArg(z) 1081 v.AddArg(flags) 1082 return true 1083 } 1084 // match: (ADC (SLL y z) x flags) 1085 // cond: 1086 // result: (ADCshiftLLreg x y z flags) 1087 for { 1088 _ = v.Args[2] 1089 v_0 := v.Args[0] 1090 if v_0.Op != OpARMSLL { 1091 break 1092 } 1093 _ = v_0.Args[1] 1094 y := v_0.Args[0] 1095 z := v_0.Args[1] 1096 x := v.Args[1] 1097 flags := v.Args[2] 1098 v.reset(OpARMADCshiftLLreg) 1099 v.AddArg(x) 1100 v.AddArg(y) 1101 v.AddArg(z) 1102 v.AddArg(flags) 1103 return true 1104 } 1105 // match: (ADC (SLL y z) x flags) 1106 // cond: 1107 // result: (ADCshiftLLreg x y z flags) 1108 for { 1109 _ = v.Args[2] 1110 v_0 := v.Args[0] 1111 if v_0.Op != OpARMSLL { 1112 break 1113 } 1114 _ = v_0.Args[1] 1115 y := v_0.Args[0] 1116 z := v_0.Args[1] 1117 x := v.Args[1] 1118 flags := v.Args[2] 1119 v.reset(OpARMADCshiftLLreg) 1120 v.AddArg(x) 1121 v.AddArg(y) 1122 v.AddArg(z) 1123 v.AddArg(flags) 1124 return true 1125 } 1126 // match: (ADC x (SLL y z) flags) 1127 // cond: 1128 // result: (ADCshiftLLreg x y z flags) 1129 for { 1130 _ = v.Args[2] 1131 x := v.Args[0] 1132 v_1 := v.Args[1] 1133 if v_1.Op != OpARMSLL { 1134 break 1135 } 1136 _ = v_1.Args[1] 1137 y := v_1.Args[0] 1138 z := v_1.Args[1] 1139 flags := v.Args[2] 1140 v.reset(OpARMADCshiftLLreg) 1141 v.AddArg(x) 1142 v.AddArg(y) 1143 v.AddArg(z) 1144 v.AddArg(flags) 1145 return true 1146 } 1147 return false 1148 } 1149 func rewriteValueARM_OpARMADC_20(v *Value) bool { 1150 // match: (ADC x (SRL y z) flags) 1151 // cond: 1152 // result: (ADCshiftRLreg x y z flags) 1153 for { 1154 _ = v.Args[2] 1155 x := v.Args[0] 1156 v_1 := v.Args[1] 1157 if v_1.Op != OpARMSRL { 1158 break 1159 } 1160 _ = v_1.Args[1] 1161 y := v_1.Args[0] 1162 z := v_1.Args[1] 1163 flags := v.Args[2] 1164 v.reset(OpARMADCshiftRLreg) 1165 v.AddArg(x) 1166 v.AddArg(y) 1167 v.AddArg(z) 1168 v.AddArg(flags) 1169 return true 1170 } 1171 // match: (ADC (SRL y z) x flags) 1172 // cond: 1173 // result: (ADCshiftRLreg x y z flags) 1174 for { 1175 _ = v.Args[2] 1176 v_0 := v.Args[0] 1177 if v_0.Op != OpARMSRL { 1178 break 1179 } 1180 _ = v_0.Args[1] 1181 y := v_0.Args[0] 1182 z := v_0.Args[1] 1183 x := v.Args[1] 1184 flags := v.Args[2] 1185 v.reset(OpARMADCshiftRLreg) 1186 v.AddArg(x) 1187 v.AddArg(y) 1188 v.AddArg(z) 1189 v.AddArg(flags) 1190 return true 1191 } 1192 // match: (ADC (SRL y z) x flags) 1193 // cond: 1194 // result: (ADCshiftRLreg x y z flags) 1195 for { 1196 _ = v.Args[2] 1197 v_0 := v.Args[0] 1198 if v_0.Op != OpARMSRL { 1199 break 1200 } 1201 _ = v_0.Args[1] 1202 y := v_0.Args[0] 1203 z := v_0.Args[1] 1204 x := v.Args[1] 1205 flags := v.Args[2] 1206 v.reset(OpARMADCshiftRLreg) 1207 v.AddArg(x) 1208 v.AddArg(y) 1209 v.AddArg(z) 1210 v.AddArg(flags) 1211 return true 1212 } 1213 // match: (ADC x (SRL y z) flags) 1214 // cond: 1215 // result: (ADCshiftRLreg x y z flags) 1216 for { 1217 _ = v.Args[2] 1218 x := v.Args[0] 1219 v_1 := v.Args[1] 1220 if v_1.Op != OpARMSRL { 1221 break 1222 } 1223 _ = v_1.Args[1] 1224 y := v_1.Args[0] 1225 z := v_1.Args[1] 1226 flags := v.Args[2] 1227 v.reset(OpARMADCshiftRLreg) 1228 v.AddArg(x) 1229 v.AddArg(y) 1230 v.AddArg(z) 1231 v.AddArg(flags) 1232 return true 1233 } 1234 // match: (ADC x (SRA y z) flags) 1235 // cond: 1236 // result: (ADCshiftRAreg x y z flags) 1237 for { 1238 _ = v.Args[2] 1239 x := v.Args[0] 1240 v_1 := v.Args[1] 1241 if v_1.Op != OpARMSRA { 1242 break 1243 } 1244 _ = v_1.Args[1] 1245 y := v_1.Args[0] 1246 z := v_1.Args[1] 1247 flags := v.Args[2] 1248 v.reset(OpARMADCshiftRAreg) 1249 v.AddArg(x) 1250 v.AddArg(y) 1251 v.AddArg(z) 1252 v.AddArg(flags) 1253 return true 1254 } 1255 // match: (ADC (SRA y z) x flags) 1256 // cond: 1257 // result: (ADCshiftRAreg x y z flags) 1258 for { 1259 _ = v.Args[2] 1260 v_0 := v.Args[0] 1261 if v_0.Op != OpARMSRA { 1262 break 1263 } 1264 _ = v_0.Args[1] 1265 y := v_0.Args[0] 1266 z := v_0.Args[1] 1267 x := v.Args[1] 1268 flags := v.Args[2] 1269 v.reset(OpARMADCshiftRAreg) 1270 v.AddArg(x) 1271 v.AddArg(y) 1272 v.AddArg(z) 1273 v.AddArg(flags) 1274 return true 1275 } 1276 // match: (ADC (SRA y z) x flags) 1277 // cond: 1278 // result: (ADCshiftRAreg x y z flags) 1279 for { 1280 _ = v.Args[2] 1281 v_0 := v.Args[0] 1282 if v_0.Op != OpARMSRA { 1283 break 1284 } 1285 _ = v_0.Args[1] 1286 y := v_0.Args[0] 1287 z := v_0.Args[1] 1288 x := v.Args[1] 1289 flags := v.Args[2] 1290 v.reset(OpARMADCshiftRAreg) 1291 v.AddArg(x) 1292 v.AddArg(y) 1293 v.AddArg(z) 1294 v.AddArg(flags) 1295 return true 1296 } 1297 // match: (ADC x (SRA y z) flags) 1298 // cond: 1299 // result: (ADCshiftRAreg x y z flags) 1300 for { 1301 _ = v.Args[2] 1302 x := v.Args[0] 1303 v_1 := v.Args[1] 1304 if v_1.Op != OpARMSRA { 1305 break 1306 } 1307 _ = v_1.Args[1] 1308 y := v_1.Args[0] 1309 z := v_1.Args[1] 1310 flags := v.Args[2] 1311 v.reset(OpARMADCshiftRAreg) 1312 v.AddArg(x) 1313 v.AddArg(y) 1314 v.AddArg(z) 1315 v.AddArg(flags) 1316 return true 1317 } 1318 return false 1319 } 1320 func rewriteValueARM_OpARMADCconst_0(v *Value) bool { 1321 // match: (ADCconst [c] (ADDconst [d] x) flags) 1322 // cond: 1323 // result: (ADCconst [int64(int32(c+d))] x flags) 1324 for { 1325 c := v.AuxInt 1326 _ = v.Args[1] 1327 v_0 := v.Args[0] 1328 if v_0.Op != OpARMADDconst { 1329 break 1330 } 1331 d := v_0.AuxInt 1332 x := v_0.Args[0] 1333 flags := v.Args[1] 1334 v.reset(OpARMADCconst) 1335 v.AuxInt = int64(int32(c + d)) 1336 v.AddArg(x) 1337 v.AddArg(flags) 1338 return true 1339 } 1340 // match: (ADCconst [c] (SUBconst [d] x) flags) 1341 // cond: 1342 // result: (ADCconst [int64(int32(c-d))] x flags) 1343 for { 1344 c := v.AuxInt 1345 _ = v.Args[1] 1346 v_0 := v.Args[0] 1347 if v_0.Op != OpARMSUBconst { 1348 break 1349 } 1350 d := v_0.AuxInt 1351 x := v_0.Args[0] 1352 flags := v.Args[1] 1353 v.reset(OpARMADCconst) 1354 v.AuxInt = int64(int32(c - d)) 1355 v.AddArg(x) 1356 v.AddArg(flags) 1357 return true 1358 } 1359 return false 1360 } 1361 func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { 1362 b := v.Block 1363 _ = b 1364 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1365 // cond: 1366 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1367 for { 1368 d := v.AuxInt 1369 _ = v.Args[2] 1370 v_0 := v.Args[0] 1371 if v_0.Op != OpARMMOVWconst { 1372 break 1373 } 1374 c := v_0.AuxInt 1375 x := v.Args[1] 1376 flags := v.Args[2] 1377 v.reset(OpARMADCconst) 1378 v.AuxInt = c 1379 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1380 v0.AuxInt = d 1381 v0.AddArg(x) 1382 v.AddArg(v0) 1383 v.AddArg(flags) 1384 return true 1385 } 1386 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1387 // cond: 1388 // result: (ADCconst x [int64(uint32(c)<<uint64(d))] flags) 1389 for { 1390 d := v.AuxInt 1391 _ = v.Args[2] 1392 x := v.Args[0] 1393 v_1 := v.Args[1] 1394 if v_1.Op != OpARMMOVWconst { 1395 break 1396 } 1397 c := v_1.AuxInt 1398 flags := v.Args[2] 1399 v.reset(OpARMADCconst) 1400 v.AuxInt = int64(uint32(c) << uint64(d)) 1401 v.AddArg(x) 1402 v.AddArg(flags) 1403 return true 1404 } 1405 return false 1406 } 1407 func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { 1408 b := v.Block 1409 _ = b 1410 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1411 // cond: 1412 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1413 for { 1414 _ = v.Args[3] 1415 v_0 := v.Args[0] 1416 if v_0.Op != OpARMMOVWconst { 1417 break 1418 } 1419 c := v_0.AuxInt 1420 x := v.Args[1] 1421 y := v.Args[2] 1422 flags := v.Args[3] 1423 v.reset(OpARMADCconst) 1424 v.AuxInt = c 1425 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1426 v0.AddArg(x) 1427 v0.AddArg(y) 1428 v.AddArg(v0) 1429 v.AddArg(flags) 1430 return true 1431 } 1432 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1433 // cond: 1434 // result: (ADCshiftLL x y [c] flags) 1435 for { 1436 _ = v.Args[3] 1437 x := v.Args[0] 1438 y := v.Args[1] 1439 v_2 := v.Args[2] 1440 if v_2.Op != OpARMMOVWconst { 1441 break 1442 } 1443 c := v_2.AuxInt 1444 flags := v.Args[3] 1445 v.reset(OpARMADCshiftLL) 1446 v.AuxInt = c 1447 v.AddArg(x) 1448 v.AddArg(y) 1449 v.AddArg(flags) 1450 return true 1451 } 1452 return false 1453 } 1454 func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { 1455 b := v.Block 1456 _ = b 1457 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1458 // cond: 1459 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1460 for { 1461 d := v.AuxInt 1462 _ = v.Args[2] 1463 v_0 := v.Args[0] 1464 if v_0.Op != OpARMMOVWconst { 1465 break 1466 } 1467 c := v_0.AuxInt 1468 x := v.Args[1] 1469 flags := v.Args[2] 1470 v.reset(OpARMADCconst) 1471 v.AuxInt = c 1472 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1473 v0.AuxInt = d 1474 v0.AddArg(x) 1475 v.AddArg(v0) 1476 v.AddArg(flags) 1477 return true 1478 } 1479 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1480 // cond: 1481 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1482 for { 1483 d := v.AuxInt 1484 _ = v.Args[2] 1485 x := v.Args[0] 1486 v_1 := v.Args[1] 1487 if v_1.Op != OpARMMOVWconst { 1488 break 1489 } 1490 c := v_1.AuxInt 1491 flags := v.Args[2] 1492 v.reset(OpARMADCconst) 1493 v.AuxInt = int64(int32(c) >> uint64(d)) 1494 v.AddArg(x) 1495 v.AddArg(flags) 1496 return true 1497 } 1498 return false 1499 } 1500 func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { 1501 b := v.Block 1502 _ = b 1503 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1504 // cond: 1505 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1506 for { 1507 _ = v.Args[3] 1508 v_0 := v.Args[0] 1509 if v_0.Op != OpARMMOVWconst { 1510 break 1511 } 1512 c := v_0.AuxInt 1513 x := v.Args[1] 1514 y := v.Args[2] 1515 flags := v.Args[3] 1516 v.reset(OpARMADCconst) 1517 v.AuxInt = c 1518 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1519 v0.AddArg(x) 1520 v0.AddArg(y) 1521 v.AddArg(v0) 1522 v.AddArg(flags) 1523 return true 1524 } 1525 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1526 // cond: 1527 // result: (ADCshiftRA x y [c] flags) 1528 for { 1529 _ = v.Args[3] 1530 x := v.Args[0] 1531 y := v.Args[1] 1532 v_2 := v.Args[2] 1533 if v_2.Op != OpARMMOVWconst { 1534 break 1535 } 1536 c := v_2.AuxInt 1537 flags := v.Args[3] 1538 v.reset(OpARMADCshiftRA) 1539 v.AuxInt = c 1540 v.AddArg(x) 1541 v.AddArg(y) 1542 v.AddArg(flags) 1543 return true 1544 } 1545 return false 1546 } 1547 func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { 1548 b := v.Block 1549 _ = b 1550 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1551 // cond: 1552 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1553 for { 1554 d := v.AuxInt 1555 _ = v.Args[2] 1556 v_0 := v.Args[0] 1557 if v_0.Op != OpARMMOVWconst { 1558 break 1559 } 1560 c := v_0.AuxInt 1561 x := v.Args[1] 1562 flags := v.Args[2] 1563 v.reset(OpARMADCconst) 1564 v.AuxInt = c 1565 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1566 v0.AuxInt = d 1567 v0.AddArg(x) 1568 v.AddArg(v0) 1569 v.AddArg(flags) 1570 return true 1571 } 1572 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1573 // cond: 1574 // result: (ADCconst x [int64(uint32(c)>>uint64(d))] flags) 1575 for { 1576 d := v.AuxInt 1577 _ = v.Args[2] 1578 x := v.Args[0] 1579 v_1 := v.Args[1] 1580 if v_1.Op != OpARMMOVWconst { 1581 break 1582 } 1583 c := v_1.AuxInt 1584 flags := v.Args[2] 1585 v.reset(OpARMADCconst) 1586 v.AuxInt = int64(uint32(c) >> uint64(d)) 1587 v.AddArg(x) 1588 v.AddArg(flags) 1589 return true 1590 } 1591 return false 1592 } 1593 func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { 1594 b := v.Block 1595 _ = b 1596 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1597 // cond: 1598 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1599 for { 1600 _ = v.Args[3] 1601 v_0 := v.Args[0] 1602 if v_0.Op != OpARMMOVWconst { 1603 break 1604 } 1605 c := v_0.AuxInt 1606 x := v.Args[1] 1607 y := v.Args[2] 1608 flags := v.Args[3] 1609 v.reset(OpARMADCconst) 1610 v.AuxInt = c 1611 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1612 v0.AddArg(x) 1613 v0.AddArg(y) 1614 v.AddArg(v0) 1615 v.AddArg(flags) 1616 return true 1617 } 1618 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1619 // cond: 1620 // result: (ADCshiftRL x y [c] flags) 1621 for { 1622 _ = v.Args[3] 1623 x := v.Args[0] 1624 y := v.Args[1] 1625 v_2 := v.Args[2] 1626 if v_2.Op != OpARMMOVWconst { 1627 break 1628 } 1629 c := v_2.AuxInt 1630 flags := v.Args[3] 1631 v.reset(OpARMADCshiftRL) 1632 v.AuxInt = c 1633 v.AddArg(x) 1634 v.AddArg(y) 1635 v.AddArg(flags) 1636 return true 1637 } 1638 return false 1639 } 1640 func rewriteValueARM_OpARMADD_0(v *Value) bool { 1641 // match: (ADD x (MOVWconst [c])) 1642 // cond: 1643 // result: (ADDconst [c] x) 1644 for { 1645 _ = v.Args[1] 1646 x := v.Args[0] 1647 v_1 := v.Args[1] 1648 if v_1.Op != OpARMMOVWconst { 1649 break 1650 } 1651 c := v_1.AuxInt 1652 v.reset(OpARMADDconst) 1653 v.AuxInt = c 1654 v.AddArg(x) 1655 return true 1656 } 1657 // match: (ADD (MOVWconst [c]) x) 1658 // cond: 1659 // result: (ADDconst [c] x) 1660 for { 1661 _ = v.Args[1] 1662 v_0 := v.Args[0] 1663 if v_0.Op != OpARMMOVWconst { 1664 break 1665 } 1666 c := v_0.AuxInt 1667 x := v.Args[1] 1668 v.reset(OpARMADDconst) 1669 v.AuxInt = c 1670 v.AddArg(x) 1671 return true 1672 } 1673 // match: (ADD x (SLLconst [c] y)) 1674 // cond: 1675 // result: (ADDshiftLL x y [c]) 1676 for { 1677 _ = v.Args[1] 1678 x := v.Args[0] 1679 v_1 := v.Args[1] 1680 if v_1.Op != OpARMSLLconst { 1681 break 1682 } 1683 c := v_1.AuxInt 1684 y := v_1.Args[0] 1685 v.reset(OpARMADDshiftLL) 1686 v.AuxInt = c 1687 v.AddArg(x) 1688 v.AddArg(y) 1689 return true 1690 } 1691 // match: (ADD (SLLconst [c] y) x) 1692 // cond: 1693 // result: (ADDshiftLL x y [c]) 1694 for { 1695 _ = v.Args[1] 1696 v_0 := v.Args[0] 1697 if v_0.Op != OpARMSLLconst { 1698 break 1699 } 1700 c := v_0.AuxInt 1701 y := v_0.Args[0] 1702 x := v.Args[1] 1703 v.reset(OpARMADDshiftLL) 1704 v.AuxInt = c 1705 v.AddArg(x) 1706 v.AddArg(y) 1707 return true 1708 } 1709 // match: (ADD x (SRLconst [c] y)) 1710 // cond: 1711 // result: (ADDshiftRL x y [c]) 1712 for { 1713 _ = v.Args[1] 1714 x := v.Args[0] 1715 v_1 := v.Args[1] 1716 if v_1.Op != OpARMSRLconst { 1717 break 1718 } 1719 c := v_1.AuxInt 1720 y := v_1.Args[0] 1721 v.reset(OpARMADDshiftRL) 1722 v.AuxInt = c 1723 v.AddArg(x) 1724 v.AddArg(y) 1725 return true 1726 } 1727 // match: (ADD (SRLconst [c] y) x) 1728 // cond: 1729 // result: (ADDshiftRL x y [c]) 1730 for { 1731 _ = v.Args[1] 1732 v_0 := v.Args[0] 1733 if v_0.Op != OpARMSRLconst { 1734 break 1735 } 1736 c := v_0.AuxInt 1737 y := v_0.Args[0] 1738 x := v.Args[1] 1739 v.reset(OpARMADDshiftRL) 1740 v.AuxInt = c 1741 v.AddArg(x) 1742 v.AddArg(y) 1743 return true 1744 } 1745 // match: (ADD x (SRAconst [c] y)) 1746 // cond: 1747 // result: (ADDshiftRA x y [c]) 1748 for { 1749 _ = v.Args[1] 1750 x := v.Args[0] 1751 v_1 := v.Args[1] 1752 if v_1.Op != OpARMSRAconst { 1753 break 1754 } 1755 c := v_1.AuxInt 1756 y := v_1.Args[0] 1757 v.reset(OpARMADDshiftRA) 1758 v.AuxInt = c 1759 v.AddArg(x) 1760 v.AddArg(y) 1761 return true 1762 } 1763 // match: (ADD (SRAconst [c] y) x) 1764 // cond: 1765 // result: (ADDshiftRA x y [c]) 1766 for { 1767 _ = v.Args[1] 1768 v_0 := v.Args[0] 1769 if v_0.Op != OpARMSRAconst { 1770 break 1771 } 1772 c := v_0.AuxInt 1773 y := v_0.Args[0] 1774 x := v.Args[1] 1775 v.reset(OpARMADDshiftRA) 1776 v.AuxInt = c 1777 v.AddArg(x) 1778 v.AddArg(y) 1779 return true 1780 } 1781 // match: (ADD x (SLL y z)) 1782 // cond: 1783 // result: (ADDshiftLLreg x y z) 1784 for { 1785 _ = v.Args[1] 1786 x := v.Args[0] 1787 v_1 := v.Args[1] 1788 if v_1.Op != OpARMSLL { 1789 break 1790 } 1791 _ = v_1.Args[1] 1792 y := v_1.Args[0] 1793 z := v_1.Args[1] 1794 v.reset(OpARMADDshiftLLreg) 1795 v.AddArg(x) 1796 v.AddArg(y) 1797 v.AddArg(z) 1798 return true 1799 } 1800 // match: (ADD (SLL y z) x) 1801 // cond: 1802 // result: (ADDshiftLLreg x y z) 1803 for { 1804 _ = v.Args[1] 1805 v_0 := v.Args[0] 1806 if v_0.Op != OpARMSLL { 1807 break 1808 } 1809 _ = v_0.Args[1] 1810 y := v_0.Args[0] 1811 z := v_0.Args[1] 1812 x := v.Args[1] 1813 v.reset(OpARMADDshiftLLreg) 1814 v.AddArg(x) 1815 v.AddArg(y) 1816 v.AddArg(z) 1817 return true 1818 } 1819 return false 1820 } 1821 func rewriteValueARM_OpARMADD_10(v *Value) bool { 1822 b := v.Block 1823 _ = b 1824 // match: (ADD x (SRL y z)) 1825 // cond: 1826 // result: (ADDshiftRLreg x y z) 1827 for { 1828 _ = v.Args[1] 1829 x := v.Args[0] 1830 v_1 := v.Args[1] 1831 if v_1.Op != OpARMSRL { 1832 break 1833 } 1834 _ = v_1.Args[1] 1835 y := v_1.Args[0] 1836 z := v_1.Args[1] 1837 v.reset(OpARMADDshiftRLreg) 1838 v.AddArg(x) 1839 v.AddArg(y) 1840 v.AddArg(z) 1841 return true 1842 } 1843 // match: (ADD (SRL y z) x) 1844 // cond: 1845 // result: (ADDshiftRLreg x y z) 1846 for { 1847 _ = v.Args[1] 1848 v_0 := v.Args[0] 1849 if v_0.Op != OpARMSRL { 1850 break 1851 } 1852 _ = v_0.Args[1] 1853 y := v_0.Args[0] 1854 z := v_0.Args[1] 1855 x := v.Args[1] 1856 v.reset(OpARMADDshiftRLreg) 1857 v.AddArg(x) 1858 v.AddArg(y) 1859 v.AddArg(z) 1860 return true 1861 } 1862 // match: (ADD x (SRA y z)) 1863 // cond: 1864 // result: (ADDshiftRAreg x y z) 1865 for { 1866 _ = v.Args[1] 1867 x := v.Args[0] 1868 v_1 := v.Args[1] 1869 if v_1.Op != OpARMSRA { 1870 break 1871 } 1872 _ = v_1.Args[1] 1873 y := v_1.Args[0] 1874 z := v_1.Args[1] 1875 v.reset(OpARMADDshiftRAreg) 1876 v.AddArg(x) 1877 v.AddArg(y) 1878 v.AddArg(z) 1879 return true 1880 } 1881 // match: (ADD (SRA y z) x) 1882 // cond: 1883 // result: (ADDshiftRAreg x y z) 1884 for { 1885 _ = v.Args[1] 1886 v_0 := v.Args[0] 1887 if v_0.Op != OpARMSRA { 1888 break 1889 } 1890 _ = v_0.Args[1] 1891 y := v_0.Args[0] 1892 z := v_0.Args[1] 1893 x := v.Args[1] 1894 v.reset(OpARMADDshiftRAreg) 1895 v.AddArg(x) 1896 v.AddArg(y) 1897 v.AddArg(z) 1898 return true 1899 } 1900 // match: (ADD x (RSBconst [0] y)) 1901 // cond: 1902 // result: (SUB x y) 1903 for { 1904 _ = v.Args[1] 1905 x := v.Args[0] 1906 v_1 := v.Args[1] 1907 if v_1.Op != OpARMRSBconst { 1908 break 1909 } 1910 if v_1.AuxInt != 0 { 1911 break 1912 } 1913 y := v_1.Args[0] 1914 v.reset(OpARMSUB) 1915 v.AddArg(x) 1916 v.AddArg(y) 1917 return true 1918 } 1919 // match: (ADD (RSBconst [0] y) x) 1920 // cond: 1921 // result: (SUB x y) 1922 for { 1923 _ = v.Args[1] 1924 v_0 := v.Args[0] 1925 if v_0.Op != OpARMRSBconst { 1926 break 1927 } 1928 if v_0.AuxInt != 0 { 1929 break 1930 } 1931 y := v_0.Args[0] 1932 x := v.Args[1] 1933 v.reset(OpARMSUB) 1934 v.AddArg(x) 1935 v.AddArg(y) 1936 return true 1937 } 1938 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 1939 // cond: 1940 // result: (RSBconst [c+d] (ADD <t> x y)) 1941 for { 1942 t := v.Type 1943 _ = v.Args[1] 1944 v_0 := v.Args[0] 1945 if v_0.Op != OpARMRSBconst { 1946 break 1947 } 1948 c := v_0.AuxInt 1949 x := v_0.Args[0] 1950 v_1 := v.Args[1] 1951 if v_1.Op != OpARMRSBconst { 1952 break 1953 } 1954 d := v_1.AuxInt 1955 y := v_1.Args[0] 1956 v.reset(OpARMRSBconst) 1957 v.AuxInt = c + d 1958 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1959 v0.AddArg(x) 1960 v0.AddArg(y) 1961 v.AddArg(v0) 1962 return true 1963 } 1964 // match: (ADD <t> (RSBconst [d] y) (RSBconst [c] x)) 1965 // cond: 1966 // result: (RSBconst [c+d] (ADD <t> x y)) 1967 for { 1968 t := v.Type 1969 _ = v.Args[1] 1970 v_0 := v.Args[0] 1971 if v_0.Op != OpARMRSBconst { 1972 break 1973 } 1974 d := v_0.AuxInt 1975 y := v_0.Args[0] 1976 v_1 := v.Args[1] 1977 if v_1.Op != OpARMRSBconst { 1978 break 1979 } 1980 c := v_1.AuxInt 1981 x := v_1.Args[0] 1982 v.reset(OpARMRSBconst) 1983 v.AuxInt = c + d 1984 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1985 v0.AddArg(x) 1986 v0.AddArg(y) 1987 v.AddArg(v0) 1988 return true 1989 } 1990 // match: (ADD (MUL x y) a) 1991 // cond: 1992 // result: (MULA x y a) 1993 for { 1994 _ = v.Args[1] 1995 v_0 := v.Args[0] 1996 if v_0.Op != OpARMMUL { 1997 break 1998 } 1999 _ = v_0.Args[1] 2000 x := v_0.Args[0] 2001 y := v_0.Args[1] 2002 a := v.Args[1] 2003 v.reset(OpARMMULA) 2004 v.AddArg(x) 2005 v.AddArg(y) 2006 v.AddArg(a) 2007 return true 2008 } 2009 // match: (ADD a (MUL x y)) 2010 // cond: 2011 // result: (MULA x y a) 2012 for { 2013 _ = v.Args[1] 2014 a := v.Args[0] 2015 v_1 := v.Args[1] 2016 if v_1.Op != OpARMMUL { 2017 break 2018 } 2019 _ = v_1.Args[1] 2020 x := v_1.Args[0] 2021 y := v_1.Args[1] 2022 v.reset(OpARMMULA) 2023 v.AddArg(x) 2024 v.AddArg(y) 2025 v.AddArg(a) 2026 return true 2027 } 2028 return false 2029 } 2030 func rewriteValueARM_OpARMADDS_0(v *Value) bool { 2031 // match: (ADDS x (MOVWconst [c])) 2032 // cond: 2033 // result: (ADDSconst [c] x) 2034 for { 2035 _ = v.Args[1] 2036 x := v.Args[0] 2037 v_1 := v.Args[1] 2038 if v_1.Op != OpARMMOVWconst { 2039 break 2040 } 2041 c := v_1.AuxInt 2042 v.reset(OpARMADDSconst) 2043 v.AuxInt = c 2044 v.AddArg(x) 2045 return true 2046 } 2047 // match: (ADDS (MOVWconst [c]) x) 2048 // cond: 2049 // result: (ADDSconst [c] x) 2050 for { 2051 _ = v.Args[1] 2052 v_0 := v.Args[0] 2053 if v_0.Op != OpARMMOVWconst { 2054 break 2055 } 2056 c := v_0.AuxInt 2057 x := v.Args[1] 2058 v.reset(OpARMADDSconst) 2059 v.AuxInt = c 2060 v.AddArg(x) 2061 return true 2062 } 2063 // match: (ADDS x (SLLconst [c] y)) 2064 // cond: 2065 // result: (ADDSshiftLL x y [c]) 2066 for { 2067 _ = v.Args[1] 2068 x := v.Args[0] 2069 v_1 := v.Args[1] 2070 if v_1.Op != OpARMSLLconst { 2071 break 2072 } 2073 c := v_1.AuxInt 2074 y := v_1.Args[0] 2075 v.reset(OpARMADDSshiftLL) 2076 v.AuxInt = c 2077 v.AddArg(x) 2078 v.AddArg(y) 2079 return true 2080 } 2081 // match: (ADDS (SLLconst [c] y) x) 2082 // cond: 2083 // result: (ADDSshiftLL x y [c]) 2084 for { 2085 _ = v.Args[1] 2086 v_0 := v.Args[0] 2087 if v_0.Op != OpARMSLLconst { 2088 break 2089 } 2090 c := v_0.AuxInt 2091 y := v_0.Args[0] 2092 x := v.Args[1] 2093 v.reset(OpARMADDSshiftLL) 2094 v.AuxInt = c 2095 v.AddArg(x) 2096 v.AddArg(y) 2097 return true 2098 } 2099 // match: (ADDS x (SRLconst [c] y)) 2100 // cond: 2101 // result: (ADDSshiftRL x y [c]) 2102 for { 2103 _ = v.Args[1] 2104 x := v.Args[0] 2105 v_1 := v.Args[1] 2106 if v_1.Op != OpARMSRLconst { 2107 break 2108 } 2109 c := v_1.AuxInt 2110 y := v_1.Args[0] 2111 v.reset(OpARMADDSshiftRL) 2112 v.AuxInt = c 2113 v.AddArg(x) 2114 v.AddArg(y) 2115 return true 2116 } 2117 // match: (ADDS (SRLconst [c] y) x) 2118 // cond: 2119 // result: (ADDSshiftRL x y [c]) 2120 for { 2121 _ = v.Args[1] 2122 v_0 := v.Args[0] 2123 if v_0.Op != OpARMSRLconst { 2124 break 2125 } 2126 c := v_0.AuxInt 2127 y := v_0.Args[0] 2128 x := v.Args[1] 2129 v.reset(OpARMADDSshiftRL) 2130 v.AuxInt = c 2131 v.AddArg(x) 2132 v.AddArg(y) 2133 return true 2134 } 2135 // match: (ADDS x (SRAconst [c] y)) 2136 // cond: 2137 // result: (ADDSshiftRA x y [c]) 2138 for { 2139 _ = v.Args[1] 2140 x := v.Args[0] 2141 v_1 := v.Args[1] 2142 if v_1.Op != OpARMSRAconst { 2143 break 2144 } 2145 c := v_1.AuxInt 2146 y := v_1.Args[0] 2147 v.reset(OpARMADDSshiftRA) 2148 v.AuxInt = c 2149 v.AddArg(x) 2150 v.AddArg(y) 2151 return true 2152 } 2153 // match: (ADDS (SRAconst [c] y) x) 2154 // cond: 2155 // result: (ADDSshiftRA x y [c]) 2156 for { 2157 _ = v.Args[1] 2158 v_0 := v.Args[0] 2159 if v_0.Op != OpARMSRAconst { 2160 break 2161 } 2162 c := v_0.AuxInt 2163 y := v_0.Args[0] 2164 x := v.Args[1] 2165 v.reset(OpARMADDSshiftRA) 2166 v.AuxInt = c 2167 v.AddArg(x) 2168 v.AddArg(y) 2169 return true 2170 } 2171 // match: (ADDS x (SLL y z)) 2172 // cond: 2173 // result: (ADDSshiftLLreg x y z) 2174 for { 2175 _ = v.Args[1] 2176 x := v.Args[0] 2177 v_1 := v.Args[1] 2178 if v_1.Op != OpARMSLL { 2179 break 2180 } 2181 _ = v_1.Args[1] 2182 y := v_1.Args[0] 2183 z := v_1.Args[1] 2184 v.reset(OpARMADDSshiftLLreg) 2185 v.AddArg(x) 2186 v.AddArg(y) 2187 v.AddArg(z) 2188 return true 2189 } 2190 // match: (ADDS (SLL y z) x) 2191 // cond: 2192 // result: (ADDSshiftLLreg x y z) 2193 for { 2194 _ = v.Args[1] 2195 v_0 := v.Args[0] 2196 if v_0.Op != OpARMSLL { 2197 break 2198 } 2199 _ = v_0.Args[1] 2200 y := v_0.Args[0] 2201 z := v_0.Args[1] 2202 x := v.Args[1] 2203 v.reset(OpARMADDSshiftLLreg) 2204 v.AddArg(x) 2205 v.AddArg(y) 2206 v.AddArg(z) 2207 return true 2208 } 2209 return false 2210 } 2211 func rewriteValueARM_OpARMADDS_10(v *Value) bool { 2212 // match: (ADDS x (SRL y z)) 2213 // cond: 2214 // result: (ADDSshiftRLreg x y z) 2215 for { 2216 _ = v.Args[1] 2217 x := v.Args[0] 2218 v_1 := v.Args[1] 2219 if v_1.Op != OpARMSRL { 2220 break 2221 } 2222 _ = v_1.Args[1] 2223 y := v_1.Args[0] 2224 z := v_1.Args[1] 2225 v.reset(OpARMADDSshiftRLreg) 2226 v.AddArg(x) 2227 v.AddArg(y) 2228 v.AddArg(z) 2229 return true 2230 } 2231 // match: (ADDS (SRL y z) x) 2232 // cond: 2233 // result: (ADDSshiftRLreg x y z) 2234 for { 2235 _ = v.Args[1] 2236 v_0 := v.Args[0] 2237 if v_0.Op != OpARMSRL { 2238 break 2239 } 2240 _ = v_0.Args[1] 2241 y := v_0.Args[0] 2242 z := v_0.Args[1] 2243 x := v.Args[1] 2244 v.reset(OpARMADDSshiftRLreg) 2245 v.AddArg(x) 2246 v.AddArg(y) 2247 v.AddArg(z) 2248 return true 2249 } 2250 // match: (ADDS x (SRA y z)) 2251 // cond: 2252 // result: (ADDSshiftRAreg x y z) 2253 for { 2254 _ = v.Args[1] 2255 x := v.Args[0] 2256 v_1 := v.Args[1] 2257 if v_1.Op != OpARMSRA { 2258 break 2259 } 2260 _ = v_1.Args[1] 2261 y := v_1.Args[0] 2262 z := v_1.Args[1] 2263 v.reset(OpARMADDSshiftRAreg) 2264 v.AddArg(x) 2265 v.AddArg(y) 2266 v.AddArg(z) 2267 return true 2268 } 2269 // match: (ADDS (SRA y z) x) 2270 // cond: 2271 // result: (ADDSshiftRAreg x y z) 2272 for { 2273 _ = v.Args[1] 2274 v_0 := v.Args[0] 2275 if v_0.Op != OpARMSRA { 2276 break 2277 } 2278 _ = v_0.Args[1] 2279 y := v_0.Args[0] 2280 z := v_0.Args[1] 2281 x := v.Args[1] 2282 v.reset(OpARMADDSshiftRAreg) 2283 v.AddArg(x) 2284 v.AddArg(y) 2285 v.AddArg(z) 2286 return true 2287 } 2288 return false 2289 } 2290 func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { 2291 b := v.Block 2292 _ = b 2293 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 2294 // cond: 2295 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 2296 for { 2297 d := v.AuxInt 2298 _ = v.Args[1] 2299 v_0 := v.Args[0] 2300 if v_0.Op != OpARMMOVWconst { 2301 break 2302 } 2303 c := v_0.AuxInt 2304 x := v.Args[1] 2305 v.reset(OpARMADDSconst) 2306 v.AuxInt = c 2307 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2308 v0.AuxInt = d 2309 v0.AddArg(x) 2310 v.AddArg(v0) 2311 return true 2312 } 2313 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 2314 // cond: 2315 // result: (ADDSconst x [int64(uint32(c)<<uint64(d))]) 2316 for { 2317 d := v.AuxInt 2318 _ = v.Args[1] 2319 x := v.Args[0] 2320 v_1 := v.Args[1] 2321 if v_1.Op != OpARMMOVWconst { 2322 break 2323 } 2324 c := v_1.AuxInt 2325 v.reset(OpARMADDSconst) 2326 v.AuxInt = int64(uint32(c) << uint64(d)) 2327 v.AddArg(x) 2328 return true 2329 } 2330 return false 2331 } 2332 func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { 2333 b := v.Block 2334 _ = b 2335 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 2336 // cond: 2337 // result: (ADDSconst [c] (SLL <x.Type> x y)) 2338 for { 2339 _ = v.Args[2] 2340 v_0 := v.Args[0] 2341 if v_0.Op != OpARMMOVWconst { 2342 break 2343 } 2344 c := v_0.AuxInt 2345 x := v.Args[1] 2346 y := v.Args[2] 2347 v.reset(OpARMADDSconst) 2348 v.AuxInt = c 2349 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2350 v0.AddArg(x) 2351 v0.AddArg(y) 2352 v.AddArg(v0) 2353 return true 2354 } 2355 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 2356 // cond: 2357 // result: (ADDSshiftLL x y [c]) 2358 for { 2359 _ = v.Args[2] 2360 x := v.Args[0] 2361 y := v.Args[1] 2362 v_2 := v.Args[2] 2363 if v_2.Op != OpARMMOVWconst { 2364 break 2365 } 2366 c := v_2.AuxInt 2367 v.reset(OpARMADDSshiftLL) 2368 v.AuxInt = c 2369 v.AddArg(x) 2370 v.AddArg(y) 2371 return true 2372 } 2373 return false 2374 } 2375 func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { 2376 b := v.Block 2377 _ = b 2378 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 2379 // cond: 2380 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 2381 for { 2382 d := v.AuxInt 2383 _ = v.Args[1] 2384 v_0 := v.Args[0] 2385 if v_0.Op != OpARMMOVWconst { 2386 break 2387 } 2388 c := v_0.AuxInt 2389 x := v.Args[1] 2390 v.reset(OpARMADDSconst) 2391 v.AuxInt = c 2392 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2393 v0.AuxInt = d 2394 v0.AddArg(x) 2395 v.AddArg(v0) 2396 return true 2397 } 2398 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 2399 // cond: 2400 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 2401 for { 2402 d := v.AuxInt 2403 _ = v.Args[1] 2404 x := v.Args[0] 2405 v_1 := v.Args[1] 2406 if v_1.Op != OpARMMOVWconst { 2407 break 2408 } 2409 c := v_1.AuxInt 2410 v.reset(OpARMADDSconst) 2411 v.AuxInt = int64(int32(c) >> uint64(d)) 2412 v.AddArg(x) 2413 return true 2414 } 2415 return false 2416 } 2417 func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { 2418 b := v.Block 2419 _ = b 2420 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 2421 // cond: 2422 // result: (ADDSconst [c] (SRA <x.Type> x y)) 2423 for { 2424 _ = v.Args[2] 2425 v_0 := v.Args[0] 2426 if v_0.Op != OpARMMOVWconst { 2427 break 2428 } 2429 c := v_0.AuxInt 2430 x := v.Args[1] 2431 y := v.Args[2] 2432 v.reset(OpARMADDSconst) 2433 v.AuxInt = c 2434 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2435 v0.AddArg(x) 2436 v0.AddArg(y) 2437 v.AddArg(v0) 2438 return true 2439 } 2440 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 2441 // cond: 2442 // result: (ADDSshiftRA x y [c]) 2443 for { 2444 _ = v.Args[2] 2445 x := v.Args[0] 2446 y := v.Args[1] 2447 v_2 := v.Args[2] 2448 if v_2.Op != OpARMMOVWconst { 2449 break 2450 } 2451 c := v_2.AuxInt 2452 v.reset(OpARMADDSshiftRA) 2453 v.AuxInt = c 2454 v.AddArg(x) 2455 v.AddArg(y) 2456 return true 2457 } 2458 return false 2459 } 2460 func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { 2461 b := v.Block 2462 _ = b 2463 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2464 // cond: 2465 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2466 for { 2467 d := v.AuxInt 2468 _ = v.Args[1] 2469 v_0 := v.Args[0] 2470 if v_0.Op != OpARMMOVWconst { 2471 break 2472 } 2473 c := v_0.AuxInt 2474 x := v.Args[1] 2475 v.reset(OpARMADDSconst) 2476 v.AuxInt = c 2477 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2478 v0.AuxInt = d 2479 v0.AddArg(x) 2480 v.AddArg(v0) 2481 return true 2482 } 2483 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2484 // cond: 2485 // result: (ADDSconst x [int64(uint32(c)>>uint64(d))]) 2486 for { 2487 d := v.AuxInt 2488 _ = v.Args[1] 2489 x := v.Args[0] 2490 v_1 := v.Args[1] 2491 if v_1.Op != OpARMMOVWconst { 2492 break 2493 } 2494 c := v_1.AuxInt 2495 v.reset(OpARMADDSconst) 2496 v.AuxInt = int64(uint32(c) >> uint64(d)) 2497 v.AddArg(x) 2498 return true 2499 } 2500 return false 2501 } 2502 func rewriteValueARM_OpARMADDSshiftRLreg_0(v *Value) bool { 2503 b := v.Block 2504 _ = b 2505 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2506 // cond: 2507 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2508 for { 2509 _ = v.Args[2] 2510 v_0 := v.Args[0] 2511 if v_0.Op != OpARMMOVWconst { 2512 break 2513 } 2514 c := v_0.AuxInt 2515 x := v.Args[1] 2516 y := v.Args[2] 2517 v.reset(OpARMADDSconst) 2518 v.AuxInt = c 2519 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2520 v0.AddArg(x) 2521 v0.AddArg(y) 2522 v.AddArg(v0) 2523 return true 2524 } 2525 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2526 // cond: 2527 // result: (ADDSshiftRL x y [c]) 2528 for { 2529 _ = v.Args[2] 2530 x := v.Args[0] 2531 y := v.Args[1] 2532 v_2 := v.Args[2] 2533 if v_2.Op != OpARMMOVWconst { 2534 break 2535 } 2536 c := v_2.AuxInt 2537 v.reset(OpARMADDSshiftRL) 2538 v.AuxInt = c 2539 v.AddArg(x) 2540 v.AddArg(y) 2541 return true 2542 } 2543 return false 2544 } 2545 func rewriteValueARM_OpARMADDconst_0(v *Value) bool { 2546 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2547 // cond: 2548 // result: (MOVWaddr [off1+off2] {sym} ptr) 2549 for { 2550 off1 := v.AuxInt 2551 v_0 := v.Args[0] 2552 if v_0.Op != OpARMMOVWaddr { 2553 break 2554 } 2555 off2 := v_0.AuxInt 2556 sym := v_0.Aux 2557 ptr := v_0.Args[0] 2558 v.reset(OpARMMOVWaddr) 2559 v.AuxInt = off1 + off2 2560 v.Aux = sym 2561 v.AddArg(ptr) 2562 return true 2563 } 2564 // match: (ADDconst [0] x) 2565 // cond: 2566 // result: x 2567 for { 2568 if v.AuxInt != 0 { 2569 break 2570 } 2571 x := v.Args[0] 2572 v.reset(OpCopy) 2573 v.Type = x.Type 2574 v.AddArg(x) 2575 return true 2576 } 2577 // match: (ADDconst [c] x) 2578 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 2579 // result: (SUBconst [int64(int32(-c))] x) 2580 for { 2581 c := v.AuxInt 2582 x := v.Args[0] 2583 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 2584 break 2585 } 2586 v.reset(OpARMSUBconst) 2587 v.AuxInt = int64(int32(-c)) 2588 v.AddArg(x) 2589 return true 2590 } 2591 // match: (ADDconst [c] (MOVWconst [d])) 2592 // cond: 2593 // result: (MOVWconst [int64(int32(c+d))]) 2594 for { 2595 c := v.AuxInt 2596 v_0 := v.Args[0] 2597 if v_0.Op != OpARMMOVWconst { 2598 break 2599 } 2600 d := v_0.AuxInt 2601 v.reset(OpARMMOVWconst) 2602 v.AuxInt = int64(int32(c + d)) 2603 return true 2604 } 2605 // match: (ADDconst [c] (ADDconst [d] x)) 2606 // cond: 2607 // result: (ADDconst [int64(int32(c+d))] x) 2608 for { 2609 c := v.AuxInt 2610 v_0 := v.Args[0] 2611 if v_0.Op != OpARMADDconst { 2612 break 2613 } 2614 d := v_0.AuxInt 2615 x := v_0.Args[0] 2616 v.reset(OpARMADDconst) 2617 v.AuxInt = int64(int32(c + d)) 2618 v.AddArg(x) 2619 return true 2620 } 2621 // match: (ADDconst [c] (SUBconst [d] x)) 2622 // cond: 2623 // result: (ADDconst [int64(int32(c-d))] x) 2624 for { 2625 c := v.AuxInt 2626 v_0 := v.Args[0] 2627 if v_0.Op != OpARMSUBconst { 2628 break 2629 } 2630 d := v_0.AuxInt 2631 x := v_0.Args[0] 2632 v.reset(OpARMADDconst) 2633 v.AuxInt = int64(int32(c - d)) 2634 v.AddArg(x) 2635 return true 2636 } 2637 // match: (ADDconst [c] (RSBconst [d] x)) 2638 // cond: 2639 // result: (RSBconst [int64(int32(c+d))] x) 2640 for { 2641 c := v.AuxInt 2642 v_0 := v.Args[0] 2643 if v_0.Op != OpARMRSBconst { 2644 break 2645 } 2646 d := v_0.AuxInt 2647 x := v_0.Args[0] 2648 v.reset(OpARMRSBconst) 2649 v.AuxInt = int64(int32(c + d)) 2650 v.AddArg(x) 2651 return true 2652 } 2653 return false 2654 } 2655 func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { 2656 b := v.Block 2657 _ = b 2658 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2659 // cond: 2660 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2661 for { 2662 d := v.AuxInt 2663 _ = v.Args[1] 2664 v_0 := v.Args[0] 2665 if v_0.Op != OpARMMOVWconst { 2666 break 2667 } 2668 c := v_0.AuxInt 2669 x := v.Args[1] 2670 v.reset(OpARMADDconst) 2671 v.AuxInt = c 2672 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2673 v0.AuxInt = d 2674 v0.AddArg(x) 2675 v.AddArg(v0) 2676 return true 2677 } 2678 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2679 // cond: 2680 // result: (ADDconst x [int64(uint32(c)<<uint64(d))]) 2681 for { 2682 d := v.AuxInt 2683 _ = v.Args[1] 2684 x := v.Args[0] 2685 v_1 := v.Args[1] 2686 if v_1.Op != OpARMMOVWconst { 2687 break 2688 } 2689 c := v_1.AuxInt 2690 v.reset(OpARMADDconst) 2691 v.AuxInt = int64(uint32(c) << uint64(d)) 2692 v.AddArg(x) 2693 return true 2694 } 2695 // match: (ADDshiftLL [c] (SRLconst x [32-c]) x) 2696 // cond: 2697 // result: (SRRconst [32-c] x) 2698 for { 2699 c := v.AuxInt 2700 _ = v.Args[1] 2701 v_0 := v.Args[0] 2702 if v_0.Op != OpARMSRLconst { 2703 break 2704 } 2705 if v_0.AuxInt != 32-c { 2706 break 2707 } 2708 x := v_0.Args[0] 2709 if x != v.Args[1] { 2710 break 2711 } 2712 v.reset(OpARMSRRconst) 2713 v.AuxInt = 32 - c 2714 v.AddArg(x) 2715 return true 2716 } 2717 return false 2718 } 2719 func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { 2720 b := v.Block 2721 _ = b 2722 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2723 // cond: 2724 // result: (ADDconst [c] (SLL <x.Type> x y)) 2725 for { 2726 _ = v.Args[2] 2727 v_0 := v.Args[0] 2728 if v_0.Op != OpARMMOVWconst { 2729 break 2730 } 2731 c := v_0.AuxInt 2732 x := v.Args[1] 2733 y := v.Args[2] 2734 v.reset(OpARMADDconst) 2735 v.AuxInt = c 2736 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2737 v0.AddArg(x) 2738 v0.AddArg(y) 2739 v.AddArg(v0) 2740 return true 2741 } 2742 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2743 // cond: 2744 // result: (ADDshiftLL x y [c]) 2745 for { 2746 _ = v.Args[2] 2747 x := v.Args[0] 2748 y := v.Args[1] 2749 v_2 := v.Args[2] 2750 if v_2.Op != OpARMMOVWconst { 2751 break 2752 } 2753 c := v_2.AuxInt 2754 v.reset(OpARMADDshiftLL) 2755 v.AuxInt = c 2756 v.AddArg(x) 2757 v.AddArg(y) 2758 return true 2759 } 2760 return false 2761 } 2762 func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { 2763 b := v.Block 2764 _ = b 2765 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 2766 // cond: 2767 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 2768 for { 2769 d := v.AuxInt 2770 _ = v.Args[1] 2771 v_0 := v.Args[0] 2772 if v_0.Op != OpARMMOVWconst { 2773 break 2774 } 2775 c := v_0.AuxInt 2776 x := v.Args[1] 2777 v.reset(OpARMADDconst) 2778 v.AuxInt = c 2779 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2780 v0.AuxInt = d 2781 v0.AddArg(x) 2782 v.AddArg(v0) 2783 return true 2784 } 2785 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 2786 // cond: 2787 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 2788 for { 2789 d := v.AuxInt 2790 _ = v.Args[1] 2791 x := v.Args[0] 2792 v_1 := v.Args[1] 2793 if v_1.Op != OpARMMOVWconst { 2794 break 2795 } 2796 c := v_1.AuxInt 2797 v.reset(OpARMADDconst) 2798 v.AuxInt = int64(int32(c) >> uint64(d)) 2799 v.AddArg(x) 2800 return true 2801 } 2802 return false 2803 } 2804 func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { 2805 b := v.Block 2806 _ = b 2807 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 2808 // cond: 2809 // result: (ADDconst [c] (SRA <x.Type> x y)) 2810 for { 2811 _ = v.Args[2] 2812 v_0 := v.Args[0] 2813 if v_0.Op != OpARMMOVWconst { 2814 break 2815 } 2816 c := v_0.AuxInt 2817 x := v.Args[1] 2818 y := v.Args[2] 2819 v.reset(OpARMADDconst) 2820 v.AuxInt = c 2821 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2822 v0.AddArg(x) 2823 v0.AddArg(y) 2824 v.AddArg(v0) 2825 return true 2826 } 2827 // match: (ADDshiftRAreg x y (MOVWconst [c])) 2828 // cond: 2829 // result: (ADDshiftRA x y [c]) 2830 for { 2831 _ = v.Args[2] 2832 x := v.Args[0] 2833 y := v.Args[1] 2834 v_2 := v.Args[2] 2835 if v_2.Op != OpARMMOVWconst { 2836 break 2837 } 2838 c := v_2.AuxInt 2839 v.reset(OpARMADDshiftRA) 2840 v.AuxInt = c 2841 v.AddArg(x) 2842 v.AddArg(y) 2843 return true 2844 } 2845 return false 2846 } 2847 func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { 2848 b := v.Block 2849 _ = b 2850 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 2851 // cond: 2852 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 2853 for { 2854 d := v.AuxInt 2855 _ = v.Args[1] 2856 v_0 := v.Args[0] 2857 if v_0.Op != OpARMMOVWconst { 2858 break 2859 } 2860 c := v_0.AuxInt 2861 x := v.Args[1] 2862 v.reset(OpARMADDconst) 2863 v.AuxInt = c 2864 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2865 v0.AuxInt = d 2866 v0.AddArg(x) 2867 v.AddArg(v0) 2868 return true 2869 } 2870 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 2871 // cond: 2872 // result: (ADDconst x [int64(uint32(c)>>uint64(d))]) 2873 for { 2874 d := v.AuxInt 2875 _ = v.Args[1] 2876 x := v.Args[0] 2877 v_1 := v.Args[1] 2878 if v_1.Op != OpARMMOVWconst { 2879 break 2880 } 2881 c := v_1.AuxInt 2882 v.reset(OpARMADDconst) 2883 v.AuxInt = int64(uint32(c) >> uint64(d)) 2884 v.AddArg(x) 2885 return true 2886 } 2887 // match: (ADDshiftRL [c] (SLLconst x [32-c]) x) 2888 // cond: 2889 // result: (SRRconst [ c] x) 2890 for { 2891 c := v.AuxInt 2892 _ = v.Args[1] 2893 v_0 := v.Args[0] 2894 if v_0.Op != OpARMSLLconst { 2895 break 2896 } 2897 if v_0.AuxInt != 32-c { 2898 break 2899 } 2900 x := v_0.Args[0] 2901 if x != v.Args[1] { 2902 break 2903 } 2904 v.reset(OpARMSRRconst) 2905 v.AuxInt = c 2906 v.AddArg(x) 2907 return true 2908 } 2909 return false 2910 } 2911 func rewriteValueARM_OpARMADDshiftRLreg_0(v *Value) bool { 2912 b := v.Block 2913 _ = b 2914 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 2915 // cond: 2916 // result: (ADDconst [c] (SRL <x.Type> x y)) 2917 for { 2918 _ = v.Args[2] 2919 v_0 := v.Args[0] 2920 if v_0.Op != OpARMMOVWconst { 2921 break 2922 } 2923 c := v_0.AuxInt 2924 x := v.Args[1] 2925 y := v.Args[2] 2926 v.reset(OpARMADDconst) 2927 v.AuxInt = c 2928 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2929 v0.AddArg(x) 2930 v0.AddArg(y) 2931 v.AddArg(v0) 2932 return true 2933 } 2934 // match: (ADDshiftRLreg x y (MOVWconst [c])) 2935 // cond: 2936 // result: (ADDshiftRL x y [c]) 2937 for { 2938 _ = v.Args[2] 2939 x := v.Args[0] 2940 y := v.Args[1] 2941 v_2 := v.Args[2] 2942 if v_2.Op != OpARMMOVWconst { 2943 break 2944 } 2945 c := v_2.AuxInt 2946 v.reset(OpARMADDshiftRL) 2947 v.AuxInt = c 2948 v.AddArg(x) 2949 v.AddArg(y) 2950 return true 2951 } 2952 return false 2953 } 2954 func rewriteValueARM_OpARMAND_0(v *Value) bool { 2955 // match: (AND x (MOVWconst [c])) 2956 // cond: 2957 // result: (ANDconst [c] x) 2958 for { 2959 _ = v.Args[1] 2960 x := v.Args[0] 2961 v_1 := v.Args[1] 2962 if v_1.Op != OpARMMOVWconst { 2963 break 2964 } 2965 c := v_1.AuxInt 2966 v.reset(OpARMANDconst) 2967 v.AuxInt = c 2968 v.AddArg(x) 2969 return true 2970 } 2971 // match: (AND (MOVWconst [c]) x) 2972 // cond: 2973 // result: (ANDconst [c] x) 2974 for { 2975 _ = v.Args[1] 2976 v_0 := v.Args[0] 2977 if v_0.Op != OpARMMOVWconst { 2978 break 2979 } 2980 c := v_0.AuxInt 2981 x := v.Args[1] 2982 v.reset(OpARMANDconst) 2983 v.AuxInt = c 2984 v.AddArg(x) 2985 return true 2986 } 2987 // match: (AND x (SLLconst [c] y)) 2988 // cond: 2989 // result: (ANDshiftLL x y [c]) 2990 for { 2991 _ = v.Args[1] 2992 x := v.Args[0] 2993 v_1 := v.Args[1] 2994 if v_1.Op != OpARMSLLconst { 2995 break 2996 } 2997 c := v_1.AuxInt 2998 y := v_1.Args[0] 2999 v.reset(OpARMANDshiftLL) 3000 v.AuxInt = c 3001 v.AddArg(x) 3002 v.AddArg(y) 3003 return true 3004 } 3005 // match: (AND (SLLconst [c] y) x) 3006 // cond: 3007 // result: (ANDshiftLL x y [c]) 3008 for { 3009 _ = v.Args[1] 3010 v_0 := v.Args[0] 3011 if v_0.Op != OpARMSLLconst { 3012 break 3013 } 3014 c := v_0.AuxInt 3015 y := v_0.Args[0] 3016 x := v.Args[1] 3017 v.reset(OpARMANDshiftLL) 3018 v.AuxInt = c 3019 v.AddArg(x) 3020 v.AddArg(y) 3021 return true 3022 } 3023 // match: (AND x (SRLconst [c] y)) 3024 // cond: 3025 // result: (ANDshiftRL x y [c]) 3026 for { 3027 _ = v.Args[1] 3028 x := v.Args[0] 3029 v_1 := v.Args[1] 3030 if v_1.Op != OpARMSRLconst { 3031 break 3032 } 3033 c := v_1.AuxInt 3034 y := v_1.Args[0] 3035 v.reset(OpARMANDshiftRL) 3036 v.AuxInt = c 3037 v.AddArg(x) 3038 v.AddArg(y) 3039 return true 3040 } 3041 // match: (AND (SRLconst [c] y) x) 3042 // cond: 3043 // result: (ANDshiftRL x y [c]) 3044 for { 3045 _ = v.Args[1] 3046 v_0 := v.Args[0] 3047 if v_0.Op != OpARMSRLconst { 3048 break 3049 } 3050 c := v_0.AuxInt 3051 y := v_0.Args[0] 3052 x := v.Args[1] 3053 v.reset(OpARMANDshiftRL) 3054 v.AuxInt = c 3055 v.AddArg(x) 3056 v.AddArg(y) 3057 return true 3058 } 3059 // match: (AND x (SRAconst [c] y)) 3060 // cond: 3061 // result: (ANDshiftRA x y [c]) 3062 for { 3063 _ = v.Args[1] 3064 x := v.Args[0] 3065 v_1 := v.Args[1] 3066 if v_1.Op != OpARMSRAconst { 3067 break 3068 } 3069 c := v_1.AuxInt 3070 y := v_1.Args[0] 3071 v.reset(OpARMANDshiftRA) 3072 v.AuxInt = c 3073 v.AddArg(x) 3074 v.AddArg(y) 3075 return true 3076 } 3077 // match: (AND (SRAconst [c] y) x) 3078 // cond: 3079 // result: (ANDshiftRA x y [c]) 3080 for { 3081 _ = v.Args[1] 3082 v_0 := v.Args[0] 3083 if v_0.Op != OpARMSRAconst { 3084 break 3085 } 3086 c := v_0.AuxInt 3087 y := v_0.Args[0] 3088 x := v.Args[1] 3089 v.reset(OpARMANDshiftRA) 3090 v.AuxInt = c 3091 v.AddArg(x) 3092 v.AddArg(y) 3093 return true 3094 } 3095 // match: (AND x (SLL y z)) 3096 // cond: 3097 // result: (ANDshiftLLreg x y z) 3098 for { 3099 _ = v.Args[1] 3100 x := v.Args[0] 3101 v_1 := v.Args[1] 3102 if v_1.Op != OpARMSLL { 3103 break 3104 } 3105 _ = v_1.Args[1] 3106 y := v_1.Args[0] 3107 z := v_1.Args[1] 3108 v.reset(OpARMANDshiftLLreg) 3109 v.AddArg(x) 3110 v.AddArg(y) 3111 v.AddArg(z) 3112 return true 3113 } 3114 // match: (AND (SLL y z) x) 3115 // cond: 3116 // result: (ANDshiftLLreg x y z) 3117 for { 3118 _ = v.Args[1] 3119 v_0 := v.Args[0] 3120 if v_0.Op != OpARMSLL { 3121 break 3122 } 3123 _ = v_0.Args[1] 3124 y := v_0.Args[0] 3125 z := v_0.Args[1] 3126 x := v.Args[1] 3127 v.reset(OpARMANDshiftLLreg) 3128 v.AddArg(x) 3129 v.AddArg(y) 3130 v.AddArg(z) 3131 return true 3132 } 3133 return false 3134 } 3135 func rewriteValueARM_OpARMAND_10(v *Value) bool { 3136 // match: (AND x (SRL y z)) 3137 // cond: 3138 // result: (ANDshiftRLreg x y z) 3139 for { 3140 _ = v.Args[1] 3141 x := v.Args[0] 3142 v_1 := v.Args[1] 3143 if v_1.Op != OpARMSRL { 3144 break 3145 } 3146 _ = v_1.Args[1] 3147 y := v_1.Args[0] 3148 z := v_1.Args[1] 3149 v.reset(OpARMANDshiftRLreg) 3150 v.AddArg(x) 3151 v.AddArg(y) 3152 v.AddArg(z) 3153 return true 3154 } 3155 // match: (AND (SRL y z) x) 3156 // cond: 3157 // result: (ANDshiftRLreg x y z) 3158 for { 3159 _ = v.Args[1] 3160 v_0 := v.Args[0] 3161 if v_0.Op != OpARMSRL { 3162 break 3163 } 3164 _ = v_0.Args[1] 3165 y := v_0.Args[0] 3166 z := v_0.Args[1] 3167 x := v.Args[1] 3168 v.reset(OpARMANDshiftRLreg) 3169 v.AddArg(x) 3170 v.AddArg(y) 3171 v.AddArg(z) 3172 return true 3173 } 3174 // match: (AND x (SRA y z)) 3175 // cond: 3176 // result: (ANDshiftRAreg x y z) 3177 for { 3178 _ = v.Args[1] 3179 x := v.Args[0] 3180 v_1 := v.Args[1] 3181 if v_1.Op != OpARMSRA { 3182 break 3183 } 3184 _ = v_1.Args[1] 3185 y := v_1.Args[0] 3186 z := v_1.Args[1] 3187 v.reset(OpARMANDshiftRAreg) 3188 v.AddArg(x) 3189 v.AddArg(y) 3190 v.AddArg(z) 3191 return true 3192 } 3193 // match: (AND (SRA y z) x) 3194 // cond: 3195 // result: (ANDshiftRAreg x y z) 3196 for { 3197 _ = v.Args[1] 3198 v_0 := v.Args[0] 3199 if v_0.Op != OpARMSRA { 3200 break 3201 } 3202 _ = v_0.Args[1] 3203 y := v_0.Args[0] 3204 z := v_0.Args[1] 3205 x := v.Args[1] 3206 v.reset(OpARMANDshiftRAreg) 3207 v.AddArg(x) 3208 v.AddArg(y) 3209 v.AddArg(z) 3210 return true 3211 } 3212 // match: (AND x x) 3213 // cond: 3214 // result: x 3215 for { 3216 _ = v.Args[1] 3217 x := v.Args[0] 3218 if x != v.Args[1] { 3219 break 3220 } 3221 v.reset(OpCopy) 3222 v.Type = x.Type 3223 v.AddArg(x) 3224 return true 3225 } 3226 // match: (AND x (MVN y)) 3227 // cond: 3228 // result: (BIC x y) 3229 for { 3230 _ = v.Args[1] 3231 x := v.Args[0] 3232 v_1 := v.Args[1] 3233 if v_1.Op != OpARMMVN { 3234 break 3235 } 3236 y := v_1.Args[0] 3237 v.reset(OpARMBIC) 3238 v.AddArg(x) 3239 v.AddArg(y) 3240 return true 3241 } 3242 // match: (AND (MVN y) x) 3243 // cond: 3244 // result: (BIC x y) 3245 for { 3246 _ = v.Args[1] 3247 v_0 := v.Args[0] 3248 if v_0.Op != OpARMMVN { 3249 break 3250 } 3251 y := v_0.Args[0] 3252 x := v.Args[1] 3253 v.reset(OpARMBIC) 3254 v.AddArg(x) 3255 v.AddArg(y) 3256 return true 3257 } 3258 // match: (AND x (MVNshiftLL y [c])) 3259 // cond: 3260 // result: (BICshiftLL x y [c]) 3261 for { 3262 _ = v.Args[1] 3263 x := v.Args[0] 3264 v_1 := v.Args[1] 3265 if v_1.Op != OpARMMVNshiftLL { 3266 break 3267 } 3268 c := v_1.AuxInt 3269 y := v_1.Args[0] 3270 v.reset(OpARMBICshiftLL) 3271 v.AuxInt = c 3272 v.AddArg(x) 3273 v.AddArg(y) 3274 return true 3275 } 3276 // match: (AND (MVNshiftLL y [c]) x) 3277 // cond: 3278 // result: (BICshiftLL x y [c]) 3279 for { 3280 _ = v.Args[1] 3281 v_0 := v.Args[0] 3282 if v_0.Op != OpARMMVNshiftLL { 3283 break 3284 } 3285 c := v_0.AuxInt 3286 y := v_0.Args[0] 3287 x := v.Args[1] 3288 v.reset(OpARMBICshiftLL) 3289 v.AuxInt = c 3290 v.AddArg(x) 3291 v.AddArg(y) 3292 return true 3293 } 3294 // match: (AND x (MVNshiftRL y [c])) 3295 // cond: 3296 // result: (BICshiftRL x y [c]) 3297 for { 3298 _ = v.Args[1] 3299 x := v.Args[0] 3300 v_1 := v.Args[1] 3301 if v_1.Op != OpARMMVNshiftRL { 3302 break 3303 } 3304 c := v_1.AuxInt 3305 y := v_1.Args[0] 3306 v.reset(OpARMBICshiftRL) 3307 v.AuxInt = c 3308 v.AddArg(x) 3309 v.AddArg(y) 3310 return true 3311 } 3312 return false 3313 } 3314 func rewriteValueARM_OpARMAND_20(v *Value) bool { 3315 // match: (AND (MVNshiftRL y [c]) x) 3316 // cond: 3317 // result: (BICshiftRL x y [c]) 3318 for { 3319 _ = v.Args[1] 3320 v_0 := v.Args[0] 3321 if v_0.Op != OpARMMVNshiftRL { 3322 break 3323 } 3324 c := v_0.AuxInt 3325 y := v_0.Args[0] 3326 x := v.Args[1] 3327 v.reset(OpARMBICshiftRL) 3328 v.AuxInt = c 3329 v.AddArg(x) 3330 v.AddArg(y) 3331 return true 3332 } 3333 // match: (AND x (MVNshiftRA y [c])) 3334 // cond: 3335 // result: (BICshiftRA x y [c]) 3336 for { 3337 _ = v.Args[1] 3338 x := v.Args[0] 3339 v_1 := v.Args[1] 3340 if v_1.Op != OpARMMVNshiftRA { 3341 break 3342 } 3343 c := v_1.AuxInt 3344 y := v_1.Args[0] 3345 v.reset(OpARMBICshiftRA) 3346 v.AuxInt = c 3347 v.AddArg(x) 3348 v.AddArg(y) 3349 return true 3350 } 3351 // match: (AND (MVNshiftRA y [c]) x) 3352 // cond: 3353 // result: (BICshiftRA x y [c]) 3354 for { 3355 _ = v.Args[1] 3356 v_0 := v.Args[0] 3357 if v_0.Op != OpARMMVNshiftRA { 3358 break 3359 } 3360 c := v_0.AuxInt 3361 y := v_0.Args[0] 3362 x := v.Args[1] 3363 v.reset(OpARMBICshiftRA) 3364 v.AuxInt = c 3365 v.AddArg(x) 3366 v.AddArg(y) 3367 return true 3368 } 3369 return false 3370 } 3371 func rewriteValueARM_OpARMANDconst_0(v *Value) bool { 3372 // match: (ANDconst [0] _) 3373 // cond: 3374 // result: (MOVWconst [0]) 3375 for { 3376 if v.AuxInt != 0 { 3377 break 3378 } 3379 v.reset(OpARMMOVWconst) 3380 v.AuxInt = 0 3381 return true 3382 } 3383 // match: (ANDconst [c] x) 3384 // cond: int32(c)==-1 3385 // result: x 3386 for { 3387 c := v.AuxInt 3388 x := v.Args[0] 3389 if !(int32(c) == -1) { 3390 break 3391 } 3392 v.reset(OpCopy) 3393 v.Type = x.Type 3394 v.AddArg(x) 3395 return true 3396 } 3397 // match: (ANDconst [c] x) 3398 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3399 // result: (BICconst [int64(^uint32(c))] x) 3400 for { 3401 c := v.AuxInt 3402 x := v.Args[0] 3403 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3404 break 3405 } 3406 v.reset(OpARMBICconst) 3407 v.AuxInt = int64(^uint32(c)) 3408 v.AddArg(x) 3409 return true 3410 } 3411 // match: (ANDconst [c] (MOVWconst [d])) 3412 // cond: 3413 // result: (MOVWconst [c&d]) 3414 for { 3415 c := v.AuxInt 3416 v_0 := v.Args[0] 3417 if v_0.Op != OpARMMOVWconst { 3418 break 3419 } 3420 d := v_0.AuxInt 3421 v.reset(OpARMMOVWconst) 3422 v.AuxInt = c & d 3423 return true 3424 } 3425 // match: (ANDconst [c] (ANDconst [d] x)) 3426 // cond: 3427 // result: (ANDconst [c&d] x) 3428 for { 3429 c := v.AuxInt 3430 v_0 := v.Args[0] 3431 if v_0.Op != OpARMANDconst { 3432 break 3433 } 3434 d := v_0.AuxInt 3435 x := v_0.Args[0] 3436 v.reset(OpARMANDconst) 3437 v.AuxInt = c & d 3438 v.AddArg(x) 3439 return true 3440 } 3441 return false 3442 } 3443 func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { 3444 b := v.Block 3445 _ = b 3446 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 3447 // cond: 3448 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 3449 for { 3450 d := v.AuxInt 3451 _ = v.Args[1] 3452 v_0 := v.Args[0] 3453 if v_0.Op != OpARMMOVWconst { 3454 break 3455 } 3456 c := v_0.AuxInt 3457 x := v.Args[1] 3458 v.reset(OpARMANDconst) 3459 v.AuxInt = c 3460 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3461 v0.AuxInt = d 3462 v0.AddArg(x) 3463 v.AddArg(v0) 3464 return true 3465 } 3466 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 3467 // cond: 3468 // result: (ANDconst x [int64(uint32(c)<<uint64(d))]) 3469 for { 3470 d := v.AuxInt 3471 _ = v.Args[1] 3472 x := v.Args[0] 3473 v_1 := v.Args[1] 3474 if v_1.Op != OpARMMOVWconst { 3475 break 3476 } 3477 c := v_1.AuxInt 3478 v.reset(OpARMANDconst) 3479 v.AuxInt = int64(uint32(c) << uint64(d)) 3480 v.AddArg(x) 3481 return true 3482 } 3483 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 3484 // cond: c==d 3485 // result: y 3486 for { 3487 d := v.AuxInt 3488 _ = v.Args[1] 3489 x := v.Args[0] 3490 y := v.Args[1] 3491 if y.Op != OpARMSLLconst { 3492 break 3493 } 3494 c := y.AuxInt 3495 if x != y.Args[0] { 3496 break 3497 } 3498 if !(c == d) { 3499 break 3500 } 3501 v.reset(OpCopy) 3502 v.Type = y.Type 3503 v.AddArg(y) 3504 return true 3505 } 3506 return false 3507 } 3508 func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { 3509 b := v.Block 3510 _ = b 3511 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 3512 // cond: 3513 // result: (ANDconst [c] (SLL <x.Type> x y)) 3514 for { 3515 _ = v.Args[2] 3516 v_0 := v.Args[0] 3517 if v_0.Op != OpARMMOVWconst { 3518 break 3519 } 3520 c := v_0.AuxInt 3521 x := v.Args[1] 3522 y := v.Args[2] 3523 v.reset(OpARMANDconst) 3524 v.AuxInt = c 3525 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3526 v0.AddArg(x) 3527 v0.AddArg(y) 3528 v.AddArg(v0) 3529 return true 3530 } 3531 // match: (ANDshiftLLreg x y (MOVWconst [c])) 3532 // cond: 3533 // result: (ANDshiftLL x y [c]) 3534 for { 3535 _ = v.Args[2] 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(OpARMANDshiftLL) 3544 v.AuxInt = c 3545 v.AddArg(x) 3546 v.AddArg(y) 3547 return true 3548 } 3549 return false 3550 } 3551 func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { 3552 b := v.Block 3553 _ = b 3554 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 3555 // cond: 3556 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 3557 for { 3558 d := v.AuxInt 3559 _ = v.Args[1] 3560 v_0 := v.Args[0] 3561 if v_0.Op != OpARMMOVWconst { 3562 break 3563 } 3564 c := v_0.AuxInt 3565 x := v.Args[1] 3566 v.reset(OpARMANDconst) 3567 v.AuxInt = c 3568 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3569 v0.AuxInt = d 3570 v0.AddArg(x) 3571 v.AddArg(v0) 3572 return true 3573 } 3574 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3575 // cond: 3576 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3577 for { 3578 d := v.AuxInt 3579 _ = v.Args[1] 3580 x := v.Args[0] 3581 v_1 := v.Args[1] 3582 if v_1.Op != OpARMMOVWconst { 3583 break 3584 } 3585 c := v_1.AuxInt 3586 v.reset(OpARMANDconst) 3587 v.AuxInt = int64(int32(c) >> uint64(d)) 3588 v.AddArg(x) 3589 return true 3590 } 3591 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3592 // cond: c==d 3593 // result: y 3594 for { 3595 d := v.AuxInt 3596 _ = v.Args[1] 3597 x := v.Args[0] 3598 y := v.Args[1] 3599 if y.Op != OpARMSRAconst { 3600 break 3601 } 3602 c := y.AuxInt 3603 if x != y.Args[0] { 3604 break 3605 } 3606 if !(c == d) { 3607 break 3608 } 3609 v.reset(OpCopy) 3610 v.Type = y.Type 3611 v.AddArg(y) 3612 return true 3613 } 3614 return false 3615 } 3616 func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { 3617 b := v.Block 3618 _ = b 3619 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3620 // cond: 3621 // result: (ANDconst [c] (SRA <x.Type> x y)) 3622 for { 3623 _ = v.Args[2] 3624 v_0 := v.Args[0] 3625 if v_0.Op != OpARMMOVWconst { 3626 break 3627 } 3628 c := v_0.AuxInt 3629 x := v.Args[1] 3630 y := v.Args[2] 3631 v.reset(OpARMANDconst) 3632 v.AuxInt = c 3633 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3634 v0.AddArg(x) 3635 v0.AddArg(y) 3636 v.AddArg(v0) 3637 return true 3638 } 3639 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3640 // cond: 3641 // result: (ANDshiftRA x y [c]) 3642 for { 3643 _ = v.Args[2] 3644 x := v.Args[0] 3645 y := v.Args[1] 3646 v_2 := v.Args[2] 3647 if v_2.Op != OpARMMOVWconst { 3648 break 3649 } 3650 c := v_2.AuxInt 3651 v.reset(OpARMANDshiftRA) 3652 v.AuxInt = c 3653 v.AddArg(x) 3654 v.AddArg(y) 3655 return true 3656 } 3657 return false 3658 } 3659 func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { 3660 b := v.Block 3661 _ = b 3662 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3663 // cond: 3664 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3665 for { 3666 d := v.AuxInt 3667 _ = v.Args[1] 3668 v_0 := v.Args[0] 3669 if v_0.Op != OpARMMOVWconst { 3670 break 3671 } 3672 c := v_0.AuxInt 3673 x := v.Args[1] 3674 v.reset(OpARMANDconst) 3675 v.AuxInt = c 3676 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3677 v0.AuxInt = d 3678 v0.AddArg(x) 3679 v.AddArg(v0) 3680 return true 3681 } 3682 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3683 // cond: 3684 // result: (ANDconst x [int64(uint32(c)>>uint64(d))]) 3685 for { 3686 d := v.AuxInt 3687 _ = v.Args[1] 3688 x := v.Args[0] 3689 v_1 := v.Args[1] 3690 if v_1.Op != OpARMMOVWconst { 3691 break 3692 } 3693 c := v_1.AuxInt 3694 v.reset(OpARMANDconst) 3695 v.AuxInt = int64(uint32(c) >> uint64(d)) 3696 v.AddArg(x) 3697 return true 3698 } 3699 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3700 // cond: c==d 3701 // result: y 3702 for { 3703 d := v.AuxInt 3704 _ = v.Args[1] 3705 x := v.Args[0] 3706 y := v.Args[1] 3707 if y.Op != OpARMSRLconst { 3708 break 3709 } 3710 c := y.AuxInt 3711 if x != y.Args[0] { 3712 break 3713 } 3714 if !(c == d) { 3715 break 3716 } 3717 v.reset(OpCopy) 3718 v.Type = y.Type 3719 v.AddArg(y) 3720 return true 3721 } 3722 return false 3723 } 3724 func rewriteValueARM_OpARMANDshiftRLreg_0(v *Value) bool { 3725 b := v.Block 3726 _ = b 3727 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 3728 // cond: 3729 // result: (ANDconst [c] (SRL <x.Type> x y)) 3730 for { 3731 _ = v.Args[2] 3732 v_0 := v.Args[0] 3733 if v_0.Op != OpARMMOVWconst { 3734 break 3735 } 3736 c := v_0.AuxInt 3737 x := v.Args[1] 3738 y := v.Args[2] 3739 v.reset(OpARMANDconst) 3740 v.AuxInt = c 3741 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3742 v0.AddArg(x) 3743 v0.AddArg(y) 3744 v.AddArg(v0) 3745 return true 3746 } 3747 // match: (ANDshiftRLreg x y (MOVWconst [c])) 3748 // cond: 3749 // result: (ANDshiftRL x y [c]) 3750 for { 3751 _ = v.Args[2] 3752 x := v.Args[0] 3753 y := v.Args[1] 3754 v_2 := v.Args[2] 3755 if v_2.Op != OpARMMOVWconst { 3756 break 3757 } 3758 c := v_2.AuxInt 3759 v.reset(OpARMANDshiftRL) 3760 v.AuxInt = c 3761 v.AddArg(x) 3762 v.AddArg(y) 3763 return true 3764 } 3765 return false 3766 } 3767 func rewriteValueARM_OpARMBIC_0(v *Value) bool { 3768 // match: (BIC x (MOVWconst [c])) 3769 // cond: 3770 // result: (BICconst [c] x) 3771 for { 3772 _ = v.Args[1] 3773 x := v.Args[0] 3774 v_1 := v.Args[1] 3775 if v_1.Op != OpARMMOVWconst { 3776 break 3777 } 3778 c := v_1.AuxInt 3779 v.reset(OpARMBICconst) 3780 v.AuxInt = c 3781 v.AddArg(x) 3782 return true 3783 } 3784 // match: (BIC x (SLLconst [c] y)) 3785 // cond: 3786 // result: (BICshiftLL x y [c]) 3787 for { 3788 _ = v.Args[1] 3789 x := v.Args[0] 3790 v_1 := v.Args[1] 3791 if v_1.Op != OpARMSLLconst { 3792 break 3793 } 3794 c := v_1.AuxInt 3795 y := v_1.Args[0] 3796 v.reset(OpARMBICshiftLL) 3797 v.AuxInt = c 3798 v.AddArg(x) 3799 v.AddArg(y) 3800 return true 3801 } 3802 // match: (BIC x (SRLconst [c] y)) 3803 // cond: 3804 // result: (BICshiftRL x y [c]) 3805 for { 3806 _ = v.Args[1] 3807 x := v.Args[0] 3808 v_1 := v.Args[1] 3809 if v_1.Op != OpARMSRLconst { 3810 break 3811 } 3812 c := v_1.AuxInt 3813 y := v_1.Args[0] 3814 v.reset(OpARMBICshiftRL) 3815 v.AuxInt = c 3816 v.AddArg(x) 3817 v.AddArg(y) 3818 return true 3819 } 3820 // match: (BIC x (SRAconst [c] y)) 3821 // cond: 3822 // result: (BICshiftRA x y [c]) 3823 for { 3824 _ = v.Args[1] 3825 x := v.Args[0] 3826 v_1 := v.Args[1] 3827 if v_1.Op != OpARMSRAconst { 3828 break 3829 } 3830 c := v_1.AuxInt 3831 y := v_1.Args[0] 3832 v.reset(OpARMBICshiftRA) 3833 v.AuxInt = c 3834 v.AddArg(x) 3835 v.AddArg(y) 3836 return true 3837 } 3838 // match: (BIC x (SLL y z)) 3839 // cond: 3840 // result: (BICshiftLLreg x y z) 3841 for { 3842 _ = v.Args[1] 3843 x := v.Args[0] 3844 v_1 := v.Args[1] 3845 if v_1.Op != OpARMSLL { 3846 break 3847 } 3848 _ = v_1.Args[1] 3849 y := v_1.Args[0] 3850 z := v_1.Args[1] 3851 v.reset(OpARMBICshiftLLreg) 3852 v.AddArg(x) 3853 v.AddArg(y) 3854 v.AddArg(z) 3855 return true 3856 } 3857 // match: (BIC x (SRL y z)) 3858 // cond: 3859 // result: (BICshiftRLreg x y z) 3860 for { 3861 _ = v.Args[1] 3862 x := v.Args[0] 3863 v_1 := v.Args[1] 3864 if v_1.Op != OpARMSRL { 3865 break 3866 } 3867 _ = v_1.Args[1] 3868 y := v_1.Args[0] 3869 z := v_1.Args[1] 3870 v.reset(OpARMBICshiftRLreg) 3871 v.AddArg(x) 3872 v.AddArg(y) 3873 v.AddArg(z) 3874 return true 3875 } 3876 // match: (BIC x (SRA y z)) 3877 // cond: 3878 // result: (BICshiftRAreg x y z) 3879 for { 3880 _ = v.Args[1] 3881 x := v.Args[0] 3882 v_1 := v.Args[1] 3883 if v_1.Op != OpARMSRA { 3884 break 3885 } 3886 _ = v_1.Args[1] 3887 y := v_1.Args[0] 3888 z := v_1.Args[1] 3889 v.reset(OpARMBICshiftRAreg) 3890 v.AddArg(x) 3891 v.AddArg(y) 3892 v.AddArg(z) 3893 return true 3894 } 3895 // match: (BIC x x) 3896 // cond: 3897 // result: (MOVWconst [0]) 3898 for { 3899 _ = v.Args[1] 3900 x := v.Args[0] 3901 if x != v.Args[1] { 3902 break 3903 } 3904 v.reset(OpARMMOVWconst) 3905 v.AuxInt = 0 3906 return true 3907 } 3908 return false 3909 } 3910 func rewriteValueARM_OpARMBICconst_0(v *Value) bool { 3911 // match: (BICconst [0] x) 3912 // cond: 3913 // result: x 3914 for { 3915 if v.AuxInt != 0 { 3916 break 3917 } 3918 x := v.Args[0] 3919 v.reset(OpCopy) 3920 v.Type = x.Type 3921 v.AddArg(x) 3922 return true 3923 } 3924 // match: (BICconst [c] _) 3925 // cond: int32(c)==-1 3926 // result: (MOVWconst [0]) 3927 for { 3928 c := v.AuxInt 3929 if !(int32(c) == -1) { 3930 break 3931 } 3932 v.reset(OpARMMOVWconst) 3933 v.AuxInt = 0 3934 return true 3935 } 3936 // match: (BICconst [c] x) 3937 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3938 // result: (ANDconst [int64(^uint32(c))] x) 3939 for { 3940 c := v.AuxInt 3941 x := v.Args[0] 3942 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3943 break 3944 } 3945 v.reset(OpARMANDconst) 3946 v.AuxInt = int64(^uint32(c)) 3947 v.AddArg(x) 3948 return true 3949 } 3950 // match: (BICconst [c] (MOVWconst [d])) 3951 // cond: 3952 // result: (MOVWconst [d&^c]) 3953 for { 3954 c := v.AuxInt 3955 v_0 := v.Args[0] 3956 if v_0.Op != OpARMMOVWconst { 3957 break 3958 } 3959 d := v_0.AuxInt 3960 v.reset(OpARMMOVWconst) 3961 v.AuxInt = d &^ c 3962 return true 3963 } 3964 // match: (BICconst [c] (BICconst [d] x)) 3965 // cond: 3966 // result: (BICconst [int64(int32(c|d))] x) 3967 for { 3968 c := v.AuxInt 3969 v_0 := v.Args[0] 3970 if v_0.Op != OpARMBICconst { 3971 break 3972 } 3973 d := v_0.AuxInt 3974 x := v_0.Args[0] 3975 v.reset(OpARMBICconst) 3976 v.AuxInt = int64(int32(c | d)) 3977 v.AddArg(x) 3978 return true 3979 } 3980 return false 3981 } 3982 func rewriteValueARM_OpARMBICshiftLL_0(v *Value) bool { 3983 // match: (BICshiftLL x (MOVWconst [c]) [d]) 3984 // cond: 3985 // result: (BICconst x [int64(uint32(c)<<uint64(d))]) 3986 for { 3987 d := v.AuxInt 3988 _ = v.Args[1] 3989 x := v.Args[0] 3990 v_1 := v.Args[1] 3991 if v_1.Op != OpARMMOVWconst { 3992 break 3993 } 3994 c := v_1.AuxInt 3995 v.reset(OpARMBICconst) 3996 v.AuxInt = int64(uint32(c) << uint64(d)) 3997 v.AddArg(x) 3998 return true 3999 } 4000 // match: (BICshiftLL x (SLLconst x [c]) [d]) 4001 // cond: c==d 4002 // result: (MOVWconst [0]) 4003 for { 4004 d := v.AuxInt 4005 _ = v.Args[1] 4006 x := v.Args[0] 4007 v_1 := v.Args[1] 4008 if v_1.Op != OpARMSLLconst { 4009 break 4010 } 4011 c := v_1.AuxInt 4012 if x != v_1.Args[0] { 4013 break 4014 } 4015 if !(c == d) { 4016 break 4017 } 4018 v.reset(OpARMMOVWconst) 4019 v.AuxInt = 0 4020 return true 4021 } 4022 return false 4023 } 4024 func rewriteValueARM_OpARMBICshiftLLreg_0(v *Value) bool { 4025 // match: (BICshiftLLreg x y (MOVWconst [c])) 4026 // cond: 4027 // result: (BICshiftLL x y [c]) 4028 for { 4029 _ = v.Args[2] 4030 x := v.Args[0] 4031 y := v.Args[1] 4032 v_2 := v.Args[2] 4033 if v_2.Op != OpARMMOVWconst { 4034 break 4035 } 4036 c := v_2.AuxInt 4037 v.reset(OpARMBICshiftLL) 4038 v.AuxInt = c 4039 v.AddArg(x) 4040 v.AddArg(y) 4041 return true 4042 } 4043 return false 4044 } 4045 func rewriteValueARM_OpARMBICshiftRA_0(v *Value) bool { 4046 // match: (BICshiftRA x (MOVWconst [c]) [d]) 4047 // cond: 4048 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 4049 for { 4050 d := v.AuxInt 4051 _ = v.Args[1] 4052 x := v.Args[0] 4053 v_1 := v.Args[1] 4054 if v_1.Op != OpARMMOVWconst { 4055 break 4056 } 4057 c := v_1.AuxInt 4058 v.reset(OpARMBICconst) 4059 v.AuxInt = int64(int32(c) >> uint64(d)) 4060 v.AddArg(x) 4061 return true 4062 } 4063 // match: (BICshiftRA x (SRAconst x [c]) [d]) 4064 // cond: c==d 4065 // result: (MOVWconst [0]) 4066 for { 4067 d := v.AuxInt 4068 _ = v.Args[1] 4069 x := v.Args[0] 4070 v_1 := v.Args[1] 4071 if v_1.Op != OpARMSRAconst { 4072 break 4073 } 4074 c := v_1.AuxInt 4075 if x != v_1.Args[0] { 4076 break 4077 } 4078 if !(c == d) { 4079 break 4080 } 4081 v.reset(OpARMMOVWconst) 4082 v.AuxInt = 0 4083 return true 4084 } 4085 return false 4086 } 4087 func rewriteValueARM_OpARMBICshiftRAreg_0(v *Value) bool { 4088 // match: (BICshiftRAreg x y (MOVWconst [c])) 4089 // cond: 4090 // result: (BICshiftRA x y [c]) 4091 for { 4092 _ = v.Args[2] 4093 x := v.Args[0] 4094 y := v.Args[1] 4095 v_2 := v.Args[2] 4096 if v_2.Op != OpARMMOVWconst { 4097 break 4098 } 4099 c := v_2.AuxInt 4100 v.reset(OpARMBICshiftRA) 4101 v.AuxInt = c 4102 v.AddArg(x) 4103 v.AddArg(y) 4104 return true 4105 } 4106 return false 4107 } 4108 func rewriteValueARM_OpARMBICshiftRL_0(v *Value) bool { 4109 // match: (BICshiftRL x (MOVWconst [c]) [d]) 4110 // cond: 4111 // result: (BICconst x [int64(uint32(c)>>uint64(d))]) 4112 for { 4113 d := v.AuxInt 4114 _ = v.Args[1] 4115 x := v.Args[0] 4116 v_1 := v.Args[1] 4117 if v_1.Op != OpARMMOVWconst { 4118 break 4119 } 4120 c := v_1.AuxInt 4121 v.reset(OpARMBICconst) 4122 v.AuxInt = int64(uint32(c) >> uint64(d)) 4123 v.AddArg(x) 4124 return true 4125 } 4126 // match: (BICshiftRL x (SRLconst x [c]) [d]) 4127 // cond: c==d 4128 // result: (MOVWconst [0]) 4129 for { 4130 d := v.AuxInt 4131 _ = v.Args[1] 4132 x := v.Args[0] 4133 v_1 := v.Args[1] 4134 if v_1.Op != OpARMSRLconst { 4135 break 4136 } 4137 c := v_1.AuxInt 4138 if x != v_1.Args[0] { 4139 break 4140 } 4141 if !(c == d) { 4142 break 4143 } 4144 v.reset(OpARMMOVWconst) 4145 v.AuxInt = 0 4146 return true 4147 } 4148 return false 4149 } 4150 func rewriteValueARM_OpARMBICshiftRLreg_0(v *Value) bool { 4151 // match: (BICshiftRLreg x y (MOVWconst [c])) 4152 // cond: 4153 // result: (BICshiftRL x y [c]) 4154 for { 4155 _ = v.Args[2] 4156 x := v.Args[0] 4157 y := v.Args[1] 4158 v_2 := v.Args[2] 4159 if v_2.Op != OpARMMOVWconst { 4160 break 4161 } 4162 c := v_2.AuxInt 4163 v.reset(OpARMBICshiftRL) 4164 v.AuxInt = c 4165 v.AddArg(x) 4166 v.AddArg(y) 4167 return true 4168 } 4169 return false 4170 } 4171 func rewriteValueARM_OpARMCMOVWHSconst_0(v *Value) bool { 4172 // match: (CMOVWHSconst _ (FlagEQ) [c]) 4173 // cond: 4174 // result: (MOVWconst [c]) 4175 for { 4176 c := v.AuxInt 4177 _ = v.Args[1] 4178 v_1 := v.Args[1] 4179 if v_1.Op != OpARMFlagEQ { 4180 break 4181 } 4182 v.reset(OpARMMOVWconst) 4183 v.AuxInt = c 4184 return true 4185 } 4186 // match: (CMOVWHSconst x (FlagLT_ULT)) 4187 // cond: 4188 // result: x 4189 for { 4190 _ = v.Args[1] 4191 x := v.Args[0] 4192 v_1 := v.Args[1] 4193 if v_1.Op != OpARMFlagLT_ULT { 4194 break 4195 } 4196 v.reset(OpCopy) 4197 v.Type = x.Type 4198 v.AddArg(x) 4199 return true 4200 } 4201 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 4202 // cond: 4203 // result: (MOVWconst [c]) 4204 for { 4205 c := v.AuxInt 4206 _ = v.Args[1] 4207 v_1 := v.Args[1] 4208 if v_1.Op != OpARMFlagLT_UGT { 4209 break 4210 } 4211 v.reset(OpARMMOVWconst) 4212 v.AuxInt = c 4213 return true 4214 } 4215 // match: (CMOVWHSconst x (FlagGT_ULT)) 4216 // cond: 4217 // result: x 4218 for { 4219 _ = v.Args[1] 4220 x := v.Args[0] 4221 v_1 := v.Args[1] 4222 if v_1.Op != OpARMFlagGT_ULT { 4223 break 4224 } 4225 v.reset(OpCopy) 4226 v.Type = x.Type 4227 v.AddArg(x) 4228 return true 4229 } 4230 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 4231 // cond: 4232 // result: (MOVWconst [c]) 4233 for { 4234 c := v.AuxInt 4235 _ = v.Args[1] 4236 v_1 := v.Args[1] 4237 if v_1.Op != OpARMFlagGT_UGT { 4238 break 4239 } 4240 v.reset(OpARMMOVWconst) 4241 v.AuxInt = c 4242 return true 4243 } 4244 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 4245 // cond: 4246 // result: (CMOVWLSconst x flags [c]) 4247 for { 4248 c := v.AuxInt 4249 _ = v.Args[1] 4250 x := v.Args[0] 4251 v_1 := v.Args[1] 4252 if v_1.Op != OpARMInvertFlags { 4253 break 4254 } 4255 flags := v_1.Args[0] 4256 v.reset(OpARMCMOVWLSconst) 4257 v.AuxInt = c 4258 v.AddArg(x) 4259 v.AddArg(flags) 4260 return true 4261 } 4262 return false 4263 } 4264 func rewriteValueARM_OpARMCMOVWLSconst_0(v *Value) bool { 4265 // match: (CMOVWLSconst _ (FlagEQ) [c]) 4266 // cond: 4267 // result: (MOVWconst [c]) 4268 for { 4269 c := v.AuxInt 4270 _ = v.Args[1] 4271 v_1 := v.Args[1] 4272 if v_1.Op != OpARMFlagEQ { 4273 break 4274 } 4275 v.reset(OpARMMOVWconst) 4276 v.AuxInt = c 4277 return true 4278 } 4279 // match: (CMOVWLSconst _ (FlagLT_ULT) [c]) 4280 // cond: 4281 // result: (MOVWconst [c]) 4282 for { 4283 c := v.AuxInt 4284 _ = v.Args[1] 4285 v_1 := v.Args[1] 4286 if v_1.Op != OpARMFlagLT_ULT { 4287 break 4288 } 4289 v.reset(OpARMMOVWconst) 4290 v.AuxInt = c 4291 return true 4292 } 4293 // match: (CMOVWLSconst x (FlagLT_UGT)) 4294 // cond: 4295 // result: x 4296 for { 4297 _ = v.Args[1] 4298 x := v.Args[0] 4299 v_1 := v.Args[1] 4300 if v_1.Op != OpARMFlagLT_UGT { 4301 break 4302 } 4303 v.reset(OpCopy) 4304 v.Type = x.Type 4305 v.AddArg(x) 4306 return true 4307 } 4308 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 4309 // cond: 4310 // result: (MOVWconst [c]) 4311 for { 4312 c := v.AuxInt 4313 _ = v.Args[1] 4314 v_1 := v.Args[1] 4315 if v_1.Op != OpARMFlagGT_ULT { 4316 break 4317 } 4318 v.reset(OpARMMOVWconst) 4319 v.AuxInt = c 4320 return true 4321 } 4322 // match: (CMOVWLSconst x (FlagGT_UGT)) 4323 // cond: 4324 // result: x 4325 for { 4326 _ = v.Args[1] 4327 x := v.Args[0] 4328 v_1 := v.Args[1] 4329 if v_1.Op != OpARMFlagGT_UGT { 4330 break 4331 } 4332 v.reset(OpCopy) 4333 v.Type = x.Type 4334 v.AddArg(x) 4335 return true 4336 } 4337 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 4338 // cond: 4339 // result: (CMOVWHSconst x flags [c]) 4340 for { 4341 c := v.AuxInt 4342 _ = v.Args[1] 4343 x := v.Args[0] 4344 v_1 := v.Args[1] 4345 if v_1.Op != OpARMInvertFlags { 4346 break 4347 } 4348 flags := v_1.Args[0] 4349 v.reset(OpARMCMOVWHSconst) 4350 v.AuxInt = c 4351 v.AddArg(x) 4352 v.AddArg(flags) 4353 return true 4354 } 4355 return false 4356 } 4357 func rewriteValueARM_OpARMCMP_0(v *Value) bool { 4358 b := v.Block 4359 _ = b 4360 // match: (CMP x (MOVWconst [c])) 4361 // cond: 4362 // result: (CMPconst [c] x) 4363 for { 4364 _ = v.Args[1] 4365 x := v.Args[0] 4366 v_1 := v.Args[1] 4367 if v_1.Op != OpARMMOVWconst { 4368 break 4369 } 4370 c := v_1.AuxInt 4371 v.reset(OpARMCMPconst) 4372 v.AuxInt = c 4373 v.AddArg(x) 4374 return true 4375 } 4376 // match: (CMP (MOVWconst [c]) x) 4377 // cond: 4378 // result: (InvertFlags (CMPconst [c] x)) 4379 for { 4380 _ = v.Args[1] 4381 v_0 := v.Args[0] 4382 if v_0.Op != OpARMMOVWconst { 4383 break 4384 } 4385 c := v_0.AuxInt 4386 x := v.Args[1] 4387 v.reset(OpARMInvertFlags) 4388 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4389 v0.AuxInt = c 4390 v0.AddArg(x) 4391 v.AddArg(v0) 4392 return true 4393 } 4394 // match: (CMP x (SLLconst [c] y)) 4395 // cond: 4396 // result: (CMPshiftLL x y [c]) 4397 for { 4398 _ = v.Args[1] 4399 x := v.Args[0] 4400 v_1 := v.Args[1] 4401 if v_1.Op != OpARMSLLconst { 4402 break 4403 } 4404 c := v_1.AuxInt 4405 y := v_1.Args[0] 4406 v.reset(OpARMCMPshiftLL) 4407 v.AuxInt = c 4408 v.AddArg(x) 4409 v.AddArg(y) 4410 return true 4411 } 4412 // match: (CMP (SLLconst [c] y) x) 4413 // cond: 4414 // result: (InvertFlags (CMPshiftLL x y [c])) 4415 for { 4416 _ = v.Args[1] 4417 v_0 := v.Args[0] 4418 if v_0.Op != OpARMSLLconst { 4419 break 4420 } 4421 c := v_0.AuxInt 4422 y := v_0.Args[0] 4423 x := v.Args[1] 4424 v.reset(OpARMInvertFlags) 4425 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 4426 v0.AuxInt = c 4427 v0.AddArg(x) 4428 v0.AddArg(y) 4429 v.AddArg(v0) 4430 return true 4431 } 4432 // match: (CMP x (SRLconst [c] y)) 4433 // cond: 4434 // result: (CMPshiftRL x y [c]) 4435 for { 4436 _ = v.Args[1] 4437 x := v.Args[0] 4438 v_1 := v.Args[1] 4439 if v_1.Op != OpARMSRLconst { 4440 break 4441 } 4442 c := v_1.AuxInt 4443 y := v_1.Args[0] 4444 v.reset(OpARMCMPshiftRL) 4445 v.AuxInt = c 4446 v.AddArg(x) 4447 v.AddArg(y) 4448 return true 4449 } 4450 // match: (CMP (SRLconst [c] y) x) 4451 // cond: 4452 // result: (InvertFlags (CMPshiftRL x y [c])) 4453 for { 4454 _ = v.Args[1] 4455 v_0 := v.Args[0] 4456 if v_0.Op != OpARMSRLconst { 4457 break 4458 } 4459 c := v_0.AuxInt 4460 y := v_0.Args[0] 4461 x := v.Args[1] 4462 v.reset(OpARMInvertFlags) 4463 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 4464 v0.AuxInt = c 4465 v0.AddArg(x) 4466 v0.AddArg(y) 4467 v.AddArg(v0) 4468 return true 4469 } 4470 // match: (CMP x (SRAconst [c] y)) 4471 // cond: 4472 // result: (CMPshiftRA x y [c]) 4473 for { 4474 _ = v.Args[1] 4475 x := v.Args[0] 4476 v_1 := v.Args[1] 4477 if v_1.Op != OpARMSRAconst { 4478 break 4479 } 4480 c := v_1.AuxInt 4481 y := v_1.Args[0] 4482 v.reset(OpARMCMPshiftRA) 4483 v.AuxInt = c 4484 v.AddArg(x) 4485 v.AddArg(y) 4486 return true 4487 } 4488 // match: (CMP (SRAconst [c] y) x) 4489 // cond: 4490 // result: (InvertFlags (CMPshiftRA x y [c])) 4491 for { 4492 _ = v.Args[1] 4493 v_0 := v.Args[0] 4494 if v_0.Op != OpARMSRAconst { 4495 break 4496 } 4497 c := v_0.AuxInt 4498 y := v_0.Args[0] 4499 x := v.Args[1] 4500 v.reset(OpARMInvertFlags) 4501 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 4502 v0.AuxInt = c 4503 v0.AddArg(x) 4504 v0.AddArg(y) 4505 v.AddArg(v0) 4506 return true 4507 } 4508 // match: (CMP x (SLL y z)) 4509 // cond: 4510 // result: (CMPshiftLLreg x y z) 4511 for { 4512 _ = v.Args[1] 4513 x := v.Args[0] 4514 v_1 := v.Args[1] 4515 if v_1.Op != OpARMSLL { 4516 break 4517 } 4518 _ = v_1.Args[1] 4519 y := v_1.Args[0] 4520 z := v_1.Args[1] 4521 v.reset(OpARMCMPshiftLLreg) 4522 v.AddArg(x) 4523 v.AddArg(y) 4524 v.AddArg(z) 4525 return true 4526 } 4527 // match: (CMP (SLL y z) x) 4528 // cond: 4529 // result: (InvertFlags (CMPshiftLLreg x y z)) 4530 for { 4531 _ = v.Args[1] 4532 v_0 := v.Args[0] 4533 if v_0.Op != OpARMSLL { 4534 break 4535 } 4536 _ = v_0.Args[1] 4537 y := v_0.Args[0] 4538 z := v_0.Args[1] 4539 x := v.Args[1] 4540 v.reset(OpARMInvertFlags) 4541 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 4542 v0.AddArg(x) 4543 v0.AddArg(y) 4544 v0.AddArg(z) 4545 v.AddArg(v0) 4546 return true 4547 } 4548 return false 4549 } 4550 func rewriteValueARM_OpARMCMP_10(v *Value) bool { 4551 b := v.Block 4552 _ = b 4553 // match: (CMP x (SRL y z)) 4554 // cond: 4555 // result: (CMPshiftRLreg x y z) 4556 for { 4557 _ = v.Args[1] 4558 x := v.Args[0] 4559 v_1 := v.Args[1] 4560 if v_1.Op != OpARMSRL { 4561 break 4562 } 4563 _ = v_1.Args[1] 4564 y := v_1.Args[0] 4565 z := v_1.Args[1] 4566 v.reset(OpARMCMPshiftRLreg) 4567 v.AddArg(x) 4568 v.AddArg(y) 4569 v.AddArg(z) 4570 return true 4571 } 4572 // match: (CMP (SRL y z) x) 4573 // cond: 4574 // result: (InvertFlags (CMPshiftRLreg x y z)) 4575 for { 4576 _ = v.Args[1] 4577 v_0 := v.Args[0] 4578 if v_0.Op != OpARMSRL { 4579 break 4580 } 4581 _ = v_0.Args[1] 4582 y := v_0.Args[0] 4583 z := v_0.Args[1] 4584 x := v.Args[1] 4585 v.reset(OpARMInvertFlags) 4586 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 4587 v0.AddArg(x) 4588 v0.AddArg(y) 4589 v0.AddArg(z) 4590 v.AddArg(v0) 4591 return true 4592 } 4593 // match: (CMP x (SRA y z)) 4594 // cond: 4595 // result: (CMPshiftRAreg x y z) 4596 for { 4597 _ = v.Args[1] 4598 x := v.Args[0] 4599 v_1 := v.Args[1] 4600 if v_1.Op != OpARMSRA { 4601 break 4602 } 4603 _ = v_1.Args[1] 4604 y := v_1.Args[0] 4605 z := v_1.Args[1] 4606 v.reset(OpARMCMPshiftRAreg) 4607 v.AddArg(x) 4608 v.AddArg(y) 4609 v.AddArg(z) 4610 return true 4611 } 4612 // match: (CMP (SRA y z) x) 4613 // cond: 4614 // result: (InvertFlags (CMPshiftRAreg x y z)) 4615 for { 4616 _ = v.Args[1] 4617 v_0 := v.Args[0] 4618 if v_0.Op != OpARMSRA { 4619 break 4620 } 4621 _ = v_0.Args[1] 4622 y := v_0.Args[0] 4623 z := v_0.Args[1] 4624 x := v.Args[1] 4625 v.reset(OpARMInvertFlags) 4626 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 4627 v0.AddArg(x) 4628 v0.AddArg(y) 4629 v0.AddArg(z) 4630 v.AddArg(v0) 4631 return true 4632 } 4633 return false 4634 } 4635 func rewriteValueARM_OpARMCMPD_0(v *Value) bool { 4636 // match: (CMPD x (MOVDconst [0])) 4637 // cond: 4638 // result: (CMPD0 x) 4639 for { 4640 _ = v.Args[1] 4641 x := v.Args[0] 4642 v_1 := v.Args[1] 4643 if v_1.Op != OpARMMOVDconst { 4644 break 4645 } 4646 if v_1.AuxInt != 0 { 4647 break 4648 } 4649 v.reset(OpARMCMPD0) 4650 v.AddArg(x) 4651 return true 4652 } 4653 return false 4654 } 4655 func rewriteValueARM_OpARMCMPF_0(v *Value) bool { 4656 // match: (CMPF x (MOVFconst [0])) 4657 // cond: 4658 // result: (CMPF0 x) 4659 for { 4660 _ = v.Args[1] 4661 x := v.Args[0] 4662 v_1 := v.Args[1] 4663 if v_1.Op != OpARMMOVFconst { 4664 break 4665 } 4666 if v_1.AuxInt != 0 { 4667 break 4668 } 4669 v.reset(OpARMCMPF0) 4670 v.AddArg(x) 4671 return true 4672 } 4673 return false 4674 } 4675 func rewriteValueARM_OpARMCMPconst_0(v *Value) bool { 4676 // match: (CMPconst (MOVWconst [x]) [y]) 4677 // cond: int32(x)==int32(y) 4678 // result: (FlagEQ) 4679 for { 4680 y := v.AuxInt 4681 v_0 := v.Args[0] 4682 if v_0.Op != OpARMMOVWconst { 4683 break 4684 } 4685 x := v_0.AuxInt 4686 if !(int32(x) == int32(y)) { 4687 break 4688 } 4689 v.reset(OpARMFlagEQ) 4690 return true 4691 } 4692 // match: (CMPconst (MOVWconst [x]) [y]) 4693 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 4694 // result: (FlagLT_ULT) 4695 for { 4696 y := v.AuxInt 4697 v_0 := v.Args[0] 4698 if v_0.Op != OpARMMOVWconst { 4699 break 4700 } 4701 x := v_0.AuxInt 4702 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 4703 break 4704 } 4705 v.reset(OpARMFlagLT_ULT) 4706 return true 4707 } 4708 // match: (CMPconst (MOVWconst [x]) [y]) 4709 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 4710 // result: (FlagLT_UGT) 4711 for { 4712 y := v.AuxInt 4713 v_0 := v.Args[0] 4714 if v_0.Op != OpARMMOVWconst { 4715 break 4716 } 4717 x := v_0.AuxInt 4718 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 4719 break 4720 } 4721 v.reset(OpARMFlagLT_UGT) 4722 return true 4723 } 4724 // match: (CMPconst (MOVWconst [x]) [y]) 4725 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 4726 // result: (FlagGT_ULT) 4727 for { 4728 y := v.AuxInt 4729 v_0 := v.Args[0] 4730 if v_0.Op != OpARMMOVWconst { 4731 break 4732 } 4733 x := v_0.AuxInt 4734 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 4735 break 4736 } 4737 v.reset(OpARMFlagGT_ULT) 4738 return true 4739 } 4740 // match: (CMPconst (MOVWconst [x]) [y]) 4741 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 4742 // result: (FlagGT_UGT) 4743 for { 4744 y := v.AuxInt 4745 v_0 := v.Args[0] 4746 if v_0.Op != OpARMMOVWconst { 4747 break 4748 } 4749 x := v_0.AuxInt 4750 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 4751 break 4752 } 4753 v.reset(OpARMFlagGT_UGT) 4754 return true 4755 } 4756 // match: (CMPconst (MOVBUreg _) [c]) 4757 // cond: 0xff < c 4758 // result: (FlagLT_ULT) 4759 for { 4760 c := v.AuxInt 4761 v_0 := v.Args[0] 4762 if v_0.Op != OpARMMOVBUreg { 4763 break 4764 } 4765 if !(0xff < c) { 4766 break 4767 } 4768 v.reset(OpARMFlagLT_ULT) 4769 return true 4770 } 4771 // match: (CMPconst (MOVHUreg _) [c]) 4772 // cond: 0xffff < c 4773 // result: (FlagLT_ULT) 4774 for { 4775 c := v.AuxInt 4776 v_0 := v.Args[0] 4777 if v_0.Op != OpARMMOVHUreg { 4778 break 4779 } 4780 if !(0xffff < c) { 4781 break 4782 } 4783 v.reset(OpARMFlagLT_ULT) 4784 return true 4785 } 4786 // match: (CMPconst (ANDconst _ [m]) [n]) 4787 // cond: 0 <= int32(m) && int32(m) < int32(n) 4788 // result: (FlagLT_ULT) 4789 for { 4790 n := v.AuxInt 4791 v_0 := v.Args[0] 4792 if v_0.Op != OpARMANDconst { 4793 break 4794 } 4795 m := v_0.AuxInt 4796 if !(0 <= int32(m) && int32(m) < int32(n)) { 4797 break 4798 } 4799 v.reset(OpARMFlagLT_ULT) 4800 return true 4801 } 4802 // match: (CMPconst (SRLconst _ [c]) [n]) 4803 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 4804 // result: (FlagLT_ULT) 4805 for { 4806 n := v.AuxInt 4807 v_0 := v.Args[0] 4808 if v_0.Op != OpARMSRLconst { 4809 break 4810 } 4811 c := v_0.AuxInt 4812 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 4813 break 4814 } 4815 v.reset(OpARMFlagLT_ULT) 4816 return true 4817 } 4818 return false 4819 } 4820 func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { 4821 b := v.Block 4822 _ = b 4823 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 4824 // cond: 4825 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 4826 for { 4827 d := v.AuxInt 4828 _ = v.Args[1] 4829 v_0 := v.Args[0] 4830 if v_0.Op != OpARMMOVWconst { 4831 break 4832 } 4833 c := v_0.AuxInt 4834 x := v.Args[1] 4835 v.reset(OpARMInvertFlags) 4836 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4837 v0.AuxInt = c 4838 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4839 v1.AuxInt = d 4840 v1.AddArg(x) 4841 v0.AddArg(v1) 4842 v.AddArg(v0) 4843 return true 4844 } 4845 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 4846 // cond: 4847 // result: (CMPconst x [int64(uint32(c)<<uint64(d))]) 4848 for { 4849 d := v.AuxInt 4850 _ = v.Args[1] 4851 x := v.Args[0] 4852 v_1 := v.Args[1] 4853 if v_1.Op != OpARMMOVWconst { 4854 break 4855 } 4856 c := v_1.AuxInt 4857 v.reset(OpARMCMPconst) 4858 v.AuxInt = int64(uint32(c) << uint64(d)) 4859 v.AddArg(x) 4860 return true 4861 } 4862 return false 4863 } 4864 func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { 4865 b := v.Block 4866 _ = b 4867 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 4868 // cond: 4869 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 4870 for { 4871 _ = v.Args[2] 4872 v_0 := v.Args[0] 4873 if v_0.Op != OpARMMOVWconst { 4874 break 4875 } 4876 c := v_0.AuxInt 4877 x := v.Args[1] 4878 y := v.Args[2] 4879 v.reset(OpARMInvertFlags) 4880 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4881 v0.AuxInt = c 4882 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4883 v1.AddArg(x) 4884 v1.AddArg(y) 4885 v0.AddArg(v1) 4886 v.AddArg(v0) 4887 return true 4888 } 4889 // match: (CMPshiftLLreg x y (MOVWconst [c])) 4890 // cond: 4891 // result: (CMPshiftLL x y [c]) 4892 for { 4893 _ = v.Args[2] 4894 x := v.Args[0] 4895 y := v.Args[1] 4896 v_2 := v.Args[2] 4897 if v_2.Op != OpARMMOVWconst { 4898 break 4899 } 4900 c := v_2.AuxInt 4901 v.reset(OpARMCMPshiftLL) 4902 v.AuxInt = c 4903 v.AddArg(x) 4904 v.AddArg(y) 4905 return true 4906 } 4907 return false 4908 } 4909 func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { 4910 b := v.Block 4911 _ = b 4912 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 4913 // cond: 4914 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 4915 for { 4916 d := v.AuxInt 4917 _ = v.Args[1] 4918 v_0 := v.Args[0] 4919 if v_0.Op != OpARMMOVWconst { 4920 break 4921 } 4922 c := v_0.AuxInt 4923 x := v.Args[1] 4924 v.reset(OpARMInvertFlags) 4925 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4926 v0.AuxInt = c 4927 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4928 v1.AuxInt = d 4929 v1.AddArg(x) 4930 v0.AddArg(v1) 4931 v.AddArg(v0) 4932 return true 4933 } 4934 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 4935 // cond: 4936 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 4937 for { 4938 d := v.AuxInt 4939 _ = v.Args[1] 4940 x := v.Args[0] 4941 v_1 := v.Args[1] 4942 if v_1.Op != OpARMMOVWconst { 4943 break 4944 } 4945 c := v_1.AuxInt 4946 v.reset(OpARMCMPconst) 4947 v.AuxInt = int64(int32(c) >> uint64(d)) 4948 v.AddArg(x) 4949 return true 4950 } 4951 return false 4952 } 4953 func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { 4954 b := v.Block 4955 _ = b 4956 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 4957 // cond: 4958 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 4959 for { 4960 _ = v.Args[2] 4961 v_0 := v.Args[0] 4962 if v_0.Op != OpARMMOVWconst { 4963 break 4964 } 4965 c := v_0.AuxInt 4966 x := v.Args[1] 4967 y := v.Args[2] 4968 v.reset(OpARMInvertFlags) 4969 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4970 v0.AuxInt = c 4971 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4972 v1.AddArg(x) 4973 v1.AddArg(y) 4974 v0.AddArg(v1) 4975 v.AddArg(v0) 4976 return true 4977 } 4978 // match: (CMPshiftRAreg x y (MOVWconst [c])) 4979 // cond: 4980 // result: (CMPshiftRA x y [c]) 4981 for { 4982 _ = v.Args[2] 4983 x := v.Args[0] 4984 y := v.Args[1] 4985 v_2 := v.Args[2] 4986 if v_2.Op != OpARMMOVWconst { 4987 break 4988 } 4989 c := v_2.AuxInt 4990 v.reset(OpARMCMPshiftRA) 4991 v.AuxInt = c 4992 v.AddArg(x) 4993 v.AddArg(y) 4994 return true 4995 } 4996 return false 4997 } 4998 func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { 4999 b := v.Block 5000 _ = b 5001 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 5002 // cond: 5003 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 5004 for { 5005 d := v.AuxInt 5006 _ = v.Args[1] 5007 v_0 := v.Args[0] 5008 if v_0.Op != OpARMMOVWconst { 5009 break 5010 } 5011 c := v_0.AuxInt 5012 x := v.Args[1] 5013 v.reset(OpARMInvertFlags) 5014 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5015 v0.AuxInt = c 5016 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 5017 v1.AuxInt = d 5018 v1.AddArg(x) 5019 v0.AddArg(v1) 5020 v.AddArg(v0) 5021 return true 5022 } 5023 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 5024 // cond: 5025 // result: (CMPconst x [int64(uint32(c)>>uint64(d))]) 5026 for { 5027 d := v.AuxInt 5028 _ = v.Args[1] 5029 x := v.Args[0] 5030 v_1 := v.Args[1] 5031 if v_1.Op != OpARMMOVWconst { 5032 break 5033 } 5034 c := v_1.AuxInt 5035 v.reset(OpARMCMPconst) 5036 v.AuxInt = int64(uint32(c) >> uint64(d)) 5037 v.AddArg(x) 5038 return true 5039 } 5040 return false 5041 } 5042 func rewriteValueARM_OpARMCMPshiftRLreg_0(v *Value) bool { 5043 b := v.Block 5044 _ = b 5045 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 5046 // cond: 5047 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 5048 for { 5049 _ = v.Args[2] 5050 v_0 := v.Args[0] 5051 if v_0.Op != OpARMMOVWconst { 5052 break 5053 } 5054 c := v_0.AuxInt 5055 x := v.Args[1] 5056 y := v.Args[2] 5057 v.reset(OpARMInvertFlags) 5058 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5059 v0.AuxInt = c 5060 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 5061 v1.AddArg(x) 5062 v1.AddArg(y) 5063 v0.AddArg(v1) 5064 v.AddArg(v0) 5065 return true 5066 } 5067 // match: (CMPshiftRLreg x y (MOVWconst [c])) 5068 // cond: 5069 // result: (CMPshiftRL x y [c]) 5070 for { 5071 _ = v.Args[2] 5072 x := v.Args[0] 5073 y := v.Args[1] 5074 v_2 := v.Args[2] 5075 if v_2.Op != OpARMMOVWconst { 5076 break 5077 } 5078 c := v_2.AuxInt 5079 v.reset(OpARMCMPshiftRL) 5080 v.AuxInt = c 5081 v.AddArg(x) 5082 v.AddArg(y) 5083 return true 5084 } 5085 return false 5086 } 5087 func rewriteValueARM_OpARMEqual_0(v *Value) bool { 5088 // match: (Equal (FlagEQ)) 5089 // cond: 5090 // result: (MOVWconst [1]) 5091 for { 5092 v_0 := v.Args[0] 5093 if v_0.Op != OpARMFlagEQ { 5094 break 5095 } 5096 v.reset(OpARMMOVWconst) 5097 v.AuxInt = 1 5098 return true 5099 } 5100 // match: (Equal (FlagLT_ULT)) 5101 // cond: 5102 // result: (MOVWconst [0]) 5103 for { 5104 v_0 := v.Args[0] 5105 if v_0.Op != OpARMFlagLT_ULT { 5106 break 5107 } 5108 v.reset(OpARMMOVWconst) 5109 v.AuxInt = 0 5110 return true 5111 } 5112 // match: (Equal (FlagLT_UGT)) 5113 // cond: 5114 // result: (MOVWconst [0]) 5115 for { 5116 v_0 := v.Args[0] 5117 if v_0.Op != OpARMFlagLT_UGT { 5118 break 5119 } 5120 v.reset(OpARMMOVWconst) 5121 v.AuxInt = 0 5122 return true 5123 } 5124 // match: (Equal (FlagGT_ULT)) 5125 // cond: 5126 // result: (MOVWconst [0]) 5127 for { 5128 v_0 := v.Args[0] 5129 if v_0.Op != OpARMFlagGT_ULT { 5130 break 5131 } 5132 v.reset(OpARMMOVWconst) 5133 v.AuxInt = 0 5134 return true 5135 } 5136 // match: (Equal (FlagGT_UGT)) 5137 // cond: 5138 // result: (MOVWconst [0]) 5139 for { 5140 v_0 := v.Args[0] 5141 if v_0.Op != OpARMFlagGT_UGT { 5142 break 5143 } 5144 v.reset(OpARMMOVWconst) 5145 v.AuxInt = 0 5146 return true 5147 } 5148 // match: (Equal (InvertFlags x)) 5149 // cond: 5150 // result: (Equal x) 5151 for { 5152 v_0 := v.Args[0] 5153 if v_0.Op != OpARMInvertFlags { 5154 break 5155 } 5156 x := v_0.Args[0] 5157 v.reset(OpARMEqual) 5158 v.AddArg(x) 5159 return true 5160 } 5161 return false 5162 } 5163 func rewriteValueARM_OpARMGreaterEqual_0(v *Value) bool { 5164 // match: (GreaterEqual (FlagEQ)) 5165 // cond: 5166 // result: (MOVWconst [1]) 5167 for { 5168 v_0 := v.Args[0] 5169 if v_0.Op != OpARMFlagEQ { 5170 break 5171 } 5172 v.reset(OpARMMOVWconst) 5173 v.AuxInt = 1 5174 return true 5175 } 5176 // match: (GreaterEqual (FlagLT_ULT)) 5177 // cond: 5178 // result: (MOVWconst [0]) 5179 for { 5180 v_0 := v.Args[0] 5181 if v_0.Op != OpARMFlagLT_ULT { 5182 break 5183 } 5184 v.reset(OpARMMOVWconst) 5185 v.AuxInt = 0 5186 return true 5187 } 5188 // match: (GreaterEqual (FlagLT_UGT)) 5189 // cond: 5190 // result: (MOVWconst [0]) 5191 for { 5192 v_0 := v.Args[0] 5193 if v_0.Op != OpARMFlagLT_UGT { 5194 break 5195 } 5196 v.reset(OpARMMOVWconst) 5197 v.AuxInt = 0 5198 return true 5199 } 5200 // match: (GreaterEqual (FlagGT_ULT)) 5201 // cond: 5202 // result: (MOVWconst [1]) 5203 for { 5204 v_0 := v.Args[0] 5205 if v_0.Op != OpARMFlagGT_ULT { 5206 break 5207 } 5208 v.reset(OpARMMOVWconst) 5209 v.AuxInt = 1 5210 return true 5211 } 5212 // match: (GreaterEqual (FlagGT_UGT)) 5213 // cond: 5214 // result: (MOVWconst [1]) 5215 for { 5216 v_0 := v.Args[0] 5217 if v_0.Op != OpARMFlagGT_UGT { 5218 break 5219 } 5220 v.reset(OpARMMOVWconst) 5221 v.AuxInt = 1 5222 return true 5223 } 5224 // match: (GreaterEqual (InvertFlags x)) 5225 // cond: 5226 // result: (LessEqual x) 5227 for { 5228 v_0 := v.Args[0] 5229 if v_0.Op != OpARMInvertFlags { 5230 break 5231 } 5232 x := v_0.Args[0] 5233 v.reset(OpARMLessEqual) 5234 v.AddArg(x) 5235 return true 5236 } 5237 return false 5238 } 5239 func rewriteValueARM_OpARMGreaterEqualU_0(v *Value) bool { 5240 // match: (GreaterEqualU (FlagEQ)) 5241 // cond: 5242 // result: (MOVWconst [1]) 5243 for { 5244 v_0 := v.Args[0] 5245 if v_0.Op != OpARMFlagEQ { 5246 break 5247 } 5248 v.reset(OpARMMOVWconst) 5249 v.AuxInt = 1 5250 return true 5251 } 5252 // match: (GreaterEqualU (FlagLT_ULT)) 5253 // cond: 5254 // result: (MOVWconst [0]) 5255 for { 5256 v_0 := v.Args[0] 5257 if v_0.Op != OpARMFlagLT_ULT { 5258 break 5259 } 5260 v.reset(OpARMMOVWconst) 5261 v.AuxInt = 0 5262 return true 5263 } 5264 // match: (GreaterEqualU (FlagLT_UGT)) 5265 // cond: 5266 // result: (MOVWconst [1]) 5267 for { 5268 v_0 := v.Args[0] 5269 if v_0.Op != OpARMFlagLT_UGT { 5270 break 5271 } 5272 v.reset(OpARMMOVWconst) 5273 v.AuxInt = 1 5274 return true 5275 } 5276 // match: (GreaterEqualU (FlagGT_ULT)) 5277 // cond: 5278 // result: (MOVWconst [0]) 5279 for { 5280 v_0 := v.Args[0] 5281 if v_0.Op != OpARMFlagGT_ULT { 5282 break 5283 } 5284 v.reset(OpARMMOVWconst) 5285 v.AuxInt = 0 5286 return true 5287 } 5288 // match: (GreaterEqualU (FlagGT_UGT)) 5289 // cond: 5290 // result: (MOVWconst [1]) 5291 for { 5292 v_0 := v.Args[0] 5293 if v_0.Op != OpARMFlagGT_UGT { 5294 break 5295 } 5296 v.reset(OpARMMOVWconst) 5297 v.AuxInt = 1 5298 return true 5299 } 5300 // match: (GreaterEqualU (InvertFlags x)) 5301 // cond: 5302 // result: (LessEqualU x) 5303 for { 5304 v_0 := v.Args[0] 5305 if v_0.Op != OpARMInvertFlags { 5306 break 5307 } 5308 x := v_0.Args[0] 5309 v.reset(OpARMLessEqualU) 5310 v.AddArg(x) 5311 return true 5312 } 5313 return false 5314 } 5315 func rewriteValueARM_OpARMGreaterThan_0(v *Value) bool { 5316 // match: (GreaterThan (FlagEQ)) 5317 // cond: 5318 // result: (MOVWconst [0]) 5319 for { 5320 v_0 := v.Args[0] 5321 if v_0.Op != OpARMFlagEQ { 5322 break 5323 } 5324 v.reset(OpARMMOVWconst) 5325 v.AuxInt = 0 5326 return true 5327 } 5328 // match: (GreaterThan (FlagLT_ULT)) 5329 // cond: 5330 // result: (MOVWconst [0]) 5331 for { 5332 v_0 := v.Args[0] 5333 if v_0.Op != OpARMFlagLT_ULT { 5334 break 5335 } 5336 v.reset(OpARMMOVWconst) 5337 v.AuxInt = 0 5338 return true 5339 } 5340 // match: (GreaterThan (FlagLT_UGT)) 5341 // cond: 5342 // result: (MOVWconst [0]) 5343 for { 5344 v_0 := v.Args[0] 5345 if v_0.Op != OpARMFlagLT_UGT { 5346 break 5347 } 5348 v.reset(OpARMMOVWconst) 5349 v.AuxInt = 0 5350 return true 5351 } 5352 // match: (GreaterThan (FlagGT_ULT)) 5353 // cond: 5354 // result: (MOVWconst [1]) 5355 for { 5356 v_0 := v.Args[0] 5357 if v_0.Op != OpARMFlagGT_ULT { 5358 break 5359 } 5360 v.reset(OpARMMOVWconst) 5361 v.AuxInt = 1 5362 return true 5363 } 5364 // match: (GreaterThan (FlagGT_UGT)) 5365 // cond: 5366 // result: (MOVWconst [1]) 5367 for { 5368 v_0 := v.Args[0] 5369 if v_0.Op != OpARMFlagGT_UGT { 5370 break 5371 } 5372 v.reset(OpARMMOVWconst) 5373 v.AuxInt = 1 5374 return true 5375 } 5376 // match: (GreaterThan (InvertFlags x)) 5377 // cond: 5378 // result: (LessThan x) 5379 for { 5380 v_0 := v.Args[0] 5381 if v_0.Op != OpARMInvertFlags { 5382 break 5383 } 5384 x := v_0.Args[0] 5385 v.reset(OpARMLessThan) 5386 v.AddArg(x) 5387 return true 5388 } 5389 return false 5390 } 5391 func rewriteValueARM_OpARMGreaterThanU_0(v *Value) bool { 5392 // match: (GreaterThanU (FlagEQ)) 5393 // cond: 5394 // result: (MOVWconst [0]) 5395 for { 5396 v_0 := v.Args[0] 5397 if v_0.Op != OpARMFlagEQ { 5398 break 5399 } 5400 v.reset(OpARMMOVWconst) 5401 v.AuxInt = 0 5402 return true 5403 } 5404 // match: (GreaterThanU (FlagLT_ULT)) 5405 // cond: 5406 // result: (MOVWconst [0]) 5407 for { 5408 v_0 := v.Args[0] 5409 if v_0.Op != OpARMFlagLT_ULT { 5410 break 5411 } 5412 v.reset(OpARMMOVWconst) 5413 v.AuxInt = 0 5414 return true 5415 } 5416 // match: (GreaterThanU (FlagLT_UGT)) 5417 // cond: 5418 // result: (MOVWconst [1]) 5419 for { 5420 v_0 := v.Args[0] 5421 if v_0.Op != OpARMFlagLT_UGT { 5422 break 5423 } 5424 v.reset(OpARMMOVWconst) 5425 v.AuxInt = 1 5426 return true 5427 } 5428 // match: (GreaterThanU (FlagGT_ULT)) 5429 // cond: 5430 // result: (MOVWconst [0]) 5431 for { 5432 v_0 := v.Args[0] 5433 if v_0.Op != OpARMFlagGT_ULT { 5434 break 5435 } 5436 v.reset(OpARMMOVWconst) 5437 v.AuxInt = 0 5438 return true 5439 } 5440 // match: (GreaterThanU (FlagGT_UGT)) 5441 // cond: 5442 // result: (MOVWconst [1]) 5443 for { 5444 v_0 := v.Args[0] 5445 if v_0.Op != OpARMFlagGT_UGT { 5446 break 5447 } 5448 v.reset(OpARMMOVWconst) 5449 v.AuxInt = 1 5450 return true 5451 } 5452 // match: (GreaterThanU (InvertFlags x)) 5453 // cond: 5454 // result: (LessThanU x) 5455 for { 5456 v_0 := v.Args[0] 5457 if v_0.Op != OpARMInvertFlags { 5458 break 5459 } 5460 x := v_0.Args[0] 5461 v.reset(OpARMLessThanU) 5462 v.AddArg(x) 5463 return true 5464 } 5465 return false 5466 } 5467 func rewriteValueARM_OpARMLessEqual_0(v *Value) bool { 5468 // match: (LessEqual (FlagEQ)) 5469 // cond: 5470 // result: (MOVWconst [1]) 5471 for { 5472 v_0 := v.Args[0] 5473 if v_0.Op != OpARMFlagEQ { 5474 break 5475 } 5476 v.reset(OpARMMOVWconst) 5477 v.AuxInt = 1 5478 return true 5479 } 5480 // match: (LessEqual (FlagLT_ULT)) 5481 // cond: 5482 // result: (MOVWconst [1]) 5483 for { 5484 v_0 := v.Args[0] 5485 if v_0.Op != OpARMFlagLT_ULT { 5486 break 5487 } 5488 v.reset(OpARMMOVWconst) 5489 v.AuxInt = 1 5490 return true 5491 } 5492 // match: (LessEqual (FlagLT_UGT)) 5493 // cond: 5494 // result: (MOVWconst [1]) 5495 for { 5496 v_0 := v.Args[0] 5497 if v_0.Op != OpARMFlagLT_UGT { 5498 break 5499 } 5500 v.reset(OpARMMOVWconst) 5501 v.AuxInt = 1 5502 return true 5503 } 5504 // match: (LessEqual (FlagGT_ULT)) 5505 // cond: 5506 // result: (MOVWconst [0]) 5507 for { 5508 v_0 := v.Args[0] 5509 if v_0.Op != OpARMFlagGT_ULT { 5510 break 5511 } 5512 v.reset(OpARMMOVWconst) 5513 v.AuxInt = 0 5514 return true 5515 } 5516 // match: (LessEqual (FlagGT_UGT)) 5517 // cond: 5518 // result: (MOVWconst [0]) 5519 for { 5520 v_0 := v.Args[0] 5521 if v_0.Op != OpARMFlagGT_UGT { 5522 break 5523 } 5524 v.reset(OpARMMOVWconst) 5525 v.AuxInt = 0 5526 return true 5527 } 5528 // match: (LessEqual (InvertFlags x)) 5529 // cond: 5530 // result: (GreaterEqual x) 5531 for { 5532 v_0 := v.Args[0] 5533 if v_0.Op != OpARMInvertFlags { 5534 break 5535 } 5536 x := v_0.Args[0] 5537 v.reset(OpARMGreaterEqual) 5538 v.AddArg(x) 5539 return true 5540 } 5541 return false 5542 } 5543 func rewriteValueARM_OpARMLessEqualU_0(v *Value) bool { 5544 // match: (LessEqualU (FlagEQ)) 5545 // cond: 5546 // result: (MOVWconst [1]) 5547 for { 5548 v_0 := v.Args[0] 5549 if v_0.Op != OpARMFlagEQ { 5550 break 5551 } 5552 v.reset(OpARMMOVWconst) 5553 v.AuxInt = 1 5554 return true 5555 } 5556 // match: (LessEqualU (FlagLT_ULT)) 5557 // cond: 5558 // result: (MOVWconst [1]) 5559 for { 5560 v_0 := v.Args[0] 5561 if v_0.Op != OpARMFlagLT_ULT { 5562 break 5563 } 5564 v.reset(OpARMMOVWconst) 5565 v.AuxInt = 1 5566 return true 5567 } 5568 // match: (LessEqualU (FlagLT_UGT)) 5569 // cond: 5570 // result: (MOVWconst [0]) 5571 for { 5572 v_0 := v.Args[0] 5573 if v_0.Op != OpARMFlagLT_UGT { 5574 break 5575 } 5576 v.reset(OpARMMOVWconst) 5577 v.AuxInt = 0 5578 return true 5579 } 5580 // match: (LessEqualU (FlagGT_ULT)) 5581 // cond: 5582 // result: (MOVWconst [1]) 5583 for { 5584 v_0 := v.Args[0] 5585 if v_0.Op != OpARMFlagGT_ULT { 5586 break 5587 } 5588 v.reset(OpARMMOVWconst) 5589 v.AuxInt = 1 5590 return true 5591 } 5592 // match: (LessEqualU (FlagGT_UGT)) 5593 // cond: 5594 // result: (MOVWconst [0]) 5595 for { 5596 v_0 := v.Args[0] 5597 if v_0.Op != OpARMFlagGT_UGT { 5598 break 5599 } 5600 v.reset(OpARMMOVWconst) 5601 v.AuxInt = 0 5602 return true 5603 } 5604 // match: (LessEqualU (InvertFlags x)) 5605 // cond: 5606 // result: (GreaterEqualU x) 5607 for { 5608 v_0 := v.Args[0] 5609 if v_0.Op != OpARMInvertFlags { 5610 break 5611 } 5612 x := v_0.Args[0] 5613 v.reset(OpARMGreaterEqualU) 5614 v.AddArg(x) 5615 return true 5616 } 5617 return false 5618 } 5619 func rewriteValueARM_OpARMLessThan_0(v *Value) bool { 5620 // match: (LessThan (FlagEQ)) 5621 // cond: 5622 // result: (MOVWconst [0]) 5623 for { 5624 v_0 := v.Args[0] 5625 if v_0.Op != OpARMFlagEQ { 5626 break 5627 } 5628 v.reset(OpARMMOVWconst) 5629 v.AuxInt = 0 5630 return true 5631 } 5632 // match: (LessThan (FlagLT_ULT)) 5633 // cond: 5634 // result: (MOVWconst [1]) 5635 for { 5636 v_0 := v.Args[0] 5637 if v_0.Op != OpARMFlagLT_ULT { 5638 break 5639 } 5640 v.reset(OpARMMOVWconst) 5641 v.AuxInt = 1 5642 return true 5643 } 5644 // match: (LessThan (FlagLT_UGT)) 5645 // cond: 5646 // result: (MOVWconst [1]) 5647 for { 5648 v_0 := v.Args[0] 5649 if v_0.Op != OpARMFlagLT_UGT { 5650 break 5651 } 5652 v.reset(OpARMMOVWconst) 5653 v.AuxInt = 1 5654 return true 5655 } 5656 // match: (LessThan (FlagGT_ULT)) 5657 // cond: 5658 // result: (MOVWconst [0]) 5659 for { 5660 v_0 := v.Args[0] 5661 if v_0.Op != OpARMFlagGT_ULT { 5662 break 5663 } 5664 v.reset(OpARMMOVWconst) 5665 v.AuxInt = 0 5666 return true 5667 } 5668 // match: (LessThan (FlagGT_UGT)) 5669 // cond: 5670 // result: (MOVWconst [0]) 5671 for { 5672 v_0 := v.Args[0] 5673 if v_0.Op != OpARMFlagGT_UGT { 5674 break 5675 } 5676 v.reset(OpARMMOVWconst) 5677 v.AuxInt = 0 5678 return true 5679 } 5680 // match: (LessThan (InvertFlags x)) 5681 // cond: 5682 // result: (GreaterThan x) 5683 for { 5684 v_0 := v.Args[0] 5685 if v_0.Op != OpARMInvertFlags { 5686 break 5687 } 5688 x := v_0.Args[0] 5689 v.reset(OpARMGreaterThan) 5690 v.AddArg(x) 5691 return true 5692 } 5693 return false 5694 } 5695 func rewriteValueARM_OpARMLessThanU_0(v *Value) bool { 5696 // match: (LessThanU (FlagEQ)) 5697 // cond: 5698 // result: (MOVWconst [0]) 5699 for { 5700 v_0 := v.Args[0] 5701 if v_0.Op != OpARMFlagEQ { 5702 break 5703 } 5704 v.reset(OpARMMOVWconst) 5705 v.AuxInt = 0 5706 return true 5707 } 5708 // match: (LessThanU (FlagLT_ULT)) 5709 // cond: 5710 // result: (MOVWconst [1]) 5711 for { 5712 v_0 := v.Args[0] 5713 if v_0.Op != OpARMFlagLT_ULT { 5714 break 5715 } 5716 v.reset(OpARMMOVWconst) 5717 v.AuxInt = 1 5718 return true 5719 } 5720 // match: (LessThanU (FlagLT_UGT)) 5721 // cond: 5722 // result: (MOVWconst [0]) 5723 for { 5724 v_0 := v.Args[0] 5725 if v_0.Op != OpARMFlagLT_UGT { 5726 break 5727 } 5728 v.reset(OpARMMOVWconst) 5729 v.AuxInt = 0 5730 return true 5731 } 5732 // match: (LessThanU (FlagGT_ULT)) 5733 // cond: 5734 // result: (MOVWconst [1]) 5735 for { 5736 v_0 := v.Args[0] 5737 if v_0.Op != OpARMFlagGT_ULT { 5738 break 5739 } 5740 v.reset(OpARMMOVWconst) 5741 v.AuxInt = 1 5742 return true 5743 } 5744 // match: (LessThanU (FlagGT_UGT)) 5745 // cond: 5746 // result: (MOVWconst [0]) 5747 for { 5748 v_0 := v.Args[0] 5749 if v_0.Op != OpARMFlagGT_UGT { 5750 break 5751 } 5752 v.reset(OpARMMOVWconst) 5753 v.AuxInt = 0 5754 return true 5755 } 5756 // match: (LessThanU (InvertFlags x)) 5757 // cond: 5758 // result: (GreaterThanU x) 5759 for { 5760 v_0 := v.Args[0] 5761 if v_0.Op != OpARMInvertFlags { 5762 break 5763 } 5764 x := v_0.Args[0] 5765 v.reset(OpARMGreaterThanU) 5766 v.AddArg(x) 5767 return true 5768 } 5769 return false 5770 } 5771 func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { 5772 b := v.Block 5773 _ = b 5774 config := b.Func.Config 5775 _ = config 5776 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 5777 // cond: 5778 // result: (MOVBUload [off1+off2] {sym} ptr mem) 5779 for { 5780 off1 := v.AuxInt 5781 sym := v.Aux 5782 _ = v.Args[1] 5783 v_0 := v.Args[0] 5784 if v_0.Op != OpARMADDconst { 5785 break 5786 } 5787 off2 := v_0.AuxInt 5788 ptr := v_0.Args[0] 5789 mem := v.Args[1] 5790 v.reset(OpARMMOVBUload) 5791 v.AuxInt = off1 + off2 5792 v.Aux = sym 5793 v.AddArg(ptr) 5794 v.AddArg(mem) 5795 return true 5796 } 5797 // match: (MOVBUload [off1] {sym} (SUBconst [off2] ptr) mem) 5798 // cond: 5799 // result: (MOVBUload [off1-off2] {sym} ptr mem) 5800 for { 5801 off1 := v.AuxInt 5802 sym := v.Aux 5803 _ = v.Args[1] 5804 v_0 := v.Args[0] 5805 if v_0.Op != OpARMSUBconst { 5806 break 5807 } 5808 off2 := v_0.AuxInt 5809 ptr := v_0.Args[0] 5810 mem := v.Args[1] 5811 v.reset(OpARMMOVBUload) 5812 v.AuxInt = off1 - off2 5813 v.Aux = sym 5814 v.AddArg(ptr) 5815 v.AddArg(mem) 5816 return true 5817 } 5818 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5819 // cond: canMergeSym(sym1,sym2) 5820 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5821 for { 5822 off1 := v.AuxInt 5823 sym1 := v.Aux 5824 _ = v.Args[1] 5825 v_0 := v.Args[0] 5826 if v_0.Op != OpARMMOVWaddr { 5827 break 5828 } 5829 off2 := v_0.AuxInt 5830 sym2 := v_0.Aux 5831 ptr := v_0.Args[0] 5832 mem := v.Args[1] 5833 if !(canMergeSym(sym1, sym2)) { 5834 break 5835 } 5836 v.reset(OpARMMOVBUload) 5837 v.AuxInt = off1 + off2 5838 v.Aux = mergeSym(sym1, sym2) 5839 v.AddArg(ptr) 5840 v.AddArg(mem) 5841 return true 5842 } 5843 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5844 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5845 // result: (MOVBUreg x) 5846 for { 5847 off := v.AuxInt 5848 sym := v.Aux 5849 _ = v.Args[1] 5850 ptr := v.Args[0] 5851 v_1 := v.Args[1] 5852 if v_1.Op != OpARMMOVBstore { 5853 break 5854 } 5855 off2 := v_1.AuxInt 5856 sym2 := v_1.Aux 5857 _ = v_1.Args[2] 5858 ptr2 := v_1.Args[0] 5859 x := v_1.Args[1] 5860 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5861 break 5862 } 5863 v.reset(OpARMMOVBUreg) 5864 v.AddArg(x) 5865 return true 5866 } 5867 // match: (MOVBUload [0] {sym} (ADD ptr idx) mem) 5868 // cond: sym == nil && !config.nacl 5869 // result: (MOVBUloadidx ptr idx mem) 5870 for { 5871 if v.AuxInt != 0 { 5872 break 5873 } 5874 sym := v.Aux 5875 _ = v.Args[1] 5876 v_0 := v.Args[0] 5877 if v_0.Op != OpARMADD { 5878 break 5879 } 5880 _ = v_0.Args[1] 5881 ptr := v_0.Args[0] 5882 idx := v_0.Args[1] 5883 mem := v.Args[1] 5884 if !(sym == nil && !config.nacl) { 5885 break 5886 } 5887 v.reset(OpARMMOVBUloadidx) 5888 v.AddArg(ptr) 5889 v.AddArg(idx) 5890 v.AddArg(mem) 5891 return true 5892 } 5893 return false 5894 } 5895 func rewriteValueARM_OpARMMOVBUloadidx_0(v *Value) bool { 5896 // match: (MOVBUloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 5897 // cond: isSamePtr(ptr, ptr2) 5898 // result: (MOVBUreg x) 5899 for { 5900 _ = v.Args[2] 5901 ptr := v.Args[0] 5902 idx := v.Args[1] 5903 v_2 := v.Args[2] 5904 if v_2.Op != OpARMMOVBstoreidx { 5905 break 5906 } 5907 _ = v_2.Args[3] 5908 ptr2 := v_2.Args[0] 5909 if idx != v_2.Args[1] { 5910 break 5911 } 5912 x := v_2.Args[2] 5913 if !(isSamePtr(ptr, ptr2)) { 5914 break 5915 } 5916 v.reset(OpARMMOVBUreg) 5917 v.AddArg(x) 5918 return true 5919 } 5920 // match: (MOVBUloadidx ptr (MOVWconst [c]) mem) 5921 // cond: 5922 // result: (MOVBUload [c] ptr mem) 5923 for { 5924 _ = v.Args[2] 5925 ptr := v.Args[0] 5926 v_1 := v.Args[1] 5927 if v_1.Op != OpARMMOVWconst { 5928 break 5929 } 5930 c := v_1.AuxInt 5931 mem := v.Args[2] 5932 v.reset(OpARMMOVBUload) 5933 v.AuxInt = c 5934 v.AddArg(ptr) 5935 v.AddArg(mem) 5936 return true 5937 } 5938 // match: (MOVBUloadidx (MOVWconst [c]) ptr mem) 5939 // cond: 5940 // result: (MOVBUload [c] ptr mem) 5941 for { 5942 _ = v.Args[2] 5943 v_0 := v.Args[0] 5944 if v_0.Op != OpARMMOVWconst { 5945 break 5946 } 5947 c := v_0.AuxInt 5948 ptr := v.Args[1] 5949 mem := v.Args[2] 5950 v.reset(OpARMMOVBUload) 5951 v.AuxInt = c 5952 v.AddArg(ptr) 5953 v.AddArg(mem) 5954 return true 5955 } 5956 return false 5957 } 5958 func rewriteValueARM_OpARMMOVBUreg_0(v *Value) bool { 5959 // match: (MOVBUreg x:(MOVBUload _ _)) 5960 // cond: 5961 // result: (MOVWreg x) 5962 for { 5963 x := v.Args[0] 5964 if x.Op != OpARMMOVBUload { 5965 break 5966 } 5967 _ = x.Args[1] 5968 v.reset(OpARMMOVWreg) 5969 v.AddArg(x) 5970 return true 5971 } 5972 // match: (MOVBUreg (ANDconst [c] x)) 5973 // cond: 5974 // result: (ANDconst [c&0xff] x) 5975 for { 5976 v_0 := v.Args[0] 5977 if v_0.Op != OpARMANDconst { 5978 break 5979 } 5980 c := v_0.AuxInt 5981 x := v_0.Args[0] 5982 v.reset(OpARMANDconst) 5983 v.AuxInt = c & 0xff 5984 v.AddArg(x) 5985 return true 5986 } 5987 // match: (MOVBUreg x:(MOVBUreg _)) 5988 // cond: 5989 // result: (MOVWreg x) 5990 for { 5991 x := v.Args[0] 5992 if x.Op != OpARMMOVBUreg { 5993 break 5994 } 5995 v.reset(OpARMMOVWreg) 5996 v.AddArg(x) 5997 return true 5998 } 5999 // match: (MOVBUreg (MOVWconst [c])) 6000 // cond: 6001 // result: (MOVWconst [int64(uint8(c))]) 6002 for { 6003 v_0 := v.Args[0] 6004 if v_0.Op != OpARMMOVWconst { 6005 break 6006 } 6007 c := v_0.AuxInt 6008 v.reset(OpARMMOVWconst) 6009 v.AuxInt = int64(uint8(c)) 6010 return true 6011 } 6012 return false 6013 } 6014 func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { 6015 b := v.Block 6016 _ = b 6017 config := b.Func.Config 6018 _ = config 6019 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 6020 // cond: 6021 // result: (MOVBload [off1+off2] {sym} ptr mem) 6022 for { 6023 off1 := v.AuxInt 6024 sym := v.Aux 6025 _ = v.Args[1] 6026 v_0 := v.Args[0] 6027 if v_0.Op != OpARMADDconst { 6028 break 6029 } 6030 off2 := v_0.AuxInt 6031 ptr := v_0.Args[0] 6032 mem := v.Args[1] 6033 v.reset(OpARMMOVBload) 6034 v.AuxInt = off1 + off2 6035 v.Aux = sym 6036 v.AddArg(ptr) 6037 v.AddArg(mem) 6038 return true 6039 } 6040 // match: (MOVBload [off1] {sym} (SUBconst [off2] ptr) mem) 6041 // cond: 6042 // result: (MOVBload [off1-off2] {sym} ptr mem) 6043 for { 6044 off1 := v.AuxInt 6045 sym := v.Aux 6046 _ = v.Args[1] 6047 v_0 := v.Args[0] 6048 if v_0.Op != OpARMSUBconst { 6049 break 6050 } 6051 off2 := v_0.AuxInt 6052 ptr := v_0.Args[0] 6053 mem := v.Args[1] 6054 v.reset(OpARMMOVBload) 6055 v.AuxInt = off1 - off2 6056 v.Aux = sym 6057 v.AddArg(ptr) 6058 v.AddArg(mem) 6059 return true 6060 } 6061 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6062 // cond: canMergeSym(sym1,sym2) 6063 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6064 for { 6065 off1 := v.AuxInt 6066 sym1 := v.Aux 6067 _ = v.Args[1] 6068 v_0 := v.Args[0] 6069 if v_0.Op != OpARMMOVWaddr { 6070 break 6071 } 6072 off2 := v_0.AuxInt 6073 sym2 := v_0.Aux 6074 ptr := v_0.Args[0] 6075 mem := v.Args[1] 6076 if !(canMergeSym(sym1, sym2)) { 6077 break 6078 } 6079 v.reset(OpARMMOVBload) 6080 v.AuxInt = off1 + off2 6081 v.Aux = mergeSym(sym1, sym2) 6082 v.AddArg(ptr) 6083 v.AddArg(mem) 6084 return true 6085 } 6086 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 6087 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6088 // result: (MOVBreg x) 6089 for { 6090 off := v.AuxInt 6091 sym := v.Aux 6092 _ = v.Args[1] 6093 ptr := v.Args[0] 6094 v_1 := v.Args[1] 6095 if v_1.Op != OpARMMOVBstore { 6096 break 6097 } 6098 off2 := v_1.AuxInt 6099 sym2 := v_1.Aux 6100 _ = v_1.Args[2] 6101 ptr2 := v_1.Args[0] 6102 x := v_1.Args[1] 6103 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6104 break 6105 } 6106 v.reset(OpARMMOVBreg) 6107 v.AddArg(x) 6108 return true 6109 } 6110 // match: (MOVBload [0] {sym} (ADD ptr idx) mem) 6111 // cond: sym == nil && !config.nacl 6112 // result: (MOVBloadidx ptr idx mem) 6113 for { 6114 if v.AuxInt != 0 { 6115 break 6116 } 6117 sym := v.Aux 6118 _ = v.Args[1] 6119 v_0 := v.Args[0] 6120 if v_0.Op != OpARMADD { 6121 break 6122 } 6123 _ = v_0.Args[1] 6124 ptr := v_0.Args[0] 6125 idx := v_0.Args[1] 6126 mem := v.Args[1] 6127 if !(sym == nil && !config.nacl) { 6128 break 6129 } 6130 v.reset(OpARMMOVBloadidx) 6131 v.AddArg(ptr) 6132 v.AddArg(idx) 6133 v.AddArg(mem) 6134 return true 6135 } 6136 return false 6137 } 6138 func rewriteValueARM_OpARMMOVBloadidx_0(v *Value) bool { 6139 // match: (MOVBloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 6140 // cond: isSamePtr(ptr, ptr2) 6141 // result: (MOVBreg x) 6142 for { 6143 _ = v.Args[2] 6144 ptr := v.Args[0] 6145 idx := v.Args[1] 6146 v_2 := v.Args[2] 6147 if v_2.Op != OpARMMOVBstoreidx { 6148 break 6149 } 6150 _ = v_2.Args[3] 6151 ptr2 := v_2.Args[0] 6152 if idx != v_2.Args[1] { 6153 break 6154 } 6155 x := v_2.Args[2] 6156 if !(isSamePtr(ptr, ptr2)) { 6157 break 6158 } 6159 v.reset(OpARMMOVBreg) 6160 v.AddArg(x) 6161 return true 6162 } 6163 // match: (MOVBloadidx ptr (MOVWconst [c]) mem) 6164 // cond: 6165 // result: (MOVBload [c] ptr mem) 6166 for { 6167 _ = v.Args[2] 6168 ptr := v.Args[0] 6169 v_1 := v.Args[1] 6170 if v_1.Op != OpARMMOVWconst { 6171 break 6172 } 6173 c := v_1.AuxInt 6174 mem := v.Args[2] 6175 v.reset(OpARMMOVBload) 6176 v.AuxInt = c 6177 v.AddArg(ptr) 6178 v.AddArg(mem) 6179 return true 6180 } 6181 // match: (MOVBloadidx (MOVWconst [c]) ptr mem) 6182 // cond: 6183 // result: (MOVBload [c] ptr mem) 6184 for { 6185 _ = v.Args[2] 6186 v_0 := v.Args[0] 6187 if v_0.Op != OpARMMOVWconst { 6188 break 6189 } 6190 c := v_0.AuxInt 6191 ptr := v.Args[1] 6192 mem := v.Args[2] 6193 v.reset(OpARMMOVBload) 6194 v.AuxInt = c 6195 v.AddArg(ptr) 6196 v.AddArg(mem) 6197 return true 6198 } 6199 return false 6200 } 6201 func rewriteValueARM_OpARMMOVBreg_0(v *Value) bool { 6202 // match: (MOVBreg x:(MOVBload _ _)) 6203 // cond: 6204 // result: (MOVWreg x) 6205 for { 6206 x := v.Args[0] 6207 if x.Op != OpARMMOVBload { 6208 break 6209 } 6210 _ = x.Args[1] 6211 v.reset(OpARMMOVWreg) 6212 v.AddArg(x) 6213 return true 6214 } 6215 // match: (MOVBreg (ANDconst [c] x)) 6216 // cond: c & 0x80 == 0 6217 // result: (ANDconst [c&0x7f] x) 6218 for { 6219 v_0 := v.Args[0] 6220 if v_0.Op != OpARMANDconst { 6221 break 6222 } 6223 c := v_0.AuxInt 6224 x := v_0.Args[0] 6225 if !(c&0x80 == 0) { 6226 break 6227 } 6228 v.reset(OpARMANDconst) 6229 v.AuxInt = c & 0x7f 6230 v.AddArg(x) 6231 return true 6232 } 6233 // match: (MOVBreg x:(MOVBreg _)) 6234 // cond: 6235 // result: (MOVWreg x) 6236 for { 6237 x := v.Args[0] 6238 if x.Op != OpARMMOVBreg { 6239 break 6240 } 6241 v.reset(OpARMMOVWreg) 6242 v.AddArg(x) 6243 return true 6244 } 6245 // match: (MOVBreg (MOVWconst [c])) 6246 // cond: 6247 // result: (MOVWconst [int64(int8(c))]) 6248 for { 6249 v_0 := v.Args[0] 6250 if v_0.Op != OpARMMOVWconst { 6251 break 6252 } 6253 c := v_0.AuxInt 6254 v.reset(OpARMMOVWconst) 6255 v.AuxInt = int64(int8(c)) 6256 return true 6257 } 6258 return false 6259 } 6260 func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { 6261 b := v.Block 6262 _ = b 6263 config := b.Func.Config 6264 _ = config 6265 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6266 // cond: 6267 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 6268 for { 6269 off1 := v.AuxInt 6270 sym := v.Aux 6271 _ = v.Args[2] 6272 v_0 := v.Args[0] 6273 if v_0.Op != OpARMADDconst { 6274 break 6275 } 6276 off2 := v_0.AuxInt 6277 ptr := v_0.Args[0] 6278 val := v.Args[1] 6279 mem := v.Args[2] 6280 v.reset(OpARMMOVBstore) 6281 v.AuxInt = off1 + off2 6282 v.Aux = sym 6283 v.AddArg(ptr) 6284 v.AddArg(val) 6285 v.AddArg(mem) 6286 return true 6287 } 6288 // match: (MOVBstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6289 // cond: 6290 // result: (MOVBstore [off1-off2] {sym} ptr val mem) 6291 for { 6292 off1 := v.AuxInt 6293 sym := v.Aux 6294 _ = v.Args[2] 6295 v_0 := v.Args[0] 6296 if v_0.Op != OpARMSUBconst { 6297 break 6298 } 6299 off2 := v_0.AuxInt 6300 ptr := v_0.Args[0] 6301 val := v.Args[1] 6302 mem := v.Args[2] 6303 v.reset(OpARMMOVBstore) 6304 v.AuxInt = off1 - off2 6305 v.Aux = sym 6306 v.AddArg(ptr) 6307 v.AddArg(val) 6308 v.AddArg(mem) 6309 return true 6310 } 6311 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6312 // cond: canMergeSym(sym1,sym2) 6313 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6314 for { 6315 off1 := v.AuxInt 6316 sym1 := v.Aux 6317 _ = v.Args[2] 6318 v_0 := v.Args[0] 6319 if v_0.Op != OpARMMOVWaddr { 6320 break 6321 } 6322 off2 := v_0.AuxInt 6323 sym2 := v_0.Aux 6324 ptr := v_0.Args[0] 6325 val := v.Args[1] 6326 mem := v.Args[2] 6327 if !(canMergeSym(sym1, sym2)) { 6328 break 6329 } 6330 v.reset(OpARMMOVBstore) 6331 v.AuxInt = off1 + off2 6332 v.Aux = mergeSym(sym1, sym2) 6333 v.AddArg(ptr) 6334 v.AddArg(val) 6335 v.AddArg(mem) 6336 return true 6337 } 6338 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 6339 // cond: 6340 // result: (MOVBstore [off] {sym} ptr x mem) 6341 for { 6342 off := v.AuxInt 6343 sym := v.Aux 6344 _ = v.Args[2] 6345 ptr := v.Args[0] 6346 v_1 := v.Args[1] 6347 if v_1.Op != OpARMMOVBreg { 6348 break 6349 } 6350 x := v_1.Args[0] 6351 mem := v.Args[2] 6352 v.reset(OpARMMOVBstore) 6353 v.AuxInt = off 6354 v.Aux = sym 6355 v.AddArg(ptr) 6356 v.AddArg(x) 6357 v.AddArg(mem) 6358 return true 6359 } 6360 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 6361 // cond: 6362 // result: (MOVBstore [off] {sym} ptr x mem) 6363 for { 6364 off := v.AuxInt 6365 sym := v.Aux 6366 _ = v.Args[2] 6367 ptr := v.Args[0] 6368 v_1 := v.Args[1] 6369 if v_1.Op != OpARMMOVBUreg { 6370 break 6371 } 6372 x := v_1.Args[0] 6373 mem := v.Args[2] 6374 v.reset(OpARMMOVBstore) 6375 v.AuxInt = off 6376 v.Aux = sym 6377 v.AddArg(ptr) 6378 v.AddArg(x) 6379 v.AddArg(mem) 6380 return true 6381 } 6382 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 6383 // cond: 6384 // result: (MOVBstore [off] {sym} ptr x mem) 6385 for { 6386 off := v.AuxInt 6387 sym := v.Aux 6388 _ = v.Args[2] 6389 ptr := v.Args[0] 6390 v_1 := v.Args[1] 6391 if v_1.Op != OpARMMOVHreg { 6392 break 6393 } 6394 x := v_1.Args[0] 6395 mem := v.Args[2] 6396 v.reset(OpARMMOVBstore) 6397 v.AuxInt = off 6398 v.Aux = sym 6399 v.AddArg(ptr) 6400 v.AddArg(x) 6401 v.AddArg(mem) 6402 return true 6403 } 6404 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 6405 // cond: 6406 // result: (MOVBstore [off] {sym} ptr x mem) 6407 for { 6408 off := v.AuxInt 6409 sym := v.Aux 6410 _ = v.Args[2] 6411 ptr := v.Args[0] 6412 v_1 := v.Args[1] 6413 if v_1.Op != OpARMMOVHUreg { 6414 break 6415 } 6416 x := v_1.Args[0] 6417 mem := v.Args[2] 6418 v.reset(OpARMMOVBstore) 6419 v.AuxInt = off 6420 v.Aux = sym 6421 v.AddArg(ptr) 6422 v.AddArg(x) 6423 v.AddArg(mem) 6424 return true 6425 } 6426 // match: (MOVBstore [0] {sym} (ADD ptr idx) val mem) 6427 // cond: sym == nil && !config.nacl 6428 // result: (MOVBstoreidx ptr idx val mem) 6429 for { 6430 if v.AuxInt != 0 { 6431 break 6432 } 6433 sym := v.Aux 6434 _ = v.Args[2] 6435 v_0 := v.Args[0] 6436 if v_0.Op != OpARMADD { 6437 break 6438 } 6439 _ = v_0.Args[1] 6440 ptr := v_0.Args[0] 6441 idx := v_0.Args[1] 6442 val := v.Args[1] 6443 mem := v.Args[2] 6444 if !(sym == nil && !config.nacl) { 6445 break 6446 } 6447 v.reset(OpARMMOVBstoreidx) 6448 v.AddArg(ptr) 6449 v.AddArg(idx) 6450 v.AddArg(val) 6451 v.AddArg(mem) 6452 return true 6453 } 6454 return false 6455 } 6456 func rewriteValueARM_OpARMMOVBstoreidx_0(v *Value) bool { 6457 // match: (MOVBstoreidx ptr (MOVWconst [c]) val mem) 6458 // cond: 6459 // result: (MOVBstore [c] ptr val mem) 6460 for { 6461 _ = v.Args[3] 6462 ptr := v.Args[0] 6463 v_1 := v.Args[1] 6464 if v_1.Op != OpARMMOVWconst { 6465 break 6466 } 6467 c := v_1.AuxInt 6468 val := v.Args[2] 6469 mem := v.Args[3] 6470 v.reset(OpARMMOVBstore) 6471 v.AuxInt = c 6472 v.AddArg(ptr) 6473 v.AddArg(val) 6474 v.AddArg(mem) 6475 return true 6476 } 6477 // match: (MOVBstoreidx (MOVWconst [c]) ptr val mem) 6478 // cond: 6479 // result: (MOVBstore [c] ptr val mem) 6480 for { 6481 _ = v.Args[3] 6482 v_0 := v.Args[0] 6483 if v_0.Op != OpARMMOVWconst { 6484 break 6485 } 6486 c := v_0.AuxInt 6487 ptr := v.Args[1] 6488 val := v.Args[2] 6489 mem := v.Args[3] 6490 v.reset(OpARMMOVBstore) 6491 v.AuxInt = c 6492 v.AddArg(ptr) 6493 v.AddArg(val) 6494 v.AddArg(mem) 6495 return true 6496 } 6497 return false 6498 } 6499 func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { 6500 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 6501 // cond: 6502 // result: (MOVDload [off1+off2] {sym} ptr mem) 6503 for { 6504 off1 := v.AuxInt 6505 sym := v.Aux 6506 _ = v.Args[1] 6507 v_0 := v.Args[0] 6508 if v_0.Op != OpARMADDconst { 6509 break 6510 } 6511 off2 := v_0.AuxInt 6512 ptr := v_0.Args[0] 6513 mem := v.Args[1] 6514 v.reset(OpARMMOVDload) 6515 v.AuxInt = off1 + off2 6516 v.Aux = sym 6517 v.AddArg(ptr) 6518 v.AddArg(mem) 6519 return true 6520 } 6521 // match: (MOVDload [off1] {sym} (SUBconst [off2] ptr) mem) 6522 // cond: 6523 // result: (MOVDload [off1-off2] {sym} ptr mem) 6524 for { 6525 off1 := v.AuxInt 6526 sym := v.Aux 6527 _ = v.Args[1] 6528 v_0 := v.Args[0] 6529 if v_0.Op != OpARMSUBconst { 6530 break 6531 } 6532 off2 := v_0.AuxInt 6533 ptr := v_0.Args[0] 6534 mem := v.Args[1] 6535 v.reset(OpARMMOVDload) 6536 v.AuxInt = off1 - off2 6537 v.Aux = sym 6538 v.AddArg(ptr) 6539 v.AddArg(mem) 6540 return true 6541 } 6542 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6543 // cond: canMergeSym(sym1,sym2) 6544 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6545 for { 6546 off1 := v.AuxInt 6547 sym1 := v.Aux 6548 _ = v.Args[1] 6549 v_0 := v.Args[0] 6550 if v_0.Op != OpARMMOVWaddr { 6551 break 6552 } 6553 off2 := v_0.AuxInt 6554 sym2 := v_0.Aux 6555 ptr := v_0.Args[0] 6556 mem := v.Args[1] 6557 if !(canMergeSym(sym1, sym2)) { 6558 break 6559 } 6560 v.reset(OpARMMOVDload) 6561 v.AuxInt = off1 + off2 6562 v.Aux = mergeSym(sym1, sym2) 6563 v.AddArg(ptr) 6564 v.AddArg(mem) 6565 return true 6566 } 6567 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 6568 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6569 // result: x 6570 for { 6571 off := v.AuxInt 6572 sym := v.Aux 6573 _ = v.Args[1] 6574 ptr := v.Args[0] 6575 v_1 := v.Args[1] 6576 if v_1.Op != OpARMMOVDstore { 6577 break 6578 } 6579 off2 := v_1.AuxInt 6580 sym2 := v_1.Aux 6581 _ = v_1.Args[2] 6582 ptr2 := v_1.Args[0] 6583 x := v_1.Args[1] 6584 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6585 break 6586 } 6587 v.reset(OpCopy) 6588 v.Type = x.Type 6589 v.AddArg(x) 6590 return true 6591 } 6592 return false 6593 } 6594 func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { 6595 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6596 // cond: 6597 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 6598 for { 6599 off1 := v.AuxInt 6600 sym := v.Aux 6601 _ = v.Args[2] 6602 v_0 := v.Args[0] 6603 if v_0.Op != OpARMADDconst { 6604 break 6605 } 6606 off2 := v_0.AuxInt 6607 ptr := v_0.Args[0] 6608 val := v.Args[1] 6609 mem := v.Args[2] 6610 v.reset(OpARMMOVDstore) 6611 v.AuxInt = off1 + off2 6612 v.Aux = sym 6613 v.AddArg(ptr) 6614 v.AddArg(val) 6615 v.AddArg(mem) 6616 return true 6617 } 6618 // match: (MOVDstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6619 // cond: 6620 // result: (MOVDstore [off1-off2] {sym} ptr val mem) 6621 for { 6622 off1 := v.AuxInt 6623 sym := v.Aux 6624 _ = v.Args[2] 6625 v_0 := v.Args[0] 6626 if v_0.Op != OpARMSUBconst { 6627 break 6628 } 6629 off2 := v_0.AuxInt 6630 ptr := v_0.Args[0] 6631 val := v.Args[1] 6632 mem := v.Args[2] 6633 v.reset(OpARMMOVDstore) 6634 v.AuxInt = off1 - off2 6635 v.Aux = sym 6636 v.AddArg(ptr) 6637 v.AddArg(val) 6638 v.AddArg(mem) 6639 return true 6640 } 6641 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6642 // cond: canMergeSym(sym1,sym2) 6643 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6644 for { 6645 off1 := v.AuxInt 6646 sym1 := v.Aux 6647 _ = v.Args[2] 6648 v_0 := v.Args[0] 6649 if v_0.Op != OpARMMOVWaddr { 6650 break 6651 } 6652 off2 := v_0.AuxInt 6653 sym2 := v_0.Aux 6654 ptr := v_0.Args[0] 6655 val := v.Args[1] 6656 mem := v.Args[2] 6657 if !(canMergeSym(sym1, sym2)) { 6658 break 6659 } 6660 v.reset(OpARMMOVDstore) 6661 v.AuxInt = off1 + off2 6662 v.Aux = mergeSym(sym1, sym2) 6663 v.AddArg(ptr) 6664 v.AddArg(val) 6665 v.AddArg(mem) 6666 return true 6667 } 6668 return false 6669 } 6670 func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { 6671 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 6672 // cond: 6673 // result: (MOVFload [off1+off2] {sym} ptr mem) 6674 for { 6675 off1 := v.AuxInt 6676 sym := v.Aux 6677 _ = v.Args[1] 6678 v_0 := v.Args[0] 6679 if v_0.Op != OpARMADDconst { 6680 break 6681 } 6682 off2 := v_0.AuxInt 6683 ptr := v_0.Args[0] 6684 mem := v.Args[1] 6685 v.reset(OpARMMOVFload) 6686 v.AuxInt = off1 + off2 6687 v.Aux = sym 6688 v.AddArg(ptr) 6689 v.AddArg(mem) 6690 return true 6691 } 6692 // match: (MOVFload [off1] {sym} (SUBconst [off2] ptr) mem) 6693 // cond: 6694 // result: (MOVFload [off1-off2] {sym} ptr mem) 6695 for { 6696 off1 := v.AuxInt 6697 sym := v.Aux 6698 _ = v.Args[1] 6699 v_0 := v.Args[0] 6700 if v_0.Op != OpARMSUBconst { 6701 break 6702 } 6703 off2 := v_0.AuxInt 6704 ptr := v_0.Args[0] 6705 mem := v.Args[1] 6706 v.reset(OpARMMOVFload) 6707 v.AuxInt = off1 - off2 6708 v.Aux = sym 6709 v.AddArg(ptr) 6710 v.AddArg(mem) 6711 return true 6712 } 6713 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6714 // cond: canMergeSym(sym1,sym2) 6715 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6716 for { 6717 off1 := v.AuxInt 6718 sym1 := v.Aux 6719 _ = v.Args[1] 6720 v_0 := v.Args[0] 6721 if v_0.Op != OpARMMOVWaddr { 6722 break 6723 } 6724 off2 := v_0.AuxInt 6725 sym2 := v_0.Aux 6726 ptr := v_0.Args[0] 6727 mem := v.Args[1] 6728 if !(canMergeSym(sym1, sym2)) { 6729 break 6730 } 6731 v.reset(OpARMMOVFload) 6732 v.AuxInt = off1 + off2 6733 v.Aux = mergeSym(sym1, sym2) 6734 v.AddArg(ptr) 6735 v.AddArg(mem) 6736 return true 6737 } 6738 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 6739 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6740 // result: x 6741 for { 6742 off := v.AuxInt 6743 sym := v.Aux 6744 _ = v.Args[1] 6745 ptr := v.Args[0] 6746 v_1 := v.Args[1] 6747 if v_1.Op != OpARMMOVFstore { 6748 break 6749 } 6750 off2 := v_1.AuxInt 6751 sym2 := v_1.Aux 6752 _ = v_1.Args[2] 6753 ptr2 := v_1.Args[0] 6754 x := v_1.Args[1] 6755 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6756 break 6757 } 6758 v.reset(OpCopy) 6759 v.Type = x.Type 6760 v.AddArg(x) 6761 return true 6762 } 6763 return false 6764 } 6765 func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { 6766 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6767 // cond: 6768 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 6769 for { 6770 off1 := v.AuxInt 6771 sym := v.Aux 6772 _ = v.Args[2] 6773 v_0 := v.Args[0] 6774 if v_0.Op != OpARMADDconst { 6775 break 6776 } 6777 off2 := v_0.AuxInt 6778 ptr := v_0.Args[0] 6779 val := v.Args[1] 6780 mem := v.Args[2] 6781 v.reset(OpARMMOVFstore) 6782 v.AuxInt = off1 + off2 6783 v.Aux = sym 6784 v.AddArg(ptr) 6785 v.AddArg(val) 6786 v.AddArg(mem) 6787 return true 6788 } 6789 // match: (MOVFstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6790 // cond: 6791 // result: (MOVFstore [off1-off2] {sym} ptr val mem) 6792 for { 6793 off1 := v.AuxInt 6794 sym := v.Aux 6795 _ = v.Args[2] 6796 v_0 := v.Args[0] 6797 if v_0.Op != OpARMSUBconst { 6798 break 6799 } 6800 off2 := v_0.AuxInt 6801 ptr := v_0.Args[0] 6802 val := v.Args[1] 6803 mem := v.Args[2] 6804 v.reset(OpARMMOVFstore) 6805 v.AuxInt = off1 - off2 6806 v.Aux = sym 6807 v.AddArg(ptr) 6808 v.AddArg(val) 6809 v.AddArg(mem) 6810 return true 6811 } 6812 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6813 // cond: canMergeSym(sym1,sym2) 6814 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6815 for { 6816 off1 := v.AuxInt 6817 sym1 := v.Aux 6818 _ = v.Args[2] 6819 v_0 := v.Args[0] 6820 if v_0.Op != OpARMMOVWaddr { 6821 break 6822 } 6823 off2 := v_0.AuxInt 6824 sym2 := v_0.Aux 6825 ptr := v_0.Args[0] 6826 val := v.Args[1] 6827 mem := v.Args[2] 6828 if !(canMergeSym(sym1, sym2)) { 6829 break 6830 } 6831 v.reset(OpARMMOVFstore) 6832 v.AuxInt = off1 + off2 6833 v.Aux = mergeSym(sym1, sym2) 6834 v.AddArg(ptr) 6835 v.AddArg(val) 6836 v.AddArg(mem) 6837 return true 6838 } 6839 return false 6840 } 6841 func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { 6842 b := v.Block 6843 _ = b 6844 config := b.Func.Config 6845 _ = config 6846 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 6847 // cond: 6848 // result: (MOVHUload [off1+off2] {sym} ptr mem) 6849 for { 6850 off1 := v.AuxInt 6851 sym := v.Aux 6852 _ = v.Args[1] 6853 v_0 := v.Args[0] 6854 if v_0.Op != OpARMADDconst { 6855 break 6856 } 6857 off2 := v_0.AuxInt 6858 ptr := v_0.Args[0] 6859 mem := v.Args[1] 6860 v.reset(OpARMMOVHUload) 6861 v.AuxInt = off1 + off2 6862 v.Aux = sym 6863 v.AddArg(ptr) 6864 v.AddArg(mem) 6865 return true 6866 } 6867 // match: (MOVHUload [off1] {sym} (SUBconst [off2] ptr) mem) 6868 // cond: 6869 // result: (MOVHUload [off1-off2] {sym} ptr mem) 6870 for { 6871 off1 := v.AuxInt 6872 sym := v.Aux 6873 _ = v.Args[1] 6874 v_0 := v.Args[0] 6875 if v_0.Op != OpARMSUBconst { 6876 break 6877 } 6878 off2 := v_0.AuxInt 6879 ptr := v_0.Args[0] 6880 mem := v.Args[1] 6881 v.reset(OpARMMOVHUload) 6882 v.AuxInt = off1 - off2 6883 v.Aux = sym 6884 v.AddArg(ptr) 6885 v.AddArg(mem) 6886 return true 6887 } 6888 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6889 // cond: canMergeSym(sym1,sym2) 6890 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6891 for { 6892 off1 := v.AuxInt 6893 sym1 := v.Aux 6894 _ = v.Args[1] 6895 v_0 := v.Args[0] 6896 if v_0.Op != OpARMMOVWaddr { 6897 break 6898 } 6899 off2 := v_0.AuxInt 6900 sym2 := v_0.Aux 6901 ptr := v_0.Args[0] 6902 mem := v.Args[1] 6903 if !(canMergeSym(sym1, sym2)) { 6904 break 6905 } 6906 v.reset(OpARMMOVHUload) 6907 v.AuxInt = off1 + off2 6908 v.Aux = mergeSym(sym1, sym2) 6909 v.AddArg(ptr) 6910 v.AddArg(mem) 6911 return true 6912 } 6913 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 6914 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6915 // result: (MOVHUreg x) 6916 for { 6917 off := v.AuxInt 6918 sym := v.Aux 6919 _ = v.Args[1] 6920 ptr := v.Args[0] 6921 v_1 := v.Args[1] 6922 if v_1.Op != OpARMMOVHstore { 6923 break 6924 } 6925 off2 := v_1.AuxInt 6926 sym2 := v_1.Aux 6927 _ = v_1.Args[2] 6928 ptr2 := v_1.Args[0] 6929 x := v_1.Args[1] 6930 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6931 break 6932 } 6933 v.reset(OpARMMOVHUreg) 6934 v.AddArg(x) 6935 return true 6936 } 6937 // match: (MOVHUload [0] {sym} (ADD ptr idx) mem) 6938 // cond: sym == nil && !config.nacl 6939 // result: (MOVHUloadidx ptr idx mem) 6940 for { 6941 if v.AuxInt != 0 { 6942 break 6943 } 6944 sym := v.Aux 6945 _ = v.Args[1] 6946 v_0 := v.Args[0] 6947 if v_0.Op != OpARMADD { 6948 break 6949 } 6950 _ = v_0.Args[1] 6951 ptr := v_0.Args[0] 6952 idx := v_0.Args[1] 6953 mem := v.Args[1] 6954 if !(sym == nil && !config.nacl) { 6955 break 6956 } 6957 v.reset(OpARMMOVHUloadidx) 6958 v.AddArg(ptr) 6959 v.AddArg(idx) 6960 v.AddArg(mem) 6961 return true 6962 } 6963 return false 6964 } 6965 func rewriteValueARM_OpARMMOVHUloadidx_0(v *Value) bool { 6966 // match: (MOVHUloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 6967 // cond: isSamePtr(ptr, ptr2) 6968 // result: (MOVHUreg x) 6969 for { 6970 _ = v.Args[2] 6971 ptr := v.Args[0] 6972 idx := v.Args[1] 6973 v_2 := v.Args[2] 6974 if v_2.Op != OpARMMOVHstoreidx { 6975 break 6976 } 6977 _ = v_2.Args[3] 6978 ptr2 := v_2.Args[0] 6979 if idx != v_2.Args[1] { 6980 break 6981 } 6982 x := v_2.Args[2] 6983 if !(isSamePtr(ptr, ptr2)) { 6984 break 6985 } 6986 v.reset(OpARMMOVHUreg) 6987 v.AddArg(x) 6988 return true 6989 } 6990 // match: (MOVHUloadidx ptr (MOVWconst [c]) mem) 6991 // cond: 6992 // result: (MOVHUload [c] ptr mem) 6993 for { 6994 _ = v.Args[2] 6995 ptr := v.Args[0] 6996 v_1 := v.Args[1] 6997 if v_1.Op != OpARMMOVWconst { 6998 break 6999 } 7000 c := v_1.AuxInt 7001 mem := v.Args[2] 7002 v.reset(OpARMMOVHUload) 7003 v.AuxInt = c 7004 v.AddArg(ptr) 7005 v.AddArg(mem) 7006 return true 7007 } 7008 // match: (MOVHUloadidx (MOVWconst [c]) ptr mem) 7009 // cond: 7010 // result: (MOVHUload [c] ptr mem) 7011 for { 7012 _ = v.Args[2] 7013 v_0 := v.Args[0] 7014 if v_0.Op != OpARMMOVWconst { 7015 break 7016 } 7017 c := v_0.AuxInt 7018 ptr := v.Args[1] 7019 mem := v.Args[2] 7020 v.reset(OpARMMOVHUload) 7021 v.AuxInt = c 7022 v.AddArg(ptr) 7023 v.AddArg(mem) 7024 return true 7025 } 7026 return false 7027 } 7028 func rewriteValueARM_OpARMMOVHUreg_0(v *Value) bool { 7029 // match: (MOVHUreg x:(MOVBUload _ _)) 7030 // cond: 7031 // result: (MOVWreg x) 7032 for { 7033 x := v.Args[0] 7034 if x.Op != OpARMMOVBUload { 7035 break 7036 } 7037 _ = x.Args[1] 7038 v.reset(OpARMMOVWreg) 7039 v.AddArg(x) 7040 return true 7041 } 7042 // match: (MOVHUreg x:(MOVHUload _ _)) 7043 // cond: 7044 // result: (MOVWreg x) 7045 for { 7046 x := v.Args[0] 7047 if x.Op != OpARMMOVHUload { 7048 break 7049 } 7050 _ = x.Args[1] 7051 v.reset(OpARMMOVWreg) 7052 v.AddArg(x) 7053 return true 7054 } 7055 // match: (MOVHUreg (ANDconst [c] x)) 7056 // cond: 7057 // result: (ANDconst [c&0xffff] x) 7058 for { 7059 v_0 := v.Args[0] 7060 if v_0.Op != OpARMANDconst { 7061 break 7062 } 7063 c := v_0.AuxInt 7064 x := v_0.Args[0] 7065 v.reset(OpARMANDconst) 7066 v.AuxInt = c & 0xffff 7067 v.AddArg(x) 7068 return true 7069 } 7070 // match: (MOVHUreg x:(MOVBUreg _)) 7071 // cond: 7072 // result: (MOVWreg x) 7073 for { 7074 x := v.Args[0] 7075 if x.Op != OpARMMOVBUreg { 7076 break 7077 } 7078 v.reset(OpARMMOVWreg) 7079 v.AddArg(x) 7080 return true 7081 } 7082 // match: (MOVHUreg x:(MOVHUreg _)) 7083 // cond: 7084 // result: (MOVWreg x) 7085 for { 7086 x := v.Args[0] 7087 if x.Op != OpARMMOVHUreg { 7088 break 7089 } 7090 v.reset(OpARMMOVWreg) 7091 v.AddArg(x) 7092 return true 7093 } 7094 // match: (MOVHUreg (MOVWconst [c])) 7095 // cond: 7096 // result: (MOVWconst [int64(uint16(c))]) 7097 for { 7098 v_0 := v.Args[0] 7099 if v_0.Op != OpARMMOVWconst { 7100 break 7101 } 7102 c := v_0.AuxInt 7103 v.reset(OpARMMOVWconst) 7104 v.AuxInt = int64(uint16(c)) 7105 return true 7106 } 7107 return false 7108 } 7109 func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { 7110 b := v.Block 7111 _ = b 7112 config := b.Func.Config 7113 _ = config 7114 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 7115 // cond: 7116 // result: (MOVHload [off1+off2] {sym} ptr mem) 7117 for { 7118 off1 := v.AuxInt 7119 sym := v.Aux 7120 _ = v.Args[1] 7121 v_0 := v.Args[0] 7122 if v_0.Op != OpARMADDconst { 7123 break 7124 } 7125 off2 := v_0.AuxInt 7126 ptr := v_0.Args[0] 7127 mem := v.Args[1] 7128 v.reset(OpARMMOVHload) 7129 v.AuxInt = off1 + off2 7130 v.Aux = sym 7131 v.AddArg(ptr) 7132 v.AddArg(mem) 7133 return true 7134 } 7135 // match: (MOVHload [off1] {sym} (SUBconst [off2] ptr) mem) 7136 // cond: 7137 // result: (MOVHload [off1-off2] {sym} ptr mem) 7138 for { 7139 off1 := v.AuxInt 7140 sym := v.Aux 7141 _ = v.Args[1] 7142 v_0 := v.Args[0] 7143 if v_0.Op != OpARMSUBconst { 7144 break 7145 } 7146 off2 := v_0.AuxInt 7147 ptr := v_0.Args[0] 7148 mem := v.Args[1] 7149 v.reset(OpARMMOVHload) 7150 v.AuxInt = off1 - off2 7151 v.Aux = sym 7152 v.AddArg(ptr) 7153 v.AddArg(mem) 7154 return true 7155 } 7156 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7157 // cond: canMergeSym(sym1,sym2) 7158 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7159 for { 7160 off1 := v.AuxInt 7161 sym1 := v.Aux 7162 _ = v.Args[1] 7163 v_0 := v.Args[0] 7164 if v_0.Op != OpARMMOVWaddr { 7165 break 7166 } 7167 off2 := v_0.AuxInt 7168 sym2 := v_0.Aux 7169 ptr := v_0.Args[0] 7170 mem := v.Args[1] 7171 if !(canMergeSym(sym1, sym2)) { 7172 break 7173 } 7174 v.reset(OpARMMOVHload) 7175 v.AuxInt = off1 + off2 7176 v.Aux = mergeSym(sym1, sym2) 7177 v.AddArg(ptr) 7178 v.AddArg(mem) 7179 return true 7180 } 7181 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 7182 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7183 // result: (MOVHreg x) 7184 for { 7185 off := v.AuxInt 7186 sym := v.Aux 7187 _ = v.Args[1] 7188 ptr := v.Args[0] 7189 v_1 := v.Args[1] 7190 if v_1.Op != OpARMMOVHstore { 7191 break 7192 } 7193 off2 := v_1.AuxInt 7194 sym2 := v_1.Aux 7195 _ = v_1.Args[2] 7196 ptr2 := v_1.Args[0] 7197 x := v_1.Args[1] 7198 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7199 break 7200 } 7201 v.reset(OpARMMOVHreg) 7202 v.AddArg(x) 7203 return true 7204 } 7205 // match: (MOVHload [0] {sym} (ADD ptr idx) mem) 7206 // cond: sym == nil && !config.nacl 7207 // result: (MOVHloadidx ptr idx mem) 7208 for { 7209 if v.AuxInt != 0 { 7210 break 7211 } 7212 sym := v.Aux 7213 _ = v.Args[1] 7214 v_0 := v.Args[0] 7215 if v_0.Op != OpARMADD { 7216 break 7217 } 7218 _ = v_0.Args[1] 7219 ptr := v_0.Args[0] 7220 idx := v_0.Args[1] 7221 mem := v.Args[1] 7222 if !(sym == nil && !config.nacl) { 7223 break 7224 } 7225 v.reset(OpARMMOVHloadidx) 7226 v.AddArg(ptr) 7227 v.AddArg(idx) 7228 v.AddArg(mem) 7229 return true 7230 } 7231 return false 7232 } 7233 func rewriteValueARM_OpARMMOVHloadidx_0(v *Value) bool { 7234 // match: (MOVHloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 7235 // cond: isSamePtr(ptr, ptr2) 7236 // result: (MOVHreg x) 7237 for { 7238 _ = v.Args[2] 7239 ptr := v.Args[0] 7240 idx := v.Args[1] 7241 v_2 := v.Args[2] 7242 if v_2.Op != OpARMMOVHstoreidx { 7243 break 7244 } 7245 _ = v_2.Args[3] 7246 ptr2 := v_2.Args[0] 7247 if idx != v_2.Args[1] { 7248 break 7249 } 7250 x := v_2.Args[2] 7251 if !(isSamePtr(ptr, ptr2)) { 7252 break 7253 } 7254 v.reset(OpARMMOVHreg) 7255 v.AddArg(x) 7256 return true 7257 } 7258 // match: (MOVHloadidx ptr (MOVWconst [c]) mem) 7259 // cond: 7260 // result: (MOVHload [c] ptr mem) 7261 for { 7262 _ = v.Args[2] 7263 ptr := v.Args[0] 7264 v_1 := v.Args[1] 7265 if v_1.Op != OpARMMOVWconst { 7266 break 7267 } 7268 c := v_1.AuxInt 7269 mem := v.Args[2] 7270 v.reset(OpARMMOVHload) 7271 v.AuxInt = c 7272 v.AddArg(ptr) 7273 v.AddArg(mem) 7274 return true 7275 } 7276 // match: (MOVHloadidx (MOVWconst [c]) ptr mem) 7277 // cond: 7278 // result: (MOVHload [c] ptr mem) 7279 for { 7280 _ = v.Args[2] 7281 v_0 := v.Args[0] 7282 if v_0.Op != OpARMMOVWconst { 7283 break 7284 } 7285 c := v_0.AuxInt 7286 ptr := v.Args[1] 7287 mem := v.Args[2] 7288 v.reset(OpARMMOVHload) 7289 v.AuxInt = c 7290 v.AddArg(ptr) 7291 v.AddArg(mem) 7292 return true 7293 } 7294 return false 7295 } 7296 func rewriteValueARM_OpARMMOVHreg_0(v *Value) bool { 7297 // match: (MOVHreg x:(MOVBload _ _)) 7298 // cond: 7299 // result: (MOVWreg x) 7300 for { 7301 x := v.Args[0] 7302 if x.Op != OpARMMOVBload { 7303 break 7304 } 7305 _ = x.Args[1] 7306 v.reset(OpARMMOVWreg) 7307 v.AddArg(x) 7308 return true 7309 } 7310 // match: (MOVHreg x:(MOVBUload _ _)) 7311 // cond: 7312 // result: (MOVWreg x) 7313 for { 7314 x := v.Args[0] 7315 if x.Op != OpARMMOVBUload { 7316 break 7317 } 7318 _ = x.Args[1] 7319 v.reset(OpARMMOVWreg) 7320 v.AddArg(x) 7321 return true 7322 } 7323 // match: (MOVHreg x:(MOVHload _ _)) 7324 // cond: 7325 // result: (MOVWreg x) 7326 for { 7327 x := v.Args[0] 7328 if x.Op != OpARMMOVHload { 7329 break 7330 } 7331 _ = x.Args[1] 7332 v.reset(OpARMMOVWreg) 7333 v.AddArg(x) 7334 return true 7335 } 7336 // match: (MOVHreg (ANDconst [c] x)) 7337 // cond: c & 0x8000 == 0 7338 // result: (ANDconst [c&0x7fff] x) 7339 for { 7340 v_0 := v.Args[0] 7341 if v_0.Op != OpARMANDconst { 7342 break 7343 } 7344 c := v_0.AuxInt 7345 x := v_0.Args[0] 7346 if !(c&0x8000 == 0) { 7347 break 7348 } 7349 v.reset(OpARMANDconst) 7350 v.AuxInt = c & 0x7fff 7351 v.AddArg(x) 7352 return true 7353 } 7354 // match: (MOVHreg x:(MOVBreg _)) 7355 // cond: 7356 // result: (MOVWreg x) 7357 for { 7358 x := v.Args[0] 7359 if x.Op != OpARMMOVBreg { 7360 break 7361 } 7362 v.reset(OpARMMOVWreg) 7363 v.AddArg(x) 7364 return true 7365 } 7366 // match: (MOVHreg x:(MOVBUreg _)) 7367 // cond: 7368 // result: (MOVWreg x) 7369 for { 7370 x := v.Args[0] 7371 if x.Op != OpARMMOVBUreg { 7372 break 7373 } 7374 v.reset(OpARMMOVWreg) 7375 v.AddArg(x) 7376 return true 7377 } 7378 // match: (MOVHreg x:(MOVHreg _)) 7379 // cond: 7380 // result: (MOVWreg x) 7381 for { 7382 x := v.Args[0] 7383 if x.Op != OpARMMOVHreg { 7384 break 7385 } 7386 v.reset(OpARMMOVWreg) 7387 v.AddArg(x) 7388 return true 7389 } 7390 // match: (MOVHreg (MOVWconst [c])) 7391 // cond: 7392 // result: (MOVWconst [int64(int16(c))]) 7393 for { 7394 v_0 := v.Args[0] 7395 if v_0.Op != OpARMMOVWconst { 7396 break 7397 } 7398 c := v_0.AuxInt 7399 v.reset(OpARMMOVWconst) 7400 v.AuxInt = int64(int16(c)) 7401 return true 7402 } 7403 return false 7404 } 7405 func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { 7406 b := v.Block 7407 _ = b 7408 config := b.Func.Config 7409 _ = config 7410 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7411 // cond: 7412 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 7413 for { 7414 off1 := v.AuxInt 7415 sym := v.Aux 7416 _ = v.Args[2] 7417 v_0 := v.Args[0] 7418 if v_0.Op != OpARMADDconst { 7419 break 7420 } 7421 off2 := v_0.AuxInt 7422 ptr := v_0.Args[0] 7423 val := v.Args[1] 7424 mem := v.Args[2] 7425 v.reset(OpARMMOVHstore) 7426 v.AuxInt = off1 + off2 7427 v.Aux = sym 7428 v.AddArg(ptr) 7429 v.AddArg(val) 7430 v.AddArg(mem) 7431 return true 7432 } 7433 // match: (MOVHstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7434 // cond: 7435 // result: (MOVHstore [off1-off2] {sym} ptr val mem) 7436 for { 7437 off1 := v.AuxInt 7438 sym := v.Aux 7439 _ = v.Args[2] 7440 v_0 := v.Args[0] 7441 if v_0.Op != OpARMSUBconst { 7442 break 7443 } 7444 off2 := v_0.AuxInt 7445 ptr := v_0.Args[0] 7446 val := v.Args[1] 7447 mem := v.Args[2] 7448 v.reset(OpARMMOVHstore) 7449 v.AuxInt = off1 - off2 7450 v.Aux = sym 7451 v.AddArg(ptr) 7452 v.AddArg(val) 7453 v.AddArg(mem) 7454 return true 7455 } 7456 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7457 // cond: canMergeSym(sym1,sym2) 7458 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7459 for { 7460 off1 := v.AuxInt 7461 sym1 := v.Aux 7462 _ = v.Args[2] 7463 v_0 := v.Args[0] 7464 if v_0.Op != OpARMMOVWaddr { 7465 break 7466 } 7467 off2 := v_0.AuxInt 7468 sym2 := v_0.Aux 7469 ptr := v_0.Args[0] 7470 val := v.Args[1] 7471 mem := v.Args[2] 7472 if !(canMergeSym(sym1, sym2)) { 7473 break 7474 } 7475 v.reset(OpARMMOVHstore) 7476 v.AuxInt = off1 + off2 7477 v.Aux = mergeSym(sym1, sym2) 7478 v.AddArg(ptr) 7479 v.AddArg(val) 7480 v.AddArg(mem) 7481 return true 7482 } 7483 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 7484 // cond: 7485 // result: (MOVHstore [off] {sym} ptr x mem) 7486 for { 7487 off := v.AuxInt 7488 sym := v.Aux 7489 _ = v.Args[2] 7490 ptr := v.Args[0] 7491 v_1 := v.Args[1] 7492 if v_1.Op != OpARMMOVHreg { 7493 break 7494 } 7495 x := v_1.Args[0] 7496 mem := v.Args[2] 7497 v.reset(OpARMMOVHstore) 7498 v.AuxInt = off 7499 v.Aux = sym 7500 v.AddArg(ptr) 7501 v.AddArg(x) 7502 v.AddArg(mem) 7503 return true 7504 } 7505 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 7506 // cond: 7507 // result: (MOVHstore [off] {sym} ptr x mem) 7508 for { 7509 off := v.AuxInt 7510 sym := v.Aux 7511 _ = v.Args[2] 7512 ptr := v.Args[0] 7513 v_1 := v.Args[1] 7514 if v_1.Op != OpARMMOVHUreg { 7515 break 7516 } 7517 x := v_1.Args[0] 7518 mem := v.Args[2] 7519 v.reset(OpARMMOVHstore) 7520 v.AuxInt = off 7521 v.Aux = sym 7522 v.AddArg(ptr) 7523 v.AddArg(x) 7524 v.AddArg(mem) 7525 return true 7526 } 7527 // match: (MOVHstore [0] {sym} (ADD ptr idx) val mem) 7528 // cond: sym == nil && !config.nacl 7529 // result: (MOVHstoreidx ptr idx val mem) 7530 for { 7531 if v.AuxInt != 0 { 7532 break 7533 } 7534 sym := v.Aux 7535 _ = v.Args[2] 7536 v_0 := v.Args[0] 7537 if v_0.Op != OpARMADD { 7538 break 7539 } 7540 _ = v_0.Args[1] 7541 ptr := v_0.Args[0] 7542 idx := v_0.Args[1] 7543 val := v.Args[1] 7544 mem := v.Args[2] 7545 if !(sym == nil && !config.nacl) { 7546 break 7547 } 7548 v.reset(OpARMMOVHstoreidx) 7549 v.AddArg(ptr) 7550 v.AddArg(idx) 7551 v.AddArg(val) 7552 v.AddArg(mem) 7553 return true 7554 } 7555 return false 7556 } 7557 func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { 7558 // match: (MOVHstoreidx ptr (MOVWconst [c]) val mem) 7559 // cond: 7560 // result: (MOVHstore [c] ptr val mem) 7561 for { 7562 _ = v.Args[3] 7563 ptr := v.Args[0] 7564 v_1 := v.Args[1] 7565 if v_1.Op != OpARMMOVWconst { 7566 break 7567 } 7568 c := v_1.AuxInt 7569 val := v.Args[2] 7570 mem := v.Args[3] 7571 v.reset(OpARMMOVHstore) 7572 v.AuxInt = c 7573 v.AddArg(ptr) 7574 v.AddArg(val) 7575 v.AddArg(mem) 7576 return true 7577 } 7578 // match: (MOVHstoreidx (MOVWconst [c]) ptr val mem) 7579 // cond: 7580 // result: (MOVHstore [c] ptr val mem) 7581 for { 7582 _ = v.Args[3] 7583 v_0 := v.Args[0] 7584 if v_0.Op != OpARMMOVWconst { 7585 break 7586 } 7587 c := v_0.AuxInt 7588 ptr := v.Args[1] 7589 val := v.Args[2] 7590 mem := v.Args[3] 7591 v.reset(OpARMMOVHstore) 7592 v.AuxInt = c 7593 v.AddArg(ptr) 7594 v.AddArg(val) 7595 v.AddArg(mem) 7596 return true 7597 } 7598 return false 7599 } 7600 func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { 7601 b := v.Block 7602 _ = b 7603 config := b.Func.Config 7604 _ = config 7605 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 7606 // cond: 7607 // result: (MOVWload [off1+off2] {sym} ptr mem) 7608 for { 7609 off1 := v.AuxInt 7610 sym := v.Aux 7611 _ = v.Args[1] 7612 v_0 := v.Args[0] 7613 if v_0.Op != OpARMADDconst { 7614 break 7615 } 7616 off2 := v_0.AuxInt 7617 ptr := v_0.Args[0] 7618 mem := v.Args[1] 7619 v.reset(OpARMMOVWload) 7620 v.AuxInt = off1 + off2 7621 v.Aux = sym 7622 v.AddArg(ptr) 7623 v.AddArg(mem) 7624 return true 7625 } 7626 // match: (MOVWload [off1] {sym} (SUBconst [off2] ptr) mem) 7627 // cond: 7628 // result: (MOVWload [off1-off2] {sym} ptr mem) 7629 for { 7630 off1 := v.AuxInt 7631 sym := v.Aux 7632 _ = v.Args[1] 7633 v_0 := v.Args[0] 7634 if v_0.Op != OpARMSUBconst { 7635 break 7636 } 7637 off2 := v_0.AuxInt 7638 ptr := v_0.Args[0] 7639 mem := v.Args[1] 7640 v.reset(OpARMMOVWload) 7641 v.AuxInt = off1 - off2 7642 v.Aux = sym 7643 v.AddArg(ptr) 7644 v.AddArg(mem) 7645 return true 7646 } 7647 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7648 // cond: canMergeSym(sym1,sym2) 7649 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7650 for { 7651 off1 := v.AuxInt 7652 sym1 := v.Aux 7653 _ = v.Args[1] 7654 v_0 := v.Args[0] 7655 if v_0.Op != OpARMMOVWaddr { 7656 break 7657 } 7658 off2 := v_0.AuxInt 7659 sym2 := v_0.Aux 7660 ptr := v_0.Args[0] 7661 mem := v.Args[1] 7662 if !(canMergeSym(sym1, sym2)) { 7663 break 7664 } 7665 v.reset(OpARMMOVWload) 7666 v.AuxInt = off1 + off2 7667 v.Aux = mergeSym(sym1, sym2) 7668 v.AddArg(ptr) 7669 v.AddArg(mem) 7670 return true 7671 } 7672 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 7673 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7674 // result: x 7675 for { 7676 off := v.AuxInt 7677 sym := v.Aux 7678 _ = v.Args[1] 7679 ptr := v.Args[0] 7680 v_1 := v.Args[1] 7681 if v_1.Op != OpARMMOVWstore { 7682 break 7683 } 7684 off2 := v_1.AuxInt 7685 sym2 := v_1.Aux 7686 _ = v_1.Args[2] 7687 ptr2 := v_1.Args[0] 7688 x := v_1.Args[1] 7689 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7690 break 7691 } 7692 v.reset(OpCopy) 7693 v.Type = x.Type 7694 v.AddArg(x) 7695 return true 7696 } 7697 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 7698 // cond: sym == nil && !config.nacl 7699 // result: (MOVWloadidx ptr idx mem) 7700 for { 7701 if v.AuxInt != 0 { 7702 break 7703 } 7704 sym := v.Aux 7705 _ = v.Args[1] 7706 v_0 := v.Args[0] 7707 if v_0.Op != OpARMADD { 7708 break 7709 } 7710 _ = v_0.Args[1] 7711 ptr := v_0.Args[0] 7712 idx := v_0.Args[1] 7713 mem := v.Args[1] 7714 if !(sym == nil && !config.nacl) { 7715 break 7716 } 7717 v.reset(OpARMMOVWloadidx) 7718 v.AddArg(ptr) 7719 v.AddArg(idx) 7720 v.AddArg(mem) 7721 return true 7722 } 7723 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 7724 // cond: sym == nil && !config.nacl 7725 // result: (MOVWloadshiftLL ptr idx [c] mem) 7726 for { 7727 if v.AuxInt != 0 { 7728 break 7729 } 7730 sym := v.Aux 7731 _ = v.Args[1] 7732 v_0 := v.Args[0] 7733 if v_0.Op != OpARMADDshiftLL { 7734 break 7735 } 7736 c := v_0.AuxInt 7737 _ = v_0.Args[1] 7738 ptr := v_0.Args[0] 7739 idx := v_0.Args[1] 7740 mem := v.Args[1] 7741 if !(sym == nil && !config.nacl) { 7742 break 7743 } 7744 v.reset(OpARMMOVWloadshiftLL) 7745 v.AuxInt = c 7746 v.AddArg(ptr) 7747 v.AddArg(idx) 7748 v.AddArg(mem) 7749 return true 7750 } 7751 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 7752 // cond: sym == nil && !config.nacl 7753 // result: (MOVWloadshiftRL ptr idx [c] mem) 7754 for { 7755 if v.AuxInt != 0 { 7756 break 7757 } 7758 sym := v.Aux 7759 _ = v.Args[1] 7760 v_0 := v.Args[0] 7761 if v_0.Op != OpARMADDshiftRL { 7762 break 7763 } 7764 c := v_0.AuxInt 7765 _ = v_0.Args[1] 7766 ptr := v_0.Args[0] 7767 idx := v_0.Args[1] 7768 mem := v.Args[1] 7769 if !(sym == nil && !config.nacl) { 7770 break 7771 } 7772 v.reset(OpARMMOVWloadshiftRL) 7773 v.AuxInt = c 7774 v.AddArg(ptr) 7775 v.AddArg(idx) 7776 v.AddArg(mem) 7777 return true 7778 } 7779 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 7780 // cond: sym == nil && !config.nacl 7781 // result: (MOVWloadshiftRA ptr idx [c] mem) 7782 for { 7783 if v.AuxInt != 0 { 7784 break 7785 } 7786 sym := v.Aux 7787 _ = v.Args[1] 7788 v_0 := v.Args[0] 7789 if v_0.Op != OpARMADDshiftRA { 7790 break 7791 } 7792 c := v_0.AuxInt 7793 _ = v_0.Args[1] 7794 ptr := v_0.Args[0] 7795 idx := v_0.Args[1] 7796 mem := v.Args[1] 7797 if !(sym == nil && !config.nacl) { 7798 break 7799 } 7800 v.reset(OpARMMOVWloadshiftRA) 7801 v.AuxInt = c 7802 v.AddArg(ptr) 7803 v.AddArg(idx) 7804 v.AddArg(mem) 7805 return true 7806 } 7807 return false 7808 } 7809 func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { 7810 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 7811 // cond: isSamePtr(ptr, ptr2) 7812 // result: x 7813 for { 7814 _ = v.Args[2] 7815 ptr := v.Args[0] 7816 idx := v.Args[1] 7817 v_2 := v.Args[2] 7818 if v_2.Op != OpARMMOVWstoreidx { 7819 break 7820 } 7821 _ = v_2.Args[3] 7822 ptr2 := v_2.Args[0] 7823 if idx != v_2.Args[1] { 7824 break 7825 } 7826 x := v_2.Args[2] 7827 if !(isSamePtr(ptr, ptr2)) { 7828 break 7829 } 7830 v.reset(OpCopy) 7831 v.Type = x.Type 7832 v.AddArg(x) 7833 return true 7834 } 7835 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 7836 // cond: 7837 // result: (MOVWload [c] ptr mem) 7838 for { 7839 _ = v.Args[2] 7840 ptr := v.Args[0] 7841 v_1 := v.Args[1] 7842 if v_1.Op != OpARMMOVWconst { 7843 break 7844 } 7845 c := v_1.AuxInt 7846 mem := v.Args[2] 7847 v.reset(OpARMMOVWload) 7848 v.AuxInt = c 7849 v.AddArg(ptr) 7850 v.AddArg(mem) 7851 return true 7852 } 7853 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 7854 // cond: 7855 // result: (MOVWload [c] ptr mem) 7856 for { 7857 _ = v.Args[2] 7858 v_0 := v.Args[0] 7859 if v_0.Op != OpARMMOVWconst { 7860 break 7861 } 7862 c := v_0.AuxInt 7863 ptr := v.Args[1] 7864 mem := v.Args[2] 7865 v.reset(OpARMMOVWload) 7866 v.AuxInt = c 7867 v.AddArg(ptr) 7868 v.AddArg(mem) 7869 return true 7870 } 7871 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 7872 // cond: 7873 // result: (MOVWloadshiftLL ptr idx [c] mem) 7874 for { 7875 _ = v.Args[2] 7876 ptr := v.Args[0] 7877 v_1 := v.Args[1] 7878 if v_1.Op != OpARMSLLconst { 7879 break 7880 } 7881 c := v_1.AuxInt 7882 idx := v_1.Args[0] 7883 mem := v.Args[2] 7884 v.reset(OpARMMOVWloadshiftLL) 7885 v.AuxInt = c 7886 v.AddArg(ptr) 7887 v.AddArg(idx) 7888 v.AddArg(mem) 7889 return true 7890 } 7891 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 7892 // cond: 7893 // result: (MOVWloadshiftLL ptr idx [c] mem) 7894 for { 7895 _ = v.Args[2] 7896 v_0 := v.Args[0] 7897 if v_0.Op != OpARMSLLconst { 7898 break 7899 } 7900 c := v_0.AuxInt 7901 idx := v_0.Args[0] 7902 ptr := v.Args[1] 7903 mem := v.Args[2] 7904 v.reset(OpARMMOVWloadshiftLL) 7905 v.AuxInt = c 7906 v.AddArg(ptr) 7907 v.AddArg(idx) 7908 v.AddArg(mem) 7909 return true 7910 } 7911 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 7912 // cond: 7913 // result: (MOVWloadshiftRL ptr idx [c] mem) 7914 for { 7915 _ = v.Args[2] 7916 ptr := v.Args[0] 7917 v_1 := v.Args[1] 7918 if v_1.Op != OpARMSRLconst { 7919 break 7920 } 7921 c := v_1.AuxInt 7922 idx := v_1.Args[0] 7923 mem := v.Args[2] 7924 v.reset(OpARMMOVWloadshiftRL) 7925 v.AuxInt = c 7926 v.AddArg(ptr) 7927 v.AddArg(idx) 7928 v.AddArg(mem) 7929 return true 7930 } 7931 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 7932 // cond: 7933 // result: (MOVWloadshiftRL ptr idx [c] mem) 7934 for { 7935 _ = v.Args[2] 7936 v_0 := v.Args[0] 7937 if v_0.Op != OpARMSRLconst { 7938 break 7939 } 7940 c := v_0.AuxInt 7941 idx := v_0.Args[0] 7942 ptr := v.Args[1] 7943 mem := v.Args[2] 7944 v.reset(OpARMMOVWloadshiftRL) 7945 v.AuxInt = c 7946 v.AddArg(ptr) 7947 v.AddArg(idx) 7948 v.AddArg(mem) 7949 return true 7950 } 7951 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 7952 // cond: 7953 // result: (MOVWloadshiftRA ptr idx [c] mem) 7954 for { 7955 _ = v.Args[2] 7956 ptr := v.Args[0] 7957 v_1 := v.Args[1] 7958 if v_1.Op != OpARMSRAconst { 7959 break 7960 } 7961 c := v_1.AuxInt 7962 idx := v_1.Args[0] 7963 mem := v.Args[2] 7964 v.reset(OpARMMOVWloadshiftRA) 7965 v.AuxInt = c 7966 v.AddArg(ptr) 7967 v.AddArg(idx) 7968 v.AddArg(mem) 7969 return true 7970 } 7971 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 7972 // cond: 7973 // result: (MOVWloadshiftRA ptr idx [c] mem) 7974 for { 7975 _ = v.Args[2] 7976 v_0 := v.Args[0] 7977 if v_0.Op != OpARMSRAconst { 7978 break 7979 } 7980 c := v_0.AuxInt 7981 idx := v_0.Args[0] 7982 ptr := v.Args[1] 7983 mem := v.Args[2] 7984 v.reset(OpARMMOVWloadshiftRA) 7985 v.AuxInt = c 7986 v.AddArg(ptr) 7987 v.AddArg(idx) 7988 v.AddArg(mem) 7989 return true 7990 } 7991 return false 7992 } 7993 func rewriteValueARM_OpARMMOVWloadshiftLL_0(v *Value) bool { 7994 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 7995 // cond: c==d && isSamePtr(ptr, ptr2) 7996 // result: x 7997 for { 7998 c := v.AuxInt 7999 _ = v.Args[2] 8000 ptr := v.Args[0] 8001 idx := v.Args[1] 8002 v_2 := v.Args[2] 8003 if v_2.Op != OpARMMOVWstoreshiftLL { 8004 break 8005 } 8006 d := v_2.AuxInt 8007 _ = v_2.Args[3] 8008 ptr2 := v_2.Args[0] 8009 if idx != v_2.Args[1] { 8010 break 8011 } 8012 x := v_2.Args[2] 8013 if !(c == d && isSamePtr(ptr, ptr2)) { 8014 break 8015 } 8016 v.reset(OpCopy) 8017 v.Type = x.Type 8018 v.AddArg(x) 8019 return true 8020 } 8021 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 8022 // cond: 8023 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 8024 for { 8025 d := v.AuxInt 8026 _ = v.Args[2] 8027 ptr := v.Args[0] 8028 v_1 := v.Args[1] 8029 if v_1.Op != OpARMMOVWconst { 8030 break 8031 } 8032 c := v_1.AuxInt 8033 mem := v.Args[2] 8034 v.reset(OpARMMOVWload) 8035 v.AuxInt = int64(uint32(c) << uint64(d)) 8036 v.AddArg(ptr) 8037 v.AddArg(mem) 8038 return true 8039 } 8040 return false 8041 } 8042 func rewriteValueARM_OpARMMOVWloadshiftRA_0(v *Value) bool { 8043 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 8044 // cond: c==d && isSamePtr(ptr, ptr2) 8045 // result: x 8046 for { 8047 c := v.AuxInt 8048 _ = v.Args[2] 8049 ptr := v.Args[0] 8050 idx := v.Args[1] 8051 v_2 := v.Args[2] 8052 if v_2.Op != OpARMMOVWstoreshiftRA { 8053 break 8054 } 8055 d := v_2.AuxInt 8056 _ = v_2.Args[3] 8057 ptr2 := v_2.Args[0] 8058 if idx != v_2.Args[1] { 8059 break 8060 } 8061 x := v_2.Args[2] 8062 if !(c == d && isSamePtr(ptr, ptr2)) { 8063 break 8064 } 8065 v.reset(OpCopy) 8066 v.Type = x.Type 8067 v.AddArg(x) 8068 return true 8069 } 8070 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 8071 // cond: 8072 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 8073 for { 8074 d := v.AuxInt 8075 _ = v.Args[2] 8076 ptr := v.Args[0] 8077 v_1 := v.Args[1] 8078 if v_1.Op != OpARMMOVWconst { 8079 break 8080 } 8081 c := v_1.AuxInt 8082 mem := v.Args[2] 8083 v.reset(OpARMMOVWload) 8084 v.AuxInt = int64(int32(c) >> uint64(d)) 8085 v.AddArg(ptr) 8086 v.AddArg(mem) 8087 return true 8088 } 8089 return false 8090 } 8091 func rewriteValueARM_OpARMMOVWloadshiftRL_0(v *Value) bool { 8092 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 8093 // cond: c==d && isSamePtr(ptr, ptr2) 8094 // result: x 8095 for { 8096 c := v.AuxInt 8097 _ = v.Args[2] 8098 ptr := v.Args[0] 8099 idx := v.Args[1] 8100 v_2 := v.Args[2] 8101 if v_2.Op != OpARMMOVWstoreshiftRL { 8102 break 8103 } 8104 d := v_2.AuxInt 8105 _ = v_2.Args[3] 8106 ptr2 := v_2.Args[0] 8107 if idx != v_2.Args[1] { 8108 break 8109 } 8110 x := v_2.Args[2] 8111 if !(c == d && isSamePtr(ptr, ptr2)) { 8112 break 8113 } 8114 v.reset(OpCopy) 8115 v.Type = x.Type 8116 v.AddArg(x) 8117 return true 8118 } 8119 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 8120 // cond: 8121 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 8122 for { 8123 d := v.AuxInt 8124 _ = v.Args[2] 8125 ptr := v.Args[0] 8126 v_1 := v.Args[1] 8127 if v_1.Op != OpARMMOVWconst { 8128 break 8129 } 8130 c := v_1.AuxInt 8131 mem := v.Args[2] 8132 v.reset(OpARMMOVWload) 8133 v.AuxInt = int64(uint32(c) >> uint64(d)) 8134 v.AddArg(ptr) 8135 v.AddArg(mem) 8136 return true 8137 } 8138 return false 8139 } 8140 func rewriteValueARM_OpARMMOVWreg_0(v *Value) bool { 8141 // match: (MOVWreg x) 8142 // cond: x.Uses == 1 8143 // result: (MOVWnop x) 8144 for { 8145 x := v.Args[0] 8146 if !(x.Uses == 1) { 8147 break 8148 } 8149 v.reset(OpARMMOVWnop) 8150 v.AddArg(x) 8151 return true 8152 } 8153 // match: (MOVWreg (MOVWconst [c])) 8154 // cond: 8155 // result: (MOVWconst [c]) 8156 for { 8157 v_0 := v.Args[0] 8158 if v_0.Op != OpARMMOVWconst { 8159 break 8160 } 8161 c := v_0.AuxInt 8162 v.reset(OpARMMOVWconst) 8163 v.AuxInt = c 8164 return true 8165 } 8166 return false 8167 } 8168 func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { 8169 b := v.Block 8170 _ = b 8171 config := b.Func.Config 8172 _ = config 8173 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8174 // cond: 8175 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 8176 for { 8177 off1 := v.AuxInt 8178 sym := v.Aux 8179 _ = v.Args[2] 8180 v_0 := v.Args[0] 8181 if v_0.Op != OpARMADDconst { 8182 break 8183 } 8184 off2 := v_0.AuxInt 8185 ptr := v_0.Args[0] 8186 val := v.Args[1] 8187 mem := v.Args[2] 8188 v.reset(OpARMMOVWstore) 8189 v.AuxInt = off1 + off2 8190 v.Aux = sym 8191 v.AddArg(ptr) 8192 v.AddArg(val) 8193 v.AddArg(mem) 8194 return true 8195 } 8196 // match: (MOVWstore [off1] {sym} (SUBconst [off2] ptr) val mem) 8197 // cond: 8198 // result: (MOVWstore [off1-off2] {sym} ptr val mem) 8199 for { 8200 off1 := v.AuxInt 8201 sym := v.Aux 8202 _ = v.Args[2] 8203 v_0 := v.Args[0] 8204 if v_0.Op != OpARMSUBconst { 8205 break 8206 } 8207 off2 := v_0.AuxInt 8208 ptr := v_0.Args[0] 8209 val := v.Args[1] 8210 mem := v.Args[2] 8211 v.reset(OpARMMOVWstore) 8212 v.AuxInt = off1 - off2 8213 v.Aux = sym 8214 v.AddArg(ptr) 8215 v.AddArg(val) 8216 v.AddArg(mem) 8217 return true 8218 } 8219 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 8220 // cond: canMergeSym(sym1,sym2) 8221 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 8222 for { 8223 off1 := v.AuxInt 8224 sym1 := v.Aux 8225 _ = v.Args[2] 8226 v_0 := v.Args[0] 8227 if v_0.Op != OpARMMOVWaddr { 8228 break 8229 } 8230 off2 := v_0.AuxInt 8231 sym2 := v_0.Aux 8232 ptr := v_0.Args[0] 8233 val := v.Args[1] 8234 mem := v.Args[2] 8235 if !(canMergeSym(sym1, sym2)) { 8236 break 8237 } 8238 v.reset(OpARMMOVWstore) 8239 v.AuxInt = off1 + off2 8240 v.Aux = mergeSym(sym1, sym2) 8241 v.AddArg(ptr) 8242 v.AddArg(val) 8243 v.AddArg(mem) 8244 return true 8245 } 8246 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 8247 // cond: sym == nil && !config.nacl 8248 // result: (MOVWstoreidx ptr idx val mem) 8249 for { 8250 if v.AuxInt != 0 { 8251 break 8252 } 8253 sym := v.Aux 8254 _ = v.Args[2] 8255 v_0 := v.Args[0] 8256 if v_0.Op != OpARMADD { 8257 break 8258 } 8259 _ = v_0.Args[1] 8260 ptr := v_0.Args[0] 8261 idx := v_0.Args[1] 8262 val := v.Args[1] 8263 mem := v.Args[2] 8264 if !(sym == nil && !config.nacl) { 8265 break 8266 } 8267 v.reset(OpARMMOVWstoreidx) 8268 v.AddArg(ptr) 8269 v.AddArg(idx) 8270 v.AddArg(val) 8271 v.AddArg(mem) 8272 return true 8273 } 8274 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 8275 // cond: sym == nil && !config.nacl 8276 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 8277 for { 8278 if v.AuxInt != 0 { 8279 break 8280 } 8281 sym := v.Aux 8282 _ = v.Args[2] 8283 v_0 := v.Args[0] 8284 if v_0.Op != OpARMADDshiftLL { 8285 break 8286 } 8287 c := v_0.AuxInt 8288 _ = v_0.Args[1] 8289 ptr := v_0.Args[0] 8290 idx := v_0.Args[1] 8291 val := v.Args[1] 8292 mem := v.Args[2] 8293 if !(sym == nil && !config.nacl) { 8294 break 8295 } 8296 v.reset(OpARMMOVWstoreshiftLL) 8297 v.AuxInt = c 8298 v.AddArg(ptr) 8299 v.AddArg(idx) 8300 v.AddArg(val) 8301 v.AddArg(mem) 8302 return true 8303 } 8304 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 8305 // cond: sym == nil && !config.nacl 8306 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 8307 for { 8308 if v.AuxInt != 0 { 8309 break 8310 } 8311 sym := v.Aux 8312 _ = v.Args[2] 8313 v_0 := v.Args[0] 8314 if v_0.Op != OpARMADDshiftRL { 8315 break 8316 } 8317 c := v_0.AuxInt 8318 _ = v_0.Args[1] 8319 ptr := v_0.Args[0] 8320 idx := v_0.Args[1] 8321 val := v.Args[1] 8322 mem := v.Args[2] 8323 if !(sym == nil && !config.nacl) { 8324 break 8325 } 8326 v.reset(OpARMMOVWstoreshiftRL) 8327 v.AuxInt = c 8328 v.AddArg(ptr) 8329 v.AddArg(idx) 8330 v.AddArg(val) 8331 v.AddArg(mem) 8332 return true 8333 } 8334 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 8335 // cond: sym == nil && !config.nacl 8336 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 8337 for { 8338 if v.AuxInt != 0 { 8339 break 8340 } 8341 sym := v.Aux 8342 _ = v.Args[2] 8343 v_0 := v.Args[0] 8344 if v_0.Op != OpARMADDshiftRA { 8345 break 8346 } 8347 c := v_0.AuxInt 8348 _ = v_0.Args[1] 8349 ptr := v_0.Args[0] 8350 idx := v_0.Args[1] 8351 val := v.Args[1] 8352 mem := v.Args[2] 8353 if !(sym == nil && !config.nacl) { 8354 break 8355 } 8356 v.reset(OpARMMOVWstoreshiftRA) 8357 v.AuxInt = c 8358 v.AddArg(ptr) 8359 v.AddArg(idx) 8360 v.AddArg(val) 8361 v.AddArg(mem) 8362 return true 8363 } 8364 return false 8365 } 8366 func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { 8367 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 8368 // cond: 8369 // result: (MOVWstore [c] ptr val mem) 8370 for { 8371 _ = v.Args[3] 8372 ptr := v.Args[0] 8373 v_1 := v.Args[1] 8374 if v_1.Op != OpARMMOVWconst { 8375 break 8376 } 8377 c := v_1.AuxInt 8378 val := v.Args[2] 8379 mem := v.Args[3] 8380 v.reset(OpARMMOVWstore) 8381 v.AuxInt = c 8382 v.AddArg(ptr) 8383 v.AddArg(val) 8384 v.AddArg(mem) 8385 return true 8386 } 8387 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 8388 // cond: 8389 // result: (MOVWstore [c] ptr val mem) 8390 for { 8391 _ = v.Args[3] 8392 v_0 := v.Args[0] 8393 if v_0.Op != OpARMMOVWconst { 8394 break 8395 } 8396 c := v_0.AuxInt 8397 ptr := v.Args[1] 8398 val := v.Args[2] 8399 mem := v.Args[3] 8400 v.reset(OpARMMOVWstore) 8401 v.AuxInt = c 8402 v.AddArg(ptr) 8403 v.AddArg(val) 8404 v.AddArg(mem) 8405 return true 8406 } 8407 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 8408 // cond: 8409 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 8410 for { 8411 _ = v.Args[3] 8412 ptr := v.Args[0] 8413 v_1 := v.Args[1] 8414 if v_1.Op != OpARMSLLconst { 8415 break 8416 } 8417 c := v_1.AuxInt 8418 idx := v_1.Args[0] 8419 val := v.Args[2] 8420 mem := v.Args[3] 8421 v.reset(OpARMMOVWstoreshiftLL) 8422 v.AuxInt = c 8423 v.AddArg(ptr) 8424 v.AddArg(idx) 8425 v.AddArg(val) 8426 v.AddArg(mem) 8427 return true 8428 } 8429 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 8430 // cond: 8431 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 8432 for { 8433 _ = v.Args[3] 8434 v_0 := v.Args[0] 8435 if v_0.Op != OpARMSLLconst { 8436 break 8437 } 8438 c := v_0.AuxInt 8439 idx := v_0.Args[0] 8440 ptr := v.Args[1] 8441 val := v.Args[2] 8442 mem := v.Args[3] 8443 v.reset(OpARMMOVWstoreshiftLL) 8444 v.AuxInt = c 8445 v.AddArg(ptr) 8446 v.AddArg(idx) 8447 v.AddArg(val) 8448 v.AddArg(mem) 8449 return true 8450 } 8451 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 8452 // cond: 8453 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 8454 for { 8455 _ = v.Args[3] 8456 ptr := v.Args[0] 8457 v_1 := v.Args[1] 8458 if v_1.Op != OpARMSRLconst { 8459 break 8460 } 8461 c := v_1.AuxInt 8462 idx := v_1.Args[0] 8463 val := v.Args[2] 8464 mem := v.Args[3] 8465 v.reset(OpARMMOVWstoreshiftRL) 8466 v.AuxInt = c 8467 v.AddArg(ptr) 8468 v.AddArg(idx) 8469 v.AddArg(val) 8470 v.AddArg(mem) 8471 return true 8472 } 8473 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 8474 // cond: 8475 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 8476 for { 8477 _ = v.Args[3] 8478 v_0 := v.Args[0] 8479 if v_0.Op != OpARMSRLconst { 8480 break 8481 } 8482 c := v_0.AuxInt 8483 idx := v_0.Args[0] 8484 ptr := v.Args[1] 8485 val := v.Args[2] 8486 mem := v.Args[3] 8487 v.reset(OpARMMOVWstoreshiftRL) 8488 v.AuxInt = c 8489 v.AddArg(ptr) 8490 v.AddArg(idx) 8491 v.AddArg(val) 8492 v.AddArg(mem) 8493 return true 8494 } 8495 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 8496 // cond: 8497 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 8498 for { 8499 _ = v.Args[3] 8500 ptr := v.Args[0] 8501 v_1 := v.Args[1] 8502 if v_1.Op != OpARMSRAconst { 8503 break 8504 } 8505 c := v_1.AuxInt 8506 idx := v_1.Args[0] 8507 val := v.Args[2] 8508 mem := v.Args[3] 8509 v.reset(OpARMMOVWstoreshiftRA) 8510 v.AuxInt = c 8511 v.AddArg(ptr) 8512 v.AddArg(idx) 8513 v.AddArg(val) 8514 v.AddArg(mem) 8515 return true 8516 } 8517 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 8518 // cond: 8519 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 8520 for { 8521 _ = v.Args[3] 8522 v_0 := v.Args[0] 8523 if v_0.Op != OpARMSRAconst { 8524 break 8525 } 8526 c := v_0.AuxInt 8527 idx := v_0.Args[0] 8528 ptr := v.Args[1] 8529 val := v.Args[2] 8530 mem := v.Args[3] 8531 v.reset(OpARMMOVWstoreshiftRA) 8532 v.AuxInt = c 8533 v.AddArg(ptr) 8534 v.AddArg(idx) 8535 v.AddArg(val) 8536 v.AddArg(mem) 8537 return true 8538 } 8539 return false 8540 } 8541 func rewriteValueARM_OpARMMOVWstoreshiftLL_0(v *Value) bool { 8542 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 8543 // cond: 8544 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 8545 for { 8546 d := v.AuxInt 8547 _ = v.Args[3] 8548 ptr := v.Args[0] 8549 v_1 := v.Args[1] 8550 if v_1.Op != OpARMMOVWconst { 8551 break 8552 } 8553 c := v_1.AuxInt 8554 val := v.Args[2] 8555 mem := v.Args[3] 8556 v.reset(OpARMMOVWstore) 8557 v.AuxInt = int64(uint32(c) << uint64(d)) 8558 v.AddArg(ptr) 8559 v.AddArg(val) 8560 v.AddArg(mem) 8561 return true 8562 } 8563 return false 8564 } 8565 func rewriteValueARM_OpARMMOVWstoreshiftRA_0(v *Value) bool { 8566 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 8567 // cond: 8568 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 8569 for { 8570 d := v.AuxInt 8571 _ = v.Args[3] 8572 ptr := v.Args[0] 8573 v_1 := v.Args[1] 8574 if v_1.Op != OpARMMOVWconst { 8575 break 8576 } 8577 c := v_1.AuxInt 8578 val := v.Args[2] 8579 mem := v.Args[3] 8580 v.reset(OpARMMOVWstore) 8581 v.AuxInt = int64(int32(c) >> uint64(d)) 8582 v.AddArg(ptr) 8583 v.AddArg(val) 8584 v.AddArg(mem) 8585 return true 8586 } 8587 return false 8588 } 8589 func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { 8590 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 8591 // cond: 8592 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 8593 for { 8594 d := v.AuxInt 8595 _ = v.Args[3] 8596 ptr := v.Args[0] 8597 v_1 := v.Args[1] 8598 if v_1.Op != OpARMMOVWconst { 8599 break 8600 } 8601 c := v_1.AuxInt 8602 val := v.Args[2] 8603 mem := v.Args[3] 8604 v.reset(OpARMMOVWstore) 8605 v.AuxInt = int64(uint32(c) >> uint64(d)) 8606 v.AddArg(ptr) 8607 v.AddArg(val) 8608 v.AddArg(mem) 8609 return true 8610 } 8611 return false 8612 } 8613 func rewriteValueARM_OpARMMUL_0(v *Value) bool { 8614 // match: (MUL x (MOVWconst [c])) 8615 // cond: int32(c) == -1 8616 // result: (RSBconst [0] x) 8617 for { 8618 _ = v.Args[1] 8619 x := v.Args[0] 8620 v_1 := v.Args[1] 8621 if v_1.Op != OpARMMOVWconst { 8622 break 8623 } 8624 c := v_1.AuxInt 8625 if !(int32(c) == -1) { 8626 break 8627 } 8628 v.reset(OpARMRSBconst) 8629 v.AuxInt = 0 8630 v.AddArg(x) 8631 return true 8632 } 8633 // match: (MUL (MOVWconst [c]) x) 8634 // cond: int32(c) == -1 8635 // result: (RSBconst [0] x) 8636 for { 8637 _ = v.Args[1] 8638 v_0 := v.Args[0] 8639 if v_0.Op != OpARMMOVWconst { 8640 break 8641 } 8642 c := v_0.AuxInt 8643 x := v.Args[1] 8644 if !(int32(c) == -1) { 8645 break 8646 } 8647 v.reset(OpARMRSBconst) 8648 v.AuxInt = 0 8649 v.AddArg(x) 8650 return true 8651 } 8652 // match: (MUL _ (MOVWconst [0])) 8653 // cond: 8654 // result: (MOVWconst [0]) 8655 for { 8656 _ = v.Args[1] 8657 v_1 := v.Args[1] 8658 if v_1.Op != OpARMMOVWconst { 8659 break 8660 } 8661 if v_1.AuxInt != 0 { 8662 break 8663 } 8664 v.reset(OpARMMOVWconst) 8665 v.AuxInt = 0 8666 return true 8667 } 8668 // match: (MUL (MOVWconst [0]) _) 8669 // cond: 8670 // result: (MOVWconst [0]) 8671 for { 8672 _ = v.Args[1] 8673 v_0 := v.Args[0] 8674 if v_0.Op != OpARMMOVWconst { 8675 break 8676 } 8677 if v_0.AuxInt != 0 { 8678 break 8679 } 8680 v.reset(OpARMMOVWconst) 8681 v.AuxInt = 0 8682 return true 8683 } 8684 // match: (MUL x (MOVWconst [1])) 8685 // cond: 8686 // result: x 8687 for { 8688 _ = v.Args[1] 8689 x := v.Args[0] 8690 v_1 := v.Args[1] 8691 if v_1.Op != OpARMMOVWconst { 8692 break 8693 } 8694 if v_1.AuxInt != 1 { 8695 break 8696 } 8697 v.reset(OpCopy) 8698 v.Type = x.Type 8699 v.AddArg(x) 8700 return true 8701 } 8702 // match: (MUL (MOVWconst [1]) x) 8703 // cond: 8704 // result: x 8705 for { 8706 _ = v.Args[1] 8707 v_0 := v.Args[0] 8708 if v_0.Op != OpARMMOVWconst { 8709 break 8710 } 8711 if v_0.AuxInt != 1 { 8712 break 8713 } 8714 x := v.Args[1] 8715 v.reset(OpCopy) 8716 v.Type = x.Type 8717 v.AddArg(x) 8718 return true 8719 } 8720 // match: (MUL x (MOVWconst [c])) 8721 // cond: isPowerOfTwo(c) 8722 // result: (SLLconst [log2(c)] x) 8723 for { 8724 _ = v.Args[1] 8725 x := v.Args[0] 8726 v_1 := v.Args[1] 8727 if v_1.Op != OpARMMOVWconst { 8728 break 8729 } 8730 c := v_1.AuxInt 8731 if !(isPowerOfTwo(c)) { 8732 break 8733 } 8734 v.reset(OpARMSLLconst) 8735 v.AuxInt = log2(c) 8736 v.AddArg(x) 8737 return true 8738 } 8739 // match: (MUL (MOVWconst [c]) x) 8740 // cond: isPowerOfTwo(c) 8741 // result: (SLLconst [log2(c)] x) 8742 for { 8743 _ = v.Args[1] 8744 v_0 := v.Args[0] 8745 if v_0.Op != OpARMMOVWconst { 8746 break 8747 } 8748 c := v_0.AuxInt 8749 x := v.Args[1] 8750 if !(isPowerOfTwo(c)) { 8751 break 8752 } 8753 v.reset(OpARMSLLconst) 8754 v.AuxInt = log2(c) 8755 v.AddArg(x) 8756 return true 8757 } 8758 // match: (MUL x (MOVWconst [c])) 8759 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 8760 // result: (ADDshiftLL x x [log2(c-1)]) 8761 for { 8762 _ = v.Args[1] 8763 x := v.Args[0] 8764 v_1 := v.Args[1] 8765 if v_1.Op != OpARMMOVWconst { 8766 break 8767 } 8768 c := v_1.AuxInt 8769 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 8770 break 8771 } 8772 v.reset(OpARMADDshiftLL) 8773 v.AuxInt = log2(c - 1) 8774 v.AddArg(x) 8775 v.AddArg(x) 8776 return true 8777 } 8778 // match: (MUL (MOVWconst [c]) x) 8779 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 8780 // result: (ADDshiftLL x x [log2(c-1)]) 8781 for { 8782 _ = v.Args[1] 8783 v_0 := v.Args[0] 8784 if v_0.Op != OpARMMOVWconst { 8785 break 8786 } 8787 c := v_0.AuxInt 8788 x := v.Args[1] 8789 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 8790 break 8791 } 8792 v.reset(OpARMADDshiftLL) 8793 v.AuxInt = log2(c - 1) 8794 v.AddArg(x) 8795 v.AddArg(x) 8796 return true 8797 } 8798 return false 8799 } 8800 func rewriteValueARM_OpARMMUL_10(v *Value) bool { 8801 b := v.Block 8802 _ = b 8803 // match: (MUL x (MOVWconst [c])) 8804 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 8805 // result: (RSBshiftLL x x [log2(c+1)]) 8806 for { 8807 _ = v.Args[1] 8808 x := v.Args[0] 8809 v_1 := v.Args[1] 8810 if v_1.Op != OpARMMOVWconst { 8811 break 8812 } 8813 c := v_1.AuxInt 8814 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 8815 break 8816 } 8817 v.reset(OpARMRSBshiftLL) 8818 v.AuxInt = log2(c + 1) 8819 v.AddArg(x) 8820 v.AddArg(x) 8821 return true 8822 } 8823 // match: (MUL (MOVWconst [c]) x) 8824 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 8825 // result: (RSBshiftLL x x [log2(c+1)]) 8826 for { 8827 _ = v.Args[1] 8828 v_0 := v.Args[0] 8829 if v_0.Op != OpARMMOVWconst { 8830 break 8831 } 8832 c := v_0.AuxInt 8833 x := v.Args[1] 8834 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 8835 break 8836 } 8837 v.reset(OpARMRSBshiftLL) 8838 v.AuxInt = log2(c + 1) 8839 v.AddArg(x) 8840 v.AddArg(x) 8841 return true 8842 } 8843 // match: (MUL x (MOVWconst [c])) 8844 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 8845 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 8846 for { 8847 _ = v.Args[1] 8848 x := v.Args[0] 8849 v_1 := v.Args[1] 8850 if v_1.Op != OpARMMOVWconst { 8851 break 8852 } 8853 c := v_1.AuxInt 8854 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 8855 break 8856 } 8857 v.reset(OpARMSLLconst) 8858 v.AuxInt = log2(c / 3) 8859 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8860 v0.AuxInt = 1 8861 v0.AddArg(x) 8862 v0.AddArg(x) 8863 v.AddArg(v0) 8864 return true 8865 } 8866 // match: (MUL (MOVWconst [c]) x) 8867 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 8868 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 8869 for { 8870 _ = v.Args[1] 8871 v_0 := v.Args[0] 8872 if v_0.Op != OpARMMOVWconst { 8873 break 8874 } 8875 c := v_0.AuxInt 8876 x := v.Args[1] 8877 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 8878 break 8879 } 8880 v.reset(OpARMSLLconst) 8881 v.AuxInt = log2(c / 3) 8882 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8883 v0.AuxInt = 1 8884 v0.AddArg(x) 8885 v0.AddArg(x) 8886 v.AddArg(v0) 8887 return true 8888 } 8889 // match: (MUL x (MOVWconst [c])) 8890 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8891 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 8892 for { 8893 _ = v.Args[1] 8894 x := v.Args[0] 8895 v_1 := v.Args[1] 8896 if v_1.Op != OpARMMOVWconst { 8897 break 8898 } 8899 c := v_1.AuxInt 8900 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8901 break 8902 } 8903 v.reset(OpARMSLLconst) 8904 v.AuxInt = log2(c / 5) 8905 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8906 v0.AuxInt = 2 8907 v0.AddArg(x) 8908 v0.AddArg(x) 8909 v.AddArg(v0) 8910 return true 8911 } 8912 // match: (MUL (MOVWconst [c]) x) 8913 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8914 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 8915 for { 8916 _ = v.Args[1] 8917 v_0 := v.Args[0] 8918 if v_0.Op != OpARMMOVWconst { 8919 break 8920 } 8921 c := v_0.AuxInt 8922 x := v.Args[1] 8923 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8924 break 8925 } 8926 v.reset(OpARMSLLconst) 8927 v.AuxInt = log2(c / 5) 8928 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8929 v0.AuxInt = 2 8930 v0.AddArg(x) 8931 v0.AddArg(x) 8932 v.AddArg(v0) 8933 return true 8934 } 8935 // match: (MUL x (MOVWconst [c])) 8936 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8937 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 8938 for { 8939 _ = v.Args[1] 8940 x := v.Args[0] 8941 v_1 := v.Args[1] 8942 if v_1.Op != OpARMMOVWconst { 8943 break 8944 } 8945 c := v_1.AuxInt 8946 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8947 break 8948 } 8949 v.reset(OpARMSLLconst) 8950 v.AuxInt = log2(c / 7) 8951 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8952 v0.AuxInt = 3 8953 v0.AddArg(x) 8954 v0.AddArg(x) 8955 v.AddArg(v0) 8956 return true 8957 } 8958 // match: (MUL (MOVWconst [c]) x) 8959 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8960 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 8961 for { 8962 _ = v.Args[1] 8963 v_0 := v.Args[0] 8964 if v_0.Op != OpARMMOVWconst { 8965 break 8966 } 8967 c := v_0.AuxInt 8968 x := v.Args[1] 8969 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8970 break 8971 } 8972 v.reset(OpARMSLLconst) 8973 v.AuxInt = log2(c / 7) 8974 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8975 v0.AuxInt = 3 8976 v0.AddArg(x) 8977 v0.AddArg(x) 8978 v.AddArg(v0) 8979 return true 8980 } 8981 // match: (MUL x (MOVWconst [c])) 8982 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8983 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 8984 for { 8985 _ = v.Args[1] 8986 x := v.Args[0] 8987 v_1 := v.Args[1] 8988 if v_1.Op != OpARMMOVWconst { 8989 break 8990 } 8991 c := v_1.AuxInt 8992 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8993 break 8994 } 8995 v.reset(OpARMSLLconst) 8996 v.AuxInt = log2(c / 9) 8997 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8998 v0.AuxInt = 3 8999 v0.AddArg(x) 9000 v0.AddArg(x) 9001 v.AddArg(v0) 9002 return true 9003 } 9004 // match: (MUL (MOVWconst [c]) x) 9005 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 9006 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 9007 for { 9008 _ = v.Args[1] 9009 v_0 := v.Args[0] 9010 if v_0.Op != OpARMMOVWconst { 9011 break 9012 } 9013 c := v_0.AuxInt 9014 x := v.Args[1] 9015 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9016 break 9017 } 9018 v.reset(OpARMSLLconst) 9019 v.AuxInt = log2(c / 9) 9020 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9021 v0.AuxInt = 3 9022 v0.AddArg(x) 9023 v0.AddArg(x) 9024 v.AddArg(v0) 9025 return true 9026 } 9027 return false 9028 } 9029 func rewriteValueARM_OpARMMUL_20(v *Value) bool { 9030 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 9031 // cond: 9032 // result: (MOVWconst [int64(int32(c*d))]) 9033 for { 9034 _ = v.Args[1] 9035 v_0 := v.Args[0] 9036 if v_0.Op != OpARMMOVWconst { 9037 break 9038 } 9039 c := v_0.AuxInt 9040 v_1 := v.Args[1] 9041 if v_1.Op != OpARMMOVWconst { 9042 break 9043 } 9044 d := v_1.AuxInt 9045 v.reset(OpARMMOVWconst) 9046 v.AuxInt = int64(int32(c * d)) 9047 return true 9048 } 9049 // match: (MUL (MOVWconst [d]) (MOVWconst [c])) 9050 // cond: 9051 // result: (MOVWconst [int64(int32(c*d))]) 9052 for { 9053 _ = v.Args[1] 9054 v_0 := v.Args[0] 9055 if v_0.Op != OpARMMOVWconst { 9056 break 9057 } 9058 d := v_0.AuxInt 9059 v_1 := v.Args[1] 9060 if v_1.Op != OpARMMOVWconst { 9061 break 9062 } 9063 c := v_1.AuxInt 9064 v.reset(OpARMMOVWconst) 9065 v.AuxInt = int64(int32(c * d)) 9066 return true 9067 } 9068 return false 9069 } 9070 func rewriteValueARM_OpARMMULA_0(v *Value) bool { 9071 b := v.Block 9072 _ = b 9073 // match: (MULA x (MOVWconst [c]) a) 9074 // cond: int32(c) == -1 9075 // result: (SUB a x) 9076 for { 9077 _ = v.Args[2] 9078 x := v.Args[0] 9079 v_1 := v.Args[1] 9080 if v_1.Op != OpARMMOVWconst { 9081 break 9082 } 9083 c := v_1.AuxInt 9084 a := v.Args[2] 9085 if !(int32(c) == -1) { 9086 break 9087 } 9088 v.reset(OpARMSUB) 9089 v.AddArg(a) 9090 v.AddArg(x) 9091 return true 9092 } 9093 // match: (MULA _ (MOVWconst [0]) a) 9094 // cond: 9095 // result: a 9096 for { 9097 _ = v.Args[2] 9098 v_1 := v.Args[1] 9099 if v_1.Op != OpARMMOVWconst { 9100 break 9101 } 9102 if v_1.AuxInt != 0 { 9103 break 9104 } 9105 a := v.Args[2] 9106 v.reset(OpCopy) 9107 v.Type = a.Type 9108 v.AddArg(a) 9109 return true 9110 } 9111 // match: (MULA x (MOVWconst [1]) a) 9112 // cond: 9113 // result: (ADD x a) 9114 for { 9115 _ = v.Args[2] 9116 x := v.Args[0] 9117 v_1 := v.Args[1] 9118 if v_1.Op != OpARMMOVWconst { 9119 break 9120 } 9121 if v_1.AuxInt != 1 { 9122 break 9123 } 9124 a := v.Args[2] 9125 v.reset(OpARMADD) 9126 v.AddArg(x) 9127 v.AddArg(a) 9128 return true 9129 } 9130 // match: (MULA x (MOVWconst [c]) a) 9131 // cond: isPowerOfTwo(c) 9132 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 9133 for { 9134 _ = v.Args[2] 9135 x := v.Args[0] 9136 v_1 := v.Args[1] 9137 if v_1.Op != OpARMMOVWconst { 9138 break 9139 } 9140 c := v_1.AuxInt 9141 a := v.Args[2] 9142 if !(isPowerOfTwo(c)) { 9143 break 9144 } 9145 v.reset(OpARMADD) 9146 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9147 v0.AuxInt = log2(c) 9148 v0.AddArg(x) 9149 v.AddArg(v0) 9150 v.AddArg(a) 9151 return true 9152 } 9153 // match: (MULA x (MOVWconst [c]) a) 9154 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9155 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 9156 for { 9157 _ = v.Args[2] 9158 x := v.Args[0] 9159 v_1 := v.Args[1] 9160 if v_1.Op != OpARMMOVWconst { 9161 break 9162 } 9163 c := v_1.AuxInt 9164 a := v.Args[2] 9165 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9166 break 9167 } 9168 v.reset(OpARMADD) 9169 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9170 v0.AuxInt = log2(c - 1) 9171 v0.AddArg(x) 9172 v0.AddArg(x) 9173 v.AddArg(v0) 9174 v.AddArg(a) 9175 return true 9176 } 9177 // match: (MULA x (MOVWconst [c]) a) 9178 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9179 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 9180 for { 9181 _ = v.Args[2] 9182 x := v.Args[0] 9183 v_1 := v.Args[1] 9184 if v_1.Op != OpARMMOVWconst { 9185 break 9186 } 9187 c := v_1.AuxInt 9188 a := v.Args[2] 9189 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9190 break 9191 } 9192 v.reset(OpARMADD) 9193 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9194 v0.AuxInt = log2(c + 1) 9195 v0.AddArg(x) 9196 v0.AddArg(x) 9197 v.AddArg(v0) 9198 v.AddArg(a) 9199 return true 9200 } 9201 // match: (MULA x (MOVWconst [c]) a) 9202 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9203 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 9204 for { 9205 _ = v.Args[2] 9206 x := v.Args[0] 9207 v_1 := v.Args[1] 9208 if v_1.Op != OpARMMOVWconst { 9209 break 9210 } 9211 c := v_1.AuxInt 9212 a := v.Args[2] 9213 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9214 break 9215 } 9216 v.reset(OpARMADD) 9217 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9218 v0.AuxInt = log2(c / 3) 9219 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9220 v1.AuxInt = 1 9221 v1.AddArg(x) 9222 v1.AddArg(x) 9223 v0.AddArg(v1) 9224 v.AddArg(v0) 9225 v.AddArg(a) 9226 return true 9227 } 9228 // match: (MULA x (MOVWconst [c]) a) 9229 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9230 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 9231 for { 9232 _ = v.Args[2] 9233 x := v.Args[0] 9234 v_1 := v.Args[1] 9235 if v_1.Op != OpARMMOVWconst { 9236 break 9237 } 9238 c := v_1.AuxInt 9239 a := v.Args[2] 9240 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9241 break 9242 } 9243 v.reset(OpARMADD) 9244 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9245 v0.AuxInt = log2(c / 5) 9246 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9247 v1.AuxInt = 2 9248 v1.AddArg(x) 9249 v1.AddArg(x) 9250 v0.AddArg(v1) 9251 v.AddArg(v0) 9252 v.AddArg(a) 9253 return true 9254 } 9255 // match: (MULA x (MOVWconst [c]) a) 9256 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 9257 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 9258 for { 9259 _ = v.Args[2] 9260 x := v.Args[0] 9261 v_1 := v.Args[1] 9262 if v_1.Op != OpARMMOVWconst { 9263 break 9264 } 9265 c := v_1.AuxInt 9266 a := v.Args[2] 9267 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 9268 break 9269 } 9270 v.reset(OpARMADD) 9271 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9272 v0.AuxInt = log2(c / 7) 9273 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9274 v1.AuxInt = 3 9275 v1.AddArg(x) 9276 v1.AddArg(x) 9277 v0.AddArg(v1) 9278 v.AddArg(v0) 9279 v.AddArg(a) 9280 return true 9281 } 9282 // match: (MULA x (MOVWconst [c]) a) 9283 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 9284 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 9285 for { 9286 _ = v.Args[2] 9287 x := v.Args[0] 9288 v_1 := v.Args[1] 9289 if v_1.Op != OpARMMOVWconst { 9290 break 9291 } 9292 c := v_1.AuxInt 9293 a := v.Args[2] 9294 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9295 break 9296 } 9297 v.reset(OpARMADD) 9298 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9299 v0.AuxInt = log2(c / 9) 9300 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9301 v1.AuxInt = 3 9302 v1.AddArg(x) 9303 v1.AddArg(x) 9304 v0.AddArg(v1) 9305 v.AddArg(v0) 9306 v.AddArg(a) 9307 return true 9308 } 9309 return false 9310 } 9311 func rewriteValueARM_OpARMMULA_10(v *Value) bool { 9312 b := v.Block 9313 _ = b 9314 // match: (MULA (MOVWconst [c]) x a) 9315 // cond: int32(c) == -1 9316 // result: (SUB a x) 9317 for { 9318 _ = v.Args[2] 9319 v_0 := v.Args[0] 9320 if v_0.Op != OpARMMOVWconst { 9321 break 9322 } 9323 c := v_0.AuxInt 9324 x := v.Args[1] 9325 a := v.Args[2] 9326 if !(int32(c) == -1) { 9327 break 9328 } 9329 v.reset(OpARMSUB) 9330 v.AddArg(a) 9331 v.AddArg(x) 9332 return true 9333 } 9334 // match: (MULA (MOVWconst [0]) _ a) 9335 // cond: 9336 // result: a 9337 for { 9338 _ = v.Args[2] 9339 v_0 := v.Args[0] 9340 if v_0.Op != OpARMMOVWconst { 9341 break 9342 } 9343 if v_0.AuxInt != 0 { 9344 break 9345 } 9346 a := v.Args[2] 9347 v.reset(OpCopy) 9348 v.Type = a.Type 9349 v.AddArg(a) 9350 return true 9351 } 9352 // match: (MULA (MOVWconst [1]) x a) 9353 // cond: 9354 // result: (ADD x a) 9355 for { 9356 _ = v.Args[2] 9357 v_0 := v.Args[0] 9358 if v_0.Op != OpARMMOVWconst { 9359 break 9360 } 9361 if v_0.AuxInt != 1 { 9362 break 9363 } 9364 x := v.Args[1] 9365 a := v.Args[2] 9366 v.reset(OpARMADD) 9367 v.AddArg(x) 9368 v.AddArg(a) 9369 return true 9370 } 9371 // match: (MULA (MOVWconst [c]) x a) 9372 // cond: isPowerOfTwo(c) 9373 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 9374 for { 9375 _ = v.Args[2] 9376 v_0 := v.Args[0] 9377 if v_0.Op != OpARMMOVWconst { 9378 break 9379 } 9380 c := v_0.AuxInt 9381 x := v.Args[1] 9382 a := v.Args[2] 9383 if !(isPowerOfTwo(c)) { 9384 break 9385 } 9386 v.reset(OpARMADD) 9387 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9388 v0.AuxInt = log2(c) 9389 v0.AddArg(x) 9390 v.AddArg(v0) 9391 v.AddArg(a) 9392 return true 9393 } 9394 // match: (MULA (MOVWconst [c]) x a) 9395 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9396 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 9397 for { 9398 _ = v.Args[2] 9399 v_0 := v.Args[0] 9400 if v_0.Op != OpARMMOVWconst { 9401 break 9402 } 9403 c := v_0.AuxInt 9404 x := v.Args[1] 9405 a := v.Args[2] 9406 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9407 break 9408 } 9409 v.reset(OpARMADD) 9410 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9411 v0.AuxInt = log2(c - 1) 9412 v0.AddArg(x) 9413 v0.AddArg(x) 9414 v.AddArg(v0) 9415 v.AddArg(a) 9416 return true 9417 } 9418 // match: (MULA (MOVWconst [c]) x a) 9419 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9420 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 9421 for { 9422 _ = v.Args[2] 9423 v_0 := v.Args[0] 9424 if v_0.Op != OpARMMOVWconst { 9425 break 9426 } 9427 c := v_0.AuxInt 9428 x := v.Args[1] 9429 a := v.Args[2] 9430 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9431 break 9432 } 9433 v.reset(OpARMADD) 9434 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9435 v0.AuxInt = log2(c + 1) 9436 v0.AddArg(x) 9437 v0.AddArg(x) 9438 v.AddArg(v0) 9439 v.AddArg(a) 9440 return true 9441 } 9442 // match: (MULA (MOVWconst [c]) x a) 9443 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9444 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 9445 for { 9446 _ = v.Args[2] 9447 v_0 := v.Args[0] 9448 if v_0.Op != OpARMMOVWconst { 9449 break 9450 } 9451 c := v_0.AuxInt 9452 x := v.Args[1] 9453 a := v.Args[2] 9454 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9455 break 9456 } 9457 v.reset(OpARMADD) 9458 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9459 v0.AuxInt = log2(c / 3) 9460 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9461 v1.AuxInt = 1 9462 v1.AddArg(x) 9463 v1.AddArg(x) 9464 v0.AddArg(v1) 9465 v.AddArg(v0) 9466 v.AddArg(a) 9467 return true 9468 } 9469 // match: (MULA (MOVWconst [c]) x a) 9470 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9471 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 9472 for { 9473 _ = v.Args[2] 9474 v_0 := v.Args[0] 9475 if v_0.Op != OpARMMOVWconst { 9476 break 9477 } 9478 c := v_0.AuxInt 9479 x := v.Args[1] 9480 a := v.Args[2] 9481 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9482 break 9483 } 9484 v.reset(OpARMADD) 9485 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9486 v0.AuxInt = log2(c / 5) 9487 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9488 v1.AuxInt = 2 9489 v1.AddArg(x) 9490 v1.AddArg(x) 9491 v0.AddArg(v1) 9492 v.AddArg(v0) 9493 v.AddArg(a) 9494 return true 9495 } 9496 // match: (MULA (MOVWconst [c]) x a) 9497 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 9498 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 9499 for { 9500 _ = v.Args[2] 9501 v_0 := v.Args[0] 9502 if v_0.Op != OpARMMOVWconst { 9503 break 9504 } 9505 c := v_0.AuxInt 9506 x := v.Args[1] 9507 a := v.Args[2] 9508 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 9509 break 9510 } 9511 v.reset(OpARMADD) 9512 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9513 v0.AuxInt = log2(c / 7) 9514 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9515 v1.AuxInt = 3 9516 v1.AddArg(x) 9517 v1.AddArg(x) 9518 v0.AddArg(v1) 9519 v.AddArg(v0) 9520 v.AddArg(a) 9521 return true 9522 } 9523 // match: (MULA (MOVWconst [c]) x a) 9524 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 9525 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 9526 for { 9527 _ = v.Args[2] 9528 v_0 := v.Args[0] 9529 if v_0.Op != OpARMMOVWconst { 9530 break 9531 } 9532 c := v_0.AuxInt 9533 x := v.Args[1] 9534 a := v.Args[2] 9535 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9536 break 9537 } 9538 v.reset(OpARMADD) 9539 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9540 v0.AuxInt = log2(c / 9) 9541 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9542 v1.AuxInt = 3 9543 v1.AddArg(x) 9544 v1.AddArg(x) 9545 v0.AddArg(v1) 9546 v.AddArg(v0) 9547 v.AddArg(a) 9548 return true 9549 } 9550 return false 9551 } 9552 func rewriteValueARM_OpARMMULA_20(v *Value) bool { 9553 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 9554 // cond: 9555 // result: (ADDconst [int64(int32(c*d))] a) 9556 for { 9557 _ = v.Args[2] 9558 v_0 := v.Args[0] 9559 if v_0.Op != OpARMMOVWconst { 9560 break 9561 } 9562 c := v_0.AuxInt 9563 v_1 := v.Args[1] 9564 if v_1.Op != OpARMMOVWconst { 9565 break 9566 } 9567 d := v_1.AuxInt 9568 a := v.Args[2] 9569 v.reset(OpARMADDconst) 9570 v.AuxInt = int64(int32(c * d)) 9571 v.AddArg(a) 9572 return true 9573 } 9574 return false 9575 } 9576 func rewriteValueARM_OpARMMULS_0(v *Value) bool { 9577 b := v.Block 9578 _ = b 9579 // match: (MULS x (MOVWconst [c]) a) 9580 // cond: int32(c) == -1 9581 // result: (ADD a x) 9582 for { 9583 _ = v.Args[2] 9584 x := v.Args[0] 9585 v_1 := v.Args[1] 9586 if v_1.Op != OpARMMOVWconst { 9587 break 9588 } 9589 c := v_1.AuxInt 9590 a := v.Args[2] 9591 if !(int32(c) == -1) { 9592 break 9593 } 9594 v.reset(OpARMADD) 9595 v.AddArg(a) 9596 v.AddArg(x) 9597 return true 9598 } 9599 // match: (MULS _ (MOVWconst [0]) a) 9600 // cond: 9601 // result: a 9602 for { 9603 _ = v.Args[2] 9604 v_1 := v.Args[1] 9605 if v_1.Op != OpARMMOVWconst { 9606 break 9607 } 9608 if v_1.AuxInt != 0 { 9609 break 9610 } 9611 a := v.Args[2] 9612 v.reset(OpCopy) 9613 v.Type = a.Type 9614 v.AddArg(a) 9615 return true 9616 } 9617 // match: (MULS x (MOVWconst [1]) a) 9618 // cond: 9619 // result: (RSB x a) 9620 for { 9621 _ = v.Args[2] 9622 x := v.Args[0] 9623 v_1 := v.Args[1] 9624 if v_1.Op != OpARMMOVWconst { 9625 break 9626 } 9627 if v_1.AuxInt != 1 { 9628 break 9629 } 9630 a := v.Args[2] 9631 v.reset(OpARMRSB) 9632 v.AddArg(x) 9633 v.AddArg(a) 9634 return true 9635 } 9636 // match: (MULS x (MOVWconst [c]) a) 9637 // cond: isPowerOfTwo(c) 9638 // result: (RSB (SLLconst <x.Type> [log2(c)] x) a) 9639 for { 9640 _ = v.Args[2] 9641 x := v.Args[0] 9642 v_1 := v.Args[1] 9643 if v_1.Op != OpARMMOVWconst { 9644 break 9645 } 9646 c := v_1.AuxInt 9647 a := v.Args[2] 9648 if !(isPowerOfTwo(c)) { 9649 break 9650 } 9651 v.reset(OpARMRSB) 9652 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9653 v0.AuxInt = log2(c) 9654 v0.AddArg(x) 9655 v.AddArg(v0) 9656 v.AddArg(a) 9657 return true 9658 } 9659 // match: (MULS x (MOVWconst [c]) a) 9660 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9661 // result: (RSB (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 9662 for { 9663 _ = v.Args[2] 9664 x := v.Args[0] 9665 v_1 := v.Args[1] 9666 if v_1.Op != OpARMMOVWconst { 9667 break 9668 } 9669 c := v_1.AuxInt 9670 a := v.Args[2] 9671 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9672 break 9673 } 9674 v.reset(OpARMRSB) 9675 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9676 v0.AuxInt = log2(c - 1) 9677 v0.AddArg(x) 9678 v0.AddArg(x) 9679 v.AddArg(v0) 9680 v.AddArg(a) 9681 return true 9682 } 9683 // match: (MULS x (MOVWconst [c]) a) 9684 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9685 // result: (RSB (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 9686 for { 9687 _ = v.Args[2] 9688 x := v.Args[0] 9689 v_1 := v.Args[1] 9690 if v_1.Op != OpARMMOVWconst { 9691 break 9692 } 9693 c := v_1.AuxInt 9694 a := v.Args[2] 9695 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9696 break 9697 } 9698 v.reset(OpARMRSB) 9699 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9700 v0.AuxInt = log2(c + 1) 9701 v0.AddArg(x) 9702 v0.AddArg(x) 9703 v.AddArg(v0) 9704 v.AddArg(a) 9705 return true 9706 } 9707 // match: (MULS x (MOVWconst [c]) a) 9708 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9709 // result: (RSB (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 9710 for { 9711 _ = v.Args[2] 9712 x := v.Args[0] 9713 v_1 := v.Args[1] 9714 if v_1.Op != OpARMMOVWconst { 9715 break 9716 } 9717 c := v_1.AuxInt 9718 a := v.Args[2] 9719 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9720 break 9721 } 9722 v.reset(OpARMRSB) 9723 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9724 v0.AuxInt = log2(c / 3) 9725 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9726 v1.AuxInt = 1 9727 v1.AddArg(x) 9728 v1.AddArg(x) 9729 v0.AddArg(v1) 9730 v.AddArg(v0) 9731 v.AddArg(a) 9732 return true 9733 } 9734 // match: (MULS x (MOVWconst [c]) a) 9735 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9736 // result: (RSB (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 9737 for { 9738 _ = v.Args[2] 9739 x := v.Args[0] 9740 v_1 := v.Args[1] 9741 if v_1.Op != OpARMMOVWconst { 9742 break 9743 } 9744 c := v_1.AuxInt 9745 a := v.Args[2] 9746 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9747 break 9748 } 9749 v.reset(OpARMRSB) 9750 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9751 v0.AuxInt = log2(c / 5) 9752 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9753 v1.AuxInt = 2 9754 v1.AddArg(x) 9755 v1.AddArg(x) 9756 v0.AddArg(v1) 9757 v.AddArg(v0) 9758 v.AddArg(a) 9759 return true 9760 } 9761 // match: (MULS x (MOVWconst [c]) a) 9762 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 9763 // result: (RSB (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 9764 for { 9765 _ = v.Args[2] 9766 x := v.Args[0] 9767 v_1 := v.Args[1] 9768 if v_1.Op != OpARMMOVWconst { 9769 break 9770 } 9771 c := v_1.AuxInt 9772 a := v.Args[2] 9773 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 9774 break 9775 } 9776 v.reset(OpARMRSB) 9777 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9778 v0.AuxInt = log2(c / 7) 9779 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9780 v1.AuxInt = 3 9781 v1.AddArg(x) 9782 v1.AddArg(x) 9783 v0.AddArg(v1) 9784 v.AddArg(v0) 9785 v.AddArg(a) 9786 return true 9787 } 9788 // match: (MULS x (MOVWconst [c]) a) 9789 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 9790 // result: (RSB (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 9791 for { 9792 _ = v.Args[2] 9793 x := v.Args[0] 9794 v_1 := v.Args[1] 9795 if v_1.Op != OpARMMOVWconst { 9796 break 9797 } 9798 c := v_1.AuxInt 9799 a := v.Args[2] 9800 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9801 break 9802 } 9803 v.reset(OpARMRSB) 9804 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9805 v0.AuxInt = log2(c / 9) 9806 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9807 v1.AuxInt = 3 9808 v1.AddArg(x) 9809 v1.AddArg(x) 9810 v0.AddArg(v1) 9811 v.AddArg(v0) 9812 v.AddArg(a) 9813 return true 9814 } 9815 return false 9816 } 9817 func rewriteValueARM_OpARMMULS_10(v *Value) bool { 9818 b := v.Block 9819 _ = b 9820 // match: (MULS (MOVWconst [c]) x a) 9821 // cond: int32(c) == -1 9822 // result: (ADD a x) 9823 for { 9824 _ = v.Args[2] 9825 v_0 := v.Args[0] 9826 if v_0.Op != OpARMMOVWconst { 9827 break 9828 } 9829 c := v_0.AuxInt 9830 x := v.Args[1] 9831 a := v.Args[2] 9832 if !(int32(c) == -1) { 9833 break 9834 } 9835 v.reset(OpARMADD) 9836 v.AddArg(a) 9837 v.AddArg(x) 9838 return true 9839 } 9840 // match: (MULS (MOVWconst [0]) _ a) 9841 // cond: 9842 // result: a 9843 for { 9844 _ = v.Args[2] 9845 v_0 := v.Args[0] 9846 if v_0.Op != OpARMMOVWconst { 9847 break 9848 } 9849 if v_0.AuxInt != 0 { 9850 break 9851 } 9852 a := v.Args[2] 9853 v.reset(OpCopy) 9854 v.Type = a.Type 9855 v.AddArg(a) 9856 return true 9857 } 9858 // match: (MULS (MOVWconst [1]) x a) 9859 // cond: 9860 // result: (RSB x a) 9861 for { 9862 _ = v.Args[2] 9863 v_0 := v.Args[0] 9864 if v_0.Op != OpARMMOVWconst { 9865 break 9866 } 9867 if v_0.AuxInt != 1 { 9868 break 9869 } 9870 x := v.Args[1] 9871 a := v.Args[2] 9872 v.reset(OpARMRSB) 9873 v.AddArg(x) 9874 v.AddArg(a) 9875 return true 9876 } 9877 // match: (MULS (MOVWconst [c]) x a) 9878 // cond: isPowerOfTwo(c) 9879 // result: (RSB (SLLconst <x.Type> [log2(c)] x) a) 9880 for { 9881 _ = v.Args[2] 9882 v_0 := v.Args[0] 9883 if v_0.Op != OpARMMOVWconst { 9884 break 9885 } 9886 c := v_0.AuxInt 9887 x := v.Args[1] 9888 a := v.Args[2] 9889 if !(isPowerOfTwo(c)) { 9890 break 9891 } 9892 v.reset(OpARMRSB) 9893 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9894 v0.AuxInt = log2(c) 9895 v0.AddArg(x) 9896 v.AddArg(v0) 9897 v.AddArg(a) 9898 return true 9899 } 9900 // match: (MULS (MOVWconst [c]) x a) 9901 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9902 // result: (RSB (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 9903 for { 9904 _ = v.Args[2] 9905 v_0 := v.Args[0] 9906 if v_0.Op != OpARMMOVWconst { 9907 break 9908 } 9909 c := v_0.AuxInt 9910 x := v.Args[1] 9911 a := v.Args[2] 9912 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9913 break 9914 } 9915 v.reset(OpARMRSB) 9916 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9917 v0.AuxInt = log2(c - 1) 9918 v0.AddArg(x) 9919 v0.AddArg(x) 9920 v.AddArg(v0) 9921 v.AddArg(a) 9922 return true 9923 } 9924 // match: (MULS (MOVWconst [c]) x a) 9925 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9926 // result: (RSB (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 9927 for { 9928 _ = v.Args[2] 9929 v_0 := v.Args[0] 9930 if v_0.Op != OpARMMOVWconst { 9931 break 9932 } 9933 c := v_0.AuxInt 9934 x := v.Args[1] 9935 a := v.Args[2] 9936 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9937 break 9938 } 9939 v.reset(OpARMRSB) 9940 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9941 v0.AuxInt = log2(c + 1) 9942 v0.AddArg(x) 9943 v0.AddArg(x) 9944 v.AddArg(v0) 9945 v.AddArg(a) 9946 return true 9947 } 9948 // match: (MULS (MOVWconst [c]) x a) 9949 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9950 // result: (RSB (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 9951 for { 9952 _ = v.Args[2] 9953 v_0 := v.Args[0] 9954 if v_0.Op != OpARMMOVWconst { 9955 break 9956 } 9957 c := v_0.AuxInt 9958 x := v.Args[1] 9959 a := v.Args[2] 9960 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9961 break 9962 } 9963 v.reset(OpARMRSB) 9964 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9965 v0.AuxInt = log2(c / 3) 9966 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9967 v1.AuxInt = 1 9968 v1.AddArg(x) 9969 v1.AddArg(x) 9970 v0.AddArg(v1) 9971 v.AddArg(v0) 9972 v.AddArg(a) 9973 return true 9974 } 9975 // match: (MULS (MOVWconst [c]) x a) 9976 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9977 // result: (RSB (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 9978 for { 9979 _ = v.Args[2] 9980 v_0 := v.Args[0] 9981 if v_0.Op != OpARMMOVWconst { 9982 break 9983 } 9984 c := v_0.AuxInt 9985 x := v.Args[1] 9986 a := v.Args[2] 9987 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9988 break 9989 } 9990 v.reset(OpARMRSB) 9991 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9992 v0.AuxInt = log2(c / 5) 9993 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9994 v1.AuxInt = 2 9995 v1.AddArg(x) 9996 v1.AddArg(x) 9997 v0.AddArg(v1) 9998 v.AddArg(v0) 9999 v.AddArg(a) 10000 return true 10001 } 10002 // match: (MULS (MOVWconst [c]) x a) 10003 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10004 // result: (RSB (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10005 for { 10006 _ = v.Args[2] 10007 v_0 := v.Args[0] 10008 if v_0.Op != OpARMMOVWconst { 10009 break 10010 } 10011 c := v_0.AuxInt 10012 x := v.Args[1] 10013 a := v.Args[2] 10014 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10015 break 10016 } 10017 v.reset(OpARMRSB) 10018 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10019 v0.AuxInt = log2(c / 7) 10020 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10021 v1.AuxInt = 3 10022 v1.AddArg(x) 10023 v1.AddArg(x) 10024 v0.AddArg(v1) 10025 v.AddArg(v0) 10026 v.AddArg(a) 10027 return true 10028 } 10029 // match: (MULS (MOVWconst [c]) x a) 10030 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10031 // result: (RSB (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10032 for { 10033 _ = v.Args[2] 10034 v_0 := v.Args[0] 10035 if v_0.Op != OpARMMOVWconst { 10036 break 10037 } 10038 c := v_0.AuxInt 10039 x := v.Args[1] 10040 a := v.Args[2] 10041 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10042 break 10043 } 10044 v.reset(OpARMRSB) 10045 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10046 v0.AuxInt = log2(c / 9) 10047 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10048 v1.AuxInt = 3 10049 v1.AddArg(x) 10050 v1.AddArg(x) 10051 v0.AddArg(v1) 10052 v.AddArg(v0) 10053 v.AddArg(a) 10054 return true 10055 } 10056 return false 10057 } 10058 func rewriteValueARM_OpARMMVN_0(v *Value) bool { 10059 // match: (MVN (MOVWconst [c])) 10060 // cond: 10061 // result: (MOVWconst [^c]) 10062 for { 10063 v_0 := v.Args[0] 10064 if v_0.Op != OpARMMOVWconst { 10065 break 10066 } 10067 c := v_0.AuxInt 10068 v.reset(OpARMMOVWconst) 10069 v.AuxInt = ^c 10070 return true 10071 } 10072 // match: (MVN (SLLconst [c] x)) 10073 // cond: 10074 // result: (MVNshiftLL x [c]) 10075 for { 10076 v_0 := v.Args[0] 10077 if v_0.Op != OpARMSLLconst { 10078 break 10079 } 10080 c := v_0.AuxInt 10081 x := v_0.Args[0] 10082 v.reset(OpARMMVNshiftLL) 10083 v.AuxInt = c 10084 v.AddArg(x) 10085 return true 10086 } 10087 // match: (MVN (SRLconst [c] x)) 10088 // cond: 10089 // result: (MVNshiftRL x [c]) 10090 for { 10091 v_0 := v.Args[0] 10092 if v_0.Op != OpARMSRLconst { 10093 break 10094 } 10095 c := v_0.AuxInt 10096 x := v_0.Args[0] 10097 v.reset(OpARMMVNshiftRL) 10098 v.AuxInt = c 10099 v.AddArg(x) 10100 return true 10101 } 10102 // match: (MVN (SRAconst [c] x)) 10103 // cond: 10104 // result: (MVNshiftRA x [c]) 10105 for { 10106 v_0 := v.Args[0] 10107 if v_0.Op != OpARMSRAconst { 10108 break 10109 } 10110 c := v_0.AuxInt 10111 x := v_0.Args[0] 10112 v.reset(OpARMMVNshiftRA) 10113 v.AuxInt = c 10114 v.AddArg(x) 10115 return true 10116 } 10117 // match: (MVN (SLL x y)) 10118 // cond: 10119 // result: (MVNshiftLLreg x y) 10120 for { 10121 v_0 := v.Args[0] 10122 if v_0.Op != OpARMSLL { 10123 break 10124 } 10125 _ = v_0.Args[1] 10126 x := v_0.Args[0] 10127 y := v_0.Args[1] 10128 v.reset(OpARMMVNshiftLLreg) 10129 v.AddArg(x) 10130 v.AddArg(y) 10131 return true 10132 } 10133 // match: (MVN (SRL x y)) 10134 // cond: 10135 // result: (MVNshiftRLreg x y) 10136 for { 10137 v_0 := v.Args[0] 10138 if v_0.Op != OpARMSRL { 10139 break 10140 } 10141 _ = v_0.Args[1] 10142 x := v_0.Args[0] 10143 y := v_0.Args[1] 10144 v.reset(OpARMMVNshiftRLreg) 10145 v.AddArg(x) 10146 v.AddArg(y) 10147 return true 10148 } 10149 // match: (MVN (SRA x y)) 10150 // cond: 10151 // result: (MVNshiftRAreg x y) 10152 for { 10153 v_0 := v.Args[0] 10154 if v_0.Op != OpARMSRA { 10155 break 10156 } 10157 _ = v_0.Args[1] 10158 x := v_0.Args[0] 10159 y := v_0.Args[1] 10160 v.reset(OpARMMVNshiftRAreg) 10161 v.AddArg(x) 10162 v.AddArg(y) 10163 return true 10164 } 10165 return false 10166 } 10167 func rewriteValueARM_OpARMMVNshiftLL_0(v *Value) bool { 10168 // match: (MVNshiftLL (MOVWconst [c]) [d]) 10169 // cond: 10170 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 10171 for { 10172 d := v.AuxInt 10173 v_0 := v.Args[0] 10174 if v_0.Op != OpARMMOVWconst { 10175 break 10176 } 10177 c := v_0.AuxInt 10178 v.reset(OpARMMOVWconst) 10179 v.AuxInt = ^int64(uint32(c) << uint64(d)) 10180 return true 10181 } 10182 return false 10183 } 10184 func rewriteValueARM_OpARMMVNshiftLLreg_0(v *Value) bool { 10185 // match: (MVNshiftLLreg x (MOVWconst [c])) 10186 // cond: 10187 // result: (MVNshiftLL x [c]) 10188 for { 10189 _ = v.Args[1] 10190 x := v.Args[0] 10191 v_1 := v.Args[1] 10192 if v_1.Op != OpARMMOVWconst { 10193 break 10194 } 10195 c := v_1.AuxInt 10196 v.reset(OpARMMVNshiftLL) 10197 v.AuxInt = c 10198 v.AddArg(x) 10199 return true 10200 } 10201 return false 10202 } 10203 func rewriteValueARM_OpARMMVNshiftRA_0(v *Value) bool { 10204 // match: (MVNshiftRA (MOVWconst [c]) [d]) 10205 // cond: 10206 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 10207 for { 10208 d := v.AuxInt 10209 v_0 := v.Args[0] 10210 if v_0.Op != OpARMMOVWconst { 10211 break 10212 } 10213 c := v_0.AuxInt 10214 v.reset(OpARMMOVWconst) 10215 v.AuxInt = ^int64(int32(c) >> uint64(d)) 10216 return true 10217 } 10218 return false 10219 } 10220 func rewriteValueARM_OpARMMVNshiftRAreg_0(v *Value) bool { 10221 // match: (MVNshiftRAreg x (MOVWconst [c])) 10222 // cond: 10223 // result: (MVNshiftRA x [c]) 10224 for { 10225 _ = v.Args[1] 10226 x := v.Args[0] 10227 v_1 := v.Args[1] 10228 if v_1.Op != OpARMMOVWconst { 10229 break 10230 } 10231 c := v_1.AuxInt 10232 v.reset(OpARMMVNshiftRA) 10233 v.AuxInt = c 10234 v.AddArg(x) 10235 return true 10236 } 10237 return false 10238 } 10239 func rewriteValueARM_OpARMMVNshiftRL_0(v *Value) bool { 10240 // match: (MVNshiftRL (MOVWconst [c]) [d]) 10241 // cond: 10242 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 10243 for { 10244 d := v.AuxInt 10245 v_0 := v.Args[0] 10246 if v_0.Op != OpARMMOVWconst { 10247 break 10248 } 10249 c := v_0.AuxInt 10250 v.reset(OpARMMOVWconst) 10251 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 10252 return true 10253 } 10254 return false 10255 } 10256 func rewriteValueARM_OpARMMVNshiftRLreg_0(v *Value) bool { 10257 // match: (MVNshiftRLreg x (MOVWconst [c])) 10258 // cond: 10259 // result: (MVNshiftRL x [c]) 10260 for { 10261 _ = v.Args[1] 10262 x := v.Args[0] 10263 v_1 := v.Args[1] 10264 if v_1.Op != OpARMMOVWconst { 10265 break 10266 } 10267 c := v_1.AuxInt 10268 v.reset(OpARMMVNshiftRL) 10269 v.AuxInt = c 10270 v.AddArg(x) 10271 return true 10272 } 10273 return false 10274 } 10275 func rewriteValueARM_OpARMNotEqual_0(v *Value) bool { 10276 // match: (NotEqual (FlagEQ)) 10277 // cond: 10278 // result: (MOVWconst [0]) 10279 for { 10280 v_0 := v.Args[0] 10281 if v_0.Op != OpARMFlagEQ { 10282 break 10283 } 10284 v.reset(OpARMMOVWconst) 10285 v.AuxInt = 0 10286 return true 10287 } 10288 // match: (NotEqual (FlagLT_ULT)) 10289 // cond: 10290 // result: (MOVWconst [1]) 10291 for { 10292 v_0 := v.Args[0] 10293 if v_0.Op != OpARMFlagLT_ULT { 10294 break 10295 } 10296 v.reset(OpARMMOVWconst) 10297 v.AuxInt = 1 10298 return true 10299 } 10300 // match: (NotEqual (FlagLT_UGT)) 10301 // cond: 10302 // result: (MOVWconst [1]) 10303 for { 10304 v_0 := v.Args[0] 10305 if v_0.Op != OpARMFlagLT_UGT { 10306 break 10307 } 10308 v.reset(OpARMMOVWconst) 10309 v.AuxInt = 1 10310 return true 10311 } 10312 // match: (NotEqual (FlagGT_ULT)) 10313 // cond: 10314 // result: (MOVWconst [1]) 10315 for { 10316 v_0 := v.Args[0] 10317 if v_0.Op != OpARMFlagGT_ULT { 10318 break 10319 } 10320 v.reset(OpARMMOVWconst) 10321 v.AuxInt = 1 10322 return true 10323 } 10324 // match: (NotEqual (FlagGT_UGT)) 10325 // cond: 10326 // result: (MOVWconst [1]) 10327 for { 10328 v_0 := v.Args[0] 10329 if v_0.Op != OpARMFlagGT_UGT { 10330 break 10331 } 10332 v.reset(OpARMMOVWconst) 10333 v.AuxInt = 1 10334 return true 10335 } 10336 // match: (NotEqual (InvertFlags x)) 10337 // cond: 10338 // result: (NotEqual x) 10339 for { 10340 v_0 := v.Args[0] 10341 if v_0.Op != OpARMInvertFlags { 10342 break 10343 } 10344 x := v_0.Args[0] 10345 v.reset(OpARMNotEqual) 10346 v.AddArg(x) 10347 return true 10348 } 10349 return false 10350 } 10351 func rewriteValueARM_OpARMOR_0(v *Value) bool { 10352 // match: (OR x (MOVWconst [c])) 10353 // cond: 10354 // result: (ORconst [c] x) 10355 for { 10356 _ = v.Args[1] 10357 x := v.Args[0] 10358 v_1 := v.Args[1] 10359 if v_1.Op != OpARMMOVWconst { 10360 break 10361 } 10362 c := v_1.AuxInt 10363 v.reset(OpARMORconst) 10364 v.AuxInt = c 10365 v.AddArg(x) 10366 return true 10367 } 10368 // match: (OR (MOVWconst [c]) x) 10369 // cond: 10370 // result: (ORconst [c] x) 10371 for { 10372 _ = v.Args[1] 10373 v_0 := v.Args[0] 10374 if v_0.Op != OpARMMOVWconst { 10375 break 10376 } 10377 c := v_0.AuxInt 10378 x := v.Args[1] 10379 v.reset(OpARMORconst) 10380 v.AuxInt = c 10381 v.AddArg(x) 10382 return true 10383 } 10384 // match: (OR x (SLLconst [c] y)) 10385 // cond: 10386 // result: (ORshiftLL x y [c]) 10387 for { 10388 _ = v.Args[1] 10389 x := v.Args[0] 10390 v_1 := v.Args[1] 10391 if v_1.Op != OpARMSLLconst { 10392 break 10393 } 10394 c := v_1.AuxInt 10395 y := v_1.Args[0] 10396 v.reset(OpARMORshiftLL) 10397 v.AuxInt = c 10398 v.AddArg(x) 10399 v.AddArg(y) 10400 return true 10401 } 10402 // match: (OR (SLLconst [c] y) x) 10403 // cond: 10404 // result: (ORshiftLL x y [c]) 10405 for { 10406 _ = v.Args[1] 10407 v_0 := v.Args[0] 10408 if v_0.Op != OpARMSLLconst { 10409 break 10410 } 10411 c := v_0.AuxInt 10412 y := v_0.Args[0] 10413 x := v.Args[1] 10414 v.reset(OpARMORshiftLL) 10415 v.AuxInt = c 10416 v.AddArg(x) 10417 v.AddArg(y) 10418 return true 10419 } 10420 // match: (OR x (SRLconst [c] y)) 10421 // cond: 10422 // result: (ORshiftRL x y [c]) 10423 for { 10424 _ = v.Args[1] 10425 x := v.Args[0] 10426 v_1 := v.Args[1] 10427 if v_1.Op != OpARMSRLconst { 10428 break 10429 } 10430 c := v_1.AuxInt 10431 y := v_1.Args[0] 10432 v.reset(OpARMORshiftRL) 10433 v.AuxInt = c 10434 v.AddArg(x) 10435 v.AddArg(y) 10436 return true 10437 } 10438 // match: (OR (SRLconst [c] y) x) 10439 // cond: 10440 // result: (ORshiftRL x y [c]) 10441 for { 10442 _ = v.Args[1] 10443 v_0 := v.Args[0] 10444 if v_0.Op != OpARMSRLconst { 10445 break 10446 } 10447 c := v_0.AuxInt 10448 y := v_0.Args[0] 10449 x := v.Args[1] 10450 v.reset(OpARMORshiftRL) 10451 v.AuxInt = c 10452 v.AddArg(x) 10453 v.AddArg(y) 10454 return true 10455 } 10456 // match: (OR x (SRAconst [c] y)) 10457 // cond: 10458 // result: (ORshiftRA x y [c]) 10459 for { 10460 _ = v.Args[1] 10461 x := v.Args[0] 10462 v_1 := v.Args[1] 10463 if v_1.Op != OpARMSRAconst { 10464 break 10465 } 10466 c := v_1.AuxInt 10467 y := v_1.Args[0] 10468 v.reset(OpARMORshiftRA) 10469 v.AuxInt = c 10470 v.AddArg(x) 10471 v.AddArg(y) 10472 return true 10473 } 10474 // match: (OR (SRAconst [c] y) x) 10475 // cond: 10476 // result: (ORshiftRA x y [c]) 10477 for { 10478 _ = v.Args[1] 10479 v_0 := v.Args[0] 10480 if v_0.Op != OpARMSRAconst { 10481 break 10482 } 10483 c := v_0.AuxInt 10484 y := v_0.Args[0] 10485 x := v.Args[1] 10486 v.reset(OpARMORshiftRA) 10487 v.AuxInt = c 10488 v.AddArg(x) 10489 v.AddArg(y) 10490 return true 10491 } 10492 // match: (OR x (SLL y z)) 10493 // cond: 10494 // result: (ORshiftLLreg x y z) 10495 for { 10496 _ = v.Args[1] 10497 x := v.Args[0] 10498 v_1 := v.Args[1] 10499 if v_1.Op != OpARMSLL { 10500 break 10501 } 10502 _ = v_1.Args[1] 10503 y := v_1.Args[0] 10504 z := v_1.Args[1] 10505 v.reset(OpARMORshiftLLreg) 10506 v.AddArg(x) 10507 v.AddArg(y) 10508 v.AddArg(z) 10509 return true 10510 } 10511 // match: (OR (SLL y z) x) 10512 // cond: 10513 // result: (ORshiftLLreg x y z) 10514 for { 10515 _ = v.Args[1] 10516 v_0 := v.Args[0] 10517 if v_0.Op != OpARMSLL { 10518 break 10519 } 10520 _ = v_0.Args[1] 10521 y := v_0.Args[0] 10522 z := v_0.Args[1] 10523 x := v.Args[1] 10524 v.reset(OpARMORshiftLLreg) 10525 v.AddArg(x) 10526 v.AddArg(y) 10527 v.AddArg(z) 10528 return true 10529 } 10530 return false 10531 } 10532 func rewriteValueARM_OpARMOR_10(v *Value) bool { 10533 // match: (OR x (SRL y z)) 10534 // cond: 10535 // result: (ORshiftRLreg x y z) 10536 for { 10537 _ = v.Args[1] 10538 x := v.Args[0] 10539 v_1 := v.Args[1] 10540 if v_1.Op != OpARMSRL { 10541 break 10542 } 10543 _ = v_1.Args[1] 10544 y := v_1.Args[0] 10545 z := v_1.Args[1] 10546 v.reset(OpARMORshiftRLreg) 10547 v.AddArg(x) 10548 v.AddArg(y) 10549 v.AddArg(z) 10550 return true 10551 } 10552 // match: (OR (SRL y z) x) 10553 // cond: 10554 // result: (ORshiftRLreg x y z) 10555 for { 10556 _ = v.Args[1] 10557 v_0 := v.Args[0] 10558 if v_0.Op != OpARMSRL { 10559 break 10560 } 10561 _ = v_0.Args[1] 10562 y := v_0.Args[0] 10563 z := v_0.Args[1] 10564 x := v.Args[1] 10565 v.reset(OpARMORshiftRLreg) 10566 v.AddArg(x) 10567 v.AddArg(y) 10568 v.AddArg(z) 10569 return true 10570 } 10571 // match: (OR x (SRA y z)) 10572 // cond: 10573 // result: (ORshiftRAreg x y z) 10574 for { 10575 _ = v.Args[1] 10576 x := v.Args[0] 10577 v_1 := v.Args[1] 10578 if v_1.Op != OpARMSRA { 10579 break 10580 } 10581 _ = v_1.Args[1] 10582 y := v_1.Args[0] 10583 z := v_1.Args[1] 10584 v.reset(OpARMORshiftRAreg) 10585 v.AddArg(x) 10586 v.AddArg(y) 10587 v.AddArg(z) 10588 return true 10589 } 10590 // match: (OR (SRA y z) x) 10591 // cond: 10592 // result: (ORshiftRAreg x y z) 10593 for { 10594 _ = v.Args[1] 10595 v_0 := v.Args[0] 10596 if v_0.Op != OpARMSRA { 10597 break 10598 } 10599 _ = v_0.Args[1] 10600 y := v_0.Args[0] 10601 z := v_0.Args[1] 10602 x := v.Args[1] 10603 v.reset(OpARMORshiftRAreg) 10604 v.AddArg(x) 10605 v.AddArg(y) 10606 v.AddArg(z) 10607 return true 10608 } 10609 // match: (OR x x) 10610 // cond: 10611 // result: x 10612 for { 10613 _ = v.Args[1] 10614 x := v.Args[0] 10615 if x != v.Args[1] { 10616 break 10617 } 10618 v.reset(OpCopy) 10619 v.Type = x.Type 10620 v.AddArg(x) 10621 return true 10622 } 10623 return false 10624 } 10625 func rewriteValueARM_OpARMORconst_0(v *Value) bool { 10626 // match: (ORconst [0] x) 10627 // cond: 10628 // result: x 10629 for { 10630 if v.AuxInt != 0 { 10631 break 10632 } 10633 x := v.Args[0] 10634 v.reset(OpCopy) 10635 v.Type = x.Type 10636 v.AddArg(x) 10637 return true 10638 } 10639 // match: (ORconst [c] _) 10640 // cond: int32(c)==-1 10641 // result: (MOVWconst [-1]) 10642 for { 10643 c := v.AuxInt 10644 if !(int32(c) == -1) { 10645 break 10646 } 10647 v.reset(OpARMMOVWconst) 10648 v.AuxInt = -1 10649 return true 10650 } 10651 // match: (ORconst [c] (MOVWconst [d])) 10652 // cond: 10653 // result: (MOVWconst [c|d]) 10654 for { 10655 c := v.AuxInt 10656 v_0 := v.Args[0] 10657 if v_0.Op != OpARMMOVWconst { 10658 break 10659 } 10660 d := v_0.AuxInt 10661 v.reset(OpARMMOVWconst) 10662 v.AuxInt = c | d 10663 return true 10664 } 10665 // match: (ORconst [c] (ORconst [d] x)) 10666 // cond: 10667 // result: (ORconst [c|d] x) 10668 for { 10669 c := v.AuxInt 10670 v_0 := v.Args[0] 10671 if v_0.Op != OpARMORconst { 10672 break 10673 } 10674 d := v_0.AuxInt 10675 x := v_0.Args[0] 10676 v.reset(OpARMORconst) 10677 v.AuxInt = c | d 10678 v.AddArg(x) 10679 return true 10680 } 10681 return false 10682 } 10683 func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { 10684 b := v.Block 10685 _ = b 10686 // match: (ORshiftLL (MOVWconst [c]) x [d]) 10687 // cond: 10688 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 10689 for { 10690 d := v.AuxInt 10691 _ = v.Args[1] 10692 v_0 := v.Args[0] 10693 if v_0.Op != OpARMMOVWconst { 10694 break 10695 } 10696 c := v_0.AuxInt 10697 x := v.Args[1] 10698 v.reset(OpARMORconst) 10699 v.AuxInt = c 10700 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10701 v0.AuxInt = d 10702 v0.AddArg(x) 10703 v.AddArg(v0) 10704 return true 10705 } 10706 // match: (ORshiftLL x (MOVWconst [c]) [d]) 10707 // cond: 10708 // result: (ORconst x [int64(uint32(c)<<uint64(d))]) 10709 for { 10710 d := v.AuxInt 10711 _ = v.Args[1] 10712 x := v.Args[0] 10713 v_1 := v.Args[1] 10714 if v_1.Op != OpARMMOVWconst { 10715 break 10716 } 10717 c := v_1.AuxInt 10718 v.reset(OpARMORconst) 10719 v.AuxInt = int64(uint32(c) << uint64(d)) 10720 v.AddArg(x) 10721 return true 10722 } 10723 // match: (ORshiftLL [c] (SRLconst x [32-c]) x) 10724 // cond: 10725 // result: (SRRconst [32-c] x) 10726 for { 10727 c := v.AuxInt 10728 _ = v.Args[1] 10729 v_0 := v.Args[0] 10730 if v_0.Op != OpARMSRLconst { 10731 break 10732 } 10733 if v_0.AuxInt != 32-c { 10734 break 10735 } 10736 x := v_0.Args[0] 10737 if x != v.Args[1] { 10738 break 10739 } 10740 v.reset(OpARMSRRconst) 10741 v.AuxInt = 32 - c 10742 v.AddArg(x) 10743 return true 10744 } 10745 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 10746 // cond: c==d 10747 // result: y 10748 for { 10749 d := v.AuxInt 10750 _ = v.Args[1] 10751 x := v.Args[0] 10752 y := v.Args[1] 10753 if y.Op != OpARMSLLconst { 10754 break 10755 } 10756 c := y.AuxInt 10757 if x != y.Args[0] { 10758 break 10759 } 10760 if !(c == d) { 10761 break 10762 } 10763 v.reset(OpCopy) 10764 v.Type = y.Type 10765 v.AddArg(y) 10766 return true 10767 } 10768 return false 10769 } 10770 func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { 10771 b := v.Block 10772 _ = b 10773 // match: (ORshiftLLreg (MOVWconst [c]) x y) 10774 // cond: 10775 // result: (ORconst [c] (SLL <x.Type> x y)) 10776 for { 10777 _ = v.Args[2] 10778 v_0 := v.Args[0] 10779 if v_0.Op != OpARMMOVWconst { 10780 break 10781 } 10782 c := v_0.AuxInt 10783 x := v.Args[1] 10784 y := v.Args[2] 10785 v.reset(OpARMORconst) 10786 v.AuxInt = c 10787 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10788 v0.AddArg(x) 10789 v0.AddArg(y) 10790 v.AddArg(v0) 10791 return true 10792 } 10793 // match: (ORshiftLLreg x y (MOVWconst [c])) 10794 // cond: 10795 // result: (ORshiftLL x y [c]) 10796 for { 10797 _ = v.Args[2] 10798 x := v.Args[0] 10799 y := v.Args[1] 10800 v_2 := v.Args[2] 10801 if v_2.Op != OpARMMOVWconst { 10802 break 10803 } 10804 c := v_2.AuxInt 10805 v.reset(OpARMORshiftLL) 10806 v.AuxInt = c 10807 v.AddArg(x) 10808 v.AddArg(y) 10809 return true 10810 } 10811 return false 10812 } 10813 func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { 10814 b := v.Block 10815 _ = b 10816 // match: (ORshiftRA (MOVWconst [c]) x [d]) 10817 // cond: 10818 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 10819 for { 10820 d := v.AuxInt 10821 _ = v.Args[1] 10822 v_0 := v.Args[0] 10823 if v_0.Op != OpARMMOVWconst { 10824 break 10825 } 10826 c := v_0.AuxInt 10827 x := v.Args[1] 10828 v.reset(OpARMORconst) 10829 v.AuxInt = c 10830 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10831 v0.AuxInt = d 10832 v0.AddArg(x) 10833 v.AddArg(v0) 10834 return true 10835 } 10836 // match: (ORshiftRA x (MOVWconst [c]) [d]) 10837 // cond: 10838 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 10839 for { 10840 d := v.AuxInt 10841 _ = v.Args[1] 10842 x := v.Args[0] 10843 v_1 := v.Args[1] 10844 if v_1.Op != OpARMMOVWconst { 10845 break 10846 } 10847 c := v_1.AuxInt 10848 v.reset(OpARMORconst) 10849 v.AuxInt = int64(int32(c) >> uint64(d)) 10850 v.AddArg(x) 10851 return true 10852 } 10853 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 10854 // cond: c==d 10855 // result: y 10856 for { 10857 d := v.AuxInt 10858 _ = v.Args[1] 10859 x := v.Args[0] 10860 y := v.Args[1] 10861 if y.Op != OpARMSRAconst { 10862 break 10863 } 10864 c := y.AuxInt 10865 if x != y.Args[0] { 10866 break 10867 } 10868 if !(c == d) { 10869 break 10870 } 10871 v.reset(OpCopy) 10872 v.Type = y.Type 10873 v.AddArg(y) 10874 return true 10875 } 10876 return false 10877 } 10878 func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { 10879 b := v.Block 10880 _ = b 10881 // match: (ORshiftRAreg (MOVWconst [c]) x y) 10882 // cond: 10883 // result: (ORconst [c] (SRA <x.Type> x y)) 10884 for { 10885 _ = v.Args[2] 10886 v_0 := v.Args[0] 10887 if v_0.Op != OpARMMOVWconst { 10888 break 10889 } 10890 c := v_0.AuxInt 10891 x := v.Args[1] 10892 y := v.Args[2] 10893 v.reset(OpARMORconst) 10894 v.AuxInt = c 10895 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10896 v0.AddArg(x) 10897 v0.AddArg(y) 10898 v.AddArg(v0) 10899 return true 10900 } 10901 // match: (ORshiftRAreg x y (MOVWconst [c])) 10902 // cond: 10903 // result: (ORshiftRA x y [c]) 10904 for { 10905 _ = v.Args[2] 10906 x := v.Args[0] 10907 y := v.Args[1] 10908 v_2 := v.Args[2] 10909 if v_2.Op != OpARMMOVWconst { 10910 break 10911 } 10912 c := v_2.AuxInt 10913 v.reset(OpARMORshiftRA) 10914 v.AuxInt = c 10915 v.AddArg(x) 10916 v.AddArg(y) 10917 return true 10918 } 10919 return false 10920 } 10921 func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { 10922 b := v.Block 10923 _ = b 10924 // match: (ORshiftRL (MOVWconst [c]) x [d]) 10925 // cond: 10926 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 10927 for { 10928 d := v.AuxInt 10929 _ = v.Args[1] 10930 v_0 := v.Args[0] 10931 if v_0.Op != OpARMMOVWconst { 10932 break 10933 } 10934 c := v_0.AuxInt 10935 x := v.Args[1] 10936 v.reset(OpARMORconst) 10937 v.AuxInt = c 10938 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10939 v0.AuxInt = d 10940 v0.AddArg(x) 10941 v.AddArg(v0) 10942 return true 10943 } 10944 // match: (ORshiftRL x (MOVWconst [c]) [d]) 10945 // cond: 10946 // result: (ORconst x [int64(uint32(c)>>uint64(d))]) 10947 for { 10948 d := v.AuxInt 10949 _ = v.Args[1] 10950 x := v.Args[0] 10951 v_1 := v.Args[1] 10952 if v_1.Op != OpARMMOVWconst { 10953 break 10954 } 10955 c := v_1.AuxInt 10956 v.reset(OpARMORconst) 10957 v.AuxInt = int64(uint32(c) >> uint64(d)) 10958 v.AddArg(x) 10959 return true 10960 } 10961 // match: (ORshiftRL [c] (SLLconst x [32-c]) x) 10962 // cond: 10963 // result: (SRRconst [ c] x) 10964 for { 10965 c := v.AuxInt 10966 _ = v.Args[1] 10967 v_0 := v.Args[0] 10968 if v_0.Op != OpARMSLLconst { 10969 break 10970 } 10971 if v_0.AuxInt != 32-c { 10972 break 10973 } 10974 x := v_0.Args[0] 10975 if x != v.Args[1] { 10976 break 10977 } 10978 v.reset(OpARMSRRconst) 10979 v.AuxInt = c 10980 v.AddArg(x) 10981 return true 10982 } 10983 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 10984 // cond: c==d 10985 // result: y 10986 for { 10987 d := v.AuxInt 10988 _ = v.Args[1] 10989 x := v.Args[0] 10990 y := v.Args[1] 10991 if y.Op != OpARMSRLconst { 10992 break 10993 } 10994 c := y.AuxInt 10995 if x != y.Args[0] { 10996 break 10997 } 10998 if !(c == d) { 10999 break 11000 } 11001 v.reset(OpCopy) 11002 v.Type = y.Type 11003 v.AddArg(y) 11004 return true 11005 } 11006 return false 11007 } 11008 func rewriteValueARM_OpARMORshiftRLreg_0(v *Value) bool { 11009 b := v.Block 11010 _ = b 11011 // match: (ORshiftRLreg (MOVWconst [c]) x y) 11012 // cond: 11013 // result: (ORconst [c] (SRL <x.Type> x y)) 11014 for { 11015 _ = v.Args[2] 11016 v_0 := v.Args[0] 11017 if v_0.Op != OpARMMOVWconst { 11018 break 11019 } 11020 c := v_0.AuxInt 11021 x := v.Args[1] 11022 y := v.Args[2] 11023 v.reset(OpARMORconst) 11024 v.AuxInt = c 11025 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11026 v0.AddArg(x) 11027 v0.AddArg(y) 11028 v.AddArg(v0) 11029 return true 11030 } 11031 // match: (ORshiftRLreg x y (MOVWconst [c])) 11032 // cond: 11033 // result: (ORshiftRL x y [c]) 11034 for { 11035 _ = v.Args[2] 11036 x := v.Args[0] 11037 y := v.Args[1] 11038 v_2 := v.Args[2] 11039 if v_2.Op != OpARMMOVWconst { 11040 break 11041 } 11042 c := v_2.AuxInt 11043 v.reset(OpARMORshiftRL) 11044 v.AuxInt = c 11045 v.AddArg(x) 11046 v.AddArg(y) 11047 return true 11048 } 11049 return false 11050 } 11051 func rewriteValueARM_OpARMRSB_0(v *Value) bool { 11052 // match: (RSB (MOVWconst [c]) x) 11053 // cond: 11054 // result: (SUBconst [c] x) 11055 for { 11056 _ = v.Args[1] 11057 v_0 := v.Args[0] 11058 if v_0.Op != OpARMMOVWconst { 11059 break 11060 } 11061 c := v_0.AuxInt 11062 x := v.Args[1] 11063 v.reset(OpARMSUBconst) 11064 v.AuxInt = c 11065 v.AddArg(x) 11066 return true 11067 } 11068 // match: (RSB x (MOVWconst [c])) 11069 // cond: 11070 // result: (RSBconst [c] x) 11071 for { 11072 _ = v.Args[1] 11073 x := v.Args[0] 11074 v_1 := v.Args[1] 11075 if v_1.Op != OpARMMOVWconst { 11076 break 11077 } 11078 c := v_1.AuxInt 11079 v.reset(OpARMRSBconst) 11080 v.AuxInt = c 11081 v.AddArg(x) 11082 return true 11083 } 11084 // match: (RSB x (SLLconst [c] y)) 11085 // cond: 11086 // result: (RSBshiftLL x y [c]) 11087 for { 11088 _ = v.Args[1] 11089 x := v.Args[0] 11090 v_1 := v.Args[1] 11091 if v_1.Op != OpARMSLLconst { 11092 break 11093 } 11094 c := v_1.AuxInt 11095 y := v_1.Args[0] 11096 v.reset(OpARMRSBshiftLL) 11097 v.AuxInt = c 11098 v.AddArg(x) 11099 v.AddArg(y) 11100 return true 11101 } 11102 // match: (RSB (SLLconst [c] y) x) 11103 // cond: 11104 // result: (SUBshiftLL x y [c]) 11105 for { 11106 _ = v.Args[1] 11107 v_0 := v.Args[0] 11108 if v_0.Op != OpARMSLLconst { 11109 break 11110 } 11111 c := v_0.AuxInt 11112 y := v_0.Args[0] 11113 x := v.Args[1] 11114 v.reset(OpARMSUBshiftLL) 11115 v.AuxInt = c 11116 v.AddArg(x) 11117 v.AddArg(y) 11118 return true 11119 } 11120 // match: (RSB x (SRLconst [c] y)) 11121 // cond: 11122 // result: (RSBshiftRL x y [c]) 11123 for { 11124 _ = v.Args[1] 11125 x := v.Args[0] 11126 v_1 := v.Args[1] 11127 if v_1.Op != OpARMSRLconst { 11128 break 11129 } 11130 c := v_1.AuxInt 11131 y := v_1.Args[0] 11132 v.reset(OpARMRSBshiftRL) 11133 v.AuxInt = c 11134 v.AddArg(x) 11135 v.AddArg(y) 11136 return true 11137 } 11138 // match: (RSB (SRLconst [c] y) x) 11139 // cond: 11140 // result: (SUBshiftRL x y [c]) 11141 for { 11142 _ = v.Args[1] 11143 v_0 := v.Args[0] 11144 if v_0.Op != OpARMSRLconst { 11145 break 11146 } 11147 c := v_0.AuxInt 11148 y := v_0.Args[0] 11149 x := v.Args[1] 11150 v.reset(OpARMSUBshiftRL) 11151 v.AuxInt = c 11152 v.AddArg(x) 11153 v.AddArg(y) 11154 return true 11155 } 11156 // match: (RSB x (SRAconst [c] y)) 11157 // cond: 11158 // result: (RSBshiftRA x y [c]) 11159 for { 11160 _ = v.Args[1] 11161 x := v.Args[0] 11162 v_1 := v.Args[1] 11163 if v_1.Op != OpARMSRAconst { 11164 break 11165 } 11166 c := v_1.AuxInt 11167 y := v_1.Args[0] 11168 v.reset(OpARMRSBshiftRA) 11169 v.AuxInt = c 11170 v.AddArg(x) 11171 v.AddArg(y) 11172 return true 11173 } 11174 // match: (RSB (SRAconst [c] y) x) 11175 // cond: 11176 // result: (SUBshiftRA x y [c]) 11177 for { 11178 _ = v.Args[1] 11179 v_0 := v.Args[0] 11180 if v_0.Op != OpARMSRAconst { 11181 break 11182 } 11183 c := v_0.AuxInt 11184 y := v_0.Args[0] 11185 x := v.Args[1] 11186 v.reset(OpARMSUBshiftRA) 11187 v.AuxInt = c 11188 v.AddArg(x) 11189 v.AddArg(y) 11190 return true 11191 } 11192 // match: (RSB x (SLL y z)) 11193 // cond: 11194 // result: (RSBshiftLLreg x y z) 11195 for { 11196 _ = v.Args[1] 11197 x := v.Args[0] 11198 v_1 := v.Args[1] 11199 if v_1.Op != OpARMSLL { 11200 break 11201 } 11202 _ = v_1.Args[1] 11203 y := v_1.Args[0] 11204 z := v_1.Args[1] 11205 v.reset(OpARMRSBshiftLLreg) 11206 v.AddArg(x) 11207 v.AddArg(y) 11208 v.AddArg(z) 11209 return true 11210 } 11211 // match: (RSB (SLL y z) x) 11212 // cond: 11213 // result: (SUBshiftLLreg x y z) 11214 for { 11215 _ = v.Args[1] 11216 v_0 := v.Args[0] 11217 if v_0.Op != OpARMSLL { 11218 break 11219 } 11220 _ = v_0.Args[1] 11221 y := v_0.Args[0] 11222 z := v_0.Args[1] 11223 x := v.Args[1] 11224 v.reset(OpARMSUBshiftLLreg) 11225 v.AddArg(x) 11226 v.AddArg(y) 11227 v.AddArg(z) 11228 return true 11229 } 11230 return false 11231 } 11232 func rewriteValueARM_OpARMRSB_10(v *Value) bool { 11233 // match: (RSB x (SRL y z)) 11234 // cond: 11235 // result: (RSBshiftRLreg x y z) 11236 for { 11237 _ = v.Args[1] 11238 x := v.Args[0] 11239 v_1 := v.Args[1] 11240 if v_1.Op != OpARMSRL { 11241 break 11242 } 11243 _ = v_1.Args[1] 11244 y := v_1.Args[0] 11245 z := v_1.Args[1] 11246 v.reset(OpARMRSBshiftRLreg) 11247 v.AddArg(x) 11248 v.AddArg(y) 11249 v.AddArg(z) 11250 return true 11251 } 11252 // match: (RSB (SRL y z) x) 11253 // cond: 11254 // result: (SUBshiftRLreg x y z) 11255 for { 11256 _ = v.Args[1] 11257 v_0 := v.Args[0] 11258 if v_0.Op != OpARMSRL { 11259 break 11260 } 11261 _ = v_0.Args[1] 11262 y := v_0.Args[0] 11263 z := v_0.Args[1] 11264 x := v.Args[1] 11265 v.reset(OpARMSUBshiftRLreg) 11266 v.AddArg(x) 11267 v.AddArg(y) 11268 v.AddArg(z) 11269 return true 11270 } 11271 // match: (RSB x (SRA y z)) 11272 // cond: 11273 // result: (RSBshiftRAreg x y z) 11274 for { 11275 _ = v.Args[1] 11276 x := v.Args[0] 11277 v_1 := v.Args[1] 11278 if v_1.Op != OpARMSRA { 11279 break 11280 } 11281 _ = v_1.Args[1] 11282 y := v_1.Args[0] 11283 z := v_1.Args[1] 11284 v.reset(OpARMRSBshiftRAreg) 11285 v.AddArg(x) 11286 v.AddArg(y) 11287 v.AddArg(z) 11288 return true 11289 } 11290 // match: (RSB (SRA y z) x) 11291 // cond: 11292 // result: (SUBshiftRAreg x y z) 11293 for { 11294 _ = v.Args[1] 11295 v_0 := v.Args[0] 11296 if v_0.Op != OpARMSRA { 11297 break 11298 } 11299 _ = v_0.Args[1] 11300 y := v_0.Args[0] 11301 z := v_0.Args[1] 11302 x := v.Args[1] 11303 v.reset(OpARMSUBshiftRAreg) 11304 v.AddArg(x) 11305 v.AddArg(y) 11306 v.AddArg(z) 11307 return true 11308 } 11309 // match: (RSB x x) 11310 // cond: 11311 // result: (MOVWconst [0]) 11312 for { 11313 _ = v.Args[1] 11314 x := v.Args[0] 11315 if x != v.Args[1] { 11316 break 11317 } 11318 v.reset(OpARMMOVWconst) 11319 v.AuxInt = 0 11320 return true 11321 } 11322 // match: (RSB (MUL x y) a) 11323 // cond: objabi.GOARM == 7 11324 // result: (MULS x y a) 11325 for { 11326 _ = v.Args[1] 11327 v_0 := v.Args[0] 11328 if v_0.Op != OpARMMUL { 11329 break 11330 } 11331 _ = v_0.Args[1] 11332 x := v_0.Args[0] 11333 y := v_0.Args[1] 11334 a := v.Args[1] 11335 if !(objabi.GOARM == 7) { 11336 break 11337 } 11338 v.reset(OpARMMULS) 11339 v.AddArg(x) 11340 v.AddArg(y) 11341 v.AddArg(a) 11342 return true 11343 } 11344 return false 11345 } 11346 func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { 11347 b := v.Block 11348 _ = b 11349 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 11350 // cond: 11351 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 11352 for { 11353 d := v.AuxInt 11354 _ = v.Args[1] 11355 v_0 := v.Args[0] 11356 if v_0.Op != OpARMMOVWconst { 11357 break 11358 } 11359 c := v_0.AuxInt 11360 x := v.Args[1] 11361 v.reset(OpARMSUBSconst) 11362 v.AuxInt = c 11363 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11364 v0.AuxInt = d 11365 v0.AddArg(x) 11366 v.AddArg(v0) 11367 return true 11368 } 11369 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 11370 // cond: 11371 // result: (RSBSconst x [int64(uint32(c)<<uint64(d))]) 11372 for { 11373 d := v.AuxInt 11374 _ = v.Args[1] 11375 x := v.Args[0] 11376 v_1 := v.Args[1] 11377 if v_1.Op != OpARMMOVWconst { 11378 break 11379 } 11380 c := v_1.AuxInt 11381 v.reset(OpARMRSBSconst) 11382 v.AuxInt = int64(uint32(c) << uint64(d)) 11383 v.AddArg(x) 11384 return true 11385 } 11386 return false 11387 } 11388 func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { 11389 b := v.Block 11390 _ = b 11391 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 11392 // cond: 11393 // result: (SUBSconst [c] (SLL <x.Type> x y)) 11394 for { 11395 _ = v.Args[2] 11396 v_0 := v.Args[0] 11397 if v_0.Op != OpARMMOVWconst { 11398 break 11399 } 11400 c := v_0.AuxInt 11401 x := v.Args[1] 11402 y := v.Args[2] 11403 v.reset(OpARMSUBSconst) 11404 v.AuxInt = c 11405 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11406 v0.AddArg(x) 11407 v0.AddArg(y) 11408 v.AddArg(v0) 11409 return true 11410 } 11411 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 11412 // cond: 11413 // result: (RSBSshiftLL x y [c]) 11414 for { 11415 _ = v.Args[2] 11416 x := v.Args[0] 11417 y := v.Args[1] 11418 v_2 := v.Args[2] 11419 if v_2.Op != OpARMMOVWconst { 11420 break 11421 } 11422 c := v_2.AuxInt 11423 v.reset(OpARMRSBSshiftLL) 11424 v.AuxInt = c 11425 v.AddArg(x) 11426 v.AddArg(y) 11427 return true 11428 } 11429 return false 11430 } 11431 func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { 11432 b := v.Block 11433 _ = b 11434 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 11435 // cond: 11436 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 11437 for { 11438 d := v.AuxInt 11439 _ = v.Args[1] 11440 v_0 := v.Args[0] 11441 if v_0.Op != OpARMMOVWconst { 11442 break 11443 } 11444 c := v_0.AuxInt 11445 x := v.Args[1] 11446 v.reset(OpARMSUBSconst) 11447 v.AuxInt = c 11448 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11449 v0.AuxInt = d 11450 v0.AddArg(x) 11451 v.AddArg(v0) 11452 return true 11453 } 11454 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 11455 // cond: 11456 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 11457 for { 11458 d := v.AuxInt 11459 _ = v.Args[1] 11460 x := v.Args[0] 11461 v_1 := v.Args[1] 11462 if v_1.Op != OpARMMOVWconst { 11463 break 11464 } 11465 c := v_1.AuxInt 11466 v.reset(OpARMRSBSconst) 11467 v.AuxInt = int64(int32(c) >> uint64(d)) 11468 v.AddArg(x) 11469 return true 11470 } 11471 return false 11472 } 11473 func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { 11474 b := v.Block 11475 _ = b 11476 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 11477 // cond: 11478 // result: (SUBSconst [c] (SRA <x.Type> x y)) 11479 for { 11480 _ = v.Args[2] 11481 v_0 := v.Args[0] 11482 if v_0.Op != OpARMMOVWconst { 11483 break 11484 } 11485 c := v_0.AuxInt 11486 x := v.Args[1] 11487 y := v.Args[2] 11488 v.reset(OpARMSUBSconst) 11489 v.AuxInt = c 11490 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11491 v0.AddArg(x) 11492 v0.AddArg(y) 11493 v.AddArg(v0) 11494 return true 11495 } 11496 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 11497 // cond: 11498 // result: (RSBSshiftRA x y [c]) 11499 for { 11500 _ = v.Args[2] 11501 x := v.Args[0] 11502 y := v.Args[1] 11503 v_2 := v.Args[2] 11504 if v_2.Op != OpARMMOVWconst { 11505 break 11506 } 11507 c := v_2.AuxInt 11508 v.reset(OpARMRSBSshiftRA) 11509 v.AuxInt = c 11510 v.AddArg(x) 11511 v.AddArg(y) 11512 return true 11513 } 11514 return false 11515 } 11516 func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { 11517 b := v.Block 11518 _ = b 11519 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 11520 // cond: 11521 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 11522 for { 11523 d := v.AuxInt 11524 _ = v.Args[1] 11525 v_0 := v.Args[0] 11526 if v_0.Op != OpARMMOVWconst { 11527 break 11528 } 11529 c := v_0.AuxInt 11530 x := v.Args[1] 11531 v.reset(OpARMSUBSconst) 11532 v.AuxInt = c 11533 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11534 v0.AuxInt = d 11535 v0.AddArg(x) 11536 v.AddArg(v0) 11537 return true 11538 } 11539 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 11540 // cond: 11541 // result: (RSBSconst x [int64(uint32(c)>>uint64(d))]) 11542 for { 11543 d := v.AuxInt 11544 _ = v.Args[1] 11545 x := v.Args[0] 11546 v_1 := v.Args[1] 11547 if v_1.Op != OpARMMOVWconst { 11548 break 11549 } 11550 c := v_1.AuxInt 11551 v.reset(OpARMRSBSconst) 11552 v.AuxInt = int64(uint32(c) >> uint64(d)) 11553 v.AddArg(x) 11554 return true 11555 } 11556 return false 11557 } 11558 func rewriteValueARM_OpARMRSBSshiftRLreg_0(v *Value) bool { 11559 b := v.Block 11560 _ = b 11561 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 11562 // cond: 11563 // result: (SUBSconst [c] (SRL <x.Type> x y)) 11564 for { 11565 _ = v.Args[2] 11566 v_0 := v.Args[0] 11567 if v_0.Op != OpARMMOVWconst { 11568 break 11569 } 11570 c := v_0.AuxInt 11571 x := v.Args[1] 11572 y := v.Args[2] 11573 v.reset(OpARMSUBSconst) 11574 v.AuxInt = c 11575 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11576 v0.AddArg(x) 11577 v0.AddArg(y) 11578 v.AddArg(v0) 11579 return true 11580 } 11581 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 11582 // cond: 11583 // result: (RSBSshiftRL x y [c]) 11584 for { 11585 _ = v.Args[2] 11586 x := v.Args[0] 11587 y := v.Args[1] 11588 v_2 := v.Args[2] 11589 if v_2.Op != OpARMMOVWconst { 11590 break 11591 } 11592 c := v_2.AuxInt 11593 v.reset(OpARMRSBSshiftRL) 11594 v.AuxInt = c 11595 v.AddArg(x) 11596 v.AddArg(y) 11597 return true 11598 } 11599 return false 11600 } 11601 func rewriteValueARM_OpARMRSBconst_0(v *Value) bool { 11602 // match: (RSBconst [c] (MOVWconst [d])) 11603 // cond: 11604 // result: (MOVWconst [int64(int32(c-d))]) 11605 for { 11606 c := v.AuxInt 11607 v_0 := v.Args[0] 11608 if v_0.Op != OpARMMOVWconst { 11609 break 11610 } 11611 d := v_0.AuxInt 11612 v.reset(OpARMMOVWconst) 11613 v.AuxInt = int64(int32(c - d)) 11614 return true 11615 } 11616 // match: (RSBconst [c] (RSBconst [d] x)) 11617 // cond: 11618 // result: (ADDconst [int64(int32(c-d))] x) 11619 for { 11620 c := v.AuxInt 11621 v_0 := v.Args[0] 11622 if v_0.Op != OpARMRSBconst { 11623 break 11624 } 11625 d := v_0.AuxInt 11626 x := v_0.Args[0] 11627 v.reset(OpARMADDconst) 11628 v.AuxInt = int64(int32(c - d)) 11629 v.AddArg(x) 11630 return true 11631 } 11632 // match: (RSBconst [c] (ADDconst [d] x)) 11633 // cond: 11634 // result: (RSBconst [int64(int32(c-d))] x) 11635 for { 11636 c := v.AuxInt 11637 v_0 := v.Args[0] 11638 if v_0.Op != OpARMADDconst { 11639 break 11640 } 11641 d := v_0.AuxInt 11642 x := v_0.Args[0] 11643 v.reset(OpARMRSBconst) 11644 v.AuxInt = int64(int32(c - d)) 11645 v.AddArg(x) 11646 return true 11647 } 11648 // match: (RSBconst [c] (SUBconst [d] x)) 11649 // cond: 11650 // result: (RSBconst [int64(int32(c+d))] x) 11651 for { 11652 c := v.AuxInt 11653 v_0 := v.Args[0] 11654 if v_0.Op != OpARMSUBconst { 11655 break 11656 } 11657 d := v_0.AuxInt 11658 x := v_0.Args[0] 11659 v.reset(OpARMRSBconst) 11660 v.AuxInt = int64(int32(c + d)) 11661 v.AddArg(x) 11662 return true 11663 } 11664 return false 11665 } 11666 func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { 11667 b := v.Block 11668 _ = b 11669 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 11670 // cond: 11671 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 11672 for { 11673 d := v.AuxInt 11674 _ = v.Args[1] 11675 v_0 := v.Args[0] 11676 if v_0.Op != OpARMMOVWconst { 11677 break 11678 } 11679 c := v_0.AuxInt 11680 x := v.Args[1] 11681 v.reset(OpARMSUBconst) 11682 v.AuxInt = c 11683 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11684 v0.AuxInt = d 11685 v0.AddArg(x) 11686 v.AddArg(v0) 11687 return true 11688 } 11689 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 11690 // cond: 11691 // result: (RSBconst x [int64(uint32(c)<<uint64(d))]) 11692 for { 11693 d := v.AuxInt 11694 _ = v.Args[1] 11695 x := v.Args[0] 11696 v_1 := v.Args[1] 11697 if v_1.Op != OpARMMOVWconst { 11698 break 11699 } 11700 c := v_1.AuxInt 11701 v.reset(OpARMRSBconst) 11702 v.AuxInt = int64(uint32(c) << uint64(d)) 11703 v.AddArg(x) 11704 return true 11705 } 11706 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 11707 // cond: c==d 11708 // result: (MOVWconst [0]) 11709 for { 11710 d := v.AuxInt 11711 _ = v.Args[1] 11712 x := v.Args[0] 11713 v_1 := v.Args[1] 11714 if v_1.Op != OpARMSLLconst { 11715 break 11716 } 11717 c := v_1.AuxInt 11718 if x != v_1.Args[0] { 11719 break 11720 } 11721 if !(c == d) { 11722 break 11723 } 11724 v.reset(OpARMMOVWconst) 11725 v.AuxInt = 0 11726 return true 11727 } 11728 return false 11729 } 11730 func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { 11731 b := v.Block 11732 _ = b 11733 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 11734 // cond: 11735 // result: (SUBconst [c] (SLL <x.Type> x y)) 11736 for { 11737 _ = v.Args[2] 11738 v_0 := v.Args[0] 11739 if v_0.Op != OpARMMOVWconst { 11740 break 11741 } 11742 c := v_0.AuxInt 11743 x := v.Args[1] 11744 y := v.Args[2] 11745 v.reset(OpARMSUBconst) 11746 v.AuxInt = c 11747 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11748 v0.AddArg(x) 11749 v0.AddArg(y) 11750 v.AddArg(v0) 11751 return true 11752 } 11753 // match: (RSBshiftLLreg x y (MOVWconst [c])) 11754 // cond: 11755 // result: (RSBshiftLL x y [c]) 11756 for { 11757 _ = v.Args[2] 11758 x := v.Args[0] 11759 y := v.Args[1] 11760 v_2 := v.Args[2] 11761 if v_2.Op != OpARMMOVWconst { 11762 break 11763 } 11764 c := v_2.AuxInt 11765 v.reset(OpARMRSBshiftLL) 11766 v.AuxInt = c 11767 v.AddArg(x) 11768 v.AddArg(y) 11769 return true 11770 } 11771 return false 11772 } 11773 func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { 11774 b := v.Block 11775 _ = b 11776 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 11777 // cond: 11778 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 11779 for { 11780 d := v.AuxInt 11781 _ = v.Args[1] 11782 v_0 := v.Args[0] 11783 if v_0.Op != OpARMMOVWconst { 11784 break 11785 } 11786 c := v_0.AuxInt 11787 x := v.Args[1] 11788 v.reset(OpARMSUBconst) 11789 v.AuxInt = c 11790 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11791 v0.AuxInt = d 11792 v0.AddArg(x) 11793 v.AddArg(v0) 11794 return true 11795 } 11796 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 11797 // cond: 11798 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 11799 for { 11800 d := v.AuxInt 11801 _ = v.Args[1] 11802 x := v.Args[0] 11803 v_1 := v.Args[1] 11804 if v_1.Op != OpARMMOVWconst { 11805 break 11806 } 11807 c := v_1.AuxInt 11808 v.reset(OpARMRSBconst) 11809 v.AuxInt = int64(int32(c) >> uint64(d)) 11810 v.AddArg(x) 11811 return true 11812 } 11813 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 11814 // cond: c==d 11815 // result: (MOVWconst [0]) 11816 for { 11817 d := v.AuxInt 11818 _ = v.Args[1] 11819 x := v.Args[0] 11820 v_1 := v.Args[1] 11821 if v_1.Op != OpARMSRAconst { 11822 break 11823 } 11824 c := v_1.AuxInt 11825 if x != v_1.Args[0] { 11826 break 11827 } 11828 if !(c == d) { 11829 break 11830 } 11831 v.reset(OpARMMOVWconst) 11832 v.AuxInt = 0 11833 return true 11834 } 11835 return false 11836 } 11837 func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { 11838 b := v.Block 11839 _ = b 11840 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 11841 // cond: 11842 // result: (SUBconst [c] (SRA <x.Type> x y)) 11843 for { 11844 _ = v.Args[2] 11845 v_0 := v.Args[0] 11846 if v_0.Op != OpARMMOVWconst { 11847 break 11848 } 11849 c := v_0.AuxInt 11850 x := v.Args[1] 11851 y := v.Args[2] 11852 v.reset(OpARMSUBconst) 11853 v.AuxInt = c 11854 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11855 v0.AddArg(x) 11856 v0.AddArg(y) 11857 v.AddArg(v0) 11858 return true 11859 } 11860 // match: (RSBshiftRAreg x y (MOVWconst [c])) 11861 // cond: 11862 // result: (RSBshiftRA x y [c]) 11863 for { 11864 _ = v.Args[2] 11865 x := v.Args[0] 11866 y := v.Args[1] 11867 v_2 := v.Args[2] 11868 if v_2.Op != OpARMMOVWconst { 11869 break 11870 } 11871 c := v_2.AuxInt 11872 v.reset(OpARMRSBshiftRA) 11873 v.AuxInt = c 11874 v.AddArg(x) 11875 v.AddArg(y) 11876 return true 11877 } 11878 return false 11879 } 11880 func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { 11881 b := v.Block 11882 _ = b 11883 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 11884 // cond: 11885 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 11886 for { 11887 d := v.AuxInt 11888 _ = v.Args[1] 11889 v_0 := v.Args[0] 11890 if v_0.Op != OpARMMOVWconst { 11891 break 11892 } 11893 c := v_0.AuxInt 11894 x := v.Args[1] 11895 v.reset(OpARMSUBconst) 11896 v.AuxInt = c 11897 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11898 v0.AuxInt = d 11899 v0.AddArg(x) 11900 v.AddArg(v0) 11901 return true 11902 } 11903 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 11904 // cond: 11905 // result: (RSBconst x [int64(uint32(c)>>uint64(d))]) 11906 for { 11907 d := v.AuxInt 11908 _ = v.Args[1] 11909 x := v.Args[0] 11910 v_1 := v.Args[1] 11911 if v_1.Op != OpARMMOVWconst { 11912 break 11913 } 11914 c := v_1.AuxInt 11915 v.reset(OpARMRSBconst) 11916 v.AuxInt = int64(uint32(c) >> uint64(d)) 11917 v.AddArg(x) 11918 return true 11919 } 11920 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 11921 // cond: c==d 11922 // result: (MOVWconst [0]) 11923 for { 11924 d := v.AuxInt 11925 _ = v.Args[1] 11926 x := v.Args[0] 11927 v_1 := v.Args[1] 11928 if v_1.Op != OpARMSRLconst { 11929 break 11930 } 11931 c := v_1.AuxInt 11932 if x != v_1.Args[0] { 11933 break 11934 } 11935 if !(c == d) { 11936 break 11937 } 11938 v.reset(OpARMMOVWconst) 11939 v.AuxInt = 0 11940 return true 11941 } 11942 return false 11943 } 11944 func rewriteValueARM_OpARMRSBshiftRLreg_0(v *Value) bool { 11945 b := v.Block 11946 _ = b 11947 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 11948 // cond: 11949 // result: (SUBconst [c] (SRL <x.Type> x y)) 11950 for { 11951 _ = v.Args[2] 11952 v_0 := v.Args[0] 11953 if v_0.Op != OpARMMOVWconst { 11954 break 11955 } 11956 c := v_0.AuxInt 11957 x := v.Args[1] 11958 y := v.Args[2] 11959 v.reset(OpARMSUBconst) 11960 v.AuxInt = c 11961 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11962 v0.AddArg(x) 11963 v0.AddArg(y) 11964 v.AddArg(v0) 11965 return true 11966 } 11967 // match: (RSBshiftRLreg x y (MOVWconst [c])) 11968 // cond: 11969 // result: (RSBshiftRL x y [c]) 11970 for { 11971 _ = v.Args[2] 11972 x := v.Args[0] 11973 y := v.Args[1] 11974 v_2 := v.Args[2] 11975 if v_2.Op != OpARMMOVWconst { 11976 break 11977 } 11978 c := v_2.AuxInt 11979 v.reset(OpARMRSBshiftRL) 11980 v.AuxInt = c 11981 v.AddArg(x) 11982 v.AddArg(y) 11983 return true 11984 } 11985 return false 11986 } 11987 func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { 11988 // match: (RSCconst [c] (ADDconst [d] x) flags) 11989 // cond: 11990 // result: (RSCconst [int64(int32(c-d))] x flags) 11991 for { 11992 c := v.AuxInt 11993 _ = v.Args[1] 11994 v_0 := v.Args[0] 11995 if v_0.Op != OpARMADDconst { 11996 break 11997 } 11998 d := v_0.AuxInt 11999 x := v_0.Args[0] 12000 flags := v.Args[1] 12001 v.reset(OpARMRSCconst) 12002 v.AuxInt = int64(int32(c - d)) 12003 v.AddArg(x) 12004 v.AddArg(flags) 12005 return true 12006 } 12007 // match: (RSCconst [c] (SUBconst [d] x) flags) 12008 // cond: 12009 // result: (RSCconst [int64(int32(c+d))] x flags) 12010 for { 12011 c := v.AuxInt 12012 _ = v.Args[1] 12013 v_0 := v.Args[0] 12014 if v_0.Op != OpARMSUBconst { 12015 break 12016 } 12017 d := v_0.AuxInt 12018 x := v_0.Args[0] 12019 flags := v.Args[1] 12020 v.reset(OpARMRSCconst) 12021 v.AuxInt = int64(int32(c + d)) 12022 v.AddArg(x) 12023 v.AddArg(flags) 12024 return true 12025 } 12026 return false 12027 } 12028 func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { 12029 b := v.Block 12030 _ = b 12031 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 12032 // cond: 12033 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 12034 for { 12035 d := v.AuxInt 12036 _ = v.Args[2] 12037 v_0 := v.Args[0] 12038 if v_0.Op != OpARMMOVWconst { 12039 break 12040 } 12041 c := v_0.AuxInt 12042 x := v.Args[1] 12043 flags := v.Args[2] 12044 v.reset(OpARMSBCconst) 12045 v.AuxInt = c 12046 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12047 v0.AuxInt = d 12048 v0.AddArg(x) 12049 v.AddArg(v0) 12050 v.AddArg(flags) 12051 return true 12052 } 12053 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 12054 // cond: 12055 // result: (RSCconst x [int64(uint32(c)<<uint64(d))] flags) 12056 for { 12057 d := v.AuxInt 12058 _ = v.Args[2] 12059 x := v.Args[0] 12060 v_1 := v.Args[1] 12061 if v_1.Op != OpARMMOVWconst { 12062 break 12063 } 12064 c := v_1.AuxInt 12065 flags := v.Args[2] 12066 v.reset(OpARMRSCconst) 12067 v.AuxInt = int64(uint32(c) << uint64(d)) 12068 v.AddArg(x) 12069 v.AddArg(flags) 12070 return true 12071 } 12072 return false 12073 } 12074 func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { 12075 b := v.Block 12076 _ = b 12077 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 12078 // cond: 12079 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 12080 for { 12081 _ = v.Args[3] 12082 v_0 := v.Args[0] 12083 if v_0.Op != OpARMMOVWconst { 12084 break 12085 } 12086 c := v_0.AuxInt 12087 x := v.Args[1] 12088 y := v.Args[2] 12089 flags := v.Args[3] 12090 v.reset(OpARMSBCconst) 12091 v.AuxInt = c 12092 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12093 v0.AddArg(x) 12094 v0.AddArg(y) 12095 v.AddArg(v0) 12096 v.AddArg(flags) 12097 return true 12098 } 12099 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 12100 // cond: 12101 // result: (RSCshiftLL x y [c] flags) 12102 for { 12103 _ = v.Args[3] 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 flags := v.Args[3] 12112 v.reset(OpARMRSCshiftLL) 12113 v.AuxInt = c 12114 v.AddArg(x) 12115 v.AddArg(y) 12116 v.AddArg(flags) 12117 return true 12118 } 12119 return false 12120 } 12121 func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { 12122 b := v.Block 12123 _ = b 12124 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 12125 // cond: 12126 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 12127 for { 12128 d := v.AuxInt 12129 _ = v.Args[2] 12130 v_0 := v.Args[0] 12131 if v_0.Op != OpARMMOVWconst { 12132 break 12133 } 12134 c := v_0.AuxInt 12135 x := v.Args[1] 12136 flags := v.Args[2] 12137 v.reset(OpARMSBCconst) 12138 v.AuxInt = c 12139 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12140 v0.AuxInt = d 12141 v0.AddArg(x) 12142 v.AddArg(v0) 12143 v.AddArg(flags) 12144 return true 12145 } 12146 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 12147 // cond: 12148 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 12149 for { 12150 d := v.AuxInt 12151 _ = v.Args[2] 12152 x := v.Args[0] 12153 v_1 := v.Args[1] 12154 if v_1.Op != OpARMMOVWconst { 12155 break 12156 } 12157 c := v_1.AuxInt 12158 flags := v.Args[2] 12159 v.reset(OpARMRSCconst) 12160 v.AuxInt = int64(int32(c) >> uint64(d)) 12161 v.AddArg(x) 12162 v.AddArg(flags) 12163 return true 12164 } 12165 return false 12166 } 12167 func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { 12168 b := v.Block 12169 _ = b 12170 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 12171 // cond: 12172 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 12173 for { 12174 _ = v.Args[3] 12175 v_0 := v.Args[0] 12176 if v_0.Op != OpARMMOVWconst { 12177 break 12178 } 12179 c := v_0.AuxInt 12180 x := v.Args[1] 12181 y := v.Args[2] 12182 flags := v.Args[3] 12183 v.reset(OpARMSBCconst) 12184 v.AuxInt = c 12185 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12186 v0.AddArg(x) 12187 v0.AddArg(y) 12188 v.AddArg(v0) 12189 v.AddArg(flags) 12190 return true 12191 } 12192 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 12193 // cond: 12194 // result: (RSCshiftRA x y [c] flags) 12195 for { 12196 _ = v.Args[3] 12197 x := v.Args[0] 12198 y := v.Args[1] 12199 v_2 := v.Args[2] 12200 if v_2.Op != OpARMMOVWconst { 12201 break 12202 } 12203 c := v_2.AuxInt 12204 flags := v.Args[3] 12205 v.reset(OpARMRSCshiftRA) 12206 v.AuxInt = c 12207 v.AddArg(x) 12208 v.AddArg(y) 12209 v.AddArg(flags) 12210 return true 12211 } 12212 return false 12213 } 12214 func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { 12215 b := v.Block 12216 _ = b 12217 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 12218 // cond: 12219 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 12220 for { 12221 d := v.AuxInt 12222 _ = v.Args[2] 12223 v_0 := v.Args[0] 12224 if v_0.Op != OpARMMOVWconst { 12225 break 12226 } 12227 c := v_0.AuxInt 12228 x := v.Args[1] 12229 flags := v.Args[2] 12230 v.reset(OpARMSBCconst) 12231 v.AuxInt = c 12232 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12233 v0.AuxInt = d 12234 v0.AddArg(x) 12235 v.AddArg(v0) 12236 v.AddArg(flags) 12237 return true 12238 } 12239 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 12240 // cond: 12241 // result: (RSCconst x [int64(uint32(c)>>uint64(d))] flags) 12242 for { 12243 d := v.AuxInt 12244 _ = v.Args[2] 12245 x := v.Args[0] 12246 v_1 := v.Args[1] 12247 if v_1.Op != OpARMMOVWconst { 12248 break 12249 } 12250 c := v_1.AuxInt 12251 flags := v.Args[2] 12252 v.reset(OpARMRSCconst) 12253 v.AuxInt = int64(uint32(c) >> uint64(d)) 12254 v.AddArg(x) 12255 v.AddArg(flags) 12256 return true 12257 } 12258 return false 12259 } 12260 func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { 12261 b := v.Block 12262 _ = b 12263 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 12264 // cond: 12265 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 12266 for { 12267 _ = v.Args[3] 12268 v_0 := v.Args[0] 12269 if v_0.Op != OpARMMOVWconst { 12270 break 12271 } 12272 c := v_0.AuxInt 12273 x := v.Args[1] 12274 y := v.Args[2] 12275 flags := v.Args[3] 12276 v.reset(OpARMSBCconst) 12277 v.AuxInt = c 12278 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12279 v0.AddArg(x) 12280 v0.AddArg(y) 12281 v.AddArg(v0) 12282 v.AddArg(flags) 12283 return true 12284 } 12285 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 12286 // cond: 12287 // result: (RSCshiftRL x y [c] flags) 12288 for { 12289 _ = v.Args[3] 12290 x := v.Args[0] 12291 y := v.Args[1] 12292 v_2 := v.Args[2] 12293 if v_2.Op != OpARMMOVWconst { 12294 break 12295 } 12296 c := v_2.AuxInt 12297 flags := v.Args[3] 12298 v.reset(OpARMRSCshiftRL) 12299 v.AuxInt = c 12300 v.AddArg(x) 12301 v.AddArg(y) 12302 v.AddArg(flags) 12303 return true 12304 } 12305 return false 12306 } 12307 func rewriteValueARM_OpARMSBC_0(v *Value) bool { 12308 // match: (SBC (MOVWconst [c]) x flags) 12309 // cond: 12310 // result: (RSCconst [c] x flags) 12311 for { 12312 _ = v.Args[2] 12313 v_0 := v.Args[0] 12314 if v_0.Op != OpARMMOVWconst { 12315 break 12316 } 12317 c := v_0.AuxInt 12318 x := v.Args[1] 12319 flags := v.Args[2] 12320 v.reset(OpARMRSCconst) 12321 v.AuxInt = c 12322 v.AddArg(x) 12323 v.AddArg(flags) 12324 return true 12325 } 12326 // match: (SBC x (MOVWconst [c]) flags) 12327 // cond: 12328 // result: (SBCconst [c] x flags) 12329 for { 12330 _ = v.Args[2] 12331 x := v.Args[0] 12332 v_1 := v.Args[1] 12333 if v_1.Op != OpARMMOVWconst { 12334 break 12335 } 12336 c := v_1.AuxInt 12337 flags := v.Args[2] 12338 v.reset(OpARMSBCconst) 12339 v.AuxInt = c 12340 v.AddArg(x) 12341 v.AddArg(flags) 12342 return true 12343 } 12344 // match: (SBC x (SLLconst [c] y) flags) 12345 // cond: 12346 // result: (SBCshiftLL x y [c] flags) 12347 for { 12348 _ = v.Args[2] 12349 x := v.Args[0] 12350 v_1 := v.Args[1] 12351 if v_1.Op != OpARMSLLconst { 12352 break 12353 } 12354 c := v_1.AuxInt 12355 y := v_1.Args[0] 12356 flags := v.Args[2] 12357 v.reset(OpARMSBCshiftLL) 12358 v.AuxInt = c 12359 v.AddArg(x) 12360 v.AddArg(y) 12361 v.AddArg(flags) 12362 return true 12363 } 12364 // match: (SBC (SLLconst [c] y) x flags) 12365 // cond: 12366 // result: (RSCshiftLL x y [c] flags) 12367 for { 12368 _ = v.Args[2] 12369 v_0 := v.Args[0] 12370 if v_0.Op != OpARMSLLconst { 12371 break 12372 } 12373 c := v_0.AuxInt 12374 y := v_0.Args[0] 12375 x := v.Args[1] 12376 flags := v.Args[2] 12377 v.reset(OpARMRSCshiftLL) 12378 v.AuxInt = c 12379 v.AddArg(x) 12380 v.AddArg(y) 12381 v.AddArg(flags) 12382 return true 12383 } 12384 // match: (SBC x (SRLconst [c] y) flags) 12385 // cond: 12386 // result: (SBCshiftRL x y [c] flags) 12387 for { 12388 _ = v.Args[2] 12389 x := v.Args[0] 12390 v_1 := v.Args[1] 12391 if v_1.Op != OpARMSRLconst { 12392 break 12393 } 12394 c := v_1.AuxInt 12395 y := v_1.Args[0] 12396 flags := v.Args[2] 12397 v.reset(OpARMSBCshiftRL) 12398 v.AuxInt = c 12399 v.AddArg(x) 12400 v.AddArg(y) 12401 v.AddArg(flags) 12402 return true 12403 } 12404 // match: (SBC (SRLconst [c] y) x flags) 12405 // cond: 12406 // result: (RSCshiftRL x y [c] flags) 12407 for { 12408 _ = v.Args[2] 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 flags := v.Args[2] 12417 v.reset(OpARMRSCshiftRL) 12418 v.AuxInt = c 12419 v.AddArg(x) 12420 v.AddArg(y) 12421 v.AddArg(flags) 12422 return true 12423 } 12424 // match: (SBC x (SRAconst [c] y) flags) 12425 // cond: 12426 // result: (SBCshiftRA x y [c] flags) 12427 for { 12428 _ = v.Args[2] 12429 x := v.Args[0] 12430 v_1 := v.Args[1] 12431 if v_1.Op != OpARMSRAconst { 12432 break 12433 } 12434 c := v_1.AuxInt 12435 y := v_1.Args[0] 12436 flags := v.Args[2] 12437 v.reset(OpARMSBCshiftRA) 12438 v.AuxInt = c 12439 v.AddArg(x) 12440 v.AddArg(y) 12441 v.AddArg(flags) 12442 return true 12443 } 12444 // match: (SBC (SRAconst [c] y) x flags) 12445 // cond: 12446 // result: (RSCshiftRA x y [c] flags) 12447 for { 12448 _ = v.Args[2] 12449 v_0 := v.Args[0] 12450 if v_0.Op != OpARMSRAconst { 12451 break 12452 } 12453 c := v_0.AuxInt 12454 y := v_0.Args[0] 12455 x := v.Args[1] 12456 flags := v.Args[2] 12457 v.reset(OpARMRSCshiftRA) 12458 v.AuxInt = c 12459 v.AddArg(x) 12460 v.AddArg(y) 12461 v.AddArg(flags) 12462 return true 12463 } 12464 // match: (SBC x (SLL y z) flags) 12465 // cond: 12466 // result: (SBCshiftLLreg x y z flags) 12467 for { 12468 _ = v.Args[2] 12469 x := v.Args[0] 12470 v_1 := v.Args[1] 12471 if v_1.Op != OpARMSLL { 12472 break 12473 } 12474 _ = v_1.Args[1] 12475 y := v_1.Args[0] 12476 z := v_1.Args[1] 12477 flags := v.Args[2] 12478 v.reset(OpARMSBCshiftLLreg) 12479 v.AddArg(x) 12480 v.AddArg(y) 12481 v.AddArg(z) 12482 v.AddArg(flags) 12483 return true 12484 } 12485 // match: (SBC (SLL y z) x flags) 12486 // cond: 12487 // result: (RSCshiftLLreg x y z flags) 12488 for { 12489 _ = v.Args[2] 12490 v_0 := v.Args[0] 12491 if v_0.Op != OpARMSLL { 12492 break 12493 } 12494 _ = v_0.Args[1] 12495 y := v_0.Args[0] 12496 z := v_0.Args[1] 12497 x := v.Args[1] 12498 flags := v.Args[2] 12499 v.reset(OpARMRSCshiftLLreg) 12500 v.AddArg(x) 12501 v.AddArg(y) 12502 v.AddArg(z) 12503 v.AddArg(flags) 12504 return true 12505 } 12506 return false 12507 } 12508 func rewriteValueARM_OpARMSBC_10(v *Value) bool { 12509 // match: (SBC x (SRL y z) flags) 12510 // cond: 12511 // result: (SBCshiftRLreg x y z flags) 12512 for { 12513 _ = v.Args[2] 12514 x := v.Args[0] 12515 v_1 := v.Args[1] 12516 if v_1.Op != OpARMSRL { 12517 break 12518 } 12519 _ = v_1.Args[1] 12520 y := v_1.Args[0] 12521 z := v_1.Args[1] 12522 flags := v.Args[2] 12523 v.reset(OpARMSBCshiftRLreg) 12524 v.AddArg(x) 12525 v.AddArg(y) 12526 v.AddArg(z) 12527 v.AddArg(flags) 12528 return true 12529 } 12530 // match: (SBC (SRL y z) x flags) 12531 // cond: 12532 // result: (RSCshiftRLreg x y z flags) 12533 for { 12534 _ = v.Args[2] 12535 v_0 := v.Args[0] 12536 if v_0.Op != OpARMSRL { 12537 break 12538 } 12539 _ = v_0.Args[1] 12540 y := v_0.Args[0] 12541 z := v_0.Args[1] 12542 x := v.Args[1] 12543 flags := v.Args[2] 12544 v.reset(OpARMRSCshiftRLreg) 12545 v.AddArg(x) 12546 v.AddArg(y) 12547 v.AddArg(z) 12548 v.AddArg(flags) 12549 return true 12550 } 12551 // match: (SBC x (SRA y z) flags) 12552 // cond: 12553 // result: (SBCshiftRAreg x y z flags) 12554 for { 12555 _ = v.Args[2] 12556 x := v.Args[0] 12557 v_1 := v.Args[1] 12558 if v_1.Op != OpARMSRA { 12559 break 12560 } 12561 _ = v_1.Args[1] 12562 y := v_1.Args[0] 12563 z := v_1.Args[1] 12564 flags := v.Args[2] 12565 v.reset(OpARMSBCshiftRAreg) 12566 v.AddArg(x) 12567 v.AddArg(y) 12568 v.AddArg(z) 12569 v.AddArg(flags) 12570 return true 12571 } 12572 // match: (SBC (SRA y z) x flags) 12573 // cond: 12574 // result: (RSCshiftRAreg x y z flags) 12575 for { 12576 _ = v.Args[2] 12577 v_0 := v.Args[0] 12578 if v_0.Op != OpARMSRA { 12579 break 12580 } 12581 _ = v_0.Args[1] 12582 y := v_0.Args[0] 12583 z := v_0.Args[1] 12584 x := v.Args[1] 12585 flags := v.Args[2] 12586 v.reset(OpARMRSCshiftRAreg) 12587 v.AddArg(x) 12588 v.AddArg(y) 12589 v.AddArg(z) 12590 v.AddArg(flags) 12591 return true 12592 } 12593 return false 12594 } 12595 func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { 12596 // match: (SBCconst [c] (ADDconst [d] x) flags) 12597 // cond: 12598 // result: (SBCconst [int64(int32(c-d))] x flags) 12599 for { 12600 c := v.AuxInt 12601 _ = v.Args[1] 12602 v_0 := v.Args[0] 12603 if v_0.Op != OpARMADDconst { 12604 break 12605 } 12606 d := v_0.AuxInt 12607 x := v_0.Args[0] 12608 flags := v.Args[1] 12609 v.reset(OpARMSBCconst) 12610 v.AuxInt = int64(int32(c - d)) 12611 v.AddArg(x) 12612 v.AddArg(flags) 12613 return true 12614 } 12615 // match: (SBCconst [c] (SUBconst [d] x) flags) 12616 // cond: 12617 // result: (SBCconst [int64(int32(c+d))] x flags) 12618 for { 12619 c := v.AuxInt 12620 _ = v.Args[1] 12621 v_0 := v.Args[0] 12622 if v_0.Op != OpARMSUBconst { 12623 break 12624 } 12625 d := v_0.AuxInt 12626 x := v_0.Args[0] 12627 flags := v.Args[1] 12628 v.reset(OpARMSBCconst) 12629 v.AuxInt = int64(int32(c + d)) 12630 v.AddArg(x) 12631 v.AddArg(flags) 12632 return true 12633 } 12634 return false 12635 } 12636 func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { 12637 b := v.Block 12638 _ = b 12639 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 12640 // cond: 12641 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 12642 for { 12643 d := v.AuxInt 12644 _ = v.Args[2] 12645 v_0 := v.Args[0] 12646 if v_0.Op != OpARMMOVWconst { 12647 break 12648 } 12649 c := v_0.AuxInt 12650 x := v.Args[1] 12651 flags := v.Args[2] 12652 v.reset(OpARMRSCconst) 12653 v.AuxInt = c 12654 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12655 v0.AuxInt = d 12656 v0.AddArg(x) 12657 v.AddArg(v0) 12658 v.AddArg(flags) 12659 return true 12660 } 12661 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 12662 // cond: 12663 // result: (SBCconst x [int64(uint32(c)<<uint64(d))] flags) 12664 for { 12665 d := v.AuxInt 12666 _ = v.Args[2] 12667 x := v.Args[0] 12668 v_1 := v.Args[1] 12669 if v_1.Op != OpARMMOVWconst { 12670 break 12671 } 12672 c := v_1.AuxInt 12673 flags := v.Args[2] 12674 v.reset(OpARMSBCconst) 12675 v.AuxInt = int64(uint32(c) << uint64(d)) 12676 v.AddArg(x) 12677 v.AddArg(flags) 12678 return true 12679 } 12680 return false 12681 } 12682 func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { 12683 b := v.Block 12684 _ = b 12685 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 12686 // cond: 12687 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 12688 for { 12689 _ = v.Args[3] 12690 v_0 := v.Args[0] 12691 if v_0.Op != OpARMMOVWconst { 12692 break 12693 } 12694 c := v_0.AuxInt 12695 x := v.Args[1] 12696 y := v.Args[2] 12697 flags := v.Args[3] 12698 v.reset(OpARMRSCconst) 12699 v.AuxInt = c 12700 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12701 v0.AddArg(x) 12702 v0.AddArg(y) 12703 v.AddArg(v0) 12704 v.AddArg(flags) 12705 return true 12706 } 12707 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 12708 // cond: 12709 // result: (SBCshiftLL x y [c] flags) 12710 for { 12711 _ = v.Args[3] 12712 x := v.Args[0] 12713 y := v.Args[1] 12714 v_2 := v.Args[2] 12715 if v_2.Op != OpARMMOVWconst { 12716 break 12717 } 12718 c := v_2.AuxInt 12719 flags := v.Args[3] 12720 v.reset(OpARMSBCshiftLL) 12721 v.AuxInt = c 12722 v.AddArg(x) 12723 v.AddArg(y) 12724 v.AddArg(flags) 12725 return true 12726 } 12727 return false 12728 } 12729 func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { 12730 b := v.Block 12731 _ = b 12732 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 12733 // cond: 12734 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 12735 for { 12736 d := v.AuxInt 12737 _ = v.Args[2] 12738 v_0 := v.Args[0] 12739 if v_0.Op != OpARMMOVWconst { 12740 break 12741 } 12742 c := v_0.AuxInt 12743 x := v.Args[1] 12744 flags := v.Args[2] 12745 v.reset(OpARMRSCconst) 12746 v.AuxInt = c 12747 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12748 v0.AuxInt = d 12749 v0.AddArg(x) 12750 v.AddArg(v0) 12751 v.AddArg(flags) 12752 return true 12753 } 12754 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 12755 // cond: 12756 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 12757 for { 12758 d := v.AuxInt 12759 _ = v.Args[2] 12760 x := v.Args[0] 12761 v_1 := v.Args[1] 12762 if v_1.Op != OpARMMOVWconst { 12763 break 12764 } 12765 c := v_1.AuxInt 12766 flags := v.Args[2] 12767 v.reset(OpARMSBCconst) 12768 v.AuxInt = int64(int32(c) >> uint64(d)) 12769 v.AddArg(x) 12770 v.AddArg(flags) 12771 return true 12772 } 12773 return false 12774 } 12775 func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { 12776 b := v.Block 12777 _ = b 12778 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 12779 // cond: 12780 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 12781 for { 12782 _ = v.Args[3] 12783 v_0 := v.Args[0] 12784 if v_0.Op != OpARMMOVWconst { 12785 break 12786 } 12787 c := v_0.AuxInt 12788 x := v.Args[1] 12789 y := v.Args[2] 12790 flags := v.Args[3] 12791 v.reset(OpARMRSCconst) 12792 v.AuxInt = c 12793 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12794 v0.AddArg(x) 12795 v0.AddArg(y) 12796 v.AddArg(v0) 12797 v.AddArg(flags) 12798 return true 12799 } 12800 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 12801 // cond: 12802 // result: (SBCshiftRA x y [c] flags) 12803 for { 12804 _ = v.Args[3] 12805 x := v.Args[0] 12806 y := v.Args[1] 12807 v_2 := v.Args[2] 12808 if v_2.Op != OpARMMOVWconst { 12809 break 12810 } 12811 c := v_2.AuxInt 12812 flags := v.Args[3] 12813 v.reset(OpARMSBCshiftRA) 12814 v.AuxInt = c 12815 v.AddArg(x) 12816 v.AddArg(y) 12817 v.AddArg(flags) 12818 return true 12819 } 12820 return false 12821 } 12822 func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { 12823 b := v.Block 12824 _ = b 12825 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 12826 // cond: 12827 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 12828 for { 12829 d := v.AuxInt 12830 _ = v.Args[2] 12831 v_0 := v.Args[0] 12832 if v_0.Op != OpARMMOVWconst { 12833 break 12834 } 12835 c := v_0.AuxInt 12836 x := v.Args[1] 12837 flags := v.Args[2] 12838 v.reset(OpARMRSCconst) 12839 v.AuxInt = c 12840 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12841 v0.AuxInt = d 12842 v0.AddArg(x) 12843 v.AddArg(v0) 12844 v.AddArg(flags) 12845 return true 12846 } 12847 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 12848 // cond: 12849 // result: (SBCconst x [int64(uint32(c)>>uint64(d))] flags) 12850 for { 12851 d := v.AuxInt 12852 _ = v.Args[2] 12853 x := v.Args[0] 12854 v_1 := v.Args[1] 12855 if v_1.Op != OpARMMOVWconst { 12856 break 12857 } 12858 c := v_1.AuxInt 12859 flags := v.Args[2] 12860 v.reset(OpARMSBCconst) 12861 v.AuxInt = int64(uint32(c) >> uint64(d)) 12862 v.AddArg(x) 12863 v.AddArg(flags) 12864 return true 12865 } 12866 return false 12867 } 12868 func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { 12869 b := v.Block 12870 _ = b 12871 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 12872 // cond: 12873 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 12874 for { 12875 _ = v.Args[3] 12876 v_0 := v.Args[0] 12877 if v_0.Op != OpARMMOVWconst { 12878 break 12879 } 12880 c := v_0.AuxInt 12881 x := v.Args[1] 12882 y := v.Args[2] 12883 flags := v.Args[3] 12884 v.reset(OpARMRSCconst) 12885 v.AuxInt = c 12886 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12887 v0.AddArg(x) 12888 v0.AddArg(y) 12889 v.AddArg(v0) 12890 v.AddArg(flags) 12891 return true 12892 } 12893 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 12894 // cond: 12895 // result: (SBCshiftRL x y [c] flags) 12896 for { 12897 _ = v.Args[3] 12898 x := v.Args[0] 12899 y := v.Args[1] 12900 v_2 := v.Args[2] 12901 if v_2.Op != OpARMMOVWconst { 12902 break 12903 } 12904 c := v_2.AuxInt 12905 flags := v.Args[3] 12906 v.reset(OpARMSBCshiftRL) 12907 v.AuxInt = c 12908 v.AddArg(x) 12909 v.AddArg(y) 12910 v.AddArg(flags) 12911 return true 12912 } 12913 return false 12914 } 12915 func rewriteValueARM_OpARMSLL_0(v *Value) bool { 12916 // match: (SLL x (MOVWconst [c])) 12917 // cond: 12918 // result: (SLLconst x [c&31]) 12919 for { 12920 _ = v.Args[1] 12921 x := v.Args[0] 12922 v_1 := v.Args[1] 12923 if v_1.Op != OpARMMOVWconst { 12924 break 12925 } 12926 c := v_1.AuxInt 12927 v.reset(OpARMSLLconst) 12928 v.AuxInt = c & 31 12929 v.AddArg(x) 12930 return true 12931 } 12932 return false 12933 } 12934 func rewriteValueARM_OpARMSLLconst_0(v *Value) bool { 12935 // match: (SLLconst [c] (MOVWconst [d])) 12936 // cond: 12937 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 12938 for { 12939 c := v.AuxInt 12940 v_0 := v.Args[0] 12941 if v_0.Op != OpARMMOVWconst { 12942 break 12943 } 12944 d := v_0.AuxInt 12945 v.reset(OpARMMOVWconst) 12946 v.AuxInt = int64(uint32(d) << uint64(c)) 12947 return true 12948 } 12949 return false 12950 } 12951 func rewriteValueARM_OpARMSRA_0(v *Value) bool { 12952 // match: (SRA x (MOVWconst [c])) 12953 // cond: 12954 // result: (SRAconst x [c&31]) 12955 for { 12956 _ = v.Args[1] 12957 x := v.Args[0] 12958 v_1 := v.Args[1] 12959 if v_1.Op != OpARMMOVWconst { 12960 break 12961 } 12962 c := v_1.AuxInt 12963 v.reset(OpARMSRAconst) 12964 v.AuxInt = c & 31 12965 v.AddArg(x) 12966 return true 12967 } 12968 return false 12969 } 12970 func rewriteValueARM_OpARMSRAcond_0(v *Value) bool { 12971 // match: (SRAcond x _ (FlagEQ)) 12972 // cond: 12973 // result: (SRAconst x [31]) 12974 for { 12975 _ = v.Args[2] 12976 x := v.Args[0] 12977 v_2 := v.Args[2] 12978 if v_2.Op != OpARMFlagEQ { 12979 break 12980 } 12981 v.reset(OpARMSRAconst) 12982 v.AuxInt = 31 12983 v.AddArg(x) 12984 return true 12985 } 12986 // match: (SRAcond x y (FlagLT_ULT)) 12987 // cond: 12988 // result: (SRA x y) 12989 for { 12990 _ = v.Args[2] 12991 x := v.Args[0] 12992 y := v.Args[1] 12993 v_2 := v.Args[2] 12994 if v_2.Op != OpARMFlagLT_ULT { 12995 break 12996 } 12997 v.reset(OpARMSRA) 12998 v.AddArg(x) 12999 v.AddArg(y) 13000 return true 13001 } 13002 // match: (SRAcond x _ (FlagLT_UGT)) 13003 // cond: 13004 // result: (SRAconst x [31]) 13005 for { 13006 _ = v.Args[2] 13007 x := v.Args[0] 13008 v_2 := v.Args[2] 13009 if v_2.Op != OpARMFlagLT_UGT { 13010 break 13011 } 13012 v.reset(OpARMSRAconst) 13013 v.AuxInt = 31 13014 v.AddArg(x) 13015 return true 13016 } 13017 // match: (SRAcond x y (FlagGT_ULT)) 13018 // cond: 13019 // result: (SRA x y) 13020 for { 13021 _ = v.Args[2] 13022 x := v.Args[0] 13023 y := v.Args[1] 13024 v_2 := v.Args[2] 13025 if v_2.Op != OpARMFlagGT_ULT { 13026 break 13027 } 13028 v.reset(OpARMSRA) 13029 v.AddArg(x) 13030 v.AddArg(y) 13031 return true 13032 } 13033 // match: (SRAcond x _ (FlagGT_UGT)) 13034 // cond: 13035 // result: (SRAconst x [31]) 13036 for { 13037 _ = v.Args[2] 13038 x := v.Args[0] 13039 v_2 := v.Args[2] 13040 if v_2.Op != OpARMFlagGT_UGT { 13041 break 13042 } 13043 v.reset(OpARMSRAconst) 13044 v.AuxInt = 31 13045 v.AddArg(x) 13046 return true 13047 } 13048 return false 13049 } 13050 func rewriteValueARM_OpARMSRAconst_0(v *Value) bool { 13051 // match: (SRAconst [c] (MOVWconst [d])) 13052 // cond: 13053 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 13054 for { 13055 c := v.AuxInt 13056 v_0 := v.Args[0] 13057 if v_0.Op != OpARMMOVWconst { 13058 break 13059 } 13060 d := v_0.AuxInt 13061 v.reset(OpARMMOVWconst) 13062 v.AuxInt = int64(int32(d) >> uint64(c)) 13063 return true 13064 } 13065 return false 13066 } 13067 func rewriteValueARM_OpARMSRL_0(v *Value) bool { 13068 // match: (SRL x (MOVWconst [c])) 13069 // cond: 13070 // result: (SRLconst x [c&31]) 13071 for { 13072 _ = v.Args[1] 13073 x := v.Args[0] 13074 v_1 := v.Args[1] 13075 if v_1.Op != OpARMMOVWconst { 13076 break 13077 } 13078 c := v_1.AuxInt 13079 v.reset(OpARMSRLconst) 13080 v.AuxInt = c & 31 13081 v.AddArg(x) 13082 return true 13083 } 13084 return false 13085 } 13086 func rewriteValueARM_OpARMSRLconst_0(v *Value) bool { 13087 // match: (SRLconst [c] (MOVWconst [d])) 13088 // cond: 13089 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 13090 for { 13091 c := v.AuxInt 13092 v_0 := v.Args[0] 13093 if v_0.Op != OpARMMOVWconst { 13094 break 13095 } 13096 d := v_0.AuxInt 13097 v.reset(OpARMMOVWconst) 13098 v.AuxInt = int64(uint32(d) >> uint64(c)) 13099 return true 13100 } 13101 return false 13102 } 13103 func rewriteValueARM_OpARMSUB_0(v *Value) bool { 13104 // match: (SUB (MOVWconst [c]) x) 13105 // cond: 13106 // result: (RSBconst [c] x) 13107 for { 13108 _ = v.Args[1] 13109 v_0 := v.Args[0] 13110 if v_0.Op != OpARMMOVWconst { 13111 break 13112 } 13113 c := v_0.AuxInt 13114 x := v.Args[1] 13115 v.reset(OpARMRSBconst) 13116 v.AuxInt = c 13117 v.AddArg(x) 13118 return true 13119 } 13120 // match: (SUB x (MOVWconst [c])) 13121 // cond: 13122 // result: (SUBconst [c] x) 13123 for { 13124 _ = v.Args[1] 13125 x := v.Args[0] 13126 v_1 := v.Args[1] 13127 if v_1.Op != OpARMMOVWconst { 13128 break 13129 } 13130 c := v_1.AuxInt 13131 v.reset(OpARMSUBconst) 13132 v.AuxInt = c 13133 v.AddArg(x) 13134 return true 13135 } 13136 // match: (SUB x (SLLconst [c] y)) 13137 // cond: 13138 // result: (SUBshiftLL x y [c]) 13139 for { 13140 _ = v.Args[1] 13141 x := v.Args[0] 13142 v_1 := v.Args[1] 13143 if v_1.Op != OpARMSLLconst { 13144 break 13145 } 13146 c := v_1.AuxInt 13147 y := v_1.Args[0] 13148 v.reset(OpARMSUBshiftLL) 13149 v.AuxInt = c 13150 v.AddArg(x) 13151 v.AddArg(y) 13152 return true 13153 } 13154 // match: (SUB (SLLconst [c] y) x) 13155 // cond: 13156 // result: (RSBshiftLL x y [c]) 13157 for { 13158 _ = v.Args[1] 13159 v_0 := v.Args[0] 13160 if v_0.Op != OpARMSLLconst { 13161 break 13162 } 13163 c := v_0.AuxInt 13164 y := v_0.Args[0] 13165 x := v.Args[1] 13166 v.reset(OpARMRSBshiftLL) 13167 v.AuxInt = c 13168 v.AddArg(x) 13169 v.AddArg(y) 13170 return true 13171 } 13172 // match: (SUB x (SRLconst [c] y)) 13173 // cond: 13174 // result: (SUBshiftRL x y [c]) 13175 for { 13176 _ = v.Args[1] 13177 x := v.Args[0] 13178 v_1 := v.Args[1] 13179 if v_1.Op != OpARMSRLconst { 13180 break 13181 } 13182 c := v_1.AuxInt 13183 y := v_1.Args[0] 13184 v.reset(OpARMSUBshiftRL) 13185 v.AuxInt = c 13186 v.AddArg(x) 13187 v.AddArg(y) 13188 return true 13189 } 13190 // match: (SUB (SRLconst [c] y) x) 13191 // cond: 13192 // result: (RSBshiftRL x y [c]) 13193 for { 13194 _ = v.Args[1] 13195 v_0 := v.Args[0] 13196 if v_0.Op != OpARMSRLconst { 13197 break 13198 } 13199 c := v_0.AuxInt 13200 y := v_0.Args[0] 13201 x := v.Args[1] 13202 v.reset(OpARMRSBshiftRL) 13203 v.AuxInt = c 13204 v.AddArg(x) 13205 v.AddArg(y) 13206 return true 13207 } 13208 // match: (SUB x (SRAconst [c] y)) 13209 // cond: 13210 // result: (SUBshiftRA x y [c]) 13211 for { 13212 _ = v.Args[1] 13213 x := v.Args[0] 13214 v_1 := v.Args[1] 13215 if v_1.Op != OpARMSRAconst { 13216 break 13217 } 13218 c := v_1.AuxInt 13219 y := v_1.Args[0] 13220 v.reset(OpARMSUBshiftRA) 13221 v.AuxInt = c 13222 v.AddArg(x) 13223 v.AddArg(y) 13224 return true 13225 } 13226 // match: (SUB (SRAconst [c] y) x) 13227 // cond: 13228 // result: (RSBshiftRA x y [c]) 13229 for { 13230 _ = v.Args[1] 13231 v_0 := v.Args[0] 13232 if v_0.Op != OpARMSRAconst { 13233 break 13234 } 13235 c := v_0.AuxInt 13236 y := v_0.Args[0] 13237 x := v.Args[1] 13238 v.reset(OpARMRSBshiftRA) 13239 v.AuxInt = c 13240 v.AddArg(x) 13241 v.AddArg(y) 13242 return true 13243 } 13244 // match: (SUB x (SLL y z)) 13245 // cond: 13246 // result: (SUBshiftLLreg x y z) 13247 for { 13248 _ = v.Args[1] 13249 x := v.Args[0] 13250 v_1 := v.Args[1] 13251 if v_1.Op != OpARMSLL { 13252 break 13253 } 13254 _ = v_1.Args[1] 13255 y := v_1.Args[0] 13256 z := v_1.Args[1] 13257 v.reset(OpARMSUBshiftLLreg) 13258 v.AddArg(x) 13259 v.AddArg(y) 13260 v.AddArg(z) 13261 return true 13262 } 13263 // match: (SUB (SLL y z) x) 13264 // cond: 13265 // result: (RSBshiftLLreg x y z) 13266 for { 13267 _ = v.Args[1] 13268 v_0 := v.Args[0] 13269 if v_0.Op != OpARMSLL { 13270 break 13271 } 13272 _ = v_0.Args[1] 13273 y := v_0.Args[0] 13274 z := v_0.Args[1] 13275 x := v.Args[1] 13276 v.reset(OpARMRSBshiftLLreg) 13277 v.AddArg(x) 13278 v.AddArg(y) 13279 v.AddArg(z) 13280 return true 13281 } 13282 return false 13283 } 13284 func rewriteValueARM_OpARMSUB_10(v *Value) bool { 13285 // match: (SUB x (SRL y z)) 13286 // cond: 13287 // result: (SUBshiftRLreg x y z) 13288 for { 13289 _ = v.Args[1] 13290 x := v.Args[0] 13291 v_1 := v.Args[1] 13292 if v_1.Op != OpARMSRL { 13293 break 13294 } 13295 _ = v_1.Args[1] 13296 y := v_1.Args[0] 13297 z := v_1.Args[1] 13298 v.reset(OpARMSUBshiftRLreg) 13299 v.AddArg(x) 13300 v.AddArg(y) 13301 v.AddArg(z) 13302 return true 13303 } 13304 // match: (SUB (SRL y z) x) 13305 // cond: 13306 // result: (RSBshiftRLreg x y z) 13307 for { 13308 _ = v.Args[1] 13309 v_0 := v.Args[0] 13310 if v_0.Op != OpARMSRL { 13311 break 13312 } 13313 _ = v_0.Args[1] 13314 y := v_0.Args[0] 13315 z := v_0.Args[1] 13316 x := v.Args[1] 13317 v.reset(OpARMRSBshiftRLreg) 13318 v.AddArg(x) 13319 v.AddArg(y) 13320 v.AddArg(z) 13321 return true 13322 } 13323 // match: (SUB x (SRA y z)) 13324 // cond: 13325 // result: (SUBshiftRAreg x y z) 13326 for { 13327 _ = v.Args[1] 13328 x := v.Args[0] 13329 v_1 := v.Args[1] 13330 if v_1.Op != OpARMSRA { 13331 break 13332 } 13333 _ = v_1.Args[1] 13334 y := v_1.Args[0] 13335 z := v_1.Args[1] 13336 v.reset(OpARMSUBshiftRAreg) 13337 v.AddArg(x) 13338 v.AddArg(y) 13339 v.AddArg(z) 13340 return true 13341 } 13342 // match: (SUB (SRA y z) x) 13343 // cond: 13344 // result: (RSBshiftRAreg x y z) 13345 for { 13346 _ = v.Args[1] 13347 v_0 := v.Args[0] 13348 if v_0.Op != OpARMSRA { 13349 break 13350 } 13351 _ = v_0.Args[1] 13352 y := v_0.Args[0] 13353 z := v_0.Args[1] 13354 x := v.Args[1] 13355 v.reset(OpARMRSBshiftRAreg) 13356 v.AddArg(x) 13357 v.AddArg(y) 13358 v.AddArg(z) 13359 return true 13360 } 13361 // match: (SUB x x) 13362 // cond: 13363 // result: (MOVWconst [0]) 13364 for { 13365 _ = v.Args[1] 13366 x := v.Args[0] 13367 if x != v.Args[1] { 13368 break 13369 } 13370 v.reset(OpARMMOVWconst) 13371 v.AuxInt = 0 13372 return true 13373 } 13374 // match: (SUB a (MUL x y)) 13375 // cond: objabi.GOARM == 7 13376 // result: (MULS x y a) 13377 for { 13378 _ = v.Args[1] 13379 a := v.Args[0] 13380 v_1 := v.Args[1] 13381 if v_1.Op != OpARMMUL { 13382 break 13383 } 13384 _ = v_1.Args[1] 13385 x := v_1.Args[0] 13386 y := v_1.Args[1] 13387 if !(objabi.GOARM == 7) { 13388 break 13389 } 13390 v.reset(OpARMMULS) 13391 v.AddArg(x) 13392 v.AddArg(y) 13393 v.AddArg(a) 13394 return true 13395 } 13396 return false 13397 } 13398 func rewriteValueARM_OpARMSUBS_0(v *Value) bool { 13399 // match: (SUBS x (MOVWconst [c])) 13400 // cond: 13401 // result: (SUBSconst [c] x) 13402 for { 13403 _ = v.Args[1] 13404 x := v.Args[0] 13405 v_1 := v.Args[1] 13406 if v_1.Op != OpARMMOVWconst { 13407 break 13408 } 13409 c := v_1.AuxInt 13410 v.reset(OpARMSUBSconst) 13411 v.AuxInt = c 13412 v.AddArg(x) 13413 return true 13414 } 13415 // match: (SUBS x (SLLconst [c] y)) 13416 // cond: 13417 // result: (SUBSshiftLL x y [c]) 13418 for { 13419 _ = v.Args[1] 13420 x := v.Args[0] 13421 v_1 := v.Args[1] 13422 if v_1.Op != OpARMSLLconst { 13423 break 13424 } 13425 c := v_1.AuxInt 13426 y := v_1.Args[0] 13427 v.reset(OpARMSUBSshiftLL) 13428 v.AuxInt = c 13429 v.AddArg(x) 13430 v.AddArg(y) 13431 return true 13432 } 13433 // match: (SUBS (SLLconst [c] y) x) 13434 // cond: 13435 // result: (RSBSshiftLL x y [c]) 13436 for { 13437 _ = v.Args[1] 13438 v_0 := v.Args[0] 13439 if v_0.Op != OpARMSLLconst { 13440 break 13441 } 13442 c := v_0.AuxInt 13443 y := v_0.Args[0] 13444 x := v.Args[1] 13445 v.reset(OpARMRSBSshiftLL) 13446 v.AuxInt = c 13447 v.AddArg(x) 13448 v.AddArg(y) 13449 return true 13450 } 13451 // match: (SUBS x (SRLconst [c] y)) 13452 // cond: 13453 // result: (SUBSshiftRL x y [c]) 13454 for { 13455 _ = v.Args[1] 13456 x := v.Args[0] 13457 v_1 := v.Args[1] 13458 if v_1.Op != OpARMSRLconst { 13459 break 13460 } 13461 c := v_1.AuxInt 13462 y := v_1.Args[0] 13463 v.reset(OpARMSUBSshiftRL) 13464 v.AuxInt = c 13465 v.AddArg(x) 13466 v.AddArg(y) 13467 return true 13468 } 13469 // match: (SUBS (SRLconst [c] y) x) 13470 // cond: 13471 // result: (RSBSshiftRL x y [c]) 13472 for { 13473 _ = v.Args[1] 13474 v_0 := v.Args[0] 13475 if v_0.Op != OpARMSRLconst { 13476 break 13477 } 13478 c := v_0.AuxInt 13479 y := v_0.Args[0] 13480 x := v.Args[1] 13481 v.reset(OpARMRSBSshiftRL) 13482 v.AuxInt = c 13483 v.AddArg(x) 13484 v.AddArg(y) 13485 return true 13486 } 13487 // match: (SUBS x (SRAconst [c] y)) 13488 // cond: 13489 // result: (SUBSshiftRA x y [c]) 13490 for { 13491 _ = v.Args[1] 13492 x := v.Args[0] 13493 v_1 := v.Args[1] 13494 if v_1.Op != OpARMSRAconst { 13495 break 13496 } 13497 c := v_1.AuxInt 13498 y := v_1.Args[0] 13499 v.reset(OpARMSUBSshiftRA) 13500 v.AuxInt = c 13501 v.AddArg(x) 13502 v.AddArg(y) 13503 return true 13504 } 13505 // match: (SUBS (SRAconst [c] y) x) 13506 // cond: 13507 // result: (RSBSshiftRA x y [c]) 13508 for { 13509 _ = v.Args[1] 13510 v_0 := v.Args[0] 13511 if v_0.Op != OpARMSRAconst { 13512 break 13513 } 13514 c := v_0.AuxInt 13515 y := v_0.Args[0] 13516 x := v.Args[1] 13517 v.reset(OpARMRSBSshiftRA) 13518 v.AuxInt = c 13519 v.AddArg(x) 13520 v.AddArg(y) 13521 return true 13522 } 13523 // match: (SUBS x (SLL y z)) 13524 // cond: 13525 // result: (SUBSshiftLLreg x y z) 13526 for { 13527 _ = v.Args[1] 13528 x := v.Args[0] 13529 v_1 := v.Args[1] 13530 if v_1.Op != OpARMSLL { 13531 break 13532 } 13533 _ = v_1.Args[1] 13534 y := v_1.Args[0] 13535 z := v_1.Args[1] 13536 v.reset(OpARMSUBSshiftLLreg) 13537 v.AddArg(x) 13538 v.AddArg(y) 13539 v.AddArg(z) 13540 return true 13541 } 13542 // match: (SUBS (SLL y z) x) 13543 // cond: 13544 // result: (RSBSshiftLLreg x y z) 13545 for { 13546 _ = v.Args[1] 13547 v_0 := v.Args[0] 13548 if v_0.Op != OpARMSLL { 13549 break 13550 } 13551 _ = v_0.Args[1] 13552 y := v_0.Args[0] 13553 z := v_0.Args[1] 13554 x := v.Args[1] 13555 v.reset(OpARMRSBSshiftLLreg) 13556 v.AddArg(x) 13557 v.AddArg(y) 13558 v.AddArg(z) 13559 return true 13560 } 13561 // match: (SUBS x (SRL y z)) 13562 // cond: 13563 // result: (SUBSshiftRLreg x y z) 13564 for { 13565 _ = v.Args[1] 13566 x := v.Args[0] 13567 v_1 := v.Args[1] 13568 if v_1.Op != OpARMSRL { 13569 break 13570 } 13571 _ = v_1.Args[1] 13572 y := v_1.Args[0] 13573 z := v_1.Args[1] 13574 v.reset(OpARMSUBSshiftRLreg) 13575 v.AddArg(x) 13576 v.AddArg(y) 13577 v.AddArg(z) 13578 return true 13579 } 13580 return false 13581 } 13582 func rewriteValueARM_OpARMSUBS_10(v *Value) bool { 13583 // match: (SUBS (SRL y z) x) 13584 // cond: 13585 // result: (RSBSshiftRLreg x y z) 13586 for { 13587 _ = v.Args[1] 13588 v_0 := v.Args[0] 13589 if v_0.Op != OpARMSRL { 13590 break 13591 } 13592 _ = v_0.Args[1] 13593 y := v_0.Args[0] 13594 z := v_0.Args[1] 13595 x := v.Args[1] 13596 v.reset(OpARMRSBSshiftRLreg) 13597 v.AddArg(x) 13598 v.AddArg(y) 13599 v.AddArg(z) 13600 return true 13601 } 13602 // match: (SUBS x (SRA y z)) 13603 // cond: 13604 // result: (SUBSshiftRAreg x y z) 13605 for { 13606 _ = v.Args[1] 13607 x := v.Args[0] 13608 v_1 := v.Args[1] 13609 if v_1.Op != OpARMSRA { 13610 break 13611 } 13612 _ = v_1.Args[1] 13613 y := v_1.Args[0] 13614 z := v_1.Args[1] 13615 v.reset(OpARMSUBSshiftRAreg) 13616 v.AddArg(x) 13617 v.AddArg(y) 13618 v.AddArg(z) 13619 return true 13620 } 13621 // match: (SUBS (SRA y z) x) 13622 // cond: 13623 // result: (RSBSshiftRAreg x y z) 13624 for { 13625 _ = v.Args[1] 13626 v_0 := v.Args[0] 13627 if v_0.Op != OpARMSRA { 13628 break 13629 } 13630 _ = v_0.Args[1] 13631 y := v_0.Args[0] 13632 z := v_0.Args[1] 13633 x := v.Args[1] 13634 v.reset(OpARMRSBSshiftRAreg) 13635 v.AddArg(x) 13636 v.AddArg(y) 13637 v.AddArg(z) 13638 return true 13639 } 13640 return false 13641 } 13642 func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { 13643 b := v.Block 13644 _ = b 13645 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 13646 // cond: 13647 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 13648 for { 13649 d := v.AuxInt 13650 _ = v.Args[1] 13651 v_0 := v.Args[0] 13652 if v_0.Op != OpARMMOVWconst { 13653 break 13654 } 13655 c := v_0.AuxInt 13656 x := v.Args[1] 13657 v.reset(OpARMRSBSconst) 13658 v.AuxInt = c 13659 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 13660 v0.AuxInt = d 13661 v0.AddArg(x) 13662 v.AddArg(v0) 13663 return true 13664 } 13665 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 13666 // cond: 13667 // result: (SUBSconst x [int64(uint32(c)<<uint64(d))]) 13668 for { 13669 d := v.AuxInt 13670 _ = v.Args[1] 13671 x := v.Args[0] 13672 v_1 := v.Args[1] 13673 if v_1.Op != OpARMMOVWconst { 13674 break 13675 } 13676 c := v_1.AuxInt 13677 v.reset(OpARMSUBSconst) 13678 v.AuxInt = int64(uint32(c) << uint64(d)) 13679 v.AddArg(x) 13680 return true 13681 } 13682 return false 13683 } 13684 func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { 13685 b := v.Block 13686 _ = b 13687 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 13688 // cond: 13689 // result: (RSBSconst [c] (SLL <x.Type> x y)) 13690 for { 13691 _ = v.Args[2] 13692 v_0 := v.Args[0] 13693 if v_0.Op != OpARMMOVWconst { 13694 break 13695 } 13696 c := v_0.AuxInt 13697 x := v.Args[1] 13698 y := v.Args[2] 13699 v.reset(OpARMRSBSconst) 13700 v.AuxInt = c 13701 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13702 v0.AddArg(x) 13703 v0.AddArg(y) 13704 v.AddArg(v0) 13705 return true 13706 } 13707 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 13708 // cond: 13709 // result: (SUBSshiftLL x y [c]) 13710 for { 13711 _ = v.Args[2] 13712 x := v.Args[0] 13713 y := v.Args[1] 13714 v_2 := v.Args[2] 13715 if v_2.Op != OpARMMOVWconst { 13716 break 13717 } 13718 c := v_2.AuxInt 13719 v.reset(OpARMSUBSshiftLL) 13720 v.AuxInt = c 13721 v.AddArg(x) 13722 v.AddArg(y) 13723 return true 13724 } 13725 return false 13726 } 13727 func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { 13728 b := v.Block 13729 _ = b 13730 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 13731 // cond: 13732 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 13733 for { 13734 d := v.AuxInt 13735 _ = v.Args[1] 13736 v_0 := v.Args[0] 13737 if v_0.Op != OpARMMOVWconst { 13738 break 13739 } 13740 c := v_0.AuxInt 13741 x := v.Args[1] 13742 v.reset(OpARMRSBSconst) 13743 v.AuxInt = c 13744 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13745 v0.AuxInt = d 13746 v0.AddArg(x) 13747 v.AddArg(v0) 13748 return true 13749 } 13750 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 13751 // cond: 13752 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 13753 for { 13754 d := v.AuxInt 13755 _ = v.Args[1] 13756 x := v.Args[0] 13757 v_1 := v.Args[1] 13758 if v_1.Op != OpARMMOVWconst { 13759 break 13760 } 13761 c := v_1.AuxInt 13762 v.reset(OpARMSUBSconst) 13763 v.AuxInt = int64(int32(c) >> uint64(d)) 13764 v.AddArg(x) 13765 return true 13766 } 13767 return false 13768 } 13769 func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { 13770 b := v.Block 13771 _ = b 13772 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 13773 // cond: 13774 // result: (RSBSconst [c] (SRA <x.Type> x y)) 13775 for { 13776 _ = v.Args[2] 13777 v_0 := v.Args[0] 13778 if v_0.Op != OpARMMOVWconst { 13779 break 13780 } 13781 c := v_0.AuxInt 13782 x := v.Args[1] 13783 y := v.Args[2] 13784 v.reset(OpARMRSBSconst) 13785 v.AuxInt = c 13786 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13787 v0.AddArg(x) 13788 v0.AddArg(y) 13789 v.AddArg(v0) 13790 return true 13791 } 13792 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 13793 // cond: 13794 // result: (SUBSshiftRA x y [c]) 13795 for { 13796 _ = v.Args[2] 13797 x := v.Args[0] 13798 y := v.Args[1] 13799 v_2 := v.Args[2] 13800 if v_2.Op != OpARMMOVWconst { 13801 break 13802 } 13803 c := v_2.AuxInt 13804 v.reset(OpARMSUBSshiftRA) 13805 v.AuxInt = c 13806 v.AddArg(x) 13807 v.AddArg(y) 13808 return true 13809 } 13810 return false 13811 } 13812 func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { 13813 b := v.Block 13814 _ = b 13815 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 13816 // cond: 13817 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 13818 for { 13819 d := v.AuxInt 13820 _ = v.Args[1] 13821 v_0 := v.Args[0] 13822 if v_0.Op != OpARMMOVWconst { 13823 break 13824 } 13825 c := v_0.AuxInt 13826 x := v.Args[1] 13827 v.reset(OpARMRSBSconst) 13828 v.AuxInt = c 13829 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13830 v0.AuxInt = d 13831 v0.AddArg(x) 13832 v.AddArg(v0) 13833 return true 13834 } 13835 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 13836 // cond: 13837 // result: (SUBSconst x [int64(uint32(c)>>uint64(d))]) 13838 for { 13839 d := v.AuxInt 13840 _ = v.Args[1] 13841 x := v.Args[0] 13842 v_1 := v.Args[1] 13843 if v_1.Op != OpARMMOVWconst { 13844 break 13845 } 13846 c := v_1.AuxInt 13847 v.reset(OpARMSUBSconst) 13848 v.AuxInt = int64(uint32(c) >> uint64(d)) 13849 v.AddArg(x) 13850 return true 13851 } 13852 return false 13853 } 13854 func rewriteValueARM_OpARMSUBSshiftRLreg_0(v *Value) bool { 13855 b := v.Block 13856 _ = b 13857 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 13858 // cond: 13859 // result: (RSBSconst [c] (SRL <x.Type> x y)) 13860 for { 13861 _ = v.Args[2] 13862 v_0 := v.Args[0] 13863 if v_0.Op != OpARMMOVWconst { 13864 break 13865 } 13866 c := v_0.AuxInt 13867 x := v.Args[1] 13868 y := v.Args[2] 13869 v.reset(OpARMRSBSconst) 13870 v.AuxInt = c 13871 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13872 v0.AddArg(x) 13873 v0.AddArg(y) 13874 v.AddArg(v0) 13875 return true 13876 } 13877 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 13878 // cond: 13879 // result: (SUBSshiftRL x y [c]) 13880 for { 13881 _ = v.Args[2] 13882 x := v.Args[0] 13883 y := v.Args[1] 13884 v_2 := v.Args[2] 13885 if v_2.Op != OpARMMOVWconst { 13886 break 13887 } 13888 c := v_2.AuxInt 13889 v.reset(OpARMSUBSshiftRL) 13890 v.AuxInt = c 13891 v.AddArg(x) 13892 v.AddArg(y) 13893 return true 13894 } 13895 return false 13896 } 13897 func rewriteValueARM_OpARMSUBconst_0(v *Value) bool { 13898 // match: (SUBconst [off1] (MOVWaddr [off2] {sym} ptr)) 13899 // cond: 13900 // result: (MOVWaddr [off2-off1] {sym} ptr) 13901 for { 13902 off1 := v.AuxInt 13903 v_0 := v.Args[0] 13904 if v_0.Op != OpARMMOVWaddr { 13905 break 13906 } 13907 off2 := v_0.AuxInt 13908 sym := v_0.Aux 13909 ptr := v_0.Args[0] 13910 v.reset(OpARMMOVWaddr) 13911 v.AuxInt = off2 - off1 13912 v.Aux = sym 13913 v.AddArg(ptr) 13914 return true 13915 } 13916 // match: (SUBconst [0] x) 13917 // cond: 13918 // result: x 13919 for { 13920 if v.AuxInt != 0 { 13921 break 13922 } 13923 x := v.Args[0] 13924 v.reset(OpCopy) 13925 v.Type = x.Type 13926 v.AddArg(x) 13927 return true 13928 } 13929 // match: (SUBconst [c] x) 13930 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 13931 // result: (ADDconst [int64(int32(-c))] x) 13932 for { 13933 c := v.AuxInt 13934 x := v.Args[0] 13935 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 13936 break 13937 } 13938 v.reset(OpARMADDconst) 13939 v.AuxInt = int64(int32(-c)) 13940 v.AddArg(x) 13941 return true 13942 } 13943 // match: (SUBconst [c] (MOVWconst [d])) 13944 // cond: 13945 // result: (MOVWconst [int64(int32(d-c))]) 13946 for { 13947 c := v.AuxInt 13948 v_0 := v.Args[0] 13949 if v_0.Op != OpARMMOVWconst { 13950 break 13951 } 13952 d := v_0.AuxInt 13953 v.reset(OpARMMOVWconst) 13954 v.AuxInt = int64(int32(d - c)) 13955 return true 13956 } 13957 // match: (SUBconst [c] (SUBconst [d] x)) 13958 // cond: 13959 // result: (ADDconst [int64(int32(-c-d))] x) 13960 for { 13961 c := v.AuxInt 13962 v_0 := v.Args[0] 13963 if v_0.Op != OpARMSUBconst { 13964 break 13965 } 13966 d := v_0.AuxInt 13967 x := v_0.Args[0] 13968 v.reset(OpARMADDconst) 13969 v.AuxInt = int64(int32(-c - d)) 13970 v.AddArg(x) 13971 return true 13972 } 13973 // match: (SUBconst [c] (ADDconst [d] x)) 13974 // cond: 13975 // result: (ADDconst [int64(int32(-c+d))] x) 13976 for { 13977 c := v.AuxInt 13978 v_0 := v.Args[0] 13979 if v_0.Op != OpARMADDconst { 13980 break 13981 } 13982 d := v_0.AuxInt 13983 x := v_0.Args[0] 13984 v.reset(OpARMADDconst) 13985 v.AuxInt = int64(int32(-c + d)) 13986 v.AddArg(x) 13987 return true 13988 } 13989 // match: (SUBconst [c] (RSBconst [d] x)) 13990 // cond: 13991 // result: (RSBconst [int64(int32(-c+d))] x) 13992 for { 13993 c := v.AuxInt 13994 v_0 := v.Args[0] 13995 if v_0.Op != OpARMRSBconst { 13996 break 13997 } 13998 d := v_0.AuxInt 13999 x := v_0.Args[0] 14000 v.reset(OpARMRSBconst) 14001 v.AuxInt = int64(int32(-c + d)) 14002 v.AddArg(x) 14003 return true 14004 } 14005 return false 14006 } 14007 func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { 14008 b := v.Block 14009 _ = b 14010 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 14011 // cond: 14012 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 14013 for { 14014 d := v.AuxInt 14015 _ = v.Args[1] 14016 v_0 := v.Args[0] 14017 if v_0.Op != OpARMMOVWconst { 14018 break 14019 } 14020 c := v_0.AuxInt 14021 x := v.Args[1] 14022 v.reset(OpARMRSBconst) 14023 v.AuxInt = c 14024 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 14025 v0.AuxInt = d 14026 v0.AddArg(x) 14027 v.AddArg(v0) 14028 return true 14029 } 14030 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 14031 // cond: 14032 // result: (SUBconst x [int64(uint32(c)<<uint64(d))]) 14033 for { 14034 d := v.AuxInt 14035 _ = v.Args[1] 14036 x := v.Args[0] 14037 v_1 := v.Args[1] 14038 if v_1.Op != OpARMMOVWconst { 14039 break 14040 } 14041 c := v_1.AuxInt 14042 v.reset(OpARMSUBconst) 14043 v.AuxInt = int64(uint32(c) << uint64(d)) 14044 v.AddArg(x) 14045 return true 14046 } 14047 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 14048 // cond: c==d 14049 // result: (MOVWconst [0]) 14050 for { 14051 d := v.AuxInt 14052 _ = v.Args[1] 14053 x := v.Args[0] 14054 v_1 := v.Args[1] 14055 if v_1.Op != OpARMSLLconst { 14056 break 14057 } 14058 c := v_1.AuxInt 14059 if x != v_1.Args[0] { 14060 break 14061 } 14062 if !(c == d) { 14063 break 14064 } 14065 v.reset(OpARMMOVWconst) 14066 v.AuxInt = 0 14067 return true 14068 } 14069 return false 14070 } 14071 func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { 14072 b := v.Block 14073 _ = b 14074 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 14075 // cond: 14076 // result: (RSBconst [c] (SLL <x.Type> x y)) 14077 for { 14078 _ = v.Args[2] 14079 v_0 := v.Args[0] 14080 if v_0.Op != OpARMMOVWconst { 14081 break 14082 } 14083 c := v_0.AuxInt 14084 x := v.Args[1] 14085 y := v.Args[2] 14086 v.reset(OpARMRSBconst) 14087 v.AuxInt = c 14088 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14089 v0.AddArg(x) 14090 v0.AddArg(y) 14091 v.AddArg(v0) 14092 return true 14093 } 14094 // match: (SUBshiftLLreg x y (MOVWconst [c])) 14095 // cond: 14096 // result: (SUBshiftLL x y [c]) 14097 for { 14098 _ = v.Args[2] 14099 x := v.Args[0] 14100 y := v.Args[1] 14101 v_2 := v.Args[2] 14102 if v_2.Op != OpARMMOVWconst { 14103 break 14104 } 14105 c := v_2.AuxInt 14106 v.reset(OpARMSUBshiftLL) 14107 v.AuxInt = c 14108 v.AddArg(x) 14109 v.AddArg(y) 14110 return true 14111 } 14112 return false 14113 } 14114 func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { 14115 b := v.Block 14116 _ = b 14117 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 14118 // cond: 14119 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 14120 for { 14121 d := v.AuxInt 14122 _ = v.Args[1] 14123 v_0 := v.Args[0] 14124 if v_0.Op != OpARMMOVWconst { 14125 break 14126 } 14127 c := v_0.AuxInt 14128 x := v.Args[1] 14129 v.reset(OpARMRSBconst) 14130 v.AuxInt = c 14131 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 14132 v0.AuxInt = d 14133 v0.AddArg(x) 14134 v.AddArg(v0) 14135 return true 14136 } 14137 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 14138 // cond: 14139 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 14140 for { 14141 d := v.AuxInt 14142 _ = v.Args[1] 14143 x := v.Args[0] 14144 v_1 := v.Args[1] 14145 if v_1.Op != OpARMMOVWconst { 14146 break 14147 } 14148 c := v_1.AuxInt 14149 v.reset(OpARMSUBconst) 14150 v.AuxInt = int64(int32(c) >> uint64(d)) 14151 v.AddArg(x) 14152 return true 14153 } 14154 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 14155 // cond: c==d 14156 // result: (MOVWconst [0]) 14157 for { 14158 d := v.AuxInt 14159 _ = v.Args[1] 14160 x := v.Args[0] 14161 v_1 := v.Args[1] 14162 if v_1.Op != OpARMSRAconst { 14163 break 14164 } 14165 c := v_1.AuxInt 14166 if x != v_1.Args[0] { 14167 break 14168 } 14169 if !(c == d) { 14170 break 14171 } 14172 v.reset(OpARMMOVWconst) 14173 v.AuxInt = 0 14174 return true 14175 } 14176 return false 14177 } 14178 func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { 14179 b := v.Block 14180 _ = b 14181 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 14182 // cond: 14183 // result: (RSBconst [c] (SRA <x.Type> x y)) 14184 for { 14185 _ = v.Args[2] 14186 v_0 := v.Args[0] 14187 if v_0.Op != OpARMMOVWconst { 14188 break 14189 } 14190 c := v_0.AuxInt 14191 x := v.Args[1] 14192 y := v.Args[2] 14193 v.reset(OpARMRSBconst) 14194 v.AuxInt = c 14195 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 14196 v0.AddArg(x) 14197 v0.AddArg(y) 14198 v.AddArg(v0) 14199 return true 14200 } 14201 // match: (SUBshiftRAreg x y (MOVWconst [c])) 14202 // cond: 14203 // result: (SUBshiftRA x y [c]) 14204 for { 14205 _ = v.Args[2] 14206 x := v.Args[0] 14207 y := v.Args[1] 14208 v_2 := v.Args[2] 14209 if v_2.Op != OpARMMOVWconst { 14210 break 14211 } 14212 c := v_2.AuxInt 14213 v.reset(OpARMSUBshiftRA) 14214 v.AuxInt = c 14215 v.AddArg(x) 14216 v.AddArg(y) 14217 return true 14218 } 14219 return false 14220 } 14221 func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { 14222 b := v.Block 14223 _ = b 14224 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 14225 // cond: 14226 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 14227 for { 14228 d := v.AuxInt 14229 _ = v.Args[1] 14230 v_0 := v.Args[0] 14231 if v_0.Op != OpARMMOVWconst { 14232 break 14233 } 14234 c := v_0.AuxInt 14235 x := v.Args[1] 14236 v.reset(OpARMRSBconst) 14237 v.AuxInt = c 14238 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 14239 v0.AuxInt = d 14240 v0.AddArg(x) 14241 v.AddArg(v0) 14242 return true 14243 } 14244 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 14245 // cond: 14246 // result: (SUBconst x [int64(uint32(c)>>uint64(d))]) 14247 for { 14248 d := v.AuxInt 14249 _ = v.Args[1] 14250 x := v.Args[0] 14251 v_1 := v.Args[1] 14252 if v_1.Op != OpARMMOVWconst { 14253 break 14254 } 14255 c := v_1.AuxInt 14256 v.reset(OpARMSUBconst) 14257 v.AuxInt = int64(uint32(c) >> uint64(d)) 14258 v.AddArg(x) 14259 return true 14260 } 14261 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 14262 // cond: c==d 14263 // result: (MOVWconst [0]) 14264 for { 14265 d := v.AuxInt 14266 _ = v.Args[1] 14267 x := v.Args[0] 14268 v_1 := v.Args[1] 14269 if v_1.Op != OpARMSRLconst { 14270 break 14271 } 14272 c := v_1.AuxInt 14273 if x != v_1.Args[0] { 14274 break 14275 } 14276 if !(c == d) { 14277 break 14278 } 14279 v.reset(OpARMMOVWconst) 14280 v.AuxInt = 0 14281 return true 14282 } 14283 return false 14284 } 14285 func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { 14286 b := v.Block 14287 _ = b 14288 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 14289 // cond: 14290 // result: (RSBconst [c] (SRL <x.Type> x y)) 14291 for { 14292 _ = v.Args[2] 14293 v_0 := v.Args[0] 14294 if v_0.Op != OpARMMOVWconst { 14295 break 14296 } 14297 c := v_0.AuxInt 14298 x := v.Args[1] 14299 y := v.Args[2] 14300 v.reset(OpARMRSBconst) 14301 v.AuxInt = c 14302 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 14303 v0.AddArg(x) 14304 v0.AddArg(y) 14305 v.AddArg(v0) 14306 return true 14307 } 14308 // match: (SUBshiftRLreg x y (MOVWconst [c])) 14309 // cond: 14310 // result: (SUBshiftRL x y [c]) 14311 for { 14312 _ = v.Args[2] 14313 x := v.Args[0] 14314 y := v.Args[1] 14315 v_2 := v.Args[2] 14316 if v_2.Op != OpARMMOVWconst { 14317 break 14318 } 14319 c := v_2.AuxInt 14320 v.reset(OpARMSUBshiftRL) 14321 v.AuxInt = c 14322 v.AddArg(x) 14323 v.AddArg(y) 14324 return true 14325 } 14326 return false 14327 } 14328 func rewriteValueARM_OpARMXOR_0(v *Value) bool { 14329 // match: (XOR x (MOVWconst [c])) 14330 // cond: 14331 // result: (XORconst [c] x) 14332 for { 14333 _ = v.Args[1] 14334 x := v.Args[0] 14335 v_1 := v.Args[1] 14336 if v_1.Op != OpARMMOVWconst { 14337 break 14338 } 14339 c := v_1.AuxInt 14340 v.reset(OpARMXORconst) 14341 v.AuxInt = c 14342 v.AddArg(x) 14343 return true 14344 } 14345 // match: (XOR (MOVWconst [c]) x) 14346 // cond: 14347 // result: (XORconst [c] x) 14348 for { 14349 _ = v.Args[1] 14350 v_0 := v.Args[0] 14351 if v_0.Op != OpARMMOVWconst { 14352 break 14353 } 14354 c := v_0.AuxInt 14355 x := v.Args[1] 14356 v.reset(OpARMXORconst) 14357 v.AuxInt = c 14358 v.AddArg(x) 14359 return true 14360 } 14361 // match: (XOR x (SLLconst [c] y)) 14362 // cond: 14363 // result: (XORshiftLL x y [c]) 14364 for { 14365 _ = v.Args[1] 14366 x := v.Args[0] 14367 v_1 := v.Args[1] 14368 if v_1.Op != OpARMSLLconst { 14369 break 14370 } 14371 c := v_1.AuxInt 14372 y := v_1.Args[0] 14373 v.reset(OpARMXORshiftLL) 14374 v.AuxInt = c 14375 v.AddArg(x) 14376 v.AddArg(y) 14377 return true 14378 } 14379 // match: (XOR (SLLconst [c] y) x) 14380 // cond: 14381 // result: (XORshiftLL x y [c]) 14382 for { 14383 _ = v.Args[1] 14384 v_0 := v.Args[0] 14385 if v_0.Op != OpARMSLLconst { 14386 break 14387 } 14388 c := v_0.AuxInt 14389 y := v_0.Args[0] 14390 x := v.Args[1] 14391 v.reset(OpARMXORshiftLL) 14392 v.AuxInt = c 14393 v.AddArg(x) 14394 v.AddArg(y) 14395 return true 14396 } 14397 // match: (XOR x (SRLconst [c] y)) 14398 // cond: 14399 // result: (XORshiftRL x y [c]) 14400 for { 14401 _ = v.Args[1] 14402 x := v.Args[0] 14403 v_1 := v.Args[1] 14404 if v_1.Op != OpARMSRLconst { 14405 break 14406 } 14407 c := v_1.AuxInt 14408 y := v_1.Args[0] 14409 v.reset(OpARMXORshiftRL) 14410 v.AuxInt = c 14411 v.AddArg(x) 14412 v.AddArg(y) 14413 return true 14414 } 14415 // match: (XOR (SRLconst [c] y) x) 14416 // cond: 14417 // result: (XORshiftRL x y [c]) 14418 for { 14419 _ = v.Args[1] 14420 v_0 := v.Args[0] 14421 if v_0.Op != OpARMSRLconst { 14422 break 14423 } 14424 c := v_0.AuxInt 14425 y := v_0.Args[0] 14426 x := v.Args[1] 14427 v.reset(OpARMXORshiftRL) 14428 v.AuxInt = c 14429 v.AddArg(x) 14430 v.AddArg(y) 14431 return true 14432 } 14433 // match: (XOR x (SRAconst [c] y)) 14434 // cond: 14435 // result: (XORshiftRA x y [c]) 14436 for { 14437 _ = v.Args[1] 14438 x := v.Args[0] 14439 v_1 := v.Args[1] 14440 if v_1.Op != OpARMSRAconst { 14441 break 14442 } 14443 c := v_1.AuxInt 14444 y := v_1.Args[0] 14445 v.reset(OpARMXORshiftRA) 14446 v.AuxInt = c 14447 v.AddArg(x) 14448 v.AddArg(y) 14449 return true 14450 } 14451 // match: (XOR (SRAconst [c] y) x) 14452 // cond: 14453 // result: (XORshiftRA x y [c]) 14454 for { 14455 _ = v.Args[1] 14456 v_0 := v.Args[0] 14457 if v_0.Op != OpARMSRAconst { 14458 break 14459 } 14460 c := v_0.AuxInt 14461 y := v_0.Args[0] 14462 x := v.Args[1] 14463 v.reset(OpARMXORshiftRA) 14464 v.AuxInt = c 14465 v.AddArg(x) 14466 v.AddArg(y) 14467 return true 14468 } 14469 // match: (XOR x (SRRconst [c] y)) 14470 // cond: 14471 // result: (XORshiftRR x y [c]) 14472 for { 14473 _ = v.Args[1] 14474 x := v.Args[0] 14475 v_1 := v.Args[1] 14476 if v_1.Op != OpARMSRRconst { 14477 break 14478 } 14479 c := v_1.AuxInt 14480 y := v_1.Args[0] 14481 v.reset(OpARMXORshiftRR) 14482 v.AuxInt = c 14483 v.AddArg(x) 14484 v.AddArg(y) 14485 return true 14486 } 14487 // match: (XOR (SRRconst [c] y) x) 14488 // cond: 14489 // result: (XORshiftRR x y [c]) 14490 for { 14491 _ = v.Args[1] 14492 v_0 := v.Args[0] 14493 if v_0.Op != OpARMSRRconst { 14494 break 14495 } 14496 c := v_0.AuxInt 14497 y := v_0.Args[0] 14498 x := v.Args[1] 14499 v.reset(OpARMXORshiftRR) 14500 v.AuxInt = c 14501 v.AddArg(x) 14502 v.AddArg(y) 14503 return true 14504 } 14505 return false 14506 } 14507 func rewriteValueARM_OpARMXOR_10(v *Value) bool { 14508 // match: (XOR x (SLL y z)) 14509 // cond: 14510 // result: (XORshiftLLreg x y z) 14511 for { 14512 _ = v.Args[1] 14513 x := v.Args[0] 14514 v_1 := v.Args[1] 14515 if v_1.Op != OpARMSLL { 14516 break 14517 } 14518 _ = v_1.Args[1] 14519 y := v_1.Args[0] 14520 z := v_1.Args[1] 14521 v.reset(OpARMXORshiftLLreg) 14522 v.AddArg(x) 14523 v.AddArg(y) 14524 v.AddArg(z) 14525 return true 14526 } 14527 // match: (XOR (SLL y z) x) 14528 // cond: 14529 // result: (XORshiftLLreg x y z) 14530 for { 14531 _ = v.Args[1] 14532 v_0 := v.Args[0] 14533 if v_0.Op != OpARMSLL { 14534 break 14535 } 14536 _ = v_0.Args[1] 14537 y := v_0.Args[0] 14538 z := v_0.Args[1] 14539 x := v.Args[1] 14540 v.reset(OpARMXORshiftLLreg) 14541 v.AddArg(x) 14542 v.AddArg(y) 14543 v.AddArg(z) 14544 return true 14545 } 14546 // match: (XOR x (SRL y z)) 14547 // cond: 14548 // result: (XORshiftRLreg x y z) 14549 for { 14550 _ = v.Args[1] 14551 x := v.Args[0] 14552 v_1 := v.Args[1] 14553 if v_1.Op != OpARMSRL { 14554 break 14555 } 14556 _ = v_1.Args[1] 14557 y := v_1.Args[0] 14558 z := v_1.Args[1] 14559 v.reset(OpARMXORshiftRLreg) 14560 v.AddArg(x) 14561 v.AddArg(y) 14562 v.AddArg(z) 14563 return true 14564 } 14565 // match: (XOR (SRL y z) x) 14566 // cond: 14567 // result: (XORshiftRLreg x y z) 14568 for { 14569 _ = v.Args[1] 14570 v_0 := v.Args[0] 14571 if v_0.Op != OpARMSRL { 14572 break 14573 } 14574 _ = v_0.Args[1] 14575 y := v_0.Args[0] 14576 z := v_0.Args[1] 14577 x := v.Args[1] 14578 v.reset(OpARMXORshiftRLreg) 14579 v.AddArg(x) 14580 v.AddArg(y) 14581 v.AddArg(z) 14582 return true 14583 } 14584 // match: (XOR x (SRA y z)) 14585 // cond: 14586 // result: (XORshiftRAreg x y z) 14587 for { 14588 _ = v.Args[1] 14589 x := v.Args[0] 14590 v_1 := v.Args[1] 14591 if v_1.Op != OpARMSRA { 14592 break 14593 } 14594 _ = v_1.Args[1] 14595 y := v_1.Args[0] 14596 z := v_1.Args[1] 14597 v.reset(OpARMXORshiftRAreg) 14598 v.AddArg(x) 14599 v.AddArg(y) 14600 v.AddArg(z) 14601 return true 14602 } 14603 // match: (XOR (SRA y z) x) 14604 // cond: 14605 // result: (XORshiftRAreg x y z) 14606 for { 14607 _ = v.Args[1] 14608 v_0 := v.Args[0] 14609 if v_0.Op != OpARMSRA { 14610 break 14611 } 14612 _ = v_0.Args[1] 14613 y := v_0.Args[0] 14614 z := v_0.Args[1] 14615 x := v.Args[1] 14616 v.reset(OpARMXORshiftRAreg) 14617 v.AddArg(x) 14618 v.AddArg(y) 14619 v.AddArg(z) 14620 return true 14621 } 14622 // match: (XOR x x) 14623 // cond: 14624 // result: (MOVWconst [0]) 14625 for { 14626 _ = v.Args[1] 14627 x := v.Args[0] 14628 if x != v.Args[1] { 14629 break 14630 } 14631 v.reset(OpARMMOVWconst) 14632 v.AuxInt = 0 14633 return true 14634 } 14635 return false 14636 } 14637 func rewriteValueARM_OpARMXORconst_0(v *Value) bool { 14638 // match: (XORconst [0] x) 14639 // cond: 14640 // result: x 14641 for { 14642 if v.AuxInt != 0 { 14643 break 14644 } 14645 x := v.Args[0] 14646 v.reset(OpCopy) 14647 v.Type = x.Type 14648 v.AddArg(x) 14649 return true 14650 } 14651 // match: (XORconst [c] (MOVWconst [d])) 14652 // cond: 14653 // result: (MOVWconst [c^d]) 14654 for { 14655 c := v.AuxInt 14656 v_0 := v.Args[0] 14657 if v_0.Op != OpARMMOVWconst { 14658 break 14659 } 14660 d := v_0.AuxInt 14661 v.reset(OpARMMOVWconst) 14662 v.AuxInt = c ^ d 14663 return true 14664 } 14665 // match: (XORconst [c] (XORconst [d] x)) 14666 // cond: 14667 // result: (XORconst [c^d] x) 14668 for { 14669 c := v.AuxInt 14670 v_0 := v.Args[0] 14671 if v_0.Op != OpARMXORconst { 14672 break 14673 } 14674 d := v_0.AuxInt 14675 x := v_0.Args[0] 14676 v.reset(OpARMXORconst) 14677 v.AuxInt = c ^ d 14678 v.AddArg(x) 14679 return true 14680 } 14681 return false 14682 } 14683 func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { 14684 b := v.Block 14685 _ = b 14686 // match: (XORshiftLL (MOVWconst [c]) x [d]) 14687 // cond: 14688 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 14689 for { 14690 d := v.AuxInt 14691 _ = v.Args[1] 14692 v_0 := v.Args[0] 14693 if v_0.Op != OpARMMOVWconst { 14694 break 14695 } 14696 c := v_0.AuxInt 14697 x := v.Args[1] 14698 v.reset(OpARMXORconst) 14699 v.AuxInt = c 14700 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 14701 v0.AuxInt = d 14702 v0.AddArg(x) 14703 v.AddArg(v0) 14704 return true 14705 } 14706 // match: (XORshiftLL x (MOVWconst [c]) [d]) 14707 // cond: 14708 // result: (XORconst x [int64(uint32(c)<<uint64(d))]) 14709 for { 14710 d := v.AuxInt 14711 _ = v.Args[1] 14712 x := v.Args[0] 14713 v_1 := v.Args[1] 14714 if v_1.Op != OpARMMOVWconst { 14715 break 14716 } 14717 c := v_1.AuxInt 14718 v.reset(OpARMXORconst) 14719 v.AuxInt = int64(uint32(c) << uint64(d)) 14720 v.AddArg(x) 14721 return true 14722 } 14723 // match: (XORshiftLL [c] (SRLconst x [32-c]) x) 14724 // cond: 14725 // result: (SRRconst [32-c] x) 14726 for { 14727 c := v.AuxInt 14728 _ = v.Args[1] 14729 v_0 := v.Args[0] 14730 if v_0.Op != OpARMSRLconst { 14731 break 14732 } 14733 if v_0.AuxInt != 32-c { 14734 break 14735 } 14736 x := v_0.Args[0] 14737 if x != v.Args[1] { 14738 break 14739 } 14740 v.reset(OpARMSRRconst) 14741 v.AuxInt = 32 - c 14742 v.AddArg(x) 14743 return true 14744 } 14745 // match: (XORshiftLL x (SLLconst x [c]) [d]) 14746 // cond: c==d 14747 // result: (MOVWconst [0]) 14748 for { 14749 d := v.AuxInt 14750 _ = v.Args[1] 14751 x := v.Args[0] 14752 v_1 := v.Args[1] 14753 if v_1.Op != OpARMSLLconst { 14754 break 14755 } 14756 c := v_1.AuxInt 14757 if x != v_1.Args[0] { 14758 break 14759 } 14760 if !(c == d) { 14761 break 14762 } 14763 v.reset(OpARMMOVWconst) 14764 v.AuxInt = 0 14765 return true 14766 } 14767 return false 14768 } 14769 func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { 14770 b := v.Block 14771 _ = b 14772 // match: (XORshiftLLreg (MOVWconst [c]) x y) 14773 // cond: 14774 // result: (XORconst [c] (SLL <x.Type> x y)) 14775 for { 14776 _ = v.Args[2] 14777 v_0 := v.Args[0] 14778 if v_0.Op != OpARMMOVWconst { 14779 break 14780 } 14781 c := v_0.AuxInt 14782 x := v.Args[1] 14783 y := v.Args[2] 14784 v.reset(OpARMXORconst) 14785 v.AuxInt = c 14786 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14787 v0.AddArg(x) 14788 v0.AddArg(y) 14789 v.AddArg(v0) 14790 return true 14791 } 14792 // match: (XORshiftLLreg x y (MOVWconst [c])) 14793 // cond: 14794 // result: (XORshiftLL x y [c]) 14795 for { 14796 _ = v.Args[2] 14797 x := v.Args[0] 14798 y := v.Args[1] 14799 v_2 := v.Args[2] 14800 if v_2.Op != OpARMMOVWconst { 14801 break 14802 } 14803 c := v_2.AuxInt 14804 v.reset(OpARMXORshiftLL) 14805 v.AuxInt = c 14806 v.AddArg(x) 14807 v.AddArg(y) 14808 return true 14809 } 14810 return false 14811 } 14812 func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { 14813 b := v.Block 14814 _ = b 14815 // match: (XORshiftRA (MOVWconst [c]) x [d]) 14816 // cond: 14817 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 14818 for { 14819 d := v.AuxInt 14820 _ = v.Args[1] 14821 v_0 := v.Args[0] 14822 if v_0.Op != OpARMMOVWconst { 14823 break 14824 } 14825 c := v_0.AuxInt 14826 x := v.Args[1] 14827 v.reset(OpARMXORconst) 14828 v.AuxInt = c 14829 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 14830 v0.AuxInt = d 14831 v0.AddArg(x) 14832 v.AddArg(v0) 14833 return true 14834 } 14835 // match: (XORshiftRA x (MOVWconst [c]) [d]) 14836 // cond: 14837 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 14838 for { 14839 d := v.AuxInt 14840 _ = v.Args[1] 14841 x := v.Args[0] 14842 v_1 := v.Args[1] 14843 if v_1.Op != OpARMMOVWconst { 14844 break 14845 } 14846 c := v_1.AuxInt 14847 v.reset(OpARMXORconst) 14848 v.AuxInt = int64(int32(c) >> uint64(d)) 14849 v.AddArg(x) 14850 return true 14851 } 14852 // match: (XORshiftRA x (SRAconst x [c]) [d]) 14853 // cond: c==d 14854 // result: (MOVWconst [0]) 14855 for { 14856 d := v.AuxInt 14857 _ = v.Args[1] 14858 x := v.Args[0] 14859 v_1 := v.Args[1] 14860 if v_1.Op != OpARMSRAconst { 14861 break 14862 } 14863 c := v_1.AuxInt 14864 if x != v_1.Args[0] { 14865 break 14866 } 14867 if !(c == d) { 14868 break 14869 } 14870 v.reset(OpARMMOVWconst) 14871 v.AuxInt = 0 14872 return true 14873 } 14874 return false 14875 } 14876 func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { 14877 b := v.Block 14878 _ = b 14879 // match: (XORshiftRAreg (MOVWconst [c]) x y) 14880 // cond: 14881 // result: (XORconst [c] (SRA <x.Type> x y)) 14882 for { 14883 _ = v.Args[2] 14884 v_0 := v.Args[0] 14885 if v_0.Op != OpARMMOVWconst { 14886 break 14887 } 14888 c := v_0.AuxInt 14889 x := v.Args[1] 14890 y := v.Args[2] 14891 v.reset(OpARMXORconst) 14892 v.AuxInt = c 14893 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 14894 v0.AddArg(x) 14895 v0.AddArg(y) 14896 v.AddArg(v0) 14897 return true 14898 } 14899 // match: (XORshiftRAreg x y (MOVWconst [c])) 14900 // cond: 14901 // result: (XORshiftRA x y [c]) 14902 for { 14903 _ = v.Args[2] 14904 x := v.Args[0] 14905 y := v.Args[1] 14906 v_2 := v.Args[2] 14907 if v_2.Op != OpARMMOVWconst { 14908 break 14909 } 14910 c := v_2.AuxInt 14911 v.reset(OpARMXORshiftRA) 14912 v.AuxInt = c 14913 v.AddArg(x) 14914 v.AddArg(y) 14915 return true 14916 } 14917 return false 14918 } 14919 func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { 14920 b := v.Block 14921 _ = b 14922 // match: (XORshiftRL (MOVWconst [c]) x [d]) 14923 // cond: 14924 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 14925 for { 14926 d := v.AuxInt 14927 _ = v.Args[1] 14928 v_0 := v.Args[0] 14929 if v_0.Op != OpARMMOVWconst { 14930 break 14931 } 14932 c := v_0.AuxInt 14933 x := v.Args[1] 14934 v.reset(OpARMXORconst) 14935 v.AuxInt = c 14936 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 14937 v0.AuxInt = d 14938 v0.AddArg(x) 14939 v.AddArg(v0) 14940 return true 14941 } 14942 // match: (XORshiftRL x (MOVWconst [c]) [d]) 14943 // cond: 14944 // result: (XORconst x [int64(uint32(c)>>uint64(d))]) 14945 for { 14946 d := v.AuxInt 14947 _ = v.Args[1] 14948 x := v.Args[0] 14949 v_1 := v.Args[1] 14950 if v_1.Op != OpARMMOVWconst { 14951 break 14952 } 14953 c := v_1.AuxInt 14954 v.reset(OpARMXORconst) 14955 v.AuxInt = int64(uint32(c) >> uint64(d)) 14956 v.AddArg(x) 14957 return true 14958 } 14959 // match: (XORshiftRL [c] (SLLconst x [32-c]) x) 14960 // cond: 14961 // result: (SRRconst [ c] x) 14962 for { 14963 c := v.AuxInt 14964 _ = v.Args[1] 14965 v_0 := v.Args[0] 14966 if v_0.Op != OpARMSLLconst { 14967 break 14968 } 14969 if v_0.AuxInt != 32-c { 14970 break 14971 } 14972 x := v_0.Args[0] 14973 if x != v.Args[1] { 14974 break 14975 } 14976 v.reset(OpARMSRRconst) 14977 v.AuxInt = c 14978 v.AddArg(x) 14979 return true 14980 } 14981 // match: (XORshiftRL x (SRLconst x [c]) [d]) 14982 // cond: c==d 14983 // result: (MOVWconst [0]) 14984 for { 14985 d := v.AuxInt 14986 _ = v.Args[1] 14987 x := v.Args[0] 14988 v_1 := v.Args[1] 14989 if v_1.Op != OpARMSRLconst { 14990 break 14991 } 14992 c := v_1.AuxInt 14993 if x != v_1.Args[0] { 14994 break 14995 } 14996 if !(c == d) { 14997 break 14998 } 14999 v.reset(OpARMMOVWconst) 15000 v.AuxInt = 0 15001 return true 15002 } 15003 return false 15004 } 15005 func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { 15006 b := v.Block 15007 _ = b 15008 // match: (XORshiftRLreg (MOVWconst [c]) x y) 15009 // cond: 15010 // result: (XORconst [c] (SRL <x.Type> x y)) 15011 for { 15012 _ = v.Args[2] 15013 v_0 := v.Args[0] 15014 if v_0.Op != OpARMMOVWconst { 15015 break 15016 } 15017 c := v_0.AuxInt 15018 x := v.Args[1] 15019 y := v.Args[2] 15020 v.reset(OpARMXORconst) 15021 v.AuxInt = c 15022 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15023 v0.AddArg(x) 15024 v0.AddArg(y) 15025 v.AddArg(v0) 15026 return true 15027 } 15028 // match: (XORshiftRLreg x y (MOVWconst [c])) 15029 // cond: 15030 // result: (XORshiftRL x y [c]) 15031 for { 15032 _ = v.Args[2] 15033 x := v.Args[0] 15034 y := v.Args[1] 15035 v_2 := v.Args[2] 15036 if v_2.Op != OpARMMOVWconst { 15037 break 15038 } 15039 c := v_2.AuxInt 15040 v.reset(OpARMXORshiftRL) 15041 v.AuxInt = c 15042 v.AddArg(x) 15043 v.AddArg(y) 15044 return true 15045 } 15046 return false 15047 } 15048 func rewriteValueARM_OpARMXORshiftRR_0(v *Value) bool { 15049 b := v.Block 15050 _ = b 15051 // match: (XORshiftRR (MOVWconst [c]) x [d]) 15052 // cond: 15053 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 15054 for { 15055 d := v.AuxInt 15056 _ = v.Args[1] 15057 v_0 := v.Args[0] 15058 if v_0.Op != OpARMMOVWconst { 15059 break 15060 } 15061 c := v_0.AuxInt 15062 x := v.Args[1] 15063 v.reset(OpARMXORconst) 15064 v.AuxInt = c 15065 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 15066 v0.AuxInt = d 15067 v0.AddArg(x) 15068 v.AddArg(v0) 15069 return true 15070 } 15071 // match: (XORshiftRR x (MOVWconst [c]) [d]) 15072 // cond: 15073 // result: (XORconst x [int64(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 15074 for { 15075 d := v.AuxInt 15076 _ = v.Args[1] 15077 x := v.Args[0] 15078 v_1 := v.Args[1] 15079 if v_1.Op != OpARMMOVWconst { 15080 break 15081 } 15082 c := v_1.AuxInt 15083 v.reset(OpARMXORconst) 15084 v.AuxInt = int64(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)) 15085 v.AddArg(x) 15086 return true 15087 } 15088 return false 15089 } 15090 func rewriteValueARM_OpAdd16_0(v *Value) bool { 15091 // match: (Add16 x y) 15092 // cond: 15093 // result: (ADD x y) 15094 for { 15095 _ = v.Args[1] 15096 x := v.Args[0] 15097 y := v.Args[1] 15098 v.reset(OpARMADD) 15099 v.AddArg(x) 15100 v.AddArg(y) 15101 return true 15102 } 15103 } 15104 func rewriteValueARM_OpAdd32_0(v *Value) bool { 15105 // match: (Add32 x y) 15106 // cond: 15107 // result: (ADD x y) 15108 for { 15109 _ = v.Args[1] 15110 x := v.Args[0] 15111 y := v.Args[1] 15112 v.reset(OpARMADD) 15113 v.AddArg(x) 15114 v.AddArg(y) 15115 return true 15116 } 15117 } 15118 func rewriteValueARM_OpAdd32F_0(v *Value) bool { 15119 // match: (Add32F x y) 15120 // cond: 15121 // result: (ADDF x y) 15122 for { 15123 _ = v.Args[1] 15124 x := v.Args[0] 15125 y := v.Args[1] 15126 v.reset(OpARMADDF) 15127 v.AddArg(x) 15128 v.AddArg(y) 15129 return true 15130 } 15131 } 15132 func rewriteValueARM_OpAdd32carry_0(v *Value) bool { 15133 // match: (Add32carry x y) 15134 // cond: 15135 // result: (ADDS x y) 15136 for { 15137 _ = v.Args[1] 15138 x := v.Args[0] 15139 y := v.Args[1] 15140 v.reset(OpARMADDS) 15141 v.AddArg(x) 15142 v.AddArg(y) 15143 return true 15144 } 15145 } 15146 func rewriteValueARM_OpAdd32withcarry_0(v *Value) bool { 15147 // match: (Add32withcarry x y c) 15148 // cond: 15149 // result: (ADC x y c) 15150 for { 15151 _ = v.Args[2] 15152 x := v.Args[0] 15153 y := v.Args[1] 15154 c := v.Args[2] 15155 v.reset(OpARMADC) 15156 v.AddArg(x) 15157 v.AddArg(y) 15158 v.AddArg(c) 15159 return true 15160 } 15161 } 15162 func rewriteValueARM_OpAdd64F_0(v *Value) bool { 15163 // match: (Add64F x y) 15164 // cond: 15165 // result: (ADDD x y) 15166 for { 15167 _ = v.Args[1] 15168 x := v.Args[0] 15169 y := v.Args[1] 15170 v.reset(OpARMADDD) 15171 v.AddArg(x) 15172 v.AddArg(y) 15173 return true 15174 } 15175 } 15176 func rewriteValueARM_OpAdd8_0(v *Value) bool { 15177 // match: (Add8 x y) 15178 // cond: 15179 // result: (ADD x y) 15180 for { 15181 _ = v.Args[1] 15182 x := v.Args[0] 15183 y := v.Args[1] 15184 v.reset(OpARMADD) 15185 v.AddArg(x) 15186 v.AddArg(y) 15187 return true 15188 } 15189 } 15190 func rewriteValueARM_OpAddPtr_0(v *Value) bool { 15191 // match: (AddPtr x y) 15192 // cond: 15193 // result: (ADD x y) 15194 for { 15195 _ = v.Args[1] 15196 x := v.Args[0] 15197 y := v.Args[1] 15198 v.reset(OpARMADD) 15199 v.AddArg(x) 15200 v.AddArg(y) 15201 return true 15202 } 15203 } 15204 func rewriteValueARM_OpAddr_0(v *Value) bool { 15205 // match: (Addr {sym} base) 15206 // cond: 15207 // result: (MOVWaddr {sym} base) 15208 for { 15209 sym := v.Aux 15210 base := v.Args[0] 15211 v.reset(OpARMMOVWaddr) 15212 v.Aux = sym 15213 v.AddArg(base) 15214 return true 15215 } 15216 } 15217 func rewriteValueARM_OpAnd16_0(v *Value) bool { 15218 // match: (And16 x y) 15219 // cond: 15220 // result: (AND x y) 15221 for { 15222 _ = v.Args[1] 15223 x := v.Args[0] 15224 y := v.Args[1] 15225 v.reset(OpARMAND) 15226 v.AddArg(x) 15227 v.AddArg(y) 15228 return true 15229 } 15230 } 15231 func rewriteValueARM_OpAnd32_0(v *Value) bool { 15232 // match: (And32 x y) 15233 // cond: 15234 // result: (AND x y) 15235 for { 15236 _ = v.Args[1] 15237 x := v.Args[0] 15238 y := v.Args[1] 15239 v.reset(OpARMAND) 15240 v.AddArg(x) 15241 v.AddArg(y) 15242 return true 15243 } 15244 } 15245 func rewriteValueARM_OpAnd8_0(v *Value) bool { 15246 // match: (And8 x y) 15247 // cond: 15248 // result: (AND x y) 15249 for { 15250 _ = v.Args[1] 15251 x := v.Args[0] 15252 y := v.Args[1] 15253 v.reset(OpARMAND) 15254 v.AddArg(x) 15255 v.AddArg(y) 15256 return true 15257 } 15258 } 15259 func rewriteValueARM_OpAndB_0(v *Value) bool { 15260 // match: (AndB x y) 15261 // cond: 15262 // result: (AND x y) 15263 for { 15264 _ = v.Args[1] 15265 x := v.Args[0] 15266 y := v.Args[1] 15267 v.reset(OpARMAND) 15268 v.AddArg(x) 15269 v.AddArg(y) 15270 return true 15271 } 15272 } 15273 func rewriteValueARM_OpAvg32u_0(v *Value) bool { 15274 b := v.Block 15275 _ = b 15276 // match: (Avg32u <t> x y) 15277 // cond: 15278 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 15279 for { 15280 t := v.Type 15281 _ = v.Args[1] 15282 x := v.Args[0] 15283 y := v.Args[1] 15284 v.reset(OpARMADD) 15285 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 15286 v0.AuxInt = 1 15287 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 15288 v1.AddArg(x) 15289 v1.AddArg(y) 15290 v0.AddArg(v1) 15291 v.AddArg(v0) 15292 v.AddArg(y) 15293 return true 15294 } 15295 } 15296 func rewriteValueARM_OpBitLen32_0(v *Value) bool { 15297 b := v.Block 15298 _ = b 15299 // match: (BitLen32 <t> x) 15300 // cond: 15301 // result: (RSBconst [32] (CLZ <t> x)) 15302 for { 15303 t := v.Type 15304 x := v.Args[0] 15305 v.reset(OpARMRSBconst) 15306 v.AuxInt = 32 15307 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 15308 v0.AddArg(x) 15309 v.AddArg(v0) 15310 return true 15311 } 15312 } 15313 func rewriteValueARM_OpBswap32_0(v *Value) bool { 15314 b := v.Block 15315 _ = b 15316 // match: (Bswap32 <t> x) 15317 // cond: objabi.GOARM==5 15318 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 15319 for { 15320 t := v.Type 15321 x := v.Args[0] 15322 if !(objabi.GOARM == 5) { 15323 break 15324 } 15325 v.reset(OpARMXOR) 15326 v.Type = t 15327 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 15328 v0.AuxInt = 8 15329 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 15330 v1.AuxInt = 0xff0000 15331 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 15332 v2.AddArg(x) 15333 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 15334 v3.AuxInt = 16 15335 v3.AddArg(x) 15336 v2.AddArg(v3) 15337 v1.AddArg(v2) 15338 v0.AddArg(v1) 15339 v.AddArg(v0) 15340 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 15341 v4.AuxInt = 8 15342 v4.AddArg(x) 15343 v.AddArg(v4) 15344 return true 15345 } 15346 // match: (Bswap32 x) 15347 // cond: objabi.GOARM>=6 15348 // result: (REV x) 15349 for { 15350 x := v.Args[0] 15351 if !(objabi.GOARM >= 6) { 15352 break 15353 } 15354 v.reset(OpARMREV) 15355 v.AddArg(x) 15356 return true 15357 } 15358 return false 15359 } 15360 func rewriteValueARM_OpClosureCall_0(v *Value) bool { 15361 // match: (ClosureCall [argwid] entry closure mem) 15362 // cond: 15363 // result: (CALLclosure [argwid] entry closure mem) 15364 for { 15365 argwid := v.AuxInt 15366 _ = v.Args[2] 15367 entry := v.Args[0] 15368 closure := v.Args[1] 15369 mem := v.Args[2] 15370 v.reset(OpARMCALLclosure) 15371 v.AuxInt = argwid 15372 v.AddArg(entry) 15373 v.AddArg(closure) 15374 v.AddArg(mem) 15375 return true 15376 } 15377 } 15378 func rewriteValueARM_OpCom16_0(v *Value) bool { 15379 // match: (Com16 x) 15380 // cond: 15381 // result: (MVN x) 15382 for { 15383 x := v.Args[0] 15384 v.reset(OpARMMVN) 15385 v.AddArg(x) 15386 return true 15387 } 15388 } 15389 func rewriteValueARM_OpCom32_0(v *Value) bool { 15390 // match: (Com32 x) 15391 // cond: 15392 // result: (MVN x) 15393 for { 15394 x := v.Args[0] 15395 v.reset(OpARMMVN) 15396 v.AddArg(x) 15397 return true 15398 } 15399 } 15400 func rewriteValueARM_OpCom8_0(v *Value) bool { 15401 // match: (Com8 x) 15402 // cond: 15403 // result: (MVN x) 15404 for { 15405 x := v.Args[0] 15406 v.reset(OpARMMVN) 15407 v.AddArg(x) 15408 return true 15409 } 15410 } 15411 func rewriteValueARM_OpConst16_0(v *Value) bool { 15412 // match: (Const16 [val]) 15413 // cond: 15414 // result: (MOVWconst [val]) 15415 for { 15416 val := v.AuxInt 15417 v.reset(OpARMMOVWconst) 15418 v.AuxInt = val 15419 return true 15420 } 15421 } 15422 func rewriteValueARM_OpConst32_0(v *Value) bool { 15423 // match: (Const32 [val]) 15424 // cond: 15425 // result: (MOVWconst [val]) 15426 for { 15427 val := v.AuxInt 15428 v.reset(OpARMMOVWconst) 15429 v.AuxInt = val 15430 return true 15431 } 15432 } 15433 func rewriteValueARM_OpConst32F_0(v *Value) bool { 15434 // match: (Const32F [val]) 15435 // cond: 15436 // result: (MOVFconst [val]) 15437 for { 15438 val := v.AuxInt 15439 v.reset(OpARMMOVFconst) 15440 v.AuxInt = val 15441 return true 15442 } 15443 } 15444 func rewriteValueARM_OpConst64F_0(v *Value) bool { 15445 // match: (Const64F [val]) 15446 // cond: 15447 // result: (MOVDconst [val]) 15448 for { 15449 val := v.AuxInt 15450 v.reset(OpARMMOVDconst) 15451 v.AuxInt = val 15452 return true 15453 } 15454 } 15455 func rewriteValueARM_OpConst8_0(v *Value) bool { 15456 // match: (Const8 [val]) 15457 // cond: 15458 // result: (MOVWconst [val]) 15459 for { 15460 val := v.AuxInt 15461 v.reset(OpARMMOVWconst) 15462 v.AuxInt = val 15463 return true 15464 } 15465 } 15466 func rewriteValueARM_OpConstBool_0(v *Value) bool { 15467 // match: (ConstBool [b]) 15468 // cond: 15469 // result: (MOVWconst [b]) 15470 for { 15471 b := v.AuxInt 15472 v.reset(OpARMMOVWconst) 15473 v.AuxInt = b 15474 return true 15475 } 15476 } 15477 func rewriteValueARM_OpConstNil_0(v *Value) bool { 15478 // match: (ConstNil) 15479 // cond: 15480 // result: (MOVWconst [0]) 15481 for { 15482 v.reset(OpARMMOVWconst) 15483 v.AuxInt = 0 15484 return true 15485 } 15486 } 15487 func rewriteValueARM_OpConvert_0(v *Value) bool { 15488 // match: (Convert x mem) 15489 // cond: 15490 // result: (MOVWconvert x mem) 15491 for { 15492 _ = v.Args[1] 15493 x := v.Args[0] 15494 mem := v.Args[1] 15495 v.reset(OpARMMOVWconvert) 15496 v.AddArg(x) 15497 v.AddArg(mem) 15498 return true 15499 } 15500 } 15501 func rewriteValueARM_OpCtz32_0(v *Value) bool { 15502 b := v.Block 15503 _ = b 15504 // match: (Ctz32 <t> x) 15505 // cond: objabi.GOARM<=6 15506 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 15507 for { 15508 t := v.Type 15509 x := v.Args[0] 15510 if !(objabi.GOARM <= 6) { 15511 break 15512 } 15513 v.reset(OpARMRSBconst) 15514 v.AuxInt = 32 15515 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 15516 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 15517 v1.AuxInt = 1 15518 v2 := b.NewValue0(v.Pos, OpARMAND, t) 15519 v2.AddArg(x) 15520 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 15521 v3.AuxInt = 0 15522 v3.AddArg(x) 15523 v2.AddArg(v3) 15524 v1.AddArg(v2) 15525 v0.AddArg(v1) 15526 v.AddArg(v0) 15527 return true 15528 } 15529 // match: (Ctz32 <t> x) 15530 // cond: objabi.GOARM==7 15531 // result: (CLZ <t> (RBIT <t> x)) 15532 for { 15533 t := v.Type 15534 x := v.Args[0] 15535 if !(objabi.GOARM == 7) { 15536 break 15537 } 15538 v.reset(OpARMCLZ) 15539 v.Type = t 15540 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 15541 v0.AddArg(x) 15542 v.AddArg(v0) 15543 return true 15544 } 15545 return false 15546 } 15547 func rewriteValueARM_OpCvt32Fto32_0(v *Value) bool { 15548 // match: (Cvt32Fto32 x) 15549 // cond: 15550 // result: (MOVFW x) 15551 for { 15552 x := v.Args[0] 15553 v.reset(OpARMMOVFW) 15554 v.AddArg(x) 15555 return true 15556 } 15557 } 15558 func rewriteValueARM_OpCvt32Fto32U_0(v *Value) bool { 15559 // match: (Cvt32Fto32U x) 15560 // cond: 15561 // result: (MOVFWU x) 15562 for { 15563 x := v.Args[0] 15564 v.reset(OpARMMOVFWU) 15565 v.AddArg(x) 15566 return true 15567 } 15568 } 15569 func rewriteValueARM_OpCvt32Fto64F_0(v *Value) bool { 15570 // match: (Cvt32Fto64F x) 15571 // cond: 15572 // result: (MOVFD x) 15573 for { 15574 x := v.Args[0] 15575 v.reset(OpARMMOVFD) 15576 v.AddArg(x) 15577 return true 15578 } 15579 } 15580 func rewriteValueARM_OpCvt32Uto32F_0(v *Value) bool { 15581 // match: (Cvt32Uto32F x) 15582 // cond: 15583 // result: (MOVWUF x) 15584 for { 15585 x := v.Args[0] 15586 v.reset(OpARMMOVWUF) 15587 v.AddArg(x) 15588 return true 15589 } 15590 } 15591 func rewriteValueARM_OpCvt32Uto64F_0(v *Value) bool { 15592 // match: (Cvt32Uto64F x) 15593 // cond: 15594 // result: (MOVWUD x) 15595 for { 15596 x := v.Args[0] 15597 v.reset(OpARMMOVWUD) 15598 v.AddArg(x) 15599 return true 15600 } 15601 } 15602 func rewriteValueARM_OpCvt32to32F_0(v *Value) bool { 15603 // match: (Cvt32to32F x) 15604 // cond: 15605 // result: (MOVWF x) 15606 for { 15607 x := v.Args[0] 15608 v.reset(OpARMMOVWF) 15609 v.AddArg(x) 15610 return true 15611 } 15612 } 15613 func rewriteValueARM_OpCvt32to64F_0(v *Value) bool { 15614 // match: (Cvt32to64F x) 15615 // cond: 15616 // result: (MOVWD x) 15617 for { 15618 x := v.Args[0] 15619 v.reset(OpARMMOVWD) 15620 v.AddArg(x) 15621 return true 15622 } 15623 } 15624 func rewriteValueARM_OpCvt64Fto32_0(v *Value) bool { 15625 // match: (Cvt64Fto32 x) 15626 // cond: 15627 // result: (MOVDW x) 15628 for { 15629 x := v.Args[0] 15630 v.reset(OpARMMOVDW) 15631 v.AddArg(x) 15632 return true 15633 } 15634 } 15635 func rewriteValueARM_OpCvt64Fto32F_0(v *Value) bool { 15636 // match: (Cvt64Fto32F x) 15637 // cond: 15638 // result: (MOVDF x) 15639 for { 15640 x := v.Args[0] 15641 v.reset(OpARMMOVDF) 15642 v.AddArg(x) 15643 return true 15644 } 15645 } 15646 func rewriteValueARM_OpCvt64Fto32U_0(v *Value) bool { 15647 // match: (Cvt64Fto32U x) 15648 // cond: 15649 // result: (MOVDWU x) 15650 for { 15651 x := v.Args[0] 15652 v.reset(OpARMMOVDWU) 15653 v.AddArg(x) 15654 return true 15655 } 15656 } 15657 func rewriteValueARM_OpDiv16_0(v *Value) bool { 15658 b := v.Block 15659 _ = b 15660 typ := &b.Func.Config.Types 15661 _ = typ 15662 // match: (Div16 x y) 15663 // cond: 15664 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 15665 for { 15666 _ = v.Args[1] 15667 x := v.Args[0] 15668 y := v.Args[1] 15669 v.reset(OpDiv32) 15670 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15671 v0.AddArg(x) 15672 v.AddArg(v0) 15673 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15674 v1.AddArg(y) 15675 v.AddArg(v1) 15676 return true 15677 } 15678 } 15679 func rewriteValueARM_OpDiv16u_0(v *Value) bool { 15680 b := v.Block 15681 _ = b 15682 typ := &b.Func.Config.Types 15683 _ = typ 15684 // match: (Div16u x y) 15685 // cond: 15686 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 15687 for { 15688 _ = v.Args[1] 15689 x := v.Args[0] 15690 y := v.Args[1] 15691 v.reset(OpDiv32u) 15692 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15693 v0.AddArg(x) 15694 v.AddArg(v0) 15695 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15696 v1.AddArg(y) 15697 v.AddArg(v1) 15698 return true 15699 } 15700 } 15701 func rewriteValueARM_OpDiv32_0(v *Value) bool { 15702 b := v.Block 15703 _ = b 15704 typ := &b.Func.Config.Types 15705 _ = typ 15706 // match: (Div32 x y) 15707 // cond: 15708 // result: (SUB (XOR <typ.UInt32> (Select0 <typ.UInt32> (CALLudiv (SUB <typ.UInt32> (XOR x <typ.UInt32> (Signmask x)) (Signmask x)) (SUB <typ.UInt32> (XOR y <typ.UInt32> (Signmask y)) (Signmask y)))) (Signmask (XOR <typ.UInt32> x y))) (Signmask (XOR <typ.UInt32> x y))) 15709 for { 15710 _ = v.Args[1] 15711 x := v.Args[0] 15712 y := v.Args[1] 15713 v.reset(OpARMSUB) 15714 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 15715 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 15716 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 15717 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 15718 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 15719 v4.AddArg(x) 15720 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 15721 v5.AddArg(x) 15722 v4.AddArg(v5) 15723 v3.AddArg(v4) 15724 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 15725 v6.AddArg(x) 15726 v3.AddArg(v6) 15727 v2.AddArg(v3) 15728 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 15729 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 15730 v8.AddArg(y) 15731 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 15732 v9.AddArg(y) 15733 v8.AddArg(v9) 15734 v7.AddArg(v8) 15735 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 15736 v10.AddArg(y) 15737 v7.AddArg(v10) 15738 v2.AddArg(v7) 15739 v1.AddArg(v2) 15740 v0.AddArg(v1) 15741 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 15742 v12 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 15743 v12.AddArg(x) 15744 v12.AddArg(y) 15745 v11.AddArg(v12) 15746 v0.AddArg(v11) 15747 v.AddArg(v0) 15748 v13 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 15749 v14 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 15750 v14.AddArg(x) 15751 v14.AddArg(y) 15752 v13.AddArg(v14) 15753 v.AddArg(v13) 15754 return true 15755 } 15756 } 15757 func rewriteValueARM_OpDiv32F_0(v *Value) bool { 15758 // match: (Div32F x y) 15759 // cond: 15760 // result: (DIVF x y) 15761 for { 15762 _ = v.Args[1] 15763 x := v.Args[0] 15764 y := v.Args[1] 15765 v.reset(OpARMDIVF) 15766 v.AddArg(x) 15767 v.AddArg(y) 15768 return true 15769 } 15770 } 15771 func rewriteValueARM_OpDiv32u_0(v *Value) bool { 15772 b := v.Block 15773 _ = b 15774 typ := &b.Func.Config.Types 15775 _ = typ 15776 // match: (Div32u x y) 15777 // cond: 15778 // result: (Select0 <typ.UInt32> (CALLudiv x y)) 15779 for { 15780 _ = v.Args[1] 15781 x := v.Args[0] 15782 y := v.Args[1] 15783 v.reset(OpSelect0) 15784 v.Type = typ.UInt32 15785 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 15786 v0.AddArg(x) 15787 v0.AddArg(y) 15788 v.AddArg(v0) 15789 return true 15790 } 15791 } 15792 func rewriteValueARM_OpDiv64F_0(v *Value) bool { 15793 // match: (Div64F x y) 15794 // cond: 15795 // result: (DIVD x y) 15796 for { 15797 _ = v.Args[1] 15798 x := v.Args[0] 15799 y := v.Args[1] 15800 v.reset(OpARMDIVD) 15801 v.AddArg(x) 15802 v.AddArg(y) 15803 return true 15804 } 15805 } 15806 func rewriteValueARM_OpDiv8_0(v *Value) bool { 15807 b := v.Block 15808 _ = b 15809 typ := &b.Func.Config.Types 15810 _ = typ 15811 // match: (Div8 x y) 15812 // cond: 15813 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 15814 for { 15815 _ = v.Args[1] 15816 x := v.Args[0] 15817 y := v.Args[1] 15818 v.reset(OpDiv32) 15819 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15820 v0.AddArg(x) 15821 v.AddArg(v0) 15822 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15823 v1.AddArg(y) 15824 v.AddArg(v1) 15825 return true 15826 } 15827 } 15828 func rewriteValueARM_OpDiv8u_0(v *Value) bool { 15829 b := v.Block 15830 _ = b 15831 typ := &b.Func.Config.Types 15832 _ = typ 15833 // match: (Div8u x y) 15834 // cond: 15835 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 15836 for { 15837 _ = v.Args[1] 15838 x := v.Args[0] 15839 y := v.Args[1] 15840 v.reset(OpDiv32u) 15841 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15842 v0.AddArg(x) 15843 v.AddArg(v0) 15844 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15845 v1.AddArg(y) 15846 v.AddArg(v1) 15847 return true 15848 } 15849 } 15850 func rewriteValueARM_OpEq16_0(v *Value) bool { 15851 b := v.Block 15852 _ = b 15853 typ := &b.Func.Config.Types 15854 _ = typ 15855 // match: (Eq16 x y) 15856 // cond: 15857 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 15858 for { 15859 _ = v.Args[1] 15860 x := v.Args[0] 15861 y := v.Args[1] 15862 v.reset(OpARMEqual) 15863 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15864 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15865 v1.AddArg(x) 15866 v0.AddArg(v1) 15867 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15868 v2.AddArg(y) 15869 v0.AddArg(v2) 15870 v.AddArg(v0) 15871 return true 15872 } 15873 } 15874 func rewriteValueARM_OpEq32_0(v *Value) bool { 15875 b := v.Block 15876 _ = b 15877 // match: (Eq32 x y) 15878 // cond: 15879 // result: (Equal (CMP x y)) 15880 for { 15881 _ = v.Args[1] 15882 x := v.Args[0] 15883 y := v.Args[1] 15884 v.reset(OpARMEqual) 15885 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15886 v0.AddArg(x) 15887 v0.AddArg(y) 15888 v.AddArg(v0) 15889 return true 15890 } 15891 } 15892 func rewriteValueARM_OpEq32F_0(v *Value) bool { 15893 b := v.Block 15894 _ = b 15895 // match: (Eq32F x y) 15896 // cond: 15897 // result: (Equal (CMPF x y)) 15898 for { 15899 _ = v.Args[1] 15900 x := v.Args[0] 15901 y := v.Args[1] 15902 v.reset(OpARMEqual) 15903 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 15904 v0.AddArg(x) 15905 v0.AddArg(y) 15906 v.AddArg(v0) 15907 return true 15908 } 15909 } 15910 func rewriteValueARM_OpEq64F_0(v *Value) bool { 15911 b := v.Block 15912 _ = b 15913 // match: (Eq64F x y) 15914 // cond: 15915 // result: (Equal (CMPD x y)) 15916 for { 15917 _ = v.Args[1] 15918 x := v.Args[0] 15919 y := v.Args[1] 15920 v.reset(OpARMEqual) 15921 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 15922 v0.AddArg(x) 15923 v0.AddArg(y) 15924 v.AddArg(v0) 15925 return true 15926 } 15927 } 15928 func rewriteValueARM_OpEq8_0(v *Value) bool { 15929 b := v.Block 15930 _ = b 15931 typ := &b.Func.Config.Types 15932 _ = typ 15933 // match: (Eq8 x y) 15934 // cond: 15935 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15936 for { 15937 _ = v.Args[1] 15938 x := v.Args[0] 15939 y := v.Args[1] 15940 v.reset(OpARMEqual) 15941 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15942 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15943 v1.AddArg(x) 15944 v0.AddArg(v1) 15945 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15946 v2.AddArg(y) 15947 v0.AddArg(v2) 15948 v.AddArg(v0) 15949 return true 15950 } 15951 } 15952 func rewriteValueARM_OpEqB_0(v *Value) bool { 15953 b := v.Block 15954 _ = b 15955 typ := &b.Func.Config.Types 15956 _ = typ 15957 // match: (EqB x y) 15958 // cond: 15959 // result: (XORconst [1] (XOR <typ.Bool> x y)) 15960 for { 15961 _ = v.Args[1] 15962 x := v.Args[0] 15963 y := v.Args[1] 15964 v.reset(OpARMXORconst) 15965 v.AuxInt = 1 15966 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool) 15967 v0.AddArg(x) 15968 v0.AddArg(y) 15969 v.AddArg(v0) 15970 return true 15971 } 15972 } 15973 func rewriteValueARM_OpEqPtr_0(v *Value) bool { 15974 b := v.Block 15975 _ = b 15976 // match: (EqPtr x y) 15977 // cond: 15978 // result: (Equal (CMP x y)) 15979 for { 15980 _ = v.Args[1] 15981 x := v.Args[0] 15982 y := v.Args[1] 15983 v.reset(OpARMEqual) 15984 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15985 v0.AddArg(x) 15986 v0.AddArg(y) 15987 v.AddArg(v0) 15988 return true 15989 } 15990 } 15991 func rewriteValueARM_OpGeq16_0(v *Value) bool { 15992 b := v.Block 15993 _ = b 15994 typ := &b.Func.Config.Types 15995 _ = typ 15996 // match: (Geq16 x y) 15997 // cond: 15998 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 15999 for { 16000 _ = v.Args[1] 16001 x := v.Args[0] 16002 y := v.Args[1] 16003 v.reset(OpARMGreaterEqual) 16004 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16005 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16006 v1.AddArg(x) 16007 v0.AddArg(v1) 16008 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16009 v2.AddArg(y) 16010 v0.AddArg(v2) 16011 v.AddArg(v0) 16012 return true 16013 } 16014 } 16015 func rewriteValueARM_OpGeq16U_0(v *Value) bool { 16016 b := v.Block 16017 _ = b 16018 typ := &b.Func.Config.Types 16019 _ = typ 16020 // match: (Geq16U x y) 16021 // cond: 16022 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 16023 for { 16024 _ = v.Args[1] 16025 x := v.Args[0] 16026 y := v.Args[1] 16027 v.reset(OpARMGreaterEqualU) 16028 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16029 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16030 v1.AddArg(x) 16031 v0.AddArg(v1) 16032 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16033 v2.AddArg(y) 16034 v0.AddArg(v2) 16035 v.AddArg(v0) 16036 return true 16037 } 16038 } 16039 func rewriteValueARM_OpGeq32_0(v *Value) bool { 16040 b := v.Block 16041 _ = b 16042 // match: (Geq32 x y) 16043 // cond: 16044 // result: (GreaterEqual (CMP x y)) 16045 for { 16046 _ = v.Args[1] 16047 x := v.Args[0] 16048 y := v.Args[1] 16049 v.reset(OpARMGreaterEqual) 16050 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16051 v0.AddArg(x) 16052 v0.AddArg(y) 16053 v.AddArg(v0) 16054 return true 16055 } 16056 } 16057 func rewriteValueARM_OpGeq32F_0(v *Value) bool { 16058 b := v.Block 16059 _ = b 16060 // match: (Geq32F x y) 16061 // cond: 16062 // result: (GreaterEqual (CMPF x y)) 16063 for { 16064 _ = v.Args[1] 16065 x := v.Args[0] 16066 y := v.Args[1] 16067 v.reset(OpARMGreaterEqual) 16068 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 16069 v0.AddArg(x) 16070 v0.AddArg(y) 16071 v.AddArg(v0) 16072 return true 16073 } 16074 } 16075 func rewriteValueARM_OpGeq32U_0(v *Value) bool { 16076 b := v.Block 16077 _ = b 16078 // match: (Geq32U x y) 16079 // cond: 16080 // result: (GreaterEqualU (CMP x y)) 16081 for { 16082 _ = v.Args[1] 16083 x := v.Args[0] 16084 y := v.Args[1] 16085 v.reset(OpARMGreaterEqualU) 16086 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16087 v0.AddArg(x) 16088 v0.AddArg(y) 16089 v.AddArg(v0) 16090 return true 16091 } 16092 } 16093 func rewriteValueARM_OpGeq64F_0(v *Value) bool { 16094 b := v.Block 16095 _ = b 16096 // match: (Geq64F x y) 16097 // cond: 16098 // result: (GreaterEqual (CMPD x y)) 16099 for { 16100 _ = v.Args[1] 16101 x := v.Args[0] 16102 y := v.Args[1] 16103 v.reset(OpARMGreaterEqual) 16104 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 16105 v0.AddArg(x) 16106 v0.AddArg(y) 16107 v.AddArg(v0) 16108 return true 16109 } 16110 } 16111 func rewriteValueARM_OpGeq8_0(v *Value) bool { 16112 b := v.Block 16113 _ = b 16114 typ := &b.Func.Config.Types 16115 _ = typ 16116 // match: (Geq8 x y) 16117 // cond: 16118 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 16119 for { 16120 _ = v.Args[1] 16121 x := v.Args[0] 16122 y := v.Args[1] 16123 v.reset(OpARMGreaterEqual) 16124 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16125 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16126 v1.AddArg(x) 16127 v0.AddArg(v1) 16128 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16129 v2.AddArg(y) 16130 v0.AddArg(v2) 16131 v.AddArg(v0) 16132 return true 16133 } 16134 } 16135 func rewriteValueARM_OpGeq8U_0(v *Value) bool { 16136 b := v.Block 16137 _ = b 16138 typ := &b.Func.Config.Types 16139 _ = typ 16140 // match: (Geq8U x y) 16141 // cond: 16142 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 16143 for { 16144 _ = v.Args[1] 16145 x := v.Args[0] 16146 y := v.Args[1] 16147 v.reset(OpARMGreaterEqualU) 16148 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16149 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16150 v1.AddArg(x) 16151 v0.AddArg(v1) 16152 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16153 v2.AddArg(y) 16154 v0.AddArg(v2) 16155 v.AddArg(v0) 16156 return true 16157 } 16158 } 16159 func rewriteValueARM_OpGetClosurePtr_0(v *Value) bool { 16160 // match: (GetClosurePtr) 16161 // cond: 16162 // result: (LoweredGetClosurePtr) 16163 for { 16164 v.reset(OpARMLoweredGetClosurePtr) 16165 return true 16166 } 16167 } 16168 func rewriteValueARM_OpGreater16_0(v *Value) bool { 16169 b := v.Block 16170 _ = b 16171 typ := &b.Func.Config.Types 16172 _ = typ 16173 // match: (Greater16 x y) 16174 // cond: 16175 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 16176 for { 16177 _ = v.Args[1] 16178 x := v.Args[0] 16179 y := v.Args[1] 16180 v.reset(OpARMGreaterThan) 16181 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16182 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16183 v1.AddArg(x) 16184 v0.AddArg(v1) 16185 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16186 v2.AddArg(y) 16187 v0.AddArg(v2) 16188 v.AddArg(v0) 16189 return true 16190 } 16191 } 16192 func rewriteValueARM_OpGreater16U_0(v *Value) bool { 16193 b := v.Block 16194 _ = b 16195 typ := &b.Func.Config.Types 16196 _ = typ 16197 // match: (Greater16U x y) 16198 // cond: 16199 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 16200 for { 16201 _ = v.Args[1] 16202 x := v.Args[0] 16203 y := v.Args[1] 16204 v.reset(OpARMGreaterThanU) 16205 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16206 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16207 v1.AddArg(x) 16208 v0.AddArg(v1) 16209 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16210 v2.AddArg(y) 16211 v0.AddArg(v2) 16212 v.AddArg(v0) 16213 return true 16214 } 16215 } 16216 func rewriteValueARM_OpGreater32_0(v *Value) bool { 16217 b := v.Block 16218 _ = b 16219 // match: (Greater32 x y) 16220 // cond: 16221 // result: (GreaterThan (CMP x y)) 16222 for { 16223 _ = v.Args[1] 16224 x := v.Args[0] 16225 y := v.Args[1] 16226 v.reset(OpARMGreaterThan) 16227 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16228 v0.AddArg(x) 16229 v0.AddArg(y) 16230 v.AddArg(v0) 16231 return true 16232 } 16233 } 16234 func rewriteValueARM_OpGreater32F_0(v *Value) bool { 16235 b := v.Block 16236 _ = b 16237 // match: (Greater32F x y) 16238 // cond: 16239 // result: (GreaterThan (CMPF x y)) 16240 for { 16241 _ = v.Args[1] 16242 x := v.Args[0] 16243 y := v.Args[1] 16244 v.reset(OpARMGreaterThan) 16245 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 16246 v0.AddArg(x) 16247 v0.AddArg(y) 16248 v.AddArg(v0) 16249 return true 16250 } 16251 } 16252 func rewriteValueARM_OpGreater32U_0(v *Value) bool { 16253 b := v.Block 16254 _ = b 16255 // match: (Greater32U x y) 16256 // cond: 16257 // result: (GreaterThanU (CMP x y)) 16258 for { 16259 _ = v.Args[1] 16260 x := v.Args[0] 16261 y := v.Args[1] 16262 v.reset(OpARMGreaterThanU) 16263 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16264 v0.AddArg(x) 16265 v0.AddArg(y) 16266 v.AddArg(v0) 16267 return true 16268 } 16269 } 16270 func rewriteValueARM_OpGreater64F_0(v *Value) bool { 16271 b := v.Block 16272 _ = b 16273 // match: (Greater64F x y) 16274 // cond: 16275 // result: (GreaterThan (CMPD x y)) 16276 for { 16277 _ = v.Args[1] 16278 x := v.Args[0] 16279 y := v.Args[1] 16280 v.reset(OpARMGreaterThan) 16281 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 16282 v0.AddArg(x) 16283 v0.AddArg(y) 16284 v.AddArg(v0) 16285 return true 16286 } 16287 } 16288 func rewriteValueARM_OpGreater8_0(v *Value) bool { 16289 b := v.Block 16290 _ = b 16291 typ := &b.Func.Config.Types 16292 _ = typ 16293 // match: (Greater8 x y) 16294 // cond: 16295 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 16296 for { 16297 _ = v.Args[1] 16298 x := v.Args[0] 16299 y := v.Args[1] 16300 v.reset(OpARMGreaterThan) 16301 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16302 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16303 v1.AddArg(x) 16304 v0.AddArg(v1) 16305 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16306 v2.AddArg(y) 16307 v0.AddArg(v2) 16308 v.AddArg(v0) 16309 return true 16310 } 16311 } 16312 func rewriteValueARM_OpGreater8U_0(v *Value) bool { 16313 b := v.Block 16314 _ = b 16315 typ := &b.Func.Config.Types 16316 _ = typ 16317 // match: (Greater8U x y) 16318 // cond: 16319 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 16320 for { 16321 _ = v.Args[1] 16322 x := v.Args[0] 16323 y := v.Args[1] 16324 v.reset(OpARMGreaterThanU) 16325 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16326 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16327 v1.AddArg(x) 16328 v0.AddArg(v1) 16329 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16330 v2.AddArg(y) 16331 v0.AddArg(v2) 16332 v.AddArg(v0) 16333 return true 16334 } 16335 } 16336 func rewriteValueARM_OpHmul32_0(v *Value) bool { 16337 // match: (Hmul32 x y) 16338 // cond: 16339 // result: (HMUL x y) 16340 for { 16341 _ = v.Args[1] 16342 x := v.Args[0] 16343 y := v.Args[1] 16344 v.reset(OpARMHMUL) 16345 v.AddArg(x) 16346 v.AddArg(y) 16347 return true 16348 } 16349 } 16350 func rewriteValueARM_OpHmul32u_0(v *Value) bool { 16351 // match: (Hmul32u x y) 16352 // cond: 16353 // result: (HMULU x y) 16354 for { 16355 _ = v.Args[1] 16356 x := v.Args[0] 16357 y := v.Args[1] 16358 v.reset(OpARMHMULU) 16359 v.AddArg(x) 16360 v.AddArg(y) 16361 return true 16362 } 16363 } 16364 func rewriteValueARM_OpInterCall_0(v *Value) bool { 16365 // match: (InterCall [argwid] entry mem) 16366 // cond: 16367 // result: (CALLinter [argwid] entry mem) 16368 for { 16369 argwid := v.AuxInt 16370 _ = v.Args[1] 16371 entry := v.Args[0] 16372 mem := v.Args[1] 16373 v.reset(OpARMCALLinter) 16374 v.AuxInt = argwid 16375 v.AddArg(entry) 16376 v.AddArg(mem) 16377 return true 16378 } 16379 } 16380 func rewriteValueARM_OpIsInBounds_0(v *Value) bool { 16381 b := v.Block 16382 _ = b 16383 // match: (IsInBounds idx len) 16384 // cond: 16385 // result: (LessThanU (CMP idx len)) 16386 for { 16387 _ = v.Args[1] 16388 idx := v.Args[0] 16389 len := v.Args[1] 16390 v.reset(OpARMLessThanU) 16391 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16392 v0.AddArg(idx) 16393 v0.AddArg(len) 16394 v.AddArg(v0) 16395 return true 16396 } 16397 } 16398 func rewriteValueARM_OpIsNonNil_0(v *Value) bool { 16399 b := v.Block 16400 _ = b 16401 // match: (IsNonNil ptr) 16402 // cond: 16403 // result: (NotEqual (CMPconst [0] ptr)) 16404 for { 16405 ptr := v.Args[0] 16406 v.reset(OpARMNotEqual) 16407 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 16408 v0.AuxInt = 0 16409 v0.AddArg(ptr) 16410 v.AddArg(v0) 16411 return true 16412 } 16413 } 16414 func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { 16415 b := v.Block 16416 _ = b 16417 // match: (IsSliceInBounds idx len) 16418 // cond: 16419 // result: (LessEqualU (CMP idx len)) 16420 for { 16421 _ = v.Args[1] 16422 idx := v.Args[0] 16423 len := v.Args[1] 16424 v.reset(OpARMLessEqualU) 16425 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16426 v0.AddArg(idx) 16427 v0.AddArg(len) 16428 v.AddArg(v0) 16429 return true 16430 } 16431 } 16432 func rewriteValueARM_OpLeq16_0(v *Value) bool { 16433 b := v.Block 16434 _ = b 16435 typ := &b.Func.Config.Types 16436 _ = typ 16437 // match: (Leq16 x y) 16438 // cond: 16439 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 16440 for { 16441 _ = v.Args[1] 16442 x := v.Args[0] 16443 y := v.Args[1] 16444 v.reset(OpARMLessEqual) 16445 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16446 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16447 v1.AddArg(x) 16448 v0.AddArg(v1) 16449 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16450 v2.AddArg(y) 16451 v0.AddArg(v2) 16452 v.AddArg(v0) 16453 return true 16454 } 16455 } 16456 func rewriteValueARM_OpLeq16U_0(v *Value) bool { 16457 b := v.Block 16458 _ = b 16459 typ := &b.Func.Config.Types 16460 _ = typ 16461 // match: (Leq16U x y) 16462 // cond: 16463 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 16464 for { 16465 _ = v.Args[1] 16466 x := v.Args[0] 16467 y := v.Args[1] 16468 v.reset(OpARMLessEqualU) 16469 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16470 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16471 v1.AddArg(x) 16472 v0.AddArg(v1) 16473 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16474 v2.AddArg(y) 16475 v0.AddArg(v2) 16476 v.AddArg(v0) 16477 return true 16478 } 16479 } 16480 func rewriteValueARM_OpLeq32_0(v *Value) bool { 16481 b := v.Block 16482 _ = b 16483 // match: (Leq32 x y) 16484 // cond: 16485 // result: (LessEqual (CMP x y)) 16486 for { 16487 _ = v.Args[1] 16488 x := v.Args[0] 16489 y := v.Args[1] 16490 v.reset(OpARMLessEqual) 16491 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16492 v0.AddArg(x) 16493 v0.AddArg(y) 16494 v.AddArg(v0) 16495 return true 16496 } 16497 } 16498 func rewriteValueARM_OpLeq32F_0(v *Value) bool { 16499 b := v.Block 16500 _ = b 16501 // match: (Leq32F x y) 16502 // cond: 16503 // result: (GreaterEqual (CMPF y x)) 16504 for { 16505 _ = v.Args[1] 16506 x := v.Args[0] 16507 y := v.Args[1] 16508 v.reset(OpARMGreaterEqual) 16509 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 16510 v0.AddArg(y) 16511 v0.AddArg(x) 16512 v.AddArg(v0) 16513 return true 16514 } 16515 } 16516 func rewriteValueARM_OpLeq32U_0(v *Value) bool { 16517 b := v.Block 16518 _ = b 16519 // match: (Leq32U x y) 16520 // cond: 16521 // result: (LessEqualU (CMP x y)) 16522 for { 16523 _ = v.Args[1] 16524 x := v.Args[0] 16525 y := v.Args[1] 16526 v.reset(OpARMLessEqualU) 16527 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16528 v0.AddArg(x) 16529 v0.AddArg(y) 16530 v.AddArg(v0) 16531 return true 16532 } 16533 } 16534 func rewriteValueARM_OpLeq64F_0(v *Value) bool { 16535 b := v.Block 16536 _ = b 16537 // match: (Leq64F x y) 16538 // cond: 16539 // result: (GreaterEqual (CMPD y x)) 16540 for { 16541 _ = v.Args[1] 16542 x := v.Args[0] 16543 y := v.Args[1] 16544 v.reset(OpARMGreaterEqual) 16545 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 16546 v0.AddArg(y) 16547 v0.AddArg(x) 16548 v.AddArg(v0) 16549 return true 16550 } 16551 } 16552 func rewriteValueARM_OpLeq8_0(v *Value) bool { 16553 b := v.Block 16554 _ = b 16555 typ := &b.Func.Config.Types 16556 _ = typ 16557 // match: (Leq8 x y) 16558 // cond: 16559 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 16560 for { 16561 _ = v.Args[1] 16562 x := v.Args[0] 16563 y := v.Args[1] 16564 v.reset(OpARMLessEqual) 16565 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16566 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16567 v1.AddArg(x) 16568 v0.AddArg(v1) 16569 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16570 v2.AddArg(y) 16571 v0.AddArg(v2) 16572 v.AddArg(v0) 16573 return true 16574 } 16575 } 16576 func rewriteValueARM_OpLeq8U_0(v *Value) bool { 16577 b := v.Block 16578 _ = b 16579 typ := &b.Func.Config.Types 16580 _ = typ 16581 // match: (Leq8U x y) 16582 // cond: 16583 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 16584 for { 16585 _ = v.Args[1] 16586 x := v.Args[0] 16587 y := v.Args[1] 16588 v.reset(OpARMLessEqualU) 16589 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16590 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16591 v1.AddArg(x) 16592 v0.AddArg(v1) 16593 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16594 v2.AddArg(y) 16595 v0.AddArg(v2) 16596 v.AddArg(v0) 16597 return true 16598 } 16599 } 16600 func rewriteValueARM_OpLess16_0(v *Value) bool { 16601 b := v.Block 16602 _ = b 16603 typ := &b.Func.Config.Types 16604 _ = typ 16605 // match: (Less16 x y) 16606 // cond: 16607 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 16608 for { 16609 _ = v.Args[1] 16610 x := v.Args[0] 16611 y := v.Args[1] 16612 v.reset(OpARMLessThan) 16613 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16614 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16615 v1.AddArg(x) 16616 v0.AddArg(v1) 16617 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16618 v2.AddArg(y) 16619 v0.AddArg(v2) 16620 v.AddArg(v0) 16621 return true 16622 } 16623 } 16624 func rewriteValueARM_OpLess16U_0(v *Value) bool { 16625 b := v.Block 16626 _ = b 16627 typ := &b.Func.Config.Types 16628 _ = typ 16629 // match: (Less16U x y) 16630 // cond: 16631 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 16632 for { 16633 _ = v.Args[1] 16634 x := v.Args[0] 16635 y := v.Args[1] 16636 v.reset(OpARMLessThanU) 16637 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16638 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16639 v1.AddArg(x) 16640 v0.AddArg(v1) 16641 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16642 v2.AddArg(y) 16643 v0.AddArg(v2) 16644 v.AddArg(v0) 16645 return true 16646 } 16647 } 16648 func rewriteValueARM_OpLess32_0(v *Value) bool { 16649 b := v.Block 16650 _ = b 16651 // match: (Less32 x y) 16652 // cond: 16653 // result: (LessThan (CMP x y)) 16654 for { 16655 _ = v.Args[1] 16656 x := v.Args[0] 16657 y := v.Args[1] 16658 v.reset(OpARMLessThan) 16659 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16660 v0.AddArg(x) 16661 v0.AddArg(y) 16662 v.AddArg(v0) 16663 return true 16664 } 16665 } 16666 func rewriteValueARM_OpLess32F_0(v *Value) bool { 16667 b := v.Block 16668 _ = b 16669 // match: (Less32F x y) 16670 // cond: 16671 // result: (GreaterThan (CMPF y x)) 16672 for { 16673 _ = v.Args[1] 16674 x := v.Args[0] 16675 y := v.Args[1] 16676 v.reset(OpARMGreaterThan) 16677 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 16678 v0.AddArg(y) 16679 v0.AddArg(x) 16680 v.AddArg(v0) 16681 return true 16682 } 16683 } 16684 func rewriteValueARM_OpLess32U_0(v *Value) bool { 16685 b := v.Block 16686 _ = b 16687 // match: (Less32U x y) 16688 // cond: 16689 // result: (LessThanU (CMP x y)) 16690 for { 16691 _ = v.Args[1] 16692 x := v.Args[0] 16693 y := v.Args[1] 16694 v.reset(OpARMLessThanU) 16695 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16696 v0.AddArg(x) 16697 v0.AddArg(y) 16698 v.AddArg(v0) 16699 return true 16700 } 16701 } 16702 func rewriteValueARM_OpLess64F_0(v *Value) bool { 16703 b := v.Block 16704 _ = b 16705 // match: (Less64F x y) 16706 // cond: 16707 // result: (GreaterThan (CMPD y x)) 16708 for { 16709 _ = v.Args[1] 16710 x := v.Args[0] 16711 y := v.Args[1] 16712 v.reset(OpARMGreaterThan) 16713 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 16714 v0.AddArg(y) 16715 v0.AddArg(x) 16716 v.AddArg(v0) 16717 return true 16718 } 16719 } 16720 func rewriteValueARM_OpLess8_0(v *Value) bool { 16721 b := v.Block 16722 _ = b 16723 typ := &b.Func.Config.Types 16724 _ = typ 16725 // match: (Less8 x y) 16726 // cond: 16727 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 16728 for { 16729 _ = v.Args[1] 16730 x := v.Args[0] 16731 y := v.Args[1] 16732 v.reset(OpARMLessThan) 16733 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16734 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16735 v1.AddArg(x) 16736 v0.AddArg(v1) 16737 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16738 v2.AddArg(y) 16739 v0.AddArg(v2) 16740 v.AddArg(v0) 16741 return true 16742 } 16743 } 16744 func rewriteValueARM_OpLess8U_0(v *Value) bool { 16745 b := v.Block 16746 _ = b 16747 typ := &b.Func.Config.Types 16748 _ = typ 16749 // match: (Less8U x y) 16750 // cond: 16751 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 16752 for { 16753 _ = v.Args[1] 16754 x := v.Args[0] 16755 y := v.Args[1] 16756 v.reset(OpARMLessThanU) 16757 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16758 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16759 v1.AddArg(x) 16760 v0.AddArg(v1) 16761 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16762 v2.AddArg(y) 16763 v0.AddArg(v2) 16764 v.AddArg(v0) 16765 return true 16766 } 16767 } 16768 func rewriteValueARM_OpLoad_0(v *Value) bool { 16769 // match: (Load <t> ptr mem) 16770 // cond: t.IsBoolean() 16771 // result: (MOVBUload ptr mem) 16772 for { 16773 t := v.Type 16774 _ = v.Args[1] 16775 ptr := v.Args[0] 16776 mem := v.Args[1] 16777 if !(t.IsBoolean()) { 16778 break 16779 } 16780 v.reset(OpARMMOVBUload) 16781 v.AddArg(ptr) 16782 v.AddArg(mem) 16783 return true 16784 } 16785 // match: (Load <t> ptr mem) 16786 // cond: (is8BitInt(t) && isSigned(t)) 16787 // result: (MOVBload ptr mem) 16788 for { 16789 t := v.Type 16790 _ = v.Args[1] 16791 ptr := v.Args[0] 16792 mem := v.Args[1] 16793 if !(is8BitInt(t) && isSigned(t)) { 16794 break 16795 } 16796 v.reset(OpARMMOVBload) 16797 v.AddArg(ptr) 16798 v.AddArg(mem) 16799 return true 16800 } 16801 // match: (Load <t> ptr mem) 16802 // cond: (is8BitInt(t) && !isSigned(t)) 16803 // result: (MOVBUload ptr mem) 16804 for { 16805 t := v.Type 16806 _ = v.Args[1] 16807 ptr := v.Args[0] 16808 mem := v.Args[1] 16809 if !(is8BitInt(t) && !isSigned(t)) { 16810 break 16811 } 16812 v.reset(OpARMMOVBUload) 16813 v.AddArg(ptr) 16814 v.AddArg(mem) 16815 return true 16816 } 16817 // match: (Load <t> ptr mem) 16818 // cond: (is16BitInt(t) && isSigned(t)) 16819 // result: (MOVHload ptr mem) 16820 for { 16821 t := v.Type 16822 _ = v.Args[1] 16823 ptr := v.Args[0] 16824 mem := v.Args[1] 16825 if !(is16BitInt(t) && isSigned(t)) { 16826 break 16827 } 16828 v.reset(OpARMMOVHload) 16829 v.AddArg(ptr) 16830 v.AddArg(mem) 16831 return true 16832 } 16833 // match: (Load <t> ptr mem) 16834 // cond: (is16BitInt(t) && !isSigned(t)) 16835 // result: (MOVHUload ptr mem) 16836 for { 16837 t := v.Type 16838 _ = v.Args[1] 16839 ptr := v.Args[0] 16840 mem := v.Args[1] 16841 if !(is16BitInt(t) && !isSigned(t)) { 16842 break 16843 } 16844 v.reset(OpARMMOVHUload) 16845 v.AddArg(ptr) 16846 v.AddArg(mem) 16847 return true 16848 } 16849 // match: (Load <t> ptr mem) 16850 // cond: (is32BitInt(t) || isPtr(t)) 16851 // result: (MOVWload ptr mem) 16852 for { 16853 t := v.Type 16854 _ = v.Args[1] 16855 ptr := v.Args[0] 16856 mem := v.Args[1] 16857 if !(is32BitInt(t) || isPtr(t)) { 16858 break 16859 } 16860 v.reset(OpARMMOVWload) 16861 v.AddArg(ptr) 16862 v.AddArg(mem) 16863 return true 16864 } 16865 // match: (Load <t> ptr mem) 16866 // cond: is32BitFloat(t) 16867 // result: (MOVFload ptr mem) 16868 for { 16869 t := v.Type 16870 _ = v.Args[1] 16871 ptr := v.Args[0] 16872 mem := v.Args[1] 16873 if !(is32BitFloat(t)) { 16874 break 16875 } 16876 v.reset(OpARMMOVFload) 16877 v.AddArg(ptr) 16878 v.AddArg(mem) 16879 return true 16880 } 16881 // match: (Load <t> ptr mem) 16882 // cond: is64BitFloat(t) 16883 // result: (MOVDload ptr mem) 16884 for { 16885 t := v.Type 16886 _ = v.Args[1] 16887 ptr := v.Args[0] 16888 mem := v.Args[1] 16889 if !(is64BitFloat(t)) { 16890 break 16891 } 16892 v.reset(OpARMMOVDload) 16893 v.AddArg(ptr) 16894 v.AddArg(mem) 16895 return true 16896 } 16897 return false 16898 } 16899 func rewriteValueARM_OpLsh16x16_0(v *Value) bool { 16900 b := v.Block 16901 _ = b 16902 typ := &b.Func.Config.Types 16903 _ = typ 16904 // match: (Lsh16x16 x y) 16905 // cond: 16906 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 16907 for { 16908 _ = v.Args[1] 16909 x := v.Args[0] 16910 y := v.Args[1] 16911 v.reset(OpARMCMOVWHSconst) 16912 v.AuxInt = 0 16913 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 16914 v0.AddArg(x) 16915 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16916 v1.AddArg(y) 16917 v0.AddArg(v1) 16918 v.AddArg(v0) 16919 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 16920 v2.AuxInt = 256 16921 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16922 v3.AddArg(y) 16923 v2.AddArg(v3) 16924 v.AddArg(v2) 16925 return true 16926 } 16927 } 16928 func rewriteValueARM_OpLsh16x32_0(v *Value) bool { 16929 b := v.Block 16930 _ = b 16931 // match: (Lsh16x32 x y) 16932 // cond: 16933 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 16934 for { 16935 _ = v.Args[1] 16936 x := v.Args[0] 16937 y := v.Args[1] 16938 v.reset(OpARMCMOVWHSconst) 16939 v.AuxInt = 0 16940 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 16941 v0.AddArg(x) 16942 v0.AddArg(y) 16943 v.AddArg(v0) 16944 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 16945 v1.AuxInt = 256 16946 v1.AddArg(y) 16947 v.AddArg(v1) 16948 return true 16949 } 16950 } 16951 func rewriteValueARM_OpLsh16x64_0(v *Value) bool { 16952 // match: (Lsh16x64 x (Const64 [c])) 16953 // cond: uint64(c) < 16 16954 // result: (SLLconst x [c]) 16955 for { 16956 _ = v.Args[1] 16957 x := v.Args[0] 16958 v_1 := v.Args[1] 16959 if v_1.Op != OpConst64 { 16960 break 16961 } 16962 c := v_1.AuxInt 16963 if !(uint64(c) < 16) { 16964 break 16965 } 16966 v.reset(OpARMSLLconst) 16967 v.AuxInt = c 16968 v.AddArg(x) 16969 return true 16970 } 16971 // match: (Lsh16x64 _ (Const64 [c])) 16972 // cond: uint64(c) >= 16 16973 // result: (Const16 [0]) 16974 for { 16975 _ = v.Args[1] 16976 v_1 := v.Args[1] 16977 if v_1.Op != OpConst64 { 16978 break 16979 } 16980 c := v_1.AuxInt 16981 if !(uint64(c) >= 16) { 16982 break 16983 } 16984 v.reset(OpConst16) 16985 v.AuxInt = 0 16986 return true 16987 } 16988 return false 16989 } 16990 func rewriteValueARM_OpLsh16x8_0(v *Value) bool { 16991 b := v.Block 16992 _ = b 16993 typ := &b.Func.Config.Types 16994 _ = typ 16995 // match: (Lsh16x8 x y) 16996 // cond: 16997 // result: (SLL x (ZeroExt8to32 y)) 16998 for { 16999 _ = v.Args[1] 17000 x := v.Args[0] 17001 y := v.Args[1] 17002 v.reset(OpARMSLL) 17003 v.AddArg(x) 17004 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17005 v0.AddArg(y) 17006 v.AddArg(v0) 17007 return true 17008 } 17009 } 17010 func rewriteValueARM_OpLsh32x16_0(v *Value) bool { 17011 b := v.Block 17012 _ = b 17013 typ := &b.Func.Config.Types 17014 _ = typ 17015 // match: (Lsh32x16 x y) 17016 // cond: 17017 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 17018 for { 17019 _ = v.Args[1] 17020 x := v.Args[0] 17021 y := v.Args[1] 17022 v.reset(OpARMCMOVWHSconst) 17023 v.AuxInt = 0 17024 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 17025 v0.AddArg(x) 17026 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17027 v1.AddArg(y) 17028 v0.AddArg(v1) 17029 v.AddArg(v0) 17030 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17031 v2.AuxInt = 256 17032 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17033 v3.AddArg(y) 17034 v2.AddArg(v3) 17035 v.AddArg(v2) 17036 return true 17037 } 17038 } 17039 func rewriteValueARM_OpLsh32x32_0(v *Value) bool { 17040 b := v.Block 17041 _ = b 17042 // match: (Lsh32x32 x y) 17043 // cond: 17044 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 17045 for { 17046 _ = v.Args[1] 17047 x := v.Args[0] 17048 y := v.Args[1] 17049 v.reset(OpARMCMOVWHSconst) 17050 v.AuxInt = 0 17051 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 17052 v0.AddArg(x) 17053 v0.AddArg(y) 17054 v.AddArg(v0) 17055 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17056 v1.AuxInt = 256 17057 v1.AddArg(y) 17058 v.AddArg(v1) 17059 return true 17060 } 17061 } 17062 func rewriteValueARM_OpLsh32x64_0(v *Value) bool { 17063 // match: (Lsh32x64 x (Const64 [c])) 17064 // cond: uint64(c) < 32 17065 // result: (SLLconst x [c]) 17066 for { 17067 _ = v.Args[1] 17068 x := v.Args[0] 17069 v_1 := v.Args[1] 17070 if v_1.Op != OpConst64 { 17071 break 17072 } 17073 c := v_1.AuxInt 17074 if !(uint64(c) < 32) { 17075 break 17076 } 17077 v.reset(OpARMSLLconst) 17078 v.AuxInt = c 17079 v.AddArg(x) 17080 return true 17081 } 17082 // match: (Lsh32x64 _ (Const64 [c])) 17083 // cond: uint64(c) >= 32 17084 // result: (Const32 [0]) 17085 for { 17086 _ = v.Args[1] 17087 v_1 := v.Args[1] 17088 if v_1.Op != OpConst64 { 17089 break 17090 } 17091 c := v_1.AuxInt 17092 if !(uint64(c) >= 32) { 17093 break 17094 } 17095 v.reset(OpConst32) 17096 v.AuxInt = 0 17097 return true 17098 } 17099 return false 17100 } 17101 func rewriteValueARM_OpLsh32x8_0(v *Value) bool { 17102 b := v.Block 17103 _ = b 17104 typ := &b.Func.Config.Types 17105 _ = typ 17106 // match: (Lsh32x8 x y) 17107 // cond: 17108 // result: (SLL x (ZeroExt8to32 y)) 17109 for { 17110 _ = v.Args[1] 17111 x := v.Args[0] 17112 y := v.Args[1] 17113 v.reset(OpARMSLL) 17114 v.AddArg(x) 17115 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17116 v0.AddArg(y) 17117 v.AddArg(v0) 17118 return true 17119 } 17120 } 17121 func rewriteValueARM_OpLsh8x16_0(v *Value) bool { 17122 b := v.Block 17123 _ = b 17124 typ := &b.Func.Config.Types 17125 _ = typ 17126 // match: (Lsh8x16 x y) 17127 // cond: 17128 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 17129 for { 17130 _ = v.Args[1] 17131 x := v.Args[0] 17132 y := v.Args[1] 17133 v.reset(OpARMCMOVWHSconst) 17134 v.AuxInt = 0 17135 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 17136 v0.AddArg(x) 17137 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17138 v1.AddArg(y) 17139 v0.AddArg(v1) 17140 v.AddArg(v0) 17141 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17142 v2.AuxInt = 256 17143 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17144 v3.AddArg(y) 17145 v2.AddArg(v3) 17146 v.AddArg(v2) 17147 return true 17148 } 17149 } 17150 func rewriteValueARM_OpLsh8x32_0(v *Value) bool { 17151 b := v.Block 17152 _ = b 17153 // match: (Lsh8x32 x y) 17154 // cond: 17155 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 17156 for { 17157 _ = v.Args[1] 17158 x := v.Args[0] 17159 y := v.Args[1] 17160 v.reset(OpARMCMOVWHSconst) 17161 v.AuxInt = 0 17162 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 17163 v0.AddArg(x) 17164 v0.AddArg(y) 17165 v.AddArg(v0) 17166 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17167 v1.AuxInt = 256 17168 v1.AddArg(y) 17169 v.AddArg(v1) 17170 return true 17171 } 17172 } 17173 func rewriteValueARM_OpLsh8x64_0(v *Value) bool { 17174 // match: (Lsh8x64 x (Const64 [c])) 17175 // cond: uint64(c) < 8 17176 // result: (SLLconst x [c]) 17177 for { 17178 _ = v.Args[1] 17179 x := v.Args[0] 17180 v_1 := v.Args[1] 17181 if v_1.Op != OpConst64 { 17182 break 17183 } 17184 c := v_1.AuxInt 17185 if !(uint64(c) < 8) { 17186 break 17187 } 17188 v.reset(OpARMSLLconst) 17189 v.AuxInt = c 17190 v.AddArg(x) 17191 return true 17192 } 17193 // match: (Lsh8x64 _ (Const64 [c])) 17194 // cond: uint64(c) >= 8 17195 // result: (Const8 [0]) 17196 for { 17197 _ = v.Args[1] 17198 v_1 := v.Args[1] 17199 if v_1.Op != OpConst64 { 17200 break 17201 } 17202 c := v_1.AuxInt 17203 if !(uint64(c) >= 8) { 17204 break 17205 } 17206 v.reset(OpConst8) 17207 v.AuxInt = 0 17208 return true 17209 } 17210 return false 17211 } 17212 func rewriteValueARM_OpLsh8x8_0(v *Value) bool { 17213 b := v.Block 17214 _ = b 17215 typ := &b.Func.Config.Types 17216 _ = typ 17217 // match: (Lsh8x8 x y) 17218 // cond: 17219 // result: (SLL x (ZeroExt8to32 y)) 17220 for { 17221 _ = v.Args[1] 17222 x := v.Args[0] 17223 y := v.Args[1] 17224 v.reset(OpARMSLL) 17225 v.AddArg(x) 17226 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17227 v0.AddArg(y) 17228 v.AddArg(v0) 17229 return true 17230 } 17231 } 17232 func rewriteValueARM_OpMod16_0(v *Value) bool { 17233 b := v.Block 17234 _ = b 17235 typ := &b.Func.Config.Types 17236 _ = typ 17237 // match: (Mod16 x y) 17238 // cond: 17239 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 17240 for { 17241 _ = v.Args[1] 17242 x := v.Args[0] 17243 y := v.Args[1] 17244 v.reset(OpMod32) 17245 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 17246 v0.AddArg(x) 17247 v.AddArg(v0) 17248 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 17249 v1.AddArg(y) 17250 v.AddArg(v1) 17251 return true 17252 } 17253 } 17254 func rewriteValueARM_OpMod16u_0(v *Value) bool { 17255 b := v.Block 17256 _ = b 17257 typ := &b.Func.Config.Types 17258 _ = typ 17259 // match: (Mod16u x y) 17260 // cond: 17261 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 17262 for { 17263 _ = v.Args[1] 17264 x := v.Args[0] 17265 y := v.Args[1] 17266 v.reset(OpMod32u) 17267 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17268 v0.AddArg(x) 17269 v.AddArg(v0) 17270 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17271 v1.AddArg(y) 17272 v.AddArg(v1) 17273 return true 17274 } 17275 } 17276 func rewriteValueARM_OpMod32_0(v *Value) bool { 17277 b := v.Block 17278 _ = b 17279 typ := &b.Func.Config.Types 17280 _ = typ 17281 // match: (Mod32 x y) 17282 // cond: 17283 // result: (SUB (XOR <typ.UInt32> (Select1 <typ.UInt32> (CALLudiv (SUB <typ.UInt32> (XOR <typ.UInt32> x (Signmask x)) (Signmask x)) (SUB <typ.UInt32> (XOR <typ.UInt32> y (Signmask y)) (Signmask y)))) (Signmask x)) (Signmask x)) 17284 for { 17285 _ = v.Args[1] 17286 x := v.Args[0] 17287 y := v.Args[1] 17288 v.reset(OpARMSUB) 17289 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 17290 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) 17291 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 17292 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 17293 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 17294 v4.AddArg(x) 17295 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 17296 v5.AddArg(x) 17297 v4.AddArg(v5) 17298 v3.AddArg(v4) 17299 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 17300 v6.AddArg(x) 17301 v3.AddArg(v6) 17302 v2.AddArg(v3) 17303 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 17304 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 17305 v8.AddArg(y) 17306 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 17307 v9.AddArg(y) 17308 v8.AddArg(v9) 17309 v7.AddArg(v8) 17310 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 17311 v10.AddArg(y) 17312 v7.AddArg(v10) 17313 v2.AddArg(v7) 17314 v1.AddArg(v2) 17315 v0.AddArg(v1) 17316 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 17317 v11.AddArg(x) 17318 v0.AddArg(v11) 17319 v.AddArg(v0) 17320 v12 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 17321 v12.AddArg(x) 17322 v.AddArg(v12) 17323 return true 17324 } 17325 } 17326 func rewriteValueARM_OpMod32u_0(v *Value) bool { 17327 b := v.Block 17328 _ = b 17329 typ := &b.Func.Config.Types 17330 _ = typ 17331 // match: (Mod32u x y) 17332 // cond: 17333 // result: (Select1 <typ.UInt32> (CALLudiv x y)) 17334 for { 17335 _ = v.Args[1] 17336 x := v.Args[0] 17337 y := v.Args[1] 17338 v.reset(OpSelect1) 17339 v.Type = typ.UInt32 17340 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 17341 v0.AddArg(x) 17342 v0.AddArg(y) 17343 v.AddArg(v0) 17344 return true 17345 } 17346 } 17347 func rewriteValueARM_OpMod8_0(v *Value) bool { 17348 b := v.Block 17349 _ = b 17350 typ := &b.Func.Config.Types 17351 _ = typ 17352 // match: (Mod8 x y) 17353 // cond: 17354 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 17355 for { 17356 _ = v.Args[1] 17357 x := v.Args[0] 17358 y := v.Args[1] 17359 v.reset(OpMod32) 17360 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 17361 v0.AddArg(x) 17362 v.AddArg(v0) 17363 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 17364 v1.AddArg(y) 17365 v.AddArg(v1) 17366 return true 17367 } 17368 } 17369 func rewriteValueARM_OpMod8u_0(v *Value) bool { 17370 b := v.Block 17371 _ = b 17372 typ := &b.Func.Config.Types 17373 _ = typ 17374 // match: (Mod8u x y) 17375 // cond: 17376 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 17377 for { 17378 _ = v.Args[1] 17379 x := v.Args[0] 17380 y := v.Args[1] 17381 v.reset(OpMod32u) 17382 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17383 v0.AddArg(x) 17384 v.AddArg(v0) 17385 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17386 v1.AddArg(y) 17387 v.AddArg(v1) 17388 return true 17389 } 17390 } 17391 func rewriteValueARM_OpMove_0(v *Value) bool { 17392 b := v.Block 17393 _ = b 17394 config := b.Func.Config 17395 _ = config 17396 typ := &b.Func.Config.Types 17397 _ = typ 17398 // match: (Move [0] _ _ mem) 17399 // cond: 17400 // result: mem 17401 for { 17402 if v.AuxInt != 0 { 17403 break 17404 } 17405 _ = v.Args[2] 17406 mem := v.Args[2] 17407 v.reset(OpCopy) 17408 v.Type = mem.Type 17409 v.AddArg(mem) 17410 return true 17411 } 17412 // match: (Move [1] dst src mem) 17413 // cond: 17414 // result: (MOVBstore dst (MOVBUload src mem) mem) 17415 for { 17416 if v.AuxInt != 1 { 17417 break 17418 } 17419 _ = v.Args[2] 17420 dst := v.Args[0] 17421 src := v.Args[1] 17422 mem := v.Args[2] 17423 v.reset(OpARMMOVBstore) 17424 v.AddArg(dst) 17425 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17426 v0.AddArg(src) 17427 v0.AddArg(mem) 17428 v.AddArg(v0) 17429 v.AddArg(mem) 17430 return true 17431 } 17432 // match: (Move [2] {t} dst src mem) 17433 // cond: t.(*types.Type).Alignment()%2 == 0 17434 // result: (MOVHstore dst (MOVHUload src mem) mem) 17435 for { 17436 if v.AuxInt != 2 { 17437 break 17438 } 17439 t := v.Aux 17440 _ = v.Args[2] 17441 dst := v.Args[0] 17442 src := v.Args[1] 17443 mem := v.Args[2] 17444 if !(t.(*types.Type).Alignment()%2 == 0) { 17445 break 17446 } 17447 v.reset(OpARMMOVHstore) 17448 v.AddArg(dst) 17449 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 17450 v0.AddArg(src) 17451 v0.AddArg(mem) 17452 v.AddArg(v0) 17453 v.AddArg(mem) 17454 return true 17455 } 17456 // match: (Move [2] dst src mem) 17457 // cond: 17458 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 17459 for { 17460 if v.AuxInt != 2 { 17461 break 17462 } 17463 _ = v.Args[2] 17464 dst := v.Args[0] 17465 src := v.Args[1] 17466 mem := v.Args[2] 17467 v.reset(OpARMMOVBstore) 17468 v.AuxInt = 1 17469 v.AddArg(dst) 17470 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17471 v0.AuxInt = 1 17472 v0.AddArg(src) 17473 v0.AddArg(mem) 17474 v.AddArg(v0) 17475 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 17476 v1.AddArg(dst) 17477 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17478 v2.AddArg(src) 17479 v2.AddArg(mem) 17480 v1.AddArg(v2) 17481 v1.AddArg(mem) 17482 v.AddArg(v1) 17483 return true 17484 } 17485 // match: (Move [4] {t} dst src mem) 17486 // cond: t.(*types.Type).Alignment()%4 == 0 17487 // result: (MOVWstore dst (MOVWload src mem) mem) 17488 for { 17489 if v.AuxInt != 4 { 17490 break 17491 } 17492 t := v.Aux 17493 _ = v.Args[2] 17494 dst := v.Args[0] 17495 src := v.Args[1] 17496 mem := v.Args[2] 17497 if !(t.(*types.Type).Alignment()%4 == 0) { 17498 break 17499 } 17500 v.reset(OpARMMOVWstore) 17501 v.AddArg(dst) 17502 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32) 17503 v0.AddArg(src) 17504 v0.AddArg(mem) 17505 v.AddArg(v0) 17506 v.AddArg(mem) 17507 return true 17508 } 17509 // match: (Move [4] {t} dst src mem) 17510 // cond: t.(*types.Type).Alignment()%2 == 0 17511 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 17512 for { 17513 if v.AuxInt != 4 { 17514 break 17515 } 17516 t := v.Aux 17517 _ = v.Args[2] 17518 dst := v.Args[0] 17519 src := v.Args[1] 17520 mem := v.Args[2] 17521 if !(t.(*types.Type).Alignment()%2 == 0) { 17522 break 17523 } 17524 v.reset(OpARMMOVHstore) 17525 v.AuxInt = 2 17526 v.AddArg(dst) 17527 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 17528 v0.AuxInt = 2 17529 v0.AddArg(src) 17530 v0.AddArg(mem) 17531 v.AddArg(v0) 17532 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 17533 v1.AddArg(dst) 17534 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 17535 v2.AddArg(src) 17536 v2.AddArg(mem) 17537 v1.AddArg(v2) 17538 v1.AddArg(mem) 17539 v.AddArg(v1) 17540 return true 17541 } 17542 // match: (Move [4] dst src mem) 17543 // cond: 17544 // 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)))) 17545 for { 17546 if v.AuxInt != 4 { 17547 break 17548 } 17549 _ = v.Args[2] 17550 dst := v.Args[0] 17551 src := v.Args[1] 17552 mem := v.Args[2] 17553 v.reset(OpARMMOVBstore) 17554 v.AuxInt = 3 17555 v.AddArg(dst) 17556 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17557 v0.AuxInt = 3 17558 v0.AddArg(src) 17559 v0.AddArg(mem) 17560 v.AddArg(v0) 17561 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 17562 v1.AuxInt = 2 17563 v1.AddArg(dst) 17564 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17565 v2.AuxInt = 2 17566 v2.AddArg(src) 17567 v2.AddArg(mem) 17568 v1.AddArg(v2) 17569 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 17570 v3.AuxInt = 1 17571 v3.AddArg(dst) 17572 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17573 v4.AuxInt = 1 17574 v4.AddArg(src) 17575 v4.AddArg(mem) 17576 v3.AddArg(v4) 17577 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 17578 v5.AddArg(dst) 17579 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17580 v6.AddArg(src) 17581 v6.AddArg(mem) 17582 v5.AddArg(v6) 17583 v5.AddArg(mem) 17584 v3.AddArg(v5) 17585 v1.AddArg(v3) 17586 v.AddArg(v1) 17587 return true 17588 } 17589 // match: (Move [3] dst src mem) 17590 // cond: 17591 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 17592 for { 17593 if v.AuxInt != 3 { 17594 break 17595 } 17596 _ = v.Args[2] 17597 dst := v.Args[0] 17598 src := v.Args[1] 17599 mem := v.Args[2] 17600 v.reset(OpARMMOVBstore) 17601 v.AuxInt = 2 17602 v.AddArg(dst) 17603 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17604 v0.AuxInt = 2 17605 v0.AddArg(src) 17606 v0.AddArg(mem) 17607 v.AddArg(v0) 17608 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 17609 v1.AuxInt = 1 17610 v1.AddArg(dst) 17611 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17612 v2.AuxInt = 1 17613 v2.AddArg(src) 17614 v2.AddArg(mem) 17615 v1.AddArg(v2) 17616 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 17617 v3.AddArg(dst) 17618 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 17619 v4.AddArg(src) 17620 v4.AddArg(mem) 17621 v3.AddArg(v4) 17622 v3.AddArg(mem) 17623 v1.AddArg(v3) 17624 v.AddArg(v1) 17625 return true 17626 } 17627 // match: (Move [s] {t} dst src mem) 17628 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 17629 // result: (DUFFCOPY [8 * (128 - int64(s/4))] dst src mem) 17630 for { 17631 s := v.AuxInt 17632 t := v.Aux 17633 _ = v.Args[2] 17634 dst := v.Args[0] 17635 src := v.Args[1] 17636 mem := v.Args[2] 17637 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 17638 break 17639 } 17640 v.reset(OpARMDUFFCOPY) 17641 v.AuxInt = 8 * (128 - int64(s/4)) 17642 v.AddArg(dst) 17643 v.AddArg(src) 17644 v.AddArg(mem) 17645 return true 17646 } 17647 // match: (Move [s] {t} dst src mem) 17648 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 17649 // result: (LoweredMove [t.(*types.Type).Alignment()] dst src (ADDconst <src.Type> src [s-moveSize(t.(*types.Type).Alignment(), config)]) mem) 17650 for { 17651 s := v.AuxInt 17652 t := v.Aux 17653 _ = v.Args[2] 17654 dst := v.Args[0] 17655 src := v.Args[1] 17656 mem := v.Args[2] 17657 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 17658 break 17659 } 17660 v.reset(OpARMLoweredMove) 17661 v.AuxInt = t.(*types.Type).Alignment() 17662 v.AddArg(dst) 17663 v.AddArg(src) 17664 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 17665 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 17666 v0.AddArg(src) 17667 v.AddArg(v0) 17668 v.AddArg(mem) 17669 return true 17670 } 17671 return false 17672 } 17673 func rewriteValueARM_OpMul16_0(v *Value) bool { 17674 // match: (Mul16 x y) 17675 // cond: 17676 // result: (MUL x y) 17677 for { 17678 _ = v.Args[1] 17679 x := v.Args[0] 17680 y := v.Args[1] 17681 v.reset(OpARMMUL) 17682 v.AddArg(x) 17683 v.AddArg(y) 17684 return true 17685 } 17686 } 17687 func rewriteValueARM_OpMul32_0(v *Value) bool { 17688 // match: (Mul32 x y) 17689 // cond: 17690 // result: (MUL x y) 17691 for { 17692 _ = v.Args[1] 17693 x := v.Args[0] 17694 y := v.Args[1] 17695 v.reset(OpARMMUL) 17696 v.AddArg(x) 17697 v.AddArg(y) 17698 return true 17699 } 17700 } 17701 func rewriteValueARM_OpMul32F_0(v *Value) bool { 17702 // match: (Mul32F x y) 17703 // cond: 17704 // result: (MULF x y) 17705 for { 17706 _ = v.Args[1] 17707 x := v.Args[0] 17708 y := v.Args[1] 17709 v.reset(OpARMMULF) 17710 v.AddArg(x) 17711 v.AddArg(y) 17712 return true 17713 } 17714 } 17715 func rewriteValueARM_OpMul32uhilo_0(v *Value) bool { 17716 // match: (Mul32uhilo x y) 17717 // cond: 17718 // result: (MULLU x y) 17719 for { 17720 _ = v.Args[1] 17721 x := v.Args[0] 17722 y := v.Args[1] 17723 v.reset(OpARMMULLU) 17724 v.AddArg(x) 17725 v.AddArg(y) 17726 return true 17727 } 17728 } 17729 func rewriteValueARM_OpMul64F_0(v *Value) bool { 17730 // match: (Mul64F x y) 17731 // cond: 17732 // result: (MULD x y) 17733 for { 17734 _ = v.Args[1] 17735 x := v.Args[0] 17736 y := v.Args[1] 17737 v.reset(OpARMMULD) 17738 v.AddArg(x) 17739 v.AddArg(y) 17740 return true 17741 } 17742 } 17743 func rewriteValueARM_OpMul8_0(v *Value) bool { 17744 // match: (Mul8 x y) 17745 // cond: 17746 // result: (MUL x y) 17747 for { 17748 _ = v.Args[1] 17749 x := v.Args[0] 17750 y := v.Args[1] 17751 v.reset(OpARMMUL) 17752 v.AddArg(x) 17753 v.AddArg(y) 17754 return true 17755 } 17756 } 17757 func rewriteValueARM_OpNeg16_0(v *Value) bool { 17758 // match: (Neg16 x) 17759 // cond: 17760 // result: (RSBconst [0] x) 17761 for { 17762 x := v.Args[0] 17763 v.reset(OpARMRSBconst) 17764 v.AuxInt = 0 17765 v.AddArg(x) 17766 return true 17767 } 17768 } 17769 func rewriteValueARM_OpNeg32_0(v *Value) bool { 17770 // match: (Neg32 x) 17771 // cond: 17772 // result: (RSBconst [0] x) 17773 for { 17774 x := v.Args[0] 17775 v.reset(OpARMRSBconst) 17776 v.AuxInt = 0 17777 v.AddArg(x) 17778 return true 17779 } 17780 } 17781 func rewriteValueARM_OpNeg32F_0(v *Value) bool { 17782 // match: (Neg32F x) 17783 // cond: 17784 // result: (NEGF x) 17785 for { 17786 x := v.Args[0] 17787 v.reset(OpARMNEGF) 17788 v.AddArg(x) 17789 return true 17790 } 17791 } 17792 func rewriteValueARM_OpNeg64F_0(v *Value) bool { 17793 // match: (Neg64F x) 17794 // cond: 17795 // result: (NEGD x) 17796 for { 17797 x := v.Args[0] 17798 v.reset(OpARMNEGD) 17799 v.AddArg(x) 17800 return true 17801 } 17802 } 17803 func rewriteValueARM_OpNeg8_0(v *Value) bool { 17804 // match: (Neg8 x) 17805 // cond: 17806 // result: (RSBconst [0] x) 17807 for { 17808 x := v.Args[0] 17809 v.reset(OpARMRSBconst) 17810 v.AuxInt = 0 17811 v.AddArg(x) 17812 return true 17813 } 17814 } 17815 func rewriteValueARM_OpNeq16_0(v *Value) bool { 17816 b := v.Block 17817 _ = b 17818 typ := &b.Func.Config.Types 17819 _ = typ 17820 // match: (Neq16 x y) 17821 // cond: 17822 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 17823 for { 17824 _ = v.Args[1] 17825 x := v.Args[0] 17826 y := v.Args[1] 17827 v.reset(OpARMNotEqual) 17828 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 17829 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17830 v1.AddArg(x) 17831 v0.AddArg(v1) 17832 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17833 v2.AddArg(y) 17834 v0.AddArg(v2) 17835 v.AddArg(v0) 17836 return true 17837 } 17838 } 17839 func rewriteValueARM_OpNeq32_0(v *Value) bool { 17840 b := v.Block 17841 _ = b 17842 // match: (Neq32 x y) 17843 // cond: 17844 // result: (NotEqual (CMP x y)) 17845 for { 17846 _ = v.Args[1] 17847 x := v.Args[0] 17848 y := v.Args[1] 17849 v.reset(OpARMNotEqual) 17850 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 17851 v0.AddArg(x) 17852 v0.AddArg(y) 17853 v.AddArg(v0) 17854 return true 17855 } 17856 } 17857 func rewriteValueARM_OpNeq32F_0(v *Value) bool { 17858 b := v.Block 17859 _ = b 17860 // match: (Neq32F x y) 17861 // cond: 17862 // result: (NotEqual (CMPF x y)) 17863 for { 17864 _ = v.Args[1] 17865 x := v.Args[0] 17866 y := v.Args[1] 17867 v.reset(OpARMNotEqual) 17868 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 17869 v0.AddArg(x) 17870 v0.AddArg(y) 17871 v.AddArg(v0) 17872 return true 17873 } 17874 } 17875 func rewriteValueARM_OpNeq64F_0(v *Value) bool { 17876 b := v.Block 17877 _ = b 17878 // match: (Neq64F x y) 17879 // cond: 17880 // result: (NotEqual (CMPD x y)) 17881 for { 17882 _ = v.Args[1] 17883 x := v.Args[0] 17884 y := v.Args[1] 17885 v.reset(OpARMNotEqual) 17886 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 17887 v0.AddArg(x) 17888 v0.AddArg(y) 17889 v.AddArg(v0) 17890 return true 17891 } 17892 } 17893 func rewriteValueARM_OpNeq8_0(v *Value) bool { 17894 b := v.Block 17895 _ = b 17896 typ := &b.Func.Config.Types 17897 _ = typ 17898 // match: (Neq8 x y) 17899 // cond: 17900 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 17901 for { 17902 _ = v.Args[1] 17903 x := v.Args[0] 17904 y := v.Args[1] 17905 v.reset(OpARMNotEqual) 17906 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 17907 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17908 v1.AddArg(x) 17909 v0.AddArg(v1) 17910 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17911 v2.AddArg(y) 17912 v0.AddArg(v2) 17913 v.AddArg(v0) 17914 return true 17915 } 17916 } 17917 func rewriteValueARM_OpNeqB_0(v *Value) bool { 17918 // match: (NeqB x y) 17919 // cond: 17920 // result: (XOR x y) 17921 for { 17922 _ = v.Args[1] 17923 x := v.Args[0] 17924 y := v.Args[1] 17925 v.reset(OpARMXOR) 17926 v.AddArg(x) 17927 v.AddArg(y) 17928 return true 17929 } 17930 } 17931 func rewriteValueARM_OpNeqPtr_0(v *Value) bool { 17932 b := v.Block 17933 _ = b 17934 // match: (NeqPtr x y) 17935 // cond: 17936 // result: (NotEqual (CMP x y)) 17937 for { 17938 _ = v.Args[1] 17939 x := v.Args[0] 17940 y := v.Args[1] 17941 v.reset(OpARMNotEqual) 17942 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 17943 v0.AddArg(x) 17944 v0.AddArg(y) 17945 v.AddArg(v0) 17946 return true 17947 } 17948 } 17949 func rewriteValueARM_OpNilCheck_0(v *Value) bool { 17950 // match: (NilCheck ptr mem) 17951 // cond: 17952 // result: (LoweredNilCheck ptr mem) 17953 for { 17954 _ = v.Args[1] 17955 ptr := v.Args[0] 17956 mem := v.Args[1] 17957 v.reset(OpARMLoweredNilCheck) 17958 v.AddArg(ptr) 17959 v.AddArg(mem) 17960 return true 17961 } 17962 } 17963 func rewriteValueARM_OpNot_0(v *Value) bool { 17964 // match: (Not x) 17965 // cond: 17966 // result: (XORconst [1] x) 17967 for { 17968 x := v.Args[0] 17969 v.reset(OpARMXORconst) 17970 v.AuxInt = 1 17971 v.AddArg(x) 17972 return true 17973 } 17974 } 17975 func rewriteValueARM_OpOffPtr_0(v *Value) bool { 17976 // match: (OffPtr [off] ptr:(SP)) 17977 // cond: 17978 // result: (MOVWaddr [off] ptr) 17979 for { 17980 off := v.AuxInt 17981 ptr := v.Args[0] 17982 if ptr.Op != OpSP { 17983 break 17984 } 17985 v.reset(OpARMMOVWaddr) 17986 v.AuxInt = off 17987 v.AddArg(ptr) 17988 return true 17989 } 17990 // match: (OffPtr [off] ptr) 17991 // cond: 17992 // result: (ADDconst [off] ptr) 17993 for { 17994 off := v.AuxInt 17995 ptr := v.Args[0] 17996 v.reset(OpARMADDconst) 17997 v.AuxInt = off 17998 v.AddArg(ptr) 17999 return true 18000 } 18001 } 18002 func rewriteValueARM_OpOr16_0(v *Value) bool { 18003 // match: (Or16 x y) 18004 // cond: 18005 // result: (OR x y) 18006 for { 18007 _ = v.Args[1] 18008 x := v.Args[0] 18009 y := v.Args[1] 18010 v.reset(OpARMOR) 18011 v.AddArg(x) 18012 v.AddArg(y) 18013 return true 18014 } 18015 } 18016 func rewriteValueARM_OpOr32_0(v *Value) bool { 18017 // match: (Or32 x y) 18018 // cond: 18019 // result: (OR x y) 18020 for { 18021 _ = v.Args[1] 18022 x := v.Args[0] 18023 y := v.Args[1] 18024 v.reset(OpARMOR) 18025 v.AddArg(x) 18026 v.AddArg(y) 18027 return true 18028 } 18029 } 18030 func rewriteValueARM_OpOr8_0(v *Value) bool { 18031 // match: (Or8 x y) 18032 // cond: 18033 // result: (OR x y) 18034 for { 18035 _ = v.Args[1] 18036 x := v.Args[0] 18037 y := v.Args[1] 18038 v.reset(OpARMOR) 18039 v.AddArg(x) 18040 v.AddArg(y) 18041 return true 18042 } 18043 } 18044 func rewriteValueARM_OpOrB_0(v *Value) bool { 18045 // match: (OrB x y) 18046 // cond: 18047 // result: (OR x y) 18048 for { 18049 _ = v.Args[1] 18050 x := v.Args[0] 18051 y := v.Args[1] 18052 v.reset(OpARMOR) 18053 v.AddArg(x) 18054 v.AddArg(y) 18055 return true 18056 } 18057 } 18058 func rewriteValueARM_OpRound32F_0(v *Value) bool { 18059 // match: (Round32F x) 18060 // cond: 18061 // result: x 18062 for { 18063 x := v.Args[0] 18064 v.reset(OpCopy) 18065 v.Type = x.Type 18066 v.AddArg(x) 18067 return true 18068 } 18069 } 18070 func rewriteValueARM_OpRound64F_0(v *Value) bool { 18071 // match: (Round64F x) 18072 // cond: 18073 // result: x 18074 for { 18075 x := v.Args[0] 18076 v.reset(OpCopy) 18077 v.Type = x.Type 18078 v.AddArg(x) 18079 return true 18080 } 18081 } 18082 func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { 18083 b := v.Block 18084 _ = b 18085 typ := &b.Func.Config.Types 18086 _ = typ 18087 // match: (Rsh16Ux16 x y) 18088 // cond: 18089 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 18090 for { 18091 _ = v.Args[1] 18092 x := v.Args[0] 18093 y := v.Args[1] 18094 v.reset(OpARMCMOVWHSconst) 18095 v.AuxInt = 0 18096 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 18097 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18098 v1.AddArg(x) 18099 v0.AddArg(v1) 18100 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18101 v2.AddArg(y) 18102 v0.AddArg(v2) 18103 v.AddArg(v0) 18104 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18105 v3.AuxInt = 256 18106 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18107 v4.AddArg(y) 18108 v3.AddArg(v4) 18109 v.AddArg(v3) 18110 return true 18111 } 18112 } 18113 func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { 18114 b := v.Block 18115 _ = b 18116 typ := &b.Func.Config.Types 18117 _ = typ 18118 // match: (Rsh16Ux32 x y) 18119 // cond: 18120 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 18121 for { 18122 _ = v.Args[1] 18123 x := v.Args[0] 18124 y := v.Args[1] 18125 v.reset(OpARMCMOVWHSconst) 18126 v.AuxInt = 0 18127 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 18128 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18129 v1.AddArg(x) 18130 v0.AddArg(v1) 18131 v0.AddArg(y) 18132 v.AddArg(v0) 18133 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18134 v2.AuxInt = 256 18135 v2.AddArg(y) 18136 v.AddArg(v2) 18137 return true 18138 } 18139 } 18140 func rewriteValueARM_OpRsh16Ux64_0(v *Value) bool { 18141 b := v.Block 18142 _ = b 18143 typ := &b.Func.Config.Types 18144 _ = typ 18145 // match: (Rsh16Ux64 x (Const64 [c])) 18146 // cond: uint64(c) < 16 18147 // result: (SRLconst (SLLconst <typ.UInt32> x [16]) [c+16]) 18148 for { 18149 _ = v.Args[1] 18150 x := v.Args[0] 18151 v_1 := v.Args[1] 18152 if v_1.Op != OpConst64 { 18153 break 18154 } 18155 c := v_1.AuxInt 18156 if !(uint64(c) < 16) { 18157 break 18158 } 18159 v.reset(OpARMSRLconst) 18160 v.AuxInt = c + 16 18161 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 18162 v0.AuxInt = 16 18163 v0.AddArg(x) 18164 v.AddArg(v0) 18165 return true 18166 } 18167 // match: (Rsh16Ux64 _ (Const64 [c])) 18168 // cond: uint64(c) >= 16 18169 // result: (Const16 [0]) 18170 for { 18171 _ = v.Args[1] 18172 v_1 := v.Args[1] 18173 if v_1.Op != OpConst64 { 18174 break 18175 } 18176 c := v_1.AuxInt 18177 if !(uint64(c) >= 16) { 18178 break 18179 } 18180 v.reset(OpConst16) 18181 v.AuxInt = 0 18182 return true 18183 } 18184 return false 18185 } 18186 func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { 18187 b := v.Block 18188 _ = b 18189 typ := &b.Func.Config.Types 18190 _ = typ 18191 // match: (Rsh16Ux8 x y) 18192 // cond: 18193 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 18194 for { 18195 _ = v.Args[1] 18196 x := v.Args[0] 18197 y := v.Args[1] 18198 v.reset(OpARMSRL) 18199 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18200 v0.AddArg(x) 18201 v.AddArg(v0) 18202 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18203 v1.AddArg(y) 18204 v.AddArg(v1) 18205 return true 18206 } 18207 } 18208 func rewriteValueARM_OpRsh16x16_0(v *Value) bool { 18209 b := v.Block 18210 _ = b 18211 typ := &b.Func.Config.Types 18212 _ = typ 18213 // match: (Rsh16x16 x y) 18214 // cond: 18215 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 18216 for { 18217 _ = v.Args[1] 18218 x := v.Args[0] 18219 y := v.Args[1] 18220 v.reset(OpARMSRAcond) 18221 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18222 v0.AddArg(x) 18223 v.AddArg(v0) 18224 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18225 v1.AddArg(y) 18226 v.AddArg(v1) 18227 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18228 v2.AuxInt = 256 18229 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18230 v3.AddArg(y) 18231 v2.AddArg(v3) 18232 v.AddArg(v2) 18233 return true 18234 } 18235 } 18236 func rewriteValueARM_OpRsh16x32_0(v *Value) bool { 18237 b := v.Block 18238 _ = b 18239 typ := &b.Func.Config.Types 18240 _ = typ 18241 // match: (Rsh16x32 x y) 18242 // cond: 18243 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 18244 for { 18245 _ = v.Args[1] 18246 x := v.Args[0] 18247 y := v.Args[1] 18248 v.reset(OpARMSRAcond) 18249 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18250 v0.AddArg(x) 18251 v.AddArg(v0) 18252 v.AddArg(y) 18253 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18254 v1.AuxInt = 256 18255 v1.AddArg(y) 18256 v.AddArg(v1) 18257 return true 18258 } 18259 } 18260 func rewriteValueARM_OpRsh16x64_0(v *Value) bool { 18261 b := v.Block 18262 _ = b 18263 typ := &b.Func.Config.Types 18264 _ = typ 18265 // match: (Rsh16x64 x (Const64 [c])) 18266 // cond: uint64(c) < 16 18267 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [c+16]) 18268 for { 18269 _ = v.Args[1] 18270 x := v.Args[0] 18271 v_1 := v.Args[1] 18272 if v_1.Op != OpConst64 { 18273 break 18274 } 18275 c := v_1.AuxInt 18276 if !(uint64(c) < 16) { 18277 break 18278 } 18279 v.reset(OpARMSRAconst) 18280 v.AuxInt = c + 16 18281 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 18282 v0.AuxInt = 16 18283 v0.AddArg(x) 18284 v.AddArg(v0) 18285 return true 18286 } 18287 // match: (Rsh16x64 x (Const64 [c])) 18288 // cond: uint64(c) >= 16 18289 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [31]) 18290 for { 18291 _ = v.Args[1] 18292 x := v.Args[0] 18293 v_1 := v.Args[1] 18294 if v_1.Op != OpConst64 { 18295 break 18296 } 18297 c := v_1.AuxInt 18298 if !(uint64(c) >= 16) { 18299 break 18300 } 18301 v.reset(OpARMSRAconst) 18302 v.AuxInt = 31 18303 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 18304 v0.AuxInt = 16 18305 v0.AddArg(x) 18306 v.AddArg(v0) 18307 return true 18308 } 18309 return false 18310 } 18311 func rewriteValueARM_OpRsh16x8_0(v *Value) bool { 18312 b := v.Block 18313 _ = b 18314 typ := &b.Func.Config.Types 18315 _ = typ 18316 // match: (Rsh16x8 x y) 18317 // cond: 18318 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 18319 for { 18320 _ = v.Args[1] 18321 x := v.Args[0] 18322 y := v.Args[1] 18323 v.reset(OpARMSRA) 18324 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18325 v0.AddArg(x) 18326 v.AddArg(v0) 18327 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18328 v1.AddArg(y) 18329 v.AddArg(v1) 18330 return true 18331 } 18332 } 18333 func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { 18334 b := v.Block 18335 _ = b 18336 typ := &b.Func.Config.Types 18337 _ = typ 18338 // match: (Rsh32Ux16 x y) 18339 // cond: 18340 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 18341 for { 18342 _ = v.Args[1] 18343 x := v.Args[0] 18344 y := v.Args[1] 18345 v.reset(OpARMCMOVWHSconst) 18346 v.AuxInt = 0 18347 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 18348 v0.AddArg(x) 18349 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18350 v1.AddArg(y) 18351 v0.AddArg(v1) 18352 v.AddArg(v0) 18353 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18354 v2.AuxInt = 256 18355 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18356 v3.AddArg(y) 18357 v2.AddArg(v3) 18358 v.AddArg(v2) 18359 return true 18360 } 18361 } 18362 func rewriteValueARM_OpRsh32Ux32_0(v *Value) bool { 18363 b := v.Block 18364 _ = b 18365 // match: (Rsh32Ux32 x y) 18366 // cond: 18367 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 18368 for { 18369 _ = v.Args[1] 18370 x := v.Args[0] 18371 y := v.Args[1] 18372 v.reset(OpARMCMOVWHSconst) 18373 v.AuxInt = 0 18374 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 18375 v0.AddArg(x) 18376 v0.AddArg(y) 18377 v.AddArg(v0) 18378 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18379 v1.AuxInt = 256 18380 v1.AddArg(y) 18381 v.AddArg(v1) 18382 return true 18383 } 18384 } 18385 func rewriteValueARM_OpRsh32Ux64_0(v *Value) bool { 18386 // match: (Rsh32Ux64 x (Const64 [c])) 18387 // cond: uint64(c) < 32 18388 // result: (SRLconst x [c]) 18389 for { 18390 _ = v.Args[1] 18391 x := v.Args[0] 18392 v_1 := v.Args[1] 18393 if v_1.Op != OpConst64 { 18394 break 18395 } 18396 c := v_1.AuxInt 18397 if !(uint64(c) < 32) { 18398 break 18399 } 18400 v.reset(OpARMSRLconst) 18401 v.AuxInt = c 18402 v.AddArg(x) 18403 return true 18404 } 18405 // match: (Rsh32Ux64 _ (Const64 [c])) 18406 // cond: uint64(c) >= 32 18407 // result: (Const32 [0]) 18408 for { 18409 _ = v.Args[1] 18410 v_1 := v.Args[1] 18411 if v_1.Op != OpConst64 { 18412 break 18413 } 18414 c := v_1.AuxInt 18415 if !(uint64(c) >= 32) { 18416 break 18417 } 18418 v.reset(OpConst32) 18419 v.AuxInt = 0 18420 return true 18421 } 18422 return false 18423 } 18424 func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { 18425 b := v.Block 18426 _ = b 18427 typ := &b.Func.Config.Types 18428 _ = typ 18429 // match: (Rsh32Ux8 x y) 18430 // cond: 18431 // result: (SRL x (ZeroExt8to32 y)) 18432 for { 18433 _ = v.Args[1] 18434 x := v.Args[0] 18435 y := v.Args[1] 18436 v.reset(OpARMSRL) 18437 v.AddArg(x) 18438 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18439 v0.AddArg(y) 18440 v.AddArg(v0) 18441 return true 18442 } 18443 } 18444 func rewriteValueARM_OpRsh32x16_0(v *Value) bool { 18445 b := v.Block 18446 _ = b 18447 typ := &b.Func.Config.Types 18448 _ = typ 18449 // match: (Rsh32x16 x y) 18450 // cond: 18451 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 18452 for { 18453 _ = v.Args[1] 18454 x := v.Args[0] 18455 y := v.Args[1] 18456 v.reset(OpARMSRAcond) 18457 v.AddArg(x) 18458 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18459 v0.AddArg(y) 18460 v.AddArg(v0) 18461 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18462 v1.AuxInt = 256 18463 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18464 v2.AddArg(y) 18465 v1.AddArg(v2) 18466 v.AddArg(v1) 18467 return true 18468 } 18469 } 18470 func rewriteValueARM_OpRsh32x32_0(v *Value) bool { 18471 b := v.Block 18472 _ = b 18473 // match: (Rsh32x32 x y) 18474 // cond: 18475 // result: (SRAcond x y (CMPconst [256] y)) 18476 for { 18477 _ = v.Args[1] 18478 x := v.Args[0] 18479 y := v.Args[1] 18480 v.reset(OpARMSRAcond) 18481 v.AddArg(x) 18482 v.AddArg(y) 18483 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18484 v0.AuxInt = 256 18485 v0.AddArg(y) 18486 v.AddArg(v0) 18487 return true 18488 } 18489 } 18490 func rewriteValueARM_OpRsh32x64_0(v *Value) bool { 18491 // match: (Rsh32x64 x (Const64 [c])) 18492 // cond: uint64(c) < 32 18493 // result: (SRAconst x [c]) 18494 for { 18495 _ = v.Args[1] 18496 x := v.Args[0] 18497 v_1 := v.Args[1] 18498 if v_1.Op != OpConst64 { 18499 break 18500 } 18501 c := v_1.AuxInt 18502 if !(uint64(c) < 32) { 18503 break 18504 } 18505 v.reset(OpARMSRAconst) 18506 v.AuxInt = c 18507 v.AddArg(x) 18508 return true 18509 } 18510 // match: (Rsh32x64 x (Const64 [c])) 18511 // cond: uint64(c) >= 32 18512 // result: (SRAconst x [31]) 18513 for { 18514 _ = v.Args[1] 18515 x := v.Args[0] 18516 v_1 := v.Args[1] 18517 if v_1.Op != OpConst64 { 18518 break 18519 } 18520 c := v_1.AuxInt 18521 if !(uint64(c) >= 32) { 18522 break 18523 } 18524 v.reset(OpARMSRAconst) 18525 v.AuxInt = 31 18526 v.AddArg(x) 18527 return true 18528 } 18529 return false 18530 } 18531 func rewriteValueARM_OpRsh32x8_0(v *Value) bool { 18532 b := v.Block 18533 _ = b 18534 typ := &b.Func.Config.Types 18535 _ = typ 18536 // match: (Rsh32x8 x y) 18537 // cond: 18538 // result: (SRA x (ZeroExt8to32 y)) 18539 for { 18540 _ = v.Args[1] 18541 x := v.Args[0] 18542 y := v.Args[1] 18543 v.reset(OpARMSRA) 18544 v.AddArg(x) 18545 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18546 v0.AddArg(y) 18547 v.AddArg(v0) 18548 return true 18549 } 18550 } 18551 func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { 18552 b := v.Block 18553 _ = b 18554 typ := &b.Func.Config.Types 18555 _ = typ 18556 // match: (Rsh8Ux16 x y) 18557 // cond: 18558 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 18559 for { 18560 _ = v.Args[1] 18561 x := v.Args[0] 18562 y := v.Args[1] 18563 v.reset(OpARMCMOVWHSconst) 18564 v.AuxInt = 0 18565 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 18566 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18567 v1.AddArg(x) 18568 v0.AddArg(v1) 18569 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18570 v2.AddArg(y) 18571 v0.AddArg(v2) 18572 v.AddArg(v0) 18573 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18574 v3.AuxInt = 256 18575 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18576 v4.AddArg(y) 18577 v3.AddArg(v4) 18578 v.AddArg(v3) 18579 return true 18580 } 18581 } 18582 func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { 18583 b := v.Block 18584 _ = b 18585 typ := &b.Func.Config.Types 18586 _ = typ 18587 // match: (Rsh8Ux32 x y) 18588 // cond: 18589 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 18590 for { 18591 _ = v.Args[1] 18592 x := v.Args[0] 18593 y := v.Args[1] 18594 v.reset(OpARMCMOVWHSconst) 18595 v.AuxInt = 0 18596 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 18597 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18598 v1.AddArg(x) 18599 v0.AddArg(v1) 18600 v0.AddArg(y) 18601 v.AddArg(v0) 18602 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18603 v2.AuxInt = 256 18604 v2.AddArg(y) 18605 v.AddArg(v2) 18606 return true 18607 } 18608 } 18609 func rewriteValueARM_OpRsh8Ux64_0(v *Value) bool { 18610 b := v.Block 18611 _ = b 18612 typ := &b.Func.Config.Types 18613 _ = typ 18614 // match: (Rsh8Ux64 x (Const64 [c])) 18615 // cond: uint64(c) < 8 18616 // result: (SRLconst (SLLconst <typ.UInt32> x [24]) [c+24]) 18617 for { 18618 _ = v.Args[1] 18619 x := v.Args[0] 18620 v_1 := v.Args[1] 18621 if v_1.Op != OpConst64 { 18622 break 18623 } 18624 c := v_1.AuxInt 18625 if !(uint64(c) < 8) { 18626 break 18627 } 18628 v.reset(OpARMSRLconst) 18629 v.AuxInt = c + 24 18630 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 18631 v0.AuxInt = 24 18632 v0.AddArg(x) 18633 v.AddArg(v0) 18634 return true 18635 } 18636 // match: (Rsh8Ux64 _ (Const64 [c])) 18637 // cond: uint64(c) >= 8 18638 // result: (Const8 [0]) 18639 for { 18640 _ = v.Args[1] 18641 v_1 := v.Args[1] 18642 if v_1.Op != OpConst64 { 18643 break 18644 } 18645 c := v_1.AuxInt 18646 if !(uint64(c) >= 8) { 18647 break 18648 } 18649 v.reset(OpConst8) 18650 v.AuxInt = 0 18651 return true 18652 } 18653 return false 18654 } 18655 func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { 18656 b := v.Block 18657 _ = b 18658 typ := &b.Func.Config.Types 18659 _ = typ 18660 // match: (Rsh8Ux8 x y) 18661 // cond: 18662 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 18663 for { 18664 _ = v.Args[1] 18665 x := v.Args[0] 18666 y := v.Args[1] 18667 v.reset(OpARMSRL) 18668 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18669 v0.AddArg(x) 18670 v.AddArg(v0) 18671 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18672 v1.AddArg(y) 18673 v.AddArg(v1) 18674 return true 18675 } 18676 } 18677 func rewriteValueARM_OpRsh8x16_0(v *Value) bool { 18678 b := v.Block 18679 _ = b 18680 typ := &b.Func.Config.Types 18681 _ = typ 18682 // match: (Rsh8x16 x y) 18683 // cond: 18684 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 18685 for { 18686 _ = v.Args[1] 18687 x := v.Args[0] 18688 y := v.Args[1] 18689 v.reset(OpARMSRAcond) 18690 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18691 v0.AddArg(x) 18692 v.AddArg(v0) 18693 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18694 v1.AddArg(y) 18695 v.AddArg(v1) 18696 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18697 v2.AuxInt = 256 18698 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18699 v3.AddArg(y) 18700 v2.AddArg(v3) 18701 v.AddArg(v2) 18702 return true 18703 } 18704 } 18705 func rewriteValueARM_OpRsh8x32_0(v *Value) bool { 18706 b := v.Block 18707 _ = b 18708 typ := &b.Func.Config.Types 18709 _ = typ 18710 // match: (Rsh8x32 x y) 18711 // cond: 18712 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 18713 for { 18714 _ = v.Args[1] 18715 x := v.Args[0] 18716 y := v.Args[1] 18717 v.reset(OpARMSRAcond) 18718 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18719 v0.AddArg(x) 18720 v.AddArg(v0) 18721 v.AddArg(y) 18722 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18723 v1.AuxInt = 256 18724 v1.AddArg(y) 18725 v.AddArg(v1) 18726 return true 18727 } 18728 } 18729 func rewriteValueARM_OpRsh8x64_0(v *Value) bool { 18730 b := v.Block 18731 _ = b 18732 typ := &b.Func.Config.Types 18733 _ = typ 18734 // match: (Rsh8x64 x (Const64 [c])) 18735 // cond: uint64(c) < 8 18736 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [c+24]) 18737 for { 18738 _ = v.Args[1] 18739 x := v.Args[0] 18740 v_1 := v.Args[1] 18741 if v_1.Op != OpConst64 { 18742 break 18743 } 18744 c := v_1.AuxInt 18745 if !(uint64(c) < 8) { 18746 break 18747 } 18748 v.reset(OpARMSRAconst) 18749 v.AuxInt = c + 24 18750 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 18751 v0.AuxInt = 24 18752 v0.AddArg(x) 18753 v.AddArg(v0) 18754 return true 18755 } 18756 // match: (Rsh8x64 x (Const64 [c])) 18757 // cond: uint64(c) >= 8 18758 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [31]) 18759 for { 18760 _ = v.Args[1] 18761 x := v.Args[0] 18762 v_1 := v.Args[1] 18763 if v_1.Op != OpConst64 { 18764 break 18765 } 18766 c := v_1.AuxInt 18767 if !(uint64(c) >= 8) { 18768 break 18769 } 18770 v.reset(OpARMSRAconst) 18771 v.AuxInt = 31 18772 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 18773 v0.AuxInt = 24 18774 v0.AddArg(x) 18775 v.AddArg(v0) 18776 return true 18777 } 18778 return false 18779 } 18780 func rewriteValueARM_OpRsh8x8_0(v *Value) bool { 18781 b := v.Block 18782 _ = b 18783 typ := &b.Func.Config.Types 18784 _ = typ 18785 // match: (Rsh8x8 x y) 18786 // cond: 18787 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 18788 for { 18789 _ = v.Args[1] 18790 x := v.Args[0] 18791 y := v.Args[1] 18792 v.reset(OpARMSRA) 18793 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18794 v0.AddArg(x) 18795 v.AddArg(v0) 18796 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18797 v1.AddArg(y) 18798 v.AddArg(v1) 18799 return true 18800 } 18801 } 18802 func rewriteValueARM_OpSelect0_0(v *Value) bool { 18803 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 18804 // cond: 18805 // result: x 18806 for { 18807 v_0 := v.Args[0] 18808 if v_0.Op != OpARMCALLudiv { 18809 break 18810 } 18811 _ = v_0.Args[1] 18812 x := v_0.Args[0] 18813 v_0_1 := v_0.Args[1] 18814 if v_0_1.Op != OpARMMOVWconst { 18815 break 18816 } 18817 if v_0_1.AuxInt != 1 { 18818 break 18819 } 18820 v.reset(OpCopy) 18821 v.Type = x.Type 18822 v.AddArg(x) 18823 return true 18824 } 18825 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 18826 // cond: isPowerOfTwo(c) 18827 // result: (SRLconst [log2(c)] x) 18828 for { 18829 v_0 := v.Args[0] 18830 if v_0.Op != OpARMCALLudiv { 18831 break 18832 } 18833 _ = v_0.Args[1] 18834 x := v_0.Args[0] 18835 v_0_1 := v_0.Args[1] 18836 if v_0_1.Op != OpARMMOVWconst { 18837 break 18838 } 18839 c := v_0_1.AuxInt 18840 if !(isPowerOfTwo(c)) { 18841 break 18842 } 18843 v.reset(OpARMSRLconst) 18844 v.AuxInt = log2(c) 18845 v.AddArg(x) 18846 return true 18847 } 18848 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 18849 // cond: 18850 // result: (MOVWconst [int64(uint32(c)/uint32(d))]) 18851 for { 18852 v_0 := v.Args[0] 18853 if v_0.Op != OpARMCALLudiv { 18854 break 18855 } 18856 _ = v_0.Args[1] 18857 v_0_0 := v_0.Args[0] 18858 if v_0_0.Op != OpARMMOVWconst { 18859 break 18860 } 18861 c := v_0_0.AuxInt 18862 v_0_1 := v_0.Args[1] 18863 if v_0_1.Op != OpARMMOVWconst { 18864 break 18865 } 18866 d := v_0_1.AuxInt 18867 v.reset(OpARMMOVWconst) 18868 v.AuxInt = int64(uint32(c) / uint32(d)) 18869 return true 18870 } 18871 return false 18872 } 18873 func rewriteValueARM_OpSelect1_0(v *Value) bool { 18874 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 18875 // cond: 18876 // result: (MOVWconst [0]) 18877 for { 18878 v_0 := v.Args[0] 18879 if v_0.Op != OpARMCALLudiv { 18880 break 18881 } 18882 _ = v_0.Args[1] 18883 v_0_1 := v_0.Args[1] 18884 if v_0_1.Op != OpARMMOVWconst { 18885 break 18886 } 18887 if v_0_1.AuxInt != 1 { 18888 break 18889 } 18890 v.reset(OpARMMOVWconst) 18891 v.AuxInt = 0 18892 return true 18893 } 18894 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 18895 // cond: isPowerOfTwo(c) 18896 // result: (ANDconst [c-1] x) 18897 for { 18898 v_0 := v.Args[0] 18899 if v_0.Op != OpARMCALLudiv { 18900 break 18901 } 18902 _ = v_0.Args[1] 18903 x := v_0.Args[0] 18904 v_0_1 := v_0.Args[1] 18905 if v_0_1.Op != OpARMMOVWconst { 18906 break 18907 } 18908 c := v_0_1.AuxInt 18909 if !(isPowerOfTwo(c)) { 18910 break 18911 } 18912 v.reset(OpARMANDconst) 18913 v.AuxInt = c - 1 18914 v.AddArg(x) 18915 return true 18916 } 18917 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 18918 // cond: 18919 // result: (MOVWconst [int64(uint32(c)%uint32(d))]) 18920 for { 18921 v_0 := v.Args[0] 18922 if v_0.Op != OpARMCALLudiv { 18923 break 18924 } 18925 _ = v_0.Args[1] 18926 v_0_0 := v_0.Args[0] 18927 if v_0_0.Op != OpARMMOVWconst { 18928 break 18929 } 18930 c := v_0_0.AuxInt 18931 v_0_1 := v_0.Args[1] 18932 if v_0_1.Op != OpARMMOVWconst { 18933 break 18934 } 18935 d := v_0_1.AuxInt 18936 v.reset(OpARMMOVWconst) 18937 v.AuxInt = int64(uint32(c) % uint32(d)) 18938 return true 18939 } 18940 return false 18941 } 18942 func rewriteValueARM_OpSignExt16to32_0(v *Value) bool { 18943 // match: (SignExt16to32 x) 18944 // cond: 18945 // result: (MOVHreg x) 18946 for { 18947 x := v.Args[0] 18948 v.reset(OpARMMOVHreg) 18949 v.AddArg(x) 18950 return true 18951 } 18952 } 18953 func rewriteValueARM_OpSignExt8to16_0(v *Value) bool { 18954 // match: (SignExt8to16 x) 18955 // cond: 18956 // result: (MOVBreg x) 18957 for { 18958 x := v.Args[0] 18959 v.reset(OpARMMOVBreg) 18960 v.AddArg(x) 18961 return true 18962 } 18963 } 18964 func rewriteValueARM_OpSignExt8to32_0(v *Value) bool { 18965 // match: (SignExt8to32 x) 18966 // cond: 18967 // result: (MOVBreg x) 18968 for { 18969 x := v.Args[0] 18970 v.reset(OpARMMOVBreg) 18971 v.AddArg(x) 18972 return true 18973 } 18974 } 18975 func rewriteValueARM_OpSignmask_0(v *Value) bool { 18976 // match: (Signmask x) 18977 // cond: 18978 // result: (SRAconst x [31]) 18979 for { 18980 x := v.Args[0] 18981 v.reset(OpARMSRAconst) 18982 v.AuxInt = 31 18983 v.AddArg(x) 18984 return true 18985 } 18986 } 18987 func rewriteValueARM_OpSlicemask_0(v *Value) bool { 18988 b := v.Block 18989 _ = b 18990 // match: (Slicemask <t> x) 18991 // cond: 18992 // result: (SRAconst (RSBconst <t> [0] x) [31]) 18993 for { 18994 t := v.Type 18995 x := v.Args[0] 18996 v.reset(OpARMSRAconst) 18997 v.AuxInt = 31 18998 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 18999 v0.AuxInt = 0 19000 v0.AddArg(x) 19001 v.AddArg(v0) 19002 return true 19003 } 19004 } 19005 func rewriteValueARM_OpSqrt_0(v *Value) bool { 19006 // match: (Sqrt x) 19007 // cond: 19008 // result: (SQRTD x) 19009 for { 19010 x := v.Args[0] 19011 v.reset(OpARMSQRTD) 19012 v.AddArg(x) 19013 return true 19014 } 19015 } 19016 func rewriteValueARM_OpStaticCall_0(v *Value) bool { 19017 // match: (StaticCall [argwid] {target} mem) 19018 // cond: 19019 // result: (CALLstatic [argwid] {target} mem) 19020 for { 19021 argwid := v.AuxInt 19022 target := v.Aux 19023 mem := v.Args[0] 19024 v.reset(OpARMCALLstatic) 19025 v.AuxInt = argwid 19026 v.Aux = target 19027 v.AddArg(mem) 19028 return true 19029 } 19030 } 19031 func rewriteValueARM_OpStore_0(v *Value) bool { 19032 // match: (Store {t} ptr val mem) 19033 // cond: t.(*types.Type).Size() == 1 19034 // result: (MOVBstore ptr val mem) 19035 for { 19036 t := v.Aux 19037 _ = v.Args[2] 19038 ptr := v.Args[0] 19039 val := v.Args[1] 19040 mem := v.Args[2] 19041 if !(t.(*types.Type).Size() == 1) { 19042 break 19043 } 19044 v.reset(OpARMMOVBstore) 19045 v.AddArg(ptr) 19046 v.AddArg(val) 19047 v.AddArg(mem) 19048 return true 19049 } 19050 // match: (Store {t} ptr val mem) 19051 // cond: t.(*types.Type).Size() == 2 19052 // result: (MOVHstore ptr val mem) 19053 for { 19054 t := v.Aux 19055 _ = v.Args[2] 19056 ptr := v.Args[0] 19057 val := v.Args[1] 19058 mem := v.Args[2] 19059 if !(t.(*types.Type).Size() == 2) { 19060 break 19061 } 19062 v.reset(OpARMMOVHstore) 19063 v.AddArg(ptr) 19064 v.AddArg(val) 19065 v.AddArg(mem) 19066 return true 19067 } 19068 // match: (Store {t} ptr val mem) 19069 // cond: t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type) 19070 // result: (MOVWstore ptr val mem) 19071 for { 19072 t := v.Aux 19073 _ = v.Args[2] 19074 ptr := v.Args[0] 19075 val := v.Args[1] 19076 mem := v.Args[2] 19077 if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { 19078 break 19079 } 19080 v.reset(OpARMMOVWstore) 19081 v.AddArg(ptr) 19082 v.AddArg(val) 19083 v.AddArg(mem) 19084 return true 19085 } 19086 // match: (Store {t} ptr val mem) 19087 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 19088 // result: (MOVFstore ptr val mem) 19089 for { 19090 t := v.Aux 19091 _ = v.Args[2] 19092 ptr := v.Args[0] 19093 val := v.Args[1] 19094 mem := v.Args[2] 19095 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 19096 break 19097 } 19098 v.reset(OpARMMOVFstore) 19099 v.AddArg(ptr) 19100 v.AddArg(val) 19101 v.AddArg(mem) 19102 return true 19103 } 19104 // match: (Store {t} ptr val mem) 19105 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 19106 // result: (MOVDstore ptr val mem) 19107 for { 19108 t := v.Aux 19109 _ = v.Args[2] 19110 ptr := v.Args[0] 19111 val := v.Args[1] 19112 mem := v.Args[2] 19113 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 19114 break 19115 } 19116 v.reset(OpARMMOVDstore) 19117 v.AddArg(ptr) 19118 v.AddArg(val) 19119 v.AddArg(mem) 19120 return true 19121 } 19122 return false 19123 } 19124 func rewriteValueARM_OpSub16_0(v *Value) bool { 19125 // match: (Sub16 x y) 19126 // cond: 19127 // result: (SUB x y) 19128 for { 19129 _ = v.Args[1] 19130 x := v.Args[0] 19131 y := v.Args[1] 19132 v.reset(OpARMSUB) 19133 v.AddArg(x) 19134 v.AddArg(y) 19135 return true 19136 } 19137 } 19138 func rewriteValueARM_OpSub32_0(v *Value) bool { 19139 // match: (Sub32 x y) 19140 // cond: 19141 // result: (SUB x y) 19142 for { 19143 _ = v.Args[1] 19144 x := v.Args[0] 19145 y := v.Args[1] 19146 v.reset(OpARMSUB) 19147 v.AddArg(x) 19148 v.AddArg(y) 19149 return true 19150 } 19151 } 19152 func rewriteValueARM_OpSub32F_0(v *Value) bool { 19153 // match: (Sub32F x y) 19154 // cond: 19155 // result: (SUBF x y) 19156 for { 19157 _ = v.Args[1] 19158 x := v.Args[0] 19159 y := v.Args[1] 19160 v.reset(OpARMSUBF) 19161 v.AddArg(x) 19162 v.AddArg(y) 19163 return true 19164 } 19165 } 19166 func rewriteValueARM_OpSub32carry_0(v *Value) bool { 19167 // match: (Sub32carry x y) 19168 // cond: 19169 // result: (SUBS x y) 19170 for { 19171 _ = v.Args[1] 19172 x := v.Args[0] 19173 y := v.Args[1] 19174 v.reset(OpARMSUBS) 19175 v.AddArg(x) 19176 v.AddArg(y) 19177 return true 19178 } 19179 } 19180 func rewriteValueARM_OpSub32withcarry_0(v *Value) bool { 19181 // match: (Sub32withcarry x y c) 19182 // cond: 19183 // result: (SBC x y c) 19184 for { 19185 _ = v.Args[2] 19186 x := v.Args[0] 19187 y := v.Args[1] 19188 c := v.Args[2] 19189 v.reset(OpARMSBC) 19190 v.AddArg(x) 19191 v.AddArg(y) 19192 v.AddArg(c) 19193 return true 19194 } 19195 } 19196 func rewriteValueARM_OpSub64F_0(v *Value) bool { 19197 // match: (Sub64F x y) 19198 // cond: 19199 // result: (SUBD x y) 19200 for { 19201 _ = v.Args[1] 19202 x := v.Args[0] 19203 y := v.Args[1] 19204 v.reset(OpARMSUBD) 19205 v.AddArg(x) 19206 v.AddArg(y) 19207 return true 19208 } 19209 } 19210 func rewriteValueARM_OpSub8_0(v *Value) bool { 19211 // match: (Sub8 x y) 19212 // cond: 19213 // result: (SUB x y) 19214 for { 19215 _ = v.Args[1] 19216 x := v.Args[0] 19217 y := v.Args[1] 19218 v.reset(OpARMSUB) 19219 v.AddArg(x) 19220 v.AddArg(y) 19221 return true 19222 } 19223 } 19224 func rewriteValueARM_OpSubPtr_0(v *Value) bool { 19225 // match: (SubPtr x y) 19226 // cond: 19227 // result: (SUB x y) 19228 for { 19229 _ = v.Args[1] 19230 x := v.Args[0] 19231 y := v.Args[1] 19232 v.reset(OpARMSUB) 19233 v.AddArg(x) 19234 v.AddArg(y) 19235 return true 19236 } 19237 } 19238 func rewriteValueARM_OpTrunc16to8_0(v *Value) bool { 19239 // match: (Trunc16to8 x) 19240 // cond: 19241 // result: x 19242 for { 19243 x := v.Args[0] 19244 v.reset(OpCopy) 19245 v.Type = x.Type 19246 v.AddArg(x) 19247 return true 19248 } 19249 } 19250 func rewriteValueARM_OpTrunc32to16_0(v *Value) bool { 19251 // match: (Trunc32to16 x) 19252 // cond: 19253 // result: x 19254 for { 19255 x := v.Args[0] 19256 v.reset(OpCopy) 19257 v.Type = x.Type 19258 v.AddArg(x) 19259 return true 19260 } 19261 } 19262 func rewriteValueARM_OpTrunc32to8_0(v *Value) bool { 19263 // match: (Trunc32to8 x) 19264 // cond: 19265 // result: x 19266 for { 19267 x := v.Args[0] 19268 v.reset(OpCopy) 19269 v.Type = x.Type 19270 v.AddArg(x) 19271 return true 19272 } 19273 } 19274 func rewriteValueARM_OpXor16_0(v *Value) bool { 19275 // match: (Xor16 x y) 19276 // cond: 19277 // result: (XOR x y) 19278 for { 19279 _ = v.Args[1] 19280 x := v.Args[0] 19281 y := v.Args[1] 19282 v.reset(OpARMXOR) 19283 v.AddArg(x) 19284 v.AddArg(y) 19285 return true 19286 } 19287 } 19288 func rewriteValueARM_OpXor32_0(v *Value) bool { 19289 // match: (Xor32 x y) 19290 // cond: 19291 // result: (XOR x y) 19292 for { 19293 _ = v.Args[1] 19294 x := v.Args[0] 19295 y := v.Args[1] 19296 v.reset(OpARMXOR) 19297 v.AddArg(x) 19298 v.AddArg(y) 19299 return true 19300 } 19301 } 19302 func rewriteValueARM_OpXor8_0(v *Value) bool { 19303 // match: (Xor8 x y) 19304 // cond: 19305 // result: (XOR x y) 19306 for { 19307 _ = v.Args[1] 19308 x := v.Args[0] 19309 y := v.Args[1] 19310 v.reset(OpARMXOR) 19311 v.AddArg(x) 19312 v.AddArg(y) 19313 return true 19314 } 19315 } 19316 func rewriteValueARM_OpZero_0(v *Value) bool { 19317 b := v.Block 19318 _ = b 19319 config := b.Func.Config 19320 _ = config 19321 typ := &b.Func.Config.Types 19322 _ = typ 19323 // match: (Zero [0] _ mem) 19324 // cond: 19325 // result: mem 19326 for { 19327 if v.AuxInt != 0 { 19328 break 19329 } 19330 _ = v.Args[1] 19331 mem := v.Args[1] 19332 v.reset(OpCopy) 19333 v.Type = mem.Type 19334 v.AddArg(mem) 19335 return true 19336 } 19337 // match: (Zero [1] ptr mem) 19338 // cond: 19339 // result: (MOVBstore ptr (MOVWconst [0]) mem) 19340 for { 19341 if v.AuxInt != 1 { 19342 break 19343 } 19344 _ = v.Args[1] 19345 ptr := v.Args[0] 19346 mem := v.Args[1] 19347 v.reset(OpARMMOVBstore) 19348 v.AddArg(ptr) 19349 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19350 v0.AuxInt = 0 19351 v.AddArg(v0) 19352 v.AddArg(mem) 19353 return true 19354 } 19355 // match: (Zero [2] {t} ptr mem) 19356 // cond: t.(*types.Type).Alignment()%2 == 0 19357 // result: (MOVHstore ptr (MOVWconst [0]) mem) 19358 for { 19359 if v.AuxInt != 2 { 19360 break 19361 } 19362 t := v.Aux 19363 _ = v.Args[1] 19364 ptr := v.Args[0] 19365 mem := v.Args[1] 19366 if !(t.(*types.Type).Alignment()%2 == 0) { 19367 break 19368 } 19369 v.reset(OpARMMOVHstore) 19370 v.AddArg(ptr) 19371 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19372 v0.AuxInt = 0 19373 v.AddArg(v0) 19374 v.AddArg(mem) 19375 return true 19376 } 19377 // match: (Zero [2] ptr mem) 19378 // cond: 19379 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 19380 for { 19381 if v.AuxInt != 2 { 19382 break 19383 } 19384 _ = v.Args[1] 19385 ptr := v.Args[0] 19386 mem := v.Args[1] 19387 v.reset(OpARMMOVBstore) 19388 v.AuxInt = 1 19389 v.AddArg(ptr) 19390 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19391 v0.AuxInt = 0 19392 v.AddArg(v0) 19393 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 19394 v1.AuxInt = 0 19395 v1.AddArg(ptr) 19396 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19397 v2.AuxInt = 0 19398 v1.AddArg(v2) 19399 v1.AddArg(mem) 19400 v.AddArg(v1) 19401 return true 19402 } 19403 // match: (Zero [4] {t} ptr mem) 19404 // cond: t.(*types.Type).Alignment()%4 == 0 19405 // result: (MOVWstore ptr (MOVWconst [0]) mem) 19406 for { 19407 if v.AuxInt != 4 { 19408 break 19409 } 19410 t := v.Aux 19411 _ = v.Args[1] 19412 ptr := v.Args[0] 19413 mem := v.Args[1] 19414 if !(t.(*types.Type).Alignment()%4 == 0) { 19415 break 19416 } 19417 v.reset(OpARMMOVWstore) 19418 v.AddArg(ptr) 19419 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19420 v0.AuxInt = 0 19421 v.AddArg(v0) 19422 v.AddArg(mem) 19423 return true 19424 } 19425 // match: (Zero [4] {t} ptr mem) 19426 // cond: t.(*types.Type).Alignment()%2 == 0 19427 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 19428 for { 19429 if v.AuxInt != 4 { 19430 break 19431 } 19432 t := v.Aux 19433 _ = v.Args[1] 19434 ptr := v.Args[0] 19435 mem := v.Args[1] 19436 if !(t.(*types.Type).Alignment()%2 == 0) { 19437 break 19438 } 19439 v.reset(OpARMMOVHstore) 19440 v.AuxInt = 2 19441 v.AddArg(ptr) 19442 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19443 v0.AuxInt = 0 19444 v.AddArg(v0) 19445 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 19446 v1.AuxInt = 0 19447 v1.AddArg(ptr) 19448 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19449 v2.AuxInt = 0 19450 v1.AddArg(v2) 19451 v1.AddArg(mem) 19452 v.AddArg(v1) 19453 return true 19454 } 19455 // match: (Zero [4] ptr mem) 19456 // cond: 19457 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 19458 for { 19459 if v.AuxInt != 4 { 19460 break 19461 } 19462 _ = v.Args[1] 19463 ptr := v.Args[0] 19464 mem := v.Args[1] 19465 v.reset(OpARMMOVBstore) 19466 v.AuxInt = 3 19467 v.AddArg(ptr) 19468 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19469 v0.AuxInt = 0 19470 v.AddArg(v0) 19471 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 19472 v1.AuxInt = 2 19473 v1.AddArg(ptr) 19474 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19475 v2.AuxInt = 0 19476 v1.AddArg(v2) 19477 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 19478 v3.AuxInt = 1 19479 v3.AddArg(ptr) 19480 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19481 v4.AuxInt = 0 19482 v3.AddArg(v4) 19483 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 19484 v5.AuxInt = 0 19485 v5.AddArg(ptr) 19486 v6 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19487 v6.AuxInt = 0 19488 v5.AddArg(v6) 19489 v5.AddArg(mem) 19490 v3.AddArg(v5) 19491 v1.AddArg(v3) 19492 v.AddArg(v1) 19493 return true 19494 } 19495 // match: (Zero [3] ptr mem) 19496 // cond: 19497 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 19498 for { 19499 if v.AuxInt != 3 { 19500 break 19501 } 19502 _ = v.Args[1] 19503 ptr := v.Args[0] 19504 mem := v.Args[1] 19505 v.reset(OpARMMOVBstore) 19506 v.AuxInt = 2 19507 v.AddArg(ptr) 19508 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19509 v0.AuxInt = 0 19510 v.AddArg(v0) 19511 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 19512 v1.AuxInt = 1 19513 v1.AddArg(ptr) 19514 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19515 v2.AuxInt = 0 19516 v1.AddArg(v2) 19517 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 19518 v3.AuxInt = 0 19519 v3.AddArg(ptr) 19520 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19521 v4.AuxInt = 0 19522 v3.AddArg(v4) 19523 v3.AddArg(mem) 19524 v1.AddArg(v3) 19525 v.AddArg(v1) 19526 return true 19527 } 19528 // match: (Zero [s] {t} ptr mem) 19529 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 19530 // result: (DUFFZERO [4 * (128 - int64(s/4))] ptr (MOVWconst [0]) mem) 19531 for { 19532 s := v.AuxInt 19533 t := v.Aux 19534 _ = v.Args[1] 19535 ptr := v.Args[0] 19536 mem := v.Args[1] 19537 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 19538 break 19539 } 19540 v.reset(OpARMDUFFZERO) 19541 v.AuxInt = 4 * (128 - int64(s/4)) 19542 v.AddArg(ptr) 19543 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19544 v0.AuxInt = 0 19545 v.AddArg(v0) 19546 v.AddArg(mem) 19547 return true 19548 } 19549 // match: (Zero [s] {t} ptr mem) 19550 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 19551 // result: (LoweredZero [t.(*types.Type).Alignment()] ptr (ADDconst <ptr.Type> ptr [s-moveSize(t.(*types.Type).Alignment(), config)]) (MOVWconst [0]) mem) 19552 for { 19553 s := v.AuxInt 19554 t := v.Aux 19555 _ = v.Args[1] 19556 ptr := v.Args[0] 19557 mem := v.Args[1] 19558 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 19559 break 19560 } 19561 v.reset(OpARMLoweredZero) 19562 v.AuxInt = t.(*types.Type).Alignment() 19563 v.AddArg(ptr) 19564 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 19565 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 19566 v0.AddArg(ptr) 19567 v.AddArg(v0) 19568 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 19569 v1.AuxInt = 0 19570 v.AddArg(v1) 19571 v.AddArg(mem) 19572 return true 19573 } 19574 return false 19575 } 19576 func rewriteValueARM_OpZeroExt16to32_0(v *Value) bool { 19577 // match: (ZeroExt16to32 x) 19578 // cond: 19579 // result: (MOVHUreg x) 19580 for { 19581 x := v.Args[0] 19582 v.reset(OpARMMOVHUreg) 19583 v.AddArg(x) 19584 return true 19585 } 19586 } 19587 func rewriteValueARM_OpZeroExt8to16_0(v *Value) bool { 19588 // match: (ZeroExt8to16 x) 19589 // cond: 19590 // result: (MOVBUreg x) 19591 for { 19592 x := v.Args[0] 19593 v.reset(OpARMMOVBUreg) 19594 v.AddArg(x) 19595 return true 19596 } 19597 } 19598 func rewriteValueARM_OpZeroExt8to32_0(v *Value) bool { 19599 // match: (ZeroExt8to32 x) 19600 // cond: 19601 // result: (MOVBUreg x) 19602 for { 19603 x := v.Args[0] 19604 v.reset(OpARMMOVBUreg) 19605 v.AddArg(x) 19606 return true 19607 } 19608 } 19609 func rewriteValueARM_OpZeromask_0(v *Value) bool { 19610 b := v.Block 19611 _ = b 19612 typ := &b.Func.Config.Types 19613 _ = typ 19614 // match: (Zeromask x) 19615 // cond: 19616 // result: (SRAconst (RSBshiftRL <typ.Int32> x x [1]) [31]) 19617 for { 19618 x := v.Args[0] 19619 v.reset(OpARMSRAconst) 19620 v.AuxInt = 31 19621 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32) 19622 v0.AuxInt = 1 19623 v0.AddArg(x) 19624 v0.AddArg(x) 19625 v.AddArg(v0) 19626 return true 19627 } 19628 } 19629 func rewriteBlockARM(b *Block) bool { 19630 config := b.Func.Config 19631 _ = config 19632 fe := b.Func.fe 19633 _ = fe 19634 typ := &config.Types 19635 _ = typ 19636 switch b.Kind { 19637 case BlockARMEQ: 19638 // match: (EQ (FlagEQ) yes no) 19639 // cond: 19640 // result: (First nil yes no) 19641 for { 19642 v := b.Control 19643 if v.Op != OpARMFlagEQ { 19644 break 19645 } 19646 b.Kind = BlockFirst 19647 b.SetControl(nil) 19648 b.Aux = nil 19649 return true 19650 } 19651 // match: (EQ (FlagLT_ULT) yes no) 19652 // cond: 19653 // result: (First nil no yes) 19654 for { 19655 v := b.Control 19656 if v.Op != OpARMFlagLT_ULT { 19657 break 19658 } 19659 b.Kind = BlockFirst 19660 b.SetControl(nil) 19661 b.Aux = nil 19662 b.swapSuccessors() 19663 return true 19664 } 19665 // match: (EQ (FlagLT_UGT) yes no) 19666 // cond: 19667 // result: (First nil no yes) 19668 for { 19669 v := b.Control 19670 if v.Op != OpARMFlagLT_UGT { 19671 break 19672 } 19673 b.Kind = BlockFirst 19674 b.SetControl(nil) 19675 b.Aux = nil 19676 b.swapSuccessors() 19677 return true 19678 } 19679 // match: (EQ (FlagGT_ULT) yes no) 19680 // cond: 19681 // result: (First nil no yes) 19682 for { 19683 v := b.Control 19684 if v.Op != OpARMFlagGT_ULT { 19685 break 19686 } 19687 b.Kind = BlockFirst 19688 b.SetControl(nil) 19689 b.Aux = nil 19690 b.swapSuccessors() 19691 return true 19692 } 19693 // match: (EQ (FlagGT_UGT) yes no) 19694 // cond: 19695 // result: (First nil no yes) 19696 for { 19697 v := b.Control 19698 if v.Op != OpARMFlagGT_UGT { 19699 break 19700 } 19701 b.Kind = BlockFirst 19702 b.SetControl(nil) 19703 b.Aux = nil 19704 b.swapSuccessors() 19705 return true 19706 } 19707 // match: (EQ (InvertFlags cmp) yes no) 19708 // cond: 19709 // result: (EQ cmp yes no) 19710 for { 19711 v := b.Control 19712 if v.Op != OpARMInvertFlags { 19713 break 19714 } 19715 cmp := v.Args[0] 19716 b.Kind = BlockARMEQ 19717 b.SetControl(cmp) 19718 b.Aux = nil 19719 return true 19720 } 19721 case BlockARMGE: 19722 // match: (GE (FlagEQ) yes no) 19723 // cond: 19724 // result: (First nil yes no) 19725 for { 19726 v := b.Control 19727 if v.Op != OpARMFlagEQ { 19728 break 19729 } 19730 b.Kind = BlockFirst 19731 b.SetControl(nil) 19732 b.Aux = nil 19733 return true 19734 } 19735 // match: (GE (FlagLT_ULT) yes no) 19736 // cond: 19737 // result: (First nil no yes) 19738 for { 19739 v := b.Control 19740 if v.Op != OpARMFlagLT_ULT { 19741 break 19742 } 19743 b.Kind = BlockFirst 19744 b.SetControl(nil) 19745 b.Aux = nil 19746 b.swapSuccessors() 19747 return true 19748 } 19749 // match: (GE (FlagLT_UGT) yes no) 19750 // cond: 19751 // result: (First nil no yes) 19752 for { 19753 v := b.Control 19754 if v.Op != OpARMFlagLT_UGT { 19755 break 19756 } 19757 b.Kind = BlockFirst 19758 b.SetControl(nil) 19759 b.Aux = nil 19760 b.swapSuccessors() 19761 return true 19762 } 19763 // match: (GE (FlagGT_ULT) yes no) 19764 // cond: 19765 // result: (First nil yes no) 19766 for { 19767 v := b.Control 19768 if v.Op != OpARMFlagGT_ULT { 19769 break 19770 } 19771 b.Kind = BlockFirst 19772 b.SetControl(nil) 19773 b.Aux = nil 19774 return true 19775 } 19776 // match: (GE (FlagGT_UGT) yes no) 19777 // cond: 19778 // result: (First nil yes no) 19779 for { 19780 v := b.Control 19781 if v.Op != OpARMFlagGT_UGT { 19782 break 19783 } 19784 b.Kind = BlockFirst 19785 b.SetControl(nil) 19786 b.Aux = nil 19787 return true 19788 } 19789 // match: (GE (InvertFlags cmp) yes no) 19790 // cond: 19791 // result: (LE cmp yes no) 19792 for { 19793 v := b.Control 19794 if v.Op != OpARMInvertFlags { 19795 break 19796 } 19797 cmp := v.Args[0] 19798 b.Kind = BlockARMLE 19799 b.SetControl(cmp) 19800 b.Aux = nil 19801 return true 19802 } 19803 case BlockARMGT: 19804 // match: (GT (FlagEQ) yes no) 19805 // cond: 19806 // result: (First nil no yes) 19807 for { 19808 v := b.Control 19809 if v.Op != OpARMFlagEQ { 19810 break 19811 } 19812 b.Kind = BlockFirst 19813 b.SetControl(nil) 19814 b.Aux = nil 19815 b.swapSuccessors() 19816 return true 19817 } 19818 // match: (GT (FlagLT_ULT) yes no) 19819 // cond: 19820 // result: (First nil no yes) 19821 for { 19822 v := b.Control 19823 if v.Op != OpARMFlagLT_ULT { 19824 break 19825 } 19826 b.Kind = BlockFirst 19827 b.SetControl(nil) 19828 b.Aux = nil 19829 b.swapSuccessors() 19830 return true 19831 } 19832 // match: (GT (FlagLT_UGT) yes no) 19833 // cond: 19834 // result: (First nil no yes) 19835 for { 19836 v := b.Control 19837 if v.Op != OpARMFlagLT_UGT { 19838 break 19839 } 19840 b.Kind = BlockFirst 19841 b.SetControl(nil) 19842 b.Aux = nil 19843 b.swapSuccessors() 19844 return true 19845 } 19846 // match: (GT (FlagGT_ULT) yes no) 19847 // cond: 19848 // result: (First nil yes no) 19849 for { 19850 v := b.Control 19851 if v.Op != OpARMFlagGT_ULT { 19852 break 19853 } 19854 b.Kind = BlockFirst 19855 b.SetControl(nil) 19856 b.Aux = nil 19857 return true 19858 } 19859 // match: (GT (FlagGT_UGT) yes no) 19860 // cond: 19861 // result: (First nil yes no) 19862 for { 19863 v := b.Control 19864 if v.Op != OpARMFlagGT_UGT { 19865 break 19866 } 19867 b.Kind = BlockFirst 19868 b.SetControl(nil) 19869 b.Aux = nil 19870 return true 19871 } 19872 // match: (GT (InvertFlags cmp) yes no) 19873 // cond: 19874 // result: (LT cmp yes no) 19875 for { 19876 v := b.Control 19877 if v.Op != OpARMInvertFlags { 19878 break 19879 } 19880 cmp := v.Args[0] 19881 b.Kind = BlockARMLT 19882 b.SetControl(cmp) 19883 b.Aux = nil 19884 return true 19885 } 19886 case BlockIf: 19887 // match: (If (Equal cc) yes no) 19888 // cond: 19889 // result: (EQ cc yes no) 19890 for { 19891 v := b.Control 19892 if v.Op != OpARMEqual { 19893 break 19894 } 19895 cc := v.Args[0] 19896 b.Kind = BlockARMEQ 19897 b.SetControl(cc) 19898 b.Aux = nil 19899 return true 19900 } 19901 // match: (If (NotEqual cc) yes no) 19902 // cond: 19903 // result: (NE cc yes no) 19904 for { 19905 v := b.Control 19906 if v.Op != OpARMNotEqual { 19907 break 19908 } 19909 cc := v.Args[0] 19910 b.Kind = BlockARMNE 19911 b.SetControl(cc) 19912 b.Aux = nil 19913 return true 19914 } 19915 // match: (If (LessThan cc) yes no) 19916 // cond: 19917 // result: (LT cc yes no) 19918 for { 19919 v := b.Control 19920 if v.Op != OpARMLessThan { 19921 break 19922 } 19923 cc := v.Args[0] 19924 b.Kind = BlockARMLT 19925 b.SetControl(cc) 19926 b.Aux = nil 19927 return true 19928 } 19929 // match: (If (LessThanU cc) yes no) 19930 // cond: 19931 // result: (ULT cc yes no) 19932 for { 19933 v := b.Control 19934 if v.Op != OpARMLessThanU { 19935 break 19936 } 19937 cc := v.Args[0] 19938 b.Kind = BlockARMULT 19939 b.SetControl(cc) 19940 b.Aux = nil 19941 return true 19942 } 19943 // match: (If (LessEqual cc) yes no) 19944 // cond: 19945 // result: (LE cc yes no) 19946 for { 19947 v := b.Control 19948 if v.Op != OpARMLessEqual { 19949 break 19950 } 19951 cc := v.Args[0] 19952 b.Kind = BlockARMLE 19953 b.SetControl(cc) 19954 b.Aux = nil 19955 return true 19956 } 19957 // match: (If (LessEqualU cc) yes no) 19958 // cond: 19959 // result: (ULE cc yes no) 19960 for { 19961 v := b.Control 19962 if v.Op != OpARMLessEqualU { 19963 break 19964 } 19965 cc := v.Args[0] 19966 b.Kind = BlockARMULE 19967 b.SetControl(cc) 19968 b.Aux = nil 19969 return true 19970 } 19971 // match: (If (GreaterThan cc) yes no) 19972 // cond: 19973 // result: (GT cc yes no) 19974 for { 19975 v := b.Control 19976 if v.Op != OpARMGreaterThan { 19977 break 19978 } 19979 cc := v.Args[0] 19980 b.Kind = BlockARMGT 19981 b.SetControl(cc) 19982 b.Aux = nil 19983 return true 19984 } 19985 // match: (If (GreaterThanU cc) yes no) 19986 // cond: 19987 // result: (UGT cc yes no) 19988 for { 19989 v := b.Control 19990 if v.Op != OpARMGreaterThanU { 19991 break 19992 } 19993 cc := v.Args[0] 19994 b.Kind = BlockARMUGT 19995 b.SetControl(cc) 19996 b.Aux = nil 19997 return true 19998 } 19999 // match: (If (GreaterEqual cc) yes no) 20000 // cond: 20001 // result: (GE cc yes no) 20002 for { 20003 v := b.Control 20004 if v.Op != OpARMGreaterEqual { 20005 break 20006 } 20007 cc := v.Args[0] 20008 b.Kind = BlockARMGE 20009 b.SetControl(cc) 20010 b.Aux = nil 20011 return true 20012 } 20013 // match: (If (GreaterEqualU cc) yes no) 20014 // cond: 20015 // result: (UGE cc yes no) 20016 for { 20017 v := b.Control 20018 if v.Op != OpARMGreaterEqualU { 20019 break 20020 } 20021 cc := v.Args[0] 20022 b.Kind = BlockARMUGE 20023 b.SetControl(cc) 20024 b.Aux = nil 20025 return true 20026 } 20027 // match: (If cond yes no) 20028 // cond: 20029 // result: (NE (CMPconst [0] cond) yes no) 20030 for { 20031 v := b.Control 20032 _ = v 20033 cond := b.Control 20034 b.Kind = BlockARMNE 20035 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20036 v0.AuxInt = 0 20037 v0.AddArg(cond) 20038 b.SetControl(v0) 20039 b.Aux = nil 20040 return true 20041 } 20042 case BlockARMLE: 20043 // match: (LE (FlagEQ) yes no) 20044 // cond: 20045 // result: (First nil yes no) 20046 for { 20047 v := b.Control 20048 if v.Op != OpARMFlagEQ { 20049 break 20050 } 20051 b.Kind = BlockFirst 20052 b.SetControl(nil) 20053 b.Aux = nil 20054 return true 20055 } 20056 // match: (LE (FlagLT_ULT) yes no) 20057 // cond: 20058 // result: (First nil yes no) 20059 for { 20060 v := b.Control 20061 if v.Op != OpARMFlagLT_ULT { 20062 break 20063 } 20064 b.Kind = BlockFirst 20065 b.SetControl(nil) 20066 b.Aux = nil 20067 return true 20068 } 20069 // match: (LE (FlagLT_UGT) yes no) 20070 // cond: 20071 // result: (First nil yes no) 20072 for { 20073 v := b.Control 20074 if v.Op != OpARMFlagLT_UGT { 20075 break 20076 } 20077 b.Kind = BlockFirst 20078 b.SetControl(nil) 20079 b.Aux = nil 20080 return true 20081 } 20082 // match: (LE (FlagGT_ULT) yes no) 20083 // cond: 20084 // result: (First nil no yes) 20085 for { 20086 v := b.Control 20087 if v.Op != OpARMFlagGT_ULT { 20088 break 20089 } 20090 b.Kind = BlockFirst 20091 b.SetControl(nil) 20092 b.Aux = nil 20093 b.swapSuccessors() 20094 return true 20095 } 20096 // match: (LE (FlagGT_UGT) yes no) 20097 // cond: 20098 // result: (First nil no yes) 20099 for { 20100 v := b.Control 20101 if v.Op != OpARMFlagGT_UGT { 20102 break 20103 } 20104 b.Kind = BlockFirst 20105 b.SetControl(nil) 20106 b.Aux = nil 20107 b.swapSuccessors() 20108 return true 20109 } 20110 // match: (LE (InvertFlags cmp) yes no) 20111 // cond: 20112 // result: (GE cmp yes no) 20113 for { 20114 v := b.Control 20115 if v.Op != OpARMInvertFlags { 20116 break 20117 } 20118 cmp := v.Args[0] 20119 b.Kind = BlockARMGE 20120 b.SetControl(cmp) 20121 b.Aux = nil 20122 return true 20123 } 20124 case BlockARMLT: 20125 // match: (LT (FlagEQ) yes no) 20126 // cond: 20127 // result: (First nil no yes) 20128 for { 20129 v := b.Control 20130 if v.Op != OpARMFlagEQ { 20131 break 20132 } 20133 b.Kind = BlockFirst 20134 b.SetControl(nil) 20135 b.Aux = nil 20136 b.swapSuccessors() 20137 return true 20138 } 20139 // match: (LT (FlagLT_ULT) yes no) 20140 // cond: 20141 // result: (First nil yes no) 20142 for { 20143 v := b.Control 20144 if v.Op != OpARMFlagLT_ULT { 20145 break 20146 } 20147 b.Kind = BlockFirst 20148 b.SetControl(nil) 20149 b.Aux = nil 20150 return true 20151 } 20152 // match: (LT (FlagLT_UGT) yes no) 20153 // cond: 20154 // result: (First nil yes no) 20155 for { 20156 v := b.Control 20157 if v.Op != OpARMFlagLT_UGT { 20158 break 20159 } 20160 b.Kind = BlockFirst 20161 b.SetControl(nil) 20162 b.Aux = nil 20163 return true 20164 } 20165 // match: (LT (FlagGT_ULT) yes no) 20166 // cond: 20167 // result: (First nil no yes) 20168 for { 20169 v := b.Control 20170 if v.Op != OpARMFlagGT_ULT { 20171 break 20172 } 20173 b.Kind = BlockFirst 20174 b.SetControl(nil) 20175 b.Aux = nil 20176 b.swapSuccessors() 20177 return true 20178 } 20179 // match: (LT (FlagGT_UGT) yes no) 20180 // cond: 20181 // result: (First nil no yes) 20182 for { 20183 v := b.Control 20184 if v.Op != OpARMFlagGT_UGT { 20185 break 20186 } 20187 b.Kind = BlockFirst 20188 b.SetControl(nil) 20189 b.Aux = nil 20190 b.swapSuccessors() 20191 return true 20192 } 20193 // match: (LT (InvertFlags cmp) yes no) 20194 // cond: 20195 // result: (GT cmp yes no) 20196 for { 20197 v := b.Control 20198 if v.Op != OpARMInvertFlags { 20199 break 20200 } 20201 cmp := v.Args[0] 20202 b.Kind = BlockARMGT 20203 b.SetControl(cmp) 20204 b.Aux = nil 20205 return true 20206 } 20207 case BlockARMNE: 20208 // match: (NE (CMPconst [0] (Equal cc)) yes no) 20209 // cond: 20210 // result: (EQ cc yes no) 20211 for { 20212 v := b.Control 20213 if v.Op != OpARMCMPconst { 20214 break 20215 } 20216 if v.AuxInt != 0 { 20217 break 20218 } 20219 v_0 := v.Args[0] 20220 if v_0.Op != OpARMEqual { 20221 break 20222 } 20223 cc := v_0.Args[0] 20224 b.Kind = BlockARMEQ 20225 b.SetControl(cc) 20226 b.Aux = nil 20227 return true 20228 } 20229 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 20230 // cond: 20231 // result: (NE cc yes no) 20232 for { 20233 v := b.Control 20234 if v.Op != OpARMCMPconst { 20235 break 20236 } 20237 if v.AuxInt != 0 { 20238 break 20239 } 20240 v_0 := v.Args[0] 20241 if v_0.Op != OpARMNotEqual { 20242 break 20243 } 20244 cc := v_0.Args[0] 20245 b.Kind = BlockARMNE 20246 b.SetControl(cc) 20247 b.Aux = nil 20248 return true 20249 } 20250 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 20251 // cond: 20252 // result: (LT cc yes no) 20253 for { 20254 v := b.Control 20255 if v.Op != OpARMCMPconst { 20256 break 20257 } 20258 if v.AuxInt != 0 { 20259 break 20260 } 20261 v_0 := v.Args[0] 20262 if v_0.Op != OpARMLessThan { 20263 break 20264 } 20265 cc := v_0.Args[0] 20266 b.Kind = BlockARMLT 20267 b.SetControl(cc) 20268 b.Aux = nil 20269 return true 20270 } 20271 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 20272 // cond: 20273 // result: (ULT cc yes no) 20274 for { 20275 v := b.Control 20276 if v.Op != OpARMCMPconst { 20277 break 20278 } 20279 if v.AuxInt != 0 { 20280 break 20281 } 20282 v_0 := v.Args[0] 20283 if v_0.Op != OpARMLessThanU { 20284 break 20285 } 20286 cc := v_0.Args[0] 20287 b.Kind = BlockARMULT 20288 b.SetControl(cc) 20289 b.Aux = nil 20290 return true 20291 } 20292 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 20293 // cond: 20294 // result: (LE cc yes no) 20295 for { 20296 v := b.Control 20297 if v.Op != OpARMCMPconst { 20298 break 20299 } 20300 if v.AuxInt != 0 { 20301 break 20302 } 20303 v_0 := v.Args[0] 20304 if v_0.Op != OpARMLessEqual { 20305 break 20306 } 20307 cc := v_0.Args[0] 20308 b.Kind = BlockARMLE 20309 b.SetControl(cc) 20310 b.Aux = nil 20311 return true 20312 } 20313 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 20314 // cond: 20315 // result: (ULE cc yes no) 20316 for { 20317 v := b.Control 20318 if v.Op != OpARMCMPconst { 20319 break 20320 } 20321 if v.AuxInt != 0 { 20322 break 20323 } 20324 v_0 := v.Args[0] 20325 if v_0.Op != OpARMLessEqualU { 20326 break 20327 } 20328 cc := v_0.Args[0] 20329 b.Kind = BlockARMULE 20330 b.SetControl(cc) 20331 b.Aux = nil 20332 return true 20333 } 20334 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 20335 // cond: 20336 // result: (GT cc yes no) 20337 for { 20338 v := b.Control 20339 if v.Op != OpARMCMPconst { 20340 break 20341 } 20342 if v.AuxInt != 0 { 20343 break 20344 } 20345 v_0 := v.Args[0] 20346 if v_0.Op != OpARMGreaterThan { 20347 break 20348 } 20349 cc := v_0.Args[0] 20350 b.Kind = BlockARMGT 20351 b.SetControl(cc) 20352 b.Aux = nil 20353 return true 20354 } 20355 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 20356 // cond: 20357 // result: (UGT cc yes no) 20358 for { 20359 v := b.Control 20360 if v.Op != OpARMCMPconst { 20361 break 20362 } 20363 if v.AuxInt != 0 { 20364 break 20365 } 20366 v_0 := v.Args[0] 20367 if v_0.Op != OpARMGreaterThanU { 20368 break 20369 } 20370 cc := v_0.Args[0] 20371 b.Kind = BlockARMUGT 20372 b.SetControl(cc) 20373 b.Aux = nil 20374 return true 20375 } 20376 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 20377 // cond: 20378 // result: (GE cc yes no) 20379 for { 20380 v := b.Control 20381 if v.Op != OpARMCMPconst { 20382 break 20383 } 20384 if v.AuxInt != 0 { 20385 break 20386 } 20387 v_0 := v.Args[0] 20388 if v_0.Op != OpARMGreaterEqual { 20389 break 20390 } 20391 cc := v_0.Args[0] 20392 b.Kind = BlockARMGE 20393 b.SetControl(cc) 20394 b.Aux = nil 20395 return true 20396 } 20397 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 20398 // cond: 20399 // result: (UGE cc yes no) 20400 for { 20401 v := b.Control 20402 if v.Op != OpARMCMPconst { 20403 break 20404 } 20405 if v.AuxInt != 0 { 20406 break 20407 } 20408 v_0 := v.Args[0] 20409 if v_0.Op != OpARMGreaterEqualU { 20410 break 20411 } 20412 cc := v_0.Args[0] 20413 b.Kind = BlockARMUGE 20414 b.SetControl(cc) 20415 b.Aux = nil 20416 return true 20417 } 20418 // match: (NE (FlagEQ) yes no) 20419 // cond: 20420 // result: (First nil no yes) 20421 for { 20422 v := b.Control 20423 if v.Op != OpARMFlagEQ { 20424 break 20425 } 20426 b.Kind = BlockFirst 20427 b.SetControl(nil) 20428 b.Aux = nil 20429 b.swapSuccessors() 20430 return true 20431 } 20432 // match: (NE (FlagLT_ULT) yes no) 20433 // cond: 20434 // result: (First nil yes no) 20435 for { 20436 v := b.Control 20437 if v.Op != OpARMFlagLT_ULT { 20438 break 20439 } 20440 b.Kind = BlockFirst 20441 b.SetControl(nil) 20442 b.Aux = nil 20443 return true 20444 } 20445 // match: (NE (FlagLT_UGT) yes no) 20446 // cond: 20447 // result: (First nil yes no) 20448 for { 20449 v := b.Control 20450 if v.Op != OpARMFlagLT_UGT { 20451 break 20452 } 20453 b.Kind = BlockFirst 20454 b.SetControl(nil) 20455 b.Aux = nil 20456 return true 20457 } 20458 // match: (NE (FlagGT_ULT) yes no) 20459 // cond: 20460 // result: (First nil yes no) 20461 for { 20462 v := b.Control 20463 if v.Op != OpARMFlagGT_ULT { 20464 break 20465 } 20466 b.Kind = BlockFirst 20467 b.SetControl(nil) 20468 b.Aux = nil 20469 return true 20470 } 20471 // match: (NE (FlagGT_UGT) yes no) 20472 // cond: 20473 // result: (First nil yes no) 20474 for { 20475 v := b.Control 20476 if v.Op != OpARMFlagGT_UGT { 20477 break 20478 } 20479 b.Kind = BlockFirst 20480 b.SetControl(nil) 20481 b.Aux = nil 20482 return true 20483 } 20484 // match: (NE (InvertFlags cmp) yes no) 20485 // cond: 20486 // result: (NE cmp yes no) 20487 for { 20488 v := b.Control 20489 if v.Op != OpARMInvertFlags { 20490 break 20491 } 20492 cmp := v.Args[0] 20493 b.Kind = BlockARMNE 20494 b.SetControl(cmp) 20495 b.Aux = nil 20496 return true 20497 } 20498 case BlockARMUGE: 20499 // match: (UGE (FlagEQ) yes no) 20500 // cond: 20501 // result: (First nil yes no) 20502 for { 20503 v := b.Control 20504 if v.Op != OpARMFlagEQ { 20505 break 20506 } 20507 b.Kind = BlockFirst 20508 b.SetControl(nil) 20509 b.Aux = nil 20510 return true 20511 } 20512 // match: (UGE (FlagLT_ULT) yes no) 20513 // cond: 20514 // result: (First nil no yes) 20515 for { 20516 v := b.Control 20517 if v.Op != OpARMFlagLT_ULT { 20518 break 20519 } 20520 b.Kind = BlockFirst 20521 b.SetControl(nil) 20522 b.Aux = nil 20523 b.swapSuccessors() 20524 return true 20525 } 20526 // match: (UGE (FlagLT_UGT) yes no) 20527 // cond: 20528 // result: (First nil yes no) 20529 for { 20530 v := b.Control 20531 if v.Op != OpARMFlagLT_UGT { 20532 break 20533 } 20534 b.Kind = BlockFirst 20535 b.SetControl(nil) 20536 b.Aux = nil 20537 return true 20538 } 20539 // match: (UGE (FlagGT_ULT) yes no) 20540 // cond: 20541 // result: (First nil no yes) 20542 for { 20543 v := b.Control 20544 if v.Op != OpARMFlagGT_ULT { 20545 break 20546 } 20547 b.Kind = BlockFirst 20548 b.SetControl(nil) 20549 b.Aux = nil 20550 b.swapSuccessors() 20551 return true 20552 } 20553 // match: (UGE (FlagGT_UGT) yes no) 20554 // cond: 20555 // result: (First nil yes no) 20556 for { 20557 v := b.Control 20558 if v.Op != OpARMFlagGT_UGT { 20559 break 20560 } 20561 b.Kind = BlockFirst 20562 b.SetControl(nil) 20563 b.Aux = nil 20564 return true 20565 } 20566 // match: (UGE (InvertFlags cmp) yes no) 20567 // cond: 20568 // result: (ULE cmp yes no) 20569 for { 20570 v := b.Control 20571 if v.Op != OpARMInvertFlags { 20572 break 20573 } 20574 cmp := v.Args[0] 20575 b.Kind = BlockARMULE 20576 b.SetControl(cmp) 20577 b.Aux = nil 20578 return true 20579 } 20580 case BlockARMUGT: 20581 // match: (UGT (FlagEQ) yes no) 20582 // cond: 20583 // result: (First nil no yes) 20584 for { 20585 v := b.Control 20586 if v.Op != OpARMFlagEQ { 20587 break 20588 } 20589 b.Kind = BlockFirst 20590 b.SetControl(nil) 20591 b.Aux = nil 20592 b.swapSuccessors() 20593 return true 20594 } 20595 // match: (UGT (FlagLT_ULT) yes no) 20596 // cond: 20597 // result: (First nil no yes) 20598 for { 20599 v := b.Control 20600 if v.Op != OpARMFlagLT_ULT { 20601 break 20602 } 20603 b.Kind = BlockFirst 20604 b.SetControl(nil) 20605 b.Aux = nil 20606 b.swapSuccessors() 20607 return true 20608 } 20609 // match: (UGT (FlagLT_UGT) yes no) 20610 // cond: 20611 // result: (First nil yes no) 20612 for { 20613 v := b.Control 20614 if v.Op != OpARMFlagLT_UGT { 20615 break 20616 } 20617 b.Kind = BlockFirst 20618 b.SetControl(nil) 20619 b.Aux = nil 20620 return true 20621 } 20622 // match: (UGT (FlagGT_ULT) yes no) 20623 // cond: 20624 // result: (First nil no yes) 20625 for { 20626 v := b.Control 20627 if v.Op != OpARMFlagGT_ULT { 20628 break 20629 } 20630 b.Kind = BlockFirst 20631 b.SetControl(nil) 20632 b.Aux = nil 20633 b.swapSuccessors() 20634 return true 20635 } 20636 // match: (UGT (FlagGT_UGT) yes no) 20637 // cond: 20638 // result: (First nil yes no) 20639 for { 20640 v := b.Control 20641 if v.Op != OpARMFlagGT_UGT { 20642 break 20643 } 20644 b.Kind = BlockFirst 20645 b.SetControl(nil) 20646 b.Aux = nil 20647 return true 20648 } 20649 // match: (UGT (InvertFlags cmp) yes no) 20650 // cond: 20651 // result: (ULT cmp yes no) 20652 for { 20653 v := b.Control 20654 if v.Op != OpARMInvertFlags { 20655 break 20656 } 20657 cmp := v.Args[0] 20658 b.Kind = BlockARMULT 20659 b.SetControl(cmp) 20660 b.Aux = nil 20661 return true 20662 } 20663 case BlockARMULE: 20664 // match: (ULE (FlagEQ) yes no) 20665 // cond: 20666 // result: (First nil yes no) 20667 for { 20668 v := b.Control 20669 if v.Op != OpARMFlagEQ { 20670 break 20671 } 20672 b.Kind = BlockFirst 20673 b.SetControl(nil) 20674 b.Aux = nil 20675 return true 20676 } 20677 // match: (ULE (FlagLT_ULT) yes no) 20678 // cond: 20679 // result: (First nil yes no) 20680 for { 20681 v := b.Control 20682 if v.Op != OpARMFlagLT_ULT { 20683 break 20684 } 20685 b.Kind = BlockFirst 20686 b.SetControl(nil) 20687 b.Aux = nil 20688 return true 20689 } 20690 // match: (ULE (FlagLT_UGT) yes no) 20691 // cond: 20692 // result: (First nil no yes) 20693 for { 20694 v := b.Control 20695 if v.Op != OpARMFlagLT_UGT { 20696 break 20697 } 20698 b.Kind = BlockFirst 20699 b.SetControl(nil) 20700 b.Aux = nil 20701 b.swapSuccessors() 20702 return true 20703 } 20704 // match: (ULE (FlagGT_ULT) yes no) 20705 // cond: 20706 // result: (First nil yes no) 20707 for { 20708 v := b.Control 20709 if v.Op != OpARMFlagGT_ULT { 20710 break 20711 } 20712 b.Kind = BlockFirst 20713 b.SetControl(nil) 20714 b.Aux = nil 20715 return true 20716 } 20717 // match: (ULE (FlagGT_UGT) yes no) 20718 // cond: 20719 // result: (First nil no yes) 20720 for { 20721 v := b.Control 20722 if v.Op != OpARMFlagGT_UGT { 20723 break 20724 } 20725 b.Kind = BlockFirst 20726 b.SetControl(nil) 20727 b.Aux = nil 20728 b.swapSuccessors() 20729 return true 20730 } 20731 // match: (ULE (InvertFlags cmp) yes no) 20732 // cond: 20733 // result: (UGE cmp yes no) 20734 for { 20735 v := b.Control 20736 if v.Op != OpARMInvertFlags { 20737 break 20738 } 20739 cmp := v.Args[0] 20740 b.Kind = BlockARMUGE 20741 b.SetControl(cmp) 20742 b.Aux = nil 20743 return true 20744 } 20745 case BlockARMULT: 20746 // match: (ULT (FlagEQ) yes no) 20747 // cond: 20748 // result: (First nil no yes) 20749 for { 20750 v := b.Control 20751 if v.Op != OpARMFlagEQ { 20752 break 20753 } 20754 b.Kind = BlockFirst 20755 b.SetControl(nil) 20756 b.Aux = nil 20757 b.swapSuccessors() 20758 return true 20759 } 20760 // match: (ULT (FlagLT_ULT) yes no) 20761 // cond: 20762 // result: (First nil yes no) 20763 for { 20764 v := b.Control 20765 if v.Op != OpARMFlagLT_ULT { 20766 break 20767 } 20768 b.Kind = BlockFirst 20769 b.SetControl(nil) 20770 b.Aux = nil 20771 return true 20772 } 20773 // match: (ULT (FlagLT_UGT) yes no) 20774 // cond: 20775 // result: (First nil no yes) 20776 for { 20777 v := b.Control 20778 if v.Op != OpARMFlagLT_UGT { 20779 break 20780 } 20781 b.Kind = BlockFirst 20782 b.SetControl(nil) 20783 b.Aux = nil 20784 b.swapSuccessors() 20785 return true 20786 } 20787 // match: (ULT (FlagGT_ULT) yes no) 20788 // cond: 20789 // result: (First nil yes no) 20790 for { 20791 v := b.Control 20792 if v.Op != OpARMFlagGT_ULT { 20793 break 20794 } 20795 b.Kind = BlockFirst 20796 b.SetControl(nil) 20797 b.Aux = nil 20798 return true 20799 } 20800 // match: (ULT (FlagGT_UGT) yes no) 20801 // cond: 20802 // result: (First nil no yes) 20803 for { 20804 v := b.Control 20805 if v.Op != OpARMFlagGT_UGT { 20806 break 20807 } 20808 b.Kind = BlockFirst 20809 b.SetControl(nil) 20810 b.Aux = nil 20811 b.swapSuccessors() 20812 return true 20813 } 20814 // match: (ULT (InvertFlags cmp) yes no) 20815 // cond: 20816 // result: (UGT cmp yes no) 20817 for { 20818 v := b.Control 20819 if v.Op != OpARMInvertFlags { 20820 break 20821 } 20822 cmp := v.Args[0] 20823 b.Kind = BlockARMUGT 20824 b.SetControl(cmp) 20825 b.Aux = nil 20826 return true 20827 } 20828 } 20829 return false 20830 }