github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/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 OpARMMOVBUreg: 141 return rewriteValueARM_OpARMMOVBUreg_0(v) 142 case OpARMMOVBload: 143 return rewriteValueARM_OpARMMOVBload_0(v) 144 case OpARMMOVBreg: 145 return rewriteValueARM_OpARMMOVBreg_0(v) 146 case OpARMMOVBstore: 147 return rewriteValueARM_OpARMMOVBstore_0(v) 148 case OpARMMOVDload: 149 return rewriteValueARM_OpARMMOVDload_0(v) 150 case OpARMMOVDstore: 151 return rewriteValueARM_OpARMMOVDstore_0(v) 152 case OpARMMOVFload: 153 return rewriteValueARM_OpARMMOVFload_0(v) 154 case OpARMMOVFstore: 155 return rewriteValueARM_OpARMMOVFstore_0(v) 156 case OpARMMOVHUload: 157 return rewriteValueARM_OpARMMOVHUload_0(v) 158 case OpARMMOVHUreg: 159 return rewriteValueARM_OpARMMOVHUreg_0(v) 160 case OpARMMOVHload: 161 return rewriteValueARM_OpARMMOVHload_0(v) 162 case OpARMMOVHreg: 163 return rewriteValueARM_OpARMMOVHreg_0(v) 164 case OpARMMOVHstore: 165 return rewriteValueARM_OpARMMOVHstore_0(v) 166 case OpARMMOVWload: 167 return rewriteValueARM_OpARMMOVWload_0(v) 168 case OpARMMOVWloadidx: 169 return rewriteValueARM_OpARMMOVWloadidx_0(v) 170 case OpARMMOVWloadshiftLL: 171 return rewriteValueARM_OpARMMOVWloadshiftLL_0(v) 172 case OpARMMOVWloadshiftRA: 173 return rewriteValueARM_OpARMMOVWloadshiftRA_0(v) 174 case OpARMMOVWloadshiftRL: 175 return rewriteValueARM_OpARMMOVWloadshiftRL_0(v) 176 case OpARMMOVWreg: 177 return rewriteValueARM_OpARMMOVWreg_0(v) 178 case OpARMMOVWstore: 179 return rewriteValueARM_OpARMMOVWstore_0(v) 180 case OpARMMOVWstoreidx: 181 return rewriteValueARM_OpARMMOVWstoreidx_0(v) 182 case OpARMMOVWstoreshiftLL: 183 return rewriteValueARM_OpARMMOVWstoreshiftLL_0(v) 184 case OpARMMOVWstoreshiftRA: 185 return rewriteValueARM_OpARMMOVWstoreshiftRA_0(v) 186 case OpARMMOVWstoreshiftRL: 187 return rewriteValueARM_OpARMMOVWstoreshiftRL_0(v) 188 case OpARMMUL: 189 return rewriteValueARM_OpARMMUL_0(v) || rewriteValueARM_OpARMMUL_10(v) || rewriteValueARM_OpARMMUL_20(v) 190 case OpARMMULA: 191 return rewriteValueARM_OpARMMULA_0(v) || rewriteValueARM_OpARMMULA_10(v) || rewriteValueARM_OpARMMULA_20(v) 192 case OpARMMVN: 193 return rewriteValueARM_OpARMMVN_0(v) 194 case OpARMMVNshiftLL: 195 return rewriteValueARM_OpARMMVNshiftLL_0(v) 196 case OpARMMVNshiftLLreg: 197 return rewriteValueARM_OpARMMVNshiftLLreg_0(v) 198 case OpARMMVNshiftRA: 199 return rewriteValueARM_OpARMMVNshiftRA_0(v) 200 case OpARMMVNshiftRAreg: 201 return rewriteValueARM_OpARMMVNshiftRAreg_0(v) 202 case OpARMMVNshiftRL: 203 return rewriteValueARM_OpARMMVNshiftRL_0(v) 204 case OpARMMVNshiftRLreg: 205 return rewriteValueARM_OpARMMVNshiftRLreg_0(v) 206 case OpARMNotEqual: 207 return rewriteValueARM_OpARMNotEqual_0(v) 208 case OpARMOR: 209 return rewriteValueARM_OpARMOR_0(v) || rewriteValueARM_OpARMOR_10(v) 210 case OpARMORconst: 211 return rewriteValueARM_OpARMORconst_0(v) 212 case OpARMORshiftLL: 213 return rewriteValueARM_OpARMORshiftLL_0(v) 214 case OpARMORshiftLLreg: 215 return rewriteValueARM_OpARMORshiftLLreg_0(v) 216 case OpARMORshiftRA: 217 return rewriteValueARM_OpARMORshiftRA_0(v) 218 case OpARMORshiftRAreg: 219 return rewriteValueARM_OpARMORshiftRAreg_0(v) 220 case OpARMORshiftRL: 221 return rewriteValueARM_OpARMORshiftRL_0(v) 222 case OpARMORshiftRLreg: 223 return rewriteValueARM_OpARMORshiftRLreg_0(v) 224 case OpARMRSB: 225 return rewriteValueARM_OpARMRSB_0(v) || rewriteValueARM_OpARMRSB_10(v) 226 case OpARMRSBSshiftLL: 227 return rewriteValueARM_OpARMRSBSshiftLL_0(v) 228 case OpARMRSBSshiftLLreg: 229 return rewriteValueARM_OpARMRSBSshiftLLreg_0(v) 230 case OpARMRSBSshiftRA: 231 return rewriteValueARM_OpARMRSBSshiftRA_0(v) 232 case OpARMRSBSshiftRAreg: 233 return rewriteValueARM_OpARMRSBSshiftRAreg_0(v) 234 case OpARMRSBSshiftRL: 235 return rewriteValueARM_OpARMRSBSshiftRL_0(v) 236 case OpARMRSBSshiftRLreg: 237 return rewriteValueARM_OpARMRSBSshiftRLreg_0(v) 238 case OpARMRSBconst: 239 return rewriteValueARM_OpARMRSBconst_0(v) 240 case OpARMRSBshiftLL: 241 return rewriteValueARM_OpARMRSBshiftLL_0(v) 242 case OpARMRSBshiftLLreg: 243 return rewriteValueARM_OpARMRSBshiftLLreg_0(v) 244 case OpARMRSBshiftRA: 245 return rewriteValueARM_OpARMRSBshiftRA_0(v) 246 case OpARMRSBshiftRAreg: 247 return rewriteValueARM_OpARMRSBshiftRAreg_0(v) 248 case OpARMRSBshiftRL: 249 return rewriteValueARM_OpARMRSBshiftRL_0(v) 250 case OpARMRSBshiftRLreg: 251 return rewriteValueARM_OpARMRSBshiftRLreg_0(v) 252 case OpARMRSCconst: 253 return rewriteValueARM_OpARMRSCconst_0(v) 254 case OpARMRSCshiftLL: 255 return rewriteValueARM_OpARMRSCshiftLL_0(v) 256 case OpARMRSCshiftLLreg: 257 return rewriteValueARM_OpARMRSCshiftLLreg_0(v) 258 case OpARMRSCshiftRA: 259 return rewriteValueARM_OpARMRSCshiftRA_0(v) 260 case OpARMRSCshiftRAreg: 261 return rewriteValueARM_OpARMRSCshiftRAreg_0(v) 262 case OpARMRSCshiftRL: 263 return rewriteValueARM_OpARMRSCshiftRL_0(v) 264 case OpARMRSCshiftRLreg: 265 return rewriteValueARM_OpARMRSCshiftRLreg_0(v) 266 case OpARMSBC: 267 return rewriteValueARM_OpARMSBC_0(v) || rewriteValueARM_OpARMSBC_10(v) 268 case OpARMSBCconst: 269 return rewriteValueARM_OpARMSBCconst_0(v) 270 case OpARMSBCshiftLL: 271 return rewriteValueARM_OpARMSBCshiftLL_0(v) 272 case OpARMSBCshiftLLreg: 273 return rewriteValueARM_OpARMSBCshiftLLreg_0(v) 274 case OpARMSBCshiftRA: 275 return rewriteValueARM_OpARMSBCshiftRA_0(v) 276 case OpARMSBCshiftRAreg: 277 return rewriteValueARM_OpARMSBCshiftRAreg_0(v) 278 case OpARMSBCshiftRL: 279 return rewriteValueARM_OpARMSBCshiftRL_0(v) 280 case OpARMSBCshiftRLreg: 281 return rewriteValueARM_OpARMSBCshiftRLreg_0(v) 282 case OpARMSLL: 283 return rewriteValueARM_OpARMSLL_0(v) 284 case OpARMSLLconst: 285 return rewriteValueARM_OpARMSLLconst_0(v) 286 case OpARMSRA: 287 return rewriteValueARM_OpARMSRA_0(v) 288 case OpARMSRAcond: 289 return rewriteValueARM_OpARMSRAcond_0(v) 290 case OpARMSRAconst: 291 return rewriteValueARM_OpARMSRAconst_0(v) 292 case OpARMSRL: 293 return rewriteValueARM_OpARMSRL_0(v) 294 case OpARMSRLconst: 295 return rewriteValueARM_OpARMSRLconst_0(v) 296 case OpARMSUB: 297 return rewriteValueARM_OpARMSUB_0(v) || rewriteValueARM_OpARMSUB_10(v) 298 case OpARMSUBS: 299 return rewriteValueARM_OpARMSUBS_0(v) || rewriteValueARM_OpARMSUBS_10(v) 300 case OpARMSUBSshiftLL: 301 return rewriteValueARM_OpARMSUBSshiftLL_0(v) 302 case OpARMSUBSshiftLLreg: 303 return rewriteValueARM_OpARMSUBSshiftLLreg_0(v) 304 case OpARMSUBSshiftRA: 305 return rewriteValueARM_OpARMSUBSshiftRA_0(v) 306 case OpARMSUBSshiftRAreg: 307 return rewriteValueARM_OpARMSUBSshiftRAreg_0(v) 308 case OpARMSUBSshiftRL: 309 return rewriteValueARM_OpARMSUBSshiftRL_0(v) 310 case OpARMSUBSshiftRLreg: 311 return rewriteValueARM_OpARMSUBSshiftRLreg_0(v) 312 case OpARMSUBconst: 313 return rewriteValueARM_OpARMSUBconst_0(v) 314 case OpARMSUBshiftLL: 315 return rewriteValueARM_OpARMSUBshiftLL_0(v) 316 case OpARMSUBshiftLLreg: 317 return rewriteValueARM_OpARMSUBshiftLLreg_0(v) 318 case OpARMSUBshiftRA: 319 return rewriteValueARM_OpARMSUBshiftRA_0(v) 320 case OpARMSUBshiftRAreg: 321 return rewriteValueARM_OpARMSUBshiftRAreg_0(v) 322 case OpARMSUBshiftRL: 323 return rewriteValueARM_OpARMSUBshiftRL_0(v) 324 case OpARMSUBshiftRLreg: 325 return rewriteValueARM_OpARMSUBshiftRLreg_0(v) 326 case OpARMXOR: 327 return rewriteValueARM_OpARMXOR_0(v) || rewriteValueARM_OpARMXOR_10(v) 328 case OpARMXORconst: 329 return rewriteValueARM_OpARMXORconst_0(v) 330 case OpARMXORshiftLL: 331 return rewriteValueARM_OpARMXORshiftLL_0(v) 332 case OpARMXORshiftLLreg: 333 return rewriteValueARM_OpARMXORshiftLLreg_0(v) 334 case OpARMXORshiftRA: 335 return rewriteValueARM_OpARMXORshiftRA_0(v) 336 case OpARMXORshiftRAreg: 337 return rewriteValueARM_OpARMXORshiftRAreg_0(v) 338 case OpARMXORshiftRL: 339 return rewriteValueARM_OpARMXORshiftRL_0(v) 340 case OpARMXORshiftRLreg: 341 return rewriteValueARM_OpARMXORshiftRLreg_0(v) 342 case OpARMXORshiftRR: 343 return rewriteValueARM_OpARMXORshiftRR_0(v) 344 case OpAdd16: 345 return rewriteValueARM_OpAdd16_0(v) 346 case OpAdd32: 347 return rewriteValueARM_OpAdd32_0(v) 348 case OpAdd32F: 349 return rewriteValueARM_OpAdd32F_0(v) 350 case OpAdd32carry: 351 return rewriteValueARM_OpAdd32carry_0(v) 352 case OpAdd32withcarry: 353 return rewriteValueARM_OpAdd32withcarry_0(v) 354 case OpAdd64F: 355 return rewriteValueARM_OpAdd64F_0(v) 356 case OpAdd8: 357 return rewriteValueARM_OpAdd8_0(v) 358 case OpAddPtr: 359 return rewriteValueARM_OpAddPtr_0(v) 360 case OpAddr: 361 return rewriteValueARM_OpAddr_0(v) 362 case OpAnd16: 363 return rewriteValueARM_OpAnd16_0(v) 364 case OpAnd32: 365 return rewriteValueARM_OpAnd32_0(v) 366 case OpAnd8: 367 return rewriteValueARM_OpAnd8_0(v) 368 case OpAndB: 369 return rewriteValueARM_OpAndB_0(v) 370 case OpAvg32u: 371 return rewriteValueARM_OpAvg32u_0(v) 372 case OpBitLen32: 373 return rewriteValueARM_OpBitLen32_0(v) 374 case OpBswap32: 375 return rewriteValueARM_OpBswap32_0(v) 376 case OpClosureCall: 377 return rewriteValueARM_OpClosureCall_0(v) 378 case OpCom16: 379 return rewriteValueARM_OpCom16_0(v) 380 case OpCom32: 381 return rewriteValueARM_OpCom32_0(v) 382 case OpCom8: 383 return rewriteValueARM_OpCom8_0(v) 384 case OpConst16: 385 return rewriteValueARM_OpConst16_0(v) 386 case OpConst32: 387 return rewriteValueARM_OpConst32_0(v) 388 case OpConst32F: 389 return rewriteValueARM_OpConst32F_0(v) 390 case OpConst64F: 391 return rewriteValueARM_OpConst64F_0(v) 392 case OpConst8: 393 return rewriteValueARM_OpConst8_0(v) 394 case OpConstBool: 395 return rewriteValueARM_OpConstBool_0(v) 396 case OpConstNil: 397 return rewriteValueARM_OpConstNil_0(v) 398 case OpConvert: 399 return rewriteValueARM_OpConvert_0(v) 400 case OpCtz32: 401 return rewriteValueARM_OpCtz32_0(v) 402 case OpCvt32Fto32: 403 return rewriteValueARM_OpCvt32Fto32_0(v) 404 case OpCvt32Fto32U: 405 return rewriteValueARM_OpCvt32Fto32U_0(v) 406 case OpCvt32Fto64F: 407 return rewriteValueARM_OpCvt32Fto64F_0(v) 408 case OpCvt32Uto32F: 409 return rewriteValueARM_OpCvt32Uto32F_0(v) 410 case OpCvt32Uto64F: 411 return rewriteValueARM_OpCvt32Uto64F_0(v) 412 case OpCvt32to32F: 413 return rewriteValueARM_OpCvt32to32F_0(v) 414 case OpCvt32to64F: 415 return rewriteValueARM_OpCvt32to64F_0(v) 416 case OpCvt64Fto32: 417 return rewriteValueARM_OpCvt64Fto32_0(v) 418 case OpCvt64Fto32F: 419 return rewriteValueARM_OpCvt64Fto32F_0(v) 420 case OpCvt64Fto32U: 421 return rewriteValueARM_OpCvt64Fto32U_0(v) 422 case OpDiv16: 423 return rewriteValueARM_OpDiv16_0(v) 424 case OpDiv16u: 425 return rewriteValueARM_OpDiv16u_0(v) 426 case OpDiv32: 427 return rewriteValueARM_OpDiv32_0(v) 428 case OpDiv32F: 429 return rewriteValueARM_OpDiv32F_0(v) 430 case OpDiv32u: 431 return rewriteValueARM_OpDiv32u_0(v) 432 case OpDiv64F: 433 return rewriteValueARM_OpDiv64F_0(v) 434 case OpDiv8: 435 return rewriteValueARM_OpDiv8_0(v) 436 case OpDiv8u: 437 return rewriteValueARM_OpDiv8u_0(v) 438 case OpEq16: 439 return rewriteValueARM_OpEq16_0(v) 440 case OpEq32: 441 return rewriteValueARM_OpEq32_0(v) 442 case OpEq32F: 443 return rewriteValueARM_OpEq32F_0(v) 444 case OpEq64F: 445 return rewriteValueARM_OpEq64F_0(v) 446 case OpEq8: 447 return rewriteValueARM_OpEq8_0(v) 448 case OpEqB: 449 return rewriteValueARM_OpEqB_0(v) 450 case OpEqPtr: 451 return rewriteValueARM_OpEqPtr_0(v) 452 case OpGeq16: 453 return rewriteValueARM_OpGeq16_0(v) 454 case OpGeq16U: 455 return rewriteValueARM_OpGeq16U_0(v) 456 case OpGeq32: 457 return rewriteValueARM_OpGeq32_0(v) 458 case OpGeq32F: 459 return rewriteValueARM_OpGeq32F_0(v) 460 case OpGeq32U: 461 return rewriteValueARM_OpGeq32U_0(v) 462 case OpGeq64F: 463 return rewriteValueARM_OpGeq64F_0(v) 464 case OpGeq8: 465 return rewriteValueARM_OpGeq8_0(v) 466 case OpGeq8U: 467 return rewriteValueARM_OpGeq8U_0(v) 468 case OpGetClosurePtr: 469 return rewriteValueARM_OpGetClosurePtr_0(v) 470 case OpGreater16: 471 return rewriteValueARM_OpGreater16_0(v) 472 case OpGreater16U: 473 return rewriteValueARM_OpGreater16U_0(v) 474 case OpGreater32: 475 return rewriteValueARM_OpGreater32_0(v) 476 case OpGreater32F: 477 return rewriteValueARM_OpGreater32F_0(v) 478 case OpGreater32U: 479 return rewriteValueARM_OpGreater32U_0(v) 480 case OpGreater64F: 481 return rewriteValueARM_OpGreater64F_0(v) 482 case OpGreater8: 483 return rewriteValueARM_OpGreater8_0(v) 484 case OpGreater8U: 485 return rewriteValueARM_OpGreater8U_0(v) 486 case OpHmul32: 487 return rewriteValueARM_OpHmul32_0(v) 488 case OpHmul32u: 489 return rewriteValueARM_OpHmul32u_0(v) 490 case OpInterCall: 491 return rewriteValueARM_OpInterCall_0(v) 492 case OpIsInBounds: 493 return rewriteValueARM_OpIsInBounds_0(v) 494 case OpIsNonNil: 495 return rewriteValueARM_OpIsNonNil_0(v) 496 case OpIsSliceInBounds: 497 return rewriteValueARM_OpIsSliceInBounds_0(v) 498 case OpLeq16: 499 return rewriteValueARM_OpLeq16_0(v) 500 case OpLeq16U: 501 return rewriteValueARM_OpLeq16U_0(v) 502 case OpLeq32: 503 return rewriteValueARM_OpLeq32_0(v) 504 case OpLeq32F: 505 return rewriteValueARM_OpLeq32F_0(v) 506 case OpLeq32U: 507 return rewriteValueARM_OpLeq32U_0(v) 508 case OpLeq64F: 509 return rewriteValueARM_OpLeq64F_0(v) 510 case OpLeq8: 511 return rewriteValueARM_OpLeq8_0(v) 512 case OpLeq8U: 513 return rewriteValueARM_OpLeq8U_0(v) 514 case OpLess16: 515 return rewriteValueARM_OpLess16_0(v) 516 case OpLess16U: 517 return rewriteValueARM_OpLess16U_0(v) 518 case OpLess32: 519 return rewriteValueARM_OpLess32_0(v) 520 case OpLess32F: 521 return rewriteValueARM_OpLess32F_0(v) 522 case OpLess32U: 523 return rewriteValueARM_OpLess32U_0(v) 524 case OpLess64F: 525 return rewriteValueARM_OpLess64F_0(v) 526 case OpLess8: 527 return rewriteValueARM_OpLess8_0(v) 528 case OpLess8U: 529 return rewriteValueARM_OpLess8U_0(v) 530 case OpLoad: 531 return rewriteValueARM_OpLoad_0(v) 532 case OpLsh16x16: 533 return rewriteValueARM_OpLsh16x16_0(v) 534 case OpLsh16x32: 535 return rewriteValueARM_OpLsh16x32_0(v) 536 case OpLsh16x64: 537 return rewriteValueARM_OpLsh16x64_0(v) 538 case OpLsh16x8: 539 return rewriteValueARM_OpLsh16x8_0(v) 540 case OpLsh32x16: 541 return rewriteValueARM_OpLsh32x16_0(v) 542 case OpLsh32x32: 543 return rewriteValueARM_OpLsh32x32_0(v) 544 case OpLsh32x64: 545 return rewriteValueARM_OpLsh32x64_0(v) 546 case OpLsh32x8: 547 return rewriteValueARM_OpLsh32x8_0(v) 548 case OpLsh8x16: 549 return rewriteValueARM_OpLsh8x16_0(v) 550 case OpLsh8x32: 551 return rewriteValueARM_OpLsh8x32_0(v) 552 case OpLsh8x64: 553 return rewriteValueARM_OpLsh8x64_0(v) 554 case OpLsh8x8: 555 return rewriteValueARM_OpLsh8x8_0(v) 556 case OpMod16: 557 return rewriteValueARM_OpMod16_0(v) 558 case OpMod16u: 559 return rewriteValueARM_OpMod16u_0(v) 560 case OpMod32: 561 return rewriteValueARM_OpMod32_0(v) 562 case OpMod32u: 563 return rewriteValueARM_OpMod32u_0(v) 564 case OpMod8: 565 return rewriteValueARM_OpMod8_0(v) 566 case OpMod8u: 567 return rewriteValueARM_OpMod8u_0(v) 568 case OpMove: 569 return rewriteValueARM_OpMove_0(v) 570 case OpMul16: 571 return rewriteValueARM_OpMul16_0(v) 572 case OpMul32: 573 return rewriteValueARM_OpMul32_0(v) 574 case OpMul32F: 575 return rewriteValueARM_OpMul32F_0(v) 576 case OpMul32uhilo: 577 return rewriteValueARM_OpMul32uhilo_0(v) 578 case OpMul64F: 579 return rewriteValueARM_OpMul64F_0(v) 580 case OpMul8: 581 return rewriteValueARM_OpMul8_0(v) 582 case OpNeg16: 583 return rewriteValueARM_OpNeg16_0(v) 584 case OpNeg32: 585 return rewriteValueARM_OpNeg32_0(v) 586 case OpNeg32F: 587 return rewriteValueARM_OpNeg32F_0(v) 588 case OpNeg64F: 589 return rewriteValueARM_OpNeg64F_0(v) 590 case OpNeg8: 591 return rewriteValueARM_OpNeg8_0(v) 592 case OpNeq16: 593 return rewriteValueARM_OpNeq16_0(v) 594 case OpNeq32: 595 return rewriteValueARM_OpNeq32_0(v) 596 case OpNeq32F: 597 return rewriteValueARM_OpNeq32F_0(v) 598 case OpNeq64F: 599 return rewriteValueARM_OpNeq64F_0(v) 600 case OpNeq8: 601 return rewriteValueARM_OpNeq8_0(v) 602 case OpNeqB: 603 return rewriteValueARM_OpNeqB_0(v) 604 case OpNeqPtr: 605 return rewriteValueARM_OpNeqPtr_0(v) 606 case OpNilCheck: 607 return rewriteValueARM_OpNilCheck_0(v) 608 case OpNot: 609 return rewriteValueARM_OpNot_0(v) 610 case OpOffPtr: 611 return rewriteValueARM_OpOffPtr_0(v) 612 case OpOr16: 613 return rewriteValueARM_OpOr16_0(v) 614 case OpOr32: 615 return rewriteValueARM_OpOr32_0(v) 616 case OpOr8: 617 return rewriteValueARM_OpOr8_0(v) 618 case OpOrB: 619 return rewriteValueARM_OpOrB_0(v) 620 case OpRound32F: 621 return rewriteValueARM_OpRound32F_0(v) 622 case OpRound64F: 623 return rewriteValueARM_OpRound64F_0(v) 624 case OpRsh16Ux16: 625 return rewriteValueARM_OpRsh16Ux16_0(v) 626 case OpRsh16Ux32: 627 return rewriteValueARM_OpRsh16Ux32_0(v) 628 case OpRsh16Ux64: 629 return rewriteValueARM_OpRsh16Ux64_0(v) 630 case OpRsh16Ux8: 631 return rewriteValueARM_OpRsh16Ux8_0(v) 632 case OpRsh16x16: 633 return rewriteValueARM_OpRsh16x16_0(v) 634 case OpRsh16x32: 635 return rewriteValueARM_OpRsh16x32_0(v) 636 case OpRsh16x64: 637 return rewriteValueARM_OpRsh16x64_0(v) 638 case OpRsh16x8: 639 return rewriteValueARM_OpRsh16x8_0(v) 640 case OpRsh32Ux16: 641 return rewriteValueARM_OpRsh32Ux16_0(v) 642 case OpRsh32Ux32: 643 return rewriteValueARM_OpRsh32Ux32_0(v) 644 case OpRsh32Ux64: 645 return rewriteValueARM_OpRsh32Ux64_0(v) 646 case OpRsh32Ux8: 647 return rewriteValueARM_OpRsh32Ux8_0(v) 648 case OpRsh32x16: 649 return rewriteValueARM_OpRsh32x16_0(v) 650 case OpRsh32x32: 651 return rewriteValueARM_OpRsh32x32_0(v) 652 case OpRsh32x64: 653 return rewriteValueARM_OpRsh32x64_0(v) 654 case OpRsh32x8: 655 return rewriteValueARM_OpRsh32x8_0(v) 656 case OpRsh8Ux16: 657 return rewriteValueARM_OpRsh8Ux16_0(v) 658 case OpRsh8Ux32: 659 return rewriteValueARM_OpRsh8Ux32_0(v) 660 case OpRsh8Ux64: 661 return rewriteValueARM_OpRsh8Ux64_0(v) 662 case OpRsh8Ux8: 663 return rewriteValueARM_OpRsh8Ux8_0(v) 664 case OpRsh8x16: 665 return rewriteValueARM_OpRsh8x16_0(v) 666 case OpRsh8x32: 667 return rewriteValueARM_OpRsh8x32_0(v) 668 case OpRsh8x64: 669 return rewriteValueARM_OpRsh8x64_0(v) 670 case OpRsh8x8: 671 return rewriteValueARM_OpRsh8x8_0(v) 672 case OpSelect0: 673 return rewriteValueARM_OpSelect0_0(v) 674 case OpSelect1: 675 return rewriteValueARM_OpSelect1_0(v) 676 case OpSignExt16to32: 677 return rewriteValueARM_OpSignExt16to32_0(v) 678 case OpSignExt8to16: 679 return rewriteValueARM_OpSignExt8to16_0(v) 680 case OpSignExt8to32: 681 return rewriteValueARM_OpSignExt8to32_0(v) 682 case OpSignmask: 683 return rewriteValueARM_OpSignmask_0(v) 684 case OpSlicemask: 685 return rewriteValueARM_OpSlicemask_0(v) 686 case OpSqrt: 687 return rewriteValueARM_OpSqrt_0(v) 688 case OpStaticCall: 689 return rewriteValueARM_OpStaticCall_0(v) 690 case OpStore: 691 return rewriteValueARM_OpStore_0(v) 692 case OpSub16: 693 return rewriteValueARM_OpSub16_0(v) 694 case OpSub32: 695 return rewriteValueARM_OpSub32_0(v) 696 case OpSub32F: 697 return rewriteValueARM_OpSub32F_0(v) 698 case OpSub32carry: 699 return rewriteValueARM_OpSub32carry_0(v) 700 case OpSub32withcarry: 701 return rewriteValueARM_OpSub32withcarry_0(v) 702 case OpSub64F: 703 return rewriteValueARM_OpSub64F_0(v) 704 case OpSub8: 705 return rewriteValueARM_OpSub8_0(v) 706 case OpSubPtr: 707 return rewriteValueARM_OpSubPtr_0(v) 708 case OpTrunc16to8: 709 return rewriteValueARM_OpTrunc16to8_0(v) 710 case OpTrunc32to16: 711 return rewriteValueARM_OpTrunc32to16_0(v) 712 case OpTrunc32to8: 713 return rewriteValueARM_OpTrunc32to8_0(v) 714 case OpXor16: 715 return rewriteValueARM_OpXor16_0(v) 716 case OpXor32: 717 return rewriteValueARM_OpXor32_0(v) 718 case OpXor8: 719 return rewriteValueARM_OpXor8_0(v) 720 case OpZero: 721 return rewriteValueARM_OpZero_0(v) 722 case OpZeroExt16to32: 723 return rewriteValueARM_OpZeroExt16to32_0(v) 724 case OpZeroExt8to16: 725 return rewriteValueARM_OpZeroExt8to16_0(v) 726 case OpZeroExt8to32: 727 return rewriteValueARM_OpZeroExt8to32_0(v) 728 case OpZeromask: 729 return rewriteValueARM_OpZeromask_0(v) 730 } 731 return false 732 } 733 func rewriteValueARM_OpARMADC_0(v *Value) bool { 734 // match: (ADC (MOVWconst [c]) x flags) 735 // cond: 736 // result: (ADCconst [c] x flags) 737 for { 738 _ = v.Args[2] 739 v_0 := v.Args[0] 740 if v_0.Op != OpARMMOVWconst { 741 break 742 } 743 c := v_0.AuxInt 744 x := v.Args[1] 745 flags := v.Args[2] 746 v.reset(OpARMADCconst) 747 v.AuxInt = c 748 v.AddArg(x) 749 v.AddArg(flags) 750 return true 751 } 752 // match: (ADC x (MOVWconst [c]) flags) 753 // cond: 754 // result: (ADCconst [c] x flags) 755 for { 756 _ = v.Args[2] 757 x := v.Args[0] 758 v_1 := v.Args[1] 759 if v_1.Op != OpARMMOVWconst { 760 break 761 } 762 c := v_1.AuxInt 763 flags := v.Args[2] 764 v.reset(OpARMADCconst) 765 v.AuxInt = c 766 v.AddArg(x) 767 v.AddArg(flags) 768 return true 769 } 770 // match: (ADC x (MOVWconst [c]) flags) 771 // cond: 772 // result: (ADCconst [c] x flags) 773 for { 774 _ = v.Args[2] 775 x := v.Args[0] 776 v_1 := v.Args[1] 777 if v_1.Op != OpARMMOVWconst { 778 break 779 } 780 c := v_1.AuxInt 781 flags := v.Args[2] 782 v.reset(OpARMADCconst) 783 v.AuxInt = c 784 v.AddArg(x) 785 v.AddArg(flags) 786 return true 787 } 788 // match: (ADC (MOVWconst [c]) x flags) 789 // cond: 790 // result: (ADCconst [c] x flags) 791 for { 792 _ = v.Args[2] 793 v_0 := v.Args[0] 794 if v_0.Op != OpARMMOVWconst { 795 break 796 } 797 c := v_0.AuxInt 798 x := v.Args[1] 799 flags := v.Args[2] 800 v.reset(OpARMADCconst) 801 v.AuxInt = c 802 v.AddArg(x) 803 v.AddArg(flags) 804 return true 805 } 806 // match: (ADC x (SLLconst [c] y) flags) 807 // cond: 808 // result: (ADCshiftLL x y [c] flags) 809 for { 810 _ = v.Args[2] 811 x := v.Args[0] 812 v_1 := v.Args[1] 813 if v_1.Op != OpARMSLLconst { 814 break 815 } 816 c := v_1.AuxInt 817 y := v_1.Args[0] 818 flags := v.Args[2] 819 v.reset(OpARMADCshiftLL) 820 v.AuxInt = c 821 v.AddArg(x) 822 v.AddArg(y) 823 v.AddArg(flags) 824 return true 825 } 826 // match: (ADC (SLLconst [c] y) x flags) 827 // cond: 828 // result: (ADCshiftLL x y [c] flags) 829 for { 830 _ = v.Args[2] 831 v_0 := v.Args[0] 832 if v_0.Op != OpARMSLLconst { 833 break 834 } 835 c := v_0.AuxInt 836 y := v_0.Args[0] 837 x := v.Args[1] 838 flags := v.Args[2] 839 v.reset(OpARMADCshiftLL) 840 v.AuxInt = c 841 v.AddArg(x) 842 v.AddArg(y) 843 v.AddArg(flags) 844 return true 845 } 846 // match: (ADC (SLLconst [c] y) x flags) 847 // cond: 848 // result: (ADCshiftLL x y [c] flags) 849 for { 850 _ = v.Args[2] 851 v_0 := v.Args[0] 852 if v_0.Op != OpARMSLLconst { 853 break 854 } 855 c := v_0.AuxInt 856 y := v_0.Args[0] 857 x := v.Args[1] 858 flags := v.Args[2] 859 v.reset(OpARMADCshiftLL) 860 v.AuxInt = c 861 v.AddArg(x) 862 v.AddArg(y) 863 v.AddArg(flags) 864 return true 865 } 866 // match: (ADC x (SLLconst [c] y) flags) 867 // cond: 868 // result: (ADCshiftLL x y [c] flags) 869 for { 870 _ = v.Args[2] 871 x := v.Args[0] 872 v_1 := v.Args[1] 873 if v_1.Op != OpARMSLLconst { 874 break 875 } 876 c := v_1.AuxInt 877 y := v_1.Args[0] 878 flags := v.Args[2] 879 v.reset(OpARMADCshiftLL) 880 v.AuxInt = c 881 v.AddArg(x) 882 v.AddArg(y) 883 v.AddArg(flags) 884 return true 885 } 886 // match: (ADC x (SRLconst [c] y) flags) 887 // cond: 888 // result: (ADCshiftRL x y [c] flags) 889 for { 890 _ = v.Args[2] 891 x := v.Args[0] 892 v_1 := v.Args[1] 893 if v_1.Op != OpARMSRLconst { 894 break 895 } 896 c := v_1.AuxInt 897 y := v_1.Args[0] 898 flags := v.Args[2] 899 v.reset(OpARMADCshiftRL) 900 v.AuxInt = c 901 v.AddArg(x) 902 v.AddArg(y) 903 v.AddArg(flags) 904 return true 905 } 906 // match: (ADC (SRLconst [c] y) x flags) 907 // cond: 908 // result: (ADCshiftRL x y [c] flags) 909 for { 910 _ = v.Args[2] 911 v_0 := v.Args[0] 912 if v_0.Op != OpARMSRLconst { 913 break 914 } 915 c := v_0.AuxInt 916 y := v_0.Args[0] 917 x := v.Args[1] 918 flags := v.Args[2] 919 v.reset(OpARMADCshiftRL) 920 v.AuxInt = c 921 v.AddArg(x) 922 v.AddArg(y) 923 v.AddArg(flags) 924 return true 925 } 926 return false 927 } 928 func rewriteValueARM_OpARMADC_10(v *Value) bool { 929 // match: (ADC (SRLconst [c] y) x flags) 930 // cond: 931 // result: (ADCshiftRL x y [c] flags) 932 for { 933 _ = v.Args[2] 934 v_0 := v.Args[0] 935 if v_0.Op != OpARMSRLconst { 936 break 937 } 938 c := v_0.AuxInt 939 y := v_0.Args[0] 940 x := v.Args[1] 941 flags := v.Args[2] 942 v.reset(OpARMADCshiftRL) 943 v.AuxInt = c 944 v.AddArg(x) 945 v.AddArg(y) 946 v.AddArg(flags) 947 return true 948 } 949 // match: (ADC x (SRLconst [c] y) flags) 950 // cond: 951 // result: (ADCshiftRL x y [c] flags) 952 for { 953 _ = v.Args[2] 954 x := v.Args[0] 955 v_1 := v.Args[1] 956 if v_1.Op != OpARMSRLconst { 957 break 958 } 959 c := v_1.AuxInt 960 y := v_1.Args[0] 961 flags := v.Args[2] 962 v.reset(OpARMADCshiftRL) 963 v.AuxInt = c 964 v.AddArg(x) 965 v.AddArg(y) 966 v.AddArg(flags) 967 return true 968 } 969 // match: (ADC x (SRAconst [c] y) flags) 970 // cond: 971 // result: (ADCshiftRA x y [c] flags) 972 for { 973 _ = v.Args[2] 974 x := v.Args[0] 975 v_1 := v.Args[1] 976 if v_1.Op != OpARMSRAconst { 977 break 978 } 979 c := v_1.AuxInt 980 y := v_1.Args[0] 981 flags := v.Args[2] 982 v.reset(OpARMADCshiftRA) 983 v.AuxInt = c 984 v.AddArg(x) 985 v.AddArg(y) 986 v.AddArg(flags) 987 return true 988 } 989 // match: (ADC (SRAconst [c] y) x flags) 990 // cond: 991 // result: (ADCshiftRA x y [c] flags) 992 for { 993 _ = v.Args[2] 994 v_0 := v.Args[0] 995 if v_0.Op != OpARMSRAconst { 996 break 997 } 998 c := v_0.AuxInt 999 y := v_0.Args[0] 1000 x := v.Args[1] 1001 flags := v.Args[2] 1002 v.reset(OpARMADCshiftRA) 1003 v.AuxInt = c 1004 v.AddArg(x) 1005 v.AddArg(y) 1006 v.AddArg(flags) 1007 return true 1008 } 1009 // match: (ADC (SRAconst [c] y) x flags) 1010 // cond: 1011 // result: (ADCshiftRA x y [c] flags) 1012 for { 1013 _ = v.Args[2] 1014 v_0 := v.Args[0] 1015 if v_0.Op != OpARMSRAconst { 1016 break 1017 } 1018 c := v_0.AuxInt 1019 y := v_0.Args[0] 1020 x := v.Args[1] 1021 flags := v.Args[2] 1022 v.reset(OpARMADCshiftRA) 1023 v.AuxInt = c 1024 v.AddArg(x) 1025 v.AddArg(y) 1026 v.AddArg(flags) 1027 return true 1028 } 1029 // match: (ADC x (SRAconst [c] y) flags) 1030 // cond: 1031 // result: (ADCshiftRA x y [c] flags) 1032 for { 1033 _ = v.Args[2] 1034 x := v.Args[0] 1035 v_1 := v.Args[1] 1036 if v_1.Op != OpARMSRAconst { 1037 break 1038 } 1039 c := v_1.AuxInt 1040 y := v_1.Args[0] 1041 flags := v.Args[2] 1042 v.reset(OpARMADCshiftRA) 1043 v.AuxInt = c 1044 v.AddArg(x) 1045 v.AddArg(y) 1046 v.AddArg(flags) 1047 return true 1048 } 1049 // match: (ADC x (SLL y z) flags) 1050 // cond: 1051 // result: (ADCshiftLLreg x y z flags) 1052 for { 1053 _ = v.Args[2] 1054 x := v.Args[0] 1055 v_1 := v.Args[1] 1056 if v_1.Op != OpARMSLL { 1057 break 1058 } 1059 _ = v_1.Args[1] 1060 y := v_1.Args[0] 1061 z := v_1.Args[1] 1062 flags := v.Args[2] 1063 v.reset(OpARMADCshiftLLreg) 1064 v.AddArg(x) 1065 v.AddArg(y) 1066 v.AddArg(z) 1067 v.AddArg(flags) 1068 return true 1069 } 1070 // match: (ADC (SLL y z) x flags) 1071 // cond: 1072 // result: (ADCshiftLLreg x y z flags) 1073 for { 1074 _ = v.Args[2] 1075 v_0 := v.Args[0] 1076 if v_0.Op != OpARMSLL { 1077 break 1078 } 1079 _ = v_0.Args[1] 1080 y := v_0.Args[0] 1081 z := v_0.Args[1] 1082 x := v.Args[1] 1083 flags := v.Args[2] 1084 v.reset(OpARMADCshiftLLreg) 1085 v.AddArg(x) 1086 v.AddArg(y) 1087 v.AddArg(z) 1088 v.AddArg(flags) 1089 return true 1090 } 1091 // match: (ADC (SLL y z) x flags) 1092 // cond: 1093 // result: (ADCshiftLLreg x y z flags) 1094 for { 1095 _ = v.Args[2] 1096 v_0 := v.Args[0] 1097 if v_0.Op != OpARMSLL { 1098 break 1099 } 1100 _ = v_0.Args[1] 1101 y := v_0.Args[0] 1102 z := v_0.Args[1] 1103 x := v.Args[1] 1104 flags := v.Args[2] 1105 v.reset(OpARMADCshiftLLreg) 1106 v.AddArg(x) 1107 v.AddArg(y) 1108 v.AddArg(z) 1109 v.AddArg(flags) 1110 return true 1111 } 1112 // match: (ADC x (SLL y z) flags) 1113 // cond: 1114 // result: (ADCshiftLLreg x y z flags) 1115 for { 1116 _ = v.Args[2] 1117 x := v.Args[0] 1118 v_1 := v.Args[1] 1119 if v_1.Op != OpARMSLL { 1120 break 1121 } 1122 _ = v_1.Args[1] 1123 y := v_1.Args[0] 1124 z := v_1.Args[1] 1125 flags := v.Args[2] 1126 v.reset(OpARMADCshiftLLreg) 1127 v.AddArg(x) 1128 v.AddArg(y) 1129 v.AddArg(z) 1130 v.AddArg(flags) 1131 return true 1132 } 1133 return false 1134 } 1135 func rewriteValueARM_OpARMADC_20(v *Value) bool { 1136 // match: (ADC x (SRL y z) flags) 1137 // cond: 1138 // result: (ADCshiftRLreg x y z flags) 1139 for { 1140 _ = v.Args[2] 1141 x := v.Args[0] 1142 v_1 := v.Args[1] 1143 if v_1.Op != OpARMSRL { 1144 break 1145 } 1146 _ = v_1.Args[1] 1147 y := v_1.Args[0] 1148 z := v_1.Args[1] 1149 flags := v.Args[2] 1150 v.reset(OpARMADCshiftRLreg) 1151 v.AddArg(x) 1152 v.AddArg(y) 1153 v.AddArg(z) 1154 v.AddArg(flags) 1155 return true 1156 } 1157 // match: (ADC (SRL y z) x flags) 1158 // cond: 1159 // result: (ADCshiftRLreg x y z flags) 1160 for { 1161 _ = v.Args[2] 1162 v_0 := v.Args[0] 1163 if v_0.Op != OpARMSRL { 1164 break 1165 } 1166 _ = v_0.Args[1] 1167 y := v_0.Args[0] 1168 z := v_0.Args[1] 1169 x := v.Args[1] 1170 flags := v.Args[2] 1171 v.reset(OpARMADCshiftRLreg) 1172 v.AddArg(x) 1173 v.AddArg(y) 1174 v.AddArg(z) 1175 v.AddArg(flags) 1176 return true 1177 } 1178 // match: (ADC (SRL y z) x flags) 1179 // cond: 1180 // result: (ADCshiftRLreg x y z flags) 1181 for { 1182 _ = v.Args[2] 1183 v_0 := v.Args[0] 1184 if v_0.Op != OpARMSRL { 1185 break 1186 } 1187 _ = v_0.Args[1] 1188 y := v_0.Args[0] 1189 z := v_0.Args[1] 1190 x := v.Args[1] 1191 flags := v.Args[2] 1192 v.reset(OpARMADCshiftRLreg) 1193 v.AddArg(x) 1194 v.AddArg(y) 1195 v.AddArg(z) 1196 v.AddArg(flags) 1197 return true 1198 } 1199 // match: (ADC x (SRL y z) flags) 1200 // cond: 1201 // result: (ADCshiftRLreg x y z flags) 1202 for { 1203 _ = v.Args[2] 1204 x := v.Args[0] 1205 v_1 := v.Args[1] 1206 if v_1.Op != OpARMSRL { 1207 break 1208 } 1209 _ = v_1.Args[1] 1210 y := v_1.Args[0] 1211 z := v_1.Args[1] 1212 flags := v.Args[2] 1213 v.reset(OpARMADCshiftRLreg) 1214 v.AddArg(x) 1215 v.AddArg(y) 1216 v.AddArg(z) 1217 v.AddArg(flags) 1218 return true 1219 } 1220 // match: (ADC x (SRA y z) flags) 1221 // cond: 1222 // result: (ADCshiftRAreg x y z flags) 1223 for { 1224 _ = v.Args[2] 1225 x := v.Args[0] 1226 v_1 := v.Args[1] 1227 if v_1.Op != OpARMSRA { 1228 break 1229 } 1230 _ = v_1.Args[1] 1231 y := v_1.Args[0] 1232 z := v_1.Args[1] 1233 flags := v.Args[2] 1234 v.reset(OpARMADCshiftRAreg) 1235 v.AddArg(x) 1236 v.AddArg(y) 1237 v.AddArg(z) 1238 v.AddArg(flags) 1239 return true 1240 } 1241 // match: (ADC (SRA y z) x flags) 1242 // cond: 1243 // result: (ADCshiftRAreg x y z flags) 1244 for { 1245 _ = v.Args[2] 1246 v_0 := v.Args[0] 1247 if v_0.Op != OpARMSRA { 1248 break 1249 } 1250 _ = v_0.Args[1] 1251 y := v_0.Args[0] 1252 z := v_0.Args[1] 1253 x := v.Args[1] 1254 flags := v.Args[2] 1255 v.reset(OpARMADCshiftRAreg) 1256 v.AddArg(x) 1257 v.AddArg(y) 1258 v.AddArg(z) 1259 v.AddArg(flags) 1260 return true 1261 } 1262 // match: (ADC (SRA y z) x flags) 1263 // cond: 1264 // result: (ADCshiftRAreg x y z flags) 1265 for { 1266 _ = v.Args[2] 1267 v_0 := v.Args[0] 1268 if v_0.Op != OpARMSRA { 1269 break 1270 } 1271 _ = v_0.Args[1] 1272 y := v_0.Args[0] 1273 z := v_0.Args[1] 1274 x := v.Args[1] 1275 flags := v.Args[2] 1276 v.reset(OpARMADCshiftRAreg) 1277 v.AddArg(x) 1278 v.AddArg(y) 1279 v.AddArg(z) 1280 v.AddArg(flags) 1281 return true 1282 } 1283 // match: (ADC x (SRA y z) flags) 1284 // cond: 1285 // result: (ADCshiftRAreg x y z flags) 1286 for { 1287 _ = v.Args[2] 1288 x := v.Args[0] 1289 v_1 := v.Args[1] 1290 if v_1.Op != OpARMSRA { 1291 break 1292 } 1293 _ = v_1.Args[1] 1294 y := v_1.Args[0] 1295 z := v_1.Args[1] 1296 flags := v.Args[2] 1297 v.reset(OpARMADCshiftRAreg) 1298 v.AddArg(x) 1299 v.AddArg(y) 1300 v.AddArg(z) 1301 v.AddArg(flags) 1302 return true 1303 } 1304 return false 1305 } 1306 func rewriteValueARM_OpARMADCconst_0(v *Value) bool { 1307 // match: (ADCconst [c] (ADDconst [d] x) flags) 1308 // cond: 1309 // result: (ADCconst [int64(int32(c+d))] x flags) 1310 for { 1311 c := v.AuxInt 1312 _ = v.Args[1] 1313 v_0 := v.Args[0] 1314 if v_0.Op != OpARMADDconst { 1315 break 1316 } 1317 d := v_0.AuxInt 1318 x := v_0.Args[0] 1319 flags := v.Args[1] 1320 v.reset(OpARMADCconst) 1321 v.AuxInt = int64(int32(c + d)) 1322 v.AddArg(x) 1323 v.AddArg(flags) 1324 return true 1325 } 1326 // match: (ADCconst [c] (SUBconst [d] x) flags) 1327 // cond: 1328 // result: (ADCconst [int64(int32(c-d))] x flags) 1329 for { 1330 c := v.AuxInt 1331 _ = v.Args[1] 1332 v_0 := v.Args[0] 1333 if v_0.Op != OpARMSUBconst { 1334 break 1335 } 1336 d := v_0.AuxInt 1337 x := v_0.Args[0] 1338 flags := v.Args[1] 1339 v.reset(OpARMADCconst) 1340 v.AuxInt = int64(int32(c - d)) 1341 v.AddArg(x) 1342 v.AddArg(flags) 1343 return true 1344 } 1345 return false 1346 } 1347 func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { 1348 b := v.Block 1349 _ = b 1350 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1351 // cond: 1352 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1353 for { 1354 d := v.AuxInt 1355 _ = v.Args[2] 1356 v_0 := v.Args[0] 1357 if v_0.Op != OpARMMOVWconst { 1358 break 1359 } 1360 c := v_0.AuxInt 1361 x := v.Args[1] 1362 flags := v.Args[2] 1363 v.reset(OpARMADCconst) 1364 v.AuxInt = c 1365 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1366 v0.AuxInt = d 1367 v0.AddArg(x) 1368 v.AddArg(v0) 1369 v.AddArg(flags) 1370 return true 1371 } 1372 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1373 // cond: 1374 // result: (ADCconst x [int64(uint32(c)<<uint64(d))] flags) 1375 for { 1376 d := v.AuxInt 1377 _ = v.Args[2] 1378 x := v.Args[0] 1379 v_1 := v.Args[1] 1380 if v_1.Op != OpARMMOVWconst { 1381 break 1382 } 1383 c := v_1.AuxInt 1384 flags := v.Args[2] 1385 v.reset(OpARMADCconst) 1386 v.AuxInt = int64(uint32(c) << uint64(d)) 1387 v.AddArg(x) 1388 v.AddArg(flags) 1389 return true 1390 } 1391 return false 1392 } 1393 func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { 1394 b := v.Block 1395 _ = b 1396 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1397 // cond: 1398 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1399 for { 1400 _ = v.Args[3] 1401 v_0 := v.Args[0] 1402 if v_0.Op != OpARMMOVWconst { 1403 break 1404 } 1405 c := v_0.AuxInt 1406 x := v.Args[1] 1407 y := v.Args[2] 1408 flags := v.Args[3] 1409 v.reset(OpARMADCconst) 1410 v.AuxInt = c 1411 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1412 v0.AddArg(x) 1413 v0.AddArg(y) 1414 v.AddArg(v0) 1415 v.AddArg(flags) 1416 return true 1417 } 1418 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1419 // cond: 1420 // result: (ADCshiftLL x y [c] flags) 1421 for { 1422 _ = v.Args[3] 1423 x := v.Args[0] 1424 y := v.Args[1] 1425 v_2 := v.Args[2] 1426 if v_2.Op != OpARMMOVWconst { 1427 break 1428 } 1429 c := v_2.AuxInt 1430 flags := v.Args[3] 1431 v.reset(OpARMADCshiftLL) 1432 v.AuxInt = c 1433 v.AddArg(x) 1434 v.AddArg(y) 1435 v.AddArg(flags) 1436 return true 1437 } 1438 return false 1439 } 1440 func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { 1441 b := v.Block 1442 _ = b 1443 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1444 // cond: 1445 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1446 for { 1447 d := v.AuxInt 1448 _ = v.Args[2] 1449 v_0 := v.Args[0] 1450 if v_0.Op != OpARMMOVWconst { 1451 break 1452 } 1453 c := v_0.AuxInt 1454 x := v.Args[1] 1455 flags := v.Args[2] 1456 v.reset(OpARMADCconst) 1457 v.AuxInt = c 1458 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1459 v0.AuxInt = d 1460 v0.AddArg(x) 1461 v.AddArg(v0) 1462 v.AddArg(flags) 1463 return true 1464 } 1465 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1466 // cond: 1467 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1468 for { 1469 d := v.AuxInt 1470 _ = v.Args[2] 1471 x := v.Args[0] 1472 v_1 := v.Args[1] 1473 if v_1.Op != OpARMMOVWconst { 1474 break 1475 } 1476 c := v_1.AuxInt 1477 flags := v.Args[2] 1478 v.reset(OpARMADCconst) 1479 v.AuxInt = int64(int32(c) >> uint64(d)) 1480 v.AddArg(x) 1481 v.AddArg(flags) 1482 return true 1483 } 1484 return false 1485 } 1486 func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { 1487 b := v.Block 1488 _ = b 1489 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1490 // cond: 1491 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1492 for { 1493 _ = v.Args[3] 1494 v_0 := v.Args[0] 1495 if v_0.Op != OpARMMOVWconst { 1496 break 1497 } 1498 c := v_0.AuxInt 1499 x := v.Args[1] 1500 y := v.Args[2] 1501 flags := v.Args[3] 1502 v.reset(OpARMADCconst) 1503 v.AuxInt = c 1504 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1505 v0.AddArg(x) 1506 v0.AddArg(y) 1507 v.AddArg(v0) 1508 v.AddArg(flags) 1509 return true 1510 } 1511 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1512 // cond: 1513 // result: (ADCshiftRA x y [c] flags) 1514 for { 1515 _ = v.Args[3] 1516 x := v.Args[0] 1517 y := v.Args[1] 1518 v_2 := v.Args[2] 1519 if v_2.Op != OpARMMOVWconst { 1520 break 1521 } 1522 c := v_2.AuxInt 1523 flags := v.Args[3] 1524 v.reset(OpARMADCshiftRA) 1525 v.AuxInt = c 1526 v.AddArg(x) 1527 v.AddArg(y) 1528 v.AddArg(flags) 1529 return true 1530 } 1531 return false 1532 } 1533 func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { 1534 b := v.Block 1535 _ = b 1536 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1537 // cond: 1538 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1539 for { 1540 d := v.AuxInt 1541 _ = v.Args[2] 1542 v_0 := v.Args[0] 1543 if v_0.Op != OpARMMOVWconst { 1544 break 1545 } 1546 c := v_0.AuxInt 1547 x := v.Args[1] 1548 flags := v.Args[2] 1549 v.reset(OpARMADCconst) 1550 v.AuxInt = c 1551 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1552 v0.AuxInt = d 1553 v0.AddArg(x) 1554 v.AddArg(v0) 1555 v.AddArg(flags) 1556 return true 1557 } 1558 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1559 // cond: 1560 // result: (ADCconst x [int64(uint32(c)>>uint64(d))] flags) 1561 for { 1562 d := v.AuxInt 1563 _ = v.Args[2] 1564 x := v.Args[0] 1565 v_1 := v.Args[1] 1566 if v_1.Op != OpARMMOVWconst { 1567 break 1568 } 1569 c := v_1.AuxInt 1570 flags := v.Args[2] 1571 v.reset(OpARMADCconst) 1572 v.AuxInt = int64(uint32(c) >> uint64(d)) 1573 v.AddArg(x) 1574 v.AddArg(flags) 1575 return true 1576 } 1577 return false 1578 } 1579 func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { 1580 b := v.Block 1581 _ = b 1582 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1583 // cond: 1584 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1585 for { 1586 _ = v.Args[3] 1587 v_0 := v.Args[0] 1588 if v_0.Op != OpARMMOVWconst { 1589 break 1590 } 1591 c := v_0.AuxInt 1592 x := v.Args[1] 1593 y := v.Args[2] 1594 flags := v.Args[3] 1595 v.reset(OpARMADCconst) 1596 v.AuxInt = c 1597 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1598 v0.AddArg(x) 1599 v0.AddArg(y) 1600 v.AddArg(v0) 1601 v.AddArg(flags) 1602 return true 1603 } 1604 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1605 // cond: 1606 // result: (ADCshiftRL x y [c] flags) 1607 for { 1608 _ = v.Args[3] 1609 x := v.Args[0] 1610 y := v.Args[1] 1611 v_2 := v.Args[2] 1612 if v_2.Op != OpARMMOVWconst { 1613 break 1614 } 1615 c := v_2.AuxInt 1616 flags := v.Args[3] 1617 v.reset(OpARMADCshiftRL) 1618 v.AuxInt = c 1619 v.AddArg(x) 1620 v.AddArg(y) 1621 v.AddArg(flags) 1622 return true 1623 } 1624 return false 1625 } 1626 func rewriteValueARM_OpARMADD_0(v *Value) bool { 1627 // match: (ADD x (MOVWconst [c])) 1628 // cond: 1629 // result: (ADDconst [c] x) 1630 for { 1631 _ = v.Args[1] 1632 x := v.Args[0] 1633 v_1 := v.Args[1] 1634 if v_1.Op != OpARMMOVWconst { 1635 break 1636 } 1637 c := v_1.AuxInt 1638 v.reset(OpARMADDconst) 1639 v.AuxInt = c 1640 v.AddArg(x) 1641 return true 1642 } 1643 // match: (ADD (MOVWconst [c]) x) 1644 // cond: 1645 // result: (ADDconst [c] x) 1646 for { 1647 _ = v.Args[1] 1648 v_0 := v.Args[0] 1649 if v_0.Op != OpARMMOVWconst { 1650 break 1651 } 1652 c := v_0.AuxInt 1653 x := v.Args[1] 1654 v.reset(OpARMADDconst) 1655 v.AuxInt = c 1656 v.AddArg(x) 1657 return true 1658 } 1659 // match: (ADD x (SLLconst [c] y)) 1660 // cond: 1661 // result: (ADDshiftLL x y [c]) 1662 for { 1663 _ = v.Args[1] 1664 x := v.Args[0] 1665 v_1 := v.Args[1] 1666 if v_1.Op != OpARMSLLconst { 1667 break 1668 } 1669 c := v_1.AuxInt 1670 y := v_1.Args[0] 1671 v.reset(OpARMADDshiftLL) 1672 v.AuxInt = c 1673 v.AddArg(x) 1674 v.AddArg(y) 1675 return true 1676 } 1677 // match: (ADD (SLLconst [c] y) x) 1678 // cond: 1679 // result: (ADDshiftLL x y [c]) 1680 for { 1681 _ = v.Args[1] 1682 v_0 := v.Args[0] 1683 if v_0.Op != OpARMSLLconst { 1684 break 1685 } 1686 c := v_0.AuxInt 1687 y := v_0.Args[0] 1688 x := v.Args[1] 1689 v.reset(OpARMADDshiftLL) 1690 v.AuxInt = c 1691 v.AddArg(x) 1692 v.AddArg(y) 1693 return true 1694 } 1695 // match: (ADD x (SRLconst [c] y)) 1696 // cond: 1697 // result: (ADDshiftRL x y [c]) 1698 for { 1699 _ = v.Args[1] 1700 x := v.Args[0] 1701 v_1 := v.Args[1] 1702 if v_1.Op != OpARMSRLconst { 1703 break 1704 } 1705 c := v_1.AuxInt 1706 y := v_1.Args[0] 1707 v.reset(OpARMADDshiftRL) 1708 v.AuxInt = c 1709 v.AddArg(x) 1710 v.AddArg(y) 1711 return true 1712 } 1713 // match: (ADD (SRLconst [c] y) x) 1714 // cond: 1715 // result: (ADDshiftRL x y [c]) 1716 for { 1717 _ = v.Args[1] 1718 v_0 := v.Args[0] 1719 if v_0.Op != OpARMSRLconst { 1720 break 1721 } 1722 c := v_0.AuxInt 1723 y := v_0.Args[0] 1724 x := v.Args[1] 1725 v.reset(OpARMADDshiftRL) 1726 v.AuxInt = c 1727 v.AddArg(x) 1728 v.AddArg(y) 1729 return true 1730 } 1731 // match: (ADD x (SRAconst [c] y)) 1732 // cond: 1733 // result: (ADDshiftRA x y [c]) 1734 for { 1735 _ = v.Args[1] 1736 x := v.Args[0] 1737 v_1 := v.Args[1] 1738 if v_1.Op != OpARMSRAconst { 1739 break 1740 } 1741 c := v_1.AuxInt 1742 y := v_1.Args[0] 1743 v.reset(OpARMADDshiftRA) 1744 v.AuxInt = c 1745 v.AddArg(x) 1746 v.AddArg(y) 1747 return true 1748 } 1749 // match: (ADD (SRAconst [c] y) x) 1750 // cond: 1751 // result: (ADDshiftRA x y [c]) 1752 for { 1753 _ = v.Args[1] 1754 v_0 := v.Args[0] 1755 if v_0.Op != OpARMSRAconst { 1756 break 1757 } 1758 c := v_0.AuxInt 1759 y := v_0.Args[0] 1760 x := v.Args[1] 1761 v.reset(OpARMADDshiftRA) 1762 v.AuxInt = c 1763 v.AddArg(x) 1764 v.AddArg(y) 1765 return true 1766 } 1767 // match: (ADD x (SLL y z)) 1768 // cond: 1769 // result: (ADDshiftLLreg x y z) 1770 for { 1771 _ = v.Args[1] 1772 x := v.Args[0] 1773 v_1 := v.Args[1] 1774 if v_1.Op != OpARMSLL { 1775 break 1776 } 1777 _ = v_1.Args[1] 1778 y := v_1.Args[0] 1779 z := v_1.Args[1] 1780 v.reset(OpARMADDshiftLLreg) 1781 v.AddArg(x) 1782 v.AddArg(y) 1783 v.AddArg(z) 1784 return true 1785 } 1786 // match: (ADD (SLL y z) x) 1787 // cond: 1788 // result: (ADDshiftLLreg x y z) 1789 for { 1790 _ = v.Args[1] 1791 v_0 := v.Args[0] 1792 if v_0.Op != OpARMSLL { 1793 break 1794 } 1795 _ = v_0.Args[1] 1796 y := v_0.Args[0] 1797 z := v_0.Args[1] 1798 x := v.Args[1] 1799 v.reset(OpARMADDshiftLLreg) 1800 v.AddArg(x) 1801 v.AddArg(y) 1802 v.AddArg(z) 1803 return true 1804 } 1805 return false 1806 } 1807 func rewriteValueARM_OpARMADD_10(v *Value) bool { 1808 b := v.Block 1809 _ = b 1810 // match: (ADD x (SRL y z)) 1811 // cond: 1812 // result: (ADDshiftRLreg x y z) 1813 for { 1814 _ = v.Args[1] 1815 x := v.Args[0] 1816 v_1 := v.Args[1] 1817 if v_1.Op != OpARMSRL { 1818 break 1819 } 1820 _ = v_1.Args[1] 1821 y := v_1.Args[0] 1822 z := v_1.Args[1] 1823 v.reset(OpARMADDshiftRLreg) 1824 v.AddArg(x) 1825 v.AddArg(y) 1826 v.AddArg(z) 1827 return true 1828 } 1829 // match: (ADD (SRL y z) x) 1830 // cond: 1831 // result: (ADDshiftRLreg x y z) 1832 for { 1833 _ = v.Args[1] 1834 v_0 := v.Args[0] 1835 if v_0.Op != OpARMSRL { 1836 break 1837 } 1838 _ = v_0.Args[1] 1839 y := v_0.Args[0] 1840 z := v_0.Args[1] 1841 x := v.Args[1] 1842 v.reset(OpARMADDshiftRLreg) 1843 v.AddArg(x) 1844 v.AddArg(y) 1845 v.AddArg(z) 1846 return true 1847 } 1848 // match: (ADD x (SRA y z)) 1849 // cond: 1850 // result: (ADDshiftRAreg x y z) 1851 for { 1852 _ = v.Args[1] 1853 x := v.Args[0] 1854 v_1 := v.Args[1] 1855 if v_1.Op != OpARMSRA { 1856 break 1857 } 1858 _ = v_1.Args[1] 1859 y := v_1.Args[0] 1860 z := v_1.Args[1] 1861 v.reset(OpARMADDshiftRAreg) 1862 v.AddArg(x) 1863 v.AddArg(y) 1864 v.AddArg(z) 1865 return true 1866 } 1867 // match: (ADD (SRA y z) x) 1868 // cond: 1869 // result: (ADDshiftRAreg x y z) 1870 for { 1871 _ = v.Args[1] 1872 v_0 := v.Args[0] 1873 if v_0.Op != OpARMSRA { 1874 break 1875 } 1876 _ = v_0.Args[1] 1877 y := v_0.Args[0] 1878 z := v_0.Args[1] 1879 x := v.Args[1] 1880 v.reset(OpARMADDshiftRAreg) 1881 v.AddArg(x) 1882 v.AddArg(y) 1883 v.AddArg(z) 1884 return true 1885 } 1886 // match: (ADD x (RSBconst [0] y)) 1887 // cond: 1888 // result: (SUB x y) 1889 for { 1890 _ = v.Args[1] 1891 x := v.Args[0] 1892 v_1 := v.Args[1] 1893 if v_1.Op != OpARMRSBconst { 1894 break 1895 } 1896 if v_1.AuxInt != 0 { 1897 break 1898 } 1899 y := v_1.Args[0] 1900 v.reset(OpARMSUB) 1901 v.AddArg(x) 1902 v.AddArg(y) 1903 return true 1904 } 1905 // match: (ADD (RSBconst [0] y) x) 1906 // cond: 1907 // result: (SUB x y) 1908 for { 1909 _ = v.Args[1] 1910 v_0 := v.Args[0] 1911 if v_0.Op != OpARMRSBconst { 1912 break 1913 } 1914 if v_0.AuxInt != 0 { 1915 break 1916 } 1917 y := v_0.Args[0] 1918 x := v.Args[1] 1919 v.reset(OpARMSUB) 1920 v.AddArg(x) 1921 v.AddArg(y) 1922 return true 1923 } 1924 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 1925 // cond: 1926 // result: (RSBconst [c+d] (ADD <t> x y)) 1927 for { 1928 t := v.Type 1929 _ = v.Args[1] 1930 v_0 := v.Args[0] 1931 if v_0.Op != OpARMRSBconst { 1932 break 1933 } 1934 c := v_0.AuxInt 1935 x := v_0.Args[0] 1936 v_1 := v.Args[1] 1937 if v_1.Op != OpARMRSBconst { 1938 break 1939 } 1940 d := v_1.AuxInt 1941 y := v_1.Args[0] 1942 v.reset(OpARMRSBconst) 1943 v.AuxInt = c + d 1944 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1945 v0.AddArg(x) 1946 v0.AddArg(y) 1947 v.AddArg(v0) 1948 return true 1949 } 1950 // match: (ADD <t> (RSBconst [d] y) (RSBconst [c] x)) 1951 // cond: 1952 // result: (RSBconst [c+d] (ADD <t> x y)) 1953 for { 1954 t := v.Type 1955 _ = v.Args[1] 1956 v_0 := v.Args[0] 1957 if v_0.Op != OpARMRSBconst { 1958 break 1959 } 1960 d := v_0.AuxInt 1961 y := v_0.Args[0] 1962 v_1 := v.Args[1] 1963 if v_1.Op != OpARMRSBconst { 1964 break 1965 } 1966 c := v_1.AuxInt 1967 x := v_1.Args[0] 1968 v.reset(OpARMRSBconst) 1969 v.AuxInt = c + d 1970 v0 := b.NewValue0(v.Pos, OpARMADD, t) 1971 v0.AddArg(x) 1972 v0.AddArg(y) 1973 v.AddArg(v0) 1974 return true 1975 } 1976 // match: (ADD (MUL x y) a) 1977 // cond: 1978 // result: (MULA x y a) 1979 for { 1980 _ = v.Args[1] 1981 v_0 := v.Args[0] 1982 if v_0.Op != OpARMMUL { 1983 break 1984 } 1985 _ = v_0.Args[1] 1986 x := v_0.Args[0] 1987 y := v_0.Args[1] 1988 a := v.Args[1] 1989 v.reset(OpARMMULA) 1990 v.AddArg(x) 1991 v.AddArg(y) 1992 v.AddArg(a) 1993 return true 1994 } 1995 // match: (ADD a (MUL x y)) 1996 // cond: 1997 // result: (MULA x y a) 1998 for { 1999 _ = v.Args[1] 2000 a := v.Args[0] 2001 v_1 := v.Args[1] 2002 if v_1.Op != OpARMMUL { 2003 break 2004 } 2005 _ = v_1.Args[1] 2006 x := v_1.Args[0] 2007 y := v_1.Args[1] 2008 v.reset(OpARMMULA) 2009 v.AddArg(x) 2010 v.AddArg(y) 2011 v.AddArg(a) 2012 return true 2013 } 2014 return false 2015 } 2016 func rewriteValueARM_OpARMADDS_0(v *Value) bool { 2017 // match: (ADDS x (MOVWconst [c])) 2018 // cond: 2019 // result: (ADDSconst [c] x) 2020 for { 2021 _ = v.Args[1] 2022 x := v.Args[0] 2023 v_1 := v.Args[1] 2024 if v_1.Op != OpARMMOVWconst { 2025 break 2026 } 2027 c := v_1.AuxInt 2028 v.reset(OpARMADDSconst) 2029 v.AuxInt = c 2030 v.AddArg(x) 2031 return true 2032 } 2033 // match: (ADDS (MOVWconst [c]) x) 2034 // cond: 2035 // result: (ADDSconst [c] x) 2036 for { 2037 _ = v.Args[1] 2038 v_0 := v.Args[0] 2039 if v_0.Op != OpARMMOVWconst { 2040 break 2041 } 2042 c := v_0.AuxInt 2043 x := v.Args[1] 2044 v.reset(OpARMADDSconst) 2045 v.AuxInt = c 2046 v.AddArg(x) 2047 return true 2048 } 2049 // match: (ADDS x (SLLconst [c] y)) 2050 // cond: 2051 // result: (ADDSshiftLL x y [c]) 2052 for { 2053 _ = v.Args[1] 2054 x := v.Args[0] 2055 v_1 := v.Args[1] 2056 if v_1.Op != OpARMSLLconst { 2057 break 2058 } 2059 c := v_1.AuxInt 2060 y := v_1.Args[0] 2061 v.reset(OpARMADDSshiftLL) 2062 v.AuxInt = c 2063 v.AddArg(x) 2064 v.AddArg(y) 2065 return true 2066 } 2067 // match: (ADDS (SLLconst [c] y) x) 2068 // cond: 2069 // result: (ADDSshiftLL x y [c]) 2070 for { 2071 _ = v.Args[1] 2072 v_0 := v.Args[0] 2073 if v_0.Op != OpARMSLLconst { 2074 break 2075 } 2076 c := v_0.AuxInt 2077 y := v_0.Args[0] 2078 x := v.Args[1] 2079 v.reset(OpARMADDSshiftLL) 2080 v.AuxInt = c 2081 v.AddArg(x) 2082 v.AddArg(y) 2083 return true 2084 } 2085 // match: (ADDS x (SRLconst [c] y)) 2086 // cond: 2087 // result: (ADDSshiftRL x y [c]) 2088 for { 2089 _ = v.Args[1] 2090 x := v.Args[0] 2091 v_1 := v.Args[1] 2092 if v_1.Op != OpARMSRLconst { 2093 break 2094 } 2095 c := v_1.AuxInt 2096 y := v_1.Args[0] 2097 v.reset(OpARMADDSshiftRL) 2098 v.AuxInt = c 2099 v.AddArg(x) 2100 v.AddArg(y) 2101 return true 2102 } 2103 // match: (ADDS (SRLconst [c] y) x) 2104 // cond: 2105 // result: (ADDSshiftRL x y [c]) 2106 for { 2107 _ = v.Args[1] 2108 v_0 := v.Args[0] 2109 if v_0.Op != OpARMSRLconst { 2110 break 2111 } 2112 c := v_0.AuxInt 2113 y := v_0.Args[0] 2114 x := v.Args[1] 2115 v.reset(OpARMADDSshiftRL) 2116 v.AuxInt = c 2117 v.AddArg(x) 2118 v.AddArg(y) 2119 return true 2120 } 2121 // match: (ADDS x (SRAconst [c] y)) 2122 // cond: 2123 // result: (ADDSshiftRA x y [c]) 2124 for { 2125 _ = v.Args[1] 2126 x := v.Args[0] 2127 v_1 := v.Args[1] 2128 if v_1.Op != OpARMSRAconst { 2129 break 2130 } 2131 c := v_1.AuxInt 2132 y := v_1.Args[0] 2133 v.reset(OpARMADDSshiftRA) 2134 v.AuxInt = c 2135 v.AddArg(x) 2136 v.AddArg(y) 2137 return true 2138 } 2139 // match: (ADDS (SRAconst [c] y) x) 2140 // cond: 2141 // result: (ADDSshiftRA x y [c]) 2142 for { 2143 _ = v.Args[1] 2144 v_0 := v.Args[0] 2145 if v_0.Op != OpARMSRAconst { 2146 break 2147 } 2148 c := v_0.AuxInt 2149 y := v_0.Args[0] 2150 x := v.Args[1] 2151 v.reset(OpARMADDSshiftRA) 2152 v.AuxInt = c 2153 v.AddArg(x) 2154 v.AddArg(y) 2155 return true 2156 } 2157 // match: (ADDS x (SLL y z)) 2158 // cond: 2159 // result: (ADDSshiftLLreg x y z) 2160 for { 2161 _ = v.Args[1] 2162 x := v.Args[0] 2163 v_1 := v.Args[1] 2164 if v_1.Op != OpARMSLL { 2165 break 2166 } 2167 _ = v_1.Args[1] 2168 y := v_1.Args[0] 2169 z := v_1.Args[1] 2170 v.reset(OpARMADDSshiftLLreg) 2171 v.AddArg(x) 2172 v.AddArg(y) 2173 v.AddArg(z) 2174 return true 2175 } 2176 // match: (ADDS (SLL y z) x) 2177 // cond: 2178 // result: (ADDSshiftLLreg x y z) 2179 for { 2180 _ = v.Args[1] 2181 v_0 := v.Args[0] 2182 if v_0.Op != OpARMSLL { 2183 break 2184 } 2185 _ = v_0.Args[1] 2186 y := v_0.Args[0] 2187 z := v_0.Args[1] 2188 x := v.Args[1] 2189 v.reset(OpARMADDSshiftLLreg) 2190 v.AddArg(x) 2191 v.AddArg(y) 2192 v.AddArg(z) 2193 return true 2194 } 2195 return false 2196 } 2197 func rewriteValueARM_OpARMADDS_10(v *Value) bool { 2198 // match: (ADDS x (SRL y z)) 2199 // cond: 2200 // result: (ADDSshiftRLreg x y z) 2201 for { 2202 _ = v.Args[1] 2203 x := v.Args[0] 2204 v_1 := v.Args[1] 2205 if v_1.Op != OpARMSRL { 2206 break 2207 } 2208 _ = v_1.Args[1] 2209 y := v_1.Args[0] 2210 z := v_1.Args[1] 2211 v.reset(OpARMADDSshiftRLreg) 2212 v.AddArg(x) 2213 v.AddArg(y) 2214 v.AddArg(z) 2215 return true 2216 } 2217 // match: (ADDS (SRL y z) x) 2218 // cond: 2219 // result: (ADDSshiftRLreg x y z) 2220 for { 2221 _ = v.Args[1] 2222 v_0 := v.Args[0] 2223 if v_0.Op != OpARMSRL { 2224 break 2225 } 2226 _ = v_0.Args[1] 2227 y := v_0.Args[0] 2228 z := v_0.Args[1] 2229 x := v.Args[1] 2230 v.reset(OpARMADDSshiftRLreg) 2231 v.AddArg(x) 2232 v.AddArg(y) 2233 v.AddArg(z) 2234 return true 2235 } 2236 // match: (ADDS x (SRA y z)) 2237 // cond: 2238 // result: (ADDSshiftRAreg x y z) 2239 for { 2240 _ = v.Args[1] 2241 x := v.Args[0] 2242 v_1 := v.Args[1] 2243 if v_1.Op != OpARMSRA { 2244 break 2245 } 2246 _ = v_1.Args[1] 2247 y := v_1.Args[0] 2248 z := v_1.Args[1] 2249 v.reset(OpARMADDSshiftRAreg) 2250 v.AddArg(x) 2251 v.AddArg(y) 2252 v.AddArg(z) 2253 return true 2254 } 2255 // match: (ADDS (SRA y z) x) 2256 // cond: 2257 // result: (ADDSshiftRAreg x y z) 2258 for { 2259 _ = v.Args[1] 2260 v_0 := v.Args[0] 2261 if v_0.Op != OpARMSRA { 2262 break 2263 } 2264 _ = v_0.Args[1] 2265 y := v_0.Args[0] 2266 z := v_0.Args[1] 2267 x := v.Args[1] 2268 v.reset(OpARMADDSshiftRAreg) 2269 v.AddArg(x) 2270 v.AddArg(y) 2271 v.AddArg(z) 2272 return true 2273 } 2274 return false 2275 } 2276 func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { 2277 b := v.Block 2278 _ = b 2279 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 2280 // cond: 2281 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 2282 for { 2283 d := v.AuxInt 2284 _ = v.Args[1] 2285 v_0 := v.Args[0] 2286 if v_0.Op != OpARMMOVWconst { 2287 break 2288 } 2289 c := v_0.AuxInt 2290 x := v.Args[1] 2291 v.reset(OpARMADDSconst) 2292 v.AuxInt = c 2293 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2294 v0.AuxInt = d 2295 v0.AddArg(x) 2296 v.AddArg(v0) 2297 return true 2298 } 2299 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 2300 // cond: 2301 // result: (ADDSconst x [int64(uint32(c)<<uint64(d))]) 2302 for { 2303 d := v.AuxInt 2304 _ = v.Args[1] 2305 x := v.Args[0] 2306 v_1 := v.Args[1] 2307 if v_1.Op != OpARMMOVWconst { 2308 break 2309 } 2310 c := v_1.AuxInt 2311 v.reset(OpARMADDSconst) 2312 v.AuxInt = int64(uint32(c) << uint64(d)) 2313 v.AddArg(x) 2314 return true 2315 } 2316 return false 2317 } 2318 func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { 2319 b := v.Block 2320 _ = b 2321 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 2322 // cond: 2323 // result: (ADDSconst [c] (SLL <x.Type> x y)) 2324 for { 2325 _ = v.Args[2] 2326 v_0 := v.Args[0] 2327 if v_0.Op != OpARMMOVWconst { 2328 break 2329 } 2330 c := v_0.AuxInt 2331 x := v.Args[1] 2332 y := v.Args[2] 2333 v.reset(OpARMADDSconst) 2334 v.AuxInt = c 2335 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2336 v0.AddArg(x) 2337 v0.AddArg(y) 2338 v.AddArg(v0) 2339 return true 2340 } 2341 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 2342 // cond: 2343 // result: (ADDSshiftLL x y [c]) 2344 for { 2345 _ = v.Args[2] 2346 x := v.Args[0] 2347 y := v.Args[1] 2348 v_2 := v.Args[2] 2349 if v_2.Op != OpARMMOVWconst { 2350 break 2351 } 2352 c := v_2.AuxInt 2353 v.reset(OpARMADDSshiftLL) 2354 v.AuxInt = c 2355 v.AddArg(x) 2356 v.AddArg(y) 2357 return true 2358 } 2359 return false 2360 } 2361 func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { 2362 b := v.Block 2363 _ = b 2364 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 2365 // cond: 2366 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 2367 for { 2368 d := v.AuxInt 2369 _ = v.Args[1] 2370 v_0 := v.Args[0] 2371 if v_0.Op != OpARMMOVWconst { 2372 break 2373 } 2374 c := v_0.AuxInt 2375 x := v.Args[1] 2376 v.reset(OpARMADDSconst) 2377 v.AuxInt = c 2378 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2379 v0.AuxInt = d 2380 v0.AddArg(x) 2381 v.AddArg(v0) 2382 return true 2383 } 2384 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 2385 // cond: 2386 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 2387 for { 2388 d := v.AuxInt 2389 _ = v.Args[1] 2390 x := v.Args[0] 2391 v_1 := v.Args[1] 2392 if v_1.Op != OpARMMOVWconst { 2393 break 2394 } 2395 c := v_1.AuxInt 2396 v.reset(OpARMADDSconst) 2397 v.AuxInt = int64(int32(c) >> uint64(d)) 2398 v.AddArg(x) 2399 return true 2400 } 2401 return false 2402 } 2403 func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { 2404 b := v.Block 2405 _ = b 2406 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 2407 // cond: 2408 // result: (ADDSconst [c] (SRA <x.Type> x y)) 2409 for { 2410 _ = v.Args[2] 2411 v_0 := v.Args[0] 2412 if v_0.Op != OpARMMOVWconst { 2413 break 2414 } 2415 c := v_0.AuxInt 2416 x := v.Args[1] 2417 y := v.Args[2] 2418 v.reset(OpARMADDSconst) 2419 v.AuxInt = c 2420 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2421 v0.AddArg(x) 2422 v0.AddArg(y) 2423 v.AddArg(v0) 2424 return true 2425 } 2426 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 2427 // cond: 2428 // result: (ADDSshiftRA x y [c]) 2429 for { 2430 _ = v.Args[2] 2431 x := v.Args[0] 2432 y := v.Args[1] 2433 v_2 := v.Args[2] 2434 if v_2.Op != OpARMMOVWconst { 2435 break 2436 } 2437 c := v_2.AuxInt 2438 v.reset(OpARMADDSshiftRA) 2439 v.AuxInt = c 2440 v.AddArg(x) 2441 v.AddArg(y) 2442 return true 2443 } 2444 return false 2445 } 2446 func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { 2447 b := v.Block 2448 _ = b 2449 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2450 // cond: 2451 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2452 for { 2453 d := v.AuxInt 2454 _ = v.Args[1] 2455 v_0 := v.Args[0] 2456 if v_0.Op != OpARMMOVWconst { 2457 break 2458 } 2459 c := v_0.AuxInt 2460 x := v.Args[1] 2461 v.reset(OpARMADDSconst) 2462 v.AuxInt = c 2463 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2464 v0.AuxInt = d 2465 v0.AddArg(x) 2466 v.AddArg(v0) 2467 return true 2468 } 2469 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2470 // cond: 2471 // result: (ADDSconst x [int64(uint32(c)>>uint64(d))]) 2472 for { 2473 d := v.AuxInt 2474 _ = v.Args[1] 2475 x := v.Args[0] 2476 v_1 := v.Args[1] 2477 if v_1.Op != OpARMMOVWconst { 2478 break 2479 } 2480 c := v_1.AuxInt 2481 v.reset(OpARMADDSconst) 2482 v.AuxInt = int64(uint32(c) >> uint64(d)) 2483 v.AddArg(x) 2484 return true 2485 } 2486 return false 2487 } 2488 func rewriteValueARM_OpARMADDSshiftRLreg_0(v *Value) bool { 2489 b := v.Block 2490 _ = b 2491 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2492 // cond: 2493 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2494 for { 2495 _ = v.Args[2] 2496 v_0 := v.Args[0] 2497 if v_0.Op != OpARMMOVWconst { 2498 break 2499 } 2500 c := v_0.AuxInt 2501 x := v.Args[1] 2502 y := v.Args[2] 2503 v.reset(OpARMADDSconst) 2504 v.AuxInt = c 2505 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2506 v0.AddArg(x) 2507 v0.AddArg(y) 2508 v.AddArg(v0) 2509 return true 2510 } 2511 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2512 // cond: 2513 // result: (ADDSshiftRL x y [c]) 2514 for { 2515 _ = v.Args[2] 2516 x := v.Args[0] 2517 y := v.Args[1] 2518 v_2 := v.Args[2] 2519 if v_2.Op != OpARMMOVWconst { 2520 break 2521 } 2522 c := v_2.AuxInt 2523 v.reset(OpARMADDSshiftRL) 2524 v.AuxInt = c 2525 v.AddArg(x) 2526 v.AddArg(y) 2527 return true 2528 } 2529 return false 2530 } 2531 func rewriteValueARM_OpARMADDconst_0(v *Value) bool { 2532 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2533 // cond: 2534 // result: (MOVWaddr [off1+off2] {sym} ptr) 2535 for { 2536 off1 := v.AuxInt 2537 v_0 := v.Args[0] 2538 if v_0.Op != OpARMMOVWaddr { 2539 break 2540 } 2541 off2 := v_0.AuxInt 2542 sym := v_0.Aux 2543 ptr := v_0.Args[0] 2544 v.reset(OpARMMOVWaddr) 2545 v.AuxInt = off1 + off2 2546 v.Aux = sym 2547 v.AddArg(ptr) 2548 return true 2549 } 2550 // match: (ADDconst [0] x) 2551 // cond: 2552 // result: x 2553 for { 2554 if v.AuxInt != 0 { 2555 break 2556 } 2557 x := v.Args[0] 2558 v.reset(OpCopy) 2559 v.Type = x.Type 2560 v.AddArg(x) 2561 return true 2562 } 2563 // match: (ADDconst [c] x) 2564 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 2565 // result: (SUBconst [int64(int32(-c))] x) 2566 for { 2567 c := v.AuxInt 2568 x := v.Args[0] 2569 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 2570 break 2571 } 2572 v.reset(OpARMSUBconst) 2573 v.AuxInt = int64(int32(-c)) 2574 v.AddArg(x) 2575 return true 2576 } 2577 // match: (ADDconst [c] (MOVWconst [d])) 2578 // cond: 2579 // result: (MOVWconst [int64(int32(c+d))]) 2580 for { 2581 c := v.AuxInt 2582 v_0 := v.Args[0] 2583 if v_0.Op != OpARMMOVWconst { 2584 break 2585 } 2586 d := v_0.AuxInt 2587 v.reset(OpARMMOVWconst) 2588 v.AuxInt = int64(int32(c + d)) 2589 return true 2590 } 2591 // match: (ADDconst [c] (ADDconst [d] x)) 2592 // cond: 2593 // result: (ADDconst [int64(int32(c+d))] x) 2594 for { 2595 c := v.AuxInt 2596 v_0 := v.Args[0] 2597 if v_0.Op != OpARMADDconst { 2598 break 2599 } 2600 d := v_0.AuxInt 2601 x := v_0.Args[0] 2602 v.reset(OpARMADDconst) 2603 v.AuxInt = int64(int32(c + d)) 2604 v.AddArg(x) 2605 return true 2606 } 2607 // match: (ADDconst [c] (SUBconst [d] x)) 2608 // cond: 2609 // result: (ADDconst [int64(int32(c-d))] x) 2610 for { 2611 c := v.AuxInt 2612 v_0 := v.Args[0] 2613 if v_0.Op != OpARMSUBconst { 2614 break 2615 } 2616 d := v_0.AuxInt 2617 x := v_0.Args[0] 2618 v.reset(OpARMADDconst) 2619 v.AuxInt = int64(int32(c - d)) 2620 v.AddArg(x) 2621 return true 2622 } 2623 // match: (ADDconst [c] (RSBconst [d] x)) 2624 // cond: 2625 // result: (RSBconst [int64(int32(c+d))] x) 2626 for { 2627 c := v.AuxInt 2628 v_0 := v.Args[0] 2629 if v_0.Op != OpARMRSBconst { 2630 break 2631 } 2632 d := v_0.AuxInt 2633 x := v_0.Args[0] 2634 v.reset(OpARMRSBconst) 2635 v.AuxInt = int64(int32(c + d)) 2636 v.AddArg(x) 2637 return true 2638 } 2639 return false 2640 } 2641 func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { 2642 b := v.Block 2643 _ = b 2644 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2645 // cond: 2646 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2647 for { 2648 d := v.AuxInt 2649 _ = v.Args[1] 2650 v_0 := v.Args[0] 2651 if v_0.Op != OpARMMOVWconst { 2652 break 2653 } 2654 c := v_0.AuxInt 2655 x := v.Args[1] 2656 v.reset(OpARMADDconst) 2657 v.AuxInt = c 2658 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2659 v0.AuxInt = d 2660 v0.AddArg(x) 2661 v.AddArg(v0) 2662 return true 2663 } 2664 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2665 // cond: 2666 // result: (ADDconst x [int64(uint32(c)<<uint64(d))]) 2667 for { 2668 d := v.AuxInt 2669 _ = v.Args[1] 2670 x := v.Args[0] 2671 v_1 := v.Args[1] 2672 if v_1.Op != OpARMMOVWconst { 2673 break 2674 } 2675 c := v_1.AuxInt 2676 v.reset(OpARMADDconst) 2677 v.AuxInt = int64(uint32(c) << uint64(d)) 2678 v.AddArg(x) 2679 return true 2680 } 2681 // match: (ADDshiftLL [c] (SRLconst x [32-c]) x) 2682 // cond: 2683 // result: (SRRconst [32-c] x) 2684 for { 2685 c := v.AuxInt 2686 _ = v.Args[1] 2687 v_0 := v.Args[0] 2688 if v_0.Op != OpARMSRLconst { 2689 break 2690 } 2691 if v_0.AuxInt != 32-c { 2692 break 2693 } 2694 x := v_0.Args[0] 2695 if x != v.Args[1] { 2696 break 2697 } 2698 v.reset(OpARMSRRconst) 2699 v.AuxInt = 32 - c 2700 v.AddArg(x) 2701 return true 2702 } 2703 return false 2704 } 2705 func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { 2706 b := v.Block 2707 _ = b 2708 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2709 // cond: 2710 // result: (ADDconst [c] (SLL <x.Type> x y)) 2711 for { 2712 _ = v.Args[2] 2713 v_0 := v.Args[0] 2714 if v_0.Op != OpARMMOVWconst { 2715 break 2716 } 2717 c := v_0.AuxInt 2718 x := v.Args[1] 2719 y := v.Args[2] 2720 v.reset(OpARMADDconst) 2721 v.AuxInt = c 2722 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2723 v0.AddArg(x) 2724 v0.AddArg(y) 2725 v.AddArg(v0) 2726 return true 2727 } 2728 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2729 // cond: 2730 // result: (ADDshiftLL x y [c]) 2731 for { 2732 _ = v.Args[2] 2733 x := v.Args[0] 2734 y := v.Args[1] 2735 v_2 := v.Args[2] 2736 if v_2.Op != OpARMMOVWconst { 2737 break 2738 } 2739 c := v_2.AuxInt 2740 v.reset(OpARMADDshiftLL) 2741 v.AuxInt = c 2742 v.AddArg(x) 2743 v.AddArg(y) 2744 return true 2745 } 2746 return false 2747 } 2748 func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { 2749 b := v.Block 2750 _ = b 2751 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 2752 // cond: 2753 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 2754 for { 2755 d := v.AuxInt 2756 _ = v.Args[1] 2757 v_0 := v.Args[0] 2758 if v_0.Op != OpARMMOVWconst { 2759 break 2760 } 2761 c := v_0.AuxInt 2762 x := v.Args[1] 2763 v.reset(OpARMADDconst) 2764 v.AuxInt = c 2765 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2766 v0.AuxInt = d 2767 v0.AddArg(x) 2768 v.AddArg(v0) 2769 return true 2770 } 2771 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 2772 // cond: 2773 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 2774 for { 2775 d := v.AuxInt 2776 _ = v.Args[1] 2777 x := v.Args[0] 2778 v_1 := v.Args[1] 2779 if v_1.Op != OpARMMOVWconst { 2780 break 2781 } 2782 c := v_1.AuxInt 2783 v.reset(OpARMADDconst) 2784 v.AuxInt = int64(int32(c) >> uint64(d)) 2785 v.AddArg(x) 2786 return true 2787 } 2788 return false 2789 } 2790 func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { 2791 b := v.Block 2792 _ = b 2793 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 2794 // cond: 2795 // result: (ADDconst [c] (SRA <x.Type> x y)) 2796 for { 2797 _ = v.Args[2] 2798 v_0 := v.Args[0] 2799 if v_0.Op != OpARMMOVWconst { 2800 break 2801 } 2802 c := v_0.AuxInt 2803 x := v.Args[1] 2804 y := v.Args[2] 2805 v.reset(OpARMADDconst) 2806 v.AuxInt = c 2807 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2808 v0.AddArg(x) 2809 v0.AddArg(y) 2810 v.AddArg(v0) 2811 return true 2812 } 2813 // match: (ADDshiftRAreg x y (MOVWconst [c])) 2814 // cond: 2815 // result: (ADDshiftRA x y [c]) 2816 for { 2817 _ = v.Args[2] 2818 x := v.Args[0] 2819 y := v.Args[1] 2820 v_2 := v.Args[2] 2821 if v_2.Op != OpARMMOVWconst { 2822 break 2823 } 2824 c := v_2.AuxInt 2825 v.reset(OpARMADDshiftRA) 2826 v.AuxInt = c 2827 v.AddArg(x) 2828 v.AddArg(y) 2829 return true 2830 } 2831 return false 2832 } 2833 func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { 2834 b := v.Block 2835 _ = b 2836 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 2837 // cond: 2838 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 2839 for { 2840 d := v.AuxInt 2841 _ = v.Args[1] 2842 v_0 := v.Args[0] 2843 if v_0.Op != OpARMMOVWconst { 2844 break 2845 } 2846 c := v_0.AuxInt 2847 x := v.Args[1] 2848 v.reset(OpARMADDconst) 2849 v.AuxInt = c 2850 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2851 v0.AuxInt = d 2852 v0.AddArg(x) 2853 v.AddArg(v0) 2854 return true 2855 } 2856 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 2857 // cond: 2858 // result: (ADDconst x [int64(uint32(c)>>uint64(d))]) 2859 for { 2860 d := v.AuxInt 2861 _ = v.Args[1] 2862 x := v.Args[0] 2863 v_1 := v.Args[1] 2864 if v_1.Op != OpARMMOVWconst { 2865 break 2866 } 2867 c := v_1.AuxInt 2868 v.reset(OpARMADDconst) 2869 v.AuxInt = int64(uint32(c) >> uint64(d)) 2870 v.AddArg(x) 2871 return true 2872 } 2873 // match: (ADDshiftRL [c] (SLLconst x [32-c]) x) 2874 // cond: 2875 // result: (SRRconst [ c] x) 2876 for { 2877 c := v.AuxInt 2878 _ = v.Args[1] 2879 v_0 := v.Args[0] 2880 if v_0.Op != OpARMSLLconst { 2881 break 2882 } 2883 if v_0.AuxInt != 32-c { 2884 break 2885 } 2886 x := v_0.Args[0] 2887 if x != v.Args[1] { 2888 break 2889 } 2890 v.reset(OpARMSRRconst) 2891 v.AuxInt = c 2892 v.AddArg(x) 2893 return true 2894 } 2895 return false 2896 } 2897 func rewriteValueARM_OpARMADDshiftRLreg_0(v *Value) bool { 2898 b := v.Block 2899 _ = b 2900 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 2901 // cond: 2902 // result: (ADDconst [c] (SRL <x.Type> x y)) 2903 for { 2904 _ = v.Args[2] 2905 v_0 := v.Args[0] 2906 if v_0.Op != OpARMMOVWconst { 2907 break 2908 } 2909 c := v_0.AuxInt 2910 x := v.Args[1] 2911 y := v.Args[2] 2912 v.reset(OpARMADDconst) 2913 v.AuxInt = c 2914 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2915 v0.AddArg(x) 2916 v0.AddArg(y) 2917 v.AddArg(v0) 2918 return true 2919 } 2920 // match: (ADDshiftRLreg x y (MOVWconst [c])) 2921 // cond: 2922 // result: (ADDshiftRL x y [c]) 2923 for { 2924 _ = v.Args[2] 2925 x := v.Args[0] 2926 y := v.Args[1] 2927 v_2 := v.Args[2] 2928 if v_2.Op != OpARMMOVWconst { 2929 break 2930 } 2931 c := v_2.AuxInt 2932 v.reset(OpARMADDshiftRL) 2933 v.AuxInt = c 2934 v.AddArg(x) 2935 v.AddArg(y) 2936 return true 2937 } 2938 return false 2939 } 2940 func rewriteValueARM_OpARMAND_0(v *Value) bool { 2941 // match: (AND x (MOVWconst [c])) 2942 // cond: 2943 // result: (ANDconst [c] x) 2944 for { 2945 _ = v.Args[1] 2946 x := v.Args[0] 2947 v_1 := v.Args[1] 2948 if v_1.Op != OpARMMOVWconst { 2949 break 2950 } 2951 c := v_1.AuxInt 2952 v.reset(OpARMANDconst) 2953 v.AuxInt = c 2954 v.AddArg(x) 2955 return true 2956 } 2957 // match: (AND (MOVWconst [c]) x) 2958 // cond: 2959 // result: (ANDconst [c] x) 2960 for { 2961 _ = v.Args[1] 2962 v_0 := v.Args[0] 2963 if v_0.Op != OpARMMOVWconst { 2964 break 2965 } 2966 c := v_0.AuxInt 2967 x := v.Args[1] 2968 v.reset(OpARMANDconst) 2969 v.AuxInt = c 2970 v.AddArg(x) 2971 return true 2972 } 2973 // match: (AND x (SLLconst [c] y)) 2974 // cond: 2975 // result: (ANDshiftLL x y [c]) 2976 for { 2977 _ = v.Args[1] 2978 x := v.Args[0] 2979 v_1 := v.Args[1] 2980 if v_1.Op != OpARMSLLconst { 2981 break 2982 } 2983 c := v_1.AuxInt 2984 y := v_1.Args[0] 2985 v.reset(OpARMANDshiftLL) 2986 v.AuxInt = c 2987 v.AddArg(x) 2988 v.AddArg(y) 2989 return true 2990 } 2991 // match: (AND (SLLconst [c] y) x) 2992 // cond: 2993 // result: (ANDshiftLL x y [c]) 2994 for { 2995 _ = v.Args[1] 2996 v_0 := v.Args[0] 2997 if v_0.Op != OpARMSLLconst { 2998 break 2999 } 3000 c := v_0.AuxInt 3001 y := v_0.Args[0] 3002 x := v.Args[1] 3003 v.reset(OpARMANDshiftLL) 3004 v.AuxInt = c 3005 v.AddArg(x) 3006 v.AddArg(y) 3007 return true 3008 } 3009 // match: (AND x (SRLconst [c] y)) 3010 // cond: 3011 // result: (ANDshiftRL x y [c]) 3012 for { 3013 _ = v.Args[1] 3014 x := v.Args[0] 3015 v_1 := v.Args[1] 3016 if v_1.Op != OpARMSRLconst { 3017 break 3018 } 3019 c := v_1.AuxInt 3020 y := v_1.Args[0] 3021 v.reset(OpARMANDshiftRL) 3022 v.AuxInt = c 3023 v.AddArg(x) 3024 v.AddArg(y) 3025 return true 3026 } 3027 // match: (AND (SRLconst [c] y) x) 3028 // cond: 3029 // result: (ANDshiftRL x y [c]) 3030 for { 3031 _ = v.Args[1] 3032 v_0 := v.Args[0] 3033 if v_0.Op != OpARMSRLconst { 3034 break 3035 } 3036 c := v_0.AuxInt 3037 y := v_0.Args[0] 3038 x := v.Args[1] 3039 v.reset(OpARMANDshiftRL) 3040 v.AuxInt = c 3041 v.AddArg(x) 3042 v.AddArg(y) 3043 return true 3044 } 3045 // match: (AND x (SRAconst [c] y)) 3046 // cond: 3047 // result: (ANDshiftRA x y [c]) 3048 for { 3049 _ = v.Args[1] 3050 x := v.Args[0] 3051 v_1 := v.Args[1] 3052 if v_1.Op != OpARMSRAconst { 3053 break 3054 } 3055 c := v_1.AuxInt 3056 y := v_1.Args[0] 3057 v.reset(OpARMANDshiftRA) 3058 v.AuxInt = c 3059 v.AddArg(x) 3060 v.AddArg(y) 3061 return true 3062 } 3063 // match: (AND (SRAconst [c] y) x) 3064 // cond: 3065 // result: (ANDshiftRA x y [c]) 3066 for { 3067 _ = v.Args[1] 3068 v_0 := v.Args[0] 3069 if v_0.Op != OpARMSRAconst { 3070 break 3071 } 3072 c := v_0.AuxInt 3073 y := v_0.Args[0] 3074 x := v.Args[1] 3075 v.reset(OpARMANDshiftRA) 3076 v.AuxInt = c 3077 v.AddArg(x) 3078 v.AddArg(y) 3079 return true 3080 } 3081 // match: (AND x (SLL y z)) 3082 // cond: 3083 // result: (ANDshiftLLreg x y z) 3084 for { 3085 _ = v.Args[1] 3086 x := v.Args[0] 3087 v_1 := v.Args[1] 3088 if v_1.Op != OpARMSLL { 3089 break 3090 } 3091 _ = v_1.Args[1] 3092 y := v_1.Args[0] 3093 z := v_1.Args[1] 3094 v.reset(OpARMANDshiftLLreg) 3095 v.AddArg(x) 3096 v.AddArg(y) 3097 v.AddArg(z) 3098 return true 3099 } 3100 // match: (AND (SLL y z) x) 3101 // cond: 3102 // result: (ANDshiftLLreg x y z) 3103 for { 3104 _ = v.Args[1] 3105 v_0 := v.Args[0] 3106 if v_0.Op != OpARMSLL { 3107 break 3108 } 3109 _ = v_0.Args[1] 3110 y := v_0.Args[0] 3111 z := v_0.Args[1] 3112 x := v.Args[1] 3113 v.reset(OpARMANDshiftLLreg) 3114 v.AddArg(x) 3115 v.AddArg(y) 3116 v.AddArg(z) 3117 return true 3118 } 3119 return false 3120 } 3121 func rewriteValueARM_OpARMAND_10(v *Value) bool { 3122 // match: (AND x (SRL y z)) 3123 // cond: 3124 // result: (ANDshiftRLreg x y z) 3125 for { 3126 _ = v.Args[1] 3127 x := v.Args[0] 3128 v_1 := v.Args[1] 3129 if v_1.Op != OpARMSRL { 3130 break 3131 } 3132 _ = v_1.Args[1] 3133 y := v_1.Args[0] 3134 z := v_1.Args[1] 3135 v.reset(OpARMANDshiftRLreg) 3136 v.AddArg(x) 3137 v.AddArg(y) 3138 v.AddArg(z) 3139 return true 3140 } 3141 // match: (AND (SRL y z) x) 3142 // cond: 3143 // result: (ANDshiftRLreg x y z) 3144 for { 3145 _ = v.Args[1] 3146 v_0 := v.Args[0] 3147 if v_0.Op != OpARMSRL { 3148 break 3149 } 3150 _ = v_0.Args[1] 3151 y := v_0.Args[0] 3152 z := v_0.Args[1] 3153 x := v.Args[1] 3154 v.reset(OpARMANDshiftRLreg) 3155 v.AddArg(x) 3156 v.AddArg(y) 3157 v.AddArg(z) 3158 return true 3159 } 3160 // match: (AND x (SRA y z)) 3161 // cond: 3162 // result: (ANDshiftRAreg x y z) 3163 for { 3164 _ = v.Args[1] 3165 x := v.Args[0] 3166 v_1 := v.Args[1] 3167 if v_1.Op != OpARMSRA { 3168 break 3169 } 3170 _ = v_1.Args[1] 3171 y := v_1.Args[0] 3172 z := v_1.Args[1] 3173 v.reset(OpARMANDshiftRAreg) 3174 v.AddArg(x) 3175 v.AddArg(y) 3176 v.AddArg(z) 3177 return true 3178 } 3179 // match: (AND (SRA y z) x) 3180 // cond: 3181 // result: (ANDshiftRAreg x y z) 3182 for { 3183 _ = v.Args[1] 3184 v_0 := v.Args[0] 3185 if v_0.Op != OpARMSRA { 3186 break 3187 } 3188 _ = v_0.Args[1] 3189 y := v_0.Args[0] 3190 z := v_0.Args[1] 3191 x := v.Args[1] 3192 v.reset(OpARMANDshiftRAreg) 3193 v.AddArg(x) 3194 v.AddArg(y) 3195 v.AddArg(z) 3196 return true 3197 } 3198 // match: (AND x x) 3199 // cond: 3200 // result: x 3201 for { 3202 _ = v.Args[1] 3203 x := v.Args[0] 3204 if x != v.Args[1] { 3205 break 3206 } 3207 v.reset(OpCopy) 3208 v.Type = x.Type 3209 v.AddArg(x) 3210 return true 3211 } 3212 // match: (AND x (MVN y)) 3213 // cond: 3214 // result: (BIC x y) 3215 for { 3216 _ = v.Args[1] 3217 x := v.Args[0] 3218 v_1 := v.Args[1] 3219 if v_1.Op != OpARMMVN { 3220 break 3221 } 3222 y := v_1.Args[0] 3223 v.reset(OpARMBIC) 3224 v.AddArg(x) 3225 v.AddArg(y) 3226 return true 3227 } 3228 // match: (AND (MVN y) x) 3229 // cond: 3230 // result: (BIC x y) 3231 for { 3232 _ = v.Args[1] 3233 v_0 := v.Args[0] 3234 if v_0.Op != OpARMMVN { 3235 break 3236 } 3237 y := v_0.Args[0] 3238 x := v.Args[1] 3239 v.reset(OpARMBIC) 3240 v.AddArg(x) 3241 v.AddArg(y) 3242 return true 3243 } 3244 // match: (AND x (MVNshiftLL y [c])) 3245 // cond: 3246 // result: (BICshiftLL x y [c]) 3247 for { 3248 _ = v.Args[1] 3249 x := v.Args[0] 3250 v_1 := v.Args[1] 3251 if v_1.Op != OpARMMVNshiftLL { 3252 break 3253 } 3254 c := v_1.AuxInt 3255 y := v_1.Args[0] 3256 v.reset(OpARMBICshiftLL) 3257 v.AuxInt = c 3258 v.AddArg(x) 3259 v.AddArg(y) 3260 return true 3261 } 3262 // match: (AND (MVNshiftLL y [c]) x) 3263 // cond: 3264 // result: (BICshiftLL x y [c]) 3265 for { 3266 _ = v.Args[1] 3267 v_0 := v.Args[0] 3268 if v_0.Op != OpARMMVNshiftLL { 3269 break 3270 } 3271 c := v_0.AuxInt 3272 y := v_0.Args[0] 3273 x := v.Args[1] 3274 v.reset(OpARMBICshiftLL) 3275 v.AuxInt = c 3276 v.AddArg(x) 3277 v.AddArg(y) 3278 return true 3279 } 3280 // match: (AND x (MVNshiftRL y [c])) 3281 // cond: 3282 // result: (BICshiftRL x y [c]) 3283 for { 3284 _ = v.Args[1] 3285 x := v.Args[0] 3286 v_1 := v.Args[1] 3287 if v_1.Op != OpARMMVNshiftRL { 3288 break 3289 } 3290 c := v_1.AuxInt 3291 y := v_1.Args[0] 3292 v.reset(OpARMBICshiftRL) 3293 v.AuxInt = c 3294 v.AddArg(x) 3295 v.AddArg(y) 3296 return true 3297 } 3298 return false 3299 } 3300 func rewriteValueARM_OpARMAND_20(v *Value) bool { 3301 // match: (AND (MVNshiftRL y [c]) x) 3302 // cond: 3303 // result: (BICshiftRL x y [c]) 3304 for { 3305 _ = v.Args[1] 3306 v_0 := v.Args[0] 3307 if v_0.Op != OpARMMVNshiftRL { 3308 break 3309 } 3310 c := v_0.AuxInt 3311 y := v_0.Args[0] 3312 x := v.Args[1] 3313 v.reset(OpARMBICshiftRL) 3314 v.AuxInt = c 3315 v.AddArg(x) 3316 v.AddArg(y) 3317 return true 3318 } 3319 // match: (AND x (MVNshiftRA y [c])) 3320 // cond: 3321 // result: (BICshiftRA x y [c]) 3322 for { 3323 _ = v.Args[1] 3324 x := v.Args[0] 3325 v_1 := v.Args[1] 3326 if v_1.Op != OpARMMVNshiftRA { 3327 break 3328 } 3329 c := v_1.AuxInt 3330 y := v_1.Args[0] 3331 v.reset(OpARMBICshiftRA) 3332 v.AuxInt = c 3333 v.AddArg(x) 3334 v.AddArg(y) 3335 return true 3336 } 3337 // match: (AND (MVNshiftRA y [c]) x) 3338 // cond: 3339 // result: (BICshiftRA x y [c]) 3340 for { 3341 _ = v.Args[1] 3342 v_0 := v.Args[0] 3343 if v_0.Op != OpARMMVNshiftRA { 3344 break 3345 } 3346 c := v_0.AuxInt 3347 y := v_0.Args[0] 3348 x := v.Args[1] 3349 v.reset(OpARMBICshiftRA) 3350 v.AuxInt = c 3351 v.AddArg(x) 3352 v.AddArg(y) 3353 return true 3354 } 3355 return false 3356 } 3357 func rewriteValueARM_OpARMANDconst_0(v *Value) bool { 3358 // match: (ANDconst [0] _) 3359 // cond: 3360 // result: (MOVWconst [0]) 3361 for { 3362 if v.AuxInt != 0 { 3363 break 3364 } 3365 v.reset(OpARMMOVWconst) 3366 v.AuxInt = 0 3367 return true 3368 } 3369 // match: (ANDconst [c] x) 3370 // cond: int32(c)==-1 3371 // result: x 3372 for { 3373 c := v.AuxInt 3374 x := v.Args[0] 3375 if !(int32(c) == -1) { 3376 break 3377 } 3378 v.reset(OpCopy) 3379 v.Type = x.Type 3380 v.AddArg(x) 3381 return true 3382 } 3383 // match: (ANDconst [c] x) 3384 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3385 // result: (BICconst [int64(^uint32(c))] x) 3386 for { 3387 c := v.AuxInt 3388 x := v.Args[0] 3389 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3390 break 3391 } 3392 v.reset(OpARMBICconst) 3393 v.AuxInt = int64(^uint32(c)) 3394 v.AddArg(x) 3395 return true 3396 } 3397 // match: (ANDconst [c] (MOVWconst [d])) 3398 // cond: 3399 // result: (MOVWconst [c&d]) 3400 for { 3401 c := v.AuxInt 3402 v_0 := v.Args[0] 3403 if v_0.Op != OpARMMOVWconst { 3404 break 3405 } 3406 d := v_0.AuxInt 3407 v.reset(OpARMMOVWconst) 3408 v.AuxInt = c & d 3409 return true 3410 } 3411 // match: (ANDconst [c] (ANDconst [d] x)) 3412 // cond: 3413 // result: (ANDconst [c&d] x) 3414 for { 3415 c := v.AuxInt 3416 v_0 := v.Args[0] 3417 if v_0.Op != OpARMANDconst { 3418 break 3419 } 3420 d := v_0.AuxInt 3421 x := v_0.Args[0] 3422 v.reset(OpARMANDconst) 3423 v.AuxInt = c & d 3424 v.AddArg(x) 3425 return true 3426 } 3427 return false 3428 } 3429 func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { 3430 b := v.Block 3431 _ = b 3432 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 3433 // cond: 3434 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 3435 for { 3436 d := v.AuxInt 3437 _ = v.Args[1] 3438 v_0 := v.Args[0] 3439 if v_0.Op != OpARMMOVWconst { 3440 break 3441 } 3442 c := v_0.AuxInt 3443 x := v.Args[1] 3444 v.reset(OpARMANDconst) 3445 v.AuxInt = c 3446 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3447 v0.AuxInt = d 3448 v0.AddArg(x) 3449 v.AddArg(v0) 3450 return true 3451 } 3452 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 3453 // cond: 3454 // result: (ANDconst x [int64(uint32(c)<<uint64(d))]) 3455 for { 3456 d := v.AuxInt 3457 _ = v.Args[1] 3458 x := v.Args[0] 3459 v_1 := v.Args[1] 3460 if v_1.Op != OpARMMOVWconst { 3461 break 3462 } 3463 c := v_1.AuxInt 3464 v.reset(OpARMANDconst) 3465 v.AuxInt = int64(uint32(c) << uint64(d)) 3466 v.AddArg(x) 3467 return true 3468 } 3469 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 3470 // cond: c==d 3471 // result: y 3472 for { 3473 d := v.AuxInt 3474 _ = v.Args[1] 3475 x := v.Args[0] 3476 y := v.Args[1] 3477 if y.Op != OpARMSLLconst { 3478 break 3479 } 3480 c := y.AuxInt 3481 if x != y.Args[0] { 3482 break 3483 } 3484 if !(c == d) { 3485 break 3486 } 3487 v.reset(OpCopy) 3488 v.Type = y.Type 3489 v.AddArg(y) 3490 return true 3491 } 3492 return false 3493 } 3494 func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { 3495 b := v.Block 3496 _ = b 3497 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 3498 // cond: 3499 // result: (ANDconst [c] (SLL <x.Type> x y)) 3500 for { 3501 _ = v.Args[2] 3502 v_0 := v.Args[0] 3503 if v_0.Op != OpARMMOVWconst { 3504 break 3505 } 3506 c := v_0.AuxInt 3507 x := v.Args[1] 3508 y := v.Args[2] 3509 v.reset(OpARMANDconst) 3510 v.AuxInt = c 3511 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3512 v0.AddArg(x) 3513 v0.AddArg(y) 3514 v.AddArg(v0) 3515 return true 3516 } 3517 // match: (ANDshiftLLreg x y (MOVWconst [c])) 3518 // cond: 3519 // result: (ANDshiftLL x y [c]) 3520 for { 3521 _ = v.Args[2] 3522 x := v.Args[0] 3523 y := v.Args[1] 3524 v_2 := v.Args[2] 3525 if v_2.Op != OpARMMOVWconst { 3526 break 3527 } 3528 c := v_2.AuxInt 3529 v.reset(OpARMANDshiftLL) 3530 v.AuxInt = c 3531 v.AddArg(x) 3532 v.AddArg(y) 3533 return true 3534 } 3535 return false 3536 } 3537 func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { 3538 b := v.Block 3539 _ = b 3540 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 3541 // cond: 3542 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 3543 for { 3544 d := v.AuxInt 3545 _ = v.Args[1] 3546 v_0 := v.Args[0] 3547 if v_0.Op != OpARMMOVWconst { 3548 break 3549 } 3550 c := v_0.AuxInt 3551 x := v.Args[1] 3552 v.reset(OpARMANDconst) 3553 v.AuxInt = c 3554 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3555 v0.AuxInt = d 3556 v0.AddArg(x) 3557 v.AddArg(v0) 3558 return true 3559 } 3560 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3561 // cond: 3562 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3563 for { 3564 d := v.AuxInt 3565 _ = v.Args[1] 3566 x := v.Args[0] 3567 v_1 := v.Args[1] 3568 if v_1.Op != OpARMMOVWconst { 3569 break 3570 } 3571 c := v_1.AuxInt 3572 v.reset(OpARMANDconst) 3573 v.AuxInt = int64(int32(c) >> uint64(d)) 3574 v.AddArg(x) 3575 return true 3576 } 3577 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3578 // cond: c==d 3579 // result: y 3580 for { 3581 d := v.AuxInt 3582 _ = v.Args[1] 3583 x := v.Args[0] 3584 y := v.Args[1] 3585 if y.Op != OpARMSRAconst { 3586 break 3587 } 3588 c := y.AuxInt 3589 if x != y.Args[0] { 3590 break 3591 } 3592 if !(c == d) { 3593 break 3594 } 3595 v.reset(OpCopy) 3596 v.Type = y.Type 3597 v.AddArg(y) 3598 return true 3599 } 3600 return false 3601 } 3602 func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { 3603 b := v.Block 3604 _ = b 3605 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3606 // cond: 3607 // result: (ANDconst [c] (SRA <x.Type> x y)) 3608 for { 3609 _ = v.Args[2] 3610 v_0 := v.Args[0] 3611 if v_0.Op != OpARMMOVWconst { 3612 break 3613 } 3614 c := v_0.AuxInt 3615 x := v.Args[1] 3616 y := v.Args[2] 3617 v.reset(OpARMANDconst) 3618 v.AuxInt = c 3619 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3620 v0.AddArg(x) 3621 v0.AddArg(y) 3622 v.AddArg(v0) 3623 return true 3624 } 3625 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3626 // cond: 3627 // result: (ANDshiftRA x y [c]) 3628 for { 3629 _ = v.Args[2] 3630 x := v.Args[0] 3631 y := v.Args[1] 3632 v_2 := v.Args[2] 3633 if v_2.Op != OpARMMOVWconst { 3634 break 3635 } 3636 c := v_2.AuxInt 3637 v.reset(OpARMANDshiftRA) 3638 v.AuxInt = c 3639 v.AddArg(x) 3640 v.AddArg(y) 3641 return true 3642 } 3643 return false 3644 } 3645 func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { 3646 b := v.Block 3647 _ = b 3648 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3649 // cond: 3650 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3651 for { 3652 d := v.AuxInt 3653 _ = v.Args[1] 3654 v_0 := v.Args[0] 3655 if v_0.Op != OpARMMOVWconst { 3656 break 3657 } 3658 c := v_0.AuxInt 3659 x := v.Args[1] 3660 v.reset(OpARMANDconst) 3661 v.AuxInt = c 3662 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3663 v0.AuxInt = d 3664 v0.AddArg(x) 3665 v.AddArg(v0) 3666 return true 3667 } 3668 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3669 // cond: 3670 // result: (ANDconst x [int64(uint32(c)>>uint64(d))]) 3671 for { 3672 d := v.AuxInt 3673 _ = v.Args[1] 3674 x := v.Args[0] 3675 v_1 := v.Args[1] 3676 if v_1.Op != OpARMMOVWconst { 3677 break 3678 } 3679 c := v_1.AuxInt 3680 v.reset(OpARMANDconst) 3681 v.AuxInt = int64(uint32(c) >> uint64(d)) 3682 v.AddArg(x) 3683 return true 3684 } 3685 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3686 // cond: c==d 3687 // result: y 3688 for { 3689 d := v.AuxInt 3690 _ = v.Args[1] 3691 x := v.Args[0] 3692 y := v.Args[1] 3693 if y.Op != OpARMSRLconst { 3694 break 3695 } 3696 c := y.AuxInt 3697 if x != y.Args[0] { 3698 break 3699 } 3700 if !(c == d) { 3701 break 3702 } 3703 v.reset(OpCopy) 3704 v.Type = y.Type 3705 v.AddArg(y) 3706 return true 3707 } 3708 return false 3709 } 3710 func rewriteValueARM_OpARMANDshiftRLreg_0(v *Value) bool { 3711 b := v.Block 3712 _ = b 3713 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 3714 // cond: 3715 // result: (ANDconst [c] (SRL <x.Type> x y)) 3716 for { 3717 _ = v.Args[2] 3718 v_0 := v.Args[0] 3719 if v_0.Op != OpARMMOVWconst { 3720 break 3721 } 3722 c := v_0.AuxInt 3723 x := v.Args[1] 3724 y := v.Args[2] 3725 v.reset(OpARMANDconst) 3726 v.AuxInt = c 3727 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3728 v0.AddArg(x) 3729 v0.AddArg(y) 3730 v.AddArg(v0) 3731 return true 3732 } 3733 // match: (ANDshiftRLreg x y (MOVWconst [c])) 3734 // cond: 3735 // result: (ANDshiftRL x y [c]) 3736 for { 3737 _ = v.Args[2] 3738 x := v.Args[0] 3739 y := v.Args[1] 3740 v_2 := v.Args[2] 3741 if v_2.Op != OpARMMOVWconst { 3742 break 3743 } 3744 c := v_2.AuxInt 3745 v.reset(OpARMANDshiftRL) 3746 v.AuxInt = c 3747 v.AddArg(x) 3748 v.AddArg(y) 3749 return true 3750 } 3751 return false 3752 } 3753 func rewriteValueARM_OpARMBIC_0(v *Value) bool { 3754 // match: (BIC x (MOVWconst [c])) 3755 // cond: 3756 // result: (BICconst [c] x) 3757 for { 3758 _ = v.Args[1] 3759 x := v.Args[0] 3760 v_1 := v.Args[1] 3761 if v_1.Op != OpARMMOVWconst { 3762 break 3763 } 3764 c := v_1.AuxInt 3765 v.reset(OpARMBICconst) 3766 v.AuxInt = c 3767 v.AddArg(x) 3768 return true 3769 } 3770 // match: (BIC x (SLLconst [c] y)) 3771 // cond: 3772 // result: (BICshiftLL x y [c]) 3773 for { 3774 _ = v.Args[1] 3775 x := v.Args[0] 3776 v_1 := v.Args[1] 3777 if v_1.Op != OpARMSLLconst { 3778 break 3779 } 3780 c := v_1.AuxInt 3781 y := v_1.Args[0] 3782 v.reset(OpARMBICshiftLL) 3783 v.AuxInt = c 3784 v.AddArg(x) 3785 v.AddArg(y) 3786 return true 3787 } 3788 // match: (BIC x (SRLconst [c] y)) 3789 // cond: 3790 // result: (BICshiftRL x y [c]) 3791 for { 3792 _ = v.Args[1] 3793 x := v.Args[0] 3794 v_1 := v.Args[1] 3795 if v_1.Op != OpARMSRLconst { 3796 break 3797 } 3798 c := v_1.AuxInt 3799 y := v_1.Args[0] 3800 v.reset(OpARMBICshiftRL) 3801 v.AuxInt = c 3802 v.AddArg(x) 3803 v.AddArg(y) 3804 return true 3805 } 3806 // match: (BIC x (SRAconst [c] y)) 3807 // cond: 3808 // result: (BICshiftRA x y [c]) 3809 for { 3810 _ = v.Args[1] 3811 x := v.Args[0] 3812 v_1 := v.Args[1] 3813 if v_1.Op != OpARMSRAconst { 3814 break 3815 } 3816 c := v_1.AuxInt 3817 y := v_1.Args[0] 3818 v.reset(OpARMBICshiftRA) 3819 v.AuxInt = c 3820 v.AddArg(x) 3821 v.AddArg(y) 3822 return true 3823 } 3824 // match: (BIC x (SLL y z)) 3825 // cond: 3826 // result: (BICshiftLLreg x y z) 3827 for { 3828 _ = v.Args[1] 3829 x := v.Args[0] 3830 v_1 := v.Args[1] 3831 if v_1.Op != OpARMSLL { 3832 break 3833 } 3834 _ = v_1.Args[1] 3835 y := v_1.Args[0] 3836 z := v_1.Args[1] 3837 v.reset(OpARMBICshiftLLreg) 3838 v.AddArg(x) 3839 v.AddArg(y) 3840 v.AddArg(z) 3841 return true 3842 } 3843 // match: (BIC x (SRL y z)) 3844 // cond: 3845 // result: (BICshiftRLreg x y z) 3846 for { 3847 _ = v.Args[1] 3848 x := v.Args[0] 3849 v_1 := v.Args[1] 3850 if v_1.Op != OpARMSRL { 3851 break 3852 } 3853 _ = v_1.Args[1] 3854 y := v_1.Args[0] 3855 z := v_1.Args[1] 3856 v.reset(OpARMBICshiftRLreg) 3857 v.AddArg(x) 3858 v.AddArg(y) 3859 v.AddArg(z) 3860 return true 3861 } 3862 // match: (BIC x (SRA y z)) 3863 // cond: 3864 // result: (BICshiftRAreg x y z) 3865 for { 3866 _ = v.Args[1] 3867 x := v.Args[0] 3868 v_1 := v.Args[1] 3869 if v_1.Op != OpARMSRA { 3870 break 3871 } 3872 _ = v_1.Args[1] 3873 y := v_1.Args[0] 3874 z := v_1.Args[1] 3875 v.reset(OpARMBICshiftRAreg) 3876 v.AddArg(x) 3877 v.AddArg(y) 3878 v.AddArg(z) 3879 return true 3880 } 3881 // match: (BIC x x) 3882 // cond: 3883 // result: (MOVWconst [0]) 3884 for { 3885 _ = v.Args[1] 3886 x := v.Args[0] 3887 if x != v.Args[1] { 3888 break 3889 } 3890 v.reset(OpARMMOVWconst) 3891 v.AuxInt = 0 3892 return true 3893 } 3894 return false 3895 } 3896 func rewriteValueARM_OpARMBICconst_0(v *Value) bool { 3897 // match: (BICconst [0] x) 3898 // cond: 3899 // result: x 3900 for { 3901 if v.AuxInt != 0 { 3902 break 3903 } 3904 x := v.Args[0] 3905 v.reset(OpCopy) 3906 v.Type = x.Type 3907 v.AddArg(x) 3908 return true 3909 } 3910 // match: (BICconst [c] _) 3911 // cond: int32(c)==-1 3912 // result: (MOVWconst [0]) 3913 for { 3914 c := v.AuxInt 3915 if !(int32(c) == -1) { 3916 break 3917 } 3918 v.reset(OpARMMOVWconst) 3919 v.AuxInt = 0 3920 return true 3921 } 3922 // match: (BICconst [c] x) 3923 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3924 // result: (ANDconst [int64(^uint32(c))] x) 3925 for { 3926 c := v.AuxInt 3927 x := v.Args[0] 3928 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3929 break 3930 } 3931 v.reset(OpARMANDconst) 3932 v.AuxInt = int64(^uint32(c)) 3933 v.AddArg(x) 3934 return true 3935 } 3936 // match: (BICconst [c] (MOVWconst [d])) 3937 // cond: 3938 // result: (MOVWconst [d&^c]) 3939 for { 3940 c := v.AuxInt 3941 v_0 := v.Args[0] 3942 if v_0.Op != OpARMMOVWconst { 3943 break 3944 } 3945 d := v_0.AuxInt 3946 v.reset(OpARMMOVWconst) 3947 v.AuxInt = d &^ c 3948 return true 3949 } 3950 // match: (BICconst [c] (BICconst [d] x)) 3951 // cond: 3952 // result: (BICconst [int64(int32(c|d))] x) 3953 for { 3954 c := v.AuxInt 3955 v_0 := v.Args[0] 3956 if v_0.Op != OpARMBICconst { 3957 break 3958 } 3959 d := v_0.AuxInt 3960 x := v_0.Args[0] 3961 v.reset(OpARMBICconst) 3962 v.AuxInt = int64(int32(c | d)) 3963 v.AddArg(x) 3964 return true 3965 } 3966 return false 3967 } 3968 func rewriteValueARM_OpARMBICshiftLL_0(v *Value) bool { 3969 // match: (BICshiftLL x (MOVWconst [c]) [d]) 3970 // cond: 3971 // result: (BICconst x [int64(uint32(c)<<uint64(d))]) 3972 for { 3973 d := v.AuxInt 3974 _ = v.Args[1] 3975 x := v.Args[0] 3976 v_1 := v.Args[1] 3977 if v_1.Op != OpARMMOVWconst { 3978 break 3979 } 3980 c := v_1.AuxInt 3981 v.reset(OpARMBICconst) 3982 v.AuxInt = int64(uint32(c) << uint64(d)) 3983 v.AddArg(x) 3984 return true 3985 } 3986 // match: (BICshiftLL x (SLLconst x [c]) [d]) 3987 // cond: c==d 3988 // result: (MOVWconst [0]) 3989 for { 3990 d := v.AuxInt 3991 _ = v.Args[1] 3992 x := v.Args[0] 3993 v_1 := v.Args[1] 3994 if v_1.Op != OpARMSLLconst { 3995 break 3996 } 3997 c := v_1.AuxInt 3998 if x != v_1.Args[0] { 3999 break 4000 } 4001 if !(c == d) { 4002 break 4003 } 4004 v.reset(OpARMMOVWconst) 4005 v.AuxInt = 0 4006 return true 4007 } 4008 return false 4009 } 4010 func rewriteValueARM_OpARMBICshiftLLreg_0(v *Value) bool { 4011 // match: (BICshiftLLreg x y (MOVWconst [c])) 4012 // cond: 4013 // result: (BICshiftLL x y [c]) 4014 for { 4015 _ = v.Args[2] 4016 x := v.Args[0] 4017 y := v.Args[1] 4018 v_2 := v.Args[2] 4019 if v_2.Op != OpARMMOVWconst { 4020 break 4021 } 4022 c := v_2.AuxInt 4023 v.reset(OpARMBICshiftLL) 4024 v.AuxInt = c 4025 v.AddArg(x) 4026 v.AddArg(y) 4027 return true 4028 } 4029 return false 4030 } 4031 func rewriteValueARM_OpARMBICshiftRA_0(v *Value) bool { 4032 // match: (BICshiftRA x (MOVWconst [c]) [d]) 4033 // cond: 4034 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 4035 for { 4036 d := v.AuxInt 4037 _ = v.Args[1] 4038 x := v.Args[0] 4039 v_1 := v.Args[1] 4040 if v_1.Op != OpARMMOVWconst { 4041 break 4042 } 4043 c := v_1.AuxInt 4044 v.reset(OpARMBICconst) 4045 v.AuxInt = int64(int32(c) >> uint64(d)) 4046 v.AddArg(x) 4047 return true 4048 } 4049 // match: (BICshiftRA x (SRAconst x [c]) [d]) 4050 // cond: c==d 4051 // result: (MOVWconst [0]) 4052 for { 4053 d := v.AuxInt 4054 _ = v.Args[1] 4055 x := v.Args[0] 4056 v_1 := v.Args[1] 4057 if v_1.Op != OpARMSRAconst { 4058 break 4059 } 4060 c := v_1.AuxInt 4061 if x != v_1.Args[0] { 4062 break 4063 } 4064 if !(c == d) { 4065 break 4066 } 4067 v.reset(OpARMMOVWconst) 4068 v.AuxInt = 0 4069 return true 4070 } 4071 return false 4072 } 4073 func rewriteValueARM_OpARMBICshiftRAreg_0(v *Value) bool { 4074 // match: (BICshiftRAreg x y (MOVWconst [c])) 4075 // cond: 4076 // result: (BICshiftRA x y [c]) 4077 for { 4078 _ = v.Args[2] 4079 x := v.Args[0] 4080 y := v.Args[1] 4081 v_2 := v.Args[2] 4082 if v_2.Op != OpARMMOVWconst { 4083 break 4084 } 4085 c := v_2.AuxInt 4086 v.reset(OpARMBICshiftRA) 4087 v.AuxInt = c 4088 v.AddArg(x) 4089 v.AddArg(y) 4090 return true 4091 } 4092 return false 4093 } 4094 func rewriteValueARM_OpARMBICshiftRL_0(v *Value) bool { 4095 // match: (BICshiftRL x (MOVWconst [c]) [d]) 4096 // cond: 4097 // result: (BICconst x [int64(uint32(c)>>uint64(d))]) 4098 for { 4099 d := v.AuxInt 4100 _ = v.Args[1] 4101 x := v.Args[0] 4102 v_1 := v.Args[1] 4103 if v_1.Op != OpARMMOVWconst { 4104 break 4105 } 4106 c := v_1.AuxInt 4107 v.reset(OpARMBICconst) 4108 v.AuxInt = int64(uint32(c) >> uint64(d)) 4109 v.AddArg(x) 4110 return true 4111 } 4112 // match: (BICshiftRL x (SRLconst x [c]) [d]) 4113 // cond: c==d 4114 // result: (MOVWconst [0]) 4115 for { 4116 d := v.AuxInt 4117 _ = v.Args[1] 4118 x := v.Args[0] 4119 v_1 := v.Args[1] 4120 if v_1.Op != OpARMSRLconst { 4121 break 4122 } 4123 c := v_1.AuxInt 4124 if x != v_1.Args[0] { 4125 break 4126 } 4127 if !(c == d) { 4128 break 4129 } 4130 v.reset(OpARMMOVWconst) 4131 v.AuxInt = 0 4132 return true 4133 } 4134 return false 4135 } 4136 func rewriteValueARM_OpARMBICshiftRLreg_0(v *Value) bool { 4137 // match: (BICshiftRLreg x y (MOVWconst [c])) 4138 // cond: 4139 // result: (BICshiftRL x y [c]) 4140 for { 4141 _ = v.Args[2] 4142 x := v.Args[0] 4143 y := v.Args[1] 4144 v_2 := v.Args[2] 4145 if v_2.Op != OpARMMOVWconst { 4146 break 4147 } 4148 c := v_2.AuxInt 4149 v.reset(OpARMBICshiftRL) 4150 v.AuxInt = c 4151 v.AddArg(x) 4152 v.AddArg(y) 4153 return true 4154 } 4155 return false 4156 } 4157 func rewriteValueARM_OpARMCMOVWHSconst_0(v *Value) bool { 4158 // match: (CMOVWHSconst _ (FlagEQ) [c]) 4159 // cond: 4160 // result: (MOVWconst [c]) 4161 for { 4162 c := v.AuxInt 4163 _ = v.Args[1] 4164 v_1 := v.Args[1] 4165 if v_1.Op != OpARMFlagEQ { 4166 break 4167 } 4168 v.reset(OpARMMOVWconst) 4169 v.AuxInt = c 4170 return true 4171 } 4172 // match: (CMOVWHSconst x (FlagLT_ULT)) 4173 // cond: 4174 // result: x 4175 for { 4176 _ = v.Args[1] 4177 x := v.Args[0] 4178 v_1 := v.Args[1] 4179 if v_1.Op != OpARMFlagLT_ULT { 4180 break 4181 } 4182 v.reset(OpCopy) 4183 v.Type = x.Type 4184 v.AddArg(x) 4185 return true 4186 } 4187 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 4188 // cond: 4189 // result: (MOVWconst [c]) 4190 for { 4191 c := v.AuxInt 4192 _ = v.Args[1] 4193 v_1 := v.Args[1] 4194 if v_1.Op != OpARMFlagLT_UGT { 4195 break 4196 } 4197 v.reset(OpARMMOVWconst) 4198 v.AuxInt = c 4199 return true 4200 } 4201 // match: (CMOVWHSconst x (FlagGT_ULT)) 4202 // cond: 4203 // result: x 4204 for { 4205 _ = v.Args[1] 4206 x := v.Args[0] 4207 v_1 := v.Args[1] 4208 if v_1.Op != OpARMFlagGT_ULT { 4209 break 4210 } 4211 v.reset(OpCopy) 4212 v.Type = x.Type 4213 v.AddArg(x) 4214 return true 4215 } 4216 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 4217 // cond: 4218 // result: (MOVWconst [c]) 4219 for { 4220 c := v.AuxInt 4221 _ = v.Args[1] 4222 v_1 := v.Args[1] 4223 if v_1.Op != OpARMFlagGT_UGT { 4224 break 4225 } 4226 v.reset(OpARMMOVWconst) 4227 v.AuxInt = c 4228 return true 4229 } 4230 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 4231 // cond: 4232 // result: (CMOVWLSconst x flags [c]) 4233 for { 4234 c := v.AuxInt 4235 _ = v.Args[1] 4236 x := v.Args[0] 4237 v_1 := v.Args[1] 4238 if v_1.Op != OpARMInvertFlags { 4239 break 4240 } 4241 flags := v_1.Args[0] 4242 v.reset(OpARMCMOVWLSconst) 4243 v.AuxInt = c 4244 v.AddArg(x) 4245 v.AddArg(flags) 4246 return true 4247 } 4248 return false 4249 } 4250 func rewriteValueARM_OpARMCMOVWLSconst_0(v *Value) bool { 4251 // match: (CMOVWLSconst _ (FlagEQ) [c]) 4252 // cond: 4253 // result: (MOVWconst [c]) 4254 for { 4255 c := v.AuxInt 4256 _ = v.Args[1] 4257 v_1 := v.Args[1] 4258 if v_1.Op != OpARMFlagEQ { 4259 break 4260 } 4261 v.reset(OpARMMOVWconst) 4262 v.AuxInt = c 4263 return true 4264 } 4265 // match: (CMOVWLSconst _ (FlagLT_ULT) [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 != OpARMFlagLT_ULT { 4273 break 4274 } 4275 v.reset(OpARMMOVWconst) 4276 v.AuxInt = c 4277 return true 4278 } 4279 // match: (CMOVWLSconst x (FlagLT_UGT)) 4280 // cond: 4281 // result: x 4282 for { 4283 _ = v.Args[1] 4284 x := v.Args[0] 4285 v_1 := v.Args[1] 4286 if v_1.Op != OpARMFlagLT_UGT { 4287 break 4288 } 4289 v.reset(OpCopy) 4290 v.Type = x.Type 4291 v.AddArg(x) 4292 return true 4293 } 4294 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 4295 // cond: 4296 // result: (MOVWconst [c]) 4297 for { 4298 c := v.AuxInt 4299 _ = v.Args[1] 4300 v_1 := v.Args[1] 4301 if v_1.Op != OpARMFlagGT_ULT { 4302 break 4303 } 4304 v.reset(OpARMMOVWconst) 4305 v.AuxInt = c 4306 return true 4307 } 4308 // match: (CMOVWLSconst x (FlagGT_UGT)) 4309 // cond: 4310 // result: x 4311 for { 4312 _ = v.Args[1] 4313 x := v.Args[0] 4314 v_1 := v.Args[1] 4315 if v_1.Op != OpARMFlagGT_UGT { 4316 break 4317 } 4318 v.reset(OpCopy) 4319 v.Type = x.Type 4320 v.AddArg(x) 4321 return true 4322 } 4323 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 4324 // cond: 4325 // result: (CMOVWHSconst x flags [c]) 4326 for { 4327 c := v.AuxInt 4328 _ = v.Args[1] 4329 x := v.Args[0] 4330 v_1 := v.Args[1] 4331 if v_1.Op != OpARMInvertFlags { 4332 break 4333 } 4334 flags := v_1.Args[0] 4335 v.reset(OpARMCMOVWHSconst) 4336 v.AuxInt = c 4337 v.AddArg(x) 4338 v.AddArg(flags) 4339 return true 4340 } 4341 return false 4342 } 4343 func rewriteValueARM_OpARMCMP_0(v *Value) bool { 4344 b := v.Block 4345 _ = b 4346 // match: (CMP x (MOVWconst [c])) 4347 // cond: 4348 // result: (CMPconst [c] x) 4349 for { 4350 _ = v.Args[1] 4351 x := v.Args[0] 4352 v_1 := v.Args[1] 4353 if v_1.Op != OpARMMOVWconst { 4354 break 4355 } 4356 c := v_1.AuxInt 4357 v.reset(OpARMCMPconst) 4358 v.AuxInt = c 4359 v.AddArg(x) 4360 return true 4361 } 4362 // match: (CMP (MOVWconst [c]) x) 4363 // cond: 4364 // result: (InvertFlags (CMPconst [c] x)) 4365 for { 4366 _ = v.Args[1] 4367 v_0 := v.Args[0] 4368 if v_0.Op != OpARMMOVWconst { 4369 break 4370 } 4371 c := v_0.AuxInt 4372 x := v.Args[1] 4373 v.reset(OpARMInvertFlags) 4374 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4375 v0.AuxInt = c 4376 v0.AddArg(x) 4377 v.AddArg(v0) 4378 return true 4379 } 4380 // match: (CMP x (SLLconst [c] y)) 4381 // cond: 4382 // result: (CMPshiftLL x y [c]) 4383 for { 4384 _ = v.Args[1] 4385 x := v.Args[0] 4386 v_1 := v.Args[1] 4387 if v_1.Op != OpARMSLLconst { 4388 break 4389 } 4390 c := v_1.AuxInt 4391 y := v_1.Args[0] 4392 v.reset(OpARMCMPshiftLL) 4393 v.AuxInt = c 4394 v.AddArg(x) 4395 v.AddArg(y) 4396 return true 4397 } 4398 // match: (CMP (SLLconst [c] y) x) 4399 // cond: 4400 // result: (InvertFlags (CMPshiftLL x y [c])) 4401 for { 4402 _ = v.Args[1] 4403 v_0 := v.Args[0] 4404 if v_0.Op != OpARMSLLconst { 4405 break 4406 } 4407 c := v_0.AuxInt 4408 y := v_0.Args[0] 4409 x := v.Args[1] 4410 v.reset(OpARMInvertFlags) 4411 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 4412 v0.AuxInt = c 4413 v0.AddArg(x) 4414 v0.AddArg(y) 4415 v.AddArg(v0) 4416 return true 4417 } 4418 // match: (CMP x (SRLconst [c] y)) 4419 // cond: 4420 // result: (CMPshiftRL x y [c]) 4421 for { 4422 _ = v.Args[1] 4423 x := v.Args[0] 4424 v_1 := v.Args[1] 4425 if v_1.Op != OpARMSRLconst { 4426 break 4427 } 4428 c := v_1.AuxInt 4429 y := v_1.Args[0] 4430 v.reset(OpARMCMPshiftRL) 4431 v.AuxInt = c 4432 v.AddArg(x) 4433 v.AddArg(y) 4434 return true 4435 } 4436 // match: (CMP (SRLconst [c] y) x) 4437 // cond: 4438 // result: (InvertFlags (CMPshiftRL x y [c])) 4439 for { 4440 _ = v.Args[1] 4441 v_0 := v.Args[0] 4442 if v_0.Op != OpARMSRLconst { 4443 break 4444 } 4445 c := v_0.AuxInt 4446 y := v_0.Args[0] 4447 x := v.Args[1] 4448 v.reset(OpARMInvertFlags) 4449 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 4450 v0.AuxInt = c 4451 v0.AddArg(x) 4452 v0.AddArg(y) 4453 v.AddArg(v0) 4454 return true 4455 } 4456 // match: (CMP x (SRAconst [c] y)) 4457 // cond: 4458 // result: (CMPshiftRA x y [c]) 4459 for { 4460 _ = v.Args[1] 4461 x := v.Args[0] 4462 v_1 := v.Args[1] 4463 if v_1.Op != OpARMSRAconst { 4464 break 4465 } 4466 c := v_1.AuxInt 4467 y := v_1.Args[0] 4468 v.reset(OpARMCMPshiftRA) 4469 v.AuxInt = c 4470 v.AddArg(x) 4471 v.AddArg(y) 4472 return true 4473 } 4474 // match: (CMP (SRAconst [c] y) x) 4475 // cond: 4476 // result: (InvertFlags (CMPshiftRA x y [c])) 4477 for { 4478 _ = v.Args[1] 4479 v_0 := v.Args[0] 4480 if v_0.Op != OpARMSRAconst { 4481 break 4482 } 4483 c := v_0.AuxInt 4484 y := v_0.Args[0] 4485 x := v.Args[1] 4486 v.reset(OpARMInvertFlags) 4487 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 4488 v0.AuxInt = c 4489 v0.AddArg(x) 4490 v0.AddArg(y) 4491 v.AddArg(v0) 4492 return true 4493 } 4494 // match: (CMP x (SLL y z)) 4495 // cond: 4496 // result: (CMPshiftLLreg x y z) 4497 for { 4498 _ = v.Args[1] 4499 x := v.Args[0] 4500 v_1 := v.Args[1] 4501 if v_1.Op != OpARMSLL { 4502 break 4503 } 4504 _ = v_1.Args[1] 4505 y := v_1.Args[0] 4506 z := v_1.Args[1] 4507 v.reset(OpARMCMPshiftLLreg) 4508 v.AddArg(x) 4509 v.AddArg(y) 4510 v.AddArg(z) 4511 return true 4512 } 4513 // match: (CMP (SLL y z) x) 4514 // cond: 4515 // result: (InvertFlags (CMPshiftLLreg x y z)) 4516 for { 4517 _ = v.Args[1] 4518 v_0 := v.Args[0] 4519 if v_0.Op != OpARMSLL { 4520 break 4521 } 4522 _ = v_0.Args[1] 4523 y := v_0.Args[0] 4524 z := v_0.Args[1] 4525 x := v.Args[1] 4526 v.reset(OpARMInvertFlags) 4527 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 4528 v0.AddArg(x) 4529 v0.AddArg(y) 4530 v0.AddArg(z) 4531 v.AddArg(v0) 4532 return true 4533 } 4534 return false 4535 } 4536 func rewriteValueARM_OpARMCMP_10(v *Value) bool { 4537 b := v.Block 4538 _ = b 4539 // match: (CMP x (SRL y z)) 4540 // cond: 4541 // result: (CMPshiftRLreg x y z) 4542 for { 4543 _ = v.Args[1] 4544 x := v.Args[0] 4545 v_1 := v.Args[1] 4546 if v_1.Op != OpARMSRL { 4547 break 4548 } 4549 _ = v_1.Args[1] 4550 y := v_1.Args[0] 4551 z := v_1.Args[1] 4552 v.reset(OpARMCMPshiftRLreg) 4553 v.AddArg(x) 4554 v.AddArg(y) 4555 v.AddArg(z) 4556 return true 4557 } 4558 // match: (CMP (SRL y z) x) 4559 // cond: 4560 // result: (InvertFlags (CMPshiftRLreg x y z)) 4561 for { 4562 _ = v.Args[1] 4563 v_0 := v.Args[0] 4564 if v_0.Op != OpARMSRL { 4565 break 4566 } 4567 _ = v_0.Args[1] 4568 y := v_0.Args[0] 4569 z := v_0.Args[1] 4570 x := v.Args[1] 4571 v.reset(OpARMInvertFlags) 4572 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 4573 v0.AddArg(x) 4574 v0.AddArg(y) 4575 v0.AddArg(z) 4576 v.AddArg(v0) 4577 return true 4578 } 4579 // match: (CMP x (SRA y z)) 4580 // cond: 4581 // result: (CMPshiftRAreg x y z) 4582 for { 4583 _ = v.Args[1] 4584 x := v.Args[0] 4585 v_1 := v.Args[1] 4586 if v_1.Op != OpARMSRA { 4587 break 4588 } 4589 _ = v_1.Args[1] 4590 y := v_1.Args[0] 4591 z := v_1.Args[1] 4592 v.reset(OpARMCMPshiftRAreg) 4593 v.AddArg(x) 4594 v.AddArg(y) 4595 v.AddArg(z) 4596 return true 4597 } 4598 // match: (CMP (SRA y z) x) 4599 // cond: 4600 // result: (InvertFlags (CMPshiftRAreg x y z)) 4601 for { 4602 _ = v.Args[1] 4603 v_0 := v.Args[0] 4604 if v_0.Op != OpARMSRA { 4605 break 4606 } 4607 _ = v_0.Args[1] 4608 y := v_0.Args[0] 4609 z := v_0.Args[1] 4610 x := v.Args[1] 4611 v.reset(OpARMInvertFlags) 4612 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 4613 v0.AddArg(x) 4614 v0.AddArg(y) 4615 v0.AddArg(z) 4616 v.AddArg(v0) 4617 return true 4618 } 4619 return false 4620 } 4621 func rewriteValueARM_OpARMCMPD_0(v *Value) bool { 4622 // match: (CMPD x (MOVDconst [0])) 4623 // cond: 4624 // result: (CMPD0 x) 4625 for { 4626 _ = v.Args[1] 4627 x := v.Args[0] 4628 v_1 := v.Args[1] 4629 if v_1.Op != OpARMMOVDconst { 4630 break 4631 } 4632 if v_1.AuxInt != 0 { 4633 break 4634 } 4635 v.reset(OpARMCMPD0) 4636 v.AddArg(x) 4637 return true 4638 } 4639 return false 4640 } 4641 func rewriteValueARM_OpARMCMPF_0(v *Value) bool { 4642 // match: (CMPF x (MOVFconst [0])) 4643 // cond: 4644 // result: (CMPF0 x) 4645 for { 4646 _ = v.Args[1] 4647 x := v.Args[0] 4648 v_1 := v.Args[1] 4649 if v_1.Op != OpARMMOVFconst { 4650 break 4651 } 4652 if v_1.AuxInt != 0 { 4653 break 4654 } 4655 v.reset(OpARMCMPF0) 4656 v.AddArg(x) 4657 return true 4658 } 4659 return false 4660 } 4661 func rewriteValueARM_OpARMCMPconst_0(v *Value) bool { 4662 // match: (CMPconst (MOVWconst [x]) [y]) 4663 // cond: int32(x)==int32(y) 4664 // result: (FlagEQ) 4665 for { 4666 y := v.AuxInt 4667 v_0 := v.Args[0] 4668 if v_0.Op != OpARMMOVWconst { 4669 break 4670 } 4671 x := v_0.AuxInt 4672 if !(int32(x) == int32(y)) { 4673 break 4674 } 4675 v.reset(OpARMFlagEQ) 4676 return true 4677 } 4678 // match: (CMPconst (MOVWconst [x]) [y]) 4679 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 4680 // result: (FlagLT_ULT) 4681 for { 4682 y := v.AuxInt 4683 v_0 := v.Args[0] 4684 if v_0.Op != OpARMMOVWconst { 4685 break 4686 } 4687 x := v_0.AuxInt 4688 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 4689 break 4690 } 4691 v.reset(OpARMFlagLT_ULT) 4692 return true 4693 } 4694 // match: (CMPconst (MOVWconst [x]) [y]) 4695 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 4696 // result: (FlagLT_UGT) 4697 for { 4698 y := v.AuxInt 4699 v_0 := v.Args[0] 4700 if v_0.Op != OpARMMOVWconst { 4701 break 4702 } 4703 x := v_0.AuxInt 4704 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 4705 break 4706 } 4707 v.reset(OpARMFlagLT_UGT) 4708 return true 4709 } 4710 // match: (CMPconst (MOVWconst [x]) [y]) 4711 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 4712 // result: (FlagGT_ULT) 4713 for { 4714 y := v.AuxInt 4715 v_0 := v.Args[0] 4716 if v_0.Op != OpARMMOVWconst { 4717 break 4718 } 4719 x := v_0.AuxInt 4720 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 4721 break 4722 } 4723 v.reset(OpARMFlagGT_ULT) 4724 return true 4725 } 4726 // match: (CMPconst (MOVWconst [x]) [y]) 4727 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 4728 // result: (FlagGT_UGT) 4729 for { 4730 y := v.AuxInt 4731 v_0 := v.Args[0] 4732 if v_0.Op != OpARMMOVWconst { 4733 break 4734 } 4735 x := v_0.AuxInt 4736 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 4737 break 4738 } 4739 v.reset(OpARMFlagGT_UGT) 4740 return true 4741 } 4742 // match: (CMPconst (MOVBUreg _) [c]) 4743 // cond: 0xff < c 4744 // result: (FlagLT_ULT) 4745 for { 4746 c := v.AuxInt 4747 v_0 := v.Args[0] 4748 if v_0.Op != OpARMMOVBUreg { 4749 break 4750 } 4751 if !(0xff < c) { 4752 break 4753 } 4754 v.reset(OpARMFlagLT_ULT) 4755 return true 4756 } 4757 // match: (CMPconst (MOVHUreg _) [c]) 4758 // cond: 0xffff < c 4759 // result: (FlagLT_ULT) 4760 for { 4761 c := v.AuxInt 4762 v_0 := v.Args[0] 4763 if v_0.Op != OpARMMOVHUreg { 4764 break 4765 } 4766 if !(0xffff < c) { 4767 break 4768 } 4769 v.reset(OpARMFlagLT_ULT) 4770 return true 4771 } 4772 // match: (CMPconst (ANDconst _ [m]) [n]) 4773 // cond: 0 <= int32(m) && int32(m) < int32(n) 4774 // result: (FlagLT_ULT) 4775 for { 4776 n := v.AuxInt 4777 v_0 := v.Args[0] 4778 if v_0.Op != OpARMANDconst { 4779 break 4780 } 4781 m := v_0.AuxInt 4782 if !(0 <= int32(m) && int32(m) < int32(n)) { 4783 break 4784 } 4785 v.reset(OpARMFlagLT_ULT) 4786 return true 4787 } 4788 // match: (CMPconst (SRLconst _ [c]) [n]) 4789 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 4790 // result: (FlagLT_ULT) 4791 for { 4792 n := v.AuxInt 4793 v_0 := v.Args[0] 4794 if v_0.Op != OpARMSRLconst { 4795 break 4796 } 4797 c := v_0.AuxInt 4798 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 4799 break 4800 } 4801 v.reset(OpARMFlagLT_ULT) 4802 return true 4803 } 4804 return false 4805 } 4806 func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { 4807 b := v.Block 4808 _ = b 4809 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 4810 // cond: 4811 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 4812 for { 4813 d := v.AuxInt 4814 _ = v.Args[1] 4815 v_0 := v.Args[0] 4816 if v_0.Op != OpARMMOVWconst { 4817 break 4818 } 4819 c := v_0.AuxInt 4820 x := v.Args[1] 4821 v.reset(OpARMInvertFlags) 4822 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4823 v0.AuxInt = c 4824 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4825 v1.AuxInt = d 4826 v1.AddArg(x) 4827 v0.AddArg(v1) 4828 v.AddArg(v0) 4829 return true 4830 } 4831 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 4832 // cond: 4833 // result: (CMPconst x [int64(uint32(c)<<uint64(d))]) 4834 for { 4835 d := v.AuxInt 4836 _ = v.Args[1] 4837 x := v.Args[0] 4838 v_1 := v.Args[1] 4839 if v_1.Op != OpARMMOVWconst { 4840 break 4841 } 4842 c := v_1.AuxInt 4843 v.reset(OpARMCMPconst) 4844 v.AuxInt = int64(uint32(c) << uint64(d)) 4845 v.AddArg(x) 4846 return true 4847 } 4848 return false 4849 } 4850 func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { 4851 b := v.Block 4852 _ = b 4853 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 4854 // cond: 4855 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 4856 for { 4857 _ = v.Args[2] 4858 v_0 := v.Args[0] 4859 if v_0.Op != OpARMMOVWconst { 4860 break 4861 } 4862 c := v_0.AuxInt 4863 x := v.Args[1] 4864 y := v.Args[2] 4865 v.reset(OpARMInvertFlags) 4866 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4867 v0.AuxInt = c 4868 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4869 v1.AddArg(x) 4870 v1.AddArg(y) 4871 v0.AddArg(v1) 4872 v.AddArg(v0) 4873 return true 4874 } 4875 // match: (CMPshiftLLreg x y (MOVWconst [c])) 4876 // cond: 4877 // result: (CMPshiftLL x y [c]) 4878 for { 4879 _ = v.Args[2] 4880 x := v.Args[0] 4881 y := v.Args[1] 4882 v_2 := v.Args[2] 4883 if v_2.Op != OpARMMOVWconst { 4884 break 4885 } 4886 c := v_2.AuxInt 4887 v.reset(OpARMCMPshiftLL) 4888 v.AuxInt = c 4889 v.AddArg(x) 4890 v.AddArg(y) 4891 return true 4892 } 4893 return false 4894 } 4895 func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { 4896 b := v.Block 4897 _ = b 4898 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 4899 // cond: 4900 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 4901 for { 4902 d := v.AuxInt 4903 _ = v.Args[1] 4904 v_0 := v.Args[0] 4905 if v_0.Op != OpARMMOVWconst { 4906 break 4907 } 4908 c := v_0.AuxInt 4909 x := v.Args[1] 4910 v.reset(OpARMInvertFlags) 4911 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4912 v0.AuxInt = c 4913 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4914 v1.AuxInt = d 4915 v1.AddArg(x) 4916 v0.AddArg(v1) 4917 v.AddArg(v0) 4918 return true 4919 } 4920 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 4921 // cond: 4922 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 4923 for { 4924 d := v.AuxInt 4925 _ = v.Args[1] 4926 x := v.Args[0] 4927 v_1 := v.Args[1] 4928 if v_1.Op != OpARMMOVWconst { 4929 break 4930 } 4931 c := v_1.AuxInt 4932 v.reset(OpARMCMPconst) 4933 v.AuxInt = int64(int32(c) >> uint64(d)) 4934 v.AddArg(x) 4935 return true 4936 } 4937 return false 4938 } 4939 func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { 4940 b := v.Block 4941 _ = b 4942 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 4943 // cond: 4944 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 4945 for { 4946 _ = v.Args[2] 4947 v_0 := v.Args[0] 4948 if v_0.Op != OpARMMOVWconst { 4949 break 4950 } 4951 c := v_0.AuxInt 4952 x := v.Args[1] 4953 y := v.Args[2] 4954 v.reset(OpARMInvertFlags) 4955 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 4956 v0.AuxInt = c 4957 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4958 v1.AddArg(x) 4959 v1.AddArg(y) 4960 v0.AddArg(v1) 4961 v.AddArg(v0) 4962 return true 4963 } 4964 // match: (CMPshiftRAreg x y (MOVWconst [c])) 4965 // cond: 4966 // result: (CMPshiftRA x y [c]) 4967 for { 4968 _ = v.Args[2] 4969 x := v.Args[0] 4970 y := v.Args[1] 4971 v_2 := v.Args[2] 4972 if v_2.Op != OpARMMOVWconst { 4973 break 4974 } 4975 c := v_2.AuxInt 4976 v.reset(OpARMCMPshiftRA) 4977 v.AuxInt = c 4978 v.AddArg(x) 4979 v.AddArg(y) 4980 return true 4981 } 4982 return false 4983 } 4984 func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { 4985 b := v.Block 4986 _ = b 4987 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 4988 // cond: 4989 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 4990 for { 4991 d := v.AuxInt 4992 _ = v.Args[1] 4993 v_0 := v.Args[0] 4994 if v_0.Op != OpARMMOVWconst { 4995 break 4996 } 4997 c := v_0.AuxInt 4998 x := v.Args[1] 4999 v.reset(OpARMInvertFlags) 5000 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5001 v0.AuxInt = c 5002 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 5003 v1.AuxInt = d 5004 v1.AddArg(x) 5005 v0.AddArg(v1) 5006 v.AddArg(v0) 5007 return true 5008 } 5009 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 5010 // cond: 5011 // result: (CMPconst x [int64(uint32(c)>>uint64(d))]) 5012 for { 5013 d := v.AuxInt 5014 _ = v.Args[1] 5015 x := v.Args[0] 5016 v_1 := v.Args[1] 5017 if v_1.Op != OpARMMOVWconst { 5018 break 5019 } 5020 c := v_1.AuxInt 5021 v.reset(OpARMCMPconst) 5022 v.AuxInt = int64(uint32(c) >> uint64(d)) 5023 v.AddArg(x) 5024 return true 5025 } 5026 return false 5027 } 5028 func rewriteValueARM_OpARMCMPshiftRLreg_0(v *Value) bool { 5029 b := v.Block 5030 _ = b 5031 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 5032 // cond: 5033 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 5034 for { 5035 _ = v.Args[2] 5036 v_0 := v.Args[0] 5037 if v_0.Op != OpARMMOVWconst { 5038 break 5039 } 5040 c := v_0.AuxInt 5041 x := v.Args[1] 5042 y := v.Args[2] 5043 v.reset(OpARMInvertFlags) 5044 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5045 v0.AuxInt = c 5046 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 5047 v1.AddArg(x) 5048 v1.AddArg(y) 5049 v0.AddArg(v1) 5050 v.AddArg(v0) 5051 return true 5052 } 5053 // match: (CMPshiftRLreg x y (MOVWconst [c])) 5054 // cond: 5055 // result: (CMPshiftRL x y [c]) 5056 for { 5057 _ = v.Args[2] 5058 x := v.Args[0] 5059 y := v.Args[1] 5060 v_2 := v.Args[2] 5061 if v_2.Op != OpARMMOVWconst { 5062 break 5063 } 5064 c := v_2.AuxInt 5065 v.reset(OpARMCMPshiftRL) 5066 v.AuxInt = c 5067 v.AddArg(x) 5068 v.AddArg(y) 5069 return true 5070 } 5071 return false 5072 } 5073 func rewriteValueARM_OpARMEqual_0(v *Value) bool { 5074 // match: (Equal (FlagEQ)) 5075 // cond: 5076 // result: (MOVWconst [1]) 5077 for { 5078 v_0 := v.Args[0] 5079 if v_0.Op != OpARMFlagEQ { 5080 break 5081 } 5082 v.reset(OpARMMOVWconst) 5083 v.AuxInt = 1 5084 return true 5085 } 5086 // match: (Equal (FlagLT_ULT)) 5087 // cond: 5088 // result: (MOVWconst [0]) 5089 for { 5090 v_0 := v.Args[0] 5091 if v_0.Op != OpARMFlagLT_ULT { 5092 break 5093 } 5094 v.reset(OpARMMOVWconst) 5095 v.AuxInt = 0 5096 return true 5097 } 5098 // match: (Equal (FlagLT_UGT)) 5099 // cond: 5100 // result: (MOVWconst [0]) 5101 for { 5102 v_0 := v.Args[0] 5103 if v_0.Op != OpARMFlagLT_UGT { 5104 break 5105 } 5106 v.reset(OpARMMOVWconst) 5107 v.AuxInt = 0 5108 return true 5109 } 5110 // match: (Equal (FlagGT_ULT)) 5111 // cond: 5112 // result: (MOVWconst [0]) 5113 for { 5114 v_0 := v.Args[0] 5115 if v_0.Op != OpARMFlagGT_ULT { 5116 break 5117 } 5118 v.reset(OpARMMOVWconst) 5119 v.AuxInt = 0 5120 return true 5121 } 5122 // match: (Equal (FlagGT_UGT)) 5123 // cond: 5124 // result: (MOVWconst [0]) 5125 for { 5126 v_0 := v.Args[0] 5127 if v_0.Op != OpARMFlagGT_UGT { 5128 break 5129 } 5130 v.reset(OpARMMOVWconst) 5131 v.AuxInt = 0 5132 return true 5133 } 5134 // match: (Equal (InvertFlags x)) 5135 // cond: 5136 // result: (Equal x) 5137 for { 5138 v_0 := v.Args[0] 5139 if v_0.Op != OpARMInvertFlags { 5140 break 5141 } 5142 x := v_0.Args[0] 5143 v.reset(OpARMEqual) 5144 v.AddArg(x) 5145 return true 5146 } 5147 return false 5148 } 5149 func rewriteValueARM_OpARMGreaterEqual_0(v *Value) bool { 5150 // match: (GreaterEqual (FlagEQ)) 5151 // cond: 5152 // result: (MOVWconst [1]) 5153 for { 5154 v_0 := v.Args[0] 5155 if v_0.Op != OpARMFlagEQ { 5156 break 5157 } 5158 v.reset(OpARMMOVWconst) 5159 v.AuxInt = 1 5160 return true 5161 } 5162 // match: (GreaterEqual (FlagLT_ULT)) 5163 // cond: 5164 // result: (MOVWconst [0]) 5165 for { 5166 v_0 := v.Args[0] 5167 if v_0.Op != OpARMFlagLT_ULT { 5168 break 5169 } 5170 v.reset(OpARMMOVWconst) 5171 v.AuxInt = 0 5172 return true 5173 } 5174 // match: (GreaterEqual (FlagLT_UGT)) 5175 // cond: 5176 // result: (MOVWconst [0]) 5177 for { 5178 v_0 := v.Args[0] 5179 if v_0.Op != OpARMFlagLT_UGT { 5180 break 5181 } 5182 v.reset(OpARMMOVWconst) 5183 v.AuxInt = 0 5184 return true 5185 } 5186 // match: (GreaterEqual (FlagGT_ULT)) 5187 // cond: 5188 // result: (MOVWconst [1]) 5189 for { 5190 v_0 := v.Args[0] 5191 if v_0.Op != OpARMFlagGT_ULT { 5192 break 5193 } 5194 v.reset(OpARMMOVWconst) 5195 v.AuxInt = 1 5196 return true 5197 } 5198 // match: (GreaterEqual (FlagGT_UGT)) 5199 // cond: 5200 // result: (MOVWconst [1]) 5201 for { 5202 v_0 := v.Args[0] 5203 if v_0.Op != OpARMFlagGT_UGT { 5204 break 5205 } 5206 v.reset(OpARMMOVWconst) 5207 v.AuxInt = 1 5208 return true 5209 } 5210 // match: (GreaterEqual (InvertFlags x)) 5211 // cond: 5212 // result: (LessEqual x) 5213 for { 5214 v_0 := v.Args[0] 5215 if v_0.Op != OpARMInvertFlags { 5216 break 5217 } 5218 x := v_0.Args[0] 5219 v.reset(OpARMLessEqual) 5220 v.AddArg(x) 5221 return true 5222 } 5223 return false 5224 } 5225 func rewriteValueARM_OpARMGreaterEqualU_0(v *Value) bool { 5226 // match: (GreaterEqualU (FlagEQ)) 5227 // cond: 5228 // result: (MOVWconst [1]) 5229 for { 5230 v_0 := v.Args[0] 5231 if v_0.Op != OpARMFlagEQ { 5232 break 5233 } 5234 v.reset(OpARMMOVWconst) 5235 v.AuxInt = 1 5236 return true 5237 } 5238 // match: (GreaterEqualU (FlagLT_ULT)) 5239 // cond: 5240 // result: (MOVWconst [0]) 5241 for { 5242 v_0 := v.Args[0] 5243 if v_0.Op != OpARMFlagLT_ULT { 5244 break 5245 } 5246 v.reset(OpARMMOVWconst) 5247 v.AuxInt = 0 5248 return true 5249 } 5250 // match: (GreaterEqualU (FlagLT_UGT)) 5251 // cond: 5252 // result: (MOVWconst [1]) 5253 for { 5254 v_0 := v.Args[0] 5255 if v_0.Op != OpARMFlagLT_UGT { 5256 break 5257 } 5258 v.reset(OpARMMOVWconst) 5259 v.AuxInt = 1 5260 return true 5261 } 5262 // match: (GreaterEqualU (FlagGT_ULT)) 5263 // cond: 5264 // result: (MOVWconst [0]) 5265 for { 5266 v_0 := v.Args[0] 5267 if v_0.Op != OpARMFlagGT_ULT { 5268 break 5269 } 5270 v.reset(OpARMMOVWconst) 5271 v.AuxInt = 0 5272 return true 5273 } 5274 // match: (GreaterEqualU (FlagGT_UGT)) 5275 // cond: 5276 // result: (MOVWconst [1]) 5277 for { 5278 v_0 := v.Args[0] 5279 if v_0.Op != OpARMFlagGT_UGT { 5280 break 5281 } 5282 v.reset(OpARMMOVWconst) 5283 v.AuxInt = 1 5284 return true 5285 } 5286 // match: (GreaterEqualU (InvertFlags x)) 5287 // cond: 5288 // result: (LessEqualU x) 5289 for { 5290 v_0 := v.Args[0] 5291 if v_0.Op != OpARMInvertFlags { 5292 break 5293 } 5294 x := v_0.Args[0] 5295 v.reset(OpARMLessEqualU) 5296 v.AddArg(x) 5297 return true 5298 } 5299 return false 5300 } 5301 func rewriteValueARM_OpARMGreaterThan_0(v *Value) bool { 5302 // match: (GreaterThan (FlagEQ)) 5303 // cond: 5304 // result: (MOVWconst [0]) 5305 for { 5306 v_0 := v.Args[0] 5307 if v_0.Op != OpARMFlagEQ { 5308 break 5309 } 5310 v.reset(OpARMMOVWconst) 5311 v.AuxInt = 0 5312 return true 5313 } 5314 // match: (GreaterThan (FlagLT_ULT)) 5315 // cond: 5316 // result: (MOVWconst [0]) 5317 for { 5318 v_0 := v.Args[0] 5319 if v_0.Op != OpARMFlagLT_ULT { 5320 break 5321 } 5322 v.reset(OpARMMOVWconst) 5323 v.AuxInt = 0 5324 return true 5325 } 5326 // match: (GreaterThan (FlagLT_UGT)) 5327 // cond: 5328 // result: (MOVWconst [0]) 5329 for { 5330 v_0 := v.Args[0] 5331 if v_0.Op != OpARMFlagLT_UGT { 5332 break 5333 } 5334 v.reset(OpARMMOVWconst) 5335 v.AuxInt = 0 5336 return true 5337 } 5338 // match: (GreaterThan (FlagGT_ULT)) 5339 // cond: 5340 // result: (MOVWconst [1]) 5341 for { 5342 v_0 := v.Args[0] 5343 if v_0.Op != OpARMFlagGT_ULT { 5344 break 5345 } 5346 v.reset(OpARMMOVWconst) 5347 v.AuxInt = 1 5348 return true 5349 } 5350 // match: (GreaterThan (FlagGT_UGT)) 5351 // cond: 5352 // result: (MOVWconst [1]) 5353 for { 5354 v_0 := v.Args[0] 5355 if v_0.Op != OpARMFlagGT_UGT { 5356 break 5357 } 5358 v.reset(OpARMMOVWconst) 5359 v.AuxInt = 1 5360 return true 5361 } 5362 // match: (GreaterThan (InvertFlags x)) 5363 // cond: 5364 // result: (LessThan x) 5365 for { 5366 v_0 := v.Args[0] 5367 if v_0.Op != OpARMInvertFlags { 5368 break 5369 } 5370 x := v_0.Args[0] 5371 v.reset(OpARMLessThan) 5372 v.AddArg(x) 5373 return true 5374 } 5375 return false 5376 } 5377 func rewriteValueARM_OpARMGreaterThanU_0(v *Value) bool { 5378 // match: (GreaterThanU (FlagEQ)) 5379 // cond: 5380 // result: (MOVWconst [0]) 5381 for { 5382 v_0 := v.Args[0] 5383 if v_0.Op != OpARMFlagEQ { 5384 break 5385 } 5386 v.reset(OpARMMOVWconst) 5387 v.AuxInt = 0 5388 return true 5389 } 5390 // match: (GreaterThanU (FlagLT_ULT)) 5391 // cond: 5392 // result: (MOVWconst [0]) 5393 for { 5394 v_0 := v.Args[0] 5395 if v_0.Op != OpARMFlagLT_ULT { 5396 break 5397 } 5398 v.reset(OpARMMOVWconst) 5399 v.AuxInt = 0 5400 return true 5401 } 5402 // match: (GreaterThanU (FlagLT_UGT)) 5403 // cond: 5404 // result: (MOVWconst [1]) 5405 for { 5406 v_0 := v.Args[0] 5407 if v_0.Op != OpARMFlagLT_UGT { 5408 break 5409 } 5410 v.reset(OpARMMOVWconst) 5411 v.AuxInt = 1 5412 return true 5413 } 5414 // match: (GreaterThanU (FlagGT_ULT)) 5415 // cond: 5416 // result: (MOVWconst [0]) 5417 for { 5418 v_0 := v.Args[0] 5419 if v_0.Op != OpARMFlagGT_ULT { 5420 break 5421 } 5422 v.reset(OpARMMOVWconst) 5423 v.AuxInt = 0 5424 return true 5425 } 5426 // match: (GreaterThanU (FlagGT_UGT)) 5427 // cond: 5428 // result: (MOVWconst [1]) 5429 for { 5430 v_0 := v.Args[0] 5431 if v_0.Op != OpARMFlagGT_UGT { 5432 break 5433 } 5434 v.reset(OpARMMOVWconst) 5435 v.AuxInt = 1 5436 return true 5437 } 5438 // match: (GreaterThanU (InvertFlags x)) 5439 // cond: 5440 // result: (LessThanU x) 5441 for { 5442 v_0 := v.Args[0] 5443 if v_0.Op != OpARMInvertFlags { 5444 break 5445 } 5446 x := v_0.Args[0] 5447 v.reset(OpARMLessThanU) 5448 v.AddArg(x) 5449 return true 5450 } 5451 return false 5452 } 5453 func rewriteValueARM_OpARMLessEqual_0(v *Value) bool { 5454 // match: (LessEqual (FlagEQ)) 5455 // cond: 5456 // result: (MOVWconst [1]) 5457 for { 5458 v_0 := v.Args[0] 5459 if v_0.Op != OpARMFlagEQ { 5460 break 5461 } 5462 v.reset(OpARMMOVWconst) 5463 v.AuxInt = 1 5464 return true 5465 } 5466 // match: (LessEqual (FlagLT_ULT)) 5467 // cond: 5468 // result: (MOVWconst [1]) 5469 for { 5470 v_0 := v.Args[0] 5471 if v_0.Op != OpARMFlagLT_ULT { 5472 break 5473 } 5474 v.reset(OpARMMOVWconst) 5475 v.AuxInt = 1 5476 return true 5477 } 5478 // match: (LessEqual (FlagLT_UGT)) 5479 // cond: 5480 // result: (MOVWconst [1]) 5481 for { 5482 v_0 := v.Args[0] 5483 if v_0.Op != OpARMFlagLT_UGT { 5484 break 5485 } 5486 v.reset(OpARMMOVWconst) 5487 v.AuxInt = 1 5488 return true 5489 } 5490 // match: (LessEqual (FlagGT_ULT)) 5491 // cond: 5492 // result: (MOVWconst [0]) 5493 for { 5494 v_0 := v.Args[0] 5495 if v_0.Op != OpARMFlagGT_ULT { 5496 break 5497 } 5498 v.reset(OpARMMOVWconst) 5499 v.AuxInt = 0 5500 return true 5501 } 5502 // match: (LessEqual (FlagGT_UGT)) 5503 // cond: 5504 // result: (MOVWconst [0]) 5505 for { 5506 v_0 := v.Args[0] 5507 if v_0.Op != OpARMFlagGT_UGT { 5508 break 5509 } 5510 v.reset(OpARMMOVWconst) 5511 v.AuxInt = 0 5512 return true 5513 } 5514 // match: (LessEqual (InvertFlags x)) 5515 // cond: 5516 // result: (GreaterEqual x) 5517 for { 5518 v_0 := v.Args[0] 5519 if v_0.Op != OpARMInvertFlags { 5520 break 5521 } 5522 x := v_0.Args[0] 5523 v.reset(OpARMGreaterEqual) 5524 v.AddArg(x) 5525 return true 5526 } 5527 return false 5528 } 5529 func rewriteValueARM_OpARMLessEqualU_0(v *Value) bool { 5530 // match: (LessEqualU (FlagEQ)) 5531 // cond: 5532 // result: (MOVWconst [1]) 5533 for { 5534 v_0 := v.Args[0] 5535 if v_0.Op != OpARMFlagEQ { 5536 break 5537 } 5538 v.reset(OpARMMOVWconst) 5539 v.AuxInt = 1 5540 return true 5541 } 5542 // match: (LessEqualU (FlagLT_ULT)) 5543 // cond: 5544 // result: (MOVWconst [1]) 5545 for { 5546 v_0 := v.Args[0] 5547 if v_0.Op != OpARMFlagLT_ULT { 5548 break 5549 } 5550 v.reset(OpARMMOVWconst) 5551 v.AuxInt = 1 5552 return true 5553 } 5554 // match: (LessEqualU (FlagLT_UGT)) 5555 // cond: 5556 // result: (MOVWconst [0]) 5557 for { 5558 v_0 := v.Args[0] 5559 if v_0.Op != OpARMFlagLT_UGT { 5560 break 5561 } 5562 v.reset(OpARMMOVWconst) 5563 v.AuxInt = 0 5564 return true 5565 } 5566 // match: (LessEqualU (FlagGT_ULT)) 5567 // cond: 5568 // result: (MOVWconst [1]) 5569 for { 5570 v_0 := v.Args[0] 5571 if v_0.Op != OpARMFlagGT_ULT { 5572 break 5573 } 5574 v.reset(OpARMMOVWconst) 5575 v.AuxInt = 1 5576 return true 5577 } 5578 // match: (LessEqualU (FlagGT_UGT)) 5579 // cond: 5580 // result: (MOVWconst [0]) 5581 for { 5582 v_0 := v.Args[0] 5583 if v_0.Op != OpARMFlagGT_UGT { 5584 break 5585 } 5586 v.reset(OpARMMOVWconst) 5587 v.AuxInt = 0 5588 return true 5589 } 5590 // match: (LessEqualU (InvertFlags x)) 5591 // cond: 5592 // result: (GreaterEqualU x) 5593 for { 5594 v_0 := v.Args[0] 5595 if v_0.Op != OpARMInvertFlags { 5596 break 5597 } 5598 x := v_0.Args[0] 5599 v.reset(OpARMGreaterEqualU) 5600 v.AddArg(x) 5601 return true 5602 } 5603 return false 5604 } 5605 func rewriteValueARM_OpARMLessThan_0(v *Value) bool { 5606 // match: (LessThan (FlagEQ)) 5607 // cond: 5608 // result: (MOVWconst [0]) 5609 for { 5610 v_0 := v.Args[0] 5611 if v_0.Op != OpARMFlagEQ { 5612 break 5613 } 5614 v.reset(OpARMMOVWconst) 5615 v.AuxInt = 0 5616 return true 5617 } 5618 // match: (LessThan (FlagLT_ULT)) 5619 // cond: 5620 // result: (MOVWconst [1]) 5621 for { 5622 v_0 := v.Args[0] 5623 if v_0.Op != OpARMFlagLT_ULT { 5624 break 5625 } 5626 v.reset(OpARMMOVWconst) 5627 v.AuxInt = 1 5628 return true 5629 } 5630 // match: (LessThan (FlagLT_UGT)) 5631 // cond: 5632 // result: (MOVWconst [1]) 5633 for { 5634 v_0 := v.Args[0] 5635 if v_0.Op != OpARMFlagLT_UGT { 5636 break 5637 } 5638 v.reset(OpARMMOVWconst) 5639 v.AuxInt = 1 5640 return true 5641 } 5642 // match: (LessThan (FlagGT_ULT)) 5643 // cond: 5644 // result: (MOVWconst [0]) 5645 for { 5646 v_0 := v.Args[0] 5647 if v_0.Op != OpARMFlagGT_ULT { 5648 break 5649 } 5650 v.reset(OpARMMOVWconst) 5651 v.AuxInt = 0 5652 return true 5653 } 5654 // match: (LessThan (FlagGT_UGT)) 5655 // cond: 5656 // result: (MOVWconst [0]) 5657 for { 5658 v_0 := v.Args[0] 5659 if v_0.Op != OpARMFlagGT_UGT { 5660 break 5661 } 5662 v.reset(OpARMMOVWconst) 5663 v.AuxInt = 0 5664 return true 5665 } 5666 // match: (LessThan (InvertFlags x)) 5667 // cond: 5668 // result: (GreaterThan x) 5669 for { 5670 v_0 := v.Args[0] 5671 if v_0.Op != OpARMInvertFlags { 5672 break 5673 } 5674 x := v_0.Args[0] 5675 v.reset(OpARMGreaterThan) 5676 v.AddArg(x) 5677 return true 5678 } 5679 return false 5680 } 5681 func rewriteValueARM_OpARMLessThanU_0(v *Value) bool { 5682 // match: (LessThanU (FlagEQ)) 5683 // cond: 5684 // result: (MOVWconst [0]) 5685 for { 5686 v_0 := v.Args[0] 5687 if v_0.Op != OpARMFlagEQ { 5688 break 5689 } 5690 v.reset(OpARMMOVWconst) 5691 v.AuxInt = 0 5692 return true 5693 } 5694 // match: (LessThanU (FlagLT_ULT)) 5695 // cond: 5696 // result: (MOVWconst [1]) 5697 for { 5698 v_0 := v.Args[0] 5699 if v_0.Op != OpARMFlagLT_ULT { 5700 break 5701 } 5702 v.reset(OpARMMOVWconst) 5703 v.AuxInt = 1 5704 return true 5705 } 5706 // match: (LessThanU (FlagLT_UGT)) 5707 // cond: 5708 // result: (MOVWconst [0]) 5709 for { 5710 v_0 := v.Args[0] 5711 if v_0.Op != OpARMFlagLT_UGT { 5712 break 5713 } 5714 v.reset(OpARMMOVWconst) 5715 v.AuxInt = 0 5716 return true 5717 } 5718 // match: (LessThanU (FlagGT_ULT)) 5719 // cond: 5720 // result: (MOVWconst [1]) 5721 for { 5722 v_0 := v.Args[0] 5723 if v_0.Op != OpARMFlagGT_ULT { 5724 break 5725 } 5726 v.reset(OpARMMOVWconst) 5727 v.AuxInt = 1 5728 return true 5729 } 5730 // match: (LessThanU (FlagGT_UGT)) 5731 // cond: 5732 // result: (MOVWconst [0]) 5733 for { 5734 v_0 := v.Args[0] 5735 if v_0.Op != OpARMFlagGT_UGT { 5736 break 5737 } 5738 v.reset(OpARMMOVWconst) 5739 v.AuxInt = 0 5740 return true 5741 } 5742 // match: (LessThanU (InvertFlags x)) 5743 // cond: 5744 // result: (GreaterThanU x) 5745 for { 5746 v_0 := v.Args[0] 5747 if v_0.Op != OpARMInvertFlags { 5748 break 5749 } 5750 x := v_0.Args[0] 5751 v.reset(OpARMGreaterThanU) 5752 v.AddArg(x) 5753 return true 5754 } 5755 return false 5756 } 5757 func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { 5758 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 5759 // cond: 5760 // result: (MOVBUload [off1+off2] {sym} ptr mem) 5761 for { 5762 off1 := v.AuxInt 5763 sym := v.Aux 5764 _ = v.Args[1] 5765 v_0 := v.Args[0] 5766 if v_0.Op != OpARMADDconst { 5767 break 5768 } 5769 off2 := v_0.AuxInt 5770 ptr := v_0.Args[0] 5771 mem := v.Args[1] 5772 v.reset(OpARMMOVBUload) 5773 v.AuxInt = off1 + off2 5774 v.Aux = sym 5775 v.AddArg(ptr) 5776 v.AddArg(mem) 5777 return true 5778 } 5779 // match: (MOVBUload [off1] {sym} (SUBconst [off2] ptr) mem) 5780 // cond: 5781 // result: (MOVBUload [off1-off2] {sym} ptr mem) 5782 for { 5783 off1 := v.AuxInt 5784 sym := v.Aux 5785 _ = v.Args[1] 5786 v_0 := v.Args[0] 5787 if v_0.Op != OpARMSUBconst { 5788 break 5789 } 5790 off2 := v_0.AuxInt 5791 ptr := v_0.Args[0] 5792 mem := v.Args[1] 5793 v.reset(OpARMMOVBUload) 5794 v.AuxInt = off1 - off2 5795 v.Aux = sym 5796 v.AddArg(ptr) 5797 v.AddArg(mem) 5798 return true 5799 } 5800 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5801 // cond: canMergeSym(sym1,sym2) 5802 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5803 for { 5804 off1 := v.AuxInt 5805 sym1 := v.Aux 5806 _ = v.Args[1] 5807 v_0 := v.Args[0] 5808 if v_0.Op != OpARMMOVWaddr { 5809 break 5810 } 5811 off2 := v_0.AuxInt 5812 sym2 := v_0.Aux 5813 ptr := v_0.Args[0] 5814 mem := v.Args[1] 5815 if !(canMergeSym(sym1, sym2)) { 5816 break 5817 } 5818 v.reset(OpARMMOVBUload) 5819 v.AuxInt = off1 + off2 5820 v.Aux = mergeSym(sym1, sym2) 5821 v.AddArg(ptr) 5822 v.AddArg(mem) 5823 return true 5824 } 5825 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5826 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5827 // result: (MOVBUreg x) 5828 for { 5829 off := v.AuxInt 5830 sym := v.Aux 5831 _ = v.Args[1] 5832 ptr := v.Args[0] 5833 v_1 := v.Args[1] 5834 if v_1.Op != OpARMMOVBstore { 5835 break 5836 } 5837 off2 := v_1.AuxInt 5838 sym2 := v_1.Aux 5839 _ = v_1.Args[2] 5840 ptr2 := v_1.Args[0] 5841 x := v_1.Args[1] 5842 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5843 break 5844 } 5845 v.reset(OpARMMOVBUreg) 5846 v.AddArg(x) 5847 return true 5848 } 5849 return false 5850 } 5851 func rewriteValueARM_OpARMMOVBUreg_0(v *Value) bool { 5852 // match: (MOVBUreg x:(MOVBUload _ _)) 5853 // cond: 5854 // result: (MOVWreg x) 5855 for { 5856 x := v.Args[0] 5857 if x.Op != OpARMMOVBUload { 5858 break 5859 } 5860 _ = x.Args[1] 5861 v.reset(OpARMMOVWreg) 5862 v.AddArg(x) 5863 return true 5864 } 5865 // match: (MOVBUreg (ANDconst [c] x)) 5866 // cond: 5867 // result: (ANDconst [c&0xff] x) 5868 for { 5869 v_0 := v.Args[0] 5870 if v_0.Op != OpARMANDconst { 5871 break 5872 } 5873 c := v_0.AuxInt 5874 x := v_0.Args[0] 5875 v.reset(OpARMANDconst) 5876 v.AuxInt = c & 0xff 5877 v.AddArg(x) 5878 return true 5879 } 5880 // match: (MOVBUreg x:(MOVBUreg _)) 5881 // cond: 5882 // result: (MOVWreg x) 5883 for { 5884 x := v.Args[0] 5885 if x.Op != OpARMMOVBUreg { 5886 break 5887 } 5888 v.reset(OpARMMOVWreg) 5889 v.AddArg(x) 5890 return true 5891 } 5892 // match: (MOVBUreg (MOVWconst [c])) 5893 // cond: 5894 // result: (MOVWconst [int64(uint8(c))]) 5895 for { 5896 v_0 := v.Args[0] 5897 if v_0.Op != OpARMMOVWconst { 5898 break 5899 } 5900 c := v_0.AuxInt 5901 v.reset(OpARMMOVWconst) 5902 v.AuxInt = int64(uint8(c)) 5903 return true 5904 } 5905 return false 5906 } 5907 func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { 5908 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 5909 // cond: 5910 // result: (MOVBload [off1+off2] {sym} ptr mem) 5911 for { 5912 off1 := v.AuxInt 5913 sym := v.Aux 5914 _ = v.Args[1] 5915 v_0 := v.Args[0] 5916 if v_0.Op != OpARMADDconst { 5917 break 5918 } 5919 off2 := v_0.AuxInt 5920 ptr := v_0.Args[0] 5921 mem := v.Args[1] 5922 v.reset(OpARMMOVBload) 5923 v.AuxInt = off1 + off2 5924 v.Aux = sym 5925 v.AddArg(ptr) 5926 v.AddArg(mem) 5927 return true 5928 } 5929 // match: (MOVBload [off1] {sym} (SUBconst [off2] ptr) mem) 5930 // cond: 5931 // result: (MOVBload [off1-off2] {sym} ptr mem) 5932 for { 5933 off1 := v.AuxInt 5934 sym := v.Aux 5935 _ = v.Args[1] 5936 v_0 := v.Args[0] 5937 if v_0.Op != OpARMSUBconst { 5938 break 5939 } 5940 off2 := v_0.AuxInt 5941 ptr := v_0.Args[0] 5942 mem := v.Args[1] 5943 v.reset(OpARMMOVBload) 5944 v.AuxInt = off1 - off2 5945 v.Aux = sym 5946 v.AddArg(ptr) 5947 v.AddArg(mem) 5948 return true 5949 } 5950 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 5951 // cond: canMergeSym(sym1,sym2) 5952 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 5953 for { 5954 off1 := v.AuxInt 5955 sym1 := v.Aux 5956 _ = v.Args[1] 5957 v_0 := v.Args[0] 5958 if v_0.Op != OpARMMOVWaddr { 5959 break 5960 } 5961 off2 := v_0.AuxInt 5962 sym2 := v_0.Aux 5963 ptr := v_0.Args[0] 5964 mem := v.Args[1] 5965 if !(canMergeSym(sym1, sym2)) { 5966 break 5967 } 5968 v.reset(OpARMMOVBload) 5969 v.AuxInt = off1 + off2 5970 v.Aux = mergeSym(sym1, sym2) 5971 v.AddArg(ptr) 5972 v.AddArg(mem) 5973 return true 5974 } 5975 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 5976 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 5977 // result: (MOVBreg x) 5978 for { 5979 off := v.AuxInt 5980 sym := v.Aux 5981 _ = v.Args[1] 5982 ptr := v.Args[0] 5983 v_1 := v.Args[1] 5984 if v_1.Op != OpARMMOVBstore { 5985 break 5986 } 5987 off2 := v_1.AuxInt 5988 sym2 := v_1.Aux 5989 _ = v_1.Args[2] 5990 ptr2 := v_1.Args[0] 5991 x := v_1.Args[1] 5992 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 5993 break 5994 } 5995 v.reset(OpARMMOVBreg) 5996 v.AddArg(x) 5997 return true 5998 } 5999 return false 6000 } 6001 func rewriteValueARM_OpARMMOVBreg_0(v *Value) bool { 6002 // match: (MOVBreg x:(MOVBload _ _)) 6003 // cond: 6004 // result: (MOVWreg x) 6005 for { 6006 x := v.Args[0] 6007 if x.Op != OpARMMOVBload { 6008 break 6009 } 6010 _ = x.Args[1] 6011 v.reset(OpARMMOVWreg) 6012 v.AddArg(x) 6013 return true 6014 } 6015 // match: (MOVBreg (ANDconst [c] x)) 6016 // cond: c & 0x80 == 0 6017 // result: (ANDconst [c&0x7f] x) 6018 for { 6019 v_0 := v.Args[0] 6020 if v_0.Op != OpARMANDconst { 6021 break 6022 } 6023 c := v_0.AuxInt 6024 x := v_0.Args[0] 6025 if !(c&0x80 == 0) { 6026 break 6027 } 6028 v.reset(OpARMANDconst) 6029 v.AuxInt = c & 0x7f 6030 v.AddArg(x) 6031 return true 6032 } 6033 // match: (MOVBreg x:(MOVBreg _)) 6034 // cond: 6035 // result: (MOVWreg x) 6036 for { 6037 x := v.Args[0] 6038 if x.Op != OpARMMOVBreg { 6039 break 6040 } 6041 v.reset(OpARMMOVWreg) 6042 v.AddArg(x) 6043 return true 6044 } 6045 // match: (MOVBreg (MOVWconst [c])) 6046 // cond: 6047 // result: (MOVWconst [int64(int8(c))]) 6048 for { 6049 v_0 := v.Args[0] 6050 if v_0.Op != OpARMMOVWconst { 6051 break 6052 } 6053 c := v_0.AuxInt 6054 v.reset(OpARMMOVWconst) 6055 v.AuxInt = int64(int8(c)) 6056 return true 6057 } 6058 return false 6059 } 6060 func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { 6061 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6062 // cond: 6063 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 6064 for { 6065 off1 := v.AuxInt 6066 sym := v.Aux 6067 _ = v.Args[2] 6068 v_0 := v.Args[0] 6069 if v_0.Op != OpARMADDconst { 6070 break 6071 } 6072 off2 := v_0.AuxInt 6073 ptr := v_0.Args[0] 6074 val := v.Args[1] 6075 mem := v.Args[2] 6076 v.reset(OpARMMOVBstore) 6077 v.AuxInt = off1 + off2 6078 v.Aux = sym 6079 v.AddArg(ptr) 6080 v.AddArg(val) 6081 v.AddArg(mem) 6082 return true 6083 } 6084 // match: (MOVBstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6085 // cond: 6086 // result: (MOVBstore [off1-off2] {sym} ptr val mem) 6087 for { 6088 off1 := v.AuxInt 6089 sym := v.Aux 6090 _ = v.Args[2] 6091 v_0 := v.Args[0] 6092 if v_0.Op != OpARMSUBconst { 6093 break 6094 } 6095 off2 := v_0.AuxInt 6096 ptr := v_0.Args[0] 6097 val := v.Args[1] 6098 mem := v.Args[2] 6099 v.reset(OpARMMOVBstore) 6100 v.AuxInt = off1 - off2 6101 v.Aux = sym 6102 v.AddArg(ptr) 6103 v.AddArg(val) 6104 v.AddArg(mem) 6105 return true 6106 } 6107 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6108 // cond: canMergeSym(sym1,sym2) 6109 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6110 for { 6111 off1 := v.AuxInt 6112 sym1 := v.Aux 6113 _ = v.Args[2] 6114 v_0 := v.Args[0] 6115 if v_0.Op != OpARMMOVWaddr { 6116 break 6117 } 6118 off2 := v_0.AuxInt 6119 sym2 := v_0.Aux 6120 ptr := v_0.Args[0] 6121 val := v.Args[1] 6122 mem := v.Args[2] 6123 if !(canMergeSym(sym1, sym2)) { 6124 break 6125 } 6126 v.reset(OpARMMOVBstore) 6127 v.AuxInt = off1 + off2 6128 v.Aux = mergeSym(sym1, sym2) 6129 v.AddArg(ptr) 6130 v.AddArg(val) 6131 v.AddArg(mem) 6132 return true 6133 } 6134 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 6135 // cond: 6136 // result: (MOVBstore [off] {sym} ptr x mem) 6137 for { 6138 off := v.AuxInt 6139 sym := v.Aux 6140 _ = v.Args[2] 6141 ptr := v.Args[0] 6142 v_1 := v.Args[1] 6143 if v_1.Op != OpARMMOVBreg { 6144 break 6145 } 6146 x := v_1.Args[0] 6147 mem := v.Args[2] 6148 v.reset(OpARMMOVBstore) 6149 v.AuxInt = off 6150 v.Aux = sym 6151 v.AddArg(ptr) 6152 v.AddArg(x) 6153 v.AddArg(mem) 6154 return true 6155 } 6156 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 6157 // cond: 6158 // result: (MOVBstore [off] {sym} ptr x mem) 6159 for { 6160 off := v.AuxInt 6161 sym := v.Aux 6162 _ = v.Args[2] 6163 ptr := v.Args[0] 6164 v_1 := v.Args[1] 6165 if v_1.Op != OpARMMOVBUreg { 6166 break 6167 } 6168 x := v_1.Args[0] 6169 mem := v.Args[2] 6170 v.reset(OpARMMOVBstore) 6171 v.AuxInt = off 6172 v.Aux = sym 6173 v.AddArg(ptr) 6174 v.AddArg(x) 6175 v.AddArg(mem) 6176 return true 6177 } 6178 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 6179 // cond: 6180 // result: (MOVBstore [off] {sym} ptr x mem) 6181 for { 6182 off := v.AuxInt 6183 sym := v.Aux 6184 _ = v.Args[2] 6185 ptr := v.Args[0] 6186 v_1 := v.Args[1] 6187 if v_1.Op != OpARMMOVHreg { 6188 break 6189 } 6190 x := v_1.Args[0] 6191 mem := v.Args[2] 6192 v.reset(OpARMMOVBstore) 6193 v.AuxInt = off 6194 v.Aux = sym 6195 v.AddArg(ptr) 6196 v.AddArg(x) 6197 v.AddArg(mem) 6198 return true 6199 } 6200 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 6201 // cond: 6202 // result: (MOVBstore [off] {sym} ptr x mem) 6203 for { 6204 off := v.AuxInt 6205 sym := v.Aux 6206 _ = v.Args[2] 6207 ptr := v.Args[0] 6208 v_1 := v.Args[1] 6209 if v_1.Op != OpARMMOVHUreg { 6210 break 6211 } 6212 x := v_1.Args[0] 6213 mem := v.Args[2] 6214 v.reset(OpARMMOVBstore) 6215 v.AuxInt = off 6216 v.Aux = sym 6217 v.AddArg(ptr) 6218 v.AddArg(x) 6219 v.AddArg(mem) 6220 return true 6221 } 6222 return false 6223 } 6224 func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { 6225 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 6226 // cond: 6227 // result: (MOVDload [off1+off2] {sym} ptr mem) 6228 for { 6229 off1 := v.AuxInt 6230 sym := v.Aux 6231 _ = v.Args[1] 6232 v_0 := v.Args[0] 6233 if v_0.Op != OpARMADDconst { 6234 break 6235 } 6236 off2 := v_0.AuxInt 6237 ptr := v_0.Args[0] 6238 mem := v.Args[1] 6239 v.reset(OpARMMOVDload) 6240 v.AuxInt = off1 + off2 6241 v.Aux = sym 6242 v.AddArg(ptr) 6243 v.AddArg(mem) 6244 return true 6245 } 6246 // match: (MOVDload [off1] {sym} (SUBconst [off2] ptr) mem) 6247 // cond: 6248 // result: (MOVDload [off1-off2] {sym} ptr mem) 6249 for { 6250 off1 := v.AuxInt 6251 sym := v.Aux 6252 _ = v.Args[1] 6253 v_0 := v.Args[0] 6254 if v_0.Op != OpARMSUBconst { 6255 break 6256 } 6257 off2 := v_0.AuxInt 6258 ptr := v_0.Args[0] 6259 mem := v.Args[1] 6260 v.reset(OpARMMOVDload) 6261 v.AuxInt = off1 - off2 6262 v.Aux = sym 6263 v.AddArg(ptr) 6264 v.AddArg(mem) 6265 return true 6266 } 6267 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6268 // cond: canMergeSym(sym1,sym2) 6269 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6270 for { 6271 off1 := v.AuxInt 6272 sym1 := v.Aux 6273 _ = v.Args[1] 6274 v_0 := v.Args[0] 6275 if v_0.Op != OpARMMOVWaddr { 6276 break 6277 } 6278 off2 := v_0.AuxInt 6279 sym2 := v_0.Aux 6280 ptr := v_0.Args[0] 6281 mem := v.Args[1] 6282 if !(canMergeSym(sym1, sym2)) { 6283 break 6284 } 6285 v.reset(OpARMMOVDload) 6286 v.AuxInt = off1 + off2 6287 v.Aux = mergeSym(sym1, sym2) 6288 v.AddArg(ptr) 6289 v.AddArg(mem) 6290 return true 6291 } 6292 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 6293 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6294 // result: x 6295 for { 6296 off := v.AuxInt 6297 sym := v.Aux 6298 _ = v.Args[1] 6299 ptr := v.Args[0] 6300 v_1 := v.Args[1] 6301 if v_1.Op != OpARMMOVDstore { 6302 break 6303 } 6304 off2 := v_1.AuxInt 6305 sym2 := v_1.Aux 6306 _ = v_1.Args[2] 6307 ptr2 := v_1.Args[0] 6308 x := v_1.Args[1] 6309 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6310 break 6311 } 6312 v.reset(OpCopy) 6313 v.Type = x.Type 6314 v.AddArg(x) 6315 return true 6316 } 6317 return false 6318 } 6319 func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { 6320 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6321 // cond: 6322 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 6323 for { 6324 off1 := v.AuxInt 6325 sym := v.Aux 6326 _ = v.Args[2] 6327 v_0 := v.Args[0] 6328 if v_0.Op != OpARMADDconst { 6329 break 6330 } 6331 off2 := v_0.AuxInt 6332 ptr := v_0.Args[0] 6333 val := v.Args[1] 6334 mem := v.Args[2] 6335 v.reset(OpARMMOVDstore) 6336 v.AuxInt = off1 + off2 6337 v.Aux = sym 6338 v.AddArg(ptr) 6339 v.AddArg(val) 6340 v.AddArg(mem) 6341 return true 6342 } 6343 // match: (MOVDstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6344 // cond: 6345 // result: (MOVDstore [off1-off2] {sym} ptr val mem) 6346 for { 6347 off1 := v.AuxInt 6348 sym := v.Aux 6349 _ = v.Args[2] 6350 v_0 := v.Args[0] 6351 if v_0.Op != OpARMSUBconst { 6352 break 6353 } 6354 off2 := v_0.AuxInt 6355 ptr := v_0.Args[0] 6356 val := v.Args[1] 6357 mem := v.Args[2] 6358 v.reset(OpARMMOVDstore) 6359 v.AuxInt = off1 - off2 6360 v.Aux = sym 6361 v.AddArg(ptr) 6362 v.AddArg(val) 6363 v.AddArg(mem) 6364 return true 6365 } 6366 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6367 // cond: canMergeSym(sym1,sym2) 6368 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6369 for { 6370 off1 := v.AuxInt 6371 sym1 := v.Aux 6372 _ = v.Args[2] 6373 v_0 := v.Args[0] 6374 if v_0.Op != OpARMMOVWaddr { 6375 break 6376 } 6377 off2 := v_0.AuxInt 6378 sym2 := v_0.Aux 6379 ptr := v_0.Args[0] 6380 val := v.Args[1] 6381 mem := v.Args[2] 6382 if !(canMergeSym(sym1, sym2)) { 6383 break 6384 } 6385 v.reset(OpARMMOVDstore) 6386 v.AuxInt = off1 + off2 6387 v.Aux = mergeSym(sym1, sym2) 6388 v.AddArg(ptr) 6389 v.AddArg(val) 6390 v.AddArg(mem) 6391 return true 6392 } 6393 return false 6394 } 6395 func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { 6396 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 6397 // cond: 6398 // result: (MOVFload [off1+off2] {sym} ptr mem) 6399 for { 6400 off1 := v.AuxInt 6401 sym := v.Aux 6402 _ = v.Args[1] 6403 v_0 := v.Args[0] 6404 if v_0.Op != OpARMADDconst { 6405 break 6406 } 6407 off2 := v_0.AuxInt 6408 ptr := v_0.Args[0] 6409 mem := v.Args[1] 6410 v.reset(OpARMMOVFload) 6411 v.AuxInt = off1 + off2 6412 v.Aux = sym 6413 v.AddArg(ptr) 6414 v.AddArg(mem) 6415 return true 6416 } 6417 // match: (MOVFload [off1] {sym} (SUBconst [off2] ptr) mem) 6418 // cond: 6419 // result: (MOVFload [off1-off2] {sym} ptr mem) 6420 for { 6421 off1 := v.AuxInt 6422 sym := v.Aux 6423 _ = v.Args[1] 6424 v_0 := v.Args[0] 6425 if v_0.Op != OpARMSUBconst { 6426 break 6427 } 6428 off2 := v_0.AuxInt 6429 ptr := v_0.Args[0] 6430 mem := v.Args[1] 6431 v.reset(OpARMMOVFload) 6432 v.AuxInt = off1 - off2 6433 v.Aux = sym 6434 v.AddArg(ptr) 6435 v.AddArg(mem) 6436 return true 6437 } 6438 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6439 // cond: canMergeSym(sym1,sym2) 6440 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6441 for { 6442 off1 := v.AuxInt 6443 sym1 := v.Aux 6444 _ = v.Args[1] 6445 v_0 := v.Args[0] 6446 if v_0.Op != OpARMMOVWaddr { 6447 break 6448 } 6449 off2 := v_0.AuxInt 6450 sym2 := v_0.Aux 6451 ptr := v_0.Args[0] 6452 mem := v.Args[1] 6453 if !(canMergeSym(sym1, sym2)) { 6454 break 6455 } 6456 v.reset(OpARMMOVFload) 6457 v.AuxInt = off1 + off2 6458 v.Aux = mergeSym(sym1, sym2) 6459 v.AddArg(ptr) 6460 v.AddArg(mem) 6461 return true 6462 } 6463 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 6464 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6465 // result: x 6466 for { 6467 off := v.AuxInt 6468 sym := v.Aux 6469 _ = v.Args[1] 6470 ptr := v.Args[0] 6471 v_1 := v.Args[1] 6472 if v_1.Op != OpARMMOVFstore { 6473 break 6474 } 6475 off2 := v_1.AuxInt 6476 sym2 := v_1.Aux 6477 _ = v_1.Args[2] 6478 ptr2 := v_1.Args[0] 6479 x := v_1.Args[1] 6480 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6481 break 6482 } 6483 v.reset(OpCopy) 6484 v.Type = x.Type 6485 v.AddArg(x) 6486 return true 6487 } 6488 return false 6489 } 6490 func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { 6491 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6492 // cond: 6493 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 6494 for { 6495 off1 := v.AuxInt 6496 sym := v.Aux 6497 _ = v.Args[2] 6498 v_0 := v.Args[0] 6499 if v_0.Op != OpARMADDconst { 6500 break 6501 } 6502 off2 := v_0.AuxInt 6503 ptr := v_0.Args[0] 6504 val := v.Args[1] 6505 mem := v.Args[2] 6506 v.reset(OpARMMOVFstore) 6507 v.AuxInt = off1 + off2 6508 v.Aux = sym 6509 v.AddArg(ptr) 6510 v.AddArg(val) 6511 v.AddArg(mem) 6512 return true 6513 } 6514 // match: (MOVFstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6515 // cond: 6516 // result: (MOVFstore [off1-off2] {sym} ptr val mem) 6517 for { 6518 off1 := v.AuxInt 6519 sym := v.Aux 6520 _ = v.Args[2] 6521 v_0 := v.Args[0] 6522 if v_0.Op != OpARMSUBconst { 6523 break 6524 } 6525 off2 := v_0.AuxInt 6526 ptr := v_0.Args[0] 6527 val := v.Args[1] 6528 mem := v.Args[2] 6529 v.reset(OpARMMOVFstore) 6530 v.AuxInt = off1 - off2 6531 v.Aux = sym 6532 v.AddArg(ptr) 6533 v.AddArg(val) 6534 v.AddArg(mem) 6535 return true 6536 } 6537 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6538 // cond: canMergeSym(sym1,sym2) 6539 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6540 for { 6541 off1 := v.AuxInt 6542 sym1 := v.Aux 6543 _ = v.Args[2] 6544 v_0 := v.Args[0] 6545 if v_0.Op != OpARMMOVWaddr { 6546 break 6547 } 6548 off2 := v_0.AuxInt 6549 sym2 := v_0.Aux 6550 ptr := v_0.Args[0] 6551 val := v.Args[1] 6552 mem := v.Args[2] 6553 if !(canMergeSym(sym1, sym2)) { 6554 break 6555 } 6556 v.reset(OpARMMOVFstore) 6557 v.AuxInt = off1 + off2 6558 v.Aux = mergeSym(sym1, sym2) 6559 v.AddArg(ptr) 6560 v.AddArg(val) 6561 v.AddArg(mem) 6562 return true 6563 } 6564 return false 6565 } 6566 func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { 6567 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 6568 // cond: 6569 // result: (MOVHUload [off1+off2] {sym} ptr mem) 6570 for { 6571 off1 := v.AuxInt 6572 sym := v.Aux 6573 _ = v.Args[1] 6574 v_0 := v.Args[0] 6575 if v_0.Op != OpARMADDconst { 6576 break 6577 } 6578 off2 := v_0.AuxInt 6579 ptr := v_0.Args[0] 6580 mem := v.Args[1] 6581 v.reset(OpARMMOVHUload) 6582 v.AuxInt = off1 + off2 6583 v.Aux = sym 6584 v.AddArg(ptr) 6585 v.AddArg(mem) 6586 return true 6587 } 6588 // match: (MOVHUload [off1] {sym} (SUBconst [off2] ptr) mem) 6589 // cond: 6590 // result: (MOVHUload [off1-off2] {sym} ptr mem) 6591 for { 6592 off1 := v.AuxInt 6593 sym := v.Aux 6594 _ = v.Args[1] 6595 v_0 := v.Args[0] 6596 if v_0.Op != OpARMSUBconst { 6597 break 6598 } 6599 off2 := v_0.AuxInt 6600 ptr := v_0.Args[0] 6601 mem := v.Args[1] 6602 v.reset(OpARMMOVHUload) 6603 v.AuxInt = off1 - off2 6604 v.Aux = sym 6605 v.AddArg(ptr) 6606 v.AddArg(mem) 6607 return true 6608 } 6609 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6610 // cond: canMergeSym(sym1,sym2) 6611 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6612 for { 6613 off1 := v.AuxInt 6614 sym1 := v.Aux 6615 _ = v.Args[1] 6616 v_0 := v.Args[0] 6617 if v_0.Op != OpARMMOVWaddr { 6618 break 6619 } 6620 off2 := v_0.AuxInt 6621 sym2 := v_0.Aux 6622 ptr := v_0.Args[0] 6623 mem := v.Args[1] 6624 if !(canMergeSym(sym1, sym2)) { 6625 break 6626 } 6627 v.reset(OpARMMOVHUload) 6628 v.AuxInt = off1 + off2 6629 v.Aux = mergeSym(sym1, sym2) 6630 v.AddArg(ptr) 6631 v.AddArg(mem) 6632 return true 6633 } 6634 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 6635 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6636 // result: (MOVHUreg x) 6637 for { 6638 off := v.AuxInt 6639 sym := v.Aux 6640 _ = v.Args[1] 6641 ptr := v.Args[0] 6642 v_1 := v.Args[1] 6643 if v_1.Op != OpARMMOVHstore { 6644 break 6645 } 6646 off2 := v_1.AuxInt 6647 sym2 := v_1.Aux 6648 _ = v_1.Args[2] 6649 ptr2 := v_1.Args[0] 6650 x := v_1.Args[1] 6651 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6652 break 6653 } 6654 v.reset(OpARMMOVHUreg) 6655 v.AddArg(x) 6656 return true 6657 } 6658 return false 6659 } 6660 func rewriteValueARM_OpARMMOVHUreg_0(v *Value) bool { 6661 // match: (MOVHUreg x:(MOVBUload _ _)) 6662 // cond: 6663 // result: (MOVWreg x) 6664 for { 6665 x := v.Args[0] 6666 if x.Op != OpARMMOVBUload { 6667 break 6668 } 6669 _ = x.Args[1] 6670 v.reset(OpARMMOVWreg) 6671 v.AddArg(x) 6672 return true 6673 } 6674 // match: (MOVHUreg x:(MOVHUload _ _)) 6675 // cond: 6676 // result: (MOVWreg x) 6677 for { 6678 x := v.Args[0] 6679 if x.Op != OpARMMOVHUload { 6680 break 6681 } 6682 _ = x.Args[1] 6683 v.reset(OpARMMOVWreg) 6684 v.AddArg(x) 6685 return true 6686 } 6687 // match: (MOVHUreg (ANDconst [c] x)) 6688 // cond: 6689 // result: (ANDconst [c&0xffff] x) 6690 for { 6691 v_0 := v.Args[0] 6692 if v_0.Op != OpARMANDconst { 6693 break 6694 } 6695 c := v_0.AuxInt 6696 x := v_0.Args[0] 6697 v.reset(OpARMANDconst) 6698 v.AuxInt = c & 0xffff 6699 v.AddArg(x) 6700 return true 6701 } 6702 // match: (MOVHUreg x:(MOVBUreg _)) 6703 // cond: 6704 // result: (MOVWreg x) 6705 for { 6706 x := v.Args[0] 6707 if x.Op != OpARMMOVBUreg { 6708 break 6709 } 6710 v.reset(OpARMMOVWreg) 6711 v.AddArg(x) 6712 return true 6713 } 6714 // match: (MOVHUreg x:(MOVHUreg _)) 6715 // cond: 6716 // result: (MOVWreg x) 6717 for { 6718 x := v.Args[0] 6719 if x.Op != OpARMMOVHUreg { 6720 break 6721 } 6722 v.reset(OpARMMOVWreg) 6723 v.AddArg(x) 6724 return true 6725 } 6726 // match: (MOVHUreg (MOVWconst [c])) 6727 // cond: 6728 // result: (MOVWconst [int64(uint16(c))]) 6729 for { 6730 v_0 := v.Args[0] 6731 if v_0.Op != OpARMMOVWconst { 6732 break 6733 } 6734 c := v_0.AuxInt 6735 v.reset(OpARMMOVWconst) 6736 v.AuxInt = int64(uint16(c)) 6737 return true 6738 } 6739 return false 6740 } 6741 func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { 6742 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 6743 // cond: 6744 // result: (MOVHload [off1+off2] {sym} ptr mem) 6745 for { 6746 off1 := v.AuxInt 6747 sym := v.Aux 6748 _ = v.Args[1] 6749 v_0 := v.Args[0] 6750 if v_0.Op != OpARMADDconst { 6751 break 6752 } 6753 off2 := v_0.AuxInt 6754 ptr := v_0.Args[0] 6755 mem := v.Args[1] 6756 v.reset(OpARMMOVHload) 6757 v.AuxInt = off1 + off2 6758 v.Aux = sym 6759 v.AddArg(ptr) 6760 v.AddArg(mem) 6761 return true 6762 } 6763 // match: (MOVHload [off1] {sym} (SUBconst [off2] ptr) mem) 6764 // cond: 6765 // result: (MOVHload [off1-off2] {sym} ptr mem) 6766 for { 6767 off1 := v.AuxInt 6768 sym := v.Aux 6769 _ = v.Args[1] 6770 v_0 := v.Args[0] 6771 if v_0.Op != OpARMSUBconst { 6772 break 6773 } 6774 off2 := v_0.AuxInt 6775 ptr := v_0.Args[0] 6776 mem := v.Args[1] 6777 v.reset(OpARMMOVHload) 6778 v.AuxInt = off1 - off2 6779 v.Aux = sym 6780 v.AddArg(ptr) 6781 v.AddArg(mem) 6782 return true 6783 } 6784 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6785 // cond: canMergeSym(sym1,sym2) 6786 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6787 for { 6788 off1 := v.AuxInt 6789 sym1 := v.Aux 6790 _ = v.Args[1] 6791 v_0 := v.Args[0] 6792 if v_0.Op != OpARMMOVWaddr { 6793 break 6794 } 6795 off2 := v_0.AuxInt 6796 sym2 := v_0.Aux 6797 ptr := v_0.Args[0] 6798 mem := v.Args[1] 6799 if !(canMergeSym(sym1, sym2)) { 6800 break 6801 } 6802 v.reset(OpARMMOVHload) 6803 v.AuxInt = off1 + off2 6804 v.Aux = mergeSym(sym1, sym2) 6805 v.AddArg(ptr) 6806 v.AddArg(mem) 6807 return true 6808 } 6809 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 6810 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6811 // result: (MOVHreg x) 6812 for { 6813 off := v.AuxInt 6814 sym := v.Aux 6815 _ = v.Args[1] 6816 ptr := v.Args[0] 6817 v_1 := v.Args[1] 6818 if v_1.Op != OpARMMOVHstore { 6819 break 6820 } 6821 off2 := v_1.AuxInt 6822 sym2 := v_1.Aux 6823 _ = v_1.Args[2] 6824 ptr2 := v_1.Args[0] 6825 x := v_1.Args[1] 6826 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6827 break 6828 } 6829 v.reset(OpARMMOVHreg) 6830 v.AddArg(x) 6831 return true 6832 } 6833 return false 6834 } 6835 func rewriteValueARM_OpARMMOVHreg_0(v *Value) bool { 6836 // match: (MOVHreg x:(MOVBload _ _)) 6837 // cond: 6838 // result: (MOVWreg x) 6839 for { 6840 x := v.Args[0] 6841 if x.Op != OpARMMOVBload { 6842 break 6843 } 6844 _ = x.Args[1] 6845 v.reset(OpARMMOVWreg) 6846 v.AddArg(x) 6847 return true 6848 } 6849 // match: (MOVHreg x:(MOVBUload _ _)) 6850 // cond: 6851 // result: (MOVWreg x) 6852 for { 6853 x := v.Args[0] 6854 if x.Op != OpARMMOVBUload { 6855 break 6856 } 6857 _ = x.Args[1] 6858 v.reset(OpARMMOVWreg) 6859 v.AddArg(x) 6860 return true 6861 } 6862 // match: (MOVHreg x:(MOVHload _ _)) 6863 // cond: 6864 // result: (MOVWreg x) 6865 for { 6866 x := v.Args[0] 6867 if x.Op != OpARMMOVHload { 6868 break 6869 } 6870 _ = x.Args[1] 6871 v.reset(OpARMMOVWreg) 6872 v.AddArg(x) 6873 return true 6874 } 6875 // match: (MOVHreg (ANDconst [c] x)) 6876 // cond: c & 0x8000 == 0 6877 // result: (ANDconst [c&0x7fff] x) 6878 for { 6879 v_0 := v.Args[0] 6880 if v_0.Op != OpARMANDconst { 6881 break 6882 } 6883 c := v_0.AuxInt 6884 x := v_0.Args[0] 6885 if !(c&0x8000 == 0) { 6886 break 6887 } 6888 v.reset(OpARMANDconst) 6889 v.AuxInt = c & 0x7fff 6890 v.AddArg(x) 6891 return true 6892 } 6893 // match: (MOVHreg x:(MOVBreg _)) 6894 // cond: 6895 // result: (MOVWreg x) 6896 for { 6897 x := v.Args[0] 6898 if x.Op != OpARMMOVBreg { 6899 break 6900 } 6901 v.reset(OpARMMOVWreg) 6902 v.AddArg(x) 6903 return true 6904 } 6905 // match: (MOVHreg x:(MOVBUreg _)) 6906 // cond: 6907 // result: (MOVWreg x) 6908 for { 6909 x := v.Args[0] 6910 if x.Op != OpARMMOVBUreg { 6911 break 6912 } 6913 v.reset(OpARMMOVWreg) 6914 v.AddArg(x) 6915 return true 6916 } 6917 // match: (MOVHreg x:(MOVHreg _)) 6918 // cond: 6919 // result: (MOVWreg x) 6920 for { 6921 x := v.Args[0] 6922 if x.Op != OpARMMOVHreg { 6923 break 6924 } 6925 v.reset(OpARMMOVWreg) 6926 v.AddArg(x) 6927 return true 6928 } 6929 // match: (MOVHreg (MOVWconst [c])) 6930 // cond: 6931 // result: (MOVWconst [int64(int16(c))]) 6932 for { 6933 v_0 := v.Args[0] 6934 if v_0.Op != OpARMMOVWconst { 6935 break 6936 } 6937 c := v_0.AuxInt 6938 v.reset(OpARMMOVWconst) 6939 v.AuxInt = int64(int16(c)) 6940 return true 6941 } 6942 return false 6943 } 6944 func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { 6945 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 6946 // cond: 6947 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 6948 for { 6949 off1 := v.AuxInt 6950 sym := v.Aux 6951 _ = v.Args[2] 6952 v_0 := v.Args[0] 6953 if v_0.Op != OpARMADDconst { 6954 break 6955 } 6956 off2 := v_0.AuxInt 6957 ptr := v_0.Args[0] 6958 val := v.Args[1] 6959 mem := v.Args[2] 6960 v.reset(OpARMMOVHstore) 6961 v.AuxInt = off1 + off2 6962 v.Aux = sym 6963 v.AddArg(ptr) 6964 v.AddArg(val) 6965 v.AddArg(mem) 6966 return true 6967 } 6968 // match: (MOVHstore [off1] {sym} (SUBconst [off2] ptr) val mem) 6969 // cond: 6970 // result: (MOVHstore [off1-off2] {sym} ptr val mem) 6971 for { 6972 off1 := v.AuxInt 6973 sym := v.Aux 6974 _ = v.Args[2] 6975 v_0 := v.Args[0] 6976 if v_0.Op != OpARMSUBconst { 6977 break 6978 } 6979 off2 := v_0.AuxInt 6980 ptr := v_0.Args[0] 6981 val := v.Args[1] 6982 mem := v.Args[2] 6983 v.reset(OpARMMOVHstore) 6984 v.AuxInt = off1 - off2 6985 v.Aux = sym 6986 v.AddArg(ptr) 6987 v.AddArg(val) 6988 v.AddArg(mem) 6989 return true 6990 } 6991 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 6992 // cond: canMergeSym(sym1,sym2) 6993 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 6994 for { 6995 off1 := v.AuxInt 6996 sym1 := v.Aux 6997 _ = v.Args[2] 6998 v_0 := v.Args[0] 6999 if v_0.Op != OpARMMOVWaddr { 7000 break 7001 } 7002 off2 := v_0.AuxInt 7003 sym2 := v_0.Aux 7004 ptr := v_0.Args[0] 7005 val := v.Args[1] 7006 mem := v.Args[2] 7007 if !(canMergeSym(sym1, sym2)) { 7008 break 7009 } 7010 v.reset(OpARMMOVHstore) 7011 v.AuxInt = off1 + off2 7012 v.Aux = mergeSym(sym1, sym2) 7013 v.AddArg(ptr) 7014 v.AddArg(val) 7015 v.AddArg(mem) 7016 return true 7017 } 7018 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 7019 // cond: 7020 // result: (MOVHstore [off] {sym} ptr x mem) 7021 for { 7022 off := v.AuxInt 7023 sym := v.Aux 7024 _ = v.Args[2] 7025 ptr := v.Args[0] 7026 v_1 := v.Args[1] 7027 if v_1.Op != OpARMMOVHreg { 7028 break 7029 } 7030 x := v_1.Args[0] 7031 mem := v.Args[2] 7032 v.reset(OpARMMOVHstore) 7033 v.AuxInt = off 7034 v.Aux = sym 7035 v.AddArg(ptr) 7036 v.AddArg(x) 7037 v.AddArg(mem) 7038 return true 7039 } 7040 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 7041 // cond: 7042 // result: (MOVHstore [off] {sym} ptr x mem) 7043 for { 7044 off := v.AuxInt 7045 sym := v.Aux 7046 _ = v.Args[2] 7047 ptr := v.Args[0] 7048 v_1 := v.Args[1] 7049 if v_1.Op != OpARMMOVHUreg { 7050 break 7051 } 7052 x := v_1.Args[0] 7053 mem := v.Args[2] 7054 v.reset(OpARMMOVHstore) 7055 v.AuxInt = off 7056 v.Aux = sym 7057 v.AddArg(ptr) 7058 v.AddArg(x) 7059 v.AddArg(mem) 7060 return true 7061 } 7062 return false 7063 } 7064 func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { 7065 b := v.Block 7066 _ = b 7067 config := b.Func.Config 7068 _ = config 7069 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 7070 // cond: 7071 // result: (MOVWload [off1+off2] {sym} ptr mem) 7072 for { 7073 off1 := v.AuxInt 7074 sym := v.Aux 7075 _ = v.Args[1] 7076 v_0 := v.Args[0] 7077 if v_0.Op != OpARMADDconst { 7078 break 7079 } 7080 off2 := v_0.AuxInt 7081 ptr := v_0.Args[0] 7082 mem := v.Args[1] 7083 v.reset(OpARMMOVWload) 7084 v.AuxInt = off1 + off2 7085 v.Aux = sym 7086 v.AddArg(ptr) 7087 v.AddArg(mem) 7088 return true 7089 } 7090 // match: (MOVWload [off1] {sym} (SUBconst [off2] ptr) mem) 7091 // cond: 7092 // result: (MOVWload [off1-off2] {sym} ptr mem) 7093 for { 7094 off1 := v.AuxInt 7095 sym := v.Aux 7096 _ = v.Args[1] 7097 v_0 := v.Args[0] 7098 if v_0.Op != OpARMSUBconst { 7099 break 7100 } 7101 off2 := v_0.AuxInt 7102 ptr := v_0.Args[0] 7103 mem := v.Args[1] 7104 v.reset(OpARMMOVWload) 7105 v.AuxInt = off1 - off2 7106 v.Aux = sym 7107 v.AddArg(ptr) 7108 v.AddArg(mem) 7109 return true 7110 } 7111 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7112 // cond: canMergeSym(sym1,sym2) 7113 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7114 for { 7115 off1 := v.AuxInt 7116 sym1 := v.Aux 7117 _ = v.Args[1] 7118 v_0 := v.Args[0] 7119 if v_0.Op != OpARMMOVWaddr { 7120 break 7121 } 7122 off2 := v_0.AuxInt 7123 sym2 := v_0.Aux 7124 ptr := v_0.Args[0] 7125 mem := v.Args[1] 7126 if !(canMergeSym(sym1, sym2)) { 7127 break 7128 } 7129 v.reset(OpARMMOVWload) 7130 v.AuxInt = off1 + off2 7131 v.Aux = mergeSym(sym1, sym2) 7132 v.AddArg(ptr) 7133 v.AddArg(mem) 7134 return true 7135 } 7136 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 7137 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7138 // result: x 7139 for { 7140 off := v.AuxInt 7141 sym := v.Aux 7142 _ = v.Args[1] 7143 ptr := v.Args[0] 7144 v_1 := v.Args[1] 7145 if v_1.Op != OpARMMOVWstore { 7146 break 7147 } 7148 off2 := v_1.AuxInt 7149 sym2 := v_1.Aux 7150 _ = v_1.Args[2] 7151 ptr2 := v_1.Args[0] 7152 x := v_1.Args[1] 7153 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7154 break 7155 } 7156 v.reset(OpCopy) 7157 v.Type = x.Type 7158 v.AddArg(x) 7159 return true 7160 } 7161 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 7162 // cond: sym == nil && !config.nacl 7163 // result: (MOVWloadidx ptr idx mem) 7164 for { 7165 if v.AuxInt != 0 { 7166 break 7167 } 7168 sym := v.Aux 7169 _ = v.Args[1] 7170 v_0 := v.Args[0] 7171 if v_0.Op != OpARMADD { 7172 break 7173 } 7174 _ = v_0.Args[1] 7175 ptr := v_0.Args[0] 7176 idx := v_0.Args[1] 7177 mem := v.Args[1] 7178 if !(sym == nil && !config.nacl) { 7179 break 7180 } 7181 v.reset(OpARMMOVWloadidx) 7182 v.AddArg(ptr) 7183 v.AddArg(idx) 7184 v.AddArg(mem) 7185 return true 7186 } 7187 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 7188 // cond: sym == nil && !config.nacl 7189 // result: (MOVWloadshiftLL ptr idx [c] mem) 7190 for { 7191 if v.AuxInt != 0 { 7192 break 7193 } 7194 sym := v.Aux 7195 _ = v.Args[1] 7196 v_0 := v.Args[0] 7197 if v_0.Op != OpARMADDshiftLL { 7198 break 7199 } 7200 c := v_0.AuxInt 7201 _ = v_0.Args[1] 7202 ptr := v_0.Args[0] 7203 idx := v_0.Args[1] 7204 mem := v.Args[1] 7205 if !(sym == nil && !config.nacl) { 7206 break 7207 } 7208 v.reset(OpARMMOVWloadshiftLL) 7209 v.AuxInt = c 7210 v.AddArg(ptr) 7211 v.AddArg(idx) 7212 v.AddArg(mem) 7213 return true 7214 } 7215 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 7216 // cond: sym == nil && !config.nacl 7217 // result: (MOVWloadshiftRL ptr idx [c] mem) 7218 for { 7219 if v.AuxInt != 0 { 7220 break 7221 } 7222 sym := v.Aux 7223 _ = v.Args[1] 7224 v_0 := v.Args[0] 7225 if v_0.Op != OpARMADDshiftRL { 7226 break 7227 } 7228 c := v_0.AuxInt 7229 _ = v_0.Args[1] 7230 ptr := v_0.Args[0] 7231 idx := v_0.Args[1] 7232 mem := v.Args[1] 7233 if !(sym == nil && !config.nacl) { 7234 break 7235 } 7236 v.reset(OpARMMOVWloadshiftRL) 7237 v.AuxInt = c 7238 v.AddArg(ptr) 7239 v.AddArg(idx) 7240 v.AddArg(mem) 7241 return true 7242 } 7243 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 7244 // cond: sym == nil && !config.nacl 7245 // result: (MOVWloadshiftRA ptr idx [c] mem) 7246 for { 7247 if v.AuxInt != 0 { 7248 break 7249 } 7250 sym := v.Aux 7251 _ = v.Args[1] 7252 v_0 := v.Args[0] 7253 if v_0.Op != OpARMADDshiftRA { 7254 break 7255 } 7256 c := v_0.AuxInt 7257 _ = v_0.Args[1] 7258 ptr := v_0.Args[0] 7259 idx := v_0.Args[1] 7260 mem := v.Args[1] 7261 if !(sym == nil && !config.nacl) { 7262 break 7263 } 7264 v.reset(OpARMMOVWloadshiftRA) 7265 v.AuxInt = c 7266 v.AddArg(ptr) 7267 v.AddArg(idx) 7268 v.AddArg(mem) 7269 return true 7270 } 7271 return false 7272 } 7273 func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { 7274 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 7275 // cond: isSamePtr(ptr, ptr2) 7276 // result: x 7277 for { 7278 _ = v.Args[2] 7279 ptr := v.Args[0] 7280 idx := v.Args[1] 7281 v_2 := v.Args[2] 7282 if v_2.Op != OpARMMOVWstoreidx { 7283 break 7284 } 7285 _ = v_2.Args[3] 7286 ptr2 := v_2.Args[0] 7287 if idx != v_2.Args[1] { 7288 break 7289 } 7290 x := v_2.Args[2] 7291 if !(isSamePtr(ptr, ptr2)) { 7292 break 7293 } 7294 v.reset(OpCopy) 7295 v.Type = x.Type 7296 v.AddArg(x) 7297 return true 7298 } 7299 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 7300 // cond: 7301 // result: (MOVWload [c] ptr mem) 7302 for { 7303 _ = v.Args[2] 7304 ptr := v.Args[0] 7305 v_1 := v.Args[1] 7306 if v_1.Op != OpARMMOVWconst { 7307 break 7308 } 7309 c := v_1.AuxInt 7310 mem := v.Args[2] 7311 v.reset(OpARMMOVWload) 7312 v.AuxInt = c 7313 v.AddArg(ptr) 7314 v.AddArg(mem) 7315 return true 7316 } 7317 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 7318 // cond: 7319 // result: (MOVWload [c] ptr mem) 7320 for { 7321 _ = v.Args[2] 7322 v_0 := v.Args[0] 7323 if v_0.Op != OpARMMOVWconst { 7324 break 7325 } 7326 c := v_0.AuxInt 7327 ptr := v.Args[1] 7328 mem := v.Args[2] 7329 v.reset(OpARMMOVWload) 7330 v.AuxInt = c 7331 v.AddArg(ptr) 7332 v.AddArg(mem) 7333 return true 7334 } 7335 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 7336 // cond: 7337 // result: (MOVWloadshiftLL ptr idx [c] mem) 7338 for { 7339 _ = v.Args[2] 7340 ptr := v.Args[0] 7341 v_1 := v.Args[1] 7342 if v_1.Op != OpARMSLLconst { 7343 break 7344 } 7345 c := v_1.AuxInt 7346 idx := v_1.Args[0] 7347 mem := v.Args[2] 7348 v.reset(OpARMMOVWloadshiftLL) 7349 v.AuxInt = c 7350 v.AddArg(ptr) 7351 v.AddArg(idx) 7352 v.AddArg(mem) 7353 return true 7354 } 7355 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 7356 // cond: 7357 // result: (MOVWloadshiftLL ptr idx [c] mem) 7358 for { 7359 _ = v.Args[2] 7360 v_0 := v.Args[0] 7361 if v_0.Op != OpARMSLLconst { 7362 break 7363 } 7364 c := v_0.AuxInt 7365 idx := v_0.Args[0] 7366 ptr := v.Args[1] 7367 mem := v.Args[2] 7368 v.reset(OpARMMOVWloadshiftLL) 7369 v.AuxInt = c 7370 v.AddArg(ptr) 7371 v.AddArg(idx) 7372 v.AddArg(mem) 7373 return true 7374 } 7375 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 7376 // cond: 7377 // result: (MOVWloadshiftRL ptr idx [c] mem) 7378 for { 7379 _ = v.Args[2] 7380 ptr := v.Args[0] 7381 v_1 := v.Args[1] 7382 if v_1.Op != OpARMSRLconst { 7383 break 7384 } 7385 c := v_1.AuxInt 7386 idx := v_1.Args[0] 7387 mem := v.Args[2] 7388 v.reset(OpARMMOVWloadshiftRL) 7389 v.AuxInt = c 7390 v.AddArg(ptr) 7391 v.AddArg(idx) 7392 v.AddArg(mem) 7393 return true 7394 } 7395 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 7396 // cond: 7397 // result: (MOVWloadshiftRL ptr idx [c] mem) 7398 for { 7399 _ = v.Args[2] 7400 v_0 := v.Args[0] 7401 if v_0.Op != OpARMSRLconst { 7402 break 7403 } 7404 c := v_0.AuxInt 7405 idx := v_0.Args[0] 7406 ptr := v.Args[1] 7407 mem := v.Args[2] 7408 v.reset(OpARMMOVWloadshiftRL) 7409 v.AuxInt = c 7410 v.AddArg(ptr) 7411 v.AddArg(idx) 7412 v.AddArg(mem) 7413 return true 7414 } 7415 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 7416 // cond: 7417 // result: (MOVWloadshiftRA ptr idx [c] mem) 7418 for { 7419 _ = v.Args[2] 7420 ptr := v.Args[0] 7421 v_1 := v.Args[1] 7422 if v_1.Op != OpARMSRAconst { 7423 break 7424 } 7425 c := v_1.AuxInt 7426 idx := v_1.Args[0] 7427 mem := v.Args[2] 7428 v.reset(OpARMMOVWloadshiftRA) 7429 v.AuxInt = c 7430 v.AddArg(ptr) 7431 v.AddArg(idx) 7432 v.AddArg(mem) 7433 return true 7434 } 7435 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 7436 // cond: 7437 // result: (MOVWloadshiftRA ptr idx [c] mem) 7438 for { 7439 _ = v.Args[2] 7440 v_0 := v.Args[0] 7441 if v_0.Op != OpARMSRAconst { 7442 break 7443 } 7444 c := v_0.AuxInt 7445 idx := v_0.Args[0] 7446 ptr := v.Args[1] 7447 mem := v.Args[2] 7448 v.reset(OpARMMOVWloadshiftRA) 7449 v.AuxInt = c 7450 v.AddArg(ptr) 7451 v.AddArg(idx) 7452 v.AddArg(mem) 7453 return true 7454 } 7455 return false 7456 } 7457 func rewriteValueARM_OpARMMOVWloadshiftLL_0(v *Value) bool { 7458 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 7459 // cond: c==d && isSamePtr(ptr, ptr2) 7460 // result: x 7461 for { 7462 c := v.AuxInt 7463 _ = v.Args[2] 7464 ptr := v.Args[0] 7465 idx := v.Args[1] 7466 v_2 := v.Args[2] 7467 if v_2.Op != OpARMMOVWstoreshiftLL { 7468 break 7469 } 7470 d := v_2.AuxInt 7471 _ = v_2.Args[3] 7472 ptr2 := v_2.Args[0] 7473 if idx != v_2.Args[1] { 7474 break 7475 } 7476 x := v_2.Args[2] 7477 if !(c == d && isSamePtr(ptr, ptr2)) { 7478 break 7479 } 7480 v.reset(OpCopy) 7481 v.Type = x.Type 7482 v.AddArg(x) 7483 return true 7484 } 7485 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 7486 // cond: 7487 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 7488 for { 7489 d := v.AuxInt 7490 _ = v.Args[2] 7491 ptr := v.Args[0] 7492 v_1 := v.Args[1] 7493 if v_1.Op != OpARMMOVWconst { 7494 break 7495 } 7496 c := v_1.AuxInt 7497 mem := v.Args[2] 7498 v.reset(OpARMMOVWload) 7499 v.AuxInt = int64(uint32(c) << uint64(d)) 7500 v.AddArg(ptr) 7501 v.AddArg(mem) 7502 return true 7503 } 7504 return false 7505 } 7506 func rewriteValueARM_OpARMMOVWloadshiftRA_0(v *Value) bool { 7507 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 7508 // cond: c==d && isSamePtr(ptr, ptr2) 7509 // result: x 7510 for { 7511 c := v.AuxInt 7512 _ = v.Args[2] 7513 ptr := v.Args[0] 7514 idx := v.Args[1] 7515 v_2 := v.Args[2] 7516 if v_2.Op != OpARMMOVWstoreshiftRA { 7517 break 7518 } 7519 d := v_2.AuxInt 7520 _ = v_2.Args[3] 7521 ptr2 := v_2.Args[0] 7522 if idx != v_2.Args[1] { 7523 break 7524 } 7525 x := v_2.Args[2] 7526 if !(c == d && isSamePtr(ptr, ptr2)) { 7527 break 7528 } 7529 v.reset(OpCopy) 7530 v.Type = x.Type 7531 v.AddArg(x) 7532 return true 7533 } 7534 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 7535 // cond: 7536 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 7537 for { 7538 d := v.AuxInt 7539 _ = v.Args[2] 7540 ptr := v.Args[0] 7541 v_1 := v.Args[1] 7542 if v_1.Op != OpARMMOVWconst { 7543 break 7544 } 7545 c := v_1.AuxInt 7546 mem := v.Args[2] 7547 v.reset(OpARMMOVWload) 7548 v.AuxInt = int64(int32(c) >> uint64(d)) 7549 v.AddArg(ptr) 7550 v.AddArg(mem) 7551 return true 7552 } 7553 return false 7554 } 7555 func rewriteValueARM_OpARMMOVWloadshiftRL_0(v *Value) bool { 7556 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 7557 // cond: c==d && isSamePtr(ptr, ptr2) 7558 // result: x 7559 for { 7560 c := v.AuxInt 7561 _ = v.Args[2] 7562 ptr := v.Args[0] 7563 idx := v.Args[1] 7564 v_2 := v.Args[2] 7565 if v_2.Op != OpARMMOVWstoreshiftRL { 7566 break 7567 } 7568 d := v_2.AuxInt 7569 _ = v_2.Args[3] 7570 ptr2 := v_2.Args[0] 7571 if idx != v_2.Args[1] { 7572 break 7573 } 7574 x := v_2.Args[2] 7575 if !(c == d && isSamePtr(ptr, ptr2)) { 7576 break 7577 } 7578 v.reset(OpCopy) 7579 v.Type = x.Type 7580 v.AddArg(x) 7581 return true 7582 } 7583 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 7584 // cond: 7585 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 7586 for { 7587 d := v.AuxInt 7588 _ = v.Args[2] 7589 ptr := v.Args[0] 7590 v_1 := v.Args[1] 7591 if v_1.Op != OpARMMOVWconst { 7592 break 7593 } 7594 c := v_1.AuxInt 7595 mem := v.Args[2] 7596 v.reset(OpARMMOVWload) 7597 v.AuxInt = int64(uint32(c) >> uint64(d)) 7598 v.AddArg(ptr) 7599 v.AddArg(mem) 7600 return true 7601 } 7602 return false 7603 } 7604 func rewriteValueARM_OpARMMOVWreg_0(v *Value) bool { 7605 // match: (MOVWreg x) 7606 // cond: x.Uses == 1 7607 // result: (MOVWnop x) 7608 for { 7609 x := v.Args[0] 7610 if !(x.Uses == 1) { 7611 break 7612 } 7613 v.reset(OpARMMOVWnop) 7614 v.AddArg(x) 7615 return true 7616 } 7617 // match: (MOVWreg (MOVWconst [c])) 7618 // cond: 7619 // result: (MOVWconst [c]) 7620 for { 7621 v_0 := v.Args[0] 7622 if v_0.Op != OpARMMOVWconst { 7623 break 7624 } 7625 c := v_0.AuxInt 7626 v.reset(OpARMMOVWconst) 7627 v.AuxInt = c 7628 return true 7629 } 7630 return false 7631 } 7632 func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { 7633 b := v.Block 7634 _ = b 7635 config := b.Func.Config 7636 _ = config 7637 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7638 // cond: 7639 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 7640 for { 7641 off1 := v.AuxInt 7642 sym := v.Aux 7643 _ = v.Args[2] 7644 v_0 := v.Args[0] 7645 if v_0.Op != OpARMADDconst { 7646 break 7647 } 7648 off2 := v_0.AuxInt 7649 ptr := v_0.Args[0] 7650 val := v.Args[1] 7651 mem := v.Args[2] 7652 v.reset(OpARMMOVWstore) 7653 v.AuxInt = off1 + off2 7654 v.Aux = sym 7655 v.AddArg(ptr) 7656 v.AddArg(val) 7657 v.AddArg(mem) 7658 return true 7659 } 7660 // match: (MOVWstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7661 // cond: 7662 // result: (MOVWstore [off1-off2] {sym} ptr val mem) 7663 for { 7664 off1 := v.AuxInt 7665 sym := v.Aux 7666 _ = v.Args[2] 7667 v_0 := v.Args[0] 7668 if v_0.Op != OpARMSUBconst { 7669 break 7670 } 7671 off2 := v_0.AuxInt 7672 ptr := v_0.Args[0] 7673 val := v.Args[1] 7674 mem := v.Args[2] 7675 v.reset(OpARMMOVWstore) 7676 v.AuxInt = off1 - off2 7677 v.Aux = sym 7678 v.AddArg(ptr) 7679 v.AddArg(val) 7680 v.AddArg(mem) 7681 return true 7682 } 7683 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7684 // cond: canMergeSym(sym1,sym2) 7685 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7686 for { 7687 off1 := v.AuxInt 7688 sym1 := v.Aux 7689 _ = v.Args[2] 7690 v_0 := v.Args[0] 7691 if v_0.Op != OpARMMOVWaddr { 7692 break 7693 } 7694 off2 := v_0.AuxInt 7695 sym2 := v_0.Aux 7696 ptr := v_0.Args[0] 7697 val := v.Args[1] 7698 mem := v.Args[2] 7699 if !(canMergeSym(sym1, sym2)) { 7700 break 7701 } 7702 v.reset(OpARMMOVWstore) 7703 v.AuxInt = off1 + off2 7704 v.Aux = mergeSym(sym1, sym2) 7705 v.AddArg(ptr) 7706 v.AddArg(val) 7707 v.AddArg(mem) 7708 return true 7709 } 7710 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 7711 // cond: sym == nil && !config.nacl 7712 // result: (MOVWstoreidx ptr idx val mem) 7713 for { 7714 if v.AuxInt != 0 { 7715 break 7716 } 7717 sym := v.Aux 7718 _ = v.Args[2] 7719 v_0 := v.Args[0] 7720 if v_0.Op != OpARMADD { 7721 break 7722 } 7723 _ = v_0.Args[1] 7724 ptr := v_0.Args[0] 7725 idx := v_0.Args[1] 7726 val := v.Args[1] 7727 mem := v.Args[2] 7728 if !(sym == nil && !config.nacl) { 7729 break 7730 } 7731 v.reset(OpARMMOVWstoreidx) 7732 v.AddArg(ptr) 7733 v.AddArg(idx) 7734 v.AddArg(val) 7735 v.AddArg(mem) 7736 return true 7737 } 7738 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 7739 // cond: sym == nil && !config.nacl 7740 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7741 for { 7742 if v.AuxInt != 0 { 7743 break 7744 } 7745 sym := v.Aux 7746 _ = v.Args[2] 7747 v_0 := v.Args[0] 7748 if v_0.Op != OpARMADDshiftLL { 7749 break 7750 } 7751 c := v_0.AuxInt 7752 _ = v_0.Args[1] 7753 ptr := v_0.Args[0] 7754 idx := v_0.Args[1] 7755 val := v.Args[1] 7756 mem := v.Args[2] 7757 if !(sym == nil && !config.nacl) { 7758 break 7759 } 7760 v.reset(OpARMMOVWstoreshiftLL) 7761 v.AuxInt = c 7762 v.AddArg(ptr) 7763 v.AddArg(idx) 7764 v.AddArg(val) 7765 v.AddArg(mem) 7766 return true 7767 } 7768 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 7769 // cond: sym == nil && !config.nacl 7770 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7771 for { 7772 if v.AuxInt != 0 { 7773 break 7774 } 7775 sym := v.Aux 7776 _ = v.Args[2] 7777 v_0 := v.Args[0] 7778 if v_0.Op != OpARMADDshiftRL { 7779 break 7780 } 7781 c := v_0.AuxInt 7782 _ = v_0.Args[1] 7783 ptr := v_0.Args[0] 7784 idx := v_0.Args[1] 7785 val := v.Args[1] 7786 mem := v.Args[2] 7787 if !(sym == nil && !config.nacl) { 7788 break 7789 } 7790 v.reset(OpARMMOVWstoreshiftRL) 7791 v.AuxInt = c 7792 v.AddArg(ptr) 7793 v.AddArg(idx) 7794 v.AddArg(val) 7795 v.AddArg(mem) 7796 return true 7797 } 7798 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 7799 // cond: sym == nil && !config.nacl 7800 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7801 for { 7802 if v.AuxInt != 0 { 7803 break 7804 } 7805 sym := v.Aux 7806 _ = v.Args[2] 7807 v_0 := v.Args[0] 7808 if v_0.Op != OpARMADDshiftRA { 7809 break 7810 } 7811 c := v_0.AuxInt 7812 _ = v_0.Args[1] 7813 ptr := v_0.Args[0] 7814 idx := v_0.Args[1] 7815 val := v.Args[1] 7816 mem := v.Args[2] 7817 if !(sym == nil && !config.nacl) { 7818 break 7819 } 7820 v.reset(OpARMMOVWstoreshiftRA) 7821 v.AuxInt = c 7822 v.AddArg(ptr) 7823 v.AddArg(idx) 7824 v.AddArg(val) 7825 v.AddArg(mem) 7826 return true 7827 } 7828 return false 7829 } 7830 func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { 7831 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 7832 // cond: 7833 // result: (MOVWstore [c] ptr val mem) 7834 for { 7835 _ = v.Args[3] 7836 ptr := v.Args[0] 7837 v_1 := v.Args[1] 7838 if v_1.Op != OpARMMOVWconst { 7839 break 7840 } 7841 c := v_1.AuxInt 7842 val := v.Args[2] 7843 mem := v.Args[3] 7844 v.reset(OpARMMOVWstore) 7845 v.AuxInt = c 7846 v.AddArg(ptr) 7847 v.AddArg(val) 7848 v.AddArg(mem) 7849 return true 7850 } 7851 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 7852 // cond: 7853 // result: (MOVWstore [c] ptr val mem) 7854 for { 7855 _ = v.Args[3] 7856 v_0 := v.Args[0] 7857 if v_0.Op != OpARMMOVWconst { 7858 break 7859 } 7860 c := v_0.AuxInt 7861 ptr := v.Args[1] 7862 val := v.Args[2] 7863 mem := v.Args[3] 7864 v.reset(OpARMMOVWstore) 7865 v.AuxInt = c 7866 v.AddArg(ptr) 7867 v.AddArg(val) 7868 v.AddArg(mem) 7869 return true 7870 } 7871 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 7872 // cond: 7873 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7874 for { 7875 _ = v.Args[3] 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 val := v.Args[2] 7884 mem := v.Args[3] 7885 v.reset(OpARMMOVWstoreshiftLL) 7886 v.AuxInt = c 7887 v.AddArg(ptr) 7888 v.AddArg(idx) 7889 v.AddArg(val) 7890 v.AddArg(mem) 7891 return true 7892 } 7893 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 7894 // cond: 7895 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 7896 for { 7897 _ = v.Args[3] 7898 v_0 := v.Args[0] 7899 if v_0.Op != OpARMSLLconst { 7900 break 7901 } 7902 c := v_0.AuxInt 7903 idx := v_0.Args[0] 7904 ptr := v.Args[1] 7905 val := v.Args[2] 7906 mem := v.Args[3] 7907 v.reset(OpARMMOVWstoreshiftLL) 7908 v.AuxInt = c 7909 v.AddArg(ptr) 7910 v.AddArg(idx) 7911 v.AddArg(val) 7912 v.AddArg(mem) 7913 return true 7914 } 7915 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 7916 // cond: 7917 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7918 for { 7919 _ = v.Args[3] 7920 ptr := v.Args[0] 7921 v_1 := v.Args[1] 7922 if v_1.Op != OpARMSRLconst { 7923 break 7924 } 7925 c := v_1.AuxInt 7926 idx := v_1.Args[0] 7927 val := v.Args[2] 7928 mem := v.Args[3] 7929 v.reset(OpARMMOVWstoreshiftRL) 7930 v.AuxInt = c 7931 v.AddArg(ptr) 7932 v.AddArg(idx) 7933 v.AddArg(val) 7934 v.AddArg(mem) 7935 return true 7936 } 7937 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 7938 // cond: 7939 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 7940 for { 7941 _ = v.Args[3] 7942 v_0 := v.Args[0] 7943 if v_0.Op != OpARMSRLconst { 7944 break 7945 } 7946 c := v_0.AuxInt 7947 idx := v_0.Args[0] 7948 ptr := v.Args[1] 7949 val := v.Args[2] 7950 mem := v.Args[3] 7951 v.reset(OpARMMOVWstoreshiftRL) 7952 v.AuxInt = c 7953 v.AddArg(ptr) 7954 v.AddArg(idx) 7955 v.AddArg(val) 7956 v.AddArg(mem) 7957 return true 7958 } 7959 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 7960 // cond: 7961 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7962 for { 7963 _ = v.Args[3] 7964 ptr := v.Args[0] 7965 v_1 := v.Args[1] 7966 if v_1.Op != OpARMSRAconst { 7967 break 7968 } 7969 c := v_1.AuxInt 7970 idx := v_1.Args[0] 7971 val := v.Args[2] 7972 mem := v.Args[3] 7973 v.reset(OpARMMOVWstoreshiftRA) 7974 v.AuxInt = c 7975 v.AddArg(ptr) 7976 v.AddArg(idx) 7977 v.AddArg(val) 7978 v.AddArg(mem) 7979 return true 7980 } 7981 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 7982 // cond: 7983 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 7984 for { 7985 _ = v.Args[3] 7986 v_0 := v.Args[0] 7987 if v_0.Op != OpARMSRAconst { 7988 break 7989 } 7990 c := v_0.AuxInt 7991 idx := v_0.Args[0] 7992 ptr := v.Args[1] 7993 val := v.Args[2] 7994 mem := v.Args[3] 7995 v.reset(OpARMMOVWstoreshiftRA) 7996 v.AuxInt = c 7997 v.AddArg(ptr) 7998 v.AddArg(idx) 7999 v.AddArg(val) 8000 v.AddArg(mem) 8001 return true 8002 } 8003 return false 8004 } 8005 func rewriteValueARM_OpARMMOVWstoreshiftLL_0(v *Value) bool { 8006 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 8007 // cond: 8008 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 8009 for { 8010 d := v.AuxInt 8011 _ = v.Args[3] 8012 ptr := v.Args[0] 8013 v_1 := v.Args[1] 8014 if v_1.Op != OpARMMOVWconst { 8015 break 8016 } 8017 c := v_1.AuxInt 8018 val := v.Args[2] 8019 mem := v.Args[3] 8020 v.reset(OpARMMOVWstore) 8021 v.AuxInt = int64(uint32(c) << uint64(d)) 8022 v.AddArg(ptr) 8023 v.AddArg(val) 8024 v.AddArg(mem) 8025 return true 8026 } 8027 return false 8028 } 8029 func rewriteValueARM_OpARMMOVWstoreshiftRA_0(v *Value) bool { 8030 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 8031 // cond: 8032 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 8033 for { 8034 d := v.AuxInt 8035 _ = v.Args[3] 8036 ptr := v.Args[0] 8037 v_1 := v.Args[1] 8038 if v_1.Op != OpARMMOVWconst { 8039 break 8040 } 8041 c := v_1.AuxInt 8042 val := v.Args[2] 8043 mem := v.Args[3] 8044 v.reset(OpARMMOVWstore) 8045 v.AuxInt = int64(int32(c) >> uint64(d)) 8046 v.AddArg(ptr) 8047 v.AddArg(val) 8048 v.AddArg(mem) 8049 return true 8050 } 8051 return false 8052 } 8053 func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { 8054 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 8055 // cond: 8056 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 8057 for { 8058 d := v.AuxInt 8059 _ = v.Args[3] 8060 ptr := v.Args[0] 8061 v_1 := v.Args[1] 8062 if v_1.Op != OpARMMOVWconst { 8063 break 8064 } 8065 c := v_1.AuxInt 8066 val := v.Args[2] 8067 mem := v.Args[3] 8068 v.reset(OpARMMOVWstore) 8069 v.AuxInt = int64(uint32(c) >> uint64(d)) 8070 v.AddArg(ptr) 8071 v.AddArg(val) 8072 v.AddArg(mem) 8073 return true 8074 } 8075 return false 8076 } 8077 func rewriteValueARM_OpARMMUL_0(v *Value) bool { 8078 // match: (MUL x (MOVWconst [c])) 8079 // cond: int32(c) == -1 8080 // result: (RSBconst [0] x) 8081 for { 8082 _ = v.Args[1] 8083 x := v.Args[0] 8084 v_1 := v.Args[1] 8085 if v_1.Op != OpARMMOVWconst { 8086 break 8087 } 8088 c := v_1.AuxInt 8089 if !(int32(c) == -1) { 8090 break 8091 } 8092 v.reset(OpARMRSBconst) 8093 v.AuxInt = 0 8094 v.AddArg(x) 8095 return true 8096 } 8097 // match: (MUL (MOVWconst [c]) x) 8098 // cond: int32(c) == -1 8099 // result: (RSBconst [0] x) 8100 for { 8101 _ = v.Args[1] 8102 v_0 := v.Args[0] 8103 if v_0.Op != OpARMMOVWconst { 8104 break 8105 } 8106 c := v_0.AuxInt 8107 x := v.Args[1] 8108 if !(int32(c) == -1) { 8109 break 8110 } 8111 v.reset(OpARMRSBconst) 8112 v.AuxInt = 0 8113 v.AddArg(x) 8114 return true 8115 } 8116 // match: (MUL _ (MOVWconst [0])) 8117 // cond: 8118 // result: (MOVWconst [0]) 8119 for { 8120 _ = v.Args[1] 8121 v_1 := v.Args[1] 8122 if v_1.Op != OpARMMOVWconst { 8123 break 8124 } 8125 if v_1.AuxInt != 0 { 8126 break 8127 } 8128 v.reset(OpARMMOVWconst) 8129 v.AuxInt = 0 8130 return true 8131 } 8132 // match: (MUL (MOVWconst [0]) _) 8133 // cond: 8134 // result: (MOVWconst [0]) 8135 for { 8136 _ = v.Args[1] 8137 v_0 := v.Args[0] 8138 if v_0.Op != OpARMMOVWconst { 8139 break 8140 } 8141 if v_0.AuxInt != 0 { 8142 break 8143 } 8144 v.reset(OpARMMOVWconst) 8145 v.AuxInt = 0 8146 return true 8147 } 8148 // match: (MUL x (MOVWconst [1])) 8149 // cond: 8150 // result: x 8151 for { 8152 _ = v.Args[1] 8153 x := v.Args[0] 8154 v_1 := v.Args[1] 8155 if v_1.Op != OpARMMOVWconst { 8156 break 8157 } 8158 if v_1.AuxInt != 1 { 8159 break 8160 } 8161 v.reset(OpCopy) 8162 v.Type = x.Type 8163 v.AddArg(x) 8164 return true 8165 } 8166 // match: (MUL (MOVWconst [1]) x) 8167 // cond: 8168 // result: x 8169 for { 8170 _ = v.Args[1] 8171 v_0 := v.Args[0] 8172 if v_0.Op != OpARMMOVWconst { 8173 break 8174 } 8175 if v_0.AuxInt != 1 { 8176 break 8177 } 8178 x := v.Args[1] 8179 v.reset(OpCopy) 8180 v.Type = x.Type 8181 v.AddArg(x) 8182 return true 8183 } 8184 // match: (MUL x (MOVWconst [c])) 8185 // cond: isPowerOfTwo(c) 8186 // result: (SLLconst [log2(c)] x) 8187 for { 8188 _ = v.Args[1] 8189 x := v.Args[0] 8190 v_1 := v.Args[1] 8191 if v_1.Op != OpARMMOVWconst { 8192 break 8193 } 8194 c := v_1.AuxInt 8195 if !(isPowerOfTwo(c)) { 8196 break 8197 } 8198 v.reset(OpARMSLLconst) 8199 v.AuxInt = log2(c) 8200 v.AddArg(x) 8201 return true 8202 } 8203 // match: (MUL (MOVWconst [c]) x) 8204 // cond: isPowerOfTwo(c) 8205 // result: (SLLconst [log2(c)] x) 8206 for { 8207 _ = v.Args[1] 8208 v_0 := v.Args[0] 8209 if v_0.Op != OpARMMOVWconst { 8210 break 8211 } 8212 c := v_0.AuxInt 8213 x := v.Args[1] 8214 if !(isPowerOfTwo(c)) { 8215 break 8216 } 8217 v.reset(OpARMSLLconst) 8218 v.AuxInt = log2(c) 8219 v.AddArg(x) 8220 return true 8221 } 8222 // match: (MUL x (MOVWconst [c])) 8223 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 8224 // result: (ADDshiftLL x x [log2(c-1)]) 8225 for { 8226 _ = v.Args[1] 8227 x := v.Args[0] 8228 v_1 := v.Args[1] 8229 if v_1.Op != OpARMMOVWconst { 8230 break 8231 } 8232 c := v_1.AuxInt 8233 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 8234 break 8235 } 8236 v.reset(OpARMADDshiftLL) 8237 v.AuxInt = log2(c - 1) 8238 v.AddArg(x) 8239 v.AddArg(x) 8240 return true 8241 } 8242 // match: (MUL (MOVWconst [c]) x) 8243 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 8244 // result: (ADDshiftLL x x [log2(c-1)]) 8245 for { 8246 _ = v.Args[1] 8247 v_0 := v.Args[0] 8248 if v_0.Op != OpARMMOVWconst { 8249 break 8250 } 8251 c := v_0.AuxInt 8252 x := v.Args[1] 8253 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 8254 break 8255 } 8256 v.reset(OpARMADDshiftLL) 8257 v.AuxInt = log2(c - 1) 8258 v.AddArg(x) 8259 v.AddArg(x) 8260 return true 8261 } 8262 return false 8263 } 8264 func rewriteValueARM_OpARMMUL_10(v *Value) bool { 8265 b := v.Block 8266 _ = b 8267 // match: (MUL x (MOVWconst [c])) 8268 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 8269 // result: (RSBshiftLL x x [log2(c+1)]) 8270 for { 8271 _ = v.Args[1] 8272 x := v.Args[0] 8273 v_1 := v.Args[1] 8274 if v_1.Op != OpARMMOVWconst { 8275 break 8276 } 8277 c := v_1.AuxInt 8278 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 8279 break 8280 } 8281 v.reset(OpARMRSBshiftLL) 8282 v.AuxInt = log2(c + 1) 8283 v.AddArg(x) 8284 v.AddArg(x) 8285 return true 8286 } 8287 // match: (MUL (MOVWconst [c]) x) 8288 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 8289 // result: (RSBshiftLL x x [log2(c+1)]) 8290 for { 8291 _ = v.Args[1] 8292 v_0 := v.Args[0] 8293 if v_0.Op != OpARMMOVWconst { 8294 break 8295 } 8296 c := v_0.AuxInt 8297 x := v.Args[1] 8298 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 8299 break 8300 } 8301 v.reset(OpARMRSBshiftLL) 8302 v.AuxInt = log2(c + 1) 8303 v.AddArg(x) 8304 v.AddArg(x) 8305 return true 8306 } 8307 // match: (MUL x (MOVWconst [c])) 8308 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 8309 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 8310 for { 8311 _ = v.Args[1] 8312 x := v.Args[0] 8313 v_1 := v.Args[1] 8314 if v_1.Op != OpARMMOVWconst { 8315 break 8316 } 8317 c := v_1.AuxInt 8318 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 8319 break 8320 } 8321 v.reset(OpARMSLLconst) 8322 v.AuxInt = log2(c / 3) 8323 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8324 v0.AuxInt = 1 8325 v0.AddArg(x) 8326 v0.AddArg(x) 8327 v.AddArg(v0) 8328 return true 8329 } 8330 // match: (MUL (MOVWconst [c]) x) 8331 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 8332 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 8333 for { 8334 _ = v.Args[1] 8335 v_0 := v.Args[0] 8336 if v_0.Op != OpARMMOVWconst { 8337 break 8338 } 8339 c := v_0.AuxInt 8340 x := v.Args[1] 8341 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 8342 break 8343 } 8344 v.reset(OpARMSLLconst) 8345 v.AuxInt = log2(c / 3) 8346 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8347 v0.AuxInt = 1 8348 v0.AddArg(x) 8349 v0.AddArg(x) 8350 v.AddArg(v0) 8351 return true 8352 } 8353 // match: (MUL x (MOVWconst [c])) 8354 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8355 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 8356 for { 8357 _ = v.Args[1] 8358 x := v.Args[0] 8359 v_1 := v.Args[1] 8360 if v_1.Op != OpARMMOVWconst { 8361 break 8362 } 8363 c := v_1.AuxInt 8364 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8365 break 8366 } 8367 v.reset(OpARMSLLconst) 8368 v.AuxInt = log2(c / 5) 8369 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8370 v0.AuxInt = 2 8371 v0.AddArg(x) 8372 v0.AddArg(x) 8373 v.AddArg(v0) 8374 return true 8375 } 8376 // match: (MUL (MOVWconst [c]) x) 8377 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8378 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 8379 for { 8380 _ = v.Args[1] 8381 v_0 := v.Args[0] 8382 if v_0.Op != OpARMMOVWconst { 8383 break 8384 } 8385 c := v_0.AuxInt 8386 x := v.Args[1] 8387 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8388 break 8389 } 8390 v.reset(OpARMSLLconst) 8391 v.AuxInt = log2(c / 5) 8392 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8393 v0.AuxInt = 2 8394 v0.AddArg(x) 8395 v0.AddArg(x) 8396 v.AddArg(v0) 8397 return true 8398 } 8399 // match: (MUL x (MOVWconst [c])) 8400 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8401 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 8402 for { 8403 _ = v.Args[1] 8404 x := v.Args[0] 8405 v_1 := v.Args[1] 8406 if v_1.Op != OpARMMOVWconst { 8407 break 8408 } 8409 c := v_1.AuxInt 8410 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8411 break 8412 } 8413 v.reset(OpARMSLLconst) 8414 v.AuxInt = log2(c / 7) 8415 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8416 v0.AuxInt = 3 8417 v0.AddArg(x) 8418 v0.AddArg(x) 8419 v.AddArg(v0) 8420 return true 8421 } 8422 // match: (MUL (MOVWconst [c]) x) 8423 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8424 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 8425 for { 8426 _ = v.Args[1] 8427 v_0 := v.Args[0] 8428 if v_0.Op != OpARMMOVWconst { 8429 break 8430 } 8431 c := v_0.AuxInt 8432 x := v.Args[1] 8433 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8434 break 8435 } 8436 v.reset(OpARMSLLconst) 8437 v.AuxInt = log2(c / 7) 8438 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8439 v0.AuxInt = 3 8440 v0.AddArg(x) 8441 v0.AddArg(x) 8442 v.AddArg(v0) 8443 return true 8444 } 8445 // match: (MUL x (MOVWconst [c])) 8446 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8447 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 8448 for { 8449 _ = v.Args[1] 8450 x := v.Args[0] 8451 v_1 := v.Args[1] 8452 if v_1.Op != OpARMMOVWconst { 8453 break 8454 } 8455 c := v_1.AuxInt 8456 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8457 break 8458 } 8459 v.reset(OpARMSLLconst) 8460 v.AuxInt = log2(c / 9) 8461 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8462 v0.AuxInt = 3 8463 v0.AddArg(x) 8464 v0.AddArg(x) 8465 v.AddArg(v0) 8466 return true 8467 } 8468 // match: (MUL (MOVWconst [c]) x) 8469 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8470 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 8471 for { 8472 _ = v.Args[1] 8473 v_0 := v.Args[0] 8474 if v_0.Op != OpARMMOVWconst { 8475 break 8476 } 8477 c := v_0.AuxInt 8478 x := v.Args[1] 8479 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8480 break 8481 } 8482 v.reset(OpARMSLLconst) 8483 v.AuxInt = log2(c / 9) 8484 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8485 v0.AuxInt = 3 8486 v0.AddArg(x) 8487 v0.AddArg(x) 8488 v.AddArg(v0) 8489 return true 8490 } 8491 return false 8492 } 8493 func rewriteValueARM_OpARMMUL_20(v *Value) bool { 8494 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 8495 // cond: 8496 // result: (MOVWconst [int64(int32(c*d))]) 8497 for { 8498 _ = v.Args[1] 8499 v_0 := v.Args[0] 8500 if v_0.Op != OpARMMOVWconst { 8501 break 8502 } 8503 c := v_0.AuxInt 8504 v_1 := v.Args[1] 8505 if v_1.Op != OpARMMOVWconst { 8506 break 8507 } 8508 d := v_1.AuxInt 8509 v.reset(OpARMMOVWconst) 8510 v.AuxInt = int64(int32(c * d)) 8511 return true 8512 } 8513 // match: (MUL (MOVWconst [d]) (MOVWconst [c])) 8514 // cond: 8515 // result: (MOVWconst [int64(int32(c*d))]) 8516 for { 8517 _ = v.Args[1] 8518 v_0 := v.Args[0] 8519 if v_0.Op != OpARMMOVWconst { 8520 break 8521 } 8522 d := v_0.AuxInt 8523 v_1 := v.Args[1] 8524 if v_1.Op != OpARMMOVWconst { 8525 break 8526 } 8527 c := v_1.AuxInt 8528 v.reset(OpARMMOVWconst) 8529 v.AuxInt = int64(int32(c * d)) 8530 return true 8531 } 8532 return false 8533 } 8534 func rewriteValueARM_OpARMMULA_0(v *Value) bool { 8535 b := v.Block 8536 _ = b 8537 // match: (MULA x (MOVWconst [c]) a) 8538 // cond: int32(c) == -1 8539 // result: (SUB a x) 8540 for { 8541 _ = v.Args[2] 8542 x := v.Args[0] 8543 v_1 := v.Args[1] 8544 if v_1.Op != OpARMMOVWconst { 8545 break 8546 } 8547 c := v_1.AuxInt 8548 a := v.Args[2] 8549 if !(int32(c) == -1) { 8550 break 8551 } 8552 v.reset(OpARMSUB) 8553 v.AddArg(a) 8554 v.AddArg(x) 8555 return true 8556 } 8557 // match: (MULA _ (MOVWconst [0]) a) 8558 // cond: 8559 // result: a 8560 for { 8561 _ = v.Args[2] 8562 v_1 := v.Args[1] 8563 if v_1.Op != OpARMMOVWconst { 8564 break 8565 } 8566 if v_1.AuxInt != 0 { 8567 break 8568 } 8569 a := v.Args[2] 8570 v.reset(OpCopy) 8571 v.Type = a.Type 8572 v.AddArg(a) 8573 return true 8574 } 8575 // match: (MULA x (MOVWconst [1]) a) 8576 // cond: 8577 // result: (ADD x a) 8578 for { 8579 _ = v.Args[2] 8580 x := v.Args[0] 8581 v_1 := v.Args[1] 8582 if v_1.Op != OpARMMOVWconst { 8583 break 8584 } 8585 if v_1.AuxInt != 1 { 8586 break 8587 } 8588 a := v.Args[2] 8589 v.reset(OpARMADD) 8590 v.AddArg(x) 8591 v.AddArg(a) 8592 return true 8593 } 8594 // match: (MULA x (MOVWconst [c]) a) 8595 // cond: isPowerOfTwo(c) 8596 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 8597 for { 8598 _ = v.Args[2] 8599 x := v.Args[0] 8600 v_1 := v.Args[1] 8601 if v_1.Op != OpARMMOVWconst { 8602 break 8603 } 8604 c := v_1.AuxInt 8605 a := v.Args[2] 8606 if !(isPowerOfTwo(c)) { 8607 break 8608 } 8609 v.reset(OpARMADD) 8610 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8611 v0.AuxInt = log2(c) 8612 v0.AddArg(x) 8613 v.AddArg(v0) 8614 v.AddArg(a) 8615 return true 8616 } 8617 // match: (MULA x (MOVWconst [c]) a) 8618 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 8619 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 8620 for { 8621 _ = v.Args[2] 8622 x := v.Args[0] 8623 v_1 := v.Args[1] 8624 if v_1.Op != OpARMMOVWconst { 8625 break 8626 } 8627 c := v_1.AuxInt 8628 a := v.Args[2] 8629 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 8630 break 8631 } 8632 v.reset(OpARMADD) 8633 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8634 v0.AuxInt = log2(c - 1) 8635 v0.AddArg(x) 8636 v0.AddArg(x) 8637 v.AddArg(v0) 8638 v.AddArg(a) 8639 return true 8640 } 8641 // match: (MULA x (MOVWconst [c]) a) 8642 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 8643 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 8644 for { 8645 _ = v.Args[2] 8646 x := v.Args[0] 8647 v_1 := v.Args[1] 8648 if v_1.Op != OpARMMOVWconst { 8649 break 8650 } 8651 c := v_1.AuxInt 8652 a := v.Args[2] 8653 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 8654 break 8655 } 8656 v.reset(OpARMADD) 8657 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8658 v0.AuxInt = log2(c + 1) 8659 v0.AddArg(x) 8660 v0.AddArg(x) 8661 v.AddArg(v0) 8662 v.AddArg(a) 8663 return true 8664 } 8665 // match: (MULA x (MOVWconst [c]) a) 8666 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 8667 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 8668 for { 8669 _ = v.Args[2] 8670 x := v.Args[0] 8671 v_1 := v.Args[1] 8672 if v_1.Op != OpARMMOVWconst { 8673 break 8674 } 8675 c := v_1.AuxInt 8676 a := v.Args[2] 8677 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 8678 break 8679 } 8680 v.reset(OpARMADD) 8681 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8682 v0.AuxInt = log2(c / 3) 8683 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8684 v1.AuxInt = 1 8685 v1.AddArg(x) 8686 v1.AddArg(x) 8687 v0.AddArg(v1) 8688 v.AddArg(v0) 8689 v.AddArg(a) 8690 return true 8691 } 8692 // match: (MULA x (MOVWconst [c]) a) 8693 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8694 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 8695 for { 8696 _ = v.Args[2] 8697 x := v.Args[0] 8698 v_1 := v.Args[1] 8699 if v_1.Op != OpARMMOVWconst { 8700 break 8701 } 8702 c := v_1.AuxInt 8703 a := v.Args[2] 8704 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8705 break 8706 } 8707 v.reset(OpARMADD) 8708 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8709 v0.AuxInt = log2(c / 5) 8710 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8711 v1.AuxInt = 2 8712 v1.AddArg(x) 8713 v1.AddArg(x) 8714 v0.AddArg(v1) 8715 v.AddArg(v0) 8716 v.AddArg(a) 8717 return true 8718 } 8719 // match: (MULA x (MOVWconst [c]) a) 8720 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8721 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 8722 for { 8723 _ = v.Args[2] 8724 x := v.Args[0] 8725 v_1 := v.Args[1] 8726 if v_1.Op != OpARMMOVWconst { 8727 break 8728 } 8729 c := v_1.AuxInt 8730 a := v.Args[2] 8731 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8732 break 8733 } 8734 v.reset(OpARMADD) 8735 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8736 v0.AuxInt = log2(c / 7) 8737 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8738 v1.AuxInt = 3 8739 v1.AddArg(x) 8740 v1.AddArg(x) 8741 v0.AddArg(v1) 8742 v.AddArg(v0) 8743 v.AddArg(a) 8744 return true 8745 } 8746 // match: (MULA x (MOVWconst [c]) a) 8747 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8748 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 8749 for { 8750 _ = v.Args[2] 8751 x := v.Args[0] 8752 v_1 := v.Args[1] 8753 if v_1.Op != OpARMMOVWconst { 8754 break 8755 } 8756 c := v_1.AuxInt 8757 a := v.Args[2] 8758 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 8759 break 8760 } 8761 v.reset(OpARMADD) 8762 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8763 v0.AuxInt = log2(c / 9) 8764 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8765 v1.AuxInt = 3 8766 v1.AddArg(x) 8767 v1.AddArg(x) 8768 v0.AddArg(v1) 8769 v.AddArg(v0) 8770 v.AddArg(a) 8771 return true 8772 } 8773 return false 8774 } 8775 func rewriteValueARM_OpARMMULA_10(v *Value) bool { 8776 b := v.Block 8777 _ = b 8778 // match: (MULA (MOVWconst [c]) x a) 8779 // cond: int32(c) == -1 8780 // result: (SUB a x) 8781 for { 8782 _ = v.Args[2] 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 a := v.Args[2] 8790 if !(int32(c) == -1) { 8791 break 8792 } 8793 v.reset(OpARMSUB) 8794 v.AddArg(a) 8795 v.AddArg(x) 8796 return true 8797 } 8798 // match: (MULA (MOVWconst [0]) _ a) 8799 // cond: 8800 // result: a 8801 for { 8802 _ = v.Args[2] 8803 v_0 := v.Args[0] 8804 if v_0.Op != OpARMMOVWconst { 8805 break 8806 } 8807 if v_0.AuxInt != 0 { 8808 break 8809 } 8810 a := v.Args[2] 8811 v.reset(OpCopy) 8812 v.Type = a.Type 8813 v.AddArg(a) 8814 return true 8815 } 8816 // match: (MULA (MOVWconst [1]) x a) 8817 // cond: 8818 // result: (ADD x a) 8819 for { 8820 _ = v.Args[2] 8821 v_0 := v.Args[0] 8822 if v_0.Op != OpARMMOVWconst { 8823 break 8824 } 8825 if v_0.AuxInt != 1 { 8826 break 8827 } 8828 x := v.Args[1] 8829 a := v.Args[2] 8830 v.reset(OpARMADD) 8831 v.AddArg(x) 8832 v.AddArg(a) 8833 return true 8834 } 8835 // match: (MULA (MOVWconst [c]) x a) 8836 // cond: isPowerOfTwo(c) 8837 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 8838 for { 8839 _ = v.Args[2] 8840 v_0 := v.Args[0] 8841 if v_0.Op != OpARMMOVWconst { 8842 break 8843 } 8844 c := v_0.AuxInt 8845 x := v.Args[1] 8846 a := v.Args[2] 8847 if !(isPowerOfTwo(c)) { 8848 break 8849 } 8850 v.reset(OpARMADD) 8851 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8852 v0.AuxInt = log2(c) 8853 v0.AddArg(x) 8854 v.AddArg(v0) 8855 v.AddArg(a) 8856 return true 8857 } 8858 // match: (MULA (MOVWconst [c]) x a) 8859 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 8860 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 8861 for { 8862 _ = v.Args[2] 8863 v_0 := v.Args[0] 8864 if v_0.Op != OpARMMOVWconst { 8865 break 8866 } 8867 c := v_0.AuxInt 8868 x := v.Args[1] 8869 a := v.Args[2] 8870 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 8871 break 8872 } 8873 v.reset(OpARMADD) 8874 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8875 v0.AuxInt = log2(c - 1) 8876 v0.AddArg(x) 8877 v0.AddArg(x) 8878 v.AddArg(v0) 8879 v.AddArg(a) 8880 return true 8881 } 8882 // match: (MULA (MOVWconst [c]) x a) 8883 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 8884 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 8885 for { 8886 _ = v.Args[2] 8887 v_0 := v.Args[0] 8888 if v_0.Op != OpARMMOVWconst { 8889 break 8890 } 8891 c := v_0.AuxInt 8892 x := v.Args[1] 8893 a := v.Args[2] 8894 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 8895 break 8896 } 8897 v.reset(OpARMADD) 8898 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8899 v0.AuxInt = log2(c + 1) 8900 v0.AddArg(x) 8901 v0.AddArg(x) 8902 v.AddArg(v0) 8903 v.AddArg(a) 8904 return true 8905 } 8906 // match: (MULA (MOVWconst [c]) x a) 8907 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 8908 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 8909 for { 8910 _ = v.Args[2] 8911 v_0 := v.Args[0] 8912 if v_0.Op != OpARMMOVWconst { 8913 break 8914 } 8915 c := v_0.AuxInt 8916 x := v.Args[1] 8917 a := v.Args[2] 8918 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 8919 break 8920 } 8921 v.reset(OpARMADD) 8922 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8923 v0.AuxInt = log2(c / 3) 8924 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8925 v1.AuxInt = 1 8926 v1.AddArg(x) 8927 v1.AddArg(x) 8928 v0.AddArg(v1) 8929 v.AddArg(v0) 8930 v.AddArg(a) 8931 return true 8932 } 8933 // match: (MULA (MOVWconst [c]) x a) 8934 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 8935 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 8936 for { 8937 _ = v.Args[2] 8938 v_0 := v.Args[0] 8939 if v_0.Op != OpARMMOVWconst { 8940 break 8941 } 8942 c := v_0.AuxInt 8943 x := v.Args[1] 8944 a := v.Args[2] 8945 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 8946 break 8947 } 8948 v.reset(OpARMADD) 8949 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8950 v0.AuxInt = log2(c / 5) 8951 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 8952 v1.AuxInt = 2 8953 v1.AddArg(x) 8954 v1.AddArg(x) 8955 v0.AddArg(v1) 8956 v.AddArg(v0) 8957 v.AddArg(a) 8958 return true 8959 } 8960 // match: (MULA (MOVWconst [c]) x a) 8961 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 8962 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 8963 for { 8964 _ = v.Args[2] 8965 v_0 := v.Args[0] 8966 if v_0.Op != OpARMMOVWconst { 8967 break 8968 } 8969 c := v_0.AuxInt 8970 x := v.Args[1] 8971 a := v.Args[2] 8972 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 8973 break 8974 } 8975 v.reset(OpARMADD) 8976 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 8977 v0.AuxInt = log2(c / 7) 8978 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 8979 v1.AuxInt = 3 8980 v1.AddArg(x) 8981 v1.AddArg(x) 8982 v0.AddArg(v1) 8983 v.AddArg(v0) 8984 v.AddArg(a) 8985 return true 8986 } 8987 // match: (MULA (MOVWconst [c]) x a) 8988 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 8989 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 8990 for { 8991 _ = v.Args[2] 8992 v_0 := v.Args[0] 8993 if v_0.Op != OpARMMOVWconst { 8994 break 8995 } 8996 c := v_0.AuxInt 8997 x := v.Args[1] 8998 a := v.Args[2] 8999 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9000 break 9001 } 9002 v.reset(OpARMADD) 9003 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9004 v0.AuxInt = log2(c / 9) 9005 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9006 v1.AuxInt = 3 9007 v1.AddArg(x) 9008 v1.AddArg(x) 9009 v0.AddArg(v1) 9010 v.AddArg(v0) 9011 v.AddArg(a) 9012 return true 9013 } 9014 return false 9015 } 9016 func rewriteValueARM_OpARMMULA_20(v *Value) bool { 9017 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 9018 // cond: 9019 // result: (ADDconst [int64(int32(c*d))] a) 9020 for { 9021 _ = v.Args[2] 9022 v_0 := v.Args[0] 9023 if v_0.Op != OpARMMOVWconst { 9024 break 9025 } 9026 c := v_0.AuxInt 9027 v_1 := v.Args[1] 9028 if v_1.Op != OpARMMOVWconst { 9029 break 9030 } 9031 d := v_1.AuxInt 9032 a := v.Args[2] 9033 v.reset(OpARMADDconst) 9034 v.AuxInt = int64(int32(c * d)) 9035 v.AddArg(a) 9036 return true 9037 } 9038 return false 9039 } 9040 func rewriteValueARM_OpARMMVN_0(v *Value) bool { 9041 // match: (MVN (MOVWconst [c])) 9042 // cond: 9043 // result: (MOVWconst [^c]) 9044 for { 9045 v_0 := v.Args[0] 9046 if v_0.Op != OpARMMOVWconst { 9047 break 9048 } 9049 c := v_0.AuxInt 9050 v.reset(OpARMMOVWconst) 9051 v.AuxInt = ^c 9052 return true 9053 } 9054 // match: (MVN (SLLconst [c] x)) 9055 // cond: 9056 // result: (MVNshiftLL x [c]) 9057 for { 9058 v_0 := v.Args[0] 9059 if v_0.Op != OpARMSLLconst { 9060 break 9061 } 9062 c := v_0.AuxInt 9063 x := v_0.Args[0] 9064 v.reset(OpARMMVNshiftLL) 9065 v.AuxInt = c 9066 v.AddArg(x) 9067 return true 9068 } 9069 // match: (MVN (SRLconst [c] x)) 9070 // cond: 9071 // result: (MVNshiftRL x [c]) 9072 for { 9073 v_0 := v.Args[0] 9074 if v_0.Op != OpARMSRLconst { 9075 break 9076 } 9077 c := v_0.AuxInt 9078 x := v_0.Args[0] 9079 v.reset(OpARMMVNshiftRL) 9080 v.AuxInt = c 9081 v.AddArg(x) 9082 return true 9083 } 9084 // match: (MVN (SRAconst [c] x)) 9085 // cond: 9086 // result: (MVNshiftRA x [c]) 9087 for { 9088 v_0 := v.Args[0] 9089 if v_0.Op != OpARMSRAconst { 9090 break 9091 } 9092 c := v_0.AuxInt 9093 x := v_0.Args[0] 9094 v.reset(OpARMMVNshiftRA) 9095 v.AuxInt = c 9096 v.AddArg(x) 9097 return true 9098 } 9099 // match: (MVN (SLL x y)) 9100 // cond: 9101 // result: (MVNshiftLLreg x y) 9102 for { 9103 v_0 := v.Args[0] 9104 if v_0.Op != OpARMSLL { 9105 break 9106 } 9107 _ = v_0.Args[1] 9108 x := v_0.Args[0] 9109 y := v_0.Args[1] 9110 v.reset(OpARMMVNshiftLLreg) 9111 v.AddArg(x) 9112 v.AddArg(y) 9113 return true 9114 } 9115 // match: (MVN (SRL x y)) 9116 // cond: 9117 // result: (MVNshiftRLreg x y) 9118 for { 9119 v_0 := v.Args[0] 9120 if v_0.Op != OpARMSRL { 9121 break 9122 } 9123 _ = v_0.Args[1] 9124 x := v_0.Args[0] 9125 y := v_0.Args[1] 9126 v.reset(OpARMMVNshiftRLreg) 9127 v.AddArg(x) 9128 v.AddArg(y) 9129 return true 9130 } 9131 // match: (MVN (SRA x y)) 9132 // cond: 9133 // result: (MVNshiftRAreg x y) 9134 for { 9135 v_0 := v.Args[0] 9136 if v_0.Op != OpARMSRA { 9137 break 9138 } 9139 _ = v_0.Args[1] 9140 x := v_0.Args[0] 9141 y := v_0.Args[1] 9142 v.reset(OpARMMVNshiftRAreg) 9143 v.AddArg(x) 9144 v.AddArg(y) 9145 return true 9146 } 9147 return false 9148 } 9149 func rewriteValueARM_OpARMMVNshiftLL_0(v *Value) bool { 9150 // match: (MVNshiftLL (MOVWconst [c]) [d]) 9151 // cond: 9152 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 9153 for { 9154 d := v.AuxInt 9155 v_0 := v.Args[0] 9156 if v_0.Op != OpARMMOVWconst { 9157 break 9158 } 9159 c := v_0.AuxInt 9160 v.reset(OpARMMOVWconst) 9161 v.AuxInt = ^int64(uint32(c) << uint64(d)) 9162 return true 9163 } 9164 return false 9165 } 9166 func rewriteValueARM_OpARMMVNshiftLLreg_0(v *Value) bool { 9167 // match: (MVNshiftLLreg x (MOVWconst [c])) 9168 // cond: 9169 // result: (MVNshiftLL x [c]) 9170 for { 9171 _ = v.Args[1] 9172 x := v.Args[0] 9173 v_1 := v.Args[1] 9174 if v_1.Op != OpARMMOVWconst { 9175 break 9176 } 9177 c := v_1.AuxInt 9178 v.reset(OpARMMVNshiftLL) 9179 v.AuxInt = c 9180 v.AddArg(x) 9181 return true 9182 } 9183 return false 9184 } 9185 func rewriteValueARM_OpARMMVNshiftRA_0(v *Value) bool { 9186 // match: (MVNshiftRA (MOVWconst [c]) [d]) 9187 // cond: 9188 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 9189 for { 9190 d := v.AuxInt 9191 v_0 := v.Args[0] 9192 if v_0.Op != OpARMMOVWconst { 9193 break 9194 } 9195 c := v_0.AuxInt 9196 v.reset(OpARMMOVWconst) 9197 v.AuxInt = ^int64(int32(c) >> uint64(d)) 9198 return true 9199 } 9200 return false 9201 } 9202 func rewriteValueARM_OpARMMVNshiftRAreg_0(v *Value) bool { 9203 // match: (MVNshiftRAreg x (MOVWconst [c])) 9204 // cond: 9205 // result: (MVNshiftRA x [c]) 9206 for { 9207 _ = v.Args[1] 9208 x := v.Args[0] 9209 v_1 := v.Args[1] 9210 if v_1.Op != OpARMMOVWconst { 9211 break 9212 } 9213 c := v_1.AuxInt 9214 v.reset(OpARMMVNshiftRA) 9215 v.AuxInt = c 9216 v.AddArg(x) 9217 return true 9218 } 9219 return false 9220 } 9221 func rewriteValueARM_OpARMMVNshiftRL_0(v *Value) bool { 9222 // match: (MVNshiftRL (MOVWconst [c]) [d]) 9223 // cond: 9224 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 9225 for { 9226 d := v.AuxInt 9227 v_0 := v.Args[0] 9228 if v_0.Op != OpARMMOVWconst { 9229 break 9230 } 9231 c := v_0.AuxInt 9232 v.reset(OpARMMOVWconst) 9233 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 9234 return true 9235 } 9236 return false 9237 } 9238 func rewriteValueARM_OpARMMVNshiftRLreg_0(v *Value) bool { 9239 // match: (MVNshiftRLreg x (MOVWconst [c])) 9240 // cond: 9241 // result: (MVNshiftRL x [c]) 9242 for { 9243 _ = v.Args[1] 9244 x := v.Args[0] 9245 v_1 := v.Args[1] 9246 if v_1.Op != OpARMMOVWconst { 9247 break 9248 } 9249 c := v_1.AuxInt 9250 v.reset(OpARMMVNshiftRL) 9251 v.AuxInt = c 9252 v.AddArg(x) 9253 return true 9254 } 9255 return false 9256 } 9257 func rewriteValueARM_OpARMNotEqual_0(v *Value) bool { 9258 // match: (NotEqual (FlagEQ)) 9259 // cond: 9260 // result: (MOVWconst [0]) 9261 for { 9262 v_0 := v.Args[0] 9263 if v_0.Op != OpARMFlagEQ { 9264 break 9265 } 9266 v.reset(OpARMMOVWconst) 9267 v.AuxInt = 0 9268 return true 9269 } 9270 // match: (NotEqual (FlagLT_ULT)) 9271 // cond: 9272 // result: (MOVWconst [1]) 9273 for { 9274 v_0 := v.Args[0] 9275 if v_0.Op != OpARMFlagLT_ULT { 9276 break 9277 } 9278 v.reset(OpARMMOVWconst) 9279 v.AuxInt = 1 9280 return true 9281 } 9282 // match: (NotEqual (FlagLT_UGT)) 9283 // cond: 9284 // result: (MOVWconst [1]) 9285 for { 9286 v_0 := v.Args[0] 9287 if v_0.Op != OpARMFlagLT_UGT { 9288 break 9289 } 9290 v.reset(OpARMMOVWconst) 9291 v.AuxInt = 1 9292 return true 9293 } 9294 // match: (NotEqual (FlagGT_ULT)) 9295 // cond: 9296 // result: (MOVWconst [1]) 9297 for { 9298 v_0 := v.Args[0] 9299 if v_0.Op != OpARMFlagGT_ULT { 9300 break 9301 } 9302 v.reset(OpARMMOVWconst) 9303 v.AuxInt = 1 9304 return true 9305 } 9306 // match: (NotEqual (FlagGT_UGT)) 9307 // cond: 9308 // result: (MOVWconst [1]) 9309 for { 9310 v_0 := v.Args[0] 9311 if v_0.Op != OpARMFlagGT_UGT { 9312 break 9313 } 9314 v.reset(OpARMMOVWconst) 9315 v.AuxInt = 1 9316 return true 9317 } 9318 // match: (NotEqual (InvertFlags x)) 9319 // cond: 9320 // result: (NotEqual x) 9321 for { 9322 v_0 := v.Args[0] 9323 if v_0.Op != OpARMInvertFlags { 9324 break 9325 } 9326 x := v_0.Args[0] 9327 v.reset(OpARMNotEqual) 9328 v.AddArg(x) 9329 return true 9330 } 9331 return false 9332 } 9333 func rewriteValueARM_OpARMOR_0(v *Value) bool { 9334 // match: (OR x (MOVWconst [c])) 9335 // cond: 9336 // result: (ORconst [c] x) 9337 for { 9338 _ = v.Args[1] 9339 x := v.Args[0] 9340 v_1 := v.Args[1] 9341 if v_1.Op != OpARMMOVWconst { 9342 break 9343 } 9344 c := v_1.AuxInt 9345 v.reset(OpARMORconst) 9346 v.AuxInt = c 9347 v.AddArg(x) 9348 return true 9349 } 9350 // match: (OR (MOVWconst [c]) x) 9351 // cond: 9352 // result: (ORconst [c] x) 9353 for { 9354 _ = v.Args[1] 9355 v_0 := v.Args[0] 9356 if v_0.Op != OpARMMOVWconst { 9357 break 9358 } 9359 c := v_0.AuxInt 9360 x := v.Args[1] 9361 v.reset(OpARMORconst) 9362 v.AuxInt = c 9363 v.AddArg(x) 9364 return true 9365 } 9366 // match: (OR x (SLLconst [c] y)) 9367 // cond: 9368 // result: (ORshiftLL x y [c]) 9369 for { 9370 _ = v.Args[1] 9371 x := v.Args[0] 9372 v_1 := v.Args[1] 9373 if v_1.Op != OpARMSLLconst { 9374 break 9375 } 9376 c := v_1.AuxInt 9377 y := v_1.Args[0] 9378 v.reset(OpARMORshiftLL) 9379 v.AuxInt = c 9380 v.AddArg(x) 9381 v.AddArg(y) 9382 return true 9383 } 9384 // match: (OR (SLLconst [c] y) x) 9385 // cond: 9386 // result: (ORshiftLL x y [c]) 9387 for { 9388 _ = v.Args[1] 9389 v_0 := v.Args[0] 9390 if v_0.Op != OpARMSLLconst { 9391 break 9392 } 9393 c := v_0.AuxInt 9394 y := v_0.Args[0] 9395 x := v.Args[1] 9396 v.reset(OpARMORshiftLL) 9397 v.AuxInt = c 9398 v.AddArg(x) 9399 v.AddArg(y) 9400 return true 9401 } 9402 // match: (OR x (SRLconst [c] y)) 9403 // cond: 9404 // result: (ORshiftRL x y [c]) 9405 for { 9406 _ = v.Args[1] 9407 x := v.Args[0] 9408 v_1 := v.Args[1] 9409 if v_1.Op != OpARMSRLconst { 9410 break 9411 } 9412 c := v_1.AuxInt 9413 y := v_1.Args[0] 9414 v.reset(OpARMORshiftRL) 9415 v.AuxInt = c 9416 v.AddArg(x) 9417 v.AddArg(y) 9418 return true 9419 } 9420 // match: (OR (SRLconst [c] y) x) 9421 // cond: 9422 // result: (ORshiftRL x y [c]) 9423 for { 9424 _ = v.Args[1] 9425 v_0 := v.Args[0] 9426 if v_0.Op != OpARMSRLconst { 9427 break 9428 } 9429 c := v_0.AuxInt 9430 y := v_0.Args[0] 9431 x := v.Args[1] 9432 v.reset(OpARMORshiftRL) 9433 v.AuxInt = c 9434 v.AddArg(x) 9435 v.AddArg(y) 9436 return true 9437 } 9438 // match: (OR x (SRAconst [c] y)) 9439 // cond: 9440 // result: (ORshiftRA x y [c]) 9441 for { 9442 _ = v.Args[1] 9443 x := v.Args[0] 9444 v_1 := v.Args[1] 9445 if v_1.Op != OpARMSRAconst { 9446 break 9447 } 9448 c := v_1.AuxInt 9449 y := v_1.Args[0] 9450 v.reset(OpARMORshiftRA) 9451 v.AuxInt = c 9452 v.AddArg(x) 9453 v.AddArg(y) 9454 return true 9455 } 9456 // match: (OR (SRAconst [c] y) x) 9457 // cond: 9458 // result: (ORshiftRA x y [c]) 9459 for { 9460 _ = v.Args[1] 9461 v_0 := v.Args[0] 9462 if v_0.Op != OpARMSRAconst { 9463 break 9464 } 9465 c := v_0.AuxInt 9466 y := v_0.Args[0] 9467 x := v.Args[1] 9468 v.reset(OpARMORshiftRA) 9469 v.AuxInt = c 9470 v.AddArg(x) 9471 v.AddArg(y) 9472 return true 9473 } 9474 // match: (OR x (SLL y z)) 9475 // cond: 9476 // result: (ORshiftLLreg x y z) 9477 for { 9478 _ = v.Args[1] 9479 x := v.Args[0] 9480 v_1 := v.Args[1] 9481 if v_1.Op != OpARMSLL { 9482 break 9483 } 9484 _ = v_1.Args[1] 9485 y := v_1.Args[0] 9486 z := v_1.Args[1] 9487 v.reset(OpARMORshiftLLreg) 9488 v.AddArg(x) 9489 v.AddArg(y) 9490 v.AddArg(z) 9491 return true 9492 } 9493 // match: (OR (SLL y z) x) 9494 // cond: 9495 // result: (ORshiftLLreg x y z) 9496 for { 9497 _ = v.Args[1] 9498 v_0 := v.Args[0] 9499 if v_0.Op != OpARMSLL { 9500 break 9501 } 9502 _ = v_0.Args[1] 9503 y := v_0.Args[0] 9504 z := v_0.Args[1] 9505 x := v.Args[1] 9506 v.reset(OpARMORshiftLLreg) 9507 v.AddArg(x) 9508 v.AddArg(y) 9509 v.AddArg(z) 9510 return true 9511 } 9512 return false 9513 } 9514 func rewriteValueARM_OpARMOR_10(v *Value) bool { 9515 // match: (OR x (SRL y z)) 9516 // cond: 9517 // result: (ORshiftRLreg x y z) 9518 for { 9519 _ = v.Args[1] 9520 x := v.Args[0] 9521 v_1 := v.Args[1] 9522 if v_1.Op != OpARMSRL { 9523 break 9524 } 9525 _ = v_1.Args[1] 9526 y := v_1.Args[0] 9527 z := v_1.Args[1] 9528 v.reset(OpARMORshiftRLreg) 9529 v.AddArg(x) 9530 v.AddArg(y) 9531 v.AddArg(z) 9532 return true 9533 } 9534 // match: (OR (SRL y z) x) 9535 // cond: 9536 // result: (ORshiftRLreg x y z) 9537 for { 9538 _ = v.Args[1] 9539 v_0 := v.Args[0] 9540 if v_0.Op != OpARMSRL { 9541 break 9542 } 9543 _ = v_0.Args[1] 9544 y := v_0.Args[0] 9545 z := v_0.Args[1] 9546 x := v.Args[1] 9547 v.reset(OpARMORshiftRLreg) 9548 v.AddArg(x) 9549 v.AddArg(y) 9550 v.AddArg(z) 9551 return true 9552 } 9553 // match: (OR x (SRA y z)) 9554 // cond: 9555 // result: (ORshiftRAreg x y z) 9556 for { 9557 _ = v.Args[1] 9558 x := v.Args[0] 9559 v_1 := v.Args[1] 9560 if v_1.Op != OpARMSRA { 9561 break 9562 } 9563 _ = v_1.Args[1] 9564 y := v_1.Args[0] 9565 z := v_1.Args[1] 9566 v.reset(OpARMORshiftRAreg) 9567 v.AddArg(x) 9568 v.AddArg(y) 9569 v.AddArg(z) 9570 return true 9571 } 9572 // match: (OR (SRA y z) x) 9573 // cond: 9574 // result: (ORshiftRAreg x y z) 9575 for { 9576 _ = v.Args[1] 9577 v_0 := v.Args[0] 9578 if v_0.Op != OpARMSRA { 9579 break 9580 } 9581 _ = v_0.Args[1] 9582 y := v_0.Args[0] 9583 z := v_0.Args[1] 9584 x := v.Args[1] 9585 v.reset(OpARMORshiftRAreg) 9586 v.AddArg(x) 9587 v.AddArg(y) 9588 v.AddArg(z) 9589 return true 9590 } 9591 // match: (OR x x) 9592 // cond: 9593 // result: x 9594 for { 9595 _ = v.Args[1] 9596 x := v.Args[0] 9597 if x != v.Args[1] { 9598 break 9599 } 9600 v.reset(OpCopy) 9601 v.Type = x.Type 9602 v.AddArg(x) 9603 return true 9604 } 9605 return false 9606 } 9607 func rewriteValueARM_OpARMORconst_0(v *Value) bool { 9608 // match: (ORconst [0] x) 9609 // cond: 9610 // result: x 9611 for { 9612 if v.AuxInt != 0 { 9613 break 9614 } 9615 x := v.Args[0] 9616 v.reset(OpCopy) 9617 v.Type = x.Type 9618 v.AddArg(x) 9619 return true 9620 } 9621 // match: (ORconst [c] _) 9622 // cond: int32(c)==-1 9623 // result: (MOVWconst [-1]) 9624 for { 9625 c := v.AuxInt 9626 if !(int32(c) == -1) { 9627 break 9628 } 9629 v.reset(OpARMMOVWconst) 9630 v.AuxInt = -1 9631 return true 9632 } 9633 // match: (ORconst [c] (MOVWconst [d])) 9634 // cond: 9635 // result: (MOVWconst [c|d]) 9636 for { 9637 c := v.AuxInt 9638 v_0 := v.Args[0] 9639 if v_0.Op != OpARMMOVWconst { 9640 break 9641 } 9642 d := v_0.AuxInt 9643 v.reset(OpARMMOVWconst) 9644 v.AuxInt = c | d 9645 return true 9646 } 9647 // match: (ORconst [c] (ORconst [d] x)) 9648 // cond: 9649 // result: (ORconst [c|d] x) 9650 for { 9651 c := v.AuxInt 9652 v_0 := v.Args[0] 9653 if v_0.Op != OpARMORconst { 9654 break 9655 } 9656 d := v_0.AuxInt 9657 x := v_0.Args[0] 9658 v.reset(OpARMORconst) 9659 v.AuxInt = c | d 9660 v.AddArg(x) 9661 return true 9662 } 9663 return false 9664 } 9665 func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { 9666 b := v.Block 9667 _ = b 9668 // match: (ORshiftLL (MOVWconst [c]) x [d]) 9669 // cond: 9670 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 9671 for { 9672 d := v.AuxInt 9673 _ = v.Args[1] 9674 v_0 := v.Args[0] 9675 if v_0.Op != OpARMMOVWconst { 9676 break 9677 } 9678 c := v_0.AuxInt 9679 x := v.Args[1] 9680 v.reset(OpARMORconst) 9681 v.AuxInt = c 9682 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 9683 v0.AuxInt = d 9684 v0.AddArg(x) 9685 v.AddArg(v0) 9686 return true 9687 } 9688 // match: (ORshiftLL x (MOVWconst [c]) [d]) 9689 // cond: 9690 // result: (ORconst x [int64(uint32(c)<<uint64(d))]) 9691 for { 9692 d := v.AuxInt 9693 _ = v.Args[1] 9694 x := v.Args[0] 9695 v_1 := v.Args[1] 9696 if v_1.Op != OpARMMOVWconst { 9697 break 9698 } 9699 c := v_1.AuxInt 9700 v.reset(OpARMORconst) 9701 v.AuxInt = int64(uint32(c) << uint64(d)) 9702 v.AddArg(x) 9703 return true 9704 } 9705 // match: (ORshiftLL [c] (SRLconst x [32-c]) x) 9706 // cond: 9707 // result: (SRRconst [32-c] x) 9708 for { 9709 c := v.AuxInt 9710 _ = v.Args[1] 9711 v_0 := v.Args[0] 9712 if v_0.Op != OpARMSRLconst { 9713 break 9714 } 9715 if v_0.AuxInt != 32-c { 9716 break 9717 } 9718 x := v_0.Args[0] 9719 if x != v.Args[1] { 9720 break 9721 } 9722 v.reset(OpARMSRRconst) 9723 v.AuxInt = 32 - c 9724 v.AddArg(x) 9725 return true 9726 } 9727 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 9728 // cond: c==d 9729 // result: y 9730 for { 9731 d := v.AuxInt 9732 _ = v.Args[1] 9733 x := v.Args[0] 9734 y := v.Args[1] 9735 if y.Op != OpARMSLLconst { 9736 break 9737 } 9738 c := y.AuxInt 9739 if x != y.Args[0] { 9740 break 9741 } 9742 if !(c == d) { 9743 break 9744 } 9745 v.reset(OpCopy) 9746 v.Type = y.Type 9747 v.AddArg(y) 9748 return true 9749 } 9750 return false 9751 } 9752 func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { 9753 b := v.Block 9754 _ = b 9755 // match: (ORshiftLLreg (MOVWconst [c]) x y) 9756 // cond: 9757 // result: (ORconst [c] (SLL <x.Type> x y)) 9758 for { 9759 _ = v.Args[2] 9760 v_0 := v.Args[0] 9761 if v_0.Op != OpARMMOVWconst { 9762 break 9763 } 9764 c := v_0.AuxInt 9765 x := v.Args[1] 9766 y := v.Args[2] 9767 v.reset(OpARMORconst) 9768 v.AuxInt = c 9769 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 9770 v0.AddArg(x) 9771 v0.AddArg(y) 9772 v.AddArg(v0) 9773 return true 9774 } 9775 // match: (ORshiftLLreg x y (MOVWconst [c])) 9776 // cond: 9777 // result: (ORshiftLL x y [c]) 9778 for { 9779 _ = v.Args[2] 9780 x := v.Args[0] 9781 y := v.Args[1] 9782 v_2 := v.Args[2] 9783 if v_2.Op != OpARMMOVWconst { 9784 break 9785 } 9786 c := v_2.AuxInt 9787 v.reset(OpARMORshiftLL) 9788 v.AuxInt = c 9789 v.AddArg(x) 9790 v.AddArg(y) 9791 return true 9792 } 9793 return false 9794 } 9795 func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { 9796 b := v.Block 9797 _ = b 9798 // match: (ORshiftRA (MOVWconst [c]) x [d]) 9799 // cond: 9800 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 9801 for { 9802 d := v.AuxInt 9803 _ = v.Args[1] 9804 v_0 := v.Args[0] 9805 if v_0.Op != OpARMMOVWconst { 9806 break 9807 } 9808 c := v_0.AuxInt 9809 x := v.Args[1] 9810 v.reset(OpARMORconst) 9811 v.AuxInt = c 9812 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 9813 v0.AuxInt = d 9814 v0.AddArg(x) 9815 v.AddArg(v0) 9816 return true 9817 } 9818 // match: (ORshiftRA x (MOVWconst [c]) [d]) 9819 // cond: 9820 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 9821 for { 9822 d := v.AuxInt 9823 _ = v.Args[1] 9824 x := v.Args[0] 9825 v_1 := v.Args[1] 9826 if v_1.Op != OpARMMOVWconst { 9827 break 9828 } 9829 c := v_1.AuxInt 9830 v.reset(OpARMORconst) 9831 v.AuxInt = int64(int32(c) >> uint64(d)) 9832 v.AddArg(x) 9833 return true 9834 } 9835 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 9836 // cond: c==d 9837 // result: y 9838 for { 9839 d := v.AuxInt 9840 _ = v.Args[1] 9841 x := v.Args[0] 9842 y := v.Args[1] 9843 if y.Op != OpARMSRAconst { 9844 break 9845 } 9846 c := y.AuxInt 9847 if x != y.Args[0] { 9848 break 9849 } 9850 if !(c == d) { 9851 break 9852 } 9853 v.reset(OpCopy) 9854 v.Type = y.Type 9855 v.AddArg(y) 9856 return true 9857 } 9858 return false 9859 } 9860 func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { 9861 b := v.Block 9862 _ = b 9863 // match: (ORshiftRAreg (MOVWconst [c]) x y) 9864 // cond: 9865 // result: (ORconst [c] (SRA <x.Type> x y)) 9866 for { 9867 _ = v.Args[2] 9868 v_0 := v.Args[0] 9869 if v_0.Op != OpARMMOVWconst { 9870 break 9871 } 9872 c := v_0.AuxInt 9873 x := v.Args[1] 9874 y := v.Args[2] 9875 v.reset(OpARMORconst) 9876 v.AuxInt = c 9877 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 9878 v0.AddArg(x) 9879 v0.AddArg(y) 9880 v.AddArg(v0) 9881 return true 9882 } 9883 // match: (ORshiftRAreg x y (MOVWconst [c])) 9884 // cond: 9885 // result: (ORshiftRA x y [c]) 9886 for { 9887 _ = v.Args[2] 9888 x := v.Args[0] 9889 y := v.Args[1] 9890 v_2 := v.Args[2] 9891 if v_2.Op != OpARMMOVWconst { 9892 break 9893 } 9894 c := v_2.AuxInt 9895 v.reset(OpARMORshiftRA) 9896 v.AuxInt = c 9897 v.AddArg(x) 9898 v.AddArg(y) 9899 return true 9900 } 9901 return false 9902 } 9903 func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { 9904 b := v.Block 9905 _ = b 9906 // match: (ORshiftRL (MOVWconst [c]) x [d]) 9907 // cond: 9908 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 9909 for { 9910 d := v.AuxInt 9911 _ = v.Args[1] 9912 v_0 := v.Args[0] 9913 if v_0.Op != OpARMMOVWconst { 9914 break 9915 } 9916 c := v_0.AuxInt 9917 x := v.Args[1] 9918 v.reset(OpARMORconst) 9919 v.AuxInt = c 9920 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 9921 v0.AuxInt = d 9922 v0.AddArg(x) 9923 v.AddArg(v0) 9924 return true 9925 } 9926 // match: (ORshiftRL x (MOVWconst [c]) [d]) 9927 // cond: 9928 // result: (ORconst x [int64(uint32(c)>>uint64(d))]) 9929 for { 9930 d := v.AuxInt 9931 _ = v.Args[1] 9932 x := v.Args[0] 9933 v_1 := v.Args[1] 9934 if v_1.Op != OpARMMOVWconst { 9935 break 9936 } 9937 c := v_1.AuxInt 9938 v.reset(OpARMORconst) 9939 v.AuxInt = int64(uint32(c) >> uint64(d)) 9940 v.AddArg(x) 9941 return true 9942 } 9943 // match: (ORshiftRL [c] (SLLconst x [32-c]) x) 9944 // cond: 9945 // result: (SRRconst [ c] x) 9946 for { 9947 c := v.AuxInt 9948 _ = v.Args[1] 9949 v_0 := v.Args[0] 9950 if v_0.Op != OpARMSLLconst { 9951 break 9952 } 9953 if v_0.AuxInt != 32-c { 9954 break 9955 } 9956 x := v_0.Args[0] 9957 if x != v.Args[1] { 9958 break 9959 } 9960 v.reset(OpARMSRRconst) 9961 v.AuxInt = c 9962 v.AddArg(x) 9963 return true 9964 } 9965 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 9966 // cond: c==d 9967 // result: y 9968 for { 9969 d := v.AuxInt 9970 _ = v.Args[1] 9971 x := v.Args[0] 9972 y := v.Args[1] 9973 if y.Op != OpARMSRLconst { 9974 break 9975 } 9976 c := y.AuxInt 9977 if x != y.Args[0] { 9978 break 9979 } 9980 if !(c == d) { 9981 break 9982 } 9983 v.reset(OpCopy) 9984 v.Type = y.Type 9985 v.AddArg(y) 9986 return true 9987 } 9988 return false 9989 } 9990 func rewriteValueARM_OpARMORshiftRLreg_0(v *Value) bool { 9991 b := v.Block 9992 _ = b 9993 // match: (ORshiftRLreg (MOVWconst [c]) x y) 9994 // cond: 9995 // result: (ORconst [c] (SRL <x.Type> x y)) 9996 for { 9997 _ = v.Args[2] 9998 v_0 := v.Args[0] 9999 if v_0.Op != OpARMMOVWconst { 10000 break 10001 } 10002 c := v_0.AuxInt 10003 x := v.Args[1] 10004 y := v.Args[2] 10005 v.reset(OpARMORconst) 10006 v.AuxInt = c 10007 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10008 v0.AddArg(x) 10009 v0.AddArg(y) 10010 v.AddArg(v0) 10011 return true 10012 } 10013 // match: (ORshiftRLreg x y (MOVWconst [c])) 10014 // cond: 10015 // result: (ORshiftRL x y [c]) 10016 for { 10017 _ = v.Args[2] 10018 x := v.Args[0] 10019 y := v.Args[1] 10020 v_2 := v.Args[2] 10021 if v_2.Op != OpARMMOVWconst { 10022 break 10023 } 10024 c := v_2.AuxInt 10025 v.reset(OpARMORshiftRL) 10026 v.AuxInt = c 10027 v.AddArg(x) 10028 v.AddArg(y) 10029 return true 10030 } 10031 return false 10032 } 10033 func rewriteValueARM_OpARMRSB_0(v *Value) bool { 10034 // match: (RSB (MOVWconst [c]) x) 10035 // cond: 10036 // result: (SUBconst [c] x) 10037 for { 10038 _ = v.Args[1] 10039 v_0 := v.Args[0] 10040 if v_0.Op != OpARMMOVWconst { 10041 break 10042 } 10043 c := v_0.AuxInt 10044 x := v.Args[1] 10045 v.reset(OpARMSUBconst) 10046 v.AuxInt = c 10047 v.AddArg(x) 10048 return true 10049 } 10050 // match: (RSB x (MOVWconst [c])) 10051 // cond: 10052 // result: (RSBconst [c] x) 10053 for { 10054 _ = v.Args[1] 10055 x := v.Args[0] 10056 v_1 := v.Args[1] 10057 if v_1.Op != OpARMMOVWconst { 10058 break 10059 } 10060 c := v_1.AuxInt 10061 v.reset(OpARMRSBconst) 10062 v.AuxInt = c 10063 v.AddArg(x) 10064 return true 10065 } 10066 // match: (RSB x (SLLconst [c] y)) 10067 // cond: 10068 // result: (RSBshiftLL x y [c]) 10069 for { 10070 _ = v.Args[1] 10071 x := v.Args[0] 10072 v_1 := v.Args[1] 10073 if v_1.Op != OpARMSLLconst { 10074 break 10075 } 10076 c := v_1.AuxInt 10077 y := v_1.Args[0] 10078 v.reset(OpARMRSBshiftLL) 10079 v.AuxInt = c 10080 v.AddArg(x) 10081 v.AddArg(y) 10082 return true 10083 } 10084 // match: (RSB (SLLconst [c] y) x) 10085 // cond: 10086 // result: (SUBshiftLL x y [c]) 10087 for { 10088 _ = v.Args[1] 10089 v_0 := v.Args[0] 10090 if v_0.Op != OpARMSLLconst { 10091 break 10092 } 10093 c := v_0.AuxInt 10094 y := v_0.Args[0] 10095 x := v.Args[1] 10096 v.reset(OpARMSUBshiftLL) 10097 v.AuxInt = c 10098 v.AddArg(x) 10099 v.AddArg(y) 10100 return true 10101 } 10102 // match: (RSB x (SRLconst [c] y)) 10103 // cond: 10104 // result: (RSBshiftRL x y [c]) 10105 for { 10106 _ = v.Args[1] 10107 x := v.Args[0] 10108 v_1 := v.Args[1] 10109 if v_1.Op != OpARMSRLconst { 10110 break 10111 } 10112 c := v_1.AuxInt 10113 y := v_1.Args[0] 10114 v.reset(OpARMRSBshiftRL) 10115 v.AuxInt = c 10116 v.AddArg(x) 10117 v.AddArg(y) 10118 return true 10119 } 10120 // match: (RSB (SRLconst [c] y) x) 10121 // cond: 10122 // result: (SUBshiftRL x y [c]) 10123 for { 10124 _ = v.Args[1] 10125 v_0 := v.Args[0] 10126 if v_0.Op != OpARMSRLconst { 10127 break 10128 } 10129 c := v_0.AuxInt 10130 y := v_0.Args[0] 10131 x := v.Args[1] 10132 v.reset(OpARMSUBshiftRL) 10133 v.AuxInt = c 10134 v.AddArg(x) 10135 v.AddArg(y) 10136 return true 10137 } 10138 // match: (RSB x (SRAconst [c] y)) 10139 // cond: 10140 // result: (RSBshiftRA x y [c]) 10141 for { 10142 _ = v.Args[1] 10143 x := v.Args[0] 10144 v_1 := v.Args[1] 10145 if v_1.Op != OpARMSRAconst { 10146 break 10147 } 10148 c := v_1.AuxInt 10149 y := v_1.Args[0] 10150 v.reset(OpARMRSBshiftRA) 10151 v.AuxInt = c 10152 v.AddArg(x) 10153 v.AddArg(y) 10154 return true 10155 } 10156 // match: (RSB (SRAconst [c] y) x) 10157 // cond: 10158 // result: (SUBshiftRA x y [c]) 10159 for { 10160 _ = v.Args[1] 10161 v_0 := v.Args[0] 10162 if v_0.Op != OpARMSRAconst { 10163 break 10164 } 10165 c := v_0.AuxInt 10166 y := v_0.Args[0] 10167 x := v.Args[1] 10168 v.reset(OpARMSUBshiftRA) 10169 v.AuxInt = c 10170 v.AddArg(x) 10171 v.AddArg(y) 10172 return true 10173 } 10174 // match: (RSB x (SLL y z)) 10175 // cond: 10176 // result: (RSBshiftLLreg x y z) 10177 for { 10178 _ = v.Args[1] 10179 x := v.Args[0] 10180 v_1 := v.Args[1] 10181 if v_1.Op != OpARMSLL { 10182 break 10183 } 10184 _ = v_1.Args[1] 10185 y := v_1.Args[0] 10186 z := v_1.Args[1] 10187 v.reset(OpARMRSBshiftLLreg) 10188 v.AddArg(x) 10189 v.AddArg(y) 10190 v.AddArg(z) 10191 return true 10192 } 10193 // match: (RSB (SLL y z) x) 10194 // cond: 10195 // result: (SUBshiftLLreg x y z) 10196 for { 10197 _ = v.Args[1] 10198 v_0 := v.Args[0] 10199 if v_0.Op != OpARMSLL { 10200 break 10201 } 10202 _ = v_0.Args[1] 10203 y := v_0.Args[0] 10204 z := v_0.Args[1] 10205 x := v.Args[1] 10206 v.reset(OpARMSUBshiftLLreg) 10207 v.AddArg(x) 10208 v.AddArg(y) 10209 v.AddArg(z) 10210 return true 10211 } 10212 return false 10213 } 10214 func rewriteValueARM_OpARMRSB_10(v *Value) bool { 10215 // match: (RSB x (SRL y z)) 10216 // cond: 10217 // result: (RSBshiftRLreg x y z) 10218 for { 10219 _ = v.Args[1] 10220 x := v.Args[0] 10221 v_1 := v.Args[1] 10222 if v_1.Op != OpARMSRL { 10223 break 10224 } 10225 _ = v_1.Args[1] 10226 y := v_1.Args[0] 10227 z := v_1.Args[1] 10228 v.reset(OpARMRSBshiftRLreg) 10229 v.AddArg(x) 10230 v.AddArg(y) 10231 v.AddArg(z) 10232 return true 10233 } 10234 // match: (RSB (SRL y z) x) 10235 // cond: 10236 // result: (SUBshiftRLreg x y z) 10237 for { 10238 _ = v.Args[1] 10239 v_0 := v.Args[0] 10240 if v_0.Op != OpARMSRL { 10241 break 10242 } 10243 _ = v_0.Args[1] 10244 y := v_0.Args[0] 10245 z := v_0.Args[1] 10246 x := v.Args[1] 10247 v.reset(OpARMSUBshiftRLreg) 10248 v.AddArg(x) 10249 v.AddArg(y) 10250 v.AddArg(z) 10251 return true 10252 } 10253 // match: (RSB x (SRA y z)) 10254 // cond: 10255 // result: (RSBshiftRAreg x y z) 10256 for { 10257 _ = v.Args[1] 10258 x := v.Args[0] 10259 v_1 := v.Args[1] 10260 if v_1.Op != OpARMSRA { 10261 break 10262 } 10263 _ = v_1.Args[1] 10264 y := v_1.Args[0] 10265 z := v_1.Args[1] 10266 v.reset(OpARMRSBshiftRAreg) 10267 v.AddArg(x) 10268 v.AddArg(y) 10269 v.AddArg(z) 10270 return true 10271 } 10272 // match: (RSB (SRA y z) x) 10273 // cond: 10274 // result: (SUBshiftRAreg x y z) 10275 for { 10276 _ = v.Args[1] 10277 v_0 := v.Args[0] 10278 if v_0.Op != OpARMSRA { 10279 break 10280 } 10281 _ = v_0.Args[1] 10282 y := v_0.Args[0] 10283 z := v_0.Args[1] 10284 x := v.Args[1] 10285 v.reset(OpARMSUBshiftRAreg) 10286 v.AddArg(x) 10287 v.AddArg(y) 10288 v.AddArg(z) 10289 return true 10290 } 10291 // match: (RSB x x) 10292 // cond: 10293 // result: (MOVWconst [0]) 10294 for { 10295 _ = v.Args[1] 10296 x := v.Args[0] 10297 if x != v.Args[1] { 10298 break 10299 } 10300 v.reset(OpARMMOVWconst) 10301 v.AuxInt = 0 10302 return true 10303 } 10304 return false 10305 } 10306 func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { 10307 b := v.Block 10308 _ = b 10309 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 10310 // cond: 10311 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 10312 for { 10313 d := v.AuxInt 10314 _ = v.Args[1] 10315 v_0 := v.Args[0] 10316 if v_0.Op != OpARMMOVWconst { 10317 break 10318 } 10319 c := v_0.AuxInt 10320 x := v.Args[1] 10321 v.reset(OpARMSUBSconst) 10322 v.AuxInt = c 10323 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10324 v0.AuxInt = d 10325 v0.AddArg(x) 10326 v.AddArg(v0) 10327 return true 10328 } 10329 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 10330 // cond: 10331 // result: (RSBSconst x [int64(uint32(c)<<uint64(d))]) 10332 for { 10333 d := v.AuxInt 10334 _ = v.Args[1] 10335 x := v.Args[0] 10336 v_1 := v.Args[1] 10337 if v_1.Op != OpARMMOVWconst { 10338 break 10339 } 10340 c := v_1.AuxInt 10341 v.reset(OpARMRSBSconst) 10342 v.AuxInt = int64(uint32(c) << uint64(d)) 10343 v.AddArg(x) 10344 return true 10345 } 10346 return false 10347 } 10348 func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { 10349 b := v.Block 10350 _ = b 10351 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 10352 // cond: 10353 // result: (SUBSconst [c] (SLL <x.Type> x y)) 10354 for { 10355 _ = v.Args[2] 10356 v_0 := v.Args[0] 10357 if v_0.Op != OpARMMOVWconst { 10358 break 10359 } 10360 c := v_0.AuxInt 10361 x := v.Args[1] 10362 y := v.Args[2] 10363 v.reset(OpARMSUBSconst) 10364 v.AuxInt = c 10365 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10366 v0.AddArg(x) 10367 v0.AddArg(y) 10368 v.AddArg(v0) 10369 return true 10370 } 10371 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 10372 // cond: 10373 // result: (RSBSshiftLL x y [c]) 10374 for { 10375 _ = v.Args[2] 10376 x := v.Args[0] 10377 y := v.Args[1] 10378 v_2 := v.Args[2] 10379 if v_2.Op != OpARMMOVWconst { 10380 break 10381 } 10382 c := v_2.AuxInt 10383 v.reset(OpARMRSBSshiftLL) 10384 v.AuxInt = c 10385 v.AddArg(x) 10386 v.AddArg(y) 10387 return true 10388 } 10389 return false 10390 } 10391 func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { 10392 b := v.Block 10393 _ = b 10394 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 10395 // cond: 10396 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 10397 for { 10398 d := v.AuxInt 10399 _ = v.Args[1] 10400 v_0 := v.Args[0] 10401 if v_0.Op != OpARMMOVWconst { 10402 break 10403 } 10404 c := v_0.AuxInt 10405 x := v.Args[1] 10406 v.reset(OpARMSUBSconst) 10407 v.AuxInt = c 10408 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10409 v0.AuxInt = d 10410 v0.AddArg(x) 10411 v.AddArg(v0) 10412 return true 10413 } 10414 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 10415 // cond: 10416 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 10417 for { 10418 d := v.AuxInt 10419 _ = v.Args[1] 10420 x := v.Args[0] 10421 v_1 := v.Args[1] 10422 if v_1.Op != OpARMMOVWconst { 10423 break 10424 } 10425 c := v_1.AuxInt 10426 v.reset(OpARMRSBSconst) 10427 v.AuxInt = int64(int32(c) >> uint64(d)) 10428 v.AddArg(x) 10429 return true 10430 } 10431 return false 10432 } 10433 func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { 10434 b := v.Block 10435 _ = b 10436 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 10437 // cond: 10438 // result: (SUBSconst [c] (SRA <x.Type> x y)) 10439 for { 10440 _ = v.Args[2] 10441 v_0 := v.Args[0] 10442 if v_0.Op != OpARMMOVWconst { 10443 break 10444 } 10445 c := v_0.AuxInt 10446 x := v.Args[1] 10447 y := v.Args[2] 10448 v.reset(OpARMSUBSconst) 10449 v.AuxInt = c 10450 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10451 v0.AddArg(x) 10452 v0.AddArg(y) 10453 v.AddArg(v0) 10454 return true 10455 } 10456 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 10457 // cond: 10458 // result: (RSBSshiftRA x y [c]) 10459 for { 10460 _ = v.Args[2] 10461 x := v.Args[0] 10462 y := v.Args[1] 10463 v_2 := v.Args[2] 10464 if v_2.Op != OpARMMOVWconst { 10465 break 10466 } 10467 c := v_2.AuxInt 10468 v.reset(OpARMRSBSshiftRA) 10469 v.AuxInt = c 10470 v.AddArg(x) 10471 v.AddArg(y) 10472 return true 10473 } 10474 return false 10475 } 10476 func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { 10477 b := v.Block 10478 _ = b 10479 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 10480 // cond: 10481 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 10482 for { 10483 d := v.AuxInt 10484 _ = v.Args[1] 10485 v_0 := v.Args[0] 10486 if v_0.Op != OpARMMOVWconst { 10487 break 10488 } 10489 c := v_0.AuxInt 10490 x := v.Args[1] 10491 v.reset(OpARMSUBSconst) 10492 v.AuxInt = c 10493 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10494 v0.AuxInt = d 10495 v0.AddArg(x) 10496 v.AddArg(v0) 10497 return true 10498 } 10499 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 10500 // cond: 10501 // result: (RSBSconst x [int64(uint32(c)>>uint64(d))]) 10502 for { 10503 d := v.AuxInt 10504 _ = v.Args[1] 10505 x := v.Args[0] 10506 v_1 := v.Args[1] 10507 if v_1.Op != OpARMMOVWconst { 10508 break 10509 } 10510 c := v_1.AuxInt 10511 v.reset(OpARMRSBSconst) 10512 v.AuxInt = int64(uint32(c) >> uint64(d)) 10513 v.AddArg(x) 10514 return true 10515 } 10516 return false 10517 } 10518 func rewriteValueARM_OpARMRSBSshiftRLreg_0(v *Value) bool { 10519 b := v.Block 10520 _ = b 10521 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 10522 // cond: 10523 // result: (SUBSconst [c] (SRL <x.Type> x y)) 10524 for { 10525 _ = v.Args[2] 10526 v_0 := v.Args[0] 10527 if v_0.Op != OpARMMOVWconst { 10528 break 10529 } 10530 c := v_0.AuxInt 10531 x := v.Args[1] 10532 y := v.Args[2] 10533 v.reset(OpARMSUBSconst) 10534 v.AuxInt = c 10535 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10536 v0.AddArg(x) 10537 v0.AddArg(y) 10538 v.AddArg(v0) 10539 return true 10540 } 10541 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 10542 // cond: 10543 // result: (RSBSshiftRL x y [c]) 10544 for { 10545 _ = v.Args[2] 10546 x := v.Args[0] 10547 y := v.Args[1] 10548 v_2 := v.Args[2] 10549 if v_2.Op != OpARMMOVWconst { 10550 break 10551 } 10552 c := v_2.AuxInt 10553 v.reset(OpARMRSBSshiftRL) 10554 v.AuxInt = c 10555 v.AddArg(x) 10556 v.AddArg(y) 10557 return true 10558 } 10559 return false 10560 } 10561 func rewriteValueARM_OpARMRSBconst_0(v *Value) bool { 10562 // match: (RSBconst [c] (MOVWconst [d])) 10563 // cond: 10564 // result: (MOVWconst [int64(int32(c-d))]) 10565 for { 10566 c := v.AuxInt 10567 v_0 := v.Args[0] 10568 if v_0.Op != OpARMMOVWconst { 10569 break 10570 } 10571 d := v_0.AuxInt 10572 v.reset(OpARMMOVWconst) 10573 v.AuxInt = int64(int32(c - d)) 10574 return true 10575 } 10576 // match: (RSBconst [c] (RSBconst [d] x)) 10577 // cond: 10578 // result: (ADDconst [int64(int32(c-d))] x) 10579 for { 10580 c := v.AuxInt 10581 v_0 := v.Args[0] 10582 if v_0.Op != OpARMRSBconst { 10583 break 10584 } 10585 d := v_0.AuxInt 10586 x := v_0.Args[0] 10587 v.reset(OpARMADDconst) 10588 v.AuxInt = int64(int32(c - d)) 10589 v.AddArg(x) 10590 return true 10591 } 10592 // match: (RSBconst [c] (ADDconst [d] x)) 10593 // cond: 10594 // result: (RSBconst [int64(int32(c-d))] x) 10595 for { 10596 c := v.AuxInt 10597 v_0 := v.Args[0] 10598 if v_0.Op != OpARMADDconst { 10599 break 10600 } 10601 d := v_0.AuxInt 10602 x := v_0.Args[0] 10603 v.reset(OpARMRSBconst) 10604 v.AuxInt = int64(int32(c - d)) 10605 v.AddArg(x) 10606 return true 10607 } 10608 // match: (RSBconst [c] (SUBconst [d] x)) 10609 // cond: 10610 // result: (RSBconst [int64(int32(c+d))] x) 10611 for { 10612 c := v.AuxInt 10613 v_0 := v.Args[0] 10614 if v_0.Op != OpARMSUBconst { 10615 break 10616 } 10617 d := v_0.AuxInt 10618 x := v_0.Args[0] 10619 v.reset(OpARMRSBconst) 10620 v.AuxInt = int64(int32(c + d)) 10621 v.AddArg(x) 10622 return true 10623 } 10624 return false 10625 } 10626 func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { 10627 b := v.Block 10628 _ = b 10629 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 10630 // cond: 10631 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 10632 for { 10633 d := v.AuxInt 10634 _ = v.Args[1] 10635 v_0 := v.Args[0] 10636 if v_0.Op != OpARMMOVWconst { 10637 break 10638 } 10639 c := v_0.AuxInt 10640 x := v.Args[1] 10641 v.reset(OpARMSUBconst) 10642 v.AuxInt = c 10643 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10644 v0.AuxInt = d 10645 v0.AddArg(x) 10646 v.AddArg(v0) 10647 return true 10648 } 10649 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 10650 // cond: 10651 // result: (RSBconst x [int64(uint32(c)<<uint64(d))]) 10652 for { 10653 d := v.AuxInt 10654 _ = v.Args[1] 10655 x := v.Args[0] 10656 v_1 := v.Args[1] 10657 if v_1.Op != OpARMMOVWconst { 10658 break 10659 } 10660 c := v_1.AuxInt 10661 v.reset(OpARMRSBconst) 10662 v.AuxInt = int64(uint32(c) << uint64(d)) 10663 v.AddArg(x) 10664 return true 10665 } 10666 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 10667 // cond: c==d 10668 // result: (MOVWconst [0]) 10669 for { 10670 d := v.AuxInt 10671 _ = v.Args[1] 10672 x := v.Args[0] 10673 v_1 := v.Args[1] 10674 if v_1.Op != OpARMSLLconst { 10675 break 10676 } 10677 c := v_1.AuxInt 10678 if x != v_1.Args[0] { 10679 break 10680 } 10681 if !(c == d) { 10682 break 10683 } 10684 v.reset(OpARMMOVWconst) 10685 v.AuxInt = 0 10686 return true 10687 } 10688 return false 10689 } 10690 func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { 10691 b := v.Block 10692 _ = b 10693 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 10694 // cond: 10695 // result: (SUBconst [c] (SLL <x.Type> x y)) 10696 for { 10697 _ = v.Args[2] 10698 v_0 := v.Args[0] 10699 if v_0.Op != OpARMMOVWconst { 10700 break 10701 } 10702 c := v_0.AuxInt 10703 x := v.Args[1] 10704 y := v.Args[2] 10705 v.reset(OpARMSUBconst) 10706 v.AuxInt = c 10707 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 10708 v0.AddArg(x) 10709 v0.AddArg(y) 10710 v.AddArg(v0) 10711 return true 10712 } 10713 // match: (RSBshiftLLreg x y (MOVWconst [c])) 10714 // cond: 10715 // result: (RSBshiftLL x y [c]) 10716 for { 10717 _ = v.Args[2] 10718 x := v.Args[0] 10719 y := v.Args[1] 10720 v_2 := v.Args[2] 10721 if v_2.Op != OpARMMOVWconst { 10722 break 10723 } 10724 c := v_2.AuxInt 10725 v.reset(OpARMRSBshiftLL) 10726 v.AuxInt = c 10727 v.AddArg(x) 10728 v.AddArg(y) 10729 return true 10730 } 10731 return false 10732 } 10733 func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { 10734 b := v.Block 10735 _ = b 10736 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 10737 // cond: 10738 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 10739 for { 10740 d := v.AuxInt 10741 _ = v.Args[1] 10742 v_0 := v.Args[0] 10743 if v_0.Op != OpARMMOVWconst { 10744 break 10745 } 10746 c := v_0.AuxInt 10747 x := v.Args[1] 10748 v.reset(OpARMSUBconst) 10749 v.AuxInt = c 10750 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 10751 v0.AuxInt = d 10752 v0.AddArg(x) 10753 v.AddArg(v0) 10754 return true 10755 } 10756 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 10757 // cond: 10758 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 10759 for { 10760 d := v.AuxInt 10761 _ = v.Args[1] 10762 x := v.Args[0] 10763 v_1 := v.Args[1] 10764 if v_1.Op != OpARMMOVWconst { 10765 break 10766 } 10767 c := v_1.AuxInt 10768 v.reset(OpARMRSBconst) 10769 v.AuxInt = int64(int32(c) >> uint64(d)) 10770 v.AddArg(x) 10771 return true 10772 } 10773 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 10774 // cond: c==d 10775 // result: (MOVWconst [0]) 10776 for { 10777 d := v.AuxInt 10778 _ = v.Args[1] 10779 x := v.Args[0] 10780 v_1 := v.Args[1] 10781 if v_1.Op != OpARMSRAconst { 10782 break 10783 } 10784 c := v_1.AuxInt 10785 if x != v_1.Args[0] { 10786 break 10787 } 10788 if !(c == d) { 10789 break 10790 } 10791 v.reset(OpARMMOVWconst) 10792 v.AuxInt = 0 10793 return true 10794 } 10795 return false 10796 } 10797 func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { 10798 b := v.Block 10799 _ = b 10800 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 10801 // cond: 10802 // result: (SUBconst [c] (SRA <x.Type> x y)) 10803 for { 10804 _ = v.Args[2] 10805 v_0 := v.Args[0] 10806 if v_0.Op != OpARMMOVWconst { 10807 break 10808 } 10809 c := v_0.AuxInt 10810 x := v.Args[1] 10811 y := v.Args[2] 10812 v.reset(OpARMSUBconst) 10813 v.AuxInt = c 10814 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 10815 v0.AddArg(x) 10816 v0.AddArg(y) 10817 v.AddArg(v0) 10818 return true 10819 } 10820 // match: (RSBshiftRAreg x y (MOVWconst [c])) 10821 // cond: 10822 // result: (RSBshiftRA x y [c]) 10823 for { 10824 _ = v.Args[2] 10825 x := v.Args[0] 10826 y := v.Args[1] 10827 v_2 := v.Args[2] 10828 if v_2.Op != OpARMMOVWconst { 10829 break 10830 } 10831 c := v_2.AuxInt 10832 v.reset(OpARMRSBshiftRA) 10833 v.AuxInt = c 10834 v.AddArg(x) 10835 v.AddArg(y) 10836 return true 10837 } 10838 return false 10839 } 10840 func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { 10841 b := v.Block 10842 _ = b 10843 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 10844 // cond: 10845 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 10846 for { 10847 d := v.AuxInt 10848 _ = v.Args[1] 10849 v_0 := v.Args[0] 10850 if v_0.Op != OpARMMOVWconst { 10851 break 10852 } 10853 c := v_0.AuxInt 10854 x := v.Args[1] 10855 v.reset(OpARMSUBconst) 10856 v.AuxInt = c 10857 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 10858 v0.AuxInt = d 10859 v0.AddArg(x) 10860 v.AddArg(v0) 10861 return true 10862 } 10863 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 10864 // cond: 10865 // result: (RSBconst x [int64(uint32(c)>>uint64(d))]) 10866 for { 10867 d := v.AuxInt 10868 _ = v.Args[1] 10869 x := v.Args[0] 10870 v_1 := v.Args[1] 10871 if v_1.Op != OpARMMOVWconst { 10872 break 10873 } 10874 c := v_1.AuxInt 10875 v.reset(OpARMRSBconst) 10876 v.AuxInt = int64(uint32(c) >> uint64(d)) 10877 v.AddArg(x) 10878 return true 10879 } 10880 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 10881 // cond: c==d 10882 // result: (MOVWconst [0]) 10883 for { 10884 d := v.AuxInt 10885 _ = v.Args[1] 10886 x := v.Args[0] 10887 v_1 := v.Args[1] 10888 if v_1.Op != OpARMSRLconst { 10889 break 10890 } 10891 c := v_1.AuxInt 10892 if x != v_1.Args[0] { 10893 break 10894 } 10895 if !(c == d) { 10896 break 10897 } 10898 v.reset(OpARMMOVWconst) 10899 v.AuxInt = 0 10900 return true 10901 } 10902 return false 10903 } 10904 func rewriteValueARM_OpARMRSBshiftRLreg_0(v *Value) bool { 10905 b := v.Block 10906 _ = b 10907 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 10908 // cond: 10909 // result: (SUBconst [c] (SRL <x.Type> x y)) 10910 for { 10911 _ = v.Args[2] 10912 v_0 := v.Args[0] 10913 if v_0.Op != OpARMMOVWconst { 10914 break 10915 } 10916 c := v_0.AuxInt 10917 x := v.Args[1] 10918 y := v.Args[2] 10919 v.reset(OpARMSUBconst) 10920 v.AuxInt = c 10921 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 10922 v0.AddArg(x) 10923 v0.AddArg(y) 10924 v.AddArg(v0) 10925 return true 10926 } 10927 // match: (RSBshiftRLreg x y (MOVWconst [c])) 10928 // cond: 10929 // result: (RSBshiftRL x y [c]) 10930 for { 10931 _ = v.Args[2] 10932 x := v.Args[0] 10933 y := v.Args[1] 10934 v_2 := v.Args[2] 10935 if v_2.Op != OpARMMOVWconst { 10936 break 10937 } 10938 c := v_2.AuxInt 10939 v.reset(OpARMRSBshiftRL) 10940 v.AuxInt = c 10941 v.AddArg(x) 10942 v.AddArg(y) 10943 return true 10944 } 10945 return false 10946 } 10947 func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { 10948 // match: (RSCconst [c] (ADDconst [d] x) flags) 10949 // cond: 10950 // result: (RSCconst [int64(int32(c-d))] x flags) 10951 for { 10952 c := v.AuxInt 10953 _ = v.Args[1] 10954 v_0 := v.Args[0] 10955 if v_0.Op != OpARMADDconst { 10956 break 10957 } 10958 d := v_0.AuxInt 10959 x := v_0.Args[0] 10960 flags := v.Args[1] 10961 v.reset(OpARMRSCconst) 10962 v.AuxInt = int64(int32(c - d)) 10963 v.AddArg(x) 10964 v.AddArg(flags) 10965 return true 10966 } 10967 // match: (RSCconst [c] (SUBconst [d] x) flags) 10968 // cond: 10969 // result: (RSCconst [int64(int32(c+d))] x flags) 10970 for { 10971 c := v.AuxInt 10972 _ = v.Args[1] 10973 v_0 := v.Args[0] 10974 if v_0.Op != OpARMSUBconst { 10975 break 10976 } 10977 d := v_0.AuxInt 10978 x := v_0.Args[0] 10979 flags := v.Args[1] 10980 v.reset(OpARMRSCconst) 10981 v.AuxInt = int64(int32(c + d)) 10982 v.AddArg(x) 10983 v.AddArg(flags) 10984 return true 10985 } 10986 return false 10987 } 10988 func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { 10989 b := v.Block 10990 _ = b 10991 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 10992 // cond: 10993 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 10994 for { 10995 d := v.AuxInt 10996 _ = v.Args[2] 10997 v_0 := v.Args[0] 10998 if v_0.Op != OpARMMOVWconst { 10999 break 11000 } 11001 c := v_0.AuxInt 11002 x := v.Args[1] 11003 flags := v.Args[2] 11004 v.reset(OpARMSBCconst) 11005 v.AuxInt = c 11006 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11007 v0.AuxInt = d 11008 v0.AddArg(x) 11009 v.AddArg(v0) 11010 v.AddArg(flags) 11011 return true 11012 } 11013 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 11014 // cond: 11015 // result: (RSCconst x [int64(uint32(c)<<uint64(d))] flags) 11016 for { 11017 d := v.AuxInt 11018 _ = v.Args[2] 11019 x := v.Args[0] 11020 v_1 := v.Args[1] 11021 if v_1.Op != OpARMMOVWconst { 11022 break 11023 } 11024 c := v_1.AuxInt 11025 flags := v.Args[2] 11026 v.reset(OpARMRSCconst) 11027 v.AuxInt = int64(uint32(c) << uint64(d)) 11028 v.AddArg(x) 11029 v.AddArg(flags) 11030 return true 11031 } 11032 return false 11033 } 11034 func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { 11035 b := v.Block 11036 _ = b 11037 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 11038 // cond: 11039 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 11040 for { 11041 _ = v.Args[3] 11042 v_0 := v.Args[0] 11043 if v_0.Op != OpARMMOVWconst { 11044 break 11045 } 11046 c := v_0.AuxInt 11047 x := v.Args[1] 11048 y := v.Args[2] 11049 flags := v.Args[3] 11050 v.reset(OpARMSBCconst) 11051 v.AuxInt = c 11052 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11053 v0.AddArg(x) 11054 v0.AddArg(y) 11055 v.AddArg(v0) 11056 v.AddArg(flags) 11057 return true 11058 } 11059 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 11060 // cond: 11061 // result: (RSCshiftLL x y [c] flags) 11062 for { 11063 _ = v.Args[3] 11064 x := v.Args[0] 11065 y := v.Args[1] 11066 v_2 := v.Args[2] 11067 if v_2.Op != OpARMMOVWconst { 11068 break 11069 } 11070 c := v_2.AuxInt 11071 flags := v.Args[3] 11072 v.reset(OpARMRSCshiftLL) 11073 v.AuxInt = c 11074 v.AddArg(x) 11075 v.AddArg(y) 11076 v.AddArg(flags) 11077 return true 11078 } 11079 return false 11080 } 11081 func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { 11082 b := v.Block 11083 _ = b 11084 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 11085 // cond: 11086 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 11087 for { 11088 d := v.AuxInt 11089 _ = v.Args[2] 11090 v_0 := v.Args[0] 11091 if v_0.Op != OpARMMOVWconst { 11092 break 11093 } 11094 c := v_0.AuxInt 11095 x := v.Args[1] 11096 flags := v.Args[2] 11097 v.reset(OpARMSBCconst) 11098 v.AuxInt = c 11099 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11100 v0.AuxInt = d 11101 v0.AddArg(x) 11102 v.AddArg(v0) 11103 v.AddArg(flags) 11104 return true 11105 } 11106 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 11107 // cond: 11108 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 11109 for { 11110 d := v.AuxInt 11111 _ = v.Args[2] 11112 x := v.Args[0] 11113 v_1 := v.Args[1] 11114 if v_1.Op != OpARMMOVWconst { 11115 break 11116 } 11117 c := v_1.AuxInt 11118 flags := v.Args[2] 11119 v.reset(OpARMRSCconst) 11120 v.AuxInt = int64(int32(c) >> uint64(d)) 11121 v.AddArg(x) 11122 v.AddArg(flags) 11123 return true 11124 } 11125 return false 11126 } 11127 func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { 11128 b := v.Block 11129 _ = b 11130 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 11131 // cond: 11132 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 11133 for { 11134 _ = v.Args[3] 11135 v_0 := v.Args[0] 11136 if v_0.Op != OpARMMOVWconst { 11137 break 11138 } 11139 c := v_0.AuxInt 11140 x := v.Args[1] 11141 y := v.Args[2] 11142 flags := v.Args[3] 11143 v.reset(OpARMSBCconst) 11144 v.AuxInt = c 11145 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11146 v0.AddArg(x) 11147 v0.AddArg(y) 11148 v.AddArg(v0) 11149 v.AddArg(flags) 11150 return true 11151 } 11152 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 11153 // cond: 11154 // result: (RSCshiftRA x y [c] flags) 11155 for { 11156 _ = v.Args[3] 11157 x := v.Args[0] 11158 y := v.Args[1] 11159 v_2 := v.Args[2] 11160 if v_2.Op != OpARMMOVWconst { 11161 break 11162 } 11163 c := v_2.AuxInt 11164 flags := v.Args[3] 11165 v.reset(OpARMRSCshiftRA) 11166 v.AuxInt = c 11167 v.AddArg(x) 11168 v.AddArg(y) 11169 v.AddArg(flags) 11170 return true 11171 } 11172 return false 11173 } 11174 func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { 11175 b := v.Block 11176 _ = b 11177 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 11178 // cond: 11179 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 11180 for { 11181 d := v.AuxInt 11182 _ = v.Args[2] 11183 v_0 := v.Args[0] 11184 if v_0.Op != OpARMMOVWconst { 11185 break 11186 } 11187 c := v_0.AuxInt 11188 x := v.Args[1] 11189 flags := v.Args[2] 11190 v.reset(OpARMSBCconst) 11191 v.AuxInt = c 11192 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11193 v0.AuxInt = d 11194 v0.AddArg(x) 11195 v.AddArg(v0) 11196 v.AddArg(flags) 11197 return true 11198 } 11199 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 11200 // cond: 11201 // result: (RSCconst x [int64(uint32(c)>>uint64(d))] flags) 11202 for { 11203 d := v.AuxInt 11204 _ = v.Args[2] 11205 x := v.Args[0] 11206 v_1 := v.Args[1] 11207 if v_1.Op != OpARMMOVWconst { 11208 break 11209 } 11210 c := v_1.AuxInt 11211 flags := v.Args[2] 11212 v.reset(OpARMRSCconst) 11213 v.AuxInt = int64(uint32(c) >> uint64(d)) 11214 v.AddArg(x) 11215 v.AddArg(flags) 11216 return true 11217 } 11218 return false 11219 } 11220 func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { 11221 b := v.Block 11222 _ = b 11223 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 11224 // cond: 11225 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 11226 for { 11227 _ = v.Args[3] 11228 v_0 := v.Args[0] 11229 if v_0.Op != OpARMMOVWconst { 11230 break 11231 } 11232 c := v_0.AuxInt 11233 x := v.Args[1] 11234 y := v.Args[2] 11235 flags := v.Args[3] 11236 v.reset(OpARMSBCconst) 11237 v.AuxInt = c 11238 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11239 v0.AddArg(x) 11240 v0.AddArg(y) 11241 v.AddArg(v0) 11242 v.AddArg(flags) 11243 return true 11244 } 11245 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 11246 // cond: 11247 // result: (RSCshiftRL x y [c] flags) 11248 for { 11249 _ = v.Args[3] 11250 x := v.Args[0] 11251 y := v.Args[1] 11252 v_2 := v.Args[2] 11253 if v_2.Op != OpARMMOVWconst { 11254 break 11255 } 11256 c := v_2.AuxInt 11257 flags := v.Args[3] 11258 v.reset(OpARMRSCshiftRL) 11259 v.AuxInt = c 11260 v.AddArg(x) 11261 v.AddArg(y) 11262 v.AddArg(flags) 11263 return true 11264 } 11265 return false 11266 } 11267 func rewriteValueARM_OpARMSBC_0(v *Value) bool { 11268 // match: (SBC (MOVWconst [c]) x flags) 11269 // cond: 11270 // result: (RSCconst [c] x flags) 11271 for { 11272 _ = v.Args[2] 11273 v_0 := v.Args[0] 11274 if v_0.Op != OpARMMOVWconst { 11275 break 11276 } 11277 c := v_0.AuxInt 11278 x := v.Args[1] 11279 flags := v.Args[2] 11280 v.reset(OpARMRSCconst) 11281 v.AuxInt = c 11282 v.AddArg(x) 11283 v.AddArg(flags) 11284 return true 11285 } 11286 // match: (SBC x (MOVWconst [c]) flags) 11287 // cond: 11288 // result: (SBCconst [c] x flags) 11289 for { 11290 _ = v.Args[2] 11291 x := v.Args[0] 11292 v_1 := v.Args[1] 11293 if v_1.Op != OpARMMOVWconst { 11294 break 11295 } 11296 c := v_1.AuxInt 11297 flags := v.Args[2] 11298 v.reset(OpARMSBCconst) 11299 v.AuxInt = c 11300 v.AddArg(x) 11301 v.AddArg(flags) 11302 return true 11303 } 11304 // match: (SBC x (SLLconst [c] y) flags) 11305 // cond: 11306 // result: (SBCshiftLL x y [c] flags) 11307 for { 11308 _ = v.Args[2] 11309 x := v.Args[0] 11310 v_1 := v.Args[1] 11311 if v_1.Op != OpARMSLLconst { 11312 break 11313 } 11314 c := v_1.AuxInt 11315 y := v_1.Args[0] 11316 flags := v.Args[2] 11317 v.reset(OpARMSBCshiftLL) 11318 v.AuxInt = c 11319 v.AddArg(x) 11320 v.AddArg(y) 11321 v.AddArg(flags) 11322 return true 11323 } 11324 // match: (SBC (SLLconst [c] y) x flags) 11325 // cond: 11326 // result: (RSCshiftLL x y [c] flags) 11327 for { 11328 _ = v.Args[2] 11329 v_0 := v.Args[0] 11330 if v_0.Op != OpARMSLLconst { 11331 break 11332 } 11333 c := v_0.AuxInt 11334 y := v_0.Args[0] 11335 x := v.Args[1] 11336 flags := v.Args[2] 11337 v.reset(OpARMRSCshiftLL) 11338 v.AuxInt = c 11339 v.AddArg(x) 11340 v.AddArg(y) 11341 v.AddArg(flags) 11342 return true 11343 } 11344 // match: (SBC x (SRLconst [c] y) flags) 11345 // cond: 11346 // result: (SBCshiftRL x y [c] flags) 11347 for { 11348 _ = v.Args[2] 11349 x := v.Args[0] 11350 v_1 := v.Args[1] 11351 if v_1.Op != OpARMSRLconst { 11352 break 11353 } 11354 c := v_1.AuxInt 11355 y := v_1.Args[0] 11356 flags := v.Args[2] 11357 v.reset(OpARMSBCshiftRL) 11358 v.AuxInt = c 11359 v.AddArg(x) 11360 v.AddArg(y) 11361 v.AddArg(flags) 11362 return true 11363 } 11364 // match: (SBC (SRLconst [c] y) x flags) 11365 // cond: 11366 // result: (RSCshiftRL x y [c] flags) 11367 for { 11368 _ = v.Args[2] 11369 v_0 := v.Args[0] 11370 if v_0.Op != OpARMSRLconst { 11371 break 11372 } 11373 c := v_0.AuxInt 11374 y := v_0.Args[0] 11375 x := v.Args[1] 11376 flags := v.Args[2] 11377 v.reset(OpARMRSCshiftRL) 11378 v.AuxInt = c 11379 v.AddArg(x) 11380 v.AddArg(y) 11381 v.AddArg(flags) 11382 return true 11383 } 11384 // match: (SBC x (SRAconst [c] y) flags) 11385 // cond: 11386 // result: (SBCshiftRA x y [c] flags) 11387 for { 11388 _ = v.Args[2] 11389 x := v.Args[0] 11390 v_1 := v.Args[1] 11391 if v_1.Op != OpARMSRAconst { 11392 break 11393 } 11394 c := v_1.AuxInt 11395 y := v_1.Args[0] 11396 flags := v.Args[2] 11397 v.reset(OpARMSBCshiftRA) 11398 v.AuxInt = c 11399 v.AddArg(x) 11400 v.AddArg(y) 11401 v.AddArg(flags) 11402 return true 11403 } 11404 // match: (SBC (SRAconst [c] y) x flags) 11405 // cond: 11406 // result: (RSCshiftRA x y [c] flags) 11407 for { 11408 _ = v.Args[2] 11409 v_0 := v.Args[0] 11410 if v_0.Op != OpARMSRAconst { 11411 break 11412 } 11413 c := v_0.AuxInt 11414 y := v_0.Args[0] 11415 x := v.Args[1] 11416 flags := v.Args[2] 11417 v.reset(OpARMRSCshiftRA) 11418 v.AuxInt = c 11419 v.AddArg(x) 11420 v.AddArg(y) 11421 v.AddArg(flags) 11422 return true 11423 } 11424 // match: (SBC x (SLL y z) flags) 11425 // cond: 11426 // result: (SBCshiftLLreg x y z flags) 11427 for { 11428 _ = v.Args[2] 11429 x := v.Args[0] 11430 v_1 := v.Args[1] 11431 if v_1.Op != OpARMSLL { 11432 break 11433 } 11434 _ = v_1.Args[1] 11435 y := v_1.Args[0] 11436 z := v_1.Args[1] 11437 flags := v.Args[2] 11438 v.reset(OpARMSBCshiftLLreg) 11439 v.AddArg(x) 11440 v.AddArg(y) 11441 v.AddArg(z) 11442 v.AddArg(flags) 11443 return true 11444 } 11445 // match: (SBC (SLL y z) x flags) 11446 // cond: 11447 // result: (RSCshiftLLreg x y z flags) 11448 for { 11449 _ = v.Args[2] 11450 v_0 := v.Args[0] 11451 if v_0.Op != OpARMSLL { 11452 break 11453 } 11454 _ = v_0.Args[1] 11455 y := v_0.Args[0] 11456 z := v_0.Args[1] 11457 x := v.Args[1] 11458 flags := v.Args[2] 11459 v.reset(OpARMRSCshiftLLreg) 11460 v.AddArg(x) 11461 v.AddArg(y) 11462 v.AddArg(z) 11463 v.AddArg(flags) 11464 return true 11465 } 11466 return false 11467 } 11468 func rewriteValueARM_OpARMSBC_10(v *Value) bool { 11469 // match: (SBC x (SRL y z) flags) 11470 // cond: 11471 // result: (SBCshiftRLreg x y z flags) 11472 for { 11473 _ = v.Args[2] 11474 x := v.Args[0] 11475 v_1 := v.Args[1] 11476 if v_1.Op != OpARMSRL { 11477 break 11478 } 11479 _ = v_1.Args[1] 11480 y := v_1.Args[0] 11481 z := v_1.Args[1] 11482 flags := v.Args[2] 11483 v.reset(OpARMSBCshiftRLreg) 11484 v.AddArg(x) 11485 v.AddArg(y) 11486 v.AddArg(z) 11487 v.AddArg(flags) 11488 return true 11489 } 11490 // match: (SBC (SRL y z) x flags) 11491 // cond: 11492 // result: (RSCshiftRLreg x y z flags) 11493 for { 11494 _ = v.Args[2] 11495 v_0 := v.Args[0] 11496 if v_0.Op != OpARMSRL { 11497 break 11498 } 11499 _ = v_0.Args[1] 11500 y := v_0.Args[0] 11501 z := v_0.Args[1] 11502 x := v.Args[1] 11503 flags := v.Args[2] 11504 v.reset(OpARMRSCshiftRLreg) 11505 v.AddArg(x) 11506 v.AddArg(y) 11507 v.AddArg(z) 11508 v.AddArg(flags) 11509 return true 11510 } 11511 // match: (SBC x (SRA y z) flags) 11512 // cond: 11513 // result: (SBCshiftRAreg x y z flags) 11514 for { 11515 _ = v.Args[2] 11516 x := v.Args[0] 11517 v_1 := v.Args[1] 11518 if v_1.Op != OpARMSRA { 11519 break 11520 } 11521 _ = v_1.Args[1] 11522 y := v_1.Args[0] 11523 z := v_1.Args[1] 11524 flags := v.Args[2] 11525 v.reset(OpARMSBCshiftRAreg) 11526 v.AddArg(x) 11527 v.AddArg(y) 11528 v.AddArg(z) 11529 v.AddArg(flags) 11530 return true 11531 } 11532 // match: (SBC (SRA y z) x flags) 11533 // cond: 11534 // result: (RSCshiftRAreg x y z flags) 11535 for { 11536 _ = v.Args[2] 11537 v_0 := v.Args[0] 11538 if v_0.Op != OpARMSRA { 11539 break 11540 } 11541 _ = v_0.Args[1] 11542 y := v_0.Args[0] 11543 z := v_0.Args[1] 11544 x := v.Args[1] 11545 flags := v.Args[2] 11546 v.reset(OpARMRSCshiftRAreg) 11547 v.AddArg(x) 11548 v.AddArg(y) 11549 v.AddArg(z) 11550 v.AddArg(flags) 11551 return true 11552 } 11553 return false 11554 } 11555 func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { 11556 // match: (SBCconst [c] (ADDconst [d] x) flags) 11557 // cond: 11558 // result: (SBCconst [int64(int32(c-d))] x flags) 11559 for { 11560 c := v.AuxInt 11561 _ = v.Args[1] 11562 v_0 := v.Args[0] 11563 if v_0.Op != OpARMADDconst { 11564 break 11565 } 11566 d := v_0.AuxInt 11567 x := v_0.Args[0] 11568 flags := v.Args[1] 11569 v.reset(OpARMSBCconst) 11570 v.AuxInt = int64(int32(c - d)) 11571 v.AddArg(x) 11572 v.AddArg(flags) 11573 return true 11574 } 11575 // match: (SBCconst [c] (SUBconst [d] x) flags) 11576 // cond: 11577 // result: (SBCconst [int64(int32(c+d))] x flags) 11578 for { 11579 c := v.AuxInt 11580 _ = v.Args[1] 11581 v_0 := v.Args[0] 11582 if v_0.Op != OpARMSUBconst { 11583 break 11584 } 11585 d := v_0.AuxInt 11586 x := v_0.Args[0] 11587 flags := v.Args[1] 11588 v.reset(OpARMSBCconst) 11589 v.AuxInt = int64(int32(c + d)) 11590 v.AddArg(x) 11591 v.AddArg(flags) 11592 return true 11593 } 11594 return false 11595 } 11596 func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { 11597 b := v.Block 11598 _ = b 11599 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 11600 // cond: 11601 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 11602 for { 11603 d := v.AuxInt 11604 _ = v.Args[2] 11605 v_0 := v.Args[0] 11606 if v_0.Op != OpARMMOVWconst { 11607 break 11608 } 11609 c := v_0.AuxInt 11610 x := v.Args[1] 11611 flags := v.Args[2] 11612 v.reset(OpARMRSCconst) 11613 v.AuxInt = c 11614 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11615 v0.AuxInt = d 11616 v0.AddArg(x) 11617 v.AddArg(v0) 11618 v.AddArg(flags) 11619 return true 11620 } 11621 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 11622 // cond: 11623 // result: (SBCconst x [int64(uint32(c)<<uint64(d))] flags) 11624 for { 11625 d := v.AuxInt 11626 _ = v.Args[2] 11627 x := v.Args[0] 11628 v_1 := v.Args[1] 11629 if v_1.Op != OpARMMOVWconst { 11630 break 11631 } 11632 c := v_1.AuxInt 11633 flags := v.Args[2] 11634 v.reset(OpARMSBCconst) 11635 v.AuxInt = int64(uint32(c) << uint64(d)) 11636 v.AddArg(x) 11637 v.AddArg(flags) 11638 return true 11639 } 11640 return false 11641 } 11642 func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { 11643 b := v.Block 11644 _ = b 11645 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 11646 // cond: 11647 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 11648 for { 11649 _ = v.Args[3] 11650 v_0 := v.Args[0] 11651 if v_0.Op != OpARMMOVWconst { 11652 break 11653 } 11654 c := v_0.AuxInt 11655 x := v.Args[1] 11656 y := v.Args[2] 11657 flags := v.Args[3] 11658 v.reset(OpARMRSCconst) 11659 v.AuxInt = c 11660 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11661 v0.AddArg(x) 11662 v0.AddArg(y) 11663 v.AddArg(v0) 11664 v.AddArg(flags) 11665 return true 11666 } 11667 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 11668 // cond: 11669 // result: (SBCshiftLL x y [c] flags) 11670 for { 11671 _ = v.Args[3] 11672 x := v.Args[0] 11673 y := v.Args[1] 11674 v_2 := v.Args[2] 11675 if v_2.Op != OpARMMOVWconst { 11676 break 11677 } 11678 c := v_2.AuxInt 11679 flags := v.Args[3] 11680 v.reset(OpARMSBCshiftLL) 11681 v.AuxInt = c 11682 v.AddArg(x) 11683 v.AddArg(y) 11684 v.AddArg(flags) 11685 return true 11686 } 11687 return false 11688 } 11689 func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { 11690 b := v.Block 11691 _ = b 11692 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 11693 // cond: 11694 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 11695 for { 11696 d := v.AuxInt 11697 _ = v.Args[2] 11698 v_0 := v.Args[0] 11699 if v_0.Op != OpARMMOVWconst { 11700 break 11701 } 11702 c := v_0.AuxInt 11703 x := v.Args[1] 11704 flags := v.Args[2] 11705 v.reset(OpARMRSCconst) 11706 v.AuxInt = c 11707 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11708 v0.AuxInt = d 11709 v0.AddArg(x) 11710 v.AddArg(v0) 11711 v.AddArg(flags) 11712 return true 11713 } 11714 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 11715 // cond: 11716 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 11717 for { 11718 d := v.AuxInt 11719 _ = v.Args[2] 11720 x := v.Args[0] 11721 v_1 := v.Args[1] 11722 if v_1.Op != OpARMMOVWconst { 11723 break 11724 } 11725 c := v_1.AuxInt 11726 flags := v.Args[2] 11727 v.reset(OpARMSBCconst) 11728 v.AuxInt = int64(int32(c) >> uint64(d)) 11729 v.AddArg(x) 11730 v.AddArg(flags) 11731 return true 11732 } 11733 return false 11734 } 11735 func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { 11736 b := v.Block 11737 _ = b 11738 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 11739 // cond: 11740 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 11741 for { 11742 _ = v.Args[3] 11743 v_0 := v.Args[0] 11744 if v_0.Op != OpARMMOVWconst { 11745 break 11746 } 11747 c := v_0.AuxInt 11748 x := v.Args[1] 11749 y := v.Args[2] 11750 flags := v.Args[3] 11751 v.reset(OpARMRSCconst) 11752 v.AuxInt = c 11753 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 11754 v0.AddArg(x) 11755 v0.AddArg(y) 11756 v.AddArg(v0) 11757 v.AddArg(flags) 11758 return true 11759 } 11760 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 11761 // cond: 11762 // result: (SBCshiftRA x y [c] flags) 11763 for { 11764 _ = v.Args[3] 11765 x := v.Args[0] 11766 y := v.Args[1] 11767 v_2 := v.Args[2] 11768 if v_2.Op != OpARMMOVWconst { 11769 break 11770 } 11771 c := v_2.AuxInt 11772 flags := v.Args[3] 11773 v.reset(OpARMSBCshiftRA) 11774 v.AuxInt = c 11775 v.AddArg(x) 11776 v.AddArg(y) 11777 v.AddArg(flags) 11778 return true 11779 } 11780 return false 11781 } 11782 func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { 11783 b := v.Block 11784 _ = b 11785 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 11786 // cond: 11787 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 11788 for { 11789 d := v.AuxInt 11790 _ = v.Args[2] 11791 v_0 := v.Args[0] 11792 if v_0.Op != OpARMMOVWconst { 11793 break 11794 } 11795 c := v_0.AuxInt 11796 x := v.Args[1] 11797 flags := v.Args[2] 11798 v.reset(OpARMRSCconst) 11799 v.AuxInt = c 11800 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 11801 v0.AuxInt = d 11802 v0.AddArg(x) 11803 v.AddArg(v0) 11804 v.AddArg(flags) 11805 return true 11806 } 11807 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 11808 // cond: 11809 // result: (SBCconst x [int64(uint32(c)>>uint64(d))] flags) 11810 for { 11811 d := v.AuxInt 11812 _ = v.Args[2] 11813 x := v.Args[0] 11814 v_1 := v.Args[1] 11815 if v_1.Op != OpARMMOVWconst { 11816 break 11817 } 11818 c := v_1.AuxInt 11819 flags := v.Args[2] 11820 v.reset(OpARMSBCconst) 11821 v.AuxInt = int64(uint32(c) >> uint64(d)) 11822 v.AddArg(x) 11823 v.AddArg(flags) 11824 return true 11825 } 11826 return false 11827 } 11828 func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { 11829 b := v.Block 11830 _ = b 11831 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 11832 // cond: 11833 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 11834 for { 11835 _ = v.Args[3] 11836 v_0 := v.Args[0] 11837 if v_0.Op != OpARMMOVWconst { 11838 break 11839 } 11840 c := v_0.AuxInt 11841 x := v.Args[1] 11842 y := v.Args[2] 11843 flags := v.Args[3] 11844 v.reset(OpARMRSCconst) 11845 v.AuxInt = c 11846 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 11847 v0.AddArg(x) 11848 v0.AddArg(y) 11849 v.AddArg(v0) 11850 v.AddArg(flags) 11851 return true 11852 } 11853 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 11854 // cond: 11855 // result: (SBCshiftRL x y [c] flags) 11856 for { 11857 _ = v.Args[3] 11858 x := v.Args[0] 11859 y := v.Args[1] 11860 v_2 := v.Args[2] 11861 if v_2.Op != OpARMMOVWconst { 11862 break 11863 } 11864 c := v_2.AuxInt 11865 flags := v.Args[3] 11866 v.reset(OpARMSBCshiftRL) 11867 v.AuxInt = c 11868 v.AddArg(x) 11869 v.AddArg(y) 11870 v.AddArg(flags) 11871 return true 11872 } 11873 return false 11874 } 11875 func rewriteValueARM_OpARMSLL_0(v *Value) bool { 11876 // match: (SLL x (MOVWconst [c])) 11877 // cond: 11878 // result: (SLLconst x [c&31]) 11879 for { 11880 _ = v.Args[1] 11881 x := v.Args[0] 11882 v_1 := v.Args[1] 11883 if v_1.Op != OpARMMOVWconst { 11884 break 11885 } 11886 c := v_1.AuxInt 11887 v.reset(OpARMSLLconst) 11888 v.AuxInt = c & 31 11889 v.AddArg(x) 11890 return true 11891 } 11892 return false 11893 } 11894 func rewriteValueARM_OpARMSLLconst_0(v *Value) bool { 11895 // match: (SLLconst [c] (MOVWconst [d])) 11896 // cond: 11897 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 11898 for { 11899 c := v.AuxInt 11900 v_0 := v.Args[0] 11901 if v_0.Op != OpARMMOVWconst { 11902 break 11903 } 11904 d := v_0.AuxInt 11905 v.reset(OpARMMOVWconst) 11906 v.AuxInt = int64(uint32(d) << uint64(c)) 11907 return true 11908 } 11909 return false 11910 } 11911 func rewriteValueARM_OpARMSRA_0(v *Value) bool { 11912 // match: (SRA x (MOVWconst [c])) 11913 // cond: 11914 // result: (SRAconst x [c&31]) 11915 for { 11916 _ = v.Args[1] 11917 x := v.Args[0] 11918 v_1 := v.Args[1] 11919 if v_1.Op != OpARMMOVWconst { 11920 break 11921 } 11922 c := v_1.AuxInt 11923 v.reset(OpARMSRAconst) 11924 v.AuxInt = c & 31 11925 v.AddArg(x) 11926 return true 11927 } 11928 return false 11929 } 11930 func rewriteValueARM_OpARMSRAcond_0(v *Value) bool { 11931 // match: (SRAcond x _ (FlagEQ)) 11932 // cond: 11933 // result: (SRAconst x [31]) 11934 for { 11935 _ = v.Args[2] 11936 x := v.Args[0] 11937 v_2 := v.Args[2] 11938 if v_2.Op != OpARMFlagEQ { 11939 break 11940 } 11941 v.reset(OpARMSRAconst) 11942 v.AuxInt = 31 11943 v.AddArg(x) 11944 return true 11945 } 11946 // match: (SRAcond x y (FlagLT_ULT)) 11947 // cond: 11948 // result: (SRA x y) 11949 for { 11950 _ = v.Args[2] 11951 x := v.Args[0] 11952 y := v.Args[1] 11953 v_2 := v.Args[2] 11954 if v_2.Op != OpARMFlagLT_ULT { 11955 break 11956 } 11957 v.reset(OpARMSRA) 11958 v.AddArg(x) 11959 v.AddArg(y) 11960 return true 11961 } 11962 // match: (SRAcond x _ (FlagLT_UGT)) 11963 // cond: 11964 // result: (SRAconst x [31]) 11965 for { 11966 _ = v.Args[2] 11967 x := v.Args[0] 11968 v_2 := v.Args[2] 11969 if v_2.Op != OpARMFlagLT_UGT { 11970 break 11971 } 11972 v.reset(OpARMSRAconst) 11973 v.AuxInt = 31 11974 v.AddArg(x) 11975 return true 11976 } 11977 // match: (SRAcond x y (FlagGT_ULT)) 11978 // cond: 11979 // result: (SRA x y) 11980 for { 11981 _ = v.Args[2] 11982 x := v.Args[0] 11983 y := v.Args[1] 11984 v_2 := v.Args[2] 11985 if v_2.Op != OpARMFlagGT_ULT { 11986 break 11987 } 11988 v.reset(OpARMSRA) 11989 v.AddArg(x) 11990 v.AddArg(y) 11991 return true 11992 } 11993 // match: (SRAcond x _ (FlagGT_UGT)) 11994 // cond: 11995 // result: (SRAconst x [31]) 11996 for { 11997 _ = v.Args[2] 11998 x := v.Args[0] 11999 v_2 := v.Args[2] 12000 if v_2.Op != OpARMFlagGT_UGT { 12001 break 12002 } 12003 v.reset(OpARMSRAconst) 12004 v.AuxInt = 31 12005 v.AddArg(x) 12006 return true 12007 } 12008 return false 12009 } 12010 func rewriteValueARM_OpARMSRAconst_0(v *Value) bool { 12011 // match: (SRAconst [c] (MOVWconst [d])) 12012 // cond: 12013 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 12014 for { 12015 c := v.AuxInt 12016 v_0 := v.Args[0] 12017 if v_0.Op != OpARMMOVWconst { 12018 break 12019 } 12020 d := v_0.AuxInt 12021 v.reset(OpARMMOVWconst) 12022 v.AuxInt = int64(int32(d) >> uint64(c)) 12023 return true 12024 } 12025 return false 12026 } 12027 func rewriteValueARM_OpARMSRL_0(v *Value) bool { 12028 // match: (SRL x (MOVWconst [c])) 12029 // cond: 12030 // result: (SRLconst x [c&31]) 12031 for { 12032 _ = v.Args[1] 12033 x := v.Args[0] 12034 v_1 := v.Args[1] 12035 if v_1.Op != OpARMMOVWconst { 12036 break 12037 } 12038 c := v_1.AuxInt 12039 v.reset(OpARMSRLconst) 12040 v.AuxInt = c & 31 12041 v.AddArg(x) 12042 return true 12043 } 12044 return false 12045 } 12046 func rewriteValueARM_OpARMSRLconst_0(v *Value) bool { 12047 // match: (SRLconst [c] (MOVWconst [d])) 12048 // cond: 12049 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 12050 for { 12051 c := v.AuxInt 12052 v_0 := v.Args[0] 12053 if v_0.Op != OpARMMOVWconst { 12054 break 12055 } 12056 d := v_0.AuxInt 12057 v.reset(OpARMMOVWconst) 12058 v.AuxInt = int64(uint32(d) >> uint64(c)) 12059 return true 12060 } 12061 return false 12062 } 12063 func rewriteValueARM_OpARMSUB_0(v *Value) bool { 12064 // match: (SUB (MOVWconst [c]) x) 12065 // cond: 12066 // result: (RSBconst [c] x) 12067 for { 12068 _ = v.Args[1] 12069 v_0 := v.Args[0] 12070 if v_0.Op != OpARMMOVWconst { 12071 break 12072 } 12073 c := v_0.AuxInt 12074 x := v.Args[1] 12075 v.reset(OpARMRSBconst) 12076 v.AuxInt = c 12077 v.AddArg(x) 12078 return true 12079 } 12080 // match: (SUB x (MOVWconst [c])) 12081 // cond: 12082 // result: (SUBconst [c] x) 12083 for { 12084 _ = v.Args[1] 12085 x := v.Args[0] 12086 v_1 := v.Args[1] 12087 if v_1.Op != OpARMMOVWconst { 12088 break 12089 } 12090 c := v_1.AuxInt 12091 v.reset(OpARMSUBconst) 12092 v.AuxInt = c 12093 v.AddArg(x) 12094 return true 12095 } 12096 // match: (SUB x (SLLconst [c] y)) 12097 // cond: 12098 // result: (SUBshiftLL x y [c]) 12099 for { 12100 _ = v.Args[1] 12101 x := v.Args[0] 12102 v_1 := v.Args[1] 12103 if v_1.Op != OpARMSLLconst { 12104 break 12105 } 12106 c := v_1.AuxInt 12107 y := v_1.Args[0] 12108 v.reset(OpARMSUBshiftLL) 12109 v.AuxInt = c 12110 v.AddArg(x) 12111 v.AddArg(y) 12112 return true 12113 } 12114 // match: (SUB (SLLconst [c] y) x) 12115 // cond: 12116 // result: (RSBshiftLL x y [c]) 12117 for { 12118 _ = v.Args[1] 12119 v_0 := v.Args[0] 12120 if v_0.Op != OpARMSLLconst { 12121 break 12122 } 12123 c := v_0.AuxInt 12124 y := v_0.Args[0] 12125 x := v.Args[1] 12126 v.reset(OpARMRSBshiftLL) 12127 v.AuxInt = c 12128 v.AddArg(x) 12129 v.AddArg(y) 12130 return true 12131 } 12132 // match: (SUB x (SRLconst [c] y)) 12133 // cond: 12134 // result: (SUBshiftRL x y [c]) 12135 for { 12136 _ = v.Args[1] 12137 x := v.Args[0] 12138 v_1 := v.Args[1] 12139 if v_1.Op != OpARMSRLconst { 12140 break 12141 } 12142 c := v_1.AuxInt 12143 y := v_1.Args[0] 12144 v.reset(OpARMSUBshiftRL) 12145 v.AuxInt = c 12146 v.AddArg(x) 12147 v.AddArg(y) 12148 return true 12149 } 12150 // match: (SUB (SRLconst [c] y) x) 12151 // cond: 12152 // result: (RSBshiftRL x y [c]) 12153 for { 12154 _ = v.Args[1] 12155 v_0 := v.Args[0] 12156 if v_0.Op != OpARMSRLconst { 12157 break 12158 } 12159 c := v_0.AuxInt 12160 y := v_0.Args[0] 12161 x := v.Args[1] 12162 v.reset(OpARMRSBshiftRL) 12163 v.AuxInt = c 12164 v.AddArg(x) 12165 v.AddArg(y) 12166 return true 12167 } 12168 // match: (SUB x (SRAconst [c] y)) 12169 // cond: 12170 // result: (SUBshiftRA x y [c]) 12171 for { 12172 _ = v.Args[1] 12173 x := v.Args[0] 12174 v_1 := v.Args[1] 12175 if v_1.Op != OpARMSRAconst { 12176 break 12177 } 12178 c := v_1.AuxInt 12179 y := v_1.Args[0] 12180 v.reset(OpARMSUBshiftRA) 12181 v.AuxInt = c 12182 v.AddArg(x) 12183 v.AddArg(y) 12184 return true 12185 } 12186 // match: (SUB (SRAconst [c] y) x) 12187 // cond: 12188 // result: (RSBshiftRA x y [c]) 12189 for { 12190 _ = v.Args[1] 12191 v_0 := v.Args[0] 12192 if v_0.Op != OpARMSRAconst { 12193 break 12194 } 12195 c := v_0.AuxInt 12196 y := v_0.Args[0] 12197 x := v.Args[1] 12198 v.reset(OpARMRSBshiftRA) 12199 v.AuxInt = c 12200 v.AddArg(x) 12201 v.AddArg(y) 12202 return true 12203 } 12204 // match: (SUB x (SLL y z)) 12205 // cond: 12206 // result: (SUBshiftLLreg x y z) 12207 for { 12208 _ = v.Args[1] 12209 x := v.Args[0] 12210 v_1 := v.Args[1] 12211 if v_1.Op != OpARMSLL { 12212 break 12213 } 12214 _ = v_1.Args[1] 12215 y := v_1.Args[0] 12216 z := v_1.Args[1] 12217 v.reset(OpARMSUBshiftLLreg) 12218 v.AddArg(x) 12219 v.AddArg(y) 12220 v.AddArg(z) 12221 return true 12222 } 12223 // match: (SUB (SLL y z) x) 12224 // cond: 12225 // result: (RSBshiftLLreg x y z) 12226 for { 12227 _ = v.Args[1] 12228 v_0 := v.Args[0] 12229 if v_0.Op != OpARMSLL { 12230 break 12231 } 12232 _ = v_0.Args[1] 12233 y := v_0.Args[0] 12234 z := v_0.Args[1] 12235 x := v.Args[1] 12236 v.reset(OpARMRSBshiftLLreg) 12237 v.AddArg(x) 12238 v.AddArg(y) 12239 v.AddArg(z) 12240 return true 12241 } 12242 return false 12243 } 12244 func rewriteValueARM_OpARMSUB_10(v *Value) bool { 12245 // match: (SUB x (SRL y z)) 12246 // cond: 12247 // result: (SUBshiftRLreg x y z) 12248 for { 12249 _ = v.Args[1] 12250 x := v.Args[0] 12251 v_1 := v.Args[1] 12252 if v_1.Op != OpARMSRL { 12253 break 12254 } 12255 _ = v_1.Args[1] 12256 y := v_1.Args[0] 12257 z := v_1.Args[1] 12258 v.reset(OpARMSUBshiftRLreg) 12259 v.AddArg(x) 12260 v.AddArg(y) 12261 v.AddArg(z) 12262 return true 12263 } 12264 // match: (SUB (SRL y z) x) 12265 // cond: 12266 // result: (RSBshiftRLreg x y z) 12267 for { 12268 _ = v.Args[1] 12269 v_0 := v.Args[0] 12270 if v_0.Op != OpARMSRL { 12271 break 12272 } 12273 _ = v_0.Args[1] 12274 y := v_0.Args[0] 12275 z := v_0.Args[1] 12276 x := v.Args[1] 12277 v.reset(OpARMRSBshiftRLreg) 12278 v.AddArg(x) 12279 v.AddArg(y) 12280 v.AddArg(z) 12281 return true 12282 } 12283 // match: (SUB x (SRA y z)) 12284 // cond: 12285 // result: (SUBshiftRAreg x y z) 12286 for { 12287 _ = v.Args[1] 12288 x := v.Args[0] 12289 v_1 := v.Args[1] 12290 if v_1.Op != OpARMSRA { 12291 break 12292 } 12293 _ = v_1.Args[1] 12294 y := v_1.Args[0] 12295 z := v_1.Args[1] 12296 v.reset(OpARMSUBshiftRAreg) 12297 v.AddArg(x) 12298 v.AddArg(y) 12299 v.AddArg(z) 12300 return true 12301 } 12302 // match: (SUB (SRA y z) x) 12303 // cond: 12304 // result: (RSBshiftRAreg x y z) 12305 for { 12306 _ = v.Args[1] 12307 v_0 := v.Args[0] 12308 if v_0.Op != OpARMSRA { 12309 break 12310 } 12311 _ = v_0.Args[1] 12312 y := v_0.Args[0] 12313 z := v_0.Args[1] 12314 x := v.Args[1] 12315 v.reset(OpARMRSBshiftRAreg) 12316 v.AddArg(x) 12317 v.AddArg(y) 12318 v.AddArg(z) 12319 return true 12320 } 12321 // match: (SUB x x) 12322 // cond: 12323 // result: (MOVWconst [0]) 12324 for { 12325 _ = v.Args[1] 12326 x := v.Args[0] 12327 if x != v.Args[1] { 12328 break 12329 } 12330 v.reset(OpARMMOVWconst) 12331 v.AuxInt = 0 12332 return true 12333 } 12334 return false 12335 } 12336 func rewriteValueARM_OpARMSUBS_0(v *Value) bool { 12337 // match: (SUBS x (MOVWconst [c])) 12338 // cond: 12339 // result: (SUBSconst [c] x) 12340 for { 12341 _ = v.Args[1] 12342 x := v.Args[0] 12343 v_1 := v.Args[1] 12344 if v_1.Op != OpARMMOVWconst { 12345 break 12346 } 12347 c := v_1.AuxInt 12348 v.reset(OpARMSUBSconst) 12349 v.AuxInt = c 12350 v.AddArg(x) 12351 return true 12352 } 12353 // match: (SUBS x (SLLconst [c] y)) 12354 // cond: 12355 // result: (SUBSshiftLL x y [c]) 12356 for { 12357 _ = v.Args[1] 12358 x := v.Args[0] 12359 v_1 := v.Args[1] 12360 if v_1.Op != OpARMSLLconst { 12361 break 12362 } 12363 c := v_1.AuxInt 12364 y := v_1.Args[0] 12365 v.reset(OpARMSUBSshiftLL) 12366 v.AuxInt = c 12367 v.AddArg(x) 12368 v.AddArg(y) 12369 return true 12370 } 12371 // match: (SUBS (SLLconst [c] y) x) 12372 // cond: 12373 // result: (RSBSshiftLL x y [c]) 12374 for { 12375 _ = v.Args[1] 12376 v_0 := v.Args[0] 12377 if v_0.Op != OpARMSLLconst { 12378 break 12379 } 12380 c := v_0.AuxInt 12381 y := v_0.Args[0] 12382 x := v.Args[1] 12383 v.reset(OpARMRSBSshiftLL) 12384 v.AuxInt = c 12385 v.AddArg(x) 12386 v.AddArg(y) 12387 return true 12388 } 12389 // match: (SUBS x (SRLconst [c] y)) 12390 // cond: 12391 // result: (SUBSshiftRL x y [c]) 12392 for { 12393 _ = v.Args[1] 12394 x := v.Args[0] 12395 v_1 := v.Args[1] 12396 if v_1.Op != OpARMSRLconst { 12397 break 12398 } 12399 c := v_1.AuxInt 12400 y := v_1.Args[0] 12401 v.reset(OpARMSUBSshiftRL) 12402 v.AuxInt = c 12403 v.AddArg(x) 12404 v.AddArg(y) 12405 return true 12406 } 12407 // match: (SUBS (SRLconst [c] y) x) 12408 // cond: 12409 // result: (RSBSshiftRL x y [c]) 12410 for { 12411 _ = v.Args[1] 12412 v_0 := v.Args[0] 12413 if v_0.Op != OpARMSRLconst { 12414 break 12415 } 12416 c := v_0.AuxInt 12417 y := v_0.Args[0] 12418 x := v.Args[1] 12419 v.reset(OpARMRSBSshiftRL) 12420 v.AuxInt = c 12421 v.AddArg(x) 12422 v.AddArg(y) 12423 return true 12424 } 12425 // match: (SUBS x (SRAconst [c] y)) 12426 // cond: 12427 // result: (SUBSshiftRA x y [c]) 12428 for { 12429 _ = v.Args[1] 12430 x := v.Args[0] 12431 v_1 := v.Args[1] 12432 if v_1.Op != OpARMSRAconst { 12433 break 12434 } 12435 c := v_1.AuxInt 12436 y := v_1.Args[0] 12437 v.reset(OpARMSUBSshiftRA) 12438 v.AuxInt = c 12439 v.AddArg(x) 12440 v.AddArg(y) 12441 return true 12442 } 12443 // match: (SUBS (SRAconst [c] y) x) 12444 // cond: 12445 // result: (RSBSshiftRA x y [c]) 12446 for { 12447 _ = v.Args[1] 12448 v_0 := v.Args[0] 12449 if v_0.Op != OpARMSRAconst { 12450 break 12451 } 12452 c := v_0.AuxInt 12453 y := v_0.Args[0] 12454 x := v.Args[1] 12455 v.reset(OpARMRSBSshiftRA) 12456 v.AuxInt = c 12457 v.AddArg(x) 12458 v.AddArg(y) 12459 return true 12460 } 12461 // match: (SUBS x (SLL y z)) 12462 // cond: 12463 // result: (SUBSshiftLLreg x y z) 12464 for { 12465 _ = v.Args[1] 12466 x := v.Args[0] 12467 v_1 := v.Args[1] 12468 if v_1.Op != OpARMSLL { 12469 break 12470 } 12471 _ = v_1.Args[1] 12472 y := v_1.Args[0] 12473 z := v_1.Args[1] 12474 v.reset(OpARMSUBSshiftLLreg) 12475 v.AddArg(x) 12476 v.AddArg(y) 12477 v.AddArg(z) 12478 return true 12479 } 12480 // match: (SUBS (SLL y z) x) 12481 // cond: 12482 // result: (RSBSshiftLLreg x y z) 12483 for { 12484 _ = v.Args[1] 12485 v_0 := v.Args[0] 12486 if v_0.Op != OpARMSLL { 12487 break 12488 } 12489 _ = v_0.Args[1] 12490 y := v_0.Args[0] 12491 z := v_0.Args[1] 12492 x := v.Args[1] 12493 v.reset(OpARMRSBSshiftLLreg) 12494 v.AddArg(x) 12495 v.AddArg(y) 12496 v.AddArg(z) 12497 return true 12498 } 12499 // match: (SUBS x (SRL y z)) 12500 // cond: 12501 // result: (SUBSshiftRLreg x y z) 12502 for { 12503 _ = v.Args[1] 12504 x := v.Args[0] 12505 v_1 := v.Args[1] 12506 if v_1.Op != OpARMSRL { 12507 break 12508 } 12509 _ = v_1.Args[1] 12510 y := v_1.Args[0] 12511 z := v_1.Args[1] 12512 v.reset(OpARMSUBSshiftRLreg) 12513 v.AddArg(x) 12514 v.AddArg(y) 12515 v.AddArg(z) 12516 return true 12517 } 12518 return false 12519 } 12520 func rewriteValueARM_OpARMSUBS_10(v *Value) bool { 12521 // match: (SUBS (SRL y z) x) 12522 // cond: 12523 // result: (RSBSshiftRLreg x y z) 12524 for { 12525 _ = v.Args[1] 12526 v_0 := v.Args[0] 12527 if v_0.Op != OpARMSRL { 12528 break 12529 } 12530 _ = v_0.Args[1] 12531 y := v_0.Args[0] 12532 z := v_0.Args[1] 12533 x := v.Args[1] 12534 v.reset(OpARMRSBSshiftRLreg) 12535 v.AddArg(x) 12536 v.AddArg(y) 12537 v.AddArg(z) 12538 return true 12539 } 12540 // match: (SUBS x (SRA y z)) 12541 // cond: 12542 // result: (SUBSshiftRAreg x y z) 12543 for { 12544 _ = v.Args[1] 12545 x := v.Args[0] 12546 v_1 := v.Args[1] 12547 if v_1.Op != OpARMSRA { 12548 break 12549 } 12550 _ = v_1.Args[1] 12551 y := v_1.Args[0] 12552 z := v_1.Args[1] 12553 v.reset(OpARMSUBSshiftRAreg) 12554 v.AddArg(x) 12555 v.AddArg(y) 12556 v.AddArg(z) 12557 return true 12558 } 12559 // match: (SUBS (SRA y z) x) 12560 // cond: 12561 // result: (RSBSshiftRAreg x y z) 12562 for { 12563 _ = v.Args[1] 12564 v_0 := v.Args[0] 12565 if v_0.Op != OpARMSRA { 12566 break 12567 } 12568 _ = v_0.Args[1] 12569 y := v_0.Args[0] 12570 z := v_0.Args[1] 12571 x := v.Args[1] 12572 v.reset(OpARMRSBSshiftRAreg) 12573 v.AddArg(x) 12574 v.AddArg(y) 12575 v.AddArg(z) 12576 return true 12577 } 12578 return false 12579 } 12580 func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { 12581 b := v.Block 12582 _ = b 12583 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 12584 // cond: 12585 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 12586 for { 12587 d := v.AuxInt 12588 _ = v.Args[1] 12589 v_0 := v.Args[0] 12590 if v_0.Op != OpARMMOVWconst { 12591 break 12592 } 12593 c := v_0.AuxInt 12594 x := v.Args[1] 12595 v.reset(OpARMRSBSconst) 12596 v.AuxInt = c 12597 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12598 v0.AuxInt = d 12599 v0.AddArg(x) 12600 v.AddArg(v0) 12601 return true 12602 } 12603 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 12604 // cond: 12605 // result: (SUBSconst x [int64(uint32(c)<<uint64(d))]) 12606 for { 12607 d := v.AuxInt 12608 _ = v.Args[1] 12609 x := v.Args[0] 12610 v_1 := v.Args[1] 12611 if v_1.Op != OpARMMOVWconst { 12612 break 12613 } 12614 c := v_1.AuxInt 12615 v.reset(OpARMSUBSconst) 12616 v.AuxInt = int64(uint32(c) << uint64(d)) 12617 v.AddArg(x) 12618 return true 12619 } 12620 return false 12621 } 12622 func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { 12623 b := v.Block 12624 _ = b 12625 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 12626 // cond: 12627 // result: (RSBSconst [c] (SLL <x.Type> x y)) 12628 for { 12629 _ = v.Args[2] 12630 v_0 := v.Args[0] 12631 if v_0.Op != OpARMMOVWconst { 12632 break 12633 } 12634 c := v_0.AuxInt 12635 x := v.Args[1] 12636 y := v.Args[2] 12637 v.reset(OpARMRSBSconst) 12638 v.AuxInt = c 12639 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12640 v0.AddArg(x) 12641 v0.AddArg(y) 12642 v.AddArg(v0) 12643 return true 12644 } 12645 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 12646 // cond: 12647 // result: (SUBSshiftLL x y [c]) 12648 for { 12649 _ = v.Args[2] 12650 x := v.Args[0] 12651 y := v.Args[1] 12652 v_2 := v.Args[2] 12653 if v_2.Op != OpARMMOVWconst { 12654 break 12655 } 12656 c := v_2.AuxInt 12657 v.reset(OpARMSUBSshiftLL) 12658 v.AuxInt = c 12659 v.AddArg(x) 12660 v.AddArg(y) 12661 return true 12662 } 12663 return false 12664 } 12665 func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { 12666 b := v.Block 12667 _ = b 12668 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 12669 // cond: 12670 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 12671 for { 12672 d := v.AuxInt 12673 _ = v.Args[1] 12674 v_0 := v.Args[0] 12675 if v_0.Op != OpARMMOVWconst { 12676 break 12677 } 12678 c := v_0.AuxInt 12679 x := v.Args[1] 12680 v.reset(OpARMRSBSconst) 12681 v.AuxInt = c 12682 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12683 v0.AuxInt = d 12684 v0.AddArg(x) 12685 v.AddArg(v0) 12686 return true 12687 } 12688 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 12689 // cond: 12690 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 12691 for { 12692 d := v.AuxInt 12693 _ = v.Args[1] 12694 x := v.Args[0] 12695 v_1 := v.Args[1] 12696 if v_1.Op != OpARMMOVWconst { 12697 break 12698 } 12699 c := v_1.AuxInt 12700 v.reset(OpARMSUBSconst) 12701 v.AuxInt = int64(int32(c) >> uint64(d)) 12702 v.AddArg(x) 12703 return true 12704 } 12705 return false 12706 } 12707 func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { 12708 b := v.Block 12709 _ = b 12710 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 12711 // cond: 12712 // result: (RSBSconst [c] (SRA <x.Type> x y)) 12713 for { 12714 _ = v.Args[2] 12715 v_0 := v.Args[0] 12716 if v_0.Op != OpARMMOVWconst { 12717 break 12718 } 12719 c := v_0.AuxInt 12720 x := v.Args[1] 12721 y := v.Args[2] 12722 v.reset(OpARMRSBSconst) 12723 v.AuxInt = c 12724 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12725 v0.AddArg(x) 12726 v0.AddArg(y) 12727 v.AddArg(v0) 12728 return true 12729 } 12730 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 12731 // cond: 12732 // result: (SUBSshiftRA x y [c]) 12733 for { 12734 _ = v.Args[2] 12735 x := v.Args[0] 12736 y := v.Args[1] 12737 v_2 := v.Args[2] 12738 if v_2.Op != OpARMMOVWconst { 12739 break 12740 } 12741 c := v_2.AuxInt 12742 v.reset(OpARMSUBSshiftRA) 12743 v.AuxInt = c 12744 v.AddArg(x) 12745 v.AddArg(y) 12746 return true 12747 } 12748 return false 12749 } 12750 func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { 12751 b := v.Block 12752 _ = b 12753 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 12754 // cond: 12755 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 12756 for { 12757 d := v.AuxInt 12758 _ = v.Args[1] 12759 v_0 := v.Args[0] 12760 if v_0.Op != OpARMMOVWconst { 12761 break 12762 } 12763 c := v_0.AuxInt 12764 x := v.Args[1] 12765 v.reset(OpARMRSBSconst) 12766 v.AuxInt = c 12767 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12768 v0.AuxInt = d 12769 v0.AddArg(x) 12770 v.AddArg(v0) 12771 return true 12772 } 12773 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 12774 // cond: 12775 // result: (SUBSconst x [int64(uint32(c)>>uint64(d))]) 12776 for { 12777 d := v.AuxInt 12778 _ = v.Args[1] 12779 x := v.Args[0] 12780 v_1 := v.Args[1] 12781 if v_1.Op != OpARMMOVWconst { 12782 break 12783 } 12784 c := v_1.AuxInt 12785 v.reset(OpARMSUBSconst) 12786 v.AuxInt = int64(uint32(c) >> uint64(d)) 12787 v.AddArg(x) 12788 return true 12789 } 12790 return false 12791 } 12792 func rewriteValueARM_OpARMSUBSshiftRLreg_0(v *Value) bool { 12793 b := v.Block 12794 _ = b 12795 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 12796 // cond: 12797 // result: (RSBSconst [c] (SRL <x.Type> x y)) 12798 for { 12799 _ = v.Args[2] 12800 v_0 := v.Args[0] 12801 if v_0.Op != OpARMMOVWconst { 12802 break 12803 } 12804 c := v_0.AuxInt 12805 x := v.Args[1] 12806 y := v.Args[2] 12807 v.reset(OpARMRSBSconst) 12808 v.AuxInt = c 12809 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12810 v0.AddArg(x) 12811 v0.AddArg(y) 12812 v.AddArg(v0) 12813 return true 12814 } 12815 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 12816 // cond: 12817 // result: (SUBSshiftRL x y [c]) 12818 for { 12819 _ = v.Args[2] 12820 x := v.Args[0] 12821 y := v.Args[1] 12822 v_2 := v.Args[2] 12823 if v_2.Op != OpARMMOVWconst { 12824 break 12825 } 12826 c := v_2.AuxInt 12827 v.reset(OpARMSUBSshiftRL) 12828 v.AuxInt = c 12829 v.AddArg(x) 12830 v.AddArg(y) 12831 return true 12832 } 12833 return false 12834 } 12835 func rewriteValueARM_OpARMSUBconst_0(v *Value) bool { 12836 // match: (SUBconst [off1] (MOVWaddr [off2] {sym} ptr)) 12837 // cond: 12838 // result: (MOVWaddr [off2-off1] {sym} ptr) 12839 for { 12840 off1 := v.AuxInt 12841 v_0 := v.Args[0] 12842 if v_0.Op != OpARMMOVWaddr { 12843 break 12844 } 12845 off2 := v_0.AuxInt 12846 sym := v_0.Aux 12847 ptr := v_0.Args[0] 12848 v.reset(OpARMMOVWaddr) 12849 v.AuxInt = off2 - off1 12850 v.Aux = sym 12851 v.AddArg(ptr) 12852 return true 12853 } 12854 // match: (SUBconst [0] x) 12855 // cond: 12856 // result: x 12857 for { 12858 if v.AuxInt != 0 { 12859 break 12860 } 12861 x := v.Args[0] 12862 v.reset(OpCopy) 12863 v.Type = x.Type 12864 v.AddArg(x) 12865 return true 12866 } 12867 // match: (SUBconst [c] x) 12868 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 12869 // result: (ADDconst [int64(int32(-c))] x) 12870 for { 12871 c := v.AuxInt 12872 x := v.Args[0] 12873 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 12874 break 12875 } 12876 v.reset(OpARMADDconst) 12877 v.AuxInt = int64(int32(-c)) 12878 v.AddArg(x) 12879 return true 12880 } 12881 // match: (SUBconst [c] (MOVWconst [d])) 12882 // cond: 12883 // result: (MOVWconst [int64(int32(d-c))]) 12884 for { 12885 c := v.AuxInt 12886 v_0 := v.Args[0] 12887 if v_0.Op != OpARMMOVWconst { 12888 break 12889 } 12890 d := v_0.AuxInt 12891 v.reset(OpARMMOVWconst) 12892 v.AuxInt = int64(int32(d - c)) 12893 return true 12894 } 12895 // match: (SUBconst [c] (SUBconst [d] x)) 12896 // cond: 12897 // result: (ADDconst [int64(int32(-c-d))] x) 12898 for { 12899 c := v.AuxInt 12900 v_0 := v.Args[0] 12901 if v_0.Op != OpARMSUBconst { 12902 break 12903 } 12904 d := v_0.AuxInt 12905 x := v_0.Args[0] 12906 v.reset(OpARMADDconst) 12907 v.AuxInt = int64(int32(-c - d)) 12908 v.AddArg(x) 12909 return true 12910 } 12911 // match: (SUBconst [c] (ADDconst [d] x)) 12912 // cond: 12913 // result: (ADDconst [int64(int32(-c+d))] x) 12914 for { 12915 c := v.AuxInt 12916 v_0 := v.Args[0] 12917 if v_0.Op != OpARMADDconst { 12918 break 12919 } 12920 d := v_0.AuxInt 12921 x := v_0.Args[0] 12922 v.reset(OpARMADDconst) 12923 v.AuxInt = int64(int32(-c + d)) 12924 v.AddArg(x) 12925 return true 12926 } 12927 // match: (SUBconst [c] (RSBconst [d] x)) 12928 // cond: 12929 // result: (RSBconst [int64(int32(-c+d))] x) 12930 for { 12931 c := v.AuxInt 12932 v_0 := v.Args[0] 12933 if v_0.Op != OpARMRSBconst { 12934 break 12935 } 12936 d := v_0.AuxInt 12937 x := v_0.Args[0] 12938 v.reset(OpARMRSBconst) 12939 v.AuxInt = int64(int32(-c + d)) 12940 v.AddArg(x) 12941 return true 12942 } 12943 return false 12944 } 12945 func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { 12946 b := v.Block 12947 _ = b 12948 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 12949 // cond: 12950 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 12951 for { 12952 d := v.AuxInt 12953 _ = v.Args[1] 12954 v_0 := v.Args[0] 12955 if v_0.Op != OpARMMOVWconst { 12956 break 12957 } 12958 c := v_0.AuxInt 12959 x := v.Args[1] 12960 v.reset(OpARMRSBconst) 12961 v.AuxInt = c 12962 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12963 v0.AuxInt = d 12964 v0.AddArg(x) 12965 v.AddArg(v0) 12966 return true 12967 } 12968 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 12969 // cond: 12970 // result: (SUBconst x [int64(uint32(c)<<uint64(d))]) 12971 for { 12972 d := v.AuxInt 12973 _ = v.Args[1] 12974 x := v.Args[0] 12975 v_1 := v.Args[1] 12976 if v_1.Op != OpARMMOVWconst { 12977 break 12978 } 12979 c := v_1.AuxInt 12980 v.reset(OpARMSUBconst) 12981 v.AuxInt = int64(uint32(c) << uint64(d)) 12982 v.AddArg(x) 12983 return true 12984 } 12985 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 12986 // cond: c==d 12987 // result: (MOVWconst [0]) 12988 for { 12989 d := v.AuxInt 12990 _ = v.Args[1] 12991 x := v.Args[0] 12992 v_1 := v.Args[1] 12993 if v_1.Op != OpARMSLLconst { 12994 break 12995 } 12996 c := v_1.AuxInt 12997 if x != v_1.Args[0] { 12998 break 12999 } 13000 if !(c == d) { 13001 break 13002 } 13003 v.reset(OpARMMOVWconst) 13004 v.AuxInt = 0 13005 return true 13006 } 13007 return false 13008 } 13009 func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { 13010 b := v.Block 13011 _ = b 13012 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 13013 // cond: 13014 // result: (RSBconst [c] (SLL <x.Type> x y)) 13015 for { 13016 _ = v.Args[2] 13017 v_0 := v.Args[0] 13018 if v_0.Op != OpARMMOVWconst { 13019 break 13020 } 13021 c := v_0.AuxInt 13022 x := v.Args[1] 13023 y := v.Args[2] 13024 v.reset(OpARMRSBconst) 13025 v.AuxInt = c 13026 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13027 v0.AddArg(x) 13028 v0.AddArg(y) 13029 v.AddArg(v0) 13030 return true 13031 } 13032 // match: (SUBshiftLLreg x y (MOVWconst [c])) 13033 // cond: 13034 // result: (SUBshiftLL x y [c]) 13035 for { 13036 _ = v.Args[2] 13037 x := v.Args[0] 13038 y := v.Args[1] 13039 v_2 := v.Args[2] 13040 if v_2.Op != OpARMMOVWconst { 13041 break 13042 } 13043 c := v_2.AuxInt 13044 v.reset(OpARMSUBshiftLL) 13045 v.AuxInt = c 13046 v.AddArg(x) 13047 v.AddArg(y) 13048 return true 13049 } 13050 return false 13051 } 13052 func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { 13053 b := v.Block 13054 _ = b 13055 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 13056 // cond: 13057 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 13058 for { 13059 d := v.AuxInt 13060 _ = v.Args[1] 13061 v_0 := v.Args[0] 13062 if v_0.Op != OpARMMOVWconst { 13063 break 13064 } 13065 c := v_0.AuxInt 13066 x := v.Args[1] 13067 v.reset(OpARMRSBconst) 13068 v.AuxInt = c 13069 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13070 v0.AuxInt = d 13071 v0.AddArg(x) 13072 v.AddArg(v0) 13073 return true 13074 } 13075 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 13076 // cond: 13077 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 13078 for { 13079 d := v.AuxInt 13080 _ = v.Args[1] 13081 x := v.Args[0] 13082 v_1 := v.Args[1] 13083 if v_1.Op != OpARMMOVWconst { 13084 break 13085 } 13086 c := v_1.AuxInt 13087 v.reset(OpARMSUBconst) 13088 v.AuxInt = int64(int32(c) >> uint64(d)) 13089 v.AddArg(x) 13090 return true 13091 } 13092 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 13093 // cond: c==d 13094 // result: (MOVWconst [0]) 13095 for { 13096 d := v.AuxInt 13097 _ = v.Args[1] 13098 x := v.Args[0] 13099 v_1 := v.Args[1] 13100 if v_1.Op != OpARMSRAconst { 13101 break 13102 } 13103 c := v_1.AuxInt 13104 if x != v_1.Args[0] { 13105 break 13106 } 13107 if !(c == d) { 13108 break 13109 } 13110 v.reset(OpARMMOVWconst) 13111 v.AuxInt = 0 13112 return true 13113 } 13114 return false 13115 } 13116 func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { 13117 b := v.Block 13118 _ = b 13119 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 13120 // cond: 13121 // result: (RSBconst [c] (SRA <x.Type> x y)) 13122 for { 13123 _ = v.Args[2] 13124 v_0 := v.Args[0] 13125 if v_0.Op != OpARMMOVWconst { 13126 break 13127 } 13128 c := v_0.AuxInt 13129 x := v.Args[1] 13130 y := v.Args[2] 13131 v.reset(OpARMRSBconst) 13132 v.AuxInt = c 13133 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13134 v0.AddArg(x) 13135 v0.AddArg(y) 13136 v.AddArg(v0) 13137 return true 13138 } 13139 // match: (SUBshiftRAreg x y (MOVWconst [c])) 13140 // cond: 13141 // result: (SUBshiftRA x y [c]) 13142 for { 13143 _ = v.Args[2] 13144 x := v.Args[0] 13145 y := v.Args[1] 13146 v_2 := v.Args[2] 13147 if v_2.Op != OpARMMOVWconst { 13148 break 13149 } 13150 c := v_2.AuxInt 13151 v.reset(OpARMSUBshiftRA) 13152 v.AuxInt = c 13153 v.AddArg(x) 13154 v.AddArg(y) 13155 return true 13156 } 13157 return false 13158 } 13159 func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { 13160 b := v.Block 13161 _ = b 13162 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 13163 // cond: 13164 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 13165 for { 13166 d := v.AuxInt 13167 _ = v.Args[1] 13168 v_0 := v.Args[0] 13169 if v_0.Op != OpARMMOVWconst { 13170 break 13171 } 13172 c := v_0.AuxInt 13173 x := v.Args[1] 13174 v.reset(OpARMRSBconst) 13175 v.AuxInt = c 13176 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13177 v0.AuxInt = d 13178 v0.AddArg(x) 13179 v.AddArg(v0) 13180 return true 13181 } 13182 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 13183 // cond: 13184 // result: (SUBconst x [int64(uint32(c)>>uint64(d))]) 13185 for { 13186 d := v.AuxInt 13187 _ = v.Args[1] 13188 x := v.Args[0] 13189 v_1 := v.Args[1] 13190 if v_1.Op != OpARMMOVWconst { 13191 break 13192 } 13193 c := v_1.AuxInt 13194 v.reset(OpARMSUBconst) 13195 v.AuxInt = int64(uint32(c) >> uint64(d)) 13196 v.AddArg(x) 13197 return true 13198 } 13199 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 13200 // cond: c==d 13201 // result: (MOVWconst [0]) 13202 for { 13203 d := v.AuxInt 13204 _ = v.Args[1] 13205 x := v.Args[0] 13206 v_1 := v.Args[1] 13207 if v_1.Op != OpARMSRLconst { 13208 break 13209 } 13210 c := v_1.AuxInt 13211 if x != v_1.Args[0] { 13212 break 13213 } 13214 if !(c == d) { 13215 break 13216 } 13217 v.reset(OpARMMOVWconst) 13218 v.AuxInt = 0 13219 return true 13220 } 13221 return false 13222 } 13223 func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { 13224 b := v.Block 13225 _ = b 13226 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 13227 // cond: 13228 // result: (RSBconst [c] (SRL <x.Type> x y)) 13229 for { 13230 _ = v.Args[2] 13231 v_0 := v.Args[0] 13232 if v_0.Op != OpARMMOVWconst { 13233 break 13234 } 13235 c := v_0.AuxInt 13236 x := v.Args[1] 13237 y := v.Args[2] 13238 v.reset(OpARMRSBconst) 13239 v.AuxInt = c 13240 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13241 v0.AddArg(x) 13242 v0.AddArg(y) 13243 v.AddArg(v0) 13244 return true 13245 } 13246 // match: (SUBshiftRLreg x y (MOVWconst [c])) 13247 // cond: 13248 // result: (SUBshiftRL x y [c]) 13249 for { 13250 _ = v.Args[2] 13251 x := v.Args[0] 13252 y := v.Args[1] 13253 v_2 := v.Args[2] 13254 if v_2.Op != OpARMMOVWconst { 13255 break 13256 } 13257 c := v_2.AuxInt 13258 v.reset(OpARMSUBshiftRL) 13259 v.AuxInt = c 13260 v.AddArg(x) 13261 v.AddArg(y) 13262 return true 13263 } 13264 return false 13265 } 13266 func rewriteValueARM_OpARMXOR_0(v *Value) bool { 13267 // match: (XOR x (MOVWconst [c])) 13268 // cond: 13269 // result: (XORconst [c] x) 13270 for { 13271 _ = v.Args[1] 13272 x := v.Args[0] 13273 v_1 := v.Args[1] 13274 if v_1.Op != OpARMMOVWconst { 13275 break 13276 } 13277 c := v_1.AuxInt 13278 v.reset(OpARMXORconst) 13279 v.AuxInt = c 13280 v.AddArg(x) 13281 return true 13282 } 13283 // match: (XOR (MOVWconst [c]) x) 13284 // cond: 13285 // result: (XORconst [c] x) 13286 for { 13287 _ = v.Args[1] 13288 v_0 := v.Args[0] 13289 if v_0.Op != OpARMMOVWconst { 13290 break 13291 } 13292 c := v_0.AuxInt 13293 x := v.Args[1] 13294 v.reset(OpARMXORconst) 13295 v.AuxInt = c 13296 v.AddArg(x) 13297 return true 13298 } 13299 // match: (XOR x (SLLconst [c] y)) 13300 // cond: 13301 // result: (XORshiftLL x y [c]) 13302 for { 13303 _ = v.Args[1] 13304 x := v.Args[0] 13305 v_1 := v.Args[1] 13306 if v_1.Op != OpARMSLLconst { 13307 break 13308 } 13309 c := v_1.AuxInt 13310 y := v_1.Args[0] 13311 v.reset(OpARMXORshiftLL) 13312 v.AuxInt = c 13313 v.AddArg(x) 13314 v.AddArg(y) 13315 return true 13316 } 13317 // match: (XOR (SLLconst [c] y) x) 13318 // cond: 13319 // result: (XORshiftLL x y [c]) 13320 for { 13321 _ = v.Args[1] 13322 v_0 := v.Args[0] 13323 if v_0.Op != OpARMSLLconst { 13324 break 13325 } 13326 c := v_0.AuxInt 13327 y := v_0.Args[0] 13328 x := v.Args[1] 13329 v.reset(OpARMXORshiftLL) 13330 v.AuxInt = c 13331 v.AddArg(x) 13332 v.AddArg(y) 13333 return true 13334 } 13335 // match: (XOR x (SRLconst [c] y)) 13336 // cond: 13337 // result: (XORshiftRL x y [c]) 13338 for { 13339 _ = v.Args[1] 13340 x := v.Args[0] 13341 v_1 := v.Args[1] 13342 if v_1.Op != OpARMSRLconst { 13343 break 13344 } 13345 c := v_1.AuxInt 13346 y := v_1.Args[0] 13347 v.reset(OpARMXORshiftRL) 13348 v.AuxInt = c 13349 v.AddArg(x) 13350 v.AddArg(y) 13351 return true 13352 } 13353 // match: (XOR (SRLconst [c] y) x) 13354 // cond: 13355 // result: (XORshiftRL x y [c]) 13356 for { 13357 _ = v.Args[1] 13358 v_0 := v.Args[0] 13359 if v_0.Op != OpARMSRLconst { 13360 break 13361 } 13362 c := v_0.AuxInt 13363 y := v_0.Args[0] 13364 x := v.Args[1] 13365 v.reset(OpARMXORshiftRL) 13366 v.AuxInt = c 13367 v.AddArg(x) 13368 v.AddArg(y) 13369 return true 13370 } 13371 // match: (XOR x (SRAconst [c] y)) 13372 // cond: 13373 // result: (XORshiftRA x y [c]) 13374 for { 13375 _ = v.Args[1] 13376 x := v.Args[0] 13377 v_1 := v.Args[1] 13378 if v_1.Op != OpARMSRAconst { 13379 break 13380 } 13381 c := v_1.AuxInt 13382 y := v_1.Args[0] 13383 v.reset(OpARMXORshiftRA) 13384 v.AuxInt = c 13385 v.AddArg(x) 13386 v.AddArg(y) 13387 return true 13388 } 13389 // match: (XOR (SRAconst [c] y) x) 13390 // cond: 13391 // result: (XORshiftRA x y [c]) 13392 for { 13393 _ = v.Args[1] 13394 v_0 := v.Args[0] 13395 if v_0.Op != OpARMSRAconst { 13396 break 13397 } 13398 c := v_0.AuxInt 13399 y := v_0.Args[0] 13400 x := v.Args[1] 13401 v.reset(OpARMXORshiftRA) 13402 v.AuxInt = c 13403 v.AddArg(x) 13404 v.AddArg(y) 13405 return true 13406 } 13407 // match: (XOR x (SRRconst [c] y)) 13408 // cond: 13409 // result: (XORshiftRR x y [c]) 13410 for { 13411 _ = v.Args[1] 13412 x := v.Args[0] 13413 v_1 := v.Args[1] 13414 if v_1.Op != OpARMSRRconst { 13415 break 13416 } 13417 c := v_1.AuxInt 13418 y := v_1.Args[0] 13419 v.reset(OpARMXORshiftRR) 13420 v.AuxInt = c 13421 v.AddArg(x) 13422 v.AddArg(y) 13423 return true 13424 } 13425 // match: (XOR (SRRconst [c] y) x) 13426 // cond: 13427 // result: (XORshiftRR x y [c]) 13428 for { 13429 _ = v.Args[1] 13430 v_0 := v.Args[0] 13431 if v_0.Op != OpARMSRRconst { 13432 break 13433 } 13434 c := v_0.AuxInt 13435 y := v_0.Args[0] 13436 x := v.Args[1] 13437 v.reset(OpARMXORshiftRR) 13438 v.AuxInt = c 13439 v.AddArg(x) 13440 v.AddArg(y) 13441 return true 13442 } 13443 return false 13444 } 13445 func rewriteValueARM_OpARMXOR_10(v *Value) bool { 13446 // match: (XOR x (SLL y z)) 13447 // cond: 13448 // result: (XORshiftLLreg x y z) 13449 for { 13450 _ = v.Args[1] 13451 x := v.Args[0] 13452 v_1 := v.Args[1] 13453 if v_1.Op != OpARMSLL { 13454 break 13455 } 13456 _ = v_1.Args[1] 13457 y := v_1.Args[0] 13458 z := v_1.Args[1] 13459 v.reset(OpARMXORshiftLLreg) 13460 v.AddArg(x) 13461 v.AddArg(y) 13462 v.AddArg(z) 13463 return true 13464 } 13465 // match: (XOR (SLL y z) x) 13466 // cond: 13467 // result: (XORshiftLLreg x y z) 13468 for { 13469 _ = v.Args[1] 13470 v_0 := v.Args[0] 13471 if v_0.Op != OpARMSLL { 13472 break 13473 } 13474 _ = v_0.Args[1] 13475 y := v_0.Args[0] 13476 z := v_0.Args[1] 13477 x := v.Args[1] 13478 v.reset(OpARMXORshiftLLreg) 13479 v.AddArg(x) 13480 v.AddArg(y) 13481 v.AddArg(z) 13482 return true 13483 } 13484 // match: (XOR x (SRL y z)) 13485 // cond: 13486 // result: (XORshiftRLreg x y z) 13487 for { 13488 _ = v.Args[1] 13489 x := v.Args[0] 13490 v_1 := v.Args[1] 13491 if v_1.Op != OpARMSRL { 13492 break 13493 } 13494 _ = v_1.Args[1] 13495 y := v_1.Args[0] 13496 z := v_1.Args[1] 13497 v.reset(OpARMXORshiftRLreg) 13498 v.AddArg(x) 13499 v.AddArg(y) 13500 v.AddArg(z) 13501 return true 13502 } 13503 // match: (XOR (SRL y z) x) 13504 // cond: 13505 // result: (XORshiftRLreg x y z) 13506 for { 13507 _ = v.Args[1] 13508 v_0 := v.Args[0] 13509 if v_0.Op != OpARMSRL { 13510 break 13511 } 13512 _ = v_0.Args[1] 13513 y := v_0.Args[0] 13514 z := v_0.Args[1] 13515 x := v.Args[1] 13516 v.reset(OpARMXORshiftRLreg) 13517 v.AddArg(x) 13518 v.AddArg(y) 13519 v.AddArg(z) 13520 return true 13521 } 13522 // match: (XOR x (SRA y z)) 13523 // cond: 13524 // result: (XORshiftRAreg x y z) 13525 for { 13526 _ = v.Args[1] 13527 x := v.Args[0] 13528 v_1 := v.Args[1] 13529 if v_1.Op != OpARMSRA { 13530 break 13531 } 13532 _ = v_1.Args[1] 13533 y := v_1.Args[0] 13534 z := v_1.Args[1] 13535 v.reset(OpARMXORshiftRAreg) 13536 v.AddArg(x) 13537 v.AddArg(y) 13538 v.AddArg(z) 13539 return true 13540 } 13541 // match: (XOR (SRA y z) x) 13542 // cond: 13543 // result: (XORshiftRAreg x y z) 13544 for { 13545 _ = v.Args[1] 13546 v_0 := v.Args[0] 13547 if v_0.Op != OpARMSRA { 13548 break 13549 } 13550 _ = v_0.Args[1] 13551 y := v_0.Args[0] 13552 z := v_0.Args[1] 13553 x := v.Args[1] 13554 v.reset(OpARMXORshiftRAreg) 13555 v.AddArg(x) 13556 v.AddArg(y) 13557 v.AddArg(z) 13558 return true 13559 } 13560 // match: (XOR x x) 13561 // cond: 13562 // result: (MOVWconst [0]) 13563 for { 13564 _ = v.Args[1] 13565 x := v.Args[0] 13566 if x != v.Args[1] { 13567 break 13568 } 13569 v.reset(OpARMMOVWconst) 13570 v.AuxInt = 0 13571 return true 13572 } 13573 return false 13574 } 13575 func rewriteValueARM_OpARMXORconst_0(v *Value) bool { 13576 // match: (XORconst [0] x) 13577 // cond: 13578 // result: x 13579 for { 13580 if v.AuxInt != 0 { 13581 break 13582 } 13583 x := v.Args[0] 13584 v.reset(OpCopy) 13585 v.Type = x.Type 13586 v.AddArg(x) 13587 return true 13588 } 13589 // match: (XORconst [c] (MOVWconst [d])) 13590 // cond: 13591 // result: (MOVWconst [c^d]) 13592 for { 13593 c := v.AuxInt 13594 v_0 := v.Args[0] 13595 if v_0.Op != OpARMMOVWconst { 13596 break 13597 } 13598 d := v_0.AuxInt 13599 v.reset(OpARMMOVWconst) 13600 v.AuxInt = c ^ d 13601 return true 13602 } 13603 // match: (XORconst [c] (XORconst [d] x)) 13604 // cond: 13605 // result: (XORconst [c^d] x) 13606 for { 13607 c := v.AuxInt 13608 v_0 := v.Args[0] 13609 if v_0.Op != OpARMXORconst { 13610 break 13611 } 13612 d := v_0.AuxInt 13613 x := v_0.Args[0] 13614 v.reset(OpARMXORconst) 13615 v.AuxInt = c ^ d 13616 v.AddArg(x) 13617 return true 13618 } 13619 return false 13620 } 13621 func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { 13622 b := v.Block 13623 _ = b 13624 // match: (XORshiftLL (MOVWconst [c]) x [d]) 13625 // cond: 13626 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 13627 for { 13628 d := v.AuxInt 13629 _ = v.Args[1] 13630 v_0 := v.Args[0] 13631 if v_0.Op != OpARMMOVWconst { 13632 break 13633 } 13634 c := v_0.AuxInt 13635 x := v.Args[1] 13636 v.reset(OpARMXORconst) 13637 v.AuxInt = c 13638 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 13639 v0.AuxInt = d 13640 v0.AddArg(x) 13641 v.AddArg(v0) 13642 return true 13643 } 13644 // match: (XORshiftLL x (MOVWconst [c]) [d]) 13645 // cond: 13646 // result: (XORconst x [int64(uint32(c)<<uint64(d))]) 13647 for { 13648 d := v.AuxInt 13649 _ = v.Args[1] 13650 x := v.Args[0] 13651 v_1 := v.Args[1] 13652 if v_1.Op != OpARMMOVWconst { 13653 break 13654 } 13655 c := v_1.AuxInt 13656 v.reset(OpARMXORconst) 13657 v.AuxInt = int64(uint32(c) << uint64(d)) 13658 v.AddArg(x) 13659 return true 13660 } 13661 // match: (XORshiftLL [c] (SRLconst x [32-c]) x) 13662 // cond: 13663 // result: (SRRconst [32-c] x) 13664 for { 13665 c := v.AuxInt 13666 _ = v.Args[1] 13667 v_0 := v.Args[0] 13668 if v_0.Op != OpARMSRLconst { 13669 break 13670 } 13671 if v_0.AuxInt != 32-c { 13672 break 13673 } 13674 x := v_0.Args[0] 13675 if x != v.Args[1] { 13676 break 13677 } 13678 v.reset(OpARMSRRconst) 13679 v.AuxInt = 32 - c 13680 v.AddArg(x) 13681 return true 13682 } 13683 // match: (XORshiftLL x (SLLconst x [c]) [d]) 13684 // cond: c==d 13685 // result: (MOVWconst [0]) 13686 for { 13687 d := v.AuxInt 13688 _ = v.Args[1] 13689 x := v.Args[0] 13690 v_1 := v.Args[1] 13691 if v_1.Op != OpARMSLLconst { 13692 break 13693 } 13694 c := v_1.AuxInt 13695 if x != v_1.Args[0] { 13696 break 13697 } 13698 if !(c == d) { 13699 break 13700 } 13701 v.reset(OpARMMOVWconst) 13702 v.AuxInt = 0 13703 return true 13704 } 13705 return false 13706 } 13707 func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { 13708 b := v.Block 13709 _ = b 13710 // match: (XORshiftLLreg (MOVWconst [c]) x y) 13711 // cond: 13712 // result: (XORconst [c] (SLL <x.Type> x y)) 13713 for { 13714 _ = v.Args[2] 13715 v_0 := v.Args[0] 13716 if v_0.Op != OpARMMOVWconst { 13717 break 13718 } 13719 c := v_0.AuxInt 13720 x := v.Args[1] 13721 y := v.Args[2] 13722 v.reset(OpARMXORconst) 13723 v.AuxInt = c 13724 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13725 v0.AddArg(x) 13726 v0.AddArg(y) 13727 v.AddArg(v0) 13728 return true 13729 } 13730 // match: (XORshiftLLreg x y (MOVWconst [c])) 13731 // cond: 13732 // result: (XORshiftLL x y [c]) 13733 for { 13734 _ = v.Args[2] 13735 x := v.Args[0] 13736 y := v.Args[1] 13737 v_2 := v.Args[2] 13738 if v_2.Op != OpARMMOVWconst { 13739 break 13740 } 13741 c := v_2.AuxInt 13742 v.reset(OpARMXORshiftLL) 13743 v.AuxInt = c 13744 v.AddArg(x) 13745 v.AddArg(y) 13746 return true 13747 } 13748 return false 13749 } 13750 func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { 13751 b := v.Block 13752 _ = b 13753 // match: (XORshiftRA (MOVWconst [c]) x [d]) 13754 // cond: 13755 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 13756 for { 13757 d := v.AuxInt 13758 _ = v.Args[1] 13759 v_0 := v.Args[0] 13760 if v_0.Op != OpARMMOVWconst { 13761 break 13762 } 13763 c := v_0.AuxInt 13764 x := v.Args[1] 13765 v.reset(OpARMXORconst) 13766 v.AuxInt = c 13767 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13768 v0.AuxInt = d 13769 v0.AddArg(x) 13770 v.AddArg(v0) 13771 return true 13772 } 13773 // match: (XORshiftRA x (MOVWconst [c]) [d]) 13774 // cond: 13775 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 13776 for { 13777 d := v.AuxInt 13778 _ = v.Args[1] 13779 x := v.Args[0] 13780 v_1 := v.Args[1] 13781 if v_1.Op != OpARMMOVWconst { 13782 break 13783 } 13784 c := v_1.AuxInt 13785 v.reset(OpARMXORconst) 13786 v.AuxInt = int64(int32(c) >> uint64(d)) 13787 v.AddArg(x) 13788 return true 13789 } 13790 // match: (XORshiftRA x (SRAconst x [c]) [d]) 13791 // cond: c==d 13792 // result: (MOVWconst [0]) 13793 for { 13794 d := v.AuxInt 13795 _ = v.Args[1] 13796 x := v.Args[0] 13797 v_1 := v.Args[1] 13798 if v_1.Op != OpARMSRAconst { 13799 break 13800 } 13801 c := v_1.AuxInt 13802 if x != v_1.Args[0] { 13803 break 13804 } 13805 if !(c == d) { 13806 break 13807 } 13808 v.reset(OpARMMOVWconst) 13809 v.AuxInt = 0 13810 return true 13811 } 13812 return false 13813 } 13814 func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { 13815 b := v.Block 13816 _ = b 13817 // match: (XORshiftRAreg (MOVWconst [c]) x y) 13818 // cond: 13819 // result: (XORconst [c] (SRA <x.Type> x y)) 13820 for { 13821 _ = v.Args[2] 13822 v_0 := v.Args[0] 13823 if v_0.Op != OpARMMOVWconst { 13824 break 13825 } 13826 c := v_0.AuxInt 13827 x := v.Args[1] 13828 y := v.Args[2] 13829 v.reset(OpARMXORconst) 13830 v.AuxInt = c 13831 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13832 v0.AddArg(x) 13833 v0.AddArg(y) 13834 v.AddArg(v0) 13835 return true 13836 } 13837 // match: (XORshiftRAreg x y (MOVWconst [c])) 13838 // cond: 13839 // result: (XORshiftRA x y [c]) 13840 for { 13841 _ = v.Args[2] 13842 x := v.Args[0] 13843 y := v.Args[1] 13844 v_2 := v.Args[2] 13845 if v_2.Op != OpARMMOVWconst { 13846 break 13847 } 13848 c := v_2.AuxInt 13849 v.reset(OpARMXORshiftRA) 13850 v.AuxInt = c 13851 v.AddArg(x) 13852 v.AddArg(y) 13853 return true 13854 } 13855 return false 13856 } 13857 func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { 13858 b := v.Block 13859 _ = b 13860 // match: (XORshiftRL (MOVWconst [c]) x [d]) 13861 // cond: 13862 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 13863 for { 13864 d := v.AuxInt 13865 _ = v.Args[1] 13866 v_0 := v.Args[0] 13867 if v_0.Op != OpARMMOVWconst { 13868 break 13869 } 13870 c := v_0.AuxInt 13871 x := v.Args[1] 13872 v.reset(OpARMXORconst) 13873 v.AuxInt = c 13874 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13875 v0.AuxInt = d 13876 v0.AddArg(x) 13877 v.AddArg(v0) 13878 return true 13879 } 13880 // match: (XORshiftRL x (MOVWconst [c]) [d]) 13881 // cond: 13882 // result: (XORconst x [int64(uint32(c)>>uint64(d))]) 13883 for { 13884 d := v.AuxInt 13885 _ = v.Args[1] 13886 x := v.Args[0] 13887 v_1 := v.Args[1] 13888 if v_1.Op != OpARMMOVWconst { 13889 break 13890 } 13891 c := v_1.AuxInt 13892 v.reset(OpARMXORconst) 13893 v.AuxInt = int64(uint32(c) >> uint64(d)) 13894 v.AddArg(x) 13895 return true 13896 } 13897 // match: (XORshiftRL [c] (SLLconst x [32-c]) x) 13898 // cond: 13899 // result: (SRRconst [ c] x) 13900 for { 13901 c := v.AuxInt 13902 _ = v.Args[1] 13903 v_0 := v.Args[0] 13904 if v_0.Op != OpARMSLLconst { 13905 break 13906 } 13907 if v_0.AuxInt != 32-c { 13908 break 13909 } 13910 x := v_0.Args[0] 13911 if x != v.Args[1] { 13912 break 13913 } 13914 v.reset(OpARMSRRconst) 13915 v.AuxInt = c 13916 v.AddArg(x) 13917 return true 13918 } 13919 // match: (XORshiftRL x (SRLconst x [c]) [d]) 13920 // cond: c==d 13921 // result: (MOVWconst [0]) 13922 for { 13923 d := v.AuxInt 13924 _ = v.Args[1] 13925 x := v.Args[0] 13926 v_1 := v.Args[1] 13927 if v_1.Op != OpARMSRLconst { 13928 break 13929 } 13930 c := v_1.AuxInt 13931 if x != v_1.Args[0] { 13932 break 13933 } 13934 if !(c == d) { 13935 break 13936 } 13937 v.reset(OpARMMOVWconst) 13938 v.AuxInt = 0 13939 return true 13940 } 13941 return false 13942 } 13943 func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { 13944 b := v.Block 13945 _ = b 13946 // match: (XORshiftRLreg (MOVWconst [c]) x y) 13947 // cond: 13948 // result: (XORconst [c] (SRL <x.Type> x y)) 13949 for { 13950 _ = v.Args[2] 13951 v_0 := v.Args[0] 13952 if v_0.Op != OpARMMOVWconst { 13953 break 13954 } 13955 c := v_0.AuxInt 13956 x := v.Args[1] 13957 y := v.Args[2] 13958 v.reset(OpARMXORconst) 13959 v.AuxInt = c 13960 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13961 v0.AddArg(x) 13962 v0.AddArg(y) 13963 v.AddArg(v0) 13964 return true 13965 } 13966 // match: (XORshiftRLreg x y (MOVWconst [c])) 13967 // cond: 13968 // result: (XORshiftRL x y [c]) 13969 for { 13970 _ = v.Args[2] 13971 x := v.Args[0] 13972 y := v.Args[1] 13973 v_2 := v.Args[2] 13974 if v_2.Op != OpARMMOVWconst { 13975 break 13976 } 13977 c := v_2.AuxInt 13978 v.reset(OpARMXORshiftRL) 13979 v.AuxInt = c 13980 v.AddArg(x) 13981 v.AddArg(y) 13982 return true 13983 } 13984 return false 13985 } 13986 func rewriteValueARM_OpARMXORshiftRR_0(v *Value) bool { 13987 b := v.Block 13988 _ = b 13989 // match: (XORshiftRR (MOVWconst [c]) x [d]) 13990 // cond: 13991 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 13992 for { 13993 d := v.AuxInt 13994 _ = v.Args[1] 13995 v_0 := v.Args[0] 13996 if v_0.Op != OpARMMOVWconst { 13997 break 13998 } 13999 c := v_0.AuxInt 14000 x := v.Args[1] 14001 v.reset(OpARMXORconst) 14002 v.AuxInt = c 14003 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 14004 v0.AuxInt = d 14005 v0.AddArg(x) 14006 v.AddArg(v0) 14007 return true 14008 } 14009 // match: (XORshiftRR x (MOVWconst [c]) [d]) 14010 // cond: 14011 // result: (XORconst x [int64(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d))]) 14012 for { 14013 d := v.AuxInt 14014 _ = v.Args[1] 14015 x := v.Args[0] 14016 v_1 := v.Args[1] 14017 if v_1.Op != OpARMMOVWconst { 14018 break 14019 } 14020 c := v_1.AuxInt 14021 v.reset(OpARMXORconst) 14022 v.AuxInt = int64(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d)) 14023 v.AddArg(x) 14024 return true 14025 } 14026 return false 14027 } 14028 func rewriteValueARM_OpAdd16_0(v *Value) bool { 14029 // match: (Add16 x y) 14030 // cond: 14031 // result: (ADD x y) 14032 for { 14033 _ = v.Args[1] 14034 x := v.Args[0] 14035 y := v.Args[1] 14036 v.reset(OpARMADD) 14037 v.AddArg(x) 14038 v.AddArg(y) 14039 return true 14040 } 14041 } 14042 func rewriteValueARM_OpAdd32_0(v *Value) bool { 14043 // match: (Add32 x y) 14044 // cond: 14045 // result: (ADD x y) 14046 for { 14047 _ = v.Args[1] 14048 x := v.Args[0] 14049 y := v.Args[1] 14050 v.reset(OpARMADD) 14051 v.AddArg(x) 14052 v.AddArg(y) 14053 return true 14054 } 14055 } 14056 func rewriteValueARM_OpAdd32F_0(v *Value) bool { 14057 // match: (Add32F x y) 14058 // cond: 14059 // result: (ADDF x y) 14060 for { 14061 _ = v.Args[1] 14062 x := v.Args[0] 14063 y := v.Args[1] 14064 v.reset(OpARMADDF) 14065 v.AddArg(x) 14066 v.AddArg(y) 14067 return true 14068 } 14069 } 14070 func rewriteValueARM_OpAdd32carry_0(v *Value) bool { 14071 // match: (Add32carry x y) 14072 // cond: 14073 // result: (ADDS x y) 14074 for { 14075 _ = v.Args[1] 14076 x := v.Args[0] 14077 y := v.Args[1] 14078 v.reset(OpARMADDS) 14079 v.AddArg(x) 14080 v.AddArg(y) 14081 return true 14082 } 14083 } 14084 func rewriteValueARM_OpAdd32withcarry_0(v *Value) bool { 14085 // match: (Add32withcarry x y c) 14086 // cond: 14087 // result: (ADC x y c) 14088 for { 14089 _ = v.Args[2] 14090 x := v.Args[0] 14091 y := v.Args[1] 14092 c := v.Args[2] 14093 v.reset(OpARMADC) 14094 v.AddArg(x) 14095 v.AddArg(y) 14096 v.AddArg(c) 14097 return true 14098 } 14099 } 14100 func rewriteValueARM_OpAdd64F_0(v *Value) bool { 14101 // match: (Add64F x y) 14102 // cond: 14103 // result: (ADDD x y) 14104 for { 14105 _ = v.Args[1] 14106 x := v.Args[0] 14107 y := v.Args[1] 14108 v.reset(OpARMADDD) 14109 v.AddArg(x) 14110 v.AddArg(y) 14111 return true 14112 } 14113 } 14114 func rewriteValueARM_OpAdd8_0(v *Value) bool { 14115 // match: (Add8 x y) 14116 // cond: 14117 // result: (ADD x y) 14118 for { 14119 _ = v.Args[1] 14120 x := v.Args[0] 14121 y := v.Args[1] 14122 v.reset(OpARMADD) 14123 v.AddArg(x) 14124 v.AddArg(y) 14125 return true 14126 } 14127 } 14128 func rewriteValueARM_OpAddPtr_0(v *Value) bool { 14129 // match: (AddPtr x y) 14130 // cond: 14131 // result: (ADD x y) 14132 for { 14133 _ = v.Args[1] 14134 x := v.Args[0] 14135 y := v.Args[1] 14136 v.reset(OpARMADD) 14137 v.AddArg(x) 14138 v.AddArg(y) 14139 return true 14140 } 14141 } 14142 func rewriteValueARM_OpAddr_0(v *Value) bool { 14143 // match: (Addr {sym} base) 14144 // cond: 14145 // result: (MOVWaddr {sym} base) 14146 for { 14147 sym := v.Aux 14148 base := v.Args[0] 14149 v.reset(OpARMMOVWaddr) 14150 v.Aux = sym 14151 v.AddArg(base) 14152 return true 14153 } 14154 } 14155 func rewriteValueARM_OpAnd16_0(v *Value) bool { 14156 // match: (And16 x y) 14157 // cond: 14158 // result: (AND x y) 14159 for { 14160 _ = v.Args[1] 14161 x := v.Args[0] 14162 y := v.Args[1] 14163 v.reset(OpARMAND) 14164 v.AddArg(x) 14165 v.AddArg(y) 14166 return true 14167 } 14168 } 14169 func rewriteValueARM_OpAnd32_0(v *Value) bool { 14170 // match: (And32 x y) 14171 // cond: 14172 // result: (AND x y) 14173 for { 14174 _ = v.Args[1] 14175 x := v.Args[0] 14176 y := v.Args[1] 14177 v.reset(OpARMAND) 14178 v.AddArg(x) 14179 v.AddArg(y) 14180 return true 14181 } 14182 } 14183 func rewriteValueARM_OpAnd8_0(v *Value) bool { 14184 // match: (And8 x y) 14185 // cond: 14186 // result: (AND x y) 14187 for { 14188 _ = v.Args[1] 14189 x := v.Args[0] 14190 y := v.Args[1] 14191 v.reset(OpARMAND) 14192 v.AddArg(x) 14193 v.AddArg(y) 14194 return true 14195 } 14196 } 14197 func rewriteValueARM_OpAndB_0(v *Value) bool { 14198 // match: (AndB x y) 14199 // cond: 14200 // result: (AND x y) 14201 for { 14202 _ = v.Args[1] 14203 x := v.Args[0] 14204 y := v.Args[1] 14205 v.reset(OpARMAND) 14206 v.AddArg(x) 14207 v.AddArg(y) 14208 return true 14209 } 14210 } 14211 func rewriteValueARM_OpAvg32u_0(v *Value) bool { 14212 b := v.Block 14213 _ = b 14214 // match: (Avg32u <t> x y) 14215 // cond: 14216 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 14217 for { 14218 t := v.Type 14219 _ = v.Args[1] 14220 x := v.Args[0] 14221 y := v.Args[1] 14222 v.reset(OpARMADD) 14223 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 14224 v0.AuxInt = 1 14225 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 14226 v1.AddArg(x) 14227 v1.AddArg(y) 14228 v0.AddArg(v1) 14229 v.AddArg(v0) 14230 v.AddArg(y) 14231 return true 14232 } 14233 } 14234 func rewriteValueARM_OpBitLen32_0(v *Value) bool { 14235 b := v.Block 14236 _ = b 14237 // match: (BitLen32 <t> x) 14238 // cond: 14239 // result: (RSBconst [32] (CLZ <t> x)) 14240 for { 14241 t := v.Type 14242 x := v.Args[0] 14243 v.reset(OpARMRSBconst) 14244 v.AuxInt = 32 14245 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 14246 v0.AddArg(x) 14247 v.AddArg(v0) 14248 return true 14249 } 14250 } 14251 func rewriteValueARM_OpBswap32_0(v *Value) bool { 14252 b := v.Block 14253 _ = b 14254 // match: (Bswap32 <t> x) 14255 // cond: objabi.GOARM==5 14256 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 14257 for { 14258 t := v.Type 14259 x := v.Args[0] 14260 if !(objabi.GOARM == 5) { 14261 break 14262 } 14263 v.reset(OpARMXOR) 14264 v.Type = t 14265 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 14266 v0.AuxInt = 8 14267 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 14268 v1.AuxInt = 0xff0000 14269 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 14270 v2.AddArg(x) 14271 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 14272 v3.AuxInt = 16 14273 v3.AddArg(x) 14274 v2.AddArg(v3) 14275 v1.AddArg(v2) 14276 v0.AddArg(v1) 14277 v.AddArg(v0) 14278 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 14279 v4.AuxInt = 8 14280 v4.AddArg(x) 14281 v.AddArg(v4) 14282 return true 14283 } 14284 // match: (Bswap32 x) 14285 // cond: objabi.GOARM>=6 14286 // result: (REV x) 14287 for { 14288 x := v.Args[0] 14289 if !(objabi.GOARM >= 6) { 14290 break 14291 } 14292 v.reset(OpARMREV) 14293 v.AddArg(x) 14294 return true 14295 } 14296 return false 14297 } 14298 func rewriteValueARM_OpClosureCall_0(v *Value) bool { 14299 // match: (ClosureCall [argwid] entry closure mem) 14300 // cond: 14301 // result: (CALLclosure [argwid] entry closure mem) 14302 for { 14303 argwid := v.AuxInt 14304 _ = v.Args[2] 14305 entry := v.Args[0] 14306 closure := v.Args[1] 14307 mem := v.Args[2] 14308 v.reset(OpARMCALLclosure) 14309 v.AuxInt = argwid 14310 v.AddArg(entry) 14311 v.AddArg(closure) 14312 v.AddArg(mem) 14313 return true 14314 } 14315 } 14316 func rewriteValueARM_OpCom16_0(v *Value) bool { 14317 // match: (Com16 x) 14318 // cond: 14319 // result: (MVN x) 14320 for { 14321 x := v.Args[0] 14322 v.reset(OpARMMVN) 14323 v.AddArg(x) 14324 return true 14325 } 14326 } 14327 func rewriteValueARM_OpCom32_0(v *Value) bool { 14328 // match: (Com32 x) 14329 // cond: 14330 // result: (MVN x) 14331 for { 14332 x := v.Args[0] 14333 v.reset(OpARMMVN) 14334 v.AddArg(x) 14335 return true 14336 } 14337 } 14338 func rewriteValueARM_OpCom8_0(v *Value) bool { 14339 // match: (Com8 x) 14340 // cond: 14341 // result: (MVN x) 14342 for { 14343 x := v.Args[0] 14344 v.reset(OpARMMVN) 14345 v.AddArg(x) 14346 return true 14347 } 14348 } 14349 func rewriteValueARM_OpConst16_0(v *Value) bool { 14350 // match: (Const16 [val]) 14351 // cond: 14352 // result: (MOVWconst [val]) 14353 for { 14354 val := v.AuxInt 14355 v.reset(OpARMMOVWconst) 14356 v.AuxInt = val 14357 return true 14358 } 14359 } 14360 func rewriteValueARM_OpConst32_0(v *Value) bool { 14361 // match: (Const32 [val]) 14362 // cond: 14363 // result: (MOVWconst [val]) 14364 for { 14365 val := v.AuxInt 14366 v.reset(OpARMMOVWconst) 14367 v.AuxInt = val 14368 return true 14369 } 14370 } 14371 func rewriteValueARM_OpConst32F_0(v *Value) bool { 14372 // match: (Const32F [val]) 14373 // cond: 14374 // result: (MOVFconst [val]) 14375 for { 14376 val := v.AuxInt 14377 v.reset(OpARMMOVFconst) 14378 v.AuxInt = val 14379 return true 14380 } 14381 } 14382 func rewriteValueARM_OpConst64F_0(v *Value) bool { 14383 // match: (Const64F [val]) 14384 // cond: 14385 // result: (MOVDconst [val]) 14386 for { 14387 val := v.AuxInt 14388 v.reset(OpARMMOVDconst) 14389 v.AuxInt = val 14390 return true 14391 } 14392 } 14393 func rewriteValueARM_OpConst8_0(v *Value) bool { 14394 // match: (Const8 [val]) 14395 // cond: 14396 // result: (MOVWconst [val]) 14397 for { 14398 val := v.AuxInt 14399 v.reset(OpARMMOVWconst) 14400 v.AuxInt = val 14401 return true 14402 } 14403 } 14404 func rewriteValueARM_OpConstBool_0(v *Value) bool { 14405 // match: (ConstBool [b]) 14406 // cond: 14407 // result: (MOVWconst [b]) 14408 for { 14409 b := v.AuxInt 14410 v.reset(OpARMMOVWconst) 14411 v.AuxInt = b 14412 return true 14413 } 14414 } 14415 func rewriteValueARM_OpConstNil_0(v *Value) bool { 14416 // match: (ConstNil) 14417 // cond: 14418 // result: (MOVWconst [0]) 14419 for { 14420 v.reset(OpARMMOVWconst) 14421 v.AuxInt = 0 14422 return true 14423 } 14424 } 14425 func rewriteValueARM_OpConvert_0(v *Value) bool { 14426 // match: (Convert x mem) 14427 // cond: 14428 // result: (MOVWconvert x mem) 14429 for { 14430 _ = v.Args[1] 14431 x := v.Args[0] 14432 mem := v.Args[1] 14433 v.reset(OpARMMOVWconvert) 14434 v.AddArg(x) 14435 v.AddArg(mem) 14436 return true 14437 } 14438 } 14439 func rewriteValueARM_OpCtz32_0(v *Value) bool { 14440 b := v.Block 14441 _ = b 14442 // match: (Ctz32 <t> x) 14443 // cond: objabi.GOARM<=6 14444 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 14445 for { 14446 t := v.Type 14447 x := v.Args[0] 14448 if !(objabi.GOARM <= 6) { 14449 break 14450 } 14451 v.reset(OpARMRSBconst) 14452 v.AuxInt = 32 14453 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 14454 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 14455 v1.AuxInt = 1 14456 v2 := b.NewValue0(v.Pos, OpARMAND, t) 14457 v2.AddArg(x) 14458 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 14459 v3.AuxInt = 0 14460 v3.AddArg(x) 14461 v2.AddArg(v3) 14462 v1.AddArg(v2) 14463 v0.AddArg(v1) 14464 v.AddArg(v0) 14465 return true 14466 } 14467 // match: (Ctz32 <t> x) 14468 // cond: objabi.GOARM==7 14469 // result: (CLZ <t> (RBIT <t> x)) 14470 for { 14471 t := v.Type 14472 x := v.Args[0] 14473 if !(objabi.GOARM == 7) { 14474 break 14475 } 14476 v.reset(OpARMCLZ) 14477 v.Type = t 14478 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 14479 v0.AddArg(x) 14480 v.AddArg(v0) 14481 return true 14482 } 14483 return false 14484 } 14485 func rewriteValueARM_OpCvt32Fto32_0(v *Value) bool { 14486 // match: (Cvt32Fto32 x) 14487 // cond: 14488 // result: (MOVFW x) 14489 for { 14490 x := v.Args[0] 14491 v.reset(OpARMMOVFW) 14492 v.AddArg(x) 14493 return true 14494 } 14495 } 14496 func rewriteValueARM_OpCvt32Fto32U_0(v *Value) bool { 14497 // match: (Cvt32Fto32U x) 14498 // cond: 14499 // result: (MOVFWU x) 14500 for { 14501 x := v.Args[0] 14502 v.reset(OpARMMOVFWU) 14503 v.AddArg(x) 14504 return true 14505 } 14506 } 14507 func rewriteValueARM_OpCvt32Fto64F_0(v *Value) bool { 14508 // match: (Cvt32Fto64F x) 14509 // cond: 14510 // result: (MOVFD x) 14511 for { 14512 x := v.Args[0] 14513 v.reset(OpARMMOVFD) 14514 v.AddArg(x) 14515 return true 14516 } 14517 } 14518 func rewriteValueARM_OpCvt32Uto32F_0(v *Value) bool { 14519 // match: (Cvt32Uto32F x) 14520 // cond: 14521 // result: (MOVWUF x) 14522 for { 14523 x := v.Args[0] 14524 v.reset(OpARMMOVWUF) 14525 v.AddArg(x) 14526 return true 14527 } 14528 } 14529 func rewriteValueARM_OpCvt32Uto64F_0(v *Value) bool { 14530 // match: (Cvt32Uto64F x) 14531 // cond: 14532 // result: (MOVWUD x) 14533 for { 14534 x := v.Args[0] 14535 v.reset(OpARMMOVWUD) 14536 v.AddArg(x) 14537 return true 14538 } 14539 } 14540 func rewriteValueARM_OpCvt32to32F_0(v *Value) bool { 14541 // match: (Cvt32to32F x) 14542 // cond: 14543 // result: (MOVWF x) 14544 for { 14545 x := v.Args[0] 14546 v.reset(OpARMMOVWF) 14547 v.AddArg(x) 14548 return true 14549 } 14550 } 14551 func rewriteValueARM_OpCvt32to64F_0(v *Value) bool { 14552 // match: (Cvt32to64F x) 14553 // cond: 14554 // result: (MOVWD x) 14555 for { 14556 x := v.Args[0] 14557 v.reset(OpARMMOVWD) 14558 v.AddArg(x) 14559 return true 14560 } 14561 } 14562 func rewriteValueARM_OpCvt64Fto32_0(v *Value) bool { 14563 // match: (Cvt64Fto32 x) 14564 // cond: 14565 // result: (MOVDW x) 14566 for { 14567 x := v.Args[0] 14568 v.reset(OpARMMOVDW) 14569 v.AddArg(x) 14570 return true 14571 } 14572 } 14573 func rewriteValueARM_OpCvt64Fto32F_0(v *Value) bool { 14574 // match: (Cvt64Fto32F x) 14575 // cond: 14576 // result: (MOVDF x) 14577 for { 14578 x := v.Args[0] 14579 v.reset(OpARMMOVDF) 14580 v.AddArg(x) 14581 return true 14582 } 14583 } 14584 func rewriteValueARM_OpCvt64Fto32U_0(v *Value) bool { 14585 // match: (Cvt64Fto32U x) 14586 // cond: 14587 // result: (MOVDWU x) 14588 for { 14589 x := v.Args[0] 14590 v.reset(OpARMMOVDWU) 14591 v.AddArg(x) 14592 return true 14593 } 14594 } 14595 func rewriteValueARM_OpDiv16_0(v *Value) bool { 14596 b := v.Block 14597 _ = b 14598 typ := &b.Func.Config.Types 14599 _ = typ 14600 // match: (Div16 x y) 14601 // cond: 14602 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 14603 for { 14604 _ = v.Args[1] 14605 x := v.Args[0] 14606 y := v.Args[1] 14607 v.reset(OpDiv32) 14608 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 14609 v0.AddArg(x) 14610 v.AddArg(v0) 14611 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 14612 v1.AddArg(y) 14613 v.AddArg(v1) 14614 return true 14615 } 14616 } 14617 func rewriteValueARM_OpDiv16u_0(v *Value) bool { 14618 b := v.Block 14619 _ = b 14620 typ := &b.Func.Config.Types 14621 _ = typ 14622 // match: (Div16u x y) 14623 // cond: 14624 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 14625 for { 14626 _ = v.Args[1] 14627 x := v.Args[0] 14628 y := v.Args[1] 14629 v.reset(OpDiv32u) 14630 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14631 v0.AddArg(x) 14632 v.AddArg(v0) 14633 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14634 v1.AddArg(y) 14635 v.AddArg(v1) 14636 return true 14637 } 14638 } 14639 func rewriteValueARM_OpDiv32_0(v *Value) bool { 14640 b := v.Block 14641 _ = b 14642 typ := &b.Func.Config.Types 14643 _ = typ 14644 // match: (Div32 x y) 14645 // cond: 14646 // 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))) 14647 for { 14648 _ = v.Args[1] 14649 x := v.Args[0] 14650 y := v.Args[1] 14651 v.reset(OpARMSUB) 14652 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14653 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 14654 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 14655 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 14656 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14657 v4.AddArg(x) 14658 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14659 v5.AddArg(x) 14660 v4.AddArg(v5) 14661 v3.AddArg(v4) 14662 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14663 v6.AddArg(x) 14664 v3.AddArg(v6) 14665 v2.AddArg(v3) 14666 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 14667 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14668 v8.AddArg(y) 14669 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14670 v9.AddArg(y) 14671 v8.AddArg(v9) 14672 v7.AddArg(v8) 14673 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14674 v10.AddArg(y) 14675 v7.AddArg(v10) 14676 v2.AddArg(v7) 14677 v1.AddArg(v2) 14678 v0.AddArg(v1) 14679 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14680 v12 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14681 v12.AddArg(x) 14682 v12.AddArg(y) 14683 v11.AddArg(v12) 14684 v0.AddArg(v11) 14685 v.AddArg(v0) 14686 v13 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 14687 v14 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 14688 v14.AddArg(x) 14689 v14.AddArg(y) 14690 v13.AddArg(v14) 14691 v.AddArg(v13) 14692 return true 14693 } 14694 } 14695 func rewriteValueARM_OpDiv32F_0(v *Value) bool { 14696 // match: (Div32F x y) 14697 // cond: 14698 // result: (DIVF x y) 14699 for { 14700 _ = v.Args[1] 14701 x := v.Args[0] 14702 y := v.Args[1] 14703 v.reset(OpARMDIVF) 14704 v.AddArg(x) 14705 v.AddArg(y) 14706 return true 14707 } 14708 } 14709 func rewriteValueARM_OpDiv32u_0(v *Value) bool { 14710 b := v.Block 14711 _ = b 14712 typ := &b.Func.Config.Types 14713 _ = typ 14714 // match: (Div32u x y) 14715 // cond: 14716 // result: (Select0 <typ.UInt32> (CALLudiv x y)) 14717 for { 14718 _ = v.Args[1] 14719 x := v.Args[0] 14720 y := v.Args[1] 14721 v.reset(OpSelect0) 14722 v.Type = typ.UInt32 14723 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 14724 v0.AddArg(x) 14725 v0.AddArg(y) 14726 v.AddArg(v0) 14727 return true 14728 } 14729 } 14730 func rewriteValueARM_OpDiv64F_0(v *Value) bool { 14731 // match: (Div64F x y) 14732 // cond: 14733 // result: (DIVD x y) 14734 for { 14735 _ = v.Args[1] 14736 x := v.Args[0] 14737 y := v.Args[1] 14738 v.reset(OpARMDIVD) 14739 v.AddArg(x) 14740 v.AddArg(y) 14741 return true 14742 } 14743 } 14744 func rewriteValueARM_OpDiv8_0(v *Value) bool { 14745 b := v.Block 14746 _ = b 14747 typ := &b.Func.Config.Types 14748 _ = typ 14749 // match: (Div8 x y) 14750 // cond: 14751 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 14752 for { 14753 _ = v.Args[1] 14754 x := v.Args[0] 14755 y := v.Args[1] 14756 v.reset(OpDiv32) 14757 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 14758 v0.AddArg(x) 14759 v.AddArg(v0) 14760 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 14761 v1.AddArg(y) 14762 v.AddArg(v1) 14763 return true 14764 } 14765 } 14766 func rewriteValueARM_OpDiv8u_0(v *Value) bool { 14767 b := v.Block 14768 _ = b 14769 typ := &b.Func.Config.Types 14770 _ = typ 14771 // match: (Div8u x y) 14772 // cond: 14773 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 14774 for { 14775 _ = v.Args[1] 14776 x := v.Args[0] 14777 y := v.Args[1] 14778 v.reset(OpDiv32u) 14779 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14780 v0.AddArg(x) 14781 v.AddArg(v0) 14782 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14783 v1.AddArg(y) 14784 v.AddArg(v1) 14785 return true 14786 } 14787 } 14788 func rewriteValueARM_OpEq16_0(v *Value) bool { 14789 b := v.Block 14790 _ = b 14791 typ := &b.Func.Config.Types 14792 _ = typ 14793 // match: (Eq16 x y) 14794 // cond: 14795 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14796 for { 14797 _ = v.Args[1] 14798 x := v.Args[0] 14799 y := v.Args[1] 14800 v.reset(OpARMEqual) 14801 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14802 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14803 v1.AddArg(x) 14804 v0.AddArg(v1) 14805 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14806 v2.AddArg(y) 14807 v0.AddArg(v2) 14808 v.AddArg(v0) 14809 return true 14810 } 14811 } 14812 func rewriteValueARM_OpEq32_0(v *Value) bool { 14813 b := v.Block 14814 _ = b 14815 // match: (Eq32 x y) 14816 // cond: 14817 // result: (Equal (CMP x y)) 14818 for { 14819 _ = v.Args[1] 14820 x := v.Args[0] 14821 y := v.Args[1] 14822 v.reset(OpARMEqual) 14823 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14824 v0.AddArg(x) 14825 v0.AddArg(y) 14826 v.AddArg(v0) 14827 return true 14828 } 14829 } 14830 func rewriteValueARM_OpEq32F_0(v *Value) bool { 14831 b := v.Block 14832 _ = b 14833 // match: (Eq32F x y) 14834 // cond: 14835 // result: (Equal (CMPF x y)) 14836 for { 14837 _ = v.Args[1] 14838 x := v.Args[0] 14839 y := v.Args[1] 14840 v.reset(OpARMEqual) 14841 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 14842 v0.AddArg(x) 14843 v0.AddArg(y) 14844 v.AddArg(v0) 14845 return true 14846 } 14847 } 14848 func rewriteValueARM_OpEq64F_0(v *Value) bool { 14849 b := v.Block 14850 _ = b 14851 // match: (Eq64F x y) 14852 // cond: 14853 // result: (Equal (CMPD x y)) 14854 for { 14855 _ = v.Args[1] 14856 x := v.Args[0] 14857 y := v.Args[1] 14858 v.reset(OpARMEqual) 14859 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 14860 v0.AddArg(x) 14861 v0.AddArg(y) 14862 v.AddArg(v0) 14863 return true 14864 } 14865 } 14866 func rewriteValueARM_OpEq8_0(v *Value) bool { 14867 b := v.Block 14868 _ = b 14869 typ := &b.Func.Config.Types 14870 _ = typ 14871 // match: (Eq8 x y) 14872 // cond: 14873 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 14874 for { 14875 _ = v.Args[1] 14876 x := v.Args[0] 14877 y := v.Args[1] 14878 v.reset(OpARMEqual) 14879 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14880 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14881 v1.AddArg(x) 14882 v0.AddArg(v1) 14883 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 14884 v2.AddArg(y) 14885 v0.AddArg(v2) 14886 v.AddArg(v0) 14887 return true 14888 } 14889 } 14890 func rewriteValueARM_OpEqB_0(v *Value) bool { 14891 b := v.Block 14892 _ = b 14893 typ := &b.Func.Config.Types 14894 _ = typ 14895 // match: (EqB x y) 14896 // cond: 14897 // result: (XORconst [1] (XOR <typ.Bool> x y)) 14898 for { 14899 _ = v.Args[1] 14900 x := v.Args[0] 14901 y := v.Args[1] 14902 v.reset(OpARMXORconst) 14903 v.AuxInt = 1 14904 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool) 14905 v0.AddArg(x) 14906 v0.AddArg(y) 14907 v.AddArg(v0) 14908 return true 14909 } 14910 } 14911 func rewriteValueARM_OpEqPtr_0(v *Value) bool { 14912 b := v.Block 14913 _ = b 14914 // match: (EqPtr x y) 14915 // cond: 14916 // result: (Equal (CMP x y)) 14917 for { 14918 _ = v.Args[1] 14919 x := v.Args[0] 14920 y := v.Args[1] 14921 v.reset(OpARMEqual) 14922 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14923 v0.AddArg(x) 14924 v0.AddArg(y) 14925 v.AddArg(v0) 14926 return true 14927 } 14928 } 14929 func rewriteValueARM_OpGeq16_0(v *Value) bool { 14930 b := v.Block 14931 _ = b 14932 typ := &b.Func.Config.Types 14933 _ = typ 14934 // match: (Geq16 x y) 14935 // cond: 14936 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 14937 for { 14938 _ = v.Args[1] 14939 x := v.Args[0] 14940 y := v.Args[1] 14941 v.reset(OpARMGreaterEqual) 14942 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14943 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 14944 v1.AddArg(x) 14945 v0.AddArg(v1) 14946 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 14947 v2.AddArg(y) 14948 v0.AddArg(v2) 14949 v.AddArg(v0) 14950 return true 14951 } 14952 } 14953 func rewriteValueARM_OpGeq16U_0(v *Value) bool { 14954 b := v.Block 14955 _ = b 14956 typ := &b.Func.Config.Types 14957 _ = typ 14958 // match: (Geq16U x y) 14959 // cond: 14960 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 14961 for { 14962 _ = v.Args[1] 14963 x := v.Args[0] 14964 y := v.Args[1] 14965 v.reset(OpARMGreaterEqualU) 14966 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14967 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14968 v1.AddArg(x) 14969 v0.AddArg(v1) 14970 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 14971 v2.AddArg(y) 14972 v0.AddArg(v2) 14973 v.AddArg(v0) 14974 return true 14975 } 14976 } 14977 func rewriteValueARM_OpGeq32_0(v *Value) bool { 14978 b := v.Block 14979 _ = b 14980 // match: (Geq32 x y) 14981 // cond: 14982 // result: (GreaterEqual (CMP x y)) 14983 for { 14984 _ = v.Args[1] 14985 x := v.Args[0] 14986 y := v.Args[1] 14987 v.reset(OpARMGreaterEqual) 14988 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 14989 v0.AddArg(x) 14990 v0.AddArg(y) 14991 v.AddArg(v0) 14992 return true 14993 } 14994 } 14995 func rewriteValueARM_OpGeq32F_0(v *Value) bool { 14996 b := v.Block 14997 _ = b 14998 // match: (Geq32F x y) 14999 // cond: 15000 // result: (GreaterEqual (CMPF x y)) 15001 for { 15002 _ = v.Args[1] 15003 x := v.Args[0] 15004 y := v.Args[1] 15005 v.reset(OpARMGreaterEqual) 15006 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 15007 v0.AddArg(x) 15008 v0.AddArg(y) 15009 v.AddArg(v0) 15010 return true 15011 } 15012 } 15013 func rewriteValueARM_OpGeq32U_0(v *Value) bool { 15014 b := v.Block 15015 _ = b 15016 // match: (Geq32U x y) 15017 // cond: 15018 // result: (GreaterEqualU (CMP x y)) 15019 for { 15020 _ = v.Args[1] 15021 x := v.Args[0] 15022 y := v.Args[1] 15023 v.reset(OpARMGreaterEqualU) 15024 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15025 v0.AddArg(x) 15026 v0.AddArg(y) 15027 v.AddArg(v0) 15028 return true 15029 } 15030 } 15031 func rewriteValueARM_OpGeq64F_0(v *Value) bool { 15032 b := v.Block 15033 _ = b 15034 // match: (Geq64F x y) 15035 // cond: 15036 // result: (GreaterEqual (CMPD x y)) 15037 for { 15038 _ = v.Args[1] 15039 x := v.Args[0] 15040 y := v.Args[1] 15041 v.reset(OpARMGreaterEqual) 15042 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 15043 v0.AddArg(x) 15044 v0.AddArg(y) 15045 v.AddArg(v0) 15046 return true 15047 } 15048 } 15049 func rewriteValueARM_OpGeq8_0(v *Value) bool { 15050 b := v.Block 15051 _ = b 15052 typ := &b.Func.Config.Types 15053 _ = typ 15054 // match: (Geq8 x y) 15055 // cond: 15056 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 15057 for { 15058 _ = v.Args[1] 15059 x := v.Args[0] 15060 y := v.Args[1] 15061 v.reset(OpARMGreaterEqual) 15062 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15063 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15064 v1.AddArg(x) 15065 v0.AddArg(v1) 15066 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15067 v2.AddArg(y) 15068 v0.AddArg(v2) 15069 v.AddArg(v0) 15070 return true 15071 } 15072 } 15073 func rewriteValueARM_OpGeq8U_0(v *Value) bool { 15074 b := v.Block 15075 _ = b 15076 typ := &b.Func.Config.Types 15077 _ = typ 15078 // match: (Geq8U x y) 15079 // cond: 15080 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15081 for { 15082 _ = v.Args[1] 15083 x := v.Args[0] 15084 y := v.Args[1] 15085 v.reset(OpARMGreaterEqualU) 15086 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15087 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15088 v1.AddArg(x) 15089 v0.AddArg(v1) 15090 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15091 v2.AddArg(y) 15092 v0.AddArg(v2) 15093 v.AddArg(v0) 15094 return true 15095 } 15096 } 15097 func rewriteValueARM_OpGetClosurePtr_0(v *Value) bool { 15098 // match: (GetClosurePtr) 15099 // cond: 15100 // result: (LoweredGetClosurePtr) 15101 for { 15102 v.reset(OpARMLoweredGetClosurePtr) 15103 return true 15104 } 15105 } 15106 func rewriteValueARM_OpGreater16_0(v *Value) bool { 15107 b := v.Block 15108 _ = b 15109 typ := &b.Func.Config.Types 15110 _ = typ 15111 // match: (Greater16 x y) 15112 // cond: 15113 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 15114 for { 15115 _ = v.Args[1] 15116 x := v.Args[0] 15117 y := v.Args[1] 15118 v.reset(OpARMGreaterThan) 15119 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15120 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15121 v1.AddArg(x) 15122 v0.AddArg(v1) 15123 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15124 v2.AddArg(y) 15125 v0.AddArg(v2) 15126 v.AddArg(v0) 15127 return true 15128 } 15129 } 15130 func rewriteValueARM_OpGreater16U_0(v *Value) bool { 15131 b := v.Block 15132 _ = b 15133 typ := &b.Func.Config.Types 15134 _ = typ 15135 // match: (Greater16U x y) 15136 // cond: 15137 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 15138 for { 15139 _ = v.Args[1] 15140 x := v.Args[0] 15141 y := v.Args[1] 15142 v.reset(OpARMGreaterThanU) 15143 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15144 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15145 v1.AddArg(x) 15146 v0.AddArg(v1) 15147 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15148 v2.AddArg(y) 15149 v0.AddArg(v2) 15150 v.AddArg(v0) 15151 return true 15152 } 15153 } 15154 func rewriteValueARM_OpGreater32_0(v *Value) bool { 15155 b := v.Block 15156 _ = b 15157 // match: (Greater32 x y) 15158 // cond: 15159 // result: (GreaterThan (CMP x y)) 15160 for { 15161 _ = v.Args[1] 15162 x := v.Args[0] 15163 y := v.Args[1] 15164 v.reset(OpARMGreaterThan) 15165 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15166 v0.AddArg(x) 15167 v0.AddArg(y) 15168 v.AddArg(v0) 15169 return true 15170 } 15171 } 15172 func rewriteValueARM_OpGreater32F_0(v *Value) bool { 15173 b := v.Block 15174 _ = b 15175 // match: (Greater32F x y) 15176 // cond: 15177 // result: (GreaterThan (CMPF x y)) 15178 for { 15179 _ = v.Args[1] 15180 x := v.Args[0] 15181 y := v.Args[1] 15182 v.reset(OpARMGreaterThan) 15183 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 15184 v0.AddArg(x) 15185 v0.AddArg(y) 15186 v.AddArg(v0) 15187 return true 15188 } 15189 } 15190 func rewriteValueARM_OpGreater32U_0(v *Value) bool { 15191 b := v.Block 15192 _ = b 15193 // match: (Greater32U x y) 15194 // cond: 15195 // result: (GreaterThanU (CMP x y)) 15196 for { 15197 _ = v.Args[1] 15198 x := v.Args[0] 15199 y := v.Args[1] 15200 v.reset(OpARMGreaterThanU) 15201 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15202 v0.AddArg(x) 15203 v0.AddArg(y) 15204 v.AddArg(v0) 15205 return true 15206 } 15207 } 15208 func rewriteValueARM_OpGreater64F_0(v *Value) bool { 15209 b := v.Block 15210 _ = b 15211 // match: (Greater64F x y) 15212 // cond: 15213 // result: (GreaterThan (CMPD x y)) 15214 for { 15215 _ = v.Args[1] 15216 x := v.Args[0] 15217 y := v.Args[1] 15218 v.reset(OpARMGreaterThan) 15219 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 15220 v0.AddArg(x) 15221 v0.AddArg(y) 15222 v.AddArg(v0) 15223 return true 15224 } 15225 } 15226 func rewriteValueARM_OpGreater8_0(v *Value) bool { 15227 b := v.Block 15228 _ = b 15229 typ := &b.Func.Config.Types 15230 _ = typ 15231 // match: (Greater8 x y) 15232 // cond: 15233 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 15234 for { 15235 _ = v.Args[1] 15236 x := v.Args[0] 15237 y := v.Args[1] 15238 v.reset(OpARMGreaterThan) 15239 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15240 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15241 v1.AddArg(x) 15242 v0.AddArg(v1) 15243 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15244 v2.AddArg(y) 15245 v0.AddArg(v2) 15246 v.AddArg(v0) 15247 return true 15248 } 15249 } 15250 func rewriteValueARM_OpGreater8U_0(v *Value) bool { 15251 b := v.Block 15252 _ = b 15253 typ := &b.Func.Config.Types 15254 _ = typ 15255 // match: (Greater8U x y) 15256 // cond: 15257 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15258 for { 15259 _ = v.Args[1] 15260 x := v.Args[0] 15261 y := v.Args[1] 15262 v.reset(OpARMGreaterThanU) 15263 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15264 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15265 v1.AddArg(x) 15266 v0.AddArg(v1) 15267 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15268 v2.AddArg(y) 15269 v0.AddArg(v2) 15270 v.AddArg(v0) 15271 return true 15272 } 15273 } 15274 func rewriteValueARM_OpHmul32_0(v *Value) bool { 15275 // match: (Hmul32 x y) 15276 // cond: 15277 // result: (HMUL x y) 15278 for { 15279 _ = v.Args[1] 15280 x := v.Args[0] 15281 y := v.Args[1] 15282 v.reset(OpARMHMUL) 15283 v.AddArg(x) 15284 v.AddArg(y) 15285 return true 15286 } 15287 } 15288 func rewriteValueARM_OpHmul32u_0(v *Value) bool { 15289 // match: (Hmul32u x y) 15290 // cond: 15291 // result: (HMULU x y) 15292 for { 15293 _ = v.Args[1] 15294 x := v.Args[0] 15295 y := v.Args[1] 15296 v.reset(OpARMHMULU) 15297 v.AddArg(x) 15298 v.AddArg(y) 15299 return true 15300 } 15301 } 15302 func rewriteValueARM_OpInterCall_0(v *Value) bool { 15303 // match: (InterCall [argwid] entry mem) 15304 // cond: 15305 // result: (CALLinter [argwid] entry mem) 15306 for { 15307 argwid := v.AuxInt 15308 _ = v.Args[1] 15309 entry := v.Args[0] 15310 mem := v.Args[1] 15311 v.reset(OpARMCALLinter) 15312 v.AuxInt = argwid 15313 v.AddArg(entry) 15314 v.AddArg(mem) 15315 return true 15316 } 15317 } 15318 func rewriteValueARM_OpIsInBounds_0(v *Value) bool { 15319 b := v.Block 15320 _ = b 15321 // match: (IsInBounds idx len) 15322 // cond: 15323 // result: (LessThanU (CMP idx len)) 15324 for { 15325 _ = v.Args[1] 15326 idx := v.Args[0] 15327 len := v.Args[1] 15328 v.reset(OpARMLessThanU) 15329 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15330 v0.AddArg(idx) 15331 v0.AddArg(len) 15332 v.AddArg(v0) 15333 return true 15334 } 15335 } 15336 func rewriteValueARM_OpIsNonNil_0(v *Value) bool { 15337 b := v.Block 15338 _ = b 15339 // match: (IsNonNil ptr) 15340 // cond: 15341 // result: (NotEqual (CMPconst [0] ptr)) 15342 for { 15343 ptr := v.Args[0] 15344 v.reset(OpARMNotEqual) 15345 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15346 v0.AuxInt = 0 15347 v0.AddArg(ptr) 15348 v.AddArg(v0) 15349 return true 15350 } 15351 } 15352 func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { 15353 b := v.Block 15354 _ = b 15355 // match: (IsSliceInBounds idx len) 15356 // cond: 15357 // result: (LessEqualU (CMP idx len)) 15358 for { 15359 _ = v.Args[1] 15360 idx := v.Args[0] 15361 len := v.Args[1] 15362 v.reset(OpARMLessEqualU) 15363 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15364 v0.AddArg(idx) 15365 v0.AddArg(len) 15366 v.AddArg(v0) 15367 return true 15368 } 15369 } 15370 func rewriteValueARM_OpLeq16_0(v *Value) bool { 15371 b := v.Block 15372 _ = b 15373 typ := &b.Func.Config.Types 15374 _ = typ 15375 // match: (Leq16 x y) 15376 // cond: 15377 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 15378 for { 15379 _ = v.Args[1] 15380 x := v.Args[0] 15381 y := v.Args[1] 15382 v.reset(OpARMLessEqual) 15383 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15384 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15385 v1.AddArg(x) 15386 v0.AddArg(v1) 15387 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15388 v2.AddArg(y) 15389 v0.AddArg(v2) 15390 v.AddArg(v0) 15391 return true 15392 } 15393 } 15394 func rewriteValueARM_OpLeq16U_0(v *Value) bool { 15395 b := v.Block 15396 _ = b 15397 typ := &b.Func.Config.Types 15398 _ = typ 15399 // match: (Leq16U x y) 15400 // cond: 15401 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 15402 for { 15403 _ = v.Args[1] 15404 x := v.Args[0] 15405 y := v.Args[1] 15406 v.reset(OpARMLessEqualU) 15407 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15408 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15409 v1.AddArg(x) 15410 v0.AddArg(v1) 15411 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15412 v2.AddArg(y) 15413 v0.AddArg(v2) 15414 v.AddArg(v0) 15415 return true 15416 } 15417 } 15418 func rewriteValueARM_OpLeq32_0(v *Value) bool { 15419 b := v.Block 15420 _ = b 15421 // match: (Leq32 x y) 15422 // cond: 15423 // result: (LessEqual (CMP x y)) 15424 for { 15425 _ = v.Args[1] 15426 x := v.Args[0] 15427 y := v.Args[1] 15428 v.reset(OpARMLessEqual) 15429 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15430 v0.AddArg(x) 15431 v0.AddArg(y) 15432 v.AddArg(v0) 15433 return true 15434 } 15435 } 15436 func rewriteValueARM_OpLeq32F_0(v *Value) bool { 15437 b := v.Block 15438 _ = b 15439 // match: (Leq32F x y) 15440 // cond: 15441 // result: (GreaterEqual (CMPF y x)) 15442 for { 15443 _ = v.Args[1] 15444 x := v.Args[0] 15445 y := v.Args[1] 15446 v.reset(OpARMGreaterEqual) 15447 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 15448 v0.AddArg(y) 15449 v0.AddArg(x) 15450 v.AddArg(v0) 15451 return true 15452 } 15453 } 15454 func rewriteValueARM_OpLeq32U_0(v *Value) bool { 15455 b := v.Block 15456 _ = b 15457 // match: (Leq32U x y) 15458 // cond: 15459 // result: (LessEqualU (CMP x y)) 15460 for { 15461 _ = v.Args[1] 15462 x := v.Args[0] 15463 y := v.Args[1] 15464 v.reset(OpARMLessEqualU) 15465 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15466 v0.AddArg(x) 15467 v0.AddArg(y) 15468 v.AddArg(v0) 15469 return true 15470 } 15471 } 15472 func rewriteValueARM_OpLeq64F_0(v *Value) bool { 15473 b := v.Block 15474 _ = b 15475 // match: (Leq64F x y) 15476 // cond: 15477 // result: (GreaterEqual (CMPD y x)) 15478 for { 15479 _ = v.Args[1] 15480 x := v.Args[0] 15481 y := v.Args[1] 15482 v.reset(OpARMGreaterEqual) 15483 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 15484 v0.AddArg(y) 15485 v0.AddArg(x) 15486 v.AddArg(v0) 15487 return true 15488 } 15489 } 15490 func rewriteValueARM_OpLeq8_0(v *Value) bool { 15491 b := v.Block 15492 _ = b 15493 typ := &b.Func.Config.Types 15494 _ = typ 15495 // match: (Leq8 x y) 15496 // cond: 15497 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 15498 for { 15499 _ = v.Args[1] 15500 x := v.Args[0] 15501 y := v.Args[1] 15502 v.reset(OpARMLessEqual) 15503 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15504 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15505 v1.AddArg(x) 15506 v0.AddArg(v1) 15507 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15508 v2.AddArg(y) 15509 v0.AddArg(v2) 15510 v.AddArg(v0) 15511 return true 15512 } 15513 } 15514 func rewriteValueARM_OpLeq8U_0(v *Value) bool { 15515 b := v.Block 15516 _ = b 15517 typ := &b.Func.Config.Types 15518 _ = typ 15519 // match: (Leq8U x y) 15520 // cond: 15521 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15522 for { 15523 _ = v.Args[1] 15524 x := v.Args[0] 15525 y := v.Args[1] 15526 v.reset(OpARMLessEqualU) 15527 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15528 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15529 v1.AddArg(x) 15530 v0.AddArg(v1) 15531 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15532 v2.AddArg(y) 15533 v0.AddArg(v2) 15534 v.AddArg(v0) 15535 return true 15536 } 15537 } 15538 func rewriteValueARM_OpLess16_0(v *Value) bool { 15539 b := v.Block 15540 _ = b 15541 typ := &b.Func.Config.Types 15542 _ = typ 15543 // match: (Less16 x y) 15544 // cond: 15545 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 15546 for { 15547 _ = v.Args[1] 15548 x := v.Args[0] 15549 y := v.Args[1] 15550 v.reset(OpARMLessThan) 15551 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15552 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15553 v1.AddArg(x) 15554 v0.AddArg(v1) 15555 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 15556 v2.AddArg(y) 15557 v0.AddArg(v2) 15558 v.AddArg(v0) 15559 return true 15560 } 15561 } 15562 func rewriteValueARM_OpLess16U_0(v *Value) bool { 15563 b := v.Block 15564 _ = b 15565 typ := &b.Func.Config.Types 15566 _ = typ 15567 // match: (Less16U x y) 15568 // cond: 15569 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 15570 for { 15571 _ = v.Args[1] 15572 x := v.Args[0] 15573 y := v.Args[1] 15574 v.reset(OpARMLessThanU) 15575 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15576 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15577 v1.AddArg(x) 15578 v0.AddArg(v1) 15579 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15580 v2.AddArg(y) 15581 v0.AddArg(v2) 15582 v.AddArg(v0) 15583 return true 15584 } 15585 } 15586 func rewriteValueARM_OpLess32_0(v *Value) bool { 15587 b := v.Block 15588 _ = b 15589 // match: (Less32 x y) 15590 // cond: 15591 // result: (LessThan (CMP x y)) 15592 for { 15593 _ = v.Args[1] 15594 x := v.Args[0] 15595 y := v.Args[1] 15596 v.reset(OpARMLessThan) 15597 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15598 v0.AddArg(x) 15599 v0.AddArg(y) 15600 v.AddArg(v0) 15601 return true 15602 } 15603 } 15604 func rewriteValueARM_OpLess32F_0(v *Value) bool { 15605 b := v.Block 15606 _ = b 15607 // match: (Less32F x y) 15608 // cond: 15609 // result: (GreaterThan (CMPF y x)) 15610 for { 15611 _ = v.Args[1] 15612 x := v.Args[0] 15613 y := v.Args[1] 15614 v.reset(OpARMGreaterThan) 15615 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 15616 v0.AddArg(y) 15617 v0.AddArg(x) 15618 v.AddArg(v0) 15619 return true 15620 } 15621 } 15622 func rewriteValueARM_OpLess32U_0(v *Value) bool { 15623 b := v.Block 15624 _ = b 15625 // match: (Less32U x y) 15626 // cond: 15627 // result: (LessThanU (CMP x y)) 15628 for { 15629 _ = v.Args[1] 15630 x := v.Args[0] 15631 y := v.Args[1] 15632 v.reset(OpARMLessThanU) 15633 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15634 v0.AddArg(x) 15635 v0.AddArg(y) 15636 v.AddArg(v0) 15637 return true 15638 } 15639 } 15640 func rewriteValueARM_OpLess64F_0(v *Value) bool { 15641 b := v.Block 15642 _ = b 15643 // match: (Less64F x y) 15644 // cond: 15645 // result: (GreaterThan (CMPD y x)) 15646 for { 15647 _ = v.Args[1] 15648 x := v.Args[0] 15649 y := v.Args[1] 15650 v.reset(OpARMGreaterThan) 15651 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 15652 v0.AddArg(y) 15653 v0.AddArg(x) 15654 v.AddArg(v0) 15655 return true 15656 } 15657 } 15658 func rewriteValueARM_OpLess8_0(v *Value) bool { 15659 b := v.Block 15660 _ = b 15661 typ := &b.Func.Config.Types 15662 _ = typ 15663 // match: (Less8 x y) 15664 // cond: 15665 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 15666 for { 15667 _ = v.Args[1] 15668 x := v.Args[0] 15669 y := v.Args[1] 15670 v.reset(OpARMLessThan) 15671 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15672 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15673 v1.AddArg(x) 15674 v0.AddArg(v1) 15675 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 15676 v2.AddArg(y) 15677 v0.AddArg(v2) 15678 v.AddArg(v0) 15679 return true 15680 } 15681 } 15682 func rewriteValueARM_OpLess8U_0(v *Value) bool { 15683 b := v.Block 15684 _ = b 15685 typ := &b.Func.Config.Types 15686 _ = typ 15687 // match: (Less8U x y) 15688 // cond: 15689 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 15690 for { 15691 _ = v.Args[1] 15692 x := v.Args[0] 15693 y := v.Args[1] 15694 v.reset(OpARMLessThanU) 15695 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 15696 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15697 v1.AddArg(x) 15698 v0.AddArg(v1) 15699 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15700 v2.AddArg(y) 15701 v0.AddArg(v2) 15702 v.AddArg(v0) 15703 return true 15704 } 15705 } 15706 func rewriteValueARM_OpLoad_0(v *Value) bool { 15707 // match: (Load <t> ptr mem) 15708 // cond: t.IsBoolean() 15709 // result: (MOVBUload ptr mem) 15710 for { 15711 t := v.Type 15712 _ = v.Args[1] 15713 ptr := v.Args[0] 15714 mem := v.Args[1] 15715 if !(t.IsBoolean()) { 15716 break 15717 } 15718 v.reset(OpARMMOVBUload) 15719 v.AddArg(ptr) 15720 v.AddArg(mem) 15721 return true 15722 } 15723 // match: (Load <t> ptr mem) 15724 // cond: (is8BitInt(t) && isSigned(t)) 15725 // result: (MOVBload ptr mem) 15726 for { 15727 t := v.Type 15728 _ = v.Args[1] 15729 ptr := v.Args[0] 15730 mem := v.Args[1] 15731 if !(is8BitInt(t) && isSigned(t)) { 15732 break 15733 } 15734 v.reset(OpARMMOVBload) 15735 v.AddArg(ptr) 15736 v.AddArg(mem) 15737 return true 15738 } 15739 // match: (Load <t> ptr mem) 15740 // cond: (is8BitInt(t) && !isSigned(t)) 15741 // result: (MOVBUload ptr mem) 15742 for { 15743 t := v.Type 15744 _ = v.Args[1] 15745 ptr := v.Args[0] 15746 mem := v.Args[1] 15747 if !(is8BitInt(t) && !isSigned(t)) { 15748 break 15749 } 15750 v.reset(OpARMMOVBUload) 15751 v.AddArg(ptr) 15752 v.AddArg(mem) 15753 return true 15754 } 15755 // match: (Load <t> ptr mem) 15756 // cond: (is16BitInt(t) && isSigned(t)) 15757 // result: (MOVHload ptr mem) 15758 for { 15759 t := v.Type 15760 _ = v.Args[1] 15761 ptr := v.Args[0] 15762 mem := v.Args[1] 15763 if !(is16BitInt(t) && isSigned(t)) { 15764 break 15765 } 15766 v.reset(OpARMMOVHload) 15767 v.AddArg(ptr) 15768 v.AddArg(mem) 15769 return true 15770 } 15771 // match: (Load <t> ptr mem) 15772 // cond: (is16BitInt(t) && !isSigned(t)) 15773 // result: (MOVHUload ptr mem) 15774 for { 15775 t := v.Type 15776 _ = v.Args[1] 15777 ptr := v.Args[0] 15778 mem := v.Args[1] 15779 if !(is16BitInt(t) && !isSigned(t)) { 15780 break 15781 } 15782 v.reset(OpARMMOVHUload) 15783 v.AddArg(ptr) 15784 v.AddArg(mem) 15785 return true 15786 } 15787 // match: (Load <t> ptr mem) 15788 // cond: (is32BitInt(t) || isPtr(t)) 15789 // result: (MOVWload ptr mem) 15790 for { 15791 t := v.Type 15792 _ = v.Args[1] 15793 ptr := v.Args[0] 15794 mem := v.Args[1] 15795 if !(is32BitInt(t) || isPtr(t)) { 15796 break 15797 } 15798 v.reset(OpARMMOVWload) 15799 v.AddArg(ptr) 15800 v.AddArg(mem) 15801 return true 15802 } 15803 // match: (Load <t> ptr mem) 15804 // cond: is32BitFloat(t) 15805 // result: (MOVFload ptr mem) 15806 for { 15807 t := v.Type 15808 _ = v.Args[1] 15809 ptr := v.Args[0] 15810 mem := v.Args[1] 15811 if !(is32BitFloat(t)) { 15812 break 15813 } 15814 v.reset(OpARMMOVFload) 15815 v.AddArg(ptr) 15816 v.AddArg(mem) 15817 return true 15818 } 15819 // match: (Load <t> ptr mem) 15820 // cond: is64BitFloat(t) 15821 // result: (MOVDload ptr mem) 15822 for { 15823 t := v.Type 15824 _ = v.Args[1] 15825 ptr := v.Args[0] 15826 mem := v.Args[1] 15827 if !(is64BitFloat(t)) { 15828 break 15829 } 15830 v.reset(OpARMMOVDload) 15831 v.AddArg(ptr) 15832 v.AddArg(mem) 15833 return true 15834 } 15835 return false 15836 } 15837 func rewriteValueARM_OpLsh16x16_0(v *Value) bool { 15838 b := v.Block 15839 _ = b 15840 typ := &b.Func.Config.Types 15841 _ = typ 15842 // match: (Lsh16x16 x y) 15843 // cond: 15844 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15845 for { 15846 _ = v.Args[1] 15847 x := v.Args[0] 15848 y := v.Args[1] 15849 v.reset(OpARMCMOVWHSconst) 15850 v.AuxInt = 0 15851 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15852 v0.AddArg(x) 15853 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15854 v1.AddArg(y) 15855 v0.AddArg(v1) 15856 v.AddArg(v0) 15857 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15858 v2.AuxInt = 256 15859 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15860 v3.AddArg(y) 15861 v2.AddArg(v3) 15862 v.AddArg(v2) 15863 return true 15864 } 15865 } 15866 func rewriteValueARM_OpLsh16x32_0(v *Value) bool { 15867 b := v.Block 15868 _ = b 15869 // match: (Lsh16x32 x y) 15870 // cond: 15871 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 15872 for { 15873 _ = v.Args[1] 15874 x := v.Args[0] 15875 y := v.Args[1] 15876 v.reset(OpARMCMOVWHSconst) 15877 v.AuxInt = 0 15878 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15879 v0.AddArg(x) 15880 v0.AddArg(y) 15881 v.AddArg(v0) 15882 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15883 v1.AuxInt = 256 15884 v1.AddArg(y) 15885 v.AddArg(v1) 15886 return true 15887 } 15888 } 15889 func rewriteValueARM_OpLsh16x64_0(v *Value) bool { 15890 // match: (Lsh16x64 x (Const64 [c])) 15891 // cond: uint64(c) < 16 15892 // result: (SLLconst x [c]) 15893 for { 15894 _ = v.Args[1] 15895 x := v.Args[0] 15896 v_1 := v.Args[1] 15897 if v_1.Op != OpConst64 { 15898 break 15899 } 15900 c := v_1.AuxInt 15901 if !(uint64(c) < 16) { 15902 break 15903 } 15904 v.reset(OpARMSLLconst) 15905 v.AuxInt = c 15906 v.AddArg(x) 15907 return true 15908 } 15909 // match: (Lsh16x64 _ (Const64 [c])) 15910 // cond: uint64(c) >= 16 15911 // result: (Const16 [0]) 15912 for { 15913 _ = v.Args[1] 15914 v_1 := v.Args[1] 15915 if v_1.Op != OpConst64 { 15916 break 15917 } 15918 c := v_1.AuxInt 15919 if !(uint64(c) >= 16) { 15920 break 15921 } 15922 v.reset(OpConst16) 15923 v.AuxInt = 0 15924 return true 15925 } 15926 return false 15927 } 15928 func rewriteValueARM_OpLsh16x8_0(v *Value) bool { 15929 b := v.Block 15930 _ = b 15931 typ := &b.Func.Config.Types 15932 _ = typ 15933 // match: (Lsh16x8 x y) 15934 // cond: 15935 // result: (SLL x (ZeroExt8to32 y)) 15936 for { 15937 _ = v.Args[1] 15938 x := v.Args[0] 15939 y := v.Args[1] 15940 v.reset(OpARMSLL) 15941 v.AddArg(x) 15942 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 15943 v0.AddArg(y) 15944 v.AddArg(v0) 15945 return true 15946 } 15947 } 15948 func rewriteValueARM_OpLsh32x16_0(v *Value) bool { 15949 b := v.Block 15950 _ = b 15951 typ := &b.Func.Config.Types 15952 _ = typ 15953 // match: (Lsh32x16 x y) 15954 // cond: 15955 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 15956 for { 15957 _ = v.Args[1] 15958 x := v.Args[0] 15959 y := v.Args[1] 15960 v.reset(OpARMCMOVWHSconst) 15961 v.AuxInt = 0 15962 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15963 v0.AddArg(x) 15964 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15965 v1.AddArg(y) 15966 v0.AddArg(v1) 15967 v.AddArg(v0) 15968 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15969 v2.AuxInt = 256 15970 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 15971 v3.AddArg(y) 15972 v2.AddArg(v3) 15973 v.AddArg(v2) 15974 return true 15975 } 15976 } 15977 func rewriteValueARM_OpLsh32x32_0(v *Value) bool { 15978 b := v.Block 15979 _ = b 15980 // match: (Lsh32x32 x y) 15981 // cond: 15982 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 15983 for { 15984 _ = v.Args[1] 15985 x := v.Args[0] 15986 y := v.Args[1] 15987 v.reset(OpARMCMOVWHSconst) 15988 v.AuxInt = 0 15989 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15990 v0.AddArg(x) 15991 v0.AddArg(y) 15992 v.AddArg(v0) 15993 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 15994 v1.AuxInt = 256 15995 v1.AddArg(y) 15996 v.AddArg(v1) 15997 return true 15998 } 15999 } 16000 func rewriteValueARM_OpLsh32x64_0(v *Value) bool { 16001 // match: (Lsh32x64 x (Const64 [c])) 16002 // cond: uint64(c) < 32 16003 // result: (SLLconst x [c]) 16004 for { 16005 _ = v.Args[1] 16006 x := v.Args[0] 16007 v_1 := v.Args[1] 16008 if v_1.Op != OpConst64 { 16009 break 16010 } 16011 c := v_1.AuxInt 16012 if !(uint64(c) < 32) { 16013 break 16014 } 16015 v.reset(OpARMSLLconst) 16016 v.AuxInt = c 16017 v.AddArg(x) 16018 return true 16019 } 16020 // match: (Lsh32x64 _ (Const64 [c])) 16021 // cond: uint64(c) >= 32 16022 // result: (Const32 [0]) 16023 for { 16024 _ = v.Args[1] 16025 v_1 := v.Args[1] 16026 if v_1.Op != OpConst64 { 16027 break 16028 } 16029 c := v_1.AuxInt 16030 if !(uint64(c) >= 32) { 16031 break 16032 } 16033 v.reset(OpConst32) 16034 v.AuxInt = 0 16035 return true 16036 } 16037 return false 16038 } 16039 func rewriteValueARM_OpLsh32x8_0(v *Value) bool { 16040 b := v.Block 16041 _ = b 16042 typ := &b.Func.Config.Types 16043 _ = typ 16044 // match: (Lsh32x8 x y) 16045 // cond: 16046 // result: (SLL x (ZeroExt8to32 y)) 16047 for { 16048 _ = v.Args[1] 16049 x := v.Args[0] 16050 y := v.Args[1] 16051 v.reset(OpARMSLL) 16052 v.AddArg(x) 16053 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16054 v0.AddArg(y) 16055 v.AddArg(v0) 16056 return true 16057 } 16058 } 16059 func rewriteValueARM_OpLsh8x16_0(v *Value) bool { 16060 b := v.Block 16061 _ = b 16062 typ := &b.Func.Config.Types 16063 _ = typ 16064 // match: (Lsh8x16 x y) 16065 // cond: 16066 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 16067 for { 16068 _ = v.Args[1] 16069 x := v.Args[0] 16070 y := v.Args[1] 16071 v.reset(OpARMCMOVWHSconst) 16072 v.AuxInt = 0 16073 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 16074 v0.AddArg(x) 16075 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16076 v1.AddArg(y) 16077 v0.AddArg(v1) 16078 v.AddArg(v0) 16079 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 16080 v2.AuxInt = 256 16081 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16082 v3.AddArg(y) 16083 v2.AddArg(v3) 16084 v.AddArg(v2) 16085 return true 16086 } 16087 } 16088 func rewriteValueARM_OpLsh8x32_0(v *Value) bool { 16089 b := v.Block 16090 _ = b 16091 // match: (Lsh8x32 x y) 16092 // cond: 16093 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 16094 for { 16095 _ = v.Args[1] 16096 x := v.Args[0] 16097 y := v.Args[1] 16098 v.reset(OpARMCMOVWHSconst) 16099 v.AuxInt = 0 16100 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 16101 v0.AddArg(x) 16102 v0.AddArg(y) 16103 v.AddArg(v0) 16104 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 16105 v1.AuxInt = 256 16106 v1.AddArg(y) 16107 v.AddArg(v1) 16108 return true 16109 } 16110 } 16111 func rewriteValueARM_OpLsh8x64_0(v *Value) bool { 16112 // match: (Lsh8x64 x (Const64 [c])) 16113 // cond: uint64(c) < 8 16114 // result: (SLLconst x [c]) 16115 for { 16116 _ = v.Args[1] 16117 x := v.Args[0] 16118 v_1 := v.Args[1] 16119 if v_1.Op != OpConst64 { 16120 break 16121 } 16122 c := v_1.AuxInt 16123 if !(uint64(c) < 8) { 16124 break 16125 } 16126 v.reset(OpARMSLLconst) 16127 v.AuxInt = c 16128 v.AddArg(x) 16129 return true 16130 } 16131 // match: (Lsh8x64 _ (Const64 [c])) 16132 // cond: uint64(c) >= 8 16133 // result: (Const8 [0]) 16134 for { 16135 _ = v.Args[1] 16136 v_1 := v.Args[1] 16137 if v_1.Op != OpConst64 { 16138 break 16139 } 16140 c := v_1.AuxInt 16141 if !(uint64(c) >= 8) { 16142 break 16143 } 16144 v.reset(OpConst8) 16145 v.AuxInt = 0 16146 return true 16147 } 16148 return false 16149 } 16150 func rewriteValueARM_OpLsh8x8_0(v *Value) bool { 16151 b := v.Block 16152 _ = b 16153 typ := &b.Func.Config.Types 16154 _ = typ 16155 // match: (Lsh8x8 x y) 16156 // cond: 16157 // result: (SLL x (ZeroExt8to32 y)) 16158 for { 16159 _ = v.Args[1] 16160 x := v.Args[0] 16161 y := v.Args[1] 16162 v.reset(OpARMSLL) 16163 v.AddArg(x) 16164 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16165 v0.AddArg(y) 16166 v.AddArg(v0) 16167 return true 16168 } 16169 } 16170 func rewriteValueARM_OpMod16_0(v *Value) bool { 16171 b := v.Block 16172 _ = b 16173 typ := &b.Func.Config.Types 16174 _ = typ 16175 // match: (Mod16 x y) 16176 // cond: 16177 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 16178 for { 16179 _ = v.Args[1] 16180 x := v.Args[0] 16181 y := v.Args[1] 16182 v.reset(OpMod32) 16183 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16184 v0.AddArg(x) 16185 v.AddArg(v0) 16186 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 16187 v1.AddArg(y) 16188 v.AddArg(v1) 16189 return true 16190 } 16191 } 16192 func rewriteValueARM_OpMod16u_0(v *Value) bool { 16193 b := v.Block 16194 _ = b 16195 typ := &b.Func.Config.Types 16196 _ = typ 16197 // match: (Mod16u x y) 16198 // cond: 16199 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 16200 for { 16201 _ = v.Args[1] 16202 x := v.Args[0] 16203 y := v.Args[1] 16204 v.reset(OpMod32u) 16205 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16206 v0.AddArg(x) 16207 v.AddArg(v0) 16208 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16209 v1.AddArg(y) 16210 v.AddArg(v1) 16211 return true 16212 } 16213 } 16214 func rewriteValueARM_OpMod32_0(v *Value) bool { 16215 b := v.Block 16216 _ = b 16217 typ := &b.Func.Config.Types 16218 _ = typ 16219 // match: (Mod32 x y) 16220 // cond: 16221 // 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)) 16222 for { 16223 _ = v.Args[1] 16224 x := v.Args[0] 16225 y := v.Args[1] 16226 v.reset(OpARMSUB) 16227 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 16228 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) 16229 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 16230 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 16231 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 16232 v4.AddArg(x) 16233 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 16234 v5.AddArg(x) 16235 v4.AddArg(v5) 16236 v3.AddArg(v4) 16237 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 16238 v6.AddArg(x) 16239 v3.AddArg(v6) 16240 v2.AddArg(v3) 16241 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 16242 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 16243 v8.AddArg(y) 16244 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 16245 v9.AddArg(y) 16246 v8.AddArg(v9) 16247 v7.AddArg(v8) 16248 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 16249 v10.AddArg(y) 16250 v7.AddArg(v10) 16251 v2.AddArg(v7) 16252 v1.AddArg(v2) 16253 v0.AddArg(v1) 16254 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 16255 v11.AddArg(x) 16256 v0.AddArg(v11) 16257 v.AddArg(v0) 16258 v12 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 16259 v12.AddArg(x) 16260 v.AddArg(v12) 16261 return true 16262 } 16263 } 16264 func rewriteValueARM_OpMod32u_0(v *Value) bool { 16265 b := v.Block 16266 _ = b 16267 typ := &b.Func.Config.Types 16268 _ = typ 16269 // match: (Mod32u x y) 16270 // cond: 16271 // result: (Select1 <typ.UInt32> (CALLudiv x y)) 16272 for { 16273 _ = v.Args[1] 16274 x := v.Args[0] 16275 y := v.Args[1] 16276 v.reset(OpSelect1) 16277 v.Type = typ.UInt32 16278 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 16279 v0.AddArg(x) 16280 v0.AddArg(y) 16281 v.AddArg(v0) 16282 return true 16283 } 16284 } 16285 func rewriteValueARM_OpMod8_0(v *Value) bool { 16286 b := v.Block 16287 _ = b 16288 typ := &b.Func.Config.Types 16289 _ = typ 16290 // match: (Mod8 x y) 16291 // cond: 16292 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 16293 for { 16294 _ = v.Args[1] 16295 x := v.Args[0] 16296 y := v.Args[1] 16297 v.reset(OpMod32) 16298 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16299 v0.AddArg(x) 16300 v.AddArg(v0) 16301 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 16302 v1.AddArg(y) 16303 v.AddArg(v1) 16304 return true 16305 } 16306 } 16307 func rewriteValueARM_OpMod8u_0(v *Value) bool { 16308 b := v.Block 16309 _ = b 16310 typ := &b.Func.Config.Types 16311 _ = typ 16312 // match: (Mod8u x y) 16313 // cond: 16314 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 16315 for { 16316 _ = v.Args[1] 16317 x := v.Args[0] 16318 y := v.Args[1] 16319 v.reset(OpMod32u) 16320 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16321 v0.AddArg(x) 16322 v.AddArg(v0) 16323 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16324 v1.AddArg(y) 16325 v.AddArg(v1) 16326 return true 16327 } 16328 } 16329 func rewriteValueARM_OpMove_0(v *Value) bool { 16330 b := v.Block 16331 _ = b 16332 config := b.Func.Config 16333 _ = config 16334 typ := &b.Func.Config.Types 16335 _ = typ 16336 // match: (Move [0] _ _ mem) 16337 // cond: 16338 // result: mem 16339 for { 16340 if v.AuxInt != 0 { 16341 break 16342 } 16343 _ = v.Args[2] 16344 mem := v.Args[2] 16345 v.reset(OpCopy) 16346 v.Type = mem.Type 16347 v.AddArg(mem) 16348 return true 16349 } 16350 // match: (Move [1] dst src mem) 16351 // cond: 16352 // result: (MOVBstore dst (MOVBUload src mem) mem) 16353 for { 16354 if v.AuxInt != 1 { 16355 break 16356 } 16357 _ = v.Args[2] 16358 dst := v.Args[0] 16359 src := v.Args[1] 16360 mem := v.Args[2] 16361 v.reset(OpARMMOVBstore) 16362 v.AddArg(dst) 16363 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16364 v0.AddArg(src) 16365 v0.AddArg(mem) 16366 v.AddArg(v0) 16367 v.AddArg(mem) 16368 return true 16369 } 16370 // match: (Move [2] {t} dst src mem) 16371 // cond: t.(*types.Type).Alignment()%2 == 0 16372 // result: (MOVHstore dst (MOVHUload src mem) mem) 16373 for { 16374 if v.AuxInt != 2 { 16375 break 16376 } 16377 t := v.Aux 16378 _ = v.Args[2] 16379 dst := v.Args[0] 16380 src := v.Args[1] 16381 mem := v.Args[2] 16382 if !(t.(*types.Type).Alignment()%2 == 0) { 16383 break 16384 } 16385 v.reset(OpARMMOVHstore) 16386 v.AddArg(dst) 16387 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 16388 v0.AddArg(src) 16389 v0.AddArg(mem) 16390 v.AddArg(v0) 16391 v.AddArg(mem) 16392 return true 16393 } 16394 // match: (Move [2] dst src mem) 16395 // cond: 16396 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 16397 for { 16398 if v.AuxInt != 2 { 16399 break 16400 } 16401 _ = v.Args[2] 16402 dst := v.Args[0] 16403 src := v.Args[1] 16404 mem := v.Args[2] 16405 v.reset(OpARMMOVBstore) 16406 v.AuxInt = 1 16407 v.AddArg(dst) 16408 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16409 v0.AuxInt = 1 16410 v0.AddArg(src) 16411 v0.AddArg(mem) 16412 v.AddArg(v0) 16413 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16414 v1.AddArg(dst) 16415 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16416 v2.AddArg(src) 16417 v2.AddArg(mem) 16418 v1.AddArg(v2) 16419 v1.AddArg(mem) 16420 v.AddArg(v1) 16421 return true 16422 } 16423 // match: (Move [4] {t} dst src mem) 16424 // cond: t.(*types.Type).Alignment()%4 == 0 16425 // result: (MOVWstore dst (MOVWload src mem) mem) 16426 for { 16427 if v.AuxInt != 4 { 16428 break 16429 } 16430 t := v.Aux 16431 _ = v.Args[2] 16432 dst := v.Args[0] 16433 src := v.Args[1] 16434 mem := v.Args[2] 16435 if !(t.(*types.Type).Alignment()%4 == 0) { 16436 break 16437 } 16438 v.reset(OpARMMOVWstore) 16439 v.AddArg(dst) 16440 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32) 16441 v0.AddArg(src) 16442 v0.AddArg(mem) 16443 v.AddArg(v0) 16444 v.AddArg(mem) 16445 return true 16446 } 16447 // match: (Move [4] {t} dst src mem) 16448 // cond: t.(*types.Type).Alignment()%2 == 0 16449 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 16450 for { 16451 if v.AuxInt != 4 { 16452 break 16453 } 16454 t := v.Aux 16455 _ = v.Args[2] 16456 dst := v.Args[0] 16457 src := v.Args[1] 16458 mem := v.Args[2] 16459 if !(t.(*types.Type).Alignment()%2 == 0) { 16460 break 16461 } 16462 v.reset(OpARMMOVHstore) 16463 v.AuxInt = 2 16464 v.AddArg(dst) 16465 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 16466 v0.AuxInt = 2 16467 v0.AddArg(src) 16468 v0.AddArg(mem) 16469 v.AddArg(v0) 16470 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 16471 v1.AddArg(dst) 16472 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 16473 v2.AddArg(src) 16474 v2.AddArg(mem) 16475 v1.AddArg(v2) 16476 v1.AddArg(mem) 16477 v.AddArg(v1) 16478 return true 16479 } 16480 // match: (Move [4] dst src mem) 16481 // cond: 16482 // 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)))) 16483 for { 16484 if v.AuxInt != 4 { 16485 break 16486 } 16487 _ = v.Args[2] 16488 dst := v.Args[0] 16489 src := v.Args[1] 16490 mem := v.Args[2] 16491 v.reset(OpARMMOVBstore) 16492 v.AuxInt = 3 16493 v.AddArg(dst) 16494 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16495 v0.AuxInt = 3 16496 v0.AddArg(src) 16497 v0.AddArg(mem) 16498 v.AddArg(v0) 16499 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16500 v1.AuxInt = 2 16501 v1.AddArg(dst) 16502 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16503 v2.AuxInt = 2 16504 v2.AddArg(src) 16505 v2.AddArg(mem) 16506 v1.AddArg(v2) 16507 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16508 v3.AuxInt = 1 16509 v3.AddArg(dst) 16510 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16511 v4.AuxInt = 1 16512 v4.AddArg(src) 16513 v4.AddArg(mem) 16514 v3.AddArg(v4) 16515 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16516 v5.AddArg(dst) 16517 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16518 v6.AddArg(src) 16519 v6.AddArg(mem) 16520 v5.AddArg(v6) 16521 v5.AddArg(mem) 16522 v3.AddArg(v5) 16523 v1.AddArg(v3) 16524 v.AddArg(v1) 16525 return true 16526 } 16527 // match: (Move [3] dst src mem) 16528 // cond: 16529 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 16530 for { 16531 if v.AuxInt != 3 { 16532 break 16533 } 16534 _ = v.Args[2] 16535 dst := v.Args[0] 16536 src := v.Args[1] 16537 mem := v.Args[2] 16538 v.reset(OpARMMOVBstore) 16539 v.AuxInt = 2 16540 v.AddArg(dst) 16541 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16542 v0.AuxInt = 2 16543 v0.AddArg(src) 16544 v0.AddArg(mem) 16545 v.AddArg(v0) 16546 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16547 v1.AuxInt = 1 16548 v1.AddArg(dst) 16549 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16550 v2.AuxInt = 1 16551 v2.AddArg(src) 16552 v2.AddArg(mem) 16553 v1.AddArg(v2) 16554 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 16555 v3.AddArg(dst) 16556 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 16557 v4.AddArg(src) 16558 v4.AddArg(mem) 16559 v3.AddArg(v4) 16560 v3.AddArg(mem) 16561 v1.AddArg(v3) 16562 v.AddArg(v1) 16563 return true 16564 } 16565 // match: (Move [s] {t} dst src mem) 16566 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 16567 // result: (DUFFCOPY [8 * (128 - int64(s/4))] dst src mem) 16568 for { 16569 s := v.AuxInt 16570 t := v.Aux 16571 _ = v.Args[2] 16572 dst := v.Args[0] 16573 src := v.Args[1] 16574 mem := v.Args[2] 16575 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 16576 break 16577 } 16578 v.reset(OpARMDUFFCOPY) 16579 v.AuxInt = 8 * (128 - int64(s/4)) 16580 v.AddArg(dst) 16581 v.AddArg(src) 16582 v.AddArg(mem) 16583 return true 16584 } 16585 // match: (Move [s] {t} dst src mem) 16586 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 16587 // result: (LoweredMove [t.(*types.Type).Alignment()] dst src (ADDconst <src.Type> src [s-moveSize(t.(*types.Type).Alignment(), config)]) mem) 16588 for { 16589 s := v.AuxInt 16590 t := v.Aux 16591 _ = v.Args[2] 16592 dst := v.Args[0] 16593 src := v.Args[1] 16594 mem := v.Args[2] 16595 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 16596 break 16597 } 16598 v.reset(OpARMLoweredMove) 16599 v.AuxInt = t.(*types.Type).Alignment() 16600 v.AddArg(dst) 16601 v.AddArg(src) 16602 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 16603 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 16604 v0.AddArg(src) 16605 v.AddArg(v0) 16606 v.AddArg(mem) 16607 return true 16608 } 16609 return false 16610 } 16611 func rewriteValueARM_OpMul16_0(v *Value) bool { 16612 // match: (Mul16 x y) 16613 // cond: 16614 // result: (MUL x y) 16615 for { 16616 _ = v.Args[1] 16617 x := v.Args[0] 16618 y := v.Args[1] 16619 v.reset(OpARMMUL) 16620 v.AddArg(x) 16621 v.AddArg(y) 16622 return true 16623 } 16624 } 16625 func rewriteValueARM_OpMul32_0(v *Value) bool { 16626 // match: (Mul32 x y) 16627 // cond: 16628 // result: (MUL x y) 16629 for { 16630 _ = v.Args[1] 16631 x := v.Args[0] 16632 y := v.Args[1] 16633 v.reset(OpARMMUL) 16634 v.AddArg(x) 16635 v.AddArg(y) 16636 return true 16637 } 16638 } 16639 func rewriteValueARM_OpMul32F_0(v *Value) bool { 16640 // match: (Mul32F x y) 16641 // cond: 16642 // result: (MULF x y) 16643 for { 16644 _ = v.Args[1] 16645 x := v.Args[0] 16646 y := v.Args[1] 16647 v.reset(OpARMMULF) 16648 v.AddArg(x) 16649 v.AddArg(y) 16650 return true 16651 } 16652 } 16653 func rewriteValueARM_OpMul32uhilo_0(v *Value) bool { 16654 // match: (Mul32uhilo x y) 16655 // cond: 16656 // result: (MULLU x y) 16657 for { 16658 _ = v.Args[1] 16659 x := v.Args[0] 16660 y := v.Args[1] 16661 v.reset(OpARMMULLU) 16662 v.AddArg(x) 16663 v.AddArg(y) 16664 return true 16665 } 16666 } 16667 func rewriteValueARM_OpMul64F_0(v *Value) bool { 16668 // match: (Mul64F x y) 16669 // cond: 16670 // result: (MULD x y) 16671 for { 16672 _ = v.Args[1] 16673 x := v.Args[0] 16674 y := v.Args[1] 16675 v.reset(OpARMMULD) 16676 v.AddArg(x) 16677 v.AddArg(y) 16678 return true 16679 } 16680 } 16681 func rewriteValueARM_OpMul8_0(v *Value) bool { 16682 // match: (Mul8 x y) 16683 // cond: 16684 // result: (MUL x y) 16685 for { 16686 _ = v.Args[1] 16687 x := v.Args[0] 16688 y := v.Args[1] 16689 v.reset(OpARMMUL) 16690 v.AddArg(x) 16691 v.AddArg(y) 16692 return true 16693 } 16694 } 16695 func rewriteValueARM_OpNeg16_0(v *Value) bool { 16696 // match: (Neg16 x) 16697 // cond: 16698 // result: (RSBconst [0] x) 16699 for { 16700 x := v.Args[0] 16701 v.reset(OpARMRSBconst) 16702 v.AuxInt = 0 16703 v.AddArg(x) 16704 return true 16705 } 16706 } 16707 func rewriteValueARM_OpNeg32_0(v *Value) bool { 16708 // match: (Neg32 x) 16709 // cond: 16710 // result: (RSBconst [0] x) 16711 for { 16712 x := v.Args[0] 16713 v.reset(OpARMRSBconst) 16714 v.AuxInt = 0 16715 v.AddArg(x) 16716 return true 16717 } 16718 } 16719 func rewriteValueARM_OpNeg32F_0(v *Value) bool { 16720 // match: (Neg32F x) 16721 // cond: 16722 // result: (NEGF x) 16723 for { 16724 x := v.Args[0] 16725 v.reset(OpARMNEGF) 16726 v.AddArg(x) 16727 return true 16728 } 16729 } 16730 func rewriteValueARM_OpNeg64F_0(v *Value) bool { 16731 // match: (Neg64F x) 16732 // cond: 16733 // result: (NEGD x) 16734 for { 16735 x := v.Args[0] 16736 v.reset(OpARMNEGD) 16737 v.AddArg(x) 16738 return true 16739 } 16740 } 16741 func rewriteValueARM_OpNeg8_0(v *Value) bool { 16742 // match: (Neg8 x) 16743 // cond: 16744 // result: (RSBconst [0] x) 16745 for { 16746 x := v.Args[0] 16747 v.reset(OpARMRSBconst) 16748 v.AuxInt = 0 16749 v.AddArg(x) 16750 return true 16751 } 16752 } 16753 func rewriteValueARM_OpNeq16_0(v *Value) bool { 16754 b := v.Block 16755 _ = b 16756 typ := &b.Func.Config.Types 16757 _ = typ 16758 // match: (Neq16 x y) 16759 // cond: 16760 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 16761 for { 16762 _ = v.Args[1] 16763 x := v.Args[0] 16764 y := v.Args[1] 16765 v.reset(OpARMNotEqual) 16766 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16767 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16768 v1.AddArg(x) 16769 v0.AddArg(v1) 16770 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 16771 v2.AddArg(y) 16772 v0.AddArg(v2) 16773 v.AddArg(v0) 16774 return true 16775 } 16776 } 16777 func rewriteValueARM_OpNeq32_0(v *Value) bool { 16778 b := v.Block 16779 _ = b 16780 // match: (Neq32 x y) 16781 // cond: 16782 // result: (NotEqual (CMP x y)) 16783 for { 16784 _ = v.Args[1] 16785 x := v.Args[0] 16786 y := v.Args[1] 16787 v.reset(OpARMNotEqual) 16788 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16789 v0.AddArg(x) 16790 v0.AddArg(y) 16791 v.AddArg(v0) 16792 return true 16793 } 16794 } 16795 func rewriteValueARM_OpNeq32F_0(v *Value) bool { 16796 b := v.Block 16797 _ = b 16798 // match: (Neq32F x y) 16799 // cond: 16800 // result: (NotEqual (CMPF x y)) 16801 for { 16802 _ = v.Args[1] 16803 x := v.Args[0] 16804 y := v.Args[1] 16805 v.reset(OpARMNotEqual) 16806 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 16807 v0.AddArg(x) 16808 v0.AddArg(y) 16809 v.AddArg(v0) 16810 return true 16811 } 16812 } 16813 func rewriteValueARM_OpNeq64F_0(v *Value) bool { 16814 b := v.Block 16815 _ = b 16816 // match: (Neq64F x y) 16817 // cond: 16818 // result: (NotEqual (CMPD x y)) 16819 for { 16820 _ = v.Args[1] 16821 x := v.Args[0] 16822 y := v.Args[1] 16823 v.reset(OpARMNotEqual) 16824 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 16825 v0.AddArg(x) 16826 v0.AddArg(y) 16827 v.AddArg(v0) 16828 return true 16829 } 16830 } 16831 func rewriteValueARM_OpNeq8_0(v *Value) bool { 16832 b := v.Block 16833 _ = b 16834 typ := &b.Func.Config.Types 16835 _ = typ 16836 // match: (Neq8 x y) 16837 // cond: 16838 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 16839 for { 16840 _ = v.Args[1] 16841 x := v.Args[0] 16842 y := v.Args[1] 16843 v.reset(OpARMNotEqual) 16844 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16845 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16846 v1.AddArg(x) 16847 v0.AddArg(v1) 16848 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 16849 v2.AddArg(y) 16850 v0.AddArg(v2) 16851 v.AddArg(v0) 16852 return true 16853 } 16854 } 16855 func rewriteValueARM_OpNeqB_0(v *Value) bool { 16856 // match: (NeqB x y) 16857 // cond: 16858 // result: (XOR x y) 16859 for { 16860 _ = v.Args[1] 16861 x := v.Args[0] 16862 y := v.Args[1] 16863 v.reset(OpARMXOR) 16864 v.AddArg(x) 16865 v.AddArg(y) 16866 return true 16867 } 16868 } 16869 func rewriteValueARM_OpNeqPtr_0(v *Value) bool { 16870 b := v.Block 16871 _ = b 16872 // match: (NeqPtr x y) 16873 // cond: 16874 // result: (NotEqual (CMP x y)) 16875 for { 16876 _ = v.Args[1] 16877 x := v.Args[0] 16878 y := v.Args[1] 16879 v.reset(OpARMNotEqual) 16880 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 16881 v0.AddArg(x) 16882 v0.AddArg(y) 16883 v.AddArg(v0) 16884 return true 16885 } 16886 } 16887 func rewriteValueARM_OpNilCheck_0(v *Value) bool { 16888 // match: (NilCheck ptr mem) 16889 // cond: 16890 // result: (LoweredNilCheck ptr mem) 16891 for { 16892 _ = v.Args[1] 16893 ptr := v.Args[0] 16894 mem := v.Args[1] 16895 v.reset(OpARMLoweredNilCheck) 16896 v.AddArg(ptr) 16897 v.AddArg(mem) 16898 return true 16899 } 16900 } 16901 func rewriteValueARM_OpNot_0(v *Value) bool { 16902 // match: (Not x) 16903 // cond: 16904 // result: (XORconst [1] x) 16905 for { 16906 x := v.Args[0] 16907 v.reset(OpARMXORconst) 16908 v.AuxInt = 1 16909 v.AddArg(x) 16910 return true 16911 } 16912 } 16913 func rewriteValueARM_OpOffPtr_0(v *Value) bool { 16914 // match: (OffPtr [off] ptr:(SP)) 16915 // cond: 16916 // result: (MOVWaddr [off] ptr) 16917 for { 16918 off := v.AuxInt 16919 ptr := v.Args[0] 16920 if ptr.Op != OpSP { 16921 break 16922 } 16923 v.reset(OpARMMOVWaddr) 16924 v.AuxInt = off 16925 v.AddArg(ptr) 16926 return true 16927 } 16928 // match: (OffPtr [off] ptr) 16929 // cond: 16930 // result: (ADDconst [off] ptr) 16931 for { 16932 off := v.AuxInt 16933 ptr := v.Args[0] 16934 v.reset(OpARMADDconst) 16935 v.AuxInt = off 16936 v.AddArg(ptr) 16937 return true 16938 } 16939 } 16940 func rewriteValueARM_OpOr16_0(v *Value) bool { 16941 // match: (Or16 x y) 16942 // cond: 16943 // result: (OR x y) 16944 for { 16945 _ = v.Args[1] 16946 x := v.Args[0] 16947 y := v.Args[1] 16948 v.reset(OpARMOR) 16949 v.AddArg(x) 16950 v.AddArg(y) 16951 return true 16952 } 16953 } 16954 func rewriteValueARM_OpOr32_0(v *Value) bool { 16955 // match: (Or32 x y) 16956 // cond: 16957 // result: (OR x y) 16958 for { 16959 _ = v.Args[1] 16960 x := v.Args[0] 16961 y := v.Args[1] 16962 v.reset(OpARMOR) 16963 v.AddArg(x) 16964 v.AddArg(y) 16965 return true 16966 } 16967 } 16968 func rewriteValueARM_OpOr8_0(v *Value) bool { 16969 // match: (Or8 x y) 16970 // cond: 16971 // result: (OR x y) 16972 for { 16973 _ = v.Args[1] 16974 x := v.Args[0] 16975 y := v.Args[1] 16976 v.reset(OpARMOR) 16977 v.AddArg(x) 16978 v.AddArg(y) 16979 return true 16980 } 16981 } 16982 func rewriteValueARM_OpOrB_0(v *Value) bool { 16983 // match: (OrB x y) 16984 // cond: 16985 // result: (OR x y) 16986 for { 16987 _ = v.Args[1] 16988 x := v.Args[0] 16989 y := v.Args[1] 16990 v.reset(OpARMOR) 16991 v.AddArg(x) 16992 v.AddArg(y) 16993 return true 16994 } 16995 } 16996 func rewriteValueARM_OpRound32F_0(v *Value) bool { 16997 // match: (Round32F x) 16998 // cond: 16999 // result: x 17000 for { 17001 x := v.Args[0] 17002 v.reset(OpCopy) 17003 v.Type = x.Type 17004 v.AddArg(x) 17005 return true 17006 } 17007 } 17008 func rewriteValueARM_OpRound64F_0(v *Value) bool { 17009 // match: (Round64F x) 17010 // cond: 17011 // result: x 17012 for { 17013 x := v.Args[0] 17014 v.reset(OpCopy) 17015 v.Type = x.Type 17016 v.AddArg(x) 17017 return true 17018 } 17019 } 17020 func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { 17021 b := v.Block 17022 _ = b 17023 typ := &b.Func.Config.Types 17024 _ = typ 17025 // match: (Rsh16Ux16 x y) 17026 // cond: 17027 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 17028 for { 17029 _ = v.Args[1] 17030 x := v.Args[0] 17031 y := v.Args[1] 17032 v.reset(OpARMCMOVWHSconst) 17033 v.AuxInt = 0 17034 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17035 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17036 v1.AddArg(x) 17037 v0.AddArg(v1) 17038 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17039 v2.AddArg(y) 17040 v0.AddArg(v2) 17041 v.AddArg(v0) 17042 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17043 v3.AuxInt = 256 17044 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17045 v4.AddArg(y) 17046 v3.AddArg(v4) 17047 v.AddArg(v3) 17048 return true 17049 } 17050 } 17051 func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { 17052 b := v.Block 17053 _ = b 17054 typ := &b.Func.Config.Types 17055 _ = typ 17056 // match: (Rsh16Ux32 x y) 17057 // cond: 17058 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 17059 for { 17060 _ = v.Args[1] 17061 x := v.Args[0] 17062 y := v.Args[1] 17063 v.reset(OpARMCMOVWHSconst) 17064 v.AuxInt = 0 17065 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17066 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17067 v1.AddArg(x) 17068 v0.AddArg(v1) 17069 v0.AddArg(y) 17070 v.AddArg(v0) 17071 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17072 v2.AuxInt = 256 17073 v2.AddArg(y) 17074 v.AddArg(v2) 17075 return true 17076 } 17077 } 17078 func rewriteValueARM_OpRsh16Ux64_0(v *Value) bool { 17079 b := v.Block 17080 _ = b 17081 typ := &b.Func.Config.Types 17082 _ = typ 17083 // match: (Rsh16Ux64 x (Const64 [c])) 17084 // cond: uint64(c) < 16 17085 // result: (SRLconst (SLLconst <typ.UInt32> x [16]) [c+16]) 17086 for { 17087 _ = v.Args[1] 17088 x := v.Args[0] 17089 v_1 := v.Args[1] 17090 if v_1.Op != OpConst64 { 17091 break 17092 } 17093 c := v_1.AuxInt 17094 if !(uint64(c) < 16) { 17095 break 17096 } 17097 v.reset(OpARMSRLconst) 17098 v.AuxInt = c + 16 17099 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 17100 v0.AuxInt = 16 17101 v0.AddArg(x) 17102 v.AddArg(v0) 17103 return true 17104 } 17105 // match: (Rsh16Ux64 _ (Const64 [c])) 17106 // cond: uint64(c) >= 16 17107 // result: (Const16 [0]) 17108 for { 17109 _ = v.Args[1] 17110 v_1 := v.Args[1] 17111 if v_1.Op != OpConst64 { 17112 break 17113 } 17114 c := v_1.AuxInt 17115 if !(uint64(c) >= 16) { 17116 break 17117 } 17118 v.reset(OpConst16) 17119 v.AuxInt = 0 17120 return true 17121 } 17122 return false 17123 } 17124 func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { 17125 b := v.Block 17126 _ = b 17127 typ := &b.Func.Config.Types 17128 _ = typ 17129 // match: (Rsh16Ux8 x y) 17130 // cond: 17131 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 17132 for { 17133 _ = v.Args[1] 17134 x := v.Args[0] 17135 y := v.Args[1] 17136 v.reset(OpARMSRL) 17137 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17138 v0.AddArg(x) 17139 v.AddArg(v0) 17140 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17141 v1.AddArg(y) 17142 v.AddArg(v1) 17143 return true 17144 } 17145 } 17146 func rewriteValueARM_OpRsh16x16_0(v *Value) bool { 17147 b := v.Block 17148 _ = b 17149 typ := &b.Func.Config.Types 17150 _ = typ 17151 // match: (Rsh16x16 x y) 17152 // cond: 17153 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 17154 for { 17155 _ = v.Args[1] 17156 x := v.Args[0] 17157 y := v.Args[1] 17158 v.reset(OpARMSRAcond) 17159 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 17160 v0.AddArg(x) 17161 v.AddArg(v0) 17162 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17163 v1.AddArg(y) 17164 v.AddArg(v1) 17165 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17166 v2.AuxInt = 256 17167 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17168 v3.AddArg(y) 17169 v2.AddArg(v3) 17170 v.AddArg(v2) 17171 return true 17172 } 17173 } 17174 func rewriteValueARM_OpRsh16x32_0(v *Value) bool { 17175 b := v.Block 17176 _ = b 17177 typ := &b.Func.Config.Types 17178 _ = typ 17179 // match: (Rsh16x32 x y) 17180 // cond: 17181 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 17182 for { 17183 _ = v.Args[1] 17184 x := v.Args[0] 17185 y := v.Args[1] 17186 v.reset(OpARMSRAcond) 17187 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 17188 v0.AddArg(x) 17189 v.AddArg(v0) 17190 v.AddArg(y) 17191 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17192 v1.AuxInt = 256 17193 v1.AddArg(y) 17194 v.AddArg(v1) 17195 return true 17196 } 17197 } 17198 func rewriteValueARM_OpRsh16x64_0(v *Value) bool { 17199 b := v.Block 17200 _ = b 17201 typ := &b.Func.Config.Types 17202 _ = typ 17203 // match: (Rsh16x64 x (Const64 [c])) 17204 // cond: uint64(c) < 16 17205 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [c+16]) 17206 for { 17207 _ = v.Args[1] 17208 x := v.Args[0] 17209 v_1 := v.Args[1] 17210 if v_1.Op != OpConst64 { 17211 break 17212 } 17213 c := v_1.AuxInt 17214 if !(uint64(c) < 16) { 17215 break 17216 } 17217 v.reset(OpARMSRAconst) 17218 v.AuxInt = c + 16 17219 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 17220 v0.AuxInt = 16 17221 v0.AddArg(x) 17222 v.AddArg(v0) 17223 return true 17224 } 17225 // match: (Rsh16x64 x (Const64 [c])) 17226 // cond: uint64(c) >= 16 17227 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [31]) 17228 for { 17229 _ = v.Args[1] 17230 x := v.Args[0] 17231 v_1 := v.Args[1] 17232 if v_1.Op != OpConst64 { 17233 break 17234 } 17235 c := v_1.AuxInt 17236 if !(uint64(c) >= 16) { 17237 break 17238 } 17239 v.reset(OpARMSRAconst) 17240 v.AuxInt = 31 17241 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 17242 v0.AuxInt = 16 17243 v0.AddArg(x) 17244 v.AddArg(v0) 17245 return true 17246 } 17247 return false 17248 } 17249 func rewriteValueARM_OpRsh16x8_0(v *Value) bool { 17250 b := v.Block 17251 _ = b 17252 typ := &b.Func.Config.Types 17253 _ = typ 17254 // match: (Rsh16x8 x y) 17255 // cond: 17256 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 17257 for { 17258 _ = v.Args[1] 17259 x := v.Args[0] 17260 y := v.Args[1] 17261 v.reset(OpARMSRA) 17262 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 17263 v0.AddArg(x) 17264 v.AddArg(v0) 17265 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17266 v1.AddArg(y) 17267 v.AddArg(v1) 17268 return true 17269 } 17270 } 17271 func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { 17272 b := v.Block 17273 _ = b 17274 typ := &b.Func.Config.Types 17275 _ = typ 17276 // match: (Rsh32Ux16 x y) 17277 // cond: 17278 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 17279 for { 17280 _ = v.Args[1] 17281 x := v.Args[0] 17282 y := v.Args[1] 17283 v.reset(OpARMCMOVWHSconst) 17284 v.AuxInt = 0 17285 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17286 v0.AddArg(x) 17287 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17288 v1.AddArg(y) 17289 v0.AddArg(v1) 17290 v.AddArg(v0) 17291 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17292 v2.AuxInt = 256 17293 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17294 v3.AddArg(y) 17295 v2.AddArg(v3) 17296 v.AddArg(v2) 17297 return true 17298 } 17299 } 17300 func rewriteValueARM_OpRsh32Ux32_0(v *Value) bool { 17301 b := v.Block 17302 _ = b 17303 // match: (Rsh32Ux32 x y) 17304 // cond: 17305 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 17306 for { 17307 _ = v.Args[1] 17308 x := v.Args[0] 17309 y := v.Args[1] 17310 v.reset(OpARMCMOVWHSconst) 17311 v.AuxInt = 0 17312 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17313 v0.AddArg(x) 17314 v0.AddArg(y) 17315 v.AddArg(v0) 17316 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17317 v1.AuxInt = 256 17318 v1.AddArg(y) 17319 v.AddArg(v1) 17320 return true 17321 } 17322 } 17323 func rewriteValueARM_OpRsh32Ux64_0(v *Value) bool { 17324 // match: (Rsh32Ux64 x (Const64 [c])) 17325 // cond: uint64(c) < 32 17326 // result: (SRLconst x [c]) 17327 for { 17328 _ = v.Args[1] 17329 x := v.Args[0] 17330 v_1 := v.Args[1] 17331 if v_1.Op != OpConst64 { 17332 break 17333 } 17334 c := v_1.AuxInt 17335 if !(uint64(c) < 32) { 17336 break 17337 } 17338 v.reset(OpARMSRLconst) 17339 v.AuxInt = c 17340 v.AddArg(x) 17341 return true 17342 } 17343 // match: (Rsh32Ux64 _ (Const64 [c])) 17344 // cond: uint64(c) >= 32 17345 // result: (Const32 [0]) 17346 for { 17347 _ = v.Args[1] 17348 v_1 := v.Args[1] 17349 if v_1.Op != OpConst64 { 17350 break 17351 } 17352 c := v_1.AuxInt 17353 if !(uint64(c) >= 32) { 17354 break 17355 } 17356 v.reset(OpConst32) 17357 v.AuxInt = 0 17358 return true 17359 } 17360 return false 17361 } 17362 func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { 17363 b := v.Block 17364 _ = b 17365 typ := &b.Func.Config.Types 17366 _ = typ 17367 // match: (Rsh32Ux8 x y) 17368 // cond: 17369 // result: (SRL x (ZeroExt8to32 y)) 17370 for { 17371 _ = v.Args[1] 17372 x := v.Args[0] 17373 y := v.Args[1] 17374 v.reset(OpARMSRL) 17375 v.AddArg(x) 17376 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17377 v0.AddArg(y) 17378 v.AddArg(v0) 17379 return true 17380 } 17381 } 17382 func rewriteValueARM_OpRsh32x16_0(v *Value) bool { 17383 b := v.Block 17384 _ = b 17385 typ := &b.Func.Config.Types 17386 _ = typ 17387 // match: (Rsh32x16 x y) 17388 // cond: 17389 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 17390 for { 17391 _ = v.Args[1] 17392 x := v.Args[0] 17393 y := v.Args[1] 17394 v.reset(OpARMSRAcond) 17395 v.AddArg(x) 17396 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17397 v0.AddArg(y) 17398 v.AddArg(v0) 17399 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17400 v1.AuxInt = 256 17401 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17402 v2.AddArg(y) 17403 v1.AddArg(v2) 17404 v.AddArg(v1) 17405 return true 17406 } 17407 } 17408 func rewriteValueARM_OpRsh32x32_0(v *Value) bool { 17409 b := v.Block 17410 _ = b 17411 // match: (Rsh32x32 x y) 17412 // cond: 17413 // result: (SRAcond x y (CMPconst [256] y)) 17414 for { 17415 _ = v.Args[1] 17416 x := v.Args[0] 17417 y := v.Args[1] 17418 v.reset(OpARMSRAcond) 17419 v.AddArg(x) 17420 v.AddArg(y) 17421 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17422 v0.AuxInt = 256 17423 v0.AddArg(y) 17424 v.AddArg(v0) 17425 return true 17426 } 17427 } 17428 func rewriteValueARM_OpRsh32x64_0(v *Value) bool { 17429 // match: (Rsh32x64 x (Const64 [c])) 17430 // cond: uint64(c) < 32 17431 // result: (SRAconst x [c]) 17432 for { 17433 _ = v.Args[1] 17434 x := v.Args[0] 17435 v_1 := v.Args[1] 17436 if v_1.Op != OpConst64 { 17437 break 17438 } 17439 c := v_1.AuxInt 17440 if !(uint64(c) < 32) { 17441 break 17442 } 17443 v.reset(OpARMSRAconst) 17444 v.AuxInt = c 17445 v.AddArg(x) 17446 return true 17447 } 17448 // match: (Rsh32x64 x (Const64 [c])) 17449 // cond: uint64(c) >= 32 17450 // result: (SRAconst x [31]) 17451 for { 17452 _ = v.Args[1] 17453 x := v.Args[0] 17454 v_1 := v.Args[1] 17455 if v_1.Op != OpConst64 { 17456 break 17457 } 17458 c := v_1.AuxInt 17459 if !(uint64(c) >= 32) { 17460 break 17461 } 17462 v.reset(OpARMSRAconst) 17463 v.AuxInt = 31 17464 v.AddArg(x) 17465 return true 17466 } 17467 return false 17468 } 17469 func rewriteValueARM_OpRsh32x8_0(v *Value) bool { 17470 b := v.Block 17471 _ = b 17472 typ := &b.Func.Config.Types 17473 _ = typ 17474 // match: (Rsh32x8 x y) 17475 // cond: 17476 // result: (SRA x (ZeroExt8to32 y)) 17477 for { 17478 _ = v.Args[1] 17479 x := v.Args[0] 17480 y := v.Args[1] 17481 v.reset(OpARMSRA) 17482 v.AddArg(x) 17483 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17484 v0.AddArg(y) 17485 v.AddArg(v0) 17486 return true 17487 } 17488 } 17489 func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { 17490 b := v.Block 17491 _ = b 17492 typ := &b.Func.Config.Types 17493 _ = typ 17494 // match: (Rsh8Ux16 x y) 17495 // cond: 17496 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 17497 for { 17498 _ = v.Args[1] 17499 x := v.Args[0] 17500 y := v.Args[1] 17501 v.reset(OpARMCMOVWHSconst) 17502 v.AuxInt = 0 17503 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17504 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17505 v1.AddArg(x) 17506 v0.AddArg(v1) 17507 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17508 v2.AddArg(y) 17509 v0.AddArg(v2) 17510 v.AddArg(v0) 17511 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17512 v3.AuxInt = 256 17513 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17514 v4.AddArg(y) 17515 v3.AddArg(v4) 17516 v.AddArg(v3) 17517 return true 17518 } 17519 } 17520 func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { 17521 b := v.Block 17522 _ = b 17523 typ := &b.Func.Config.Types 17524 _ = typ 17525 // match: (Rsh8Ux32 x y) 17526 // cond: 17527 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 17528 for { 17529 _ = v.Args[1] 17530 x := v.Args[0] 17531 y := v.Args[1] 17532 v.reset(OpARMCMOVWHSconst) 17533 v.AuxInt = 0 17534 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17535 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17536 v1.AddArg(x) 17537 v0.AddArg(v1) 17538 v0.AddArg(y) 17539 v.AddArg(v0) 17540 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17541 v2.AuxInt = 256 17542 v2.AddArg(y) 17543 v.AddArg(v2) 17544 return true 17545 } 17546 } 17547 func rewriteValueARM_OpRsh8Ux64_0(v *Value) bool { 17548 b := v.Block 17549 _ = b 17550 typ := &b.Func.Config.Types 17551 _ = typ 17552 // match: (Rsh8Ux64 x (Const64 [c])) 17553 // cond: uint64(c) < 8 17554 // result: (SRLconst (SLLconst <typ.UInt32> x [24]) [c+24]) 17555 for { 17556 _ = v.Args[1] 17557 x := v.Args[0] 17558 v_1 := v.Args[1] 17559 if v_1.Op != OpConst64 { 17560 break 17561 } 17562 c := v_1.AuxInt 17563 if !(uint64(c) < 8) { 17564 break 17565 } 17566 v.reset(OpARMSRLconst) 17567 v.AuxInt = c + 24 17568 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 17569 v0.AuxInt = 24 17570 v0.AddArg(x) 17571 v.AddArg(v0) 17572 return true 17573 } 17574 // match: (Rsh8Ux64 _ (Const64 [c])) 17575 // cond: uint64(c) >= 8 17576 // result: (Const8 [0]) 17577 for { 17578 _ = v.Args[1] 17579 v_1 := v.Args[1] 17580 if v_1.Op != OpConst64 { 17581 break 17582 } 17583 c := v_1.AuxInt 17584 if !(uint64(c) >= 8) { 17585 break 17586 } 17587 v.reset(OpConst8) 17588 v.AuxInt = 0 17589 return true 17590 } 17591 return false 17592 } 17593 func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { 17594 b := v.Block 17595 _ = b 17596 typ := &b.Func.Config.Types 17597 _ = typ 17598 // match: (Rsh8Ux8 x y) 17599 // cond: 17600 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 17601 for { 17602 _ = v.Args[1] 17603 x := v.Args[0] 17604 y := v.Args[1] 17605 v.reset(OpARMSRL) 17606 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17607 v0.AddArg(x) 17608 v.AddArg(v0) 17609 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17610 v1.AddArg(y) 17611 v.AddArg(v1) 17612 return true 17613 } 17614 } 17615 func rewriteValueARM_OpRsh8x16_0(v *Value) bool { 17616 b := v.Block 17617 _ = b 17618 typ := &b.Func.Config.Types 17619 _ = typ 17620 // match: (Rsh8x16 x y) 17621 // cond: 17622 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 17623 for { 17624 _ = v.Args[1] 17625 x := v.Args[0] 17626 y := v.Args[1] 17627 v.reset(OpARMSRAcond) 17628 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 17629 v0.AddArg(x) 17630 v.AddArg(v0) 17631 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17632 v1.AddArg(y) 17633 v.AddArg(v1) 17634 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17635 v2.AuxInt = 256 17636 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 17637 v3.AddArg(y) 17638 v2.AddArg(v3) 17639 v.AddArg(v2) 17640 return true 17641 } 17642 } 17643 func rewriteValueARM_OpRsh8x32_0(v *Value) bool { 17644 b := v.Block 17645 _ = b 17646 typ := &b.Func.Config.Types 17647 _ = typ 17648 // match: (Rsh8x32 x y) 17649 // cond: 17650 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 17651 for { 17652 _ = v.Args[1] 17653 x := v.Args[0] 17654 y := v.Args[1] 17655 v.reset(OpARMSRAcond) 17656 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 17657 v0.AddArg(x) 17658 v.AddArg(v0) 17659 v.AddArg(y) 17660 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 17661 v1.AuxInt = 256 17662 v1.AddArg(y) 17663 v.AddArg(v1) 17664 return true 17665 } 17666 } 17667 func rewriteValueARM_OpRsh8x64_0(v *Value) bool { 17668 b := v.Block 17669 _ = b 17670 typ := &b.Func.Config.Types 17671 _ = typ 17672 // match: (Rsh8x64 x (Const64 [c])) 17673 // cond: uint64(c) < 8 17674 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [c+24]) 17675 for { 17676 _ = v.Args[1] 17677 x := v.Args[0] 17678 v_1 := v.Args[1] 17679 if v_1.Op != OpConst64 { 17680 break 17681 } 17682 c := v_1.AuxInt 17683 if !(uint64(c) < 8) { 17684 break 17685 } 17686 v.reset(OpARMSRAconst) 17687 v.AuxInt = c + 24 17688 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 17689 v0.AuxInt = 24 17690 v0.AddArg(x) 17691 v.AddArg(v0) 17692 return true 17693 } 17694 // match: (Rsh8x64 x (Const64 [c])) 17695 // cond: uint64(c) >= 8 17696 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [31]) 17697 for { 17698 _ = v.Args[1] 17699 x := v.Args[0] 17700 v_1 := v.Args[1] 17701 if v_1.Op != OpConst64 { 17702 break 17703 } 17704 c := v_1.AuxInt 17705 if !(uint64(c) >= 8) { 17706 break 17707 } 17708 v.reset(OpARMSRAconst) 17709 v.AuxInt = 31 17710 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 17711 v0.AuxInt = 24 17712 v0.AddArg(x) 17713 v.AddArg(v0) 17714 return true 17715 } 17716 return false 17717 } 17718 func rewriteValueARM_OpRsh8x8_0(v *Value) bool { 17719 b := v.Block 17720 _ = b 17721 typ := &b.Func.Config.Types 17722 _ = typ 17723 // match: (Rsh8x8 x y) 17724 // cond: 17725 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 17726 for { 17727 _ = v.Args[1] 17728 x := v.Args[0] 17729 y := v.Args[1] 17730 v.reset(OpARMSRA) 17731 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 17732 v0.AddArg(x) 17733 v.AddArg(v0) 17734 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 17735 v1.AddArg(y) 17736 v.AddArg(v1) 17737 return true 17738 } 17739 } 17740 func rewriteValueARM_OpSelect0_0(v *Value) bool { 17741 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 17742 // cond: 17743 // result: x 17744 for { 17745 v_0 := v.Args[0] 17746 if v_0.Op != OpARMCALLudiv { 17747 break 17748 } 17749 _ = v_0.Args[1] 17750 x := v_0.Args[0] 17751 v_0_1 := v_0.Args[1] 17752 if v_0_1.Op != OpARMMOVWconst { 17753 break 17754 } 17755 if v_0_1.AuxInt != 1 { 17756 break 17757 } 17758 v.reset(OpCopy) 17759 v.Type = x.Type 17760 v.AddArg(x) 17761 return true 17762 } 17763 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 17764 // cond: isPowerOfTwo(c) 17765 // result: (SRLconst [log2(c)] x) 17766 for { 17767 v_0 := v.Args[0] 17768 if v_0.Op != OpARMCALLudiv { 17769 break 17770 } 17771 _ = v_0.Args[1] 17772 x := v_0.Args[0] 17773 v_0_1 := v_0.Args[1] 17774 if v_0_1.Op != OpARMMOVWconst { 17775 break 17776 } 17777 c := v_0_1.AuxInt 17778 if !(isPowerOfTwo(c)) { 17779 break 17780 } 17781 v.reset(OpARMSRLconst) 17782 v.AuxInt = log2(c) 17783 v.AddArg(x) 17784 return true 17785 } 17786 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 17787 // cond: 17788 // result: (MOVWconst [int64(uint32(c)/uint32(d))]) 17789 for { 17790 v_0 := v.Args[0] 17791 if v_0.Op != OpARMCALLudiv { 17792 break 17793 } 17794 _ = v_0.Args[1] 17795 v_0_0 := v_0.Args[0] 17796 if v_0_0.Op != OpARMMOVWconst { 17797 break 17798 } 17799 c := v_0_0.AuxInt 17800 v_0_1 := v_0.Args[1] 17801 if v_0_1.Op != OpARMMOVWconst { 17802 break 17803 } 17804 d := v_0_1.AuxInt 17805 v.reset(OpARMMOVWconst) 17806 v.AuxInt = int64(uint32(c) / uint32(d)) 17807 return true 17808 } 17809 return false 17810 } 17811 func rewriteValueARM_OpSelect1_0(v *Value) bool { 17812 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 17813 // cond: 17814 // result: (MOVWconst [0]) 17815 for { 17816 v_0 := v.Args[0] 17817 if v_0.Op != OpARMCALLudiv { 17818 break 17819 } 17820 _ = v_0.Args[1] 17821 v_0_1 := v_0.Args[1] 17822 if v_0_1.Op != OpARMMOVWconst { 17823 break 17824 } 17825 if v_0_1.AuxInt != 1 { 17826 break 17827 } 17828 v.reset(OpARMMOVWconst) 17829 v.AuxInt = 0 17830 return true 17831 } 17832 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 17833 // cond: isPowerOfTwo(c) 17834 // result: (ANDconst [c-1] x) 17835 for { 17836 v_0 := v.Args[0] 17837 if v_0.Op != OpARMCALLudiv { 17838 break 17839 } 17840 _ = v_0.Args[1] 17841 x := v_0.Args[0] 17842 v_0_1 := v_0.Args[1] 17843 if v_0_1.Op != OpARMMOVWconst { 17844 break 17845 } 17846 c := v_0_1.AuxInt 17847 if !(isPowerOfTwo(c)) { 17848 break 17849 } 17850 v.reset(OpARMANDconst) 17851 v.AuxInt = c - 1 17852 v.AddArg(x) 17853 return true 17854 } 17855 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 17856 // cond: 17857 // result: (MOVWconst [int64(uint32(c)%uint32(d))]) 17858 for { 17859 v_0 := v.Args[0] 17860 if v_0.Op != OpARMCALLudiv { 17861 break 17862 } 17863 _ = v_0.Args[1] 17864 v_0_0 := v_0.Args[0] 17865 if v_0_0.Op != OpARMMOVWconst { 17866 break 17867 } 17868 c := v_0_0.AuxInt 17869 v_0_1 := v_0.Args[1] 17870 if v_0_1.Op != OpARMMOVWconst { 17871 break 17872 } 17873 d := v_0_1.AuxInt 17874 v.reset(OpARMMOVWconst) 17875 v.AuxInt = int64(uint32(c) % uint32(d)) 17876 return true 17877 } 17878 return false 17879 } 17880 func rewriteValueARM_OpSignExt16to32_0(v *Value) bool { 17881 // match: (SignExt16to32 x) 17882 // cond: 17883 // result: (MOVHreg x) 17884 for { 17885 x := v.Args[0] 17886 v.reset(OpARMMOVHreg) 17887 v.AddArg(x) 17888 return true 17889 } 17890 } 17891 func rewriteValueARM_OpSignExt8to16_0(v *Value) bool { 17892 // match: (SignExt8to16 x) 17893 // cond: 17894 // result: (MOVBreg x) 17895 for { 17896 x := v.Args[0] 17897 v.reset(OpARMMOVBreg) 17898 v.AddArg(x) 17899 return true 17900 } 17901 } 17902 func rewriteValueARM_OpSignExt8to32_0(v *Value) bool { 17903 // match: (SignExt8to32 x) 17904 // cond: 17905 // result: (MOVBreg x) 17906 for { 17907 x := v.Args[0] 17908 v.reset(OpARMMOVBreg) 17909 v.AddArg(x) 17910 return true 17911 } 17912 } 17913 func rewriteValueARM_OpSignmask_0(v *Value) bool { 17914 // match: (Signmask x) 17915 // cond: 17916 // result: (SRAconst x [31]) 17917 for { 17918 x := v.Args[0] 17919 v.reset(OpARMSRAconst) 17920 v.AuxInt = 31 17921 v.AddArg(x) 17922 return true 17923 } 17924 } 17925 func rewriteValueARM_OpSlicemask_0(v *Value) bool { 17926 b := v.Block 17927 _ = b 17928 // match: (Slicemask <t> x) 17929 // cond: 17930 // result: (SRAconst (RSBconst <t> [0] x) [31]) 17931 for { 17932 t := v.Type 17933 x := v.Args[0] 17934 v.reset(OpARMSRAconst) 17935 v.AuxInt = 31 17936 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 17937 v0.AuxInt = 0 17938 v0.AddArg(x) 17939 v.AddArg(v0) 17940 return true 17941 } 17942 } 17943 func rewriteValueARM_OpSqrt_0(v *Value) bool { 17944 // match: (Sqrt x) 17945 // cond: 17946 // result: (SQRTD x) 17947 for { 17948 x := v.Args[0] 17949 v.reset(OpARMSQRTD) 17950 v.AddArg(x) 17951 return true 17952 } 17953 } 17954 func rewriteValueARM_OpStaticCall_0(v *Value) bool { 17955 // match: (StaticCall [argwid] {target} mem) 17956 // cond: 17957 // result: (CALLstatic [argwid] {target} mem) 17958 for { 17959 argwid := v.AuxInt 17960 target := v.Aux 17961 mem := v.Args[0] 17962 v.reset(OpARMCALLstatic) 17963 v.AuxInt = argwid 17964 v.Aux = target 17965 v.AddArg(mem) 17966 return true 17967 } 17968 } 17969 func rewriteValueARM_OpStore_0(v *Value) bool { 17970 // match: (Store {t} ptr val mem) 17971 // cond: t.(*types.Type).Size() == 1 17972 // result: (MOVBstore ptr val mem) 17973 for { 17974 t := v.Aux 17975 _ = v.Args[2] 17976 ptr := v.Args[0] 17977 val := v.Args[1] 17978 mem := v.Args[2] 17979 if !(t.(*types.Type).Size() == 1) { 17980 break 17981 } 17982 v.reset(OpARMMOVBstore) 17983 v.AddArg(ptr) 17984 v.AddArg(val) 17985 v.AddArg(mem) 17986 return true 17987 } 17988 // match: (Store {t} ptr val mem) 17989 // cond: t.(*types.Type).Size() == 2 17990 // result: (MOVHstore ptr val mem) 17991 for { 17992 t := v.Aux 17993 _ = v.Args[2] 17994 ptr := v.Args[0] 17995 val := v.Args[1] 17996 mem := v.Args[2] 17997 if !(t.(*types.Type).Size() == 2) { 17998 break 17999 } 18000 v.reset(OpARMMOVHstore) 18001 v.AddArg(ptr) 18002 v.AddArg(val) 18003 v.AddArg(mem) 18004 return true 18005 } 18006 // match: (Store {t} ptr val mem) 18007 // cond: t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type) 18008 // result: (MOVWstore ptr val mem) 18009 for { 18010 t := v.Aux 18011 _ = v.Args[2] 18012 ptr := v.Args[0] 18013 val := v.Args[1] 18014 mem := v.Args[2] 18015 if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { 18016 break 18017 } 18018 v.reset(OpARMMOVWstore) 18019 v.AddArg(ptr) 18020 v.AddArg(val) 18021 v.AddArg(mem) 18022 return true 18023 } 18024 // match: (Store {t} ptr val mem) 18025 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 18026 // result: (MOVFstore ptr val mem) 18027 for { 18028 t := v.Aux 18029 _ = v.Args[2] 18030 ptr := v.Args[0] 18031 val := v.Args[1] 18032 mem := v.Args[2] 18033 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 18034 break 18035 } 18036 v.reset(OpARMMOVFstore) 18037 v.AddArg(ptr) 18038 v.AddArg(val) 18039 v.AddArg(mem) 18040 return true 18041 } 18042 // match: (Store {t} ptr val mem) 18043 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 18044 // result: (MOVDstore ptr val mem) 18045 for { 18046 t := v.Aux 18047 _ = v.Args[2] 18048 ptr := v.Args[0] 18049 val := v.Args[1] 18050 mem := v.Args[2] 18051 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 18052 break 18053 } 18054 v.reset(OpARMMOVDstore) 18055 v.AddArg(ptr) 18056 v.AddArg(val) 18057 v.AddArg(mem) 18058 return true 18059 } 18060 return false 18061 } 18062 func rewriteValueARM_OpSub16_0(v *Value) bool { 18063 // match: (Sub16 x y) 18064 // cond: 18065 // result: (SUB x y) 18066 for { 18067 _ = v.Args[1] 18068 x := v.Args[0] 18069 y := v.Args[1] 18070 v.reset(OpARMSUB) 18071 v.AddArg(x) 18072 v.AddArg(y) 18073 return true 18074 } 18075 } 18076 func rewriteValueARM_OpSub32_0(v *Value) bool { 18077 // match: (Sub32 x y) 18078 // cond: 18079 // result: (SUB x y) 18080 for { 18081 _ = v.Args[1] 18082 x := v.Args[0] 18083 y := v.Args[1] 18084 v.reset(OpARMSUB) 18085 v.AddArg(x) 18086 v.AddArg(y) 18087 return true 18088 } 18089 } 18090 func rewriteValueARM_OpSub32F_0(v *Value) bool { 18091 // match: (Sub32F x y) 18092 // cond: 18093 // result: (SUBF x y) 18094 for { 18095 _ = v.Args[1] 18096 x := v.Args[0] 18097 y := v.Args[1] 18098 v.reset(OpARMSUBF) 18099 v.AddArg(x) 18100 v.AddArg(y) 18101 return true 18102 } 18103 } 18104 func rewriteValueARM_OpSub32carry_0(v *Value) bool { 18105 // match: (Sub32carry x y) 18106 // cond: 18107 // result: (SUBS x y) 18108 for { 18109 _ = v.Args[1] 18110 x := v.Args[0] 18111 y := v.Args[1] 18112 v.reset(OpARMSUBS) 18113 v.AddArg(x) 18114 v.AddArg(y) 18115 return true 18116 } 18117 } 18118 func rewriteValueARM_OpSub32withcarry_0(v *Value) bool { 18119 // match: (Sub32withcarry x y c) 18120 // cond: 18121 // result: (SBC x y c) 18122 for { 18123 _ = v.Args[2] 18124 x := v.Args[0] 18125 y := v.Args[1] 18126 c := v.Args[2] 18127 v.reset(OpARMSBC) 18128 v.AddArg(x) 18129 v.AddArg(y) 18130 v.AddArg(c) 18131 return true 18132 } 18133 } 18134 func rewriteValueARM_OpSub64F_0(v *Value) bool { 18135 // match: (Sub64F x y) 18136 // cond: 18137 // result: (SUBD x y) 18138 for { 18139 _ = v.Args[1] 18140 x := v.Args[0] 18141 y := v.Args[1] 18142 v.reset(OpARMSUBD) 18143 v.AddArg(x) 18144 v.AddArg(y) 18145 return true 18146 } 18147 } 18148 func rewriteValueARM_OpSub8_0(v *Value) bool { 18149 // match: (Sub8 x y) 18150 // cond: 18151 // result: (SUB x y) 18152 for { 18153 _ = v.Args[1] 18154 x := v.Args[0] 18155 y := v.Args[1] 18156 v.reset(OpARMSUB) 18157 v.AddArg(x) 18158 v.AddArg(y) 18159 return true 18160 } 18161 } 18162 func rewriteValueARM_OpSubPtr_0(v *Value) bool { 18163 // match: (SubPtr x y) 18164 // cond: 18165 // result: (SUB x y) 18166 for { 18167 _ = v.Args[1] 18168 x := v.Args[0] 18169 y := v.Args[1] 18170 v.reset(OpARMSUB) 18171 v.AddArg(x) 18172 v.AddArg(y) 18173 return true 18174 } 18175 } 18176 func rewriteValueARM_OpTrunc16to8_0(v *Value) bool { 18177 // match: (Trunc16to8 x) 18178 // cond: 18179 // result: x 18180 for { 18181 x := v.Args[0] 18182 v.reset(OpCopy) 18183 v.Type = x.Type 18184 v.AddArg(x) 18185 return true 18186 } 18187 } 18188 func rewriteValueARM_OpTrunc32to16_0(v *Value) bool { 18189 // match: (Trunc32to16 x) 18190 // cond: 18191 // result: x 18192 for { 18193 x := v.Args[0] 18194 v.reset(OpCopy) 18195 v.Type = x.Type 18196 v.AddArg(x) 18197 return true 18198 } 18199 } 18200 func rewriteValueARM_OpTrunc32to8_0(v *Value) bool { 18201 // match: (Trunc32to8 x) 18202 // cond: 18203 // result: x 18204 for { 18205 x := v.Args[0] 18206 v.reset(OpCopy) 18207 v.Type = x.Type 18208 v.AddArg(x) 18209 return true 18210 } 18211 } 18212 func rewriteValueARM_OpXor16_0(v *Value) bool { 18213 // match: (Xor16 x y) 18214 // cond: 18215 // result: (XOR x y) 18216 for { 18217 _ = v.Args[1] 18218 x := v.Args[0] 18219 y := v.Args[1] 18220 v.reset(OpARMXOR) 18221 v.AddArg(x) 18222 v.AddArg(y) 18223 return true 18224 } 18225 } 18226 func rewriteValueARM_OpXor32_0(v *Value) bool { 18227 // match: (Xor32 x y) 18228 // cond: 18229 // result: (XOR x y) 18230 for { 18231 _ = v.Args[1] 18232 x := v.Args[0] 18233 y := v.Args[1] 18234 v.reset(OpARMXOR) 18235 v.AddArg(x) 18236 v.AddArg(y) 18237 return true 18238 } 18239 } 18240 func rewriteValueARM_OpXor8_0(v *Value) bool { 18241 // match: (Xor8 x y) 18242 // cond: 18243 // result: (XOR x y) 18244 for { 18245 _ = v.Args[1] 18246 x := v.Args[0] 18247 y := v.Args[1] 18248 v.reset(OpARMXOR) 18249 v.AddArg(x) 18250 v.AddArg(y) 18251 return true 18252 } 18253 } 18254 func rewriteValueARM_OpZero_0(v *Value) bool { 18255 b := v.Block 18256 _ = b 18257 config := b.Func.Config 18258 _ = config 18259 typ := &b.Func.Config.Types 18260 _ = typ 18261 // match: (Zero [0] _ mem) 18262 // cond: 18263 // result: mem 18264 for { 18265 if v.AuxInt != 0 { 18266 break 18267 } 18268 _ = v.Args[1] 18269 mem := v.Args[1] 18270 v.reset(OpCopy) 18271 v.Type = mem.Type 18272 v.AddArg(mem) 18273 return true 18274 } 18275 // match: (Zero [1] ptr mem) 18276 // cond: 18277 // result: (MOVBstore ptr (MOVWconst [0]) mem) 18278 for { 18279 if v.AuxInt != 1 { 18280 break 18281 } 18282 _ = v.Args[1] 18283 ptr := v.Args[0] 18284 mem := v.Args[1] 18285 v.reset(OpARMMOVBstore) 18286 v.AddArg(ptr) 18287 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18288 v0.AuxInt = 0 18289 v.AddArg(v0) 18290 v.AddArg(mem) 18291 return true 18292 } 18293 // match: (Zero [2] {t} ptr mem) 18294 // cond: t.(*types.Type).Alignment()%2 == 0 18295 // result: (MOVHstore ptr (MOVWconst [0]) mem) 18296 for { 18297 if v.AuxInt != 2 { 18298 break 18299 } 18300 t := v.Aux 18301 _ = v.Args[1] 18302 ptr := v.Args[0] 18303 mem := v.Args[1] 18304 if !(t.(*types.Type).Alignment()%2 == 0) { 18305 break 18306 } 18307 v.reset(OpARMMOVHstore) 18308 v.AddArg(ptr) 18309 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18310 v0.AuxInt = 0 18311 v.AddArg(v0) 18312 v.AddArg(mem) 18313 return true 18314 } 18315 // match: (Zero [2] ptr mem) 18316 // cond: 18317 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 18318 for { 18319 if v.AuxInt != 2 { 18320 break 18321 } 18322 _ = v.Args[1] 18323 ptr := v.Args[0] 18324 mem := v.Args[1] 18325 v.reset(OpARMMOVBstore) 18326 v.AuxInt = 1 18327 v.AddArg(ptr) 18328 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18329 v0.AuxInt = 0 18330 v.AddArg(v0) 18331 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 18332 v1.AuxInt = 0 18333 v1.AddArg(ptr) 18334 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18335 v2.AuxInt = 0 18336 v1.AddArg(v2) 18337 v1.AddArg(mem) 18338 v.AddArg(v1) 18339 return true 18340 } 18341 // match: (Zero [4] {t} ptr mem) 18342 // cond: t.(*types.Type).Alignment()%4 == 0 18343 // result: (MOVWstore ptr (MOVWconst [0]) mem) 18344 for { 18345 if v.AuxInt != 4 { 18346 break 18347 } 18348 t := v.Aux 18349 _ = v.Args[1] 18350 ptr := v.Args[0] 18351 mem := v.Args[1] 18352 if !(t.(*types.Type).Alignment()%4 == 0) { 18353 break 18354 } 18355 v.reset(OpARMMOVWstore) 18356 v.AddArg(ptr) 18357 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18358 v0.AuxInt = 0 18359 v.AddArg(v0) 18360 v.AddArg(mem) 18361 return true 18362 } 18363 // match: (Zero [4] {t} ptr mem) 18364 // cond: t.(*types.Type).Alignment()%2 == 0 18365 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 18366 for { 18367 if v.AuxInt != 4 { 18368 break 18369 } 18370 t := v.Aux 18371 _ = v.Args[1] 18372 ptr := v.Args[0] 18373 mem := v.Args[1] 18374 if !(t.(*types.Type).Alignment()%2 == 0) { 18375 break 18376 } 18377 v.reset(OpARMMOVHstore) 18378 v.AuxInt = 2 18379 v.AddArg(ptr) 18380 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18381 v0.AuxInt = 0 18382 v.AddArg(v0) 18383 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 18384 v1.AuxInt = 0 18385 v1.AddArg(ptr) 18386 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18387 v2.AuxInt = 0 18388 v1.AddArg(v2) 18389 v1.AddArg(mem) 18390 v.AddArg(v1) 18391 return true 18392 } 18393 // match: (Zero [4] ptr mem) 18394 // cond: 18395 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 18396 for { 18397 if v.AuxInt != 4 { 18398 break 18399 } 18400 _ = v.Args[1] 18401 ptr := v.Args[0] 18402 mem := v.Args[1] 18403 v.reset(OpARMMOVBstore) 18404 v.AuxInt = 3 18405 v.AddArg(ptr) 18406 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18407 v0.AuxInt = 0 18408 v.AddArg(v0) 18409 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 18410 v1.AuxInt = 2 18411 v1.AddArg(ptr) 18412 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18413 v2.AuxInt = 0 18414 v1.AddArg(v2) 18415 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 18416 v3.AuxInt = 1 18417 v3.AddArg(ptr) 18418 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18419 v4.AuxInt = 0 18420 v3.AddArg(v4) 18421 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 18422 v5.AuxInt = 0 18423 v5.AddArg(ptr) 18424 v6 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18425 v6.AuxInt = 0 18426 v5.AddArg(v6) 18427 v5.AddArg(mem) 18428 v3.AddArg(v5) 18429 v1.AddArg(v3) 18430 v.AddArg(v1) 18431 return true 18432 } 18433 // match: (Zero [3] ptr mem) 18434 // cond: 18435 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 18436 for { 18437 if v.AuxInt != 3 { 18438 break 18439 } 18440 _ = v.Args[1] 18441 ptr := v.Args[0] 18442 mem := v.Args[1] 18443 v.reset(OpARMMOVBstore) 18444 v.AuxInt = 2 18445 v.AddArg(ptr) 18446 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18447 v0.AuxInt = 0 18448 v.AddArg(v0) 18449 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 18450 v1.AuxInt = 1 18451 v1.AddArg(ptr) 18452 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18453 v2.AuxInt = 0 18454 v1.AddArg(v2) 18455 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 18456 v3.AuxInt = 0 18457 v3.AddArg(ptr) 18458 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18459 v4.AuxInt = 0 18460 v3.AddArg(v4) 18461 v3.AddArg(mem) 18462 v1.AddArg(v3) 18463 v.AddArg(v1) 18464 return true 18465 } 18466 // match: (Zero [s] {t} ptr mem) 18467 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 18468 // result: (DUFFZERO [4 * (128 - int64(s/4))] ptr (MOVWconst [0]) mem) 18469 for { 18470 s := v.AuxInt 18471 t := v.Aux 18472 _ = v.Args[1] 18473 ptr := v.Args[0] 18474 mem := v.Args[1] 18475 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 18476 break 18477 } 18478 v.reset(OpARMDUFFZERO) 18479 v.AuxInt = 4 * (128 - int64(s/4)) 18480 v.AddArg(ptr) 18481 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18482 v0.AuxInt = 0 18483 v.AddArg(v0) 18484 v.AddArg(mem) 18485 return true 18486 } 18487 // match: (Zero [s] {t} ptr mem) 18488 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 18489 // result: (LoweredZero [t.(*types.Type).Alignment()] ptr (ADDconst <ptr.Type> ptr [s-moveSize(t.(*types.Type).Alignment(), config)]) (MOVWconst [0]) mem) 18490 for { 18491 s := v.AuxInt 18492 t := v.Aux 18493 _ = v.Args[1] 18494 ptr := v.Args[0] 18495 mem := v.Args[1] 18496 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 18497 break 18498 } 18499 v.reset(OpARMLoweredZero) 18500 v.AuxInt = t.(*types.Type).Alignment() 18501 v.AddArg(ptr) 18502 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 18503 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 18504 v0.AddArg(ptr) 18505 v.AddArg(v0) 18506 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 18507 v1.AuxInt = 0 18508 v.AddArg(v1) 18509 v.AddArg(mem) 18510 return true 18511 } 18512 return false 18513 } 18514 func rewriteValueARM_OpZeroExt16to32_0(v *Value) bool { 18515 // match: (ZeroExt16to32 x) 18516 // cond: 18517 // result: (MOVHUreg x) 18518 for { 18519 x := v.Args[0] 18520 v.reset(OpARMMOVHUreg) 18521 v.AddArg(x) 18522 return true 18523 } 18524 } 18525 func rewriteValueARM_OpZeroExt8to16_0(v *Value) bool { 18526 // match: (ZeroExt8to16 x) 18527 // cond: 18528 // result: (MOVBUreg x) 18529 for { 18530 x := v.Args[0] 18531 v.reset(OpARMMOVBUreg) 18532 v.AddArg(x) 18533 return true 18534 } 18535 } 18536 func rewriteValueARM_OpZeroExt8to32_0(v *Value) bool { 18537 // match: (ZeroExt8to32 x) 18538 // cond: 18539 // result: (MOVBUreg x) 18540 for { 18541 x := v.Args[0] 18542 v.reset(OpARMMOVBUreg) 18543 v.AddArg(x) 18544 return true 18545 } 18546 } 18547 func rewriteValueARM_OpZeromask_0(v *Value) bool { 18548 b := v.Block 18549 _ = b 18550 typ := &b.Func.Config.Types 18551 _ = typ 18552 // match: (Zeromask x) 18553 // cond: 18554 // result: (SRAconst (RSBshiftRL <typ.Int32> x x [1]) [31]) 18555 for { 18556 x := v.Args[0] 18557 v.reset(OpARMSRAconst) 18558 v.AuxInt = 31 18559 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32) 18560 v0.AuxInt = 1 18561 v0.AddArg(x) 18562 v0.AddArg(x) 18563 v.AddArg(v0) 18564 return true 18565 } 18566 } 18567 func rewriteBlockARM(b *Block) bool { 18568 config := b.Func.Config 18569 _ = config 18570 fe := b.Func.fe 18571 _ = fe 18572 typ := &config.Types 18573 _ = typ 18574 switch b.Kind { 18575 case BlockARMEQ: 18576 // match: (EQ (FlagEQ) yes no) 18577 // cond: 18578 // result: (First nil yes no) 18579 for { 18580 v := b.Control 18581 if v.Op != OpARMFlagEQ { 18582 break 18583 } 18584 b.Kind = BlockFirst 18585 b.SetControl(nil) 18586 return true 18587 } 18588 // match: (EQ (FlagLT_ULT) yes no) 18589 // cond: 18590 // result: (First nil no yes) 18591 for { 18592 v := b.Control 18593 if v.Op != OpARMFlagLT_ULT { 18594 break 18595 } 18596 b.Kind = BlockFirst 18597 b.SetControl(nil) 18598 b.swapSuccessors() 18599 return true 18600 } 18601 // match: (EQ (FlagLT_UGT) yes no) 18602 // cond: 18603 // result: (First nil no yes) 18604 for { 18605 v := b.Control 18606 if v.Op != OpARMFlagLT_UGT { 18607 break 18608 } 18609 b.Kind = BlockFirst 18610 b.SetControl(nil) 18611 b.swapSuccessors() 18612 return true 18613 } 18614 // match: (EQ (FlagGT_ULT) yes no) 18615 // cond: 18616 // result: (First nil no yes) 18617 for { 18618 v := b.Control 18619 if v.Op != OpARMFlagGT_ULT { 18620 break 18621 } 18622 b.Kind = BlockFirst 18623 b.SetControl(nil) 18624 b.swapSuccessors() 18625 return true 18626 } 18627 // match: (EQ (FlagGT_UGT) yes no) 18628 // cond: 18629 // result: (First nil no yes) 18630 for { 18631 v := b.Control 18632 if v.Op != OpARMFlagGT_UGT { 18633 break 18634 } 18635 b.Kind = BlockFirst 18636 b.SetControl(nil) 18637 b.swapSuccessors() 18638 return true 18639 } 18640 // match: (EQ (InvertFlags cmp) yes no) 18641 // cond: 18642 // result: (EQ cmp yes no) 18643 for { 18644 v := b.Control 18645 if v.Op != OpARMInvertFlags { 18646 break 18647 } 18648 cmp := v.Args[0] 18649 b.Kind = BlockARMEQ 18650 b.SetControl(cmp) 18651 return true 18652 } 18653 case BlockARMGE: 18654 // match: (GE (FlagEQ) yes no) 18655 // cond: 18656 // result: (First nil yes no) 18657 for { 18658 v := b.Control 18659 if v.Op != OpARMFlagEQ { 18660 break 18661 } 18662 b.Kind = BlockFirst 18663 b.SetControl(nil) 18664 return true 18665 } 18666 // match: (GE (FlagLT_ULT) yes no) 18667 // cond: 18668 // result: (First nil no yes) 18669 for { 18670 v := b.Control 18671 if v.Op != OpARMFlagLT_ULT { 18672 break 18673 } 18674 b.Kind = BlockFirst 18675 b.SetControl(nil) 18676 b.swapSuccessors() 18677 return true 18678 } 18679 // match: (GE (FlagLT_UGT) yes no) 18680 // cond: 18681 // result: (First nil no yes) 18682 for { 18683 v := b.Control 18684 if v.Op != OpARMFlagLT_UGT { 18685 break 18686 } 18687 b.Kind = BlockFirst 18688 b.SetControl(nil) 18689 b.swapSuccessors() 18690 return true 18691 } 18692 // match: (GE (FlagGT_ULT) yes no) 18693 // cond: 18694 // result: (First nil yes no) 18695 for { 18696 v := b.Control 18697 if v.Op != OpARMFlagGT_ULT { 18698 break 18699 } 18700 b.Kind = BlockFirst 18701 b.SetControl(nil) 18702 return true 18703 } 18704 // match: (GE (FlagGT_UGT) yes no) 18705 // cond: 18706 // result: (First nil yes no) 18707 for { 18708 v := b.Control 18709 if v.Op != OpARMFlagGT_UGT { 18710 break 18711 } 18712 b.Kind = BlockFirst 18713 b.SetControl(nil) 18714 return true 18715 } 18716 // match: (GE (InvertFlags cmp) yes no) 18717 // cond: 18718 // result: (LE cmp yes no) 18719 for { 18720 v := b.Control 18721 if v.Op != OpARMInvertFlags { 18722 break 18723 } 18724 cmp := v.Args[0] 18725 b.Kind = BlockARMLE 18726 b.SetControl(cmp) 18727 return true 18728 } 18729 case BlockARMGT: 18730 // match: (GT (FlagEQ) yes no) 18731 // cond: 18732 // result: (First nil no yes) 18733 for { 18734 v := b.Control 18735 if v.Op != OpARMFlagEQ { 18736 break 18737 } 18738 b.Kind = BlockFirst 18739 b.SetControl(nil) 18740 b.swapSuccessors() 18741 return true 18742 } 18743 // match: (GT (FlagLT_ULT) yes no) 18744 // cond: 18745 // result: (First nil no yes) 18746 for { 18747 v := b.Control 18748 if v.Op != OpARMFlagLT_ULT { 18749 break 18750 } 18751 b.Kind = BlockFirst 18752 b.SetControl(nil) 18753 b.swapSuccessors() 18754 return true 18755 } 18756 // match: (GT (FlagLT_UGT) yes no) 18757 // cond: 18758 // result: (First nil no yes) 18759 for { 18760 v := b.Control 18761 if v.Op != OpARMFlagLT_UGT { 18762 break 18763 } 18764 b.Kind = BlockFirst 18765 b.SetControl(nil) 18766 b.swapSuccessors() 18767 return true 18768 } 18769 // match: (GT (FlagGT_ULT) yes no) 18770 // cond: 18771 // result: (First nil yes no) 18772 for { 18773 v := b.Control 18774 if v.Op != OpARMFlagGT_ULT { 18775 break 18776 } 18777 b.Kind = BlockFirst 18778 b.SetControl(nil) 18779 return true 18780 } 18781 // match: (GT (FlagGT_UGT) yes no) 18782 // cond: 18783 // result: (First nil yes no) 18784 for { 18785 v := b.Control 18786 if v.Op != OpARMFlagGT_UGT { 18787 break 18788 } 18789 b.Kind = BlockFirst 18790 b.SetControl(nil) 18791 return true 18792 } 18793 // match: (GT (InvertFlags cmp) yes no) 18794 // cond: 18795 // result: (LT cmp yes no) 18796 for { 18797 v := b.Control 18798 if v.Op != OpARMInvertFlags { 18799 break 18800 } 18801 cmp := v.Args[0] 18802 b.Kind = BlockARMLT 18803 b.SetControl(cmp) 18804 return true 18805 } 18806 case BlockIf: 18807 // match: (If (Equal cc) yes no) 18808 // cond: 18809 // result: (EQ cc yes no) 18810 for { 18811 v := b.Control 18812 if v.Op != OpARMEqual { 18813 break 18814 } 18815 cc := v.Args[0] 18816 b.Kind = BlockARMEQ 18817 b.SetControl(cc) 18818 return true 18819 } 18820 // match: (If (NotEqual cc) yes no) 18821 // cond: 18822 // result: (NE cc yes no) 18823 for { 18824 v := b.Control 18825 if v.Op != OpARMNotEqual { 18826 break 18827 } 18828 cc := v.Args[0] 18829 b.Kind = BlockARMNE 18830 b.SetControl(cc) 18831 return true 18832 } 18833 // match: (If (LessThan cc) yes no) 18834 // cond: 18835 // result: (LT cc yes no) 18836 for { 18837 v := b.Control 18838 if v.Op != OpARMLessThan { 18839 break 18840 } 18841 cc := v.Args[0] 18842 b.Kind = BlockARMLT 18843 b.SetControl(cc) 18844 return true 18845 } 18846 // match: (If (LessThanU cc) yes no) 18847 // cond: 18848 // result: (ULT cc yes no) 18849 for { 18850 v := b.Control 18851 if v.Op != OpARMLessThanU { 18852 break 18853 } 18854 cc := v.Args[0] 18855 b.Kind = BlockARMULT 18856 b.SetControl(cc) 18857 return true 18858 } 18859 // match: (If (LessEqual cc) yes no) 18860 // cond: 18861 // result: (LE cc yes no) 18862 for { 18863 v := b.Control 18864 if v.Op != OpARMLessEqual { 18865 break 18866 } 18867 cc := v.Args[0] 18868 b.Kind = BlockARMLE 18869 b.SetControl(cc) 18870 return true 18871 } 18872 // match: (If (LessEqualU cc) yes no) 18873 // cond: 18874 // result: (ULE cc yes no) 18875 for { 18876 v := b.Control 18877 if v.Op != OpARMLessEqualU { 18878 break 18879 } 18880 cc := v.Args[0] 18881 b.Kind = BlockARMULE 18882 b.SetControl(cc) 18883 return true 18884 } 18885 // match: (If (GreaterThan cc) yes no) 18886 // cond: 18887 // result: (GT cc yes no) 18888 for { 18889 v := b.Control 18890 if v.Op != OpARMGreaterThan { 18891 break 18892 } 18893 cc := v.Args[0] 18894 b.Kind = BlockARMGT 18895 b.SetControl(cc) 18896 return true 18897 } 18898 // match: (If (GreaterThanU cc) yes no) 18899 // cond: 18900 // result: (UGT cc yes no) 18901 for { 18902 v := b.Control 18903 if v.Op != OpARMGreaterThanU { 18904 break 18905 } 18906 cc := v.Args[0] 18907 b.Kind = BlockARMUGT 18908 b.SetControl(cc) 18909 return true 18910 } 18911 // match: (If (GreaterEqual cc) yes no) 18912 // cond: 18913 // result: (GE cc yes no) 18914 for { 18915 v := b.Control 18916 if v.Op != OpARMGreaterEqual { 18917 break 18918 } 18919 cc := v.Args[0] 18920 b.Kind = BlockARMGE 18921 b.SetControl(cc) 18922 return true 18923 } 18924 // match: (If (GreaterEqualU cc) yes no) 18925 // cond: 18926 // result: (UGE cc yes no) 18927 for { 18928 v := b.Control 18929 if v.Op != OpARMGreaterEqualU { 18930 break 18931 } 18932 cc := v.Args[0] 18933 b.Kind = BlockARMUGE 18934 b.SetControl(cc) 18935 return true 18936 } 18937 // match: (If cond yes no) 18938 // cond: 18939 // result: (NE (CMPconst [0] cond) yes no) 18940 for { 18941 v := b.Control 18942 _ = v 18943 cond := b.Control 18944 b.Kind = BlockARMNE 18945 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18946 v0.AuxInt = 0 18947 v0.AddArg(cond) 18948 b.SetControl(v0) 18949 return true 18950 } 18951 case BlockARMLE: 18952 // match: (LE (FlagEQ) yes no) 18953 // cond: 18954 // result: (First nil yes no) 18955 for { 18956 v := b.Control 18957 if v.Op != OpARMFlagEQ { 18958 break 18959 } 18960 b.Kind = BlockFirst 18961 b.SetControl(nil) 18962 return true 18963 } 18964 // match: (LE (FlagLT_ULT) yes no) 18965 // cond: 18966 // result: (First nil yes no) 18967 for { 18968 v := b.Control 18969 if v.Op != OpARMFlagLT_ULT { 18970 break 18971 } 18972 b.Kind = BlockFirst 18973 b.SetControl(nil) 18974 return true 18975 } 18976 // match: (LE (FlagLT_UGT) yes no) 18977 // cond: 18978 // result: (First nil yes no) 18979 for { 18980 v := b.Control 18981 if v.Op != OpARMFlagLT_UGT { 18982 break 18983 } 18984 b.Kind = BlockFirst 18985 b.SetControl(nil) 18986 return true 18987 } 18988 // match: (LE (FlagGT_ULT) yes no) 18989 // cond: 18990 // result: (First nil no yes) 18991 for { 18992 v := b.Control 18993 if v.Op != OpARMFlagGT_ULT { 18994 break 18995 } 18996 b.Kind = BlockFirst 18997 b.SetControl(nil) 18998 b.swapSuccessors() 18999 return true 19000 } 19001 // match: (LE (FlagGT_UGT) yes no) 19002 // cond: 19003 // result: (First nil no yes) 19004 for { 19005 v := b.Control 19006 if v.Op != OpARMFlagGT_UGT { 19007 break 19008 } 19009 b.Kind = BlockFirst 19010 b.SetControl(nil) 19011 b.swapSuccessors() 19012 return true 19013 } 19014 // match: (LE (InvertFlags cmp) yes no) 19015 // cond: 19016 // result: (GE cmp yes no) 19017 for { 19018 v := b.Control 19019 if v.Op != OpARMInvertFlags { 19020 break 19021 } 19022 cmp := v.Args[0] 19023 b.Kind = BlockARMGE 19024 b.SetControl(cmp) 19025 return true 19026 } 19027 case BlockARMLT: 19028 // match: (LT (FlagEQ) yes no) 19029 // cond: 19030 // result: (First nil no yes) 19031 for { 19032 v := b.Control 19033 if v.Op != OpARMFlagEQ { 19034 break 19035 } 19036 b.Kind = BlockFirst 19037 b.SetControl(nil) 19038 b.swapSuccessors() 19039 return true 19040 } 19041 // match: (LT (FlagLT_ULT) yes no) 19042 // cond: 19043 // result: (First nil yes no) 19044 for { 19045 v := b.Control 19046 if v.Op != OpARMFlagLT_ULT { 19047 break 19048 } 19049 b.Kind = BlockFirst 19050 b.SetControl(nil) 19051 return true 19052 } 19053 // match: (LT (FlagLT_UGT) yes no) 19054 // cond: 19055 // result: (First nil yes no) 19056 for { 19057 v := b.Control 19058 if v.Op != OpARMFlagLT_UGT { 19059 break 19060 } 19061 b.Kind = BlockFirst 19062 b.SetControl(nil) 19063 return true 19064 } 19065 // match: (LT (FlagGT_ULT) yes no) 19066 // cond: 19067 // result: (First nil no yes) 19068 for { 19069 v := b.Control 19070 if v.Op != OpARMFlagGT_ULT { 19071 break 19072 } 19073 b.Kind = BlockFirst 19074 b.SetControl(nil) 19075 b.swapSuccessors() 19076 return true 19077 } 19078 // match: (LT (FlagGT_UGT) yes no) 19079 // cond: 19080 // result: (First nil no yes) 19081 for { 19082 v := b.Control 19083 if v.Op != OpARMFlagGT_UGT { 19084 break 19085 } 19086 b.Kind = BlockFirst 19087 b.SetControl(nil) 19088 b.swapSuccessors() 19089 return true 19090 } 19091 // match: (LT (InvertFlags cmp) yes no) 19092 // cond: 19093 // result: (GT cmp yes no) 19094 for { 19095 v := b.Control 19096 if v.Op != OpARMInvertFlags { 19097 break 19098 } 19099 cmp := v.Args[0] 19100 b.Kind = BlockARMGT 19101 b.SetControl(cmp) 19102 return true 19103 } 19104 case BlockARMNE: 19105 // match: (NE (CMPconst [0] (Equal cc)) yes no) 19106 // cond: 19107 // result: (EQ cc yes no) 19108 for { 19109 v := b.Control 19110 if v.Op != OpARMCMPconst { 19111 break 19112 } 19113 if v.AuxInt != 0 { 19114 break 19115 } 19116 v_0 := v.Args[0] 19117 if v_0.Op != OpARMEqual { 19118 break 19119 } 19120 cc := v_0.Args[0] 19121 b.Kind = BlockARMEQ 19122 b.SetControl(cc) 19123 return true 19124 } 19125 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 19126 // cond: 19127 // result: (NE cc yes no) 19128 for { 19129 v := b.Control 19130 if v.Op != OpARMCMPconst { 19131 break 19132 } 19133 if v.AuxInt != 0 { 19134 break 19135 } 19136 v_0 := v.Args[0] 19137 if v_0.Op != OpARMNotEqual { 19138 break 19139 } 19140 cc := v_0.Args[0] 19141 b.Kind = BlockARMNE 19142 b.SetControl(cc) 19143 return true 19144 } 19145 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 19146 // cond: 19147 // result: (LT cc yes no) 19148 for { 19149 v := b.Control 19150 if v.Op != OpARMCMPconst { 19151 break 19152 } 19153 if v.AuxInt != 0 { 19154 break 19155 } 19156 v_0 := v.Args[0] 19157 if v_0.Op != OpARMLessThan { 19158 break 19159 } 19160 cc := v_0.Args[0] 19161 b.Kind = BlockARMLT 19162 b.SetControl(cc) 19163 return true 19164 } 19165 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 19166 // cond: 19167 // result: (ULT cc yes no) 19168 for { 19169 v := b.Control 19170 if v.Op != OpARMCMPconst { 19171 break 19172 } 19173 if v.AuxInt != 0 { 19174 break 19175 } 19176 v_0 := v.Args[0] 19177 if v_0.Op != OpARMLessThanU { 19178 break 19179 } 19180 cc := v_0.Args[0] 19181 b.Kind = BlockARMULT 19182 b.SetControl(cc) 19183 return true 19184 } 19185 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 19186 // cond: 19187 // result: (LE cc yes no) 19188 for { 19189 v := b.Control 19190 if v.Op != OpARMCMPconst { 19191 break 19192 } 19193 if v.AuxInt != 0 { 19194 break 19195 } 19196 v_0 := v.Args[0] 19197 if v_0.Op != OpARMLessEqual { 19198 break 19199 } 19200 cc := v_0.Args[0] 19201 b.Kind = BlockARMLE 19202 b.SetControl(cc) 19203 return true 19204 } 19205 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 19206 // cond: 19207 // result: (ULE cc yes no) 19208 for { 19209 v := b.Control 19210 if v.Op != OpARMCMPconst { 19211 break 19212 } 19213 if v.AuxInt != 0 { 19214 break 19215 } 19216 v_0 := v.Args[0] 19217 if v_0.Op != OpARMLessEqualU { 19218 break 19219 } 19220 cc := v_0.Args[0] 19221 b.Kind = BlockARMULE 19222 b.SetControl(cc) 19223 return true 19224 } 19225 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 19226 // cond: 19227 // result: (GT cc yes no) 19228 for { 19229 v := b.Control 19230 if v.Op != OpARMCMPconst { 19231 break 19232 } 19233 if v.AuxInt != 0 { 19234 break 19235 } 19236 v_0 := v.Args[0] 19237 if v_0.Op != OpARMGreaterThan { 19238 break 19239 } 19240 cc := v_0.Args[0] 19241 b.Kind = BlockARMGT 19242 b.SetControl(cc) 19243 return true 19244 } 19245 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 19246 // cond: 19247 // result: (UGT cc yes no) 19248 for { 19249 v := b.Control 19250 if v.Op != OpARMCMPconst { 19251 break 19252 } 19253 if v.AuxInt != 0 { 19254 break 19255 } 19256 v_0 := v.Args[0] 19257 if v_0.Op != OpARMGreaterThanU { 19258 break 19259 } 19260 cc := v_0.Args[0] 19261 b.Kind = BlockARMUGT 19262 b.SetControl(cc) 19263 return true 19264 } 19265 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 19266 // cond: 19267 // result: (GE cc yes no) 19268 for { 19269 v := b.Control 19270 if v.Op != OpARMCMPconst { 19271 break 19272 } 19273 if v.AuxInt != 0 { 19274 break 19275 } 19276 v_0 := v.Args[0] 19277 if v_0.Op != OpARMGreaterEqual { 19278 break 19279 } 19280 cc := v_0.Args[0] 19281 b.Kind = BlockARMGE 19282 b.SetControl(cc) 19283 return true 19284 } 19285 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 19286 // cond: 19287 // result: (UGE cc yes no) 19288 for { 19289 v := b.Control 19290 if v.Op != OpARMCMPconst { 19291 break 19292 } 19293 if v.AuxInt != 0 { 19294 break 19295 } 19296 v_0 := v.Args[0] 19297 if v_0.Op != OpARMGreaterEqualU { 19298 break 19299 } 19300 cc := v_0.Args[0] 19301 b.Kind = BlockARMUGE 19302 b.SetControl(cc) 19303 return true 19304 } 19305 // match: (NE (FlagEQ) yes no) 19306 // cond: 19307 // result: (First nil no yes) 19308 for { 19309 v := b.Control 19310 if v.Op != OpARMFlagEQ { 19311 break 19312 } 19313 b.Kind = BlockFirst 19314 b.SetControl(nil) 19315 b.swapSuccessors() 19316 return true 19317 } 19318 // match: (NE (FlagLT_ULT) yes no) 19319 // cond: 19320 // result: (First nil yes no) 19321 for { 19322 v := b.Control 19323 if v.Op != OpARMFlagLT_ULT { 19324 break 19325 } 19326 b.Kind = BlockFirst 19327 b.SetControl(nil) 19328 return true 19329 } 19330 // match: (NE (FlagLT_UGT) yes no) 19331 // cond: 19332 // result: (First nil yes no) 19333 for { 19334 v := b.Control 19335 if v.Op != OpARMFlagLT_UGT { 19336 break 19337 } 19338 b.Kind = BlockFirst 19339 b.SetControl(nil) 19340 return true 19341 } 19342 // match: (NE (FlagGT_ULT) yes no) 19343 // cond: 19344 // result: (First nil yes no) 19345 for { 19346 v := b.Control 19347 if v.Op != OpARMFlagGT_ULT { 19348 break 19349 } 19350 b.Kind = BlockFirst 19351 b.SetControl(nil) 19352 return true 19353 } 19354 // match: (NE (FlagGT_UGT) yes no) 19355 // cond: 19356 // result: (First nil yes no) 19357 for { 19358 v := b.Control 19359 if v.Op != OpARMFlagGT_UGT { 19360 break 19361 } 19362 b.Kind = BlockFirst 19363 b.SetControl(nil) 19364 return true 19365 } 19366 // match: (NE (InvertFlags cmp) yes no) 19367 // cond: 19368 // result: (NE cmp yes no) 19369 for { 19370 v := b.Control 19371 if v.Op != OpARMInvertFlags { 19372 break 19373 } 19374 cmp := v.Args[0] 19375 b.Kind = BlockARMNE 19376 b.SetControl(cmp) 19377 return true 19378 } 19379 case BlockARMUGE: 19380 // match: (UGE (FlagEQ) yes no) 19381 // cond: 19382 // result: (First nil yes no) 19383 for { 19384 v := b.Control 19385 if v.Op != OpARMFlagEQ { 19386 break 19387 } 19388 b.Kind = BlockFirst 19389 b.SetControl(nil) 19390 return true 19391 } 19392 // match: (UGE (FlagLT_ULT) yes no) 19393 // cond: 19394 // result: (First nil no yes) 19395 for { 19396 v := b.Control 19397 if v.Op != OpARMFlagLT_ULT { 19398 break 19399 } 19400 b.Kind = BlockFirst 19401 b.SetControl(nil) 19402 b.swapSuccessors() 19403 return true 19404 } 19405 // match: (UGE (FlagLT_UGT) yes no) 19406 // cond: 19407 // result: (First nil yes no) 19408 for { 19409 v := b.Control 19410 if v.Op != OpARMFlagLT_UGT { 19411 break 19412 } 19413 b.Kind = BlockFirst 19414 b.SetControl(nil) 19415 return true 19416 } 19417 // match: (UGE (FlagGT_ULT) yes no) 19418 // cond: 19419 // result: (First nil no yes) 19420 for { 19421 v := b.Control 19422 if v.Op != OpARMFlagGT_ULT { 19423 break 19424 } 19425 b.Kind = BlockFirst 19426 b.SetControl(nil) 19427 b.swapSuccessors() 19428 return true 19429 } 19430 // match: (UGE (FlagGT_UGT) yes no) 19431 // cond: 19432 // result: (First nil yes no) 19433 for { 19434 v := b.Control 19435 if v.Op != OpARMFlagGT_UGT { 19436 break 19437 } 19438 b.Kind = BlockFirst 19439 b.SetControl(nil) 19440 return true 19441 } 19442 // match: (UGE (InvertFlags cmp) yes no) 19443 // cond: 19444 // result: (ULE cmp yes no) 19445 for { 19446 v := b.Control 19447 if v.Op != OpARMInvertFlags { 19448 break 19449 } 19450 cmp := v.Args[0] 19451 b.Kind = BlockARMULE 19452 b.SetControl(cmp) 19453 return true 19454 } 19455 case BlockARMUGT: 19456 // match: (UGT (FlagEQ) yes no) 19457 // cond: 19458 // result: (First nil no yes) 19459 for { 19460 v := b.Control 19461 if v.Op != OpARMFlagEQ { 19462 break 19463 } 19464 b.Kind = BlockFirst 19465 b.SetControl(nil) 19466 b.swapSuccessors() 19467 return true 19468 } 19469 // match: (UGT (FlagLT_ULT) yes no) 19470 // cond: 19471 // result: (First nil no yes) 19472 for { 19473 v := b.Control 19474 if v.Op != OpARMFlagLT_ULT { 19475 break 19476 } 19477 b.Kind = BlockFirst 19478 b.SetControl(nil) 19479 b.swapSuccessors() 19480 return true 19481 } 19482 // match: (UGT (FlagLT_UGT) yes no) 19483 // cond: 19484 // result: (First nil yes no) 19485 for { 19486 v := b.Control 19487 if v.Op != OpARMFlagLT_UGT { 19488 break 19489 } 19490 b.Kind = BlockFirst 19491 b.SetControl(nil) 19492 return true 19493 } 19494 // match: (UGT (FlagGT_ULT) yes no) 19495 // cond: 19496 // result: (First nil no yes) 19497 for { 19498 v := b.Control 19499 if v.Op != OpARMFlagGT_ULT { 19500 break 19501 } 19502 b.Kind = BlockFirst 19503 b.SetControl(nil) 19504 b.swapSuccessors() 19505 return true 19506 } 19507 // match: (UGT (FlagGT_UGT) yes no) 19508 // cond: 19509 // result: (First nil yes no) 19510 for { 19511 v := b.Control 19512 if v.Op != OpARMFlagGT_UGT { 19513 break 19514 } 19515 b.Kind = BlockFirst 19516 b.SetControl(nil) 19517 return true 19518 } 19519 // match: (UGT (InvertFlags cmp) yes no) 19520 // cond: 19521 // result: (ULT cmp yes no) 19522 for { 19523 v := b.Control 19524 if v.Op != OpARMInvertFlags { 19525 break 19526 } 19527 cmp := v.Args[0] 19528 b.Kind = BlockARMULT 19529 b.SetControl(cmp) 19530 return true 19531 } 19532 case BlockARMULE: 19533 // match: (ULE (FlagEQ) yes no) 19534 // cond: 19535 // result: (First nil yes no) 19536 for { 19537 v := b.Control 19538 if v.Op != OpARMFlagEQ { 19539 break 19540 } 19541 b.Kind = BlockFirst 19542 b.SetControl(nil) 19543 return true 19544 } 19545 // match: (ULE (FlagLT_ULT) yes no) 19546 // cond: 19547 // result: (First nil yes no) 19548 for { 19549 v := b.Control 19550 if v.Op != OpARMFlagLT_ULT { 19551 break 19552 } 19553 b.Kind = BlockFirst 19554 b.SetControl(nil) 19555 return true 19556 } 19557 // match: (ULE (FlagLT_UGT) yes no) 19558 // cond: 19559 // result: (First nil no yes) 19560 for { 19561 v := b.Control 19562 if v.Op != OpARMFlagLT_UGT { 19563 break 19564 } 19565 b.Kind = BlockFirst 19566 b.SetControl(nil) 19567 b.swapSuccessors() 19568 return true 19569 } 19570 // match: (ULE (FlagGT_ULT) yes no) 19571 // cond: 19572 // result: (First nil yes no) 19573 for { 19574 v := b.Control 19575 if v.Op != OpARMFlagGT_ULT { 19576 break 19577 } 19578 b.Kind = BlockFirst 19579 b.SetControl(nil) 19580 return true 19581 } 19582 // match: (ULE (FlagGT_UGT) yes no) 19583 // cond: 19584 // result: (First nil no yes) 19585 for { 19586 v := b.Control 19587 if v.Op != OpARMFlagGT_UGT { 19588 break 19589 } 19590 b.Kind = BlockFirst 19591 b.SetControl(nil) 19592 b.swapSuccessors() 19593 return true 19594 } 19595 // match: (ULE (InvertFlags cmp) yes no) 19596 // cond: 19597 // result: (UGE cmp yes no) 19598 for { 19599 v := b.Control 19600 if v.Op != OpARMInvertFlags { 19601 break 19602 } 19603 cmp := v.Args[0] 19604 b.Kind = BlockARMUGE 19605 b.SetControl(cmp) 19606 return true 19607 } 19608 case BlockARMULT: 19609 // match: (ULT (FlagEQ) yes no) 19610 // cond: 19611 // result: (First nil no yes) 19612 for { 19613 v := b.Control 19614 if v.Op != OpARMFlagEQ { 19615 break 19616 } 19617 b.Kind = BlockFirst 19618 b.SetControl(nil) 19619 b.swapSuccessors() 19620 return true 19621 } 19622 // match: (ULT (FlagLT_ULT) yes no) 19623 // cond: 19624 // result: (First nil yes no) 19625 for { 19626 v := b.Control 19627 if v.Op != OpARMFlagLT_ULT { 19628 break 19629 } 19630 b.Kind = BlockFirst 19631 b.SetControl(nil) 19632 return true 19633 } 19634 // match: (ULT (FlagLT_UGT) yes no) 19635 // cond: 19636 // result: (First nil no yes) 19637 for { 19638 v := b.Control 19639 if v.Op != OpARMFlagLT_UGT { 19640 break 19641 } 19642 b.Kind = BlockFirst 19643 b.SetControl(nil) 19644 b.swapSuccessors() 19645 return true 19646 } 19647 // match: (ULT (FlagGT_ULT) yes no) 19648 // cond: 19649 // result: (First nil yes no) 19650 for { 19651 v := b.Control 19652 if v.Op != OpARMFlagGT_ULT { 19653 break 19654 } 19655 b.Kind = BlockFirst 19656 b.SetControl(nil) 19657 return true 19658 } 19659 // match: (ULT (FlagGT_UGT) yes no) 19660 // cond: 19661 // result: (First nil no yes) 19662 for { 19663 v := b.Control 19664 if v.Op != OpARMFlagGT_UGT { 19665 break 19666 } 19667 b.Kind = BlockFirst 19668 b.SetControl(nil) 19669 b.swapSuccessors() 19670 return true 19671 } 19672 // match: (ULT (InvertFlags cmp) yes no) 19673 // cond: 19674 // result: (UGT cmp yes no) 19675 for { 19676 v := b.Control 19677 if v.Op != OpARMInvertFlags { 19678 break 19679 } 19680 cmp := v.Args[0] 19681 b.Kind = BlockARMUGT 19682 b.SetControl(cmp) 19683 return true 19684 } 19685 } 19686 return false 19687 }