github.com/hikaru7719/go@v0.0.0-20181025140707-c8b2ac68906a/src/cmd/compile/internal/ssa/rewriteARM.go (about) 1 // Code generated from gen/ARM.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValueARM(v *Value) bool { 17 switch v.Op { 18 case OpARMADC: 19 return rewriteValueARM_OpARMADC_0(v) || rewriteValueARM_OpARMADC_10(v) || rewriteValueARM_OpARMADC_20(v) 20 case OpARMADCconst: 21 return rewriteValueARM_OpARMADCconst_0(v) 22 case OpARMADCshiftLL: 23 return rewriteValueARM_OpARMADCshiftLL_0(v) 24 case OpARMADCshiftLLreg: 25 return rewriteValueARM_OpARMADCshiftLLreg_0(v) 26 case OpARMADCshiftRA: 27 return rewriteValueARM_OpARMADCshiftRA_0(v) 28 case OpARMADCshiftRAreg: 29 return rewriteValueARM_OpARMADCshiftRAreg_0(v) 30 case OpARMADCshiftRL: 31 return rewriteValueARM_OpARMADCshiftRL_0(v) 32 case OpARMADCshiftRLreg: 33 return rewriteValueARM_OpARMADCshiftRLreg_0(v) 34 case OpARMADD: 35 return rewriteValueARM_OpARMADD_0(v) || rewriteValueARM_OpARMADD_10(v) 36 case 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 OpCtz32: 485 return rewriteValueARM_OpCtz32_0(v) 486 case OpCtz32NonZero: 487 return rewriteValueARM_OpCtz32NonZero_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 OpGetCallerPC: 555 return rewriteValueARM_OpGetCallerPC_0(v) 556 case OpGetCallerSP: 557 return rewriteValueARM_OpGetCallerSP_0(v) 558 case OpGetClosurePtr: 559 return rewriteValueARM_OpGetClosurePtr_0(v) 560 case OpGreater16: 561 return rewriteValueARM_OpGreater16_0(v) 562 case OpGreater16U: 563 return rewriteValueARM_OpGreater16U_0(v) 564 case OpGreater32: 565 return rewriteValueARM_OpGreater32_0(v) 566 case OpGreater32F: 567 return rewriteValueARM_OpGreater32F_0(v) 568 case OpGreater32U: 569 return rewriteValueARM_OpGreater32U_0(v) 570 case OpGreater64F: 571 return rewriteValueARM_OpGreater64F_0(v) 572 case OpGreater8: 573 return rewriteValueARM_OpGreater8_0(v) 574 case OpGreater8U: 575 return rewriteValueARM_OpGreater8U_0(v) 576 case OpHmul32: 577 return rewriteValueARM_OpHmul32_0(v) 578 case OpHmul32u: 579 return rewriteValueARM_OpHmul32u_0(v) 580 case OpInterCall: 581 return rewriteValueARM_OpInterCall_0(v) 582 case OpIsInBounds: 583 return rewriteValueARM_OpIsInBounds_0(v) 584 case OpIsNonNil: 585 return rewriteValueARM_OpIsNonNil_0(v) 586 case OpIsSliceInBounds: 587 return rewriteValueARM_OpIsSliceInBounds_0(v) 588 case OpLeq16: 589 return rewriteValueARM_OpLeq16_0(v) 590 case OpLeq16U: 591 return rewriteValueARM_OpLeq16U_0(v) 592 case OpLeq32: 593 return rewriteValueARM_OpLeq32_0(v) 594 case OpLeq32F: 595 return rewriteValueARM_OpLeq32F_0(v) 596 case OpLeq32U: 597 return rewriteValueARM_OpLeq32U_0(v) 598 case OpLeq64F: 599 return rewriteValueARM_OpLeq64F_0(v) 600 case OpLeq8: 601 return rewriteValueARM_OpLeq8_0(v) 602 case OpLeq8U: 603 return rewriteValueARM_OpLeq8U_0(v) 604 case OpLess16: 605 return rewriteValueARM_OpLess16_0(v) 606 case OpLess16U: 607 return rewriteValueARM_OpLess16U_0(v) 608 case OpLess32: 609 return rewriteValueARM_OpLess32_0(v) 610 case OpLess32F: 611 return rewriteValueARM_OpLess32F_0(v) 612 case OpLess32U: 613 return rewriteValueARM_OpLess32U_0(v) 614 case OpLess64F: 615 return rewriteValueARM_OpLess64F_0(v) 616 case OpLess8: 617 return rewriteValueARM_OpLess8_0(v) 618 case OpLess8U: 619 return rewriteValueARM_OpLess8U_0(v) 620 case OpLoad: 621 return rewriteValueARM_OpLoad_0(v) 622 case OpLocalAddr: 623 return rewriteValueARM_OpLocalAddr_0(v) 624 case OpLsh16x16: 625 return rewriteValueARM_OpLsh16x16_0(v) 626 case OpLsh16x32: 627 return rewriteValueARM_OpLsh16x32_0(v) 628 case OpLsh16x64: 629 return rewriteValueARM_OpLsh16x64_0(v) 630 case OpLsh16x8: 631 return rewriteValueARM_OpLsh16x8_0(v) 632 case OpLsh32x16: 633 return rewriteValueARM_OpLsh32x16_0(v) 634 case OpLsh32x32: 635 return rewriteValueARM_OpLsh32x32_0(v) 636 case OpLsh32x64: 637 return rewriteValueARM_OpLsh32x64_0(v) 638 case OpLsh32x8: 639 return rewriteValueARM_OpLsh32x8_0(v) 640 case OpLsh8x16: 641 return rewriteValueARM_OpLsh8x16_0(v) 642 case OpLsh8x32: 643 return rewriteValueARM_OpLsh8x32_0(v) 644 case OpLsh8x64: 645 return rewriteValueARM_OpLsh8x64_0(v) 646 case OpLsh8x8: 647 return rewriteValueARM_OpLsh8x8_0(v) 648 case OpMod16: 649 return rewriteValueARM_OpMod16_0(v) 650 case OpMod16u: 651 return rewriteValueARM_OpMod16u_0(v) 652 case OpMod32: 653 return rewriteValueARM_OpMod32_0(v) 654 case OpMod32u: 655 return rewriteValueARM_OpMod32u_0(v) 656 case OpMod8: 657 return rewriteValueARM_OpMod8_0(v) 658 case OpMod8u: 659 return rewriteValueARM_OpMod8u_0(v) 660 case OpMove: 661 return rewriteValueARM_OpMove_0(v) 662 case OpMul16: 663 return rewriteValueARM_OpMul16_0(v) 664 case OpMul32: 665 return rewriteValueARM_OpMul32_0(v) 666 case OpMul32F: 667 return rewriteValueARM_OpMul32F_0(v) 668 case OpMul32uhilo: 669 return rewriteValueARM_OpMul32uhilo_0(v) 670 case OpMul64F: 671 return rewriteValueARM_OpMul64F_0(v) 672 case OpMul8: 673 return rewriteValueARM_OpMul8_0(v) 674 case OpNeg16: 675 return rewriteValueARM_OpNeg16_0(v) 676 case OpNeg32: 677 return rewriteValueARM_OpNeg32_0(v) 678 case OpNeg32F: 679 return rewriteValueARM_OpNeg32F_0(v) 680 case OpNeg64F: 681 return rewriteValueARM_OpNeg64F_0(v) 682 case OpNeg8: 683 return rewriteValueARM_OpNeg8_0(v) 684 case OpNeq16: 685 return rewriteValueARM_OpNeq16_0(v) 686 case OpNeq32: 687 return rewriteValueARM_OpNeq32_0(v) 688 case OpNeq32F: 689 return rewriteValueARM_OpNeq32F_0(v) 690 case OpNeq64F: 691 return rewriteValueARM_OpNeq64F_0(v) 692 case OpNeq8: 693 return rewriteValueARM_OpNeq8_0(v) 694 case OpNeqB: 695 return rewriteValueARM_OpNeqB_0(v) 696 case OpNeqPtr: 697 return rewriteValueARM_OpNeqPtr_0(v) 698 case OpNilCheck: 699 return rewriteValueARM_OpNilCheck_0(v) 700 case OpNot: 701 return rewriteValueARM_OpNot_0(v) 702 case OpOffPtr: 703 return rewriteValueARM_OpOffPtr_0(v) 704 case OpOr16: 705 return rewriteValueARM_OpOr16_0(v) 706 case OpOr32: 707 return rewriteValueARM_OpOr32_0(v) 708 case OpOr8: 709 return rewriteValueARM_OpOr8_0(v) 710 case OpOrB: 711 return rewriteValueARM_OpOrB_0(v) 712 case OpRound32F: 713 return rewriteValueARM_OpRound32F_0(v) 714 case OpRound64F: 715 return rewriteValueARM_OpRound64F_0(v) 716 case OpRsh16Ux16: 717 return rewriteValueARM_OpRsh16Ux16_0(v) 718 case OpRsh16Ux32: 719 return rewriteValueARM_OpRsh16Ux32_0(v) 720 case OpRsh16Ux64: 721 return rewriteValueARM_OpRsh16Ux64_0(v) 722 case OpRsh16Ux8: 723 return rewriteValueARM_OpRsh16Ux8_0(v) 724 case OpRsh16x16: 725 return rewriteValueARM_OpRsh16x16_0(v) 726 case OpRsh16x32: 727 return rewriteValueARM_OpRsh16x32_0(v) 728 case OpRsh16x64: 729 return rewriteValueARM_OpRsh16x64_0(v) 730 case OpRsh16x8: 731 return rewriteValueARM_OpRsh16x8_0(v) 732 case OpRsh32Ux16: 733 return rewriteValueARM_OpRsh32Ux16_0(v) 734 case OpRsh32Ux32: 735 return rewriteValueARM_OpRsh32Ux32_0(v) 736 case OpRsh32Ux64: 737 return rewriteValueARM_OpRsh32Ux64_0(v) 738 case OpRsh32Ux8: 739 return rewriteValueARM_OpRsh32Ux8_0(v) 740 case OpRsh32x16: 741 return rewriteValueARM_OpRsh32x16_0(v) 742 case OpRsh32x32: 743 return rewriteValueARM_OpRsh32x32_0(v) 744 case OpRsh32x64: 745 return rewriteValueARM_OpRsh32x64_0(v) 746 case OpRsh32x8: 747 return rewriteValueARM_OpRsh32x8_0(v) 748 case OpRsh8Ux16: 749 return rewriteValueARM_OpRsh8Ux16_0(v) 750 case OpRsh8Ux32: 751 return rewriteValueARM_OpRsh8Ux32_0(v) 752 case OpRsh8Ux64: 753 return rewriteValueARM_OpRsh8Ux64_0(v) 754 case OpRsh8Ux8: 755 return rewriteValueARM_OpRsh8Ux8_0(v) 756 case OpRsh8x16: 757 return rewriteValueARM_OpRsh8x16_0(v) 758 case OpRsh8x32: 759 return rewriteValueARM_OpRsh8x32_0(v) 760 case OpRsh8x64: 761 return rewriteValueARM_OpRsh8x64_0(v) 762 case OpRsh8x8: 763 return rewriteValueARM_OpRsh8x8_0(v) 764 case OpSelect0: 765 return rewriteValueARM_OpSelect0_0(v) 766 case OpSelect1: 767 return rewriteValueARM_OpSelect1_0(v) 768 case OpSignExt16to32: 769 return rewriteValueARM_OpSignExt16to32_0(v) 770 case OpSignExt8to16: 771 return rewriteValueARM_OpSignExt8to16_0(v) 772 case OpSignExt8to32: 773 return rewriteValueARM_OpSignExt8to32_0(v) 774 case OpSignmask: 775 return rewriteValueARM_OpSignmask_0(v) 776 case OpSlicemask: 777 return rewriteValueARM_OpSlicemask_0(v) 778 case OpSqrt: 779 return rewriteValueARM_OpSqrt_0(v) 780 case OpStaticCall: 781 return rewriteValueARM_OpStaticCall_0(v) 782 case OpStore: 783 return rewriteValueARM_OpStore_0(v) 784 case OpSub16: 785 return rewriteValueARM_OpSub16_0(v) 786 case OpSub32: 787 return rewriteValueARM_OpSub32_0(v) 788 case OpSub32F: 789 return rewriteValueARM_OpSub32F_0(v) 790 case OpSub32carry: 791 return rewriteValueARM_OpSub32carry_0(v) 792 case OpSub32withcarry: 793 return rewriteValueARM_OpSub32withcarry_0(v) 794 case OpSub64F: 795 return rewriteValueARM_OpSub64F_0(v) 796 case OpSub8: 797 return rewriteValueARM_OpSub8_0(v) 798 case OpSubPtr: 799 return rewriteValueARM_OpSubPtr_0(v) 800 case OpTrunc16to8: 801 return rewriteValueARM_OpTrunc16to8_0(v) 802 case OpTrunc32to16: 803 return rewriteValueARM_OpTrunc32to16_0(v) 804 case OpTrunc32to8: 805 return rewriteValueARM_OpTrunc32to8_0(v) 806 case OpWB: 807 return rewriteValueARM_OpWB_0(v) 808 case OpXor16: 809 return rewriteValueARM_OpXor16_0(v) 810 case OpXor32: 811 return rewriteValueARM_OpXor32_0(v) 812 case OpXor8: 813 return rewriteValueARM_OpXor8_0(v) 814 case OpZero: 815 return rewriteValueARM_OpZero_0(v) 816 case OpZeroExt16to32: 817 return rewriteValueARM_OpZeroExt16to32_0(v) 818 case OpZeroExt8to16: 819 return rewriteValueARM_OpZeroExt8to16_0(v) 820 case OpZeroExt8to32: 821 return rewriteValueARM_OpZeroExt8to32_0(v) 822 case OpZeromask: 823 return rewriteValueARM_OpZeromask_0(v) 824 } 825 return false 826 } 827 func rewriteValueARM_OpARMADC_0(v *Value) bool { 828 // match: (ADC (MOVWconst [c]) x flags) 829 // cond: 830 // result: (ADCconst [c] x flags) 831 for { 832 _ = v.Args[2] 833 v_0 := v.Args[0] 834 if v_0.Op != OpARMMOVWconst { 835 break 836 } 837 c := v_0.AuxInt 838 x := v.Args[1] 839 flags := v.Args[2] 840 v.reset(OpARMADCconst) 841 v.AuxInt = c 842 v.AddArg(x) 843 v.AddArg(flags) 844 return true 845 } 846 // match: (ADC x (MOVWconst [c]) flags) 847 // cond: 848 // result: (ADCconst [c] x flags) 849 for { 850 _ = v.Args[2] 851 x := v.Args[0] 852 v_1 := v.Args[1] 853 if v_1.Op != OpARMMOVWconst { 854 break 855 } 856 c := v_1.AuxInt 857 flags := v.Args[2] 858 v.reset(OpARMADCconst) 859 v.AuxInt = c 860 v.AddArg(x) 861 v.AddArg(flags) 862 return true 863 } 864 // match: (ADC x (MOVWconst [c]) flags) 865 // cond: 866 // result: (ADCconst [c] x flags) 867 for { 868 _ = v.Args[2] 869 x := v.Args[0] 870 v_1 := v.Args[1] 871 if v_1.Op != OpARMMOVWconst { 872 break 873 } 874 c := v_1.AuxInt 875 flags := v.Args[2] 876 v.reset(OpARMADCconst) 877 v.AuxInt = c 878 v.AddArg(x) 879 v.AddArg(flags) 880 return true 881 } 882 // match: (ADC (MOVWconst [c]) x flags) 883 // cond: 884 // result: (ADCconst [c] x flags) 885 for { 886 _ = v.Args[2] 887 v_0 := v.Args[0] 888 if v_0.Op != OpARMMOVWconst { 889 break 890 } 891 c := v_0.AuxInt 892 x := v.Args[1] 893 flags := v.Args[2] 894 v.reset(OpARMADCconst) 895 v.AuxInt = c 896 v.AddArg(x) 897 v.AddArg(flags) 898 return true 899 } 900 // match: (ADC x (SLLconst [c] y) flags) 901 // cond: 902 // result: (ADCshiftLL x y [c] flags) 903 for { 904 _ = v.Args[2] 905 x := v.Args[0] 906 v_1 := v.Args[1] 907 if v_1.Op != OpARMSLLconst { 908 break 909 } 910 c := v_1.AuxInt 911 y := v_1.Args[0] 912 flags := v.Args[2] 913 v.reset(OpARMADCshiftLL) 914 v.AuxInt = c 915 v.AddArg(x) 916 v.AddArg(y) 917 v.AddArg(flags) 918 return true 919 } 920 // match: (ADC (SLLconst [c] y) x flags) 921 // cond: 922 // result: (ADCshiftLL x y [c] flags) 923 for { 924 _ = v.Args[2] 925 v_0 := v.Args[0] 926 if v_0.Op != OpARMSLLconst { 927 break 928 } 929 c := v_0.AuxInt 930 y := v_0.Args[0] 931 x := v.Args[1] 932 flags := v.Args[2] 933 v.reset(OpARMADCshiftLL) 934 v.AuxInt = c 935 v.AddArg(x) 936 v.AddArg(y) 937 v.AddArg(flags) 938 return true 939 } 940 // match: (ADC (SLLconst [c] y) x flags) 941 // cond: 942 // result: (ADCshiftLL x y [c] flags) 943 for { 944 _ = v.Args[2] 945 v_0 := v.Args[0] 946 if v_0.Op != OpARMSLLconst { 947 break 948 } 949 c := v_0.AuxInt 950 y := v_0.Args[0] 951 x := v.Args[1] 952 flags := v.Args[2] 953 v.reset(OpARMADCshiftLL) 954 v.AuxInt = c 955 v.AddArg(x) 956 v.AddArg(y) 957 v.AddArg(flags) 958 return true 959 } 960 // match: (ADC x (SLLconst [c] y) flags) 961 // cond: 962 // result: (ADCshiftLL x y [c] flags) 963 for { 964 _ = v.Args[2] 965 x := v.Args[0] 966 v_1 := v.Args[1] 967 if v_1.Op != OpARMSLLconst { 968 break 969 } 970 c := v_1.AuxInt 971 y := v_1.Args[0] 972 flags := v.Args[2] 973 v.reset(OpARMADCshiftLL) 974 v.AuxInt = c 975 v.AddArg(x) 976 v.AddArg(y) 977 v.AddArg(flags) 978 return true 979 } 980 // match: (ADC x (SRLconst [c] y) flags) 981 // cond: 982 // result: (ADCshiftRL x y [c] flags) 983 for { 984 _ = v.Args[2] 985 x := v.Args[0] 986 v_1 := v.Args[1] 987 if v_1.Op != OpARMSRLconst { 988 break 989 } 990 c := v_1.AuxInt 991 y := v_1.Args[0] 992 flags := v.Args[2] 993 v.reset(OpARMADCshiftRL) 994 v.AuxInt = c 995 v.AddArg(x) 996 v.AddArg(y) 997 v.AddArg(flags) 998 return true 999 } 1000 // match: (ADC (SRLconst [c] y) x flags) 1001 // cond: 1002 // result: (ADCshiftRL x y [c] flags) 1003 for { 1004 _ = v.Args[2] 1005 v_0 := v.Args[0] 1006 if v_0.Op != OpARMSRLconst { 1007 break 1008 } 1009 c := v_0.AuxInt 1010 y := v_0.Args[0] 1011 x := v.Args[1] 1012 flags := v.Args[2] 1013 v.reset(OpARMADCshiftRL) 1014 v.AuxInt = c 1015 v.AddArg(x) 1016 v.AddArg(y) 1017 v.AddArg(flags) 1018 return true 1019 } 1020 return false 1021 } 1022 func rewriteValueARM_OpARMADC_10(v *Value) bool { 1023 // match: (ADC (SRLconst [c] y) x flags) 1024 // cond: 1025 // result: (ADCshiftRL x y [c] flags) 1026 for { 1027 _ = v.Args[2] 1028 v_0 := v.Args[0] 1029 if v_0.Op != OpARMSRLconst { 1030 break 1031 } 1032 c := v_0.AuxInt 1033 y := v_0.Args[0] 1034 x := v.Args[1] 1035 flags := v.Args[2] 1036 v.reset(OpARMADCshiftRL) 1037 v.AuxInt = c 1038 v.AddArg(x) 1039 v.AddArg(y) 1040 v.AddArg(flags) 1041 return true 1042 } 1043 // match: (ADC x (SRLconst [c] y) flags) 1044 // cond: 1045 // result: (ADCshiftRL x y [c] flags) 1046 for { 1047 _ = v.Args[2] 1048 x := v.Args[0] 1049 v_1 := v.Args[1] 1050 if v_1.Op != OpARMSRLconst { 1051 break 1052 } 1053 c := v_1.AuxInt 1054 y := v_1.Args[0] 1055 flags := v.Args[2] 1056 v.reset(OpARMADCshiftRL) 1057 v.AuxInt = c 1058 v.AddArg(x) 1059 v.AddArg(y) 1060 v.AddArg(flags) 1061 return true 1062 } 1063 // match: (ADC x (SRAconst [c] y) flags) 1064 // cond: 1065 // result: (ADCshiftRA x y [c] flags) 1066 for { 1067 _ = v.Args[2] 1068 x := v.Args[0] 1069 v_1 := v.Args[1] 1070 if v_1.Op != OpARMSRAconst { 1071 break 1072 } 1073 c := v_1.AuxInt 1074 y := v_1.Args[0] 1075 flags := v.Args[2] 1076 v.reset(OpARMADCshiftRA) 1077 v.AuxInt = c 1078 v.AddArg(x) 1079 v.AddArg(y) 1080 v.AddArg(flags) 1081 return true 1082 } 1083 // match: (ADC (SRAconst [c] y) x flags) 1084 // cond: 1085 // result: (ADCshiftRA x y [c] flags) 1086 for { 1087 _ = v.Args[2] 1088 v_0 := v.Args[0] 1089 if v_0.Op != OpARMSRAconst { 1090 break 1091 } 1092 c := v_0.AuxInt 1093 y := v_0.Args[0] 1094 x := v.Args[1] 1095 flags := v.Args[2] 1096 v.reset(OpARMADCshiftRA) 1097 v.AuxInt = c 1098 v.AddArg(x) 1099 v.AddArg(y) 1100 v.AddArg(flags) 1101 return true 1102 } 1103 // match: (ADC (SRAconst [c] y) x flags) 1104 // cond: 1105 // result: (ADCshiftRA x y [c] flags) 1106 for { 1107 _ = v.Args[2] 1108 v_0 := v.Args[0] 1109 if v_0.Op != OpARMSRAconst { 1110 break 1111 } 1112 c := v_0.AuxInt 1113 y := v_0.Args[0] 1114 x := v.Args[1] 1115 flags := v.Args[2] 1116 v.reset(OpARMADCshiftRA) 1117 v.AuxInt = c 1118 v.AddArg(x) 1119 v.AddArg(y) 1120 v.AddArg(flags) 1121 return true 1122 } 1123 // match: (ADC x (SRAconst [c] y) flags) 1124 // cond: 1125 // result: (ADCshiftRA x y [c] flags) 1126 for { 1127 _ = v.Args[2] 1128 x := v.Args[0] 1129 v_1 := v.Args[1] 1130 if v_1.Op != OpARMSRAconst { 1131 break 1132 } 1133 c := v_1.AuxInt 1134 y := v_1.Args[0] 1135 flags := v.Args[2] 1136 v.reset(OpARMADCshiftRA) 1137 v.AuxInt = c 1138 v.AddArg(x) 1139 v.AddArg(y) 1140 v.AddArg(flags) 1141 return true 1142 } 1143 // match: (ADC x (SLL y z) flags) 1144 // cond: 1145 // result: (ADCshiftLLreg x y z flags) 1146 for { 1147 _ = v.Args[2] 1148 x := v.Args[0] 1149 v_1 := v.Args[1] 1150 if v_1.Op != OpARMSLL { 1151 break 1152 } 1153 _ = v_1.Args[1] 1154 y := v_1.Args[0] 1155 z := v_1.Args[1] 1156 flags := v.Args[2] 1157 v.reset(OpARMADCshiftLLreg) 1158 v.AddArg(x) 1159 v.AddArg(y) 1160 v.AddArg(z) 1161 v.AddArg(flags) 1162 return true 1163 } 1164 // match: (ADC (SLL y z) x flags) 1165 // cond: 1166 // result: (ADCshiftLLreg x y z flags) 1167 for { 1168 _ = v.Args[2] 1169 v_0 := v.Args[0] 1170 if v_0.Op != OpARMSLL { 1171 break 1172 } 1173 _ = v_0.Args[1] 1174 y := v_0.Args[0] 1175 z := v_0.Args[1] 1176 x := v.Args[1] 1177 flags := v.Args[2] 1178 v.reset(OpARMADCshiftLLreg) 1179 v.AddArg(x) 1180 v.AddArg(y) 1181 v.AddArg(z) 1182 v.AddArg(flags) 1183 return true 1184 } 1185 // match: (ADC (SLL y z) x flags) 1186 // cond: 1187 // result: (ADCshiftLLreg x y z flags) 1188 for { 1189 _ = v.Args[2] 1190 v_0 := v.Args[0] 1191 if v_0.Op != OpARMSLL { 1192 break 1193 } 1194 _ = v_0.Args[1] 1195 y := v_0.Args[0] 1196 z := v_0.Args[1] 1197 x := v.Args[1] 1198 flags := v.Args[2] 1199 v.reset(OpARMADCshiftLLreg) 1200 v.AddArg(x) 1201 v.AddArg(y) 1202 v.AddArg(z) 1203 v.AddArg(flags) 1204 return true 1205 } 1206 // match: (ADC x (SLL y z) flags) 1207 // cond: 1208 // result: (ADCshiftLLreg x y z flags) 1209 for { 1210 _ = v.Args[2] 1211 x := v.Args[0] 1212 v_1 := v.Args[1] 1213 if v_1.Op != OpARMSLL { 1214 break 1215 } 1216 _ = v_1.Args[1] 1217 y := v_1.Args[0] 1218 z := v_1.Args[1] 1219 flags := v.Args[2] 1220 v.reset(OpARMADCshiftLLreg) 1221 v.AddArg(x) 1222 v.AddArg(y) 1223 v.AddArg(z) 1224 v.AddArg(flags) 1225 return true 1226 } 1227 return false 1228 } 1229 func rewriteValueARM_OpARMADC_20(v *Value) bool { 1230 // match: (ADC x (SRL y z) flags) 1231 // cond: 1232 // result: (ADCshiftRLreg x y z flags) 1233 for { 1234 _ = v.Args[2] 1235 x := v.Args[0] 1236 v_1 := v.Args[1] 1237 if v_1.Op != OpARMSRL { 1238 break 1239 } 1240 _ = v_1.Args[1] 1241 y := v_1.Args[0] 1242 z := v_1.Args[1] 1243 flags := v.Args[2] 1244 v.reset(OpARMADCshiftRLreg) 1245 v.AddArg(x) 1246 v.AddArg(y) 1247 v.AddArg(z) 1248 v.AddArg(flags) 1249 return true 1250 } 1251 // match: (ADC (SRL y z) x flags) 1252 // cond: 1253 // result: (ADCshiftRLreg x y z flags) 1254 for { 1255 _ = v.Args[2] 1256 v_0 := v.Args[0] 1257 if v_0.Op != OpARMSRL { 1258 break 1259 } 1260 _ = v_0.Args[1] 1261 y := v_0.Args[0] 1262 z := v_0.Args[1] 1263 x := v.Args[1] 1264 flags := v.Args[2] 1265 v.reset(OpARMADCshiftRLreg) 1266 v.AddArg(x) 1267 v.AddArg(y) 1268 v.AddArg(z) 1269 v.AddArg(flags) 1270 return true 1271 } 1272 // match: (ADC (SRL y z) x flags) 1273 // cond: 1274 // result: (ADCshiftRLreg x y z flags) 1275 for { 1276 _ = v.Args[2] 1277 v_0 := v.Args[0] 1278 if v_0.Op != OpARMSRL { 1279 break 1280 } 1281 _ = v_0.Args[1] 1282 y := v_0.Args[0] 1283 z := v_0.Args[1] 1284 x := v.Args[1] 1285 flags := v.Args[2] 1286 v.reset(OpARMADCshiftRLreg) 1287 v.AddArg(x) 1288 v.AddArg(y) 1289 v.AddArg(z) 1290 v.AddArg(flags) 1291 return true 1292 } 1293 // match: (ADC x (SRL y z) flags) 1294 // cond: 1295 // result: (ADCshiftRLreg x y z flags) 1296 for { 1297 _ = v.Args[2] 1298 x := v.Args[0] 1299 v_1 := v.Args[1] 1300 if v_1.Op != OpARMSRL { 1301 break 1302 } 1303 _ = v_1.Args[1] 1304 y := v_1.Args[0] 1305 z := v_1.Args[1] 1306 flags := v.Args[2] 1307 v.reset(OpARMADCshiftRLreg) 1308 v.AddArg(x) 1309 v.AddArg(y) 1310 v.AddArg(z) 1311 v.AddArg(flags) 1312 return true 1313 } 1314 // match: (ADC x (SRA y z) flags) 1315 // cond: 1316 // result: (ADCshiftRAreg x y z flags) 1317 for { 1318 _ = v.Args[2] 1319 x := v.Args[0] 1320 v_1 := v.Args[1] 1321 if v_1.Op != OpARMSRA { 1322 break 1323 } 1324 _ = v_1.Args[1] 1325 y := v_1.Args[0] 1326 z := v_1.Args[1] 1327 flags := v.Args[2] 1328 v.reset(OpARMADCshiftRAreg) 1329 v.AddArg(x) 1330 v.AddArg(y) 1331 v.AddArg(z) 1332 v.AddArg(flags) 1333 return true 1334 } 1335 // match: (ADC (SRA y z) x flags) 1336 // cond: 1337 // result: (ADCshiftRAreg x y z flags) 1338 for { 1339 _ = v.Args[2] 1340 v_0 := v.Args[0] 1341 if v_0.Op != OpARMSRA { 1342 break 1343 } 1344 _ = v_0.Args[1] 1345 y := v_0.Args[0] 1346 z := v_0.Args[1] 1347 x := v.Args[1] 1348 flags := v.Args[2] 1349 v.reset(OpARMADCshiftRAreg) 1350 v.AddArg(x) 1351 v.AddArg(y) 1352 v.AddArg(z) 1353 v.AddArg(flags) 1354 return true 1355 } 1356 // match: (ADC (SRA y z) x flags) 1357 // cond: 1358 // result: (ADCshiftRAreg x y z flags) 1359 for { 1360 _ = v.Args[2] 1361 v_0 := v.Args[0] 1362 if v_0.Op != OpARMSRA { 1363 break 1364 } 1365 _ = v_0.Args[1] 1366 y := v_0.Args[0] 1367 z := v_0.Args[1] 1368 x := v.Args[1] 1369 flags := v.Args[2] 1370 v.reset(OpARMADCshiftRAreg) 1371 v.AddArg(x) 1372 v.AddArg(y) 1373 v.AddArg(z) 1374 v.AddArg(flags) 1375 return true 1376 } 1377 // match: (ADC x (SRA y z) flags) 1378 // cond: 1379 // result: (ADCshiftRAreg x y z flags) 1380 for { 1381 _ = v.Args[2] 1382 x := v.Args[0] 1383 v_1 := v.Args[1] 1384 if v_1.Op != OpARMSRA { 1385 break 1386 } 1387 _ = v_1.Args[1] 1388 y := v_1.Args[0] 1389 z := v_1.Args[1] 1390 flags := v.Args[2] 1391 v.reset(OpARMADCshiftRAreg) 1392 v.AddArg(x) 1393 v.AddArg(y) 1394 v.AddArg(z) 1395 v.AddArg(flags) 1396 return true 1397 } 1398 return false 1399 } 1400 func rewriteValueARM_OpARMADCconst_0(v *Value) bool { 1401 // match: (ADCconst [c] (ADDconst [d] x) flags) 1402 // cond: 1403 // result: (ADCconst [int64(int32(c+d))] x flags) 1404 for { 1405 c := v.AuxInt 1406 _ = v.Args[1] 1407 v_0 := v.Args[0] 1408 if v_0.Op != OpARMADDconst { 1409 break 1410 } 1411 d := v_0.AuxInt 1412 x := v_0.Args[0] 1413 flags := v.Args[1] 1414 v.reset(OpARMADCconst) 1415 v.AuxInt = int64(int32(c + d)) 1416 v.AddArg(x) 1417 v.AddArg(flags) 1418 return true 1419 } 1420 // match: (ADCconst [c] (SUBconst [d] x) flags) 1421 // cond: 1422 // result: (ADCconst [int64(int32(c-d))] x flags) 1423 for { 1424 c := v.AuxInt 1425 _ = v.Args[1] 1426 v_0 := v.Args[0] 1427 if v_0.Op != OpARMSUBconst { 1428 break 1429 } 1430 d := v_0.AuxInt 1431 x := v_0.Args[0] 1432 flags := v.Args[1] 1433 v.reset(OpARMADCconst) 1434 v.AuxInt = int64(int32(c - d)) 1435 v.AddArg(x) 1436 v.AddArg(flags) 1437 return true 1438 } 1439 return false 1440 } 1441 func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { 1442 b := v.Block 1443 _ = b 1444 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1445 // cond: 1446 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1447 for { 1448 d := v.AuxInt 1449 _ = v.Args[2] 1450 v_0 := v.Args[0] 1451 if v_0.Op != OpARMMOVWconst { 1452 break 1453 } 1454 c := v_0.AuxInt 1455 x := v.Args[1] 1456 flags := v.Args[2] 1457 v.reset(OpARMADCconst) 1458 v.AuxInt = c 1459 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1460 v0.AuxInt = d 1461 v0.AddArg(x) 1462 v.AddArg(v0) 1463 v.AddArg(flags) 1464 return true 1465 } 1466 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1467 // cond: 1468 // result: (ADCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 1469 for { 1470 d := v.AuxInt 1471 _ = v.Args[2] 1472 x := v.Args[0] 1473 v_1 := v.Args[1] 1474 if v_1.Op != OpARMMOVWconst { 1475 break 1476 } 1477 c := v_1.AuxInt 1478 flags := v.Args[2] 1479 v.reset(OpARMADCconst) 1480 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 1481 v.AddArg(x) 1482 v.AddArg(flags) 1483 return true 1484 } 1485 return false 1486 } 1487 func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { 1488 b := v.Block 1489 _ = b 1490 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1491 // cond: 1492 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1493 for { 1494 _ = v.Args[3] 1495 v_0 := v.Args[0] 1496 if v_0.Op != OpARMMOVWconst { 1497 break 1498 } 1499 c := v_0.AuxInt 1500 x := v.Args[1] 1501 y := v.Args[2] 1502 flags := v.Args[3] 1503 v.reset(OpARMADCconst) 1504 v.AuxInt = c 1505 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1506 v0.AddArg(x) 1507 v0.AddArg(y) 1508 v.AddArg(v0) 1509 v.AddArg(flags) 1510 return true 1511 } 1512 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1513 // cond: 1514 // result: (ADCshiftLL x y [c] flags) 1515 for { 1516 _ = v.Args[3] 1517 x := v.Args[0] 1518 y := v.Args[1] 1519 v_2 := v.Args[2] 1520 if v_2.Op != OpARMMOVWconst { 1521 break 1522 } 1523 c := v_2.AuxInt 1524 flags := v.Args[3] 1525 v.reset(OpARMADCshiftLL) 1526 v.AuxInt = c 1527 v.AddArg(x) 1528 v.AddArg(y) 1529 v.AddArg(flags) 1530 return true 1531 } 1532 return false 1533 } 1534 func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { 1535 b := v.Block 1536 _ = b 1537 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1538 // cond: 1539 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1540 for { 1541 d := v.AuxInt 1542 _ = v.Args[2] 1543 v_0 := v.Args[0] 1544 if v_0.Op != OpARMMOVWconst { 1545 break 1546 } 1547 c := v_0.AuxInt 1548 x := v.Args[1] 1549 flags := v.Args[2] 1550 v.reset(OpARMADCconst) 1551 v.AuxInt = c 1552 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1553 v0.AuxInt = d 1554 v0.AddArg(x) 1555 v.AddArg(v0) 1556 v.AddArg(flags) 1557 return true 1558 } 1559 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1560 // cond: 1561 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1562 for { 1563 d := v.AuxInt 1564 _ = v.Args[2] 1565 x := v.Args[0] 1566 v_1 := v.Args[1] 1567 if v_1.Op != OpARMMOVWconst { 1568 break 1569 } 1570 c := v_1.AuxInt 1571 flags := v.Args[2] 1572 v.reset(OpARMADCconst) 1573 v.AuxInt = int64(int32(c) >> uint64(d)) 1574 v.AddArg(x) 1575 v.AddArg(flags) 1576 return true 1577 } 1578 return false 1579 } 1580 func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { 1581 b := v.Block 1582 _ = b 1583 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1584 // cond: 1585 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1586 for { 1587 _ = v.Args[3] 1588 v_0 := v.Args[0] 1589 if v_0.Op != OpARMMOVWconst { 1590 break 1591 } 1592 c := v_0.AuxInt 1593 x := v.Args[1] 1594 y := v.Args[2] 1595 flags := v.Args[3] 1596 v.reset(OpARMADCconst) 1597 v.AuxInt = c 1598 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1599 v0.AddArg(x) 1600 v0.AddArg(y) 1601 v.AddArg(v0) 1602 v.AddArg(flags) 1603 return true 1604 } 1605 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1606 // cond: 1607 // result: (ADCshiftRA x y [c] flags) 1608 for { 1609 _ = v.Args[3] 1610 x := v.Args[0] 1611 y := v.Args[1] 1612 v_2 := v.Args[2] 1613 if v_2.Op != OpARMMOVWconst { 1614 break 1615 } 1616 c := v_2.AuxInt 1617 flags := v.Args[3] 1618 v.reset(OpARMADCshiftRA) 1619 v.AuxInt = c 1620 v.AddArg(x) 1621 v.AddArg(y) 1622 v.AddArg(flags) 1623 return true 1624 } 1625 return false 1626 } 1627 func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { 1628 b := v.Block 1629 _ = b 1630 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1631 // cond: 1632 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1633 for { 1634 d := v.AuxInt 1635 _ = v.Args[2] 1636 v_0 := v.Args[0] 1637 if v_0.Op != OpARMMOVWconst { 1638 break 1639 } 1640 c := v_0.AuxInt 1641 x := v.Args[1] 1642 flags := v.Args[2] 1643 v.reset(OpARMADCconst) 1644 v.AuxInt = c 1645 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1646 v0.AuxInt = d 1647 v0.AddArg(x) 1648 v.AddArg(v0) 1649 v.AddArg(flags) 1650 return true 1651 } 1652 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1653 // cond: 1654 // result: (ADCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 1655 for { 1656 d := v.AuxInt 1657 _ = v.Args[2] 1658 x := v.Args[0] 1659 v_1 := v.Args[1] 1660 if v_1.Op != OpARMMOVWconst { 1661 break 1662 } 1663 c := v_1.AuxInt 1664 flags := v.Args[2] 1665 v.reset(OpARMADCconst) 1666 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 1667 v.AddArg(x) 1668 v.AddArg(flags) 1669 return true 1670 } 1671 return false 1672 } 1673 func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { 1674 b := v.Block 1675 _ = b 1676 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1677 // cond: 1678 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1679 for { 1680 _ = v.Args[3] 1681 v_0 := v.Args[0] 1682 if v_0.Op != OpARMMOVWconst { 1683 break 1684 } 1685 c := v_0.AuxInt 1686 x := v.Args[1] 1687 y := v.Args[2] 1688 flags := v.Args[3] 1689 v.reset(OpARMADCconst) 1690 v.AuxInt = c 1691 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1692 v0.AddArg(x) 1693 v0.AddArg(y) 1694 v.AddArg(v0) 1695 v.AddArg(flags) 1696 return true 1697 } 1698 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1699 // cond: 1700 // result: (ADCshiftRL x y [c] flags) 1701 for { 1702 _ = v.Args[3] 1703 x := v.Args[0] 1704 y := v.Args[1] 1705 v_2 := v.Args[2] 1706 if v_2.Op != OpARMMOVWconst { 1707 break 1708 } 1709 c := v_2.AuxInt 1710 flags := v.Args[3] 1711 v.reset(OpARMADCshiftRL) 1712 v.AuxInt = c 1713 v.AddArg(x) 1714 v.AddArg(y) 1715 v.AddArg(flags) 1716 return true 1717 } 1718 return false 1719 } 1720 func rewriteValueARM_OpARMADD_0(v *Value) bool { 1721 // match: (ADD x (MOVWconst [c])) 1722 // cond: 1723 // result: (ADDconst [c] x) 1724 for { 1725 _ = v.Args[1] 1726 x := v.Args[0] 1727 v_1 := v.Args[1] 1728 if v_1.Op != OpARMMOVWconst { 1729 break 1730 } 1731 c := v_1.AuxInt 1732 v.reset(OpARMADDconst) 1733 v.AuxInt = c 1734 v.AddArg(x) 1735 return true 1736 } 1737 // match: (ADD (MOVWconst [c]) x) 1738 // cond: 1739 // result: (ADDconst [c] x) 1740 for { 1741 _ = v.Args[1] 1742 v_0 := v.Args[0] 1743 if v_0.Op != OpARMMOVWconst { 1744 break 1745 } 1746 c := v_0.AuxInt 1747 x := v.Args[1] 1748 v.reset(OpARMADDconst) 1749 v.AuxInt = c 1750 v.AddArg(x) 1751 return true 1752 } 1753 // match: (ADD x (SLLconst [c] y)) 1754 // cond: 1755 // result: (ADDshiftLL x y [c]) 1756 for { 1757 _ = v.Args[1] 1758 x := v.Args[0] 1759 v_1 := v.Args[1] 1760 if v_1.Op != OpARMSLLconst { 1761 break 1762 } 1763 c := v_1.AuxInt 1764 y := v_1.Args[0] 1765 v.reset(OpARMADDshiftLL) 1766 v.AuxInt = c 1767 v.AddArg(x) 1768 v.AddArg(y) 1769 return true 1770 } 1771 // match: (ADD (SLLconst [c] y) x) 1772 // cond: 1773 // result: (ADDshiftLL x y [c]) 1774 for { 1775 _ = v.Args[1] 1776 v_0 := v.Args[0] 1777 if v_0.Op != OpARMSLLconst { 1778 break 1779 } 1780 c := v_0.AuxInt 1781 y := v_0.Args[0] 1782 x := v.Args[1] 1783 v.reset(OpARMADDshiftLL) 1784 v.AuxInt = c 1785 v.AddArg(x) 1786 v.AddArg(y) 1787 return true 1788 } 1789 // match: (ADD x (SRLconst [c] y)) 1790 // cond: 1791 // result: (ADDshiftRL x y [c]) 1792 for { 1793 _ = v.Args[1] 1794 x := v.Args[0] 1795 v_1 := v.Args[1] 1796 if v_1.Op != OpARMSRLconst { 1797 break 1798 } 1799 c := v_1.AuxInt 1800 y := v_1.Args[0] 1801 v.reset(OpARMADDshiftRL) 1802 v.AuxInt = c 1803 v.AddArg(x) 1804 v.AddArg(y) 1805 return true 1806 } 1807 // match: (ADD (SRLconst [c] y) x) 1808 // cond: 1809 // result: (ADDshiftRL x y [c]) 1810 for { 1811 _ = v.Args[1] 1812 v_0 := v.Args[0] 1813 if v_0.Op != OpARMSRLconst { 1814 break 1815 } 1816 c := v_0.AuxInt 1817 y := v_0.Args[0] 1818 x := v.Args[1] 1819 v.reset(OpARMADDshiftRL) 1820 v.AuxInt = c 1821 v.AddArg(x) 1822 v.AddArg(y) 1823 return true 1824 } 1825 // match: (ADD x (SRAconst [c] y)) 1826 // cond: 1827 // result: (ADDshiftRA x y [c]) 1828 for { 1829 _ = v.Args[1] 1830 x := v.Args[0] 1831 v_1 := v.Args[1] 1832 if v_1.Op != OpARMSRAconst { 1833 break 1834 } 1835 c := v_1.AuxInt 1836 y := v_1.Args[0] 1837 v.reset(OpARMADDshiftRA) 1838 v.AuxInt = c 1839 v.AddArg(x) 1840 v.AddArg(y) 1841 return true 1842 } 1843 // match: (ADD (SRAconst [c] y) x) 1844 // cond: 1845 // result: (ADDshiftRA x y [c]) 1846 for { 1847 _ = v.Args[1] 1848 v_0 := v.Args[0] 1849 if v_0.Op != OpARMSRAconst { 1850 break 1851 } 1852 c := v_0.AuxInt 1853 y := v_0.Args[0] 1854 x := v.Args[1] 1855 v.reset(OpARMADDshiftRA) 1856 v.AuxInt = c 1857 v.AddArg(x) 1858 v.AddArg(y) 1859 return true 1860 } 1861 // match: (ADD x (SLL y z)) 1862 // cond: 1863 // result: (ADDshiftLLreg x y z) 1864 for { 1865 _ = v.Args[1] 1866 x := v.Args[0] 1867 v_1 := v.Args[1] 1868 if v_1.Op != OpARMSLL { 1869 break 1870 } 1871 _ = v_1.Args[1] 1872 y := v_1.Args[0] 1873 z := v_1.Args[1] 1874 v.reset(OpARMADDshiftLLreg) 1875 v.AddArg(x) 1876 v.AddArg(y) 1877 v.AddArg(z) 1878 return true 1879 } 1880 // match: (ADD (SLL y z) x) 1881 // cond: 1882 // result: (ADDshiftLLreg x y z) 1883 for { 1884 _ = v.Args[1] 1885 v_0 := v.Args[0] 1886 if v_0.Op != OpARMSLL { 1887 break 1888 } 1889 _ = v_0.Args[1] 1890 y := v_0.Args[0] 1891 z := v_0.Args[1] 1892 x := v.Args[1] 1893 v.reset(OpARMADDshiftLLreg) 1894 v.AddArg(x) 1895 v.AddArg(y) 1896 v.AddArg(z) 1897 return true 1898 } 1899 return false 1900 } 1901 func rewriteValueARM_OpARMADD_10(v *Value) bool { 1902 b := v.Block 1903 _ = b 1904 // match: (ADD x (SRL y z)) 1905 // cond: 1906 // result: (ADDshiftRLreg x y z) 1907 for { 1908 _ = v.Args[1] 1909 x := v.Args[0] 1910 v_1 := v.Args[1] 1911 if v_1.Op != OpARMSRL { 1912 break 1913 } 1914 _ = v_1.Args[1] 1915 y := v_1.Args[0] 1916 z := v_1.Args[1] 1917 v.reset(OpARMADDshiftRLreg) 1918 v.AddArg(x) 1919 v.AddArg(y) 1920 v.AddArg(z) 1921 return true 1922 } 1923 // match: (ADD (SRL y z) x) 1924 // cond: 1925 // result: (ADDshiftRLreg x y z) 1926 for { 1927 _ = v.Args[1] 1928 v_0 := v.Args[0] 1929 if v_0.Op != OpARMSRL { 1930 break 1931 } 1932 _ = v_0.Args[1] 1933 y := v_0.Args[0] 1934 z := v_0.Args[1] 1935 x := v.Args[1] 1936 v.reset(OpARMADDshiftRLreg) 1937 v.AddArg(x) 1938 v.AddArg(y) 1939 v.AddArg(z) 1940 return true 1941 } 1942 // match: (ADD x (SRA y z)) 1943 // cond: 1944 // result: (ADDshiftRAreg x y z) 1945 for { 1946 _ = v.Args[1] 1947 x := v.Args[0] 1948 v_1 := v.Args[1] 1949 if v_1.Op != OpARMSRA { 1950 break 1951 } 1952 _ = v_1.Args[1] 1953 y := v_1.Args[0] 1954 z := v_1.Args[1] 1955 v.reset(OpARMADDshiftRAreg) 1956 v.AddArg(x) 1957 v.AddArg(y) 1958 v.AddArg(z) 1959 return true 1960 } 1961 // match: (ADD (SRA y z) x) 1962 // cond: 1963 // result: (ADDshiftRAreg x y z) 1964 for { 1965 _ = v.Args[1] 1966 v_0 := v.Args[0] 1967 if v_0.Op != OpARMSRA { 1968 break 1969 } 1970 _ = v_0.Args[1] 1971 y := v_0.Args[0] 1972 z := v_0.Args[1] 1973 x := v.Args[1] 1974 v.reset(OpARMADDshiftRAreg) 1975 v.AddArg(x) 1976 v.AddArg(y) 1977 v.AddArg(z) 1978 return true 1979 } 1980 // match: (ADD x (RSBconst [0] y)) 1981 // cond: 1982 // result: (SUB x y) 1983 for { 1984 _ = v.Args[1] 1985 x := v.Args[0] 1986 v_1 := v.Args[1] 1987 if v_1.Op != OpARMRSBconst { 1988 break 1989 } 1990 if v_1.AuxInt != 0 { 1991 break 1992 } 1993 y := v_1.Args[0] 1994 v.reset(OpARMSUB) 1995 v.AddArg(x) 1996 v.AddArg(y) 1997 return true 1998 } 1999 // match: (ADD (RSBconst [0] y) x) 2000 // cond: 2001 // result: (SUB x y) 2002 for { 2003 _ = v.Args[1] 2004 v_0 := v.Args[0] 2005 if v_0.Op != OpARMRSBconst { 2006 break 2007 } 2008 if v_0.AuxInt != 0 { 2009 break 2010 } 2011 y := v_0.Args[0] 2012 x := v.Args[1] 2013 v.reset(OpARMSUB) 2014 v.AddArg(x) 2015 v.AddArg(y) 2016 return true 2017 } 2018 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 2019 // cond: 2020 // result: (RSBconst [c+d] (ADD <t> x y)) 2021 for { 2022 t := v.Type 2023 _ = v.Args[1] 2024 v_0 := v.Args[0] 2025 if v_0.Op != OpARMRSBconst { 2026 break 2027 } 2028 c := v_0.AuxInt 2029 x := v_0.Args[0] 2030 v_1 := v.Args[1] 2031 if v_1.Op != OpARMRSBconst { 2032 break 2033 } 2034 d := v_1.AuxInt 2035 y := v_1.Args[0] 2036 v.reset(OpARMRSBconst) 2037 v.AuxInt = c + d 2038 v0 := b.NewValue0(v.Pos, OpARMADD, t) 2039 v0.AddArg(x) 2040 v0.AddArg(y) 2041 v.AddArg(v0) 2042 return true 2043 } 2044 // match: (ADD <t> (RSBconst [d] y) (RSBconst [c] x)) 2045 // cond: 2046 // result: (RSBconst [c+d] (ADD <t> x y)) 2047 for { 2048 t := v.Type 2049 _ = v.Args[1] 2050 v_0 := v.Args[0] 2051 if v_0.Op != OpARMRSBconst { 2052 break 2053 } 2054 d := v_0.AuxInt 2055 y := v_0.Args[0] 2056 v_1 := v.Args[1] 2057 if v_1.Op != OpARMRSBconst { 2058 break 2059 } 2060 c := v_1.AuxInt 2061 x := v_1.Args[0] 2062 v.reset(OpARMRSBconst) 2063 v.AuxInt = c + d 2064 v0 := b.NewValue0(v.Pos, OpARMADD, t) 2065 v0.AddArg(x) 2066 v0.AddArg(y) 2067 v.AddArg(v0) 2068 return true 2069 } 2070 // match: (ADD (MUL x y) a) 2071 // cond: 2072 // result: (MULA x y a) 2073 for { 2074 _ = v.Args[1] 2075 v_0 := v.Args[0] 2076 if v_0.Op != OpARMMUL { 2077 break 2078 } 2079 _ = v_0.Args[1] 2080 x := v_0.Args[0] 2081 y := v_0.Args[1] 2082 a := v.Args[1] 2083 v.reset(OpARMMULA) 2084 v.AddArg(x) 2085 v.AddArg(y) 2086 v.AddArg(a) 2087 return true 2088 } 2089 // match: (ADD a (MUL x y)) 2090 // cond: 2091 // result: (MULA x y a) 2092 for { 2093 _ = v.Args[1] 2094 a := v.Args[0] 2095 v_1 := v.Args[1] 2096 if v_1.Op != OpARMMUL { 2097 break 2098 } 2099 _ = v_1.Args[1] 2100 x := v_1.Args[0] 2101 y := v_1.Args[1] 2102 v.reset(OpARMMULA) 2103 v.AddArg(x) 2104 v.AddArg(y) 2105 v.AddArg(a) 2106 return true 2107 } 2108 return false 2109 } 2110 func rewriteValueARM_OpARMADDD_0(v *Value) bool { 2111 // match: (ADDD a (MULD x y)) 2112 // cond: a.Uses == 1 && objabi.GOARM >= 6 2113 // result: (MULAD a x y) 2114 for { 2115 _ = v.Args[1] 2116 a := v.Args[0] 2117 v_1 := v.Args[1] 2118 if v_1.Op != OpARMMULD { 2119 break 2120 } 2121 _ = v_1.Args[1] 2122 x := v_1.Args[0] 2123 y := v_1.Args[1] 2124 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2125 break 2126 } 2127 v.reset(OpARMMULAD) 2128 v.AddArg(a) 2129 v.AddArg(x) 2130 v.AddArg(y) 2131 return true 2132 } 2133 // match: (ADDD (MULD x y) a) 2134 // cond: a.Uses == 1 && objabi.GOARM >= 6 2135 // result: (MULAD a x y) 2136 for { 2137 _ = v.Args[1] 2138 v_0 := v.Args[0] 2139 if v_0.Op != OpARMMULD { 2140 break 2141 } 2142 _ = v_0.Args[1] 2143 x := v_0.Args[0] 2144 y := v_0.Args[1] 2145 a := v.Args[1] 2146 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2147 break 2148 } 2149 v.reset(OpARMMULAD) 2150 v.AddArg(a) 2151 v.AddArg(x) 2152 v.AddArg(y) 2153 return true 2154 } 2155 // match: (ADDD a (NMULD x y)) 2156 // cond: a.Uses == 1 && objabi.GOARM >= 6 2157 // result: (MULSD a x y) 2158 for { 2159 _ = v.Args[1] 2160 a := v.Args[0] 2161 v_1 := v.Args[1] 2162 if v_1.Op != OpARMNMULD { 2163 break 2164 } 2165 _ = v_1.Args[1] 2166 x := v_1.Args[0] 2167 y := v_1.Args[1] 2168 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2169 break 2170 } 2171 v.reset(OpARMMULSD) 2172 v.AddArg(a) 2173 v.AddArg(x) 2174 v.AddArg(y) 2175 return true 2176 } 2177 // match: (ADDD (NMULD x y) a) 2178 // cond: a.Uses == 1 && objabi.GOARM >= 6 2179 // result: (MULSD a x y) 2180 for { 2181 _ = v.Args[1] 2182 v_0 := v.Args[0] 2183 if v_0.Op != OpARMNMULD { 2184 break 2185 } 2186 _ = v_0.Args[1] 2187 x := v_0.Args[0] 2188 y := v_0.Args[1] 2189 a := v.Args[1] 2190 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2191 break 2192 } 2193 v.reset(OpARMMULSD) 2194 v.AddArg(a) 2195 v.AddArg(x) 2196 v.AddArg(y) 2197 return true 2198 } 2199 return false 2200 } 2201 func rewriteValueARM_OpARMADDF_0(v *Value) bool { 2202 // match: (ADDF a (MULF x y)) 2203 // cond: a.Uses == 1 && objabi.GOARM >= 6 2204 // result: (MULAF a x y) 2205 for { 2206 _ = v.Args[1] 2207 a := v.Args[0] 2208 v_1 := v.Args[1] 2209 if v_1.Op != OpARMMULF { 2210 break 2211 } 2212 _ = v_1.Args[1] 2213 x := v_1.Args[0] 2214 y := v_1.Args[1] 2215 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2216 break 2217 } 2218 v.reset(OpARMMULAF) 2219 v.AddArg(a) 2220 v.AddArg(x) 2221 v.AddArg(y) 2222 return true 2223 } 2224 // match: (ADDF (MULF x y) a) 2225 // cond: a.Uses == 1 && objabi.GOARM >= 6 2226 // result: (MULAF a x y) 2227 for { 2228 _ = v.Args[1] 2229 v_0 := v.Args[0] 2230 if v_0.Op != OpARMMULF { 2231 break 2232 } 2233 _ = v_0.Args[1] 2234 x := v_0.Args[0] 2235 y := v_0.Args[1] 2236 a := v.Args[1] 2237 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2238 break 2239 } 2240 v.reset(OpARMMULAF) 2241 v.AddArg(a) 2242 v.AddArg(x) 2243 v.AddArg(y) 2244 return true 2245 } 2246 // match: (ADDF a (NMULF x y)) 2247 // cond: a.Uses == 1 && objabi.GOARM >= 6 2248 // result: (MULSF a x y) 2249 for { 2250 _ = v.Args[1] 2251 a := v.Args[0] 2252 v_1 := v.Args[1] 2253 if v_1.Op != OpARMNMULF { 2254 break 2255 } 2256 _ = v_1.Args[1] 2257 x := v_1.Args[0] 2258 y := v_1.Args[1] 2259 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2260 break 2261 } 2262 v.reset(OpARMMULSF) 2263 v.AddArg(a) 2264 v.AddArg(x) 2265 v.AddArg(y) 2266 return true 2267 } 2268 // match: (ADDF (NMULF x y) a) 2269 // cond: a.Uses == 1 && objabi.GOARM >= 6 2270 // result: (MULSF a x y) 2271 for { 2272 _ = v.Args[1] 2273 v_0 := v.Args[0] 2274 if v_0.Op != OpARMNMULF { 2275 break 2276 } 2277 _ = v_0.Args[1] 2278 x := v_0.Args[0] 2279 y := v_0.Args[1] 2280 a := v.Args[1] 2281 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2282 break 2283 } 2284 v.reset(OpARMMULSF) 2285 v.AddArg(a) 2286 v.AddArg(x) 2287 v.AddArg(y) 2288 return true 2289 } 2290 return false 2291 } 2292 func rewriteValueARM_OpARMADDS_0(v *Value) bool { 2293 // match: (ADDS x (MOVWconst [c])) 2294 // cond: 2295 // result: (ADDSconst [c] x) 2296 for { 2297 _ = v.Args[1] 2298 x := v.Args[0] 2299 v_1 := v.Args[1] 2300 if v_1.Op != OpARMMOVWconst { 2301 break 2302 } 2303 c := v_1.AuxInt 2304 v.reset(OpARMADDSconst) 2305 v.AuxInt = c 2306 v.AddArg(x) 2307 return true 2308 } 2309 // match: (ADDS (MOVWconst [c]) x) 2310 // cond: 2311 // result: (ADDSconst [c] x) 2312 for { 2313 _ = v.Args[1] 2314 v_0 := v.Args[0] 2315 if v_0.Op != OpARMMOVWconst { 2316 break 2317 } 2318 c := v_0.AuxInt 2319 x := v.Args[1] 2320 v.reset(OpARMADDSconst) 2321 v.AuxInt = c 2322 v.AddArg(x) 2323 return true 2324 } 2325 // match: (ADDS x (SLLconst [c] y)) 2326 // cond: 2327 // result: (ADDSshiftLL x y [c]) 2328 for { 2329 _ = v.Args[1] 2330 x := v.Args[0] 2331 v_1 := v.Args[1] 2332 if v_1.Op != OpARMSLLconst { 2333 break 2334 } 2335 c := v_1.AuxInt 2336 y := v_1.Args[0] 2337 v.reset(OpARMADDSshiftLL) 2338 v.AuxInt = c 2339 v.AddArg(x) 2340 v.AddArg(y) 2341 return true 2342 } 2343 // match: (ADDS (SLLconst [c] y) x) 2344 // cond: 2345 // result: (ADDSshiftLL x y [c]) 2346 for { 2347 _ = v.Args[1] 2348 v_0 := v.Args[0] 2349 if v_0.Op != OpARMSLLconst { 2350 break 2351 } 2352 c := v_0.AuxInt 2353 y := v_0.Args[0] 2354 x := v.Args[1] 2355 v.reset(OpARMADDSshiftLL) 2356 v.AuxInt = c 2357 v.AddArg(x) 2358 v.AddArg(y) 2359 return true 2360 } 2361 // match: (ADDS x (SRLconst [c] y)) 2362 // cond: 2363 // result: (ADDSshiftRL x y [c]) 2364 for { 2365 _ = v.Args[1] 2366 x := v.Args[0] 2367 v_1 := v.Args[1] 2368 if v_1.Op != OpARMSRLconst { 2369 break 2370 } 2371 c := v_1.AuxInt 2372 y := v_1.Args[0] 2373 v.reset(OpARMADDSshiftRL) 2374 v.AuxInt = c 2375 v.AddArg(x) 2376 v.AddArg(y) 2377 return true 2378 } 2379 // match: (ADDS (SRLconst [c] y) x) 2380 // cond: 2381 // result: (ADDSshiftRL x y [c]) 2382 for { 2383 _ = v.Args[1] 2384 v_0 := v.Args[0] 2385 if v_0.Op != OpARMSRLconst { 2386 break 2387 } 2388 c := v_0.AuxInt 2389 y := v_0.Args[0] 2390 x := v.Args[1] 2391 v.reset(OpARMADDSshiftRL) 2392 v.AuxInt = c 2393 v.AddArg(x) 2394 v.AddArg(y) 2395 return true 2396 } 2397 // match: (ADDS x (SRAconst [c] y)) 2398 // cond: 2399 // result: (ADDSshiftRA x y [c]) 2400 for { 2401 _ = v.Args[1] 2402 x := v.Args[0] 2403 v_1 := v.Args[1] 2404 if v_1.Op != OpARMSRAconst { 2405 break 2406 } 2407 c := v_1.AuxInt 2408 y := v_1.Args[0] 2409 v.reset(OpARMADDSshiftRA) 2410 v.AuxInt = c 2411 v.AddArg(x) 2412 v.AddArg(y) 2413 return true 2414 } 2415 // match: (ADDS (SRAconst [c] y) x) 2416 // cond: 2417 // result: (ADDSshiftRA x y [c]) 2418 for { 2419 _ = v.Args[1] 2420 v_0 := v.Args[0] 2421 if v_0.Op != OpARMSRAconst { 2422 break 2423 } 2424 c := v_0.AuxInt 2425 y := v_0.Args[0] 2426 x := v.Args[1] 2427 v.reset(OpARMADDSshiftRA) 2428 v.AuxInt = c 2429 v.AddArg(x) 2430 v.AddArg(y) 2431 return true 2432 } 2433 // match: (ADDS x (SLL y z)) 2434 // cond: 2435 // result: (ADDSshiftLLreg x y z) 2436 for { 2437 _ = v.Args[1] 2438 x := v.Args[0] 2439 v_1 := v.Args[1] 2440 if v_1.Op != OpARMSLL { 2441 break 2442 } 2443 _ = v_1.Args[1] 2444 y := v_1.Args[0] 2445 z := v_1.Args[1] 2446 v.reset(OpARMADDSshiftLLreg) 2447 v.AddArg(x) 2448 v.AddArg(y) 2449 v.AddArg(z) 2450 return true 2451 } 2452 // match: (ADDS (SLL y z) x) 2453 // cond: 2454 // result: (ADDSshiftLLreg x y z) 2455 for { 2456 _ = v.Args[1] 2457 v_0 := v.Args[0] 2458 if v_0.Op != OpARMSLL { 2459 break 2460 } 2461 _ = v_0.Args[1] 2462 y := v_0.Args[0] 2463 z := v_0.Args[1] 2464 x := v.Args[1] 2465 v.reset(OpARMADDSshiftLLreg) 2466 v.AddArg(x) 2467 v.AddArg(y) 2468 v.AddArg(z) 2469 return true 2470 } 2471 return false 2472 } 2473 func rewriteValueARM_OpARMADDS_10(v *Value) bool { 2474 // match: (ADDS x (SRL y z)) 2475 // cond: 2476 // result: (ADDSshiftRLreg x y z) 2477 for { 2478 _ = v.Args[1] 2479 x := v.Args[0] 2480 v_1 := v.Args[1] 2481 if v_1.Op != OpARMSRL { 2482 break 2483 } 2484 _ = v_1.Args[1] 2485 y := v_1.Args[0] 2486 z := v_1.Args[1] 2487 v.reset(OpARMADDSshiftRLreg) 2488 v.AddArg(x) 2489 v.AddArg(y) 2490 v.AddArg(z) 2491 return true 2492 } 2493 // match: (ADDS (SRL y z) x) 2494 // cond: 2495 // result: (ADDSshiftRLreg x y z) 2496 for { 2497 _ = v.Args[1] 2498 v_0 := v.Args[0] 2499 if v_0.Op != OpARMSRL { 2500 break 2501 } 2502 _ = v_0.Args[1] 2503 y := v_0.Args[0] 2504 z := v_0.Args[1] 2505 x := v.Args[1] 2506 v.reset(OpARMADDSshiftRLreg) 2507 v.AddArg(x) 2508 v.AddArg(y) 2509 v.AddArg(z) 2510 return true 2511 } 2512 // match: (ADDS x (SRA y z)) 2513 // cond: 2514 // result: (ADDSshiftRAreg x y z) 2515 for { 2516 _ = v.Args[1] 2517 x := v.Args[0] 2518 v_1 := v.Args[1] 2519 if v_1.Op != OpARMSRA { 2520 break 2521 } 2522 _ = v_1.Args[1] 2523 y := v_1.Args[0] 2524 z := v_1.Args[1] 2525 v.reset(OpARMADDSshiftRAreg) 2526 v.AddArg(x) 2527 v.AddArg(y) 2528 v.AddArg(z) 2529 return true 2530 } 2531 // match: (ADDS (SRA y z) x) 2532 // cond: 2533 // result: (ADDSshiftRAreg x y z) 2534 for { 2535 _ = v.Args[1] 2536 v_0 := v.Args[0] 2537 if v_0.Op != OpARMSRA { 2538 break 2539 } 2540 _ = v_0.Args[1] 2541 y := v_0.Args[0] 2542 z := v_0.Args[1] 2543 x := v.Args[1] 2544 v.reset(OpARMADDSshiftRAreg) 2545 v.AddArg(x) 2546 v.AddArg(y) 2547 v.AddArg(z) 2548 return true 2549 } 2550 return false 2551 } 2552 func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { 2553 b := v.Block 2554 _ = b 2555 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 2556 // cond: 2557 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 2558 for { 2559 d := v.AuxInt 2560 _ = v.Args[1] 2561 v_0 := v.Args[0] 2562 if v_0.Op != OpARMMOVWconst { 2563 break 2564 } 2565 c := v_0.AuxInt 2566 x := v.Args[1] 2567 v.reset(OpARMADDSconst) 2568 v.AuxInt = c 2569 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2570 v0.AuxInt = d 2571 v0.AddArg(x) 2572 v.AddArg(v0) 2573 return true 2574 } 2575 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 2576 // cond: 2577 // result: (ADDSconst x [int64(int32(uint32(c)<<uint64(d)))]) 2578 for { 2579 d := v.AuxInt 2580 _ = v.Args[1] 2581 x := v.Args[0] 2582 v_1 := v.Args[1] 2583 if v_1.Op != OpARMMOVWconst { 2584 break 2585 } 2586 c := v_1.AuxInt 2587 v.reset(OpARMADDSconst) 2588 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 2589 v.AddArg(x) 2590 return true 2591 } 2592 return false 2593 } 2594 func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { 2595 b := v.Block 2596 _ = b 2597 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 2598 // cond: 2599 // result: (ADDSconst [c] (SLL <x.Type> x y)) 2600 for { 2601 _ = v.Args[2] 2602 v_0 := v.Args[0] 2603 if v_0.Op != OpARMMOVWconst { 2604 break 2605 } 2606 c := v_0.AuxInt 2607 x := v.Args[1] 2608 y := v.Args[2] 2609 v.reset(OpARMADDSconst) 2610 v.AuxInt = c 2611 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2612 v0.AddArg(x) 2613 v0.AddArg(y) 2614 v.AddArg(v0) 2615 return true 2616 } 2617 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 2618 // cond: 2619 // result: (ADDSshiftLL x y [c]) 2620 for { 2621 _ = v.Args[2] 2622 x := v.Args[0] 2623 y := v.Args[1] 2624 v_2 := v.Args[2] 2625 if v_2.Op != OpARMMOVWconst { 2626 break 2627 } 2628 c := v_2.AuxInt 2629 v.reset(OpARMADDSshiftLL) 2630 v.AuxInt = c 2631 v.AddArg(x) 2632 v.AddArg(y) 2633 return true 2634 } 2635 return false 2636 } 2637 func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { 2638 b := v.Block 2639 _ = b 2640 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 2641 // cond: 2642 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 2643 for { 2644 d := v.AuxInt 2645 _ = v.Args[1] 2646 v_0 := v.Args[0] 2647 if v_0.Op != OpARMMOVWconst { 2648 break 2649 } 2650 c := v_0.AuxInt 2651 x := v.Args[1] 2652 v.reset(OpARMADDSconst) 2653 v.AuxInt = c 2654 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2655 v0.AuxInt = d 2656 v0.AddArg(x) 2657 v.AddArg(v0) 2658 return true 2659 } 2660 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 2661 // cond: 2662 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 2663 for { 2664 d := v.AuxInt 2665 _ = v.Args[1] 2666 x := v.Args[0] 2667 v_1 := v.Args[1] 2668 if v_1.Op != OpARMMOVWconst { 2669 break 2670 } 2671 c := v_1.AuxInt 2672 v.reset(OpARMADDSconst) 2673 v.AuxInt = int64(int32(c) >> uint64(d)) 2674 v.AddArg(x) 2675 return true 2676 } 2677 return false 2678 } 2679 func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { 2680 b := v.Block 2681 _ = b 2682 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 2683 // cond: 2684 // result: (ADDSconst [c] (SRA <x.Type> x y)) 2685 for { 2686 _ = v.Args[2] 2687 v_0 := v.Args[0] 2688 if v_0.Op != OpARMMOVWconst { 2689 break 2690 } 2691 c := v_0.AuxInt 2692 x := v.Args[1] 2693 y := v.Args[2] 2694 v.reset(OpARMADDSconst) 2695 v.AuxInt = c 2696 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2697 v0.AddArg(x) 2698 v0.AddArg(y) 2699 v.AddArg(v0) 2700 return true 2701 } 2702 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 2703 // cond: 2704 // result: (ADDSshiftRA x y [c]) 2705 for { 2706 _ = v.Args[2] 2707 x := v.Args[0] 2708 y := v.Args[1] 2709 v_2 := v.Args[2] 2710 if v_2.Op != OpARMMOVWconst { 2711 break 2712 } 2713 c := v_2.AuxInt 2714 v.reset(OpARMADDSshiftRA) 2715 v.AuxInt = c 2716 v.AddArg(x) 2717 v.AddArg(y) 2718 return true 2719 } 2720 return false 2721 } 2722 func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { 2723 b := v.Block 2724 _ = b 2725 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2726 // cond: 2727 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2728 for { 2729 d := v.AuxInt 2730 _ = v.Args[1] 2731 v_0 := v.Args[0] 2732 if v_0.Op != OpARMMOVWconst { 2733 break 2734 } 2735 c := v_0.AuxInt 2736 x := v.Args[1] 2737 v.reset(OpARMADDSconst) 2738 v.AuxInt = c 2739 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2740 v0.AuxInt = d 2741 v0.AddArg(x) 2742 v.AddArg(v0) 2743 return true 2744 } 2745 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2746 // cond: 2747 // result: (ADDSconst x [int64(int32(uint32(c)>>uint64(d)))]) 2748 for { 2749 d := v.AuxInt 2750 _ = v.Args[1] 2751 x := v.Args[0] 2752 v_1 := v.Args[1] 2753 if v_1.Op != OpARMMOVWconst { 2754 break 2755 } 2756 c := v_1.AuxInt 2757 v.reset(OpARMADDSconst) 2758 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 2759 v.AddArg(x) 2760 return true 2761 } 2762 return false 2763 } 2764 func rewriteValueARM_OpARMADDSshiftRLreg_0(v *Value) bool { 2765 b := v.Block 2766 _ = b 2767 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2768 // cond: 2769 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2770 for { 2771 _ = v.Args[2] 2772 v_0 := v.Args[0] 2773 if v_0.Op != OpARMMOVWconst { 2774 break 2775 } 2776 c := v_0.AuxInt 2777 x := v.Args[1] 2778 y := v.Args[2] 2779 v.reset(OpARMADDSconst) 2780 v.AuxInt = c 2781 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2782 v0.AddArg(x) 2783 v0.AddArg(y) 2784 v.AddArg(v0) 2785 return true 2786 } 2787 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2788 // cond: 2789 // result: (ADDSshiftRL x y [c]) 2790 for { 2791 _ = v.Args[2] 2792 x := v.Args[0] 2793 y := v.Args[1] 2794 v_2 := v.Args[2] 2795 if v_2.Op != OpARMMOVWconst { 2796 break 2797 } 2798 c := v_2.AuxInt 2799 v.reset(OpARMADDSshiftRL) 2800 v.AuxInt = c 2801 v.AddArg(x) 2802 v.AddArg(y) 2803 return true 2804 } 2805 return false 2806 } 2807 func rewriteValueARM_OpARMADDconst_0(v *Value) bool { 2808 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2809 // cond: 2810 // result: (MOVWaddr [off1+off2] {sym} ptr) 2811 for { 2812 off1 := v.AuxInt 2813 v_0 := v.Args[0] 2814 if v_0.Op != OpARMMOVWaddr { 2815 break 2816 } 2817 off2 := v_0.AuxInt 2818 sym := v_0.Aux 2819 ptr := v_0.Args[0] 2820 v.reset(OpARMMOVWaddr) 2821 v.AuxInt = off1 + off2 2822 v.Aux = sym 2823 v.AddArg(ptr) 2824 return true 2825 } 2826 // match: (ADDconst [0] x) 2827 // cond: 2828 // result: x 2829 for { 2830 if v.AuxInt != 0 { 2831 break 2832 } 2833 x := v.Args[0] 2834 v.reset(OpCopy) 2835 v.Type = x.Type 2836 v.AddArg(x) 2837 return true 2838 } 2839 // match: (ADDconst [c] x) 2840 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 2841 // result: (SUBconst [int64(int32(-c))] x) 2842 for { 2843 c := v.AuxInt 2844 x := v.Args[0] 2845 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 2846 break 2847 } 2848 v.reset(OpARMSUBconst) 2849 v.AuxInt = int64(int32(-c)) 2850 v.AddArg(x) 2851 return true 2852 } 2853 // match: (ADDconst [c] x) 2854 // cond: objabi.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff 2855 // result: (SUBconst [int64(int32(-c))] x) 2856 for { 2857 c := v.AuxInt 2858 x := v.Args[0] 2859 if !(objabi.GOARM == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) { 2860 break 2861 } 2862 v.reset(OpARMSUBconst) 2863 v.AuxInt = int64(int32(-c)) 2864 v.AddArg(x) 2865 return true 2866 } 2867 // match: (ADDconst [c] (MOVWconst [d])) 2868 // cond: 2869 // result: (MOVWconst [int64(int32(c+d))]) 2870 for { 2871 c := v.AuxInt 2872 v_0 := v.Args[0] 2873 if v_0.Op != OpARMMOVWconst { 2874 break 2875 } 2876 d := v_0.AuxInt 2877 v.reset(OpARMMOVWconst) 2878 v.AuxInt = int64(int32(c + d)) 2879 return true 2880 } 2881 // match: (ADDconst [c] (ADDconst [d] x)) 2882 // cond: 2883 // result: (ADDconst [int64(int32(c+d))] x) 2884 for { 2885 c := v.AuxInt 2886 v_0 := v.Args[0] 2887 if v_0.Op != OpARMADDconst { 2888 break 2889 } 2890 d := v_0.AuxInt 2891 x := v_0.Args[0] 2892 v.reset(OpARMADDconst) 2893 v.AuxInt = int64(int32(c + d)) 2894 v.AddArg(x) 2895 return true 2896 } 2897 // match: (ADDconst [c] (SUBconst [d] x)) 2898 // cond: 2899 // result: (ADDconst [int64(int32(c-d))] x) 2900 for { 2901 c := v.AuxInt 2902 v_0 := v.Args[0] 2903 if v_0.Op != OpARMSUBconst { 2904 break 2905 } 2906 d := v_0.AuxInt 2907 x := v_0.Args[0] 2908 v.reset(OpARMADDconst) 2909 v.AuxInt = int64(int32(c - d)) 2910 v.AddArg(x) 2911 return true 2912 } 2913 // match: (ADDconst [c] (RSBconst [d] x)) 2914 // cond: 2915 // result: (RSBconst [int64(int32(c+d))] x) 2916 for { 2917 c := v.AuxInt 2918 v_0 := v.Args[0] 2919 if v_0.Op != OpARMRSBconst { 2920 break 2921 } 2922 d := v_0.AuxInt 2923 x := v_0.Args[0] 2924 v.reset(OpARMRSBconst) 2925 v.AuxInt = int64(int32(c + d)) 2926 v.AddArg(x) 2927 return true 2928 } 2929 return false 2930 } 2931 func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { 2932 b := v.Block 2933 _ = b 2934 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2935 // cond: 2936 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2937 for { 2938 d := v.AuxInt 2939 _ = v.Args[1] 2940 v_0 := v.Args[0] 2941 if v_0.Op != OpARMMOVWconst { 2942 break 2943 } 2944 c := v_0.AuxInt 2945 x := v.Args[1] 2946 v.reset(OpARMADDconst) 2947 v.AuxInt = c 2948 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2949 v0.AuxInt = d 2950 v0.AddArg(x) 2951 v.AddArg(v0) 2952 return true 2953 } 2954 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2955 // cond: 2956 // result: (ADDconst x [int64(int32(uint32(c)<<uint64(d)))]) 2957 for { 2958 d := v.AuxInt 2959 _ = v.Args[1] 2960 x := v.Args[0] 2961 v_1 := v.Args[1] 2962 if v_1.Op != OpARMMOVWconst { 2963 break 2964 } 2965 c := v_1.AuxInt 2966 v.reset(OpARMADDconst) 2967 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 2968 v.AddArg(x) 2969 return true 2970 } 2971 // match: (ADDshiftLL [c] (SRLconst x [32-c]) x) 2972 // cond: 2973 // result: (SRRconst [32-c] x) 2974 for { 2975 c := v.AuxInt 2976 _ = v.Args[1] 2977 v_0 := v.Args[0] 2978 if v_0.Op != OpARMSRLconst { 2979 break 2980 } 2981 if v_0.AuxInt != 32-c { 2982 break 2983 } 2984 x := v_0.Args[0] 2985 if x != v.Args[1] { 2986 break 2987 } 2988 v.reset(OpARMSRRconst) 2989 v.AuxInt = 32 - c 2990 v.AddArg(x) 2991 return true 2992 } 2993 return false 2994 } 2995 func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { 2996 b := v.Block 2997 _ = b 2998 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2999 // cond: 3000 // result: (ADDconst [c] (SLL <x.Type> x y)) 3001 for { 3002 _ = v.Args[2] 3003 v_0 := v.Args[0] 3004 if v_0.Op != OpARMMOVWconst { 3005 break 3006 } 3007 c := v_0.AuxInt 3008 x := v.Args[1] 3009 y := v.Args[2] 3010 v.reset(OpARMADDconst) 3011 v.AuxInt = c 3012 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3013 v0.AddArg(x) 3014 v0.AddArg(y) 3015 v.AddArg(v0) 3016 return true 3017 } 3018 // match: (ADDshiftLLreg x y (MOVWconst [c])) 3019 // cond: 3020 // result: (ADDshiftLL x y [c]) 3021 for { 3022 _ = v.Args[2] 3023 x := v.Args[0] 3024 y := v.Args[1] 3025 v_2 := v.Args[2] 3026 if v_2.Op != OpARMMOVWconst { 3027 break 3028 } 3029 c := v_2.AuxInt 3030 v.reset(OpARMADDshiftLL) 3031 v.AuxInt = c 3032 v.AddArg(x) 3033 v.AddArg(y) 3034 return true 3035 } 3036 return false 3037 } 3038 func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { 3039 b := v.Block 3040 _ = b 3041 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 3042 // cond: 3043 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 3044 for { 3045 d := v.AuxInt 3046 _ = v.Args[1] 3047 v_0 := v.Args[0] 3048 if v_0.Op != OpARMMOVWconst { 3049 break 3050 } 3051 c := v_0.AuxInt 3052 x := v.Args[1] 3053 v.reset(OpARMADDconst) 3054 v.AuxInt = c 3055 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3056 v0.AuxInt = d 3057 v0.AddArg(x) 3058 v.AddArg(v0) 3059 return true 3060 } 3061 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 3062 // cond: 3063 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 3064 for { 3065 d := v.AuxInt 3066 _ = v.Args[1] 3067 x := v.Args[0] 3068 v_1 := v.Args[1] 3069 if v_1.Op != OpARMMOVWconst { 3070 break 3071 } 3072 c := v_1.AuxInt 3073 v.reset(OpARMADDconst) 3074 v.AuxInt = int64(int32(c) >> uint64(d)) 3075 v.AddArg(x) 3076 return true 3077 } 3078 return false 3079 } 3080 func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { 3081 b := v.Block 3082 _ = b 3083 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 3084 // cond: 3085 // result: (ADDconst [c] (SRA <x.Type> x y)) 3086 for { 3087 _ = v.Args[2] 3088 v_0 := v.Args[0] 3089 if v_0.Op != OpARMMOVWconst { 3090 break 3091 } 3092 c := v_0.AuxInt 3093 x := v.Args[1] 3094 y := v.Args[2] 3095 v.reset(OpARMADDconst) 3096 v.AuxInt = c 3097 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3098 v0.AddArg(x) 3099 v0.AddArg(y) 3100 v.AddArg(v0) 3101 return true 3102 } 3103 // match: (ADDshiftRAreg x y (MOVWconst [c])) 3104 // cond: 3105 // result: (ADDshiftRA x y [c]) 3106 for { 3107 _ = v.Args[2] 3108 x := v.Args[0] 3109 y := v.Args[1] 3110 v_2 := v.Args[2] 3111 if v_2.Op != OpARMMOVWconst { 3112 break 3113 } 3114 c := v_2.AuxInt 3115 v.reset(OpARMADDshiftRA) 3116 v.AuxInt = c 3117 v.AddArg(x) 3118 v.AddArg(y) 3119 return true 3120 } 3121 return false 3122 } 3123 func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { 3124 b := v.Block 3125 _ = b 3126 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 3127 // cond: 3128 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 3129 for { 3130 d := v.AuxInt 3131 _ = v.Args[1] 3132 v_0 := v.Args[0] 3133 if v_0.Op != OpARMMOVWconst { 3134 break 3135 } 3136 c := v_0.AuxInt 3137 x := v.Args[1] 3138 v.reset(OpARMADDconst) 3139 v.AuxInt = c 3140 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3141 v0.AuxInt = d 3142 v0.AddArg(x) 3143 v.AddArg(v0) 3144 return true 3145 } 3146 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 3147 // cond: 3148 // result: (ADDconst x [int64(int32(uint32(c)>>uint64(d)))]) 3149 for { 3150 d := v.AuxInt 3151 _ = v.Args[1] 3152 x := v.Args[0] 3153 v_1 := v.Args[1] 3154 if v_1.Op != OpARMMOVWconst { 3155 break 3156 } 3157 c := v_1.AuxInt 3158 v.reset(OpARMADDconst) 3159 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 3160 v.AddArg(x) 3161 return true 3162 } 3163 // match: (ADDshiftRL [c] (SLLconst x [32-c]) x) 3164 // cond: 3165 // result: (SRRconst [ c] x) 3166 for { 3167 c := v.AuxInt 3168 _ = v.Args[1] 3169 v_0 := v.Args[0] 3170 if v_0.Op != OpARMSLLconst { 3171 break 3172 } 3173 if v_0.AuxInt != 32-c { 3174 break 3175 } 3176 x := v_0.Args[0] 3177 if x != v.Args[1] { 3178 break 3179 } 3180 v.reset(OpARMSRRconst) 3181 v.AuxInt = c 3182 v.AddArg(x) 3183 return true 3184 } 3185 return false 3186 } 3187 func rewriteValueARM_OpARMADDshiftRLreg_0(v *Value) bool { 3188 b := v.Block 3189 _ = b 3190 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 3191 // cond: 3192 // result: (ADDconst [c] (SRL <x.Type> x y)) 3193 for { 3194 _ = v.Args[2] 3195 v_0 := v.Args[0] 3196 if v_0.Op != OpARMMOVWconst { 3197 break 3198 } 3199 c := v_0.AuxInt 3200 x := v.Args[1] 3201 y := v.Args[2] 3202 v.reset(OpARMADDconst) 3203 v.AuxInt = c 3204 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3205 v0.AddArg(x) 3206 v0.AddArg(y) 3207 v.AddArg(v0) 3208 return true 3209 } 3210 // match: (ADDshiftRLreg x y (MOVWconst [c])) 3211 // cond: 3212 // result: (ADDshiftRL x y [c]) 3213 for { 3214 _ = v.Args[2] 3215 x := v.Args[0] 3216 y := v.Args[1] 3217 v_2 := v.Args[2] 3218 if v_2.Op != OpARMMOVWconst { 3219 break 3220 } 3221 c := v_2.AuxInt 3222 v.reset(OpARMADDshiftRL) 3223 v.AuxInt = c 3224 v.AddArg(x) 3225 v.AddArg(y) 3226 return true 3227 } 3228 return false 3229 } 3230 func rewriteValueARM_OpARMAND_0(v *Value) bool { 3231 // match: (AND x (MOVWconst [c])) 3232 // cond: 3233 // result: (ANDconst [c] x) 3234 for { 3235 _ = v.Args[1] 3236 x := v.Args[0] 3237 v_1 := v.Args[1] 3238 if v_1.Op != OpARMMOVWconst { 3239 break 3240 } 3241 c := v_1.AuxInt 3242 v.reset(OpARMANDconst) 3243 v.AuxInt = c 3244 v.AddArg(x) 3245 return true 3246 } 3247 // match: (AND (MOVWconst [c]) x) 3248 // cond: 3249 // result: (ANDconst [c] x) 3250 for { 3251 _ = v.Args[1] 3252 v_0 := v.Args[0] 3253 if v_0.Op != OpARMMOVWconst { 3254 break 3255 } 3256 c := v_0.AuxInt 3257 x := v.Args[1] 3258 v.reset(OpARMANDconst) 3259 v.AuxInt = c 3260 v.AddArg(x) 3261 return true 3262 } 3263 // match: (AND x (SLLconst [c] y)) 3264 // cond: 3265 // result: (ANDshiftLL x y [c]) 3266 for { 3267 _ = v.Args[1] 3268 x := v.Args[0] 3269 v_1 := v.Args[1] 3270 if v_1.Op != OpARMSLLconst { 3271 break 3272 } 3273 c := v_1.AuxInt 3274 y := v_1.Args[0] 3275 v.reset(OpARMANDshiftLL) 3276 v.AuxInt = c 3277 v.AddArg(x) 3278 v.AddArg(y) 3279 return true 3280 } 3281 // match: (AND (SLLconst [c] y) x) 3282 // cond: 3283 // result: (ANDshiftLL x y [c]) 3284 for { 3285 _ = v.Args[1] 3286 v_0 := v.Args[0] 3287 if v_0.Op != OpARMSLLconst { 3288 break 3289 } 3290 c := v_0.AuxInt 3291 y := v_0.Args[0] 3292 x := v.Args[1] 3293 v.reset(OpARMANDshiftLL) 3294 v.AuxInt = c 3295 v.AddArg(x) 3296 v.AddArg(y) 3297 return true 3298 } 3299 // match: (AND x (SRLconst [c] y)) 3300 // cond: 3301 // result: (ANDshiftRL x y [c]) 3302 for { 3303 _ = v.Args[1] 3304 x := v.Args[0] 3305 v_1 := v.Args[1] 3306 if v_1.Op != OpARMSRLconst { 3307 break 3308 } 3309 c := v_1.AuxInt 3310 y := v_1.Args[0] 3311 v.reset(OpARMANDshiftRL) 3312 v.AuxInt = c 3313 v.AddArg(x) 3314 v.AddArg(y) 3315 return true 3316 } 3317 // match: (AND (SRLconst [c] y) x) 3318 // cond: 3319 // result: (ANDshiftRL x y [c]) 3320 for { 3321 _ = v.Args[1] 3322 v_0 := v.Args[0] 3323 if v_0.Op != OpARMSRLconst { 3324 break 3325 } 3326 c := v_0.AuxInt 3327 y := v_0.Args[0] 3328 x := v.Args[1] 3329 v.reset(OpARMANDshiftRL) 3330 v.AuxInt = c 3331 v.AddArg(x) 3332 v.AddArg(y) 3333 return true 3334 } 3335 // match: (AND x (SRAconst [c] y)) 3336 // cond: 3337 // result: (ANDshiftRA x y [c]) 3338 for { 3339 _ = v.Args[1] 3340 x := v.Args[0] 3341 v_1 := v.Args[1] 3342 if v_1.Op != OpARMSRAconst { 3343 break 3344 } 3345 c := v_1.AuxInt 3346 y := v_1.Args[0] 3347 v.reset(OpARMANDshiftRA) 3348 v.AuxInt = c 3349 v.AddArg(x) 3350 v.AddArg(y) 3351 return true 3352 } 3353 // match: (AND (SRAconst [c] y) x) 3354 // cond: 3355 // result: (ANDshiftRA x y [c]) 3356 for { 3357 _ = v.Args[1] 3358 v_0 := v.Args[0] 3359 if v_0.Op != OpARMSRAconst { 3360 break 3361 } 3362 c := v_0.AuxInt 3363 y := v_0.Args[0] 3364 x := v.Args[1] 3365 v.reset(OpARMANDshiftRA) 3366 v.AuxInt = c 3367 v.AddArg(x) 3368 v.AddArg(y) 3369 return true 3370 } 3371 // match: (AND x (SLL y z)) 3372 // cond: 3373 // result: (ANDshiftLLreg x y z) 3374 for { 3375 _ = v.Args[1] 3376 x := v.Args[0] 3377 v_1 := v.Args[1] 3378 if v_1.Op != OpARMSLL { 3379 break 3380 } 3381 _ = v_1.Args[1] 3382 y := v_1.Args[0] 3383 z := v_1.Args[1] 3384 v.reset(OpARMANDshiftLLreg) 3385 v.AddArg(x) 3386 v.AddArg(y) 3387 v.AddArg(z) 3388 return true 3389 } 3390 // match: (AND (SLL y z) x) 3391 // cond: 3392 // result: (ANDshiftLLreg x y z) 3393 for { 3394 _ = v.Args[1] 3395 v_0 := v.Args[0] 3396 if v_0.Op != OpARMSLL { 3397 break 3398 } 3399 _ = v_0.Args[1] 3400 y := v_0.Args[0] 3401 z := v_0.Args[1] 3402 x := v.Args[1] 3403 v.reset(OpARMANDshiftLLreg) 3404 v.AddArg(x) 3405 v.AddArg(y) 3406 v.AddArg(z) 3407 return true 3408 } 3409 return false 3410 } 3411 func rewriteValueARM_OpARMAND_10(v *Value) bool { 3412 // match: (AND x (SRL y z)) 3413 // cond: 3414 // result: (ANDshiftRLreg x y z) 3415 for { 3416 _ = v.Args[1] 3417 x := v.Args[0] 3418 v_1 := v.Args[1] 3419 if v_1.Op != OpARMSRL { 3420 break 3421 } 3422 _ = v_1.Args[1] 3423 y := v_1.Args[0] 3424 z := v_1.Args[1] 3425 v.reset(OpARMANDshiftRLreg) 3426 v.AddArg(x) 3427 v.AddArg(y) 3428 v.AddArg(z) 3429 return true 3430 } 3431 // match: (AND (SRL y z) x) 3432 // cond: 3433 // result: (ANDshiftRLreg x y z) 3434 for { 3435 _ = v.Args[1] 3436 v_0 := v.Args[0] 3437 if v_0.Op != OpARMSRL { 3438 break 3439 } 3440 _ = v_0.Args[1] 3441 y := v_0.Args[0] 3442 z := v_0.Args[1] 3443 x := v.Args[1] 3444 v.reset(OpARMANDshiftRLreg) 3445 v.AddArg(x) 3446 v.AddArg(y) 3447 v.AddArg(z) 3448 return true 3449 } 3450 // match: (AND x (SRA y z)) 3451 // cond: 3452 // result: (ANDshiftRAreg x y z) 3453 for { 3454 _ = v.Args[1] 3455 x := v.Args[0] 3456 v_1 := v.Args[1] 3457 if v_1.Op != OpARMSRA { 3458 break 3459 } 3460 _ = v_1.Args[1] 3461 y := v_1.Args[0] 3462 z := v_1.Args[1] 3463 v.reset(OpARMANDshiftRAreg) 3464 v.AddArg(x) 3465 v.AddArg(y) 3466 v.AddArg(z) 3467 return true 3468 } 3469 // match: (AND (SRA y z) x) 3470 // cond: 3471 // result: (ANDshiftRAreg x y z) 3472 for { 3473 _ = v.Args[1] 3474 v_0 := v.Args[0] 3475 if v_0.Op != OpARMSRA { 3476 break 3477 } 3478 _ = v_0.Args[1] 3479 y := v_0.Args[0] 3480 z := v_0.Args[1] 3481 x := v.Args[1] 3482 v.reset(OpARMANDshiftRAreg) 3483 v.AddArg(x) 3484 v.AddArg(y) 3485 v.AddArg(z) 3486 return true 3487 } 3488 // match: (AND x x) 3489 // cond: 3490 // result: x 3491 for { 3492 _ = v.Args[1] 3493 x := v.Args[0] 3494 if x != v.Args[1] { 3495 break 3496 } 3497 v.reset(OpCopy) 3498 v.Type = x.Type 3499 v.AddArg(x) 3500 return true 3501 } 3502 // match: (AND x (MVN y)) 3503 // cond: 3504 // result: (BIC x y) 3505 for { 3506 _ = v.Args[1] 3507 x := v.Args[0] 3508 v_1 := v.Args[1] 3509 if v_1.Op != OpARMMVN { 3510 break 3511 } 3512 y := v_1.Args[0] 3513 v.reset(OpARMBIC) 3514 v.AddArg(x) 3515 v.AddArg(y) 3516 return true 3517 } 3518 // match: (AND (MVN y) x) 3519 // cond: 3520 // result: (BIC x y) 3521 for { 3522 _ = v.Args[1] 3523 v_0 := v.Args[0] 3524 if v_0.Op != OpARMMVN { 3525 break 3526 } 3527 y := v_0.Args[0] 3528 x := v.Args[1] 3529 v.reset(OpARMBIC) 3530 v.AddArg(x) 3531 v.AddArg(y) 3532 return true 3533 } 3534 // match: (AND x (MVNshiftLL y [c])) 3535 // cond: 3536 // result: (BICshiftLL x y [c]) 3537 for { 3538 _ = v.Args[1] 3539 x := v.Args[0] 3540 v_1 := v.Args[1] 3541 if v_1.Op != OpARMMVNshiftLL { 3542 break 3543 } 3544 c := v_1.AuxInt 3545 y := v_1.Args[0] 3546 v.reset(OpARMBICshiftLL) 3547 v.AuxInt = c 3548 v.AddArg(x) 3549 v.AddArg(y) 3550 return true 3551 } 3552 // match: (AND (MVNshiftLL y [c]) x) 3553 // cond: 3554 // result: (BICshiftLL x y [c]) 3555 for { 3556 _ = v.Args[1] 3557 v_0 := v.Args[0] 3558 if v_0.Op != OpARMMVNshiftLL { 3559 break 3560 } 3561 c := v_0.AuxInt 3562 y := v_0.Args[0] 3563 x := v.Args[1] 3564 v.reset(OpARMBICshiftLL) 3565 v.AuxInt = c 3566 v.AddArg(x) 3567 v.AddArg(y) 3568 return true 3569 } 3570 // match: (AND x (MVNshiftRL y [c])) 3571 // cond: 3572 // result: (BICshiftRL x y [c]) 3573 for { 3574 _ = v.Args[1] 3575 x := v.Args[0] 3576 v_1 := v.Args[1] 3577 if v_1.Op != OpARMMVNshiftRL { 3578 break 3579 } 3580 c := v_1.AuxInt 3581 y := v_1.Args[0] 3582 v.reset(OpARMBICshiftRL) 3583 v.AuxInt = c 3584 v.AddArg(x) 3585 v.AddArg(y) 3586 return true 3587 } 3588 return false 3589 } 3590 func rewriteValueARM_OpARMAND_20(v *Value) bool { 3591 // match: (AND (MVNshiftRL y [c]) x) 3592 // cond: 3593 // result: (BICshiftRL x y [c]) 3594 for { 3595 _ = v.Args[1] 3596 v_0 := v.Args[0] 3597 if v_0.Op != OpARMMVNshiftRL { 3598 break 3599 } 3600 c := v_0.AuxInt 3601 y := v_0.Args[0] 3602 x := v.Args[1] 3603 v.reset(OpARMBICshiftRL) 3604 v.AuxInt = c 3605 v.AddArg(x) 3606 v.AddArg(y) 3607 return true 3608 } 3609 // match: (AND x (MVNshiftRA y [c])) 3610 // cond: 3611 // result: (BICshiftRA x y [c]) 3612 for { 3613 _ = v.Args[1] 3614 x := v.Args[0] 3615 v_1 := v.Args[1] 3616 if v_1.Op != OpARMMVNshiftRA { 3617 break 3618 } 3619 c := v_1.AuxInt 3620 y := v_1.Args[0] 3621 v.reset(OpARMBICshiftRA) 3622 v.AuxInt = c 3623 v.AddArg(x) 3624 v.AddArg(y) 3625 return true 3626 } 3627 // match: (AND (MVNshiftRA y [c]) x) 3628 // cond: 3629 // result: (BICshiftRA x y [c]) 3630 for { 3631 _ = v.Args[1] 3632 v_0 := v.Args[0] 3633 if v_0.Op != OpARMMVNshiftRA { 3634 break 3635 } 3636 c := v_0.AuxInt 3637 y := v_0.Args[0] 3638 x := v.Args[1] 3639 v.reset(OpARMBICshiftRA) 3640 v.AuxInt = c 3641 v.AddArg(x) 3642 v.AddArg(y) 3643 return true 3644 } 3645 return false 3646 } 3647 func rewriteValueARM_OpARMANDconst_0(v *Value) bool { 3648 // match: (ANDconst [0] _) 3649 // cond: 3650 // result: (MOVWconst [0]) 3651 for { 3652 if v.AuxInt != 0 { 3653 break 3654 } 3655 v.reset(OpARMMOVWconst) 3656 v.AuxInt = 0 3657 return true 3658 } 3659 // match: (ANDconst [c] x) 3660 // cond: int32(c)==-1 3661 // result: x 3662 for { 3663 c := v.AuxInt 3664 x := v.Args[0] 3665 if !(int32(c) == -1) { 3666 break 3667 } 3668 v.reset(OpCopy) 3669 v.Type = x.Type 3670 v.AddArg(x) 3671 return true 3672 } 3673 // match: (ANDconst [c] x) 3674 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3675 // result: (BICconst [int64(int32(^uint32(c)))] x) 3676 for { 3677 c := v.AuxInt 3678 x := v.Args[0] 3679 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3680 break 3681 } 3682 v.reset(OpARMBICconst) 3683 v.AuxInt = int64(int32(^uint32(c))) 3684 v.AddArg(x) 3685 return true 3686 } 3687 // match: (ANDconst [c] x) 3688 // cond: objabi.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff 3689 // result: (BICconst [int64(int32(^uint32(c)))] x) 3690 for { 3691 c := v.AuxInt 3692 x := v.Args[0] 3693 if !(objabi.GOARM == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) { 3694 break 3695 } 3696 v.reset(OpARMBICconst) 3697 v.AuxInt = int64(int32(^uint32(c))) 3698 v.AddArg(x) 3699 return true 3700 } 3701 // match: (ANDconst [c] (MOVWconst [d])) 3702 // cond: 3703 // result: (MOVWconst [c&d]) 3704 for { 3705 c := v.AuxInt 3706 v_0 := v.Args[0] 3707 if v_0.Op != OpARMMOVWconst { 3708 break 3709 } 3710 d := v_0.AuxInt 3711 v.reset(OpARMMOVWconst) 3712 v.AuxInt = c & d 3713 return true 3714 } 3715 // match: (ANDconst [c] (ANDconst [d] x)) 3716 // cond: 3717 // result: (ANDconst [c&d] x) 3718 for { 3719 c := v.AuxInt 3720 v_0 := v.Args[0] 3721 if v_0.Op != OpARMANDconst { 3722 break 3723 } 3724 d := v_0.AuxInt 3725 x := v_0.Args[0] 3726 v.reset(OpARMANDconst) 3727 v.AuxInt = c & d 3728 v.AddArg(x) 3729 return true 3730 } 3731 return false 3732 } 3733 func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { 3734 b := v.Block 3735 _ = b 3736 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 3737 // cond: 3738 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 3739 for { 3740 d := v.AuxInt 3741 _ = v.Args[1] 3742 v_0 := v.Args[0] 3743 if v_0.Op != OpARMMOVWconst { 3744 break 3745 } 3746 c := v_0.AuxInt 3747 x := v.Args[1] 3748 v.reset(OpARMANDconst) 3749 v.AuxInt = c 3750 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3751 v0.AuxInt = d 3752 v0.AddArg(x) 3753 v.AddArg(v0) 3754 return true 3755 } 3756 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 3757 // cond: 3758 // result: (ANDconst x [int64(int32(uint32(c)<<uint64(d)))]) 3759 for { 3760 d := v.AuxInt 3761 _ = v.Args[1] 3762 x := v.Args[0] 3763 v_1 := v.Args[1] 3764 if v_1.Op != OpARMMOVWconst { 3765 break 3766 } 3767 c := v_1.AuxInt 3768 v.reset(OpARMANDconst) 3769 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 3770 v.AddArg(x) 3771 return true 3772 } 3773 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 3774 // cond: c==d 3775 // result: y 3776 for { 3777 d := v.AuxInt 3778 _ = v.Args[1] 3779 x := v.Args[0] 3780 y := v.Args[1] 3781 if y.Op != OpARMSLLconst { 3782 break 3783 } 3784 c := y.AuxInt 3785 if x != y.Args[0] { 3786 break 3787 } 3788 if !(c == d) { 3789 break 3790 } 3791 v.reset(OpCopy) 3792 v.Type = y.Type 3793 v.AddArg(y) 3794 return true 3795 } 3796 return false 3797 } 3798 func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { 3799 b := v.Block 3800 _ = b 3801 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 3802 // cond: 3803 // result: (ANDconst [c] (SLL <x.Type> x y)) 3804 for { 3805 _ = v.Args[2] 3806 v_0 := v.Args[0] 3807 if v_0.Op != OpARMMOVWconst { 3808 break 3809 } 3810 c := v_0.AuxInt 3811 x := v.Args[1] 3812 y := v.Args[2] 3813 v.reset(OpARMANDconst) 3814 v.AuxInt = c 3815 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3816 v0.AddArg(x) 3817 v0.AddArg(y) 3818 v.AddArg(v0) 3819 return true 3820 } 3821 // match: (ANDshiftLLreg x y (MOVWconst [c])) 3822 // cond: 3823 // result: (ANDshiftLL x y [c]) 3824 for { 3825 _ = v.Args[2] 3826 x := v.Args[0] 3827 y := v.Args[1] 3828 v_2 := v.Args[2] 3829 if v_2.Op != OpARMMOVWconst { 3830 break 3831 } 3832 c := v_2.AuxInt 3833 v.reset(OpARMANDshiftLL) 3834 v.AuxInt = c 3835 v.AddArg(x) 3836 v.AddArg(y) 3837 return true 3838 } 3839 return false 3840 } 3841 func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { 3842 b := v.Block 3843 _ = b 3844 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 3845 // cond: 3846 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 3847 for { 3848 d := v.AuxInt 3849 _ = v.Args[1] 3850 v_0 := v.Args[0] 3851 if v_0.Op != OpARMMOVWconst { 3852 break 3853 } 3854 c := v_0.AuxInt 3855 x := v.Args[1] 3856 v.reset(OpARMANDconst) 3857 v.AuxInt = c 3858 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3859 v0.AuxInt = d 3860 v0.AddArg(x) 3861 v.AddArg(v0) 3862 return true 3863 } 3864 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3865 // cond: 3866 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3867 for { 3868 d := v.AuxInt 3869 _ = v.Args[1] 3870 x := v.Args[0] 3871 v_1 := v.Args[1] 3872 if v_1.Op != OpARMMOVWconst { 3873 break 3874 } 3875 c := v_1.AuxInt 3876 v.reset(OpARMANDconst) 3877 v.AuxInt = int64(int32(c) >> uint64(d)) 3878 v.AddArg(x) 3879 return true 3880 } 3881 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3882 // cond: c==d 3883 // result: y 3884 for { 3885 d := v.AuxInt 3886 _ = v.Args[1] 3887 x := v.Args[0] 3888 y := v.Args[1] 3889 if y.Op != OpARMSRAconst { 3890 break 3891 } 3892 c := y.AuxInt 3893 if x != y.Args[0] { 3894 break 3895 } 3896 if !(c == d) { 3897 break 3898 } 3899 v.reset(OpCopy) 3900 v.Type = y.Type 3901 v.AddArg(y) 3902 return true 3903 } 3904 return false 3905 } 3906 func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { 3907 b := v.Block 3908 _ = b 3909 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3910 // cond: 3911 // result: (ANDconst [c] (SRA <x.Type> x y)) 3912 for { 3913 _ = v.Args[2] 3914 v_0 := v.Args[0] 3915 if v_0.Op != OpARMMOVWconst { 3916 break 3917 } 3918 c := v_0.AuxInt 3919 x := v.Args[1] 3920 y := v.Args[2] 3921 v.reset(OpARMANDconst) 3922 v.AuxInt = c 3923 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3924 v0.AddArg(x) 3925 v0.AddArg(y) 3926 v.AddArg(v0) 3927 return true 3928 } 3929 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3930 // cond: 3931 // result: (ANDshiftRA x y [c]) 3932 for { 3933 _ = v.Args[2] 3934 x := v.Args[0] 3935 y := v.Args[1] 3936 v_2 := v.Args[2] 3937 if v_2.Op != OpARMMOVWconst { 3938 break 3939 } 3940 c := v_2.AuxInt 3941 v.reset(OpARMANDshiftRA) 3942 v.AuxInt = c 3943 v.AddArg(x) 3944 v.AddArg(y) 3945 return true 3946 } 3947 return false 3948 } 3949 func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { 3950 b := v.Block 3951 _ = b 3952 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3953 // cond: 3954 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3955 for { 3956 d := v.AuxInt 3957 _ = v.Args[1] 3958 v_0 := v.Args[0] 3959 if v_0.Op != OpARMMOVWconst { 3960 break 3961 } 3962 c := v_0.AuxInt 3963 x := v.Args[1] 3964 v.reset(OpARMANDconst) 3965 v.AuxInt = c 3966 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3967 v0.AuxInt = d 3968 v0.AddArg(x) 3969 v.AddArg(v0) 3970 return true 3971 } 3972 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3973 // cond: 3974 // result: (ANDconst x [int64(int32(uint32(c)>>uint64(d)))]) 3975 for { 3976 d := v.AuxInt 3977 _ = v.Args[1] 3978 x := v.Args[0] 3979 v_1 := v.Args[1] 3980 if v_1.Op != OpARMMOVWconst { 3981 break 3982 } 3983 c := v_1.AuxInt 3984 v.reset(OpARMANDconst) 3985 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 3986 v.AddArg(x) 3987 return true 3988 } 3989 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3990 // cond: c==d 3991 // result: y 3992 for { 3993 d := v.AuxInt 3994 _ = v.Args[1] 3995 x := v.Args[0] 3996 y := v.Args[1] 3997 if y.Op != OpARMSRLconst { 3998 break 3999 } 4000 c := y.AuxInt 4001 if x != y.Args[0] { 4002 break 4003 } 4004 if !(c == d) { 4005 break 4006 } 4007 v.reset(OpCopy) 4008 v.Type = y.Type 4009 v.AddArg(y) 4010 return true 4011 } 4012 return false 4013 } 4014 func rewriteValueARM_OpARMANDshiftRLreg_0(v *Value) bool { 4015 b := v.Block 4016 _ = b 4017 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 4018 // cond: 4019 // result: (ANDconst [c] (SRL <x.Type> x y)) 4020 for { 4021 _ = v.Args[2] 4022 v_0 := v.Args[0] 4023 if v_0.Op != OpARMMOVWconst { 4024 break 4025 } 4026 c := v_0.AuxInt 4027 x := v.Args[1] 4028 y := v.Args[2] 4029 v.reset(OpARMANDconst) 4030 v.AuxInt = c 4031 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 4032 v0.AddArg(x) 4033 v0.AddArg(y) 4034 v.AddArg(v0) 4035 return true 4036 } 4037 // match: (ANDshiftRLreg x y (MOVWconst [c])) 4038 // cond: 4039 // result: (ANDshiftRL x y [c]) 4040 for { 4041 _ = v.Args[2] 4042 x := v.Args[0] 4043 y := v.Args[1] 4044 v_2 := v.Args[2] 4045 if v_2.Op != OpARMMOVWconst { 4046 break 4047 } 4048 c := v_2.AuxInt 4049 v.reset(OpARMANDshiftRL) 4050 v.AuxInt = c 4051 v.AddArg(x) 4052 v.AddArg(y) 4053 return true 4054 } 4055 return false 4056 } 4057 func rewriteValueARM_OpARMBFX_0(v *Value) bool { 4058 // match: (BFX [c] (MOVWconst [d])) 4059 // cond: 4060 // result: (MOVWconst [int64(int32(d)<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8)))]) 4061 for { 4062 c := v.AuxInt 4063 v_0 := v.Args[0] 4064 if v_0.Op != OpARMMOVWconst { 4065 break 4066 } 4067 d := v_0.AuxInt 4068 v.reset(OpARMMOVWconst) 4069 v.AuxInt = int64(int32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))) 4070 return true 4071 } 4072 return false 4073 } 4074 func rewriteValueARM_OpARMBFXU_0(v *Value) bool { 4075 // match: (BFXU [c] (MOVWconst [d])) 4076 // cond: 4077 // result: (MOVWconst [int64(int32(uint32(d)<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8))))]) 4078 for { 4079 c := v.AuxInt 4080 v_0 := v.Args[0] 4081 if v_0.Op != OpARMMOVWconst { 4082 break 4083 } 4084 d := v_0.AuxInt 4085 v.reset(OpARMMOVWconst) 4086 v.AuxInt = int64(int32(uint32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8)))) 4087 return true 4088 } 4089 return false 4090 } 4091 func rewriteValueARM_OpARMBIC_0(v *Value) bool { 4092 // match: (BIC x (MOVWconst [c])) 4093 // cond: 4094 // result: (BICconst [c] x) 4095 for { 4096 _ = v.Args[1] 4097 x := v.Args[0] 4098 v_1 := v.Args[1] 4099 if v_1.Op != OpARMMOVWconst { 4100 break 4101 } 4102 c := v_1.AuxInt 4103 v.reset(OpARMBICconst) 4104 v.AuxInt = c 4105 v.AddArg(x) 4106 return true 4107 } 4108 // match: (BIC x (SLLconst [c] y)) 4109 // cond: 4110 // result: (BICshiftLL x y [c]) 4111 for { 4112 _ = v.Args[1] 4113 x := v.Args[0] 4114 v_1 := v.Args[1] 4115 if v_1.Op != OpARMSLLconst { 4116 break 4117 } 4118 c := v_1.AuxInt 4119 y := v_1.Args[0] 4120 v.reset(OpARMBICshiftLL) 4121 v.AuxInt = c 4122 v.AddArg(x) 4123 v.AddArg(y) 4124 return true 4125 } 4126 // match: (BIC x (SRLconst [c] y)) 4127 // cond: 4128 // result: (BICshiftRL x y [c]) 4129 for { 4130 _ = v.Args[1] 4131 x := v.Args[0] 4132 v_1 := v.Args[1] 4133 if v_1.Op != OpARMSRLconst { 4134 break 4135 } 4136 c := v_1.AuxInt 4137 y := v_1.Args[0] 4138 v.reset(OpARMBICshiftRL) 4139 v.AuxInt = c 4140 v.AddArg(x) 4141 v.AddArg(y) 4142 return true 4143 } 4144 // match: (BIC x (SRAconst [c] y)) 4145 // cond: 4146 // result: (BICshiftRA x y [c]) 4147 for { 4148 _ = v.Args[1] 4149 x := v.Args[0] 4150 v_1 := v.Args[1] 4151 if v_1.Op != OpARMSRAconst { 4152 break 4153 } 4154 c := v_1.AuxInt 4155 y := v_1.Args[0] 4156 v.reset(OpARMBICshiftRA) 4157 v.AuxInt = c 4158 v.AddArg(x) 4159 v.AddArg(y) 4160 return true 4161 } 4162 // match: (BIC x (SLL y z)) 4163 // cond: 4164 // result: (BICshiftLLreg x y z) 4165 for { 4166 _ = v.Args[1] 4167 x := v.Args[0] 4168 v_1 := v.Args[1] 4169 if v_1.Op != OpARMSLL { 4170 break 4171 } 4172 _ = v_1.Args[1] 4173 y := v_1.Args[0] 4174 z := v_1.Args[1] 4175 v.reset(OpARMBICshiftLLreg) 4176 v.AddArg(x) 4177 v.AddArg(y) 4178 v.AddArg(z) 4179 return true 4180 } 4181 // match: (BIC x (SRL y z)) 4182 // cond: 4183 // result: (BICshiftRLreg x y z) 4184 for { 4185 _ = v.Args[1] 4186 x := v.Args[0] 4187 v_1 := v.Args[1] 4188 if v_1.Op != OpARMSRL { 4189 break 4190 } 4191 _ = v_1.Args[1] 4192 y := v_1.Args[0] 4193 z := v_1.Args[1] 4194 v.reset(OpARMBICshiftRLreg) 4195 v.AddArg(x) 4196 v.AddArg(y) 4197 v.AddArg(z) 4198 return true 4199 } 4200 // match: (BIC x (SRA y z)) 4201 // cond: 4202 // result: (BICshiftRAreg x y z) 4203 for { 4204 _ = v.Args[1] 4205 x := v.Args[0] 4206 v_1 := v.Args[1] 4207 if v_1.Op != OpARMSRA { 4208 break 4209 } 4210 _ = v_1.Args[1] 4211 y := v_1.Args[0] 4212 z := v_1.Args[1] 4213 v.reset(OpARMBICshiftRAreg) 4214 v.AddArg(x) 4215 v.AddArg(y) 4216 v.AddArg(z) 4217 return true 4218 } 4219 // match: (BIC x x) 4220 // cond: 4221 // result: (MOVWconst [0]) 4222 for { 4223 _ = v.Args[1] 4224 x := v.Args[0] 4225 if x != v.Args[1] { 4226 break 4227 } 4228 v.reset(OpARMMOVWconst) 4229 v.AuxInt = 0 4230 return true 4231 } 4232 return false 4233 } 4234 func rewriteValueARM_OpARMBICconst_0(v *Value) bool { 4235 // match: (BICconst [0] x) 4236 // cond: 4237 // result: x 4238 for { 4239 if v.AuxInt != 0 { 4240 break 4241 } 4242 x := v.Args[0] 4243 v.reset(OpCopy) 4244 v.Type = x.Type 4245 v.AddArg(x) 4246 return true 4247 } 4248 // match: (BICconst [c] _) 4249 // cond: int32(c)==-1 4250 // result: (MOVWconst [0]) 4251 for { 4252 c := v.AuxInt 4253 if !(int32(c) == -1) { 4254 break 4255 } 4256 v.reset(OpARMMOVWconst) 4257 v.AuxInt = 0 4258 return true 4259 } 4260 // match: (BICconst [c] x) 4261 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 4262 // result: (ANDconst [int64(int32(^uint32(c)))] x) 4263 for { 4264 c := v.AuxInt 4265 x := v.Args[0] 4266 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 4267 break 4268 } 4269 v.reset(OpARMANDconst) 4270 v.AuxInt = int64(int32(^uint32(c))) 4271 v.AddArg(x) 4272 return true 4273 } 4274 // match: (BICconst [c] x) 4275 // cond: objabi.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff 4276 // result: (ANDconst [int64(int32(^uint32(c)))] x) 4277 for { 4278 c := v.AuxInt 4279 x := v.Args[0] 4280 if !(objabi.GOARM == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && ^uint32(c) <= 0xffff) { 4281 break 4282 } 4283 v.reset(OpARMANDconst) 4284 v.AuxInt = int64(int32(^uint32(c))) 4285 v.AddArg(x) 4286 return true 4287 } 4288 // match: (BICconst [c] (MOVWconst [d])) 4289 // cond: 4290 // result: (MOVWconst [d&^c]) 4291 for { 4292 c := v.AuxInt 4293 v_0 := v.Args[0] 4294 if v_0.Op != OpARMMOVWconst { 4295 break 4296 } 4297 d := v_0.AuxInt 4298 v.reset(OpARMMOVWconst) 4299 v.AuxInt = d &^ c 4300 return true 4301 } 4302 // match: (BICconst [c] (BICconst [d] x)) 4303 // cond: 4304 // result: (BICconst [int64(int32(c|d))] x) 4305 for { 4306 c := v.AuxInt 4307 v_0 := v.Args[0] 4308 if v_0.Op != OpARMBICconst { 4309 break 4310 } 4311 d := v_0.AuxInt 4312 x := v_0.Args[0] 4313 v.reset(OpARMBICconst) 4314 v.AuxInt = int64(int32(c | d)) 4315 v.AddArg(x) 4316 return true 4317 } 4318 return false 4319 } 4320 func rewriteValueARM_OpARMBICshiftLL_0(v *Value) bool { 4321 // match: (BICshiftLL x (MOVWconst [c]) [d]) 4322 // cond: 4323 // result: (BICconst x [int64(int32(uint32(c)<<uint64(d)))]) 4324 for { 4325 d := v.AuxInt 4326 _ = v.Args[1] 4327 x := v.Args[0] 4328 v_1 := v.Args[1] 4329 if v_1.Op != OpARMMOVWconst { 4330 break 4331 } 4332 c := v_1.AuxInt 4333 v.reset(OpARMBICconst) 4334 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 4335 v.AddArg(x) 4336 return true 4337 } 4338 // match: (BICshiftLL x (SLLconst x [c]) [d]) 4339 // cond: c==d 4340 // result: (MOVWconst [0]) 4341 for { 4342 d := v.AuxInt 4343 _ = v.Args[1] 4344 x := v.Args[0] 4345 v_1 := v.Args[1] 4346 if v_1.Op != OpARMSLLconst { 4347 break 4348 } 4349 c := v_1.AuxInt 4350 if x != v_1.Args[0] { 4351 break 4352 } 4353 if !(c == d) { 4354 break 4355 } 4356 v.reset(OpARMMOVWconst) 4357 v.AuxInt = 0 4358 return true 4359 } 4360 return false 4361 } 4362 func rewriteValueARM_OpARMBICshiftLLreg_0(v *Value) bool { 4363 // match: (BICshiftLLreg x y (MOVWconst [c])) 4364 // cond: 4365 // result: (BICshiftLL x y [c]) 4366 for { 4367 _ = v.Args[2] 4368 x := v.Args[0] 4369 y := v.Args[1] 4370 v_2 := v.Args[2] 4371 if v_2.Op != OpARMMOVWconst { 4372 break 4373 } 4374 c := v_2.AuxInt 4375 v.reset(OpARMBICshiftLL) 4376 v.AuxInt = c 4377 v.AddArg(x) 4378 v.AddArg(y) 4379 return true 4380 } 4381 return false 4382 } 4383 func rewriteValueARM_OpARMBICshiftRA_0(v *Value) bool { 4384 // match: (BICshiftRA x (MOVWconst [c]) [d]) 4385 // cond: 4386 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 4387 for { 4388 d := v.AuxInt 4389 _ = v.Args[1] 4390 x := v.Args[0] 4391 v_1 := v.Args[1] 4392 if v_1.Op != OpARMMOVWconst { 4393 break 4394 } 4395 c := v_1.AuxInt 4396 v.reset(OpARMBICconst) 4397 v.AuxInt = int64(int32(c) >> uint64(d)) 4398 v.AddArg(x) 4399 return true 4400 } 4401 // match: (BICshiftRA x (SRAconst x [c]) [d]) 4402 // cond: c==d 4403 // result: (MOVWconst [0]) 4404 for { 4405 d := v.AuxInt 4406 _ = v.Args[1] 4407 x := v.Args[0] 4408 v_1 := v.Args[1] 4409 if v_1.Op != OpARMSRAconst { 4410 break 4411 } 4412 c := v_1.AuxInt 4413 if x != v_1.Args[0] { 4414 break 4415 } 4416 if !(c == d) { 4417 break 4418 } 4419 v.reset(OpARMMOVWconst) 4420 v.AuxInt = 0 4421 return true 4422 } 4423 return false 4424 } 4425 func rewriteValueARM_OpARMBICshiftRAreg_0(v *Value) bool { 4426 // match: (BICshiftRAreg x y (MOVWconst [c])) 4427 // cond: 4428 // result: (BICshiftRA x y [c]) 4429 for { 4430 _ = v.Args[2] 4431 x := v.Args[0] 4432 y := v.Args[1] 4433 v_2 := v.Args[2] 4434 if v_2.Op != OpARMMOVWconst { 4435 break 4436 } 4437 c := v_2.AuxInt 4438 v.reset(OpARMBICshiftRA) 4439 v.AuxInt = c 4440 v.AddArg(x) 4441 v.AddArg(y) 4442 return true 4443 } 4444 return false 4445 } 4446 func rewriteValueARM_OpARMBICshiftRL_0(v *Value) bool { 4447 // match: (BICshiftRL x (MOVWconst [c]) [d]) 4448 // cond: 4449 // result: (BICconst x [int64(int32(uint32(c)>>uint64(d)))]) 4450 for { 4451 d := v.AuxInt 4452 _ = v.Args[1] 4453 x := v.Args[0] 4454 v_1 := v.Args[1] 4455 if v_1.Op != OpARMMOVWconst { 4456 break 4457 } 4458 c := v_1.AuxInt 4459 v.reset(OpARMBICconst) 4460 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 4461 v.AddArg(x) 4462 return true 4463 } 4464 // match: (BICshiftRL x (SRLconst x [c]) [d]) 4465 // cond: c==d 4466 // result: (MOVWconst [0]) 4467 for { 4468 d := v.AuxInt 4469 _ = v.Args[1] 4470 x := v.Args[0] 4471 v_1 := v.Args[1] 4472 if v_1.Op != OpARMSRLconst { 4473 break 4474 } 4475 c := v_1.AuxInt 4476 if x != v_1.Args[0] { 4477 break 4478 } 4479 if !(c == d) { 4480 break 4481 } 4482 v.reset(OpARMMOVWconst) 4483 v.AuxInt = 0 4484 return true 4485 } 4486 return false 4487 } 4488 func rewriteValueARM_OpARMBICshiftRLreg_0(v *Value) bool { 4489 // match: (BICshiftRLreg x y (MOVWconst [c])) 4490 // cond: 4491 // result: (BICshiftRL x y [c]) 4492 for { 4493 _ = v.Args[2] 4494 x := v.Args[0] 4495 y := v.Args[1] 4496 v_2 := v.Args[2] 4497 if v_2.Op != OpARMMOVWconst { 4498 break 4499 } 4500 c := v_2.AuxInt 4501 v.reset(OpARMBICshiftRL) 4502 v.AuxInt = c 4503 v.AddArg(x) 4504 v.AddArg(y) 4505 return true 4506 } 4507 return false 4508 } 4509 func rewriteValueARM_OpARMCMN_0(v *Value) bool { 4510 // match: (CMN x (MOVWconst [c])) 4511 // cond: 4512 // result: (CMNconst [c] x) 4513 for { 4514 _ = v.Args[1] 4515 x := v.Args[0] 4516 v_1 := v.Args[1] 4517 if v_1.Op != OpARMMOVWconst { 4518 break 4519 } 4520 c := v_1.AuxInt 4521 v.reset(OpARMCMNconst) 4522 v.AuxInt = c 4523 v.AddArg(x) 4524 return true 4525 } 4526 // match: (CMN (MOVWconst [c]) x) 4527 // cond: 4528 // result: (CMNconst [c] x) 4529 for { 4530 _ = v.Args[1] 4531 v_0 := v.Args[0] 4532 if v_0.Op != OpARMMOVWconst { 4533 break 4534 } 4535 c := v_0.AuxInt 4536 x := v.Args[1] 4537 v.reset(OpARMCMNconst) 4538 v.AuxInt = c 4539 v.AddArg(x) 4540 return true 4541 } 4542 // match: (CMN x (SLLconst [c] y)) 4543 // cond: 4544 // result: (CMNshiftLL x y [c]) 4545 for { 4546 _ = v.Args[1] 4547 x := v.Args[0] 4548 v_1 := v.Args[1] 4549 if v_1.Op != OpARMSLLconst { 4550 break 4551 } 4552 c := v_1.AuxInt 4553 y := v_1.Args[0] 4554 v.reset(OpARMCMNshiftLL) 4555 v.AuxInt = c 4556 v.AddArg(x) 4557 v.AddArg(y) 4558 return true 4559 } 4560 // match: (CMN (SLLconst [c] y) x) 4561 // cond: 4562 // result: (CMNshiftLL x y [c]) 4563 for { 4564 _ = v.Args[1] 4565 v_0 := v.Args[0] 4566 if v_0.Op != OpARMSLLconst { 4567 break 4568 } 4569 c := v_0.AuxInt 4570 y := v_0.Args[0] 4571 x := v.Args[1] 4572 v.reset(OpARMCMNshiftLL) 4573 v.AuxInt = c 4574 v.AddArg(x) 4575 v.AddArg(y) 4576 return true 4577 } 4578 // match: (CMN x (SRLconst [c] y)) 4579 // cond: 4580 // result: (CMNshiftRL x y [c]) 4581 for { 4582 _ = v.Args[1] 4583 x := v.Args[0] 4584 v_1 := v.Args[1] 4585 if v_1.Op != OpARMSRLconst { 4586 break 4587 } 4588 c := v_1.AuxInt 4589 y := v_1.Args[0] 4590 v.reset(OpARMCMNshiftRL) 4591 v.AuxInt = c 4592 v.AddArg(x) 4593 v.AddArg(y) 4594 return true 4595 } 4596 // match: (CMN (SRLconst [c] y) x) 4597 // cond: 4598 // result: (CMNshiftRL x y [c]) 4599 for { 4600 _ = v.Args[1] 4601 v_0 := v.Args[0] 4602 if v_0.Op != OpARMSRLconst { 4603 break 4604 } 4605 c := v_0.AuxInt 4606 y := v_0.Args[0] 4607 x := v.Args[1] 4608 v.reset(OpARMCMNshiftRL) 4609 v.AuxInt = c 4610 v.AddArg(x) 4611 v.AddArg(y) 4612 return true 4613 } 4614 // match: (CMN x (SRAconst [c] y)) 4615 // cond: 4616 // result: (CMNshiftRA x y [c]) 4617 for { 4618 _ = v.Args[1] 4619 x := v.Args[0] 4620 v_1 := v.Args[1] 4621 if v_1.Op != OpARMSRAconst { 4622 break 4623 } 4624 c := v_1.AuxInt 4625 y := v_1.Args[0] 4626 v.reset(OpARMCMNshiftRA) 4627 v.AuxInt = c 4628 v.AddArg(x) 4629 v.AddArg(y) 4630 return true 4631 } 4632 // match: (CMN (SRAconst [c] y) x) 4633 // cond: 4634 // result: (CMNshiftRA x y [c]) 4635 for { 4636 _ = v.Args[1] 4637 v_0 := v.Args[0] 4638 if v_0.Op != OpARMSRAconst { 4639 break 4640 } 4641 c := v_0.AuxInt 4642 y := v_0.Args[0] 4643 x := v.Args[1] 4644 v.reset(OpARMCMNshiftRA) 4645 v.AuxInt = c 4646 v.AddArg(x) 4647 v.AddArg(y) 4648 return true 4649 } 4650 // match: (CMN x (SLL y z)) 4651 // cond: 4652 // result: (CMNshiftLLreg x y z) 4653 for { 4654 _ = v.Args[1] 4655 x := v.Args[0] 4656 v_1 := v.Args[1] 4657 if v_1.Op != OpARMSLL { 4658 break 4659 } 4660 _ = v_1.Args[1] 4661 y := v_1.Args[0] 4662 z := v_1.Args[1] 4663 v.reset(OpARMCMNshiftLLreg) 4664 v.AddArg(x) 4665 v.AddArg(y) 4666 v.AddArg(z) 4667 return true 4668 } 4669 // match: (CMN (SLL y z) x) 4670 // cond: 4671 // result: (CMNshiftLLreg x y z) 4672 for { 4673 _ = v.Args[1] 4674 v_0 := v.Args[0] 4675 if v_0.Op != OpARMSLL { 4676 break 4677 } 4678 _ = v_0.Args[1] 4679 y := v_0.Args[0] 4680 z := v_0.Args[1] 4681 x := v.Args[1] 4682 v.reset(OpARMCMNshiftLLreg) 4683 v.AddArg(x) 4684 v.AddArg(y) 4685 v.AddArg(z) 4686 return true 4687 } 4688 return false 4689 } 4690 func rewriteValueARM_OpARMCMN_10(v *Value) bool { 4691 // match: (CMN x (SRL y z)) 4692 // cond: 4693 // result: (CMNshiftRLreg x y z) 4694 for { 4695 _ = v.Args[1] 4696 x := v.Args[0] 4697 v_1 := v.Args[1] 4698 if v_1.Op != OpARMSRL { 4699 break 4700 } 4701 _ = v_1.Args[1] 4702 y := v_1.Args[0] 4703 z := v_1.Args[1] 4704 v.reset(OpARMCMNshiftRLreg) 4705 v.AddArg(x) 4706 v.AddArg(y) 4707 v.AddArg(z) 4708 return true 4709 } 4710 // match: (CMN (SRL y z) x) 4711 // cond: 4712 // result: (CMNshiftRLreg x y z) 4713 for { 4714 _ = v.Args[1] 4715 v_0 := v.Args[0] 4716 if v_0.Op != OpARMSRL { 4717 break 4718 } 4719 _ = v_0.Args[1] 4720 y := v_0.Args[0] 4721 z := v_0.Args[1] 4722 x := v.Args[1] 4723 v.reset(OpARMCMNshiftRLreg) 4724 v.AddArg(x) 4725 v.AddArg(y) 4726 v.AddArg(z) 4727 return true 4728 } 4729 // match: (CMN x (SRA y z)) 4730 // cond: 4731 // result: (CMNshiftRAreg x y z) 4732 for { 4733 _ = v.Args[1] 4734 x := v.Args[0] 4735 v_1 := v.Args[1] 4736 if v_1.Op != OpARMSRA { 4737 break 4738 } 4739 _ = v_1.Args[1] 4740 y := v_1.Args[0] 4741 z := v_1.Args[1] 4742 v.reset(OpARMCMNshiftRAreg) 4743 v.AddArg(x) 4744 v.AddArg(y) 4745 v.AddArg(z) 4746 return true 4747 } 4748 // match: (CMN (SRA y z) x) 4749 // cond: 4750 // result: (CMNshiftRAreg x y z) 4751 for { 4752 _ = v.Args[1] 4753 v_0 := v.Args[0] 4754 if v_0.Op != OpARMSRA { 4755 break 4756 } 4757 _ = v_0.Args[1] 4758 y := v_0.Args[0] 4759 z := v_0.Args[1] 4760 x := v.Args[1] 4761 v.reset(OpARMCMNshiftRAreg) 4762 v.AddArg(x) 4763 v.AddArg(y) 4764 v.AddArg(z) 4765 return true 4766 } 4767 // match: (CMN x (RSBconst [0] y)) 4768 // cond: 4769 // result: (CMP x y) 4770 for { 4771 _ = v.Args[1] 4772 x := v.Args[0] 4773 v_1 := v.Args[1] 4774 if v_1.Op != OpARMRSBconst { 4775 break 4776 } 4777 if v_1.AuxInt != 0 { 4778 break 4779 } 4780 y := v_1.Args[0] 4781 v.reset(OpARMCMP) 4782 v.AddArg(x) 4783 v.AddArg(y) 4784 return true 4785 } 4786 // match: (CMN (RSBconst [0] y) x) 4787 // cond: 4788 // result: (CMP x y) 4789 for { 4790 _ = v.Args[1] 4791 v_0 := v.Args[0] 4792 if v_0.Op != OpARMRSBconst { 4793 break 4794 } 4795 if v_0.AuxInt != 0 { 4796 break 4797 } 4798 y := v_0.Args[0] 4799 x := v.Args[1] 4800 v.reset(OpARMCMP) 4801 v.AddArg(x) 4802 v.AddArg(y) 4803 return true 4804 } 4805 return false 4806 } 4807 func rewriteValueARM_OpARMCMNconst_0(v *Value) bool { 4808 // match: (CMNconst (MOVWconst [x]) [y]) 4809 // cond: int32(x)==int32(-y) 4810 // result: (FlagEQ) 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)) { 4819 break 4820 } 4821 v.reset(OpARMFlagEQ) 4822 return true 4823 } 4824 // match: (CMNconst (MOVWconst [x]) [y]) 4825 // cond: int32(x)<int32(-y) && uint32(x)<uint32(-y) 4826 // result: (FlagLT_ULT) 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(OpARMFlagLT_ULT) 4838 return true 4839 } 4840 // match: (CMNconst (MOVWconst [x]) [y]) 4841 // cond: int32(x)<int32(-y) && uint32(x)>uint32(-y) 4842 // result: (FlagLT_UGT) 4843 for { 4844 y := v.AuxInt 4845 v_0 := v.Args[0] 4846 if v_0.Op != OpARMMOVWconst { 4847 break 4848 } 4849 x := v_0.AuxInt 4850 if !(int32(x) < int32(-y) && uint32(x) > uint32(-y)) { 4851 break 4852 } 4853 v.reset(OpARMFlagLT_UGT) 4854 return true 4855 } 4856 // match: (CMNconst (MOVWconst [x]) [y]) 4857 // cond: int32(x)>int32(-y) && uint32(x)<uint32(-y) 4858 // result: (FlagGT_ULT) 4859 for { 4860 y := v.AuxInt 4861 v_0 := v.Args[0] 4862 if v_0.Op != OpARMMOVWconst { 4863 break 4864 } 4865 x := v_0.AuxInt 4866 if !(int32(x) > int32(-y) && uint32(x) < uint32(-y)) { 4867 break 4868 } 4869 v.reset(OpARMFlagGT_ULT) 4870 return true 4871 } 4872 // match: (CMNconst (MOVWconst [x]) [y]) 4873 // cond: int32(x)>int32(-y) && uint32(x)>uint32(-y) 4874 // result: (FlagGT_UGT) 4875 for { 4876 y := v.AuxInt 4877 v_0 := v.Args[0] 4878 if v_0.Op != OpARMMOVWconst { 4879 break 4880 } 4881 x := v_0.AuxInt 4882 if !(int32(x) > int32(-y) && uint32(x) > uint32(-y)) { 4883 break 4884 } 4885 v.reset(OpARMFlagGT_UGT) 4886 return true 4887 } 4888 return false 4889 } 4890 func rewriteValueARM_OpARMCMNshiftLL_0(v *Value) bool { 4891 b := v.Block 4892 _ = b 4893 // match: (CMNshiftLL (MOVWconst [c]) x [d]) 4894 // cond: 4895 // result: (CMNconst [c] (SLLconst <x.Type> x [d])) 4896 for { 4897 d := v.AuxInt 4898 _ = v.Args[1] 4899 v_0 := v.Args[0] 4900 if v_0.Op != OpARMMOVWconst { 4901 break 4902 } 4903 c := v_0.AuxInt 4904 x := v.Args[1] 4905 v.reset(OpARMCMNconst) 4906 v.AuxInt = c 4907 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4908 v0.AuxInt = d 4909 v0.AddArg(x) 4910 v.AddArg(v0) 4911 return true 4912 } 4913 // match: (CMNshiftLL x (MOVWconst [c]) [d]) 4914 // cond: 4915 // result: (CMNconst x [int64(int32(uint32(c)<<uint64(d)))]) 4916 for { 4917 d := v.AuxInt 4918 _ = v.Args[1] 4919 x := v.Args[0] 4920 v_1 := v.Args[1] 4921 if v_1.Op != OpARMMOVWconst { 4922 break 4923 } 4924 c := v_1.AuxInt 4925 v.reset(OpARMCMNconst) 4926 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 4927 v.AddArg(x) 4928 return true 4929 } 4930 return false 4931 } 4932 func rewriteValueARM_OpARMCMNshiftLLreg_0(v *Value) bool { 4933 b := v.Block 4934 _ = b 4935 // match: (CMNshiftLLreg (MOVWconst [c]) x y) 4936 // cond: 4937 // result: (CMNconst [c] (SLL <x.Type> x y)) 4938 for { 4939 _ = v.Args[2] 4940 v_0 := v.Args[0] 4941 if v_0.Op != OpARMMOVWconst { 4942 break 4943 } 4944 c := v_0.AuxInt 4945 x := v.Args[1] 4946 y := v.Args[2] 4947 v.reset(OpARMCMNconst) 4948 v.AuxInt = c 4949 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4950 v0.AddArg(x) 4951 v0.AddArg(y) 4952 v.AddArg(v0) 4953 return true 4954 } 4955 // match: (CMNshiftLLreg x y (MOVWconst [c])) 4956 // cond: 4957 // result: (CMNshiftLL x y [c]) 4958 for { 4959 _ = v.Args[2] 4960 x := v.Args[0] 4961 y := v.Args[1] 4962 v_2 := v.Args[2] 4963 if v_2.Op != OpARMMOVWconst { 4964 break 4965 } 4966 c := v_2.AuxInt 4967 v.reset(OpARMCMNshiftLL) 4968 v.AuxInt = c 4969 v.AddArg(x) 4970 v.AddArg(y) 4971 return true 4972 } 4973 return false 4974 } 4975 func rewriteValueARM_OpARMCMNshiftRA_0(v *Value) bool { 4976 b := v.Block 4977 _ = b 4978 // match: (CMNshiftRA (MOVWconst [c]) x [d]) 4979 // cond: 4980 // result: (CMNconst [c] (SRAconst <x.Type> x [d])) 4981 for { 4982 d := v.AuxInt 4983 _ = v.Args[1] 4984 v_0 := v.Args[0] 4985 if v_0.Op != OpARMMOVWconst { 4986 break 4987 } 4988 c := v_0.AuxInt 4989 x := v.Args[1] 4990 v.reset(OpARMCMNconst) 4991 v.AuxInt = c 4992 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4993 v0.AuxInt = d 4994 v0.AddArg(x) 4995 v.AddArg(v0) 4996 return true 4997 } 4998 // match: (CMNshiftRA x (MOVWconst [c]) [d]) 4999 // cond: 5000 // result: (CMNconst x [int64(int32(c)>>uint64(d))]) 5001 for { 5002 d := v.AuxInt 5003 _ = v.Args[1] 5004 x := v.Args[0] 5005 v_1 := v.Args[1] 5006 if v_1.Op != OpARMMOVWconst { 5007 break 5008 } 5009 c := v_1.AuxInt 5010 v.reset(OpARMCMNconst) 5011 v.AuxInt = int64(int32(c) >> uint64(d)) 5012 v.AddArg(x) 5013 return true 5014 } 5015 return false 5016 } 5017 func rewriteValueARM_OpARMCMNshiftRAreg_0(v *Value) bool { 5018 b := v.Block 5019 _ = b 5020 // match: (CMNshiftRAreg (MOVWconst [c]) x y) 5021 // cond: 5022 // result: (CMNconst [c] (SRA <x.Type> x y)) 5023 for { 5024 _ = v.Args[2] 5025 v_0 := v.Args[0] 5026 if v_0.Op != OpARMMOVWconst { 5027 break 5028 } 5029 c := v_0.AuxInt 5030 x := v.Args[1] 5031 y := v.Args[2] 5032 v.reset(OpARMCMNconst) 5033 v.AuxInt = c 5034 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 5035 v0.AddArg(x) 5036 v0.AddArg(y) 5037 v.AddArg(v0) 5038 return true 5039 } 5040 // match: (CMNshiftRAreg x y (MOVWconst [c])) 5041 // cond: 5042 // result: (CMNshiftRA x y [c]) 5043 for { 5044 _ = v.Args[2] 5045 x := v.Args[0] 5046 y := v.Args[1] 5047 v_2 := v.Args[2] 5048 if v_2.Op != OpARMMOVWconst { 5049 break 5050 } 5051 c := v_2.AuxInt 5052 v.reset(OpARMCMNshiftRA) 5053 v.AuxInt = c 5054 v.AddArg(x) 5055 v.AddArg(y) 5056 return true 5057 } 5058 return false 5059 } 5060 func rewriteValueARM_OpARMCMNshiftRL_0(v *Value) bool { 5061 b := v.Block 5062 _ = b 5063 // match: (CMNshiftRL (MOVWconst [c]) x [d]) 5064 // cond: 5065 // result: (CMNconst [c] (SRLconst <x.Type> x [d])) 5066 for { 5067 d := v.AuxInt 5068 _ = v.Args[1] 5069 v_0 := v.Args[0] 5070 if v_0.Op != OpARMMOVWconst { 5071 break 5072 } 5073 c := v_0.AuxInt 5074 x := v.Args[1] 5075 v.reset(OpARMCMNconst) 5076 v.AuxInt = c 5077 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 5078 v0.AuxInt = d 5079 v0.AddArg(x) 5080 v.AddArg(v0) 5081 return true 5082 } 5083 // match: (CMNshiftRL x (MOVWconst [c]) [d]) 5084 // cond: 5085 // result: (CMNconst x [int64(int32(uint32(c)>>uint64(d)))]) 5086 for { 5087 d := v.AuxInt 5088 _ = v.Args[1] 5089 x := v.Args[0] 5090 v_1 := v.Args[1] 5091 if v_1.Op != OpARMMOVWconst { 5092 break 5093 } 5094 c := v_1.AuxInt 5095 v.reset(OpARMCMNconst) 5096 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 5097 v.AddArg(x) 5098 return true 5099 } 5100 return false 5101 } 5102 func rewriteValueARM_OpARMCMNshiftRLreg_0(v *Value) bool { 5103 b := v.Block 5104 _ = b 5105 // match: (CMNshiftRLreg (MOVWconst [c]) x y) 5106 // cond: 5107 // result: (CMNconst [c] (SRL <x.Type> x y)) 5108 for { 5109 _ = v.Args[2] 5110 v_0 := v.Args[0] 5111 if v_0.Op != OpARMMOVWconst { 5112 break 5113 } 5114 c := v_0.AuxInt 5115 x := v.Args[1] 5116 y := v.Args[2] 5117 v.reset(OpARMCMNconst) 5118 v.AuxInt = c 5119 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 5120 v0.AddArg(x) 5121 v0.AddArg(y) 5122 v.AddArg(v0) 5123 return true 5124 } 5125 // match: (CMNshiftRLreg x y (MOVWconst [c])) 5126 // cond: 5127 // result: (CMNshiftRL x y [c]) 5128 for { 5129 _ = v.Args[2] 5130 x := v.Args[0] 5131 y := v.Args[1] 5132 v_2 := v.Args[2] 5133 if v_2.Op != OpARMMOVWconst { 5134 break 5135 } 5136 c := v_2.AuxInt 5137 v.reset(OpARMCMNshiftRL) 5138 v.AuxInt = c 5139 v.AddArg(x) 5140 v.AddArg(y) 5141 return true 5142 } 5143 return false 5144 } 5145 func rewriteValueARM_OpARMCMOVWHSconst_0(v *Value) bool { 5146 // match: (CMOVWHSconst _ (FlagEQ) [c]) 5147 // cond: 5148 // result: (MOVWconst [c]) 5149 for { 5150 c := v.AuxInt 5151 _ = v.Args[1] 5152 v_1 := v.Args[1] 5153 if v_1.Op != OpARMFlagEQ { 5154 break 5155 } 5156 v.reset(OpARMMOVWconst) 5157 v.AuxInt = c 5158 return true 5159 } 5160 // match: (CMOVWHSconst x (FlagLT_ULT)) 5161 // cond: 5162 // result: x 5163 for { 5164 _ = v.Args[1] 5165 x := v.Args[0] 5166 v_1 := v.Args[1] 5167 if v_1.Op != OpARMFlagLT_ULT { 5168 break 5169 } 5170 v.reset(OpCopy) 5171 v.Type = x.Type 5172 v.AddArg(x) 5173 return true 5174 } 5175 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 5176 // cond: 5177 // result: (MOVWconst [c]) 5178 for { 5179 c := v.AuxInt 5180 _ = v.Args[1] 5181 v_1 := v.Args[1] 5182 if v_1.Op != OpARMFlagLT_UGT { 5183 break 5184 } 5185 v.reset(OpARMMOVWconst) 5186 v.AuxInt = c 5187 return true 5188 } 5189 // match: (CMOVWHSconst x (FlagGT_ULT)) 5190 // cond: 5191 // result: x 5192 for { 5193 _ = v.Args[1] 5194 x := v.Args[0] 5195 v_1 := v.Args[1] 5196 if v_1.Op != OpARMFlagGT_ULT { 5197 break 5198 } 5199 v.reset(OpCopy) 5200 v.Type = x.Type 5201 v.AddArg(x) 5202 return true 5203 } 5204 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 5205 // cond: 5206 // result: (MOVWconst [c]) 5207 for { 5208 c := v.AuxInt 5209 _ = v.Args[1] 5210 v_1 := v.Args[1] 5211 if v_1.Op != OpARMFlagGT_UGT { 5212 break 5213 } 5214 v.reset(OpARMMOVWconst) 5215 v.AuxInt = c 5216 return true 5217 } 5218 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 5219 // cond: 5220 // result: (CMOVWLSconst x flags [c]) 5221 for { 5222 c := v.AuxInt 5223 _ = v.Args[1] 5224 x := v.Args[0] 5225 v_1 := v.Args[1] 5226 if v_1.Op != OpARMInvertFlags { 5227 break 5228 } 5229 flags := v_1.Args[0] 5230 v.reset(OpARMCMOVWLSconst) 5231 v.AuxInt = c 5232 v.AddArg(x) 5233 v.AddArg(flags) 5234 return true 5235 } 5236 return false 5237 } 5238 func rewriteValueARM_OpARMCMOVWLSconst_0(v *Value) bool { 5239 // match: (CMOVWLSconst _ (FlagEQ) [c]) 5240 // cond: 5241 // result: (MOVWconst [c]) 5242 for { 5243 c := v.AuxInt 5244 _ = v.Args[1] 5245 v_1 := v.Args[1] 5246 if v_1.Op != OpARMFlagEQ { 5247 break 5248 } 5249 v.reset(OpARMMOVWconst) 5250 v.AuxInt = c 5251 return true 5252 } 5253 // match: (CMOVWLSconst _ (FlagLT_ULT) [c]) 5254 // cond: 5255 // result: (MOVWconst [c]) 5256 for { 5257 c := v.AuxInt 5258 _ = v.Args[1] 5259 v_1 := v.Args[1] 5260 if v_1.Op != OpARMFlagLT_ULT { 5261 break 5262 } 5263 v.reset(OpARMMOVWconst) 5264 v.AuxInt = c 5265 return true 5266 } 5267 // match: (CMOVWLSconst x (FlagLT_UGT)) 5268 // cond: 5269 // result: x 5270 for { 5271 _ = v.Args[1] 5272 x := v.Args[0] 5273 v_1 := v.Args[1] 5274 if v_1.Op != OpARMFlagLT_UGT { 5275 break 5276 } 5277 v.reset(OpCopy) 5278 v.Type = x.Type 5279 v.AddArg(x) 5280 return true 5281 } 5282 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 5283 // cond: 5284 // result: (MOVWconst [c]) 5285 for { 5286 c := v.AuxInt 5287 _ = v.Args[1] 5288 v_1 := v.Args[1] 5289 if v_1.Op != OpARMFlagGT_ULT { 5290 break 5291 } 5292 v.reset(OpARMMOVWconst) 5293 v.AuxInt = c 5294 return true 5295 } 5296 // match: (CMOVWLSconst x (FlagGT_UGT)) 5297 // cond: 5298 // result: x 5299 for { 5300 _ = v.Args[1] 5301 x := v.Args[0] 5302 v_1 := v.Args[1] 5303 if v_1.Op != OpARMFlagGT_UGT { 5304 break 5305 } 5306 v.reset(OpCopy) 5307 v.Type = x.Type 5308 v.AddArg(x) 5309 return true 5310 } 5311 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 5312 // cond: 5313 // result: (CMOVWHSconst x flags [c]) 5314 for { 5315 c := v.AuxInt 5316 _ = v.Args[1] 5317 x := v.Args[0] 5318 v_1 := v.Args[1] 5319 if v_1.Op != OpARMInvertFlags { 5320 break 5321 } 5322 flags := v_1.Args[0] 5323 v.reset(OpARMCMOVWHSconst) 5324 v.AuxInt = c 5325 v.AddArg(x) 5326 v.AddArg(flags) 5327 return true 5328 } 5329 return false 5330 } 5331 func rewriteValueARM_OpARMCMP_0(v *Value) bool { 5332 b := v.Block 5333 _ = b 5334 // match: (CMP x (MOVWconst [c])) 5335 // cond: 5336 // result: (CMPconst [c] x) 5337 for { 5338 _ = v.Args[1] 5339 x := v.Args[0] 5340 v_1 := v.Args[1] 5341 if v_1.Op != OpARMMOVWconst { 5342 break 5343 } 5344 c := v_1.AuxInt 5345 v.reset(OpARMCMPconst) 5346 v.AuxInt = c 5347 v.AddArg(x) 5348 return true 5349 } 5350 // match: (CMP (MOVWconst [c]) x) 5351 // cond: 5352 // result: (InvertFlags (CMPconst [c] x)) 5353 for { 5354 _ = v.Args[1] 5355 v_0 := v.Args[0] 5356 if v_0.Op != OpARMMOVWconst { 5357 break 5358 } 5359 c := v_0.AuxInt 5360 x := v.Args[1] 5361 v.reset(OpARMInvertFlags) 5362 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5363 v0.AuxInt = c 5364 v0.AddArg(x) 5365 v.AddArg(v0) 5366 return true 5367 } 5368 // match: (CMP x (SLLconst [c] y)) 5369 // cond: 5370 // result: (CMPshiftLL x y [c]) 5371 for { 5372 _ = v.Args[1] 5373 x := v.Args[0] 5374 v_1 := v.Args[1] 5375 if v_1.Op != OpARMSLLconst { 5376 break 5377 } 5378 c := v_1.AuxInt 5379 y := v_1.Args[0] 5380 v.reset(OpARMCMPshiftLL) 5381 v.AuxInt = c 5382 v.AddArg(x) 5383 v.AddArg(y) 5384 return true 5385 } 5386 // match: (CMP (SLLconst [c] y) x) 5387 // cond: 5388 // result: (InvertFlags (CMPshiftLL x y [c])) 5389 for { 5390 _ = v.Args[1] 5391 v_0 := v.Args[0] 5392 if v_0.Op != OpARMSLLconst { 5393 break 5394 } 5395 c := v_0.AuxInt 5396 y := v_0.Args[0] 5397 x := v.Args[1] 5398 v.reset(OpARMInvertFlags) 5399 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 5400 v0.AuxInt = c 5401 v0.AddArg(x) 5402 v0.AddArg(y) 5403 v.AddArg(v0) 5404 return true 5405 } 5406 // match: (CMP x (SRLconst [c] y)) 5407 // cond: 5408 // result: (CMPshiftRL x y [c]) 5409 for { 5410 _ = v.Args[1] 5411 x := v.Args[0] 5412 v_1 := v.Args[1] 5413 if v_1.Op != OpARMSRLconst { 5414 break 5415 } 5416 c := v_1.AuxInt 5417 y := v_1.Args[0] 5418 v.reset(OpARMCMPshiftRL) 5419 v.AuxInt = c 5420 v.AddArg(x) 5421 v.AddArg(y) 5422 return true 5423 } 5424 // match: (CMP (SRLconst [c] y) x) 5425 // cond: 5426 // result: (InvertFlags (CMPshiftRL x y [c])) 5427 for { 5428 _ = v.Args[1] 5429 v_0 := v.Args[0] 5430 if v_0.Op != OpARMSRLconst { 5431 break 5432 } 5433 c := v_0.AuxInt 5434 y := v_0.Args[0] 5435 x := v.Args[1] 5436 v.reset(OpARMInvertFlags) 5437 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 5438 v0.AuxInt = c 5439 v0.AddArg(x) 5440 v0.AddArg(y) 5441 v.AddArg(v0) 5442 return true 5443 } 5444 // match: (CMP x (SRAconst [c] y)) 5445 // cond: 5446 // result: (CMPshiftRA x y [c]) 5447 for { 5448 _ = v.Args[1] 5449 x := v.Args[0] 5450 v_1 := v.Args[1] 5451 if v_1.Op != OpARMSRAconst { 5452 break 5453 } 5454 c := v_1.AuxInt 5455 y := v_1.Args[0] 5456 v.reset(OpARMCMPshiftRA) 5457 v.AuxInt = c 5458 v.AddArg(x) 5459 v.AddArg(y) 5460 return true 5461 } 5462 // match: (CMP (SRAconst [c] y) x) 5463 // cond: 5464 // result: (InvertFlags (CMPshiftRA x y [c])) 5465 for { 5466 _ = v.Args[1] 5467 v_0 := v.Args[0] 5468 if v_0.Op != OpARMSRAconst { 5469 break 5470 } 5471 c := v_0.AuxInt 5472 y := v_0.Args[0] 5473 x := v.Args[1] 5474 v.reset(OpARMInvertFlags) 5475 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 5476 v0.AuxInt = c 5477 v0.AddArg(x) 5478 v0.AddArg(y) 5479 v.AddArg(v0) 5480 return true 5481 } 5482 // match: (CMP x (SLL y z)) 5483 // cond: 5484 // result: (CMPshiftLLreg x y z) 5485 for { 5486 _ = v.Args[1] 5487 x := v.Args[0] 5488 v_1 := v.Args[1] 5489 if v_1.Op != OpARMSLL { 5490 break 5491 } 5492 _ = v_1.Args[1] 5493 y := v_1.Args[0] 5494 z := v_1.Args[1] 5495 v.reset(OpARMCMPshiftLLreg) 5496 v.AddArg(x) 5497 v.AddArg(y) 5498 v.AddArg(z) 5499 return true 5500 } 5501 // match: (CMP (SLL y z) x) 5502 // cond: 5503 // result: (InvertFlags (CMPshiftLLreg x y z)) 5504 for { 5505 _ = v.Args[1] 5506 v_0 := v.Args[0] 5507 if v_0.Op != OpARMSLL { 5508 break 5509 } 5510 _ = v_0.Args[1] 5511 y := v_0.Args[0] 5512 z := v_0.Args[1] 5513 x := v.Args[1] 5514 v.reset(OpARMInvertFlags) 5515 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 5516 v0.AddArg(x) 5517 v0.AddArg(y) 5518 v0.AddArg(z) 5519 v.AddArg(v0) 5520 return true 5521 } 5522 return false 5523 } 5524 func rewriteValueARM_OpARMCMP_10(v *Value) bool { 5525 b := v.Block 5526 _ = b 5527 // match: (CMP x (SRL y z)) 5528 // cond: 5529 // result: (CMPshiftRLreg x y z) 5530 for { 5531 _ = v.Args[1] 5532 x := v.Args[0] 5533 v_1 := v.Args[1] 5534 if v_1.Op != OpARMSRL { 5535 break 5536 } 5537 _ = v_1.Args[1] 5538 y := v_1.Args[0] 5539 z := v_1.Args[1] 5540 v.reset(OpARMCMPshiftRLreg) 5541 v.AddArg(x) 5542 v.AddArg(y) 5543 v.AddArg(z) 5544 return true 5545 } 5546 // match: (CMP (SRL y z) x) 5547 // cond: 5548 // result: (InvertFlags (CMPshiftRLreg x y z)) 5549 for { 5550 _ = v.Args[1] 5551 v_0 := v.Args[0] 5552 if v_0.Op != OpARMSRL { 5553 break 5554 } 5555 _ = v_0.Args[1] 5556 y := v_0.Args[0] 5557 z := v_0.Args[1] 5558 x := v.Args[1] 5559 v.reset(OpARMInvertFlags) 5560 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 5561 v0.AddArg(x) 5562 v0.AddArg(y) 5563 v0.AddArg(z) 5564 v.AddArg(v0) 5565 return true 5566 } 5567 // match: (CMP x (SRA y z)) 5568 // cond: 5569 // result: (CMPshiftRAreg x y z) 5570 for { 5571 _ = v.Args[1] 5572 x := v.Args[0] 5573 v_1 := v.Args[1] 5574 if v_1.Op != OpARMSRA { 5575 break 5576 } 5577 _ = v_1.Args[1] 5578 y := v_1.Args[0] 5579 z := v_1.Args[1] 5580 v.reset(OpARMCMPshiftRAreg) 5581 v.AddArg(x) 5582 v.AddArg(y) 5583 v.AddArg(z) 5584 return true 5585 } 5586 // match: (CMP (SRA y z) x) 5587 // cond: 5588 // result: (InvertFlags (CMPshiftRAreg x y z)) 5589 for { 5590 _ = v.Args[1] 5591 v_0 := v.Args[0] 5592 if v_0.Op != OpARMSRA { 5593 break 5594 } 5595 _ = v_0.Args[1] 5596 y := v_0.Args[0] 5597 z := v_0.Args[1] 5598 x := v.Args[1] 5599 v.reset(OpARMInvertFlags) 5600 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 5601 v0.AddArg(x) 5602 v0.AddArg(y) 5603 v0.AddArg(z) 5604 v.AddArg(v0) 5605 return true 5606 } 5607 // match: (CMP x (RSBconst [0] y)) 5608 // cond: 5609 // result: (CMN x y) 5610 for { 5611 _ = v.Args[1] 5612 x := v.Args[0] 5613 v_1 := v.Args[1] 5614 if v_1.Op != OpARMRSBconst { 5615 break 5616 } 5617 if v_1.AuxInt != 0 { 5618 break 5619 } 5620 y := v_1.Args[0] 5621 v.reset(OpARMCMN) 5622 v.AddArg(x) 5623 v.AddArg(y) 5624 return true 5625 } 5626 return false 5627 } 5628 func rewriteValueARM_OpARMCMPD_0(v *Value) bool { 5629 // match: (CMPD x (MOVDconst [0])) 5630 // cond: 5631 // result: (CMPD0 x) 5632 for { 5633 _ = v.Args[1] 5634 x := v.Args[0] 5635 v_1 := v.Args[1] 5636 if v_1.Op != OpARMMOVDconst { 5637 break 5638 } 5639 if v_1.AuxInt != 0 { 5640 break 5641 } 5642 v.reset(OpARMCMPD0) 5643 v.AddArg(x) 5644 return true 5645 } 5646 return false 5647 } 5648 func rewriteValueARM_OpARMCMPF_0(v *Value) bool { 5649 // match: (CMPF x (MOVFconst [0])) 5650 // cond: 5651 // result: (CMPF0 x) 5652 for { 5653 _ = v.Args[1] 5654 x := v.Args[0] 5655 v_1 := v.Args[1] 5656 if v_1.Op != OpARMMOVFconst { 5657 break 5658 } 5659 if v_1.AuxInt != 0 { 5660 break 5661 } 5662 v.reset(OpARMCMPF0) 5663 v.AddArg(x) 5664 return true 5665 } 5666 return false 5667 } 5668 func rewriteValueARM_OpARMCMPconst_0(v *Value) bool { 5669 // match: (CMPconst (MOVWconst [x]) [y]) 5670 // cond: int32(x)==int32(y) 5671 // result: (FlagEQ) 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)) { 5680 break 5681 } 5682 v.reset(OpARMFlagEQ) 5683 return true 5684 } 5685 // match: (CMPconst (MOVWconst [x]) [y]) 5686 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 5687 // result: (FlagLT_ULT) 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(OpARMFlagLT_ULT) 5699 return true 5700 } 5701 // match: (CMPconst (MOVWconst [x]) [y]) 5702 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 5703 // result: (FlagLT_UGT) 5704 for { 5705 y := v.AuxInt 5706 v_0 := v.Args[0] 5707 if v_0.Op != OpARMMOVWconst { 5708 break 5709 } 5710 x := v_0.AuxInt 5711 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 5712 break 5713 } 5714 v.reset(OpARMFlagLT_UGT) 5715 return true 5716 } 5717 // match: (CMPconst (MOVWconst [x]) [y]) 5718 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 5719 // result: (FlagGT_ULT) 5720 for { 5721 y := v.AuxInt 5722 v_0 := v.Args[0] 5723 if v_0.Op != OpARMMOVWconst { 5724 break 5725 } 5726 x := v_0.AuxInt 5727 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 5728 break 5729 } 5730 v.reset(OpARMFlagGT_ULT) 5731 return true 5732 } 5733 // match: (CMPconst (MOVWconst [x]) [y]) 5734 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 5735 // result: (FlagGT_UGT) 5736 for { 5737 y := v.AuxInt 5738 v_0 := v.Args[0] 5739 if v_0.Op != OpARMMOVWconst { 5740 break 5741 } 5742 x := v_0.AuxInt 5743 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 5744 break 5745 } 5746 v.reset(OpARMFlagGT_UGT) 5747 return true 5748 } 5749 // match: (CMPconst (MOVBUreg _) [c]) 5750 // cond: 0xff < c 5751 // result: (FlagLT_ULT) 5752 for { 5753 c := v.AuxInt 5754 v_0 := v.Args[0] 5755 if v_0.Op != OpARMMOVBUreg { 5756 break 5757 } 5758 if !(0xff < c) { 5759 break 5760 } 5761 v.reset(OpARMFlagLT_ULT) 5762 return true 5763 } 5764 // match: (CMPconst (MOVHUreg _) [c]) 5765 // cond: 0xffff < c 5766 // result: (FlagLT_ULT) 5767 for { 5768 c := v.AuxInt 5769 v_0 := v.Args[0] 5770 if v_0.Op != OpARMMOVHUreg { 5771 break 5772 } 5773 if !(0xffff < c) { 5774 break 5775 } 5776 v.reset(OpARMFlagLT_ULT) 5777 return true 5778 } 5779 // match: (CMPconst (ANDconst _ [m]) [n]) 5780 // cond: 0 <= int32(m) && int32(m) < int32(n) 5781 // result: (FlagLT_ULT) 5782 for { 5783 n := v.AuxInt 5784 v_0 := v.Args[0] 5785 if v_0.Op != OpARMANDconst { 5786 break 5787 } 5788 m := v_0.AuxInt 5789 if !(0 <= int32(m) && int32(m) < int32(n)) { 5790 break 5791 } 5792 v.reset(OpARMFlagLT_ULT) 5793 return true 5794 } 5795 // match: (CMPconst (SRLconst _ [c]) [n]) 5796 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 5797 // result: (FlagLT_ULT) 5798 for { 5799 n := v.AuxInt 5800 v_0 := v.Args[0] 5801 if v_0.Op != OpARMSRLconst { 5802 break 5803 } 5804 c := v_0.AuxInt 5805 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 5806 break 5807 } 5808 v.reset(OpARMFlagLT_ULT) 5809 return true 5810 } 5811 return false 5812 } 5813 func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { 5814 b := v.Block 5815 _ = b 5816 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 5817 // cond: 5818 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 5819 for { 5820 d := v.AuxInt 5821 _ = v.Args[1] 5822 v_0 := v.Args[0] 5823 if v_0.Op != OpARMMOVWconst { 5824 break 5825 } 5826 c := v_0.AuxInt 5827 x := v.Args[1] 5828 v.reset(OpARMInvertFlags) 5829 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5830 v0.AuxInt = c 5831 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 5832 v1.AuxInt = d 5833 v1.AddArg(x) 5834 v0.AddArg(v1) 5835 v.AddArg(v0) 5836 return true 5837 } 5838 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 5839 // cond: 5840 // result: (CMPconst x [int64(int32(uint32(c)<<uint64(d)))]) 5841 for { 5842 d := v.AuxInt 5843 _ = v.Args[1] 5844 x := v.Args[0] 5845 v_1 := v.Args[1] 5846 if v_1.Op != OpARMMOVWconst { 5847 break 5848 } 5849 c := v_1.AuxInt 5850 v.reset(OpARMCMPconst) 5851 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 5852 v.AddArg(x) 5853 return true 5854 } 5855 return false 5856 } 5857 func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { 5858 b := v.Block 5859 _ = b 5860 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 5861 // cond: 5862 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 5863 for { 5864 _ = v.Args[2] 5865 v_0 := v.Args[0] 5866 if v_0.Op != OpARMMOVWconst { 5867 break 5868 } 5869 c := v_0.AuxInt 5870 x := v.Args[1] 5871 y := v.Args[2] 5872 v.reset(OpARMInvertFlags) 5873 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5874 v0.AuxInt = c 5875 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 5876 v1.AddArg(x) 5877 v1.AddArg(y) 5878 v0.AddArg(v1) 5879 v.AddArg(v0) 5880 return true 5881 } 5882 // match: (CMPshiftLLreg x y (MOVWconst [c])) 5883 // cond: 5884 // result: (CMPshiftLL x y [c]) 5885 for { 5886 _ = v.Args[2] 5887 x := v.Args[0] 5888 y := v.Args[1] 5889 v_2 := v.Args[2] 5890 if v_2.Op != OpARMMOVWconst { 5891 break 5892 } 5893 c := v_2.AuxInt 5894 v.reset(OpARMCMPshiftLL) 5895 v.AuxInt = c 5896 v.AddArg(x) 5897 v.AddArg(y) 5898 return true 5899 } 5900 return false 5901 } 5902 func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { 5903 b := v.Block 5904 _ = b 5905 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 5906 // cond: 5907 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 5908 for { 5909 d := v.AuxInt 5910 _ = v.Args[1] 5911 v_0 := v.Args[0] 5912 if v_0.Op != OpARMMOVWconst { 5913 break 5914 } 5915 c := v_0.AuxInt 5916 x := v.Args[1] 5917 v.reset(OpARMInvertFlags) 5918 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5919 v0.AuxInt = c 5920 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 5921 v1.AuxInt = d 5922 v1.AddArg(x) 5923 v0.AddArg(v1) 5924 v.AddArg(v0) 5925 return true 5926 } 5927 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 5928 // cond: 5929 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 5930 for { 5931 d := v.AuxInt 5932 _ = v.Args[1] 5933 x := v.Args[0] 5934 v_1 := v.Args[1] 5935 if v_1.Op != OpARMMOVWconst { 5936 break 5937 } 5938 c := v_1.AuxInt 5939 v.reset(OpARMCMPconst) 5940 v.AuxInt = int64(int32(c) >> uint64(d)) 5941 v.AddArg(x) 5942 return true 5943 } 5944 return false 5945 } 5946 func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { 5947 b := v.Block 5948 _ = b 5949 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 5950 // cond: 5951 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 5952 for { 5953 _ = v.Args[2] 5954 v_0 := v.Args[0] 5955 if v_0.Op != OpARMMOVWconst { 5956 break 5957 } 5958 c := v_0.AuxInt 5959 x := v.Args[1] 5960 y := v.Args[2] 5961 v.reset(OpARMInvertFlags) 5962 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5963 v0.AuxInt = c 5964 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 5965 v1.AddArg(x) 5966 v1.AddArg(y) 5967 v0.AddArg(v1) 5968 v.AddArg(v0) 5969 return true 5970 } 5971 // match: (CMPshiftRAreg x y (MOVWconst [c])) 5972 // cond: 5973 // result: (CMPshiftRA x y [c]) 5974 for { 5975 _ = v.Args[2] 5976 x := v.Args[0] 5977 y := v.Args[1] 5978 v_2 := v.Args[2] 5979 if v_2.Op != OpARMMOVWconst { 5980 break 5981 } 5982 c := v_2.AuxInt 5983 v.reset(OpARMCMPshiftRA) 5984 v.AuxInt = c 5985 v.AddArg(x) 5986 v.AddArg(y) 5987 return true 5988 } 5989 return false 5990 } 5991 func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { 5992 b := v.Block 5993 _ = b 5994 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 5995 // cond: 5996 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 5997 for { 5998 d := v.AuxInt 5999 _ = v.Args[1] 6000 v_0 := v.Args[0] 6001 if v_0.Op != OpARMMOVWconst { 6002 break 6003 } 6004 c := v_0.AuxInt 6005 x := v.Args[1] 6006 v.reset(OpARMInvertFlags) 6007 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 6008 v0.AuxInt = c 6009 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 6010 v1.AuxInt = d 6011 v1.AddArg(x) 6012 v0.AddArg(v1) 6013 v.AddArg(v0) 6014 return true 6015 } 6016 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 6017 // cond: 6018 // result: (CMPconst x [int64(int32(uint32(c)>>uint64(d)))]) 6019 for { 6020 d := v.AuxInt 6021 _ = v.Args[1] 6022 x := v.Args[0] 6023 v_1 := v.Args[1] 6024 if v_1.Op != OpARMMOVWconst { 6025 break 6026 } 6027 c := v_1.AuxInt 6028 v.reset(OpARMCMPconst) 6029 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 6030 v.AddArg(x) 6031 return true 6032 } 6033 return false 6034 } 6035 func rewriteValueARM_OpARMCMPshiftRLreg_0(v *Value) bool { 6036 b := v.Block 6037 _ = b 6038 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 6039 // cond: 6040 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 6041 for { 6042 _ = v.Args[2] 6043 v_0 := v.Args[0] 6044 if v_0.Op != OpARMMOVWconst { 6045 break 6046 } 6047 c := v_0.AuxInt 6048 x := v.Args[1] 6049 y := v.Args[2] 6050 v.reset(OpARMInvertFlags) 6051 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 6052 v0.AuxInt = c 6053 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 6054 v1.AddArg(x) 6055 v1.AddArg(y) 6056 v0.AddArg(v1) 6057 v.AddArg(v0) 6058 return true 6059 } 6060 // match: (CMPshiftRLreg x y (MOVWconst [c])) 6061 // cond: 6062 // result: (CMPshiftRL x y [c]) 6063 for { 6064 _ = v.Args[2] 6065 x := v.Args[0] 6066 y := v.Args[1] 6067 v_2 := v.Args[2] 6068 if v_2.Op != OpARMMOVWconst { 6069 break 6070 } 6071 c := v_2.AuxInt 6072 v.reset(OpARMCMPshiftRL) 6073 v.AuxInt = c 6074 v.AddArg(x) 6075 v.AddArg(y) 6076 return true 6077 } 6078 return false 6079 } 6080 func rewriteValueARM_OpARMEqual_0(v *Value) bool { 6081 // match: (Equal (FlagEQ)) 6082 // cond: 6083 // result: (MOVWconst [1]) 6084 for { 6085 v_0 := v.Args[0] 6086 if v_0.Op != OpARMFlagEQ { 6087 break 6088 } 6089 v.reset(OpARMMOVWconst) 6090 v.AuxInt = 1 6091 return true 6092 } 6093 // match: (Equal (FlagLT_ULT)) 6094 // cond: 6095 // result: (MOVWconst [0]) 6096 for { 6097 v_0 := v.Args[0] 6098 if v_0.Op != OpARMFlagLT_ULT { 6099 break 6100 } 6101 v.reset(OpARMMOVWconst) 6102 v.AuxInt = 0 6103 return true 6104 } 6105 // match: (Equal (FlagLT_UGT)) 6106 // cond: 6107 // result: (MOVWconst [0]) 6108 for { 6109 v_0 := v.Args[0] 6110 if v_0.Op != OpARMFlagLT_UGT { 6111 break 6112 } 6113 v.reset(OpARMMOVWconst) 6114 v.AuxInt = 0 6115 return true 6116 } 6117 // match: (Equal (FlagGT_ULT)) 6118 // cond: 6119 // result: (MOVWconst [0]) 6120 for { 6121 v_0 := v.Args[0] 6122 if v_0.Op != OpARMFlagGT_ULT { 6123 break 6124 } 6125 v.reset(OpARMMOVWconst) 6126 v.AuxInt = 0 6127 return true 6128 } 6129 // match: (Equal (FlagGT_UGT)) 6130 // cond: 6131 // result: (MOVWconst [0]) 6132 for { 6133 v_0 := v.Args[0] 6134 if v_0.Op != OpARMFlagGT_UGT { 6135 break 6136 } 6137 v.reset(OpARMMOVWconst) 6138 v.AuxInt = 0 6139 return true 6140 } 6141 // match: (Equal (InvertFlags x)) 6142 // cond: 6143 // result: (Equal x) 6144 for { 6145 v_0 := v.Args[0] 6146 if v_0.Op != OpARMInvertFlags { 6147 break 6148 } 6149 x := v_0.Args[0] 6150 v.reset(OpARMEqual) 6151 v.AddArg(x) 6152 return true 6153 } 6154 return false 6155 } 6156 func rewriteValueARM_OpARMGreaterEqual_0(v *Value) bool { 6157 // match: (GreaterEqual (FlagEQ)) 6158 // cond: 6159 // result: (MOVWconst [1]) 6160 for { 6161 v_0 := v.Args[0] 6162 if v_0.Op != OpARMFlagEQ { 6163 break 6164 } 6165 v.reset(OpARMMOVWconst) 6166 v.AuxInt = 1 6167 return true 6168 } 6169 // match: (GreaterEqual (FlagLT_ULT)) 6170 // cond: 6171 // result: (MOVWconst [0]) 6172 for { 6173 v_0 := v.Args[0] 6174 if v_0.Op != OpARMFlagLT_ULT { 6175 break 6176 } 6177 v.reset(OpARMMOVWconst) 6178 v.AuxInt = 0 6179 return true 6180 } 6181 // match: (GreaterEqual (FlagLT_UGT)) 6182 // cond: 6183 // result: (MOVWconst [0]) 6184 for { 6185 v_0 := v.Args[0] 6186 if v_0.Op != OpARMFlagLT_UGT { 6187 break 6188 } 6189 v.reset(OpARMMOVWconst) 6190 v.AuxInt = 0 6191 return true 6192 } 6193 // match: (GreaterEqual (FlagGT_ULT)) 6194 // cond: 6195 // result: (MOVWconst [1]) 6196 for { 6197 v_0 := v.Args[0] 6198 if v_0.Op != OpARMFlagGT_ULT { 6199 break 6200 } 6201 v.reset(OpARMMOVWconst) 6202 v.AuxInt = 1 6203 return true 6204 } 6205 // match: (GreaterEqual (FlagGT_UGT)) 6206 // cond: 6207 // result: (MOVWconst [1]) 6208 for { 6209 v_0 := v.Args[0] 6210 if v_0.Op != OpARMFlagGT_UGT { 6211 break 6212 } 6213 v.reset(OpARMMOVWconst) 6214 v.AuxInt = 1 6215 return true 6216 } 6217 // match: (GreaterEqual (InvertFlags x)) 6218 // cond: 6219 // result: (LessEqual x) 6220 for { 6221 v_0 := v.Args[0] 6222 if v_0.Op != OpARMInvertFlags { 6223 break 6224 } 6225 x := v_0.Args[0] 6226 v.reset(OpARMLessEqual) 6227 v.AddArg(x) 6228 return true 6229 } 6230 return false 6231 } 6232 func rewriteValueARM_OpARMGreaterEqualU_0(v *Value) bool { 6233 // match: (GreaterEqualU (FlagEQ)) 6234 // cond: 6235 // result: (MOVWconst [1]) 6236 for { 6237 v_0 := v.Args[0] 6238 if v_0.Op != OpARMFlagEQ { 6239 break 6240 } 6241 v.reset(OpARMMOVWconst) 6242 v.AuxInt = 1 6243 return true 6244 } 6245 // match: (GreaterEqualU (FlagLT_ULT)) 6246 // cond: 6247 // result: (MOVWconst [0]) 6248 for { 6249 v_0 := v.Args[0] 6250 if v_0.Op != OpARMFlagLT_ULT { 6251 break 6252 } 6253 v.reset(OpARMMOVWconst) 6254 v.AuxInt = 0 6255 return true 6256 } 6257 // match: (GreaterEqualU (FlagLT_UGT)) 6258 // cond: 6259 // result: (MOVWconst [1]) 6260 for { 6261 v_0 := v.Args[0] 6262 if v_0.Op != OpARMFlagLT_UGT { 6263 break 6264 } 6265 v.reset(OpARMMOVWconst) 6266 v.AuxInt = 1 6267 return true 6268 } 6269 // match: (GreaterEqualU (FlagGT_ULT)) 6270 // cond: 6271 // result: (MOVWconst [0]) 6272 for { 6273 v_0 := v.Args[0] 6274 if v_0.Op != OpARMFlagGT_ULT { 6275 break 6276 } 6277 v.reset(OpARMMOVWconst) 6278 v.AuxInt = 0 6279 return true 6280 } 6281 // match: (GreaterEqualU (FlagGT_UGT)) 6282 // cond: 6283 // result: (MOVWconst [1]) 6284 for { 6285 v_0 := v.Args[0] 6286 if v_0.Op != OpARMFlagGT_UGT { 6287 break 6288 } 6289 v.reset(OpARMMOVWconst) 6290 v.AuxInt = 1 6291 return true 6292 } 6293 // match: (GreaterEqualU (InvertFlags x)) 6294 // cond: 6295 // result: (LessEqualU x) 6296 for { 6297 v_0 := v.Args[0] 6298 if v_0.Op != OpARMInvertFlags { 6299 break 6300 } 6301 x := v_0.Args[0] 6302 v.reset(OpARMLessEqualU) 6303 v.AddArg(x) 6304 return true 6305 } 6306 return false 6307 } 6308 func rewriteValueARM_OpARMGreaterThan_0(v *Value) bool { 6309 // match: (GreaterThan (FlagEQ)) 6310 // cond: 6311 // result: (MOVWconst [0]) 6312 for { 6313 v_0 := v.Args[0] 6314 if v_0.Op != OpARMFlagEQ { 6315 break 6316 } 6317 v.reset(OpARMMOVWconst) 6318 v.AuxInt = 0 6319 return true 6320 } 6321 // match: (GreaterThan (FlagLT_ULT)) 6322 // cond: 6323 // result: (MOVWconst [0]) 6324 for { 6325 v_0 := v.Args[0] 6326 if v_0.Op != OpARMFlagLT_ULT { 6327 break 6328 } 6329 v.reset(OpARMMOVWconst) 6330 v.AuxInt = 0 6331 return true 6332 } 6333 // match: (GreaterThan (FlagLT_UGT)) 6334 // cond: 6335 // result: (MOVWconst [0]) 6336 for { 6337 v_0 := v.Args[0] 6338 if v_0.Op != OpARMFlagLT_UGT { 6339 break 6340 } 6341 v.reset(OpARMMOVWconst) 6342 v.AuxInt = 0 6343 return true 6344 } 6345 // match: (GreaterThan (FlagGT_ULT)) 6346 // cond: 6347 // result: (MOVWconst [1]) 6348 for { 6349 v_0 := v.Args[0] 6350 if v_0.Op != OpARMFlagGT_ULT { 6351 break 6352 } 6353 v.reset(OpARMMOVWconst) 6354 v.AuxInt = 1 6355 return true 6356 } 6357 // match: (GreaterThan (FlagGT_UGT)) 6358 // cond: 6359 // result: (MOVWconst [1]) 6360 for { 6361 v_0 := v.Args[0] 6362 if v_0.Op != OpARMFlagGT_UGT { 6363 break 6364 } 6365 v.reset(OpARMMOVWconst) 6366 v.AuxInt = 1 6367 return true 6368 } 6369 // match: (GreaterThan (InvertFlags x)) 6370 // cond: 6371 // result: (LessThan x) 6372 for { 6373 v_0 := v.Args[0] 6374 if v_0.Op != OpARMInvertFlags { 6375 break 6376 } 6377 x := v_0.Args[0] 6378 v.reset(OpARMLessThan) 6379 v.AddArg(x) 6380 return true 6381 } 6382 return false 6383 } 6384 func rewriteValueARM_OpARMGreaterThanU_0(v *Value) bool { 6385 // match: (GreaterThanU (FlagEQ)) 6386 // cond: 6387 // result: (MOVWconst [0]) 6388 for { 6389 v_0 := v.Args[0] 6390 if v_0.Op != OpARMFlagEQ { 6391 break 6392 } 6393 v.reset(OpARMMOVWconst) 6394 v.AuxInt = 0 6395 return true 6396 } 6397 // match: (GreaterThanU (FlagLT_ULT)) 6398 // cond: 6399 // result: (MOVWconst [0]) 6400 for { 6401 v_0 := v.Args[0] 6402 if v_0.Op != OpARMFlagLT_ULT { 6403 break 6404 } 6405 v.reset(OpARMMOVWconst) 6406 v.AuxInt = 0 6407 return true 6408 } 6409 // match: (GreaterThanU (FlagLT_UGT)) 6410 // cond: 6411 // result: (MOVWconst [1]) 6412 for { 6413 v_0 := v.Args[0] 6414 if v_0.Op != OpARMFlagLT_UGT { 6415 break 6416 } 6417 v.reset(OpARMMOVWconst) 6418 v.AuxInt = 1 6419 return true 6420 } 6421 // match: (GreaterThanU (FlagGT_ULT)) 6422 // cond: 6423 // result: (MOVWconst [0]) 6424 for { 6425 v_0 := v.Args[0] 6426 if v_0.Op != OpARMFlagGT_ULT { 6427 break 6428 } 6429 v.reset(OpARMMOVWconst) 6430 v.AuxInt = 0 6431 return true 6432 } 6433 // match: (GreaterThanU (FlagGT_UGT)) 6434 // cond: 6435 // result: (MOVWconst [1]) 6436 for { 6437 v_0 := v.Args[0] 6438 if v_0.Op != OpARMFlagGT_UGT { 6439 break 6440 } 6441 v.reset(OpARMMOVWconst) 6442 v.AuxInt = 1 6443 return true 6444 } 6445 // match: (GreaterThanU (InvertFlags x)) 6446 // cond: 6447 // result: (LessThanU x) 6448 for { 6449 v_0 := v.Args[0] 6450 if v_0.Op != OpARMInvertFlags { 6451 break 6452 } 6453 x := v_0.Args[0] 6454 v.reset(OpARMLessThanU) 6455 v.AddArg(x) 6456 return true 6457 } 6458 return false 6459 } 6460 func rewriteValueARM_OpARMLessEqual_0(v *Value) bool { 6461 // match: (LessEqual (FlagEQ)) 6462 // cond: 6463 // result: (MOVWconst [1]) 6464 for { 6465 v_0 := v.Args[0] 6466 if v_0.Op != OpARMFlagEQ { 6467 break 6468 } 6469 v.reset(OpARMMOVWconst) 6470 v.AuxInt = 1 6471 return true 6472 } 6473 // match: (LessEqual (FlagLT_ULT)) 6474 // cond: 6475 // result: (MOVWconst [1]) 6476 for { 6477 v_0 := v.Args[0] 6478 if v_0.Op != OpARMFlagLT_ULT { 6479 break 6480 } 6481 v.reset(OpARMMOVWconst) 6482 v.AuxInt = 1 6483 return true 6484 } 6485 // match: (LessEqual (FlagLT_UGT)) 6486 // cond: 6487 // result: (MOVWconst [1]) 6488 for { 6489 v_0 := v.Args[0] 6490 if v_0.Op != OpARMFlagLT_UGT { 6491 break 6492 } 6493 v.reset(OpARMMOVWconst) 6494 v.AuxInt = 1 6495 return true 6496 } 6497 // match: (LessEqual (FlagGT_ULT)) 6498 // cond: 6499 // result: (MOVWconst [0]) 6500 for { 6501 v_0 := v.Args[0] 6502 if v_0.Op != OpARMFlagGT_ULT { 6503 break 6504 } 6505 v.reset(OpARMMOVWconst) 6506 v.AuxInt = 0 6507 return true 6508 } 6509 // match: (LessEqual (FlagGT_UGT)) 6510 // cond: 6511 // result: (MOVWconst [0]) 6512 for { 6513 v_0 := v.Args[0] 6514 if v_0.Op != OpARMFlagGT_UGT { 6515 break 6516 } 6517 v.reset(OpARMMOVWconst) 6518 v.AuxInt = 0 6519 return true 6520 } 6521 // match: (LessEqual (InvertFlags x)) 6522 // cond: 6523 // result: (GreaterEqual x) 6524 for { 6525 v_0 := v.Args[0] 6526 if v_0.Op != OpARMInvertFlags { 6527 break 6528 } 6529 x := v_0.Args[0] 6530 v.reset(OpARMGreaterEqual) 6531 v.AddArg(x) 6532 return true 6533 } 6534 return false 6535 } 6536 func rewriteValueARM_OpARMLessEqualU_0(v *Value) bool { 6537 // match: (LessEqualU (FlagEQ)) 6538 // cond: 6539 // result: (MOVWconst [1]) 6540 for { 6541 v_0 := v.Args[0] 6542 if v_0.Op != OpARMFlagEQ { 6543 break 6544 } 6545 v.reset(OpARMMOVWconst) 6546 v.AuxInt = 1 6547 return true 6548 } 6549 // match: (LessEqualU (FlagLT_ULT)) 6550 // cond: 6551 // result: (MOVWconst [1]) 6552 for { 6553 v_0 := v.Args[0] 6554 if v_0.Op != OpARMFlagLT_ULT { 6555 break 6556 } 6557 v.reset(OpARMMOVWconst) 6558 v.AuxInt = 1 6559 return true 6560 } 6561 // match: (LessEqualU (FlagLT_UGT)) 6562 // cond: 6563 // result: (MOVWconst [0]) 6564 for { 6565 v_0 := v.Args[0] 6566 if v_0.Op != OpARMFlagLT_UGT { 6567 break 6568 } 6569 v.reset(OpARMMOVWconst) 6570 v.AuxInt = 0 6571 return true 6572 } 6573 // match: (LessEqualU (FlagGT_ULT)) 6574 // cond: 6575 // result: (MOVWconst [1]) 6576 for { 6577 v_0 := v.Args[0] 6578 if v_0.Op != OpARMFlagGT_ULT { 6579 break 6580 } 6581 v.reset(OpARMMOVWconst) 6582 v.AuxInt = 1 6583 return true 6584 } 6585 // match: (LessEqualU (FlagGT_UGT)) 6586 // cond: 6587 // result: (MOVWconst [0]) 6588 for { 6589 v_0 := v.Args[0] 6590 if v_0.Op != OpARMFlagGT_UGT { 6591 break 6592 } 6593 v.reset(OpARMMOVWconst) 6594 v.AuxInt = 0 6595 return true 6596 } 6597 // match: (LessEqualU (InvertFlags x)) 6598 // cond: 6599 // result: (GreaterEqualU x) 6600 for { 6601 v_0 := v.Args[0] 6602 if v_0.Op != OpARMInvertFlags { 6603 break 6604 } 6605 x := v_0.Args[0] 6606 v.reset(OpARMGreaterEqualU) 6607 v.AddArg(x) 6608 return true 6609 } 6610 return false 6611 } 6612 func rewriteValueARM_OpARMLessThan_0(v *Value) bool { 6613 // match: (LessThan (FlagEQ)) 6614 // cond: 6615 // result: (MOVWconst [0]) 6616 for { 6617 v_0 := v.Args[0] 6618 if v_0.Op != OpARMFlagEQ { 6619 break 6620 } 6621 v.reset(OpARMMOVWconst) 6622 v.AuxInt = 0 6623 return true 6624 } 6625 // match: (LessThan (FlagLT_ULT)) 6626 // cond: 6627 // result: (MOVWconst [1]) 6628 for { 6629 v_0 := v.Args[0] 6630 if v_0.Op != OpARMFlagLT_ULT { 6631 break 6632 } 6633 v.reset(OpARMMOVWconst) 6634 v.AuxInt = 1 6635 return true 6636 } 6637 // match: (LessThan (FlagLT_UGT)) 6638 // cond: 6639 // result: (MOVWconst [1]) 6640 for { 6641 v_0 := v.Args[0] 6642 if v_0.Op != OpARMFlagLT_UGT { 6643 break 6644 } 6645 v.reset(OpARMMOVWconst) 6646 v.AuxInt = 1 6647 return true 6648 } 6649 // match: (LessThan (FlagGT_ULT)) 6650 // cond: 6651 // result: (MOVWconst [0]) 6652 for { 6653 v_0 := v.Args[0] 6654 if v_0.Op != OpARMFlagGT_ULT { 6655 break 6656 } 6657 v.reset(OpARMMOVWconst) 6658 v.AuxInt = 0 6659 return true 6660 } 6661 // match: (LessThan (FlagGT_UGT)) 6662 // cond: 6663 // result: (MOVWconst [0]) 6664 for { 6665 v_0 := v.Args[0] 6666 if v_0.Op != OpARMFlagGT_UGT { 6667 break 6668 } 6669 v.reset(OpARMMOVWconst) 6670 v.AuxInt = 0 6671 return true 6672 } 6673 // match: (LessThan (InvertFlags x)) 6674 // cond: 6675 // result: (GreaterThan x) 6676 for { 6677 v_0 := v.Args[0] 6678 if v_0.Op != OpARMInvertFlags { 6679 break 6680 } 6681 x := v_0.Args[0] 6682 v.reset(OpARMGreaterThan) 6683 v.AddArg(x) 6684 return true 6685 } 6686 return false 6687 } 6688 func rewriteValueARM_OpARMLessThanU_0(v *Value) bool { 6689 // match: (LessThanU (FlagEQ)) 6690 // cond: 6691 // result: (MOVWconst [0]) 6692 for { 6693 v_0 := v.Args[0] 6694 if v_0.Op != OpARMFlagEQ { 6695 break 6696 } 6697 v.reset(OpARMMOVWconst) 6698 v.AuxInt = 0 6699 return true 6700 } 6701 // match: (LessThanU (FlagLT_ULT)) 6702 // cond: 6703 // result: (MOVWconst [1]) 6704 for { 6705 v_0 := v.Args[0] 6706 if v_0.Op != OpARMFlagLT_ULT { 6707 break 6708 } 6709 v.reset(OpARMMOVWconst) 6710 v.AuxInt = 1 6711 return true 6712 } 6713 // match: (LessThanU (FlagLT_UGT)) 6714 // cond: 6715 // result: (MOVWconst [0]) 6716 for { 6717 v_0 := v.Args[0] 6718 if v_0.Op != OpARMFlagLT_UGT { 6719 break 6720 } 6721 v.reset(OpARMMOVWconst) 6722 v.AuxInt = 0 6723 return true 6724 } 6725 // match: (LessThanU (FlagGT_ULT)) 6726 // cond: 6727 // result: (MOVWconst [1]) 6728 for { 6729 v_0 := v.Args[0] 6730 if v_0.Op != OpARMFlagGT_ULT { 6731 break 6732 } 6733 v.reset(OpARMMOVWconst) 6734 v.AuxInt = 1 6735 return true 6736 } 6737 // match: (LessThanU (FlagGT_UGT)) 6738 // cond: 6739 // result: (MOVWconst [0]) 6740 for { 6741 v_0 := v.Args[0] 6742 if v_0.Op != OpARMFlagGT_UGT { 6743 break 6744 } 6745 v.reset(OpARMMOVWconst) 6746 v.AuxInt = 0 6747 return true 6748 } 6749 // match: (LessThanU (InvertFlags x)) 6750 // cond: 6751 // result: (GreaterThanU x) 6752 for { 6753 v_0 := v.Args[0] 6754 if v_0.Op != OpARMInvertFlags { 6755 break 6756 } 6757 x := v_0.Args[0] 6758 v.reset(OpARMGreaterThanU) 6759 v.AddArg(x) 6760 return true 6761 } 6762 return false 6763 } 6764 func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { 6765 b := v.Block 6766 _ = b 6767 config := b.Func.Config 6768 _ = config 6769 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 6770 // cond: 6771 // result: (MOVBUload [off1+off2] {sym} ptr mem) 6772 for { 6773 off1 := v.AuxInt 6774 sym := v.Aux 6775 _ = v.Args[1] 6776 v_0 := v.Args[0] 6777 if v_0.Op != OpARMADDconst { 6778 break 6779 } 6780 off2 := v_0.AuxInt 6781 ptr := v_0.Args[0] 6782 mem := v.Args[1] 6783 v.reset(OpARMMOVBUload) 6784 v.AuxInt = off1 + off2 6785 v.Aux = sym 6786 v.AddArg(ptr) 6787 v.AddArg(mem) 6788 return true 6789 } 6790 // match: (MOVBUload [off1] {sym} (SUBconst [off2] ptr) mem) 6791 // cond: 6792 // result: (MOVBUload [off1-off2] {sym} ptr mem) 6793 for { 6794 off1 := v.AuxInt 6795 sym := v.Aux 6796 _ = v.Args[1] 6797 v_0 := v.Args[0] 6798 if v_0.Op != OpARMSUBconst { 6799 break 6800 } 6801 off2 := v_0.AuxInt 6802 ptr := v_0.Args[0] 6803 mem := v.Args[1] 6804 v.reset(OpARMMOVBUload) 6805 v.AuxInt = off1 - off2 6806 v.Aux = sym 6807 v.AddArg(ptr) 6808 v.AddArg(mem) 6809 return true 6810 } 6811 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6812 // cond: canMergeSym(sym1,sym2) 6813 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6814 for { 6815 off1 := v.AuxInt 6816 sym1 := v.Aux 6817 _ = v.Args[1] 6818 v_0 := v.Args[0] 6819 if v_0.Op != OpARMMOVWaddr { 6820 break 6821 } 6822 off2 := v_0.AuxInt 6823 sym2 := v_0.Aux 6824 ptr := v_0.Args[0] 6825 mem := v.Args[1] 6826 if !(canMergeSym(sym1, sym2)) { 6827 break 6828 } 6829 v.reset(OpARMMOVBUload) 6830 v.AuxInt = off1 + off2 6831 v.Aux = mergeSym(sym1, sym2) 6832 v.AddArg(ptr) 6833 v.AddArg(mem) 6834 return true 6835 } 6836 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 6837 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6838 // result: (MOVBUreg x) 6839 for { 6840 off := v.AuxInt 6841 sym := v.Aux 6842 _ = v.Args[1] 6843 ptr := v.Args[0] 6844 v_1 := v.Args[1] 6845 if v_1.Op != OpARMMOVBstore { 6846 break 6847 } 6848 off2 := v_1.AuxInt 6849 sym2 := v_1.Aux 6850 _ = v_1.Args[2] 6851 ptr2 := v_1.Args[0] 6852 x := v_1.Args[1] 6853 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6854 break 6855 } 6856 v.reset(OpARMMOVBUreg) 6857 v.AddArg(x) 6858 return true 6859 } 6860 // match: (MOVBUload [0] {sym} (ADD ptr idx) mem) 6861 // cond: sym == nil && !config.nacl 6862 // result: (MOVBUloadidx ptr idx mem) 6863 for { 6864 if v.AuxInt != 0 { 6865 break 6866 } 6867 sym := v.Aux 6868 _ = v.Args[1] 6869 v_0 := v.Args[0] 6870 if v_0.Op != OpARMADD { 6871 break 6872 } 6873 _ = v_0.Args[1] 6874 ptr := v_0.Args[0] 6875 idx := v_0.Args[1] 6876 mem := v.Args[1] 6877 if !(sym == nil && !config.nacl) { 6878 break 6879 } 6880 v.reset(OpARMMOVBUloadidx) 6881 v.AddArg(ptr) 6882 v.AddArg(idx) 6883 v.AddArg(mem) 6884 return true 6885 } 6886 // match: (MOVBUload [off] {sym} (SB) _) 6887 // cond: symIsRO(sym) 6888 // result: (MOVWconst [int64(read8(sym, off))]) 6889 for { 6890 off := v.AuxInt 6891 sym := v.Aux 6892 _ = v.Args[1] 6893 v_0 := v.Args[0] 6894 if v_0.Op != OpSB { 6895 break 6896 } 6897 if !(symIsRO(sym)) { 6898 break 6899 } 6900 v.reset(OpARMMOVWconst) 6901 v.AuxInt = int64(read8(sym, off)) 6902 return true 6903 } 6904 return false 6905 } 6906 func rewriteValueARM_OpARMMOVBUloadidx_0(v *Value) bool { 6907 // match: (MOVBUloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 6908 // cond: isSamePtr(ptr, ptr2) 6909 // result: (MOVBUreg x) 6910 for { 6911 _ = v.Args[2] 6912 ptr := v.Args[0] 6913 idx := v.Args[1] 6914 v_2 := v.Args[2] 6915 if v_2.Op != OpARMMOVBstoreidx { 6916 break 6917 } 6918 _ = v_2.Args[3] 6919 ptr2 := v_2.Args[0] 6920 if idx != v_2.Args[1] { 6921 break 6922 } 6923 x := v_2.Args[2] 6924 if !(isSamePtr(ptr, ptr2)) { 6925 break 6926 } 6927 v.reset(OpARMMOVBUreg) 6928 v.AddArg(x) 6929 return true 6930 } 6931 // match: (MOVBUloadidx ptr (MOVWconst [c]) mem) 6932 // cond: 6933 // result: (MOVBUload [c] ptr mem) 6934 for { 6935 _ = v.Args[2] 6936 ptr := v.Args[0] 6937 v_1 := v.Args[1] 6938 if v_1.Op != OpARMMOVWconst { 6939 break 6940 } 6941 c := v_1.AuxInt 6942 mem := v.Args[2] 6943 v.reset(OpARMMOVBUload) 6944 v.AuxInt = c 6945 v.AddArg(ptr) 6946 v.AddArg(mem) 6947 return true 6948 } 6949 // match: (MOVBUloadidx (MOVWconst [c]) ptr mem) 6950 // cond: 6951 // result: (MOVBUload [c] ptr mem) 6952 for { 6953 _ = v.Args[2] 6954 v_0 := v.Args[0] 6955 if v_0.Op != OpARMMOVWconst { 6956 break 6957 } 6958 c := v_0.AuxInt 6959 ptr := v.Args[1] 6960 mem := v.Args[2] 6961 v.reset(OpARMMOVBUload) 6962 v.AuxInt = c 6963 v.AddArg(ptr) 6964 v.AddArg(mem) 6965 return true 6966 } 6967 return false 6968 } 6969 func rewriteValueARM_OpARMMOVBUreg_0(v *Value) bool { 6970 // match: (MOVBUreg x:(MOVBUload _ _)) 6971 // cond: 6972 // result: (MOVWreg x) 6973 for { 6974 x := v.Args[0] 6975 if x.Op != OpARMMOVBUload { 6976 break 6977 } 6978 _ = x.Args[1] 6979 v.reset(OpARMMOVWreg) 6980 v.AddArg(x) 6981 return true 6982 } 6983 // match: (MOVBUreg (ANDconst [c] x)) 6984 // cond: 6985 // result: (ANDconst [c&0xff] x) 6986 for { 6987 v_0 := v.Args[0] 6988 if v_0.Op != OpARMANDconst { 6989 break 6990 } 6991 c := v_0.AuxInt 6992 x := v_0.Args[0] 6993 v.reset(OpARMANDconst) 6994 v.AuxInt = c & 0xff 6995 v.AddArg(x) 6996 return true 6997 } 6998 // match: (MOVBUreg x:(MOVBUreg _)) 6999 // cond: 7000 // result: (MOVWreg x) 7001 for { 7002 x := v.Args[0] 7003 if x.Op != OpARMMOVBUreg { 7004 break 7005 } 7006 v.reset(OpARMMOVWreg) 7007 v.AddArg(x) 7008 return true 7009 } 7010 // match: (MOVBUreg (MOVWconst [c])) 7011 // cond: 7012 // result: (MOVWconst [int64(uint8(c))]) 7013 for { 7014 v_0 := v.Args[0] 7015 if v_0.Op != OpARMMOVWconst { 7016 break 7017 } 7018 c := v_0.AuxInt 7019 v.reset(OpARMMOVWconst) 7020 v.AuxInt = int64(uint8(c)) 7021 return true 7022 } 7023 return false 7024 } 7025 func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { 7026 b := v.Block 7027 _ = b 7028 config := b.Func.Config 7029 _ = config 7030 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 7031 // cond: 7032 // result: (MOVBload [off1+off2] {sym} ptr mem) 7033 for { 7034 off1 := v.AuxInt 7035 sym := v.Aux 7036 _ = v.Args[1] 7037 v_0 := v.Args[0] 7038 if v_0.Op != OpARMADDconst { 7039 break 7040 } 7041 off2 := v_0.AuxInt 7042 ptr := v_0.Args[0] 7043 mem := v.Args[1] 7044 v.reset(OpARMMOVBload) 7045 v.AuxInt = off1 + off2 7046 v.Aux = sym 7047 v.AddArg(ptr) 7048 v.AddArg(mem) 7049 return true 7050 } 7051 // match: (MOVBload [off1] {sym} (SUBconst [off2] ptr) mem) 7052 // cond: 7053 // result: (MOVBload [off1-off2] {sym} ptr mem) 7054 for { 7055 off1 := v.AuxInt 7056 sym := v.Aux 7057 _ = v.Args[1] 7058 v_0 := v.Args[0] 7059 if v_0.Op != OpARMSUBconst { 7060 break 7061 } 7062 off2 := v_0.AuxInt 7063 ptr := v_0.Args[0] 7064 mem := v.Args[1] 7065 v.reset(OpARMMOVBload) 7066 v.AuxInt = off1 - off2 7067 v.Aux = sym 7068 v.AddArg(ptr) 7069 v.AddArg(mem) 7070 return true 7071 } 7072 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7073 // cond: canMergeSym(sym1,sym2) 7074 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7075 for { 7076 off1 := v.AuxInt 7077 sym1 := v.Aux 7078 _ = v.Args[1] 7079 v_0 := v.Args[0] 7080 if v_0.Op != OpARMMOVWaddr { 7081 break 7082 } 7083 off2 := v_0.AuxInt 7084 sym2 := v_0.Aux 7085 ptr := v_0.Args[0] 7086 mem := v.Args[1] 7087 if !(canMergeSym(sym1, sym2)) { 7088 break 7089 } 7090 v.reset(OpARMMOVBload) 7091 v.AuxInt = off1 + off2 7092 v.Aux = mergeSym(sym1, sym2) 7093 v.AddArg(ptr) 7094 v.AddArg(mem) 7095 return true 7096 } 7097 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 7098 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7099 // result: (MOVBreg x) 7100 for { 7101 off := v.AuxInt 7102 sym := v.Aux 7103 _ = v.Args[1] 7104 ptr := v.Args[0] 7105 v_1 := v.Args[1] 7106 if v_1.Op != OpARMMOVBstore { 7107 break 7108 } 7109 off2 := v_1.AuxInt 7110 sym2 := v_1.Aux 7111 _ = v_1.Args[2] 7112 ptr2 := v_1.Args[0] 7113 x := v_1.Args[1] 7114 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7115 break 7116 } 7117 v.reset(OpARMMOVBreg) 7118 v.AddArg(x) 7119 return true 7120 } 7121 // match: (MOVBload [0] {sym} (ADD ptr idx) mem) 7122 // cond: sym == nil && !config.nacl 7123 // result: (MOVBloadidx ptr idx mem) 7124 for { 7125 if v.AuxInt != 0 { 7126 break 7127 } 7128 sym := v.Aux 7129 _ = v.Args[1] 7130 v_0 := v.Args[0] 7131 if v_0.Op != OpARMADD { 7132 break 7133 } 7134 _ = v_0.Args[1] 7135 ptr := v_0.Args[0] 7136 idx := v_0.Args[1] 7137 mem := v.Args[1] 7138 if !(sym == nil && !config.nacl) { 7139 break 7140 } 7141 v.reset(OpARMMOVBloadidx) 7142 v.AddArg(ptr) 7143 v.AddArg(idx) 7144 v.AddArg(mem) 7145 return true 7146 } 7147 return false 7148 } 7149 func rewriteValueARM_OpARMMOVBloadidx_0(v *Value) bool { 7150 // match: (MOVBloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 7151 // cond: isSamePtr(ptr, ptr2) 7152 // result: (MOVBreg x) 7153 for { 7154 _ = v.Args[2] 7155 ptr := v.Args[0] 7156 idx := v.Args[1] 7157 v_2 := v.Args[2] 7158 if v_2.Op != OpARMMOVBstoreidx { 7159 break 7160 } 7161 _ = v_2.Args[3] 7162 ptr2 := v_2.Args[0] 7163 if idx != v_2.Args[1] { 7164 break 7165 } 7166 x := v_2.Args[2] 7167 if !(isSamePtr(ptr, ptr2)) { 7168 break 7169 } 7170 v.reset(OpARMMOVBreg) 7171 v.AddArg(x) 7172 return true 7173 } 7174 // match: (MOVBloadidx ptr (MOVWconst [c]) mem) 7175 // cond: 7176 // result: (MOVBload [c] ptr mem) 7177 for { 7178 _ = v.Args[2] 7179 ptr := v.Args[0] 7180 v_1 := v.Args[1] 7181 if v_1.Op != OpARMMOVWconst { 7182 break 7183 } 7184 c := v_1.AuxInt 7185 mem := v.Args[2] 7186 v.reset(OpARMMOVBload) 7187 v.AuxInt = c 7188 v.AddArg(ptr) 7189 v.AddArg(mem) 7190 return true 7191 } 7192 // match: (MOVBloadidx (MOVWconst [c]) ptr mem) 7193 // cond: 7194 // result: (MOVBload [c] ptr mem) 7195 for { 7196 _ = v.Args[2] 7197 v_0 := v.Args[0] 7198 if v_0.Op != OpARMMOVWconst { 7199 break 7200 } 7201 c := v_0.AuxInt 7202 ptr := v.Args[1] 7203 mem := v.Args[2] 7204 v.reset(OpARMMOVBload) 7205 v.AuxInt = c 7206 v.AddArg(ptr) 7207 v.AddArg(mem) 7208 return true 7209 } 7210 return false 7211 } 7212 func rewriteValueARM_OpARMMOVBreg_0(v *Value) bool { 7213 // match: (MOVBreg x:(MOVBload _ _)) 7214 // cond: 7215 // result: (MOVWreg x) 7216 for { 7217 x := v.Args[0] 7218 if x.Op != OpARMMOVBload { 7219 break 7220 } 7221 _ = x.Args[1] 7222 v.reset(OpARMMOVWreg) 7223 v.AddArg(x) 7224 return true 7225 } 7226 // match: (MOVBreg (ANDconst [c] x)) 7227 // cond: c & 0x80 == 0 7228 // result: (ANDconst [c&0x7f] x) 7229 for { 7230 v_0 := v.Args[0] 7231 if v_0.Op != OpARMANDconst { 7232 break 7233 } 7234 c := v_0.AuxInt 7235 x := v_0.Args[0] 7236 if !(c&0x80 == 0) { 7237 break 7238 } 7239 v.reset(OpARMANDconst) 7240 v.AuxInt = c & 0x7f 7241 v.AddArg(x) 7242 return true 7243 } 7244 // match: (MOVBreg x:(MOVBreg _)) 7245 // cond: 7246 // result: (MOVWreg x) 7247 for { 7248 x := v.Args[0] 7249 if x.Op != OpARMMOVBreg { 7250 break 7251 } 7252 v.reset(OpARMMOVWreg) 7253 v.AddArg(x) 7254 return true 7255 } 7256 // match: (MOVBreg (MOVWconst [c])) 7257 // cond: 7258 // result: (MOVWconst [int64(int8(c))]) 7259 for { 7260 v_0 := v.Args[0] 7261 if v_0.Op != OpARMMOVWconst { 7262 break 7263 } 7264 c := v_0.AuxInt 7265 v.reset(OpARMMOVWconst) 7266 v.AuxInt = int64(int8(c)) 7267 return true 7268 } 7269 return false 7270 } 7271 func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { 7272 b := v.Block 7273 _ = b 7274 config := b.Func.Config 7275 _ = config 7276 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7277 // cond: 7278 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 7279 for { 7280 off1 := v.AuxInt 7281 sym := v.Aux 7282 _ = v.Args[2] 7283 v_0 := v.Args[0] 7284 if v_0.Op != OpARMADDconst { 7285 break 7286 } 7287 off2 := v_0.AuxInt 7288 ptr := v_0.Args[0] 7289 val := v.Args[1] 7290 mem := v.Args[2] 7291 v.reset(OpARMMOVBstore) 7292 v.AuxInt = off1 + off2 7293 v.Aux = sym 7294 v.AddArg(ptr) 7295 v.AddArg(val) 7296 v.AddArg(mem) 7297 return true 7298 } 7299 // match: (MOVBstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7300 // cond: 7301 // result: (MOVBstore [off1-off2] {sym} ptr val mem) 7302 for { 7303 off1 := v.AuxInt 7304 sym := v.Aux 7305 _ = v.Args[2] 7306 v_0 := v.Args[0] 7307 if v_0.Op != OpARMSUBconst { 7308 break 7309 } 7310 off2 := v_0.AuxInt 7311 ptr := v_0.Args[0] 7312 val := v.Args[1] 7313 mem := v.Args[2] 7314 v.reset(OpARMMOVBstore) 7315 v.AuxInt = off1 - off2 7316 v.Aux = sym 7317 v.AddArg(ptr) 7318 v.AddArg(val) 7319 v.AddArg(mem) 7320 return true 7321 } 7322 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7323 // cond: canMergeSym(sym1,sym2) 7324 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7325 for { 7326 off1 := v.AuxInt 7327 sym1 := v.Aux 7328 _ = v.Args[2] 7329 v_0 := v.Args[0] 7330 if v_0.Op != OpARMMOVWaddr { 7331 break 7332 } 7333 off2 := v_0.AuxInt 7334 sym2 := v_0.Aux 7335 ptr := v_0.Args[0] 7336 val := v.Args[1] 7337 mem := v.Args[2] 7338 if !(canMergeSym(sym1, sym2)) { 7339 break 7340 } 7341 v.reset(OpARMMOVBstore) 7342 v.AuxInt = off1 + off2 7343 v.Aux = mergeSym(sym1, sym2) 7344 v.AddArg(ptr) 7345 v.AddArg(val) 7346 v.AddArg(mem) 7347 return true 7348 } 7349 // match: (MOVBstore [off] {sym} ptr (MOVBreg 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 != OpARMMOVBreg { 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 [off] {sym} ptr (MOVBUreg x) mem) 7372 // cond: 7373 // result: (MOVBstore [off] {sym} ptr x mem) 7374 for { 7375 off := v.AuxInt 7376 sym := v.Aux 7377 _ = v.Args[2] 7378 ptr := v.Args[0] 7379 v_1 := v.Args[1] 7380 if v_1.Op != OpARMMOVBUreg { 7381 break 7382 } 7383 x := v_1.Args[0] 7384 mem := v.Args[2] 7385 v.reset(OpARMMOVBstore) 7386 v.AuxInt = off 7387 v.Aux = sym 7388 v.AddArg(ptr) 7389 v.AddArg(x) 7390 v.AddArg(mem) 7391 return true 7392 } 7393 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 7394 // cond: 7395 // result: (MOVBstore [off] {sym} ptr x mem) 7396 for { 7397 off := v.AuxInt 7398 sym := v.Aux 7399 _ = v.Args[2] 7400 ptr := v.Args[0] 7401 v_1 := v.Args[1] 7402 if v_1.Op != OpARMMOVHreg { 7403 break 7404 } 7405 x := v_1.Args[0] 7406 mem := v.Args[2] 7407 v.reset(OpARMMOVBstore) 7408 v.AuxInt = off 7409 v.Aux = sym 7410 v.AddArg(ptr) 7411 v.AddArg(x) 7412 v.AddArg(mem) 7413 return true 7414 } 7415 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 7416 // cond: 7417 // result: (MOVBstore [off] {sym} ptr x mem) 7418 for { 7419 off := v.AuxInt 7420 sym := v.Aux 7421 _ = v.Args[2] 7422 ptr := v.Args[0] 7423 v_1 := v.Args[1] 7424 if v_1.Op != OpARMMOVHUreg { 7425 break 7426 } 7427 x := v_1.Args[0] 7428 mem := v.Args[2] 7429 v.reset(OpARMMOVBstore) 7430 v.AuxInt = off 7431 v.Aux = sym 7432 v.AddArg(ptr) 7433 v.AddArg(x) 7434 v.AddArg(mem) 7435 return true 7436 } 7437 // match: (MOVBstore [0] {sym} (ADD ptr idx) val mem) 7438 // cond: sym == nil && !config.nacl 7439 // result: (MOVBstoreidx ptr idx val mem) 7440 for { 7441 if v.AuxInt != 0 { 7442 break 7443 } 7444 sym := v.Aux 7445 _ = v.Args[2] 7446 v_0 := v.Args[0] 7447 if v_0.Op != OpARMADD { 7448 break 7449 } 7450 _ = v_0.Args[1] 7451 ptr := v_0.Args[0] 7452 idx := v_0.Args[1] 7453 val := v.Args[1] 7454 mem := v.Args[2] 7455 if !(sym == nil && !config.nacl) { 7456 break 7457 } 7458 v.reset(OpARMMOVBstoreidx) 7459 v.AddArg(ptr) 7460 v.AddArg(idx) 7461 v.AddArg(val) 7462 v.AddArg(mem) 7463 return true 7464 } 7465 return false 7466 } 7467 func rewriteValueARM_OpARMMOVBstoreidx_0(v *Value) bool { 7468 // match: (MOVBstoreidx ptr (MOVWconst [c]) val mem) 7469 // cond: 7470 // result: (MOVBstore [c] ptr val mem) 7471 for { 7472 _ = v.Args[3] 7473 ptr := v.Args[0] 7474 v_1 := v.Args[1] 7475 if v_1.Op != OpARMMOVWconst { 7476 break 7477 } 7478 c := v_1.AuxInt 7479 val := v.Args[2] 7480 mem := v.Args[3] 7481 v.reset(OpARMMOVBstore) 7482 v.AuxInt = c 7483 v.AddArg(ptr) 7484 v.AddArg(val) 7485 v.AddArg(mem) 7486 return true 7487 } 7488 // match: (MOVBstoreidx (MOVWconst [c]) ptr val mem) 7489 // cond: 7490 // result: (MOVBstore [c] ptr val mem) 7491 for { 7492 _ = v.Args[3] 7493 v_0 := v.Args[0] 7494 if v_0.Op != OpARMMOVWconst { 7495 break 7496 } 7497 c := v_0.AuxInt 7498 ptr := v.Args[1] 7499 val := v.Args[2] 7500 mem := v.Args[3] 7501 v.reset(OpARMMOVBstore) 7502 v.AuxInt = c 7503 v.AddArg(ptr) 7504 v.AddArg(val) 7505 v.AddArg(mem) 7506 return true 7507 } 7508 return false 7509 } 7510 func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { 7511 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 7512 // cond: 7513 // result: (MOVDload [off1+off2] {sym} ptr mem) 7514 for { 7515 off1 := v.AuxInt 7516 sym := v.Aux 7517 _ = v.Args[1] 7518 v_0 := v.Args[0] 7519 if v_0.Op != OpARMADDconst { 7520 break 7521 } 7522 off2 := v_0.AuxInt 7523 ptr := v_0.Args[0] 7524 mem := v.Args[1] 7525 v.reset(OpARMMOVDload) 7526 v.AuxInt = off1 + off2 7527 v.Aux = sym 7528 v.AddArg(ptr) 7529 v.AddArg(mem) 7530 return true 7531 } 7532 // match: (MOVDload [off1] {sym} (SUBconst [off2] ptr) mem) 7533 // cond: 7534 // result: (MOVDload [off1-off2] {sym} ptr mem) 7535 for { 7536 off1 := v.AuxInt 7537 sym := v.Aux 7538 _ = v.Args[1] 7539 v_0 := v.Args[0] 7540 if v_0.Op != OpARMSUBconst { 7541 break 7542 } 7543 off2 := v_0.AuxInt 7544 ptr := v_0.Args[0] 7545 mem := v.Args[1] 7546 v.reset(OpARMMOVDload) 7547 v.AuxInt = off1 - off2 7548 v.Aux = sym 7549 v.AddArg(ptr) 7550 v.AddArg(mem) 7551 return true 7552 } 7553 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7554 // cond: canMergeSym(sym1,sym2) 7555 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7556 for { 7557 off1 := v.AuxInt 7558 sym1 := v.Aux 7559 _ = v.Args[1] 7560 v_0 := v.Args[0] 7561 if v_0.Op != OpARMMOVWaddr { 7562 break 7563 } 7564 off2 := v_0.AuxInt 7565 sym2 := v_0.Aux 7566 ptr := v_0.Args[0] 7567 mem := v.Args[1] 7568 if !(canMergeSym(sym1, sym2)) { 7569 break 7570 } 7571 v.reset(OpARMMOVDload) 7572 v.AuxInt = off1 + off2 7573 v.Aux = mergeSym(sym1, sym2) 7574 v.AddArg(ptr) 7575 v.AddArg(mem) 7576 return true 7577 } 7578 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 7579 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7580 // result: x 7581 for { 7582 off := v.AuxInt 7583 sym := v.Aux 7584 _ = v.Args[1] 7585 ptr := v.Args[0] 7586 v_1 := v.Args[1] 7587 if v_1.Op != OpARMMOVDstore { 7588 break 7589 } 7590 off2 := v_1.AuxInt 7591 sym2 := v_1.Aux 7592 _ = v_1.Args[2] 7593 ptr2 := v_1.Args[0] 7594 x := v_1.Args[1] 7595 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7596 break 7597 } 7598 v.reset(OpCopy) 7599 v.Type = x.Type 7600 v.AddArg(x) 7601 return true 7602 } 7603 return false 7604 } 7605 func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { 7606 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7607 // cond: 7608 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 7609 for { 7610 off1 := v.AuxInt 7611 sym := v.Aux 7612 _ = v.Args[2] 7613 v_0 := v.Args[0] 7614 if v_0.Op != OpARMADDconst { 7615 break 7616 } 7617 off2 := v_0.AuxInt 7618 ptr := v_0.Args[0] 7619 val := v.Args[1] 7620 mem := v.Args[2] 7621 v.reset(OpARMMOVDstore) 7622 v.AuxInt = off1 + off2 7623 v.Aux = sym 7624 v.AddArg(ptr) 7625 v.AddArg(val) 7626 v.AddArg(mem) 7627 return true 7628 } 7629 // match: (MOVDstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7630 // cond: 7631 // result: (MOVDstore [off1-off2] {sym} ptr val mem) 7632 for { 7633 off1 := v.AuxInt 7634 sym := v.Aux 7635 _ = v.Args[2] 7636 v_0 := v.Args[0] 7637 if v_0.Op != OpARMSUBconst { 7638 break 7639 } 7640 off2 := v_0.AuxInt 7641 ptr := v_0.Args[0] 7642 val := v.Args[1] 7643 mem := v.Args[2] 7644 v.reset(OpARMMOVDstore) 7645 v.AuxInt = off1 - off2 7646 v.Aux = sym 7647 v.AddArg(ptr) 7648 v.AddArg(val) 7649 v.AddArg(mem) 7650 return true 7651 } 7652 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7653 // cond: canMergeSym(sym1,sym2) 7654 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7655 for { 7656 off1 := v.AuxInt 7657 sym1 := v.Aux 7658 _ = v.Args[2] 7659 v_0 := v.Args[0] 7660 if v_0.Op != OpARMMOVWaddr { 7661 break 7662 } 7663 off2 := v_0.AuxInt 7664 sym2 := v_0.Aux 7665 ptr := v_0.Args[0] 7666 val := v.Args[1] 7667 mem := v.Args[2] 7668 if !(canMergeSym(sym1, sym2)) { 7669 break 7670 } 7671 v.reset(OpARMMOVDstore) 7672 v.AuxInt = off1 + off2 7673 v.Aux = mergeSym(sym1, sym2) 7674 v.AddArg(ptr) 7675 v.AddArg(val) 7676 v.AddArg(mem) 7677 return true 7678 } 7679 return false 7680 } 7681 func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { 7682 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 7683 // cond: 7684 // result: (MOVFload [off1+off2] {sym} ptr mem) 7685 for { 7686 off1 := v.AuxInt 7687 sym := v.Aux 7688 _ = v.Args[1] 7689 v_0 := v.Args[0] 7690 if v_0.Op != OpARMADDconst { 7691 break 7692 } 7693 off2 := v_0.AuxInt 7694 ptr := v_0.Args[0] 7695 mem := v.Args[1] 7696 v.reset(OpARMMOVFload) 7697 v.AuxInt = off1 + off2 7698 v.Aux = sym 7699 v.AddArg(ptr) 7700 v.AddArg(mem) 7701 return true 7702 } 7703 // match: (MOVFload [off1] {sym} (SUBconst [off2] ptr) mem) 7704 // cond: 7705 // result: (MOVFload [off1-off2] {sym} ptr mem) 7706 for { 7707 off1 := v.AuxInt 7708 sym := v.Aux 7709 _ = v.Args[1] 7710 v_0 := v.Args[0] 7711 if v_0.Op != OpARMSUBconst { 7712 break 7713 } 7714 off2 := v_0.AuxInt 7715 ptr := v_0.Args[0] 7716 mem := v.Args[1] 7717 v.reset(OpARMMOVFload) 7718 v.AuxInt = off1 - off2 7719 v.Aux = sym 7720 v.AddArg(ptr) 7721 v.AddArg(mem) 7722 return true 7723 } 7724 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7725 // cond: canMergeSym(sym1,sym2) 7726 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7727 for { 7728 off1 := v.AuxInt 7729 sym1 := v.Aux 7730 _ = v.Args[1] 7731 v_0 := v.Args[0] 7732 if v_0.Op != OpARMMOVWaddr { 7733 break 7734 } 7735 off2 := v_0.AuxInt 7736 sym2 := v_0.Aux 7737 ptr := v_0.Args[0] 7738 mem := v.Args[1] 7739 if !(canMergeSym(sym1, sym2)) { 7740 break 7741 } 7742 v.reset(OpARMMOVFload) 7743 v.AuxInt = off1 + off2 7744 v.Aux = mergeSym(sym1, sym2) 7745 v.AddArg(ptr) 7746 v.AddArg(mem) 7747 return true 7748 } 7749 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 7750 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7751 // result: x 7752 for { 7753 off := v.AuxInt 7754 sym := v.Aux 7755 _ = v.Args[1] 7756 ptr := v.Args[0] 7757 v_1 := v.Args[1] 7758 if v_1.Op != OpARMMOVFstore { 7759 break 7760 } 7761 off2 := v_1.AuxInt 7762 sym2 := v_1.Aux 7763 _ = v_1.Args[2] 7764 ptr2 := v_1.Args[0] 7765 x := v_1.Args[1] 7766 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7767 break 7768 } 7769 v.reset(OpCopy) 7770 v.Type = x.Type 7771 v.AddArg(x) 7772 return true 7773 } 7774 return false 7775 } 7776 func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { 7777 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7778 // cond: 7779 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 7780 for { 7781 off1 := v.AuxInt 7782 sym := v.Aux 7783 _ = v.Args[2] 7784 v_0 := v.Args[0] 7785 if v_0.Op != OpARMADDconst { 7786 break 7787 } 7788 off2 := v_0.AuxInt 7789 ptr := v_0.Args[0] 7790 val := v.Args[1] 7791 mem := v.Args[2] 7792 v.reset(OpARMMOVFstore) 7793 v.AuxInt = off1 + off2 7794 v.Aux = sym 7795 v.AddArg(ptr) 7796 v.AddArg(val) 7797 v.AddArg(mem) 7798 return true 7799 } 7800 // match: (MOVFstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7801 // cond: 7802 // result: (MOVFstore [off1-off2] {sym} ptr val mem) 7803 for { 7804 off1 := v.AuxInt 7805 sym := v.Aux 7806 _ = v.Args[2] 7807 v_0 := v.Args[0] 7808 if v_0.Op != OpARMSUBconst { 7809 break 7810 } 7811 off2 := v_0.AuxInt 7812 ptr := v_0.Args[0] 7813 val := v.Args[1] 7814 mem := v.Args[2] 7815 v.reset(OpARMMOVFstore) 7816 v.AuxInt = off1 - off2 7817 v.Aux = sym 7818 v.AddArg(ptr) 7819 v.AddArg(val) 7820 v.AddArg(mem) 7821 return true 7822 } 7823 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7824 // cond: canMergeSym(sym1,sym2) 7825 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7826 for { 7827 off1 := v.AuxInt 7828 sym1 := v.Aux 7829 _ = v.Args[2] 7830 v_0 := v.Args[0] 7831 if v_0.Op != OpARMMOVWaddr { 7832 break 7833 } 7834 off2 := v_0.AuxInt 7835 sym2 := v_0.Aux 7836 ptr := v_0.Args[0] 7837 val := v.Args[1] 7838 mem := v.Args[2] 7839 if !(canMergeSym(sym1, sym2)) { 7840 break 7841 } 7842 v.reset(OpARMMOVFstore) 7843 v.AuxInt = off1 + off2 7844 v.Aux = mergeSym(sym1, sym2) 7845 v.AddArg(ptr) 7846 v.AddArg(val) 7847 v.AddArg(mem) 7848 return true 7849 } 7850 return false 7851 } 7852 func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { 7853 b := v.Block 7854 _ = b 7855 config := b.Func.Config 7856 _ = config 7857 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 7858 // cond: 7859 // result: (MOVHUload [off1+off2] {sym} ptr mem) 7860 for { 7861 off1 := v.AuxInt 7862 sym := v.Aux 7863 _ = v.Args[1] 7864 v_0 := v.Args[0] 7865 if v_0.Op != OpARMADDconst { 7866 break 7867 } 7868 off2 := v_0.AuxInt 7869 ptr := v_0.Args[0] 7870 mem := v.Args[1] 7871 v.reset(OpARMMOVHUload) 7872 v.AuxInt = off1 + off2 7873 v.Aux = sym 7874 v.AddArg(ptr) 7875 v.AddArg(mem) 7876 return true 7877 } 7878 // match: (MOVHUload [off1] {sym} (SUBconst [off2] ptr) mem) 7879 // cond: 7880 // result: (MOVHUload [off1-off2] {sym} ptr mem) 7881 for { 7882 off1 := v.AuxInt 7883 sym := v.Aux 7884 _ = v.Args[1] 7885 v_0 := v.Args[0] 7886 if v_0.Op != OpARMSUBconst { 7887 break 7888 } 7889 off2 := v_0.AuxInt 7890 ptr := v_0.Args[0] 7891 mem := v.Args[1] 7892 v.reset(OpARMMOVHUload) 7893 v.AuxInt = off1 - off2 7894 v.Aux = sym 7895 v.AddArg(ptr) 7896 v.AddArg(mem) 7897 return true 7898 } 7899 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7900 // cond: canMergeSym(sym1,sym2) 7901 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7902 for { 7903 off1 := v.AuxInt 7904 sym1 := v.Aux 7905 _ = v.Args[1] 7906 v_0 := v.Args[0] 7907 if v_0.Op != OpARMMOVWaddr { 7908 break 7909 } 7910 off2 := v_0.AuxInt 7911 sym2 := v_0.Aux 7912 ptr := v_0.Args[0] 7913 mem := v.Args[1] 7914 if !(canMergeSym(sym1, sym2)) { 7915 break 7916 } 7917 v.reset(OpARMMOVHUload) 7918 v.AuxInt = off1 + off2 7919 v.Aux = mergeSym(sym1, sym2) 7920 v.AddArg(ptr) 7921 v.AddArg(mem) 7922 return true 7923 } 7924 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 7925 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7926 // result: (MOVHUreg x) 7927 for { 7928 off := v.AuxInt 7929 sym := v.Aux 7930 _ = v.Args[1] 7931 ptr := v.Args[0] 7932 v_1 := v.Args[1] 7933 if v_1.Op != OpARMMOVHstore { 7934 break 7935 } 7936 off2 := v_1.AuxInt 7937 sym2 := v_1.Aux 7938 _ = v_1.Args[2] 7939 ptr2 := v_1.Args[0] 7940 x := v_1.Args[1] 7941 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7942 break 7943 } 7944 v.reset(OpARMMOVHUreg) 7945 v.AddArg(x) 7946 return true 7947 } 7948 // match: (MOVHUload [0] {sym} (ADD ptr idx) mem) 7949 // cond: sym == nil && !config.nacl 7950 // result: (MOVHUloadidx ptr idx mem) 7951 for { 7952 if v.AuxInt != 0 { 7953 break 7954 } 7955 sym := v.Aux 7956 _ = v.Args[1] 7957 v_0 := v.Args[0] 7958 if v_0.Op != OpARMADD { 7959 break 7960 } 7961 _ = v_0.Args[1] 7962 ptr := v_0.Args[0] 7963 idx := v_0.Args[1] 7964 mem := v.Args[1] 7965 if !(sym == nil && !config.nacl) { 7966 break 7967 } 7968 v.reset(OpARMMOVHUloadidx) 7969 v.AddArg(ptr) 7970 v.AddArg(idx) 7971 v.AddArg(mem) 7972 return true 7973 } 7974 // match: (MOVHUload [off] {sym} (SB) _) 7975 // cond: symIsRO(sym) 7976 // result: (MOVWconst [int64(read16(sym, off, config.BigEndian))]) 7977 for { 7978 off := v.AuxInt 7979 sym := v.Aux 7980 _ = v.Args[1] 7981 v_0 := v.Args[0] 7982 if v_0.Op != OpSB { 7983 break 7984 } 7985 if !(symIsRO(sym)) { 7986 break 7987 } 7988 v.reset(OpARMMOVWconst) 7989 v.AuxInt = int64(read16(sym, off, config.BigEndian)) 7990 return true 7991 } 7992 return false 7993 } 7994 func rewriteValueARM_OpARMMOVHUloadidx_0(v *Value) bool { 7995 // match: (MOVHUloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 7996 // cond: isSamePtr(ptr, ptr2) 7997 // result: (MOVHUreg x) 7998 for { 7999 _ = v.Args[2] 8000 ptr := v.Args[0] 8001 idx := v.Args[1] 8002 v_2 := v.Args[2] 8003 if v_2.Op != OpARMMOVHstoreidx { 8004 break 8005 } 8006 _ = v_2.Args[3] 8007 ptr2 := v_2.Args[0] 8008 if idx != v_2.Args[1] { 8009 break 8010 } 8011 x := v_2.Args[2] 8012 if !(isSamePtr(ptr, ptr2)) { 8013 break 8014 } 8015 v.reset(OpARMMOVHUreg) 8016 v.AddArg(x) 8017 return true 8018 } 8019 // match: (MOVHUloadidx ptr (MOVWconst [c]) mem) 8020 // cond: 8021 // result: (MOVHUload [c] ptr mem) 8022 for { 8023 _ = v.Args[2] 8024 ptr := v.Args[0] 8025 v_1 := v.Args[1] 8026 if v_1.Op != OpARMMOVWconst { 8027 break 8028 } 8029 c := v_1.AuxInt 8030 mem := v.Args[2] 8031 v.reset(OpARMMOVHUload) 8032 v.AuxInt = c 8033 v.AddArg(ptr) 8034 v.AddArg(mem) 8035 return true 8036 } 8037 // match: (MOVHUloadidx (MOVWconst [c]) ptr mem) 8038 // cond: 8039 // result: (MOVHUload [c] ptr mem) 8040 for { 8041 _ = v.Args[2] 8042 v_0 := v.Args[0] 8043 if v_0.Op != OpARMMOVWconst { 8044 break 8045 } 8046 c := v_0.AuxInt 8047 ptr := v.Args[1] 8048 mem := v.Args[2] 8049 v.reset(OpARMMOVHUload) 8050 v.AuxInt = c 8051 v.AddArg(ptr) 8052 v.AddArg(mem) 8053 return true 8054 } 8055 return false 8056 } 8057 func rewriteValueARM_OpARMMOVHUreg_0(v *Value) bool { 8058 // match: (MOVHUreg x:(MOVBUload _ _)) 8059 // cond: 8060 // result: (MOVWreg x) 8061 for { 8062 x := v.Args[0] 8063 if x.Op != OpARMMOVBUload { 8064 break 8065 } 8066 _ = x.Args[1] 8067 v.reset(OpARMMOVWreg) 8068 v.AddArg(x) 8069 return true 8070 } 8071 // match: (MOVHUreg x:(MOVHUload _ _)) 8072 // cond: 8073 // result: (MOVWreg x) 8074 for { 8075 x := v.Args[0] 8076 if x.Op != OpARMMOVHUload { 8077 break 8078 } 8079 _ = x.Args[1] 8080 v.reset(OpARMMOVWreg) 8081 v.AddArg(x) 8082 return true 8083 } 8084 // match: (MOVHUreg (ANDconst [c] x)) 8085 // cond: 8086 // result: (ANDconst [c&0xffff] x) 8087 for { 8088 v_0 := v.Args[0] 8089 if v_0.Op != OpARMANDconst { 8090 break 8091 } 8092 c := v_0.AuxInt 8093 x := v_0.Args[0] 8094 v.reset(OpARMANDconst) 8095 v.AuxInt = c & 0xffff 8096 v.AddArg(x) 8097 return true 8098 } 8099 // match: (MOVHUreg x:(MOVBUreg _)) 8100 // cond: 8101 // result: (MOVWreg x) 8102 for { 8103 x := v.Args[0] 8104 if x.Op != OpARMMOVBUreg { 8105 break 8106 } 8107 v.reset(OpARMMOVWreg) 8108 v.AddArg(x) 8109 return true 8110 } 8111 // match: (MOVHUreg x:(MOVHUreg _)) 8112 // cond: 8113 // result: (MOVWreg x) 8114 for { 8115 x := v.Args[0] 8116 if x.Op != OpARMMOVHUreg { 8117 break 8118 } 8119 v.reset(OpARMMOVWreg) 8120 v.AddArg(x) 8121 return true 8122 } 8123 // match: (MOVHUreg (MOVWconst [c])) 8124 // cond: 8125 // result: (MOVWconst [int64(uint16(c))]) 8126 for { 8127 v_0 := v.Args[0] 8128 if v_0.Op != OpARMMOVWconst { 8129 break 8130 } 8131 c := v_0.AuxInt 8132 v.reset(OpARMMOVWconst) 8133 v.AuxInt = int64(uint16(c)) 8134 return true 8135 } 8136 return false 8137 } 8138 func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { 8139 b := v.Block 8140 _ = b 8141 config := b.Func.Config 8142 _ = config 8143 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 8144 // cond: 8145 // result: (MOVHload [off1+off2] {sym} ptr mem) 8146 for { 8147 off1 := v.AuxInt 8148 sym := v.Aux 8149 _ = v.Args[1] 8150 v_0 := v.Args[0] 8151 if v_0.Op != OpARMADDconst { 8152 break 8153 } 8154 off2 := v_0.AuxInt 8155 ptr := v_0.Args[0] 8156 mem := v.Args[1] 8157 v.reset(OpARMMOVHload) 8158 v.AuxInt = off1 + off2 8159 v.Aux = sym 8160 v.AddArg(ptr) 8161 v.AddArg(mem) 8162 return true 8163 } 8164 // match: (MOVHload [off1] {sym} (SUBconst [off2] ptr) mem) 8165 // cond: 8166 // result: (MOVHload [off1-off2] {sym} ptr mem) 8167 for { 8168 off1 := v.AuxInt 8169 sym := v.Aux 8170 _ = v.Args[1] 8171 v_0 := v.Args[0] 8172 if v_0.Op != OpARMSUBconst { 8173 break 8174 } 8175 off2 := v_0.AuxInt 8176 ptr := v_0.Args[0] 8177 mem := v.Args[1] 8178 v.reset(OpARMMOVHload) 8179 v.AuxInt = off1 - off2 8180 v.Aux = sym 8181 v.AddArg(ptr) 8182 v.AddArg(mem) 8183 return true 8184 } 8185 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 8186 // cond: canMergeSym(sym1,sym2) 8187 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 8188 for { 8189 off1 := v.AuxInt 8190 sym1 := v.Aux 8191 _ = v.Args[1] 8192 v_0 := v.Args[0] 8193 if v_0.Op != OpARMMOVWaddr { 8194 break 8195 } 8196 off2 := v_0.AuxInt 8197 sym2 := v_0.Aux 8198 ptr := v_0.Args[0] 8199 mem := v.Args[1] 8200 if !(canMergeSym(sym1, sym2)) { 8201 break 8202 } 8203 v.reset(OpARMMOVHload) 8204 v.AuxInt = off1 + off2 8205 v.Aux = mergeSym(sym1, sym2) 8206 v.AddArg(ptr) 8207 v.AddArg(mem) 8208 return true 8209 } 8210 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 8211 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8212 // result: (MOVHreg x) 8213 for { 8214 off := v.AuxInt 8215 sym := v.Aux 8216 _ = v.Args[1] 8217 ptr := v.Args[0] 8218 v_1 := v.Args[1] 8219 if v_1.Op != OpARMMOVHstore { 8220 break 8221 } 8222 off2 := v_1.AuxInt 8223 sym2 := v_1.Aux 8224 _ = v_1.Args[2] 8225 ptr2 := v_1.Args[0] 8226 x := v_1.Args[1] 8227 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8228 break 8229 } 8230 v.reset(OpARMMOVHreg) 8231 v.AddArg(x) 8232 return true 8233 } 8234 // match: (MOVHload [0] {sym} (ADD ptr idx) mem) 8235 // cond: sym == nil && !config.nacl 8236 // result: (MOVHloadidx ptr idx mem) 8237 for { 8238 if v.AuxInt != 0 { 8239 break 8240 } 8241 sym := v.Aux 8242 _ = v.Args[1] 8243 v_0 := v.Args[0] 8244 if v_0.Op != OpARMADD { 8245 break 8246 } 8247 _ = v_0.Args[1] 8248 ptr := v_0.Args[0] 8249 idx := v_0.Args[1] 8250 mem := v.Args[1] 8251 if !(sym == nil && !config.nacl) { 8252 break 8253 } 8254 v.reset(OpARMMOVHloadidx) 8255 v.AddArg(ptr) 8256 v.AddArg(idx) 8257 v.AddArg(mem) 8258 return true 8259 } 8260 return false 8261 } 8262 func rewriteValueARM_OpARMMOVHloadidx_0(v *Value) bool { 8263 // match: (MOVHloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 8264 // cond: isSamePtr(ptr, ptr2) 8265 // result: (MOVHreg x) 8266 for { 8267 _ = v.Args[2] 8268 ptr := v.Args[0] 8269 idx := v.Args[1] 8270 v_2 := v.Args[2] 8271 if v_2.Op != OpARMMOVHstoreidx { 8272 break 8273 } 8274 _ = v_2.Args[3] 8275 ptr2 := v_2.Args[0] 8276 if idx != v_2.Args[1] { 8277 break 8278 } 8279 x := v_2.Args[2] 8280 if !(isSamePtr(ptr, ptr2)) { 8281 break 8282 } 8283 v.reset(OpARMMOVHreg) 8284 v.AddArg(x) 8285 return true 8286 } 8287 // match: (MOVHloadidx ptr (MOVWconst [c]) mem) 8288 // cond: 8289 // result: (MOVHload [c] ptr mem) 8290 for { 8291 _ = v.Args[2] 8292 ptr := v.Args[0] 8293 v_1 := v.Args[1] 8294 if v_1.Op != OpARMMOVWconst { 8295 break 8296 } 8297 c := v_1.AuxInt 8298 mem := v.Args[2] 8299 v.reset(OpARMMOVHload) 8300 v.AuxInt = c 8301 v.AddArg(ptr) 8302 v.AddArg(mem) 8303 return true 8304 } 8305 // match: (MOVHloadidx (MOVWconst [c]) ptr mem) 8306 // cond: 8307 // result: (MOVHload [c] ptr mem) 8308 for { 8309 _ = v.Args[2] 8310 v_0 := v.Args[0] 8311 if v_0.Op != OpARMMOVWconst { 8312 break 8313 } 8314 c := v_0.AuxInt 8315 ptr := v.Args[1] 8316 mem := v.Args[2] 8317 v.reset(OpARMMOVHload) 8318 v.AuxInt = c 8319 v.AddArg(ptr) 8320 v.AddArg(mem) 8321 return true 8322 } 8323 return false 8324 } 8325 func rewriteValueARM_OpARMMOVHreg_0(v *Value) bool { 8326 // match: (MOVHreg x:(MOVBload _ _)) 8327 // cond: 8328 // result: (MOVWreg x) 8329 for { 8330 x := v.Args[0] 8331 if x.Op != OpARMMOVBload { 8332 break 8333 } 8334 _ = x.Args[1] 8335 v.reset(OpARMMOVWreg) 8336 v.AddArg(x) 8337 return true 8338 } 8339 // match: (MOVHreg x:(MOVBUload _ _)) 8340 // cond: 8341 // result: (MOVWreg x) 8342 for { 8343 x := v.Args[0] 8344 if x.Op != OpARMMOVBUload { 8345 break 8346 } 8347 _ = x.Args[1] 8348 v.reset(OpARMMOVWreg) 8349 v.AddArg(x) 8350 return true 8351 } 8352 // match: (MOVHreg x:(MOVHload _ _)) 8353 // cond: 8354 // result: (MOVWreg x) 8355 for { 8356 x := v.Args[0] 8357 if x.Op != OpARMMOVHload { 8358 break 8359 } 8360 _ = x.Args[1] 8361 v.reset(OpARMMOVWreg) 8362 v.AddArg(x) 8363 return true 8364 } 8365 // match: (MOVHreg (ANDconst [c] x)) 8366 // cond: c & 0x8000 == 0 8367 // result: (ANDconst [c&0x7fff] x) 8368 for { 8369 v_0 := v.Args[0] 8370 if v_0.Op != OpARMANDconst { 8371 break 8372 } 8373 c := v_0.AuxInt 8374 x := v_0.Args[0] 8375 if !(c&0x8000 == 0) { 8376 break 8377 } 8378 v.reset(OpARMANDconst) 8379 v.AuxInt = c & 0x7fff 8380 v.AddArg(x) 8381 return true 8382 } 8383 // match: (MOVHreg x:(MOVBreg _)) 8384 // cond: 8385 // result: (MOVWreg x) 8386 for { 8387 x := v.Args[0] 8388 if x.Op != OpARMMOVBreg { 8389 break 8390 } 8391 v.reset(OpARMMOVWreg) 8392 v.AddArg(x) 8393 return true 8394 } 8395 // match: (MOVHreg x:(MOVBUreg _)) 8396 // cond: 8397 // result: (MOVWreg x) 8398 for { 8399 x := v.Args[0] 8400 if x.Op != OpARMMOVBUreg { 8401 break 8402 } 8403 v.reset(OpARMMOVWreg) 8404 v.AddArg(x) 8405 return true 8406 } 8407 // match: (MOVHreg x:(MOVHreg _)) 8408 // cond: 8409 // result: (MOVWreg x) 8410 for { 8411 x := v.Args[0] 8412 if x.Op != OpARMMOVHreg { 8413 break 8414 } 8415 v.reset(OpARMMOVWreg) 8416 v.AddArg(x) 8417 return true 8418 } 8419 // match: (MOVHreg (MOVWconst [c])) 8420 // cond: 8421 // result: (MOVWconst [int64(int16(c))]) 8422 for { 8423 v_0 := v.Args[0] 8424 if v_0.Op != OpARMMOVWconst { 8425 break 8426 } 8427 c := v_0.AuxInt 8428 v.reset(OpARMMOVWconst) 8429 v.AuxInt = int64(int16(c)) 8430 return true 8431 } 8432 return false 8433 } 8434 func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { 8435 b := v.Block 8436 _ = b 8437 config := b.Func.Config 8438 _ = config 8439 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8440 // cond: 8441 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 8442 for { 8443 off1 := v.AuxInt 8444 sym := v.Aux 8445 _ = v.Args[2] 8446 v_0 := v.Args[0] 8447 if v_0.Op != OpARMADDconst { 8448 break 8449 } 8450 off2 := v_0.AuxInt 8451 ptr := v_0.Args[0] 8452 val := v.Args[1] 8453 mem := v.Args[2] 8454 v.reset(OpARMMOVHstore) 8455 v.AuxInt = off1 + off2 8456 v.Aux = sym 8457 v.AddArg(ptr) 8458 v.AddArg(val) 8459 v.AddArg(mem) 8460 return true 8461 } 8462 // match: (MOVHstore [off1] {sym} (SUBconst [off2] ptr) val mem) 8463 // cond: 8464 // result: (MOVHstore [off1-off2] {sym} ptr val mem) 8465 for { 8466 off1 := v.AuxInt 8467 sym := v.Aux 8468 _ = v.Args[2] 8469 v_0 := v.Args[0] 8470 if v_0.Op != OpARMSUBconst { 8471 break 8472 } 8473 off2 := v_0.AuxInt 8474 ptr := v_0.Args[0] 8475 val := v.Args[1] 8476 mem := v.Args[2] 8477 v.reset(OpARMMOVHstore) 8478 v.AuxInt = off1 - off2 8479 v.Aux = sym 8480 v.AddArg(ptr) 8481 v.AddArg(val) 8482 v.AddArg(mem) 8483 return true 8484 } 8485 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 8486 // cond: canMergeSym(sym1,sym2) 8487 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 8488 for { 8489 off1 := v.AuxInt 8490 sym1 := v.Aux 8491 _ = v.Args[2] 8492 v_0 := v.Args[0] 8493 if v_0.Op != OpARMMOVWaddr { 8494 break 8495 } 8496 off2 := v_0.AuxInt 8497 sym2 := v_0.Aux 8498 ptr := v_0.Args[0] 8499 val := v.Args[1] 8500 mem := v.Args[2] 8501 if !(canMergeSym(sym1, sym2)) { 8502 break 8503 } 8504 v.reset(OpARMMOVHstore) 8505 v.AuxInt = off1 + off2 8506 v.Aux = mergeSym(sym1, sym2) 8507 v.AddArg(ptr) 8508 v.AddArg(val) 8509 v.AddArg(mem) 8510 return true 8511 } 8512 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 8513 // cond: 8514 // result: (MOVHstore [off] {sym} ptr x mem) 8515 for { 8516 off := v.AuxInt 8517 sym := v.Aux 8518 _ = v.Args[2] 8519 ptr := v.Args[0] 8520 v_1 := v.Args[1] 8521 if v_1.Op != OpARMMOVHreg { 8522 break 8523 } 8524 x := v_1.Args[0] 8525 mem := v.Args[2] 8526 v.reset(OpARMMOVHstore) 8527 v.AuxInt = off 8528 v.Aux = sym 8529 v.AddArg(ptr) 8530 v.AddArg(x) 8531 v.AddArg(mem) 8532 return true 8533 } 8534 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 8535 // cond: 8536 // result: (MOVHstore [off] {sym} ptr x mem) 8537 for { 8538 off := v.AuxInt 8539 sym := v.Aux 8540 _ = v.Args[2] 8541 ptr := v.Args[0] 8542 v_1 := v.Args[1] 8543 if v_1.Op != OpARMMOVHUreg { 8544 break 8545 } 8546 x := v_1.Args[0] 8547 mem := v.Args[2] 8548 v.reset(OpARMMOVHstore) 8549 v.AuxInt = off 8550 v.Aux = sym 8551 v.AddArg(ptr) 8552 v.AddArg(x) 8553 v.AddArg(mem) 8554 return true 8555 } 8556 // match: (MOVHstore [0] {sym} (ADD ptr idx) val mem) 8557 // cond: sym == nil && !config.nacl 8558 // result: (MOVHstoreidx ptr idx val mem) 8559 for { 8560 if v.AuxInt != 0 { 8561 break 8562 } 8563 sym := v.Aux 8564 _ = v.Args[2] 8565 v_0 := v.Args[0] 8566 if v_0.Op != OpARMADD { 8567 break 8568 } 8569 _ = v_0.Args[1] 8570 ptr := v_0.Args[0] 8571 idx := v_0.Args[1] 8572 val := v.Args[1] 8573 mem := v.Args[2] 8574 if !(sym == nil && !config.nacl) { 8575 break 8576 } 8577 v.reset(OpARMMOVHstoreidx) 8578 v.AddArg(ptr) 8579 v.AddArg(idx) 8580 v.AddArg(val) 8581 v.AddArg(mem) 8582 return true 8583 } 8584 return false 8585 } 8586 func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { 8587 // match: (MOVHstoreidx ptr (MOVWconst [c]) val mem) 8588 // cond: 8589 // result: (MOVHstore [c] ptr val mem) 8590 for { 8591 _ = v.Args[3] 8592 ptr := v.Args[0] 8593 v_1 := v.Args[1] 8594 if v_1.Op != OpARMMOVWconst { 8595 break 8596 } 8597 c := v_1.AuxInt 8598 val := v.Args[2] 8599 mem := v.Args[3] 8600 v.reset(OpARMMOVHstore) 8601 v.AuxInt = c 8602 v.AddArg(ptr) 8603 v.AddArg(val) 8604 v.AddArg(mem) 8605 return true 8606 } 8607 // match: (MOVHstoreidx (MOVWconst [c]) ptr val mem) 8608 // cond: 8609 // result: (MOVHstore [c] ptr val mem) 8610 for { 8611 _ = v.Args[3] 8612 v_0 := v.Args[0] 8613 if v_0.Op != OpARMMOVWconst { 8614 break 8615 } 8616 c := v_0.AuxInt 8617 ptr := v.Args[1] 8618 val := v.Args[2] 8619 mem := v.Args[3] 8620 v.reset(OpARMMOVHstore) 8621 v.AuxInt = c 8622 v.AddArg(ptr) 8623 v.AddArg(val) 8624 v.AddArg(mem) 8625 return true 8626 } 8627 return false 8628 } 8629 func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { 8630 b := v.Block 8631 _ = b 8632 config := b.Func.Config 8633 _ = config 8634 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 8635 // cond: 8636 // result: (MOVWload [off1+off2] {sym} ptr mem) 8637 for { 8638 off1 := v.AuxInt 8639 sym := v.Aux 8640 _ = v.Args[1] 8641 v_0 := v.Args[0] 8642 if v_0.Op != OpARMADDconst { 8643 break 8644 } 8645 off2 := v_0.AuxInt 8646 ptr := v_0.Args[0] 8647 mem := v.Args[1] 8648 v.reset(OpARMMOVWload) 8649 v.AuxInt = off1 + off2 8650 v.Aux = sym 8651 v.AddArg(ptr) 8652 v.AddArg(mem) 8653 return true 8654 } 8655 // match: (MOVWload [off1] {sym} (SUBconst [off2] ptr) mem) 8656 // cond: 8657 // result: (MOVWload [off1-off2] {sym} ptr mem) 8658 for { 8659 off1 := v.AuxInt 8660 sym := v.Aux 8661 _ = v.Args[1] 8662 v_0 := v.Args[0] 8663 if v_0.Op != OpARMSUBconst { 8664 break 8665 } 8666 off2 := v_0.AuxInt 8667 ptr := v_0.Args[0] 8668 mem := v.Args[1] 8669 v.reset(OpARMMOVWload) 8670 v.AuxInt = off1 - off2 8671 v.Aux = sym 8672 v.AddArg(ptr) 8673 v.AddArg(mem) 8674 return true 8675 } 8676 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 8677 // cond: canMergeSym(sym1,sym2) 8678 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 8679 for { 8680 off1 := v.AuxInt 8681 sym1 := v.Aux 8682 _ = v.Args[1] 8683 v_0 := v.Args[0] 8684 if v_0.Op != OpARMMOVWaddr { 8685 break 8686 } 8687 off2 := v_0.AuxInt 8688 sym2 := v_0.Aux 8689 ptr := v_0.Args[0] 8690 mem := v.Args[1] 8691 if !(canMergeSym(sym1, sym2)) { 8692 break 8693 } 8694 v.reset(OpARMMOVWload) 8695 v.AuxInt = off1 + off2 8696 v.Aux = mergeSym(sym1, sym2) 8697 v.AddArg(ptr) 8698 v.AddArg(mem) 8699 return true 8700 } 8701 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 8702 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8703 // result: x 8704 for { 8705 off := v.AuxInt 8706 sym := v.Aux 8707 _ = v.Args[1] 8708 ptr := v.Args[0] 8709 v_1 := v.Args[1] 8710 if v_1.Op != OpARMMOVWstore { 8711 break 8712 } 8713 off2 := v_1.AuxInt 8714 sym2 := v_1.Aux 8715 _ = v_1.Args[2] 8716 ptr2 := v_1.Args[0] 8717 x := v_1.Args[1] 8718 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8719 break 8720 } 8721 v.reset(OpCopy) 8722 v.Type = x.Type 8723 v.AddArg(x) 8724 return true 8725 } 8726 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 8727 // cond: sym == nil && !config.nacl 8728 // result: (MOVWloadidx ptr idx mem) 8729 for { 8730 if v.AuxInt != 0 { 8731 break 8732 } 8733 sym := v.Aux 8734 _ = v.Args[1] 8735 v_0 := v.Args[0] 8736 if v_0.Op != OpARMADD { 8737 break 8738 } 8739 _ = v_0.Args[1] 8740 ptr := v_0.Args[0] 8741 idx := v_0.Args[1] 8742 mem := v.Args[1] 8743 if !(sym == nil && !config.nacl) { 8744 break 8745 } 8746 v.reset(OpARMMOVWloadidx) 8747 v.AddArg(ptr) 8748 v.AddArg(idx) 8749 v.AddArg(mem) 8750 return true 8751 } 8752 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 8753 // cond: sym == nil && !config.nacl 8754 // result: (MOVWloadshiftLL ptr idx [c] mem) 8755 for { 8756 if v.AuxInt != 0 { 8757 break 8758 } 8759 sym := v.Aux 8760 _ = v.Args[1] 8761 v_0 := v.Args[0] 8762 if v_0.Op != OpARMADDshiftLL { 8763 break 8764 } 8765 c := v_0.AuxInt 8766 _ = v_0.Args[1] 8767 ptr := v_0.Args[0] 8768 idx := v_0.Args[1] 8769 mem := v.Args[1] 8770 if !(sym == nil && !config.nacl) { 8771 break 8772 } 8773 v.reset(OpARMMOVWloadshiftLL) 8774 v.AuxInt = c 8775 v.AddArg(ptr) 8776 v.AddArg(idx) 8777 v.AddArg(mem) 8778 return true 8779 } 8780 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 8781 // cond: sym == nil && !config.nacl 8782 // result: (MOVWloadshiftRL ptr idx [c] mem) 8783 for { 8784 if v.AuxInt != 0 { 8785 break 8786 } 8787 sym := v.Aux 8788 _ = v.Args[1] 8789 v_0 := v.Args[0] 8790 if v_0.Op != OpARMADDshiftRL { 8791 break 8792 } 8793 c := v_0.AuxInt 8794 _ = v_0.Args[1] 8795 ptr := v_0.Args[0] 8796 idx := v_0.Args[1] 8797 mem := v.Args[1] 8798 if !(sym == nil && !config.nacl) { 8799 break 8800 } 8801 v.reset(OpARMMOVWloadshiftRL) 8802 v.AuxInt = c 8803 v.AddArg(ptr) 8804 v.AddArg(idx) 8805 v.AddArg(mem) 8806 return true 8807 } 8808 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 8809 // cond: sym == nil && !config.nacl 8810 // result: (MOVWloadshiftRA ptr idx [c] mem) 8811 for { 8812 if v.AuxInt != 0 { 8813 break 8814 } 8815 sym := v.Aux 8816 _ = v.Args[1] 8817 v_0 := v.Args[0] 8818 if v_0.Op != OpARMADDshiftRA { 8819 break 8820 } 8821 c := v_0.AuxInt 8822 _ = v_0.Args[1] 8823 ptr := v_0.Args[0] 8824 idx := v_0.Args[1] 8825 mem := v.Args[1] 8826 if !(sym == nil && !config.nacl) { 8827 break 8828 } 8829 v.reset(OpARMMOVWloadshiftRA) 8830 v.AuxInt = c 8831 v.AddArg(ptr) 8832 v.AddArg(idx) 8833 v.AddArg(mem) 8834 return true 8835 } 8836 // match: (MOVWload [off] {sym} (SB) _) 8837 // cond: symIsRO(sym) 8838 // result: (MOVWconst [int64(int32(read32(sym, off, config.BigEndian)))]) 8839 for { 8840 off := v.AuxInt 8841 sym := v.Aux 8842 _ = v.Args[1] 8843 v_0 := v.Args[0] 8844 if v_0.Op != OpSB { 8845 break 8846 } 8847 if !(symIsRO(sym)) { 8848 break 8849 } 8850 v.reset(OpARMMOVWconst) 8851 v.AuxInt = int64(int32(read32(sym, off, config.BigEndian))) 8852 return true 8853 } 8854 return false 8855 } 8856 func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { 8857 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 8858 // cond: isSamePtr(ptr, ptr2) 8859 // result: x 8860 for { 8861 _ = v.Args[2] 8862 ptr := v.Args[0] 8863 idx := v.Args[1] 8864 v_2 := v.Args[2] 8865 if v_2.Op != OpARMMOVWstoreidx { 8866 break 8867 } 8868 _ = v_2.Args[3] 8869 ptr2 := v_2.Args[0] 8870 if idx != v_2.Args[1] { 8871 break 8872 } 8873 x := v_2.Args[2] 8874 if !(isSamePtr(ptr, ptr2)) { 8875 break 8876 } 8877 v.reset(OpCopy) 8878 v.Type = x.Type 8879 v.AddArg(x) 8880 return true 8881 } 8882 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 8883 // cond: 8884 // result: (MOVWload [c] ptr mem) 8885 for { 8886 _ = v.Args[2] 8887 ptr := v.Args[0] 8888 v_1 := v.Args[1] 8889 if v_1.Op != OpARMMOVWconst { 8890 break 8891 } 8892 c := v_1.AuxInt 8893 mem := v.Args[2] 8894 v.reset(OpARMMOVWload) 8895 v.AuxInt = c 8896 v.AddArg(ptr) 8897 v.AddArg(mem) 8898 return true 8899 } 8900 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 8901 // cond: 8902 // result: (MOVWload [c] ptr mem) 8903 for { 8904 _ = v.Args[2] 8905 v_0 := v.Args[0] 8906 if v_0.Op != OpARMMOVWconst { 8907 break 8908 } 8909 c := v_0.AuxInt 8910 ptr := v.Args[1] 8911 mem := v.Args[2] 8912 v.reset(OpARMMOVWload) 8913 v.AuxInt = c 8914 v.AddArg(ptr) 8915 v.AddArg(mem) 8916 return true 8917 } 8918 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 8919 // cond: 8920 // result: (MOVWloadshiftLL ptr idx [c] mem) 8921 for { 8922 _ = v.Args[2] 8923 ptr := v.Args[0] 8924 v_1 := v.Args[1] 8925 if v_1.Op != OpARMSLLconst { 8926 break 8927 } 8928 c := v_1.AuxInt 8929 idx := v_1.Args[0] 8930 mem := v.Args[2] 8931 v.reset(OpARMMOVWloadshiftLL) 8932 v.AuxInt = c 8933 v.AddArg(ptr) 8934 v.AddArg(idx) 8935 v.AddArg(mem) 8936 return true 8937 } 8938 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 8939 // cond: 8940 // result: (MOVWloadshiftLL ptr idx [c] mem) 8941 for { 8942 _ = v.Args[2] 8943 v_0 := v.Args[0] 8944 if v_0.Op != OpARMSLLconst { 8945 break 8946 } 8947 c := v_0.AuxInt 8948 idx := v_0.Args[0] 8949 ptr := v.Args[1] 8950 mem := v.Args[2] 8951 v.reset(OpARMMOVWloadshiftLL) 8952 v.AuxInt = c 8953 v.AddArg(ptr) 8954 v.AddArg(idx) 8955 v.AddArg(mem) 8956 return true 8957 } 8958 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 8959 // cond: 8960 // result: (MOVWloadshiftRL ptr idx [c] mem) 8961 for { 8962 _ = v.Args[2] 8963 ptr := v.Args[0] 8964 v_1 := v.Args[1] 8965 if v_1.Op != OpARMSRLconst { 8966 break 8967 } 8968 c := v_1.AuxInt 8969 idx := v_1.Args[0] 8970 mem := v.Args[2] 8971 v.reset(OpARMMOVWloadshiftRL) 8972 v.AuxInt = c 8973 v.AddArg(ptr) 8974 v.AddArg(idx) 8975 v.AddArg(mem) 8976 return true 8977 } 8978 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 8979 // cond: 8980 // result: (MOVWloadshiftRL ptr idx [c] mem) 8981 for { 8982 _ = v.Args[2] 8983 v_0 := v.Args[0] 8984 if v_0.Op != OpARMSRLconst { 8985 break 8986 } 8987 c := v_0.AuxInt 8988 idx := v_0.Args[0] 8989 ptr := v.Args[1] 8990 mem := v.Args[2] 8991 v.reset(OpARMMOVWloadshiftRL) 8992 v.AuxInt = c 8993 v.AddArg(ptr) 8994 v.AddArg(idx) 8995 v.AddArg(mem) 8996 return true 8997 } 8998 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 8999 // cond: 9000 // result: (MOVWloadshiftRA ptr idx [c] mem) 9001 for { 9002 _ = v.Args[2] 9003 ptr := v.Args[0] 9004 v_1 := v.Args[1] 9005 if v_1.Op != OpARMSRAconst { 9006 break 9007 } 9008 c := v_1.AuxInt 9009 idx := v_1.Args[0] 9010 mem := v.Args[2] 9011 v.reset(OpARMMOVWloadshiftRA) 9012 v.AuxInt = c 9013 v.AddArg(ptr) 9014 v.AddArg(idx) 9015 v.AddArg(mem) 9016 return true 9017 } 9018 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 9019 // cond: 9020 // result: (MOVWloadshiftRA ptr idx [c] mem) 9021 for { 9022 _ = v.Args[2] 9023 v_0 := v.Args[0] 9024 if v_0.Op != OpARMSRAconst { 9025 break 9026 } 9027 c := v_0.AuxInt 9028 idx := v_0.Args[0] 9029 ptr := v.Args[1] 9030 mem := v.Args[2] 9031 v.reset(OpARMMOVWloadshiftRA) 9032 v.AuxInt = c 9033 v.AddArg(ptr) 9034 v.AddArg(idx) 9035 v.AddArg(mem) 9036 return true 9037 } 9038 return false 9039 } 9040 func rewriteValueARM_OpARMMOVWloadshiftLL_0(v *Value) bool { 9041 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 9042 // cond: c==d && isSamePtr(ptr, ptr2) 9043 // result: x 9044 for { 9045 c := v.AuxInt 9046 _ = v.Args[2] 9047 ptr := v.Args[0] 9048 idx := v.Args[1] 9049 v_2 := v.Args[2] 9050 if v_2.Op != OpARMMOVWstoreshiftLL { 9051 break 9052 } 9053 d := v_2.AuxInt 9054 _ = v_2.Args[3] 9055 ptr2 := v_2.Args[0] 9056 if idx != v_2.Args[1] { 9057 break 9058 } 9059 x := v_2.Args[2] 9060 if !(c == d && isSamePtr(ptr, ptr2)) { 9061 break 9062 } 9063 v.reset(OpCopy) 9064 v.Type = x.Type 9065 v.AddArg(x) 9066 return true 9067 } 9068 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 9069 // cond: 9070 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 9071 for { 9072 d := v.AuxInt 9073 _ = v.Args[2] 9074 ptr := v.Args[0] 9075 v_1 := v.Args[1] 9076 if v_1.Op != OpARMMOVWconst { 9077 break 9078 } 9079 c := v_1.AuxInt 9080 mem := v.Args[2] 9081 v.reset(OpARMMOVWload) 9082 v.AuxInt = int64(uint32(c) << uint64(d)) 9083 v.AddArg(ptr) 9084 v.AddArg(mem) 9085 return true 9086 } 9087 return false 9088 } 9089 func rewriteValueARM_OpARMMOVWloadshiftRA_0(v *Value) bool { 9090 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 9091 // cond: c==d && isSamePtr(ptr, ptr2) 9092 // result: x 9093 for { 9094 c := v.AuxInt 9095 _ = v.Args[2] 9096 ptr := v.Args[0] 9097 idx := v.Args[1] 9098 v_2 := v.Args[2] 9099 if v_2.Op != OpARMMOVWstoreshiftRA { 9100 break 9101 } 9102 d := v_2.AuxInt 9103 _ = v_2.Args[3] 9104 ptr2 := v_2.Args[0] 9105 if idx != v_2.Args[1] { 9106 break 9107 } 9108 x := v_2.Args[2] 9109 if !(c == d && isSamePtr(ptr, ptr2)) { 9110 break 9111 } 9112 v.reset(OpCopy) 9113 v.Type = x.Type 9114 v.AddArg(x) 9115 return true 9116 } 9117 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 9118 // cond: 9119 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 9120 for { 9121 d := v.AuxInt 9122 _ = v.Args[2] 9123 ptr := v.Args[0] 9124 v_1 := v.Args[1] 9125 if v_1.Op != OpARMMOVWconst { 9126 break 9127 } 9128 c := v_1.AuxInt 9129 mem := v.Args[2] 9130 v.reset(OpARMMOVWload) 9131 v.AuxInt = int64(int32(c) >> uint64(d)) 9132 v.AddArg(ptr) 9133 v.AddArg(mem) 9134 return true 9135 } 9136 return false 9137 } 9138 func rewriteValueARM_OpARMMOVWloadshiftRL_0(v *Value) bool { 9139 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 9140 // cond: c==d && isSamePtr(ptr, ptr2) 9141 // result: x 9142 for { 9143 c := v.AuxInt 9144 _ = v.Args[2] 9145 ptr := v.Args[0] 9146 idx := v.Args[1] 9147 v_2 := v.Args[2] 9148 if v_2.Op != OpARMMOVWstoreshiftRL { 9149 break 9150 } 9151 d := v_2.AuxInt 9152 _ = v_2.Args[3] 9153 ptr2 := v_2.Args[0] 9154 if idx != v_2.Args[1] { 9155 break 9156 } 9157 x := v_2.Args[2] 9158 if !(c == d && isSamePtr(ptr, ptr2)) { 9159 break 9160 } 9161 v.reset(OpCopy) 9162 v.Type = x.Type 9163 v.AddArg(x) 9164 return true 9165 } 9166 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 9167 // cond: 9168 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 9169 for { 9170 d := v.AuxInt 9171 _ = v.Args[2] 9172 ptr := v.Args[0] 9173 v_1 := v.Args[1] 9174 if v_1.Op != OpARMMOVWconst { 9175 break 9176 } 9177 c := v_1.AuxInt 9178 mem := v.Args[2] 9179 v.reset(OpARMMOVWload) 9180 v.AuxInt = int64(uint32(c) >> uint64(d)) 9181 v.AddArg(ptr) 9182 v.AddArg(mem) 9183 return true 9184 } 9185 return false 9186 } 9187 func rewriteValueARM_OpARMMOVWreg_0(v *Value) bool { 9188 // match: (MOVWreg x) 9189 // cond: x.Uses == 1 9190 // result: (MOVWnop x) 9191 for { 9192 x := v.Args[0] 9193 if !(x.Uses == 1) { 9194 break 9195 } 9196 v.reset(OpARMMOVWnop) 9197 v.AddArg(x) 9198 return true 9199 } 9200 // match: (MOVWreg (MOVWconst [c])) 9201 // cond: 9202 // result: (MOVWconst [c]) 9203 for { 9204 v_0 := v.Args[0] 9205 if v_0.Op != OpARMMOVWconst { 9206 break 9207 } 9208 c := v_0.AuxInt 9209 v.reset(OpARMMOVWconst) 9210 v.AuxInt = c 9211 return true 9212 } 9213 return false 9214 } 9215 func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { 9216 b := v.Block 9217 _ = b 9218 config := b.Func.Config 9219 _ = config 9220 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9221 // cond: 9222 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 9223 for { 9224 off1 := v.AuxInt 9225 sym := v.Aux 9226 _ = v.Args[2] 9227 v_0 := v.Args[0] 9228 if v_0.Op != OpARMADDconst { 9229 break 9230 } 9231 off2 := v_0.AuxInt 9232 ptr := v_0.Args[0] 9233 val := v.Args[1] 9234 mem := v.Args[2] 9235 v.reset(OpARMMOVWstore) 9236 v.AuxInt = off1 + off2 9237 v.Aux = sym 9238 v.AddArg(ptr) 9239 v.AddArg(val) 9240 v.AddArg(mem) 9241 return true 9242 } 9243 // match: (MOVWstore [off1] {sym} (SUBconst [off2] ptr) val mem) 9244 // cond: 9245 // result: (MOVWstore [off1-off2] {sym} ptr val mem) 9246 for { 9247 off1 := v.AuxInt 9248 sym := v.Aux 9249 _ = v.Args[2] 9250 v_0 := v.Args[0] 9251 if v_0.Op != OpARMSUBconst { 9252 break 9253 } 9254 off2 := v_0.AuxInt 9255 ptr := v_0.Args[0] 9256 val := v.Args[1] 9257 mem := v.Args[2] 9258 v.reset(OpARMMOVWstore) 9259 v.AuxInt = off1 - off2 9260 v.Aux = sym 9261 v.AddArg(ptr) 9262 v.AddArg(val) 9263 v.AddArg(mem) 9264 return true 9265 } 9266 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 9267 // cond: canMergeSym(sym1,sym2) 9268 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 9269 for { 9270 off1 := v.AuxInt 9271 sym1 := v.Aux 9272 _ = v.Args[2] 9273 v_0 := v.Args[0] 9274 if v_0.Op != OpARMMOVWaddr { 9275 break 9276 } 9277 off2 := v_0.AuxInt 9278 sym2 := v_0.Aux 9279 ptr := v_0.Args[0] 9280 val := v.Args[1] 9281 mem := v.Args[2] 9282 if !(canMergeSym(sym1, sym2)) { 9283 break 9284 } 9285 v.reset(OpARMMOVWstore) 9286 v.AuxInt = off1 + off2 9287 v.Aux = mergeSym(sym1, sym2) 9288 v.AddArg(ptr) 9289 v.AddArg(val) 9290 v.AddArg(mem) 9291 return true 9292 } 9293 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 9294 // cond: sym == nil && !config.nacl 9295 // result: (MOVWstoreidx ptr idx val mem) 9296 for { 9297 if v.AuxInt != 0 { 9298 break 9299 } 9300 sym := v.Aux 9301 _ = v.Args[2] 9302 v_0 := v.Args[0] 9303 if v_0.Op != OpARMADD { 9304 break 9305 } 9306 _ = v_0.Args[1] 9307 ptr := v_0.Args[0] 9308 idx := v_0.Args[1] 9309 val := v.Args[1] 9310 mem := v.Args[2] 9311 if !(sym == nil && !config.nacl) { 9312 break 9313 } 9314 v.reset(OpARMMOVWstoreidx) 9315 v.AddArg(ptr) 9316 v.AddArg(idx) 9317 v.AddArg(val) 9318 v.AddArg(mem) 9319 return true 9320 } 9321 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 9322 // cond: sym == nil && !config.nacl 9323 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9324 for { 9325 if v.AuxInt != 0 { 9326 break 9327 } 9328 sym := v.Aux 9329 _ = v.Args[2] 9330 v_0 := v.Args[0] 9331 if v_0.Op != OpARMADDshiftLL { 9332 break 9333 } 9334 c := v_0.AuxInt 9335 _ = v_0.Args[1] 9336 ptr := v_0.Args[0] 9337 idx := v_0.Args[1] 9338 val := v.Args[1] 9339 mem := v.Args[2] 9340 if !(sym == nil && !config.nacl) { 9341 break 9342 } 9343 v.reset(OpARMMOVWstoreshiftLL) 9344 v.AuxInt = c 9345 v.AddArg(ptr) 9346 v.AddArg(idx) 9347 v.AddArg(val) 9348 v.AddArg(mem) 9349 return true 9350 } 9351 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 9352 // cond: sym == nil && !config.nacl 9353 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9354 for { 9355 if v.AuxInt != 0 { 9356 break 9357 } 9358 sym := v.Aux 9359 _ = v.Args[2] 9360 v_0 := v.Args[0] 9361 if v_0.Op != OpARMADDshiftRL { 9362 break 9363 } 9364 c := v_0.AuxInt 9365 _ = v_0.Args[1] 9366 ptr := v_0.Args[0] 9367 idx := v_0.Args[1] 9368 val := v.Args[1] 9369 mem := v.Args[2] 9370 if !(sym == nil && !config.nacl) { 9371 break 9372 } 9373 v.reset(OpARMMOVWstoreshiftRL) 9374 v.AuxInt = c 9375 v.AddArg(ptr) 9376 v.AddArg(idx) 9377 v.AddArg(val) 9378 v.AddArg(mem) 9379 return true 9380 } 9381 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 9382 // cond: sym == nil && !config.nacl 9383 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9384 for { 9385 if v.AuxInt != 0 { 9386 break 9387 } 9388 sym := v.Aux 9389 _ = v.Args[2] 9390 v_0 := v.Args[0] 9391 if v_0.Op != OpARMADDshiftRA { 9392 break 9393 } 9394 c := v_0.AuxInt 9395 _ = v_0.Args[1] 9396 ptr := v_0.Args[0] 9397 idx := v_0.Args[1] 9398 val := v.Args[1] 9399 mem := v.Args[2] 9400 if !(sym == nil && !config.nacl) { 9401 break 9402 } 9403 v.reset(OpARMMOVWstoreshiftRA) 9404 v.AuxInt = c 9405 v.AddArg(ptr) 9406 v.AddArg(idx) 9407 v.AddArg(val) 9408 v.AddArg(mem) 9409 return true 9410 } 9411 return false 9412 } 9413 func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { 9414 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 9415 // cond: 9416 // result: (MOVWstore [c] ptr val mem) 9417 for { 9418 _ = v.Args[3] 9419 ptr := v.Args[0] 9420 v_1 := v.Args[1] 9421 if v_1.Op != OpARMMOVWconst { 9422 break 9423 } 9424 c := v_1.AuxInt 9425 val := v.Args[2] 9426 mem := v.Args[3] 9427 v.reset(OpARMMOVWstore) 9428 v.AuxInt = c 9429 v.AddArg(ptr) 9430 v.AddArg(val) 9431 v.AddArg(mem) 9432 return true 9433 } 9434 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 9435 // cond: 9436 // result: (MOVWstore [c] ptr val mem) 9437 for { 9438 _ = v.Args[3] 9439 v_0 := v.Args[0] 9440 if v_0.Op != OpARMMOVWconst { 9441 break 9442 } 9443 c := v_0.AuxInt 9444 ptr := v.Args[1] 9445 val := v.Args[2] 9446 mem := v.Args[3] 9447 v.reset(OpARMMOVWstore) 9448 v.AuxInt = c 9449 v.AddArg(ptr) 9450 v.AddArg(val) 9451 v.AddArg(mem) 9452 return true 9453 } 9454 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 9455 // cond: 9456 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9457 for { 9458 _ = v.Args[3] 9459 ptr := v.Args[0] 9460 v_1 := v.Args[1] 9461 if v_1.Op != OpARMSLLconst { 9462 break 9463 } 9464 c := v_1.AuxInt 9465 idx := v_1.Args[0] 9466 val := v.Args[2] 9467 mem := v.Args[3] 9468 v.reset(OpARMMOVWstoreshiftLL) 9469 v.AuxInt = c 9470 v.AddArg(ptr) 9471 v.AddArg(idx) 9472 v.AddArg(val) 9473 v.AddArg(mem) 9474 return true 9475 } 9476 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 9477 // cond: 9478 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9479 for { 9480 _ = v.Args[3] 9481 v_0 := v.Args[0] 9482 if v_0.Op != OpARMSLLconst { 9483 break 9484 } 9485 c := v_0.AuxInt 9486 idx := v_0.Args[0] 9487 ptr := v.Args[1] 9488 val := v.Args[2] 9489 mem := v.Args[3] 9490 v.reset(OpARMMOVWstoreshiftLL) 9491 v.AuxInt = c 9492 v.AddArg(ptr) 9493 v.AddArg(idx) 9494 v.AddArg(val) 9495 v.AddArg(mem) 9496 return true 9497 } 9498 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 9499 // cond: 9500 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9501 for { 9502 _ = v.Args[3] 9503 ptr := v.Args[0] 9504 v_1 := v.Args[1] 9505 if v_1.Op != OpARMSRLconst { 9506 break 9507 } 9508 c := v_1.AuxInt 9509 idx := v_1.Args[0] 9510 val := v.Args[2] 9511 mem := v.Args[3] 9512 v.reset(OpARMMOVWstoreshiftRL) 9513 v.AuxInt = c 9514 v.AddArg(ptr) 9515 v.AddArg(idx) 9516 v.AddArg(val) 9517 v.AddArg(mem) 9518 return true 9519 } 9520 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 9521 // cond: 9522 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9523 for { 9524 _ = v.Args[3] 9525 v_0 := v.Args[0] 9526 if v_0.Op != OpARMSRLconst { 9527 break 9528 } 9529 c := v_0.AuxInt 9530 idx := v_0.Args[0] 9531 ptr := v.Args[1] 9532 val := v.Args[2] 9533 mem := v.Args[3] 9534 v.reset(OpARMMOVWstoreshiftRL) 9535 v.AuxInt = c 9536 v.AddArg(ptr) 9537 v.AddArg(idx) 9538 v.AddArg(val) 9539 v.AddArg(mem) 9540 return true 9541 } 9542 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 9543 // cond: 9544 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9545 for { 9546 _ = v.Args[3] 9547 ptr := v.Args[0] 9548 v_1 := v.Args[1] 9549 if v_1.Op != OpARMSRAconst { 9550 break 9551 } 9552 c := v_1.AuxInt 9553 idx := v_1.Args[0] 9554 val := v.Args[2] 9555 mem := v.Args[3] 9556 v.reset(OpARMMOVWstoreshiftRA) 9557 v.AuxInt = c 9558 v.AddArg(ptr) 9559 v.AddArg(idx) 9560 v.AddArg(val) 9561 v.AddArg(mem) 9562 return true 9563 } 9564 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 9565 // cond: 9566 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9567 for { 9568 _ = v.Args[3] 9569 v_0 := v.Args[0] 9570 if v_0.Op != OpARMSRAconst { 9571 break 9572 } 9573 c := v_0.AuxInt 9574 idx := v_0.Args[0] 9575 ptr := v.Args[1] 9576 val := v.Args[2] 9577 mem := v.Args[3] 9578 v.reset(OpARMMOVWstoreshiftRA) 9579 v.AuxInt = c 9580 v.AddArg(ptr) 9581 v.AddArg(idx) 9582 v.AddArg(val) 9583 v.AddArg(mem) 9584 return true 9585 } 9586 return false 9587 } 9588 func rewriteValueARM_OpARMMOVWstoreshiftLL_0(v *Value) bool { 9589 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 9590 // cond: 9591 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 9592 for { 9593 d := v.AuxInt 9594 _ = v.Args[3] 9595 ptr := v.Args[0] 9596 v_1 := v.Args[1] 9597 if v_1.Op != OpARMMOVWconst { 9598 break 9599 } 9600 c := v_1.AuxInt 9601 val := v.Args[2] 9602 mem := v.Args[3] 9603 v.reset(OpARMMOVWstore) 9604 v.AuxInt = int64(uint32(c) << uint64(d)) 9605 v.AddArg(ptr) 9606 v.AddArg(val) 9607 v.AddArg(mem) 9608 return true 9609 } 9610 return false 9611 } 9612 func rewriteValueARM_OpARMMOVWstoreshiftRA_0(v *Value) bool { 9613 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 9614 // cond: 9615 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 9616 for { 9617 d := v.AuxInt 9618 _ = v.Args[3] 9619 ptr := v.Args[0] 9620 v_1 := v.Args[1] 9621 if v_1.Op != OpARMMOVWconst { 9622 break 9623 } 9624 c := v_1.AuxInt 9625 val := v.Args[2] 9626 mem := v.Args[3] 9627 v.reset(OpARMMOVWstore) 9628 v.AuxInt = int64(int32(c) >> uint64(d)) 9629 v.AddArg(ptr) 9630 v.AddArg(val) 9631 v.AddArg(mem) 9632 return true 9633 } 9634 return false 9635 } 9636 func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { 9637 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 9638 // cond: 9639 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 9640 for { 9641 d := v.AuxInt 9642 _ = v.Args[3] 9643 ptr := v.Args[0] 9644 v_1 := v.Args[1] 9645 if v_1.Op != OpARMMOVWconst { 9646 break 9647 } 9648 c := v_1.AuxInt 9649 val := v.Args[2] 9650 mem := v.Args[3] 9651 v.reset(OpARMMOVWstore) 9652 v.AuxInt = int64(uint32(c) >> uint64(d)) 9653 v.AddArg(ptr) 9654 v.AddArg(val) 9655 v.AddArg(mem) 9656 return true 9657 } 9658 return false 9659 } 9660 func rewriteValueARM_OpARMMUL_0(v *Value) bool { 9661 // match: (MUL x (MOVWconst [c])) 9662 // cond: int32(c) == -1 9663 // result: (RSBconst [0] x) 9664 for { 9665 _ = v.Args[1] 9666 x := v.Args[0] 9667 v_1 := v.Args[1] 9668 if v_1.Op != OpARMMOVWconst { 9669 break 9670 } 9671 c := v_1.AuxInt 9672 if !(int32(c) == -1) { 9673 break 9674 } 9675 v.reset(OpARMRSBconst) 9676 v.AuxInt = 0 9677 v.AddArg(x) 9678 return true 9679 } 9680 // match: (MUL (MOVWconst [c]) x) 9681 // cond: int32(c) == -1 9682 // result: (RSBconst [0] x) 9683 for { 9684 _ = v.Args[1] 9685 v_0 := v.Args[0] 9686 if v_0.Op != OpARMMOVWconst { 9687 break 9688 } 9689 c := v_0.AuxInt 9690 x := v.Args[1] 9691 if !(int32(c) == -1) { 9692 break 9693 } 9694 v.reset(OpARMRSBconst) 9695 v.AuxInt = 0 9696 v.AddArg(x) 9697 return true 9698 } 9699 // match: (MUL _ (MOVWconst [0])) 9700 // cond: 9701 // result: (MOVWconst [0]) 9702 for { 9703 _ = v.Args[1] 9704 v_1 := v.Args[1] 9705 if v_1.Op != OpARMMOVWconst { 9706 break 9707 } 9708 if v_1.AuxInt != 0 { 9709 break 9710 } 9711 v.reset(OpARMMOVWconst) 9712 v.AuxInt = 0 9713 return true 9714 } 9715 // match: (MUL (MOVWconst [0]) _) 9716 // cond: 9717 // result: (MOVWconst [0]) 9718 for { 9719 _ = v.Args[1] 9720 v_0 := v.Args[0] 9721 if v_0.Op != OpARMMOVWconst { 9722 break 9723 } 9724 if v_0.AuxInt != 0 { 9725 break 9726 } 9727 v.reset(OpARMMOVWconst) 9728 v.AuxInt = 0 9729 return true 9730 } 9731 // match: (MUL x (MOVWconst [1])) 9732 // cond: 9733 // result: x 9734 for { 9735 _ = v.Args[1] 9736 x := v.Args[0] 9737 v_1 := v.Args[1] 9738 if v_1.Op != OpARMMOVWconst { 9739 break 9740 } 9741 if v_1.AuxInt != 1 { 9742 break 9743 } 9744 v.reset(OpCopy) 9745 v.Type = x.Type 9746 v.AddArg(x) 9747 return true 9748 } 9749 // match: (MUL (MOVWconst [1]) x) 9750 // cond: 9751 // result: x 9752 for { 9753 _ = v.Args[1] 9754 v_0 := v.Args[0] 9755 if v_0.Op != OpARMMOVWconst { 9756 break 9757 } 9758 if v_0.AuxInt != 1 { 9759 break 9760 } 9761 x := v.Args[1] 9762 v.reset(OpCopy) 9763 v.Type = x.Type 9764 v.AddArg(x) 9765 return true 9766 } 9767 // match: (MUL x (MOVWconst [c])) 9768 // cond: isPowerOfTwo(c) 9769 // result: (SLLconst [log2(c)] x) 9770 for { 9771 _ = v.Args[1] 9772 x := v.Args[0] 9773 v_1 := v.Args[1] 9774 if v_1.Op != OpARMMOVWconst { 9775 break 9776 } 9777 c := v_1.AuxInt 9778 if !(isPowerOfTwo(c)) { 9779 break 9780 } 9781 v.reset(OpARMSLLconst) 9782 v.AuxInt = log2(c) 9783 v.AddArg(x) 9784 return true 9785 } 9786 // match: (MUL (MOVWconst [c]) x) 9787 // cond: isPowerOfTwo(c) 9788 // result: (SLLconst [log2(c)] x) 9789 for { 9790 _ = v.Args[1] 9791 v_0 := v.Args[0] 9792 if v_0.Op != OpARMMOVWconst { 9793 break 9794 } 9795 c := v_0.AuxInt 9796 x := v.Args[1] 9797 if !(isPowerOfTwo(c)) { 9798 break 9799 } 9800 v.reset(OpARMSLLconst) 9801 v.AuxInt = log2(c) 9802 v.AddArg(x) 9803 return true 9804 } 9805 // match: (MUL x (MOVWconst [c])) 9806 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9807 // result: (ADDshiftLL x x [log2(c-1)]) 9808 for { 9809 _ = v.Args[1] 9810 x := v.Args[0] 9811 v_1 := v.Args[1] 9812 if v_1.Op != OpARMMOVWconst { 9813 break 9814 } 9815 c := v_1.AuxInt 9816 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9817 break 9818 } 9819 v.reset(OpARMADDshiftLL) 9820 v.AuxInt = log2(c - 1) 9821 v.AddArg(x) 9822 v.AddArg(x) 9823 return true 9824 } 9825 // match: (MUL (MOVWconst [c]) x) 9826 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9827 // result: (ADDshiftLL x x [log2(c-1)]) 9828 for { 9829 _ = v.Args[1] 9830 v_0 := v.Args[0] 9831 if v_0.Op != OpARMMOVWconst { 9832 break 9833 } 9834 c := v_0.AuxInt 9835 x := v.Args[1] 9836 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9837 break 9838 } 9839 v.reset(OpARMADDshiftLL) 9840 v.AuxInt = log2(c - 1) 9841 v.AddArg(x) 9842 v.AddArg(x) 9843 return true 9844 } 9845 return false 9846 } 9847 func rewriteValueARM_OpARMMUL_10(v *Value) bool { 9848 b := v.Block 9849 _ = b 9850 // match: (MUL x (MOVWconst [c])) 9851 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9852 // result: (RSBshiftLL x x [log2(c+1)]) 9853 for { 9854 _ = v.Args[1] 9855 x := v.Args[0] 9856 v_1 := v.Args[1] 9857 if v_1.Op != OpARMMOVWconst { 9858 break 9859 } 9860 c := v_1.AuxInt 9861 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9862 break 9863 } 9864 v.reset(OpARMRSBshiftLL) 9865 v.AuxInt = log2(c + 1) 9866 v.AddArg(x) 9867 v.AddArg(x) 9868 return true 9869 } 9870 // match: (MUL (MOVWconst [c]) x) 9871 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9872 // result: (RSBshiftLL x x [log2(c+1)]) 9873 for { 9874 _ = v.Args[1] 9875 v_0 := v.Args[0] 9876 if v_0.Op != OpARMMOVWconst { 9877 break 9878 } 9879 c := v_0.AuxInt 9880 x := v.Args[1] 9881 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9882 break 9883 } 9884 v.reset(OpARMRSBshiftLL) 9885 v.AuxInt = log2(c + 1) 9886 v.AddArg(x) 9887 v.AddArg(x) 9888 return true 9889 } 9890 // match: (MUL x (MOVWconst [c])) 9891 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9892 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 9893 for { 9894 _ = v.Args[1] 9895 x := v.Args[0] 9896 v_1 := v.Args[1] 9897 if v_1.Op != OpARMMOVWconst { 9898 break 9899 } 9900 c := v_1.AuxInt 9901 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9902 break 9903 } 9904 v.reset(OpARMSLLconst) 9905 v.AuxInt = log2(c / 3) 9906 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9907 v0.AuxInt = 1 9908 v0.AddArg(x) 9909 v0.AddArg(x) 9910 v.AddArg(v0) 9911 return true 9912 } 9913 // match: (MUL (MOVWconst [c]) x) 9914 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9915 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 9916 for { 9917 _ = v.Args[1] 9918 v_0 := v.Args[0] 9919 if v_0.Op != OpARMMOVWconst { 9920 break 9921 } 9922 c := v_0.AuxInt 9923 x := v.Args[1] 9924 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9925 break 9926 } 9927 v.reset(OpARMSLLconst) 9928 v.AuxInt = log2(c / 3) 9929 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9930 v0.AuxInt = 1 9931 v0.AddArg(x) 9932 v0.AddArg(x) 9933 v.AddArg(v0) 9934 return true 9935 } 9936 // match: (MUL x (MOVWconst [c])) 9937 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9938 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 9939 for { 9940 _ = v.Args[1] 9941 x := v.Args[0] 9942 v_1 := v.Args[1] 9943 if v_1.Op != OpARMMOVWconst { 9944 break 9945 } 9946 c := v_1.AuxInt 9947 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9948 break 9949 } 9950 v.reset(OpARMSLLconst) 9951 v.AuxInt = log2(c / 5) 9952 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9953 v0.AuxInt = 2 9954 v0.AddArg(x) 9955 v0.AddArg(x) 9956 v.AddArg(v0) 9957 return true 9958 } 9959 // match: (MUL (MOVWconst [c]) x) 9960 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9961 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 9962 for { 9963 _ = v.Args[1] 9964 v_0 := v.Args[0] 9965 if v_0.Op != OpARMMOVWconst { 9966 break 9967 } 9968 c := v_0.AuxInt 9969 x := v.Args[1] 9970 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9971 break 9972 } 9973 v.reset(OpARMSLLconst) 9974 v.AuxInt = log2(c / 5) 9975 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9976 v0.AuxInt = 2 9977 v0.AddArg(x) 9978 v0.AddArg(x) 9979 v.AddArg(v0) 9980 return true 9981 } 9982 // match: (MUL x (MOVWconst [c])) 9983 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 9984 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 9985 for { 9986 _ = v.Args[1] 9987 x := v.Args[0] 9988 v_1 := v.Args[1] 9989 if v_1.Op != OpARMMOVWconst { 9990 break 9991 } 9992 c := v_1.AuxInt 9993 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 9994 break 9995 } 9996 v.reset(OpARMSLLconst) 9997 v.AuxInt = log2(c / 7) 9998 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9999 v0.AuxInt = 3 10000 v0.AddArg(x) 10001 v0.AddArg(x) 10002 v.AddArg(v0) 10003 return true 10004 } 10005 // match: (MUL (MOVWconst [c]) x) 10006 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10007 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 10008 for { 10009 _ = v.Args[1] 10010 v_0 := v.Args[0] 10011 if v_0.Op != OpARMMOVWconst { 10012 break 10013 } 10014 c := v_0.AuxInt 10015 x := v.Args[1] 10016 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10017 break 10018 } 10019 v.reset(OpARMSLLconst) 10020 v.AuxInt = log2(c / 7) 10021 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10022 v0.AuxInt = 3 10023 v0.AddArg(x) 10024 v0.AddArg(x) 10025 v.AddArg(v0) 10026 return true 10027 } 10028 // match: (MUL x (MOVWconst [c])) 10029 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10030 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 10031 for { 10032 _ = v.Args[1] 10033 x := v.Args[0] 10034 v_1 := v.Args[1] 10035 if v_1.Op != OpARMMOVWconst { 10036 break 10037 } 10038 c := v_1.AuxInt 10039 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10040 break 10041 } 10042 v.reset(OpARMSLLconst) 10043 v.AuxInt = log2(c / 9) 10044 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10045 v0.AuxInt = 3 10046 v0.AddArg(x) 10047 v0.AddArg(x) 10048 v.AddArg(v0) 10049 return true 10050 } 10051 // match: (MUL (MOVWconst [c]) x) 10052 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10053 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 10054 for { 10055 _ = v.Args[1] 10056 v_0 := v.Args[0] 10057 if v_0.Op != OpARMMOVWconst { 10058 break 10059 } 10060 c := v_0.AuxInt 10061 x := v.Args[1] 10062 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10063 break 10064 } 10065 v.reset(OpARMSLLconst) 10066 v.AuxInt = log2(c / 9) 10067 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10068 v0.AuxInt = 3 10069 v0.AddArg(x) 10070 v0.AddArg(x) 10071 v.AddArg(v0) 10072 return true 10073 } 10074 return false 10075 } 10076 func rewriteValueARM_OpARMMUL_20(v *Value) bool { 10077 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 10078 // cond: 10079 // result: (MOVWconst [int64(int32(c*d))]) 10080 for { 10081 _ = v.Args[1] 10082 v_0 := v.Args[0] 10083 if v_0.Op != OpARMMOVWconst { 10084 break 10085 } 10086 c := v_0.AuxInt 10087 v_1 := v.Args[1] 10088 if v_1.Op != OpARMMOVWconst { 10089 break 10090 } 10091 d := v_1.AuxInt 10092 v.reset(OpARMMOVWconst) 10093 v.AuxInt = int64(int32(c * d)) 10094 return true 10095 } 10096 // match: (MUL (MOVWconst [d]) (MOVWconst [c])) 10097 // cond: 10098 // result: (MOVWconst [int64(int32(c*d))]) 10099 for { 10100 _ = v.Args[1] 10101 v_0 := v.Args[0] 10102 if v_0.Op != OpARMMOVWconst { 10103 break 10104 } 10105 d := v_0.AuxInt 10106 v_1 := v.Args[1] 10107 if v_1.Op != OpARMMOVWconst { 10108 break 10109 } 10110 c := v_1.AuxInt 10111 v.reset(OpARMMOVWconst) 10112 v.AuxInt = int64(int32(c * d)) 10113 return true 10114 } 10115 return false 10116 } 10117 func rewriteValueARM_OpARMMULA_0(v *Value) bool { 10118 b := v.Block 10119 _ = b 10120 // match: (MULA x (MOVWconst [c]) a) 10121 // cond: int32(c) == -1 10122 // result: (SUB a x) 10123 for { 10124 _ = v.Args[2] 10125 x := v.Args[0] 10126 v_1 := v.Args[1] 10127 if v_1.Op != OpARMMOVWconst { 10128 break 10129 } 10130 c := v_1.AuxInt 10131 a := v.Args[2] 10132 if !(int32(c) == -1) { 10133 break 10134 } 10135 v.reset(OpARMSUB) 10136 v.AddArg(a) 10137 v.AddArg(x) 10138 return true 10139 } 10140 // match: (MULA _ (MOVWconst [0]) a) 10141 // cond: 10142 // result: a 10143 for { 10144 _ = v.Args[2] 10145 v_1 := v.Args[1] 10146 if v_1.Op != OpARMMOVWconst { 10147 break 10148 } 10149 if v_1.AuxInt != 0 { 10150 break 10151 } 10152 a := v.Args[2] 10153 v.reset(OpCopy) 10154 v.Type = a.Type 10155 v.AddArg(a) 10156 return true 10157 } 10158 // match: (MULA x (MOVWconst [1]) a) 10159 // cond: 10160 // result: (ADD x a) 10161 for { 10162 _ = v.Args[2] 10163 x := v.Args[0] 10164 v_1 := v.Args[1] 10165 if v_1.Op != OpARMMOVWconst { 10166 break 10167 } 10168 if v_1.AuxInt != 1 { 10169 break 10170 } 10171 a := v.Args[2] 10172 v.reset(OpARMADD) 10173 v.AddArg(x) 10174 v.AddArg(a) 10175 return true 10176 } 10177 // match: (MULA x (MOVWconst [c]) a) 10178 // cond: isPowerOfTwo(c) 10179 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 10180 for { 10181 _ = v.Args[2] 10182 x := v.Args[0] 10183 v_1 := v.Args[1] 10184 if v_1.Op != OpARMMOVWconst { 10185 break 10186 } 10187 c := v_1.AuxInt 10188 a := v.Args[2] 10189 if !(isPowerOfTwo(c)) { 10190 break 10191 } 10192 v.reset(OpARMADD) 10193 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10194 v0.AuxInt = log2(c) 10195 v0.AddArg(x) 10196 v.AddArg(v0) 10197 v.AddArg(a) 10198 return true 10199 } 10200 // match: (MULA x (MOVWconst [c]) a) 10201 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10202 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) 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 !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10213 break 10214 } 10215 v.reset(OpARMADD) 10216 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10217 v0.AuxInt = log2(c - 1) 10218 v0.AddArg(x) 10219 v0.AddArg(x) 10220 v.AddArg(v0) 10221 v.AddArg(a) 10222 return true 10223 } 10224 // match: (MULA x (MOVWconst [c]) a) 10225 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10226 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10227 for { 10228 _ = v.Args[2] 10229 x := v.Args[0] 10230 v_1 := v.Args[1] 10231 if v_1.Op != OpARMMOVWconst { 10232 break 10233 } 10234 c := v_1.AuxInt 10235 a := v.Args[2] 10236 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10237 break 10238 } 10239 v.reset(OpARMADD) 10240 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10241 v0.AuxInt = log2(c + 1) 10242 v0.AddArg(x) 10243 v0.AddArg(x) 10244 v.AddArg(v0) 10245 v.AddArg(a) 10246 return true 10247 } 10248 // match: (MULA x (MOVWconst [c]) a) 10249 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10250 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10251 for { 10252 _ = v.Args[2] 10253 x := v.Args[0] 10254 v_1 := v.Args[1] 10255 if v_1.Op != OpARMMOVWconst { 10256 break 10257 } 10258 c := v_1.AuxInt 10259 a := v.Args[2] 10260 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10261 break 10262 } 10263 v.reset(OpARMADD) 10264 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10265 v0.AuxInt = log2(c / 3) 10266 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10267 v1.AuxInt = 1 10268 v1.AddArg(x) 10269 v1.AddArg(x) 10270 v0.AddArg(v1) 10271 v.AddArg(v0) 10272 v.AddArg(a) 10273 return true 10274 } 10275 // match: (MULA x (MOVWconst [c]) a) 10276 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10277 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10278 for { 10279 _ = v.Args[2] 10280 x := v.Args[0] 10281 v_1 := v.Args[1] 10282 if v_1.Op != OpARMMOVWconst { 10283 break 10284 } 10285 c := v_1.AuxInt 10286 a := v.Args[2] 10287 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10288 break 10289 } 10290 v.reset(OpARMADD) 10291 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10292 v0.AuxInt = log2(c / 5) 10293 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10294 v1.AuxInt = 2 10295 v1.AddArg(x) 10296 v1.AddArg(x) 10297 v0.AddArg(v1) 10298 v.AddArg(v0) 10299 v.AddArg(a) 10300 return true 10301 } 10302 // match: (MULA x (MOVWconst [c]) a) 10303 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10304 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10305 for { 10306 _ = v.Args[2] 10307 x := v.Args[0] 10308 v_1 := v.Args[1] 10309 if v_1.Op != OpARMMOVWconst { 10310 break 10311 } 10312 c := v_1.AuxInt 10313 a := v.Args[2] 10314 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10315 break 10316 } 10317 v.reset(OpARMADD) 10318 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10319 v0.AuxInt = log2(c / 7) 10320 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10321 v1.AuxInt = 3 10322 v1.AddArg(x) 10323 v1.AddArg(x) 10324 v0.AddArg(v1) 10325 v.AddArg(v0) 10326 v.AddArg(a) 10327 return true 10328 } 10329 // match: (MULA x (MOVWconst [c]) a) 10330 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10331 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10332 for { 10333 _ = v.Args[2] 10334 x := v.Args[0] 10335 v_1 := v.Args[1] 10336 if v_1.Op != OpARMMOVWconst { 10337 break 10338 } 10339 c := v_1.AuxInt 10340 a := v.Args[2] 10341 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10342 break 10343 } 10344 v.reset(OpARMADD) 10345 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10346 v0.AuxInt = log2(c / 9) 10347 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10348 v1.AuxInt = 3 10349 v1.AddArg(x) 10350 v1.AddArg(x) 10351 v0.AddArg(v1) 10352 v.AddArg(v0) 10353 v.AddArg(a) 10354 return true 10355 } 10356 return false 10357 } 10358 func rewriteValueARM_OpARMMULA_10(v *Value) bool { 10359 b := v.Block 10360 _ = b 10361 // match: (MULA (MOVWconst [c]) x a) 10362 // cond: int32(c) == -1 10363 // result: (SUB a x) 10364 for { 10365 _ = v.Args[2] 10366 v_0 := v.Args[0] 10367 if v_0.Op != OpARMMOVWconst { 10368 break 10369 } 10370 c := v_0.AuxInt 10371 x := v.Args[1] 10372 a := v.Args[2] 10373 if !(int32(c) == -1) { 10374 break 10375 } 10376 v.reset(OpARMSUB) 10377 v.AddArg(a) 10378 v.AddArg(x) 10379 return true 10380 } 10381 // match: (MULA (MOVWconst [0]) _ a) 10382 // cond: 10383 // result: a 10384 for { 10385 _ = v.Args[2] 10386 v_0 := v.Args[0] 10387 if v_0.Op != OpARMMOVWconst { 10388 break 10389 } 10390 if v_0.AuxInt != 0 { 10391 break 10392 } 10393 a := v.Args[2] 10394 v.reset(OpCopy) 10395 v.Type = a.Type 10396 v.AddArg(a) 10397 return true 10398 } 10399 // match: (MULA (MOVWconst [1]) x a) 10400 // cond: 10401 // result: (ADD x a) 10402 for { 10403 _ = v.Args[2] 10404 v_0 := v.Args[0] 10405 if v_0.Op != OpARMMOVWconst { 10406 break 10407 } 10408 if v_0.AuxInt != 1 { 10409 break 10410 } 10411 x := v.Args[1] 10412 a := v.Args[2] 10413 v.reset(OpARMADD) 10414 v.AddArg(x) 10415 v.AddArg(a) 10416 return true 10417 } 10418 // match: (MULA (MOVWconst [c]) x a) 10419 // cond: isPowerOfTwo(c) 10420 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 10421 for { 10422 _ = v.Args[2] 10423 v_0 := v.Args[0] 10424 if v_0.Op != OpARMMOVWconst { 10425 break 10426 } 10427 c := v_0.AuxInt 10428 x := v.Args[1] 10429 a := v.Args[2] 10430 if !(isPowerOfTwo(c)) { 10431 break 10432 } 10433 v.reset(OpARMADD) 10434 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10435 v0.AuxInt = log2(c) 10436 v0.AddArg(x) 10437 v.AddArg(v0) 10438 v.AddArg(a) 10439 return true 10440 } 10441 // match: (MULA (MOVWconst [c]) x a) 10442 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10443 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) 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 !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10454 break 10455 } 10456 v.reset(OpARMADD) 10457 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10458 v0.AuxInt = log2(c - 1) 10459 v0.AddArg(x) 10460 v0.AddArg(x) 10461 v.AddArg(v0) 10462 v.AddArg(a) 10463 return true 10464 } 10465 // match: (MULA (MOVWconst [c]) x a) 10466 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10467 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10468 for { 10469 _ = v.Args[2] 10470 v_0 := v.Args[0] 10471 if v_0.Op != OpARMMOVWconst { 10472 break 10473 } 10474 c := v_0.AuxInt 10475 x := v.Args[1] 10476 a := v.Args[2] 10477 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10478 break 10479 } 10480 v.reset(OpARMADD) 10481 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10482 v0.AuxInt = log2(c + 1) 10483 v0.AddArg(x) 10484 v0.AddArg(x) 10485 v.AddArg(v0) 10486 v.AddArg(a) 10487 return true 10488 } 10489 // match: (MULA (MOVWconst [c]) x a) 10490 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10491 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10492 for { 10493 _ = v.Args[2] 10494 v_0 := v.Args[0] 10495 if v_0.Op != OpARMMOVWconst { 10496 break 10497 } 10498 c := v_0.AuxInt 10499 x := v.Args[1] 10500 a := v.Args[2] 10501 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10502 break 10503 } 10504 v.reset(OpARMADD) 10505 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10506 v0.AuxInt = log2(c / 3) 10507 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10508 v1.AuxInt = 1 10509 v1.AddArg(x) 10510 v1.AddArg(x) 10511 v0.AddArg(v1) 10512 v.AddArg(v0) 10513 v.AddArg(a) 10514 return true 10515 } 10516 // match: (MULA (MOVWconst [c]) x a) 10517 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10518 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10519 for { 10520 _ = v.Args[2] 10521 v_0 := v.Args[0] 10522 if v_0.Op != OpARMMOVWconst { 10523 break 10524 } 10525 c := v_0.AuxInt 10526 x := v.Args[1] 10527 a := v.Args[2] 10528 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10529 break 10530 } 10531 v.reset(OpARMADD) 10532 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10533 v0.AuxInt = log2(c / 5) 10534 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10535 v1.AuxInt = 2 10536 v1.AddArg(x) 10537 v1.AddArg(x) 10538 v0.AddArg(v1) 10539 v.AddArg(v0) 10540 v.AddArg(a) 10541 return true 10542 } 10543 // match: (MULA (MOVWconst [c]) x a) 10544 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10545 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10546 for { 10547 _ = v.Args[2] 10548 v_0 := v.Args[0] 10549 if v_0.Op != OpARMMOVWconst { 10550 break 10551 } 10552 c := v_0.AuxInt 10553 x := v.Args[1] 10554 a := v.Args[2] 10555 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10556 break 10557 } 10558 v.reset(OpARMADD) 10559 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10560 v0.AuxInt = log2(c / 7) 10561 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10562 v1.AuxInt = 3 10563 v1.AddArg(x) 10564 v1.AddArg(x) 10565 v0.AddArg(v1) 10566 v.AddArg(v0) 10567 v.AddArg(a) 10568 return true 10569 } 10570 // match: (MULA (MOVWconst [c]) x a) 10571 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10572 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10573 for { 10574 _ = v.Args[2] 10575 v_0 := v.Args[0] 10576 if v_0.Op != OpARMMOVWconst { 10577 break 10578 } 10579 c := v_0.AuxInt 10580 x := v.Args[1] 10581 a := v.Args[2] 10582 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10583 break 10584 } 10585 v.reset(OpARMADD) 10586 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10587 v0.AuxInt = log2(c / 9) 10588 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10589 v1.AuxInt = 3 10590 v1.AddArg(x) 10591 v1.AddArg(x) 10592 v0.AddArg(v1) 10593 v.AddArg(v0) 10594 v.AddArg(a) 10595 return true 10596 } 10597 return false 10598 } 10599 func rewriteValueARM_OpARMMULA_20(v *Value) bool { 10600 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 10601 // cond: 10602 // result: (ADDconst [int64(int32(c*d))] a) 10603 for { 10604 _ = v.Args[2] 10605 v_0 := v.Args[0] 10606 if v_0.Op != OpARMMOVWconst { 10607 break 10608 } 10609 c := v_0.AuxInt 10610 v_1 := v.Args[1] 10611 if v_1.Op != OpARMMOVWconst { 10612 break 10613 } 10614 d := v_1.AuxInt 10615 a := v.Args[2] 10616 v.reset(OpARMADDconst) 10617 v.AuxInt = int64(int32(c * d)) 10618 v.AddArg(a) 10619 return true 10620 } 10621 return false 10622 } 10623 func rewriteValueARM_OpARMMULD_0(v *Value) bool { 10624 // match: (MULD (NEGD x) y) 10625 // cond: objabi.GOARM >= 6 10626 // result: (NMULD x y) 10627 for { 10628 _ = v.Args[1] 10629 v_0 := v.Args[0] 10630 if v_0.Op != OpARMNEGD { 10631 break 10632 } 10633 x := v_0.Args[0] 10634 y := v.Args[1] 10635 if !(objabi.GOARM >= 6) { 10636 break 10637 } 10638 v.reset(OpARMNMULD) 10639 v.AddArg(x) 10640 v.AddArg(y) 10641 return true 10642 } 10643 // match: (MULD y (NEGD x)) 10644 // cond: objabi.GOARM >= 6 10645 // result: (NMULD x y) 10646 for { 10647 _ = v.Args[1] 10648 y := v.Args[0] 10649 v_1 := v.Args[1] 10650 if v_1.Op != OpARMNEGD { 10651 break 10652 } 10653 x := v_1.Args[0] 10654 if !(objabi.GOARM >= 6) { 10655 break 10656 } 10657 v.reset(OpARMNMULD) 10658 v.AddArg(x) 10659 v.AddArg(y) 10660 return true 10661 } 10662 return false 10663 } 10664 func rewriteValueARM_OpARMMULF_0(v *Value) bool { 10665 // match: (MULF (NEGF x) y) 10666 // cond: objabi.GOARM >= 6 10667 // result: (NMULF x y) 10668 for { 10669 _ = v.Args[1] 10670 v_0 := v.Args[0] 10671 if v_0.Op != OpARMNEGF { 10672 break 10673 } 10674 x := v_0.Args[0] 10675 y := v.Args[1] 10676 if !(objabi.GOARM >= 6) { 10677 break 10678 } 10679 v.reset(OpARMNMULF) 10680 v.AddArg(x) 10681 v.AddArg(y) 10682 return true 10683 } 10684 // match: (MULF y (NEGF x)) 10685 // cond: objabi.GOARM >= 6 10686 // result: (NMULF x y) 10687 for { 10688 _ = v.Args[1] 10689 y := v.Args[0] 10690 v_1 := v.Args[1] 10691 if v_1.Op != OpARMNEGF { 10692 break 10693 } 10694 x := v_1.Args[0] 10695 if !(objabi.GOARM >= 6) { 10696 break 10697 } 10698 v.reset(OpARMNMULF) 10699 v.AddArg(x) 10700 v.AddArg(y) 10701 return true 10702 } 10703 return false 10704 } 10705 func rewriteValueARM_OpARMMULS_0(v *Value) bool { 10706 b := v.Block 10707 _ = b 10708 // match: (MULS x (MOVWconst [c]) a) 10709 // cond: int32(c) == -1 10710 // result: (ADD a x) 10711 for { 10712 _ = v.Args[2] 10713 x := v.Args[0] 10714 v_1 := v.Args[1] 10715 if v_1.Op != OpARMMOVWconst { 10716 break 10717 } 10718 c := v_1.AuxInt 10719 a := v.Args[2] 10720 if !(int32(c) == -1) { 10721 break 10722 } 10723 v.reset(OpARMADD) 10724 v.AddArg(a) 10725 v.AddArg(x) 10726 return true 10727 } 10728 // match: (MULS _ (MOVWconst [0]) a) 10729 // cond: 10730 // result: a 10731 for { 10732 _ = v.Args[2] 10733 v_1 := v.Args[1] 10734 if v_1.Op != OpARMMOVWconst { 10735 break 10736 } 10737 if v_1.AuxInt != 0 { 10738 break 10739 } 10740 a := v.Args[2] 10741 v.reset(OpCopy) 10742 v.Type = a.Type 10743 v.AddArg(a) 10744 return true 10745 } 10746 // match: (MULS x (MOVWconst [1]) a) 10747 // cond: 10748 // result: (RSB x a) 10749 for { 10750 _ = v.Args[2] 10751 x := v.Args[0] 10752 v_1 := v.Args[1] 10753 if v_1.Op != OpARMMOVWconst { 10754 break 10755 } 10756 if v_1.AuxInt != 1 { 10757 break 10758 } 10759 a := v.Args[2] 10760 v.reset(OpARMRSB) 10761 v.AddArg(x) 10762 v.AddArg(a) 10763 return true 10764 } 10765 // match: (MULS x (MOVWconst [c]) a) 10766 // cond: isPowerOfTwo(c) 10767 // result: (RSB (SLLconst <x.Type> [log2(c)] x) a) 10768 for { 10769 _ = v.Args[2] 10770 x := v.Args[0] 10771 v_1 := v.Args[1] 10772 if v_1.Op != OpARMMOVWconst { 10773 break 10774 } 10775 c := v_1.AuxInt 10776 a := v.Args[2] 10777 if !(isPowerOfTwo(c)) { 10778 break 10779 } 10780 v.reset(OpARMRSB) 10781 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10782 v0.AuxInt = log2(c) 10783 v0.AddArg(x) 10784 v.AddArg(v0) 10785 v.AddArg(a) 10786 return true 10787 } 10788 // match: (MULS x (MOVWconst [c]) a) 10789 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10790 // result: (RSB (ADDshiftLL <x.Type> x x [log2(c-1)]) 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 !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10801 break 10802 } 10803 v.reset(OpARMRSB) 10804 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10805 v0.AuxInt = log2(c - 1) 10806 v0.AddArg(x) 10807 v0.AddArg(x) 10808 v.AddArg(v0) 10809 v.AddArg(a) 10810 return true 10811 } 10812 // match: (MULS x (MOVWconst [c]) a) 10813 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10814 // result: (RSB (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10815 for { 10816 _ = v.Args[2] 10817 x := v.Args[0] 10818 v_1 := v.Args[1] 10819 if v_1.Op != OpARMMOVWconst { 10820 break 10821 } 10822 c := v_1.AuxInt 10823 a := v.Args[2] 10824 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10825 break 10826 } 10827 v.reset(OpARMRSB) 10828 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10829 v0.AuxInt = log2(c + 1) 10830 v0.AddArg(x) 10831 v0.AddArg(x) 10832 v.AddArg(v0) 10833 v.AddArg(a) 10834 return true 10835 } 10836 // match: (MULS x (MOVWconst [c]) a) 10837 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10838 // result: (RSB (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10839 for { 10840 _ = v.Args[2] 10841 x := v.Args[0] 10842 v_1 := v.Args[1] 10843 if v_1.Op != OpARMMOVWconst { 10844 break 10845 } 10846 c := v_1.AuxInt 10847 a := v.Args[2] 10848 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10849 break 10850 } 10851 v.reset(OpARMRSB) 10852 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10853 v0.AuxInt = log2(c / 3) 10854 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10855 v1.AuxInt = 1 10856 v1.AddArg(x) 10857 v1.AddArg(x) 10858 v0.AddArg(v1) 10859 v.AddArg(v0) 10860 v.AddArg(a) 10861 return true 10862 } 10863 // match: (MULS x (MOVWconst [c]) a) 10864 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10865 // result: (RSB (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10866 for { 10867 _ = v.Args[2] 10868 x := v.Args[0] 10869 v_1 := v.Args[1] 10870 if v_1.Op != OpARMMOVWconst { 10871 break 10872 } 10873 c := v_1.AuxInt 10874 a := v.Args[2] 10875 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10876 break 10877 } 10878 v.reset(OpARMRSB) 10879 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10880 v0.AuxInt = log2(c / 5) 10881 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10882 v1.AuxInt = 2 10883 v1.AddArg(x) 10884 v1.AddArg(x) 10885 v0.AddArg(v1) 10886 v.AddArg(v0) 10887 v.AddArg(a) 10888 return true 10889 } 10890 // match: (MULS x (MOVWconst [c]) a) 10891 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10892 // result: (RSB (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10893 for { 10894 _ = v.Args[2] 10895 x := v.Args[0] 10896 v_1 := v.Args[1] 10897 if v_1.Op != OpARMMOVWconst { 10898 break 10899 } 10900 c := v_1.AuxInt 10901 a := v.Args[2] 10902 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10903 break 10904 } 10905 v.reset(OpARMRSB) 10906 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10907 v0.AuxInt = log2(c / 7) 10908 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10909 v1.AuxInt = 3 10910 v1.AddArg(x) 10911 v1.AddArg(x) 10912 v0.AddArg(v1) 10913 v.AddArg(v0) 10914 v.AddArg(a) 10915 return true 10916 } 10917 // match: (MULS x (MOVWconst [c]) a) 10918 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10919 // result: (RSB (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10920 for { 10921 _ = v.Args[2] 10922 x := v.Args[0] 10923 v_1 := v.Args[1] 10924 if v_1.Op != OpARMMOVWconst { 10925 break 10926 } 10927 c := v_1.AuxInt 10928 a := v.Args[2] 10929 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10930 break 10931 } 10932 v.reset(OpARMRSB) 10933 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10934 v0.AuxInt = log2(c / 9) 10935 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10936 v1.AuxInt = 3 10937 v1.AddArg(x) 10938 v1.AddArg(x) 10939 v0.AddArg(v1) 10940 v.AddArg(v0) 10941 v.AddArg(a) 10942 return true 10943 } 10944 return false 10945 } 10946 func rewriteValueARM_OpARMMULS_10(v *Value) bool { 10947 b := v.Block 10948 _ = b 10949 // match: (MULS (MOVWconst [c]) x a) 10950 // cond: int32(c) == -1 10951 // result: (ADD a x) 10952 for { 10953 _ = v.Args[2] 10954 v_0 := v.Args[0] 10955 if v_0.Op != OpARMMOVWconst { 10956 break 10957 } 10958 c := v_0.AuxInt 10959 x := v.Args[1] 10960 a := v.Args[2] 10961 if !(int32(c) == -1) { 10962 break 10963 } 10964 v.reset(OpARMADD) 10965 v.AddArg(a) 10966 v.AddArg(x) 10967 return true 10968 } 10969 // match: (MULS (MOVWconst [0]) _ a) 10970 // cond: 10971 // result: a 10972 for { 10973 _ = v.Args[2] 10974 v_0 := v.Args[0] 10975 if v_0.Op != OpARMMOVWconst { 10976 break 10977 } 10978 if v_0.AuxInt != 0 { 10979 break 10980 } 10981 a := v.Args[2] 10982 v.reset(OpCopy) 10983 v.Type = a.Type 10984 v.AddArg(a) 10985 return true 10986 } 10987 // match: (MULS (MOVWconst [1]) x a) 10988 // cond: 10989 // result: (RSB x a) 10990 for { 10991 _ = v.Args[2] 10992 v_0 := v.Args[0] 10993 if v_0.Op != OpARMMOVWconst { 10994 break 10995 } 10996 if v_0.AuxInt != 1 { 10997 break 10998 } 10999 x := v.Args[1] 11000 a := v.Args[2] 11001 v.reset(OpARMRSB) 11002 v.AddArg(x) 11003 v.AddArg(a) 11004 return true 11005 } 11006 // match: (MULS (MOVWconst [c]) x a) 11007 // cond: isPowerOfTwo(c) 11008 // result: (RSB (SLLconst <x.Type> [log2(c)] x) a) 11009 for { 11010 _ = v.Args[2] 11011 v_0 := v.Args[0] 11012 if v_0.Op != OpARMMOVWconst { 11013 break 11014 } 11015 c := v_0.AuxInt 11016 x := v.Args[1] 11017 a := v.Args[2] 11018 if !(isPowerOfTwo(c)) { 11019 break 11020 } 11021 v.reset(OpARMRSB) 11022 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11023 v0.AuxInt = log2(c) 11024 v0.AddArg(x) 11025 v.AddArg(v0) 11026 v.AddArg(a) 11027 return true 11028 } 11029 // match: (MULS (MOVWconst [c]) x a) 11030 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 11031 // result: (RSB (ADDshiftLL <x.Type> x x [log2(c-1)]) 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 !(isPowerOfTwo(c-1) && int32(c) >= 3) { 11042 break 11043 } 11044 v.reset(OpARMRSB) 11045 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 11046 v0.AuxInt = log2(c - 1) 11047 v0.AddArg(x) 11048 v0.AddArg(x) 11049 v.AddArg(v0) 11050 v.AddArg(a) 11051 return true 11052 } 11053 // match: (MULS (MOVWconst [c]) x a) 11054 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 11055 // result: (RSB (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 11056 for { 11057 _ = v.Args[2] 11058 v_0 := v.Args[0] 11059 if v_0.Op != OpARMMOVWconst { 11060 break 11061 } 11062 c := v_0.AuxInt 11063 x := v.Args[1] 11064 a := v.Args[2] 11065 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 11066 break 11067 } 11068 v.reset(OpARMRSB) 11069 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 11070 v0.AuxInt = log2(c + 1) 11071 v0.AddArg(x) 11072 v0.AddArg(x) 11073 v.AddArg(v0) 11074 v.AddArg(a) 11075 return true 11076 } 11077 // match: (MULS (MOVWconst [c]) x a) 11078 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 11079 // result: (RSB (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 11080 for { 11081 _ = v.Args[2] 11082 v_0 := v.Args[0] 11083 if v_0.Op != OpARMMOVWconst { 11084 break 11085 } 11086 c := v_0.AuxInt 11087 x := v.Args[1] 11088 a := v.Args[2] 11089 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 11090 break 11091 } 11092 v.reset(OpARMRSB) 11093 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11094 v0.AuxInt = log2(c / 3) 11095 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 11096 v1.AuxInt = 1 11097 v1.AddArg(x) 11098 v1.AddArg(x) 11099 v0.AddArg(v1) 11100 v.AddArg(v0) 11101 v.AddArg(a) 11102 return true 11103 } 11104 // match: (MULS (MOVWconst [c]) x a) 11105 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 11106 // result: (RSB (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 11107 for { 11108 _ = v.Args[2] 11109 v_0 := v.Args[0] 11110 if v_0.Op != OpARMMOVWconst { 11111 break 11112 } 11113 c := v_0.AuxInt 11114 x := v.Args[1] 11115 a := v.Args[2] 11116 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 11117 break 11118 } 11119 v.reset(OpARMRSB) 11120 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11121 v0.AuxInt = log2(c / 5) 11122 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 11123 v1.AuxInt = 2 11124 v1.AddArg(x) 11125 v1.AddArg(x) 11126 v0.AddArg(v1) 11127 v.AddArg(v0) 11128 v.AddArg(a) 11129 return true 11130 } 11131 // match: (MULS (MOVWconst [c]) x a) 11132 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 11133 // result: (RSB (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 11134 for { 11135 _ = v.Args[2] 11136 v_0 := v.Args[0] 11137 if v_0.Op != OpARMMOVWconst { 11138 break 11139 } 11140 c := v_0.AuxInt 11141 x := v.Args[1] 11142 a := v.Args[2] 11143 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 11144 break 11145 } 11146 v.reset(OpARMRSB) 11147 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11148 v0.AuxInt = log2(c / 7) 11149 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 11150 v1.AuxInt = 3 11151 v1.AddArg(x) 11152 v1.AddArg(x) 11153 v0.AddArg(v1) 11154 v.AddArg(v0) 11155 v.AddArg(a) 11156 return true 11157 } 11158 // match: (MULS (MOVWconst [c]) x a) 11159 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 11160 // result: (RSB (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 11161 for { 11162 _ = v.Args[2] 11163 v_0 := v.Args[0] 11164 if v_0.Op != OpARMMOVWconst { 11165 break 11166 } 11167 c := v_0.AuxInt 11168 x := v.Args[1] 11169 a := v.Args[2] 11170 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 11171 break 11172 } 11173 v.reset(OpARMRSB) 11174 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11175 v0.AuxInt = log2(c / 9) 11176 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 11177 v1.AuxInt = 3 11178 v1.AddArg(x) 11179 v1.AddArg(x) 11180 v0.AddArg(v1) 11181 v.AddArg(v0) 11182 v.AddArg(a) 11183 return true 11184 } 11185 return false 11186 } 11187 func rewriteValueARM_OpARMMULS_20(v *Value) bool { 11188 // match: (MULS (MOVWconst [c]) (MOVWconst [d]) a) 11189 // cond: 11190 // result: (SUBconst [int64(int32(c*d))] a) 11191 for { 11192 _ = v.Args[2] 11193 v_0 := v.Args[0] 11194 if v_0.Op != OpARMMOVWconst { 11195 break 11196 } 11197 c := v_0.AuxInt 11198 v_1 := v.Args[1] 11199 if v_1.Op != OpARMMOVWconst { 11200 break 11201 } 11202 d := v_1.AuxInt 11203 a := v.Args[2] 11204 v.reset(OpARMSUBconst) 11205 v.AuxInt = int64(int32(c * d)) 11206 v.AddArg(a) 11207 return true 11208 } 11209 return false 11210 } 11211 func rewriteValueARM_OpARMMVN_0(v *Value) bool { 11212 // match: (MVN (MOVWconst [c])) 11213 // cond: 11214 // result: (MOVWconst [^c]) 11215 for { 11216 v_0 := v.Args[0] 11217 if v_0.Op != OpARMMOVWconst { 11218 break 11219 } 11220 c := v_0.AuxInt 11221 v.reset(OpARMMOVWconst) 11222 v.AuxInt = ^c 11223 return true 11224 } 11225 // match: (MVN (SLLconst [c] x)) 11226 // cond: 11227 // result: (MVNshiftLL x [c]) 11228 for { 11229 v_0 := v.Args[0] 11230 if v_0.Op != OpARMSLLconst { 11231 break 11232 } 11233 c := v_0.AuxInt 11234 x := v_0.Args[0] 11235 v.reset(OpARMMVNshiftLL) 11236 v.AuxInt = c 11237 v.AddArg(x) 11238 return true 11239 } 11240 // match: (MVN (SRLconst [c] x)) 11241 // cond: 11242 // result: (MVNshiftRL x [c]) 11243 for { 11244 v_0 := v.Args[0] 11245 if v_0.Op != OpARMSRLconst { 11246 break 11247 } 11248 c := v_0.AuxInt 11249 x := v_0.Args[0] 11250 v.reset(OpARMMVNshiftRL) 11251 v.AuxInt = c 11252 v.AddArg(x) 11253 return true 11254 } 11255 // match: (MVN (SRAconst [c] x)) 11256 // cond: 11257 // result: (MVNshiftRA x [c]) 11258 for { 11259 v_0 := v.Args[0] 11260 if v_0.Op != OpARMSRAconst { 11261 break 11262 } 11263 c := v_0.AuxInt 11264 x := v_0.Args[0] 11265 v.reset(OpARMMVNshiftRA) 11266 v.AuxInt = c 11267 v.AddArg(x) 11268 return true 11269 } 11270 // match: (MVN (SLL x y)) 11271 // cond: 11272 // result: (MVNshiftLLreg x y) 11273 for { 11274 v_0 := v.Args[0] 11275 if v_0.Op != OpARMSLL { 11276 break 11277 } 11278 _ = v_0.Args[1] 11279 x := v_0.Args[0] 11280 y := v_0.Args[1] 11281 v.reset(OpARMMVNshiftLLreg) 11282 v.AddArg(x) 11283 v.AddArg(y) 11284 return true 11285 } 11286 // match: (MVN (SRL x y)) 11287 // cond: 11288 // result: (MVNshiftRLreg x y) 11289 for { 11290 v_0 := v.Args[0] 11291 if v_0.Op != OpARMSRL { 11292 break 11293 } 11294 _ = v_0.Args[1] 11295 x := v_0.Args[0] 11296 y := v_0.Args[1] 11297 v.reset(OpARMMVNshiftRLreg) 11298 v.AddArg(x) 11299 v.AddArg(y) 11300 return true 11301 } 11302 // match: (MVN (SRA x y)) 11303 // cond: 11304 // result: (MVNshiftRAreg x y) 11305 for { 11306 v_0 := v.Args[0] 11307 if v_0.Op != OpARMSRA { 11308 break 11309 } 11310 _ = v_0.Args[1] 11311 x := v_0.Args[0] 11312 y := v_0.Args[1] 11313 v.reset(OpARMMVNshiftRAreg) 11314 v.AddArg(x) 11315 v.AddArg(y) 11316 return true 11317 } 11318 return false 11319 } 11320 func rewriteValueARM_OpARMMVNshiftLL_0(v *Value) bool { 11321 // match: (MVNshiftLL (MOVWconst [c]) [d]) 11322 // cond: 11323 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 11324 for { 11325 d := v.AuxInt 11326 v_0 := v.Args[0] 11327 if v_0.Op != OpARMMOVWconst { 11328 break 11329 } 11330 c := v_0.AuxInt 11331 v.reset(OpARMMOVWconst) 11332 v.AuxInt = ^int64(uint32(c) << uint64(d)) 11333 return true 11334 } 11335 return false 11336 } 11337 func rewriteValueARM_OpARMMVNshiftLLreg_0(v *Value) bool { 11338 // match: (MVNshiftLLreg x (MOVWconst [c])) 11339 // cond: 11340 // result: (MVNshiftLL x [c]) 11341 for { 11342 _ = v.Args[1] 11343 x := v.Args[0] 11344 v_1 := v.Args[1] 11345 if v_1.Op != OpARMMOVWconst { 11346 break 11347 } 11348 c := v_1.AuxInt 11349 v.reset(OpARMMVNshiftLL) 11350 v.AuxInt = c 11351 v.AddArg(x) 11352 return true 11353 } 11354 return false 11355 } 11356 func rewriteValueARM_OpARMMVNshiftRA_0(v *Value) bool { 11357 // match: (MVNshiftRA (MOVWconst [c]) [d]) 11358 // cond: 11359 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 11360 for { 11361 d := v.AuxInt 11362 v_0 := v.Args[0] 11363 if v_0.Op != OpARMMOVWconst { 11364 break 11365 } 11366 c := v_0.AuxInt 11367 v.reset(OpARMMOVWconst) 11368 v.AuxInt = ^int64(int32(c) >> uint64(d)) 11369 return true 11370 } 11371 return false 11372 } 11373 func rewriteValueARM_OpARMMVNshiftRAreg_0(v *Value) bool { 11374 // match: (MVNshiftRAreg x (MOVWconst [c])) 11375 // cond: 11376 // result: (MVNshiftRA x [c]) 11377 for { 11378 _ = v.Args[1] 11379 x := v.Args[0] 11380 v_1 := v.Args[1] 11381 if v_1.Op != OpARMMOVWconst { 11382 break 11383 } 11384 c := v_1.AuxInt 11385 v.reset(OpARMMVNshiftRA) 11386 v.AuxInt = c 11387 v.AddArg(x) 11388 return true 11389 } 11390 return false 11391 } 11392 func rewriteValueARM_OpARMMVNshiftRL_0(v *Value) bool { 11393 // match: (MVNshiftRL (MOVWconst [c]) [d]) 11394 // cond: 11395 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 11396 for { 11397 d := v.AuxInt 11398 v_0 := v.Args[0] 11399 if v_0.Op != OpARMMOVWconst { 11400 break 11401 } 11402 c := v_0.AuxInt 11403 v.reset(OpARMMOVWconst) 11404 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 11405 return true 11406 } 11407 return false 11408 } 11409 func rewriteValueARM_OpARMMVNshiftRLreg_0(v *Value) bool { 11410 // match: (MVNshiftRLreg x (MOVWconst [c])) 11411 // cond: 11412 // result: (MVNshiftRL x [c]) 11413 for { 11414 _ = v.Args[1] 11415 x := v.Args[0] 11416 v_1 := v.Args[1] 11417 if v_1.Op != OpARMMOVWconst { 11418 break 11419 } 11420 c := v_1.AuxInt 11421 v.reset(OpARMMVNshiftRL) 11422 v.AuxInt = c 11423 v.AddArg(x) 11424 return true 11425 } 11426 return false 11427 } 11428 func rewriteValueARM_OpARMNEGD_0(v *Value) bool { 11429 // match: (NEGD (MULD x y)) 11430 // cond: objabi.GOARM >= 6 11431 // result: (NMULD x y) 11432 for { 11433 v_0 := v.Args[0] 11434 if v_0.Op != OpARMMULD { 11435 break 11436 } 11437 _ = v_0.Args[1] 11438 x := v_0.Args[0] 11439 y := v_0.Args[1] 11440 if !(objabi.GOARM >= 6) { 11441 break 11442 } 11443 v.reset(OpARMNMULD) 11444 v.AddArg(x) 11445 v.AddArg(y) 11446 return true 11447 } 11448 return false 11449 } 11450 func rewriteValueARM_OpARMNEGF_0(v *Value) bool { 11451 // match: (NEGF (MULF x y)) 11452 // cond: objabi.GOARM >= 6 11453 // result: (NMULF x y) 11454 for { 11455 v_0 := v.Args[0] 11456 if v_0.Op != OpARMMULF { 11457 break 11458 } 11459 _ = v_0.Args[1] 11460 x := v_0.Args[0] 11461 y := v_0.Args[1] 11462 if !(objabi.GOARM >= 6) { 11463 break 11464 } 11465 v.reset(OpARMNMULF) 11466 v.AddArg(x) 11467 v.AddArg(y) 11468 return true 11469 } 11470 return false 11471 } 11472 func rewriteValueARM_OpARMNMULD_0(v *Value) bool { 11473 // match: (NMULD (NEGD x) y) 11474 // cond: 11475 // result: (MULD x y) 11476 for { 11477 _ = v.Args[1] 11478 v_0 := v.Args[0] 11479 if v_0.Op != OpARMNEGD { 11480 break 11481 } 11482 x := v_0.Args[0] 11483 y := v.Args[1] 11484 v.reset(OpARMMULD) 11485 v.AddArg(x) 11486 v.AddArg(y) 11487 return true 11488 } 11489 // match: (NMULD y (NEGD x)) 11490 // cond: 11491 // result: (MULD x y) 11492 for { 11493 _ = v.Args[1] 11494 y := v.Args[0] 11495 v_1 := v.Args[1] 11496 if v_1.Op != OpARMNEGD { 11497 break 11498 } 11499 x := v_1.Args[0] 11500 v.reset(OpARMMULD) 11501 v.AddArg(x) 11502 v.AddArg(y) 11503 return true 11504 } 11505 return false 11506 } 11507 func rewriteValueARM_OpARMNMULF_0(v *Value) bool { 11508 // match: (NMULF (NEGF x) y) 11509 // cond: 11510 // result: (MULF x y) 11511 for { 11512 _ = v.Args[1] 11513 v_0 := v.Args[0] 11514 if v_0.Op != OpARMNEGF { 11515 break 11516 } 11517 x := v_0.Args[0] 11518 y := v.Args[1] 11519 v.reset(OpARMMULF) 11520 v.AddArg(x) 11521 v.AddArg(y) 11522 return true 11523 } 11524 // match: (NMULF y (NEGF x)) 11525 // cond: 11526 // result: (MULF x y) 11527 for { 11528 _ = v.Args[1] 11529 y := v.Args[0] 11530 v_1 := v.Args[1] 11531 if v_1.Op != OpARMNEGF { 11532 break 11533 } 11534 x := v_1.Args[0] 11535 v.reset(OpARMMULF) 11536 v.AddArg(x) 11537 v.AddArg(y) 11538 return true 11539 } 11540 return false 11541 } 11542 func rewriteValueARM_OpARMNotEqual_0(v *Value) bool { 11543 // match: (NotEqual (FlagEQ)) 11544 // cond: 11545 // result: (MOVWconst [0]) 11546 for { 11547 v_0 := v.Args[0] 11548 if v_0.Op != OpARMFlagEQ { 11549 break 11550 } 11551 v.reset(OpARMMOVWconst) 11552 v.AuxInt = 0 11553 return true 11554 } 11555 // match: (NotEqual (FlagLT_ULT)) 11556 // cond: 11557 // result: (MOVWconst [1]) 11558 for { 11559 v_0 := v.Args[0] 11560 if v_0.Op != OpARMFlagLT_ULT { 11561 break 11562 } 11563 v.reset(OpARMMOVWconst) 11564 v.AuxInt = 1 11565 return true 11566 } 11567 // match: (NotEqual (FlagLT_UGT)) 11568 // cond: 11569 // result: (MOVWconst [1]) 11570 for { 11571 v_0 := v.Args[0] 11572 if v_0.Op != OpARMFlagLT_UGT { 11573 break 11574 } 11575 v.reset(OpARMMOVWconst) 11576 v.AuxInt = 1 11577 return true 11578 } 11579 // match: (NotEqual (FlagGT_ULT)) 11580 // cond: 11581 // result: (MOVWconst [1]) 11582 for { 11583 v_0 := v.Args[0] 11584 if v_0.Op != OpARMFlagGT_ULT { 11585 break 11586 } 11587 v.reset(OpARMMOVWconst) 11588 v.AuxInt = 1 11589 return true 11590 } 11591 // match: (NotEqual (FlagGT_UGT)) 11592 // cond: 11593 // result: (MOVWconst [1]) 11594 for { 11595 v_0 := v.Args[0] 11596 if v_0.Op != OpARMFlagGT_UGT { 11597 break 11598 } 11599 v.reset(OpARMMOVWconst) 11600 v.AuxInt = 1 11601 return true 11602 } 11603 // match: (NotEqual (InvertFlags x)) 11604 // cond: 11605 // result: (NotEqual x) 11606 for { 11607 v_0 := v.Args[0] 11608 if v_0.Op != OpARMInvertFlags { 11609 break 11610 } 11611 x := v_0.Args[0] 11612 v.reset(OpARMNotEqual) 11613 v.AddArg(x) 11614 return true 11615 } 11616 return false 11617 } 11618 func rewriteValueARM_OpARMOR_0(v *Value) bool { 11619 // match: (OR x (MOVWconst [c])) 11620 // cond: 11621 // result: (ORconst [c] x) 11622 for { 11623 _ = v.Args[1] 11624 x := v.Args[0] 11625 v_1 := v.Args[1] 11626 if v_1.Op != OpARMMOVWconst { 11627 break 11628 } 11629 c := v_1.AuxInt 11630 v.reset(OpARMORconst) 11631 v.AuxInt = c 11632 v.AddArg(x) 11633 return true 11634 } 11635 // match: (OR (MOVWconst [c]) x) 11636 // cond: 11637 // result: (ORconst [c] x) 11638 for { 11639 _ = v.Args[1] 11640 v_0 := v.Args[0] 11641 if v_0.Op != OpARMMOVWconst { 11642 break 11643 } 11644 c := v_0.AuxInt 11645 x := v.Args[1] 11646 v.reset(OpARMORconst) 11647 v.AuxInt = c 11648 v.AddArg(x) 11649 return true 11650 } 11651 // match: (OR x (SLLconst [c] y)) 11652 // cond: 11653 // result: (ORshiftLL x y [c]) 11654 for { 11655 _ = v.Args[1] 11656 x := v.Args[0] 11657 v_1 := v.Args[1] 11658 if v_1.Op != OpARMSLLconst { 11659 break 11660 } 11661 c := v_1.AuxInt 11662 y := v_1.Args[0] 11663 v.reset(OpARMORshiftLL) 11664 v.AuxInt = c 11665 v.AddArg(x) 11666 v.AddArg(y) 11667 return true 11668 } 11669 // match: (OR (SLLconst [c] y) x) 11670 // cond: 11671 // result: (ORshiftLL x y [c]) 11672 for { 11673 _ = v.Args[1] 11674 v_0 := v.Args[0] 11675 if v_0.Op != OpARMSLLconst { 11676 break 11677 } 11678 c := v_0.AuxInt 11679 y := v_0.Args[0] 11680 x := v.Args[1] 11681 v.reset(OpARMORshiftLL) 11682 v.AuxInt = c 11683 v.AddArg(x) 11684 v.AddArg(y) 11685 return true 11686 } 11687 // match: (OR x (SRLconst [c] y)) 11688 // cond: 11689 // result: (ORshiftRL x y [c]) 11690 for { 11691 _ = v.Args[1] 11692 x := v.Args[0] 11693 v_1 := v.Args[1] 11694 if v_1.Op != OpARMSRLconst { 11695 break 11696 } 11697 c := v_1.AuxInt 11698 y := v_1.Args[0] 11699 v.reset(OpARMORshiftRL) 11700 v.AuxInt = c 11701 v.AddArg(x) 11702 v.AddArg(y) 11703 return true 11704 } 11705 // match: (OR (SRLconst [c] y) x) 11706 // cond: 11707 // result: (ORshiftRL x y [c]) 11708 for { 11709 _ = v.Args[1] 11710 v_0 := v.Args[0] 11711 if v_0.Op != OpARMSRLconst { 11712 break 11713 } 11714 c := v_0.AuxInt 11715 y := v_0.Args[0] 11716 x := v.Args[1] 11717 v.reset(OpARMORshiftRL) 11718 v.AuxInt = c 11719 v.AddArg(x) 11720 v.AddArg(y) 11721 return true 11722 } 11723 // match: (OR x (SRAconst [c] y)) 11724 // cond: 11725 // result: (ORshiftRA x y [c]) 11726 for { 11727 _ = v.Args[1] 11728 x := v.Args[0] 11729 v_1 := v.Args[1] 11730 if v_1.Op != OpARMSRAconst { 11731 break 11732 } 11733 c := v_1.AuxInt 11734 y := v_1.Args[0] 11735 v.reset(OpARMORshiftRA) 11736 v.AuxInt = c 11737 v.AddArg(x) 11738 v.AddArg(y) 11739 return true 11740 } 11741 // match: (OR (SRAconst [c] y) x) 11742 // cond: 11743 // result: (ORshiftRA x y [c]) 11744 for { 11745 _ = v.Args[1] 11746 v_0 := v.Args[0] 11747 if v_0.Op != OpARMSRAconst { 11748 break 11749 } 11750 c := v_0.AuxInt 11751 y := v_0.Args[0] 11752 x := v.Args[1] 11753 v.reset(OpARMORshiftRA) 11754 v.AuxInt = c 11755 v.AddArg(x) 11756 v.AddArg(y) 11757 return true 11758 } 11759 // match: (OR x (SLL y z)) 11760 // cond: 11761 // result: (ORshiftLLreg x y z) 11762 for { 11763 _ = v.Args[1] 11764 x := v.Args[0] 11765 v_1 := v.Args[1] 11766 if v_1.Op != OpARMSLL { 11767 break 11768 } 11769 _ = v_1.Args[1] 11770 y := v_1.Args[0] 11771 z := v_1.Args[1] 11772 v.reset(OpARMORshiftLLreg) 11773 v.AddArg(x) 11774 v.AddArg(y) 11775 v.AddArg(z) 11776 return true 11777 } 11778 // match: (OR (SLL y z) x) 11779 // cond: 11780 // result: (ORshiftLLreg x y z) 11781 for { 11782 _ = v.Args[1] 11783 v_0 := v.Args[0] 11784 if v_0.Op != OpARMSLL { 11785 break 11786 } 11787 _ = v_0.Args[1] 11788 y := v_0.Args[0] 11789 z := v_0.Args[1] 11790 x := v.Args[1] 11791 v.reset(OpARMORshiftLLreg) 11792 v.AddArg(x) 11793 v.AddArg(y) 11794 v.AddArg(z) 11795 return true 11796 } 11797 return false 11798 } 11799 func rewriteValueARM_OpARMOR_10(v *Value) bool { 11800 // match: (OR x (SRL y z)) 11801 // cond: 11802 // result: (ORshiftRLreg x y z) 11803 for { 11804 _ = v.Args[1] 11805 x := v.Args[0] 11806 v_1 := v.Args[1] 11807 if v_1.Op != OpARMSRL { 11808 break 11809 } 11810 _ = v_1.Args[1] 11811 y := v_1.Args[0] 11812 z := v_1.Args[1] 11813 v.reset(OpARMORshiftRLreg) 11814 v.AddArg(x) 11815 v.AddArg(y) 11816 v.AddArg(z) 11817 return true 11818 } 11819 // match: (OR (SRL y z) x) 11820 // cond: 11821 // result: (ORshiftRLreg x y z) 11822 for { 11823 _ = v.Args[1] 11824 v_0 := v.Args[0] 11825 if v_0.Op != OpARMSRL { 11826 break 11827 } 11828 _ = v_0.Args[1] 11829 y := v_0.Args[0] 11830 z := v_0.Args[1] 11831 x := v.Args[1] 11832 v.reset(OpARMORshiftRLreg) 11833 v.AddArg(x) 11834 v.AddArg(y) 11835 v.AddArg(z) 11836 return true 11837 } 11838 // match: (OR x (SRA y z)) 11839 // cond: 11840 // result: (ORshiftRAreg x y z) 11841 for { 11842 _ = v.Args[1] 11843 x := v.Args[0] 11844 v_1 := v.Args[1] 11845 if v_1.Op != OpARMSRA { 11846 break 11847 } 11848 _ = v_1.Args[1] 11849 y := v_1.Args[0] 11850 z := v_1.Args[1] 11851 v.reset(OpARMORshiftRAreg) 11852 v.AddArg(x) 11853 v.AddArg(y) 11854 v.AddArg(z) 11855 return true 11856 } 11857 // match: (OR (SRA y z) x) 11858 // cond: 11859 // result: (ORshiftRAreg x y z) 11860 for { 11861 _ = v.Args[1] 11862 v_0 := v.Args[0] 11863 if v_0.Op != OpARMSRA { 11864 break 11865 } 11866 _ = v_0.Args[1] 11867 y := v_0.Args[0] 11868 z := v_0.Args[1] 11869 x := v.Args[1] 11870 v.reset(OpARMORshiftRAreg) 11871 v.AddArg(x) 11872 v.AddArg(y) 11873 v.AddArg(z) 11874 return true 11875 } 11876 // match: (OR x x) 11877 // cond: 11878 // result: x 11879 for { 11880 _ = v.Args[1] 11881 x := v.Args[0] 11882 if x != v.Args[1] { 11883 break 11884 } 11885 v.reset(OpCopy) 11886 v.Type = x.Type 11887 v.AddArg(x) 11888 return true 11889 } 11890 return false 11891 } 11892 func rewriteValueARM_OpARMORconst_0(v *Value) bool { 11893 // match: (ORconst [0] x) 11894 // cond: 11895 // result: x 11896 for { 11897 if v.AuxInt != 0 { 11898 break 11899 } 11900 x := v.Args[0] 11901 v.reset(OpCopy) 11902 v.Type = x.Type 11903 v.AddArg(x) 11904 return true 11905 } 11906 // match: (ORconst [c] _) 11907 // cond: int32(c)==-1 11908 // result: (MOVWconst [-1]) 11909 for { 11910 c := v.AuxInt 11911 if !(int32(c) == -1) { 11912 break 11913 } 11914 v.reset(OpARMMOVWconst) 11915 v.AuxInt = -1 11916 return true 11917 } 11918 // match: (ORconst [c] (MOVWconst [d])) 11919 // cond: 11920 // result: (MOVWconst [c|d]) 11921 for { 11922 c := v.AuxInt 11923 v_0 := v.Args[0] 11924 if v_0.Op != OpARMMOVWconst { 11925 break 11926 } 11927 d := v_0.AuxInt 11928 v.reset(OpARMMOVWconst) 11929 v.AuxInt = c | d 11930 return true 11931 } 11932 // match: (ORconst [c] (ORconst [d] x)) 11933 // cond: 11934 // result: (ORconst [c|d] x) 11935 for { 11936 c := v.AuxInt 11937 v_0 := v.Args[0] 11938 if v_0.Op != OpARMORconst { 11939 break 11940 } 11941 d := v_0.AuxInt 11942 x := v_0.Args[0] 11943 v.reset(OpARMORconst) 11944 v.AuxInt = c | d 11945 v.AddArg(x) 11946 return true 11947 } 11948 return false 11949 } 11950 func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { 11951 b := v.Block 11952 _ = b 11953 // match: (ORshiftLL (MOVWconst [c]) x [d]) 11954 // cond: 11955 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 11956 for { 11957 d := v.AuxInt 11958 _ = v.Args[1] 11959 v_0 := v.Args[0] 11960 if v_0.Op != OpARMMOVWconst { 11961 break 11962 } 11963 c := v_0.AuxInt 11964 x := v.Args[1] 11965 v.reset(OpARMORconst) 11966 v.AuxInt = c 11967 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11968 v0.AuxInt = d 11969 v0.AddArg(x) 11970 v.AddArg(v0) 11971 return true 11972 } 11973 // match: (ORshiftLL x (MOVWconst [c]) [d]) 11974 // cond: 11975 // result: (ORconst x [int64(int32(uint32(c)<<uint64(d)))]) 11976 for { 11977 d := v.AuxInt 11978 _ = v.Args[1] 11979 x := v.Args[0] 11980 v_1 := v.Args[1] 11981 if v_1.Op != OpARMMOVWconst { 11982 break 11983 } 11984 c := v_1.AuxInt 11985 v.reset(OpARMORconst) 11986 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 11987 v.AddArg(x) 11988 return true 11989 } 11990 // match: (ORshiftLL [c] (SRLconst x [32-c]) x) 11991 // cond: 11992 // result: (SRRconst [32-c] x) 11993 for { 11994 c := v.AuxInt 11995 _ = v.Args[1] 11996 v_0 := v.Args[0] 11997 if v_0.Op != OpARMSRLconst { 11998 break 11999 } 12000 if v_0.AuxInt != 32-c { 12001 break 12002 } 12003 x := v_0.Args[0] 12004 if x != v.Args[1] { 12005 break 12006 } 12007 v.reset(OpARMSRRconst) 12008 v.AuxInt = 32 - c 12009 v.AddArg(x) 12010 return true 12011 } 12012 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 12013 // cond: c==d 12014 // result: y 12015 for { 12016 d := v.AuxInt 12017 _ = v.Args[1] 12018 x := v.Args[0] 12019 y := v.Args[1] 12020 if y.Op != OpARMSLLconst { 12021 break 12022 } 12023 c := y.AuxInt 12024 if x != y.Args[0] { 12025 break 12026 } 12027 if !(c == d) { 12028 break 12029 } 12030 v.reset(OpCopy) 12031 v.Type = y.Type 12032 v.AddArg(y) 12033 return true 12034 } 12035 return false 12036 } 12037 func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { 12038 b := v.Block 12039 _ = b 12040 // match: (ORshiftLLreg (MOVWconst [c]) x y) 12041 // cond: 12042 // result: (ORconst [c] (SLL <x.Type> x y)) 12043 for { 12044 _ = v.Args[2] 12045 v_0 := v.Args[0] 12046 if v_0.Op != OpARMMOVWconst { 12047 break 12048 } 12049 c := v_0.AuxInt 12050 x := v.Args[1] 12051 y := v.Args[2] 12052 v.reset(OpARMORconst) 12053 v.AuxInt = c 12054 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12055 v0.AddArg(x) 12056 v0.AddArg(y) 12057 v.AddArg(v0) 12058 return true 12059 } 12060 // match: (ORshiftLLreg x y (MOVWconst [c])) 12061 // cond: 12062 // result: (ORshiftLL x y [c]) 12063 for { 12064 _ = v.Args[2] 12065 x := v.Args[0] 12066 y := v.Args[1] 12067 v_2 := v.Args[2] 12068 if v_2.Op != OpARMMOVWconst { 12069 break 12070 } 12071 c := v_2.AuxInt 12072 v.reset(OpARMORshiftLL) 12073 v.AuxInt = c 12074 v.AddArg(x) 12075 v.AddArg(y) 12076 return true 12077 } 12078 return false 12079 } 12080 func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { 12081 b := v.Block 12082 _ = b 12083 // match: (ORshiftRA (MOVWconst [c]) x [d]) 12084 // cond: 12085 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 12086 for { 12087 d := v.AuxInt 12088 _ = v.Args[1] 12089 v_0 := v.Args[0] 12090 if v_0.Op != OpARMMOVWconst { 12091 break 12092 } 12093 c := v_0.AuxInt 12094 x := v.Args[1] 12095 v.reset(OpARMORconst) 12096 v.AuxInt = c 12097 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12098 v0.AuxInt = d 12099 v0.AddArg(x) 12100 v.AddArg(v0) 12101 return true 12102 } 12103 // match: (ORshiftRA x (MOVWconst [c]) [d]) 12104 // cond: 12105 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 12106 for { 12107 d := v.AuxInt 12108 _ = v.Args[1] 12109 x := v.Args[0] 12110 v_1 := v.Args[1] 12111 if v_1.Op != OpARMMOVWconst { 12112 break 12113 } 12114 c := v_1.AuxInt 12115 v.reset(OpARMORconst) 12116 v.AuxInt = int64(int32(c) >> uint64(d)) 12117 v.AddArg(x) 12118 return true 12119 } 12120 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 12121 // cond: c==d 12122 // result: y 12123 for { 12124 d := v.AuxInt 12125 _ = v.Args[1] 12126 x := v.Args[0] 12127 y := v.Args[1] 12128 if y.Op != OpARMSRAconst { 12129 break 12130 } 12131 c := y.AuxInt 12132 if x != y.Args[0] { 12133 break 12134 } 12135 if !(c == d) { 12136 break 12137 } 12138 v.reset(OpCopy) 12139 v.Type = y.Type 12140 v.AddArg(y) 12141 return true 12142 } 12143 return false 12144 } 12145 func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { 12146 b := v.Block 12147 _ = b 12148 // match: (ORshiftRAreg (MOVWconst [c]) x y) 12149 // cond: 12150 // result: (ORconst [c] (SRA <x.Type> x y)) 12151 for { 12152 _ = v.Args[2] 12153 v_0 := v.Args[0] 12154 if v_0.Op != OpARMMOVWconst { 12155 break 12156 } 12157 c := v_0.AuxInt 12158 x := v.Args[1] 12159 y := v.Args[2] 12160 v.reset(OpARMORconst) 12161 v.AuxInt = c 12162 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12163 v0.AddArg(x) 12164 v0.AddArg(y) 12165 v.AddArg(v0) 12166 return true 12167 } 12168 // match: (ORshiftRAreg x y (MOVWconst [c])) 12169 // cond: 12170 // result: (ORshiftRA x y [c]) 12171 for { 12172 _ = v.Args[2] 12173 x := v.Args[0] 12174 y := v.Args[1] 12175 v_2 := v.Args[2] 12176 if v_2.Op != OpARMMOVWconst { 12177 break 12178 } 12179 c := v_2.AuxInt 12180 v.reset(OpARMORshiftRA) 12181 v.AuxInt = c 12182 v.AddArg(x) 12183 v.AddArg(y) 12184 return true 12185 } 12186 return false 12187 } 12188 func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { 12189 b := v.Block 12190 _ = b 12191 // match: (ORshiftRL (MOVWconst [c]) x [d]) 12192 // cond: 12193 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 12194 for { 12195 d := v.AuxInt 12196 _ = v.Args[1] 12197 v_0 := v.Args[0] 12198 if v_0.Op != OpARMMOVWconst { 12199 break 12200 } 12201 c := v_0.AuxInt 12202 x := v.Args[1] 12203 v.reset(OpARMORconst) 12204 v.AuxInt = c 12205 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12206 v0.AuxInt = d 12207 v0.AddArg(x) 12208 v.AddArg(v0) 12209 return true 12210 } 12211 // match: (ORshiftRL x (MOVWconst [c]) [d]) 12212 // cond: 12213 // result: (ORconst x [int64(int32(uint32(c)>>uint64(d)))]) 12214 for { 12215 d := v.AuxInt 12216 _ = v.Args[1] 12217 x := v.Args[0] 12218 v_1 := v.Args[1] 12219 if v_1.Op != OpARMMOVWconst { 12220 break 12221 } 12222 c := v_1.AuxInt 12223 v.reset(OpARMORconst) 12224 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 12225 v.AddArg(x) 12226 return true 12227 } 12228 // match: (ORshiftRL [c] (SLLconst x [32-c]) x) 12229 // cond: 12230 // result: (SRRconst [ c] x) 12231 for { 12232 c := v.AuxInt 12233 _ = v.Args[1] 12234 v_0 := v.Args[0] 12235 if v_0.Op != OpARMSLLconst { 12236 break 12237 } 12238 if v_0.AuxInt != 32-c { 12239 break 12240 } 12241 x := v_0.Args[0] 12242 if x != v.Args[1] { 12243 break 12244 } 12245 v.reset(OpARMSRRconst) 12246 v.AuxInt = c 12247 v.AddArg(x) 12248 return true 12249 } 12250 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 12251 // cond: c==d 12252 // result: y 12253 for { 12254 d := v.AuxInt 12255 _ = v.Args[1] 12256 x := v.Args[0] 12257 y := v.Args[1] 12258 if y.Op != OpARMSRLconst { 12259 break 12260 } 12261 c := y.AuxInt 12262 if x != y.Args[0] { 12263 break 12264 } 12265 if !(c == d) { 12266 break 12267 } 12268 v.reset(OpCopy) 12269 v.Type = y.Type 12270 v.AddArg(y) 12271 return true 12272 } 12273 return false 12274 } 12275 func rewriteValueARM_OpARMORshiftRLreg_0(v *Value) bool { 12276 b := v.Block 12277 _ = b 12278 // match: (ORshiftRLreg (MOVWconst [c]) x y) 12279 // cond: 12280 // result: (ORconst [c] (SRL <x.Type> x y)) 12281 for { 12282 _ = v.Args[2] 12283 v_0 := v.Args[0] 12284 if v_0.Op != OpARMMOVWconst { 12285 break 12286 } 12287 c := v_0.AuxInt 12288 x := v.Args[1] 12289 y := v.Args[2] 12290 v.reset(OpARMORconst) 12291 v.AuxInt = c 12292 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12293 v0.AddArg(x) 12294 v0.AddArg(y) 12295 v.AddArg(v0) 12296 return true 12297 } 12298 // match: (ORshiftRLreg x y (MOVWconst [c])) 12299 // cond: 12300 // result: (ORshiftRL x y [c]) 12301 for { 12302 _ = v.Args[2] 12303 x := v.Args[0] 12304 y := v.Args[1] 12305 v_2 := v.Args[2] 12306 if v_2.Op != OpARMMOVWconst { 12307 break 12308 } 12309 c := v_2.AuxInt 12310 v.reset(OpARMORshiftRL) 12311 v.AuxInt = c 12312 v.AddArg(x) 12313 v.AddArg(y) 12314 return true 12315 } 12316 return false 12317 } 12318 func rewriteValueARM_OpARMRSB_0(v *Value) bool { 12319 // match: (RSB (MOVWconst [c]) x) 12320 // cond: 12321 // result: (SUBconst [c] x) 12322 for { 12323 _ = v.Args[1] 12324 v_0 := v.Args[0] 12325 if v_0.Op != OpARMMOVWconst { 12326 break 12327 } 12328 c := v_0.AuxInt 12329 x := v.Args[1] 12330 v.reset(OpARMSUBconst) 12331 v.AuxInt = c 12332 v.AddArg(x) 12333 return true 12334 } 12335 // match: (RSB x (MOVWconst [c])) 12336 // cond: 12337 // result: (RSBconst [c] x) 12338 for { 12339 _ = v.Args[1] 12340 x := v.Args[0] 12341 v_1 := v.Args[1] 12342 if v_1.Op != OpARMMOVWconst { 12343 break 12344 } 12345 c := v_1.AuxInt 12346 v.reset(OpARMRSBconst) 12347 v.AuxInt = c 12348 v.AddArg(x) 12349 return true 12350 } 12351 // match: (RSB x (SLLconst [c] y)) 12352 // cond: 12353 // result: (RSBshiftLL x y [c]) 12354 for { 12355 _ = v.Args[1] 12356 x := v.Args[0] 12357 v_1 := v.Args[1] 12358 if v_1.Op != OpARMSLLconst { 12359 break 12360 } 12361 c := v_1.AuxInt 12362 y := v_1.Args[0] 12363 v.reset(OpARMRSBshiftLL) 12364 v.AuxInt = c 12365 v.AddArg(x) 12366 v.AddArg(y) 12367 return true 12368 } 12369 // match: (RSB (SLLconst [c] y) x) 12370 // cond: 12371 // result: (SUBshiftLL x y [c]) 12372 for { 12373 _ = v.Args[1] 12374 v_0 := v.Args[0] 12375 if v_0.Op != OpARMSLLconst { 12376 break 12377 } 12378 c := v_0.AuxInt 12379 y := v_0.Args[0] 12380 x := v.Args[1] 12381 v.reset(OpARMSUBshiftLL) 12382 v.AuxInt = c 12383 v.AddArg(x) 12384 v.AddArg(y) 12385 return true 12386 } 12387 // match: (RSB x (SRLconst [c] y)) 12388 // cond: 12389 // result: (RSBshiftRL x y [c]) 12390 for { 12391 _ = v.Args[1] 12392 x := v.Args[0] 12393 v_1 := v.Args[1] 12394 if v_1.Op != OpARMSRLconst { 12395 break 12396 } 12397 c := v_1.AuxInt 12398 y := v_1.Args[0] 12399 v.reset(OpARMRSBshiftRL) 12400 v.AuxInt = c 12401 v.AddArg(x) 12402 v.AddArg(y) 12403 return true 12404 } 12405 // match: (RSB (SRLconst [c] y) x) 12406 // cond: 12407 // result: (SUBshiftRL x y [c]) 12408 for { 12409 _ = v.Args[1] 12410 v_0 := v.Args[0] 12411 if v_0.Op != OpARMSRLconst { 12412 break 12413 } 12414 c := v_0.AuxInt 12415 y := v_0.Args[0] 12416 x := v.Args[1] 12417 v.reset(OpARMSUBshiftRL) 12418 v.AuxInt = c 12419 v.AddArg(x) 12420 v.AddArg(y) 12421 return true 12422 } 12423 // match: (RSB x (SRAconst [c] y)) 12424 // cond: 12425 // result: (RSBshiftRA x y [c]) 12426 for { 12427 _ = v.Args[1] 12428 x := v.Args[0] 12429 v_1 := v.Args[1] 12430 if v_1.Op != OpARMSRAconst { 12431 break 12432 } 12433 c := v_1.AuxInt 12434 y := v_1.Args[0] 12435 v.reset(OpARMRSBshiftRA) 12436 v.AuxInt = c 12437 v.AddArg(x) 12438 v.AddArg(y) 12439 return true 12440 } 12441 // match: (RSB (SRAconst [c] y) x) 12442 // cond: 12443 // result: (SUBshiftRA x y [c]) 12444 for { 12445 _ = v.Args[1] 12446 v_0 := v.Args[0] 12447 if v_0.Op != OpARMSRAconst { 12448 break 12449 } 12450 c := v_0.AuxInt 12451 y := v_0.Args[0] 12452 x := v.Args[1] 12453 v.reset(OpARMSUBshiftRA) 12454 v.AuxInt = c 12455 v.AddArg(x) 12456 v.AddArg(y) 12457 return true 12458 } 12459 // match: (RSB x (SLL y z)) 12460 // cond: 12461 // result: (RSBshiftLLreg x y z) 12462 for { 12463 _ = v.Args[1] 12464 x := v.Args[0] 12465 v_1 := v.Args[1] 12466 if v_1.Op != OpARMSLL { 12467 break 12468 } 12469 _ = v_1.Args[1] 12470 y := v_1.Args[0] 12471 z := v_1.Args[1] 12472 v.reset(OpARMRSBshiftLLreg) 12473 v.AddArg(x) 12474 v.AddArg(y) 12475 v.AddArg(z) 12476 return true 12477 } 12478 // match: (RSB (SLL y z) x) 12479 // cond: 12480 // result: (SUBshiftLLreg x y z) 12481 for { 12482 _ = v.Args[1] 12483 v_0 := v.Args[0] 12484 if v_0.Op != OpARMSLL { 12485 break 12486 } 12487 _ = v_0.Args[1] 12488 y := v_0.Args[0] 12489 z := v_0.Args[1] 12490 x := v.Args[1] 12491 v.reset(OpARMSUBshiftLLreg) 12492 v.AddArg(x) 12493 v.AddArg(y) 12494 v.AddArg(z) 12495 return true 12496 } 12497 return false 12498 } 12499 func rewriteValueARM_OpARMRSB_10(v *Value) bool { 12500 // match: (RSB x (SRL y z)) 12501 // cond: 12502 // result: (RSBshiftRLreg x y z) 12503 for { 12504 _ = v.Args[1] 12505 x := v.Args[0] 12506 v_1 := v.Args[1] 12507 if v_1.Op != OpARMSRL { 12508 break 12509 } 12510 _ = v_1.Args[1] 12511 y := v_1.Args[0] 12512 z := v_1.Args[1] 12513 v.reset(OpARMRSBshiftRLreg) 12514 v.AddArg(x) 12515 v.AddArg(y) 12516 v.AddArg(z) 12517 return true 12518 } 12519 // match: (RSB (SRL y z) x) 12520 // cond: 12521 // result: (SUBshiftRLreg x y z) 12522 for { 12523 _ = v.Args[1] 12524 v_0 := v.Args[0] 12525 if v_0.Op != OpARMSRL { 12526 break 12527 } 12528 _ = v_0.Args[1] 12529 y := v_0.Args[0] 12530 z := v_0.Args[1] 12531 x := v.Args[1] 12532 v.reset(OpARMSUBshiftRLreg) 12533 v.AddArg(x) 12534 v.AddArg(y) 12535 v.AddArg(z) 12536 return true 12537 } 12538 // match: (RSB x (SRA y z)) 12539 // cond: 12540 // result: (RSBshiftRAreg x y z) 12541 for { 12542 _ = v.Args[1] 12543 x := v.Args[0] 12544 v_1 := v.Args[1] 12545 if v_1.Op != OpARMSRA { 12546 break 12547 } 12548 _ = v_1.Args[1] 12549 y := v_1.Args[0] 12550 z := v_1.Args[1] 12551 v.reset(OpARMRSBshiftRAreg) 12552 v.AddArg(x) 12553 v.AddArg(y) 12554 v.AddArg(z) 12555 return true 12556 } 12557 // match: (RSB (SRA y z) x) 12558 // cond: 12559 // result: (SUBshiftRAreg x y z) 12560 for { 12561 _ = v.Args[1] 12562 v_0 := v.Args[0] 12563 if v_0.Op != OpARMSRA { 12564 break 12565 } 12566 _ = v_0.Args[1] 12567 y := v_0.Args[0] 12568 z := v_0.Args[1] 12569 x := v.Args[1] 12570 v.reset(OpARMSUBshiftRAreg) 12571 v.AddArg(x) 12572 v.AddArg(y) 12573 v.AddArg(z) 12574 return true 12575 } 12576 // match: (RSB x x) 12577 // cond: 12578 // result: (MOVWconst [0]) 12579 for { 12580 _ = v.Args[1] 12581 x := v.Args[0] 12582 if x != v.Args[1] { 12583 break 12584 } 12585 v.reset(OpARMMOVWconst) 12586 v.AuxInt = 0 12587 return true 12588 } 12589 // match: (RSB (MUL x y) a) 12590 // cond: objabi.GOARM == 7 12591 // result: (MULS x y a) 12592 for { 12593 _ = v.Args[1] 12594 v_0 := v.Args[0] 12595 if v_0.Op != OpARMMUL { 12596 break 12597 } 12598 _ = v_0.Args[1] 12599 x := v_0.Args[0] 12600 y := v_0.Args[1] 12601 a := v.Args[1] 12602 if !(objabi.GOARM == 7) { 12603 break 12604 } 12605 v.reset(OpARMMULS) 12606 v.AddArg(x) 12607 v.AddArg(y) 12608 v.AddArg(a) 12609 return true 12610 } 12611 return false 12612 } 12613 func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { 12614 b := v.Block 12615 _ = b 12616 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 12617 // cond: 12618 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 12619 for { 12620 d := v.AuxInt 12621 _ = v.Args[1] 12622 v_0 := v.Args[0] 12623 if v_0.Op != OpARMMOVWconst { 12624 break 12625 } 12626 c := v_0.AuxInt 12627 x := v.Args[1] 12628 v.reset(OpARMSUBSconst) 12629 v.AuxInt = c 12630 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12631 v0.AuxInt = d 12632 v0.AddArg(x) 12633 v.AddArg(v0) 12634 return true 12635 } 12636 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 12637 // cond: 12638 // result: (RSBSconst x [int64(int32(uint32(c)<<uint64(d)))]) 12639 for { 12640 d := v.AuxInt 12641 _ = v.Args[1] 12642 x := v.Args[0] 12643 v_1 := v.Args[1] 12644 if v_1.Op != OpARMMOVWconst { 12645 break 12646 } 12647 c := v_1.AuxInt 12648 v.reset(OpARMRSBSconst) 12649 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 12650 v.AddArg(x) 12651 return true 12652 } 12653 return false 12654 } 12655 func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { 12656 b := v.Block 12657 _ = b 12658 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 12659 // cond: 12660 // result: (SUBSconst [c] (SLL <x.Type> x y)) 12661 for { 12662 _ = v.Args[2] 12663 v_0 := v.Args[0] 12664 if v_0.Op != OpARMMOVWconst { 12665 break 12666 } 12667 c := v_0.AuxInt 12668 x := v.Args[1] 12669 y := v.Args[2] 12670 v.reset(OpARMSUBSconst) 12671 v.AuxInt = c 12672 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12673 v0.AddArg(x) 12674 v0.AddArg(y) 12675 v.AddArg(v0) 12676 return true 12677 } 12678 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 12679 // cond: 12680 // result: (RSBSshiftLL x y [c]) 12681 for { 12682 _ = v.Args[2] 12683 x := v.Args[0] 12684 y := v.Args[1] 12685 v_2 := v.Args[2] 12686 if v_2.Op != OpARMMOVWconst { 12687 break 12688 } 12689 c := v_2.AuxInt 12690 v.reset(OpARMRSBSshiftLL) 12691 v.AuxInt = c 12692 v.AddArg(x) 12693 v.AddArg(y) 12694 return true 12695 } 12696 return false 12697 } 12698 func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { 12699 b := v.Block 12700 _ = b 12701 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 12702 // cond: 12703 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 12704 for { 12705 d := v.AuxInt 12706 _ = v.Args[1] 12707 v_0 := v.Args[0] 12708 if v_0.Op != OpARMMOVWconst { 12709 break 12710 } 12711 c := v_0.AuxInt 12712 x := v.Args[1] 12713 v.reset(OpARMSUBSconst) 12714 v.AuxInt = c 12715 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12716 v0.AuxInt = d 12717 v0.AddArg(x) 12718 v.AddArg(v0) 12719 return true 12720 } 12721 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 12722 // cond: 12723 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 12724 for { 12725 d := v.AuxInt 12726 _ = v.Args[1] 12727 x := v.Args[0] 12728 v_1 := v.Args[1] 12729 if v_1.Op != OpARMMOVWconst { 12730 break 12731 } 12732 c := v_1.AuxInt 12733 v.reset(OpARMRSBSconst) 12734 v.AuxInt = int64(int32(c) >> uint64(d)) 12735 v.AddArg(x) 12736 return true 12737 } 12738 return false 12739 } 12740 func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { 12741 b := v.Block 12742 _ = b 12743 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 12744 // cond: 12745 // result: (SUBSconst [c] (SRA <x.Type> x y)) 12746 for { 12747 _ = v.Args[2] 12748 v_0 := v.Args[0] 12749 if v_0.Op != OpARMMOVWconst { 12750 break 12751 } 12752 c := v_0.AuxInt 12753 x := v.Args[1] 12754 y := v.Args[2] 12755 v.reset(OpARMSUBSconst) 12756 v.AuxInt = c 12757 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12758 v0.AddArg(x) 12759 v0.AddArg(y) 12760 v.AddArg(v0) 12761 return true 12762 } 12763 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 12764 // cond: 12765 // result: (RSBSshiftRA x y [c]) 12766 for { 12767 _ = v.Args[2] 12768 x := v.Args[0] 12769 y := v.Args[1] 12770 v_2 := v.Args[2] 12771 if v_2.Op != OpARMMOVWconst { 12772 break 12773 } 12774 c := v_2.AuxInt 12775 v.reset(OpARMRSBSshiftRA) 12776 v.AuxInt = c 12777 v.AddArg(x) 12778 v.AddArg(y) 12779 return true 12780 } 12781 return false 12782 } 12783 func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { 12784 b := v.Block 12785 _ = b 12786 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 12787 // cond: 12788 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 12789 for { 12790 d := v.AuxInt 12791 _ = v.Args[1] 12792 v_0 := v.Args[0] 12793 if v_0.Op != OpARMMOVWconst { 12794 break 12795 } 12796 c := v_0.AuxInt 12797 x := v.Args[1] 12798 v.reset(OpARMSUBSconst) 12799 v.AuxInt = c 12800 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12801 v0.AuxInt = d 12802 v0.AddArg(x) 12803 v.AddArg(v0) 12804 return true 12805 } 12806 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 12807 // cond: 12808 // result: (RSBSconst x [int64(int32(uint32(c)>>uint64(d)))]) 12809 for { 12810 d := v.AuxInt 12811 _ = v.Args[1] 12812 x := v.Args[0] 12813 v_1 := v.Args[1] 12814 if v_1.Op != OpARMMOVWconst { 12815 break 12816 } 12817 c := v_1.AuxInt 12818 v.reset(OpARMRSBSconst) 12819 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 12820 v.AddArg(x) 12821 return true 12822 } 12823 return false 12824 } 12825 func rewriteValueARM_OpARMRSBSshiftRLreg_0(v *Value) bool { 12826 b := v.Block 12827 _ = b 12828 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 12829 // cond: 12830 // result: (SUBSconst [c] (SRL <x.Type> x y)) 12831 for { 12832 _ = v.Args[2] 12833 v_0 := v.Args[0] 12834 if v_0.Op != OpARMMOVWconst { 12835 break 12836 } 12837 c := v_0.AuxInt 12838 x := v.Args[1] 12839 y := v.Args[2] 12840 v.reset(OpARMSUBSconst) 12841 v.AuxInt = c 12842 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12843 v0.AddArg(x) 12844 v0.AddArg(y) 12845 v.AddArg(v0) 12846 return true 12847 } 12848 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 12849 // cond: 12850 // result: (RSBSshiftRL x y [c]) 12851 for { 12852 _ = v.Args[2] 12853 x := v.Args[0] 12854 y := v.Args[1] 12855 v_2 := v.Args[2] 12856 if v_2.Op != OpARMMOVWconst { 12857 break 12858 } 12859 c := v_2.AuxInt 12860 v.reset(OpARMRSBSshiftRL) 12861 v.AuxInt = c 12862 v.AddArg(x) 12863 v.AddArg(y) 12864 return true 12865 } 12866 return false 12867 } 12868 func rewriteValueARM_OpARMRSBconst_0(v *Value) bool { 12869 // match: (RSBconst [c] (MOVWconst [d])) 12870 // cond: 12871 // result: (MOVWconst [int64(int32(c-d))]) 12872 for { 12873 c := v.AuxInt 12874 v_0 := v.Args[0] 12875 if v_0.Op != OpARMMOVWconst { 12876 break 12877 } 12878 d := v_0.AuxInt 12879 v.reset(OpARMMOVWconst) 12880 v.AuxInt = int64(int32(c - d)) 12881 return true 12882 } 12883 // match: (RSBconst [c] (RSBconst [d] x)) 12884 // cond: 12885 // result: (ADDconst [int64(int32(c-d))] x) 12886 for { 12887 c := v.AuxInt 12888 v_0 := v.Args[0] 12889 if v_0.Op != OpARMRSBconst { 12890 break 12891 } 12892 d := v_0.AuxInt 12893 x := v_0.Args[0] 12894 v.reset(OpARMADDconst) 12895 v.AuxInt = int64(int32(c - d)) 12896 v.AddArg(x) 12897 return true 12898 } 12899 // match: (RSBconst [c] (ADDconst [d] x)) 12900 // cond: 12901 // result: (RSBconst [int64(int32(c-d))] x) 12902 for { 12903 c := v.AuxInt 12904 v_0 := v.Args[0] 12905 if v_0.Op != OpARMADDconst { 12906 break 12907 } 12908 d := v_0.AuxInt 12909 x := v_0.Args[0] 12910 v.reset(OpARMRSBconst) 12911 v.AuxInt = int64(int32(c - d)) 12912 v.AddArg(x) 12913 return true 12914 } 12915 // match: (RSBconst [c] (SUBconst [d] x)) 12916 // cond: 12917 // result: (RSBconst [int64(int32(c+d))] x) 12918 for { 12919 c := v.AuxInt 12920 v_0 := v.Args[0] 12921 if v_0.Op != OpARMSUBconst { 12922 break 12923 } 12924 d := v_0.AuxInt 12925 x := v_0.Args[0] 12926 v.reset(OpARMRSBconst) 12927 v.AuxInt = int64(int32(c + d)) 12928 v.AddArg(x) 12929 return true 12930 } 12931 return false 12932 } 12933 func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { 12934 b := v.Block 12935 _ = b 12936 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 12937 // cond: 12938 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 12939 for { 12940 d := v.AuxInt 12941 _ = v.Args[1] 12942 v_0 := v.Args[0] 12943 if v_0.Op != OpARMMOVWconst { 12944 break 12945 } 12946 c := v_0.AuxInt 12947 x := v.Args[1] 12948 v.reset(OpARMSUBconst) 12949 v.AuxInt = c 12950 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12951 v0.AuxInt = d 12952 v0.AddArg(x) 12953 v.AddArg(v0) 12954 return true 12955 } 12956 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 12957 // cond: 12958 // result: (RSBconst x [int64(int32(uint32(c)<<uint64(d)))]) 12959 for { 12960 d := v.AuxInt 12961 _ = v.Args[1] 12962 x := v.Args[0] 12963 v_1 := v.Args[1] 12964 if v_1.Op != OpARMMOVWconst { 12965 break 12966 } 12967 c := v_1.AuxInt 12968 v.reset(OpARMRSBconst) 12969 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 12970 v.AddArg(x) 12971 return true 12972 } 12973 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 12974 // cond: c==d 12975 // result: (MOVWconst [0]) 12976 for { 12977 d := v.AuxInt 12978 _ = v.Args[1] 12979 x := v.Args[0] 12980 v_1 := v.Args[1] 12981 if v_1.Op != OpARMSLLconst { 12982 break 12983 } 12984 c := v_1.AuxInt 12985 if x != v_1.Args[0] { 12986 break 12987 } 12988 if !(c == d) { 12989 break 12990 } 12991 v.reset(OpARMMOVWconst) 12992 v.AuxInt = 0 12993 return true 12994 } 12995 return false 12996 } 12997 func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { 12998 b := v.Block 12999 _ = b 13000 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 13001 // cond: 13002 // result: (SUBconst [c] (SLL <x.Type> x y)) 13003 for { 13004 _ = v.Args[2] 13005 v_0 := v.Args[0] 13006 if v_0.Op != OpARMMOVWconst { 13007 break 13008 } 13009 c := v_0.AuxInt 13010 x := v.Args[1] 13011 y := v.Args[2] 13012 v.reset(OpARMSUBconst) 13013 v.AuxInt = c 13014 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13015 v0.AddArg(x) 13016 v0.AddArg(y) 13017 v.AddArg(v0) 13018 return true 13019 } 13020 // match: (RSBshiftLLreg x y (MOVWconst [c])) 13021 // cond: 13022 // result: (RSBshiftLL x y [c]) 13023 for { 13024 _ = v.Args[2] 13025 x := v.Args[0] 13026 y := v.Args[1] 13027 v_2 := v.Args[2] 13028 if v_2.Op != OpARMMOVWconst { 13029 break 13030 } 13031 c := v_2.AuxInt 13032 v.reset(OpARMRSBshiftLL) 13033 v.AuxInt = c 13034 v.AddArg(x) 13035 v.AddArg(y) 13036 return true 13037 } 13038 return false 13039 } 13040 func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { 13041 b := v.Block 13042 _ = b 13043 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 13044 // cond: 13045 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 13046 for { 13047 d := v.AuxInt 13048 _ = v.Args[1] 13049 v_0 := v.Args[0] 13050 if v_0.Op != OpARMMOVWconst { 13051 break 13052 } 13053 c := v_0.AuxInt 13054 x := v.Args[1] 13055 v.reset(OpARMSUBconst) 13056 v.AuxInt = c 13057 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13058 v0.AuxInt = d 13059 v0.AddArg(x) 13060 v.AddArg(v0) 13061 return true 13062 } 13063 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 13064 // cond: 13065 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 13066 for { 13067 d := v.AuxInt 13068 _ = v.Args[1] 13069 x := v.Args[0] 13070 v_1 := v.Args[1] 13071 if v_1.Op != OpARMMOVWconst { 13072 break 13073 } 13074 c := v_1.AuxInt 13075 v.reset(OpARMRSBconst) 13076 v.AuxInt = int64(int32(c) >> uint64(d)) 13077 v.AddArg(x) 13078 return true 13079 } 13080 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 13081 // cond: c==d 13082 // result: (MOVWconst [0]) 13083 for { 13084 d := v.AuxInt 13085 _ = v.Args[1] 13086 x := v.Args[0] 13087 v_1 := v.Args[1] 13088 if v_1.Op != OpARMSRAconst { 13089 break 13090 } 13091 c := v_1.AuxInt 13092 if x != v_1.Args[0] { 13093 break 13094 } 13095 if !(c == d) { 13096 break 13097 } 13098 v.reset(OpARMMOVWconst) 13099 v.AuxInt = 0 13100 return true 13101 } 13102 return false 13103 } 13104 func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { 13105 b := v.Block 13106 _ = b 13107 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 13108 // cond: 13109 // result: (SUBconst [c] (SRA <x.Type> x y)) 13110 for { 13111 _ = v.Args[2] 13112 v_0 := v.Args[0] 13113 if v_0.Op != OpARMMOVWconst { 13114 break 13115 } 13116 c := v_0.AuxInt 13117 x := v.Args[1] 13118 y := v.Args[2] 13119 v.reset(OpARMSUBconst) 13120 v.AuxInt = c 13121 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13122 v0.AddArg(x) 13123 v0.AddArg(y) 13124 v.AddArg(v0) 13125 return true 13126 } 13127 // match: (RSBshiftRAreg x y (MOVWconst [c])) 13128 // cond: 13129 // result: (RSBshiftRA x y [c]) 13130 for { 13131 _ = v.Args[2] 13132 x := v.Args[0] 13133 y := v.Args[1] 13134 v_2 := v.Args[2] 13135 if v_2.Op != OpARMMOVWconst { 13136 break 13137 } 13138 c := v_2.AuxInt 13139 v.reset(OpARMRSBshiftRA) 13140 v.AuxInt = c 13141 v.AddArg(x) 13142 v.AddArg(y) 13143 return true 13144 } 13145 return false 13146 } 13147 func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { 13148 b := v.Block 13149 _ = b 13150 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 13151 // cond: 13152 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 13153 for { 13154 d := v.AuxInt 13155 _ = v.Args[1] 13156 v_0 := v.Args[0] 13157 if v_0.Op != OpARMMOVWconst { 13158 break 13159 } 13160 c := v_0.AuxInt 13161 x := v.Args[1] 13162 v.reset(OpARMSUBconst) 13163 v.AuxInt = c 13164 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13165 v0.AuxInt = d 13166 v0.AddArg(x) 13167 v.AddArg(v0) 13168 return true 13169 } 13170 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 13171 // cond: 13172 // result: (RSBconst x [int64(int32(uint32(c)>>uint64(d)))]) 13173 for { 13174 d := v.AuxInt 13175 _ = v.Args[1] 13176 x := v.Args[0] 13177 v_1 := v.Args[1] 13178 if v_1.Op != OpARMMOVWconst { 13179 break 13180 } 13181 c := v_1.AuxInt 13182 v.reset(OpARMRSBconst) 13183 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 13184 v.AddArg(x) 13185 return true 13186 } 13187 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 13188 // cond: c==d 13189 // result: (MOVWconst [0]) 13190 for { 13191 d := v.AuxInt 13192 _ = v.Args[1] 13193 x := v.Args[0] 13194 v_1 := v.Args[1] 13195 if v_1.Op != OpARMSRLconst { 13196 break 13197 } 13198 c := v_1.AuxInt 13199 if x != v_1.Args[0] { 13200 break 13201 } 13202 if !(c == d) { 13203 break 13204 } 13205 v.reset(OpARMMOVWconst) 13206 v.AuxInt = 0 13207 return true 13208 } 13209 return false 13210 } 13211 func rewriteValueARM_OpARMRSBshiftRLreg_0(v *Value) bool { 13212 b := v.Block 13213 _ = b 13214 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 13215 // cond: 13216 // result: (SUBconst [c] (SRL <x.Type> x y)) 13217 for { 13218 _ = v.Args[2] 13219 v_0 := v.Args[0] 13220 if v_0.Op != OpARMMOVWconst { 13221 break 13222 } 13223 c := v_0.AuxInt 13224 x := v.Args[1] 13225 y := v.Args[2] 13226 v.reset(OpARMSUBconst) 13227 v.AuxInt = c 13228 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13229 v0.AddArg(x) 13230 v0.AddArg(y) 13231 v.AddArg(v0) 13232 return true 13233 } 13234 // match: (RSBshiftRLreg x y (MOVWconst [c])) 13235 // cond: 13236 // result: (RSBshiftRL x y [c]) 13237 for { 13238 _ = v.Args[2] 13239 x := v.Args[0] 13240 y := v.Args[1] 13241 v_2 := v.Args[2] 13242 if v_2.Op != OpARMMOVWconst { 13243 break 13244 } 13245 c := v_2.AuxInt 13246 v.reset(OpARMRSBshiftRL) 13247 v.AuxInt = c 13248 v.AddArg(x) 13249 v.AddArg(y) 13250 return true 13251 } 13252 return false 13253 } 13254 func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { 13255 // match: (RSCconst [c] (ADDconst [d] x) flags) 13256 // cond: 13257 // result: (RSCconst [int64(int32(c-d))] x flags) 13258 for { 13259 c := v.AuxInt 13260 _ = v.Args[1] 13261 v_0 := v.Args[0] 13262 if v_0.Op != OpARMADDconst { 13263 break 13264 } 13265 d := v_0.AuxInt 13266 x := v_0.Args[0] 13267 flags := v.Args[1] 13268 v.reset(OpARMRSCconst) 13269 v.AuxInt = int64(int32(c - d)) 13270 v.AddArg(x) 13271 v.AddArg(flags) 13272 return true 13273 } 13274 // match: (RSCconst [c] (SUBconst [d] x) flags) 13275 // cond: 13276 // result: (RSCconst [int64(int32(c+d))] x flags) 13277 for { 13278 c := v.AuxInt 13279 _ = v.Args[1] 13280 v_0 := v.Args[0] 13281 if v_0.Op != OpARMSUBconst { 13282 break 13283 } 13284 d := v_0.AuxInt 13285 x := v_0.Args[0] 13286 flags := v.Args[1] 13287 v.reset(OpARMRSCconst) 13288 v.AuxInt = int64(int32(c + d)) 13289 v.AddArg(x) 13290 v.AddArg(flags) 13291 return true 13292 } 13293 return false 13294 } 13295 func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { 13296 b := v.Block 13297 _ = b 13298 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 13299 // cond: 13300 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 13301 for { 13302 d := v.AuxInt 13303 _ = v.Args[2] 13304 v_0 := v.Args[0] 13305 if v_0.Op != OpARMMOVWconst { 13306 break 13307 } 13308 c := v_0.AuxInt 13309 x := v.Args[1] 13310 flags := v.Args[2] 13311 v.reset(OpARMSBCconst) 13312 v.AuxInt = c 13313 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 13314 v0.AuxInt = d 13315 v0.AddArg(x) 13316 v.AddArg(v0) 13317 v.AddArg(flags) 13318 return true 13319 } 13320 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 13321 // cond: 13322 // result: (RSCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 13323 for { 13324 d := v.AuxInt 13325 _ = v.Args[2] 13326 x := v.Args[0] 13327 v_1 := v.Args[1] 13328 if v_1.Op != OpARMMOVWconst { 13329 break 13330 } 13331 c := v_1.AuxInt 13332 flags := v.Args[2] 13333 v.reset(OpARMRSCconst) 13334 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 13335 v.AddArg(x) 13336 v.AddArg(flags) 13337 return true 13338 } 13339 return false 13340 } 13341 func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { 13342 b := v.Block 13343 _ = b 13344 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 13345 // cond: 13346 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 13347 for { 13348 _ = v.Args[3] 13349 v_0 := v.Args[0] 13350 if v_0.Op != OpARMMOVWconst { 13351 break 13352 } 13353 c := v_0.AuxInt 13354 x := v.Args[1] 13355 y := v.Args[2] 13356 flags := v.Args[3] 13357 v.reset(OpARMSBCconst) 13358 v.AuxInt = c 13359 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13360 v0.AddArg(x) 13361 v0.AddArg(y) 13362 v.AddArg(v0) 13363 v.AddArg(flags) 13364 return true 13365 } 13366 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 13367 // cond: 13368 // result: (RSCshiftLL x y [c] flags) 13369 for { 13370 _ = v.Args[3] 13371 x := v.Args[0] 13372 y := v.Args[1] 13373 v_2 := v.Args[2] 13374 if v_2.Op != OpARMMOVWconst { 13375 break 13376 } 13377 c := v_2.AuxInt 13378 flags := v.Args[3] 13379 v.reset(OpARMRSCshiftLL) 13380 v.AuxInt = c 13381 v.AddArg(x) 13382 v.AddArg(y) 13383 v.AddArg(flags) 13384 return true 13385 } 13386 return false 13387 } 13388 func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { 13389 b := v.Block 13390 _ = b 13391 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 13392 // cond: 13393 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 13394 for { 13395 d := v.AuxInt 13396 _ = v.Args[2] 13397 v_0 := v.Args[0] 13398 if v_0.Op != OpARMMOVWconst { 13399 break 13400 } 13401 c := v_0.AuxInt 13402 x := v.Args[1] 13403 flags := v.Args[2] 13404 v.reset(OpARMSBCconst) 13405 v.AuxInt = c 13406 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13407 v0.AuxInt = d 13408 v0.AddArg(x) 13409 v.AddArg(v0) 13410 v.AddArg(flags) 13411 return true 13412 } 13413 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 13414 // cond: 13415 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 13416 for { 13417 d := v.AuxInt 13418 _ = v.Args[2] 13419 x := v.Args[0] 13420 v_1 := v.Args[1] 13421 if v_1.Op != OpARMMOVWconst { 13422 break 13423 } 13424 c := v_1.AuxInt 13425 flags := v.Args[2] 13426 v.reset(OpARMRSCconst) 13427 v.AuxInt = int64(int32(c) >> uint64(d)) 13428 v.AddArg(x) 13429 v.AddArg(flags) 13430 return true 13431 } 13432 return false 13433 } 13434 func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { 13435 b := v.Block 13436 _ = b 13437 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 13438 // cond: 13439 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 13440 for { 13441 _ = v.Args[3] 13442 v_0 := v.Args[0] 13443 if v_0.Op != OpARMMOVWconst { 13444 break 13445 } 13446 c := v_0.AuxInt 13447 x := v.Args[1] 13448 y := v.Args[2] 13449 flags := v.Args[3] 13450 v.reset(OpARMSBCconst) 13451 v.AuxInt = c 13452 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13453 v0.AddArg(x) 13454 v0.AddArg(y) 13455 v.AddArg(v0) 13456 v.AddArg(flags) 13457 return true 13458 } 13459 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 13460 // cond: 13461 // result: (RSCshiftRA x y [c] flags) 13462 for { 13463 _ = v.Args[3] 13464 x := v.Args[0] 13465 y := v.Args[1] 13466 v_2 := v.Args[2] 13467 if v_2.Op != OpARMMOVWconst { 13468 break 13469 } 13470 c := v_2.AuxInt 13471 flags := v.Args[3] 13472 v.reset(OpARMRSCshiftRA) 13473 v.AuxInt = c 13474 v.AddArg(x) 13475 v.AddArg(y) 13476 v.AddArg(flags) 13477 return true 13478 } 13479 return false 13480 } 13481 func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { 13482 b := v.Block 13483 _ = b 13484 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 13485 // cond: 13486 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 13487 for { 13488 d := v.AuxInt 13489 _ = v.Args[2] 13490 v_0 := v.Args[0] 13491 if v_0.Op != OpARMMOVWconst { 13492 break 13493 } 13494 c := v_0.AuxInt 13495 x := v.Args[1] 13496 flags := v.Args[2] 13497 v.reset(OpARMSBCconst) 13498 v.AuxInt = c 13499 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13500 v0.AuxInt = d 13501 v0.AddArg(x) 13502 v.AddArg(v0) 13503 v.AddArg(flags) 13504 return true 13505 } 13506 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 13507 // cond: 13508 // result: (RSCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 13509 for { 13510 d := v.AuxInt 13511 _ = v.Args[2] 13512 x := v.Args[0] 13513 v_1 := v.Args[1] 13514 if v_1.Op != OpARMMOVWconst { 13515 break 13516 } 13517 c := v_1.AuxInt 13518 flags := v.Args[2] 13519 v.reset(OpARMRSCconst) 13520 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 13521 v.AddArg(x) 13522 v.AddArg(flags) 13523 return true 13524 } 13525 return false 13526 } 13527 func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { 13528 b := v.Block 13529 _ = b 13530 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 13531 // cond: 13532 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 13533 for { 13534 _ = v.Args[3] 13535 v_0 := v.Args[0] 13536 if v_0.Op != OpARMMOVWconst { 13537 break 13538 } 13539 c := v_0.AuxInt 13540 x := v.Args[1] 13541 y := v.Args[2] 13542 flags := v.Args[3] 13543 v.reset(OpARMSBCconst) 13544 v.AuxInt = c 13545 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13546 v0.AddArg(x) 13547 v0.AddArg(y) 13548 v.AddArg(v0) 13549 v.AddArg(flags) 13550 return true 13551 } 13552 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 13553 // cond: 13554 // result: (RSCshiftRL x y [c] flags) 13555 for { 13556 _ = v.Args[3] 13557 x := v.Args[0] 13558 y := v.Args[1] 13559 v_2 := v.Args[2] 13560 if v_2.Op != OpARMMOVWconst { 13561 break 13562 } 13563 c := v_2.AuxInt 13564 flags := v.Args[3] 13565 v.reset(OpARMRSCshiftRL) 13566 v.AuxInt = c 13567 v.AddArg(x) 13568 v.AddArg(y) 13569 v.AddArg(flags) 13570 return true 13571 } 13572 return false 13573 } 13574 func rewriteValueARM_OpARMSBC_0(v *Value) bool { 13575 // match: (SBC (MOVWconst [c]) x flags) 13576 // cond: 13577 // result: (RSCconst [c] x flags) 13578 for { 13579 _ = v.Args[2] 13580 v_0 := v.Args[0] 13581 if v_0.Op != OpARMMOVWconst { 13582 break 13583 } 13584 c := v_0.AuxInt 13585 x := v.Args[1] 13586 flags := v.Args[2] 13587 v.reset(OpARMRSCconst) 13588 v.AuxInt = c 13589 v.AddArg(x) 13590 v.AddArg(flags) 13591 return true 13592 } 13593 // match: (SBC x (MOVWconst [c]) flags) 13594 // cond: 13595 // result: (SBCconst [c] x flags) 13596 for { 13597 _ = v.Args[2] 13598 x := v.Args[0] 13599 v_1 := v.Args[1] 13600 if v_1.Op != OpARMMOVWconst { 13601 break 13602 } 13603 c := v_1.AuxInt 13604 flags := v.Args[2] 13605 v.reset(OpARMSBCconst) 13606 v.AuxInt = c 13607 v.AddArg(x) 13608 v.AddArg(flags) 13609 return true 13610 } 13611 // match: (SBC x (SLLconst [c] y) flags) 13612 // cond: 13613 // result: (SBCshiftLL x y [c] flags) 13614 for { 13615 _ = v.Args[2] 13616 x := v.Args[0] 13617 v_1 := v.Args[1] 13618 if v_1.Op != OpARMSLLconst { 13619 break 13620 } 13621 c := v_1.AuxInt 13622 y := v_1.Args[0] 13623 flags := v.Args[2] 13624 v.reset(OpARMSBCshiftLL) 13625 v.AuxInt = c 13626 v.AddArg(x) 13627 v.AddArg(y) 13628 v.AddArg(flags) 13629 return true 13630 } 13631 // match: (SBC (SLLconst [c] y) x flags) 13632 // cond: 13633 // result: (RSCshiftLL x y [c] flags) 13634 for { 13635 _ = v.Args[2] 13636 v_0 := v.Args[0] 13637 if v_0.Op != OpARMSLLconst { 13638 break 13639 } 13640 c := v_0.AuxInt 13641 y := v_0.Args[0] 13642 x := v.Args[1] 13643 flags := v.Args[2] 13644 v.reset(OpARMRSCshiftLL) 13645 v.AuxInt = c 13646 v.AddArg(x) 13647 v.AddArg(y) 13648 v.AddArg(flags) 13649 return true 13650 } 13651 // match: (SBC x (SRLconst [c] y) flags) 13652 // cond: 13653 // result: (SBCshiftRL x y [c] flags) 13654 for { 13655 _ = v.Args[2] 13656 x := v.Args[0] 13657 v_1 := v.Args[1] 13658 if v_1.Op != OpARMSRLconst { 13659 break 13660 } 13661 c := v_1.AuxInt 13662 y := v_1.Args[0] 13663 flags := v.Args[2] 13664 v.reset(OpARMSBCshiftRL) 13665 v.AuxInt = c 13666 v.AddArg(x) 13667 v.AddArg(y) 13668 v.AddArg(flags) 13669 return true 13670 } 13671 // match: (SBC (SRLconst [c] y) x flags) 13672 // cond: 13673 // result: (RSCshiftRL x y [c] flags) 13674 for { 13675 _ = v.Args[2] 13676 v_0 := v.Args[0] 13677 if v_0.Op != OpARMSRLconst { 13678 break 13679 } 13680 c := v_0.AuxInt 13681 y := v_0.Args[0] 13682 x := v.Args[1] 13683 flags := v.Args[2] 13684 v.reset(OpARMRSCshiftRL) 13685 v.AuxInt = c 13686 v.AddArg(x) 13687 v.AddArg(y) 13688 v.AddArg(flags) 13689 return true 13690 } 13691 // match: (SBC x (SRAconst [c] y) flags) 13692 // cond: 13693 // result: (SBCshiftRA x y [c] flags) 13694 for { 13695 _ = v.Args[2] 13696 x := v.Args[0] 13697 v_1 := v.Args[1] 13698 if v_1.Op != OpARMSRAconst { 13699 break 13700 } 13701 c := v_1.AuxInt 13702 y := v_1.Args[0] 13703 flags := v.Args[2] 13704 v.reset(OpARMSBCshiftRA) 13705 v.AuxInt = c 13706 v.AddArg(x) 13707 v.AddArg(y) 13708 v.AddArg(flags) 13709 return true 13710 } 13711 // match: (SBC (SRAconst [c] y) x flags) 13712 // cond: 13713 // result: (RSCshiftRA x y [c] flags) 13714 for { 13715 _ = v.Args[2] 13716 v_0 := v.Args[0] 13717 if v_0.Op != OpARMSRAconst { 13718 break 13719 } 13720 c := v_0.AuxInt 13721 y := v_0.Args[0] 13722 x := v.Args[1] 13723 flags := v.Args[2] 13724 v.reset(OpARMRSCshiftRA) 13725 v.AuxInt = c 13726 v.AddArg(x) 13727 v.AddArg(y) 13728 v.AddArg(flags) 13729 return true 13730 } 13731 // match: (SBC x (SLL y z) flags) 13732 // cond: 13733 // result: (SBCshiftLLreg x y z flags) 13734 for { 13735 _ = v.Args[2] 13736 x := v.Args[0] 13737 v_1 := v.Args[1] 13738 if v_1.Op != OpARMSLL { 13739 break 13740 } 13741 _ = v_1.Args[1] 13742 y := v_1.Args[0] 13743 z := v_1.Args[1] 13744 flags := v.Args[2] 13745 v.reset(OpARMSBCshiftLLreg) 13746 v.AddArg(x) 13747 v.AddArg(y) 13748 v.AddArg(z) 13749 v.AddArg(flags) 13750 return true 13751 } 13752 // match: (SBC (SLL y z) x flags) 13753 // cond: 13754 // result: (RSCshiftLLreg x y z flags) 13755 for { 13756 _ = v.Args[2] 13757 v_0 := v.Args[0] 13758 if v_0.Op != OpARMSLL { 13759 break 13760 } 13761 _ = v_0.Args[1] 13762 y := v_0.Args[0] 13763 z := v_0.Args[1] 13764 x := v.Args[1] 13765 flags := v.Args[2] 13766 v.reset(OpARMRSCshiftLLreg) 13767 v.AddArg(x) 13768 v.AddArg(y) 13769 v.AddArg(z) 13770 v.AddArg(flags) 13771 return true 13772 } 13773 return false 13774 } 13775 func rewriteValueARM_OpARMSBC_10(v *Value) bool { 13776 // match: (SBC x (SRL y z) flags) 13777 // cond: 13778 // result: (SBCshiftRLreg x y z flags) 13779 for { 13780 _ = v.Args[2] 13781 x := v.Args[0] 13782 v_1 := v.Args[1] 13783 if v_1.Op != OpARMSRL { 13784 break 13785 } 13786 _ = v_1.Args[1] 13787 y := v_1.Args[0] 13788 z := v_1.Args[1] 13789 flags := v.Args[2] 13790 v.reset(OpARMSBCshiftRLreg) 13791 v.AddArg(x) 13792 v.AddArg(y) 13793 v.AddArg(z) 13794 v.AddArg(flags) 13795 return true 13796 } 13797 // match: (SBC (SRL y z) x flags) 13798 // cond: 13799 // result: (RSCshiftRLreg x y z flags) 13800 for { 13801 _ = v.Args[2] 13802 v_0 := v.Args[0] 13803 if v_0.Op != OpARMSRL { 13804 break 13805 } 13806 _ = v_0.Args[1] 13807 y := v_0.Args[0] 13808 z := v_0.Args[1] 13809 x := v.Args[1] 13810 flags := v.Args[2] 13811 v.reset(OpARMRSCshiftRLreg) 13812 v.AddArg(x) 13813 v.AddArg(y) 13814 v.AddArg(z) 13815 v.AddArg(flags) 13816 return true 13817 } 13818 // match: (SBC x (SRA y z) flags) 13819 // cond: 13820 // result: (SBCshiftRAreg x y z flags) 13821 for { 13822 _ = v.Args[2] 13823 x := v.Args[0] 13824 v_1 := v.Args[1] 13825 if v_1.Op != OpARMSRA { 13826 break 13827 } 13828 _ = v_1.Args[1] 13829 y := v_1.Args[0] 13830 z := v_1.Args[1] 13831 flags := v.Args[2] 13832 v.reset(OpARMSBCshiftRAreg) 13833 v.AddArg(x) 13834 v.AddArg(y) 13835 v.AddArg(z) 13836 v.AddArg(flags) 13837 return true 13838 } 13839 // match: (SBC (SRA y z) x flags) 13840 // cond: 13841 // result: (RSCshiftRAreg x y z flags) 13842 for { 13843 _ = v.Args[2] 13844 v_0 := v.Args[0] 13845 if v_0.Op != OpARMSRA { 13846 break 13847 } 13848 _ = v_0.Args[1] 13849 y := v_0.Args[0] 13850 z := v_0.Args[1] 13851 x := v.Args[1] 13852 flags := v.Args[2] 13853 v.reset(OpARMRSCshiftRAreg) 13854 v.AddArg(x) 13855 v.AddArg(y) 13856 v.AddArg(z) 13857 v.AddArg(flags) 13858 return true 13859 } 13860 return false 13861 } 13862 func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { 13863 // match: (SBCconst [c] (ADDconst [d] x) flags) 13864 // cond: 13865 // result: (SBCconst [int64(int32(c-d))] x flags) 13866 for { 13867 c := v.AuxInt 13868 _ = v.Args[1] 13869 v_0 := v.Args[0] 13870 if v_0.Op != OpARMADDconst { 13871 break 13872 } 13873 d := v_0.AuxInt 13874 x := v_0.Args[0] 13875 flags := v.Args[1] 13876 v.reset(OpARMSBCconst) 13877 v.AuxInt = int64(int32(c - d)) 13878 v.AddArg(x) 13879 v.AddArg(flags) 13880 return true 13881 } 13882 // match: (SBCconst [c] (SUBconst [d] x) flags) 13883 // cond: 13884 // result: (SBCconst [int64(int32(c+d))] x flags) 13885 for { 13886 c := v.AuxInt 13887 _ = v.Args[1] 13888 v_0 := v.Args[0] 13889 if v_0.Op != OpARMSUBconst { 13890 break 13891 } 13892 d := v_0.AuxInt 13893 x := v_0.Args[0] 13894 flags := v.Args[1] 13895 v.reset(OpARMSBCconst) 13896 v.AuxInt = int64(int32(c + d)) 13897 v.AddArg(x) 13898 v.AddArg(flags) 13899 return true 13900 } 13901 return false 13902 } 13903 func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { 13904 b := v.Block 13905 _ = b 13906 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 13907 // cond: 13908 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 13909 for { 13910 d := v.AuxInt 13911 _ = v.Args[2] 13912 v_0 := v.Args[0] 13913 if v_0.Op != OpARMMOVWconst { 13914 break 13915 } 13916 c := v_0.AuxInt 13917 x := v.Args[1] 13918 flags := v.Args[2] 13919 v.reset(OpARMRSCconst) 13920 v.AuxInt = c 13921 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 13922 v0.AuxInt = d 13923 v0.AddArg(x) 13924 v.AddArg(v0) 13925 v.AddArg(flags) 13926 return true 13927 } 13928 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 13929 // cond: 13930 // result: (SBCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 13931 for { 13932 d := v.AuxInt 13933 _ = v.Args[2] 13934 x := v.Args[0] 13935 v_1 := v.Args[1] 13936 if v_1.Op != OpARMMOVWconst { 13937 break 13938 } 13939 c := v_1.AuxInt 13940 flags := v.Args[2] 13941 v.reset(OpARMSBCconst) 13942 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 13943 v.AddArg(x) 13944 v.AddArg(flags) 13945 return true 13946 } 13947 return false 13948 } 13949 func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { 13950 b := v.Block 13951 _ = b 13952 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 13953 // cond: 13954 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 13955 for { 13956 _ = v.Args[3] 13957 v_0 := v.Args[0] 13958 if v_0.Op != OpARMMOVWconst { 13959 break 13960 } 13961 c := v_0.AuxInt 13962 x := v.Args[1] 13963 y := v.Args[2] 13964 flags := v.Args[3] 13965 v.reset(OpARMRSCconst) 13966 v.AuxInt = c 13967 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13968 v0.AddArg(x) 13969 v0.AddArg(y) 13970 v.AddArg(v0) 13971 v.AddArg(flags) 13972 return true 13973 } 13974 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 13975 // cond: 13976 // result: (SBCshiftLL x y [c] flags) 13977 for { 13978 _ = v.Args[3] 13979 x := v.Args[0] 13980 y := v.Args[1] 13981 v_2 := v.Args[2] 13982 if v_2.Op != OpARMMOVWconst { 13983 break 13984 } 13985 c := v_2.AuxInt 13986 flags := v.Args[3] 13987 v.reset(OpARMSBCshiftLL) 13988 v.AuxInt = c 13989 v.AddArg(x) 13990 v.AddArg(y) 13991 v.AddArg(flags) 13992 return true 13993 } 13994 return false 13995 } 13996 func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { 13997 b := v.Block 13998 _ = b 13999 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 14000 // cond: 14001 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 14002 for { 14003 d := v.AuxInt 14004 _ = v.Args[2] 14005 v_0 := v.Args[0] 14006 if v_0.Op != OpARMMOVWconst { 14007 break 14008 } 14009 c := v_0.AuxInt 14010 x := v.Args[1] 14011 flags := v.Args[2] 14012 v.reset(OpARMRSCconst) 14013 v.AuxInt = c 14014 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 14015 v0.AuxInt = d 14016 v0.AddArg(x) 14017 v.AddArg(v0) 14018 v.AddArg(flags) 14019 return true 14020 } 14021 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 14022 // cond: 14023 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 14024 for { 14025 d := v.AuxInt 14026 _ = v.Args[2] 14027 x := v.Args[0] 14028 v_1 := v.Args[1] 14029 if v_1.Op != OpARMMOVWconst { 14030 break 14031 } 14032 c := v_1.AuxInt 14033 flags := v.Args[2] 14034 v.reset(OpARMSBCconst) 14035 v.AuxInt = int64(int32(c) >> uint64(d)) 14036 v.AddArg(x) 14037 v.AddArg(flags) 14038 return true 14039 } 14040 return false 14041 } 14042 func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { 14043 b := v.Block 14044 _ = b 14045 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 14046 // cond: 14047 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 14048 for { 14049 _ = v.Args[3] 14050 v_0 := v.Args[0] 14051 if v_0.Op != OpARMMOVWconst { 14052 break 14053 } 14054 c := v_0.AuxInt 14055 x := v.Args[1] 14056 y := v.Args[2] 14057 flags := v.Args[3] 14058 v.reset(OpARMRSCconst) 14059 v.AuxInt = c 14060 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 14061 v0.AddArg(x) 14062 v0.AddArg(y) 14063 v.AddArg(v0) 14064 v.AddArg(flags) 14065 return true 14066 } 14067 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 14068 // cond: 14069 // result: (SBCshiftRA x y [c] flags) 14070 for { 14071 _ = v.Args[3] 14072 x := v.Args[0] 14073 y := v.Args[1] 14074 v_2 := v.Args[2] 14075 if v_2.Op != OpARMMOVWconst { 14076 break 14077 } 14078 c := v_2.AuxInt 14079 flags := v.Args[3] 14080 v.reset(OpARMSBCshiftRA) 14081 v.AuxInt = c 14082 v.AddArg(x) 14083 v.AddArg(y) 14084 v.AddArg(flags) 14085 return true 14086 } 14087 return false 14088 } 14089 func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { 14090 b := v.Block 14091 _ = b 14092 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 14093 // cond: 14094 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 14095 for { 14096 d := v.AuxInt 14097 _ = v.Args[2] 14098 v_0 := v.Args[0] 14099 if v_0.Op != OpARMMOVWconst { 14100 break 14101 } 14102 c := v_0.AuxInt 14103 x := v.Args[1] 14104 flags := v.Args[2] 14105 v.reset(OpARMRSCconst) 14106 v.AuxInt = c 14107 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 14108 v0.AuxInt = d 14109 v0.AddArg(x) 14110 v.AddArg(v0) 14111 v.AddArg(flags) 14112 return true 14113 } 14114 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 14115 // cond: 14116 // result: (SBCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 14117 for { 14118 d := v.AuxInt 14119 _ = v.Args[2] 14120 x := v.Args[0] 14121 v_1 := v.Args[1] 14122 if v_1.Op != OpARMMOVWconst { 14123 break 14124 } 14125 c := v_1.AuxInt 14126 flags := v.Args[2] 14127 v.reset(OpARMSBCconst) 14128 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 14129 v.AddArg(x) 14130 v.AddArg(flags) 14131 return true 14132 } 14133 return false 14134 } 14135 func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { 14136 b := v.Block 14137 _ = b 14138 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 14139 // cond: 14140 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 14141 for { 14142 _ = v.Args[3] 14143 v_0 := v.Args[0] 14144 if v_0.Op != OpARMMOVWconst { 14145 break 14146 } 14147 c := v_0.AuxInt 14148 x := v.Args[1] 14149 y := v.Args[2] 14150 flags := v.Args[3] 14151 v.reset(OpARMRSCconst) 14152 v.AuxInt = c 14153 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 14154 v0.AddArg(x) 14155 v0.AddArg(y) 14156 v.AddArg(v0) 14157 v.AddArg(flags) 14158 return true 14159 } 14160 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 14161 // cond: 14162 // result: (SBCshiftRL x y [c] flags) 14163 for { 14164 _ = v.Args[3] 14165 x := v.Args[0] 14166 y := v.Args[1] 14167 v_2 := v.Args[2] 14168 if v_2.Op != OpARMMOVWconst { 14169 break 14170 } 14171 c := v_2.AuxInt 14172 flags := v.Args[3] 14173 v.reset(OpARMSBCshiftRL) 14174 v.AuxInt = c 14175 v.AddArg(x) 14176 v.AddArg(y) 14177 v.AddArg(flags) 14178 return true 14179 } 14180 return false 14181 } 14182 func rewriteValueARM_OpARMSLL_0(v *Value) bool { 14183 // match: (SLL x (MOVWconst [c])) 14184 // cond: 14185 // result: (SLLconst x [c&31]) 14186 for { 14187 _ = v.Args[1] 14188 x := v.Args[0] 14189 v_1 := v.Args[1] 14190 if v_1.Op != OpARMMOVWconst { 14191 break 14192 } 14193 c := v_1.AuxInt 14194 v.reset(OpARMSLLconst) 14195 v.AuxInt = c & 31 14196 v.AddArg(x) 14197 return true 14198 } 14199 return false 14200 } 14201 func rewriteValueARM_OpARMSLLconst_0(v *Value) bool { 14202 // match: (SLLconst [c] (MOVWconst [d])) 14203 // cond: 14204 // result: (MOVWconst [int64(int32(uint32(d)<<uint64(c)))]) 14205 for { 14206 c := v.AuxInt 14207 v_0 := v.Args[0] 14208 if v_0.Op != OpARMMOVWconst { 14209 break 14210 } 14211 d := v_0.AuxInt 14212 v.reset(OpARMMOVWconst) 14213 v.AuxInt = int64(int32(uint32(d) << uint64(c))) 14214 return true 14215 } 14216 return false 14217 } 14218 func rewriteValueARM_OpARMSRA_0(v *Value) bool { 14219 // match: (SRA x (MOVWconst [c])) 14220 // cond: 14221 // result: (SRAconst x [c&31]) 14222 for { 14223 _ = v.Args[1] 14224 x := v.Args[0] 14225 v_1 := v.Args[1] 14226 if v_1.Op != OpARMMOVWconst { 14227 break 14228 } 14229 c := v_1.AuxInt 14230 v.reset(OpARMSRAconst) 14231 v.AuxInt = c & 31 14232 v.AddArg(x) 14233 return true 14234 } 14235 return false 14236 } 14237 func rewriteValueARM_OpARMSRAcond_0(v *Value) bool { 14238 // match: (SRAcond x _ (FlagEQ)) 14239 // cond: 14240 // result: (SRAconst x [31]) 14241 for { 14242 _ = v.Args[2] 14243 x := v.Args[0] 14244 v_2 := v.Args[2] 14245 if v_2.Op != OpARMFlagEQ { 14246 break 14247 } 14248 v.reset(OpARMSRAconst) 14249 v.AuxInt = 31 14250 v.AddArg(x) 14251 return true 14252 } 14253 // match: (SRAcond x y (FlagLT_ULT)) 14254 // cond: 14255 // result: (SRA x y) 14256 for { 14257 _ = v.Args[2] 14258 x := v.Args[0] 14259 y := v.Args[1] 14260 v_2 := v.Args[2] 14261 if v_2.Op != OpARMFlagLT_ULT { 14262 break 14263 } 14264 v.reset(OpARMSRA) 14265 v.AddArg(x) 14266 v.AddArg(y) 14267 return true 14268 } 14269 // match: (SRAcond x _ (FlagLT_UGT)) 14270 // cond: 14271 // result: (SRAconst x [31]) 14272 for { 14273 _ = v.Args[2] 14274 x := v.Args[0] 14275 v_2 := v.Args[2] 14276 if v_2.Op != OpARMFlagLT_UGT { 14277 break 14278 } 14279 v.reset(OpARMSRAconst) 14280 v.AuxInt = 31 14281 v.AddArg(x) 14282 return true 14283 } 14284 // match: (SRAcond x y (FlagGT_ULT)) 14285 // cond: 14286 // result: (SRA x y) 14287 for { 14288 _ = v.Args[2] 14289 x := v.Args[0] 14290 y := v.Args[1] 14291 v_2 := v.Args[2] 14292 if v_2.Op != OpARMFlagGT_ULT { 14293 break 14294 } 14295 v.reset(OpARMSRA) 14296 v.AddArg(x) 14297 v.AddArg(y) 14298 return true 14299 } 14300 // match: (SRAcond x _ (FlagGT_UGT)) 14301 // cond: 14302 // result: (SRAconst x [31]) 14303 for { 14304 _ = v.Args[2] 14305 x := v.Args[0] 14306 v_2 := v.Args[2] 14307 if v_2.Op != OpARMFlagGT_UGT { 14308 break 14309 } 14310 v.reset(OpARMSRAconst) 14311 v.AuxInt = 31 14312 v.AddArg(x) 14313 return true 14314 } 14315 return false 14316 } 14317 func rewriteValueARM_OpARMSRAconst_0(v *Value) bool { 14318 // match: (SRAconst [c] (MOVWconst [d])) 14319 // cond: 14320 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 14321 for { 14322 c := v.AuxInt 14323 v_0 := v.Args[0] 14324 if v_0.Op != OpARMMOVWconst { 14325 break 14326 } 14327 d := v_0.AuxInt 14328 v.reset(OpARMMOVWconst) 14329 v.AuxInt = int64(int32(d) >> uint64(c)) 14330 return true 14331 } 14332 // match: (SRAconst (SLLconst x [c]) [d]) 14333 // cond: objabi.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 14334 // result: (BFX [(d-c)|(32-d)<<8] x) 14335 for { 14336 d := v.AuxInt 14337 v_0 := v.Args[0] 14338 if v_0.Op != OpARMSLLconst { 14339 break 14340 } 14341 c := v_0.AuxInt 14342 x := v_0.Args[0] 14343 if !(objabi.GOARM == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 14344 break 14345 } 14346 v.reset(OpARMBFX) 14347 v.AuxInt = (d - c) | (32-d)<<8 14348 v.AddArg(x) 14349 return true 14350 } 14351 return false 14352 } 14353 func rewriteValueARM_OpARMSRL_0(v *Value) bool { 14354 // match: (SRL x (MOVWconst [c])) 14355 // cond: 14356 // result: (SRLconst x [c&31]) 14357 for { 14358 _ = v.Args[1] 14359 x := v.Args[0] 14360 v_1 := v.Args[1] 14361 if v_1.Op != OpARMMOVWconst { 14362 break 14363 } 14364 c := v_1.AuxInt 14365 v.reset(OpARMSRLconst) 14366 v.AuxInt = c & 31 14367 v.AddArg(x) 14368 return true 14369 } 14370 return false 14371 } 14372 func rewriteValueARM_OpARMSRLconst_0(v *Value) bool { 14373 // match: (SRLconst [c] (MOVWconst [d])) 14374 // cond: 14375 // result: (MOVWconst [int64(int32(uint32(d)>>uint64(c)))]) 14376 for { 14377 c := v.AuxInt 14378 v_0 := v.Args[0] 14379 if v_0.Op != OpARMMOVWconst { 14380 break 14381 } 14382 d := v_0.AuxInt 14383 v.reset(OpARMMOVWconst) 14384 v.AuxInt = int64(int32(uint32(d) >> uint64(c))) 14385 return true 14386 } 14387 // match: (SRLconst (SLLconst x [c]) [d]) 14388 // cond: objabi.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 14389 // result: (BFXU [(d-c)|(32-d)<<8] x) 14390 for { 14391 d := v.AuxInt 14392 v_0 := v.Args[0] 14393 if v_0.Op != OpARMSLLconst { 14394 break 14395 } 14396 c := v_0.AuxInt 14397 x := v_0.Args[0] 14398 if !(objabi.GOARM == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 14399 break 14400 } 14401 v.reset(OpARMBFXU) 14402 v.AuxInt = (d - c) | (32-d)<<8 14403 v.AddArg(x) 14404 return true 14405 } 14406 return false 14407 } 14408 func rewriteValueARM_OpARMSUB_0(v *Value) bool { 14409 // match: (SUB (MOVWconst [c]) x) 14410 // cond: 14411 // result: (RSBconst [c] x) 14412 for { 14413 _ = v.Args[1] 14414 v_0 := v.Args[0] 14415 if v_0.Op != OpARMMOVWconst { 14416 break 14417 } 14418 c := v_0.AuxInt 14419 x := v.Args[1] 14420 v.reset(OpARMRSBconst) 14421 v.AuxInt = c 14422 v.AddArg(x) 14423 return true 14424 } 14425 // match: (SUB x (MOVWconst [c])) 14426 // cond: 14427 // result: (SUBconst [c] x) 14428 for { 14429 _ = v.Args[1] 14430 x := v.Args[0] 14431 v_1 := v.Args[1] 14432 if v_1.Op != OpARMMOVWconst { 14433 break 14434 } 14435 c := v_1.AuxInt 14436 v.reset(OpARMSUBconst) 14437 v.AuxInt = c 14438 v.AddArg(x) 14439 return true 14440 } 14441 // match: (SUB x (SLLconst [c] y)) 14442 // cond: 14443 // result: (SUBshiftLL x y [c]) 14444 for { 14445 _ = v.Args[1] 14446 x := v.Args[0] 14447 v_1 := v.Args[1] 14448 if v_1.Op != OpARMSLLconst { 14449 break 14450 } 14451 c := v_1.AuxInt 14452 y := v_1.Args[0] 14453 v.reset(OpARMSUBshiftLL) 14454 v.AuxInt = c 14455 v.AddArg(x) 14456 v.AddArg(y) 14457 return true 14458 } 14459 // match: (SUB (SLLconst [c] y) x) 14460 // cond: 14461 // result: (RSBshiftLL x y [c]) 14462 for { 14463 _ = v.Args[1] 14464 v_0 := v.Args[0] 14465 if v_0.Op != OpARMSLLconst { 14466 break 14467 } 14468 c := v_0.AuxInt 14469 y := v_0.Args[0] 14470 x := v.Args[1] 14471 v.reset(OpARMRSBshiftLL) 14472 v.AuxInt = c 14473 v.AddArg(x) 14474 v.AddArg(y) 14475 return true 14476 } 14477 // match: (SUB x (SRLconst [c] y)) 14478 // cond: 14479 // result: (SUBshiftRL x y [c]) 14480 for { 14481 _ = v.Args[1] 14482 x := v.Args[0] 14483 v_1 := v.Args[1] 14484 if v_1.Op != OpARMSRLconst { 14485 break 14486 } 14487 c := v_1.AuxInt 14488 y := v_1.Args[0] 14489 v.reset(OpARMSUBshiftRL) 14490 v.AuxInt = c 14491 v.AddArg(x) 14492 v.AddArg(y) 14493 return true 14494 } 14495 // match: (SUB (SRLconst [c] y) x) 14496 // cond: 14497 // result: (RSBshiftRL x y [c]) 14498 for { 14499 _ = v.Args[1] 14500 v_0 := v.Args[0] 14501 if v_0.Op != OpARMSRLconst { 14502 break 14503 } 14504 c := v_0.AuxInt 14505 y := v_0.Args[0] 14506 x := v.Args[1] 14507 v.reset(OpARMRSBshiftRL) 14508 v.AuxInt = c 14509 v.AddArg(x) 14510 v.AddArg(y) 14511 return true 14512 } 14513 // match: (SUB x (SRAconst [c] y)) 14514 // cond: 14515 // result: (SUBshiftRA x y [c]) 14516 for { 14517 _ = v.Args[1] 14518 x := v.Args[0] 14519 v_1 := v.Args[1] 14520 if v_1.Op != OpARMSRAconst { 14521 break 14522 } 14523 c := v_1.AuxInt 14524 y := v_1.Args[0] 14525 v.reset(OpARMSUBshiftRA) 14526 v.AuxInt = c 14527 v.AddArg(x) 14528 v.AddArg(y) 14529 return true 14530 } 14531 // match: (SUB (SRAconst [c] y) x) 14532 // cond: 14533 // result: (RSBshiftRA x y [c]) 14534 for { 14535 _ = v.Args[1] 14536 v_0 := v.Args[0] 14537 if v_0.Op != OpARMSRAconst { 14538 break 14539 } 14540 c := v_0.AuxInt 14541 y := v_0.Args[0] 14542 x := v.Args[1] 14543 v.reset(OpARMRSBshiftRA) 14544 v.AuxInt = c 14545 v.AddArg(x) 14546 v.AddArg(y) 14547 return true 14548 } 14549 // match: (SUB x (SLL y z)) 14550 // cond: 14551 // result: (SUBshiftLLreg x y z) 14552 for { 14553 _ = v.Args[1] 14554 x := v.Args[0] 14555 v_1 := v.Args[1] 14556 if v_1.Op != OpARMSLL { 14557 break 14558 } 14559 _ = v_1.Args[1] 14560 y := v_1.Args[0] 14561 z := v_1.Args[1] 14562 v.reset(OpARMSUBshiftLLreg) 14563 v.AddArg(x) 14564 v.AddArg(y) 14565 v.AddArg(z) 14566 return true 14567 } 14568 // match: (SUB (SLL y z) x) 14569 // cond: 14570 // result: (RSBshiftLLreg x y z) 14571 for { 14572 _ = v.Args[1] 14573 v_0 := v.Args[0] 14574 if v_0.Op != OpARMSLL { 14575 break 14576 } 14577 _ = v_0.Args[1] 14578 y := v_0.Args[0] 14579 z := v_0.Args[1] 14580 x := v.Args[1] 14581 v.reset(OpARMRSBshiftLLreg) 14582 v.AddArg(x) 14583 v.AddArg(y) 14584 v.AddArg(z) 14585 return true 14586 } 14587 return false 14588 } 14589 func rewriteValueARM_OpARMSUB_10(v *Value) bool { 14590 // match: (SUB x (SRL y z)) 14591 // cond: 14592 // result: (SUBshiftRLreg x y z) 14593 for { 14594 _ = v.Args[1] 14595 x := v.Args[0] 14596 v_1 := v.Args[1] 14597 if v_1.Op != OpARMSRL { 14598 break 14599 } 14600 _ = v_1.Args[1] 14601 y := v_1.Args[0] 14602 z := v_1.Args[1] 14603 v.reset(OpARMSUBshiftRLreg) 14604 v.AddArg(x) 14605 v.AddArg(y) 14606 v.AddArg(z) 14607 return true 14608 } 14609 // match: (SUB (SRL y z) x) 14610 // cond: 14611 // result: (RSBshiftRLreg x y z) 14612 for { 14613 _ = v.Args[1] 14614 v_0 := v.Args[0] 14615 if v_0.Op != OpARMSRL { 14616 break 14617 } 14618 _ = v_0.Args[1] 14619 y := v_0.Args[0] 14620 z := v_0.Args[1] 14621 x := v.Args[1] 14622 v.reset(OpARMRSBshiftRLreg) 14623 v.AddArg(x) 14624 v.AddArg(y) 14625 v.AddArg(z) 14626 return true 14627 } 14628 // match: (SUB x (SRA y z)) 14629 // cond: 14630 // result: (SUBshiftRAreg x y z) 14631 for { 14632 _ = v.Args[1] 14633 x := v.Args[0] 14634 v_1 := v.Args[1] 14635 if v_1.Op != OpARMSRA { 14636 break 14637 } 14638 _ = v_1.Args[1] 14639 y := v_1.Args[0] 14640 z := v_1.Args[1] 14641 v.reset(OpARMSUBshiftRAreg) 14642 v.AddArg(x) 14643 v.AddArg(y) 14644 v.AddArg(z) 14645 return true 14646 } 14647 // match: (SUB (SRA y z) x) 14648 // cond: 14649 // result: (RSBshiftRAreg x y z) 14650 for { 14651 _ = v.Args[1] 14652 v_0 := v.Args[0] 14653 if v_0.Op != OpARMSRA { 14654 break 14655 } 14656 _ = v_0.Args[1] 14657 y := v_0.Args[0] 14658 z := v_0.Args[1] 14659 x := v.Args[1] 14660 v.reset(OpARMRSBshiftRAreg) 14661 v.AddArg(x) 14662 v.AddArg(y) 14663 v.AddArg(z) 14664 return true 14665 } 14666 // match: (SUB x x) 14667 // cond: 14668 // result: (MOVWconst [0]) 14669 for { 14670 _ = v.Args[1] 14671 x := v.Args[0] 14672 if x != v.Args[1] { 14673 break 14674 } 14675 v.reset(OpARMMOVWconst) 14676 v.AuxInt = 0 14677 return true 14678 } 14679 // match: (SUB a (MUL x y)) 14680 // cond: objabi.GOARM == 7 14681 // result: (MULS x y a) 14682 for { 14683 _ = v.Args[1] 14684 a := v.Args[0] 14685 v_1 := v.Args[1] 14686 if v_1.Op != OpARMMUL { 14687 break 14688 } 14689 _ = v_1.Args[1] 14690 x := v_1.Args[0] 14691 y := v_1.Args[1] 14692 if !(objabi.GOARM == 7) { 14693 break 14694 } 14695 v.reset(OpARMMULS) 14696 v.AddArg(x) 14697 v.AddArg(y) 14698 v.AddArg(a) 14699 return true 14700 } 14701 return false 14702 } 14703 func rewriteValueARM_OpARMSUBD_0(v *Value) bool { 14704 // match: (SUBD a (MULD x y)) 14705 // cond: a.Uses == 1 && objabi.GOARM >= 6 14706 // result: (MULSD a x y) 14707 for { 14708 _ = v.Args[1] 14709 a := v.Args[0] 14710 v_1 := v.Args[1] 14711 if v_1.Op != OpARMMULD { 14712 break 14713 } 14714 _ = v_1.Args[1] 14715 x := v_1.Args[0] 14716 y := v_1.Args[1] 14717 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14718 break 14719 } 14720 v.reset(OpARMMULSD) 14721 v.AddArg(a) 14722 v.AddArg(x) 14723 v.AddArg(y) 14724 return true 14725 } 14726 // match: (SUBD a (NMULD x y)) 14727 // cond: a.Uses == 1 && objabi.GOARM >= 6 14728 // result: (MULAD a x y) 14729 for { 14730 _ = v.Args[1] 14731 a := v.Args[0] 14732 v_1 := v.Args[1] 14733 if v_1.Op != OpARMNMULD { 14734 break 14735 } 14736 _ = v_1.Args[1] 14737 x := v_1.Args[0] 14738 y := v_1.Args[1] 14739 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14740 break 14741 } 14742 v.reset(OpARMMULAD) 14743 v.AddArg(a) 14744 v.AddArg(x) 14745 v.AddArg(y) 14746 return true 14747 } 14748 return false 14749 } 14750 func rewriteValueARM_OpARMSUBF_0(v *Value) bool { 14751 // match: (SUBF a (MULF x y)) 14752 // cond: a.Uses == 1 && objabi.GOARM >= 6 14753 // result: (MULSF a x y) 14754 for { 14755 _ = v.Args[1] 14756 a := v.Args[0] 14757 v_1 := v.Args[1] 14758 if v_1.Op != OpARMMULF { 14759 break 14760 } 14761 _ = v_1.Args[1] 14762 x := v_1.Args[0] 14763 y := v_1.Args[1] 14764 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14765 break 14766 } 14767 v.reset(OpARMMULSF) 14768 v.AddArg(a) 14769 v.AddArg(x) 14770 v.AddArg(y) 14771 return true 14772 } 14773 // match: (SUBF a (NMULF x y)) 14774 // cond: a.Uses == 1 && objabi.GOARM >= 6 14775 // result: (MULAF a x y) 14776 for { 14777 _ = v.Args[1] 14778 a := v.Args[0] 14779 v_1 := v.Args[1] 14780 if v_1.Op != OpARMNMULF { 14781 break 14782 } 14783 _ = v_1.Args[1] 14784 x := v_1.Args[0] 14785 y := v_1.Args[1] 14786 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14787 break 14788 } 14789 v.reset(OpARMMULAF) 14790 v.AddArg(a) 14791 v.AddArg(x) 14792 v.AddArg(y) 14793 return true 14794 } 14795 return false 14796 } 14797 func rewriteValueARM_OpARMSUBS_0(v *Value) bool { 14798 // match: (SUBS x (MOVWconst [c])) 14799 // cond: 14800 // result: (SUBSconst [c] x) 14801 for { 14802 _ = v.Args[1] 14803 x := v.Args[0] 14804 v_1 := v.Args[1] 14805 if v_1.Op != OpARMMOVWconst { 14806 break 14807 } 14808 c := v_1.AuxInt 14809 v.reset(OpARMSUBSconst) 14810 v.AuxInt = c 14811 v.AddArg(x) 14812 return true 14813 } 14814 // match: (SUBS x (SLLconst [c] y)) 14815 // cond: 14816 // result: (SUBSshiftLL x y [c]) 14817 for { 14818 _ = v.Args[1] 14819 x := v.Args[0] 14820 v_1 := v.Args[1] 14821 if v_1.Op != OpARMSLLconst { 14822 break 14823 } 14824 c := v_1.AuxInt 14825 y := v_1.Args[0] 14826 v.reset(OpARMSUBSshiftLL) 14827 v.AuxInt = c 14828 v.AddArg(x) 14829 v.AddArg(y) 14830 return true 14831 } 14832 // match: (SUBS (SLLconst [c] y) x) 14833 // cond: 14834 // result: (RSBSshiftLL x y [c]) 14835 for { 14836 _ = v.Args[1] 14837 v_0 := v.Args[0] 14838 if v_0.Op != OpARMSLLconst { 14839 break 14840 } 14841 c := v_0.AuxInt 14842 y := v_0.Args[0] 14843 x := v.Args[1] 14844 v.reset(OpARMRSBSshiftLL) 14845 v.AuxInt = c 14846 v.AddArg(x) 14847 v.AddArg(y) 14848 return true 14849 } 14850 // match: (SUBS x (SRLconst [c] y)) 14851 // cond: 14852 // result: (SUBSshiftRL x y [c]) 14853 for { 14854 _ = v.Args[1] 14855 x := v.Args[0] 14856 v_1 := v.Args[1] 14857 if v_1.Op != OpARMSRLconst { 14858 break 14859 } 14860 c := v_1.AuxInt 14861 y := v_1.Args[0] 14862 v.reset(OpARMSUBSshiftRL) 14863 v.AuxInt = c 14864 v.AddArg(x) 14865 v.AddArg(y) 14866 return true 14867 } 14868 // match: (SUBS (SRLconst [c] y) x) 14869 // cond: 14870 // result: (RSBSshiftRL x y [c]) 14871 for { 14872 _ = v.Args[1] 14873 v_0 := v.Args[0] 14874 if v_0.Op != OpARMSRLconst { 14875 break 14876 } 14877 c := v_0.AuxInt 14878 y := v_0.Args[0] 14879 x := v.Args[1] 14880 v.reset(OpARMRSBSshiftRL) 14881 v.AuxInt = c 14882 v.AddArg(x) 14883 v.AddArg(y) 14884 return true 14885 } 14886 // match: (SUBS x (SRAconst [c] y)) 14887 // cond: 14888 // result: (SUBSshiftRA x y [c]) 14889 for { 14890 _ = v.Args[1] 14891 x := v.Args[0] 14892 v_1 := v.Args[1] 14893 if v_1.Op != OpARMSRAconst { 14894 break 14895 } 14896 c := v_1.AuxInt 14897 y := v_1.Args[0] 14898 v.reset(OpARMSUBSshiftRA) 14899 v.AuxInt = c 14900 v.AddArg(x) 14901 v.AddArg(y) 14902 return true 14903 } 14904 // match: (SUBS (SRAconst [c] y) x) 14905 // cond: 14906 // result: (RSBSshiftRA x y [c]) 14907 for { 14908 _ = v.Args[1] 14909 v_0 := v.Args[0] 14910 if v_0.Op != OpARMSRAconst { 14911 break 14912 } 14913 c := v_0.AuxInt 14914 y := v_0.Args[0] 14915 x := v.Args[1] 14916 v.reset(OpARMRSBSshiftRA) 14917 v.AuxInt = c 14918 v.AddArg(x) 14919 v.AddArg(y) 14920 return true 14921 } 14922 // match: (SUBS x (SLL y z)) 14923 // cond: 14924 // result: (SUBSshiftLLreg x y z) 14925 for { 14926 _ = v.Args[1] 14927 x := v.Args[0] 14928 v_1 := v.Args[1] 14929 if v_1.Op != OpARMSLL { 14930 break 14931 } 14932 _ = v_1.Args[1] 14933 y := v_1.Args[0] 14934 z := v_1.Args[1] 14935 v.reset(OpARMSUBSshiftLLreg) 14936 v.AddArg(x) 14937 v.AddArg(y) 14938 v.AddArg(z) 14939 return true 14940 } 14941 // match: (SUBS (SLL y z) x) 14942 // cond: 14943 // result: (RSBSshiftLLreg x y z) 14944 for { 14945 _ = v.Args[1] 14946 v_0 := v.Args[0] 14947 if v_0.Op != OpARMSLL { 14948 break 14949 } 14950 _ = v_0.Args[1] 14951 y := v_0.Args[0] 14952 z := v_0.Args[1] 14953 x := v.Args[1] 14954 v.reset(OpARMRSBSshiftLLreg) 14955 v.AddArg(x) 14956 v.AddArg(y) 14957 v.AddArg(z) 14958 return true 14959 } 14960 // match: (SUBS x (SRL y z)) 14961 // cond: 14962 // result: (SUBSshiftRLreg x y z) 14963 for { 14964 _ = v.Args[1] 14965 x := v.Args[0] 14966 v_1 := v.Args[1] 14967 if v_1.Op != OpARMSRL { 14968 break 14969 } 14970 _ = v_1.Args[1] 14971 y := v_1.Args[0] 14972 z := v_1.Args[1] 14973 v.reset(OpARMSUBSshiftRLreg) 14974 v.AddArg(x) 14975 v.AddArg(y) 14976 v.AddArg(z) 14977 return true 14978 } 14979 return false 14980 } 14981 func rewriteValueARM_OpARMSUBS_10(v *Value) bool { 14982 // match: (SUBS (SRL y z) x) 14983 // cond: 14984 // result: (RSBSshiftRLreg x y z) 14985 for { 14986 _ = v.Args[1] 14987 v_0 := v.Args[0] 14988 if v_0.Op != OpARMSRL { 14989 break 14990 } 14991 _ = v_0.Args[1] 14992 y := v_0.Args[0] 14993 z := v_0.Args[1] 14994 x := v.Args[1] 14995 v.reset(OpARMRSBSshiftRLreg) 14996 v.AddArg(x) 14997 v.AddArg(y) 14998 v.AddArg(z) 14999 return true 15000 } 15001 // match: (SUBS x (SRA y z)) 15002 // cond: 15003 // result: (SUBSshiftRAreg x y z) 15004 for { 15005 _ = v.Args[1] 15006 x := v.Args[0] 15007 v_1 := v.Args[1] 15008 if v_1.Op != OpARMSRA { 15009 break 15010 } 15011 _ = v_1.Args[1] 15012 y := v_1.Args[0] 15013 z := v_1.Args[1] 15014 v.reset(OpARMSUBSshiftRAreg) 15015 v.AddArg(x) 15016 v.AddArg(y) 15017 v.AddArg(z) 15018 return true 15019 } 15020 // match: (SUBS (SRA y z) x) 15021 // cond: 15022 // result: (RSBSshiftRAreg x y z) 15023 for { 15024 _ = v.Args[1] 15025 v_0 := v.Args[0] 15026 if v_0.Op != OpARMSRA { 15027 break 15028 } 15029 _ = v_0.Args[1] 15030 y := v_0.Args[0] 15031 z := v_0.Args[1] 15032 x := v.Args[1] 15033 v.reset(OpARMRSBSshiftRAreg) 15034 v.AddArg(x) 15035 v.AddArg(y) 15036 v.AddArg(z) 15037 return true 15038 } 15039 return false 15040 } 15041 func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { 15042 b := v.Block 15043 _ = b 15044 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 15045 // cond: 15046 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 15047 for { 15048 d := v.AuxInt 15049 _ = v.Args[1] 15050 v_0 := v.Args[0] 15051 if v_0.Op != OpARMMOVWconst { 15052 break 15053 } 15054 c := v_0.AuxInt 15055 x := v.Args[1] 15056 v.reset(OpARMRSBSconst) 15057 v.AuxInt = c 15058 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 15059 v0.AuxInt = d 15060 v0.AddArg(x) 15061 v.AddArg(v0) 15062 return true 15063 } 15064 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 15065 // cond: 15066 // result: (SUBSconst x [int64(int32(uint32(c)<<uint64(d)))]) 15067 for { 15068 d := v.AuxInt 15069 _ = v.Args[1] 15070 x := v.Args[0] 15071 v_1 := v.Args[1] 15072 if v_1.Op != OpARMMOVWconst { 15073 break 15074 } 15075 c := v_1.AuxInt 15076 v.reset(OpARMSUBSconst) 15077 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 15078 v.AddArg(x) 15079 return true 15080 } 15081 return false 15082 } 15083 func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { 15084 b := v.Block 15085 _ = b 15086 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 15087 // cond: 15088 // result: (RSBSconst [c] (SLL <x.Type> x y)) 15089 for { 15090 _ = v.Args[2] 15091 v_0 := v.Args[0] 15092 if v_0.Op != OpARMMOVWconst { 15093 break 15094 } 15095 c := v_0.AuxInt 15096 x := v.Args[1] 15097 y := v.Args[2] 15098 v.reset(OpARMRSBSconst) 15099 v.AuxInt = c 15100 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15101 v0.AddArg(x) 15102 v0.AddArg(y) 15103 v.AddArg(v0) 15104 return true 15105 } 15106 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 15107 // cond: 15108 // result: (SUBSshiftLL x y [c]) 15109 for { 15110 _ = v.Args[2] 15111 x := v.Args[0] 15112 y := v.Args[1] 15113 v_2 := v.Args[2] 15114 if v_2.Op != OpARMMOVWconst { 15115 break 15116 } 15117 c := v_2.AuxInt 15118 v.reset(OpARMSUBSshiftLL) 15119 v.AuxInt = c 15120 v.AddArg(x) 15121 v.AddArg(y) 15122 return true 15123 } 15124 return false 15125 } 15126 func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { 15127 b := v.Block 15128 _ = b 15129 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 15130 // cond: 15131 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 15132 for { 15133 d := v.AuxInt 15134 _ = v.Args[1] 15135 v_0 := v.Args[0] 15136 if v_0.Op != OpARMMOVWconst { 15137 break 15138 } 15139 c := v_0.AuxInt 15140 x := v.Args[1] 15141 v.reset(OpARMRSBSconst) 15142 v.AuxInt = c 15143 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 15144 v0.AuxInt = d 15145 v0.AddArg(x) 15146 v.AddArg(v0) 15147 return true 15148 } 15149 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 15150 // cond: 15151 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 15152 for { 15153 d := v.AuxInt 15154 _ = v.Args[1] 15155 x := v.Args[0] 15156 v_1 := v.Args[1] 15157 if v_1.Op != OpARMMOVWconst { 15158 break 15159 } 15160 c := v_1.AuxInt 15161 v.reset(OpARMSUBSconst) 15162 v.AuxInt = int64(int32(c) >> uint64(d)) 15163 v.AddArg(x) 15164 return true 15165 } 15166 return false 15167 } 15168 func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { 15169 b := v.Block 15170 _ = b 15171 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 15172 // cond: 15173 // result: (RSBSconst [c] (SRA <x.Type> x y)) 15174 for { 15175 _ = v.Args[2] 15176 v_0 := v.Args[0] 15177 if v_0.Op != OpARMMOVWconst { 15178 break 15179 } 15180 c := v_0.AuxInt 15181 x := v.Args[1] 15182 y := v.Args[2] 15183 v.reset(OpARMRSBSconst) 15184 v.AuxInt = c 15185 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 15186 v0.AddArg(x) 15187 v0.AddArg(y) 15188 v.AddArg(v0) 15189 return true 15190 } 15191 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 15192 // cond: 15193 // result: (SUBSshiftRA x y [c]) 15194 for { 15195 _ = v.Args[2] 15196 x := v.Args[0] 15197 y := v.Args[1] 15198 v_2 := v.Args[2] 15199 if v_2.Op != OpARMMOVWconst { 15200 break 15201 } 15202 c := v_2.AuxInt 15203 v.reset(OpARMSUBSshiftRA) 15204 v.AuxInt = c 15205 v.AddArg(x) 15206 v.AddArg(y) 15207 return true 15208 } 15209 return false 15210 } 15211 func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { 15212 b := v.Block 15213 _ = b 15214 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 15215 // cond: 15216 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 15217 for { 15218 d := v.AuxInt 15219 _ = v.Args[1] 15220 v_0 := v.Args[0] 15221 if v_0.Op != OpARMMOVWconst { 15222 break 15223 } 15224 c := v_0.AuxInt 15225 x := v.Args[1] 15226 v.reset(OpARMRSBSconst) 15227 v.AuxInt = c 15228 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 15229 v0.AuxInt = d 15230 v0.AddArg(x) 15231 v.AddArg(v0) 15232 return true 15233 } 15234 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 15235 // cond: 15236 // result: (SUBSconst x [int64(int32(uint32(c)>>uint64(d)))]) 15237 for { 15238 d := v.AuxInt 15239 _ = v.Args[1] 15240 x := v.Args[0] 15241 v_1 := v.Args[1] 15242 if v_1.Op != OpARMMOVWconst { 15243 break 15244 } 15245 c := v_1.AuxInt 15246 v.reset(OpARMSUBSconst) 15247 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 15248 v.AddArg(x) 15249 return true 15250 } 15251 return false 15252 } 15253 func rewriteValueARM_OpARMSUBSshiftRLreg_0(v *Value) bool { 15254 b := v.Block 15255 _ = b 15256 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 15257 // cond: 15258 // result: (RSBSconst [c] (SRL <x.Type> x y)) 15259 for { 15260 _ = v.Args[2] 15261 v_0 := v.Args[0] 15262 if v_0.Op != OpARMMOVWconst { 15263 break 15264 } 15265 c := v_0.AuxInt 15266 x := v.Args[1] 15267 y := v.Args[2] 15268 v.reset(OpARMRSBSconst) 15269 v.AuxInt = c 15270 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15271 v0.AddArg(x) 15272 v0.AddArg(y) 15273 v.AddArg(v0) 15274 return true 15275 } 15276 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 15277 // cond: 15278 // result: (SUBSshiftRL x y [c]) 15279 for { 15280 _ = v.Args[2] 15281 x := v.Args[0] 15282 y := v.Args[1] 15283 v_2 := v.Args[2] 15284 if v_2.Op != OpARMMOVWconst { 15285 break 15286 } 15287 c := v_2.AuxInt 15288 v.reset(OpARMSUBSshiftRL) 15289 v.AuxInt = c 15290 v.AddArg(x) 15291 v.AddArg(y) 15292 return true 15293 } 15294 return false 15295 } 15296 func rewriteValueARM_OpARMSUBconst_0(v *Value) bool { 15297 // match: (SUBconst [off1] (MOVWaddr [off2] {sym} ptr)) 15298 // cond: 15299 // result: (MOVWaddr [off2-off1] {sym} ptr) 15300 for { 15301 off1 := v.AuxInt 15302 v_0 := v.Args[0] 15303 if v_0.Op != OpARMMOVWaddr { 15304 break 15305 } 15306 off2 := v_0.AuxInt 15307 sym := v_0.Aux 15308 ptr := v_0.Args[0] 15309 v.reset(OpARMMOVWaddr) 15310 v.AuxInt = off2 - off1 15311 v.Aux = sym 15312 v.AddArg(ptr) 15313 return true 15314 } 15315 // match: (SUBconst [0] x) 15316 // cond: 15317 // result: x 15318 for { 15319 if v.AuxInt != 0 { 15320 break 15321 } 15322 x := v.Args[0] 15323 v.reset(OpCopy) 15324 v.Type = x.Type 15325 v.AddArg(x) 15326 return true 15327 } 15328 // match: (SUBconst [c] x) 15329 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 15330 // result: (ADDconst [int64(int32(-c))] x) 15331 for { 15332 c := v.AuxInt 15333 x := v.Args[0] 15334 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 15335 break 15336 } 15337 v.reset(OpARMADDconst) 15338 v.AuxInt = int64(int32(-c)) 15339 v.AddArg(x) 15340 return true 15341 } 15342 // match: (SUBconst [c] x) 15343 // cond: objabi.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff 15344 // result: (ANDconst [int64(int32(-c))] x) 15345 for { 15346 c := v.AuxInt 15347 x := v.Args[0] 15348 if !(objabi.GOARM == 7 && !isARMImmRot(uint32(c)) && uint32(c) > 0xffff && uint32(-c) <= 0xffff) { 15349 break 15350 } 15351 v.reset(OpARMANDconst) 15352 v.AuxInt = int64(int32(-c)) 15353 v.AddArg(x) 15354 return true 15355 } 15356 // match: (SUBconst [c] (MOVWconst [d])) 15357 // cond: 15358 // result: (MOVWconst [int64(int32(d-c))]) 15359 for { 15360 c := v.AuxInt 15361 v_0 := v.Args[0] 15362 if v_0.Op != OpARMMOVWconst { 15363 break 15364 } 15365 d := v_0.AuxInt 15366 v.reset(OpARMMOVWconst) 15367 v.AuxInt = int64(int32(d - c)) 15368 return true 15369 } 15370 // match: (SUBconst [c] (SUBconst [d] x)) 15371 // cond: 15372 // result: (ADDconst [int64(int32(-c-d))] x) 15373 for { 15374 c := v.AuxInt 15375 v_0 := v.Args[0] 15376 if v_0.Op != OpARMSUBconst { 15377 break 15378 } 15379 d := v_0.AuxInt 15380 x := v_0.Args[0] 15381 v.reset(OpARMADDconst) 15382 v.AuxInt = int64(int32(-c - d)) 15383 v.AddArg(x) 15384 return true 15385 } 15386 // match: (SUBconst [c] (ADDconst [d] x)) 15387 // cond: 15388 // result: (ADDconst [int64(int32(-c+d))] x) 15389 for { 15390 c := v.AuxInt 15391 v_0 := v.Args[0] 15392 if v_0.Op != OpARMADDconst { 15393 break 15394 } 15395 d := v_0.AuxInt 15396 x := v_0.Args[0] 15397 v.reset(OpARMADDconst) 15398 v.AuxInt = int64(int32(-c + d)) 15399 v.AddArg(x) 15400 return true 15401 } 15402 // match: (SUBconst [c] (RSBconst [d] x)) 15403 // cond: 15404 // result: (RSBconst [int64(int32(-c+d))] x) 15405 for { 15406 c := v.AuxInt 15407 v_0 := v.Args[0] 15408 if v_0.Op != OpARMRSBconst { 15409 break 15410 } 15411 d := v_0.AuxInt 15412 x := v_0.Args[0] 15413 v.reset(OpARMRSBconst) 15414 v.AuxInt = int64(int32(-c + d)) 15415 v.AddArg(x) 15416 return true 15417 } 15418 return false 15419 } 15420 func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { 15421 b := v.Block 15422 _ = b 15423 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 15424 // cond: 15425 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 15426 for { 15427 d := v.AuxInt 15428 _ = v.Args[1] 15429 v_0 := v.Args[0] 15430 if v_0.Op != OpARMMOVWconst { 15431 break 15432 } 15433 c := v_0.AuxInt 15434 x := v.Args[1] 15435 v.reset(OpARMRSBconst) 15436 v.AuxInt = c 15437 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 15438 v0.AuxInt = d 15439 v0.AddArg(x) 15440 v.AddArg(v0) 15441 return true 15442 } 15443 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 15444 // cond: 15445 // result: (SUBconst x [int64(int32(uint32(c)<<uint64(d)))]) 15446 for { 15447 d := v.AuxInt 15448 _ = v.Args[1] 15449 x := v.Args[0] 15450 v_1 := v.Args[1] 15451 if v_1.Op != OpARMMOVWconst { 15452 break 15453 } 15454 c := v_1.AuxInt 15455 v.reset(OpARMSUBconst) 15456 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 15457 v.AddArg(x) 15458 return true 15459 } 15460 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 15461 // cond: c==d 15462 // result: (MOVWconst [0]) 15463 for { 15464 d := v.AuxInt 15465 _ = v.Args[1] 15466 x := v.Args[0] 15467 v_1 := v.Args[1] 15468 if v_1.Op != OpARMSLLconst { 15469 break 15470 } 15471 c := v_1.AuxInt 15472 if x != v_1.Args[0] { 15473 break 15474 } 15475 if !(c == d) { 15476 break 15477 } 15478 v.reset(OpARMMOVWconst) 15479 v.AuxInt = 0 15480 return true 15481 } 15482 return false 15483 } 15484 func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { 15485 b := v.Block 15486 _ = b 15487 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 15488 // cond: 15489 // result: (RSBconst [c] (SLL <x.Type> x y)) 15490 for { 15491 _ = v.Args[2] 15492 v_0 := v.Args[0] 15493 if v_0.Op != OpARMMOVWconst { 15494 break 15495 } 15496 c := v_0.AuxInt 15497 x := v.Args[1] 15498 y := v.Args[2] 15499 v.reset(OpARMRSBconst) 15500 v.AuxInt = c 15501 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15502 v0.AddArg(x) 15503 v0.AddArg(y) 15504 v.AddArg(v0) 15505 return true 15506 } 15507 // match: (SUBshiftLLreg x y (MOVWconst [c])) 15508 // cond: 15509 // result: (SUBshiftLL x y [c]) 15510 for { 15511 _ = v.Args[2] 15512 x := v.Args[0] 15513 y := v.Args[1] 15514 v_2 := v.Args[2] 15515 if v_2.Op != OpARMMOVWconst { 15516 break 15517 } 15518 c := v_2.AuxInt 15519 v.reset(OpARMSUBshiftLL) 15520 v.AuxInt = c 15521 v.AddArg(x) 15522 v.AddArg(y) 15523 return true 15524 } 15525 return false 15526 } 15527 func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { 15528 b := v.Block 15529 _ = b 15530 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 15531 // cond: 15532 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 15533 for { 15534 d := v.AuxInt 15535 _ = v.Args[1] 15536 v_0 := v.Args[0] 15537 if v_0.Op != OpARMMOVWconst { 15538 break 15539 } 15540 c := v_0.AuxInt 15541 x := v.Args[1] 15542 v.reset(OpARMRSBconst) 15543 v.AuxInt = c 15544 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 15545 v0.AuxInt = d 15546 v0.AddArg(x) 15547 v.AddArg(v0) 15548 return true 15549 } 15550 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 15551 // cond: 15552 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 15553 for { 15554 d := v.AuxInt 15555 _ = v.Args[1] 15556 x := v.Args[0] 15557 v_1 := v.Args[1] 15558 if v_1.Op != OpARMMOVWconst { 15559 break 15560 } 15561 c := v_1.AuxInt 15562 v.reset(OpARMSUBconst) 15563 v.AuxInt = int64(int32(c) >> uint64(d)) 15564 v.AddArg(x) 15565 return true 15566 } 15567 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 15568 // cond: c==d 15569 // result: (MOVWconst [0]) 15570 for { 15571 d := v.AuxInt 15572 _ = v.Args[1] 15573 x := v.Args[0] 15574 v_1 := v.Args[1] 15575 if v_1.Op != OpARMSRAconst { 15576 break 15577 } 15578 c := v_1.AuxInt 15579 if x != v_1.Args[0] { 15580 break 15581 } 15582 if !(c == d) { 15583 break 15584 } 15585 v.reset(OpARMMOVWconst) 15586 v.AuxInt = 0 15587 return true 15588 } 15589 return false 15590 } 15591 func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { 15592 b := v.Block 15593 _ = b 15594 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 15595 // cond: 15596 // result: (RSBconst [c] (SRA <x.Type> x y)) 15597 for { 15598 _ = v.Args[2] 15599 v_0 := v.Args[0] 15600 if v_0.Op != OpARMMOVWconst { 15601 break 15602 } 15603 c := v_0.AuxInt 15604 x := v.Args[1] 15605 y := v.Args[2] 15606 v.reset(OpARMRSBconst) 15607 v.AuxInt = c 15608 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 15609 v0.AddArg(x) 15610 v0.AddArg(y) 15611 v.AddArg(v0) 15612 return true 15613 } 15614 // match: (SUBshiftRAreg x y (MOVWconst [c])) 15615 // cond: 15616 // result: (SUBshiftRA x y [c]) 15617 for { 15618 _ = v.Args[2] 15619 x := v.Args[0] 15620 y := v.Args[1] 15621 v_2 := v.Args[2] 15622 if v_2.Op != OpARMMOVWconst { 15623 break 15624 } 15625 c := v_2.AuxInt 15626 v.reset(OpARMSUBshiftRA) 15627 v.AuxInt = c 15628 v.AddArg(x) 15629 v.AddArg(y) 15630 return true 15631 } 15632 return false 15633 } 15634 func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { 15635 b := v.Block 15636 _ = b 15637 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 15638 // cond: 15639 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 15640 for { 15641 d := v.AuxInt 15642 _ = v.Args[1] 15643 v_0 := v.Args[0] 15644 if v_0.Op != OpARMMOVWconst { 15645 break 15646 } 15647 c := v_0.AuxInt 15648 x := v.Args[1] 15649 v.reset(OpARMRSBconst) 15650 v.AuxInt = c 15651 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 15652 v0.AuxInt = d 15653 v0.AddArg(x) 15654 v.AddArg(v0) 15655 return true 15656 } 15657 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 15658 // cond: 15659 // result: (SUBconst x [int64(int32(uint32(c)>>uint64(d)))]) 15660 for { 15661 d := v.AuxInt 15662 _ = v.Args[1] 15663 x := v.Args[0] 15664 v_1 := v.Args[1] 15665 if v_1.Op != OpARMMOVWconst { 15666 break 15667 } 15668 c := v_1.AuxInt 15669 v.reset(OpARMSUBconst) 15670 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 15671 v.AddArg(x) 15672 return true 15673 } 15674 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 15675 // cond: c==d 15676 // result: (MOVWconst [0]) 15677 for { 15678 d := v.AuxInt 15679 _ = v.Args[1] 15680 x := v.Args[0] 15681 v_1 := v.Args[1] 15682 if v_1.Op != OpARMSRLconst { 15683 break 15684 } 15685 c := v_1.AuxInt 15686 if x != v_1.Args[0] { 15687 break 15688 } 15689 if !(c == d) { 15690 break 15691 } 15692 v.reset(OpARMMOVWconst) 15693 v.AuxInt = 0 15694 return true 15695 } 15696 return false 15697 } 15698 func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { 15699 b := v.Block 15700 _ = b 15701 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 15702 // cond: 15703 // result: (RSBconst [c] (SRL <x.Type> x y)) 15704 for { 15705 _ = v.Args[2] 15706 v_0 := v.Args[0] 15707 if v_0.Op != OpARMMOVWconst { 15708 break 15709 } 15710 c := v_0.AuxInt 15711 x := v.Args[1] 15712 y := v.Args[2] 15713 v.reset(OpARMRSBconst) 15714 v.AuxInt = c 15715 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15716 v0.AddArg(x) 15717 v0.AddArg(y) 15718 v.AddArg(v0) 15719 return true 15720 } 15721 // match: (SUBshiftRLreg x y (MOVWconst [c])) 15722 // cond: 15723 // result: (SUBshiftRL x y [c]) 15724 for { 15725 _ = v.Args[2] 15726 x := v.Args[0] 15727 y := v.Args[1] 15728 v_2 := v.Args[2] 15729 if v_2.Op != OpARMMOVWconst { 15730 break 15731 } 15732 c := v_2.AuxInt 15733 v.reset(OpARMSUBshiftRL) 15734 v.AuxInt = c 15735 v.AddArg(x) 15736 v.AddArg(y) 15737 return true 15738 } 15739 return false 15740 } 15741 func rewriteValueARM_OpARMTEQ_0(v *Value) bool { 15742 // match: (TEQ x (MOVWconst [c])) 15743 // cond: 15744 // result: (TEQconst [c] x) 15745 for { 15746 _ = v.Args[1] 15747 x := v.Args[0] 15748 v_1 := v.Args[1] 15749 if v_1.Op != OpARMMOVWconst { 15750 break 15751 } 15752 c := v_1.AuxInt 15753 v.reset(OpARMTEQconst) 15754 v.AuxInt = c 15755 v.AddArg(x) 15756 return true 15757 } 15758 // match: (TEQ (MOVWconst [c]) x) 15759 // cond: 15760 // result: (TEQconst [c] x) 15761 for { 15762 _ = v.Args[1] 15763 v_0 := v.Args[0] 15764 if v_0.Op != OpARMMOVWconst { 15765 break 15766 } 15767 c := v_0.AuxInt 15768 x := v.Args[1] 15769 v.reset(OpARMTEQconst) 15770 v.AuxInt = c 15771 v.AddArg(x) 15772 return true 15773 } 15774 // match: (TEQ x (SLLconst [c] y)) 15775 // cond: 15776 // result: (TEQshiftLL x y [c]) 15777 for { 15778 _ = v.Args[1] 15779 x := v.Args[0] 15780 v_1 := v.Args[1] 15781 if v_1.Op != OpARMSLLconst { 15782 break 15783 } 15784 c := v_1.AuxInt 15785 y := v_1.Args[0] 15786 v.reset(OpARMTEQshiftLL) 15787 v.AuxInt = c 15788 v.AddArg(x) 15789 v.AddArg(y) 15790 return true 15791 } 15792 // match: (TEQ (SLLconst [c] y) x) 15793 // cond: 15794 // result: (TEQshiftLL x y [c]) 15795 for { 15796 _ = v.Args[1] 15797 v_0 := v.Args[0] 15798 if v_0.Op != OpARMSLLconst { 15799 break 15800 } 15801 c := v_0.AuxInt 15802 y := v_0.Args[0] 15803 x := v.Args[1] 15804 v.reset(OpARMTEQshiftLL) 15805 v.AuxInt = c 15806 v.AddArg(x) 15807 v.AddArg(y) 15808 return true 15809 } 15810 // match: (TEQ x (SRLconst [c] y)) 15811 // cond: 15812 // result: (TEQshiftRL x y [c]) 15813 for { 15814 _ = v.Args[1] 15815 x := v.Args[0] 15816 v_1 := v.Args[1] 15817 if v_1.Op != OpARMSRLconst { 15818 break 15819 } 15820 c := v_1.AuxInt 15821 y := v_1.Args[0] 15822 v.reset(OpARMTEQshiftRL) 15823 v.AuxInt = c 15824 v.AddArg(x) 15825 v.AddArg(y) 15826 return true 15827 } 15828 // match: (TEQ (SRLconst [c] y) x) 15829 // cond: 15830 // result: (TEQshiftRL x y [c]) 15831 for { 15832 _ = v.Args[1] 15833 v_0 := v.Args[0] 15834 if v_0.Op != OpARMSRLconst { 15835 break 15836 } 15837 c := v_0.AuxInt 15838 y := v_0.Args[0] 15839 x := v.Args[1] 15840 v.reset(OpARMTEQshiftRL) 15841 v.AuxInt = c 15842 v.AddArg(x) 15843 v.AddArg(y) 15844 return true 15845 } 15846 // match: (TEQ x (SRAconst [c] y)) 15847 // cond: 15848 // result: (TEQshiftRA x y [c]) 15849 for { 15850 _ = v.Args[1] 15851 x := v.Args[0] 15852 v_1 := v.Args[1] 15853 if v_1.Op != OpARMSRAconst { 15854 break 15855 } 15856 c := v_1.AuxInt 15857 y := v_1.Args[0] 15858 v.reset(OpARMTEQshiftRA) 15859 v.AuxInt = c 15860 v.AddArg(x) 15861 v.AddArg(y) 15862 return true 15863 } 15864 // match: (TEQ (SRAconst [c] y) x) 15865 // cond: 15866 // result: (TEQshiftRA x y [c]) 15867 for { 15868 _ = v.Args[1] 15869 v_0 := v.Args[0] 15870 if v_0.Op != OpARMSRAconst { 15871 break 15872 } 15873 c := v_0.AuxInt 15874 y := v_0.Args[0] 15875 x := v.Args[1] 15876 v.reset(OpARMTEQshiftRA) 15877 v.AuxInt = c 15878 v.AddArg(x) 15879 v.AddArg(y) 15880 return true 15881 } 15882 // match: (TEQ x (SLL y z)) 15883 // cond: 15884 // result: (TEQshiftLLreg x y z) 15885 for { 15886 _ = v.Args[1] 15887 x := v.Args[0] 15888 v_1 := v.Args[1] 15889 if v_1.Op != OpARMSLL { 15890 break 15891 } 15892 _ = v_1.Args[1] 15893 y := v_1.Args[0] 15894 z := v_1.Args[1] 15895 v.reset(OpARMTEQshiftLLreg) 15896 v.AddArg(x) 15897 v.AddArg(y) 15898 v.AddArg(z) 15899 return true 15900 } 15901 // match: (TEQ (SLL y z) x) 15902 // cond: 15903 // result: (TEQshiftLLreg x y z) 15904 for { 15905 _ = v.Args[1] 15906 v_0 := v.Args[0] 15907 if v_0.Op != OpARMSLL { 15908 break 15909 } 15910 _ = v_0.Args[1] 15911 y := v_0.Args[0] 15912 z := v_0.Args[1] 15913 x := v.Args[1] 15914 v.reset(OpARMTEQshiftLLreg) 15915 v.AddArg(x) 15916 v.AddArg(y) 15917 v.AddArg(z) 15918 return true 15919 } 15920 return false 15921 } 15922 func rewriteValueARM_OpARMTEQ_10(v *Value) bool { 15923 // match: (TEQ x (SRL y z)) 15924 // cond: 15925 // result: (TEQshiftRLreg x y z) 15926 for { 15927 _ = v.Args[1] 15928 x := v.Args[0] 15929 v_1 := v.Args[1] 15930 if v_1.Op != OpARMSRL { 15931 break 15932 } 15933 _ = v_1.Args[1] 15934 y := v_1.Args[0] 15935 z := v_1.Args[1] 15936 v.reset(OpARMTEQshiftRLreg) 15937 v.AddArg(x) 15938 v.AddArg(y) 15939 v.AddArg(z) 15940 return true 15941 } 15942 // match: (TEQ (SRL y z) x) 15943 // cond: 15944 // result: (TEQshiftRLreg x y z) 15945 for { 15946 _ = v.Args[1] 15947 v_0 := v.Args[0] 15948 if v_0.Op != OpARMSRL { 15949 break 15950 } 15951 _ = v_0.Args[1] 15952 y := v_0.Args[0] 15953 z := v_0.Args[1] 15954 x := v.Args[1] 15955 v.reset(OpARMTEQshiftRLreg) 15956 v.AddArg(x) 15957 v.AddArg(y) 15958 v.AddArg(z) 15959 return true 15960 } 15961 // match: (TEQ x (SRA y z)) 15962 // cond: 15963 // result: (TEQshiftRAreg x y z) 15964 for { 15965 _ = v.Args[1] 15966 x := v.Args[0] 15967 v_1 := v.Args[1] 15968 if v_1.Op != OpARMSRA { 15969 break 15970 } 15971 _ = v_1.Args[1] 15972 y := v_1.Args[0] 15973 z := v_1.Args[1] 15974 v.reset(OpARMTEQshiftRAreg) 15975 v.AddArg(x) 15976 v.AddArg(y) 15977 v.AddArg(z) 15978 return true 15979 } 15980 // match: (TEQ (SRA y z) x) 15981 // cond: 15982 // result: (TEQshiftRAreg x y z) 15983 for { 15984 _ = v.Args[1] 15985 v_0 := v.Args[0] 15986 if v_0.Op != OpARMSRA { 15987 break 15988 } 15989 _ = v_0.Args[1] 15990 y := v_0.Args[0] 15991 z := v_0.Args[1] 15992 x := v.Args[1] 15993 v.reset(OpARMTEQshiftRAreg) 15994 v.AddArg(x) 15995 v.AddArg(y) 15996 v.AddArg(z) 15997 return true 15998 } 15999 return false 16000 } 16001 func rewriteValueARM_OpARMTEQconst_0(v *Value) bool { 16002 // match: (TEQconst (MOVWconst [x]) [y]) 16003 // cond: int32(x^y)==0 16004 // result: (FlagEQ) 16005 for { 16006 y := v.AuxInt 16007 v_0 := v.Args[0] 16008 if v_0.Op != OpARMMOVWconst { 16009 break 16010 } 16011 x := v_0.AuxInt 16012 if !(int32(x^y) == 0) { 16013 break 16014 } 16015 v.reset(OpARMFlagEQ) 16016 return true 16017 } 16018 // match: (TEQconst (MOVWconst [x]) [y]) 16019 // cond: int32(x^y)<0 16020 // result: (FlagLT_UGT) 16021 for { 16022 y := v.AuxInt 16023 v_0 := v.Args[0] 16024 if v_0.Op != OpARMMOVWconst { 16025 break 16026 } 16027 x := v_0.AuxInt 16028 if !(int32(x^y) < 0) { 16029 break 16030 } 16031 v.reset(OpARMFlagLT_UGT) 16032 return true 16033 } 16034 // match: (TEQconst (MOVWconst [x]) [y]) 16035 // cond: int32(x^y)>0 16036 // result: (FlagGT_UGT) 16037 for { 16038 y := v.AuxInt 16039 v_0 := v.Args[0] 16040 if v_0.Op != OpARMMOVWconst { 16041 break 16042 } 16043 x := v_0.AuxInt 16044 if !(int32(x^y) > 0) { 16045 break 16046 } 16047 v.reset(OpARMFlagGT_UGT) 16048 return true 16049 } 16050 return false 16051 } 16052 func rewriteValueARM_OpARMTEQshiftLL_0(v *Value) bool { 16053 b := v.Block 16054 _ = b 16055 // match: (TEQshiftLL (MOVWconst [c]) x [d]) 16056 // cond: 16057 // result: (TEQconst [c] (SLLconst <x.Type> x [d])) 16058 for { 16059 d := v.AuxInt 16060 _ = v.Args[1] 16061 v_0 := v.Args[0] 16062 if v_0.Op != OpARMMOVWconst { 16063 break 16064 } 16065 c := v_0.AuxInt 16066 x := v.Args[1] 16067 v.reset(OpARMTEQconst) 16068 v.AuxInt = c 16069 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 16070 v0.AuxInt = d 16071 v0.AddArg(x) 16072 v.AddArg(v0) 16073 return true 16074 } 16075 // match: (TEQshiftLL x (MOVWconst [c]) [d]) 16076 // cond: 16077 // result: (TEQconst x [int64(int32(uint32(c)<<uint64(d)))]) 16078 for { 16079 d := v.AuxInt 16080 _ = v.Args[1] 16081 x := v.Args[0] 16082 v_1 := v.Args[1] 16083 if v_1.Op != OpARMMOVWconst { 16084 break 16085 } 16086 c := v_1.AuxInt 16087 v.reset(OpARMTEQconst) 16088 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 16089 v.AddArg(x) 16090 return true 16091 } 16092 return false 16093 } 16094 func rewriteValueARM_OpARMTEQshiftLLreg_0(v *Value) bool { 16095 b := v.Block 16096 _ = b 16097 // match: (TEQshiftLLreg (MOVWconst [c]) x y) 16098 // cond: 16099 // result: (TEQconst [c] (SLL <x.Type> x y)) 16100 for { 16101 _ = v.Args[2] 16102 v_0 := v.Args[0] 16103 if v_0.Op != OpARMMOVWconst { 16104 break 16105 } 16106 c := v_0.AuxInt 16107 x := v.Args[1] 16108 y := v.Args[2] 16109 v.reset(OpARMTEQconst) 16110 v.AuxInt = c 16111 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 16112 v0.AddArg(x) 16113 v0.AddArg(y) 16114 v.AddArg(v0) 16115 return true 16116 } 16117 // match: (TEQshiftLLreg x y (MOVWconst [c])) 16118 // cond: 16119 // result: (TEQshiftLL x y [c]) 16120 for { 16121 _ = v.Args[2] 16122 x := v.Args[0] 16123 y := v.Args[1] 16124 v_2 := v.Args[2] 16125 if v_2.Op != OpARMMOVWconst { 16126 break 16127 } 16128 c := v_2.AuxInt 16129 v.reset(OpARMTEQshiftLL) 16130 v.AuxInt = c 16131 v.AddArg(x) 16132 v.AddArg(y) 16133 return true 16134 } 16135 return false 16136 } 16137 func rewriteValueARM_OpARMTEQshiftRA_0(v *Value) bool { 16138 b := v.Block 16139 _ = b 16140 // match: (TEQshiftRA (MOVWconst [c]) x [d]) 16141 // cond: 16142 // result: (TEQconst [c] (SRAconst <x.Type> x [d])) 16143 for { 16144 d := v.AuxInt 16145 _ = v.Args[1] 16146 v_0 := v.Args[0] 16147 if v_0.Op != OpARMMOVWconst { 16148 break 16149 } 16150 c := v_0.AuxInt 16151 x := v.Args[1] 16152 v.reset(OpARMTEQconst) 16153 v.AuxInt = c 16154 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 16155 v0.AuxInt = d 16156 v0.AddArg(x) 16157 v.AddArg(v0) 16158 return true 16159 } 16160 // match: (TEQshiftRA x (MOVWconst [c]) [d]) 16161 // cond: 16162 // result: (TEQconst x [int64(int32(c)>>uint64(d))]) 16163 for { 16164 d := v.AuxInt 16165 _ = v.Args[1] 16166 x := v.Args[0] 16167 v_1 := v.Args[1] 16168 if v_1.Op != OpARMMOVWconst { 16169 break 16170 } 16171 c := v_1.AuxInt 16172 v.reset(OpARMTEQconst) 16173 v.AuxInt = int64(int32(c) >> uint64(d)) 16174 v.AddArg(x) 16175 return true 16176 } 16177 return false 16178 } 16179 func rewriteValueARM_OpARMTEQshiftRAreg_0(v *Value) bool { 16180 b := v.Block 16181 _ = b 16182 // match: (TEQshiftRAreg (MOVWconst [c]) x y) 16183 // cond: 16184 // result: (TEQconst [c] (SRA <x.Type> x y)) 16185 for { 16186 _ = v.Args[2] 16187 v_0 := v.Args[0] 16188 if v_0.Op != OpARMMOVWconst { 16189 break 16190 } 16191 c := v_0.AuxInt 16192 x := v.Args[1] 16193 y := v.Args[2] 16194 v.reset(OpARMTEQconst) 16195 v.AuxInt = c 16196 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 16197 v0.AddArg(x) 16198 v0.AddArg(y) 16199 v.AddArg(v0) 16200 return true 16201 } 16202 // match: (TEQshiftRAreg x y (MOVWconst [c])) 16203 // cond: 16204 // result: (TEQshiftRA x y [c]) 16205 for { 16206 _ = v.Args[2] 16207 x := v.Args[0] 16208 y := v.Args[1] 16209 v_2 := v.Args[2] 16210 if v_2.Op != OpARMMOVWconst { 16211 break 16212 } 16213 c := v_2.AuxInt 16214 v.reset(OpARMTEQshiftRA) 16215 v.AuxInt = c 16216 v.AddArg(x) 16217 v.AddArg(y) 16218 return true 16219 } 16220 return false 16221 } 16222 func rewriteValueARM_OpARMTEQshiftRL_0(v *Value) bool { 16223 b := v.Block 16224 _ = b 16225 // match: (TEQshiftRL (MOVWconst [c]) x [d]) 16226 // cond: 16227 // result: (TEQconst [c] (SRLconst <x.Type> x [d])) 16228 for { 16229 d := v.AuxInt 16230 _ = v.Args[1] 16231 v_0 := v.Args[0] 16232 if v_0.Op != OpARMMOVWconst { 16233 break 16234 } 16235 c := v_0.AuxInt 16236 x := v.Args[1] 16237 v.reset(OpARMTEQconst) 16238 v.AuxInt = c 16239 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 16240 v0.AuxInt = d 16241 v0.AddArg(x) 16242 v.AddArg(v0) 16243 return true 16244 } 16245 // match: (TEQshiftRL x (MOVWconst [c]) [d]) 16246 // cond: 16247 // result: (TEQconst x [int64(int32(uint32(c)>>uint64(d)))]) 16248 for { 16249 d := v.AuxInt 16250 _ = v.Args[1] 16251 x := v.Args[0] 16252 v_1 := v.Args[1] 16253 if v_1.Op != OpARMMOVWconst { 16254 break 16255 } 16256 c := v_1.AuxInt 16257 v.reset(OpARMTEQconst) 16258 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 16259 v.AddArg(x) 16260 return true 16261 } 16262 return false 16263 } 16264 func rewriteValueARM_OpARMTEQshiftRLreg_0(v *Value) bool { 16265 b := v.Block 16266 _ = b 16267 // match: (TEQshiftRLreg (MOVWconst [c]) x y) 16268 // cond: 16269 // result: (TEQconst [c] (SRL <x.Type> x y)) 16270 for { 16271 _ = v.Args[2] 16272 v_0 := v.Args[0] 16273 if v_0.Op != OpARMMOVWconst { 16274 break 16275 } 16276 c := v_0.AuxInt 16277 x := v.Args[1] 16278 y := v.Args[2] 16279 v.reset(OpARMTEQconst) 16280 v.AuxInt = c 16281 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16282 v0.AddArg(x) 16283 v0.AddArg(y) 16284 v.AddArg(v0) 16285 return true 16286 } 16287 // match: (TEQshiftRLreg x y (MOVWconst [c])) 16288 // cond: 16289 // result: (TEQshiftRL x y [c]) 16290 for { 16291 _ = v.Args[2] 16292 x := v.Args[0] 16293 y := v.Args[1] 16294 v_2 := v.Args[2] 16295 if v_2.Op != OpARMMOVWconst { 16296 break 16297 } 16298 c := v_2.AuxInt 16299 v.reset(OpARMTEQshiftRL) 16300 v.AuxInt = c 16301 v.AddArg(x) 16302 v.AddArg(y) 16303 return true 16304 } 16305 return false 16306 } 16307 func rewriteValueARM_OpARMTST_0(v *Value) bool { 16308 // match: (TST x (MOVWconst [c])) 16309 // cond: 16310 // result: (TSTconst [c] x) 16311 for { 16312 _ = v.Args[1] 16313 x := v.Args[0] 16314 v_1 := v.Args[1] 16315 if v_1.Op != OpARMMOVWconst { 16316 break 16317 } 16318 c := v_1.AuxInt 16319 v.reset(OpARMTSTconst) 16320 v.AuxInt = c 16321 v.AddArg(x) 16322 return true 16323 } 16324 // match: (TST (MOVWconst [c]) x) 16325 // cond: 16326 // result: (TSTconst [c] x) 16327 for { 16328 _ = v.Args[1] 16329 v_0 := v.Args[0] 16330 if v_0.Op != OpARMMOVWconst { 16331 break 16332 } 16333 c := v_0.AuxInt 16334 x := v.Args[1] 16335 v.reset(OpARMTSTconst) 16336 v.AuxInt = c 16337 v.AddArg(x) 16338 return true 16339 } 16340 // match: (TST x (SLLconst [c] y)) 16341 // cond: 16342 // result: (TSTshiftLL x y [c]) 16343 for { 16344 _ = v.Args[1] 16345 x := v.Args[0] 16346 v_1 := v.Args[1] 16347 if v_1.Op != OpARMSLLconst { 16348 break 16349 } 16350 c := v_1.AuxInt 16351 y := v_1.Args[0] 16352 v.reset(OpARMTSTshiftLL) 16353 v.AuxInt = c 16354 v.AddArg(x) 16355 v.AddArg(y) 16356 return true 16357 } 16358 // match: (TST (SLLconst [c] y) x) 16359 // cond: 16360 // result: (TSTshiftLL x y [c]) 16361 for { 16362 _ = v.Args[1] 16363 v_0 := v.Args[0] 16364 if v_0.Op != OpARMSLLconst { 16365 break 16366 } 16367 c := v_0.AuxInt 16368 y := v_0.Args[0] 16369 x := v.Args[1] 16370 v.reset(OpARMTSTshiftLL) 16371 v.AuxInt = c 16372 v.AddArg(x) 16373 v.AddArg(y) 16374 return true 16375 } 16376 // match: (TST x (SRLconst [c] y)) 16377 // cond: 16378 // result: (TSTshiftRL x y [c]) 16379 for { 16380 _ = v.Args[1] 16381 x := v.Args[0] 16382 v_1 := v.Args[1] 16383 if v_1.Op != OpARMSRLconst { 16384 break 16385 } 16386 c := v_1.AuxInt 16387 y := v_1.Args[0] 16388 v.reset(OpARMTSTshiftRL) 16389 v.AuxInt = c 16390 v.AddArg(x) 16391 v.AddArg(y) 16392 return true 16393 } 16394 // match: (TST (SRLconst [c] y) x) 16395 // cond: 16396 // result: (TSTshiftRL x y [c]) 16397 for { 16398 _ = v.Args[1] 16399 v_0 := v.Args[0] 16400 if v_0.Op != OpARMSRLconst { 16401 break 16402 } 16403 c := v_0.AuxInt 16404 y := v_0.Args[0] 16405 x := v.Args[1] 16406 v.reset(OpARMTSTshiftRL) 16407 v.AuxInt = c 16408 v.AddArg(x) 16409 v.AddArg(y) 16410 return true 16411 } 16412 // match: (TST x (SRAconst [c] y)) 16413 // cond: 16414 // result: (TSTshiftRA x y [c]) 16415 for { 16416 _ = v.Args[1] 16417 x := v.Args[0] 16418 v_1 := v.Args[1] 16419 if v_1.Op != OpARMSRAconst { 16420 break 16421 } 16422 c := v_1.AuxInt 16423 y := v_1.Args[0] 16424 v.reset(OpARMTSTshiftRA) 16425 v.AuxInt = c 16426 v.AddArg(x) 16427 v.AddArg(y) 16428 return true 16429 } 16430 // match: (TST (SRAconst [c] y) x) 16431 // cond: 16432 // result: (TSTshiftRA x y [c]) 16433 for { 16434 _ = v.Args[1] 16435 v_0 := v.Args[0] 16436 if v_0.Op != OpARMSRAconst { 16437 break 16438 } 16439 c := v_0.AuxInt 16440 y := v_0.Args[0] 16441 x := v.Args[1] 16442 v.reset(OpARMTSTshiftRA) 16443 v.AuxInt = c 16444 v.AddArg(x) 16445 v.AddArg(y) 16446 return true 16447 } 16448 // match: (TST x (SLL y z)) 16449 // cond: 16450 // result: (TSTshiftLLreg x y z) 16451 for { 16452 _ = v.Args[1] 16453 x := v.Args[0] 16454 v_1 := v.Args[1] 16455 if v_1.Op != OpARMSLL { 16456 break 16457 } 16458 _ = v_1.Args[1] 16459 y := v_1.Args[0] 16460 z := v_1.Args[1] 16461 v.reset(OpARMTSTshiftLLreg) 16462 v.AddArg(x) 16463 v.AddArg(y) 16464 v.AddArg(z) 16465 return true 16466 } 16467 // match: (TST (SLL y z) x) 16468 // cond: 16469 // result: (TSTshiftLLreg x y z) 16470 for { 16471 _ = v.Args[1] 16472 v_0 := v.Args[0] 16473 if v_0.Op != OpARMSLL { 16474 break 16475 } 16476 _ = v_0.Args[1] 16477 y := v_0.Args[0] 16478 z := v_0.Args[1] 16479 x := v.Args[1] 16480 v.reset(OpARMTSTshiftLLreg) 16481 v.AddArg(x) 16482 v.AddArg(y) 16483 v.AddArg(z) 16484 return true 16485 } 16486 return false 16487 } 16488 func rewriteValueARM_OpARMTST_10(v *Value) bool { 16489 // match: (TST x (SRL y z)) 16490 // cond: 16491 // result: (TSTshiftRLreg x y z) 16492 for { 16493 _ = v.Args[1] 16494 x := v.Args[0] 16495 v_1 := v.Args[1] 16496 if v_1.Op != OpARMSRL { 16497 break 16498 } 16499 _ = v_1.Args[1] 16500 y := v_1.Args[0] 16501 z := v_1.Args[1] 16502 v.reset(OpARMTSTshiftRLreg) 16503 v.AddArg(x) 16504 v.AddArg(y) 16505 v.AddArg(z) 16506 return true 16507 } 16508 // match: (TST (SRL y z) x) 16509 // cond: 16510 // result: (TSTshiftRLreg x y z) 16511 for { 16512 _ = v.Args[1] 16513 v_0 := v.Args[0] 16514 if v_0.Op != OpARMSRL { 16515 break 16516 } 16517 _ = v_0.Args[1] 16518 y := v_0.Args[0] 16519 z := v_0.Args[1] 16520 x := v.Args[1] 16521 v.reset(OpARMTSTshiftRLreg) 16522 v.AddArg(x) 16523 v.AddArg(y) 16524 v.AddArg(z) 16525 return true 16526 } 16527 // match: (TST x (SRA y z)) 16528 // cond: 16529 // result: (TSTshiftRAreg x y z) 16530 for { 16531 _ = v.Args[1] 16532 x := v.Args[0] 16533 v_1 := v.Args[1] 16534 if v_1.Op != OpARMSRA { 16535 break 16536 } 16537 _ = v_1.Args[1] 16538 y := v_1.Args[0] 16539 z := v_1.Args[1] 16540 v.reset(OpARMTSTshiftRAreg) 16541 v.AddArg(x) 16542 v.AddArg(y) 16543 v.AddArg(z) 16544 return true 16545 } 16546 // match: (TST (SRA y z) x) 16547 // cond: 16548 // result: (TSTshiftRAreg x y z) 16549 for { 16550 _ = v.Args[1] 16551 v_0 := v.Args[0] 16552 if v_0.Op != OpARMSRA { 16553 break 16554 } 16555 _ = v_0.Args[1] 16556 y := v_0.Args[0] 16557 z := v_0.Args[1] 16558 x := v.Args[1] 16559 v.reset(OpARMTSTshiftRAreg) 16560 v.AddArg(x) 16561 v.AddArg(y) 16562 v.AddArg(z) 16563 return true 16564 } 16565 return false 16566 } 16567 func rewriteValueARM_OpARMTSTconst_0(v *Value) bool { 16568 // match: (TSTconst (MOVWconst [x]) [y]) 16569 // cond: int32(x&y)==0 16570 // result: (FlagEQ) 16571 for { 16572 y := v.AuxInt 16573 v_0 := v.Args[0] 16574 if v_0.Op != OpARMMOVWconst { 16575 break 16576 } 16577 x := v_0.AuxInt 16578 if !(int32(x&y) == 0) { 16579 break 16580 } 16581 v.reset(OpARMFlagEQ) 16582 return true 16583 } 16584 // match: (TSTconst (MOVWconst [x]) [y]) 16585 // cond: int32(x&y)<0 16586 // result: (FlagLT_UGT) 16587 for { 16588 y := v.AuxInt 16589 v_0 := v.Args[0] 16590 if v_0.Op != OpARMMOVWconst { 16591 break 16592 } 16593 x := v_0.AuxInt 16594 if !(int32(x&y) < 0) { 16595 break 16596 } 16597 v.reset(OpARMFlagLT_UGT) 16598 return true 16599 } 16600 // match: (TSTconst (MOVWconst [x]) [y]) 16601 // cond: int32(x&y)>0 16602 // result: (FlagGT_UGT) 16603 for { 16604 y := v.AuxInt 16605 v_0 := v.Args[0] 16606 if v_0.Op != OpARMMOVWconst { 16607 break 16608 } 16609 x := v_0.AuxInt 16610 if !(int32(x&y) > 0) { 16611 break 16612 } 16613 v.reset(OpARMFlagGT_UGT) 16614 return true 16615 } 16616 return false 16617 } 16618 func rewriteValueARM_OpARMTSTshiftLL_0(v *Value) bool { 16619 b := v.Block 16620 _ = b 16621 // match: (TSTshiftLL (MOVWconst [c]) x [d]) 16622 // cond: 16623 // result: (TSTconst [c] (SLLconst <x.Type> x [d])) 16624 for { 16625 d := v.AuxInt 16626 _ = v.Args[1] 16627 v_0 := v.Args[0] 16628 if v_0.Op != OpARMMOVWconst { 16629 break 16630 } 16631 c := v_0.AuxInt 16632 x := v.Args[1] 16633 v.reset(OpARMTSTconst) 16634 v.AuxInt = c 16635 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 16636 v0.AuxInt = d 16637 v0.AddArg(x) 16638 v.AddArg(v0) 16639 return true 16640 } 16641 // match: (TSTshiftLL x (MOVWconst [c]) [d]) 16642 // cond: 16643 // result: (TSTconst x [int64(int32(uint32(c)<<uint64(d)))]) 16644 for { 16645 d := v.AuxInt 16646 _ = v.Args[1] 16647 x := v.Args[0] 16648 v_1 := v.Args[1] 16649 if v_1.Op != OpARMMOVWconst { 16650 break 16651 } 16652 c := v_1.AuxInt 16653 v.reset(OpARMTSTconst) 16654 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 16655 v.AddArg(x) 16656 return true 16657 } 16658 return false 16659 } 16660 func rewriteValueARM_OpARMTSTshiftLLreg_0(v *Value) bool { 16661 b := v.Block 16662 _ = b 16663 // match: (TSTshiftLLreg (MOVWconst [c]) x y) 16664 // cond: 16665 // result: (TSTconst [c] (SLL <x.Type> x y)) 16666 for { 16667 _ = v.Args[2] 16668 v_0 := v.Args[0] 16669 if v_0.Op != OpARMMOVWconst { 16670 break 16671 } 16672 c := v_0.AuxInt 16673 x := v.Args[1] 16674 y := v.Args[2] 16675 v.reset(OpARMTSTconst) 16676 v.AuxInt = c 16677 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 16678 v0.AddArg(x) 16679 v0.AddArg(y) 16680 v.AddArg(v0) 16681 return true 16682 } 16683 // match: (TSTshiftLLreg x y (MOVWconst [c])) 16684 // cond: 16685 // result: (TSTshiftLL x y [c]) 16686 for { 16687 _ = v.Args[2] 16688 x := v.Args[0] 16689 y := v.Args[1] 16690 v_2 := v.Args[2] 16691 if v_2.Op != OpARMMOVWconst { 16692 break 16693 } 16694 c := v_2.AuxInt 16695 v.reset(OpARMTSTshiftLL) 16696 v.AuxInt = c 16697 v.AddArg(x) 16698 v.AddArg(y) 16699 return true 16700 } 16701 return false 16702 } 16703 func rewriteValueARM_OpARMTSTshiftRA_0(v *Value) bool { 16704 b := v.Block 16705 _ = b 16706 // match: (TSTshiftRA (MOVWconst [c]) x [d]) 16707 // cond: 16708 // result: (TSTconst [c] (SRAconst <x.Type> x [d])) 16709 for { 16710 d := v.AuxInt 16711 _ = v.Args[1] 16712 v_0 := v.Args[0] 16713 if v_0.Op != OpARMMOVWconst { 16714 break 16715 } 16716 c := v_0.AuxInt 16717 x := v.Args[1] 16718 v.reset(OpARMTSTconst) 16719 v.AuxInt = c 16720 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 16721 v0.AuxInt = d 16722 v0.AddArg(x) 16723 v.AddArg(v0) 16724 return true 16725 } 16726 // match: (TSTshiftRA x (MOVWconst [c]) [d]) 16727 // cond: 16728 // result: (TSTconst x [int64(int32(c)>>uint64(d))]) 16729 for { 16730 d := v.AuxInt 16731 _ = v.Args[1] 16732 x := v.Args[0] 16733 v_1 := v.Args[1] 16734 if v_1.Op != OpARMMOVWconst { 16735 break 16736 } 16737 c := v_1.AuxInt 16738 v.reset(OpARMTSTconst) 16739 v.AuxInt = int64(int32(c) >> uint64(d)) 16740 v.AddArg(x) 16741 return true 16742 } 16743 return false 16744 } 16745 func rewriteValueARM_OpARMTSTshiftRAreg_0(v *Value) bool { 16746 b := v.Block 16747 _ = b 16748 // match: (TSTshiftRAreg (MOVWconst [c]) x y) 16749 // cond: 16750 // result: (TSTconst [c] (SRA <x.Type> x y)) 16751 for { 16752 _ = v.Args[2] 16753 v_0 := v.Args[0] 16754 if v_0.Op != OpARMMOVWconst { 16755 break 16756 } 16757 c := v_0.AuxInt 16758 x := v.Args[1] 16759 y := v.Args[2] 16760 v.reset(OpARMTSTconst) 16761 v.AuxInt = c 16762 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 16763 v0.AddArg(x) 16764 v0.AddArg(y) 16765 v.AddArg(v0) 16766 return true 16767 } 16768 // match: (TSTshiftRAreg x y (MOVWconst [c])) 16769 // cond: 16770 // result: (TSTshiftRA x y [c]) 16771 for { 16772 _ = v.Args[2] 16773 x := v.Args[0] 16774 y := v.Args[1] 16775 v_2 := v.Args[2] 16776 if v_2.Op != OpARMMOVWconst { 16777 break 16778 } 16779 c := v_2.AuxInt 16780 v.reset(OpARMTSTshiftRA) 16781 v.AuxInt = c 16782 v.AddArg(x) 16783 v.AddArg(y) 16784 return true 16785 } 16786 return false 16787 } 16788 func rewriteValueARM_OpARMTSTshiftRL_0(v *Value) bool { 16789 b := v.Block 16790 _ = b 16791 // match: (TSTshiftRL (MOVWconst [c]) x [d]) 16792 // cond: 16793 // result: (TSTconst [c] (SRLconst <x.Type> x [d])) 16794 for { 16795 d := v.AuxInt 16796 _ = v.Args[1] 16797 v_0 := v.Args[0] 16798 if v_0.Op != OpARMMOVWconst { 16799 break 16800 } 16801 c := v_0.AuxInt 16802 x := v.Args[1] 16803 v.reset(OpARMTSTconst) 16804 v.AuxInt = c 16805 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 16806 v0.AuxInt = d 16807 v0.AddArg(x) 16808 v.AddArg(v0) 16809 return true 16810 } 16811 // match: (TSTshiftRL x (MOVWconst [c]) [d]) 16812 // cond: 16813 // result: (TSTconst x [int64(int32(uint32(c)>>uint64(d)))]) 16814 for { 16815 d := v.AuxInt 16816 _ = v.Args[1] 16817 x := v.Args[0] 16818 v_1 := v.Args[1] 16819 if v_1.Op != OpARMMOVWconst { 16820 break 16821 } 16822 c := v_1.AuxInt 16823 v.reset(OpARMTSTconst) 16824 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 16825 v.AddArg(x) 16826 return true 16827 } 16828 return false 16829 } 16830 func rewriteValueARM_OpARMTSTshiftRLreg_0(v *Value) bool { 16831 b := v.Block 16832 _ = b 16833 // match: (TSTshiftRLreg (MOVWconst [c]) x y) 16834 // cond: 16835 // result: (TSTconst [c] (SRL <x.Type> x y)) 16836 for { 16837 _ = v.Args[2] 16838 v_0 := v.Args[0] 16839 if v_0.Op != OpARMMOVWconst { 16840 break 16841 } 16842 c := v_0.AuxInt 16843 x := v.Args[1] 16844 y := v.Args[2] 16845 v.reset(OpARMTSTconst) 16846 v.AuxInt = c 16847 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16848 v0.AddArg(x) 16849 v0.AddArg(y) 16850 v.AddArg(v0) 16851 return true 16852 } 16853 // match: (TSTshiftRLreg x y (MOVWconst [c])) 16854 // cond: 16855 // result: (TSTshiftRL x y [c]) 16856 for { 16857 _ = v.Args[2] 16858 x := v.Args[0] 16859 y := v.Args[1] 16860 v_2 := v.Args[2] 16861 if v_2.Op != OpARMMOVWconst { 16862 break 16863 } 16864 c := v_2.AuxInt 16865 v.reset(OpARMTSTshiftRL) 16866 v.AuxInt = c 16867 v.AddArg(x) 16868 v.AddArg(y) 16869 return true 16870 } 16871 return false 16872 } 16873 func rewriteValueARM_OpARMXOR_0(v *Value) bool { 16874 // match: (XOR x (MOVWconst [c])) 16875 // cond: 16876 // result: (XORconst [c] x) 16877 for { 16878 _ = v.Args[1] 16879 x := v.Args[0] 16880 v_1 := v.Args[1] 16881 if v_1.Op != OpARMMOVWconst { 16882 break 16883 } 16884 c := v_1.AuxInt 16885 v.reset(OpARMXORconst) 16886 v.AuxInt = c 16887 v.AddArg(x) 16888 return true 16889 } 16890 // match: (XOR (MOVWconst [c]) x) 16891 // cond: 16892 // result: (XORconst [c] x) 16893 for { 16894 _ = v.Args[1] 16895 v_0 := v.Args[0] 16896 if v_0.Op != OpARMMOVWconst { 16897 break 16898 } 16899 c := v_0.AuxInt 16900 x := v.Args[1] 16901 v.reset(OpARMXORconst) 16902 v.AuxInt = c 16903 v.AddArg(x) 16904 return true 16905 } 16906 // match: (XOR x (SLLconst [c] y)) 16907 // cond: 16908 // result: (XORshiftLL x y [c]) 16909 for { 16910 _ = v.Args[1] 16911 x := v.Args[0] 16912 v_1 := v.Args[1] 16913 if v_1.Op != OpARMSLLconst { 16914 break 16915 } 16916 c := v_1.AuxInt 16917 y := v_1.Args[0] 16918 v.reset(OpARMXORshiftLL) 16919 v.AuxInt = c 16920 v.AddArg(x) 16921 v.AddArg(y) 16922 return true 16923 } 16924 // match: (XOR (SLLconst [c] y) x) 16925 // cond: 16926 // result: (XORshiftLL x y [c]) 16927 for { 16928 _ = v.Args[1] 16929 v_0 := v.Args[0] 16930 if v_0.Op != OpARMSLLconst { 16931 break 16932 } 16933 c := v_0.AuxInt 16934 y := v_0.Args[0] 16935 x := v.Args[1] 16936 v.reset(OpARMXORshiftLL) 16937 v.AuxInt = c 16938 v.AddArg(x) 16939 v.AddArg(y) 16940 return true 16941 } 16942 // match: (XOR x (SRLconst [c] y)) 16943 // cond: 16944 // result: (XORshiftRL x y [c]) 16945 for { 16946 _ = v.Args[1] 16947 x := v.Args[0] 16948 v_1 := v.Args[1] 16949 if v_1.Op != OpARMSRLconst { 16950 break 16951 } 16952 c := v_1.AuxInt 16953 y := v_1.Args[0] 16954 v.reset(OpARMXORshiftRL) 16955 v.AuxInt = c 16956 v.AddArg(x) 16957 v.AddArg(y) 16958 return true 16959 } 16960 // match: (XOR (SRLconst [c] y) x) 16961 // cond: 16962 // result: (XORshiftRL x y [c]) 16963 for { 16964 _ = v.Args[1] 16965 v_0 := v.Args[0] 16966 if v_0.Op != OpARMSRLconst { 16967 break 16968 } 16969 c := v_0.AuxInt 16970 y := v_0.Args[0] 16971 x := v.Args[1] 16972 v.reset(OpARMXORshiftRL) 16973 v.AuxInt = c 16974 v.AddArg(x) 16975 v.AddArg(y) 16976 return true 16977 } 16978 // match: (XOR x (SRAconst [c] y)) 16979 // cond: 16980 // result: (XORshiftRA x y [c]) 16981 for { 16982 _ = v.Args[1] 16983 x := v.Args[0] 16984 v_1 := v.Args[1] 16985 if v_1.Op != OpARMSRAconst { 16986 break 16987 } 16988 c := v_1.AuxInt 16989 y := v_1.Args[0] 16990 v.reset(OpARMXORshiftRA) 16991 v.AuxInt = c 16992 v.AddArg(x) 16993 v.AddArg(y) 16994 return true 16995 } 16996 // match: (XOR (SRAconst [c] y) x) 16997 // cond: 16998 // result: (XORshiftRA x y [c]) 16999 for { 17000 _ = v.Args[1] 17001 v_0 := v.Args[0] 17002 if v_0.Op != OpARMSRAconst { 17003 break 17004 } 17005 c := v_0.AuxInt 17006 y := v_0.Args[0] 17007 x := v.Args[1] 17008 v.reset(OpARMXORshiftRA) 17009 v.AuxInt = c 17010 v.AddArg(x) 17011 v.AddArg(y) 17012 return true 17013 } 17014 // match: (XOR x (SRRconst [c] y)) 17015 // cond: 17016 // result: (XORshiftRR x y [c]) 17017 for { 17018 _ = v.Args[1] 17019 x := v.Args[0] 17020 v_1 := v.Args[1] 17021 if v_1.Op != OpARMSRRconst { 17022 break 17023 } 17024 c := v_1.AuxInt 17025 y := v_1.Args[0] 17026 v.reset(OpARMXORshiftRR) 17027 v.AuxInt = c 17028 v.AddArg(x) 17029 v.AddArg(y) 17030 return true 17031 } 17032 // match: (XOR (SRRconst [c] y) x) 17033 // cond: 17034 // result: (XORshiftRR x y [c]) 17035 for { 17036 _ = v.Args[1] 17037 v_0 := v.Args[0] 17038 if v_0.Op != OpARMSRRconst { 17039 break 17040 } 17041 c := v_0.AuxInt 17042 y := v_0.Args[0] 17043 x := v.Args[1] 17044 v.reset(OpARMXORshiftRR) 17045 v.AuxInt = c 17046 v.AddArg(x) 17047 v.AddArg(y) 17048 return true 17049 } 17050 return false 17051 } 17052 func rewriteValueARM_OpARMXOR_10(v *Value) bool { 17053 // match: (XOR x (SLL y z)) 17054 // cond: 17055 // result: (XORshiftLLreg x y z) 17056 for { 17057 _ = v.Args[1] 17058 x := v.Args[0] 17059 v_1 := v.Args[1] 17060 if v_1.Op != OpARMSLL { 17061 break 17062 } 17063 _ = v_1.Args[1] 17064 y := v_1.Args[0] 17065 z := v_1.Args[1] 17066 v.reset(OpARMXORshiftLLreg) 17067 v.AddArg(x) 17068 v.AddArg(y) 17069 v.AddArg(z) 17070 return true 17071 } 17072 // match: (XOR (SLL y z) x) 17073 // cond: 17074 // result: (XORshiftLLreg x y z) 17075 for { 17076 _ = v.Args[1] 17077 v_0 := v.Args[0] 17078 if v_0.Op != OpARMSLL { 17079 break 17080 } 17081 _ = v_0.Args[1] 17082 y := v_0.Args[0] 17083 z := v_0.Args[1] 17084 x := v.Args[1] 17085 v.reset(OpARMXORshiftLLreg) 17086 v.AddArg(x) 17087 v.AddArg(y) 17088 v.AddArg(z) 17089 return true 17090 } 17091 // match: (XOR x (SRL y z)) 17092 // cond: 17093 // result: (XORshiftRLreg x y z) 17094 for { 17095 _ = v.Args[1] 17096 x := v.Args[0] 17097 v_1 := v.Args[1] 17098 if v_1.Op != OpARMSRL { 17099 break 17100 } 17101 _ = v_1.Args[1] 17102 y := v_1.Args[0] 17103 z := v_1.Args[1] 17104 v.reset(OpARMXORshiftRLreg) 17105 v.AddArg(x) 17106 v.AddArg(y) 17107 v.AddArg(z) 17108 return true 17109 } 17110 // match: (XOR (SRL y z) x) 17111 // cond: 17112 // result: (XORshiftRLreg x y z) 17113 for { 17114 _ = v.Args[1] 17115 v_0 := v.Args[0] 17116 if v_0.Op != OpARMSRL { 17117 break 17118 } 17119 _ = v_0.Args[1] 17120 y := v_0.Args[0] 17121 z := v_0.Args[1] 17122 x := v.Args[1] 17123 v.reset(OpARMXORshiftRLreg) 17124 v.AddArg(x) 17125 v.AddArg(y) 17126 v.AddArg(z) 17127 return true 17128 } 17129 // match: (XOR x (SRA y z)) 17130 // cond: 17131 // result: (XORshiftRAreg x y z) 17132 for { 17133 _ = v.Args[1] 17134 x := v.Args[0] 17135 v_1 := v.Args[1] 17136 if v_1.Op != OpARMSRA { 17137 break 17138 } 17139 _ = v_1.Args[1] 17140 y := v_1.Args[0] 17141 z := v_1.Args[1] 17142 v.reset(OpARMXORshiftRAreg) 17143 v.AddArg(x) 17144 v.AddArg(y) 17145 v.AddArg(z) 17146 return true 17147 } 17148 // match: (XOR (SRA y z) x) 17149 // cond: 17150 // result: (XORshiftRAreg x y z) 17151 for { 17152 _ = v.Args[1] 17153 v_0 := v.Args[0] 17154 if v_0.Op != OpARMSRA { 17155 break 17156 } 17157 _ = v_0.Args[1] 17158 y := v_0.Args[0] 17159 z := v_0.Args[1] 17160 x := v.Args[1] 17161 v.reset(OpARMXORshiftRAreg) 17162 v.AddArg(x) 17163 v.AddArg(y) 17164 v.AddArg(z) 17165 return true 17166 } 17167 // match: (XOR x x) 17168 // cond: 17169 // result: (MOVWconst [0]) 17170 for { 17171 _ = v.Args[1] 17172 x := v.Args[0] 17173 if x != v.Args[1] { 17174 break 17175 } 17176 v.reset(OpARMMOVWconst) 17177 v.AuxInt = 0 17178 return true 17179 } 17180 return false 17181 } 17182 func rewriteValueARM_OpARMXORconst_0(v *Value) bool { 17183 // match: (XORconst [0] x) 17184 // cond: 17185 // result: x 17186 for { 17187 if v.AuxInt != 0 { 17188 break 17189 } 17190 x := v.Args[0] 17191 v.reset(OpCopy) 17192 v.Type = x.Type 17193 v.AddArg(x) 17194 return true 17195 } 17196 // match: (XORconst [c] (MOVWconst [d])) 17197 // cond: 17198 // result: (MOVWconst [c^d]) 17199 for { 17200 c := v.AuxInt 17201 v_0 := v.Args[0] 17202 if v_0.Op != OpARMMOVWconst { 17203 break 17204 } 17205 d := v_0.AuxInt 17206 v.reset(OpARMMOVWconst) 17207 v.AuxInt = c ^ d 17208 return true 17209 } 17210 // match: (XORconst [c] (XORconst [d] x)) 17211 // cond: 17212 // result: (XORconst [c^d] x) 17213 for { 17214 c := v.AuxInt 17215 v_0 := v.Args[0] 17216 if v_0.Op != OpARMXORconst { 17217 break 17218 } 17219 d := v_0.AuxInt 17220 x := v_0.Args[0] 17221 v.reset(OpARMXORconst) 17222 v.AuxInt = c ^ d 17223 v.AddArg(x) 17224 return true 17225 } 17226 return false 17227 } 17228 func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { 17229 b := v.Block 17230 _ = b 17231 // match: (XORshiftLL (MOVWconst [c]) x [d]) 17232 // cond: 17233 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 17234 for { 17235 d := v.AuxInt 17236 _ = v.Args[1] 17237 v_0 := v.Args[0] 17238 if v_0.Op != OpARMMOVWconst { 17239 break 17240 } 17241 c := v_0.AuxInt 17242 x := v.Args[1] 17243 v.reset(OpARMXORconst) 17244 v.AuxInt = c 17245 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 17246 v0.AuxInt = d 17247 v0.AddArg(x) 17248 v.AddArg(v0) 17249 return true 17250 } 17251 // match: (XORshiftLL x (MOVWconst [c]) [d]) 17252 // cond: 17253 // result: (XORconst x [int64(int32(uint32(c)<<uint64(d)))]) 17254 for { 17255 d := v.AuxInt 17256 _ = v.Args[1] 17257 x := v.Args[0] 17258 v_1 := v.Args[1] 17259 if v_1.Op != OpARMMOVWconst { 17260 break 17261 } 17262 c := v_1.AuxInt 17263 v.reset(OpARMXORconst) 17264 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 17265 v.AddArg(x) 17266 return true 17267 } 17268 // match: (XORshiftLL [c] (SRLconst x [32-c]) x) 17269 // cond: 17270 // result: (SRRconst [32-c] x) 17271 for { 17272 c := v.AuxInt 17273 _ = v.Args[1] 17274 v_0 := v.Args[0] 17275 if v_0.Op != OpARMSRLconst { 17276 break 17277 } 17278 if v_0.AuxInt != 32-c { 17279 break 17280 } 17281 x := v_0.Args[0] 17282 if x != v.Args[1] { 17283 break 17284 } 17285 v.reset(OpARMSRRconst) 17286 v.AuxInt = 32 - c 17287 v.AddArg(x) 17288 return true 17289 } 17290 // match: (XORshiftLL x (SLLconst x [c]) [d]) 17291 // cond: c==d 17292 // result: (MOVWconst [0]) 17293 for { 17294 d := v.AuxInt 17295 _ = v.Args[1] 17296 x := v.Args[0] 17297 v_1 := v.Args[1] 17298 if v_1.Op != OpARMSLLconst { 17299 break 17300 } 17301 c := v_1.AuxInt 17302 if x != v_1.Args[0] { 17303 break 17304 } 17305 if !(c == d) { 17306 break 17307 } 17308 v.reset(OpARMMOVWconst) 17309 v.AuxInt = 0 17310 return true 17311 } 17312 return false 17313 } 17314 func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { 17315 b := v.Block 17316 _ = b 17317 // match: (XORshiftLLreg (MOVWconst [c]) x y) 17318 // cond: 17319 // result: (XORconst [c] (SLL <x.Type> x y)) 17320 for { 17321 _ = v.Args[2] 17322 v_0 := v.Args[0] 17323 if v_0.Op != OpARMMOVWconst { 17324 break 17325 } 17326 c := v_0.AuxInt 17327 x := v.Args[1] 17328 y := v.Args[2] 17329 v.reset(OpARMXORconst) 17330 v.AuxInt = c 17331 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 17332 v0.AddArg(x) 17333 v0.AddArg(y) 17334 v.AddArg(v0) 17335 return true 17336 } 17337 // match: (XORshiftLLreg x y (MOVWconst [c])) 17338 // cond: 17339 // result: (XORshiftLL x y [c]) 17340 for { 17341 _ = v.Args[2] 17342 x := v.Args[0] 17343 y := v.Args[1] 17344 v_2 := v.Args[2] 17345 if v_2.Op != OpARMMOVWconst { 17346 break 17347 } 17348 c := v_2.AuxInt 17349 v.reset(OpARMXORshiftLL) 17350 v.AuxInt = c 17351 v.AddArg(x) 17352 v.AddArg(y) 17353 return true 17354 } 17355 return false 17356 } 17357 func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { 17358 b := v.Block 17359 _ = b 17360 // match: (XORshiftRA (MOVWconst [c]) x [d]) 17361 // cond: 17362 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 17363 for { 17364 d := v.AuxInt 17365 _ = v.Args[1] 17366 v_0 := v.Args[0] 17367 if v_0.Op != OpARMMOVWconst { 17368 break 17369 } 17370 c := v_0.AuxInt 17371 x := v.Args[1] 17372 v.reset(OpARMXORconst) 17373 v.AuxInt = c 17374 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 17375 v0.AuxInt = d 17376 v0.AddArg(x) 17377 v.AddArg(v0) 17378 return true 17379 } 17380 // match: (XORshiftRA x (MOVWconst [c]) [d]) 17381 // cond: 17382 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 17383 for { 17384 d := v.AuxInt 17385 _ = v.Args[1] 17386 x := v.Args[0] 17387 v_1 := v.Args[1] 17388 if v_1.Op != OpARMMOVWconst { 17389 break 17390 } 17391 c := v_1.AuxInt 17392 v.reset(OpARMXORconst) 17393 v.AuxInt = int64(int32(c) >> uint64(d)) 17394 v.AddArg(x) 17395 return true 17396 } 17397 // match: (XORshiftRA x (SRAconst x [c]) [d]) 17398 // cond: c==d 17399 // result: (MOVWconst [0]) 17400 for { 17401 d := v.AuxInt 17402 _ = v.Args[1] 17403 x := v.Args[0] 17404 v_1 := v.Args[1] 17405 if v_1.Op != OpARMSRAconst { 17406 break 17407 } 17408 c := v_1.AuxInt 17409 if x != v_1.Args[0] { 17410 break 17411 } 17412 if !(c == d) { 17413 break 17414 } 17415 v.reset(OpARMMOVWconst) 17416 v.AuxInt = 0 17417 return true 17418 } 17419 return false 17420 } 17421 func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { 17422 b := v.Block 17423 _ = b 17424 // match: (XORshiftRAreg (MOVWconst [c]) x y) 17425 // cond: 17426 // result: (XORconst [c] (SRA <x.Type> x y)) 17427 for { 17428 _ = v.Args[2] 17429 v_0 := v.Args[0] 17430 if v_0.Op != OpARMMOVWconst { 17431 break 17432 } 17433 c := v_0.AuxInt 17434 x := v.Args[1] 17435 y := v.Args[2] 17436 v.reset(OpARMXORconst) 17437 v.AuxInt = c 17438 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 17439 v0.AddArg(x) 17440 v0.AddArg(y) 17441 v.AddArg(v0) 17442 return true 17443 } 17444 // match: (XORshiftRAreg x y (MOVWconst [c])) 17445 // cond: 17446 // result: (XORshiftRA x y [c]) 17447 for { 17448 _ = v.Args[2] 17449 x := v.Args[0] 17450 y := v.Args[1] 17451 v_2 := v.Args[2] 17452 if v_2.Op != OpARMMOVWconst { 17453 break 17454 } 17455 c := v_2.AuxInt 17456 v.reset(OpARMXORshiftRA) 17457 v.AuxInt = c 17458 v.AddArg(x) 17459 v.AddArg(y) 17460 return true 17461 } 17462 return false 17463 } 17464 func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { 17465 b := v.Block 17466 _ = b 17467 // match: (XORshiftRL (MOVWconst [c]) x [d]) 17468 // cond: 17469 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 17470 for { 17471 d := v.AuxInt 17472 _ = v.Args[1] 17473 v_0 := v.Args[0] 17474 if v_0.Op != OpARMMOVWconst { 17475 break 17476 } 17477 c := v_0.AuxInt 17478 x := v.Args[1] 17479 v.reset(OpARMXORconst) 17480 v.AuxInt = c 17481 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 17482 v0.AuxInt = d 17483 v0.AddArg(x) 17484 v.AddArg(v0) 17485 return true 17486 } 17487 // match: (XORshiftRL x (MOVWconst [c]) [d]) 17488 // cond: 17489 // result: (XORconst x [int64(int32(uint32(c)>>uint64(d)))]) 17490 for { 17491 d := v.AuxInt 17492 _ = v.Args[1] 17493 x := v.Args[0] 17494 v_1 := v.Args[1] 17495 if v_1.Op != OpARMMOVWconst { 17496 break 17497 } 17498 c := v_1.AuxInt 17499 v.reset(OpARMXORconst) 17500 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 17501 v.AddArg(x) 17502 return true 17503 } 17504 // match: (XORshiftRL [c] (SLLconst x [32-c]) x) 17505 // cond: 17506 // result: (SRRconst [ c] x) 17507 for { 17508 c := v.AuxInt 17509 _ = v.Args[1] 17510 v_0 := v.Args[0] 17511 if v_0.Op != OpARMSLLconst { 17512 break 17513 } 17514 if v_0.AuxInt != 32-c { 17515 break 17516 } 17517 x := v_0.Args[0] 17518 if x != v.Args[1] { 17519 break 17520 } 17521 v.reset(OpARMSRRconst) 17522 v.AuxInt = c 17523 v.AddArg(x) 17524 return true 17525 } 17526 // match: (XORshiftRL x (SRLconst x [c]) [d]) 17527 // cond: c==d 17528 // result: (MOVWconst [0]) 17529 for { 17530 d := v.AuxInt 17531 _ = v.Args[1] 17532 x := v.Args[0] 17533 v_1 := v.Args[1] 17534 if v_1.Op != OpARMSRLconst { 17535 break 17536 } 17537 c := v_1.AuxInt 17538 if x != v_1.Args[0] { 17539 break 17540 } 17541 if !(c == d) { 17542 break 17543 } 17544 v.reset(OpARMMOVWconst) 17545 v.AuxInt = 0 17546 return true 17547 } 17548 return false 17549 } 17550 func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { 17551 b := v.Block 17552 _ = b 17553 // match: (XORshiftRLreg (MOVWconst [c]) x y) 17554 // cond: 17555 // result: (XORconst [c] (SRL <x.Type> x y)) 17556 for { 17557 _ = v.Args[2] 17558 v_0 := v.Args[0] 17559 if v_0.Op != OpARMMOVWconst { 17560 break 17561 } 17562 c := v_0.AuxInt 17563 x := v.Args[1] 17564 y := v.Args[2] 17565 v.reset(OpARMXORconst) 17566 v.AuxInt = c 17567 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17568 v0.AddArg(x) 17569 v0.AddArg(y) 17570 v.AddArg(v0) 17571 return true 17572 } 17573 // match: (XORshiftRLreg x y (MOVWconst [c])) 17574 // cond: 17575 // result: (XORshiftRL x y [c]) 17576 for { 17577 _ = v.Args[2] 17578 x := v.Args[0] 17579 y := v.Args[1] 17580 v_2 := v.Args[2] 17581 if v_2.Op != OpARMMOVWconst { 17582 break 17583 } 17584 c := v_2.AuxInt 17585 v.reset(OpARMXORshiftRL) 17586 v.AuxInt = c 17587 v.AddArg(x) 17588 v.AddArg(y) 17589 return true 17590 } 17591 return false 17592 } 17593 func rewriteValueARM_OpARMXORshiftRR_0(v *Value) bool { 17594 b := v.Block 17595 _ = b 17596 // match: (XORshiftRR (MOVWconst [c]) x [d]) 17597 // cond: 17598 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 17599 for { 17600 d := v.AuxInt 17601 _ = v.Args[1] 17602 v_0 := v.Args[0] 17603 if v_0.Op != OpARMMOVWconst { 17604 break 17605 } 17606 c := v_0.AuxInt 17607 x := v.Args[1] 17608 v.reset(OpARMXORconst) 17609 v.AuxInt = c 17610 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 17611 v0.AuxInt = d 17612 v0.AddArg(x) 17613 v.AddArg(v0) 17614 return true 17615 } 17616 // match: (XORshiftRR x (MOVWconst [c]) [d]) 17617 // cond: 17618 // result: (XORconst x [int64(int32(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d)))]) 17619 for { 17620 d := v.AuxInt 17621 _ = v.Args[1] 17622 x := v.Args[0] 17623 v_1 := v.Args[1] 17624 if v_1.Op != OpARMMOVWconst { 17625 break 17626 } 17627 c := v_1.AuxInt 17628 v.reset(OpARMXORconst) 17629 v.AuxInt = int64(int32(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d))) 17630 v.AddArg(x) 17631 return true 17632 } 17633 return false 17634 } 17635 func rewriteValueARM_OpAdd16_0(v *Value) bool { 17636 // match: (Add16 x y) 17637 // cond: 17638 // result: (ADD x y) 17639 for { 17640 _ = v.Args[1] 17641 x := v.Args[0] 17642 y := v.Args[1] 17643 v.reset(OpARMADD) 17644 v.AddArg(x) 17645 v.AddArg(y) 17646 return true 17647 } 17648 } 17649 func rewriteValueARM_OpAdd32_0(v *Value) bool { 17650 // match: (Add32 x y) 17651 // cond: 17652 // result: (ADD x y) 17653 for { 17654 _ = v.Args[1] 17655 x := v.Args[0] 17656 y := v.Args[1] 17657 v.reset(OpARMADD) 17658 v.AddArg(x) 17659 v.AddArg(y) 17660 return true 17661 } 17662 } 17663 func rewriteValueARM_OpAdd32F_0(v *Value) bool { 17664 // match: (Add32F x y) 17665 // cond: 17666 // result: (ADDF x y) 17667 for { 17668 _ = v.Args[1] 17669 x := v.Args[0] 17670 y := v.Args[1] 17671 v.reset(OpARMADDF) 17672 v.AddArg(x) 17673 v.AddArg(y) 17674 return true 17675 } 17676 } 17677 func rewriteValueARM_OpAdd32carry_0(v *Value) bool { 17678 // match: (Add32carry x y) 17679 // cond: 17680 // result: (ADDS x y) 17681 for { 17682 _ = v.Args[1] 17683 x := v.Args[0] 17684 y := v.Args[1] 17685 v.reset(OpARMADDS) 17686 v.AddArg(x) 17687 v.AddArg(y) 17688 return true 17689 } 17690 } 17691 func rewriteValueARM_OpAdd32withcarry_0(v *Value) bool { 17692 // match: (Add32withcarry x y c) 17693 // cond: 17694 // result: (ADC x y c) 17695 for { 17696 _ = v.Args[2] 17697 x := v.Args[0] 17698 y := v.Args[1] 17699 c := v.Args[2] 17700 v.reset(OpARMADC) 17701 v.AddArg(x) 17702 v.AddArg(y) 17703 v.AddArg(c) 17704 return true 17705 } 17706 } 17707 func rewriteValueARM_OpAdd64F_0(v *Value) bool { 17708 // match: (Add64F x y) 17709 // cond: 17710 // result: (ADDD x y) 17711 for { 17712 _ = v.Args[1] 17713 x := v.Args[0] 17714 y := v.Args[1] 17715 v.reset(OpARMADDD) 17716 v.AddArg(x) 17717 v.AddArg(y) 17718 return true 17719 } 17720 } 17721 func rewriteValueARM_OpAdd8_0(v *Value) bool { 17722 // match: (Add8 x y) 17723 // cond: 17724 // result: (ADD x y) 17725 for { 17726 _ = v.Args[1] 17727 x := v.Args[0] 17728 y := v.Args[1] 17729 v.reset(OpARMADD) 17730 v.AddArg(x) 17731 v.AddArg(y) 17732 return true 17733 } 17734 } 17735 func rewriteValueARM_OpAddPtr_0(v *Value) bool { 17736 // match: (AddPtr x y) 17737 // cond: 17738 // result: (ADD x y) 17739 for { 17740 _ = v.Args[1] 17741 x := v.Args[0] 17742 y := v.Args[1] 17743 v.reset(OpARMADD) 17744 v.AddArg(x) 17745 v.AddArg(y) 17746 return true 17747 } 17748 } 17749 func rewriteValueARM_OpAddr_0(v *Value) bool { 17750 // match: (Addr {sym} base) 17751 // cond: 17752 // result: (MOVWaddr {sym} base) 17753 for { 17754 sym := v.Aux 17755 base := v.Args[0] 17756 v.reset(OpARMMOVWaddr) 17757 v.Aux = sym 17758 v.AddArg(base) 17759 return true 17760 } 17761 } 17762 func rewriteValueARM_OpAnd16_0(v *Value) bool { 17763 // match: (And16 x y) 17764 // cond: 17765 // result: (AND x y) 17766 for { 17767 _ = v.Args[1] 17768 x := v.Args[0] 17769 y := v.Args[1] 17770 v.reset(OpARMAND) 17771 v.AddArg(x) 17772 v.AddArg(y) 17773 return true 17774 } 17775 } 17776 func rewriteValueARM_OpAnd32_0(v *Value) bool { 17777 // match: (And32 x y) 17778 // cond: 17779 // result: (AND x y) 17780 for { 17781 _ = v.Args[1] 17782 x := v.Args[0] 17783 y := v.Args[1] 17784 v.reset(OpARMAND) 17785 v.AddArg(x) 17786 v.AddArg(y) 17787 return true 17788 } 17789 } 17790 func rewriteValueARM_OpAnd8_0(v *Value) bool { 17791 // match: (And8 x y) 17792 // cond: 17793 // result: (AND x y) 17794 for { 17795 _ = v.Args[1] 17796 x := v.Args[0] 17797 y := v.Args[1] 17798 v.reset(OpARMAND) 17799 v.AddArg(x) 17800 v.AddArg(y) 17801 return true 17802 } 17803 } 17804 func rewriteValueARM_OpAndB_0(v *Value) bool { 17805 // match: (AndB x y) 17806 // cond: 17807 // result: (AND x y) 17808 for { 17809 _ = v.Args[1] 17810 x := v.Args[0] 17811 y := v.Args[1] 17812 v.reset(OpARMAND) 17813 v.AddArg(x) 17814 v.AddArg(y) 17815 return true 17816 } 17817 } 17818 func rewriteValueARM_OpAvg32u_0(v *Value) bool { 17819 b := v.Block 17820 _ = b 17821 // match: (Avg32u <t> x y) 17822 // cond: 17823 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 17824 for { 17825 t := v.Type 17826 _ = v.Args[1] 17827 x := v.Args[0] 17828 y := v.Args[1] 17829 v.reset(OpARMADD) 17830 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 17831 v0.AuxInt = 1 17832 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 17833 v1.AddArg(x) 17834 v1.AddArg(y) 17835 v0.AddArg(v1) 17836 v.AddArg(v0) 17837 v.AddArg(y) 17838 return true 17839 } 17840 } 17841 func rewriteValueARM_OpBitLen32_0(v *Value) bool { 17842 b := v.Block 17843 _ = b 17844 // match: (BitLen32 <t> x) 17845 // cond: 17846 // result: (RSBconst [32] (CLZ <t> x)) 17847 for { 17848 t := v.Type 17849 x := v.Args[0] 17850 v.reset(OpARMRSBconst) 17851 v.AuxInt = 32 17852 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 17853 v0.AddArg(x) 17854 v.AddArg(v0) 17855 return true 17856 } 17857 } 17858 func rewriteValueARM_OpBswap32_0(v *Value) bool { 17859 b := v.Block 17860 _ = b 17861 // match: (Bswap32 <t> x) 17862 // cond: objabi.GOARM==5 17863 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 17864 for { 17865 t := v.Type 17866 x := v.Args[0] 17867 if !(objabi.GOARM == 5) { 17868 break 17869 } 17870 v.reset(OpARMXOR) 17871 v.Type = t 17872 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 17873 v0.AuxInt = 8 17874 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 17875 v1.AuxInt = 0xff0000 17876 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 17877 v2.AddArg(x) 17878 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 17879 v3.AuxInt = 16 17880 v3.AddArg(x) 17881 v2.AddArg(v3) 17882 v1.AddArg(v2) 17883 v0.AddArg(v1) 17884 v.AddArg(v0) 17885 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 17886 v4.AuxInt = 8 17887 v4.AddArg(x) 17888 v.AddArg(v4) 17889 return true 17890 } 17891 // match: (Bswap32 x) 17892 // cond: objabi.GOARM>=6 17893 // result: (REV x) 17894 for { 17895 x := v.Args[0] 17896 if !(objabi.GOARM >= 6) { 17897 break 17898 } 17899 v.reset(OpARMREV) 17900 v.AddArg(x) 17901 return true 17902 } 17903 return false 17904 } 17905 func rewriteValueARM_OpClosureCall_0(v *Value) bool { 17906 // match: (ClosureCall [argwid] entry closure mem) 17907 // cond: 17908 // result: (CALLclosure [argwid] entry closure mem) 17909 for { 17910 argwid := v.AuxInt 17911 _ = v.Args[2] 17912 entry := v.Args[0] 17913 closure := v.Args[1] 17914 mem := v.Args[2] 17915 v.reset(OpARMCALLclosure) 17916 v.AuxInt = argwid 17917 v.AddArg(entry) 17918 v.AddArg(closure) 17919 v.AddArg(mem) 17920 return true 17921 } 17922 } 17923 func rewriteValueARM_OpCom16_0(v *Value) bool { 17924 // match: (Com16 x) 17925 // cond: 17926 // result: (MVN x) 17927 for { 17928 x := v.Args[0] 17929 v.reset(OpARMMVN) 17930 v.AddArg(x) 17931 return true 17932 } 17933 } 17934 func rewriteValueARM_OpCom32_0(v *Value) bool { 17935 // match: (Com32 x) 17936 // cond: 17937 // result: (MVN x) 17938 for { 17939 x := v.Args[0] 17940 v.reset(OpARMMVN) 17941 v.AddArg(x) 17942 return true 17943 } 17944 } 17945 func rewriteValueARM_OpCom8_0(v *Value) bool { 17946 // match: (Com8 x) 17947 // cond: 17948 // result: (MVN x) 17949 for { 17950 x := v.Args[0] 17951 v.reset(OpARMMVN) 17952 v.AddArg(x) 17953 return true 17954 } 17955 } 17956 func rewriteValueARM_OpConst16_0(v *Value) bool { 17957 // match: (Const16 [val]) 17958 // cond: 17959 // result: (MOVWconst [val]) 17960 for { 17961 val := v.AuxInt 17962 v.reset(OpARMMOVWconst) 17963 v.AuxInt = val 17964 return true 17965 } 17966 } 17967 func rewriteValueARM_OpConst32_0(v *Value) bool { 17968 // match: (Const32 [val]) 17969 // cond: 17970 // result: (MOVWconst [val]) 17971 for { 17972 val := v.AuxInt 17973 v.reset(OpARMMOVWconst) 17974 v.AuxInt = val 17975 return true 17976 } 17977 } 17978 func rewriteValueARM_OpConst32F_0(v *Value) bool { 17979 // match: (Const32F [val]) 17980 // cond: 17981 // result: (MOVFconst [val]) 17982 for { 17983 val := v.AuxInt 17984 v.reset(OpARMMOVFconst) 17985 v.AuxInt = val 17986 return true 17987 } 17988 } 17989 func rewriteValueARM_OpConst64F_0(v *Value) bool { 17990 // match: (Const64F [val]) 17991 // cond: 17992 // result: (MOVDconst [val]) 17993 for { 17994 val := v.AuxInt 17995 v.reset(OpARMMOVDconst) 17996 v.AuxInt = val 17997 return true 17998 } 17999 } 18000 func rewriteValueARM_OpConst8_0(v *Value) bool { 18001 // match: (Const8 [val]) 18002 // cond: 18003 // result: (MOVWconst [val]) 18004 for { 18005 val := v.AuxInt 18006 v.reset(OpARMMOVWconst) 18007 v.AuxInt = val 18008 return true 18009 } 18010 } 18011 func rewriteValueARM_OpConstBool_0(v *Value) bool { 18012 // match: (ConstBool [b]) 18013 // cond: 18014 // result: (MOVWconst [b]) 18015 for { 18016 b := v.AuxInt 18017 v.reset(OpARMMOVWconst) 18018 v.AuxInt = b 18019 return true 18020 } 18021 } 18022 func rewriteValueARM_OpConstNil_0(v *Value) bool { 18023 // match: (ConstNil) 18024 // cond: 18025 // result: (MOVWconst [0]) 18026 for { 18027 v.reset(OpARMMOVWconst) 18028 v.AuxInt = 0 18029 return true 18030 } 18031 } 18032 func rewriteValueARM_OpCtz32_0(v *Value) bool { 18033 b := v.Block 18034 _ = b 18035 // match: (Ctz32 <t> x) 18036 // cond: objabi.GOARM<=6 18037 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 18038 for { 18039 t := v.Type 18040 x := v.Args[0] 18041 if !(objabi.GOARM <= 6) { 18042 break 18043 } 18044 v.reset(OpARMRSBconst) 18045 v.AuxInt = 32 18046 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 18047 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 18048 v1.AuxInt = 1 18049 v2 := b.NewValue0(v.Pos, OpARMAND, t) 18050 v2.AddArg(x) 18051 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 18052 v3.AuxInt = 0 18053 v3.AddArg(x) 18054 v2.AddArg(v3) 18055 v1.AddArg(v2) 18056 v0.AddArg(v1) 18057 v.AddArg(v0) 18058 return true 18059 } 18060 // match: (Ctz32 <t> x) 18061 // cond: objabi.GOARM==7 18062 // result: (CLZ <t> (RBIT <t> x)) 18063 for { 18064 t := v.Type 18065 x := v.Args[0] 18066 if !(objabi.GOARM == 7) { 18067 break 18068 } 18069 v.reset(OpARMCLZ) 18070 v.Type = t 18071 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 18072 v0.AddArg(x) 18073 v.AddArg(v0) 18074 return true 18075 } 18076 return false 18077 } 18078 func rewriteValueARM_OpCtz32NonZero_0(v *Value) bool { 18079 // match: (Ctz32NonZero x) 18080 // cond: 18081 // result: (Ctz32 x) 18082 for { 18083 x := v.Args[0] 18084 v.reset(OpCtz32) 18085 v.AddArg(x) 18086 return true 18087 } 18088 } 18089 func rewriteValueARM_OpCvt32Fto32_0(v *Value) bool { 18090 // match: (Cvt32Fto32 x) 18091 // cond: 18092 // result: (MOVFW x) 18093 for { 18094 x := v.Args[0] 18095 v.reset(OpARMMOVFW) 18096 v.AddArg(x) 18097 return true 18098 } 18099 } 18100 func rewriteValueARM_OpCvt32Fto32U_0(v *Value) bool { 18101 // match: (Cvt32Fto32U x) 18102 // cond: 18103 // result: (MOVFWU x) 18104 for { 18105 x := v.Args[0] 18106 v.reset(OpARMMOVFWU) 18107 v.AddArg(x) 18108 return true 18109 } 18110 } 18111 func rewriteValueARM_OpCvt32Fto64F_0(v *Value) bool { 18112 // match: (Cvt32Fto64F x) 18113 // cond: 18114 // result: (MOVFD x) 18115 for { 18116 x := v.Args[0] 18117 v.reset(OpARMMOVFD) 18118 v.AddArg(x) 18119 return true 18120 } 18121 } 18122 func rewriteValueARM_OpCvt32Uto32F_0(v *Value) bool { 18123 // match: (Cvt32Uto32F x) 18124 // cond: 18125 // result: (MOVWUF x) 18126 for { 18127 x := v.Args[0] 18128 v.reset(OpARMMOVWUF) 18129 v.AddArg(x) 18130 return true 18131 } 18132 } 18133 func rewriteValueARM_OpCvt32Uto64F_0(v *Value) bool { 18134 // match: (Cvt32Uto64F x) 18135 // cond: 18136 // result: (MOVWUD x) 18137 for { 18138 x := v.Args[0] 18139 v.reset(OpARMMOVWUD) 18140 v.AddArg(x) 18141 return true 18142 } 18143 } 18144 func rewriteValueARM_OpCvt32to32F_0(v *Value) bool { 18145 // match: (Cvt32to32F x) 18146 // cond: 18147 // result: (MOVWF x) 18148 for { 18149 x := v.Args[0] 18150 v.reset(OpARMMOVWF) 18151 v.AddArg(x) 18152 return true 18153 } 18154 } 18155 func rewriteValueARM_OpCvt32to64F_0(v *Value) bool { 18156 // match: (Cvt32to64F x) 18157 // cond: 18158 // result: (MOVWD x) 18159 for { 18160 x := v.Args[0] 18161 v.reset(OpARMMOVWD) 18162 v.AddArg(x) 18163 return true 18164 } 18165 } 18166 func rewriteValueARM_OpCvt64Fto32_0(v *Value) bool { 18167 // match: (Cvt64Fto32 x) 18168 // cond: 18169 // result: (MOVDW x) 18170 for { 18171 x := v.Args[0] 18172 v.reset(OpARMMOVDW) 18173 v.AddArg(x) 18174 return true 18175 } 18176 } 18177 func rewriteValueARM_OpCvt64Fto32F_0(v *Value) bool { 18178 // match: (Cvt64Fto32F x) 18179 // cond: 18180 // result: (MOVDF x) 18181 for { 18182 x := v.Args[0] 18183 v.reset(OpARMMOVDF) 18184 v.AddArg(x) 18185 return true 18186 } 18187 } 18188 func rewriteValueARM_OpCvt64Fto32U_0(v *Value) bool { 18189 // match: (Cvt64Fto32U x) 18190 // cond: 18191 // result: (MOVDWU x) 18192 for { 18193 x := v.Args[0] 18194 v.reset(OpARMMOVDWU) 18195 v.AddArg(x) 18196 return true 18197 } 18198 } 18199 func rewriteValueARM_OpDiv16_0(v *Value) bool { 18200 b := v.Block 18201 _ = b 18202 typ := &b.Func.Config.Types 18203 _ = typ 18204 // match: (Div16 x y) 18205 // cond: 18206 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 18207 for { 18208 _ = v.Args[1] 18209 x := v.Args[0] 18210 y := v.Args[1] 18211 v.reset(OpDiv32) 18212 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18213 v0.AddArg(x) 18214 v.AddArg(v0) 18215 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18216 v1.AddArg(y) 18217 v.AddArg(v1) 18218 return true 18219 } 18220 } 18221 func rewriteValueARM_OpDiv16u_0(v *Value) bool { 18222 b := v.Block 18223 _ = b 18224 typ := &b.Func.Config.Types 18225 _ = typ 18226 // match: (Div16u x y) 18227 // cond: 18228 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 18229 for { 18230 _ = v.Args[1] 18231 x := v.Args[0] 18232 y := v.Args[1] 18233 v.reset(OpDiv32u) 18234 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18235 v0.AddArg(x) 18236 v.AddArg(v0) 18237 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18238 v1.AddArg(y) 18239 v.AddArg(v1) 18240 return true 18241 } 18242 } 18243 func rewriteValueARM_OpDiv32_0(v *Value) bool { 18244 b := v.Block 18245 _ = b 18246 typ := &b.Func.Config.Types 18247 _ = typ 18248 // match: (Div32 x y) 18249 // cond: 18250 // 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))) 18251 for { 18252 _ = v.Args[1] 18253 x := v.Args[0] 18254 y := v.Args[1] 18255 v.reset(OpARMSUB) 18256 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18257 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 18258 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 18259 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 18260 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18261 v4.AddArg(x) 18262 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18263 v5.AddArg(x) 18264 v4.AddArg(v5) 18265 v3.AddArg(v4) 18266 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18267 v6.AddArg(x) 18268 v3.AddArg(v6) 18269 v2.AddArg(v3) 18270 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 18271 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18272 v8.AddArg(y) 18273 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18274 v9.AddArg(y) 18275 v8.AddArg(v9) 18276 v7.AddArg(v8) 18277 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18278 v10.AddArg(y) 18279 v7.AddArg(v10) 18280 v2.AddArg(v7) 18281 v1.AddArg(v2) 18282 v0.AddArg(v1) 18283 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18284 v12 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18285 v12.AddArg(x) 18286 v12.AddArg(y) 18287 v11.AddArg(v12) 18288 v0.AddArg(v11) 18289 v.AddArg(v0) 18290 v13 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18291 v14 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18292 v14.AddArg(x) 18293 v14.AddArg(y) 18294 v13.AddArg(v14) 18295 v.AddArg(v13) 18296 return true 18297 } 18298 } 18299 func rewriteValueARM_OpDiv32F_0(v *Value) bool { 18300 // match: (Div32F x y) 18301 // cond: 18302 // result: (DIVF x y) 18303 for { 18304 _ = v.Args[1] 18305 x := v.Args[0] 18306 y := v.Args[1] 18307 v.reset(OpARMDIVF) 18308 v.AddArg(x) 18309 v.AddArg(y) 18310 return true 18311 } 18312 } 18313 func rewriteValueARM_OpDiv32u_0(v *Value) bool { 18314 b := v.Block 18315 _ = b 18316 typ := &b.Func.Config.Types 18317 _ = typ 18318 // match: (Div32u x y) 18319 // cond: 18320 // result: (Select0 <typ.UInt32> (CALLudiv x y)) 18321 for { 18322 _ = v.Args[1] 18323 x := v.Args[0] 18324 y := v.Args[1] 18325 v.reset(OpSelect0) 18326 v.Type = typ.UInt32 18327 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 18328 v0.AddArg(x) 18329 v0.AddArg(y) 18330 v.AddArg(v0) 18331 return true 18332 } 18333 } 18334 func rewriteValueARM_OpDiv64F_0(v *Value) bool { 18335 // match: (Div64F x y) 18336 // cond: 18337 // result: (DIVD x y) 18338 for { 18339 _ = v.Args[1] 18340 x := v.Args[0] 18341 y := v.Args[1] 18342 v.reset(OpARMDIVD) 18343 v.AddArg(x) 18344 v.AddArg(y) 18345 return true 18346 } 18347 } 18348 func rewriteValueARM_OpDiv8_0(v *Value) bool { 18349 b := v.Block 18350 _ = b 18351 typ := &b.Func.Config.Types 18352 _ = typ 18353 // match: (Div8 x y) 18354 // cond: 18355 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 18356 for { 18357 _ = v.Args[1] 18358 x := v.Args[0] 18359 y := v.Args[1] 18360 v.reset(OpDiv32) 18361 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18362 v0.AddArg(x) 18363 v.AddArg(v0) 18364 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18365 v1.AddArg(y) 18366 v.AddArg(v1) 18367 return true 18368 } 18369 } 18370 func rewriteValueARM_OpDiv8u_0(v *Value) bool { 18371 b := v.Block 18372 _ = b 18373 typ := &b.Func.Config.Types 18374 _ = typ 18375 // match: (Div8u x y) 18376 // cond: 18377 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 18378 for { 18379 _ = v.Args[1] 18380 x := v.Args[0] 18381 y := v.Args[1] 18382 v.reset(OpDiv32u) 18383 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18384 v0.AddArg(x) 18385 v.AddArg(v0) 18386 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18387 v1.AddArg(y) 18388 v.AddArg(v1) 18389 return true 18390 } 18391 } 18392 func rewriteValueARM_OpEq16_0(v *Value) bool { 18393 b := v.Block 18394 _ = b 18395 typ := &b.Func.Config.Types 18396 _ = typ 18397 // match: (Eq16 x y) 18398 // cond: 18399 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18400 for { 18401 _ = v.Args[1] 18402 x := v.Args[0] 18403 y := v.Args[1] 18404 v.reset(OpARMEqual) 18405 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18406 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18407 v1.AddArg(x) 18408 v0.AddArg(v1) 18409 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18410 v2.AddArg(y) 18411 v0.AddArg(v2) 18412 v.AddArg(v0) 18413 return true 18414 } 18415 } 18416 func rewriteValueARM_OpEq32_0(v *Value) bool { 18417 b := v.Block 18418 _ = b 18419 // match: (Eq32 x y) 18420 // cond: 18421 // result: (Equal (CMP x y)) 18422 for { 18423 _ = v.Args[1] 18424 x := v.Args[0] 18425 y := v.Args[1] 18426 v.reset(OpARMEqual) 18427 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18428 v0.AddArg(x) 18429 v0.AddArg(y) 18430 v.AddArg(v0) 18431 return true 18432 } 18433 } 18434 func rewriteValueARM_OpEq32F_0(v *Value) bool { 18435 b := v.Block 18436 _ = b 18437 // match: (Eq32F x y) 18438 // cond: 18439 // result: (Equal (CMPF x y)) 18440 for { 18441 _ = v.Args[1] 18442 x := v.Args[0] 18443 y := v.Args[1] 18444 v.reset(OpARMEqual) 18445 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18446 v0.AddArg(x) 18447 v0.AddArg(y) 18448 v.AddArg(v0) 18449 return true 18450 } 18451 } 18452 func rewriteValueARM_OpEq64F_0(v *Value) bool { 18453 b := v.Block 18454 _ = b 18455 // match: (Eq64F x y) 18456 // cond: 18457 // result: (Equal (CMPD x y)) 18458 for { 18459 _ = v.Args[1] 18460 x := v.Args[0] 18461 y := v.Args[1] 18462 v.reset(OpARMEqual) 18463 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18464 v0.AddArg(x) 18465 v0.AddArg(y) 18466 v.AddArg(v0) 18467 return true 18468 } 18469 } 18470 func rewriteValueARM_OpEq8_0(v *Value) bool { 18471 b := v.Block 18472 _ = b 18473 typ := &b.Func.Config.Types 18474 _ = typ 18475 // match: (Eq8 x y) 18476 // cond: 18477 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 18478 for { 18479 _ = v.Args[1] 18480 x := v.Args[0] 18481 y := v.Args[1] 18482 v.reset(OpARMEqual) 18483 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18484 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18485 v1.AddArg(x) 18486 v0.AddArg(v1) 18487 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18488 v2.AddArg(y) 18489 v0.AddArg(v2) 18490 v.AddArg(v0) 18491 return true 18492 } 18493 } 18494 func rewriteValueARM_OpEqB_0(v *Value) bool { 18495 b := v.Block 18496 _ = b 18497 typ := &b.Func.Config.Types 18498 _ = typ 18499 // match: (EqB x y) 18500 // cond: 18501 // result: (XORconst [1] (XOR <typ.Bool> x y)) 18502 for { 18503 _ = v.Args[1] 18504 x := v.Args[0] 18505 y := v.Args[1] 18506 v.reset(OpARMXORconst) 18507 v.AuxInt = 1 18508 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool) 18509 v0.AddArg(x) 18510 v0.AddArg(y) 18511 v.AddArg(v0) 18512 return true 18513 } 18514 } 18515 func rewriteValueARM_OpEqPtr_0(v *Value) bool { 18516 b := v.Block 18517 _ = b 18518 // match: (EqPtr x y) 18519 // cond: 18520 // result: (Equal (CMP x y)) 18521 for { 18522 _ = v.Args[1] 18523 x := v.Args[0] 18524 y := v.Args[1] 18525 v.reset(OpARMEqual) 18526 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18527 v0.AddArg(x) 18528 v0.AddArg(y) 18529 v.AddArg(v0) 18530 return true 18531 } 18532 } 18533 func rewriteValueARM_OpGeq16_0(v *Value) bool { 18534 b := v.Block 18535 _ = b 18536 typ := &b.Func.Config.Types 18537 _ = typ 18538 // match: (Geq16 x y) 18539 // cond: 18540 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 18541 for { 18542 _ = v.Args[1] 18543 x := v.Args[0] 18544 y := v.Args[1] 18545 v.reset(OpARMGreaterEqual) 18546 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18547 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18548 v1.AddArg(x) 18549 v0.AddArg(v1) 18550 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18551 v2.AddArg(y) 18552 v0.AddArg(v2) 18553 v.AddArg(v0) 18554 return true 18555 } 18556 } 18557 func rewriteValueARM_OpGeq16U_0(v *Value) bool { 18558 b := v.Block 18559 _ = b 18560 typ := &b.Func.Config.Types 18561 _ = typ 18562 // match: (Geq16U x y) 18563 // cond: 18564 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18565 for { 18566 _ = v.Args[1] 18567 x := v.Args[0] 18568 y := v.Args[1] 18569 v.reset(OpARMGreaterEqualU) 18570 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18571 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18572 v1.AddArg(x) 18573 v0.AddArg(v1) 18574 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18575 v2.AddArg(y) 18576 v0.AddArg(v2) 18577 v.AddArg(v0) 18578 return true 18579 } 18580 } 18581 func rewriteValueARM_OpGeq32_0(v *Value) bool { 18582 b := v.Block 18583 _ = b 18584 // match: (Geq32 x y) 18585 // cond: 18586 // result: (GreaterEqual (CMP x y)) 18587 for { 18588 _ = v.Args[1] 18589 x := v.Args[0] 18590 y := v.Args[1] 18591 v.reset(OpARMGreaterEqual) 18592 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18593 v0.AddArg(x) 18594 v0.AddArg(y) 18595 v.AddArg(v0) 18596 return true 18597 } 18598 } 18599 func rewriteValueARM_OpGeq32F_0(v *Value) bool { 18600 b := v.Block 18601 _ = b 18602 // match: (Geq32F x y) 18603 // cond: 18604 // result: (GreaterEqual (CMPF x y)) 18605 for { 18606 _ = v.Args[1] 18607 x := v.Args[0] 18608 y := v.Args[1] 18609 v.reset(OpARMGreaterEqual) 18610 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18611 v0.AddArg(x) 18612 v0.AddArg(y) 18613 v.AddArg(v0) 18614 return true 18615 } 18616 } 18617 func rewriteValueARM_OpGeq32U_0(v *Value) bool { 18618 b := v.Block 18619 _ = b 18620 // match: (Geq32U x y) 18621 // cond: 18622 // result: (GreaterEqualU (CMP x y)) 18623 for { 18624 _ = v.Args[1] 18625 x := v.Args[0] 18626 y := v.Args[1] 18627 v.reset(OpARMGreaterEqualU) 18628 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18629 v0.AddArg(x) 18630 v0.AddArg(y) 18631 v.AddArg(v0) 18632 return true 18633 } 18634 } 18635 func rewriteValueARM_OpGeq64F_0(v *Value) bool { 18636 b := v.Block 18637 _ = b 18638 // match: (Geq64F x y) 18639 // cond: 18640 // result: (GreaterEqual (CMPD x y)) 18641 for { 18642 _ = v.Args[1] 18643 x := v.Args[0] 18644 y := v.Args[1] 18645 v.reset(OpARMGreaterEqual) 18646 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18647 v0.AddArg(x) 18648 v0.AddArg(y) 18649 v.AddArg(v0) 18650 return true 18651 } 18652 } 18653 func rewriteValueARM_OpGeq8_0(v *Value) bool { 18654 b := v.Block 18655 _ = b 18656 typ := &b.Func.Config.Types 18657 _ = typ 18658 // match: (Geq8 x y) 18659 // cond: 18660 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 18661 for { 18662 _ = v.Args[1] 18663 x := v.Args[0] 18664 y := v.Args[1] 18665 v.reset(OpARMGreaterEqual) 18666 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18667 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18668 v1.AddArg(x) 18669 v0.AddArg(v1) 18670 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18671 v2.AddArg(y) 18672 v0.AddArg(v2) 18673 v.AddArg(v0) 18674 return true 18675 } 18676 } 18677 func rewriteValueARM_OpGeq8U_0(v *Value) bool { 18678 b := v.Block 18679 _ = b 18680 typ := &b.Func.Config.Types 18681 _ = typ 18682 // match: (Geq8U x y) 18683 // cond: 18684 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 18685 for { 18686 _ = v.Args[1] 18687 x := v.Args[0] 18688 y := v.Args[1] 18689 v.reset(OpARMGreaterEqualU) 18690 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18691 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18692 v1.AddArg(x) 18693 v0.AddArg(v1) 18694 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18695 v2.AddArg(y) 18696 v0.AddArg(v2) 18697 v.AddArg(v0) 18698 return true 18699 } 18700 } 18701 func rewriteValueARM_OpGetCallerPC_0(v *Value) bool { 18702 // match: (GetCallerPC) 18703 // cond: 18704 // result: (LoweredGetCallerPC) 18705 for { 18706 v.reset(OpARMLoweredGetCallerPC) 18707 return true 18708 } 18709 } 18710 func rewriteValueARM_OpGetCallerSP_0(v *Value) bool { 18711 // match: (GetCallerSP) 18712 // cond: 18713 // result: (LoweredGetCallerSP) 18714 for { 18715 v.reset(OpARMLoweredGetCallerSP) 18716 return true 18717 } 18718 } 18719 func rewriteValueARM_OpGetClosurePtr_0(v *Value) bool { 18720 // match: (GetClosurePtr) 18721 // cond: 18722 // result: (LoweredGetClosurePtr) 18723 for { 18724 v.reset(OpARMLoweredGetClosurePtr) 18725 return true 18726 } 18727 } 18728 func rewriteValueARM_OpGreater16_0(v *Value) bool { 18729 b := v.Block 18730 _ = b 18731 typ := &b.Func.Config.Types 18732 _ = typ 18733 // match: (Greater16 x y) 18734 // cond: 18735 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 18736 for { 18737 _ = v.Args[1] 18738 x := v.Args[0] 18739 y := v.Args[1] 18740 v.reset(OpARMGreaterThan) 18741 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18742 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18743 v1.AddArg(x) 18744 v0.AddArg(v1) 18745 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18746 v2.AddArg(y) 18747 v0.AddArg(v2) 18748 v.AddArg(v0) 18749 return true 18750 } 18751 } 18752 func rewriteValueARM_OpGreater16U_0(v *Value) bool { 18753 b := v.Block 18754 _ = b 18755 typ := &b.Func.Config.Types 18756 _ = typ 18757 // match: (Greater16U x y) 18758 // cond: 18759 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18760 for { 18761 _ = v.Args[1] 18762 x := v.Args[0] 18763 y := v.Args[1] 18764 v.reset(OpARMGreaterThanU) 18765 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18766 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18767 v1.AddArg(x) 18768 v0.AddArg(v1) 18769 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18770 v2.AddArg(y) 18771 v0.AddArg(v2) 18772 v.AddArg(v0) 18773 return true 18774 } 18775 } 18776 func rewriteValueARM_OpGreater32_0(v *Value) bool { 18777 b := v.Block 18778 _ = b 18779 // match: (Greater32 x y) 18780 // cond: 18781 // result: (GreaterThan (CMP x y)) 18782 for { 18783 _ = v.Args[1] 18784 x := v.Args[0] 18785 y := v.Args[1] 18786 v.reset(OpARMGreaterThan) 18787 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18788 v0.AddArg(x) 18789 v0.AddArg(y) 18790 v.AddArg(v0) 18791 return true 18792 } 18793 } 18794 func rewriteValueARM_OpGreater32F_0(v *Value) bool { 18795 b := v.Block 18796 _ = b 18797 // match: (Greater32F x y) 18798 // cond: 18799 // result: (GreaterThan (CMPF x y)) 18800 for { 18801 _ = v.Args[1] 18802 x := v.Args[0] 18803 y := v.Args[1] 18804 v.reset(OpARMGreaterThan) 18805 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18806 v0.AddArg(x) 18807 v0.AddArg(y) 18808 v.AddArg(v0) 18809 return true 18810 } 18811 } 18812 func rewriteValueARM_OpGreater32U_0(v *Value) bool { 18813 b := v.Block 18814 _ = b 18815 // match: (Greater32U x y) 18816 // cond: 18817 // result: (GreaterThanU (CMP x y)) 18818 for { 18819 _ = v.Args[1] 18820 x := v.Args[0] 18821 y := v.Args[1] 18822 v.reset(OpARMGreaterThanU) 18823 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18824 v0.AddArg(x) 18825 v0.AddArg(y) 18826 v.AddArg(v0) 18827 return true 18828 } 18829 } 18830 func rewriteValueARM_OpGreater64F_0(v *Value) bool { 18831 b := v.Block 18832 _ = b 18833 // match: (Greater64F x y) 18834 // cond: 18835 // result: (GreaterThan (CMPD x y)) 18836 for { 18837 _ = v.Args[1] 18838 x := v.Args[0] 18839 y := v.Args[1] 18840 v.reset(OpARMGreaterThan) 18841 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18842 v0.AddArg(x) 18843 v0.AddArg(y) 18844 v.AddArg(v0) 18845 return true 18846 } 18847 } 18848 func rewriteValueARM_OpGreater8_0(v *Value) bool { 18849 b := v.Block 18850 _ = b 18851 typ := &b.Func.Config.Types 18852 _ = typ 18853 // match: (Greater8 x y) 18854 // cond: 18855 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 18856 for { 18857 _ = v.Args[1] 18858 x := v.Args[0] 18859 y := v.Args[1] 18860 v.reset(OpARMGreaterThan) 18861 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18862 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18863 v1.AddArg(x) 18864 v0.AddArg(v1) 18865 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18866 v2.AddArg(y) 18867 v0.AddArg(v2) 18868 v.AddArg(v0) 18869 return true 18870 } 18871 } 18872 func rewriteValueARM_OpGreater8U_0(v *Value) bool { 18873 b := v.Block 18874 _ = b 18875 typ := &b.Func.Config.Types 18876 _ = typ 18877 // match: (Greater8U x y) 18878 // cond: 18879 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 18880 for { 18881 _ = v.Args[1] 18882 x := v.Args[0] 18883 y := v.Args[1] 18884 v.reset(OpARMGreaterThanU) 18885 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18886 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18887 v1.AddArg(x) 18888 v0.AddArg(v1) 18889 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18890 v2.AddArg(y) 18891 v0.AddArg(v2) 18892 v.AddArg(v0) 18893 return true 18894 } 18895 } 18896 func rewriteValueARM_OpHmul32_0(v *Value) bool { 18897 // match: (Hmul32 x y) 18898 // cond: 18899 // result: (HMUL x y) 18900 for { 18901 _ = v.Args[1] 18902 x := v.Args[0] 18903 y := v.Args[1] 18904 v.reset(OpARMHMUL) 18905 v.AddArg(x) 18906 v.AddArg(y) 18907 return true 18908 } 18909 } 18910 func rewriteValueARM_OpHmul32u_0(v *Value) bool { 18911 // match: (Hmul32u x y) 18912 // cond: 18913 // result: (HMULU x y) 18914 for { 18915 _ = v.Args[1] 18916 x := v.Args[0] 18917 y := v.Args[1] 18918 v.reset(OpARMHMULU) 18919 v.AddArg(x) 18920 v.AddArg(y) 18921 return true 18922 } 18923 } 18924 func rewriteValueARM_OpInterCall_0(v *Value) bool { 18925 // match: (InterCall [argwid] entry mem) 18926 // cond: 18927 // result: (CALLinter [argwid] entry mem) 18928 for { 18929 argwid := v.AuxInt 18930 _ = v.Args[1] 18931 entry := v.Args[0] 18932 mem := v.Args[1] 18933 v.reset(OpARMCALLinter) 18934 v.AuxInt = argwid 18935 v.AddArg(entry) 18936 v.AddArg(mem) 18937 return true 18938 } 18939 } 18940 func rewriteValueARM_OpIsInBounds_0(v *Value) bool { 18941 b := v.Block 18942 _ = b 18943 // match: (IsInBounds idx len) 18944 // cond: 18945 // result: (LessThanU (CMP idx len)) 18946 for { 18947 _ = v.Args[1] 18948 idx := v.Args[0] 18949 len := v.Args[1] 18950 v.reset(OpARMLessThanU) 18951 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18952 v0.AddArg(idx) 18953 v0.AddArg(len) 18954 v.AddArg(v0) 18955 return true 18956 } 18957 } 18958 func rewriteValueARM_OpIsNonNil_0(v *Value) bool { 18959 b := v.Block 18960 _ = b 18961 // match: (IsNonNil ptr) 18962 // cond: 18963 // result: (NotEqual (CMPconst [0] ptr)) 18964 for { 18965 ptr := v.Args[0] 18966 v.reset(OpARMNotEqual) 18967 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18968 v0.AuxInt = 0 18969 v0.AddArg(ptr) 18970 v.AddArg(v0) 18971 return true 18972 } 18973 } 18974 func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { 18975 b := v.Block 18976 _ = b 18977 // match: (IsSliceInBounds idx len) 18978 // cond: 18979 // result: (LessEqualU (CMP idx len)) 18980 for { 18981 _ = v.Args[1] 18982 idx := v.Args[0] 18983 len := v.Args[1] 18984 v.reset(OpARMLessEqualU) 18985 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18986 v0.AddArg(idx) 18987 v0.AddArg(len) 18988 v.AddArg(v0) 18989 return true 18990 } 18991 } 18992 func rewriteValueARM_OpLeq16_0(v *Value) bool { 18993 b := v.Block 18994 _ = b 18995 typ := &b.Func.Config.Types 18996 _ = typ 18997 // match: (Leq16 x y) 18998 // cond: 18999 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 19000 for { 19001 _ = v.Args[1] 19002 x := v.Args[0] 19003 y := v.Args[1] 19004 v.reset(OpARMLessEqual) 19005 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19006 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19007 v1.AddArg(x) 19008 v0.AddArg(v1) 19009 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19010 v2.AddArg(y) 19011 v0.AddArg(v2) 19012 v.AddArg(v0) 19013 return true 19014 } 19015 } 19016 func rewriteValueARM_OpLeq16U_0(v *Value) bool { 19017 b := v.Block 19018 _ = b 19019 typ := &b.Func.Config.Types 19020 _ = typ 19021 // match: (Leq16U x y) 19022 // cond: 19023 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 19024 for { 19025 _ = v.Args[1] 19026 x := v.Args[0] 19027 y := v.Args[1] 19028 v.reset(OpARMLessEqualU) 19029 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19030 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19031 v1.AddArg(x) 19032 v0.AddArg(v1) 19033 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19034 v2.AddArg(y) 19035 v0.AddArg(v2) 19036 v.AddArg(v0) 19037 return true 19038 } 19039 } 19040 func rewriteValueARM_OpLeq32_0(v *Value) bool { 19041 b := v.Block 19042 _ = b 19043 // match: (Leq32 x y) 19044 // cond: 19045 // result: (LessEqual (CMP x y)) 19046 for { 19047 _ = v.Args[1] 19048 x := v.Args[0] 19049 y := v.Args[1] 19050 v.reset(OpARMLessEqual) 19051 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19052 v0.AddArg(x) 19053 v0.AddArg(y) 19054 v.AddArg(v0) 19055 return true 19056 } 19057 } 19058 func rewriteValueARM_OpLeq32F_0(v *Value) bool { 19059 b := v.Block 19060 _ = b 19061 // match: (Leq32F x y) 19062 // cond: 19063 // result: (GreaterEqual (CMPF y x)) 19064 for { 19065 _ = v.Args[1] 19066 x := v.Args[0] 19067 y := v.Args[1] 19068 v.reset(OpARMGreaterEqual) 19069 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 19070 v0.AddArg(y) 19071 v0.AddArg(x) 19072 v.AddArg(v0) 19073 return true 19074 } 19075 } 19076 func rewriteValueARM_OpLeq32U_0(v *Value) bool { 19077 b := v.Block 19078 _ = b 19079 // match: (Leq32U x y) 19080 // cond: 19081 // result: (LessEqualU (CMP x y)) 19082 for { 19083 _ = v.Args[1] 19084 x := v.Args[0] 19085 y := v.Args[1] 19086 v.reset(OpARMLessEqualU) 19087 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19088 v0.AddArg(x) 19089 v0.AddArg(y) 19090 v.AddArg(v0) 19091 return true 19092 } 19093 } 19094 func rewriteValueARM_OpLeq64F_0(v *Value) bool { 19095 b := v.Block 19096 _ = b 19097 // match: (Leq64F x y) 19098 // cond: 19099 // result: (GreaterEqual (CMPD y x)) 19100 for { 19101 _ = v.Args[1] 19102 x := v.Args[0] 19103 y := v.Args[1] 19104 v.reset(OpARMGreaterEqual) 19105 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 19106 v0.AddArg(y) 19107 v0.AddArg(x) 19108 v.AddArg(v0) 19109 return true 19110 } 19111 } 19112 func rewriteValueARM_OpLeq8_0(v *Value) bool { 19113 b := v.Block 19114 _ = b 19115 typ := &b.Func.Config.Types 19116 _ = typ 19117 // match: (Leq8 x y) 19118 // cond: 19119 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 19120 for { 19121 _ = v.Args[1] 19122 x := v.Args[0] 19123 y := v.Args[1] 19124 v.reset(OpARMLessEqual) 19125 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19126 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19127 v1.AddArg(x) 19128 v0.AddArg(v1) 19129 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19130 v2.AddArg(y) 19131 v0.AddArg(v2) 19132 v.AddArg(v0) 19133 return true 19134 } 19135 } 19136 func rewriteValueARM_OpLeq8U_0(v *Value) bool { 19137 b := v.Block 19138 _ = b 19139 typ := &b.Func.Config.Types 19140 _ = typ 19141 // match: (Leq8U x y) 19142 // cond: 19143 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 19144 for { 19145 _ = v.Args[1] 19146 x := v.Args[0] 19147 y := v.Args[1] 19148 v.reset(OpARMLessEqualU) 19149 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19150 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19151 v1.AddArg(x) 19152 v0.AddArg(v1) 19153 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19154 v2.AddArg(y) 19155 v0.AddArg(v2) 19156 v.AddArg(v0) 19157 return true 19158 } 19159 } 19160 func rewriteValueARM_OpLess16_0(v *Value) bool { 19161 b := v.Block 19162 _ = b 19163 typ := &b.Func.Config.Types 19164 _ = typ 19165 // match: (Less16 x y) 19166 // cond: 19167 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 19168 for { 19169 _ = v.Args[1] 19170 x := v.Args[0] 19171 y := v.Args[1] 19172 v.reset(OpARMLessThan) 19173 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19174 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19175 v1.AddArg(x) 19176 v0.AddArg(v1) 19177 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19178 v2.AddArg(y) 19179 v0.AddArg(v2) 19180 v.AddArg(v0) 19181 return true 19182 } 19183 } 19184 func rewriteValueARM_OpLess16U_0(v *Value) bool { 19185 b := v.Block 19186 _ = b 19187 typ := &b.Func.Config.Types 19188 _ = typ 19189 // match: (Less16U x y) 19190 // cond: 19191 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 19192 for { 19193 _ = v.Args[1] 19194 x := v.Args[0] 19195 y := v.Args[1] 19196 v.reset(OpARMLessThanU) 19197 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19198 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19199 v1.AddArg(x) 19200 v0.AddArg(v1) 19201 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19202 v2.AddArg(y) 19203 v0.AddArg(v2) 19204 v.AddArg(v0) 19205 return true 19206 } 19207 } 19208 func rewriteValueARM_OpLess32_0(v *Value) bool { 19209 b := v.Block 19210 _ = b 19211 // match: (Less32 x y) 19212 // cond: 19213 // result: (LessThan (CMP x y)) 19214 for { 19215 _ = v.Args[1] 19216 x := v.Args[0] 19217 y := v.Args[1] 19218 v.reset(OpARMLessThan) 19219 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19220 v0.AddArg(x) 19221 v0.AddArg(y) 19222 v.AddArg(v0) 19223 return true 19224 } 19225 } 19226 func rewriteValueARM_OpLess32F_0(v *Value) bool { 19227 b := v.Block 19228 _ = b 19229 // match: (Less32F x y) 19230 // cond: 19231 // result: (GreaterThan (CMPF y x)) 19232 for { 19233 _ = v.Args[1] 19234 x := v.Args[0] 19235 y := v.Args[1] 19236 v.reset(OpARMGreaterThan) 19237 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 19238 v0.AddArg(y) 19239 v0.AddArg(x) 19240 v.AddArg(v0) 19241 return true 19242 } 19243 } 19244 func rewriteValueARM_OpLess32U_0(v *Value) bool { 19245 b := v.Block 19246 _ = b 19247 // match: (Less32U x y) 19248 // cond: 19249 // result: (LessThanU (CMP x y)) 19250 for { 19251 _ = v.Args[1] 19252 x := v.Args[0] 19253 y := v.Args[1] 19254 v.reset(OpARMLessThanU) 19255 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19256 v0.AddArg(x) 19257 v0.AddArg(y) 19258 v.AddArg(v0) 19259 return true 19260 } 19261 } 19262 func rewriteValueARM_OpLess64F_0(v *Value) bool { 19263 b := v.Block 19264 _ = b 19265 // match: (Less64F x y) 19266 // cond: 19267 // result: (GreaterThan (CMPD y x)) 19268 for { 19269 _ = v.Args[1] 19270 x := v.Args[0] 19271 y := v.Args[1] 19272 v.reset(OpARMGreaterThan) 19273 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 19274 v0.AddArg(y) 19275 v0.AddArg(x) 19276 v.AddArg(v0) 19277 return true 19278 } 19279 } 19280 func rewriteValueARM_OpLess8_0(v *Value) bool { 19281 b := v.Block 19282 _ = b 19283 typ := &b.Func.Config.Types 19284 _ = typ 19285 // match: (Less8 x y) 19286 // cond: 19287 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) 19288 for { 19289 _ = v.Args[1] 19290 x := v.Args[0] 19291 y := v.Args[1] 19292 v.reset(OpARMLessThan) 19293 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19294 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19295 v1.AddArg(x) 19296 v0.AddArg(v1) 19297 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19298 v2.AddArg(y) 19299 v0.AddArg(v2) 19300 v.AddArg(v0) 19301 return true 19302 } 19303 } 19304 func rewriteValueARM_OpLess8U_0(v *Value) bool { 19305 b := v.Block 19306 _ = b 19307 typ := &b.Func.Config.Types 19308 _ = typ 19309 // match: (Less8U x y) 19310 // cond: 19311 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 19312 for { 19313 _ = v.Args[1] 19314 x := v.Args[0] 19315 y := v.Args[1] 19316 v.reset(OpARMLessThanU) 19317 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19318 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19319 v1.AddArg(x) 19320 v0.AddArg(v1) 19321 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19322 v2.AddArg(y) 19323 v0.AddArg(v2) 19324 v.AddArg(v0) 19325 return true 19326 } 19327 } 19328 func rewriteValueARM_OpLoad_0(v *Value) bool { 19329 // match: (Load <t> ptr mem) 19330 // cond: t.IsBoolean() 19331 // result: (MOVBUload ptr mem) 19332 for { 19333 t := v.Type 19334 _ = v.Args[1] 19335 ptr := v.Args[0] 19336 mem := v.Args[1] 19337 if !(t.IsBoolean()) { 19338 break 19339 } 19340 v.reset(OpARMMOVBUload) 19341 v.AddArg(ptr) 19342 v.AddArg(mem) 19343 return true 19344 } 19345 // match: (Load <t> ptr mem) 19346 // cond: (is8BitInt(t) && isSigned(t)) 19347 // result: (MOVBload ptr mem) 19348 for { 19349 t := v.Type 19350 _ = v.Args[1] 19351 ptr := v.Args[0] 19352 mem := v.Args[1] 19353 if !(is8BitInt(t) && isSigned(t)) { 19354 break 19355 } 19356 v.reset(OpARMMOVBload) 19357 v.AddArg(ptr) 19358 v.AddArg(mem) 19359 return true 19360 } 19361 // match: (Load <t> ptr mem) 19362 // cond: (is8BitInt(t) && !isSigned(t)) 19363 // result: (MOVBUload ptr mem) 19364 for { 19365 t := v.Type 19366 _ = v.Args[1] 19367 ptr := v.Args[0] 19368 mem := v.Args[1] 19369 if !(is8BitInt(t) && !isSigned(t)) { 19370 break 19371 } 19372 v.reset(OpARMMOVBUload) 19373 v.AddArg(ptr) 19374 v.AddArg(mem) 19375 return true 19376 } 19377 // match: (Load <t> ptr mem) 19378 // cond: (is16BitInt(t) && isSigned(t)) 19379 // result: (MOVHload ptr mem) 19380 for { 19381 t := v.Type 19382 _ = v.Args[1] 19383 ptr := v.Args[0] 19384 mem := v.Args[1] 19385 if !(is16BitInt(t) && isSigned(t)) { 19386 break 19387 } 19388 v.reset(OpARMMOVHload) 19389 v.AddArg(ptr) 19390 v.AddArg(mem) 19391 return true 19392 } 19393 // match: (Load <t> ptr mem) 19394 // cond: (is16BitInt(t) && !isSigned(t)) 19395 // result: (MOVHUload ptr mem) 19396 for { 19397 t := v.Type 19398 _ = v.Args[1] 19399 ptr := v.Args[0] 19400 mem := v.Args[1] 19401 if !(is16BitInt(t) && !isSigned(t)) { 19402 break 19403 } 19404 v.reset(OpARMMOVHUload) 19405 v.AddArg(ptr) 19406 v.AddArg(mem) 19407 return true 19408 } 19409 // match: (Load <t> ptr mem) 19410 // cond: (is32BitInt(t) || isPtr(t)) 19411 // result: (MOVWload ptr mem) 19412 for { 19413 t := v.Type 19414 _ = v.Args[1] 19415 ptr := v.Args[0] 19416 mem := v.Args[1] 19417 if !(is32BitInt(t) || isPtr(t)) { 19418 break 19419 } 19420 v.reset(OpARMMOVWload) 19421 v.AddArg(ptr) 19422 v.AddArg(mem) 19423 return true 19424 } 19425 // match: (Load <t> ptr mem) 19426 // cond: is32BitFloat(t) 19427 // result: (MOVFload ptr mem) 19428 for { 19429 t := v.Type 19430 _ = v.Args[1] 19431 ptr := v.Args[0] 19432 mem := v.Args[1] 19433 if !(is32BitFloat(t)) { 19434 break 19435 } 19436 v.reset(OpARMMOVFload) 19437 v.AddArg(ptr) 19438 v.AddArg(mem) 19439 return true 19440 } 19441 // match: (Load <t> ptr mem) 19442 // cond: is64BitFloat(t) 19443 // result: (MOVDload ptr mem) 19444 for { 19445 t := v.Type 19446 _ = v.Args[1] 19447 ptr := v.Args[0] 19448 mem := v.Args[1] 19449 if !(is64BitFloat(t)) { 19450 break 19451 } 19452 v.reset(OpARMMOVDload) 19453 v.AddArg(ptr) 19454 v.AddArg(mem) 19455 return true 19456 } 19457 return false 19458 } 19459 func rewriteValueARM_OpLocalAddr_0(v *Value) bool { 19460 // match: (LocalAddr {sym} base _) 19461 // cond: 19462 // result: (MOVWaddr {sym} base) 19463 for { 19464 sym := v.Aux 19465 _ = v.Args[1] 19466 base := v.Args[0] 19467 v.reset(OpARMMOVWaddr) 19468 v.Aux = sym 19469 v.AddArg(base) 19470 return true 19471 } 19472 } 19473 func rewriteValueARM_OpLsh16x16_0(v *Value) bool { 19474 b := v.Block 19475 _ = b 19476 typ := &b.Func.Config.Types 19477 _ = typ 19478 // match: (Lsh16x16 x y) 19479 // cond: 19480 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19481 for { 19482 _ = v.Args[1] 19483 x := v.Args[0] 19484 y := v.Args[1] 19485 v.reset(OpARMCMOVWHSconst) 19486 v.AuxInt = 0 19487 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19488 v0.AddArg(x) 19489 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19490 v1.AddArg(y) 19491 v0.AddArg(v1) 19492 v.AddArg(v0) 19493 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19494 v2.AuxInt = 256 19495 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19496 v3.AddArg(y) 19497 v2.AddArg(v3) 19498 v.AddArg(v2) 19499 return true 19500 } 19501 } 19502 func rewriteValueARM_OpLsh16x32_0(v *Value) bool { 19503 b := v.Block 19504 _ = b 19505 // match: (Lsh16x32 x y) 19506 // cond: 19507 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19508 for { 19509 _ = v.Args[1] 19510 x := v.Args[0] 19511 y := v.Args[1] 19512 v.reset(OpARMCMOVWHSconst) 19513 v.AuxInt = 0 19514 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19515 v0.AddArg(x) 19516 v0.AddArg(y) 19517 v.AddArg(v0) 19518 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19519 v1.AuxInt = 256 19520 v1.AddArg(y) 19521 v.AddArg(v1) 19522 return true 19523 } 19524 } 19525 func rewriteValueARM_OpLsh16x64_0(v *Value) bool { 19526 // match: (Lsh16x64 x (Const64 [c])) 19527 // cond: uint64(c) < 16 19528 // result: (SLLconst x [c]) 19529 for { 19530 _ = v.Args[1] 19531 x := v.Args[0] 19532 v_1 := v.Args[1] 19533 if v_1.Op != OpConst64 { 19534 break 19535 } 19536 c := v_1.AuxInt 19537 if !(uint64(c) < 16) { 19538 break 19539 } 19540 v.reset(OpARMSLLconst) 19541 v.AuxInt = c 19542 v.AddArg(x) 19543 return true 19544 } 19545 // match: (Lsh16x64 _ (Const64 [c])) 19546 // cond: uint64(c) >= 16 19547 // result: (Const16 [0]) 19548 for { 19549 _ = v.Args[1] 19550 v_1 := v.Args[1] 19551 if v_1.Op != OpConst64 { 19552 break 19553 } 19554 c := v_1.AuxInt 19555 if !(uint64(c) >= 16) { 19556 break 19557 } 19558 v.reset(OpConst16) 19559 v.AuxInt = 0 19560 return true 19561 } 19562 return false 19563 } 19564 func rewriteValueARM_OpLsh16x8_0(v *Value) bool { 19565 b := v.Block 19566 _ = b 19567 typ := &b.Func.Config.Types 19568 _ = typ 19569 // match: (Lsh16x8 x y) 19570 // cond: 19571 // result: (SLL x (ZeroExt8to32 y)) 19572 for { 19573 _ = v.Args[1] 19574 x := v.Args[0] 19575 y := v.Args[1] 19576 v.reset(OpARMSLL) 19577 v.AddArg(x) 19578 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19579 v0.AddArg(y) 19580 v.AddArg(v0) 19581 return true 19582 } 19583 } 19584 func rewriteValueARM_OpLsh32x16_0(v *Value) bool { 19585 b := v.Block 19586 _ = b 19587 typ := &b.Func.Config.Types 19588 _ = typ 19589 // match: (Lsh32x16 x y) 19590 // cond: 19591 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19592 for { 19593 _ = v.Args[1] 19594 x := v.Args[0] 19595 y := v.Args[1] 19596 v.reset(OpARMCMOVWHSconst) 19597 v.AuxInt = 0 19598 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19599 v0.AddArg(x) 19600 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19601 v1.AddArg(y) 19602 v0.AddArg(v1) 19603 v.AddArg(v0) 19604 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19605 v2.AuxInt = 256 19606 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19607 v3.AddArg(y) 19608 v2.AddArg(v3) 19609 v.AddArg(v2) 19610 return true 19611 } 19612 } 19613 func rewriteValueARM_OpLsh32x32_0(v *Value) bool { 19614 b := v.Block 19615 _ = b 19616 // match: (Lsh32x32 x y) 19617 // cond: 19618 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19619 for { 19620 _ = v.Args[1] 19621 x := v.Args[0] 19622 y := v.Args[1] 19623 v.reset(OpARMCMOVWHSconst) 19624 v.AuxInt = 0 19625 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19626 v0.AddArg(x) 19627 v0.AddArg(y) 19628 v.AddArg(v0) 19629 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19630 v1.AuxInt = 256 19631 v1.AddArg(y) 19632 v.AddArg(v1) 19633 return true 19634 } 19635 } 19636 func rewriteValueARM_OpLsh32x64_0(v *Value) bool { 19637 // match: (Lsh32x64 x (Const64 [c])) 19638 // cond: uint64(c) < 32 19639 // result: (SLLconst x [c]) 19640 for { 19641 _ = v.Args[1] 19642 x := v.Args[0] 19643 v_1 := v.Args[1] 19644 if v_1.Op != OpConst64 { 19645 break 19646 } 19647 c := v_1.AuxInt 19648 if !(uint64(c) < 32) { 19649 break 19650 } 19651 v.reset(OpARMSLLconst) 19652 v.AuxInt = c 19653 v.AddArg(x) 19654 return true 19655 } 19656 // match: (Lsh32x64 _ (Const64 [c])) 19657 // cond: uint64(c) >= 32 19658 // result: (Const32 [0]) 19659 for { 19660 _ = v.Args[1] 19661 v_1 := v.Args[1] 19662 if v_1.Op != OpConst64 { 19663 break 19664 } 19665 c := v_1.AuxInt 19666 if !(uint64(c) >= 32) { 19667 break 19668 } 19669 v.reset(OpConst32) 19670 v.AuxInt = 0 19671 return true 19672 } 19673 return false 19674 } 19675 func rewriteValueARM_OpLsh32x8_0(v *Value) bool { 19676 b := v.Block 19677 _ = b 19678 typ := &b.Func.Config.Types 19679 _ = typ 19680 // match: (Lsh32x8 x y) 19681 // cond: 19682 // result: (SLL x (ZeroExt8to32 y)) 19683 for { 19684 _ = v.Args[1] 19685 x := v.Args[0] 19686 y := v.Args[1] 19687 v.reset(OpARMSLL) 19688 v.AddArg(x) 19689 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19690 v0.AddArg(y) 19691 v.AddArg(v0) 19692 return true 19693 } 19694 } 19695 func rewriteValueARM_OpLsh8x16_0(v *Value) bool { 19696 b := v.Block 19697 _ = b 19698 typ := &b.Func.Config.Types 19699 _ = typ 19700 // match: (Lsh8x16 x y) 19701 // cond: 19702 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19703 for { 19704 _ = v.Args[1] 19705 x := v.Args[0] 19706 y := v.Args[1] 19707 v.reset(OpARMCMOVWHSconst) 19708 v.AuxInt = 0 19709 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19710 v0.AddArg(x) 19711 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19712 v1.AddArg(y) 19713 v0.AddArg(v1) 19714 v.AddArg(v0) 19715 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19716 v2.AuxInt = 256 19717 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19718 v3.AddArg(y) 19719 v2.AddArg(v3) 19720 v.AddArg(v2) 19721 return true 19722 } 19723 } 19724 func rewriteValueARM_OpLsh8x32_0(v *Value) bool { 19725 b := v.Block 19726 _ = b 19727 // match: (Lsh8x32 x y) 19728 // cond: 19729 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19730 for { 19731 _ = v.Args[1] 19732 x := v.Args[0] 19733 y := v.Args[1] 19734 v.reset(OpARMCMOVWHSconst) 19735 v.AuxInt = 0 19736 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19737 v0.AddArg(x) 19738 v0.AddArg(y) 19739 v.AddArg(v0) 19740 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19741 v1.AuxInt = 256 19742 v1.AddArg(y) 19743 v.AddArg(v1) 19744 return true 19745 } 19746 } 19747 func rewriteValueARM_OpLsh8x64_0(v *Value) bool { 19748 // match: (Lsh8x64 x (Const64 [c])) 19749 // cond: uint64(c) < 8 19750 // result: (SLLconst x [c]) 19751 for { 19752 _ = v.Args[1] 19753 x := v.Args[0] 19754 v_1 := v.Args[1] 19755 if v_1.Op != OpConst64 { 19756 break 19757 } 19758 c := v_1.AuxInt 19759 if !(uint64(c) < 8) { 19760 break 19761 } 19762 v.reset(OpARMSLLconst) 19763 v.AuxInt = c 19764 v.AddArg(x) 19765 return true 19766 } 19767 // match: (Lsh8x64 _ (Const64 [c])) 19768 // cond: uint64(c) >= 8 19769 // result: (Const8 [0]) 19770 for { 19771 _ = v.Args[1] 19772 v_1 := v.Args[1] 19773 if v_1.Op != OpConst64 { 19774 break 19775 } 19776 c := v_1.AuxInt 19777 if !(uint64(c) >= 8) { 19778 break 19779 } 19780 v.reset(OpConst8) 19781 v.AuxInt = 0 19782 return true 19783 } 19784 return false 19785 } 19786 func rewriteValueARM_OpLsh8x8_0(v *Value) bool { 19787 b := v.Block 19788 _ = b 19789 typ := &b.Func.Config.Types 19790 _ = typ 19791 // match: (Lsh8x8 x y) 19792 // cond: 19793 // result: (SLL x (ZeroExt8to32 y)) 19794 for { 19795 _ = v.Args[1] 19796 x := v.Args[0] 19797 y := v.Args[1] 19798 v.reset(OpARMSLL) 19799 v.AddArg(x) 19800 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19801 v0.AddArg(y) 19802 v.AddArg(v0) 19803 return true 19804 } 19805 } 19806 func rewriteValueARM_OpMod16_0(v *Value) bool { 19807 b := v.Block 19808 _ = b 19809 typ := &b.Func.Config.Types 19810 _ = typ 19811 // match: (Mod16 x y) 19812 // cond: 19813 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 19814 for { 19815 _ = v.Args[1] 19816 x := v.Args[0] 19817 y := v.Args[1] 19818 v.reset(OpMod32) 19819 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19820 v0.AddArg(x) 19821 v.AddArg(v0) 19822 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19823 v1.AddArg(y) 19824 v.AddArg(v1) 19825 return true 19826 } 19827 } 19828 func rewriteValueARM_OpMod16u_0(v *Value) bool { 19829 b := v.Block 19830 _ = b 19831 typ := &b.Func.Config.Types 19832 _ = typ 19833 // match: (Mod16u x y) 19834 // cond: 19835 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 19836 for { 19837 _ = v.Args[1] 19838 x := v.Args[0] 19839 y := v.Args[1] 19840 v.reset(OpMod32u) 19841 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19842 v0.AddArg(x) 19843 v.AddArg(v0) 19844 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19845 v1.AddArg(y) 19846 v.AddArg(v1) 19847 return true 19848 } 19849 } 19850 func rewriteValueARM_OpMod32_0(v *Value) bool { 19851 b := v.Block 19852 _ = b 19853 typ := &b.Func.Config.Types 19854 _ = typ 19855 // match: (Mod32 x y) 19856 // cond: 19857 // 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)) 19858 for { 19859 _ = v.Args[1] 19860 x := v.Args[0] 19861 y := v.Args[1] 19862 v.reset(OpARMSUB) 19863 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19864 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) 19865 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 19866 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 19867 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19868 v4.AddArg(x) 19869 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19870 v5.AddArg(x) 19871 v4.AddArg(v5) 19872 v3.AddArg(v4) 19873 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19874 v6.AddArg(x) 19875 v3.AddArg(v6) 19876 v2.AddArg(v3) 19877 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 19878 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19879 v8.AddArg(y) 19880 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19881 v9.AddArg(y) 19882 v8.AddArg(v9) 19883 v7.AddArg(v8) 19884 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19885 v10.AddArg(y) 19886 v7.AddArg(v10) 19887 v2.AddArg(v7) 19888 v1.AddArg(v2) 19889 v0.AddArg(v1) 19890 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19891 v11.AddArg(x) 19892 v0.AddArg(v11) 19893 v.AddArg(v0) 19894 v12 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19895 v12.AddArg(x) 19896 v.AddArg(v12) 19897 return true 19898 } 19899 } 19900 func rewriteValueARM_OpMod32u_0(v *Value) bool { 19901 b := v.Block 19902 _ = b 19903 typ := &b.Func.Config.Types 19904 _ = typ 19905 // match: (Mod32u x y) 19906 // cond: 19907 // result: (Select1 <typ.UInt32> (CALLudiv x y)) 19908 for { 19909 _ = v.Args[1] 19910 x := v.Args[0] 19911 y := v.Args[1] 19912 v.reset(OpSelect1) 19913 v.Type = typ.UInt32 19914 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 19915 v0.AddArg(x) 19916 v0.AddArg(y) 19917 v.AddArg(v0) 19918 return true 19919 } 19920 } 19921 func rewriteValueARM_OpMod8_0(v *Value) bool { 19922 b := v.Block 19923 _ = b 19924 typ := &b.Func.Config.Types 19925 _ = typ 19926 // match: (Mod8 x y) 19927 // cond: 19928 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 19929 for { 19930 _ = v.Args[1] 19931 x := v.Args[0] 19932 y := v.Args[1] 19933 v.reset(OpMod32) 19934 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19935 v0.AddArg(x) 19936 v.AddArg(v0) 19937 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19938 v1.AddArg(y) 19939 v.AddArg(v1) 19940 return true 19941 } 19942 } 19943 func rewriteValueARM_OpMod8u_0(v *Value) bool { 19944 b := v.Block 19945 _ = b 19946 typ := &b.Func.Config.Types 19947 _ = typ 19948 // match: (Mod8u x y) 19949 // cond: 19950 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 19951 for { 19952 _ = v.Args[1] 19953 x := v.Args[0] 19954 y := v.Args[1] 19955 v.reset(OpMod32u) 19956 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19957 v0.AddArg(x) 19958 v.AddArg(v0) 19959 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19960 v1.AddArg(y) 19961 v.AddArg(v1) 19962 return true 19963 } 19964 } 19965 func rewriteValueARM_OpMove_0(v *Value) bool { 19966 b := v.Block 19967 _ = b 19968 config := b.Func.Config 19969 _ = config 19970 typ := &b.Func.Config.Types 19971 _ = typ 19972 // match: (Move [0] _ _ mem) 19973 // cond: 19974 // result: mem 19975 for { 19976 if v.AuxInt != 0 { 19977 break 19978 } 19979 _ = v.Args[2] 19980 mem := v.Args[2] 19981 v.reset(OpCopy) 19982 v.Type = mem.Type 19983 v.AddArg(mem) 19984 return true 19985 } 19986 // match: (Move [1] dst src mem) 19987 // cond: 19988 // result: (MOVBstore dst (MOVBUload src mem) mem) 19989 for { 19990 if v.AuxInt != 1 { 19991 break 19992 } 19993 _ = v.Args[2] 19994 dst := v.Args[0] 19995 src := v.Args[1] 19996 mem := v.Args[2] 19997 v.reset(OpARMMOVBstore) 19998 v.AddArg(dst) 19999 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20000 v0.AddArg(src) 20001 v0.AddArg(mem) 20002 v.AddArg(v0) 20003 v.AddArg(mem) 20004 return true 20005 } 20006 // match: (Move [2] {t} dst src mem) 20007 // cond: t.(*types.Type).Alignment()%2 == 0 20008 // result: (MOVHstore dst (MOVHUload src mem) mem) 20009 for { 20010 if v.AuxInt != 2 { 20011 break 20012 } 20013 t := v.Aux 20014 _ = v.Args[2] 20015 dst := v.Args[0] 20016 src := v.Args[1] 20017 mem := v.Args[2] 20018 if !(t.(*types.Type).Alignment()%2 == 0) { 20019 break 20020 } 20021 v.reset(OpARMMOVHstore) 20022 v.AddArg(dst) 20023 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 20024 v0.AddArg(src) 20025 v0.AddArg(mem) 20026 v.AddArg(v0) 20027 v.AddArg(mem) 20028 return true 20029 } 20030 // match: (Move [2] dst src mem) 20031 // cond: 20032 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 20033 for { 20034 if v.AuxInt != 2 { 20035 break 20036 } 20037 _ = v.Args[2] 20038 dst := v.Args[0] 20039 src := v.Args[1] 20040 mem := v.Args[2] 20041 v.reset(OpARMMOVBstore) 20042 v.AuxInt = 1 20043 v.AddArg(dst) 20044 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20045 v0.AuxInt = 1 20046 v0.AddArg(src) 20047 v0.AddArg(mem) 20048 v.AddArg(v0) 20049 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20050 v1.AddArg(dst) 20051 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20052 v2.AddArg(src) 20053 v2.AddArg(mem) 20054 v1.AddArg(v2) 20055 v1.AddArg(mem) 20056 v.AddArg(v1) 20057 return true 20058 } 20059 // match: (Move [4] {t} dst src mem) 20060 // cond: t.(*types.Type).Alignment()%4 == 0 20061 // result: (MOVWstore dst (MOVWload src mem) mem) 20062 for { 20063 if v.AuxInt != 4 { 20064 break 20065 } 20066 t := v.Aux 20067 _ = v.Args[2] 20068 dst := v.Args[0] 20069 src := v.Args[1] 20070 mem := v.Args[2] 20071 if !(t.(*types.Type).Alignment()%4 == 0) { 20072 break 20073 } 20074 v.reset(OpARMMOVWstore) 20075 v.AddArg(dst) 20076 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32) 20077 v0.AddArg(src) 20078 v0.AddArg(mem) 20079 v.AddArg(v0) 20080 v.AddArg(mem) 20081 return true 20082 } 20083 // match: (Move [4] {t} dst src mem) 20084 // cond: t.(*types.Type).Alignment()%2 == 0 20085 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 20086 for { 20087 if v.AuxInt != 4 { 20088 break 20089 } 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 !(t.(*types.Type).Alignment()%2 == 0) { 20096 break 20097 } 20098 v.reset(OpARMMOVHstore) 20099 v.AuxInt = 2 20100 v.AddArg(dst) 20101 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 20102 v0.AuxInt = 2 20103 v0.AddArg(src) 20104 v0.AddArg(mem) 20105 v.AddArg(v0) 20106 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 20107 v1.AddArg(dst) 20108 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 20109 v2.AddArg(src) 20110 v2.AddArg(mem) 20111 v1.AddArg(v2) 20112 v1.AddArg(mem) 20113 v.AddArg(v1) 20114 return true 20115 } 20116 // match: (Move [4] dst src mem) 20117 // cond: 20118 // 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)))) 20119 for { 20120 if v.AuxInt != 4 { 20121 break 20122 } 20123 _ = v.Args[2] 20124 dst := v.Args[0] 20125 src := v.Args[1] 20126 mem := v.Args[2] 20127 v.reset(OpARMMOVBstore) 20128 v.AuxInt = 3 20129 v.AddArg(dst) 20130 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20131 v0.AuxInt = 3 20132 v0.AddArg(src) 20133 v0.AddArg(mem) 20134 v.AddArg(v0) 20135 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20136 v1.AuxInt = 2 20137 v1.AddArg(dst) 20138 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20139 v2.AuxInt = 2 20140 v2.AddArg(src) 20141 v2.AddArg(mem) 20142 v1.AddArg(v2) 20143 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20144 v3.AuxInt = 1 20145 v3.AddArg(dst) 20146 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20147 v4.AuxInt = 1 20148 v4.AddArg(src) 20149 v4.AddArg(mem) 20150 v3.AddArg(v4) 20151 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20152 v5.AddArg(dst) 20153 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20154 v6.AddArg(src) 20155 v6.AddArg(mem) 20156 v5.AddArg(v6) 20157 v5.AddArg(mem) 20158 v3.AddArg(v5) 20159 v1.AddArg(v3) 20160 v.AddArg(v1) 20161 return true 20162 } 20163 // match: (Move [3] dst src mem) 20164 // cond: 20165 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 20166 for { 20167 if v.AuxInt != 3 { 20168 break 20169 } 20170 _ = v.Args[2] 20171 dst := v.Args[0] 20172 src := v.Args[1] 20173 mem := v.Args[2] 20174 v.reset(OpARMMOVBstore) 20175 v.AuxInt = 2 20176 v.AddArg(dst) 20177 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20178 v0.AuxInt = 2 20179 v0.AddArg(src) 20180 v0.AddArg(mem) 20181 v.AddArg(v0) 20182 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20183 v1.AuxInt = 1 20184 v1.AddArg(dst) 20185 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20186 v2.AuxInt = 1 20187 v2.AddArg(src) 20188 v2.AddArg(mem) 20189 v1.AddArg(v2) 20190 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20191 v3.AddArg(dst) 20192 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20193 v4.AddArg(src) 20194 v4.AddArg(mem) 20195 v3.AddArg(v4) 20196 v3.AddArg(mem) 20197 v1.AddArg(v3) 20198 v.AddArg(v1) 20199 return true 20200 } 20201 // match: (Move [s] {t} dst src mem) 20202 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 20203 // result: (DUFFCOPY [8 * (128 - s/4)] dst src mem) 20204 for { 20205 s := v.AuxInt 20206 t := v.Aux 20207 _ = v.Args[2] 20208 dst := v.Args[0] 20209 src := v.Args[1] 20210 mem := v.Args[2] 20211 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 20212 break 20213 } 20214 v.reset(OpARMDUFFCOPY) 20215 v.AuxInt = 8 * (128 - s/4) 20216 v.AddArg(dst) 20217 v.AddArg(src) 20218 v.AddArg(mem) 20219 return true 20220 } 20221 // match: (Move [s] {t} dst src mem) 20222 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 20223 // result: (LoweredMove [t.(*types.Type).Alignment()] dst src (ADDconst <src.Type> src [s-moveSize(t.(*types.Type).Alignment(), config)]) mem) 20224 for { 20225 s := v.AuxInt 20226 t := v.Aux 20227 _ = v.Args[2] 20228 dst := v.Args[0] 20229 src := v.Args[1] 20230 mem := v.Args[2] 20231 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 20232 break 20233 } 20234 v.reset(OpARMLoweredMove) 20235 v.AuxInt = t.(*types.Type).Alignment() 20236 v.AddArg(dst) 20237 v.AddArg(src) 20238 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 20239 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 20240 v0.AddArg(src) 20241 v.AddArg(v0) 20242 v.AddArg(mem) 20243 return true 20244 } 20245 return false 20246 } 20247 func rewriteValueARM_OpMul16_0(v *Value) bool { 20248 // match: (Mul16 x y) 20249 // cond: 20250 // result: (MUL x y) 20251 for { 20252 _ = v.Args[1] 20253 x := v.Args[0] 20254 y := v.Args[1] 20255 v.reset(OpARMMUL) 20256 v.AddArg(x) 20257 v.AddArg(y) 20258 return true 20259 } 20260 } 20261 func rewriteValueARM_OpMul32_0(v *Value) bool { 20262 // match: (Mul32 x y) 20263 // cond: 20264 // result: (MUL x y) 20265 for { 20266 _ = v.Args[1] 20267 x := v.Args[0] 20268 y := v.Args[1] 20269 v.reset(OpARMMUL) 20270 v.AddArg(x) 20271 v.AddArg(y) 20272 return true 20273 } 20274 } 20275 func rewriteValueARM_OpMul32F_0(v *Value) bool { 20276 // match: (Mul32F x y) 20277 // cond: 20278 // result: (MULF x y) 20279 for { 20280 _ = v.Args[1] 20281 x := v.Args[0] 20282 y := v.Args[1] 20283 v.reset(OpARMMULF) 20284 v.AddArg(x) 20285 v.AddArg(y) 20286 return true 20287 } 20288 } 20289 func rewriteValueARM_OpMul32uhilo_0(v *Value) bool { 20290 // match: (Mul32uhilo x y) 20291 // cond: 20292 // result: (MULLU x y) 20293 for { 20294 _ = v.Args[1] 20295 x := v.Args[0] 20296 y := v.Args[1] 20297 v.reset(OpARMMULLU) 20298 v.AddArg(x) 20299 v.AddArg(y) 20300 return true 20301 } 20302 } 20303 func rewriteValueARM_OpMul64F_0(v *Value) bool { 20304 // match: (Mul64F x y) 20305 // cond: 20306 // result: (MULD x y) 20307 for { 20308 _ = v.Args[1] 20309 x := v.Args[0] 20310 y := v.Args[1] 20311 v.reset(OpARMMULD) 20312 v.AddArg(x) 20313 v.AddArg(y) 20314 return true 20315 } 20316 } 20317 func rewriteValueARM_OpMul8_0(v *Value) bool { 20318 // match: (Mul8 x y) 20319 // cond: 20320 // result: (MUL x y) 20321 for { 20322 _ = v.Args[1] 20323 x := v.Args[0] 20324 y := v.Args[1] 20325 v.reset(OpARMMUL) 20326 v.AddArg(x) 20327 v.AddArg(y) 20328 return true 20329 } 20330 } 20331 func rewriteValueARM_OpNeg16_0(v *Value) bool { 20332 // match: (Neg16 x) 20333 // cond: 20334 // result: (RSBconst [0] x) 20335 for { 20336 x := v.Args[0] 20337 v.reset(OpARMRSBconst) 20338 v.AuxInt = 0 20339 v.AddArg(x) 20340 return true 20341 } 20342 } 20343 func rewriteValueARM_OpNeg32_0(v *Value) bool { 20344 // match: (Neg32 x) 20345 // cond: 20346 // result: (RSBconst [0] x) 20347 for { 20348 x := v.Args[0] 20349 v.reset(OpARMRSBconst) 20350 v.AuxInt = 0 20351 v.AddArg(x) 20352 return true 20353 } 20354 } 20355 func rewriteValueARM_OpNeg32F_0(v *Value) bool { 20356 // match: (Neg32F x) 20357 // cond: 20358 // result: (NEGF x) 20359 for { 20360 x := v.Args[0] 20361 v.reset(OpARMNEGF) 20362 v.AddArg(x) 20363 return true 20364 } 20365 } 20366 func rewriteValueARM_OpNeg64F_0(v *Value) bool { 20367 // match: (Neg64F x) 20368 // cond: 20369 // result: (NEGD x) 20370 for { 20371 x := v.Args[0] 20372 v.reset(OpARMNEGD) 20373 v.AddArg(x) 20374 return true 20375 } 20376 } 20377 func rewriteValueARM_OpNeg8_0(v *Value) bool { 20378 // match: (Neg8 x) 20379 // cond: 20380 // result: (RSBconst [0] x) 20381 for { 20382 x := v.Args[0] 20383 v.reset(OpARMRSBconst) 20384 v.AuxInt = 0 20385 v.AddArg(x) 20386 return true 20387 } 20388 } 20389 func rewriteValueARM_OpNeq16_0(v *Value) bool { 20390 b := v.Block 20391 _ = b 20392 typ := &b.Func.Config.Types 20393 _ = typ 20394 // match: (Neq16 x y) 20395 // cond: 20396 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 20397 for { 20398 _ = v.Args[1] 20399 x := v.Args[0] 20400 y := v.Args[1] 20401 v.reset(OpARMNotEqual) 20402 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20403 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20404 v1.AddArg(x) 20405 v0.AddArg(v1) 20406 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20407 v2.AddArg(y) 20408 v0.AddArg(v2) 20409 v.AddArg(v0) 20410 return true 20411 } 20412 } 20413 func rewriteValueARM_OpNeq32_0(v *Value) bool { 20414 b := v.Block 20415 _ = b 20416 // match: (Neq32 x y) 20417 // cond: 20418 // result: (NotEqual (CMP x y)) 20419 for { 20420 _ = v.Args[1] 20421 x := v.Args[0] 20422 y := v.Args[1] 20423 v.reset(OpARMNotEqual) 20424 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20425 v0.AddArg(x) 20426 v0.AddArg(y) 20427 v.AddArg(v0) 20428 return true 20429 } 20430 } 20431 func rewriteValueARM_OpNeq32F_0(v *Value) bool { 20432 b := v.Block 20433 _ = b 20434 // match: (Neq32F x y) 20435 // cond: 20436 // result: (NotEqual (CMPF x y)) 20437 for { 20438 _ = v.Args[1] 20439 x := v.Args[0] 20440 y := v.Args[1] 20441 v.reset(OpARMNotEqual) 20442 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 20443 v0.AddArg(x) 20444 v0.AddArg(y) 20445 v.AddArg(v0) 20446 return true 20447 } 20448 } 20449 func rewriteValueARM_OpNeq64F_0(v *Value) bool { 20450 b := v.Block 20451 _ = b 20452 // match: (Neq64F x y) 20453 // cond: 20454 // result: (NotEqual (CMPD x y)) 20455 for { 20456 _ = v.Args[1] 20457 x := v.Args[0] 20458 y := v.Args[1] 20459 v.reset(OpARMNotEqual) 20460 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 20461 v0.AddArg(x) 20462 v0.AddArg(y) 20463 v.AddArg(v0) 20464 return true 20465 } 20466 } 20467 func rewriteValueARM_OpNeq8_0(v *Value) bool { 20468 b := v.Block 20469 _ = b 20470 typ := &b.Func.Config.Types 20471 _ = typ 20472 // match: (Neq8 x y) 20473 // cond: 20474 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 20475 for { 20476 _ = v.Args[1] 20477 x := v.Args[0] 20478 y := v.Args[1] 20479 v.reset(OpARMNotEqual) 20480 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20481 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20482 v1.AddArg(x) 20483 v0.AddArg(v1) 20484 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20485 v2.AddArg(y) 20486 v0.AddArg(v2) 20487 v.AddArg(v0) 20488 return true 20489 } 20490 } 20491 func rewriteValueARM_OpNeqB_0(v *Value) bool { 20492 // match: (NeqB x y) 20493 // cond: 20494 // result: (XOR x y) 20495 for { 20496 _ = v.Args[1] 20497 x := v.Args[0] 20498 y := v.Args[1] 20499 v.reset(OpARMXOR) 20500 v.AddArg(x) 20501 v.AddArg(y) 20502 return true 20503 } 20504 } 20505 func rewriteValueARM_OpNeqPtr_0(v *Value) bool { 20506 b := v.Block 20507 _ = b 20508 // match: (NeqPtr x y) 20509 // cond: 20510 // result: (NotEqual (CMP x y)) 20511 for { 20512 _ = v.Args[1] 20513 x := v.Args[0] 20514 y := v.Args[1] 20515 v.reset(OpARMNotEqual) 20516 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20517 v0.AddArg(x) 20518 v0.AddArg(y) 20519 v.AddArg(v0) 20520 return true 20521 } 20522 } 20523 func rewriteValueARM_OpNilCheck_0(v *Value) bool { 20524 // match: (NilCheck ptr mem) 20525 // cond: 20526 // result: (LoweredNilCheck ptr mem) 20527 for { 20528 _ = v.Args[1] 20529 ptr := v.Args[0] 20530 mem := v.Args[1] 20531 v.reset(OpARMLoweredNilCheck) 20532 v.AddArg(ptr) 20533 v.AddArg(mem) 20534 return true 20535 } 20536 } 20537 func rewriteValueARM_OpNot_0(v *Value) bool { 20538 // match: (Not x) 20539 // cond: 20540 // result: (XORconst [1] x) 20541 for { 20542 x := v.Args[0] 20543 v.reset(OpARMXORconst) 20544 v.AuxInt = 1 20545 v.AddArg(x) 20546 return true 20547 } 20548 } 20549 func rewriteValueARM_OpOffPtr_0(v *Value) bool { 20550 // match: (OffPtr [off] ptr:(SP)) 20551 // cond: 20552 // result: (MOVWaddr [off] ptr) 20553 for { 20554 off := v.AuxInt 20555 ptr := v.Args[0] 20556 if ptr.Op != OpSP { 20557 break 20558 } 20559 v.reset(OpARMMOVWaddr) 20560 v.AuxInt = off 20561 v.AddArg(ptr) 20562 return true 20563 } 20564 // match: (OffPtr [off] ptr) 20565 // cond: 20566 // result: (ADDconst [off] ptr) 20567 for { 20568 off := v.AuxInt 20569 ptr := v.Args[0] 20570 v.reset(OpARMADDconst) 20571 v.AuxInt = off 20572 v.AddArg(ptr) 20573 return true 20574 } 20575 } 20576 func rewriteValueARM_OpOr16_0(v *Value) bool { 20577 // match: (Or16 x y) 20578 // cond: 20579 // result: (OR x y) 20580 for { 20581 _ = v.Args[1] 20582 x := v.Args[0] 20583 y := v.Args[1] 20584 v.reset(OpARMOR) 20585 v.AddArg(x) 20586 v.AddArg(y) 20587 return true 20588 } 20589 } 20590 func rewriteValueARM_OpOr32_0(v *Value) bool { 20591 // match: (Or32 x y) 20592 // cond: 20593 // result: (OR x y) 20594 for { 20595 _ = v.Args[1] 20596 x := v.Args[0] 20597 y := v.Args[1] 20598 v.reset(OpARMOR) 20599 v.AddArg(x) 20600 v.AddArg(y) 20601 return true 20602 } 20603 } 20604 func rewriteValueARM_OpOr8_0(v *Value) bool { 20605 // match: (Or8 x y) 20606 // cond: 20607 // result: (OR x y) 20608 for { 20609 _ = v.Args[1] 20610 x := v.Args[0] 20611 y := v.Args[1] 20612 v.reset(OpARMOR) 20613 v.AddArg(x) 20614 v.AddArg(y) 20615 return true 20616 } 20617 } 20618 func rewriteValueARM_OpOrB_0(v *Value) bool { 20619 // match: (OrB x y) 20620 // cond: 20621 // result: (OR x y) 20622 for { 20623 _ = v.Args[1] 20624 x := v.Args[0] 20625 y := v.Args[1] 20626 v.reset(OpARMOR) 20627 v.AddArg(x) 20628 v.AddArg(y) 20629 return true 20630 } 20631 } 20632 func rewriteValueARM_OpRound32F_0(v *Value) bool { 20633 // match: (Round32F x) 20634 // cond: 20635 // result: x 20636 for { 20637 x := v.Args[0] 20638 v.reset(OpCopy) 20639 v.Type = x.Type 20640 v.AddArg(x) 20641 return true 20642 } 20643 } 20644 func rewriteValueARM_OpRound64F_0(v *Value) bool { 20645 // match: (Round64F x) 20646 // cond: 20647 // result: x 20648 for { 20649 x := v.Args[0] 20650 v.reset(OpCopy) 20651 v.Type = x.Type 20652 v.AddArg(x) 20653 return true 20654 } 20655 } 20656 func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { 20657 b := v.Block 20658 _ = b 20659 typ := &b.Func.Config.Types 20660 _ = typ 20661 // match: (Rsh16Ux16 x y) 20662 // cond: 20663 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 20664 for { 20665 _ = v.Args[1] 20666 x := v.Args[0] 20667 y := v.Args[1] 20668 v.reset(OpARMCMOVWHSconst) 20669 v.AuxInt = 0 20670 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20671 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20672 v1.AddArg(x) 20673 v0.AddArg(v1) 20674 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20675 v2.AddArg(y) 20676 v0.AddArg(v2) 20677 v.AddArg(v0) 20678 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20679 v3.AuxInt = 256 20680 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20681 v4.AddArg(y) 20682 v3.AddArg(v4) 20683 v.AddArg(v3) 20684 return true 20685 } 20686 } 20687 func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { 20688 b := v.Block 20689 _ = b 20690 typ := &b.Func.Config.Types 20691 _ = typ 20692 // match: (Rsh16Ux32 x y) 20693 // cond: 20694 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 20695 for { 20696 _ = v.Args[1] 20697 x := v.Args[0] 20698 y := v.Args[1] 20699 v.reset(OpARMCMOVWHSconst) 20700 v.AuxInt = 0 20701 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20702 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20703 v1.AddArg(x) 20704 v0.AddArg(v1) 20705 v0.AddArg(y) 20706 v.AddArg(v0) 20707 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20708 v2.AuxInt = 256 20709 v2.AddArg(y) 20710 v.AddArg(v2) 20711 return true 20712 } 20713 } 20714 func rewriteValueARM_OpRsh16Ux64_0(v *Value) bool { 20715 b := v.Block 20716 _ = b 20717 typ := &b.Func.Config.Types 20718 _ = typ 20719 // match: (Rsh16Ux64 x (Const64 [c])) 20720 // cond: uint64(c) < 16 20721 // result: (SRLconst (SLLconst <typ.UInt32> x [16]) [c+16]) 20722 for { 20723 _ = v.Args[1] 20724 x := v.Args[0] 20725 v_1 := v.Args[1] 20726 if v_1.Op != OpConst64 { 20727 break 20728 } 20729 c := v_1.AuxInt 20730 if !(uint64(c) < 16) { 20731 break 20732 } 20733 v.reset(OpARMSRLconst) 20734 v.AuxInt = c + 16 20735 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20736 v0.AuxInt = 16 20737 v0.AddArg(x) 20738 v.AddArg(v0) 20739 return true 20740 } 20741 // match: (Rsh16Ux64 _ (Const64 [c])) 20742 // cond: uint64(c) >= 16 20743 // result: (Const16 [0]) 20744 for { 20745 _ = v.Args[1] 20746 v_1 := v.Args[1] 20747 if v_1.Op != OpConst64 { 20748 break 20749 } 20750 c := v_1.AuxInt 20751 if !(uint64(c) >= 16) { 20752 break 20753 } 20754 v.reset(OpConst16) 20755 v.AuxInt = 0 20756 return true 20757 } 20758 return false 20759 } 20760 func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { 20761 b := v.Block 20762 _ = b 20763 typ := &b.Func.Config.Types 20764 _ = typ 20765 // match: (Rsh16Ux8 x y) 20766 // cond: 20767 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 20768 for { 20769 _ = v.Args[1] 20770 x := v.Args[0] 20771 y := v.Args[1] 20772 v.reset(OpARMSRL) 20773 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20774 v0.AddArg(x) 20775 v.AddArg(v0) 20776 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20777 v1.AddArg(y) 20778 v.AddArg(v1) 20779 return true 20780 } 20781 } 20782 func rewriteValueARM_OpRsh16x16_0(v *Value) bool { 20783 b := v.Block 20784 _ = b 20785 typ := &b.Func.Config.Types 20786 _ = typ 20787 // match: (Rsh16x16 x y) 20788 // cond: 20789 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 20790 for { 20791 _ = v.Args[1] 20792 x := v.Args[0] 20793 y := v.Args[1] 20794 v.reset(OpARMSRAcond) 20795 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20796 v0.AddArg(x) 20797 v.AddArg(v0) 20798 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20799 v1.AddArg(y) 20800 v.AddArg(v1) 20801 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20802 v2.AuxInt = 256 20803 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20804 v3.AddArg(y) 20805 v2.AddArg(v3) 20806 v.AddArg(v2) 20807 return true 20808 } 20809 } 20810 func rewriteValueARM_OpRsh16x32_0(v *Value) bool { 20811 b := v.Block 20812 _ = b 20813 typ := &b.Func.Config.Types 20814 _ = typ 20815 // match: (Rsh16x32 x y) 20816 // cond: 20817 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 20818 for { 20819 _ = v.Args[1] 20820 x := v.Args[0] 20821 y := v.Args[1] 20822 v.reset(OpARMSRAcond) 20823 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20824 v0.AddArg(x) 20825 v.AddArg(v0) 20826 v.AddArg(y) 20827 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20828 v1.AuxInt = 256 20829 v1.AddArg(y) 20830 v.AddArg(v1) 20831 return true 20832 } 20833 } 20834 func rewriteValueARM_OpRsh16x64_0(v *Value) bool { 20835 b := v.Block 20836 _ = b 20837 typ := &b.Func.Config.Types 20838 _ = typ 20839 // match: (Rsh16x64 x (Const64 [c])) 20840 // cond: uint64(c) < 16 20841 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [c+16]) 20842 for { 20843 _ = v.Args[1] 20844 x := v.Args[0] 20845 v_1 := v.Args[1] 20846 if v_1.Op != OpConst64 { 20847 break 20848 } 20849 c := v_1.AuxInt 20850 if !(uint64(c) < 16) { 20851 break 20852 } 20853 v.reset(OpARMSRAconst) 20854 v.AuxInt = c + 16 20855 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20856 v0.AuxInt = 16 20857 v0.AddArg(x) 20858 v.AddArg(v0) 20859 return true 20860 } 20861 // match: (Rsh16x64 x (Const64 [c])) 20862 // cond: uint64(c) >= 16 20863 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [31]) 20864 for { 20865 _ = v.Args[1] 20866 x := v.Args[0] 20867 v_1 := v.Args[1] 20868 if v_1.Op != OpConst64 { 20869 break 20870 } 20871 c := v_1.AuxInt 20872 if !(uint64(c) >= 16) { 20873 break 20874 } 20875 v.reset(OpARMSRAconst) 20876 v.AuxInt = 31 20877 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20878 v0.AuxInt = 16 20879 v0.AddArg(x) 20880 v.AddArg(v0) 20881 return true 20882 } 20883 return false 20884 } 20885 func rewriteValueARM_OpRsh16x8_0(v *Value) bool { 20886 b := v.Block 20887 _ = b 20888 typ := &b.Func.Config.Types 20889 _ = typ 20890 // match: (Rsh16x8 x y) 20891 // cond: 20892 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 20893 for { 20894 _ = v.Args[1] 20895 x := v.Args[0] 20896 y := v.Args[1] 20897 v.reset(OpARMSRA) 20898 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20899 v0.AddArg(x) 20900 v.AddArg(v0) 20901 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20902 v1.AddArg(y) 20903 v.AddArg(v1) 20904 return true 20905 } 20906 } 20907 func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { 20908 b := v.Block 20909 _ = b 20910 typ := &b.Func.Config.Types 20911 _ = typ 20912 // match: (Rsh32Ux16 x y) 20913 // cond: 20914 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 20915 for { 20916 _ = v.Args[1] 20917 x := v.Args[0] 20918 y := v.Args[1] 20919 v.reset(OpARMCMOVWHSconst) 20920 v.AuxInt = 0 20921 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20922 v0.AddArg(x) 20923 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20924 v1.AddArg(y) 20925 v0.AddArg(v1) 20926 v.AddArg(v0) 20927 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20928 v2.AuxInt = 256 20929 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20930 v3.AddArg(y) 20931 v2.AddArg(v3) 20932 v.AddArg(v2) 20933 return true 20934 } 20935 } 20936 func rewriteValueARM_OpRsh32Ux32_0(v *Value) bool { 20937 b := v.Block 20938 _ = b 20939 // match: (Rsh32Ux32 x y) 20940 // cond: 20941 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 20942 for { 20943 _ = v.Args[1] 20944 x := v.Args[0] 20945 y := v.Args[1] 20946 v.reset(OpARMCMOVWHSconst) 20947 v.AuxInt = 0 20948 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20949 v0.AddArg(x) 20950 v0.AddArg(y) 20951 v.AddArg(v0) 20952 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20953 v1.AuxInt = 256 20954 v1.AddArg(y) 20955 v.AddArg(v1) 20956 return true 20957 } 20958 } 20959 func rewriteValueARM_OpRsh32Ux64_0(v *Value) bool { 20960 // match: (Rsh32Ux64 x (Const64 [c])) 20961 // cond: uint64(c) < 32 20962 // result: (SRLconst x [c]) 20963 for { 20964 _ = v.Args[1] 20965 x := v.Args[0] 20966 v_1 := v.Args[1] 20967 if v_1.Op != OpConst64 { 20968 break 20969 } 20970 c := v_1.AuxInt 20971 if !(uint64(c) < 32) { 20972 break 20973 } 20974 v.reset(OpARMSRLconst) 20975 v.AuxInt = c 20976 v.AddArg(x) 20977 return true 20978 } 20979 // match: (Rsh32Ux64 _ (Const64 [c])) 20980 // cond: uint64(c) >= 32 20981 // result: (Const32 [0]) 20982 for { 20983 _ = v.Args[1] 20984 v_1 := v.Args[1] 20985 if v_1.Op != OpConst64 { 20986 break 20987 } 20988 c := v_1.AuxInt 20989 if !(uint64(c) >= 32) { 20990 break 20991 } 20992 v.reset(OpConst32) 20993 v.AuxInt = 0 20994 return true 20995 } 20996 return false 20997 } 20998 func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { 20999 b := v.Block 21000 _ = b 21001 typ := &b.Func.Config.Types 21002 _ = typ 21003 // match: (Rsh32Ux8 x y) 21004 // cond: 21005 // result: (SRL x (ZeroExt8to32 y)) 21006 for { 21007 _ = v.Args[1] 21008 x := v.Args[0] 21009 y := v.Args[1] 21010 v.reset(OpARMSRL) 21011 v.AddArg(x) 21012 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21013 v0.AddArg(y) 21014 v.AddArg(v0) 21015 return true 21016 } 21017 } 21018 func rewriteValueARM_OpRsh32x16_0(v *Value) bool { 21019 b := v.Block 21020 _ = b 21021 typ := &b.Func.Config.Types 21022 _ = typ 21023 // match: (Rsh32x16 x y) 21024 // cond: 21025 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 21026 for { 21027 _ = v.Args[1] 21028 x := v.Args[0] 21029 y := v.Args[1] 21030 v.reset(OpARMSRAcond) 21031 v.AddArg(x) 21032 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21033 v0.AddArg(y) 21034 v.AddArg(v0) 21035 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21036 v1.AuxInt = 256 21037 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21038 v2.AddArg(y) 21039 v1.AddArg(v2) 21040 v.AddArg(v1) 21041 return true 21042 } 21043 } 21044 func rewriteValueARM_OpRsh32x32_0(v *Value) bool { 21045 b := v.Block 21046 _ = b 21047 // match: (Rsh32x32 x y) 21048 // cond: 21049 // result: (SRAcond x y (CMPconst [256] y)) 21050 for { 21051 _ = v.Args[1] 21052 x := v.Args[0] 21053 y := v.Args[1] 21054 v.reset(OpARMSRAcond) 21055 v.AddArg(x) 21056 v.AddArg(y) 21057 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21058 v0.AuxInt = 256 21059 v0.AddArg(y) 21060 v.AddArg(v0) 21061 return true 21062 } 21063 } 21064 func rewriteValueARM_OpRsh32x64_0(v *Value) bool { 21065 // match: (Rsh32x64 x (Const64 [c])) 21066 // cond: uint64(c) < 32 21067 // result: (SRAconst x [c]) 21068 for { 21069 _ = v.Args[1] 21070 x := v.Args[0] 21071 v_1 := v.Args[1] 21072 if v_1.Op != OpConst64 { 21073 break 21074 } 21075 c := v_1.AuxInt 21076 if !(uint64(c) < 32) { 21077 break 21078 } 21079 v.reset(OpARMSRAconst) 21080 v.AuxInt = c 21081 v.AddArg(x) 21082 return true 21083 } 21084 // match: (Rsh32x64 x (Const64 [c])) 21085 // cond: uint64(c) >= 32 21086 // result: (SRAconst x [31]) 21087 for { 21088 _ = v.Args[1] 21089 x := v.Args[0] 21090 v_1 := v.Args[1] 21091 if v_1.Op != OpConst64 { 21092 break 21093 } 21094 c := v_1.AuxInt 21095 if !(uint64(c) >= 32) { 21096 break 21097 } 21098 v.reset(OpARMSRAconst) 21099 v.AuxInt = 31 21100 v.AddArg(x) 21101 return true 21102 } 21103 return false 21104 } 21105 func rewriteValueARM_OpRsh32x8_0(v *Value) bool { 21106 b := v.Block 21107 _ = b 21108 typ := &b.Func.Config.Types 21109 _ = typ 21110 // match: (Rsh32x8 x y) 21111 // cond: 21112 // result: (SRA x (ZeroExt8to32 y)) 21113 for { 21114 _ = v.Args[1] 21115 x := v.Args[0] 21116 y := v.Args[1] 21117 v.reset(OpARMSRA) 21118 v.AddArg(x) 21119 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21120 v0.AddArg(y) 21121 v.AddArg(v0) 21122 return true 21123 } 21124 } 21125 func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { 21126 b := v.Block 21127 _ = b 21128 typ := &b.Func.Config.Types 21129 _ = typ 21130 // match: (Rsh8Ux16 x y) 21131 // cond: 21132 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 21133 for { 21134 _ = v.Args[1] 21135 x := v.Args[0] 21136 y := v.Args[1] 21137 v.reset(OpARMCMOVWHSconst) 21138 v.AuxInt = 0 21139 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 21140 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21141 v1.AddArg(x) 21142 v0.AddArg(v1) 21143 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21144 v2.AddArg(y) 21145 v0.AddArg(v2) 21146 v.AddArg(v0) 21147 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21148 v3.AuxInt = 256 21149 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21150 v4.AddArg(y) 21151 v3.AddArg(v4) 21152 v.AddArg(v3) 21153 return true 21154 } 21155 } 21156 func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { 21157 b := v.Block 21158 _ = b 21159 typ := &b.Func.Config.Types 21160 _ = typ 21161 // match: (Rsh8Ux32 x y) 21162 // cond: 21163 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 21164 for { 21165 _ = v.Args[1] 21166 x := v.Args[0] 21167 y := v.Args[1] 21168 v.reset(OpARMCMOVWHSconst) 21169 v.AuxInt = 0 21170 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 21171 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21172 v1.AddArg(x) 21173 v0.AddArg(v1) 21174 v0.AddArg(y) 21175 v.AddArg(v0) 21176 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21177 v2.AuxInt = 256 21178 v2.AddArg(y) 21179 v.AddArg(v2) 21180 return true 21181 } 21182 } 21183 func rewriteValueARM_OpRsh8Ux64_0(v *Value) bool { 21184 b := v.Block 21185 _ = b 21186 typ := &b.Func.Config.Types 21187 _ = typ 21188 // match: (Rsh8Ux64 x (Const64 [c])) 21189 // cond: uint64(c) < 8 21190 // result: (SRLconst (SLLconst <typ.UInt32> x [24]) [c+24]) 21191 for { 21192 _ = v.Args[1] 21193 x := v.Args[0] 21194 v_1 := v.Args[1] 21195 if v_1.Op != OpConst64 { 21196 break 21197 } 21198 c := v_1.AuxInt 21199 if !(uint64(c) < 8) { 21200 break 21201 } 21202 v.reset(OpARMSRLconst) 21203 v.AuxInt = c + 24 21204 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21205 v0.AuxInt = 24 21206 v0.AddArg(x) 21207 v.AddArg(v0) 21208 return true 21209 } 21210 // match: (Rsh8Ux64 _ (Const64 [c])) 21211 // cond: uint64(c) >= 8 21212 // result: (Const8 [0]) 21213 for { 21214 _ = v.Args[1] 21215 v_1 := v.Args[1] 21216 if v_1.Op != OpConst64 { 21217 break 21218 } 21219 c := v_1.AuxInt 21220 if !(uint64(c) >= 8) { 21221 break 21222 } 21223 v.reset(OpConst8) 21224 v.AuxInt = 0 21225 return true 21226 } 21227 return false 21228 } 21229 func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { 21230 b := v.Block 21231 _ = b 21232 typ := &b.Func.Config.Types 21233 _ = typ 21234 // match: (Rsh8Ux8 x y) 21235 // cond: 21236 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 21237 for { 21238 _ = v.Args[1] 21239 x := v.Args[0] 21240 y := v.Args[1] 21241 v.reset(OpARMSRL) 21242 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21243 v0.AddArg(x) 21244 v.AddArg(v0) 21245 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21246 v1.AddArg(y) 21247 v.AddArg(v1) 21248 return true 21249 } 21250 } 21251 func rewriteValueARM_OpRsh8x16_0(v *Value) bool { 21252 b := v.Block 21253 _ = b 21254 typ := &b.Func.Config.Types 21255 _ = typ 21256 // match: (Rsh8x16 x y) 21257 // cond: 21258 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 21259 for { 21260 _ = v.Args[1] 21261 x := v.Args[0] 21262 y := v.Args[1] 21263 v.reset(OpARMSRAcond) 21264 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21265 v0.AddArg(x) 21266 v.AddArg(v0) 21267 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21268 v1.AddArg(y) 21269 v.AddArg(v1) 21270 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21271 v2.AuxInt = 256 21272 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21273 v3.AddArg(y) 21274 v2.AddArg(v3) 21275 v.AddArg(v2) 21276 return true 21277 } 21278 } 21279 func rewriteValueARM_OpRsh8x32_0(v *Value) bool { 21280 b := v.Block 21281 _ = b 21282 typ := &b.Func.Config.Types 21283 _ = typ 21284 // match: (Rsh8x32 x y) 21285 // cond: 21286 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 21287 for { 21288 _ = v.Args[1] 21289 x := v.Args[0] 21290 y := v.Args[1] 21291 v.reset(OpARMSRAcond) 21292 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21293 v0.AddArg(x) 21294 v.AddArg(v0) 21295 v.AddArg(y) 21296 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21297 v1.AuxInt = 256 21298 v1.AddArg(y) 21299 v.AddArg(v1) 21300 return true 21301 } 21302 } 21303 func rewriteValueARM_OpRsh8x64_0(v *Value) bool { 21304 b := v.Block 21305 _ = b 21306 typ := &b.Func.Config.Types 21307 _ = typ 21308 // match: (Rsh8x64 x (Const64 [c])) 21309 // cond: uint64(c) < 8 21310 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [c+24]) 21311 for { 21312 _ = v.Args[1] 21313 x := v.Args[0] 21314 v_1 := v.Args[1] 21315 if v_1.Op != OpConst64 { 21316 break 21317 } 21318 c := v_1.AuxInt 21319 if !(uint64(c) < 8) { 21320 break 21321 } 21322 v.reset(OpARMSRAconst) 21323 v.AuxInt = c + 24 21324 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21325 v0.AuxInt = 24 21326 v0.AddArg(x) 21327 v.AddArg(v0) 21328 return true 21329 } 21330 // match: (Rsh8x64 x (Const64 [c])) 21331 // cond: uint64(c) >= 8 21332 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [31]) 21333 for { 21334 _ = v.Args[1] 21335 x := v.Args[0] 21336 v_1 := v.Args[1] 21337 if v_1.Op != OpConst64 { 21338 break 21339 } 21340 c := v_1.AuxInt 21341 if !(uint64(c) >= 8) { 21342 break 21343 } 21344 v.reset(OpARMSRAconst) 21345 v.AuxInt = 31 21346 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21347 v0.AuxInt = 24 21348 v0.AddArg(x) 21349 v.AddArg(v0) 21350 return true 21351 } 21352 return false 21353 } 21354 func rewriteValueARM_OpRsh8x8_0(v *Value) bool { 21355 b := v.Block 21356 _ = b 21357 typ := &b.Func.Config.Types 21358 _ = typ 21359 // match: (Rsh8x8 x y) 21360 // cond: 21361 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 21362 for { 21363 _ = v.Args[1] 21364 x := v.Args[0] 21365 y := v.Args[1] 21366 v.reset(OpARMSRA) 21367 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21368 v0.AddArg(x) 21369 v.AddArg(v0) 21370 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21371 v1.AddArg(y) 21372 v.AddArg(v1) 21373 return true 21374 } 21375 } 21376 func rewriteValueARM_OpSelect0_0(v *Value) bool { 21377 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 21378 // cond: 21379 // result: x 21380 for { 21381 v_0 := v.Args[0] 21382 if v_0.Op != OpARMCALLudiv { 21383 break 21384 } 21385 _ = v_0.Args[1] 21386 x := v_0.Args[0] 21387 v_0_1 := v_0.Args[1] 21388 if v_0_1.Op != OpARMMOVWconst { 21389 break 21390 } 21391 if v_0_1.AuxInt != 1 { 21392 break 21393 } 21394 v.reset(OpCopy) 21395 v.Type = x.Type 21396 v.AddArg(x) 21397 return true 21398 } 21399 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 21400 // cond: isPowerOfTwo(c) 21401 // result: (SRLconst [log2(c)] x) 21402 for { 21403 v_0 := v.Args[0] 21404 if v_0.Op != OpARMCALLudiv { 21405 break 21406 } 21407 _ = v_0.Args[1] 21408 x := v_0.Args[0] 21409 v_0_1 := v_0.Args[1] 21410 if v_0_1.Op != OpARMMOVWconst { 21411 break 21412 } 21413 c := v_0_1.AuxInt 21414 if !(isPowerOfTwo(c)) { 21415 break 21416 } 21417 v.reset(OpARMSRLconst) 21418 v.AuxInt = log2(c) 21419 v.AddArg(x) 21420 return true 21421 } 21422 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 21423 // cond: 21424 // result: (MOVWconst [int64(int32(uint32(c)/uint32(d)))]) 21425 for { 21426 v_0 := v.Args[0] 21427 if v_0.Op != OpARMCALLudiv { 21428 break 21429 } 21430 _ = v_0.Args[1] 21431 v_0_0 := v_0.Args[0] 21432 if v_0_0.Op != OpARMMOVWconst { 21433 break 21434 } 21435 c := v_0_0.AuxInt 21436 v_0_1 := v_0.Args[1] 21437 if v_0_1.Op != OpARMMOVWconst { 21438 break 21439 } 21440 d := v_0_1.AuxInt 21441 v.reset(OpARMMOVWconst) 21442 v.AuxInt = int64(int32(uint32(c) / uint32(d))) 21443 return true 21444 } 21445 return false 21446 } 21447 func rewriteValueARM_OpSelect1_0(v *Value) bool { 21448 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 21449 // cond: 21450 // result: (MOVWconst [0]) 21451 for { 21452 v_0 := v.Args[0] 21453 if v_0.Op != OpARMCALLudiv { 21454 break 21455 } 21456 _ = v_0.Args[1] 21457 v_0_1 := v_0.Args[1] 21458 if v_0_1.Op != OpARMMOVWconst { 21459 break 21460 } 21461 if v_0_1.AuxInt != 1 { 21462 break 21463 } 21464 v.reset(OpARMMOVWconst) 21465 v.AuxInt = 0 21466 return true 21467 } 21468 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 21469 // cond: isPowerOfTwo(c) 21470 // result: (ANDconst [c-1] x) 21471 for { 21472 v_0 := v.Args[0] 21473 if v_0.Op != OpARMCALLudiv { 21474 break 21475 } 21476 _ = v_0.Args[1] 21477 x := v_0.Args[0] 21478 v_0_1 := v_0.Args[1] 21479 if v_0_1.Op != OpARMMOVWconst { 21480 break 21481 } 21482 c := v_0_1.AuxInt 21483 if !(isPowerOfTwo(c)) { 21484 break 21485 } 21486 v.reset(OpARMANDconst) 21487 v.AuxInt = c - 1 21488 v.AddArg(x) 21489 return true 21490 } 21491 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 21492 // cond: 21493 // result: (MOVWconst [int64(int32(uint32(c)%uint32(d)))]) 21494 for { 21495 v_0 := v.Args[0] 21496 if v_0.Op != OpARMCALLudiv { 21497 break 21498 } 21499 _ = v_0.Args[1] 21500 v_0_0 := v_0.Args[0] 21501 if v_0_0.Op != OpARMMOVWconst { 21502 break 21503 } 21504 c := v_0_0.AuxInt 21505 v_0_1 := v_0.Args[1] 21506 if v_0_1.Op != OpARMMOVWconst { 21507 break 21508 } 21509 d := v_0_1.AuxInt 21510 v.reset(OpARMMOVWconst) 21511 v.AuxInt = int64(int32(uint32(c) % uint32(d))) 21512 return true 21513 } 21514 return false 21515 } 21516 func rewriteValueARM_OpSignExt16to32_0(v *Value) bool { 21517 // match: (SignExt16to32 x) 21518 // cond: 21519 // result: (MOVHreg x) 21520 for { 21521 x := v.Args[0] 21522 v.reset(OpARMMOVHreg) 21523 v.AddArg(x) 21524 return true 21525 } 21526 } 21527 func rewriteValueARM_OpSignExt8to16_0(v *Value) bool { 21528 // match: (SignExt8to16 x) 21529 // cond: 21530 // result: (MOVBreg x) 21531 for { 21532 x := v.Args[0] 21533 v.reset(OpARMMOVBreg) 21534 v.AddArg(x) 21535 return true 21536 } 21537 } 21538 func rewriteValueARM_OpSignExt8to32_0(v *Value) bool { 21539 // match: (SignExt8to32 x) 21540 // cond: 21541 // result: (MOVBreg x) 21542 for { 21543 x := v.Args[0] 21544 v.reset(OpARMMOVBreg) 21545 v.AddArg(x) 21546 return true 21547 } 21548 } 21549 func rewriteValueARM_OpSignmask_0(v *Value) bool { 21550 // match: (Signmask x) 21551 // cond: 21552 // result: (SRAconst x [31]) 21553 for { 21554 x := v.Args[0] 21555 v.reset(OpARMSRAconst) 21556 v.AuxInt = 31 21557 v.AddArg(x) 21558 return true 21559 } 21560 } 21561 func rewriteValueARM_OpSlicemask_0(v *Value) bool { 21562 b := v.Block 21563 _ = b 21564 // match: (Slicemask <t> x) 21565 // cond: 21566 // result: (SRAconst (RSBconst <t> [0] x) [31]) 21567 for { 21568 t := v.Type 21569 x := v.Args[0] 21570 v.reset(OpARMSRAconst) 21571 v.AuxInt = 31 21572 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 21573 v0.AuxInt = 0 21574 v0.AddArg(x) 21575 v.AddArg(v0) 21576 return true 21577 } 21578 } 21579 func rewriteValueARM_OpSqrt_0(v *Value) bool { 21580 // match: (Sqrt x) 21581 // cond: 21582 // result: (SQRTD x) 21583 for { 21584 x := v.Args[0] 21585 v.reset(OpARMSQRTD) 21586 v.AddArg(x) 21587 return true 21588 } 21589 } 21590 func rewriteValueARM_OpStaticCall_0(v *Value) bool { 21591 // match: (StaticCall [argwid] {target} mem) 21592 // cond: 21593 // result: (CALLstatic [argwid] {target} mem) 21594 for { 21595 argwid := v.AuxInt 21596 target := v.Aux 21597 mem := v.Args[0] 21598 v.reset(OpARMCALLstatic) 21599 v.AuxInt = argwid 21600 v.Aux = target 21601 v.AddArg(mem) 21602 return true 21603 } 21604 } 21605 func rewriteValueARM_OpStore_0(v *Value) bool { 21606 // match: (Store {t} ptr val mem) 21607 // cond: t.(*types.Type).Size() == 1 21608 // result: (MOVBstore ptr val mem) 21609 for { 21610 t := v.Aux 21611 _ = v.Args[2] 21612 ptr := v.Args[0] 21613 val := v.Args[1] 21614 mem := v.Args[2] 21615 if !(t.(*types.Type).Size() == 1) { 21616 break 21617 } 21618 v.reset(OpARMMOVBstore) 21619 v.AddArg(ptr) 21620 v.AddArg(val) 21621 v.AddArg(mem) 21622 return true 21623 } 21624 // match: (Store {t} ptr val mem) 21625 // cond: t.(*types.Type).Size() == 2 21626 // result: (MOVHstore ptr val mem) 21627 for { 21628 t := v.Aux 21629 _ = v.Args[2] 21630 ptr := v.Args[0] 21631 val := v.Args[1] 21632 mem := v.Args[2] 21633 if !(t.(*types.Type).Size() == 2) { 21634 break 21635 } 21636 v.reset(OpARMMOVHstore) 21637 v.AddArg(ptr) 21638 v.AddArg(val) 21639 v.AddArg(mem) 21640 return true 21641 } 21642 // match: (Store {t} ptr val mem) 21643 // cond: t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type) 21644 // result: (MOVWstore ptr val mem) 21645 for { 21646 t := v.Aux 21647 _ = v.Args[2] 21648 ptr := v.Args[0] 21649 val := v.Args[1] 21650 mem := v.Args[2] 21651 if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { 21652 break 21653 } 21654 v.reset(OpARMMOVWstore) 21655 v.AddArg(ptr) 21656 v.AddArg(val) 21657 v.AddArg(mem) 21658 return true 21659 } 21660 // match: (Store {t} ptr val mem) 21661 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 21662 // result: (MOVFstore ptr val mem) 21663 for { 21664 t := v.Aux 21665 _ = v.Args[2] 21666 ptr := v.Args[0] 21667 val := v.Args[1] 21668 mem := v.Args[2] 21669 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 21670 break 21671 } 21672 v.reset(OpARMMOVFstore) 21673 v.AddArg(ptr) 21674 v.AddArg(val) 21675 v.AddArg(mem) 21676 return true 21677 } 21678 // match: (Store {t} ptr val mem) 21679 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 21680 // result: (MOVDstore ptr val mem) 21681 for { 21682 t := v.Aux 21683 _ = v.Args[2] 21684 ptr := v.Args[0] 21685 val := v.Args[1] 21686 mem := v.Args[2] 21687 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 21688 break 21689 } 21690 v.reset(OpARMMOVDstore) 21691 v.AddArg(ptr) 21692 v.AddArg(val) 21693 v.AddArg(mem) 21694 return true 21695 } 21696 return false 21697 } 21698 func rewriteValueARM_OpSub16_0(v *Value) bool { 21699 // match: (Sub16 x y) 21700 // cond: 21701 // result: (SUB x y) 21702 for { 21703 _ = v.Args[1] 21704 x := v.Args[0] 21705 y := v.Args[1] 21706 v.reset(OpARMSUB) 21707 v.AddArg(x) 21708 v.AddArg(y) 21709 return true 21710 } 21711 } 21712 func rewriteValueARM_OpSub32_0(v *Value) bool { 21713 // match: (Sub32 x y) 21714 // cond: 21715 // result: (SUB x y) 21716 for { 21717 _ = v.Args[1] 21718 x := v.Args[0] 21719 y := v.Args[1] 21720 v.reset(OpARMSUB) 21721 v.AddArg(x) 21722 v.AddArg(y) 21723 return true 21724 } 21725 } 21726 func rewriteValueARM_OpSub32F_0(v *Value) bool { 21727 // match: (Sub32F x y) 21728 // cond: 21729 // result: (SUBF x y) 21730 for { 21731 _ = v.Args[1] 21732 x := v.Args[0] 21733 y := v.Args[1] 21734 v.reset(OpARMSUBF) 21735 v.AddArg(x) 21736 v.AddArg(y) 21737 return true 21738 } 21739 } 21740 func rewriteValueARM_OpSub32carry_0(v *Value) bool { 21741 // match: (Sub32carry x y) 21742 // cond: 21743 // result: (SUBS x y) 21744 for { 21745 _ = v.Args[1] 21746 x := v.Args[0] 21747 y := v.Args[1] 21748 v.reset(OpARMSUBS) 21749 v.AddArg(x) 21750 v.AddArg(y) 21751 return true 21752 } 21753 } 21754 func rewriteValueARM_OpSub32withcarry_0(v *Value) bool { 21755 // match: (Sub32withcarry x y c) 21756 // cond: 21757 // result: (SBC x y c) 21758 for { 21759 _ = v.Args[2] 21760 x := v.Args[0] 21761 y := v.Args[1] 21762 c := v.Args[2] 21763 v.reset(OpARMSBC) 21764 v.AddArg(x) 21765 v.AddArg(y) 21766 v.AddArg(c) 21767 return true 21768 } 21769 } 21770 func rewriteValueARM_OpSub64F_0(v *Value) bool { 21771 // match: (Sub64F x y) 21772 // cond: 21773 // result: (SUBD x y) 21774 for { 21775 _ = v.Args[1] 21776 x := v.Args[0] 21777 y := v.Args[1] 21778 v.reset(OpARMSUBD) 21779 v.AddArg(x) 21780 v.AddArg(y) 21781 return true 21782 } 21783 } 21784 func rewriteValueARM_OpSub8_0(v *Value) bool { 21785 // match: (Sub8 x y) 21786 // cond: 21787 // result: (SUB x y) 21788 for { 21789 _ = v.Args[1] 21790 x := v.Args[0] 21791 y := v.Args[1] 21792 v.reset(OpARMSUB) 21793 v.AddArg(x) 21794 v.AddArg(y) 21795 return true 21796 } 21797 } 21798 func rewriteValueARM_OpSubPtr_0(v *Value) bool { 21799 // match: (SubPtr x y) 21800 // cond: 21801 // result: (SUB x y) 21802 for { 21803 _ = v.Args[1] 21804 x := v.Args[0] 21805 y := v.Args[1] 21806 v.reset(OpARMSUB) 21807 v.AddArg(x) 21808 v.AddArg(y) 21809 return true 21810 } 21811 } 21812 func rewriteValueARM_OpTrunc16to8_0(v *Value) bool { 21813 // match: (Trunc16to8 x) 21814 // cond: 21815 // result: x 21816 for { 21817 x := v.Args[0] 21818 v.reset(OpCopy) 21819 v.Type = x.Type 21820 v.AddArg(x) 21821 return true 21822 } 21823 } 21824 func rewriteValueARM_OpTrunc32to16_0(v *Value) bool { 21825 // match: (Trunc32to16 x) 21826 // cond: 21827 // result: x 21828 for { 21829 x := v.Args[0] 21830 v.reset(OpCopy) 21831 v.Type = x.Type 21832 v.AddArg(x) 21833 return true 21834 } 21835 } 21836 func rewriteValueARM_OpTrunc32to8_0(v *Value) bool { 21837 // match: (Trunc32to8 x) 21838 // cond: 21839 // result: x 21840 for { 21841 x := v.Args[0] 21842 v.reset(OpCopy) 21843 v.Type = x.Type 21844 v.AddArg(x) 21845 return true 21846 } 21847 } 21848 func rewriteValueARM_OpWB_0(v *Value) bool { 21849 // match: (WB {fn} destptr srcptr mem) 21850 // cond: 21851 // result: (LoweredWB {fn} destptr srcptr mem) 21852 for { 21853 fn := v.Aux 21854 _ = v.Args[2] 21855 destptr := v.Args[0] 21856 srcptr := v.Args[1] 21857 mem := v.Args[2] 21858 v.reset(OpARMLoweredWB) 21859 v.Aux = fn 21860 v.AddArg(destptr) 21861 v.AddArg(srcptr) 21862 v.AddArg(mem) 21863 return true 21864 } 21865 } 21866 func rewriteValueARM_OpXor16_0(v *Value) bool { 21867 // match: (Xor16 x y) 21868 // cond: 21869 // result: (XOR x y) 21870 for { 21871 _ = v.Args[1] 21872 x := v.Args[0] 21873 y := v.Args[1] 21874 v.reset(OpARMXOR) 21875 v.AddArg(x) 21876 v.AddArg(y) 21877 return true 21878 } 21879 } 21880 func rewriteValueARM_OpXor32_0(v *Value) bool { 21881 // match: (Xor32 x y) 21882 // cond: 21883 // result: (XOR x y) 21884 for { 21885 _ = v.Args[1] 21886 x := v.Args[0] 21887 y := v.Args[1] 21888 v.reset(OpARMXOR) 21889 v.AddArg(x) 21890 v.AddArg(y) 21891 return true 21892 } 21893 } 21894 func rewriteValueARM_OpXor8_0(v *Value) bool { 21895 // match: (Xor8 x y) 21896 // cond: 21897 // result: (XOR x y) 21898 for { 21899 _ = v.Args[1] 21900 x := v.Args[0] 21901 y := v.Args[1] 21902 v.reset(OpARMXOR) 21903 v.AddArg(x) 21904 v.AddArg(y) 21905 return true 21906 } 21907 } 21908 func rewriteValueARM_OpZero_0(v *Value) bool { 21909 b := v.Block 21910 _ = b 21911 config := b.Func.Config 21912 _ = config 21913 typ := &b.Func.Config.Types 21914 _ = typ 21915 // match: (Zero [0] _ mem) 21916 // cond: 21917 // result: mem 21918 for { 21919 if v.AuxInt != 0 { 21920 break 21921 } 21922 _ = v.Args[1] 21923 mem := v.Args[1] 21924 v.reset(OpCopy) 21925 v.Type = mem.Type 21926 v.AddArg(mem) 21927 return true 21928 } 21929 // match: (Zero [1] ptr mem) 21930 // cond: 21931 // result: (MOVBstore ptr (MOVWconst [0]) mem) 21932 for { 21933 if v.AuxInt != 1 { 21934 break 21935 } 21936 _ = v.Args[1] 21937 ptr := v.Args[0] 21938 mem := v.Args[1] 21939 v.reset(OpARMMOVBstore) 21940 v.AddArg(ptr) 21941 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21942 v0.AuxInt = 0 21943 v.AddArg(v0) 21944 v.AddArg(mem) 21945 return true 21946 } 21947 // match: (Zero [2] {t} ptr mem) 21948 // cond: t.(*types.Type).Alignment()%2 == 0 21949 // result: (MOVHstore ptr (MOVWconst [0]) mem) 21950 for { 21951 if v.AuxInt != 2 { 21952 break 21953 } 21954 t := v.Aux 21955 _ = v.Args[1] 21956 ptr := v.Args[0] 21957 mem := v.Args[1] 21958 if !(t.(*types.Type).Alignment()%2 == 0) { 21959 break 21960 } 21961 v.reset(OpARMMOVHstore) 21962 v.AddArg(ptr) 21963 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21964 v0.AuxInt = 0 21965 v.AddArg(v0) 21966 v.AddArg(mem) 21967 return true 21968 } 21969 // match: (Zero [2] ptr mem) 21970 // cond: 21971 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 21972 for { 21973 if v.AuxInt != 2 { 21974 break 21975 } 21976 _ = v.Args[1] 21977 ptr := v.Args[0] 21978 mem := v.Args[1] 21979 v.reset(OpARMMOVBstore) 21980 v.AuxInt = 1 21981 v.AddArg(ptr) 21982 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21983 v0.AuxInt = 0 21984 v.AddArg(v0) 21985 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21986 v1.AuxInt = 0 21987 v1.AddArg(ptr) 21988 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21989 v2.AuxInt = 0 21990 v1.AddArg(v2) 21991 v1.AddArg(mem) 21992 v.AddArg(v1) 21993 return true 21994 } 21995 // match: (Zero [4] {t} ptr mem) 21996 // cond: t.(*types.Type).Alignment()%4 == 0 21997 // result: (MOVWstore ptr (MOVWconst [0]) mem) 21998 for { 21999 if v.AuxInt != 4 { 22000 break 22001 } 22002 t := v.Aux 22003 _ = v.Args[1] 22004 ptr := v.Args[0] 22005 mem := v.Args[1] 22006 if !(t.(*types.Type).Alignment()%4 == 0) { 22007 break 22008 } 22009 v.reset(OpARMMOVWstore) 22010 v.AddArg(ptr) 22011 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22012 v0.AuxInt = 0 22013 v.AddArg(v0) 22014 v.AddArg(mem) 22015 return true 22016 } 22017 // match: (Zero [4] {t} ptr mem) 22018 // cond: t.(*types.Type).Alignment()%2 == 0 22019 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 22020 for { 22021 if v.AuxInt != 4 { 22022 break 22023 } 22024 t := v.Aux 22025 _ = v.Args[1] 22026 ptr := v.Args[0] 22027 mem := v.Args[1] 22028 if !(t.(*types.Type).Alignment()%2 == 0) { 22029 break 22030 } 22031 v.reset(OpARMMOVHstore) 22032 v.AuxInt = 2 22033 v.AddArg(ptr) 22034 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22035 v0.AuxInt = 0 22036 v.AddArg(v0) 22037 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 22038 v1.AuxInt = 0 22039 v1.AddArg(ptr) 22040 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22041 v2.AuxInt = 0 22042 v1.AddArg(v2) 22043 v1.AddArg(mem) 22044 v.AddArg(v1) 22045 return true 22046 } 22047 // match: (Zero [4] ptr mem) 22048 // cond: 22049 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 22050 for { 22051 if v.AuxInt != 4 { 22052 break 22053 } 22054 _ = v.Args[1] 22055 ptr := v.Args[0] 22056 mem := v.Args[1] 22057 v.reset(OpARMMOVBstore) 22058 v.AuxInt = 3 22059 v.AddArg(ptr) 22060 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22061 v0.AuxInt = 0 22062 v.AddArg(v0) 22063 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 22064 v1.AuxInt = 2 22065 v1.AddArg(ptr) 22066 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22067 v2.AuxInt = 0 22068 v1.AddArg(v2) 22069 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 22070 v3.AuxInt = 1 22071 v3.AddArg(ptr) 22072 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22073 v4.AuxInt = 0 22074 v3.AddArg(v4) 22075 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 22076 v5.AuxInt = 0 22077 v5.AddArg(ptr) 22078 v6 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22079 v6.AuxInt = 0 22080 v5.AddArg(v6) 22081 v5.AddArg(mem) 22082 v3.AddArg(v5) 22083 v1.AddArg(v3) 22084 v.AddArg(v1) 22085 return true 22086 } 22087 // match: (Zero [3] ptr mem) 22088 // cond: 22089 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 22090 for { 22091 if v.AuxInt != 3 { 22092 break 22093 } 22094 _ = v.Args[1] 22095 ptr := v.Args[0] 22096 mem := v.Args[1] 22097 v.reset(OpARMMOVBstore) 22098 v.AuxInt = 2 22099 v.AddArg(ptr) 22100 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22101 v0.AuxInt = 0 22102 v.AddArg(v0) 22103 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 22104 v1.AuxInt = 1 22105 v1.AddArg(ptr) 22106 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22107 v2.AuxInt = 0 22108 v1.AddArg(v2) 22109 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 22110 v3.AuxInt = 0 22111 v3.AddArg(ptr) 22112 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22113 v4.AuxInt = 0 22114 v3.AddArg(v4) 22115 v3.AddArg(mem) 22116 v1.AddArg(v3) 22117 v.AddArg(v1) 22118 return true 22119 } 22120 // match: (Zero [s] {t} ptr mem) 22121 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 22122 // result: (DUFFZERO [4 * (128 - s/4)] ptr (MOVWconst [0]) mem) 22123 for { 22124 s := v.AuxInt 22125 t := v.Aux 22126 _ = v.Args[1] 22127 ptr := v.Args[0] 22128 mem := v.Args[1] 22129 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 22130 break 22131 } 22132 v.reset(OpARMDUFFZERO) 22133 v.AuxInt = 4 * (128 - s/4) 22134 v.AddArg(ptr) 22135 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22136 v0.AuxInt = 0 22137 v.AddArg(v0) 22138 v.AddArg(mem) 22139 return true 22140 } 22141 // match: (Zero [s] {t} ptr mem) 22142 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 22143 // result: (LoweredZero [t.(*types.Type).Alignment()] ptr (ADDconst <ptr.Type> ptr [s-moveSize(t.(*types.Type).Alignment(), config)]) (MOVWconst [0]) mem) 22144 for { 22145 s := v.AuxInt 22146 t := v.Aux 22147 _ = v.Args[1] 22148 ptr := v.Args[0] 22149 mem := v.Args[1] 22150 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 22151 break 22152 } 22153 v.reset(OpARMLoweredZero) 22154 v.AuxInt = t.(*types.Type).Alignment() 22155 v.AddArg(ptr) 22156 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 22157 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 22158 v0.AddArg(ptr) 22159 v.AddArg(v0) 22160 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22161 v1.AuxInt = 0 22162 v.AddArg(v1) 22163 v.AddArg(mem) 22164 return true 22165 } 22166 return false 22167 } 22168 func rewriteValueARM_OpZeroExt16to32_0(v *Value) bool { 22169 // match: (ZeroExt16to32 x) 22170 // cond: 22171 // result: (MOVHUreg x) 22172 for { 22173 x := v.Args[0] 22174 v.reset(OpARMMOVHUreg) 22175 v.AddArg(x) 22176 return true 22177 } 22178 } 22179 func rewriteValueARM_OpZeroExt8to16_0(v *Value) bool { 22180 // match: (ZeroExt8to16 x) 22181 // cond: 22182 // result: (MOVBUreg x) 22183 for { 22184 x := v.Args[0] 22185 v.reset(OpARMMOVBUreg) 22186 v.AddArg(x) 22187 return true 22188 } 22189 } 22190 func rewriteValueARM_OpZeroExt8to32_0(v *Value) bool { 22191 // match: (ZeroExt8to32 x) 22192 // cond: 22193 // result: (MOVBUreg x) 22194 for { 22195 x := v.Args[0] 22196 v.reset(OpARMMOVBUreg) 22197 v.AddArg(x) 22198 return true 22199 } 22200 } 22201 func rewriteValueARM_OpZeromask_0(v *Value) bool { 22202 b := v.Block 22203 _ = b 22204 typ := &b.Func.Config.Types 22205 _ = typ 22206 // match: (Zeromask x) 22207 // cond: 22208 // result: (SRAconst (RSBshiftRL <typ.Int32> x x [1]) [31]) 22209 for { 22210 x := v.Args[0] 22211 v.reset(OpARMSRAconst) 22212 v.AuxInt = 31 22213 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32) 22214 v0.AuxInt = 1 22215 v0.AddArg(x) 22216 v0.AddArg(x) 22217 v.AddArg(v0) 22218 return true 22219 } 22220 } 22221 func rewriteBlockARM(b *Block) bool { 22222 config := b.Func.Config 22223 _ = config 22224 fe := b.Func.fe 22225 _ = fe 22226 typ := &config.Types 22227 _ = typ 22228 switch b.Kind { 22229 case BlockARMEQ: 22230 // match: (EQ (FlagEQ) yes no) 22231 // cond: 22232 // result: (First nil yes no) 22233 for { 22234 v := b.Control 22235 if v.Op != OpARMFlagEQ { 22236 break 22237 } 22238 b.Kind = BlockFirst 22239 b.SetControl(nil) 22240 b.Aux = nil 22241 return true 22242 } 22243 // match: (EQ (FlagLT_ULT) yes no) 22244 // cond: 22245 // result: (First nil no yes) 22246 for { 22247 v := b.Control 22248 if v.Op != OpARMFlagLT_ULT { 22249 break 22250 } 22251 b.Kind = BlockFirst 22252 b.SetControl(nil) 22253 b.Aux = nil 22254 b.swapSuccessors() 22255 return true 22256 } 22257 // match: (EQ (FlagLT_UGT) yes no) 22258 // cond: 22259 // result: (First nil no yes) 22260 for { 22261 v := b.Control 22262 if v.Op != OpARMFlagLT_UGT { 22263 break 22264 } 22265 b.Kind = BlockFirst 22266 b.SetControl(nil) 22267 b.Aux = nil 22268 b.swapSuccessors() 22269 return true 22270 } 22271 // match: (EQ (FlagGT_ULT) yes no) 22272 // cond: 22273 // result: (First nil no yes) 22274 for { 22275 v := b.Control 22276 if v.Op != OpARMFlagGT_ULT { 22277 break 22278 } 22279 b.Kind = BlockFirst 22280 b.SetControl(nil) 22281 b.Aux = nil 22282 b.swapSuccessors() 22283 return true 22284 } 22285 // match: (EQ (FlagGT_UGT) yes no) 22286 // cond: 22287 // result: (First nil no yes) 22288 for { 22289 v := b.Control 22290 if v.Op != OpARMFlagGT_UGT { 22291 break 22292 } 22293 b.Kind = BlockFirst 22294 b.SetControl(nil) 22295 b.Aux = nil 22296 b.swapSuccessors() 22297 return true 22298 } 22299 // match: (EQ (InvertFlags cmp) yes no) 22300 // cond: 22301 // result: (EQ cmp yes no) 22302 for { 22303 v := b.Control 22304 if v.Op != OpARMInvertFlags { 22305 break 22306 } 22307 cmp := v.Args[0] 22308 b.Kind = BlockARMEQ 22309 b.SetControl(cmp) 22310 b.Aux = nil 22311 return true 22312 } 22313 // match: (EQ (CMPconst [0] l:(SUB x y)) yes no) 22314 // cond: l.Uses==1 22315 // result: (EQ (CMP x y) yes no) 22316 for { 22317 v := b.Control 22318 if v.Op != OpARMCMPconst { 22319 break 22320 } 22321 if v.AuxInt != 0 { 22322 break 22323 } 22324 l := v.Args[0] 22325 if l.Op != OpARMSUB { 22326 break 22327 } 22328 _ = l.Args[1] 22329 x := l.Args[0] 22330 y := l.Args[1] 22331 if !(l.Uses == 1) { 22332 break 22333 } 22334 b.Kind = BlockARMEQ 22335 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 22336 v0.AddArg(x) 22337 v0.AddArg(y) 22338 b.SetControl(v0) 22339 b.Aux = nil 22340 return true 22341 } 22342 // match: (EQ (CMPconst [0] l:(MULS x y a)) yes no) 22343 // cond: l.Uses==1 22344 // result: (EQ (CMP a (MUL <x.Type> x y)) yes no) 22345 for { 22346 v := b.Control 22347 if v.Op != OpARMCMPconst { 22348 break 22349 } 22350 if v.AuxInt != 0 { 22351 break 22352 } 22353 l := v.Args[0] 22354 if l.Op != OpARMMULS { 22355 break 22356 } 22357 _ = l.Args[2] 22358 x := l.Args[0] 22359 y := l.Args[1] 22360 a := l.Args[2] 22361 if !(l.Uses == 1) { 22362 break 22363 } 22364 b.Kind = BlockARMEQ 22365 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 22366 v0.AddArg(a) 22367 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 22368 v1.AddArg(x) 22369 v1.AddArg(y) 22370 v0.AddArg(v1) 22371 b.SetControl(v0) 22372 b.Aux = nil 22373 return true 22374 } 22375 // match: (EQ (CMPconst [0] l:(SUBconst [c] x)) yes no) 22376 // cond: l.Uses==1 22377 // result: (EQ (CMPconst [c] x) yes no) 22378 for { 22379 v := b.Control 22380 if v.Op != OpARMCMPconst { 22381 break 22382 } 22383 if v.AuxInt != 0 { 22384 break 22385 } 22386 l := v.Args[0] 22387 if l.Op != OpARMSUBconst { 22388 break 22389 } 22390 c := l.AuxInt 22391 x := l.Args[0] 22392 if !(l.Uses == 1) { 22393 break 22394 } 22395 b.Kind = BlockARMEQ 22396 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 22397 v0.AuxInt = c 22398 v0.AddArg(x) 22399 b.SetControl(v0) 22400 b.Aux = nil 22401 return true 22402 } 22403 // match: (EQ (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 22404 // cond: l.Uses==1 22405 // result: (EQ (CMPshiftLL x y [c]) yes no) 22406 for { 22407 v := b.Control 22408 if v.Op != OpARMCMPconst { 22409 break 22410 } 22411 if v.AuxInt != 0 { 22412 break 22413 } 22414 l := v.Args[0] 22415 if l.Op != OpARMSUBshiftLL { 22416 break 22417 } 22418 c := l.AuxInt 22419 _ = l.Args[1] 22420 x := l.Args[0] 22421 y := l.Args[1] 22422 if !(l.Uses == 1) { 22423 break 22424 } 22425 b.Kind = BlockARMEQ 22426 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 22427 v0.AuxInt = c 22428 v0.AddArg(x) 22429 v0.AddArg(y) 22430 b.SetControl(v0) 22431 b.Aux = nil 22432 return true 22433 } 22434 // match: (EQ (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 22435 // cond: l.Uses==1 22436 // result: (EQ (CMPshiftRL x y [c]) yes no) 22437 for { 22438 v := b.Control 22439 if v.Op != OpARMCMPconst { 22440 break 22441 } 22442 if v.AuxInt != 0 { 22443 break 22444 } 22445 l := v.Args[0] 22446 if l.Op != OpARMSUBshiftRL { 22447 break 22448 } 22449 c := l.AuxInt 22450 _ = l.Args[1] 22451 x := l.Args[0] 22452 y := l.Args[1] 22453 if !(l.Uses == 1) { 22454 break 22455 } 22456 b.Kind = BlockARMEQ 22457 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 22458 v0.AuxInt = c 22459 v0.AddArg(x) 22460 v0.AddArg(y) 22461 b.SetControl(v0) 22462 b.Aux = nil 22463 return true 22464 } 22465 // match: (EQ (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 22466 // cond: l.Uses==1 22467 // result: (EQ (CMPshiftRA x y [c]) yes no) 22468 for { 22469 v := b.Control 22470 if v.Op != OpARMCMPconst { 22471 break 22472 } 22473 if v.AuxInt != 0 { 22474 break 22475 } 22476 l := v.Args[0] 22477 if l.Op != OpARMSUBshiftRA { 22478 break 22479 } 22480 c := l.AuxInt 22481 _ = l.Args[1] 22482 x := l.Args[0] 22483 y := l.Args[1] 22484 if !(l.Uses == 1) { 22485 break 22486 } 22487 b.Kind = BlockARMEQ 22488 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 22489 v0.AuxInt = c 22490 v0.AddArg(x) 22491 v0.AddArg(y) 22492 b.SetControl(v0) 22493 b.Aux = nil 22494 return true 22495 } 22496 // match: (EQ (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 22497 // cond: l.Uses==1 22498 // result: (EQ (CMPshiftLLreg x y z) yes no) 22499 for { 22500 v := b.Control 22501 if v.Op != OpARMCMPconst { 22502 break 22503 } 22504 if v.AuxInt != 0 { 22505 break 22506 } 22507 l := v.Args[0] 22508 if l.Op != OpARMSUBshiftLLreg { 22509 break 22510 } 22511 _ = l.Args[2] 22512 x := l.Args[0] 22513 y := l.Args[1] 22514 z := l.Args[2] 22515 if !(l.Uses == 1) { 22516 break 22517 } 22518 b.Kind = BlockARMEQ 22519 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 22520 v0.AddArg(x) 22521 v0.AddArg(y) 22522 v0.AddArg(z) 22523 b.SetControl(v0) 22524 b.Aux = nil 22525 return true 22526 } 22527 // match: (EQ (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 22528 // cond: l.Uses==1 22529 // result: (EQ (CMPshiftRLreg x y z) yes no) 22530 for { 22531 v := b.Control 22532 if v.Op != OpARMCMPconst { 22533 break 22534 } 22535 if v.AuxInt != 0 { 22536 break 22537 } 22538 l := v.Args[0] 22539 if l.Op != OpARMSUBshiftRLreg { 22540 break 22541 } 22542 _ = l.Args[2] 22543 x := l.Args[0] 22544 y := l.Args[1] 22545 z := l.Args[2] 22546 if !(l.Uses == 1) { 22547 break 22548 } 22549 b.Kind = BlockARMEQ 22550 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 22551 v0.AddArg(x) 22552 v0.AddArg(y) 22553 v0.AddArg(z) 22554 b.SetControl(v0) 22555 b.Aux = nil 22556 return true 22557 } 22558 // match: (EQ (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 22559 // cond: l.Uses==1 22560 // result: (EQ (CMPshiftRAreg x y z) yes no) 22561 for { 22562 v := b.Control 22563 if v.Op != OpARMCMPconst { 22564 break 22565 } 22566 if v.AuxInt != 0 { 22567 break 22568 } 22569 l := v.Args[0] 22570 if l.Op != OpARMSUBshiftRAreg { 22571 break 22572 } 22573 _ = l.Args[2] 22574 x := l.Args[0] 22575 y := l.Args[1] 22576 z := l.Args[2] 22577 if !(l.Uses == 1) { 22578 break 22579 } 22580 b.Kind = BlockARMEQ 22581 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 22582 v0.AddArg(x) 22583 v0.AddArg(y) 22584 v0.AddArg(z) 22585 b.SetControl(v0) 22586 b.Aux = nil 22587 return true 22588 } 22589 // match: (EQ (CMPconst [0] l:(ADD x y)) yes no) 22590 // cond: l.Uses==1 22591 // result: (EQ (CMN x y) yes no) 22592 for { 22593 v := b.Control 22594 if v.Op != OpARMCMPconst { 22595 break 22596 } 22597 if v.AuxInt != 0 { 22598 break 22599 } 22600 l := v.Args[0] 22601 if l.Op != OpARMADD { 22602 break 22603 } 22604 _ = l.Args[1] 22605 x := l.Args[0] 22606 y := l.Args[1] 22607 if !(l.Uses == 1) { 22608 break 22609 } 22610 b.Kind = BlockARMEQ 22611 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 22612 v0.AddArg(x) 22613 v0.AddArg(y) 22614 b.SetControl(v0) 22615 b.Aux = nil 22616 return true 22617 } 22618 // match: (EQ (CMPconst [0] l:(MULA x y a)) yes no) 22619 // cond: l.Uses==1 22620 // result: (EQ (CMN a (MUL <x.Type> x y)) yes no) 22621 for { 22622 v := b.Control 22623 if v.Op != OpARMCMPconst { 22624 break 22625 } 22626 if v.AuxInt != 0 { 22627 break 22628 } 22629 l := v.Args[0] 22630 if l.Op != OpARMMULA { 22631 break 22632 } 22633 _ = l.Args[2] 22634 x := l.Args[0] 22635 y := l.Args[1] 22636 a := l.Args[2] 22637 if !(l.Uses == 1) { 22638 break 22639 } 22640 b.Kind = BlockARMEQ 22641 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 22642 v0.AddArg(a) 22643 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 22644 v1.AddArg(x) 22645 v1.AddArg(y) 22646 v0.AddArg(v1) 22647 b.SetControl(v0) 22648 b.Aux = nil 22649 return true 22650 } 22651 // match: (EQ (CMPconst [0] l:(ADDconst [c] x)) yes no) 22652 // cond: l.Uses==1 22653 // result: (EQ (CMNconst [c] x) yes no) 22654 for { 22655 v := b.Control 22656 if v.Op != OpARMCMPconst { 22657 break 22658 } 22659 if v.AuxInt != 0 { 22660 break 22661 } 22662 l := v.Args[0] 22663 if l.Op != OpARMADDconst { 22664 break 22665 } 22666 c := l.AuxInt 22667 x := l.Args[0] 22668 if !(l.Uses == 1) { 22669 break 22670 } 22671 b.Kind = BlockARMEQ 22672 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 22673 v0.AuxInt = c 22674 v0.AddArg(x) 22675 b.SetControl(v0) 22676 b.Aux = nil 22677 return true 22678 } 22679 // match: (EQ (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 22680 // cond: l.Uses==1 22681 // result: (EQ (CMNshiftLL x y [c]) yes no) 22682 for { 22683 v := b.Control 22684 if v.Op != OpARMCMPconst { 22685 break 22686 } 22687 if v.AuxInt != 0 { 22688 break 22689 } 22690 l := v.Args[0] 22691 if l.Op != OpARMADDshiftLL { 22692 break 22693 } 22694 c := l.AuxInt 22695 _ = l.Args[1] 22696 x := l.Args[0] 22697 y := l.Args[1] 22698 if !(l.Uses == 1) { 22699 break 22700 } 22701 b.Kind = BlockARMEQ 22702 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 22703 v0.AuxInt = c 22704 v0.AddArg(x) 22705 v0.AddArg(y) 22706 b.SetControl(v0) 22707 b.Aux = nil 22708 return true 22709 } 22710 // match: (EQ (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 22711 // cond: l.Uses==1 22712 // result: (EQ (CMNshiftRL x y [c]) yes no) 22713 for { 22714 v := b.Control 22715 if v.Op != OpARMCMPconst { 22716 break 22717 } 22718 if v.AuxInt != 0 { 22719 break 22720 } 22721 l := v.Args[0] 22722 if l.Op != OpARMADDshiftRL { 22723 break 22724 } 22725 c := l.AuxInt 22726 _ = l.Args[1] 22727 x := l.Args[0] 22728 y := l.Args[1] 22729 if !(l.Uses == 1) { 22730 break 22731 } 22732 b.Kind = BlockARMEQ 22733 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 22734 v0.AuxInt = c 22735 v0.AddArg(x) 22736 v0.AddArg(y) 22737 b.SetControl(v0) 22738 b.Aux = nil 22739 return true 22740 } 22741 // match: (EQ (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 22742 // cond: l.Uses==1 22743 // result: (EQ (CMNshiftRA x y [c]) yes no) 22744 for { 22745 v := b.Control 22746 if v.Op != OpARMCMPconst { 22747 break 22748 } 22749 if v.AuxInt != 0 { 22750 break 22751 } 22752 l := v.Args[0] 22753 if l.Op != OpARMADDshiftRA { 22754 break 22755 } 22756 c := l.AuxInt 22757 _ = l.Args[1] 22758 x := l.Args[0] 22759 y := l.Args[1] 22760 if !(l.Uses == 1) { 22761 break 22762 } 22763 b.Kind = BlockARMEQ 22764 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 22765 v0.AuxInt = c 22766 v0.AddArg(x) 22767 v0.AddArg(y) 22768 b.SetControl(v0) 22769 b.Aux = nil 22770 return true 22771 } 22772 // match: (EQ (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 22773 // cond: l.Uses==1 22774 // result: (EQ (CMNshiftLLreg x y z) yes no) 22775 for { 22776 v := b.Control 22777 if v.Op != OpARMCMPconst { 22778 break 22779 } 22780 if v.AuxInt != 0 { 22781 break 22782 } 22783 l := v.Args[0] 22784 if l.Op != OpARMADDshiftLLreg { 22785 break 22786 } 22787 _ = l.Args[2] 22788 x := l.Args[0] 22789 y := l.Args[1] 22790 z := l.Args[2] 22791 if !(l.Uses == 1) { 22792 break 22793 } 22794 b.Kind = BlockARMEQ 22795 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 22796 v0.AddArg(x) 22797 v0.AddArg(y) 22798 v0.AddArg(z) 22799 b.SetControl(v0) 22800 b.Aux = nil 22801 return true 22802 } 22803 // match: (EQ (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 22804 // cond: l.Uses==1 22805 // result: (EQ (CMNshiftRLreg x y z) yes no) 22806 for { 22807 v := b.Control 22808 if v.Op != OpARMCMPconst { 22809 break 22810 } 22811 if v.AuxInt != 0 { 22812 break 22813 } 22814 l := v.Args[0] 22815 if l.Op != OpARMADDshiftRLreg { 22816 break 22817 } 22818 _ = l.Args[2] 22819 x := l.Args[0] 22820 y := l.Args[1] 22821 z := l.Args[2] 22822 if !(l.Uses == 1) { 22823 break 22824 } 22825 b.Kind = BlockARMEQ 22826 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 22827 v0.AddArg(x) 22828 v0.AddArg(y) 22829 v0.AddArg(z) 22830 b.SetControl(v0) 22831 b.Aux = nil 22832 return true 22833 } 22834 // match: (EQ (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 22835 // cond: l.Uses==1 22836 // result: (EQ (CMNshiftRAreg x y z) yes no) 22837 for { 22838 v := b.Control 22839 if v.Op != OpARMCMPconst { 22840 break 22841 } 22842 if v.AuxInt != 0 { 22843 break 22844 } 22845 l := v.Args[0] 22846 if l.Op != OpARMADDshiftRAreg { 22847 break 22848 } 22849 _ = l.Args[2] 22850 x := l.Args[0] 22851 y := l.Args[1] 22852 z := l.Args[2] 22853 if !(l.Uses == 1) { 22854 break 22855 } 22856 b.Kind = BlockARMEQ 22857 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 22858 v0.AddArg(x) 22859 v0.AddArg(y) 22860 v0.AddArg(z) 22861 b.SetControl(v0) 22862 b.Aux = nil 22863 return true 22864 } 22865 // match: (EQ (CMPconst [0] l:(AND x y)) yes no) 22866 // cond: l.Uses==1 22867 // result: (EQ (TST x y) yes no) 22868 for { 22869 v := b.Control 22870 if v.Op != OpARMCMPconst { 22871 break 22872 } 22873 if v.AuxInt != 0 { 22874 break 22875 } 22876 l := v.Args[0] 22877 if l.Op != OpARMAND { 22878 break 22879 } 22880 _ = l.Args[1] 22881 x := l.Args[0] 22882 y := l.Args[1] 22883 if !(l.Uses == 1) { 22884 break 22885 } 22886 b.Kind = BlockARMEQ 22887 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 22888 v0.AddArg(x) 22889 v0.AddArg(y) 22890 b.SetControl(v0) 22891 b.Aux = nil 22892 return true 22893 } 22894 // match: (EQ (CMPconst [0] l:(ANDconst [c] x)) yes no) 22895 // cond: l.Uses==1 22896 // result: (EQ (TSTconst [c] x) yes no) 22897 for { 22898 v := b.Control 22899 if v.Op != OpARMCMPconst { 22900 break 22901 } 22902 if v.AuxInt != 0 { 22903 break 22904 } 22905 l := v.Args[0] 22906 if l.Op != OpARMANDconst { 22907 break 22908 } 22909 c := l.AuxInt 22910 x := l.Args[0] 22911 if !(l.Uses == 1) { 22912 break 22913 } 22914 b.Kind = BlockARMEQ 22915 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 22916 v0.AuxInt = c 22917 v0.AddArg(x) 22918 b.SetControl(v0) 22919 b.Aux = nil 22920 return true 22921 } 22922 // match: (EQ (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 22923 // cond: l.Uses==1 22924 // result: (EQ (TSTshiftLL x y [c]) yes no) 22925 for { 22926 v := b.Control 22927 if v.Op != OpARMCMPconst { 22928 break 22929 } 22930 if v.AuxInt != 0 { 22931 break 22932 } 22933 l := v.Args[0] 22934 if l.Op != OpARMANDshiftLL { 22935 break 22936 } 22937 c := l.AuxInt 22938 _ = l.Args[1] 22939 x := l.Args[0] 22940 y := l.Args[1] 22941 if !(l.Uses == 1) { 22942 break 22943 } 22944 b.Kind = BlockARMEQ 22945 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 22946 v0.AuxInt = c 22947 v0.AddArg(x) 22948 v0.AddArg(y) 22949 b.SetControl(v0) 22950 b.Aux = nil 22951 return true 22952 } 22953 // match: (EQ (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 22954 // cond: l.Uses==1 22955 // result: (EQ (TSTshiftRL x y [c]) yes no) 22956 for { 22957 v := b.Control 22958 if v.Op != OpARMCMPconst { 22959 break 22960 } 22961 if v.AuxInt != 0 { 22962 break 22963 } 22964 l := v.Args[0] 22965 if l.Op != OpARMANDshiftRL { 22966 break 22967 } 22968 c := l.AuxInt 22969 _ = l.Args[1] 22970 x := l.Args[0] 22971 y := l.Args[1] 22972 if !(l.Uses == 1) { 22973 break 22974 } 22975 b.Kind = BlockARMEQ 22976 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 22977 v0.AuxInt = c 22978 v0.AddArg(x) 22979 v0.AddArg(y) 22980 b.SetControl(v0) 22981 b.Aux = nil 22982 return true 22983 } 22984 // match: (EQ (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 22985 // cond: l.Uses==1 22986 // result: (EQ (TSTshiftRA x y [c]) yes no) 22987 for { 22988 v := b.Control 22989 if v.Op != OpARMCMPconst { 22990 break 22991 } 22992 if v.AuxInt != 0 { 22993 break 22994 } 22995 l := v.Args[0] 22996 if l.Op != OpARMANDshiftRA { 22997 break 22998 } 22999 c := l.AuxInt 23000 _ = l.Args[1] 23001 x := l.Args[0] 23002 y := l.Args[1] 23003 if !(l.Uses == 1) { 23004 break 23005 } 23006 b.Kind = BlockARMEQ 23007 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 23008 v0.AuxInt = c 23009 v0.AddArg(x) 23010 v0.AddArg(y) 23011 b.SetControl(v0) 23012 b.Aux = nil 23013 return true 23014 } 23015 // match: (EQ (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 23016 // cond: l.Uses==1 23017 // result: (EQ (TSTshiftLLreg x y z) yes no) 23018 for { 23019 v := b.Control 23020 if v.Op != OpARMCMPconst { 23021 break 23022 } 23023 if v.AuxInt != 0 { 23024 break 23025 } 23026 l := v.Args[0] 23027 if l.Op != OpARMANDshiftLLreg { 23028 break 23029 } 23030 _ = l.Args[2] 23031 x := l.Args[0] 23032 y := l.Args[1] 23033 z := l.Args[2] 23034 if !(l.Uses == 1) { 23035 break 23036 } 23037 b.Kind = BlockARMEQ 23038 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 23039 v0.AddArg(x) 23040 v0.AddArg(y) 23041 v0.AddArg(z) 23042 b.SetControl(v0) 23043 b.Aux = nil 23044 return true 23045 } 23046 // match: (EQ (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 23047 // cond: l.Uses==1 23048 // result: (EQ (TSTshiftRLreg x y z) yes no) 23049 for { 23050 v := b.Control 23051 if v.Op != OpARMCMPconst { 23052 break 23053 } 23054 if v.AuxInt != 0 { 23055 break 23056 } 23057 l := v.Args[0] 23058 if l.Op != OpARMANDshiftRLreg { 23059 break 23060 } 23061 _ = l.Args[2] 23062 x := l.Args[0] 23063 y := l.Args[1] 23064 z := l.Args[2] 23065 if !(l.Uses == 1) { 23066 break 23067 } 23068 b.Kind = BlockARMEQ 23069 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 23070 v0.AddArg(x) 23071 v0.AddArg(y) 23072 v0.AddArg(z) 23073 b.SetControl(v0) 23074 b.Aux = nil 23075 return true 23076 } 23077 // match: (EQ (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 23078 // cond: l.Uses==1 23079 // result: (EQ (TSTshiftRAreg x y z) yes no) 23080 for { 23081 v := b.Control 23082 if v.Op != OpARMCMPconst { 23083 break 23084 } 23085 if v.AuxInt != 0 { 23086 break 23087 } 23088 l := v.Args[0] 23089 if l.Op != OpARMANDshiftRAreg { 23090 break 23091 } 23092 _ = l.Args[2] 23093 x := l.Args[0] 23094 y := l.Args[1] 23095 z := l.Args[2] 23096 if !(l.Uses == 1) { 23097 break 23098 } 23099 b.Kind = BlockARMEQ 23100 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 23101 v0.AddArg(x) 23102 v0.AddArg(y) 23103 v0.AddArg(z) 23104 b.SetControl(v0) 23105 b.Aux = nil 23106 return true 23107 } 23108 // match: (EQ (CMPconst [0] l:(XOR x y)) yes no) 23109 // cond: l.Uses==1 23110 // result: (EQ (TEQ x y) yes no) 23111 for { 23112 v := b.Control 23113 if v.Op != OpARMCMPconst { 23114 break 23115 } 23116 if v.AuxInt != 0 { 23117 break 23118 } 23119 l := v.Args[0] 23120 if l.Op != OpARMXOR { 23121 break 23122 } 23123 _ = l.Args[1] 23124 x := l.Args[0] 23125 y := l.Args[1] 23126 if !(l.Uses == 1) { 23127 break 23128 } 23129 b.Kind = BlockARMEQ 23130 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 23131 v0.AddArg(x) 23132 v0.AddArg(y) 23133 b.SetControl(v0) 23134 b.Aux = nil 23135 return true 23136 } 23137 // match: (EQ (CMPconst [0] l:(XORconst [c] x)) yes no) 23138 // cond: l.Uses==1 23139 // result: (EQ (TEQconst [c] x) yes no) 23140 for { 23141 v := b.Control 23142 if v.Op != OpARMCMPconst { 23143 break 23144 } 23145 if v.AuxInt != 0 { 23146 break 23147 } 23148 l := v.Args[0] 23149 if l.Op != OpARMXORconst { 23150 break 23151 } 23152 c := l.AuxInt 23153 x := l.Args[0] 23154 if !(l.Uses == 1) { 23155 break 23156 } 23157 b.Kind = BlockARMEQ 23158 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 23159 v0.AuxInt = c 23160 v0.AddArg(x) 23161 b.SetControl(v0) 23162 b.Aux = nil 23163 return true 23164 } 23165 // match: (EQ (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 23166 // cond: l.Uses==1 23167 // result: (EQ (TEQshiftLL x y [c]) yes no) 23168 for { 23169 v := b.Control 23170 if v.Op != OpARMCMPconst { 23171 break 23172 } 23173 if v.AuxInt != 0 { 23174 break 23175 } 23176 l := v.Args[0] 23177 if l.Op != OpARMXORshiftLL { 23178 break 23179 } 23180 c := l.AuxInt 23181 _ = l.Args[1] 23182 x := l.Args[0] 23183 y := l.Args[1] 23184 if !(l.Uses == 1) { 23185 break 23186 } 23187 b.Kind = BlockARMEQ 23188 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 23189 v0.AuxInt = c 23190 v0.AddArg(x) 23191 v0.AddArg(y) 23192 b.SetControl(v0) 23193 b.Aux = nil 23194 return true 23195 } 23196 // match: (EQ (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 23197 // cond: l.Uses==1 23198 // result: (EQ (TEQshiftRL x y [c]) yes no) 23199 for { 23200 v := b.Control 23201 if v.Op != OpARMCMPconst { 23202 break 23203 } 23204 if v.AuxInt != 0 { 23205 break 23206 } 23207 l := v.Args[0] 23208 if l.Op != OpARMXORshiftRL { 23209 break 23210 } 23211 c := l.AuxInt 23212 _ = l.Args[1] 23213 x := l.Args[0] 23214 y := l.Args[1] 23215 if !(l.Uses == 1) { 23216 break 23217 } 23218 b.Kind = BlockARMEQ 23219 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 23220 v0.AuxInt = c 23221 v0.AddArg(x) 23222 v0.AddArg(y) 23223 b.SetControl(v0) 23224 b.Aux = nil 23225 return true 23226 } 23227 // match: (EQ (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 23228 // cond: l.Uses==1 23229 // result: (EQ (TEQshiftRA x y [c]) yes no) 23230 for { 23231 v := b.Control 23232 if v.Op != OpARMCMPconst { 23233 break 23234 } 23235 if v.AuxInt != 0 { 23236 break 23237 } 23238 l := v.Args[0] 23239 if l.Op != OpARMXORshiftRA { 23240 break 23241 } 23242 c := l.AuxInt 23243 _ = l.Args[1] 23244 x := l.Args[0] 23245 y := l.Args[1] 23246 if !(l.Uses == 1) { 23247 break 23248 } 23249 b.Kind = BlockARMEQ 23250 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 23251 v0.AuxInt = c 23252 v0.AddArg(x) 23253 v0.AddArg(y) 23254 b.SetControl(v0) 23255 b.Aux = nil 23256 return true 23257 } 23258 // match: (EQ (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 23259 // cond: l.Uses==1 23260 // result: (EQ (TEQshiftLLreg x y z) yes no) 23261 for { 23262 v := b.Control 23263 if v.Op != OpARMCMPconst { 23264 break 23265 } 23266 if v.AuxInt != 0 { 23267 break 23268 } 23269 l := v.Args[0] 23270 if l.Op != OpARMXORshiftLLreg { 23271 break 23272 } 23273 _ = l.Args[2] 23274 x := l.Args[0] 23275 y := l.Args[1] 23276 z := l.Args[2] 23277 if !(l.Uses == 1) { 23278 break 23279 } 23280 b.Kind = BlockARMEQ 23281 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 23282 v0.AddArg(x) 23283 v0.AddArg(y) 23284 v0.AddArg(z) 23285 b.SetControl(v0) 23286 b.Aux = nil 23287 return true 23288 } 23289 // match: (EQ (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 23290 // cond: l.Uses==1 23291 // result: (EQ (TEQshiftRLreg x y z) yes no) 23292 for { 23293 v := b.Control 23294 if v.Op != OpARMCMPconst { 23295 break 23296 } 23297 if v.AuxInt != 0 { 23298 break 23299 } 23300 l := v.Args[0] 23301 if l.Op != OpARMXORshiftRLreg { 23302 break 23303 } 23304 _ = l.Args[2] 23305 x := l.Args[0] 23306 y := l.Args[1] 23307 z := l.Args[2] 23308 if !(l.Uses == 1) { 23309 break 23310 } 23311 b.Kind = BlockARMEQ 23312 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 23313 v0.AddArg(x) 23314 v0.AddArg(y) 23315 v0.AddArg(z) 23316 b.SetControl(v0) 23317 b.Aux = nil 23318 return true 23319 } 23320 // match: (EQ (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 23321 // cond: l.Uses==1 23322 // result: (EQ (TEQshiftRAreg x y z) yes no) 23323 for { 23324 v := b.Control 23325 if v.Op != OpARMCMPconst { 23326 break 23327 } 23328 if v.AuxInt != 0 { 23329 break 23330 } 23331 l := v.Args[0] 23332 if l.Op != OpARMXORshiftRAreg { 23333 break 23334 } 23335 _ = l.Args[2] 23336 x := l.Args[0] 23337 y := l.Args[1] 23338 z := l.Args[2] 23339 if !(l.Uses == 1) { 23340 break 23341 } 23342 b.Kind = BlockARMEQ 23343 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 23344 v0.AddArg(x) 23345 v0.AddArg(y) 23346 v0.AddArg(z) 23347 b.SetControl(v0) 23348 b.Aux = nil 23349 return true 23350 } 23351 case BlockARMGE: 23352 // match: (GE (FlagEQ) yes no) 23353 // cond: 23354 // result: (First nil yes no) 23355 for { 23356 v := b.Control 23357 if v.Op != OpARMFlagEQ { 23358 break 23359 } 23360 b.Kind = BlockFirst 23361 b.SetControl(nil) 23362 b.Aux = nil 23363 return true 23364 } 23365 // match: (GE (FlagLT_ULT) yes no) 23366 // cond: 23367 // result: (First nil no yes) 23368 for { 23369 v := b.Control 23370 if v.Op != OpARMFlagLT_ULT { 23371 break 23372 } 23373 b.Kind = BlockFirst 23374 b.SetControl(nil) 23375 b.Aux = nil 23376 b.swapSuccessors() 23377 return true 23378 } 23379 // match: (GE (FlagLT_UGT) yes no) 23380 // cond: 23381 // result: (First nil no yes) 23382 for { 23383 v := b.Control 23384 if v.Op != OpARMFlagLT_UGT { 23385 break 23386 } 23387 b.Kind = BlockFirst 23388 b.SetControl(nil) 23389 b.Aux = nil 23390 b.swapSuccessors() 23391 return true 23392 } 23393 // match: (GE (FlagGT_ULT) yes no) 23394 // cond: 23395 // result: (First nil yes no) 23396 for { 23397 v := b.Control 23398 if v.Op != OpARMFlagGT_ULT { 23399 break 23400 } 23401 b.Kind = BlockFirst 23402 b.SetControl(nil) 23403 b.Aux = nil 23404 return true 23405 } 23406 // match: (GE (FlagGT_UGT) yes no) 23407 // cond: 23408 // result: (First nil yes no) 23409 for { 23410 v := b.Control 23411 if v.Op != OpARMFlagGT_UGT { 23412 break 23413 } 23414 b.Kind = BlockFirst 23415 b.SetControl(nil) 23416 b.Aux = nil 23417 return true 23418 } 23419 // match: (GE (InvertFlags cmp) yes no) 23420 // cond: 23421 // result: (LE cmp yes no) 23422 for { 23423 v := b.Control 23424 if v.Op != OpARMInvertFlags { 23425 break 23426 } 23427 cmp := v.Args[0] 23428 b.Kind = BlockARMLE 23429 b.SetControl(cmp) 23430 b.Aux = nil 23431 return true 23432 } 23433 // match: (GE (CMPconst [0] l:(SUB x y)) yes no) 23434 // cond: l.Uses==1 23435 // result: (GE (CMP x y) yes no) 23436 for { 23437 v := b.Control 23438 if v.Op != OpARMCMPconst { 23439 break 23440 } 23441 if v.AuxInt != 0 { 23442 break 23443 } 23444 l := v.Args[0] 23445 if l.Op != OpARMSUB { 23446 break 23447 } 23448 _ = l.Args[1] 23449 x := l.Args[0] 23450 y := l.Args[1] 23451 if !(l.Uses == 1) { 23452 break 23453 } 23454 b.Kind = BlockARMGE 23455 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 23456 v0.AddArg(x) 23457 v0.AddArg(y) 23458 b.SetControl(v0) 23459 b.Aux = nil 23460 return true 23461 } 23462 // match: (GE (CMPconst [0] l:(MULS x y a)) yes no) 23463 // cond: l.Uses==1 23464 // result: (GE (CMP a (MUL <x.Type> x y)) yes no) 23465 for { 23466 v := b.Control 23467 if v.Op != OpARMCMPconst { 23468 break 23469 } 23470 if v.AuxInt != 0 { 23471 break 23472 } 23473 l := v.Args[0] 23474 if l.Op != OpARMMULS { 23475 break 23476 } 23477 _ = l.Args[2] 23478 x := l.Args[0] 23479 y := l.Args[1] 23480 a := l.Args[2] 23481 if !(l.Uses == 1) { 23482 break 23483 } 23484 b.Kind = BlockARMGE 23485 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 23486 v0.AddArg(a) 23487 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 23488 v1.AddArg(x) 23489 v1.AddArg(y) 23490 v0.AddArg(v1) 23491 b.SetControl(v0) 23492 b.Aux = nil 23493 return true 23494 } 23495 // match: (GE (CMPconst [0] l:(SUBconst [c] x)) yes no) 23496 // cond: l.Uses==1 23497 // result: (GE (CMPconst [c] x) yes no) 23498 for { 23499 v := b.Control 23500 if v.Op != OpARMCMPconst { 23501 break 23502 } 23503 if v.AuxInt != 0 { 23504 break 23505 } 23506 l := v.Args[0] 23507 if l.Op != OpARMSUBconst { 23508 break 23509 } 23510 c := l.AuxInt 23511 x := l.Args[0] 23512 if !(l.Uses == 1) { 23513 break 23514 } 23515 b.Kind = BlockARMGE 23516 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 23517 v0.AuxInt = c 23518 v0.AddArg(x) 23519 b.SetControl(v0) 23520 b.Aux = nil 23521 return true 23522 } 23523 // match: (GE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 23524 // cond: l.Uses==1 23525 // result: (GE (CMPshiftLL x y [c]) yes no) 23526 for { 23527 v := b.Control 23528 if v.Op != OpARMCMPconst { 23529 break 23530 } 23531 if v.AuxInt != 0 { 23532 break 23533 } 23534 l := v.Args[0] 23535 if l.Op != OpARMSUBshiftLL { 23536 break 23537 } 23538 c := l.AuxInt 23539 _ = l.Args[1] 23540 x := l.Args[0] 23541 y := l.Args[1] 23542 if !(l.Uses == 1) { 23543 break 23544 } 23545 b.Kind = BlockARMGE 23546 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 23547 v0.AuxInt = c 23548 v0.AddArg(x) 23549 v0.AddArg(y) 23550 b.SetControl(v0) 23551 b.Aux = nil 23552 return true 23553 } 23554 // match: (GE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 23555 // cond: l.Uses==1 23556 // result: (GE (CMPshiftRL x y [c]) yes no) 23557 for { 23558 v := b.Control 23559 if v.Op != OpARMCMPconst { 23560 break 23561 } 23562 if v.AuxInt != 0 { 23563 break 23564 } 23565 l := v.Args[0] 23566 if l.Op != OpARMSUBshiftRL { 23567 break 23568 } 23569 c := l.AuxInt 23570 _ = l.Args[1] 23571 x := l.Args[0] 23572 y := l.Args[1] 23573 if !(l.Uses == 1) { 23574 break 23575 } 23576 b.Kind = BlockARMGE 23577 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 23578 v0.AuxInt = c 23579 v0.AddArg(x) 23580 v0.AddArg(y) 23581 b.SetControl(v0) 23582 b.Aux = nil 23583 return true 23584 } 23585 // match: (GE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 23586 // cond: l.Uses==1 23587 // result: (GE (CMPshiftRA x y [c]) 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 l := v.Args[0] 23597 if l.Op != OpARMSUBshiftRA { 23598 break 23599 } 23600 c := l.AuxInt 23601 _ = l.Args[1] 23602 x := l.Args[0] 23603 y := l.Args[1] 23604 if !(l.Uses == 1) { 23605 break 23606 } 23607 b.Kind = BlockARMGE 23608 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 23609 v0.AuxInt = c 23610 v0.AddArg(x) 23611 v0.AddArg(y) 23612 b.SetControl(v0) 23613 b.Aux = nil 23614 return true 23615 } 23616 // match: (GE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 23617 // cond: l.Uses==1 23618 // result: (GE (CMPshiftLLreg x y z) yes no) 23619 for { 23620 v := b.Control 23621 if v.Op != OpARMCMPconst { 23622 break 23623 } 23624 if v.AuxInt != 0 { 23625 break 23626 } 23627 l := v.Args[0] 23628 if l.Op != OpARMSUBshiftLLreg { 23629 break 23630 } 23631 _ = l.Args[2] 23632 x := l.Args[0] 23633 y := l.Args[1] 23634 z := l.Args[2] 23635 if !(l.Uses == 1) { 23636 break 23637 } 23638 b.Kind = BlockARMGE 23639 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 23640 v0.AddArg(x) 23641 v0.AddArg(y) 23642 v0.AddArg(z) 23643 b.SetControl(v0) 23644 b.Aux = nil 23645 return true 23646 } 23647 // match: (GE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 23648 // cond: l.Uses==1 23649 // result: (GE (CMPshiftRLreg x y z) yes no) 23650 for { 23651 v := b.Control 23652 if v.Op != OpARMCMPconst { 23653 break 23654 } 23655 if v.AuxInt != 0 { 23656 break 23657 } 23658 l := v.Args[0] 23659 if l.Op != OpARMSUBshiftRLreg { 23660 break 23661 } 23662 _ = l.Args[2] 23663 x := l.Args[0] 23664 y := l.Args[1] 23665 z := l.Args[2] 23666 if !(l.Uses == 1) { 23667 break 23668 } 23669 b.Kind = BlockARMGE 23670 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 23671 v0.AddArg(x) 23672 v0.AddArg(y) 23673 v0.AddArg(z) 23674 b.SetControl(v0) 23675 b.Aux = nil 23676 return true 23677 } 23678 // match: (GE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 23679 // cond: l.Uses==1 23680 // result: (GE (CMPshiftRAreg x y z) yes no) 23681 for { 23682 v := b.Control 23683 if v.Op != OpARMCMPconst { 23684 break 23685 } 23686 if v.AuxInt != 0 { 23687 break 23688 } 23689 l := v.Args[0] 23690 if l.Op != OpARMSUBshiftRAreg { 23691 break 23692 } 23693 _ = l.Args[2] 23694 x := l.Args[0] 23695 y := l.Args[1] 23696 z := l.Args[2] 23697 if !(l.Uses == 1) { 23698 break 23699 } 23700 b.Kind = BlockARMGE 23701 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 23702 v0.AddArg(x) 23703 v0.AddArg(y) 23704 v0.AddArg(z) 23705 b.SetControl(v0) 23706 b.Aux = nil 23707 return true 23708 } 23709 // match: (GE (CMPconst [0] l:(ADD x y)) yes no) 23710 // cond: l.Uses==1 23711 // result: (GE (CMN x y) yes no) 23712 for { 23713 v := b.Control 23714 if v.Op != OpARMCMPconst { 23715 break 23716 } 23717 if v.AuxInt != 0 { 23718 break 23719 } 23720 l := v.Args[0] 23721 if l.Op != OpARMADD { 23722 break 23723 } 23724 _ = l.Args[1] 23725 x := l.Args[0] 23726 y := l.Args[1] 23727 if !(l.Uses == 1) { 23728 break 23729 } 23730 b.Kind = BlockARMGE 23731 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 23732 v0.AddArg(x) 23733 v0.AddArg(y) 23734 b.SetControl(v0) 23735 b.Aux = nil 23736 return true 23737 } 23738 // match: (GE (CMPconst [0] l:(MULA x y a)) yes no) 23739 // cond: l.Uses==1 23740 // result: (GE (CMN a (MUL <x.Type> x y)) yes no) 23741 for { 23742 v := b.Control 23743 if v.Op != OpARMCMPconst { 23744 break 23745 } 23746 if v.AuxInt != 0 { 23747 break 23748 } 23749 l := v.Args[0] 23750 if l.Op != OpARMMULA { 23751 break 23752 } 23753 _ = l.Args[2] 23754 x := l.Args[0] 23755 y := l.Args[1] 23756 a := l.Args[2] 23757 if !(l.Uses == 1) { 23758 break 23759 } 23760 b.Kind = BlockARMGE 23761 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 23762 v0.AddArg(a) 23763 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 23764 v1.AddArg(x) 23765 v1.AddArg(y) 23766 v0.AddArg(v1) 23767 b.SetControl(v0) 23768 b.Aux = nil 23769 return true 23770 } 23771 // match: (GE (CMPconst [0] l:(ADDconst [c] x)) yes no) 23772 // cond: l.Uses==1 23773 // result: (GE (CMNconst [c] x) yes no) 23774 for { 23775 v := b.Control 23776 if v.Op != OpARMCMPconst { 23777 break 23778 } 23779 if v.AuxInt != 0 { 23780 break 23781 } 23782 l := v.Args[0] 23783 if l.Op != OpARMADDconst { 23784 break 23785 } 23786 c := l.AuxInt 23787 x := l.Args[0] 23788 if !(l.Uses == 1) { 23789 break 23790 } 23791 b.Kind = BlockARMGE 23792 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 23793 v0.AuxInt = c 23794 v0.AddArg(x) 23795 b.SetControl(v0) 23796 b.Aux = nil 23797 return true 23798 } 23799 // match: (GE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 23800 // cond: l.Uses==1 23801 // result: (GE (CMNshiftLL x y [c]) yes no) 23802 for { 23803 v := b.Control 23804 if v.Op != OpARMCMPconst { 23805 break 23806 } 23807 if v.AuxInt != 0 { 23808 break 23809 } 23810 l := v.Args[0] 23811 if l.Op != OpARMADDshiftLL { 23812 break 23813 } 23814 c := l.AuxInt 23815 _ = l.Args[1] 23816 x := l.Args[0] 23817 y := l.Args[1] 23818 if !(l.Uses == 1) { 23819 break 23820 } 23821 b.Kind = BlockARMGE 23822 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 23823 v0.AuxInt = c 23824 v0.AddArg(x) 23825 v0.AddArg(y) 23826 b.SetControl(v0) 23827 b.Aux = nil 23828 return true 23829 } 23830 // match: (GE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 23831 // cond: l.Uses==1 23832 // result: (GE (CMNshiftRL x y [c]) yes no) 23833 for { 23834 v := b.Control 23835 if v.Op != OpARMCMPconst { 23836 break 23837 } 23838 if v.AuxInt != 0 { 23839 break 23840 } 23841 l := v.Args[0] 23842 if l.Op != OpARMADDshiftRL { 23843 break 23844 } 23845 c := l.AuxInt 23846 _ = l.Args[1] 23847 x := l.Args[0] 23848 y := l.Args[1] 23849 if !(l.Uses == 1) { 23850 break 23851 } 23852 b.Kind = BlockARMGE 23853 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 23854 v0.AuxInt = c 23855 v0.AddArg(x) 23856 v0.AddArg(y) 23857 b.SetControl(v0) 23858 b.Aux = nil 23859 return true 23860 } 23861 // match: (GE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 23862 // cond: l.Uses==1 23863 // result: (GE (CMNshiftRA x y [c]) yes no) 23864 for { 23865 v := b.Control 23866 if v.Op != OpARMCMPconst { 23867 break 23868 } 23869 if v.AuxInt != 0 { 23870 break 23871 } 23872 l := v.Args[0] 23873 if l.Op != OpARMADDshiftRA { 23874 break 23875 } 23876 c := l.AuxInt 23877 _ = l.Args[1] 23878 x := l.Args[0] 23879 y := l.Args[1] 23880 if !(l.Uses == 1) { 23881 break 23882 } 23883 b.Kind = BlockARMGE 23884 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 23885 v0.AuxInt = c 23886 v0.AddArg(x) 23887 v0.AddArg(y) 23888 b.SetControl(v0) 23889 b.Aux = nil 23890 return true 23891 } 23892 // match: (GE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 23893 // cond: l.Uses==1 23894 // result: (GE (CMNshiftLLreg x y z) yes no) 23895 for { 23896 v := b.Control 23897 if v.Op != OpARMCMPconst { 23898 break 23899 } 23900 if v.AuxInt != 0 { 23901 break 23902 } 23903 l := v.Args[0] 23904 if l.Op != OpARMADDshiftLLreg { 23905 break 23906 } 23907 _ = l.Args[2] 23908 x := l.Args[0] 23909 y := l.Args[1] 23910 z := l.Args[2] 23911 if !(l.Uses == 1) { 23912 break 23913 } 23914 b.Kind = BlockARMGE 23915 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 23916 v0.AddArg(x) 23917 v0.AddArg(y) 23918 v0.AddArg(z) 23919 b.SetControl(v0) 23920 b.Aux = nil 23921 return true 23922 } 23923 // match: (GE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 23924 // cond: l.Uses==1 23925 // result: (GE (CMNshiftRLreg x y z) yes no) 23926 for { 23927 v := b.Control 23928 if v.Op != OpARMCMPconst { 23929 break 23930 } 23931 if v.AuxInt != 0 { 23932 break 23933 } 23934 l := v.Args[0] 23935 if l.Op != OpARMADDshiftRLreg { 23936 break 23937 } 23938 _ = l.Args[2] 23939 x := l.Args[0] 23940 y := l.Args[1] 23941 z := l.Args[2] 23942 if !(l.Uses == 1) { 23943 break 23944 } 23945 b.Kind = BlockARMGE 23946 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 23947 v0.AddArg(x) 23948 v0.AddArg(y) 23949 v0.AddArg(z) 23950 b.SetControl(v0) 23951 b.Aux = nil 23952 return true 23953 } 23954 // match: (GE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 23955 // cond: l.Uses==1 23956 // result: (GE (CMNshiftRAreg x y z) yes no) 23957 for { 23958 v := b.Control 23959 if v.Op != OpARMCMPconst { 23960 break 23961 } 23962 if v.AuxInt != 0 { 23963 break 23964 } 23965 l := v.Args[0] 23966 if l.Op != OpARMADDshiftRAreg { 23967 break 23968 } 23969 _ = l.Args[2] 23970 x := l.Args[0] 23971 y := l.Args[1] 23972 z := l.Args[2] 23973 if !(l.Uses == 1) { 23974 break 23975 } 23976 b.Kind = BlockARMGE 23977 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 23978 v0.AddArg(x) 23979 v0.AddArg(y) 23980 v0.AddArg(z) 23981 b.SetControl(v0) 23982 b.Aux = nil 23983 return true 23984 } 23985 // match: (GE (CMPconst [0] l:(AND x y)) yes no) 23986 // cond: l.Uses==1 23987 // result: (GE (TST x y) yes no) 23988 for { 23989 v := b.Control 23990 if v.Op != OpARMCMPconst { 23991 break 23992 } 23993 if v.AuxInt != 0 { 23994 break 23995 } 23996 l := v.Args[0] 23997 if l.Op != OpARMAND { 23998 break 23999 } 24000 _ = l.Args[1] 24001 x := l.Args[0] 24002 y := l.Args[1] 24003 if !(l.Uses == 1) { 24004 break 24005 } 24006 b.Kind = BlockARMGE 24007 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 24008 v0.AddArg(x) 24009 v0.AddArg(y) 24010 b.SetControl(v0) 24011 b.Aux = nil 24012 return true 24013 } 24014 // match: (GE (CMPconst [0] l:(ANDconst [c] x)) yes no) 24015 // cond: l.Uses==1 24016 // result: (GE (TSTconst [c] x) yes no) 24017 for { 24018 v := b.Control 24019 if v.Op != OpARMCMPconst { 24020 break 24021 } 24022 if v.AuxInt != 0 { 24023 break 24024 } 24025 l := v.Args[0] 24026 if l.Op != OpARMANDconst { 24027 break 24028 } 24029 c := l.AuxInt 24030 x := l.Args[0] 24031 if !(l.Uses == 1) { 24032 break 24033 } 24034 b.Kind = BlockARMGE 24035 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 24036 v0.AuxInt = c 24037 v0.AddArg(x) 24038 b.SetControl(v0) 24039 b.Aux = nil 24040 return true 24041 } 24042 // match: (GE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 24043 // cond: l.Uses==1 24044 // result: (GE (TSTshiftLL x y [c]) yes no) 24045 for { 24046 v := b.Control 24047 if v.Op != OpARMCMPconst { 24048 break 24049 } 24050 if v.AuxInt != 0 { 24051 break 24052 } 24053 l := v.Args[0] 24054 if l.Op != OpARMANDshiftLL { 24055 break 24056 } 24057 c := l.AuxInt 24058 _ = l.Args[1] 24059 x := l.Args[0] 24060 y := l.Args[1] 24061 if !(l.Uses == 1) { 24062 break 24063 } 24064 b.Kind = BlockARMGE 24065 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 24066 v0.AuxInt = c 24067 v0.AddArg(x) 24068 v0.AddArg(y) 24069 b.SetControl(v0) 24070 b.Aux = nil 24071 return true 24072 } 24073 // match: (GE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 24074 // cond: l.Uses==1 24075 // result: (GE (TSTshiftRL x y [c]) yes no) 24076 for { 24077 v := b.Control 24078 if v.Op != OpARMCMPconst { 24079 break 24080 } 24081 if v.AuxInt != 0 { 24082 break 24083 } 24084 l := v.Args[0] 24085 if l.Op != OpARMANDshiftRL { 24086 break 24087 } 24088 c := l.AuxInt 24089 _ = l.Args[1] 24090 x := l.Args[0] 24091 y := l.Args[1] 24092 if !(l.Uses == 1) { 24093 break 24094 } 24095 b.Kind = BlockARMGE 24096 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 24097 v0.AuxInt = c 24098 v0.AddArg(x) 24099 v0.AddArg(y) 24100 b.SetControl(v0) 24101 b.Aux = nil 24102 return true 24103 } 24104 // match: (GE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 24105 // cond: l.Uses==1 24106 // result: (GE (TSTshiftRA x y [c]) yes no) 24107 for { 24108 v := b.Control 24109 if v.Op != OpARMCMPconst { 24110 break 24111 } 24112 if v.AuxInt != 0 { 24113 break 24114 } 24115 l := v.Args[0] 24116 if l.Op != OpARMANDshiftRA { 24117 break 24118 } 24119 c := l.AuxInt 24120 _ = l.Args[1] 24121 x := l.Args[0] 24122 y := l.Args[1] 24123 if !(l.Uses == 1) { 24124 break 24125 } 24126 b.Kind = BlockARMGE 24127 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 24128 v0.AuxInt = c 24129 v0.AddArg(x) 24130 v0.AddArg(y) 24131 b.SetControl(v0) 24132 b.Aux = nil 24133 return true 24134 } 24135 // match: (GE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 24136 // cond: l.Uses==1 24137 // result: (GE (TSTshiftLLreg x y z) yes no) 24138 for { 24139 v := b.Control 24140 if v.Op != OpARMCMPconst { 24141 break 24142 } 24143 if v.AuxInt != 0 { 24144 break 24145 } 24146 l := v.Args[0] 24147 if l.Op != OpARMANDshiftLLreg { 24148 break 24149 } 24150 _ = l.Args[2] 24151 x := l.Args[0] 24152 y := l.Args[1] 24153 z := l.Args[2] 24154 if !(l.Uses == 1) { 24155 break 24156 } 24157 b.Kind = BlockARMGE 24158 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 24159 v0.AddArg(x) 24160 v0.AddArg(y) 24161 v0.AddArg(z) 24162 b.SetControl(v0) 24163 b.Aux = nil 24164 return true 24165 } 24166 // match: (GE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 24167 // cond: l.Uses==1 24168 // result: (GE (TSTshiftRLreg 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 l := v.Args[0] 24178 if l.Op != OpARMANDshiftRLreg { 24179 break 24180 } 24181 _ = l.Args[2] 24182 x := l.Args[0] 24183 y := l.Args[1] 24184 z := l.Args[2] 24185 if !(l.Uses == 1) { 24186 break 24187 } 24188 b.Kind = BlockARMGE 24189 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 24190 v0.AddArg(x) 24191 v0.AddArg(y) 24192 v0.AddArg(z) 24193 b.SetControl(v0) 24194 b.Aux = nil 24195 return true 24196 } 24197 // match: (GE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 24198 // cond: l.Uses==1 24199 // result: (GE (TSTshiftRAreg x y z) yes no) 24200 for { 24201 v := b.Control 24202 if v.Op != OpARMCMPconst { 24203 break 24204 } 24205 if v.AuxInt != 0 { 24206 break 24207 } 24208 l := v.Args[0] 24209 if l.Op != OpARMANDshiftRAreg { 24210 break 24211 } 24212 _ = l.Args[2] 24213 x := l.Args[0] 24214 y := l.Args[1] 24215 z := l.Args[2] 24216 if !(l.Uses == 1) { 24217 break 24218 } 24219 b.Kind = BlockARMGE 24220 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 24221 v0.AddArg(x) 24222 v0.AddArg(y) 24223 v0.AddArg(z) 24224 b.SetControl(v0) 24225 b.Aux = nil 24226 return true 24227 } 24228 // match: (GE (CMPconst [0] l:(XOR x y)) yes no) 24229 // cond: l.Uses==1 24230 // result: (GE (TEQ x y) yes no) 24231 for { 24232 v := b.Control 24233 if v.Op != OpARMCMPconst { 24234 break 24235 } 24236 if v.AuxInt != 0 { 24237 break 24238 } 24239 l := v.Args[0] 24240 if l.Op != OpARMXOR { 24241 break 24242 } 24243 _ = l.Args[1] 24244 x := l.Args[0] 24245 y := l.Args[1] 24246 if !(l.Uses == 1) { 24247 break 24248 } 24249 b.Kind = BlockARMGE 24250 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 24251 v0.AddArg(x) 24252 v0.AddArg(y) 24253 b.SetControl(v0) 24254 b.Aux = nil 24255 return true 24256 } 24257 // match: (GE (CMPconst [0] l:(XORconst [c] x)) yes no) 24258 // cond: l.Uses==1 24259 // result: (GE (TEQconst [c] x) yes no) 24260 for { 24261 v := b.Control 24262 if v.Op != OpARMCMPconst { 24263 break 24264 } 24265 if v.AuxInt != 0 { 24266 break 24267 } 24268 l := v.Args[0] 24269 if l.Op != OpARMXORconst { 24270 break 24271 } 24272 c := l.AuxInt 24273 x := l.Args[0] 24274 if !(l.Uses == 1) { 24275 break 24276 } 24277 b.Kind = BlockARMGE 24278 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 24279 v0.AuxInt = c 24280 v0.AddArg(x) 24281 b.SetControl(v0) 24282 b.Aux = nil 24283 return true 24284 } 24285 // match: (GE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 24286 // cond: l.Uses==1 24287 // result: (GE (TEQshiftLL x y [c]) yes no) 24288 for { 24289 v := b.Control 24290 if v.Op != OpARMCMPconst { 24291 break 24292 } 24293 if v.AuxInt != 0 { 24294 break 24295 } 24296 l := v.Args[0] 24297 if l.Op != OpARMXORshiftLL { 24298 break 24299 } 24300 c := l.AuxInt 24301 _ = l.Args[1] 24302 x := l.Args[0] 24303 y := l.Args[1] 24304 if !(l.Uses == 1) { 24305 break 24306 } 24307 b.Kind = BlockARMGE 24308 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 24309 v0.AuxInt = c 24310 v0.AddArg(x) 24311 v0.AddArg(y) 24312 b.SetControl(v0) 24313 b.Aux = nil 24314 return true 24315 } 24316 // match: (GE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 24317 // cond: l.Uses==1 24318 // result: (GE (TEQshiftRL x y [c]) yes no) 24319 for { 24320 v := b.Control 24321 if v.Op != OpARMCMPconst { 24322 break 24323 } 24324 if v.AuxInt != 0 { 24325 break 24326 } 24327 l := v.Args[0] 24328 if l.Op != OpARMXORshiftRL { 24329 break 24330 } 24331 c := l.AuxInt 24332 _ = l.Args[1] 24333 x := l.Args[0] 24334 y := l.Args[1] 24335 if !(l.Uses == 1) { 24336 break 24337 } 24338 b.Kind = BlockARMGE 24339 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 24340 v0.AuxInt = c 24341 v0.AddArg(x) 24342 v0.AddArg(y) 24343 b.SetControl(v0) 24344 b.Aux = nil 24345 return true 24346 } 24347 // match: (GE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 24348 // cond: l.Uses==1 24349 // result: (GE (TEQshiftRA x y [c]) yes no) 24350 for { 24351 v := b.Control 24352 if v.Op != OpARMCMPconst { 24353 break 24354 } 24355 if v.AuxInt != 0 { 24356 break 24357 } 24358 l := v.Args[0] 24359 if l.Op != OpARMXORshiftRA { 24360 break 24361 } 24362 c := l.AuxInt 24363 _ = l.Args[1] 24364 x := l.Args[0] 24365 y := l.Args[1] 24366 if !(l.Uses == 1) { 24367 break 24368 } 24369 b.Kind = BlockARMGE 24370 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 24371 v0.AuxInt = c 24372 v0.AddArg(x) 24373 v0.AddArg(y) 24374 b.SetControl(v0) 24375 b.Aux = nil 24376 return true 24377 } 24378 // match: (GE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 24379 // cond: l.Uses==1 24380 // result: (GE (TEQshiftLLreg x y z) yes no) 24381 for { 24382 v := b.Control 24383 if v.Op != OpARMCMPconst { 24384 break 24385 } 24386 if v.AuxInt != 0 { 24387 break 24388 } 24389 l := v.Args[0] 24390 if l.Op != OpARMXORshiftLLreg { 24391 break 24392 } 24393 _ = l.Args[2] 24394 x := l.Args[0] 24395 y := l.Args[1] 24396 z := l.Args[2] 24397 if !(l.Uses == 1) { 24398 break 24399 } 24400 b.Kind = BlockARMGE 24401 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 24402 v0.AddArg(x) 24403 v0.AddArg(y) 24404 v0.AddArg(z) 24405 b.SetControl(v0) 24406 b.Aux = nil 24407 return true 24408 } 24409 // match: (GE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 24410 // cond: l.Uses==1 24411 // result: (GE (TEQshiftRLreg x y z) yes no) 24412 for { 24413 v := b.Control 24414 if v.Op != OpARMCMPconst { 24415 break 24416 } 24417 if v.AuxInt != 0 { 24418 break 24419 } 24420 l := v.Args[0] 24421 if l.Op != OpARMXORshiftRLreg { 24422 break 24423 } 24424 _ = l.Args[2] 24425 x := l.Args[0] 24426 y := l.Args[1] 24427 z := l.Args[2] 24428 if !(l.Uses == 1) { 24429 break 24430 } 24431 b.Kind = BlockARMGE 24432 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 24433 v0.AddArg(x) 24434 v0.AddArg(y) 24435 v0.AddArg(z) 24436 b.SetControl(v0) 24437 b.Aux = nil 24438 return true 24439 } 24440 // match: (GE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 24441 // cond: l.Uses==1 24442 // result: (GE (TEQshiftRAreg x y z) yes no) 24443 for { 24444 v := b.Control 24445 if v.Op != OpARMCMPconst { 24446 break 24447 } 24448 if v.AuxInt != 0 { 24449 break 24450 } 24451 l := v.Args[0] 24452 if l.Op != OpARMXORshiftRAreg { 24453 break 24454 } 24455 _ = l.Args[2] 24456 x := l.Args[0] 24457 y := l.Args[1] 24458 z := l.Args[2] 24459 if !(l.Uses == 1) { 24460 break 24461 } 24462 b.Kind = BlockARMGE 24463 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 24464 v0.AddArg(x) 24465 v0.AddArg(y) 24466 v0.AddArg(z) 24467 b.SetControl(v0) 24468 b.Aux = nil 24469 return true 24470 } 24471 case BlockARMGT: 24472 // match: (GT (FlagEQ) yes no) 24473 // cond: 24474 // result: (First nil no yes) 24475 for { 24476 v := b.Control 24477 if v.Op != OpARMFlagEQ { 24478 break 24479 } 24480 b.Kind = BlockFirst 24481 b.SetControl(nil) 24482 b.Aux = nil 24483 b.swapSuccessors() 24484 return true 24485 } 24486 // match: (GT (FlagLT_ULT) yes no) 24487 // cond: 24488 // result: (First nil no yes) 24489 for { 24490 v := b.Control 24491 if v.Op != OpARMFlagLT_ULT { 24492 break 24493 } 24494 b.Kind = BlockFirst 24495 b.SetControl(nil) 24496 b.Aux = nil 24497 b.swapSuccessors() 24498 return true 24499 } 24500 // match: (GT (FlagLT_UGT) yes no) 24501 // cond: 24502 // result: (First nil no yes) 24503 for { 24504 v := b.Control 24505 if v.Op != OpARMFlagLT_UGT { 24506 break 24507 } 24508 b.Kind = BlockFirst 24509 b.SetControl(nil) 24510 b.Aux = nil 24511 b.swapSuccessors() 24512 return true 24513 } 24514 // match: (GT (FlagGT_ULT) yes no) 24515 // cond: 24516 // result: (First nil yes no) 24517 for { 24518 v := b.Control 24519 if v.Op != OpARMFlagGT_ULT { 24520 break 24521 } 24522 b.Kind = BlockFirst 24523 b.SetControl(nil) 24524 b.Aux = nil 24525 return true 24526 } 24527 // match: (GT (FlagGT_UGT) yes no) 24528 // cond: 24529 // result: (First nil yes no) 24530 for { 24531 v := b.Control 24532 if v.Op != OpARMFlagGT_UGT { 24533 break 24534 } 24535 b.Kind = BlockFirst 24536 b.SetControl(nil) 24537 b.Aux = nil 24538 return true 24539 } 24540 // match: (GT (InvertFlags cmp) yes no) 24541 // cond: 24542 // result: (LT cmp yes no) 24543 for { 24544 v := b.Control 24545 if v.Op != OpARMInvertFlags { 24546 break 24547 } 24548 cmp := v.Args[0] 24549 b.Kind = BlockARMLT 24550 b.SetControl(cmp) 24551 b.Aux = nil 24552 return true 24553 } 24554 // match: (GT (CMPconst [0] l:(SUB x y)) yes no) 24555 // cond: l.Uses==1 24556 // result: (GT (CMP x y) yes no) 24557 for { 24558 v := b.Control 24559 if v.Op != OpARMCMPconst { 24560 break 24561 } 24562 if v.AuxInt != 0 { 24563 break 24564 } 24565 l := v.Args[0] 24566 if l.Op != OpARMSUB { 24567 break 24568 } 24569 _ = l.Args[1] 24570 x := l.Args[0] 24571 y := l.Args[1] 24572 if !(l.Uses == 1) { 24573 break 24574 } 24575 b.Kind = BlockARMGT 24576 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 24577 v0.AddArg(x) 24578 v0.AddArg(y) 24579 b.SetControl(v0) 24580 b.Aux = nil 24581 return true 24582 } 24583 // match: (GT (CMPconst [0] l:(MULS x y a)) yes no) 24584 // cond: l.Uses==1 24585 // result: (GT (CMP a (MUL <x.Type> x y)) yes no) 24586 for { 24587 v := b.Control 24588 if v.Op != OpARMCMPconst { 24589 break 24590 } 24591 if v.AuxInt != 0 { 24592 break 24593 } 24594 l := v.Args[0] 24595 if l.Op != OpARMMULS { 24596 break 24597 } 24598 _ = l.Args[2] 24599 x := l.Args[0] 24600 y := l.Args[1] 24601 a := l.Args[2] 24602 if !(l.Uses == 1) { 24603 break 24604 } 24605 b.Kind = BlockARMGT 24606 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 24607 v0.AddArg(a) 24608 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 24609 v1.AddArg(x) 24610 v1.AddArg(y) 24611 v0.AddArg(v1) 24612 b.SetControl(v0) 24613 b.Aux = nil 24614 return true 24615 } 24616 // match: (GT (CMPconst [0] l:(SUBconst [c] x)) yes no) 24617 // cond: l.Uses==1 24618 // result: (GT (CMPconst [c] x) yes no) 24619 for { 24620 v := b.Control 24621 if v.Op != OpARMCMPconst { 24622 break 24623 } 24624 if v.AuxInt != 0 { 24625 break 24626 } 24627 l := v.Args[0] 24628 if l.Op != OpARMSUBconst { 24629 break 24630 } 24631 c := l.AuxInt 24632 x := l.Args[0] 24633 if !(l.Uses == 1) { 24634 break 24635 } 24636 b.Kind = BlockARMGT 24637 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 24638 v0.AuxInt = c 24639 v0.AddArg(x) 24640 b.SetControl(v0) 24641 b.Aux = nil 24642 return true 24643 } 24644 // match: (GT (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 24645 // cond: l.Uses==1 24646 // result: (GT (CMPshiftLL x y [c]) yes no) 24647 for { 24648 v := b.Control 24649 if v.Op != OpARMCMPconst { 24650 break 24651 } 24652 if v.AuxInt != 0 { 24653 break 24654 } 24655 l := v.Args[0] 24656 if l.Op != OpARMSUBshiftLL { 24657 break 24658 } 24659 c := l.AuxInt 24660 _ = l.Args[1] 24661 x := l.Args[0] 24662 y := l.Args[1] 24663 if !(l.Uses == 1) { 24664 break 24665 } 24666 b.Kind = BlockARMGT 24667 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 24668 v0.AuxInt = c 24669 v0.AddArg(x) 24670 v0.AddArg(y) 24671 b.SetControl(v0) 24672 b.Aux = nil 24673 return true 24674 } 24675 // match: (GT (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 24676 // cond: l.Uses==1 24677 // result: (GT (CMPshiftRL x y [c]) yes no) 24678 for { 24679 v := b.Control 24680 if v.Op != OpARMCMPconst { 24681 break 24682 } 24683 if v.AuxInt != 0 { 24684 break 24685 } 24686 l := v.Args[0] 24687 if l.Op != OpARMSUBshiftRL { 24688 break 24689 } 24690 c := l.AuxInt 24691 _ = l.Args[1] 24692 x := l.Args[0] 24693 y := l.Args[1] 24694 if !(l.Uses == 1) { 24695 break 24696 } 24697 b.Kind = BlockARMGT 24698 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 24699 v0.AuxInt = c 24700 v0.AddArg(x) 24701 v0.AddArg(y) 24702 b.SetControl(v0) 24703 b.Aux = nil 24704 return true 24705 } 24706 // match: (GT (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 24707 // cond: l.Uses==1 24708 // result: (GT (CMPshiftRA x y [c]) yes no) 24709 for { 24710 v := b.Control 24711 if v.Op != OpARMCMPconst { 24712 break 24713 } 24714 if v.AuxInt != 0 { 24715 break 24716 } 24717 l := v.Args[0] 24718 if l.Op != OpARMSUBshiftRA { 24719 break 24720 } 24721 c := l.AuxInt 24722 _ = l.Args[1] 24723 x := l.Args[0] 24724 y := l.Args[1] 24725 if !(l.Uses == 1) { 24726 break 24727 } 24728 b.Kind = BlockARMGT 24729 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 24730 v0.AuxInt = c 24731 v0.AddArg(x) 24732 v0.AddArg(y) 24733 b.SetControl(v0) 24734 b.Aux = nil 24735 return true 24736 } 24737 // match: (GT (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 24738 // cond: l.Uses==1 24739 // result: (GT (CMPshiftLLreg x y z) yes no) 24740 for { 24741 v := b.Control 24742 if v.Op != OpARMCMPconst { 24743 break 24744 } 24745 if v.AuxInt != 0 { 24746 break 24747 } 24748 l := v.Args[0] 24749 if l.Op != OpARMSUBshiftLLreg { 24750 break 24751 } 24752 _ = l.Args[2] 24753 x := l.Args[0] 24754 y := l.Args[1] 24755 z := l.Args[2] 24756 if !(l.Uses == 1) { 24757 break 24758 } 24759 b.Kind = BlockARMGT 24760 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 24761 v0.AddArg(x) 24762 v0.AddArg(y) 24763 v0.AddArg(z) 24764 b.SetControl(v0) 24765 b.Aux = nil 24766 return true 24767 } 24768 // match: (GT (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 24769 // cond: l.Uses==1 24770 // result: (GT (CMPshiftRLreg x y z) yes no) 24771 for { 24772 v := b.Control 24773 if v.Op != OpARMCMPconst { 24774 break 24775 } 24776 if v.AuxInt != 0 { 24777 break 24778 } 24779 l := v.Args[0] 24780 if l.Op != OpARMSUBshiftRLreg { 24781 break 24782 } 24783 _ = l.Args[2] 24784 x := l.Args[0] 24785 y := l.Args[1] 24786 z := l.Args[2] 24787 if !(l.Uses == 1) { 24788 break 24789 } 24790 b.Kind = BlockARMGT 24791 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 24792 v0.AddArg(x) 24793 v0.AddArg(y) 24794 v0.AddArg(z) 24795 b.SetControl(v0) 24796 b.Aux = nil 24797 return true 24798 } 24799 // match: (GT (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 24800 // cond: l.Uses==1 24801 // result: (GT (CMPshiftRAreg x y z) yes no) 24802 for { 24803 v := b.Control 24804 if v.Op != OpARMCMPconst { 24805 break 24806 } 24807 if v.AuxInt != 0 { 24808 break 24809 } 24810 l := v.Args[0] 24811 if l.Op != OpARMSUBshiftRAreg { 24812 break 24813 } 24814 _ = l.Args[2] 24815 x := l.Args[0] 24816 y := l.Args[1] 24817 z := l.Args[2] 24818 if !(l.Uses == 1) { 24819 break 24820 } 24821 b.Kind = BlockARMGT 24822 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 24823 v0.AddArg(x) 24824 v0.AddArg(y) 24825 v0.AddArg(z) 24826 b.SetControl(v0) 24827 b.Aux = nil 24828 return true 24829 } 24830 // match: (GT (CMPconst [0] l:(ADD x y)) yes no) 24831 // cond: l.Uses==1 24832 // result: (GT (CMN x y) yes no) 24833 for { 24834 v := b.Control 24835 if v.Op != OpARMCMPconst { 24836 break 24837 } 24838 if v.AuxInt != 0 { 24839 break 24840 } 24841 l := v.Args[0] 24842 if l.Op != OpARMADD { 24843 break 24844 } 24845 _ = l.Args[1] 24846 x := l.Args[0] 24847 y := l.Args[1] 24848 if !(l.Uses == 1) { 24849 break 24850 } 24851 b.Kind = BlockARMGT 24852 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 24853 v0.AddArg(x) 24854 v0.AddArg(y) 24855 b.SetControl(v0) 24856 b.Aux = nil 24857 return true 24858 } 24859 // match: (GT (CMPconst [0] l:(ADDconst [c] x)) yes no) 24860 // cond: l.Uses==1 24861 // result: (GT (CMNconst [c] x) yes no) 24862 for { 24863 v := b.Control 24864 if v.Op != OpARMCMPconst { 24865 break 24866 } 24867 if v.AuxInt != 0 { 24868 break 24869 } 24870 l := v.Args[0] 24871 if l.Op != OpARMADDconst { 24872 break 24873 } 24874 c := l.AuxInt 24875 x := l.Args[0] 24876 if !(l.Uses == 1) { 24877 break 24878 } 24879 b.Kind = BlockARMGT 24880 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 24881 v0.AuxInt = c 24882 v0.AddArg(x) 24883 b.SetControl(v0) 24884 b.Aux = nil 24885 return true 24886 } 24887 // match: (GT (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 24888 // cond: l.Uses==1 24889 // result: (GT (CMNshiftLL x y [c]) yes no) 24890 for { 24891 v := b.Control 24892 if v.Op != OpARMCMPconst { 24893 break 24894 } 24895 if v.AuxInt != 0 { 24896 break 24897 } 24898 l := v.Args[0] 24899 if l.Op != OpARMADDshiftLL { 24900 break 24901 } 24902 c := l.AuxInt 24903 _ = l.Args[1] 24904 x := l.Args[0] 24905 y := l.Args[1] 24906 if !(l.Uses == 1) { 24907 break 24908 } 24909 b.Kind = BlockARMGT 24910 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 24911 v0.AuxInt = c 24912 v0.AddArg(x) 24913 v0.AddArg(y) 24914 b.SetControl(v0) 24915 b.Aux = nil 24916 return true 24917 } 24918 // match: (GT (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 24919 // cond: l.Uses==1 24920 // result: (GT (CMNshiftRL x y [c]) yes no) 24921 for { 24922 v := b.Control 24923 if v.Op != OpARMCMPconst { 24924 break 24925 } 24926 if v.AuxInt != 0 { 24927 break 24928 } 24929 l := v.Args[0] 24930 if l.Op != OpARMADDshiftRL { 24931 break 24932 } 24933 c := l.AuxInt 24934 _ = l.Args[1] 24935 x := l.Args[0] 24936 y := l.Args[1] 24937 if !(l.Uses == 1) { 24938 break 24939 } 24940 b.Kind = BlockARMGT 24941 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 24942 v0.AuxInt = c 24943 v0.AddArg(x) 24944 v0.AddArg(y) 24945 b.SetControl(v0) 24946 b.Aux = nil 24947 return true 24948 } 24949 // match: (GT (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 24950 // cond: l.Uses==1 24951 // result: (GT (CMNshiftRA x y [c]) yes no) 24952 for { 24953 v := b.Control 24954 if v.Op != OpARMCMPconst { 24955 break 24956 } 24957 if v.AuxInt != 0 { 24958 break 24959 } 24960 l := v.Args[0] 24961 if l.Op != OpARMADDshiftRA { 24962 break 24963 } 24964 c := l.AuxInt 24965 _ = l.Args[1] 24966 x := l.Args[0] 24967 y := l.Args[1] 24968 if !(l.Uses == 1) { 24969 break 24970 } 24971 b.Kind = BlockARMGT 24972 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 24973 v0.AuxInt = c 24974 v0.AddArg(x) 24975 v0.AddArg(y) 24976 b.SetControl(v0) 24977 b.Aux = nil 24978 return true 24979 } 24980 // match: (GT (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 24981 // cond: l.Uses==1 24982 // result: (GT (CMNshiftLLreg x y z) yes no) 24983 for { 24984 v := b.Control 24985 if v.Op != OpARMCMPconst { 24986 break 24987 } 24988 if v.AuxInt != 0 { 24989 break 24990 } 24991 l := v.Args[0] 24992 if l.Op != OpARMADDshiftLLreg { 24993 break 24994 } 24995 _ = l.Args[2] 24996 x := l.Args[0] 24997 y := l.Args[1] 24998 z := l.Args[2] 24999 if !(l.Uses == 1) { 25000 break 25001 } 25002 b.Kind = BlockARMGT 25003 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 25004 v0.AddArg(x) 25005 v0.AddArg(y) 25006 v0.AddArg(z) 25007 b.SetControl(v0) 25008 b.Aux = nil 25009 return true 25010 } 25011 // match: (GT (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 25012 // cond: l.Uses==1 25013 // result: (GT (CMNshiftRLreg x y z) yes no) 25014 for { 25015 v := b.Control 25016 if v.Op != OpARMCMPconst { 25017 break 25018 } 25019 if v.AuxInt != 0 { 25020 break 25021 } 25022 l := v.Args[0] 25023 if l.Op != OpARMADDshiftRLreg { 25024 break 25025 } 25026 _ = l.Args[2] 25027 x := l.Args[0] 25028 y := l.Args[1] 25029 z := l.Args[2] 25030 if !(l.Uses == 1) { 25031 break 25032 } 25033 b.Kind = BlockARMGT 25034 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 25035 v0.AddArg(x) 25036 v0.AddArg(y) 25037 v0.AddArg(z) 25038 b.SetControl(v0) 25039 b.Aux = nil 25040 return true 25041 } 25042 // match: (GT (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 25043 // cond: l.Uses==1 25044 // result: (GT (CMNshiftRAreg x y z) yes no) 25045 for { 25046 v := b.Control 25047 if v.Op != OpARMCMPconst { 25048 break 25049 } 25050 if v.AuxInt != 0 { 25051 break 25052 } 25053 l := v.Args[0] 25054 if l.Op != OpARMADDshiftRAreg { 25055 break 25056 } 25057 _ = l.Args[2] 25058 x := l.Args[0] 25059 y := l.Args[1] 25060 z := l.Args[2] 25061 if !(l.Uses == 1) { 25062 break 25063 } 25064 b.Kind = BlockARMGT 25065 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 25066 v0.AddArg(x) 25067 v0.AddArg(y) 25068 v0.AddArg(z) 25069 b.SetControl(v0) 25070 b.Aux = nil 25071 return true 25072 } 25073 // match: (GT (CMPconst [0] l:(AND x y)) yes no) 25074 // cond: l.Uses==1 25075 // result: (GT (TST x y) yes no) 25076 for { 25077 v := b.Control 25078 if v.Op != OpARMCMPconst { 25079 break 25080 } 25081 if v.AuxInt != 0 { 25082 break 25083 } 25084 l := v.Args[0] 25085 if l.Op != OpARMAND { 25086 break 25087 } 25088 _ = l.Args[1] 25089 x := l.Args[0] 25090 y := l.Args[1] 25091 if !(l.Uses == 1) { 25092 break 25093 } 25094 b.Kind = BlockARMGT 25095 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 25096 v0.AddArg(x) 25097 v0.AddArg(y) 25098 b.SetControl(v0) 25099 b.Aux = nil 25100 return true 25101 } 25102 // match: (GT (CMPconst [0] l:(MULA x y a)) yes no) 25103 // cond: l.Uses==1 25104 // result: (GT (CMN a (MUL <x.Type> x y)) yes no) 25105 for { 25106 v := b.Control 25107 if v.Op != OpARMCMPconst { 25108 break 25109 } 25110 if v.AuxInt != 0 { 25111 break 25112 } 25113 l := v.Args[0] 25114 if l.Op != OpARMMULA { 25115 break 25116 } 25117 _ = l.Args[2] 25118 x := l.Args[0] 25119 y := l.Args[1] 25120 a := l.Args[2] 25121 if !(l.Uses == 1) { 25122 break 25123 } 25124 b.Kind = BlockARMGT 25125 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 25126 v0.AddArg(a) 25127 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 25128 v1.AddArg(x) 25129 v1.AddArg(y) 25130 v0.AddArg(v1) 25131 b.SetControl(v0) 25132 b.Aux = nil 25133 return true 25134 } 25135 // match: (GT (CMPconst [0] l:(ANDconst [c] x)) yes no) 25136 // cond: l.Uses==1 25137 // result: (GT (TSTconst [c] x) yes no) 25138 for { 25139 v := b.Control 25140 if v.Op != OpARMCMPconst { 25141 break 25142 } 25143 if v.AuxInt != 0 { 25144 break 25145 } 25146 l := v.Args[0] 25147 if l.Op != OpARMANDconst { 25148 break 25149 } 25150 c := l.AuxInt 25151 x := l.Args[0] 25152 if !(l.Uses == 1) { 25153 break 25154 } 25155 b.Kind = BlockARMGT 25156 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 25157 v0.AuxInt = c 25158 v0.AddArg(x) 25159 b.SetControl(v0) 25160 b.Aux = nil 25161 return true 25162 } 25163 // match: (GT (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 25164 // cond: l.Uses==1 25165 // result: (GT (TSTshiftLL x y [c]) yes no) 25166 for { 25167 v := b.Control 25168 if v.Op != OpARMCMPconst { 25169 break 25170 } 25171 if v.AuxInt != 0 { 25172 break 25173 } 25174 l := v.Args[0] 25175 if l.Op != OpARMANDshiftLL { 25176 break 25177 } 25178 c := l.AuxInt 25179 _ = l.Args[1] 25180 x := l.Args[0] 25181 y := l.Args[1] 25182 if !(l.Uses == 1) { 25183 break 25184 } 25185 b.Kind = BlockARMGT 25186 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 25187 v0.AuxInt = c 25188 v0.AddArg(x) 25189 v0.AddArg(y) 25190 b.SetControl(v0) 25191 b.Aux = nil 25192 return true 25193 } 25194 // match: (GT (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 25195 // cond: l.Uses==1 25196 // result: (GT (TSTshiftRL x y [c]) yes no) 25197 for { 25198 v := b.Control 25199 if v.Op != OpARMCMPconst { 25200 break 25201 } 25202 if v.AuxInt != 0 { 25203 break 25204 } 25205 l := v.Args[0] 25206 if l.Op != OpARMANDshiftRL { 25207 break 25208 } 25209 c := l.AuxInt 25210 _ = l.Args[1] 25211 x := l.Args[0] 25212 y := l.Args[1] 25213 if !(l.Uses == 1) { 25214 break 25215 } 25216 b.Kind = BlockARMGT 25217 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 25218 v0.AuxInt = c 25219 v0.AddArg(x) 25220 v0.AddArg(y) 25221 b.SetControl(v0) 25222 b.Aux = nil 25223 return true 25224 } 25225 // match: (GT (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 25226 // cond: l.Uses==1 25227 // result: (GT (TSTshiftRA x y [c]) yes no) 25228 for { 25229 v := b.Control 25230 if v.Op != OpARMCMPconst { 25231 break 25232 } 25233 if v.AuxInt != 0 { 25234 break 25235 } 25236 l := v.Args[0] 25237 if l.Op != OpARMANDshiftRA { 25238 break 25239 } 25240 c := l.AuxInt 25241 _ = l.Args[1] 25242 x := l.Args[0] 25243 y := l.Args[1] 25244 if !(l.Uses == 1) { 25245 break 25246 } 25247 b.Kind = BlockARMGT 25248 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 25249 v0.AuxInt = c 25250 v0.AddArg(x) 25251 v0.AddArg(y) 25252 b.SetControl(v0) 25253 b.Aux = nil 25254 return true 25255 } 25256 // match: (GT (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 25257 // cond: l.Uses==1 25258 // result: (GT (TSTshiftLLreg x y z) yes no) 25259 for { 25260 v := b.Control 25261 if v.Op != OpARMCMPconst { 25262 break 25263 } 25264 if v.AuxInt != 0 { 25265 break 25266 } 25267 l := v.Args[0] 25268 if l.Op != OpARMANDshiftLLreg { 25269 break 25270 } 25271 _ = l.Args[2] 25272 x := l.Args[0] 25273 y := l.Args[1] 25274 z := l.Args[2] 25275 if !(l.Uses == 1) { 25276 break 25277 } 25278 b.Kind = BlockARMGT 25279 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 25280 v0.AddArg(x) 25281 v0.AddArg(y) 25282 v0.AddArg(z) 25283 b.SetControl(v0) 25284 b.Aux = nil 25285 return true 25286 } 25287 // match: (GT (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 25288 // cond: l.Uses==1 25289 // result: (GT (TSTshiftRLreg x y z) yes no) 25290 for { 25291 v := b.Control 25292 if v.Op != OpARMCMPconst { 25293 break 25294 } 25295 if v.AuxInt != 0 { 25296 break 25297 } 25298 l := v.Args[0] 25299 if l.Op != OpARMANDshiftRLreg { 25300 break 25301 } 25302 _ = l.Args[2] 25303 x := l.Args[0] 25304 y := l.Args[1] 25305 z := l.Args[2] 25306 if !(l.Uses == 1) { 25307 break 25308 } 25309 b.Kind = BlockARMGT 25310 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 25311 v0.AddArg(x) 25312 v0.AddArg(y) 25313 v0.AddArg(z) 25314 b.SetControl(v0) 25315 b.Aux = nil 25316 return true 25317 } 25318 // match: (GT (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 25319 // cond: l.Uses==1 25320 // result: (GT (TSTshiftRAreg x y z) yes no) 25321 for { 25322 v := b.Control 25323 if v.Op != OpARMCMPconst { 25324 break 25325 } 25326 if v.AuxInt != 0 { 25327 break 25328 } 25329 l := v.Args[0] 25330 if l.Op != OpARMANDshiftRAreg { 25331 break 25332 } 25333 _ = l.Args[2] 25334 x := l.Args[0] 25335 y := l.Args[1] 25336 z := l.Args[2] 25337 if !(l.Uses == 1) { 25338 break 25339 } 25340 b.Kind = BlockARMGT 25341 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 25342 v0.AddArg(x) 25343 v0.AddArg(y) 25344 v0.AddArg(z) 25345 b.SetControl(v0) 25346 b.Aux = nil 25347 return true 25348 } 25349 // match: (GT (CMPconst [0] l:(XOR x y)) yes no) 25350 // cond: l.Uses==1 25351 // result: (GT (TEQ x y) yes no) 25352 for { 25353 v := b.Control 25354 if v.Op != OpARMCMPconst { 25355 break 25356 } 25357 if v.AuxInt != 0 { 25358 break 25359 } 25360 l := v.Args[0] 25361 if l.Op != OpARMXOR { 25362 break 25363 } 25364 _ = l.Args[1] 25365 x := l.Args[0] 25366 y := l.Args[1] 25367 if !(l.Uses == 1) { 25368 break 25369 } 25370 b.Kind = BlockARMGT 25371 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 25372 v0.AddArg(x) 25373 v0.AddArg(y) 25374 b.SetControl(v0) 25375 b.Aux = nil 25376 return true 25377 } 25378 // match: (GT (CMPconst [0] l:(XORconst [c] x)) yes no) 25379 // cond: l.Uses==1 25380 // result: (GT (TEQconst [c] x) yes no) 25381 for { 25382 v := b.Control 25383 if v.Op != OpARMCMPconst { 25384 break 25385 } 25386 if v.AuxInt != 0 { 25387 break 25388 } 25389 l := v.Args[0] 25390 if l.Op != OpARMXORconst { 25391 break 25392 } 25393 c := l.AuxInt 25394 x := l.Args[0] 25395 if !(l.Uses == 1) { 25396 break 25397 } 25398 b.Kind = BlockARMGT 25399 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 25400 v0.AuxInt = c 25401 v0.AddArg(x) 25402 b.SetControl(v0) 25403 b.Aux = nil 25404 return true 25405 } 25406 // match: (GT (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 25407 // cond: l.Uses==1 25408 // result: (GT (TEQshiftLL x y [c]) yes no) 25409 for { 25410 v := b.Control 25411 if v.Op != OpARMCMPconst { 25412 break 25413 } 25414 if v.AuxInt != 0 { 25415 break 25416 } 25417 l := v.Args[0] 25418 if l.Op != OpARMXORshiftLL { 25419 break 25420 } 25421 c := l.AuxInt 25422 _ = l.Args[1] 25423 x := l.Args[0] 25424 y := l.Args[1] 25425 if !(l.Uses == 1) { 25426 break 25427 } 25428 b.Kind = BlockARMGT 25429 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 25430 v0.AuxInt = c 25431 v0.AddArg(x) 25432 v0.AddArg(y) 25433 b.SetControl(v0) 25434 b.Aux = nil 25435 return true 25436 } 25437 // match: (GT (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 25438 // cond: l.Uses==1 25439 // result: (GT (TEQshiftRL x y [c]) yes no) 25440 for { 25441 v := b.Control 25442 if v.Op != OpARMCMPconst { 25443 break 25444 } 25445 if v.AuxInt != 0 { 25446 break 25447 } 25448 l := v.Args[0] 25449 if l.Op != OpARMXORshiftRL { 25450 break 25451 } 25452 c := l.AuxInt 25453 _ = l.Args[1] 25454 x := l.Args[0] 25455 y := l.Args[1] 25456 if !(l.Uses == 1) { 25457 break 25458 } 25459 b.Kind = BlockARMGT 25460 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 25461 v0.AuxInt = c 25462 v0.AddArg(x) 25463 v0.AddArg(y) 25464 b.SetControl(v0) 25465 b.Aux = nil 25466 return true 25467 } 25468 // match: (GT (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 25469 // cond: l.Uses==1 25470 // result: (GT (TEQshiftRA x y [c]) yes no) 25471 for { 25472 v := b.Control 25473 if v.Op != OpARMCMPconst { 25474 break 25475 } 25476 if v.AuxInt != 0 { 25477 break 25478 } 25479 l := v.Args[0] 25480 if l.Op != OpARMXORshiftRA { 25481 break 25482 } 25483 c := l.AuxInt 25484 _ = l.Args[1] 25485 x := l.Args[0] 25486 y := l.Args[1] 25487 if !(l.Uses == 1) { 25488 break 25489 } 25490 b.Kind = BlockARMGT 25491 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 25492 v0.AuxInt = c 25493 v0.AddArg(x) 25494 v0.AddArg(y) 25495 b.SetControl(v0) 25496 b.Aux = nil 25497 return true 25498 } 25499 // match: (GT (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 25500 // cond: l.Uses==1 25501 // result: (GT (TEQshiftLLreg x y z) yes no) 25502 for { 25503 v := b.Control 25504 if v.Op != OpARMCMPconst { 25505 break 25506 } 25507 if v.AuxInt != 0 { 25508 break 25509 } 25510 l := v.Args[0] 25511 if l.Op != OpARMXORshiftLLreg { 25512 break 25513 } 25514 _ = l.Args[2] 25515 x := l.Args[0] 25516 y := l.Args[1] 25517 z := l.Args[2] 25518 if !(l.Uses == 1) { 25519 break 25520 } 25521 b.Kind = BlockARMGT 25522 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 25523 v0.AddArg(x) 25524 v0.AddArg(y) 25525 v0.AddArg(z) 25526 b.SetControl(v0) 25527 b.Aux = nil 25528 return true 25529 } 25530 // match: (GT (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 25531 // cond: l.Uses==1 25532 // result: (GT (TEQshiftRLreg x y z) yes no) 25533 for { 25534 v := b.Control 25535 if v.Op != OpARMCMPconst { 25536 break 25537 } 25538 if v.AuxInt != 0 { 25539 break 25540 } 25541 l := v.Args[0] 25542 if l.Op != OpARMXORshiftRLreg { 25543 break 25544 } 25545 _ = l.Args[2] 25546 x := l.Args[0] 25547 y := l.Args[1] 25548 z := l.Args[2] 25549 if !(l.Uses == 1) { 25550 break 25551 } 25552 b.Kind = BlockARMGT 25553 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 25554 v0.AddArg(x) 25555 v0.AddArg(y) 25556 v0.AddArg(z) 25557 b.SetControl(v0) 25558 b.Aux = nil 25559 return true 25560 } 25561 // match: (GT (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 25562 // cond: l.Uses==1 25563 // result: (GT (TEQshiftRAreg x y z) yes no) 25564 for { 25565 v := b.Control 25566 if v.Op != OpARMCMPconst { 25567 break 25568 } 25569 if v.AuxInt != 0 { 25570 break 25571 } 25572 l := v.Args[0] 25573 if l.Op != OpARMXORshiftRAreg { 25574 break 25575 } 25576 _ = l.Args[2] 25577 x := l.Args[0] 25578 y := l.Args[1] 25579 z := l.Args[2] 25580 if !(l.Uses == 1) { 25581 break 25582 } 25583 b.Kind = BlockARMGT 25584 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 25585 v0.AddArg(x) 25586 v0.AddArg(y) 25587 v0.AddArg(z) 25588 b.SetControl(v0) 25589 b.Aux = nil 25590 return true 25591 } 25592 case BlockIf: 25593 // match: (If (Equal cc) yes no) 25594 // cond: 25595 // result: (EQ cc yes no) 25596 for { 25597 v := b.Control 25598 if v.Op != OpARMEqual { 25599 break 25600 } 25601 cc := v.Args[0] 25602 b.Kind = BlockARMEQ 25603 b.SetControl(cc) 25604 b.Aux = nil 25605 return true 25606 } 25607 // match: (If (NotEqual cc) yes no) 25608 // cond: 25609 // result: (NE cc yes no) 25610 for { 25611 v := b.Control 25612 if v.Op != OpARMNotEqual { 25613 break 25614 } 25615 cc := v.Args[0] 25616 b.Kind = BlockARMNE 25617 b.SetControl(cc) 25618 b.Aux = nil 25619 return true 25620 } 25621 // match: (If (LessThan cc) yes no) 25622 // cond: 25623 // result: (LT cc yes no) 25624 for { 25625 v := b.Control 25626 if v.Op != OpARMLessThan { 25627 break 25628 } 25629 cc := v.Args[0] 25630 b.Kind = BlockARMLT 25631 b.SetControl(cc) 25632 b.Aux = nil 25633 return true 25634 } 25635 // match: (If (LessThanU cc) yes no) 25636 // cond: 25637 // result: (ULT cc yes no) 25638 for { 25639 v := b.Control 25640 if v.Op != OpARMLessThanU { 25641 break 25642 } 25643 cc := v.Args[0] 25644 b.Kind = BlockARMULT 25645 b.SetControl(cc) 25646 b.Aux = nil 25647 return true 25648 } 25649 // match: (If (LessEqual cc) yes no) 25650 // cond: 25651 // result: (LE cc yes no) 25652 for { 25653 v := b.Control 25654 if v.Op != OpARMLessEqual { 25655 break 25656 } 25657 cc := v.Args[0] 25658 b.Kind = BlockARMLE 25659 b.SetControl(cc) 25660 b.Aux = nil 25661 return true 25662 } 25663 // match: (If (LessEqualU cc) yes no) 25664 // cond: 25665 // result: (ULE cc yes no) 25666 for { 25667 v := b.Control 25668 if v.Op != OpARMLessEqualU { 25669 break 25670 } 25671 cc := v.Args[0] 25672 b.Kind = BlockARMULE 25673 b.SetControl(cc) 25674 b.Aux = nil 25675 return true 25676 } 25677 // match: (If (GreaterThan cc) yes no) 25678 // cond: 25679 // result: (GT cc yes no) 25680 for { 25681 v := b.Control 25682 if v.Op != OpARMGreaterThan { 25683 break 25684 } 25685 cc := v.Args[0] 25686 b.Kind = BlockARMGT 25687 b.SetControl(cc) 25688 b.Aux = nil 25689 return true 25690 } 25691 // match: (If (GreaterThanU cc) yes no) 25692 // cond: 25693 // result: (UGT cc yes no) 25694 for { 25695 v := b.Control 25696 if v.Op != OpARMGreaterThanU { 25697 break 25698 } 25699 cc := v.Args[0] 25700 b.Kind = BlockARMUGT 25701 b.SetControl(cc) 25702 b.Aux = nil 25703 return true 25704 } 25705 // match: (If (GreaterEqual cc) yes no) 25706 // cond: 25707 // result: (GE cc yes no) 25708 for { 25709 v := b.Control 25710 if v.Op != OpARMGreaterEqual { 25711 break 25712 } 25713 cc := v.Args[0] 25714 b.Kind = BlockARMGE 25715 b.SetControl(cc) 25716 b.Aux = nil 25717 return true 25718 } 25719 // match: (If (GreaterEqualU cc) yes no) 25720 // cond: 25721 // result: (UGE cc yes no) 25722 for { 25723 v := b.Control 25724 if v.Op != OpARMGreaterEqualU { 25725 break 25726 } 25727 cc := v.Args[0] 25728 b.Kind = BlockARMUGE 25729 b.SetControl(cc) 25730 b.Aux = nil 25731 return true 25732 } 25733 // match: (If cond yes no) 25734 // cond: 25735 // result: (NE (CMPconst [0] cond) yes no) 25736 for { 25737 v := b.Control 25738 _ = v 25739 cond := b.Control 25740 b.Kind = BlockARMNE 25741 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 25742 v0.AuxInt = 0 25743 v0.AddArg(cond) 25744 b.SetControl(v0) 25745 b.Aux = nil 25746 return true 25747 } 25748 case BlockARMLE: 25749 // match: (LE (FlagEQ) yes no) 25750 // cond: 25751 // result: (First nil yes no) 25752 for { 25753 v := b.Control 25754 if v.Op != OpARMFlagEQ { 25755 break 25756 } 25757 b.Kind = BlockFirst 25758 b.SetControl(nil) 25759 b.Aux = nil 25760 return true 25761 } 25762 // match: (LE (FlagLT_ULT) yes no) 25763 // cond: 25764 // result: (First nil yes no) 25765 for { 25766 v := b.Control 25767 if v.Op != OpARMFlagLT_ULT { 25768 break 25769 } 25770 b.Kind = BlockFirst 25771 b.SetControl(nil) 25772 b.Aux = nil 25773 return true 25774 } 25775 // match: (LE (FlagLT_UGT) yes no) 25776 // cond: 25777 // result: (First nil yes no) 25778 for { 25779 v := b.Control 25780 if v.Op != OpARMFlagLT_UGT { 25781 break 25782 } 25783 b.Kind = BlockFirst 25784 b.SetControl(nil) 25785 b.Aux = nil 25786 return true 25787 } 25788 // match: (LE (FlagGT_ULT) yes no) 25789 // cond: 25790 // result: (First nil no yes) 25791 for { 25792 v := b.Control 25793 if v.Op != OpARMFlagGT_ULT { 25794 break 25795 } 25796 b.Kind = BlockFirst 25797 b.SetControl(nil) 25798 b.Aux = nil 25799 b.swapSuccessors() 25800 return true 25801 } 25802 // match: (LE (FlagGT_UGT) yes no) 25803 // cond: 25804 // result: (First nil no yes) 25805 for { 25806 v := b.Control 25807 if v.Op != OpARMFlagGT_UGT { 25808 break 25809 } 25810 b.Kind = BlockFirst 25811 b.SetControl(nil) 25812 b.Aux = nil 25813 b.swapSuccessors() 25814 return true 25815 } 25816 // match: (LE (InvertFlags cmp) yes no) 25817 // cond: 25818 // result: (GE cmp yes no) 25819 for { 25820 v := b.Control 25821 if v.Op != OpARMInvertFlags { 25822 break 25823 } 25824 cmp := v.Args[0] 25825 b.Kind = BlockARMGE 25826 b.SetControl(cmp) 25827 b.Aux = nil 25828 return true 25829 } 25830 // match: (LE (CMPconst [0] l:(SUB x y)) yes no) 25831 // cond: l.Uses==1 25832 // result: (LE (CMP x y) yes no) 25833 for { 25834 v := b.Control 25835 if v.Op != OpARMCMPconst { 25836 break 25837 } 25838 if v.AuxInt != 0 { 25839 break 25840 } 25841 l := v.Args[0] 25842 if l.Op != OpARMSUB { 25843 break 25844 } 25845 _ = l.Args[1] 25846 x := l.Args[0] 25847 y := l.Args[1] 25848 if !(l.Uses == 1) { 25849 break 25850 } 25851 b.Kind = BlockARMLE 25852 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 25853 v0.AddArg(x) 25854 v0.AddArg(y) 25855 b.SetControl(v0) 25856 b.Aux = nil 25857 return true 25858 } 25859 // match: (LE (CMPconst [0] l:(MULS x y a)) yes no) 25860 // cond: l.Uses==1 25861 // result: (LE (CMP a (MUL <x.Type> x y)) yes no) 25862 for { 25863 v := b.Control 25864 if v.Op != OpARMCMPconst { 25865 break 25866 } 25867 if v.AuxInt != 0 { 25868 break 25869 } 25870 l := v.Args[0] 25871 if l.Op != OpARMMULS { 25872 break 25873 } 25874 _ = l.Args[2] 25875 x := l.Args[0] 25876 y := l.Args[1] 25877 a := l.Args[2] 25878 if !(l.Uses == 1) { 25879 break 25880 } 25881 b.Kind = BlockARMLE 25882 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 25883 v0.AddArg(a) 25884 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 25885 v1.AddArg(x) 25886 v1.AddArg(y) 25887 v0.AddArg(v1) 25888 b.SetControl(v0) 25889 b.Aux = nil 25890 return true 25891 } 25892 // match: (LE (CMPconst [0] l:(SUBconst [c] x)) yes no) 25893 // cond: l.Uses==1 25894 // result: (LE (CMPconst [c] x) yes no) 25895 for { 25896 v := b.Control 25897 if v.Op != OpARMCMPconst { 25898 break 25899 } 25900 if v.AuxInt != 0 { 25901 break 25902 } 25903 l := v.Args[0] 25904 if l.Op != OpARMSUBconst { 25905 break 25906 } 25907 c := l.AuxInt 25908 x := l.Args[0] 25909 if !(l.Uses == 1) { 25910 break 25911 } 25912 b.Kind = BlockARMLE 25913 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 25914 v0.AuxInt = c 25915 v0.AddArg(x) 25916 b.SetControl(v0) 25917 b.Aux = nil 25918 return true 25919 } 25920 // match: (LE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 25921 // cond: l.Uses==1 25922 // result: (LE (CMPshiftLL x y [c]) yes no) 25923 for { 25924 v := b.Control 25925 if v.Op != OpARMCMPconst { 25926 break 25927 } 25928 if v.AuxInt != 0 { 25929 break 25930 } 25931 l := v.Args[0] 25932 if l.Op != OpARMSUBshiftLL { 25933 break 25934 } 25935 c := l.AuxInt 25936 _ = l.Args[1] 25937 x := l.Args[0] 25938 y := l.Args[1] 25939 if !(l.Uses == 1) { 25940 break 25941 } 25942 b.Kind = BlockARMLE 25943 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 25944 v0.AuxInt = c 25945 v0.AddArg(x) 25946 v0.AddArg(y) 25947 b.SetControl(v0) 25948 b.Aux = nil 25949 return true 25950 } 25951 // match: (LE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 25952 // cond: l.Uses==1 25953 // result: (LE (CMPshiftRL x y [c]) yes no) 25954 for { 25955 v := b.Control 25956 if v.Op != OpARMCMPconst { 25957 break 25958 } 25959 if v.AuxInt != 0 { 25960 break 25961 } 25962 l := v.Args[0] 25963 if l.Op != OpARMSUBshiftRL { 25964 break 25965 } 25966 c := l.AuxInt 25967 _ = l.Args[1] 25968 x := l.Args[0] 25969 y := l.Args[1] 25970 if !(l.Uses == 1) { 25971 break 25972 } 25973 b.Kind = BlockARMLE 25974 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 25975 v0.AuxInt = c 25976 v0.AddArg(x) 25977 v0.AddArg(y) 25978 b.SetControl(v0) 25979 b.Aux = nil 25980 return true 25981 } 25982 // match: (LE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 25983 // cond: l.Uses==1 25984 // result: (LE (CMPshiftRA x y [c]) yes no) 25985 for { 25986 v := b.Control 25987 if v.Op != OpARMCMPconst { 25988 break 25989 } 25990 if v.AuxInt != 0 { 25991 break 25992 } 25993 l := v.Args[0] 25994 if l.Op != OpARMSUBshiftRA { 25995 break 25996 } 25997 c := l.AuxInt 25998 _ = l.Args[1] 25999 x := l.Args[0] 26000 y := l.Args[1] 26001 if !(l.Uses == 1) { 26002 break 26003 } 26004 b.Kind = BlockARMLE 26005 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 26006 v0.AuxInt = c 26007 v0.AddArg(x) 26008 v0.AddArg(y) 26009 b.SetControl(v0) 26010 b.Aux = nil 26011 return true 26012 } 26013 // match: (LE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 26014 // cond: l.Uses==1 26015 // result: (LE (CMPshiftLLreg x y z) yes no) 26016 for { 26017 v := b.Control 26018 if v.Op != OpARMCMPconst { 26019 break 26020 } 26021 if v.AuxInt != 0 { 26022 break 26023 } 26024 l := v.Args[0] 26025 if l.Op != OpARMSUBshiftLLreg { 26026 break 26027 } 26028 _ = l.Args[2] 26029 x := l.Args[0] 26030 y := l.Args[1] 26031 z := l.Args[2] 26032 if !(l.Uses == 1) { 26033 break 26034 } 26035 b.Kind = BlockARMLE 26036 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 26037 v0.AddArg(x) 26038 v0.AddArg(y) 26039 v0.AddArg(z) 26040 b.SetControl(v0) 26041 b.Aux = nil 26042 return true 26043 } 26044 // match: (LE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 26045 // cond: l.Uses==1 26046 // result: (LE (CMPshiftRLreg x y z) yes no) 26047 for { 26048 v := b.Control 26049 if v.Op != OpARMCMPconst { 26050 break 26051 } 26052 if v.AuxInt != 0 { 26053 break 26054 } 26055 l := v.Args[0] 26056 if l.Op != OpARMSUBshiftRLreg { 26057 break 26058 } 26059 _ = l.Args[2] 26060 x := l.Args[0] 26061 y := l.Args[1] 26062 z := l.Args[2] 26063 if !(l.Uses == 1) { 26064 break 26065 } 26066 b.Kind = BlockARMLE 26067 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 26068 v0.AddArg(x) 26069 v0.AddArg(y) 26070 v0.AddArg(z) 26071 b.SetControl(v0) 26072 b.Aux = nil 26073 return true 26074 } 26075 // match: (LE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 26076 // cond: l.Uses==1 26077 // result: (LE (CMPshiftRAreg x y z) yes no) 26078 for { 26079 v := b.Control 26080 if v.Op != OpARMCMPconst { 26081 break 26082 } 26083 if v.AuxInt != 0 { 26084 break 26085 } 26086 l := v.Args[0] 26087 if l.Op != OpARMSUBshiftRAreg { 26088 break 26089 } 26090 _ = l.Args[2] 26091 x := l.Args[0] 26092 y := l.Args[1] 26093 z := l.Args[2] 26094 if !(l.Uses == 1) { 26095 break 26096 } 26097 b.Kind = BlockARMLE 26098 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 26099 v0.AddArg(x) 26100 v0.AddArg(y) 26101 v0.AddArg(z) 26102 b.SetControl(v0) 26103 b.Aux = nil 26104 return true 26105 } 26106 // match: (LE (CMPconst [0] l:(ADD x y)) yes no) 26107 // cond: l.Uses==1 26108 // result: (LE (CMN x y) yes no) 26109 for { 26110 v := b.Control 26111 if v.Op != OpARMCMPconst { 26112 break 26113 } 26114 if v.AuxInt != 0 { 26115 break 26116 } 26117 l := v.Args[0] 26118 if l.Op != OpARMADD { 26119 break 26120 } 26121 _ = l.Args[1] 26122 x := l.Args[0] 26123 y := l.Args[1] 26124 if !(l.Uses == 1) { 26125 break 26126 } 26127 b.Kind = BlockARMLE 26128 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 26129 v0.AddArg(x) 26130 v0.AddArg(y) 26131 b.SetControl(v0) 26132 b.Aux = nil 26133 return true 26134 } 26135 // match: (LE (CMPconst [0] l:(MULA x y a)) yes no) 26136 // cond: l.Uses==1 26137 // result: (LE (CMN a (MUL <x.Type> x y)) yes no) 26138 for { 26139 v := b.Control 26140 if v.Op != OpARMCMPconst { 26141 break 26142 } 26143 if v.AuxInt != 0 { 26144 break 26145 } 26146 l := v.Args[0] 26147 if l.Op != OpARMMULA { 26148 break 26149 } 26150 _ = l.Args[2] 26151 x := l.Args[0] 26152 y := l.Args[1] 26153 a := l.Args[2] 26154 if !(l.Uses == 1) { 26155 break 26156 } 26157 b.Kind = BlockARMLE 26158 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 26159 v0.AddArg(a) 26160 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 26161 v1.AddArg(x) 26162 v1.AddArg(y) 26163 v0.AddArg(v1) 26164 b.SetControl(v0) 26165 b.Aux = nil 26166 return true 26167 } 26168 // match: (LE (CMPconst [0] l:(ADDconst [c] x)) yes no) 26169 // cond: l.Uses==1 26170 // result: (LE (CMNconst [c] x) yes no) 26171 for { 26172 v := b.Control 26173 if v.Op != OpARMCMPconst { 26174 break 26175 } 26176 if v.AuxInt != 0 { 26177 break 26178 } 26179 l := v.Args[0] 26180 if l.Op != OpARMADDconst { 26181 break 26182 } 26183 c := l.AuxInt 26184 x := l.Args[0] 26185 if !(l.Uses == 1) { 26186 break 26187 } 26188 b.Kind = BlockARMLE 26189 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 26190 v0.AuxInt = c 26191 v0.AddArg(x) 26192 b.SetControl(v0) 26193 b.Aux = nil 26194 return true 26195 } 26196 // match: (LE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 26197 // cond: l.Uses==1 26198 // result: (LE (CMNshiftLL x y [c]) yes no) 26199 for { 26200 v := b.Control 26201 if v.Op != OpARMCMPconst { 26202 break 26203 } 26204 if v.AuxInt != 0 { 26205 break 26206 } 26207 l := v.Args[0] 26208 if l.Op != OpARMADDshiftLL { 26209 break 26210 } 26211 c := l.AuxInt 26212 _ = l.Args[1] 26213 x := l.Args[0] 26214 y := l.Args[1] 26215 if !(l.Uses == 1) { 26216 break 26217 } 26218 b.Kind = BlockARMLE 26219 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 26220 v0.AuxInt = c 26221 v0.AddArg(x) 26222 v0.AddArg(y) 26223 b.SetControl(v0) 26224 b.Aux = nil 26225 return true 26226 } 26227 // match: (LE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 26228 // cond: l.Uses==1 26229 // result: (LE (CMNshiftRL x y [c]) yes no) 26230 for { 26231 v := b.Control 26232 if v.Op != OpARMCMPconst { 26233 break 26234 } 26235 if v.AuxInt != 0 { 26236 break 26237 } 26238 l := v.Args[0] 26239 if l.Op != OpARMADDshiftRL { 26240 break 26241 } 26242 c := l.AuxInt 26243 _ = l.Args[1] 26244 x := l.Args[0] 26245 y := l.Args[1] 26246 if !(l.Uses == 1) { 26247 break 26248 } 26249 b.Kind = BlockARMLE 26250 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 26251 v0.AuxInt = c 26252 v0.AddArg(x) 26253 v0.AddArg(y) 26254 b.SetControl(v0) 26255 b.Aux = nil 26256 return true 26257 } 26258 // match: (LE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 26259 // cond: l.Uses==1 26260 // result: (LE (CMNshiftRA x y [c]) yes no) 26261 for { 26262 v := b.Control 26263 if v.Op != OpARMCMPconst { 26264 break 26265 } 26266 if v.AuxInt != 0 { 26267 break 26268 } 26269 l := v.Args[0] 26270 if l.Op != OpARMADDshiftRA { 26271 break 26272 } 26273 c := l.AuxInt 26274 _ = l.Args[1] 26275 x := l.Args[0] 26276 y := l.Args[1] 26277 if !(l.Uses == 1) { 26278 break 26279 } 26280 b.Kind = BlockARMLE 26281 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 26282 v0.AuxInt = c 26283 v0.AddArg(x) 26284 v0.AddArg(y) 26285 b.SetControl(v0) 26286 b.Aux = nil 26287 return true 26288 } 26289 // match: (LE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 26290 // cond: l.Uses==1 26291 // result: (LE (CMNshiftLLreg x y z) yes no) 26292 for { 26293 v := b.Control 26294 if v.Op != OpARMCMPconst { 26295 break 26296 } 26297 if v.AuxInt != 0 { 26298 break 26299 } 26300 l := v.Args[0] 26301 if l.Op != OpARMADDshiftLLreg { 26302 break 26303 } 26304 _ = l.Args[2] 26305 x := l.Args[0] 26306 y := l.Args[1] 26307 z := l.Args[2] 26308 if !(l.Uses == 1) { 26309 break 26310 } 26311 b.Kind = BlockARMLE 26312 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 26313 v0.AddArg(x) 26314 v0.AddArg(y) 26315 v0.AddArg(z) 26316 b.SetControl(v0) 26317 b.Aux = nil 26318 return true 26319 } 26320 // match: (LE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 26321 // cond: l.Uses==1 26322 // result: (LE (CMNshiftRLreg x y z) yes no) 26323 for { 26324 v := b.Control 26325 if v.Op != OpARMCMPconst { 26326 break 26327 } 26328 if v.AuxInt != 0 { 26329 break 26330 } 26331 l := v.Args[0] 26332 if l.Op != OpARMADDshiftRLreg { 26333 break 26334 } 26335 _ = l.Args[2] 26336 x := l.Args[0] 26337 y := l.Args[1] 26338 z := l.Args[2] 26339 if !(l.Uses == 1) { 26340 break 26341 } 26342 b.Kind = BlockARMLE 26343 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 26344 v0.AddArg(x) 26345 v0.AddArg(y) 26346 v0.AddArg(z) 26347 b.SetControl(v0) 26348 b.Aux = nil 26349 return true 26350 } 26351 // match: (LE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 26352 // cond: l.Uses==1 26353 // result: (LE (CMNshiftRAreg x y z) yes no) 26354 for { 26355 v := b.Control 26356 if v.Op != OpARMCMPconst { 26357 break 26358 } 26359 if v.AuxInt != 0 { 26360 break 26361 } 26362 l := v.Args[0] 26363 if l.Op != OpARMADDshiftRAreg { 26364 break 26365 } 26366 _ = l.Args[2] 26367 x := l.Args[0] 26368 y := l.Args[1] 26369 z := l.Args[2] 26370 if !(l.Uses == 1) { 26371 break 26372 } 26373 b.Kind = BlockARMLE 26374 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 26375 v0.AddArg(x) 26376 v0.AddArg(y) 26377 v0.AddArg(z) 26378 b.SetControl(v0) 26379 b.Aux = nil 26380 return true 26381 } 26382 // match: (LE (CMPconst [0] l:(AND x y)) yes no) 26383 // cond: l.Uses==1 26384 // result: (LE (TST x y) yes no) 26385 for { 26386 v := b.Control 26387 if v.Op != OpARMCMPconst { 26388 break 26389 } 26390 if v.AuxInt != 0 { 26391 break 26392 } 26393 l := v.Args[0] 26394 if l.Op != OpARMAND { 26395 break 26396 } 26397 _ = l.Args[1] 26398 x := l.Args[0] 26399 y := l.Args[1] 26400 if !(l.Uses == 1) { 26401 break 26402 } 26403 b.Kind = BlockARMLE 26404 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 26405 v0.AddArg(x) 26406 v0.AddArg(y) 26407 b.SetControl(v0) 26408 b.Aux = nil 26409 return true 26410 } 26411 // match: (LE (CMPconst [0] l:(ANDconst [c] x)) yes no) 26412 // cond: l.Uses==1 26413 // result: (LE (TSTconst [c] x) yes no) 26414 for { 26415 v := b.Control 26416 if v.Op != OpARMCMPconst { 26417 break 26418 } 26419 if v.AuxInt != 0 { 26420 break 26421 } 26422 l := v.Args[0] 26423 if l.Op != OpARMANDconst { 26424 break 26425 } 26426 c := l.AuxInt 26427 x := l.Args[0] 26428 if !(l.Uses == 1) { 26429 break 26430 } 26431 b.Kind = BlockARMLE 26432 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 26433 v0.AuxInt = c 26434 v0.AddArg(x) 26435 b.SetControl(v0) 26436 b.Aux = nil 26437 return true 26438 } 26439 // match: (LE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 26440 // cond: l.Uses==1 26441 // result: (LE (TSTshiftLL x y [c]) yes no) 26442 for { 26443 v := b.Control 26444 if v.Op != OpARMCMPconst { 26445 break 26446 } 26447 if v.AuxInt != 0 { 26448 break 26449 } 26450 l := v.Args[0] 26451 if l.Op != OpARMANDshiftLL { 26452 break 26453 } 26454 c := l.AuxInt 26455 _ = l.Args[1] 26456 x := l.Args[0] 26457 y := l.Args[1] 26458 if !(l.Uses == 1) { 26459 break 26460 } 26461 b.Kind = BlockARMLE 26462 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 26463 v0.AuxInt = c 26464 v0.AddArg(x) 26465 v0.AddArg(y) 26466 b.SetControl(v0) 26467 b.Aux = nil 26468 return true 26469 } 26470 // match: (LE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 26471 // cond: l.Uses==1 26472 // result: (LE (TSTshiftRL x y [c]) yes no) 26473 for { 26474 v := b.Control 26475 if v.Op != OpARMCMPconst { 26476 break 26477 } 26478 if v.AuxInt != 0 { 26479 break 26480 } 26481 l := v.Args[0] 26482 if l.Op != OpARMANDshiftRL { 26483 break 26484 } 26485 c := l.AuxInt 26486 _ = l.Args[1] 26487 x := l.Args[0] 26488 y := l.Args[1] 26489 if !(l.Uses == 1) { 26490 break 26491 } 26492 b.Kind = BlockARMLE 26493 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 26494 v0.AuxInt = c 26495 v0.AddArg(x) 26496 v0.AddArg(y) 26497 b.SetControl(v0) 26498 b.Aux = nil 26499 return true 26500 } 26501 // match: (LE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 26502 // cond: l.Uses==1 26503 // result: (LE (TSTshiftRA x y [c]) yes no) 26504 for { 26505 v := b.Control 26506 if v.Op != OpARMCMPconst { 26507 break 26508 } 26509 if v.AuxInt != 0 { 26510 break 26511 } 26512 l := v.Args[0] 26513 if l.Op != OpARMANDshiftRA { 26514 break 26515 } 26516 c := l.AuxInt 26517 _ = l.Args[1] 26518 x := l.Args[0] 26519 y := l.Args[1] 26520 if !(l.Uses == 1) { 26521 break 26522 } 26523 b.Kind = BlockARMLE 26524 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 26525 v0.AuxInt = c 26526 v0.AddArg(x) 26527 v0.AddArg(y) 26528 b.SetControl(v0) 26529 b.Aux = nil 26530 return true 26531 } 26532 // match: (LE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 26533 // cond: l.Uses==1 26534 // result: (LE (TSTshiftLLreg x y z) yes no) 26535 for { 26536 v := b.Control 26537 if v.Op != OpARMCMPconst { 26538 break 26539 } 26540 if v.AuxInt != 0 { 26541 break 26542 } 26543 l := v.Args[0] 26544 if l.Op != OpARMANDshiftLLreg { 26545 break 26546 } 26547 _ = l.Args[2] 26548 x := l.Args[0] 26549 y := l.Args[1] 26550 z := l.Args[2] 26551 if !(l.Uses == 1) { 26552 break 26553 } 26554 b.Kind = BlockARMLE 26555 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 26556 v0.AddArg(x) 26557 v0.AddArg(y) 26558 v0.AddArg(z) 26559 b.SetControl(v0) 26560 b.Aux = nil 26561 return true 26562 } 26563 // match: (LE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 26564 // cond: l.Uses==1 26565 // result: (LE (TSTshiftRLreg x y z) yes no) 26566 for { 26567 v := b.Control 26568 if v.Op != OpARMCMPconst { 26569 break 26570 } 26571 if v.AuxInt != 0 { 26572 break 26573 } 26574 l := v.Args[0] 26575 if l.Op != OpARMANDshiftRLreg { 26576 break 26577 } 26578 _ = l.Args[2] 26579 x := l.Args[0] 26580 y := l.Args[1] 26581 z := l.Args[2] 26582 if !(l.Uses == 1) { 26583 break 26584 } 26585 b.Kind = BlockARMLE 26586 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 26587 v0.AddArg(x) 26588 v0.AddArg(y) 26589 v0.AddArg(z) 26590 b.SetControl(v0) 26591 b.Aux = nil 26592 return true 26593 } 26594 // match: (LE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 26595 // cond: l.Uses==1 26596 // result: (LE (TSTshiftRAreg x y z) yes no) 26597 for { 26598 v := b.Control 26599 if v.Op != OpARMCMPconst { 26600 break 26601 } 26602 if v.AuxInt != 0 { 26603 break 26604 } 26605 l := v.Args[0] 26606 if l.Op != OpARMANDshiftRAreg { 26607 break 26608 } 26609 _ = l.Args[2] 26610 x := l.Args[0] 26611 y := l.Args[1] 26612 z := l.Args[2] 26613 if !(l.Uses == 1) { 26614 break 26615 } 26616 b.Kind = BlockARMLE 26617 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 26618 v0.AddArg(x) 26619 v0.AddArg(y) 26620 v0.AddArg(z) 26621 b.SetControl(v0) 26622 b.Aux = nil 26623 return true 26624 } 26625 // match: (LE (CMPconst [0] l:(XOR x y)) yes no) 26626 // cond: l.Uses==1 26627 // result: (LE (TEQ x y) yes no) 26628 for { 26629 v := b.Control 26630 if v.Op != OpARMCMPconst { 26631 break 26632 } 26633 if v.AuxInt != 0 { 26634 break 26635 } 26636 l := v.Args[0] 26637 if l.Op != OpARMXOR { 26638 break 26639 } 26640 _ = l.Args[1] 26641 x := l.Args[0] 26642 y := l.Args[1] 26643 if !(l.Uses == 1) { 26644 break 26645 } 26646 b.Kind = BlockARMLE 26647 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 26648 v0.AddArg(x) 26649 v0.AddArg(y) 26650 b.SetControl(v0) 26651 b.Aux = nil 26652 return true 26653 } 26654 // match: (LE (CMPconst [0] l:(XORconst [c] x)) yes no) 26655 // cond: l.Uses==1 26656 // result: (LE (TEQconst [c] x) yes no) 26657 for { 26658 v := b.Control 26659 if v.Op != OpARMCMPconst { 26660 break 26661 } 26662 if v.AuxInt != 0 { 26663 break 26664 } 26665 l := v.Args[0] 26666 if l.Op != OpARMXORconst { 26667 break 26668 } 26669 c := l.AuxInt 26670 x := l.Args[0] 26671 if !(l.Uses == 1) { 26672 break 26673 } 26674 b.Kind = BlockARMLE 26675 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 26676 v0.AuxInt = c 26677 v0.AddArg(x) 26678 b.SetControl(v0) 26679 b.Aux = nil 26680 return true 26681 } 26682 // match: (LE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 26683 // cond: l.Uses==1 26684 // result: (LE (TEQshiftLL x y [c]) yes no) 26685 for { 26686 v := b.Control 26687 if v.Op != OpARMCMPconst { 26688 break 26689 } 26690 if v.AuxInt != 0 { 26691 break 26692 } 26693 l := v.Args[0] 26694 if l.Op != OpARMXORshiftLL { 26695 break 26696 } 26697 c := l.AuxInt 26698 _ = l.Args[1] 26699 x := l.Args[0] 26700 y := l.Args[1] 26701 if !(l.Uses == 1) { 26702 break 26703 } 26704 b.Kind = BlockARMLE 26705 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 26706 v0.AuxInt = c 26707 v0.AddArg(x) 26708 v0.AddArg(y) 26709 b.SetControl(v0) 26710 b.Aux = nil 26711 return true 26712 } 26713 // match: (LE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 26714 // cond: l.Uses==1 26715 // result: (LE (TEQshiftRL x y [c]) yes no) 26716 for { 26717 v := b.Control 26718 if v.Op != OpARMCMPconst { 26719 break 26720 } 26721 if v.AuxInt != 0 { 26722 break 26723 } 26724 l := v.Args[0] 26725 if l.Op != OpARMXORshiftRL { 26726 break 26727 } 26728 c := l.AuxInt 26729 _ = l.Args[1] 26730 x := l.Args[0] 26731 y := l.Args[1] 26732 if !(l.Uses == 1) { 26733 break 26734 } 26735 b.Kind = BlockARMLE 26736 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 26737 v0.AuxInt = c 26738 v0.AddArg(x) 26739 v0.AddArg(y) 26740 b.SetControl(v0) 26741 b.Aux = nil 26742 return true 26743 } 26744 // match: (LE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 26745 // cond: l.Uses==1 26746 // result: (LE (TEQshiftRA x y [c]) yes no) 26747 for { 26748 v := b.Control 26749 if v.Op != OpARMCMPconst { 26750 break 26751 } 26752 if v.AuxInt != 0 { 26753 break 26754 } 26755 l := v.Args[0] 26756 if l.Op != OpARMXORshiftRA { 26757 break 26758 } 26759 c := l.AuxInt 26760 _ = l.Args[1] 26761 x := l.Args[0] 26762 y := l.Args[1] 26763 if !(l.Uses == 1) { 26764 break 26765 } 26766 b.Kind = BlockARMLE 26767 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 26768 v0.AuxInt = c 26769 v0.AddArg(x) 26770 v0.AddArg(y) 26771 b.SetControl(v0) 26772 b.Aux = nil 26773 return true 26774 } 26775 // match: (LE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 26776 // cond: l.Uses==1 26777 // result: (LE (TEQshiftLLreg x y z) yes no) 26778 for { 26779 v := b.Control 26780 if v.Op != OpARMCMPconst { 26781 break 26782 } 26783 if v.AuxInt != 0 { 26784 break 26785 } 26786 l := v.Args[0] 26787 if l.Op != OpARMXORshiftLLreg { 26788 break 26789 } 26790 _ = l.Args[2] 26791 x := l.Args[0] 26792 y := l.Args[1] 26793 z := l.Args[2] 26794 if !(l.Uses == 1) { 26795 break 26796 } 26797 b.Kind = BlockARMLE 26798 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 26799 v0.AddArg(x) 26800 v0.AddArg(y) 26801 v0.AddArg(z) 26802 b.SetControl(v0) 26803 b.Aux = nil 26804 return true 26805 } 26806 // match: (LE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 26807 // cond: l.Uses==1 26808 // result: (LE (TEQshiftRLreg x y z) yes no) 26809 for { 26810 v := b.Control 26811 if v.Op != OpARMCMPconst { 26812 break 26813 } 26814 if v.AuxInt != 0 { 26815 break 26816 } 26817 l := v.Args[0] 26818 if l.Op != OpARMXORshiftRLreg { 26819 break 26820 } 26821 _ = l.Args[2] 26822 x := l.Args[0] 26823 y := l.Args[1] 26824 z := l.Args[2] 26825 if !(l.Uses == 1) { 26826 break 26827 } 26828 b.Kind = BlockARMLE 26829 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 26830 v0.AddArg(x) 26831 v0.AddArg(y) 26832 v0.AddArg(z) 26833 b.SetControl(v0) 26834 b.Aux = nil 26835 return true 26836 } 26837 // match: (LE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 26838 // cond: l.Uses==1 26839 // result: (LE (TEQshiftRAreg x y z) yes no) 26840 for { 26841 v := b.Control 26842 if v.Op != OpARMCMPconst { 26843 break 26844 } 26845 if v.AuxInt != 0 { 26846 break 26847 } 26848 l := v.Args[0] 26849 if l.Op != OpARMXORshiftRAreg { 26850 break 26851 } 26852 _ = l.Args[2] 26853 x := l.Args[0] 26854 y := l.Args[1] 26855 z := l.Args[2] 26856 if !(l.Uses == 1) { 26857 break 26858 } 26859 b.Kind = BlockARMLE 26860 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 26861 v0.AddArg(x) 26862 v0.AddArg(y) 26863 v0.AddArg(z) 26864 b.SetControl(v0) 26865 b.Aux = nil 26866 return true 26867 } 26868 case BlockARMLT: 26869 // match: (LT (FlagEQ) yes no) 26870 // cond: 26871 // result: (First nil no yes) 26872 for { 26873 v := b.Control 26874 if v.Op != OpARMFlagEQ { 26875 break 26876 } 26877 b.Kind = BlockFirst 26878 b.SetControl(nil) 26879 b.Aux = nil 26880 b.swapSuccessors() 26881 return true 26882 } 26883 // match: (LT (FlagLT_ULT) yes no) 26884 // cond: 26885 // result: (First nil yes no) 26886 for { 26887 v := b.Control 26888 if v.Op != OpARMFlagLT_ULT { 26889 break 26890 } 26891 b.Kind = BlockFirst 26892 b.SetControl(nil) 26893 b.Aux = nil 26894 return true 26895 } 26896 // match: (LT (FlagLT_UGT) yes no) 26897 // cond: 26898 // result: (First nil yes no) 26899 for { 26900 v := b.Control 26901 if v.Op != OpARMFlagLT_UGT { 26902 break 26903 } 26904 b.Kind = BlockFirst 26905 b.SetControl(nil) 26906 b.Aux = nil 26907 return true 26908 } 26909 // match: (LT (FlagGT_ULT) yes no) 26910 // cond: 26911 // result: (First nil no yes) 26912 for { 26913 v := b.Control 26914 if v.Op != OpARMFlagGT_ULT { 26915 break 26916 } 26917 b.Kind = BlockFirst 26918 b.SetControl(nil) 26919 b.Aux = nil 26920 b.swapSuccessors() 26921 return true 26922 } 26923 // match: (LT (FlagGT_UGT) yes no) 26924 // cond: 26925 // result: (First nil no yes) 26926 for { 26927 v := b.Control 26928 if v.Op != OpARMFlagGT_UGT { 26929 break 26930 } 26931 b.Kind = BlockFirst 26932 b.SetControl(nil) 26933 b.Aux = nil 26934 b.swapSuccessors() 26935 return true 26936 } 26937 // match: (LT (InvertFlags cmp) yes no) 26938 // cond: 26939 // result: (GT cmp yes no) 26940 for { 26941 v := b.Control 26942 if v.Op != OpARMInvertFlags { 26943 break 26944 } 26945 cmp := v.Args[0] 26946 b.Kind = BlockARMGT 26947 b.SetControl(cmp) 26948 b.Aux = nil 26949 return true 26950 } 26951 // match: (LT (CMPconst [0] l:(SUB x y)) yes no) 26952 // cond: l.Uses==1 26953 // result: (LT (CMP x y) yes no) 26954 for { 26955 v := b.Control 26956 if v.Op != OpARMCMPconst { 26957 break 26958 } 26959 if v.AuxInt != 0 { 26960 break 26961 } 26962 l := v.Args[0] 26963 if l.Op != OpARMSUB { 26964 break 26965 } 26966 _ = l.Args[1] 26967 x := l.Args[0] 26968 y := l.Args[1] 26969 if !(l.Uses == 1) { 26970 break 26971 } 26972 b.Kind = BlockARMLT 26973 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 26974 v0.AddArg(x) 26975 v0.AddArg(y) 26976 b.SetControl(v0) 26977 b.Aux = nil 26978 return true 26979 } 26980 // match: (LT (CMPconst [0] l:(MULS x y a)) yes no) 26981 // cond: l.Uses==1 26982 // result: (LT (CMP a (MUL <x.Type> x y)) yes no) 26983 for { 26984 v := b.Control 26985 if v.Op != OpARMCMPconst { 26986 break 26987 } 26988 if v.AuxInt != 0 { 26989 break 26990 } 26991 l := v.Args[0] 26992 if l.Op != OpARMMULS { 26993 break 26994 } 26995 _ = l.Args[2] 26996 x := l.Args[0] 26997 y := l.Args[1] 26998 a := l.Args[2] 26999 if !(l.Uses == 1) { 27000 break 27001 } 27002 b.Kind = BlockARMLT 27003 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 27004 v0.AddArg(a) 27005 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 27006 v1.AddArg(x) 27007 v1.AddArg(y) 27008 v0.AddArg(v1) 27009 b.SetControl(v0) 27010 b.Aux = nil 27011 return true 27012 } 27013 // match: (LT (CMPconst [0] l:(SUBconst [c] x)) yes no) 27014 // cond: l.Uses==1 27015 // result: (LT (CMPconst [c] x) yes no) 27016 for { 27017 v := b.Control 27018 if v.Op != OpARMCMPconst { 27019 break 27020 } 27021 if v.AuxInt != 0 { 27022 break 27023 } 27024 l := v.Args[0] 27025 if l.Op != OpARMSUBconst { 27026 break 27027 } 27028 c := l.AuxInt 27029 x := l.Args[0] 27030 if !(l.Uses == 1) { 27031 break 27032 } 27033 b.Kind = BlockARMLT 27034 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 27035 v0.AuxInt = c 27036 v0.AddArg(x) 27037 b.SetControl(v0) 27038 b.Aux = nil 27039 return true 27040 } 27041 // match: (LT (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 27042 // cond: l.Uses==1 27043 // result: (LT (CMPshiftLL x y [c]) yes no) 27044 for { 27045 v := b.Control 27046 if v.Op != OpARMCMPconst { 27047 break 27048 } 27049 if v.AuxInt != 0 { 27050 break 27051 } 27052 l := v.Args[0] 27053 if l.Op != OpARMSUBshiftLL { 27054 break 27055 } 27056 c := l.AuxInt 27057 _ = l.Args[1] 27058 x := l.Args[0] 27059 y := l.Args[1] 27060 if !(l.Uses == 1) { 27061 break 27062 } 27063 b.Kind = BlockARMLT 27064 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 27065 v0.AuxInt = c 27066 v0.AddArg(x) 27067 v0.AddArg(y) 27068 b.SetControl(v0) 27069 b.Aux = nil 27070 return true 27071 } 27072 // match: (LT (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 27073 // cond: l.Uses==1 27074 // result: (LT (CMPshiftRL x y [c]) yes no) 27075 for { 27076 v := b.Control 27077 if v.Op != OpARMCMPconst { 27078 break 27079 } 27080 if v.AuxInt != 0 { 27081 break 27082 } 27083 l := v.Args[0] 27084 if l.Op != OpARMSUBshiftRL { 27085 break 27086 } 27087 c := l.AuxInt 27088 _ = l.Args[1] 27089 x := l.Args[0] 27090 y := l.Args[1] 27091 if !(l.Uses == 1) { 27092 break 27093 } 27094 b.Kind = BlockARMLT 27095 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 27096 v0.AuxInt = c 27097 v0.AddArg(x) 27098 v0.AddArg(y) 27099 b.SetControl(v0) 27100 b.Aux = nil 27101 return true 27102 } 27103 // match: (LT (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 27104 // cond: l.Uses==1 27105 // result: (LT (CMPshiftRA x y [c]) yes no) 27106 for { 27107 v := b.Control 27108 if v.Op != OpARMCMPconst { 27109 break 27110 } 27111 if v.AuxInt != 0 { 27112 break 27113 } 27114 l := v.Args[0] 27115 if l.Op != OpARMSUBshiftRA { 27116 break 27117 } 27118 c := l.AuxInt 27119 _ = l.Args[1] 27120 x := l.Args[0] 27121 y := l.Args[1] 27122 if !(l.Uses == 1) { 27123 break 27124 } 27125 b.Kind = BlockARMLT 27126 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 27127 v0.AuxInt = c 27128 v0.AddArg(x) 27129 v0.AddArg(y) 27130 b.SetControl(v0) 27131 b.Aux = nil 27132 return true 27133 } 27134 // match: (LT (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 27135 // cond: l.Uses==1 27136 // result: (LT (CMPshiftLLreg x y z) yes no) 27137 for { 27138 v := b.Control 27139 if v.Op != OpARMCMPconst { 27140 break 27141 } 27142 if v.AuxInt != 0 { 27143 break 27144 } 27145 l := v.Args[0] 27146 if l.Op != OpARMSUBshiftLLreg { 27147 break 27148 } 27149 _ = l.Args[2] 27150 x := l.Args[0] 27151 y := l.Args[1] 27152 z := l.Args[2] 27153 if !(l.Uses == 1) { 27154 break 27155 } 27156 b.Kind = BlockARMLT 27157 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 27158 v0.AddArg(x) 27159 v0.AddArg(y) 27160 v0.AddArg(z) 27161 b.SetControl(v0) 27162 b.Aux = nil 27163 return true 27164 } 27165 // match: (LT (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 27166 // cond: l.Uses==1 27167 // result: (LT (CMPshiftRLreg x y z) yes no) 27168 for { 27169 v := b.Control 27170 if v.Op != OpARMCMPconst { 27171 break 27172 } 27173 if v.AuxInt != 0 { 27174 break 27175 } 27176 l := v.Args[0] 27177 if l.Op != OpARMSUBshiftRLreg { 27178 break 27179 } 27180 _ = l.Args[2] 27181 x := l.Args[0] 27182 y := l.Args[1] 27183 z := l.Args[2] 27184 if !(l.Uses == 1) { 27185 break 27186 } 27187 b.Kind = BlockARMLT 27188 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 27189 v0.AddArg(x) 27190 v0.AddArg(y) 27191 v0.AddArg(z) 27192 b.SetControl(v0) 27193 b.Aux = nil 27194 return true 27195 } 27196 // match: (LT (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 27197 // cond: l.Uses==1 27198 // result: (LT (CMPshiftRAreg x y z) yes no) 27199 for { 27200 v := b.Control 27201 if v.Op != OpARMCMPconst { 27202 break 27203 } 27204 if v.AuxInt != 0 { 27205 break 27206 } 27207 l := v.Args[0] 27208 if l.Op != OpARMSUBshiftRAreg { 27209 break 27210 } 27211 _ = l.Args[2] 27212 x := l.Args[0] 27213 y := l.Args[1] 27214 z := l.Args[2] 27215 if !(l.Uses == 1) { 27216 break 27217 } 27218 b.Kind = BlockARMLT 27219 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 27220 v0.AddArg(x) 27221 v0.AddArg(y) 27222 v0.AddArg(z) 27223 b.SetControl(v0) 27224 b.Aux = nil 27225 return true 27226 } 27227 // match: (LT (CMPconst [0] l:(ADD x y)) yes no) 27228 // cond: l.Uses==1 27229 // result: (LT (CMN x y) yes no) 27230 for { 27231 v := b.Control 27232 if v.Op != OpARMCMPconst { 27233 break 27234 } 27235 if v.AuxInt != 0 { 27236 break 27237 } 27238 l := v.Args[0] 27239 if l.Op != OpARMADD { 27240 break 27241 } 27242 _ = l.Args[1] 27243 x := l.Args[0] 27244 y := l.Args[1] 27245 if !(l.Uses == 1) { 27246 break 27247 } 27248 b.Kind = BlockARMLT 27249 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 27250 v0.AddArg(x) 27251 v0.AddArg(y) 27252 b.SetControl(v0) 27253 b.Aux = nil 27254 return true 27255 } 27256 // match: (LT (CMPconst [0] l:(MULA x y a)) yes no) 27257 // cond: l.Uses==1 27258 // result: (LT (CMN a (MUL <x.Type> x y)) yes no) 27259 for { 27260 v := b.Control 27261 if v.Op != OpARMCMPconst { 27262 break 27263 } 27264 if v.AuxInt != 0 { 27265 break 27266 } 27267 l := v.Args[0] 27268 if l.Op != OpARMMULA { 27269 break 27270 } 27271 _ = l.Args[2] 27272 x := l.Args[0] 27273 y := l.Args[1] 27274 a := l.Args[2] 27275 if !(l.Uses == 1) { 27276 break 27277 } 27278 b.Kind = BlockARMLT 27279 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 27280 v0.AddArg(a) 27281 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 27282 v1.AddArg(x) 27283 v1.AddArg(y) 27284 v0.AddArg(v1) 27285 b.SetControl(v0) 27286 b.Aux = nil 27287 return true 27288 } 27289 // match: (LT (CMPconst [0] l:(ADDconst [c] x)) yes no) 27290 // cond: l.Uses==1 27291 // result: (LT (CMNconst [c] x) yes no) 27292 for { 27293 v := b.Control 27294 if v.Op != OpARMCMPconst { 27295 break 27296 } 27297 if v.AuxInt != 0 { 27298 break 27299 } 27300 l := v.Args[0] 27301 if l.Op != OpARMADDconst { 27302 break 27303 } 27304 c := l.AuxInt 27305 x := l.Args[0] 27306 if !(l.Uses == 1) { 27307 break 27308 } 27309 b.Kind = BlockARMLT 27310 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 27311 v0.AuxInt = c 27312 v0.AddArg(x) 27313 b.SetControl(v0) 27314 b.Aux = nil 27315 return true 27316 } 27317 // match: (LT (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 27318 // cond: l.Uses==1 27319 // result: (LT (CMNshiftLL x y [c]) yes no) 27320 for { 27321 v := b.Control 27322 if v.Op != OpARMCMPconst { 27323 break 27324 } 27325 if v.AuxInt != 0 { 27326 break 27327 } 27328 l := v.Args[0] 27329 if l.Op != OpARMADDshiftLL { 27330 break 27331 } 27332 c := l.AuxInt 27333 _ = l.Args[1] 27334 x := l.Args[0] 27335 y := l.Args[1] 27336 if !(l.Uses == 1) { 27337 break 27338 } 27339 b.Kind = BlockARMLT 27340 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 27341 v0.AuxInt = c 27342 v0.AddArg(x) 27343 v0.AddArg(y) 27344 b.SetControl(v0) 27345 b.Aux = nil 27346 return true 27347 } 27348 // match: (LT (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 27349 // cond: l.Uses==1 27350 // result: (LT (CMNshiftRL x y [c]) yes no) 27351 for { 27352 v := b.Control 27353 if v.Op != OpARMCMPconst { 27354 break 27355 } 27356 if v.AuxInt != 0 { 27357 break 27358 } 27359 l := v.Args[0] 27360 if l.Op != OpARMADDshiftRL { 27361 break 27362 } 27363 c := l.AuxInt 27364 _ = l.Args[1] 27365 x := l.Args[0] 27366 y := l.Args[1] 27367 if !(l.Uses == 1) { 27368 break 27369 } 27370 b.Kind = BlockARMLT 27371 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 27372 v0.AuxInt = c 27373 v0.AddArg(x) 27374 v0.AddArg(y) 27375 b.SetControl(v0) 27376 b.Aux = nil 27377 return true 27378 } 27379 // match: (LT (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 27380 // cond: l.Uses==1 27381 // result: (LT (CMNshiftRA x y [c]) yes no) 27382 for { 27383 v := b.Control 27384 if v.Op != OpARMCMPconst { 27385 break 27386 } 27387 if v.AuxInt != 0 { 27388 break 27389 } 27390 l := v.Args[0] 27391 if l.Op != OpARMADDshiftRA { 27392 break 27393 } 27394 c := l.AuxInt 27395 _ = l.Args[1] 27396 x := l.Args[0] 27397 y := l.Args[1] 27398 if !(l.Uses == 1) { 27399 break 27400 } 27401 b.Kind = BlockARMLT 27402 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 27403 v0.AuxInt = c 27404 v0.AddArg(x) 27405 v0.AddArg(y) 27406 b.SetControl(v0) 27407 b.Aux = nil 27408 return true 27409 } 27410 // match: (LT (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 27411 // cond: l.Uses==1 27412 // result: (LT (CMNshiftLLreg x y z) yes no) 27413 for { 27414 v := b.Control 27415 if v.Op != OpARMCMPconst { 27416 break 27417 } 27418 if v.AuxInt != 0 { 27419 break 27420 } 27421 l := v.Args[0] 27422 if l.Op != OpARMADDshiftLLreg { 27423 break 27424 } 27425 _ = l.Args[2] 27426 x := l.Args[0] 27427 y := l.Args[1] 27428 z := l.Args[2] 27429 if !(l.Uses == 1) { 27430 break 27431 } 27432 b.Kind = BlockARMLT 27433 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 27434 v0.AddArg(x) 27435 v0.AddArg(y) 27436 v0.AddArg(z) 27437 b.SetControl(v0) 27438 b.Aux = nil 27439 return true 27440 } 27441 // match: (LT (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 27442 // cond: l.Uses==1 27443 // result: (LT (CMNshiftRLreg x y z) yes no) 27444 for { 27445 v := b.Control 27446 if v.Op != OpARMCMPconst { 27447 break 27448 } 27449 if v.AuxInt != 0 { 27450 break 27451 } 27452 l := v.Args[0] 27453 if l.Op != OpARMADDshiftRLreg { 27454 break 27455 } 27456 _ = l.Args[2] 27457 x := l.Args[0] 27458 y := l.Args[1] 27459 z := l.Args[2] 27460 if !(l.Uses == 1) { 27461 break 27462 } 27463 b.Kind = BlockARMLT 27464 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 27465 v0.AddArg(x) 27466 v0.AddArg(y) 27467 v0.AddArg(z) 27468 b.SetControl(v0) 27469 b.Aux = nil 27470 return true 27471 } 27472 // match: (LT (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 27473 // cond: l.Uses==1 27474 // result: (LT (CMNshiftRAreg x y z) yes no) 27475 for { 27476 v := b.Control 27477 if v.Op != OpARMCMPconst { 27478 break 27479 } 27480 if v.AuxInt != 0 { 27481 break 27482 } 27483 l := v.Args[0] 27484 if l.Op != OpARMADDshiftRAreg { 27485 break 27486 } 27487 _ = l.Args[2] 27488 x := l.Args[0] 27489 y := l.Args[1] 27490 z := l.Args[2] 27491 if !(l.Uses == 1) { 27492 break 27493 } 27494 b.Kind = BlockARMLT 27495 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 27496 v0.AddArg(x) 27497 v0.AddArg(y) 27498 v0.AddArg(z) 27499 b.SetControl(v0) 27500 b.Aux = nil 27501 return true 27502 } 27503 // match: (LT (CMPconst [0] l:(AND x y)) yes no) 27504 // cond: l.Uses==1 27505 // result: (LT (TST x y) yes no) 27506 for { 27507 v := b.Control 27508 if v.Op != OpARMCMPconst { 27509 break 27510 } 27511 if v.AuxInt != 0 { 27512 break 27513 } 27514 l := v.Args[0] 27515 if l.Op != OpARMAND { 27516 break 27517 } 27518 _ = l.Args[1] 27519 x := l.Args[0] 27520 y := l.Args[1] 27521 if !(l.Uses == 1) { 27522 break 27523 } 27524 b.Kind = BlockARMLT 27525 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 27526 v0.AddArg(x) 27527 v0.AddArg(y) 27528 b.SetControl(v0) 27529 b.Aux = nil 27530 return true 27531 } 27532 // match: (LT (CMPconst [0] l:(ANDconst [c] x)) yes no) 27533 // cond: l.Uses==1 27534 // result: (LT (TSTconst [c] x) yes no) 27535 for { 27536 v := b.Control 27537 if v.Op != OpARMCMPconst { 27538 break 27539 } 27540 if v.AuxInt != 0 { 27541 break 27542 } 27543 l := v.Args[0] 27544 if l.Op != OpARMANDconst { 27545 break 27546 } 27547 c := l.AuxInt 27548 x := l.Args[0] 27549 if !(l.Uses == 1) { 27550 break 27551 } 27552 b.Kind = BlockARMLT 27553 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 27554 v0.AuxInt = c 27555 v0.AddArg(x) 27556 b.SetControl(v0) 27557 b.Aux = nil 27558 return true 27559 } 27560 // match: (LT (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 27561 // cond: l.Uses==1 27562 // result: (LT (TSTshiftLL x y [c]) yes no) 27563 for { 27564 v := b.Control 27565 if v.Op != OpARMCMPconst { 27566 break 27567 } 27568 if v.AuxInt != 0 { 27569 break 27570 } 27571 l := v.Args[0] 27572 if l.Op != OpARMANDshiftLL { 27573 break 27574 } 27575 c := l.AuxInt 27576 _ = l.Args[1] 27577 x := l.Args[0] 27578 y := l.Args[1] 27579 if !(l.Uses == 1) { 27580 break 27581 } 27582 b.Kind = BlockARMLT 27583 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 27584 v0.AuxInt = c 27585 v0.AddArg(x) 27586 v0.AddArg(y) 27587 b.SetControl(v0) 27588 b.Aux = nil 27589 return true 27590 } 27591 // match: (LT (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 27592 // cond: l.Uses==1 27593 // result: (LT (TSTshiftRL x y [c]) yes no) 27594 for { 27595 v := b.Control 27596 if v.Op != OpARMCMPconst { 27597 break 27598 } 27599 if v.AuxInt != 0 { 27600 break 27601 } 27602 l := v.Args[0] 27603 if l.Op != OpARMANDshiftRL { 27604 break 27605 } 27606 c := l.AuxInt 27607 _ = l.Args[1] 27608 x := l.Args[0] 27609 y := l.Args[1] 27610 if !(l.Uses == 1) { 27611 break 27612 } 27613 b.Kind = BlockARMLT 27614 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 27615 v0.AuxInt = c 27616 v0.AddArg(x) 27617 v0.AddArg(y) 27618 b.SetControl(v0) 27619 b.Aux = nil 27620 return true 27621 } 27622 // match: (LT (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 27623 // cond: l.Uses==1 27624 // result: (LT (TSTshiftRA x y [c]) yes no) 27625 for { 27626 v := b.Control 27627 if v.Op != OpARMCMPconst { 27628 break 27629 } 27630 if v.AuxInt != 0 { 27631 break 27632 } 27633 l := v.Args[0] 27634 if l.Op != OpARMANDshiftRA { 27635 break 27636 } 27637 c := l.AuxInt 27638 _ = l.Args[1] 27639 x := l.Args[0] 27640 y := l.Args[1] 27641 if !(l.Uses == 1) { 27642 break 27643 } 27644 b.Kind = BlockARMLT 27645 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 27646 v0.AuxInt = c 27647 v0.AddArg(x) 27648 v0.AddArg(y) 27649 b.SetControl(v0) 27650 b.Aux = nil 27651 return true 27652 } 27653 // match: (LT (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 27654 // cond: l.Uses==1 27655 // result: (LT (TSTshiftLLreg x y z) yes no) 27656 for { 27657 v := b.Control 27658 if v.Op != OpARMCMPconst { 27659 break 27660 } 27661 if v.AuxInt != 0 { 27662 break 27663 } 27664 l := v.Args[0] 27665 if l.Op != OpARMANDshiftLLreg { 27666 break 27667 } 27668 _ = l.Args[2] 27669 x := l.Args[0] 27670 y := l.Args[1] 27671 z := l.Args[2] 27672 if !(l.Uses == 1) { 27673 break 27674 } 27675 b.Kind = BlockARMLT 27676 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 27677 v0.AddArg(x) 27678 v0.AddArg(y) 27679 v0.AddArg(z) 27680 b.SetControl(v0) 27681 b.Aux = nil 27682 return true 27683 } 27684 // match: (LT (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 27685 // cond: l.Uses==1 27686 // result: (LT (TSTshiftRLreg x y z) yes no) 27687 for { 27688 v := b.Control 27689 if v.Op != OpARMCMPconst { 27690 break 27691 } 27692 if v.AuxInt != 0 { 27693 break 27694 } 27695 l := v.Args[0] 27696 if l.Op != OpARMANDshiftRLreg { 27697 break 27698 } 27699 _ = l.Args[2] 27700 x := l.Args[0] 27701 y := l.Args[1] 27702 z := l.Args[2] 27703 if !(l.Uses == 1) { 27704 break 27705 } 27706 b.Kind = BlockARMLT 27707 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 27708 v0.AddArg(x) 27709 v0.AddArg(y) 27710 v0.AddArg(z) 27711 b.SetControl(v0) 27712 b.Aux = nil 27713 return true 27714 } 27715 // match: (LT (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 27716 // cond: l.Uses==1 27717 // result: (LT (TSTshiftRAreg x y z) yes no) 27718 for { 27719 v := b.Control 27720 if v.Op != OpARMCMPconst { 27721 break 27722 } 27723 if v.AuxInt != 0 { 27724 break 27725 } 27726 l := v.Args[0] 27727 if l.Op != OpARMANDshiftRAreg { 27728 break 27729 } 27730 _ = l.Args[2] 27731 x := l.Args[0] 27732 y := l.Args[1] 27733 z := l.Args[2] 27734 if !(l.Uses == 1) { 27735 break 27736 } 27737 b.Kind = BlockARMLT 27738 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 27739 v0.AddArg(x) 27740 v0.AddArg(y) 27741 v0.AddArg(z) 27742 b.SetControl(v0) 27743 b.Aux = nil 27744 return true 27745 } 27746 // match: (LT (CMPconst [0] l:(XOR x y)) yes no) 27747 // cond: l.Uses==1 27748 // result: (LT (TEQ x y) yes no) 27749 for { 27750 v := b.Control 27751 if v.Op != OpARMCMPconst { 27752 break 27753 } 27754 if v.AuxInt != 0 { 27755 break 27756 } 27757 l := v.Args[0] 27758 if l.Op != OpARMXOR { 27759 break 27760 } 27761 _ = l.Args[1] 27762 x := l.Args[0] 27763 y := l.Args[1] 27764 if !(l.Uses == 1) { 27765 break 27766 } 27767 b.Kind = BlockARMLT 27768 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 27769 v0.AddArg(x) 27770 v0.AddArg(y) 27771 b.SetControl(v0) 27772 b.Aux = nil 27773 return true 27774 } 27775 // match: (LT (CMPconst [0] l:(XORconst [c] x)) yes no) 27776 // cond: l.Uses==1 27777 // result: (LT (TEQconst [c] x) yes no) 27778 for { 27779 v := b.Control 27780 if v.Op != OpARMCMPconst { 27781 break 27782 } 27783 if v.AuxInt != 0 { 27784 break 27785 } 27786 l := v.Args[0] 27787 if l.Op != OpARMXORconst { 27788 break 27789 } 27790 c := l.AuxInt 27791 x := l.Args[0] 27792 if !(l.Uses == 1) { 27793 break 27794 } 27795 b.Kind = BlockARMLT 27796 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 27797 v0.AuxInt = c 27798 v0.AddArg(x) 27799 b.SetControl(v0) 27800 b.Aux = nil 27801 return true 27802 } 27803 // match: (LT (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 27804 // cond: l.Uses==1 27805 // result: (LT (TEQshiftLL x y [c]) yes no) 27806 for { 27807 v := b.Control 27808 if v.Op != OpARMCMPconst { 27809 break 27810 } 27811 if v.AuxInt != 0 { 27812 break 27813 } 27814 l := v.Args[0] 27815 if l.Op != OpARMXORshiftLL { 27816 break 27817 } 27818 c := l.AuxInt 27819 _ = l.Args[1] 27820 x := l.Args[0] 27821 y := l.Args[1] 27822 if !(l.Uses == 1) { 27823 break 27824 } 27825 b.Kind = BlockARMLT 27826 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 27827 v0.AuxInt = c 27828 v0.AddArg(x) 27829 v0.AddArg(y) 27830 b.SetControl(v0) 27831 b.Aux = nil 27832 return true 27833 } 27834 // match: (LT (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 27835 // cond: l.Uses==1 27836 // result: (LT (TEQshiftRL x y [c]) yes no) 27837 for { 27838 v := b.Control 27839 if v.Op != OpARMCMPconst { 27840 break 27841 } 27842 if v.AuxInt != 0 { 27843 break 27844 } 27845 l := v.Args[0] 27846 if l.Op != OpARMXORshiftRL { 27847 break 27848 } 27849 c := l.AuxInt 27850 _ = l.Args[1] 27851 x := l.Args[0] 27852 y := l.Args[1] 27853 if !(l.Uses == 1) { 27854 break 27855 } 27856 b.Kind = BlockARMLT 27857 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 27858 v0.AuxInt = c 27859 v0.AddArg(x) 27860 v0.AddArg(y) 27861 b.SetControl(v0) 27862 b.Aux = nil 27863 return true 27864 } 27865 // match: (LT (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 27866 // cond: l.Uses==1 27867 // result: (LT (TEQshiftRA x y [c]) yes no) 27868 for { 27869 v := b.Control 27870 if v.Op != OpARMCMPconst { 27871 break 27872 } 27873 if v.AuxInt != 0 { 27874 break 27875 } 27876 l := v.Args[0] 27877 if l.Op != OpARMXORshiftRA { 27878 break 27879 } 27880 c := l.AuxInt 27881 _ = l.Args[1] 27882 x := l.Args[0] 27883 y := l.Args[1] 27884 if !(l.Uses == 1) { 27885 break 27886 } 27887 b.Kind = BlockARMLT 27888 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 27889 v0.AuxInt = c 27890 v0.AddArg(x) 27891 v0.AddArg(y) 27892 b.SetControl(v0) 27893 b.Aux = nil 27894 return true 27895 } 27896 // match: (LT (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 27897 // cond: l.Uses==1 27898 // result: (LT (TEQshiftLLreg x y z) yes no) 27899 for { 27900 v := b.Control 27901 if v.Op != OpARMCMPconst { 27902 break 27903 } 27904 if v.AuxInt != 0 { 27905 break 27906 } 27907 l := v.Args[0] 27908 if l.Op != OpARMXORshiftLLreg { 27909 break 27910 } 27911 _ = l.Args[2] 27912 x := l.Args[0] 27913 y := l.Args[1] 27914 z := l.Args[2] 27915 if !(l.Uses == 1) { 27916 break 27917 } 27918 b.Kind = BlockARMLT 27919 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 27920 v0.AddArg(x) 27921 v0.AddArg(y) 27922 v0.AddArg(z) 27923 b.SetControl(v0) 27924 b.Aux = nil 27925 return true 27926 } 27927 // match: (LT (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 27928 // cond: l.Uses==1 27929 // result: (LT (TEQshiftRLreg x y z) yes no) 27930 for { 27931 v := b.Control 27932 if v.Op != OpARMCMPconst { 27933 break 27934 } 27935 if v.AuxInt != 0 { 27936 break 27937 } 27938 l := v.Args[0] 27939 if l.Op != OpARMXORshiftRLreg { 27940 break 27941 } 27942 _ = l.Args[2] 27943 x := l.Args[0] 27944 y := l.Args[1] 27945 z := l.Args[2] 27946 if !(l.Uses == 1) { 27947 break 27948 } 27949 b.Kind = BlockARMLT 27950 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 27951 v0.AddArg(x) 27952 v0.AddArg(y) 27953 v0.AddArg(z) 27954 b.SetControl(v0) 27955 b.Aux = nil 27956 return true 27957 } 27958 // match: (LT (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 27959 // cond: l.Uses==1 27960 // result: (LT (TEQshiftRAreg x y z) yes no) 27961 for { 27962 v := b.Control 27963 if v.Op != OpARMCMPconst { 27964 break 27965 } 27966 if v.AuxInt != 0 { 27967 break 27968 } 27969 l := v.Args[0] 27970 if l.Op != OpARMXORshiftRAreg { 27971 break 27972 } 27973 _ = l.Args[2] 27974 x := l.Args[0] 27975 y := l.Args[1] 27976 z := l.Args[2] 27977 if !(l.Uses == 1) { 27978 break 27979 } 27980 b.Kind = BlockARMLT 27981 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 27982 v0.AddArg(x) 27983 v0.AddArg(y) 27984 v0.AddArg(z) 27985 b.SetControl(v0) 27986 b.Aux = nil 27987 return true 27988 } 27989 case BlockARMNE: 27990 // match: (NE (CMPconst [0] (Equal cc)) yes no) 27991 // cond: 27992 // result: (EQ cc yes no) 27993 for { 27994 v := b.Control 27995 if v.Op != OpARMCMPconst { 27996 break 27997 } 27998 if v.AuxInt != 0 { 27999 break 28000 } 28001 v_0 := v.Args[0] 28002 if v_0.Op != OpARMEqual { 28003 break 28004 } 28005 cc := v_0.Args[0] 28006 b.Kind = BlockARMEQ 28007 b.SetControl(cc) 28008 b.Aux = nil 28009 return true 28010 } 28011 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 28012 // cond: 28013 // result: (NE cc yes no) 28014 for { 28015 v := b.Control 28016 if v.Op != OpARMCMPconst { 28017 break 28018 } 28019 if v.AuxInt != 0 { 28020 break 28021 } 28022 v_0 := v.Args[0] 28023 if v_0.Op != OpARMNotEqual { 28024 break 28025 } 28026 cc := v_0.Args[0] 28027 b.Kind = BlockARMNE 28028 b.SetControl(cc) 28029 b.Aux = nil 28030 return true 28031 } 28032 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 28033 // cond: 28034 // result: (LT cc yes no) 28035 for { 28036 v := b.Control 28037 if v.Op != OpARMCMPconst { 28038 break 28039 } 28040 if v.AuxInt != 0 { 28041 break 28042 } 28043 v_0 := v.Args[0] 28044 if v_0.Op != OpARMLessThan { 28045 break 28046 } 28047 cc := v_0.Args[0] 28048 b.Kind = BlockARMLT 28049 b.SetControl(cc) 28050 b.Aux = nil 28051 return true 28052 } 28053 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 28054 // cond: 28055 // result: (ULT cc yes no) 28056 for { 28057 v := b.Control 28058 if v.Op != OpARMCMPconst { 28059 break 28060 } 28061 if v.AuxInt != 0 { 28062 break 28063 } 28064 v_0 := v.Args[0] 28065 if v_0.Op != OpARMLessThanU { 28066 break 28067 } 28068 cc := v_0.Args[0] 28069 b.Kind = BlockARMULT 28070 b.SetControl(cc) 28071 b.Aux = nil 28072 return true 28073 } 28074 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 28075 // cond: 28076 // result: (LE cc yes no) 28077 for { 28078 v := b.Control 28079 if v.Op != OpARMCMPconst { 28080 break 28081 } 28082 if v.AuxInt != 0 { 28083 break 28084 } 28085 v_0 := v.Args[0] 28086 if v_0.Op != OpARMLessEqual { 28087 break 28088 } 28089 cc := v_0.Args[0] 28090 b.Kind = BlockARMLE 28091 b.SetControl(cc) 28092 b.Aux = nil 28093 return true 28094 } 28095 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 28096 // cond: 28097 // result: (ULE cc yes no) 28098 for { 28099 v := b.Control 28100 if v.Op != OpARMCMPconst { 28101 break 28102 } 28103 if v.AuxInt != 0 { 28104 break 28105 } 28106 v_0 := v.Args[0] 28107 if v_0.Op != OpARMLessEqualU { 28108 break 28109 } 28110 cc := v_0.Args[0] 28111 b.Kind = BlockARMULE 28112 b.SetControl(cc) 28113 b.Aux = nil 28114 return true 28115 } 28116 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 28117 // cond: 28118 // result: (GT cc yes no) 28119 for { 28120 v := b.Control 28121 if v.Op != OpARMCMPconst { 28122 break 28123 } 28124 if v.AuxInt != 0 { 28125 break 28126 } 28127 v_0 := v.Args[0] 28128 if v_0.Op != OpARMGreaterThan { 28129 break 28130 } 28131 cc := v_0.Args[0] 28132 b.Kind = BlockARMGT 28133 b.SetControl(cc) 28134 b.Aux = nil 28135 return true 28136 } 28137 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 28138 // cond: 28139 // result: (UGT cc yes no) 28140 for { 28141 v := b.Control 28142 if v.Op != OpARMCMPconst { 28143 break 28144 } 28145 if v.AuxInt != 0 { 28146 break 28147 } 28148 v_0 := v.Args[0] 28149 if v_0.Op != OpARMGreaterThanU { 28150 break 28151 } 28152 cc := v_0.Args[0] 28153 b.Kind = BlockARMUGT 28154 b.SetControl(cc) 28155 b.Aux = nil 28156 return true 28157 } 28158 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 28159 // cond: 28160 // result: (GE cc yes no) 28161 for { 28162 v := b.Control 28163 if v.Op != OpARMCMPconst { 28164 break 28165 } 28166 if v.AuxInt != 0 { 28167 break 28168 } 28169 v_0 := v.Args[0] 28170 if v_0.Op != OpARMGreaterEqual { 28171 break 28172 } 28173 cc := v_0.Args[0] 28174 b.Kind = BlockARMGE 28175 b.SetControl(cc) 28176 b.Aux = nil 28177 return true 28178 } 28179 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 28180 // cond: 28181 // result: (UGE cc yes no) 28182 for { 28183 v := b.Control 28184 if v.Op != OpARMCMPconst { 28185 break 28186 } 28187 if v.AuxInt != 0 { 28188 break 28189 } 28190 v_0 := v.Args[0] 28191 if v_0.Op != OpARMGreaterEqualU { 28192 break 28193 } 28194 cc := v_0.Args[0] 28195 b.Kind = BlockARMUGE 28196 b.SetControl(cc) 28197 b.Aux = nil 28198 return true 28199 } 28200 // match: (NE (FlagEQ) yes no) 28201 // cond: 28202 // result: (First nil no yes) 28203 for { 28204 v := b.Control 28205 if v.Op != OpARMFlagEQ { 28206 break 28207 } 28208 b.Kind = BlockFirst 28209 b.SetControl(nil) 28210 b.Aux = nil 28211 b.swapSuccessors() 28212 return true 28213 } 28214 // match: (NE (FlagLT_ULT) yes no) 28215 // cond: 28216 // result: (First nil yes no) 28217 for { 28218 v := b.Control 28219 if v.Op != OpARMFlagLT_ULT { 28220 break 28221 } 28222 b.Kind = BlockFirst 28223 b.SetControl(nil) 28224 b.Aux = nil 28225 return true 28226 } 28227 // match: (NE (FlagLT_UGT) yes no) 28228 // cond: 28229 // result: (First nil yes no) 28230 for { 28231 v := b.Control 28232 if v.Op != OpARMFlagLT_UGT { 28233 break 28234 } 28235 b.Kind = BlockFirst 28236 b.SetControl(nil) 28237 b.Aux = nil 28238 return true 28239 } 28240 // match: (NE (FlagGT_ULT) yes no) 28241 // cond: 28242 // result: (First nil yes no) 28243 for { 28244 v := b.Control 28245 if v.Op != OpARMFlagGT_ULT { 28246 break 28247 } 28248 b.Kind = BlockFirst 28249 b.SetControl(nil) 28250 b.Aux = nil 28251 return true 28252 } 28253 // match: (NE (FlagGT_UGT) yes no) 28254 // cond: 28255 // result: (First nil yes no) 28256 for { 28257 v := b.Control 28258 if v.Op != OpARMFlagGT_UGT { 28259 break 28260 } 28261 b.Kind = BlockFirst 28262 b.SetControl(nil) 28263 b.Aux = nil 28264 return true 28265 } 28266 // match: (NE (InvertFlags cmp) yes no) 28267 // cond: 28268 // result: (NE cmp yes no) 28269 for { 28270 v := b.Control 28271 if v.Op != OpARMInvertFlags { 28272 break 28273 } 28274 cmp := v.Args[0] 28275 b.Kind = BlockARMNE 28276 b.SetControl(cmp) 28277 b.Aux = nil 28278 return true 28279 } 28280 // match: (NE (CMPconst [0] l:(SUB x y)) yes no) 28281 // cond: l.Uses==1 28282 // result: (NE (CMP x y) yes no) 28283 for { 28284 v := b.Control 28285 if v.Op != OpARMCMPconst { 28286 break 28287 } 28288 if v.AuxInt != 0 { 28289 break 28290 } 28291 l := v.Args[0] 28292 if l.Op != OpARMSUB { 28293 break 28294 } 28295 _ = l.Args[1] 28296 x := l.Args[0] 28297 y := l.Args[1] 28298 if !(l.Uses == 1) { 28299 break 28300 } 28301 b.Kind = BlockARMNE 28302 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 28303 v0.AddArg(x) 28304 v0.AddArg(y) 28305 b.SetControl(v0) 28306 b.Aux = nil 28307 return true 28308 } 28309 // match: (NE (CMPconst [0] l:(MULS x y a)) yes no) 28310 // cond: l.Uses==1 28311 // result: (NE (CMP a (MUL <x.Type> x y)) yes no) 28312 for { 28313 v := b.Control 28314 if v.Op != OpARMCMPconst { 28315 break 28316 } 28317 if v.AuxInt != 0 { 28318 break 28319 } 28320 l := v.Args[0] 28321 if l.Op != OpARMMULS { 28322 break 28323 } 28324 _ = l.Args[2] 28325 x := l.Args[0] 28326 y := l.Args[1] 28327 a := l.Args[2] 28328 if !(l.Uses == 1) { 28329 break 28330 } 28331 b.Kind = BlockARMNE 28332 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 28333 v0.AddArg(a) 28334 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 28335 v1.AddArg(x) 28336 v1.AddArg(y) 28337 v0.AddArg(v1) 28338 b.SetControl(v0) 28339 b.Aux = nil 28340 return true 28341 } 28342 // match: (NE (CMPconst [0] l:(SUBconst [c] x)) yes no) 28343 // cond: l.Uses==1 28344 // result: (NE (CMPconst [c] x) yes no) 28345 for { 28346 v := b.Control 28347 if v.Op != OpARMCMPconst { 28348 break 28349 } 28350 if v.AuxInt != 0 { 28351 break 28352 } 28353 l := v.Args[0] 28354 if l.Op != OpARMSUBconst { 28355 break 28356 } 28357 c := l.AuxInt 28358 x := l.Args[0] 28359 if !(l.Uses == 1) { 28360 break 28361 } 28362 b.Kind = BlockARMNE 28363 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 28364 v0.AuxInt = c 28365 v0.AddArg(x) 28366 b.SetControl(v0) 28367 b.Aux = nil 28368 return true 28369 } 28370 // match: (NE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) 28371 // cond: l.Uses==1 28372 // result: (NE (CMPshiftLL x y [c]) yes no) 28373 for { 28374 v := b.Control 28375 if v.Op != OpARMCMPconst { 28376 break 28377 } 28378 if v.AuxInt != 0 { 28379 break 28380 } 28381 l := v.Args[0] 28382 if l.Op != OpARMSUBshiftLL { 28383 break 28384 } 28385 c := l.AuxInt 28386 _ = l.Args[1] 28387 x := l.Args[0] 28388 y := l.Args[1] 28389 if !(l.Uses == 1) { 28390 break 28391 } 28392 b.Kind = BlockARMNE 28393 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 28394 v0.AuxInt = c 28395 v0.AddArg(x) 28396 v0.AddArg(y) 28397 b.SetControl(v0) 28398 b.Aux = nil 28399 return true 28400 } 28401 // match: (NE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) 28402 // cond: l.Uses==1 28403 // result: (NE (CMPshiftRL x y [c]) yes no) 28404 for { 28405 v := b.Control 28406 if v.Op != OpARMCMPconst { 28407 break 28408 } 28409 if v.AuxInt != 0 { 28410 break 28411 } 28412 l := v.Args[0] 28413 if l.Op != OpARMSUBshiftRL { 28414 break 28415 } 28416 c := l.AuxInt 28417 _ = l.Args[1] 28418 x := l.Args[0] 28419 y := l.Args[1] 28420 if !(l.Uses == 1) { 28421 break 28422 } 28423 b.Kind = BlockARMNE 28424 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 28425 v0.AuxInt = c 28426 v0.AddArg(x) 28427 v0.AddArg(y) 28428 b.SetControl(v0) 28429 b.Aux = nil 28430 return true 28431 } 28432 // match: (NE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) 28433 // cond: l.Uses==1 28434 // result: (NE (CMPshiftRA x y [c]) yes no) 28435 for { 28436 v := b.Control 28437 if v.Op != OpARMCMPconst { 28438 break 28439 } 28440 if v.AuxInt != 0 { 28441 break 28442 } 28443 l := v.Args[0] 28444 if l.Op != OpARMSUBshiftRA { 28445 break 28446 } 28447 c := l.AuxInt 28448 _ = l.Args[1] 28449 x := l.Args[0] 28450 y := l.Args[1] 28451 if !(l.Uses == 1) { 28452 break 28453 } 28454 b.Kind = BlockARMNE 28455 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 28456 v0.AuxInt = c 28457 v0.AddArg(x) 28458 v0.AddArg(y) 28459 b.SetControl(v0) 28460 b.Aux = nil 28461 return true 28462 } 28463 // match: (NE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) 28464 // cond: l.Uses==1 28465 // result: (NE (CMPshiftLLreg x y z) yes no) 28466 for { 28467 v := b.Control 28468 if v.Op != OpARMCMPconst { 28469 break 28470 } 28471 if v.AuxInt != 0 { 28472 break 28473 } 28474 l := v.Args[0] 28475 if l.Op != OpARMSUBshiftLLreg { 28476 break 28477 } 28478 _ = l.Args[2] 28479 x := l.Args[0] 28480 y := l.Args[1] 28481 z := l.Args[2] 28482 if !(l.Uses == 1) { 28483 break 28484 } 28485 b.Kind = BlockARMNE 28486 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 28487 v0.AddArg(x) 28488 v0.AddArg(y) 28489 v0.AddArg(z) 28490 b.SetControl(v0) 28491 b.Aux = nil 28492 return true 28493 } 28494 // match: (NE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) 28495 // cond: l.Uses==1 28496 // result: (NE (CMPshiftRLreg x y z) yes no) 28497 for { 28498 v := b.Control 28499 if v.Op != OpARMCMPconst { 28500 break 28501 } 28502 if v.AuxInt != 0 { 28503 break 28504 } 28505 l := v.Args[0] 28506 if l.Op != OpARMSUBshiftRLreg { 28507 break 28508 } 28509 _ = l.Args[2] 28510 x := l.Args[0] 28511 y := l.Args[1] 28512 z := l.Args[2] 28513 if !(l.Uses == 1) { 28514 break 28515 } 28516 b.Kind = BlockARMNE 28517 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 28518 v0.AddArg(x) 28519 v0.AddArg(y) 28520 v0.AddArg(z) 28521 b.SetControl(v0) 28522 b.Aux = nil 28523 return true 28524 } 28525 // match: (NE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) 28526 // cond: l.Uses==1 28527 // result: (NE (CMPshiftRAreg x y z) yes no) 28528 for { 28529 v := b.Control 28530 if v.Op != OpARMCMPconst { 28531 break 28532 } 28533 if v.AuxInt != 0 { 28534 break 28535 } 28536 l := v.Args[0] 28537 if l.Op != OpARMSUBshiftRAreg { 28538 break 28539 } 28540 _ = l.Args[2] 28541 x := l.Args[0] 28542 y := l.Args[1] 28543 z := l.Args[2] 28544 if !(l.Uses == 1) { 28545 break 28546 } 28547 b.Kind = BlockARMNE 28548 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 28549 v0.AddArg(x) 28550 v0.AddArg(y) 28551 v0.AddArg(z) 28552 b.SetControl(v0) 28553 b.Aux = nil 28554 return true 28555 } 28556 // match: (NE (CMPconst [0] l:(ADD x y)) yes no) 28557 // cond: l.Uses==1 28558 // result: (NE (CMN x y) yes no) 28559 for { 28560 v := b.Control 28561 if v.Op != OpARMCMPconst { 28562 break 28563 } 28564 if v.AuxInt != 0 { 28565 break 28566 } 28567 l := v.Args[0] 28568 if l.Op != OpARMADD { 28569 break 28570 } 28571 _ = l.Args[1] 28572 x := l.Args[0] 28573 y := l.Args[1] 28574 if !(l.Uses == 1) { 28575 break 28576 } 28577 b.Kind = BlockARMNE 28578 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 28579 v0.AddArg(x) 28580 v0.AddArg(y) 28581 b.SetControl(v0) 28582 b.Aux = nil 28583 return true 28584 } 28585 // match: (NE (CMPconst [0] l:(MULA x y a)) yes no) 28586 // cond: l.Uses==1 28587 // result: (NE (CMN a (MUL <x.Type> x y)) yes no) 28588 for { 28589 v := b.Control 28590 if v.Op != OpARMCMPconst { 28591 break 28592 } 28593 if v.AuxInt != 0 { 28594 break 28595 } 28596 l := v.Args[0] 28597 if l.Op != OpARMMULA { 28598 break 28599 } 28600 _ = l.Args[2] 28601 x := l.Args[0] 28602 y := l.Args[1] 28603 a := l.Args[2] 28604 if !(l.Uses == 1) { 28605 break 28606 } 28607 b.Kind = BlockARMNE 28608 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 28609 v0.AddArg(a) 28610 v1 := b.NewValue0(v.Pos, OpARMMUL, x.Type) 28611 v1.AddArg(x) 28612 v1.AddArg(y) 28613 v0.AddArg(v1) 28614 b.SetControl(v0) 28615 b.Aux = nil 28616 return true 28617 } 28618 // match: (NE (CMPconst [0] l:(ADDconst [c] x)) yes no) 28619 // cond: l.Uses==1 28620 // result: (NE (CMNconst [c] x) yes no) 28621 for { 28622 v := b.Control 28623 if v.Op != OpARMCMPconst { 28624 break 28625 } 28626 if v.AuxInt != 0 { 28627 break 28628 } 28629 l := v.Args[0] 28630 if l.Op != OpARMADDconst { 28631 break 28632 } 28633 c := l.AuxInt 28634 x := l.Args[0] 28635 if !(l.Uses == 1) { 28636 break 28637 } 28638 b.Kind = BlockARMNE 28639 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 28640 v0.AuxInt = c 28641 v0.AddArg(x) 28642 b.SetControl(v0) 28643 b.Aux = nil 28644 return true 28645 } 28646 // match: (NE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) 28647 // cond: l.Uses==1 28648 // result: (NE (CMNshiftLL x y [c]) yes no) 28649 for { 28650 v := b.Control 28651 if v.Op != OpARMCMPconst { 28652 break 28653 } 28654 if v.AuxInt != 0 { 28655 break 28656 } 28657 l := v.Args[0] 28658 if l.Op != OpARMADDshiftLL { 28659 break 28660 } 28661 c := l.AuxInt 28662 _ = l.Args[1] 28663 x := l.Args[0] 28664 y := l.Args[1] 28665 if !(l.Uses == 1) { 28666 break 28667 } 28668 b.Kind = BlockARMNE 28669 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 28670 v0.AuxInt = c 28671 v0.AddArg(x) 28672 v0.AddArg(y) 28673 b.SetControl(v0) 28674 b.Aux = nil 28675 return true 28676 } 28677 // match: (NE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) 28678 // cond: l.Uses==1 28679 // result: (NE (CMNshiftRL x y [c]) yes no) 28680 for { 28681 v := b.Control 28682 if v.Op != OpARMCMPconst { 28683 break 28684 } 28685 if v.AuxInt != 0 { 28686 break 28687 } 28688 l := v.Args[0] 28689 if l.Op != OpARMADDshiftRL { 28690 break 28691 } 28692 c := l.AuxInt 28693 _ = l.Args[1] 28694 x := l.Args[0] 28695 y := l.Args[1] 28696 if !(l.Uses == 1) { 28697 break 28698 } 28699 b.Kind = BlockARMNE 28700 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 28701 v0.AuxInt = c 28702 v0.AddArg(x) 28703 v0.AddArg(y) 28704 b.SetControl(v0) 28705 b.Aux = nil 28706 return true 28707 } 28708 // match: (NE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) 28709 // cond: l.Uses==1 28710 // result: (NE (CMNshiftRA x y [c]) yes no) 28711 for { 28712 v := b.Control 28713 if v.Op != OpARMCMPconst { 28714 break 28715 } 28716 if v.AuxInt != 0 { 28717 break 28718 } 28719 l := v.Args[0] 28720 if l.Op != OpARMADDshiftRA { 28721 break 28722 } 28723 c := l.AuxInt 28724 _ = l.Args[1] 28725 x := l.Args[0] 28726 y := l.Args[1] 28727 if !(l.Uses == 1) { 28728 break 28729 } 28730 b.Kind = BlockARMNE 28731 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 28732 v0.AuxInt = c 28733 v0.AddArg(x) 28734 v0.AddArg(y) 28735 b.SetControl(v0) 28736 b.Aux = nil 28737 return true 28738 } 28739 // match: (NE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) 28740 // cond: l.Uses==1 28741 // result: (NE (CMNshiftLLreg x y z) yes no) 28742 for { 28743 v := b.Control 28744 if v.Op != OpARMCMPconst { 28745 break 28746 } 28747 if v.AuxInt != 0 { 28748 break 28749 } 28750 l := v.Args[0] 28751 if l.Op != OpARMADDshiftLLreg { 28752 break 28753 } 28754 _ = l.Args[2] 28755 x := l.Args[0] 28756 y := l.Args[1] 28757 z := l.Args[2] 28758 if !(l.Uses == 1) { 28759 break 28760 } 28761 b.Kind = BlockARMNE 28762 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 28763 v0.AddArg(x) 28764 v0.AddArg(y) 28765 v0.AddArg(z) 28766 b.SetControl(v0) 28767 b.Aux = nil 28768 return true 28769 } 28770 // match: (NE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) 28771 // cond: l.Uses==1 28772 // result: (NE (CMNshiftRLreg x y z) yes no) 28773 for { 28774 v := b.Control 28775 if v.Op != OpARMCMPconst { 28776 break 28777 } 28778 if v.AuxInt != 0 { 28779 break 28780 } 28781 l := v.Args[0] 28782 if l.Op != OpARMADDshiftRLreg { 28783 break 28784 } 28785 _ = l.Args[2] 28786 x := l.Args[0] 28787 y := l.Args[1] 28788 z := l.Args[2] 28789 if !(l.Uses == 1) { 28790 break 28791 } 28792 b.Kind = BlockARMNE 28793 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 28794 v0.AddArg(x) 28795 v0.AddArg(y) 28796 v0.AddArg(z) 28797 b.SetControl(v0) 28798 b.Aux = nil 28799 return true 28800 } 28801 // match: (NE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) 28802 // cond: l.Uses==1 28803 // result: (NE (CMNshiftRAreg x y z) yes no) 28804 for { 28805 v := b.Control 28806 if v.Op != OpARMCMPconst { 28807 break 28808 } 28809 if v.AuxInt != 0 { 28810 break 28811 } 28812 l := v.Args[0] 28813 if l.Op != OpARMADDshiftRAreg { 28814 break 28815 } 28816 _ = l.Args[2] 28817 x := l.Args[0] 28818 y := l.Args[1] 28819 z := l.Args[2] 28820 if !(l.Uses == 1) { 28821 break 28822 } 28823 b.Kind = BlockARMNE 28824 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 28825 v0.AddArg(x) 28826 v0.AddArg(y) 28827 v0.AddArg(z) 28828 b.SetControl(v0) 28829 b.Aux = nil 28830 return true 28831 } 28832 // match: (NE (CMPconst [0] l:(AND x y)) yes no) 28833 // cond: l.Uses==1 28834 // result: (NE (TST x y) yes no) 28835 for { 28836 v := b.Control 28837 if v.Op != OpARMCMPconst { 28838 break 28839 } 28840 if v.AuxInt != 0 { 28841 break 28842 } 28843 l := v.Args[0] 28844 if l.Op != OpARMAND { 28845 break 28846 } 28847 _ = l.Args[1] 28848 x := l.Args[0] 28849 y := l.Args[1] 28850 if !(l.Uses == 1) { 28851 break 28852 } 28853 b.Kind = BlockARMNE 28854 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 28855 v0.AddArg(x) 28856 v0.AddArg(y) 28857 b.SetControl(v0) 28858 b.Aux = nil 28859 return true 28860 } 28861 // match: (NE (CMPconst [0] l:(ANDconst [c] x)) yes no) 28862 // cond: l.Uses==1 28863 // result: (NE (TSTconst [c] x) yes no) 28864 for { 28865 v := b.Control 28866 if v.Op != OpARMCMPconst { 28867 break 28868 } 28869 if v.AuxInt != 0 { 28870 break 28871 } 28872 l := v.Args[0] 28873 if l.Op != OpARMANDconst { 28874 break 28875 } 28876 c := l.AuxInt 28877 x := l.Args[0] 28878 if !(l.Uses == 1) { 28879 break 28880 } 28881 b.Kind = BlockARMNE 28882 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 28883 v0.AuxInt = c 28884 v0.AddArg(x) 28885 b.SetControl(v0) 28886 b.Aux = nil 28887 return true 28888 } 28889 // match: (NE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) 28890 // cond: l.Uses==1 28891 // result: (NE (TSTshiftLL x y [c]) yes no) 28892 for { 28893 v := b.Control 28894 if v.Op != OpARMCMPconst { 28895 break 28896 } 28897 if v.AuxInt != 0 { 28898 break 28899 } 28900 l := v.Args[0] 28901 if l.Op != OpARMANDshiftLL { 28902 break 28903 } 28904 c := l.AuxInt 28905 _ = l.Args[1] 28906 x := l.Args[0] 28907 y := l.Args[1] 28908 if !(l.Uses == 1) { 28909 break 28910 } 28911 b.Kind = BlockARMNE 28912 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 28913 v0.AuxInt = c 28914 v0.AddArg(x) 28915 v0.AddArg(y) 28916 b.SetControl(v0) 28917 b.Aux = nil 28918 return true 28919 } 28920 // match: (NE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) 28921 // cond: l.Uses==1 28922 // result: (NE (TSTshiftRL x y [c]) yes no) 28923 for { 28924 v := b.Control 28925 if v.Op != OpARMCMPconst { 28926 break 28927 } 28928 if v.AuxInt != 0 { 28929 break 28930 } 28931 l := v.Args[0] 28932 if l.Op != OpARMANDshiftRL { 28933 break 28934 } 28935 c := l.AuxInt 28936 _ = l.Args[1] 28937 x := l.Args[0] 28938 y := l.Args[1] 28939 if !(l.Uses == 1) { 28940 break 28941 } 28942 b.Kind = BlockARMNE 28943 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 28944 v0.AuxInt = c 28945 v0.AddArg(x) 28946 v0.AddArg(y) 28947 b.SetControl(v0) 28948 b.Aux = nil 28949 return true 28950 } 28951 // match: (NE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) 28952 // cond: l.Uses==1 28953 // result: (NE (TSTshiftRA x y [c]) yes no) 28954 for { 28955 v := b.Control 28956 if v.Op != OpARMCMPconst { 28957 break 28958 } 28959 if v.AuxInt != 0 { 28960 break 28961 } 28962 l := v.Args[0] 28963 if l.Op != OpARMANDshiftRA { 28964 break 28965 } 28966 c := l.AuxInt 28967 _ = l.Args[1] 28968 x := l.Args[0] 28969 y := l.Args[1] 28970 if !(l.Uses == 1) { 28971 break 28972 } 28973 b.Kind = BlockARMNE 28974 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 28975 v0.AuxInt = c 28976 v0.AddArg(x) 28977 v0.AddArg(y) 28978 b.SetControl(v0) 28979 b.Aux = nil 28980 return true 28981 } 28982 // match: (NE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) 28983 // cond: l.Uses==1 28984 // result: (NE (TSTshiftLLreg x y z) yes no) 28985 for { 28986 v := b.Control 28987 if v.Op != OpARMCMPconst { 28988 break 28989 } 28990 if v.AuxInt != 0 { 28991 break 28992 } 28993 l := v.Args[0] 28994 if l.Op != OpARMANDshiftLLreg { 28995 break 28996 } 28997 _ = l.Args[2] 28998 x := l.Args[0] 28999 y := l.Args[1] 29000 z := l.Args[2] 29001 if !(l.Uses == 1) { 29002 break 29003 } 29004 b.Kind = BlockARMNE 29005 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 29006 v0.AddArg(x) 29007 v0.AddArg(y) 29008 v0.AddArg(z) 29009 b.SetControl(v0) 29010 b.Aux = nil 29011 return true 29012 } 29013 // match: (NE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) 29014 // cond: l.Uses==1 29015 // result: (NE (TSTshiftRLreg x y z) yes no) 29016 for { 29017 v := b.Control 29018 if v.Op != OpARMCMPconst { 29019 break 29020 } 29021 if v.AuxInt != 0 { 29022 break 29023 } 29024 l := v.Args[0] 29025 if l.Op != OpARMANDshiftRLreg { 29026 break 29027 } 29028 _ = l.Args[2] 29029 x := l.Args[0] 29030 y := l.Args[1] 29031 z := l.Args[2] 29032 if !(l.Uses == 1) { 29033 break 29034 } 29035 b.Kind = BlockARMNE 29036 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 29037 v0.AddArg(x) 29038 v0.AddArg(y) 29039 v0.AddArg(z) 29040 b.SetControl(v0) 29041 b.Aux = nil 29042 return true 29043 } 29044 // match: (NE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) 29045 // cond: l.Uses==1 29046 // result: (NE (TSTshiftRAreg x y z) yes no) 29047 for { 29048 v := b.Control 29049 if v.Op != OpARMCMPconst { 29050 break 29051 } 29052 if v.AuxInt != 0 { 29053 break 29054 } 29055 l := v.Args[0] 29056 if l.Op != OpARMANDshiftRAreg { 29057 break 29058 } 29059 _ = l.Args[2] 29060 x := l.Args[0] 29061 y := l.Args[1] 29062 z := l.Args[2] 29063 if !(l.Uses == 1) { 29064 break 29065 } 29066 b.Kind = BlockARMNE 29067 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 29068 v0.AddArg(x) 29069 v0.AddArg(y) 29070 v0.AddArg(z) 29071 b.SetControl(v0) 29072 b.Aux = nil 29073 return true 29074 } 29075 // match: (NE (CMPconst [0] l:(XOR x y)) yes no) 29076 // cond: l.Uses==1 29077 // result: (NE (TEQ x y) yes no) 29078 for { 29079 v := b.Control 29080 if v.Op != OpARMCMPconst { 29081 break 29082 } 29083 if v.AuxInt != 0 { 29084 break 29085 } 29086 l := v.Args[0] 29087 if l.Op != OpARMXOR { 29088 break 29089 } 29090 _ = l.Args[1] 29091 x := l.Args[0] 29092 y := l.Args[1] 29093 if !(l.Uses == 1) { 29094 break 29095 } 29096 b.Kind = BlockARMNE 29097 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 29098 v0.AddArg(x) 29099 v0.AddArg(y) 29100 b.SetControl(v0) 29101 b.Aux = nil 29102 return true 29103 } 29104 // match: (NE (CMPconst [0] l:(XORconst [c] x)) yes no) 29105 // cond: l.Uses==1 29106 // result: (NE (TEQconst [c] x) yes no) 29107 for { 29108 v := b.Control 29109 if v.Op != OpARMCMPconst { 29110 break 29111 } 29112 if v.AuxInt != 0 { 29113 break 29114 } 29115 l := v.Args[0] 29116 if l.Op != OpARMXORconst { 29117 break 29118 } 29119 c := l.AuxInt 29120 x := l.Args[0] 29121 if !(l.Uses == 1) { 29122 break 29123 } 29124 b.Kind = BlockARMNE 29125 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 29126 v0.AuxInt = c 29127 v0.AddArg(x) 29128 b.SetControl(v0) 29129 b.Aux = nil 29130 return true 29131 } 29132 // match: (NE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) 29133 // cond: l.Uses==1 29134 // result: (NE (TEQshiftLL x y [c]) yes no) 29135 for { 29136 v := b.Control 29137 if v.Op != OpARMCMPconst { 29138 break 29139 } 29140 if v.AuxInt != 0 { 29141 break 29142 } 29143 l := v.Args[0] 29144 if l.Op != OpARMXORshiftLL { 29145 break 29146 } 29147 c := l.AuxInt 29148 _ = l.Args[1] 29149 x := l.Args[0] 29150 y := l.Args[1] 29151 if !(l.Uses == 1) { 29152 break 29153 } 29154 b.Kind = BlockARMNE 29155 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 29156 v0.AuxInt = c 29157 v0.AddArg(x) 29158 v0.AddArg(y) 29159 b.SetControl(v0) 29160 b.Aux = nil 29161 return true 29162 } 29163 // match: (NE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) 29164 // cond: l.Uses==1 29165 // result: (NE (TEQshiftRL x y [c]) yes no) 29166 for { 29167 v := b.Control 29168 if v.Op != OpARMCMPconst { 29169 break 29170 } 29171 if v.AuxInt != 0 { 29172 break 29173 } 29174 l := v.Args[0] 29175 if l.Op != OpARMXORshiftRL { 29176 break 29177 } 29178 c := l.AuxInt 29179 _ = l.Args[1] 29180 x := l.Args[0] 29181 y := l.Args[1] 29182 if !(l.Uses == 1) { 29183 break 29184 } 29185 b.Kind = BlockARMNE 29186 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 29187 v0.AuxInt = c 29188 v0.AddArg(x) 29189 v0.AddArg(y) 29190 b.SetControl(v0) 29191 b.Aux = nil 29192 return true 29193 } 29194 // match: (NE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) 29195 // cond: l.Uses==1 29196 // result: (NE (TEQshiftRA x y [c]) yes no) 29197 for { 29198 v := b.Control 29199 if v.Op != OpARMCMPconst { 29200 break 29201 } 29202 if v.AuxInt != 0 { 29203 break 29204 } 29205 l := v.Args[0] 29206 if l.Op != OpARMXORshiftRA { 29207 break 29208 } 29209 c := l.AuxInt 29210 _ = l.Args[1] 29211 x := l.Args[0] 29212 y := l.Args[1] 29213 if !(l.Uses == 1) { 29214 break 29215 } 29216 b.Kind = BlockARMNE 29217 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 29218 v0.AuxInt = c 29219 v0.AddArg(x) 29220 v0.AddArg(y) 29221 b.SetControl(v0) 29222 b.Aux = nil 29223 return true 29224 } 29225 // match: (NE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) 29226 // cond: l.Uses==1 29227 // result: (NE (TEQshiftLLreg x y z) yes no) 29228 for { 29229 v := b.Control 29230 if v.Op != OpARMCMPconst { 29231 break 29232 } 29233 if v.AuxInt != 0 { 29234 break 29235 } 29236 l := v.Args[0] 29237 if l.Op != OpARMXORshiftLLreg { 29238 break 29239 } 29240 _ = l.Args[2] 29241 x := l.Args[0] 29242 y := l.Args[1] 29243 z := l.Args[2] 29244 if !(l.Uses == 1) { 29245 break 29246 } 29247 b.Kind = BlockARMNE 29248 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 29249 v0.AddArg(x) 29250 v0.AddArg(y) 29251 v0.AddArg(z) 29252 b.SetControl(v0) 29253 b.Aux = nil 29254 return true 29255 } 29256 // match: (NE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) 29257 // cond: l.Uses==1 29258 // result: (NE (TEQshiftRLreg x y z) yes no) 29259 for { 29260 v := b.Control 29261 if v.Op != OpARMCMPconst { 29262 break 29263 } 29264 if v.AuxInt != 0 { 29265 break 29266 } 29267 l := v.Args[0] 29268 if l.Op != OpARMXORshiftRLreg { 29269 break 29270 } 29271 _ = l.Args[2] 29272 x := l.Args[0] 29273 y := l.Args[1] 29274 z := l.Args[2] 29275 if !(l.Uses == 1) { 29276 break 29277 } 29278 b.Kind = BlockARMNE 29279 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 29280 v0.AddArg(x) 29281 v0.AddArg(y) 29282 v0.AddArg(z) 29283 b.SetControl(v0) 29284 b.Aux = nil 29285 return true 29286 } 29287 // match: (NE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) 29288 // cond: l.Uses==1 29289 // result: (NE (TEQshiftRAreg x y z) yes no) 29290 for { 29291 v := b.Control 29292 if v.Op != OpARMCMPconst { 29293 break 29294 } 29295 if v.AuxInt != 0 { 29296 break 29297 } 29298 l := v.Args[0] 29299 if l.Op != OpARMXORshiftRAreg { 29300 break 29301 } 29302 _ = l.Args[2] 29303 x := l.Args[0] 29304 y := l.Args[1] 29305 z := l.Args[2] 29306 if !(l.Uses == 1) { 29307 break 29308 } 29309 b.Kind = BlockARMNE 29310 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 29311 v0.AddArg(x) 29312 v0.AddArg(y) 29313 v0.AddArg(z) 29314 b.SetControl(v0) 29315 b.Aux = nil 29316 return true 29317 } 29318 case BlockARMUGE: 29319 // match: (UGE (FlagEQ) yes no) 29320 // cond: 29321 // result: (First nil yes no) 29322 for { 29323 v := b.Control 29324 if v.Op != OpARMFlagEQ { 29325 break 29326 } 29327 b.Kind = BlockFirst 29328 b.SetControl(nil) 29329 b.Aux = nil 29330 return true 29331 } 29332 // match: (UGE (FlagLT_ULT) yes no) 29333 // cond: 29334 // result: (First nil no yes) 29335 for { 29336 v := b.Control 29337 if v.Op != OpARMFlagLT_ULT { 29338 break 29339 } 29340 b.Kind = BlockFirst 29341 b.SetControl(nil) 29342 b.Aux = nil 29343 b.swapSuccessors() 29344 return true 29345 } 29346 // match: (UGE (FlagLT_UGT) yes no) 29347 // cond: 29348 // result: (First nil yes no) 29349 for { 29350 v := b.Control 29351 if v.Op != OpARMFlagLT_UGT { 29352 break 29353 } 29354 b.Kind = BlockFirst 29355 b.SetControl(nil) 29356 b.Aux = nil 29357 return true 29358 } 29359 // match: (UGE (FlagGT_ULT) yes no) 29360 // cond: 29361 // result: (First nil no yes) 29362 for { 29363 v := b.Control 29364 if v.Op != OpARMFlagGT_ULT { 29365 break 29366 } 29367 b.Kind = BlockFirst 29368 b.SetControl(nil) 29369 b.Aux = nil 29370 b.swapSuccessors() 29371 return true 29372 } 29373 // match: (UGE (FlagGT_UGT) yes no) 29374 // cond: 29375 // result: (First nil yes no) 29376 for { 29377 v := b.Control 29378 if v.Op != OpARMFlagGT_UGT { 29379 break 29380 } 29381 b.Kind = BlockFirst 29382 b.SetControl(nil) 29383 b.Aux = nil 29384 return true 29385 } 29386 // match: (UGE (InvertFlags cmp) yes no) 29387 // cond: 29388 // result: (ULE cmp yes no) 29389 for { 29390 v := b.Control 29391 if v.Op != OpARMInvertFlags { 29392 break 29393 } 29394 cmp := v.Args[0] 29395 b.Kind = BlockARMULE 29396 b.SetControl(cmp) 29397 b.Aux = nil 29398 return true 29399 } 29400 case BlockARMUGT: 29401 // match: (UGT (FlagEQ) yes no) 29402 // cond: 29403 // result: (First nil no yes) 29404 for { 29405 v := b.Control 29406 if v.Op != OpARMFlagEQ { 29407 break 29408 } 29409 b.Kind = BlockFirst 29410 b.SetControl(nil) 29411 b.Aux = nil 29412 b.swapSuccessors() 29413 return true 29414 } 29415 // match: (UGT (FlagLT_ULT) yes no) 29416 // cond: 29417 // result: (First nil no yes) 29418 for { 29419 v := b.Control 29420 if v.Op != OpARMFlagLT_ULT { 29421 break 29422 } 29423 b.Kind = BlockFirst 29424 b.SetControl(nil) 29425 b.Aux = nil 29426 b.swapSuccessors() 29427 return true 29428 } 29429 // match: (UGT (FlagLT_UGT) yes no) 29430 // cond: 29431 // result: (First nil yes no) 29432 for { 29433 v := b.Control 29434 if v.Op != OpARMFlagLT_UGT { 29435 break 29436 } 29437 b.Kind = BlockFirst 29438 b.SetControl(nil) 29439 b.Aux = nil 29440 return true 29441 } 29442 // match: (UGT (FlagGT_ULT) yes no) 29443 // cond: 29444 // result: (First nil no yes) 29445 for { 29446 v := b.Control 29447 if v.Op != OpARMFlagGT_ULT { 29448 break 29449 } 29450 b.Kind = BlockFirst 29451 b.SetControl(nil) 29452 b.Aux = nil 29453 b.swapSuccessors() 29454 return true 29455 } 29456 // match: (UGT (FlagGT_UGT) yes no) 29457 // cond: 29458 // result: (First nil yes no) 29459 for { 29460 v := b.Control 29461 if v.Op != OpARMFlagGT_UGT { 29462 break 29463 } 29464 b.Kind = BlockFirst 29465 b.SetControl(nil) 29466 b.Aux = nil 29467 return true 29468 } 29469 // match: (UGT (InvertFlags cmp) yes no) 29470 // cond: 29471 // result: (ULT cmp yes no) 29472 for { 29473 v := b.Control 29474 if v.Op != OpARMInvertFlags { 29475 break 29476 } 29477 cmp := v.Args[0] 29478 b.Kind = BlockARMULT 29479 b.SetControl(cmp) 29480 b.Aux = nil 29481 return true 29482 } 29483 case BlockARMULE: 29484 // match: (ULE (FlagEQ) yes no) 29485 // cond: 29486 // result: (First nil yes no) 29487 for { 29488 v := b.Control 29489 if v.Op != OpARMFlagEQ { 29490 break 29491 } 29492 b.Kind = BlockFirst 29493 b.SetControl(nil) 29494 b.Aux = nil 29495 return true 29496 } 29497 // match: (ULE (FlagLT_ULT) yes no) 29498 // cond: 29499 // result: (First nil yes no) 29500 for { 29501 v := b.Control 29502 if v.Op != OpARMFlagLT_ULT { 29503 break 29504 } 29505 b.Kind = BlockFirst 29506 b.SetControl(nil) 29507 b.Aux = nil 29508 return true 29509 } 29510 // match: (ULE (FlagLT_UGT) yes no) 29511 // cond: 29512 // result: (First nil no yes) 29513 for { 29514 v := b.Control 29515 if v.Op != OpARMFlagLT_UGT { 29516 break 29517 } 29518 b.Kind = BlockFirst 29519 b.SetControl(nil) 29520 b.Aux = nil 29521 b.swapSuccessors() 29522 return true 29523 } 29524 // match: (ULE (FlagGT_ULT) yes no) 29525 // cond: 29526 // result: (First nil yes no) 29527 for { 29528 v := b.Control 29529 if v.Op != OpARMFlagGT_ULT { 29530 break 29531 } 29532 b.Kind = BlockFirst 29533 b.SetControl(nil) 29534 b.Aux = nil 29535 return true 29536 } 29537 // match: (ULE (FlagGT_UGT) yes no) 29538 // cond: 29539 // result: (First nil no yes) 29540 for { 29541 v := b.Control 29542 if v.Op != OpARMFlagGT_UGT { 29543 break 29544 } 29545 b.Kind = BlockFirst 29546 b.SetControl(nil) 29547 b.Aux = nil 29548 b.swapSuccessors() 29549 return true 29550 } 29551 // match: (ULE (InvertFlags cmp) yes no) 29552 // cond: 29553 // result: (UGE cmp yes no) 29554 for { 29555 v := b.Control 29556 if v.Op != OpARMInvertFlags { 29557 break 29558 } 29559 cmp := v.Args[0] 29560 b.Kind = BlockARMUGE 29561 b.SetControl(cmp) 29562 b.Aux = nil 29563 return true 29564 } 29565 case BlockARMULT: 29566 // match: (ULT (FlagEQ) yes no) 29567 // cond: 29568 // result: (First nil no yes) 29569 for { 29570 v := b.Control 29571 if v.Op != OpARMFlagEQ { 29572 break 29573 } 29574 b.Kind = BlockFirst 29575 b.SetControl(nil) 29576 b.Aux = nil 29577 b.swapSuccessors() 29578 return true 29579 } 29580 // match: (ULT (FlagLT_ULT) yes no) 29581 // cond: 29582 // result: (First nil yes no) 29583 for { 29584 v := b.Control 29585 if v.Op != OpARMFlagLT_ULT { 29586 break 29587 } 29588 b.Kind = BlockFirst 29589 b.SetControl(nil) 29590 b.Aux = nil 29591 return true 29592 } 29593 // match: (ULT (FlagLT_UGT) yes no) 29594 // cond: 29595 // result: (First nil no yes) 29596 for { 29597 v := b.Control 29598 if v.Op != OpARMFlagLT_UGT { 29599 break 29600 } 29601 b.Kind = BlockFirst 29602 b.SetControl(nil) 29603 b.Aux = nil 29604 b.swapSuccessors() 29605 return true 29606 } 29607 // match: (ULT (FlagGT_ULT) yes no) 29608 // cond: 29609 // result: (First nil yes no) 29610 for { 29611 v := b.Control 29612 if v.Op != OpARMFlagGT_ULT { 29613 break 29614 } 29615 b.Kind = BlockFirst 29616 b.SetControl(nil) 29617 b.Aux = nil 29618 return true 29619 } 29620 // match: (ULT (FlagGT_UGT) yes no) 29621 // cond: 29622 // result: (First nil no yes) 29623 for { 29624 v := b.Control 29625 if v.Op != OpARMFlagGT_UGT { 29626 break 29627 } 29628 b.Kind = BlockFirst 29629 b.SetControl(nil) 29630 b.Aux = nil 29631 b.swapSuccessors() 29632 return true 29633 } 29634 // match: (ULT (InvertFlags cmp) yes no) 29635 // cond: 29636 // result: (UGT cmp yes no) 29637 for { 29638 v := b.Control 29639 if v.Op != OpARMInvertFlags { 29640 break 29641 } 29642 cmp := v.Args[0] 29643 b.Kind = BlockARMUGT 29644 b.SetControl(cmp) 29645 b.Aux = nil 29646 return true 29647 } 29648 } 29649 return false 29650 }