github.com/ltltlt/go-source-code@v0.0.0-20190830023027-95be009773aa/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 OpARMADDD: 37 return rewriteValueARM_OpARMADDD_0(v) 38 case OpARMADDF: 39 return rewriteValueARM_OpARMADDF_0(v) 40 case OpARMADDS: 41 return rewriteValueARM_OpARMADDS_0(v) || rewriteValueARM_OpARMADDS_10(v) 42 case OpARMADDSshiftLL: 43 return rewriteValueARM_OpARMADDSshiftLL_0(v) 44 case OpARMADDSshiftLLreg: 45 return rewriteValueARM_OpARMADDSshiftLLreg_0(v) 46 case OpARMADDSshiftRA: 47 return rewriteValueARM_OpARMADDSshiftRA_0(v) 48 case OpARMADDSshiftRAreg: 49 return rewriteValueARM_OpARMADDSshiftRAreg_0(v) 50 case OpARMADDSshiftRL: 51 return rewriteValueARM_OpARMADDSshiftRL_0(v) 52 case OpARMADDSshiftRLreg: 53 return rewriteValueARM_OpARMADDSshiftRLreg_0(v) 54 case OpARMADDconst: 55 return rewriteValueARM_OpARMADDconst_0(v) 56 case OpARMADDshiftLL: 57 return rewriteValueARM_OpARMADDshiftLL_0(v) 58 case OpARMADDshiftLLreg: 59 return rewriteValueARM_OpARMADDshiftLLreg_0(v) 60 case OpARMADDshiftRA: 61 return rewriteValueARM_OpARMADDshiftRA_0(v) 62 case OpARMADDshiftRAreg: 63 return rewriteValueARM_OpARMADDshiftRAreg_0(v) 64 case OpARMADDshiftRL: 65 return rewriteValueARM_OpARMADDshiftRL_0(v) 66 case OpARMADDshiftRLreg: 67 return rewriteValueARM_OpARMADDshiftRLreg_0(v) 68 case OpARMAND: 69 return rewriteValueARM_OpARMAND_0(v) || rewriteValueARM_OpARMAND_10(v) || rewriteValueARM_OpARMAND_20(v) 70 case OpARMANDconst: 71 return rewriteValueARM_OpARMANDconst_0(v) 72 case OpARMANDshiftLL: 73 return rewriteValueARM_OpARMANDshiftLL_0(v) 74 case OpARMANDshiftLLreg: 75 return rewriteValueARM_OpARMANDshiftLLreg_0(v) 76 case OpARMANDshiftRA: 77 return rewriteValueARM_OpARMANDshiftRA_0(v) 78 case OpARMANDshiftRAreg: 79 return rewriteValueARM_OpARMANDshiftRAreg_0(v) 80 case OpARMANDshiftRL: 81 return rewriteValueARM_OpARMANDshiftRL_0(v) 82 case OpARMANDshiftRLreg: 83 return rewriteValueARM_OpARMANDshiftRLreg_0(v) 84 case OpARMBFX: 85 return rewriteValueARM_OpARMBFX_0(v) 86 case OpARMBFXU: 87 return rewriteValueARM_OpARMBFXU_0(v) 88 case OpARMBIC: 89 return rewriteValueARM_OpARMBIC_0(v) 90 case OpARMBICconst: 91 return rewriteValueARM_OpARMBICconst_0(v) 92 case OpARMBICshiftLL: 93 return rewriteValueARM_OpARMBICshiftLL_0(v) 94 case OpARMBICshiftLLreg: 95 return rewriteValueARM_OpARMBICshiftLLreg_0(v) 96 case OpARMBICshiftRA: 97 return rewriteValueARM_OpARMBICshiftRA_0(v) 98 case OpARMBICshiftRAreg: 99 return rewriteValueARM_OpARMBICshiftRAreg_0(v) 100 case OpARMBICshiftRL: 101 return rewriteValueARM_OpARMBICshiftRL_0(v) 102 case OpARMBICshiftRLreg: 103 return rewriteValueARM_OpARMBICshiftRLreg_0(v) 104 case OpARMCMN: 105 return rewriteValueARM_OpARMCMN_0(v) || rewriteValueARM_OpARMCMN_10(v) 106 case OpARMCMNconst: 107 return rewriteValueARM_OpARMCMNconst_0(v) 108 case OpARMCMNshiftLL: 109 return rewriteValueARM_OpARMCMNshiftLL_0(v) 110 case OpARMCMNshiftLLreg: 111 return rewriteValueARM_OpARMCMNshiftLLreg_0(v) 112 case OpARMCMNshiftRA: 113 return rewriteValueARM_OpARMCMNshiftRA_0(v) 114 case OpARMCMNshiftRAreg: 115 return rewriteValueARM_OpARMCMNshiftRAreg_0(v) 116 case OpARMCMNshiftRL: 117 return rewriteValueARM_OpARMCMNshiftRL_0(v) 118 case OpARMCMNshiftRLreg: 119 return rewriteValueARM_OpARMCMNshiftRLreg_0(v) 120 case OpARMCMOVWHSconst: 121 return rewriteValueARM_OpARMCMOVWHSconst_0(v) 122 case OpARMCMOVWLSconst: 123 return rewriteValueARM_OpARMCMOVWLSconst_0(v) 124 case OpARMCMP: 125 return rewriteValueARM_OpARMCMP_0(v) || rewriteValueARM_OpARMCMP_10(v) 126 case OpARMCMPD: 127 return rewriteValueARM_OpARMCMPD_0(v) 128 case OpARMCMPF: 129 return rewriteValueARM_OpARMCMPF_0(v) 130 case OpARMCMPconst: 131 return rewriteValueARM_OpARMCMPconst_0(v) 132 case OpARMCMPshiftLL: 133 return rewriteValueARM_OpARMCMPshiftLL_0(v) 134 case OpARMCMPshiftLLreg: 135 return rewriteValueARM_OpARMCMPshiftLLreg_0(v) 136 case OpARMCMPshiftRA: 137 return rewriteValueARM_OpARMCMPshiftRA_0(v) 138 case OpARMCMPshiftRAreg: 139 return rewriteValueARM_OpARMCMPshiftRAreg_0(v) 140 case OpARMCMPshiftRL: 141 return rewriteValueARM_OpARMCMPshiftRL_0(v) 142 case OpARMCMPshiftRLreg: 143 return rewriteValueARM_OpARMCMPshiftRLreg_0(v) 144 case OpARMEqual: 145 return rewriteValueARM_OpARMEqual_0(v) 146 case OpARMGreaterEqual: 147 return rewriteValueARM_OpARMGreaterEqual_0(v) 148 case OpARMGreaterEqualU: 149 return rewriteValueARM_OpARMGreaterEqualU_0(v) 150 case OpARMGreaterThan: 151 return rewriteValueARM_OpARMGreaterThan_0(v) 152 case OpARMGreaterThanU: 153 return rewriteValueARM_OpARMGreaterThanU_0(v) 154 case OpARMLessEqual: 155 return rewriteValueARM_OpARMLessEqual_0(v) 156 case OpARMLessEqualU: 157 return rewriteValueARM_OpARMLessEqualU_0(v) 158 case OpARMLessThan: 159 return rewriteValueARM_OpARMLessThan_0(v) 160 case OpARMLessThanU: 161 return rewriteValueARM_OpARMLessThanU_0(v) 162 case OpARMMOVBUload: 163 return rewriteValueARM_OpARMMOVBUload_0(v) 164 case OpARMMOVBUloadidx: 165 return rewriteValueARM_OpARMMOVBUloadidx_0(v) 166 case OpARMMOVBUreg: 167 return rewriteValueARM_OpARMMOVBUreg_0(v) 168 case OpARMMOVBload: 169 return rewriteValueARM_OpARMMOVBload_0(v) 170 case OpARMMOVBloadidx: 171 return rewriteValueARM_OpARMMOVBloadidx_0(v) 172 case OpARMMOVBreg: 173 return rewriteValueARM_OpARMMOVBreg_0(v) 174 case OpARMMOVBstore: 175 return rewriteValueARM_OpARMMOVBstore_0(v) 176 case OpARMMOVBstoreidx: 177 return rewriteValueARM_OpARMMOVBstoreidx_0(v) 178 case OpARMMOVDload: 179 return rewriteValueARM_OpARMMOVDload_0(v) 180 case OpARMMOVDstore: 181 return rewriteValueARM_OpARMMOVDstore_0(v) 182 case OpARMMOVFload: 183 return rewriteValueARM_OpARMMOVFload_0(v) 184 case OpARMMOVFstore: 185 return rewriteValueARM_OpARMMOVFstore_0(v) 186 case OpARMMOVHUload: 187 return rewriteValueARM_OpARMMOVHUload_0(v) 188 case OpARMMOVHUloadidx: 189 return rewriteValueARM_OpARMMOVHUloadidx_0(v) 190 case OpARMMOVHUreg: 191 return rewriteValueARM_OpARMMOVHUreg_0(v) 192 case OpARMMOVHload: 193 return rewriteValueARM_OpARMMOVHload_0(v) 194 case OpARMMOVHloadidx: 195 return rewriteValueARM_OpARMMOVHloadidx_0(v) 196 case OpARMMOVHreg: 197 return rewriteValueARM_OpARMMOVHreg_0(v) 198 case OpARMMOVHstore: 199 return rewriteValueARM_OpARMMOVHstore_0(v) 200 case OpARMMOVHstoreidx: 201 return rewriteValueARM_OpARMMOVHstoreidx_0(v) 202 case OpARMMOVWload: 203 return rewriteValueARM_OpARMMOVWload_0(v) 204 case OpARMMOVWloadidx: 205 return rewriteValueARM_OpARMMOVWloadidx_0(v) 206 case OpARMMOVWloadshiftLL: 207 return rewriteValueARM_OpARMMOVWloadshiftLL_0(v) 208 case OpARMMOVWloadshiftRA: 209 return rewriteValueARM_OpARMMOVWloadshiftRA_0(v) 210 case OpARMMOVWloadshiftRL: 211 return rewriteValueARM_OpARMMOVWloadshiftRL_0(v) 212 case OpARMMOVWreg: 213 return rewriteValueARM_OpARMMOVWreg_0(v) 214 case OpARMMOVWstore: 215 return rewriteValueARM_OpARMMOVWstore_0(v) 216 case OpARMMOVWstoreidx: 217 return rewriteValueARM_OpARMMOVWstoreidx_0(v) 218 case OpARMMOVWstoreshiftLL: 219 return rewriteValueARM_OpARMMOVWstoreshiftLL_0(v) 220 case OpARMMOVWstoreshiftRA: 221 return rewriteValueARM_OpARMMOVWstoreshiftRA_0(v) 222 case OpARMMOVWstoreshiftRL: 223 return rewriteValueARM_OpARMMOVWstoreshiftRL_0(v) 224 case OpARMMUL: 225 return rewriteValueARM_OpARMMUL_0(v) || rewriteValueARM_OpARMMUL_10(v) || rewriteValueARM_OpARMMUL_20(v) 226 case OpARMMULA: 227 return rewriteValueARM_OpARMMULA_0(v) || rewriteValueARM_OpARMMULA_10(v) || rewriteValueARM_OpARMMULA_20(v) 228 case OpARMMULD: 229 return rewriteValueARM_OpARMMULD_0(v) 230 case OpARMMULF: 231 return rewriteValueARM_OpARMMULF_0(v) 232 case OpARMMULS: 233 return rewriteValueARM_OpARMMULS_0(v) || rewriteValueARM_OpARMMULS_10(v) || rewriteValueARM_OpARMMULS_20(v) 234 case OpARMMVN: 235 return rewriteValueARM_OpARMMVN_0(v) 236 case OpARMMVNshiftLL: 237 return rewriteValueARM_OpARMMVNshiftLL_0(v) 238 case OpARMMVNshiftLLreg: 239 return rewriteValueARM_OpARMMVNshiftLLreg_0(v) 240 case OpARMMVNshiftRA: 241 return rewriteValueARM_OpARMMVNshiftRA_0(v) 242 case OpARMMVNshiftRAreg: 243 return rewriteValueARM_OpARMMVNshiftRAreg_0(v) 244 case OpARMMVNshiftRL: 245 return rewriteValueARM_OpARMMVNshiftRL_0(v) 246 case OpARMMVNshiftRLreg: 247 return rewriteValueARM_OpARMMVNshiftRLreg_0(v) 248 case OpARMNEGD: 249 return rewriteValueARM_OpARMNEGD_0(v) 250 case OpARMNEGF: 251 return rewriteValueARM_OpARMNEGF_0(v) 252 case OpARMNMULD: 253 return rewriteValueARM_OpARMNMULD_0(v) 254 case OpARMNMULF: 255 return rewriteValueARM_OpARMNMULF_0(v) 256 case OpARMNotEqual: 257 return rewriteValueARM_OpARMNotEqual_0(v) 258 case OpARMOR: 259 return rewriteValueARM_OpARMOR_0(v) || rewriteValueARM_OpARMOR_10(v) 260 case OpARMORconst: 261 return rewriteValueARM_OpARMORconst_0(v) 262 case OpARMORshiftLL: 263 return rewriteValueARM_OpARMORshiftLL_0(v) 264 case OpARMORshiftLLreg: 265 return rewriteValueARM_OpARMORshiftLLreg_0(v) 266 case OpARMORshiftRA: 267 return rewriteValueARM_OpARMORshiftRA_0(v) 268 case OpARMORshiftRAreg: 269 return rewriteValueARM_OpARMORshiftRAreg_0(v) 270 case OpARMORshiftRL: 271 return rewriteValueARM_OpARMORshiftRL_0(v) 272 case OpARMORshiftRLreg: 273 return rewriteValueARM_OpARMORshiftRLreg_0(v) 274 case OpARMRSB: 275 return rewriteValueARM_OpARMRSB_0(v) || rewriteValueARM_OpARMRSB_10(v) 276 case OpARMRSBSshiftLL: 277 return rewriteValueARM_OpARMRSBSshiftLL_0(v) 278 case OpARMRSBSshiftLLreg: 279 return rewriteValueARM_OpARMRSBSshiftLLreg_0(v) 280 case OpARMRSBSshiftRA: 281 return rewriteValueARM_OpARMRSBSshiftRA_0(v) 282 case OpARMRSBSshiftRAreg: 283 return rewriteValueARM_OpARMRSBSshiftRAreg_0(v) 284 case OpARMRSBSshiftRL: 285 return rewriteValueARM_OpARMRSBSshiftRL_0(v) 286 case OpARMRSBSshiftRLreg: 287 return rewriteValueARM_OpARMRSBSshiftRLreg_0(v) 288 case OpARMRSBconst: 289 return rewriteValueARM_OpARMRSBconst_0(v) 290 case OpARMRSBshiftLL: 291 return rewriteValueARM_OpARMRSBshiftLL_0(v) 292 case OpARMRSBshiftLLreg: 293 return rewriteValueARM_OpARMRSBshiftLLreg_0(v) 294 case OpARMRSBshiftRA: 295 return rewriteValueARM_OpARMRSBshiftRA_0(v) 296 case OpARMRSBshiftRAreg: 297 return rewriteValueARM_OpARMRSBshiftRAreg_0(v) 298 case OpARMRSBshiftRL: 299 return rewriteValueARM_OpARMRSBshiftRL_0(v) 300 case OpARMRSBshiftRLreg: 301 return rewriteValueARM_OpARMRSBshiftRLreg_0(v) 302 case OpARMRSCconst: 303 return rewriteValueARM_OpARMRSCconst_0(v) 304 case OpARMRSCshiftLL: 305 return rewriteValueARM_OpARMRSCshiftLL_0(v) 306 case OpARMRSCshiftLLreg: 307 return rewriteValueARM_OpARMRSCshiftLLreg_0(v) 308 case OpARMRSCshiftRA: 309 return rewriteValueARM_OpARMRSCshiftRA_0(v) 310 case OpARMRSCshiftRAreg: 311 return rewriteValueARM_OpARMRSCshiftRAreg_0(v) 312 case OpARMRSCshiftRL: 313 return rewriteValueARM_OpARMRSCshiftRL_0(v) 314 case OpARMRSCshiftRLreg: 315 return rewriteValueARM_OpARMRSCshiftRLreg_0(v) 316 case OpARMSBC: 317 return rewriteValueARM_OpARMSBC_0(v) || rewriteValueARM_OpARMSBC_10(v) 318 case OpARMSBCconst: 319 return rewriteValueARM_OpARMSBCconst_0(v) 320 case OpARMSBCshiftLL: 321 return rewriteValueARM_OpARMSBCshiftLL_0(v) 322 case OpARMSBCshiftLLreg: 323 return rewriteValueARM_OpARMSBCshiftLLreg_0(v) 324 case OpARMSBCshiftRA: 325 return rewriteValueARM_OpARMSBCshiftRA_0(v) 326 case OpARMSBCshiftRAreg: 327 return rewriteValueARM_OpARMSBCshiftRAreg_0(v) 328 case OpARMSBCshiftRL: 329 return rewriteValueARM_OpARMSBCshiftRL_0(v) 330 case OpARMSBCshiftRLreg: 331 return rewriteValueARM_OpARMSBCshiftRLreg_0(v) 332 case OpARMSLL: 333 return rewriteValueARM_OpARMSLL_0(v) 334 case OpARMSLLconst: 335 return rewriteValueARM_OpARMSLLconst_0(v) 336 case OpARMSRA: 337 return rewriteValueARM_OpARMSRA_0(v) 338 case OpARMSRAcond: 339 return rewriteValueARM_OpARMSRAcond_0(v) 340 case OpARMSRAconst: 341 return rewriteValueARM_OpARMSRAconst_0(v) 342 case OpARMSRL: 343 return rewriteValueARM_OpARMSRL_0(v) 344 case OpARMSRLconst: 345 return rewriteValueARM_OpARMSRLconst_0(v) 346 case OpARMSUB: 347 return rewriteValueARM_OpARMSUB_0(v) || rewriteValueARM_OpARMSUB_10(v) 348 case OpARMSUBD: 349 return rewriteValueARM_OpARMSUBD_0(v) 350 case OpARMSUBF: 351 return rewriteValueARM_OpARMSUBF_0(v) 352 case OpARMSUBS: 353 return rewriteValueARM_OpARMSUBS_0(v) || rewriteValueARM_OpARMSUBS_10(v) 354 case OpARMSUBSshiftLL: 355 return rewriteValueARM_OpARMSUBSshiftLL_0(v) 356 case OpARMSUBSshiftLLreg: 357 return rewriteValueARM_OpARMSUBSshiftLLreg_0(v) 358 case OpARMSUBSshiftRA: 359 return rewriteValueARM_OpARMSUBSshiftRA_0(v) 360 case OpARMSUBSshiftRAreg: 361 return rewriteValueARM_OpARMSUBSshiftRAreg_0(v) 362 case OpARMSUBSshiftRL: 363 return rewriteValueARM_OpARMSUBSshiftRL_0(v) 364 case OpARMSUBSshiftRLreg: 365 return rewriteValueARM_OpARMSUBSshiftRLreg_0(v) 366 case OpARMSUBconst: 367 return rewriteValueARM_OpARMSUBconst_0(v) 368 case OpARMSUBshiftLL: 369 return rewriteValueARM_OpARMSUBshiftLL_0(v) 370 case OpARMSUBshiftLLreg: 371 return rewriteValueARM_OpARMSUBshiftLLreg_0(v) 372 case OpARMSUBshiftRA: 373 return rewriteValueARM_OpARMSUBshiftRA_0(v) 374 case OpARMSUBshiftRAreg: 375 return rewriteValueARM_OpARMSUBshiftRAreg_0(v) 376 case OpARMSUBshiftRL: 377 return rewriteValueARM_OpARMSUBshiftRL_0(v) 378 case OpARMSUBshiftRLreg: 379 return rewriteValueARM_OpARMSUBshiftRLreg_0(v) 380 case OpARMTEQ: 381 return rewriteValueARM_OpARMTEQ_0(v) || rewriteValueARM_OpARMTEQ_10(v) 382 case OpARMTEQconst: 383 return rewriteValueARM_OpARMTEQconst_0(v) 384 case OpARMTEQshiftLL: 385 return rewriteValueARM_OpARMTEQshiftLL_0(v) 386 case OpARMTEQshiftLLreg: 387 return rewriteValueARM_OpARMTEQshiftLLreg_0(v) 388 case OpARMTEQshiftRA: 389 return rewriteValueARM_OpARMTEQshiftRA_0(v) 390 case OpARMTEQshiftRAreg: 391 return rewriteValueARM_OpARMTEQshiftRAreg_0(v) 392 case OpARMTEQshiftRL: 393 return rewriteValueARM_OpARMTEQshiftRL_0(v) 394 case OpARMTEQshiftRLreg: 395 return rewriteValueARM_OpARMTEQshiftRLreg_0(v) 396 case OpARMTST: 397 return rewriteValueARM_OpARMTST_0(v) || rewriteValueARM_OpARMTST_10(v) 398 case OpARMTSTconst: 399 return rewriteValueARM_OpARMTSTconst_0(v) 400 case OpARMTSTshiftLL: 401 return rewriteValueARM_OpARMTSTshiftLL_0(v) 402 case OpARMTSTshiftLLreg: 403 return rewriteValueARM_OpARMTSTshiftLLreg_0(v) 404 case OpARMTSTshiftRA: 405 return rewriteValueARM_OpARMTSTshiftRA_0(v) 406 case OpARMTSTshiftRAreg: 407 return rewriteValueARM_OpARMTSTshiftRAreg_0(v) 408 case OpARMTSTshiftRL: 409 return rewriteValueARM_OpARMTSTshiftRL_0(v) 410 case OpARMTSTshiftRLreg: 411 return rewriteValueARM_OpARMTSTshiftRLreg_0(v) 412 case OpARMXOR: 413 return rewriteValueARM_OpARMXOR_0(v) || rewriteValueARM_OpARMXOR_10(v) 414 case OpARMXORconst: 415 return rewriteValueARM_OpARMXORconst_0(v) 416 case OpARMXORshiftLL: 417 return rewriteValueARM_OpARMXORshiftLL_0(v) 418 case OpARMXORshiftLLreg: 419 return rewriteValueARM_OpARMXORshiftLLreg_0(v) 420 case OpARMXORshiftRA: 421 return rewriteValueARM_OpARMXORshiftRA_0(v) 422 case OpARMXORshiftRAreg: 423 return rewriteValueARM_OpARMXORshiftRAreg_0(v) 424 case OpARMXORshiftRL: 425 return rewriteValueARM_OpARMXORshiftRL_0(v) 426 case OpARMXORshiftRLreg: 427 return rewriteValueARM_OpARMXORshiftRLreg_0(v) 428 case OpARMXORshiftRR: 429 return rewriteValueARM_OpARMXORshiftRR_0(v) 430 case OpAdd16: 431 return rewriteValueARM_OpAdd16_0(v) 432 case OpAdd32: 433 return rewriteValueARM_OpAdd32_0(v) 434 case OpAdd32F: 435 return rewriteValueARM_OpAdd32F_0(v) 436 case OpAdd32carry: 437 return rewriteValueARM_OpAdd32carry_0(v) 438 case OpAdd32withcarry: 439 return rewriteValueARM_OpAdd32withcarry_0(v) 440 case OpAdd64F: 441 return rewriteValueARM_OpAdd64F_0(v) 442 case OpAdd8: 443 return rewriteValueARM_OpAdd8_0(v) 444 case OpAddPtr: 445 return rewriteValueARM_OpAddPtr_0(v) 446 case OpAddr: 447 return rewriteValueARM_OpAddr_0(v) 448 case OpAnd16: 449 return rewriteValueARM_OpAnd16_0(v) 450 case OpAnd32: 451 return rewriteValueARM_OpAnd32_0(v) 452 case OpAnd8: 453 return rewriteValueARM_OpAnd8_0(v) 454 case OpAndB: 455 return rewriteValueARM_OpAndB_0(v) 456 case OpAvg32u: 457 return rewriteValueARM_OpAvg32u_0(v) 458 case OpBitLen32: 459 return rewriteValueARM_OpBitLen32_0(v) 460 case OpBswap32: 461 return rewriteValueARM_OpBswap32_0(v) 462 case OpClosureCall: 463 return rewriteValueARM_OpClosureCall_0(v) 464 case OpCom16: 465 return rewriteValueARM_OpCom16_0(v) 466 case OpCom32: 467 return rewriteValueARM_OpCom32_0(v) 468 case OpCom8: 469 return rewriteValueARM_OpCom8_0(v) 470 case OpConst16: 471 return rewriteValueARM_OpConst16_0(v) 472 case OpConst32: 473 return rewriteValueARM_OpConst32_0(v) 474 case OpConst32F: 475 return rewriteValueARM_OpConst32F_0(v) 476 case OpConst64F: 477 return rewriteValueARM_OpConst64F_0(v) 478 case OpConst8: 479 return rewriteValueARM_OpConst8_0(v) 480 case OpConstBool: 481 return rewriteValueARM_OpConstBool_0(v) 482 case OpConstNil: 483 return rewriteValueARM_OpConstNil_0(v) 484 case OpConvert: 485 return rewriteValueARM_OpConvert_0(v) 486 case OpCtz32: 487 return rewriteValueARM_OpCtz32_0(v) 488 case OpCvt32Fto32: 489 return rewriteValueARM_OpCvt32Fto32_0(v) 490 case OpCvt32Fto32U: 491 return rewriteValueARM_OpCvt32Fto32U_0(v) 492 case OpCvt32Fto64F: 493 return rewriteValueARM_OpCvt32Fto64F_0(v) 494 case OpCvt32Uto32F: 495 return rewriteValueARM_OpCvt32Uto32F_0(v) 496 case OpCvt32Uto64F: 497 return rewriteValueARM_OpCvt32Uto64F_0(v) 498 case OpCvt32to32F: 499 return rewriteValueARM_OpCvt32to32F_0(v) 500 case OpCvt32to64F: 501 return rewriteValueARM_OpCvt32to64F_0(v) 502 case OpCvt64Fto32: 503 return rewriteValueARM_OpCvt64Fto32_0(v) 504 case OpCvt64Fto32F: 505 return rewriteValueARM_OpCvt64Fto32F_0(v) 506 case OpCvt64Fto32U: 507 return rewriteValueARM_OpCvt64Fto32U_0(v) 508 case OpDiv16: 509 return rewriteValueARM_OpDiv16_0(v) 510 case OpDiv16u: 511 return rewriteValueARM_OpDiv16u_0(v) 512 case OpDiv32: 513 return rewriteValueARM_OpDiv32_0(v) 514 case OpDiv32F: 515 return rewriteValueARM_OpDiv32F_0(v) 516 case OpDiv32u: 517 return rewriteValueARM_OpDiv32u_0(v) 518 case OpDiv64F: 519 return rewriteValueARM_OpDiv64F_0(v) 520 case OpDiv8: 521 return rewriteValueARM_OpDiv8_0(v) 522 case OpDiv8u: 523 return rewriteValueARM_OpDiv8u_0(v) 524 case OpEq16: 525 return rewriteValueARM_OpEq16_0(v) 526 case OpEq32: 527 return rewriteValueARM_OpEq32_0(v) 528 case OpEq32F: 529 return rewriteValueARM_OpEq32F_0(v) 530 case OpEq64F: 531 return rewriteValueARM_OpEq64F_0(v) 532 case OpEq8: 533 return rewriteValueARM_OpEq8_0(v) 534 case OpEqB: 535 return rewriteValueARM_OpEqB_0(v) 536 case OpEqPtr: 537 return rewriteValueARM_OpEqPtr_0(v) 538 case OpGeq16: 539 return rewriteValueARM_OpGeq16_0(v) 540 case OpGeq16U: 541 return rewriteValueARM_OpGeq16U_0(v) 542 case OpGeq32: 543 return rewriteValueARM_OpGeq32_0(v) 544 case OpGeq32F: 545 return rewriteValueARM_OpGeq32F_0(v) 546 case OpGeq32U: 547 return rewriteValueARM_OpGeq32U_0(v) 548 case OpGeq64F: 549 return rewriteValueARM_OpGeq64F_0(v) 550 case OpGeq8: 551 return rewriteValueARM_OpGeq8_0(v) 552 case OpGeq8U: 553 return rewriteValueARM_OpGeq8U_0(v) 554 case OpGetCallerSP: 555 return rewriteValueARM_OpGetCallerSP_0(v) 556 case OpGetClosurePtr: 557 return rewriteValueARM_OpGetClosurePtr_0(v) 558 case OpGreater16: 559 return rewriteValueARM_OpGreater16_0(v) 560 case OpGreater16U: 561 return rewriteValueARM_OpGreater16U_0(v) 562 case OpGreater32: 563 return rewriteValueARM_OpGreater32_0(v) 564 case OpGreater32F: 565 return rewriteValueARM_OpGreater32F_0(v) 566 case OpGreater32U: 567 return rewriteValueARM_OpGreater32U_0(v) 568 case OpGreater64F: 569 return rewriteValueARM_OpGreater64F_0(v) 570 case OpGreater8: 571 return rewriteValueARM_OpGreater8_0(v) 572 case OpGreater8U: 573 return rewriteValueARM_OpGreater8U_0(v) 574 case OpHmul32: 575 return rewriteValueARM_OpHmul32_0(v) 576 case OpHmul32u: 577 return rewriteValueARM_OpHmul32u_0(v) 578 case OpInterCall: 579 return rewriteValueARM_OpInterCall_0(v) 580 case OpIsInBounds: 581 return rewriteValueARM_OpIsInBounds_0(v) 582 case OpIsNonNil: 583 return rewriteValueARM_OpIsNonNil_0(v) 584 case OpIsSliceInBounds: 585 return rewriteValueARM_OpIsSliceInBounds_0(v) 586 case OpLeq16: 587 return rewriteValueARM_OpLeq16_0(v) 588 case OpLeq16U: 589 return rewriteValueARM_OpLeq16U_0(v) 590 case OpLeq32: 591 return rewriteValueARM_OpLeq32_0(v) 592 case OpLeq32F: 593 return rewriteValueARM_OpLeq32F_0(v) 594 case OpLeq32U: 595 return rewriteValueARM_OpLeq32U_0(v) 596 case OpLeq64F: 597 return rewriteValueARM_OpLeq64F_0(v) 598 case OpLeq8: 599 return rewriteValueARM_OpLeq8_0(v) 600 case OpLeq8U: 601 return rewriteValueARM_OpLeq8U_0(v) 602 case OpLess16: 603 return rewriteValueARM_OpLess16_0(v) 604 case OpLess16U: 605 return rewriteValueARM_OpLess16U_0(v) 606 case OpLess32: 607 return rewriteValueARM_OpLess32_0(v) 608 case OpLess32F: 609 return rewriteValueARM_OpLess32F_0(v) 610 case OpLess32U: 611 return rewriteValueARM_OpLess32U_0(v) 612 case OpLess64F: 613 return rewriteValueARM_OpLess64F_0(v) 614 case OpLess8: 615 return rewriteValueARM_OpLess8_0(v) 616 case OpLess8U: 617 return rewriteValueARM_OpLess8U_0(v) 618 case OpLoad: 619 return rewriteValueARM_OpLoad_0(v) 620 case OpLsh16x16: 621 return rewriteValueARM_OpLsh16x16_0(v) 622 case OpLsh16x32: 623 return rewriteValueARM_OpLsh16x32_0(v) 624 case OpLsh16x64: 625 return rewriteValueARM_OpLsh16x64_0(v) 626 case OpLsh16x8: 627 return rewriteValueARM_OpLsh16x8_0(v) 628 case OpLsh32x16: 629 return rewriteValueARM_OpLsh32x16_0(v) 630 case OpLsh32x32: 631 return rewriteValueARM_OpLsh32x32_0(v) 632 case OpLsh32x64: 633 return rewriteValueARM_OpLsh32x64_0(v) 634 case OpLsh32x8: 635 return rewriteValueARM_OpLsh32x8_0(v) 636 case OpLsh8x16: 637 return rewriteValueARM_OpLsh8x16_0(v) 638 case OpLsh8x32: 639 return rewriteValueARM_OpLsh8x32_0(v) 640 case OpLsh8x64: 641 return rewriteValueARM_OpLsh8x64_0(v) 642 case OpLsh8x8: 643 return rewriteValueARM_OpLsh8x8_0(v) 644 case OpMod16: 645 return rewriteValueARM_OpMod16_0(v) 646 case OpMod16u: 647 return rewriteValueARM_OpMod16u_0(v) 648 case OpMod32: 649 return rewriteValueARM_OpMod32_0(v) 650 case OpMod32u: 651 return rewriteValueARM_OpMod32u_0(v) 652 case OpMod8: 653 return rewriteValueARM_OpMod8_0(v) 654 case OpMod8u: 655 return rewriteValueARM_OpMod8u_0(v) 656 case OpMove: 657 return rewriteValueARM_OpMove_0(v) 658 case OpMul16: 659 return rewriteValueARM_OpMul16_0(v) 660 case OpMul32: 661 return rewriteValueARM_OpMul32_0(v) 662 case OpMul32F: 663 return rewriteValueARM_OpMul32F_0(v) 664 case OpMul32uhilo: 665 return rewriteValueARM_OpMul32uhilo_0(v) 666 case OpMul64F: 667 return rewriteValueARM_OpMul64F_0(v) 668 case OpMul8: 669 return rewriteValueARM_OpMul8_0(v) 670 case OpNeg16: 671 return rewriteValueARM_OpNeg16_0(v) 672 case OpNeg32: 673 return rewriteValueARM_OpNeg32_0(v) 674 case OpNeg32F: 675 return rewriteValueARM_OpNeg32F_0(v) 676 case OpNeg64F: 677 return rewriteValueARM_OpNeg64F_0(v) 678 case OpNeg8: 679 return rewriteValueARM_OpNeg8_0(v) 680 case OpNeq16: 681 return rewriteValueARM_OpNeq16_0(v) 682 case OpNeq32: 683 return rewriteValueARM_OpNeq32_0(v) 684 case OpNeq32F: 685 return rewriteValueARM_OpNeq32F_0(v) 686 case OpNeq64F: 687 return rewriteValueARM_OpNeq64F_0(v) 688 case OpNeq8: 689 return rewriteValueARM_OpNeq8_0(v) 690 case OpNeqB: 691 return rewriteValueARM_OpNeqB_0(v) 692 case OpNeqPtr: 693 return rewriteValueARM_OpNeqPtr_0(v) 694 case OpNilCheck: 695 return rewriteValueARM_OpNilCheck_0(v) 696 case OpNot: 697 return rewriteValueARM_OpNot_0(v) 698 case OpOffPtr: 699 return rewriteValueARM_OpOffPtr_0(v) 700 case OpOr16: 701 return rewriteValueARM_OpOr16_0(v) 702 case OpOr32: 703 return rewriteValueARM_OpOr32_0(v) 704 case OpOr8: 705 return rewriteValueARM_OpOr8_0(v) 706 case OpOrB: 707 return rewriteValueARM_OpOrB_0(v) 708 case OpRound32F: 709 return rewriteValueARM_OpRound32F_0(v) 710 case OpRound64F: 711 return rewriteValueARM_OpRound64F_0(v) 712 case OpRsh16Ux16: 713 return rewriteValueARM_OpRsh16Ux16_0(v) 714 case OpRsh16Ux32: 715 return rewriteValueARM_OpRsh16Ux32_0(v) 716 case OpRsh16Ux64: 717 return rewriteValueARM_OpRsh16Ux64_0(v) 718 case OpRsh16Ux8: 719 return rewriteValueARM_OpRsh16Ux8_0(v) 720 case OpRsh16x16: 721 return rewriteValueARM_OpRsh16x16_0(v) 722 case OpRsh16x32: 723 return rewriteValueARM_OpRsh16x32_0(v) 724 case OpRsh16x64: 725 return rewriteValueARM_OpRsh16x64_0(v) 726 case OpRsh16x8: 727 return rewriteValueARM_OpRsh16x8_0(v) 728 case OpRsh32Ux16: 729 return rewriteValueARM_OpRsh32Ux16_0(v) 730 case OpRsh32Ux32: 731 return rewriteValueARM_OpRsh32Ux32_0(v) 732 case OpRsh32Ux64: 733 return rewriteValueARM_OpRsh32Ux64_0(v) 734 case OpRsh32Ux8: 735 return rewriteValueARM_OpRsh32Ux8_0(v) 736 case OpRsh32x16: 737 return rewriteValueARM_OpRsh32x16_0(v) 738 case OpRsh32x32: 739 return rewriteValueARM_OpRsh32x32_0(v) 740 case OpRsh32x64: 741 return rewriteValueARM_OpRsh32x64_0(v) 742 case OpRsh32x8: 743 return rewriteValueARM_OpRsh32x8_0(v) 744 case OpRsh8Ux16: 745 return rewriteValueARM_OpRsh8Ux16_0(v) 746 case OpRsh8Ux32: 747 return rewriteValueARM_OpRsh8Ux32_0(v) 748 case OpRsh8Ux64: 749 return rewriteValueARM_OpRsh8Ux64_0(v) 750 case OpRsh8Ux8: 751 return rewriteValueARM_OpRsh8Ux8_0(v) 752 case OpRsh8x16: 753 return rewriteValueARM_OpRsh8x16_0(v) 754 case OpRsh8x32: 755 return rewriteValueARM_OpRsh8x32_0(v) 756 case OpRsh8x64: 757 return rewriteValueARM_OpRsh8x64_0(v) 758 case OpRsh8x8: 759 return rewriteValueARM_OpRsh8x8_0(v) 760 case OpSelect0: 761 return rewriteValueARM_OpSelect0_0(v) 762 case OpSelect1: 763 return rewriteValueARM_OpSelect1_0(v) 764 case OpSignExt16to32: 765 return rewriteValueARM_OpSignExt16to32_0(v) 766 case OpSignExt8to16: 767 return rewriteValueARM_OpSignExt8to16_0(v) 768 case OpSignExt8to32: 769 return rewriteValueARM_OpSignExt8to32_0(v) 770 case OpSignmask: 771 return rewriteValueARM_OpSignmask_0(v) 772 case OpSlicemask: 773 return rewriteValueARM_OpSlicemask_0(v) 774 case OpSqrt: 775 return rewriteValueARM_OpSqrt_0(v) 776 case OpStaticCall: 777 return rewriteValueARM_OpStaticCall_0(v) 778 case OpStore: 779 return rewriteValueARM_OpStore_0(v) 780 case OpSub16: 781 return rewriteValueARM_OpSub16_0(v) 782 case OpSub32: 783 return rewriteValueARM_OpSub32_0(v) 784 case OpSub32F: 785 return rewriteValueARM_OpSub32F_0(v) 786 case OpSub32carry: 787 return rewriteValueARM_OpSub32carry_0(v) 788 case OpSub32withcarry: 789 return rewriteValueARM_OpSub32withcarry_0(v) 790 case OpSub64F: 791 return rewriteValueARM_OpSub64F_0(v) 792 case OpSub8: 793 return rewriteValueARM_OpSub8_0(v) 794 case OpSubPtr: 795 return rewriteValueARM_OpSubPtr_0(v) 796 case OpTrunc16to8: 797 return rewriteValueARM_OpTrunc16to8_0(v) 798 case OpTrunc32to16: 799 return rewriteValueARM_OpTrunc32to16_0(v) 800 case OpTrunc32to8: 801 return rewriteValueARM_OpTrunc32to8_0(v) 802 case OpXor16: 803 return rewriteValueARM_OpXor16_0(v) 804 case OpXor32: 805 return rewriteValueARM_OpXor32_0(v) 806 case OpXor8: 807 return rewriteValueARM_OpXor8_0(v) 808 case OpZero: 809 return rewriteValueARM_OpZero_0(v) 810 case OpZeroExt16to32: 811 return rewriteValueARM_OpZeroExt16to32_0(v) 812 case OpZeroExt8to16: 813 return rewriteValueARM_OpZeroExt8to16_0(v) 814 case OpZeroExt8to32: 815 return rewriteValueARM_OpZeroExt8to32_0(v) 816 case OpZeromask: 817 return rewriteValueARM_OpZeromask_0(v) 818 } 819 return false 820 } 821 func rewriteValueARM_OpARMADC_0(v *Value) bool { 822 // match: (ADC (MOVWconst [c]) x flags) 823 // cond: 824 // result: (ADCconst [c] x flags) 825 for { 826 _ = v.Args[2] 827 v_0 := v.Args[0] 828 if v_0.Op != OpARMMOVWconst { 829 break 830 } 831 c := v_0.AuxInt 832 x := v.Args[1] 833 flags := v.Args[2] 834 v.reset(OpARMADCconst) 835 v.AuxInt = c 836 v.AddArg(x) 837 v.AddArg(flags) 838 return true 839 } 840 // match: (ADC x (MOVWconst [c]) flags) 841 // cond: 842 // result: (ADCconst [c] x flags) 843 for { 844 _ = v.Args[2] 845 x := v.Args[0] 846 v_1 := v.Args[1] 847 if v_1.Op != OpARMMOVWconst { 848 break 849 } 850 c := v_1.AuxInt 851 flags := v.Args[2] 852 v.reset(OpARMADCconst) 853 v.AuxInt = c 854 v.AddArg(x) 855 v.AddArg(flags) 856 return true 857 } 858 // match: (ADC x (MOVWconst [c]) flags) 859 // cond: 860 // result: (ADCconst [c] x flags) 861 for { 862 _ = v.Args[2] 863 x := v.Args[0] 864 v_1 := v.Args[1] 865 if v_1.Op != OpARMMOVWconst { 866 break 867 } 868 c := v_1.AuxInt 869 flags := v.Args[2] 870 v.reset(OpARMADCconst) 871 v.AuxInt = c 872 v.AddArg(x) 873 v.AddArg(flags) 874 return true 875 } 876 // match: (ADC (MOVWconst [c]) x flags) 877 // cond: 878 // result: (ADCconst [c] x flags) 879 for { 880 _ = v.Args[2] 881 v_0 := v.Args[0] 882 if v_0.Op != OpARMMOVWconst { 883 break 884 } 885 c := v_0.AuxInt 886 x := v.Args[1] 887 flags := v.Args[2] 888 v.reset(OpARMADCconst) 889 v.AuxInt = c 890 v.AddArg(x) 891 v.AddArg(flags) 892 return true 893 } 894 // match: (ADC x (SLLconst [c] y) flags) 895 // cond: 896 // result: (ADCshiftLL x y [c] flags) 897 for { 898 _ = v.Args[2] 899 x := v.Args[0] 900 v_1 := v.Args[1] 901 if v_1.Op != OpARMSLLconst { 902 break 903 } 904 c := v_1.AuxInt 905 y := v_1.Args[0] 906 flags := v.Args[2] 907 v.reset(OpARMADCshiftLL) 908 v.AuxInt = c 909 v.AddArg(x) 910 v.AddArg(y) 911 v.AddArg(flags) 912 return true 913 } 914 // match: (ADC (SLLconst [c] y) x flags) 915 // cond: 916 // result: (ADCshiftLL x y [c] flags) 917 for { 918 _ = v.Args[2] 919 v_0 := v.Args[0] 920 if v_0.Op != OpARMSLLconst { 921 break 922 } 923 c := v_0.AuxInt 924 y := v_0.Args[0] 925 x := v.Args[1] 926 flags := v.Args[2] 927 v.reset(OpARMADCshiftLL) 928 v.AuxInt = c 929 v.AddArg(x) 930 v.AddArg(y) 931 v.AddArg(flags) 932 return true 933 } 934 // match: (ADC (SLLconst [c] y) x flags) 935 // cond: 936 // result: (ADCshiftLL x y [c] flags) 937 for { 938 _ = v.Args[2] 939 v_0 := v.Args[0] 940 if v_0.Op != OpARMSLLconst { 941 break 942 } 943 c := v_0.AuxInt 944 y := v_0.Args[0] 945 x := v.Args[1] 946 flags := v.Args[2] 947 v.reset(OpARMADCshiftLL) 948 v.AuxInt = c 949 v.AddArg(x) 950 v.AddArg(y) 951 v.AddArg(flags) 952 return true 953 } 954 // match: (ADC x (SLLconst [c] y) flags) 955 // cond: 956 // result: (ADCshiftLL x y [c] flags) 957 for { 958 _ = v.Args[2] 959 x := v.Args[0] 960 v_1 := v.Args[1] 961 if v_1.Op != OpARMSLLconst { 962 break 963 } 964 c := v_1.AuxInt 965 y := v_1.Args[0] 966 flags := v.Args[2] 967 v.reset(OpARMADCshiftLL) 968 v.AuxInt = c 969 v.AddArg(x) 970 v.AddArg(y) 971 v.AddArg(flags) 972 return true 973 } 974 // match: (ADC x (SRLconst [c] y) flags) 975 // cond: 976 // result: (ADCshiftRL x y [c] flags) 977 for { 978 _ = v.Args[2] 979 x := v.Args[0] 980 v_1 := v.Args[1] 981 if v_1.Op != OpARMSRLconst { 982 break 983 } 984 c := v_1.AuxInt 985 y := v_1.Args[0] 986 flags := v.Args[2] 987 v.reset(OpARMADCshiftRL) 988 v.AuxInt = c 989 v.AddArg(x) 990 v.AddArg(y) 991 v.AddArg(flags) 992 return true 993 } 994 // match: (ADC (SRLconst [c] y) x flags) 995 // cond: 996 // result: (ADCshiftRL x y [c] flags) 997 for { 998 _ = v.Args[2] 999 v_0 := v.Args[0] 1000 if v_0.Op != OpARMSRLconst { 1001 break 1002 } 1003 c := v_0.AuxInt 1004 y := v_0.Args[0] 1005 x := v.Args[1] 1006 flags := v.Args[2] 1007 v.reset(OpARMADCshiftRL) 1008 v.AuxInt = c 1009 v.AddArg(x) 1010 v.AddArg(y) 1011 v.AddArg(flags) 1012 return true 1013 } 1014 return false 1015 } 1016 func rewriteValueARM_OpARMADC_10(v *Value) bool { 1017 // match: (ADC (SRLconst [c] y) x flags) 1018 // cond: 1019 // result: (ADCshiftRL x y [c] flags) 1020 for { 1021 _ = v.Args[2] 1022 v_0 := v.Args[0] 1023 if v_0.Op != OpARMSRLconst { 1024 break 1025 } 1026 c := v_0.AuxInt 1027 y := v_0.Args[0] 1028 x := v.Args[1] 1029 flags := v.Args[2] 1030 v.reset(OpARMADCshiftRL) 1031 v.AuxInt = c 1032 v.AddArg(x) 1033 v.AddArg(y) 1034 v.AddArg(flags) 1035 return true 1036 } 1037 // match: (ADC x (SRLconst [c] y) flags) 1038 // cond: 1039 // result: (ADCshiftRL x y [c] flags) 1040 for { 1041 _ = v.Args[2] 1042 x := v.Args[0] 1043 v_1 := v.Args[1] 1044 if v_1.Op != OpARMSRLconst { 1045 break 1046 } 1047 c := v_1.AuxInt 1048 y := v_1.Args[0] 1049 flags := v.Args[2] 1050 v.reset(OpARMADCshiftRL) 1051 v.AuxInt = c 1052 v.AddArg(x) 1053 v.AddArg(y) 1054 v.AddArg(flags) 1055 return true 1056 } 1057 // match: (ADC x (SRAconst [c] y) flags) 1058 // cond: 1059 // result: (ADCshiftRA x y [c] flags) 1060 for { 1061 _ = v.Args[2] 1062 x := v.Args[0] 1063 v_1 := v.Args[1] 1064 if v_1.Op != OpARMSRAconst { 1065 break 1066 } 1067 c := v_1.AuxInt 1068 y := v_1.Args[0] 1069 flags := v.Args[2] 1070 v.reset(OpARMADCshiftRA) 1071 v.AuxInt = c 1072 v.AddArg(x) 1073 v.AddArg(y) 1074 v.AddArg(flags) 1075 return true 1076 } 1077 // match: (ADC (SRAconst [c] y) x flags) 1078 // cond: 1079 // result: (ADCshiftRA x y [c] flags) 1080 for { 1081 _ = v.Args[2] 1082 v_0 := v.Args[0] 1083 if v_0.Op != OpARMSRAconst { 1084 break 1085 } 1086 c := v_0.AuxInt 1087 y := v_0.Args[0] 1088 x := v.Args[1] 1089 flags := v.Args[2] 1090 v.reset(OpARMADCshiftRA) 1091 v.AuxInt = c 1092 v.AddArg(x) 1093 v.AddArg(y) 1094 v.AddArg(flags) 1095 return true 1096 } 1097 // match: (ADC (SRAconst [c] y) x flags) 1098 // cond: 1099 // result: (ADCshiftRA x y [c] flags) 1100 for { 1101 _ = v.Args[2] 1102 v_0 := v.Args[0] 1103 if v_0.Op != OpARMSRAconst { 1104 break 1105 } 1106 c := v_0.AuxInt 1107 y := v_0.Args[0] 1108 x := v.Args[1] 1109 flags := v.Args[2] 1110 v.reset(OpARMADCshiftRA) 1111 v.AuxInt = c 1112 v.AddArg(x) 1113 v.AddArg(y) 1114 v.AddArg(flags) 1115 return true 1116 } 1117 // match: (ADC x (SRAconst [c] y) flags) 1118 // cond: 1119 // result: (ADCshiftRA x y [c] flags) 1120 for { 1121 _ = v.Args[2] 1122 x := v.Args[0] 1123 v_1 := v.Args[1] 1124 if v_1.Op != OpARMSRAconst { 1125 break 1126 } 1127 c := v_1.AuxInt 1128 y := v_1.Args[0] 1129 flags := v.Args[2] 1130 v.reset(OpARMADCshiftRA) 1131 v.AuxInt = c 1132 v.AddArg(x) 1133 v.AddArg(y) 1134 v.AddArg(flags) 1135 return true 1136 } 1137 // match: (ADC x (SLL y z) flags) 1138 // cond: 1139 // result: (ADCshiftLLreg x y z flags) 1140 for { 1141 _ = v.Args[2] 1142 x := v.Args[0] 1143 v_1 := v.Args[1] 1144 if v_1.Op != OpARMSLL { 1145 break 1146 } 1147 _ = v_1.Args[1] 1148 y := v_1.Args[0] 1149 z := v_1.Args[1] 1150 flags := v.Args[2] 1151 v.reset(OpARMADCshiftLLreg) 1152 v.AddArg(x) 1153 v.AddArg(y) 1154 v.AddArg(z) 1155 v.AddArg(flags) 1156 return true 1157 } 1158 // match: (ADC (SLL y z) x flags) 1159 // cond: 1160 // result: (ADCshiftLLreg x y z flags) 1161 for { 1162 _ = v.Args[2] 1163 v_0 := v.Args[0] 1164 if v_0.Op != OpARMSLL { 1165 break 1166 } 1167 _ = v_0.Args[1] 1168 y := v_0.Args[0] 1169 z := v_0.Args[1] 1170 x := v.Args[1] 1171 flags := v.Args[2] 1172 v.reset(OpARMADCshiftLLreg) 1173 v.AddArg(x) 1174 v.AddArg(y) 1175 v.AddArg(z) 1176 v.AddArg(flags) 1177 return true 1178 } 1179 // match: (ADC (SLL y z) x flags) 1180 // cond: 1181 // result: (ADCshiftLLreg x y z flags) 1182 for { 1183 _ = v.Args[2] 1184 v_0 := v.Args[0] 1185 if v_0.Op != OpARMSLL { 1186 break 1187 } 1188 _ = v_0.Args[1] 1189 y := v_0.Args[0] 1190 z := v_0.Args[1] 1191 x := v.Args[1] 1192 flags := v.Args[2] 1193 v.reset(OpARMADCshiftLLreg) 1194 v.AddArg(x) 1195 v.AddArg(y) 1196 v.AddArg(z) 1197 v.AddArg(flags) 1198 return true 1199 } 1200 // match: (ADC x (SLL y z) flags) 1201 // cond: 1202 // result: (ADCshiftLLreg x y z flags) 1203 for { 1204 _ = v.Args[2] 1205 x := v.Args[0] 1206 v_1 := v.Args[1] 1207 if v_1.Op != OpARMSLL { 1208 break 1209 } 1210 _ = v_1.Args[1] 1211 y := v_1.Args[0] 1212 z := v_1.Args[1] 1213 flags := v.Args[2] 1214 v.reset(OpARMADCshiftLLreg) 1215 v.AddArg(x) 1216 v.AddArg(y) 1217 v.AddArg(z) 1218 v.AddArg(flags) 1219 return true 1220 } 1221 return false 1222 } 1223 func rewriteValueARM_OpARMADC_20(v *Value) bool { 1224 // match: (ADC x (SRL y z) flags) 1225 // cond: 1226 // result: (ADCshiftRLreg x y z flags) 1227 for { 1228 _ = v.Args[2] 1229 x := v.Args[0] 1230 v_1 := v.Args[1] 1231 if v_1.Op != OpARMSRL { 1232 break 1233 } 1234 _ = v_1.Args[1] 1235 y := v_1.Args[0] 1236 z := v_1.Args[1] 1237 flags := v.Args[2] 1238 v.reset(OpARMADCshiftRLreg) 1239 v.AddArg(x) 1240 v.AddArg(y) 1241 v.AddArg(z) 1242 v.AddArg(flags) 1243 return true 1244 } 1245 // match: (ADC (SRL y z) x flags) 1246 // cond: 1247 // result: (ADCshiftRLreg x y z flags) 1248 for { 1249 _ = v.Args[2] 1250 v_0 := v.Args[0] 1251 if v_0.Op != OpARMSRL { 1252 break 1253 } 1254 _ = v_0.Args[1] 1255 y := v_0.Args[0] 1256 z := v_0.Args[1] 1257 x := v.Args[1] 1258 flags := v.Args[2] 1259 v.reset(OpARMADCshiftRLreg) 1260 v.AddArg(x) 1261 v.AddArg(y) 1262 v.AddArg(z) 1263 v.AddArg(flags) 1264 return true 1265 } 1266 // match: (ADC (SRL y z) x flags) 1267 // cond: 1268 // result: (ADCshiftRLreg x y z flags) 1269 for { 1270 _ = v.Args[2] 1271 v_0 := v.Args[0] 1272 if v_0.Op != OpARMSRL { 1273 break 1274 } 1275 _ = v_0.Args[1] 1276 y := v_0.Args[0] 1277 z := v_0.Args[1] 1278 x := v.Args[1] 1279 flags := v.Args[2] 1280 v.reset(OpARMADCshiftRLreg) 1281 v.AddArg(x) 1282 v.AddArg(y) 1283 v.AddArg(z) 1284 v.AddArg(flags) 1285 return true 1286 } 1287 // match: (ADC x (SRL y z) flags) 1288 // cond: 1289 // result: (ADCshiftRLreg x y z flags) 1290 for { 1291 _ = v.Args[2] 1292 x := v.Args[0] 1293 v_1 := v.Args[1] 1294 if v_1.Op != OpARMSRL { 1295 break 1296 } 1297 _ = v_1.Args[1] 1298 y := v_1.Args[0] 1299 z := v_1.Args[1] 1300 flags := v.Args[2] 1301 v.reset(OpARMADCshiftRLreg) 1302 v.AddArg(x) 1303 v.AddArg(y) 1304 v.AddArg(z) 1305 v.AddArg(flags) 1306 return true 1307 } 1308 // match: (ADC x (SRA y z) flags) 1309 // cond: 1310 // result: (ADCshiftRAreg x y z flags) 1311 for { 1312 _ = v.Args[2] 1313 x := v.Args[0] 1314 v_1 := v.Args[1] 1315 if v_1.Op != OpARMSRA { 1316 break 1317 } 1318 _ = v_1.Args[1] 1319 y := v_1.Args[0] 1320 z := v_1.Args[1] 1321 flags := v.Args[2] 1322 v.reset(OpARMADCshiftRAreg) 1323 v.AddArg(x) 1324 v.AddArg(y) 1325 v.AddArg(z) 1326 v.AddArg(flags) 1327 return true 1328 } 1329 // match: (ADC (SRA y z) x flags) 1330 // cond: 1331 // result: (ADCshiftRAreg x y z flags) 1332 for { 1333 _ = v.Args[2] 1334 v_0 := v.Args[0] 1335 if v_0.Op != OpARMSRA { 1336 break 1337 } 1338 _ = v_0.Args[1] 1339 y := v_0.Args[0] 1340 z := v_0.Args[1] 1341 x := v.Args[1] 1342 flags := v.Args[2] 1343 v.reset(OpARMADCshiftRAreg) 1344 v.AddArg(x) 1345 v.AddArg(y) 1346 v.AddArg(z) 1347 v.AddArg(flags) 1348 return true 1349 } 1350 // match: (ADC (SRA y z) x flags) 1351 // cond: 1352 // result: (ADCshiftRAreg x y z flags) 1353 for { 1354 _ = v.Args[2] 1355 v_0 := v.Args[0] 1356 if v_0.Op != OpARMSRA { 1357 break 1358 } 1359 _ = v_0.Args[1] 1360 y := v_0.Args[0] 1361 z := v_0.Args[1] 1362 x := v.Args[1] 1363 flags := v.Args[2] 1364 v.reset(OpARMADCshiftRAreg) 1365 v.AddArg(x) 1366 v.AddArg(y) 1367 v.AddArg(z) 1368 v.AddArg(flags) 1369 return true 1370 } 1371 // match: (ADC x (SRA y z) flags) 1372 // cond: 1373 // result: (ADCshiftRAreg x y z flags) 1374 for { 1375 _ = v.Args[2] 1376 x := v.Args[0] 1377 v_1 := v.Args[1] 1378 if v_1.Op != OpARMSRA { 1379 break 1380 } 1381 _ = v_1.Args[1] 1382 y := v_1.Args[0] 1383 z := v_1.Args[1] 1384 flags := v.Args[2] 1385 v.reset(OpARMADCshiftRAreg) 1386 v.AddArg(x) 1387 v.AddArg(y) 1388 v.AddArg(z) 1389 v.AddArg(flags) 1390 return true 1391 } 1392 return false 1393 } 1394 func rewriteValueARM_OpARMADCconst_0(v *Value) bool { 1395 // match: (ADCconst [c] (ADDconst [d] x) flags) 1396 // cond: 1397 // result: (ADCconst [int64(int32(c+d))] x flags) 1398 for { 1399 c := v.AuxInt 1400 _ = v.Args[1] 1401 v_0 := v.Args[0] 1402 if v_0.Op != OpARMADDconst { 1403 break 1404 } 1405 d := v_0.AuxInt 1406 x := v_0.Args[0] 1407 flags := v.Args[1] 1408 v.reset(OpARMADCconst) 1409 v.AuxInt = int64(int32(c + d)) 1410 v.AddArg(x) 1411 v.AddArg(flags) 1412 return true 1413 } 1414 // match: (ADCconst [c] (SUBconst [d] x) flags) 1415 // cond: 1416 // result: (ADCconst [int64(int32(c-d))] x flags) 1417 for { 1418 c := v.AuxInt 1419 _ = v.Args[1] 1420 v_0 := v.Args[0] 1421 if v_0.Op != OpARMSUBconst { 1422 break 1423 } 1424 d := v_0.AuxInt 1425 x := v_0.Args[0] 1426 flags := v.Args[1] 1427 v.reset(OpARMADCconst) 1428 v.AuxInt = int64(int32(c - d)) 1429 v.AddArg(x) 1430 v.AddArg(flags) 1431 return true 1432 } 1433 return false 1434 } 1435 func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { 1436 b := v.Block 1437 _ = b 1438 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1439 // cond: 1440 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1441 for { 1442 d := v.AuxInt 1443 _ = v.Args[2] 1444 v_0 := v.Args[0] 1445 if v_0.Op != OpARMMOVWconst { 1446 break 1447 } 1448 c := v_0.AuxInt 1449 x := v.Args[1] 1450 flags := v.Args[2] 1451 v.reset(OpARMADCconst) 1452 v.AuxInt = c 1453 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1454 v0.AuxInt = d 1455 v0.AddArg(x) 1456 v.AddArg(v0) 1457 v.AddArg(flags) 1458 return true 1459 } 1460 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1461 // cond: 1462 // result: (ADCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 1463 for { 1464 d := v.AuxInt 1465 _ = v.Args[2] 1466 x := v.Args[0] 1467 v_1 := v.Args[1] 1468 if v_1.Op != OpARMMOVWconst { 1469 break 1470 } 1471 c := v_1.AuxInt 1472 flags := v.Args[2] 1473 v.reset(OpARMADCconst) 1474 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 1475 v.AddArg(x) 1476 v.AddArg(flags) 1477 return true 1478 } 1479 return false 1480 } 1481 func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { 1482 b := v.Block 1483 _ = b 1484 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1485 // cond: 1486 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1487 for { 1488 _ = v.Args[3] 1489 v_0 := v.Args[0] 1490 if v_0.Op != OpARMMOVWconst { 1491 break 1492 } 1493 c := v_0.AuxInt 1494 x := v.Args[1] 1495 y := v.Args[2] 1496 flags := v.Args[3] 1497 v.reset(OpARMADCconst) 1498 v.AuxInt = c 1499 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1500 v0.AddArg(x) 1501 v0.AddArg(y) 1502 v.AddArg(v0) 1503 v.AddArg(flags) 1504 return true 1505 } 1506 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1507 // cond: 1508 // result: (ADCshiftLL x y [c] flags) 1509 for { 1510 _ = v.Args[3] 1511 x := v.Args[0] 1512 y := v.Args[1] 1513 v_2 := v.Args[2] 1514 if v_2.Op != OpARMMOVWconst { 1515 break 1516 } 1517 c := v_2.AuxInt 1518 flags := v.Args[3] 1519 v.reset(OpARMADCshiftLL) 1520 v.AuxInt = c 1521 v.AddArg(x) 1522 v.AddArg(y) 1523 v.AddArg(flags) 1524 return true 1525 } 1526 return false 1527 } 1528 func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { 1529 b := v.Block 1530 _ = b 1531 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1532 // cond: 1533 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1534 for { 1535 d := v.AuxInt 1536 _ = v.Args[2] 1537 v_0 := v.Args[0] 1538 if v_0.Op != OpARMMOVWconst { 1539 break 1540 } 1541 c := v_0.AuxInt 1542 x := v.Args[1] 1543 flags := v.Args[2] 1544 v.reset(OpARMADCconst) 1545 v.AuxInt = c 1546 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1547 v0.AuxInt = d 1548 v0.AddArg(x) 1549 v.AddArg(v0) 1550 v.AddArg(flags) 1551 return true 1552 } 1553 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1554 // cond: 1555 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1556 for { 1557 d := v.AuxInt 1558 _ = v.Args[2] 1559 x := v.Args[0] 1560 v_1 := v.Args[1] 1561 if v_1.Op != OpARMMOVWconst { 1562 break 1563 } 1564 c := v_1.AuxInt 1565 flags := v.Args[2] 1566 v.reset(OpARMADCconst) 1567 v.AuxInt = int64(int32(c) >> uint64(d)) 1568 v.AddArg(x) 1569 v.AddArg(flags) 1570 return true 1571 } 1572 return false 1573 } 1574 func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { 1575 b := v.Block 1576 _ = b 1577 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1578 // cond: 1579 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1580 for { 1581 _ = v.Args[3] 1582 v_0 := v.Args[0] 1583 if v_0.Op != OpARMMOVWconst { 1584 break 1585 } 1586 c := v_0.AuxInt 1587 x := v.Args[1] 1588 y := v.Args[2] 1589 flags := v.Args[3] 1590 v.reset(OpARMADCconst) 1591 v.AuxInt = c 1592 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1593 v0.AddArg(x) 1594 v0.AddArg(y) 1595 v.AddArg(v0) 1596 v.AddArg(flags) 1597 return true 1598 } 1599 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1600 // cond: 1601 // result: (ADCshiftRA x y [c] flags) 1602 for { 1603 _ = v.Args[3] 1604 x := v.Args[0] 1605 y := v.Args[1] 1606 v_2 := v.Args[2] 1607 if v_2.Op != OpARMMOVWconst { 1608 break 1609 } 1610 c := v_2.AuxInt 1611 flags := v.Args[3] 1612 v.reset(OpARMADCshiftRA) 1613 v.AuxInt = c 1614 v.AddArg(x) 1615 v.AddArg(y) 1616 v.AddArg(flags) 1617 return true 1618 } 1619 return false 1620 } 1621 func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { 1622 b := v.Block 1623 _ = b 1624 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1625 // cond: 1626 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1627 for { 1628 d := v.AuxInt 1629 _ = v.Args[2] 1630 v_0 := v.Args[0] 1631 if v_0.Op != OpARMMOVWconst { 1632 break 1633 } 1634 c := v_0.AuxInt 1635 x := v.Args[1] 1636 flags := v.Args[2] 1637 v.reset(OpARMADCconst) 1638 v.AuxInt = c 1639 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1640 v0.AuxInt = d 1641 v0.AddArg(x) 1642 v.AddArg(v0) 1643 v.AddArg(flags) 1644 return true 1645 } 1646 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1647 // cond: 1648 // result: (ADCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 1649 for { 1650 d := v.AuxInt 1651 _ = v.Args[2] 1652 x := v.Args[0] 1653 v_1 := v.Args[1] 1654 if v_1.Op != OpARMMOVWconst { 1655 break 1656 } 1657 c := v_1.AuxInt 1658 flags := v.Args[2] 1659 v.reset(OpARMADCconst) 1660 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 1661 v.AddArg(x) 1662 v.AddArg(flags) 1663 return true 1664 } 1665 return false 1666 } 1667 func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { 1668 b := v.Block 1669 _ = b 1670 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1671 // cond: 1672 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1673 for { 1674 _ = v.Args[3] 1675 v_0 := v.Args[0] 1676 if v_0.Op != OpARMMOVWconst { 1677 break 1678 } 1679 c := v_0.AuxInt 1680 x := v.Args[1] 1681 y := v.Args[2] 1682 flags := v.Args[3] 1683 v.reset(OpARMADCconst) 1684 v.AuxInt = c 1685 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1686 v0.AddArg(x) 1687 v0.AddArg(y) 1688 v.AddArg(v0) 1689 v.AddArg(flags) 1690 return true 1691 } 1692 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1693 // cond: 1694 // result: (ADCshiftRL x y [c] flags) 1695 for { 1696 _ = v.Args[3] 1697 x := v.Args[0] 1698 y := v.Args[1] 1699 v_2 := v.Args[2] 1700 if v_2.Op != OpARMMOVWconst { 1701 break 1702 } 1703 c := v_2.AuxInt 1704 flags := v.Args[3] 1705 v.reset(OpARMADCshiftRL) 1706 v.AuxInt = c 1707 v.AddArg(x) 1708 v.AddArg(y) 1709 v.AddArg(flags) 1710 return true 1711 } 1712 return false 1713 } 1714 func rewriteValueARM_OpARMADD_0(v *Value) bool { 1715 // match: (ADD x (MOVWconst [c])) 1716 // cond: 1717 // result: (ADDconst [c] x) 1718 for { 1719 _ = v.Args[1] 1720 x := v.Args[0] 1721 v_1 := v.Args[1] 1722 if v_1.Op != OpARMMOVWconst { 1723 break 1724 } 1725 c := v_1.AuxInt 1726 v.reset(OpARMADDconst) 1727 v.AuxInt = c 1728 v.AddArg(x) 1729 return true 1730 } 1731 // match: (ADD (MOVWconst [c]) x) 1732 // cond: 1733 // result: (ADDconst [c] x) 1734 for { 1735 _ = v.Args[1] 1736 v_0 := v.Args[0] 1737 if v_0.Op != OpARMMOVWconst { 1738 break 1739 } 1740 c := v_0.AuxInt 1741 x := v.Args[1] 1742 v.reset(OpARMADDconst) 1743 v.AuxInt = c 1744 v.AddArg(x) 1745 return true 1746 } 1747 // match: (ADD x (SLLconst [c] y)) 1748 // cond: 1749 // result: (ADDshiftLL x y [c]) 1750 for { 1751 _ = v.Args[1] 1752 x := v.Args[0] 1753 v_1 := v.Args[1] 1754 if v_1.Op != OpARMSLLconst { 1755 break 1756 } 1757 c := v_1.AuxInt 1758 y := v_1.Args[0] 1759 v.reset(OpARMADDshiftLL) 1760 v.AuxInt = c 1761 v.AddArg(x) 1762 v.AddArg(y) 1763 return true 1764 } 1765 // match: (ADD (SLLconst [c] y) x) 1766 // cond: 1767 // result: (ADDshiftLL x y [c]) 1768 for { 1769 _ = v.Args[1] 1770 v_0 := v.Args[0] 1771 if v_0.Op != OpARMSLLconst { 1772 break 1773 } 1774 c := v_0.AuxInt 1775 y := v_0.Args[0] 1776 x := v.Args[1] 1777 v.reset(OpARMADDshiftLL) 1778 v.AuxInt = c 1779 v.AddArg(x) 1780 v.AddArg(y) 1781 return true 1782 } 1783 // match: (ADD x (SRLconst [c] y)) 1784 // cond: 1785 // result: (ADDshiftRL x y [c]) 1786 for { 1787 _ = v.Args[1] 1788 x := v.Args[0] 1789 v_1 := v.Args[1] 1790 if v_1.Op != OpARMSRLconst { 1791 break 1792 } 1793 c := v_1.AuxInt 1794 y := v_1.Args[0] 1795 v.reset(OpARMADDshiftRL) 1796 v.AuxInt = c 1797 v.AddArg(x) 1798 v.AddArg(y) 1799 return true 1800 } 1801 // match: (ADD (SRLconst [c] y) x) 1802 // cond: 1803 // result: (ADDshiftRL x y [c]) 1804 for { 1805 _ = v.Args[1] 1806 v_0 := v.Args[0] 1807 if v_0.Op != OpARMSRLconst { 1808 break 1809 } 1810 c := v_0.AuxInt 1811 y := v_0.Args[0] 1812 x := v.Args[1] 1813 v.reset(OpARMADDshiftRL) 1814 v.AuxInt = c 1815 v.AddArg(x) 1816 v.AddArg(y) 1817 return true 1818 } 1819 // match: (ADD x (SRAconst [c] y)) 1820 // cond: 1821 // result: (ADDshiftRA x y [c]) 1822 for { 1823 _ = v.Args[1] 1824 x := v.Args[0] 1825 v_1 := v.Args[1] 1826 if v_1.Op != OpARMSRAconst { 1827 break 1828 } 1829 c := v_1.AuxInt 1830 y := v_1.Args[0] 1831 v.reset(OpARMADDshiftRA) 1832 v.AuxInt = c 1833 v.AddArg(x) 1834 v.AddArg(y) 1835 return true 1836 } 1837 // match: (ADD (SRAconst [c] y) x) 1838 // cond: 1839 // result: (ADDshiftRA x y [c]) 1840 for { 1841 _ = v.Args[1] 1842 v_0 := v.Args[0] 1843 if v_0.Op != OpARMSRAconst { 1844 break 1845 } 1846 c := v_0.AuxInt 1847 y := v_0.Args[0] 1848 x := v.Args[1] 1849 v.reset(OpARMADDshiftRA) 1850 v.AuxInt = c 1851 v.AddArg(x) 1852 v.AddArg(y) 1853 return true 1854 } 1855 // match: (ADD x (SLL y z)) 1856 // cond: 1857 // result: (ADDshiftLLreg x y z) 1858 for { 1859 _ = v.Args[1] 1860 x := v.Args[0] 1861 v_1 := v.Args[1] 1862 if v_1.Op != OpARMSLL { 1863 break 1864 } 1865 _ = v_1.Args[1] 1866 y := v_1.Args[0] 1867 z := v_1.Args[1] 1868 v.reset(OpARMADDshiftLLreg) 1869 v.AddArg(x) 1870 v.AddArg(y) 1871 v.AddArg(z) 1872 return true 1873 } 1874 // match: (ADD (SLL y z) x) 1875 // cond: 1876 // result: (ADDshiftLLreg x y z) 1877 for { 1878 _ = v.Args[1] 1879 v_0 := v.Args[0] 1880 if v_0.Op != OpARMSLL { 1881 break 1882 } 1883 _ = v_0.Args[1] 1884 y := v_0.Args[0] 1885 z := v_0.Args[1] 1886 x := v.Args[1] 1887 v.reset(OpARMADDshiftLLreg) 1888 v.AddArg(x) 1889 v.AddArg(y) 1890 v.AddArg(z) 1891 return true 1892 } 1893 return false 1894 } 1895 func rewriteValueARM_OpARMADD_10(v *Value) bool { 1896 b := v.Block 1897 _ = b 1898 // match: (ADD x (SRL y z)) 1899 // cond: 1900 // result: (ADDshiftRLreg x y z) 1901 for { 1902 _ = v.Args[1] 1903 x := v.Args[0] 1904 v_1 := v.Args[1] 1905 if v_1.Op != OpARMSRL { 1906 break 1907 } 1908 _ = v_1.Args[1] 1909 y := v_1.Args[0] 1910 z := v_1.Args[1] 1911 v.reset(OpARMADDshiftRLreg) 1912 v.AddArg(x) 1913 v.AddArg(y) 1914 v.AddArg(z) 1915 return true 1916 } 1917 // match: (ADD (SRL y z) x) 1918 // cond: 1919 // result: (ADDshiftRLreg x y z) 1920 for { 1921 _ = v.Args[1] 1922 v_0 := v.Args[0] 1923 if v_0.Op != OpARMSRL { 1924 break 1925 } 1926 _ = v_0.Args[1] 1927 y := v_0.Args[0] 1928 z := v_0.Args[1] 1929 x := v.Args[1] 1930 v.reset(OpARMADDshiftRLreg) 1931 v.AddArg(x) 1932 v.AddArg(y) 1933 v.AddArg(z) 1934 return true 1935 } 1936 // match: (ADD x (SRA y z)) 1937 // cond: 1938 // result: (ADDshiftRAreg x y z) 1939 for { 1940 _ = v.Args[1] 1941 x := v.Args[0] 1942 v_1 := v.Args[1] 1943 if v_1.Op != OpARMSRA { 1944 break 1945 } 1946 _ = v_1.Args[1] 1947 y := v_1.Args[0] 1948 z := v_1.Args[1] 1949 v.reset(OpARMADDshiftRAreg) 1950 v.AddArg(x) 1951 v.AddArg(y) 1952 v.AddArg(z) 1953 return true 1954 } 1955 // match: (ADD (SRA y z) x) 1956 // cond: 1957 // result: (ADDshiftRAreg x y z) 1958 for { 1959 _ = v.Args[1] 1960 v_0 := v.Args[0] 1961 if v_0.Op != OpARMSRA { 1962 break 1963 } 1964 _ = v_0.Args[1] 1965 y := v_0.Args[0] 1966 z := v_0.Args[1] 1967 x := v.Args[1] 1968 v.reset(OpARMADDshiftRAreg) 1969 v.AddArg(x) 1970 v.AddArg(y) 1971 v.AddArg(z) 1972 return true 1973 } 1974 // match: (ADD x (RSBconst [0] y)) 1975 // cond: 1976 // result: (SUB x y) 1977 for { 1978 _ = v.Args[1] 1979 x := v.Args[0] 1980 v_1 := v.Args[1] 1981 if v_1.Op != OpARMRSBconst { 1982 break 1983 } 1984 if v_1.AuxInt != 0 { 1985 break 1986 } 1987 y := v_1.Args[0] 1988 v.reset(OpARMSUB) 1989 v.AddArg(x) 1990 v.AddArg(y) 1991 return true 1992 } 1993 // match: (ADD (RSBconst [0] y) x) 1994 // cond: 1995 // result: (SUB x y) 1996 for { 1997 _ = v.Args[1] 1998 v_0 := v.Args[0] 1999 if v_0.Op != OpARMRSBconst { 2000 break 2001 } 2002 if v_0.AuxInt != 0 { 2003 break 2004 } 2005 y := v_0.Args[0] 2006 x := v.Args[1] 2007 v.reset(OpARMSUB) 2008 v.AddArg(x) 2009 v.AddArg(y) 2010 return true 2011 } 2012 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 2013 // cond: 2014 // result: (RSBconst [c+d] (ADD <t> x y)) 2015 for { 2016 t := v.Type 2017 _ = v.Args[1] 2018 v_0 := v.Args[0] 2019 if v_0.Op != OpARMRSBconst { 2020 break 2021 } 2022 c := v_0.AuxInt 2023 x := v_0.Args[0] 2024 v_1 := v.Args[1] 2025 if v_1.Op != OpARMRSBconst { 2026 break 2027 } 2028 d := v_1.AuxInt 2029 y := v_1.Args[0] 2030 v.reset(OpARMRSBconst) 2031 v.AuxInt = c + d 2032 v0 := b.NewValue0(v.Pos, OpARMADD, t) 2033 v0.AddArg(x) 2034 v0.AddArg(y) 2035 v.AddArg(v0) 2036 return true 2037 } 2038 // match: (ADD <t> (RSBconst [d] y) (RSBconst [c] x)) 2039 // cond: 2040 // result: (RSBconst [c+d] (ADD <t> x y)) 2041 for { 2042 t := v.Type 2043 _ = v.Args[1] 2044 v_0 := v.Args[0] 2045 if v_0.Op != OpARMRSBconst { 2046 break 2047 } 2048 d := v_0.AuxInt 2049 y := v_0.Args[0] 2050 v_1 := v.Args[1] 2051 if v_1.Op != OpARMRSBconst { 2052 break 2053 } 2054 c := v_1.AuxInt 2055 x := v_1.Args[0] 2056 v.reset(OpARMRSBconst) 2057 v.AuxInt = c + d 2058 v0 := b.NewValue0(v.Pos, OpARMADD, t) 2059 v0.AddArg(x) 2060 v0.AddArg(y) 2061 v.AddArg(v0) 2062 return true 2063 } 2064 // match: (ADD (MUL x y) a) 2065 // cond: 2066 // result: (MULA x y a) 2067 for { 2068 _ = v.Args[1] 2069 v_0 := v.Args[0] 2070 if v_0.Op != OpARMMUL { 2071 break 2072 } 2073 _ = v_0.Args[1] 2074 x := v_0.Args[0] 2075 y := v_0.Args[1] 2076 a := v.Args[1] 2077 v.reset(OpARMMULA) 2078 v.AddArg(x) 2079 v.AddArg(y) 2080 v.AddArg(a) 2081 return true 2082 } 2083 // match: (ADD a (MUL x y)) 2084 // cond: 2085 // result: (MULA x y a) 2086 for { 2087 _ = v.Args[1] 2088 a := v.Args[0] 2089 v_1 := v.Args[1] 2090 if v_1.Op != OpARMMUL { 2091 break 2092 } 2093 _ = v_1.Args[1] 2094 x := v_1.Args[0] 2095 y := v_1.Args[1] 2096 v.reset(OpARMMULA) 2097 v.AddArg(x) 2098 v.AddArg(y) 2099 v.AddArg(a) 2100 return true 2101 } 2102 return false 2103 } 2104 func rewriteValueARM_OpARMADDD_0(v *Value) bool { 2105 // match: (ADDD a (MULD x y)) 2106 // cond: a.Uses == 1 && objabi.GOARM >= 6 2107 // result: (MULAD a x y) 2108 for { 2109 _ = v.Args[1] 2110 a := v.Args[0] 2111 v_1 := v.Args[1] 2112 if v_1.Op != OpARMMULD { 2113 break 2114 } 2115 _ = v_1.Args[1] 2116 x := v_1.Args[0] 2117 y := v_1.Args[1] 2118 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2119 break 2120 } 2121 v.reset(OpARMMULAD) 2122 v.AddArg(a) 2123 v.AddArg(x) 2124 v.AddArg(y) 2125 return true 2126 } 2127 // match: (ADDD (MULD x y) a) 2128 // cond: a.Uses == 1 && objabi.GOARM >= 6 2129 // result: (MULAD a x y) 2130 for { 2131 _ = v.Args[1] 2132 v_0 := v.Args[0] 2133 if v_0.Op != OpARMMULD { 2134 break 2135 } 2136 _ = v_0.Args[1] 2137 x := v_0.Args[0] 2138 y := v_0.Args[1] 2139 a := v.Args[1] 2140 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2141 break 2142 } 2143 v.reset(OpARMMULAD) 2144 v.AddArg(a) 2145 v.AddArg(x) 2146 v.AddArg(y) 2147 return true 2148 } 2149 // match: (ADDD a (NMULD x y)) 2150 // cond: a.Uses == 1 && objabi.GOARM >= 6 2151 // result: (MULSD a x y) 2152 for { 2153 _ = v.Args[1] 2154 a := v.Args[0] 2155 v_1 := v.Args[1] 2156 if v_1.Op != OpARMNMULD { 2157 break 2158 } 2159 _ = v_1.Args[1] 2160 x := v_1.Args[0] 2161 y := v_1.Args[1] 2162 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2163 break 2164 } 2165 v.reset(OpARMMULSD) 2166 v.AddArg(a) 2167 v.AddArg(x) 2168 v.AddArg(y) 2169 return true 2170 } 2171 // match: (ADDD (NMULD x y) a) 2172 // cond: a.Uses == 1 && objabi.GOARM >= 6 2173 // result: (MULSD a x y) 2174 for { 2175 _ = v.Args[1] 2176 v_0 := v.Args[0] 2177 if v_0.Op != OpARMNMULD { 2178 break 2179 } 2180 _ = v_0.Args[1] 2181 x := v_0.Args[0] 2182 y := v_0.Args[1] 2183 a := v.Args[1] 2184 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2185 break 2186 } 2187 v.reset(OpARMMULSD) 2188 v.AddArg(a) 2189 v.AddArg(x) 2190 v.AddArg(y) 2191 return true 2192 } 2193 return false 2194 } 2195 func rewriteValueARM_OpARMADDF_0(v *Value) bool { 2196 // match: (ADDF a (MULF x y)) 2197 // cond: a.Uses == 1 && objabi.GOARM >= 6 2198 // result: (MULAF a x y) 2199 for { 2200 _ = v.Args[1] 2201 a := v.Args[0] 2202 v_1 := v.Args[1] 2203 if v_1.Op != OpARMMULF { 2204 break 2205 } 2206 _ = v_1.Args[1] 2207 x := v_1.Args[0] 2208 y := v_1.Args[1] 2209 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2210 break 2211 } 2212 v.reset(OpARMMULAF) 2213 v.AddArg(a) 2214 v.AddArg(x) 2215 v.AddArg(y) 2216 return true 2217 } 2218 // match: (ADDF (MULF x y) a) 2219 // cond: a.Uses == 1 && objabi.GOARM >= 6 2220 // result: (MULAF a x y) 2221 for { 2222 _ = v.Args[1] 2223 v_0 := v.Args[0] 2224 if v_0.Op != OpARMMULF { 2225 break 2226 } 2227 _ = v_0.Args[1] 2228 x := v_0.Args[0] 2229 y := v_0.Args[1] 2230 a := v.Args[1] 2231 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2232 break 2233 } 2234 v.reset(OpARMMULAF) 2235 v.AddArg(a) 2236 v.AddArg(x) 2237 v.AddArg(y) 2238 return true 2239 } 2240 // match: (ADDF a (NMULF x y)) 2241 // cond: a.Uses == 1 && objabi.GOARM >= 6 2242 // result: (MULSF a x y) 2243 for { 2244 _ = v.Args[1] 2245 a := v.Args[0] 2246 v_1 := v.Args[1] 2247 if v_1.Op != OpARMNMULF { 2248 break 2249 } 2250 _ = v_1.Args[1] 2251 x := v_1.Args[0] 2252 y := v_1.Args[1] 2253 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2254 break 2255 } 2256 v.reset(OpARMMULSF) 2257 v.AddArg(a) 2258 v.AddArg(x) 2259 v.AddArg(y) 2260 return true 2261 } 2262 // match: (ADDF (NMULF x y) a) 2263 // cond: a.Uses == 1 && objabi.GOARM >= 6 2264 // result: (MULSF a x y) 2265 for { 2266 _ = v.Args[1] 2267 v_0 := v.Args[0] 2268 if v_0.Op != OpARMNMULF { 2269 break 2270 } 2271 _ = v_0.Args[1] 2272 x := v_0.Args[0] 2273 y := v_0.Args[1] 2274 a := v.Args[1] 2275 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2276 break 2277 } 2278 v.reset(OpARMMULSF) 2279 v.AddArg(a) 2280 v.AddArg(x) 2281 v.AddArg(y) 2282 return true 2283 } 2284 return false 2285 } 2286 func rewriteValueARM_OpARMADDS_0(v *Value) bool { 2287 // match: (ADDS x (MOVWconst [c])) 2288 // cond: 2289 // result: (ADDSconst [c] x) 2290 for { 2291 _ = v.Args[1] 2292 x := v.Args[0] 2293 v_1 := v.Args[1] 2294 if v_1.Op != OpARMMOVWconst { 2295 break 2296 } 2297 c := v_1.AuxInt 2298 v.reset(OpARMADDSconst) 2299 v.AuxInt = c 2300 v.AddArg(x) 2301 return true 2302 } 2303 // match: (ADDS (MOVWconst [c]) x) 2304 // cond: 2305 // result: (ADDSconst [c] x) 2306 for { 2307 _ = v.Args[1] 2308 v_0 := v.Args[0] 2309 if v_0.Op != OpARMMOVWconst { 2310 break 2311 } 2312 c := v_0.AuxInt 2313 x := v.Args[1] 2314 v.reset(OpARMADDSconst) 2315 v.AuxInt = c 2316 v.AddArg(x) 2317 return true 2318 } 2319 // match: (ADDS x (SLLconst [c] y)) 2320 // cond: 2321 // result: (ADDSshiftLL x y [c]) 2322 for { 2323 _ = v.Args[1] 2324 x := v.Args[0] 2325 v_1 := v.Args[1] 2326 if v_1.Op != OpARMSLLconst { 2327 break 2328 } 2329 c := v_1.AuxInt 2330 y := v_1.Args[0] 2331 v.reset(OpARMADDSshiftLL) 2332 v.AuxInt = c 2333 v.AddArg(x) 2334 v.AddArg(y) 2335 return true 2336 } 2337 // match: (ADDS (SLLconst [c] y) x) 2338 // cond: 2339 // result: (ADDSshiftLL x y [c]) 2340 for { 2341 _ = v.Args[1] 2342 v_0 := v.Args[0] 2343 if v_0.Op != OpARMSLLconst { 2344 break 2345 } 2346 c := v_0.AuxInt 2347 y := v_0.Args[0] 2348 x := v.Args[1] 2349 v.reset(OpARMADDSshiftLL) 2350 v.AuxInt = c 2351 v.AddArg(x) 2352 v.AddArg(y) 2353 return true 2354 } 2355 // match: (ADDS x (SRLconst [c] y)) 2356 // cond: 2357 // result: (ADDSshiftRL x y [c]) 2358 for { 2359 _ = v.Args[1] 2360 x := v.Args[0] 2361 v_1 := v.Args[1] 2362 if v_1.Op != OpARMSRLconst { 2363 break 2364 } 2365 c := v_1.AuxInt 2366 y := v_1.Args[0] 2367 v.reset(OpARMADDSshiftRL) 2368 v.AuxInt = c 2369 v.AddArg(x) 2370 v.AddArg(y) 2371 return true 2372 } 2373 // match: (ADDS (SRLconst [c] y) x) 2374 // cond: 2375 // result: (ADDSshiftRL x y [c]) 2376 for { 2377 _ = v.Args[1] 2378 v_0 := v.Args[0] 2379 if v_0.Op != OpARMSRLconst { 2380 break 2381 } 2382 c := v_0.AuxInt 2383 y := v_0.Args[0] 2384 x := v.Args[1] 2385 v.reset(OpARMADDSshiftRL) 2386 v.AuxInt = c 2387 v.AddArg(x) 2388 v.AddArg(y) 2389 return true 2390 } 2391 // match: (ADDS x (SRAconst [c] y)) 2392 // cond: 2393 // result: (ADDSshiftRA x y [c]) 2394 for { 2395 _ = v.Args[1] 2396 x := v.Args[0] 2397 v_1 := v.Args[1] 2398 if v_1.Op != OpARMSRAconst { 2399 break 2400 } 2401 c := v_1.AuxInt 2402 y := v_1.Args[0] 2403 v.reset(OpARMADDSshiftRA) 2404 v.AuxInt = c 2405 v.AddArg(x) 2406 v.AddArg(y) 2407 return true 2408 } 2409 // match: (ADDS (SRAconst [c] y) x) 2410 // cond: 2411 // result: (ADDSshiftRA x y [c]) 2412 for { 2413 _ = v.Args[1] 2414 v_0 := v.Args[0] 2415 if v_0.Op != OpARMSRAconst { 2416 break 2417 } 2418 c := v_0.AuxInt 2419 y := v_0.Args[0] 2420 x := v.Args[1] 2421 v.reset(OpARMADDSshiftRA) 2422 v.AuxInt = c 2423 v.AddArg(x) 2424 v.AddArg(y) 2425 return true 2426 } 2427 // match: (ADDS x (SLL y z)) 2428 // cond: 2429 // result: (ADDSshiftLLreg x y z) 2430 for { 2431 _ = v.Args[1] 2432 x := v.Args[0] 2433 v_1 := v.Args[1] 2434 if v_1.Op != OpARMSLL { 2435 break 2436 } 2437 _ = v_1.Args[1] 2438 y := v_1.Args[0] 2439 z := v_1.Args[1] 2440 v.reset(OpARMADDSshiftLLreg) 2441 v.AddArg(x) 2442 v.AddArg(y) 2443 v.AddArg(z) 2444 return true 2445 } 2446 // match: (ADDS (SLL y z) x) 2447 // cond: 2448 // result: (ADDSshiftLLreg x y z) 2449 for { 2450 _ = v.Args[1] 2451 v_0 := v.Args[0] 2452 if v_0.Op != OpARMSLL { 2453 break 2454 } 2455 _ = v_0.Args[1] 2456 y := v_0.Args[0] 2457 z := v_0.Args[1] 2458 x := v.Args[1] 2459 v.reset(OpARMADDSshiftLLreg) 2460 v.AddArg(x) 2461 v.AddArg(y) 2462 v.AddArg(z) 2463 return true 2464 } 2465 return false 2466 } 2467 func rewriteValueARM_OpARMADDS_10(v *Value) bool { 2468 // match: (ADDS x (SRL y z)) 2469 // cond: 2470 // result: (ADDSshiftRLreg x y z) 2471 for { 2472 _ = v.Args[1] 2473 x := v.Args[0] 2474 v_1 := v.Args[1] 2475 if v_1.Op != OpARMSRL { 2476 break 2477 } 2478 _ = v_1.Args[1] 2479 y := v_1.Args[0] 2480 z := v_1.Args[1] 2481 v.reset(OpARMADDSshiftRLreg) 2482 v.AddArg(x) 2483 v.AddArg(y) 2484 v.AddArg(z) 2485 return true 2486 } 2487 // match: (ADDS (SRL y z) x) 2488 // cond: 2489 // result: (ADDSshiftRLreg x y z) 2490 for { 2491 _ = v.Args[1] 2492 v_0 := v.Args[0] 2493 if v_0.Op != OpARMSRL { 2494 break 2495 } 2496 _ = v_0.Args[1] 2497 y := v_0.Args[0] 2498 z := v_0.Args[1] 2499 x := v.Args[1] 2500 v.reset(OpARMADDSshiftRLreg) 2501 v.AddArg(x) 2502 v.AddArg(y) 2503 v.AddArg(z) 2504 return true 2505 } 2506 // match: (ADDS x (SRA y z)) 2507 // cond: 2508 // result: (ADDSshiftRAreg x y z) 2509 for { 2510 _ = v.Args[1] 2511 x := v.Args[0] 2512 v_1 := v.Args[1] 2513 if v_1.Op != OpARMSRA { 2514 break 2515 } 2516 _ = v_1.Args[1] 2517 y := v_1.Args[0] 2518 z := v_1.Args[1] 2519 v.reset(OpARMADDSshiftRAreg) 2520 v.AddArg(x) 2521 v.AddArg(y) 2522 v.AddArg(z) 2523 return true 2524 } 2525 // match: (ADDS (SRA y z) x) 2526 // cond: 2527 // result: (ADDSshiftRAreg x y z) 2528 for { 2529 _ = v.Args[1] 2530 v_0 := v.Args[0] 2531 if v_0.Op != OpARMSRA { 2532 break 2533 } 2534 _ = v_0.Args[1] 2535 y := v_0.Args[0] 2536 z := v_0.Args[1] 2537 x := v.Args[1] 2538 v.reset(OpARMADDSshiftRAreg) 2539 v.AddArg(x) 2540 v.AddArg(y) 2541 v.AddArg(z) 2542 return true 2543 } 2544 return false 2545 } 2546 func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { 2547 b := v.Block 2548 _ = b 2549 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 2550 // cond: 2551 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 2552 for { 2553 d := v.AuxInt 2554 _ = v.Args[1] 2555 v_0 := v.Args[0] 2556 if v_0.Op != OpARMMOVWconst { 2557 break 2558 } 2559 c := v_0.AuxInt 2560 x := v.Args[1] 2561 v.reset(OpARMADDSconst) 2562 v.AuxInt = c 2563 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2564 v0.AuxInt = d 2565 v0.AddArg(x) 2566 v.AddArg(v0) 2567 return true 2568 } 2569 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 2570 // cond: 2571 // result: (ADDSconst x [int64(int32(uint32(c)<<uint64(d)))]) 2572 for { 2573 d := v.AuxInt 2574 _ = v.Args[1] 2575 x := v.Args[0] 2576 v_1 := v.Args[1] 2577 if v_1.Op != OpARMMOVWconst { 2578 break 2579 } 2580 c := v_1.AuxInt 2581 v.reset(OpARMADDSconst) 2582 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 2583 v.AddArg(x) 2584 return true 2585 } 2586 return false 2587 } 2588 func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { 2589 b := v.Block 2590 _ = b 2591 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 2592 // cond: 2593 // result: (ADDSconst [c] (SLL <x.Type> x y)) 2594 for { 2595 _ = v.Args[2] 2596 v_0 := v.Args[0] 2597 if v_0.Op != OpARMMOVWconst { 2598 break 2599 } 2600 c := v_0.AuxInt 2601 x := v.Args[1] 2602 y := v.Args[2] 2603 v.reset(OpARMADDSconst) 2604 v.AuxInt = c 2605 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2606 v0.AddArg(x) 2607 v0.AddArg(y) 2608 v.AddArg(v0) 2609 return true 2610 } 2611 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 2612 // cond: 2613 // result: (ADDSshiftLL x y [c]) 2614 for { 2615 _ = v.Args[2] 2616 x := v.Args[0] 2617 y := v.Args[1] 2618 v_2 := v.Args[2] 2619 if v_2.Op != OpARMMOVWconst { 2620 break 2621 } 2622 c := v_2.AuxInt 2623 v.reset(OpARMADDSshiftLL) 2624 v.AuxInt = c 2625 v.AddArg(x) 2626 v.AddArg(y) 2627 return true 2628 } 2629 return false 2630 } 2631 func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { 2632 b := v.Block 2633 _ = b 2634 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 2635 // cond: 2636 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 2637 for { 2638 d := v.AuxInt 2639 _ = v.Args[1] 2640 v_0 := v.Args[0] 2641 if v_0.Op != OpARMMOVWconst { 2642 break 2643 } 2644 c := v_0.AuxInt 2645 x := v.Args[1] 2646 v.reset(OpARMADDSconst) 2647 v.AuxInt = c 2648 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2649 v0.AuxInt = d 2650 v0.AddArg(x) 2651 v.AddArg(v0) 2652 return true 2653 } 2654 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 2655 // cond: 2656 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 2657 for { 2658 d := v.AuxInt 2659 _ = v.Args[1] 2660 x := v.Args[0] 2661 v_1 := v.Args[1] 2662 if v_1.Op != OpARMMOVWconst { 2663 break 2664 } 2665 c := v_1.AuxInt 2666 v.reset(OpARMADDSconst) 2667 v.AuxInt = int64(int32(c) >> uint64(d)) 2668 v.AddArg(x) 2669 return true 2670 } 2671 return false 2672 } 2673 func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { 2674 b := v.Block 2675 _ = b 2676 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 2677 // cond: 2678 // result: (ADDSconst [c] (SRA <x.Type> x y)) 2679 for { 2680 _ = v.Args[2] 2681 v_0 := v.Args[0] 2682 if v_0.Op != OpARMMOVWconst { 2683 break 2684 } 2685 c := v_0.AuxInt 2686 x := v.Args[1] 2687 y := v.Args[2] 2688 v.reset(OpARMADDSconst) 2689 v.AuxInt = c 2690 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2691 v0.AddArg(x) 2692 v0.AddArg(y) 2693 v.AddArg(v0) 2694 return true 2695 } 2696 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 2697 // cond: 2698 // result: (ADDSshiftRA x y [c]) 2699 for { 2700 _ = v.Args[2] 2701 x := v.Args[0] 2702 y := v.Args[1] 2703 v_2 := v.Args[2] 2704 if v_2.Op != OpARMMOVWconst { 2705 break 2706 } 2707 c := v_2.AuxInt 2708 v.reset(OpARMADDSshiftRA) 2709 v.AuxInt = c 2710 v.AddArg(x) 2711 v.AddArg(y) 2712 return true 2713 } 2714 return false 2715 } 2716 func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { 2717 b := v.Block 2718 _ = b 2719 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2720 // cond: 2721 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2722 for { 2723 d := v.AuxInt 2724 _ = v.Args[1] 2725 v_0 := v.Args[0] 2726 if v_0.Op != OpARMMOVWconst { 2727 break 2728 } 2729 c := v_0.AuxInt 2730 x := v.Args[1] 2731 v.reset(OpARMADDSconst) 2732 v.AuxInt = c 2733 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2734 v0.AuxInt = d 2735 v0.AddArg(x) 2736 v.AddArg(v0) 2737 return true 2738 } 2739 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2740 // cond: 2741 // result: (ADDSconst x [int64(int32(uint32(c)>>uint64(d)))]) 2742 for { 2743 d := v.AuxInt 2744 _ = v.Args[1] 2745 x := v.Args[0] 2746 v_1 := v.Args[1] 2747 if v_1.Op != OpARMMOVWconst { 2748 break 2749 } 2750 c := v_1.AuxInt 2751 v.reset(OpARMADDSconst) 2752 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 2753 v.AddArg(x) 2754 return true 2755 } 2756 return false 2757 } 2758 func rewriteValueARM_OpARMADDSshiftRLreg_0(v *Value) bool { 2759 b := v.Block 2760 _ = b 2761 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2762 // cond: 2763 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2764 for { 2765 _ = v.Args[2] 2766 v_0 := v.Args[0] 2767 if v_0.Op != OpARMMOVWconst { 2768 break 2769 } 2770 c := v_0.AuxInt 2771 x := v.Args[1] 2772 y := v.Args[2] 2773 v.reset(OpARMADDSconst) 2774 v.AuxInt = c 2775 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2776 v0.AddArg(x) 2777 v0.AddArg(y) 2778 v.AddArg(v0) 2779 return true 2780 } 2781 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2782 // cond: 2783 // result: (ADDSshiftRL x y [c]) 2784 for { 2785 _ = v.Args[2] 2786 x := v.Args[0] 2787 y := v.Args[1] 2788 v_2 := v.Args[2] 2789 if v_2.Op != OpARMMOVWconst { 2790 break 2791 } 2792 c := v_2.AuxInt 2793 v.reset(OpARMADDSshiftRL) 2794 v.AuxInt = c 2795 v.AddArg(x) 2796 v.AddArg(y) 2797 return true 2798 } 2799 return false 2800 } 2801 func rewriteValueARM_OpARMADDconst_0(v *Value) bool { 2802 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2803 // cond: 2804 // result: (MOVWaddr [off1+off2] {sym} ptr) 2805 for { 2806 off1 := v.AuxInt 2807 v_0 := v.Args[0] 2808 if v_0.Op != OpARMMOVWaddr { 2809 break 2810 } 2811 off2 := v_0.AuxInt 2812 sym := v_0.Aux 2813 ptr := v_0.Args[0] 2814 v.reset(OpARMMOVWaddr) 2815 v.AuxInt = off1 + off2 2816 v.Aux = sym 2817 v.AddArg(ptr) 2818 return true 2819 } 2820 // match: (ADDconst [0] x) 2821 // cond: 2822 // result: x 2823 for { 2824 if v.AuxInt != 0 { 2825 break 2826 } 2827 x := v.Args[0] 2828 v.reset(OpCopy) 2829 v.Type = x.Type 2830 v.AddArg(x) 2831 return true 2832 } 2833 // match: (ADDconst [c] x) 2834 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 2835 // result: (SUBconst [int64(int32(-c))] x) 2836 for { 2837 c := v.AuxInt 2838 x := v.Args[0] 2839 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 2840 break 2841 } 2842 v.reset(OpARMSUBconst) 2843 v.AuxInt = int64(int32(-c)) 2844 v.AddArg(x) 2845 return true 2846 } 2847 // match: (ADDconst [c] (MOVWconst [d])) 2848 // cond: 2849 // result: (MOVWconst [int64(int32(c+d))]) 2850 for { 2851 c := v.AuxInt 2852 v_0 := v.Args[0] 2853 if v_0.Op != OpARMMOVWconst { 2854 break 2855 } 2856 d := v_0.AuxInt 2857 v.reset(OpARMMOVWconst) 2858 v.AuxInt = int64(int32(c + d)) 2859 return true 2860 } 2861 // match: (ADDconst [c] (ADDconst [d] x)) 2862 // cond: 2863 // result: (ADDconst [int64(int32(c+d))] x) 2864 for { 2865 c := v.AuxInt 2866 v_0 := v.Args[0] 2867 if v_0.Op != OpARMADDconst { 2868 break 2869 } 2870 d := v_0.AuxInt 2871 x := v_0.Args[0] 2872 v.reset(OpARMADDconst) 2873 v.AuxInt = int64(int32(c + d)) 2874 v.AddArg(x) 2875 return true 2876 } 2877 // match: (ADDconst [c] (SUBconst [d] x)) 2878 // cond: 2879 // result: (ADDconst [int64(int32(c-d))] x) 2880 for { 2881 c := v.AuxInt 2882 v_0 := v.Args[0] 2883 if v_0.Op != OpARMSUBconst { 2884 break 2885 } 2886 d := v_0.AuxInt 2887 x := v_0.Args[0] 2888 v.reset(OpARMADDconst) 2889 v.AuxInt = int64(int32(c - d)) 2890 v.AddArg(x) 2891 return true 2892 } 2893 // match: (ADDconst [c] (RSBconst [d] x)) 2894 // cond: 2895 // result: (RSBconst [int64(int32(c+d))] x) 2896 for { 2897 c := v.AuxInt 2898 v_0 := v.Args[0] 2899 if v_0.Op != OpARMRSBconst { 2900 break 2901 } 2902 d := v_0.AuxInt 2903 x := v_0.Args[0] 2904 v.reset(OpARMRSBconst) 2905 v.AuxInt = int64(int32(c + d)) 2906 v.AddArg(x) 2907 return true 2908 } 2909 return false 2910 } 2911 func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { 2912 b := v.Block 2913 _ = b 2914 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2915 // cond: 2916 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2917 for { 2918 d := v.AuxInt 2919 _ = v.Args[1] 2920 v_0 := v.Args[0] 2921 if v_0.Op != OpARMMOVWconst { 2922 break 2923 } 2924 c := v_0.AuxInt 2925 x := v.Args[1] 2926 v.reset(OpARMADDconst) 2927 v.AuxInt = c 2928 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2929 v0.AuxInt = d 2930 v0.AddArg(x) 2931 v.AddArg(v0) 2932 return true 2933 } 2934 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2935 // cond: 2936 // result: (ADDconst x [int64(int32(uint32(c)<<uint64(d)))]) 2937 for { 2938 d := v.AuxInt 2939 _ = v.Args[1] 2940 x := v.Args[0] 2941 v_1 := v.Args[1] 2942 if v_1.Op != OpARMMOVWconst { 2943 break 2944 } 2945 c := v_1.AuxInt 2946 v.reset(OpARMADDconst) 2947 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 2948 v.AddArg(x) 2949 return true 2950 } 2951 // match: (ADDshiftLL [c] (SRLconst x [32-c]) x) 2952 // cond: 2953 // result: (SRRconst [32-c] x) 2954 for { 2955 c := v.AuxInt 2956 _ = v.Args[1] 2957 v_0 := v.Args[0] 2958 if v_0.Op != OpARMSRLconst { 2959 break 2960 } 2961 if v_0.AuxInt != 32-c { 2962 break 2963 } 2964 x := v_0.Args[0] 2965 if x != v.Args[1] { 2966 break 2967 } 2968 v.reset(OpARMSRRconst) 2969 v.AuxInt = 32 - c 2970 v.AddArg(x) 2971 return true 2972 } 2973 return false 2974 } 2975 func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { 2976 b := v.Block 2977 _ = b 2978 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2979 // cond: 2980 // result: (ADDconst [c] (SLL <x.Type> x y)) 2981 for { 2982 _ = v.Args[2] 2983 v_0 := v.Args[0] 2984 if v_0.Op != OpARMMOVWconst { 2985 break 2986 } 2987 c := v_0.AuxInt 2988 x := v.Args[1] 2989 y := v.Args[2] 2990 v.reset(OpARMADDconst) 2991 v.AuxInt = c 2992 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2993 v0.AddArg(x) 2994 v0.AddArg(y) 2995 v.AddArg(v0) 2996 return true 2997 } 2998 // match: (ADDshiftLLreg x y (MOVWconst [c])) 2999 // cond: 3000 // result: (ADDshiftLL x y [c]) 3001 for { 3002 _ = v.Args[2] 3003 x := v.Args[0] 3004 y := v.Args[1] 3005 v_2 := v.Args[2] 3006 if v_2.Op != OpARMMOVWconst { 3007 break 3008 } 3009 c := v_2.AuxInt 3010 v.reset(OpARMADDshiftLL) 3011 v.AuxInt = c 3012 v.AddArg(x) 3013 v.AddArg(y) 3014 return true 3015 } 3016 return false 3017 } 3018 func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { 3019 b := v.Block 3020 _ = b 3021 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 3022 // cond: 3023 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 3024 for { 3025 d := v.AuxInt 3026 _ = v.Args[1] 3027 v_0 := v.Args[0] 3028 if v_0.Op != OpARMMOVWconst { 3029 break 3030 } 3031 c := v_0.AuxInt 3032 x := v.Args[1] 3033 v.reset(OpARMADDconst) 3034 v.AuxInt = c 3035 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3036 v0.AuxInt = d 3037 v0.AddArg(x) 3038 v.AddArg(v0) 3039 return true 3040 } 3041 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 3042 // cond: 3043 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 3044 for { 3045 d := v.AuxInt 3046 _ = v.Args[1] 3047 x := v.Args[0] 3048 v_1 := v.Args[1] 3049 if v_1.Op != OpARMMOVWconst { 3050 break 3051 } 3052 c := v_1.AuxInt 3053 v.reset(OpARMADDconst) 3054 v.AuxInt = int64(int32(c) >> uint64(d)) 3055 v.AddArg(x) 3056 return true 3057 } 3058 return false 3059 } 3060 func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { 3061 b := v.Block 3062 _ = b 3063 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 3064 // cond: 3065 // result: (ADDconst [c] (SRA <x.Type> x y)) 3066 for { 3067 _ = v.Args[2] 3068 v_0 := v.Args[0] 3069 if v_0.Op != OpARMMOVWconst { 3070 break 3071 } 3072 c := v_0.AuxInt 3073 x := v.Args[1] 3074 y := v.Args[2] 3075 v.reset(OpARMADDconst) 3076 v.AuxInt = c 3077 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3078 v0.AddArg(x) 3079 v0.AddArg(y) 3080 v.AddArg(v0) 3081 return true 3082 } 3083 // match: (ADDshiftRAreg x y (MOVWconst [c])) 3084 // cond: 3085 // result: (ADDshiftRA x y [c]) 3086 for { 3087 _ = v.Args[2] 3088 x := v.Args[0] 3089 y := v.Args[1] 3090 v_2 := v.Args[2] 3091 if v_2.Op != OpARMMOVWconst { 3092 break 3093 } 3094 c := v_2.AuxInt 3095 v.reset(OpARMADDshiftRA) 3096 v.AuxInt = c 3097 v.AddArg(x) 3098 v.AddArg(y) 3099 return true 3100 } 3101 return false 3102 } 3103 func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { 3104 b := v.Block 3105 _ = b 3106 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 3107 // cond: 3108 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 3109 for { 3110 d := v.AuxInt 3111 _ = v.Args[1] 3112 v_0 := v.Args[0] 3113 if v_0.Op != OpARMMOVWconst { 3114 break 3115 } 3116 c := v_0.AuxInt 3117 x := v.Args[1] 3118 v.reset(OpARMADDconst) 3119 v.AuxInt = c 3120 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3121 v0.AuxInt = d 3122 v0.AddArg(x) 3123 v.AddArg(v0) 3124 return true 3125 } 3126 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 3127 // cond: 3128 // result: (ADDconst x [int64(int32(uint32(c)>>uint64(d)))]) 3129 for { 3130 d := v.AuxInt 3131 _ = v.Args[1] 3132 x := v.Args[0] 3133 v_1 := v.Args[1] 3134 if v_1.Op != OpARMMOVWconst { 3135 break 3136 } 3137 c := v_1.AuxInt 3138 v.reset(OpARMADDconst) 3139 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 3140 v.AddArg(x) 3141 return true 3142 } 3143 // match: (ADDshiftRL [c] (SLLconst x [32-c]) x) 3144 // cond: 3145 // result: (SRRconst [ c] x) 3146 for { 3147 c := v.AuxInt 3148 _ = v.Args[1] 3149 v_0 := v.Args[0] 3150 if v_0.Op != OpARMSLLconst { 3151 break 3152 } 3153 if v_0.AuxInt != 32-c { 3154 break 3155 } 3156 x := v_0.Args[0] 3157 if x != v.Args[1] { 3158 break 3159 } 3160 v.reset(OpARMSRRconst) 3161 v.AuxInt = c 3162 v.AddArg(x) 3163 return true 3164 } 3165 return false 3166 } 3167 func rewriteValueARM_OpARMADDshiftRLreg_0(v *Value) bool { 3168 b := v.Block 3169 _ = b 3170 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 3171 // cond: 3172 // result: (ADDconst [c] (SRL <x.Type> x y)) 3173 for { 3174 _ = v.Args[2] 3175 v_0 := v.Args[0] 3176 if v_0.Op != OpARMMOVWconst { 3177 break 3178 } 3179 c := v_0.AuxInt 3180 x := v.Args[1] 3181 y := v.Args[2] 3182 v.reset(OpARMADDconst) 3183 v.AuxInt = c 3184 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3185 v0.AddArg(x) 3186 v0.AddArg(y) 3187 v.AddArg(v0) 3188 return true 3189 } 3190 // match: (ADDshiftRLreg x y (MOVWconst [c])) 3191 // cond: 3192 // result: (ADDshiftRL x y [c]) 3193 for { 3194 _ = v.Args[2] 3195 x := v.Args[0] 3196 y := v.Args[1] 3197 v_2 := v.Args[2] 3198 if v_2.Op != OpARMMOVWconst { 3199 break 3200 } 3201 c := v_2.AuxInt 3202 v.reset(OpARMADDshiftRL) 3203 v.AuxInt = c 3204 v.AddArg(x) 3205 v.AddArg(y) 3206 return true 3207 } 3208 return false 3209 } 3210 func rewriteValueARM_OpARMAND_0(v *Value) bool { 3211 // match: (AND x (MOVWconst [c])) 3212 // cond: 3213 // result: (ANDconst [c] x) 3214 for { 3215 _ = v.Args[1] 3216 x := v.Args[0] 3217 v_1 := v.Args[1] 3218 if v_1.Op != OpARMMOVWconst { 3219 break 3220 } 3221 c := v_1.AuxInt 3222 v.reset(OpARMANDconst) 3223 v.AuxInt = c 3224 v.AddArg(x) 3225 return true 3226 } 3227 // match: (AND (MOVWconst [c]) x) 3228 // cond: 3229 // result: (ANDconst [c] x) 3230 for { 3231 _ = v.Args[1] 3232 v_0 := v.Args[0] 3233 if v_0.Op != OpARMMOVWconst { 3234 break 3235 } 3236 c := v_0.AuxInt 3237 x := v.Args[1] 3238 v.reset(OpARMANDconst) 3239 v.AuxInt = c 3240 v.AddArg(x) 3241 return true 3242 } 3243 // match: (AND x (SLLconst [c] y)) 3244 // cond: 3245 // result: (ANDshiftLL x y [c]) 3246 for { 3247 _ = v.Args[1] 3248 x := v.Args[0] 3249 v_1 := v.Args[1] 3250 if v_1.Op != OpARMSLLconst { 3251 break 3252 } 3253 c := v_1.AuxInt 3254 y := v_1.Args[0] 3255 v.reset(OpARMANDshiftLL) 3256 v.AuxInt = c 3257 v.AddArg(x) 3258 v.AddArg(y) 3259 return true 3260 } 3261 // match: (AND (SLLconst [c] y) x) 3262 // cond: 3263 // result: (ANDshiftLL x y [c]) 3264 for { 3265 _ = v.Args[1] 3266 v_0 := v.Args[0] 3267 if v_0.Op != OpARMSLLconst { 3268 break 3269 } 3270 c := v_0.AuxInt 3271 y := v_0.Args[0] 3272 x := v.Args[1] 3273 v.reset(OpARMANDshiftLL) 3274 v.AuxInt = c 3275 v.AddArg(x) 3276 v.AddArg(y) 3277 return true 3278 } 3279 // match: (AND x (SRLconst [c] y)) 3280 // cond: 3281 // result: (ANDshiftRL x y [c]) 3282 for { 3283 _ = v.Args[1] 3284 x := v.Args[0] 3285 v_1 := v.Args[1] 3286 if v_1.Op != OpARMSRLconst { 3287 break 3288 } 3289 c := v_1.AuxInt 3290 y := v_1.Args[0] 3291 v.reset(OpARMANDshiftRL) 3292 v.AuxInt = c 3293 v.AddArg(x) 3294 v.AddArg(y) 3295 return true 3296 } 3297 // match: (AND (SRLconst [c] y) x) 3298 // cond: 3299 // result: (ANDshiftRL x y [c]) 3300 for { 3301 _ = v.Args[1] 3302 v_0 := v.Args[0] 3303 if v_0.Op != OpARMSRLconst { 3304 break 3305 } 3306 c := v_0.AuxInt 3307 y := v_0.Args[0] 3308 x := v.Args[1] 3309 v.reset(OpARMANDshiftRL) 3310 v.AuxInt = c 3311 v.AddArg(x) 3312 v.AddArg(y) 3313 return true 3314 } 3315 // match: (AND x (SRAconst [c] y)) 3316 // cond: 3317 // result: (ANDshiftRA x y [c]) 3318 for { 3319 _ = v.Args[1] 3320 x := v.Args[0] 3321 v_1 := v.Args[1] 3322 if v_1.Op != OpARMSRAconst { 3323 break 3324 } 3325 c := v_1.AuxInt 3326 y := v_1.Args[0] 3327 v.reset(OpARMANDshiftRA) 3328 v.AuxInt = c 3329 v.AddArg(x) 3330 v.AddArg(y) 3331 return true 3332 } 3333 // match: (AND (SRAconst [c] y) x) 3334 // cond: 3335 // result: (ANDshiftRA x y [c]) 3336 for { 3337 _ = v.Args[1] 3338 v_0 := v.Args[0] 3339 if v_0.Op != OpARMSRAconst { 3340 break 3341 } 3342 c := v_0.AuxInt 3343 y := v_0.Args[0] 3344 x := v.Args[1] 3345 v.reset(OpARMANDshiftRA) 3346 v.AuxInt = c 3347 v.AddArg(x) 3348 v.AddArg(y) 3349 return true 3350 } 3351 // match: (AND x (SLL y z)) 3352 // cond: 3353 // result: (ANDshiftLLreg x y z) 3354 for { 3355 _ = v.Args[1] 3356 x := v.Args[0] 3357 v_1 := v.Args[1] 3358 if v_1.Op != OpARMSLL { 3359 break 3360 } 3361 _ = v_1.Args[1] 3362 y := v_1.Args[0] 3363 z := v_1.Args[1] 3364 v.reset(OpARMANDshiftLLreg) 3365 v.AddArg(x) 3366 v.AddArg(y) 3367 v.AddArg(z) 3368 return true 3369 } 3370 // match: (AND (SLL y z) x) 3371 // cond: 3372 // result: (ANDshiftLLreg x y z) 3373 for { 3374 _ = v.Args[1] 3375 v_0 := v.Args[0] 3376 if v_0.Op != OpARMSLL { 3377 break 3378 } 3379 _ = v_0.Args[1] 3380 y := v_0.Args[0] 3381 z := v_0.Args[1] 3382 x := v.Args[1] 3383 v.reset(OpARMANDshiftLLreg) 3384 v.AddArg(x) 3385 v.AddArg(y) 3386 v.AddArg(z) 3387 return true 3388 } 3389 return false 3390 } 3391 func rewriteValueARM_OpARMAND_10(v *Value) bool { 3392 // match: (AND x (SRL y z)) 3393 // cond: 3394 // result: (ANDshiftRLreg x y z) 3395 for { 3396 _ = v.Args[1] 3397 x := v.Args[0] 3398 v_1 := v.Args[1] 3399 if v_1.Op != OpARMSRL { 3400 break 3401 } 3402 _ = v_1.Args[1] 3403 y := v_1.Args[0] 3404 z := v_1.Args[1] 3405 v.reset(OpARMANDshiftRLreg) 3406 v.AddArg(x) 3407 v.AddArg(y) 3408 v.AddArg(z) 3409 return true 3410 } 3411 // match: (AND (SRL y z) x) 3412 // cond: 3413 // result: (ANDshiftRLreg x y z) 3414 for { 3415 _ = v.Args[1] 3416 v_0 := v.Args[0] 3417 if v_0.Op != OpARMSRL { 3418 break 3419 } 3420 _ = v_0.Args[1] 3421 y := v_0.Args[0] 3422 z := v_0.Args[1] 3423 x := v.Args[1] 3424 v.reset(OpARMANDshiftRLreg) 3425 v.AddArg(x) 3426 v.AddArg(y) 3427 v.AddArg(z) 3428 return true 3429 } 3430 // match: (AND x (SRA y z)) 3431 // cond: 3432 // result: (ANDshiftRAreg x y z) 3433 for { 3434 _ = v.Args[1] 3435 x := v.Args[0] 3436 v_1 := v.Args[1] 3437 if v_1.Op != OpARMSRA { 3438 break 3439 } 3440 _ = v_1.Args[1] 3441 y := v_1.Args[0] 3442 z := v_1.Args[1] 3443 v.reset(OpARMANDshiftRAreg) 3444 v.AddArg(x) 3445 v.AddArg(y) 3446 v.AddArg(z) 3447 return true 3448 } 3449 // match: (AND (SRA y z) x) 3450 // cond: 3451 // result: (ANDshiftRAreg x y z) 3452 for { 3453 _ = v.Args[1] 3454 v_0 := v.Args[0] 3455 if v_0.Op != OpARMSRA { 3456 break 3457 } 3458 _ = v_0.Args[1] 3459 y := v_0.Args[0] 3460 z := v_0.Args[1] 3461 x := v.Args[1] 3462 v.reset(OpARMANDshiftRAreg) 3463 v.AddArg(x) 3464 v.AddArg(y) 3465 v.AddArg(z) 3466 return true 3467 } 3468 // match: (AND x x) 3469 // cond: 3470 // result: x 3471 for { 3472 _ = v.Args[1] 3473 x := v.Args[0] 3474 if x != v.Args[1] { 3475 break 3476 } 3477 v.reset(OpCopy) 3478 v.Type = x.Type 3479 v.AddArg(x) 3480 return true 3481 } 3482 // match: (AND x (MVN y)) 3483 // cond: 3484 // result: (BIC x y) 3485 for { 3486 _ = v.Args[1] 3487 x := v.Args[0] 3488 v_1 := v.Args[1] 3489 if v_1.Op != OpARMMVN { 3490 break 3491 } 3492 y := v_1.Args[0] 3493 v.reset(OpARMBIC) 3494 v.AddArg(x) 3495 v.AddArg(y) 3496 return true 3497 } 3498 // match: (AND (MVN y) x) 3499 // cond: 3500 // result: (BIC x y) 3501 for { 3502 _ = v.Args[1] 3503 v_0 := v.Args[0] 3504 if v_0.Op != OpARMMVN { 3505 break 3506 } 3507 y := v_0.Args[0] 3508 x := v.Args[1] 3509 v.reset(OpARMBIC) 3510 v.AddArg(x) 3511 v.AddArg(y) 3512 return true 3513 } 3514 // match: (AND x (MVNshiftLL y [c])) 3515 // cond: 3516 // result: (BICshiftLL x y [c]) 3517 for { 3518 _ = v.Args[1] 3519 x := v.Args[0] 3520 v_1 := v.Args[1] 3521 if v_1.Op != OpARMMVNshiftLL { 3522 break 3523 } 3524 c := v_1.AuxInt 3525 y := v_1.Args[0] 3526 v.reset(OpARMBICshiftLL) 3527 v.AuxInt = c 3528 v.AddArg(x) 3529 v.AddArg(y) 3530 return true 3531 } 3532 // match: (AND (MVNshiftLL y [c]) x) 3533 // cond: 3534 // result: (BICshiftLL x y [c]) 3535 for { 3536 _ = v.Args[1] 3537 v_0 := v.Args[0] 3538 if v_0.Op != OpARMMVNshiftLL { 3539 break 3540 } 3541 c := v_0.AuxInt 3542 y := v_0.Args[0] 3543 x := v.Args[1] 3544 v.reset(OpARMBICshiftLL) 3545 v.AuxInt = c 3546 v.AddArg(x) 3547 v.AddArg(y) 3548 return true 3549 } 3550 // match: (AND x (MVNshiftRL y [c])) 3551 // cond: 3552 // result: (BICshiftRL x y [c]) 3553 for { 3554 _ = v.Args[1] 3555 x := v.Args[0] 3556 v_1 := v.Args[1] 3557 if v_1.Op != OpARMMVNshiftRL { 3558 break 3559 } 3560 c := v_1.AuxInt 3561 y := v_1.Args[0] 3562 v.reset(OpARMBICshiftRL) 3563 v.AuxInt = c 3564 v.AddArg(x) 3565 v.AddArg(y) 3566 return true 3567 } 3568 return false 3569 } 3570 func rewriteValueARM_OpARMAND_20(v *Value) bool { 3571 // match: (AND (MVNshiftRL y [c]) x) 3572 // cond: 3573 // result: (BICshiftRL x y [c]) 3574 for { 3575 _ = v.Args[1] 3576 v_0 := v.Args[0] 3577 if v_0.Op != OpARMMVNshiftRL { 3578 break 3579 } 3580 c := v_0.AuxInt 3581 y := v_0.Args[0] 3582 x := v.Args[1] 3583 v.reset(OpARMBICshiftRL) 3584 v.AuxInt = c 3585 v.AddArg(x) 3586 v.AddArg(y) 3587 return true 3588 } 3589 // match: (AND x (MVNshiftRA y [c])) 3590 // cond: 3591 // result: (BICshiftRA x y [c]) 3592 for { 3593 _ = v.Args[1] 3594 x := v.Args[0] 3595 v_1 := v.Args[1] 3596 if v_1.Op != OpARMMVNshiftRA { 3597 break 3598 } 3599 c := v_1.AuxInt 3600 y := v_1.Args[0] 3601 v.reset(OpARMBICshiftRA) 3602 v.AuxInt = c 3603 v.AddArg(x) 3604 v.AddArg(y) 3605 return true 3606 } 3607 // match: (AND (MVNshiftRA y [c]) x) 3608 // cond: 3609 // result: (BICshiftRA x y [c]) 3610 for { 3611 _ = v.Args[1] 3612 v_0 := v.Args[0] 3613 if v_0.Op != OpARMMVNshiftRA { 3614 break 3615 } 3616 c := v_0.AuxInt 3617 y := v_0.Args[0] 3618 x := v.Args[1] 3619 v.reset(OpARMBICshiftRA) 3620 v.AuxInt = c 3621 v.AddArg(x) 3622 v.AddArg(y) 3623 return true 3624 } 3625 return false 3626 } 3627 func rewriteValueARM_OpARMANDconst_0(v *Value) bool { 3628 // match: (ANDconst [0] _) 3629 // cond: 3630 // result: (MOVWconst [0]) 3631 for { 3632 if v.AuxInt != 0 { 3633 break 3634 } 3635 v.reset(OpARMMOVWconst) 3636 v.AuxInt = 0 3637 return true 3638 } 3639 // match: (ANDconst [c] x) 3640 // cond: int32(c)==-1 3641 // result: x 3642 for { 3643 c := v.AuxInt 3644 x := v.Args[0] 3645 if !(int32(c) == -1) { 3646 break 3647 } 3648 v.reset(OpCopy) 3649 v.Type = x.Type 3650 v.AddArg(x) 3651 return true 3652 } 3653 // match: (ANDconst [c] x) 3654 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3655 // result: (BICconst [int64(int32(^uint32(c)))] x) 3656 for { 3657 c := v.AuxInt 3658 x := v.Args[0] 3659 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3660 break 3661 } 3662 v.reset(OpARMBICconst) 3663 v.AuxInt = int64(int32(^uint32(c))) 3664 v.AddArg(x) 3665 return true 3666 } 3667 // match: (ANDconst [c] (MOVWconst [d])) 3668 // cond: 3669 // result: (MOVWconst [c&d]) 3670 for { 3671 c := v.AuxInt 3672 v_0 := v.Args[0] 3673 if v_0.Op != OpARMMOVWconst { 3674 break 3675 } 3676 d := v_0.AuxInt 3677 v.reset(OpARMMOVWconst) 3678 v.AuxInt = c & d 3679 return true 3680 } 3681 // match: (ANDconst [c] (ANDconst [d] x)) 3682 // cond: 3683 // result: (ANDconst [c&d] x) 3684 for { 3685 c := v.AuxInt 3686 v_0 := v.Args[0] 3687 if v_0.Op != OpARMANDconst { 3688 break 3689 } 3690 d := v_0.AuxInt 3691 x := v_0.Args[0] 3692 v.reset(OpARMANDconst) 3693 v.AuxInt = c & d 3694 v.AddArg(x) 3695 return true 3696 } 3697 return false 3698 } 3699 func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { 3700 b := v.Block 3701 _ = b 3702 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 3703 // cond: 3704 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 3705 for { 3706 d := v.AuxInt 3707 _ = v.Args[1] 3708 v_0 := v.Args[0] 3709 if v_0.Op != OpARMMOVWconst { 3710 break 3711 } 3712 c := v_0.AuxInt 3713 x := v.Args[1] 3714 v.reset(OpARMANDconst) 3715 v.AuxInt = c 3716 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3717 v0.AuxInt = d 3718 v0.AddArg(x) 3719 v.AddArg(v0) 3720 return true 3721 } 3722 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 3723 // cond: 3724 // result: (ANDconst x [int64(int32(uint32(c)<<uint64(d)))]) 3725 for { 3726 d := v.AuxInt 3727 _ = v.Args[1] 3728 x := v.Args[0] 3729 v_1 := v.Args[1] 3730 if v_1.Op != OpARMMOVWconst { 3731 break 3732 } 3733 c := v_1.AuxInt 3734 v.reset(OpARMANDconst) 3735 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 3736 v.AddArg(x) 3737 return true 3738 } 3739 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 3740 // cond: c==d 3741 // result: y 3742 for { 3743 d := v.AuxInt 3744 _ = v.Args[1] 3745 x := v.Args[0] 3746 y := v.Args[1] 3747 if y.Op != OpARMSLLconst { 3748 break 3749 } 3750 c := y.AuxInt 3751 if x != y.Args[0] { 3752 break 3753 } 3754 if !(c == d) { 3755 break 3756 } 3757 v.reset(OpCopy) 3758 v.Type = y.Type 3759 v.AddArg(y) 3760 return true 3761 } 3762 return false 3763 } 3764 func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { 3765 b := v.Block 3766 _ = b 3767 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 3768 // cond: 3769 // result: (ANDconst [c] (SLL <x.Type> x y)) 3770 for { 3771 _ = v.Args[2] 3772 v_0 := v.Args[0] 3773 if v_0.Op != OpARMMOVWconst { 3774 break 3775 } 3776 c := v_0.AuxInt 3777 x := v.Args[1] 3778 y := v.Args[2] 3779 v.reset(OpARMANDconst) 3780 v.AuxInt = c 3781 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3782 v0.AddArg(x) 3783 v0.AddArg(y) 3784 v.AddArg(v0) 3785 return true 3786 } 3787 // match: (ANDshiftLLreg x y (MOVWconst [c])) 3788 // cond: 3789 // result: (ANDshiftLL x y [c]) 3790 for { 3791 _ = v.Args[2] 3792 x := v.Args[0] 3793 y := v.Args[1] 3794 v_2 := v.Args[2] 3795 if v_2.Op != OpARMMOVWconst { 3796 break 3797 } 3798 c := v_2.AuxInt 3799 v.reset(OpARMANDshiftLL) 3800 v.AuxInt = c 3801 v.AddArg(x) 3802 v.AddArg(y) 3803 return true 3804 } 3805 return false 3806 } 3807 func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { 3808 b := v.Block 3809 _ = b 3810 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 3811 // cond: 3812 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 3813 for { 3814 d := v.AuxInt 3815 _ = v.Args[1] 3816 v_0 := v.Args[0] 3817 if v_0.Op != OpARMMOVWconst { 3818 break 3819 } 3820 c := v_0.AuxInt 3821 x := v.Args[1] 3822 v.reset(OpARMANDconst) 3823 v.AuxInt = c 3824 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3825 v0.AuxInt = d 3826 v0.AddArg(x) 3827 v.AddArg(v0) 3828 return true 3829 } 3830 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3831 // cond: 3832 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3833 for { 3834 d := v.AuxInt 3835 _ = v.Args[1] 3836 x := v.Args[0] 3837 v_1 := v.Args[1] 3838 if v_1.Op != OpARMMOVWconst { 3839 break 3840 } 3841 c := v_1.AuxInt 3842 v.reset(OpARMANDconst) 3843 v.AuxInt = int64(int32(c) >> uint64(d)) 3844 v.AddArg(x) 3845 return true 3846 } 3847 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3848 // cond: c==d 3849 // result: y 3850 for { 3851 d := v.AuxInt 3852 _ = v.Args[1] 3853 x := v.Args[0] 3854 y := v.Args[1] 3855 if y.Op != OpARMSRAconst { 3856 break 3857 } 3858 c := y.AuxInt 3859 if x != y.Args[0] { 3860 break 3861 } 3862 if !(c == d) { 3863 break 3864 } 3865 v.reset(OpCopy) 3866 v.Type = y.Type 3867 v.AddArg(y) 3868 return true 3869 } 3870 return false 3871 } 3872 func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { 3873 b := v.Block 3874 _ = b 3875 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3876 // cond: 3877 // result: (ANDconst [c] (SRA <x.Type> x y)) 3878 for { 3879 _ = v.Args[2] 3880 v_0 := v.Args[0] 3881 if v_0.Op != OpARMMOVWconst { 3882 break 3883 } 3884 c := v_0.AuxInt 3885 x := v.Args[1] 3886 y := v.Args[2] 3887 v.reset(OpARMANDconst) 3888 v.AuxInt = c 3889 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3890 v0.AddArg(x) 3891 v0.AddArg(y) 3892 v.AddArg(v0) 3893 return true 3894 } 3895 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3896 // cond: 3897 // result: (ANDshiftRA x y [c]) 3898 for { 3899 _ = v.Args[2] 3900 x := v.Args[0] 3901 y := v.Args[1] 3902 v_2 := v.Args[2] 3903 if v_2.Op != OpARMMOVWconst { 3904 break 3905 } 3906 c := v_2.AuxInt 3907 v.reset(OpARMANDshiftRA) 3908 v.AuxInt = c 3909 v.AddArg(x) 3910 v.AddArg(y) 3911 return true 3912 } 3913 return false 3914 } 3915 func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { 3916 b := v.Block 3917 _ = b 3918 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3919 // cond: 3920 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3921 for { 3922 d := v.AuxInt 3923 _ = v.Args[1] 3924 v_0 := v.Args[0] 3925 if v_0.Op != OpARMMOVWconst { 3926 break 3927 } 3928 c := v_0.AuxInt 3929 x := v.Args[1] 3930 v.reset(OpARMANDconst) 3931 v.AuxInt = c 3932 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3933 v0.AuxInt = d 3934 v0.AddArg(x) 3935 v.AddArg(v0) 3936 return true 3937 } 3938 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3939 // cond: 3940 // result: (ANDconst x [int64(int32(uint32(c)>>uint64(d)))]) 3941 for { 3942 d := v.AuxInt 3943 _ = v.Args[1] 3944 x := v.Args[0] 3945 v_1 := v.Args[1] 3946 if v_1.Op != OpARMMOVWconst { 3947 break 3948 } 3949 c := v_1.AuxInt 3950 v.reset(OpARMANDconst) 3951 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 3952 v.AddArg(x) 3953 return true 3954 } 3955 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3956 // cond: c==d 3957 // result: y 3958 for { 3959 d := v.AuxInt 3960 _ = v.Args[1] 3961 x := v.Args[0] 3962 y := v.Args[1] 3963 if y.Op != OpARMSRLconst { 3964 break 3965 } 3966 c := y.AuxInt 3967 if x != y.Args[0] { 3968 break 3969 } 3970 if !(c == d) { 3971 break 3972 } 3973 v.reset(OpCopy) 3974 v.Type = y.Type 3975 v.AddArg(y) 3976 return true 3977 } 3978 return false 3979 } 3980 func rewriteValueARM_OpARMANDshiftRLreg_0(v *Value) bool { 3981 b := v.Block 3982 _ = b 3983 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 3984 // cond: 3985 // result: (ANDconst [c] (SRL <x.Type> x y)) 3986 for { 3987 _ = v.Args[2] 3988 v_0 := v.Args[0] 3989 if v_0.Op != OpARMMOVWconst { 3990 break 3991 } 3992 c := v_0.AuxInt 3993 x := v.Args[1] 3994 y := v.Args[2] 3995 v.reset(OpARMANDconst) 3996 v.AuxInt = c 3997 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3998 v0.AddArg(x) 3999 v0.AddArg(y) 4000 v.AddArg(v0) 4001 return true 4002 } 4003 // match: (ANDshiftRLreg x y (MOVWconst [c])) 4004 // cond: 4005 // result: (ANDshiftRL x y [c]) 4006 for { 4007 _ = v.Args[2] 4008 x := v.Args[0] 4009 y := v.Args[1] 4010 v_2 := v.Args[2] 4011 if v_2.Op != OpARMMOVWconst { 4012 break 4013 } 4014 c := v_2.AuxInt 4015 v.reset(OpARMANDshiftRL) 4016 v.AuxInt = c 4017 v.AddArg(x) 4018 v.AddArg(y) 4019 return true 4020 } 4021 return false 4022 } 4023 func rewriteValueARM_OpARMBFX_0(v *Value) bool { 4024 // match: (BFX [c] (MOVWconst [d])) 4025 // cond: 4026 // result: (MOVWconst [int64(int32(d)<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8)))]) 4027 for { 4028 c := v.AuxInt 4029 v_0 := v.Args[0] 4030 if v_0.Op != OpARMMOVWconst { 4031 break 4032 } 4033 d := v_0.AuxInt 4034 v.reset(OpARMMOVWconst) 4035 v.AuxInt = int64(int32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))) 4036 return true 4037 } 4038 return false 4039 } 4040 func rewriteValueARM_OpARMBFXU_0(v *Value) bool { 4041 // match: (BFXU [c] (MOVWconst [d])) 4042 // cond: 4043 // result: (MOVWconst [int64(uint32(d)<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8)))]) 4044 for { 4045 c := v.AuxInt 4046 v_0 := v.Args[0] 4047 if v_0.Op != OpARMMOVWconst { 4048 break 4049 } 4050 d := v_0.AuxInt 4051 v.reset(OpARMMOVWconst) 4052 v.AuxInt = int64(uint32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))) 4053 return true 4054 } 4055 return false 4056 } 4057 func rewriteValueARM_OpARMBIC_0(v *Value) bool { 4058 // match: (BIC x (MOVWconst [c])) 4059 // cond: 4060 // result: (BICconst [c] x) 4061 for { 4062 _ = v.Args[1] 4063 x := v.Args[0] 4064 v_1 := v.Args[1] 4065 if v_1.Op != OpARMMOVWconst { 4066 break 4067 } 4068 c := v_1.AuxInt 4069 v.reset(OpARMBICconst) 4070 v.AuxInt = c 4071 v.AddArg(x) 4072 return true 4073 } 4074 // match: (BIC x (SLLconst [c] y)) 4075 // cond: 4076 // result: (BICshiftLL x y [c]) 4077 for { 4078 _ = v.Args[1] 4079 x := v.Args[0] 4080 v_1 := v.Args[1] 4081 if v_1.Op != OpARMSLLconst { 4082 break 4083 } 4084 c := v_1.AuxInt 4085 y := v_1.Args[0] 4086 v.reset(OpARMBICshiftLL) 4087 v.AuxInt = c 4088 v.AddArg(x) 4089 v.AddArg(y) 4090 return true 4091 } 4092 // match: (BIC x (SRLconst [c] y)) 4093 // cond: 4094 // result: (BICshiftRL x y [c]) 4095 for { 4096 _ = v.Args[1] 4097 x := v.Args[0] 4098 v_1 := v.Args[1] 4099 if v_1.Op != OpARMSRLconst { 4100 break 4101 } 4102 c := v_1.AuxInt 4103 y := v_1.Args[0] 4104 v.reset(OpARMBICshiftRL) 4105 v.AuxInt = c 4106 v.AddArg(x) 4107 v.AddArg(y) 4108 return true 4109 } 4110 // match: (BIC x (SRAconst [c] y)) 4111 // cond: 4112 // result: (BICshiftRA x y [c]) 4113 for { 4114 _ = v.Args[1] 4115 x := v.Args[0] 4116 v_1 := v.Args[1] 4117 if v_1.Op != OpARMSRAconst { 4118 break 4119 } 4120 c := v_1.AuxInt 4121 y := v_1.Args[0] 4122 v.reset(OpARMBICshiftRA) 4123 v.AuxInt = c 4124 v.AddArg(x) 4125 v.AddArg(y) 4126 return true 4127 } 4128 // match: (BIC x (SLL y z)) 4129 // cond: 4130 // result: (BICshiftLLreg x y z) 4131 for { 4132 _ = v.Args[1] 4133 x := v.Args[0] 4134 v_1 := v.Args[1] 4135 if v_1.Op != OpARMSLL { 4136 break 4137 } 4138 _ = v_1.Args[1] 4139 y := v_1.Args[0] 4140 z := v_1.Args[1] 4141 v.reset(OpARMBICshiftLLreg) 4142 v.AddArg(x) 4143 v.AddArg(y) 4144 v.AddArg(z) 4145 return true 4146 } 4147 // match: (BIC x (SRL y z)) 4148 // cond: 4149 // result: (BICshiftRLreg x y z) 4150 for { 4151 _ = v.Args[1] 4152 x := v.Args[0] 4153 v_1 := v.Args[1] 4154 if v_1.Op != OpARMSRL { 4155 break 4156 } 4157 _ = v_1.Args[1] 4158 y := v_1.Args[0] 4159 z := v_1.Args[1] 4160 v.reset(OpARMBICshiftRLreg) 4161 v.AddArg(x) 4162 v.AddArg(y) 4163 v.AddArg(z) 4164 return true 4165 } 4166 // match: (BIC x (SRA y z)) 4167 // cond: 4168 // result: (BICshiftRAreg x y z) 4169 for { 4170 _ = v.Args[1] 4171 x := v.Args[0] 4172 v_1 := v.Args[1] 4173 if v_1.Op != OpARMSRA { 4174 break 4175 } 4176 _ = v_1.Args[1] 4177 y := v_1.Args[0] 4178 z := v_1.Args[1] 4179 v.reset(OpARMBICshiftRAreg) 4180 v.AddArg(x) 4181 v.AddArg(y) 4182 v.AddArg(z) 4183 return true 4184 } 4185 // match: (BIC x x) 4186 // cond: 4187 // result: (MOVWconst [0]) 4188 for { 4189 _ = v.Args[1] 4190 x := v.Args[0] 4191 if x != v.Args[1] { 4192 break 4193 } 4194 v.reset(OpARMMOVWconst) 4195 v.AuxInt = 0 4196 return true 4197 } 4198 return false 4199 } 4200 func rewriteValueARM_OpARMBICconst_0(v *Value) bool { 4201 // match: (BICconst [0] x) 4202 // cond: 4203 // result: x 4204 for { 4205 if v.AuxInt != 0 { 4206 break 4207 } 4208 x := v.Args[0] 4209 v.reset(OpCopy) 4210 v.Type = x.Type 4211 v.AddArg(x) 4212 return true 4213 } 4214 // match: (BICconst [c] _) 4215 // cond: int32(c)==-1 4216 // result: (MOVWconst [0]) 4217 for { 4218 c := v.AuxInt 4219 if !(int32(c) == -1) { 4220 break 4221 } 4222 v.reset(OpARMMOVWconst) 4223 v.AuxInt = 0 4224 return true 4225 } 4226 // match: (BICconst [c] x) 4227 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 4228 // result: (ANDconst [int64(int32(^uint32(c)))] x) 4229 for { 4230 c := v.AuxInt 4231 x := v.Args[0] 4232 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 4233 break 4234 } 4235 v.reset(OpARMANDconst) 4236 v.AuxInt = int64(int32(^uint32(c))) 4237 v.AddArg(x) 4238 return true 4239 } 4240 // match: (BICconst [c] (MOVWconst [d])) 4241 // cond: 4242 // result: (MOVWconst [d&^c]) 4243 for { 4244 c := v.AuxInt 4245 v_0 := v.Args[0] 4246 if v_0.Op != OpARMMOVWconst { 4247 break 4248 } 4249 d := v_0.AuxInt 4250 v.reset(OpARMMOVWconst) 4251 v.AuxInt = d &^ c 4252 return true 4253 } 4254 // match: (BICconst [c] (BICconst [d] x)) 4255 // cond: 4256 // result: (BICconst [int64(int32(c|d))] x) 4257 for { 4258 c := v.AuxInt 4259 v_0 := v.Args[0] 4260 if v_0.Op != OpARMBICconst { 4261 break 4262 } 4263 d := v_0.AuxInt 4264 x := v_0.Args[0] 4265 v.reset(OpARMBICconst) 4266 v.AuxInt = int64(int32(c | d)) 4267 v.AddArg(x) 4268 return true 4269 } 4270 return false 4271 } 4272 func rewriteValueARM_OpARMBICshiftLL_0(v *Value) bool { 4273 // match: (BICshiftLL x (MOVWconst [c]) [d]) 4274 // cond: 4275 // result: (BICconst x [int64(int32(uint32(c)<<uint64(d)))]) 4276 for { 4277 d := v.AuxInt 4278 _ = v.Args[1] 4279 x := v.Args[0] 4280 v_1 := v.Args[1] 4281 if v_1.Op != OpARMMOVWconst { 4282 break 4283 } 4284 c := v_1.AuxInt 4285 v.reset(OpARMBICconst) 4286 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 4287 v.AddArg(x) 4288 return true 4289 } 4290 // match: (BICshiftLL x (SLLconst x [c]) [d]) 4291 // cond: c==d 4292 // result: (MOVWconst [0]) 4293 for { 4294 d := v.AuxInt 4295 _ = v.Args[1] 4296 x := v.Args[0] 4297 v_1 := v.Args[1] 4298 if v_1.Op != OpARMSLLconst { 4299 break 4300 } 4301 c := v_1.AuxInt 4302 if x != v_1.Args[0] { 4303 break 4304 } 4305 if !(c == d) { 4306 break 4307 } 4308 v.reset(OpARMMOVWconst) 4309 v.AuxInt = 0 4310 return true 4311 } 4312 return false 4313 } 4314 func rewriteValueARM_OpARMBICshiftLLreg_0(v *Value) bool { 4315 // match: (BICshiftLLreg x y (MOVWconst [c])) 4316 // cond: 4317 // result: (BICshiftLL x y [c]) 4318 for { 4319 _ = v.Args[2] 4320 x := v.Args[0] 4321 y := v.Args[1] 4322 v_2 := v.Args[2] 4323 if v_2.Op != OpARMMOVWconst { 4324 break 4325 } 4326 c := v_2.AuxInt 4327 v.reset(OpARMBICshiftLL) 4328 v.AuxInt = c 4329 v.AddArg(x) 4330 v.AddArg(y) 4331 return true 4332 } 4333 return false 4334 } 4335 func rewriteValueARM_OpARMBICshiftRA_0(v *Value) bool { 4336 // match: (BICshiftRA x (MOVWconst [c]) [d]) 4337 // cond: 4338 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 4339 for { 4340 d := v.AuxInt 4341 _ = v.Args[1] 4342 x := v.Args[0] 4343 v_1 := v.Args[1] 4344 if v_1.Op != OpARMMOVWconst { 4345 break 4346 } 4347 c := v_1.AuxInt 4348 v.reset(OpARMBICconst) 4349 v.AuxInt = int64(int32(c) >> uint64(d)) 4350 v.AddArg(x) 4351 return true 4352 } 4353 // match: (BICshiftRA x (SRAconst x [c]) [d]) 4354 // cond: c==d 4355 // result: (MOVWconst [0]) 4356 for { 4357 d := v.AuxInt 4358 _ = v.Args[1] 4359 x := v.Args[0] 4360 v_1 := v.Args[1] 4361 if v_1.Op != OpARMSRAconst { 4362 break 4363 } 4364 c := v_1.AuxInt 4365 if x != v_1.Args[0] { 4366 break 4367 } 4368 if !(c == d) { 4369 break 4370 } 4371 v.reset(OpARMMOVWconst) 4372 v.AuxInt = 0 4373 return true 4374 } 4375 return false 4376 } 4377 func rewriteValueARM_OpARMBICshiftRAreg_0(v *Value) bool { 4378 // match: (BICshiftRAreg x y (MOVWconst [c])) 4379 // cond: 4380 // result: (BICshiftRA x y [c]) 4381 for { 4382 _ = v.Args[2] 4383 x := v.Args[0] 4384 y := v.Args[1] 4385 v_2 := v.Args[2] 4386 if v_2.Op != OpARMMOVWconst { 4387 break 4388 } 4389 c := v_2.AuxInt 4390 v.reset(OpARMBICshiftRA) 4391 v.AuxInt = c 4392 v.AddArg(x) 4393 v.AddArg(y) 4394 return true 4395 } 4396 return false 4397 } 4398 func rewriteValueARM_OpARMBICshiftRL_0(v *Value) bool { 4399 // match: (BICshiftRL x (MOVWconst [c]) [d]) 4400 // cond: 4401 // result: (BICconst x [int64(int32(uint32(c)>>uint64(d)))]) 4402 for { 4403 d := v.AuxInt 4404 _ = v.Args[1] 4405 x := v.Args[0] 4406 v_1 := v.Args[1] 4407 if v_1.Op != OpARMMOVWconst { 4408 break 4409 } 4410 c := v_1.AuxInt 4411 v.reset(OpARMBICconst) 4412 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 4413 v.AddArg(x) 4414 return true 4415 } 4416 // match: (BICshiftRL x (SRLconst x [c]) [d]) 4417 // cond: c==d 4418 // result: (MOVWconst [0]) 4419 for { 4420 d := v.AuxInt 4421 _ = v.Args[1] 4422 x := v.Args[0] 4423 v_1 := v.Args[1] 4424 if v_1.Op != OpARMSRLconst { 4425 break 4426 } 4427 c := v_1.AuxInt 4428 if x != v_1.Args[0] { 4429 break 4430 } 4431 if !(c == d) { 4432 break 4433 } 4434 v.reset(OpARMMOVWconst) 4435 v.AuxInt = 0 4436 return true 4437 } 4438 return false 4439 } 4440 func rewriteValueARM_OpARMBICshiftRLreg_0(v *Value) bool { 4441 // match: (BICshiftRLreg x y (MOVWconst [c])) 4442 // cond: 4443 // result: (BICshiftRL x y [c]) 4444 for { 4445 _ = v.Args[2] 4446 x := v.Args[0] 4447 y := v.Args[1] 4448 v_2 := v.Args[2] 4449 if v_2.Op != OpARMMOVWconst { 4450 break 4451 } 4452 c := v_2.AuxInt 4453 v.reset(OpARMBICshiftRL) 4454 v.AuxInt = c 4455 v.AddArg(x) 4456 v.AddArg(y) 4457 return true 4458 } 4459 return false 4460 } 4461 func rewriteValueARM_OpARMCMN_0(v *Value) bool { 4462 // match: (CMN x (MOVWconst [c])) 4463 // cond: 4464 // result: (CMNconst [c] x) 4465 for { 4466 _ = v.Args[1] 4467 x := v.Args[0] 4468 v_1 := v.Args[1] 4469 if v_1.Op != OpARMMOVWconst { 4470 break 4471 } 4472 c := v_1.AuxInt 4473 v.reset(OpARMCMNconst) 4474 v.AuxInt = c 4475 v.AddArg(x) 4476 return true 4477 } 4478 // match: (CMN (MOVWconst [c]) x) 4479 // cond: 4480 // result: (CMNconst [c] x) 4481 for { 4482 _ = v.Args[1] 4483 v_0 := v.Args[0] 4484 if v_0.Op != OpARMMOVWconst { 4485 break 4486 } 4487 c := v_0.AuxInt 4488 x := v.Args[1] 4489 v.reset(OpARMCMNconst) 4490 v.AuxInt = c 4491 v.AddArg(x) 4492 return true 4493 } 4494 // match: (CMN x (SLLconst [c] y)) 4495 // cond: 4496 // result: (CMNshiftLL x y [c]) 4497 for { 4498 _ = v.Args[1] 4499 x := v.Args[0] 4500 v_1 := v.Args[1] 4501 if v_1.Op != OpARMSLLconst { 4502 break 4503 } 4504 c := v_1.AuxInt 4505 y := v_1.Args[0] 4506 v.reset(OpARMCMNshiftLL) 4507 v.AuxInt = c 4508 v.AddArg(x) 4509 v.AddArg(y) 4510 return true 4511 } 4512 // match: (CMN (SLLconst [c] y) x) 4513 // cond: 4514 // result: (CMNshiftLL x y [c]) 4515 for { 4516 _ = v.Args[1] 4517 v_0 := v.Args[0] 4518 if v_0.Op != OpARMSLLconst { 4519 break 4520 } 4521 c := v_0.AuxInt 4522 y := v_0.Args[0] 4523 x := v.Args[1] 4524 v.reset(OpARMCMNshiftLL) 4525 v.AuxInt = c 4526 v.AddArg(x) 4527 v.AddArg(y) 4528 return true 4529 } 4530 // match: (CMN x (SRLconst [c] y)) 4531 // cond: 4532 // result: (CMNshiftRL x y [c]) 4533 for { 4534 _ = v.Args[1] 4535 x := v.Args[0] 4536 v_1 := v.Args[1] 4537 if v_1.Op != OpARMSRLconst { 4538 break 4539 } 4540 c := v_1.AuxInt 4541 y := v_1.Args[0] 4542 v.reset(OpARMCMNshiftRL) 4543 v.AuxInt = c 4544 v.AddArg(x) 4545 v.AddArg(y) 4546 return true 4547 } 4548 // match: (CMN (SRLconst [c] y) x) 4549 // cond: 4550 // result: (CMNshiftRL x y [c]) 4551 for { 4552 _ = v.Args[1] 4553 v_0 := v.Args[0] 4554 if v_0.Op != OpARMSRLconst { 4555 break 4556 } 4557 c := v_0.AuxInt 4558 y := v_0.Args[0] 4559 x := v.Args[1] 4560 v.reset(OpARMCMNshiftRL) 4561 v.AuxInt = c 4562 v.AddArg(x) 4563 v.AddArg(y) 4564 return true 4565 } 4566 // match: (CMN x (SRAconst [c] y)) 4567 // cond: 4568 // result: (CMNshiftRA x y [c]) 4569 for { 4570 _ = v.Args[1] 4571 x := v.Args[0] 4572 v_1 := v.Args[1] 4573 if v_1.Op != OpARMSRAconst { 4574 break 4575 } 4576 c := v_1.AuxInt 4577 y := v_1.Args[0] 4578 v.reset(OpARMCMNshiftRA) 4579 v.AuxInt = c 4580 v.AddArg(x) 4581 v.AddArg(y) 4582 return true 4583 } 4584 // match: (CMN (SRAconst [c] y) x) 4585 // cond: 4586 // result: (CMNshiftRA x y [c]) 4587 for { 4588 _ = v.Args[1] 4589 v_0 := v.Args[0] 4590 if v_0.Op != OpARMSRAconst { 4591 break 4592 } 4593 c := v_0.AuxInt 4594 y := v_0.Args[0] 4595 x := v.Args[1] 4596 v.reset(OpARMCMNshiftRA) 4597 v.AuxInt = c 4598 v.AddArg(x) 4599 v.AddArg(y) 4600 return true 4601 } 4602 // match: (CMN x (SLL y z)) 4603 // cond: 4604 // result: (CMNshiftLLreg x y z) 4605 for { 4606 _ = v.Args[1] 4607 x := v.Args[0] 4608 v_1 := v.Args[1] 4609 if v_1.Op != OpARMSLL { 4610 break 4611 } 4612 _ = v_1.Args[1] 4613 y := v_1.Args[0] 4614 z := v_1.Args[1] 4615 v.reset(OpARMCMNshiftLLreg) 4616 v.AddArg(x) 4617 v.AddArg(y) 4618 v.AddArg(z) 4619 return true 4620 } 4621 // match: (CMN (SLL y z) x) 4622 // cond: 4623 // result: (CMNshiftLLreg x y z) 4624 for { 4625 _ = v.Args[1] 4626 v_0 := v.Args[0] 4627 if v_0.Op != OpARMSLL { 4628 break 4629 } 4630 _ = v_0.Args[1] 4631 y := v_0.Args[0] 4632 z := v_0.Args[1] 4633 x := v.Args[1] 4634 v.reset(OpARMCMNshiftLLreg) 4635 v.AddArg(x) 4636 v.AddArg(y) 4637 v.AddArg(z) 4638 return true 4639 } 4640 return false 4641 } 4642 func rewriteValueARM_OpARMCMN_10(v *Value) bool { 4643 // match: (CMN x (SRL y z)) 4644 // cond: 4645 // result: (CMNshiftRLreg x y z) 4646 for { 4647 _ = v.Args[1] 4648 x := v.Args[0] 4649 v_1 := v.Args[1] 4650 if v_1.Op != OpARMSRL { 4651 break 4652 } 4653 _ = v_1.Args[1] 4654 y := v_1.Args[0] 4655 z := v_1.Args[1] 4656 v.reset(OpARMCMNshiftRLreg) 4657 v.AddArg(x) 4658 v.AddArg(y) 4659 v.AddArg(z) 4660 return true 4661 } 4662 // match: (CMN (SRL y z) x) 4663 // cond: 4664 // result: (CMNshiftRLreg x y z) 4665 for { 4666 _ = v.Args[1] 4667 v_0 := v.Args[0] 4668 if v_0.Op != OpARMSRL { 4669 break 4670 } 4671 _ = v_0.Args[1] 4672 y := v_0.Args[0] 4673 z := v_0.Args[1] 4674 x := v.Args[1] 4675 v.reset(OpARMCMNshiftRLreg) 4676 v.AddArg(x) 4677 v.AddArg(y) 4678 v.AddArg(z) 4679 return true 4680 } 4681 // match: (CMN x (SRA y z)) 4682 // cond: 4683 // result: (CMNshiftRAreg x y z) 4684 for { 4685 _ = v.Args[1] 4686 x := v.Args[0] 4687 v_1 := v.Args[1] 4688 if v_1.Op != OpARMSRA { 4689 break 4690 } 4691 _ = v_1.Args[1] 4692 y := v_1.Args[0] 4693 z := v_1.Args[1] 4694 v.reset(OpARMCMNshiftRAreg) 4695 v.AddArg(x) 4696 v.AddArg(y) 4697 v.AddArg(z) 4698 return true 4699 } 4700 // match: (CMN (SRA y z) x) 4701 // cond: 4702 // result: (CMNshiftRAreg x y z) 4703 for { 4704 _ = v.Args[1] 4705 v_0 := v.Args[0] 4706 if v_0.Op != OpARMSRA { 4707 break 4708 } 4709 _ = v_0.Args[1] 4710 y := v_0.Args[0] 4711 z := v_0.Args[1] 4712 x := v.Args[1] 4713 v.reset(OpARMCMNshiftRAreg) 4714 v.AddArg(x) 4715 v.AddArg(y) 4716 v.AddArg(z) 4717 return true 4718 } 4719 // match: (CMN x (RSBconst [0] y)) 4720 // cond: 4721 // result: (CMP x y) 4722 for { 4723 _ = v.Args[1] 4724 x := v.Args[0] 4725 v_1 := v.Args[1] 4726 if v_1.Op != OpARMRSBconst { 4727 break 4728 } 4729 if v_1.AuxInt != 0 { 4730 break 4731 } 4732 y := v_1.Args[0] 4733 v.reset(OpARMCMP) 4734 v.AddArg(x) 4735 v.AddArg(y) 4736 return true 4737 } 4738 // match: (CMN (RSBconst [0] y) x) 4739 // cond: 4740 // result: (CMP x y) 4741 for { 4742 _ = v.Args[1] 4743 v_0 := v.Args[0] 4744 if v_0.Op != OpARMRSBconst { 4745 break 4746 } 4747 if v_0.AuxInt != 0 { 4748 break 4749 } 4750 y := v_0.Args[0] 4751 x := v.Args[1] 4752 v.reset(OpARMCMP) 4753 v.AddArg(x) 4754 v.AddArg(y) 4755 return true 4756 } 4757 return false 4758 } 4759 func rewriteValueARM_OpARMCMNconst_0(v *Value) bool { 4760 // match: (CMNconst (MOVWconst [x]) [y]) 4761 // cond: int32(x)==int32(-y) 4762 // result: (FlagEQ) 4763 for { 4764 y := v.AuxInt 4765 v_0 := v.Args[0] 4766 if v_0.Op != OpARMMOVWconst { 4767 break 4768 } 4769 x := v_0.AuxInt 4770 if !(int32(x) == int32(-y)) { 4771 break 4772 } 4773 v.reset(OpARMFlagEQ) 4774 return true 4775 } 4776 // match: (CMNconst (MOVWconst [x]) [y]) 4777 // cond: int32(x)<int32(-y) && uint32(x)<uint32(-y) 4778 // result: (FlagLT_ULT) 4779 for { 4780 y := v.AuxInt 4781 v_0 := v.Args[0] 4782 if v_0.Op != OpARMMOVWconst { 4783 break 4784 } 4785 x := v_0.AuxInt 4786 if !(int32(x) < int32(-y) && uint32(x) < uint32(-y)) { 4787 break 4788 } 4789 v.reset(OpARMFlagLT_ULT) 4790 return true 4791 } 4792 // match: (CMNconst (MOVWconst [x]) [y]) 4793 // cond: int32(x)<int32(-y) && uint32(x)>uint32(-y) 4794 // result: (FlagLT_UGT) 4795 for { 4796 y := v.AuxInt 4797 v_0 := v.Args[0] 4798 if v_0.Op != OpARMMOVWconst { 4799 break 4800 } 4801 x := v_0.AuxInt 4802 if !(int32(x) < int32(-y) && uint32(x) > uint32(-y)) { 4803 break 4804 } 4805 v.reset(OpARMFlagLT_UGT) 4806 return true 4807 } 4808 // match: (CMNconst (MOVWconst [x]) [y]) 4809 // cond: int32(x)>int32(-y) && uint32(x)<uint32(-y) 4810 // result: (FlagGT_ULT) 4811 for { 4812 y := v.AuxInt 4813 v_0 := v.Args[0] 4814 if v_0.Op != OpARMMOVWconst { 4815 break 4816 } 4817 x := v_0.AuxInt 4818 if !(int32(x) > int32(-y) && uint32(x) < uint32(-y)) { 4819 break 4820 } 4821 v.reset(OpARMFlagGT_ULT) 4822 return true 4823 } 4824 // match: (CMNconst (MOVWconst [x]) [y]) 4825 // cond: int32(x)>int32(-y) && uint32(x)>uint32(-y) 4826 // result: (FlagGT_UGT) 4827 for { 4828 y := v.AuxInt 4829 v_0 := v.Args[0] 4830 if v_0.Op != OpARMMOVWconst { 4831 break 4832 } 4833 x := v_0.AuxInt 4834 if !(int32(x) > int32(-y) && uint32(x) > uint32(-y)) { 4835 break 4836 } 4837 v.reset(OpARMFlagGT_UGT) 4838 return true 4839 } 4840 return false 4841 } 4842 func rewriteValueARM_OpARMCMNshiftLL_0(v *Value) bool { 4843 b := v.Block 4844 _ = b 4845 // match: (CMNshiftLL (MOVWconst [c]) x [d]) 4846 // cond: 4847 // result: (CMNconst [c] (SLLconst <x.Type> x [d])) 4848 for { 4849 d := v.AuxInt 4850 _ = v.Args[1] 4851 v_0 := v.Args[0] 4852 if v_0.Op != OpARMMOVWconst { 4853 break 4854 } 4855 c := v_0.AuxInt 4856 x := v.Args[1] 4857 v.reset(OpARMCMNconst) 4858 v.AuxInt = c 4859 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4860 v0.AuxInt = d 4861 v0.AddArg(x) 4862 v.AddArg(v0) 4863 return true 4864 } 4865 // match: (CMNshiftLL x (MOVWconst [c]) [d]) 4866 // cond: 4867 // result: (CMNconst x [int64(int32(uint32(c)<<uint64(d)))]) 4868 for { 4869 d := v.AuxInt 4870 _ = v.Args[1] 4871 x := v.Args[0] 4872 v_1 := v.Args[1] 4873 if v_1.Op != OpARMMOVWconst { 4874 break 4875 } 4876 c := v_1.AuxInt 4877 v.reset(OpARMCMNconst) 4878 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 4879 v.AddArg(x) 4880 return true 4881 } 4882 return false 4883 } 4884 func rewriteValueARM_OpARMCMNshiftLLreg_0(v *Value) bool { 4885 b := v.Block 4886 _ = b 4887 // match: (CMNshiftLLreg (MOVWconst [c]) x y) 4888 // cond: 4889 // result: (CMNconst [c] (SLL <x.Type> x y)) 4890 for { 4891 _ = v.Args[2] 4892 v_0 := v.Args[0] 4893 if v_0.Op != OpARMMOVWconst { 4894 break 4895 } 4896 c := v_0.AuxInt 4897 x := v.Args[1] 4898 y := v.Args[2] 4899 v.reset(OpARMCMNconst) 4900 v.AuxInt = c 4901 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4902 v0.AddArg(x) 4903 v0.AddArg(y) 4904 v.AddArg(v0) 4905 return true 4906 } 4907 // match: (CMNshiftLLreg x y (MOVWconst [c])) 4908 // cond: 4909 // result: (CMNshiftLL x y [c]) 4910 for { 4911 _ = v.Args[2] 4912 x := v.Args[0] 4913 y := v.Args[1] 4914 v_2 := v.Args[2] 4915 if v_2.Op != OpARMMOVWconst { 4916 break 4917 } 4918 c := v_2.AuxInt 4919 v.reset(OpARMCMNshiftLL) 4920 v.AuxInt = c 4921 v.AddArg(x) 4922 v.AddArg(y) 4923 return true 4924 } 4925 return false 4926 } 4927 func rewriteValueARM_OpARMCMNshiftRA_0(v *Value) bool { 4928 b := v.Block 4929 _ = b 4930 // match: (CMNshiftRA (MOVWconst [c]) x [d]) 4931 // cond: 4932 // result: (CMNconst [c] (SRAconst <x.Type> x [d])) 4933 for { 4934 d := v.AuxInt 4935 _ = v.Args[1] 4936 v_0 := v.Args[0] 4937 if v_0.Op != OpARMMOVWconst { 4938 break 4939 } 4940 c := v_0.AuxInt 4941 x := v.Args[1] 4942 v.reset(OpARMCMNconst) 4943 v.AuxInt = c 4944 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4945 v0.AuxInt = d 4946 v0.AddArg(x) 4947 v.AddArg(v0) 4948 return true 4949 } 4950 // match: (CMNshiftRA x (MOVWconst [c]) [d]) 4951 // cond: 4952 // result: (CMNconst x [int64(int32(c)>>uint64(d))]) 4953 for { 4954 d := v.AuxInt 4955 _ = v.Args[1] 4956 x := v.Args[0] 4957 v_1 := v.Args[1] 4958 if v_1.Op != OpARMMOVWconst { 4959 break 4960 } 4961 c := v_1.AuxInt 4962 v.reset(OpARMCMNconst) 4963 v.AuxInt = int64(int32(c) >> uint64(d)) 4964 v.AddArg(x) 4965 return true 4966 } 4967 return false 4968 } 4969 func rewriteValueARM_OpARMCMNshiftRAreg_0(v *Value) bool { 4970 b := v.Block 4971 _ = b 4972 // match: (CMNshiftRAreg (MOVWconst [c]) x y) 4973 // cond: 4974 // result: (CMNconst [c] (SRA <x.Type> x y)) 4975 for { 4976 _ = v.Args[2] 4977 v_0 := v.Args[0] 4978 if v_0.Op != OpARMMOVWconst { 4979 break 4980 } 4981 c := v_0.AuxInt 4982 x := v.Args[1] 4983 y := v.Args[2] 4984 v.reset(OpARMCMNconst) 4985 v.AuxInt = c 4986 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4987 v0.AddArg(x) 4988 v0.AddArg(y) 4989 v.AddArg(v0) 4990 return true 4991 } 4992 // match: (CMNshiftRAreg x y (MOVWconst [c])) 4993 // cond: 4994 // result: (CMNshiftRA x y [c]) 4995 for { 4996 _ = v.Args[2] 4997 x := v.Args[0] 4998 y := v.Args[1] 4999 v_2 := v.Args[2] 5000 if v_2.Op != OpARMMOVWconst { 5001 break 5002 } 5003 c := v_2.AuxInt 5004 v.reset(OpARMCMNshiftRA) 5005 v.AuxInt = c 5006 v.AddArg(x) 5007 v.AddArg(y) 5008 return true 5009 } 5010 return false 5011 } 5012 func rewriteValueARM_OpARMCMNshiftRL_0(v *Value) bool { 5013 b := v.Block 5014 _ = b 5015 // match: (CMNshiftRL (MOVWconst [c]) x [d]) 5016 // cond: 5017 // result: (CMNconst [c] (SRLconst <x.Type> x [d])) 5018 for { 5019 d := v.AuxInt 5020 _ = v.Args[1] 5021 v_0 := v.Args[0] 5022 if v_0.Op != OpARMMOVWconst { 5023 break 5024 } 5025 c := v_0.AuxInt 5026 x := v.Args[1] 5027 v.reset(OpARMCMNconst) 5028 v.AuxInt = c 5029 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 5030 v0.AuxInt = d 5031 v0.AddArg(x) 5032 v.AddArg(v0) 5033 return true 5034 } 5035 // match: (CMNshiftRL x (MOVWconst [c]) [d]) 5036 // cond: 5037 // result: (CMNconst x [int64(int32(uint32(c)>>uint64(d)))]) 5038 for { 5039 d := v.AuxInt 5040 _ = v.Args[1] 5041 x := v.Args[0] 5042 v_1 := v.Args[1] 5043 if v_1.Op != OpARMMOVWconst { 5044 break 5045 } 5046 c := v_1.AuxInt 5047 v.reset(OpARMCMNconst) 5048 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 5049 v.AddArg(x) 5050 return true 5051 } 5052 return false 5053 } 5054 func rewriteValueARM_OpARMCMNshiftRLreg_0(v *Value) bool { 5055 b := v.Block 5056 _ = b 5057 // match: (CMNshiftRLreg (MOVWconst [c]) x y) 5058 // cond: 5059 // result: (CMNconst [c] (SRL <x.Type> x y)) 5060 for { 5061 _ = v.Args[2] 5062 v_0 := v.Args[0] 5063 if v_0.Op != OpARMMOVWconst { 5064 break 5065 } 5066 c := v_0.AuxInt 5067 x := v.Args[1] 5068 y := v.Args[2] 5069 v.reset(OpARMCMNconst) 5070 v.AuxInt = c 5071 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 5072 v0.AddArg(x) 5073 v0.AddArg(y) 5074 v.AddArg(v0) 5075 return true 5076 } 5077 // match: (CMNshiftRLreg x y (MOVWconst [c])) 5078 // cond: 5079 // result: (CMNshiftRL x y [c]) 5080 for { 5081 _ = v.Args[2] 5082 x := v.Args[0] 5083 y := v.Args[1] 5084 v_2 := v.Args[2] 5085 if v_2.Op != OpARMMOVWconst { 5086 break 5087 } 5088 c := v_2.AuxInt 5089 v.reset(OpARMCMNshiftRL) 5090 v.AuxInt = c 5091 v.AddArg(x) 5092 v.AddArg(y) 5093 return true 5094 } 5095 return false 5096 } 5097 func rewriteValueARM_OpARMCMOVWHSconst_0(v *Value) bool { 5098 // match: (CMOVWHSconst _ (FlagEQ) [c]) 5099 // cond: 5100 // result: (MOVWconst [c]) 5101 for { 5102 c := v.AuxInt 5103 _ = v.Args[1] 5104 v_1 := v.Args[1] 5105 if v_1.Op != OpARMFlagEQ { 5106 break 5107 } 5108 v.reset(OpARMMOVWconst) 5109 v.AuxInt = c 5110 return true 5111 } 5112 // match: (CMOVWHSconst x (FlagLT_ULT)) 5113 // cond: 5114 // result: x 5115 for { 5116 _ = v.Args[1] 5117 x := v.Args[0] 5118 v_1 := v.Args[1] 5119 if v_1.Op != OpARMFlagLT_ULT { 5120 break 5121 } 5122 v.reset(OpCopy) 5123 v.Type = x.Type 5124 v.AddArg(x) 5125 return true 5126 } 5127 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 5128 // cond: 5129 // result: (MOVWconst [c]) 5130 for { 5131 c := v.AuxInt 5132 _ = v.Args[1] 5133 v_1 := v.Args[1] 5134 if v_1.Op != OpARMFlagLT_UGT { 5135 break 5136 } 5137 v.reset(OpARMMOVWconst) 5138 v.AuxInt = c 5139 return true 5140 } 5141 // match: (CMOVWHSconst x (FlagGT_ULT)) 5142 // cond: 5143 // result: x 5144 for { 5145 _ = v.Args[1] 5146 x := v.Args[0] 5147 v_1 := v.Args[1] 5148 if v_1.Op != OpARMFlagGT_ULT { 5149 break 5150 } 5151 v.reset(OpCopy) 5152 v.Type = x.Type 5153 v.AddArg(x) 5154 return true 5155 } 5156 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 5157 // cond: 5158 // result: (MOVWconst [c]) 5159 for { 5160 c := v.AuxInt 5161 _ = v.Args[1] 5162 v_1 := v.Args[1] 5163 if v_1.Op != OpARMFlagGT_UGT { 5164 break 5165 } 5166 v.reset(OpARMMOVWconst) 5167 v.AuxInt = c 5168 return true 5169 } 5170 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 5171 // cond: 5172 // result: (CMOVWLSconst x flags [c]) 5173 for { 5174 c := v.AuxInt 5175 _ = v.Args[1] 5176 x := v.Args[0] 5177 v_1 := v.Args[1] 5178 if v_1.Op != OpARMInvertFlags { 5179 break 5180 } 5181 flags := v_1.Args[0] 5182 v.reset(OpARMCMOVWLSconst) 5183 v.AuxInt = c 5184 v.AddArg(x) 5185 v.AddArg(flags) 5186 return true 5187 } 5188 return false 5189 } 5190 func rewriteValueARM_OpARMCMOVWLSconst_0(v *Value) bool { 5191 // match: (CMOVWLSconst _ (FlagEQ) [c]) 5192 // cond: 5193 // result: (MOVWconst [c]) 5194 for { 5195 c := v.AuxInt 5196 _ = v.Args[1] 5197 v_1 := v.Args[1] 5198 if v_1.Op != OpARMFlagEQ { 5199 break 5200 } 5201 v.reset(OpARMMOVWconst) 5202 v.AuxInt = c 5203 return true 5204 } 5205 // match: (CMOVWLSconst _ (FlagLT_ULT) [c]) 5206 // cond: 5207 // result: (MOVWconst [c]) 5208 for { 5209 c := v.AuxInt 5210 _ = v.Args[1] 5211 v_1 := v.Args[1] 5212 if v_1.Op != OpARMFlagLT_ULT { 5213 break 5214 } 5215 v.reset(OpARMMOVWconst) 5216 v.AuxInt = c 5217 return true 5218 } 5219 // match: (CMOVWLSconst x (FlagLT_UGT)) 5220 // cond: 5221 // result: x 5222 for { 5223 _ = v.Args[1] 5224 x := v.Args[0] 5225 v_1 := v.Args[1] 5226 if v_1.Op != OpARMFlagLT_UGT { 5227 break 5228 } 5229 v.reset(OpCopy) 5230 v.Type = x.Type 5231 v.AddArg(x) 5232 return true 5233 } 5234 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 5235 // cond: 5236 // result: (MOVWconst [c]) 5237 for { 5238 c := v.AuxInt 5239 _ = v.Args[1] 5240 v_1 := v.Args[1] 5241 if v_1.Op != OpARMFlagGT_ULT { 5242 break 5243 } 5244 v.reset(OpARMMOVWconst) 5245 v.AuxInt = c 5246 return true 5247 } 5248 // match: (CMOVWLSconst x (FlagGT_UGT)) 5249 // cond: 5250 // result: x 5251 for { 5252 _ = v.Args[1] 5253 x := v.Args[0] 5254 v_1 := v.Args[1] 5255 if v_1.Op != OpARMFlagGT_UGT { 5256 break 5257 } 5258 v.reset(OpCopy) 5259 v.Type = x.Type 5260 v.AddArg(x) 5261 return true 5262 } 5263 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 5264 // cond: 5265 // result: (CMOVWHSconst x flags [c]) 5266 for { 5267 c := v.AuxInt 5268 _ = v.Args[1] 5269 x := v.Args[0] 5270 v_1 := v.Args[1] 5271 if v_1.Op != OpARMInvertFlags { 5272 break 5273 } 5274 flags := v_1.Args[0] 5275 v.reset(OpARMCMOVWHSconst) 5276 v.AuxInt = c 5277 v.AddArg(x) 5278 v.AddArg(flags) 5279 return true 5280 } 5281 return false 5282 } 5283 func rewriteValueARM_OpARMCMP_0(v *Value) bool { 5284 b := v.Block 5285 _ = b 5286 // match: (CMP x (MOVWconst [c])) 5287 // cond: 5288 // result: (CMPconst [c] x) 5289 for { 5290 _ = v.Args[1] 5291 x := v.Args[0] 5292 v_1 := v.Args[1] 5293 if v_1.Op != OpARMMOVWconst { 5294 break 5295 } 5296 c := v_1.AuxInt 5297 v.reset(OpARMCMPconst) 5298 v.AuxInt = c 5299 v.AddArg(x) 5300 return true 5301 } 5302 // match: (CMP (MOVWconst [c]) x) 5303 // cond: 5304 // result: (InvertFlags (CMPconst [c] x)) 5305 for { 5306 _ = v.Args[1] 5307 v_0 := v.Args[0] 5308 if v_0.Op != OpARMMOVWconst { 5309 break 5310 } 5311 c := v_0.AuxInt 5312 x := v.Args[1] 5313 v.reset(OpARMInvertFlags) 5314 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5315 v0.AuxInt = c 5316 v0.AddArg(x) 5317 v.AddArg(v0) 5318 return true 5319 } 5320 // match: (CMP x (SLLconst [c] y)) 5321 // cond: 5322 // result: (CMPshiftLL x y [c]) 5323 for { 5324 _ = v.Args[1] 5325 x := v.Args[0] 5326 v_1 := v.Args[1] 5327 if v_1.Op != OpARMSLLconst { 5328 break 5329 } 5330 c := v_1.AuxInt 5331 y := v_1.Args[0] 5332 v.reset(OpARMCMPshiftLL) 5333 v.AuxInt = c 5334 v.AddArg(x) 5335 v.AddArg(y) 5336 return true 5337 } 5338 // match: (CMP (SLLconst [c] y) x) 5339 // cond: 5340 // result: (InvertFlags (CMPshiftLL x y [c])) 5341 for { 5342 _ = v.Args[1] 5343 v_0 := v.Args[0] 5344 if v_0.Op != OpARMSLLconst { 5345 break 5346 } 5347 c := v_0.AuxInt 5348 y := v_0.Args[0] 5349 x := v.Args[1] 5350 v.reset(OpARMInvertFlags) 5351 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 5352 v0.AuxInt = c 5353 v0.AddArg(x) 5354 v0.AddArg(y) 5355 v.AddArg(v0) 5356 return true 5357 } 5358 // match: (CMP x (SRLconst [c] y)) 5359 // cond: 5360 // result: (CMPshiftRL x y [c]) 5361 for { 5362 _ = v.Args[1] 5363 x := v.Args[0] 5364 v_1 := v.Args[1] 5365 if v_1.Op != OpARMSRLconst { 5366 break 5367 } 5368 c := v_1.AuxInt 5369 y := v_1.Args[0] 5370 v.reset(OpARMCMPshiftRL) 5371 v.AuxInt = c 5372 v.AddArg(x) 5373 v.AddArg(y) 5374 return true 5375 } 5376 // match: (CMP (SRLconst [c] y) x) 5377 // cond: 5378 // result: (InvertFlags (CMPshiftRL x y [c])) 5379 for { 5380 _ = v.Args[1] 5381 v_0 := v.Args[0] 5382 if v_0.Op != OpARMSRLconst { 5383 break 5384 } 5385 c := v_0.AuxInt 5386 y := v_0.Args[0] 5387 x := v.Args[1] 5388 v.reset(OpARMInvertFlags) 5389 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 5390 v0.AuxInt = c 5391 v0.AddArg(x) 5392 v0.AddArg(y) 5393 v.AddArg(v0) 5394 return true 5395 } 5396 // match: (CMP x (SRAconst [c] y)) 5397 // cond: 5398 // result: (CMPshiftRA x y [c]) 5399 for { 5400 _ = v.Args[1] 5401 x := v.Args[0] 5402 v_1 := v.Args[1] 5403 if v_1.Op != OpARMSRAconst { 5404 break 5405 } 5406 c := v_1.AuxInt 5407 y := v_1.Args[0] 5408 v.reset(OpARMCMPshiftRA) 5409 v.AuxInt = c 5410 v.AddArg(x) 5411 v.AddArg(y) 5412 return true 5413 } 5414 // match: (CMP (SRAconst [c] y) x) 5415 // cond: 5416 // result: (InvertFlags (CMPshiftRA x y [c])) 5417 for { 5418 _ = v.Args[1] 5419 v_0 := v.Args[0] 5420 if v_0.Op != OpARMSRAconst { 5421 break 5422 } 5423 c := v_0.AuxInt 5424 y := v_0.Args[0] 5425 x := v.Args[1] 5426 v.reset(OpARMInvertFlags) 5427 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 5428 v0.AuxInt = c 5429 v0.AddArg(x) 5430 v0.AddArg(y) 5431 v.AddArg(v0) 5432 return true 5433 } 5434 // match: (CMP x (SLL y z)) 5435 // cond: 5436 // result: (CMPshiftLLreg x y z) 5437 for { 5438 _ = v.Args[1] 5439 x := v.Args[0] 5440 v_1 := v.Args[1] 5441 if v_1.Op != OpARMSLL { 5442 break 5443 } 5444 _ = v_1.Args[1] 5445 y := v_1.Args[0] 5446 z := v_1.Args[1] 5447 v.reset(OpARMCMPshiftLLreg) 5448 v.AddArg(x) 5449 v.AddArg(y) 5450 v.AddArg(z) 5451 return true 5452 } 5453 // match: (CMP (SLL y z) x) 5454 // cond: 5455 // result: (InvertFlags (CMPshiftLLreg x y z)) 5456 for { 5457 _ = v.Args[1] 5458 v_0 := v.Args[0] 5459 if v_0.Op != OpARMSLL { 5460 break 5461 } 5462 _ = v_0.Args[1] 5463 y := v_0.Args[0] 5464 z := v_0.Args[1] 5465 x := v.Args[1] 5466 v.reset(OpARMInvertFlags) 5467 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 5468 v0.AddArg(x) 5469 v0.AddArg(y) 5470 v0.AddArg(z) 5471 v.AddArg(v0) 5472 return true 5473 } 5474 return false 5475 } 5476 func rewriteValueARM_OpARMCMP_10(v *Value) bool { 5477 b := v.Block 5478 _ = b 5479 // match: (CMP x (SRL y z)) 5480 // cond: 5481 // result: (CMPshiftRLreg x y z) 5482 for { 5483 _ = v.Args[1] 5484 x := v.Args[0] 5485 v_1 := v.Args[1] 5486 if v_1.Op != OpARMSRL { 5487 break 5488 } 5489 _ = v_1.Args[1] 5490 y := v_1.Args[0] 5491 z := v_1.Args[1] 5492 v.reset(OpARMCMPshiftRLreg) 5493 v.AddArg(x) 5494 v.AddArg(y) 5495 v.AddArg(z) 5496 return true 5497 } 5498 // match: (CMP (SRL y z) x) 5499 // cond: 5500 // result: (InvertFlags (CMPshiftRLreg x y z)) 5501 for { 5502 _ = v.Args[1] 5503 v_0 := v.Args[0] 5504 if v_0.Op != OpARMSRL { 5505 break 5506 } 5507 _ = v_0.Args[1] 5508 y := v_0.Args[0] 5509 z := v_0.Args[1] 5510 x := v.Args[1] 5511 v.reset(OpARMInvertFlags) 5512 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 5513 v0.AddArg(x) 5514 v0.AddArg(y) 5515 v0.AddArg(z) 5516 v.AddArg(v0) 5517 return true 5518 } 5519 // match: (CMP x (SRA y z)) 5520 // cond: 5521 // result: (CMPshiftRAreg x y z) 5522 for { 5523 _ = v.Args[1] 5524 x := v.Args[0] 5525 v_1 := v.Args[1] 5526 if v_1.Op != OpARMSRA { 5527 break 5528 } 5529 _ = v_1.Args[1] 5530 y := v_1.Args[0] 5531 z := v_1.Args[1] 5532 v.reset(OpARMCMPshiftRAreg) 5533 v.AddArg(x) 5534 v.AddArg(y) 5535 v.AddArg(z) 5536 return true 5537 } 5538 // match: (CMP (SRA y z) x) 5539 // cond: 5540 // result: (InvertFlags (CMPshiftRAreg x y z)) 5541 for { 5542 _ = v.Args[1] 5543 v_0 := v.Args[0] 5544 if v_0.Op != OpARMSRA { 5545 break 5546 } 5547 _ = v_0.Args[1] 5548 y := v_0.Args[0] 5549 z := v_0.Args[1] 5550 x := v.Args[1] 5551 v.reset(OpARMInvertFlags) 5552 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 5553 v0.AddArg(x) 5554 v0.AddArg(y) 5555 v0.AddArg(z) 5556 v.AddArg(v0) 5557 return true 5558 } 5559 // match: (CMP x (RSBconst [0] y)) 5560 // cond: 5561 // result: (CMN x y) 5562 for { 5563 _ = v.Args[1] 5564 x := v.Args[0] 5565 v_1 := v.Args[1] 5566 if v_1.Op != OpARMRSBconst { 5567 break 5568 } 5569 if v_1.AuxInt != 0 { 5570 break 5571 } 5572 y := v_1.Args[0] 5573 v.reset(OpARMCMN) 5574 v.AddArg(x) 5575 v.AddArg(y) 5576 return true 5577 } 5578 return false 5579 } 5580 func rewriteValueARM_OpARMCMPD_0(v *Value) bool { 5581 // match: (CMPD x (MOVDconst [0])) 5582 // cond: 5583 // result: (CMPD0 x) 5584 for { 5585 _ = v.Args[1] 5586 x := v.Args[0] 5587 v_1 := v.Args[1] 5588 if v_1.Op != OpARMMOVDconst { 5589 break 5590 } 5591 if v_1.AuxInt != 0 { 5592 break 5593 } 5594 v.reset(OpARMCMPD0) 5595 v.AddArg(x) 5596 return true 5597 } 5598 return false 5599 } 5600 func rewriteValueARM_OpARMCMPF_0(v *Value) bool { 5601 // match: (CMPF x (MOVFconst [0])) 5602 // cond: 5603 // result: (CMPF0 x) 5604 for { 5605 _ = v.Args[1] 5606 x := v.Args[0] 5607 v_1 := v.Args[1] 5608 if v_1.Op != OpARMMOVFconst { 5609 break 5610 } 5611 if v_1.AuxInt != 0 { 5612 break 5613 } 5614 v.reset(OpARMCMPF0) 5615 v.AddArg(x) 5616 return true 5617 } 5618 return false 5619 } 5620 func rewriteValueARM_OpARMCMPconst_0(v *Value) bool { 5621 // match: (CMPconst (MOVWconst [x]) [y]) 5622 // cond: int32(x)==int32(y) 5623 // result: (FlagEQ) 5624 for { 5625 y := v.AuxInt 5626 v_0 := v.Args[0] 5627 if v_0.Op != OpARMMOVWconst { 5628 break 5629 } 5630 x := v_0.AuxInt 5631 if !(int32(x) == int32(y)) { 5632 break 5633 } 5634 v.reset(OpARMFlagEQ) 5635 return true 5636 } 5637 // match: (CMPconst (MOVWconst [x]) [y]) 5638 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 5639 // result: (FlagLT_ULT) 5640 for { 5641 y := v.AuxInt 5642 v_0 := v.Args[0] 5643 if v_0.Op != OpARMMOVWconst { 5644 break 5645 } 5646 x := v_0.AuxInt 5647 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 5648 break 5649 } 5650 v.reset(OpARMFlagLT_ULT) 5651 return true 5652 } 5653 // match: (CMPconst (MOVWconst [x]) [y]) 5654 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 5655 // result: (FlagLT_UGT) 5656 for { 5657 y := v.AuxInt 5658 v_0 := v.Args[0] 5659 if v_0.Op != OpARMMOVWconst { 5660 break 5661 } 5662 x := v_0.AuxInt 5663 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 5664 break 5665 } 5666 v.reset(OpARMFlagLT_UGT) 5667 return true 5668 } 5669 // match: (CMPconst (MOVWconst [x]) [y]) 5670 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 5671 // result: (FlagGT_ULT) 5672 for { 5673 y := v.AuxInt 5674 v_0 := v.Args[0] 5675 if v_0.Op != OpARMMOVWconst { 5676 break 5677 } 5678 x := v_0.AuxInt 5679 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 5680 break 5681 } 5682 v.reset(OpARMFlagGT_ULT) 5683 return true 5684 } 5685 // match: (CMPconst (MOVWconst [x]) [y]) 5686 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 5687 // result: (FlagGT_UGT) 5688 for { 5689 y := v.AuxInt 5690 v_0 := v.Args[0] 5691 if v_0.Op != OpARMMOVWconst { 5692 break 5693 } 5694 x := v_0.AuxInt 5695 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 5696 break 5697 } 5698 v.reset(OpARMFlagGT_UGT) 5699 return true 5700 } 5701 // match: (CMPconst (MOVBUreg _) [c]) 5702 // cond: 0xff < c 5703 // result: (FlagLT_ULT) 5704 for { 5705 c := v.AuxInt 5706 v_0 := v.Args[0] 5707 if v_0.Op != OpARMMOVBUreg { 5708 break 5709 } 5710 if !(0xff < c) { 5711 break 5712 } 5713 v.reset(OpARMFlagLT_ULT) 5714 return true 5715 } 5716 // match: (CMPconst (MOVHUreg _) [c]) 5717 // cond: 0xffff < c 5718 // result: (FlagLT_ULT) 5719 for { 5720 c := v.AuxInt 5721 v_0 := v.Args[0] 5722 if v_0.Op != OpARMMOVHUreg { 5723 break 5724 } 5725 if !(0xffff < c) { 5726 break 5727 } 5728 v.reset(OpARMFlagLT_ULT) 5729 return true 5730 } 5731 // match: (CMPconst (ANDconst _ [m]) [n]) 5732 // cond: 0 <= int32(m) && int32(m) < int32(n) 5733 // result: (FlagLT_ULT) 5734 for { 5735 n := v.AuxInt 5736 v_0 := v.Args[0] 5737 if v_0.Op != OpARMANDconst { 5738 break 5739 } 5740 m := v_0.AuxInt 5741 if !(0 <= int32(m) && int32(m) < int32(n)) { 5742 break 5743 } 5744 v.reset(OpARMFlagLT_ULT) 5745 return true 5746 } 5747 // match: (CMPconst (SRLconst _ [c]) [n]) 5748 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 5749 // result: (FlagLT_ULT) 5750 for { 5751 n := v.AuxInt 5752 v_0 := v.Args[0] 5753 if v_0.Op != OpARMSRLconst { 5754 break 5755 } 5756 c := v_0.AuxInt 5757 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 5758 break 5759 } 5760 v.reset(OpARMFlagLT_ULT) 5761 return true 5762 } 5763 return false 5764 } 5765 func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { 5766 b := v.Block 5767 _ = b 5768 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 5769 // cond: 5770 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 5771 for { 5772 d := v.AuxInt 5773 _ = v.Args[1] 5774 v_0 := v.Args[0] 5775 if v_0.Op != OpARMMOVWconst { 5776 break 5777 } 5778 c := v_0.AuxInt 5779 x := v.Args[1] 5780 v.reset(OpARMInvertFlags) 5781 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5782 v0.AuxInt = c 5783 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 5784 v1.AuxInt = d 5785 v1.AddArg(x) 5786 v0.AddArg(v1) 5787 v.AddArg(v0) 5788 return true 5789 } 5790 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 5791 // cond: 5792 // result: (CMPconst x [int64(int32(uint32(c)<<uint64(d)))]) 5793 for { 5794 d := v.AuxInt 5795 _ = v.Args[1] 5796 x := v.Args[0] 5797 v_1 := v.Args[1] 5798 if v_1.Op != OpARMMOVWconst { 5799 break 5800 } 5801 c := v_1.AuxInt 5802 v.reset(OpARMCMPconst) 5803 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 5804 v.AddArg(x) 5805 return true 5806 } 5807 return false 5808 } 5809 func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { 5810 b := v.Block 5811 _ = b 5812 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 5813 // cond: 5814 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 5815 for { 5816 _ = v.Args[2] 5817 v_0 := v.Args[0] 5818 if v_0.Op != OpARMMOVWconst { 5819 break 5820 } 5821 c := v_0.AuxInt 5822 x := v.Args[1] 5823 y := v.Args[2] 5824 v.reset(OpARMInvertFlags) 5825 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5826 v0.AuxInt = c 5827 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 5828 v1.AddArg(x) 5829 v1.AddArg(y) 5830 v0.AddArg(v1) 5831 v.AddArg(v0) 5832 return true 5833 } 5834 // match: (CMPshiftLLreg x y (MOVWconst [c])) 5835 // cond: 5836 // result: (CMPshiftLL x y [c]) 5837 for { 5838 _ = v.Args[2] 5839 x := v.Args[0] 5840 y := v.Args[1] 5841 v_2 := v.Args[2] 5842 if v_2.Op != OpARMMOVWconst { 5843 break 5844 } 5845 c := v_2.AuxInt 5846 v.reset(OpARMCMPshiftLL) 5847 v.AuxInt = c 5848 v.AddArg(x) 5849 v.AddArg(y) 5850 return true 5851 } 5852 return false 5853 } 5854 func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { 5855 b := v.Block 5856 _ = b 5857 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 5858 // cond: 5859 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 5860 for { 5861 d := v.AuxInt 5862 _ = v.Args[1] 5863 v_0 := v.Args[0] 5864 if v_0.Op != OpARMMOVWconst { 5865 break 5866 } 5867 c := v_0.AuxInt 5868 x := v.Args[1] 5869 v.reset(OpARMInvertFlags) 5870 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5871 v0.AuxInt = c 5872 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 5873 v1.AuxInt = d 5874 v1.AddArg(x) 5875 v0.AddArg(v1) 5876 v.AddArg(v0) 5877 return true 5878 } 5879 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 5880 // cond: 5881 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 5882 for { 5883 d := v.AuxInt 5884 _ = v.Args[1] 5885 x := v.Args[0] 5886 v_1 := v.Args[1] 5887 if v_1.Op != OpARMMOVWconst { 5888 break 5889 } 5890 c := v_1.AuxInt 5891 v.reset(OpARMCMPconst) 5892 v.AuxInt = int64(int32(c) >> uint64(d)) 5893 v.AddArg(x) 5894 return true 5895 } 5896 return false 5897 } 5898 func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { 5899 b := v.Block 5900 _ = b 5901 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 5902 // cond: 5903 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 5904 for { 5905 _ = v.Args[2] 5906 v_0 := v.Args[0] 5907 if v_0.Op != OpARMMOVWconst { 5908 break 5909 } 5910 c := v_0.AuxInt 5911 x := v.Args[1] 5912 y := v.Args[2] 5913 v.reset(OpARMInvertFlags) 5914 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5915 v0.AuxInt = c 5916 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 5917 v1.AddArg(x) 5918 v1.AddArg(y) 5919 v0.AddArg(v1) 5920 v.AddArg(v0) 5921 return true 5922 } 5923 // match: (CMPshiftRAreg x y (MOVWconst [c])) 5924 // cond: 5925 // result: (CMPshiftRA x y [c]) 5926 for { 5927 _ = v.Args[2] 5928 x := v.Args[0] 5929 y := v.Args[1] 5930 v_2 := v.Args[2] 5931 if v_2.Op != OpARMMOVWconst { 5932 break 5933 } 5934 c := v_2.AuxInt 5935 v.reset(OpARMCMPshiftRA) 5936 v.AuxInt = c 5937 v.AddArg(x) 5938 v.AddArg(y) 5939 return true 5940 } 5941 return false 5942 } 5943 func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { 5944 b := v.Block 5945 _ = b 5946 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 5947 // cond: 5948 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 5949 for { 5950 d := v.AuxInt 5951 _ = v.Args[1] 5952 v_0 := v.Args[0] 5953 if v_0.Op != OpARMMOVWconst { 5954 break 5955 } 5956 c := v_0.AuxInt 5957 x := v.Args[1] 5958 v.reset(OpARMInvertFlags) 5959 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5960 v0.AuxInt = c 5961 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 5962 v1.AuxInt = d 5963 v1.AddArg(x) 5964 v0.AddArg(v1) 5965 v.AddArg(v0) 5966 return true 5967 } 5968 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 5969 // cond: 5970 // result: (CMPconst x [int64(int32(uint32(c)>>uint64(d)))]) 5971 for { 5972 d := v.AuxInt 5973 _ = v.Args[1] 5974 x := v.Args[0] 5975 v_1 := v.Args[1] 5976 if v_1.Op != OpARMMOVWconst { 5977 break 5978 } 5979 c := v_1.AuxInt 5980 v.reset(OpARMCMPconst) 5981 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 5982 v.AddArg(x) 5983 return true 5984 } 5985 return false 5986 } 5987 func rewriteValueARM_OpARMCMPshiftRLreg_0(v *Value) bool { 5988 b := v.Block 5989 _ = b 5990 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 5991 // cond: 5992 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 5993 for { 5994 _ = v.Args[2] 5995 v_0 := v.Args[0] 5996 if v_0.Op != OpARMMOVWconst { 5997 break 5998 } 5999 c := v_0.AuxInt 6000 x := v.Args[1] 6001 y := v.Args[2] 6002 v.reset(OpARMInvertFlags) 6003 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 6004 v0.AuxInt = c 6005 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 6006 v1.AddArg(x) 6007 v1.AddArg(y) 6008 v0.AddArg(v1) 6009 v.AddArg(v0) 6010 return true 6011 } 6012 // match: (CMPshiftRLreg x y (MOVWconst [c])) 6013 // cond: 6014 // result: (CMPshiftRL x y [c]) 6015 for { 6016 _ = v.Args[2] 6017 x := v.Args[0] 6018 y := v.Args[1] 6019 v_2 := v.Args[2] 6020 if v_2.Op != OpARMMOVWconst { 6021 break 6022 } 6023 c := v_2.AuxInt 6024 v.reset(OpARMCMPshiftRL) 6025 v.AuxInt = c 6026 v.AddArg(x) 6027 v.AddArg(y) 6028 return true 6029 } 6030 return false 6031 } 6032 func rewriteValueARM_OpARMEqual_0(v *Value) bool { 6033 // match: (Equal (FlagEQ)) 6034 // cond: 6035 // result: (MOVWconst [1]) 6036 for { 6037 v_0 := v.Args[0] 6038 if v_0.Op != OpARMFlagEQ { 6039 break 6040 } 6041 v.reset(OpARMMOVWconst) 6042 v.AuxInt = 1 6043 return true 6044 } 6045 // match: (Equal (FlagLT_ULT)) 6046 // cond: 6047 // result: (MOVWconst [0]) 6048 for { 6049 v_0 := v.Args[0] 6050 if v_0.Op != OpARMFlagLT_ULT { 6051 break 6052 } 6053 v.reset(OpARMMOVWconst) 6054 v.AuxInt = 0 6055 return true 6056 } 6057 // match: (Equal (FlagLT_UGT)) 6058 // cond: 6059 // result: (MOVWconst [0]) 6060 for { 6061 v_0 := v.Args[0] 6062 if v_0.Op != OpARMFlagLT_UGT { 6063 break 6064 } 6065 v.reset(OpARMMOVWconst) 6066 v.AuxInt = 0 6067 return true 6068 } 6069 // match: (Equal (FlagGT_ULT)) 6070 // cond: 6071 // result: (MOVWconst [0]) 6072 for { 6073 v_0 := v.Args[0] 6074 if v_0.Op != OpARMFlagGT_ULT { 6075 break 6076 } 6077 v.reset(OpARMMOVWconst) 6078 v.AuxInt = 0 6079 return true 6080 } 6081 // match: (Equal (FlagGT_UGT)) 6082 // cond: 6083 // result: (MOVWconst [0]) 6084 for { 6085 v_0 := v.Args[0] 6086 if v_0.Op != OpARMFlagGT_UGT { 6087 break 6088 } 6089 v.reset(OpARMMOVWconst) 6090 v.AuxInt = 0 6091 return true 6092 } 6093 // match: (Equal (InvertFlags x)) 6094 // cond: 6095 // result: (Equal x) 6096 for { 6097 v_0 := v.Args[0] 6098 if v_0.Op != OpARMInvertFlags { 6099 break 6100 } 6101 x := v_0.Args[0] 6102 v.reset(OpARMEqual) 6103 v.AddArg(x) 6104 return true 6105 } 6106 return false 6107 } 6108 func rewriteValueARM_OpARMGreaterEqual_0(v *Value) bool { 6109 // match: (GreaterEqual (FlagEQ)) 6110 // cond: 6111 // result: (MOVWconst [1]) 6112 for { 6113 v_0 := v.Args[0] 6114 if v_0.Op != OpARMFlagEQ { 6115 break 6116 } 6117 v.reset(OpARMMOVWconst) 6118 v.AuxInt = 1 6119 return true 6120 } 6121 // match: (GreaterEqual (FlagLT_ULT)) 6122 // cond: 6123 // result: (MOVWconst [0]) 6124 for { 6125 v_0 := v.Args[0] 6126 if v_0.Op != OpARMFlagLT_ULT { 6127 break 6128 } 6129 v.reset(OpARMMOVWconst) 6130 v.AuxInt = 0 6131 return true 6132 } 6133 // match: (GreaterEqual (FlagLT_UGT)) 6134 // cond: 6135 // result: (MOVWconst [0]) 6136 for { 6137 v_0 := v.Args[0] 6138 if v_0.Op != OpARMFlagLT_UGT { 6139 break 6140 } 6141 v.reset(OpARMMOVWconst) 6142 v.AuxInt = 0 6143 return true 6144 } 6145 // match: (GreaterEqual (FlagGT_ULT)) 6146 // cond: 6147 // result: (MOVWconst [1]) 6148 for { 6149 v_0 := v.Args[0] 6150 if v_0.Op != OpARMFlagGT_ULT { 6151 break 6152 } 6153 v.reset(OpARMMOVWconst) 6154 v.AuxInt = 1 6155 return true 6156 } 6157 // match: (GreaterEqual (FlagGT_UGT)) 6158 // cond: 6159 // result: (MOVWconst [1]) 6160 for { 6161 v_0 := v.Args[0] 6162 if v_0.Op != OpARMFlagGT_UGT { 6163 break 6164 } 6165 v.reset(OpARMMOVWconst) 6166 v.AuxInt = 1 6167 return true 6168 } 6169 // match: (GreaterEqual (InvertFlags x)) 6170 // cond: 6171 // result: (LessEqual x) 6172 for { 6173 v_0 := v.Args[0] 6174 if v_0.Op != OpARMInvertFlags { 6175 break 6176 } 6177 x := v_0.Args[0] 6178 v.reset(OpARMLessEqual) 6179 v.AddArg(x) 6180 return true 6181 } 6182 return false 6183 } 6184 func rewriteValueARM_OpARMGreaterEqualU_0(v *Value) bool { 6185 // match: (GreaterEqualU (FlagEQ)) 6186 // cond: 6187 // result: (MOVWconst [1]) 6188 for { 6189 v_0 := v.Args[0] 6190 if v_0.Op != OpARMFlagEQ { 6191 break 6192 } 6193 v.reset(OpARMMOVWconst) 6194 v.AuxInt = 1 6195 return true 6196 } 6197 // match: (GreaterEqualU (FlagLT_ULT)) 6198 // cond: 6199 // result: (MOVWconst [0]) 6200 for { 6201 v_0 := v.Args[0] 6202 if v_0.Op != OpARMFlagLT_ULT { 6203 break 6204 } 6205 v.reset(OpARMMOVWconst) 6206 v.AuxInt = 0 6207 return true 6208 } 6209 // match: (GreaterEqualU (FlagLT_UGT)) 6210 // cond: 6211 // result: (MOVWconst [1]) 6212 for { 6213 v_0 := v.Args[0] 6214 if v_0.Op != OpARMFlagLT_UGT { 6215 break 6216 } 6217 v.reset(OpARMMOVWconst) 6218 v.AuxInt = 1 6219 return true 6220 } 6221 // match: (GreaterEqualU (FlagGT_ULT)) 6222 // cond: 6223 // result: (MOVWconst [0]) 6224 for { 6225 v_0 := v.Args[0] 6226 if v_0.Op != OpARMFlagGT_ULT { 6227 break 6228 } 6229 v.reset(OpARMMOVWconst) 6230 v.AuxInt = 0 6231 return true 6232 } 6233 // match: (GreaterEqualU (FlagGT_UGT)) 6234 // cond: 6235 // result: (MOVWconst [1]) 6236 for { 6237 v_0 := v.Args[0] 6238 if v_0.Op != OpARMFlagGT_UGT { 6239 break 6240 } 6241 v.reset(OpARMMOVWconst) 6242 v.AuxInt = 1 6243 return true 6244 } 6245 // match: (GreaterEqualU (InvertFlags x)) 6246 // cond: 6247 // result: (LessEqualU x) 6248 for { 6249 v_0 := v.Args[0] 6250 if v_0.Op != OpARMInvertFlags { 6251 break 6252 } 6253 x := v_0.Args[0] 6254 v.reset(OpARMLessEqualU) 6255 v.AddArg(x) 6256 return true 6257 } 6258 return false 6259 } 6260 func rewriteValueARM_OpARMGreaterThan_0(v *Value) bool { 6261 // match: (GreaterThan (FlagEQ)) 6262 // cond: 6263 // result: (MOVWconst [0]) 6264 for { 6265 v_0 := v.Args[0] 6266 if v_0.Op != OpARMFlagEQ { 6267 break 6268 } 6269 v.reset(OpARMMOVWconst) 6270 v.AuxInt = 0 6271 return true 6272 } 6273 // match: (GreaterThan (FlagLT_ULT)) 6274 // cond: 6275 // result: (MOVWconst [0]) 6276 for { 6277 v_0 := v.Args[0] 6278 if v_0.Op != OpARMFlagLT_ULT { 6279 break 6280 } 6281 v.reset(OpARMMOVWconst) 6282 v.AuxInt = 0 6283 return true 6284 } 6285 // match: (GreaterThan (FlagLT_UGT)) 6286 // cond: 6287 // result: (MOVWconst [0]) 6288 for { 6289 v_0 := v.Args[0] 6290 if v_0.Op != OpARMFlagLT_UGT { 6291 break 6292 } 6293 v.reset(OpARMMOVWconst) 6294 v.AuxInt = 0 6295 return true 6296 } 6297 // match: (GreaterThan (FlagGT_ULT)) 6298 // cond: 6299 // result: (MOVWconst [1]) 6300 for { 6301 v_0 := v.Args[0] 6302 if v_0.Op != OpARMFlagGT_ULT { 6303 break 6304 } 6305 v.reset(OpARMMOVWconst) 6306 v.AuxInt = 1 6307 return true 6308 } 6309 // match: (GreaterThan (FlagGT_UGT)) 6310 // cond: 6311 // result: (MOVWconst [1]) 6312 for { 6313 v_0 := v.Args[0] 6314 if v_0.Op != OpARMFlagGT_UGT { 6315 break 6316 } 6317 v.reset(OpARMMOVWconst) 6318 v.AuxInt = 1 6319 return true 6320 } 6321 // match: (GreaterThan (InvertFlags x)) 6322 // cond: 6323 // result: (LessThan x) 6324 for { 6325 v_0 := v.Args[0] 6326 if v_0.Op != OpARMInvertFlags { 6327 break 6328 } 6329 x := v_0.Args[0] 6330 v.reset(OpARMLessThan) 6331 v.AddArg(x) 6332 return true 6333 } 6334 return false 6335 } 6336 func rewriteValueARM_OpARMGreaterThanU_0(v *Value) bool { 6337 // match: (GreaterThanU (FlagEQ)) 6338 // cond: 6339 // result: (MOVWconst [0]) 6340 for { 6341 v_0 := v.Args[0] 6342 if v_0.Op != OpARMFlagEQ { 6343 break 6344 } 6345 v.reset(OpARMMOVWconst) 6346 v.AuxInt = 0 6347 return true 6348 } 6349 // match: (GreaterThanU (FlagLT_ULT)) 6350 // cond: 6351 // result: (MOVWconst [0]) 6352 for { 6353 v_0 := v.Args[0] 6354 if v_0.Op != OpARMFlagLT_ULT { 6355 break 6356 } 6357 v.reset(OpARMMOVWconst) 6358 v.AuxInt = 0 6359 return true 6360 } 6361 // match: (GreaterThanU (FlagLT_UGT)) 6362 // cond: 6363 // result: (MOVWconst [1]) 6364 for { 6365 v_0 := v.Args[0] 6366 if v_0.Op != OpARMFlagLT_UGT { 6367 break 6368 } 6369 v.reset(OpARMMOVWconst) 6370 v.AuxInt = 1 6371 return true 6372 } 6373 // match: (GreaterThanU (FlagGT_ULT)) 6374 // cond: 6375 // result: (MOVWconst [0]) 6376 for { 6377 v_0 := v.Args[0] 6378 if v_0.Op != OpARMFlagGT_ULT { 6379 break 6380 } 6381 v.reset(OpARMMOVWconst) 6382 v.AuxInt = 0 6383 return true 6384 } 6385 // match: (GreaterThanU (FlagGT_UGT)) 6386 // cond: 6387 // result: (MOVWconst [1]) 6388 for { 6389 v_0 := v.Args[0] 6390 if v_0.Op != OpARMFlagGT_UGT { 6391 break 6392 } 6393 v.reset(OpARMMOVWconst) 6394 v.AuxInt = 1 6395 return true 6396 } 6397 // match: (GreaterThanU (InvertFlags x)) 6398 // cond: 6399 // result: (LessThanU x) 6400 for { 6401 v_0 := v.Args[0] 6402 if v_0.Op != OpARMInvertFlags { 6403 break 6404 } 6405 x := v_0.Args[0] 6406 v.reset(OpARMLessThanU) 6407 v.AddArg(x) 6408 return true 6409 } 6410 return false 6411 } 6412 func rewriteValueARM_OpARMLessEqual_0(v *Value) bool { 6413 // match: (LessEqual (FlagEQ)) 6414 // cond: 6415 // result: (MOVWconst [1]) 6416 for { 6417 v_0 := v.Args[0] 6418 if v_0.Op != OpARMFlagEQ { 6419 break 6420 } 6421 v.reset(OpARMMOVWconst) 6422 v.AuxInt = 1 6423 return true 6424 } 6425 // match: (LessEqual (FlagLT_ULT)) 6426 // cond: 6427 // result: (MOVWconst [1]) 6428 for { 6429 v_0 := v.Args[0] 6430 if v_0.Op != OpARMFlagLT_ULT { 6431 break 6432 } 6433 v.reset(OpARMMOVWconst) 6434 v.AuxInt = 1 6435 return true 6436 } 6437 // match: (LessEqual (FlagLT_UGT)) 6438 // cond: 6439 // result: (MOVWconst [1]) 6440 for { 6441 v_0 := v.Args[0] 6442 if v_0.Op != OpARMFlagLT_UGT { 6443 break 6444 } 6445 v.reset(OpARMMOVWconst) 6446 v.AuxInt = 1 6447 return true 6448 } 6449 // match: (LessEqual (FlagGT_ULT)) 6450 // cond: 6451 // result: (MOVWconst [0]) 6452 for { 6453 v_0 := v.Args[0] 6454 if v_0.Op != OpARMFlagGT_ULT { 6455 break 6456 } 6457 v.reset(OpARMMOVWconst) 6458 v.AuxInt = 0 6459 return true 6460 } 6461 // match: (LessEqual (FlagGT_UGT)) 6462 // cond: 6463 // result: (MOVWconst [0]) 6464 for { 6465 v_0 := v.Args[0] 6466 if v_0.Op != OpARMFlagGT_UGT { 6467 break 6468 } 6469 v.reset(OpARMMOVWconst) 6470 v.AuxInt = 0 6471 return true 6472 } 6473 // match: (LessEqual (InvertFlags x)) 6474 // cond: 6475 // result: (GreaterEqual x) 6476 for { 6477 v_0 := v.Args[0] 6478 if v_0.Op != OpARMInvertFlags { 6479 break 6480 } 6481 x := v_0.Args[0] 6482 v.reset(OpARMGreaterEqual) 6483 v.AddArg(x) 6484 return true 6485 } 6486 return false 6487 } 6488 func rewriteValueARM_OpARMLessEqualU_0(v *Value) bool { 6489 // match: (LessEqualU (FlagEQ)) 6490 // cond: 6491 // result: (MOVWconst [1]) 6492 for { 6493 v_0 := v.Args[0] 6494 if v_0.Op != OpARMFlagEQ { 6495 break 6496 } 6497 v.reset(OpARMMOVWconst) 6498 v.AuxInt = 1 6499 return true 6500 } 6501 // match: (LessEqualU (FlagLT_ULT)) 6502 // cond: 6503 // result: (MOVWconst [1]) 6504 for { 6505 v_0 := v.Args[0] 6506 if v_0.Op != OpARMFlagLT_ULT { 6507 break 6508 } 6509 v.reset(OpARMMOVWconst) 6510 v.AuxInt = 1 6511 return true 6512 } 6513 // match: (LessEqualU (FlagLT_UGT)) 6514 // cond: 6515 // result: (MOVWconst [0]) 6516 for { 6517 v_0 := v.Args[0] 6518 if v_0.Op != OpARMFlagLT_UGT { 6519 break 6520 } 6521 v.reset(OpARMMOVWconst) 6522 v.AuxInt = 0 6523 return true 6524 } 6525 // match: (LessEqualU (FlagGT_ULT)) 6526 // cond: 6527 // result: (MOVWconst [1]) 6528 for { 6529 v_0 := v.Args[0] 6530 if v_0.Op != OpARMFlagGT_ULT { 6531 break 6532 } 6533 v.reset(OpARMMOVWconst) 6534 v.AuxInt = 1 6535 return true 6536 } 6537 // match: (LessEqualU (FlagGT_UGT)) 6538 // cond: 6539 // result: (MOVWconst [0]) 6540 for { 6541 v_0 := v.Args[0] 6542 if v_0.Op != OpARMFlagGT_UGT { 6543 break 6544 } 6545 v.reset(OpARMMOVWconst) 6546 v.AuxInt = 0 6547 return true 6548 } 6549 // match: (LessEqualU (InvertFlags x)) 6550 // cond: 6551 // result: (GreaterEqualU x) 6552 for { 6553 v_0 := v.Args[0] 6554 if v_0.Op != OpARMInvertFlags { 6555 break 6556 } 6557 x := v_0.Args[0] 6558 v.reset(OpARMGreaterEqualU) 6559 v.AddArg(x) 6560 return true 6561 } 6562 return false 6563 } 6564 func rewriteValueARM_OpARMLessThan_0(v *Value) bool { 6565 // match: (LessThan (FlagEQ)) 6566 // cond: 6567 // result: (MOVWconst [0]) 6568 for { 6569 v_0 := v.Args[0] 6570 if v_0.Op != OpARMFlagEQ { 6571 break 6572 } 6573 v.reset(OpARMMOVWconst) 6574 v.AuxInt = 0 6575 return true 6576 } 6577 // match: (LessThan (FlagLT_ULT)) 6578 // cond: 6579 // result: (MOVWconst [1]) 6580 for { 6581 v_0 := v.Args[0] 6582 if v_0.Op != OpARMFlagLT_ULT { 6583 break 6584 } 6585 v.reset(OpARMMOVWconst) 6586 v.AuxInt = 1 6587 return true 6588 } 6589 // match: (LessThan (FlagLT_UGT)) 6590 // cond: 6591 // result: (MOVWconst [1]) 6592 for { 6593 v_0 := v.Args[0] 6594 if v_0.Op != OpARMFlagLT_UGT { 6595 break 6596 } 6597 v.reset(OpARMMOVWconst) 6598 v.AuxInt = 1 6599 return true 6600 } 6601 // match: (LessThan (FlagGT_ULT)) 6602 // cond: 6603 // result: (MOVWconst [0]) 6604 for { 6605 v_0 := v.Args[0] 6606 if v_0.Op != OpARMFlagGT_ULT { 6607 break 6608 } 6609 v.reset(OpARMMOVWconst) 6610 v.AuxInt = 0 6611 return true 6612 } 6613 // match: (LessThan (FlagGT_UGT)) 6614 // cond: 6615 // result: (MOVWconst [0]) 6616 for { 6617 v_0 := v.Args[0] 6618 if v_0.Op != OpARMFlagGT_UGT { 6619 break 6620 } 6621 v.reset(OpARMMOVWconst) 6622 v.AuxInt = 0 6623 return true 6624 } 6625 // match: (LessThan (InvertFlags x)) 6626 // cond: 6627 // result: (GreaterThan x) 6628 for { 6629 v_0 := v.Args[0] 6630 if v_0.Op != OpARMInvertFlags { 6631 break 6632 } 6633 x := v_0.Args[0] 6634 v.reset(OpARMGreaterThan) 6635 v.AddArg(x) 6636 return true 6637 } 6638 return false 6639 } 6640 func rewriteValueARM_OpARMLessThanU_0(v *Value) bool { 6641 // match: (LessThanU (FlagEQ)) 6642 // cond: 6643 // result: (MOVWconst [0]) 6644 for { 6645 v_0 := v.Args[0] 6646 if v_0.Op != OpARMFlagEQ { 6647 break 6648 } 6649 v.reset(OpARMMOVWconst) 6650 v.AuxInt = 0 6651 return true 6652 } 6653 // match: (LessThanU (FlagLT_ULT)) 6654 // cond: 6655 // result: (MOVWconst [1]) 6656 for { 6657 v_0 := v.Args[0] 6658 if v_0.Op != OpARMFlagLT_ULT { 6659 break 6660 } 6661 v.reset(OpARMMOVWconst) 6662 v.AuxInt = 1 6663 return true 6664 } 6665 // match: (LessThanU (FlagLT_UGT)) 6666 // cond: 6667 // result: (MOVWconst [0]) 6668 for { 6669 v_0 := v.Args[0] 6670 if v_0.Op != OpARMFlagLT_UGT { 6671 break 6672 } 6673 v.reset(OpARMMOVWconst) 6674 v.AuxInt = 0 6675 return true 6676 } 6677 // match: (LessThanU (FlagGT_ULT)) 6678 // cond: 6679 // result: (MOVWconst [1]) 6680 for { 6681 v_0 := v.Args[0] 6682 if v_0.Op != OpARMFlagGT_ULT { 6683 break 6684 } 6685 v.reset(OpARMMOVWconst) 6686 v.AuxInt = 1 6687 return true 6688 } 6689 // match: (LessThanU (FlagGT_UGT)) 6690 // cond: 6691 // result: (MOVWconst [0]) 6692 for { 6693 v_0 := v.Args[0] 6694 if v_0.Op != OpARMFlagGT_UGT { 6695 break 6696 } 6697 v.reset(OpARMMOVWconst) 6698 v.AuxInt = 0 6699 return true 6700 } 6701 // match: (LessThanU (InvertFlags x)) 6702 // cond: 6703 // result: (GreaterThanU x) 6704 for { 6705 v_0 := v.Args[0] 6706 if v_0.Op != OpARMInvertFlags { 6707 break 6708 } 6709 x := v_0.Args[0] 6710 v.reset(OpARMGreaterThanU) 6711 v.AddArg(x) 6712 return true 6713 } 6714 return false 6715 } 6716 func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { 6717 b := v.Block 6718 _ = b 6719 config := b.Func.Config 6720 _ = config 6721 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 6722 // cond: 6723 // result: (MOVBUload [off1+off2] {sym} ptr mem) 6724 for { 6725 off1 := v.AuxInt 6726 sym := v.Aux 6727 _ = v.Args[1] 6728 v_0 := v.Args[0] 6729 if v_0.Op != OpARMADDconst { 6730 break 6731 } 6732 off2 := v_0.AuxInt 6733 ptr := v_0.Args[0] 6734 mem := v.Args[1] 6735 v.reset(OpARMMOVBUload) 6736 v.AuxInt = off1 + off2 6737 v.Aux = sym 6738 v.AddArg(ptr) 6739 v.AddArg(mem) 6740 return true 6741 } 6742 // match: (MOVBUload [off1] {sym} (SUBconst [off2] ptr) mem) 6743 // cond: 6744 // result: (MOVBUload [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 != OpARMSUBconst { 6751 break 6752 } 6753 off2 := v_0.AuxInt 6754 ptr := v_0.Args[0] 6755 mem := v.Args[1] 6756 v.reset(OpARMMOVBUload) 6757 v.AuxInt = off1 - off2 6758 v.Aux = sym 6759 v.AddArg(ptr) 6760 v.AddArg(mem) 6761 return true 6762 } 6763 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6764 // cond: canMergeSym(sym1,sym2) 6765 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6766 for { 6767 off1 := v.AuxInt 6768 sym1 := v.Aux 6769 _ = v.Args[1] 6770 v_0 := v.Args[0] 6771 if v_0.Op != OpARMMOVWaddr { 6772 break 6773 } 6774 off2 := v_0.AuxInt 6775 sym2 := v_0.Aux 6776 ptr := v_0.Args[0] 6777 mem := v.Args[1] 6778 if !(canMergeSym(sym1, sym2)) { 6779 break 6780 } 6781 v.reset(OpARMMOVBUload) 6782 v.AuxInt = off1 + off2 6783 v.Aux = mergeSym(sym1, sym2) 6784 v.AddArg(ptr) 6785 v.AddArg(mem) 6786 return true 6787 } 6788 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 6789 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6790 // result: (MOVBUreg x) 6791 for { 6792 off := v.AuxInt 6793 sym := v.Aux 6794 _ = v.Args[1] 6795 ptr := v.Args[0] 6796 v_1 := v.Args[1] 6797 if v_1.Op != OpARMMOVBstore { 6798 break 6799 } 6800 off2 := v_1.AuxInt 6801 sym2 := v_1.Aux 6802 _ = v_1.Args[2] 6803 ptr2 := v_1.Args[0] 6804 x := v_1.Args[1] 6805 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6806 break 6807 } 6808 v.reset(OpARMMOVBUreg) 6809 v.AddArg(x) 6810 return true 6811 } 6812 // match: (MOVBUload [0] {sym} (ADD ptr idx) mem) 6813 // cond: sym == nil && !config.nacl 6814 // result: (MOVBUloadidx ptr idx mem) 6815 for { 6816 if v.AuxInt != 0 { 6817 break 6818 } 6819 sym := v.Aux 6820 _ = v.Args[1] 6821 v_0 := v.Args[0] 6822 if v_0.Op != OpARMADD { 6823 break 6824 } 6825 _ = v_0.Args[1] 6826 ptr := v_0.Args[0] 6827 idx := v_0.Args[1] 6828 mem := v.Args[1] 6829 if !(sym == nil && !config.nacl) { 6830 break 6831 } 6832 v.reset(OpARMMOVBUloadidx) 6833 v.AddArg(ptr) 6834 v.AddArg(idx) 6835 v.AddArg(mem) 6836 return true 6837 } 6838 return false 6839 } 6840 func rewriteValueARM_OpARMMOVBUloadidx_0(v *Value) bool { 6841 // match: (MOVBUloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 6842 // cond: isSamePtr(ptr, ptr2) 6843 // result: (MOVBUreg x) 6844 for { 6845 _ = v.Args[2] 6846 ptr := v.Args[0] 6847 idx := v.Args[1] 6848 v_2 := v.Args[2] 6849 if v_2.Op != OpARMMOVBstoreidx { 6850 break 6851 } 6852 _ = v_2.Args[3] 6853 ptr2 := v_2.Args[0] 6854 if idx != v_2.Args[1] { 6855 break 6856 } 6857 x := v_2.Args[2] 6858 if !(isSamePtr(ptr, ptr2)) { 6859 break 6860 } 6861 v.reset(OpARMMOVBUreg) 6862 v.AddArg(x) 6863 return true 6864 } 6865 // match: (MOVBUloadidx ptr (MOVWconst [c]) mem) 6866 // cond: 6867 // result: (MOVBUload [c] ptr mem) 6868 for { 6869 _ = v.Args[2] 6870 ptr := v.Args[0] 6871 v_1 := v.Args[1] 6872 if v_1.Op != OpARMMOVWconst { 6873 break 6874 } 6875 c := v_1.AuxInt 6876 mem := v.Args[2] 6877 v.reset(OpARMMOVBUload) 6878 v.AuxInt = c 6879 v.AddArg(ptr) 6880 v.AddArg(mem) 6881 return true 6882 } 6883 // match: (MOVBUloadidx (MOVWconst [c]) ptr mem) 6884 // cond: 6885 // result: (MOVBUload [c] ptr mem) 6886 for { 6887 _ = v.Args[2] 6888 v_0 := v.Args[0] 6889 if v_0.Op != OpARMMOVWconst { 6890 break 6891 } 6892 c := v_0.AuxInt 6893 ptr := v.Args[1] 6894 mem := v.Args[2] 6895 v.reset(OpARMMOVBUload) 6896 v.AuxInt = c 6897 v.AddArg(ptr) 6898 v.AddArg(mem) 6899 return true 6900 } 6901 return false 6902 } 6903 func rewriteValueARM_OpARMMOVBUreg_0(v *Value) bool { 6904 // match: (MOVBUreg x:(MOVBUload _ _)) 6905 // cond: 6906 // result: (MOVWreg x) 6907 for { 6908 x := v.Args[0] 6909 if x.Op != OpARMMOVBUload { 6910 break 6911 } 6912 _ = x.Args[1] 6913 v.reset(OpARMMOVWreg) 6914 v.AddArg(x) 6915 return true 6916 } 6917 // match: (MOVBUreg (ANDconst [c] x)) 6918 // cond: 6919 // result: (ANDconst [c&0xff] x) 6920 for { 6921 v_0 := v.Args[0] 6922 if v_0.Op != OpARMANDconst { 6923 break 6924 } 6925 c := v_0.AuxInt 6926 x := v_0.Args[0] 6927 v.reset(OpARMANDconst) 6928 v.AuxInt = c & 0xff 6929 v.AddArg(x) 6930 return true 6931 } 6932 // match: (MOVBUreg x:(MOVBUreg _)) 6933 // cond: 6934 // result: (MOVWreg x) 6935 for { 6936 x := v.Args[0] 6937 if x.Op != OpARMMOVBUreg { 6938 break 6939 } 6940 v.reset(OpARMMOVWreg) 6941 v.AddArg(x) 6942 return true 6943 } 6944 // match: (MOVBUreg (MOVWconst [c])) 6945 // cond: 6946 // result: (MOVWconst [int64(uint8(c))]) 6947 for { 6948 v_0 := v.Args[0] 6949 if v_0.Op != OpARMMOVWconst { 6950 break 6951 } 6952 c := v_0.AuxInt 6953 v.reset(OpARMMOVWconst) 6954 v.AuxInt = int64(uint8(c)) 6955 return true 6956 } 6957 return false 6958 } 6959 func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { 6960 b := v.Block 6961 _ = b 6962 config := b.Func.Config 6963 _ = config 6964 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 6965 // cond: 6966 // result: (MOVBload [off1+off2] {sym} ptr mem) 6967 for { 6968 off1 := v.AuxInt 6969 sym := v.Aux 6970 _ = v.Args[1] 6971 v_0 := v.Args[0] 6972 if v_0.Op != OpARMADDconst { 6973 break 6974 } 6975 off2 := v_0.AuxInt 6976 ptr := v_0.Args[0] 6977 mem := v.Args[1] 6978 v.reset(OpARMMOVBload) 6979 v.AuxInt = off1 + off2 6980 v.Aux = sym 6981 v.AddArg(ptr) 6982 v.AddArg(mem) 6983 return true 6984 } 6985 // match: (MOVBload [off1] {sym} (SUBconst [off2] ptr) mem) 6986 // cond: 6987 // result: (MOVBload [off1-off2] {sym} ptr mem) 6988 for { 6989 off1 := v.AuxInt 6990 sym := v.Aux 6991 _ = v.Args[1] 6992 v_0 := v.Args[0] 6993 if v_0.Op != OpARMSUBconst { 6994 break 6995 } 6996 off2 := v_0.AuxInt 6997 ptr := v_0.Args[0] 6998 mem := v.Args[1] 6999 v.reset(OpARMMOVBload) 7000 v.AuxInt = off1 - off2 7001 v.Aux = sym 7002 v.AddArg(ptr) 7003 v.AddArg(mem) 7004 return true 7005 } 7006 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7007 // cond: canMergeSym(sym1,sym2) 7008 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7009 for { 7010 off1 := v.AuxInt 7011 sym1 := v.Aux 7012 _ = v.Args[1] 7013 v_0 := v.Args[0] 7014 if v_0.Op != OpARMMOVWaddr { 7015 break 7016 } 7017 off2 := v_0.AuxInt 7018 sym2 := v_0.Aux 7019 ptr := v_0.Args[0] 7020 mem := v.Args[1] 7021 if !(canMergeSym(sym1, sym2)) { 7022 break 7023 } 7024 v.reset(OpARMMOVBload) 7025 v.AuxInt = off1 + off2 7026 v.Aux = mergeSym(sym1, sym2) 7027 v.AddArg(ptr) 7028 v.AddArg(mem) 7029 return true 7030 } 7031 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 7032 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7033 // result: (MOVBreg x) 7034 for { 7035 off := v.AuxInt 7036 sym := v.Aux 7037 _ = v.Args[1] 7038 ptr := v.Args[0] 7039 v_1 := v.Args[1] 7040 if v_1.Op != OpARMMOVBstore { 7041 break 7042 } 7043 off2 := v_1.AuxInt 7044 sym2 := v_1.Aux 7045 _ = v_1.Args[2] 7046 ptr2 := v_1.Args[0] 7047 x := v_1.Args[1] 7048 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7049 break 7050 } 7051 v.reset(OpARMMOVBreg) 7052 v.AddArg(x) 7053 return true 7054 } 7055 // match: (MOVBload [0] {sym} (ADD ptr idx) mem) 7056 // cond: sym == nil && !config.nacl 7057 // result: (MOVBloadidx ptr idx mem) 7058 for { 7059 if v.AuxInt != 0 { 7060 break 7061 } 7062 sym := v.Aux 7063 _ = v.Args[1] 7064 v_0 := v.Args[0] 7065 if v_0.Op != OpARMADD { 7066 break 7067 } 7068 _ = v_0.Args[1] 7069 ptr := v_0.Args[0] 7070 idx := v_0.Args[1] 7071 mem := v.Args[1] 7072 if !(sym == nil && !config.nacl) { 7073 break 7074 } 7075 v.reset(OpARMMOVBloadidx) 7076 v.AddArg(ptr) 7077 v.AddArg(idx) 7078 v.AddArg(mem) 7079 return true 7080 } 7081 return false 7082 } 7083 func rewriteValueARM_OpARMMOVBloadidx_0(v *Value) bool { 7084 // match: (MOVBloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 7085 // cond: isSamePtr(ptr, ptr2) 7086 // result: (MOVBreg x) 7087 for { 7088 _ = v.Args[2] 7089 ptr := v.Args[0] 7090 idx := v.Args[1] 7091 v_2 := v.Args[2] 7092 if v_2.Op != OpARMMOVBstoreidx { 7093 break 7094 } 7095 _ = v_2.Args[3] 7096 ptr2 := v_2.Args[0] 7097 if idx != v_2.Args[1] { 7098 break 7099 } 7100 x := v_2.Args[2] 7101 if !(isSamePtr(ptr, ptr2)) { 7102 break 7103 } 7104 v.reset(OpARMMOVBreg) 7105 v.AddArg(x) 7106 return true 7107 } 7108 // match: (MOVBloadidx ptr (MOVWconst [c]) mem) 7109 // cond: 7110 // result: (MOVBload [c] ptr mem) 7111 for { 7112 _ = v.Args[2] 7113 ptr := v.Args[0] 7114 v_1 := v.Args[1] 7115 if v_1.Op != OpARMMOVWconst { 7116 break 7117 } 7118 c := v_1.AuxInt 7119 mem := v.Args[2] 7120 v.reset(OpARMMOVBload) 7121 v.AuxInt = c 7122 v.AddArg(ptr) 7123 v.AddArg(mem) 7124 return true 7125 } 7126 // match: (MOVBloadidx (MOVWconst [c]) ptr mem) 7127 // cond: 7128 // result: (MOVBload [c] ptr mem) 7129 for { 7130 _ = v.Args[2] 7131 v_0 := v.Args[0] 7132 if v_0.Op != OpARMMOVWconst { 7133 break 7134 } 7135 c := v_0.AuxInt 7136 ptr := v.Args[1] 7137 mem := v.Args[2] 7138 v.reset(OpARMMOVBload) 7139 v.AuxInt = c 7140 v.AddArg(ptr) 7141 v.AddArg(mem) 7142 return true 7143 } 7144 return false 7145 } 7146 func rewriteValueARM_OpARMMOVBreg_0(v *Value) bool { 7147 // match: (MOVBreg x:(MOVBload _ _)) 7148 // cond: 7149 // result: (MOVWreg x) 7150 for { 7151 x := v.Args[0] 7152 if x.Op != OpARMMOVBload { 7153 break 7154 } 7155 _ = x.Args[1] 7156 v.reset(OpARMMOVWreg) 7157 v.AddArg(x) 7158 return true 7159 } 7160 // match: (MOVBreg (ANDconst [c] x)) 7161 // cond: c & 0x80 == 0 7162 // result: (ANDconst [c&0x7f] x) 7163 for { 7164 v_0 := v.Args[0] 7165 if v_0.Op != OpARMANDconst { 7166 break 7167 } 7168 c := v_0.AuxInt 7169 x := v_0.Args[0] 7170 if !(c&0x80 == 0) { 7171 break 7172 } 7173 v.reset(OpARMANDconst) 7174 v.AuxInt = c & 0x7f 7175 v.AddArg(x) 7176 return true 7177 } 7178 // match: (MOVBreg x:(MOVBreg _)) 7179 // cond: 7180 // result: (MOVWreg x) 7181 for { 7182 x := v.Args[0] 7183 if x.Op != OpARMMOVBreg { 7184 break 7185 } 7186 v.reset(OpARMMOVWreg) 7187 v.AddArg(x) 7188 return true 7189 } 7190 // match: (MOVBreg (MOVWconst [c])) 7191 // cond: 7192 // result: (MOVWconst [int64(int8(c))]) 7193 for { 7194 v_0 := v.Args[0] 7195 if v_0.Op != OpARMMOVWconst { 7196 break 7197 } 7198 c := v_0.AuxInt 7199 v.reset(OpARMMOVWconst) 7200 v.AuxInt = int64(int8(c)) 7201 return true 7202 } 7203 return false 7204 } 7205 func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { 7206 b := v.Block 7207 _ = b 7208 config := b.Func.Config 7209 _ = config 7210 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7211 // cond: 7212 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 7213 for { 7214 off1 := v.AuxInt 7215 sym := v.Aux 7216 _ = v.Args[2] 7217 v_0 := v.Args[0] 7218 if v_0.Op != OpARMADDconst { 7219 break 7220 } 7221 off2 := v_0.AuxInt 7222 ptr := v_0.Args[0] 7223 val := v.Args[1] 7224 mem := v.Args[2] 7225 v.reset(OpARMMOVBstore) 7226 v.AuxInt = off1 + off2 7227 v.Aux = sym 7228 v.AddArg(ptr) 7229 v.AddArg(val) 7230 v.AddArg(mem) 7231 return true 7232 } 7233 // match: (MOVBstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7234 // cond: 7235 // result: (MOVBstore [off1-off2] {sym} ptr val mem) 7236 for { 7237 off1 := v.AuxInt 7238 sym := v.Aux 7239 _ = v.Args[2] 7240 v_0 := v.Args[0] 7241 if v_0.Op != OpARMSUBconst { 7242 break 7243 } 7244 off2 := v_0.AuxInt 7245 ptr := v_0.Args[0] 7246 val := v.Args[1] 7247 mem := v.Args[2] 7248 v.reset(OpARMMOVBstore) 7249 v.AuxInt = off1 - off2 7250 v.Aux = sym 7251 v.AddArg(ptr) 7252 v.AddArg(val) 7253 v.AddArg(mem) 7254 return true 7255 } 7256 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7257 // cond: canMergeSym(sym1,sym2) 7258 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7259 for { 7260 off1 := v.AuxInt 7261 sym1 := v.Aux 7262 _ = v.Args[2] 7263 v_0 := v.Args[0] 7264 if v_0.Op != OpARMMOVWaddr { 7265 break 7266 } 7267 off2 := v_0.AuxInt 7268 sym2 := v_0.Aux 7269 ptr := v_0.Args[0] 7270 val := v.Args[1] 7271 mem := v.Args[2] 7272 if !(canMergeSym(sym1, sym2)) { 7273 break 7274 } 7275 v.reset(OpARMMOVBstore) 7276 v.AuxInt = off1 + off2 7277 v.Aux = mergeSym(sym1, sym2) 7278 v.AddArg(ptr) 7279 v.AddArg(val) 7280 v.AddArg(mem) 7281 return true 7282 } 7283 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 7284 // cond: 7285 // result: (MOVBstore [off] {sym} ptr x mem) 7286 for { 7287 off := v.AuxInt 7288 sym := v.Aux 7289 _ = v.Args[2] 7290 ptr := v.Args[0] 7291 v_1 := v.Args[1] 7292 if v_1.Op != OpARMMOVBreg { 7293 break 7294 } 7295 x := v_1.Args[0] 7296 mem := v.Args[2] 7297 v.reset(OpARMMOVBstore) 7298 v.AuxInt = off 7299 v.Aux = sym 7300 v.AddArg(ptr) 7301 v.AddArg(x) 7302 v.AddArg(mem) 7303 return true 7304 } 7305 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 7306 // cond: 7307 // result: (MOVBstore [off] {sym} ptr x mem) 7308 for { 7309 off := v.AuxInt 7310 sym := v.Aux 7311 _ = v.Args[2] 7312 ptr := v.Args[0] 7313 v_1 := v.Args[1] 7314 if v_1.Op != OpARMMOVBUreg { 7315 break 7316 } 7317 x := v_1.Args[0] 7318 mem := v.Args[2] 7319 v.reset(OpARMMOVBstore) 7320 v.AuxInt = off 7321 v.Aux = sym 7322 v.AddArg(ptr) 7323 v.AddArg(x) 7324 v.AddArg(mem) 7325 return true 7326 } 7327 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 7328 // cond: 7329 // result: (MOVBstore [off] {sym} ptr x mem) 7330 for { 7331 off := v.AuxInt 7332 sym := v.Aux 7333 _ = v.Args[2] 7334 ptr := v.Args[0] 7335 v_1 := v.Args[1] 7336 if v_1.Op != OpARMMOVHreg { 7337 break 7338 } 7339 x := v_1.Args[0] 7340 mem := v.Args[2] 7341 v.reset(OpARMMOVBstore) 7342 v.AuxInt = off 7343 v.Aux = sym 7344 v.AddArg(ptr) 7345 v.AddArg(x) 7346 v.AddArg(mem) 7347 return true 7348 } 7349 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 7350 // cond: 7351 // result: (MOVBstore [off] {sym} ptr x mem) 7352 for { 7353 off := v.AuxInt 7354 sym := v.Aux 7355 _ = v.Args[2] 7356 ptr := v.Args[0] 7357 v_1 := v.Args[1] 7358 if v_1.Op != OpARMMOVHUreg { 7359 break 7360 } 7361 x := v_1.Args[0] 7362 mem := v.Args[2] 7363 v.reset(OpARMMOVBstore) 7364 v.AuxInt = off 7365 v.Aux = sym 7366 v.AddArg(ptr) 7367 v.AddArg(x) 7368 v.AddArg(mem) 7369 return true 7370 } 7371 // match: (MOVBstore [0] {sym} (ADD ptr idx) val mem) 7372 // cond: sym == nil && !config.nacl 7373 // result: (MOVBstoreidx ptr idx val mem) 7374 for { 7375 if v.AuxInt != 0 { 7376 break 7377 } 7378 sym := v.Aux 7379 _ = v.Args[2] 7380 v_0 := v.Args[0] 7381 if v_0.Op != OpARMADD { 7382 break 7383 } 7384 _ = v_0.Args[1] 7385 ptr := v_0.Args[0] 7386 idx := v_0.Args[1] 7387 val := v.Args[1] 7388 mem := v.Args[2] 7389 if !(sym == nil && !config.nacl) { 7390 break 7391 } 7392 v.reset(OpARMMOVBstoreidx) 7393 v.AddArg(ptr) 7394 v.AddArg(idx) 7395 v.AddArg(val) 7396 v.AddArg(mem) 7397 return true 7398 } 7399 return false 7400 } 7401 func rewriteValueARM_OpARMMOVBstoreidx_0(v *Value) bool { 7402 // match: (MOVBstoreidx ptr (MOVWconst [c]) val mem) 7403 // cond: 7404 // result: (MOVBstore [c] ptr val mem) 7405 for { 7406 _ = v.Args[3] 7407 ptr := v.Args[0] 7408 v_1 := v.Args[1] 7409 if v_1.Op != OpARMMOVWconst { 7410 break 7411 } 7412 c := v_1.AuxInt 7413 val := v.Args[2] 7414 mem := v.Args[3] 7415 v.reset(OpARMMOVBstore) 7416 v.AuxInt = c 7417 v.AddArg(ptr) 7418 v.AddArg(val) 7419 v.AddArg(mem) 7420 return true 7421 } 7422 // match: (MOVBstoreidx (MOVWconst [c]) ptr val mem) 7423 // cond: 7424 // result: (MOVBstore [c] ptr val mem) 7425 for { 7426 _ = v.Args[3] 7427 v_0 := v.Args[0] 7428 if v_0.Op != OpARMMOVWconst { 7429 break 7430 } 7431 c := v_0.AuxInt 7432 ptr := v.Args[1] 7433 val := v.Args[2] 7434 mem := v.Args[3] 7435 v.reset(OpARMMOVBstore) 7436 v.AuxInt = c 7437 v.AddArg(ptr) 7438 v.AddArg(val) 7439 v.AddArg(mem) 7440 return true 7441 } 7442 return false 7443 } 7444 func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { 7445 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 7446 // cond: 7447 // result: (MOVDload [off1+off2] {sym} ptr mem) 7448 for { 7449 off1 := v.AuxInt 7450 sym := v.Aux 7451 _ = v.Args[1] 7452 v_0 := v.Args[0] 7453 if v_0.Op != OpARMADDconst { 7454 break 7455 } 7456 off2 := v_0.AuxInt 7457 ptr := v_0.Args[0] 7458 mem := v.Args[1] 7459 v.reset(OpARMMOVDload) 7460 v.AuxInt = off1 + off2 7461 v.Aux = sym 7462 v.AddArg(ptr) 7463 v.AddArg(mem) 7464 return true 7465 } 7466 // match: (MOVDload [off1] {sym} (SUBconst [off2] ptr) mem) 7467 // cond: 7468 // result: (MOVDload [off1-off2] {sym} ptr mem) 7469 for { 7470 off1 := v.AuxInt 7471 sym := v.Aux 7472 _ = v.Args[1] 7473 v_0 := v.Args[0] 7474 if v_0.Op != OpARMSUBconst { 7475 break 7476 } 7477 off2 := v_0.AuxInt 7478 ptr := v_0.Args[0] 7479 mem := v.Args[1] 7480 v.reset(OpARMMOVDload) 7481 v.AuxInt = off1 - off2 7482 v.Aux = sym 7483 v.AddArg(ptr) 7484 v.AddArg(mem) 7485 return true 7486 } 7487 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7488 // cond: canMergeSym(sym1,sym2) 7489 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7490 for { 7491 off1 := v.AuxInt 7492 sym1 := v.Aux 7493 _ = v.Args[1] 7494 v_0 := v.Args[0] 7495 if v_0.Op != OpARMMOVWaddr { 7496 break 7497 } 7498 off2 := v_0.AuxInt 7499 sym2 := v_0.Aux 7500 ptr := v_0.Args[0] 7501 mem := v.Args[1] 7502 if !(canMergeSym(sym1, sym2)) { 7503 break 7504 } 7505 v.reset(OpARMMOVDload) 7506 v.AuxInt = off1 + off2 7507 v.Aux = mergeSym(sym1, sym2) 7508 v.AddArg(ptr) 7509 v.AddArg(mem) 7510 return true 7511 } 7512 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 7513 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7514 // result: x 7515 for { 7516 off := v.AuxInt 7517 sym := v.Aux 7518 _ = v.Args[1] 7519 ptr := v.Args[0] 7520 v_1 := v.Args[1] 7521 if v_1.Op != OpARMMOVDstore { 7522 break 7523 } 7524 off2 := v_1.AuxInt 7525 sym2 := v_1.Aux 7526 _ = v_1.Args[2] 7527 ptr2 := v_1.Args[0] 7528 x := v_1.Args[1] 7529 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7530 break 7531 } 7532 v.reset(OpCopy) 7533 v.Type = x.Type 7534 v.AddArg(x) 7535 return true 7536 } 7537 return false 7538 } 7539 func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { 7540 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7541 // cond: 7542 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 7543 for { 7544 off1 := v.AuxInt 7545 sym := v.Aux 7546 _ = v.Args[2] 7547 v_0 := v.Args[0] 7548 if v_0.Op != OpARMADDconst { 7549 break 7550 } 7551 off2 := v_0.AuxInt 7552 ptr := v_0.Args[0] 7553 val := v.Args[1] 7554 mem := v.Args[2] 7555 v.reset(OpARMMOVDstore) 7556 v.AuxInt = off1 + off2 7557 v.Aux = sym 7558 v.AddArg(ptr) 7559 v.AddArg(val) 7560 v.AddArg(mem) 7561 return true 7562 } 7563 // match: (MOVDstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7564 // cond: 7565 // result: (MOVDstore [off1-off2] {sym} ptr val mem) 7566 for { 7567 off1 := v.AuxInt 7568 sym := v.Aux 7569 _ = v.Args[2] 7570 v_0 := v.Args[0] 7571 if v_0.Op != OpARMSUBconst { 7572 break 7573 } 7574 off2 := v_0.AuxInt 7575 ptr := v_0.Args[0] 7576 val := v.Args[1] 7577 mem := v.Args[2] 7578 v.reset(OpARMMOVDstore) 7579 v.AuxInt = off1 - off2 7580 v.Aux = sym 7581 v.AddArg(ptr) 7582 v.AddArg(val) 7583 v.AddArg(mem) 7584 return true 7585 } 7586 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7587 // cond: canMergeSym(sym1,sym2) 7588 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7589 for { 7590 off1 := v.AuxInt 7591 sym1 := v.Aux 7592 _ = v.Args[2] 7593 v_0 := v.Args[0] 7594 if v_0.Op != OpARMMOVWaddr { 7595 break 7596 } 7597 off2 := v_0.AuxInt 7598 sym2 := v_0.Aux 7599 ptr := v_0.Args[0] 7600 val := v.Args[1] 7601 mem := v.Args[2] 7602 if !(canMergeSym(sym1, sym2)) { 7603 break 7604 } 7605 v.reset(OpARMMOVDstore) 7606 v.AuxInt = off1 + off2 7607 v.Aux = mergeSym(sym1, sym2) 7608 v.AddArg(ptr) 7609 v.AddArg(val) 7610 v.AddArg(mem) 7611 return true 7612 } 7613 return false 7614 } 7615 func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { 7616 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 7617 // cond: 7618 // result: (MOVFload [off1+off2] {sym} ptr mem) 7619 for { 7620 off1 := v.AuxInt 7621 sym := v.Aux 7622 _ = v.Args[1] 7623 v_0 := v.Args[0] 7624 if v_0.Op != OpARMADDconst { 7625 break 7626 } 7627 off2 := v_0.AuxInt 7628 ptr := v_0.Args[0] 7629 mem := v.Args[1] 7630 v.reset(OpARMMOVFload) 7631 v.AuxInt = off1 + off2 7632 v.Aux = sym 7633 v.AddArg(ptr) 7634 v.AddArg(mem) 7635 return true 7636 } 7637 // match: (MOVFload [off1] {sym} (SUBconst [off2] ptr) mem) 7638 // cond: 7639 // result: (MOVFload [off1-off2] {sym} ptr mem) 7640 for { 7641 off1 := v.AuxInt 7642 sym := v.Aux 7643 _ = v.Args[1] 7644 v_0 := v.Args[0] 7645 if v_0.Op != OpARMSUBconst { 7646 break 7647 } 7648 off2 := v_0.AuxInt 7649 ptr := v_0.Args[0] 7650 mem := v.Args[1] 7651 v.reset(OpARMMOVFload) 7652 v.AuxInt = off1 - off2 7653 v.Aux = sym 7654 v.AddArg(ptr) 7655 v.AddArg(mem) 7656 return true 7657 } 7658 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7659 // cond: canMergeSym(sym1,sym2) 7660 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7661 for { 7662 off1 := v.AuxInt 7663 sym1 := v.Aux 7664 _ = v.Args[1] 7665 v_0 := v.Args[0] 7666 if v_0.Op != OpARMMOVWaddr { 7667 break 7668 } 7669 off2 := v_0.AuxInt 7670 sym2 := v_0.Aux 7671 ptr := v_0.Args[0] 7672 mem := v.Args[1] 7673 if !(canMergeSym(sym1, sym2)) { 7674 break 7675 } 7676 v.reset(OpARMMOVFload) 7677 v.AuxInt = off1 + off2 7678 v.Aux = mergeSym(sym1, sym2) 7679 v.AddArg(ptr) 7680 v.AddArg(mem) 7681 return true 7682 } 7683 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 7684 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7685 // result: x 7686 for { 7687 off := v.AuxInt 7688 sym := v.Aux 7689 _ = v.Args[1] 7690 ptr := v.Args[0] 7691 v_1 := v.Args[1] 7692 if v_1.Op != OpARMMOVFstore { 7693 break 7694 } 7695 off2 := v_1.AuxInt 7696 sym2 := v_1.Aux 7697 _ = v_1.Args[2] 7698 ptr2 := v_1.Args[0] 7699 x := v_1.Args[1] 7700 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7701 break 7702 } 7703 v.reset(OpCopy) 7704 v.Type = x.Type 7705 v.AddArg(x) 7706 return true 7707 } 7708 return false 7709 } 7710 func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { 7711 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7712 // cond: 7713 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 7714 for { 7715 off1 := v.AuxInt 7716 sym := v.Aux 7717 _ = v.Args[2] 7718 v_0 := v.Args[0] 7719 if v_0.Op != OpARMADDconst { 7720 break 7721 } 7722 off2 := v_0.AuxInt 7723 ptr := v_0.Args[0] 7724 val := v.Args[1] 7725 mem := v.Args[2] 7726 v.reset(OpARMMOVFstore) 7727 v.AuxInt = off1 + off2 7728 v.Aux = sym 7729 v.AddArg(ptr) 7730 v.AddArg(val) 7731 v.AddArg(mem) 7732 return true 7733 } 7734 // match: (MOVFstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7735 // cond: 7736 // result: (MOVFstore [off1-off2] {sym} ptr val mem) 7737 for { 7738 off1 := v.AuxInt 7739 sym := v.Aux 7740 _ = v.Args[2] 7741 v_0 := v.Args[0] 7742 if v_0.Op != OpARMSUBconst { 7743 break 7744 } 7745 off2 := v_0.AuxInt 7746 ptr := v_0.Args[0] 7747 val := v.Args[1] 7748 mem := v.Args[2] 7749 v.reset(OpARMMOVFstore) 7750 v.AuxInt = off1 - off2 7751 v.Aux = sym 7752 v.AddArg(ptr) 7753 v.AddArg(val) 7754 v.AddArg(mem) 7755 return true 7756 } 7757 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7758 // cond: canMergeSym(sym1,sym2) 7759 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7760 for { 7761 off1 := v.AuxInt 7762 sym1 := v.Aux 7763 _ = v.Args[2] 7764 v_0 := v.Args[0] 7765 if v_0.Op != OpARMMOVWaddr { 7766 break 7767 } 7768 off2 := v_0.AuxInt 7769 sym2 := v_0.Aux 7770 ptr := v_0.Args[0] 7771 val := v.Args[1] 7772 mem := v.Args[2] 7773 if !(canMergeSym(sym1, sym2)) { 7774 break 7775 } 7776 v.reset(OpARMMOVFstore) 7777 v.AuxInt = off1 + off2 7778 v.Aux = mergeSym(sym1, sym2) 7779 v.AddArg(ptr) 7780 v.AddArg(val) 7781 v.AddArg(mem) 7782 return true 7783 } 7784 return false 7785 } 7786 func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { 7787 b := v.Block 7788 _ = b 7789 config := b.Func.Config 7790 _ = config 7791 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 7792 // cond: 7793 // result: (MOVHUload [off1+off2] {sym} ptr mem) 7794 for { 7795 off1 := v.AuxInt 7796 sym := v.Aux 7797 _ = v.Args[1] 7798 v_0 := v.Args[0] 7799 if v_0.Op != OpARMADDconst { 7800 break 7801 } 7802 off2 := v_0.AuxInt 7803 ptr := v_0.Args[0] 7804 mem := v.Args[1] 7805 v.reset(OpARMMOVHUload) 7806 v.AuxInt = off1 + off2 7807 v.Aux = sym 7808 v.AddArg(ptr) 7809 v.AddArg(mem) 7810 return true 7811 } 7812 // match: (MOVHUload [off1] {sym} (SUBconst [off2] ptr) mem) 7813 // cond: 7814 // result: (MOVHUload [off1-off2] {sym} ptr mem) 7815 for { 7816 off1 := v.AuxInt 7817 sym := v.Aux 7818 _ = v.Args[1] 7819 v_0 := v.Args[0] 7820 if v_0.Op != OpARMSUBconst { 7821 break 7822 } 7823 off2 := v_0.AuxInt 7824 ptr := v_0.Args[0] 7825 mem := v.Args[1] 7826 v.reset(OpARMMOVHUload) 7827 v.AuxInt = off1 - off2 7828 v.Aux = sym 7829 v.AddArg(ptr) 7830 v.AddArg(mem) 7831 return true 7832 } 7833 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7834 // cond: canMergeSym(sym1,sym2) 7835 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7836 for { 7837 off1 := v.AuxInt 7838 sym1 := v.Aux 7839 _ = v.Args[1] 7840 v_0 := v.Args[0] 7841 if v_0.Op != OpARMMOVWaddr { 7842 break 7843 } 7844 off2 := v_0.AuxInt 7845 sym2 := v_0.Aux 7846 ptr := v_0.Args[0] 7847 mem := v.Args[1] 7848 if !(canMergeSym(sym1, sym2)) { 7849 break 7850 } 7851 v.reset(OpARMMOVHUload) 7852 v.AuxInt = off1 + off2 7853 v.Aux = mergeSym(sym1, sym2) 7854 v.AddArg(ptr) 7855 v.AddArg(mem) 7856 return true 7857 } 7858 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 7859 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7860 // result: (MOVHUreg x) 7861 for { 7862 off := v.AuxInt 7863 sym := v.Aux 7864 _ = v.Args[1] 7865 ptr := v.Args[0] 7866 v_1 := v.Args[1] 7867 if v_1.Op != OpARMMOVHstore { 7868 break 7869 } 7870 off2 := v_1.AuxInt 7871 sym2 := v_1.Aux 7872 _ = v_1.Args[2] 7873 ptr2 := v_1.Args[0] 7874 x := v_1.Args[1] 7875 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7876 break 7877 } 7878 v.reset(OpARMMOVHUreg) 7879 v.AddArg(x) 7880 return true 7881 } 7882 // match: (MOVHUload [0] {sym} (ADD ptr idx) mem) 7883 // cond: sym == nil && !config.nacl 7884 // result: (MOVHUloadidx ptr idx mem) 7885 for { 7886 if v.AuxInt != 0 { 7887 break 7888 } 7889 sym := v.Aux 7890 _ = v.Args[1] 7891 v_0 := v.Args[0] 7892 if v_0.Op != OpARMADD { 7893 break 7894 } 7895 _ = v_0.Args[1] 7896 ptr := v_0.Args[0] 7897 idx := v_0.Args[1] 7898 mem := v.Args[1] 7899 if !(sym == nil && !config.nacl) { 7900 break 7901 } 7902 v.reset(OpARMMOVHUloadidx) 7903 v.AddArg(ptr) 7904 v.AddArg(idx) 7905 v.AddArg(mem) 7906 return true 7907 } 7908 return false 7909 } 7910 func rewriteValueARM_OpARMMOVHUloadidx_0(v *Value) bool { 7911 // match: (MOVHUloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 7912 // cond: isSamePtr(ptr, ptr2) 7913 // result: (MOVHUreg x) 7914 for { 7915 _ = v.Args[2] 7916 ptr := v.Args[0] 7917 idx := v.Args[1] 7918 v_2 := v.Args[2] 7919 if v_2.Op != OpARMMOVHstoreidx { 7920 break 7921 } 7922 _ = v_2.Args[3] 7923 ptr2 := v_2.Args[0] 7924 if idx != v_2.Args[1] { 7925 break 7926 } 7927 x := v_2.Args[2] 7928 if !(isSamePtr(ptr, ptr2)) { 7929 break 7930 } 7931 v.reset(OpARMMOVHUreg) 7932 v.AddArg(x) 7933 return true 7934 } 7935 // match: (MOVHUloadidx ptr (MOVWconst [c]) mem) 7936 // cond: 7937 // result: (MOVHUload [c] ptr mem) 7938 for { 7939 _ = v.Args[2] 7940 ptr := v.Args[0] 7941 v_1 := v.Args[1] 7942 if v_1.Op != OpARMMOVWconst { 7943 break 7944 } 7945 c := v_1.AuxInt 7946 mem := v.Args[2] 7947 v.reset(OpARMMOVHUload) 7948 v.AuxInt = c 7949 v.AddArg(ptr) 7950 v.AddArg(mem) 7951 return true 7952 } 7953 // match: (MOVHUloadidx (MOVWconst [c]) ptr mem) 7954 // cond: 7955 // result: (MOVHUload [c] ptr mem) 7956 for { 7957 _ = v.Args[2] 7958 v_0 := v.Args[0] 7959 if v_0.Op != OpARMMOVWconst { 7960 break 7961 } 7962 c := v_0.AuxInt 7963 ptr := v.Args[1] 7964 mem := v.Args[2] 7965 v.reset(OpARMMOVHUload) 7966 v.AuxInt = c 7967 v.AddArg(ptr) 7968 v.AddArg(mem) 7969 return true 7970 } 7971 return false 7972 } 7973 func rewriteValueARM_OpARMMOVHUreg_0(v *Value) bool { 7974 // match: (MOVHUreg x:(MOVBUload _ _)) 7975 // cond: 7976 // result: (MOVWreg x) 7977 for { 7978 x := v.Args[0] 7979 if x.Op != OpARMMOVBUload { 7980 break 7981 } 7982 _ = x.Args[1] 7983 v.reset(OpARMMOVWreg) 7984 v.AddArg(x) 7985 return true 7986 } 7987 // match: (MOVHUreg x:(MOVHUload _ _)) 7988 // cond: 7989 // result: (MOVWreg x) 7990 for { 7991 x := v.Args[0] 7992 if x.Op != OpARMMOVHUload { 7993 break 7994 } 7995 _ = x.Args[1] 7996 v.reset(OpARMMOVWreg) 7997 v.AddArg(x) 7998 return true 7999 } 8000 // match: (MOVHUreg (ANDconst [c] x)) 8001 // cond: 8002 // result: (ANDconst [c&0xffff] x) 8003 for { 8004 v_0 := v.Args[0] 8005 if v_0.Op != OpARMANDconst { 8006 break 8007 } 8008 c := v_0.AuxInt 8009 x := v_0.Args[0] 8010 v.reset(OpARMANDconst) 8011 v.AuxInt = c & 0xffff 8012 v.AddArg(x) 8013 return true 8014 } 8015 // match: (MOVHUreg x:(MOVBUreg _)) 8016 // cond: 8017 // result: (MOVWreg x) 8018 for { 8019 x := v.Args[0] 8020 if x.Op != OpARMMOVBUreg { 8021 break 8022 } 8023 v.reset(OpARMMOVWreg) 8024 v.AddArg(x) 8025 return true 8026 } 8027 // match: (MOVHUreg x:(MOVHUreg _)) 8028 // cond: 8029 // result: (MOVWreg x) 8030 for { 8031 x := v.Args[0] 8032 if x.Op != OpARMMOVHUreg { 8033 break 8034 } 8035 v.reset(OpARMMOVWreg) 8036 v.AddArg(x) 8037 return true 8038 } 8039 // match: (MOVHUreg (MOVWconst [c])) 8040 // cond: 8041 // result: (MOVWconst [int64(uint16(c))]) 8042 for { 8043 v_0 := v.Args[0] 8044 if v_0.Op != OpARMMOVWconst { 8045 break 8046 } 8047 c := v_0.AuxInt 8048 v.reset(OpARMMOVWconst) 8049 v.AuxInt = int64(uint16(c)) 8050 return true 8051 } 8052 return false 8053 } 8054 func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { 8055 b := v.Block 8056 _ = b 8057 config := b.Func.Config 8058 _ = config 8059 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 8060 // cond: 8061 // result: (MOVHload [off1+off2] {sym} ptr mem) 8062 for { 8063 off1 := v.AuxInt 8064 sym := v.Aux 8065 _ = v.Args[1] 8066 v_0 := v.Args[0] 8067 if v_0.Op != OpARMADDconst { 8068 break 8069 } 8070 off2 := v_0.AuxInt 8071 ptr := v_0.Args[0] 8072 mem := v.Args[1] 8073 v.reset(OpARMMOVHload) 8074 v.AuxInt = off1 + off2 8075 v.Aux = sym 8076 v.AddArg(ptr) 8077 v.AddArg(mem) 8078 return true 8079 } 8080 // match: (MOVHload [off1] {sym} (SUBconst [off2] ptr) mem) 8081 // cond: 8082 // result: (MOVHload [off1-off2] {sym} ptr mem) 8083 for { 8084 off1 := v.AuxInt 8085 sym := v.Aux 8086 _ = v.Args[1] 8087 v_0 := v.Args[0] 8088 if v_0.Op != OpARMSUBconst { 8089 break 8090 } 8091 off2 := v_0.AuxInt 8092 ptr := v_0.Args[0] 8093 mem := v.Args[1] 8094 v.reset(OpARMMOVHload) 8095 v.AuxInt = off1 - off2 8096 v.Aux = sym 8097 v.AddArg(ptr) 8098 v.AddArg(mem) 8099 return true 8100 } 8101 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 8102 // cond: canMergeSym(sym1,sym2) 8103 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 8104 for { 8105 off1 := v.AuxInt 8106 sym1 := v.Aux 8107 _ = v.Args[1] 8108 v_0 := v.Args[0] 8109 if v_0.Op != OpARMMOVWaddr { 8110 break 8111 } 8112 off2 := v_0.AuxInt 8113 sym2 := v_0.Aux 8114 ptr := v_0.Args[0] 8115 mem := v.Args[1] 8116 if !(canMergeSym(sym1, sym2)) { 8117 break 8118 } 8119 v.reset(OpARMMOVHload) 8120 v.AuxInt = off1 + off2 8121 v.Aux = mergeSym(sym1, sym2) 8122 v.AddArg(ptr) 8123 v.AddArg(mem) 8124 return true 8125 } 8126 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 8127 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8128 // result: (MOVHreg x) 8129 for { 8130 off := v.AuxInt 8131 sym := v.Aux 8132 _ = v.Args[1] 8133 ptr := v.Args[0] 8134 v_1 := v.Args[1] 8135 if v_1.Op != OpARMMOVHstore { 8136 break 8137 } 8138 off2 := v_1.AuxInt 8139 sym2 := v_1.Aux 8140 _ = v_1.Args[2] 8141 ptr2 := v_1.Args[0] 8142 x := v_1.Args[1] 8143 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8144 break 8145 } 8146 v.reset(OpARMMOVHreg) 8147 v.AddArg(x) 8148 return true 8149 } 8150 // match: (MOVHload [0] {sym} (ADD ptr idx) mem) 8151 // cond: sym == nil && !config.nacl 8152 // result: (MOVHloadidx ptr idx mem) 8153 for { 8154 if v.AuxInt != 0 { 8155 break 8156 } 8157 sym := v.Aux 8158 _ = v.Args[1] 8159 v_0 := v.Args[0] 8160 if v_0.Op != OpARMADD { 8161 break 8162 } 8163 _ = v_0.Args[1] 8164 ptr := v_0.Args[0] 8165 idx := v_0.Args[1] 8166 mem := v.Args[1] 8167 if !(sym == nil && !config.nacl) { 8168 break 8169 } 8170 v.reset(OpARMMOVHloadidx) 8171 v.AddArg(ptr) 8172 v.AddArg(idx) 8173 v.AddArg(mem) 8174 return true 8175 } 8176 return false 8177 } 8178 func rewriteValueARM_OpARMMOVHloadidx_0(v *Value) bool { 8179 // match: (MOVHloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 8180 // cond: isSamePtr(ptr, ptr2) 8181 // result: (MOVHreg x) 8182 for { 8183 _ = v.Args[2] 8184 ptr := v.Args[0] 8185 idx := v.Args[1] 8186 v_2 := v.Args[2] 8187 if v_2.Op != OpARMMOVHstoreidx { 8188 break 8189 } 8190 _ = v_2.Args[3] 8191 ptr2 := v_2.Args[0] 8192 if idx != v_2.Args[1] { 8193 break 8194 } 8195 x := v_2.Args[2] 8196 if !(isSamePtr(ptr, ptr2)) { 8197 break 8198 } 8199 v.reset(OpARMMOVHreg) 8200 v.AddArg(x) 8201 return true 8202 } 8203 // match: (MOVHloadidx ptr (MOVWconst [c]) mem) 8204 // cond: 8205 // result: (MOVHload [c] ptr mem) 8206 for { 8207 _ = v.Args[2] 8208 ptr := v.Args[0] 8209 v_1 := v.Args[1] 8210 if v_1.Op != OpARMMOVWconst { 8211 break 8212 } 8213 c := v_1.AuxInt 8214 mem := v.Args[2] 8215 v.reset(OpARMMOVHload) 8216 v.AuxInt = c 8217 v.AddArg(ptr) 8218 v.AddArg(mem) 8219 return true 8220 } 8221 // match: (MOVHloadidx (MOVWconst [c]) ptr mem) 8222 // cond: 8223 // result: (MOVHload [c] ptr mem) 8224 for { 8225 _ = v.Args[2] 8226 v_0 := v.Args[0] 8227 if v_0.Op != OpARMMOVWconst { 8228 break 8229 } 8230 c := v_0.AuxInt 8231 ptr := v.Args[1] 8232 mem := v.Args[2] 8233 v.reset(OpARMMOVHload) 8234 v.AuxInt = c 8235 v.AddArg(ptr) 8236 v.AddArg(mem) 8237 return true 8238 } 8239 return false 8240 } 8241 func rewriteValueARM_OpARMMOVHreg_0(v *Value) bool { 8242 // match: (MOVHreg x:(MOVBload _ _)) 8243 // cond: 8244 // result: (MOVWreg x) 8245 for { 8246 x := v.Args[0] 8247 if x.Op != OpARMMOVBload { 8248 break 8249 } 8250 _ = x.Args[1] 8251 v.reset(OpARMMOVWreg) 8252 v.AddArg(x) 8253 return true 8254 } 8255 // match: (MOVHreg x:(MOVBUload _ _)) 8256 // cond: 8257 // result: (MOVWreg x) 8258 for { 8259 x := v.Args[0] 8260 if x.Op != OpARMMOVBUload { 8261 break 8262 } 8263 _ = x.Args[1] 8264 v.reset(OpARMMOVWreg) 8265 v.AddArg(x) 8266 return true 8267 } 8268 // match: (MOVHreg x:(MOVHload _ _)) 8269 // cond: 8270 // result: (MOVWreg x) 8271 for { 8272 x := v.Args[0] 8273 if x.Op != OpARMMOVHload { 8274 break 8275 } 8276 _ = x.Args[1] 8277 v.reset(OpARMMOVWreg) 8278 v.AddArg(x) 8279 return true 8280 } 8281 // match: (MOVHreg (ANDconst [c] x)) 8282 // cond: c & 0x8000 == 0 8283 // result: (ANDconst [c&0x7fff] x) 8284 for { 8285 v_0 := v.Args[0] 8286 if v_0.Op != OpARMANDconst { 8287 break 8288 } 8289 c := v_0.AuxInt 8290 x := v_0.Args[0] 8291 if !(c&0x8000 == 0) { 8292 break 8293 } 8294 v.reset(OpARMANDconst) 8295 v.AuxInt = c & 0x7fff 8296 v.AddArg(x) 8297 return true 8298 } 8299 // match: (MOVHreg x:(MOVBreg _)) 8300 // cond: 8301 // result: (MOVWreg x) 8302 for { 8303 x := v.Args[0] 8304 if x.Op != OpARMMOVBreg { 8305 break 8306 } 8307 v.reset(OpARMMOVWreg) 8308 v.AddArg(x) 8309 return true 8310 } 8311 // match: (MOVHreg x:(MOVBUreg _)) 8312 // cond: 8313 // result: (MOVWreg x) 8314 for { 8315 x := v.Args[0] 8316 if x.Op != OpARMMOVBUreg { 8317 break 8318 } 8319 v.reset(OpARMMOVWreg) 8320 v.AddArg(x) 8321 return true 8322 } 8323 // match: (MOVHreg x:(MOVHreg _)) 8324 // cond: 8325 // result: (MOVWreg x) 8326 for { 8327 x := v.Args[0] 8328 if x.Op != OpARMMOVHreg { 8329 break 8330 } 8331 v.reset(OpARMMOVWreg) 8332 v.AddArg(x) 8333 return true 8334 } 8335 // match: (MOVHreg (MOVWconst [c])) 8336 // cond: 8337 // result: (MOVWconst [int64(int16(c))]) 8338 for { 8339 v_0 := v.Args[0] 8340 if v_0.Op != OpARMMOVWconst { 8341 break 8342 } 8343 c := v_0.AuxInt 8344 v.reset(OpARMMOVWconst) 8345 v.AuxInt = int64(int16(c)) 8346 return true 8347 } 8348 return false 8349 } 8350 func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { 8351 b := v.Block 8352 _ = b 8353 config := b.Func.Config 8354 _ = config 8355 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8356 // cond: 8357 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 8358 for { 8359 off1 := v.AuxInt 8360 sym := v.Aux 8361 _ = v.Args[2] 8362 v_0 := v.Args[0] 8363 if v_0.Op != OpARMADDconst { 8364 break 8365 } 8366 off2 := v_0.AuxInt 8367 ptr := v_0.Args[0] 8368 val := v.Args[1] 8369 mem := v.Args[2] 8370 v.reset(OpARMMOVHstore) 8371 v.AuxInt = off1 + off2 8372 v.Aux = sym 8373 v.AddArg(ptr) 8374 v.AddArg(val) 8375 v.AddArg(mem) 8376 return true 8377 } 8378 // match: (MOVHstore [off1] {sym} (SUBconst [off2] ptr) val mem) 8379 // cond: 8380 // result: (MOVHstore [off1-off2] {sym} ptr val mem) 8381 for { 8382 off1 := v.AuxInt 8383 sym := v.Aux 8384 _ = v.Args[2] 8385 v_0 := v.Args[0] 8386 if v_0.Op != OpARMSUBconst { 8387 break 8388 } 8389 off2 := v_0.AuxInt 8390 ptr := v_0.Args[0] 8391 val := v.Args[1] 8392 mem := v.Args[2] 8393 v.reset(OpARMMOVHstore) 8394 v.AuxInt = off1 - off2 8395 v.Aux = sym 8396 v.AddArg(ptr) 8397 v.AddArg(val) 8398 v.AddArg(mem) 8399 return true 8400 } 8401 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 8402 // cond: canMergeSym(sym1,sym2) 8403 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 8404 for { 8405 off1 := v.AuxInt 8406 sym1 := v.Aux 8407 _ = v.Args[2] 8408 v_0 := v.Args[0] 8409 if v_0.Op != OpARMMOVWaddr { 8410 break 8411 } 8412 off2 := v_0.AuxInt 8413 sym2 := v_0.Aux 8414 ptr := v_0.Args[0] 8415 val := v.Args[1] 8416 mem := v.Args[2] 8417 if !(canMergeSym(sym1, sym2)) { 8418 break 8419 } 8420 v.reset(OpARMMOVHstore) 8421 v.AuxInt = off1 + off2 8422 v.Aux = mergeSym(sym1, sym2) 8423 v.AddArg(ptr) 8424 v.AddArg(val) 8425 v.AddArg(mem) 8426 return true 8427 } 8428 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 8429 // cond: 8430 // result: (MOVHstore [off] {sym} ptr x mem) 8431 for { 8432 off := v.AuxInt 8433 sym := v.Aux 8434 _ = v.Args[2] 8435 ptr := v.Args[0] 8436 v_1 := v.Args[1] 8437 if v_1.Op != OpARMMOVHreg { 8438 break 8439 } 8440 x := v_1.Args[0] 8441 mem := v.Args[2] 8442 v.reset(OpARMMOVHstore) 8443 v.AuxInt = off 8444 v.Aux = sym 8445 v.AddArg(ptr) 8446 v.AddArg(x) 8447 v.AddArg(mem) 8448 return true 8449 } 8450 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 8451 // cond: 8452 // result: (MOVHstore [off] {sym} ptr x mem) 8453 for { 8454 off := v.AuxInt 8455 sym := v.Aux 8456 _ = v.Args[2] 8457 ptr := v.Args[0] 8458 v_1 := v.Args[1] 8459 if v_1.Op != OpARMMOVHUreg { 8460 break 8461 } 8462 x := v_1.Args[0] 8463 mem := v.Args[2] 8464 v.reset(OpARMMOVHstore) 8465 v.AuxInt = off 8466 v.Aux = sym 8467 v.AddArg(ptr) 8468 v.AddArg(x) 8469 v.AddArg(mem) 8470 return true 8471 } 8472 // match: (MOVHstore [0] {sym} (ADD ptr idx) val mem) 8473 // cond: sym == nil && !config.nacl 8474 // result: (MOVHstoreidx ptr idx val mem) 8475 for { 8476 if v.AuxInt != 0 { 8477 break 8478 } 8479 sym := v.Aux 8480 _ = v.Args[2] 8481 v_0 := v.Args[0] 8482 if v_0.Op != OpARMADD { 8483 break 8484 } 8485 _ = v_0.Args[1] 8486 ptr := v_0.Args[0] 8487 idx := v_0.Args[1] 8488 val := v.Args[1] 8489 mem := v.Args[2] 8490 if !(sym == nil && !config.nacl) { 8491 break 8492 } 8493 v.reset(OpARMMOVHstoreidx) 8494 v.AddArg(ptr) 8495 v.AddArg(idx) 8496 v.AddArg(val) 8497 v.AddArg(mem) 8498 return true 8499 } 8500 return false 8501 } 8502 func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { 8503 // match: (MOVHstoreidx ptr (MOVWconst [c]) val mem) 8504 // cond: 8505 // result: (MOVHstore [c] ptr val mem) 8506 for { 8507 _ = v.Args[3] 8508 ptr := v.Args[0] 8509 v_1 := v.Args[1] 8510 if v_1.Op != OpARMMOVWconst { 8511 break 8512 } 8513 c := v_1.AuxInt 8514 val := v.Args[2] 8515 mem := v.Args[3] 8516 v.reset(OpARMMOVHstore) 8517 v.AuxInt = c 8518 v.AddArg(ptr) 8519 v.AddArg(val) 8520 v.AddArg(mem) 8521 return true 8522 } 8523 // match: (MOVHstoreidx (MOVWconst [c]) ptr val mem) 8524 // cond: 8525 // result: (MOVHstore [c] ptr val mem) 8526 for { 8527 _ = v.Args[3] 8528 v_0 := v.Args[0] 8529 if v_0.Op != OpARMMOVWconst { 8530 break 8531 } 8532 c := v_0.AuxInt 8533 ptr := v.Args[1] 8534 val := v.Args[2] 8535 mem := v.Args[3] 8536 v.reset(OpARMMOVHstore) 8537 v.AuxInt = c 8538 v.AddArg(ptr) 8539 v.AddArg(val) 8540 v.AddArg(mem) 8541 return true 8542 } 8543 return false 8544 } 8545 func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { 8546 b := v.Block 8547 _ = b 8548 config := b.Func.Config 8549 _ = config 8550 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 8551 // cond: 8552 // result: (MOVWload [off1+off2] {sym} ptr mem) 8553 for { 8554 off1 := v.AuxInt 8555 sym := v.Aux 8556 _ = v.Args[1] 8557 v_0 := v.Args[0] 8558 if v_0.Op != OpARMADDconst { 8559 break 8560 } 8561 off2 := v_0.AuxInt 8562 ptr := v_0.Args[0] 8563 mem := v.Args[1] 8564 v.reset(OpARMMOVWload) 8565 v.AuxInt = off1 + off2 8566 v.Aux = sym 8567 v.AddArg(ptr) 8568 v.AddArg(mem) 8569 return true 8570 } 8571 // match: (MOVWload [off1] {sym} (SUBconst [off2] ptr) mem) 8572 // cond: 8573 // result: (MOVWload [off1-off2] {sym} ptr mem) 8574 for { 8575 off1 := v.AuxInt 8576 sym := v.Aux 8577 _ = v.Args[1] 8578 v_0 := v.Args[0] 8579 if v_0.Op != OpARMSUBconst { 8580 break 8581 } 8582 off2 := v_0.AuxInt 8583 ptr := v_0.Args[0] 8584 mem := v.Args[1] 8585 v.reset(OpARMMOVWload) 8586 v.AuxInt = off1 - off2 8587 v.Aux = sym 8588 v.AddArg(ptr) 8589 v.AddArg(mem) 8590 return true 8591 } 8592 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 8593 // cond: canMergeSym(sym1,sym2) 8594 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 8595 for { 8596 off1 := v.AuxInt 8597 sym1 := v.Aux 8598 _ = v.Args[1] 8599 v_0 := v.Args[0] 8600 if v_0.Op != OpARMMOVWaddr { 8601 break 8602 } 8603 off2 := v_0.AuxInt 8604 sym2 := v_0.Aux 8605 ptr := v_0.Args[0] 8606 mem := v.Args[1] 8607 if !(canMergeSym(sym1, sym2)) { 8608 break 8609 } 8610 v.reset(OpARMMOVWload) 8611 v.AuxInt = off1 + off2 8612 v.Aux = mergeSym(sym1, sym2) 8613 v.AddArg(ptr) 8614 v.AddArg(mem) 8615 return true 8616 } 8617 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 8618 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8619 // result: x 8620 for { 8621 off := v.AuxInt 8622 sym := v.Aux 8623 _ = v.Args[1] 8624 ptr := v.Args[0] 8625 v_1 := v.Args[1] 8626 if v_1.Op != OpARMMOVWstore { 8627 break 8628 } 8629 off2 := v_1.AuxInt 8630 sym2 := v_1.Aux 8631 _ = v_1.Args[2] 8632 ptr2 := v_1.Args[0] 8633 x := v_1.Args[1] 8634 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8635 break 8636 } 8637 v.reset(OpCopy) 8638 v.Type = x.Type 8639 v.AddArg(x) 8640 return true 8641 } 8642 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 8643 // cond: sym == nil && !config.nacl 8644 // result: (MOVWloadidx ptr idx mem) 8645 for { 8646 if v.AuxInt != 0 { 8647 break 8648 } 8649 sym := v.Aux 8650 _ = v.Args[1] 8651 v_0 := v.Args[0] 8652 if v_0.Op != OpARMADD { 8653 break 8654 } 8655 _ = v_0.Args[1] 8656 ptr := v_0.Args[0] 8657 idx := v_0.Args[1] 8658 mem := v.Args[1] 8659 if !(sym == nil && !config.nacl) { 8660 break 8661 } 8662 v.reset(OpARMMOVWloadidx) 8663 v.AddArg(ptr) 8664 v.AddArg(idx) 8665 v.AddArg(mem) 8666 return true 8667 } 8668 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 8669 // cond: sym == nil && !config.nacl 8670 // result: (MOVWloadshiftLL ptr idx [c] mem) 8671 for { 8672 if v.AuxInt != 0 { 8673 break 8674 } 8675 sym := v.Aux 8676 _ = v.Args[1] 8677 v_0 := v.Args[0] 8678 if v_0.Op != OpARMADDshiftLL { 8679 break 8680 } 8681 c := v_0.AuxInt 8682 _ = v_0.Args[1] 8683 ptr := v_0.Args[0] 8684 idx := v_0.Args[1] 8685 mem := v.Args[1] 8686 if !(sym == nil && !config.nacl) { 8687 break 8688 } 8689 v.reset(OpARMMOVWloadshiftLL) 8690 v.AuxInt = c 8691 v.AddArg(ptr) 8692 v.AddArg(idx) 8693 v.AddArg(mem) 8694 return true 8695 } 8696 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 8697 // cond: sym == nil && !config.nacl 8698 // result: (MOVWloadshiftRL ptr idx [c] mem) 8699 for { 8700 if v.AuxInt != 0 { 8701 break 8702 } 8703 sym := v.Aux 8704 _ = v.Args[1] 8705 v_0 := v.Args[0] 8706 if v_0.Op != OpARMADDshiftRL { 8707 break 8708 } 8709 c := v_0.AuxInt 8710 _ = v_0.Args[1] 8711 ptr := v_0.Args[0] 8712 idx := v_0.Args[1] 8713 mem := v.Args[1] 8714 if !(sym == nil && !config.nacl) { 8715 break 8716 } 8717 v.reset(OpARMMOVWloadshiftRL) 8718 v.AuxInt = c 8719 v.AddArg(ptr) 8720 v.AddArg(idx) 8721 v.AddArg(mem) 8722 return true 8723 } 8724 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 8725 // cond: sym == nil && !config.nacl 8726 // result: (MOVWloadshiftRA ptr idx [c] mem) 8727 for { 8728 if v.AuxInt != 0 { 8729 break 8730 } 8731 sym := v.Aux 8732 _ = v.Args[1] 8733 v_0 := v.Args[0] 8734 if v_0.Op != OpARMADDshiftRA { 8735 break 8736 } 8737 c := v_0.AuxInt 8738 _ = v_0.Args[1] 8739 ptr := v_0.Args[0] 8740 idx := v_0.Args[1] 8741 mem := v.Args[1] 8742 if !(sym == nil && !config.nacl) { 8743 break 8744 } 8745 v.reset(OpARMMOVWloadshiftRA) 8746 v.AuxInt = c 8747 v.AddArg(ptr) 8748 v.AddArg(idx) 8749 v.AddArg(mem) 8750 return true 8751 } 8752 return false 8753 } 8754 func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { 8755 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 8756 // cond: isSamePtr(ptr, ptr2) 8757 // result: x 8758 for { 8759 _ = v.Args[2] 8760 ptr := v.Args[0] 8761 idx := v.Args[1] 8762 v_2 := v.Args[2] 8763 if v_2.Op != OpARMMOVWstoreidx { 8764 break 8765 } 8766 _ = v_2.Args[3] 8767 ptr2 := v_2.Args[0] 8768 if idx != v_2.Args[1] { 8769 break 8770 } 8771 x := v_2.Args[2] 8772 if !(isSamePtr(ptr, ptr2)) { 8773 break 8774 } 8775 v.reset(OpCopy) 8776 v.Type = x.Type 8777 v.AddArg(x) 8778 return true 8779 } 8780 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 8781 // cond: 8782 // result: (MOVWload [c] ptr mem) 8783 for { 8784 _ = v.Args[2] 8785 ptr := v.Args[0] 8786 v_1 := v.Args[1] 8787 if v_1.Op != OpARMMOVWconst { 8788 break 8789 } 8790 c := v_1.AuxInt 8791 mem := v.Args[2] 8792 v.reset(OpARMMOVWload) 8793 v.AuxInt = c 8794 v.AddArg(ptr) 8795 v.AddArg(mem) 8796 return true 8797 } 8798 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 8799 // cond: 8800 // result: (MOVWload [c] ptr mem) 8801 for { 8802 _ = v.Args[2] 8803 v_0 := v.Args[0] 8804 if v_0.Op != OpARMMOVWconst { 8805 break 8806 } 8807 c := v_0.AuxInt 8808 ptr := v.Args[1] 8809 mem := v.Args[2] 8810 v.reset(OpARMMOVWload) 8811 v.AuxInt = c 8812 v.AddArg(ptr) 8813 v.AddArg(mem) 8814 return true 8815 } 8816 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 8817 // cond: 8818 // result: (MOVWloadshiftLL ptr idx [c] mem) 8819 for { 8820 _ = v.Args[2] 8821 ptr := v.Args[0] 8822 v_1 := v.Args[1] 8823 if v_1.Op != OpARMSLLconst { 8824 break 8825 } 8826 c := v_1.AuxInt 8827 idx := v_1.Args[0] 8828 mem := v.Args[2] 8829 v.reset(OpARMMOVWloadshiftLL) 8830 v.AuxInt = c 8831 v.AddArg(ptr) 8832 v.AddArg(idx) 8833 v.AddArg(mem) 8834 return true 8835 } 8836 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 8837 // cond: 8838 // result: (MOVWloadshiftLL ptr idx [c] mem) 8839 for { 8840 _ = v.Args[2] 8841 v_0 := v.Args[0] 8842 if v_0.Op != OpARMSLLconst { 8843 break 8844 } 8845 c := v_0.AuxInt 8846 idx := v_0.Args[0] 8847 ptr := v.Args[1] 8848 mem := v.Args[2] 8849 v.reset(OpARMMOVWloadshiftLL) 8850 v.AuxInt = c 8851 v.AddArg(ptr) 8852 v.AddArg(idx) 8853 v.AddArg(mem) 8854 return true 8855 } 8856 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 8857 // cond: 8858 // result: (MOVWloadshiftRL ptr idx [c] mem) 8859 for { 8860 _ = v.Args[2] 8861 ptr := v.Args[0] 8862 v_1 := v.Args[1] 8863 if v_1.Op != OpARMSRLconst { 8864 break 8865 } 8866 c := v_1.AuxInt 8867 idx := v_1.Args[0] 8868 mem := v.Args[2] 8869 v.reset(OpARMMOVWloadshiftRL) 8870 v.AuxInt = c 8871 v.AddArg(ptr) 8872 v.AddArg(idx) 8873 v.AddArg(mem) 8874 return true 8875 } 8876 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 8877 // cond: 8878 // result: (MOVWloadshiftRL ptr idx [c] mem) 8879 for { 8880 _ = v.Args[2] 8881 v_0 := v.Args[0] 8882 if v_0.Op != OpARMSRLconst { 8883 break 8884 } 8885 c := v_0.AuxInt 8886 idx := v_0.Args[0] 8887 ptr := v.Args[1] 8888 mem := v.Args[2] 8889 v.reset(OpARMMOVWloadshiftRL) 8890 v.AuxInt = c 8891 v.AddArg(ptr) 8892 v.AddArg(idx) 8893 v.AddArg(mem) 8894 return true 8895 } 8896 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 8897 // cond: 8898 // result: (MOVWloadshiftRA ptr idx [c] mem) 8899 for { 8900 _ = v.Args[2] 8901 ptr := v.Args[0] 8902 v_1 := v.Args[1] 8903 if v_1.Op != OpARMSRAconst { 8904 break 8905 } 8906 c := v_1.AuxInt 8907 idx := v_1.Args[0] 8908 mem := v.Args[2] 8909 v.reset(OpARMMOVWloadshiftRA) 8910 v.AuxInt = c 8911 v.AddArg(ptr) 8912 v.AddArg(idx) 8913 v.AddArg(mem) 8914 return true 8915 } 8916 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 8917 // cond: 8918 // result: (MOVWloadshiftRA ptr idx [c] mem) 8919 for { 8920 _ = v.Args[2] 8921 v_0 := v.Args[0] 8922 if v_0.Op != OpARMSRAconst { 8923 break 8924 } 8925 c := v_0.AuxInt 8926 idx := v_0.Args[0] 8927 ptr := v.Args[1] 8928 mem := v.Args[2] 8929 v.reset(OpARMMOVWloadshiftRA) 8930 v.AuxInt = c 8931 v.AddArg(ptr) 8932 v.AddArg(idx) 8933 v.AddArg(mem) 8934 return true 8935 } 8936 return false 8937 } 8938 func rewriteValueARM_OpARMMOVWloadshiftLL_0(v *Value) bool { 8939 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 8940 // cond: c==d && isSamePtr(ptr, ptr2) 8941 // result: x 8942 for { 8943 c := v.AuxInt 8944 _ = v.Args[2] 8945 ptr := v.Args[0] 8946 idx := v.Args[1] 8947 v_2 := v.Args[2] 8948 if v_2.Op != OpARMMOVWstoreshiftLL { 8949 break 8950 } 8951 d := v_2.AuxInt 8952 _ = v_2.Args[3] 8953 ptr2 := v_2.Args[0] 8954 if idx != v_2.Args[1] { 8955 break 8956 } 8957 x := v_2.Args[2] 8958 if !(c == d && isSamePtr(ptr, ptr2)) { 8959 break 8960 } 8961 v.reset(OpCopy) 8962 v.Type = x.Type 8963 v.AddArg(x) 8964 return true 8965 } 8966 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 8967 // cond: 8968 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 8969 for { 8970 d := v.AuxInt 8971 _ = v.Args[2] 8972 ptr := v.Args[0] 8973 v_1 := v.Args[1] 8974 if v_1.Op != OpARMMOVWconst { 8975 break 8976 } 8977 c := v_1.AuxInt 8978 mem := v.Args[2] 8979 v.reset(OpARMMOVWload) 8980 v.AuxInt = int64(uint32(c) << uint64(d)) 8981 v.AddArg(ptr) 8982 v.AddArg(mem) 8983 return true 8984 } 8985 return false 8986 } 8987 func rewriteValueARM_OpARMMOVWloadshiftRA_0(v *Value) bool { 8988 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 8989 // cond: c==d && isSamePtr(ptr, ptr2) 8990 // result: x 8991 for { 8992 c := v.AuxInt 8993 _ = v.Args[2] 8994 ptr := v.Args[0] 8995 idx := v.Args[1] 8996 v_2 := v.Args[2] 8997 if v_2.Op != OpARMMOVWstoreshiftRA { 8998 break 8999 } 9000 d := v_2.AuxInt 9001 _ = v_2.Args[3] 9002 ptr2 := v_2.Args[0] 9003 if idx != v_2.Args[1] { 9004 break 9005 } 9006 x := v_2.Args[2] 9007 if !(c == d && isSamePtr(ptr, ptr2)) { 9008 break 9009 } 9010 v.reset(OpCopy) 9011 v.Type = x.Type 9012 v.AddArg(x) 9013 return true 9014 } 9015 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 9016 // cond: 9017 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 9018 for { 9019 d := v.AuxInt 9020 _ = v.Args[2] 9021 ptr := v.Args[0] 9022 v_1 := v.Args[1] 9023 if v_1.Op != OpARMMOVWconst { 9024 break 9025 } 9026 c := v_1.AuxInt 9027 mem := v.Args[2] 9028 v.reset(OpARMMOVWload) 9029 v.AuxInt = int64(int32(c) >> uint64(d)) 9030 v.AddArg(ptr) 9031 v.AddArg(mem) 9032 return true 9033 } 9034 return false 9035 } 9036 func rewriteValueARM_OpARMMOVWloadshiftRL_0(v *Value) bool { 9037 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 9038 // cond: c==d && isSamePtr(ptr, ptr2) 9039 // result: x 9040 for { 9041 c := v.AuxInt 9042 _ = v.Args[2] 9043 ptr := v.Args[0] 9044 idx := v.Args[1] 9045 v_2 := v.Args[2] 9046 if v_2.Op != OpARMMOVWstoreshiftRL { 9047 break 9048 } 9049 d := v_2.AuxInt 9050 _ = v_2.Args[3] 9051 ptr2 := v_2.Args[0] 9052 if idx != v_2.Args[1] { 9053 break 9054 } 9055 x := v_2.Args[2] 9056 if !(c == d && isSamePtr(ptr, ptr2)) { 9057 break 9058 } 9059 v.reset(OpCopy) 9060 v.Type = x.Type 9061 v.AddArg(x) 9062 return true 9063 } 9064 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 9065 // cond: 9066 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 9067 for { 9068 d := v.AuxInt 9069 _ = v.Args[2] 9070 ptr := v.Args[0] 9071 v_1 := v.Args[1] 9072 if v_1.Op != OpARMMOVWconst { 9073 break 9074 } 9075 c := v_1.AuxInt 9076 mem := v.Args[2] 9077 v.reset(OpARMMOVWload) 9078 v.AuxInt = int64(uint32(c) >> uint64(d)) 9079 v.AddArg(ptr) 9080 v.AddArg(mem) 9081 return true 9082 } 9083 return false 9084 } 9085 func rewriteValueARM_OpARMMOVWreg_0(v *Value) bool { 9086 // match: (MOVWreg x) 9087 // cond: x.Uses == 1 9088 // result: (MOVWnop x) 9089 for { 9090 x := v.Args[0] 9091 if !(x.Uses == 1) { 9092 break 9093 } 9094 v.reset(OpARMMOVWnop) 9095 v.AddArg(x) 9096 return true 9097 } 9098 // match: (MOVWreg (MOVWconst [c])) 9099 // cond: 9100 // result: (MOVWconst [c]) 9101 for { 9102 v_0 := v.Args[0] 9103 if v_0.Op != OpARMMOVWconst { 9104 break 9105 } 9106 c := v_0.AuxInt 9107 v.reset(OpARMMOVWconst) 9108 v.AuxInt = c 9109 return true 9110 } 9111 return false 9112 } 9113 func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { 9114 b := v.Block 9115 _ = b 9116 config := b.Func.Config 9117 _ = config 9118 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9119 // cond: 9120 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 9121 for { 9122 off1 := v.AuxInt 9123 sym := v.Aux 9124 _ = v.Args[2] 9125 v_0 := v.Args[0] 9126 if v_0.Op != OpARMADDconst { 9127 break 9128 } 9129 off2 := v_0.AuxInt 9130 ptr := v_0.Args[0] 9131 val := v.Args[1] 9132 mem := v.Args[2] 9133 v.reset(OpARMMOVWstore) 9134 v.AuxInt = off1 + off2 9135 v.Aux = sym 9136 v.AddArg(ptr) 9137 v.AddArg(val) 9138 v.AddArg(mem) 9139 return true 9140 } 9141 // match: (MOVWstore [off1] {sym} (SUBconst [off2] ptr) val mem) 9142 // cond: 9143 // result: (MOVWstore [off1-off2] {sym} ptr val mem) 9144 for { 9145 off1 := v.AuxInt 9146 sym := v.Aux 9147 _ = v.Args[2] 9148 v_0 := v.Args[0] 9149 if v_0.Op != OpARMSUBconst { 9150 break 9151 } 9152 off2 := v_0.AuxInt 9153 ptr := v_0.Args[0] 9154 val := v.Args[1] 9155 mem := v.Args[2] 9156 v.reset(OpARMMOVWstore) 9157 v.AuxInt = off1 - off2 9158 v.Aux = sym 9159 v.AddArg(ptr) 9160 v.AddArg(val) 9161 v.AddArg(mem) 9162 return true 9163 } 9164 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 9165 // cond: canMergeSym(sym1,sym2) 9166 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 9167 for { 9168 off1 := v.AuxInt 9169 sym1 := v.Aux 9170 _ = v.Args[2] 9171 v_0 := v.Args[0] 9172 if v_0.Op != OpARMMOVWaddr { 9173 break 9174 } 9175 off2 := v_0.AuxInt 9176 sym2 := v_0.Aux 9177 ptr := v_0.Args[0] 9178 val := v.Args[1] 9179 mem := v.Args[2] 9180 if !(canMergeSym(sym1, sym2)) { 9181 break 9182 } 9183 v.reset(OpARMMOVWstore) 9184 v.AuxInt = off1 + off2 9185 v.Aux = mergeSym(sym1, sym2) 9186 v.AddArg(ptr) 9187 v.AddArg(val) 9188 v.AddArg(mem) 9189 return true 9190 } 9191 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 9192 // cond: sym == nil && !config.nacl 9193 // result: (MOVWstoreidx ptr idx val mem) 9194 for { 9195 if v.AuxInt != 0 { 9196 break 9197 } 9198 sym := v.Aux 9199 _ = v.Args[2] 9200 v_0 := v.Args[0] 9201 if v_0.Op != OpARMADD { 9202 break 9203 } 9204 _ = v_0.Args[1] 9205 ptr := v_0.Args[0] 9206 idx := v_0.Args[1] 9207 val := v.Args[1] 9208 mem := v.Args[2] 9209 if !(sym == nil && !config.nacl) { 9210 break 9211 } 9212 v.reset(OpARMMOVWstoreidx) 9213 v.AddArg(ptr) 9214 v.AddArg(idx) 9215 v.AddArg(val) 9216 v.AddArg(mem) 9217 return true 9218 } 9219 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 9220 // cond: sym == nil && !config.nacl 9221 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9222 for { 9223 if v.AuxInt != 0 { 9224 break 9225 } 9226 sym := v.Aux 9227 _ = v.Args[2] 9228 v_0 := v.Args[0] 9229 if v_0.Op != OpARMADDshiftLL { 9230 break 9231 } 9232 c := v_0.AuxInt 9233 _ = v_0.Args[1] 9234 ptr := v_0.Args[0] 9235 idx := v_0.Args[1] 9236 val := v.Args[1] 9237 mem := v.Args[2] 9238 if !(sym == nil && !config.nacl) { 9239 break 9240 } 9241 v.reset(OpARMMOVWstoreshiftLL) 9242 v.AuxInt = c 9243 v.AddArg(ptr) 9244 v.AddArg(idx) 9245 v.AddArg(val) 9246 v.AddArg(mem) 9247 return true 9248 } 9249 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 9250 // cond: sym == nil && !config.nacl 9251 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9252 for { 9253 if v.AuxInt != 0 { 9254 break 9255 } 9256 sym := v.Aux 9257 _ = v.Args[2] 9258 v_0 := v.Args[0] 9259 if v_0.Op != OpARMADDshiftRL { 9260 break 9261 } 9262 c := v_0.AuxInt 9263 _ = v_0.Args[1] 9264 ptr := v_0.Args[0] 9265 idx := v_0.Args[1] 9266 val := v.Args[1] 9267 mem := v.Args[2] 9268 if !(sym == nil && !config.nacl) { 9269 break 9270 } 9271 v.reset(OpARMMOVWstoreshiftRL) 9272 v.AuxInt = c 9273 v.AddArg(ptr) 9274 v.AddArg(idx) 9275 v.AddArg(val) 9276 v.AddArg(mem) 9277 return true 9278 } 9279 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 9280 // cond: sym == nil && !config.nacl 9281 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9282 for { 9283 if v.AuxInt != 0 { 9284 break 9285 } 9286 sym := v.Aux 9287 _ = v.Args[2] 9288 v_0 := v.Args[0] 9289 if v_0.Op != OpARMADDshiftRA { 9290 break 9291 } 9292 c := v_0.AuxInt 9293 _ = v_0.Args[1] 9294 ptr := v_0.Args[0] 9295 idx := v_0.Args[1] 9296 val := v.Args[1] 9297 mem := v.Args[2] 9298 if !(sym == nil && !config.nacl) { 9299 break 9300 } 9301 v.reset(OpARMMOVWstoreshiftRA) 9302 v.AuxInt = c 9303 v.AddArg(ptr) 9304 v.AddArg(idx) 9305 v.AddArg(val) 9306 v.AddArg(mem) 9307 return true 9308 } 9309 return false 9310 } 9311 func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { 9312 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 9313 // cond: 9314 // result: (MOVWstore [c] ptr val mem) 9315 for { 9316 _ = v.Args[3] 9317 ptr := v.Args[0] 9318 v_1 := v.Args[1] 9319 if v_1.Op != OpARMMOVWconst { 9320 break 9321 } 9322 c := v_1.AuxInt 9323 val := v.Args[2] 9324 mem := v.Args[3] 9325 v.reset(OpARMMOVWstore) 9326 v.AuxInt = c 9327 v.AddArg(ptr) 9328 v.AddArg(val) 9329 v.AddArg(mem) 9330 return true 9331 } 9332 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 9333 // cond: 9334 // result: (MOVWstore [c] ptr val mem) 9335 for { 9336 _ = v.Args[3] 9337 v_0 := v.Args[0] 9338 if v_0.Op != OpARMMOVWconst { 9339 break 9340 } 9341 c := v_0.AuxInt 9342 ptr := v.Args[1] 9343 val := v.Args[2] 9344 mem := v.Args[3] 9345 v.reset(OpARMMOVWstore) 9346 v.AuxInt = c 9347 v.AddArg(ptr) 9348 v.AddArg(val) 9349 v.AddArg(mem) 9350 return true 9351 } 9352 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 9353 // cond: 9354 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9355 for { 9356 _ = v.Args[3] 9357 ptr := v.Args[0] 9358 v_1 := v.Args[1] 9359 if v_1.Op != OpARMSLLconst { 9360 break 9361 } 9362 c := v_1.AuxInt 9363 idx := v_1.Args[0] 9364 val := v.Args[2] 9365 mem := v.Args[3] 9366 v.reset(OpARMMOVWstoreshiftLL) 9367 v.AuxInt = c 9368 v.AddArg(ptr) 9369 v.AddArg(idx) 9370 v.AddArg(val) 9371 v.AddArg(mem) 9372 return true 9373 } 9374 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 9375 // cond: 9376 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9377 for { 9378 _ = v.Args[3] 9379 v_0 := v.Args[0] 9380 if v_0.Op != OpARMSLLconst { 9381 break 9382 } 9383 c := v_0.AuxInt 9384 idx := v_0.Args[0] 9385 ptr := v.Args[1] 9386 val := v.Args[2] 9387 mem := v.Args[3] 9388 v.reset(OpARMMOVWstoreshiftLL) 9389 v.AuxInt = c 9390 v.AddArg(ptr) 9391 v.AddArg(idx) 9392 v.AddArg(val) 9393 v.AddArg(mem) 9394 return true 9395 } 9396 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 9397 // cond: 9398 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9399 for { 9400 _ = v.Args[3] 9401 ptr := v.Args[0] 9402 v_1 := v.Args[1] 9403 if v_1.Op != OpARMSRLconst { 9404 break 9405 } 9406 c := v_1.AuxInt 9407 idx := v_1.Args[0] 9408 val := v.Args[2] 9409 mem := v.Args[3] 9410 v.reset(OpARMMOVWstoreshiftRL) 9411 v.AuxInt = c 9412 v.AddArg(ptr) 9413 v.AddArg(idx) 9414 v.AddArg(val) 9415 v.AddArg(mem) 9416 return true 9417 } 9418 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 9419 // cond: 9420 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9421 for { 9422 _ = v.Args[3] 9423 v_0 := v.Args[0] 9424 if v_0.Op != OpARMSRLconst { 9425 break 9426 } 9427 c := v_0.AuxInt 9428 idx := v_0.Args[0] 9429 ptr := v.Args[1] 9430 val := v.Args[2] 9431 mem := v.Args[3] 9432 v.reset(OpARMMOVWstoreshiftRL) 9433 v.AuxInt = c 9434 v.AddArg(ptr) 9435 v.AddArg(idx) 9436 v.AddArg(val) 9437 v.AddArg(mem) 9438 return true 9439 } 9440 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 9441 // cond: 9442 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9443 for { 9444 _ = v.Args[3] 9445 ptr := v.Args[0] 9446 v_1 := v.Args[1] 9447 if v_1.Op != OpARMSRAconst { 9448 break 9449 } 9450 c := v_1.AuxInt 9451 idx := v_1.Args[0] 9452 val := v.Args[2] 9453 mem := v.Args[3] 9454 v.reset(OpARMMOVWstoreshiftRA) 9455 v.AuxInt = c 9456 v.AddArg(ptr) 9457 v.AddArg(idx) 9458 v.AddArg(val) 9459 v.AddArg(mem) 9460 return true 9461 } 9462 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 9463 // cond: 9464 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9465 for { 9466 _ = v.Args[3] 9467 v_0 := v.Args[0] 9468 if v_0.Op != OpARMSRAconst { 9469 break 9470 } 9471 c := v_0.AuxInt 9472 idx := v_0.Args[0] 9473 ptr := v.Args[1] 9474 val := v.Args[2] 9475 mem := v.Args[3] 9476 v.reset(OpARMMOVWstoreshiftRA) 9477 v.AuxInt = c 9478 v.AddArg(ptr) 9479 v.AddArg(idx) 9480 v.AddArg(val) 9481 v.AddArg(mem) 9482 return true 9483 } 9484 return false 9485 } 9486 func rewriteValueARM_OpARMMOVWstoreshiftLL_0(v *Value) bool { 9487 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 9488 // cond: 9489 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 9490 for { 9491 d := v.AuxInt 9492 _ = v.Args[3] 9493 ptr := v.Args[0] 9494 v_1 := v.Args[1] 9495 if v_1.Op != OpARMMOVWconst { 9496 break 9497 } 9498 c := v_1.AuxInt 9499 val := v.Args[2] 9500 mem := v.Args[3] 9501 v.reset(OpARMMOVWstore) 9502 v.AuxInt = int64(uint32(c) << uint64(d)) 9503 v.AddArg(ptr) 9504 v.AddArg(val) 9505 v.AddArg(mem) 9506 return true 9507 } 9508 return false 9509 } 9510 func rewriteValueARM_OpARMMOVWstoreshiftRA_0(v *Value) bool { 9511 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 9512 // cond: 9513 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 9514 for { 9515 d := v.AuxInt 9516 _ = v.Args[3] 9517 ptr := v.Args[0] 9518 v_1 := v.Args[1] 9519 if v_1.Op != OpARMMOVWconst { 9520 break 9521 } 9522 c := v_1.AuxInt 9523 val := v.Args[2] 9524 mem := v.Args[3] 9525 v.reset(OpARMMOVWstore) 9526 v.AuxInt = int64(int32(c) >> uint64(d)) 9527 v.AddArg(ptr) 9528 v.AddArg(val) 9529 v.AddArg(mem) 9530 return true 9531 } 9532 return false 9533 } 9534 func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { 9535 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 9536 // cond: 9537 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 9538 for { 9539 d := v.AuxInt 9540 _ = v.Args[3] 9541 ptr := v.Args[0] 9542 v_1 := v.Args[1] 9543 if v_1.Op != OpARMMOVWconst { 9544 break 9545 } 9546 c := v_1.AuxInt 9547 val := v.Args[2] 9548 mem := v.Args[3] 9549 v.reset(OpARMMOVWstore) 9550 v.AuxInt = int64(uint32(c) >> uint64(d)) 9551 v.AddArg(ptr) 9552 v.AddArg(val) 9553 v.AddArg(mem) 9554 return true 9555 } 9556 return false 9557 } 9558 func rewriteValueARM_OpARMMUL_0(v *Value) bool { 9559 // match: (MUL x (MOVWconst [c])) 9560 // cond: int32(c) == -1 9561 // result: (RSBconst [0] x) 9562 for { 9563 _ = v.Args[1] 9564 x := v.Args[0] 9565 v_1 := v.Args[1] 9566 if v_1.Op != OpARMMOVWconst { 9567 break 9568 } 9569 c := v_1.AuxInt 9570 if !(int32(c) == -1) { 9571 break 9572 } 9573 v.reset(OpARMRSBconst) 9574 v.AuxInt = 0 9575 v.AddArg(x) 9576 return true 9577 } 9578 // match: (MUL (MOVWconst [c]) x) 9579 // cond: int32(c) == -1 9580 // result: (RSBconst [0] x) 9581 for { 9582 _ = v.Args[1] 9583 v_0 := v.Args[0] 9584 if v_0.Op != OpARMMOVWconst { 9585 break 9586 } 9587 c := v_0.AuxInt 9588 x := v.Args[1] 9589 if !(int32(c) == -1) { 9590 break 9591 } 9592 v.reset(OpARMRSBconst) 9593 v.AuxInt = 0 9594 v.AddArg(x) 9595 return true 9596 } 9597 // match: (MUL _ (MOVWconst [0])) 9598 // cond: 9599 // result: (MOVWconst [0]) 9600 for { 9601 _ = v.Args[1] 9602 v_1 := v.Args[1] 9603 if v_1.Op != OpARMMOVWconst { 9604 break 9605 } 9606 if v_1.AuxInt != 0 { 9607 break 9608 } 9609 v.reset(OpARMMOVWconst) 9610 v.AuxInt = 0 9611 return true 9612 } 9613 // match: (MUL (MOVWconst [0]) _) 9614 // cond: 9615 // result: (MOVWconst [0]) 9616 for { 9617 _ = v.Args[1] 9618 v_0 := v.Args[0] 9619 if v_0.Op != OpARMMOVWconst { 9620 break 9621 } 9622 if v_0.AuxInt != 0 { 9623 break 9624 } 9625 v.reset(OpARMMOVWconst) 9626 v.AuxInt = 0 9627 return true 9628 } 9629 // match: (MUL x (MOVWconst [1])) 9630 // cond: 9631 // result: x 9632 for { 9633 _ = v.Args[1] 9634 x := v.Args[0] 9635 v_1 := v.Args[1] 9636 if v_1.Op != OpARMMOVWconst { 9637 break 9638 } 9639 if v_1.AuxInt != 1 { 9640 break 9641 } 9642 v.reset(OpCopy) 9643 v.Type = x.Type 9644 v.AddArg(x) 9645 return true 9646 } 9647 // match: (MUL (MOVWconst [1]) x) 9648 // cond: 9649 // result: x 9650 for { 9651 _ = v.Args[1] 9652 v_0 := v.Args[0] 9653 if v_0.Op != OpARMMOVWconst { 9654 break 9655 } 9656 if v_0.AuxInt != 1 { 9657 break 9658 } 9659 x := v.Args[1] 9660 v.reset(OpCopy) 9661 v.Type = x.Type 9662 v.AddArg(x) 9663 return true 9664 } 9665 // match: (MUL x (MOVWconst [c])) 9666 // cond: isPowerOfTwo(c) 9667 // result: (SLLconst [log2(c)] x) 9668 for { 9669 _ = v.Args[1] 9670 x := v.Args[0] 9671 v_1 := v.Args[1] 9672 if v_1.Op != OpARMMOVWconst { 9673 break 9674 } 9675 c := v_1.AuxInt 9676 if !(isPowerOfTwo(c)) { 9677 break 9678 } 9679 v.reset(OpARMSLLconst) 9680 v.AuxInt = log2(c) 9681 v.AddArg(x) 9682 return true 9683 } 9684 // match: (MUL (MOVWconst [c]) x) 9685 // cond: isPowerOfTwo(c) 9686 // result: (SLLconst [log2(c)] x) 9687 for { 9688 _ = v.Args[1] 9689 v_0 := v.Args[0] 9690 if v_0.Op != OpARMMOVWconst { 9691 break 9692 } 9693 c := v_0.AuxInt 9694 x := v.Args[1] 9695 if !(isPowerOfTwo(c)) { 9696 break 9697 } 9698 v.reset(OpARMSLLconst) 9699 v.AuxInt = log2(c) 9700 v.AddArg(x) 9701 return true 9702 } 9703 // match: (MUL x (MOVWconst [c])) 9704 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9705 // result: (ADDshiftLL x x [log2(c-1)]) 9706 for { 9707 _ = v.Args[1] 9708 x := v.Args[0] 9709 v_1 := v.Args[1] 9710 if v_1.Op != OpARMMOVWconst { 9711 break 9712 } 9713 c := v_1.AuxInt 9714 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9715 break 9716 } 9717 v.reset(OpARMADDshiftLL) 9718 v.AuxInt = log2(c - 1) 9719 v.AddArg(x) 9720 v.AddArg(x) 9721 return true 9722 } 9723 // match: (MUL (MOVWconst [c]) x) 9724 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9725 // result: (ADDshiftLL x x [log2(c-1)]) 9726 for { 9727 _ = v.Args[1] 9728 v_0 := v.Args[0] 9729 if v_0.Op != OpARMMOVWconst { 9730 break 9731 } 9732 c := v_0.AuxInt 9733 x := v.Args[1] 9734 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9735 break 9736 } 9737 v.reset(OpARMADDshiftLL) 9738 v.AuxInt = log2(c - 1) 9739 v.AddArg(x) 9740 v.AddArg(x) 9741 return true 9742 } 9743 return false 9744 } 9745 func rewriteValueARM_OpARMMUL_10(v *Value) bool { 9746 b := v.Block 9747 _ = b 9748 // match: (MUL x (MOVWconst [c])) 9749 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9750 // result: (RSBshiftLL x x [log2(c+1)]) 9751 for { 9752 _ = v.Args[1] 9753 x := v.Args[0] 9754 v_1 := v.Args[1] 9755 if v_1.Op != OpARMMOVWconst { 9756 break 9757 } 9758 c := v_1.AuxInt 9759 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9760 break 9761 } 9762 v.reset(OpARMRSBshiftLL) 9763 v.AuxInt = log2(c + 1) 9764 v.AddArg(x) 9765 v.AddArg(x) 9766 return true 9767 } 9768 // match: (MUL (MOVWconst [c]) x) 9769 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9770 // result: (RSBshiftLL x x [log2(c+1)]) 9771 for { 9772 _ = v.Args[1] 9773 v_0 := v.Args[0] 9774 if v_0.Op != OpARMMOVWconst { 9775 break 9776 } 9777 c := v_0.AuxInt 9778 x := v.Args[1] 9779 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9780 break 9781 } 9782 v.reset(OpARMRSBshiftLL) 9783 v.AuxInt = log2(c + 1) 9784 v.AddArg(x) 9785 v.AddArg(x) 9786 return true 9787 } 9788 // match: (MUL x (MOVWconst [c])) 9789 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9790 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 9791 for { 9792 _ = v.Args[1] 9793 x := v.Args[0] 9794 v_1 := v.Args[1] 9795 if v_1.Op != OpARMMOVWconst { 9796 break 9797 } 9798 c := v_1.AuxInt 9799 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9800 break 9801 } 9802 v.reset(OpARMSLLconst) 9803 v.AuxInt = log2(c / 3) 9804 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9805 v0.AuxInt = 1 9806 v0.AddArg(x) 9807 v0.AddArg(x) 9808 v.AddArg(v0) 9809 return true 9810 } 9811 // match: (MUL (MOVWconst [c]) x) 9812 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9813 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 9814 for { 9815 _ = v.Args[1] 9816 v_0 := v.Args[0] 9817 if v_0.Op != OpARMMOVWconst { 9818 break 9819 } 9820 c := v_0.AuxInt 9821 x := v.Args[1] 9822 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9823 break 9824 } 9825 v.reset(OpARMSLLconst) 9826 v.AuxInt = log2(c / 3) 9827 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9828 v0.AuxInt = 1 9829 v0.AddArg(x) 9830 v0.AddArg(x) 9831 v.AddArg(v0) 9832 return true 9833 } 9834 // match: (MUL x (MOVWconst [c])) 9835 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9836 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 9837 for { 9838 _ = v.Args[1] 9839 x := v.Args[0] 9840 v_1 := v.Args[1] 9841 if v_1.Op != OpARMMOVWconst { 9842 break 9843 } 9844 c := v_1.AuxInt 9845 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9846 break 9847 } 9848 v.reset(OpARMSLLconst) 9849 v.AuxInt = log2(c / 5) 9850 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9851 v0.AuxInt = 2 9852 v0.AddArg(x) 9853 v0.AddArg(x) 9854 v.AddArg(v0) 9855 return true 9856 } 9857 // match: (MUL (MOVWconst [c]) x) 9858 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9859 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 9860 for { 9861 _ = v.Args[1] 9862 v_0 := v.Args[0] 9863 if v_0.Op != OpARMMOVWconst { 9864 break 9865 } 9866 c := v_0.AuxInt 9867 x := v.Args[1] 9868 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9869 break 9870 } 9871 v.reset(OpARMSLLconst) 9872 v.AuxInt = log2(c / 5) 9873 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9874 v0.AuxInt = 2 9875 v0.AddArg(x) 9876 v0.AddArg(x) 9877 v.AddArg(v0) 9878 return true 9879 } 9880 // match: (MUL x (MOVWconst [c])) 9881 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 9882 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 9883 for { 9884 _ = v.Args[1] 9885 x := v.Args[0] 9886 v_1 := v.Args[1] 9887 if v_1.Op != OpARMMOVWconst { 9888 break 9889 } 9890 c := v_1.AuxInt 9891 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 9892 break 9893 } 9894 v.reset(OpARMSLLconst) 9895 v.AuxInt = log2(c / 7) 9896 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9897 v0.AuxInt = 3 9898 v0.AddArg(x) 9899 v0.AddArg(x) 9900 v.AddArg(v0) 9901 return true 9902 } 9903 // match: (MUL (MOVWconst [c]) x) 9904 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 9905 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 9906 for { 9907 _ = v.Args[1] 9908 v_0 := v.Args[0] 9909 if v_0.Op != OpARMMOVWconst { 9910 break 9911 } 9912 c := v_0.AuxInt 9913 x := v.Args[1] 9914 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 9915 break 9916 } 9917 v.reset(OpARMSLLconst) 9918 v.AuxInt = log2(c / 7) 9919 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9920 v0.AuxInt = 3 9921 v0.AddArg(x) 9922 v0.AddArg(x) 9923 v.AddArg(v0) 9924 return true 9925 } 9926 // match: (MUL x (MOVWconst [c])) 9927 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 9928 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 9929 for { 9930 _ = v.Args[1] 9931 x := v.Args[0] 9932 v_1 := v.Args[1] 9933 if v_1.Op != OpARMMOVWconst { 9934 break 9935 } 9936 c := v_1.AuxInt 9937 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9938 break 9939 } 9940 v.reset(OpARMSLLconst) 9941 v.AuxInt = log2(c / 9) 9942 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9943 v0.AuxInt = 3 9944 v0.AddArg(x) 9945 v0.AddArg(x) 9946 v.AddArg(v0) 9947 return true 9948 } 9949 // match: (MUL (MOVWconst [c]) x) 9950 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 9951 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 9952 for { 9953 _ = v.Args[1] 9954 v_0 := v.Args[0] 9955 if v_0.Op != OpARMMOVWconst { 9956 break 9957 } 9958 c := v_0.AuxInt 9959 x := v.Args[1] 9960 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9961 break 9962 } 9963 v.reset(OpARMSLLconst) 9964 v.AuxInt = log2(c / 9) 9965 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9966 v0.AuxInt = 3 9967 v0.AddArg(x) 9968 v0.AddArg(x) 9969 v.AddArg(v0) 9970 return true 9971 } 9972 return false 9973 } 9974 func rewriteValueARM_OpARMMUL_20(v *Value) bool { 9975 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 9976 // cond: 9977 // result: (MOVWconst [int64(int32(c*d))]) 9978 for { 9979 _ = v.Args[1] 9980 v_0 := v.Args[0] 9981 if v_0.Op != OpARMMOVWconst { 9982 break 9983 } 9984 c := v_0.AuxInt 9985 v_1 := v.Args[1] 9986 if v_1.Op != OpARMMOVWconst { 9987 break 9988 } 9989 d := v_1.AuxInt 9990 v.reset(OpARMMOVWconst) 9991 v.AuxInt = int64(int32(c * d)) 9992 return true 9993 } 9994 // match: (MUL (MOVWconst [d]) (MOVWconst [c])) 9995 // cond: 9996 // result: (MOVWconst [int64(int32(c*d))]) 9997 for { 9998 _ = v.Args[1] 9999 v_0 := v.Args[0] 10000 if v_0.Op != OpARMMOVWconst { 10001 break 10002 } 10003 d := v_0.AuxInt 10004 v_1 := v.Args[1] 10005 if v_1.Op != OpARMMOVWconst { 10006 break 10007 } 10008 c := v_1.AuxInt 10009 v.reset(OpARMMOVWconst) 10010 v.AuxInt = int64(int32(c * d)) 10011 return true 10012 } 10013 return false 10014 } 10015 func rewriteValueARM_OpARMMULA_0(v *Value) bool { 10016 b := v.Block 10017 _ = b 10018 // match: (MULA x (MOVWconst [c]) a) 10019 // cond: int32(c) == -1 10020 // result: (SUB a x) 10021 for { 10022 _ = v.Args[2] 10023 x := v.Args[0] 10024 v_1 := v.Args[1] 10025 if v_1.Op != OpARMMOVWconst { 10026 break 10027 } 10028 c := v_1.AuxInt 10029 a := v.Args[2] 10030 if !(int32(c) == -1) { 10031 break 10032 } 10033 v.reset(OpARMSUB) 10034 v.AddArg(a) 10035 v.AddArg(x) 10036 return true 10037 } 10038 // match: (MULA _ (MOVWconst [0]) a) 10039 // cond: 10040 // result: a 10041 for { 10042 _ = v.Args[2] 10043 v_1 := v.Args[1] 10044 if v_1.Op != OpARMMOVWconst { 10045 break 10046 } 10047 if v_1.AuxInt != 0 { 10048 break 10049 } 10050 a := v.Args[2] 10051 v.reset(OpCopy) 10052 v.Type = a.Type 10053 v.AddArg(a) 10054 return true 10055 } 10056 // match: (MULA x (MOVWconst [1]) a) 10057 // cond: 10058 // result: (ADD x a) 10059 for { 10060 _ = v.Args[2] 10061 x := v.Args[0] 10062 v_1 := v.Args[1] 10063 if v_1.Op != OpARMMOVWconst { 10064 break 10065 } 10066 if v_1.AuxInt != 1 { 10067 break 10068 } 10069 a := v.Args[2] 10070 v.reset(OpARMADD) 10071 v.AddArg(x) 10072 v.AddArg(a) 10073 return true 10074 } 10075 // match: (MULA x (MOVWconst [c]) a) 10076 // cond: isPowerOfTwo(c) 10077 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 10078 for { 10079 _ = v.Args[2] 10080 x := v.Args[0] 10081 v_1 := v.Args[1] 10082 if v_1.Op != OpARMMOVWconst { 10083 break 10084 } 10085 c := v_1.AuxInt 10086 a := v.Args[2] 10087 if !(isPowerOfTwo(c)) { 10088 break 10089 } 10090 v.reset(OpARMADD) 10091 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10092 v0.AuxInt = log2(c) 10093 v0.AddArg(x) 10094 v.AddArg(v0) 10095 v.AddArg(a) 10096 return true 10097 } 10098 // match: (MULA x (MOVWconst [c]) a) 10099 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10100 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 10101 for { 10102 _ = v.Args[2] 10103 x := v.Args[0] 10104 v_1 := v.Args[1] 10105 if v_1.Op != OpARMMOVWconst { 10106 break 10107 } 10108 c := v_1.AuxInt 10109 a := v.Args[2] 10110 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10111 break 10112 } 10113 v.reset(OpARMADD) 10114 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10115 v0.AuxInt = log2(c - 1) 10116 v0.AddArg(x) 10117 v0.AddArg(x) 10118 v.AddArg(v0) 10119 v.AddArg(a) 10120 return true 10121 } 10122 // match: (MULA x (MOVWconst [c]) a) 10123 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10124 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10125 for { 10126 _ = v.Args[2] 10127 x := v.Args[0] 10128 v_1 := v.Args[1] 10129 if v_1.Op != OpARMMOVWconst { 10130 break 10131 } 10132 c := v_1.AuxInt 10133 a := v.Args[2] 10134 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10135 break 10136 } 10137 v.reset(OpARMADD) 10138 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10139 v0.AuxInt = log2(c + 1) 10140 v0.AddArg(x) 10141 v0.AddArg(x) 10142 v.AddArg(v0) 10143 v.AddArg(a) 10144 return true 10145 } 10146 // match: (MULA x (MOVWconst [c]) a) 10147 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10148 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10149 for { 10150 _ = v.Args[2] 10151 x := v.Args[0] 10152 v_1 := v.Args[1] 10153 if v_1.Op != OpARMMOVWconst { 10154 break 10155 } 10156 c := v_1.AuxInt 10157 a := v.Args[2] 10158 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10159 break 10160 } 10161 v.reset(OpARMADD) 10162 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10163 v0.AuxInt = log2(c / 3) 10164 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10165 v1.AuxInt = 1 10166 v1.AddArg(x) 10167 v1.AddArg(x) 10168 v0.AddArg(v1) 10169 v.AddArg(v0) 10170 v.AddArg(a) 10171 return true 10172 } 10173 // match: (MULA x (MOVWconst [c]) a) 10174 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10175 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10176 for { 10177 _ = v.Args[2] 10178 x := v.Args[0] 10179 v_1 := v.Args[1] 10180 if v_1.Op != OpARMMOVWconst { 10181 break 10182 } 10183 c := v_1.AuxInt 10184 a := v.Args[2] 10185 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10186 break 10187 } 10188 v.reset(OpARMADD) 10189 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10190 v0.AuxInt = log2(c / 5) 10191 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10192 v1.AuxInt = 2 10193 v1.AddArg(x) 10194 v1.AddArg(x) 10195 v0.AddArg(v1) 10196 v.AddArg(v0) 10197 v.AddArg(a) 10198 return true 10199 } 10200 // match: (MULA x (MOVWconst [c]) a) 10201 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10202 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10203 for { 10204 _ = v.Args[2] 10205 x := v.Args[0] 10206 v_1 := v.Args[1] 10207 if v_1.Op != OpARMMOVWconst { 10208 break 10209 } 10210 c := v_1.AuxInt 10211 a := v.Args[2] 10212 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10213 break 10214 } 10215 v.reset(OpARMADD) 10216 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10217 v0.AuxInt = log2(c / 7) 10218 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10219 v1.AuxInt = 3 10220 v1.AddArg(x) 10221 v1.AddArg(x) 10222 v0.AddArg(v1) 10223 v.AddArg(v0) 10224 v.AddArg(a) 10225 return true 10226 } 10227 // match: (MULA x (MOVWconst [c]) a) 10228 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10229 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10230 for { 10231 _ = v.Args[2] 10232 x := v.Args[0] 10233 v_1 := v.Args[1] 10234 if v_1.Op != OpARMMOVWconst { 10235 break 10236 } 10237 c := v_1.AuxInt 10238 a := v.Args[2] 10239 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10240 break 10241 } 10242 v.reset(OpARMADD) 10243 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10244 v0.AuxInt = log2(c / 9) 10245 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10246 v1.AuxInt = 3 10247 v1.AddArg(x) 10248 v1.AddArg(x) 10249 v0.AddArg(v1) 10250 v.AddArg(v0) 10251 v.AddArg(a) 10252 return true 10253 } 10254 return false 10255 } 10256 func rewriteValueARM_OpARMMULA_10(v *Value) bool { 10257 b := v.Block 10258 _ = b 10259 // match: (MULA (MOVWconst [c]) x a) 10260 // cond: int32(c) == -1 10261 // result: (SUB a x) 10262 for { 10263 _ = v.Args[2] 10264 v_0 := v.Args[0] 10265 if v_0.Op != OpARMMOVWconst { 10266 break 10267 } 10268 c := v_0.AuxInt 10269 x := v.Args[1] 10270 a := v.Args[2] 10271 if !(int32(c) == -1) { 10272 break 10273 } 10274 v.reset(OpARMSUB) 10275 v.AddArg(a) 10276 v.AddArg(x) 10277 return true 10278 } 10279 // match: (MULA (MOVWconst [0]) _ a) 10280 // cond: 10281 // result: a 10282 for { 10283 _ = v.Args[2] 10284 v_0 := v.Args[0] 10285 if v_0.Op != OpARMMOVWconst { 10286 break 10287 } 10288 if v_0.AuxInt != 0 { 10289 break 10290 } 10291 a := v.Args[2] 10292 v.reset(OpCopy) 10293 v.Type = a.Type 10294 v.AddArg(a) 10295 return true 10296 } 10297 // match: (MULA (MOVWconst [1]) x a) 10298 // cond: 10299 // result: (ADD x a) 10300 for { 10301 _ = v.Args[2] 10302 v_0 := v.Args[0] 10303 if v_0.Op != OpARMMOVWconst { 10304 break 10305 } 10306 if v_0.AuxInt != 1 { 10307 break 10308 } 10309 x := v.Args[1] 10310 a := v.Args[2] 10311 v.reset(OpARMADD) 10312 v.AddArg(x) 10313 v.AddArg(a) 10314 return true 10315 } 10316 // match: (MULA (MOVWconst [c]) x a) 10317 // cond: isPowerOfTwo(c) 10318 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 10319 for { 10320 _ = v.Args[2] 10321 v_0 := v.Args[0] 10322 if v_0.Op != OpARMMOVWconst { 10323 break 10324 } 10325 c := v_0.AuxInt 10326 x := v.Args[1] 10327 a := v.Args[2] 10328 if !(isPowerOfTwo(c)) { 10329 break 10330 } 10331 v.reset(OpARMADD) 10332 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10333 v0.AuxInt = log2(c) 10334 v0.AddArg(x) 10335 v.AddArg(v0) 10336 v.AddArg(a) 10337 return true 10338 } 10339 // match: (MULA (MOVWconst [c]) x a) 10340 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10341 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 10342 for { 10343 _ = v.Args[2] 10344 v_0 := v.Args[0] 10345 if v_0.Op != OpARMMOVWconst { 10346 break 10347 } 10348 c := v_0.AuxInt 10349 x := v.Args[1] 10350 a := v.Args[2] 10351 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10352 break 10353 } 10354 v.reset(OpARMADD) 10355 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10356 v0.AuxInt = log2(c - 1) 10357 v0.AddArg(x) 10358 v0.AddArg(x) 10359 v.AddArg(v0) 10360 v.AddArg(a) 10361 return true 10362 } 10363 // match: (MULA (MOVWconst [c]) x a) 10364 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10365 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10366 for { 10367 _ = v.Args[2] 10368 v_0 := v.Args[0] 10369 if v_0.Op != OpARMMOVWconst { 10370 break 10371 } 10372 c := v_0.AuxInt 10373 x := v.Args[1] 10374 a := v.Args[2] 10375 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10376 break 10377 } 10378 v.reset(OpARMADD) 10379 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10380 v0.AuxInt = log2(c + 1) 10381 v0.AddArg(x) 10382 v0.AddArg(x) 10383 v.AddArg(v0) 10384 v.AddArg(a) 10385 return true 10386 } 10387 // match: (MULA (MOVWconst [c]) x a) 10388 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10389 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10390 for { 10391 _ = v.Args[2] 10392 v_0 := v.Args[0] 10393 if v_0.Op != OpARMMOVWconst { 10394 break 10395 } 10396 c := v_0.AuxInt 10397 x := v.Args[1] 10398 a := v.Args[2] 10399 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10400 break 10401 } 10402 v.reset(OpARMADD) 10403 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10404 v0.AuxInt = log2(c / 3) 10405 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10406 v1.AuxInt = 1 10407 v1.AddArg(x) 10408 v1.AddArg(x) 10409 v0.AddArg(v1) 10410 v.AddArg(v0) 10411 v.AddArg(a) 10412 return true 10413 } 10414 // match: (MULA (MOVWconst [c]) x a) 10415 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10416 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10417 for { 10418 _ = v.Args[2] 10419 v_0 := v.Args[0] 10420 if v_0.Op != OpARMMOVWconst { 10421 break 10422 } 10423 c := v_0.AuxInt 10424 x := v.Args[1] 10425 a := v.Args[2] 10426 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10427 break 10428 } 10429 v.reset(OpARMADD) 10430 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10431 v0.AuxInt = log2(c / 5) 10432 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10433 v1.AuxInt = 2 10434 v1.AddArg(x) 10435 v1.AddArg(x) 10436 v0.AddArg(v1) 10437 v.AddArg(v0) 10438 v.AddArg(a) 10439 return true 10440 } 10441 // match: (MULA (MOVWconst [c]) x a) 10442 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10443 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10444 for { 10445 _ = v.Args[2] 10446 v_0 := v.Args[0] 10447 if v_0.Op != OpARMMOVWconst { 10448 break 10449 } 10450 c := v_0.AuxInt 10451 x := v.Args[1] 10452 a := v.Args[2] 10453 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10454 break 10455 } 10456 v.reset(OpARMADD) 10457 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10458 v0.AuxInt = log2(c / 7) 10459 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10460 v1.AuxInt = 3 10461 v1.AddArg(x) 10462 v1.AddArg(x) 10463 v0.AddArg(v1) 10464 v.AddArg(v0) 10465 v.AddArg(a) 10466 return true 10467 } 10468 // match: (MULA (MOVWconst [c]) x a) 10469 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10470 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10471 for { 10472 _ = v.Args[2] 10473 v_0 := v.Args[0] 10474 if v_0.Op != OpARMMOVWconst { 10475 break 10476 } 10477 c := v_0.AuxInt 10478 x := v.Args[1] 10479 a := v.Args[2] 10480 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10481 break 10482 } 10483 v.reset(OpARMADD) 10484 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10485 v0.AuxInt = log2(c / 9) 10486 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10487 v1.AuxInt = 3 10488 v1.AddArg(x) 10489 v1.AddArg(x) 10490 v0.AddArg(v1) 10491 v.AddArg(v0) 10492 v.AddArg(a) 10493 return true 10494 } 10495 return false 10496 } 10497 func rewriteValueARM_OpARMMULA_20(v *Value) bool { 10498 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 10499 // cond: 10500 // result: (ADDconst [int64(int32(c*d))] a) 10501 for { 10502 _ = v.Args[2] 10503 v_0 := v.Args[0] 10504 if v_0.Op != OpARMMOVWconst { 10505 break 10506 } 10507 c := v_0.AuxInt 10508 v_1 := v.Args[1] 10509 if v_1.Op != OpARMMOVWconst { 10510 break 10511 } 10512 d := v_1.AuxInt 10513 a := v.Args[2] 10514 v.reset(OpARMADDconst) 10515 v.AuxInt = int64(int32(c * d)) 10516 v.AddArg(a) 10517 return true 10518 } 10519 return false 10520 } 10521 func rewriteValueARM_OpARMMULD_0(v *Value) bool { 10522 // match: (MULD (NEGD x) y) 10523 // cond: objabi.GOARM >= 6 10524 // result: (NMULD x y) 10525 for { 10526 _ = v.Args[1] 10527 v_0 := v.Args[0] 10528 if v_0.Op != OpARMNEGD { 10529 break 10530 } 10531 x := v_0.Args[0] 10532 y := v.Args[1] 10533 if !(objabi.GOARM >= 6) { 10534 break 10535 } 10536 v.reset(OpARMNMULD) 10537 v.AddArg(x) 10538 v.AddArg(y) 10539 return true 10540 } 10541 // match: (MULD y (NEGD x)) 10542 // cond: objabi.GOARM >= 6 10543 // result: (NMULD x y) 10544 for { 10545 _ = v.Args[1] 10546 y := v.Args[0] 10547 v_1 := v.Args[1] 10548 if v_1.Op != OpARMNEGD { 10549 break 10550 } 10551 x := v_1.Args[0] 10552 if !(objabi.GOARM >= 6) { 10553 break 10554 } 10555 v.reset(OpARMNMULD) 10556 v.AddArg(x) 10557 v.AddArg(y) 10558 return true 10559 } 10560 return false 10561 } 10562 func rewriteValueARM_OpARMMULF_0(v *Value) bool { 10563 // match: (MULF (NEGF x) y) 10564 // cond: objabi.GOARM >= 6 10565 // result: (NMULF x y) 10566 for { 10567 _ = v.Args[1] 10568 v_0 := v.Args[0] 10569 if v_0.Op != OpARMNEGF { 10570 break 10571 } 10572 x := v_0.Args[0] 10573 y := v.Args[1] 10574 if !(objabi.GOARM >= 6) { 10575 break 10576 } 10577 v.reset(OpARMNMULF) 10578 v.AddArg(x) 10579 v.AddArg(y) 10580 return true 10581 } 10582 // match: (MULF y (NEGF x)) 10583 // cond: objabi.GOARM >= 6 10584 // result: (NMULF x y) 10585 for { 10586 _ = v.Args[1] 10587 y := v.Args[0] 10588 v_1 := v.Args[1] 10589 if v_1.Op != OpARMNEGF { 10590 break 10591 } 10592 x := v_1.Args[0] 10593 if !(objabi.GOARM >= 6) { 10594 break 10595 } 10596 v.reset(OpARMNMULF) 10597 v.AddArg(x) 10598 v.AddArg(y) 10599 return true 10600 } 10601 return false 10602 } 10603 func rewriteValueARM_OpARMMULS_0(v *Value) bool { 10604 b := v.Block 10605 _ = b 10606 // match: (MULS x (MOVWconst [c]) a) 10607 // cond: int32(c) == -1 10608 // result: (ADD a x) 10609 for { 10610 _ = v.Args[2] 10611 x := v.Args[0] 10612 v_1 := v.Args[1] 10613 if v_1.Op != OpARMMOVWconst { 10614 break 10615 } 10616 c := v_1.AuxInt 10617 a := v.Args[2] 10618 if !(int32(c) == -1) { 10619 break 10620 } 10621 v.reset(OpARMADD) 10622 v.AddArg(a) 10623 v.AddArg(x) 10624 return true 10625 } 10626 // match: (MULS _ (MOVWconst [0]) a) 10627 // cond: 10628 // result: a 10629 for { 10630 _ = v.Args[2] 10631 v_1 := v.Args[1] 10632 if v_1.Op != OpARMMOVWconst { 10633 break 10634 } 10635 if v_1.AuxInt != 0 { 10636 break 10637 } 10638 a := v.Args[2] 10639 v.reset(OpCopy) 10640 v.Type = a.Type 10641 v.AddArg(a) 10642 return true 10643 } 10644 // match: (MULS x (MOVWconst [1]) a) 10645 // cond: 10646 // result: (RSB x a) 10647 for { 10648 _ = v.Args[2] 10649 x := v.Args[0] 10650 v_1 := v.Args[1] 10651 if v_1.Op != OpARMMOVWconst { 10652 break 10653 } 10654 if v_1.AuxInt != 1 { 10655 break 10656 } 10657 a := v.Args[2] 10658 v.reset(OpARMRSB) 10659 v.AddArg(x) 10660 v.AddArg(a) 10661 return true 10662 } 10663 // match: (MULS x (MOVWconst [c]) a) 10664 // cond: isPowerOfTwo(c) 10665 // result: (RSB (SLLconst <x.Type> [log2(c)] x) a) 10666 for { 10667 _ = v.Args[2] 10668 x := v.Args[0] 10669 v_1 := v.Args[1] 10670 if v_1.Op != OpARMMOVWconst { 10671 break 10672 } 10673 c := v_1.AuxInt 10674 a := v.Args[2] 10675 if !(isPowerOfTwo(c)) { 10676 break 10677 } 10678 v.reset(OpARMRSB) 10679 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10680 v0.AuxInt = log2(c) 10681 v0.AddArg(x) 10682 v.AddArg(v0) 10683 v.AddArg(a) 10684 return true 10685 } 10686 // match: (MULS x (MOVWconst [c]) a) 10687 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10688 // result: (RSB (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 10689 for { 10690 _ = v.Args[2] 10691 x := v.Args[0] 10692 v_1 := v.Args[1] 10693 if v_1.Op != OpARMMOVWconst { 10694 break 10695 } 10696 c := v_1.AuxInt 10697 a := v.Args[2] 10698 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10699 break 10700 } 10701 v.reset(OpARMRSB) 10702 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10703 v0.AuxInt = log2(c - 1) 10704 v0.AddArg(x) 10705 v0.AddArg(x) 10706 v.AddArg(v0) 10707 v.AddArg(a) 10708 return true 10709 } 10710 // match: (MULS x (MOVWconst [c]) a) 10711 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10712 // result: (RSB (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10713 for { 10714 _ = v.Args[2] 10715 x := v.Args[0] 10716 v_1 := v.Args[1] 10717 if v_1.Op != OpARMMOVWconst { 10718 break 10719 } 10720 c := v_1.AuxInt 10721 a := v.Args[2] 10722 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10723 break 10724 } 10725 v.reset(OpARMRSB) 10726 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10727 v0.AuxInt = log2(c + 1) 10728 v0.AddArg(x) 10729 v0.AddArg(x) 10730 v.AddArg(v0) 10731 v.AddArg(a) 10732 return true 10733 } 10734 // match: (MULS x (MOVWconst [c]) a) 10735 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10736 // result: (RSB (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10737 for { 10738 _ = v.Args[2] 10739 x := v.Args[0] 10740 v_1 := v.Args[1] 10741 if v_1.Op != OpARMMOVWconst { 10742 break 10743 } 10744 c := v_1.AuxInt 10745 a := v.Args[2] 10746 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10747 break 10748 } 10749 v.reset(OpARMRSB) 10750 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10751 v0.AuxInt = log2(c / 3) 10752 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10753 v1.AuxInt = 1 10754 v1.AddArg(x) 10755 v1.AddArg(x) 10756 v0.AddArg(v1) 10757 v.AddArg(v0) 10758 v.AddArg(a) 10759 return true 10760 } 10761 // match: (MULS x (MOVWconst [c]) a) 10762 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10763 // result: (RSB (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10764 for { 10765 _ = v.Args[2] 10766 x := v.Args[0] 10767 v_1 := v.Args[1] 10768 if v_1.Op != OpARMMOVWconst { 10769 break 10770 } 10771 c := v_1.AuxInt 10772 a := v.Args[2] 10773 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10774 break 10775 } 10776 v.reset(OpARMRSB) 10777 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10778 v0.AuxInt = log2(c / 5) 10779 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10780 v1.AuxInt = 2 10781 v1.AddArg(x) 10782 v1.AddArg(x) 10783 v0.AddArg(v1) 10784 v.AddArg(v0) 10785 v.AddArg(a) 10786 return true 10787 } 10788 // match: (MULS x (MOVWconst [c]) a) 10789 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10790 // result: (RSB (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10791 for { 10792 _ = v.Args[2] 10793 x := v.Args[0] 10794 v_1 := v.Args[1] 10795 if v_1.Op != OpARMMOVWconst { 10796 break 10797 } 10798 c := v_1.AuxInt 10799 a := v.Args[2] 10800 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10801 break 10802 } 10803 v.reset(OpARMRSB) 10804 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10805 v0.AuxInt = log2(c / 7) 10806 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10807 v1.AuxInt = 3 10808 v1.AddArg(x) 10809 v1.AddArg(x) 10810 v0.AddArg(v1) 10811 v.AddArg(v0) 10812 v.AddArg(a) 10813 return true 10814 } 10815 // match: (MULS x (MOVWconst [c]) a) 10816 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10817 // result: (RSB (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10818 for { 10819 _ = v.Args[2] 10820 x := v.Args[0] 10821 v_1 := v.Args[1] 10822 if v_1.Op != OpARMMOVWconst { 10823 break 10824 } 10825 c := v_1.AuxInt 10826 a := v.Args[2] 10827 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10828 break 10829 } 10830 v.reset(OpARMRSB) 10831 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10832 v0.AuxInt = log2(c / 9) 10833 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10834 v1.AuxInt = 3 10835 v1.AddArg(x) 10836 v1.AddArg(x) 10837 v0.AddArg(v1) 10838 v.AddArg(v0) 10839 v.AddArg(a) 10840 return true 10841 } 10842 return false 10843 } 10844 func rewriteValueARM_OpARMMULS_10(v *Value) bool { 10845 b := v.Block 10846 _ = b 10847 // match: (MULS (MOVWconst [c]) x a) 10848 // cond: int32(c) == -1 10849 // result: (ADD a x) 10850 for { 10851 _ = v.Args[2] 10852 v_0 := v.Args[0] 10853 if v_0.Op != OpARMMOVWconst { 10854 break 10855 } 10856 c := v_0.AuxInt 10857 x := v.Args[1] 10858 a := v.Args[2] 10859 if !(int32(c) == -1) { 10860 break 10861 } 10862 v.reset(OpARMADD) 10863 v.AddArg(a) 10864 v.AddArg(x) 10865 return true 10866 } 10867 // match: (MULS (MOVWconst [0]) _ a) 10868 // cond: 10869 // result: a 10870 for { 10871 _ = v.Args[2] 10872 v_0 := v.Args[0] 10873 if v_0.Op != OpARMMOVWconst { 10874 break 10875 } 10876 if v_0.AuxInt != 0 { 10877 break 10878 } 10879 a := v.Args[2] 10880 v.reset(OpCopy) 10881 v.Type = a.Type 10882 v.AddArg(a) 10883 return true 10884 } 10885 // match: (MULS (MOVWconst [1]) x a) 10886 // cond: 10887 // result: (RSB x a) 10888 for { 10889 _ = v.Args[2] 10890 v_0 := v.Args[0] 10891 if v_0.Op != OpARMMOVWconst { 10892 break 10893 } 10894 if v_0.AuxInt != 1 { 10895 break 10896 } 10897 x := v.Args[1] 10898 a := v.Args[2] 10899 v.reset(OpARMRSB) 10900 v.AddArg(x) 10901 v.AddArg(a) 10902 return true 10903 } 10904 // match: (MULS (MOVWconst [c]) x a) 10905 // cond: isPowerOfTwo(c) 10906 // result: (RSB (SLLconst <x.Type> [log2(c)] x) a) 10907 for { 10908 _ = v.Args[2] 10909 v_0 := v.Args[0] 10910 if v_0.Op != OpARMMOVWconst { 10911 break 10912 } 10913 c := v_0.AuxInt 10914 x := v.Args[1] 10915 a := v.Args[2] 10916 if !(isPowerOfTwo(c)) { 10917 break 10918 } 10919 v.reset(OpARMRSB) 10920 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10921 v0.AuxInt = log2(c) 10922 v0.AddArg(x) 10923 v.AddArg(v0) 10924 v.AddArg(a) 10925 return true 10926 } 10927 // match: (MULS (MOVWconst [c]) x a) 10928 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10929 // result: (RSB (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 10930 for { 10931 _ = v.Args[2] 10932 v_0 := v.Args[0] 10933 if v_0.Op != OpARMMOVWconst { 10934 break 10935 } 10936 c := v_0.AuxInt 10937 x := v.Args[1] 10938 a := v.Args[2] 10939 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10940 break 10941 } 10942 v.reset(OpARMRSB) 10943 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10944 v0.AuxInt = log2(c - 1) 10945 v0.AddArg(x) 10946 v0.AddArg(x) 10947 v.AddArg(v0) 10948 v.AddArg(a) 10949 return true 10950 } 10951 // match: (MULS (MOVWconst [c]) x a) 10952 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10953 // result: (RSB (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10954 for { 10955 _ = v.Args[2] 10956 v_0 := v.Args[0] 10957 if v_0.Op != OpARMMOVWconst { 10958 break 10959 } 10960 c := v_0.AuxInt 10961 x := v.Args[1] 10962 a := v.Args[2] 10963 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10964 break 10965 } 10966 v.reset(OpARMRSB) 10967 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10968 v0.AuxInt = log2(c + 1) 10969 v0.AddArg(x) 10970 v0.AddArg(x) 10971 v.AddArg(v0) 10972 v.AddArg(a) 10973 return true 10974 } 10975 // match: (MULS (MOVWconst [c]) x a) 10976 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10977 // result: (RSB (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10978 for { 10979 _ = v.Args[2] 10980 v_0 := v.Args[0] 10981 if v_0.Op != OpARMMOVWconst { 10982 break 10983 } 10984 c := v_0.AuxInt 10985 x := v.Args[1] 10986 a := v.Args[2] 10987 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10988 break 10989 } 10990 v.reset(OpARMRSB) 10991 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10992 v0.AuxInt = log2(c / 3) 10993 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10994 v1.AuxInt = 1 10995 v1.AddArg(x) 10996 v1.AddArg(x) 10997 v0.AddArg(v1) 10998 v.AddArg(v0) 10999 v.AddArg(a) 11000 return true 11001 } 11002 // match: (MULS (MOVWconst [c]) x a) 11003 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 11004 // result: (RSB (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 11005 for { 11006 _ = v.Args[2] 11007 v_0 := v.Args[0] 11008 if v_0.Op != OpARMMOVWconst { 11009 break 11010 } 11011 c := v_0.AuxInt 11012 x := v.Args[1] 11013 a := v.Args[2] 11014 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 11015 break 11016 } 11017 v.reset(OpARMRSB) 11018 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11019 v0.AuxInt = log2(c / 5) 11020 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 11021 v1.AuxInt = 2 11022 v1.AddArg(x) 11023 v1.AddArg(x) 11024 v0.AddArg(v1) 11025 v.AddArg(v0) 11026 v.AddArg(a) 11027 return true 11028 } 11029 // match: (MULS (MOVWconst [c]) x a) 11030 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 11031 // result: (RSB (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 11032 for { 11033 _ = v.Args[2] 11034 v_0 := v.Args[0] 11035 if v_0.Op != OpARMMOVWconst { 11036 break 11037 } 11038 c := v_0.AuxInt 11039 x := v.Args[1] 11040 a := v.Args[2] 11041 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 11042 break 11043 } 11044 v.reset(OpARMRSB) 11045 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11046 v0.AuxInt = log2(c / 7) 11047 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 11048 v1.AuxInt = 3 11049 v1.AddArg(x) 11050 v1.AddArg(x) 11051 v0.AddArg(v1) 11052 v.AddArg(v0) 11053 v.AddArg(a) 11054 return true 11055 } 11056 // match: (MULS (MOVWconst [c]) x a) 11057 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 11058 // result: (RSB (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 11059 for { 11060 _ = v.Args[2] 11061 v_0 := v.Args[0] 11062 if v_0.Op != OpARMMOVWconst { 11063 break 11064 } 11065 c := v_0.AuxInt 11066 x := v.Args[1] 11067 a := v.Args[2] 11068 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 11069 break 11070 } 11071 v.reset(OpARMRSB) 11072 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11073 v0.AuxInt = log2(c / 9) 11074 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 11075 v1.AuxInt = 3 11076 v1.AddArg(x) 11077 v1.AddArg(x) 11078 v0.AddArg(v1) 11079 v.AddArg(v0) 11080 v.AddArg(a) 11081 return true 11082 } 11083 return false 11084 } 11085 func rewriteValueARM_OpARMMULS_20(v *Value) bool { 11086 // match: (MULS (MOVWconst [c]) (MOVWconst [d]) a) 11087 // cond: 11088 // result: (SUBconst [int64(int32(c*d))] a) 11089 for { 11090 _ = v.Args[2] 11091 v_0 := v.Args[0] 11092 if v_0.Op != OpARMMOVWconst { 11093 break 11094 } 11095 c := v_0.AuxInt 11096 v_1 := v.Args[1] 11097 if v_1.Op != OpARMMOVWconst { 11098 break 11099 } 11100 d := v_1.AuxInt 11101 a := v.Args[2] 11102 v.reset(OpARMSUBconst) 11103 v.AuxInt = int64(int32(c * d)) 11104 v.AddArg(a) 11105 return true 11106 } 11107 return false 11108 } 11109 func rewriteValueARM_OpARMMVN_0(v *Value) bool { 11110 // match: (MVN (MOVWconst [c])) 11111 // cond: 11112 // result: (MOVWconst [^c]) 11113 for { 11114 v_0 := v.Args[0] 11115 if v_0.Op != OpARMMOVWconst { 11116 break 11117 } 11118 c := v_0.AuxInt 11119 v.reset(OpARMMOVWconst) 11120 v.AuxInt = ^c 11121 return true 11122 } 11123 // match: (MVN (SLLconst [c] x)) 11124 // cond: 11125 // result: (MVNshiftLL x [c]) 11126 for { 11127 v_0 := v.Args[0] 11128 if v_0.Op != OpARMSLLconst { 11129 break 11130 } 11131 c := v_0.AuxInt 11132 x := v_0.Args[0] 11133 v.reset(OpARMMVNshiftLL) 11134 v.AuxInt = c 11135 v.AddArg(x) 11136 return true 11137 } 11138 // match: (MVN (SRLconst [c] x)) 11139 // cond: 11140 // result: (MVNshiftRL x [c]) 11141 for { 11142 v_0 := v.Args[0] 11143 if v_0.Op != OpARMSRLconst { 11144 break 11145 } 11146 c := v_0.AuxInt 11147 x := v_0.Args[0] 11148 v.reset(OpARMMVNshiftRL) 11149 v.AuxInt = c 11150 v.AddArg(x) 11151 return true 11152 } 11153 // match: (MVN (SRAconst [c] x)) 11154 // cond: 11155 // result: (MVNshiftRA x [c]) 11156 for { 11157 v_0 := v.Args[0] 11158 if v_0.Op != OpARMSRAconst { 11159 break 11160 } 11161 c := v_0.AuxInt 11162 x := v_0.Args[0] 11163 v.reset(OpARMMVNshiftRA) 11164 v.AuxInt = c 11165 v.AddArg(x) 11166 return true 11167 } 11168 // match: (MVN (SLL x y)) 11169 // cond: 11170 // result: (MVNshiftLLreg x y) 11171 for { 11172 v_0 := v.Args[0] 11173 if v_0.Op != OpARMSLL { 11174 break 11175 } 11176 _ = v_0.Args[1] 11177 x := v_0.Args[0] 11178 y := v_0.Args[1] 11179 v.reset(OpARMMVNshiftLLreg) 11180 v.AddArg(x) 11181 v.AddArg(y) 11182 return true 11183 } 11184 // match: (MVN (SRL x y)) 11185 // cond: 11186 // result: (MVNshiftRLreg x y) 11187 for { 11188 v_0 := v.Args[0] 11189 if v_0.Op != OpARMSRL { 11190 break 11191 } 11192 _ = v_0.Args[1] 11193 x := v_0.Args[0] 11194 y := v_0.Args[1] 11195 v.reset(OpARMMVNshiftRLreg) 11196 v.AddArg(x) 11197 v.AddArg(y) 11198 return true 11199 } 11200 // match: (MVN (SRA x y)) 11201 // cond: 11202 // result: (MVNshiftRAreg x y) 11203 for { 11204 v_0 := v.Args[0] 11205 if v_0.Op != OpARMSRA { 11206 break 11207 } 11208 _ = v_0.Args[1] 11209 x := v_0.Args[0] 11210 y := v_0.Args[1] 11211 v.reset(OpARMMVNshiftRAreg) 11212 v.AddArg(x) 11213 v.AddArg(y) 11214 return true 11215 } 11216 return false 11217 } 11218 func rewriteValueARM_OpARMMVNshiftLL_0(v *Value) bool { 11219 // match: (MVNshiftLL (MOVWconst [c]) [d]) 11220 // cond: 11221 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 11222 for { 11223 d := v.AuxInt 11224 v_0 := v.Args[0] 11225 if v_0.Op != OpARMMOVWconst { 11226 break 11227 } 11228 c := v_0.AuxInt 11229 v.reset(OpARMMOVWconst) 11230 v.AuxInt = ^int64(uint32(c) << uint64(d)) 11231 return true 11232 } 11233 return false 11234 } 11235 func rewriteValueARM_OpARMMVNshiftLLreg_0(v *Value) bool { 11236 // match: (MVNshiftLLreg x (MOVWconst [c])) 11237 // cond: 11238 // result: (MVNshiftLL x [c]) 11239 for { 11240 _ = v.Args[1] 11241 x := v.Args[0] 11242 v_1 := v.Args[1] 11243 if v_1.Op != OpARMMOVWconst { 11244 break 11245 } 11246 c := v_1.AuxInt 11247 v.reset(OpARMMVNshiftLL) 11248 v.AuxInt = c 11249 v.AddArg(x) 11250 return true 11251 } 11252 return false 11253 } 11254 func rewriteValueARM_OpARMMVNshiftRA_0(v *Value) bool { 11255 // match: (MVNshiftRA (MOVWconst [c]) [d]) 11256 // cond: 11257 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 11258 for { 11259 d := v.AuxInt 11260 v_0 := v.Args[0] 11261 if v_0.Op != OpARMMOVWconst { 11262 break 11263 } 11264 c := v_0.AuxInt 11265 v.reset(OpARMMOVWconst) 11266 v.AuxInt = ^int64(int32(c) >> uint64(d)) 11267 return true 11268 } 11269 return false 11270 } 11271 func rewriteValueARM_OpARMMVNshiftRAreg_0(v *Value) bool { 11272 // match: (MVNshiftRAreg x (MOVWconst [c])) 11273 // cond: 11274 // result: (MVNshiftRA x [c]) 11275 for { 11276 _ = v.Args[1] 11277 x := v.Args[0] 11278 v_1 := v.Args[1] 11279 if v_1.Op != OpARMMOVWconst { 11280 break 11281 } 11282 c := v_1.AuxInt 11283 v.reset(OpARMMVNshiftRA) 11284 v.AuxInt = c 11285 v.AddArg(x) 11286 return true 11287 } 11288 return false 11289 } 11290 func rewriteValueARM_OpARMMVNshiftRL_0(v *Value) bool { 11291 // match: (MVNshiftRL (MOVWconst [c]) [d]) 11292 // cond: 11293 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 11294 for { 11295 d := v.AuxInt 11296 v_0 := v.Args[0] 11297 if v_0.Op != OpARMMOVWconst { 11298 break 11299 } 11300 c := v_0.AuxInt 11301 v.reset(OpARMMOVWconst) 11302 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 11303 return true 11304 } 11305 return false 11306 } 11307 func rewriteValueARM_OpARMMVNshiftRLreg_0(v *Value) bool { 11308 // match: (MVNshiftRLreg x (MOVWconst [c])) 11309 // cond: 11310 // result: (MVNshiftRL x [c]) 11311 for { 11312 _ = v.Args[1] 11313 x := v.Args[0] 11314 v_1 := v.Args[1] 11315 if v_1.Op != OpARMMOVWconst { 11316 break 11317 } 11318 c := v_1.AuxInt 11319 v.reset(OpARMMVNshiftRL) 11320 v.AuxInt = c 11321 v.AddArg(x) 11322 return true 11323 } 11324 return false 11325 } 11326 func rewriteValueARM_OpARMNEGD_0(v *Value) bool { 11327 // match: (NEGD (MULD x y)) 11328 // cond: objabi.GOARM >= 6 11329 // result: (NMULD x y) 11330 for { 11331 v_0 := v.Args[0] 11332 if v_0.Op != OpARMMULD { 11333 break 11334 } 11335 _ = v_0.Args[1] 11336 x := v_0.Args[0] 11337 y := v_0.Args[1] 11338 if !(objabi.GOARM >= 6) { 11339 break 11340 } 11341 v.reset(OpARMNMULD) 11342 v.AddArg(x) 11343 v.AddArg(y) 11344 return true 11345 } 11346 return false 11347 } 11348 func rewriteValueARM_OpARMNEGF_0(v *Value) bool { 11349 // match: (NEGF (MULF x y)) 11350 // cond: objabi.GOARM >= 6 11351 // result: (NMULF x y) 11352 for { 11353 v_0 := v.Args[0] 11354 if v_0.Op != OpARMMULF { 11355 break 11356 } 11357 _ = v_0.Args[1] 11358 x := v_0.Args[0] 11359 y := v_0.Args[1] 11360 if !(objabi.GOARM >= 6) { 11361 break 11362 } 11363 v.reset(OpARMNMULF) 11364 v.AddArg(x) 11365 v.AddArg(y) 11366 return true 11367 } 11368 return false 11369 } 11370 func rewriteValueARM_OpARMNMULD_0(v *Value) bool { 11371 // match: (NMULD (NEGD x) y) 11372 // cond: 11373 // result: (MULD x y) 11374 for { 11375 _ = v.Args[1] 11376 v_0 := v.Args[0] 11377 if v_0.Op != OpARMNEGD { 11378 break 11379 } 11380 x := v_0.Args[0] 11381 y := v.Args[1] 11382 v.reset(OpARMMULD) 11383 v.AddArg(x) 11384 v.AddArg(y) 11385 return true 11386 } 11387 // match: (NMULD y (NEGD x)) 11388 // cond: 11389 // result: (MULD x y) 11390 for { 11391 _ = v.Args[1] 11392 y := v.Args[0] 11393 v_1 := v.Args[1] 11394 if v_1.Op != OpARMNEGD { 11395 break 11396 } 11397 x := v_1.Args[0] 11398 v.reset(OpARMMULD) 11399 v.AddArg(x) 11400 v.AddArg(y) 11401 return true 11402 } 11403 return false 11404 } 11405 func rewriteValueARM_OpARMNMULF_0(v *Value) bool { 11406 // match: (NMULF (NEGF x) y) 11407 // cond: 11408 // result: (MULF x y) 11409 for { 11410 _ = v.Args[1] 11411 v_0 := v.Args[0] 11412 if v_0.Op != OpARMNEGF { 11413 break 11414 } 11415 x := v_0.Args[0] 11416 y := v.Args[1] 11417 v.reset(OpARMMULF) 11418 v.AddArg(x) 11419 v.AddArg(y) 11420 return true 11421 } 11422 // match: (NMULF y (NEGF x)) 11423 // cond: 11424 // result: (MULF x y) 11425 for { 11426 _ = v.Args[1] 11427 y := v.Args[0] 11428 v_1 := v.Args[1] 11429 if v_1.Op != OpARMNEGF { 11430 break 11431 } 11432 x := v_1.Args[0] 11433 v.reset(OpARMMULF) 11434 v.AddArg(x) 11435 v.AddArg(y) 11436 return true 11437 } 11438 return false 11439 } 11440 func rewriteValueARM_OpARMNotEqual_0(v *Value) bool { 11441 // match: (NotEqual (FlagEQ)) 11442 // cond: 11443 // result: (MOVWconst [0]) 11444 for { 11445 v_0 := v.Args[0] 11446 if v_0.Op != OpARMFlagEQ { 11447 break 11448 } 11449 v.reset(OpARMMOVWconst) 11450 v.AuxInt = 0 11451 return true 11452 } 11453 // match: (NotEqual (FlagLT_ULT)) 11454 // cond: 11455 // result: (MOVWconst [1]) 11456 for { 11457 v_0 := v.Args[0] 11458 if v_0.Op != OpARMFlagLT_ULT { 11459 break 11460 } 11461 v.reset(OpARMMOVWconst) 11462 v.AuxInt = 1 11463 return true 11464 } 11465 // match: (NotEqual (FlagLT_UGT)) 11466 // cond: 11467 // result: (MOVWconst [1]) 11468 for { 11469 v_0 := v.Args[0] 11470 if v_0.Op != OpARMFlagLT_UGT { 11471 break 11472 } 11473 v.reset(OpARMMOVWconst) 11474 v.AuxInt = 1 11475 return true 11476 } 11477 // match: (NotEqual (FlagGT_ULT)) 11478 // cond: 11479 // result: (MOVWconst [1]) 11480 for { 11481 v_0 := v.Args[0] 11482 if v_0.Op != OpARMFlagGT_ULT { 11483 break 11484 } 11485 v.reset(OpARMMOVWconst) 11486 v.AuxInt = 1 11487 return true 11488 } 11489 // match: (NotEqual (FlagGT_UGT)) 11490 // cond: 11491 // result: (MOVWconst [1]) 11492 for { 11493 v_0 := v.Args[0] 11494 if v_0.Op != OpARMFlagGT_UGT { 11495 break 11496 } 11497 v.reset(OpARMMOVWconst) 11498 v.AuxInt = 1 11499 return true 11500 } 11501 // match: (NotEqual (InvertFlags x)) 11502 // cond: 11503 // result: (NotEqual x) 11504 for { 11505 v_0 := v.Args[0] 11506 if v_0.Op != OpARMInvertFlags { 11507 break 11508 } 11509 x := v_0.Args[0] 11510 v.reset(OpARMNotEqual) 11511 v.AddArg(x) 11512 return true 11513 } 11514 return false 11515 } 11516 func rewriteValueARM_OpARMOR_0(v *Value) bool { 11517 // match: (OR x (MOVWconst [c])) 11518 // cond: 11519 // result: (ORconst [c] x) 11520 for { 11521 _ = v.Args[1] 11522 x := v.Args[0] 11523 v_1 := v.Args[1] 11524 if v_1.Op != OpARMMOVWconst { 11525 break 11526 } 11527 c := v_1.AuxInt 11528 v.reset(OpARMORconst) 11529 v.AuxInt = c 11530 v.AddArg(x) 11531 return true 11532 } 11533 // match: (OR (MOVWconst [c]) x) 11534 // cond: 11535 // result: (ORconst [c] x) 11536 for { 11537 _ = v.Args[1] 11538 v_0 := v.Args[0] 11539 if v_0.Op != OpARMMOVWconst { 11540 break 11541 } 11542 c := v_0.AuxInt 11543 x := v.Args[1] 11544 v.reset(OpARMORconst) 11545 v.AuxInt = c 11546 v.AddArg(x) 11547 return true 11548 } 11549 // match: (OR x (SLLconst [c] y)) 11550 // cond: 11551 // result: (ORshiftLL x y [c]) 11552 for { 11553 _ = v.Args[1] 11554 x := v.Args[0] 11555 v_1 := v.Args[1] 11556 if v_1.Op != OpARMSLLconst { 11557 break 11558 } 11559 c := v_1.AuxInt 11560 y := v_1.Args[0] 11561 v.reset(OpARMORshiftLL) 11562 v.AuxInt = c 11563 v.AddArg(x) 11564 v.AddArg(y) 11565 return true 11566 } 11567 // match: (OR (SLLconst [c] y) x) 11568 // cond: 11569 // result: (ORshiftLL x y [c]) 11570 for { 11571 _ = v.Args[1] 11572 v_0 := v.Args[0] 11573 if v_0.Op != OpARMSLLconst { 11574 break 11575 } 11576 c := v_0.AuxInt 11577 y := v_0.Args[0] 11578 x := v.Args[1] 11579 v.reset(OpARMORshiftLL) 11580 v.AuxInt = c 11581 v.AddArg(x) 11582 v.AddArg(y) 11583 return true 11584 } 11585 // match: (OR x (SRLconst [c] y)) 11586 // cond: 11587 // result: (ORshiftRL x y [c]) 11588 for { 11589 _ = v.Args[1] 11590 x := v.Args[0] 11591 v_1 := v.Args[1] 11592 if v_1.Op != OpARMSRLconst { 11593 break 11594 } 11595 c := v_1.AuxInt 11596 y := v_1.Args[0] 11597 v.reset(OpARMORshiftRL) 11598 v.AuxInt = c 11599 v.AddArg(x) 11600 v.AddArg(y) 11601 return true 11602 } 11603 // match: (OR (SRLconst [c] y) x) 11604 // cond: 11605 // result: (ORshiftRL x y [c]) 11606 for { 11607 _ = v.Args[1] 11608 v_0 := v.Args[0] 11609 if v_0.Op != OpARMSRLconst { 11610 break 11611 } 11612 c := v_0.AuxInt 11613 y := v_0.Args[0] 11614 x := v.Args[1] 11615 v.reset(OpARMORshiftRL) 11616 v.AuxInt = c 11617 v.AddArg(x) 11618 v.AddArg(y) 11619 return true 11620 } 11621 // match: (OR x (SRAconst [c] y)) 11622 // cond: 11623 // result: (ORshiftRA x y [c]) 11624 for { 11625 _ = v.Args[1] 11626 x := v.Args[0] 11627 v_1 := v.Args[1] 11628 if v_1.Op != OpARMSRAconst { 11629 break 11630 } 11631 c := v_1.AuxInt 11632 y := v_1.Args[0] 11633 v.reset(OpARMORshiftRA) 11634 v.AuxInt = c 11635 v.AddArg(x) 11636 v.AddArg(y) 11637 return true 11638 } 11639 // match: (OR (SRAconst [c] y) x) 11640 // cond: 11641 // result: (ORshiftRA x y [c]) 11642 for { 11643 _ = v.Args[1] 11644 v_0 := v.Args[0] 11645 if v_0.Op != OpARMSRAconst { 11646 break 11647 } 11648 c := v_0.AuxInt 11649 y := v_0.Args[0] 11650 x := v.Args[1] 11651 v.reset(OpARMORshiftRA) 11652 v.AuxInt = c 11653 v.AddArg(x) 11654 v.AddArg(y) 11655 return true 11656 } 11657 // match: (OR x (SLL y z)) 11658 // cond: 11659 // result: (ORshiftLLreg x y z) 11660 for { 11661 _ = v.Args[1] 11662 x := v.Args[0] 11663 v_1 := v.Args[1] 11664 if v_1.Op != OpARMSLL { 11665 break 11666 } 11667 _ = v_1.Args[1] 11668 y := v_1.Args[0] 11669 z := v_1.Args[1] 11670 v.reset(OpARMORshiftLLreg) 11671 v.AddArg(x) 11672 v.AddArg(y) 11673 v.AddArg(z) 11674 return true 11675 } 11676 // match: (OR (SLL y z) x) 11677 // cond: 11678 // result: (ORshiftLLreg x y z) 11679 for { 11680 _ = v.Args[1] 11681 v_0 := v.Args[0] 11682 if v_0.Op != OpARMSLL { 11683 break 11684 } 11685 _ = v_0.Args[1] 11686 y := v_0.Args[0] 11687 z := v_0.Args[1] 11688 x := v.Args[1] 11689 v.reset(OpARMORshiftLLreg) 11690 v.AddArg(x) 11691 v.AddArg(y) 11692 v.AddArg(z) 11693 return true 11694 } 11695 return false 11696 } 11697 func rewriteValueARM_OpARMOR_10(v *Value) bool { 11698 // match: (OR x (SRL y z)) 11699 // cond: 11700 // result: (ORshiftRLreg x y z) 11701 for { 11702 _ = v.Args[1] 11703 x := v.Args[0] 11704 v_1 := v.Args[1] 11705 if v_1.Op != OpARMSRL { 11706 break 11707 } 11708 _ = v_1.Args[1] 11709 y := v_1.Args[0] 11710 z := v_1.Args[1] 11711 v.reset(OpARMORshiftRLreg) 11712 v.AddArg(x) 11713 v.AddArg(y) 11714 v.AddArg(z) 11715 return true 11716 } 11717 // match: (OR (SRL y z) x) 11718 // cond: 11719 // result: (ORshiftRLreg x y z) 11720 for { 11721 _ = v.Args[1] 11722 v_0 := v.Args[0] 11723 if v_0.Op != OpARMSRL { 11724 break 11725 } 11726 _ = v_0.Args[1] 11727 y := v_0.Args[0] 11728 z := v_0.Args[1] 11729 x := v.Args[1] 11730 v.reset(OpARMORshiftRLreg) 11731 v.AddArg(x) 11732 v.AddArg(y) 11733 v.AddArg(z) 11734 return true 11735 } 11736 // match: (OR x (SRA y z)) 11737 // cond: 11738 // result: (ORshiftRAreg x y z) 11739 for { 11740 _ = v.Args[1] 11741 x := v.Args[0] 11742 v_1 := v.Args[1] 11743 if v_1.Op != OpARMSRA { 11744 break 11745 } 11746 _ = v_1.Args[1] 11747 y := v_1.Args[0] 11748 z := v_1.Args[1] 11749 v.reset(OpARMORshiftRAreg) 11750 v.AddArg(x) 11751 v.AddArg(y) 11752 v.AddArg(z) 11753 return true 11754 } 11755 // match: (OR (SRA y z) x) 11756 // cond: 11757 // result: (ORshiftRAreg x y z) 11758 for { 11759 _ = v.Args[1] 11760 v_0 := v.Args[0] 11761 if v_0.Op != OpARMSRA { 11762 break 11763 } 11764 _ = v_0.Args[1] 11765 y := v_0.Args[0] 11766 z := v_0.Args[1] 11767 x := v.Args[1] 11768 v.reset(OpARMORshiftRAreg) 11769 v.AddArg(x) 11770 v.AddArg(y) 11771 v.AddArg(z) 11772 return true 11773 } 11774 // match: (OR x x) 11775 // cond: 11776 // result: x 11777 for { 11778 _ = v.Args[1] 11779 x := v.Args[0] 11780 if x != v.Args[1] { 11781 break 11782 } 11783 v.reset(OpCopy) 11784 v.Type = x.Type 11785 v.AddArg(x) 11786 return true 11787 } 11788 return false 11789 } 11790 func rewriteValueARM_OpARMORconst_0(v *Value) bool { 11791 // match: (ORconst [0] x) 11792 // cond: 11793 // result: x 11794 for { 11795 if v.AuxInt != 0 { 11796 break 11797 } 11798 x := v.Args[0] 11799 v.reset(OpCopy) 11800 v.Type = x.Type 11801 v.AddArg(x) 11802 return true 11803 } 11804 // match: (ORconst [c] _) 11805 // cond: int32(c)==-1 11806 // result: (MOVWconst [-1]) 11807 for { 11808 c := v.AuxInt 11809 if !(int32(c) == -1) { 11810 break 11811 } 11812 v.reset(OpARMMOVWconst) 11813 v.AuxInt = -1 11814 return true 11815 } 11816 // match: (ORconst [c] (MOVWconst [d])) 11817 // cond: 11818 // result: (MOVWconst [c|d]) 11819 for { 11820 c := v.AuxInt 11821 v_0 := v.Args[0] 11822 if v_0.Op != OpARMMOVWconst { 11823 break 11824 } 11825 d := v_0.AuxInt 11826 v.reset(OpARMMOVWconst) 11827 v.AuxInt = c | d 11828 return true 11829 } 11830 // match: (ORconst [c] (ORconst [d] x)) 11831 // cond: 11832 // result: (ORconst [c|d] x) 11833 for { 11834 c := v.AuxInt 11835 v_0 := v.Args[0] 11836 if v_0.Op != OpARMORconst { 11837 break 11838 } 11839 d := v_0.AuxInt 11840 x := v_0.Args[0] 11841 v.reset(OpARMORconst) 11842 v.AuxInt = c | d 11843 v.AddArg(x) 11844 return true 11845 } 11846 return false 11847 } 11848 func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { 11849 b := v.Block 11850 _ = b 11851 // match: (ORshiftLL (MOVWconst [c]) x [d]) 11852 // cond: 11853 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 11854 for { 11855 d := v.AuxInt 11856 _ = v.Args[1] 11857 v_0 := v.Args[0] 11858 if v_0.Op != OpARMMOVWconst { 11859 break 11860 } 11861 c := v_0.AuxInt 11862 x := v.Args[1] 11863 v.reset(OpARMORconst) 11864 v.AuxInt = c 11865 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11866 v0.AuxInt = d 11867 v0.AddArg(x) 11868 v.AddArg(v0) 11869 return true 11870 } 11871 // match: (ORshiftLL x (MOVWconst [c]) [d]) 11872 // cond: 11873 // result: (ORconst x [int64(int32(uint32(c)<<uint64(d)))]) 11874 for { 11875 d := v.AuxInt 11876 _ = v.Args[1] 11877 x := v.Args[0] 11878 v_1 := v.Args[1] 11879 if v_1.Op != OpARMMOVWconst { 11880 break 11881 } 11882 c := v_1.AuxInt 11883 v.reset(OpARMORconst) 11884 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 11885 v.AddArg(x) 11886 return true 11887 } 11888 // match: (ORshiftLL [c] (SRLconst x [32-c]) x) 11889 // cond: 11890 // result: (SRRconst [32-c] x) 11891 for { 11892 c := v.AuxInt 11893 _ = v.Args[1] 11894 v_0 := v.Args[0] 11895 if v_0.Op != OpARMSRLconst { 11896 break 11897 } 11898 if v_0.AuxInt != 32-c { 11899 break 11900 } 11901 x := v_0.Args[0] 11902 if x != v.Args[1] { 11903 break 11904 } 11905 v.reset(OpARMSRRconst) 11906 v.AuxInt = 32 - c 11907 v.AddArg(x) 11908 return true 11909 } 11910 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 11911 // cond: c==d 11912 // result: y 11913 for { 11914 d := v.AuxInt 11915 _ = v.Args[1] 11916 x := v.Args[0] 11917 y := v.Args[1] 11918 if y.Op != OpARMSLLconst { 11919 break 11920 } 11921 c := y.AuxInt 11922 if x != y.Args[0] { 11923 break 11924 } 11925 if !(c == d) { 11926 break 11927 } 11928 v.reset(OpCopy) 11929 v.Type = y.Type 11930 v.AddArg(y) 11931 return true 11932 } 11933 return false 11934 } 11935 func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { 11936 b := v.Block 11937 _ = b 11938 // match: (ORshiftLLreg (MOVWconst [c]) x y) 11939 // cond: 11940 // result: (ORconst [c] (SLL <x.Type> x y)) 11941 for { 11942 _ = v.Args[2] 11943 v_0 := v.Args[0] 11944 if v_0.Op != OpARMMOVWconst { 11945 break 11946 } 11947 c := v_0.AuxInt 11948 x := v.Args[1] 11949 y := v.Args[2] 11950 v.reset(OpARMORconst) 11951 v.AuxInt = c 11952 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11953 v0.AddArg(x) 11954 v0.AddArg(y) 11955 v.AddArg(v0) 11956 return true 11957 } 11958 // match: (ORshiftLLreg x y (MOVWconst [c])) 11959 // cond: 11960 // result: (ORshiftLL x y [c]) 11961 for { 11962 _ = v.Args[2] 11963 x := v.Args[0] 11964 y := v.Args[1] 11965 v_2 := v.Args[2] 11966 if v_2.Op != OpARMMOVWconst { 11967 break 11968 } 11969 c := v_2.AuxInt 11970 v.reset(OpARMORshiftLL) 11971 v.AuxInt = c 11972 v.AddArg(x) 11973 v.AddArg(y) 11974 return true 11975 } 11976 return false 11977 } 11978 func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { 11979 b := v.Block 11980 _ = b 11981 // match: (ORshiftRA (MOVWconst [c]) x [d]) 11982 // cond: 11983 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 11984 for { 11985 d := v.AuxInt 11986 _ = v.Args[1] 11987 v_0 := v.Args[0] 11988 if v_0.Op != OpARMMOVWconst { 11989 break 11990 } 11991 c := v_0.AuxInt 11992 x := v.Args[1] 11993 v.reset(OpARMORconst) 11994 v.AuxInt = c 11995 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11996 v0.AuxInt = d 11997 v0.AddArg(x) 11998 v.AddArg(v0) 11999 return true 12000 } 12001 // match: (ORshiftRA x (MOVWconst [c]) [d]) 12002 // cond: 12003 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 12004 for { 12005 d := v.AuxInt 12006 _ = v.Args[1] 12007 x := v.Args[0] 12008 v_1 := v.Args[1] 12009 if v_1.Op != OpARMMOVWconst { 12010 break 12011 } 12012 c := v_1.AuxInt 12013 v.reset(OpARMORconst) 12014 v.AuxInt = int64(int32(c) >> uint64(d)) 12015 v.AddArg(x) 12016 return true 12017 } 12018 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 12019 // cond: c==d 12020 // result: y 12021 for { 12022 d := v.AuxInt 12023 _ = v.Args[1] 12024 x := v.Args[0] 12025 y := v.Args[1] 12026 if y.Op != OpARMSRAconst { 12027 break 12028 } 12029 c := y.AuxInt 12030 if x != y.Args[0] { 12031 break 12032 } 12033 if !(c == d) { 12034 break 12035 } 12036 v.reset(OpCopy) 12037 v.Type = y.Type 12038 v.AddArg(y) 12039 return true 12040 } 12041 return false 12042 } 12043 func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { 12044 b := v.Block 12045 _ = b 12046 // match: (ORshiftRAreg (MOVWconst [c]) x y) 12047 // cond: 12048 // result: (ORconst [c] (SRA <x.Type> x y)) 12049 for { 12050 _ = v.Args[2] 12051 v_0 := v.Args[0] 12052 if v_0.Op != OpARMMOVWconst { 12053 break 12054 } 12055 c := v_0.AuxInt 12056 x := v.Args[1] 12057 y := v.Args[2] 12058 v.reset(OpARMORconst) 12059 v.AuxInt = c 12060 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12061 v0.AddArg(x) 12062 v0.AddArg(y) 12063 v.AddArg(v0) 12064 return true 12065 } 12066 // match: (ORshiftRAreg x y (MOVWconst [c])) 12067 // cond: 12068 // result: (ORshiftRA x y [c]) 12069 for { 12070 _ = v.Args[2] 12071 x := v.Args[0] 12072 y := v.Args[1] 12073 v_2 := v.Args[2] 12074 if v_2.Op != OpARMMOVWconst { 12075 break 12076 } 12077 c := v_2.AuxInt 12078 v.reset(OpARMORshiftRA) 12079 v.AuxInt = c 12080 v.AddArg(x) 12081 v.AddArg(y) 12082 return true 12083 } 12084 return false 12085 } 12086 func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { 12087 b := v.Block 12088 _ = b 12089 // match: (ORshiftRL (MOVWconst [c]) x [d]) 12090 // cond: 12091 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 12092 for { 12093 d := v.AuxInt 12094 _ = v.Args[1] 12095 v_0 := v.Args[0] 12096 if v_0.Op != OpARMMOVWconst { 12097 break 12098 } 12099 c := v_0.AuxInt 12100 x := v.Args[1] 12101 v.reset(OpARMORconst) 12102 v.AuxInt = c 12103 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12104 v0.AuxInt = d 12105 v0.AddArg(x) 12106 v.AddArg(v0) 12107 return true 12108 } 12109 // match: (ORshiftRL x (MOVWconst [c]) [d]) 12110 // cond: 12111 // result: (ORconst x [int64(int32(uint32(c)>>uint64(d)))]) 12112 for { 12113 d := v.AuxInt 12114 _ = v.Args[1] 12115 x := v.Args[0] 12116 v_1 := v.Args[1] 12117 if v_1.Op != OpARMMOVWconst { 12118 break 12119 } 12120 c := v_1.AuxInt 12121 v.reset(OpARMORconst) 12122 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 12123 v.AddArg(x) 12124 return true 12125 } 12126 // match: (ORshiftRL [c] (SLLconst x [32-c]) x) 12127 // cond: 12128 // result: (SRRconst [ c] x) 12129 for { 12130 c := v.AuxInt 12131 _ = v.Args[1] 12132 v_0 := v.Args[0] 12133 if v_0.Op != OpARMSLLconst { 12134 break 12135 } 12136 if v_0.AuxInt != 32-c { 12137 break 12138 } 12139 x := v_0.Args[0] 12140 if x != v.Args[1] { 12141 break 12142 } 12143 v.reset(OpARMSRRconst) 12144 v.AuxInt = c 12145 v.AddArg(x) 12146 return true 12147 } 12148 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 12149 // cond: c==d 12150 // result: y 12151 for { 12152 d := v.AuxInt 12153 _ = v.Args[1] 12154 x := v.Args[0] 12155 y := v.Args[1] 12156 if y.Op != OpARMSRLconst { 12157 break 12158 } 12159 c := y.AuxInt 12160 if x != y.Args[0] { 12161 break 12162 } 12163 if !(c == d) { 12164 break 12165 } 12166 v.reset(OpCopy) 12167 v.Type = y.Type 12168 v.AddArg(y) 12169 return true 12170 } 12171 return false 12172 } 12173 func rewriteValueARM_OpARMORshiftRLreg_0(v *Value) bool { 12174 b := v.Block 12175 _ = b 12176 // match: (ORshiftRLreg (MOVWconst [c]) x y) 12177 // cond: 12178 // result: (ORconst [c] (SRL <x.Type> x y)) 12179 for { 12180 _ = v.Args[2] 12181 v_0 := v.Args[0] 12182 if v_0.Op != OpARMMOVWconst { 12183 break 12184 } 12185 c := v_0.AuxInt 12186 x := v.Args[1] 12187 y := v.Args[2] 12188 v.reset(OpARMORconst) 12189 v.AuxInt = c 12190 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12191 v0.AddArg(x) 12192 v0.AddArg(y) 12193 v.AddArg(v0) 12194 return true 12195 } 12196 // match: (ORshiftRLreg x y (MOVWconst [c])) 12197 // cond: 12198 // result: (ORshiftRL x y [c]) 12199 for { 12200 _ = v.Args[2] 12201 x := v.Args[0] 12202 y := v.Args[1] 12203 v_2 := v.Args[2] 12204 if v_2.Op != OpARMMOVWconst { 12205 break 12206 } 12207 c := v_2.AuxInt 12208 v.reset(OpARMORshiftRL) 12209 v.AuxInt = c 12210 v.AddArg(x) 12211 v.AddArg(y) 12212 return true 12213 } 12214 return false 12215 } 12216 func rewriteValueARM_OpARMRSB_0(v *Value) bool { 12217 // match: (RSB (MOVWconst [c]) x) 12218 // cond: 12219 // result: (SUBconst [c] x) 12220 for { 12221 _ = v.Args[1] 12222 v_0 := v.Args[0] 12223 if v_0.Op != OpARMMOVWconst { 12224 break 12225 } 12226 c := v_0.AuxInt 12227 x := v.Args[1] 12228 v.reset(OpARMSUBconst) 12229 v.AuxInt = c 12230 v.AddArg(x) 12231 return true 12232 } 12233 // match: (RSB x (MOVWconst [c])) 12234 // cond: 12235 // result: (RSBconst [c] x) 12236 for { 12237 _ = v.Args[1] 12238 x := v.Args[0] 12239 v_1 := v.Args[1] 12240 if v_1.Op != OpARMMOVWconst { 12241 break 12242 } 12243 c := v_1.AuxInt 12244 v.reset(OpARMRSBconst) 12245 v.AuxInt = c 12246 v.AddArg(x) 12247 return true 12248 } 12249 // match: (RSB x (SLLconst [c] y)) 12250 // cond: 12251 // result: (RSBshiftLL x y [c]) 12252 for { 12253 _ = v.Args[1] 12254 x := v.Args[0] 12255 v_1 := v.Args[1] 12256 if v_1.Op != OpARMSLLconst { 12257 break 12258 } 12259 c := v_1.AuxInt 12260 y := v_1.Args[0] 12261 v.reset(OpARMRSBshiftLL) 12262 v.AuxInt = c 12263 v.AddArg(x) 12264 v.AddArg(y) 12265 return true 12266 } 12267 // match: (RSB (SLLconst [c] y) x) 12268 // cond: 12269 // result: (SUBshiftLL x y [c]) 12270 for { 12271 _ = v.Args[1] 12272 v_0 := v.Args[0] 12273 if v_0.Op != OpARMSLLconst { 12274 break 12275 } 12276 c := v_0.AuxInt 12277 y := v_0.Args[0] 12278 x := v.Args[1] 12279 v.reset(OpARMSUBshiftLL) 12280 v.AuxInt = c 12281 v.AddArg(x) 12282 v.AddArg(y) 12283 return true 12284 } 12285 // match: (RSB x (SRLconst [c] y)) 12286 // cond: 12287 // result: (RSBshiftRL x y [c]) 12288 for { 12289 _ = v.Args[1] 12290 x := v.Args[0] 12291 v_1 := v.Args[1] 12292 if v_1.Op != OpARMSRLconst { 12293 break 12294 } 12295 c := v_1.AuxInt 12296 y := v_1.Args[0] 12297 v.reset(OpARMRSBshiftRL) 12298 v.AuxInt = c 12299 v.AddArg(x) 12300 v.AddArg(y) 12301 return true 12302 } 12303 // match: (RSB (SRLconst [c] y) x) 12304 // cond: 12305 // result: (SUBshiftRL x y [c]) 12306 for { 12307 _ = v.Args[1] 12308 v_0 := v.Args[0] 12309 if v_0.Op != OpARMSRLconst { 12310 break 12311 } 12312 c := v_0.AuxInt 12313 y := v_0.Args[0] 12314 x := v.Args[1] 12315 v.reset(OpARMSUBshiftRL) 12316 v.AuxInt = c 12317 v.AddArg(x) 12318 v.AddArg(y) 12319 return true 12320 } 12321 // match: (RSB x (SRAconst [c] y)) 12322 // cond: 12323 // result: (RSBshiftRA x y [c]) 12324 for { 12325 _ = v.Args[1] 12326 x := v.Args[0] 12327 v_1 := v.Args[1] 12328 if v_1.Op != OpARMSRAconst { 12329 break 12330 } 12331 c := v_1.AuxInt 12332 y := v_1.Args[0] 12333 v.reset(OpARMRSBshiftRA) 12334 v.AuxInt = c 12335 v.AddArg(x) 12336 v.AddArg(y) 12337 return true 12338 } 12339 // match: (RSB (SRAconst [c] y) x) 12340 // cond: 12341 // result: (SUBshiftRA x y [c]) 12342 for { 12343 _ = v.Args[1] 12344 v_0 := v.Args[0] 12345 if v_0.Op != OpARMSRAconst { 12346 break 12347 } 12348 c := v_0.AuxInt 12349 y := v_0.Args[0] 12350 x := v.Args[1] 12351 v.reset(OpARMSUBshiftRA) 12352 v.AuxInt = c 12353 v.AddArg(x) 12354 v.AddArg(y) 12355 return true 12356 } 12357 // match: (RSB x (SLL y z)) 12358 // cond: 12359 // result: (RSBshiftLLreg x y z) 12360 for { 12361 _ = v.Args[1] 12362 x := v.Args[0] 12363 v_1 := v.Args[1] 12364 if v_1.Op != OpARMSLL { 12365 break 12366 } 12367 _ = v_1.Args[1] 12368 y := v_1.Args[0] 12369 z := v_1.Args[1] 12370 v.reset(OpARMRSBshiftLLreg) 12371 v.AddArg(x) 12372 v.AddArg(y) 12373 v.AddArg(z) 12374 return true 12375 } 12376 // match: (RSB (SLL y z) x) 12377 // cond: 12378 // result: (SUBshiftLLreg x y z) 12379 for { 12380 _ = v.Args[1] 12381 v_0 := v.Args[0] 12382 if v_0.Op != OpARMSLL { 12383 break 12384 } 12385 _ = v_0.Args[1] 12386 y := v_0.Args[0] 12387 z := v_0.Args[1] 12388 x := v.Args[1] 12389 v.reset(OpARMSUBshiftLLreg) 12390 v.AddArg(x) 12391 v.AddArg(y) 12392 v.AddArg(z) 12393 return true 12394 } 12395 return false 12396 } 12397 func rewriteValueARM_OpARMRSB_10(v *Value) bool { 12398 // match: (RSB x (SRL y z)) 12399 // cond: 12400 // result: (RSBshiftRLreg x y z) 12401 for { 12402 _ = v.Args[1] 12403 x := v.Args[0] 12404 v_1 := v.Args[1] 12405 if v_1.Op != OpARMSRL { 12406 break 12407 } 12408 _ = v_1.Args[1] 12409 y := v_1.Args[0] 12410 z := v_1.Args[1] 12411 v.reset(OpARMRSBshiftRLreg) 12412 v.AddArg(x) 12413 v.AddArg(y) 12414 v.AddArg(z) 12415 return true 12416 } 12417 // match: (RSB (SRL y z) x) 12418 // cond: 12419 // result: (SUBshiftRLreg x y z) 12420 for { 12421 _ = v.Args[1] 12422 v_0 := v.Args[0] 12423 if v_0.Op != OpARMSRL { 12424 break 12425 } 12426 _ = v_0.Args[1] 12427 y := v_0.Args[0] 12428 z := v_0.Args[1] 12429 x := v.Args[1] 12430 v.reset(OpARMSUBshiftRLreg) 12431 v.AddArg(x) 12432 v.AddArg(y) 12433 v.AddArg(z) 12434 return true 12435 } 12436 // match: (RSB x (SRA y z)) 12437 // cond: 12438 // result: (RSBshiftRAreg x y z) 12439 for { 12440 _ = v.Args[1] 12441 x := v.Args[0] 12442 v_1 := v.Args[1] 12443 if v_1.Op != OpARMSRA { 12444 break 12445 } 12446 _ = v_1.Args[1] 12447 y := v_1.Args[0] 12448 z := v_1.Args[1] 12449 v.reset(OpARMRSBshiftRAreg) 12450 v.AddArg(x) 12451 v.AddArg(y) 12452 v.AddArg(z) 12453 return true 12454 } 12455 // match: (RSB (SRA y z) x) 12456 // cond: 12457 // result: (SUBshiftRAreg x y z) 12458 for { 12459 _ = v.Args[1] 12460 v_0 := v.Args[0] 12461 if v_0.Op != OpARMSRA { 12462 break 12463 } 12464 _ = v_0.Args[1] 12465 y := v_0.Args[0] 12466 z := v_0.Args[1] 12467 x := v.Args[1] 12468 v.reset(OpARMSUBshiftRAreg) 12469 v.AddArg(x) 12470 v.AddArg(y) 12471 v.AddArg(z) 12472 return true 12473 } 12474 // match: (RSB x x) 12475 // cond: 12476 // result: (MOVWconst [0]) 12477 for { 12478 _ = v.Args[1] 12479 x := v.Args[0] 12480 if x != v.Args[1] { 12481 break 12482 } 12483 v.reset(OpARMMOVWconst) 12484 v.AuxInt = 0 12485 return true 12486 } 12487 // match: (RSB (MUL x y) a) 12488 // cond: objabi.GOARM == 7 12489 // result: (MULS x y a) 12490 for { 12491 _ = v.Args[1] 12492 v_0 := v.Args[0] 12493 if v_0.Op != OpARMMUL { 12494 break 12495 } 12496 _ = v_0.Args[1] 12497 x := v_0.Args[0] 12498 y := v_0.Args[1] 12499 a := v.Args[1] 12500 if !(objabi.GOARM == 7) { 12501 break 12502 } 12503 v.reset(OpARMMULS) 12504 v.AddArg(x) 12505 v.AddArg(y) 12506 v.AddArg(a) 12507 return true 12508 } 12509 return false 12510 } 12511 func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { 12512 b := v.Block 12513 _ = b 12514 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 12515 // cond: 12516 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 12517 for { 12518 d := v.AuxInt 12519 _ = v.Args[1] 12520 v_0 := v.Args[0] 12521 if v_0.Op != OpARMMOVWconst { 12522 break 12523 } 12524 c := v_0.AuxInt 12525 x := v.Args[1] 12526 v.reset(OpARMSUBSconst) 12527 v.AuxInt = c 12528 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12529 v0.AuxInt = d 12530 v0.AddArg(x) 12531 v.AddArg(v0) 12532 return true 12533 } 12534 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 12535 // cond: 12536 // result: (RSBSconst x [int64(int32(uint32(c)<<uint64(d)))]) 12537 for { 12538 d := v.AuxInt 12539 _ = v.Args[1] 12540 x := v.Args[0] 12541 v_1 := v.Args[1] 12542 if v_1.Op != OpARMMOVWconst { 12543 break 12544 } 12545 c := v_1.AuxInt 12546 v.reset(OpARMRSBSconst) 12547 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 12548 v.AddArg(x) 12549 return true 12550 } 12551 return false 12552 } 12553 func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { 12554 b := v.Block 12555 _ = b 12556 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 12557 // cond: 12558 // result: (SUBSconst [c] (SLL <x.Type> x y)) 12559 for { 12560 _ = v.Args[2] 12561 v_0 := v.Args[0] 12562 if v_0.Op != OpARMMOVWconst { 12563 break 12564 } 12565 c := v_0.AuxInt 12566 x := v.Args[1] 12567 y := v.Args[2] 12568 v.reset(OpARMSUBSconst) 12569 v.AuxInt = c 12570 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12571 v0.AddArg(x) 12572 v0.AddArg(y) 12573 v.AddArg(v0) 12574 return true 12575 } 12576 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 12577 // cond: 12578 // result: (RSBSshiftLL x y [c]) 12579 for { 12580 _ = v.Args[2] 12581 x := v.Args[0] 12582 y := v.Args[1] 12583 v_2 := v.Args[2] 12584 if v_2.Op != OpARMMOVWconst { 12585 break 12586 } 12587 c := v_2.AuxInt 12588 v.reset(OpARMRSBSshiftLL) 12589 v.AuxInt = c 12590 v.AddArg(x) 12591 v.AddArg(y) 12592 return true 12593 } 12594 return false 12595 } 12596 func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { 12597 b := v.Block 12598 _ = b 12599 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 12600 // cond: 12601 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 12602 for { 12603 d := v.AuxInt 12604 _ = v.Args[1] 12605 v_0 := v.Args[0] 12606 if v_0.Op != OpARMMOVWconst { 12607 break 12608 } 12609 c := v_0.AuxInt 12610 x := v.Args[1] 12611 v.reset(OpARMSUBSconst) 12612 v.AuxInt = c 12613 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12614 v0.AuxInt = d 12615 v0.AddArg(x) 12616 v.AddArg(v0) 12617 return true 12618 } 12619 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 12620 // cond: 12621 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 12622 for { 12623 d := v.AuxInt 12624 _ = v.Args[1] 12625 x := v.Args[0] 12626 v_1 := v.Args[1] 12627 if v_1.Op != OpARMMOVWconst { 12628 break 12629 } 12630 c := v_1.AuxInt 12631 v.reset(OpARMRSBSconst) 12632 v.AuxInt = int64(int32(c) >> uint64(d)) 12633 v.AddArg(x) 12634 return true 12635 } 12636 return false 12637 } 12638 func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { 12639 b := v.Block 12640 _ = b 12641 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 12642 // cond: 12643 // result: (SUBSconst [c] (SRA <x.Type> x y)) 12644 for { 12645 _ = v.Args[2] 12646 v_0 := v.Args[0] 12647 if v_0.Op != OpARMMOVWconst { 12648 break 12649 } 12650 c := v_0.AuxInt 12651 x := v.Args[1] 12652 y := v.Args[2] 12653 v.reset(OpARMSUBSconst) 12654 v.AuxInt = c 12655 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12656 v0.AddArg(x) 12657 v0.AddArg(y) 12658 v.AddArg(v0) 12659 return true 12660 } 12661 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 12662 // cond: 12663 // result: (RSBSshiftRA x y [c]) 12664 for { 12665 _ = v.Args[2] 12666 x := v.Args[0] 12667 y := v.Args[1] 12668 v_2 := v.Args[2] 12669 if v_2.Op != OpARMMOVWconst { 12670 break 12671 } 12672 c := v_2.AuxInt 12673 v.reset(OpARMRSBSshiftRA) 12674 v.AuxInt = c 12675 v.AddArg(x) 12676 v.AddArg(y) 12677 return true 12678 } 12679 return false 12680 } 12681 func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { 12682 b := v.Block 12683 _ = b 12684 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 12685 // cond: 12686 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 12687 for { 12688 d := v.AuxInt 12689 _ = v.Args[1] 12690 v_0 := v.Args[0] 12691 if v_0.Op != OpARMMOVWconst { 12692 break 12693 } 12694 c := v_0.AuxInt 12695 x := v.Args[1] 12696 v.reset(OpARMSUBSconst) 12697 v.AuxInt = c 12698 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12699 v0.AuxInt = d 12700 v0.AddArg(x) 12701 v.AddArg(v0) 12702 return true 12703 } 12704 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 12705 // cond: 12706 // result: (RSBSconst x [int64(int32(uint32(c)>>uint64(d)))]) 12707 for { 12708 d := v.AuxInt 12709 _ = v.Args[1] 12710 x := v.Args[0] 12711 v_1 := v.Args[1] 12712 if v_1.Op != OpARMMOVWconst { 12713 break 12714 } 12715 c := v_1.AuxInt 12716 v.reset(OpARMRSBSconst) 12717 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 12718 v.AddArg(x) 12719 return true 12720 } 12721 return false 12722 } 12723 func rewriteValueARM_OpARMRSBSshiftRLreg_0(v *Value) bool { 12724 b := v.Block 12725 _ = b 12726 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 12727 // cond: 12728 // result: (SUBSconst [c] (SRL <x.Type> x y)) 12729 for { 12730 _ = v.Args[2] 12731 v_0 := v.Args[0] 12732 if v_0.Op != OpARMMOVWconst { 12733 break 12734 } 12735 c := v_0.AuxInt 12736 x := v.Args[1] 12737 y := v.Args[2] 12738 v.reset(OpARMSUBSconst) 12739 v.AuxInt = c 12740 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12741 v0.AddArg(x) 12742 v0.AddArg(y) 12743 v.AddArg(v0) 12744 return true 12745 } 12746 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 12747 // cond: 12748 // result: (RSBSshiftRL x y [c]) 12749 for { 12750 _ = v.Args[2] 12751 x := v.Args[0] 12752 y := v.Args[1] 12753 v_2 := v.Args[2] 12754 if v_2.Op != OpARMMOVWconst { 12755 break 12756 } 12757 c := v_2.AuxInt 12758 v.reset(OpARMRSBSshiftRL) 12759 v.AuxInt = c 12760 v.AddArg(x) 12761 v.AddArg(y) 12762 return true 12763 } 12764 return false 12765 } 12766 func rewriteValueARM_OpARMRSBconst_0(v *Value) bool { 12767 // match: (RSBconst [c] (MOVWconst [d])) 12768 // cond: 12769 // result: (MOVWconst [int64(int32(c-d))]) 12770 for { 12771 c := v.AuxInt 12772 v_0 := v.Args[0] 12773 if v_0.Op != OpARMMOVWconst { 12774 break 12775 } 12776 d := v_0.AuxInt 12777 v.reset(OpARMMOVWconst) 12778 v.AuxInt = int64(int32(c - d)) 12779 return true 12780 } 12781 // match: (RSBconst [c] (RSBconst [d] x)) 12782 // cond: 12783 // result: (ADDconst [int64(int32(c-d))] x) 12784 for { 12785 c := v.AuxInt 12786 v_0 := v.Args[0] 12787 if v_0.Op != OpARMRSBconst { 12788 break 12789 } 12790 d := v_0.AuxInt 12791 x := v_0.Args[0] 12792 v.reset(OpARMADDconst) 12793 v.AuxInt = int64(int32(c - d)) 12794 v.AddArg(x) 12795 return true 12796 } 12797 // match: (RSBconst [c] (ADDconst [d] x)) 12798 // cond: 12799 // result: (RSBconst [int64(int32(c-d))] x) 12800 for { 12801 c := v.AuxInt 12802 v_0 := v.Args[0] 12803 if v_0.Op != OpARMADDconst { 12804 break 12805 } 12806 d := v_0.AuxInt 12807 x := v_0.Args[0] 12808 v.reset(OpARMRSBconst) 12809 v.AuxInt = int64(int32(c - d)) 12810 v.AddArg(x) 12811 return true 12812 } 12813 // match: (RSBconst [c] (SUBconst [d] x)) 12814 // cond: 12815 // result: (RSBconst [int64(int32(c+d))] x) 12816 for { 12817 c := v.AuxInt 12818 v_0 := v.Args[0] 12819 if v_0.Op != OpARMSUBconst { 12820 break 12821 } 12822 d := v_0.AuxInt 12823 x := v_0.Args[0] 12824 v.reset(OpARMRSBconst) 12825 v.AuxInt = int64(int32(c + d)) 12826 v.AddArg(x) 12827 return true 12828 } 12829 return false 12830 } 12831 func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { 12832 b := v.Block 12833 _ = b 12834 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 12835 // cond: 12836 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 12837 for { 12838 d := v.AuxInt 12839 _ = v.Args[1] 12840 v_0 := v.Args[0] 12841 if v_0.Op != OpARMMOVWconst { 12842 break 12843 } 12844 c := v_0.AuxInt 12845 x := v.Args[1] 12846 v.reset(OpARMSUBconst) 12847 v.AuxInt = c 12848 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12849 v0.AuxInt = d 12850 v0.AddArg(x) 12851 v.AddArg(v0) 12852 return true 12853 } 12854 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 12855 // cond: 12856 // result: (RSBconst x [int64(int32(uint32(c)<<uint64(d)))]) 12857 for { 12858 d := v.AuxInt 12859 _ = v.Args[1] 12860 x := v.Args[0] 12861 v_1 := v.Args[1] 12862 if v_1.Op != OpARMMOVWconst { 12863 break 12864 } 12865 c := v_1.AuxInt 12866 v.reset(OpARMRSBconst) 12867 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 12868 v.AddArg(x) 12869 return true 12870 } 12871 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 12872 // cond: c==d 12873 // result: (MOVWconst [0]) 12874 for { 12875 d := v.AuxInt 12876 _ = v.Args[1] 12877 x := v.Args[0] 12878 v_1 := v.Args[1] 12879 if v_1.Op != OpARMSLLconst { 12880 break 12881 } 12882 c := v_1.AuxInt 12883 if x != v_1.Args[0] { 12884 break 12885 } 12886 if !(c == d) { 12887 break 12888 } 12889 v.reset(OpARMMOVWconst) 12890 v.AuxInt = 0 12891 return true 12892 } 12893 return false 12894 } 12895 func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { 12896 b := v.Block 12897 _ = b 12898 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 12899 // cond: 12900 // result: (SUBconst [c] (SLL <x.Type> x y)) 12901 for { 12902 _ = v.Args[2] 12903 v_0 := v.Args[0] 12904 if v_0.Op != OpARMMOVWconst { 12905 break 12906 } 12907 c := v_0.AuxInt 12908 x := v.Args[1] 12909 y := v.Args[2] 12910 v.reset(OpARMSUBconst) 12911 v.AuxInt = c 12912 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12913 v0.AddArg(x) 12914 v0.AddArg(y) 12915 v.AddArg(v0) 12916 return true 12917 } 12918 // match: (RSBshiftLLreg x y (MOVWconst [c])) 12919 // cond: 12920 // result: (RSBshiftLL x y [c]) 12921 for { 12922 _ = v.Args[2] 12923 x := v.Args[0] 12924 y := v.Args[1] 12925 v_2 := v.Args[2] 12926 if v_2.Op != OpARMMOVWconst { 12927 break 12928 } 12929 c := v_2.AuxInt 12930 v.reset(OpARMRSBshiftLL) 12931 v.AuxInt = c 12932 v.AddArg(x) 12933 v.AddArg(y) 12934 return true 12935 } 12936 return false 12937 } 12938 func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { 12939 b := v.Block 12940 _ = b 12941 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 12942 // cond: 12943 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 12944 for { 12945 d := v.AuxInt 12946 _ = v.Args[1] 12947 v_0 := v.Args[0] 12948 if v_0.Op != OpARMMOVWconst { 12949 break 12950 } 12951 c := v_0.AuxInt 12952 x := v.Args[1] 12953 v.reset(OpARMSUBconst) 12954 v.AuxInt = c 12955 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12956 v0.AuxInt = d 12957 v0.AddArg(x) 12958 v.AddArg(v0) 12959 return true 12960 } 12961 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 12962 // cond: 12963 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 12964 for { 12965 d := v.AuxInt 12966 _ = v.Args[1] 12967 x := v.Args[0] 12968 v_1 := v.Args[1] 12969 if v_1.Op != OpARMMOVWconst { 12970 break 12971 } 12972 c := v_1.AuxInt 12973 v.reset(OpARMRSBconst) 12974 v.AuxInt = int64(int32(c) >> uint64(d)) 12975 v.AddArg(x) 12976 return true 12977 } 12978 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 12979 // cond: c==d 12980 // result: (MOVWconst [0]) 12981 for { 12982 d := v.AuxInt 12983 _ = v.Args[1] 12984 x := v.Args[0] 12985 v_1 := v.Args[1] 12986 if v_1.Op != OpARMSRAconst { 12987 break 12988 } 12989 c := v_1.AuxInt 12990 if x != v_1.Args[0] { 12991 break 12992 } 12993 if !(c == d) { 12994 break 12995 } 12996 v.reset(OpARMMOVWconst) 12997 v.AuxInt = 0 12998 return true 12999 } 13000 return false 13001 } 13002 func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { 13003 b := v.Block 13004 _ = b 13005 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 13006 // cond: 13007 // result: (SUBconst [c] (SRA <x.Type> x y)) 13008 for { 13009 _ = v.Args[2] 13010 v_0 := v.Args[0] 13011 if v_0.Op != OpARMMOVWconst { 13012 break 13013 } 13014 c := v_0.AuxInt 13015 x := v.Args[1] 13016 y := v.Args[2] 13017 v.reset(OpARMSUBconst) 13018 v.AuxInt = c 13019 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13020 v0.AddArg(x) 13021 v0.AddArg(y) 13022 v.AddArg(v0) 13023 return true 13024 } 13025 // match: (RSBshiftRAreg x y (MOVWconst [c])) 13026 // cond: 13027 // result: (RSBshiftRA x y [c]) 13028 for { 13029 _ = v.Args[2] 13030 x := v.Args[0] 13031 y := v.Args[1] 13032 v_2 := v.Args[2] 13033 if v_2.Op != OpARMMOVWconst { 13034 break 13035 } 13036 c := v_2.AuxInt 13037 v.reset(OpARMRSBshiftRA) 13038 v.AuxInt = c 13039 v.AddArg(x) 13040 v.AddArg(y) 13041 return true 13042 } 13043 return false 13044 } 13045 func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { 13046 b := v.Block 13047 _ = b 13048 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 13049 // cond: 13050 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 13051 for { 13052 d := v.AuxInt 13053 _ = v.Args[1] 13054 v_0 := v.Args[0] 13055 if v_0.Op != OpARMMOVWconst { 13056 break 13057 } 13058 c := v_0.AuxInt 13059 x := v.Args[1] 13060 v.reset(OpARMSUBconst) 13061 v.AuxInt = c 13062 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13063 v0.AuxInt = d 13064 v0.AddArg(x) 13065 v.AddArg(v0) 13066 return true 13067 } 13068 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 13069 // cond: 13070 // result: (RSBconst x [int64(int32(uint32(c)>>uint64(d)))]) 13071 for { 13072 d := v.AuxInt 13073 _ = v.Args[1] 13074 x := v.Args[0] 13075 v_1 := v.Args[1] 13076 if v_1.Op != OpARMMOVWconst { 13077 break 13078 } 13079 c := v_1.AuxInt 13080 v.reset(OpARMRSBconst) 13081 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 13082 v.AddArg(x) 13083 return true 13084 } 13085 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 13086 // cond: c==d 13087 // result: (MOVWconst [0]) 13088 for { 13089 d := v.AuxInt 13090 _ = v.Args[1] 13091 x := v.Args[0] 13092 v_1 := v.Args[1] 13093 if v_1.Op != OpARMSRLconst { 13094 break 13095 } 13096 c := v_1.AuxInt 13097 if x != v_1.Args[0] { 13098 break 13099 } 13100 if !(c == d) { 13101 break 13102 } 13103 v.reset(OpARMMOVWconst) 13104 v.AuxInt = 0 13105 return true 13106 } 13107 return false 13108 } 13109 func rewriteValueARM_OpARMRSBshiftRLreg_0(v *Value) bool { 13110 b := v.Block 13111 _ = b 13112 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 13113 // cond: 13114 // result: (SUBconst [c] (SRL <x.Type> x y)) 13115 for { 13116 _ = v.Args[2] 13117 v_0 := v.Args[0] 13118 if v_0.Op != OpARMMOVWconst { 13119 break 13120 } 13121 c := v_0.AuxInt 13122 x := v.Args[1] 13123 y := v.Args[2] 13124 v.reset(OpARMSUBconst) 13125 v.AuxInt = c 13126 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13127 v0.AddArg(x) 13128 v0.AddArg(y) 13129 v.AddArg(v0) 13130 return true 13131 } 13132 // match: (RSBshiftRLreg x y (MOVWconst [c])) 13133 // cond: 13134 // result: (RSBshiftRL x y [c]) 13135 for { 13136 _ = v.Args[2] 13137 x := v.Args[0] 13138 y := v.Args[1] 13139 v_2 := v.Args[2] 13140 if v_2.Op != OpARMMOVWconst { 13141 break 13142 } 13143 c := v_2.AuxInt 13144 v.reset(OpARMRSBshiftRL) 13145 v.AuxInt = c 13146 v.AddArg(x) 13147 v.AddArg(y) 13148 return true 13149 } 13150 return false 13151 } 13152 func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { 13153 // match: (RSCconst [c] (ADDconst [d] x) flags) 13154 // cond: 13155 // result: (RSCconst [int64(int32(c-d))] x flags) 13156 for { 13157 c := v.AuxInt 13158 _ = v.Args[1] 13159 v_0 := v.Args[0] 13160 if v_0.Op != OpARMADDconst { 13161 break 13162 } 13163 d := v_0.AuxInt 13164 x := v_0.Args[0] 13165 flags := v.Args[1] 13166 v.reset(OpARMRSCconst) 13167 v.AuxInt = int64(int32(c - d)) 13168 v.AddArg(x) 13169 v.AddArg(flags) 13170 return true 13171 } 13172 // match: (RSCconst [c] (SUBconst [d] x) flags) 13173 // cond: 13174 // result: (RSCconst [int64(int32(c+d))] x flags) 13175 for { 13176 c := v.AuxInt 13177 _ = v.Args[1] 13178 v_0 := v.Args[0] 13179 if v_0.Op != OpARMSUBconst { 13180 break 13181 } 13182 d := v_0.AuxInt 13183 x := v_0.Args[0] 13184 flags := v.Args[1] 13185 v.reset(OpARMRSCconst) 13186 v.AuxInt = int64(int32(c + d)) 13187 v.AddArg(x) 13188 v.AddArg(flags) 13189 return true 13190 } 13191 return false 13192 } 13193 func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { 13194 b := v.Block 13195 _ = b 13196 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 13197 // cond: 13198 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 13199 for { 13200 d := v.AuxInt 13201 _ = v.Args[2] 13202 v_0 := v.Args[0] 13203 if v_0.Op != OpARMMOVWconst { 13204 break 13205 } 13206 c := v_0.AuxInt 13207 x := v.Args[1] 13208 flags := v.Args[2] 13209 v.reset(OpARMSBCconst) 13210 v.AuxInt = c 13211 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 13212 v0.AuxInt = d 13213 v0.AddArg(x) 13214 v.AddArg(v0) 13215 v.AddArg(flags) 13216 return true 13217 } 13218 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 13219 // cond: 13220 // result: (RSCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 13221 for { 13222 d := v.AuxInt 13223 _ = v.Args[2] 13224 x := v.Args[0] 13225 v_1 := v.Args[1] 13226 if v_1.Op != OpARMMOVWconst { 13227 break 13228 } 13229 c := v_1.AuxInt 13230 flags := v.Args[2] 13231 v.reset(OpARMRSCconst) 13232 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 13233 v.AddArg(x) 13234 v.AddArg(flags) 13235 return true 13236 } 13237 return false 13238 } 13239 func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { 13240 b := v.Block 13241 _ = b 13242 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 13243 // cond: 13244 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 13245 for { 13246 _ = v.Args[3] 13247 v_0 := v.Args[0] 13248 if v_0.Op != OpARMMOVWconst { 13249 break 13250 } 13251 c := v_0.AuxInt 13252 x := v.Args[1] 13253 y := v.Args[2] 13254 flags := v.Args[3] 13255 v.reset(OpARMSBCconst) 13256 v.AuxInt = c 13257 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13258 v0.AddArg(x) 13259 v0.AddArg(y) 13260 v.AddArg(v0) 13261 v.AddArg(flags) 13262 return true 13263 } 13264 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 13265 // cond: 13266 // result: (RSCshiftLL x y [c] flags) 13267 for { 13268 _ = v.Args[3] 13269 x := v.Args[0] 13270 y := v.Args[1] 13271 v_2 := v.Args[2] 13272 if v_2.Op != OpARMMOVWconst { 13273 break 13274 } 13275 c := v_2.AuxInt 13276 flags := v.Args[3] 13277 v.reset(OpARMRSCshiftLL) 13278 v.AuxInt = c 13279 v.AddArg(x) 13280 v.AddArg(y) 13281 v.AddArg(flags) 13282 return true 13283 } 13284 return false 13285 } 13286 func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { 13287 b := v.Block 13288 _ = b 13289 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 13290 // cond: 13291 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 13292 for { 13293 d := v.AuxInt 13294 _ = v.Args[2] 13295 v_0 := v.Args[0] 13296 if v_0.Op != OpARMMOVWconst { 13297 break 13298 } 13299 c := v_0.AuxInt 13300 x := v.Args[1] 13301 flags := v.Args[2] 13302 v.reset(OpARMSBCconst) 13303 v.AuxInt = c 13304 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13305 v0.AuxInt = d 13306 v0.AddArg(x) 13307 v.AddArg(v0) 13308 v.AddArg(flags) 13309 return true 13310 } 13311 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 13312 // cond: 13313 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 13314 for { 13315 d := v.AuxInt 13316 _ = v.Args[2] 13317 x := v.Args[0] 13318 v_1 := v.Args[1] 13319 if v_1.Op != OpARMMOVWconst { 13320 break 13321 } 13322 c := v_1.AuxInt 13323 flags := v.Args[2] 13324 v.reset(OpARMRSCconst) 13325 v.AuxInt = int64(int32(c) >> uint64(d)) 13326 v.AddArg(x) 13327 v.AddArg(flags) 13328 return true 13329 } 13330 return false 13331 } 13332 func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { 13333 b := v.Block 13334 _ = b 13335 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 13336 // cond: 13337 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 13338 for { 13339 _ = v.Args[3] 13340 v_0 := v.Args[0] 13341 if v_0.Op != OpARMMOVWconst { 13342 break 13343 } 13344 c := v_0.AuxInt 13345 x := v.Args[1] 13346 y := v.Args[2] 13347 flags := v.Args[3] 13348 v.reset(OpARMSBCconst) 13349 v.AuxInt = c 13350 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13351 v0.AddArg(x) 13352 v0.AddArg(y) 13353 v.AddArg(v0) 13354 v.AddArg(flags) 13355 return true 13356 } 13357 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 13358 // cond: 13359 // result: (RSCshiftRA x y [c] flags) 13360 for { 13361 _ = v.Args[3] 13362 x := v.Args[0] 13363 y := v.Args[1] 13364 v_2 := v.Args[2] 13365 if v_2.Op != OpARMMOVWconst { 13366 break 13367 } 13368 c := v_2.AuxInt 13369 flags := v.Args[3] 13370 v.reset(OpARMRSCshiftRA) 13371 v.AuxInt = c 13372 v.AddArg(x) 13373 v.AddArg(y) 13374 v.AddArg(flags) 13375 return true 13376 } 13377 return false 13378 } 13379 func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { 13380 b := v.Block 13381 _ = b 13382 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 13383 // cond: 13384 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 13385 for { 13386 d := v.AuxInt 13387 _ = v.Args[2] 13388 v_0 := v.Args[0] 13389 if v_0.Op != OpARMMOVWconst { 13390 break 13391 } 13392 c := v_0.AuxInt 13393 x := v.Args[1] 13394 flags := v.Args[2] 13395 v.reset(OpARMSBCconst) 13396 v.AuxInt = c 13397 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13398 v0.AuxInt = d 13399 v0.AddArg(x) 13400 v.AddArg(v0) 13401 v.AddArg(flags) 13402 return true 13403 } 13404 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 13405 // cond: 13406 // result: (RSCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 13407 for { 13408 d := v.AuxInt 13409 _ = v.Args[2] 13410 x := v.Args[0] 13411 v_1 := v.Args[1] 13412 if v_1.Op != OpARMMOVWconst { 13413 break 13414 } 13415 c := v_1.AuxInt 13416 flags := v.Args[2] 13417 v.reset(OpARMRSCconst) 13418 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 13419 v.AddArg(x) 13420 v.AddArg(flags) 13421 return true 13422 } 13423 return false 13424 } 13425 func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { 13426 b := v.Block 13427 _ = b 13428 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 13429 // cond: 13430 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 13431 for { 13432 _ = v.Args[3] 13433 v_0 := v.Args[0] 13434 if v_0.Op != OpARMMOVWconst { 13435 break 13436 } 13437 c := v_0.AuxInt 13438 x := v.Args[1] 13439 y := v.Args[2] 13440 flags := v.Args[3] 13441 v.reset(OpARMSBCconst) 13442 v.AuxInt = c 13443 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13444 v0.AddArg(x) 13445 v0.AddArg(y) 13446 v.AddArg(v0) 13447 v.AddArg(flags) 13448 return true 13449 } 13450 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 13451 // cond: 13452 // result: (RSCshiftRL x y [c] flags) 13453 for { 13454 _ = v.Args[3] 13455 x := v.Args[0] 13456 y := v.Args[1] 13457 v_2 := v.Args[2] 13458 if v_2.Op != OpARMMOVWconst { 13459 break 13460 } 13461 c := v_2.AuxInt 13462 flags := v.Args[3] 13463 v.reset(OpARMRSCshiftRL) 13464 v.AuxInt = c 13465 v.AddArg(x) 13466 v.AddArg(y) 13467 v.AddArg(flags) 13468 return true 13469 } 13470 return false 13471 } 13472 func rewriteValueARM_OpARMSBC_0(v *Value) bool { 13473 // match: (SBC (MOVWconst [c]) x flags) 13474 // cond: 13475 // result: (RSCconst [c] x flags) 13476 for { 13477 _ = v.Args[2] 13478 v_0 := v.Args[0] 13479 if v_0.Op != OpARMMOVWconst { 13480 break 13481 } 13482 c := v_0.AuxInt 13483 x := v.Args[1] 13484 flags := v.Args[2] 13485 v.reset(OpARMRSCconst) 13486 v.AuxInt = c 13487 v.AddArg(x) 13488 v.AddArg(flags) 13489 return true 13490 } 13491 // match: (SBC x (MOVWconst [c]) flags) 13492 // cond: 13493 // result: (SBCconst [c] x flags) 13494 for { 13495 _ = v.Args[2] 13496 x := v.Args[0] 13497 v_1 := v.Args[1] 13498 if v_1.Op != OpARMMOVWconst { 13499 break 13500 } 13501 c := v_1.AuxInt 13502 flags := v.Args[2] 13503 v.reset(OpARMSBCconst) 13504 v.AuxInt = c 13505 v.AddArg(x) 13506 v.AddArg(flags) 13507 return true 13508 } 13509 // match: (SBC x (SLLconst [c] y) flags) 13510 // cond: 13511 // result: (SBCshiftLL x y [c] flags) 13512 for { 13513 _ = v.Args[2] 13514 x := v.Args[0] 13515 v_1 := v.Args[1] 13516 if v_1.Op != OpARMSLLconst { 13517 break 13518 } 13519 c := v_1.AuxInt 13520 y := v_1.Args[0] 13521 flags := v.Args[2] 13522 v.reset(OpARMSBCshiftLL) 13523 v.AuxInt = c 13524 v.AddArg(x) 13525 v.AddArg(y) 13526 v.AddArg(flags) 13527 return true 13528 } 13529 // match: (SBC (SLLconst [c] y) x flags) 13530 // cond: 13531 // result: (RSCshiftLL x y [c] flags) 13532 for { 13533 _ = v.Args[2] 13534 v_0 := v.Args[0] 13535 if v_0.Op != OpARMSLLconst { 13536 break 13537 } 13538 c := v_0.AuxInt 13539 y := v_0.Args[0] 13540 x := v.Args[1] 13541 flags := v.Args[2] 13542 v.reset(OpARMRSCshiftLL) 13543 v.AuxInt = c 13544 v.AddArg(x) 13545 v.AddArg(y) 13546 v.AddArg(flags) 13547 return true 13548 } 13549 // match: (SBC x (SRLconst [c] y) flags) 13550 // cond: 13551 // result: (SBCshiftRL x y [c] flags) 13552 for { 13553 _ = v.Args[2] 13554 x := v.Args[0] 13555 v_1 := v.Args[1] 13556 if v_1.Op != OpARMSRLconst { 13557 break 13558 } 13559 c := v_1.AuxInt 13560 y := v_1.Args[0] 13561 flags := v.Args[2] 13562 v.reset(OpARMSBCshiftRL) 13563 v.AuxInt = c 13564 v.AddArg(x) 13565 v.AddArg(y) 13566 v.AddArg(flags) 13567 return true 13568 } 13569 // match: (SBC (SRLconst [c] y) x flags) 13570 // cond: 13571 // result: (RSCshiftRL x y [c] flags) 13572 for { 13573 _ = v.Args[2] 13574 v_0 := v.Args[0] 13575 if v_0.Op != OpARMSRLconst { 13576 break 13577 } 13578 c := v_0.AuxInt 13579 y := v_0.Args[0] 13580 x := v.Args[1] 13581 flags := v.Args[2] 13582 v.reset(OpARMRSCshiftRL) 13583 v.AuxInt = c 13584 v.AddArg(x) 13585 v.AddArg(y) 13586 v.AddArg(flags) 13587 return true 13588 } 13589 // match: (SBC x (SRAconst [c] y) flags) 13590 // cond: 13591 // result: (SBCshiftRA x y [c] flags) 13592 for { 13593 _ = v.Args[2] 13594 x := v.Args[0] 13595 v_1 := v.Args[1] 13596 if v_1.Op != OpARMSRAconst { 13597 break 13598 } 13599 c := v_1.AuxInt 13600 y := v_1.Args[0] 13601 flags := v.Args[2] 13602 v.reset(OpARMSBCshiftRA) 13603 v.AuxInt = c 13604 v.AddArg(x) 13605 v.AddArg(y) 13606 v.AddArg(flags) 13607 return true 13608 } 13609 // match: (SBC (SRAconst [c] y) x flags) 13610 // cond: 13611 // result: (RSCshiftRA x y [c] flags) 13612 for { 13613 _ = v.Args[2] 13614 v_0 := v.Args[0] 13615 if v_0.Op != OpARMSRAconst { 13616 break 13617 } 13618 c := v_0.AuxInt 13619 y := v_0.Args[0] 13620 x := v.Args[1] 13621 flags := v.Args[2] 13622 v.reset(OpARMRSCshiftRA) 13623 v.AuxInt = c 13624 v.AddArg(x) 13625 v.AddArg(y) 13626 v.AddArg(flags) 13627 return true 13628 } 13629 // match: (SBC x (SLL y z) flags) 13630 // cond: 13631 // result: (SBCshiftLLreg x y z flags) 13632 for { 13633 _ = v.Args[2] 13634 x := v.Args[0] 13635 v_1 := v.Args[1] 13636 if v_1.Op != OpARMSLL { 13637 break 13638 } 13639 _ = v_1.Args[1] 13640 y := v_1.Args[0] 13641 z := v_1.Args[1] 13642 flags := v.Args[2] 13643 v.reset(OpARMSBCshiftLLreg) 13644 v.AddArg(x) 13645 v.AddArg(y) 13646 v.AddArg(z) 13647 v.AddArg(flags) 13648 return true 13649 } 13650 // match: (SBC (SLL y z) x flags) 13651 // cond: 13652 // result: (RSCshiftLLreg x y z flags) 13653 for { 13654 _ = v.Args[2] 13655 v_0 := v.Args[0] 13656 if v_0.Op != OpARMSLL { 13657 break 13658 } 13659 _ = v_0.Args[1] 13660 y := v_0.Args[0] 13661 z := v_0.Args[1] 13662 x := v.Args[1] 13663 flags := v.Args[2] 13664 v.reset(OpARMRSCshiftLLreg) 13665 v.AddArg(x) 13666 v.AddArg(y) 13667 v.AddArg(z) 13668 v.AddArg(flags) 13669 return true 13670 } 13671 return false 13672 } 13673 func rewriteValueARM_OpARMSBC_10(v *Value) bool { 13674 // match: (SBC x (SRL y z) flags) 13675 // cond: 13676 // result: (SBCshiftRLreg x y z flags) 13677 for { 13678 _ = v.Args[2] 13679 x := v.Args[0] 13680 v_1 := v.Args[1] 13681 if v_1.Op != OpARMSRL { 13682 break 13683 } 13684 _ = v_1.Args[1] 13685 y := v_1.Args[0] 13686 z := v_1.Args[1] 13687 flags := v.Args[2] 13688 v.reset(OpARMSBCshiftRLreg) 13689 v.AddArg(x) 13690 v.AddArg(y) 13691 v.AddArg(z) 13692 v.AddArg(flags) 13693 return true 13694 } 13695 // match: (SBC (SRL y z) x flags) 13696 // cond: 13697 // result: (RSCshiftRLreg x y z flags) 13698 for { 13699 _ = v.Args[2] 13700 v_0 := v.Args[0] 13701 if v_0.Op != OpARMSRL { 13702 break 13703 } 13704 _ = v_0.Args[1] 13705 y := v_0.Args[0] 13706 z := v_0.Args[1] 13707 x := v.Args[1] 13708 flags := v.Args[2] 13709 v.reset(OpARMRSCshiftRLreg) 13710 v.AddArg(x) 13711 v.AddArg(y) 13712 v.AddArg(z) 13713 v.AddArg(flags) 13714 return true 13715 } 13716 // match: (SBC x (SRA y z) flags) 13717 // cond: 13718 // result: (SBCshiftRAreg x y z flags) 13719 for { 13720 _ = v.Args[2] 13721 x := v.Args[0] 13722 v_1 := v.Args[1] 13723 if v_1.Op != OpARMSRA { 13724 break 13725 } 13726 _ = v_1.Args[1] 13727 y := v_1.Args[0] 13728 z := v_1.Args[1] 13729 flags := v.Args[2] 13730 v.reset(OpARMSBCshiftRAreg) 13731 v.AddArg(x) 13732 v.AddArg(y) 13733 v.AddArg(z) 13734 v.AddArg(flags) 13735 return true 13736 } 13737 // match: (SBC (SRA y z) x flags) 13738 // cond: 13739 // result: (RSCshiftRAreg x y z flags) 13740 for { 13741 _ = v.Args[2] 13742 v_0 := v.Args[0] 13743 if v_0.Op != OpARMSRA { 13744 break 13745 } 13746 _ = v_0.Args[1] 13747 y := v_0.Args[0] 13748 z := v_0.Args[1] 13749 x := v.Args[1] 13750 flags := v.Args[2] 13751 v.reset(OpARMRSCshiftRAreg) 13752 v.AddArg(x) 13753 v.AddArg(y) 13754 v.AddArg(z) 13755 v.AddArg(flags) 13756 return true 13757 } 13758 return false 13759 } 13760 func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { 13761 // match: (SBCconst [c] (ADDconst [d] x) flags) 13762 // cond: 13763 // result: (SBCconst [int64(int32(c-d))] x flags) 13764 for { 13765 c := v.AuxInt 13766 _ = v.Args[1] 13767 v_0 := v.Args[0] 13768 if v_0.Op != OpARMADDconst { 13769 break 13770 } 13771 d := v_0.AuxInt 13772 x := v_0.Args[0] 13773 flags := v.Args[1] 13774 v.reset(OpARMSBCconst) 13775 v.AuxInt = int64(int32(c - d)) 13776 v.AddArg(x) 13777 v.AddArg(flags) 13778 return true 13779 } 13780 // match: (SBCconst [c] (SUBconst [d] x) flags) 13781 // cond: 13782 // result: (SBCconst [int64(int32(c+d))] x flags) 13783 for { 13784 c := v.AuxInt 13785 _ = v.Args[1] 13786 v_0 := v.Args[0] 13787 if v_0.Op != OpARMSUBconst { 13788 break 13789 } 13790 d := v_0.AuxInt 13791 x := v_0.Args[0] 13792 flags := v.Args[1] 13793 v.reset(OpARMSBCconst) 13794 v.AuxInt = int64(int32(c + d)) 13795 v.AddArg(x) 13796 v.AddArg(flags) 13797 return true 13798 } 13799 return false 13800 } 13801 func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { 13802 b := v.Block 13803 _ = b 13804 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 13805 // cond: 13806 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 13807 for { 13808 d := v.AuxInt 13809 _ = v.Args[2] 13810 v_0 := v.Args[0] 13811 if v_0.Op != OpARMMOVWconst { 13812 break 13813 } 13814 c := v_0.AuxInt 13815 x := v.Args[1] 13816 flags := v.Args[2] 13817 v.reset(OpARMRSCconst) 13818 v.AuxInt = c 13819 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 13820 v0.AuxInt = d 13821 v0.AddArg(x) 13822 v.AddArg(v0) 13823 v.AddArg(flags) 13824 return true 13825 } 13826 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 13827 // cond: 13828 // result: (SBCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 13829 for { 13830 d := v.AuxInt 13831 _ = v.Args[2] 13832 x := v.Args[0] 13833 v_1 := v.Args[1] 13834 if v_1.Op != OpARMMOVWconst { 13835 break 13836 } 13837 c := v_1.AuxInt 13838 flags := v.Args[2] 13839 v.reset(OpARMSBCconst) 13840 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 13841 v.AddArg(x) 13842 v.AddArg(flags) 13843 return true 13844 } 13845 return false 13846 } 13847 func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { 13848 b := v.Block 13849 _ = b 13850 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 13851 // cond: 13852 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 13853 for { 13854 _ = v.Args[3] 13855 v_0 := v.Args[0] 13856 if v_0.Op != OpARMMOVWconst { 13857 break 13858 } 13859 c := v_0.AuxInt 13860 x := v.Args[1] 13861 y := v.Args[2] 13862 flags := v.Args[3] 13863 v.reset(OpARMRSCconst) 13864 v.AuxInt = c 13865 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13866 v0.AddArg(x) 13867 v0.AddArg(y) 13868 v.AddArg(v0) 13869 v.AddArg(flags) 13870 return true 13871 } 13872 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 13873 // cond: 13874 // result: (SBCshiftLL x y [c] flags) 13875 for { 13876 _ = v.Args[3] 13877 x := v.Args[0] 13878 y := v.Args[1] 13879 v_2 := v.Args[2] 13880 if v_2.Op != OpARMMOVWconst { 13881 break 13882 } 13883 c := v_2.AuxInt 13884 flags := v.Args[3] 13885 v.reset(OpARMSBCshiftLL) 13886 v.AuxInt = c 13887 v.AddArg(x) 13888 v.AddArg(y) 13889 v.AddArg(flags) 13890 return true 13891 } 13892 return false 13893 } 13894 func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { 13895 b := v.Block 13896 _ = b 13897 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 13898 // cond: 13899 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 13900 for { 13901 d := v.AuxInt 13902 _ = v.Args[2] 13903 v_0 := v.Args[0] 13904 if v_0.Op != OpARMMOVWconst { 13905 break 13906 } 13907 c := v_0.AuxInt 13908 x := v.Args[1] 13909 flags := v.Args[2] 13910 v.reset(OpARMRSCconst) 13911 v.AuxInt = c 13912 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13913 v0.AuxInt = d 13914 v0.AddArg(x) 13915 v.AddArg(v0) 13916 v.AddArg(flags) 13917 return true 13918 } 13919 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 13920 // cond: 13921 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 13922 for { 13923 d := v.AuxInt 13924 _ = v.Args[2] 13925 x := v.Args[0] 13926 v_1 := v.Args[1] 13927 if v_1.Op != OpARMMOVWconst { 13928 break 13929 } 13930 c := v_1.AuxInt 13931 flags := v.Args[2] 13932 v.reset(OpARMSBCconst) 13933 v.AuxInt = int64(int32(c) >> uint64(d)) 13934 v.AddArg(x) 13935 v.AddArg(flags) 13936 return true 13937 } 13938 return false 13939 } 13940 func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { 13941 b := v.Block 13942 _ = b 13943 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 13944 // cond: 13945 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 13946 for { 13947 _ = v.Args[3] 13948 v_0 := v.Args[0] 13949 if v_0.Op != OpARMMOVWconst { 13950 break 13951 } 13952 c := v_0.AuxInt 13953 x := v.Args[1] 13954 y := v.Args[2] 13955 flags := v.Args[3] 13956 v.reset(OpARMRSCconst) 13957 v.AuxInt = c 13958 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13959 v0.AddArg(x) 13960 v0.AddArg(y) 13961 v.AddArg(v0) 13962 v.AddArg(flags) 13963 return true 13964 } 13965 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 13966 // cond: 13967 // result: (SBCshiftRA x y [c] flags) 13968 for { 13969 _ = v.Args[3] 13970 x := v.Args[0] 13971 y := v.Args[1] 13972 v_2 := v.Args[2] 13973 if v_2.Op != OpARMMOVWconst { 13974 break 13975 } 13976 c := v_2.AuxInt 13977 flags := v.Args[3] 13978 v.reset(OpARMSBCshiftRA) 13979 v.AuxInt = c 13980 v.AddArg(x) 13981 v.AddArg(y) 13982 v.AddArg(flags) 13983 return true 13984 } 13985 return false 13986 } 13987 func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { 13988 b := v.Block 13989 _ = b 13990 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 13991 // cond: 13992 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 13993 for { 13994 d := v.AuxInt 13995 _ = v.Args[2] 13996 v_0 := v.Args[0] 13997 if v_0.Op != OpARMMOVWconst { 13998 break 13999 } 14000 c := v_0.AuxInt 14001 x := v.Args[1] 14002 flags := v.Args[2] 14003 v.reset(OpARMRSCconst) 14004 v.AuxInt = c 14005 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 14006 v0.AuxInt = d 14007 v0.AddArg(x) 14008 v.AddArg(v0) 14009 v.AddArg(flags) 14010 return true 14011 } 14012 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 14013 // cond: 14014 // result: (SBCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 14015 for { 14016 d := v.AuxInt 14017 _ = v.Args[2] 14018 x := v.Args[0] 14019 v_1 := v.Args[1] 14020 if v_1.Op != OpARMMOVWconst { 14021 break 14022 } 14023 c := v_1.AuxInt 14024 flags := v.Args[2] 14025 v.reset(OpARMSBCconst) 14026 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 14027 v.AddArg(x) 14028 v.AddArg(flags) 14029 return true 14030 } 14031 return false 14032 } 14033 func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { 14034 b := v.Block 14035 _ = b 14036 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 14037 // cond: 14038 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 14039 for { 14040 _ = v.Args[3] 14041 v_0 := v.Args[0] 14042 if v_0.Op != OpARMMOVWconst { 14043 break 14044 } 14045 c := v_0.AuxInt 14046 x := v.Args[1] 14047 y := v.Args[2] 14048 flags := v.Args[3] 14049 v.reset(OpARMRSCconst) 14050 v.AuxInt = c 14051 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 14052 v0.AddArg(x) 14053 v0.AddArg(y) 14054 v.AddArg(v0) 14055 v.AddArg(flags) 14056 return true 14057 } 14058 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 14059 // cond: 14060 // result: (SBCshiftRL x y [c] flags) 14061 for { 14062 _ = v.Args[3] 14063 x := v.Args[0] 14064 y := v.Args[1] 14065 v_2 := v.Args[2] 14066 if v_2.Op != OpARMMOVWconst { 14067 break 14068 } 14069 c := v_2.AuxInt 14070 flags := v.Args[3] 14071 v.reset(OpARMSBCshiftRL) 14072 v.AuxInt = c 14073 v.AddArg(x) 14074 v.AddArg(y) 14075 v.AddArg(flags) 14076 return true 14077 } 14078 return false 14079 } 14080 func rewriteValueARM_OpARMSLL_0(v *Value) bool { 14081 // match: (SLL x (MOVWconst [c])) 14082 // cond: 14083 // result: (SLLconst x [c&31]) 14084 for { 14085 _ = v.Args[1] 14086 x := v.Args[0] 14087 v_1 := v.Args[1] 14088 if v_1.Op != OpARMMOVWconst { 14089 break 14090 } 14091 c := v_1.AuxInt 14092 v.reset(OpARMSLLconst) 14093 v.AuxInt = c & 31 14094 v.AddArg(x) 14095 return true 14096 } 14097 return false 14098 } 14099 func rewriteValueARM_OpARMSLLconst_0(v *Value) bool { 14100 // match: (SLLconst [c] (MOVWconst [d])) 14101 // cond: 14102 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 14103 for { 14104 c := v.AuxInt 14105 v_0 := v.Args[0] 14106 if v_0.Op != OpARMMOVWconst { 14107 break 14108 } 14109 d := v_0.AuxInt 14110 v.reset(OpARMMOVWconst) 14111 v.AuxInt = int64(uint32(d) << uint64(c)) 14112 return true 14113 } 14114 return false 14115 } 14116 func rewriteValueARM_OpARMSRA_0(v *Value) bool { 14117 // match: (SRA x (MOVWconst [c])) 14118 // cond: 14119 // result: (SRAconst x [c&31]) 14120 for { 14121 _ = v.Args[1] 14122 x := v.Args[0] 14123 v_1 := v.Args[1] 14124 if v_1.Op != OpARMMOVWconst { 14125 break 14126 } 14127 c := v_1.AuxInt 14128 v.reset(OpARMSRAconst) 14129 v.AuxInt = c & 31 14130 v.AddArg(x) 14131 return true 14132 } 14133 return false 14134 } 14135 func rewriteValueARM_OpARMSRAcond_0(v *Value) bool { 14136 // match: (SRAcond x _ (FlagEQ)) 14137 // cond: 14138 // result: (SRAconst x [31]) 14139 for { 14140 _ = v.Args[2] 14141 x := v.Args[0] 14142 v_2 := v.Args[2] 14143 if v_2.Op != OpARMFlagEQ { 14144 break 14145 } 14146 v.reset(OpARMSRAconst) 14147 v.AuxInt = 31 14148 v.AddArg(x) 14149 return true 14150 } 14151 // match: (SRAcond x y (FlagLT_ULT)) 14152 // cond: 14153 // result: (SRA x y) 14154 for { 14155 _ = v.Args[2] 14156 x := v.Args[0] 14157 y := v.Args[1] 14158 v_2 := v.Args[2] 14159 if v_2.Op != OpARMFlagLT_ULT { 14160 break 14161 } 14162 v.reset(OpARMSRA) 14163 v.AddArg(x) 14164 v.AddArg(y) 14165 return true 14166 } 14167 // match: (SRAcond x _ (FlagLT_UGT)) 14168 // cond: 14169 // result: (SRAconst x [31]) 14170 for { 14171 _ = v.Args[2] 14172 x := v.Args[0] 14173 v_2 := v.Args[2] 14174 if v_2.Op != OpARMFlagLT_UGT { 14175 break 14176 } 14177 v.reset(OpARMSRAconst) 14178 v.AuxInt = 31 14179 v.AddArg(x) 14180 return true 14181 } 14182 // match: (SRAcond x y (FlagGT_ULT)) 14183 // cond: 14184 // result: (SRA x y) 14185 for { 14186 _ = v.Args[2] 14187 x := v.Args[0] 14188 y := v.Args[1] 14189 v_2 := v.Args[2] 14190 if v_2.Op != OpARMFlagGT_ULT { 14191 break 14192 } 14193 v.reset(OpARMSRA) 14194 v.AddArg(x) 14195 v.AddArg(y) 14196 return true 14197 } 14198 // match: (SRAcond x _ (FlagGT_UGT)) 14199 // cond: 14200 // result: (SRAconst x [31]) 14201 for { 14202 _ = v.Args[2] 14203 x := v.Args[0] 14204 v_2 := v.Args[2] 14205 if v_2.Op != OpARMFlagGT_UGT { 14206 break 14207 } 14208 v.reset(OpARMSRAconst) 14209 v.AuxInt = 31 14210 v.AddArg(x) 14211 return true 14212 } 14213 return false 14214 } 14215 func rewriteValueARM_OpARMSRAconst_0(v *Value) bool { 14216 // match: (SRAconst [c] (MOVWconst [d])) 14217 // cond: 14218 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 14219 for { 14220 c := v.AuxInt 14221 v_0 := v.Args[0] 14222 if v_0.Op != OpARMMOVWconst { 14223 break 14224 } 14225 d := v_0.AuxInt 14226 v.reset(OpARMMOVWconst) 14227 v.AuxInt = int64(int32(d) >> uint64(c)) 14228 return true 14229 } 14230 // match: (SRAconst (SLLconst x [c]) [d]) 14231 // cond: objabi.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 14232 // result: (BFX [(d-c)|(32-d)<<8] x) 14233 for { 14234 d := v.AuxInt 14235 v_0 := v.Args[0] 14236 if v_0.Op != OpARMSLLconst { 14237 break 14238 } 14239 c := v_0.AuxInt 14240 x := v_0.Args[0] 14241 if !(objabi.GOARM == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 14242 break 14243 } 14244 v.reset(OpARMBFX) 14245 v.AuxInt = (d - c) | (32-d)<<8 14246 v.AddArg(x) 14247 return true 14248 } 14249 return false 14250 } 14251 func rewriteValueARM_OpARMSRL_0(v *Value) bool { 14252 // match: (SRL x (MOVWconst [c])) 14253 // cond: 14254 // result: (SRLconst x [c&31]) 14255 for { 14256 _ = v.Args[1] 14257 x := v.Args[0] 14258 v_1 := v.Args[1] 14259 if v_1.Op != OpARMMOVWconst { 14260 break 14261 } 14262 c := v_1.AuxInt 14263 v.reset(OpARMSRLconst) 14264 v.AuxInt = c & 31 14265 v.AddArg(x) 14266 return true 14267 } 14268 return false 14269 } 14270 func rewriteValueARM_OpARMSRLconst_0(v *Value) bool { 14271 // match: (SRLconst [c] (MOVWconst [d])) 14272 // cond: 14273 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 14274 for { 14275 c := v.AuxInt 14276 v_0 := v.Args[0] 14277 if v_0.Op != OpARMMOVWconst { 14278 break 14279 } 14280 d := v_0.AuxInt 14281 v.reset(OpARMMOVWconst) 14282 v.AuxInt = int64(uint32(d) >> uint64(c)) 14283 return true 14284 } 14285 // match: (SRLconst (SLLconst x [c]) [d]) 14286 // cond: objabi.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 14287 // result: (BFXU [(d-c)|(32-d)<<8] x) 14288 for { 14289 d := v.AuxInt 14290 v_0 := v.Args[0] 14291 if v_0.Op != OpARMSLLconst { 14292 break 14293 } 14294 c := v_0.AuxInt 14295 x := v_0.Args[0] 14296 if !(objabi.GOARM == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 14297 break 14298 } 14299 v.reset(OpARMBFXU) 14300 v.AuxInt = (d - c) | (32-d)<<8 14301 v.AddArg(x) 14302 return true 14303 } 14304 return false 14305 } 14306 func rewriteValueARM_OpARMSUB_0(v *Value) bool { 14307 // match: (SUB (MOVWconst [c]) x) 14308 // cond: 14309 // result: (RSBconst [c] x) 14310 for { 14311 _ = v.Args[1] 14312 v_0 := v.Args[0] 14313 if v_0.Op != OpARMMOVWconst { 14314 break 14315 } 14316 c := v_0.AuxInt 14317 x := v.Args[1] 14318 v.reset(OpARMRSBconst) 14319 v.AuxInt = c 14320 v.AddArg(x) 14321 return true 14322 } 14323 // match: (SUB x (MOVWconst [c])) 14324 // cond: 14325 // result: (SUBconst [c] x) 14326 for { 14327 _ = v.Args[1] 14328 x := v.Args[0] 14329 v_1 := v.Args[1] 14330 if v_1.Op != OpARMMOVWconst { 14331 break 14332 } 14333 c := v_1.AuxInt 14334 v.reset(OpARMSUBconst) 14335 v.AuxInt = c 14336 v.AddArg(x) 14337 return true 14338 } 14339 // match: (SUB x (SLLconst [c] y)) 14340 // cond: 14341 // result: (SUBshiftLL x y [c]) 14342 for { 14343 _ = v.Args[1] 14344 x := v.Args[0] 14345 v_1 := v.Args[1] 14346 if v_1.Op != OpARMSLLconst { 14347 break 14348 } 14349 c := v_1.AuxInt 14350 y := v_1.Args[0] 14351 v.reset(OpARMSUBshiftLL) 14352 v.AuxInt = c 14353 v.AddArg(x) 14354 v.AddArg(y) 14355 return true 14356 } 14357 // match: (SUB (SLLconst [c] y) x) 14358 // cond: 14359 // result: (RSBshiftLL x y [c]) 14360 for { 14361 _ = v.Args[1] 14362 v_0 := v.Args[0] 14363 if v_0.Op != OpARMSLLconst { 14364 break 14365 } 14366 c := v_0.AuxInt 14367 y := v_0.Args[0] 14368 x := v.Args[1] 14369 v.reset(OpARMRSBshiftLL) 14370 v.AuxInt = c 14371 v.AddArg(x) 14372 v.AddArg(y) 14373 return true 14374 } 14375 // match: (SUB x (SRLconst [c] y)) 14376 // cond: 14377 // result: (SUBshiftRL x y [c]) 14378 for { 14379 _ = v.Args[1] 14380 x := v.Args[0] 14381 v_1 := v.Args[1] 14382 if v_1.Op != OpARMSRLconst { 14383 break 14384 } 14385 c := v_1.AuxInt 14386 y := v_1.Args[0] 14387 v.reset(OpARMSUBshiftRL) 14388 v.AuxInt = c 14389 v.AddArg(x) 14390 v.AddArg(y) 14391 return true 14392 } 14393 // match: (SUB (SRLconst [c] y) x) 14394 // cond: 14395 // result: (RSBshiftRL x y [c]) 14396 for { 14397 _ = v.Args[1] 14398 v_0 := v.Args[0] 14399 if v_0.Op != OpARMSRLconst { 14400 break 14401 } 14402 c := v_0.AuxInt 14403 y := v_0.Args[0] 14404 x := v.Args[1] 14405 v.reset(OpARMRSBshiftRL) 14406 v.AuxInt = c 14407 v.AddArg(x) 14408 v.AddArg(y) 14409 return true 14410 } 14411 // match: (SUB x (SRAconst [c] y)) 14412 // cond: 14413 // result: (SUBshiftRA x y [c]) 14414 for { 14415 _ = v.Args[1] 14416 x := v.Args[0] 14417 v_1 := v.Args[1] 14418 if v_1.Op != OpARMSRAconst { 14419 break 14420 } 14421 c := v_1.AuxInt 14422 y := v_1.Args[0] 14423 v.reset(OpARMSUBshiftRA) 14424 v.AuxInt = c 14425 v.AddArg(x) 14426 v.AddArg(y) 14427 return true 14428 } 14429 // match: (SUB (SRAconst [c] y) x) 14430 // cond: 14431 // result: (RSBshiftRA x y [c]) 14432 for { 14433 _ = v.Args[1] 14434 v_0 := v.Args[0] 14435 if v_0.Op != OpARMSRAconst { 14436 break 14437 } 14438 c := v_0.AuxInt 14439 y := v_0.Args[0] 14440 x := v.Args[1] 14441 v.reset(OpARMRSBshiftRA) 14442 v.AuxInt = c 14443 v.AddArg(x) 14444 v.AddArg(y) 14445 return true 14446 } 14447 // match: (SUB x (SLL y z)) 14448 // cond: 14449 // result: (SUBshiftLLreg x y z) 14450 for { 14451 _ = v.Args[1] 14452 x := v.Args[0] 14453 v_1 := v.Args[1] 14454 if v_1.Op != OpARMSLL { 14455 break 14456 } 14457 _ = v_1.Args[1] 14458 y := v_1.Args[0] 14459 z := v_1.Args[1] 14460 v.reset(OpARMSUBshiftLLreg) 14461 v.AddArg(x) 14462 v.AddArg(y) 14463 v.AddArg(z) 14464 return true 14465 } 14466 // match: (SUB (SLL y z) x) 14467 // cond: 14468 // result: (RSBshiftLLreg x y z) 14469 for { 14470 _ = v.Args[1] 14471 v_0 := v.Args[0] 14472 if v_0.Op != OpARMSLL { 14473 break 14474 } 14475 _ = v_0.Args[1] 14476 y := v_0.Args[0] 14477 z := v_0.Args[1] 14478 x := v.Args[1] 14479 v.reset(OpARMRSBshiftLLreg) 14480 v.AddArg(x) 14481 v.AddArg(y) 14482 v.AddArg(z) 14483 return true 14484 } 14485 return false 14486 } 14487 func rewriteValueARM_OpARMSUB_10(v *Value) bool { 14488 // match: (SUB x (SRL y z)) 14489 // cond: 14490 // result: (SUBshiftRLreg x y z) 14491 for { 14492 _ = v.Args[1] 14493 x := v.Args[0] 14494 v_1 := v.Args[1] 14495 if v_1.Op != OpARMSRL { 14496 break 14497 } 14498 _ = v_1.Args[1] 14499 y := v_1.Args[0] 14500 z := v_1.Args[1] 14501 v.reset(OpARMSUBshiftRLreg) 14502 v.AddArg(x) 14503 v.AddArg(y) 14504 v.AddArg(z) 14505 return true 14506 } 14507 // match: (SUB (SRL y z) x) 14508 // cond: 14509 // result: (RSBshiftRLreg x y z) 14510 for { 14511 _ = v.Args[1] 14512 v_0 := v.Args[0] 14513 if v_0.Op != OpARMSRL { 14514 break 14515 } 14516 _ = v_0.Args[1] 14517 y := v_0.Args[0] 14518 z := v_0.Args[1] 14519 x := v.Args[1] 14520 v.reset(OpARMRSBshiftRLreg) 14521 v.AddArg(x) 14522 v.AddArg(y) 14523 v.AddArg(z) 14524 return true 14525 } 14526 // match: (SUB x (SRA y z)) 14527 // cond: 14528 // result: (SUBshiftRAreg x y z) 14529 for { 14530 _ = v.Args[1] 14531 x := v.Args[0] 14532 v_1 := v.Args[1] 14533 if v_1.Op != OpARMSRA { 14534 break 14535 } 14536 _ = v_1.Args[1] 14537 y := v_1.Args[0] 14538 z := v_1.Args[1] 14539 v.reset(OpARMSUBshiftRAreg) 14540 v.AddArg(x) 14541 v.AddArg(y) 14542 v.AddArg(z) 14543 return true 14544 } 14545 // match: (SUB (SRA y z) x) 14546 // cond: 14547 // result: (RSBshiftRAreg x y z) 14548 for { 14549 _ = v.Args[1] 14550 v_0 := v.Args[0] 14551 if v_0.Op != OpARMSRA { 14552 break 14553 } 14554 _ = v_0.Args[1] 14555 y := v_0.Args[0] 14556 z := v_0.Args[1] 14557 x := v.Args[1] 14558 v.reset(OpARMRSBshiftRAreg) 14559 v.AddArg(x) 14560 v.AddArg(y) 14561 v.AddArg(z) 14562 return true 14563 } 14564 // match: (SUB x x) 14565 // cond: 14566 // result: (MOVWconst [0]) 14567 for { 14568 _ = v.Args[1] 14569 x := v.Args[0] 14570 if x != v.Args[1] { 14571 break 14572 } 14573 v.reset(OpARMMOVWconst) 14574 v.AuxInt = 0 14575 return true 14576 } 14577 // match: (SUB a (MUL x y)) 14578 // cond: objabi.GOARM == 7 14579 // result: (MULS x y a) 14580 for { 14581 _ = v.Args[1] 14582 a := v.Args[0] 14583 v_1 := v.Args[1] 14584 if v_1.Op != OpARMMUL { 14585 break 14586 } 14587 _ = v_1.Args[1] 14588 x := v_1.Args[0] 14589 y := v_1.Args[1] 14590 if !(objabi.GOARM == 7) { 14591 break 14592 } 14593 v.reset(OpARMMULS) 14594 v.AddArg(x) 14595 v.AddArg(y) 14596 v.AddArg(a) 14597 return true 14598 } 14599 return false 14600 } 14601 func rewriteValueARM_OpARMSUBD_0(v *Value) bool { 14602 // match: (SUBD a (MULD x y)) 14603 // cond: a.Uses == 1 && objabi.GOARM >= 6 14604 // result: (MULSD a x y) 14605 for { 14606 _ = v.Args[1] 14607 a := v.Args[0] 14608 v_1 := v.Args[1] 14609 if v_1.Op != OpARMMULD { 14610 break 14611 } 14612 _ = v_1.Args[1] 14613 x := v_1.Args[0] 14614 y := v_1.Args[1] 14615 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14616 break 14617 } 14618 v.reset(OpARMMULSD) 14619 v.AddArg(a) 14620 v.AddArg(x) 14621 v.AddArg(y) 14622 return true 14623 } 14624 // match: (SUBD a (NMULD x y)) 14625 // cond: a.Uses == 1 && objabi.GOARM >= 6 14626 // result: (MULAD a x y) 14627 for { 14628 _ = v.Args[1] 14629 a := v.Args[0] 14630 v_1 := v.Args[1] 14631 if v_1.Op != OpARMNMULD { 14632 break 14633 } 14634 _ = v_1.Args[1] 14635 x := v_1.Args[0] 14636 y := v_1.Args[1] 14637 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14638 break 14639 } 14640 v.reset(OpARMMULAD) 14641 v.AddArg(a) 14642 v.AddArg(x) 14643 v.AddArg(y) 14644 return true 14645 } 14646 return false 14647 } 14648 func rewriteValueARM_OpARMSUBF_0(v *Value) bool { 14649 // match: (SUBF a (MULF x y)) 14650 // cond: a.Uses == 1 && objabi.GOARM >= 6 14651 // result: (MULSF a x y) 14652 for { 14653 _ = v.Args[1] 14654 a := v.Args[0] 14655 v_1 := v.Args[1] 14656 if v_1.Op != OpARMMULF { 14657 break 14658 } 14659 _ = v_1.Args[1] 14660 x := v_1.Args[0] 14661 y := v_1.Args[1] 14662 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14663 break 14664 } 14665 v.reset(OpARMMULSF) 14666 v.AddArg(a) 14667 v.AddArg(x) 14668 v.AddArg(y) 14669 return true 14670 } 14671 // match: (SUBF a (NMULF x y)) 14672 // cond: a.Uses == 1 && objabi.GOARM >= 6 14673 // result: (MULAF a x y) 14674 for { 14675 _ = v.Args[1] 14676 a := v.Args[0] 14677 v_1 := v.Args[1] 14678 if v_1.Op != OpARMNMULF { 14679 break 14680 } 14681 _ = v_1.Args[1] 14682 x := v_1.Args[0] 14683 y := v_1.Args[1] 14684 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14685 break 14686 } 14687 v.reset(OpARMMULAF) 14688 v.AddArg(a) 14689 v.AddArg(x) 14690 v.AddArg(y) 14691 return true 14692 } 14693 return false 14694 } 14695 func rewriteValueARM_OpARMSUBS_0(v *Value) bool { 14696 // match: (SUBS x (MOVWconst [c])) 14697 // cond: 14698 // result: (SUBSconst [c] x) 14699 for { 14700 _ = v.Args[1] 14701 x := v.Args[0] 14702 v_1 := v.Args[1] 14703 if v_1.Op != OpARMMOVWconst { 14704 break 14705 } 14706 c := v_1.AuxInt 14707 v.reset(OpARMSUBSconst) 14708 v.AuxInt = c 14709 v.AddArg(x) 14710 return true 14711 } 14712 // match: (SUBS x (SLLconst [c] y)) 14713 // cond: 14714 // result: (SUBSshiftLL x y [c]) 14715 for { 14716 _ = v.Args[1] 14717 x := v.Args[0] 14718 v_1 := v.Args[1] 14719 if v_1.Op != OpARMSLLconst { 14720 break 14721 } 14722 c := v_1.AuxInt 14723 y := v_1.Args[0] 14724 v.reset(OpARMSUBSshiftLL) 14725 v.AuxInt = c 14726 v.AddArg(x) 14727 v.AddArg(y) 14728 return true 14729 } 14730 // match: (SUBS (SLLconst [c] y) x) 14731 // cond: 14732 // result: (RSBSshiftLL x y [c]) 14733 for { 14734 _ = v.Args[1] 14735 v_0 := v.Args[0] 14736 if v_0.Op != OpARMSLLconst { 14737 break 14738 } 14739 c := v_0.AuxInt 14740 y := v_0.Args[0] 14741 x := v.Args[1] 14742 v.reset(OpARMRSBSshiftLL) 14743 v.AuxInt = c 14744 v.AddArg(x) 14745 v.AddArg(y) 14746 return true 14747 } 14748 // match: (SUBS x (SRLconst [c] y)) 14749 // cond: 14750 // result: (SUBSshiftRL x y [c]) 14751 for { 14752 _ = v.Args[1] 14753 x := v.Args[0] 14754 v_1 := v.Args[1] 14755 if v_1.Op != OpARMSRLconst { 14756 break 14757 } 14758 c := v_1.AuxInt 14759 y := v_1.Args[0] 14760 v.reset(OpARMSUBSshiftRL) 14761 v.AuxInt = c 14762 v.AddArg(x) 14763 v.AddArg(y) 14764 return true 14765 } 14766 // match: (SUBS (SRLconst [c] y) x) 14767 // cond: 14768 // result: (RSBSshiftRL x y [c]) 14769 for { 14770 _ = v.Args[1] 14771 v_0 := v.Args[0] 14772 if v_0.Op != OpARMSRLconst { 14773 break 14774 } 14775 c := v_0.AuxInt 14776 y := v_0.Args[0] 14777 x := v.Args[1] 14778 v.reset(OpARMRSBSshiftRL) 14779 v.AuxInt = c 14780 v.AddArg(x) 14781 v.AddArg(y) 14782 return true 14783 } 14784 // match: (SUBS x (SRAconst [c] y)) 14785 // cond: 14786 // result: (SUBSshiftRA x y [c]) 14787 for { 14788 _ = v.Args[1] 14789 x := v.Args[0] 14790 v_1 := v.Args[1] 14791 if v_1.Op != OpARMSRAconst { 14792 break 14793 } 14794 c := v_1.AuxInt 14795 y := v_1.Args[0] 14796 v.reset(OpARMSUBSshiftRA) 14797 v.AuxInt = c 14798 v.AddArg(x) 14799 v.AddArg(y) 14800 return true 14801 } 14802 // match: (SUBS (SRAconst [c] y) x) 14803 // cond: 14804 // result: (RSBSshiftRA x y [c]) 14805 for { 14806 _ = v.Args[1] 14807 v_0 := v.Args[0] 14808 if v_0.Op != OpARMSRAconst { 14809 break 14810 } 14811 c := v_0.AuxInt 14812 y := v_0.Args[0] 14813 x := v.Args[1] 14814 v.reset(OpARMRSBSshiftRA) 14815 v.AuxInt = c 14816 v.AddArg(x) 14817 v.AddArg(y) 14818 return true 14819 } 14820 // match: (SUBS x (SLL y z)) 14821 // cond: 14822 // result: (SUBSshiftLLreg x y z) 14823 for { 14824 _ = v.Args[1] 14825 x := v.Args[0] 14826 v_1 := v.Args[1] 14827 if v_1.Op != OpARMSLL { 14828 break 14829 } 14830 _ = v_1.Args[1] 14831 y := v_1.Args[0] 14832 z := v_1.Args[1] 14833 v.reset(OpARMSUBSshiftLLreg) 14834 v.AddArg(x) 14835 v.AddArg(y) 14836 v.AddArg(z) 14837 return true 14838 } 14839 // match: (SUBS (SLL y z) x) 14840 // cond: 14841 // result: (RSBSshiftLLreg x y z) 14842 for { 14843 _ = v.Args[1] 14844 v_0 := v.Args[0] 14845 if v_0.Op != OpARMSLL { 14846 break 14847 } 14848 _ = v_0.Args[1] 14849 y := v_0.Args[0] 14850 z := v_0.Args[1] 14851 x := v.Args[1] 14852 v.reset(OpARMRSBSshiftLLreg) 14853 v.AddArg(x) 14854 v.AddArg(y) 14855 v.AddArg(z) 14856 return true 14857 } 14858 // match: (SUBS x (SRL y z)) 14859 // cond: 14860 // result: (SUBSshiftRLreg x y z) 14861 for { 14862 _ = v.Args[1] 14863 x := v.Args[0] 14864 v_1 := v.Args[1] 14865 if v_1.Op != OpARMSRL { 14866 break 14867 } 14868 _ = v_1.Args[1] 14869 y := v_1.Args[0] 14870 z := v_1.Args[1] 14871 v.reset(OpARMSUBSshiftRLreg) 14872 v.AddArg(x) 14873 v.AddArg(y) 14874 v.AddArg(z) 14875 return true 14876 } 14877 return false 14878 } 14879 func rewriteValueARM_OpARMSUBS_10(v *Value) bool { 14880 // match: (SUBS (SRL y z) x) 14881 // cond: 14882 // result: (RSBSshiftRLreg x y z) 14883 for { 14884 _ = v.Args[1] 14885 v_0 := v.Args[0] 14886 if v_0.Op != OpARMSRL { 14887 break 14888 } 14889 _ = v_0.Args[1] 14890 y := v_0.Args[0] 14891 z := v_0.Args[1] 14892 x := v.Args[1] 14893 v.reset(OpARMRSBSshiftRLreg) 14894 v.AddArg(x) 14895 v.AddArg(y) 14896 v.AddArg(z) 14897 return true 14898 } 14899 // match: (SUBS x (SRA y z)) 14900 // cond: 14901 // result: (SUBSshiftRAreg x y z) 14902 for { 14903 _ = v.Args[1] 14904 x := v.Args[0] 14905 v_1 := v.Args[1] 14906 if v_1.Op != OpARMSRA { 14907 break 14908 } 14909 _ = v_1.Args[1] 14910 y := v_1.Args[0] 14911 z := v_1.Args[1] 14912 v.reset(OpARMSUBSshiftRAreg) 14913 v.AddArg(x) 14914 v.AddArg(y) 14915 v.AddArg(z) 14916 return true 14917 } 14918 // match: (SUBS (SRA y z) x) 14919 // cond: 14920 // result: (RSBSshiftRAreg x y z) 14921 for { 14922 _ = v.Args[1] 14923 v_0 := v.Args[0] 14924 if v_0.Op != OpARMSRA { 14925 break 14926 } 14927 _ = v_0.Args[1] 14928 y := v_0.Args[0] 14929 z := v_0.Args[1] 14930 x := v.Args[1] 14931 v.reset(OpARMRSBSshiftRAreg) 14932 v.AddArg(x) 14933 v.AddArg(y) 14934 v.AddArg(z) 14935 return true 14936 } 14937 return false 14938 } 14939 func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { 14940 b := v.Block 14941 _ = b 14942 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 14943 // cond: 14944 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 14945 for { 14946 d := v.AuxInt 14947 _ = v.Args[1] 14948 v_0 := v.Args[0] 14949 if v_0.Op != OpARMMOVWconst { 14950 break 14951 } 14952 c := v_0.AuxInt 14953 x := v.Args[1] 14954 v.reset(OpARMRSBSconst) 14955 v.AuxInt = c 14956 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 14957 v0.AuxInt = d 14958 v0.AddArg(x) 14959 v.AddArg(v0) 14960 return true 14961 } 14962 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 14963 // cond: 14964 // result: (SUBSconst x [int64(int32(uint32(c)<<uint64(d)))]) 14965 for { 14966 d := v.AuxInt 14967 _ = v.Args[1] 14968 x := v.Args[0] 14969 v_1 := v.Args[1] 14970 if v_1.Op != OpARMMOVWconst { 14971 break 14972 } 14973 c := v_1.AuxInt 14974 v.reset(OpARMSUBSconst) 14975 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 14976 v.AddArg(x) 14977 return true 14978 } 14979 return false 14980 } 14981 func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { 14982 b := v.Block 14983 _ = b 14984 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 14985 // cond: 14986 // result: (RSBSconst [c] (SLL <x.Type> x y)) 14987 for { 14988 _ = v.Args[2] 14989 v_0 := v.Args[0] 14990 if v_0.Op != OpARMMOVWconst { 14991 break 14992 } 14993 c := v_0.AuxInt 14994 x := v.Args[1] 14995 y := v.Args[2] 14996 v.reset(OpARMRSBSconst) 14997 v.AuxInt = c 14998 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 14999 v0.AddArg(x) 15000 v0.AddArg(y) 15001 v.AddArg(v0) 15002 return true 15003 } 15004 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 15005 // cond: 15006 // result: (SUBSshiftLL x y [c]) 15007 for { 15008 _ = v.Args[2] 15009 x := v.Args[0] 15010 y := v.Args[1] 15011 v_2 := v.Args[2] 15012 if v_2.Op != OpARMMOVWconst { 15013 break 15014 } 15015 c := v_2.AuxInt 15016 v.reset(OpARMSUBSshiftLL) 15017 v.AuxInt = c 15018 v.AddArg(x) 15019 v.AddArg(y) 15020 return true 15021 } 15022 return false 15023 } 15024 func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { 15025 b := v.Block 15026 _ = b 15027 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 15028 // cond: 15029 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 15030 for { 15031 d := v.AuxInt 15032 _ = v.Args[1] 15033 v_0 := v.Args[0] 15034 if v_0.Op != OpARMMOVWconst { 15035 break 15036 } 15037 c := v_0.AuxInt 15038 x := v.Args[1] 15039 v.reset(OpARMRSBSconst) 15040 v.AuxInt = c 15041 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 15042 v0.AuxInt = d 15043 v0.AddArg(x) 15044 v.AddArg(v0) 15045 return true 15046 } 15047 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 15048 // cond: 15049 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 15050 for { 15051 d := v.AuxInt 15052 _ = v.Args[1] 15053 x := v.Args[0] 15054 v_1 := v.Args[1] 15055 if v_1.Op != OpARMMOVWconst { 15056 break 15057 } 15058 c := v_1.AuxInt 15059 v.reset(OpARMSUBSconst) 15060 v.AuxInt = int64(int32(c) >> uint64(d)) 15061 v.AddArg(x) 15062 return true 15063 } 15064 return false 15065 } 15066 func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { 15067 b := v.Block 15068 _ = b 15069 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 15070 // cond: 15071 // result: (RSBSconst [c] (SRA <x.Type> x y)) 15072 for { 15073 _ = v.Args[2] 15074 v_0 := v.Args[0] 15075 if v_0.Op != OpARMMOVWconst { 15076 break 15077 } 15078 c := v_0.AuxInt 15079 x := v.Args[1] 15080 y := v.Args[2] 15081 v.reset(OpARMRSBSconst) 15082 v.AuxInt = c 15083 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 15084 v0.AddArg(x) 15085 v0.AddArg(y) 15086 v.AddArg(v0) 15087 return true 15088 } 15089 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 15090 // cond: 15091 // result: (SUBSshiftRA x y [c]) 15092 for { 15093 _ = v.Args[2] 15094 x := v.Args[0] 15095 y := v.Args[1] 15096 v_2 := v.Args[2] 15097 if v_2.Op != OpARMMOVWconst { 15098 break 15099 } 15100 c := v_2.AuxInt 15101 v.reset(OpARMSUBSshiftRA) 15102 v.AuxInt = c 15103 v.AddArg(x) 15104 v.AddArg(y) 15105 return true 15106 } 15107 return false 15108 } 15109 func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { 15110 b := v.Block 15111 _ = b 15112 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 15113 // cond: 15114 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 15115 for { 15116 d := v.AuxInt 15117 _ = v.Args[1] 15118 v_0 := v.Args[0] 15119 if v_0.Op != OpARMMOVWconst { 15120 break 15121 } 15122 c := v_0.AuxInt 15123 x := v.Args[1] 15124 v.reset(OpARMRSBSconst) 15125 v.AuxInt = c 15126 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 15127 v0.AuxInt = d 15128 v0.AddArg(x) 15129 v.AddArg(v0) 15130 return true 15131 } 15132 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 15133 // cond: 15134 // result: (SUBSconst x [int64(int32(uint32(c)>>uint64(d)))]) 15135 for { 15136 d := v.AuxInt 15137 _ = v.Args[1] 15138 x := v.Args[0] 15139 v_1 := v.Args[1] 15140 if v_1.Op != OpARMMOVWconst { 15141 break 15142 } 15143 c := v_1.AuxInt 15144 v.reset(OpARMSUBSconst) 15145 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 15146 v.AddArg(x) 15147 return true 15148 } 15149 return false 15150 } 15151 func rewriteValueARM_OpARMSUBSshiftRLreg_0(v *Value) bool { 15152 b := v.Block 15153 _ = b 15154 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 15155 // cond: 15156 // result: (RSBSconst [c] (SRL <x.Type> x y)) 15157 for { 15158 _ = v.Args[2] 15159 v_0 := v.Args[0] 15160 if v_0.Op != OpARMMOVWconst { 15161 break 15162 } 15163 c := v_0.AuxInt 15164 x := v.Args[1] 15165 y := v.Args[2] 15166 v.reset(OpARMRSBSconst) 15167 v.AuxInt = c 15168 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15169 v0.AddArg(x) 15170 v0.AddArg(y) 15171 v.AddArg(v0) 15172 return true 15173 } 15174 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 15175 // cond: 15176 // result: (SUBSshiftRL x y [c]) 15177 for { 15178 _ = v.Args[2] 15179 x := v.Args[0] 15180 y := v.Args[1] 15181 v_2 := v.Args[2] 15182 if v_2.Op != OpARMMOVWconst { 15183 break 15184 } 15185 c := v_2.AuxInt 15186 v.reset(OpARMSUBSshiftRL) 15187 v.AuxInt = c 15188 v.AddArg(x) 15189 v.AddArg(y) 15190 return true 15191 } 15192 return false 15193 } 15194 func rewriteValueARM_OpARMSUBconst_0(v *Value) bool { 15195 // match: (SUBconst [off1] (MOVWaddr [off2] {sym} ptr)) 15196 // cond: 15197 // result: (MOVWaddr [off2-off1] {sym} ptr) 15198 for { 15199 off1 := v.AuxInt 15200 v_0 := v.Args[0] 15201 if v_0.Op != OpARMMOVWaddr { 15202 break 15203 } 15204 off2 := v_0.AuxInt 15205 sym := v_0.Aux 15206 ptr := v_0.Args[0] 15207 v.reset(OpARMMOVWaddr) 15208 v.AuxInt = off2 - off1 15209 v.Aux = sym 15210 v.AddArg(ptr) 15211 return true 15212 } 15213 // match: (SUBconst [0] x) 15214 // cond: 15215 // result: x 15216 for { 15217 if v.AuxInt != 0 { 15218 break 15219 } 15220 x := v.Args[0] 15221 v.reset(OpCopy) 15222 v.Type = x.Type 15223 v.AddArg(x) 15224 return true 15225 } 15226 // match: (SUBconst [c] x) 15227 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 15228 // result: (ADDconst [int64(int32(-c))] x) 15229 for { 15230 c := v.AuxInt 15231 x := v.Args[0] 15232 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 15233 break 15234 } 15235 v.reset(OpARMADDconst) 15236 v.AuxInt = int64(int32(-c)) 15237 v.AddArg(x) 15238 return true 15239 } 15240 // match: (SUBconst [c] (MOVWconst [d])) 15241 // cond: 15242 // result: (MOVWconst [int64(int32(d-c))]) 15243 for { 15244 c := v.AuxInt 15245 v_0 := v.Args[0] 15246 if v_0.Op != OpARMMOVWconst { 15247 break 15248 } 15249 d := v_0.AuxInt 15250 v.reset(OpARMMOVWconst) 15251 v.AuxInt = int64(int32(d - c)) 15252 return true 15253 } 15254 // match: (SUBconst [c] (SUBconst [d] x)) 15255 // cond: 15256 // result: (ADDconst [int64(int32(-c-d))] x) 15257 for { 15258 c := v.AuxInt 15259 v_0 := v.Args[0] 15260 if v_0.Op != OpARMSUBconst { 15261 break 15262 } 15263 d := v_0.AuxInt 15264 x := v_0.Args[0] 15265 v.reset(OpARMADDconst) 15266 v.AuxInt = int64(int32(-c - d)) 15267 v.AddArg(x) 15268 return true 15269 } 15270 // match: (SUBconst [c] (ADDconst [d] x)) 15271 // cond: 15272 // result: (ADDconst [int64(int32(-c+d))] x) 15273 for { 15274 c := v.AuxInt 15275 v_0 := v.Args[0] 15276 if v_0.Op != OpARMADDconst { 15277 break 15278 } 15279 d := v_0.AuxInt 15280 x := v_0.Args[0] 15281 v.reset(OpARMADDconst) 15282 v.AuxInt = int64(int32(-c + d)) 15283 v.AddArg(x) 15284 return true 15285 } 15286 // match: (SUBconst [c] (RSBconst [d] x)) 15287 // cond: 15288 // result: (RSBconst [int64(int32(-c+d))] x) 15289 for { 15290 c := v.AuxInt 15291 v_0 := v.Args[0] 15292 if v_0.Op != OpARMRSBconst { 15293 break 15294 } 15295 d := v_0.AuxInt 15296 x := v_0.Args[0] 15297 v.reset(OpARMRSBconst) 15298 v.AuxInt = int64(int32(-c + d)) 15299 v.AddArg(x) 15300 return true 15301 } 15302 return false 15303 } 15304 func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { 15305 b := v.Block 15306 _ = b 15307 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 15308 // cond: 15309 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 15310 for { 15311 d := v.AuxInt 15312 _ = v.Args[1] 15313 v_0 := v.Args[0] 15314 if v_0.Op != OpARMMOVWconst { 15315 break 15316 } 15317 c := v_0.AuxInt 15318 x := v.Args[1] 15319 v.reset(OpARMRSBconst) 15320 v.AuxInt = c 15321 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 15322 v0.AuxInt = d 15323 v0.AddArg(x) 15324 v.AddArg(v0) 15325 return true 15326 } 15327 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 15328 // cond: 15329 // result: (SUBconst x [int64(int32(uint32(c)<<uint64(d)))]) 15330 for { 15331 d := v.AuxInt 15332 _ = v.Args[1] 15333 x := v.Args[0] 15334 v_1 := v.Args[1] 15335 if v_1.Op != OpARMMOVWconst { 15336 break 15337 } 15338 c := v_1.AuxInt 15339 v.reset(OpARMSUBconst) 15340 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 15341 v.AddArg(x) 15342 return true 15343 } 15344 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 15345 // cond: c==d 15346 // result: (MOVWconst [0]) 15347 for { 15348 d := v.AuxInt 15349 _ = v.Args[1] 15350 x := v.Args[0] 15351 v_1 := v.Args[1] 15352 if v_1.Op != OpARMSLLconst { 15353 break 15354 } 15355 c := v_1.AuxInt 15356 if x != v_1.Args[0] { 15357 break 15358 } 15359 if !(c == d) { 15360 break 15361 } 15362 v.reset(OpARMMOVWconst) 15363 v.AuxInt = 0 15364 return true 15365 } 15366 return false 15367 } 15368 func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { 15369 b := v.Block 15370 _ = b 15371 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 15372 // cond: 15373 // result: (RSBconst [c] (SLL <x.Type> x y)) 15374 for { 15375 _ = v.Args[2] 15376 v_0 := v.Args[0] 15377 if v_0.Op != OpARMMOVWconst { 15378 break 15379 } 15380 c := v_0.AuxInt 15381 x := v.Args[1] 15382 y := v.Args[2] 15383 v.reset(OpARMRSBconst) 15384 v.AuxInt = c 15385 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15386 v0.AddArg(x) 15387 v0.AddArg(y) 15388 v.AddArg(v0) 15389 return true 15390 } 15391 // match: (SUBshiftLLreg x y (MOVWconst [c])) 15392 // cond: 15393 // result: (SUBshiftLL x y [c]) 15394 for { 15395 _ = v.Args[2] 15396 x := v.Args[0] 15397 y := v.Args[1] 15398 v_2 := v.Args[2] 15399 if v_2.Op != OpARMMOVWconst { 15400 break 15401 } 15402 c := v_2.AuxInt 15403 v.reset(OpARMSUBshiftLL) 15404 v.AuxInt = c 15405 v.AddArg(x) 15406 v.AddArg(y) 15407 return true 15408 } 15409 return false 15410 } 15411 func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { 15412 b := v.Block 15413 _ = b 15414 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 15415 // cond: 15416 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 15417 for { 15418 d := v.AuxInt 15419 _ = v.Args[1] 15420 v_0 := v.Args[0] 15421 if v_0.Op != OpARMMOVWconst { 15422 break 15423 } 15424 c := v_0.AuxInt 15425 x := v.Args[1] 15426 v.reset(OpARMRSBconst) 15427 v.AuxInt = c 15428 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 15429 v0.AuxInt = d 15430 v0.AddArg(x) 15431 v.AddArg(v0) 15432 return true 15433 } 15434 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 15435 // cond: 15436 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 15437 for { 15438 d := v.AuxInt 15439 _ = v.Args[1] 15440 x := v.Args[0] 15441 v_1 := v.Args[1] 15442 if v_1.Op != OpARMMOVWconst { 15443 break 15444 } 15445 c := v_1.AuxInt 15446 v.reset(OpARMSUBconst) 15447 v.AuxInt = int64(int32(c) >> uint64(d)) 15448 v.AddArg(x) 15449 return true 15450 } 15451 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 15452 // cond: c==d 15453 // result: (MOVWconst [0]) 15454 for { 15455 d := v.AuxInt 15456 _ = v.Args[1] 15457 x := v.Args[0] 15458 v_1 := v.Args[1] 15459 if v_1.Op != OpARMSRAconst { 15460 break 15461 } 15462 c := v_1.AuxInt 15463 if x != v_1.Args[0] { 15464 break 15465 } 15466 if !(c == d) { 15467 break 15468 } 15469 v.reset(OpARMMOVWconst) 15470 v.AuxInt = 0 15471 return true 15472 } 15473 return false 15474 } 15475 func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { 15476 b := v.Block 15477 _ = b 15478 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 15479 // cond: 15480 // result: (RSBconst [c] (SRA <x.Type> x y)) 15481 for { 15482 _ = v.Args[2] 15483 v_0 := v.Args[0] 15484 if v_0.Op != OpARMMOVWconst { 15485 break 15486 } 15487 c := v_0.AuxInt 15488 x := v.Args[1] 15489 y := v.Args[2] 15490 v.reset(OpARMRSBconst) 15491 v.AuxInt = c 15492 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 15493 v0.AddArg(x) 15494 v0.AddArg(y) 15495 v.AddArg(v0) 15496 return true 15497 } 15498 // match: (SUBshiftRAreg x y (MOVWconst [c])) 15499 // cond: 15500 // result: (SUBshiftRA x y [c]) 15501 for { 15502 _ = v.Args[2] 15503 x := v.Args[0] 15504 y := v.Args[1] 15505 v_2 := v.Args[2] 15506 if v_2.Op != OpARMMOVWconst { 15507 break 15508 } 15509 c := v_2.AuxInt 15510 v.reset(OpARMSUBshiftRA) 15511 v.AuxInt = c 15512 v.AddArg(x) 15513 v.AddArg(y) 15514 return true 15515 } 15516 return false 15517 } 15518 func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { 15519 b := v.Block 15520 _ = b 15521 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 15522 // cond: 15523 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 15524 for { 15525 d := v.AuxInt 15526 _ = v.Args[1] 15527 v_0 := v.Args[0] 15528 if v_0.Op != OpARMMOVWconst { 15529 break 15530 } 15531 c := v_0.AuxInt 15532 x := v.Args[1] 15533 v.reset(OpARMRSBconst) 15534 v.AuxInt = c 15535 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 15536 v0.AuxInt = d 15537 v0.AddArg(x) 15538 v.AddArg(v0) 15539 return true 15540 } 15541 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 15542 // cond: 15543 // result: (SUBconst x [int64(int32(uint32(c)>>uint64(d)))]) 15544 for { 15545 d := v.AuxInt 15546 _ = v.Args[1] 15547 x := v.Args[0] 15548 v_1 := v.Args[1] 15549 if v_1.Op != OpARMMOVWconst { 15550 break 15551 } 15552 c := v_1.AuxInt 15553 v.reset(OpARMSUBconst) 15554 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 15555 v.AddArg(x) 15556 return true 15557 } 15558 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 15559 // cond: c==d 15560 // result: (MOVWconst [0]) 15561 for { 15562 d := v.AuxInt 15563 _ = v.Args[1] 15564 x := v.Args[0] 15565 v_1 := v.Args[1] 15566 if v_1.Op != OpARMSRLconst { 15567 break 15568 } 15569 c := v_1.AuxInt 15570 if x != v_1.Args[0] { 15571 break 15572 } 15573 if !(c == d) { 15574 break 15575 } 15576 v.reset(OpARMMOVWconst) 15577 v.AuxInt = 0 15578 return true 15579 } 15580 return false 15581 } 15582 func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { 15583 b := v.Block 15584 _ = b 15585 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 15586 // cond: 15587 // result: (RSBconst [c] (SRL <x.Type> x y)) 15588 for { 15589 _ = v.Args[2] 15590 v_0 := v.Args[0] 15591 if v_0.Op != OpARMMOVWconst { 15592 break 15593 } 15594 c := v_0.AuxInt 15595 x := v.Args[1] 15596 y := v.Args[2] 15597 v.reset(OpARMRSBconst) 15598 v.AuxInt = c 15599 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15600 v0.AddArg(x) 15601 v0.AddArg(y) 15602 v.AddArg(v0) 15603 return true 15604 } 15605 // match: (SUBshiftRLreg x y (MOVWconst [c])) 15606 // cond: 15607 // result: (SUBshiftRL x y [c]) 15608 for { 15609 _ = v.Args[2] 15610 x := v.Args[0] 15611 y := v.Args[1] 15612 v_2 := v.Args[2] 15613 if v_2.Op != OpARMMOVWconst { 15614 break 15615 } 15616 c := v_2.AuxInt 15617 v.reset(OpARMSUBshiftRL) 15618 v.AuxInt = c 15619 v.AddArg(x) 15620 v.AddArg(y) 15621 return true 15622 } 15623 return false 15624 } 15625 func rewriteValueARM_OpARMTEQ_0(v *Value) bool { 15626 // match: (TEQ x (MOVWconst [c])) 15627 // cond: 15628 // result: (TEQconst [c] x) 15629 for { 15630 _ = v.Args[1] 15631 x := v.Args[0] 15632 v_1 := v.Args[1] 15633 if v_1.Op != OpARMMOVWconst { 15634 break 15635 } 15636 c := v_1.AuxInt 15637 v.reset(OpARMTEQconst) 15638 v.AuxInt = c 15639 v.AddArg(x) 15640 return true 15641 } 15642 // match: (TEQ (MOVWconst [c]) x) 15643 // cond: 15644 // result: (TEQconst [c] x) 15645 for { 15646 _ = v.Args[1] 15647 v_0 := v.Args[0] 15648 if v_0.Op != OpARMMOVWconst { 15649 break 15650 } 15651 c := v_0.AuxInt 15652 x := v.Args[1] 15653 v.reset(OpARMTEQconst) 15654 v.AuxInt = c 15655 v.AddArg(x) 15656 return true 15657 } 15658 // match: (TEQ x (SLLconst [c] y)) 15659 // cond: 15660 // result: (TEQshiftLL x y [c]) 15661 for { 15662 _ = v.Args[1] 15663 x := v.Args[0] 15664 v_1 := v.Args[1] 15665 if v_1.Op != OpARMSLLconst { 15666 break 15667 } 15668 c := v_1.AuxInt 15669 y := v_1.Args[0] 15670 v.reset(OpARMTEQshiftLL) 15671 v.AuxInt = c 15672 v.AddArg(x) 15673 v.AddArg(y) 15674 return true 15675 } 15676 // match: (TEQ (SLLconst [c] y) x) 15677 // cond: 15678 // result: (TEQshiftLL x y [c]) 15679 for { 15680 _ = v.Args[1] 15681 v_0 := v.Args[0] 15682 if v_0.Op != OpARMSLLconst { 15683 break 15684 } 15685 c := v_0.AuxInt 15686 y := v_0.Args[0] 15687 x := v.Args[1] 15688 v.reset(OpARMTEQshiftLL) 15689 v.AuxInt = c 15690 v.AddArg(x) 15691 v.AddArg(y) 15692 return true 15693 } 15694 // match: (TEQ x (SRLconst [c] y)) 15695 // cond: 15696 // result: (TEQshiftRL x y [c]) 15697 for { 15698 _ = v.Args[1] 15699 x := v.Args[0] 15700 v_1 := v.Args[1] 15701 if v_1.Op != OpARMSRLconst { 15702 break 15703 } 15704 c := v_1.AuxInt 15705 y := v_1.Args[0] 15706 v.reset(OpARMTEQshiftRL) 15707 v.AuxInt = c 15708 v.AddArg(x) 15709 v.AddArg(y) 15710 return true 15711 } 15712 // match: (TEQ (SRLconst [c] y) x) 15713 // cond: 15714 // result: (TEQshiftRL x y [c]) 15715 for { 15716 _ = v.Args[1] 15717 v_0 := v.Args[0] 15718 if v_0.Op != OpARMSRLconst { 15719 break 15720 } 15721 c := v_0.AuxInt 15722 y := v_0.Args[0] 15723 x := v.Args[1] 15724 v.reset(OpARMTEQshiftRL) 15725 v.AuxInt = c 15726 v.AddArg(x) 15727 v.AddArg(y) 15728 return true 15729 } 15730 // match: (TEQ x (SRAconst [c] y)) 15731 // cond: 15732 // result: (TEQshiftRA x y [c]) 15733 for { 15734 _ = v.Args[1] 15735 x := v.Args[0] 15736 v_1 := v.Args[1] 15737 if v_1.Op != OpARMSRAconst { 15738 break 15739 } 15740 c := v_1.AuxInt 15741 y := v_1.Args[0] 15742 v.reset(OpARMTEQshiftRA) 15743 v.AuxInt = c 15744 v.AddArg(x) 15745 v.AddArg(y) 15746 return true 15747 } 15748 // match: (TEQ (SRAconst [c] y) x) 15749 // cond: 15750 // result: (TEQshiftRA x y [c]) 15751 for { 15752 _ = v.Args[1] 15753 v_0 := v.Args[0] 15754 if v_0.Op != OpARMSRAconst { 15755 break 15756 } 15757 c := v_0.AuxInt 15758 y := v_0.Args[0] 15759 x := v.Args[1] 15760 v.reset(OpARMTEQshiftRA) 15761 v.AuxInt = c 15762 v.AddArg(x) 15763 v.AddArg(y) 15764 return true 15765 } 15766 // match: (TEQ x (SLL y z)) 15767 // cond: 15768 // result: (TEQshiftLLreg x y z) 15769 for { 15770 _ = v.Args[1] 15771 x := v.Args[0] 15772 v_1 := v.Args[1] 15773 if v_1.Op != OpARMSLL { 15774 break 15775 } 15776 _ = v_1.Args[1] 15777 y := v_1.Args[0] 15778 z := v_1.Args[1] 15779 v.reset(OpARMTEQshiftLLreg) 15780 v.AddArg(x) 15781 v.AddArg(y) 15782 v.AddArg(z) 15783 return true 15784 } 15785 // match: (TEQ (SLL y z) x) 15786 // cond: 15787 // result: (TEQshiftLLreg x y z) 15788 for { 15789 _ = v.Args[1] 15790 v_0 := v.Args[0] 15791 if v_0.Op != OpARMSLL { 15792 break 15793 } 15794 _ = v_0.Args[1] 15795 y := v_0.Args[0] 15796 z := v_0.Args[1] 15797 x := v.Args[1] 15798 v.reset(OpARMTEQshiftLLreg) 15799 v.AddArg(x) 15800 v.AddArg(y) 15801 v.AddArg(z) 15802 return true 15803 } 15804 return false 15805 } 15806 func rewriteValueARM_OpARMTEQ_10(v *Value) bool { 15807 // match: (TEQ x (SRL y z)) 15808 // cond: 15809 // result: (TEQshiftRLreg x y z) 15810 for { 15811 _ = v.Args[1] 15812 x := v.Args[0] 15813 v_1 := v.Args[1] 15814 if v_1.Op != OpARMSRL { 15815 break 15816 } 15817 _ = v_1.Args[1] 15818 y := v_1.Args[0] 15819 z := v_1.Args[1] 15820 v.reset(OpARMTEQshiftRLreg) 15821 v.AddArg(x) 15822 v.AddArg(y) 15823 v.AddArg(z) 15824 return true 15825 } 15826 // match: (TEQ (SRL y z) x) 15827 // cond: 15828 // result: (TEQshiftRLreg x y z) 15829 for { 15830 _ = v.Args[1] 15831 v_0 := v.Args[0] 15832 if v_0.Op != OpARMSRL { 15833 break 15834 } 15835 _ = v_0.Args[1] 15836 y := v_0.Args[0] 15837 z := v_0.Args[1] 15838 x := v.Args[1] 15839 v.reset(OpARMTEQshiftRLreg) 15840 v.AddArg(x) 15841 v.AddArg(y) 15842 v.AddArg(z) 15843 return true 15844 } 15845 // match: (TEQ x (SRA y z)) 15846 // cond: 15847 // result: (TEQshiftRAreg x y z) 15848 for { 15849 _ = v.Args[1] 15850 x := v.Args[0] 15851 v_1 := v.Args[1] 15852 if v_1.Op != OpARMSRA { 15853 break 15854 } 15855 _ = v_1.Args[1] 15856 y := v_1.Args[0] 15857 z := v_1.Args[1] 15858 v.reset(OpARMTEQshiftRAreg) 15859 v.AddArg(x) 15860 v.AddArg(y) 15861 v.AddArg(z) 15862 return true 15863 } 15864 // match: (TEQ (SRA y z) x) 15865 // cond: 15866 // result: (TEQshiftRAreg x y z) 15867 for { 15868 _ = v.Args[1] 15869 v_0 := v.Args[0] 15870 if v_0.Op != OpARMSRA { 15871 break 15872 } 15873 _ = v_0.Args[1] 15874 y := v_0.Args[0] 15875 z := v_0.Args[1] 15876 x := v.Args[1] 15877 v.reset(OpARMTEQshiftRAreg) 15878 v.AddArg(x) 15879 v.AddArg(y) 15880 v.AddArg(z) 15881 return true 15882 } 15883 return false 15884 } 15885 func rewriteValueARM_OpARMTEQconst_0(v *Value) bool { 15886 // match: (TEQconst (MOVWconst [x]) [y]) 15887 // cond: int32(x^y)==0 15888 // result: (FlagEQ) 15889 for { 15890 y := v.AuxInt 15891 v_0 := v.Args[0] 15892 if v_0.Op != OpARMMOVWconst { 15893 break 15894 } 15895 x := v_0.AuxInt 15896 if !(int32(x^y) == 0) { 15897 break 15898 } 15899 v.reset(OpARMFlagEQ) 15900 return true 15901 } 15902 // match: (TEQconst (MOVWconst [x]) [y]) 15903 // cond: int32(x^y)<0 15904 // result: (FlagLT_UGT) 15905 for { 15906 y := v.AuxInt 15907 v_0 := v.Args[0] 15908 if v_0.Op != OpARMMOVWconst { 15909 break 15910 } 15911 x := v_0.AuxInt 15912 if !(int32(x^y) < 0) { 15913 break 15914 } 15915 v.reset(OpARMFlagLT_UGT) 15916 return true 15917 } 15918 // match: (TEQconst (MOVWconst [x]) [y]) 15919 // cond: int32(x^y)>0 15920 // result: (FlagGT_UGT) 15921 for { 15922 y := v.AuxInt 15923 v_0 := v.Args[0] 15924 if v_0.Op != OpARMMOVWconst { 15925 break 15926 } 15927 x := v_0.AuxInt 15928 if !(int32(x^y) > 0) { 15929 break 15930 } 15931 v.reset(OpARMFlagGT_UGT) 15932 return true 15933 } 15934 return false 15935 } 15936 func rewriteValueARM_OpARMTEQshiftLL_0(v *Value) bool { 15937 b := v.Block 15938 _ = b 15939 // match: (TEQshiftLL (MOVWconst [c]) x [d]) 15940 // cond: 15941 // result: (TEQconst [c] (SLLconst <x.Type> x [d])) 15942 for { 15943 d := v.AuxInt 15944 _ = v.Args[1] 15945 v_0 := v.Args[0] 15946 if v_0.Op != OpARMMOVWconst { 15947 break 15948 } 15949 c := v_0.AuxInt 15950 x := v.Args[1] 15951 v.reset(OpARMTEQconst) 15952 v.AuxInt = c 15953 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 15954 v0.AuxInt = d 15955 v0.AddArg(x) 15956 v.AddArg(v0) 15957 return true 15958 } 15959 // match: (TEQshiftLL x (MOVWconst [c]) [d]) 15960 // cond: 15961 // result: (TEQconst x [int64(int32(uint32(c)<<uint64(d)))]) 15962 for { 15963 d := v.AuxInt 15964 _ = v.Args[1] 15965 x := v.Args[0] 15966 v_1 := v.Args[1] 15967 if v_1.Op != OpARMMOVWconst { 15968 break 15969 } 15970 c := v_1.AuxInt 15971 v.reset(OpARMTEQconst) 15972 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 15973 v.AddArg(x) 15974 return true 15975 } 15976 return false 15977 } 15978 func rewriteValueARM_OpARMTEQshiftLLreg_0(v *Value) bool { 15979 b := v.Block 15980 _ = b 15981 // match: (TEQshiftLLreg (MOVWconst [c]) x y) 15982 // cond: 15983 // result: (TEQconst [c] (SLL <x.Type> x y)) 15984 for { 15985 _ = v.Args[2] 15986 v_0 := v.Args[0] 15987 if v_0.Op != OpARMMOVWconst { 15988 break 15989 } 15990 c := v_0.AuxInt 15991 x := v.Args[1] 15992 y := v.Args[2] 15993 v.reset(OpARMTEQconst) 15994 v.AuxInt = c 15995 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15996 v0.AddArg(x) 15997 v0.AddArg(y) 15998 v.AddArg(v0) 15999 return true 16000 } 16001 // match: (TEQshiftLLreg x y (MOVWconst [c])) 16002 // cond: 16003 // result: (TEQshiftLL x y [c]) 16004 for { 16005 _ = v.Args[2] 16006 x := v.Args[0] 16007 y := v.Args[1] 16008 v_2 := v.Args[2] 16009 if v_2.Op != OpARMMOVWconst { 16010 break 16011 } 16012 c := v_2.AuxInt 16013 v.reset(OpARMTEQshiftLL) 16014 v.AuxInt = c 16015 v.AddArg(x) 16016 v.AddArg(y) 16017 return true 16018 } 16019 return false 16020 } 16021 func rewriteValueARM_OpARMTEQshiftRA_0(v *Value) bool { 16022 b := v.Block 16023 _ = b 16024 // match: (TEQshiftRA (MOVWconst [c]) x [d]) 16025 // cond: 16026 // result: (TEQconst [c] (SRAconst <x.Type> x [d])) 16027 for { 16028 d := v.AuxInt 16029 _ = v.Args[1] 16030 v_0 := v.Args[0] 16031 if v_0.Op != OpARMMOVWconst { 16032 break 16033 } 16034 c := v_0.AuxInt 16035 x := v.Args[1] 16036 v.reset(OpARMTEQconst) 16037 v.AuxInt = c 16038 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 16039 v0.AuxInt = d 16040 v0.AddArg(x) 16041 v.AddArg(v0) 16042 return true 16043 } 16044 // match: (TEQshiftRA x (MOVWconst [c]) [d]) 16045 // cond: 16046 // result: (TEQconst x [int64(int32(c)>>uint64(d))]) 16047 for { 16048 d := v.AuxInt 16049 _ = v.Args[1] 16050 x := v.Args[0] 16051 v_1 := v.Args[1] 16052 if v_1.Op != OpARMMOVWconst { 16053 break 16054 } 16055 c := v_1.AuxInt 16056 v.reset(OpARMTEQconst) 16057 v.AuxInt = int64(int32(c) >> uint64(d)) 16058 v.AddArg(x) 16059 return true 16060 } 16061 return false 16062 } 16063 func rewriteValueARM_OpARMTEQshiftRAreg_0(v *Value) bool { 16064 b := v.Block 16065 _ = b 16066 // match: (TEQshiftRAreg (MOVWconst [c]) x y) 16067 // cond: 16068 // result: (TEQconst [c] (SRA <x.Type> x y)) 16069 for { 16070 _ = v.Args[2] 16071 v_0 := v.Args[0] 16072 if v_0.Op != OpARMMOVWconst { 16073 break 16074 } 16075 c := v_0.AuxInt 16076 x := v.Args[1] 16077 y := v.Args[2] 16078 v.reset(OpARMTEQconst) 16079 v.AuxInt = c 16080 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 16081 v0.AddArg(x) 16082 v0.AddArg(y) 16083 v.AddArg(v0) 16084 return true 16085 } 16086 // match: (TEQshiftRAreg x y (MOVWconst [c])) 16087 // cond: 16088 // result: (TEQshiftRA x y [c]) 16089 for { 16090 _ = v.Args[2] 16091 x := v.Args[0] 16092 y := v.Args[1] 16093 v_2 := v.Args[2] 16094 if v_2.Op != OpARMMOVWconst { 16095 break 16096 } 16097 c := v_2.AuxInt 16098 v.reset(OpARMTEQshiftRA) 16099 v.AuxInt = c 16100 v.AddArg(x) 16101 v.AddArg(y) 16102 return true 16103 } 16104 return false 16105 } 16106 func rewriteValueARM_OpARMTEQshiftRL_0(v *Value) bool { 16107 b := v.Block 16108 _ = b 16109 // match: (TEQshiftRL (MOVWconst [c]) x [d]) 16110 // cond: 16111 // result: (TEQconst [c] (SRLconst <x.Type> x [d])) 16112 for { 16113 d := v.AuxInt 16114 _ = v.Args[1] 16115 v_0 := v.Args[0] 16116 if v_0.Op != OpARMMOVWconst { 16117 break 16118 } 16119 c := v_0.AuxInt 16120 x := v.Args[1] 16121 v.reset(OpARMTEQconst) 16122 v.AuxInt = c 16123 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 16124 v0.AuxInt = d 16125 v0.AddArg(x) 16126 v.AddArg(v0) 16127 return true 16128 } 16129 // match: (TEQshiftRL x (MOVWconst [c]) [d]) 16130 // cond: 16131 // result: (TEQconst x [int64(int32(uint32(c)>>uint64(d)))]) 16132 for { 16133 d := v.AuxInt 16134 _ = v.Args[1] 16135 x := v.Args[0] 16136 v_1 := v.Args[1] 16137 if v_1.Op != OpARMMOVWconst { 16138 break 16139 } 16140 c := v_1.AuxInt 16141 v.reset(OpARMTEQconst) 16142 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 16143 v.AddArg(x) 16144 return true 16145 } 16146 return false 16147 } 16148 func rewriteValueARM_OpARMTEQshiftRLreg_0(v *Value) bool { 16149 b := v.Block 16150 _ = b 16151 // match: (TEQshiftRLreg (MOVWconst [c]) x y) 16152 // cond: 16153 // result: (TEQconst [c] (SRL <x.Type> x y)) 16154 for { 16155 _ = v.Args[2] 16156 v_0 := v.Args[0] 16157 if v_0.Op != OpARMMOVWconst { 16158 break 16159 } 16160 c := v_0.AuxInt 16161 x := v.Args[1] 16162 y := v.Args[2] 16163 v.reset(OpARMTEQconst) 16164 v.AuxInt = c 16165 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16166 v0.AddArg(x) 16167 v0.AddArg(y) 16168 v.AddArg(v0) 16169 return true 16170 } 16171 // match: (TEQshiftRLreg x y (MOVWconst [c])) 16172 // cond: 16173 // result: (TEQshiftRL x y [c]) 16174 for { 16175 _ = v.Args[2] 16176 x := v.Args[0] 16177 y := v.Args[1] 16178 v_2 := v.Args[2] 16179 if v_2.Op != OpARMMOVWconst { 16180 break 16181 } 16182 c := v_2.AuxInt 16183 v.reset(OpARMTEQshiftRL) 16184 v.AuxInt = c 16185 v.AddArg(x) 16186 v.AddArg(y) 16187 return true 16188 } 16189 return false 16190 } 16191 func rewriteValueARM_OpARMTST_0(v *Value) bool { 16192 // match: (TST x (MOVWconst [c])) 16193 // cond: 16194 // result: (TSTconst [c] x) 16195 for { 16196 _ = v.Args[1] 16197 x := v.Args[0] 16198 v_1 := v.Args[1] 16199 if v_1.Op != OpARMMOVWconst { 16200 break 16201 } 16202 c := v_1.AuxInt 16203 v.reset(OpARMTSTconst) 16204 v.AuxInt = c 16205 v.AddArg(x) 16206 return true 16207 } 16208 // match: (TST (MOVWconst [c]) x) 16209 // cond: 16210 // result: (TSTconst [c] x) 16211 for { 16212 _ = v.Args[1] 16213 v_0 := v.Args[0] 16214 if v_0.Op != OpARMMOVWconst { 16215 break 16216 } 16217 c := v_0.AuxInt 16218 x := v.Args[1] 16219 v.reset(OpARMTSTconst) 16220 v.AuxInt = c 16221 v.AddArg(x) 16222 return true 16223 } 16224 // match: (TST x (SLLconst [c] y)) 16225 // cond: 16226 // result: (TSTshiftLL x y [c]) 16227 for { 16228 _ = v.Args[1] 16229 x := v.Args[0] 16230 v_1 := v.Args[1] 16231 if v_1.Op != OpARMSLLconst { 16232 break 16233 } 16234 c := v_1.AuxInt 16235 y := v_1.Args[0] 16236 v.reset(OpARMTSTshiftLL) 16237 v.AuxInt = c 16238 v.AddArg(x) 16239 v.AddArg(y) 16240 return true 16241 } 16242 // match: (TST (SLLconst [c] y) x) 16243 // cond: 16244 // result: (TSTshiftLL x y [c]) 16245 for { 16246 _ = v.Args[1] 16247 v_0 := v.Args[0] 16248 if v_0.Op != OpARMSLLconst { 16249 break 16250 } 16251 c := v_0.AuxInt 16252 y := v_0.Args[0] 16253 x := v.Args[1] 16254 v.reset(OpARMTSTshiftLL) 16255 v.AuxInt = c 16256 v.AddArg(x) 16257 v.AddArg(y) 16258 return true 16259 } 16260 // match: (TST x (SRLconst [c] y)) 16261 // cond: 16262 // result: (TSTshiftRL x y [c]) 16263 for { 16264 _ = v.Args[1] 16265 x := v.Args[0] 16266 v_1 := v.Args[1] 16267 if v_1.Op != OpARMSRLconst { 16268 break 16269 } 16270 c := v_1.AuxInt 16271 y := v_1.Args[0] 16272 v.reset(OpARMTSTshiftRL) 16273 v.AuxInt = c 16274 v.AddArg(x) 16275 v.AddArg(y) 16276 return true 16277 } 16278 // match: (TST (SRLconst [c] y) x) 16279 // cond: 16280 // result: (TSTshiftRL x y [c]) 16281 for { 16282 _ = v.Args[1] 16283 v_0 := v.Args[0] 16284 if v_0.Op != OpARMSRLconst { 16285 break 16286 } 16287 c := v_0.AuxInt 16288 y := v_0.Args[0] 16289 x := v.Args[1] 16290 v.reset(OpARMTSTshiftRL) 16291 v.AuxInt = c 16292 v.AddArg(x) 16293 v.AddArg(y) 16294 return true 16295 } 16296 // match: (TST x (SRAconst [c] y)) 16297 // cond: 16298 // result: (TSTshiftRA x y [c]) 16299 for { 16300 _ = v.Args[1] 16301 x := v.Args[0] 16302 v_1 := v.Args[1] 16303 if v_1.Op != OpARMSRAconst { 16304 break 16305 } 16306 c := v_1.AuxInt 16307 y := v_1.Args[0] 16308 v.reset(OpARMTSTshiftRA) 16309 v.AuxInt = c 16310 v.AddArg(x) 16311 v.AddArg(y) 16312 return true 16313 } 16314 // match: (TST (SRAconst [c] y) x) 16315 // cond: 16316 // result: (TSTshiftRA x y [c]) 16317 for { 16318 _ = v.Args[1] 16319 v_0 := v.Args[0] 16320 if v_0.Op != OpARMSRAconst { 16321 break 16322 } 16323 c := v_0.AuxInt 16324 y := v_0.Args[0] 16325 x := v.Args[1] 16326 v.reset(OpARMTSTshiftRA) 16327 v.AuxInt = c 16328 v.AddArg(x) 16329 v.AddArg(y) 16330 return true 16331 } 16332 // match: (TST x (SLL y z)) 16333 // cond: 16334 // result: (TSTshiftLLreg x y z) 16335 for { 16336 _ = v.Args[1] 16337 x := v.Args[0] 16338 v_1 := v.Args[1] 16339 if v_1.Op != OpARMSLL { 16340 break 16341 } 16342 _ = v_1.Args[1] 16343 y := v_1.Args[0] 16344 z := v_1.Args[1] 16345 v.reset(OpARMTSTshiftLLreg) 16346 v.AddArg(x) 16347 v.AddArg(y) 16348 v.AddArg(z) 16349 return true 16350 } 16351 // match: (TST (SLL y z) x) 16352 // cond: 16353 // result: (TSTshiftLLreg x y z) 16354 for { 16355 _ = v.Args[1] 16356 v_0 := v.Args[0] 16357 if v_0.Op != OpARMSLL { 16358 break 16359 } 16360 _ = v_0.Args[1] 16361 y := v_0.Args[0] 16362 z := v_0.Args[1] 16363 x := v.Args[1] 16364 v.reset(OpARMTSTshiftLLreg) 16365 v.AddArg(x) 16366 v.AddArg(y) 16367 v.AddArg(z) 16368 return true 16369 } 16370 return false 16371 } 16372 func rewriteValueARM_OpARMTST_10(v *Value) bool { 16373 // match: (TST x (SRL y z)) 16374 // cond: 16375 // result: (TSTshiftRLreg x y z) 16376 for { 16377 _ = v.Args[1] 16378 x := v.Args[0] 16379 v_1 := v.Args[1] 16380 if v_1.Op != OpARMSRL { 16381 break 16382 } 16383 _ = v_1.Args[1] 16384 y := v_1.Args[0] 16385 z := v_1.Args[1] 16386 v.reset(OpARMTSTshiftRLreg) 16387 v.AddArg(x) 16388 v.AddArg(y) 16389 v.AddArg(z) 16390 return true 16391 } 16392 // match: (TST (SRL y z) x) 16393 // cond: 16394 // result: (TSTshiftRLreg x y z) 16395 for { 16396 _ = v.Args[1] 16397 v_0 := v.Args[0] 16398 if v_0.Op != OpARMSRL { 16399 break 16400 } 16401 _ = v_0.Args[1] 16402 y := v_0.Args[0] 16403 z := v_0.Args[1] 16404 x := v.Args[1] 16405 v.reset(OpARMTSTshiftRLreg) 16406 v.AddArg(x) 16407 v.AddArg(y) 16408 v.AddArg(z) 16409 return true 16410 } 16411 // match: (TST x (SRA y z)) 16412 // cond: 16413 // result: (TSTshiftRAreg x y z) 16414 for { 16415 _ = v.Args[1] 16416 x := v.Args[0] 16417 v_1 := v.Args[1] 16418 if v_1.Op != OpARMSRA { 16419 break 16420 } 16421 _ = v_1.Args[1] 16422 y := v_1.Args[0] 16423 z := v_1.Args[1] 16424 v.reset(OpARMTSTshiftRAreg) 16425 v.AddArg(x) 16426 v.AddArg(y) 16427 v.AddArg(z) 16428 return true 16429 } 16430 // match: (TST (SRA y z) x) 16431 // cond: 16432 // result: (TSTshiftRAreg x y z) 16433 for { 16434 _ = v.Args[1] 16435 v_0 := v.Args[0] 16436 if v_0.Op != OpARMSRA { 16437 break 16438 } 16439 _ = v_0.Args[1] 16440 y := v_0.Args[0] 16441 z := v_0.Args[1] 16442 x := v.Args[1] 16443 v.reset(OpARMTSTshiftRAreg) 16444 v.AddArg(x) 16445 v.AddArg(y) 16446 v.AddArg(z) 16447 return true 16448 } 16449 return false 16450 } 16451 func rewriteValueARM_OpARMTSTconst_0(v *Value) bool { 16452 // match: (TSTconst (MOVWconst [x]) [y]) 16453 // cond: int32(x&y)==0 16454 // result: (FlagEQ) 16455 for { 16456 y := v.AuxInt 16457 v_0 := v.Args[0] 16458 if v_0.Op != OpARMMOVWconst { 16459 break 16460 } 16461 x := v_0.AuxInt 16462 if !(int32(x&y) == 0) { 16463 break 16464 } 16465 v.reset(OpARMFlagEQ) 16466 return true 16467 } 16468 // match: (TSTconst (MOVWconst [x]) [y]) 16469 // cond: int32(x&y)<0 16470 // result: (FlagLT_UGT) 16471 for { 16472 y := v.AuxInt 16473 v_0 := v.Args[0] 16474 if v_0.Op != OpARMMOVWconst { 16475 break 16476 } 16477 x := v_0.AuxInt 16478 if !(int32(x&y) < 0) { 16479 break 16480 } 16481 v.reset(OpARMFlagLT_UGT) 16482 return true 16483 } 16484 // match: (TSTconst (MOVWconst [x]) [y]) 16485 // cond: int32(x&y)>0 16486 // result: (FlagGT_UGT) 16487 for { 16488 y := v.AuxInt 16489 v_0 := v.Args[0] 16490 if v_0.Op != OpARMMOVWconst { 16491 break 16492 } 16493 x := v_0.AuxInt 16494 if !(int32(x&y) > 0) { 16495 break 16496 } 16497 v.reset(OpARMFlagGT_UGT) 16498 return true 16499 } 16500 return false 16501 } 16502 func rewriteValueARM_OpARMTSTshiftLL_0(v *Value) bool { 16503 b := v.Block 16504 _ = b 16505 // match: (TSTshiftLL (MOVWconst [c]) x [d]) 16506 // cond: 16507 // result: (TSTconst [c] (SLLconst <x.Type> x [d])) 16508 for { 16509 d := v.AuxInt 16510 _ = v.Args[1] 16511 v_0 := v.Args[0] 16512 if v_0.Op != OpARMMOVWconst { 16513 break 16514 } 16515 c := v_0.AuxInt 16516 x := v.Args[1] 16517 v.reset(OpARMTSTconst) 16518 v.AuxInt = c 16519 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 16520 v0.AuxInt = d 16521 v0.AddArg(x) 16522 v.AddArg(v0) 16523 return true 16524 } 16525 // match: (TSTshiftLL x (MOVWconst [c]) [d]) 16526 // cond: 16527 // result: (TSTconst x [int64(int32(uint32(c)<<uint64(d)))]) 16528 for { 16529 d := v.AuxInt 16530 _ = v.Args[1] 16531 x := v.Args[0] 16532 v_1 := v.Args[1] 16533 if v_1.Op != OpARMMOVWconst { 16534 break 16535 } 16536 c := v_1.AuxInt 16537 v.reset(OpARMTSTconst) 16538 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 16539 v.AddArg(x) 16540 return true 16541 } 16542 return false 16543 } 16544 func rewriteValueARM_OpARMTSTshiftLLreg_0(v *Value) bool { 16545 b := v.Block 16546 _ = b 16547 // match: (TSTshiftLLreg (MOVWconst [c]) x y) 16548 // cond: 16549 // result: (TSTconst [c] (SLL <x.Type> x y)) 16550 for { 16551 _ = v.Args[2] 16552 v_0 := v.Args[0] 16553 if v_0.Op != OpARMMOVWconst { 16554 break 16555 } 16556 c := v_0.AuxInt 16557 x := v.Args[1] 16558 y := v.Args[2] 16559 v.reset(OpARMTSTconst) 16560 v.AuxInt = c 16561 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 16562 v0.AddArg(x) 16563 v0.AddArg(y) 16564 v.AddArg(v0) 16565 return true 16566 } 16567 // match: (TSTshiftLLreg x y (MOVWconst [c])) 16568 // cond: 16569 // result: (TSTshiftLL x y [c]) 16570 for { 16571 _ = v.Args[2] 16572 x := v.Args[0] 16573 y := v.Args[1] 16574 v_2 := v.Args[2] 16575 if v_2.Op != OpARMMOVWconst { 16576 break 16577 } 16578 c := v_2.AuxInt 16579 v.reset(OpARMTSTshiftLL) 16580 v.AuxInt = c 16581 v.AddArg(x) 16582 v.AddArg(y) 16583 return true 16584 } 16585 return false 16586 } 16587 func rewriteValueARM_OpARMTSTshiftRA_0(v *Value) bool { 16588 b := v.Block 16589 _ = b 16590 // match: (TSTshiftRA (MOVWconst [c]) x [d]) 16591 // cond: 16592 // result: (TSTconst [c] (SRAconst <x.Type> x [d])) 16593 for { 16594 d := v.AuxInt 16595 _ = v.Args[1] 16596 v_0 := v.Args[0] 16597 if v_0.Op != OpARMMOVWconst { 16598 break 16599 } 16600 c := v_0.AuxInt 16601 x := v.Args[1] 16602 v.reset(OpARMTSTconst) 16603 v.AuxInt = c 16604 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 16605 v0.AuxInt = d 16606 v0.AddArg(x) 16607 v.AddArg(v0) 16608 return true 16609 } 16610 // match: (TSTshiftRA x (MOVWconst [c]) [d]) 16611 // cond: 16612 // result: (TSTconst x [int64(int32(c)>>uint64(d))]) 16613 for { 16614 d := v.AuxInt 16615 _ = v.Args[1] 16616 x := v.Args[0] 16617 v_1 := v.Args[1] 16618 if v_1.Op != OpARMMOVWconst { 16619 break 16620 } 16621 c := v_1.AuxInt 16622 v.reset(OpARMTSTconst) 16623 v.AuxInt = int64(int32(c) >> uint64(d)) 16624 v.AddArg(x) 16625 return true 16626 } 16627 return false 16628 } 16629 func rewriteValueARM_OpARMTSTshiftRAreg_0(v *Value) bool { 16630 b := v.Block 16631 _ = b 16632 // match: (TSTshiftRAreg (MOVWconst [c]) x y) 16633 // cond: 16634 // result: (TSTconst [c] (SRA <x.Type> x y)) 16635 for { 16636 _ = v.Args[2] 16637 v_0 := v.Args[0] 16638 if v_0.Op != OpARMMOVWconst { 16639 break 16640 } 16641 c := v_0.AuxInt 16642 x := v.Args[1] 16643 y := v.Args[2] 16644 v.reset(OpARMTSTconst) 16645 v.AuxInt = c 16646 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 16647 v0.AddArg(x) 16648 v0.AddArg(y) 16649 v.AddArg(v0) 16650 return true 16651 } 16652 // match: (TSTshiftRAreg x y (MOVWconst [c])) 16653 // cond: 16654 // result: (TSTshiftRA x y [c]) 16655 for { 16656 _ = v.Args[2] 16657 x := v.Args[0] 16658 y := v.Args[1] 16659 v_2 := v.Args[2] 16660 if v_2.Op != OpARMMOVWconst { 16661 break 16662 } 16663 c := v_2.AuxInt 16664 v.reset(OpARMTSTshiftRA) 16665 v.AuxInt = c 16666 v.AddArg(x) 16667 v.AddArg(y) 16668 return true 16669 } 16670 return false 16671 } 16672 func rewriteValueARM_OpARMTSTshiftRL_0(v *Value) bool { 16673 b := v.Block 16674 _ = b 16675 // match: (TSTshiftRL (MOVWconst [c]) x [d]) 16676 // cond: 16677 // result: (TSTconst [c] (SRLconst <x.Type> x [d])) 16678 for { 16679 d := v.AuxInt 16680 _ = v.Args[1] 16681 v_0 := v.Args[0] 16682 if v_0.Op != OpARMMOVWconst { 16683 break 16684 } 16685 c := v_0.AuxInt 16686 x := v.Args[1] 16687 v.reset(OpARMTSTconst) 16688 v.AuxInt = c 16689 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 16690 v0.AuxInt = d 16691 v0.AddArg(x) 16692 v.AddArg(v0) 16693 return true 16694 } 16695 // match: (TSTshiftRL x (MOVWconst [c]) [d]) 16696 // cond: 16697 // result: (TSTconst x [int64(int32(uint32(c)>>uint64(d)))]) 16698 for { 16699 d := v.AuxInt 16700 _ = v.Args[1] 16701 x := v.Args[0] 16702 v_1 := v.Args[1] 16703 if v_1.Op != OpARMMOVWconst { 16704 break 16705 } 16706 c := v_1.AuxInt 16707 v.reset(OpARMTSTconst) 16708 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 16709 v.AddArg(x) 16710 return true 16711 } 16712 return false 16713 } 16714 func rewriteValueARM_OpARMTSTshiftRLreg_0(v *Value) bool { 16715 b := v.Block 16716 _ = b 16717 // match: (TSTshiftRLreg (MOVWconst [c]) x y) 16718 // cond: 16719 // result: (TSTconst [c] (SRL <x.Type> x y)) 16720 for { 16721 _ = v.Args[2] 16722 v_0 := v.Args[0] 16723 if v_0.Op != OpARMMOVWconst { 16724 break 16725 } 16726 c := v_0.AuxInt 16727 x := v.Args[1] 16728 y := v.Args[2] 16729 v.reset(OpARMTSTconst) 16730 v.AuxInt = c 16731 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16732 v0.AddArg(x) 16733 v0.AddArg(y) 16734 v.AddArg(v0) 16735 return true 16736 } 16737 // match: (TSTshiftRLreg x y (MOVWconst [c])) 16738 // cond: 16739 // result: (TSTshiftRL x y [c]) 16740 for { 16741 _ = v.Args[2] 16742 x := v.Args[0] 16743 y := v.Args[1] 16744 v_2 := v.Args[2] 16745 if v_2.Op != OpARMMOVWconst { 16746 break 16747 } 16748 c := v_2.AuxInt 16749 v.reset(OpARMTSTshiftRL) 16750 v.AuxInt = c 16751 v.AddArg(x) 16752 v.AddArg(y) 16753 return true 16754 } 16755 return false 16756 } 16757 func rewriteValueARM_OpARMXOR_0(v *Value) bool { 16758 // match: (XOR x (MOVWconst [c])) 16759 // cond: 16760 // result: (XORconst [c] x) 16761 for { 16762 _ = v.Args[1] 16763 x := v.Args[0] 16764 v_1 := v.Args[1] 16765 if v_1.Op != OpARMMOVWconst { 16766 break 16767 } 16768 c := v_1.AuxInt 16769 v.reset(OpARMXORconst) 16770 v.AuxInt = c 16771 v.AddArg(x) 16772 return true 16773 } 16774 // match: (XOR (MOVWconst [c]) x) 16775 // cond: 16776 // result: (XORconst [c] x) 16777 for { 16778 _ = v.Args[1] 16779 v_0 := v.Args[0] 16780 if v_0.Op != OpARMMOVWconst { 16781 break 16782 } 16783 c := v_0.AuxInt 16784 x := v.Args[1] 16785 v.reset(OpARMXORconst) 16786 v.AuxInt = c 16787 v.AddArg(x) 16788 return true 16789 } 16790 // match: (XOR x (SLLconst [c] y)) 16791 // cond: 16792 // result: (XORshiftLL x y [c]) 16793 for { 16794 _ = v.Args[1] 16795 x := v.Args[0] 16796 v_1 := v.Args[1] 16797 if v_1.Op != OpARMSLLconst { 16798 break 16799 } 16800 c := v_1.AuxInt 16801 y := v_1.Args[0] 16802 v.reset(OpARMXORshiftLL) 16803 v.AuxInt = c 16804 v.AddArg(x) 16805 v.AddArg(y) 16806 return true 16807 } 16808 // match: (XOR (SLLconst [c] y) x) 16809 // cond: 16810 // result: (XORshiftLL x y [c]) 16811 for { 16812 _ = v.Args[1] 16813 v_0 := v.Args[0] 16814 if v_0.Op != OpARMSLLconst { 16815 break 16816 } 16817 c := v_0.AuxInt 16818 y := v_0.Args[0] 16819 x := v.Args[1] 16820 v.reset(OpARMXORshiftLL) 16821 v.AuxInt = c 16822 v.AddArg(x) 16823 v.AddArg(y) 16824 return true 16825 } 16826 // match: (XOR x (SRLconst [c] y)) 16827 // cond: 16828 // result: (XORshiftRL x y [c]) 16829 for { 16830 _ = v.Args[1] 16831 x := v.Args[0] 16832 v_1 := v.Args[1] 16833 if v_1.Op != OpARMSRLconst { 16834 break 16835 } 16836 c := v_1.AuxInt 16837 y := v_1.Args[0] 16838 v.reset(OpARMXORshiftRL) 16839 v.AuxInt = c 16840 v.AddArg(x) 16841 v.AddArg(y) 16842 return true 16843 } 16844 // match: (XOR (SRLconst [c] y) x) 16845 // cond: 16846 // result: (XORshiftRL x y [c]) 16847 for { 16848 _ = v.Args[1] 16849 v_0 := v.Args[0] 16850 if v_0.Op != OpARMSRLconst { 16851 break 16852 } 16853 c := v_0.AuxInt 16854 y := v_0.Args[0] 16855 x := v.Args[1] 16856 v.reset(OpARMXORshiftRL) 16857 v.AuxInt = c 16858 v.AddArg(x) 16859 v.AddArg(y) 16860 return true 16861 } 16862 // match: (XOR x (SRAconst [c] y)) 16863 // cond: 16864 // result: (XORshiftRA x y [c]) 16865 for { 16866 _ = v.Args[1] 16867 x := v.Args[0] 16868 v_1 := v.Args[1] 16869 if v_1.Op != OpARMSRAconst { 16870 break 16871 } 16872 c := v_1.AuxInt 16873 y := v_1.Args[0] 16874 v.reset(OpARMXORshiftRA) 16875 v.AuxInt = c 16876 v.AddArg(x) 16877 v.AddArg(y) 16878 return true 16879 } 16880 // match: (XOR (SRAconst [c] y) x) 16881 // cond: 16882 // result: (XORshiftRA x y [c]) 16883 for { 16884 _ = v.Args[1] 16885 v_0 := v.Args[0] 16886 if v_0.Op != OpARMSRAconst { 16887 break 16888 } 16889 c := v_0.AuxInt 16890 y := v_0.Args[0] 16891 x := v.Args[1] 16892 v.reset(OpARMXORshiftRA) 16893 v.AuxInt = c 16894 v.AddArg(x) 16895 v.AddArg(y) 16896 return true 16897 } 16898 // match: (XOR x (SRRconst [c] y)) 16899 // cond: 16900 // result: (XORshiftRR x y [c]) 16901 for { 16902 _ = v.Args[1] 16903 x := v.Args[0] 16904 v_1 := v.Args[1] 16905 if v_1.Op != OpARMSRRconst { 16906 break 16907 } 16908 c := v_1.AuxInt 16909 y := v_1.Args[0] 16910 v.reset(OpARMXORshiftRR) 16911 v.AuxInt = c 16912 v.AddArg(x) 16913 v.AddArg(y) 16914 return true 16915 } 16916 // match: (XOR (SRRconst [c] y) x) 16917 // cond: 16918 // result: (XORshiftRR x y [c]) 16919 for { 16920 _ = v.Args[1] 16921 v_0 := v.Args[0] 16922 if v_0.Op != OpARMSRRconst { 16923 break 16924 } 16925 c := v_0.AuxInt 16926 y := v_0.Args[0] 16927 x := v.Args[1] 16928 v.reset(OpARMXORshiftRR) 16929 v.AuxInt = c 16930 v.AddArg(x) 16931 v.AddArg(y) 16932 return true 16933 } 16934 return false 16935 } 16936 func rewriteValueARM_OpARMXOR_10(v *Value) bool { 16937 // match: (XOR x (SLL y z)) 16938 // cond: 16939 // result: (XORshiftLLreg x y z) 16940 for { 16941 _ = v.Args[1] 16942 x := v.Args[0] 16943 v_1 := v.Args[1] 16944 if v_1.Op != OpARMSLL { 16945 break 16946 } 16947 _ = v_1.Args[1] 16948 y := v_1.Args[0] 16949 z := v_1.Args[1] 16950 v.reset(OpARMXORshiftLLreg) 16951 v.AddArg(x) 16952 v.AddArg(y) 16953 v.AddArg(z) 16954 return true 16955 } 16956 // match: (XOR (SLL y z) x) 16957 // cond: 16958 // result: (XORshiftLLreg x y z) 16959 for { 16960 _ = v.Args[1] 16961 v_0 := v.Args[0] 16962 if v_0.Op != OpARMSLL { 16963 break 16964 } 16965 _ = v_0.Args[1] 16966 y := v_0.Args[0] 16967 z := v_0.Args[1] 16968 x := v.Args[1] 16969 v.reset(OpARMXORshiftLLreg) 16970 v.AddArg(x) 16971 v.AddArg(y) 16972 v.AddArg(z) 16973 return true 16974 } 16975 // match: (XOR x (SRL y z)) 16976 // cond: 16977 // result: (XORshiftRLreg x y z) 16978 for { 16979 _ = v.Args[1] 16980 x := v.Args[0] 16981 v_1 := v.Args[1] 16982 if v_1.Op != OpARMSRL { 16983 break 16984 } 16985 _ = v_1.Args[1] 16986 y := v_1.Args[0] 16987 z := v_1.Args[1] 16988 v.reset(OpARMXORshiftRLreg) 16989 v.AddArg(x) 16990 v.AddArg(y) 16991 v.AddArg(z) 16992 return true 16993 } 16994 // match: (XOR (SRL y z) x) 16995 // cond: 16996 // result: (XORshiftRLreg x y z) 16997 for { 16998 _ = v.Args[1] 16999 v_0 := v.Args[0] 17000 if v_0.Op != OpARMSRL { 17001 break 17002 } 17003 _ = v_0.Args[1] 17004 y := v_0.Args[0] 17005 z := v_0.Args[1] 17006 x := v.Args[1] 17007 v.reset(OpARMXORshiftRLreg) 17008 v.AddArg(x) 17009 v.AddArg(y) 17010 v.AddArg(z) 17011 return true 17012 } 17013 // match: (XOR x (SRA y z)) 17014 // cond: 17015 // result: (XORshiftRAreg x y z) 17016 for { 17017 _ = v.Args[1] 17018 x := v.Args[0] 17019 v_1 := v.Args[1] 17020 if v_1.Op != OpARMSRA { 17021 break 17022 } 17023 _ = v_1.Args[1] 17024 y := v_1.Args[0] 17025 z := v_1.Args[1] 17026 v.reset(OpARMXORshiftRAreg) 17027 v.AddArg(x) 17028 v.AddArg(y) 17029 v.AddArg(z) 17030 return true 17031 } 17032 // match: (XOR (SRA y z) x) 17033 // cond: 17034 // result: (XORshiftRAreg x y z) 17035 for { 17036 _ = v.Args[1] 17037 v_0 := v.Args[0] 17038 if v_0.Op != OpARMSRA { 17039 break 17040 } 17041 _ = v_0.Args[1] 17042 y := v_0.Args[0] 17043 z := v_0.Args[1] 17044 x := v.Args[1] 17045 v.reset(OpARMXORshiftRAreg) 17046 v.AddArg(x) 17047 v.AddArg(y) 17048 v.AddArg(z) 17049 return true 17050 } 17051 // match: (XOR x x) 17052 // cond: 17053 // result: (MOVWconst [0]) 17054 for { 17055 _ = v.Args[1] 17056 x := v.Args[0] 17057 if x != v.Args[1] { 17058 break 17059 } 17060 v.reset(OpARMMOVWconst) 17061 v.AuxInt = 0 17062 return true 17063 } 17064 return false 17065 } 17066 func rewriteValueARM_OpARMXORconst_0(v *Value) bool { 17067 // match: (XORconst [0] x) 17068 // cond: 17069 // result: x 17070 for { 17071 if v.AuxInt != 0 { 17072 break 17073 } 17074 x := v.Args[0] 17075 v.reset(OpCopy) 17076 v.Type = x.Type 17077 v.AddArg(x) 17078 return true 17079 } 17080 // match: (XORconst [c] (MOVWconst [d])) 17081 // cond: 17082 // result: (MOVWconst [c^d]) 17083 for { 17084 c := v.AuxInt 17085 v_0 := v.Args[0] 17086 if v_0.Op != OpARMMOVWconst { 17087 break 17088 } 17089 d := v_0.AuxInt 17090 v.reset(OpARMMOVWconst) 17091 v.AuxInt = c ^ d 17092 return true 17093 } 17094 // match: (XORconst [c] (XORconst [d] x)) 17095 // cond: 17096 // result: (XORconst [c^d] x) 17097 for { 17098 c := v.AuxInt 17099 v_0 := v.Args[0] 17100 if v_0.Op != OpARMXORconst { 17101 break 17102 } 17103 d := v_0.AuxInt 17104 x := v_0.Args[0] 17105 v.reset(OpARMXORconst) 17106 v.AuxInt = c ^ d 17107 v.AddArg(x) 17108 return true 17109 } 17110 return false 17111 } 17112 func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { 17113 b := v.Block 17114 _ = b 17115 // match: (XORshiftLL (MOVWconst [c]) x [d]) 17116 // cond: 17117 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 17118 for { 17119 d := v.AuxInt 17120 _ = v.Args[1] 17121 v_0 := v.Args[0] 17122 if v_0.Op != OpARMMOVWconst { 17123 break 17124 } 17125 c := v_0.AuxInt 17126 x := v.Args[1] 17127 v.reset(OpARMXORconst) 17128 v.AuxInt = c 17129 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 17130 v0.AuxInt = d 17131 v0.AddArg(x) 17132 v.AddArg(v0) 17133 return true 17134 } 17135 // match: (XORshiftLL x (MOVWconst [c]) [d]) 17136 // cond: 17137 // result: (XORconst x [int64(int32(uint32(c)<<uint64(d)))]) 17138 for { 17139 d := v.AuxInt 17140 _ = v.Args[1] 17141 x := v.Args[0] 17142 v_1 := v.Args[1] 17143 if v_1.Op != OpARMMOVWconst { 17144 break 17145 } 17146 c := v_1.AuxInt 17147 v.reset(OpARMXORconst) 17148 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 17149 v.AddArg(x) 17150 return true 17151 } 17152 // match: (XORshiftLL [c] (SRLconst x [32-c]) x) 17153 // cond: 17154 // result: (SRRconst [32-c] x) 17155 for { 17156 c := v.AuxInt 17157 _ = v.Args[1] 17158 v_0 := v.Args[0] 17159 if v_0.Op != OpARMSRLconst { 17160 break 17161 } 17162 if v_0.AuxInt != 32-c { 17163 break 17164 } 17165 x := v_0.Args[0] 17166 if x != v.Args[1] { 17167 break 17168 } 17169 v.reset(OpARMSRRconst) 17170 v.AuxInt = 32 - c 17171 v.AddArg(x) 17172 return true 17173 } 17174 // match: (XORshiftLL x (SLLconst x [c]) [d]) 17175 // cond: c==d 17176 // result: (MOVWconst [0]) 17177 for { 17178 d := v.AuxInt 17179 _ = v.Args[1] 17180 x := v.Args[0] 17181 v_1 := v.Args[1] 17182 if v_1.Op != OpARMSLLconst { 17183 break 17184 } 17185 c := v_1.AuxInt 17186 if x != v_1.Args[0] { 17187 break 17188 } 17189 if !(c == d) { 17190 break 17191 } 17192 v.reset(OpARMMOVWconst) 17193 v.AuxInt = 0 17194 return true 17195 } 17196 return false 17197 } 17198 func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { 17199 b := v.Block 17200 _ = b 17201 // match: (XORshiftLLreg (MOVWconst [c]) x y) 17202 // cond: 17203 // result: (XORconst [c] (SLL <x.Type> x y)) 17204 for { 17205 _ = v.Args[2] 17206 v_0 := v.Args[0] 17207 if v_0.Op != OpARMMOVWconst { 17208 break 17209 } 17210 c := v_0.AuxInt 17211 x := v.Args[1] 17212 y := v.Args[2] 17213 v.reset(OpARMXORconst) 17214 v.AuxInt = c 17215 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 17216 v0.AddArg(x) 17217 v0.AddArg(y) 17218 v.AddArg(v0) 17219 return true 17220 } 17221 // match: (XORshiftLLreg x y (MOVWconst [c])) 17222 // cond: 17223 // result: (XORshiftLL x y [c]) 17224 for { 17225 _ = v.Args[2] 17226 x := v.Args[0] 17227 y := v.Args[1] 17228 v_2 := v.Args[2] 17229 if v_2.Op != OpARMMOVWconst { 17230 break 17231 } 17232 c := v_2.AuxInt 17233 v.reset(OpARMXORshiftLL) 17234 v.AuxInt = c 17235 v.AddArg(x) 17236 v.AddArg(y) 17237 return true 17238 } 17239 return false 17240 } 17241 func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { 17242 b := v.Block 17243 _ = b 17244 // match: (XORshiftRA (MOVWconst [c]) x [d]) 17245 // cond: 17246 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 17247 for { 17248 d := v.AuxInt 17249 _ = v.Args[1] 17250 v_0 := v.Args[0] 17251 if v_0.Op != OpARMMOVWconst { 17252 break 17253 } 17254 c := v_0.AuxInt 17255 x := v.Args[1] 17256 v.reset(OpARMXORconst) 17257 v.AuxInt = c 17258 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 17259 v0.AuxInt = d 17260 v0.AddArg(x) 17261 v.AddArg(v0) 17262 return true 17263 } 17264 // match: (XORshiftRA x (MOVWconst [c]) [d]) 17265 // cond: 17266 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 17267 for { 17268 d := v.AuxInt 17269 _ = v.Args[1] 17270 x := v.Args[0] 17271 v_1 := v.Args[1] 17272 if v_1.Op != OpARMMOVWconst { 17273 break 17274 } 17275 c := v_1.AuxInt 17276 v.reset(OpARMXORconst) 17277 v.AuxInt = int64(int32(c) >> uint64(d)) 17278 v.AddArg(x) 17279 return true 17280 } 17281 // match: (XORshiftRA x (SRAconst x [c]) [d]) 17282 // cond: c==d 17283 // result: (MOVWconst [0]) 17284 for { 17285 d := v.AuxInt 17286 _ = v.Args[1] 17287 x := v.Args[0] 17288 v_1 := v.Args[1] 17289 if v_1.Op != OpARMSRAconst { 17290 break 17291 } 17292 c := v_1.AuxInt 17293 if x != v_1.Args[0] { 17294 break 17295 } 17296 if !(c == d) { 17297 break 17298 } 17299 v.reset(OpARMMOVWconst) 17300 v.AuxInt = 0 17301 return true 17302 } 17303 return false 17304 } 17305 func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { 17306 b := v.Block 17307 _ = b 17308 // match: (XORshiftRAreg (MOVWconst [c]) x y) 17309 // cond: 17310 // result: (XORconst [c] (SRA <x.Type> x y)) 17311 for { 17312 _ = v.Args[2] 17313 v_0 := v.Args[0] 17314 if v_0.Op != OpARMMOVWconst { 17315 break 17316 } 17317 c := v_0.AuxInt 17318 x := v.Args[1] 17319 y := v.Args[2] 17320 v.reset(OpARMXORconst) 17321 v.AuxInt = c 17322 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 17323 v0.AddArg(x) 17324 v0.AddArg(y) 17325 v.AddArg(v0) 17326 return true 17327 } 17328 // match: (XORshiftRAreg x y (MOVWconst [c])) 17329 // cond: 17330 // result: (XORshiftRA x y [c]) 17331 for { 17332 _ = v.Args[2] 17333 x := v.Args[0] 17334 y := v.Args[1] 17335 v_2 := v.Args[2] 17336 if v_2.Op != OpARMMOVWconst { 17337 break 17338 } 17339 c := v_2.AuxInt 17340 v.reset(OpARMXORshiftRA) 17341 v.AuxInt = c 17342 v.AddArg(x) 17343 v.AddArg(y) 17344 return true 17345 } 17346 return false 17347 } 17348 func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { 17349 b := v.Block 17350 _ = b 17351 // match: (XORshiftRL (MOVWconst [c]) x [d]) 17352 // cond: 17353 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 17354 for { 17355 d := v.AuxInt 17356 _ = v.Args[1] 17357 v_0 := v.Args[0] 17358 if v_0.Op != OpARMMOVWconst { 17359 break 17360 } 17361 c := v_0.AuxInt 17362 x := v.Args[1] 17363 v.reset(OpARMXORconst) 17364 v.AuxInt = c 17365 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 17366 v0.AuxInt = d 17367 v0.AddArg(x) 17368 v.AddArg(v0) 17369 return true 17370 } 17371 // match: (XORshiftRL x (MOVWconst [c]) [d]) 17372 // cond: 17373 // result: (XORconst x [int64(int32(uint32(c)>>uint64(d)))]) 17374 for { 17375 d := v.AuxInt 17376 _ = v.Args[1] 17377 x := v.Args[0] 17378 v_1 := v.Args[1] 17379 if v_1.Op != OpARMMOVWconst { 17380 break 17381 } 17382 c := v_1.AuxInt 17383 v.reset(OpARMXORconst) 17384 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 17385 v.AddArg(x) 17386 return true 17387 } 17388 // match: (XORshiftRL [c] (SLLconst x [32-c]) x) 17389 // cond: 17390 // result: (SRRconst [ c] x) 17391 for { 17392 c := v.AuxInt 17393 _ = v.Args[1] 17394 v_0 := v.Args[0] 17395 if v_0.Op != OpARMSLLconst { 17396 break 17397 } 17398 if v_0.AuxInt != 32-c { 17399 break 17400 } 17401 x := v_0.Args[0] 17402 if x != v.Args[1] { 17403 break 17404 } 17405 v.reset(OpARMSRRconst) 17406 v.AuxInt = c 17407 v.AddArg(x) 17408 return true 17409 } 17410 // match: (XORshiftRL x (SRLconst x [c]) [d]) 17411 // cond: c==d 17412 // result: (MOVWconst [0]) 17413 for { 17414 d := v.AuxInt 17415 _ = v.Args[1] 17416 x := v.Args[0] 17417 v_1 := v.Args[1] 17418 if v_1.Op != OpARMSRLconst { 17419 break 17420 } 17421 c := v_1.AuxInt 17422 if x != v_1.Args[0] { 17423 break 17424 } 17425 if !(c == d) { 17426 break 17427 } 17428 v.reset(OpARMMOVWconst) 17429 v.AuxInt = 0 17430 return true 17431 } 17432 return false 17433 } 17434 func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { 17435 b := v.Block 17436 _ = b 17437 // match: (XORshiftRLreg (MOVWconst [c]) x y) 17438 // cond: 17439 // result: (XORconst [c] (SRL <x.Type> x y)) 17440 for { 17441 _ = v.Args[2] 17442 v_0 := v.Args[0] 17443 if v_0.Op != OpARMMOVWconst { 17444 break 17445 } 17446 c := v_0.AuxInt 17447 x := v.Args[1] 17448 y := v.Args[2] 17449 v.reset(OpARMXORconst) 17450 v.AuxInt = c 17451 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17452 v0.AddArg(x) 17453 v0.AddArg(y) 17454 v.AddArg(v0) 17455 return true 17456 } 17457 // match: (XORshiftRLreg x y (MOVWconst [c])) 17458 // cond: 17459 // result: (XORshiftRL x y [c]) 17460 for { 17461 _ = v.Args[2] 17462 x := v.Args[0] 17463 y := v.Args[1] 17464 v_2 := v.Args[2] 17465 if v_2.Op != OpARMMOVWconst { 17466 break 17467 } 17468 c := v_2.AuxInt 17469 v.reset(OpARMXORshiftRL) 17470 v.AuxInt = c 17471 v.AddArg(x) 17472 v.AddArg(y) 17473 return true 17474 } 17475 return false 17476 } 17477 func rewriteValueARM_OpARMXORshiftRR_0(v *Value) bool { 17478 b := v.Block 17479 _ = b 17480 // match: (XORshiftRR (MOVWconst [c]) x [d]) 17481 // cond: 17482 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 17483 for { 17484 d := v.AuxInt 17485 _ = v.Args[1] 17486 v_0 := v.Args[0] 17487 if v_0.Op != OpARMMOVWconst { 17488 break 17489 } 17490 c := v_0.AuxInt 17491 x := v.Args[1] 17492 v.reset(OpARMXORconst) 17493 v.AuxInt = c 17494 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 17495 v0.AuxInt = d 17496 v0.AddArg(x) 17497 v.AddArg(v0) 17498 return true 17499 } 17500 // match: (XORshiftRR x (MOVWconst [c]) [d]) 17501 // cond: 17502 // result: (XORconst x [int64(int32(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d)))]) 17503 for { 17504 d := v.AuxInt 17505 _ = v.Args[1] 17506 x := v.Args[0] 17507 v_1 := v.Args[1] 17508 if v_1.Op != OpARMMOVWconst { 17509 break 17510 } 17511 c := v_1.AuxInt 17512 v.reset(OpARMXORconst) 17513 v.AuxInt = int64(int32(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d))) 17514 v.AddArg(x) 17515 return true 17516 } 17517 return false 17518 } 17519 func rewriteValueARM_OpAdd16_0(v *Value) bool { 17520 // match: (Add16 x y) 17521 // cond: 17522 // result: (ADD x y) 17523 for { 17524 _ = v.Args[1] 17525 x := v.Args[0] 17526 y := v.Args[1] 17527 v.reset(OpARMADD) 17528 v.AddArg(x) 17529 v.AddArg(y) 17530 return true 17531 } 17532 } 17533 func rewriteValueARM_OpAdd32_0(v *Value) bool { 17534 // match: (Add32 x y) 17535 // cond: 17536 // result: (ADD x y) 17537 for { 17538 _ = v.Args[1] 17539 x := v.Args[0] 17540 y := v.Args[1] 17541 v.reset(OpARMADD) 17542 v.AddArg(x) 17543 v.AddArg(y) 17544 return true 17545 } 17546 } 17547 func rewriteValueARM_OpAdd32F_0(v *Value) bool { 17548 // match: (Add32F x y) 17549 // cond: 17550 // result: (ADDF x y) 17551 for { 17552 _ = v.Args[1] 17553 x := v.Args[0] 17554 y := v.Args[1] 17555 v.reset(OpARMADDF) 17556 v.AddArg(x) 17557 v.AddArg(y) 17558 return true 17559 } 17560 } 17561 func rewriteValueARM_OpAdd32carry_0(v *Value) bool { 17562 // match: (Add32carry x y) 17563 // cond: 17564 // result: (ADDS x y) 17565 for { 17566 _ = v.Args[1] 17567 x := v.Args[0] 17568 y := v.Args[1] 17569 v.reset(OpARMADDS) 17570 v.AddArg(x) 17571 v.AddArg(y) 17572 return true 17573 } 17574 } 17575 func rewriteValueARM_OpAdd32withcarry_0(v *Value) bool { 17576 // match: (Add32withcarry x y c) 17577 // cond: 17578 // result: (ADC x y c) 17579 for { 17580 _ = v.Args[2] 17581 x := v.Args[0] 17582 y := v.Args[1] 17583 c := v.Args[2] 17584 v.reset(OpARMADC) 17585 v.AddArg(x) 17586 v.AddArg(y) 17587 v.AddArg(c) 17588 return true 17589 } 17590 } 17591 func rewriteValueARM_OpAdd64F_0(v *Value) bool { 17592 // match: (Add64F x y) 17593 // cond: 17594 // result: (ADDD x y) 17595 for { 17596 _ = v.Args[1] 17597 x := v.Args[0] 17598 y := v.Args[1] 17599 v.reset(OpARMADDD) 17600 v.AddArg(x) 17601 v.AddArg(y) 17602 return true 17603 } 17604 } 17605 func rewriteValueARM_OpAdd8_0(v *Value) bool { 17606 // match: (Add8 x y) 17607 // cond: 17608 // result: (ADD x y) 17609 for { 17610 _ = v.Args[1] 17611 x := v.Args[0] 17612 y := v.Args[1] 17613 v.reset(OpARMADD) 17614 v.AddArg(x) 17615 v.AddArg(y) 17616 return true 17617 } 17618 } 17619 func rewriteValueARM_OpAddPtr_0(v *Value) bool { 17620 // match: (AddPtr x y) 17621 // cond: 17622 // result: (ADD x y) 17623 for { 17624 _ = v.Args[1] 17625 x := v.Args[0] 17626 y := v.Args[1] 17627 v.reset(OpARMADD) 17628 v.AddArg(x) 17629 v.AddArg(y) 17630 return true 17631 } 17632 } 17633 func rewriteValueARM_OpAddr_0(v *Value) bool { 17634 // match: (Addr {sym} base) 17635 // cond: 17636 // result: (MOVWaddr {sym} base) 17637 for { 17638 sym := v.Aux 17639 base := v.Args[0] 17640 v.reset(OpARMMOVWaddr) 17641 v.Aux = sym 17642 v.AddArg(base) 17643 return true 17644 } 17645 } 17646 func rewriteValueARM_OpAnd16_0(v *Value) bool { 17647 // match: (And16 x y) 17648 // cond: 17649 // result: (AND x y) 17650 for { 17651 _ = v.Args[1] 17652 x := v.Args[0] 17653 y := v.Args[1] 17654 v.reset(OpARMAND) 17655 v.AddArg(x) 17656 v.AddArg(y) 17657 return true 17658 } 17659 } 17660 func rewriteValueARM_OpAnd32_0(v *Value) bool { 17661 // match: (And32 x y) 17662 // cond: 17663 // result: (AND x y) 17664 for { 17665 _ = v.Args[1] 17666 x := v.Args[0] 17667 y := v.Args[1] 17668 v.reset(OpARMAND) 17669 v.AddArg(x) 17670 v.AddArg(y) 17671 return true 17672 } 17673 } 17674 func rewriteValueARM_OpAnd8_0(v *Value) bool { 17675 // match: (And8 x y) 17676 // cond: 17677 // result: (AND x y) 17678 for { 17679 _ = v.Args[1] 17680 x := v.Args[0] 17681 y := v.Args[1] 17682 v.reset(OpARMAND) 17683 v.AddArg(x) 17684 v.AddArg(y) 17685 return true 17686 } 17687 } 17688 func rewriteValueARM_OpAndB_0(v *Value) bool { 17689 // match: (AndB x y) 17690 // cond: 17691 // result: (AND x y) 17692 for { 17693 _ = v.Args[1] 17694 x := v.Args[0] 17695 y := v.Args[1] 17696 v.reset(OpARMAND) 17697 v.AddArg(x) 17698 v.AddArg(y) 17699 return true 17700 } 17701 } 17702 func rewriteValueARM_OpAvg32u_0(v *Value) bool { 17703 b := v.Block 17704 _ = b 17705 // match: (Avg32u <t> x y) 17706 // cond: 17707 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 17708 for { 17709 t := v.Type 17710 _ = v.Args[1] 17711 x := v.Args[0] 17712 y := v.Args[1] 17713 v.reset(OpARMADD) 17714 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 17715 v0.AuxInt = 1 17716 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 17717 v1.AddArg(x) 17718 v1.AddArg(y) 17719 v0.AddArg(v1) 17720 v.AddArg(v0) 17721 v.AddArg(y) 17722 return true 17723 } 17724 } 17725 func rewriteValueARM_OpBitLen32_0(v *Value) bool { 17726 b := v.Block 17727 _ = b 17728 // match: (BitLen32 <t> x) 17729 // cond: 17730 // result: (RSBconst [32] (CLZ <t> x)) 17731 for { 17732 t := v.Type 17733 x := v.Args[0] 17734 v.reset(OpARMRSBconst) 17735 v.AuxInt = 32 17736 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 17737 v0.AddArg(x) 17738 v.AddArg(v0) 17739 return true 17740 } 17741 } 17742 func rewriteValueARM_OpBswap32_0(v *Value) bool { 17743 b := v.Block 17744 _ = b 17745 // match: (Bswap32 <t> x) 17746 // cond: objabi.GOARM==5 17747 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 17748 for { 17749 t := v.Type 17750 x := v.Args[0] 17751 if !(objabi.GOARM == 5) { 17752 break 17753 } 17754 v.reset(OpARMXOR) 17755 v.Type = t 17756 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 17757 v0.AuxInt = 8 17758 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 17759 v1.AuxInt = 0xff0000 17760 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 17761 v2.AddArg(x) 17762 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 17763 v3.AuxInt = 16 17764 v3.AddArg(x) 17765 v2.AddArg(v3) 17766 v1.AddArg(v2) 17767 v0.AddArg(v1) 17768 v.AddArg(v0) 17769 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 17770 v4.AuxInt = 8 17771 v4.AddArg(x) 17772 v.AddArg(v4) 17773 return true 17774 } 17775 // match: (Bswap32 x) 17776 // cond: objabi.GOARM>=6 17777 // result: (REV x) 17778 for { 17779 x := v.Args[0] 17780 if !(objabi.GOARM >= 6) { 17781 break 17782 } 17783 v.reset(OpARMREV) 17784 v.AddArg(x) 17785 return true 17786 } 17787 return false 17788 } 17789 func rewriteValueARM_OpClosureCall_0(v *Value) bool { 17790 // match: (ClosureCall [argwid] entry closure mem) 17791 // cond: 17792 // result: (CALLclosure [argwid] entry closure mem) 17793 for { 17794 argwid := v.AuxInt 17795 _ = v.Args[2] 17796 entry := v.Args[0] 17797 closure := v.Args[1] 17798 mem := v.Args[2] 17799 v.reset(OpARMCALLclosure) 17800 v.AuxInt = argwid 17801 v.AddArg(entry) 17802 v.AddArg(closure) 17803 v.AddArg(mem) 17804 return true 17805 } 17806 } 17807 func rewriteValueARM_OpCom16_0(v *Value) bool { 17808 // match: (Com16 x) 17809 // cond: 17810 // result: (MVN x) 17811 for { 17812 x := v.Args[0] 17813 v.reset(OpARMMVN) 17814 v.AddArg(x) 17815 return true 17816 } 17817 } 17818 func rewriteValueARM_OpCom32_0(v *Value) bool { 17819 // match: (Com32 x) 17820 // cond: 17821 // result: (MVN x) 17822 for { 17823 x := v.Args[0] 17824 v.reset(OpARMMVN) 17825 v.AddArg(x) 17826 return true 17827 } 17828 } 17829 func rewriteValueARM_OpCom8_0(v *Value) bool { 17830 // match: (Com8 x) 17831 // cond: 17832 // result: (MVN x) 17833 for { 17834 x := v.Args[0] 17835 v.reset(OpARMMVN) 17836 v.AddArg(x) 17837 return true 17838 } 17839 } 17840 func rewriteValueARM_OpConst16_0(v *Value) bool { 17841 // match: (Const16 [val]) 17842 // cond: 17843 // result: (MOVWconst [val]) 17844 for { 17845 val := v.AuxInt 17846 v.reset(OpARMMOVWconst) 17847 v.AuxInt = val 17848 return true 17849 } 17850 } 17851 func rewriteValueARM_OpConst32_0(v *Value) bool { 17852 // match: (Const32 [val]) 17853 // cond: 17854 // result: (MOVWconst [val]) 17855 for { 17856 val := v.AuxInt 17857 v.reset(OpARMMOVWconst) 17858 v.AuxInt = val 17859 return true 17860 } 17861 } 17862 func rewriteValueARM_OpConst32F_0(v *Value) bool { 17863 // match: (Const32F [val]) 17864 // cond: 17865 // result: (MOVFconst [val]) 17866 for { 17867 val := v.AuxInt 17868 v.reset(OpARMMOVFconst) 17869 v.AuxInt = val 17870 return true 17871 } 17872 } 17873 func rewriteValueARM_OpConst64F_0(v *Value) bool { 17874 // match: (Const64F [val]) 17875 // cond: 17876 // result: (MOVDconst [val]) 17877 for { 17878 val := v.AuxInt 17879 v.reset(OpARMMOVDconst) 17880 v.AuxInt = val 17881 return true 17882 } 17883 } 17884 func rewriteValueARM_OpConst8_0(v *Value) bool { 17885 // match: (Const8 [val]) 17886 // cond: 17887 // result: (MOVWconst [val]) 17888 for { 17889 val := v.AuxInt 17890 v.reset(OpARMMOVWconst) 17891 v.AuxInt = val 17892 return true 17893 } 17894 } 17895 func rewriteValueARM_OpConstBool_0(v *Value) bool { 17896 // match: (ConstBool [b]) 17897 // cond: 17898 // result: (MOVWconst [b]) 17899 for { 17900 b := v.AuxInt 17901 v.reset(OpARMMOVWconst) 17902 v.AuxInt = b 17903 return true 17904 } 17905 } 17906 func rewriteValueARM_OpConstNil_0(v *Value) bool { 17907 // match: (ConstNil) 17908 // cond: 17909 // result: (MOVWconst [0]) 17910 for { 17911 v.reset(OpARMMOVWconst) 17912 v.AuxInt = 0 17913 return true 17914 } 17915 } 17916 func rewriteValueARM_OpConvert_0(v *Value) bool { 17917 // match: (Convert x mem) 17918 // cond: 17919 // result: (MOVWconvert x mem) 17920 for { 17921 _ = v.Args[1] 17922 x := v.Args[0] 17923 mem := v.Args[1] 17924 v.reset(OpARMMOVWconvert) 17925 v.AddArg(x) 17926 v.AddArg(mem) 17927 return true 17928 } 17929 } 17930 func rewriteValueARM_OpCtz32_0(v *Value) bool { 17931 b := v.Block 17932 _ = b 17933 // match: (Ctz32 <t> x) 17934 // cond: objabi.GOARM<=6 17935 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 17936 for { 17937 t := v.Type 17938 x := v.Args[0] 17939 if !(objabi.GOARM <= 6) { 17940 break 17941 } 17942 v.reset(OpARMRSBconst) 17943 v.AuxInt = 32 17944 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 17945 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 17946 v1.AuxInt = 1 17947 v2 := b.NewValue0(v.Pos, OpARMAND, t) 17948 v2.AddArg(x) 17949 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 17950 v3.AuxInt = 0 17951 v3.AddArg(x) 17952 v2.AddArg(v3) 17953 v1.AddArg(v2) 17954 v0.AddArg(v1) 17955 v.AddArg(v0) 17956 return true 17957 } 17958 // match: (Ctz32 <t> x) 17959 // cond: objabi.GOARM==7 17960 // result: (CLZ <t> (RBIT <t> x)) 17961 for { 17962 t := v.Type 17963 x := v.Args[0] 17964 if !(objabi.GOARM == 7) { 17965 break 17966 } 17967 v.reset(OpARMCLZ) 17968 v.Type = t 17969 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 17970 v0.AddArg(x) 17971 v.AddArg(v0) 17972 return true 17973 } 17974 return false 17975 } 17976 func rewriteValueARM_OpCvt32Fto32_0(v *Value) bool { 17977 // match: (Cvt32Fto32 x) 17978 // cond: 17979 // result: (MOVFW x) 17980 for { 17981 x := v.Args[0] 17982 v.reset(OpARMMOVFW) 17983 v.AddArg(x) 17984 return true 17985 } 17986 } 17987 func rewriteValueARM_OpCvt32Fto32U_0(v *Value) bool { 17988 // match: (Cvt32Fto32U x) 17989 // cond: 17990 // result: (MOVFWU x) 17991 for { 17992 x := v.Args[0] 17993 v.reset(OpARMMOVFWU) 17994 v.AddArg(x) 17995 return true 17996 } 17997 } 17998 func rewriteValueARM_OpCvt32Fto64F_0(v *Value) bool { 17999 // match: (Cvt32Fto64F x) 18000 // cond: 18001 // result: (MOVFD x) 18002 for { 18003 x := v.Args[0] 18004 v.reset(OpARMMOVFD) 18005 v.AddArg(x) 18006 return true 18007 } 18008 } 18009 func rewriteValueARM_OpCvt32Uto32F_0(v *Value) bool { 18010 // match: (Cvt32Uto32F x) 18011 // cond: 18012 // result: (MOVWUF x) 18013 for { 18014 x := v.Args[0] 18015 v.reset(OpARMMOVWUF) 18016 v.AddArg(x) 18017 return true 18018 } 18019 } 18020 func rewriteValueARM_OpCvt32Uto64F_0(v *Value) bool { 18021 // match: (Cvt32Uto64F x) 18022 // cond: 18023 // result: (MOVWUD x) 18024 for { 18025 x := v.Args[0] 18026 v.reset(OpARMMOVWUD) 18027 v.AddArg(x) 18028 return true 18029 } 18030 } 18031 func rewriteValueARM_OpCvt32to32F_0(v *Value) bool { 18032 // match: (Cvt32to32F x) 18033 // cond: 18034 // result: (MOVWF x) 18035 for { 18036 x := v.Args[0] 18037 v.reset(OpARMMOVWF) 18038 v.AddArg(x) 18039 return true 18040 } 18041 } 18042 func rewriteValueARM_OpCvt32to64F_0(v *Value) bool { 18043 // match: (Cvt32to64F x) 18044 // cond: 18045 // result: (MOVWD x) 18046 for { 18047 x := v.Args[0] 18048 v.reset(OpARMMOVWD) 18049 v.AddArg(x) 18050 return true 18051 } 18052 } 18053 func rewriteValueARM_OpCvt64Fto32_0(v *Value) bool { 18054 // match: (Cvt64Fto32 x) 18055 // cond: 18056 // result: (MOVDW x) 18057 for { 18058 x := v.Args[0] 18059 v.reset(OpARMMOVDW) 18060 v.AddArg(x) 18061 return true 18062 } 18063 } 18064 func rewriteValueARM_OpCvt64Fto32F_0(v *Value) bool { 18065 // match: (Cvt64Fto32F x) 18066 // cond: 18067 // result: (MOVDF x) 18068 for { 18069 x := v.Args[0] 18070 v.reset(OpARMMOVDF) 18071 v.AddArg(x) 18072 return true 18073 } 18074 } 18075 func rewriteValueARM_OpCvt64Fto32U_0(v *Value) bool { 18076 // match: (Cvt64Fto32U x) 18077 // cond: 18078 // result: (MOVDWU x) 18079 for { 18080 x := v.Args[0] 18081 v.reset(OpARMMOVDWU) 18082 v.AddArg(x) 18083 return true 18084 } 18085 } 18086 func rewriteValueARM_OpDiv16_0(v *Value) bool { 18087 b := v.Block 18088 _ = b 18089 typ := &b.Func.Config.Types 18090 _ = typ 18091 // match: (Div16 x y) 18092 // cond: 18093 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 18094 for { 18095 _ = v.Args[1] 18096 x := v.Args[0] 18097 y := v.Args[1] 18098 v.reset(OpDiv32) 18099 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18100 v0.AddArg(x) 18101 v.AddArg(v0) 18102 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18103 v1.AddArg(y) 18104 v.AddArg(v1) 18105 return true 18106 } 18107 } 18108 func rewriteValueARM_OpDiv16u_0(v *Value) bool { 18109 b := v.Block 18110 _ = b 18111 typ := &b.Func.Config.Types 18112 _ = typ 18113 // match: (Div16u x y) 18114 // cond: 18115 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 18116 for { 18117 _ = v.Args[1] 18118 x := v.Args[0] 18119 y := v.Args[1] 18120 v.reset(OpDiv32u) 18121 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18122 v0.AddArg(x) 18123 v.AddArg(v0) 18124 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18125 v1.AddArg(y) 18126 v.AddArg(v1) 18127 return true 18128 } 18129 } 18130 func rewriteValueARM_OpDiv32_0(v *Value) bool { 18131 b := v.Block 18132 _ = b 18133 typ := &b.Func.Config.Types 18134 _ = typ 18135 // match: (Div32 x y) 18136 // cond: 18137 // 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))) 18138 for { 18139 _ = v.Args[1] 18140 x := v.Args[0] 18141 y := v.Args[1] 18142 v.reset(OpARMSUB) 18143 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18144 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 18145 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 18146 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 18147 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18148 v4.AddArg(x) 18149 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18150 v5.AddArg(x) 18151 v4.AddArg(v5) 18152 v3.AddArg(v4) 18153 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18154 v6.AddArg(x) 18155 v3.AddArg(v6) 18156 v2.AddArg(v3) 18157 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 18158 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18159 v8.AddArg(y) 18160 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18161 v9.AddArg(y) 18162 v8.AddArg(v9) 18163 v7.AddArg(v8) 18164 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18165 v10.AddArg(y) 18166 v7.AddArg(v10) 18167 v2.AddArg(v7) 18168 v1.AddArg(v2) 18169 v0.AddArg(v1) 18170 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18171 v12 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18172 v12.AddArg(x) 18173 v12.AddArg(y) 18174 v11.AddArg(v12) 18175 v0.AddArg(v11) 18176 v.AddArg(v0) 18177 v13 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18178 v14 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18179 v14.AddArg(x) 18180 v14.AddArg(y) 18181 v13.AddArg(v14) 18182 v.AddArg(v13) 18183 return true 18184 } 18185 } 18186 func rewriteValueARM_OpDiv32F_0(v *Value) bool { 18187 // match: (Div32F x y) 18188 // cond: 18189 // result: (DIVF x y) 18190 for { 18191 _ = v.Args[1] 18192 x := v.Args[0] 18193 y := v.Args[1] 18194 v.reset(OpARMDIVF) 18195 v.AddArg(x) 18196 v.AddArg(y) 18197 return true 18198 } 18199 } 18200 func rewriteValueARM_OpDiv32u_0(v *Value) bool { 18201 b := v.Block 18202 _ = b 18203 typ := &b.Func.Config.Types 18204 _ = typ 18205 // match: (Div32u x y) 18206 // cond: 18207 // result: (Select0 <typ.UInt32> (CALLudiv x y)) 18208 for { 18209 _ = v.Args[1] 18210 x := v.Args[0] 18211 y := v.Args[1] 18212 v.reset(OpSelect0) 18213 v.Type = typ.UInt32 18214 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 18215 v0.AddArg(x) 18216 v0.AddArg(y) 18217 v.AddArg(v0) 18218 return true 18219 } 18220 } 18221 func rewriteValueARM_OpDiv64F_0(v *Value) bool { 18222 // match: (Div64F x y) 18223 // cond: 18224 // result: (DIVD x y) 18225 for { 18226 _ = v.Args[1] 18227 x := v.Args[0] 18228 y := v.Args[1] 18229 v.reset(OpARMDIVD) 18230 v.AddArg(x) 18231 v.AddArg(y) 18232 return true 18233 } 18234 } 18235 func rewriteValueARM_OpDiv8_0(v *Value) bool { 18236 b := v.Block 18237 _ = b 18238 typ := &b.Func.Config.Types 18239 _ = typ 18240 // match: (Div8 x y) 18241 // cond: 18242 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 18243 for { 18244 _ = v.Args[1] 18245 x := v.Args[0] 18246 y := v.Args[1] 18247 v.reset(OpDiv32) 18248 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18249 v0.AddArg(x) 18250 v.AddArg(v0) 18251 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18252 v1.AddArg(y) 18253 v.AddArg(v1) 18254 return true 18255 } 18256 } 18257 func rewriteValueARM_OpDiv8u_0(v *Value) bool { 18258 b := v.Block 18259 _ = b 18260 typ := &b.Func.Config.Types 18261 _ = typ 18262 // match: (Div8u x y) 18263 // cond: 18264 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 18265 for { 18266 _ = v.Args[1] 18267 x := v.Args[0] 18268 y := v.Args[1] 18269 v.reset(OpDiv32u) 18270 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18271 v0.AddArg(x) 18272 v.AddArg(v0) 18273 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18274 v1.AddArg(y) 18275 v.AddArg(v1) 18276 return true 18277 } 18278 } 18279 func rewriteValueARM_OpEq16_0(v *Value) bool { 18280 b := v.Block 18281 _ = b 18282 typ := &b.Func.Config.Types 18283 _ = typ 18284 // match: (Eq16 x y) 18285 // cond: 18286 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18287 for { 18288 _ = v.Args[1] 18289 x := v.Args[0] 18290 y := v.Args[1] 18291 v.reset(OpARMEqual) 18292 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18293 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18294 v1.AddArg(x) 18295 v0.AddArg(v1) 18296 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18297 v2.AddArg(y) 18298 v0.AddArg(v2) 18299 v.AddArg(v0) 18300 return true 18301 } 18302 } 18303 func rewriteValueARM_OpEq32_0(v *Value) bool { 18304 b := v.Block 18305 _ = b 18306 // match: (Eq32 x y) 18307 // cond: 18308 // result: (Equal (CMP x y)) 18309 for { 18310 _ = v.Args[1] 18311 x := v.Args[0] 18312 y := v.Args[1] 18313 v.reset(OpARMEqual) 18314 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18315 v0.AddArg(x) 18316 v0.AddArg(y) 18317 v.AddArg(v0) 18318 return true 18319 } 18320 } 18321 func rewriteValueARM_OpEq32F_0(v *Value) bool { 18322 b := v.Block 18323 _ = b 18324 // match: (Eq32F x y) 18325 // cond: 18326 // result: (Equal (CMPF x y)) 18327 for { 18328 _ = v.Args[1] 18329 x := v.Args[0] 18330 y := v.Args[1] 18331 v.reset(OpARMEqual) 18332 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18333 v0.AddArg(x) 18334 v0.AddArg(y) 18335 v.AddArg(v0) 18336 return true 18337 } 18338 } 18339 func rewriteValueARM_OpEq64F_0(v *Value) bool { 18340 b := v.Block 18341 _ = b 18342 // match: (Eq64F x y) 18343 // cond: 18344 // result: (Equal (CMPD x y)) 18345 for { 18346 _ = v.Args[1] 18347 x := v.Args[0] 18348 y := v.Args[1] 18349 v.reset(OpARMEqual) 18350 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18351 v0.AddArg(x) 18352 v0.AddArg(y) 18353 v.AddArg(v0) 18354 return true 18355 } 18356 } 18357 func rewriteValueARM_OpEq8_0(v *Value) bool { 18358 b := v.Block 18359 _ = b 18360 typ := &b.Func.Config.Types 18361 _ = typ 18362 // match: (Eq8 x y) 18363 // cond: 18364 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 18365 for { 18366 _ = v.Args[1] 18367 x := v.Args[0] 18368 y := v.Args[1] 18369 v.reset(OpARMEqual) 18370 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18371 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18372 v1.AddArg(x) 18373 v0.AddArg(v1) 18374 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18375 v2.AddArg(y) 18376 v0.AddArg(v2) 18377 v.AddArg(v0) 18378 return true 18379 } 18380 } 18381 func rewriteValueARM_OpEqB_0(v *Value) bool { 18382 b := v.Block 18383 _ = b 18384 typ := &b.Func.Config.Types 18385 _ = typ 18386 // match: (EqB x y) 18387 // cond: 18388 // result: (XORconst [1] (XOR <typ.Bool> x y)) 18389 for { 18390 _ = v.Args[1] 18391 x := v.Args[0] 18392 y := v.Args[1] 18393 v.reset(OpARMXORconst) 18394 v.AuxInt = 1 18395 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool) 18396 v0.AddArg(x) 18397 v0.AddArg(y) 18398 v.AddArg(v0) 18399 return true 18400 } 18401 } 18402 func rewriteValueARM_OpEqPtr_0(v *Value) bool { 18403 b := v.Block 18404 _ = b 18405 // match: (EqPtr x y) 18406 // cond: 18407 // result: (Equal (CMP x y)) 18408 for { 18409 _ = v.Args[1] 18410 x := v.Args[0] 18411 y := v.Args[1] 18412 v.reset(OpARMEqual) 18413 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18414 v0.AddArg(x) 18415 v0.AddArg(y) 18416 v.AddArg(v0) 18417 return true 18418 } 18419 } 18420 func rewriteValueARM_OpGeq16_0(v *Value) bool { 18421 b := v.Block 18422 _ = b 18423 typ := &b.Func.Config.Types 18424 _ = typ 18425 // match: (Geq16 x y) 18426 // cond: 18427 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 18428 for { 18429 _ = v.Args[1] 18430 x := v.Args[0] 18431 y := v.Args[1] 18432 v.reset(OpARMGreaterEqual) 18433 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18434 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18435 v1.AddArg(x) 18436 v0.AddArg(v1) 18437 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18438 v2.AddArg(y) 18439 v0.AddArg(v2) 18440 v.AddArg(v0) 18441 return true 18442 } 18443 } 18444 func rewriteValueARM_OpGeq16U_0(v *Value) bool { 18445 b := v.Block 18446 _ = b 18447 typ := &b.Func.Config.Types 18448 _ = typ 18449 // match: (Geq16U x y) 18450 // cond: 18451 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18452 for { 18453 _ = v.Args[1] 18454 x := v.Args[0] 18455 y := v.Args[1] 18456 v.reset(OpARMGreaterEqualU) 18457 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18458 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18459 v1.AddArg(x) 18460 v0.AddArg(v1) 18461 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18462 v2.AddArg(y) 18463 v0.AddArg(v2) 18464 v.AddArg(v0) 18465 return true 18466 } 18467 } 18468 func rewriteValueARM_OpGeq32_0(v *Value) bool { 18469 b := v.Block 18470 _ = b 18471 // match: (Geq32 x y) 18472 // cond: 18473 // result: (GreaterEqual (CMP x y)) 18474 for { 18475 _ = v.Args[1] 18476 x := v.Args[0] 18477 y := v.Args[1] 18478 v.reset(OpARMGreaterEqual) 18479 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18480 v0.AddArg(x) 18481 v0.AddArg(y) 18482 v.AddArg(v0) 18483 return true 18484 } 18485 } 18486 func rewriteValueARM_OpGeq32F_0(v *Value) bool { 18487 b := v.Block 18488 _ = b 18489 // match: (Geq32F x y) 18490 // cond: 18491 // result: (GreaterEqual (CMPF x y)) 18492 for { 18493 _ = v.Args[1] 18494 x := v.Args[0] 18495 y := v.Args[1] 18496 v.reset(OpARMGreaterEqual) 18497 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18498 v0.AddArg(x) 18499 v0.AddArg(y) 18500 v.AddArg(v0) 18501 return true 18502 } 18503 } 18504 func rewriteValueARM_OpGeq32U_0(v *Value) bool { 18505 b := v.Block 18506 _ = b 18507 // match: (Geq32U x y) 18508 // cond: 18509 // result: (GreaterEqualU (CMP x y)) 18510 for { 18511 _ = v.Args[1] 18512 x := v.Args[0] 18513 y := v.Args[1] 18514 v.reset(OpARMGreaterEqualU) 18515 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18516 v0.AddArg(x) 18517 v0.AddArg(y) 18518 v.AddArg(v0) 18519 return true 18520 } 18521 } 18522 func rewriteValueARM_OpGeq64F_0(v *Value) bool { 18523 b := v.Block 18524 _ = b 18525 // match: (Geq64F x y) 18526 // cond: 18527 // result: (GreaterEqual (CMPD x y)) 18528 for { 18529 _ = v.Args[1] 18530 x := v.Args[0] 18531 y := v.Args[1] 18532 v.reset(OpARMGreaterEqual) 18533 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18534 v0.AddArg(x) 18535 v0.AddArg(y) 18536 v.AddArg(v0) 18537 return true 18538 } 18539 } 18540 func rewriteValueARM_OpGeq8_0(v *Value) bool { 18541 b := v.Block 18542 _ = b 18543 typ := &b.Func.Config.Types 18544 _ = typ 18545 // match: (Geq8 x y) 18546 // cond: 18547 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 18548 for { 18549 _ = v.Args[1] 18550 x := v.Args[0] 18551 y := v.Args[1] 18552 v.reset(OpARMGreaterEqual) 18553 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18554 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18555 v1.AddArg(x) 18556 v0.AddArg(v1) 18557 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18558 v2.AddArg(y) 18559 v0.AddArg(v2) 18560 v.AddArg(v0) 18561 return true 18562 } 18563 } 18564 func rewriteValueARM_OpGeq8U_0(v *Value) bool { 18565 b := v.Block 18566 _ = b 18567 typ := &b.Func.Config.Types 18568 _ = typ 18569 // match: (Geq8U x y) 18570 // cond: 18571 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 18572 for { 18573 _ = v.Args[1] 18574 x := v.Args[0] 18575 y := v.Args[1] 18576 v.reset(OpARMGreaterEqualU) 18577 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18578 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18579 v1.AddArg(x) 18580 v0.AddArg(v1) 18581 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18582 v2.AddArg(y) 18583 v0.AddArg(v2) 18584 v.AddArg(v0) 18585 return true 18586 } 18587 } 18588 func rewriteValueARM_OpGetCallerSP_0(v *Value) bool { 18589 // match: (GetCallerSP) 18590 // cond: 18591 // result: (LoweredGetCallerSP) 18592 for { 18593 v.reset(OpARMLoweredGetCallerSP) 18594 return true 18595 } 18596 } 18597 func rewriteValueARM_OpGetClosurePtr_0(v *Value) bool { 18598 // match: (GetClosurePtr) 18599 // cond: 18600 // result: (LoweredGetClosurePtr) 18601 for { 18602 v.reset(OpARMLoweredGetClosurePtr) 18603 return true 18604 } 18605 } 18606 func rewriteValueARM_OpGreater16_0(v *Value) bool { 18607 b := v.Block 18608 _ = b 18609 typ := &b.Func.Config.Types 18610 _ = typ 18611 // match: (Greater16 x y) 18612 // cond: 18613 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 18614 for { 18615 _ = v.Args[1] 18616 x := v.Args[0] 18617 y := v.Args[1] 18618 v.reset(OpARMGreaterThan) 18619 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18620 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18621 v1.AddArg(x) 18622 v0.AddArg(v1) 18623 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18624 v2.AddArg(y) 18625 v0.AddArg(v2) 18626 v.AddArg(v0) 18627 return true 18628 } 18629 } 18630 func rewriteValueARM_OpGreater16U_0(v *Value) bool { 18631 b := v.Block 18632 _ = b 18633 typ := &b.Func.Config.Types 18634 _ = typ 18635 // match: (Greater16U x y) 18636 // cond: 18637 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18638 for { 18639 _ = v.Args[1] 18640 x := v.Args[0] 18641 y := v.Args[1] 18642 v.reset(OpARMGreaterThanU) 18643 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18644 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18645 v1.AddArg(x) 18646 v0.AddArg(v1) 18647 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18648 v2.AddArg(y) 18649 v0.AddArg(v2) 18650 v.AddArg(v0) 18651 return true 18652 } 18653 } 18654 func rewriteValueARM_OpGreater32_0(v *Value) bool { 18655 b := v.Block 18656 _ = b 18657 // match: (Greater32 x y) 18658 // cond: 18659 // result: (GreaterThan (CMP x y)) 18660 for { 18661 _ = v.Args[1] 18662 x := v.Args[0] 18663 y := v.Args[1] 18664 v.reset(OpARMGreaterThan) 18665 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18666 v0.AddArg(x) 18667 v0.AddArg(y) 18668 v.AddArg(v0) 18669 return true 18670 } 18671 } 18672 func rewriteValueARM_OpGreater32F_0(v *Value) bool { 18673 b := v.Block 18674 _ = b 18675 // match: (Greater32F x y) 18676 // cond: 18677 // result: (GreaterThan (CMPF x y)) 18678 for { 18679 _ = v.Args[1] 18680 x := v.Args[0] 18681 y := v.Args[1] 18682 v.reset(OpARMGreaterThan) 18683 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18684 v0.AddArg(x) 18685 v0.AddArg(y) 18686 v.AddArg(v0) 18687 return true 18688 } 18689 } 18690 func rewriteValueARM_OpGreater32U_0(v *Value) bool { 18691 b := v.Block 18692 _ = b 18693 // match: (Greater32U x y) 18694 // cond: 18695 // result: (GreaterThanU (CMP x y)) 18696 for { 18697 _ = v.Args[1] 18698 x := v.Args[0] 18699 y := v.Args[1] 18700 v.reset(OpARMGreaterThanU) 18701 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18702 v0.AddArg(x) 18703 v0.AddArg(y) 18704 v.AddArg(v0) 18705 return true 18706 } 18707 } 18708 func rewriteValueARM_OpGreater64F_0(v *Value) bool { 18709 b := v.Block 18710 _ = b 18711 // match: (Greater64F x y) 18712 // cond: 18713 // result: (GreaterThan (CMPD x y)) 18714 for { 18715 _ = v.Args[1] 18716 x := v.Args[0] 18717 y := v.Args[1] 18718 v.reset(OpARMGreaterThan) 18719 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18720 v0.AddArg(x) 18721 v0.AddArg(y) 18722 v.AddArg(v0) 18723 return true 18724 } 18725 } 18726 func rewriteValueARM_OpGreater8_0(v *Value) bool { 18727 b := v.Block 18728 _ = b 18729 typ := &b.Func.Config.Types 18730 _ = typ 18731 // match: (Greater8 x y) 18732 // cond: 18733 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 18734 for { 18735 _ = v.Args[1] 18736 x := v.Args[0] 18737 y := v.Args[1] 18738 v.reset(OpARMGreaterThan) 18739 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18740 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18741 v1.AddArg(x) 18742 v0.AddArg(v1) 18743 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18744 v2.AddArg(y) 18745 v0.AddArg(v2) 18746 v.AddArg(v0) 18747 return true 18748 } 18749 } 18750 func rewriteValueARM_OpGreater8U_0(v *Value) bool { 18751 b := v.Block 18752 _ = b 18753 typ := &b.Func.Config.Types 18754 _ = typ 18755 // match: (Greater8U x y) 18756 // cond: 18757 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 18758 for { 18759 _ = v.Args[1] 18760 x := v.Args[0] 18761 y := v.Args[1] 18762 v.reset(OpARMGreaterThanU) 18763 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18764 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18765 v1.AddArg(x) 18766 v0.AddArg(v1) 18767 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18768 v2.AddArg(y) 18769 v0.AddArg(v2) 18770 v.AddArg(v0) 18771 return true 18772 } 18773 } 18774 func rewriteValueARM_OpHmul32_0(v *Value) bool { 18775 // match: (Hmul32 x y) 18776 // cond: 18777 // result: (HMUL x y) 18778 for { 18779 _ = v.Args[1] 18780 x := v.Args[0] 18781 y := v.Args[1] 18782 v.reset(OpARMHMUL) 18783 v.AddArg(x) 18784 v.AddArg(y) 18785 return true 18786 } 18787 } 18788 func rewriteValueARM_OpHmul32u_0(v *Value) bool { 18789 // match: (Hmul32u x y) 18790 // cond: 18791 // result: (HMULU x y) 18792 for { 18793 _ = v.Args[1] 18794 x := v.Args[0] 18795 y := v.Args[1] 18796 v.reset(OpARMHMULU) 18797 v.AddArg(x) 18798 v.AddArg(y) 18799 return true 18800 } 18801 } 18802 func rewriteValueARM_OpInterCall_0(v *Value) bool { 18803 // match: (InterCall [argwid] entry mem) 18804 // cond: 18805 // result: (CALLinter [argwid] entry mem) 18806 for { 18807 argwid := v.AuxInt 18808 _ = v.Args[1] 18809 entry := v.Args[0] 18810 mem := v.Args[1] 18811 v.reset(OpARMCALLinter) 18812 v.AuxInt = argwid 18813 v.AddArg(entry) 18814 v.AddArg(mem) 18815 return true 18816 } 18817 } 18818 func rewriteValueARM_OpIsInBounds_0(v *Value) bool { 18819 b := v.Block 18820 _ = b 18821 // match: (IsInBounds idx len) 18822 // cond: 18823 // result: (LessThanU (CMP idx len)) 18824 for { 18825 _ = v.Args[1] 18826 idx := v.Args[0] 18827 len := v.Args[1] 18828 v.reset(OpARMLessThanU) 18829 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18830 v0.AddArg(idx) 18831 v0.AddArg(len) 18832 v.AddArg(v0) 18833 return true 18834 } 18835 } 18836 func rewriteValueARM_OpIsNonNil_0(v *Value) bool { 18837 b := v.Block 18838 _ = b 18839 // match: (IsNonNil ptr) 18840 // cond: 18841 // result: (NotEqual (CMPconst [0] ptr)) 18842 for { 18843 ptr := v.Args[0] 18844 v.reset(OpARMNotEqual) 18845 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18846 v0.AuxInt = 0 18847 v0.AddArg(ptr) 18848 v.AddArg(v0) 18849 return true 18850 } 18851 } 18852 func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { 18853 b := v.Block 18854 _ = b 18855 // match: (IsSliceInBounds idx len) 18856 // cond: 18857 // result: (LessEqualU (CMP idx len)) 18858 for { 18859 _ = v.Args[1] 18860 idx := v.Args[0] 18861 len := v.Args[1] 18862 v.reset(OpARMLessEqualU) 18863 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18864 v0.AddArg(idx) 18865 v0.AddArg(len) 18866 v.AddArg(v0) 18867 return true 18868 } 18869 } 18870 func rewriteValueARM_OpLeq16_0(v *Value) bool { 18871 b := v.Block 18872 _ = b 18873 typ := &b.Func.Config.Types 18874 _ = typ 18875 // match: (Leq16 x y) 18876 // cond: 18877 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 18878 for { 18879 _ = v.Args[1] 18880 x := v.Args[0] 18881 y := v.Args[1] 18882 v.reset(OpARMLessEqual) 18883 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18884 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18885 v1.AddArg(x) 18886 v0.AddArg(v1) 18887 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18888 v2.AddArg(y) 18889 v0.AddArg(v2) 18890 v.AddArg(v0) 18891 return true 18892 } 18893 } 18894 func rewriteValueARM_OpLeq16U_0(v *Value) bool { 18895 b := v.Block 18896 _ = b 18897 typ := &b.Func.Config.Types 18898 _ = typ 18899 // match: (Leq16U x y) 18900 // cond: 18901 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18902 for { 18903 _ = v.Args[1] 18904 x := v.Args[0] 18905 y := v.Args[1] 18906 v.reset(OpARMLessEqualU) 18907 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18908 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18909 v1.AddArg(x) 18910 v0.AddArg(v1) 18911 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18912 v2.AddArg(y) 18913 v0.AddArg(v2) 18914 v.AddArg(v0) 18915 return true 18916 } 18917 } 18918 func rewriteValueARM_OpLeq32_0(v *Value) bool { 18919 b := v.Block 18920 _ = b 18921 // match: (Leq32 x y) 18922 // cond: 18923 // result: (LessEqual (CMP x y)) 18924 for { 18925 _ = v.Args[1] 18926 x := v.Args[0] 18927 y := v.Args[1] 18928 v.reset(OpARMLessEqual) 18929 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18930 v0.AddArg(x) 18931 v0.AddArg(y) 18932 v.AddArg(v0) 18933 return true 18934 } 18935 } 18936 func rewriteValueARM_OpLeq32F_0(v *Value) bool { 18937 b := v.Block 18938 _ = b 18939 // match: (Leq32F x y) 18940 // cond: 18941 // result: (GreaterEqual (CMPF y x)) 18942 for { 18943 _ = v.Args[1] 18944 x := v.Args[0] 18945 y := v.Args[1] 18946 v.reset(OpARMGreaterEqual) 18947 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18948 v0.AddArg(y) 18949 v0.AddArg(x) 18950 v.AddArg(v0) 18951 return true 18952 } 18953 } 18954 func rewriteValueARM_OpLeq32U_0(v *Value) bool { 18955 b := v.Block 18956 _ = b 18957 // match: (Leq32U x y) 18958 // cond: 18959 // result: (LessEqualU (CMP x y)) 18960 for { 18961 _ = v.Args[1] 18962 x := v.Args[0] 18963 y := v.Args[1] 18964 v.reset(OpARMLessEqualU) 18965 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18966 v0.AddArg(x) 18967 v0.AddArg(y) 18968 v.AddArg(v0) 18969 return true 18970 } 18971 } 18972 func rewriteValueARM_OpLeq64F_0(v *Value) bool { 18973 b := v.Block 18974 _ = b 18975 // match: (Leq64F x y) 18976 // cond: 18977 // result: (GreaterEqual (CMPD y x)) 18978 for { 18979 _ = v.Args[1] 18980 x := v.Args[0] 18981 y := v.Args[1] 18982 v.reset(OpARMGreaterEqual) 18983 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18984 v0.AddArg(y) 18985 v0.AddArg(x) 18986 v.AddArg(v0) 18987 return true 18988 } 18989 } 18990 func rewriteValueARM_OpLeq8_0(v *Value) bool { 18991 b := v.Block 18992 _ = b 18993 typ := &b.Func.Config.Types 18994 _ = typ 18995 // match: (Leq8 x y) 18996 // cond: 18997 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 18998 for { 18999 _ = v.Args[1] 19000 x := v.Args[0] 19001 y := v.Args[1] 19002 v.reset(OpARMLessEqual) 19003 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19004 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19005 v1.AddArg(x) 19006 v0.AddArg(v1) 19007 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19008 v2.AddArg(y) 19009 v0.AddArg(v2) 19010 v.AddArg(v0) 19011 return true 19012 } 19013 } 19014 func rewriteValueARM_OpLeq8U_0(v *Value) bool { 19015 b := v.Block 19016 _ = b 19017 typ := &b.Func.Config.Types 19018 _ = typ 19019 // match: (Leq8U x y) 19020 // cond: 19021 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 19022 for { 19023 _ = v.Args[1] 19024 x := v.Args[0] 19025 y := v.Args[1] 19026 v.reset(OpARMLessEqualU) 19027 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19028 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19029 v1.AddArg(x) 19030 v0.AddArg(v1) 19031 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19032 v2.AddArg(y) 19033 v0.AddArg(v2) 19034 v.AddArg(v0) 19035 return true 19036 } 19037 } 19038 func rewriteValueARM_OpLess16_0(v *Value) bool { 19039 b := v.Block 19040 _ = b 19041 typ := &b.Func.Config.Types 19042 _ = typ 19043 // match: (Less16 x y) 19044 // cond: 19045 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 19046 for { 19047 _ = v.Args[1] 19048 x := v.Args[0] 19049 y := v.Args[1] 19050 v.reset(OpARMLessThan) 19051 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19052 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19053 v1.AddArg(x) 19054 v0.AddArg(v1) 19055 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19056 v2.AddArg(y) 19057 v0.AddArg(v2) 19058 v.AddArg(v0) 19059 return true 19060 } 19061 } 19062 func rewriteValueARM_OpLess16U_0(v *Value) bool { 19063 b := v.Block 19064 _ = b 19065 typ := &b.Func.Config.Types 19066 _ = typ 19067 // match: (Less16U x y) 19068 // cond: 19069 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 19070 for { 19071 _ = v.Args[1] 19072 x := v.Args[0] 19073 y := v.Args[1] 19074 v.reset(OpARMLessThanU) 19075 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19076 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19077 v1.AddArg(x) 19078 v0.AddArg(v1) 19079 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19080 v2.AddArg(y) 19081 v0.AddArg(v2) 19082 v.AddArg(v0) 19083 return true 19084 } 19085 } 19086 func rewriteValueARM_OpLess32_0(v *Value) bool { 19087 b := v.Block 19088 _ = b 19089 // match: (Less32 x y) 19090 // cond: 19091 // result: (LessThan (CMP x y)) 19092 for { 19093 _ = v.Args[1] 19094 x := v.Args[0] 19095 y := v.Args[1] 19096 v.reset(OpARMLessThan) 19097 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19098 v0.AddArg(x) 19099 v0.AddArg(y) 19100 v.AddArg(v0) 19101 return true 19102 } 19103 } 19104 func rewriteValueARM_OpLess32F_0(v *Value) bool { 19105 b := v.Block 19106 _ = b 19107 // match: (Less32F x y) 19108 // cond: 19109 // result: (GreaterThan (CMPF y x)) 19110 for { 19111 _ = v.Args[1] 19112 x := v.Args[0] 19113 y := v.Args[1] 19114 v.reset(OpARMGreaterThan) 19115 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 19116 v0.AddArg(y) 19117 v0.AddArg(x) 19118 v.AddArg(v0) 19119 return true 19120 } 19121 } 19122 func rewriteValueARM_OpLess32U_0(v *Value) bool { 19123 b := v.Block 19124 _ = b 19125 // match: (Less32U x y) 19126 // cond: 19127 // result: (LessThanU (CMP x y)) 19128 for { 19129 _ = v.Args[1] 19130 x := v.Args[0] 19131 y := v.Args[1] 19132 v.reset(OpARMLessThanU) 19133 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19134 v0.AddArg(x) 19135 v0.AddArg(y) 19136 v.AddArg(v0) 19137 return true 19138 } 19139 } 19140 func rewriteValueARM_OpLess64F_0(v *Value) bool { 19141 b := v.Block 19142 _ = b 19143 // match: (Less64F x y) 19144 // cond: 19145 // result: (GreaterThan (CMPD y x)) 19146 for { 19147 _ = v.Args[1] 19148 x := v.Args[0] 19149 y := v.Args[1] 19150 v.reset(OpARMGreaterThan) 19151 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 19152 v0.AddArg(y) 19153 v0.AddArg(x) 19154 v.AddArg(v0) 19155 return true 19156 } 19157 } 19158 func rewriteValueARM_OpLess8_0(v *Value) bool { 19159 b := v.Block 19160 _ = b 19161 typ := &b.Func.Config.Types 19162 _ = typ 19163 // match: (Less8 x y) 19164 // cond: 19165 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 19166 for { 19167 _ = v.Args[1] 19168 x := v.Args[0] 19169 y := v.Args[1] 19170 v.reset(OpARMLessThan) 19171 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19172 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19173 v1.AddArg(x) 19174 v0.AddArg(v1) 19175 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19176 v2.AddArg(y) 19177 v0.AddArg(v2) 19178 v.AddArg(v0) 19179 return true 19180 } 19181 } 19182 func rewriteValueARM_OpLess8U_0(v *Value) bool { 19183 b := v.Block 19184 _ = b 19185 typ := &b.Func.Config.Types 19186 _ = typ 19187 // match: (Less8U x y) 19188 // cond: 19189 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 19190 for { 19191 _ = v.Args[1] 19192 x := v.Args[0] 19193 y := v.Args[1] 19194 v.reset(OpARMLessThanU) 19195 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19196 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19197 v1.AddArg(x) 19198 v0.AddArg(v1) 19199 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19200 v2.AddArg(y) 19201 v0.AddArg(v2) 19202 v.AddArg(v0) 19203 return true 19204 } 19205 } 19206 func rewriteValueARM_OpLoad_0(v *Value) bool { 19207 // match: (Load <t> ptr mem) 19208 // cond: t.IsBoolean() 19209 // result: (MOVBUload ptr mem) 19210 for { 19211 t := v.Type 19212 _ = v.Args[1] 19213 ptr := v.Args[0] 19214 mem := v.Args[1] 19215 if !(t.IsBoolean()) { 19216 break 19217 } 19218 v.reset(OpARMMOVBUload) 19219 v.AddArg(ptr) 19220 v.AddArg(mem) 19221 return true 19222 } 19223 // match: (Load <t> ptr mem) 19224 // cond: (is8BitInt(t) && isSigned(t)) 19225 // result: (MOVBload ptr mem) 19226 for { 19227 t := v.Type 19228 _ = v.Args[1] 19229 ptr := v.Args[0] 19230 mem := v.Args[1] 19231 if !(is8BitInt(t) && isSigned(t)) { 19232 break 19233 } 19234 v.reset(OpARMMOVBload) 19235 v.AddArg(ptr) 19236 v.AddArg(mem) 19237 return true 19238 } 19239 // match: (Load <t> ptr mem) 19240 // cond: (is8BitInt(t) && !isSigned(t)) 19241 // result: (MOVBUload ptr mem) 19242 for { 19243 t := v.Type 19244 _ = v.Args[1] 19245 ptr := v.Args[0] 19246 mem := v.Args[1] 19247 if !(is8BitInt(t) && !isSigned(t)) { 19248 break 19249 } 19250 v.reset(OpARMMOVBUload) 19251 v.AddArg(ptr) 19252 v.AddArg(mem) 19253 return true 19254 } 19255 // match: (Load <t> ptr mem) 19256 // cond: (is16BitInt(t) && isSigned(t)) 19257 // result: (MOVHload ptr mem) 19258 for { 19259 t := v.Type 19260 _ = v.Args[1] 19261 ptr := v.Args[0] 19262 mem := v.Args[1] 19263 if !(is16BitInt(t) && isSigned(t)) { 19264 break 19265 } 19266 v.reset(OpARMMOVHload) 19267 v.AddArg(ptr) 19268 v.AddArg(mem) 19269 return true 19270 } 19271 // match: (Load <t> ptr mem) 19272 // cond: (is16BitInt(t) && !isSigned(t)) 19273 // result: (MOVHUload ptr mem) 19274 for { 19275 t := v.Type 19276 _ = v.Args[1] 19277 ptr := v.Args[0] 19278 mem := v.Args[1] 19279 if !(is16BitInt(t) && !isSigned(t)) { 19280 break 19281 } 19282 v.reset(OpARMMOVHUload) 19283 v.AddArg(ptr) 19284 v.AddArg(mem) 19285 return true 19286 } 19287 // match: (Load <t> ptr mem) 19288 // cond: (is32BitInt(t) || isPtr(t)) 19289 // result: (MOVWload ptr mem) 19290 for { 19291 t := v.Type 19292 _ = v.Args[1] 19293 ptr := v.Args[0] 19294 mem := v.Args[1] 19295 if !(is32BitInt(t) || isPtr(t)) { 19296 break 19297 } 19298 v.reset(OpARMMOVWload) 19299 v.AddArg(ptr) 19300 v.AddArg(mem) 19301 return true 19302 } 19303 // match: (Load <t> ptr mem) 19304 // cond: is32BitFloat(t) 19305 // result: (MOVFload ptr mem) 19306 for { 19307 t := v.Type 19308 _ = v.Args[1] 19309 ptr := v.Args[0] 19310 mem := v.Args[1] 19311 if !(is32BitFloat(t)) { 19312 break 19313 } 19314 v.reset(OpARMMOVFload) 19315 v.AddArg(ptr) 19316 v.AddArg(mem) 19317 return true 19318 } 19319 // match: (Load <t> ptr mem) 19320 // cond: is64BitFloat(t) 19321 // result: (MOVDload ptr mem) 19322 for { 19323 t := v.Type 19324 _ = v.Args[1] 19325 ptr := v.Args[0] 19326 mem := v.Args[1] 19327 if !(is64BitFloat(t)) { 19328 break 19329 } 19330 v.reset(OpARMMOVDload) 19331 v.AddArg(ptr) 19332 v.AddArg(mem) 19333 return true 19334 } 19335 return false 19336 } 19337 func rewriteValueARM_OpLsh16x16_0(v *Value) bool { 19338 b := v.Block 19339 _ = b 19340 typ := &b.Func.Config.Types 19341 _ = typ 19342 // match: (Lsh16x16 x y) 19343 // cond: 19344 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19345 for { 19346 _ = v.Args[1] 19347 x := v.Args[0] 19348 y := v.Args[1] 19349 v.reset(OpARMCMOVWHSconst) 19350 v.AuxInt = 0 19351 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19352 v0.AddArg(x) 19353 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19354 v1.AddArg(y) 19355 v0.AddArg(v1) 19356 v.AddArg(v0) 19357 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19358 v2.AuxInt = 256 19359 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19360 v3.AddArg(y) 19361 v2.AddArg(v3) 19362 v.AddArg(v2) 19363 return true 19364 } 19365 } 19366 func rewriteValueARM_OpLsh16x32_0(v *Value) bool { 19367 b := v.Block 19368 _ = b 19369 // match: (Lsh16x32 x y) 19370 // cond: 19371 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19372 for { 19373 _ = v.Args[1] 19374 x := v.Args[0] 19375 y := v.Args[1] 19376 v.reset(OpARMCMOVWHSconst) 19377 v.AuxInt = 0 19378 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19379 v0.AddArg(x) 19380 v0.AddArg(y) 19381 v.AddArg(v0) 19382 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19383 v1.AuxInt = 256 19384 v1.AddArg(y) 19385 v.AddArg(v1) 19386 return true 19387 } 19388 } 19389 func rewriteValueARM_OpLsh16x64_0(v *Value) bool { 19390 // match: (Lsh16x64 x (Const64 [c])) 19391 // cond: uint64(c) < 16 19392 // result: (SLLconst x [c]) 19393 for { 19394 _ = v.Args[1] 19395 x := v.Args[0] 19396 v_1 := v.Args[1] 19397 if v_1.Op != OpConst64 { 19398 break 19399 } 19400 c := v_1.AuxInt 19401 if !(uint64(c) < 16) { 19402 break 19403 } 19404 v.reset(OpARMSLLconst) 19405 v.AuxInt = c 19406 v.AddArg(x) 19407 return true 19408 } 19409 // match: (Lsh16x64 _ (Const64 [c])) 19410 // cond: uint64(c) >= 16 19411 // result: (Const16 [0]) 19412 for { 19413 _ = v.Args[1] 19414 v_1 := v.Args[1] 19415 if v_1.Op != OpConst64 { 19416 break 19417 } 19418 c := v_1.AuxInt 19419 if !(uint64(c) >= 16) { 19420 break 19421 } 19422 v.reset(OpConst16) 19423 v.AuxInt = 0 19424 return true 19425 } 19426 return false 19427 } 19428 func rewriteValueARM_OpLsh16x8_0(v *Value) bool { 19429 b := v.Block 19430 _ = b 19431 typ := &b.Func.Config.Types 19432 _ = typ 19433 // match: (Lsh16x8 x y) 19434 // cond: 19435 // result: (SLL x (ZeroExt8to32 y)) 19436 for { 19437 _ = v.Args[1] 19438 x := v.Args[0] 19439 y := v.Args[1] 19440 v.reset(OpARMSLL) 19441 v.AddArg(x) 19442 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19443 v0.AddArg(y) 19444 v.AddArg(v0) 19445 return true 19446 } 19447 } 19448 func rewriteValueARM_OpLsh32x16_0(v *Value) bool { 19449 b := v.Block 19450 _ = b 19451 typ := &b.Func.Config.Types 19452 _ = typ 19453 // match: (Lsh32x16 x y) 19454 // cond: 19455 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19456 for { 19457 _ = v.Args[1] 19458 x := v.Args[0] 19459 y := v.Args[1] 19460 v.reset(OpARMCMOVWHSconst) 19461 v.AuxInt = 0 19462 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19463 v0.AddArg(x) 19464 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19465 v1.AddArg(y) 19466 v0.AddArg(v1) 19467 v.AddArg(v0) 19468 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19469 v2.AuxInt = 256 19470 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19471 v3.AddArg(y) 19472 v2.AddArg(v3) 19473 v.AddArg(v2) 19474 return true 19475 } 19476 } 19477 func rewriteValueARM_OpLsh32x32_0(v *Value) bool { 19478 b := v.Block 19479 _ = b 19480 // match: (Lsh32x32 x y) 19481 // cond: 19482 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19483 for { 19484 _ = v.Args[1] 19485 x := v.Args[0] 19486 y := v.Args[1] 19487 v.reset(OpARMCMOVWHSconst) 19488 v.AuxInt = 0 19489 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19490 v0.AddArg(x) 19491 v0.AddArg(y) 19492 v.AddArg(v0) 19493 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19494 v1.AuxInt = 256 19495 v1.AddArg(y) 19496 v.AddArg(v1) 19497 return true 19498 } 19499 } 19500 func rewriteValueARM_OpLsh32x64_0(v *Value) bool { 19501 // match: (Lsh32x64 x (Const64 [c])) 19502 // cond: uint64(c) < 32 19503 // result: (SLLconst x [c]) 19504 for { 19505 _ = v.Args[1] 19506 x := v.Args[0] 19507 v_1 := v.Args[1] 19508 if v_1.Op != OpConst64 { 19509 break 19510 } 19511 c := v_1.AuxInt 19512 if !(uint64(c) < 32) { 19513 break 19514 } 19515 v.reset(OpARMSLLconst) 19516 v.AuxInt = c 19517 v.AddArg(x) 19518 return true 19519 } 19520 // match: (Lsh32x64 _ (Const64 [c])) 19521 // cond: uint64(c) >= 32 19522 // result: (Const32 [0]) 19523 for { 19524 _ = v.Args[1] 19525 v_1 := v.Args[1] 19526 if v_1.Op != OpConst64 { 19527 break 19528 } 19529 c := v_1.AuxInt 19530 if !(uint64(c) >= 32) { 19531 break 19532 } 19533 v.reset(OpConst32) 19534 v.AuxInt = 0 19535 return true 19536 } 19537 return false 19538 } 19539 func rewriteValueARM_OpLsh32x8_0(v *Value) bool { 19540 b := v.Block 19541 _ = b 19542 typ := &b.Func.Config.Types 19543 _ = typ 19544 // match: (Lsh32x8 x y) 19545 // cond: 19546 // result: (SLL x (ZeroExt8to32 y)) 19547 for { 19548 _ = v.Args[1] 19549 x := v.Args[0] 19550 y := v.Args[1] 19551 v.reset(OpARMSLL) 19552 v.AddArg(x) 19553 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19554 v0.AddArg(y) 19555 v.AddArg(v0) 19556 return true 19557 } 19558 } 19559 func rewriteValueARM_OpLsh8x16_0(v *Value) bool { 19560 b := v.Block 19561 _ = b 19562 typ := &b.Func.Config.Types 19563 _ = typ 19564 // match: (Lsh8x16 x y) 19565 // cond: 19566 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19567 for { 19568 _ = v.Args[1] 19569 x := v.Args[0] 19570 y := v.Args[1] 19571 v.reset(OpARMCMOVWHSconst) 19572 v.AuxInt = 0 19573 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19574 v0.AddArg(x) 19575 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19576 v1.AddArg(y) 19577 v0.AddArg(v1) 19578 v.AddArg(v0) 19579 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19580 v2.AuxInt = 256 19581 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19582 v3.AddArg(y) 19583 v2.AddArg(v3) 19584 v.AddArg(v2) 19585 return true 19586 } 19587 } 19588 func rewriteValueARM_OpLsh8x32_0(v *Value) bool { 19589 b := v.Block 19590 _ = b 19591 // match: (Lsh8x32 x y) 19592 // cond: 19593 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19594 for { 19595 _ = v.Args[1] 19596 x := v.Args[0] 19597 y := v.Args[1] 19598 v.reset(OpARMCMOVWHSconst) 19599 v.AuxInt = 0 19600 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19601 v0.AddArg(x) 19602 v0.AddArg(y) 19603 v.AddArg(v0) 19604 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19605 v1.AuxInt = 256 19606 v1.AddArg(y) 19607 v.AddArg(v1) 19608 return true 19609 } 19610 } 19611 func rewriteValueARM_OpLsh8x64_0(v *Value) bool { 19612 // match: (Lsh8x64 x (Const64 [c])) 19613 // cond: uint64(c) < 8 19614 // result: (SLLconst x [c]) 19615 for { 19616 _ = v.Args[1] 19617 x := v.Args[0] 19618 v_1 := v.Args[1] 19619 if v_1.Op != OpConst64 { 19620 break 19621 } 19622 c := v_1.AuxInt 19623 if !(uint64(c) < 8) { 19624 break 19625 } 19626 v.reset(OpARMSLLconst) 19627 v.AuxInt = c 19628 v.AddArg(x) 19629 return true 19630 } 19631 // match: (Lsh8x64 _ (Const64 [c])) 19632 // cond: uint64(c) >= 8 19633 // result: (Const8 [0]) 19634 for { 19635 _ = v.Args[1] 19636 v_1 := v.Args[1] 19637 if v_1.Op != OpConst64 { 19638 break 19639 } 19640 c := v_1.AuxInt 19641 if !(uint64(c) >= 8) { 19642 break 19643 } 19644 v.reset(OpConst8) 19645 v.AuxInt = 0 19646 return true 19647 } 19648 return false 19649 } 19650 func rewriteValueARM_OpLsh8x8_0(v *Value) bool { 19651 b := v.Block 19652 _ = b 19653 typ := &b.Func.Config.Types 19654 _ = typ 19655 // match: (Lsh8x8 x y) 19656 // cond: 19657 // result: (SLL x (ZeroExt8to32 y)) 19658 for { 19659 _ = v.Args[1] 19660 x := v.Args[0] 19661 y := v.Args[1] 19662 v.reset(OpARMSLL) 19663 v.AddArg(x) 19664 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19665 v0.AddArg(y) 19666 v.AddArg(v0) 19667 return true 19668 } 19669 } 19670 func rewriteValueARM_OpMod16_0(v *Value) bool { 19671 b := v.Block 19672 _ = b 19673 typ := &b.Func.Config.Types 19674 _ = typ 19675 // match: (Mod16 x y) 19676 // cond: 19677 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 19678 for { 19679 _ = v.Args[1] 19680 x := v.Args[0] 19681 y := v.Args[1] 19682 v.reset(OpMod32) 19683 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19684 v0.AddArg(x) 19685 v.AddArg(v0) 19686 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19687 v1.AddArg(y) 19688 v.AddArg(v1) 19689 return true 19690 } 19691 } 19692 func rewriteValueARM_OpMod16u_0(v *Value) bool { 19693 b := v.Block 19694 _ = b 19695 typ := &b.Func.Config.Types 19696 _ = typ 19697 // match: (Mod16u x y) 19698 // cond: 19699 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 19700 for { 19701 _ = v.Args[1] 19702 x := v.Args[0] 19703 y := v.Args[1] 19704 v.reset(OpMod32u) 19705 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19706 v0.AddArg(x) 19707 v.AddArg(v0) 19708 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19709 v1.AddArg(y) 19710 v.AddArg(v1) 19711 return true 19712 } 19713 } 19714 func rewriteValueARM_OpMod32_0(v *Value) bool { 19715 b := v.Block 19716 _ = b 19717 typ := &b.Func.Config.Types 19718 _ = typ 19719 // match: (Mod32 x y) 19720 // cond: 19721 // 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)) 19722 for { 19723 _ = v.Args[1] 19724 x := v.Args[0] 19725 y := v.Args[1] 19726 v.reset(OpARMSUB) 19727 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19728 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) 19729 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 19730 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 19731 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19732 v4.AddArg(x) 19733 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19734 v5.AddArg(x) 19735 v4.AddArg(v5) 19736 v3.AddArg(v4) 19737 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19738 v6.AddArg(x) 19739 v3.AddArg(v6) 19740 v2.AddArg(v3) 19741 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 19742 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19743 v8.AddArg(y) 19744 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19745 v9.AddArg(y) 19746 v8.AddArg(v9) 19747 v7.AddArg(v8) 19748 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19749 v10.AddArg(y) 19750 v7.AddArg(v10) 19751 v2.AddArg(v7) 19752 v1.AddArg(v2) 19753 v0.AddArg(v1) 19754 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19755 v11.AddArg(x) 19756 v0.AddArg(v11) 19757 v.AddArg(v0) 19758 v12 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19759 v12.AddArg(x) 19760 v.AddArg(v12) 19761 return true 19762 } 19763 } 19764 func rewriteValueARM_OpMod32u_0(v *Value) bool { 19765 b := v.Block 19766 _ = b 19767 typ := &b.Func.Config.Types 19768 _ = typ 19769 // match: (Mod32u x y) 19770 // cond: 19771 // result: (Select1 <typ.UInt32> (CALLudiv x y)) 19772 for { 19773 _ = v.Args[1] 19774 x := v.Args[0] 19775 y := v.Args[1] 19776 v.reset(OpSelect1) 19777 v.Type = typ.UInt32 19778 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 19779 v0.AddArg(x) 19780 v0.AddArg(y) 19781 v.AddArg(v0) 19782 return true 19783 } 19784 } 19785 func rewriteValueARM_OpMod8_0(v *Value) bool { 19786 b := v.Block 19787 _ = b 19788 typ := &b.Func.Config.Types 19789 _ = typ 19790 // match: (Mod8 x y) 19791 // cond: 19792 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 19793 for { 19794 _ = v.Args[1] 19795 x := v.Args[0] 19796 y := v.Args[1] 19797 v.reset(OpMod32) 19798 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19799 v0.AddArg(x) 19800 v.AddArg(v0) 19801 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19802 v1.AddArg(y) 19803 v.AddArg(v1) 19804 return true 19805 } 19806 } 19807 func rewriteValueARM_OpMod8u_0(v *Value) bool { 19808 b := v.Block 19809 _ = b 19810 typ := &b.Func.Config.Types 19811 _ = typ 19812 // match: (Mod8u x y) 19813 // cond: 19814 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 19815 for { 19816 _ = v.Args[1] 19817 x := v.Args[0] 19818 y := v.Args[1] 19819 v.reset(OpMod32u) 19820 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19821 v0.AddArg(x) 19822 v.AddArg(v0) 19823 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19824 v1.AddArg(y) 19825 v.AddArg(v1) 19826 return true 19827 } 19828 } 19829 func rewriteValueARM_OpMove_0(v *Value) bool { 19830 b := v.Block 19831 _ = b 19832 config := b.Func.Config 19833 _ = config 19834 typ := &b.Func.Config.Types 19835 _ = typ 19836 // match: (Move [0] _ _ mem) 19837 // cond: 19838 // result: mem 19839 for { 19840 if v.AuxInt != 0 { 19841 break 19842 } 19843 _ = v.Args[2] 19844 mem := v.Args[2] 19845 v.reset(OpCopy) 19846 v.Type = mem.Type 19847 v.AddArg(mem) 19848 return true 19849 } 19850 // match: (Move [1] dst src mem) 19851 // cond: 19852 // result: (MOVBstore dst (MOVBUload src mem) mem) 19853 for { 19854 if v.AuxInt != 1 { 19855 break 19856 } 19857 _ = v.Args[2] 19858 dst := v.Args[0] 19859 src := v.Args[1] 19860 mem := v.Args[2] 19861 v.reset(OpARMMOVBstore) 19862 v.AddArg(dst) 19863 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 19864 v0.AddArg(src) 19865 v0.AddArg(mem) 19866 v.AddArg(v0) 19867 v.AddArg(mem) 19868 return true 19869 } 19870 // match: (Move [2] {t} dst src mem) 19871 // cond: t.(*types.Type).Alignment()%2 == 0 19872 // result: (MOVHstore dst (MOVHUload src mem) mem) 19873 for { 19874 if v.AuxInt != 2 { 19875 break 19876 } 19877 t := v.Aux 19878 _ = v.Args[2] 19879 dst := v.Args[0] 19880 src := v.Args[1] 19881 mem := v.Args[2] 19882 if !(t.(*types.Type).Alignment()%2 == 0) { 19883 break 19884 } 19885 v.reset(OpARMMOVHstore) 19886 v.AddArg(dst) 19887 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 19888 v0.AddArg(src) 19889 v0.AddArg(mem) 19890 v.AddArg(v0) 19891 v.AddArg(mem) 19892 return true 19893 } 19894 // match: (Move [2] dst src mem) 19895 // cond: 19896 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 19897 for { 19898 if v.AuxInt != 2 { 19899 break 19900 } 19901 _ = v.Args[2] 19902 dst := v.Args[0] 19903 src := v.Args[1] 19904 mem := v.Args[2] 19905 v.reset(OpARMMOVBstore) 19906 v.AuxInt = 1 19907 v.AddArg(dst) 19908 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 19909 v0.AuxInt = 1 19910 v0.AddArg(src) 19911 v0.AddArg(mem) 19912 v.AddArg(v0) 19913 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 19914 v1.AddArg(dst) 19915 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 19916 v2.AddArg(src) 19917 v2.AddArg(mem) 19918 v1.AddArg(v2) 19919 v1.AddArg(mem) 19920 v.AddArg(v1) 19921 return true 19922 } 19923 // match: (Move [4] {t} dst src mem) 19924 // cond: t.(*types.Type).Alignment()%4 == 0 19925 // result: (MOVWstore dst (MOVWload src mem) mem) 19926 for { 19927 if v.AuxInt != 4 { 19928 break 19929 } 19930 t := v.Aux 19931 _ = v.Args[2] 19932 dst := v.Args[0] 19933 src := v.Args[1] 19934 mem := v.Args[2] 19935 if !(t.(*types.Type).Alignment()%4 == 0) { 19936 break 19937 } 19938 v.reset(OpARMMOVWstore) 19939 v.AddArg(dst) 19940 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32) 19941 v0.AddArg(src) 19942 v0.AddArg(mem) 19943 v.AddArg(v0) 19944 v.AddArg(mem) 19945 return true 19946 } 19947 // match: (Move [4] {t} dst src mem) 19948 // cond: t.(*types.Type).Alignment()%2 == 0 19949 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 19950 for { 19951 if v.AuxInt != 4 { 19952 break 19953 } 19954 t := v.Aux 19955 _ = v.Args[2] 19956 dst := v.Args[0] 19957 src := v.Args[1] 19958 mem := v.Args[2] 19959 if !(t.(*types.Type).Alignment()%2 == 0) { 19960 break 19961 } 19962 v.reset(OpARMMOVHstore) 19963 v.AuxInt = 2 19964 v.AddArg(dst) 19965 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 19966 v0.AuxInt = 2 19967 v0.AddArg(src) 19968 v0.AddArg(mem) 19969 v.AddArg(v0) 19970 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 19971 v1.AddArg(dst) 19972 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 19973 v2.AddArg(src) 19974 v2.AddArg(mem) 19975 v1.AddArg(v2) 19976 v1.AddArg(mem) 19977 v.AddArg(v1) 19978 return true 19979 } 19980 // match: (Move [4] dst src mem) 19981 // cond: 19982 // 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)))) 19983 for { 19984 if v.AuxInt != 4 { 19985 break 19986 } 19987 _ = v.Args[2] 19988 dst := v.Args[0] 19989 src := v.Args[1] 19990 mem := v.Args[2] 19991 v.reset(OpARMMOVBstore) 19992 v.AuxInt = 3 19993 v.AddArg(dst) 19994 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 19995 v0.AuxInt = 3 19996 v0.AddArg(src) 19997 v0.AddArg(mem) 19998 v.AddArg(v0) 19999 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20000 v1.AuxInt = 2 20001 v1.AddArg(dst) 20002 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20003 v2.AuxInt = 2 20004 v2.AddArg(src) 20005 v2.AddArg(mem) 20006 v1.AddArg(v2) 20007 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20008 v3.AuxInt = 1 20009 v3.AddArg(dst) 20010 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20011 v4.AuxInt = 1 20012 v4.AddArg(src) 20013 v4.AddArg(mem) 20014 v3.AddArg(v4) 20015 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20016 v5.AddArg(dst) 20017 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20018 v6.AddArg(src) 20019 v6.AddArg(mem) 20020 v5.AddArg(v6) 20021 v5.AddArg(mem) 20022 v3.AddArg(v5) 20023 v1.AddArg(v3) 20024 v.AddArg(v1) 20025 return true 20026 } 20027 // match: (Move [3] dst src mem) 20028 // cond: 20029 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 20030 for { 20031 if v.AuxInt != 3 { 20032 break 20033 } 20034 _ = v.Args[2] 20035 dst := v.Args[0] 20036 src := v.Args[1] 20037 mem := v.Args[2] 20038 v.reset(OpARMMOVBstore) 20039 v.AuxInt = 2 20040 v.AddArg(dst) 20041 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20042 v0.AuxInt = 2 20043 v0.AddArg(src) 20044 v0.AddArg(mem) 20045 v.AddArg(v0) 20046 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20047 v1.AuxInt = 1 20048 v1.AddArg(dst) 20049 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20050 v2.AuxInt = 1 20051 v2.AddArg(src) 20052 v2.AddArg(mem) 20053 v1.AddArg(v2) 20054 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20055 v3.AddArg(dst) 20056 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20057 v4.AddArg(src) 20058 v4.AddArg(mem) 20059 v3.AddArg(v4) 20060 v3.AddArg(mem) 20061 v1.AddArg(v3) 20062 v.AddArg(v1) 20063 return true 20064 } 20065 // match: (Move [s] {t} dst src mem) 20066 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 20067 // result: (DUFFCOPY [8 * (128 - int64(s/4))] dst src mem) 20068 for { 20069 s := v.AuxInt 20070 t := v.Aux 20071 _ = v.Args[2] 20072 dst := v.Args[0] 20073 src := v.Args[1] 20074 mem := v.Args[2] 20075 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 20076 break 20077 } 20078 v.reset(OpARMDUFFCOPY) 20079 v.AuxInt = 8 * (128 - int64(s/4)) 20080 v.AddArg(dst) 20081 v.AddArg(src) 20082 v.AddArg(mem) 20083 return true 20084 } 20085 // match: (Move [s] {t} dst src mem) 20086 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 20087 // result: (LoweredMove [t.(*types.Type).Alignment()] dst src (ADDconst <src.Type> src [s-moveSize(t.(*types.Type).Alignment(), config)]) mem) 20088 for { 20089 s := v.AuxInt 20090 t := v.Aux 20091 _ = v.Args[2] 20092 dst := v.Args[0] 20093 src := v.Args[1] 20094 mem := v.Args[2] 20095 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 20096 break 20097 } 20098 v.reset(OpARMLoweredMove) 20099 v.AuxInt = t.(*types.Type).Alignment() 20100 v.AddArg(dst) 20101 v.AddArg(src) 20102 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 20103 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 20104 v0.AddArg(src) 20105 v.AddArg(v0) 20106 v.AddArg(mem) 20107 return true 20108 } 20109 return false 20110 } 20111 func rewriteValueARM_OpMul16_0(v *Value) bool { 20112 // match: (Mul16 x y) 20113 // cond: 20114 // result: (MUL x y) 20115 for { 20116 _ = v.Args[1] 20117 x := v.Args[0] 20118 y := v.Args[1] 20119 v.reset(OpARMMUL) 20120 v.AddArg(x) 20121 v.AddArg(y) 20122 return true 20123 } 20124 } 20125 func rewriteValueARM_OpMul32_0(v *Value) bool { 20126 // match: (Mul32 x y) 20127 // cond: 20128 // result: (MUL x y) 20129 for { 20130 _ = v.Args[1] 20131 x := v.Args[0] 20132 y := v.Args[1] 20133 v.reset(OpARMMUL) 20134 v.AddArg(x) 20135 v.AddArg(y) 20136 return true 20137 } 20138 } 20139 func rewriteValueARM_OpMul32F_0(v *Value) bool { 20140 // match: (Mul32F x y) 20141 // cond: 20142 // result: (MULF x y) 20143 for { 20144 _ = v.Args[1] 20145 x := v.Args[0] 20146 y := v.Args[1] 20147 v.reset(OpARMMULF) 20148 v.AddArg(x) 20149 v.AddArg(y) 20150 return true 20151 } 20152 } 20153 func rewriteValueARM_OpMul32uhilo_0(v *Value) bool { 20154 // match: (Mul32uhilo x y) 20155 // cond: 20156 // result: (MULLU x y) 20157 for { 20158 _ = v.Args[1] 20159 x := v.Args[0] 20160 y := v.Args[1] 20161 v.reset(OpARMMULLU) 20162 v.AddArg(x) 20163 v.AddArg(y) 20164 return true 20165 } 20166 } 20167 func rewriteValueARM_OpMul64F_0(v *Value) bool { 20168 // match: (Mul64F x y) 20169 // cond: 20170 // result: (MULD x y) 20171 for { 20172 _ = v.Args[1] 20173 x := v.Args[0] 20174 y := v.Args[1] 20175 v.reset(OpARMMULD) 20176 v.AddArg(x) 20177 v.AddArg(y) 20178 return true 20179 } 20180 } 20181 func rewriteValueARM_OpMul8_0(v *Value) bool { 20182 // match: (Mul8 x y) 20183 // cond: 20184 // result: (MUL x y) 20185 for { 20186 _ = v.Args[1] 20187 x := v.Args[0] 20188 y := v.Args[1] 20189 v.reset(OpARMMUL) 20190 v.AddArg(x) 20191 v.AddArg(y) 20192 return true 20193 } 20194 } 20195 func rewriteValueARM_OpNeg16_0(v *Value) bool { 20196 // match: (Neg16 x) 20197 // cond: 20198 // result: (RSBconst [0] x) 20199 for { 20200 x := v.Args[0] 20201 v.reset(OpARMRSBconst) 20202 v.AuxInt = 0 20203 v.AddArg(x) 20204 return true 20205 } 20206 } 20207 func rewriteValueARM_OpNeg32_0(v *Value) bool { 20208 // match: (Neg32 x) 20209 // cond: 20210 // result: (RSBconst [0] x) 20211 for { 20212 x := v.Args[0] 20213 v.reset(OpARMRSBconst) 20214 v.AuxInt = 0 20215 v.AddArg(x) 20216 return true 20217 } 20218 } 20219 func rewriteValueARM_OpNeg32F_0(v *Value) bool { 20220 // match: (Neg32F x) 20221 // cond: 20222 // result: (NEGF x) 20223 for { 20224 x := v.Args[0] 20225 v.reset(OpARMNEGF) 20226 v.AddArg(x) 20227 return true 20228 } 20229 } 20230 func rewriteValueARM_OpNeg64F_0(v *Value) bool { 20231 // match: (Neg64F x) 20232 // cond: 20233 // result: (NEGD x) 20234 for { 20235 x := v.Args[0] 20236 v.reset(OpARMNEGD) 20237 v.AddArg(x) 20238 return true 20239 } 20240 } 20241 func rewriteValueARM_OpNeg8_0(v *Value) bool { 20242 // match: (Neg8 x) 20243 // cond: 20244 // result: (RSBconst [0] x) 20245 for { 20246 x := v.Args[0] 20247 v.reset(OpARMRSBconst) 20248 v.AuxInt = 0 20249 v.AddArg(x) 20250 return true 20251 } 20252 } 20253 func rewriteValueARM_OpNeq16_0(v *Value) bool { 20254 b := v.Block 20255 _ = b 20256 typ := &b.Func.Config.Types 20257 _ = typ 20258 // match: (Neq16 x y) 20259 // cond: 20260 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 20261 for { 20262 _ = v.Args[1] 20263 x := v.Args[0] 20264 y := v.Args[1] 20265 v.reset(OpARMNotEqual) 20266 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20267 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20268 v1.AddArg(x) 20269 v0.AddArg(v1) 20270 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20271 v2.AddArg(y) 20272 v0.AddArg(v2) 20273 v.AddArg(v0) 20274 return true 20275 } 20276 } 20277 func rewriteValueARM_OpNeq32_0(v *Value) bool { 20278 b := v.Block 20279 _ = b 20280 // match: (Neq32 x y) 20281 // cond: 20282 // result: (NotEqual (CMP x y)) 20283 for { 20284 _ = v.Args[1] 20285 x := v.Args[0] 20286 y := v.Args[1] 20287 v.reset(OpARMNotEqual) 20288 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20289 v0.AddArg(x) 20290 v0.AddArg(y) 20291 v.AddArg(v0) 20292 return true 20293 } 20294 } 20295 func rewriteValueARM_OpNeq32F_0(v *Value) bool { 20296 b := v.Block 20297 _ = b 20298 // match: (Neq32F x y) 20299 // cond: 20300 // result: (NotEqual (CMPF x y)) 20301 for { 20302 _ = v.Args[1] 20303 x := v.Args[0] 20304 y := v.Args[1] 20305 v.reset(OpARMNotEqual) 20306 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 20307 v0.AddArg(x) 20308 v0.AddArg(y) 20309 v.AddArg(v0) 20310 return true 20311 } 20312 } 20313 func rewriteValueARM_OpNeq64F_0(v *Value) bool { 20314 b := v.Block 20315 _ = b 20316 // match: (Neq64F x y) 20317 // cond: 20318 // result: (NotEqual (CMPD x y)) 20319 for { 20320 _ = v.Args[1] 20321 x := v.Args[0] 20322 y := v.Args[1] 20323 v.reset(OpARMNotEqual) 20324 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 20325 v0.AddArg(x) 20326 v0.AddArg(y) 20327 v.AddArg(v0) 20328 return true 20329 } 20330 } 20331 func rewriteValueARM_OpNeq8_0(v *Value) bool { 20332 b := v.Block 20333 _ = b 20334 typ := &b.Func.Config.Types 20335 _ = typ 20336 // match: (Neq8 x y) 20337 // cond: 20338 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 20339 for { 20340 _ = v.Args[1] 20341 x := v.Args[0] 20342 y := v.Args[1] 20343 v.reset(OpARMNotEqual) 20344 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20345 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20346 v1.AddArg(x) 20347 v0.AddArg(v1) 20348 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20349 v2.AddArg(y) 20350 v0.AddArg(v2) 20351 v.AddArg(v0) 20352 return true 20353 } 20354 } 20355 func rewriteValueARM_OpNeqB_0(v *Value) bool { 20356 // match: (NeqB x y) 20357 // cond: 20358 // result: (XOR x y) 20359 for { 20360 _ = v.Args[1] 20361 x := v.Args[0] 20362 y := v.Args[1] 20363 v.reset(OpARMXOR) 20364 v.AddArg(x) 20365 v.AddArg(y) 20366 return true 20367 } 20368 } 20369 func rewriteValueARM_OpNeqPtr_0(v *Value) bool { 20370 b := v.Block 20371 _ = b 20372 // match: (NeqPtr x y) 20373 // cond: 20374 // result: (NotEqual (CMP x y)) 20375 for { 20376 _ = v.Args[1] 20377 x := v.Args[0] 20378 y := v.Args[1] 20379 v.reset(OpARMNotEqual) 20380 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20381 v0.AddArg(x) 20382 v0.AddArg(y) 20383 v.AddArg(v0) 20384 return true 20385 } 20386 } 20387 func rewriteValueARM_OpNilCheck_0(v *Value) bool { 20388 // match: (NilCheck ptr mem) 20389 // cond: 20390 // result: (LoweredNilCheck ptr mem) 20391 for { 20392 _ = v.Args[1] 20393 ptr := v.Args[0] 20394 mem := v.Args[1] 20395 v.reset(OpARMLoweredNilCheck) 20396 v.AddArg(ptr) 20397 v.AddArg(mem) 20398 return true 20399 } 20400 } 20401 func rewriteValueARM_OpNot_0(v *Value) bool { 20402 // match: (Not x) 20403 // cond: 20404 // result: (XORconst [1] x) 20405 for { 20406 x := v.Args[0] 20407 v.reset(OpARMXORconst) 20408 v.AuxInt = 1 20409 v.AddArg(x) 20410 return true 20411 } 20412 } 20413 func rewriteValueARM_OpOffPtr_0(v *Value) bool { 20414 // match: (OffPtr [off] ptr:(SP)) 20415 // cond: 20416 // result: (MOVWaddr [off] ptr) 20417 for { 20418 off := v.AuxInt 20419 ptr := v.Args[0] 20420 if ptr.Op != OpSP { 20421 break 20422 } 20423 v.reset(OpARMMOVWaddr) 20424 v.AuxInt = off 20425 v.AddArg(ptr) 20426 return true 20427 } 20428 // match: (OffPtr [off] ptr) 20429 // cond: 20430 // result: (ADDconst [off] ptr) 20431 for { 20432 off := v.AuxInt 20433 ptr := v.Args[0] 20434 v.reset(OpARMADDconst) 20435 v.AuxInt = off 20436 v.AddArg(ptr) 20437 return true 20438 } 20439 } 20440 func rewriteValueARM_OpOr16_0(v *Value) bool { 20441 // match: (Or16 x y) 20442 // cond: 20443 // result: (OR x y) 20444 for { 20445 _ = v.Args[1] 20446 x := v.Args[0] 20447 y := v.Args[1] 20448 v.reset(OpARMOR) 20449 v.AddArg(x) 20450 v.AddArg(y) 20451 return true 20452 } 20453 } 20454 func rewriteValueARM_OpOr32_0(v *Value) bool { 20455 // match: (Or32 x y) 20456 // cond: 20457 // result: (OR x y) 20458 for { 20459 _ = v.Args[1] 20460 x := v.Args[0] 20461 y := v.Args[1] 20462 v.reset(OpARMOR) 20463 v.AddArg(x) 20464 v.AddArg(y) 20465 return true 20466 } 20467 } 20468 func rewriteValueARM_OpOr8_0(v *Value) bool { 20469 // match: (Or8 x y) 20470 // cond: 20471 // result: (OR x y) 20472 for { 20473 _ = v.Args[1] 20474 x := v.Args[0] 20475 y := v.Args[1] 20476 v.reset(OpARMOR) 20477 v.AddArg(x) 20478 v.AddArg(y) 20479 return true 20480 } 20481 } 20482 func rewriteValueARM_OpOrB_0(v *Value) bool { 20483 // match: (OrB x y) 20484 // cond: 20485 // result: (OR x y) 20486 for { 20487 _ = v.Args[1] 20488 x := v.Args[0] 20489 y := v.Args[1] 20490 v.reset(OpARMOR) 20491 v.AddArg(x) 20492 v.AddArg(y) 20493 return true 20494 } 20495 } 20496 func rewriteValueARM_OpRound32F_0(v *Value) bool { 20497 // match: (Round32F x) 20498 // cond: 20499 // result: x 20500 for { 20501 x := v.Args[0] 20502 v.reset(OpCopy) 20503 v.Type = x.Type 20504 v.AddArg(x) 20505 return true 20506 } 20507 } 20508 func rewriteValueARM_OpRound64F_0(v *Value) bool { 20509 // match: (Round64F x) 20510 // cond: 20511 // result: x 20512 for { 20513 x := v.Args[0] 20514 v.reset(OpCopy) 20515 v.Type = x.Type 20516 v.AddArg(x) 20517 return true 20518 } 20519 } 20520 func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { 20521 b := v.Block 20522 _ = b 20523 typ := &b.Func.Config.Types 20524 _ = typ 20525 // match: (Rsh16Ux16 x y) 20526 // cond: 20527 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 20528 for { 20529 _ = v.Args[1] 20530 x := v.Args[0] 20531 y := v.Args[1] 20532 v.reset(OpARMCMOVWHSconst) 20533 v.AuxInt = 0 20534 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20535 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20536 v1.AddArg(x) 20537 v0.AddArg(v1) 20538 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20539 v2.AddArg(y) 20540 v0.AddArg(v2) 20541 v.AddArg(v0) 20542 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20543 v3.AuxInt = 256 20544 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20545 v4.AddArg(y) 20546 v3.AddArg(v4) 20547 v.AddArg(v3) 20548 return true 20549 } 20550 } 20551 func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { 20552 b := v.Block 20553 _ = b 20554 typ := &b.Func.Config.Types 20555 _ = typ 20556 // match: (Rsh16Ux32 x y) 20557 // cond: 20558 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 20559 for { 20560 _ = v.Args[1] 20561 x := v.Args[0] 20562 y := v.Args[1] 20563 v.reset(OpARMCMOVWHSconst) 20564 v.AuxInt = 0 20565 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20566 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20567 v1.AddArg(x) 20568 v0.AddArg(v1) 20569 v0.AddArg(y) 20570 v.AddArg(v0) 20571 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20572 v2.AuxInt = 256 20573 v2.AddArg(y) 20574 v.AddArg(v2) 20575 return true 20576 } 20577 } 20578 func rewriteValueARM_OpRsh16Ux64_0(v *Value) bool { 20579 b := v.Block 20580 _ = b 20581 typ := &b.Func.Config.Types 20582 _ = typ 20583 // match: (Rsh16Ux64 x (Const64 [c])) 20584 // cond: uint64(c) < 16 20585 // result: (SRLconst (SLLconst <typ.UInt32> x [16]) [c+16]) 20586 for { 20587 _ = v.Args[1] 20588 x := v.Args[0] 20589 v_1 := v.Args[1] 20590 if v_1.Op != OpConst64 { 20591 break 20592 } 20593 c := v_1.AuxInt 20594 if !(uint64(c) < 16) { 20595 break 20596 } 20597 v.reset(OpARMSRLconst) 20598 v.AuxInt = c + 16 20599 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20600 v0.AuxInt = 16 20601 v0.AddArg(x) 20602 v.AddArg(v0) 20603 return true 20604 } 20605 // match: (Rsh16Ux64 _ (Const64 [c])) 20606 // cond: uint64(c) >= 16 20607 // result: (Const16 [0]) 20608 for { 20609 _ = v.Args[1] 20610 v_1 := v.Args[1] 20611 if v_1.Op != OpConst64 { 20612 break 20613 } 20614 c := v_1.AuxInt 20615 if !(uint64(c) >= 16) { 20616 break 20617 } 20618 v.reset(OpConst16) 20619 v.AuxInt = 0 20620 return true 20621 } 20622 return false 20623 } 20624 func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { 20625 b := v.Block 20626 _ = b 20627 typ := &b.Func.Config.Types 20628 _ = typ 20629 // match: (Rsh16Ux8 x y) 20630 // cond: 20631 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 20632 for { 20633 _ = v.Args[1] 20634 x := v.Args[0] 20635 y := v.Args[1] 20636 v.reset(OpARMSRL) 20637 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20638 v0.AddArg(x) 20639 v.AddArg(v0) 20640 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20641 v1.AddArg(y) 20642 v.AddArg(v1) 20643 return true 20644 } 20645 } 20646 func rewriteValueARM_OpRsh16x16_0(v *Value) bool { 20647 b := v.Block 20648 _ = b 20649 typ := &b.Func.Config.Types 20650 _ = typ 20651 // match: (Rsh16x16 x y) 20652 // cond: 20653 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 20654 for { 20655 _ = v.Args[1] 20656 x := v.Args[0] 20657 y := v.Args[1] 20658 v.reset(OpARMSRAcond) 20659 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20660 v0.AddArg(x) 20661 v.AddArg(v0) 20662 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20663 v1.AddArg(y) 20664 v.AddArg(v1) 20665 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20666 v2.AuxInt = 256 20667 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20668 v3.AddArg(y) 20669 v2.AddArg(v3) 20670 v.AddArg(v2) 20671 return true 20672 } 20673 } 20674 func rewriteValueARM_OpRsh16x32_0(v *Value) bool { 20675 b := v.Block 20676 _ = b 20677 typ := &b.Func.Config.Types 20678 _ = typ 20679 // match: (Rsh16x32 x y) 20680 // cond: 20681 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 20682 for { 20683 _ = v.Args[1] 20684 x := v.Args[0] 20685 y := v.Args[1] 20686 v.reset(OpARMSRAcond) 20687 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20688 v0.AddArg(x) 20689 v.AddArg(v0) 20690 v.AddArg(y) 20691 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20692 v1.AuxInt = 256 20693 v1.AddArg(y) 20694 v.AddArg(v1) 20695 return true 20696 } 20697 } 20698 func rewriteValueARM_OpRsh16x64_0(v *Value) bool { 20699 b := v.Block 20700 _ = b 20701 typ := &b.Func.Config.Types 20702 _ = typ 20703 // match: (Rsh16x64 x (Const64 [c])) 20704 // cond: uint64(c) < 16 20705 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [c+16]) 20706 for { 20707 _ = v.Args[1] 20708 x := v.Args[0] 20709 v_1 := v.Args[1] 20710 if v_1.Op != OpConst64 { 20711 break 20712 } 20713 c := v_1.AuxInt 20714 if !(uint64(c) < 16) { 20715 break 20716 } 20717 v.reset(OpARMSRAconst) 20718 v.AuxInt = c + 16 20719 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20720 v0.AuxInt = 16 20721 v0.AddArg(x) 20722 v.AddArg(v0) 20723 return true 20724 } 20725 // match: (Rsh16x64 x (Const64 [c])) 20726 // cond: uint64(c) >= 16 20727 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [31]) 20728 for { 20729 _ = v.Args[1] 20730 x := v.Args[0] 20731 v_1 := v.Args[1] 20732 if v_1.Op != OpConst64 { 20733 break 20734 } 20735 c := v_1.AuxInt 20736 if !(uint64(c) >= 16) { 20737 break 20738 } 20739 v.reset(OpARMSRAconst) 20740 v.AuxInt = 31 20741 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20742 v0.AuxInt = 16 20743 v0.AddArg(x) 20744 v.AddArg(v0) 20745 return true 20746 } 20747 return false 20748 } 20749 func rewriteValueARM_OpRsh16x8_0(v *Value) bool { 20750 b := v.Block 20751 _ = b 20752 typ := &b.Func.Config.Types 20753 _ = typ 20754 // match: (Rsh16x8 x y) 20755 // cond: 20756 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 20757 for { 20758 _ = v.Args[1] 20759 x := v.Args[0] 20760 y := v.Args[1] 20761 v.reset(OpARMSRA) 20762 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20763 v0.AddArg(x) 20764 v.AddArg(v0) 20765 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20766 v1.AddArg(y) 20767 v.AddArg(v1) 20768 return true 20769 } 20770 } 20771 func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { 20772 b := v.Block 20773 _ = b 20774 typ := &b.Func.Config.Types 20775 _ = typ 20776 // match: (Rsh32Ux16 x y) 20777 // cond: 20778 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 20779 for { 20780 _ = v.Args[1] 20781 x := v.Args[0] 20782 y := v.Args[1] 20783 v.reset(OpARMCMOVWHSconst) 20784 v.AuxInt = 0 20785 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20786 v0.AddArg(x) 20787 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20788 v1.AddArg(y) 20789 v0.AddArg(v1) 20790 v.AddArg(v0) 20791 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20792 v2.AuxInt = 256 20793 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20794 v3.AddArg(y) 20795 v2.AddArg(v3) 20796 v.AddArg(v2) 20797 return true 20798 } 20799 } 20800 func rewriteValueARM_OpRsh32Ux32_0(v *Value) bool { 20801 b := v.Block 20802 _ = b 20803 // match: (Rsh32Ux32 x y) 20804 // cond: 20805 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 20806 for { 20807 _ = v.Args[1] 20808 x := v.Args[0] 20809 y := v.Args[1] 20810 v.reset(OpARMCMOVWHSconst) 20811 v.AuxInt = 0 20812 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20813 v0.AddArg(x) 20814 v0.AddArg(y) 20815 v.AddArg(v0) 20816 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20817 v1.AuxInt = 256 20818 v1.AddArg(y) 20819 v.AddArg(v1) 20820 return true 20821 } 20822 } 20823 func rewriteValueARM_OpRsh32Ux64_0(v *Value) bool { 20824 // match: (Rsh32Ux64 x (Const64 [c])) 20825 // cond: uint64(c) < 32 20826 // result: (SRLconst x [c]) 20827 for { 20828 _ = v.Args[1] 20829 x := v.Args[0] 20830 v_1 := v.Args[1] 20831 if v_1.Op != OpConst64 { 20832 break 20833 } 20834 c := v_1.AuxInt 20835 if !(uint64(c) < 32) { 20836 break 20837 } 20838 v.reset(OpARMSRLconst) 20839 v.AuxInt = c 20840 v.AddArg(x) 20841 return true 20842 } 20843 // match: (Rsh32Ux64 _ (Const64 [c])) 20844 // cond: uint64(c) >= 32 20845 // result: (Const32 [0]) 20846 for { 20847 _ = v.Args[1] 20848 v_1 := v.Args[1] 20849 if v_1.Op != OpConst64 { 20850 break 20851 } 20852 c := v_1.AuxInt 20853 if !(uint64(c) >= 32) { 20854 break 20855 } 20856 v.reset(OpConst32) 20857 v.AuxInt = 0 20858 return true 20859 } 20860 return false 20861 } 20862 func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { 20863 b := v.Block 20864 _ = b 20865 typ := &b.Func.Config.Types 20866 _ = typ 20867 // match: (Rsh32Ux8 x y) 20868 // cond: 20869 // result: (SRL x (ZeroExt8to32 y)) 20870 for { 20871 _ = v.Args[1] 20872 x := v.Args[0] 20873 y := v.Args[1] 20874 v.reset(OpARMSRL) 20875 v.AddArg(x) 20876 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20877 v0.AddArg(y) 20878 v.AddArg(v0) 20879 return true 20880 } 20881 } 20882 func rewriteValueARM_OpRsh32x16_0(v *Value) bool { 20883 b := v.Block 20884 _ = b 20885 typ := &b.Func.Config.Types 20886 _ = typ 20887 // match: (Rsh32x16 x y) 20888 // cond: 20889 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 20890 for { 20891 _ = v.Args[1] 20892 x := v.Args[0] 20893 y := v.Args[1] 20894 v.reset(OpARMSRAcond) 20895 v.AddArg(x) 20896 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20897 v0.AddArg(y) 20898 v.AddArg(v0) 20899 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20900 v1.AuxInt = 256 20901 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20902 v2.AddArg(y) 20903 v1.AddArg(v2) 20904 v.AddArg(v1) 20905 return true 20906 } 20907 } 20908 func rewriteValueARM_OpRsh32x32_0(v *Value) bool { 20909 b := v.Block 20910 _ = b 20911 // match: (Rsh32x32 x y) 20912 // cond: 20913 // result: (SRAcond x y (CMPconst [256] y)) 20914 for { 20915 _ = v.Args[1] 20916 x := v.Args[0] 20917 y := v.Args[1] 20918 v.reset(OpARMSRAcond) 20919 v.AddArg(x) 20920 v.AddArg(y) 20921 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20922 v0.AuxInt = 256 20923 v0.AddArg(y) 20924 v.AddArg(v0) 20925 return true 20926 } 20927 } 20928 func rewriteValueARM_OpRsh32x64_0(v *Value) bool { 20929 // match: (Rsh32x64 x (Const64 [c])) 20930 // cond: uint64(c) < 32 20931 // result: (SRAconst x [c]) 20932 for { 20933 _ = v.Args[1] 20934 x := v.Args[0] 20935 v_1 := v.Args[1] 20936 if v_1.Op != OpConst64 { 20937 break 20938 } 20939 c := v_1.AuxInt 20940 if !(uint64(c) < 32) { 20941 break 20942 } 20943 v.reset(OpARMSRAconst) 20944 v.AuxInt = c 20945 v.AddArg(x) 20946 return true 20947 } 20948 // match: (Rsh32x64 x (Const64 [c])) 20949 // cond: uint64(c) >= 32 20950 // result: (SRAconst x [31]) 20951 for { 20952 _ = v.Args[1] 20953 x := v.Args[0] 20954 v_1 := v.Args[1] 20955 if v_1.Op != OpConst64 { 20956 break 20957 } 20958 c := v_1.AuxInt 20959 if !(uint64(c) >= 32) { 20960 break 20961 } 20962 v.reset(OpARMSRAconst) 20963 v.AuxInt = 31 20964 v.AddArg(x) 20965 return true 20966 } 20967 return false 20968 } 20969 func rewriteValueARM_OpRsh32x8_0(v *Value) bool { 20970 b := v.Block 20971 _ = b 20972 typ := &b.Func.Config.Types 20973 _ = typ 20974 // match: (Rsh32x8 x y) 20975 // cond: 20976 // result: (SRA x (ZeroExt8to32 y)) 20977 for { 20978 _ = v.Args[1] 20979 x := v.Args[0] 20980 y := v.Args[1] 20981 v.reset(OpARMSRA) 20982 v.AddArg(x) 20983 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20984 v0.AddArg(y) 20985 v.AddArg(v0) 20986 return true 20987 } 20988 } 20989 func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { 20990 b := v.Block 20991 _ = b 20992 typ := &b.Func.Config.Types 20993 _ = typ 20994 // match: (Rsh8Ux16 x y) 20995 // cond: 20996 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 20997 for { 20998 _ = v.Args[1] 20999 x := v.Args[0] 21000 y := v.Args[1] 21001 v.reset(OpARMCMOVWHSconst) 21002 v.AuxInt = 0 21003 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 21004 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21005 v1.AddArg(x) 21006 v0.AddArg(v1) 21007 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21008 v2.AddArg(y) 21009 v0.AddArg(v2) 21010 v.AddArg(v0) 21011 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21012 v3.AuxInt = 256 21013 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21014 v4.AddArg(y) 21015 v3.AddArg(v4) 21016 v.AddArg(v3) 21017 return true 21018 } 21019 } 21020 func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { 21021 b := v.Block 21022 _ = b 21023 typ := &b.Func.Config.Types 21024 _ = typ 21025 // match: (Rsh8Ux32 x y) 21026 // cond: 21027 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 21028 for { 21029 _ = v.Args[1] 21030 x := v.Args[0] 21031 y := v.Args[1] 21032 v.reset(OpARMCMOVWHSconst) 21033 v.AuxInt = 0 21034 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 21035 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21036 v1.AddArg(x) 21037 v0.AddArg(v1) 21038 v0.AddArg(y) 21039 v.AddArg(v0) 21040 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21041 v2.AuxInt = 256 21042 v2.AddArg(y) 21043 v.AddArg(v2) 21044 return true 21045 } 21046 } 21047 func rewriteValueARM_OpRsh8Ux64_0(v *Value) bool { 21048 b := v.Block 21049 _ = b 21050 typ := &b.Func.Config.Types 21051 _ = typ 21052 // match: (Rsh8Ux64 x (Const64 [c])) 21053 // cond: uint64(c) < 8 21054 // result: (SRLconst (SLLconst <typ.UInt32> x [24]) [c+24]) 21055 for { 21056 _ = v.Args[1] 21057 x := v.Args[0] 21058 v_1 := v.Args[1] 21059 if v_1.Op != OpConst64 { 21060 break 21061 } 21062 c := v_1.AuxInt 21063 if !(uint64(c) < 8) { 21064 break 21065 } 21066 v.reset(OpARMSRLconst) 21067 v.AuxInt = c + 24 21068 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21069 v0.AuxInt = 24 21070 v0.AddArg(x) 21071 v.AddArg(v0) 21072 return true 21073 } 21074 // match: (Rsh8Ux64 _ (Const64 [c])) 21075 // cond: uint64(c) >= 8 21076 // result: (Const8 [0]) 21077 for { 21078 _ = v.Args[1] 21079 v_1 := v.Args[1] 21080 if v_1.Op != OpConst64 { 21081 break 21082 } 21083 c := v_1.AuxInt 21084 if !(uint64(c) >= 8) { 21085 break 21086 } 21087 v.reset(OpConst8) 21088 v.AuxInt = 0 21089 return true 21090 } 21091 return false 21092 } 21093 func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { 21094 b := v.Block 21095 _ = b 21096 typ := &b.Func.Config.Types 21097 _ = typ 21098 // match: (Rsh8Ux8 x y) 21099 // cond: 21100 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 21101 for { 21102 _ = v.Args[1] 21103 x := v.Args[0] 21104 y := v.Args[1] 21105 v.reset(OpARMSRL) 21106 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21107 v0.AddArg(x) 21108 v.AddArg(v0) 21109 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21110 v1.AddArg(y) 21111 v.AddArg(v1) 21112 return true 21113 } 21114 } 21115 func rewriteValueARM_OpRsh8x16_0(v *Value) bool { 21116 b := v.Block 21117 _ = b 21118 typ := &b.Func.Config.Types 21119 _ = typ 21120 // match: (Rsh8x16 x y) 21121 // cond: 21122 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 21123 for { 21124 _ = v.Args[1] 21125 x := v.Args[0] 21126 y := v.Args[1] 21127 v.reset(OpARMSRAcond) 21128 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21129 v0.AddArg(x) 21130 v.AddArg(v0) 21131 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21132 v1.AddArg(y) 21133 v.AddArg(v1) 21134 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21135 v2.AuxInt = 256 21136 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21137 v3.AddArg(y) 21138 v2.AddArg(v3) 21139 v.AddArg(v2) 21140 return true 21141 } 21142 } 21143 func rewriteValueARM_OpRsh8x32_0(v *Value) bool { 21144 b := v.Block 21145 _ = b 21146 typ := &b.Func.Config.Types 21147 _ = typ 21148 // match: (Rsh8x32 x y) 21149 // cond: 21150 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 21151 for { 21152 _ = v.Args[1] 21153 x := v.Args[0] 21154 y := v.Args[1] 21155 v.reset(OpARMSRAcond) 21156 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21157 v0.AddArg(x) 21158 v.AddArg(v0) 21159 v.AddArg(y) 21160 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21161 v1.AuxInt = 256 21162 v1.AddArg(y) 21163 v.AddArg(v1) 21164 return true 21165 } 21166 } 21167 func rewriteValueARM_OpRsh8x64_0(v *Value) bool { 21168 b := v.Block 21169 _ = b 21170 typ := &b.Func.Config.Types 21171 _ = typ 21172 // match: (Rsh8x64 x (Const64 [c])) 21173 // cond: uint64(c) < 8 21174 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [c+24]) 21175 for { 21176 _ = v.Args[1] 21177 x := v.Args[0] 21178 v_1 := v.Args[1] 21179 if v_1.Op != OpConst64 { 21180 break 21181 } 21182 c := v_1.AuxInt 21183 if !(uint64(c) < 8) { 21184 break 21185 } 21186 v.reset(OpARMSRAconst) 21187 v.AuxInt = c + 24 21188 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21189 v0.AuxInt = 24 21190 v0.AddArg(x) 21191 v.AddArg(v0) 21192 return true 21193 } 21194 // match: (Rsh8x64 x (Const64 [c])) 21195 // cond: uint64(c) >= 8 21196 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [31]) 21197 for { 21198 _ = v.Args[1] 21199 x := v.Args[0] 21200 v_1 := v.Args[1] 21201 if v_1.Op != OpConst64 { 21202 break 21203 } 21204 c := v_1.AuxInt 21205 if !(uint64(c) >= 8) { 21206 break 21207 } 21208 v.reset(OpARMSRAconst) 21209 v.AuxInt = 31 21210 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21211 v0.AuxInt = 24 21212 v0.AddArg(x) 21213 v.AddArg(v0) 21214 return true 21215 } 21216 return false 21217 } 21218 func rewriteValueARM_OpRsh8x8_0(v *Value) bool { 21219 b := v.Block 21220 _ = b 21221 typ := &b.Func.Config.Types 21222 _ = typ 21223 // match: (Rsh8x8 x y) 21224 // cond: 21225 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 21226 for { 21227 _ = v.Args[1] 21228 x := v.Args[0] 21229 y := v.Args[1] 21230 v.reset(OpARMSRA) 21231 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21232 v0.AddArg(x) 21233 v.AddArg(v0) 21234 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21235 v1.AddArg(y) 21236 v.AddArg(v1) 21237 return true 21238 } 21239 } 21240 func rewriteValueARM_OpSelect0_0(v *Value) bool { 21241 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 21242 // cond: 21243 // result: x 21244 for { 21245 v_0 := v.Args[0] 21246 if v_0.Op != OpARMCALLudiv { 21247 break 21248 } 21249 _ = v_0.Args[1] 21250 x := v_0.Args[0] 21251 v_0_1 := v_0.Args[1] 21252 if v_0_1.Op != OpARMMOVWconst { 21253 break 21254 } 21255 if v_0_1.AuxInt != 1 { 21256 break 21257 } 21258 v.reset(OpCopy) 21259 v.Type = x.Type 21260 v.AddArg(x) 21261 return true 21262 } 21263 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 21264 // cond: isPowerOfTwo(c) 21265 // result: (SRLconst [log2(c)] x) 21266 for { 21267 v_0 := v.Args[0] 21268 if v_0.Op != OpARMCALLudiv { 21269 break 21270 } 21271 _ = v_0.Args[1] 21272 x := v_0.Args[0] 21273 v_0_1 := v_0.Args[1] 21274 if v_0_1.Op != OpARMMOVWconst { 21275 break 21276 } 21277 c := v_0_1.AuxInt 21278 if !(isPowerOfTwo(c)) { 21279 break 21280 } 21281 v.reset(OpARMSRLconst) 21282 v.AuxInt = log2(c) 21283 v.AddArg(x) 21284 return true 21285 } 21286 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 21287 // cond: 21288 // result: (MOVWconst [int64(uint32(c)/uint32(d))]) 21289 for { 21290 v_0 := v.Args[0] 21291 if v_0.Op != OpARMCALLudiv { 21292 break 21293 } 21294 _ = v_0.Args[1] 21295 v_0_0 := v_0.Args[0] 21296 if v_0_0.Op != OpARMMOVWconst { 21297 break 21298 } 21299 c := v_0_0.AuxInt 21300 v_0_1 := v_0.Args[1] 21301 if v_0_1.Op != OpARMMOVWconst { 21302 break 21303 } 21304 d := v_0_1.AuxInt 21305 v.reset(OpARMMOVWconst) 21306 v.AuxInt = int64(uint32(c) / uint32(d)) 21307 return true 21308 } 21309 return false 21310 } 21311 func rewriteValueARM_OpSelect1_0(v *Value) bool { 21312 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 21313 // cond: 21314 // result: (MOVWconst [0]) 21315 for { 21316 v_0 := v.Args[0] 21317 if v_0.Op != OpARMCALLudiv { 21318 break 21319 } 21320 _ = v_0.Args[1] 21321 v_0_1 := v_0.Args[1] 21322 if v_0_1.Op != OpARMMOVWconst { 21323 break 21324 } 21325 if v_0_1.AuxInt != 1 { 21326 break 21327 } 21328 v.reset(OpARMMOVWconst) 21329 v.AuxInt = 0 21330 return true 21331 } 21332 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 21333 // cond: isPowerOfTwo(c) 21334 // result: (ANDconst [c-1] x) 21335 for { 21336 v_0 := v.Args[0] 21337 if v_0.Op != OpARMCALLudiv { 21338 break 21339 } 21340 _ = v_0.Args[1] 21341 x := v_0.Args[0] 21342 v_0_1 := v_0.Args[1] 21343 if v_0_1.Op != OpARMMOVWconst { 21344 break 21345 } 21346 c := v_0_1.AuxInt 21347 if !(isPowerOfTwo(c)) { 21348 break 21349 } 21350 v.reset(OpARMANDconst) 21351 v.AuxInt = c - 1 21352 v.AddArg(x) 21353 return true 21354 } 21355 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 21356 // cond: 21357 // result: (MOVWconst [int64(uint32(c)%uint32(d))]) 21358 for { 21359 v_0 := v.Args[0] 21360 if v_0.Op != OpARMCALLudiv { 21361 break 21362 } 21363 _ = v_0.Args[1] 21364 v_0_0 := v_0.Args[0] 21365 if v_0_0.Op != OpARMMOVWconst { 21366 break 21367 } 21368 c := v_0_0.AuxInt 21369 v_0_1 := v_0.Args[1] 21370 if v_0_1.Op != OpARMMOVWconst { 21371 break 21372 } 21373 d := v_0_1.AuxInt 21374 v.reset(OpARMMOVWconst) 21375 v.AuxInt = int64(uint32(c) % uint32(d)) 21376 return true 21377 } 21378 return false 21379 } 21380 func rewriteValueARM_OpSignExt16to32_0(v *Value) bool { 21381 // match: (SignExt16to32 x) 21382 // cond: 21383 // result: (MOVHreg x) 21384 for { 21385 x := v.Args[0] 21386 v.reset(OpARMMOVHreg) 21387 v.AddArg(x) 21388 return true 21389 } 21390 } 21391 func rewriteValueARM_OpSignExt8to16_0(v *Value) bool { 21392 // match: (SignExt8to16 x) 21393 // cond: 21394 // result: (MOVBreg x) 21395 for { 21396 x := v.Args[0] 21397 v.reset(OpARMMOVBreg) 21398 v.AddArg(x) 21399 return true 21400 } 21401 } 21402 func rewriteValueARM_OpSignExt8to32_0(v *Value) bool { 21403 // match: (SignExt8to32 x) 21404 // cond: 21405 // result: (MOVBreg x) 21406 for { 21407 x := v.Args[0] 21408 v.reset(OpARMMOVBreg) 21409 v.AddArg(x) 21410 return true 21411 } 21412 } 21413 func rewriteValueARM_OpSignmask_0(v *Value) bool { 21414 // match: (Signmask x) 21415 // cond: 21416 // result: (SRAconst x [31]) 21417 for { 21418 x := v.Args[0] 21419 v.reset(OpARMSRAconst) 21420 v.AuxInt = 31 21421 v.AddArg(x) 21422 return true 21423 } 21424 } 21425 func rewriteValueARM_OpSlicemask_0(v *Value) bool { 21426 b := v.Block 21427 _ = b 21428 // match: (Slicemask <t> x) 21429 // cond: 21430 // result: (SRAconst (RSBconst <t> [0] x) [31]) 21431 for { 21432 t := v.Type 21433 x := v.Args[0] 21434 v.reset(OpARMSRAconst) 21435 v.AuxInt = 31 21436 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 21437 v0.AuxInt = 0 21438 v0.AddArg(x) 21439 v.AddArg(v0) 21440 return true 21441 } 21442 } 21443 func rewriteValueARM_OpSqrt_0(v *Value) bool { 21444 // match: (Sqrt x) 21445 // cond: 21446 // result: (SQRTD x) 21447 for { 21448 x := v.Args[0] 21449 v.reset(OpARMSQRTD) 21450 v.AddArg(x) 21451 return true 21452 } 21453 } 21454 func rewriteValueARM_OpStaticCall_0(v *Value) bool { 21455 // match: (StaticCall [argwid] {target} mem) 21456 // cond: 21457 // result: (CALLstatic [argwid] {target} mem) 21458 for { 21459 argwid := v.AuxInt 21460 target := v.Aux 21461 mem := v.Args[0] 21462 v.reset(OpARMCALLstatic) 21463 v.AuxInt = argwid 21464 v.Aux = target 21465 v.AddArg(mem) 21466 return true 21467 } 21468 } 21469 func rewriteValueARM_OpStore_0(v *Value) bool { 21470 // match: (Store {t} ptr val mem) 21471 // cond: t.(*types.Type).Size() == 1 21472 // result: (MOVBstore ptr val mem) 21473 for { 21474 t := v.Aux 21475 _ = v.Args[2] 21476 ptr := v.Args[0] 21477 val := v.Args[1] 21478 mem := v.Args[2] 21479 if !(t.(*types.Type).Size() == 1) { 21480 break 21481 } 21482 v.reset(OpARMMOVBstore) 21483 v.AddArg(ptr) 21484 v.AddArg(val) 21485 v.AddArg(mem) 21486 return true 21487 } 21488 // match: (Store {t} ptr val mem) 21489 // cond: t.(*types.Type).Size() == 2 21490 // result: (MOVHstore ptr val mem) 21491 for { 21492 t := v.Aux 21493 _ = v.Args[2] 21494 ptr := v.Args[0] 21495 val := v.Args[1] 21496 mem := v.Args[2] 21497 if !(t.(*types.Type).Size() == 2) { 21498 break 21499 } 21500 v.reset(OpARMMOVHstore) 21501 v.AddArg(ptr) 21502 v.AddArg(val) 21503 v.AddArg(mem) 21504 return true 21505 } 21506 // match: (Store {t} ptr val mem) 21507 // cond: t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type) 21508 // result: (MOVWstore ptr val mem) 21509 for { 21510 t := v.Aux 21511 _ = v.Args[2] 21512 ptr := v.Args[0] 21513 val := v.Args[1] 21514 mem := v.Args[2] 21515 if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { 21516 break 21517 } 21518 v.reset(OpARMMOVWstore) 21519 v.AddArg(ptr) 21520 v.AddArg(val) 21521 v.AddArg(mem) 21522 return true 21523 } 21524 // match: (Store {t} ptr val mem) 21525 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 21526 // result: (MOVFstore ptr val mem) 21527 for { 21528 t := v.Aux 21529 _ = v.Args[2] 21530 ptr := v.Args[0] 21531 val := v.Args[1] 21532 mem := v.Args[2] 21533 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 21534 break 21535 } 21536 v.reset(OpARMMOVFstore) 21537 v.AddArg(ptr) 21538 v.AddArg(val) 21539 v.AddArg(mem) 21540 return true 21541 } 21542 // match: (Store {t} ptr val mem) 21543 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 21544 // result: (MOVDstore ptr val mem) 21545 for { 21546 t := v.Aux 21547 _ = v.Args[2] 21548 ptr := v.Args[0] 21549 val := v.Args[1] 21550 mem := v.Args[2] 21551 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 21552 break 21553 } 21554 v.reset(OpARMMOVDstore) 21555 v.AddArg(ptr) 21556 v.AddArg(val) 21557 v.AddArg(mem) 21558 return true 21559 } 21560 return false 21561 } 21562 func rewriteValueARM_OpSub16_0(v *Value) bool { 21563 // match: (Sub16 x y) 21564 // cond: 21565 // result: (SUB x y) 21566 for { 21567 _ = v.Args[1] 21568 x := v.Args[0] 21569 y := v.Args[1] 21570 v.reset(OpARMSUB) 21571 v.AddArg(x) 21572 v.AddArg(y) 21573 return true 21574 } 21575 } 21576 func rewriteValueARM_OpSub32_0(v *Value) bool { 21577 // match: (Sub32 x y) 21578 // cond: 21579 // result: (SUB x y) 21580 for { 21581 _ = v.Args[1] 21582 x := v.Args[0] 21583 y := v.Args[1] 21584 v.reset(OpARMSUB) 21585 v.AddArg(x) 21586 v.AddArg(y) 21587 return true 21588 } 21589 } 21590 func rewriteValueARM_OpSub32F_0(v *Value) bool { 21591 // match: (Sub32F x y) 21592 // cond: 21593 // result: (SUBF x y) 21594 for { 21595 _ = v.Args[1] 21596 x := v.Args[0] 21597 y := v.Args[1] 21598 v.reset(OpARMSUBF) 21599 v.AddArg(x) 21600 v.AddArg(y) 21601 return true 21602 } 21603 } 21604 func rewriteValueARM_OpSub32carry_0(v *Value) bool { 21605 // match: (Sub32carry x y) 21606 // cond: 21607 // result: (SUBS x y) 21608 for { 21609 _ = v.Args[1] 21610 x := v.Args[0] 21611 y := v.Args[1] 21612 v.reset(OpARMSUBS) 21613 v.AddArg(x) 21614 v.AddArg(y) 21615 return true 21616 } 21617 } 21618 func rewriteValueARM_OpSub32withcarry_0(v *Value) bool { 21619 // match: (Sub32withcarry x y c) 21620 // cond: 21621 // result: (SBC x y c) 21622 for { 21623 _ = v.Args[2] 21624 x := v.Args[0] 21625 y := v.Args[1] 21626 c := v.Args[2] 21627 v.reset(OpARMSBC) 21628 v.AddArg(x) 21629 v.AddArg(y) 21630 v.AddArg(c) 21631 return true 21632 } 21633 } 21634 func rewriteValueARM_OpSub64F_0(v *Value) bool { 21635 // match: (Sub64F x y) 21636 // cond: 21637 // result: (SUBD x y) 21638 for { 21639 _ = v.Args[1] 21640 x := v.Args[0] 21641 y := v.Args[1] 21642 v.reset(OpARMSUBD) 21643 v.AddArg(x) 21644 v.AddArg(y) 21645 return true 21646 } 21647 } 21648 func rewriteValueARM_OpSub8_0(v *Value) bool { 21649 // match: (Sub8 x y) 21650 // cond: 21651 // result: (SUB x y) 21652 for { 21653 _ = v.Args[1] 21654 x := v.Args[0] 21655 y := v.Args[1] 21656 v.reset(OpARMSUB) 21657 v.AddArg(x) 21658 v.AddArg(y) 21659 return true 21660 } 21661 } 21662 func rewriteValueARM_OpSubPtr_0(v *Value) bool { 21663 // match: (SubPtr x y) 21664 // cond: 21665 // result: (SUB x y) 21666 for { 21667 _ = v.Args[1] 21668 x := v.Args[0] 21669 y := v.Args[1] 21670 v.reset(OpARMSUB) 21671 v.AddArg(x) 21672 v.AddArg(y) 21673 return true 21674 } 21675 } 21676 func rewriteValueARM_OpTrunc16to8_0(v *Value) bool { 21677 // match: (Trunc16to8 x) 21678 // cond: 21679 // result: x 21680 for { 21681 x := v.Args[0] 21682 v.reset(OpCopy) 21683 v.Type = x.Type 21684 v.AddArg(x) 21685 return true 21686 } 21687 } 21688 func rewriteValueARM_OpTrunc32to16_0(v *Value) bool { 21689 // match: (Trunc32to16 x) 21690 // cond: 21691 // result: x 21692 for { 21693 x := v.Args[0] 21694 v.reset(OpCopy) 21695 v.Type = x.Type 21696 v.AddArg(x) 21697 return true 21698 } 21699 } 21700 func rewriteValueARM_OpTrunc32to8_0(v *Value) bool { 21701 // match: (Trunc32to8 x) 21702 // cond: 21703 // result: x 21704 for { 21705 x := v.Args[0] 21706 v.reset(OpCopy) 21707 v.Type = x.Type 21708 v.AddArg(x) 21709 return true 21710 } 21711 } 21712 func rewriteValueARM_OpXor16_0(v *Value) bool { 21713 // match: (Xor16 x y) 21714 // cond: 21715 // result: (XOR x y) 21716 for { 21717 _ = v.Args[1] 21718 x := v.Args[0] 21719 y := v.Args[1] 21720 v.reset(OpARMXOR) 21721 v.AddArg(x) 21722 v.AddArg(y) 21723 return true 21724 } 21725 } 21726 func rewriteValueARM_OpXor32_0(v *Value) bool { 21727 // match: (Xor32 x y) 21728 // cond: 21729 // result: (XOR x y) 21730 for { 21731 _ = v.Args[1] 21732 x := v.Args[0] 21733 y := v.Args[1] 21734 v.reset(OpARMXOR) 21735 v.AddArg(x) 21736 v.AddArg(y) 21737 return true 21738 } 21739 } 21740 func rewriteValueARM_OpXor8_0(v *Value) bool { 21741 // match: (Xor8 x y) 21742 // cond: 21743 // result: (XOR x y) 21744 for { 21745 _ = v.Args[1] 21746 x := v.Args[0] 21747 y := v.Args[1] 21748 v.reset(OpARMXOR) 21749 v.AddArg(x) 21750 v.AddArg(y) 21751 return true 21752 } 21753 } 21754 func rewriteValueARM_OpZero_0(v *Value) bool { 21755 b := v.Block 21756 _ = b 21757 config := b.Func.Config 21758 _ = config 21759 typ := &b.Func.Config.Types 21760 _ = typ 21761 // match: (Zero [0] _ mem) 21762 // cond: 21763 // result: mem 21764 for { 21765 if v.AuxInt != 0 { 21766 break 21767 } 21768 _ = v.Args[1] 21769 mem := v.Args[1] 21770 v.reset(OpCopy) 21771 v.Type = mem.Type 21772 v.AddArg(mem) 21773 return true 21774 } 21775 // match: (Zero [1] ptr mem) 21776 // cond: 21777 // result: (MOVBstore ptr (MOVWconst [0]) mem) 21778 for { 21779 if v.AuxInt != 1 { 21780 break 21781 } 21782 _ = v.Args[1] 21783 ptr := v.Args[0] 21784 mem := v.Args[1] 21785 v.reset(OpARMMOVBstore) 21786 v.AddArg(ptr) 21787 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21788 v0.AuxInt = 0 21789 v.AddArg(v0) 21790 v.AddArg(mem) 21791 return true 21792 } 21793 // match: (Zero [2] {t} ptr mem) 21794 // cond: t.(*types.Type).Alignment()%2 == 0 21795 // result: (MOVHstore ptr (MOVWconst [0]) mem) 21796 for { 21797 if v.AuxInt != 2 { 21798 break 21799 } 21800 t := v.Aux 21801 _ = v.Args[1] 21802 ptr := v.Args[0] 21803 mem := v.Args[1] 21804 if !(t.(*types.Type).Alignment()%2 == 0) { 21805 break 21806 } 21807 v.reset(OpARMMOVHstore) 21808 v.AddArg(ptr) 21809 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21810 v0.AuxInt = 0 21811 v.AddArg(v0) 21812 v.AddArg(mem) 21813 return true 21814 } 21815 // match: (Zero [2] ptr mem) 21816 // cond: 21817 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 21818 for { 21819 if v.AuxInt != 2 { 21820 break 21821 } 21822 _ = v.Args[1] 21823 ptr := v.Args[0] 21824 mem := v.Args[1] 21825 v.reset(OpARMMOVBstore) 21826 v.AuxInt = 1 21827 v.AddArg(ptr) 21828 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21829 v0.AuxInt = 0 21830 v.AddArg(v0) 21831 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21832 v1.AuxInt = 0 21833 v1.AddArg(ptr) 21834 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21835 v2.AuxInt = 0 21836 v1.AddArg(v2) 21837 v1.AddArg(mem) 21838 v.AddArg(v1) 21839 return true 21840 } 21841 // match: (Zero [4] {t} ptr mem) 21842 // cond: t.(*types.Type).Alignment()%4 == 0 21843 // result: (MOVWstore ptr (MOVWconst [0]) mem) 21844 for { 21845 if v.AuxInt != 4 { 21846 break 21847 } 21848 t := v.Aux 21849 _ = v.Args[1] 21850 ptr := v.Args[0] 21851 mem := v.Args[1] 21852 if !(t.(*types.Type).Alignment()%4 == 0) { 21853 break 21854 } 21855 v.reset(OpARMMOVWstore) 21856 v.AddArg(ptr) 21857 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21858 v0.AuxInt = 0 21859 v.AddArg(v0) 21860 v.AddArg(mem) 21861 return true 21862 } 21863 // match: (Zero [4] {t} ptr mem) 21864 // cond: t.(*types.Type).Alignment()%2 == 0 21865 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 21866 for { 21867 if v.AuxInt != 4 { 21868 break 21869 } 21870 t := v.Aux 21871 _ = v.Args[1] 21872 ptr := v.Args[0] 21873 mem := v.Args[1] 21874 if !(t.(*types.Type).Alignment()%2 == 0) { 21875 break 21876 } 21877 v.reset(OpARMMOVHstore) 21878 v.AuxInt = 2 21879 v.AddArg(ptr) 21880 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21881 v0.AuxInt = 0 21882 v.AddArg(v0) 21883 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 21884 v1.AuxInt = 0 21885 v1.AddArg(ptr) 21886 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21887 v2.AuxInt = 0 21888 v1.AddArg(v2) 21889 v1.AddArg(mem) 21890 v.AddArg(v1) 21891 return true 21892 } 21893 // match: (Zero [4] ptr mem) 21894 // cond: 21895 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 21896 for { 21897 if v.AuxInt != 4 { 21898 break 21899 } 21900 _ = v.Args[1] 21901 ptr := v.Args[0] 21902 mem := v.Args[1] 21903 v.reset(OpARMMOVBstore) 21904 v.AuxInt = 3 21905 v.AddArg(ptr) 21906 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21907 v0.AuxInt = 0 21908 v.AddArg(v0) 21909 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21910 v1.AuxInt = 2 21911 v1.AddArg(ptr) 21912 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21913 v2.AuxInt = 0 21914 v1.AddArg(v2) 21915 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21916 v3.AuxInt = 1 21917 v3.AddArg(ptr) 21918 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21919 v4.AuxInt = 0 21920 v3.AddArg(v4) 21921 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21922 v5.AuxInt = 0 21923 v5.AddArg(ptr) 21924 v6 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21925 v6.AuxInt = 0 21926 v5.AddArg(v6) 21927 v5.AddArg(mem) 21928 v3.AddArg(v5) 21929 v1.AddArg(v3) 21930 v.AddArg(v1) 21931 return true 21932 } 21933 // match: (Zero [3] ptr mem) 21934 // cond: 21935 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 21936 for { 21937 if v.AuxInt != 3 { 21938 break 21939 } 21940 _ = v.Args[1] 21941 ptr := v.Args[0] 21942 mem := v.Args[1] 21943 v.reset(OpARMMOVBstore) 21944 v.AuxInt = 2 21945 v.AddArg(ptr) 21946 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21947 v0.AuxInt = 0 21948 v.AddArg(v0) 21949 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21950 v1.AuxInt = 1 21951 v1.AddArg(ptr) 21952 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21953 v2.AuxInt = 0 21954 v1.AddArg(v2) 21955 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21956 v3.AuxInt = 0 21957 v3.AddArg(ptr) 21958 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21959 v4.AuxInt = 0 21960 v3.AddArg(v4) 21961 v3.AddArg(mem) 21962 v1.AddArg(v3) 21963 v.AddArg(v1) 21964 return true 21965 } 21966 // match: (Zero [s] {t} ptr mem) 21967 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 21968 // result: (DUFFZERO [4 * (128 - int64(s/4))] ptr (MOVWconst [0]) mem) 21969 for { 21970 s := v.AuxInt 21971 t := v.Aux 21972 _ = v.Args[1] 21973 ptr := v.Args[0] 21974 mem := v.Args[1] 21975 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 21976 break 21977 } 21978 v.reset(OpARMDUFFZERO) 21979 v.AuxInt = 4 * (128 - int64(s/4)) 21980 v.AddArg(ptr) 21981 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21982 v0.AuxInt = 0 21983 v.AddArg(v0) 21984 v.AddArg(mem) 21985 return true 21986 } 21987 // match: (Zero [s] {t} ptr mem) 21988 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 21989 // result: (LoweredZero [t.(*types.Type).Alignment()] ptr (ADDconst <ptr.Type> ptr [s-moveSize(t.(*types.Type).Alignment(), config)]) (MOVWconst [0]) mem) 21990 for { 21991 s := v.AuxInt 21992 t := v.Aux 21993 _ = v.Args[1] 21994 ptr := v.Args[0] 21995 mem := v.Args[1] 21996 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 21997 break 21998 } 21999 v.reset(OpARMLoweredZero) 22000 v.AuxInt = t.(*types.Type).Alignment() 22001 v.AddArg(ptr) 22002 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 22003 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 22004 v0.AddArg(ptr) 22005 v.AddArg(v0) 22006 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22007 v1.AuxInt = 0 22008 v.AddArg(v1) 22009 v.AddArg(mem) 22010 return true 22011 } 22012 return false 22013 } 22014 func rewriteValueARM_OpZeroExt16to32_0(v *Value) bool { 22015 // match: (ZeroExt16to32 x) 22016 // cond: 22017 // result: (MOVHUreg x) 22018 for { 22019 x := v.Args[0] 22020 v.reset(OpARMMOVHUreg) 22021 v.AddArg(x) 22022 return true 22023 } 22024 } 22025 func rewriteValueARM_OpZeroExt8to16_0(v *Value) bool { 22026 // match: (ZeroExt8to16 x) 22027 // cond: 22028 // result: (MOVBUreg x) 22029 for { 22030 x := v.Args[0] 22031 v.reset(OpARMMOVBUreg) 22032 v.AddArg(x) 22033 return true 22034 } 22035 } 22036 func rewriteValueARM_OpZeroExt8to32_0(v *Value) bool { 22037 // match: (ZeroExt8to32 x) 22038 // cond: 22039 // result: (MOVBUreg x) 22040 for { 22041 x := v.Args[0] 22042 v.reset(OpARMMOVBUreg) 22043 v.AddArg(x) 22044 return true 22045 } 22046 } 22047 func rewriteValueARM_OpZeromask_0(v *Value) bool { 22048 b := v.Block 22049 _ = b 22050 typ := &b.Func.Config.Types 22051 _ = typ 22052 // match: (Zeromask x) 22053 // cond: 22054 // result: (SRAconst (RSBshiftRL <typ.Int32> x x [1]) [31]) 22055 for { 22056 x := v.Args[0] 22057 v.reset(OpARMSRAconst) 22058 v.AuxInt = 31 22059 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32) 22060 v0.AuxInt = 1 22061 v0.AddArg(x) 22062 v0.AddArg(x) 22063 v.AddArg(v0) 22064 return true 22065 } 22066 } 22067 func rewriteBlockARM(b *Block) bool { 22068 config := b.Func.Config 22069 _ = config 22070 fe := b.Func.fe 22071 _ = fe 22072 typ := &config.Types 22073 _ = typ 22074 switch b.Kind { 22075 case BlockARMEQ: 22076 // match: (EQ (FlagEQ) yes no) 22077 // cond: 22078 // result: (First nil yes no) 22079 for { 22080 v := b.Control 22081 if v.Op != OpARMFlagEQ { 22082 break 22083 } 22084 b.Kind = BlockFirst 22085 b.SetControl(nil) 22086 b.Aux = nil 22087 return true 22088 } 22089 // match: (EQ (FlagLT_ULT) yes no) 22090 // cond: 22091 // result: (First nil no yes) 22092 for { 22093 v := b.Control 22094 if v.Op != OpARMFlagLT_ULT { 22095 break 22096 } 22097 b.Kind = BlockFirst 22098 b.SetControl(nil) 22099 b.Aux = nil 22100 b.swapSuccessors() 22101 return true 22102 } 22103 // match: (EQ (FlagLT_UGT) yes no) 22104 // cond: 22105 // result: (First nil no yes) 22106 for { 22107 v := b.Control 22108 if v.Op != OpARMFlagLT_UGT { 22109 break 22110 } 22111 b.Kind = BlockFirst 22112 b.SetControl(nil) 22113 b.Aux = nil 22114 b.swapSuccessors() 22115 return true 22116 } 22117 // match: (EQ (FlagGT_ULT) yes no) 22118 // cond: 22119 // result: (First nil no yes) 22120 for { 22121 v := b.Control 22122 if v.Op != OpARMFlagGT_ULT { 22123 break 22124 } 22125 b.Kind = BlockFirst 22126 b.SetControl(nil) 22127 b.Aux = nil 22128 b.swapSuccessors() 22129 return true 22130 } 22131 // match: (EQ (FlagGT_UGT) yes no) 22132 // cond: 22133 // result: (First nil no yes) 22134 for { 22135 v := b.Control 22136 if v.Op != OpARMFlagGT_UGT { 22137 break 22138 } 22139 b.Kind = BlockFirst 22140 b.SetControl(nil) 22141 b.Aux = nil 22142 b.swapSuccessors() 22143 return true 22144 } 22145 // match: (EQ (InvertFlags cmp) yes no) 22146 // cond: 22147 // result: (EQ cmp yes no) 22148 for { 22149 v := b.Control 22150 if v.Op != OpARMInvertFlags { 22151 break 22152 } 22153 cmp := v.Args[0] 22154 b.Kind = BlockARMEQ 22155 b.SetControl(cmp) 22156 b.Aux = nil 22157 return true 22158 } 22159 // match: (EQ (CMPconst [0] (SUB x y)) yes no) 22160 // cond: 22161 // result: (EQ (CMP x y) yes no) 22162 for { 22163 v := b.Control 22164 if v.Op != OpARMCMPconst { 22165 break 22166 } 22167 if v.AuxInt != 0 { 22168 break 22169 } 22170 v_0 := v.Args[0] 22171 if v_0.Op != OpARMSUB { 22172 break 22173 } 22174 _ = v_0.Args[1] 22175 x := v_0.Args[0] 22176 y := v_0.Args[1] 22177 b.Kind = BlockARMEQ 22178 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 22179 v0.AddArg(x) 22180 v0.AddArg(y) 22181 b.SetControl(v0) 22182 b.Aux = nil 22183 return true 22184 } 22185 // match: (EQ (CMPconst [0] (SUBconst [c] x)) yes no) 22186 // cond: 22187 // result: (EQ (CMPconst [c] x) yes no) 22188 for { 22189 v := b.Control 22190 if v.Op != OpARMCMPconst { 22191 break 22192 } 22193 if v.AuxInt != 0 { 22194 break 22195 } 22196 v_0 := v.Args[0] 22197 if v_0.Op != OpARMSUBconst { 22198 break 22199 } 22200 c := v_0.AuxInt 22201 x := v_0.Args[0] 22202 b.Kind = BlockARMEQ 22203 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 22204 v0.AuxInt = c 22205 v0.AddArg(x) 22206 b.SetControl(v0) 22207 b.Aux = nil 22208 return true 22209 } 22210 // match: (EQ (CMPconst [0] (SUBshiftLL x y [c])) yes no) 22211 // cond: 22212 // result: (EQ (CMPshiftLL x y [c]) yes no) 22213 for { 22214 v := b.Control 22215 if v.Op != OpARMCMPconst { 22216 break 22217 } 22218 if v.AuxInt != 0 { 22219 break 22220 } 22221 v_0 := v.Args[0] 22222 if v_0.Op != OpARMSUBshiftLL { 22223 break 22224 } 22225 c := v_0.AuxInt 22226 _ = v_0.Args[1] 22227 x := v_0.Args[0] 22228 y := v_0.Args[1] 22229 b.Kind = BlockARMEQ 22230 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 22231 v0.AuxInt = c 22232 v0.AddArg(x) 22233 v0.AddArg(y) 22234 b.SetControl(v0) 22235 b.Aux = nil 22236 return true 22237 } 22238 // match: (EQ (CMPconst [0] (SUBshiftRL x y [c])) yes no) 22239 // cond: 22240 // result: (EQ (CMPshiftRL x y [c]) yes no) 22241 for { 22242 v := b.Control 22243 if v.Op != OpARMCMPconst { 22244 break 22245 } 22246 if v.AuxInt != 0 { 22247 break 22248 } 22249 v_0 := v.Args[0] 22250 if v_0.Op != OpARMSUBshiftRL { 22251 break 22252 } 22253 c := v_0.AuxInt 22254 _ = v_0.Args[1] 22255 x := v_0.Args[0] 22256 y := v_0.Args[1] 22257 b.Kind = BlockARMEQ 22258 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 22259 v0.AuxInt = c 22260 v0.AddArg(x) 22261 v0.AddArg(y) 22262 b.SetControl(v0) 22263 b.Aux = nil 22264 return true 22265 } 22266 // match: (EQ (CMPconst [0] (SUBshiftRA x y [c])) yes no) 22267 // cond: 22268 // result: (EQ (CMPshiftRA x y [c]) yes no) 22269 for { 22270 v := b.Control 22271 if v.Op != OpARMCMPconst { 22272 break 22273 } 22274 if v.AuxInt != 0 { 22275 break 22276 } 22277 v_0 := v.Args[0] 22278 if v_0.Op != OpARMSUBshiftRA { 22279 break 22280 } 22281 c := v_0.AuxInt 22282 _ = v_0.Args[1] 22283 x := v_0.Args[0] 22284 y := v_0.Args[1] 22285 b.Kind = BlockARMEQ 22286 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 22287 v0.AuxInt = c 22288 v0.AddArg(x) 22289 v0.AddArg(y) 22290 b.SetControl(v0) 22291 b.Aux = nil 22292 return true 22293 } 22294 // match: (EQ (CMPconst [0] (SUBshiftLLreg x y z)) yes no) 22295 // cond: 22296 // result: (EQ (CMPshiftLLreg x y z) yes no) 22297 for { 22298 v := b.Control 22299 if v.Op != OpARMCMPconst { 22300 break 22301 } 22302 if v.AuxInt != 0 { 22303 break 22304 } 22305 v_0 := v.Args[0] 22306 if v_0.Op != OpARMSUBshiftLLreg { 22307 break 22308 } 22309 _ = v_0.Args[2] 22310 x := v_0.Args[0] 22311 y := v_0.Args[1] 22312 z := v_0.Args[2] 22313 b.Kind = BlockARMEQ 22314 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 22315 v0.AddArg(x) 22316 v0.AddArg(y) 22317 v0.AddArg(z) 22318 b.SetControl(v0) 22319 b.Aux = nil 22320 return true 22321 } 22322 // match: (EQ (CMPconst [0] (SUBshiftRLreg x y z)) yes no) 22323 // cond: 22324 // result: (EQ (CMPshiftRLreg x y z) yes no) 22325 for { 22326 v := b.Control 22327 if v.Op != OpARMCMPconst { 22328 break 22329 } 22330 if v.AuxInt != 0 { 22331 break 22332 } 22333 v_0 := v.Args[0] 22334 if v_0.Op != OpARMSUBshiftRLreg { 22335 break 22336 } 22337 _ = v_0.Args[2] 22338 x := v_0.Args[0] 22339 y := v_0.Args[1] 22340 z := v_0.Args[2] 22341 b.Kind = BlockARMEQ 22342 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 22343 v0.AddArg(x) 22344 v0.AddArg(y) 22345 v0.AddArg(z) 22346 b.SetControl(v0) 22347 b.Aux = nil 22348 return true 22349 } 22350 // match: (EQ (CMPconst [0] (SUBshiftRAreg x y z)) yes no) 22351 // cond: 22352 // result: (EQ (CMPshiftRAreg x y z) yes no) 22353 for { 22354 v := b.Control 22355 if v.Op != OpARMCMPconst { 22356 break 22357 } 22358 if v.AuxInt != 0 { 22359 break 22360 } 22361 v_0 := v.Args[0] 22362 if v_0.Op != OpARMSUBshiftRAreg { 22363 break 22364 } 22365 _ = v_0.Args[2] 22366 x := v_0.Args[0] 22367 y := v_0.Args[1] 22368 z := v_0.Args[2] 22369 b.Kind = BlockARMEQ 22370 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 22371 v0.AddArg(x) 22372 v0.AddArg(y) 22373 v0.AddArg(z) 22374 b.SetControl(v0) 22375 b.Aux = nil 22376 return true 22377 } 22378 // match: (EQ (CMPconst [0] (ADD x y)) yes no) 22379 // cond: 22380 // result: (EQ (CMN x y) yes no) 22381 for { 22382 v := b.Control 22383 if v.Op != OpARMCMPconst { 22384 break 22385 } 22386 if v.AuxInt != 0 { 22387 break 22388 } 22389 v_0 := v.Args[0] 22390 if v_0.Op != OpARMADD { 22391 break 22392 } 22393 _ = v_0.Args[1] 22394 x := v_0.Args[0] 22395 y := v_0.Args[1] 22396 b.Kind = BlockARMEQ 22397 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 22398 v0.AddArg(x) 22399 v0.AddArg(y) 22400 b.SetControl(v0) 22401 b.Aux = nil 22402 return true 22403 } 22404 // match: (EQ (CMPconst [0] (ADDconst [c] x)) yes no) 22405 // cond: 22406 // result: (EQ (CMNconst [c] x) yes no) 22407 for { 22408 v := b.Control 22409 if v.Op != OpARMCMPconst { 22410 break 22411 } 22412 if v.AuxInt != 0 { 22413 break 22414 } 22415 v_0 := v.Args[0] 22416 if v_0.Op != OpARMADDconst { 22417 break 22418 } 22419 c := v_0.AuxInt 22420 x := v_0.Args[0] 22421 b.Kind = BlockARMEQ 22422 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 22423 v0.AuxInt = c 22424 v0.AddArg(x) 22425 b.SetControl(v0) 22426 b.Aux = nil 22427 return true 22428 } 22429 // match: (EQ (CMPconst [0] (ADDshiftLL x y [c])) yes no) 22430 // cond: 22431 // result: (EQ (CMNshiftLL x y [c]) yes no) 22432 for { 22433 v := b.Control 22434 if v.Op != OpARMCMPconst { 22435 break 22436 } 22437 if v.AuxInt != 0 { 22438 break 22439 } 22440 v_0 := v.Args[0] 22441 if v_0.Op != OpARMADDshiftLL { 22442 break 22443 } 22444 c := v_0.AuxInt 22445 _ = v_0.Args[1] 22446 x := v_0.Args[0] 22447 y := v_0.Args[1] 22448 b.Kind = BlockARMEQ 22449 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 22450 v0.AuxInt = c 22451 v0.AddArg(x) 22452 v0.AddArg(y) 22453 b.SetControl(v0) 22454 b.Aux = nil 22455 return true 22456 } 22457 // match: (EQ (CMPconst [0] (ADDshiftRL x y [c])) yes no) 22458 // cond: 22459 // result: (EQ (CMNshiftRL x y [c]) yes no) 22460 for { 22461 v := b.Control 22462 if v.Op != OpARMCMPconst { 22463 break 22464 } 22465 if v.AuxInt != 0 { 22466 break 22467 } 22468 v_0 := v.Args[0] 22469 if v_0.Op != OpARMADDshiftRL { 22470 break 22471 } 22472 c := v_0.AuxInt 22473 _ = v_0.Args[1] 22474 x := v_0.Args[0] 22475 y := v_0.Args[1] 22476 b.Kind = BlockARMEQ 22477 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 22478 v0.AuxInt = c 22479 v0.AddArg(x) 22480 v0.AddArg(y) 22481 b.SetControl(v0) 22482 b.Aux = nil 22483 return true 22484 } 22485 // match: (EQ (CMPconst [0] (ADDshiftRA x y [c])) yes no) 22486 // cond: 22487 // result: (EQ (CMNshiftRA x y [c]) yes no) 22488 for { 22489 v := b.Control 22490 if v.Op != OpARMCMPconst { 22491 break 22492 } 22493 if v.AuxInt != 0 { 22494 break 22495 } 22496 v_0 := v.Args[0] 22497 if v_0.Op != OpARMADDshiftRA { 22498 break 22499 } 22500 c := v_0.AuxInt 22501 _ = v_0.Args[1] 22502 x := v_0.Args[0] 22503 y := v_0.Args[1] 22504 b.Kind = BlockARMEQ 22505 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 22506 v0.AuxInt = c 22507 v0.AddArg(x) 22508 v0.AddArg(y) 22509 b.SetControl(v0) 22510 b.Aux = nil 22511 return true 22512 } 22513 // match: (EQ (CMPconst [0] (ADDshiftLLreg x y z)) yes no) 22514 // cond: 22515 // result: (EQ (CMNshiftLLreg x y z) yes no) 22516 for { 22517 v := b.Control 22518 if v.Op != OpARMCMPconst { 22519 break 22520 } 22521 if v.AuxInt != 0 { 22522 break 22523 } 22524 v_0 := v.Args[0] 22525 if v_0.Op != OpARMADDshiftLLreg { 22526 break 22527 } 22528 _ = v_0.Args[2] 22529 x := v_0.Args[0] 22530 y := v_0.Args[1] 22531 z := v_0.Args[2] 22532 b.Kind = BlockARMEQ 22533 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 22534 v0.AddArg(x) 22535 v0.AddArg(y) 22536 v0.AddArg(z) 22537 b.SetControl(v0) 22538 b.Aux = nil 22539 return true 22540 } 22541 // match: (EQ (CMPconst [0] (ADDshiftRLreg x y z)) yes no) 22542 // cond: 22543 // result: (EQ (CMNshiftRLreg x y z) yes no) 22544 for { 22545 v := b.Control 22546 if v.Op != OpARMCMPconst { 22547 break 22548 } 22549 if v.AuxInt != 0 { 22550 break 22551 } 22552 v_0 := v.Args[0] 22553 if v_0.Op != OpARMADDshiftRLreg { 22554 break 22555 } 22556 _ = v_0.Args[2] 22557 x := v_0.Args[0] 22558 y := v_0.Args[1] 22559 z := v_0.Args[2] 22560 b.Kind = BlockARMEQ 22561 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 22562 v0.AddArg(x) 22563 v0.AddArg(y) 22564 v0.AddArg(z) 22565 b.SetControl(v0) 22566 b.Aux = nil 22567 return true 22568 } 22569 // match: (EQ (CMPconst [0] (ADDshiftRAreg x y z)) yes no) 22570 // cond: 22571 // result: (EQ (CMNshiftRAreg x y z) yes no) 22572 for { 22573 v := b.Control 22574 if v.Op != OpARMCMPconst { 22575 break 22576 } 22577 if v.AuxInt != 0 { 22578 break 22579 } 22580 v_0 := v.Args[0] 22581 if v_0.Op != OpARMADDshiftRAreg { 22582 break 22583 } 22584 _ = v_0.Args[2] 22585 x := v_0.Args[0] 22586 y := v_0.Args[1] 22587 z := v_0.Args[2] 22588 b.Kind = BlockARMEQ 22589 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 22590 v0.AddArg(x) 22591 v0.AddArg(y) 22592 v0.AddArg(z) 22593 b.SetControl(v0) 22594 b.Aux = nil 22595 return true 22596 } 22597 // match: (EQ (CMPconst [0] (AND x y)) yes no) 22598 // cond: 22599 // result: (EQ (TST x y) yes no) 22600 for { 22601 v := b.Control 22602 if v.Op != OpARMCMPconst { 22603 break 22604 } 22605 if v.AuxInt != 0 { 22606 break 22607 } 22608 v_0 := v.Args[0] 22609 if v_0.Op != OpARMAND { 22610 break 22611 } 22612 _ = v_0.Args[1] 22613 x := v_0.Args[0] 22614 y := v_0.Args[1] 22615 b.Kind = BlockARMEQ 22616 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 22617 v0.AddArg(x) 22618 v0.AddArg(y) 22619 b.SetControl(v0) 22620 b.Aux = nil 22621 return true 22622 } 22623 // match: (EQ (CMPconst [0] (ANDconst [c] x)) yes no) 22624 // cond: 22625 // result: (EQ (TSTconst [c] x) yes no) 22626 for { 22627 v := b.Control 22628 if v.Op != OpARMCMPconst { 22629 break 22630 } 22631 if v.AuxInt != 0 { 22632 break 22633 } 22634 v_0 := v.Args[0] 22635 if v_0.Op != OpARMANDconst { 22636 break 22637 } 22638 c := v_0.AuxInt 22639 x := v_0.Args[0] 22640 b.Kind = BlockARMEQ 22641 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 22642 v0.AuxInt = c 22643 v0.AddArg(x) 22644 b.SetControl(v0) 22645 b.Aux = nil 22646 return true 22647 } 22648 // match: (EQ (CMPconst [0] (ANDshiftLL x y [c])) yes no) 22649 // cond: 22650 // result: (EQ (TSTshiftLL x y [c]) yes no) 22651 for { 22652 v := b.Control 22653 if v.Op != OpARMCMPconst { 22654 break 22655 } 22656 if v.AuxInt != 0 { 22657 break 22658 } 22659 v_0 := v.Args[0] 22660 if v_0.Op != OpARMANDshiftLL { 22661 break 22662 } 22663 c := v_0.AuxInt 22664 _ = v_0.Args[1] 22665 x := v_0.Args[0] 22666 y := v_0.Args[1] 22667 b.Kind = BlockARMEQ 22668 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 22669 v0.AuxInt = c 22670 v0.AddArg(x) 22671 v0.AddArg(y) 22672 b.SetControl(v0) 22673 b.Aux = nil 22674 return true 22675 } 22676 // match: (EQ (CMPconst [0] (ANDshiftRL x y [c])) yes no) 22677 // cond: 22678 // result: (EQ (TSTshiftRL x y [c]) yes no) 22679 for { 22680 v := b.Control 22681 if v.Op != OpARMCMPconst { 22682 break 22683 } 22684 if v.AuxInt != 0 { 22685 break 22686 } 22687 v_0 := v.Args[0] 22688 if v_0.Op != OpARMANDshiftRL { 22689 break 22690 } 22691 c := v_0.AuxInt 22692 _ = v_0.Args[1] 22693 x := v_0.Args[0] 22694 y := v_0.Args[1] 22695 b.Kind = BlockARMEQ 22696 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 22697 v0.AuxInt = c 22698 v0.AddArg(x) 22699 v0.AddArg(y) 22700 b.SetControl(v0) 22701 b.Aux = nil 22702 return true 22703 } 22704 // match: (EQ (CMPconst [0] (ANDshiftRA x y [c])) yes no) 22705 // cond: 22706 // result: (EQ (TSTshiftRA x y [c]) yes no) 22707 for { 22708 v := b.Control 22709 if v.Op != OpARMCMPconst { 22710 break 22711 } 22712 if v.AuxInt != 0 { 22713 break 22714 } 22715 v_0 := v.Args[0] 22716 if v_0.Op != OpARMANDshiftRA { 22717 break 22718 } 22719 c := v_0.AuxInt 22720 _ = v_0.Args[1] 22721 x := v_0.Args[0] 22722 y := v_0.Args[1] 22723 b.Kind = BlockARMEQ 22724 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 22725 v0.AuxInt = c 22726 v0.AddArg(x) 22727 v0.AddArg(y) 22728 b.SetControl(v0) 22729 b.Aux = nil 22730 return true 22731 } 22732 // match: (EQ (CMPconst [0] (ANDshiftLLreg x y z)) yes no) 22733 // cond: 22734 // result: (EQ (TSTshiftLLreg x y z) yes no) 22735 for { 22736 v := b.Control 22737 if v.Op != OpARMCMPconst { 22738 break 22739 } 22740 if v.AuxInt != 0 { 22741 break 22742 } 22743 v_0 := v.Args[0] 22744 if v_0.Op != OpARMANDshiftLLreg { 22745 break 22746 } 22747 _ = v_0.Args[2] 22748 x := v_0.Args[0] 22749 y := v_0.Args[1] 22750 z := v_0.Args[2] 22751 b.Kind = BlockARMEQ 22752 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 22753 v0.AddArg(x) 22754 v0.AddArg(y) 22755 v0.AddArg(z) 22756 b.SetControl(v0) 22757 b.Aux = nil 22758 return true 22759 } 22760 // match: (EQ (CMPconst [0] (ANDshiftRLreg x y z)) yes no) 22761 // cond: 22762 // result: (EQ (TSTshiftRLreg x y z) yes no) 22763 for { 22764 v := b.Control 22765 if v.Op != OpARMCMPconst { 22766 break 22767 } 22768 if v.AuxInt != 0 { 22769 break 22770 } 22771 v_0 := v.Args[0] 22772 if v_0.Op != OpARMANDshiftRLreg { 22773 break 22774 } 22775 _ = v_0.Args[2] 22776 x := v_0.Args[0] 22777 y := v_0.Args[1] 22778 z := v_0.Args[2] 22779 b.Kind = BlockARMEQ 22780 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 22781 v0.AddArg(x) 22782 v0.AddArg(y) 22783 v0.AddArg(z) 22784 b.SetControl(v0) 22785 b.Aux = nil 22786 return true 22787 } 22788 // match: (EQ (CMPconst [0] (ANDshiftRAreg x y z)) yes no) 22789 // cond: 22790 // result: (EQ (TSTshiftRAreg x y z) yes no) 22791 for { 22792 v := b.Control 22793 if v.Op != OpARMCMPconst { 22794 break 22795 } 22796 if v.AuxInt != 0 { 22797 break 22798 } 22799 v_0 := v.Args[0] 22800 if v_0.Op != OpARMANDshiftRAreg { 22801 break 22802 } 22803 _ = v_0.Args[2] 22804 x := v_0.Args[0] 22805 y := v_0.Args[1] 22806 z := v_0.Args[2] 22807 b.Kind = BlockARMEQ 22808 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 22809 v0.AddArg(x) 22810 v0.AddArg(y) 22811 v0.AddArg(z) 22812 b.SetControl(v0) 22813 b.Aux = nil 22814 return true 22815 } 22816 // match: (EQ (CMPconst [0] (XOR x y)) yes no) 22817 // cond: 22818 // result: (EQ (TEQ x y) yes no) 22819 for { 22820 v := b.Control 22821 if v.Op != OpARMCMPconst { 22822 break 22823 } 22824 if v.AuxInt != 0 { 22825 break 22826 } 22827 v_0 := v.Args[0] 22828 if v_0.Op != OpARMXOR { 22829 break 22830 } 22831 _ = v_0.Args[1] 22832 x := v_0.Args[0] 22833 y := v_0.Args[1] 22834 b.Kind = BlockARMEQ 22835 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 22836 v0.AddArg(x) 22837 v0.AddArg(y) 22838 b.SetControl(v0) 22839 b.Aux = nil 22840 return true 22841 } 22842 // match: (EQ (CMPconst [0] (XORconst [c] x)) yes no) 22843 // cond: 22844 // result: (EQ (TEQconst [c] x) yes no) 22845 for { 22846 v := b.Control 22847 if v.Op != OpARMCMPconst { 22848 break 22849 } 22850 if v.AuxInt != 0 { 22851 break 22852 } 22853 v_0 := v.Args[0] 22854 if v_0.Op != OpARMXORconst { 22855 break 22856 } 22857 c := v_0.AuxInt 22858 x := v_0.Args[0] 22859 b.Kind = BlockARMEQ 22860 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 22861 v0.AuxInt = c 22862 v0.AddArg(x) 22863 b.SetControl(v0) 22864 b.Aux = nil 22865 return true 22866 } 22867 // match: (EQ (CMPconst [0] (XORshiftLL x y [c])) yes no) 22868 // cond: 22869 // result: (EQ (TEQshiftLL x y [c]) yes no) 22870 for { 22871 v := b.Control 22872 if v.Op != OpARMCMPconst { 22873 break 22874 } 22875 if v.AuxInt != 0 { 22876 break 22877 } 22878 v_0 := v.Args[0] 22879 if v_0.Op != OpARMXORshiftLL { 22880 break 22881 } 22882 c := v_0.AuxInt 22883 _ = v_0.Args[1] 22884 x := v_0.Args[0] 22885 y := v_0.Args[1] 22886 b.Kind = BlockARMEQ 22887 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 22888 v0.AuxInt = c 22889 v0.AddArg(x) 22890 v0.AddArg(y) 22891 b.SetControl(v0) 22892 b.Aux = nil 22893 return true 22894 } 22895 // match: (EQ (CMPconst [0] (XORshiftRL x y [c])) yes no) 22896 // cond: 22897 // result: (EQ (TEQshiftRL x y [c]) yes no) 22898 for { 22899 v := b.Control 22900 if v.Op != OpARMCMPconst { 22901 break 22902 } 22903 if v.AuxInt != 0 { 22904 break 22905 } 22906 v_0 := v.Args[0] 22907 if v_0.Op != OpARMXORshiftRL { 22908 break 22909 } 22910 c := v_0.AuxInt 22911 _ = v_0.Args[1] 22912 x := v_0.Args[0] 22913 y := v_0.Args[1] 22914 b.Kind = BlockARMEQ 22915 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 22916 v0.AuxInt = c 22917 v0.AddArg(x) 22918 v0.AddArg(y) 22919 b.SetControl(v0) 22920 b.Aux = nil 22921 return true 22922 } 22923 // match: (EQ (CMPconst [0] (XORshiftRA x y [c])) yes no) 22924 // cond: 22925 // result: (EQ (TEQshiftRA x y [c]) yes no) 22926 for { 22927 v := b.Control 22928 if v.Op != OpARMCMPconst { 22929 break 22930 } 22931 if v.AuxInt != 0 { 22932 break 22933 } 22934 v_0 := v.Args[0] 22935 if v_0.Op != OpARMXORshiftRA { 22936 break 22937 } 22938 c := v_0.AuxInt 22939 _ = v_0.Args[1] 22940 x := v_0.Args[0] 22941 y := v_0.Args[1] 22942 b.Kind = BlockARMEQ 22943 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 22944 v0.AuxInt = c 22945 v0.AddArg(x) 22946 v0.AddArg(y) 22947 b.SetControl(v0) 22948 b.Aux = nil 22949 return true 22950 } 22951 // match: (EQ (CMPconst [0] (XORshiftLLreg x y z)) yes no) 22952 // cond: 22953 // result: (EQ (TEQshiftLLreg x y z) yes no) 22954 for { 22955 v := b.Control 22956 if v.Op != OpARMCMPconst { 22957 break 22958 } 22959 if v.AuxInt != 0 { 22960 break 22961 } 22962 v_0 := v.Args[0] 22963 if v_0.Op != OpARMXORshiftLLreg { 22964 break 22965 } 22966 _ = v_0.Args[2] 22967 x := v_0.Args[0] 22968 y := v_0.Args[1] 22969 z := v_0.Args[2] 22970 b.Kind = BlockARMEQ 22971 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 22972 v0.AddArg(x) 22973 v0.AddArg(y) 22974 v0.AddArg(z) 22975 b.SetControl(v0) 22976 b.Aux = nil 22977 return true 22978 } 22979 // match: (EQ (CMPconst [0] (XORshiftRLreg x y z)) yes no) 22980 // cond: 22981 // result: (EQ (TEQshiftRLreg x y z) yes no) 22982 for { 22983 v := b.Control 22984 if v.Op != OpARMCMPconst { 22985 break 22986 } 22987 if v.AuxInt != 0 { 22988 break 22989 } 22990 v_0 := v.Args[0] 22991 if v_0.Op != OpARMXORshiftRLreg { 22992 break 22993 } 22994 _ = v_0.Args[2] 22995 x := v_0.Args[0] 22996 y := v_0.Args[1] 22997 z := v_0.Args[2] 22998 b.Kind = BlockARMEQ 22999 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 23000 v0.AddArg(x) 23001 v0.AddArg(y) 23002 v0.AddArg(z) 23003 b.SetControl(v0) 23004 b.Aux = nil 23005 return true 23006 } 23007 // match: (EQ (CMPconst [0] (XORshiftRAreg x y z)) yes no) 23008 // cond: 23009 // result: (EQ (TEQshiftRAreg x y z) yes no) 23010 for { 23011 v := b.Control 23012 if v.Op != OpARMCMPconst { 23013 break 23014 } 23015 if v.AuxInt != 0 { 23016 break 23017 } 23018 v_0 := v.Args[0] 23019 if v_0.Op != OpARMXORshiftRAreg { 23020 break 23021 } 23022 _ = v_0.Args[2] 23023 x := v_0.Args[0] 23024 y := v_0.Args[1] 23025 z := v_0.Args[2] 23026 b.Kind = BlockARMEQ 23027 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 23028 v0.AddArg(x) 23029 v0.AddArg(y) 23030 v0.AddArg(z) 23031 b.SetControl(v0) 23032 b.Aux = nil 23033 return true 23034 } 23035 case BlockARMGE: 23036 // match: (GE (FlagEQ) yes no) 23037 // cond: 23038 // result: (First nil yes no) 23039 for { 23040 v := b.Control 23041 if v.Op != OpARMFlagEQ { 23042 break 23043 } 23044 b.Kind = BlockFirst 23045 b.SetControl(nil) 23046 b.Aux = nil 23047 return true 23048 } 23049 // match: (GE (FlagLT_ULT) yes no) 23050 // cond: 23051 // result: (First nil no yes) 23052 for { 23053 v := b.Control 23054 if v.Op != OpARMFlagLT_ULT { 23055 break 23056 } 23057 b.Kind = BlockFirst 23058 b.SetControl(nil) 23059 b.Aux = nil 23060 b.swapSuccessors() 23061 return true 23062 } 23063 // match: (GE (FlagLT_UGT) yes no) 23064 // cond: 23065 // result: (First nil no yes) 23066 for { 23067 v := b.Control 23068 if v.Op != OpARMFlagLT_UGT { 23069 break 23070 } 23071 b.Kind = BlockFirst 23072 b.SetControl(nil) 23073 b.Aux = nil 23074 b.swapSuccessors() 23075 return true 23076 } 23077 // match: (GE (FlagGT_ULT) yes no) 23078 // cond: 23079 // result: (First nil yes no) 23080 for { 23081 v := b.Control 23082 if v.Op != OpARMFlagGT_ULT { 23083 break 23084 } 23085 b.Kind = BlockFirst 23086 b.SetControl(nil) 23087 b.Aux = nil 23088 return true 23089 } 23090 // match: (GE (FlagGT_UGT) yes no) 23091 // cond: 23092 // result: (First nil yes no) 23093 for { 23094 v := b.Control 23095 if v.Op != OpARMFlagGT_UGT { 23096 break 23097 } 23098 b.Kind = BlockFirst 23099 b.SetControl(nil) 23100 b.Aux = nil 23101 return true 23102 } 23103 // match: (GE (InvertFlags cmp) yes no) 23104 // cond: 23105 // result: (LE cmp yes no) 23106 for { 23107 v := b.Control 23108 if v.Op != OpARMInvertFlags { 23109 break 23110 } 23111 cmp := v.Args[0] 23112 b.Kind = BlockARMLE 23113 b.SetControl(cmp) 23114 b.Aux = nil 23115 return true 23116 } 23117 case BlockARMGT: 23118 // match: (GT (FlagEQ) yes no) 23119 // cond: 23120 // result: (First nil no yes) 23121 for { 23122 v := b.Control 23123 if v.Op != OpARMFlagEQ { 23124 break 23125 } 23126 b.Kind = BlockFirst 23127 b.SetControl(nil) 23128 b.Aux = nil 23129 b.swapSuccessors() 23130 return true 23131 } 23132 // match: (GT (FlagLT_ULT) yes no) 23133 // cond: 23134 // result: (First nil no yes) 23135 for { 23136 v := b.Control 23137 if v.Op != OpARMFlagLT_ULT { 23138 break 23139 } 23140 b.Kind = BlockFirst 23141 b.SetControl(nil) 23142 b.Aux = nil 23143 b.swapSuccessors() 23144 return true 23145 } 23146 // match: (GT (FlagLT_UGT) yes no) 23147 // cond: 23148 // result: (First nil no yes) 23149 for { 23150 v := b.Control 23151 if v.Op != OpARMFlagLT_UGT { 23152 break 23153 } 23154 b.Kind = BlockFirst 23155 b.SetControl(nil) 23156 b.Aux = nil 23157 b.swapSuccessors() 23158 return true 23159 } 23160 // match: (GT (FlagGT_ULT) yes no) 23161 // cond: 23162 // result: (First nil yes no) 23163 for { 23164 v := b.Control 23165 if v.Op != OpARMFlagGT_ULT { 23166 break 23167 } 23168 b.Kind = BlockFirst 23169 b.SetControl(nil) 23170 b.Aux = nil 23171 return true 23172 } 23173 // match: (GT (FlagGT_UGT) yes no) 23174 // cond: 23175 // result: (First nil yes no) 23176 for { 23177 v := b.Control 23178 if v.Op != OpARMFlagGT_UGT { 23179 break 23180 } 23181 b.Kind = BlockFirst 23182 b.SetControl(nil) 23183 b.Aux = nil 23184 return true 23185 } 23186 // match: (GT (InvertFlags cmp) yes no) 23187 // cond: 23188 // result: (LT cmp yes no) 23189 for { 23190 v := b.Control 23191 if v.Op != OpARMInvertFlags { 23192 break 23193 } 23194 cmp := v.Args[0] 23195 b.Kind = BlockARMLT 23196 b.SetControl(cmp) 23197 b.Aux = nil 23198 return true 23199 } 23200 case BlockIf: 23201 // match: (If (Equal cc) yes no) 23202 // cond: 23203 // result: (EQ cc yes no) 23204 for { 23205 v := b.Control 23206 if v.Op != OpARMEqual { 23207 break 23208 } 23209 cc := v.Args[0] 23210 b.Kind = BlockARMEQ 23211 b.SetControl(cc) 23212 b.Aux = nil 23213 return true 23214 } 23215 // match: (If (NotEqual cc) yes no) 23216 // cond: 23217 // result: (NE cc yes no) 23218 for { 23219 v := b.Control 23220 if v.Op != OpARMNotEqual { 23221 break 23222 } 23223 cc := v.Args[0] 23224 b.Kind = BlockARMNE 23225 b.SetControl(cc) 23226 b.Aux = nil 23227 return true 23228 } 23229 // match: (If (LessThan cc) yes no) 23230 // cond: 23231 // result: (LT cc yes no) 23232 for { 23233 v := b.Control 23234 if v.Op != OpARMLessThan { 23235 break 23236 } 23237 cc := v.Args[0] 23238 b.Kind = BlockARMLT 23239 b.SetControl(cc) 23240 b.Aux = nil 23241 return true 23242 } 23243 // match: (If (LessThanU cc) yes no) 23244 // cond: 23245 // result: (ULT cc yes no) 23246 for { 23247 v := b.Control 23248 if v.Op != OpARMLessThanU { 23249 break 23250 } 23251 cc := v.Args[0] 23252 b.Kind = BlockARMULT 23253 b.SetControl(cc) 23254 b.Aux = nil 23255 return true 23256 } 23257 // match: (If (LessEqual cc) yes no) 23258 // cond: 23259 // result: (LE cc yes no) 23260 for { 23261 v := b.Control 23262 if v.Op != OpARMLessEqual { 23263 break 23264 } 23265 cc := v.Args[0] 23266 b.Kind = BlockARMLE 23267 b.SetControl(cc) 23268 b.Aux = nil 23269 return true 23270 } 23271 // match: (If (LessEqualU cc) yes no) 23272 // cond: 23273 // result: (ULE cc yes no) 23274 for { 23275 v := b.Control 23276 if v.Op != OpARMLessEqualU { 23277 break 23278 } 23279 cc := v.Args[0] 23280 b.Kind = BlockARMULE 23281 b.SetControl(cc) 23282 b.Aux = nil 23283 return true 23284 } 23285 // match: (If (GreaterThan cc) yes no) 23286 // cond: 23287 // result: (GT cc yes no) 23288 for { 23289 v := b.Control 23290 if v.Op != OpARMGreaterThan { 23291 break 23292 } 23293 cc := v.Args[0] 23294 b.Kind = BlockARMGT 23295 b.SetControl(cc) 23296 b.Aux = nil 23297 return true 23298 } 23299 // match: (If (GreaterThanU cc) yes no) 23300 // cond: 23301 // result: (UGT cc yes no) 23302 for { 23303 v := b.Control 23304 if v.Op != OpARMGreaterThanU { 23305 break 23306 } 23307 cc := v.Args[0] 23308 b.Kind = BlockARMUGT 23309 b.SetControl(cc) 23310 b.Aux = nil 23311 return true 23312 } 23313 // match: (If (GreaterEqual cc) yes no) 23314 // cond: 23315 // result: (GE cc yes no) 23316 for { 23317 v := b.Control 23318 if v.Op != OpARMGreaterEqual { 23319 break 23320 } 23321 cc := v.Args[0] 23322 b.Kind = BlockARMGE 23323 b.SetControl(cc) 23324 b.Aux = nil 23325 return true 23326 } 23327 // match: (If (GreaterEqualU cc) yes no) 23328 // cond: 23329 // result: (UGE cc yes no) 23330 for { 23331 v := b.Control 23332 if v.Op != OpARMGreaterEqualU { 23333 break 23334 } 23335 cc := v.Args[0] 23336 b.Kind = BlockARMUGE 23337 b.SetControl(cc) 23338 b.Aux = nil 23339 return true 23340 } 23341 // match: (If cond yes no) 23342 // cond: 23343 // result: (NE (CMPconst [0] cond) yes no) 23344 for { 23345 v := b.Control 23346 _ = v 23347 cond := b.Control 23348 b.Kind = BlockARMNE 23349 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 23350 v0.AuxInt = 0 23351 v0.AddArg(cond) 23352 b.SetControl(v0) 23353 b.Aux = nil 23354 return true 23355 } 23356 case BlockARMLE: 23357 // match: (LE (FlagEQ) yes no) 23358 // cond: 23359 // result: (First nil yes no) 23360 for { 23361 v := b.Control 23362 if v.Op != OpARMFlagEQ { 23363 break 23364 } 23365 b.Kind = BlockFirst 23366 b.SetControl(nil) 23367 b.Aux = nil 23368 return true 23369 } 23370 // match: (LE (FlagLT_ULT) yes no) 23371 // cond: 23372 // result: (First nil yes no) 23373 for { 23374 v := b.Control 23375 if v.Op != OpARMFlagLT_ULT { 23376 break 23377 } 23378 b.Kind = BlockFirst 23379 b.SetControl(nil) 23380 b.Aux = nil 23381 return true 23382 } 23383 // match: (LE (FlagLT_UGT) yes no) 23384 // cond: 23385 // result: (First nil yes no) 23386 for { 23387 v := b.Control 23388 if v.Op != OpARMFlagLT_UGT { 23389 break 23390 } 23391 b.Kind = BlockFirst 23392 b.SetControl(nil) 23393 b.Aux = nil 23394 return true 23395 } 23396 // match: (LE (FlagGT_ULT) yes no) 23397 // cond: 23398 // result: (First nil no yes) 23399 for { 23400 v := b.Control 23401 if v.Op != OpARMFlagGT_ULT { 23402 break 23403 } 23404 b.Kind = BlockFirst 23405 b.SetControl(nil) 23406 b.Aux = nil 23407 b.swapSuccessors() 23408 return true 23409 } 23410 // match: (LE (FlagGT_UGT) yes no) 23411 // cond: 23412 // result: (First nil no yes) 23413 for { 23414 v := b.Control 23415 if v.Op != OpARMFlagGT_UGT { 23416 break 23417 } 23418 b.Kind = BlockFirst 23419 b.SetControl(nil) 23420 b.Aux = nil 23421 b.swapSuccessors() 23422 return true 23423 } 23424 // match: (LE (InvertFlags cmp) yes no) 23425 // cond: 23426 // result: (GE cmp yes no) 23427 for { 23428 v := b.Control 23429 if v.Op != OpARMInvertFlags { 23430 break 23431 } 23432 cmp := v.Args[0] 23433 b.Kind = BlockARMGE 23434 b.SetControl(cmp) 23435 b.Aux = nil 23436 return true 23437 } 23438 case BlockARMLT: 23439 // match: (LT (FlagEQ) yes no) 23440 // cond: 23441 // result: (First nil no yes) 23442 for { 23443 v := b.Control 23444 if v.Op != OpARMFlagEQ { 23445 break 23446 } 23447 b.Kind = BlockFirst 23448 b.SetControl(nil) 23449 b.Aux = nil 23450 b.swapSuccessors() 23451 return true 23452 } 23453 // match: (LT (FlagLT_ULT) yes no) 23454 // cond: 23455 // result: (First nil yes no) 23456 for { 23457 v := b.Control 23458 if v.Op != OpARMFlagLT_ULT { 23459 break 23460 } 23461 b.Kind = BlockFirst 23462 b.SetControl(nil) 23463 b.Aux = nil 23464 return true 23465 } 23466 // match: (LT (FlagLT_UGT) yes no) 23467 // cond: 23468 // result: (First nil yes no) 23469 for { 23470 v := b.Control 23471 if v.Op != OpARMFlagLT_UGT { 23472 break 23473 } 23474 b.Kind = BlockFirst 23475 b.SetControl(nil) 23476 b.Aux = nil 23477 return true 23478 } 23479 // match: (LT (FlagGT_ULT) yes no) 23480 // cond: 23481 // result: (First nil no yes) 23482 for { 23483 v := b.Control 23484 if v.Op != OpARMFlagGT_ULT { 23485 break 23486 } 23487 b.Kind = BlockFirst 23488 b.SetControl(nil) 23489 b.Aux = nil 23490 b.swapSuccessors() 23491 return true 23492 } 23493 // match: (LT (FlagGT_UGT) yes no) 23494 // cond: 23495 // result: (First nil no yes) 23496 for { 23497 v := b.Control 23498 if v.Op != OpARMFlagGT_UGT { 23499 break 23500 } 23501 b.Kind = BlockFirst 23502 b.SetControl(nil) 23503 b.Aux = nil 23504 b.swapSuccessors() 23505 return true 23506 } 23507 // match: (LT (InvertFlags cmp) yes no) 23508 // cond: 23509 // result: (GT cmp yes no) 23510 for { 23511 v := b.Control 23512 if v.Op != OpARMInvertFlags { 23513 break 23514 } 23515 cmp := v.Args[0] 23516 b.Kind = BlockARMGT 23517 b.SetControl(cmp) 23518 b.Aux = nil 23519 return true 23520 } 23521 case BlockARMNE: 23522 // match: (NE (CMPconst [0] (Equal cc)) yes no) 23523 // cond: 23524 // result: (EQ cc yes no) 23525 for { 23526 v := b.Control 23527 if v.Op != OpARMCMPconst { 23528 break 23529 } 23530 if v.AuxInt != 0 { 23531 break 23532 } 23533 v_0 := v.Args[0] 23534 if v_0.Op != OpARMEqual { 23535 break 23536 } 23537 cc := v_0.Args[0] 23538 b.Kind = BlockARMEQ 23539 b.SetControl(cc) 23540 b.Aux = nil 23541 return true 23542 } 23543 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 23544 // cond: 23545 // result: (NE cc yes no) 23546 for { 23547 v := b.Control 23548 if v.Op != OpARMCMPconst { 23549 break 23550 } 23551 if v.AuxInt != 0 { 23552 break 23553 } 23554 v_0 := v.Args[0] 23555 if v_0.Op != OpARMNotEqual { 23556 break 23557 } 23558 cc := v_0.Args[0] 23559 b.Kind = BlockARMNE 23560 b.SetControl(cc) 23561 b.Aux = nil 23562 return true 23563 } 23564 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 23565 // cond: 23566 // result: (LT cc yes no) 23567 for { 23568 v := b.Control 23569 if v.Op != OpARMCMPconst { 23570 break 23571 } 23572 if v.AuxInt != 0 { 23573 break 23574 } 23575 v_0 := v.Args[0] 23576 if v_0.Op != OpARMLessThan { 23577 break 23578 } 23579 cc := v_0.Args[0] 23580 b.Kind = BlockARMLT 23581 b.SetControl(cc) 23582 b.Aux = nil 23583 return true 23584 } 23585 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 23586 // cond: 23587 // result: (ULT cc yes no) 23588 for { 23589 v := b.Control 23590 if v.Op != OpARMCMPconst { 23591 break 23592 } 23593 if v.AuxInt != 0 { 23594 break 23595 } 23596 v_0 := v.Args[0] 23597 if v_0.Op != OpARMLessThanU { 23598 break 23599 } 23600 cc := v_0.Args[0] 23601 b.Kind = BlockARMULT 23602 b.SetControl(cc) 23603 b.Aux = nil 23604 return true 23605 } 23606 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 23607 // cond: 23608 // result: (LE cc yes no) 23609 for { 23610 v := b.Control 23611 if v.Op != OpARMCMPconst { 23612 break 23613 } 23614 if v.AuxInt != 0 { 23615 break 23616 } 23617 v_0 := v.Args[0] 23618 if v_0.Op != OpARMLessEqual { 23619 break 23620 } 23621 cc := v_0.Args[0] 23622 b.Kind = BlockARMLE 23623 b.SetControl(cc) 23624 b.Aux = nil 23625 return true 23626 } 23627 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 23628 // cond: 23629 // result: (ULE cc yes no) 23630 for { 23631 v := b.Control 23632 if v.Op != OpARMCMPconst { 23633 break 23634 } 23635 if v.AuxInt != 0 { 23636 break 23637 } 23638 v_0 := v.Args[0] 23639 if v_0.Op != OpARMLessEqualU { 23640 break 23641 } 23642 cc := v_0.Args[0] 23643 b.Kind = BlockARMULE 23644 b.SetControl(cc) 23645 b.Aux = nil 23646 return true 23647 } 23648 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 23649 // cond: 23650 // result: (GT cc yes no) 23651 for { 23652 v := b.Control 23653 if v.Op != OpARMCMPconst { 23654 break 23655 } 23656 if v.AuxInt != 0 { 23657 break 23658 } 23659 v_0 := v.Args[0] 23660 if v_0.Op != OpARMGreaterThan { 23661 break 23662 } 23663 cc := v_0.Args[0] 23664 b.Kind = BlockARMGT 23665 b.SetControl(cc) 23666 b.Aux = nil 23667 return true 23668 } 23669 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 23670 // cond: 23671 // result: (UGT cc yes no) 23672 for { 23673 v := b.Control 23674 if v.Op != OpARMCMPconst { 23675 break 23676 } 23677 if v.AuxInt != 0 { 23678 break 23679 } 23680 v_0 := v.Args[0] 23681 if v_0.Op != OpARMGreaterThanU { 23682 break 23683 } 23684 cc := v_0.Args[0] 23685 b.Kind = BlockARMUGT 23686 b.SetControl(cc) 23687 b.Aux = nil 23688 return true 23689 } 23690 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 23691 // cond: 23692 // result: (GE cc yes no) 23693 for { 23694 v := b.Control 23695 if v.Op != OpARMCMPconst { 23696 break 23697 } 23698 if v.AuxInt != 0 { 23699 break 23700 } 23701 v_0 := v.Args[0] 23702 if v_0.Op != OpARMGreaterEqual { 23703 break 23704 } 23705 cc := v_0.Args[0] 23706 b.Kind = BlockARMGE 23707 b.SetControl(cc) 23708 b.Aux = nil 23709 return true 23710 } 23711 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 23712 // cond: 23713 // result: (UGE cc yes no) 23714 for { 23715 v := b.Control 23716 if v.Op != OpARMCMPconst { 23717 break 23718 } 23719 if v.AuxInt != 0 { 23720 break 23721 } 23722 v_0 := v.Args[0] 23723 if v_0.Op != OpARMGreaterEqualU { 23724 break 23725 } 23726 cc := v_0.Args[0] 23727 b.Kind = BlockARMUGE 23728 b.SetControl(cc) 23729 b.Aux = nil 23730 return true 23731 } 23732 // match: (NE (FlagEQ) yes no) 23733 // cond: 23734 // result: (First nil no yes) 23735 for { 23736 v := b.Control 23737 if v.Op != OpARMFlagEQ { 23738 break 23739 } 23740 b.Kind = BlockFirst 23741 b.SetControl(nil) 23742 b.Aux = nil 23743 b.swapSuccessors() 23744 return true 23745 } 23746 // match: (NE (FlagLT_ULT) yes no) 23747 // cond: 23748 // result: (First nil yes no) 23749 for { 23750 v := b.Control 23751 if v.Op != OpARMFlagLT_ULT { 23752 break 23753 } 23754 b.Kind = BlockFirst 23755 b.SetControl(nil) 23756 b.Aux = nil 23757 return true 23758 } 23759 // match: (NE (FlagLT_UGT) yes no) 23760 // cond: 23761 // result: (First nil yes no) 23762 for { 23763 v := b.Control 23764 if v.Op != OpARMFlagLT_UGT { 23765 break 23766 } 23767 b.Kind = BlockFirst 23768 b.SetControl(nil) 23769 b.Aux = nil 23770 return true 23771 } 23772 // match: (NE (FlagGT_ULT) yes no) 23773 // cond: 23774 // result: (First nil yes no) 23775 for { 23776 v := b.Control 23777 if v.Op != OpARMFlagGT_ULT { 23778 break 23779 } 23780 b.Kind = BlockFirst 23781 b.SetControl(nil) 23782 b.Aux = nil 23783 return true 23784 } 23785 // match: (NE (FlagGT_UGT) yes no) 23786 // cond: 23787 // result: (First nil yes no) 23788 for { 23789 v := b.Control 23790 if v.Op != OpARMFlagGT_UGT { 23791 break 23792 } 23793 b.Kind = BlockFirst 23794 b.SetControl(nil) 23795 b.Aux = nil 23796 return true 23797 } 23798 // match: (NE (InvertFlags cmp) yes no) 23799 // cond: 23800 // result: (NE cmp yes no) 23801 for { 23802 v := b.Control 23803 if v.Op != OpARMInvertFlags { 23804 break 23805 } 23806 cmp := v.Args[0] 23807 b.Kind = BlockARMNE 23808 b.SetControl(cmp) 23809 b.Aux = nil 23810 return true 23811 } 23812 // match: (NE (CMPconst [0] (SUB x y)) yes no) 23813 // cond: 23814 // result: (NE (CMP x y) yes no) 23815 for { 23816 v := b.Control 23817 if v.Op != OpARMCMPconst { 23818 break 23819 } 23820 if v.AuxInt != 0 { 23821 break 23822 } 23823 v_0 := v.Args[0] 23824 if v_0.Op != OpARMSUB { 23825 break 23826 } 23827 _ = v_0.Args[1] 23828 x := v_0.Args[0] 23829 y := v_0.Args[1] 23830 b.Kind = BlockARMNE 23831 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 23832 v0.AddArg(x) 23833 v0.AddArg(y) 23834 b.SetControl(v0) 23835 b.Aux = nil 23836 return true 23837 } 23838 // match: (NE (CMPconst [0] (SUBconst [c] x)) yes no) 23839 // cond: 23840 // result: (NE (CMPconst [c] x) yes no) 23841 for { 23842 v := b.Control 23843 if v.Op != OpARMCMPconst { 23844 break 23845 } 23846 if v.AuxInt != 0 { 23847 break 23848 } 23849 v_0 := v.Args[0] 23850 if v_0.Op != OpARMSUBconst { 23851 break 23852 } 23853 c := v_0.AuxInt 23854 x := v_0.Args[0] 23855 b.Kind = BlockARMNE 23856 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 23857 v0.AuxInt = c 23858 v0.AddArg(x) 23859 b.SetControl(v0) 23860 b.Aux = nil 23861 return true 23862 } 23863 // match: (NE (CMPconst [0] (SUBshiftLL x y [c])) yes no) 23864 // cond: 23865 // result: (NE (CMPshiftLL x y [c]) yes no) 23866 for { 23867 v := b.Control 23868 if v.Op != OpARMCMPconst { 23869 break 23870 } 23871 if v.AuxInt != 0 { 23872 break 23873 } 23874 v_0 := v.Args[0] 23875 if v_0.Op != OpARMSUBshiftLL { 23876 break 23877 } 23878 c := v_0.AuxInt 23879 _ = v_0.Args[1] 23880 x := v_0.Args[0] 23881 y := v_0.Args[1] 23882 b.Kind = BlockARMNE 23883 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 23884 v0.AuxInt = c 23885 v0.AddArg(x) 23886 v0.AddArg(y) 23887 b.SetControl(v0) 23888 b.Aux = nil 23889 return true 23890 } 23891 // match: (NE (CMPconst [0] (SUBshiftRL x y [c])) yes no) 23892 // cond: 23893 // result: (NE (CMPshiftRL x y [c]) yes no) 23894 for { 23895 v := b.Control 23896 if v.Op != OpARMCMPconst { 23897 break 23898 } 23899 if v.AuxInt != 0 { 23900 break 23901 } 23902 v_0 := v.Args[0] 23903 if v_0.Op != OpARMSUBshiftRL { 23904 break 23905 } 23906 c := v_0.AuxInt 23907 _ = v_0.Args[1] 23908 x := v_0.Args[0] 23909 y := v_0.Args[1] 23910 b.Kind = BlockARMNE 23911 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 23912 v0.AuxInt = c 23913 v0.AddArg(x) 23914 v0.AddArg(y) 23915 b.SetControl(v0) 23916 b.Aux = nil 23917 return true 23918 } 23919 // match: (NE (CMPconst [0] (SUBshiftRA x y [c])) yes no) 23920 // cond: 23921 // result: (NE (CMPshiftRA x y [c]) yes no) 23922 for { 23923 v := b.Control 23924 if v.Op != OpARMCMPconst { 23925 break 23926 } 23927 if v.AuxInt != 0 { 23928 break 23929 } 23930 v_0 := v.Args[0] 23931 if v_0.Op != OpARMSUBshiftRA { 23932 break 23933 } 23934 c := v_0.AuxInt 23935 _ = v_0.Args[1] 23936 x := v_0.Args[0] 23937 y := v_0.Args[1] 23938 b.Kind = BlockARMNE 23939 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 23940 v0.AuxInt = c 23941 v0.AddArg(x) 23942 v0.AddArg(y) 23943 b.SetControl(v0) 23944 b.Aux = nil 23945 return true 23946 } 23947 // match: (NE (CMPconst [0] (SUBshiftLLreg x y z)) yes no) 23948 // cond: 23949 // result: (NE (CMPshiftLLreg x y z) yes no) 23950 for { 23951 v := b.Control 23952 if v.Op != OpARMCMPconst { 23953 break 23954 } 23955 if v.AuxInt != 0 { 23956 break 23957 } 23958 v_0 := v.Args[0] 23959 if v_0.Op != OpARMSUBshiftLLreg { 23960 break 23961 } 23962 _ = v_0.Args[2] 23963 x := v_0.Args[0] 23964 y := v_0.Args[1] 23965 z := v_0.Args[2] 23966 b.Kind = BlockARMNE 23967 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 23968 v0.AddArg(x) 23969 v0.AddArg(y) 23970 v0.AddArg(z) 23971 b.SetControl(v0) 23972 b.Aux = nil 23973 return true 23974 } 23975 // match: (NE (CMPconst [0] (SUBshiftRLreg x y z)) yes no) 23976 // cond: 23977 // result: (NE (CMPshiftRLreg x y z) yes no) 23978 for { 23979 v := b.Control 23980 if v.Op != OpARMCMPconst { 23981 break 23982 } 23983 if v.AuxInt != 0 { 23984 break 23985 } 23986 v_0 := v.Args[0] 23987 if v_0.Op != OpARMSUBshiftRLreg { 23988 break 23989 } 23990 _ = v_0.Args[2] 23991 x := v_0.Args[0] 23992 y := v_0.Args[1] 23993 z := v_0.Args[2] 23994 b.Kind = BlockARMNE 23995 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 23996 v0.AddArg(x) 23997 v0.AddArg(y) 23998 v0.AddArg(z) 23999 b.SetControl(v0) 24000 b.Aux = nil 24001 return true 24002 } 24003 // match: (NE (CMPconst [0] (SUBshiftRAreg x y z)) yes no) 24004 // cond: 24005 // result: (NE (CMPshiftRAreg x y z) yes no) 24006 for { 24007 v := b.Control 24008 if v.Op != OpARMCMPconst { 24009 break 24010 } 24011 if v.AuxInt != 0 { 24012 break 24013 } 24014 v_0 := v.Args[0] 24015 if v_0.Op != OpARMSUBshiftRAreg { 24016 break 24017 } 24018 _ = v_0.Args[2] 24019 x := v_0.Args[0] 24020 y := v_0.Args[1] 24021 z := v_0.Args[2] 24022 b.Kind = BlockARMNE 24023 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 24024 v0.AddArg(x) 24025 v0.AddArg(y) 24026 v0.AddArg(z) 24027 b.SetControl(v0) 24028 b.Aux = nil 24029 return true 24030 } 24031 // match: (NE (CMPconst [0] (ADD x y)) yes no) 24032 // cond: 24033 // result: (NE (CMN x y) yes no) 24034 for { 24035 v := b.Control 24036 if v.Op != OpARMCMPconst { 24037 break 24038 } 24039 if v.AuxInt != 0 { 24040 break 24041 } 24042 v_0 := v.Args[0] 24043 if v_0.Op != OpARMADD { 24044 break 24045 } 24046 _ = v_0.Args[1] 24047 x := v_0.Args[0] 24048 y := v_0.Args[1] 24049 b.Kind = BlockARMNE 24050 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 24051 v0.AddArg(x) 24052 v0.AddArg(y) 24053 b.SetControl(v0) 24054 b.Aux = nil 24055 return true 24056 } 24057 // match: (NE (CMPconst [0] (ADDconst [c] x)) yes no) 24058 // cond: 24059 // result: (NE (CMNconst [c] x) yes no) 24060 for { 24061 v := b.Control 24062 if v.Op != OpARMCMPconst { 24063 break 24064 } 24065 if v.AuxInt != 0 { 24066 break 24067 } 24068 v_0 := v.Args[0] 24069 if v_0.Op != OpARMADDconst { 24070 break 24071 } 24072 c := v_0.AuxInt 24073 x := v_0.Args[0] 24074 b.Kind = BlockARMNE 24075 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 24076 v0.AuxInt = c 24077 v0.AddArg(x) 24078 b.SetControl(v0) 24079 b.Aux = nil 24080 return true 24081 } 24082 // match: (NE (CMPconst [0] (ADDshiftLL x y [c])) yes no) 24083 // cond: 24084 // result: (NE (CMNshiftLL x y [c]) yes no) 24085 for { 24086 v := b.Control 24087 if v.Op != OpARMCMPconst { 24088 break 24089 } 24090 if v.AuxInt != 0 { 24091 break 24092 } 24093 v_0 := v.Args[0] 24094 if v_0.Op != OpARMADDshiftLL { 24095 break 24096 } 24097 c := v_0.AuxInt 24098 _ = v_0.Args[1] 24099 x := v_0.Args[0] 24100 y := v_0.Args[1] 24101 b.Kind = BlockARMNE 24102 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 24103 v0.AuxInt = c 24104 v0.AddArg(x) 24105 v0.AddArg(y) 24106 b.SetControl(v0) 24107 b.Aux = nil 24108 return true 24109 } 24110 // match: (NE (CMPconst [0] (ADDshiftRL x y [c])) yes no) 24111 // cond: 24112 // result: (NE (CMNshiftRL x y [c]) yes no) 24113 for { 24114 v := b.Control 24115 if v.Op != OpARMCMPconst { 24116 break 24117 } 24118 if v.AuxInt != 0 { 24119 break 24120 } 24121 v_0 := v.Args[0] 24122 if v_0.Op != OpARMADDshiftRL { 24123 break 24124 } 24125 c := v_0.AuxInt 24126 _ = v_0.Args[1] 24127 x := v_0.Args[0] 24128 y := v_0.Args[1] 24129 b.Kind = BlockARMNE 24130 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 24131 v0.AuxInt = c 24132 v0.AddArg(x) 24133 v0.AddArg(y) 24134 b.SetControl(v0) 24135 b.Aux = nil 24136 return true 24137 } 24138 // match: (NE (CMPconst [0] (ADDshiftRA x y [c])) yes no) 24139 // cond: 24140 // result: (NE (CMNshiftRA x y [c]) yes no) 24141 for { 24142 v := b.Control 24143 if v.Op != OpARMCMPconst { 24144 break 24145 } 24146 if v.AuxInt != 0 { 24147 break 24148 } 24149 v_0 := v.Args[0] 24150 if v_0.Op != OpARMADDshiftRA { 24151 break 24152 } 24153 c := v_0.AuxInt 24154 _ = v_0.Args[1] 24155 x := v_0.Args[0] 24156 y := v_0.Args[1] 24157 b.Kind = BlockARMNE 24158 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 24159 v0.AuxInt = c 24160 v0.AddArg(x) 24161 v0.AddArg(y) 24162 b.SetControl(v0) 24163 b.Aux = nil 24164 return true 24165 } 24166 // match: (NE (CMPconst [0] (ADDshiftLLreg x y z)) yes no) 24167 // cond: 24168 // result: (NE (CMNshiftLLreg x y z) yes no) 24169 for { 24170 v := b.Control 24171 if v.Op != OpARMCMPconst { 24172 break 24173 } 24174 if v.AuxInt != 0 { 24175 break 24176 } 24177 v_0 := v.Args[0] 24178 if v_0.Op != OpARMADDshiftLLreg { 24179 break 24180 } 24181 _ = v_0.Args[2] 24182 x := v_0.Args[0] 24183 y := v_0.Args[1] 24184 z := v_0.Args[2] 24185 b.Kind = BlockARMNE 24186 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 24187 v0.AddArg(x) 24188 v0.AddArg(y) 24189 v0.AddArg(z) 24190 b.SetControl(v0) 24191 b.Aux = nil 24192 return true 24193 } 24194 // match: (NE (CMPconst [0] (ADDshiftRLreg x y z)) yes no) 24195 // cond: 24196 // result: (NE (CMNshiftRLreg x y z) yes no) 24197 for { 24198 v := b.Control 24199 if v.Op != OpARMCMPconst { 24200 break 24201 } 24202 if v.AuxInt != 0 { 24203 break 24204 } 24205 v_0 := v.Args[0] 24206 if v_0.Op != OpARMADDshiftRLreg { 24207 break 24208 } 24209 _ = v_0.Args[2] 24210 x := v_0.Args[0] 24211 y := v_0.Args[1] 24212 z := v_0.Args[2] 24213 b.Kind = BlockARMNE 24214 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 24215 v0.AddArg(x) 24216 v0.AddArg(y) 24217 v0.AddArg(z) 24218 b.SetControl(v0) 24219 b.Aux = nil 24220 return true 24221 } 24222 // match: (NE (CMPconst [0] (ADDshiftRAreg x y z)) yes no) 24223 // cond: 24224 // result: (NE (CMNshiftRAreg x y z) yes no) 24225 for { 24226 v := b.Control 24227 if v.Op != OpARMCMPconst { 24228 break 24229 } 24230 if v.AuxInt != 0 { 24231 break 24232 } 24233 v_0 := v.Args[0] 24234 if v_0.Op != OpARMADDshiftRAreg { 24235 break 24236 } 24237 _ = v_0.Args[2] 24238 x := v_0.Args[0] 24239 y := v_0.Args[1] 24240 z := v_0.Args[2] 24241 b.Kind = BlockARMNE 24242 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 24243 v0.AddArg(x) 24244 v0.AddArg(y) 24245 v0.AddArg(z) 24246 b.SetControl(v0) 24247 b.Aux = nil 24248 return true 24249 } 24250 // match: (NE (CMPconst [0] (AND x y)) yes no) 24251 // cond: 24252 // result: (NE (TST x y) yes no) 24253 for { 24254 v := b.Control 24255 if v.Op != OpARMCMPconst { 24256 break 24257 } 24258 if v.AuxInt != 0 { 24259 break 24260 } 24261 v_0 := v.Args[0] 24262 if v_0.Op != OpARMAND { 24263 break 24264 } 24265 _ = v_0.Args[1] 24266 x := v_0.Args[0] 24267 y := v_0.Args[1] 24268 b.Kind = BlockARMNE 24269 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 24270 v0.AddArg(x) 24271 v0.AddArg(y) 24272 b.SetControl(v0) 24273 b.Aux = nil 24274 return true 24275 } 24276 // match: (NE (CMPconst [0] (ANDconst [c] x)) yes no) 24277 // cond: 24278 // result: (NE (TSTconst [c] x) yes no) 24279 for { 24280 v := b.Control 24281 if v.Op != OpARMCMPconst { 24282 break 24283 } 24284 if v.AuxInt != 0 { 24285 break 24286 } 24287 v_0 := v.Args[0] 24288 if v_0.Op != OpARMANDconst { 24289 break 24290 } 24291 c := v_0.AuxInt 24292 x := v_0.Args[0] 24293 b.Kind = BlockARMNE 24294 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 24295 v0.AuxInt = c 24296 v0.AddArg(x) 24297 b.SetControl(v0) 24298 b.Aux = nil 24299 return true 24300 } 24301 // match: (NE (CMPconst [0] (ANDshiftLL x y [c])) yes no) 24302 // cond: 24303 // result: (NE (TSTshiftLL x y [c]) yes no) 24304 for { 24305 v := b.Control 24306 if v.Op != OpARMCMPconst { 24307 break 24308 } 24309 if v.AuxInt != 0 { 24310 break 24311 } 24312 v_0 := v.Args[0] 24313 if v_0.Op != OpARMANDshiftLL { 24314 break 24315 } 24316 c := v_0.AuxInt 24317 _ = v_0.Args[1] 24318 x := v_0.Args[0] 24319 y := v_0.Args[1] 24320 b.Kind = BlockARMNE 24321 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 24322 v0.AuxInt = c 24323 v0.AddArg(x) 24324 v0.AddArg(y) 24325 b.SetControl(v0) 24326 b.Aux = nil 24327 return true 24328 } 24329 // match: (NE (CMPconst [0] (ANDshiftRL x y [c])) yes no) 24330 // cond: 24331 // result: (NE (TSTshiftRL x y [c]) yes no) 24332 for { 24333 v := b.Control 24334 if v.Op != OpARMCMPconst { 24335 break 24336 } 24337 if v.AuxInt != 0 { 24338 break 24339 } 24340 v_0 := v.Args[0] 24341 if v_0.Op != OpARMANDshiftRL { 24342 break 24343 } 24344 c := v_0.AuxInt 24345 _ = v_0.Args[1] 24346 x := v_0.Args[0] 24347 y := v_0.Args[1] 24348 b.Kind = BlockARMNE 24349 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 24350 v0.AuxInt = c 24351 v0.AddArg(x) 24352 v0.AddArg(y) 24353 b.SetControl(v0) 24354 b.Aux = nil 24355 return true 24356 } 24357 // match: (NE (CMPconst [0] (ANDshiftRA x y [c])) yes no) 24358 // cond: 24359 // result: (NE (TSTshiftRA x y [c]) yes no) 24360 for { 24361 v := b.Control 24362 if v.Op != OpARMCMPconst { 24363 break 24364 } 24365 if v.AuxInt != 0 { 24366 break 24367 } 24368 v_0 := v.Args[0] 24369 if v_0.Op != OpARMANDshiftRA { 24370 break 24371 } 24372 c := v_0.AuxInt 24373 _ = v_0.Args[1] 24374 x := v_0.Args[0] 24375 y := v_0.Args[1] 24376 b.Kind = BlockARMNE 24377 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 24378 v0.AuxInt = c 24379 v0.AddArg(x) 24380 v0.AddArg(y) 24381 b.SetControl(v0) 24382 b.Aux = nil 24383 return true 24384 } 24385 // match: (NE (CMPconst [0] (ANDshiftLLreg x y z)) yes no) 24386 // cond: 24387 // result: (NE (TSTshiftLLreg x y z) yes no) 24388 for { 24389 v := b.Control 24390 if v.Op != OpARMCMPconst { 24391 break 24392 } 24393 if v.AuxInt != 0 { 24394 break 24395 } 24396 v_0 := v.Args[0] 24397 if v_0.Op != OpARMANDshiftLLreg { 24398 break 24399 } 24400 _ = v_0.Args[2] 24401 x := v_0.Args[0] 24402 y := v_0.Args[1] 24403 z := v_0.Args[2] 24404 b.Kind = BlockARMNE 24405 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 24406 v0.AddArg(x) 24407 v0.AddArg(y) 24408 v0.AddArg(z) 24409 b.SetControl(v0) 24410 b.Aux = nil 24411 return true 24412 } 24413 // match: (NE (CMPconst [0] (ANDshiftRLreg x y z)) yes no) 24414 // cond: 24415 // result: (NE (TSTshiftRLreg x y z) yes no) 24416 for { 24417 v := b.Control 24418 if v.Op != OpARMCMPconst { 24419 break 24420 } 24421 if v.AuxInt != 0 { 24422 break 24423 } 24424 v_0 := v.Args[0] 24425 if v_0.Op != OpARMANDshiftRLreg { 24426 break 24427 } 24428 _ = v_0.Args[2] 24429 x := v_0.Args[0] 24430 y := v_0.Args[1] 24431 z := v_0.Args[2] 24432 b.Kind = BlockARMNE 24433 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 24434 v0.AddArg(x) 24435 v0.AddArg(y) 24436 v0.AddArg(z) 24437 b.SetControl(v0) 24438 b.Aux = nil 24439 return true 24440 } 24441 // match: (NE (CMPconst [0] (ANDshiftRAreg x y z)) yes no) 24442 // cond: 24443 // result: (NE (TSTshiftRAreg x y z) yes no) 24444 for { 24445 v := b.Control 24446 if v.Op != OpARMCMPconst { 24447 break 24448 } 24449 if v.AuxInt != 0 { 24450 break 24451 } 24452 v_0 := v.Args[0] 24453 if v_0.Op != OpARMANDshiftRAreg { 24454 break 24455 } 24456 _ = v_0.Args[2] 24457 x := v_0.Args[0] 24458 y := v_0.Args[1] 24459 z := v_0.Args[2] 24460 b.Kind = BlockARMNE 24461 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 24462 v0.AddArg(x) 24463 v0.AddArg(y) 24464 v0.AddArg(z) 24465 b.SetControl(v0) 24466 b.Aux = nil 24467 return true 24468 } 24469 // match: (NE (CMPconst [0] (XOR x y)) yes no) 24470 // cond: 24471 // result: (NE (TEQ x y) yes no) 24472 for { 24473 v := b.Control 24474 if v.Op != OpARMCMPconst { 24475 break 24476 } 24477 if v.AuxInt != 0 { 24478 break 24479 } 24480 v_0 := v.Args[0] 24481 if v_0.Op != OpARMXOR { 24482 break 24483 } 24484 _ = v_0.Args[1] 24485 x := v_0.Args[0] 24486 y := v_0.Args[1] 24487 b.Kind = BlockARMNE 24488 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 24489 v0.AddArg(x) 24490 v0.AddArg(y) 24491 b.SetControl(v0) 24492 b.Aux = nil 24493 return true 24494 } 24495 // match: (NE (CMPconst [0] (XORconst [c] x)) yes no) 24496 // cond: 24497 // result: (NE (TEQconst [c] x) yes no) 24498 for { 24499 v := b.Control 24500 if v.Op != OpARMCMPconst { 24501 break 24502 } 24503 if v.AuxInt != 0 { 24504 break 24505 } 24506 v_0 := v.Args[0] 24507 if v_0.Op != OpARMXORconst { 24508 break 24509 } 24510 c := v_0.AuxInt 24511 x := v_0.Args[0] 24512 b.Kind = BlockARMNE 24513 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 24514 v0.AuxInt = c 24515 v0.AddArg(x) 24516 b.SetControl(v0) 24517 b.Aux = nil 24518 return true 24519 } 24520 // match: (NE (CMPconst [0] (XORshiftLL x y [c])) yes no) 24521 // cond: 24522 // result: (NE (TEQshiftLL x y [c]) yes no) 24523 for { 24524 v := b.Control 24525 if v.Op != OpARMCMPconst { 24526 break 24527 } 24528 if v.AuxInt != 0 { 24529 break 24530 } 24531 v_0 := v.Args[0] 24532 if v_0.Op != OpARMXORshiftLL { 24533 break 24534 } 24535 c := v_0.AuxInt 24536 _ = v_0.Args[1] 24537 x := v_0.Args[0] 24538 y := v_0.Args[1] 24539 b.Kind = BlockARMNE 24540 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 24541 v0.AuxInt = c 24542 v0.AddArg(x) 24543 v0.AddArg(y) 24544 b.SetControl(v0) 24545 b.Aux = nil 24546 return true 24547 } 24548 // match: (NE (CMPconst [0] (XORshiftRL x y [c])) yes no) 24549 // cond: 24550 // result: (NE (TEQshiftRL x y [c]) yes no) 24551 for { 24552 v := b.Control 24553 if v.Op != OpARMCMPconst { 24554 break 24555 } 24556 if v.AuxInt != 0 { 24557 break 24558 } 24559 v_0 := v.Args[0] 24560 if v_0.Op != OpARMXORshiftRL { 24561 break 24562 } 24563 c := v_0.AuxInt 24564 _ = v_0.Args[1] 24565 x := v_0.Args[0] 24566 y := v_0.Args[1] 24567 b.Kind = BlockARMNE 24568 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 24569 v0.AuxInt = c 24570 v0.AddArg(x) 24571 v0.AddArg(y) 24572 b.SetControl(v0) 24573 b.Aux = nil 24574 return true 24575 } 24576 // match: (NE (CMPconst [0] (XORshiftRA x y [c])) yes no) 24577 // cond: 24578 // result: (NE (TEQshiftRA x y [c]) yes no) 24579 for { 24580 v := b.Control 24581 if v.Op != OpARMCMPconst { 24582 break 24583 } 24584 if v.AuxInt != 0 { 24585 break 24586 } 24587 v_0 := v.Args[0] 24588 if v_0.Op != OpARMXORshiftRA { 24589 break 24590 } 24591 c := v_0.AuxInt 24592 _ = v_0.Args[1] 24593 x := v_0.Args[0] 24594 y := v_0.Args[1] 24595 b.Kind = BlockARMNE 24596 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 24597 v0.AuxInt = c 24598 v0.AddArg(x) 24599 v0.AddArg(y) 24600 b.SetControl(v0) 24601 b.Aux = nil 24602 return true 24603 } 24604 // match: (NE (CMPconst [0] (XORshiftLLreg x y z)) yes no) 24605 // cond: 24606 // result: (NE (TEQshiftLLreg x y z) yes no) 24607 for { 24608 v := b.Control 24609 if v.Op != OpARMCMPconst { 24610 break 24611 } 24612 if v.AuxInt != 0 { 24613 break 24614 } 24615 v_0 := v.Args[0] 24616 if v_0.Op != OpARMXORshiftLLreg { 24617 break 24618 } 24619 _ = v_0.Args[2] 24620 x := v_0.Args[0] 24621 y := v_0.Args[1] 24622 z := v_0.Args[2] 24623 b.Kind = BlockARMNE 24624 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 24625 v0.AddArg(x) 24626 v0.AddArg(y) 24627 v0.AddArg(z) 24628 b.SetControl(v0) 24629 b.Aux = nil 24630 return true 24631 } 24632 // match: (NE (CMPconst [0] (XORshiftRLreg x y z)) yes no) 24633 // cond: 24634 // result: (NE (TEQshiftRLreg x y z) yes no) 24635 for { 24636 v := b.Control 24637 if v.Op != OpARMCMPconst { 24638 break 24639 } 24640 if v.AuxInt != 0 { 24641 break 24642 } 24643 v_0 := v.Args[0] 24644 if v_0.Op != OpARMXORshiftRLreg { 24645 break 24646 } 24647 _ = v_0.Args[2] 24648 x := v_0.Args[0] 24649 y := v_0.Args[1] 24650 z := v_0.Args[2] 24651 b.Kind = BlockARMNE 24652 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 24653 v0.AddArg(x) 24654 v0.AddArg(y) 24655 v0.AddArg(z) 24656 b.SetControl(v0) 24657 b.Aux = nil 24658 return true 24659 } 24660 // match: (NE (CMPconst [0] (XORshiftRAreg x y z)) yes no) 24661 // cond: 24662 // result: (NE (TEQshiftRAreg x y z) yes no) 24663 for { 24664 v := b.Control 24665 if v.Op != OpARMCMPconst { 24666 break 24667 } 24668 if v.AuxInt != 0 { 24669 break 24670 } 24671 v_0 := v.Args[0] 24672 if v_0.Op != OpARMXORshiftRAreg { 24673 break 24674 } 24675 _ = v_0.Args[2] 24676 x := v_0.Args[0] 24677 y := v_0.Args[1] 24678 z := v_0.Args[2] 24679 b.Kind = BlockARMNE 24680 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 24681 v0.AddArg(x) 24682 v0.AddArg(y) 24683 v0.AddArg(z) 24684 b.SetControl(v0) 24685 b.Aux = nil 24686 return true 24687 } 24688 case BlockARMUGE: 24689 // match: (UGE (FlagEQ) yes no) 24690 // cond: 24691 // result: (First nil yes no) 24692 for { 24693 v := b.Control 24694 if v.Op != OpARMFlagEQ { 24695 break 24696 } 24697 b.Kind = BlockFirst 24698 b.SetControl(nil) 24699 b.Aux = nil 24700 return true 24701 } 24702 // match: (UGE (FlagLT_ULT) yes no) 24703 // cond: 24704 // result: (First nil no yes) 24705 for { 24706 v := b.Control 24707 if v.Op != OpARMFlagLT_ULT { 24708 break 24709 } 24710 b.Kind = BlockFirst 24711 b.SetControl(nil) 24712 b.Aux = nil 24713 b.swapSuccessors() 24714 return true 24715 } 24716 // match: (UGE (FlagLT_UGT) yes no) 24717 // cond: 24718 // result: (First nil yes no) 24719 for { 24720 v := b.Control 24721 if v.Op != OpARMFlagLT_UGT { 24722 break 24723 } 24724 b.Kind = BlockFirst 24725 b.SetControl(nil) 24726 b.Aux = nil 24727 return true 24728 } 24729 // match: (UGE (FlagGT_ULT) yes no) 24730 // cond: 24731 // result: (First nil no yes) 24732 for { 24733 v := b.Control 24734 if v.Op != OpARMFlagGT_ULT { 24735 break 24736 } 24737 b.Kind = BlockFirst 24738 b.SetControl(nil) 24739 b.Aux = nil 24740 b.swapSuccessors() 24741 return true 24742 } 24743 // match: (UGE (FlagGT_UGT) yes no) 24744 // cond: 24745 // result: (First nil yes no) 24746 for { 24747 v := b.Control 24748 if v.Op != OpARMFlagGT_UGT { 24749 break 24750 } 24751 b.Kind = BlockFirst 24752 b.SetControl(nil) 24753 b.Aux = nil 24754 return true 24755 } 24756 // match: (UGE (InvertFlags cmp) yes no) 24757 // cond: 24758 // result: (ULE cmp yes no) 24759 for { 24760 v := b.Control 24761 if v.Op != OpARMInvertFlags { 24762 break 24763 } 24764 cmp := v.Args[0] 24765 b.Kind = BlockARMULE 24766 b.SetControl(cmp) 24767 b.Aux = nil 24768 return true 24769 } 24770 case BlockARMUGT: 24771 // match: (UGT (FlagEQ) yes no) 24772 // cond: 24773 // result: (First nil no yes) 24774 for { 24775 v := b.Control 24776 if v.Op != OpARMFlagEQ { 24777 break 24778 } 24779 b.Kind = BlockFirst 24780 b.SetControl(nil) 24781 b.Aux = nil 24782 b.swapSuccessors() 24783 return true 24784 } 24785 // match: (UGT (FlagLT_ULT) yes no) 24786 // cond: 24787 // result: (First nil no yes) 24788 for { 24789 v := b.Control 24790 if v.Op != OpARMFlagLT_ULT { 24791 break 24792 } 24793 b.Kind = BlockFirst 24794 b.SetControl(nil) 24795 b.Aux = nil 24796 b.swapSuccessors() 24797 return true 24798 } 24799 // match: (UGT (FlagLT_UGT) yes no) 24800 // cond: 24801 // result: (First nil yes no) 24802 for { 24803 v := b.Control 24804 if v.Op != OpARMFlagLT_UGT { 24805 break 24806 } 24807 b.Kind = BlockFirst 24808 b.SetControl(nil) 24809 b.Aux = nil 24810 return true 24811 } 24812 // match: (UGT (FlagGT_ULT) yes no) 24813 // cond: 24814 // result: (First nil no yes) 24815 for { 24816 v := b.Control 24817 if v.Op != OpARMFlagGT_ULT { 24818 break 24819 } 24820 b.Kind = BlockFirst 24821 b.SetControl(nil) 24822 b.Aux = nil 24823 b.swapSuccessors() 24824 return true 24825 } 24826 // match: (UGT (FlagGT_UGT) yes no) 24827 // cond: 24828 // result: (First nil yes no) 24829 for { 24830 v := b.Control 24831 if v.Op != OpARMFlagGT_UGT { 24832 break 24833 } 24834 b.Kind = BlockFirst 24835 b.SetControl(nil) 24836 b.Aux = nil 24837 return true 24838 } 24839 // match: (UGT (InvertFlags cmp) yes no) 24840 // cond: 24841 // result: (ULT cmp yes no) 24842 for { 24843 v := b.Control 24844 if v.Op != OpARMInvertFlags { 24845 break 24846 } 24847 cmp := v.Args[0] 24848 b.Kind = BlockARMULT 24849 b.SetControl(cmp) 24850 b.Aux = nil 24851 return true 24852 } 24853 case BlockARMULE: 24854 // match: (ULE (FlagEQ) yes no) 24855 // cond: 24856 // result: (First nil yes no) 24857 for { 24858 v := b.Control 24859 if v.Op != OpARMFlagEQ { 24860 break 24861 } 24862 b.Kind = BlockFirst 24863 b.SetControl(nil) 24864 b.Aux = nil 24865 return true 24866 } 24867 // match: (ULE (FlagLT_ULT) yes no) 24868 // cond: 24869 // result: (First nil yes no) 24870 for { 24871 v := b.Control 24872 if v.Op != OpARMFlagLT_ULT { 24873 break 24874 } 24875 b.Kind = BlockFirst 24876 b.SetControl(nil) 24877 b.Aux = nil 24878 return true 24879 } 24880 // match: (ULE (FlagLT_UGT) yes no) 24881 // cond: 24882 // result: (First nil no yes) 24883 for { 24884 v := b.Control 24885 if v.Op != OpARMFlagLT_UGT { 24886 break 24887 } 24888 b.Kind = BlockFirst 24889 b.SetControl(nil) 24890 b.Aux = nil 24891 b.swapSuccessors() 24892 return true 24893 } 24894 // match: (ULE (FlagGT_ULT) yes no) 24895 // cond: 24896 // result: (First nil yes no) 24897 for { 24898 v := b.Control 24899 if v.Op != OpARMFlagGT_ULT { 24900 break 24901 } 24902 b.Kind = BlockFirst 24903 b.SetControl(nil) 24904 b.Aux = nil 24905 return true 24906 } 24907 // match: (ULE (FlagGT_UGT) yes no) 24908 // cond: 24909 // result: (First nil no yes) 24910 for { 24911 v := b.Control 24912 if v.Op != OpARMFlagGT_UGT { 24913 break 24914 } 24915 b.Kind = BlockFirst 24916 b.SetControl(nil) 24917 b.Aux = nil 24918 b.swapSuccessors() 24919 return true 24920 } 24921 // match: (ULE (InvertFlags cmp) yes no) 24922 // cond: 24923 // result: (UGE cmp yes no) 24924 for { 24925 v := b.Control 24926 if v.Op != OpARMInvertFlags { 24927 break 24928 } 24929 cmp := v.Args[0] 24930 b.Kind = BlockARMUGE 24931 b.SetControl(cmp) 24932 b.Aux = nil 24933 return true 24934 } 24935 case BlockARMULT: 24936 // match: (ULT (FlagEQ) yes no) 24937 // cond: 24938 // result: (First nil no yes) 24939 for { 24940 v := b.Control 24941 if v.Op != OpARMFlagEQ { 24942 break 24943 } 24944 b.Kind = BlockFirst 24945 b.SetControl(nil) 24946 b.Aux = nil 24947 b.swapSuccessors() 24948 return true 24949 } 24950 // match: (ULT (FlagLT_ULT) yes no) 24951 // cond: 24952 // result: (First nil yes no) 24953 for { 24954 v := b.Control 24955 if v.Op != OpARMFlagLT_ULT { 24956 break 24957 } 24958 b.Kind = BlockFirst 24959 b.SetControl(nil) 24960 b.Aux = nil 24961 return true 24962 } 24963 // match: (ULT (FlagLT_UGT) yes no) 24964 // cond: 24965 // result: (First nil no yes) 24966 for { 24967 v := b.Control 24968 if v.Op != OpARMFlagLT_UGT { 24969 break 24970 } 24971 b.Kind = BlockFirst 24972 b.SetControl(nil) 24973 b.Aux = nil 24974 b.swapSuccessors() 24975 return true 24976 } 24977 // match: (ULT (FlagGT_ULT) yes no) 24978 // cond: 24979 // result: (First nil yes no) 24980 for { 24981 v := b.Control 24982 if v.Op != OpARMFlagGT_ULT { 24983 break 24984 } 24985 b.Kind = BlockFirst 24986 b.SetControl(nil) 24987 b.Aux = nil 24988 return true 24989 } 24990 // match: (ULT (FlagGT_UGT) yes no) 24991 // cond: 24992 // result: (First nil no yes) 24993 for { 24994 v := b.Control 24995 if v.Op != OpARMFlagGT_UGT { 24996 break 24997 } 24998 b.Kind = BlockFirst 24999 b.SetControl(nil) 25000 b.Aux = nil 25001 b.swapSuccessors() 25002 return true 25003 } 25004 // match: (ULT (InvertFlags cmp) yes no) 25005 // cond: 25006 // result: (UGT cmp yes no) 25007 for { 25008 v := b.Control 25009 if v.Op != OpARMInvertFlags { 25010 break 25011 } 25012 cmp := v.Args[0] 25013 b.Kind = BlockARMUGT 25014 b.SetControl(cmp) 25015 b.Aux = nil 25016 return true 25017 } 25018 } 25019 return false 25020 }