github.com/corona10/go@v0.0.0-20180224231303-7a218942be57/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 OpConvert: 485 return rewriteValueARM_OpConvert_0(v) 486 case OpCtz32: 487 return rewriteValueARM_OpCtz32_0(v) 488 case OpCvt32Fto32: 489 return rewriteValueARM_OpCvt32Fto32_0(v) 490 case OpCvt32Fto32U: 491 return rewriteValueARM_OpCvt32Fto32U_0(v) 492 case OpCvt32Fto64F: 493 return rewriteValueARM_OpCvt32Fto64F_0(v) 494 case OpCvt32Uto32F: 495 return rewriteValueARM_OpCvt32Uto32F_0(v) 496 case OpCvt32Uto64F: 497 return rewriteValueARM_OpCvt32Uto64F_0(v) 498 case OpCvt32to32F: 499 return rewriteValueARM_OpCvt32to32F_0(v) 500 case OpCvt32to64F: 501 return rewriteValueARM_OpCvt32to64F_0(v) 502 case OpCvt64Fto32: 503 return rewriteValueARM_OpCvt64Fto32_0(v) 504 case OpCvt64Fto32F: 505 return rewriteValueARM_OpCvt64Fto32F_0(v) 506 case OpCvt64Fto32U: 507 return rewriteValueARM_OpCvt64Fto32U_0(v) 508 case OpDiv16: 509 return rewriteValueARM_OpDiv16_0(v) 510 case OpDiv16u: 511 return rewriteValueARM_OpDiv16u_0(v) 512 case OpDiv32: 513 return rewriteValueARM_OpDiv32_0(v) 514 case OpDiv32F: 515 return rewriteValueARM_OpDiv32F_0(v) 516 case OpDiv32u: 517 return rewriteValueARM_OpDiv32u_0(v) 518 case OpDiv64F: 519 return rewriteValueARM_OpDiv64F_0(v) 520 case OpDiv8: 521 return rewriteValueARM_OpDiv8_0(v) 522 case OpDiv8u: 523 return rewriteValueARM_OpDiv8u_0(v) 524 case OpEq16: 525 return rewriteValueARM_OpEq16_0(v) 526 case OpEq32: 527 return rewriteValueARM_OpEq32_0(v) 528 case OpEq32F: 529 return rewriteValueARM_OpEq32F_0(v) 530 case OpEq64F: 531 return rewriteValueARM_OpEq64F_0(v) 532 case OpEq8: 533 return rewriteValueARM_OpEq8_0(v) 534 case OpEqB: 535 return rewriteValueARM_OpEqB_0(v) 536 case OpEqPtr: 537 return rewriteValueARM_OpEqPtr_0(v) 538 case OpGeq16: 539 return rewriteValueARM_OpGeq16_0(v) 540 case OpGeq16U: 541 return rewriteValueARM_OpGeq16U_0(v) 542 case OpGeq32: 543 return rewriteValueARM_OpGeq32_0(v) 544 case OpGeq32F: 545 return rewriteValueARM_OpGeq32F_0(v) 546 case OpGeq32U: 547 return rewriteValueARM_OpGeq32U_0(v) 548 case OpGeq64F: 549 return rewriteValueARM_OpGeq64F_0(v) 550 case OpGeq8: 551 return rewriteValueARM_OpGeq8_0(v) 552 case OpGeq8U: 553 return rewriteValueARM_OpGeq8U_0(v) 554 case OpGetCallerSP: 555 return rewriteValueARM_OpGetCallerSP_0(v) 556 case OpGetClosurePtr: 557 return rewriteValueARM_OpGetClosurePtr_0(v) 558 case OpGreater16: 559 return rewriteValueARM_OpGreater16_0(v) 560 case OpGreater16U: 561 return rewriteValueARM_OpGreater16U_0(v) 562 case OpGreater32: 563 return rewriteValueARM_OpGreater32_0(v) 564 case OpGreater32F: 565 return rewriteValueARM_OpGreater32F_0(v) 566 case OpGreater32U: 567 return rewriteValueARM_OpGreater32U_0(v) 568 case OpGreater64F: 569 return rewriteValueARM_OpGreater64F_0(v) 570 case OpGreater8: 571 return rewriteValueARM_OpGreater8_0(v) 572 case OpGreater8U: 573 return rewriteValueARM_OpGreater8U_0(v) 574 case OpHmul32: 575 return rewriteValueARM_OpHmul32_0(v) 576 case OpHmul32u: 577 return rewriteValueARM_OpHmul32u_0(v) 578 case OpInterCall: 579 return rewriteValueARM_OpInterCall_0(v) 580 case OpIsInBounds: 581 return rewriteValueARM_OpIsInBounds_0(v) 582 case OpIsNonNil: 583 return rewriteValueARM_OpIsNonNil_0(v) 584 case OpIsSliceInBounds: 585 return rewriteValueARM_OpIsSliceInBounds_0(v) 586 case OpLeq16: 587 return rewriteValueARM_OpLeq16_0(v) 588 case OpLeq16U: 589 return rewriteValueARM_OpLeq16U_0(v) 590 case OpLeq32: 591 return rewriteValueARM_OpLeq32_0(v) 592 case OpLeq32F: 593 return rewriteValueARM_OpLeq32F_0(v) 594 case OpLeq32U: 595 return rewriteValueARM_OpLeq32U_0(v) 596 case OpLeq64F: 597 return rewriteValueARM_OpLeq64F_0(v) 598 case OpLeq8: 599 return rewriteValueARM_OpLeq8_0(v) 600 case OpLeq8U: 601 return rewriteValueARM_OpLeq8U_0(v) 602 case OpLess16: 603 return rewriteValueARM_OpLess16_0(v) 604 case OpLess16U: 605 return rewriteValueARM_OpLess16U_0(v) 606 case OpLess32: 607 return rewriteValueARM_OpLess32_0(v) 608 case OpLess32F: 609 return rewriteValueARM_OpLess32F_0(v) 610 case OpLess32U: 611 return rewriteValueARM_OpLess32U_0(v) 612 case OpLess64F: 613 return rewriteValueARM_OpLess64F_0(v) 614 case OpLess8: 615 return rewriteValueARM_OpLess8_0(v) 616 case OpLess8U: 617 return rewriteValueARM_OpLess8U_0(v) 618 case OpLoad: 619 return rewriteValueARM_OpLoad_0(v) 620 case OpLsh16x16: 621 return rewriteValueARM_OpLsh16x16_0(v) 622 case OpLsh16x32: 623 return rewriteValueARM_OpLsh16x32_0(v) 624 case OpLsh16x64: 625 return rewriteValueARM_OpLsh16x64_0(v) 626 case OpLsh16x8: 627 return rewriteValueARM_OpLsh16x8_0(v) 628 case OpLsh32x16: 629 return rewriteValueARM_OpLsh32x16_0(v) 630 case OpLsh32x32: 631 return rewriteValueARM_OpLsh32x32_0(v) 632 case OpLsh32x64: 633 return rewriteValueARM_OpLsh32x64_0(v) 634 case OpLsh32x8: 635 return rewriteValueARM_OpLsh32x8_0(v) 636 case OpLsh8x16: 637 return rewriteValueARM_OpLsh8x16_0(v) 638 case OpLsh8x32: 639 return rewriteValueARM_OpLsh8x32_0(v) 640 case OpLsh8x64: 641 return rewriteValueARM_OpLsh8x64_0(v) 642 case OpLsh8x8: 643 return rewriteValueARM_OpLsh8x8_0(v) 644 case OpMod16: 645 return rewriteValueARM_OpMod16_0(v) 646 case OpMod16u: 647 return rewriteValueARM_OpMod16u_0(v) 648 case OpMod32: 649 return rewriteValueARM_OpMod32_0(v) 650 case OpMod32u: 651 return rewriteValueARM_OpMod32u_0(v) 652 case OpMod8: 653 return rewriteValueARM_OpMod8_0(v) 654 case OpMod8u: 655 return rewriteValueARM_OpMod8u_0(v) 656 case OpMove: 657 return rewriteValueARM_OpMove_0(v) 658 case OpMul16: 659 return rewriteValueARM_OpMul16_0(v) 660 case OpMul32: 661 return rewriteValueARM_OpMul32_0(v) 662 case OpMul32F: 663 return rewriteValueARM_OpMul32F_0(v) 664 case OpMul32uhilo: 665 return rewriteValueARM_OpMul32uhilo_0(v) 666 case OpMul64F: 667 return rewriteValueARM_OpMul64F_0(v) 668 case OpMul8: 669 return rewriteValueARM_OpMul8_0(v) 670 case OpNeg16: 671 return rewriteValueARM_OpNeg16_0(v) 672 case OpNeg32: 673 return rewriteValueARM_OpNeg32_0(v) 674 case OpNeg32F: 675 return rewriteValueARM_OpNeg32F_0(v) 676 case OpNeg64F: 677 return rewriteValueARM_OpNeg64F_0(v) 678 case OpNeg8: 679 return rewriteValueARM_OpNeg8_0(v) 680 case OpNeq16: 681 return rewriteValueARM_OpNeq16_0(v) 682 case OpNeq32: 683 return rewriteValueARM_OpNeq32_0(v) 684 case OpNeq32F: 685 return rewriteValueARM_OpNeq32F_0(v) 686 case OpNeq64F: 687 return rewriteValueARM_OpNeq64F_0(v) 688 case OpNeq8: 689 return rewriteValueARM_OpNeq8_0(v) 690 case OpNeqB: 691 return rewriteValueARM_OpNeqB_0(v) 692 case OpNeqPtr: 693 return rewriteValueARM_OpNeqPtr_0(v) 694 case OpNilCheck: 695 return rewriteValueARM_OpNilCheck_0(v) 696 case OpNot: 697 return rewriteValueARM_OpNot_0(v) 698 case OpOffPtr: 699 return rewriteValueARM_OpOffPtr_0(v) 700 case OpOr16: 701 return rewriteValueARM_OpOr16_0(v) 702 case OpOr32: 703 return rewriteValueARM_OpOr32_0(v) 704 case OpOr8: 705 return rewriteValueARM_OpOr8_0(v) 706 case OpOrB: 707 return rewriteValueARM_OpOrB_0(v) 708 case OpRound32F: 709 return rewriteValueARM_OpRound32F_0(v) 710 case OpRound64F: 711 return rewriteValueARM_OpRound64F_0(v) 712 case OpRsh16Ux16: 713 return rewriteValueARM_OpRsh16Ux16_0(v) 714 case OpRsh16Ux32: 715 return rewriteValueARM_OpRsh16Ux32_0(v) 716 case OpRsh16Ux64: 717 return rewriteValueARM_OpRsh16Ux64_0(v) 718 case OpRsh16Ux8: 719 return rewriteValueARM_OpRsh16Ux8_0(v) 720 case OpRsh16x16: 721 return rewriteValueARM_OpRsh16x16_0(v) 722 case OpRsh16x32: 723 return rewriteValueARM_OpRsh16x32_0(v) 724 case OpRsh16x64: 725 return rewriteValueARM_OpRsh16x64_0(v) 726 case OpRsh16x8: 727 return rewriteValueARM_OpRsh16x8_0(v) 728 case OpRsh32Ux16: 729 return rewriteValueARM_OpRsh32Ux16_0(v) 730 case OpRsh32Ux32: 731 return rewriteValueARM_OpRsh32Ux32_0(v) 732 case OpRsh32Ux64: 733 return rewriteValueARM_OpRsh32Ux64_0(v) 734 case OpRsh32Ux8: 735 return rewriteValueARM_OpRsh32Ux8_0(v) 736 case OpRsh32x16: 737 return rewriteValueARM_OpRsh32x16_0(v) 738 case OpRsh32x32: 739 return rewriteValueARM_OpRsh32x32_0(v) 740 case OpRsh32x64: 741 return rewriteValueARM_OpRsh32x64_0(v) 742 case OpRsh32x8: 743 return rewriteValueARM_OpRsh32x8_0(v) 744 case OpRsh8Ux16: 745 return rewriteValueARM_OpRsh8Ux16_0(v) 746 case OpRsh8Ux32: 747 return rewriteValueARM_OpRsh8Ux32_0(v) 748 case OpRsh8Ux64: 749 return rewriteValueARM_OpRsh8Ux64_0(v) 750 case OpRsh8Ux8: 751 return rewriteValueARM_OpRsh8Ux8_0(v) 752 case OpRsh8x16: 753 return rewriteValueARM_OpRsh8x16_0(v) 754 case OpRsh8x32: 755 return rewriteValueARM_OpRsh8x32_0(v) 756 case OpRsh8x64: 757 return rewriteValueARM_OpRsh8x64_0(v) 758 case OpRsh8x8: 759 return rewriteValueARM_OpRsh8x8_0(v) 760 case OpSelect0: 761 return rewriteValueARM_OpSelect0_0(v) 762 case OpSelect1: 763 return rewriteValueARM_OpSelect1_0(v) 764 case OpSignExt16to32: 765 return rewriteValueARM_OpSignExt16to32_0(v) 766 case OpSignExt8to16: 767 return rewriteValueARM_OpSignExt8to16_0(v) 768 case OpSignExt8to32: 769 return rewriteValueARM_OpSignExt8to32_0(v) 770 case OpSignmask: 771 return rewriteValueARM_OpSignmask_0(v) 772 case OpSlicemask: 773 return rewriteValueARM_OpSlicemask_0(v) 774 case OpSqrt: 775 return rewriteValueARM_OpSqrt_0(v) 776 case OpStaticCall: 777 return rewriteValueARM_OpStaticCall_0(v) 778 case OpStore: 779 return rewriteValueARM_OpStore_0(v) 780 case OpSub16: 781 return rewriteValueARM_OpSub16_0(v) 782 case OpSub32: 783 return rewriteValueARM_OpSub32_0(v) 784 case OpSub32F: 785 return rewriteValueARM_OpSub32F_0(v) 786 case OpSub32carry: 787 return rewriteValueARM_OpSub32carry_0(v) 788 case OpSub32withcarry: 789 return rewriteValueARM_OpSub32withcarry_0(v) 790 case OpSub64F: 791 return rewriteValueARM_OpSub64F_0(v) 792 case OpSub8: 793 return rewriteValueARM_OpSub8_0(v) 794 case OpSubPtr: 795 return rewriteValueARM_OpSubPtr_0(v) 796 case OpTrunc16to8: 797 return rewriteValueARM_OpTrunc16to8_0(v) 798 case OpTrunc32to16: 799 return rewriteValueARM_OpTrunc32to16_0(v) 800 case OpTrunc32to8: 801 return rewriteValueARM_OpTrunc32to8_0(v) 802 case OpWB: 803 return rewriteValueARM_OpWB_0(v) 804 case OpXor16: 805 return rewriteValueARM_OpXor16_0(v) 806 case OpXor32: 807 return rewriteValueARM_OpXor32_0(v) 808 case OpXor8: 809 return rewriteValueARM_OpXor8_0(v) 810 case OpZero: 811 return rewriteValueARM_OpZero_0(v) 812 case OpZeroExt16to32: 813 return rewriteValueARM_OpZeroExt16to32_0(v) 814 case OpZeroExt8to16: 815 return rewriteValueARM_OpZeroExt8to16_0(v) 816 case OpZeroExt8to32: 817 return rewriteValueARM_OpZeroExt8to32_0(v) 818 case OpZeromask: 819 return rewriteValueARM_OpZeromask_0(v) 820 } 821 return false 822 } 823 func rewriteValueARM_OpARMADC_0(v *Value) bool { 824 // match: (ADC (MOVWconst [c]) x flags) 825 // cond: 826 // result: (ADCconst [c] x flags) 827 for { 828 _ = v.Args[2] 829 v_0 := v.Args[0] 830 if v_0.Op != OpARMMOVWconst { 831 break 832 } 833 c := v_0.AuxInt 834 x := v.Args[1] 835 flags := v.Args[2] 836 v.reset(OpARMADCconst) 837 v.AuxInt = c 838 v.AddArg(x) 839 v.AddArg(flags) 840 return true 841 } 842 // match: (ADC x (MOVWconst [c]) flags) 843 // cond: 844 // result: (ADCconst [c] x flags) 845 for { 846 _ = v.Args[2] 847 x := v.Args[0] 848 v_1 := v.Args[1] 849 if v_1.Op != OpARMMOVWconst { 850 break 851 } 852 c := v_1.AuxInt 853 flags := v.Args[2] 854 v.reset(OpARMADCconst) 855 v.AuxInt = c 856 v.AddArg(x) 857 v.AddArg(flags) 858 return true 859 } 860 // match: (ADC x (MOVWconst [c]) flags) 861 // cond: 862 // result: (ADCconst [c] x flags) 863 for { 864 _ = v.Args[2] 865 x := v.Args[0] 866 v_1 := v.Args[1] 867 if v_1.Op != OpARMMOVWconst { 868 break 869 } 870 c := v_1.AuxInt 871 flags := v.Args[2] 872 v.reset(OpARMADCconst) 873 v.AuxInt = c 874 v.AddArg(x) 875 v.AddArg(flags) 876 return true 877 } 878 // match: (ADC (MOVWconst [c]) x flags) 879 // cond: 880 // result: (ADCconst [c] x flags) 881 for { 882 _ = v.Args[2] 883 v_0 := v.Args[0] 884 if v_0.Op != OpARMMOVWconst { 885 break 886 } 887 c := v_0.AuxInt 888 x := v.Args[1] 889 flags := v.Args[2] 890 v.reset(OpARMADCconst) 891 v.AuxInt = c 892 v.AddArg(x) 893 v.AddArg(flags) 894 return true 895 } 896 // match: (ADC x (SLLconst [c] y) flags) 897 // cond: 898 // result: (ADCshiftLL x y [c] flags) 899 for { 900 _ = v.Args[2] 901 x := v.Args[0] 902 v_1 := v.Args[1] 903 if v_1.Op != OpARMSLLconst { 904 break 905 } 906 c := v_1.AuxInt 907 y := v_1.Args[0] 908 flags := v.Args[2] 909 v.reset(OpARMADCshiftLL) 910 v.AuxInt = c 911 v.AddArg(x) 912 v.AddArg(y) 913 v.AddArg(flags) 914 return true 915 } 916 // match: (ADC (SLLconst [c] y) x flags) 917 // cond: 918 // result: (ADCshiftLL x y [c] flags) 919 for { 920 _ = v.Args[2] 921 v_0 := v.Args[0] 922 if v_0.Op != OpARMSLLconst { 923 break 924 } 925 c := v_0.AuxInt 926 y := v_0.Args[0] 927 x := v.Args[1] 928 flags := v.Args[2] 929 v.reset(OpARMADCshiftLL) 930 v.AuxInt = c 931 v.AddArg(x) 932 v.AddArg(y) 933 v.AddArg(flags) 934 return true 935 } 936 // match: (ADC (SLLconst [c] y) x flags) 937 // cond: 938 // result: (ADCshiftLL x y [c] flags) 939 for { 940 _ = v.Args[2] 941 v_0 := v.Args[0] 942 if v_0.Op != OpARMSLLconst { 943 break 944 } 945 c := v_0.AuxInt 946 y := v_0.Args[0] 947 x := v.Args[1] 948 flags := v.Args[2] 949 v.reset(OpARMADCshiftLL) 950 v.AuxInt = c 951 v.AddArg(x) 952 v.AddArg(y) 953 v.AddArg(flags) 954 return true 955 } 956 // match: (ADC x (SLLconst [c] y) flags) 957 // cond: 958 // result: (ADCshiftLL x y [c] flags) 959 for { 960 _ = v.Args[2] 961 x := v.Args[0] 962 v_1 := v.Args[1] 963 if v_1.Op != OpARMSLLconst { 964 break 965 } 966 c := v_1.AuxInt 967 y := v_1.Args[0] 968 flags := v.Args[2] 969 v.reset(OpARMADCshiftLL) 970 v.AuxInt = c 971 v.AddArg(x) 972 v.AddArg(y) 973 v.AddArg(flags) 974 return true 975 } 976 // match: (ADC x (SRLconst [c] y) flags) 977 // cond: 978 // result: (ADCshiftRL x y [c] flags) 979 for { 980 _ = v.Args[2] 981 x := v.Args[0] 982 v_1 := v.Args[1] 983 if v_1.Op != OpARMSRLconst { 984 break 985 } 986 c := v_1.AuxInt 987 y := v_1.Args[0] 988 flags := v.Args[2] 989 v.reset(OpARMADCshiftRL) 990 v.AuxInt = c 991 v.AddArg(x) 992 v.AddArg(y) 993 v.AddArg(flags) 994 return true 995 } 996 // match: (ADC (SRLconst [c] y) x flags) 997 // cond: 998 // result: (ADCshiftRL x y [c] flags) 999 for { 1000 _ = v.Args[2] 1001 v_0 := v.Args[0] 1002 if v_0.Op != OpARMSRLconst { 1003 break 1004 } 1005 c := v_0.AuxInt 1006 y := v_0.Args[0] 1007 x := v.Args[1] 1008 flags := v.Args[2] 1009 v.reset(OpARMADCshiftRL) 1010 v.AuxInt = c 1011 v.AddArg(x) 1012 v.AddArg(y) 1013 v.AddArg(flags) 1014 return true 1015 } 1016 return false 1017 } 1018 func rewriteValueARM_OpARMADC_10(v *Value) bool { 1019 // match: (ADC (SRLconst [c] y) x flags) 1020 // cond: 1021 // result: (ADCshiftRL x y [c] flags) 1022 for { 1023 _ = v.Args[2] 1024 v_0 := v.Args[0] 1025 if v_0.Op != OpARMSRLconst { 1026 break 1027 } 1028 c := v_0.AuxInt 1029 y := v_0.Args[0] 1030 x := v.Args[1] 1031 flags := v.Args[2] 1032 v.reset(OpARMADCshiftRL) 1033 v.AuxInt = c 1034 v.AddArg(x) 1035 v.AddArg(y) 1036 v.AddArg(flags) 1037 return true 1038 } 1039 // match: (ADC x (SRLconst [c] y) flags) 1040 // cond: 1041 // result: (ADCshiftRL x y [c] flags) 1042 for { 1043 _ = v.Args[2] 1044 x := v.Args[0] 1045 v_1 := v.Args[1] 1046 if v_1.Op != OpARMSRLconst { 1047 break 1048 } 1049 c := v_1.AuxInt 1050 y := v_1.Args[0] 1051 flags := v.Args[2] 1052 v.reset(OpARMADCshiftRL) 1053 v.AuxInt = c 1054 v.AddArg(x) 1055 v.AddArg(y) 1056 v.AddArg(flags) 1057 return true 1058 } 1059 // match: (ADC x (SRAconst [c] y) flags) 1060 // cond: 1061 // result: (ADCshiftRA x y [c] flags) 1062 for { 1063 _ = v.Args[2] 1064 x := v.Args[0] 1065 v_1 := v.Args[1] 1066 if v_1.Op != OpARMSRAconst { 1067 break 1068 } 1069 c := v_1.AuxInt 1070 y := v_1.Args[0] 1071 flags := v.Args[2] 1072 v.reset(OpARMADCshiftRA) 1073 v.AuxInt = c 1074 v.AddArg(x) 1075 v.AddArg(y) 1076 v.AddArg(flags) 1077 return true 1078 } 1079 // match: (ADC (SRAconst [c] y) x flags) 1080 // cond: 1081 // result: (ADCshiftRA x y [c] flags) 1082 for { 1083 _ = v.Args[2] 1084 v_0 := v.Args[0] 1085 if v_0.Op != OpARMSRAconst { 1086 break 1087 } 1088 c := v_0.AuxInt 1089 y := v_0.Args[0] 1090 x := v.Args[1] 1091 flags := v.Args[2] 1092 v.reset(OpARMADCshiftRA) 1093 v.AuxInt = c 1094 v.AddArg(x) 1095 v.AddArg(y) 1096 v.AddArg(flags) 1097 return true 1098 } 1099 // match: (ADC (SRAconst [c] y) x flags) 1100 // cond: 1101 // result: (ADCshiftRA x y [c] flags) 1102 for { 1103 _ = v.Args[2] 1104 v_0 := v.Args[0] 1105 if v_0.Op != OpARMSRAconst { 1106 break 1107 } 1108 c := v_0.AuxInt 1109 y := v_0.Args[0] 1110 x := v.Args[1] 1111 flags := v.Args[2] 1112 v.reset(OpARMADCshiftRA) 1113 v.AuxInt = c 1114 v.AddArg(x) 1115 v.AddArg(y) 1116 v.AddArg(flags) 1117 return true 1118 } 1119 // match: (ADC x (SRAconst [c] y) flags) 1120 // cond: 1121 // result: (ADCshiftRA x y [c] flags) 1122 for { 1123 _ = v.Args[2] 1124 x := v.Args[0] 1125 v_1 := v.Args[1] 1126 if v_1.Op != OpARMSRAconst { 1127 break 1128 } 1129 c := v_1.AuxInt 1130 y := v_1.Args[0] 1131 flags := v.Args[2] 1132 v.reset(OpARMADCshiftRA) 1133 v.AuxInt = c 1134 v.AddArg(x) 1135 v.AddArg(y) 1136 v.AddArg(flags) 1137 return true 1138 } 1139 // match: (ADC x (SLL y z) flags) 1140 // cond: 1141 // result: (ADCshiftLLreg x y z flags) 1142 for { 1143 _ = v.Args[2] 1144 x := v.Args[0] 1145 v_1 := v.Args[1] 1146 if v_1.Op != OpARMSLL { 1147 break 1148 } 1149 _ = v_1.Args[1] 1150 y := v_1.Args[0] 1151 z := v_1.Args[1] 1152 flags := v.Args[2] 1153 v.reset(OpARMADCshiftLLreg) 1154 v.AddArg(x) 1155 v.AddArg(y) 1156 v.AddArg(z) 1157 v.AddArg(flags) 1158 return true 1159 } 1160 // match: (ADC (SLL y z) x flags) 1161 // cond: 1162 // result: (ADCshiftLLreg x y z flags) 1163 for { 1164 _ = v.Args[2] 1165 v_0 := v.Args[0] 1166 if v_0.Op != OpARMSLL { 1167 break 1168 } 1169 _ = v_0.Args[1] 1170 y := v_0.Args[0] 1171 z := v_0.Args[1] 1172 x := v.Args[1] 1173 flags := v.Args[2] 1174 v.reset(OpARMADCshiftLLreg) 1175 v.AddArg(x) 1176 v.AddArg(y) 1177 v.AddArg(z) 1178 v.AddArg(flags) 1179 return true 1180 } 1181 // match: (ADC (SLL y z) x flags) 1182 // cond: 1183 // result: (ADCshiftLLreg x y z flags) 1184 for { 1185 _ = v.Args[2] 1186 v_0 := v.Args[0] 1187 if v_0.Op != OpARMSLL { 1188 break 1189 } 1190 _ = v_0.Args[1] 1191 y := v_0.Args[0] 1192 z := v_0.Args[1] 1193 x := v.Args[1] 1194 flags := v.Args[2] 1195 v.reset(OpARMADCshiftLLreg) 1196 v.AddArg(x) 1197 v.AddArg(y) 1198 v.AddArg(z) 1199 v.AddArg(flags) 1200 return true 1201 } 1202 // match: (ADC x (SLL y z) flags) 1203 // cond: 1204 // result: (ADCshiftLLreg x y z flags) 1205 for { 1206 _ = v.Args[2] 1207 x := v.Args[0] 1208 v_1 := v.Args[1] 1209 if v_1.Op != OpARMSLL { 1210 break 1211 } 1212 _ = v_1.Args[1] 1213 y := v_1.Args[0] 1214 z := v_1.Args[1] 1215 flags := v.Args[2] 1216 v.reset(OpARMADCshiftLLreg) 1217 v.AddArg(x) 1218 v.AddArg(y) 1219 v.AddArg(z) 1220 v.AddArg(flags) 1221 return true 1222 } 1223 return false 1224 } 1225 func rewriteValueARM_OpARMADC_20(v *Value) bool { 1226 // match: (ADC x (SRL y z) flags) 1227 // cond: 1228 // result: (ADCshiftRLreg x y z flags) 1229 for { 1230 _ = v.Args[2] 1231 x := v.Args[0] 1232 v_1 := v.Args[1] 1233 if v_1.Op != OpARMSRL { 1234 break 1235 } 1236 _ = v_1.Args[1] 1237 y := v_1.Args[0] 1238 z := v_1.Args[1] 1239 flags := v.Args[2] 1240 v.reset(OpARMADCshiftRLreg) 1241 v.AddArg(x) 1242 v.AddArg(y) 1243 v.AddArg(z) 1244 v.AddArg(flags) 1245 return true 1246 } 1247 // match: (ADC (SRL y z) x flags) 1248 // cond: 1249 // result: (ADCshiftRLreg x y z flags) 1250 for { 1251 _ = v.Args[2] 1252 v_0 := v.Args[0] 1253 if v_0.Op != OpARMSRL { 1254 break 1255 } 1256 _ = v_0.Args[1] 1257 y := v_0.Args[0] 1258 z := v_0.Args[1] 1259 x := v.Args[1] 1260 flags := v.Args[2] 1261 v.reset(OpARMADCshiftRLreg) 1262 v.AddArg(x) 1263 v.AddArg(y) 1264 v.AddArg(z) 1265 v.AddArg(flags) 1266 return true 1267 } 1268 // match: (ADC (SRL y z) x flags) 1269 // cond: 1270 // result: (ADCshiftRLreg x y z flags) 1271 for { 1272 _ = v.Args[2] 1273 v_0 := v.Args[0] 1274 if v_0.Op != OpARMSRL { 1275 break 1276 } 1277 _ = v_0.Args[1] 1278 y := v_0.Args[0] 1279 z := v_0.Args[1] 1280 x := v.Args[1] 1281 flags := v.Args[2] 1282 v.reset(OpARMADCshiftRLreg) 1283 v.AddArg(x) 1284 v.AddArg(y) 1285 v.AddArg(z) 1286 v.AddArg(flags) 1287 return true 1288 } 1289 // match: (ADC x (SRL y z) flags) 1290 // cond: 1291 // result: (ADCshiftRLreg x y z flags) 1292 for { 1293 _ = v.Args[2] 1294 x := v.Args[0] 1295 v_1 := v.Args[1] 1296 if v_1.Op != OpARMSRL { 1297 break 1298 } 1299 _ = v_1.Args[1] 1300 y := v_1.Args[0] 1301 z := v_1.Args[1] 1302 flags := v.Args[2] 1303 v.reset(OpARMADCshiftRLreg) 1304 v.AddArg(x) 1305 v.AddArg(y) 1306 v.AddArg(z) 1307 v.AddArg(flags) 1308 return true 1309 } 1310 // match: (ADC x (SRA y z) flags) 1311 // cond: 1312 // result: (ADCshiftRAreg x y z flags) 1313 for { 1314 _ = v.Args[2] 1315 x := v.Args[0] 1316 v_1 := v.Args[1] 1317 if v_1.Op != OpARMSRA { 1318 break 1319 } 1320 _ = v_1.Args[1] 1321 y := v_1.Args[0] 1322 z := v_1.Args[1] 1323 flags := v.Args[2] 1324 v.reset(OpARMADCshiftRAreg) 1325 v.AddArg(x) 1326 v.AddArg(y) 1327 v.AddArg(z) 1328 v.AddArg(flags) 1329 return true 1330 } 1331 // match: (ADC (SRA y z) x flags) 1332 // cond: 1333 // result: (ADCshiftRAreg x y z flags) 1334 for { 1335 _ = v.Args[2] 1336 v_0 := v.Args[0] 1337 if v_0.Op != OpARMSRA { 1338 break 1339 } 1340 _ = v_0.Args[1] 1341 y := v_0.Args[0] 1342 z := v_0.Args[1] 1343 x := v.Args[1] 1344 flags := v.Args[2] 1345 v.reset(OpARMADCshiftRAreg) 1346 v.AddArg(x) 1347 v.AddArg(y) 1348 v.AddArg(z) 1349 v.AddArg(flags) 1350 return true 1351 } 1352 // match: (ADC (SRA y z) x flags) 1353 // cond: 1354 // result: (ADCshiftRAreg x y z flags) 1355 for { 1356 _ = v.Args[2] 1357 v_0 := v.Args[0] 1358 if v_0.Op != OpARMSRA { 1359 break 1360 } 1361 _ = v_0.Args[1] 1362 y := v_0.Args[0] 1363 z := v_0.Args[1] 1364 x := v.Args[1] 1365 flags := v.Args[2] 1366 v.reset(OpARMADCshiftRAreg) 1367 v.AddArg(x) 1368 v.AddArg(y) 1369 v.AddArg(z) 1370 v.AddArg(flags) 1371 return true 1372 } 1373 // match: (ADC x (SRA y z) flags) 1374 // cond: 1375 // result: (ADCshiftRAreg x y z flags) 1376 for { 1377 _ = v.Args[2] 1378 x := v.Args[0] 1379 v_1 := v.Args[1] 1380 if v_1.Op != OpARMSRA { 1381 break 1382 } 1383 _ = v_1.Args[1] 1384 y := v_1.Args[0] 1385 z := v_1.Args[1] 1386 flags := v.Args[2] 1387 v.reset(OpARMADCshiftRAreg) 1388 v.AddArg(x) 1389 v.AddArg(y) 1390 v.AddArg(z) 1391 v.AddArg(flags) 1392 return true 1393 } 1394 return false 1395 } 1396 func rewriteValueARM_OpARMADCconst_0(v *Value) bool { 1397 // match: (ADCconst [c] (ADDconst [d] x) flags) 1398 // cond: 1399 // result: (ADCconst [int64(int32(c+d))] x flags) 1400 for { 1401 c := v.AuxInt 1402 _ = v.Args[1] 1403 v_0 := v.Args[0] 1404 if v_0.Op != OpARMADDconst { 1405 break 1406 } 1407 d := v_0.AuxInt 1408 x := v_0.Args[0] 1409 flags := v.Args[1] 1410 v.reset(OpARMADCconst) 1411 v.AuxInt = int64(int32(c + d)) 1412 v.AddArg(x) 1413 v.AddArg(flags) 1414 return true 1415 } 1416 // match: (ADCconst [c] (SUBconst [d] x) flags) 1417 // cond: 1418 // result: (ADCconst [int64(int32(c-d))] x flags) 1419 for { 1420 c := v.AuxInt 1421 _ = v.Args[1] 1422 v_0 := v.Args[0] 1423 if v_0.Op != OpARMSUBconst { 1424 break 1425 } 1426 d := v_0.AuxInt 1427 x := v_0.Args[0] 1428 flags := v.Args[1] 1429 v.reset(OpARMADCconst) 1430 v.AuxInt = int64(int32(c - d)) 1431 v.AddArg(x) 1432 v.AddArg(flags) 1433 return true 1434 } 1435 return false 1436 } 1437 func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { 1438 b := v.Block 1439 _ = b 1440 // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) 1441 // cond: 1442 // result: (ADCconst [c] (SLLconst <x.Type> x [d]) flags) 1443 for { 1444 d := v.AuxInt 1445 _ = v.Args[2] 1446 v_0 := v.Args[0] 1447 if v_0.Op != OpARMMOVWconst { 1448 break 1449 } 1450 c := v_0.AuxInt 1451 x := v.Args[1] 1452 flags := v.Args[2] 1453 v.reset(OpARMADCconst) 1454 v.AuxInt = c 1455 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 1456 v0.AuxInt = d 1457 v0.AddArg(x) 1458 v.AddArg(v0) 1459 v.AddArg(flags) 1460 return true 1461 } 1462 // match: (ADCshiftLL x (MOVWconst [c]) [d] flags) 1463 // cond: 1464 // result: (ADCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 1465 for { 1466 d := v.AuxInt 1467 _ = v.Args[2] 1468 x := v.Args[0] 1469 v_1 := v.Args[1] 1470 if v_1.Op != OpARMMOVWconst { 1471 break 1472 } 1473 c := v_1.AuxInt 1474 flags := v.Args[2] 1475 v.reset(OpARMADCconst) 1476 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 1477 v.AddArg(x) 1478 v.AddArg(flags) 1479 return true 1480 } 1481 return false 1482 } 1483 func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { 1484 b := v.Block 1485 _ = b 1486 // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) 1487 // cond: 1488 // result: (ADCconst [c] (SLL <x.Type> x y) flags) 1489 for { 1490 _ = v.Args[3] 1491 v_0 := v.Args[0] 1492 if v_0.Op != OpARMMOVWconst { 1493 break 1494 } 1495 c := v_0.AuxInt 1496 x := v.Args[1] 1497 y := v.Args[2] 1498 flags := v.Args[3] 1499 v.reset(OpARMADCconst) 1500 v.AuxInt = c 1501 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 1502 v0.AddArg(x) 1503 v0.AddArg(y) 1504 v.AddArg(v0) 1505 v.AddArg(flags) 1506 return true 1507 } 1508 // match: (ADCshiftLLreg x y (MOVWconst [c]) flags) 1509 // cond: 1510 // result: (ADCshiftLL x y [c] flags) 1511 for { 1512 _ = v.Args[3] 1513 x := v.Args[0] 1514 y := v.Args[1] 1515 v_2 := v.Args[2] 1516 if v_2.Op != OpARMMOVWconst { 1517 break 1518 } 1519 c := v_2.AuxInt 1520 flags := v.Args[3] 1521 v.reset(OpARMADCshiftLL) 1522 v.AuxInt = c 1523 v.AddArg(x) 1524 v.AddArg(y) 1525 v.AddArg(flags) 1526 return true 1527 } 1528 return false 1529 } 1530 func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { 1531 b := v.Block 1532 _ = b 1533 // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) 1534 // cond: 1535 // result: (ADCconst [c] (SRAconst <x.Type> x [d]) flags) 1536 for { 1537 d := v.AuxInt 1538 _ = v.Args[2] 1539 v_0 := v.Args[0] 1540 if v_0.Op != OpARMMOVWconst { 1541 break 1542 } 1543 c := v_0.AuxInt 1544 x := v.Args[1] 1545 flags := v.Args[2] 1546 v.reset(OpARMADCconst) 1547 v.AuxInt = c 1548 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 1549 v0.AuxInt = d 1550 v0.AddArg(x) 1551 v.AddArg(v0) 1552 v.AddArg(flags) 1553 return true 1554 } 1555 // match: (ADCshiftRA x (MOVWconst [c]) [d] flags) 1556 // cond: 1557 // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) 1558 for { 1559 d := v.AuxInt 1560 _ = v.Args[2] 1561 x := v.Args[0] 1562 v_1 := v.Args[1] 1563 if v_1.Op != OpARMMOVWconst { 1564 break 1565 } 1566 c := v_1.AuxInt 1567 flags := v.Args[2] 1568 v.reset(OpARMADCconst) 1569 v.AuxInt = int64(int32(c) >> uint64(d)) 1570 v.AddArg(x) 1571 v.AddArg(flags) 1572 return true 1573 } 1574 return false 1575 } 1576 func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { 1577 b := v.Block 1578 _ = b 1579 // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) 1580 // cond: 1581 // result: (ADCconst [c] (SRA <x.Type> x y) flags) 1582 for { 1583 _ = v.Args[3] 1584 v_0 := v.Args[0] 1585 if v_0.Op != OpARMMOVWconst { 1586 break 1587 } 1588 c := v_0.AuxInt 1589 x := v.Args[1] 1590 y := v.Args[2] 1591 flags := v.Args[3] 1592 v.reset(OpARMADCconst) 1593 v.AuxInt = c 1594 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 1595 v0.AddArg(x) 1596 v0.AddArg(y) 1597 v.AddArg(v0) 1598 v.AddArg(flags) 1599 return true 1600 } 1601 // match: (ADCshiftRAreg x y (MOVWconst [c]) flags) 1602 // cond: 1603 // result: (ADCshiftRA x y [c] flags) 1604 for { 1605 _ = v.Args[3] 1606 x := v.Args[0] 1607 y := v.Args[1] 1608 v_2 := v.Args[2] 1609 if v_2.Op != OpARMMOVWconst { 1610 break 1611 } 1612 c := v_2.AuxInt 1613 flags := v.Args[3] 1614 v.reset(OpARMADCshiftRA) 1615 v.AuxInt = c 1616 v.AddArg(x) 1617 v.AddArg(y) 1618 v.AddArg(flags) 1619 return true 1620 } 1621 return false 1622 } 1623 func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { 1624 b := v.Block 1625 _ = b 1626 // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) 1627 // cond: 1628 // result: (ADCconst [c] (SRLconst <x.Type> x [d]) flags) 1629 for { 1630 d := v.AuxInt 1631 _ = v.Args[2] 1632 v_0 := v.Args[0] 1633 if v_0.Op != OpARMMOVWconst { 1634 break 1635 } 1636 c := v_0.AuxInt 1637 x := v.Args[1] 1638 flags := v.Args[2] 1639 v.reset(OpARMADCconst) 1640 v.AuxInt = c 1641 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 1642 v0.AuxInt = d 1643 v0.AddArg(x) 1644 v.AddArg(v0) 1645 v.AddArg(flags) 1646 return true 1647 } 1648 // match: (ADCshiftRL x (MOVWconst [c]) [d] flags) 1649 // cond: 1650 // result: (ADCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 1651 for { 1652 d := v.AuxInt 1653 _ = v.Args[2] 1654 x := v.Args[0] 1655 v_1 := v.Args[1] 1656 if v_1.Op != OpARMMOVWconst { 1657 break 1658 } 1659 c := v_1.AuxInt 1660 flags := v.Args[2] 1661 v.reset(OpARMADCconst) 1662 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 1663 v.AddArg(x) 1664 v.AddArg(flags) 1665 return true 1666 } 1667 return false 1668 } 1669 func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { 1670 b := v.Block 1671 _ = b 1672 // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) 1673 // cond: 1674 // result: (ADCconst [c] (SRL <x.Type> x y) flags) 1675 for { 1676 _ = v.Args[3] 1677 v_0 := v.Args[0] 1678 if v_0.Op != OpARMMOVWconst { 1679 break 1680 } 1681 c := v_0.AuxInt 1682 x := v.Args[1] 1683 y := v.Args[2] 1684 flags := v.Args[3] 1685 v.reset(OpARMADCconst) 1686 v.AuxInt = c 1687 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 1688 v0.AddArg(x) 1689 v0.AddArg(y) 1690 v.AddArg(v0) 1691 v.AddArg(flags) 1692 return true 1693 } 1694 // match: (ADCshiftRLreg x y (MOVWconst [c]) flags) 1695 // cond: 1696 // result: (ADCshiftRL x y [c] flags) 1697 for { 1698 _ = v.Args[3] 1699 x := v.Args[0] 1700 y := v.Args[1] 1701 v_2 := v.Args[2] 1702 if v_2.Op != OpARMMOVWconst { 1703 break 1704 } 1705 c := v_2.AuxInt 1706 flags := v.Args[3] 1707 v.reset(OpARMADCshiftRL) 1708 v.AuxInt = c 1709 v.AddArg(x) 1710 v.AddArg(y) 1711 v.AddArg(flags) 1712 return true 1713 } 1714 return false 1715 } 1716 func rewriteValueARM_OpARMADD_0(v *Value) bool { 1717 // match: (ADD x (MOVWconst [c])) 1718 // cond: 1719 // result: (ADDconst [c] x) 1720 for { 1721 _ = v.Args[1] 1722 x := v.Args[0] 1723 v_1 := v.Args[1] 1724 if v_1.Op != OpARMMOVWconst { 1725 break 1726 } 1727 c := v_1.AuxInt 1728 v.reset(OpARMADDconst) 1729 v.AuxInt = c 1730 v.AddArg(x) 1731 return true 1732 } 1733 // match: (ADD (MOVWconst [c]) x) 1734 // cond: 1735 // result: (ADDconst [c] x) 1736 for { 1737 _ = v.Args[1] 1738 v_0 := v.Args[0] 1739 if v_0.Op != OpARMMOVWconst { 1740 break 1741 } 1742 c := v_0.AuxInt 1743 x := v.Args[1] 1744 v.reset(OpARMADDconst) 1745 v.AuxInt = c 1746 v.AddArg(x) 1747 return true 1748 } 1749 // match: (ADD x (SLLconst [c] y)) 1750 // cond: 1751 // result: (ADDshiftLL x y [c]) 1752 for { 1753 _ = v.Args[1] 1754 x := v.Args[0] 1755 v_1 := v.Args[1] 1756 if v_1.Op != OpARMSLLconst { 1757 break 1758 } 1759 c := v_1.AuxInt 1760 y := v_1.Args[0] 1761 v.reset(OpARMADDshiftLL) 1762 v.AuxInt = c 1763 v.AddArg(x) 1764 v.AddArg(y) 1765 return true 1766 } 1767 // match: (ADD (SLLconst [c] y) x) 1768 // cond: 1769 // result: (ADDshiftLL x y [c]) 1770 for { 1771 _ = v.Args[1] 1772 v_0 := v.Args[0] 1773 if v_0.Op != OpARMSLLconst { 1774 break 1775 } 1776 c := v_0.AuxInt 1777 y := v_0.Args[0] 1778 x := v.Args[1] 1779 v.reset(OpARMADDshiftLL) 1780 v.AuxInt = c 1781 v.AddArg(x) 1782 v.AddArg(y) 1783 return true 1784 } 1785 // match: (ADD x (SRLconst [c] y)) 1786 // cond: 1787 // result: (ADDshiftRL x y [c]) 1788 for { 1789 _ = v.Args[1] 1790 x := v.Args[0] 1791 v_1 := v.Args[1] 1792 if v_1.Op != OpARMSRLconst { 1793 break 1794 } 1795 c := v_1.AuxInt 1796 y := v_1.Args[0] 1797 v.reset(OpARMADDshiftRL) 1798 v.AuxInt = c 1799 v.AddArg(x) 1800 v.AddArg(y) 1801 return true 1802 } 1803 // match: (ADD (SRLconst [c] y) x) 1804 // cond: 1805 // result: (ADDshiftRL x y [c]) 1806 for { 1807 _ = v.Args[1] 1808 v_0 := v.Args[0] 1809 if v_0.Op != OpARMSRLconst { 1810 break 1811 } 1812 c := v_0.AuxInt 1813 y := v_0.Args[0] 1814 x := v.Args[1] 1815 v.reset(OpARMADDshiftRL) 1816 v.AuxInt = c 1817 v.AddArg(x) 1818 v.AddArg(y) 1819 return true 1820 } 1821 // match: (ADD x (SRAconst [c] y)) 1822 // cond: 1823 // result: (ADDshiftRA x y [c]) 1824 for { 1825 _ = v.Args[1] 1826 x := v.Args[0] 1827 v_1 := v.Args[1] 1828 if v_1.Op != OpARMSRAconst { 1829 break 1830 } 1831 c := v_1.AuxInt 1832 y := v_1.Args[0] 1833 v.reset(OpARMADDshiftRA) 1834 v.AuxInt = c 1835 v.AddArg(x) 1836 v.AddArg(y) 1837 return true 1838 } 1839 // match: (ADD (SRAconst [c] y) x) 1840 // cond: 1841 // result: (ADDshiftRA x y [c]) 1842 for { 1843 _ = v.Args[1] 1844 v_0 := v.Args[0] 1845 if v_0.Op != OpARMSRAconst { 1846 break 1847 } 1848 c := v_0.AuxInt 1849 y := v_0.Args[0] 1850 x := v.Args[1] 1851 v.reset(OpARMADDshiftRA) 1852 v.AuxInt = c 1853 v.AddArg(x) 1854 v.AddArg(y) 1855 return true 1856 } 1857 // match: (ADD x (SLL y z)) 1858 // cond: 1859 // result: (ADDshiftLLreg x y z) 1860 for { 1861 _ = v.Args[1] 1862 x := v.Args[0] 1863 v_1 := v.Args[1] 1864 if v_1.Op != OpARMSLL { 1865 break 1866 } 1867 _ = v_1.Args[1] 1868 y := v_1.Args[0] 1869 z := v_1.Args[1] 1870 v.reset(OpARMADDshiftLLreg) 1871 v.AddArg(x) 1872 v.AddArg(y) 1873 v.AddArg(z) 1874 return true 1875 } 1876 // match: (ADD (SLL y z) x) 1877 // cond: 1878 // result: (ADDshiftLLreg x y z) 1879 for { 1880 _ = v.Args[1] 1881 v_0 := v.Args[0] 1882 if v_0.Op != OpARMSLL { 1883 break 1884 } 1885 _ = v_0.Args[1] 1886 y := v_0.Args[0] 1887 z := v_0.Args[1] 1888 x := v.Args[1] 1889 v.reset(OpARMADDshiftLLreg) 1890 v.AddArg(x) 1891 v.AddArg(y) 1892 v.AddArg(z) 1893 return true 1894 } 1895 return false 1896 } 1897 func rewriteValueARM_OpARMADD_10(v *Value) bool { 1898 b := v.Block 1899 _ = b 1900 // match: (ADD x (SRL y z)) 1901 // cond: 1902 // result: (ADDshiftRLreg x y z) 1903 for { 1904 _ = v.Args[1] 1905 x := v.Args[0] 1906 v_1 := v.Args[1] 1907 if v_1.Op != OpARMSRL { 1908 break 1909 } 1910 _ = v_1.Args[1] 1911 y := v_1.Args[0] 1912 z := v_1.Args[1] 1913 v.reset(OpARMADDshiftRLreg) 1914 v.AddArg(x) 1915 v.AddArg(y) 1916 v.AddArg(z) 1917 return true 1918 } 1919 // match: (ADD (SRL y z) x) 1920 // cond: 1921 // result: (ADDshiftRLreg x y z) 1922 for { 1923 _ = v.Args[1] 1924 v_0 := v.Args[0] 1925 if v_0.Op != OpARMSRL { 1926 break 1927 } 1928 _ = v_0.Args[1] 1929 y := v_0.Args[0] 1930 z := v_0.Args[1] 1931 x := v.Args[1] 1932 v.reset(OpARMADDshiftRLreg) 1933 v.AddArg(x) 1934 v.AddArg(y) 1935 v.AddArg(z) 1936 return true 1937 } 1938 // match: (ADD x (SRA y z)) 1939 // cond: 1940 // result: (ADDshiftRAreg x y z) 1941 for { 1942 _ = v.Args[1] 1943 x := v.Args[0] 1944 v_1 := v.Args[1] 1945 if v_1.Op != OpARMSRA { 1946 break 1947 } 1948 _ = v_1.Args[1] 1949 y := v_1.Args[0] 1950 z := v_1.Args[1] 1951 v.reset(OpARMADDshiftRAreg) 1952 v.AddArg(x) 1953 v.AddArg(y) 1954 v.AddArg(z) 1955 return true 1956 } 1957 // match: (ADD (SRA y z) x) 1958 // cond: 1959 // result: (ADDshiftRAreg x y z) 1960 for { 1961 _ = v.Args[1] 1962 v_0 := v.Args[0] 1963 if v_0.Op != OpARMSRA { 1964 break 1965 } 1966 _ = v_0.Args[1] 1967 y := v_0.Args[0] 1968 z := v_0.Args[1] 1969 x := v.Args[1] 1970 v.reset(OpARMADDshiftRAreg) 1971 v.AddArg(x) 1972 v.AddArg(y) 1973 v.AddArg(z) 1974 return true 1975 } 1976 // match: (ADD x (RSBconst [0] y)) 1977 // cond: 1978 // result: (SUB x y) 1979 for { 1980 _ = v.Args[1] 1981 x := v.Args[0] 1982 v_1 := v.Args[1] 1983 if v_1.Op != OpARMRSBconst { 1984 break 1985 } 1986 if v_1.AuxInt != 0 { 1987 break 1988 } 1989 y := v_1.Args[0] 1990 v.reset(OpARMSUB) 1991 v.AddArg(x) 1992 v.AddArg(y) 1993 return true 1994 } 1995 // match: (ADD (RSBconst [0] y) x) 1996 // cond: 1997 // result: (SUB x y) 1998 for { 1999 _ = v.Args[1] 2000 v_0 := v.Args[0] 2001 if v_0.Op != OpARMRSBconst { 2002 break 2003 } 2004 if v_0.AuxInt != 0 { 2005 break 2006 } 2007 y := v_0.Args[0] 2008 x := v.Args[1] 2009 v.reset(OpARMSUB) 2010 v.AddArg(x) 2011 v.AddArg(y) 2012 return true 2013 } 2014 // match: (ADD <t> (RSBconst [c] x) (RSBconst [d] y)) 2015 // cond: 2016 // result: (RSBconst [c+d] (ADD <t> x y)) 2017 for { 2018 t := v.Type 2019 _ = v.Args[1] 2020 v_0 := v.Args[0] 2021 if v_0.Op != OpARMRSBconst { 2022 break 2023 } 2024 c := v_0.AuxInt 2025 x := v_0.Args[0] 2026 v_1 := v.Args[1] 2027 if v_1.Op != OpARMRSBconst { 2028 break 2029 } 2030 d := v_1.AuxInt 2031 y := v_1.Args[0] 2032 v.reset(OpARMRSBconst) 2033 v.AuxInt = c + d 2034 v0 := b.NewValue0(v.Pos, OpARMADD, t) 2035 v0.AddArg(x) 2036 v0.AddArg(y) 2037 v.AddArg(v0) 2038 return true 2039 } 2040 // match: (ADD <t> (RSBconst [d] y) (RSBconst [c] x)) 2041 // cond: 2042 // result: (RSBconst [c+d] (ADD <t> x y)) 2043 for { 2044 t := v.Type 2045 _ = v.Args[1] 2046 v_0 := v.Args[0] 2047 if v_0.Op != OpARMRSBconst { 2048 break 2049 } 2050 d := v_0.AuxInt 2051 y := v_0.Args[0] 2052 v_1 := v.Args[1] 2053 if v_1.Op != OpARMRSBconst { 2054 break 2055 } 2056 c := v_1.AuxInt 2057 x := v_1.Args[0] 2058 v.reset(OpARMRSBconst) 2059 v.AuxInt = c + d 2060 v0 := b.NewValue0(v.Pos, OpARMADD, t) 2061 v0.AddArg(x) 2062 v0.AddArg(y) 2063 v.AddArg(v0) 2064 return true 2065 } 2066 // match: (ADD (MUL x y) a) 2067 // cond: 2068 // result: (MULA x y a) 2069 for { 2070 _ = v.Args[1] 2071 v_0 := v.Args[0] 2072 if v_0.Op != OpARMMUL { 2073 break 2074 } 2075 _ = v_0.Args[1] 2076 x := v_0.Args[0] 2077 y := v_0.Args[1] 2078 a := v.Args[1] 2079 v.reset(OpARMMULA) 2080 v.AddArg(x) 2081 v.AddArg(y) 2082 v.AddArg(a) 2083 return true 2084 } 2085 // match: (ADD a (MUL x y)) 2086 // cond: 2087 // result: (MULA x y a) 2088 for { 2089 _ = v.Args[1] 2090 a := v.Args[0] 2091 v_1 := v.Args[1] 2092 if v_1.Op != OpARMMUL { 2093 break 2094 } 2095 _ = v_1.Args[1] 2096 x := v_1.Args[0] 2097 y := v_1.Args[1] 2098 v.reset(OpARMMULA) 2099 v.AddArg(x) 2100 v.AddArg(y) 2101 v.AddArg(a) 2102 return true 2103 } 2104 return false 2105 } 2106 func rewriteValueARM_OpARMADDD_0(v *Value) bool { 2107 // match: (ADDD a (MULD x y)) 2108 // cond: a.Uses == 1 && objabi.GOARM >= 6 2109 // result: (MULAD a x y) 2110 for { 2111 _ = v.Args[1] 2112 a := v.Args[0] 2113 v_1 := v.Args[1] 2114 if v_1.Op != OpARMMULD { 2115 break 2116 } 2117 _ = v_1.Args[1] 2118 x := v_1.Args[0] 2119 y := v_1.Args[1] 2120 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2121 break 2122 } 2123 v.reset(OpARMMULAD) 2124 v.AddArg(a) 2125 v.AddArg(x) 2126 v.AddArg(y) 2127 return true 2128 } 2129 // match: (ADDD (MULD x y) a) 2130 // cond: a.Uses == 1 && objabi.GOARM >= 6 2131 // result: (MULAD a x y) 2132 for { 2133 _ = v.Args[1] 2134 v_0 := v.Args[0] 2135 if v_0.Op != OpARMMULD { 2136 break 2137 } 2138 _ = v_0.Args[1] 2139 x := v_0.Args[0] 2140 y := v_0.Args[1] 2141 a := v.Args[1] 2142 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2143 break 2144 } 2145 v.reset(OpARMMULAD) 2146 v.AddArg(a) 2147 v.AddArg(x) 2148 v.AddArg(y) 2149 return true 2150 } 2151 // match: (ADDD a (NMULD x y)) 2152 // cond: a.Uses == 1 && objabi.GOARM >= 6 2153 // result: (MULSD a x y) 2154 for { 2155 _ = v.Args[1] 2156 a := v.Args[0] 2157 v_1 := v.Args[1] 2158 if v_1.Op != OpARMNMULD { 2159 break 2160 } 2161 _ = v_1.Args[1] 2162 x := v_1.Args[0] 2163 y := v_1.Args[1] 2164 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2165 break 2166 } 2167 v.reset(OpARMMULSD) 2168 v.AddArg(a) 2169 v.AddArg(x) 2170 v.AddArg(y) 2171 return true 2172 } 2173 // match: (ADDD (NMULD x y) a) 2174 // cond: a.Uses == 1 && objabi.GOARM >= 6 2175 // result: (MULSD a x y) 2176 for { 2177 _ = v.Args[1] 2178 v_0 := v.Args[0] 2179 if v_0.Op != OpARMNMULD { 2180 break 2181 } 2182 _ = v_0.Args[1] 2183 x := v_0.Args[0] 2184 y := v_0.Args[1] 2185 a := v.Args[1] 2186 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2187 break 2188 } 2189 v.reset(OpARMMULSD) 2190 v.AddArg(a) 2191 v.AddArg(x) 2192 v.AddArg(y) 2193 return true 2194 } 2195 return false 2196 } 2197 func rewriteValueARM_OpARMADDF_0(v *Value) bool { 2198 // match: (ADDF a (MULF x y)) 2199 // cond: a.Uses == 1 && objabi.GOARM >= 6 2200 // result: (MULAF a x y) 2201 for { 2202 _ = v.Args[1] 2203 a := v.Args[0] 2204 v_1 := v.Args[1] 2205 if v_1.Op != OpARMMULF { 2206 break 2207 } 2208 _ = v_1.Args[1] 2209 x := v_1.Args[0] 2210 y := v_1.Args[1] 2211 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2212 break 2213 } 2214 v.reset(OpARMMULAF) 2215 v.AddArg(a) 2216 v.AddArg(x) 2217 v.AddArg(y) 2218 return true 2219 } 2220 // match: (ADDF (MULF x y) a) 2221 // cond: a.Uses == 1 && objabi.GOARM >= 6 2222 // result: (MULAF a x y) 2223 for { 2224 _ = v.Args[1] 2225 v_0 := v.Args[0] 2226 if v_0.Op != OpARMMULF { 2227 break 2228 } 2229 _ = v_0.Args[1] 2230 x := v_0.Args[0] 2231 y := v_0.Args[1] 2232 a := v.Args[1] 2233 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2234 break 2235 } 2236 v.reset(OpARMMULAF) 2237 v.AddArg(a) 2238 v.AddArg(x) 2239 v.AddArg(y) 2240 return true 2241 } 2242 // match: (ADDF a (NMULF x y)) 2243 // cond: a.Uses == 1 && objabi.GOARM >= 6 2244 // result: (MULSF a x y) 2245 for { 2246 _ = v.Args[1] 2247 a := v.Args[0] 2248 v_1 := v.Args[1] 2249 if v_1.Op != OpARMNMULF { 2250 break 2251 } 2252 _ = v_1.Args[1] 2253 x := v_1.Args[0] 2254 y := v_1.Args[1] 2255 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2256 break 2257 } 2258 v.reset(OpARMMULSF) 2259 v.AddArg(a) 2260 v.AddArg(x) 2261 v.AddArg(y) 2262 return true 2263 } 2264 // match: (ADDF (NMULF x y) a) 2265 // cond: a.Uses == 1 && objabi.GOARM >= 6 2266 // result: (MULSF a x y) 2267 for { 2268 _ = v.Args[1] 2269 v_0 := v.Args[0] 2270 if v_0.Op != OpARMNMULF { 2271 break 2272 } 2273 _ = v_0.Args[1] 2274 x := v_0.Args[0] 2275 y := v_0.Args[1] 2276 a := v.Args[1] 2277 if !(a.Uses == 1 && objabi.GOARM >= 6) { 2278 break 2279 } 2280 v.reset(OpARMMULSF) 2281 v.AddArg(a) 2282 v.AddArg(x) 2283 v.AddArg(y) 2284 return true 2285 } 2286 return false 2287 } 2288 func rewriteValueARM_OpARMADDS_0(v *Value) bool { 2289 // match: (ADDS x (MOVWconst [c])) 2290 // cond: 2291 // result: (ADDSconst [c] x) 2292 for { 2293 _ = v.Args[1] 2294 x := v.Args[0] 2295 v_1 := v.Args[1] 2296 if v_1.Op != OpARMMOVWconst { 2297 break 2298 } 2299 c := v_1.AuxInt 2300 v.reset(OpARMADDSconst) 2301 v.AuxInt = c 2302 v.AddArg(x) 2303 return true 2304 } 2305 // match: (ADDS (MOVWconst [c]) x) 2306 // cond: 2307 // result: (ADDSconst [c] x) 2308 for { 2309 _ = v.Args[1] 2310 v_0 := v.Args[0] 2311 if v_0.Op != OpARMMOVWconst { 2312 break 2313 } 2314 c := v_0.AuxInt 2315 x := v.Args[1] 2316 v.reset(OpARMADDSconst) 2317 v.AuxInt = c 2318 v.AddArg(x) 2319 return true 2320 } 2321 // match: (ADDS x (SLLconst [c] y)) 2322 // cond: 2323 // result: (ADDSshiftLL x y [c]) 2324 for { 2325 _ = v.Args[1] 2326 x := v.Args[0] 2327 v_1 := v.Args[1] 2328 if v_1.Op != OpARMSLLconst { 2329 break 2330 } 2331 c := v_1.AuxInt 2332 y := v_1.Args[0] 2333 v.reset(OpARMADDSshiftLL) 2334 v.AuxInt = c 2335 v.AddArg(x) 2336 v.AddArg(y) 2337 return true 2338 } 2339 // match: (ADDS (SLLconst [c] y) x) 2340 // cond: 2341 // result: (ADDSshiftLL x y [c]) 2342 for { 2343 _ = v.Args[1] 2344 v_0 := v.Args[0] 2345 if v_0.Op != OpARMSLLconst { 2346 break 2347 } 2348 c := v_0.AuxInt 2349 y := v_0.Args[0] 2350 x := v.Args[1] 2351 v.reset(OpARMADDSshiftLL) 2352 v.AuxInt = c 2353 v.AddArg(x) 2354 v.AddArg(y) 2355 return true 2356 } 2357 // match: (ADDS x (SRLconst [c] y)) 2358 // cond: 2359 // result: (ADDSshiftRL x y [c]) 2360 for { 2361 _ = v.Args[1] 2362 x := v.Args[0] 2363 v_1 := v.Args[1] 2364 if v_1.Op != OpARMSRLconst { 2365 break 2366 } 2367 c := v_1.AuxInt 2368 y := v_1.Args[0] 2369 v.reset(OpARMADDSshiftRL) 2370 v.AuxInt = c 2371 v.AddArg(x) 2372 v.AddArg(y) 2373 return true 2374 } 2375 // match: (ADDS (SRLconst [c] y) x) 2376 // cond: 2377 // result: (ADDSshiftRL x y [c]) 2378 for { 2379 _ = v.Args[1] 2380 v_0 := v.Args[0] 2381 if v_0.Op != OpARMSRLconst { 2382 break 2383 } 2384 c := v_0.AuxInt 2385 y := v_0.Args[0] 2386 x := v.Args[1] 2387 v.reset(OpARMADDSshiftRL) 2388 v.AuxInt = c 2389 v.AddArg(x) 2390 v.AddArg(y) 2391 return true 2392 } 2393 // match: (ADDS x (SRAconst [c] y)) 2394 // cond: 2395 // result: (ADDSshiftRA x y [c]) 2396 for { 2397 _ = v.Args[1] 2398 x := v.Args[0] 2399 v_1 := v.Args[1] 2400 if v_1.Op != OpARMSRAconst { 2401 break 2402 } 2403 c := v_1.AuxInt 2404 y := v_1.Args[0] 2405 v.reset(OpARMADDSshiftRA) 2406 v.AuxInt = c 2407 v.AddArg(x) 2408 v.AddArg(y) 2409 return true 2410 } 2411 // match: (ADDS (SRAconst [c] y) x) 2412 // cond: 2413 // result: (ADDSshiftRA x y [c]) 2414 for { 2415 _ = v.Args[1] 2416 v_0 := v.Args[0] 2417 if v_0.Op != OpARMSRAconst { 2418 break 2419 } 2420 c := v_0.AuxInt 2421 y := v_0.Args[0] 2422 x := v.Args[1] 2423 v.reset(OpARMADDSshiftRA) 2424 v.AuxInt = c 2425 v.AddArg(x) 2426 v.AddArg(y) 2427 return true 2428 } 2429 // match: (ADDS x (SLL y z)) 2430 // cond: 2431 // result: (ADDSshiftLLreg x y z) 2432 for { 2433 _ = v.Args[1] 2434 x := v.Args[0] 2435 v_1 := v.Args[1] 2436 if v_1.Op != OpARMSLL { 2437 break 2438 } 2439 _ = v_1.Args[1] 2440 y := v_1.Args[0] 2441 z := v_1.Args[1] 2442 v.reset(OpARMADDSshiftLLreg) 2443 v.AddArg(x) 2444 v.AddArg(y) 2445 v.AddArg(z) 2446 return true 2447 } 2448 // match: (ADDS (SLL y z) x) 2449 // cond: 2450 // result: (ADDSshiftLLreg x y z) 2451 for { 2452 _ = v.Args[1] 2453 v_0 := v.Args[0] 2454 if v_0.Op != OpARMSLL { 2455 break 2456 } 2457 _ = v_0.Args[1] 2458 y := v_0.Args[0] 2459 z := v_0.Args[1] 2460 x := v.Args[1] 2461 v.reset(OpARMADDSshiftLLreg) 2462 v.AddArg(x) 2463 v.AddArg(y) 2464 v.AddArg(z) 2465 return true 2466 } 2467 return false 2468 } 2469 func rewriteValueARM_OpARMADDS_10(v *Value) bool { 2470 // match: (ADDS x (SRL y z)) 2471 // cond: 2472 // result: (ADDSshiftRLreg x y z) 2473 for { 2474 _ = v.Args[1] 2475 x := v.Args[0] 2476 v_1 := v.Args[1] 2477 if v_1.Op != OpARMSRL { 2478 break 2479 } 2480 _ = v_1.Args[1] 2481 y := v_1.Args[0] 2482 z := v_1.Args[1] 2483 v.reset(OpARMADDSshiftRLreg) 2484 v.AddArg(x) 2485 v.AddArg(y) 2486 v.AddArg(z) 2487 return true 2488 } 2489 // match: (ADDS (SRL y z) x) 2490 // cond: 2491 // result: (ADDSshiftRLreg x y z) 2492 for { 2493 _ = v.Args[1] 2494 v_0 := v.Args[0] 2495 if v_0.Op != OpARMSRL { 2496 break 2497 } 2498 _ = v_0.Args[1] 2499 y := v_0.Args[0] 2500 z := v_0.Args[1] 2501 x := v.Args[1] 2502 v.reset(OpARMADDSshiftRLreg) 2503 v.AddArg(x) 2504 v.AddArg(y) 2505 v.AddArg(z) 2506 return true 2507 } 2508 // match: (ADDS x (SRA y z)) 2509 // cond: 2510 // result: (ADDSshiftRAreg x y z) 2511 for { 2512 _ = v.Args[1] 2513 x := v.Args[0] 2514 v_1 := v.Args[1] 2515 if v_1.Op != OpARMSRA { 2516 break 2517 } 2518 _ = v_1.Args[1] 2519 y := v_1.Args[0] 2520 z := v_1.Args[1] 2521 v.reset(OpARMADDSshiftRAreg) 2522 v.AddArg(x) 2523 v.AddArg(y) 2524 v.AddArg(z) 2525 return true 2526 } 2527 // match: (ADDS (SRA y z) x) 2528 // cond: 2529 // result: (ADDSshiftRAreg x y z) 2530 for { 2531 _ = v.Args[1] 2532 v_0 := v.Args[0] 2533 if v_0.Op != OpARMSRA { 2534 break 2535 } 2536 _ = v_0.Args[1] 2537 y := v_0.Args[0] 2538 z := v_0.Args[1] 2539 x := v.Args[1] 2540 v.reset(OpARMADDSshiftRAreg) 2541 v.AddArg(x) 2542 v.AddArg(y) 2543 v.AddArg(z) 2544 return true 2545 } 2546 return false 2547 } 2548 func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { 2549 b := v.Block 2550 _ = b 2551 // match: (ADDSshiftLL (MOVWconst [c]) x [d]) 2552 // cond: 2553 // result: (ADDSconst [c] (SLLconst <x.Type> x [d])) 2554 for { 2555 d := v.AuxInt 2556 _ = v.Args[1] 2557 v_0 := v.Args[0] 2558 if v_0.Op != OpARMMOVWconst { 2559 break 2560 } 2561 c := v_0.AuxInt 2562 x := v.Args[1] 2563 v.reset(OpARMADDSconst) 2564 v.AuxInt = c 2565 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2566 v0.AuxInt = d 2567 v0.AddArg(x) 2568 v.AddArg(v0) 2569 return true 2570 } 2571 // match: (ADDSshiftLL x (MOVWconst [c]) [d]) 2572 // cond: 2573 // result: (ADDSconst x [int64(int32(uint32(c)<<uint64(d)))]) 2574 for { 2575 d := v.AuxInt 2576 _ = v.Args[1] 2577 x := v.Args[0] 2578 v_1 := v.Args[1] 2579 if v_1.Op != OpARMMOVWconst { 2580 break 2581 } 2582 c := v_1.AuxInt 2583 v.reset(OpARMADDSconst) 2584 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 2585 v.AddArg(x) 2586 return true 2587 } 2588 return false 2589 } 2590 func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { 2591 b := v.Block 2592 _ = b 2593 // match: (ADDSshiftLLreg (MOVWconst [c]) x y) 2594 // cond: 2595 // result: (ADDSconst [c] (SLL <x.Type> x y)) 2596 for { 2597 _ = v.Args[2] 2598 v_0 := v.Args[0] 2599 if v_0.Op != OpARMMOVWconst { 2600 break 2601 } 2602 c := v_0.AuxInt 2603 x := v.Args[1] 2604 y := v.Args[2] 2605 v.reset(OpARMADDSconst) 2606 v.AuxInt = c 2607 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2608 v0.AddArg(x) 2609 v0.AddArg(y) 2610 v.AddArg(v0) 2611 return true 2612 } 2613 // match: (ADDSshiftLLreg x y (MOVWconst [c])) 2614 // cond: 2615 // result: (ADDSshiftLL x y [c]) 2616 for { 2617 _ = v.Args[2] 2618 x := v.Args[0] 2619 y := v.Args[1] 2620 v_2 := v.Args[2] 2621 if v_2.Op != OpARMMOVWconst { 2622 break 2623 } 2624 c := v_2.AuxInt 2625 v.reset(OpARMADDSshiftLL) 2626 v.AuxInt = c 2627 v.AddArg(x) 2628 v.AddArg(y) 2629 return true 2630 } 2631 return false 2632 } 2633 func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { 2634 b := v.Block 2635 _ = b 2636 // match: (ADDSshiftRA (MOVWconst [c]) x [d]) 2637 // cond: 2638 // result: (ADDSconst [c] (SRAconst <x.Type> x [d])) 2639 for { 2640 d := v.AuxInt 2641 _ = v.Args[1] 2642 v_0 := v.Args[0] 2643 if v_0.Op != OpARMMOVWconst { 2644 break 2645 } 2646 c := v_0.AuxInt 2647 x := v.Args[1] 2648 v.reset(OpARMADDSconst) 2649 v.AuxInt = c 2650 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 2651 v0.AuxInt = d 2652 v0.AddArg(x) 2653 v.AddArg(v0) 2654 return true 2655 } 2656 // match: (ADDSshiftRA x (MOVWconst [c]) [d]) 2657 // cond: 2658 // result: (ADDSconst x [int64(int32(c)>>uint64(d))]) 2659 for { 2660 d := v.AuxInt 2661 _ = v.Args[1] 2662 x := v.Args[0] 2663 v_1 := v.Args[1] 2664 if v_1.Op != OpARMMOVWconst { 2665 break 2666 } 2667 c := v_1.AuxInt 2668 v.reset(OpARMADDSconst) 2669 v.AuxInt = int64(int32(c) >> uint64(d)) 2670 v.AddArg(x) 2671 return true 2672 } 2673 return false 2674 } 2675 func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { 2676 b := v.Block 2677 _ = b 2678 // match: (ADDSshiftRAreg (MOVWconst [c]) x y) 2679 // cond: 2680 // result: (ADDSconst [c] (SRA <x.Type> x y)) 2681 for { 2682 _ = v.Args[2] 2683 v_0 := v.Args[0] 2684 if v_0.Op != OpARMMOVWconst { 2685 break 2686 } 2687 c := v_0.AuxInt 2688 x := v.Args[1] 2689 y := v.Args[2] 2690 v.reset(OpARMADDSconst) 2691 v.AuxInt = c 2692 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 2693 v0.AddArg(x) 2694 v0.AddArg(y) 2695 v.AddArg(v0) 2696 return true 2697 } 2698 // match: (ADDSshiftRAreg x y (MOVWconst [c])) 2699 // cond: 2700 // result: (ADDSshiftRA x y [c]) 2701 for { 2702 _ = v.Args[2] 2703 x := v.Args[0] 2704 y := v.Args[1] 2705 v_2 := v.Args[2] 2706 if v_2.Op != OpARMMOVWconst { 2707 break 2708 } 2709 c := v_2.AuxInt 2710 v.reset(OpARMADDSshiftRA) 2711 v.AuxInt = c 2712 v.AddArg(x) 2713 v.AddArg(y) 2714 return true 2715 } 2716 return false 2717 } 2718 func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { 2719 b := v.Block 2720 _ = b 2721 // match: (ADDSshiftRL (MOVWconst [c]) x [d]) 2722 // cond: 2723 // result: (ADDSconst [c] (SRLconst <x.Type> x [d])) 2724 for { 2725 d := v.AuxInt 2726 _ = v.Args[1] 2727 v_0 := v.Args[0] 2728 if v_0.Op != OpARMMOVWconst { 2729 break 2730 } 2731 c := v_0.AuxInt 2732 x := v.Args[1] 2733 v.reset(OpARMADDSconst) 2734 v.AuxInt = c 2735 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 2736 v0.AuxInt = d 2737 v0.AddArg(x) 2738 v.AddArg(v0) 2739 return true 2740 } 2741 // match: (ADDSshiftRL x (MOVWconst [c]) [d]) 2742 // cond: 2743 // result: (ADDSconst x [int64(int32(uint32(c)>>uint64(d)))]) 2744 for { 2745 d := v.AuxInt 2746 _ = v.Args[1] 2747 x := v.Args[0] 2748 v_1 := v.Args[1] 2749 if v_1.Op != OpARMMOVWconst { 2750 break 2751 } 2752 c := v_1.AuxInt 2753 v.reset(OpARMADDSconst) 2754 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 2755 v.AddArg(x) 2756 return true 2757 } 2758 return false 2759 } 2760 func rewriteValueARM_OpARMADDSshiftRLreg_0(v *Value) bool { 2761 b := v.Block 2762 _ = b 2763 // match: (ADDSshiftRLreg (MOVWconst [c]) x y) 2764 // cond: 2765 // result: (ADDSconst [c] (SRL <x.Type> x y)) 2766 for { 2767 _ = v.Args[2] 2768 v_0 := v.Args[0] 2769 if v_0.Op != OpARMMOVWconst { 2770 break 2771 } 2772 c := v_0.AuxInt 2773 x := v.Args[1] 2774 y := v.Args[2] 2775 v.reset(OpARMADDSconst) 2776 v.AuxInt = c 2777 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 2778 v0.AddArg(x) 2779 v0.AddArg(y) 2780 v.AddArg(v0) 2781 return true 2782 } 2783 // match: (ADDSshiftRLreg x y (MOVWconst [c])) 2784 // cond: 2785 // result: (ADDSshiftRL x y [c]) 2786 for { 2787 _ = v.Args[2] 2788 x := v.Args[0] 2789 y := v.Args[1] 2790 v_2 := v.Args[2] 2791 if v_2.Op != OpARMMOVWconst { 2792 break 2793 } 2794 c := v_2.AuxInt 2795 v.reset(OpARMADDSshiftRL) 2796 v.AuxInt = c 2797 v.AddArg(x) 2798 v.AddArg(y) 2799 return true 2800 } 2801 return false 2802 } 2803 func rewriteValueARM_OpARMADDconst_0(v *Value) bool { 2804 // match: (ADDconst [off1] (MOVWaddr [off2] {sym} ptr)) 2805 // cond: 2806 // result: (MOVWaddr [off1+off2] {sym} ptr) 2807 for { 2808 off1 := v.AuxInt 2809 v_0 := v.Args[0] 2810 if v_0.Op != OpARMMOVWaddr { 2811 break 2812 } 2813 off2 := v_0.AuxInt 2814 sym := v_0.Aux 2815 ptr := v_0.Args[0] 2816 v.reset(OpARMMOVWaddr) 2817 v.AuxInt = off1 + off2 2818 v.Aux = sym 2819 v.AddArg(ptr) 2820 return true 2821 } 2822 // match: (ADDconst [0] x) 2823 // cond: 2824 // result: x 2825 for { 2826 if v.AuxInt != 0 { 2827 break 2828 } 2829 x := v.Args[0] 2830 v.reset(OpCopy) 2831 v.Type = x.Type 2832 v.AddArg(x) 2833 return true 2834 } 2835 // match: (ADDconst [c] x) 2836 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 2837 // result: (SUBconst [int64(int32(-c))] x) 2838 for { 2839 c := v.AuxInt 2840 x := v.Args[0] 2841 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 2842 break 2843 } 2844 v.reset(OpARMSUBconst) 2845 v.AuxInt = int64(int32(-c)) 2846 v.AddArg(x) 2847 return true 2848 } 2849 // match: (ADDconst [c] (MOVWconst [d])) 2850 // cond: 2851 // result: (MOVWconst [int64(int32(c+d))]) 2852 for { 2853 c := v.AuxInt 2854 v_0 := v.Args[0] 2855 if v_0.Op != OpARMMOVWconst { 2856 break 2857 } 2858 d := v_0.AuxInt 2859 v.reset(OpARMMOVWconst) 2860 v.AuxInt = int64(int32(c + d)) 2861 return true 2862 } 2863 // match: (ADDconst [c] (ADDconst [d] x)) 2864 // cond: 2865 // result: (ADDconst [int64(int32(c+d))] x) 2866 for { 2867 c := v.AuxInt 2868 v_0 := v.Args[0] 2869 if v_0.Op != OpARMADDconst { 2870 break 2871 } 2872 d := v_0.AuxInt 2873 x := v_0.Args[0] 2874 v.reset(OpARMADDconst) 2875 v.AuxInt = int64(int32(c + d)) 2876 v.AddArg(x) 2877 return true 2878 } 2879 // match: (ADDconst [c] (SUBconst [d] x)) 2880 // cond: 2881 // result: (ADDconst [int64(int32(c-d))] x) 2882 for { 2883 c := v.AuxInt 2884 v_0 := v.Args[0] 2885 if v_0.Op != OpARMSUBconst { 2886 break 2887 } 2888 d := v_0.AuxInt 2889 x := v_0.Args[0] 2890 v.reset(OpARMADDconst) 2891 v.AuxInt = int64(int32(c - d)) 2892 v.AddArg(x) 2893 return true 2894 } 2895 // match: (ADDconst [c] (RSBconst [d] x)) 2896 // cond: 2897 // result: (RSBconst [int64(int32(c+d))] x) 2898 for { 2899 c := v.AuxInt 2900 v_0 := v.Args[0] 2901 if v_0.Op != OpARMRSBconst { 2902 break 2903 } 2904 d := v_0.AuxInt 2905 x := v_0.Args[0] 2906 v.reset(OpARMRSBconst) 2907 v.AuxInt = int64(int32(c + d)) 2908 v.AddArg(x) 2909 return true 2910 } 2911 return false 2912 } 2913 func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { 2914 b := v.Block 2915 _ = b 2916 // match: (ADDshiftLL (MOVWconst [c]) x [d]) 2917 // cond: 2918 // result: (ADDconst [c] (SLLconst <x.Type> x [d])) 2919 for { 2920 d := v.AuxInt 2921 _ = v.Args[1] 2922 v_0 := v.Args[0] 2923 if v_0.Op != OpARMMOVWconst { 2924 break 2925 } 2926 c := v_0.AuxInt 2927 x := v.Args[1] 2928 v.reset(OpARMADDconst) 2929 v.AuxInt = c 2930 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 2931 v0.AuxInt = d 2932 v0.AddArg(x) 2933 v.AddArg(v0) 2934 return true 2935 } 2936 // match: (ADDshiftLL x (MOVWconst [c]) [d]) 2937 // cond: 2938 // result: (ADDconst x [int64(int32(uint32(c)<<uint64(d)))]) 2939 for { 2940 d := v.AuxInt 2941 _ = v.Args[1] 2942 x := v.Args[0] 2943 v_1 := v.Args[1] 2944 if v_1.Op != OpARMMOVWconst { 2945 break 2946 } 2947 c := v_1.AuxInt 2948 v.reset(OpARMADDconst) 2949 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 2950 v.AddArg(x) 2951 return true 2952 } 2953 // match: (ADDshiftLL [c] (SRLconst x [32-c]) x) 2954 // cond: 2955 // result: (SRRconst [32-c] x) 2956 for { 2957 c := v.AuxInt 2958 _ = v.Args[1] 2959 v_0 := v.Args[0] 2960 if v_0.Op != OpARMSRLconst { 2961 break 2962 } 2963 if v_0.AuxInt != 32-c { 2964 break 2965 } 2966 x := v_0.Args[0] 2967 if x != v.Args[1] { 2968 break 2969 } 2970 v.reset(OpARMSRRconst) 2971 v.AuxInt = 32 - c 2972 v.AddArg(x) 2973 return true 2974 } 2975 return false 2976 } 2977 func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { 2978 b := v.Block 2979 _ = b 2980 // match: (ADDshiftLLreg (MOVWconst [c]) x y) 2981 // cond: 2982 // result: (ADDconst [c] (SLL <x.Type> x y)) 2983 for { 2984 _ = v.Args[2] 2985 v_0 := v.Args[0] 2986 if v_0.Op != OpARMMOVWconst { 2987 break 2988 } 2989 c := v_0.AuxInt 2990 x := v.Args[1] 2991 y := v.Args[2] 2992 v.reset(OpARMADDconst) 2993 v.AuxInt = c 2994 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 2995 v0.AddArg(x) 2996 v0.AddArg(y) 2997 v.AddArg(v0) 2998 return true 2999 } 3000 // match: (ADDshiftLLreg x y (MOVWconst [c])) 3001 // cond: 3002 // result: (ADDshiftLL x y [c]) 3003 for { 3004 _ = v.Args[2] 3005 x := v.Args[0] 3006 y := v.Args[1] 3007 v_2 := v.Args[2] 3008 if v_2.Op != OpARMMOVWconst { 3009 break 3010 } 3011 c := v_2.AuxInt 3012 v.reset(OpARMADDshiftLL) 3013 v.AuxInt = c 3014 v.AddArg(x) 3015 v.AddArg(y) 3016 return true 3017 } 3018 return false 3019 } 3020 func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { 3021 b := v.Block 3022 _ = b 3023 // match: (ADDshiftRA (MOVWconst [c]) x [d]) 3024 // cond: 3025 // result: (ADDconst [c] (SRAconst <x.Type> x [d])) 3026 for { 3027 d := v.AuxInt 3028 _ = v.Args[1] 3029 v_0 := v.Args[0] 3030 if v_0.Op != OpARMMOVWconst { 3031 break 3032 } 3033 c := v_0.AuxInt 3034 x := v.Args[1] 3035 v.reset(OpARMADDconst) 3036 v.AuxInt = c 3037 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3038 v0.AuxInt = d 3039 v0.AddArg(x) 3040 v.AddArg(v0) 3041 return true 3042 } 3043 // match: (ADDshiftRA x (MOVWconst [c]) [d]) 3044 // cond: 3045 // result: (ADDconst x [int64(int32(c)>>uint64(d))]) 3046 for { 3047 d := v.AuxInt 3048 _ = v.Args[1] 3049 x := v.Args[0] 3050 v_1 := v.Args[1] 3051 if v_1.Op != OpARMMOVWconst { 3052 break 3053 } 3054 c := v_1.AuxInt 3055 v.reset(OpARMADDconst) 3056 v.AuxInt = int64(int32(c) >> uint64(d)) 3057 v.AddArg(x) 3058 return true 3059 } 3060 return false 3061 } 3062 func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { 3063 b := v.Block 3064 _ = b 3065 // match: (ADDshiftRAreg (MOVWconst [c]) x y) 3066 // cond: 3067 // result: (ADDconst [c] (SRA <x.Type> x y)) 3068 for { 3069 _ = v.Args[2] 3070 v_0 := v.Args[0] 3071 if v_0.Op != OpARMMOVWconst { 3072 break 3073 } 3074 c := v_0.AuxInt 3075 x := v.Args[1] 3076 y := v.Args[2] 3077 v.reset(OpARMADDconst) 3078 v.AuxInt = c 3079 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3080 v0.AddArg(x) 3081 v0.AddArg(y) 3082 v.AddArg(v0) 3083 return true 3084 } 3085 // match: (ADDshiftRAreg x y (MOVWconst [c])) 3086 // cond: 3087 // result: (ADDshiftRA x y [c]) 3088 for { 3089 _ = v.Args[2] 3090 x := v.Args[0] 3091 y := v.Args[1] 3092 v_2 := v.Args[2] 3093 if v_2.Op != OpARMMOVWconst { 3094 break 3095 } 3096 c := v_2.AuxInt 3097 v.reset(OpARMADDshiftRA) 3098 v.AuxInt = c 3099 v.AddArg(x) 3100 v.AddArg(y) 3101 return true 3102 } 3103 return false 3104 } 3105 func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { 3106 b := v.Block 3107 _ = b 3108 // match: (ADDshiftRL (MOVWconst [c]) x [d]) 3109 // cond: 3110 // result: (ADDconst [c] (SRLconst <x.Type> x [d])) 3111 for { 3112 d := v.AuxInt 3113 _ = v.Args[1] 3114 v_0 := v.Args[0] 3115 if v_0.Op != OpARMMOVWconst { 3116 break 3117 } 3118 c := v_0.AuxInt 3119 x := v.Args[1] 3120 v.reset(OpARMADDconst) 3121 v.AuxInt = c 3122 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3123 v0.AuxInt = d 3124 v0.AddArg(x) 3125 v.AddArg(v0) 3126 return true 3127 } 3128 // match: (ADDshiftRL x (MOVWconst [c]) [d]) 3129 // cond: 3130 // result: (ADDconst x [int64(int32(uint32(c)>>uint64(d)))]) 3131 for { 3132 d := v.AuxInt 3133 _ = v.Args[1] 3134 x := v.Args[0] 3135 v_1 := v.Args[1] 3136 if v_1.Op != OpARMMOVWconst { 3137 break 3138 } 3139 c := v_1.AuxInt 3140 v.reset(OpARMADDconst) 3141 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 3142 v.AddArg(x) 3143 return true 3144 } 3145 // match: (ADDshiftRL [c] (SLLconst x [32-c]) x) 3146 // cond: 3147 // result: (SRRconst [ c] x) 3148 for { 3149 c := v.AuxInt 3150 _ = v.Args[1] 3151 v_0 := v.Args[0] 3152 if v_0.Op != OpARMSLLconst { 3153 break 3154 } 3155 if v_0.AuxInt != 32-c { 3156 break 3157 } 3158 x := v_0.Args[0] 3159 if x != v.Args[1] { 3160 break 3161 } 3162 v.reset(OpARMSRRconst) 3163 v.AuxInt = c 3164 v.AddArg(x) 3165 return true 3166 } 3167 return false 3168 } 3169 func rewriteValueARM_OpARMADDshiftRLreg_0(v *Value) bool { 3170 b := v.Block 3171 _ = b 3172 // match: (ADDshiftRLreg (MOVWconst [c]) x y) 3173 // cond: 3174 // result: (ADDconst [c] (SRL <x.Type> x y)) 3175 for { 3176 _ = v.Args[2] 3177 v_0 := v.Args[0] 3178 if v_0.Op != OpARMMOVWconst { 3179 break 3180 } 3181 c := v_0.AuxInt 3182 x := v.Args[1] 3183 y := v.Args[2] 3184 v.reset(OpARMADDconst) 3185 v.AuxInt = c 3186 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 3187 v0.AddArg(x) 3188 v0.AddArg(y) 3189 v.AddArg(v0) 3190 return true 3191 } 3192 // match: (ADDshiftRLreg x y (MOVWconst [c])) 3193 // cond: 3194 // result: (ADDshiftRL x y [c]) 3195 for { 3196 _ = v.Args[2] 3197 x := v.Args[0] 3198 y := v.Args[1] 3199 v_2 := v.Args[2] 3200 if v_2.Op != OpARMMOVWconst { 3201 break 3202 } 3203 c := v_2.AuxInt 3204 v.reset(OpARMADDshiftRL) 3205 v.AuxInt = c 3206 v.AddArg(x) 3207 v.AddArg(y) 3208 return true 3209 } 3210 return false 3211 } 3212 func rewriteValueARM_OpARMAND_0(v *Value) bool { 3213 // match: (AND x (MOVWconst [c])) 3214 // cond: 3215 // result: (ANDconst [c] x) 3216 for { 3217 _ = v.Args[1] 3218 x := v.Args[0] 3219 v_1 := v.Args[1] 3220 if v_1.Op != OpARMMOVWconst { 3221 break 3222 } 3223 c := v_1.AuxInt 3224 v.reset(OpARMANDconst) 3225 v.AuxInt = c 3226 v.AddArg(x) 3227 return true 3228 } 3229 // match: (AND (MOVWconst [c]) x) 3230 // cond: 3231 // result: (ANDconst [c] x) 3232 for { 3233 _ = v.Args[1] 3234 v_0 := v.Args[0] 3235 if v_0.Op != OpARMMOVWconst { 3236 break 3237 } 3238 c := v_0.AuxInt 3239 x := v.Args[1] 3240 v.reset(OpARMANDconst) 3241 v.AuxInt = c 3242 v.AddArg(x) 3243 return true 3244 } 3245 // match: (AND x (SLLconst [c] y)) 3246 // cond: 3247 // result: (ANDshiftLL x y [c]) 3248 for { 3249 _ = v.Args[1] 3250 x := v.Args[0] 3251 v_1 := v.Args[1] 3252 if v_1.Op != OpARMSLLconst { 3253 break 3254 } 3255 c := v_1.AuxInt 3256 y := v_1.Args[0] 3257 v.reset(OpARMANDshiftLL) 3258 v.AuxInt = c 3259 v.AddArg(x) 3260 v.AddArg(y) 3261 return true 3262 } 3263 // match: (AND (SLLconst [c] y) x) 3264 // cond: 3265 // result: (ANDshiftLL x y [c]) 3266 for { 3267 _ = v.Args[1] 3268 v_0 := v.Args[0] 3269 if v_0.Op != OpARMSLLconst { 3270 break 3271 } 3272 c := v_0.AuxInt 3273 y := v_0.Args[0] 3274 x := v.Args[1] 3275 v.reset(OpARMANDshiftLL) 3276 v.AuxInt = c 3277 v.AddArg(x) 3278 v.AddArg(y) 3279 return true 3280 } 3281 // match: (AND x (SRLconst [c] y)) 3282 // cond: 3283 // result: (ANDshiftRL x y [c]) 3284 for { 3285 _ = v.Args[1] 3286 x := v.Args[0] 3287 v_1 := v.Args[1] 3288 if v_1.Op != OpARMSRLconst { 3289 break 3290 } 3291 c := v_1.AuxInt 3292 y := v_1.Args[0] 3293 v.reset(OpARMANDshiftRL) 3294 v.AuxInt = c 3295 v.AddArg(x) 3296 v.AddArg(y) 3297 return true 3298 } 3299 // match: (AND (SRLconst [c] y) x) 3300 // cond: 3301 // result: (ANDshiftRL x y [c]) 3302 for { 3303 _ = v.Args[1] 3304 v_0 := v.Args[0] 3305 if v_0.Op != OpARMSRLconst { 3306 break 3307 } 3308 c := v_0.AuxInt 3309 y := v_0.Args[0] 3310 x := v.Args[1] 3311 v.reset(OpARMANDshiftRL) 3312 v.AuxInt = c 3313 v.AddArg(x) 3314 v.AddArg(y) 3315 return true 3316 } 3317 // match: (AND x (SRAconst [c] y)) 3318 // cond: 3319 // result: (ANDshiftRA x y [c]) 3320 for { 3321 _ = v.Args[1] 3322 x := v.Args[0] 3323 v_1 := v.Args[1] 3324 if v_1.Op != OpARMSRAconst { 3325 break 3326 } 3327 c := v_1.AuxInt 3328 y := v_1.Args[0] 3329 v.reset(OpARMANDshiftRA) 3330 v.AuxInt = c 3331 v.AddArg(x) 3332 v.AddArg(y) 3333 return true 3334 } 3335 // match: (AND (SRAconst [c] y) x) 3336 // cond: 3337 // result: (ANDshiftRA x y [c]) 3338 for { 3339 _ = v.Args[1] 3340 v_0 := v.Args[0] 3341 if v_0.Op != OpARMSRAconst { 3342 break 3343 } 3344 c := v_0.AuxInt 3345 y := v_0.Args[0] 3346 x := v.Args[1] 3347 v.reset(OpARMANDshiftRA) 3348 v.AuxInt = c 3349 v.AddArg(x) 3350 v.AddArg(y) 3351 return true 3352 } 3353 // match: (AND x (SLL y z)) 3354 // cond: 3355 // result: (ANDshiftLLreg x y z) 3356 for { 3357 _ = v.Args[1] 3358 x := v.Args[0] 3359 v_1 := v.Args[1] 3360 if v_1.Op != OpARMSLL { 3361 break 3362 } 3363 _ = v_1.Args[1] 3364 y := v_1.Args[0] 3365 z := v_1.Args[1] 3366 v.reset(OpARMANDshiftLLreg) 3367 v.AddArg(x) 3368 v.AddArg(y) 3369 v.AddArg(z) 3370 return true 3371 } 3372 // match: (AND (SLL y z) x) 3373 // cond: 3374 // result: (ANDshiftLLreg x y z) 3375 for { 3376 _ = v.Args[1] 3377 v_0 := v.Args[0] 3378 if v_0.Op != OpARMSLL { 3379 break 3380 } 3381 _ = v_0.Args[1] 3382 y := v_0.Args[0] 3383 z := v_0.Args[1] 3384 x := v.Args[1] 3385 v.reset(OpARMANDshiftLLreg) 3386 v.AddArg(x) 3387 v.AddArg(y) 3388 v.AddArg(z) 3389 return true 3390 } 3391 return false 3392 } 3393 func rewriteValueARM_OpARMAND_10(v *Value) bool { 3394 // match: (AND x (SRL y z)) 3395 // cond: 3396 // result: (ANDshiftRLreg x y z) 3397 for { 3398 _ = v.Args[1] 3399 x := v.Args[0] 3400 v_1 := v.Args[1] 3401 if v_1.Op != OpARMSRL { 3402 break 3403 } 3404 _ = v_1.Args[1] 3405 y := v_1.Args[0] 3406 z := v_1.Args[1] 3407 v.reset(OpARMANDshiftRLreg) 3408 v.AddArg(x) 3409 v.AddArg(y) 3410 v.AddArg(z) 3411 return true 3412 } 3413 // match: (AND (SRL y z) x) 3414 // cond: 3415 // result: (ANDshiftRLreg x y z) 3416 for { 3417 _ = v.Args[1] 3418 v_0 := v.Args[0] 3419 if v_0.Op != OpARMSRL { 3420 break 3421 } 3422 _ = v_0.Args[1] 3423 y := v_0.Args[0] 3424 z := v_0.Args[1] 3425 x := v.Args[1] 3426 v.reset(OpARMANDshiftRLreg) 3427 v.AddArg(x) 3428 v.AddArg(y) 3429 v.AddArg(z) 3430 return true 3431 } 3432 // match: (AND x (SRA y z)) 3433 // cond: 3434 // result: (ANDshiftRAreg x y z) 3435 for { 3436 _ = v.Args[1] 3437 x := v.Args[0] 3438 v_1 := v.Args[1] 3439 if v_1.Op != OpARMSRA { 3440 break 3441 } 3442 _ = v_1.Args[1] 3443 y := v_1.Args[0] 3444 z := v_1.Args[1] 3445 v.reset(OpARMANDshiftRAreg) 3446 v.AddArg(x) 3447 v.AddArg(y) 3448 v.AddArg(z) 3449 return true 3450 } 3451 // match: (AND (SRA y z) x) 3452 // cond: 3453 // result: (ANDshiftRAreg x y z) 3454 for { 3455 _ = v.Args[1] 3456 v_0 := v.Args[0] 3457 if v_0.Op != OpARMSRA { 3458 break 3459 } 3460 _ = v_0.Args[1] 3461 y := v_0.Args[0] 3462 z := v_0.Args[1] 3463 x := v.Args[1] 3464 v.reset(OpARMANDshiftRAreg) 3465 v.AddArg(x) 3466 v.AddArg(y) 3467 v.AddArg(z) 3468 return true 3469 } 3470 // match: (AND x x) 3471 // cond: 3472 // result: x 3473 for { 3474 _ = v.Args[1] 3475 x := v.Args[0] 3476 if x != v.Args[1] { 3477 break 3478 } 3479 v.reset(OpCopy) 3480 v.Type = x.Type 3481 v.AddArg(x) 3482 return true 3483 } 3484 // match: (AND x (MVN y)) 3485 // cond: 3486 // result: (BIC x y) 3487 for { 3488 _ = v.Args[1] 3489 x := v.Args[0] 3490 v_1 := v.Args[1] 3491 if v_1.Op != OpARMMVN { 3492 break 3493 } 3494 y := v_1.Args[0] 3495 v.reset(OpARMBIC) 3496 v.AddArg(x) 3497 v.AddArg(y) 3498 return true 3499 } 3500 // match: (AND (MVN y) x) 3501 // cond: 3502 // result: (BIC x y) 3503 for { 3504 _ = v.Args[1] 3505 v_0 := v.Args[0] 3506 if v_0.Op != OpARMMVN { 3507 break 3508 } 3509 y := v_0.Args[0] 3510 x := v.Args[1] 3511 v.reset(OpARMBIC) 3512 v.AddArg(x) 3513 v.AddArg(y) 3514 return true 3515 } 3516 // match: (AND x (MVNshiftLL y [c])) 3517 // cond: 3518 // result: (BICshiftLL x y [c]) 3519 for { 3520 _ = v.Args[1] 3521 x := v.Args[0] 3522 v_1 := v.Args[1] 3523 if v_1.Op != OpARMMVNshiftLL { 3524 break 3525 } 3526 c := v_1.AuxInt 3527 y := v_1.Args[0] 3528 v.reset(OpARMBICshiftLL) 3529 v.AuxInt = c 3530 v.AddArg(x) 3531 v.AddArg(y) 3532 return true 3533 } 3534 // match: (AND (MVNshiftLL y [c]) x) 3535 // cond: 3536 // result: (BICshiftLL x y [c]) 3537 for { 3538 _ = v.Args[1] 3539 v_0 := v.Args[0] 3540 if v_0.Op != OpARMMVNshiftLL { 3541 break 3542 } 3543 c := v_0.AuxInt 3544 y := v_0.Args[0] 3545 x := v.Args[1] 3546 v.reset(OpARMBICshiftLL) 3547 v.AuxInt = c 3548 v.AddArg(x) 3549 v.AddArg(y) 3550 return true 3551 } 3552 // match: (AND x (MVNshiftRL y [c])) 3553 // cond: 3554 // result: (BICshiftRL x y [c]) 3555 for { 3556 _ = v.Args[1] 3557 x := v.Args[0] 3558 v_1 := v.Args[1] 3559 if v_1.Op != OpARMMVNshiftRL { 3560 break 3561 } 3562 c := v_1.AuxInt 3563 y := v_1.Args[0] 3564 v.reset(OpARMBICshiftRL) 3565 v.AuxInt = c 3566 v.AddArg(x) 3567 v.AddArg(y) 3568 return true 3569 } 3570 return false 3571 } 3572 func rewriteValueARM_OpARMAND_20(v *Value) bool { 3573 // match: (AND (MVNshiftRL y [c]) x) 3574 // cond: 3575 // result: (BICshiftRL x y [c]) 3576 for { 3577 _ = v.Args[1] 3578 v_0 := v.Args[0] 3579 if v_0.Op != OpARMMVNshiftRL { 3580 break 3581 } 3582 c := v_0.AuxInt 3583 y := v_0.Args[0] 3584 x := v.Args[1] 3585 v.reset(OpARMBICshiftRL) 3586 v.AuxInt = c 3587 v.AddArg(x) 3588 v.AddArg(y) 3589 return true 3590 } 3591 // match: (AND x (MVNshiftRA y [c])) 3592 // cond: 3593 // result: (BICshiftRA x y [c]) 3594 for { 3595 _ = v.Args[1] 3596 x := v.Args[0] 3597 v_1 := v.Args[1] 3598 if v_1.Op != OpARMMVNshiftRA { 3599 break 3600 } 3601 c := v_1.AuxInt 3602 y := v_1.Args[0] 3603 v.reset(OpARMBICshiftRA) 3604 v.AuxInt = c 3605 v.AddArg(x) 3606 v.AddArg(y) 3607 return true 3608 } 3609 // match: (AND (MVNshiftRA y [c]) x) 3610 // cond: 3611 // result: (BICshiftRA x y [c]) 3612 for { 3613 _ = v.Args[1] 3614 v_0 := v.Args[0] 3615 if v_0.Op != OpARMMVNshiftRA { 3616 break 3617 } 3618 c := v_0.AuxInt 3619 y := v_0.Args[0] 3620 x := v.Args[1] 3621 v.reset(OpARMBICshiftRA) 3622 v.AuxInt = c 3623 v.AddArg(x) 3624 v.AddArg(y) 3625 return true 3626 } 3627 return false 3628 } 3629 func rewriteValueARM_OpARMANDconst_0(v *Value) bool { 3630 // match: (ANDconst [0] _) 3631 // cond: 3632 // result: (MOVWconst [0]) 3633 for { 3634 if v.AuxInt != 0 { 3635 break 3636 } 3637 v.reset(OpARMMOVWconst) 3638 v.AuxInt = 0 3639 return true 3640 } 3641 // match: (ANDconst [c] x) 3642 // cond: int32(c)==-1 3643 // result: x 3644 for { 3645 c := v.AuxInt 3646 x := v.Args[0] 3647 if !(int32(c) == -1) { 3648 break 3649 } 3650 v.reset(OpCopy) 3651 v.Type = x.Type 3652 v.AddArg(x) 3653 return true 3654 } 3655 // match: (ANDconst [c] x) 3656 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 3657 // result: (BICconst [int64(int32(^uint32(c)))] x) 3658 for { 3659 c := v.AuxInt 3660 x := v.Args[0] 3661 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 3662 break 3663 } 3664 v.reset(OpARMBICconst) 3665 v.AuxInt = int64(int32(^uint32(c))) 3666 v.AddArg(x) 3667 return true 3668 } 3669 // match: (ANDconst [c] (MOVWconst [d])) 3670 // cond: 3671 // result: (MOVWconst [c&d]) 3672 for { 3673 c := v.AuxInt 3674 v_0 := v.Args[0] 3675 if v_0.Op != OpARMMOVWconst { 3676 break 3677 } 3678 d := v_0.AuxInt 3679 v.reset(OpARMMOVWconst) 3680 v.AuxInt = c & d 3681 return true 3682 } 3683 // match: (ANDconst [c] (ANDconst [d] x)) 3684 // cond: 3685 // result: (ANDconst [c&d] x) 3686 for { 3687 c := v.AuxInt 3688 v_0 := v.Args[0] 3689 if v_0.Op != OpARMANDconst { 3690 break 3691 } 3692 d := v_0.AuxInt 3693 x := v_0.Args[0] 3694 v.reset(OpARMANDconst) 3695 v.AuxInt = c & d 3696 v.AddArg(x) 3697 return true 3698 } 3699 return false 3700 } 3701 func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { 3702 b := v.Block 3703 _ = b 3704 // match: (ANDshiftLL (MOVWconst [c]) x [d]) 3705 // cond: 3706 // result: (ANDconst [c] (SLLconst <x.Type> x [d])) 3707 for { 3708 d := v.AuxInt 3709 _ = v.Args[1] 3710 v_0 := v.Args[0] 3711 if v_0.Op != OpARMMOVWconst { 3712 break 3713 } 3714 c := v_0.AuxInt 3715 x := v.Args[1] 3716 v.reset(OpARMANDconst) 3717 v.AuxInt = c 3718 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 3719 v0.AuxInt = d 3720 v0.AddArg(x) 3721 v.AddArg(v0) 3722 return true 3723 } 3724 // match: (ANDshiftLL x (MOVWconst [c]) [d]) 3725 // cond: 3726 // result: (ANDconst x [int64(int32(uint32(c)<<uint64(d)))]) 3727 for { 3728 d := v.AuxInt 3729 _ = v.Args[1] 3730 x := v.Args[0] 3731 v_1 := v.Args[1] 3732 if v_1.Op != OpARMMOVWconst { 3733 break 3734 } 3735 c := v_1.AuxInt 3736 v.reset(OpARMANDconst) 3737 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 3738 v.AddArg(x) 3739 return true 3740 } 3741 // match: (ANDshiftLL x y:(SLLconst x [c]) [d]) 3742 // cond: c==d 3743 // result: y 3744 for { 3745 d := v.AuxInt 3746 _ = v.Args[1] 3747 x := v.Args[0] 3748 y := v.Args[1] 3749 if y.Op != OpARMSLLconst { 3750 break 3751 } 3752 c := y.AuxInt 3753 if x != y.Args[0] { 3754 break 3755 } 3756 if !(c == d) { 3757 break 3758 } 3759 v.reset(OpCopy) 3760 v.Type = y.Type 3761 v.AddArg(y) 3762 return true 3763 } 3764 return false 3765 } 3766 func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { 3767 b := v.Block 3768 _ = b 3769 // match: (ANDshiftLLreg (MOVWconst [c]) x y) 3770 // cond: 3771 // result: (ANDconst [c] (SLL <x.Type> x y)) 3772 for { 3773 _ = v.Args[2] 3774 v_0 := v.Args[0] 3775 if v_0.Op != OpARMMOVWconst { 3776 break 3777 } 3778 c := v_0.AuxInt 3779 x := v.Args[1] 3780 y := v.Args[2] 3781 v.reset(OpARMANDconst) 3782 v.AuxInt = c 3783 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 3784 v0.AddArg(x) 3785 v0.AddArg(y) 3786 v.AddArg(v0) 3787 return true 3788 } 3789 // match: (ANDshiftLLreg x y (MOVWconst [c])) 3790 // cond: 3791 // result: (ANDshiftLL x y [c]) 3792 for { 3793 _ = v.Args[2] 3794 x := v.Args[0] 3795 y := v.Args[1] 3796 v_2 := v.Args[2] 3797 if v_2.Op != OpARMMOVWconst { 3798 break 3799 } 3800 c := v_2.AuxInt 3801 v.reset(OpARMANDshiftLL) 3802 v.AuxInt = c 3803 v.AddArg(x) 3804 v.AddArg(y) 3805 return true 3806 } 3807 return false 3808 } 3809 func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { 3810 b := v.Block 3811 _ = b 3812 // match: (ANDshiftRA (MOVWconst [c]) x [d]) 3813 // cond: 3814 // result: (ANDconst [c] (SRAconst <x.Type> x [d])) 3815 for { 3816 d := v.AuxInt 3817 _ = v.Args[1] 3818 v_0 := v.Args[0] 3819 if v_0.Op != OpARMMOVWconst { 3820 break 3821 } 3822 c := v_0.AuxInt 3823 x := v.Args[1] 3824 v.reset(OpARMANDconst) 3825 v.AuxInt = c 3826 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 3827 v0.AuxInt = d 3828 v0.AddArg(x) 3829 v.AddArg(v0) 3830 return true 3831 } 3832 // match: (ANDshiftRA x (MOVWconst [c]) [d]) 3833 // cond: 3834 // result: (ANDconst x [int64(int32(c)>>uint64(d))]) 3835 for { 3836 d := v.AuxInt 3837 _ = v.Args[1] 3838 x := v.Args[0] 3839 v_1 := v.Args[1] 3840 if v_1.Op != OpARMMOVWconst { 3841 break 3842 } 3843 c := v_1.AuxInt 3844 v.reset(OpARMANDconst) 3845 v.AuxInt = int64(int32(c) >> uint64(d)) 3846 v.AddArg(x) 3847 return true 3848 } 3849 // match: (ANDshiftRA x y:(SRAconst x [c]) [d]) 3850 // cond: c==d 3851 // result: y 3852 for { 3853 d := v.AuxInt 3854 _ = v.Args[1] 3855 x := v.Args[0] 3856 y := v.Args[1] 3857 if y.Op != OpARMSRAconst { 3858 break 3859 } 3860 c := y.AuxInt 3861 if x != y.Args[0] { 3862 break 3863 } 3864 if !(c == d) { 3865 break 3866 } 3867 v.reset(OpCopy) 3868 v.Type = y.Type 3869 v.AddArg(y) 3870 return true 3871 } 3872 return false 3873 } 3874 func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { 3875 b := v.Block 3876 _ = b 3877 // match: (ANDshiftRAreg (MOVWconst [c]) x y) 3878 // cond: 3879 // result: (ANDconst [c] (SRA <x.Type> x y)) 3880 for { 3881 _ = v.Args[2] 3882 v_0 := v.Args[0] 3883 if v_0.Op != OpARMMOVWconst { 3884 break 3885 } 3886 c := v_0.AuxInt 3887 x := v.Args[1] 3888 y := v.Args[2] 3889 v.reset(OpARMANDconst) 3890 v.AuxInt = c 3891 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 3892 v0.AddArg(x) 3893 v0.AddArg(y) 3894 v.AddArg(v0) 3895 return true 3896 } 3897 // match: (ANDshiftRAreg x y (MOVWconst [c])) 3898 // cond: 3899 // result: (ANDshiftRA x y [c]) 3900 for { 3901 _ = v.Args[2] 3902 x := v.Args[0] 3903 y := v.Args[1] 3904 v_2 := v.Args[2] 3905 if v_2.Op != OpARMMOVWconst { 3906 break 3907 } 3908 c := v_2.AuxInt 3909 v.reset(OpARMANDshiftRA) 3910 v.AuxInt = c 3911 v.AddArg(x) 3912 v.AddArg(y) 3913 return true 3914 } 3915 return false 3916 } 3917 func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { 3918 b := v.Block 3919 _ = b 3920 // match: (ANDshiftRL (MOVWconst [c]) x [d]) 3921 // cond: 3922 // result: (ANDconst [c] (SRLconst <x.Type> x [d])) 3923 for { 3924 d := v.AuxInt 3925 _ = v.Args[1] 3926 v_0 := v.Args[0] 3927 if v_0.Op != OpARMMOVWconst { 3928 break 3929 } 3930 c := v_0.AuxInt 3931 x := v.Args[1] 3932 v.reset(OpARMANDconst) 3933 v.AuxInt = c 3934 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 3935 v0.AuxInt = d 3936 v0.AddArg(x) 3937 v.AddArg(v0) 3938 return true 3939 } 3940 // match: (ANDshiftRL x (MOVWconst [c]) [d]) 3941 // cond: 3942 // result: (ANDconst x [int64(int32(uint32(c)>>uint64(d)))]) 3943 for { 3944 d := v.AuxInt 3945 _ = v.Args[1] 3946 x := v.Args[0] 3947 v_1 := v.Args[1] 3948 if v_1.Op != OpARMMOVWconst { 3949 break 3950 } 3951 c := v_1.AuxInt 3952 v.reset(OpARMANDconst) 3953 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 3954 v.AddArg(x) 3955 return true 3956 } 3957 // match: (ANDshiftRL x y:(SRLconst x [c]) [d]) 3958 // cond: c==d 3959 // result: y 3960 for { 3961 d := v.AuxInt 3962 _ = v.Args[1] 3963 x := v.Args[0] 3964 y := v.Args[1] 3965 if y.Op != OpARMSRLconst { 3966 break 3967 } 3968 c := y.AuxInt 3969 if x != y.Args[0] { 3970 break 3971 } 3972 if !(c == d) { 3973 break 3974 } 3975 v.reset(OpCopy) 3976 v.Type = y.Type 3977 v.AddArg(y) 3978 return true 3979 } 3980 return false 3981 } 3982 func rewriteValueARM_OpARMANDshiftRLreg_0(v *Value) bool { 3983 b := v.Block 3984 _ = b 3985 // match: (ANDshiftRLreg (MOVWconst [c]) x y) 3986 // cond: 3987 // result: (ANDconst [c] (SRL <x.Type> x y)) 3988 for { 3989 _ = v.Args[2] 3990 v_0 := v.Args[0] 3991 if v_0.Op != OpARMMOVWconst { 3992 break 3993 } 3994 c := v_0.AuxInt 3995 x := v.Args[1] 3996 y := v.Args[2] 3997 v.reset(OpARMANDconst) 3998 v.AuxInt = c 3999 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 4000 v0.AddArg(x) 4001 v0.AddArg(y) 4002 v.AddArg(v0) 4003 return true 4004 } 4005 // match: (ANDshiftRLreg x y (MOVWconst [c])) 4006 // cond: 4007 // result: (ANDshiftRL x y [c]) 4008 for { 4009 _ = v.Args[2] 4010 x := v.Args[0] 4011 y := v.Args[1] 4012 v_2 := v.Args[2] 4013 if v_2.Op != OpARMMOVWconst { 4014 break 4015 } 4016 c := v_2.AuxInt 4017 v.reset(OpARMANDshiftRL) 4018 v.AuxInt = c 4019 v.AddArg(x) 4020 v.AddArg(y) 4021 return true 4022 } 4023 return false 4024 } 4025 func rewriteValueARM_OpARMBFX_0(v *Value) bool { 4026 // match: (BFX [c] (MOVWconst [d])) 4027 // cond: 4028 // result: (MOVWconst [int64(int32(d)<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8)))]) 4029 for { 4030 c := v.AuxInt 4031 v_0 := v.Args[0] 4032 if v_0.Op != OpARMMOVWconst { 4033 break 4034 } 4035 d := v_0.AuxInt 4036 v.reset(OpARMMOVWconst) 4037 v.AuxInt = int64(int32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))) 4038 return true 4039 } 4040 return false 4041 } 4042 func rewriteValueARM_OpARMBFXU_0(v *Value) bool { 4043 // match: (BFXU [c] (MOVWconst [d])) 4044 // cond: 4045 // result: (MOVWconst [int64(uint32(d)<<(32-uint32(c&0xff)-uint32(c>>8))>>(32-uint32(c>>8)))]) 4046 for { 4047 c := v.AuxInt 4048 v_0 := v.Args[0] 4049 if v_0.Op != OpARMMOVWconst { 4050 break 4051 } 4052 d := v_0.AuxInt 4053 v.reset(OpARMMOVWconst) 4054 v.AuxInt = int64(uint32(d) << (32 - uint32(c&0xff) - uint32(c>>8)) >> (32 - uint32(c>>8))) 4055 return true 4056 } 4057 return false 4058 } 4059 func rewriteValueARM_OpARMBIC_0(v *Value) bool { 4060 // match: (BIC x (MOVWconst [c])) 4061 // cond: 4062 // result: (BICconst [c] x) 4063 for { 4064 _ = v.Args[1] 4065 x := v.Args[0] 4066 v_1 := v.Args[1] 4067 if v_1.Op != OpARMMOVWconst { 4068 break 4069 } 4070 c := v_1.AuxInt 4071 v.reset(OpARMBICconst) 4072 v.AuxInt = c 4073 v.AddArg(x) 4074 return true 4075 } 4076 // match: (BIC x (SLLconst [c] y)) 4077 // cond: 4078 // result: (BICshiftLL x y [c]) 4079 for { 4080 _ = v.Args[1] 4081 x := v.Args[0] 4082 v_1 := v.Args[1] 4083 if v_1.Op != OpARMSLLconst { 4084 break 4085 } 4086 c := v_1.AuxInt 4087 y := v_1.Args[0] 4088 v.reset(OpARMBICshiftLL) 4089 v.AuxInt = c 4090 v.AddArg(x) 4091 v.AddArg(y) 4092 return true 4093 } 4094 // match: (BIC x (SRLconst [c] y)) 4095 // cond: 4096 // result: (BICshiftRL x y [c]) 4097 for { 4098 _ = v.Args[1] 4099 x := v.Args[0] 4100 v_1 := v.Args[1] 4101 if v_1.Op != OpARMSRLconst { 4102 break 4103 } 4104 c := v_1.AuxInt 4105 y := v_1.Args[0] 4106 v.reset(OpARMBICshiftRL) 4107 v.AuxInt = c 4108 v.AddArg(x) 4109 v.AddArg(y) 4110 return true 4111 } 4112 // match: (BIC x (SRAconst [c] y)) 4113 // cond: 4114 // result: (BICshiftRA x y [c]) 4115 for { 4116 _ = v.Args[1] 4117 x := v.Args[0] 4118 v_1 := v.Args[1] 4119 if v_1.Op != OpARMSRAconst { 4120 break 4121 } 4122 c := v_1.AuxInt 4123 y := v_1.Args[0] 4124 v.reset(OpARMBICshiftRA) 4125 v.AuxInt = c 4126 v.AddArg(x) 4127 v.AddArg(y) 4128 return true 4129 } 4130 // match: (BIC x (SLL y z)) 4131 // cond: 4132 // result: (BICshiftLLreg x y z) 4133 for { 4134 _ = v.Args[1] 4135 x := v.Args[0] 4136 v_1 := v.Args[1] 4137 if v_1.Op != OpARMSLL { 4138 break 4139 } 4140 _ = v_1.Args[1] 4141 y := v_1.Args[0] 4142 z := v_1.Args[1] 4143 v.reset(OpARMBICshiftLLreg) 4144 v.AddArg(x) 4145 v.AddArg(y) 4146 v.AddArg(z) 4147 return true 4148 } 4149 // match: (BIC x (SRL y z)) 4150 // cond: 4151 // result: (BICshiftRLreg x y z) 4152 for { 4153 _ = v.Args[1] 4154 x := v.Args[0] 4155 v_1 := v.Args[1] 4156 if v_1.Op != OpARMSRL { 4157 break 4158 } 4159 _ = v_1.Args[1] 4160 y := v_1.Args[0] 4161 z := v_1.Args[1] 4162 v.reset(OpARMBICshiftRLreg) 4163 v.AddArg(x) 4164 v.AddArg(y) 4165 v.AddArg(z) 4166 return true 4167 } 4168 // match: (BIC x (SRA y z)) 4169 // cond: 4170 // result: (BICshiftRAreg x y z) 4171 for { 4172 _ = v.Args[1] 4173 x := v.Args[0] 4174 v_1 := v.Args[1] 4175 if v_1.Op != OpARMSRA { 4176 break 4177 } 4178 _ = v_1.Args[1] 4179 y := v_1.Args[0] 4180 z := v_1.Args[1] 4181 v.reset(OpARMBICshiftRAreg) 4182 v.AddArg(x) 4183 v.AddArg(y) 4184 v.AddArg(z) 4185 return true 4186 } 4187 // match: (BIC x x) 4188 // cond: 4189 // result: (MOVWconst [0]) 4190 for { 4191 _ = v.Args[1] 4192 x := v.Args[0] 4193 if x != v.Args[1] { 4194 break 4195 } 4196 v.reset(OpARMMOVWconst) 4197 v.AuxInt = 0 4198 return true 4199 } 4200 return false 4201 } 4202 func rewriteValueARM_OpARMBICconst_0(v *Value) bool { 4203 // match: (BICconst [0] x) 4204 // cond: 4205 // result: x 4206 for { 4207 if v.AuxInt != 0 { 4208 break 4209 } 4210 x := v.Args[0] 4211 v.reset(OpCopy) 4212 v.Type = x.Type 4213 v.AddArg(x) 4214 return true 4215 } 4216 // match: (BICconst [c] _) 4217 // cond: int32(c)==-1 4218 // result: (MOVWconst [0]) 4219 for { 4220 c := v.AuxInt 4221 if !(int32(c) == -1) { 4222 break 4223 } 4224 v.reset(OpARMMOVWconst) 4225 v.AuxInt = 0 4226 return true 4227 } 4228 // match: (BICconst [c] x) 4229 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) 4230 // result: (ANDconst [int64(int32(^uint32(c)))] x) 4231 for { 4232 c := v.AuxInt 4233 x := v.Args[0] 4234 if !(!isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c))) { 4235 break 4236 } 4237 v.reset(OpARMANDconst) 4238 v.AuxInt = int64(int32(^uint32(c))) 4239 v.AddArg(x) 4240 return true 4241 } 4242 // match: (BICconst [c] (MOVWconst [d])) 4243 // cond: 4244 // result: (MOVWconst [d&^c]) 4245 for { 4246 c := v.AuxInt 4247 v_0 := v.Args[0] 4248 if v_0.Op != OpARMMOVWconst { 4249 break 4250 } 4251 d := v_0.AuxInt 4252 v.reset(OpARMMOVWconst) 4253 v.AuxInt = d &^ c 4254 return true 4255 } 4256 // match: (BICconst [c] (BICconst [d] x)) 4257 // cond: 4258 // result: (BICconst [int64(int32(c|d))] x) 4259 for { 4260 c := v.AuxInt 4261 v_0 := v.Args[0] 4262 if v_0.Op != OpARMBICconst { 4263 break 4264 } 4265 d := v_0.AuxInt 4266 x := v_0.Args[0] 4267 v.reset(OpARMBICconst) 4268 v.AuxInt = int64(int32(c | d)) 4269 v.AddArg(x) 4270 return true 4271 } 4272 return false 4273 } 4274 func rewriteValueARM_OpARMBICshiftLL_0(v *Value) bool { 4275 // match: (BICshiftLL x (MOVWconst [c]) [d]) 4276 // cond: 4277 // result: (BICconst x [int64(int32(uint32(c)<<uint64(d)))]) 4278 for { 4279 d := v.AuxInt 4280 _ = v.Args[1] 4281 x := v.Args[0] 4282 v_1 := v.Args[1] 4283 if v_1.Op != OpARMMOVWconst { 4284 break 4285 } 4286 c := v_1.AuxInt 4287 v.reset(OpARMBICconst) 4288 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 4289 v.AddArg(x) 4290 return true 4291 } 4292 // match: (BICshiftLL x (SLLconst x [c]) [d]) 4293 // cond: c==d 4294 // result: (MOVWconst [0]) 4295 for { 4296 d := v.AuxInt 4297 _ = v.Args[1] 4298 x := v.Args[0] 4299 v_1 := v.Args[1] 4300 if v_1.Op != OpARMSLLconst { 4301 break 4302 } 4303 c := v_1.AuxInt 4304 if x != v_1.Args[0] { 4305 break 4306 } 4307 if !(c == d) { 4308 break 4309 } 4310 v.reset(OpARMMOVWconst) 4311 v.AuxInt = 0 4312 return true 4313 } 4314 return false 4315 } 4316 func rewriteValueARM_OpARMBICshiftLLreg_0(v *Value) bool { 4317 // match: (BICshiftLLreg x y (MOVWconst [c])) 4318 // cond: 4319 // result: (BICshiftLL x y [c]) 4320 for { 4321 _ = v.Args[2] 4322 x := v.Args[0] 4323 y := v.Args[1] 4324 v_2 := v.Args[2] 4325 if v_2.Op != OpARMMOVWconst { 4326 break 4327 } 4328 c := v_2.AuxInt 4329 v.reset(OpARMBICshiftLL) 4330 v.AuxInt = c 4331 v.AddArg(x) 4332 v.AddArg(y) 4333 return true 4334 } 4335 return false 4336 } 4337 func rewriteValueARM_OpARMBICshiftRA_0(v *Value) bool { 4338 // match: (BICshiftRA x (MOVWconst [c]) [d]) 4339 // cond: 4340 // result: (BICconst x [int64(int32(c)>>uint64(d))]) 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 != OpARMMOVWconst { 4347 break 4348 } 4349 c := v_1.AuxInt 4350 v.reset(OpARMBICconst) 4351 v.AuxInt = int64(int32(c) >> uint64(d)) 4352 v.AddArg(x) 4353 return true 4354 } 4355 // match: (BICshiftRA x (SRAconst x [c]) [d]) 4356 // cond: c==d 4357 // result: (MOVWconst [0]) 4358 for { 4359 d := v.AuxInt 4360 _ = v.Args[1] 4361 x := v.Args[0] 4362 v_1 := v.Args[1] 4363 if v_1.Op != OpARMSRAconst { 4364 break 4365 } 4366 c := v_1.AuxInt 4367 if x != v_1.Args[0] { 4368 break 4369 } 4370 if !(c == d) { 4371 break 4372 } 4373 v.reset(OpARMMOVWconst) 4374 v.AuxInt = 0 4375 return true 4376 } 4377 return false 4378 } 4379 func rewriteValueARM_OpARMBICshiftRAreg_0(v *Value) bool { 4380 // match: (BICshiftRAreg x y (MOVWconst [c])) 4381 // cond: 4382 // result: (BICshiftRA x y [c]) 4383 for { 4384 _ = v.Args[2] 4385 x := v.Args[0] 4386 y := v.Args[1] 4387 v_2 := v.Args[2] 4388 if v_2.Op != OpARMMOVWconst { 4389 break 4390 } 4391 c := v_2.AuxInt 4392 v.reset(OpARMBICshiftRA) 4393 v.AuxInt = c 4394 v.AddArg(x) 4395 v.AddArg(y) 4396 return true 4397 } 4398 return false 4399 } 4400 func rewriteValueARM_OpARMBICshiftRL_0(v *Value) bool { 4401 // match: (BICshiftRL x (MOVWconst [c]) [d]) 4402 // cond: 4403 // result: (BICconst x [int64(int32(uint32(c)>>uint64(d)))]) 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 != OpARMMOVWconst { 4410 break 4411 } 4412 c := v_1.AuxInt 4413 v.reset(OpARMBICconst) 4414 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 4415 v.AddArg(x) 4416 return true 4417 } 4418 // match: (BICshiftRL x (SRLconst x [c]) [d]) 4419 // cond: c==d 4420 // result: (MOVWconst [0]) 4421 for { 4422 d := v.AuxInt 4423 _ = v.Args[1] 4424 x := v.Args[0] 4425 v_1 := v.Args[1] 4426 if v_1.Op != OpARMSRLconst { 4427 break 4428 } 4429 c := v_1.AuxInt 4430 if x != v_1.Args[0] { 4431 break 4432 } 4433 if !(c == d) { 4434 break 4435 } 4436 v.reset(OpARMMOVWconst) 4437 v.AuxInt = 0 4438 return true 4439 } 4440 return false 4441 } 4442 func rewriteValueARM_OpARMBICshiftRLreg_0(v *Value) bool { 4443 // match: (BICshiftRLreg x y (MOVWconst [c])) 4444 // cond: 4445 // result: (BICshiftRL x y [c]) 4446 for { 4447 _ = v.Args[2] 4448 x := v.Args[0] 4449 y := v.Args[1] 4450 v_2 := v.Args[2] 4451 if v_2.Op != OpARMMOVWconst { 4452 break 4453 } 4454 c := v_2.AuxInt 4455 v.reset(OpARMBICshiftRL) 4456 v.AuxInt = c 4457 v.AddArg(x) 4458 v.AddArg(y) 4459 return true 4460 } 4461 return false 4462 } 4463 func rewriteValueARM_OpARMCMN_0(v *Value) bool { 4464 // match: (CMN x (MOVWconst [c])) 4465 // cond: 4466 // result: (CMNconst [c] x) 4467 for { 4468 _ = v.Args[1] 4469 x := v.Args[0] 4470 v_1 := v.Args[1] 4471 if v_1.Op != OpARMMOVWconst { 4472 break 4473 } 4474 c := v_1.AuxInt 4475 v.reset(OpARMCMNconst) 4476 v.AuxInt = c 4477 v.AddArg(x) 4478 return true 4479 } 4480 // match: (CMN (MOVWconst [c]) x) 4481 // cond: 4482 // result: (CMNconst [c] x) 4483 for { 4484 _ = v.Args[1] 4485 v_0 := v.Args[0] 4486 if v_0.Op != OpARMMOVWconst { 4487 break 4488 } 4489 c := v_0.AuxInt 4490 x := v.Args[1] 4491 v.reset(OpARMCMNconst) 4492 v.AuxInt = c 4493 v.AddArg(x) 4494 return true 4495 } 4496 // match: (CMN x (SLLconst [c] y)) 4497 // cond: 4498 // result: (CMNshiftLL x y [c]) 4499 for { 4500 _ = v.Args[1] 4501 x := v.Args[0] 4502 v_1 := v.Args[1] 4503 if v_1.Op != OpARMSLLconst { 4504 break 4505 } 4506 c := v_1.AuxInt 4507 y := v_1.Args[0] 4508 v.reset(OpARMCMNshiftLL) 4509 v.AuxInt = c 4510 v.AddArg(x) 4511 v.AddArg(y) 4512 return true 4513 } 4514 // match: (CMN (SLLconst [c] y) x) 4515 // cond: 4516 // result: (CMNshiftLL x y [c]) 4517 for { 4518 _ = v.Args[1] 4519 v_0 := v.Args[0] 4520 if v_0.Op != OpARMSLLconst { 4521 break 4522 } 4523 c := v_0.AuxInt 4524 y := v_0.Args[0] 4525 x := v.Args[1] 4526 v.reset(OpARMCMNshiftLL) 4527 v.AuxInt = c 4528 v.AddArg(x) 4529 v.AddArg(y) 4530 return true 4531 } 4532 // match: (CMN x (SRLconst [c] y)) 4533 // cond: 4534 // result: (CMNshiftRL x y [c]) 4535 for { 4536 _ = v.Args[1] 4537 x := v.Args[0] 4538 v_1 := v.Args[1] 4539 if v_1.Op != OpARMSRLconst { 4540 break 4541 } 4542 c := v_1.AuxInt 4543 y := v_1.Args[0] 4544 v.reset(OpARMCMNshiftRL) 4545 v.AuxInt = c 4546 v.AddArg(x) 4547 v.AddArg(y) 4548 return true 4549 } 4550 // match: (CMN (SRLconst [c] y) x) 4551 // cond: 4552 // result: (CMNshiftRL x y [c]) 4553 for { 4554 _ = v.Args[1] 4555 v_0 := v.Args[0] 4556 if v_0.Op != OpARMSRLconst { 4557 break 4558 } 4559 c := v_0.AuxInt 4560 y := v_0.Args[0] 4561 x := v.Args[1] 4562 v.reset(OpARMCMNshiftRL) 4563 v.AuxInt = c 4564 v.AddArg(x) 4565 v.AddArg(y) 4566 return true 4567 } 4568 // match: (CMN x (SRAconst [c] y)) 4569 // cond: 4570 // result: (CMNshiftRA x y [c]) 4571 for { 4572 _ = v.Args[1] 4573 x := v.Args[0] 4574 v_1 := v.Args[1] 4575 if v_1.Op != OpARMSRAconst { 4576 break 4577 } 4578 c := v_1.AuxInt 4579 y := v_1.Args[0] 4580 v.reset(OpARMCMNshiftRA) 4581 v.AuxInt = c 4582 v.AddArg(x) 4583 v.AddArg(y) 4584 return true 4585 } 4586 // match: (CMN (SRAconst [c] y) x) 4587 // cond: 4588 // result: (CMNshiftRA x y [c]) 4589 for { 4590 _ = v.Args[1] 4591 v_0 := v.Args[0] 4592 if v_0.Op != OpARMSRAconst { 4593 break 4594 } 4595 c := v_0.AuxInt 4596 y := v_0.Args[0] 4597 x := v.Args[1] 4598 v.reset(OpARMCMNshiftRA) 4599 v.AuxInt = c 4600 v.AddArg(x) 4601 v.AddArg(y) 4602 return true 4603 } 4604 // match: (CMN x (SLL y z)) 4605 // cond: 4606 // result: (CMNshiftLLreg x y z) 4607 for { 4608 _ = v.Args[1] 4609 x := v.Args[0] 4610 v_1 := v.Args[1] 4611 if v_1.Op != OpARMSLL { 4612 break 4613 } 4614 _ = v_1.Args[1] 4615 y := v_1.Args[0] 4616 z := v_1.Args[1] 4617 v.reset(OpARMCMNshiftLLreg) 4618 v.AddArg(x) 4619 v.AddArg(y) 4620 v.AddArg(z) 4621 return true 4622 } 4623 // match: (CMN (SLL y z) x) 4624 // cond: 4625 // result: (CMNshiftLLreg x y z) 4626 for { 4627 _ = v.Args[1] 4628 v_0 := v.Args[0] 4629 if v_0.Op != OpARMSLL { 4630 break 4631 } 4632 _ = v_0.Args[1] 4633 y := v_0.Args[0] 4634 z := v_0.Args[1] 4635 x := v.Args[1] 4636 v.reset(OpARMCMNshiftLLreg) 4637 v.AddArg(x) 4638 v.AddArg(y) 4639 v.AddArg(z) 4640 return true 4641 } 4642 return false 4643 } 4644 func rewriteValueARM_OpARMCMN_10(v *Value) bool { 4645 // match: (CMN x (SRL y z)) 4646 // cond: 4647 // result: (CMNshiftRLreg x y z) 4648 for { 4649 _ = v.Args[1] 4650 x := v.Args[0] 4651 v_1 := v.Args[1] 4652 if v_1.Op != OpARMSRL { 4653 break 4654 } 4655 _ = v_1.Args[1] 4656 y := v_1.Args[0] 4657 z := v_1.Args[1] 4658 v.reset(OpARMCMNshiftRLreg) 4659 v.AddArg(x) 4660 v.AddArg(y) 4661 v.AddArg(z) 4662 return true 4663 } 4664 // match: (CMN (SRL y z) x) 4665 // cond: 4666 // result: (CMNshiftRLreg x y z) 4667 for { 4668 _ = v.Args[1] 4669 v_0 := v.Args[0] 4670 if v_0.Op != OpARMSRL { 4671 break 4672 } 4673 _ = v_0.Args[1] 4674 y := v_0.Args[0] 4675 z := v_0.Args[1] 4676 x := v.Args[1] 4677 v.reset(OpARMCMNshiftRLreg) 4678 v.AddArg(x) 4679 v.AddArg(y) 4680 v.AddArg(z) 4681 return true 4682 } 4683 // match: (CMN x (SRA y z)) 4684 // cond: 4685 // result: (CMNshiftRAreg x y z) 4686 for { 4687 _ = v.Args[1] 4688 x := v.Args[0] 4689 v_1 := v.Args[1] 4690 if v_1.Op != OpARMSRA { 4691 break 4692 } 4693 _ = v_1.Args[1] 4694 y := v_1.Args[0] 4695 z := v_1.Args[1] 4696 v.reset(OpARMCMNshiftRAreg) 4697 v.AddArg(x) 4698 v.AddArg(y) 4699 v.AddArg(z) 4700 return true 4701 } 4702 // match: (CMN (SRA y z) x) 4703 // cond: 4704 // result: (CMNshiftRAreg x y z) 4705 for { 4706 _ = v.Args[1] 4707 v_0 := v.Args[0] 4708 if v_0.Op != OpARMSRA { 4709 break 4710 } 4711 _ = v_0.Args[1] 4712 y := v_0.Args[0] 4713 z := v_0.Args[1] 4714 x := v.Args[1] 4715 v.reset(OpARMCMNshiftRAreg) 4716 v.AddArg(x) 4717 v.AddArg(y) 4718 v.AddArg(z) 4719 return true 4720 } 4721 // match: (CMN x (RSBconst [0] y)) 4722 // cond: 4723 // result: (CMP x y) 4724 for { 4725 _ = v.Args[1] 4726 x := v.Args[0] 4727 v_1 := v.Args[1] 4728 if v_1.Op != OpARMRSBconst { 4729 break 4730 } 4731 if v_1.AuxInt != 0 { 4732 break 4733 } 4734 y := v_1.Args[0] 4735 v.reset(OpARMCMP) 4736 v.AddArg(x) 4737 v.AddArg(y) 4738 return true 4739 } 4740 // match: (CMN (RSBconst [0] y) x) 4741 // cond: 4742 // result: (CMP x y) 4743 for { 4744 _ = v.Args[1] 4745 v_0 := v.Args[0] 4746 if v_0.Op != OpARMRSBconst { 4747 break 4748 } 4749 if v_0.AuxInt != 0 { 4750 break 4751 } 4752 y := v_0.Args[0] 4753 x := v.Args[1] 4754 v.reset(OpARMCMP) 4755 v.AddArg(x) 4756 v.AddArg(y) 4757 return true 4758 } 4759 return false 4760 } 4761 func rewriteValueARM_OpARMCMNconst_0(v *Value) bool { 4762 // match: (CMNconst (MOVWconst [x]) [y]) 4763 // cond: int32(x)==int32(-y) 4764 // result: (FlagEQ) 4765 for { 4766 y := v.AuxInt 4767 v_0 := v.Args[0] 4768 if v_0.Op != OpARMMOVWconst { 4769 break 4770 } 4771 x := v_0.AuxInt 4772 if !(int32(x) == int32(-y)) { 4773 break 4774 } 4775 v.reset(OpARMFlagEQ) 4776 return true 4777 } 4778 // match: (CMNconst (MOVWconst [x]) [y]) 4779 // cond: int32(x)<int32(-y) && uint32(x)<uint32(-y) 4780 // result: (FlagLT_ULT) 4781 for { 4782 y := v.AuxInt 4783 v_0 := v.Args[0] 4784 if v_0.Op != OpARMMOVWconst { 4785 break 4786 } 4787 x := v_0.AuxInt 4788 if !(int32(x) < int32(-y) && uint32(x) < uint32(-y)) { 4789 break 4790 } 4791 v.reset(OpARMFlagLT_ULT) 4792 return true 4793 } 4794 // match: (CMNconst (MOVWconst [x]) [y]) 4795 // cond: int32(x)<int32(-y) && uint32(x)>uint32(-y) 4796 // result: (FlagLT_UGT) 4797 for { 4798 y := v.AuxInt 4799 v_0 := v.Args[0] 4800 if v_0.Op != OpARMMOVWconst { 4801 break 4802 } 4803 x := v_0.AuxInt 4804 if !(int32(x) < int32(-y) && uint32(x) > uint32(-y)) { 4805 break 4806 } 4807 v.reset(OpARMFlagLT_UGT) 4808 return true 4809 } 4810 // match: (CMNconst (MOVWconst [x]) [y]) 4811 // cond: int32(x)>int32(-y) && uint32(x)<uint32(-y) 4812 // result: (FlagGT_ULT) 4813 for { 4814 y := v.AuxInt 4815 v_0 := v.Args[0] 4816 if v_0.Op != OpARMMOVWconst { 4817 break 4818 } 4819 x := v_0.AuxInt 4820 if !(int32(x) > int32(-y) && uint32(x) < uint32(-y)) { 4821 break 4822 } 4823 v.reset(OpARMFlagGT_ULT) 4824 return true 4825 } 4826 // match: (CMNconst (MOVWconst [x]) [y]) 4827 // cond: int32(x)>int32(-y) && uint32(x)>uint32(-y) 4828 // result: (FlagGT_UGT) 4829 for { 4830 y := v.AuxInt 4831 v_0 := v.Args[0] 4832 if v_0.Op != OpARMMOVWconst { 4833 break 4834 } 4835 x := v_0.AuxInt 4836 if !(int32(x) > int32(-y) && uint32(x) > uint32(-y)) { 4837 break 4838 } 4839 v.reset(OpARMFlagGT_UGT) 4840 return true 4841 } 4842 return false 4843 } 4844 func rewriteValueARM_OpARMCMNshiftLL_0(v *Value) bool { 4845 b := v.Block 4846 _ = b 4847 // match: (CMNshiftLL (MOVWconst [c]) x [d]) 4848 // cond: 4849 // result: (CMNconst [c] (SLLconst <x.Type> x [d])) 4850 for { 4851 d := v.AuxInt 4852 _ = v.Args[1] 4853 v_0 := v.Args[0] 4854 if v_0.Op != OpARMMOVWconst { 4855 break 4856 } 4857 c := v_0.AuxInt 4858 x := v.Args[1] 4859 v.reset(OpARMCMNconst) 4860 v.AuxInt = c 4861 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 4862 v0.AuxInt = d 4863 v0.AddArg(x) 4864 v.AddArg(v0) 4865 return true 4866 } 4867 // match: (CMNshiftLL x (MOVWconst [c]) [d]) 4868 // cond: 4869 // result: (CMNconst x [int64(int32(uint32(c)<<uint64(d)))]) 4870 for { 4871 d := v.AuxInt 4872 _ = v.Args[1] 4873 x := v.Args[0] 4874 v_1 := v.Args[1] 4875 if v_1.Op != OpARMMOVWconst { 4876 break 4877 } 4878 c := v_1.AuxInt 4879 v.reset(OpARMCMNconst) 4880 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 4881 v.AddArg(x) 4882 return true 4883 } 4884 return false 4885 } 4886 func rewriteValueARM_OpARMCMNshiftLLreg_0(v *Value) bool { 4887 b := v.Block 4888 _ = b 4889 // match: (CMNshiftLLreg (MOVWconst [c]) x y) 4890 // cond: 4891 // result: (CMNconst [c] (SLL <x.Type> x y)) 4892 for { 4893 _ = v.Args[2] 4894 v_0 := v.Args[0] 4895 if v_0.Op != OpARMMOVWconst { 4896 break 4897 } 4898 c := v_0.AuxInt 4899 x := v.Args[1] 4900 y := v.Args[2] 4901 v.reset(OpARMCMNconst) 4902 v.AuxInt = c 4903 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 4904 v0.AddArg(x) 4905 v0.AddArg(y) 4906 v.AddArg(v0) 4907 return true 4908 } 4909 // match: (CMNshiftLLreg x y (MOVWconst [c])) 4910 // cond: 4911 // result: (CMNshiftLL x y [c]) 4912 for { 4913 _ = v.Args[2] 4914 x := v.Args[0] 4915 y := v.Args[1] 4916 v_2 := v.Args[2] 4917 if v_2.Op != OpARMMOVWconst { 4918 break 4919 } 4920 c := v_2.AuxInt 4921 v.reset(OpARMCMNshiftLL) 4922 v.AuxInt = c 4923 v.AddArg(x) 4924 v.AddArg(y) 4925 return true 4926 } 4927 return false 4928 } 4929 func rewriteValueARM_OpARMCMNshiftRA_0(v *Value) bool { 4930 b := v.Block 4931 _ = b 4932 // match: (CMNshiftRA (MOVWconst [c]) x [d]) 4933 // cond: 4934 // result: (CMNconst [c] (SRAconst <x.Type> x [d])) 4935 for { 4936 d := v.AuxInt 4937 _ = v.Args[1] 4938 v_0 := v.Args[0] 4939 if v_0.Op != OpARMMOVWconst { 4940 break 4941 } 4942 c := v_0.AuxInt 4943 x := v.Args[1] 4944 v.reset(OpARMCMNconst) 4945 v.AuxInt = c 4946 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 4947 v0.AuxInt = d 4948 v0.AddArg(x) 4949 v.AddArg(v0) 4950 return true 4951 } 4952 // match: (CMNshiftRA x (MOVWconst [c]) [d]) 4953 // cond: 4954 // result: (CMNconst x [int64(int32(c)>>uint64(d))]) 4955 for { 4956 d := v.AuxInt 4957 _ = v.Args[1] 4958 x := v.Args[0] 4959 v_1 := v.Args[1] 4960 if v_1.Op != OpARMMOVWconst { 4961 break 4962 } 4963 c := v_1.AuxInt 4964 v.reset(OpARMCMNconst) 4965 v.AuxInt = int64(int32(c) >> uint64(d)) 4966 v.AddArg(x) 4967 return true 4968 } 4969 return false 4970 } 4971 func rewriteValueARM_OpARMCMNshiftRAreg_0(v *Value) bool { 4972 b := v.Block 4973 _ = b 4974 // match: (CMNshiftRAreg (MOVWconst [c]) x y) 4975 // cond: 4976 // result: (CMNconst [c] (SRA <x.Type> x y)) 4977 for { 4978 _ = v.Args[2] 4979 v_0 := v.Args[0] 4980 if v_0.Op != OpARMMOVWconst { 4981 break 4982 } 4983 c := v_0.AuxInt 4984 x := v.Args[1] 4985 y := v.Args[2] 4986 v.reset(OpARMCMNconst) 4987 v.AuxInt = c 4988 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 4989 v0.AddArg(x) 4990 v0.AddArg(y) 4991 v.AddArg(v0) 4992 return true 4993 } 4994 // match: (CMNshiftRAreg x y (MOVWconst [c])) 4995 // cond: 4996 // result: (CMNshiftRA x y [c]) 4997 for { 4998 _ = v.Args[2] 4999 x := v.Args[0] 5000 y := v.Args[1] 5001 v_2 := v.Args[2] 5002 if v_2.Op != OpARMMOVWconst { 5003 break 5004 } 5005 c := v_2.AuxInt 5006 v.reset(OpARMCMNshiftRA) 5007 v.AuxInt = c 5008 v.AddArg(x) 5009 v.AddArg(y) 5010 return true 5011 } 5012 return false 5013 } 5014 func rewriteValueARM_OpARMCMNshiftRL_0(v *Value) bool { 5015 b := v.Block 5016 _ = b 5017 // match: (CMNshiftRL (MOVWconst [c]) x [d]) 5018 // cond: 5019 // result: (CMNconst [c] (SRLconst <x.Type> x [d])) 5020 for { 5021 d := v.AuxInt 5022 _ = v.Args[1] 5023 v_0 := v.Args[0] 5024 if v_0.Op != OpARMMOVWconst { 5025 break 5026 } 5027 c := v_0.AuxInt 5028 x := v.Args[1] 5029 v.reset(OpARMCMNconst) 5030 v.AuxInt = c 5031 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 5032 v0.AuxInt = d 5033 v0.AddArg(x) 5034 v.AddArg(v0) 5035 return true 5036 } 5037 // match: (CMNshiftRL x (MOVWconst [c]) [d]) 5038 // cond: 5039 // result: (CMNconst x [int64(int32(uint32(c)>>uint64(d)))]) 5040 for { 5041 d := v.AuxInt 5042 _ = v.Args[1] 5043 x := v.Args[0] 5044 v_1 := v.Args[1] 5045 if v_1.Op != OpARMMOVWconst { 5046 break 5047 } 5048 c := v_1.AuxInt 5049 v.reset(OpARMCMNconst) 5050 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 5051 v.AddArg(x) 5052 return true 5053 } 5054 return false 5055 } 5056 func rewriteValueARM_OpARMCMNshiftRLreg_0(v *Value) bool { 5057 b := v.Block 5058 _ = b 5059 // match: (CMNshiftRLreg (MOVWconst [c]) x y) 5060 // cond: 5061 // result: (CMNconst [c] (SRL <x.Type> x y)) 5062 for { 5063 _ = v.Args[2] 5064 v_0 := v.Args[0] 5065 if v_0.Op != OpARMMOVWconst { 5066 break 5067 } 5068 c := v_0.AuxInt 5069 x := v.Args[1] 5070 y := v.Args[2] 5071 v.reset(OpARMCMNconst) 5072 v.AuxInt = c 5073 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 5074 v0.AddArg(x) 5075 v0.AddArg(y) 5076 v.AddArg(v0) 5077 return true 5078 } 5079 // match: (CMNshiftRLreg x y (MOVWconst [c])) 5080 // cond: 5081 // result: (CMNshiftRL x y [c]) 5082 for { 5083 _ = v.Args[2] 5084 x := v.Args[0] 5085 y := v.Args[1] 5086 v_2 := v.Args[2] 5087 if v_2.Op != OpARMMOVWconst { 5088 break 5089 } 5090 c := v_2.AuxInt 5091 v.reset(OpARMCMNshiftRL) 5092 v.AuxInt = c 5093 v.AddArg(x) 5094 v.AddArg(y) 5095 return true 5096 } 5097 return false 5098 } 5099 func rewriteValueARM_OpARMCMOVWHSconst_0(v *Value) bool { 5100 // match: (CMOVWHSconst _ (FlagEQ) [c]) 5101 // cond: 5102 // result: (MOVWconst [c]) 5103 for { 5104 c := v.AuxInt 5105 _ = v.Args[1] 5106 v_1 := v.Args[1] 5107 if v_1.Op != OpARMFlagEQ { 5108 break 5109 } 5110 v.reset(OpARMMOVWconst) 5111 v.AuxInt = c 5112 return true 5113 } 5114 // match: (CMOVWHSconst x (FlagLT_ULT)) 5115 // cond: 5116 // result: x 5117 for { 5118 _ = v.Args[1] 5119 x := v.Args[0] 5120 v_1 := v.Args[1] 5121 if v_1.Op != OpARMFlagLT_ULT { 5122 break 5123 } 5124 v.reset(OpCopy) 5125 v.Type = x.Type 5126 v.AddArg(x) 5127 return true 5128 } 5129 // match: (CMOVWHSconst _ (FlagLT_UGT) [c]) 5130 // cond: 5131 // result: (MOVWconst [c]) 5132 for { 5133 c := v.AuxInt 5134 _ = v.Args[1] 5135 v_1 := v.Args[1] 5136 if v_1.Op != OpARMFlagLT_UGT { 5137 break 5138 } 5139 v.reset(OpARMMOVWconst) 5140 v.AuxInt = c 5141 return true 5142 } 5143 // match: (CMOVWHSconst x (FlagGT_ULT)) 5144 // cond: 5145 // result: x 5146 for { 5147 _ = v.Args[1] 5148 x := v.Args[0] 5149 v_1 := v.Args[1] 5150 if v_1.Op != OpARMFlagGT_ULT { 5151 break 5152 } 5153 v.reset(OpCopy) 5154 v.Type = x.Type 5155 v.AddArg(x) 5156 return true 5157 } 5158 // match: (CMOVWHSconst _ (FlagGT_UGT) [c]) 5159 // cond: 5160 // result: (MOVWconst [c]) 5161 for { 5162 c := v.AuxInt 5163 _ = v.Args[1] 5164 v_1 := v.Args[1] 5165 if v_1.Op != OpARMFlagGT_UGT { 5166 break 5167 } 5168 v.reset(OpARMMOVWconst) 5169 v.AuxInt = c 5170 return true 5171 } 5172 // match: (CMOVWHSconst x (InvertFlags flags) [c]) 5173 // cond: 5174 // result: (CMOVWLSconst x flags [c]) 5175 for { 5176 c := v.AuxInt 5177 _ = v.Args[1] 5178 x := v.Args[0] 5179 v_1 := v.Args[1] 5180 if v_1.Op != OpARMInvertFlags { 5181 break 5182 } 5183 flags := v_1.Args[0] 5184 v.reset(OpARMCMOVWLSconst) 5185 v.AuxInt = c 5186 v.AddArg(x) 5187 v.AddArg(flags) 5188 return true 5189 } 5190 return false 5191 } 5192 func rewriteValueARM_OpARMCMOVWLSconst_0(v *Value) bool { 5193 // match: (CMOVWLSconst _ (FlagEQ) [c]) 5194 // cond: 5195 // result: (MOVWconst [c]) 5196 for { 5197 c := v.AuxInt 5198 _ = v.Args[1] 5199 v_1 := v.Args[1] 5200 if v_1.Op != OpARMFlagEQ { 5201 break 5202 } 5203 v.reset(OpARMMOVWconst) 5204 v.AuxInt = c 5205 return true 5206 } 5207 // match: (CMOVWLSconst _ (FlagLT_ULT) [c]) 5208 // cond: 5209 // result: (MOVWconst [c]) 5210 for { 5211 c := v.AuxInt 5212 _ = v.Args[1] 5213 v_1 := v.Args[1] 5214 if v_1.Op != OpARMFlagLT_ULT { 5215 break 5216 } 5217 v.reset(OpARMMOVWconst) 5218 v.AuxInt = c 5219 return true 5220 } 5221 // match: (CMOVWLSconst x (FlagLT_UGT)) 5222 // cond: 5223 // result: x 5224 for { 5225 _ = v.Args[1] 5226 x := v.Args[0] 5227 v_1 := v.Args[1] 5228 if v_1.Op != OpARMFlagLT_UGT { 5229 break 5230 } 5231 v.reset(OpCopy) 5232 v.Type = x.Type 5233 v.AddArg(x) 5234 return true 5235 } 5236 // match: (CMOVWLSconst _ (FlagGT_ULT) [c]) 5237 // cond: 5238 // result: (MOVWconst [c]) 5239 for { 5240 c := v.AuxInt 5241 _ = v.Args[1] 5242 v_1 := v.Args[1] 5243 if v_1.Op != OpARMFlagGT_ULT { 5244 break 5245 } 5246 v.reset(OpARMMOVWconst) 5247 v.AuxInt = c 5248 return true 5249 } 5250 // match: (CMOVWLSconst x (FlagGT_UGT)) 5251 // cond: 5252 // result: x 5253 for { 5254 _ = v.Args[1] 5255 x := v.Args[0] 5256 v_1 := v.Args[1] 5257 if v_1.Op != OpARMFlagGT_UGT { 5258 break 5259 } 5260 v.reset(OpCopy) 5261 v.Type = x.Type 5262 v.AddArg(x) 5263 return true 5264 } 5265 // match: (CMOVWLSconst x (InvertFlags flags) [c]) 5266 // cond: 5267 // result: (CMOVWHSconst x flags [c]) 5268 for { 5269 c := v.AuxInt 5270 _ = v.Args[1] 5271 x := v.Args[0] 5272 v_1 := v.Args[1] 5273 if v_1.Op != OpARMInvertFlags { 5274 break 5275 } 5276 flags := v_1.Args[0] 5277 v.reset(OpARMCMOVWHSconst) 5278 v.AuxInt = c 5279 v.AddArg(x) 5280 v.AddArg(flags) 5281 return true 5282 } 5283 return false 5284 } 5285 func rewriteValueARM_OpARMCMP_0(v *Value) bool { 5286 b := v.Block 5287 _ = b 5288 // match: (CMP x (MOVWconst [c])) 5289 // cond: 5290 // result: (CMPconst [c] x) 5291 for { 5292 _ = v.Args[1] 5293 x := v.Args[0] 5294 v_1 := v.Args[1] 5295 if v_1.Op != OpARMMOVWconst { 5296 break 5297 } 5298 c := v_1.AuxInt 5299 v.reset(OpARMCMPconst) 5300 v.AuxInt = c 5301 v.AddArg(x) 5302 return true 5303 } 5304 // match: (CMP (MOVWconst [c]) x) 5305 // cond: 5306 // result: (InvertFlags (CMPconst [c] x)) 5307 for { 5308 _ = v.Args[1] 5309 v_0 := v.Args[0] 5310 if v_0.Op != OpARMMOVWconst { 5311 break 5312 } 5313 c := v_0.AuxInt 5314 x := v.Args[1] 5315 v.reset(OpARMInvertFlags) 5316 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5317 v0.AuxInt = c 5318 v0.AddArg(x) 5319 v.AddArg(v0) 5320 return true 5321 } 5322 // match: (CMP x (SLLconst [c] y)) 5323 // cond: 5324 // result: (CMPshiftLL x y [c]) 5325 for { 5326 _ = v.Args[1] 5327 x := v.Args[0] 5328 v_1 := v.Args[1] 5329 if v_1.Op != OpARMSLLconst { 5330 break 5331 } 5332 c := v_1.AuxInt 5333 y := v_1.Args[0] 5334 v.reset(OpARMCMPshiftLL) 5335 v.AuxInt = c 5336 v.AddArg(x) 5337 v.AddArg(y) 5338 return true 5339 } 5340 // match: (CMP (SLLconst [c] y) x) 5341 // cond: 5342 // result: (InvertFlags (CMPshiftLL x y [c])) 5343 for { 5344 _ = v.Args[1] 5345 v_0 := v.Args[0] 5346 if v_0.Op != OpARMSLLconst { 5347 break 5348 } 5349 c := v_0.AuxInt 5350 y := v_0.Args[0] 5351 x := v.Args[1] 5352 v.reset(OpARMInvertFlags) 5353 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 5354 v0.AuxInt = c 5355 v0.AddArg(x) 5356 v0.AddArg(y) 5357 v.AddArg(v0) 5358 return true 5359 } 5360 // match: (CMP x (SRLconst [c] y)) 5361 // cond: 5362 // result: (CMPshiftRL x y [c]) 5363 for { 5364 _ = v.Args[1] 5365 x := v.Args[0] 5366 v_1 := v.Args[1] 5367 if v_1.Op != OpARMSRLconst { 5368 break 5369 } 5370 c := v_1.AuxInt 5371 y := v_1.Args[0] 5372 v.reset(OpARMCMPshiftRL) 5373 v.AuxInt = c 5374 v.AddArg(x) 5375 v.AddArg(y) 5376 return true 5377 } 5378 // match: (CMP (SRLconst [c] y) x) 5379 // cond: 5380 // result: (InvertFlags (CMPshiftRL x y [c])) 5381 for { 5382 _ = v.Args[1] 5383 v_0 := v.Args[0] 5384 if v_0.Op != OpARMSRLconst { 5385 break 5386 } 5387 c := v_0.AuxInt 5388 y := v_0.Args[0] 5389 x := v.Args[1] 5390 v.reset(OpARMInvertFlags) 5391 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 5392 v0.AuxInt = c 5393 v0.AddArg(x) 5394 v0.AddArg(y) 5395 v.AddArg(v0) 5396 return true 5397 } 5398 // match: (CMP x (SRAconst [c] y)) 5399 // cond: 5400 // result: (CMPshiftRA x y [c]) 5401 for { 5402 _ = v.Args[1] 5403 x := v.Args[0] 5404 v_1 := v.Args[1] 5405 if v_1.Op != OpARMSRAconst { 5406 break 5407 } 5408 c := v_1.AuxInt 5409 y := v_1.Args[0] 5410 v.reset(OpARMCMPshiftRA) 5411 v.AuxInt = c 5412 v.AddArg(x) 5413 v.AddArg(y) 5414 return true 5415 } 5416 // match: (CMP (SRAconst [c] y) x) 5417 // cond: 5418 // result: (InvertFlags (CMPshiftRA x y [c])) 5419 for { 5420 _ = v.Args[1] 5421 v_0 := v.Args[0] 5422 if v_0.Op != OpARMSRAconst { 5423 break 5424 } 5425 c := v_0.AuxInt 5426 y := v_0.Args[0] 5427 x := v.Args[1] 5428 v.reset(OpARMInvertFlags) 5429 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 5430 v0.AuxInt = c 5431 v0.AddArg(x) 5432 v0.AddArg(y) 5433 v.AddArg(v0) 5434 return true 5435 } 5436 // match: (CMP x (SLL y z)) 5437 // cond: 5438 // result: (CMPshiftLLreg x y z) 5439 for { 5440 _ = v.Args[1] 5441 x := v.Args[0] 5442 v_1 := v.Args[1] 5443 if v_1.Op != OpARMSLL { 5444 break 5445 } 5446 _ = v_1.Args[1] 5447 y := v_1.Args[0] 5448 z := v_1.Args[1] 5449 v.reset(OpARMCMPshiftLLreg) 5450 v.AddArg(x) 5451 v.AddArg(y) 5452 v.AddArg(z) 5453 return true 5454 } 5455 // match: (CMP (SLL y z) x) 5456 // cond: 5457 // result: (InvertFlags (CMPshiftLLreg x y z)) 5458 for { 5459 _ = v.Args[1] 5460 v_0 := v.Args[0] 5461 if v_0.Op != OpARMSLL { 5462 break 5463 } 5464 _ = v_0.Args[1] 5465 y := v_0.Args[0] 5466 z := v_0.Args[1] 5467 x := v.Args[1] 5468 v.reset(OpARMInvertFlags) 5469 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 5470 v0.AddArg(x) 5471 v0.AddArg(y) 5472 v0.AddArg(z) 5473 v.AddArg(v0) 5474 return true 5475 } 5476 return false 5477 } 5478 func rewriteValueARM_OpARMCMP_10(v *Value) bool { 5479 b := v.Block 5480 _ = b 5481 // match: (CMP x (SRL y z)) 5482 // cond: 5483 // result: (CMPshiftRLreg x y z) 5484 for { 5485 _ = v.Args[1] 5486 x := v.Args[0] 5487 v_1 := v.Args[1] 5488 if v_1.Op != OpARMSRL { 5489 break 5490 } 5491 _ = v_1.Args[1] 5492 y := v_1.Args[0] 5493 z := v_1.Args[1] 5494 v.reset(OpARMCMPshiftRLreg) 5495 v.AddArg(x) 5496 v.AddArg(y) 5497 v.AddArg(z) 5498 return true 5499 } 5500 // match: (CMP (SRL y z) x) 5501 // cond: 5502 // result: (InvertFlags (CMPshiftRLreg x y z)) 5503 for { 5504 _ = v.Args[1] 5505 v_0 := v.Args[0] 5506 if v_0.Op != OpARMSRL { 5507 break 5508 } 5509 _ = v_0.Args[1] 5510 y := v_0.Args[0] 5511 z := v_0.Args[1] 5512 x := v.Args[1] 5513 v.reset(OpARMInvertFlags) 5514 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 5515 v0.AddArg(x) 5516 v0.AddArg(y) 5517 v0.AddArg(z) 5518 v.AddArg(v0) 5519 return true 5520 } 5521 // match: (CMP x (SRA y z)) 5522 // cond: 5523 // result: (CMPshiftRAreg x y z) 5524 for { 5525 _ = v.Args[1] 5526 x := v.Args[0] 5527 v_1 := v.Args[1] 5528 if v_1.Op != OpARMSRA { 5529 break 5530 } 5531 _ = v_1.Args[1] 5532 y := v_1.Args[0] 5533 z := v_1.Args[1] 5534 v.reset(OpARMCMPshiftRAreg) 5535 v.AddArg(x) 5536 v.AddArg(y) 5537 v.AddArg(z) 5538 return true 5539 } 5540 // match: (CMP (SRA y z) x) 5541 // cond: 5542 // result: (InvertFlags (CMPshiftRAreg x y z)) 5543 for { 5544 _ = v.Args[1] 5545 v_0 := v.Args[0] 5546 if v_0.Op != OpARMSRA { 5547 break 5548 } 5549 _ = v_0.Args[1] 5550 y := v_0.Args[0] 5551 z := v_0.Args[1] 5552 x := v.Args[1] 5553 v.reset(OpARMInvertFlags) 5554 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 5555 v0.AddArg(x) 5556 v0.AddArg(y) 5557 v0.AddArg(z) 5558 v.AddArg(v0) 5559 return true 5560 } 5561 // match: (CMP x (RSBconst [0] y)) 5562 // cond: 5563 // result: (CMN x y) 5564 for { 5565 _ = v.Args[1] 5566 x := v.Args[0] 5567 v_1 := v.Args[1] 5568 if v_1.Op != OpARMRSBconst { 5569 break 5570 } 5571 if v_1.AuxInt != 0 { 5572 break 5573 } 5574 y := v_1.Args[0] 5575 v.reset(OpARMCMN) 5576 v.AddArg(x) 5577 v.AddArg(y) 5578 return true 5579 } 5580 return false 5581 } 5582 func rewriteValueARM_OpARMCMPD_0(v *Value) bool { 5583 // match: (CMPD x (MOVDconst [0])) 5584 // cond: 5585 // result: (CMPD0 x) 5586 for { 5587 _ = v.Args[1] 5588 x := v.Args[0] 5589 v_1 := v.Args[1] 5590 if v_1.Op != OpARMMOVDconst { 5591 break 5592 } 5593 if v_1.AuxInt != 0 { 5594 break 5595 } 5596 v.reset(OpARMCMPD0) 5597 v.AddArg(x) 5598 return true 5599 } 5600 return false 5601 } 5602 func rewriteValueARM_OpARMCMPF_0(v *Value) bool { 5603 // match: (CMPF x (MOVFconst [0])) 5604 // cond: 5605 // result: (CMPF0 x) 5606 for { 5607 _ = v.Args[1] 5608 x := v.Args[0] 5609 v_1 := v.Args[1] 5610 if v_1.Op != OpARMMOVFconst { 5611 break 5612 } 5613 if v_1.AuxInt != 0 { 5614 break 5615 } 5616 v.reset(OpARMCMPF0) 5617 v.AddArg(x) 5618 return true 5619 } 5620 return false 5621 } 5622 func rewriteValueARM_OpARMCMPconst_0(v *Value) bool { 5623 // match: (CMPconst (MOVWconst [x]) [y]) 5624 // cond: int32(x)==int32(y) 5625 // result: (FlagEQ) 5626 for { 5627 y := v.AuxInt 5628 v_0 := v.Args[0] 5629 if v_0.Op != OpARMMOVWconst { 5630 break 5631 } 5632 x := v_0.AuxInt 5633 if !(int32(x) == int32(y)) { 5634 break 5635 } 5636 v.reset(OpARMFlagEQ) 5637 return true 5638 } 5639 // match: (CMPconst (MOVWconst [x]) [y]) 5640 // cond: int32(x)<int32(y) && uint32(x)<uint32(y) 5641 // result: (FlagLT_ULT) 5642 for { 5643 y := v.AuxInt 5644 v_0 := v.Args[0] 5645 if v_0.Op != OpARMMOVWconst { 5646 break 5647 } 5648 x := v_0.AuxInt 5649 if !(int32(x) < int32(y) && uint32(x) < uint32(y)) { 5650 break 5651 } 5652 v.reset(OpARMFlagLT_ULT) 5653 return true 5654 } 5655 // match: (CMPconst (MOVWconst [x]) [y]) 5656 // cond: int32(x)<int32(y) && uint32(x)>uint32(y) 5657 // result: (FlagLT_UGT) 5658 for { 5659 y := v.AuxInt 5660 v_0 := v.Args[0] 5661 if v_0.Op != OpARMMOVWconst { 5662 break 5663 } 5664 x := v_0.AuxInt 5665 if !(int32(x) < int32(y) && uint32(x) > uint32(y)) { 5666 break 5667 } 5668 v.reset(OpARMFlagLT_UGT) 5669 return true 5670 } 5671 // match: (CMPconst (MOVWconst [x]) [y]) 5672 // cond: int32(x)>int32(y) && uint32(x)<uint32(y) 5673 // result: (FlagGT_ULT) 5674 for { 5675 y := v.AuxInt 5676 v_0 := v.Args[0] 5677 if v_0.Op != OpARMMOVWconst { 5678 break 5679 } 5680 x := v_0.AuxInt 5681 if !(int32(x) > int32(y) && uint32(x) < uint32(y)) { 5682 break 5683 } 5684 v.reset(OpARMFlagGT_ULT) 5685 return true 5686 } 5687 // match: (CMPconst (MOVWconst [x]) [y]) 5688 // cond: int32(x)>int32(y) && uint32(x)>uint32(y) 5689 // result: (FlagGT_UGT) 5690 for { 5691 y := v.AuxInt 5692 v_0 := v.Args[0] 5693 if v_0.Op != OpARMMOVWconst { 5694 break 5695 } 5696 x := v_0.AuxInt 5697 if !(int32(x) > int32(y) && uint32(x) > uint32(y)) { 5698 break 5699 } 5700 v.reset(OpARMFlagGT_UGT) 5701 return true 5702 } 5703 // match: (CMPconst (MOVBUreg _) [c]) 5704 // cond: 0xff < c 5705 // result: (FlagLT_ULT) 5706 for { 5707 c := v.AuxInt 5708 v_0 := v.Args[0] 5709 if v_0.Op != OpARMMOVBUreg { 5710 break 5711 } 5712 if !(0xff < c) { 5713 break 5714 } 5715 v.reset(OpARMFlagLT_ULT) 5716 return true 5717 } 5718 // match: (CMPconst (MOVHUreg _) [c]) 5719 // cond: 0xffff < c 5720 // result: (FlagLT_ULT) 5721 for { 5722 c := v.AuxInt 5723 v_0 := v.Args[0] 5724 if v_0.Op != OpARMMOVHUreg { 5725 break 5726 } 5727 if !(0xffff < c) { 5728 break 5729 } 5730 v.reset(OpARMFlagLT_ULT) 5731 return true 5732 } 5733 // match: (CMPconst (ANDconst _ [m]) [n]) 5734 // cond: 0 <= int32(m) && int32(m) < int32(n) 5735 // result: (FlagLT_ULT) 5736 for { 5737 n := v.AuxInt 5738 v_0 := v.Args[0] 5739 if v_0.Op != OpARMANDconst { 5740 break 5741 } 5742 m := v_0.AuxInt 5743 if !(0 <= int32(m) && int32(m) < int32(n)) { 5744 break 5745 } 5746 v.reset(OpARMFlagLT_ULT) 5747 return true 5748 } 5749 // match: (CMPconst (SRLconst _ [c]) [n]) 5750 // cond: 0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n) 5751 // result: (FlagLT_ULT) 5752 for { 5753 n := v.AuxInt 5754 v_0 := v.Args[0] 5755 if v_0.Op != OpARMSRLconst { 5756 break 5757 } 5758 c := v_0.AuxInt 5759 if !(0 <= n && 0 < c && c <= 32 && (1<<uint32(32-c)) <= uint32(n)) { 5760 break 5761 } 5762 v.reset(OpARMFlagLT_ULT) 5763 return true 5764 } 5765 return false 5766 } 5767 func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { 5768 b := v.Block 5769 _ = b 5770 // match: (CMPshiftLL (MOVWconst [c]) x [d]) 5771 // cond: 5772 // result: (InvertFlags (CMPconst [c] (SLLconst <x.Type> x [d]))) 5773 for { 5774 d := v.AuxInt 5775 _ = v.Args[1] 5776 v_0 := v.Args[0] 5777 if v_0.Op != OpARMMOVWconst { 5778 break 5779 } 5780 c := v_0.AuxInt 5781 x := v.Args[1] 5782 v.reset(OpARMInvertFlags) 5783 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5784 v0.AuxInt = c 5785 v1 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 5786 v1.AuxInt = d 5787 v1.AddArg(x) 5788 v0.AddArg(v1) 5789 v.AddArg(v0) 5790 return true 5791 } 5792 // match: (CMPshiftLL x (MOVWconst [c]) [d]) 5793 // cond: 5794 // result: (CMPconst x [int64(int32(uint32(c)<<uint64(d)))]) 5795 for { 5796 d := v.AuxInt 5797 _ = v.Args[1] 5798 x := v.Args[0] 5799 v_1 := v.Args[1] 5800 if v_1.Op != OpARMMOVWconst { 5801 break 5802 } 5803 c := v_1.AuxInt 5804 v.reset(OpARMCMPconst) 5805 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 5806 v.AddArg(x) 5807 return true 5808 } 5809 return false 5810 } 5811 func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { 5812 b := v.Block 5813 _ = b 5814 // match: (CMPshiftLLreg (MOVWconst [c]) x y) 5815 // cond: 5816 // result: (InvertFlags (CMPconst [c] (SLL <x.Type> x y))) 5817 for { 5818 _ = v.Args[2] 5819 v_0 := v.Args[0] 5820 if v_0.Op != OpARMMOVWconst { 5821 break 5822 } 5823 c := v_0.AuxInt 5824 x := v.Args[1] 5825 y := v.Args[2] 5826 v.reset(OpARMInvertFlags) 5827 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5828 v0.AuxInt = c 5829 v1 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 5830 v1.AddArg(x) 5831 v1.AddArg(y) 5832 v0.AddArg(v1) 5833 v.AddArg(v0) 5834 return true 5835 } 5836 // match: (CMPshiftLLreg x y (MOVWconst [c])) 5837 // cond: 5838 // result: (CMPshiftLL x y [c]) 5839 for { 5840 _ = v.Args[2] 5841 x := v.Args[0] 5842 y := v.Args[1] 5843 v_2 := v.Args[2] 5844 if v_2.Op != OpARMMOVWconst { 5845 break 5846 } 5847 c := v_2.AuxInt 5848 v.reset(OpARMCMPshiftLL) 5849 v.AuxInt = c 5850 v.AddArg(x) 5851 v.AddArg(y) 5852 return true 5853 } 5854 return false 5855 } 5856 func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { 5857 b := v.Block 5858 _ = b 5859 // match: (CMPshiftRA (MOVWconst [c]) x [d]) 5860 // cond: 5861 // result: (InvertFlags (CMPconst [c] (SRAconst <x.Type> x [d]))) 5862 for { 5863 d := v.AuxInt 5864 _ = v.Args[1] 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 v.reset(OpARMInvertFlags) 5872 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5873 v0.AuxInt = c 5874 v1 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 5875 v1.AuxInt = d 5876 v1.AddArg(x) 5877 v0.AddArg(v1) 5878 v.AddArg(v0) 5879 return true 5880 } 5881 // match: (CMPshiftRA x (MOVWconst [c]) [d]) 5882 // cond: 5883 // result: (CMPconst x [int64(int32(c)>>uint64(d))]) 5884 for { 5885 d := v.AuxInt 5886 _ = v.Args[1] 5887 x := v.Args[0] 5888 v_1 := v.Args[1] 5889 if v_1.Op != OpARMMOVWconst { 5890 break 5891 } 5892 c := v_1.AuxInt 5893 v.reset(OpARMCMPconst) 5894 v.AuxInt = int64(int32(c) >> uint64(d)) 5895 v.AddArg(x) 5896 return true 5897 } 5898 return false 5899 } 5900 func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { 5901 b := v.Block 5902 _ = b 5903 // match: (CMPshiftRAreg (MOVWconst [c]) x y) 5904 // cond: 5905 // result: (InvertFlags (CMPconst [c] (SRA <x.Type> x y))) 5906 for { 5907 _ = v.Args[2] 5908 v_0 := v.Args[0] 5909 if v_0.Op != OpARMMOVWconst { 5910 break 5911 } 5912 c := v_0.AuxInt 5913 x := v.Args[1] 5914 y := v.Args[2] 5915 v.reset(OpARMInvertFlags) 5916 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5917 v0.AuxInt = c 5918 v1 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 5919 v1.AddArg(x) 5920 v1.AddArg(y) 5921 v0.AddArg(v1) 5922 v.AddArg(v0) 5923 return true 5924 } 5925 // match: (CMPshiftRAreg x y (MOVWconst [c])) 5926 // cond: 5927 // result: (CMPshiftRA x y [c]) 5928 for { 5929 _ = v.Args[2] 5930 x := v.Args[0] 5931 y := v.Args[1] 5932 v_2 := v.Args[2] 5933 if v_2.Op != OpARMMOVWconst { 5934 break 5935 } 5936 c := v_2.AuxInt 5937 v.reset(OpARMCMPshiftRA) 5938 v.AuxInt = c 5939 v.AddArg(x) 5940 v.AddArg(y) 5941 return true 5942 } 5943 return false 5944 } 5945 func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { 5946 b := v.Block 5947 _ = b 5948 // match: (CMPshiftRL (MOVWconst [c]) x [d]) 5949 // cond: 5950 // result: (InvertFlags (CMPconst [c] (SRLconst <x.Type> x [d]))) 5951 for { 5952 d := v.AuxInt 5953 _ = v.Args[1] 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 v.reset(OpARMInvertFlags) 5961 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 5962 v0.AuxInt = c 5963 v1 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 5964 v1.AuxInt = d 5965 v1.AddArg(x) 5966 v0.AddArg(v1) 5967 v.AddArg(v0) 5968 return true 5969 } 5970 // match: (CMPshiftRL x (MOVWconst [c]) [d]) 5971 // cond: 5972 // result: (CMPconst x [int64(int32(uint32(c)>>uint64(d)))]) 5973 for { 5974 d := v.AuxInt 5975 _ = v.Args[1] 5976 x := v.Args[0] 5977 v_1 := v.Args[1] 5978 if v_1.Op != OpARMMOVWconst { 5979 break 5980 } 5981 c := v_1.AuxInt 5982 v.reset(OpARMCMPconst) 5983 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 5984 v.AddArg(x) 5985 return true 5986 } 5987 return false 5988 } 5989 func rewriteValueARM_OpARMCMPshiftRLreg_0(v *Value) bool { 5990 b := v.Block 5991 _ = b 5992 // match: (CMPshiftRLreg (MOVWconst [c]) x y) 5993 // cond: 5994 // result: (InvertFlags (CMPconst [c] (SRL <x.Type> x y))) 5995 for { 5996 _ = v.Args[2] 5997 v_0 := v.Args[0] 5998 if v_0.Op != OpARMMOVWconst { 5999 break 6000 } 6001 c := v_0.AuxInt 6002 x := v.Args[1] 6003 y := v.Args[2] 6004 v.reset(OpARMInvertFlags) 6005 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 6006 v0.AuxInt = c 6007 v1 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 6008 v1.AddArg(x) 6009 v1.AddArg(y) 6010 v0.AddArg(v1) 6011 v.AddArg(v0) 6012 return true 6013 } 6014 // match: (CMPshiftRLreg x y (MOVWconst [c])) 6015 // cond: 6016 // result: (CMPshiftRL x y [c]) 6017 for { 6018 _ = v.Args[2] 6019 x := v.Args[0] 6020 y := v.Args[1] 6021 v_2 := v.Args[2] 6022 if v_2.Op != OpARMMOVWconst { 6023 break 6024 } 6025 c := v_2.AuxInt 6026 v.reset(OpARMCMPshiftRL) 6027 v.AuxInt = c 6028 v.AddArg(x) 6029 v.AddArg(y) 6030 return true 6031 } 6032 return false 6033 } 6034 func rewriteValueARM_OpARMEqual_0(v *Value) bool { 6035 // match: (Equal (FlagEQ)) 6036 // cond: 6037 // result: (MOVWconst [1]) 6038 for { 6039 v_0 := v.Args[0] 6040 if v_0.Op != OpARMFlagEQ { 6041 break 6042 } 6043 v.reset(OpARMMOVWconst) 6044 v.AuxInt = 1 6045 return true 6046 } 6047 // match: (Equal (FlagLT_ULT)) 6048 // cond: 6049 // result: (MOVWconst [0]) 6050 for { 6051 v_0 := v.Args[0] 6052 if v_0.Op != OpARMFlagLT_ULT { 6053 break 6054 } 6055 v.reset(OpARMMOVWconst) 6056 v.AuxInt = 0 6057 return true 6058 } 6059 // match: (Equal (FlagLT_UGT)) 6060 // cond: 6061 // result: (MOVWconst [0]) 6062 for { 6063 v_0 := v.Args[0] 6064 if v_0.Op != OpARMFlagLT_UGT { 6065 break 6066 } 6067 v.reset(OpARMMOVWconst) 6068 v.AuxInt = 0 6069 return true 6070 } 6071 // match: (Equal (FlagGT_ULT)) 6072 // cond: 6073 // result: (MOVWconst [0]) 6074 for { 6075 v_0 := v.Args[0] 6076 if v_0.Op != OpARMFlagGT_ULT { 6077 break 6078 } 6079 v.reset(OpARMMOVWconst) 6080 v.AuxInt = 0 6081 return true 6082 } 6083 // match: (Equal (FlagGT_UGT)) 6084 // cond: 6085 // result: (MOVWconst [0]) 6086 for { 6087 v_0 := v.Args[0] 6088 if v_0.Op != OpARMFlagGT_UGT { 6089 break 6090 } 6091 v.reset(OpARMMOVWconst) 6092 v.AuxInt = 0 6093 return true 6094 } 6095 // match: (Equal (InvertFlags x)) 6096 // cond: 6097 // result: (Equal x) 6098 for { 6099 v_0 := v.Args[0] 6100 if v_0.Op != OpARMInvertFlags { 6101 break 6102 } 6103 x := v_0.Args[0] 6104 v.reset(OpARMEqual) 6105 v.AddArg(x) 6106 return true 6107 } 6108 return false 6109 } 6110 func rewriteValueARM_OpARMGreaterEqual_0(v *Value) bool { 6111 // match: (GreaterEqual (FlagEQ)) 6112 // cond: 6113 // result: (MOVWconst [1]) 6114 for { 6115 v_0 := v.Args[0] 6116 if v_0.Op != OpARMFlagEQ { 6117 break 6118 } 6119 v.reset(OpARMMOVWconst) 6120 v.AuxInt = 1 6121 return true 6122 } 6123 // match: (GreaterEqual (FlagLT_ULT)) 6124 // cond: 6125 // result: (MOVWconst [0]) 6126 for { 6127 v_0 := v.Args[0] 6128 if v_0.Op != OpARMFlagLT_ULT { 6129 break 6130 } 6131 v.reset(OpARMMOVWconst) 6132 v.AuxInt = 0 6133 return true 6134 } 6135 // match: (GreaterEqual (FlagLT_UGT)) 6136 // cond: 6137 // result: (MOVWconst [0]) 6138 for { 6139 v_0 := v.Args[0] 6140 if v_0.Op != OpARMFlagLT_UGT { 6141 break 6142 } 6143 v.reset(OpARMMOVWconst) 6144 v.AuxInt = 0 6145 return true 6146 } 6147 // match: (GreaterEqual (FlagGT_ULT)) 6148 // cond: 6149 // result: (MOVWconst [1]) 6150 for { 6151 v_0 := v.Args[0] 6152 if v_0.Op != OpARMFlagGT_ULT { 6153 break 6154 } 6155 v.reset(OpARMMOVWconst) 6156 v.AuxInt = 1 6157 return true 6158 } 6159 // match: (GreaterEqual (FlagGT_UGT)) 6160 // cond: 6161 // result: (MOVWconst [1]) 6162 for { 6163 v_0 := v.Args[0] 6164 if v_0.Op != OpARMFlagGT_UGT { 6165 break 6166 } 6167 v.reset(OpARMMOVWconst) 6168 v.AuxInt = 1 6169 return true 6170 } 6171 // match: (GreaterEqual (InvertFlags x)) 6172 // cond: 6173 // result: (LessEqual x) 6174 for { 6175 v_0 := v.Args[0] 6176 if v_0.Op != OpARMInvertFlags { 6177 break 6178 } 6179 x := v_0.Args[0] 6180 v.reset(OpARMLessEqual) 6181 v.AddArg(x) 6182 return true 6183 } 6184 return false 6185 } 6186 func rewriteValueARM_OpARMGreaterEqualU_0(v *Value) bool { 6187 // match: (GreaterEqualU (FlagEQ)) 6188 // cond: 6189 // result: (MOVWconst [1]) 6190 for { 6191 v_0 := v.Args[0] 6192 if v_0.Op != OpARMFlagEQ { 6193 break 6194 } 6195 v.reset(OpARMMOVWconst) 6196 v.AuxInt = 1 6197 return true 6198 } 6199 // match: (GreaterEqualU (FlagLT_ULT)) 6200 // cond: 6201 // result: (MOVWconst [0]) 6202 for { 6203 v_0 := v.Args[0] 6204 if v_0.Op != OpARMFlagLT_ULT { 6205 break 6206 } 6207 v.reset(OpARMMOVWconst) 6208 v.AuxInt = 0 6209 return true 6210 } 6211 // match: (GreaterEqualU (FlagLT_UGT)) 6212 // cond: 6213 // result: (MOVWconst [1]) 6214 for { 6215 v_0 := v.Args[0] 6216 if v_0.Op != OpARMFlagLT_UGT { 6217 break 6218 } 6219 v.reset(OpARMMOVWconst) 6220 v.AuxInt = 1 6221 return true 6222 } 6223 // match: (GreaterEqualU (FlagGT_ULT)) 6224 // cond: 6225 // result: (MOVWconst [0]) 6226 for { 6227 v_0 := v.Args[0] 6228 if v_0.Op != OpARMFlagGT_ULT { 6229 break 6230 } 6231 v.reset(OpARMMOVWconst) 6232 v.AuxInt = 0 6233 return true 6234 } 6235 // match: (GreaterEqualU (FlagGT_UGT)) 6236 // cond: 6237 // result: (MOVWconst [1]) 6238 for { 6239 v_0 := v.Args[0] 6240 if v_0.Op != OpARMFlagGT_UGT { 6241 break 6242 } 6243 v.reset(OpARMMOVWconst) 6244 v.AuxInt = 1 6245 return true 6246 } 6247 // match: (GreaterEqualU (InvertFlags x)) 6248 // cond: 6249 // result: (LessEqualU x) 6250 for { 6251 v_0 := v.Args[0] 6252 if v_0.Op != OpARMInvertFlags { 6253 break 6254 } 6255 x := v_0.Args[0] 6256 v.reset(OpARMLessEqualU) 6257 v.AddArg(x) 6258 return true 6259 } 6260 return false 6261 } 6262 func rewriteValueARM_OpARMGreaterThan_0(v *Value) bool { 6263 // match: (GreaterThan (FlagEQ)) 6264 // cond: 6265 // result: (MOVWconst [0]) 6266 for { 6267 v_0 := v.Args[0] 6268 if v_0.Op != OpARMFlagEQ { 6269 break 6270 } 6271 v.reset(OpARMMOVWconst) 6272 v.AuxInt = 0 6273 return true 6274 } 6275 // match: (GreaterThan (FlagLT_ULT)) 6276 // cond: 6277 // result: (MOVWconst [0]) 6278 for { 6279 v_0 := v.Args[0] 6280 if v_0.Op != OpARMFlagLT_ULT { 6281 break 6282 } 6283 v.reset(OpARMMOVWconst) 6284 v.AuxInt = 0 6285 return true 6286 } 6287 // match: (GreaterThan (FlagLT_UGT)) 6288 // cond: 6289 // result: (MOVWconst [0]) 6290 for { 6291 v_0 := v.Args[0] 6292 if v_0.Op != OpARMFlagLT_UGT { 6293 break 6294 } 6295 v.reset(OpARMMOVWconst) 6296 v.AuxInt = 0 6297 return true 6298 } 6299 // match: (GreaterThan (FlagGT_ULT)) 6300 // cond: 6301 // result: (MOVWconst [1]) 6302 for { 6303 v_0 := v.Args[0] 6304 if v_0.Op != OpARMFlagGT_ULT { 6305 break 6306 } 6307 v.reset(OpARMMOVWconst) 6308 v.AuxInt = 1 6309 return true 6310 } 6311 // match: (GreaterThan (FlagGT_UGT)) 6312 // cond: 6313 // result: (MOVWconst [1]) 6314 for { 6315 v_0 := v.Args[0] 6316 if v_0.Op != OpARMFlagGT_UGT { 6317 break 6318 } 6319 v.reset(OpARMMOVWconst) 6320 v.AuxInt = 1 6321 return true 6322 } 6323 // match: (GreaterThan (InvertFlags x)) 6324 // cond: 6325 // result: (LessThan x) 6326 for { 6327 v_0 := v.Args[0] 6328 if v_0.Op != OpARMInvertFlags { 6329 break 6330 } 6331 x := v_0.Args[0] 6332 v.reset(OpARMLessThan) 6333 v.AddArg(x) 6334 return true 6335 } 6336 return false 6337 } 6338 func rewriteValueARM_OpARMGreaterThanU_0(v *Value) bool { 6339 // match: (GreaterThanU (FlagEQ)) 6340 // cond: 6341 // result: (MOVWconst [0]) 6342 for { 6343 v_0 := v.Args[0] 6344 if v_0.Op != OpARMFlagEQ { 6345 break 6346 } 6347 v.reset(OpARMMOVWconst) 6348 v.AuxInt = 0 6349 return true 6350 } 6351 // match: (GreaterThanU (FlagLT_ULT)) 6352 // cond: 6353 // result: (MOVWconst [0]) 6354 for { 6355 v_0 := v.Args[0] 6356 if v_0.Op != OpARMFlagLT_ULT { 6357 break 6358 } 6359 v.reset(OpARMMOVWconst) 6360 v.AuxInt = 0 6361 return true 6362 } 6363 // match: (GreaterThanU (FlagLT_UGT)) 6364 // cond: 6365 // result: (MOVWconst [1]) 6366 for { 6367 v_0 := v.Args[0] 6368 if v_0.Op != OpARMFlagLT_UGT { 6369 break 6370 } 6371 v.reset(OpARMMOVWconst) 6372 v.AuxInt = 1 6373 return true 6374 } 6375 // match: (GreaterThanU (FlagGT_ULT)) 6376 // cond: 6377 // result: (MOVWconst [0]) 6378 for { 6379 v_0 := v.Args[0] 6380 if v_0.Op != OpARMFlagGT_ULT { 6381 break 6382 } 6383 v.reset(OpARMMOVWconst) 6384 v.AuxInt = 0 6385 return true 6386 } 6387 // match: (GreaterThanU (FlagGT_UGT)) 6388 // cond: 6389 // result: (MOVWconst [1]) 6390 for { 6391 v_0 := v.Args[0] 6392 if v_0.Op != OpARMFlagGT_UGT { 6393 break 6394 } 6395 v.reset(OpARMMOVWconst) 6396 v.AuxInt = 1 6397 return true 6398 } 6399 // match: (GreaterThanU (InvertFlags x)) 6400 // cond: 6401 // result: (LessThanU x) 6402 for { 6403 v_0 := v.Args[0] 6404 if v_0.Op != OpARMInvertFlags { 6405 break 6406 } 6407 x := v_0.Args[0] 6408 v.reset(OpARMLessThanU) 6409 v.AddArg(x) 6410 return true 6411 } 6412 return false 6413 } 6414 func rewriteValueARM_OpARMLessEqual_0(v *Value) bool { 6415 // match: (LessEqual (FlagEQ)) 6416 // cond: 6417 // result: (MOVWconst [1]) 6418 for { 6419 v_0 := v.Args[0] 6420 if v_0.Op != OpARMFlagEQ { 6421 break 6422 } 6423 v.reset(OpARMMOVWconst) 6424 v.AuxInt = 1 6425 return true 6426 } 6427 // match: (LessEqual (FlagLT_ULT)) 6428 // cond: 6429 // result: (MOVWconst [1]) 6430 for { 6431 v_0 := v.Args[0] 6432 if v_0.Op != OpARMFlagLT_ULT { 6433 break 6434 } 6435 v.reset(OpARMMOVWconst) 6436 v.AuxInt = 1 6437 return true 6438 } 6439 // match: (LessEqual (FlagLT_UGT)) 6440 // cond: 6441 // result: (MOVWconst [1]) 6442 for { 6443 v_0 := v.Args[0] 6444 if v_0.Op != OpARMFlagLT_UGT { 6445 break 6446 } 6447 v.reset(OpARMMOVWconst) 6448 v.AuxInt = 1 6449 return true 6450 } 6451 // match: (LessEqual (FlagGT_ULT)) 6452 // cond: 6453 // result: (MOVWconst [0]) 6454 for { 6455 v_0 := v.Args[0] 6456 if v_0.Op != OpARMFlagGT_ULT { 6457 break 6458 } 6459 v.reset(OpARMMOVWconst) 6460 v.AuxInt = 0 6461 return true 6462 } 6463 // match: (LessEqual (FlagGT_UGT)) 6464 // cond: 6465 // result: (MOVWconst [0]) 6466 for { 6467 v_0 := v.Args[0] 6468 if v_0.Op != OpARMFlagGT_UGT { 6469 break 6470 } 6471 v.reset(OpARMMOVWconst) 6472 v.AuxInt = 0 6473 return true 6474 } 6475 // match: (LessEqual (InvertFlags x)) 6476 // cond: 6477 // result: (GreaterEqual x) 6478 for { 6479 v_0 := v.Args[0] 6480 if v_0.Op != OpARMInvertFlags { 6481 break 6482 } 6483 x := v_0.Args[0] 6484 v.reset(OpARMGreaterEqual) 6485 v.AddArg(x) 6486 return true 6487 } 6488 return false 6489 } 6490 func rewriteValueARM_OpARMLessEqualU_0(v *Value) bool { 6491 // match: (LessEqualU (FlagEQ)) 6492 // cond: 6493 // result: (MOVWconst [1]) 6494 for { 6495 v_0 := v.Args[0] 6496 if v_0.Op != OpARMFlagEQ { 6497 break 6498 } 6499 v.reset(OpARMMOVWconst) 6500 v.AuxInt = 1 6501 return true 6502 } 6503 // match: (LessEqualU (FlagLT_ULT)) 6504 // cond: 6505 // result: (MOVWconst [1]) 6506 for { 6507 v_0 := v.Args[0] 6508 if v_0.Op != OpARMFlagLT_ULT { 6509 break 6510 } 6511 v.reset(OpARMMOVWconst) 6512 v.AuxInt = 1 6513 return true 6514 } 6515 // match: (LessEqualU (FlagLT_UGT)) 6516 // cond: 6517 // result: (MOVWconst [0]) 6518 for { 6519 v_0 := v.Args[0] 6520 if v_0.Op != OpARMFlagLT_UGT { 6521 break 6522 } 6523 v.reset(OpARMMOVWconst) 6524 v.AuxInt = 0 6525 return true 6526 } 6527 // match: (LessEqualU (FlagGT_ULT)) 6528 // cond: 6529 // result: (MOVWconst [1]) 6530 for { 6531 v_0 := v.Args[0] 6532 if v_0.Op != OpARMFlagGT_ULT { 6533 break 6534 } 6535 v.reset(OpARMMOVWconst) 6536 v.AuxInt = 1 6537 return true 6538 } 6539 // match: (LessEqualU (FlagGT_UGT)) 6540 // cond: 6541 // result: (MOVWconst [0]) 6542 for { 6543 v_0 := v.Args[0] 6544 if v_0.Op != OpARMFlagGT_UGT { 6545 break 6546 } 6547 v.reset(OpARMMOVWconst) 6548 v.AuxInt = 0 6549 return true 6550 } 6551 // match: (LessEqualU (InvertFlags x)) 6552 // cond: 6553 // result: (GreaterEqualU x) 6554 for { 6555 v_0 := v.Args[0] 6556 if v_0.Op != OpARMInvertFlags { 6557 break 6558 } 6559 x := v_0.Args[0] 6560 v.reset(OpARMGreaterEqualU) 6561 v.AddArg(x) 6562 return true 6563 } 6564 return false 6565 } 6566 func rewriteValueARM_OpARMLessThan_0(v *Value) bool { 6567 // match: (LessThan (FlagEQ)) 6568 // cond: 6569 // result: (MOVWconst [0]) 6570 for { 6571 v_0 := v.Args[0] 6572 if v_0.Op != OpARMFlagEQ { 6573 break 6574 } 6575 v.reset(OpARMMOVWconst) 6576 v.AuxInt = 0 6577 return true 6578 } 6579 // match: (LessThan (FlagLT_ULT)) 6580 // cond: 6581 // result: (MOVWconst [1]) 6582 for { 6583 v_0 := v.Args[0] 6584 if v_0.Op != OpARMFlagLT_ULT { 6585 break 6586 } 6587 v.reset(OpARMMOVWconst) 6588 v.AuxInt = 1 6589 return true 6590 } 6591 // match: (LessThan (FlagLT_UGT)) 6592 // cond: 6593 // result: (MOVWconst [1]) 6594 for { 6595 v_0 := v.Args[0] 6596 if v_0.Op != OpARMFlagLT_UGT { 6597 break 6598 } 6599 v.reset(OpARMMOVWconst) 6600 v.AuxInt = 1 6601 return true 6602 } 6603 // match: (LessThan (FlagGT_ULT)) 6604 // cond: 6605 // result: (MOVWconst [0]) 6606 for { 6607 v_0 := v.Args[0] 6608 if v_0.Op != OpARMFlagGT_ULT { 6609 break 6610 } 6611 v.reset(OpARMMOVWconst) 6612 v.AuxInt = 0 6613 return true 6614 } 6615 // match: (LessThan (FlagGT_UGT)) 6616 // cond: 6617 // result: (MOVWconst [0]) 6618 for { 6619 v_0 := v.Args[0] 6620 if v_0.Op != OpARMFlagGT_UGT { 6621 break 6622 } 6623 v.reset(OpARMMOVWconst) 6624 v.AuxInt = 0 6625 return true 6626 } 6627 // match: (LessThan (InvertFlags x)) 6628 // cond: 6629 // result: (GreaterThan x) 6630 for { 6631 v_0 := v.Args[0] 6632 if v_0.Op != OpARMInvertFlags { 6633 break 6634 } 6635 x := v_0.Args[0] 6636 v.reset(OpARMGreaterThan) 6637 v.AddArg(x) 6638 return true 6639 } 6640 return false 6641 } 6642 func rewriteValueARM_OpARMLessThanU_0(v *Value) bool { 6643 // match: (LessThanU (FlagEQ)) 6644 // cond: 6645 // result: (MOVWconst [0]) 6646 for { 6647 v_0 := v.Args[0] 6648 if v_0.Op != OpARMFlagEQ { 6649 break 6650 } 6651 v.reset(OpARMMOVWconst) 6652 v.AuxInt = 0 6653 return true 6654 } 6655 // match: (LessThanU (FlagLT_ULT)) 6656 // cond: 6657 // result: (MOVWconst [1]) 6658 for { 6659 v_0 := v.Args[0] 6660 if v_0.Op != OpARMFlagLT_ULT { 6661 break 6662 } 6663 v.reset(OpARMMOVWconst) 6664 v.AuxInt = 1 6665 return true 6666 } 6667 // match: (LessThanU (FlagLT_UGT)) 6668 // cond: 6669 // result: (MOVWconst [0]) 6670 for { 6671 v_0 := v.Args[0] 6672 if v_0.Op != OpARMFlagLT_UGT { 6673 break 6674 } 6675 v.reset(OpARMMOVWconst) 6676 v.AuxInt = 0 6677 return true 6678 } 6679 // match: (LessThanU (FlagGT_ULT)) 6680 // cond: 6681 // result: (MOVWconst [1]) 6682 for { 6683 v_0 := v.Args[0] 6684 if v_0.Op != OpARMFlagGT_ULT { 6685 break 6686 } 6687 v.reset(OpARMMOVWconst) 6688 v.AuxInt = 1 6689 return true 6690 } 6691 // match: (LessThanU (FlagGT_UGT)) 6692 // cond: 6693 // result: (MOVWconst [0]) 6694 for { 6695 v_0 := v.Args[0] 6696 if v_0.Op != OpARMFlagGT_UGT { 6697 break 6698 } 6699 v.reset(OpARMMOVWconst) 6700 v.AuxInt = 0 6701 return true 6702 } 6703 // match: (LessThanU (InvertFlags x)) 6704 // cond: 6705 // result: (GreaterThanU x) 6706 for { 6707 v_0 := v.Args[0] 6708 if v_0.Op != OpARMInvertFlags { 6709 break 6710 } 6711 x := v_0.Args[0] 6712 v.reset(OpARMGreaterThanU) 6713 v.AddArg(x) 6714 return true 6715 } 6716 return false 6717 } 6718 func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { 6719 b := v.Block 6720 _ = b 6721 config := b.Func.Config 6722 _ = config 6723 // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) 6724 // cond: 6725 // result: (MOVBUload [off1+off2] {sym} ptr mem) 6726 for { 6727 off1 := v.AuxInt 6728 sym := v.Aux 6729 _ = v.Args[1] 6730 v_0 := v.Args[0] 6731 if v_0.Op != OpARMADDconst { 6732 break 6733 } 6734 off2 := v_0.AuxInt 6735 ptr := v_0.Args[0] 6736 mem := v.Args[1] 6737 v.reset(OpARMMOVBUload) 6738 v.AuxInt = off1 + off2 6739 v.Aux = sym 6740 v.AddArg(ptr) 6741 v.AddArg(mem) 6742 return true 6743 } 6744 // match: (MOVBUload [off1] {sym} (SUBconst [off2] ptr) mem) 6745 // cond: 6746 // result: (MOVBUload [off1-off2] {sym} ptr mem) 6747 for { 6748 off1 := v.AuxInt 6749 sym := v.Aux 6750 _ = v.Args[1] 6751 v_0 := v.Args[0] 6752 if v_0.Op != OpARMSUBconst { 6753 break 6754 } 6755 off2 := v_0.AuxInt 6756 ptr := v_0.Args[0] 6757 mem := v.Args[1] 6758 v.reset(OpARMMOVBUload) 6759 v.AuxInt = off1 - off2 6760 v.Aux = sym 6761 v.AddArg(ptr) 6762 v.AddArg(mem) 6763 return true 6764 } 6765 // match: (MOVBUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 6766 // cond: canMergeSym(sym1,sym2) 6767 // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 6768 for { 6769 off1 := v.AuxInt 6770 sym1 := v.Aux 6771 _ = v.Args[1] 6772 v_0 := v.Args[0] 6773 if v_0.Op != OpARMMOVWaddr { 6774 break 6775 } 6776 off2 := v_0.AuxInt 6777 sym2 := v_0.Aux 6778 ptr := v_0.Args[0] 6779 mem := v.Args[1] 6780 if !(canMergeSym(sym1, sym2)) { 6781 break 6782 } 6783 v.reset(OpARMMOVBUload) 6784 v.AuxInt = off1 + off2 6785 v.Aux = mergeSym(sym1, sym2) 6786 v.AddArg(ptr) 6787 v.AddArg(mem) 6788 return true 6789 } 6790 // match: (MOVBUload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 6791 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 6792 // result: (MOVBUreg x) 6793 for { 6794 off := v.AuxInt 6795 sym := v.Aux 6796 _ = v.Args[1] 6797 ptr := v.Args[0] 6798 v_1 := v.Args[1] 6799 if v_1.Op != OpARMMOVBstore { 6800 break 6801 } 6802 off2 := v_1.AuxInt 6803 sym2 := v_1.Aux 6804 _ = v_1.Args[2] 6805 ptr2 := v_1.Args[0] 6806 x := v_1.Args[1] 6807 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 6808 break 6809 } 6810 v.reset(OpARMMOVBUreg) 6811 v.AddArg(x) 6812 return true 6813 } 6814 // match: (MOVBUload [0] {sym} (ADD ptr idx) mem) 6815 // cond: sym == nil && !config.nacl 6816 // result: (MOVBUloadidx ptr idx mem) 6817 for { 6818 if v.AuxInt != 0 { 6819 break 6820 } 6821 sym := v.Aux 6822 _ = v.Args[1] 6823 v_0 := v.Args[0] 6824 if v_0.Op != OpARMADD { 6825 break 6826 } 6827 _ = v_0.Args[1] 6828 ptr := v_0.Args[0] 6829 idx := v_0.Args[1] 6830 mem := v.Args[1] 6831 if !(sym == nil && !config.nacl) { 6832 break 6833 } 6834 v.reset(OpARMMOVBUloadidx) 6835 v.AddArg(ptr) 6836 v.AddArg(idx) 6837 v.AddArg(mem) 6838 return true 6839 } 6840 return false 6841 } 6842 func rewriteValueARM_OpARMMOVBUloadidx_0(v *Value) bool { 6843 // match: (MOVBUloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 6844 // cond: isSamePtr(ptr, ptr2) 6845 // result: (MOVBUreg x) 6846 for { 6847 _ = v.Args[2] 6848 ptr := v.Args[0] 6849 idx := v.Args[1] 6850 v_2 := v.Args[2] 6851 if v_2.Op != OpARMMOVBstoreidx { 6852 break 6853 } 6854 _ = v_2.Args[3] 6855 ptr2 := v_2.Args[0] 6856 if idx != v_2.Args[1] { 6857 break 6858 } 6859 x := v_2.Args[2] 6860 if !(isSamePtr(ptr, ptr2)) { 6861 break 6862 } 6863 v.reset(OpARMMOVBUreg) 6864 v.AddArg(x) 6865 return true 6866 } 6867 // match: (MOVBUloadidx ptr (MOVWconst [c]) mem) 6868 // cond: 6869 // result: (MOVBUload [c] ptr mem) 6870 for { 6871 _ = v.Args[2] 6872 ptr := v.Args[0] 6873 v_1 := v.Args[1] 6874 if v_1.Op != OpARMMOVWconst { 6875 break 6876 } 6877 c := v_1.AuxInt 6878 mem := v.Args[2] 6879 v.reset(OpARMMOVBUload) 6880 v.AuxInt = c 6881 v.AddArg(ptr) 6882 v.AddArg(mem) 6883 return true 6884 } 6885 // match: (MOVBUloadidx (MOVWconst [c]) ptr mem) 6886 // cond: 6887 // result: (MOVBUload [c] ptr mem) 6888 for { 6889 _ = v.Args[2] 6890 v_0 := v.Args[0] 6891 if v_0.Op != OpARMMOVWconst { 6892 break 6893 } 6894 c := v_0.AuxInt 6895 ptr := v.Args[1] 6896 mem := v.Args[2] 6897 v.reset(OpARMMOVBUload) 6898 v.AuxInt = c 6899 v.AddArg(ptr) 6900 v.AddArg(mem) 6901 return true 6902 } 6903 return false 6904 } 6905 func rewriteValueARM_OpARMMOVBUreg_0(v *Value) bool { 6906 // match: (MOVBUreg x:(MOVBUload _ _)) 6907 // cond: 6908 // result: (MOVWreg x) 6909 for { 6910 x := v.Args[0] 6911 if x.Op != OpARMMOVBUload { 6912 break 6913 } 6914 _ = x.Args[1] 6915 v.reset(OpARMMOVWreg) 6916 v.AddArg(x) 6917 return true 6918 } 6919 // match: (MOVBUreg (ANDconst [c] x)) 6920 // cond: 6921 // result: (ANDconst [c&0xff] x) 6922 for { 6923 v_0 := v.Args[0] 6924 if v_0.Op != OpARMANDconst { 6925 break 6926 } 6927 c := v_0.AuxInt 6928 x := v_0.Args[0] 6929 v.reset(OpARMANDconst) 6930 v.AuxInt = c & 0xff 6931 v.AddArg(x) 6932 return true 6933 } 6934 // match: (MOVBUreg x:(MOVBUreg _)) 6935 // cond: 6936 // result: (MOVWreg x) 6937 for { 6938 x := v.Args[0] 6939 if x.Op != OpARMMOVBUreg { 6940 break 6941 } 6942 v.reset(OpARMMOVWreg) 6943 v.AddArg(x) 6944 return true 6945 } 6946 // match: (MOVBUreg (MOVWconst [c])) 6947 // cond: 6948 // result: (MOVWconst [int64(uint8(c))]) 6949 for { 6950 v_0 := v.Args[0] 6951 if v_0.Op != OpARMMOVWconst { 6952 break 6953 } 6954 c := v_0.AuxInt 6955 v.reset(OpARMMOVWconst) 6956 v.AuxInt = int64(uint8(c)) 6957 return true 6958 } 6959 return false 6960 } 6961 func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { 6962 b := v.Block 6963 _ = b 6964 config := b.Func.Config 6965 _ = config 6966 // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) 6967 // cond: 6968 // result: (MOVBload [off1+off2] {sym} ptr mem) 6969 for { 6970 off1 := v.AuxInt 6971 sym := v.Aux 6972 _ = v.Args[1] 6973 v_0 := v.Args[0] 6974 if v_0.Op != OpARMADDconst { 6975 break 6976 } 6977 off2 := v_0.AuxInt 6978 ptr := v_0.Args[0] 6979 mem := v.Args[1] 6980 v.reset(OpARMMOVBload) 6981 v.AuxInt = off1 + off2 6982 v.Aux = sym 6983 v.AddArg(ptr) 6984 v.AddArg(mem) 6985 return true 6986 } 6987 // match: (MOVBload [off1] {sym} (SUBconst [off2] ptr) mem) 6988 // cond: 6989 // result: (MOVBload [off1-off2] {sym} ptr mem) 6990 for { 6991 off1 := v.AuxInt 6992 sym := v.Aux 6993 _ = v.Args[1] 6994 v_0 := v.Args[0] 6995 if v_0.Op != OpARMSUBconst { 6996 break 6997 } 6998 off2 := v_0.AuxInt 6999 ptr := v_0.Args[0] 7000 mem := v.Args[1] 7001 v.reset(OpARMMOVBload) 7002 v.AuxInt = off1 - off2 7003 v.Aux = sym 7004 v.AddArg(ptr) 7005 v.AddArg(mem) 7006 return true 7007 } 7008 // match: (MOVBload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7009 // cond: canMergeSym(sym1,sym2) 7010 // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7011 for { 7012 off1 := v.AuxInt 7013 sym1 := v.Aux 7014 _ = v.Args[1] 7015 v_0 := v.Args[0] 7016 if v_0.Op != OpARMMOVWaddr { 7017 break 7018 } 7019 off2 := v_0.AuxInt 7020 sym2 := v_0.Aux 7021 ptr := v_0.Args[0] 7022 mem := v.Args[1] 7023 if !(canMergeSym(sym1, sym2)) { 7024 break 7025 } 7026 v.reset(OpARMMOVBload) 7027 v.AuxInt = off1 + off2 7028 v.Aux = mergeSym(sym1, sym2) 7029 v.AddArg(ptr) 7030 v.AddArg(mem) 7031 return true 7032 } 7033 // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) 7034 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7035 // result: (MOVBreg x) 7036 for { 7037 off := v.AuxInt 7038 sym := v.Aux 7039 _ = v.Args[1] 7040 ptr := v.Args[0] 7041 v_1 := v.Args[1] 7042 if v_1.Op != OpARMMOVBstore { 7043 break 7044 } 7045 off2 := v_1.AuxInt 7046 sym2 := v_1.Aux 7047 _ = v_1.Args[2] 7048 ptr2 := v_1.Args[0] 7049 x := v_1.Args[1] 7050 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7051 break 7052 } 7053 v.reset(OpARMMOVBreg) 7054 v.AddArg(x) 7055 return true 7056 } 7057 // match: (MOVBload [0] {sym} (ADD ptr idx) mem) 7058 // cond: sym == nil && !config.nacl 7059 // result: (MOVBloadidx ptr idx mem) 7060 for { 7061 if v.AuxInt != 0 { 7062 break 7063 } 7064 sym := v.Aux 7065 _ = v.Args[1] 7066 v_0 := v.Args[0] 7067 if v_0.Op != OpARMADD { 7068 break 7069 } 7070 _ = v_0.Args[1] 7071 ptr := v_0.Args[0] 7072 idx := v_0.Args[1] 7073 mem := v.Args[1] 7074 if !(sym == nil && !config.nacl) { 7075 break 7076 } 7077 v.reset(OpARMMOVBloadidx) 7078 v.AddArg(ptr) 7079 v.AddArg(idx) 7080 v.AddArg(mem) 7081 return true 7082 } 7083 return false 7084 } 7085 func rewriteValueARM_OpARMMOVBloadidx_0(v *Value) bool { 7086 // match: (MOVBloadidx ptr idx (MOVBstoreidx ptr2 idx x _)) 7087 // cond: isSamePtr(ptr, ptr2) 7088 // result: (MOVBreg x) 7089 for { 7090 _ = v.Args[2] 7091 ptr := v.Args[0] 7092 idx := v.Args[1] 7093 v_2 := v.Args[2] 7094 if v_2.Op != OpARMMOVBstoreidx { 7095 break 7096 } 7097 _ = v_2.Args[3] 7098 ptr2 := v_2.Args[0] 7099 if idx != v_2.Args[1] { 7100 break 7101 } 7102 x := v_2.Args[2] 7103 if !(isSamePtr(ptr, ptr2)) { 7104 break 7105 } 7106 v.reset(OpARMMOVBreg) 7107 v.AddArg(x) 7108 return true 7109 } 7110 // match: (MOVBloadidx ptr (MOVWconst [c]) mem) 7111 // cond: 7112 // result: (MOVBload [c] ptr mem) 7113 for { 7114 _ = v.Args[2] 7115 ptr := v.Args[0] 7116 v_1 := v.Args[1] 7117 if v_1.Op != OpARMMOVWconst { 7118 break 7119 } 7120 c := v_1.AuxInt 7121 mem := v.Args[2] 7122 v.reset(OpARMMOVBload) 7123 v.AuxInt = c 7124 v.AddArg(ptr) 7125 v.AddArg(mem) 7126 return true 7127 } 7128 // match: (MOVBloadidx (MOVWconst [c]) ptr mem) 7129 // cond: 7130 // result: (MOVBload [c] ptr mem) 7131 for { 7132 _ = v.Args[2] 7133 v_0 := v.Args[0] 7134 if v_0.Op != OpARMMOVWconst { 7135 break 7136 } 7137 c := v_0.AuxInt 7138 ptr := v.Args[1] 7139 mem := v.Args[2] 7140 v.reset(OpARMMOVBload) 7141 v.AuxInt = c 7142 v.AddArg(ptr) 7143 v.AddArg(mem) 7144 return true 7145 } 7146 return false 7147 } 7148 func rewriteValueARM_OpARMMOVBreg_0(v *Value) bool { 7149 // match: (MOVBreg x:(MOVBload _ _)) 7150 // cond: 7151 // result: (MOVWreg x) 7152 for { 7153 x := v.Args[0] 7154 if x.Op != OpARMMOVBload { 7155 break 7156 } 7157 _ = x.Args[1] 7158 v.reset(OpARMMOVWreg) 7159 v.AddArg(x) 7160 return true 7161 } 7162 // match: (MOVBreg (ANDconst [c] x)) 7163 // cond: c & 0x80 == 0 7164 // result: (ANDconst [c&0x7f] x) 7165 for { 7166 v_0 := v.Args[0] 7167 if v_0.Op != OpARMANDconst { 7168 break 7169 } 7170 c := v_0.AuxInt 7171 x := v_0.Args[0] 7172 if !(c&0x80 == 0) { 7173 break 7174 } 7175 v.reset(OpARMANDconst) 7176 v.AuxInt = c & 0x7f 7177 v.AddArg(x) 7178 return true 7179 } 7180 // match: (MOVBreg x:(MOVBreg _)) 7181 // cond: 7182 // result: (MOVWreg x) 7183 for { 7184 x := v.Args[0] 7185 if x.Op != OpARMMOVBreg { 7186 break 7187 } 7188 v.reset(OpARMMOVWreg) 7189 v.AddArg(x) 7190 return true 7191 } 7192 // match: (MOVBreg (MOVWconst [c])) 7193 // cond: 7194 // result: (MOVWconst [int64(int8(c))]) 7195 for { 7196 v_0 := v.Args[0] 7197 if v_0.Op != OpARMMOVWconst { 7198 break 7199 } 7200 c := v_0.AuxInt 7201 v.reset(OpARMMOVWconst) 7202 v.AuxInt = int64(int8(c)) 7203 return true 7204 } 7205 return false 7206 } 7207 func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { 7208 b := v.Block 7209 _ = b 7210 config := b.Func.Config 7211 _ = config 7212 // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7213 // cond: 7214 // result: (MOVBstore [off1+off2] {sym} ptr val mem) 7215 for { 7216 off1 := v.AuxInt 7217 sym := v.Aux 7218 _ = v.Args[2] 7219 v_0 := v.Args[0] 7220 if v_0.Op != OpARMADDconst { 7221 break 7222 } 7223 off2 := v_0.AuxInt 7224 ptr := v_0.Args[0] 7225 val := v.Args[1] 7226 mem := v.Args[2] 7227 v.reset(OpARMMOVBstore) 7228 v.AuxInt = off1 + off2 7229 v.Aux = sym 7230 v.AddArg(ptr) 7231 v.AddArg(val) 7232 v.AddArg(mem) 7233 return true 7234 } 7235 // match: (MOVBstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7236 // cond: 7237 // result: (MOVBstore [off1-off2] {sym} ptr val mem) 7238 for { 7239 off1 := v.AuxInt 7240 sym := v.Aux 7241 _ = v.Args[2] 7242 v_0 := v.Args[0] 7243 if v_0.Op != OpARMSUBconst { 7244 break 7245 } 7246 off2 := v_0.AuxInt 7247 ptr := v_0.Args[0] 7248 val := v.Args[1] 7249 mem := v.Args[2] 7250 v.reset(OpARMMOVBstore) 7251 v.AuxInt = off1 - off2 7252 v.Aux = sym 7253 v.AddArg(ptr) 7254 v.AddArg(val) 7255 v.AddArg(mem) 7256 return true 7257 } 7258 // match: (MOVBstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7259 // cond: canMergeSym(sym1,sym2) 7260 // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7261 for { 7262 off1 := v.AuxInt 7263 sym1 := v.Aux 7264 _ = v.Args[2] 7265 v_0 := v.Args[0] 7266 if v_0.Op != OpARMMOVWaddr { 7267 break 7268 } 7269 off2 := v_0.AuxInt 7270 sym2 := v_0.Aux 7271 ptr := v_0.Args[0] 7272 val := v.Args[1] 7273 mem := v.Args[2] 7274 if !(canMergeSym(sym1, sym2)) { 7275 break 7276 } 7277 v.reset(OpARMMOVBstore) 7278 v.AuxInt = off1 + off2 7279 v.Aux = mergeSym(sym1, sym2) 7280 v.AddArg(ptr) 7281 v.AddArg(val) 7282 v.AddArg(mem) 7283 return true 7284 } 7285 // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) 7286 // cond: 7287 // result: (MOVBstore [off] {sym} ptr x mem) 7288 for { 7289 off := v.AuxInt 7290 sym := v.Aux 7291 _ = v.Args[2] 7292 ptr := v.Args[0] 7293 v_1 := v.Args[1] 7294 if v_1.Op != OpARMMOVBreg { 7295 break 7296 } 7297 x := v_1.Args[0] 7298 mem := v.Args[2] 7299 v.reset(OpARMMOVBstore) 7300 v.AuxInt = off 7301 v.Aux = sym 7302 v.AddArg(ptr) 7303 v.AddArg(x) 7304 v.AddArg(mem) 7305 return true 7306 } 7307 // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) 7308 // cond: 7309 // result: (MOVBstore [off] {sym} ptr x mem) 7310 for { 7311 off := v.AuxInt 7312 sym := v.Aux 7313 _ = v.Args[2] 7314 ptr := v.Args[0] 7315 v_1 := v.Args[1] 7316 if v_1.Op != OpARMMOVBUreg { 7317 break 7318 } 7319 x := v_1.Args[0] 7320 mem := v.Args[2] 7321 v.reset(OpARMMOVBstore) 7322 v.AuxInt = off 7323 v.Aux = sym 7324 v.AddArg(ptr) 7325 v.AddArg(x) 7326 v.AddArg(mem) 7327 return true 7328 } 7329 // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) 7330 // cond: 7331 // result: (MOVBstore [off] {sym} ptr x mem) 7332 for { 7333 off := v.AuxInt 7334 sym := v.Aux 7335 _ = v.Args[2] 7336 ptr := v.Args[0] 7337 v_1 := v.Args[1] 7338 if v_1.Op != OpARMMOVHreg { 7339 break 7340 } 7341 x := v_1.Args[0] 7342 mem := v.Args[2] 7343 v.reset(OpARMMOVBstore) 7344 v.AuxInt = off 7345 v.Aux = sym 7346 v.AddArg(ptr) 7347 v.AddArg(x) 7348 v.AddArg(mem) 7349 return true 7350 } 7351 // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) 7352 // cond: 7353 // result: (MOVBstore [off] {sym} ptr x mem) 7354 for { 7355 off := v.AuxInt 7356 sym := v.Aux 7357 _ = v.Args[2] 7358 ptr := v.Args[0] 7359 v_1 := v.Args[1] 7360 if v_1.Op != OpARMMOVHUreg { 7361 break 7362 } 7363 x := v_1.Args[0] 7364 mem := v.Args[2] 7365 v.reset(OpARMMOVBstore) 7366 v.AuxInt = off 7367 v.Aux = sym 7368 v.AddArg(ptr) 7369 v.AddArg(x) 7370 v.AddArg(mem) 7371 return true 7372 } 7373 // match: (MOVBstore [0] {sym} (ADD ptr idx) val mem) 7374 // cond: sym == nil && !config.nacl 7375 // result: (MOVBstoreidx ptr idx val mem) 7376 for { 7377 if v.AuxInt != 0 { 7378 break 7379 } 7380 sym := v.Aux 7381 _ = v.Args[2] 7382 v_0 := v.Args[0] 7383 if v_0.Op != OpARMADD { 7384 break 7385 } 7386 _ = v_0.Args[1] 7387 ptr := v_0.Args[0] 7388 idx := v_0.Args[1] 7389 val := v.Args[1] 7390 mem := v.Args[2] 7391 if !(sym == nil && !config.nacl) { 7392 break 7393 } 7394 v.reset(OpARMMOVBstoreidx) 7395 v.AddArg(ptr) 7396 v.AddArg(idx) 7397 v.AddArg(val) 7398 v.AddArg(mem) 7399 return true 7400 } 7401 return false 7402 } 7403 func rewriteValueARM_OpARMMOVBstoreidx_0(v *Value) bool { 7404 // match: (MOVBstoreidx ptr (MOVWconst [c]) val mem) 7405 // cond: 7406 // result: (MOVBstore [c] ptr val mem) 7407 for { 7408 _ = v.Args[3] 7409 ptr := v.Args[0] 7410 v_1 := v.Args[1] 7411 if v_1.Op != OpARMMOVWconst { 7412 break 7413 } 7414 c := v_1.AuxInt 7415 val := v.Args[2] 7416 mem := v.Args[3] 7417 v.reset(OpARMMOVBstore) 7418 v.AuxInt = c 7419 v.AddArg(ptr) 7420 v.AddArg(val) 7421 v.AddArg(mem) 7422 return true 7423 } 7424 // match: (MOVBstoreidx (MOVWconst [c]) ptr val mem) 7425 // cond: 7426 // result: (MOVBstore [c] ptr val mem) 7427 for { 7428 _ = v.Args[3] 7429 v_0 := v.Args[0] 7430 if v_0.Op != OpARMMOVWconst { 7431 break 7432 } 7433 c := v_0.AuxInt 7434 ptr := v.Args[1] 7435 val := v.Args[2] 7436 mem := v.Args[3] 7437 v.reset(OpARMMOVBstore) 7438 v.AuxInt = c 7439 v.AddArg(ptr) 7440 v.AddArg(val) 7441 v.AddArg(mem) 7442 return true 7443 } 7444 return false 7445 } 7446 func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { 7447 // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) 7448 // cond: 7449 // result: (MOVDload [off1+off2] {sym} ptr mem) 7450 for { 7451 off1 := v.AuxInt 7452 sym := v.Aux 7453 _ = v.Args[1] 7454 v_0 := v.Args[0] 7455 if v_0.Op != OpARMADDconst { 7456 break 7457 } 7458 off2 := v_0.AuxInt 7459 ptr := v_0.Args[0] 7460 mem := v.Args[1] 7461 v.reset(OpARMMOVDload) 7462 v.AuxInt = off1 + off2 7463 v.Aux = sym 7464 v.AddArg(ptr) 7465 v.AddArg(mem) 7466 return true 7467 } 7468 // match: (MOVDload [off1] {sym} (SUBconst [off2] ptr) mem) 7469 // cond: 7470 // result: (MOVDload [off1-off2] {sym} ptr mem) 7471 for { 7472 off1 := v.AuxInt 7473 sym := v.Aux 7474 _ = v.Args[1] 7475 v_0 := v.Args[0] 7476 if v_0.Op != OpARMSUBconst { 7477 break 7478 } 7479 off2 := v_0.AuxInt 7480 ptr := v_0.Args[0] 7481 mem := v.Args[1] 7482 v.reset(OpARMMOVDload) 7483 v.AuxInt = off1 - off2 7484 v.Aux = sym 7485 v.AddArg(ptr) 7486 v.AddArg(mem) 7487 return true 7488 } 7489 // match: (MOVDload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7490 // cond: canMergeSym(sym1,sym2) 7491 // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7492 for { 7493 off1 := v.AuxInt 7494 sym1 := v.Aux 7495 _ = v.Args[1] 7496 v_0 := v.Args[0] 7497 if v_0.Op != OpARMMOVWaddr { 7498 break 7499 } 7500 off2 := v_0.AuxInt 7501 sym2 := v_0.Aux 7502 ptr := v_0.Args[0] 7503 mem := v.Args[1] 7504 if !(canMergeSym(sym1, sym2)) { 7505 break 7506 } 7507 v.reset(OpARMMOVDload) 7508 v.AuxInt = off1 + off2 7509 v.Aux = mergeSym(sym1, sym2) 7510 v.AddArg(ptr) 7511 v.AddArg(mem) 7512 return true 7513 } 7514 // match: (MOVDload [off] {sym} ptr (MOVDstore [off2] {sym2} ptr2 x _)) 7515 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7516 // result: x 7517 for { 7518 off := v.AuxInt 7519 sym := v.Aux 7520 _ = v.Args[1] 7521 ptr := v.Args[0] 7522 v_1 := v.Args[1] 7523 if v_1.Op != OpARMMOVDstore { 7524 break 7525 } 7526 off2 := v_1.AuxInt 7527 sym2 := v_1.Aux 7528 _ = v_1.Args[2] 7529 ptr2 := v_1.Args[0] 7530 x := v_1.Args[1] 7531 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7532 break 7533 } 7534 v.reset(OpCopy) 7535 v.Type = x.Type 7536 v.AddArg(x) 7537 return true 7538 } 7539 return false 7540 } 7541 func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { 7542 // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7543 // cond: 7544 // result: (MOVDstore [off1+off2] {sym} ptr val mem) 7545 for { 7546 off1 := v.AuxInt 7547 sym := v.Aux 7548 _ = v.Args[2] 7549 v_0 := v.Args[0] 7550 if v_0.Op != OpARMADDconst { 7551 break 7552 } 7553 off2 := v_0.AuxInt 7554 ptr := v_0.Args[0] 7555 val := v.Args[1] 7556 mem := v.Args[2] 7557 v.reset(OpARMMOVDstore) 7558 v.AuxInt = off1 + off2 7559 v.Aux = sym 7560 v.AddArg(ptr) 7561 v.AddArg(val) 7562 v.AddArg(mem) 7563 return true 7564 } 7565 // match: (MOVDstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7566 // cond: 7567 // result: (MOVDstore [off1-off2] {sym} ptr val mem) 7568 for { 7569 off1 := v.AuxInt 7570 sym := v.Aux 7571 _ = v.Args[2] 7572 v_0 := v.Args[0] 7573 if v_0.Op != OpARMSUBconst { 7574 break 7575 } 7576 off2 := v_0.AuxInt 7577 ptr := v_0.Args[0] 7578 val := v.Args[1] 7579 mem := v.Args[2] 7580 v.reset(OpARMMOVDstore) 7581 v.AuxInt = off1 - off2 7582 v.Aux = sym 7583 v.AddArg(ptr) 7584 v.AddArg(val) 7585 v.AddArg(mem) 7586 return true 7587 } 7588 // match: (MOVDstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7589 // cond: canMergeSym(sym1,sym2) 7590 // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7591 for { 7592 off1 := v.AuxInt 7593 sym1 := v.Aux 7594 _ = v.Args[2] 7595 v_0 := v.Args[0] 7596 if v_0.Op != OpARMMOVWaddr { 7597 break 7598 } 7599 off2 := v_0.AuxInt 7600 sym2 := v_0.Aux 7601 ptr := v_0.Args[0] 7602 val := v.Args[1] 7603 mem := v.Args[2] 7604 if !(canMergeSym(sym1, sym2)) { 7605 break 7606 } 7607 v.reset(OpARMMOVDstore) 7608 v.AuxInt = off1 + off2 7609 v.Aux = mergeSym(sym1, sym2) 7610 v.AddArg(ptr) 7611 v.AddArg(val) 7612 v.AddArg(mem) 7613 return true 7614 } 7615 return false 7616 } 7617 func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { 7618 // match: (MOVFload [off1] {sym} (ADDconst [off2] ptr) mem) 7619 // cond: 7620 // result: (MOVFload [off1+off2] {sym} ptr mem) 7621 for { 7622 off1 := v.AuxInt 7623 sym := v.Aux 7624 _ = v.Args[1] 7625 v_0 := v.Args[0] 7626 if v_0.Op != OpARMADDconst { 7627 break 7628 } 7629 off2 := v_0.AuxInt 7630 ptr := v_0.Args[0] 7631 mem := v.Args[1] 7632 v.reset(OpARMMOVFload) 7633 v.AuxInt = off1 + off2 7634 v.Aux = sym 7635 v.AddArg(ptr) 7636 v.AddArg(mem) 7637 return true 7638 } 7639 // match: (MOVFload [off1] {sym} (SUBconst [off2] ptr) mem) 7640 // cond: 7641 // result: (MOVFload [off1-off2] {sym} ptr mem) 7642 for { 7643 off1 := v.AuxInt 7644 sym := v.Aux 7645 _ = v.Args[1] 7646 v_0 := v.Args[0] 7647 if v_0.Op != OpARMSUBconst { 7648 break 7649 } 7650 off2 := v_0.AuxInt 7651 ptr := v_0.Args[0] 7652 mem := v.Args[1] 7653 v.reset(OpARMMOVFload) 7654 v.AuxInt = off1 - off2 7655 v.Aux = sym 7656 v.AddArg(ptr) 7657 v.AddArg(mem) 7658 return true 7659 } 7660 // match: (MOVFload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7661 // cond: canMergeSym(sym1,sym2) 7662 // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7663 for { 7664 off1 := v.AuxInt 7665 sym1 := v.Aux 7666 _ = v.Args[1] 7667 v_0 := v.Args[0] 7668 if v_0.Op != OpARMMOVWaddr { 7669 break 7670 } 7671 off2 := v_0.AuxInt 7672 sym2 := v_0.Aux 7673 ptr := v_0.Args[0] 7674 mem := v.Args[1] 7675 if !(canMergeSym(sym1, sym2)) { 7676 break 7677 } 7678 v.reset(OpARMMOVFload) 7679 v.AuxInt = off1 + off2 7680 v.Aux = mergeSym(sym1, sym2) 7681 v.AddArg(ptr) 7682 v.AddArg(mem) 7683 return true 7684 } 7685 // match: (MOVFload [off] {sym} ptr (MOVFstore [off2] {sym2} ptr2 x _)) 7686 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7687 // result: x 7688 for { 7689 off := v.AuxInt 7690 sym := v.Aux 7691 _ = v.Args[1] 7692 ptr := v.Args[0] 7693 v_1 := v.Args[1] 7694 if v_1.Op != OpARMMOVFstore { 7695 break 7696 } 7697 off2 := v_1.AuxInt 7698 sym2 := v_1.Aux 7699 _ = v_1.Args[2] 7700 ptr2 := v_1.Args[0] 7701 x := v_1.Args[1] 7702 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7703 break 7704 } 7705 v.reset(OpCopy) 7706 v.Type = x.Type 7707 v.AddArg(x) 7708 return true 7709 } 7710 return false 7711 } 7712 func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { 7713 // match: (MOVFstore [off1] {sym} (ADDconst [off2] ptr) val mem) 7714 // cond: 7715 // result: (MOVFstore [off1+off2] {sym} ptr val mem) 7716 for { 7717 off1 := v.AuxInt 7718 sym := v.Aux 7719 _ = v.Args[2] 7720 v_0 := v.Args[0] 7721 if v_0.Op != OpARMADDconst { 7722 break 7723 } 7724 off2 := v_0.AuxInt 7725 ptr := v_0.Args[0] 7726 val := v.Args[1] 7727 mem := v.Args[2] 7728 v.reset(OpARMMOVFstore) 7729 v.AuxInt = off1 + off2 7730 v.Aux = sym 7731 v.AddArg(ptr) 7732 v.AddArg(val) 7733 v.AddArg(mem) 7734 return true 7735 } 7736 // match: (MOVFstore [off1] {sym} (SUBconst [off2] ptr) val mem) 7737 // cond: 7738 // result: (MOVFstore [off1-off2] {sym} ptr val mem) 7739 for { 7740 off1 := v.AuxInt 7741 sym := v.Aux 7742 _ = v.Args[2] 7743 v_0 := v.Args[0] 7744 if v_0.Op != OpARMSUBconst { 7745 break 7746 } 7747 off2 := v_0.AuxInt 7748 ptr := v_0.Args[0] 7749 val := v.Args[1] 7750 mem := v.Args[2] 7751 v.reset(OpARMMOVFstore) 7752 v.AuxInt = off1 - off2 7753 v.Aux = sym 7754 v.AddArg(ptr) 7755 v.AddArg(val) 7756 v.AddArg(mem) 7757 return true 7758 } 7759 // match: (MOVFstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 7760 // cond: canMergeSym(sym1,sym2) 7761 // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 7762 for { 7763 off1 := v.AuxInt 7764 sym1 := v.Aux 7765 _ = v.Args[2] 7766 v_0 := v.Args[0] 7767 if v_0.Op != OpARMMOVWaddr { 7768 break 7769 } 7770 off2 := v_0.AuxInt 7771 sym2 := v_0.Aux 7772 ptr := v_0.Args[0] 7773 val := v.Args[1] 7774 mem := v.Args[2] 7775 if !(canMergeSym(sym1, sym2)) { 7776 break 7777 } 7778 v.reset(OpARMMOVFstore) 7779 v.AuxInt = off1 + off2 7780 v.Aux = mergeSym(sym1, sym2) 7781 v.AddArg(ptr) 7782 v.AddArg(val) 7783 v.AddArg(mem) 7784 return true 7785 } 7786 return false 7787 } 7788 func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { 7789 b := v.Block 7790 _ = b 7791 config := b.Func.Config 7792 _ = config 7793 // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) 7794 // cond: 7795 // result: (MOVHUload [off1+off2] {sym} ptr mem) 7796 for { 7797 off1 := v.AuxInt 7798 sym := v.Aux 7799 _ = v.Args[1] 7800 v_0 := v.Args[0] 7801 if v_0.Op != OpARMADDconst { 7802 break 7803 } 7804 off2 := v_0.AuxInt 7805 ptr := v_0.Args[0] 7806 mem := v.Args[1] 7807 v.reset(OpARMMOVHUload) 7808 v.AuxInt = off1 + off2 7809 v.Aux = sym 7810 v.AddArg(ptr) 7811 v.AddArg(mem) 7812 return true 7813 } 7814 // match: (MOVHUload [off1] {sym} (SUBconst [off2] ptr) mem) 7815 // cond: 7816 // result: (MOVHUload [off1-off2] {sym} ptr mem) 7817 for { 7818 off1 := v.AuxInt 7819 sym := v.Aux 7820 _ = v.Args[1] 7821 v_0 := v.Args[0] 7822 if v_0.Op != OpARMSUBconst { 7823 break 7824 } 7825 off2 := v_0.AuxInt 7826 ptr := v_0.Args[0] 7827 mem := v.Args[1] 7828 v.reset(OpARMMOVHUload) 7829 v.AuxInt = off1 - off2 7830 v.Aux = sym 7831 v.AddArg(ptr) 7832 v.AddArg(mem) 7833 return true 7834 } 7835 // match: (MOVHUload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 7836 // cond: canMergeSym(sym1,sym2) 7837 // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 7838 for { 7839 off1 := v.AuxInt 7840 sym1 := v.Aux 7841 _ = v.Args[1] 7842 v_0 := v.Args[0] 7843 if v_0.Op != OpARMMOVWaddr { 7844 break 7845 } 7846 off2 := v_0.AuxInt 7847 sym2 := v_0.Aux 7848 ptr := v_0.Args[0] 7849 mem := v.Args[1] 7850 if !(canMergeSym(sym1, sym2)) { 7851 break 7852 } 7853 v.reset(OpARMMOVHUload) 7854 v.AuxInt = off1 + off2 7855 v.Aux = mergeSym(sym1, sym2) 7856 v.AddArg(ptr) 7857 v.AddArg(mem) 7858 return true 7859 } 7860 // match: (MOVHUload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 7861 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 7862 // result: (MOVHUreg x) 7863 for { 7864 off := v.AuxInt 7865 sym := v.Aux 7866 _ = v.Args[1] 7867 ptr := v.Args[0] 7868 v_1 := v.Args[1] 7869 if v_1.Op != OpARMMOVHstore { 7870 break 7871 } 7872 off2 := v_1.AuxInt 7873 sym2 := v_1.Aux 7874 _ = v_1.Args[2] 7875 ptr2 := v_1.Args[0] 7876 x := v_1.Args[1] 7877 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 7878 break 7879 } 7880 v.reset(OpARMMOVHUreg) 7881 v.AddArg(x) 7882 return true 7883 } 7884 // match: (MOVHUload [0] {sym} (ADD ptr idx) mem) 7885 // cond: sym == nil && !config.nacl 7886 // result: (MOVHUloadidx ptr idx mem) 7887 for { 7888 if v.AuxInt != 0 { 7889 break 7890 } 7891 sym := v.Aux 7892 _ = v.Args[1] 7893 v_0 := v.Args[0] 7894 if v_0.Op != OpARMADD { 7895 break 7896 } 7897 _ = v_0.Args[1] 7898 ptr := v_0.Args[0] 7899 idx := v_0.Args[1] 7900 mem := v.Args[1] 7901 if !(sym == nil && !config.nacl) { 7902 break 7903 } 7904 v.reset(OpARMMOVHUloadidx) 7905 v.AddArg(ptr) 7906 v.AddArg(idx) 7907 v.AddArg(mem) 7908 return true 7909 } 7910 return false 7911 } 7912 func rewriteValueARM_OpARMMOVHUloadidx_0(v *Value) bool { 7913 // match: (MOVHUloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 7914 // cond: isSamePtr(ptr, ptr2) 7915 // result: (MOVHUreg x) 7916 for { 7917 _ = v.Args[2] 7918 ptr := v.Args[0] 7919 idx := v.Args[1] 7920 v_2 := v.Args[2] 7921 if v_2.Op != OpARMMOVHstoreidx { 7922 break 7923 } 7924 _ = v_2.Args[3] 7925 ptr2 := v_2.Args[0] 7926 if idx != v_2.Args[1] { 7927 break 7928 } 7929 x := v_2.Args[2] 7930 if !(isSamePtr(ptr, ptr2)) { 7931 break 7932 } 7933 v.reset(OpARMMOVHUreg) 7934 v.AddArg(x) 7935 return true 7936 } 7937 // match: (MOVHUloadidx ptr (MOVWconst [c]) mem) 7938 // cond: 7939 // result: (MOVHUload [c] ptr mem) 7940 for { 7941 _ = v.Args[2] 7942 ptr := v.Args[0] 7943 v_1 := v.Args[1] 7944 if v_1.Op != OpARMMOVWconst { 7945 break 7946 } 7947 c := v_1.AuxInt 7948 mem := v.Args[2] 7949 v.reset(OpARMMOVHUload) 7950 v.AuxInt = c 7951 v.AddArg(ptr) 7952 v.AddArg(mem) 7953 return true 7954 } 7955 // match: (MOVHUloadidx (MOVWconst [c]) ptr mem) 7956 // cond: 7957 // result: (MOVHUload [c] ptr mem) 7958 for { 7959 _ = v.Args[2] 7960 v_0 := v.Args[0] 7961 if v_0.Op != OpARMMOVWconst { 7962 break 7963 } 7964 c := v_0.AuxInt 7965 ptr := v.Args[1] 7966 mem := v.Args[2] 7967 v.reset(OpARMMOVHUload) 7968 v.AuxInt = c 7969 v.AddArg(ptr) 7970 v.AddArg(mem) 7971 return true 7972 } 7973 return false 7974 } 7975 func rewriteValueARM_OpARMMOVHUreg_0(v *Value) bool { 7976 // match: (MOVHUreg x:(MOVBUload _ _)) 7977 // cond: 7978 // result: (MOVWreg x) 7979 for { 7980 x := v.Args[0] 7981 if x.Op != OpARMMOVBUload { 7982 break 7983 } 7984 _ = x.Args[1] 7985 v.reset(OpARMMOVWreg) 7986 v.AddArg(x) 7987 return true 7988 } 7989 // match: (MOVHUreg x:(MOVHUload _ _)) 7990 // cond: 7991 // result: (MOVWreg x) 7992 for { 7993 x := v.Args[0] 7994 if x.Op != OpARMMOVHUload { 7995 break 7996 } 7997 _ = x.Args[1] 7998 v.reset(OpARMMOVWreg) 7999 v.AddArg(x) 8000 return true 8001 } 8002 // match: (MOVHUreg (ANDconst [c] x)) 8003 // cond: 8004 // result: (ANDconst [c&0xffff] x) 8005 for { 8006 v_0 := v.Args[0] 8007 if v_0.Op != OpARMANDconst { 8008 break 8009 } 8010 c := v_0.AuxInt 8011 x := v_0.Args[0] 8012 v.reset(OpARMANDconst) 8013 v.AuxInt = c & 0xffff 8014 v.AddArg(x) 8015 return true 8016 } 8017 // match: (MOVHUreg x:(MOVBUreg _)) 8018 // cond: 8019 // result: (MOVWreg x) 8020 for { 8021 x := v.Args[0] 8022 if x.Op != OpARMMOVBUreg { 8023 break 8024 } 8025 v.reset(OpARMMOVWreg) 8026 v.AddArg(x) 8027 return true 8028 } 8029 // match: (MOVHUreg x:(MOVHUreg _)) 8030 // cond: 8031 // result: (MOVWreg x) 8032 for { 8033 x := v.Args[0] 8034 if x.Op != OpARMMOVHUreg { 8035 break 8036 } 8037 v.reset(OpARMMOVWreg) 8038 v.AddArg(x) 8039 return true 8040 } 8041 // match: (MOVHUreg (MOVWconst [c])) 8042 // cond: 8043 // result: (MOVWconst [int64(uint16(c))]) 8044 for { 8045 v_0 := v.Args[0] 8046 if v_0.Op != OpARMMOVWconst { 8047 break 8048 } 8049 c := v_0.AuxInt 8050 v.reset(OpARMMOVWconst) 8051 v.AuxInt = int64(uint16(c)) 8052 return true 8053 } 8054 return false 8055 } 8056 func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { 8057 b := v.Block 8058 _ = b 8059 config := b.Func.Config 8060 _ = config 8061 // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) 8062 // cond: 8063 // result: (MOVHload [off1+off2] {sym} ptr mem) 8064 for { 8065 off1 := v.AuxInt 8066 sym := v.Aux 8067 _ = v.Args[1] 8068 v_0 := v.Args[0] 8069 if v_0.Op != OpARMADDconst { 8070 break 8071 } 8072 off2 := v_0.AuxInt 8073 ptr := v_0.Args[0] 8074 mem := v.Args[1] 8075 v.reset(OpARMMOVHload) 8076 v.AuxInt = off1 + off2 8077 v.Aux = sym 8078 v.AddArg(ptr) 8079 v.AddArg(mem) 8080 return true 8081 } 8082 // match: (MOVHload [off1] {sym} (SUBconst [off2] ptr) mem) 8083 // cond: 8084 // result: (MOVHload [off1-off2] {sym} ptr mem) 8085 for { 8086 off1 := v.AuxInt 8087 sym := v.Aux 8088 _ = v.Args[1] 8089 v_0 := v.Args[0] 8090 if v_0.Op != OpARMSUBconst { 8091 break 8092 } 8093 off2 := v_0.AuxInt 8094 ptr := v_0.Args[0] 8095 mem := v.Args[1] 8096 v.reset(OpARMMOVHload) 8097 v.AuxInt = off1 - off2 8098 v.Aux = sym 8099 v.AddArg(ptr) 8100 v.AddArg(mem) 8101 return true 8102 } 8103 // match: (MOVHload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 8104 // cond: canMergeSym(sym1,sym2) 8105 // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 8106 for { 8107 off1 := v.AuxInt 8108 sym1 := v.Aux 8109 _ = v.Args[1] 8110 v_0 := v.Args[0] 8111 if v_0.Op != OpARMMOVWaddr { 8112 break 8113 } 8114 off2 := v_0.AuxInt 8115 sym2 := v_0.Aux 8116 ptr := v_0.Args[0] 8117 mem := v.Args[1] 8118 if !(canMergeSym(sym1, sym2)) { 8119 break 8120 } 8121 v.reset(OpARMMOVHload) 8122 v.AuxInt = off1 + off2 8123 v.Aux = mergeSym(sym1, sym2) 8124 v.AddArg(ptr) 8125 v.AddArg(mem) 8126 return true 8127 } 8128 // match: (MOVHload [off] {sym} ptr (MOVHstore [off2] {sym2} ptr2 x _)) 8129 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8130 // result: (MOVHreg x) 8131 for { 8132 off := v.AuxInt 8133 sym := v.Aux 8134 _ = v.Args[1] 8135 ptr := v.Args[0] 8136 v_1 := v.Args[1] 8137 if v_1.Op != OpARMMOVHstore { 8138 break 8139 } 8140 off2 := v_1.AuxInt 8141 sym2 := v_1.Aux 8142 _ = v_1.Args[2] 8143 ptr2 := v_1.Args[0] 8144 x := v_1.Args[1] 8145 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8146 break 8147 } 8148 v.reset(OpARMMOVHreg) 8149 v.AddArg(x) 8150 return true 8151 } 8152 // match: (MOVHload [0] {sym} (ADD ptr idx) mem) 8153 // cond: sym == nil && !config.nacl 8154 // result: (MOVHloadidx ptr idx mem) 8155 for { 8156 if v.AuxInt != 0 { 8157 break 8158 } 8159 sym := v.Aux 8160 _ = v.Args[1] 8161 v_0 := v.Args[0] 8162 if v_0.Op != OpARMADD { 8163 break 8164 } 8165 _ = v_0.Args[1] 8166 ptr := v_0.Args[0] 8167 idx := v_0.Args[1] 8168 mem := v.Args[1] 8169 if !(sym == nil && !config.nacl) { 8170 break 8171 } 8172 v.reset(OpARMMOVHloadidx) 8173 v.AddArg(ptr) 8174 v.AddArg(idx) 8175 v.AddArg(mem) 8176 return true 8177 } 8178 return false 8179 } 8180 func rewriteValueARM_OpARMMOVHloadidx_0(v *Value) bool { 8181 // match: (MOVHloadidx ptr idx (MOVHstoreidx ptr2 idx x _)) 8182 // cond: isSamePtr(ptr, ptr2) 8183 // result: (MOVHreg x) 8184 for { 8185 _ = v.Args[2] 8186 ptr := v.Args[0] 8187 idx := v.Args[1] 8188 v_2 := v.Args[2] 8189 if v_2.Op != OpARMMOVHstoreidx { 8190 break 8191 } 8192 _ = v_2.Args[3] 8193 ptr2 := v_2.Args[0] 8194 if idx != v_2.Args[1] { 8195 break 8196 } 8197 x := v_2.Args[2] 8198 if !(isSamePtr(ptr, ptr2)) { 8199 break 8200 } 8201 v.reset(OpARMMOVHreg) 8202 v.AddArg(x) 8203 return true 8204 } 8205 // match: (MOVHloadidx ptr (MOVWconst [c]) mem) 8206 // cond: 8207 // result: (MOVHload [c] ptr mem) 8208 for { 8209 _ = v.Args[2] 8210 ptr := v.Args[0] 8211 v_1 := v.Args[1] 8212 if v_1.Op != OpARMMOVWconst { 8213 break 8214 } 8215 c := v_1.AuxInt 8216 mem := v.Args[2] 8217 v.reset(OpARMMOVHload) 8218 v.AuxInt = c 8219 v.AddArg(ptr) 8220 v.AddArg(mem) 8221 return true 8222 } 8223 // match: (MOVHloadidx (MOVWconst [c]) ptr mem) 8224 // cond: 8225 // result: (MOVHload [c] ptr mem) 8226 for { 8227 _ = v.Args[2] 8228 v_0 := v.Args[0] 8229 if v_0.Op != OpARMMOVWconst { 8230 break 8231 } 8232 c := v_0.AuxInt 8233 ptr := v.Args[1] 8234 mem := v.Args[2] 8235 v.reset(OpARMMOVHload) 8236 v.AuxInt = c 8237 v.AddArg(ptr) 8238 v.AddArg(mem) 8239 return true 8240 } 8241 return false 8242 } 8243 func rewriteValueARM_OpARMMOVHreg_0(v *Value) bool { 8244 // match: (MOVHreg x:(MOVBload _ _)) 8245 // cond: 8246 // result: (MOVWreg x) 8247 for { 8248 x := v.Args[0] 8249 if x.Op != OpARMMOVBload { 8250 break 8251 } 8252 _ = x.Args[1] 8253 v.reset(OpARMMOVWreg) 8254 v.AddArg(x) 8255 return true 8256 } 8257 // match: (MOVHreg x:(MOVBUload _ _)) 8258 // cond: 8259 // result: (MOVWreg x) 8260 for { 8261 x := v.Args[0] 8262 if x.Op != OpARMMOVBUload { 8263 break 8264 } 8265 _ = x.Args[1] 8266 v.reset(OpARMMOVWreg) 8267 v.AddArg(x) 8268 return true 8269 } 8270 // match: (MOVHreg x:(MOVHload _ _)) 8271 // cond: 8272 // result: (MOVWreg x) 8273 for { 8274 x := v.Args[0] 8275 if x.Op != OpARMMOVHload { 8276 break 8277 } 8278 _ = x.Args[1] 8279 v.reset(OpARMMOVWreg) 8280 v.AddArg(x) 8281 return true 8282 } 8283 // match: (MOVHreg (ANDconst [c] x)) 8284 // cond: c & 0x8000 == 0 8285 // result: (ANDconst [c&0x7fff] x) 8286 for { 8287 v_0 := v.Args[0] 8288 if v_0.Op != OpARMANDconst { 8289 break 8290 } 8291 c := v_0.AuxInt 8292 x := v_0.Args[0] 8293 if !(c&0x8000 == 0) { 8294 break 8295 } 8296 v.reset(OpARMANDconst) 8297 v.AuxInt = c & 0x7fff 8298 v.AddArg(x) 8299 return true 8300 } 8301 // match: (MOVHreg x:(MOVBreg _)) 8302 // cond: 8303 // result: (MOVWreg x) 8304 for { 8305 x := v.Args[0] 8306 if x.Op != OpARMMOVBreg { 8307 break 8308 } 8309 v.reset(OpARMMOVWreg) 8310 v.AddArg(x) 8311 return true 8312 } 8313 // match: (MOVHreg x:(MOVBUreg _)) 8314 // cond: 8315 // result: (MOVWreg x) 8316 for { 8317 x := v.Args[0] 8318 if x.Op != OpARMMOVBUreg { 8319 break 8320 } 8321 v.reset(OpARMMOVWreg) 8322 v.AddArg(x) 8323 return true 8324 } 8325 // match: (MOVHreg x:(MOVHreg _)) 8326 // cond: 8327 // result: (MOVWreg x) 8328 for { 8329 x := v.Args[0] 8330 if x.Op != OpARMMOVHreg { 8331 break 8332 } 8333 v.reset(OpARMMOVWreg) 8334 v.AddArg(x) 8335 return true 8336 } 8337 // match: (MOVHreg (MOVWconst [c])) 8338 // cond: 8339 // result: (MOVWconst [int64(int16(c))]) 8340 for { 8341 v_0 := v.Args[0] 8342 if v_0.Op != OpARMMOVWconst { 8343 break 8344 } 8345 c := v_0.AuxInt 8346 v.reset(OpARMMOVWconst) 8347 v.AuxInt = int64(int16(c)) 8348 return true 8349 } 8350 return false 8351 } 8352 func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { 8353 b := v.Block 8354 _ = b 8355 config := b.Func.Config 8356 _ = config 8357 // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) 8358 // cond: 8359 // result: (MOVHstore [off1+off2] {sym} ptr val mem) 8360 for { 8361 off1 := v.AuxInt 8362 sym := v.Aux 8363 _ = v.Args[2] 8364 v_0 := v.Args[0] 8365 if v_0.Op != OpARMADDconst { 8366 break 8367 } 8368 off2 := v_0.AuxInt 8369 ptr := v_0.Args[0] 8370 val := v.Args[1] 8371 mem := v.Args[2] 8372 v.reset(OpARMMOVHstore) 8373 v.AuxInt = off1 + off2 8374 v.Aux = sym 8375 v.AddArg(ptr) 8376 v.AddArg(val) 8377 v.AddArg(mem) 8378 return true 8379 } 8380 // match: (MOVHstore [off1] {sym} (SUBconst [off2] ptr) val mem) 8381 // cond: 8382 // result: (MOVHstore [off1-off2] {sym} ptr val mem) 8383 for { 8384 off1 := v.AuxInt 8385 sym := v.Aux 8386 _ = v.Args[2] 8387 v_0 := v.Args[0] 8388 if v_0.Op != OpARMSUBconst { 8389 break 8390 } 8391 off2 := v_0.AuxInt 8392 ptr := v_0.Args[0] 8393 val := v.Args[1] 8394 mem := v.Args[2] 8395 v.reset(OpARMMOVHstore) 8396 v.AuxInt = off1 - off2 8397 v.Aux = sym 8398 v.AddArg(ptr) 8399 v.AddArg(val) 8400 v.AddArg(mem) 8401 return true 8402 } 8403 // match: (MOVHstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 8404 // cond: canMergeSym(sym1,sym2) 8405 // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 8406 for { 8407 off1 := v.AuxInt 8408 sym1 := v.Aux 8409 _ = v.Args[2] 8410 v_0 := v.Args[0] 8411 if v_0.Op != OpARMMOVWaddr { 8412 break 8413 } 8414 off2 := v_0.AuxInt 8415 sym2 := v_0.Aux 8416 ptr := v_0.Args[0] 8417 val := v.Args[1] 8418 mem := v.Args[2] 8419 if !(canMergeSym(sym1, sym2)) { 8420 break 8421 } 8422 v.reset(OpARMMOVHstore) 8423 v.AuxInt = off1 + off2 8424 v.Aux = mergeSym(sym1, sym2) 8425 v.AddArg(ptr) 8426 v.AddArg(val) 8427 v.AddArg(mem) 8428 return true 8429 } 8430 // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) 8431 // cond: 8432 // result: (MOVHstore [off] {sym} ptr x mem) 8433 for { 8434 off := v.AuxInt 8435 sym := v.Aux 8436 _ = v.Args[2] 8437 ptr := v.Args[0] 8438 v_1 := v.Args[1] 8439 if v_1.Op != OpARMMOVHreg { 8440 break 8441 } 8442 x := v_1.Args[0] 8443 mem := v.Args[2] 8444 v.reset(OpARMMOVHstore) 8445 v.AuxInt = off 8446 v.Aux = sym 8447 v.AddArg(ptr) 8448 v.AddArg(x) 8449 v.AddArg(mem) 8450 return true 8451 } 8452 // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) 8453 // cond: 8454 // result: (MOVHstore [off] {sym} ptr x mem) 8455 for { 8456 off := v.AuxInt 8457 sym := v.Aux 8458 _ = v.Args[2] 8459 ptr := v.Args[0] 8460 v_1 := v.Args[1] 8461 if v_1.Op != OpARMMOVHUreg { 8462 break 8463 } 8464 x := v_1.Args[0] 8465 mem := v.Args[2] 8466 v.reset(OpARMMOVHstore) 8467 v.AuxInt = off 8468 v.Aux = sym 8469 v.AddArg(ptr) 8470 v.AddArg(x) 8471 v.AddArg(mem) 8472 return true 8473 } 8474 // match: (MOVHstore [0] {sym} (ADD ptr idx) val mem) 8475 // cond: sym == nil && !config.nacl 8476 // result: (MOVHstoreidx ptr idx val mem) 8477 for { 8478 if v.AuxInt != 0 { 8479 break 8480 } 8481 sym := v.Aux 8482 _ = v.Args[2] 8483 v_0 := v.Args[0] 8484 if v_0.Op != OpARMADD { 8485 break 8486 } 8487 _ = v_0.Args[1] 8488 ptr := v_0.Args[0] 8489 idx := v_0.Args[1] 8490 val := v.Args[1] 8491 mem := v.Args[2] 8492 if !(sym == nil && !config.nacl) { 8493 break 8494 } 8495 v.reset(OpARMMOVHstoreidx) 8496 v.AddArg(ptr) 8497 v.AddArg(idx) 8498 v.AddArg(val) 8499 v.AddArg(mem) 8500 return true 8501 } 8502 return false 8503 } 8504 func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { 8505 // match: (MOVHstoreidx ptr (MOVWconst [c]) val mem) 8506 // cond: 8507 // result: (MOVHstore [c] ptr val mem) 8508 for { 8509 _ = v.Args[3] 8510 ptr := v.Args[0] 8511 v_1 := v.Args[1] 8512 if v_1.Op != OpARMMOVWconst { 8513 break 8514 } 8515 c := v_1.AuxInt 8516 val := v.Args[2] 8517 mem := v.Args[3] 8518 v.reset(OpARMMOVHstore) 8519 v.AuxInt = c 8520 v.AddArg(ptr) 8521 v.AddArg(val) 8522 v.AddArg(mem) 8523 return true 8524 } 8525 // match: (MOVHstoreidx (MOVWconst [c]) ptr val mem) 8526 // cond: 8527 // result: (MOVHstore [c] ptr val mem) 8528 for { 8529 _ = v.Args[3] 8530 v_0 := v.Args[0] 8531 if v_0.Op != OpARMMOVWconst { 8532 break 8533 } 8534 c := v_0.AuxInt 8535 ptr := v.Args[1] 8536 val := v.Args[2] 8537 mem := v.Args[3] 8538 v.reset(OpARMMOVHstore) 8539 v.AuxInt = c 8540 v.AddArg(ptr) 8541 v.AddArg(val) 8542 v.AddArg(mem) 8543 return true 8544 } 8545 return false 8546 } 8547 func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { 8548 b := v.Block 8549 _ = b 8550 config := b.Func.Config 8551 _ = config 8552 // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) 8553 // cond: 8554 // result: (MOVWload [off1+off2] {sym} ptr mem) 8555 for { 8556 off1 := v.AuxInt 8557 sym := v.Aux 8558 _ = v.Args[1] 8559 v_0 := v.Args[0] 8560 if v_0.Op != OpARMADDconst { 8561 break 8562 } 8563 off2 := v_0.AuxInt 8564 ptr := v_0.Args[0] 8565 mem := v.Args[1] 8566 v.reset(OpARMMOVWload) 8567 v.AuxInt = off1 + off2 8568 v.Aux = sym 8569 v.AddArg(ptr) 8570 v.AddArg(mem) 8571 return true 8572 } 8573 // match: (MOVWload [off1] {sym} (SUBconst [off2] ptr) mem) 8574 // cond: 8575 // result: (MOVWload [off1-off2] {sym} ptr mem) 8576 for { 8577 off1 := v.AuxInt 8578 sym := v.Aux 8579 _ = v.Args[1] 8580 v_0 := v.Args[0] 8581 if v_0.Op != OpARMSUBconst { 8582 break 8583 } 8584 off2 := v_0.AuxInt 8585 ptr := v_0.Args[0] 8586 mem := v.Args[1] 8587 v.reset(OpARMMOVWload) 8588 v.AuxInt = off1 - off2 8589 v.Aux = sym 8590 v.AddArg(ptr) 8591 v.AddArg(mem) 8592 return true 8593 } 8594 // match: (MOVWload [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) mem) 8595 // cond: canMergeSym(sym1,sym2) 8596 // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) 8597 for { 8598 off1 := v.AuxInt 8599 sym1 := v.Aux 8600 _ = v.Args[1] 8601 v_0 := v.Args[0] 8602 if v_0.Op != OpARMMOVWaddr { 8603 break 8604 } 8605 off2 := v_0.AuxInt 8606 sym2 := v_0.Aux 8607 ptr := v_0.Args[0] 8608 mem := v.Args[1] 8609 if !(canMergeSym(sym1, sym2)) { 8610 break 8611 } 8612 v.reset(OpARMMOVWload) 8613 v.AuxInt = off1 + off2 8614 v.Aux = mergeSym(sym1, sym2) 8615 v.AddArg(ptr) 8616 v.AddArg(mem) 8617 return true 8618 } 8619 // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) 8620 // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) 8621 // result: x 8622 for { 8623 off := v.AuxInt 8624 sym := v.Aux 8625 _ = v.Args[1] 8626 ptr := v.Args[0] 8627 v_1 := v.Args[1] 8628 if v_1.Op != OpARMMOVWstore { 8629 break 8630 } 8631 off2 := v_1.AuxInt 8632 sym2 := v_1.Aux 8633 _ = v_1.Args[2] 8634 ptr2 := v_1.Args[0] 8635 x := v_1.Args[1] 8636 if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { 8637 break 8638 } 8639 v.reset(OpCopy) 8640 v.Type = x.Type 8641 v.AddArg(x) 8642 return true 8643 } 8644 // match: (MOVWload [0] {sym} (ADD ptr idx) mem) 8645 // cond: sym == nil && !config.nacl 8646 // result: (MOVWloadidx ptr idx mem) 8647 for { 8648 if v.AuxInt != 0 { 8649 break 8650 } 8651 sym := v.Aux 8652 _ = v.Args[1] 8653 v_0 := v.Args[0] 8654 if v_0.Op != OpARMADD { 8655 break 8656 } 8657 _ = v_0.Args[1] 8658 ptr := v_0.Args[0] 8659 idx := v_0.Args[1] 8660 mem := v.Args[1] 8661 if !(sym == nil && !config.nacl) { 8662 break 8663 } 8664 v.reset(OpARMMOVWloadidx) 8665 v.AddArg(ptr) 8666 v.AddArg(idx) 8667 v.AddArg(mem) 8668 return true 8669 } 8670 // match: (MOVWload [0] {sym} (ADDshiftLL ptr idx [c]) mem) 8671 // cond: sym == nil && !config.nacl 8672 // result: (MOVWloadshiftLL ptr idx [c] mem) 8673 for { 8674 if v.AuxInt != 0 { 8675 break 8676 } 8677 sym := v.Aux 8678 _ = v.Args[1] 8679 v_0 := v.Args[0] 8680 if v_0.Op != OpARMADDshiftLL { 8681 break 8682 } 8683 c := v_0.AuxInt 8684 _ = v_0.Args[1] 8685 ptr := v_0.Args[0] 8686 idx := v_0.Args[1] 8687 mem := v.Args[1] 8688 if !(sym == nil && !config.nacl) { 8689 break 8690 } 8691 v.reset(OpARMMOVWloadshiftLL) 8692 v.AuxInt = c 8693 v.AddArg(ptr) 8694 v.AddArg(idx) 8695 v.AddArg(mem) 8696 return true 8697 } 8698 // match: (MOVWload [0] {sym} (ADDshiftRL ptr idx [c]) mem) 8699 // cond: sym == nil && !config.nacl 8700 // result: (MOVWloadshiftRL ptr idx [c] mem) 8701 for { 8702 if v.AuxInt != 0 { 8703 break 8704 } 8705 sym := v.Aux 8706 _ = v.Args[1] 8707 v_0 := v.Args[0] 8708 if v_0.Op != OpARMADDshiftRL { 8709 break 8710 } 8711 c := v_0.AuxInt 8712 _ = v_0.Args[1] 8713 ptr := v_0.Args[0] 8714 idx := v_0.Args[1] 8715 mem := v.Args[1] 8716 if !(sym == nil && !config.nacl) { 8717 break 8718 } 8719 v.reset(OpARMMOVWloadshiftRL) 8720 v.AuxInt = c 8721 v.AddArg(ptr) 8722 v.AddArg(idx) 8723 v.AddArg(mem) 8724 return true 8725 } 8726 // match: (MOVWload [0] {sym} (ADDshiftRA ptr idx [c]) mem) 8727 // cond: sym == nil && !config.nacl 8728 // result: (MOVWloadshiftRA ptr idx [c] 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 != OpARMADDshiftRA { 8737 break 8738 } 8739 c := v_0.AuxInt 8740 _ = v_0.Args[1] 8741 ptr := v_0.Args[0] 8742 idx := v_0.Args[1] 8743 mem := v.Args[1] 8744 if !(sym == nil && !config.nacl) { 8745 break 8746 } 8747 v.reset(OpARMMOVWloadshiftRA) 8748 v.AuxInt = c 8749 v.AddArg(ptr) 8750 v.AddArg(idx) 8751 v.AddArg(mem) 8752 return true 8753 } 8754 return false 8755 } 8756 func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { 8757 // match: (MOVWloadidx ptr idx (MOVWstoreidx ptr2 idx x _)) 8758 // cond: isSamePtr(ptr, ptr2) 8759 // result: x 8760 for { 8761 _ = v.Args[2] 8762 ptr := v.Args[0] 8763 idx := v.Args[1] 8764 v_2 := v.Args[2] 8765 if v_2.Op != OpARMMOVWstoreidx { 8766 break 8767 } 8768 _ = v_2.Args[3] 8769 ptr2 := v_2.Args[0] 8770 if idx != v_2.Args[1] { 8771 break 8772 } 8773 x := v_2.Args[2] 8774 if !(isSamePtr(ptr, ptr2)) { 8775 break 8776 } 8777 v.reset(OpCopy) 8778 v.Type = x.Type 8779 v.AddArg(x) 8780 return true 8781 } 8782 // match: (MOVWloadidx ptr (MOVWconst [c]) mem) 8783 // cond: 8784 // result: (MOVWload [c] ptr mem) 8785 for { 8786 _ = v.Args[2] 8787 ptr := v.Args[0] 8788 v_1 := v.Args[1] 8789 if v_1.Op != OpARMMOVWconst { 8790 break 8791 } 8792 c := v_1.AuxInt 8793 mem := v.Args[2] 8794 v.reset(OpARMMOVWload) 8795 v.AuxInt = c 8796 v.AddArg(ptr) 8797 v.AddArg(mem) 8798 return true 8799 } 8800 // match: (MOVWloadidx (MOVWconst [c]) ptr mem) 8801 // cond: 8802 // result: (MOVWload [c] ptr mem) 8803 for { 8804 _ = v.Args[2] 8805 v_0 := v.Args[0] 8806 if v_0.Op != OpARMMOVWconst { 8807 break 8808 } 8809 c := v_0.AuxInt 8810 ptr := v.Args[1] 8811 mem := v.Args[2] 8812 v.reset(OpARMMOVWload) 8813 v.AuxInt = c 8814 v.AddArg(ptr) 8815 v.AddArg(mem) 8816 return true 8817 } 8818 // match: (MOVWloadidx ptr (SLLconst idx [c]) mem) 8819 // cond: 8820 // result: (MOVWloadshiftLL ptr idx [c] mem) 8821 for { 8822 _ = v.Args[2] 8823 ptr := v.Args[0] 8824 v_1 := v.Args[1] 8825 if v_1.Op != OpARMSLLconst { 8826 break 8827 } 8828 c := v_1.AuxInt 8829 idx := v_1.Args[0] 8830 mem := v.Args[2] 8831 v.reset(OpARMMOVWloadshiftLL) 8832 v.AuxInt = c 8833 v.AddArg(ptr) 8834 v.AddArg(idx) 8835 v.AddArg(mem) 8836 return true 8837 } 8838 // match: (MOVWloadidx (SLLconst idx [c]) ptr mem) 8839 // cond: 8840 // result: (MOVWloadshiftLL ptr idx [c] mem) 8841 for { 8842 _ = v.Args[2] 8843 v_0 := v.Args[0] 8844 if v_0.Op != OpARMSLLconst { 8845 break 8846 } 8847 c := v_0.AuxInt 8848 idx := v_0.Args[0] 8849 ptr := v.Args[1] 8850 mem := v.Args[2] 8851 v.reset(OpARMMOVWloadshiftLL) 8852 v.AuxInt = c 8853 v.AddArg(ptr) 8854 v.AddArg(idx) 8855 v.AddArg(mem) 8856 return true 8857 } 8858 // match: (MOVWloadidx ptr (SRLconst idx [c]) mem) 8859 // cond: 8860 // result: (MOVWloadshiftRL ptr idx [c] mem) 8861 for { 8862 _ = v.Args[2] 8863 ptr := v.Args[0] 8864 v_1 := v.Args[1] 8865 if v_1.Op != OpARMSRLconst { 8866 break 8867 } 8868 c := v_1.AuxInt 8869 idx := v_1.Args[0] 8870 mem := v.Args[2] 8871 v.reset(OpARMMOVWloadshiftRL) 8872 v.AuxInt = c 8873 v.AddArg(ptr) 8874 v.AddArg(idx) 8875 v.AddArg(mem) 8876 return true 8877 } 8878 // match: (MOVWloadidx (SRLconst idx [c]) ptr mem) 8879 // cond: 8880 // result: (MOVWloadshiftRL ptr idx [c] mem) 8881 for { 8882 _ = v.Args[2] 8883 v_0 := v.Args[0] 8884 if v_0.Op != OpARMSRLconst { 8885 break 8886 } 8887 c := v_0.AuxInt 8888 idx := v_0.Args[0] 8889 ptr := v.Args[1] 8890 mem := v.Args[2] 8891 v.reset(OpARMMOVWloadshiftRL) 8892 v.AuxInt = c 8893 v.AddArg(ptr) 8894 v.AddArg(idx) 8895 v.AddArg(mem) 8896 return true 8897 } 8898 // match: (MOVWloadidx ptr (SRAconst idx [c]) mem) 8899 // cond: 8900 // result: (MOVWloadshiftRA ptr idx [c] mem) 8901 for { 8902 _ = v.Args[2] 8903 ptr := v.Args[0] 8904 v_1 := v.Args[1] 8905 if v_1.Op != OpARMSRAconst { 8906 break 8907 } 8908 c := v_1.AuxInt 8909 idx := v_1.Args[0] 8910 mem := v.Args[2] 8911 v.reset(OpARMMOVWloadshiftRA) 8912 v.AuxInt = c 8913 v.AddArg(ptr) 8914 v.AddArg(idx) 8915 v.AddArg(mem) 8916 return true 8917 } 8918 // match: (MOVWloadidx (SRAconst idx [c]) ptr mem) 8919 // cond: 8920 // result: (MOVWloadshiftRA ptr idx [c] mem) 8921 for { 8922 _ = v.Args[2] 8923 v_0 := v.Args[0] 8924 if v_0.Op != OpARMSRAconst { 8925 break 8926 } 8927 c := v_0.AuxInt 8928 idx := v_0.Args[0] 8929 ptr := v.Args[1] 8930 mem := v.Args[2] 8931 v.reset(OpARMMOVWloadshiftRA) 8932 v.AuxInt = c 8933 v.AddArg(ptr) 8934 v.AddArg(idx) 8935 v.AddArg(mem) 8936 return true 8937 } 8938 return false 8939 } 8940 func rewriteValueARM_OpARMMOVWloadshiftLL_0(v *Value) bool { 8941 // match: (MOVWloadshiftLL ptr idx [c] (MOVWstoreshiftLL ptr2 idx [d] x _)) 8942 // cond: c==d && isSamePtr(ptr, ptr2) 8943 // result: x 8944 for { 8945 c := v.AuxInt 8946 _ = v.Args[2] 8947 ptr := v.Args[0] 8948 idx := v.Args[1] 8949 v_2 := v.Args[2] 8950 if v_2.Op != OpARMMOVWstoreshiftLL { 8951 break 8952 } 8953 d := v_2.AuxInt 8954 _ = v_2.Args[3] 8955 ptr2 := v_2.Args[0] 8956 if idx != v_2.Args[1] { 8957 break 8958 } 8959 x := v_2.Args[2] 8960 if !(c == d && isSamePtr(ptr, ptr2)) { 8961 break 8962 } 8963 v.reset(OpCopy) 8964 v.Type = x.Type 8965 v.AddArg(x) 8966 return true 8967 } 8968 // match: (MOVWloadshiftLL ptr (MOVWconst [c]) [d] mem) 8969 // cond: 8970 // result: (MOVWload [int64(uint32(c)<<uint64(d))] ptr mem) 8971 for { 8972 d := v.AuxInt 8973 _ = v.Args[2] 8974 ptr := v.Args[0] 8975 v_1 := v.Args[1] 8976 if v_1.Op != OpARMMOVWconst { 8977 break 8978 } 8979 c := v_1.AuxInt 8980 mem := v.Args[2] 8981 v.reset(OpARMMOVWload) 8982 v.AuxInt = int64(uint32(c) << uint64(d)) 8983 v.AddArg(ptr) 8984 v.AddArg(mem) 8985 return true 8986 } 8987 return false 8988 } 8989 func rewriteValueARM_OpARMMOVWloadshiftRA_0(v *Value) bool { 8990 // match: (MOVWloadshiftRA ptr idx [c] (MOVWstoreshiftRA ptr2 idx [d] x _)) 8991 // cond: c==d && isSamePtr(ptr, ptr2) 8992 // result: x 8993 for { 8994 c := v.AuxInt 8995 _ = v.Args[2] 8996 ptr := v.Args[0] 8997 idx := v.Args[1] 8998 v_2 := v.Args[2] 8999 if v_2.Op != OpARMMOVWstoreshiftRA { 9000 break 9001 } 9002 d := v_2.AuxInt 9003 _ = v_2.Args[3] 9004 ptr2 := v_2.Args[0] 9005 if idx != v_2.Args[1] { 9006 break 9007 } 9008 x := v_2.Args[2] 9009 if !(c == d && isSamePtr(ptr, ptr2)) { 9010 break 9011 } 9012 v.reset(OpCopy) 9013 v.Type = x.Type 9014 v.AddArg(x) 9015 return true 9016 } 9017 // match: (MOVWloadshiftRA ptr (MOVWconst [c]) [d] mem) 9018 // cond: 9019 // result: (MOVWload [int64(int32(c)>>uint64(d))] ptr mem) 9020 for { 9021 d := v.AuxInt 9022 _ = v.Args[2] 9023 ptr := v.Args[0] 9024 v_1 := v.Args[1] 9025 if v_1.Op != OpARMMOVWconst { 9026 break 9027 } 9028 c := v_1.AuxInt 9029 mem := v.Args[2] 9030 v.reset(OpARMMOVWload) 9031 v.AuxInt = int64(int32(c) >> uint64(d)) 9032 v.AddArg(ptr) 9033 v.AddArg(mem) 9034 return true 9035 } 9036 return false 9037 } 9038 func rewriteValueARM_OpARMMOVWloadshiftRL_0(v *Value) bool { 9039 // match: (MOVWloadshiftRL ptr idx [c] (MOVWstoreshiftRL ptr2 idx [d] x _)) 9040 // cond: c==d && isSamePtr(ptr, ptr2) 9041 // result: x 9042 for { 9043 c := v.AuxInt 9044 _ = v.Args[2] 9045 ptr := v.Args[0] 9046 idx := v.Args[1] 9047 v_2 := v.Args[2] 9048 if v_2.Op != OpARMMOVWstoreshiftRL { 9049 break 9050 } 9051 d := v_2.AuxInt 9052 _ = v_2.Args[3] 9053 ptr2 := v_2.Args[0] 9054 if idx != v_2.Args[1] { 9055 break 9056 } 9057 x := v_2.Args[2] 9058 if !(c == d && isSamePtr(ptr, ptr2)) { 9059 break 9060 } 9061 v.reset(OpCopy) 9062 v.Type = x.Type 9063 v.AddArg(x) 9064 return true 9065 } 9066 // match: (MOVWloadshiftRL ptr (MOVWconst [c]) [d] mem) 9067 // cond: 9068 // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) 9069 for { 9070 d := v.AuxInt 9071 _ = v.Args[2] 9072 ptr := v.Args[0] 9073 v_1 := v.Args[1] 9074 if v_1.Op != OpARMMOVWconst { 9075 break 9076 } 9077 c := v_1.AuxInt 9078 mem := v.Args[2] 9079 v.reset(OpARMMOVWload) 9080 v.AuxInt = int64(uint32(c) >> uint64(d)) 9081 v.AddArg(ptr) 9082 v.AddArg(mem) 9083 return true 9084 } 9085 return false 9086 } 9087 func rewriteValueARM_OpARMMOVWreg_0(v *Value) bool { 9088 // match: (MOVWreg x) 9089 // cond: x.Uses == 1 9090 // result: (MOVWnop x) 9091 for { 9092 x := v.Args[0] 9093 if !(x.Uses == 1) { 9094 break 9095 } 9096 v.reset(OpARMMOVWnop) 9097 v.AddArg(x) 9098 return true 9099 } 9100 // match: (MOVWreg (MOVWconst [c])) 9101 // cond: 9102 // result: (MOVWconst [c]) 9103 for { 9104 v_0 := v.Args[0] 9105 if v_0.Op != OpARMMOVWconst { 9106 break 9107 } 9108 c := v_0.AuxInt 9109 v.reset(OpARMMOVWconst) 9110 v.AuxInt = c 9111 return true 9112 } 9113 return false 9114 } 9115 func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { 9116 b := v.Block 9117 _ = b 9118 config := b.Func.Config 9119 _ = config 9120 // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) 9121 // cond: 9122 // result: (MOVWstore [off1+off2] {sym} ptr val mem) 9123 for { 9124 off1 := v.AuxInt 9125 sym := v.Aux 9126 _ = v.Args[2] 9127 v_0 := v.Args[0] 9128 if v_0.Op != OpARMADDconst { 9129 break 9130 } 9131 off2 := v_0.AuxInt 9132 ptr := v_0.Args[0] 9133 val := v.Args[1] 9134 mem := v.Args[2] 9135 v.reset(OpARMMOVWstore) 9136 v.AuxInt = off1 + off2 9137 v.Aux = sym 9138 v.AddArg(ptr) 9139 v.AddArg(val) 9140 v.AddArg(mem) 9141 return true 9142 } 9143 // match: (MOVWstore [off1] {sym} (SUBconst [off2] ptr) val mem) 9144 // cond: 9145 // result: (MOVWstore [off1-off2] {sym} ptr val mem) 9146 for { 9147 off1 := v.AuxInt 9148 sym := v.Aux 9149 _ = v.Args[2] 9150 v_0 := v.Args[0] 9151 if v_0.Op != OpARMSUBconst { 9152 break 9153 } 9154 off2 := v_0.AuxInt 9155 ptr := v_0.Args[0] 9156 val := v.Args[1] 9157 mem := v.Args[2] 9158 v.reset(OpARMMOVWstore) 9159 v.AuxInt = off1 - off2 9160 v.Aux = sym 9161 v.AddArg(ptr) 9162 v.AddArg(val) 9163 v.AddArg(mem) 9164 return true 9165 } 9166 // match: (MOVWstore [off1] {sym1} (MOVWaddr [off2] {sym2} ptr) val mem) 9167 // cond: canMergeSym(sym1,sym2) 9168 // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) 9169 for { 9170 off1 := v.AuxInt 9171 sym1 := v.Aux 9172 _ = v.Args[2] 9173 v_0 := v.Args[0] 9174 if v_0.Op != OpARMMOVWaddr { 9175 break 9176 } 9177 off2 := v_0.AuxInt 9178 sym2 := v_0.Aux 9179 ptr := v_0.Args[0] 9180 val := v.Args[1] 9181 mem := v.Args[2] 9182 if !(canMergeSym(sym1, sym2)) { 9183 break 9184 } 9185 v.reset(OpARMMOVWstore) 9186 v.AuxInt = off1 + off2 9187 v.Aux = mergeSym(sym1, sym2) 9188 v.AddArg(ptr) 9189 v.AddArg(val) 9190 v.AddArg(mem) 9191 return true 9192 } 9193 // match: (MOVWstore [0] {sym} (ADD ptr idx) val mem) 9194 // cond: sym == nil && !config.nacl 9195 // result: (MOVWstoreidx ptr idx val mem) 9196 for { 9197 if v.AuxInt != 0 { 9198 break 9199 } 9200 sym := v.Aux 9201 _ = v.Args[2] 9202 v_0 := v.Args[0] 9203 if v_0.Op != OpARMADD { 9204 break 9205 } 9206 _ = v_0.Args[1] 9207 ptr := v_0.Args[0] 9208 idx := v_0.Args[1] 9209 val := v.Args[1] 9210 mem := v.Args[2] 9211 if !(sym == nil && !config.nacl) { 9212 break 9213 } 9214 v.reset(OpARMMOVWstoreidx) 9215 v.AddArg(ptr) 9216 v.AddArg(idx) 9217 v.AddArg(val) 9218 v.AddArg(mem) 9219 return true 9220 } 9221 // match: (MOVWstore [0] {sym} (ADDshiftLL ptr idx [c]) val mem) 9222 // cond: sym == nil && !config.nacl 9223 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9224 for { 9225 if v.AuxInt != 0 { 9226 break 9227 } 9228 sym := v.Aux 9229 _ = v.Args[2] 9230 v_0 := v.Args[0] 9231 if v_0.Op != OpARMADDshiftLL { 9232 break 9233 } 9234 c := v_0.AuxInt 9235 _ = v_0.Args[1] 9236 ptr := v_0.Args[0] 9237 idx := v_0.Args[1] 9238 val := v.Args[1] 9239 mem := v.Args[2] 9240 if !(sym == nil && !config.nacl) { 9241 break 9242 } 9243 v.reset(OpARMMOVWstoreshiftLL) 9244 v.AuxInt = c 9245 v.AddArg(ptr) 9246 v.AddArg(idx) 9247 v.AddArg(val) 9248 v.AddArg(mem) 9249 return true 9250 } 9251 // match: (MOVWstore [0] {sym} (ADDshiftRL ptr idx [c]) val mem) 9252 // cond: sym == nil && !config.nacl 9253 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9254 for { 9255 if v.AuxInt != 0 { 9256 break 9257 } 9258 sym := v.Aux 9259 _ = v.Args[2] 9260 v_0 := v.Args[0] 9261 if v_0.Op != OpARMADDshiftRL { 9262 break 9263 } 9264 c := v_0.AuxInt 9265 _ = v_0.Args[1] 9266 ptr := v_0.Args[0] 9267 idx := v_0.Args[1] 9268 val := v.Args[1] 9269 mem := v.Args[2] 9270 if !(sym == nil && !config.nacl) { 9271 break 9272 } 9273 v.reset(OpARMMOVWstoreshiftRL) 9274 v.AuxInt = c 9275 v.AddArg(ptr) 9276 v.AddArg(idx) 9277 v.AddArg(val) 9278 v.AddArg(mem) 9279 return true 9280 } 9281 // match: (MOVWstore [0] {sym} (ADDshiftRA ptr idx [c]) val mem) 9282 // cond: sym == nil && !config.nacl 9283 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9284 for { 9285 if v.AuxInt != 0 { 9286 break 9287 } 9288 sym := v.Aux 9289 _ = v.Args[2] 9290 v_0 := v.Args[0] 9291 if v_0.Op != OpARMADDshiftRA { 9292 break 9293 } 9294 c := v_0.AuxInt 9295 _ = v_0.Args[1] 9296 ptr := v_0.Args[0] 9297 idx := v_0.Args[1] 9298 val := v.Args[1] 9299 mem := v.Args[2] 9300 if !(sym == nil && !config.nacl) { 9301 break 9302 } 9303 v.reset(OpARMMOVWstoreshiftRA) 9304 v.AuxInt = c 9305 v.AddArg(ptr) 9306 v.AddArg(idx) 9307 v.AddArg(val) 9308 v.AddArg(mem) 9309 return true 9310 } 9311 return false 9312 } 9313 func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { 9314 // match: (MOVWstoreidx ptr (MOVWconst [c]) val mem) 9315 // cond: 9316 // result: (MOVWstore [c] ptr val mem) 9317 for { 9318 _ = v.Args[3] 9319 ptr := v.Args[0] 9320 v_1 := v.Args[1] 9321 if v_1.Op != OpARMMOVWconst { 9322 break 9323 } 9324 c := v_1.AuxInt 9325 val := v.Args[2] 9326 mem := v.Args[3] 9327 v.reset(OpARMMOVWstore) 9328 v.AuxInt = c 9329 v.AddArg(ptr) 9330 v.AddArg(val) 9331 v.AddArg(mem) 9332 return true 9333 } 9334 // match: (MOVWstoreidx (MOVWconst [c]) ptr val mem) 9335 // cond: 9336 // result: (MOVWstore [c] ptr val mem) 9337 for { 9338 _ = v.Args[3] 9339 v_0 := v.Args[0] 9340 if v_0.Op != OpARMMOVWconst { 9341 break 9342 } 9343 c := v_0.AuxInt 9344 ptr := v.Args[1] 9345 val := v.Args[2] 9346 mem := v.Args[3] 9347 v.reset(OpARMMOVWstore) 9348 v.AuxInt = c 9349 v.AddArg(ptr) 9350 v.AddArg(val) 9351 v.AddArg(mem) 9352 return true 9353 } 9354 // match: (MOVWstoreidx ptr (SLLconst idx [c]) val mem) 9355 // cond: 9356 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9357 for { 9358 _ = v.Args[3] 9359 ptr := v.Args[0] 9360 v_1 := v.Args[1] 9361 if v_1.Op != OpARMSLLconst { 9362 break 9363 } 9364 c := v_1.AuxInt 9365 idx := v_1.Args[0] 9366 val := v.Args[2] 9367 mem := v.Args[3] 9368 v.reset(OpARMMOVWstoreshiftLL) 9369 v.AuxInt = c 9370 v.AddArg(ptr) 9371 v.AddArg(idx) 9372 v.AddArg(val) 9373 v.AddArg(mem) 9374 return true 9375 } 9376 // match: (MOVWstoreidx (SLLconst idx [c]) ptr val mem) 9377 // cond: 9378 // result: (MOVWstoreshiftLL ptr idx [c] val mem) 9379 for { 9380 _ = v.Args[3] 9381 v_0 := v.Args[0] 9382 if v_0.Op != OpARMSLLconst { 9383 break 9384 } 9385 c := v_0.AuxInt 9386 idx := v_0.Args[0] 9387 ptr := v.Args[1] 9388 val := v.Args[2] 9389 mem := v.Args[3] 9390 v.reset(OpARMMOVWstoreshiftLL) 9391 v.AuxInt = c 9392 v.AddArg(ptr) 9393 v.AddArg(idx) 9394 v.AddArg(val) 9395 v.AddArg(mem) 9396 return true 9397 } 9398 // match: (MOVWstoreidx ptr (SRLconst idx [c]) val mem) 9399 // cond: 9400 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9401 for { 9402 _ = v.Args[3] 9403 ptr := v.Args[0] 9404 v_1 := v.Args[1] 9405 if v_1.Op != OpARMSRLconst { 9406 break 9407 } 9408 c := v_1.AuxInt 9409 idx := v_1.Args[0] 9410 val := v.Args[2] 9411 mem := v.Args[3] 9412 v.reset(OpARMMOVWstoreshiftRL) 9413 v.AuxInt = c 9414 v.AddArg(ptr) 9415 v.AddArg(idx) 9416 v.AddArg(val) 9417 v.AddArg(mem) 9418 return true 9419 } 9420 // match: (MOVWstoreidx (SRLconst idx [c]) ptr val mem) 9421 // cond: 9422 // result: (MOVWstoreshiftRL ptr idx [c] val mem) 9423 for { 9424 _ = v.Args[3] 9425 v_0 := v.Args[0] 9426 if v_0.Op != OpARMSRLconst { 9427 break 9428 } 9429 c := v_0.AuxInt 9430 idx := v_0.Args[0] 9431 ptr := v.Args[1] 9432 val := v.Args[2] 9433 mem := v.Args[3] 9434 v.reset(OpARMMOVWstoreshiftRL) 9435 v.AuxInt = c 9436 v.AddArg(ptr) 9437 v.AddArg(idx) 9438 v.AddArg(val) 9439 v.AddArg(mem) 9440 return true 9441 } 9442 // match: (MOVWstoreidx ptr (SRAconst idx [c]) val mem) 9443 // cond: 9444 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9445 for { 9446 _ = v.Args[3] 9447 ptr := v.Args[0] 9448 v_1 := v.Args[1] 9449 if v_1.Op != OpARMSRAconst { 9450 break 9451 } 9452 c := v_1.AuxInt 9453 idx := v_1.Args[0] 9454 val := v.Args[2] 9455 mem := v.Args[3] 9456 v.reset(OpARMMOVWstoreshiftRA) 9457 v.AuxInt = c 9458 v.AddArg(ptr) 9459 v.AddArg(idx) 9460 v.AddArg(val) 9461 v.AddArg(mem) 9462 return true 9463 } 9464 // match: (MOVWstoreidx (SRAconst idx [c]) ptr val mem) 9465 // cond: 9466 // result: (MOVWstoreshiftRA ptr idx [c] val mem) 9467 for { 9468 _ = v.Args[3] 9469 v_0 := v.Args[0] 9470 if v_0.Op != OpARMSRAconst { 9471 break 9472 } 9473 c := v_0.AuxInt 9474 idx := v_0.Args[0] 9475 ptr := v.Args[1] 9476 val := v.Args[2] 9477 mem := v.Args[3] 9478 v.reset(OpARMMOVWstoreshiftRA) 9479 v.AuxInt = c 9480 v.AddArg(ptr) 9481 v.AddArg(idx) 9482 v.AddArg(val) 9483 v.AddArg(mem) 9484 return true 9485 } 9486 return false 9487 } 9488 func rewriteValueARM_OpARMMOVWstoreshiftLL_0(v *Value) bool { 9489 // match: (MOVWstoreshiftLL ptr (MOVWconst [c]) [d] val mem) 9490 // cond: 9491 // result: (MOVWstore [int64(uint32(c)<<uint64(d))] ptr val mem) 9492 for { 9493 d := v.AuxInt 9494 _ = v.Args[3] 9495 ptr := v.Args[0] 9496 v_1 := v.Args[1] 9497 if v_1.Op != OpARMMOVWconst { 9498 break 9499 } 9500 c := v_1.AuxInt 9501 val := v.Args[2] 9502 mem := v.Args[3] 9503 v.reset(OpARMMOVWstore) 9504 v.AuxInt = int64(uint32(c) << uint64(d)) 9505 v.AddArg(ptr) 9506 v.AddArg(val) 9507 v.AddArg(mem) 9508 return true 9509 } 9510 return false 9511 } 9512 func rewriteValueARM_OpARMMOVWstoreshiftRA_0(v *Value) bool { 9513 // match: (MOVWstoreshiftRA ptr (MOVWconst [c]) [d] val mem) 9514 // cond: 9515 // result: (MOVWstore [int64(int32(c)>>uint64(d))] ptr val mem) 9516 for { 9517 d := v.AuxInt 9518 _ = v.Args[3] 9519 ptr := v.Args[0] 9520 v_1 := v.Args[1] 9521 if v_1.Op != OpARMMOVWconst { 9522 break 9523 } 9524 c := v_1.AuxInt 9525 val := v.Args[2] 9526 mem := v.Args[3] 9527 v.reset(OpARMMOVWstore) 9528 v.AuxInt = int64(int32(c) >> uint64(d)) 9529 v.AddArg(ptr) 9530 v.AddArg(val) 9531 v.AddArg(mem) 9532 return true 9533 } 9534 return false 9535 } 9536 func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { 9537 // match: (MOVWstoreshiftRL ptr (MOVWconst [c]) [d] val mem) 9538 // cond: 9539 // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) 9540 for { 9541 d := v.AuxInt 9542 _ = v.Args[3] 9543 ptr := v.Args[0] 9544 v_1 := v.Args[1] 9545 if v_1.Op != OpARMMOVWconst { 9546 break 9547 } 9548 c := v_1.AuxInt 9549 val := v.Args[2] 9550 mem := v.Args[3] 9551 v.reset(OpARMMOVWstore) 9552 v.AuxInt = int64(uint32(c) >> uint64(d)) 9553 v.AddArg(ptr) 9554 v.AddArg(val) 9555 v.AddArg(mem) 9556 return true 9557 } 9558 return false 9559 } 9560 func rewriteValueARM_OpARMMUL_0(v *Value) bool { 9561 // match: (MUL x (MOVWconst [c])) 9562 // cond: int32(c) == -1 9563 // result: (RSBconst [0] x) 9564 for { 9565 _ = v.Args[1] 9566 x := v.Args[0] 9567 v_1 := v.Args[1] 9568 if v_1.Op != OpARMMOVWconst { 9569 break 9570 } 9571 c := v_1.AuxInt 9572 if !(int32(c) == -1) { 9573 break 9574 } 9575 v.reset(OpARMRSBconst) 9576 v.AuxInt = 0 9577 v.AddArg(x) 9578 return true 9579 } 9580 // match: (MUL (MOVWconst [c]) x) 9581 // cond: int32(c) == -1 9582 // result: (RSBconst [0] x) 9583 for { 9584 _ = v.Args[1] 9585 v_0 := v.Args[0] 9586 if v_0.Op != OpARMMOVWconst { 9587 break 9588 } 9589 c := v_0.AuxInt 9590 x := v.Args[1] 9591 if !(int32(c) == -1) { 9592 break 9593 } 9594 v.reset(OpARMRSBconst) 9595 v.AuxInt = 0 9596 v.AddArg(x) 9597 return true 9598 } 9599 // match: (MUL _ (MOVWconst [0])) 9600 // cond: 9601 // result: (MOVWconst [0]) 9602 for { 9603 _ = v.Args[1] 9604 v_1 := v.Args[1] 9605 if v_1.Op != OpARMMOVWconst { 9606 break 9607 } 9608 if v_1.AuxInt != 0 { 9609 break 9610 } 9611 v.reset(OpARMMOVWconst) 9612 v.AuxInt = 0 9613 return true 9614 } 9615 // match: (MUL (MOVWconst [0]) _) 9616 // cond: 9617 // result: (MOVWconst [0]) 9618 for { 9619 _ = v.Args[1] 9620 v_0 := v.Args[0] 9621 if v_0.Op != OpARMMOVWconst { 9622 break 9623 } 9624 if v_0.AuxInt != 0 { 9625 break 9626 } 9627 v.reset(OpARMMOVWconst) 9628 v.AuxInt = 0 9629 return true 9630 } 9631 // match: (MUL x (MOVWconst [1])) 9632 // cond: 9633 // result: x 9634 for { 9635 _ = v.Args[1] 9636 x := v.Args[0] 9637 v_1 := v.Args[1] 9638 if v_1.Op != OpARMMOVWconst { 9639 break 9640 } 9641 if v_1.AuxInt != 1 { 9642 break 9643 } 9644 v.reset(OpCopy) 9645 v.Type = x.Type 9646 v.AddArg(x) 9647 return true 9648 } 9649 // match: (MUL (MOVWconst [1]) x) 9650 // cond: 9651 // result: x 9652 for { 9653 _ = v.Args[1] 9654 v_0 := v.Args[0] 9655 if v_0.Op != OpARMMOVWconst { 9656 break 9657 } 9658 if v_0.AuxInt != 1 { 9659 break 9660 } 9661 x := v.Args[1] 9662 v.reset(OpCopy) 9663 v.Type = x.Type 9664 v.AddArg(x) 9665 return true 9666 } 9667 // match: (MUL x (MOVWconst [c])) 9668 // cond: isPowerOfTwo(c) 9669 // result: (SLLconst [log2(c)] x) 9670 for { 9671 _ = v.Args[1] 9672 x := v.Args[0] 9673 v_1 := v.Args[1] 9674 if v_1.Op != OpARMMOVWconst { 9675 break 9676 } 9677 c := v_1.AuxInt 9678 if !(isPowerOfTwo(c)) { 9679 break 9680 } 9681 v.reset(OpARMSLLconst) 9682 v.AuxInt = log2(c) 9683 v.AddArg(x) 9684 return true 9685 } 9686 // match: (MUL (MOVWconst [c]) x) 9687 // cond: isPowerOfTwo(c) 9688 // result: (SLLconst [log2(c)] x) 9689 for { 9690 _ = v.Args[1] 9691 v_0 := v.Args[0] 9692 if v_0.Op != OpARMMOVWconst { 9693 break 9694 } 9695 c := v_0.AuxInt 9696 x := v.Args[1] 9697 if !(isPowerOfTwo(c)) { 9698 break 9699 } 9700 v.reset(OpARMSLLconst) 9701 v.AuxInt = log2(c) 9702 v.AddArg(x) 9703 return true 9704 } 9705 // match: (MUL x (MOVWconst [c])) 9706 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9707 // result: (ADDshiftLL x x [log2(c-1)]) 9708 for { 9709 _ = v.Args[1] 9710 x := v.Args[0] 9711 v_1 := v.Args[1] 9712 if v_1.Op != OpARMMOVWconst { 9713 break 9714 } 9715 c := v_1.AuxInt 9716 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9717 break 9718 } 9719 v.reset(OpARMADDshiftLL) 9720 v.AuxInt = log2(c - 1) 9721 v.AddArg(x) 9722 v.AddArg(x) 9723 return true 9724 } 9725 // match: (MUL (MOVWconst [c]) x) 9726 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 9727 // result: (ADDshiftLL x x [log2(c-1)]) 9728 for { 9729 _ = v.Args[1] 9730 v_0 := v.Args[0] 9731 if v_0.Op != OpARMMOVWconst { 9732 break 9733 } 9734 c := v_0.AuxInt 9735 x := v.Args[1] 9736 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 9737 break 9738 } 9739 v.reset(OpARMADDshiftLL) 9740 v.AuxInt = log2(c - 1) 9741 v.AddArg(x) 9742 v.AddArg(x) 9743 return true 9744 } 9745 return false 9746 } 9747 func rewriteValueARM_OpARMMUL_10(v *Value) bool { 9748 b := v.Block 9749 _ = b 9750 // match: (MUL x (MOVWconst [c])) 9751 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9752 // result: (RSBshiftLL x x [log2(c+1)]) 9753 for { 9754 _ = v.Args[1] 9755 x := v.Args[0] 9756 v_1 := v.Args[1] 9757 if v_1.Op != OpARMMOVWconst { 9758 break 9759 } 9760 c := v_1.AuxInt 9761 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9762 break 9763 } 9764 v.reset(OpARMRSBshiftLL) 9765 v.AuxInt = log2(c + 1) 9766 v.AddArg(x) 9767 v.AddArg(x) 9768 return true 9769 } 9770 // match: (MUL (MOVWconst [c]) x) 9771 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 9772 // result: (RSBshiftLL x x [log2(c+1)]) 9773 for { 9774 _ = v.Args[1] 9775 v_0 := v.Args[0] 9776 if v_0.Op != OpARMMOVWconst { 9777 break 9778 } 9779 c := v_0.AuxInt 9780 x := v.Args[1] 9781 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 9782 break 9783 } 9784 v.reset(OpARMRSBshiftLL) 9785 v.AuxInt = log2(c + 1) 9786 v.AddArg(x) 9787 v.AddArg(x) 9788 return true 9789 } 9790 // match: (MUL x (MOVWconst [c])) 9791 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9792 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 9793 for { 9794 _ = v.Args[1] 9795 x := v.Args[0] 9796 v_1 := v.Args[1] 9797 if v_1.Op != OpARMMOVWconst { 9798 break 9799 } 9800 c := v_1.AuxInt 9801 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9802 break 9803 } 9804 v.reset(OpARMSLLconst) 9805 v.AuxInt = log2(c / 3) 9806 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9807 v0.AuxInt = 1 9808 v0.AddArg(x) 9809 v0.AddArg(x) 9810 v.AddArg(v0) 9811 return true 9812 } 9813 // match: (MUL (MOVWconst [c]) x) 9814 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 9815 // result: (SLLconst [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) 9816 for { 9817 _ = v.Args[1] 9818 v_0 := v.Args[0] 9819 if v_0.Op != OpARMMOVWconst { 9820 break 9821 } 9822 c := v_0.AuxInt 9823 x := v.Args[1] 9824 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 9825 break 9826 } 9827 v.reset(OpARMSLLconst) 9828 v.AuxInt = log2(c / 3) 9829 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9830 v0.AuxInt = 1 9831 v0.AddArg(x) 9832 v0.AddArg(x) 9833 v.AddArg(v0) 9834 return true 9835 } 9836 // match: (MUL x (MOVWconst [c])) 9837 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9838 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 9839 for { 9840 _ = v.Args[1] 9841 x := v.Args[0] 9842 v_1 := v.Args[1] 9843 if v_1.Op != OpARMMOVWconst { 9844 break 9845 } 9846 c := v_1.AuxInt 9847 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9848 break 9849 } 9850 v.reset(OpARMSLLconst) 9851 v.AuxInt = log2(c / 5) 9852 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9853 v0.AuxInt = 2 9854 v0.AddArg(x) 9855 v0.AddArg(x) 9856 v.AddArg(v0) 9857 return true 9858 } 9859 // match: (MUL (MOVWconst [c]) x) 9860 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 9861 // result: (SLLconst [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) 9862 for { 9863 _ = v.Args[1] 9864 v_0 := v.Args[0] 9865 if v_0.Op != OpARMMOVWconst { 9866 break 9867 } 9868 c := v_0.AuxInt 9869 x := v.Args[1] 9870 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 9871 break 9872 } 9873 v.reset(OpARMSLLconst) 9874 v.AuxInt = log2(c / 5) 9875 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9876 v0.AuxInt = 2 9877 v0.AddArg(x) 9878 v0.AddArg(x) 9879 v.AddArg(v0) 9880 return true 9881 } 9882 // match: (MUL x (MOVWconst [c])) 9883 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 9884 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 9885 for { 9886 _ = v.Args[1] 9887 x := v.Args[0] 9888 v_1 := v.Args[1] 9889 if v_1.Op != OpARMMOVWconst { 9890 break 9891 } 9892 c := v_1.AuxInt 9893 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 9894 break 9895 } 9896 v.reset(OpARMSLLconst) 9897 v.AuxInt = log2(c / 7) 9898 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9899 v0.AuxInt = 3 9900 v0.AddArg(x) 9901 v0.AddArg(x) 9902 v.AddArg(v0) 9903 return true 9904 } 9905 // match: (MUL (MOVWconst [c]) x) 9906 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 9907 // result: (SLLconst [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) 9908 for { 9909 _ = v.Args[1] 9910 v_0 := v.Args[0] 9911 if v_0.Op != OpARMMOVWconst { 9912 break 9913 } 9914 c := v_0.AuxInt 9915 x := v.Args[1] 9916 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 9917 break 9918 } 9919 v.reset(OpARMSLLconst) 9920 v.AuxInt = log2(c / 7) 9921 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 9922 v0.AuxInt = 3 9923 v0.AddArg(x) 9924 v0.AddArg(x) 9925 v.AddArg(v0) 9926 return true 9927 } 9928 // match: (MUL x (MOVWconst [c])) 9929 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 9930 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 9931 for { 9932 _ = v.Args[1] 9933 x := v.Args[0] 9934 v_1 := v.Args[1] 9935 if v_1.Op != OpARMMOVWconst { 9936 break 9937 } 9938 c := v_1.AuxInt 9939 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9940 break 9941 } 9942 v.reset(OpARMSLLconst) 9943 v.AuxInt = log2(c / 9) 9944 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9945 v0.AuxInt = 3 9946 v0.AddArg(x) 9947 v0.AddArg(x) 9948 v.AddArg(v0) 9949 return true 9950 } 9951 // match: (MUL (MOVWconst [c]) x) 9952 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 9953 // result: (SLLconst [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) 9954 for { 9955 _ = v.Args[1] 9956 v_0 := v.Args[0] 9957 if v_0.Op != OpARMMOVWconst { 9958 break 9959 } 9960 c := v_0.AuxInt 9961 x := v.Args[1] 9962 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 9963 break 9964 } 9965 v.reset(OpARMSLLconst) 9966 v.AuxInt = log2(c / 9) 9967 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 9968 v0.AuxInt = 3 9969 v0.AddArg(x) 9970 v0.AddArg(x) 9971 v.AddArg(v0) 9972 return true 9973 } 9974 return false 9975 } 9976 func rewriteValueARM_OpARMMUL_20(v *Value) bool { 9977 // match: (MUL (MOVWconst [c]) (MOVWconst [d])) 9978 // cond: 9979 // result: (MOVWconst [int64(int32(c*d))]) 9980 for { 9981 _ = v.Args[1] 9982 v_0 := v.Args[0] 9983 if v_0.Op != OpARMMOVWconst { 9984 break 9985 } 9986 c := v_0.AuxInt 9987 v_1 := v.Args[1] 9988 if v_1.Op != OpARMMOVWconst { 9989 break 9990 } 9991 d := v_1.AuxInt 9992 v.reset(OpARMMOVWconst) 9993 v.AuxInt = int64(int32(c * d)) 9994 return true 9995 } 9996 // match: (MUL (MOVWconst [d]) (MOVWconst [c])) 9997 // cond: 9998 // result: (MOVWconst [int64(int32(c*d))]) 9999 for { 10000 _ = v.Args[1] 10001 v_0 := v.Args[0] 10002 if v_0.Op != OpARMMOVWconst { 10003 break 10004 } 10005 d := v_0.AuxInt 10006 v_1 := v.Args[1] 10007 if v_1.Op != OpARMMOVWconst { 10008 break 10009 } 10010 c := v_1.AuxInt 10011 v.reset(OpARMMOVWconst) 10012 v.AuxInt = int64(int32(c * d)) 10013 return true 10014 } 10015 return false 10016 } 10017 func rewriteValueARM_OpARMMULA_0(v *Value) bool { 10018 b := v.Block 10019 _ = b 10020 // match: (MULA x (MOVWconst [c]) a) 10021 // cond: int32(c) == -1 10022 // result: (SUB a x) 10023 for { 10024 _ = v.Args[2] 10025 x := v.Args[0] 10026 v_1 := v.Args[1] 10027 if v_1.Op != OpARMMOVWconst { 10028 break 10029 } 10030 c := v_1.AuxInt 10031 a := v.Args[2] 10032 if !(int32(c) == -1) { 10033 break 10034 } 10035 v.reset(OpARMSUB) 10036 v.AddArg(a) 10037 v.AddArg(x) 10038 return true 10039 } 10040 // match: (MULA _ (MOVWconst [0]) a) 10041 // cond: 10042 // result: a 10043 for { 10044 _ = v.Args[2] 10045 v_1 := v.Args[1] 10046 if v_1.Op != OpARMMOVWconst { 10047 break 10048 } 10049 if v_1.AuxInt != 0 { 10050 break 10051 } 10052 a := v.Args[2] 10053 v.reset(OpCopy) 10054 v.Type = a.Type 10055 v.AddArg(a) 10056 return true 10057 } 10058 // match: (MULA x (MOVWconst [1]) a) 10059 // cond: 10060 // result: (ADD x a) 10061 for { 10062 _ = v.Args[2] 10063 x := v.Args[0] 10064 v_1 := v.Args[1] 10065 if v_1.Op != OpARMMOVWconst { 10066 break 10067 } 10068 if v_1.AuxInt != 1 { 10069 break 10070 } 10071 a := v.Args[2] 10072 v.reset(OpARMADD) 10073 v.AddArg(x) 10074 v.AddArg(a) 10075 return true 10076 } 10077 // match: (MULA x (MOVWconst [c]) a) 10078 // cond: isPowerOfTwo(c) 10079 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 10080 for { 10081 _ = v.Args[2] 10082 x := v.Args[0] 10083 v_1 := v.Args[1] 10084 if v_1.Op != OpARMMOVWconst { 10085 break 10086 } 10087 c := v_1.AuxInt 10088 a := v.Args[2] 10089 if !(isPowerOfTwo(c)) { 10090 break 10091 } 10092 v.reset(OpARMADD) 10093 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10094 v0.AuxInt = log2(c) 10095 v0.AddArg(x) 10096 v.AddArg(v0) 10097 v.AddArg(a) 10098 return true 10099 } 10100 // match: (MULA x (MOVWconst [c]) a) 10101 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10102 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 10103 for { 10104 _ = v.Args[2] 10105 x := v.Args[0] 10106 v_1 := v.Args[1] 10107 if v_1.Op != OpARMMOVWconst { 10108 break 10109 } 10110 c := v_1.AuxInt 10111 a := v.Args[2] 10112 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10113 break 10114 } 10115 v.reset(OpARMADD) 10116 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10117 v0.AuxInt = log2(c - 1) 10118 v0.AddArg(x) 10119 v0.AddArg(x) 10120 v.AddArg(v0) 10121 v.AddArg(a) 10122 return true 10123 } 10124 // match: (MULA x (MOVWconst [c]) a) 10125 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10126 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10127 for { 10128 _ = v.Args[2] 10129 x := v.Args[0] 10130 v_1 := v.Args[1] 10131 if v_1.Op != OpARMMOVWconst { 10132 break 10133 } 10134 c := v_1.AuxInt 10135 a := v.Args[2] 10136 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10137 break 10138 } 10139 v.reset(OpARMADD) 10140 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10141 v0.AuxInt = log2(c + 1) 10142 v0.AddArg(x) 10143 v0.AddArg(x) 10144 v.AddArg(v0) 10145 v.AddArg(a) 10146 return true 10147 } 10148 // match: (MULA x (MOVWconst [c]) a) 10149 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10150 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10151 for { 10152 _ = v.Args[2] 10153 x := v.Args[0] 10154 v_1 := v.Args[1] 10155 if v_1.Op != OpARMMOVWconst { 10156 break 10157 } 10158 c := v_1.AuxInt 10159 a := v.Args[2] 10160 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10161 break 10162 } 10163 v.reset(OpARMADD) 10164 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10165 v0.AuxInt = log2(c / 3) 10166 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10167 v1.AuxInt = 1 10168 v1.AddArg(x) 10169 v1.AddArg(x) 10170 v0.AddArg(v1) 10171 v.AddArg(v0) 10172 v.AddArg(a) 10173 return true 10174 } 10175 // match: (MULA x (MOVWconst [c]) a) 10176 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10177 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10178 for { 10179 _ = v.Args[2] 10180 x := v.Args[0] 10181 v_1 := v.Args[1] 10182 if v_1.Op != OpARMMOVWconst { 10183 break 10184 } 10185 c := v_1.AuxInt 10186 a := v.Args[2] 10187 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10188 break 10189 } 10190 v.reset(OpARMADD) 10191 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10192 v0.AuxInt = log2(c / 5) 10193 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10194 v1.AuxInt = 2 10195 v1.AddArg(x) 10196 v1.AddArg(x) 10197 v0.AddArg(v1) 10198 v.AddArg(v0) 10199 v.AddArg(a) 10200 return true 10201 } 10202 // match: (MULA x (MOVWconst [c]) a) 10203 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10204 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10205 for { 10206 _ = v.Args[2] 10207 x := v.Args[0] 10208 v_1 := v.Args[1] 10209 if v_1.Op != OpARMMOVWconst { 10210 break 10211 } 10212 c := v_1.AuxInt 10213 a := v.Args[2] 10214 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10215 break 10216 } 10217 v.reset(OpARMADD) 10218 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10219 v0.AuxInt = log2(c / 7) 10220 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10221 v1.AuxInt = 3 10222 v1.AddArg(x) 10223 v1.AddArg(x) 10224 v0.AddArg(v1) 10225 v.AddArg(v0) 10226 v.AddArg(a) 10227 return true 10228 } 10229 // match: (MULA x (MOVWconst [c]) a) 10230 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10231 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10232 for { 10233 _ = v.Args[2] 10234 x := v.Args[0] 10235 v_1 := v.Args[1] 10236 if v_1.Op != OpARMMOVWconst { 10237 break 10238 } 10239 c := v_1.AuxInt 10240 a := v.Args[2] 10241 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10242 break 10243 } 10244 v.reset(OpARMADD) 10245 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10246 v0.AuxInt = log2(c / 9) 10247 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10248 v1.AuxInt = 3 10249 v1.AddArg(x) 10250 v1.AddArg(x) 10251 v0.AddArg(v1) 10252 v.AddArg(v0) 10253 v.AddArg(a) 10254 return true 10255 } 10256 return false 10257 } 10258 func rewriteValueARM_OpARMMULA_10(v *Value) bool { 10259 b := v.Block 10260 _ = b 10261 // match: (MULA (MOVWconst [c]) x a) 10262 // cond: int32(c) == -1 10263 // result: (SUB a x) 10264 for { 10265 _ = v.Args[2] 10266 v_0 := v.Args[0] 10267 if v_0.Op != OpARMMOVWconst { 10268 break 10269 } 10270 c := v_0.AuxInt 10271 x := v.Args[1] 10272 a := v.Args[2] 10273 if !(int32(c) == -1) { 10274 break 10275 } 10276 v.reset(OpARMSUB) 10277 v.AddArg(a) 10278 v.AddArg(x) 10279 return true 10280 } 10281 // match: (MULA (MOVWconst [0]) _ a) 10282 // cond: 10283 // result: a 10284 for { 10285 _ = v.Args[2] 10286 v_0 := v.Args[0] 10287 if v_0.Op != OpARMMOVWconst { 10288 break 10289 } 10290 if v_0.AuxInt != 0 { 10291 break 10292 } 10293 a := v.Args[2] 10294 v.reset(OpCopy) 10295 v.Type = a.Type 10296 v.AddArg(a) 10297 return true 10298 } 10299 // match: (MULA (MOVWconst [1]) x a) 10300 // cond: 10301 // result: (ADD x a) 10302 for { 10303 _ = v.Args[2] 10304 v_0 := v.Args[0] 10305 if v_0.Op != OpARMMOVWconst { 10306 break 10307 } 10308 if v_0.AuxInt != 1 { 10309 break 10310 } 10311 x := v.Args[1] 10312 a := v.Args[2] 10313 v.reset(OpARMADD) 10314 v.AddArg(x) 10315 v.AddArg(a) 10316 return true 10317 } 10318 // match: (MULA (MOVWconst [c]) x a) 10319 // cond: isPowerOfTwo(c) 10320 // result: (ADD (SLLconst <x.Type> [log2(c)] x) a) 10321 for { 10322 _ = v.Args[2] 10323 v_0 := v.Args[0] 10324 if v_0.Op != OpARMMOVWconst { 10325 break 10326 } 10327 c := v_0.AuxInt 10328 x := v.Args[1] 10329 a := v.Args[2] 10330 if !(isPowerOfTwo(c)) { 10331 break 10332 } 10333 v.reset(OpARMADD) 10334 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10335 v0.AuxInt = log2(c) 10336 v0.AddArg(x) 10337 v.AddArg(v0) 10338 v.AddArg(a) 10339 return true 10340 } 10341 // match: (MULA (MOVWconst [c]) x a) 10342 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10343 // result: (ADD (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 10344 for { 10345 _ = v.Args[2] 10346 v_0 := v.Args[0] 10347 if v_0.Op != OpARMMOVWconst { 10348 break 10349 } 10350 c := v_0.AuxInt 10351 x := v.Args[1] 10352 a := v.Args[2] 10353 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10354 break 10355 } 10356 v.reset(OpARMADD) 10357 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10358 v0.AuxInt = log2(c - 1) 10359 v0.AddArg(x) 10360 v0.AddArg(x) 10361 v.AddArg(v0) 10362 v.AddArg(a) 10363 return true 10364 } 10365 // match: (MULA (MOVWconst [c]) x a) 10366 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10367 // result: (ADD (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10368 for { 10369 _ = v.Args[2] 10370 v_0 := v.Args[0] 10371 if v_0.Op != OpARMMOVWconst { 10372 break 10373 } 10374 c := v_0.AuxInt 10375 x := v.Args[1] 10376 a := v.Args[2] 10377 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10378 break 10379 } 10380 v.reset(OpARMADD) 10381 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10382 v0.AuxInt = log2(c + 1) 10383 v0.AddArg(x) 10384 v0.AddArg(x) 10385 v.AddArg(v0) 10386 v.AddArg(a) 10387 return true 10388 } 10389 // match: (MULA (MOVWconst [c]) x a) 10390 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10391 // result: (ADD (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10392 for { 10393 _ = v.Args[2] 10394 v_0 := v.Args[0] 10395 if v_0.Op != OpARMMOVWconst { 10396 break 10397 } 10398 c := v_0.AuxInt 10399 x := v.Args[1] 10400 a := v.Args[2] 10401 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10402 break 10403 } 10404 v.reset(OpARMADD) 10405 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10406 v0.AuxInt = log2(c / 3) 10407 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10408 v1.AuxInt = 1 10409 v1.AddArg(x) 10410 v1.AddArg(x) 10411 v0.AddArg(v1) 10412 v.AddArg(v0) 10413 v.AddArg(a) 10414 return true 10415 } 10416 // match: (MULA (MOVWconst [c]) x a) 10417 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10418 // result: (ADD (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10419 for { 10420 _ = v.Args[2] 10421 v_0 := v.Args[0] 10422 if v_0.Op != OpARMMOVWconst { 10423 break 10424 } 10425 c := v_0.AuxInt 10426 x := v.Args[1] 10427 a := v.Args[2] 10428 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10429 break 10430 } 10431 v.reset(OpARMADD) 10432 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10433 v0.AuxInt = log2(c / 5) 10434 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10435 v1.AuxInt = 2 10436 v1.AddArg(x) 10437 v1.AddArg(x) 10438 v0.AddArg(v1) 10439 v.AddArg(v0) 10440 v.AddArg(a) 10441 return true 10442 } 10443 // match: (MULA (MOVWconst [c]) x a) 10444 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10445 // result: (ADD (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10446 for { 10447 _ = v.Args[2] 10448 v_0 := v.Args[0] 10449 if v_0.Op != OpARMMOVWconst { 10450 break 10451 } 10452 c := v_0.AuxInt 10453 x := v.Args[1] 10454 a := v.Args[2] 10455 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10456 break 10457 } 10458 v.reset(OpARMADD) 10459 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10460 v0.AuxInt = log2(c / 7) 10461 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10462 v1.AuxInt = 3 10463 v1.AddArg(x) 10464 v1.AddArg(x) 10465 v0.AddArg(v1) 10466 v.AddArg(v0) 10467 v.AddArg(a) 10468 return true 10469 } 10470 // match: (MULA (MOVWconst [c]) x a) 10471 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10472 // result: (ADD (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10473 for { 10474 _ = v.Args[2] 10475 v_0 := v.Args[0] 10476 if v_0.Op != OpARMMOVWconst { 10477 break 10478 } 10479 c := v_0.AuxInt 10480 x := v.Args[1] 10481 a := v.Args[2] 10482 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10483 break 10484 } 10485 v.reset(OpARMADD) 10486 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10487 v0.AuxInt = log2(c / 9) 10488 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10489 v1.AuxInt = 3 10490 v1.AddArg(x) 10491 v1.AddArg(x) 10492 v0.AddArg(v1) 10493 v.AddArg(v0) 10494 v.AddArg(a) 10495 return true 10496 } 10497 return false 10498 } 10499 func rewriteValueARM_OpARMMULA_20(v *Value) bool { 10500 // match: (MULA (MOVWconst [c]) (MOVWconst [d]) a) 10501 // cond: 10502 // result: (ADDconst [int64(int32(c*d))] a) 10503 for { 10504 _ = v.Args[2] 10505 v_0 := v.Args[0] 10506 if v_0.Op != OpARMMOVWconst { 10507 break 10508 } 10509 c := v_0.AuxInt 10510 v_1 := v.Args[1] 10511 if v_1.Op != OpARMMOVWconst { 10512 break 10513 } 10514 d := v_1.AuxInt 10515 a := v.Args[2] 10516 v.reset(OpARMADDconst) 10517 v.AuxInt = int64(int32(c * d)) 10518 v.AddArg(a) 10519 return true 10520 } 10521 return false 10522 } 10523 func rewriteValueARM_OpARMMULD_0(v *Value) bool { 10524 // match: (MULD (NEGD x) y) 10525 // cond: objabi.GOARM >= 6 10526 // result: (NMULD x y) 10527 for { 10528 _ = v.Args[1] 10529 v_0 := v.Args[0] 10530 if v_0.Op != OpARMNEGD { 10531 break 10532 } 10533 x := v_0.Args[0] 10534 y := v.Args[1] 10535 if !(objabi.GOARM >= 6) { 10536 break 10537 } 10538 v.reset(OpARMNMULD) 10539 v.AddArg(x) 10540 v.AddArg(y) 10541 return true 10542 } 10543 // match: (MULD y (NEGD x)) 10544 // cond: objabi.GOARM >= 6 10545 // result: (NMULD x y) 10546 for { 10547 _ = v.Args[1] 10548 y := v.Args[0] 10549 v_1 := v.Args[1] 10550 if v_1.Op != OpARMNEGD { 10551 break 10552 } 10553 x := v_1.Args[0] 10554 if !(objabi.GOARM >= 6) { 10555 break 10556 } 10557 v.reset(OpARMNMULD) 10558 v.AddArg(x) 10559 v.AddArg(y) 10560 return true 10561 } 10562 return false 10563 } 10564 func rewriteValueARM_OpARMMULF_0(v *Value) bool { 10565 // match: (MULF (NEGF x) y) 10566 // cond: objabi.GOARM >= 6 10567 // result: (NMULF x y) 10568 for { 10569 _ = v.Args[1] 10570 v_0 := v.Args[0] 10571 if v_0.Op != OpARMNEGF { 10572 break 10573 } 10574 x := v_0.Args[0] 10575 y := v.Args[1] 10576 if !(objabi.GOARM >= 6) { 10577 break 10578 } 10579 v.reset(OpARMNMULF) 10580 v.AddArg(x) 10581 v.AddArg(y) 10582 return true 10583 } 10584 // match: (MULF y (NEGF x)) 10585 // cond: objabi.GOARM >= 6 10586 // result: (NMULF x y) 10587 for { 10588 _ = v.Args[1] 10589 y := v.Args[0] 10590 v_1 := v.Args[1] 10591 if v_1.Op != OpARMNEGF { 10592 break 10593 } 10594 x := v_1.Args[0] 10595 if !(objabi.GOARM >= 6) { 10596 break 10597 } 10598 v.reset(OpARMNMULF) 10599 v.AddArg(x) 10600 v.AddArg(y) 10601 return true 10602 } 10603 return false 10604 } 10605 func rewriteValueARM_OpARMMULS_0(v *Value) bool { 10606 b := v.Block 10607 _ = b 10608 // match: (MULS x (MOVWconst [c]) a) 10609 // cond: int32(c) == -1 10610 // result: (ADD a x) 10611 for { 10612 _ = v.Args[2] 10613 x := v.Args[0] 10614 v_1 := v.Args[1] 10615 if v_1.Op != OpARMMOVWconst { 10616 break 10617 } 10618 c := v_1.AuxInt 10619 a := v.Args[2] 10620 if !(int32(c) == -1) { 10621 break 10622 } 10623 v.reset(OpARMADD) 10624 v.AddArg(a) 10625 v.AddArg(x) 10626 return true 10627 } 10628 // match: (MULS _ (MOVWconst [0]) a) 10629 // cond: 10630 // result: a 10631 for { 10632 _ = v.Args[2] 10633 v_1 := v.Args[1] 10634 if v_1.Op != OpARMMOVWconst { 10635 break 10636 } 10637 if v_1.AuxInt != 0 { 10638 break 10639 } 10640 a := v.Args[2] 10641 v.reset(OpCopy) 10642 v.Type = a.Type 10643 v.AddArg(a) 10644 return true 10645 } 10646 // match: (MULS x (MOVWconst [1]) a) 10647 // cond: 10648 // result: (RSB x a) 10649 for { 10650 _ = v.Args[2] 10651 x := v.Args[0] 10652 v_1 := v.Args[1] 10653 if v_1.Op != OpARMMOVWconst { 10654 break 10655 } 10656 if v_1.AuxInt != 1 { 10657 break 10658 } 10659 a := v.Args[2] 10660 v.reset(OpARMRSB) 10661 v.AddArg(x) 10662 v.AddArg(a) 10663 return true 10664 } 10665 // match: (MULS x (MOVWconst [c]) a) 10666 // cond: isPowerOfTwo(c) 10667 // result: (RSB (SLLconst <x.Type> [log2(c)] x) a) 10668 for { 10669 _ = v.Args[2] 10670 x := v.Args[0] 10671 v_1 := v.Args[1] 10672 if v_1.Op != OpARMMOVWconst { 10673 break 10674 } 10675 c := v_1.AuxInt 10676 a := v.Args[2] 10677 if !(isPowerOfTwo(c)) { 10678 break 10679 } 10680 v.reset(OpARMRSB) 10681 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10682 v0.AuxInt = log2(c) 10683 v0.AddArg(x) 10684 v.AddArg(v0) 10685 v.AddArg(a) 10686 return true 10687 } 10688 // match: (MULS x (MOVWconst [c]) a) 10689 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10690 // result: (RSB (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 10691 for { 10692 _ = v.Args[2] 10693 x := v.Args[0] 10694 v_1 := v.Args[1] 10695 if v_1.Op != OpARMMOVWconst { 10696 break 10697 } 10698 c := v_1.AuxInt 10699 a := v.Args[2] 10700 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10701 break 10702 } 10703 v.reset(OpARMRSB) 10704 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10705 v0.AuxInt = log2(c - 1) 10706 v0.AddArg(x) 10707 v0.AddArg(x) 10708 v.AddArg(v0) 10709 v.AddArg(a) 10710 return true 10711 } 10712 // match: (MULS x (MOVWconst [c]) a) 10713 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10714 // result: (RSB (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10715 for { 10716 _ = v.Args[2] 10717 x := v.Args[0] 10718 v_1 := v.Args[1] 10719 if v_1.Op != OpARMMOVWconst { 10720 break 10721 } 10722 c := v_1.AuxInt 10723 a := v.Args[2] 10724 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10725 break 10726 } 10727 v.reset(OpARMRSB) 10728 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10729 v0.AuxInt = log2(c + 1) 10730 v0.AddArg(x) 10731 v0.AddArg(x) 10732 v.AddArg(v0) 10733 v.AddArg(a) 10734 return true 10735 } 10736 // match: (MULS x (MOVWconst [c]) a) 10737 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10738 // result: (RSB (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10739 for { 10740 _ = v.Args[2] 10741 x := v.Args[0] 10742 v_1 := v.Args[1] 10743 if v_1.Op != OpARMMOVWconst { 10744 break 10745 } 10746 c := v_1.AuxInt 10747 a := v.Args[2] 10748 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10749 break 10750 } 10751 v.reset(OpARMRSB) 10752 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10753 v0.AuxInt = log2(c / 3) 10754 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10755 v1.AuxInt = 1 10756 v1.AddArg(x) 10757 v1.AddArg(x) 10758 v0.AddArg(v1) 10759 v.AddArg(v0) 10760 v.AddArg(a) 10761 return true 10762 } 10763 // match: (MULS x (MOVWconst [c]) a) 10764 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 10765 // result: (RSB (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 10766 for { 10767 _ = v.Args[2] 10768 x := v.Args[0] 10769 v_1 := v.Args[1] 10770 if v_1.Op != OpARMMOVWconst { 10771 break 10772 } 10773 c := v_1.AuxInt 10774 a := v.Args[2] 10775 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 10776 break 10777 } 10778 v.reset(OpARMRSB) 10779 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10780 v0.AuxInt = log2(c / 5) 10781 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10782 v1.AuxInt = 2 10783 v1.AddArg(x) 10784 v1.AddArg(x) 10785 v0.AddArg(v1) 10786 v.AddArg(v0) 10787 v.AddArg(a) 10788 return true 10789 } 10790 // match: (MULS x (MOVWconst [c]) a) 10791 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 10792 // result: (RSB (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 10793 for { 10794 _ = v.Args[2] 10795 x := v.Args[0] 10796 v_1 := v.Args[1] 10797 if v_1.Op != OpARMMOVWconst { 10798 break 10799 } 10800 c := v_1.AuxInt 10801 a := v.Args[2] 10802 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 10803 break 10804 } 10805 v.reset(OpARMRSB) 10806 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10807 v0.AuxInt = log2(c / 7) 10808 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10809 v1.AuxInt = 3 10810 v1.AddArg(x) 10811 v1.AddArg(x) 10812 v0.AddArg(v1) 10813 v.AddArg(v0) 10814 v.AddArg(a) 10815 return true 10816 } 10817 // match: (MULS x (MOVWconst [c]) a) 10818 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 10819 // result: (RSB (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 10820 for { 10821 _ = v.Args[2] 10822 x := v.Args[0] 10823 v_1 := v.Args[1] 10824 if v_1.Op != OpARMMOVWconst { 10825 break 10826 } 10827 c := v_1.AuxInt 10828 a := v.Args[2] 10829 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 10830 break 10831 } 10832 v.reset(OpARMRSB) 10833 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10834 v0.AuxInt = log2(c / 9) 10835 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10836 v1.AuxInt = 3 10837 v1.AddArg(x) 10838 v1.AddArg(x) 10839 v0.AddArg(v1) 10840 v.AddArg(v0) 10841 v.AddArg(a) 10842 return true 10843 } 10844 return false 10845 } 10846 func rewriteValueARM_OpARMMULS_10(v *Value) bool { 10847 b := v.Block 10848 _ = b 10849 // match: (MULS (MOVWconst [c]) x a) 10850 // cond: int32(c) == -1 10851 // result: (ADD a x) 10852 for { 10853 _ = v.Args[2] 10854 v_0 := v.Args[0] 10855 if v_0.Op != OpARMMOVWconst { 10856 break 10857 } 10858 c := v_0.AuxInt 10859 x := v.Args[1] 10860 a := v.Args[2] 10861 if !(int32(c) == -1) { 10862 break 10863 } 10864 v.reset(OpARMADD) 10865 v.AddArg(a) 10866 v.AddArg(x) 10867 return true 10868 } 10869 // match: (MULS (MOVWconst [0]) _ a) 10870 // cond: 10871 // result: a 10872 for { 10873 _ = v.Args[2] 10874 v_0 := v.Args[0] 10875 if v_0.Op != OpARMMOVWconst { 10876 break 10877 } 10878 if v_0.AuxInt != 0 { 10879 break 10880 } 10881 a := v.Args[2] 10882 v.reset(OpCopy) 10883 v.Type = a.Type 10884 v.AddArg(a) 10885 return true 10886 } 10887 // match: (MULS (MOVWconst [1]) x a) 10888 // cond: 10889 // result: (RSB x a) 10890 for { 10891 _ = v.Args[2] 10892 v_0 := v.Args[0] 10893 if v_0.Op != OpARMMOVWconst { 10894 break 10895 } 10896 if v_0.AuxInt != 1 { 10897 break 10898 } 10899 x := v.Args[1] 10900 a := v.Args[2] 10901 v.reset(OpARMRSB) 10902 v.AddArg(x) 10903 v.AddArg(a) 10904 return true 10905 } 10906 // match: (MULS (MOVWconst [c]) x a) 10907 // cond: isPowerOfTwo(c) 10908 // result: (RSB (SLLconst <x.Type> [log2(c)] x) a) 10909 for { 10910 _ = v.Args[2] 10911 v_0 := v.Args[0] 10912 if v_0.Op != OpARMMOVWconst { 10913 break 10914 } 10915 c := v_0.AuxInt 10916 x := v.Args[1] 10917 a := v.Args[2] 10918 if !(isPowerOfTwo(c)) { 10919 break 10920 } 10921 v.reset(OpARMRSB) 10922 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10923 v0.AuxInt = log2(c) 10924 v0.AddArg(x) 10925 v.AddArg(v0) 10926 v.AddArg(a) 10927 return true 10928 } 10929 // match: (MULS (MOVWconst [c]) x a) 10930 // cond: isPowerOfTwo(c-1) && int32(c) >= 3 10931 // result: (RSB (ADDshiftLL <x.Type> x x [log2(c-1)]) a) 10932 for { 10933 _ = v.Args[2] 10934 v_0 := v.Args[0] 10935 if v_0.Op != OpARMMOVWconst { 10936 break 10937 } 10938 c := v_0.AuxInt 10939 x := v.Args[1] 10940 a := v.Args[2] 10941 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { 10942 break 10943 } 10944 v.reset(OpARMRSB) 10945 v0 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10946 v0.AuxInt = log2(c - 1) 10947 v0.AddArg(x) 10948 v0.AddArg(x) 10949 v.AddArg(v0) 10950 v.AddArg(a) 10951 return true 10952 } 10953 // match: (MULS (MOVWconst [c]) x a) 10954 // cond: isPowerOfTwo(c+1) && int32(c) >= 7 10955 // result: (RSB (RSBshiftLL <x.Type> x x [log2(c+1)]) a) 10956 for { 10957 _ = v.Args[2] 10958 v_0 := v.Args[0] 10959 if v_0.Op != OpARMMOVWconst { 10960 break 10961 } 10962 c := v_0.AuxInt 10963 x := v.Args[1] 10964 a := v.Args[2] 10965 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { 10966 break 10967 } 10968 v.reset(OpARMRSB) 10969 v0 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 10970 v0.AuxInt = log2(c + 1) 10971 v0.AddArg(x) 10972 v0.AddArg(x) 10973 v.AddArg(v0) 10974 v.AddArg(a) 10975 return true 10976 } 10977 // match: (MULS (MOVWconst [c]) x a) 10978 // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) 10979 // result: (RSB (SLLconst <x.Type> [log2(c/3)] (ADDshiftLL <x.Type> x x [1])) a) 10980 for { 10981 _ = v.Args[2] 10982 v_0 := v.Args[0] 10983 if v_0.Op != OpARMMOVWconst { 10984 break 10985 } 10986 c := v_0.AuxInt 10987 x := v.Args[1] 10988 a := v.Args[2] 10989 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { 10990 break 10991 } 10992 v.reset(OpARMRSB) 10993 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 10994 v0.AuxInt = log2(c / 3) 10995 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 10996 v1.AuxInt = 1 10997 v1.AddArg(x) 10998 v1.AddArg(x) 10999 v0.AddArg(v1) 11000 v.AddArg(v0) 11001 v.AddArg(a) 11002 return true 11003 } 11004 // match: (MULS (MOVWconst [c]) x a) 11005 // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) 11006 // result: (RSB (SLLconst <x.Type> [log2(c/5)] (ADDshiftLL <x.Type> x x [2])) a) 11007 for { 11008 _ = v.Args[2] 11009 v_0 := v.Args[0] 11010 if v_0.Op != OpARMMOVWconst { 11011 break 11012 } 11013 c := v_0.AuxInt 11014 x := v.Args[1] 11015 a := v.Args[2] 11016 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { 11017 break 11018 } 11019 v.reset(OpARMRSB) 11020 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11021 v0.AuxInt = log2(c / 5) 11022 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 11023 v1.AuxInt = 2 11024 v1.AddArg(x) 11025 v1.AddArg(x) 11026 v0.AddArg(v1) 11027 v.AddArg(v0) 11028 v.AddArg(a) 11029 return true 11030 } 11031 // match: (MULS (MOVWconst [c]) x a) 11032 // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) 11033 // result: (RSB (SLLconst <x.Type> [log2(c/7)] (RSBshiftLL <x.Type> x x [3])) a) 11034 for { 11035 _ = v.Args[2] 11036 v_0 := v.Args[0] 11037 if v_0.Op != OpARMMOVWconst { 11038 break 11039 } 11040 c := v_0.AuxInt 11041 x := v.Args[1] 11042 a := v.Args[2] 11043 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { 11044 break 11045 } 11046 v.reset(OpARMRSB) 11047 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11048 v0.AuxInt = log2(c / 7) 11049 v1 := b.NewValue0(v.Pos, OpARMRSBshiftLL, x.Type) 11050 v1.AuxInt = 3 11051 v1.AddArg(x) 11052 v1.AddArg(x) 11053 v0.AddArg(v1) 11054 v.AddArg(v0) 11055 v.AddArg(a) 11056 return true 11057 } 11058 // match: (MULS (MOVWconst [c]) x a) 11059 // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) 11060 // result: (RSB (SLLconst <x.Type> [log2(c/9)] (ADDshiftLL <x.Type> x x [3])) a) 11061 for { 11062 _ = v.Args[2] 11063 v_0 := v.Args[0] 11064 if v_0.Op != OpARMMOVWconst { 11065 break 11066 } 11067 c := v_0.AuxInt 11068 x := v.Args[1] 11069 a := v.Args[2] 11070 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { 11071 break 11072 } 11073 v.reset(OpARMRSB) 11074 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11075 v0.AuxInt = log2(c / 9) 11076 v1 := b.NewValue0(v.Pos, OpARMADDshiftLL, x.Type) 11077 v1.AuxInt = 3 11078 v1.AddArg(x) 11079 v1.AddArg(x) 11080 v0.AddArg(v1) 11081 v.AddArg(v0) 11082 v.AddArg(a) 11083 return true 11084 } 11085 return false 11086 } 11087 func rewriteValueARM_OpARMMULS_20(v *Value) bool { 11088 // match: (MULS (MOVWconst [c]) (MOVWconst [d]) a) 11089 // cond: 11090 // result: (SUBconst [int64(int32(c*d))] a) 11091 for { 11092 _ = v.Args[2] 11093 v_0 := v.Args[0] 11094 if v_0.Op != OpARMMOVWconst { 11095 break 11096 } 11097 c := v_0.AuxInt 11098 v_1 := v.Args[1] 11099 if v_1.Op != OpARMMOVWconst { 11100 break 11101 } 11102 d := v_1.AuxInt 11103 a := v.Args[2] 11104 v.reset(OpARMSUBconst) 11105 v.AuxInt = int64(int32(c * d)) 11106 v.AddArg(a) 11107 return true 11108 } 11109 return false 11110 } 11111 func rewriteValueARM_OpARMMVN_0(v *Value) bool { 11112 // match: (MVN (MOVWconst [c])) 11113 // cond: 11114 // result: (MOVWconst [^c]) 11115 for { 11116 v_0 := v.Args[0] 11117 if v_0.Op != OpARMMOVWconst { 11118 break 11119 } 11120 c := v_0.AuxInt 11121 v.reset(OpARMMOVWconst) 11122 v.AuxInt = ^c 11123 return true 11124 } 11125 // match: (MVN (SLLconst [c] x)) 11126 // cond: 11127 // result: (MVNshiftLL x [c]) 11128 for { 11129 v_0 := v.Args[0] 11130 if v_0.Op != OpARMSLLconst { 11131 break 11132 } 11133 c := v_0.AuxInt 11134 x := v_0.Args[0] 11135 v.reset(OpARMMVNshiftLL) 11136 v.AuxInt = c 11137 v.AddArg(x) 11138 return true 11139 } 11140 // match: (MVN (SRLconst [c] x)) 11141 // cond: 11142 // result: (MVNshiftRL x [c]) 11143 for { 11144 v_0 := v.Args[0] 11145 if v_0.Op != OpARMSRLconst { 11146 break 11147 } 11148 c := v_0.AuxInt 11149 x := v_0.Args[0] 11150 v.reset(OpARMMVNshiftRL) 11151 v.AuxInt = c 11152 v.AddArg(x) 11153 return true 11154 } 11155 // match: (MVN (SRAconst [c] x)) 11156 // cond: 11157 // result: (MVNshiftRA x [c]) 11158 for { 11159 v_0 := v.Args[0] 11160 if v_0.Op != OpARMSRAconst { 11161 break 11162 } 11163 c := v_0.AuxInt 11164 x := v_0.Args[0] 11165 v.reset(OpARMMVNshiftRA) 11166 v.AuxInt = c 11167 v.AddArg(x) 11168 return true 11169 } 11170 // match: (MVN (SLL x y)) 11171 // cond: 11172 // result: (MVNshiftLLreg x y) 11173 for { 11174 v_0 := v.Args[0] 11175 if v_0.Op != OpARMSLL { 11176 break 11177 } 11178 _ = v_0.Args[1] 11179 x := v_0.Args[0] 11180 y := v_0.Args[1] 11181 v.reset(OpARMMVNshiftLLreg) 11182 v.AddArg(x) 11183 v.AddArg(y) 11184 return true 11185 } 11186 // match: (MVN (SRL x y)) 11187 // cond: 11188 // result: (MVNshiftRLreg x y) 11189 for { 11190 v_0 := v.Args[0] 11191 if v_0.Op != OpARMSRL { 11192 break 11193 } 11194 _ = v_0.Args[1] 11195 x := v_0.Args[0] 11196 y := v_0.Args[1] 11197 v.reset(OpARMMVNshiftRLreg) 11198 v.AddArg(x) 11199 v.AddArg(y) 11200 return true 11201 } 11202 // match: (MVN (SRA x y)) 11203 // cond: 11204 // result: (MVNshiftRAreg x y) 11205 for { 11206 v_0 := v.Args[0] 11207 if v_0.Op != OpARMSRA { 11208 break 11209 } 11210 _ = v_0.Args[1] 11211 x := v_0.Args[0] 11212 y := v_0.Args[1] 11213 v.reset(OpARMMVNshiftRAreg) 11214 v.AddArg(x) 11215 v.AddArg(y) 11216 return true 11217 } 11218 return false 11219 } 11220 func rewriteValueARM_OpARMMVNshiftLL_0(v *Value) bool { 11221 // match: (MVNshiftLL (MOVWconst [c]) [d]) 11222 // cond: 11223 // result: (MOVWconst [^int64(uint32(c)<<uint64(d))]) 11224 for { 11225 d := v.AuxInt 11226 v_0 := v.Args[0] 11227 if v_0.Op != OpARMMOVWconst { 11228 break 11229 } 11230 c := v_0.AuxInt 11231 v.reset(OpARMMOVWconst) 11232 v.AuxInt = ^int64(uint32(c) << uint64(d)) 11233 return true 11234 } 11235 return false 11236 } 11237 func rewriteValueARM_OpARMMVNshiftLLreg_0(v *Value) bool { 11238 // match: (MVNshiftLLreg x (MOVWconst [c])) 11239 // cond: 11240 // result: (MVNshiftLL x [c]) 11241 for { 11242 _ = v.Args[1] 11243 x := v.Args[0] 11244 v_1 := v.Args[1] 11245 if v_1.Op != OpARMMOVWconst { 11246 break 11247 } 11248 c := v_1.AuxInt 11249 v.reset(OpARMMVNshiftLL) 11250 v.AuxInt = c 11251 v.AddArg(x) 11252 return true 11253 } 11254 return false 11255 } 11256 func rewriteValueARM_OpARMMVNshiftRA_0(v *Value) bool { 11257 // match: (MVNshiftRA (MOVWconst [c]) [d]) 11258 // cond: 11259 // result: (MOVWconst [^int64(int32(c)>>uint64(d))]) 11260 for { 11261 d := v.AuxInt 11262 v_0 := v.Args[0] 11263 if v_0.Op != OpARMMOVWconst { 11264 break 11265 } 11266 c := v_0.AuxInt 11267 v.reset(OpARMMOVWconst) 11268 v.AuxInt = ^int64(int32(c) >> uint64(d)) 11269 return true 11270 } 11271 return false 11272 } 11273 func rewriteValueARM_OpARMMVNshiftRAreg_0(v *Value) bool { 11274 // match: (MVNshiftRAreg x (MOVWconst [c])) 11275 // cond: 11276 // result: (MVNshiftRA x [c]) 11277 for { 11278 _ = v.Args[1] 11279 x := v.Args[0] 11280 v_1 := v.Args[1] 11281 if v_1.Op != OpARMMOVWconst { 11282 break 11283 } 11284 c := v_1.AuxInt 11285 v.reset(OpARMMVNshiftRA) 11286 v.AuxInt = c 11287 v.AddArg(x) 11288 return true 11289 } 11290 return false 11291 } 11292 func rewriteValueARM_OpARMMVNshiftRL_0(v *Value) bool { 11293 // match: (MVNshiftRL (MOVWconst [c]) [d]) 11294 // cond: 11295 // result: (MOVWconst [^int64(uint32(c)>>uint64(d))]) 11296 for { 11297 d := v.AuxInt 11298 v_0 := v.Args[0] 11299 if v_0.Op != OpARMMOVWconst { 11300 break 11301 } 11302 c := v_0.AuxInt 11303 v.reset(OpARMMOVWconst) 11304 v.AuxInt = ^int64(uint32(c) >> uint64(d)) 11305 return true 11306 } 11307 return false 11308 } 11309 func rewriteValueARM_OpARMMVNshiftRLreg_0(v *Value) bool { 11310 // match: (MVNshiftRLreg x (MOVWconst [c])) 11311 // cond: 11312 // result: (MVNshiftRL x [c]) 11313 for { 11314 _ = v.Args[1] 11315 x := v.Args[0] 11316 v_1 := v.Args[1] 11317 if v_1.Op != OpARMMOVWconst { 11318 break 11319 } 11320 c := v_1.AuxInt 11321 v.reset(OpARMMVNshiftRL) 11322 v.AuxInt = c 11323 v.AddArg(x) 11324 return true 11325 } 11326 return false 11327 } 11328 func rewriteValueARM_OpARMNEGD_0(v *Value) bool { 11329 // match: (NEGD (MULD x y)) 11330 // cond: objabi.GOARM >= 6 11331 // result: (NMULD x y) 11332 for { 11333 v_0 := v.Args[0] 11334 if v_0.Op != OpARMMULD { 11335 break 11336 } 11337 _ = v_0.Args[1] 11338 x := v_0.Args[0] 11339 y := v_0.Args[1] 11340 if !(objabi.GOARM >= 6) { 11341 break 11342 } 11343 v.reset(OpARMNMULD) 11344 v.AddArg(x) 11345 v.AddArg(y) 11346 return true 11347 } 11348 return false 11349 } 11350 func rewriteValueARM_OpARMNEGF_0(v *Value) bool { 11351 // match: (NEGF (MULF x y)) 11352 // cond: objabi.GOARM >= 6 11353 // result: (NMULF x y) 11354 for { 11355 v_0 := v.Args[0] 11356 if v_0.Op != OpARMMULF { 11357 break 11358 } 11359 _ = v_0.Args[1] 11360 x := v_0.Args[0] 11361 y := v_0.Args[1] 11362 if !(objabi.GOARM >= 6) { 11363 break 11364 } 11365 v.reset(OpARMNMULF) 11366 v.AddArg(x) 11367 v.AddArg(y) 11368 return true 11369 } 11370 return false 11371 } 11372 func rewriteValueARM_OpARMNMULD_0(v *Value) bool { 11373 // match: (NMULD (NEGD x) y) 11374 // cond: 11375 // result: (MULD x y) 11376 for { 11377 _ = v.Args[1] 11378 v_0 := v.Args[0] 11379 if v_0.Op != OpARMNEGD { 11380 break 11381 } 11382 x := v_0.Args[0] 11383 y := v.Args[1] 11384 v.reset(OpARMMULD) 11385 v.AddArg(x) 11386 v.AddArg(y) 11387 return true 11388 } 11389 // match: (NMULD y (NEGD x)) 11390 // cond: 11391 // result: (MULD x y) 11392 for { 11393 _ = v.Args[1] 11394 y := v.Args[0] 11395 v_1 := v.Args[1] 11396 if v_1.Op != OpARMNEGD { 11397 break 11398 } 11399 x := v_1.Args[0] 11400 v.reset(OpARMMULD) 11401 v.AddArg(x) 11402 v.AddArg(y) 11403 return true 11404 } 11405 return false 11406 } 11407 func rewriteValueARM_OpARMNMULF_0(v *Value) bool { 11408 // match: (NMULF (NEGF x) y) 11409 // cond: 11410 // result: (MULF x y) 11411 for { 11412 _ = v.Args[1] 11413 v_0 := v.Args[0] 11414 if v_0.Op != OpARMNEGF { 11415 break 11416 } 11417 x := v_0.Args[0] 11418 y := v.Args[1] 11419 v.reset(OpARMMULF) 11420 v.AddArg(x) 11421 v.AddArg(y) 11422 return true 11423 } 11424 // match: (NMULF y (NEGF x)) 11425 // cond: 11426 // result: (MULF x y) 11427 for { 11428 _ = v.Args[1] 11429 y := v.Args[0] 11430 v_1 := v.Args[1] 11431 if v_1.Op != OpARMNEGF { 11432 break 11433 } 11434 x := v_1.Args[0] 11435 v.reset(OpARMMULF) 11436 v.AddArg(x) 11437 v.AddArg(y) 11438 return true 11439 } 11440 return false 11441 } 11442 func rewriteValueARM_OpARMNotEqual_0(v *Value) bool { 11443 // match: (NotEqual (FlagEQ)) 11444 // cond: 11445 // result: (MOVWconst [0]) 11446 for { 11447 v_0 := v.Args[0] 11448 if v_0.Op != OpARMFlagEQ { 11449 break 11450 } 11451 v.reset(OpARMMOVWconst) 11452 v.AuxInt = 0 11453 return true 11454 } 11455 // match: (NotEqual (FlagLT_ULT)) 11456 // cond: 11457 // result: (MOVWconst [1]) 11458 for { 11459 v_0 := v.Args[0] 11460 if v_0.Op != OpARMFlagLT_ULT { 11461 break 11462 } 11463 v.reset(OpARMMOVWconst) 11464 v.AuxInt = 1 11465 return true 11466 } 11467 // match: (NotEqual (FlagLT_UGT)) 11468 // cond: 11469 // result: (MOVWconst [1]) 11470 for { 11471 v_0 := v.Args[0] 11472 if v_0.Op != OpARMFlagLT_UGT { 11473 break 11474 } 11475 v.reset(OpARMMOVWconst) 11476 v.AuxInt = 1 11477 return true 11478 } 11479 // match: (NotEqual (FlagGT_ULT)) 11480 // cond: 11481 // result: (MOVWconst [1]) 11482 for { 11483 v_0 := v.Args[0] 11484 if v_0.Op != OpARMFlagGT_ULT { 11485 break 11486 } 11487 v.reset(OpARMMOVWconst) 11488 v.AuxInt = 1 11489 return true 11490 } 11491 // match: (NotEqual (FlagGT_UGT)) 11492 // cond: 11493 // result: (MOVWconst [1]) 11494 for { 11495 v_0 := v.Args[0] 11496 if v_0.Op != OpARMFlagGT_UGT { 11497 break 11498 } 11499 v.reset(OpARMMOVWconst) 11500 v.AuxInt = 1 11501 return true 11502 } 11503 // match: (NotEqual (InvertFlags x)) 11504 // cond: 11505 // result: (NotEqual x) 11506 for { 11507 v_0 := v.Args[0] 11508 if v_0.Op != OpARMInvertFlags { 11509 break 11510 } 11511 x := v_0.Args[0] 11512 v.reset(OpARMNotEqual) 11513 v.AddArg(x) 11514 return true 11515 } 11516 return false 11517 } 11518 func rewriteValueARM_OpARMOR_0(v *Value) bool { 11519 // match: (OR x (MOVWconst [c])) 11520 // cond: 11521 // result: (ORconst [c] x) 11522 for { 11523 _ = v.Args[1] 11524 x := v.Args[0] 11525 v_1 := v.Args[1] 11526 if v_1.Op != OpARMMOVWconst { 11527 break 11528 } 11529 c := v_1.AuxInt 11530 v.reset(OpARMORconst) 11531 v.AuxInt = c 11532 v.AddArg(x) 11533 return true 11534 } 11535 // match: (OR (MOVWconst [c]) x) 11536 // cond: 11537 // result: (ORconst [c] x) 11538 for { 11539 _ = v.Args[1] 11540 v_0 := v.Args[0] 11541 if v_0.Op != OpARMMOVWconst { 11542 break 11543 } 11544 c := v_0.AuxInt 11545 x := v.Args[1] 11546 v.reset(OpARMORconst) 11547 v.AuxInt = c 11548 v.AddArg(x) 11549 return true 11550 } 11551 // match: (OR x (SLLconst [c] y)) 11552 // cond: 11553 // result: (ORshiftLL x y [c]) 11554 for { 11555 _ = v.Args[1] 11556 x := v.Args[0] 11557 v_1 := v.Args[1] 11558 if v_1.Op != OpARMSLLconst { 11559 break 11560 } 11561 c := v_1.AuxInt 11562 y := v_1.Args[0] 11563 v.reset(OpARMORshiftLL) 11564 v.AuxInt = c 11565 v.AddArg(x) 11566 v.AddArg(y) 11567 return true 11568 } 11569 // match: (OR (SLLconst [c] y) x) 11570 // cond: 11571 // result: (ORshiftLL x y [c]) 11572 for { 11573 _ = v.Args[1] 11574 v_0 := v.Args[0] 11575 if v_0.Op != OpARMSLLconst { 11576 break 11577 } 11578 c := v_0.AuxInt 11579 y := v_0.Args[0] 11580 x := v.Args[1] 11581 v.reset(OpARMORshiftLL) 11582 v.AuxInt = c 11583 v.AddArg(x) 11584 v.AddArg(y) 11585 return true 11586 } 11587 // match: (OR x (SRLconst [c] y)) 11588 // cond: 11589 // result: (ORshiftRL x y [c]) 11590 for { 11591 _ = v.Args[1] 11592 x := v.Args[0] 11593 v_1 := v.Args[1] 11594 if v_1.Op != OpARMSRLconst { 11595 break 11596 } 11597 c := v_1.AuxInt 11598 y := v_1.Args[0] 11599 v.reset(OpARMORshiftRL) 11600 v.AuxInt = c 11601 v.AddArg(x) 11602 v.AddArg(y) 11603 return true 11604 } 11605 // match: (OR (SRLconst [c] y) x) 11606 // cond: 11607 // result: (ORshiftRL x y [c]) 11608 for { 11609 _ = v.Args[1] 11610 v_0 := v.Args[0] 11611 if v_0.Op != OpARMSRLconst { 11612 break 11613 } 11614 c := v_0.AuxInt 11615 y := v_0.Args[0] 11616 x := v.Args[1] 11617 v.reset(OpARMORshiftRL) 11618 v.AuxInt = c 11619 v.AddArg(x) 11620 v.AddArg(y) 11621 return true 11622 } 11623 // match: (OR x (SRAconst [c] y)) 11624 // cond: 11625 // result: (ORshiftRA x y [c]) 11626 for { 11627 _ = v.Args[1] 11628 x := v.Args[0] 11629 v_1 := v.Args[1] 11630 if v_1.Op != OpARMSRAconst { 11631 break 11632 } 11633 c := v_1.AuxInt 11634 y := v_1.Args[0] 11635 v.reset(OpARMORshiftRA) 11636 v.AuxInt = c 11637 v.AddArg(x) 11638 v.AddArg(y) 11639 return true 11640 } 11641 // match: (OR (SRAconst [c] y) x) 11642 // cond: 11643 // result: (ORshiftRA x y [c]) 11644 for { 11645 _ = v.Args[1] 11646 v_0 := v.Args[0] 11647 if v_0.Op != OpARMSRAconst { 11648 break 11649 } 11650 c := v_0.AuxInt 11651 y := v_0.Args[0] 11652 x := v.Args[1] 11653 v.reset(OpARMORshiftRA) 11654 v.AuxInt = c 11655 v.AddArg(x) 11656 v.AddArg(y) 11657 return true 11658 } 11659 // match: (OR x (SLL y z)) 11660 // cond: 11661 // result: (ORshiftLLreg x y z) 11662 for { 11663 _ = v.Args[1] 11664 x := v.Args[0] 11665 v_1 := v.Args[1] 11666 if v_1.Op != OpARMSLL { 11667 break 11668 } 11669 _ = v_1.Args[1] 11670 y := v_1.Args[0] 11671 z := v_1.Args[1] 11672 v.reset(OpARMORshiftLLreg) 11673 v.AddArg(x) 11674 v.AddArg(y) 11675 v.AddArg(z) 11676 return true 11677 } 11678 // match: (OR (SLL y z) x) 11679 // cond: 11680 // result: (ORshiftLLreg x y z) 11681 for { 11682 _ = v.Args[1] 11683 v_0 := v.Args[0] 11684 if v_0.Op != OpARMSLL { 11685 break 11686 } 11687 _ = v_0.Args[1] 11688 y := v_0.Args[0] 11689 z := v_0.Args[1] 11690 x := v.Args[1] 11691 v.reset(OpARMORshiftLLreg) 11692 v.AddArg(x) 11693 v.AddArg(y) 11694 v.AddArg(z) 11695 return true 11696 } 11697 return false 11698 } 11699 func rewriteValueARM_OpARMOR_10(v *Value) bool { 11700 // match: (OR x (SRL y z)) 11701 // cond: 11702 // result: (ORshiftRLreg x y z) 11703 for { 11704 _ = v.Args[1] 11705 x := v.Args[0] 11706 v_1 := v.Args[1] 11707 if v_1.Op != OpARMSRL { 11708 break 11709 } 11710 _ = v_1.Args[1] 11711 y := v_1.Args[0] 11712 z := v_1.Args[1] 11713 v.reset(OpARMORshiftRLreg) 11714 v.AddArg(x) 11715 v.AddArg(y) 11716 v.AddArg(z) 11717 return true 11718 } 11719 // match: (OR (SRL y z) x) 11720 // cond: 11721 // result: (ORshiftRLreg x y z) 11722 for { 11723 _ = v.Args[1] 11724 v_0 := v.Args[0] 11725 if v_0.Op != OpARMSRL { 11726 break 11727 } 11728 _ = v_0.Args[1] 11729 y := v_0.Args[0] 11730 z := v_0.Args[1] 11731 x := v.Args[1] 11732 v.reset(OpARMORshiftRLreg) 11733 v.AddArg(x) 11734 v.AddArg(y) 11735 v.AddArg(z) 11736 return true 11737 } 11738 // match: (OR x (SRA y z)) 11739 // cond: 11740 // result: (ORshiftRAreg x y z) 11741 for { 11742 _ = v.Args[1] 11743 x := v.Args[0] 11744 v_1 := v.Args[1] 11745 if v_1.Op != OpARMSRA { 11746 break 11747 } 11748 _ = v_1.Args[1] 11749 y := v_1.Args[0] 11750 z := v_1.Args[1] 11751 v.reset(OpARMORshiftRAreg) 11752 v.AddArg(x) 11753 v.AddArg(y) 11754 v.AddArg(z) 11755 return true 11756 } 11757 // match: (OR (SRA y z) x) 11758 // cond: 11759 // result: (ORshiftRAreg x y z) 11760 for { 11761 _ = v.Args[1] 11762 v_0 := v.Args[0] 11763 if v_0.Op != OpARMSRA { 11764 break 11765 } 11766 _ = v_0.Args[1] 11767 y := v_0.Args[0] 11768 z := v_0.Args[1] 11769 x := v.Args[1] 11770 v.reset(OpARMORshiftRAreg) 11771 v.AddArg(x) 11772 v.AddArg(y) 11773 v.AddArg(z) 11774 return true 11775 } 11776 // match: (OR x x) 11777 // cond: 11778 // result: x 11779 for { 11780 _ = v.Args[1] 11781 x := v.Args[0] 11782 if x != v.Args[1] { 11783 break 11784 } 11785 v.reset(OpCopy) 11786 v.Type = x.Type 11787 v.AddArg(x) 11788 return true 11789 } 11790 return false 11791 } 11792 func rewriteValueARM_OpARMORconst_0(v *Value) bool { 11793 // match: (ORconst [0] x) 11794 // cond: 11795 // result: x 11796 for { 11797 if v.AuxInt != 0 { 11798 break 11799 } 11800 x := v.Args[0] 11801 v.reset(OpCopy) 11802 v.Type = x.Type 11803 v.AddArg(x) 11804 return true 11805 } 11806 // match: (ORconst [c] _) 11807 // cond: int32(c)==-1 11808 // result: (MOVWconst [-1]) 11809 for { 11810 c := v.AuxInt 11811 if !(int32(c) == -1) { 11812 break 11813 } 11814 v.reset(OpARMMOVWconst) 11815 v.AuxInt = -1 11816 return true 11817 } 11818 // match: (ORconst [c] (MOVWconst [d])) 11819 // cond: 11820 // result: (MOVWconst [c|d]) 11821 for { 11822 c := v.AuxInt 11823 v_0 := v.Args[0] 11824 if v_0.Op != OpARMMOVWconst { 11825 break 11826 } 11827 d := v_0.AuxInt 11828 v.reset(OpARMMOVWconst) 11829 v.AuxInt = c | d 11830 return true 11831 } 11832 // match: (ORconst [c] (ORconst [d] x)) 11833 // cond: 11834 // result: (ORconst [c|d] x) 11835 for { 11836 c := v.AuxInt 11837 v_0 := v.Args[0] 11838 if v_0.Op != OpARMORconst { 11839 break 11840 } 11841 d := v_0.AuxInt 11842 x := v_0.Args[0] 11843 v.reset(OpARMORconst) 11844 v.AuxInt = c | d 11845 v.AddArg(x) 11846 return true 11847 } 11848 return false 11849 } 11850 func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { 11851 b := v.Block 11852 _ = b 11853 // match: (ORshiftLL (MOVWconst [c]) x [d]) 11854 // cond: 11855 // result: (ORconst [c] (SLLconst <x.Type> x [d])) 11856 for { 11857 d := v.AuxInt 11858 _ = v.Args[1] 11859 v_0 := v.Args[0] 11860 if v_0.Op != OpARMMOVWconst { 11861 break 11862 } 11863 c := v_0.AuxInt 11864 x := v.Args[1] 11865 v.reset(OpARMORconst) 11866 v.AuxInt = c 11867 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 11868 v0.AuxInt = d 11869 v0.AddArg(x) 11870 v.AddArg(v0) 11871 return true 11872 } 11873 // match: (ORshiftLL x (MOVWconst [c]) [d]) 11874 // cond: 11875 // result: (ORconst x [int64(int32(uint32(c)<<uint64(d)))]) 11876 for { 11877 d := v.AuxInt 11878 _ = v.Args[1] 11879 x := v.Args[0] 11880 v_1 := v.Args[1] 11881 if v_1.Op != OpARMMOVWconst { 11882 break 11883 } 11884 c := v_1.AuxInt 11885 v.reset(OpARMORconst) 11886 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 11887 v.AddArg(x) 11888 return true 11889 } 11890 // match: (ORshiftLL [c] (SRLconst x [32-c]) x) 11891 // cond: 11892 // result: (SRRconst [32-c] x) 11893 for { 11894 c := v.AuxInt 11895 _ = v.Args[1] 11896 v_0 := v.Args[0] 11897 if v_0.Op != OpARMSRLconst { 11898 break 11899 } 11900 if v_0.AuxInt != 32-c { 11901 break 11902 } 11903 x := v_0.Args[0] 11904 if x != v.Args[1] { 11905 break 11906 } 11907 v.reset(OpARMSRRconst) 11908 v.AuxInt = 32 - c 11909 v.AddArg(x) 11910 return true 11911 } 11912 // match: (ORshiftLL x y:(SLLconst x [c]) [d]) 11913 // cond: c==d 11914 // result: y 11915 for { 11916 d := v.AuxInt 11917 _ = v.Args[1] 11918 x := v.Args[0] 11919 y := v.Args[1] 11920 if y.Op != OpARMSLLconst { 11921 break 11922 } 11923 c := y.AuxInt 11924 if x != y.Args[0] { 11925 break 11926 } 11927 if !(c == d) { 11928 break 11929 } 11930 v.reset(OpCopy) 11931 v.Type = y.Type 11932 v.AddArg(y) 11933 return true 11934 } 11935 return false 11936 } 11937 func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { 11938 b := v.Block 11939 _ = b 11940 // match: (ORshiftLLreg (MOVWconst [c]) x y) 11941 // cond: 11942 // result: (ORconst [c] (SLL <x.Type> x y)) 11943 for { 11944 _ = v.Args[2] 11945 v_0 := v.Args[0] 11946 if v_0.Op != OpARMMOVWconst { 11947 break 11948 } 11949 c := v_0.AuxInt 11950 x := v.Args[1] 11951 y := v.Args[2] 11952 v.reset(OpARMORconst) 11953 v.AuxInt = c 11954 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 11955 v0.AddArg(x) 11956 v0.AddArg(y) 11957 v.AddArg(v0) 11958 return true 11959 } 11960 // match: (ORshiftLLreg x y (MOVWconst [c])) 11961 // cond: 11962 // result: (ORshiftLL x y [c]) 11963 for { 11964 _ = v.Args[2] 11965 x := v.Args[0] 11966 y := v.Args[1] 11967 v_2 := v.Args[2] 11968 if v_2.Op != OpARMMOVWconst { 11969 break 11970 } 11971 c := v_2.AuxInt 11972 v.reset(OpARMORshiftLL) 11973 v.AuxInt = c 11974 v.AddArg(x) 11975 v.AddArg(y) 11976 return true 11977 } 11978 return false 11979 } 11980 func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { 11981 b := v.Block 11982 _ = b 11983 // match: (ORshiftRA (MOVWconst [c]) x [d]) 11984 // cond: 11985 // result: (ORconst [c] (SRAconst <x.Type> x [d])) 11986 for { 11987 d := v.AuxInt 11988 _ = v.Args[1] 11989 v_0 := v.Args[0] 11990 if v_0.Op != OpARMMOVWconst { 11991 break 11992 } 11993 c := v_0.AuxInt 11994 x := v.Args[1] 11995 v.reset(OpARMORconst) 11996 v.AuxInt = c 11997 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 11998 v0.AuxInt = d 11999 v0.AddArg(x) 12000 v.AddArg(v0) 12001 return true 12002 } 12003 // match: (ORshiftRA x (MOVWconst [c]) [d]) 12004 // cond: 12005 // result: (ORconst x [int64(int32(c)>>uint64(d))]) 12006 for { 12007 d := v.AuxInt 12008 _ = v.Args[1] 12009 x := v.Args[0] 12010 v_1 := v.Args[1] 12011 if v_1.Op != OpARMMOVWconst { 12012 break 12013 } 12014 c := v_1.AuxInt 12015 v.reset(OpARMORconst) 12016 v.AuxInt = int64(int32(c) >> uint64(d)) 12017 v.AddArg(x) 12018 return true 12019 } 12020 // match: (ORshiftRA x y:(SRAconst x [c]) [d]) 12021 // cond: c==d 12022 // result: y 12023 for { 12024 d := v.AuxInt 12025 _ = v.Args[1] 12026 x := v.Args[0] 12027 y := v.Args[1] 12028 if y.Op != OpARMSRAconst { 12029 break 12030 } 12031 c := y.AuxInt 12032 if x != y.Args[0] { 12033 break 12034 } 12035 if !(c == d) { 12036 break 12037 } 12038 v.reset(OpCopy) 12039 v.Type = y.Type 12040 v.AddArg(y) 12041 return true 12042 } 12043 return false 12044 } 12045 func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { 12046 b := v.Block 12047 _ = b 12048 // match: (ORshiftRAreg (MOVWconst [c]) x y) 12049 // cond: 12050 // result: (ORconst [c] (SRA <x.Type> x y)) 12051 for { 12052 _ = v.Args[2] 12053 v_0 := v.Args[0] 12054 if v_0.Op != OpARMMOVWconst { 12055 break 12056 } 12057 c := v_0.AuxInt 12058 x := v.Args[1] 12059 y := v.Args[2] 12060 v.reset(OpARMORconst) 12061 v.AuxInt = c 12062 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12063 v0.AddArg(x) 12064 v0.AddArg(y) 12065 v.AddArg(v0) 12066 return true 12067 } 12068 // match: (ORshiftRAreg x y (MOVWconst [c])) 12069 // cond: 12070 // result: (ORshiftRA x y [c]) 12071 for { 12072 _ = v.Args[2] 12073 x := v.Args[0] 12074 y := v.Args[1] 12075 v_2 := v.Args[2] 12076 if v_2.Op != OpARMMOVWconst { 12077 break 12078 } 12079 c := v_2.AuxInt 12080 v.reset(OpARMORshiftRA) 12081 v.AuxInt = c 12082 v.AddArg(x) 12083 v.AddArg(y) 12084 return true 12085 } 12086 return false 12087 } 12088 func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { 12089 b := v.Block 12090 _ = b 12091 // match: (ORshiftRL (MOVWconst [c]) x [d]) 12092 // cond: 12093 // result: (ORconst [c] (SRLconst <x.Type> x [d])) 12094 for { 12095 d := v.AuxInt 12096 _ = v.Args[1] 12097 v_0 := v.Args[0] 12098 if v_0.Op != OpARMMOVWconst { 12099 break 12100 } 12101 c := v_0.AuxInt 12102 x := v.Args[1] 12103 v.reset(OpARMORconst) 12104 v.AuxInt = c 12105 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12106 v0.AuxInt = d 12107 v0.AddArg(x) 12108 v.AddArg(v0) 12109 return true 12110 } 12111 // match: (ORshiftRL x (MOVWconst [c]) [d]) 12112 // cond: 12113 // result: (ORconst x [int64(int32(uint32(c)>>uint64(d)))]) 12114 for { 12115 d := v.AuxInt 12116 _ = v.Args[1] 12117 x := v.Args[0] 12118 v_1 := v.Args[1] 12119 if v_1.Op != OpARMMOVWconst { 12120 break 12121 } 12122 c := v_1.AuxInt 12123 v.reset(OpARMORconst) 12124 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 12125 v.AddArg(x) 12126 return true 12127 } 12128 // match: (ORshiftRL [c] (SLLconst x [32-c]) x) 12129 // cond: 12130 // result: (SRRconst [ c] x) 12131 for { 12132 c := v.AuxInt 12133 _ = v.Args[1] 12134 v_0 := v.Args[0] 12135 if v_0.Op != OpARMSLLconst { 12136 break 12137 } 12138 if v_0.AuxInt != 32-c { 12139 break 12140 } 12141 x := v_0.Args[0] 12142 if x != v.Args[1] { 12143 break 12144 } 12145 v.reset(OpARMSRRconst) 12146 v.AuxInt = c 12147 v.AddArg(x) 12148 return true 12149 } 12150 // match: (ORshiftRL x y:(SRLconst x [c]) [d]) 12151 // cond: c==d 12152 // result: y 12153 for { 12154 d := v.AuxInt 12155 _ = v.Args[1] 12156 x := v.Args[0] 12157 y := v.Args[1] 12158 if y.Op != OpARMSRLconst { 12159 break 12160 } 12161 c := y.AuxInt 12162 if x != y.Args[0] { 12163 break 12164 } 12165 if !(c == d) { 12166 break 12167 } 12168 v.reset(OpCopy) 12169 v.Type = y.Type 12170 v.AddArg(y) 12171 return true 12172 } 12173 return false 12174 } 12175 func rewriteValueARM_OpARMORshiftRLreg_0(v *Value) bool { 12176 b := v.Block 12177 _ = b 12178 // match: (ORshiftRLreg (MOVWconst [c]) x y) 12179 // cond: 12180 // result: (ORconst [c] (SRL <x.Type> x y)) 12181 for { 12182 _ = v.Args[2] 12183 v_0 := v.Args[0] 12184 if v_0.Op != OpARMMOVWconst { 12185 break 12186 } 12187 c := v_0.AuxInt 12188 x := v.Args[1] 12189 y := v.Args[2] 12190 v.reset(OpARMORconst) 12191 v.AuxInt = c 12192 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12193 v0.AddArg(x) 12194 v0.AddArg(y) 12195 v.AddArg(v0) 12196 return true 12197 } 12198 // match: (ORshiftRLreg x y (MOVWconst [c])) 12199 // cond: 12200 // result: (ORshiftRL x y [c]) 12201 for { 12202 _ = v.Args[2] 12203 x := v.Args[0] 12204 y := v.Args[1] 12205 v_2 := v.Args[2] 12206 if v_2.Op != OpARMMOVWconst { 12207 break 12208 } 12209 c := v_2.AuxInt 12210 v.reset(OpARMORshiftRL) 12211 v.AuxInt = c 12212 v.AddArg(x) 12213 v.AddArg(y) 12214 return true 12215 } 12216 return false 12217 } 12218 func rewriteValueARM_OpARMRSB_0(v *Value) bool { 12219 // match: (RSB (MOVWconst [c]) x) 12220 // cond: 12221 // result: (SUBconst [c] x) 12222 for { 12223 _ = v.Args[1] 12224 v_0 := v.Args[0] 12225 if v_0.Op != OpARMMOVWconst { 12226 break 12227 } 12228 c := v_0.AuxInt 12229 x := v.Args[1] 12230 v.reset(OpARMSUBconst) 12231 v.AuxInt = c 12232 v.AddArg(x) 12233 return true 12234 } 12235 // match: (RSB x (MOVWconst [c])) 12236 // cond: 12237 // result: (RSBconst [c] x) 12238 for { 12239 _ = v.Args[1] 12240 x := v.Args[0] 12241 v_1 := v.Args[1] 12242 if v_1.Op != OpARMMOVWconst { 12243 break 12244 } 12245 c := v_1.AuxInt 12246 v.reset(OpARMRSBconst) 12247 v.AuxInt = c 12248 v.AddArg(x) 12249 return true 12250 } 12251 // match: (RSB x (SLLconst [c] y)) 12252 // cond: 12253 // result: (RSBshiftLL x y [c]) 12254 for { 12255 _ = v.Args[1] 12256 x := v.Args[0] 12257 v_1 := v.Args[1] 12258 if v_1.Op != OpARMSLLconst { 12259 break 12260 } 12261 c := v_1.AuxInt 12262 y := v_1.Args[0] 12263 v.reset(OpARMRSBshiftLL) 12264 v.AuxInt = c 12265 v.AddArg(x) 12266 v.AddArg(y) 12267 return true 12268 } 12269 // match: (RSB (SLLconst [c] y) x) 12270 // cond: 12271 // result: (SUBshiftLL x y [c]) 12272 for { 12273 _ = v.Args[1] 12274 v_0 := v.Args[0] 12275 if v_0.Op != OpARMSLLconst { 12276 break 12277 } 12278 c := v_0.AuxInt 12279 y := v_0.Args[0] 12280 x := v.Args[1] 12281 v.reset(OpARMSUBshiftLL) 12282 v.AuxInt = c 12283 v.AddArg(x) 12284 v.AddArg(y) 12285 return true 12286 } 12287 // match: (RSB x (SRLconst [c] y)) 12288 // cond: 12289 // result: (RSBshiftRL x y [c]) 12290 for { 12291 _ = v.Args[1] 12292 x := v.Args[0] 12293 v_1 := v.Args[1] 12294 if v_1.Op != OpARMSRLconst { 12295 break 12296 } 12297 c := v_1.AuxInt 12298 y := v_1.Args[0] 12299 v.reset(OpARMRSBshiftRL) 12300 v.AuxInt = c 12301 v.AddArg(x) 12302 v.AddArg(y) 12303 return true 12304 } 12305 // match: (RSB (SRLconst [c] y) x) 12306 // cond: 12307 // result: (SUBshiftRL x y [c]) 12308 for { 12309 _ = v.Args[1] 12310 v_0 := v.Args[0] 12311 if v_0.Op != OpARMSRLconst { 12312 break 12313 } 12314 c := v_0.AuxInt 12315 y := v_0.Args[0] 12316 x := v.Args[1] 12317 v.reset(OpARMSUBshiftRL) 12318 v.AuxInt = c 12319 v.AddArg(x) 12320 v.AddArg(y) 12321 return true 12322 } 12323 // match: (RSB x (SRAconst [c] y)) 12324 // cond: 12325 // result: (RSBshiftRA x y [c]) 12326 for { 12327 _ = v.Args[1] 12328 x := v.Args[0] 12329 v_1 := v.Args[1] 12330 if v_1.Op != OpARMSRAconst { 12331 break 12332 } 12333 c := v_1.AuxInt 12334 y := v_1.Args[0] 12335 v.reset(OpARMRSBshiftRA) 12336 v.AuxInt = c 12337 v.AddArg(x) 12338 v.AddArg(y) 12339 return true 12340 } 12341 // match: (RSB (SRAconst [c] y) x) 12342 // cond: 12343 // result: (SUBshiftRA x y [c]) 12344 for { 12345 _ = v.Args[1] 12346 v_0 := v.Args[0] 12347 if v_0.Op != OpARMSRAconst { 12348 break 12349 } 12350 c := v_0.AuxInt 12351 y := v_0.Args[0] 12352 x := v.Args[1] 12353 v.reset(OpARMSUBshiftRA) 12354 v.AuxInt = c 12355 v.AddArg(x) 12356 v.AddArg(y) 12357 return true 12358 } 12359 // match: (RSB x (SLL y z)) 12360 // cond: 12361 // result: (RSBshiftLLreg x y z) 12362 for { 12363 _ = v.Args[1] 12364 x := v.Args[0] 12365 v_1 := v.Args[1] 12366 if v_1.Op != OpARMSLL { 12367 break 12368 } 12369 _ = v_1.Args[1] 12370 y := v_1.Args[0] 12371 z := v_1.Args[1] 12372 v.reset(OpARMRSBshiftLLreg) 12373 v.AddArg(x) 12374 v.AddArg(y) 12375 v.AddArg(z) 12376 return true 12377 } 12378 // match: (RSB (SLL y z) x) 12379 // cond: 12380 // result: (SUBshiftLLreg x y z) 12381 for { 12382 _ = v.Args[1] 12383 v_0 := v.Args[0] 12384 if v_0.Op != OpARMSLL { 12385 break 12386 } 12387 _ = v_0.Args[1] 12388 y := v_0.Args[0] 12389 z := v_0.Args[1] 12390 x := v.Args[1] 12391 v.reset(OpARMSUBshiftLLreg) 12392 v.AddArg(x) 12393 v.AddArg(y) 12394 v.AddArg(z) 12395 return true 12396 } 12397 return false 12398 } 12399 func rewriteValueARM_OpARMRSB_10(v *Value) bool { 12400 // match: (RSB x (SRL y z)) 12401 // cond: 12402 // result: (RSBshiftRLreg x y z) 12403 for { 12404 _ = v.Args[1] 12405 x := v.Args[0] 12406 v_1 := v.Args[1] 12407 if v_1.Op != OpARMSRL { 12408 break 12409 } 12410 _ = v_1.Args[1] 12411 y := v_1.Args[0] 12412 z := v_1.Args[1] 12413 v.reset(OpARMRSBshiftRLreg) 12414 v.AddArg(x) 12415 v.AddArg(y) 12416 v.AddArg(z) 12417 return true 12418 } 12419 // match: (RSB (SRL y z) x) 12420 // cond: 12421 // result: (SUBshiftRLreg x y z) 12422 for { 12423 _ = v.Args[1] 12424 v_0 := v.Args[0] 12425 if v_0.Op != OpARMSRL { 12426 break 12427 } 12428 _ = v_0.Args[1] 12429 y := v_0.Args[0] 12430 z := v_0.Args[1] 12431 x := v.Args[1] 12432 v.reset(OpARMSUBshiftRLreg) 12433 v.AddArg(x) 12434 v.AddArg(y) 12435 v.AddArg(z) 12436 return true 12437 } 12438 // match: (RSB x (SRA y z)) 12439 // cond: 12440 // result: (RSBshiftRAreg x y z) 12441 for { 12442 _ = v.Args[1] 12443 x := v.Args[0] 12444 v_1 := v.Args[1] 12445 if v_1.Op != OpARMSRA { 12446 break 12447 } 12448 _ = v_1.Args[1] 12449 y := v_1.Args[0] 12450 z := v_1.Args[1] 12451 v.reset(OpARMRSBshiftRAreg) 12452 v.AddArg(x) 12453 v.AddArg(y) 12454 v.AddArg(z) 12455 return true 12456 } 12457 // match: (RSB (SRA y z) x) 12458 // cond: 12459 // result: (SUBshiftRAreg x y z) 12460 for { 12461 _ = v.Args[1] 12462 v_0 := v.Args[0] 12463 if v_0.Op != OpARMSRA { 12464 break 12465 } 12466 _ = v_0.Args[1] 12467 y := v_0.Args[0] 12468 z := v_0.Args[1] 12469 x := v.Args[1] 12470 v.reset(OpARMSUBshiftRAreg) 12471 v.AddArg(x) 12472 v.AddArg(y) 12473 v.AddArg(z) 12474 return true 12475 } 12476 // match: (RSB x x) 12477 // cond: 12478 // result: (MOVWconst [0]) 12479 for { 12480 _ = v.Args[1] 12481 x := v.Args[0] 12482 if x != v.Args[1] { 12483 break 12484 } 12485 v.reset(OpARMMOVWconst) 12486 v.AuxInt = 0 12487 return true 12488 } 12489 // match: (RSB (MUL x y) a) 12490 // cond: objabi.GOARM == 7 12491 // result: (MULS x y a) 12492 for { 12493 _ = v.Args[1] 12494 v_0 := v.Args[0] 12495 if v_0.Op != OpARMMUL { 12496 break 12497 } 12498 _ = v_0.Args[1] 12499 x := v_0.Args[0] 12500 y := v_0.Args[1] 12501 a := v.Args[1] 12502 if !(objabi.GOARM == 7) { 12503 break 12504 } 12505 v.reset(OpARMMULS) 12506 v.AddArg(x) 12507 v.AddArg(y) 12508 v.AddArg(a) 12509 return true 12510 } 12511 return false 12512 } 12513 func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { 12514 b := v.Block 12515 _ = b 12516 // match: (RSBSshiftLL (MOVWconst [c]) x [d]) 12517 // cond: 12518 // result: (SUBSconst [c] (SLLconst <x.Type> x [d])) 12519 for { 12520 d := v.AuxInt 12521 _ = v.Args[1] 12522 v_0 := v.Args[0] 12523 if v_0.Op != OpARMMOVWconst { 12524 break 12525 } 12526 c := v_0.AuxInt 12527 x := v.Args[1] 12528 v.reset(OpARMSUBSconst) 12529 v.AuxInt = c 12530 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12531 v0.AuxInt = d 12532 v0.AddArg(x) 12533 v.AddArg(v0) 12534 return true 12535 } 12536 // match: (RSBSshiftLL x (MOVWconst [c]) [d]) 12537 // cond: 12538 // result: (RSBSconst x [int64(int32(uint32(c)<<uint64(d)))]) 12539 for { 12540 d := v.AuxInt 12541 _ = v.Args[1] 12542 x := v.Args[0] 12543 v_1 := v.Args[1] 12544 if v_1.Op != OpARMMOVWconst { 12545 break 12546 } 12547 c := v_1.AuxInt 12548 v.reset(OpARMRSBSconst) 12549 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 12550 v.AddArg(x) 12551 return true 12552 } 12553 return false 12554 } 12555 func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { 12556 b := v.Block 12557 _ = b 12558 // match: (RSBSshiftLLreg (MOVWconst [c]) x y) 12559 // cond: 12560 // result: (SUBSconst [c] (SLL <x.Type> x y)) 12561 for { 12562 _ = v.Args[2] 12563 v_0 := v.Args[0] 12564 if v_0.Op != OpARMMOVWconst { 12565 break 12566 } 12567 c := v_0.AuxInt 12568 x := v.Args[1] 12569 y := v.Args[2] 12570 v.reset(OpARMSUBSconst) 12571 v.AuxInt = c 12572 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12573 v0.AddArg(x) 12574 v0.AddArg(y) 12575 v.AddArg(v0) 12576 return true 12577 } 12578 // match: (RSBSshiftLLreg x y (MOVWconst [c])) 12579 // cond: 12580 // result: (RSBSshiftLL x y [c]) 12581 for { 12582 _ = v.Args[2] 12583 x := v.Args[0] 12584 y := v.Args[1] 12585 v_2 := v.Args[2] 12586 if v_2.Op != OpARMMOVWconst { 12587 break 12588 } 12589 c := v_2.AuxInt 12590 v.reset(OpARMRSBSshiftLL) 12591 v.AuxInt = c 12592 v.AddArg(x) 12593 v.AddArg(y) 12594 return true 12595 } 12596 return false 12597 } 12598 func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { 12599 b := v.Block 12600 _ = b 12601 // match: (RSBSshiftRA (MOVWconst [c]) x [d]) 12602 // cond: 12603 // result: (SUBSconst [c] (SRAconst <x.Type> x [d])) 12604 for { 12605 d := v.AuxInt 12606 _ = v.Args[1] 12607 v_0 := v.Args[0] 12608 if v_0.Op != OpARMMOVWconst { 12609 break 12610 } 12611 c := v_0.AuxInt 12612 x := v.Args[1] 12613 v.reset(OpARMSUBSconst) 12614 v.AuxInt = c 12615 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12616 v0.AuxInt = d 12617 v0.AddArg(x) 12618 v.AddArg(v0) 12619 return true 12620 } 12621 // match: (RSBSshiftRA x (MOVWconst [c]) [d]) 12622 // cond: 12623 // result: (RSBSconst x [int64(int32(c)>>uint64(d))]) 12624 for { 12625 d := v.AuxInt 12626 _ = v.Args[1] 12627 x := v.Args[0] 12628 v_1 := v.Args[1] 12629 if v_1.Op != OpARMMOVWconst { 12630 break 12631 } 12632 c := v_1.AuxInt 12633 v.reset(OpARMRSBSconst) 12634 v.AuxInt = int64(int32(c) >> uint64(d)) 12635 v.AddArg(x) 12636 return true 12637 } 12638 return false 12639 } 12640 func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { 12641 b := v.Block 12642 _ = b 12643 // match: (RSBSshiftRAreg (MOVWconst [c]) x y) 12644 // cond: 12645 // result: (SUBSconst [c] (SRA <x.Type> x y)) 12646 for { 12647 _ = v.Args[2] 12648 v_0 := v.Args[0] 12649 if v_0.Op != OpARMMOVWconst { 12650 break 12651 } 12652 c := v_0.AuxInt 12653 x := v.Args[1] 12654 y := v.Args[2] 12655 v.reset(OpARMSUBSconst) 12656 v.AuxInt = c 12657 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 12658 v0.AddArg(x) 12659 v0.AddArg(y) 12660 v.AddArg(v0) 12661 return true 12662 } 12663 // match: (RSBSshiftRAreg x y (MOVWconst [c])) 12664 // cond: 12665 // result: (RSBSshiftRA x y [c]) 12666 for { 12667 _ = v.Args[2] 12668 x := v.Args[0] 12669 y := v.Args[1] 12670 v_2 := v.Args[2] 12671 if v_2.Op != OpARMMOVWconst { 12672 break 12673 } 12674 c := v_2.AuxInt 12675 v.reset(OpARMRSBSshiftRA) 12676 v.AuxInt = c 12677 v.AddArg(x) 12678 v.AddArg(y) 12679 return true 12680 } 12681 return false 12682 } 12683 func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { 12684 b := v.Block 12685 _ = b 12686 // match: (RSBSshiftRL (MOVWconst [c]) x [d]) 12687 // cond: 12688 // result: (SUBSconst [c] (SRLconst <x.Type> x [d])) 12689 for { 12690 d := v.AuxInt 12691 _ = v.Args[1] 12692 v_0 := v.Args[0] 12693 if v_0.Op != OpARMMOVWconst { 12694 break 12695 } 12696 c := v_0.AuxInt 12697 x := v.Args[1] 12698 v.reset(OpARMSUBSconst) 12699 v.AuxInt = c 12700 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 12701 v0.AuxInt = d 12702 v0.AddArg(x) 12703 v.AddArg(v0) 12704 return true 12705 } 12706 // match: (RSBSshiftRL x (MOVWconst [c]) [d]) 12707 // cond: 12708 // result: (RSBSconst x [int64(int32(uint32(c)>>uint64(d)))]) 12709 for { 12710 d := v.AuxInt 12711 _ = v.Args[1] 12712 x := v.Args[0] 12713 v_1 := v.Args[1] 12714 if v_1.Op != OpARMMOVWconst { 12715 break 12716 } 12717 c := v_1.AuxInt 12718 v.reset(OpARMRSBSconst) 12719 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 12720 v.AddArg(x) 12721 return true 12722 } 12723 return false 12724 } 12725 func rewriteValueARM_OpARMRSBSshiftRLreg_0(v *Value) bool { 12726 b := v.Block 12727 _ = b 12728 // match: (RSBSshiftRLreg (MOVWconst [c]) x y) 12729 // cond: 12730 // result: (SUBSconst [c] (SRL <x.Type> x y)) 12731 for { 12732 _ = v.Args[2] 12733 v_0 := v.Args[0] 12734 if v_0.Op != OpARMMOVWconst { 12735 break 12736 } 12737 c := v_0.AuxInt 12738 x := v.Args[1] 12739 y := v.Args[2] 12740 v.reset(OpARMSUBSconst) 12741 v.AuxInt = c 12742 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 12743 v0.AddArg(x) 12744 v0.AddArg(y) 12745 v.AddArg(v0) 12746 return true 12747 } 12748 // match: (RSBSshiftRLreg x y (MOVWconst [c])) 12749 // cond: 12750 // result: (RSBSshiftRL x y [c]) 12751 for { 12752 _ = v.Args[2] 12753 x := v.Args[0] 12754 y := v.Args[1] 12755 v_2 := v.Args[2] 12756 if v_2.Op != OpARMMOVWconst { 12757 break 12758 } 12759 c := v_2.AuxInt 12760 v.reset(OpARMRSBSshiftRL) 12761 v.AuxInt = c 12762 v.AddArg(x) 12763 v.AddArg(y) 12764 return true 12765 } 12766 return false 12767 } 12768 func rewriteValueARM_OpARMRSBconst_0(v *Value) bool { 12769 // match: (RSBconst [c] (MOVWconst [d])) 12770 // cond: 12771 // result: (MOVWconst [int64(int32(c-d))]) 12772 for { 12773 c := v.AuxInt 12774 v_0 := v.Args[0] 12775 if v_0.Op != OpARMMOVWconst { 12776 break 12777 } 12778 d := v_0.AuxInt 12779 v.reset(OpARMMOVWconst) 12780 v.AuxInt = int64(int32(c - d)) 12781 return true 12782 } 12783 // match: (RSBconst [c] (RSBconst [d] x)) 12784 // cond: 12785 // result: (ADDconst [int64(int32(c-d))] x) 12786 for { 12787 c := v.AuxInt 12788 v_0 := v.Args[0] 12789 if v_0.Op != OpARMRSBconst { 12790 break 12791 } 12792 d := v_0.AuxInt 12793 x := v_0.Args[0] 12794 v.reset(OpARMADDconst) 12795 v.AuxInt = int64(int32(c - d)) 12796 v.AddArg(x) 12797 return true 12798 } 12799 // match: (RSBconst [c] (ADDconst [d] x)) 12800 // cond: 12801 // result: (RSBconst [int64(int32(c-d))] x) 12802 for { 12803 c := v.AuxInt 12804 v_0 := v.Args[0] 12805 if v_0.Op != OpARMADDconst { 12806 break 12807 } 12808 d := v_0.AuxInt 12809 x := v_0.Args[0] 12810 v.reset(OpARMRSBconst) 12811 v.AuxInt = int64(int32(c - d)) 12812 v.AddArg(x) 12813 return true 12814 } 12815 // match: (RSBconst [c] (SUBconst [d] x)) 12816 // cond: 12817 // result: (RSBconst [int64(int32(c+d))] x) 12818 for { 12819 c := v.AuxInt 12820 v_0 := v.Args[0] 12821 if v_0.Op != OpARMSUBconst { 12822 break 12823 } 12824 d := v_0.AuxInt 12825 x := v_0.Args[0] 12826 v.reset(OpARMRSBconst) 12827 v.AuxInt = int64(int32(c + d)) 12828 v.AddArg(x) 12829 return true 12830 } 12831 return false 12832 } 12833 func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { 12834 b := v.Block 12835 _ = b 12836 // match: (RSBshiftLL (MOVWconst [c]) x [d]) 12837 // cond: 12838 // result: (SUBconst [c] (SLLconst <x.Type> x [d])) 12839 for { 12840 d := v.AuxInt 12841 _ = v.Args[1] 12842 v_0 := v.Args[0] 12843 if v_0.Op != OpARMMOVWconst { 12844 break 12845 } 12846 c := v_0.AuxInt 12847 x := v.Args[1] 12848 v.reset(OpARMSUBconst) 12849 v.AuxInt = c 12850 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 12851 v0.AuxInt = d 12852 v0.AddArg(x) 12853 v.AddArg(v0) 12854 return true 12855 } 12856 // match: (RSBshiftLL x (MOVWconst [c]) [d]) 12857 // cond: 12858 // result: (RSBconst x [int64(int32(uint32(c)<<uint64(d)))]) 12859 for { 12860 d := v.AuxInt 12861 _ = v.Args[1] 12862 x := v.Args[0] 12863 v_1 := v.Args[1] 12864 if v_1.Op != OpARMMOVWconst { 12865 break 12866 } 12867 c := v_1.AuxInt 12868 v.reset(OpARMRSBconst) 12869 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 12870 v.AddArg(x) 12871 return true 12872 } 12873 // match: (RSBshiftLL x (SLLconst x [c]) [d]) 12874 // cond: c==d 12875 // result: (MOVWconst [0]) 12876 for { 12877 d := v.AuxInt 12878 _ = v.Args[1] 12879 x := v.Args[0] 12880 v_1 := v.Args[1] 12881 if v_1.Op != OpARMSLLconst { 12882 break 12883 } 12884 c := v_1.AuxInt 12885 if x != v_1.Args[0] { 12886 break 12887 } 12888 if !(c == d) { 12889 break 12890 } 12891 v.reset(OpARMMOVWconst) 12892 v.AuxInt = 0 12893 return true 12894 } 12895 return false 12896 } 12897 func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { 12898 b := v.Block 12899 _ = b 12900 // match: (RSBshiftLLreg (MOVWconst [c]) x y) 12901 // cond: 12902 // result: (SUBconst [c] (SLL <x.Type> x y)) 12903 for { 12904 _ = v.Args[2] 12905 v_0 := v.Args[0] 12906 if v_0.Op != OpARMMOVWconst { 12907 break 12908 } 12909 c := v_0.AuxInt 12910 x := v.Args[1] 12911 y := v.Args[2] 12912 v.reset(OpARMSUBconst) 12913 v.AuxInt = c 12914 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 12915 v0.AddArg(x) 12916 v0.AddArg(y) 12917 v.AddArg(v0) 12918 return true 12919 } 12920 // match: (RSBshiftLLreg x y (MOVWconst [c])) 12921 // cond: 12922 // result: (RSBshiftLL x y [c]) 12923 for { 12924 _ = v.Args[2] 12925 x := v.Args[0] 12926 y := v.Args[1] 12927 v_2 := v.Args[2] 12928 if v_2.Op != OpARMMOVWconst { 12929 break 12930 } 12931 c := v_2.AuxInt 12932 v.reset(OpARMRSBshiftLL) 12933 v.AuxInt = c 12934 v.AddArg(x) 12935 v.AddArg(y) 12936 return true 12937 } 12938 return false 12939 } 12940 func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { 12941 b := v.Block 12942 _ = b 12943 // match: (RSBshiftRA (MOVWconst [c]) x [d]) 12944 // cond: 12945 // result: (SUBconst [c] (SRAconst <x.Type> x [d])) 12946 for { 12947 d := v.AuxInt 12948 _ = v.Args[1] 12949 v_0 := v.Args[0] 12950 if v_0.Op != OpARMMOVWconst { 12951 break 12952 } 12953 c := v_0.AuxInt 12954 x := v.Args[1] 12955 v.reset(OpARMSUBconst) 12956 v.AuxInt = c 12957 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 12958 v0.AuxInt = d 12959 v0.AddArg(x) 12960 v.AddArg(v0) 12961 return true 12962 } 12963 // match: (RSBshiftRA x (MOVWconst [c]) [d]) 12964 // cond: 12965 // result: (RSBconst x [int64(int32(c)>>uint64(d))]) 12966 for { 12967 d := v.AuxInt 12968 _ = v.Args[1] 12969 x := v.Args[0] 12970 v_1 := v.Args[1] 12971 if v_1.Op != OpARMMOVWconst { 12972 break 12973 } 12974 c := v_1.AuxInt 12975 v.reset(OpARMRSBconst) 12976 v.AuxInt = int64(int32(c) >> uint64(d)) 12977 v.AddArg(x) 12978 return true 12979 } 12980 // match: (RSBshiftRA x (SRAconst x [c]) [d]) 12981 // cond: c==d 12982 // result: (MOVWconst [0]) 12983 for { 12984 d := v.AuxInt 12985 _ = v.Args[1] 12986 x := v.Args[0] 12987 v_1 := v.Args[1] 12988 if v_1.Op != OpARMSRAconst { 12989 break 12990 } 12991 c := v_1.AuxInt 12992 if x != v_1.Args[0] { 12993 break 12994 } 12995 if !(c == d) { 12996 break 12997 } 12998 v.reset(OpARMMOVWconst) 12999 v.AuxInt = 0 13000 return true 13001 } 13002 return false 13003 } 13004 func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { 13005 b := v.Block 13006 _ = b 13007 // match: (RSBshiftRAreg (MOVWconst [c]) x y) 13008 // cond: 13009 // result: (SUBconst [c] (SRA <x.Type> x y)) 13010 for { 13011 _ = v.Args[2] 13012 v_0 := v.Args[0] 13013 if v_0.Op != OpARMMOVWconst { 13014 break 13015 } 13016 c := v_0.AuxInt 13017 x := v.Args[1] 13018 y := v.Args[2] 13019 v.reset(OpARMSUBconst) 13020 v.AuxInt = c 13021 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13022 v0.AddArg(x) 13023 v0.AddArg(y) 13024 v.AddArg(v0) 13025 return true 13026 } 13027 // match: (RSBshiftRAreg x y (MOVWconst [c])) 13028 // cond: 13029 // result: (RSBshiftRA x y [c]) 13030 for { 13031 _ = v.Args[2] 13032 x := v.Args[0] 13033 y := v.Args[1] 13034 v_2 := v.Args[2] 13035 if v_2.Op != OpARMMOVWconst { 13036 break 13037 } 13038 c := v_2.AuxInt 13039 v.reset(OpARMRSBshiftRA) 13040 v.AuxInt = c 13041 v.AddArg(x) 13042 v.AddArg(y) 13043 return true 13044 } 13045 return false 13046 } 13047 func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { 13048 b := v.Block 13049 _ = b 13050 // match: (RSBshiftRL (MOVWconst [c]) x [d]) 13051 // cond: 13052 // result: (SUBconst [c] (SRLconst <x.Type> x [d])) 13053 for { 13054 d := v.AuxInt 13055 _ = v.Args[1] 13056 v_0 := v.Args[0] 13057 if v_0.Op != OpARMMOVWconst { 13058 break 13059 } 13060 c := v_0.AuxInt 13061 x := v.Args[1] 13062 v.reset(OpARMSUBconst) 13063 v.AuxInt = c 13064 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13065 v0.AuxInt = d 13066 v0.AddArg(x) 13067 v.AddArg(v0) 13068 return true 13069 } 13070 // match: (RSBshiftRL x (MOVWconst [c]) [d]) 13071 // cond: 13072 // result: (RSBconst x [int64(int32(uint32(c)>>uint64(d)))]) 13073 for { 13074 d := v.AuxInt 13075 _ = v.Args[1] 13076 x := v.Args[0] 13077 v_1 := v.Args[1] 13078 if v_1.Op != OpARMMOVWconst { 13079 break 13080 } 13081 c := v_1.AuxInt 13082 v.reset(OpARMRSBconst) 13083 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 13084 v.AddArg(x) 13085 return true 13086 } 13087 // match: (RSBshiftRL x (SRLconst x [c]) [d]) 13088 // cond: c==d 13089 // result: (MOVWconst [0]) 13090 for { 13091 d := v.AuxInt 13092 _ = v.Args[1] 13093 x := v.Args[0] 13094 v_1 := v.Args[1] 13095 if v_1.Op != OpARMSRLconst { 13096 break 13097 } 13098 c := v_1.AuxInt 13099 if x != v_1.Args[0] { 13100 break 13101 } 13102 if !(c == d) { 13103 break 13104 } 13105 v.reset(OpARMMOVWconst) 13106 v.AuxInt = 0 13107 return true 13108 } 13109 return false 13110 } 13111 func rewriteValueARM_OpARMRSBshiftRLreg_0(v *Value) bool { 13112 b := v.Block 13113 _ = b 13114 // match: (RSBshiftRLreg (MOVWconst [c]) x y) 13115 // cond: 13116 // result: (SUBconst [c] (SRL <x.Type> x y)) 13117 for { 13118 _ = v.Args[2] 13119 v_0 := v.Args[0] 13120 if v_0.Op != OpARMMOVWconst { 13121 break 13122 } 13123 c := v_0.AuxInt 13124 x := v.Args[1] 13125 y := v.Args[2] 13126 v.reset(OpARMSUBconst) 13127 v.AuxInt = c 13128 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13129 v0.AddArg(x) 13130 v0.AddArg(y) 13131 v.AddArg(v0) 13132 return true 13133 } 13134 // match: (RSBshiftRLreg x y (MOVWconst [c])) 13135 // cond: 13136 // result: (RSBshiftRL x y [c]) 13137 for { 13138 _ = v.Args[2] 13139 x := v.Args[0] 13140 y := v.Args[1] 13141 v_2 := v.Args[2] 13142 if v_2.Op != OpARMMOVWconst { 13143 break 13144 } 13145 c := v_2.AuxInt 13146 v.reset(OpARMRSBshiftRL) 13147 v.AuxInt = c 13148 v.AddArg(x) 13149 v.AddArg(y) 13150 return true 13151 } 13152 return false 13153 } 13154 func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { 13155 // match: (RSCconst [c] (ADDconst [d] x) flags) 13156 // cond: 13157 // result: (RSCconst [int64(int32(c-d))] x flags) 13158 for { 13159 c := v.AuxInt 13160 _ = v.Args[1] 13161 v_0 := v.Args[0] 13162 if v_0.Op != OpARMADDconst { 13163 break 13164 } 13165 d := v_0.AuxInt 13166 x := v_0.Args[0] 13167 flags := v.Args[1] 13168 v.reset(OpARMRSCconst) 13169 v.AuxInt = int64(int32(c - d)) 13170 v.AddArg(x) 13171 v.AddArg(flags) 13172 return true 13173 } 13174 // match: (RSCconst [c] (SUBconst [d] x) flags) 13175 // cond: 13176 // result: (RSCconst [int64(int32(c+d))] x flags) 13177 for { 13178 c := v.AuxInt 13179 _ = v.Args[1] 13180 v_0 := v.Args[0] 13181 if v_0.Op != OpARMSUBconst { 13182 break 13183 } 13184 d := v_0.AuxInt 13185 x := v_0.Args[0] 13186 flags := v.Args[1] 13187 v.reset(OpARMRSCconst) 13188 v.AuxInt = int64(int32(c + d)) 13189 v.AddArg(x) 13190 v.AddArg(flags) 13191 return true 13192 } 13193 return false 13194 } 13195 func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { 13196 b := v.Block 13197 _ = b 13198 // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) 13199 // cond: 13200 // result: (SBCconst [c] (SLLconst <x.Type> x [d]) flags) 13201 for { 13202 d := v.AuxInt 13203 _ = v.Args[2] 13204 v_0 := v.Args[0] 13205 if v_0.Op != OpARMMOVWconst { 13206 break 13207 } 13208 c := v_0.AuxInt 13209 x := v.Args[1] 13210 flags := v.Args[2] 13211 v.reset(OpARMSBCconst) 13212 v.AuxInt = c 13213 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 13214 v0.AuxInt = d 13215 v0.AddArg(x) 13216 v.AddArg(v0) 13217 v.AddArg(flags) 13218 return true 13219 } 13220 // match: (RSCshiftLL x (MOVWconst [c]) [d] flags) 13221 // cond: 13222 // result: (RSCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 13223 for { 13224 d := v.AuxInt 13225 _ = v.Args[2] 13226 x := v.Args[0] 13227 v_1 := v.Args[1] 13228 if v_1.Op != OpARMMOVWconst { 13229 break 13230 } 13231 c := v_1.AuxInt 13232 flags := v.Args[2] 13233 v.reset(OpARMRSCconst) 13234 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 13235 v.AddArg(x) 13236 v.AddArg(flags) 13237 return true 13238 } 13239 return false 13240 } 13241 func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { 13242 b := v.Block 13243 _ = b 13244 // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) 13245 // cond: 13246 // result: (SBCconst [c] (SLL <x.Type> x y) flags) 13247 for { 13248 _ = v.Args[3] 13249 v_0 := v.Args[0] 13250 if v_0.Op != OpARMMOVWconst { 13251 break 13252 } 13253 c := v_0.AuxInt 13254 x := v.Args[1] 13255 y := v.Args[2] 13256 flags := v.Args[3] 13257 v.reset(OpARMSBCconst) 13258 v.AuxInt = c 13259 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13260 v0.AddArg(x) 13261 v0.AddArg(y) 13262 v.AddArg(v0) 13263 v.AddArg(flags) 13264 return true 13265 } 13266 // match: (RSCshiftLLreg x y (MOVWconst [c]) flags) 13267 // cond: 13268 // result: (RSCshiftLL x y [c] flags) 13269 for { 13270 _ = v.Args[3] 13271 x := v.Args[0] 13272 y := v.Args[1] 13273 v_2 := v.Args[2] 13274 if v_2.Op != OpARMMOVWconst { 13275 break 13276 } 13277 c := v_2.AuxInt 13278 flags := v.Args[3] 13279 v.reset(OpARMRSCshiftLL) 13280 v.AuxInt = c 13281 v.AddArg(x) 13282 v.AddArg(y) 13283 v.AddArg(flags) 13284 return true 13285 } 13286 return false 13287 } 13288 func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { 13289 b := v.Block 13290 _ = b 13291 // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) 13292 // cond: 13293 // result: (SBCconst [c] (SRAconst <x.Type> x [d]) flags) 13294 for { 13295 d := v.AuxInt 13296 _ = v.Args[2] 13297 v_0 := v.Args[0] 13298 if v_0.Op != OpARMMOVWconst { 13299 break 13300 } 13301 c := v_0.AuxInt 13302 x := v.Args[1] 13303 flags := v.Args[2] 13304 v.reset(OpARMSBCconst) 13305 v.AuxInt = c 13306 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13307 v0.AuxInt = d 13308 v0.AddArg(x) 13309 v.AddArg(v0) 13310 v.AddArg(flags) 13311 return true 13312 } 13313 // match: (RSCshiftRA x (MOVWconst [c]) [d] flags) 13314 // cond: 13315 // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) 13316 for { 13317 d := v.AuxInt 13318 _ = v.Args[2] 13319 x := v.Args[0] 13320 v_1 := v.Args[1] 13321 if v_1.Op != OpARMMOVWconst { 13322 break 13323 } 13324 c := v_1.AuxInt 13325 flags := v.Args[2] 13326 v.reset(OpARMRSCconst) 13327 v.AuxInt = int64(int32(c) >> uint64(d)) 13328 v.AddArg(x) 13329 v.AddArg(flags) 13330 return true 13331 } 13332 return false 13333 } 13334 func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { 13335 b := v.Block 13336 _ = b 13337 // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) 13338 // cond: 13339 // result: (SBCconst [c] (SRA <x.Type> x y) flags) 13340 for { 13341 _ = v.Args[3] 13342 v_0 := v.Args[0] 13343 if v_0.Op != OpARMMOVWconst { 13344 break 13345 } 13346 c := v_0.AuxInt 13347 x := v.Args[1] 13348 y := v.Args[2] 13349 flags := v.Args[3] 13350 v.reset(OpARMSBCconst) 13351 v.AuxInt = c 13352 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13353 v0.AddArg(x) 13354 v0.AddArg(y) 13355 v.AddArg(v0) 13356 v.AddArg(flags) 13357 return true 13358 } 13359 // match: (RSCshiftRAreg x y (MOVWconst [c]) flags) 13360 // cond: 13361 // result: (RSCshiftRA x y [c] flags) 13362 for { 13363 _ = v.Args[3] 13364 x := v.Args[0] 13365 y := v.Args[1] 13366 v_2 := v.Args[2] 13367 if v_2.Op != OpARMMOVWconst { 13368 break 13369 } 13370 c := v_2.AuxInt 13371 flags := v.Args[3] 13372 v.reset(OpARMRSCshiftRA) 13373 v.AuxInt = c 13374 v.AddArg(x) 13375 v.AddArg(y) 13376 v.AddArg(flags) 13377 return true 13378 } 13379 return false 13380 } 13381 func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { 13382 b := v.Block 13383 _ = b 13384 // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) 13385 // cond: 13386 // result: (SBCconst [c] (SRLconst <x.Type> x [d]) flags) 13387 for { 13388 d := v.AuxInt 13389 _ = v.Args[2] 13390 v_0 := v.Args[0] 13391 if v_0.Op != OpARMMOVWconst { 13392 break 13393 } 13394 c := v_0.AuxInt 13395 x := v.Args[1] 13396 flags := v.Args[2] 13397 v.reset(OpARMSBCconst) 13398 v.AuxInt = c 13399 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 13400 v0.AuxInt = d 13401 v0.AddArg(x) 13402 v.AddArg(v0) 13403 v.AddArg(flags) 13404 return true 13405 } 13406 // match: (RSCshiftRL x (MOVWconst [c]) [d] flags) 13407 // cond: 13408 // result: (RSCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 13409 for { 13410 d := v.AuxInt 13411 _ = v.Args[2] 13412 x := v.Args[0] 13413 v_1 := v.Args[1] 13414 if v_1.Op != OpARMMOVWconst { 13415 break 13416 } 13417 c := v_1.AuxInt 13418 flags := v.Args[2] 13419 v.reset(OpARMRSCconst) 13420 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 13421 v.AddArg(x) 13422 v.AddArg(flags) 13423 return true 13424 } 13425 return false 13426 } 13427 func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { 13428 b := v.Block 13429 _ = b 13430 // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) 13431 // cond: 13432 // result: (SBCconst [c] (SRL <x.Type> x y) flags) 13433 for { 13434 _ = v.Args[3] 13435 v_0 := v.Args[0] 13436 if v_0.Op != OpARMMOVWconst { 13437 break 13438 } 13439 c := v_0.AuxInt 13440 x := v.Args[1] 13441 y := v.Args[2] 13442 flags := v.Args[3] 13443 v.reset(OpARMSBCconst) 13444 v.AuxInt = c 13445 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 13446 v0.AddArg(x) 13447 v0.AddArg(y) 13448 v.AddArg(v0) 13449 v.AddArg(flags) 13450 return true 13451 } 13452 // match: (RSCshiftRLreg x y (MOVWconst [c]) flags) 13453 // cond: 13454 // result: (RSCshiftRL x y [c] flags) 13455 for { 13456 _ = v.Args[3] 13457 x := v.Args[0] 13458 y := v.Args[1] 13459 v_2 := v.Args[2] 13460 if v_2.Op != OpARMMOVWconst { 13461 break 13462 } 13463 c := v_2.AuxInt 13464 flags := v.Args[3] 13465 v.reset(OpARMRSCshiftRL) 13466 v.AuxInt = c 13467 v.AddArg(x) 13468 v.AddArg(y) 13469 v.AddArg(flags) 13470 return true 13471 } 13472 return false 13473 } 13474 func rewriteValueARM_OpARMSBC_0(v *Value) bool { 13475 // match: (SBC (MOVWconst [c]) x flags) 13476 // cond: 13477 // result: (RSCconst [c] x flags) 13478 for { 13479 _ = v.Args[2] 13480 v_0 := v.Args[0] 13481 if v_0.Op != OpARMMOVWconst { 13482 break 13483 } 13484 c := v_0.AuxInt 13485 x := v.Args[1] 13486 flags := v.Args[2] 13487 v.reset(OpARMRSCconst) 13488 v.AuxInt = c 13489 v.AddArg(x) 13490 v.AddArg(flags) 13491 return true 13492 } 13493 // match: (SBC x (MOVWconst [c]) flags) 13494 // cond: 13495 // result: (SBCconst [c] x flags) 13496 for { 13497 _ = v.Args[2] 13498 x := v.Args[0] 13499 v_1 := v.Args[1] 13500 if v_1.Op != OpARMMOVWconst { 13501 break 13502 } 13503 c := v_1.AuxInt 13504 flags := v.Args[2] 13505 v.reset(OpARMSBCconst) 13506 v.AuxInt = c 13507 v.AddArg(x) 13508 v.AddArg(flags) 13509 return true 13510 } 13511 // match: (SBC x (SLLconst [c] y) flags) 13512 // cond: 13513 // result: (SBCshiftLL x y [c] flags) 13514 for { 13515 _ = v.Args[2] 13516 x := v.Args[0] 13517 v_1 := v.Args[1] 13518 if v_1.Op != OpARMSLLconst { 13519 break 13520 } 13521 c := v_1.AuxInt 13522 y := v_1.Args[0] 13523 flags := v.Args[2] 13524 v.reset(OpARMSBCshiftLL) 13525 v.AuxInt = c 13526 v.AddArg(x) 13527 v.AddArg(y) 13528 v.AddArg(flags) 13529 return true 13530 } 13531 // match: (SBC (SLLconst [c] y) x flags) 13532 // cond: 13533 // result: (RSCshiftLL x y [c] flags) 13534 for { 13535 _ = v.Args[2] 13536 v_0 := v.Args[0] 13537 if v_0.Op != OpARMSLLconst { 13538 break 13539 } 13540 c := v_0.AuxInt 13541 y := v_0.Args[0] 13542 x := v.Args[1] 13543 flags := v.Args[2] 13544 v.reset(OpARMRSCshiftLL) 13545 v.AuxInt = c 13546 v.AddArg(x) 13547 v.AddArg(y) 13548 v.AddArg(flags) 13549 return true 13550 } 13551 // match: (SBC x (SRLconst [c] y) flags) 13552 // cond: 13553 // result: (SBCshiftRL x y [c] flags) 13554 for { 13555 _ = v.Args[2] 13556 x := v.Args[0] 13557 v_1 := v.Args[1] 13558 if v_1.Op != OpARMSRLconst { 13559 break 13560 } 13561 c := v_1.AuxInt 13562 y := v_1.Args[0] 13563 flags := v.Args[2] 13564 v.reset(OpARMSBCshiftRL) 13565 v.AuxInt = c 13566 v.AddArg(x) 13567 v.AddArg(y) 13568 v.AddArg(flags) 13569 return true 13570 } 13571 // match: (SBC (SRLconst [c] y) x flags) 13572 // cond: 13573 // result: (RSCshiftRL x y [c] flags) 13574 for { 13575 _ = v.Args[2] 13576 v_0 := v.Args[0] 13577 if v_0.Op != OpARMSRLconst { 13578 break 13579 } 13580 c := v_0.AuxInt 13581 y := v_0.Args[0] 13582 x := v.Args[1] 13583 flags := v.Args[2] 13584 v.reset(OpARMRSCshiftRL) 13585 v.AuxInt = c 13586 v.AddArg(x) 13587 v.AddArg(y) 13588 v.AddArg(flags) 13589 return true 13590 } 13591 // match: (SBC x (SRAconst [c] y) flags) 13592 // cond: 13593 // result: (SBCshiftRA x y [c] flags) 13594 for { 13595 _ = v.Args[2] 13596 x := v.Args[0] 13597 v_1 := v.Args[1] 13598 if v_1.Op != OpARMSRAconst { 13599 break 13600 } 13601 c := v_1.AuxInt 13602 y := v_1.Args[0] 13603 flags := v.Args[2] 13604 v.reset(OpARMSBCshiftRA) 13605 v.AuxInt = c 13606 v.AddArg(x) 13607 v.AddArg(y) 13608 v.AddArg(flags) 13609 return true 13610 } 13611 // match: (SBC (SRAconst [c] y) x flags) 13612 // cond: 13613 // result: (RSCshiftRA x y [c] flags) 13614 for { 13615 _ = v.Args[2] 13616 v_0 := v.Args[0] 13617 if v_0.Op != OpARMSRAconst { 13618 break 13619 } 13620 c := v_0.AuxInt 13621 y := v_0.Args[0] 13622 x := v.Args[1] 13623 flags := v.Args[2] 13624 v.reset(OpARMRSCshiftRA) 13625 v.AuxInt = c 13626 v.AddArg(x) 13627 v.AddArg(y) 13628 v.AddArg(flags) 13629 return true 13630 } 13631 // match: (SBC x (SLL y z) flags) 13632 // cond: 13633 // result: (SBCshiftLLreg x y z flags) 13634 for { 13635 _ = v.Args[2] 13636 x := v.Args[0] 13637 v_1 := v.Args[1] 13638 if v_1.Op != OpARMSLL { 13639 break 13640 } 13641 _ = v_1.Args[1] 13642 y := v_1.Args[0] 13643 z := v_1.Args[1] 13644 flags := v.Args[2] 13645 v.reset(OpARMSBCshiftLLreg) 13646 v.AddArg(x) 13647 v.AddArg(y) 13648 v.AddArg(z) 13649 v.AddArg(flags) 13650 return true 13651 } 13652 // match: (SBC (SLL y z) x flags) 13653 // cond: 13654 // result: (RSCshiftLLreg x y z flags) 13655 for { 13656 _ = v.Args[2] 13657 v_0 := v.Args[0] 13658 if v_0.Op != OpARMSLL { 13659 break 13660 } 13661 _ = v_0.Args[1] 13662 y := v_0.Args[0] 13663 z := v_0.Args[1] 13664 x := v.Args[1] 13665 flags := v.Args[2] 13666 v.reset(OpARMRSCshiftLLreg) 13667 v.AddArg(x) 13668 v.AddArg(y) 13669 v.AddArg(z) 13670 v.AddArg(flags) 13671 return true 13672 } 13673 return false 13674 } 13675 func rewriteValueARM_OpARMSBC_10(v *Value) bool { 13676 // match: (SBC x (SRL y z) flags) 13677 // cond: 13678 // result: (SBCshiftRLreg x y z flags) 13679 for { 13680 _ = v.Args[2] 13681 x := v.Args[0] 13682 v_1 := v.Args[1] 13683 if v_1.Op != OpARMSRL { 13684 break 13685 } 13686 _ = v_1.Args[1] 13687 y := v_1.Args[0] 13688 z := v_1.Args[1] 13689 flags := v.Args[2] 13690 v.reset(OpARMSBCshiftRLreg) 13691 v.AddArg(x) 13692 v.AddArg(y) 13693 v.AddArg(z) 13694 v.AddArg(flags) 13695 return true 13696 } 13697 // match: (SBC (SRL y z) x flags) 13698 // cond: 13699 // result: (RSCshiftRLreg x y z flags) 13700 for { 13701 _ = v.Args[2] 13702 v_0 := v.Args[0] 13703 if v_0.Op != OpARMSRL { 13704 break 13705 } 13706 _ = v_0.Args[1] 13707 y := v_0.Args[0] 13708 z := v_0.Args[1] 13709 x := v.Args[1] 13710 flags := v.Args[2] 13711 v.reset(OpARMRSCshiftRLreg) 13712 v.AddArg(x) 13713 v.AddArg(y) 13714 v.AddArg(z) 13715 v.AddArg(flags) 13716 return true 13717 } 13718 // match: (SBC x (SRA y z) flags) 13719 // cond: 13720 // result: (SBCshiftRAreg x y z flags) 13721 for { 13722 _ = v.Args[2] 13723 x := v.Args[0] 13724 v_1 := v.Args[1] 13725 if v_1.Op != OpARMSRA { 13726 break 13727 } 13728 _ = v_1.Args[1] 13729 y := v_1.Args[0] 13730 z := v_1.Args[1] 13731 flags := v.Args[2] 13732 v.reset(OpARMSBCshiftRAreg) 13733 v.AddArg(x) 13734 v.AddArg(y) 13735 v.AddArg(z) 13736 v.AddArg(flags) 13737 return true 13738 } 13739 // match: (SBC (SRA y z) x flags) 13740 // cond: 13741 // result: (RSCshiftRAreg x y z flags) 13742 for { 13743 _ = v.Args[2] 13744 v_0 := v.Args[0] 13745 if v_0.Op != OpARMSRA { 13746 break 13747 } 13748 _ = v_0.Args[1] 13749 y := v_0.Args[0] 13750 z := v_0.Args[1] 13751 x := v.Args[1] 13752 flags := v.Args[2] 13753 v.reset(OpARMRSCshiftRAreg) 13754 v.AddArg(x) 13755 v.AddArg(y) 13756 v.AddArg(z) 13757 v.AddArg(flags) 13758 return true 13759 } 13760 return false 13761 } 13762 func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { 13763 // match: (SBCconst [c] (ADDconst [d] x) flags) 13764 // cond: 13765 // result: (SBCconst [int64(int32(c-d))] x flags) 13766 for { 13767 c := v.AuxInt 13768 _ = v.Args[1] 13769 v_0 := v.Args[0] 13770 if v_0.Op != OpARMADDconst { 13771 break 13772 } 13773 d := v_0.AuxInt 13774 x := v_0.Args[0] 13775 flags := v.Args[1] 13776 v.reset(OpARMSBCconst) 13777 v.AuxInt = int64(int32(c - d)) 13778 v.AddArg(x) 13779 v.AddArg(flags) 13780 return true 13781 } 13782 // match: (SBCconst [c] (SUBconst [d] x) flags) 13783 // cond: 13784 // result: (SBCconst [int64(int32(c+d))] x flags) 13785 for { 13786 c := v.AuxInt 13787 _ = v.Args[1] 13788 v_0 := v.Args[0] 13789 if v_0.Op != OpARMSUBconst { 13790 break 13791 } 13792 d := v_0.AuxInt 13793 x := v_0.Args[0] 13794 flags := v.Args[1] 13795 v.reset(OpARMSBCconst) 13796 v.AuxInt = int64(int32(c + d)) 13797 v.AddArg(x) 13798 v.AddArg(flags) 13799 return true 13800 } 13801 return false 13802 } 13803 func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { 13804 b := v.Block 13805 _ = b 13806 // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) 13807 // cond: 13808 // result: (RSCconst [c] (SLLconst <x.Type> x [d]) flags) 13809 for { 13810 d := v.AuxInt 13811 _ = v.Args[2] 13812 v_0 := v.Args[0] 13813 if v_0.Op != OpARMMOVWconst { 13814 break 13815 } 13816 c := v_0.AuxInt 13817 x := v.Args[1] 13818 flags := v.Args[2] 13819 v.reset(OpARMRSCconst) 13820 v.AuxInt = c 13821 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 13822 v0.AuxInt = d 13823 v0.AddArg(x) 13824 v.AddArg(v0) 13825 v.AddArg(flags) 13826 return true 13827 } 13828 // match: (SBCshiftLL x (MOVWconst [c]) [d] flags) 13829 // cond: 13830 // result: (SBCconst x [int64(int32(uint32(c)<<uint64(d)))] flags) 13831 for { 13832 d := v.AuxInt 13833 _ = v.Args[2] 13834 x := v.Args[0] 13835 v_1 := v.Args[1] 13836 if v_1.Op != OpARMMOVWconst { 13837 break 13838 } 13839 c := v_1.AuxInt 13840 flags := v.Args[2] 13841 v.reset(OpARMSBCconst) 13842 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 13843 v.AddArg(x) 13844 v.AddArg(flags) 13845 return true 13846 } 13847 return false 13848 } 13849 func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { 13850 b := v.Block 13851 _ = b 13852 // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) 13853 // cond: 13854 // result: (RSCconst [c] (SLL <x.Type> x y) flags) 13855 for { 13856 _ = v.Args[3] 13857 v_0 := v.Args[0] 13858 if v_0.Op != OpARMMOVWconst { 13859 break 13860 } 13861 c := v_0.AuxInt 13862 x := v.Args[1] 13863 y := v.Args[2] 13864 flags := v.Args[3] 13865 v.reset(OpARMRSCconst) 13866 v.AuxInt = c 13867 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 13868 v0.AddArg(x) 13869 v0.AddArg(y) 13870 v.AddArg(v0) 13871 v.AddArg(flags) 13872 return true 13873 } 13874 // match: (SBCshiftLLreg x y (MOVWconst [c]) flags) 13875 // cond: 13876 // result: (SBCshiftLL x y [c] flags) 13877 for { 13878 _ = v.Args[3] 13879 x := v.Args[0] 13880 y := v.Args[1] 13881 v_2 := v.Args[2] 13882 if v_2.Op != OpARMMOVWconst { 13883 break 13884 } 13885 c := v_2.AuxInt 13886 flags := v.Args[3] 13887 v.reset(OpARMSBCshiftLL) 13888 v.AuxInt = c 13889 v.AddArg(x) 13890 v.AddArg(y) 13891 v.AddArg(flags) 13892 return true 13893 } 13894 return false 13895 } 13896 func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { 13897 b := v.Block 13898 _ = b 13899 // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) 13900 // cond: 13901 // result: (RSCconst [c] (SRAconst <x.Type> x [d]) flags) 13902 for { 13903 d := v.AuxInt 13904 _ = v.Args[2] 13905 v_0 := v.Args[0] 13906 if v_0.Op != OpARMMOVWconst { 13907 break 13908 } 13909 c := v_0.AuxInt 13910 x := v.Args[1] 13911 flags := v.Args[2] 13912 v.reset(OpARMRSCconst) 13913 v.AuxInt = c 13914 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 13915 v0.AuxInt = d 13916 v0.AddArg(x) 13917 v.AddArg(v0) 13918 v.AddArg(flags) 13919 return true 13920 } 13921 // match: (SBCshiftRA x (MOVWconst [c]) [d] flags) 13922 // cond: 13923 // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) 13924 for { 13925 d := v.AuxInt 13926 _ = v.Args[2] 13927 x := v.Args[0] 13928 v_1 := v.Args[1] 13929 if v_1.Op != OpARMMOVWconst { 13930 break 13931 } 13932 c := v_1.AuxInt 13933 flags := v.Args[2] 13934 v.reset(OpARMSBCconst) 13935 v.AuxInt = int64(int32(c) >> uint64(d)) 13936 v.AddArg(x) 13937 v.AddArg(flags) 13938 return true 13939 } 13940 return false 13941 } 13942 func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { 13943 b := v.Block 13944 _ = b 13945 // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) 13946 // cond: 13947 // result: (RSCconst [c] (SRA <x.Type> x y) flags) 13948 for { 13949 _ = v.Args[3] 13950 v_0 := v.Args[0] 13951 if v_0.Op != OpARMMOVWconst { 13952 break 13953 } 13954 c := v_0.AuxInt 13955 x := v.Args[1] 13956 y := v.Args[2] 13957 flags := v.Args[3] 13958 v.reset(OpARMRSCconst) 13959 v.AuxInt = c 13960 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 13961 v0.AddArg(x) 13962 v0.AddArg(y) 13963 v.AddArg(v0) 13964 v.AddArg(flags) 13965 return true 13966 } 13967 // match: (SBCshiftRAreg x y (MOVWconst [c]) flags) 13968 // cond: 13969 // result: (SBCshiftRA x y [c] flags) 13970 for { 13971 _ = v.Args[3] 13972 x := v.Args[0] 13973 y := v.Args[1] 13974 v_2 := v.Args[2] 13975 if v_2.Op != OpARMMOVWconst { 13976 break 13977 } 13978 c := v_2.AuxInt 13979 flags := v.Args[3] 13980 v.reset(OpARMSBCshiftRA) 13981 v.AuxInt = c 13982 v.AddArg(x) 13983 v.AddArg(y) 13984 v.AddArg(flags) 13985 return true 13986 } 13987 return false 13988 } 13989 func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { 13990 b := v.Block 13991 _ = b 13992 // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) 13993 // cond: 13994 // result: (RSCconst [c] (SRLconst <x.Type> x [d]) flags) 13995 for { 13996 d := v.AuxInt 13997 _ = v.Args[2] 13998 v_0 := v.Args[0] 13999 if v_0.Op != OpARMMOVWconst { 14000 break 14001 } 14002 c := v_0.AuxInt 14003 x := v.Args[1] 14004 flags := v.Args[2] 14005 v.reset(OpARMRSCconst) 14006 v.AuxInt = c 14007 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 14008 v0.AuxInt = d 14009 v0.AddArg(x) 14010 v.AddArg(v0) 14011 v.AddArg(flags) 14012 return true 14013 } 14014 // match: (SBCshiftRL x (MOVWconst [c]) [d] flags) 14015 // cond: 14016 // result: (SBCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) 14017 for { 14018 d := v.AuxInt 14019 _ = v.Args[2] 14020 x := v.Args[0] 14021 v_1 := v.Args[1] 14022 if v_1.Op != OpARMMOVWconst { 14023 break 14024 } 14025 c := v_1.AuxInt 14026 flags := v.Args[2] 14027 v.reset(OpARMSBCconst) 14028 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 14029 v.AddArg(x) 14030 v.AddArg(flags) 14031 return true 14032 } 14033 return false 14034 } 14035 func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { 14036 b := v.Block 14037 _ = b 14038 // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) 14039 // cond: 14040 // result: (RSCconst [c] (SRL <x.Type> x y) flags) 14041 for { 14042 _ = v.Args[3] 14043 v_0 := v.Args[0] 14044 if v_0.Op != OpARMMOVWconst { 14045 break 14046 } 14047 c := v_0.AuxInt 14048 x := v.Args[1] 14049 y := v.Args[2] 14050 flags := v.Args[3] 14051 v.reset(OpARMRSCconst) 14052 v.AuxInt = c 14053 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 14054 v0.AddArg(x) 14055 v0.AddArg(y) 14056 v.AddArg(v0) 14057 v.AddArg(flags) 14058 return true 14059 } 14060 // match: (SBCshiftRLreg x y (MOVWconst [c]) flags) 14061 // cond: 14062 // result: (SBCshiftRL x y [c] flags) 14063 for { 14064 _ = v.Args[3] 14065 x := v.Args[0] 14066 y := v.Args[1] 14067 v_2 := v.Args[2] 14068 if v_2.Op != OpARMMOVWconst { 14069 break 14070 } 14071 c := v_2.AuxInt 14072 flags := v.Args[3] 14073 v.reset(OpARMSBCshiftRL) 14074 v.AuxInt = c 14075 v.AddArg(x) 14076 v.AddArg(y) 14077 v.AddArg(flags) 14078 return true 14079 } 14080 return false 14081 } 14082 func rewriteValueARM_OpARMSLL_0(v *Value) bool { 14083 // match: (SLL x (MOVWconst [c])) 14084 // cond: 14085 // result: (SLLconst x [c&31]) 14086 for { 14087 _ = v.Args[1] 14088 x := v.Args[0] 14089 v_1 := v.Args[1] 14090 if v_1.Op != OpARMMOVWconst { 14091 break 14092 } 14093 c := v_1.AuxInt 14094 v.reset(OpARMSLLconst) 14095 v.AuxInt = c & 31 14096 v.AddArg(x) 14097 return true 14098 } 14099 return false 14100 } 14101 func rewriteValueARM_OpARMSLLconst_0(v *Value) bool { 14102 // match: (SLLconst [c] (MOVWconst [d])) 14103 // cond: 14104 // result: (MOVWconst [int64(uint32(d)<<uint64(c))]) 14105 for { 14106 c := v.AuxInt 14107 v_0 := v.Args[0] 14108 if v_0.Op != OpARMMOVWconst { 14109 break 14110 } 14111 d := v_0.AuxInt 14112 v.reset(OpARMMOVWconst) 14113 v.AuxInt = int64(uint32(d) << uint64(c)) 14114 return true 14115 } 14116 return false 14117 } 14118 func rewriteValueARM_OpARMSRA_0(v *Value) bool { 14119 // match: (SRA x (MOVWconst [c])) 14120 // cond: 14121 // result: (SRAconst x [c&31]) 14122 for { 14123 _ = v.Args[1] 14124 x := v.Args[0] 14125 v_1 := v.Args[1] 14126 if v_1.Op != OpARMMOVWconst { 14127 break 14128 } 14129 c := v_1.AuxInt 14130 v.reset(OpARMSRAconst) 14131 v.AuxInt = c & 31 14132 v.AddArg(x) 14133 return true 14134 } 14135 return false 14136 } 14137 func rewriteValueARM_OpARMSRAcond_0(v *Value) bool { 14138 // match: (SRAcond x _ (FlagEQ)) 14139 // cond: 14140 // result: (SRAconst x [31]) 14141 for { 14142 _ = v.Args[2] 14143 x := v.Args[0] 14144 v_2 := v.Args[2] 14145 if v_2.Op != OpARMFlagEQ { 14146 break 14147 } 14148 v.reset(OpARMSRAconst) 14149 v.AuxInt = 31 14150 v.AddArg(x) 14151 return true 14152 } 14153 // match: (SRAcond x y (FlagLT_ULT)) 14154 // cond: 14155 // result: (SRA x y) 14156 for { 14157 _ = v.Args[2] 14158 x := v.Args[0] 14159 y := v.Args[1] 14160 v_2 := v.Args[2] 14161 if v_2.Op != OpARMFlagLT_ULT { 14162 break 14163 } 14164 v.reset(OpARMSRA) 14165 v.AddArg(x) 14166 v.AddArg(y) 14167 return true 14168 } 14169 // match: (SRAcond x _ (FlagLT_UGT)) 14170 // cond: 14171 // result: (SRAconst x [31]) 14172 for { 14173 _ = v.Args[2] 14174 x := v.Args[0] 14175 v_2 := v.Args[2] 14176 if v_2.Op != OpARMFlagLT_UGT { 14177 break 14178 } 14179 v.reset(OpARMSRAconst) 14180 v.AuxInt = 31 14181 v.AddArg(x) 14182 return true 14183 } 14184 // match: (SRAcond x y (FlagGT_ULT)) 14185 // cond: 14186 // result: (SRA x y) 14187 for { 14188 _ = v.Args[2] 14189 x := v.Args[0] 14190 y := v.Args[1] 14191 v_2 := v.Args[2] 14192 if v_2.Op != OpARMFlagGT_ULT { 14193 break 14194 } 14195 v.reset(OpARMSRA) 14196 v.AddArg(x) 14197 v.AddArg(y) 14198 return true 14199 } 14200 // match: (SRAcond x _ (FlagGT_UGT)) 14201 // cond: 14202 // result: (SRAconst x [31]) 14203 for { 14204 _ = v.Args[2] 14205 x := v.Args[0] 14206 v_2 := v.Args[2] 14207 if v_2.Op != OpARMFlagGT_UGT { 14208 break 14209 } 14210 v.reset(OpARMSRAconst) 14211 v.AuxInt = 31 14212 v.AddArg(x) 14213 return true 14214 } 14215 return false 14216 } 14217 func rewriteValueARM_OpARMSRAconst_0(v *Value) bool { 14218 // match: (SRAconst [c] (MOVWconst [d])) 14219 // cond: 14220 // result: (MOVWconst [int64(int32(d)>>uint64(c))]) 14221 for { 14222 c := v.AuxInt 14223 v_0 := v.Args[0] 14224 if v_0.Op != OpARMMOVWconst { 14225 break 14226 } 14227 d := v_0.AuxInt 14228 v.reset(OpARMMOVWconst) 14229 v.AuxInt = int64(int32(d) >> uint64(c)) 14230 return true 14231 } 14232 // match: (SRAconst (SLLconst x [c]) [d]) 14233 // cond: objabi.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 14234 // result: (BFX [(d-c)|(32-d)<<8] x) 14235 for { 14236 d := v.AuxInt 14237 v_0 := v.Args[0] 14238 if v_0.Op != OpARMSLLconst { 14239 break 14240 } 14241 c := v_0.AuxInt 14242 x := v_0.Args[0] 14243 if !(objabi.GOARM == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 14244 break 14245 } 14246 v.reset(OpARMBFX) 14247 v.AuxInt = (d - c) | (32-d)<<8 14248 v.AddArg(x) 14249 return true 14250 } 14251 return false 14252 } 14253 func rewriteValueARM_OpARMSRL_0(v *Value) bool { 14254 // match: (SRL x (MOVWconst [c])) 14255 // cond: 14256 // result: (SRLconst x [c&31]) 14257 for { 14258 _ = v.Args[1] 14259 x := v.Args[0] 14260 v_1 := v.Args[1] 14261 if v_1.Op != OpARMMOVWconst { 14262 break 14263 } 14264 c := v_1.AuxInt 14265 v.reset(OpARMSRLconst) 14266 v.AuxInt = c & 31 14267 v.AddArg(x) 14268 return true 14269 } 14270 return false 14271 } 14272 func rewriteValueARM_OpARMSRLconst_0(v *Value) bool { 14273 // match: (SRLconst [c] (MOVWconst [d])) 14274 // cond: 14275 // result: (MOVWconst [int64(uint32(d)>>uint64(c))]) 14276 for { 14277 c := v.AuxInt 14278 v_0 := v.Args[0] 14279 if v_0.Op != OpARMMOVWconst { 14280 break 14281 } 14282 d := v_0.AuxInt 14283 v.reset(OpARMMOVWconst) 14284 v.AuxInt = int64(uint32(d) >> uint64(c)) 14285 return true 14286 } 14287 // match: (SRLconst (SLLconst x [c]) [d]) 14288 // cond: objabi.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 14289 // result: (BFXU [(d-c)|(32-d)<<8] x) 14290 for { 14291 d := v.AuxInt 14292 v_0 := v.Args[0] 14293 if v_0.Op != OpARMSLLconst { 14294 break 14295 } 14296 c := v_0.AuxInt 14297 x := v_0.Args[0] 14298 if !(objabi.GOARM == 7 && uint64(d) >= uint64(c) && uint64(d) <= 31) { 14299 break 14300 } 14301 v.reset(OpARMBFXU) 14302 v.AuxInt = (d - c) | (32-d)<<8 14303 v.AddArg(x) 14304 return true 14305 } 14306 return false 14307 } 14308 func rewriteValueARM_OpARMSUB_0(v *Value) bool { 14309 // match: (SUB (MOVWconst [c]) x) 14310 // cond: 14311 // result: (RSBconst [c] x) 14312 for { 14313 _ = v.Args[1] 14314 v_0 := v.Args[0] 14315 if v_0.Op != OpARMMOVWconst { 14316 break 14317 } 14318 c := v_0.AuxInt 14319 x := v.Args[1] 14320 v.reset(OpARMRSBconst) 14321 v.AuxInt = c 14322 v.AddArg(x) 14323 return true 14324 } 14325 // match: (SUB x (MOVWconst [c])) 14326 // cond: 14327 // result: (SUBconst [c] x) 14328 for { 14329 _ = v.Args[1] 14330 x := v.Args[0] 14331 v_1 := v.Args[1] 14332 if v_1.Op != OpARMMOVWconst { 14333 break 14334 } 14335 c := v_1.AuxInt 14336 v.reset(OpARMSUBconst) 14337 v.AuxInt = c 14338 v.AddArg(x) 14339 return true 14340 } 14341 // match: (SUB x (SLLconst [c] y)) 14342 // cond: 14343 // result: (SUBshiftLL x y [c]) 14344 for { 14345 _ = v.Args[1] 14346 x := v.Args[0] 14347 v_1 := v.Args[1] 14348 if v_1.Op != OpARMSLLconst { 14349 break 14350 } 14351 c := v_1.AuxInt 14352 y := v_1.Args[0] 14353 v.reset(OpARMSUBshiftLL) 14354 v.AuxInt = c 14355 v.AddArg(x) 14356 v.AddArg(y) 14357 return true 14358 } 14359 // match: (SUB (SLLconst [c] y) x) 14360 // cond: 14361 // result: (RSBshiftLL x y [c]) 14362 for { 14363 _ = v.Args[1] 14364 v_0 := v.Args[0] 14365 if v_0.Op != OpARMSLLconst { 14366 break 14367 } 14368 c := v_0.AuxInt 14369 y := v_0.Args[0] 14370 x := v.Args[1] 14371 v.reset(OpARMRSBshiftLL) 14372 v.AuxInt = c 14373 v.AddArg(x) 14374 v.AddArg(y) 14375 return true 14376 } 14377 // match: (SUB x (SRLconst [c] y)) 14378 // cond: 14379 // result: (SUBshiftRL x y [c]) 14380 for { 14381 _ = v.Args[1] 14382 x := v.Args[0] 14383 v_1 := v.Args[1] 14384 if v_1.Op != OpARMSRLconst { 14385 break 14386 } 14387 c := v_1.AuxInt 14388 y := v_1.Args[0] 14389 v.reset(OpARMSUBshiftRL) 14390 v.AuxInt = c 14391 v.AddArg(x) 14392 v.AddArg(y) 14393 return true 14394 } 14395 // match: (SUB (SRLconst [c] y) x) 14396 // cond: 14397 // result: (RSBshiftRL x y [c]) 14398 for { 14399 _ = v.Args[1] 14400 v_0 := v.Args[0] 14401 if v_0.Op != OpARMSRLconst { 14402 break 14403 } 14404 c := v_0.AuxInt 14405 y := v_0.Args[0] 14406 x := v.Args[1] 14407 v.reset(OpARMRSBshiftRL) 14408 v.AuxInt = c 14409 v.AddArg(x) 14410 v.AddArg(y) 14411 return true 14412 } 14413 // match: (SUB x (SRAconst [c] y)) 14414 // cond: 14415 // result: (SUBshiftRA x y [c]) 14416 for { 14417 _ = v.Args[1] 14418 x := v.Args[0] 14419 v_1 := v.Args[1] 14420 if v_1.Op != OpARMSRAconst { 14421 break 14422 } 14423 c := v_1.AuxInt 14424 y := v_1.Args[0] 14425 v.reset(OpARMSUBshiftRA) 14426 v.AuxInt = c 14427 v.AddArg(x) 14428 v.AddArg(y) 14429 return true 14430 } 14431 // match: (SUB (SRAconst [c] y) x) 14432 // cond: 14433 // result: (RSBshiftRA x y [c]) 14434 for { 14435 _ = v.Args[1] 14436 v_0 := v.Args[0] 14437 if v_0.Op != OpARMSRAconst { 14438 break 14439 } 14440 c := v_0.AuxInt 14441 y := v_0.Args[0] 14442 x := v.Args[1] 14443 v.reset(OpARMRSBshiftRA) 14444 v.AuxInt = c 14445 v.AddArg(x) 14446 v.AddArg(y) 14447 return true 14448 } 14449 // match: (SUB x (SLL y z)) 14450 // cond: 14451 // result: (SUBshiftLLreg x y z) 14452 for { 14453 _ = v.Args[1] 14454 x := v.Args[0] 14455 v_1 := v.Args[1] 14456 if v_1.Op != OpARMSLL { 14457 break 14458 } 14459 _ = v_1.Args[1] 14460 y := v_1.Args[0] 14461 z := v_1.Args[1] 14462 v.reset(OpARMSUBshiftLLreg) 14463 v.AddArg(x) 14464 v.AddArg(y) 14465 v.AddArg(z) 14466 return true 14467 } 14468 // match: (SUB (SLL y z) x) 14469 // cond: 14470 // result: (RSBshiftLLreg x y z) 14471 for { 14472 _ = v.Args[1] 14473 v_0 := v.Args[0] 14474 if v_0.Op != OpARMSLL { 14475 break 14476 } 14477 _ = v_0.Args[1] 14478 y := v_0.Args[0] 14479 z := v_0.Args[1] 14480 x := v.Args[1] 14481 v.reset(OpARMRSBshiftLLreg) 14482 v.AddArg(x) 14483 v.AddArg(y) 14484 v.AddArg(z) 14485 return true 14486 } 14487 return false 14488 } 14489 func rewriteValueARM_OpARMSUB_10(v *Value) bool { 14490 // match: (SUB x (SRL y z)) 14491 // cond: 14492 // result: (SUBshiftRLreg x y z) 14493 for { 14494 _ = v.Args[1] 14495 x := v.Args[0] 14496 v_1 := v.Args[1] 14497 if v_1.Op != OpARMSRL { 14498 break 14499 } 14500 _ = v_1.Args[1] 14501 y := v_1.Args[0] 14502 z := v_1.Args[1] 14503 v.reset(OpARMSUBshiftRLreg) 14504 v.AddArg(x) 14505 v.AddArg(y) 14506 v.AddArg(z) 14507 return true 14508 } 14509 // match: (SUB (SRL y z) x) 14510 // cond: 14511 // result: (RSBshiftRLreg x y z) 14512 for { 14513 _ = v.Args[1] 14514 v_0 := v.Args[0] 14515 if v_0.Op != OpARMSRL { 14516 break 14517 } 14518 _ = v_0.Args[1] 14519 y := v_0.Args[0] 14520 z := v_0.Args[1] 14521 x := v.Args[1] 14522 v.reset(OpARMRSBshiftRLreg) 14523 v.AddArg(x) 14524 v.AddArg(y) 14525 v.AddArg(z) 14526 return true 14527 } 14528 // match: (SUB x (SRA y z)) 14529 // cond: 14530 // result: (SUBshiftRAreg x y z) 14531 for { 14532 _ = v.Args[1] 14533 x := v.Args[0] 14534 v_1 := v.Args[1] 14535 if v_1.Op != OpARMSRA { 14536 break 14537 } 14538 _ = v_1.Args[1] 14539 y := v_1.Args[0] 14540 z := v_1.Args[1] 14541 v.reset(OpARMSUBshiftRAreg) 14542 v.AddArg(x) 14543 v.AddArg(y) 14544 v.AddArg(z) 14545 return true 14546 } 14547 // match: (SUB (SRA y z) x) 14548 // cond: 14549 // result: (RSBshiftRAreg x y z) 14550 for { 14551 _ = v.Args[1] 14552 v_0 := v.Args[0] 14553 if v_0.Op != OpARMSRA { 14554 break 14555 } 14556 _ = v_0.Args[1] 14557 y := v_0.Args[0] 14558 z := v_0.Args[1] 14559 x := v.Args[1] 14560 v.reset(OpARMRSBshiftRAreg) 14561 v.AddArg(x) 14562 v.AddArg(y) 14563 v.AddArg(z) 14564 return true 14565 } 14566 // match: (SUB x x) 14567 // cond: 14568 // result: (MOVWconst [0]) 14569 for { 14570 _ = v.Args[1] 14571 x := v.Args[0] 14572 if x != v.Args[1] { 14573 break 14574 } 14575 v.reset(OpARMMOVWconst) 14576 v.AuxInt = 0 14577 return true 14578 } 14579 // match: (SUB a (MUL x y)) 14580 // cond: objabi.GOARM == 7 14581 // result: (MULS x y a) 14582 for { 14583 _ = v.Args[1] 14584 a := v.Args[0] 14585 v_1 := v.Args[1] 14586 if v_1.Op != OpARMMUL { 14587 break 14588 } 14589 _ = v_1.Args[1] 14590 x := v_1.Args[0] 14591 y := v_1.Args[1] 14592 if !(objabi.GOARM == 7) { 14593 break 14594 } 14595 v.reset(OpARMMULS) 14596 v.AddArg(x) 14597 v.AddArg(y) 14598 v.AddArg(a) 14599 return true 14600 } 14601 return false 14602 } 14603 func rewriteValueARM_OpARMSUBD_0(v *Value) bool { 14604 // match: (SUBD a (MULD x y)) 14605 // cond: a.Uses == 1 && objabi.GOARM >= 6 14606 // result: (MULSD a x y) 14607 for { 14608 _ = v.Args[1] 14609 a := v.Args[0] 14610 v_1 := v.Args[1] 14611 if v_1.Op != OpARMMULD { 14612 break 14613 } 14614 _ = v_1.Args[1] 14615 x := v_1.Args[0] 14616 y := v_1.Args[1] 14617 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14618 break 14619 } 14620 v.reset(OpARMMULSD) 14621 v.AddArg(a) 14622 v.AddArg(x) 14623 v.AddArg(y) 14624 return true 14625 } 14626 // match: (SUBD a (NMULD x y)) 14627 // cond: a.Uses == 1 && objabi.GOARM >= 6 14628 // result: (MULAD a x y) 14629 for { 14630 _ = v.Args[1] 14631 a := v.Args[0] 14632 v_1 := v.Args[1] 14633 if v_1.Op != OpARMNMULD { 14634 break 14635 } 14636 _ = v_1.Args[1] 14637 x := v_1.Args[0] 14638 y := v_1.Args[1] 14639 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14640 break 14641 } 14642 v.reset(OpARMMULAD) 14643 v.AddArg(a) 14644 v.AddArg(x) 14645 v.AddArg(y) 14646 return true 14647 } 14648 return false 14649 } 14650 func rewriteValueARM_OpARMSUBF_0(v *Value) bool { 14651 // match: (SUBF a (MULF x y)) 14652 // cond: a.Uses == 1 && objabi.GOARM >= 6 14653 // result: (MULSF a x y) 14654 for { 14655 _ = v.Args[1] 14656 a := v.Args[0] 14657 v_1 := v.Args[1] 14658 if v_1.Op != OpARMMULF { 14659 break 14660 } 14661 _ = v_1.Args[1] 14662 x := v_1.Args[0] 14663 y := v_1.Args[1] 14664 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14665 break 14666 } 14667 v.reset(OpARMMULSF) 14668 v.AddArg(a) 14669 v.AddArg(x) 14670 v.AddArg(y) 14671 return true 14672 } 14673 // match: (SUBF a (NMULF x y)) 14674 // cond: a.Uses == 1 && objabi.GOARM >= 6 14675 // result: (MULAF a x y) 14676 for { 14677 _ = v.Args[1] 14678 a := v.Args[0] 14679 v_1 := v.Args[1] 14680 if v_1.Op != OpARMNMULF { 14681 break 14682 } 14683 _ = v_1.Args[1] 14684 x := v_1.Args[0] 14685 y := v_1.Args[1] 14686 if !(a.Uses == 1 && objabi.GOARM >= 6) { 14687 break 14688 } 14689 v.reset(OpARMMULAF) 14690 v.AddArg(a) 14691 v.AddArg(x) 14692 v.AddArg(y) 14693 return true 14694 } 14695 return false 14696 } 14697 func rewriteValueARM_OpARMSUBS_0(v *Value) bool { 14698 // match: (SUBS x (MOVWconst [c])) 14699 // cond: 14700 // result: (SUBSconst [c] x) 14701 for { 14702 _ = v.Args[1] 14703 x := v.Args[0] 14704 v_1 := v.Args[1] 14705 if v_1.Op != OpARMMOVWconst { 14706 break 14707 } 14708 c := v_1.AuxInt 14709 v.reset(OpARMSUBSconst) 14710 v.AuxInt = c 14711 v.AddArg(x) 14712 return true 14713 } 14714 // match: (SUBS x (SLLconst [c] y)) 14715 // cond: 14716 // result: (SUBSshiftLL x y [c]) 14717 for { 14718 _ = v.Args[1] 14719 x := v.Args[0] 14720 v_1 := v.Args[1] 14721 if v_1.Op != OpARMSLLconst { 14722 break 14723 } 14724 c := v_1.AuxInt 14725 y := v_1.Args[0] 14726 v.reset(OpARMSUBSshiftLL) 14727 v.AuxInt = c 14728 v.AddArg(x) 14729 v.AddArg(y) 14730 return true 14731 } 14732 // match: (SUBS (SLLconst [c] y) x) 14733 // cond: 14734 // result: (RSBSshiftLL x y [c]) 14735 for { 14736 _ = v.Args[1] 14737 v_0 := v.Args[0] 14738 if v_0.Op != OpARMSLLconst { 14739 break 14740 } 14741 c := v_0.AuxInt 14742 y := v_0.Args[0] 14743 x := v.Args[1] 14744 v.reset(OpARMRSBSshiftLL) 14745 v.AuxInt = c 14746 v.AddArg(x) 14747 v.AddArg(y) 14748 return true 14749 } 14750 // match: (SUBS x (SRLconst [c] y)) 14751 // cond: 14752 // result: (SUBSshiftRL x y [c]) 14753 for { 14754 _ = v.Args[1] 14755 x := v.Args[0] 14756 v_1 := v.Args[1] 14757 if v_1.Op != OpARMSRLconst { 14758 break 14759 } 14760 c := v_1.AuxInt 14761 y := v_1.Args[0] 14762 v.reset(OpARMSUBSshiftRL) 14763 v.AuxInt = c 14764 v.AddArg(x) 14765 v.AddArg(y) 14766 return true 14767 } 14768 // match: (SUBS (SRLconst [c] y) x) 14769 // cond: 14770 // result: (RSBSshiftRL x y [c]) 14771 for { 14772 _ = v.Args[1] 14773 v_0 := v.Args[0] 14774 if v_0.Op != OpARMSRLconst { 14775 break 14776 } 14777 c := v_0.AuxInt 14778 y := v_0.Args[0] 14779 x := v.Args[1] 14780 v.reset(OpARMRSBSshiftRL) 14781 v.AuxInt = c 14782 v.AddArg(x) 14783 v.AddArg(y) 14784 return true 14785 } 14786 // match: (SUBS x (SRAconst [c] y)) 14787 // cond: 14788 // result: (SUBSshiftRA x y [c]) 14789 for { 14790 _ = v.Args[1] 14791 x := v.Args[0] 14792 v_1 := v.Args[1] 14793 if v_1.Op != OpARMSRAconst { 14794 break 14795 } 14796 c := v_1.AuxInt 14797 y := v_1.Args[0] 14798 v.reset(OpARMSUBSshiftRA) 14799 v.AuxInt = c 14800 v.AddArg(x) 14801 v.AddArg(y) 14802 return true 14803 } 14804 // match: (SUBS (SRAconst [c] y) x) 14805 // cond: 14806 // result: (RSBSshiftRA x y [c]) 14807 for { 14808 _ = v.Args[1] 14809 v_0 := v.Args[0] 14810 if v_0.Op != OpARMSRAconst { 14811 break 14812 } 14813 c := v_0.AuxInt 14814 y := v_0.Args[0] 14815 x := v.Args[1] 14816 v.reset(OpARMRSBSshiftRA) 14817 v.AuxInt = c 14818 v.AddArg(x) 14819 v.AddArg(y) 14820 return true 14821 } 14822 // match: (SUBS x (SLL y z)) 14823 // cond: 14824 // result: (SUBSshiftLLreg x y z) 14825 for { 14826 _ = v.Args[1] 14827 x := v.Args[0] 14828 v_1 := v.Args[1] 14829 if v_1.Op != OpARMSLL { 14830 break 14831 } 14832 _ = v_1.Args[1] 14833 y := v_1.Args[0] 14834 z := v_1.Args[1] 14835 v.reset(OpARMSUBSshiftLLreg) 14836 v.AddArg(x) 14837 v.AddArg(y) 14838 v.AddArg(z) 14839 return true 14840 } 14841 // match: (SUBS (SLL y z) x) 14842 // cond: 14843 // result: (RSBSshiftLLreg x y z) 14844 for { 14845 _ = v.Args[1] 14846 v_0 := v.Args[0] 14847 if v_0.Op != OpARMSLL { 14848 break 14849 } 14850 _ = v_0.Args[1] 14851 y := v_0.Args[0] 14852 z := v_0.Args[1] 14853 x := v.Args[1] 14854 v.reset(OpARMRSBSshiftLLreg) 14855 v.AddArg(x) 14856 v.AddArg(y) 14857 v.AddArg(z) 14858 return true 14859 } 14860 // match: (SUBS x (SRL y z)) 14861 // cond: 14862 // result: (SUBSshiftRLreg x y z) 14863 for { 14864 _ = v.Args[1] 14865 x := v.Args[0] 14866 v_1 := v.Args[1] 14867 if v_1.Op != OpARMSRL { 14868 break 14869 } 14870 _ = v_1.Args[1] 14871 y := v_1.Args[0] 14872 z := v_1.Args[1] 14873 v.reset(OpARMSUBSshiftRLreg) 14874 v.AddArg(x) 14875 v.AddArg(y) 14876 v.AddArg(z) 14877 return true 14878 } 14879 return false 14880 } 14881 func rewriteValueARM_OpARMSUBS_10(v *Value) bool { 14882 // match: (SUBS (SRL y z) x) 14883 // cond: 14884 // result: (RSBSshiftRLreg x y z) 14885 for { 14886 _ = v.Args[1] 14887 v_0 := v.Args[0] 14888 if v_0.Op != OpARMSRL { 14889 break 14890 } 14891 _ = v_0.Args[1] 14892 y := v_0.Args[0] 14893 z := v_0.Args[1] 14894 x := v.Args[1] 14895 v.reset(OpARMRSBSshiftRLreg) 14896 v.AddArg(x) 14897 v.AddArg(y) 14898 v.AddArg(z) 14899 return true 14900 } 14901 // match: (SUBS x (SRA y z)) 14902 // cond: 14903 // result: (SUBSshiftRAreg x y z) 14904 for { 14905 _ = v.Args[1] 14906 x := v.Args[0] 14907 v_1 := v.Args[1] 14908 if v_1.Op != OpARMSRA { 14909 break 14910 } 14911 _ = v_1.Args[1] 14912 y := v_1.Args[0] 14913 z := v_1.Args[1] 14914 v.reset(OpARMSUBSshiftRAreg) 14915 v.AddArg(x) 14916 v.AddArg(y) 14917 v.AddArg(z) 14918 return true 14919 } 14920 // match: (SUBS (SRA y z) x) 14921 // cond: 14922 // result: (RSBSshiftRAreg x y z) 14923 for { 14924 _ = v.Args[1] 14925 v_0 := v.Args[0] 14926 if v_0.Op != OpARMSRA { 14927 break 14928 } 14929 _ = v_0.Args[1] 14930 y := v_0.Args[0] 14931 z := v_0.Args[1] 14932 x := v.Args[1] 14933 v.reset(OpARMRSBSshiftRAreg) 14934 v.AddArg(x) 14935 v.AddArg(y) 14936 v.AddArg(z) 14937 return true 14938 } 14939 return false 14940 } 14941 func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { 14942 b := v.Block 14943 _ = b 14944 // match: (SUBSshiftLL (MOVWconst [c]) x [d]) 14945 // cond: 14946 // result: (RSBSconst [c] (SLLconst <x.Type> x [d])) 14947 for { 14948 d := v.AuxInt 14949 _ = v.Args[1] 14950 v_0 := v.Args[0] 14951 if v_0.Op != OpARMMOVWconst { 14952 break 14953 } 14954 c := v_0.AuxInt 14955 x := v.Args[1] 14956 v.reset(OpARMRSBSconst) 14957 v.AuxInt = c 14958 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 14959 v0.AuxInt = d 14960 v0.AddArg(x) 14961 v.AddArg(v0) 14962 return true 14963 } 14964 // match: (SUBSshiftLL x (MOVWconst [c]) [d]) 14965 // cond: 14966 // result: (SUBSconst x [int64(int32(uint32(c)<<uint64(d)))]) 14967 for { 14968 d := v.AuxInt 14969 _ = v.Args[1] 14970 x := v.Args[0] 14971 v_1 := v.Args[1] 14972 if v_1.Op != OpARMMOVWconst { 14973 break 14974 } 14975 c := v_1.AuxInt 14976 v.reset(OpARMSUBSconst) 14977 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 14978 v.AddArg(x) 14979 return true 14980 } 14981 return false 14982 } 14983 func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { 14984 b := v.Block 14985 _ = b 14986 // match: (SUBSshiftLLreg (MOVWconst [c]) x y) 14987 // cond: 14988 // result: (RSBSconst [c] (SLL <x.Type> x y)) 14989 for { 14990 _ = v.Args[2] 14991 v_0 := v.Args[0] 14992 if v_0.Op != OpARMMOVWconst { 14993 break 14994 } 14995 c := v_0.AuxInt 14996 x := v.Args[1] 14997 y := v.Args[2] 14998 v.reset(OpARMRSBSconst) 14999 v.AuxInt = c 15000 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15001 v0.AddArg(x) 15002 v0.AddArg(y) 15003 v.AddArg(v0) 15004 return true 15005 } 15006 // match: (SUBSshiftLLreg x y (MOVWconst [c])) 15007 // cond: 15008 // result: (SUBSshiftLL x y [c]) 15009 for { 15010 _ = v.Args[2] 15011 x := v.Args[0] 15012 y := v.Args[1] 15013 v_2 := v.Args[2] 15014 if v_2.Op != OpARMMOVWconst { 15015 break 15016 } 15017 c := v_2.AuxInt 15018 v.reset(OpARMSUBSshiftLL) 15019 v.AuxInt = c 15020 v.AddArg(x) 15021 v.AddArg(y) 15022 return true 15023 } 15024 return false 15025 } 15026 func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { 15027 b := v.Block 15028 _ = b 15029 // match: (SUBSshiftRA (MOVWconst [c]) x [d]) 15030 // cond: 15031 // result: (RSBSconst [c] (SRAconst <x.Type> x [d])) 15032 for { 15033 d := v.AuxInt 15034 _ = v.Args[1] 15035 v_0 := v.Args[0] 15036 if v_0.Op != OpARMMOVWconst { 15037 break 15038 } 15039 c := v_0.AuxInt 15040 x := v.Args[1] 15041 v.reset(OpARMRSBSconst) 15042 v.AuxInt = c 15043 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 15044 v0.AuxInt = d 15045 v0.AddArg(x) 15046 v.AddArg(v0) 15047 return true 15048 } 15049 // match: (SUBSshiftRA x (MOVWconst [c]) [d]) 15050 // cond: 15051 // result: (SUBSconst x [int64(int32(c)>>uint64(d))]) 15052 for { 15053 d := v.AuxInt 15054 _ = v.Args[1] 15055 x := v.Args[0] 15056 v_1 := v.Args[1] 15057 if v_1.Op != OpARMMOVWconst { 15058 break 15059 } 15060 c := v_1.AuxInt 15061 v.reset(OpARMSUBSconst) 15062 v.AuxInt = int64(int32(c) >> uint64(d)) 15063 v.AddArg(x) 15064 return true 15065 } 15066 return false 15067 } 15068 func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { 15069 b := v.Block 15070 _ = b 15071 // match: (SUBSshiftRAreg (MOVWconst [c]) x y) 15072 // cond: 15073 // result: (RSBSconst [c] (SRA <x.Type> x y)) 15074 for { 15075 _ = v.Args[2] 15076 v_0 := v.Args[0] 15077 if v_0.Op != OpARMMOVWconst { 15078 break 15079 } 15080 c := v_0.AuxInt 15081 x := v.Args[1] 15082 y := v.Args[2] 15083 v.reset(OpARMRSBSconst) 15084 v.AuxInt = c 15085 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 15086 v0.AddArg(x) 15087 v0.AddArg(y) 15088 v.AddArg(v0) 15089 return true 15090 } 15091 // match: (SUBSshiftRAreg x y (MOVWconst [c])) 15092 // cond: 15093 // result: (SUBSshiftRA x y [c]) 15094 for { 15095 _ = v.Args[2] 15096 x := v.Args[0] 15097 y := v.Args[1] 15098 v_2 := v.Args[2] 15099 if v_2.Op != OpARMMOVWconst { 15100 break 15101 } 15102 c := v_2.AuxInt 15103 v.reset(OpARMSUBSshiftRA) 15104 v.AuxInt = c 15105 v.AddArg(x) 15106 v.AddArg(y) 15107 return true 15108 } 15109 return false 15110 } 15111 func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { 15112 b := v.Block 15113 _ = b 15114 // match: (SUBSshiftRL (MOVWconst [c]) x [d]) 15115 // cond: 15116 // result: (RSBSconst [c] (SRLconst <x.Type> x [d])) 15117 for { 15118 d := v.AuxInt 15119 _ = v.Args[1] 15120 v_0 := v.Args[0] 15121 if v_0.Op != OpARMMOVWconst { 15122 break 15123 } 15124 c := v_0.AuxInt 15125 x := v.Args[1] 15126 v.reset(OpARMRSBSconst) 15127 v.AuxInt = c 15128 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 15129 v0.AuxInt = d 15130 v0.AddArg(x) 15131 v.AddArg(v0) 15132 return true 15133 } 15134 // match: (SUBSshiftRL x (MOVWconst [c]) [d]) 15135 // cond: 15136 // result: (SUBSconst x [int64(int32(uint32(c)>>uint64(d)))]) 15137 for { 15138 d := v.AuxInt 15139 _ = v.Args[1] 15140 x := v.Args[0] 15141 v_1 := v.Args[1] 15142 if v_1.Op != OpARMMOVWconst { 15143 break 15144 } 15145 c := v_1.AuxInt 15146 v.reset(OpARMSUBSconst) 15147 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 15148 v.AddArg(x) 15149 return true 15150 } 15151 return false 15152 } 15153 func rewriteValueARM_OpARMSUBSshiftRLreg_0(v *Value) bool { 15154 b := v.Block 15155 _ = b 15156 // match: (SUBSshiftRLreg (MOVWconst [c]) x y) 15157 // cond: 15158 // result: (RSBSconst [c] (SRL <x.Type> x y)) 15159 for { 15160 _ = v.Args[2] 15161 v_0 := v.Args[0] 15162 if v_0.Op != OpARMMOVWconst { 15163 break 15164 } 15165 c := v_0.AuxInt 15166 x := v.Args[1] 15167 y := v.Args[2] 15168 v.reset(OpARMRSBSconst) 15169 v.AuxInt = c 15170 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15171 v0.AddArg(x) 15172 v0.AddArg(y) 15173 v.AddArg(v0) 15174 return true 15175 } 15176 // match: (SUBSshiftRLreg x y (MOVWconst [c])) 15177 // cond: 15178 // result: (SUBSshiftRL x y [c]) 15179 for { 15180 _ = v.Args[2] 15181 x := v.Args[0] 15182 y := v.Args[1] 15183 v_2 := v.Args[2] 15184 if v_2.Op != OpARMMOVWconst { 15185 break 15186 } 15187 c := v_2.AuxInt 15188 v.reset(OpARMSUBSshiftRL) 15189 v.AuxInt = c 15190 v.AddArg(x) 15191 v.AddArg(y) 15192 return true 15193 } 15194 return false 15195 } 15196 func rewriteValueARM_OpARMSUBconst_0(v *Value) bool { 15197 // match: (SUBconst [off1] (MOVWaddr [off2] {sym} ptr)) 15198 // cond: 15199 // result: (MOVWaddr [off2-off1] {sym} ptr) 15200 for { 15201 off1 := v.AuxInt 15202 v_0 := v.Args[0] 15203 if v_0.Op != OpARMMOVWaddr { 15204 break 15205 } 15206 off2 := v_0.AuxInt 15207 sym := v_0.Aux 15208 ptr := v_0.Args[0] 15209 v.reset(OpARMMOVWaddr) 15210 v.AuxInt = off2 - off1 15211 v.Aux = sym 15212 v.AddArg(ptr) 15213 return true 15214 } 15215 // match: (SUBconst [0] x) 15216 // cond: 15217 // result: x 15218 for { 15219 if v.AuxInt != 0 { 15220 break 15221 } 15222 x := v.Args[0] 15223 v.reset(OpCopy) 15224 v.Type = x.Type 15225 v.AddArg(x) 15226 return true 15227 } 15228 // match: (SUBconst [c] x) 15229 // cond: !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) 15230 // result: (ADDconst [int64(int32(-c))] x) 15231 for { 15232 c := v.AuxInt 15233 x := v.Args[0] 15234 if !(!isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c))) { 15235 break 15236 } 15237 v.reset(OpARMADDconst) 15238 v.AuxInt = int64(int32(-c)) 15239 v.AddArg(x) 15240 return true 15241 } 15242 // match: (SUBconst [c] (MOVWconst [d])) 15243 // cond: 15244 // result: (MOVWconst [int64(int32(d-c))]) 15245 for { 15246 c := v.AuxInt 15247 v_0 := v.Args[0] 15248 if v_0.Op != OpARMMOVWconst { 15249 break 15250 } 15251 d := v_0.AuxInt 15252 v.reset(OpARMMOVWconst) 15253 v.AuxInt = int64(int32(d - c)) 15254 return true 15255 } 15256 // match: (SUBconst [c] (SUBconst [d] x)) 15257 // cond: 15258 // result: (ADDconst [int64(int32(-c-d))] x) 15259 for { 15260 c := v.AuxInt 15261 v_0 := v.Args[0] 15262 if v_0.Op != OpARMSUBconst { 15263 break 15264 } 15265 d := v_0.AuxInt 15266 x := v_0.Args[0] 15267 v.reset(OpARMADDconst) 15268 v.AuxInt = int64(int32(-c - d)) 15269 v.AddArg(x) 15270 return true 15271 } 15272 // match: (SUBconst [c] (ADDconst [d] x)) 15273 // cond: 15274 // result: (ADDconst [int64(int32(-c+d))] x) 15275 for { 15276 c := v.AuxInt 15277 v_0 := v.Args[0] 15278 if v_0.Op != OpARMADDconst { 15279 break 15280 } 15281 d := v_0.AuxInt 15282 x := v_0.Args[0] 15283 v.reset(OpARMADDconst) 15284 v.AuxInt = int64(int32(-c + d)) 15285 v.AddArg(x) 15286 return true 15287 } 15288 // match: (SUBconst [c] (RSBconst [d] x)) 15289 // cond: 15290 // result: (RSBconst [int64(int32(-c+d))] x) 15291 for { 15292 c := v.AuxInt 15293 v_0 := v.Args[0] 15294 if v_0.Op != OpARMRSBconst { 15295 break 15296 } 15297 d := v_0.AuxInt 15298 x := v_0.Args[0] 15299 v.reset(OpARMRSBconst) 15300 v.AuxInt = int64(int32(-c + d)) 15301 v.AddArg(x) 15302 return true 15303 } 15304 return false 15305 } 15306 func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { 15307 b := v.Block 15308 _ = b 15309 // match: (SUBshiftLL (MOVWconst [c]) x [d]) 15310 // cond: 15311 // result: (RSBconst [c] (SLLconst <x.Type> x [d])) 15312 for { 15313 d := v.AuxInt 15314 _ = v.Args[1] 15315 v_0 := v.Args[0] 15316 if v_0.Op != OpARMMOVWconst { 15317 break 15318 } 15319 c := v_0.AuxInt 15320 x := v.Args[1] 15321 v.reset(OpARMRSBconst) 15322 v.AuxInt = c 15323 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 15324 v0.AuxInt = d 15325 v0.AddArg(x) 15326 v.AddArg(v0) 15327 return true 15328 } 15329 // match: (SUBshiftLL x (MOVWconst [c]) [d]) 15330 // cond: 15331 // result: (SUBconst x [int64(int32(uint32(c)<<uint64(d)))]) 15332 for { 15333 d := v.AuxInt 15334 _ = v.Args[1] 15335 x := v.Args[0] 15336 v_1 := v.Args[1] 15337 if v_1.Op != OpARMMOVWconst { 15338 break 15339 } 15340 c := v_1.AuxInt 15341 v.reset(OpARMSUBconst) 15342 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 15343 v.AddArg(x) 15344 return true 15345 } 15346 // match: (SUBshiftLL x (SLLconst x [c]) [d]) 15347 // cond: c==d 15348 // result: (MOVWconst [0]) 15349 for { 15350 d := v.AuxInt 15351 _ = v.Args[1] 15352 x := v.Args[0] 15353 v_1 := v.Args[1] 15354 if v_1.Op != OpARMSLLconst { 15355 break 15356 } 15357 c := v_1.AuxInt 15358 if x != v_1.Args[0] { 15359 break 15360 } 15361 if !(c == d) { 15362 break 15363 } 15364 v.reset(OpARMMOVWconst) 15365 v.AuxInt = 0 15366 return true 15367 } 15368 return false 15369 } 15370 func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { 15371 b := v.Block 15372 _ = b 15373 // match: (SUBshiftLLreg (MOVWconst [c]) x y) 15374 // cond: 15375 // result: (RSBconst [c] (SLL <x.Type> x y)) 15376 for { 15377 _ = v.Args[2] 15378 v_0 := v.Args[0] 15379 if v_0.Op != OpARMMOVWconst { 15380 break 15381 } 15382 c := v_0.AuxInt 15383 x := v.Args[1] 15384 y := v.Args[2] 15385 v.reset(OpARMRSBconst) 15386 v.AuxInt = c 15387 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15388 v0.AddArg(x) 15389 v0.AddArg(y) 15390 v.AddArg(v0) 15391 return true 15392 } 15393 // match: (SUBshiftLLreg x y (MOVWconst [c])) 15394 // cond: 15395 // result: (SUBshiftLL x y [c]) 15396 for { 15397 _ = v.Args[2] 15398 x := v.Args[0] 15399 y := v.Args[1] 15400 v_2 := v.Args[2] 15401 if v_2.Op != OpARMMOVWconst { 15402 break 15403 } 15404 c := v_2.AuxInt 15405 v.reset(OpARMSUBshiftLL) 15406 v.AuxInt = c 15407 v.AddArg(x) 15408 v.AddArg(y) 15409 return true 15410 } 15411 return false 15412 } 15413 func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { 15414 b := v.Block 15415 _ = b 15416 // match: (SUBshiftRA (MOVWconst [c]) x [d]) 15417 // cond: 15418 // result: (RSBconst [c] (SRAconst <x.Type> x [d])) 15419 for { 15420 d := v.AuxInt 15421 _ = v.Args[1] 15422 v_0 := v.Args[0] 15423 if v_0.Op != OpARMMOVWconst { 15424 break 15425 } 15426 c := v_0.AuxInt 15427 x := v.Args[1] 15428 v.reset(OpARMRSBconst) 15429 v.AuxInt = c 15430 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 15431 v0.AuxInt = d 15432 v0.AddArg(x) 15433 v.AddArg(v0) 15434 return true 15435 } 15436 // match: (SUBshiftRA x (MOVWconst [c]) [d]) 15437 // cond: 15438 // result: (SUBconst x [int64(int32(c)>>uint64(d))]) 15439 for { 15440 d := v.AuxInt 15441 _ = v.Args[1] 15442 x := v.Args[0] 15443 v_1 := v.Args[1] 15444 if v_1.Op != OpARMMOVWconst { 15445 break 15446 } 15447 c := v_1.AuxInt 15448 v.reset(OpARMSUBconst) 15449 v.AuxInt = int64(int32(c) >> uint64(d)) 15450 v.AddArg(x) 15451 return true 15452 } 15453 // match: (SUBshiftRA x (SRAconst x [c]) [d]) 15454 // cond: c==d 15455 // result: (MOVWconst [0]) 15456 for { 15457 d := v.AuxInt 15458 _ = v.Args[1] 15459 x := v.Args[0] 15460 v_1 := v.Args[1] 15461 if v_1.Op != OpARMSRAconst { 15462 break 15463 } 15464 c := v_1.AuxInt 15465 if x != v_1.Args[0] { 15466 break 15467 } 15468 if !(c == d) { 15469 break 15470 } 15471 v.reset(OpARMMOVWconst) 15472 v.AuxInt = 0 15473 return true 15474 } 15475 return false 15476 } 15477 func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { 15478 b := v.Block 15479 _ = b 15480 // match: (SUBshiftRAreg (MOVWconst [c]) x y) 15481 // cond: 15482 // result: (RSBconst [c] (SRA <x.Type> x y)) 15483 for { 15484 _ = v.Args[2] 15485 v_0 := v.Args[0] 15486 if v_0.Op != OpARMMOVWconst { 15487 break 15488 } 15489 c := v_0.AuxInt 15490 x := v.Args[1] 15491 y := v.Args[2] 15492 v.reset(OpARMRSBconst) 15493 v.AuxInt = c 15494 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 15495 v0.AddArg(x) 15496 v0.AddArg(y) 15497 v.AddArg(v0) 15498 return true 15499 } 15500 // match: (SUBshiftRAreg x y (MOVWconst [c])) 15501 // cond: 15502 // result: (SUBshiftRA x y [c]) 15503 for { 15504 _ = v.Args[2] 15505 x := v.Args[0] 15506 y := v.Args[1] 15507 v_2 := v.Args[2] 15508 if v_2.Op != OpARMMOVWconst { 15509 break 15510 } 15511 c := v_2.AuxInt 15512 v.reset(OpARMSUBshiftRA) 15513 v.AuxInt = c 15514 v.AddArg(x) 15515 v.AddArg(y) 15516 return true 15517 } 15518 return false 15519 } 15520 func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { 15521 b := v.Block 15522 _ = b 15523 // match: (SUBshiftRL (MOVWconst [c]) x [d]) 15524 // cond: 15525 // result: (RSBconst [c] (SRLconst <x.Type> x [d])) 15526 for { 15527 d := v.AuxInt 15528 _ = v.Args[1] 15529 v_0 := v.Args[0] 15530 if v_0.Op != OpARMMOVWconst { 15531 break 15532 } 15533 c := v_0.AuxInt 15534 x := v.Args[1] 15535 v.reset(OpARMRSBconst) 15536 v.AuxInt = c 15537 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 15538 v0.AuxInt = d 15539 v0.AddArg(x) 15540 v.AddArg(v0) 15541 return true 15542 } 15543 // match: (SUBshiftRL x (MOVWconst [c]) [d]) 15544 // cond: 15545 // result: (SUBconst x [int64(int32(uint32(c)>>uint64(d)))]) 15546 for { 15547 d := v.AuxInt 15548 _ = v.Args[1] 15549 x := v.Args[0] 15550 v_1 := v.Args[1] 15551 if v_1.Op != OpARMMOVWconst { 15552 break 15553 } 15554 c := v_1.AuxInt 15555 v.reset(OpARMSUBconst) 15556 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 15557 v.AddArg(x) 15558 return true 15559 } 15560 // match: (SUBshiftRL x (SRLconst x [c]) [d]) 15561 // cond: c==d 15562 // result: (MOVWconst [0]) 15563 for { 15564 d := v.AuxInt 15565 _ = v.Args[1] 15566 x := v.Args[0] 15567 v_1 := v.Args[1] 15568 if v_1.Op != OpARMSRLconst { 15569 break 15570 } 15571 c := v_1.AuxInt 15572 if x != v_1.Args[0] { 15573 break 15574 } 15575 if !(c == d) { 15576 break 15577 } 15578 v.reset(OpARMMOVWconst) 15579 v.AuxInt = 0 15580 return true 15581 } 15582 return false 15583 } 15584 func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { 15585 b := v.Block 15586 _ = b 15587 // match: (SUBshiftRLreg (MOVWconst [c]) x y) 15588 // cond: 15589 // result: (RSBconst [c] (SRL <x.Type> x y)) 15590 for { 15591 _ = v.Args[2] 15592 v_0 := v.Args[0] 15593 if v_0.Op != OpARMMOVWconst { 15594 break 15595 } 15596 c := v_0.AuxInt 15597 x := v.Args[1] 15598 y := v.Args[2] 15599 v.reset(OpARMRSBconst) 15600 v.AuxInt = c 15601 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 15602 v0.AddArg(x) 15603 v0.AddArg(y) 15604 v.AddArg(v0) 15605 return true 15606 } 15607 // match: (SUBshiftRLreg x y (MOVWconst [c])) 15608 // cond: 15609 // result: (SUBshiftRL x y [c]) 15610 for { 15611 _ = v.Args[2] 15612 x := v.Args[0] 15613 y := v.Args[1] 15614 v_2 := v.Args[2] 15615 if v_2.Op != OpARMMOVWconst { 15616 break 15617 } 15618 c := v_2.AuxInt 15619 v.reset(OpARMSUBshiftRL) 15620 v.AuxInt = c 15621 v.AddArg(x) 15622 v.AddArg(y) 15623 return true 15624 } 15625 return false 15626 } 15627 func rewriteValueARM_OpARMTEQ_0(v *Value) bool { 15628 // match: (TEQ x (MOVWconst [c])) 15629 // cond: 15630 // result: (TEQconst [c] x) 15631 for { 15632 _ = v.Args[1] 15633 x := v.Args[0] 15634 v_1 := v.Args[1] 15635 if v_1.Op != OpARMMOVWconst { 15636 break 15637 } 15638 c := v_1.AuxInt 15639 v.reset(OpARMTEQconst) 15640 v.AuxInt = c 15641 v.AddArg(x) 15642 return true 15643 } 15644 // match: (TEQ (MOVWconst [c]) x) 15645 // cond: 15646 // result: (TEQconst [c] x) 15647 for { 15648 _ = v.Args[1] 15649 v_0 := v.Args[0] 15650 if v_0.Op != OpARMMOVWconst { 15651 break 15652 } 15653 c := v_0.AuxInt 15654 x := v.Args[1] 15655 v.reset(OpARMTEQconst) 15656 v.AuxInt = c 15657 v.AddArg(x) 15658 return true 15659 } 15660 // match: (TEQ x (SLLconst [c] y)) 15661 // cond: 15662 // result: (TEQshiftLL x y [c]) 15663 for { 15664 _ = v.Args[1] 15665 x := v.Args[0] 15666 v_1 := v.Args[1] 15667 if v_1.Op != OpARMSLLconst { 15668 break 15669 } 15670 c := v_1.AuxInt 15671 y := v_1.Args[0] 15672 v.reset(OpARMTEQshiftLL) 15673 v.AuxInt = c 15674 v.AddArg(x) 15675 v.AddArg(y) 15676 return true 15677 } 15678 // match: (TEQ (SLLconst [c] y) x) 15679 // cond: 15680 // result: (TEQshiftLL x y [c]) 15681 for { 15682 _ = v.Args[1] 15683 v_0 := v.Args[0] 15684 if v_0.Op != OpARMSLLconst { 15685 break 15686 } 15687 c := v_0.AuxInt 15688 y := v_0.Args[0] 15689 x := v.Args[1] 15690 v.reset(OpARMTEQshiftLL) 15691 v.AuxInt = c 15692 v.AddArg(x) 15693 v.AddArg(y) 15694 return true 15695 } 15696 // match: (TEQ x (SRLconst [c] y)) 15697 // cond: 15698 // result: (TEQshiftRL x y [c]) 15699 for { 15700 _ = v.Args[1] 15701 x := v.Args[0] 15702 v_1 := v.Args[1] 15703 if v_1.Op != OpARMSRLconst { 15704 break 15705 } 15706 c := v_1.AuxInt 15707 y := v_1.Args[0] 15708 v.reset(OpARMTEQshiftRL) 15709 v.AuxInt = c 15710 v.AddArg(x) 15711 v.AddArg(y) 15712 return true 15713 } 15714 // match: (TEQ (SRLconst [c] y) x) 15715 // cond: 15716 // result: (TEQshiftRL x y [c]) 15717 for { 15718 _ = v.Args[1] 15719 v_0 := v.Args[0] 15720 if v_0.Op != OpARMSRLconst { 15721 break 15722 } 15723 c := v_0.AuxInt 15724 y := v_0.Args[0] 15725 x := v.Args[1] 15726 v.reset(OpARMTEQshiftRL) 15727 v.AuxInt = c 15728 v.AddArg(x) 15729 v.AddArg(y) 15730 return true 15731 } 15732 // match: (TEQ x (SRAconst [c] y)) 15733 // cond: 15734 // result: (TEQshiftRA x y [c]) 15735 for { 15736 _ = v.Args[1] 15737 x := v.Args[0] 15738 v_1 := v.Args[1] 15739 if v_1.Op != OpARMSRAconst { 15740 break 15741 } 15742 c := v_1.AuxInt 15743 y := v_1.Args[0] 15744 v.reset(OpARMTEQshiftRA) 15745 v.AuxInt = c 15746 v.AddArg(x) 15747 v.AddArg(y) 15748 return true 15749 } 15750 // match: (TEQ (SRAconst [c] y) x) 15751 // cond: 15752 // result: (TEQshiftRA x y [c]) 15753 for { 15754 _ = v.Args[1] 15755 v_0 := v.Args[0] 15756 if v_0.Op != OpARMSRAconst { 15757 break 15758 } 15759 c := v_0.AuxInt 15760 y := v_0.Args[0] 15761 x := v.Args[1] 15762 v.reset(OpARMTEQshiftRA) 15763 v.AuxInt = c 15764 v.AddArg(x) 15765 v.AddArg(y) 15766 return true 15767 } 15768 // match: (TEQ x (SLL y z)) 15769 // cond: 15770 // result: (TEQshiftLLreg x y z) 15771 for { 15772 _ = v.Args[1] 15773 x := v.Args[0] 15774 v_1 := v.Args[1] 15775 if v_1.Op != OpARMSLL { 15776 break 15777 } 15778 _ = v_1.Args[1] 15779 y := v_1.Args[0] 15780 z := v_1.Args[1] 15781 v.reset(OpARMTEQshiftLLreg) 15782 v.AddArg(x) 15783 v.AddArg(y) 15784 v.AddArg(z) 15785 return true 15786 } 15787 // match: (TEQ (SLL y z) x) 15788 // cond: 15789 // result: (TEQshiftLLreg x y z) 15790 for { 15791 _ = v.Args[1] 15792 v_0 := v.Args[0] 15793 if v_0.Op != OpARMSLL { 15794 break 15795 } 15796 _ = v_0.Args[1] 15797 y := v_0.Args[0] 15798 z := v_0.Args[1] 15799 x := v.Args[1] 15800 v.reset(OpARMTEQshiftLLreg) 15801 v.AddArg(x) 15802 v.AddArg(y) 15803 v.AddArg(z) 15804 return true 15805 } 15806 return false 15807 } 15808 func rewriteValueARM_OpARMTEQ_10(v *Value) bool { 15809 // match: (TEQ x (SRL y z)) 15810 // cond: 15811 // result: (TEQshiftRLreg x y z) 15812 for { 15813 _ = v.Args[1] 15814 x := v.Args[0] 15815 v_1 := v.Args[1] 15816 if v_1.Op != OpARMSRL { 15817 break 15818 } 15819 _ = v_1.Args[1] 15820 y := v_1.Args[0] 15821 z := v_1.Args[1] 15822 v.reset(OpARMTEQshiftRLreg) 15823 v.AddArg(x) 15824 v.AddArg(y) 15825 v.AddArg(z) 15826 return true 15827 } 15828 // match: (TEQ (SRL y z) x) 15829 // cond: 15830 // result: (TEQshiftRLreg x y z) 15831 for { 15832 _ = v.Args[1] 15833 v_0 := v.Args[0] 15834 if v_0.Op != OpARMSRL { 15835 break 15836 } 15837 _ = v_0.Args[1] 15838 y := v_0.Args[0] 15839 z := v_0.Args[1] 15840 x := v.Args[1] 15841 v.reset(OpARMTEQshiftRLreg) 15842 v.AddArg(x) 15843 v.AddArg(y) 15844 v.AddArg(z) 15845 return true 15846 } 15847 // match: (TEQ x (SRA y z)) 15848 // cond: 15849 // result: (TEQshiftRAreg x y z) 15850 for { 15851 _ = v.Args[1] 15852 x := v.Args[0] 15853 v_1 := v.Args[1] 15854 if v_1.Op != OpARMSRA { 15855 break 15856 } 15857 _ = v_1.Args[1] 15858 y := v_1.Args[0] 15859 z := v_1.Args[1] 15860 v.reset(OpARMTEQshiftRAreg) 15861 v.AddArg(x) 15862 v.AddArg(y) 15863 v.AddArg(z) 15864 return true 15865 } 15866 // match: (TEQ (SRA y z) x) 15867 // cond: 15868 // result: (TEQshiftRAreg x y z) 15869 for { 15870 _ = v.Args[1] 15871 v_0 := v.Args[0] 15872 if v_0.Op != OpARMSRA { 15873 break 15874 } 15875 _ = v_0.Args[1] 15876 y := v_0.Args[0] 15877 z := v_0.Args[1] 15878 x := v.Args[1] 15879 v.reset(OpARMTEQshiftRAreg) 15880 v.AddArg(x) 15881 v.AddArg(y) 15882 v.AddArg(z) 15883 return true 15884 } 15885 return false 15886 } 15887 func rewriteValueARM_OpARMTEQconst_0(v *Value) bool { 15888 // match: (TEQconst (MOVWconst [x]) [y]) 15889 // cond: int32(x^y)==0 15890 // result: (FlagEQ) 15891 for { 15892 y := v.AuxInt 15893 v_0 := v.Args[0] 15894 if v_0.Op != OpARMMOVWconst { 15895 break 15896 } 15897 x := v_0.AuxInt 15898 if !(int32(x^y) == 0) { 15899 break 15900 } 15901 v.reset(OpARMFlagEQ) 15902 return true 15903 } 15904 // match: (TEQconst (MOVWconst [x]) [y]) 15905 // cond: int32(x^y)<0 15906 // result: (FlagLT_UGT) 15907 for { 15908 y := v.AuxInt 15909 v_0 := v.Args[0] 15910 if v_0.Op != OpARMMOVWconst { 15911 break 15912 } 15913 x := v_0.AuxInt 15914 if !(int32(x^y) < 0) { 15915 break 15916 } 15917 v.reset(OpARMFlagLT_UGT) 15918 return true 15919 } 15920 // match: (TEQconst (MOVWconst [x]) [y]) 15921 // cond: int32(x^y)>0 15922 // result: (FlagGT_UGT) 15923 for { 15924 y := v.AuxInt 15925 v_0 := v.Args[0] 15926 if v_0.Op != OpARMMOVWconst { 15927 break 15928 } 15929 x := v_0.AuxInt 15930 if !(int32(x^y) > 0) { 15931 break 15932 } 15933 v.reset(OpARMFlagGT_UGT) 15934 return true 15935 } 15936 return false 15937 } 15938 func rewriteValueARM_OpARMTEQshiftLL_0(v *Value) bool { 15939 b := v.Block 15940 _ = b 15941 // match: (TEQshiftLL (MOVWconst [c]) x [d]) 15942 // cond: 15943 // result: (TEQconst [c] (SLLconst <x.Type> x [d])) 15944 for { 15945 d := v.AuxInt 15946 _ = v.Args[1] 15947 v_0 := v.Args[0] 15948 if v_0.Op != OpARMMOVWconst { 15949 break 15950 } 15951 c := v_0.AuxInt 15952 x := v.Args[1] 15953 v.reset(OpARMTEQconst) 15954 v.AuxInt = c 15955 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 15956 v0.AuxInt = d 15957 v0.AddArg(x) 15958 v.AddArg(v0) 15959 return true 15960 } 15961 // match: (TEQshiftLL x (MOVWconst [c]) [d]) 15962 // cond: 15963 // result: (TEQconst x [int64(int32(uint32(c)<<uint64(d)))]) 15964 for { 15965 d := v.AuxInt 15966 _ = v.Args[1] 15967 x := v.Args[0] 15968 v_1 := v.Args[1] 15969 if v_1.Op != OpARMMOVWconst { 15970 break 15971 } 15972 c := v_1.AuxInt 15973 v.reset(OpARMTEQconst) 15974 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 15975 v.AddArg(x) 15976 return true 15977 } 15978 return false 15979 } 15980 func rewriteValueARM_OpARMTEQshiftLLreg_0(v *Value) bool { 15981 b := v.Block 15982 _ = b 15983 // match: (TEQshiftLLreg (MOVWconst [c]) x y) 15984 // cond: 15985 // result: (TEQconst [c] (SLL <x.Type> x y)) 15986 for { 15987 _ = v.Args[2] 15988 v_0 := v.Args[0] 15989 if v_0.Op != OpARMMOVWconst { 15990 break 15991 } 15992 c := v_0.AuxInt 15993 x := v.Args[1] 15994 y := v.Args[2] 15995 v.reset(OpARMTEQconst) 15996 v.AuxInt = c 15997 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 15998 v0.AddArg(x) 15999 v0.AddArg(y) 16000 v.AddArg(v0) 16001 return true 16002 } 16003 // match: (TEQshiftLLreg x y (MOVWconst [c])) 16004 // cond: 16005 // result: (TEQshiftLL x y [c]) 16006 for { 16007 _ = v.Args[2] 16008 x := v.Args[0] 16009 y := v.Args[1] 16010 v_2 := v.Args[2] 16011 if v_2.Op != OpARMMOVWconst { 16012 break 16013 } 16014 c := v_2.AuxInt 16015 v.reset(OpARMTEQshiftLL) 16016 v.AuxInt = c 16017 v.AddArg(x) 16018 v.AddArg(y) 16019 return true 16020 } 16021 return false 16022 } 16023 func rewriteValueARM_OpARMTEQshiftRA_0(v *Value) bool { 16024 b := v.Block 16025 _ = b 16026 // match: (TEQshiftRA (MOVWconst [c]) x [d]) 16027 // cond: 16028 // result: (TEQconst [c] (SRAconst <x.Type> x [d])) 16029 for { 16030 d := v.AuxInt 16031 _ = v.Args[1] 16032 v_0 := v.Args[0] 16033 if v_0.Op != OpARMMOVWconst { 16034 break 16035 } 16036 c := v_0.AuxInt 16037 x := v.Args[1] 16038 v.reset(OpARMTEQconst) 16039 v.AuxInt = c 16040 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 16041 v0.AuxInt = d 16042 v0.AddArg(x) 16043 v.AddArg(v0) 16044 return true 16045 } 16046 // match: (TEQshiftRA x (MOVWconst [c]) [d]) 16047 // cond: 16048 // result: (TEQconst x [int64(int32(c)>>uint64(d))]) 16049 for { 16050 d := v.AuxInt 16051 _ = v.Args[1] 16052 x := v.Args[0] 16053 v_1 := v.Args[1] 16054 if v_1.Op != OpARMMOVWconst { 16055 break 16056 } 16057 c := v_1.AuxInt 16058 v.reset(OpARMTEQconst) 16059 v.AuxInt = int64(int32(c) >> uint64(d)) 16060 v.AddArg(x) 16061 return true 16062 } 16063 return false 16064 } 16065 func rewriteValueARM_OpARMTEQshiftRAreg_0(v *Value) bool { 16066 b := v.Block 16067 _ = b 16068 // match: (TEQshiftRAreg (MOVWconst [c]) x y) 16069 // cond: 16070 // result: (TEQconst [c] (SRA <x.Type> x y)) 16071 for { 16072 _ = v.Args[2] 16073 v_0 := v.Args[0] 16074 if v_0.Op != OpARMMOVWconst { 16075 break 16076 } 16077 c := v_0.AuxInt 16078 x := v.Args[1] 16079 y := v.Args[2] 16080 v.reset(OpARMTEQconst) 16081 v.AuxInt = c 16082 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 16083 v0.AddArg(x) 16084 v0.AddArg(y) 16085 v.AddArg(v0) 16086 return true 16087 } 16088 // match: (TEQshiftRAreg x y (MOVWconst [c])) 16089 // cond: 16090 // result: (TEQshiftRA x y [c]) 16091 for { 16092 _ = v.Args[2] 16093 x := v.Args[0] 16094 y := v.Args[1] 16095 v_2 := v.Args[2] 16096 if v_2.Op != OpARMMOVWconst { 16097 break 16098 } 16099 c := v_2.AuxInt 16100 v.reset(OpARMTEQshiftRA) 16101 v.AuxInt = c 16102 v.AddArg(x) 16103 v.AddArg(y) 16104 return true 16105 } 16106 return false 16107 } 16108 func rewriteValueARM_OpARMTEQshiftRL_0(v *Value) bool { 16109 b := v.Block 16110 _ = b 16111 // match: (TEQshiftRL (MOVWconst [c]) x [d]) 16112 // cond: 16113 // result: (TEQconst [c] (SRLconst <x.Type> x [d])) 16114 for { 16115 d := v.AuxInt 16116 _ = v.Args[1] 16117 v_0 := v.Args[0] 16118 if v_0.Op != OpARMMOVWconst { 16119 break 16120 } 16121 c := v_0.AuxInt 16122 x := v.Args[1] 16123 v.reset(OpARMTEQconst) 16124 v.AuxInt = c 16125 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 16126 v0.AuxInt = d 16127 v0.AddArg(x) 16128 v.AddArg(v0) 16129 return true 16130 } 16131 // match: (TEQshiftRL x (MOVWconst [c]) [d]) 16132 // cond: 16133 // result: (TEQconst x [int64(int32(uint32(c)>>uint64(d)))]) 16134 for { 16135 d := v.AuxInt 16136 _ = v.Args[1] 16137 x := v.Args[0] 16138 v_1 := v.Args[1] 16139 if v_1.Op != OpARMMOVWconst { 16140 break 16141 } 16142 c := v_1.AuxInt 16143 v.reset(OpARMTEQconst) 16144 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 16145 v.AddArg(x) 16146 return true 16147 } 16148 return false 16149 } 16150 func rewriteValueARM_OpARMTEQshiftRLreg_0(v *Value) bool { 16151 b := v.Block 16152 _ = b 16153 // match: (TEQshiftRLreg (MOVWconst [c]) x y) 16154 // cond: 16155 // result: (TEQconst [c] (SRL <x.Type> x y)) 16156 for { 16157 _ = v.Args[2] 16158 v_0 := v.Args[0] 16159 if v_0.Op != OpARMMOVWconst { 16160 break 16161 } 16162 c := v_0.AuxInt 16163 x := v.Args[1] 16164 y := v.Args[2] 16165 v.reset(OpARMTEQconst) 16166 v.AuxInt = c 16167 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16168 v0.AddArg(x) 16169 v0.AddArg(y) 16170 v.AddArg(v0) 16171 return true 16172 } 16173 // match: (TEQshiftRLreg x y (MOVWconst [c])) 16174 // cond: 16175 // result: (TEQshiftRL x y [c]) 16176 for { 16177 _ = v.Args[2] 16178 x := v.Args[0] 16179 y := v.Args[1] 16180 v_2 := v.Args[2] 16181 if v_2.Op != OpARMMOVWconst { 16182 break 16183 } 16184 c := v_2.AuxInt 16185 v.reset(OpARMTEQshiftRL) 16186 v.AuxInt = c 16187 v.AddArg(x) 16188 v.AddArg(y) 16189 return true 16190 } 16191 return false 16192 } 16193 func rewriteValueARM_OpARMTST_0(v *Value) bool { 16194 // match: (TST x (MOVWconst [c])) 16195 // cond: 16196 // result: (TSTconst [c] x) 16197 for { 16198 _ = v.Args[1] 16199 x := v.Args[0] 16200 v_1 := v.Args[1] 16201 if v_1.Op != OpARMMOVWconst { 16202 break 16203 } 16204 c := v_1.AuxInt 16205 v.reset(OpARMTSTconst) 16206 v.AuxInt = c 16207 v.AddArg(x) 16208 return true 16209 } 16210 // match: (TST (MOVWconst [c]) x) 16211 // cond: 16212 // result: (TSTconst [c] x) 16213 for { 16214 _ = v.Args[1] 16215 v_0 := v.Args[0] 16216 if v_0.Op != OpARMMOVWconst { 16217 break 16218 } 16219 c := v_0.AuxInt 16220 x := v.Args[1] 16221 v.reset(OpARMTSTconst) 16222 v.AuxInt = c 16223 v.AddArg(x) 16224 return true 16225 } 16226 // match: (TST x (SLLconst [c] y)) 16227 // cond: 16228 // result: (TSTshiftLL x y [c]) 16229 for { 16230 _ = v.Args[1] 16231 x := v.Args[0] 16232 v_1 := v.Args[1] 16233 if v_1.Op != OpARMSLLconst { 16234 break 16235 } 16236 c := v_1.AuxInt 16237 y := v_1.Args[0] 16238 v.reset(OpARMTSTshiftLL) 16239 v.AuxInt = c 16240 v.AddArg(x) 16241 v.AddArg(y) 16242 return true 16243 } 16244 // match: (TST (SLLconst [c] y) x) 16245 // cond: 16246 // result: (TSTshiftLL x y [c]) 16247 for { 16248 _ = v.Args[1] 16249 v_0 := v.Args[0] 16250 if v_0.Op != OpARMSLLconst { 16251 break 16252 } 16253 c := v_0.AuxInt 16254 y := v_0.Args[0] 16255 x := v.Args[1] 16256 v.reset(OpARMTSTshiftLL) 16257 v.AuxInt = c 16258 v.AddArg(x) 16259 v.AddArg(y) 16260 return true 16261 } 16262 // match: (TST x (SRLconst [c] y)) 16263 // cond: 16264 // result: (TSTshiftRL x y [c]) 16265 for { 16266 _ = v.Args[1] 16267 x := v.Args[0] 16268 v_1 := v.Args[1] 16269 if v_1.Op != OpARMSRLconst { 16270 break 16271 } 16272 c := v_1.AuxInt 16273 y := v_1.Args[0] 16274 v.reset(OpARMTSTshiftRL) 16275 v.AuxInt = c 16276 v.AddArg(x) 16277 v.AddArg(y) 16278 return true 16279 } 16280 // match: (TST (SRLconst [c] y) x) 16281 // cond: 16282 // result: (TSTshiftRL x y [c]) 16283 for { 16284 _ = v.Args[1] 16285 v_0 := v.Args[0] 16286 if v_0.Op != OpARMSRLconst { 16287 break 16288 } 16289 c := v_0.AuxInt 16290 y := v_0.Args[0] 16291 x := v.Args[1] 16292 v.reset(OpARMTSTshiftRL) 16293 v.AuxInt = c 16294 v.AddArg(x) 16295 v.AddArg(y) 16296 return true 16297 } 16298 // match: (TST x (SRAconst [c] y)) 16299 // cond: 16300 // result: (TSTshiftRA x y [c]) 16301 for { 16302 _ = v.Args[1] 16303 x := v.Args[0] 16304 v_1 := v.Args[1] 16305 if v_1.Op != OpARMSRAconst { 16306 break 16307 } 16308 c := v_1.AuxInt 16309 y := v_1.Args[0] 16310 v.reset(OpARMTSTshiftRA) 16311 v.AuxInt = c 16312 v.AddArg(x) 16313 v.AddArg(y) 16314 return true 16315 } 16316 // match: (TST (SRAconst [c] y) x) 16317 // cond: 16318 // result: (TSTshiftRA x y [c]) 16319 for { 16320 _ = v.Args[1] 16321 v_0 := v.Args[0] 16322 if v_0.Op != OpARMSRAconst { 16323 break 16324 } 16325 c := v_0.AuxInt 16326 y := v_0.Args[0] 16327 x := v.Args[1] 16328 v.reset(OpARMTSTshiftRA) 16329 v.AuxInt = c 16330 v.AddArg(x) 16331 v.AddArg(y) 16332 return true 16333 } 16334 // match: (TST x (SLL y z)) 16335 // cond: 16336 // result: (TSTshiftLLreg x y z) 16337 for { 16338 _ = v.Args[1] 16339 x := v.Args[0] 16340 v_1 := v.Args[1] 16341 if v_1.Op != OpARMSLL { 16342 break 16343 } 16344 _ = v_1.Args[1] 16345 y := v_1.Args[0] 16346 z := v_1.Args[1] 16347 v.reset(OpARMTSTshiftLLreg) 16348 v.AddArg(x) 16349 v.AddArg(y) 16350 v.AddArg(z) 16351 return true 16352 } 16353 // match: (TST (SLL y z) x) 16354 // cond: 16355 // result: (TSTshiftLLreg x y z) 16356 for { 16357 _ = v.Args[1] 16358 v_0 := v.Args[0] 16359 if v_0.Op != OpARMSLL { 16360 break 16361 } 16362 _ = v_0.Args[1] 16363 y := v_0.Args[0] 16364 z := v_0.Args[1] 16365 x := v.Args[1] 16366 v.reset(OpARMTSTshiftLLreg) 16367 v.AddArg(x) 16368 v.AddArg(y) 16369 v.AddArg(z) 16370 return true 16371 } 16372 return false 16373 } 16374 func rewriteValueARM_OpARMTST_10(v *Value) bool { 16375 // match: (TST x (SRL y z)) 16376 // cond: 16377 // result: (TSTshiftRLreg x y z) 16378 for { 16379 _ = v.Args[1] 16380 x := v.Args[0] 16381 v_1 := v.Args[1] 16382 if v_1.Op != OpARMSRL { 16383 break 16384 } 16385 _ = v_1.Args[1] 16386 y := v_1.Args[0] 16387 z := v_1.Args[1] 16388 v.reset(OpARMTSTshiftRLreg) 16389 v.AddArg(x) 16390 v.AddArg(y) 16391 v.AddArg(z) 16392 return true 16393 } 16394 // match: (TST (SRL y z) x) 16395 // cond: 16396 // result: (TSTshiftRLreg x y z) 16397 for { 16398 _ = v.Args[1] 16399 v_0 := v.Args[0] 16400 if v_0.Op != OpARMSRL { 16401 break 16402 } 16403 _ = v_0.Args[1] 16404 y := v_0.Args[0] 16405 z := v_0.Args[1] 16406 x := v.Args[1] 16407 v.reset(OpARMTSTshiftRLreg) 16408 v.AddArg(x) 16409 v.AddArg(y) 16410 v.AddArg(z) 16411 return true 16412 } 16413 // match: (TST x (SRA y z)) 16414 // cond: 16415 // result: (TSTshiftRAreg x y z) 16416 for { 16417 _ = v.Args[1] 16418 x := v.Args[0] 16419 v_1 := v.Args[1] 16420 if v_1.Op != OpARMSRA { 16421 break 16422 } 16423 _ = v_1.Args[1] 16424 y := v_1.Args[0] 16425 z := v_1.Args[1] 16426 v.reset(OpARMTSTshiftRAreg) 16427 v.AddArg(x) 16428 v.AddArg(y) 16429 v.AddArg(z) 16430 return true 16431 } 16432 // match: (TST (SRA y z) x) 16433 // cond: 16434 // result: (TSTshiftRAreg x y z) 16435 for { 16436 _ = v.Args[1] 16437 v_0 := v.Args[0] 16438 if v_0.Op != OpARMSRA { 16439 break 16440 } 16441 _ = v_0.Args[1] 16442 y := v_0.Args[0] 16443 z := v_0.Args[1] 16444 x := v.Args[1] 16445 v.reset(OpARMTSTshiftRAreg) 16446 v.AddArg(x) 16447 v.AddArg(y) 16448 v.AddArg(z) 16449 return true 16450 } 16451 return false 16452 } 16453 func rewriteValueARM_OpARMTSTconst_0(v *Value) bool { 16454 // match: (TSTconst (MOVWconst [x]) [y]) 16455 // cond: int32(x&y)==0 16456 // result: (FlagEQ) 16457 for { 16458 y := v.AuxInt 16459 v_0 := v.Args[0] 16460 if v_0.Op != OpARMMOVWconst { 16461 break 16462 } 16463 x := v_0.AuxInt 16464 if !(int32(x&y) == 0) { 16465 break 16466 } 16467 v.reset(OpARMFlagEQ) 16468 return true 16469 } 16470 // match: (TSTconst (MOVWconst [x]) [y]) 16471 // cond: int32(x&y)<0 16472 // result: (FlagLT_UGT) 16473 for { 16474 y := v.AuxInt 16475 v_0 := v.Args[0] 16476 if v_0.Op != OpARMMOVWconst { 16477 break 16478 } 16479 x := v_0.AuxInt 16480 if !(int32(x&y) < 0) { 16481 break 16482 } 16483 v.reset(OpARMFlagLT_UGT) 16484 return true 16485 } 16486 // match: (TSTconst (MOVWconst [x]) [y]) 16487 // cond: int32(x&y)>0 16488 // result: (FlagGT_UGT) 16489 for { 16490 y := v.AuxInt 16491 v_0 := v.Args[0] 16492 if v_0.Op != OpARMMOVWconst { 16493 break 16494 } 16495 x := v_0.AuxInt 16496 if !(int32(x&y) > 0) { 16497 break 16498 } 16499 v.reset(OpARMFlagGT_UGT) 16500 return true 16501 } 16502 return false 16503 } 16504 func rewriteValueARM_OpARMTSTshiftLL_0(v *Value) bool { 16505 b := v.Block 16506 _ = b 16507 // match: (TSTshiftLL (MOVWconst [c]) x [d]) 16508 // cond: 16509 // result: (TSTconst [c] (SLLconst <x.Type> x [d])) 16510 for { 16511 d := v.AuxInt 16512 _ = v.Args[1] 16513 v_0 := v.Args[0] 16514 if v_0.Op != OpARMMOVWconst { 16515 break 16516 } 16517 c := v_0.AuxInt 16518 x := v.Args[1] 16519 v.reset(OpARMTSTconst) 16520 v.AuxInt = c 16521 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 16522 v0.AuxInt = d 16523 v0.AddArg(x) 16524 v.AddArg(v0) 16525 return true 16526 } 16527 // match: (TSTshiftLL x (MOVWconst [c]) [d]) 16528 // cond: 16529 // result: (TSTconst x [int64(int32(uint32(c)<<uint64(d)))]) 16530 for { 16531 d := v.AuxInt 16532 _ = v.Args[1] 16533 x := v.Args[0] 16534 v_1 := v.Args[1] 16535 if v_1.Op != OpARMMOVWconst { 16536 break 16537 } 16538 c := v_1.AuxInt 16539 v.reset(OpARMTSTconst) 16540 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 16541 v.AddArg(x) 16542 return true 16543 } 16544 return false 16545 } 16546 func rewriteValueARM_OpARMTSTshiftLLreg_0(v *Value) bool { 16547 b := v.Block 16548 _ = b 16549 // match: (TSTshiftLLreg (MOVWconst [c]) x y) 16550 // cond: 16551 // result: (TSTconst [c] (SLL <x.Type> x y)) 16552 for { 16553 _ = v.Args[2] 16554 v_0 := v.Args[0] 16555 if v_0.Op != OpARMMOVWconst { 16556 break 16557 } 16558 c := v_0.AuxInt 16559 x := v.Args[1] 16560 y := v.Args[2] 16561 v.reset(OpARMTSTconst) 16562 v.AuxInt = c 16563 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 16564 v0.AddArg(x) 16565 v0.AddArg(y) 16566 v.AddArg(v0) 16567 return true 16568 } 16569 // match: (TSTshiftLLreg x y (MOVWconst [c])) 16570 // cond: 16571 // result: (TSTshiftLL x y [c]) 16572 for { 16573 _ = v.Args[2] 16574 x := v.Args[0] 16575 y := v.Args[1] 16576 v_2 := v.Args[2] 16577 if v_2.Op != OpARMMOVWconst { 16578 break 16579 } 16580 c := v_2.AuxInt 16581 v.reset(OpARMTSTshiftLL) 16582 v.AuxInt = c 16583 v.AddArg(x) 16584 v.AddArg(y) 16585 return true 16586 } 16587 return false 16588 } 16589 func rewriteValueARM_OpARMTSTshiftRA_0(v *Value) bool { 16590 b := v.Block 16591 _ = b 16592 // match: (TSTshiftRA (MOVWconst [c]) x [d]) 16593 // cond: 16594 // result: (TSTconst [c] (SRAconst <x.Type> x [d])) 16595 for { 16596 d := v.AuxInt 16597 _ = v.Args[1] 16598 v_0 := v.Args[0] 16599 if v_0.Op != OpARMMOVWconst { 16600 break 16601 } 16602 c := v_0.AuxInt 16603 x := v.Args[1] 16604 v.reset(OpARMTSTconst) 16605 v.AuxInt = c 16606 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 16607 v0.AuxInt = d 16608 v0.AddArg(x) 16609 v.AddArg(v0) 16610 return true 16611 } 16612 // match: (TSTshiftRA x (MOVWconst [c]) [d]) 16613 // cond: 16614 // result: (TSTconst x [int64(int32(c)>>uint64(d))]) 16615 for { 16616 d := v.AuxInt 16617 _ = v.Args[1] 16618 x := v.Args[0] 16619 v_1 := v.Args[1] 16620 if v_1.Op != OpARMMOVWconst { 16621 break 16622 } 16623 c := v_1.AuxInt 16624 v.reset(OpARMTSTconst) 16625 v.AuxInt = int64(int32(c) >> uint64(d)) 16626 v.AddArg(x) 16627 return true 16628 } 16629 return false 16630 } 16631 func rewriteValueARM_OpARMTSTshiftRAreg_0(v *Value) bool { 16632 b := v.Block 16633 _ = b 16634 // match: (TSTshiftRAreg (MOVWconst [c]) x y) 16635 // cond: 16636 // result: (TSTconst [c] (SRA <x.Type> x y)) 16637 for { 16638 _ = v.Args[2] 16639 v_0 := v.Args[0] 16640 if v_0.Op != OpARMMOVWconst { 16641 break 16642 } 16643 c := v_0.AuxInt 16644 x := v.Args[1] 16645 y := v.Args[2] 16646 v.reset(OpARMTSTconst) 16647 v.AuxInt = c 16648 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 16649 v0.AddArg(x) 16650 v0.AddArg(y) 16651 v.AddArg(v0) 16652 return true 16653 } 16654 // match: (TSTshiftRAreg x y (MOVWconst [c])) 16655 // cond: 16656 // result: (TSTshiftRA x y [c]) 16657 for { 16658 _ = v.Args[2] 16659 x := v.Args[0] 16660 y := v.Args[1] 16661 v_2 := v.Args[2] 16662 if v_2.Op != OpARMMOVWconst { 16663 break 16664 } 16665 c := v_2.AuxInt 16666 v.reset(OpARMTSTshiftRA) 16667 v.AuxInt = c 16668 v.AddArg(x) 16669 v.AddArg(y) 16670 return true 16671 } 16672 return false 16673 } 16674 func rewriteValueARM_OpARMTSTshiftRL_0(v *Value) bool { 16675 b := v.Block 16676 _ = b 16677 // match: (TSTshiftRL (MOVWconst [c]) x [d]) 16678 // cond: 16679 // result: (TSTconst [c] (SRLconst <x.Type> x [d])) 16680 for { 16681 d := v.AuxInt 16682 _ = v.Args[1] 16683 v_0 := v.Args[0] 16684 if v_0.Op != OpARMMOVWconst { 16685 break 16686 } 16687 c := v_0.AuxInt 16688 x := v.Args[1] 16689 v.reset(OpARMTSTconst) 16690 v.AuxInt = c 16691 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 16692 v0.AuxInt = d 16693 v0.AddArg(x) 16694 v.AddArg(v0) 16695 return true 16696 } 16697 // match: (TSTshiftRL x (MOVWconst [c]) [d]) 16698 // cond: 16699 // result: (TSTconst x [int64(int32(uint32(c)>>uint64(d)))]) 16700 for { 16701 d := v.AuxInt 16702 _ = v.Args[1] 16703 x := v.Args[0] 16704 v_1 := v.Args[1] 16705 if v_1.Op != OpARMMOVWconst { 16706 break 16707 } 16708 c := v_1.AuxInt 16709 v.reset(OpARMTSTconst) 16710 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 16711 v.AddArg(x) 16712 return true 16713 } 16714 return false 16715 } 16716 func rewriteValueARM_OpARMTSTshiftRLreg_0(v *Value) bool { 16717 b := v.Block 16718 _ = b 16719 // match: (TSTshiftRLreg (MOVWconst [c]) x y) 16720 // cond: 16721 // result: (TSTconst [c] (SRL <x.Type> x y)) 16722 for { 16723 _ = v.Args[2] 16724 v_0 := v.Args[0] 16725 if v_0.Op != OpARMMOVWconst { 16726 break 16727 } 16728 c := v_0.AuxInt 16729 x := v.Args[1] 16730 y := v.Args[2] 16731 v.reset(OpARMTSTconst) 16732 v.AuxInt = c 16733 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 16734 v0.AddArg(x) 16735 v0.AddArg(y) 16736 v.AddArg(v0) 16737 return true 16738 } 16739 // match: (TSTshiftRLreg x y (MOVWconst [c])) 16740 // cond: 16741 // result: (TSTshiftRL x y [c]) 16742 for { 16743 _ = v.Args[2] 16744 x := v.Args[0] 16745 y := v.Args[1] 16746 v_2 := v.Args[2] 16747 if v_2.Op != OpARMMOVWconst { 16748 break 16749 } 16750 c := v_2.AuxInt 16751 v.reset(OpARMTSTshiftRL) 16752 v.AuxInt = c 16753 v.AddArg(x) 16754 v.AddArg(y) 16755 return true 16756 } 16757 return false 16758 } 16759 func rewriteValueARM_OpARMXOR_0(v *Value) bool { 16760 // match: (XOR x (MOVWconst [c])) 16761 // cond: 16762 // result: (XORconst [c] x) 16763 for { 16764 _ = v.Args[1] 16765 x := v.Args[0] 16766 v_1 := v.Args[1] 16767 if v_1.Op != OpARMMOVWconst { 16768 break 16769 } 16770 c := v_1.AuxInt 16771 v.reset(OpARMXORconst) 16772 v.AuxInt = c 16773 v.AddArg(x) 16774 return true 16775 } 16776 // match: (XOR (MOVWconst [c]) x) 16777 // cond: 16778 // result: (XORconst [c] x) 16779 for { 16780 _ = v.Args[1] 16781 v_0 := v.Args[0] 16782 if v_0.Op != OpARMMOVWconst { 16783 break 16784 } 16785 c := v_0.AuxInt 16786 x := v.Args[1] 16787 v.reset(OpARMXORconst) 16788 v.AuxInt = c 16789 v.AddArg(x) 16790 return true 16791 } 16792 // match: (XOR x (SLLconst [c] y)) 16793 // cond: 16794 // result: (XORshiftLL x y [c]) 16795 for { 16796 _ = v.Args[1] 16797 x := v.Args[0] 16798 v_1 := v.Args[1] 16799 if v_1.Op != OpARMSLLconst { 16800 break 16801 } 16802 c := v_1.AuxInt 16803 y := v_1.Args[0] 16804 v.reset(OpARMXORshiftLL) 16805 v.AuxInt = c 16806 v.AddArg(x) 16807 v.AddArg(y) 16808 return true 16809 } 16810 // match: (XOR (SLLconst [c] y) x) 16811 // cond: 16812 // result: (XORshiftLL x y [c]) 16813 for { 16814 _ = v.Args[1] 16815 v_0 := v.Args[0] 16816 if v_0.Op != OpARMSLLconst { 16817 break 16818 } 16819 c := v_0.AuxInt 16820 y := v_0.Args[0] 16821 x := v.Args[1] 16822 v.reset(OpARMXORshiftLL) 16823 v.AuxInt = c 16824 v.AddArg(x) 16825 v.AddArg(y) 16826 return true 16827 } 16828 // match: (XOR x (SRLconst [c] y)) 16829 // cond: 16830 // result: (XORshiftRL x y [c]) 16831 for { 16832 _ = v.Args[1] 16833 x := v.Args[0] 16834 v_1 := v.Args[1] 16835 if v_1.Op != OpARMSRLconst { 16836 break 16837 } 16838 c := v_1.AuxInt 16839 y := v_1.Args[0] 16840 v.reset(OpARMXORshiftRL) 16841 v.AuxInt = c 16842 v.AddArg(x) 16843 v.AddArg(y) 16844 return true 16845 } 16846 // match: (XOR (SRLconst [c] y) x) 16847 // cond: 16848 // result: (XORshiftRL x y [c]) 16849 for { 16850 _ = v.Args[1] 16851 v_0 := v.Args[0] 16852 if v_0.Op != OpARMSRLconst { 16853 break 16854 } 16855 c := v_0.AuxInt 16856 y := v_0.Args[0] 16857 x := v.Args[1] 16858 v.reset(OpARMXORshiftRL) 16859 v.AuxInt = c 16860 v.AddArg(x) 16861 v.AddArg(y) 16862 return true 16863 } 16864 // match: (XOR x (SRAconst [c] y)) 16865 // cond: 16866 // result: (XORshiftRA x y [c]) 16867 for { 16868 _ = v.Args[1] 16869 x := v.Args[0] 16870 v_1 := v.Args[1] 16871 if v_1.Op != OpARMSRAconst { 16872 break 16873 } 16874 c := v_1.AuxInt 16875 y := v_1.Args[0] 16876 v.reset(OpARMXORshiftRA) 16877 v.AuxInt = c 16878 v.AddArg(x) 16879 v.AddArg(y) 16880 return true 16881 } 16882 // match: (XOR (SRAconst [c] y) x) 16883 // cond: 16884 // result: (XORshiftRA x y [c]) 16885 for { 16886 _ = v.Args[1] 16887 v_0 := v.Args[0] 16888 if v_0.Op != OpARMSRAconst { 16889 break 16890 } 16891 c := v_0.AuxInt 16892 y := v_0.Args[0] 16893 x := v.Args[1] 16894 v.reset(OpARMXORshiftRA) 16895 v.AuxInt = c 16896 v.AddArg(x) 16897 v.AddArg(y) 16898 return true 16899 } 16900 // match: (XOR x (SRRconst [c] y)) 16901 // cond: 16902 // result: (XORshiftRR x y [c]) 16903 for { 16904 _ = v.Args[1] 16905 x := v.Args[0] 16906 v_1 := v.Args[1] 16907 if v_1.Op != OpARMSRRconst { 16908 break 16909 } 16910 c := v_1.AuxInt 16911 y := v_1.Args[0] 16912 v.reset(OpARMXORshiftRR) 16913 v.AuxInt = c 16914 v.AddArg(x) 16915 v.AddArg(y) 16916 return true 16917 } 16918 // match: (XOR (SRRconst [c] y) x) 16919 // cond: 16920 // result: (XORshiftRR x y [c]) 16921 for { 16922 _ = v.Args[1] 16923 v_0 := v.Args[0] 16924 if v_0.Op != OpARMSRRconst { 16925 break 16926 } 16927 c := v_0.AuxInt 16928 y := v_0.Args[0] 16929 x := v.Args[1] 16930 v.reset(OpARMXORshiftRR) 16931 v.AuxInt = c 16932 v.AddArg(x) 16933 v.AddArg(y) 16934 return true 16935 } 16936 return false 16937 } 16938 func rewriteValueARM_OpARMXOR_10(v *Value) bool { 16939 // match: (XOR x (SLL y z)) 16940 // cond: 16941 // result: (XORshiftLLreg x y z) 16942 for { 16943 _ = v.Args[1] 16944 x := v.Args[0] 16945 v_1 := v.Args[1] 16946 if v_1.Op != OpARMSLL { 16947 break 16948 } 16949 _ = v_1.Args[1] 16950 y := v_1.Args[0] 16951 z := v_1.Args[1] 16952 v.reset(OpARMXORshiftLLreg) 16953 v.AddArg(x) 16954 v.AddArg(y) 16955 v.AddArg(z) 16956 return true 16957 } 16958 // match: (XOR (SLL y z) x) 16959 // cond: 16960 // result: (XORshiftLLreg x y z) 16961 for { 16962 _ = v.Args[1] 16963 v_0 := v.Args[0] 16964 if v_0.Op != OpARMSLL { 16965 break 16966 } 16967 _ = v_0.Args[1] 16968 y := v_0.Args[0] 16969 z := v_0.Args[1] 16970 x := v.Args[1] 16971 v.reset(OpARMXORshiftLLreg) 16972 v.AddArg(x) 16973 v.AddArg(y) 16974 v.AddArg(z) 16975 return true 16976 } 16977 // match: (XOR x (SRL y z)) 16978 // cond: 16979 // result: (XORshiftRLreg x y z) 16980 for { 16981 _ = v.Args[1] 16982 x := v.Args[0] 16983 v_1 := v.Args[1] 16984 if v_1.Op != OpARMSRL { 16985 break 16986 } 16987 _ = v_1.Args[1] 16988 y := v_1.Args[0] 16989 z := v_1.Args[1] 16990 v.reset(OpARMXORshiftRLreg) 16991 v.AddArg(x) 16992 v.AddArg(y) 16993 v.AddArg(z) 16994 return true 16995 } 16996 // match: (XOR (SRL y z) x) 16997 // cond: 16998 // result: (XORshiftRLreg x y z) 16999 for { 17000 _ = v.Args[1] 17001 v_0 := v.Args[0] 17002 if v_0.Op != OpARMSRL { 17003 break 17004 } 17005 _ = v_0.Args[1] 17006 y := v_0.Args[0] 17007 z := v_0.Args[1] 17008 x := v.Args[1] 17009 v.reset(OpARMXORshiftRLreg) 17010 v.AddArg(x) 17011 v.AddArg(y) 17012 v.AddArg(z) 17013 return true 17014 } 17015 // match: (XOR x (SRA y z)) 17016 // cond: 17017 // result: (XORshiftRAreg x y z) 17018 for { 17019 _ = v.Args[1] 17020 x := v.Args[0] 17021 v_1 := v.Args[1] 17022 if v_1.Op != OpARMSRA { 17023 break 17024 } 17025 _ = v_1.Args[1] 17026 y := v_1.Args[0] 17027 z := v_1.Args[1] 17028 v.reset(OpARMXORshiftRAreg) 17029 v.AddArg(x) 17030 v.AddArg(y) 17031 v.AddArg(z) 17032 return true 17033 } 17034 // match: (XOR (SRA y z) x) 17035 // cond: 17036 // result: (XORshiftRAreg x y z) 17037 for { 17038 _ = v.Args[1] 17039 v_0 := v.Args[0] 17040 if v_0.Op != OpARMSRA { 17041 break 17042 } 17043 _ = v_0.Args[1] 17044 y := v_0.Args[0] 17045 z := v_0.Args[1] 17046 x := v.Args[1] 17047 v.reset(OpARMXORshiftRAreg) 17048 v.AddArg(x) 17049 v.AddArg(y) 17050 v.AddArg(z) 17051 return true 17052 } 17053 // match: (XOR x x) 17054 // cond: 17055 // result: (MOVWconst [0]) 17056 for { 17057 _ = v.Args[1] 17058 x := v.Args[0] 17059 if x != v.Args[1] { 17060 break 17061 } 17062 v.reset(OpARMMOVWconst) 17063 v.AuxInt = 0 17064 return true 17065 } 17066 return false 17067 } 17068 func rewriteValueARM_OpARMXORconst_0(v *Value) bool { 17069 // match: (XORconst [0] x) 17070 // cond: 17071 // result: x 17072 for { 17073 if v.AuxInt != 0 { 17074 break 17075 } 17076 x := v.Args[0] 17077 v.reset(OpCopy) 17078 v.Type = x.Type 17079 v.AddArg(x) 17080 return true 17081 } 17082 // match: (XORconst [c] (MOVWconst [d])) 17083 // cond: 17084 // result: (MOVWconst [c^d]) 17085 for { 17086 c := v.AuxInt 17087 v_0 := v.Args[0] 17088 if v_0.Op != OpARMMOVWconst { 17089 break 17090 } 17091 d := v_0.AuxInt 17092 v.reset(OpARMMOVWconst) 17093 v.AuxInt = c ^ d 17094 return true 17095 } 17096 // match: (XORconst [c] (XORconst [d] x)) 17097 // cond: 17098 // result: (XORconst [c^d] x) 17099 for { 17100 c := v.AuxInt 17101 v_0 := v.Args[0] 17102 if v_0.Op != OpARMXORconst { 17103 break 17104 } 17105 d := v_0.AuxInt 17106 x := v_0.Args[0] 17107 v.reset(OpARMXORconst) 17108 v.AuxInt = c ^ d 17109 v.AddArg(x) 17110 return true 17111 } 17112 return false 17113 } 17114 func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { 17115 b := v.Block 17116 _ = b 17117 // match: (XORshiftLL (MOVWconst [c]) x [d]) 17118 // cond: 17119 // result: (XORconst [c] (SLLconst <x.Type> x [d])) 17120 for { 17121 d := v.AuxInt 17122 _ = v.Args[1] 17123 v_0 := v.Args[0] 17124 if v_0.Op != OpARMMOVWconst { 17125 break 17126 } 17127 c := v_0.AuxInt 17128 x := v.Args[1] 17129 v.reset(OpARMXORconst) 17130 v.AuxInt = c 17131 v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) 17132 v0.AuxInt = d 17133 v0.AddArg(x) 17134 v.AddArg(v0) 17135 return true 17136 } 17137 // match: (XORshiftLL x (MOVWconst [c]) [d]) 17138 // cond: 17139 // result: (XORconst x [int64(int32(uint32(c)<<uint64(d)))]) 17140 for { 17141 d := v.AuxInt 17142 _ = v.Args[1] 17143 x := v.Args[0] 17144 v_1 := v.Args[1] 17145 if v_1.Op != OpARMMOVWconst { 17146 break 17147 } 17148 c := v_1.AuxInt 17149 v.reset(OpARMXORconst) 17150 v.AuxInt = int64(int32(uint32(c) << uint64(d))) 17151 v.AddArg(x) 17152 return true 17153 } 17154 // match: (XORshiftLL [c] (SRLconst x [32-c]) x) 17155 // cond: 17156 // result: (SRRconst [32-c] x) 17157 for { 17158 c := v.AuxInt 17159 _ = v.Args[1] 17160 v_0 := v.Args[0] 17161 if v_0.Op != OpARMSRLconst { 17162 break 17163 } 17164 if v_0.AuxInt != 32-c { 17165 break 17166 } 17167 x := v_0.Args[0] 17168 if x != v.Args[1] { 17169 break 17170 } 17171 v.reset(OpARMSRRconst) 17172 v.AuxInt = 32 - c 17173 v.AddArg(x) 17174 return true 17175 } 17176 // match: (XORshiftLL x (SLLconst x [c]) [d]) 17177 // cond: c==d 17178 // result: (MOVWconst [0]) 17179 for { 17180 d := v.AuxInt 17181 _ = v.Args[1] 17182 x := v.Args[0] 17183 v_1 := v.Args[1] 17184 if v_1.Op != OpARMSLLconst { 17185 break 17186 } 17187 c := v_1.AuxInt 17188 if x != v_1.Args[0] { 17189 break 17190 } 17191 if !(c == d) { 17192 break 17193 } 17194 v.reset(OpARMMOVWconst) 17195 v.AuxInt = 0 17196 return true 17197 } 17198 return false 17199 } 17200 func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { 17201 b := v.Block 17202 _ = b 17203 // match: (XORshiftLLreg (MOVWconst [c]) x y) 17204 // cond: 17205 // result: (XORconst [c] (SLL <x.Type> x y)) 17206 for { 17207 _ = v.Args[2] 17208 v_0 := v.Args[0] 17209 if v_0.Op != OpARMMOVWconst { 17210 break 17211 } 17212 c := v_0.AuxInt 17213 x := v.Args[1] 17214 y := v.Args[2] 17215 v.reset(OpARMXORconst) 17216 v.AuxInt = c 17217 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 17218 v0.AddArg(x) 17219 v0.AddArg(y) 17220 v.AddArg(v0) 17221 return true 17222 } 17223 // match: (XORshiftLLreg x y (MOVWconst [c])) 17224 // cond: 17225 // result: (XORshiftLL x y [c]) 17226 for { 17227 _ = v.Args[2] 17228 x := v.Args[0] 17229 y := v.Args[1] 17230 v_2 := v.Args[2] 17231 if v_2.Op != OpARMMOVWconst { 17232 break 17233 } 17234 c := v_2.AuxInt 17235 v.reset(OpARMXORshiftLL) 17236 v.AuxInt = c 17237 v.AddArg(x) 17238 v.AddArg(y) 17239 return true 17240 } 17241 return false 17242 } 17243 func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { 17244 b := v.Block 17245 _ = b 17246 // match: (XORshiftRA (MOVWconst [c]) x [d]) 17247 // cond: 17248 // result: (XORconst [c] (SRAconst <x.Type> x [d])) 17249 for { 17250 d := v.AuxInt 17251 _ = v.Args[1] 17252 v_0 := v.Args[0] 17253 if v_0.Op != OpARMMOVWconst { 17254 break 17255 } 17256 c := v_0.AuxInt 17257 x := v.Args[1] 17258 v.reset(OpARMXORconst) 17259 v.AuxInt = c 17260 v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) 17261 v0.AuxInt = d 17262 v0.AddArg(x) 17263 v.AddArg(v0) 17264 return true 17265 } 17266 // match: (XORshiftRA x (MOVWconst [c]) [d]) 17267 // cond: 17268 // result: (XORconst x [int64(int32(c)>>uint64(d))]) 17269 for { 17270 d := v.AuxInt 17271 _ = v.Args[1] 17272 x := v.Args[0] 17273 v_1 := v.Args[1] 17274 if v_1.Op != OpARMMOVWconst { 17275 break 17276 } 17277 c := v_1.AuxInt 17278 v.reset(OpARMXORconst) 17279 v.AuxInt = int64(int32(c) >> uint64(d)) 17280 v.AddArg(x) 17281 return true 17282 } 17283 // match: (XORshiftRA x (SRAconst x [c]) [d]) 17284 // cond: c==d 17285 // result: (MOVWconst [0]) 17286 for { 17287 d := v.AuxInt 17288 _ = v.Args[1] 17289 x := v.Args[0] 17290 v_1 := v.Args[1] 17291 if v_1.Op != OpARMSRAconst { 17292 break 17293 } 17294 c := v_1.AuxInt 17295 if x != v_1.Args[0] { 17296 break 17297 } 17298 if !(c == d) { 17299 break 17300 } 17301 v.reset(OpARMMOVWconst) 17302 v.AuxInt = 0 17303 return true 17304 } 17305 return false 17306 } 17307 func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { 17308 b := v.Block 17309 _ = b 17310 // match: (XORshiftRAreg (MOVWconst [c]) x y) 17311 // cond: 17312 // result: (XORconst [c] (SRA <x.Type> x y)) 17313 for { 17314 _ = v.Args[2] 17315 v_0 := v.Args[0] 17316 if v_0.Op != OpARMMOVWconst { 17317 break 17318 } 17319 c := v_0.AuxInt 17320 x := v.Args[1] 17321 y := v.Args[2] 17322 v.reset(OpARMXORconst) 17323 v.AuxInt = c 17324 v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) 17325 v0.AddArg(x) 17326 v0.AddArg(y) 17327 v.AddArg(v0) 17328 return true 17329 } 17330 // match: (XORshiftRAreg x y (MOVWconst [c])) 17331 // cond: 17332 // result: (XORshiftRA x y [c]) 17333 for { 17334 _ = v.Args[2] 17335 x := v.Args[0] 17336 y := v.Args[1] 17337 v_2 := v.Args[2] 17338 if v_2.Op != OpARMMOVWconst { 17339 break 17340 } 17341 c := v_2.AuxInt 17342 v.reset(OpARMXORshiftRA) 17343 v.AuxInt = c 17344 v.AddArg(x) 17345 v.AddArg(y) 17346 return true 17347 } 17348 return false 17349 } 17350 func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { 17351 b := v.Block 17352 _ = b 17353 // match: (XORshiftRL (MOVWconst [c]) x [d]) 17354 // cond: 17355 // result: (XORconst [c] (SRLconst <x.Type> x [d])) 17356 for { 17357 d := v.AuxInt 17358 _ = v.Args[1] 17359 v_0 := v.Args[0] 17360 if v_0.Op != OpARMMOVWconst { 17361 break 17362 } 17363 c := v_0.AuxInt 17364 x := v.Args[1] 17365 v.reset(OpARMXORconst) 17366 v.AuxInt = c 17367 v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) 17368 v0.AuxInt = d 17369 v0.AddArg(x) 17370 v.AddArg(v0) 17371 return true 17372 } 17373 // match: (XORshiftRL x (MOVWconst [c]) [d]) 17374 // cond: 17375 // result: (XORconst x [int64(int32(uint32(c)>>uint64(d)))]) 17376 for { 17377 d := v.AuxInt 17378 _ = v.Args[1] 17379 x := v.Args[0] 17380 v_1 := v.Args[1] 17381 if v_1.Op != OpARMMOVWconst { 17382 break 17383 } 17384 c := v_1.AuxInt 17385 v.reset(OpARMXORconst) 17386 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 17387 v.AddArg(x) 17388 return true 17389 } 17390 // match: (XORshiftRL [c] (SLLconst x [32-c]) x) 17391 // cond: 17392 // result: (SRRconst [ c] x) 17393 for { 17394 c := v.AuxInt 17395 _ = v.Args[1] 17396 v_0 := v.Args[0] 17397 if v_0.Op != OpARMSLLconst { 17398 break 17399 } 17400 if v_0.AuxInt != 32-c { 17401 break 17402 } 17403 x := v_0.Args[0] 17404 if x != v.Args[1] { 17405 break 17406 } 17407 v.reset(OpARMSRRconst) 17408 v.AuxInt = c 17409 v.AddArg(x) 17410 return true 17411 } 17412 // match: (XORshiftRL x (SRLconst x [c]) [d]) 17413 // cond: c==d 17414 // result: (MOVWconst [0]) 17415 for { 17416 d := v.AuxInt 17417 _ = v.Args[1] 17418 x := v.Args[0] 17419 v_1 := v.Args[1] 17420 if v_1.Op != OpARMSRLconst { 17421 break 17422 } 17423 c := v_1.AuxInt 17424 if x != v_1.Args[0] { 17425 break 17426 } 17427 if !(c == d) { 17428 break 17429 } 17430 v.reset(OpARMMOVWconst) 17431 v.AuxInt = 0 17432 return true 17433 } 17434 return false 17435 } 17436 func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { 17437 b := v.Block 17438 _ = b 17439 // match: (XORshiftRLreg (MOVWconst [c]) x y) 17440 // cond: 17441 // result: (XORconst [c] (SRL <x.Type> x y)) 17442 for { 17443 _ = v.Args[2] 17444 v_0 := v.Args[0] 17445 if v_0.Op != OpARMMOVWconst { 17446 break 17447 } 17448 c := v_0.AuxInt 17449 x := v.Args[1] 17450 y := v.Args[2] 17451 v.reset(OpARMXORconst) 17452 v.AuxInt = c 17453 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 17454 v0.AddArg(x) 17455 v0.AddArg(y) 17456 v.AddArg(v0) 17457 return true 17458 } 17459 // match: (XORshiftRLreg x y (MOVWconst [c])) 17460 // cond: 17461 // result: (XORshiftRL x y [c]) 17462 for { 17463 _ = v.Args[2] 17464 x := v.Args[0] 17465 y := v.Args[1] 17466 v_2 := v.Args[2] 17467 if v_2.Op != OpARMMOVWconst { 17468 break 17469 } 17470 c := v_2.AuxInt 17471 v.reset(OpARMXORshiftRL) 17472 v.AuxInt = c 17473 v.AddArg(x) 17474 v.AddArg(y) 17475 return true 17476 } 17477 return false 17478 } 17479 func rewriteValueARM_OpARMXORshiftRR_0(v *Value) bool { 17480 b := v.Block 17481 _ = b 17482 // match: (XORshiftRR (MOVWconst [c]) x [d]) 17483 // cond: 17484 // result: (XORconst [c] (SRRconst <x.Type> x [d])) 17485 for { 17486 d := v.AuxInt 17487 _ = v.Args[1] 17488 v_0 := v.Args[0] 17489 if v_0.Op != OpARMMOVWconst { 17490 break 17491 } 17492 c := v_0.AuxInt 17493 x := v.Args[1] 17494 v.reset(OpARMXORconst) 17495 v.AuxInt = c 17496 v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) 17497 v0.AuxInt = d 17498 v0.AddArg(x) 17499 v.AddArg(v0) 17500 return true 17501 } 17502 // match: (XORshiftRR x (MOVWconst [c]) [d]) 17503 // cond: 17504 // result: (XORconst x [int64(int32(uint32(c)>>uint64(d)|uint32(c)<<uint64(32-d)))]) 17505 for { 17506 d := v.AuxInt 17507 _ = v.Args[1] 17508 x := v.Args[0] 17509 v_1 := v.Args[1] 17510 if v_1.Op != OpARMMOVWconst { 17511 break 17512 } 17513 c := v_1.AuxInt 17514 v.reset(OpARMXORconst) 17515 v.AuxInt = int64(int32(uint32(c)>>uint64(d) | uint32(c)<<uint64(32-d))) 17516 v.AddArg(x) 17517 return true 17518 } 17519 return false 17520 } 17521 func rewriteValueARM_OpAdd16_0(v *Value) bool { 17522 // match: (Add16 x y) 17523 // cond: 17524 // result: (ADD x y) 17525 for { 17526 _ = v.Args[1] 17527 x := v.Args[0] 17528 y := v.Args[1] 17529 v.reset(OpARMADD) 17530 v.AddArg(x) 17531 v.AddArg(y) 17532 return true 17533 } 17534 } 17535 func rewriteValueARM_OpAdd32_0(v *Value) bool { 17536 // match: (Add32 x y) 17537 // cond: 17538 // result: (ADD x y) 17539 for { 17540 _ = v.Args[1] 17541 x := v.Args[0] 17542 y := v.Args[1] 17543 v.reset(OpARMADD) 17544 v.AddArg(x) 17545 v.AddArg(y) 17546 return true 17547 } 17548 } 17549 func rewriteValueARM_OpAdd32F_0(v *Value) bool { 17550 // match: (Add32F x y) 17551 // cond: 17552 // result: (ADDF x y) 17553 for { 17554 _ = v.Args[1] 17555 x := v.Args[0] 17556 y := v.Args[1] 17557 v.reset(OpARMADDF) 17558 v.AddArg(x) 17559 v.AddArg(y) 17560 return true 17561 } 17562 } 17563 func rewriteValueARM_OpAdd32carry_0(v *Value) bool { 17564 // match: (Add32carry x y) 17565 // cond: 17566 // result: (ADDS x y) 17567 for { 17568 _ = v.Args[1] 17569 x := v.Args[0] 17570 y := v.Args[1] 17571 v.reset(OpARMADDS) 17572 v.AddArg(x) 17573 v.AddArg(y) 17574 return true 17575 } 17576 } 17577 func rewriteValueARM_OpAdd32withcarry_0(v *Value) bool { 17578 // match: (Add32withcarry x y c) 17579 // cond: 17580 // result: (ADC x y c) 17581 for { 17582 _ = v.Args[2] 17583 x := v.Args[0] 17584 y := v.Args[1] 17585 c := v.Args[2] 17586 v.reset(OpARMADC) 17587 v.AddArg(x) 17588 v.AddArg(y) 17589 v.AddArg(c) 17590 return true 17591 } 17592 } 17593 func rewriteValueARM_OpAdd64F_0(v *Value) bool { 17594 // match: (Add64F x y) 17595 // cond: 17596 // result: (ADDD x y) 17597 for { 17598 _ = v.Args[1] 17599 x := v.Args[0] 17600 y := v.Args[1] 17601 v.reset(OpARMADDD) 17602 v.AddArg(x) 17603 v.AddArg(y) 17604 return true 17605 } 17606 } 17607 func rewriteValueARM_OpAdd8_0(v *Value) bool { 17608 // match: (Add8 x y) 17609 // cond: 17610 // result: (ADD x y) 17611 for { 17612 _ = v.Args[1] 17613 x := v.Args[0] 17614 y := v.Args[1] 17615 v.reset(OpARMADD) 17616 v.AddArg(x) 17617 v.AddArg(y) 17618 return true 17619 } 17620 } 17621 func rewriteValueARM_OpAddPtr_0(v *Value) bool { 17622 // match: (AddPtr x y) 17623 // cond: 17624 // result: (ADD x y) 17625 for { 17626 _ = v.Args[1] 17627 x := v.Args[0] 17628 y := v.Args[1] 17629 v.reset(OpARMADD) 17630 v.AddArg(x) 17631 v.AddArg(y) 17632 return true 17633 } 17634 } 17635 func rewriteValueARM_OpAddr_0(v *Value) bool { 17636 // match: (Addr {sym} base) 17637 // cond: 17638 // result: (MOVWaddr {sym} base) 17639 for { 17640 sym := v.Aux 17641 base := v.Args[0] 17642 v.reset(OpARMMOVWaddr) 17643 v.Aux = sym 17644 v.AddArg(base) 17645 return true 17646 } 17647 } 17648 func rewriteValueARM_OpAnd16_0(v *Value) bool { 17649 // match: (And16 x y) 17650 // cond: 17651 // result: (AND x y) 17652 for { 17653 _ = v.Args[1] 17654 x := v.Args[0] 17655 y := v.Args[1] 17656 v.reset(OpARMAND) 17657 v.AddArg(x) 17658 v.AddArg(y) 17659 return true 17660 } 17661 } 17662 func rewriteValueARM_OpAnd32_0(v *Value) bool { 17663 // match: (And32 x y) 17664 // cond: 17665 // result: (AND x y) 17666 for { 17667 _ = v.Args[1] 17668 x := v.Args[0] 17669 y := v.Args[1] 17670 v.reset(OpARMAND) 17671 v.AddArg(x) 17672 v.AddArg(y) 17673 return true 17674 } 17675 } 17676 func rewriteValueARM_OpAnd8_0(v *Value) bool { 17677 // match: (And8 x y) 17678 // cond: 17679 // result: (AND x y) 17680 for { 17681 _ = v.Args[1] 17682 x := v.Args[0] 17683 y := v.Args[1] 17684 v.reset(OpARMAND) 17685 v.AddArg(x) 17686 v.AddArg(y) 17687 return true 17688 } 17689 } 17690 func rewriteValueARM_OpAndB_0(v *Value) bool { 17691 // match: (AndB x y) 17692 // cond: 17693 // result: (AND x y) 17694 for { 17695 _ = v.Args[1] 17696 x := v.Args[0] 17697 y := v.Args[1] 17698 v.reset(OpARMAND) 17699 v.AddArg(x) 17700 v.AddArg(y) 17701 return true 17702 } 17703 } 17704 func rewriteValueARM_OpAvg32u_0(v *Value) bool { 17705 b := v.Block 17706 _ = b 17707 // match: (Avg32u <t> x y) 17708 // cond: 17709 // result: (ADD (SRLconst <t> (SUB <t> x y) [1]) y) 17710 for { 17711 t := v.Type 17712 _ = v.Args[1] 17713 x := v.Args[0] 17714 y := v.Args[1] 17715 v.reset(OpARMADD) 17716 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 17717 v0.AuxInt = 1 17718 v1 := b.NewValue0(v.Pos, OpARMSUB, t) 17719 v1.AddArg(x) 17720 v1.AddArg(y) 17721 v0.AddArg(v1) 17722 v.AddArg(v0) 17723 v.AddArg(y) 17724 return true 17725 } 17726 } 17727 func rewriteValueARM_OpBitLen32_0(v *Value) bool { 17728 b := v.Block 17729 _ = b 17730 // match: (BitLen32 <t> x) 17731 // cond: 17732 // result: (RSBconst [32] (CLZ <t> x)) 17733 for { 17734 t := v.Type 17735 x := v.Args[0] 17736 v.reset(OpARMRSBconst) 17737 v.AuxInt = 32 17738 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 17739 v0.AddArg(x) 17740 v.AddArg(v0) 17741 return true 17742 } 17743 } 17744 func rewriteValueARM_OpBswap32_0(v *Value) bool { 17745 b := v.Block 17746 _ = b 17747 // match: (Bswap32 <t> x) 17748 // cond: objabi.GOARM==5 17749 // result: (XOR <t> (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) (SRRconst <t> x [8])) 17750 for { 17751 t := v.Type 17752 x := v.Args[0] 17753 if !(objabi.GOARM == 5) { 17754 break 17755 } 17756 v.reset(OpARMXOR) 17757 v.Type = t 17758 v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) 17759 v0.AuxInt = 8 17760 v1 := b.NewValue0(v.Pos, OpARMBICconst, t) 17761 v1.AuxInt = 0xff0000 17762 v2 := b.NewValue0(v.Pos, OpARMXOR, t) 17763 v2.AddArg(x) 17764 v3 := b.NewValue0(v.Pos, OpARMSRRconst, t) 17765 v3.AuxInt = 16 17766 v3.AddArg(x) 17767 v2.AddArg(v3) 17768 v1.AddArg(v2) 17769 v0.AddArg(v1) 17770 v.AddArg(v0) 17771 v4 := b.NewValue0(v.Pos, OpARMSRRconst, t) 17772 v4.AuxInt = 8 17773 v4.AddArg(x) 17774 v.AddArg(v4) 17775 return true 17776 } 17777 // match: (Bswap32 x) 17778 // cond: objabi.GOARM>=6 17779 // result: (REV x) 17780 for { 17781 x := v.Args[0] 17782 if !(objabi.GOARM >= 6) { 17783 break 17784 } 17785 v.reset(OpARMREV) 17786 v.AddArg(x) 17787 return true 17788 } 17789 return false 17790 } 17791 func rewriteValueARM_OpClosureCall_0(v *Value) bool { 17792 // match: (ClosureCall [argwid] entry closure mem) 17793 // cond: 17794 // result: (CALLclosure [argwid] entry closure mem) 17795 for { 17796 argwid := v.AuxInt 17797 _ = v.Args[2] 17798 entry := v.Args[0] 17799 closure := v.Args[1] 17800 mem := v.Args[2] 17801 v.reset(OpARMCALLclosure) 17802 v.AuxInt = argwid 17803 v.AddArg(entry) 17804 v.AddArg(closure) 17805 v.AddArg(mem) 17806 return true 17807 } 17808 } 17809 func rewriteValueARM_OpCom16_0(v *Value) bool { 17810 // match: (Com16 x) 17811 // cond: 17812 // result: (MVN x) 17813 for { 17814 x := v.Args[0] 17815 v.reset(OpARMMVN) 17816 v.AddArg(x) 17817 return true 17818 } 17819 } 17820 func rewriteValueARM_OpCom32_0(v *Value) bool { 17821 // match: (Com32 x) 17822 // cond: 17823 // result: (MVN x) 17824 for { 17825 x := v.Args[0] 17826 v.reset(OpARMMVN) 17827 v.AddArg(x) 17828 return true 17829 } 17830 } 17831 func rewriteValueARM_OpCom8_0(v *Value) bool { 17832 // match: (Com8 x) 17833 // cond: 17834 // result: (MVN x) 17835 for { 17836 x := v.Args[0] 17837 v.reset(OpARMMVN) 17838 v.AddArg(x) 17839 return true 17840 } 17841 } 17842 func rewriteValueARM_OpConst16_0(v *Value) bool { 17843 // match: (Const16 [val]) 17844 // cond: 17845 // result: (MOVWconst [val]) 17846 for { 17847 val := v.AuxInt 17848 v.reset(OpARMMOVWconst) 17849 v.AuxInt = val 17850 return true 17851 } 17852 } 17853 func rewriteValueARM_OpConst32_0(v *Value) bool { 17854 // match: (Const32 [val]) 17855 // cond: 17856 // result: (MOVWconst [val]) 17857 for { 17858 val := v.AuxInt 17859 v.reset(OpARMMOVWconst) 17860 v.AuxInt = val 17861 return true 17862 } 17863 } 17864 func rewriteValueARM_OpConst32F_0(v *Value) bool { 17865 // match: (Const32F [val]) 17866 // cond: 17867 // result: (MOVFconst [val]) 17868 for { 17869 val := v.AuxInt 17870 v.reset(OpARMMOVFconst) 17871 v.AuxInt = val 17872 return true 17873 } 17874 } 17875 func rewriteValueARM_OpConst64F_0(v *Value) bool { 17876 // match: (Const64F [val]) 17877 // cond: 17878 // result: (MOVDconst [val]) 17879 for { 17880 val := v.AuxInt 17881 v.reset(OpARMMOVDconst) 17882 v.AuxInt = val 17883 return true 17884 } 17885 } 17886 func rewriteValueARM_OpConst8_0(v *Value) bool { 17887 // match: (Const8 [val]) 17888 // cond: 17889 // result: (MOVWconst [val]) 17890 for { 17891 val := v.AuxInt 17892 v.reset(OpARMMOVWconst) 17893 v.AuxInt = val 17894 return true 17895 } 17896 } 17897 func rewriteValueARM_OpConstBool_0(v *Value) bool { 17898 // match: (ConstBool [b]) 17899 // cond: 17900 // result: (MOVWconst [b]) 17901 for { 17902 b := v.AuxInt 17903 v.reset(OpARMMOVWconst) 17904 v.AuxInt = b 17905 return true 17906 } 17907 } 17908 func rewriteValueARM_OpConstNil_0(v *Value) bool { 17909 // match: (ConstNil) 17910 // cond: 17911 // result: (MOVWconst [0]) 17912 for { 17913 v.reset(OpARMMOVWconst) 17914 v.AuxInt = 0 17915 return true 17916 } 17917 } 17918 func rewriteValueARM_OpConvert_0(v *Value) bool { 17919 // match: (Convert x mem) 17920 // cond: 17921 // result: (MOVWconvert x mem) 17922 for { 17923 _ = v.Args[1] 17924 x := v.Args[0] 17925 mem := v.Args[1] 17926 v.reset(OpARMMOVWconvert) 17927 v.AddArg(x) 17928 v.AddArg(mem) 17929 return true 17930 } 17931 } 17932 func rewriteValueARM_OpCtz32_0(v *Value) bool { 17933 b := v.Block 17934 _ = b 17935 // match: (Ctz32 <t> x) 17936 // cond: objabi.GOARM<=6 17937 // result: (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) 17938 for { 17939 t := v.Type 17940 x := v.Args[0] 17941 if !(objabi.GOARM <= 6) { 17942 break 17943 } 17944 v.reset(OpARMRSBconst) 17945 v.AuxInt = 32 17946 v0 := b.NewValue0(v.Pos, OpARMCLZ, t) 17947 v1 := b.NewValue0(v.Pos, OpARMSUBconst, t) 17948 v1.AuxInt = 1 17949 v2 := b.NewValue0(v.Pos, OpARMAND, t) 17950 v2.AddArg(x) 17951 v3 := b.NewValue0(v.Pos, OpARMRSBconst, t) 17952 v3.AuxInt = 0 17953 v3.AddArg(x) 17954 v2.AddArg(v3) 17955 v1.AddArg(v2) 17956 v0.AddArg(v1) 17957 v.AddArg(v0) 17958 return true 17959 } 17960 // match: (Ctz32 <t> x) 17961 // cond: objabi.GOARM==7 17962 // result: (CLZ <t> (RBIT <t> x)) 17963 for { 17964 t := v.Type 17965 x := v.Args[0] 17966 if !(objabi.GOARM == 7) { 17967 break 17968 } 17969 v.reset(OpARMCLZ) 17970 v.Type = t 17971 v0 := b.NewValue0(v.Pos, OpARMRBIT, t) 17972 v0.AddArg(x) 17973 v.AddArg(v0) 17974 return true 17975 } 17976 return false 17977 } 17978 func rewriteValueARM_OpCvt32Fto32_0(v *Value) bool { 17979 // match: (Cvt32Fto32 x) 17980 // cond: 17981 // result: (MOVFW x) 17982 for { 17983 x := v.Args[0] 17984 v.reset(OpARMMOVFW) 17985 v.AddArg(x) 17986 return true 17987 } 17988 } 17989 func rewriteValueARM_OpCvt32Fto32U_0(v *Value) bool { 17990 // match: (Cvt32Fto32U x) 17991 // cond: 17992 // result: (MOVFWU x) 17993 for { 17994 x := v.Args[0] 17995 v.reset(OpARMMOVFWU) 17996 v.AddArg(x) 17997 return true 17998 } 17999 } 18000 func rewriteValueARM_OpCvt32Fto64F_0(v *Value) bool { 18001 // match: (Cvt32Fto64F x) 18002 // cond: 18003 // result: (MOVFD x) 18004 for { 18005 x := v.Args[0] 18006 v.reset(OpARMMOVFD) 18007 v.AddArg(x) 18008 return true 18009 } 18010 } 18011 func rewriteValueARM_OpCvt32Uto32F_0(v *Value) bool { 18012 // match: (Cvt32Uto32F x) 18013 // cond: 18014 // result: (MOVWUF x) 18015 for { 18016 x := v.Args[0] 18017 v.reset(OpARMMOVWUF) 18018 v.AddArg(x) 18019 return true 18020 } 18021 } 18022 func rewriteValueARM_OpCvt32Uto64F_0(v *Value) bool { 18023 // match: (Cvt32Uto64F x) 18024 // cond: 18025 // result: (MOVWUD x) 18026 for { 18027 x := v.Args[0] 18028 v.reset(OpARMMOVWUD) 18029 v.AddArg(x) 18030 return true 18031 } 18032 } 18033 func rewriteValueARM_OpCvt32to32F_0(v *Value) bool { 18034 // match: (Cvt32to32F x) 18035 // cond: 18036 // result: (MOVWF x) 18037 for { 18038 x := v.Args[0] 18039 v.reset(OpARMMOVWF) 18040 v.AddArg(x) 18041 return true 18042 } 18043 } 18044 func rewriteValueARM_OpCvt32to64F_0(v *Value) bool { 18045 // match: (Cvt32to64F x) 18046 // cond: 18047 // result: (MOVWD x) 18048 for { 18049 x := v.Args[0] 18050 v.reset(OpARMMOVWD) 18051 v.AddArg(x) 18052 return true 18053 } 18054 } 18055 func rewriteValueARM_OpCvt64Fto32_0(v *Value) bool { 18056 // match: (Cvt64Fto32 x) 18057 // cond: 18058 // result: (MOVDW x) 18059 for { 18060 x := v.Args[0] 18061 v.reset(OpARMMOVDW) 18062 v.AddArg(x) 18063 return true 18064 } 18065 } 18066 func rewriteValueARM_OpCvt64Fto32F_0(v *Value) bool { 18067 // match: (Cvt64Fto32F x) 18068 // cond: 18069 // result: (MOVDF x) 18070 for { 18071 x := v.Args[0] 18072 v.reset(OpARMMOVDF) 18073 v.AddArg(x) 18074 return true 18075 } 18076 } 18077 func rewriteValueARM_OpCvt64Fto32U_0(v *Value) bool { 18078 // match: (Cvt64Fto32U x) 18079 // cond: 18080 // result: (MOVDWU x) 18081 for { 18082 x := v.Args[0] 18083 v.reset(OpARMMOVDWU) 18084 v.AddArg(x) 18085 return true 18086 } 18087 } 18088 func rewriteValueARM_OpDiv16_0(v *Value) bool { 18089 b := v.Block 18090 _ = b 18091 typ := &b.Func.Config.Types 18092 _ = typ 18093 // match: (Div16 x y) 18094 // cond: 18095 // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) 18096 for { 18097 _ = v.Args[1] 18098 x := v.Args[0] 18099 y := v.Args[1] 18100 v.reset(OpDiv32) 18101 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18102 v0.AddArg(x) 18103 v.AddArg(v0) 18104 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18105 v1.AddArg(y) 18106 v.AddArg(v1) 18107 return true 18108 } 18109 } 18110 func rewriteValueARM_OpDiv16u_0(v *Value) bool { 18111 b := v.Block 18112 _ = b 18113 typ := &b.Func.Config.Types 18114 _ = typ 18115 // match: (Div16u x y) 18116 // cond: 18117 // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 18118 for { 18119 _ = v.Args[1] 18120 x := v.Args[0] 18121 y := v.Args[1] 18122 v.reset(OpDiv32u) 18123 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18124 v0.AddArg(x) 18125 v.AddArg(v0) 18126 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18127 v1.AddArg(y) 18128 v.AddArg(v1) 18129 return true 18130 } 18131 } 18132 func rewriteValueARM_OpDiv32_0(v *Value) bool { 18133 b := v.Block 18134 _ = b 18135 typ := &b.Func.Config.Types 18136 _ = typ 18137 // match: (Div32 x y) 18138 // cond: 18139 // 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))) 18140 for { 18141 _ = v.Args[1] 18142 x := v.Args[0] 18143 y := v.Args[1] 18144 v.reset(OpARMSUB) 18145 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18146 v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 18147 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 18148 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 18149 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18150 v4.AddArg(x) 18151 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18152 v5.AddArg(x) 18153 v4.AddArg(v5) 18154 v3.AddArg(v4) 18155 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18156 v6.AddArg(x) 18157 v3.AddArg(v6) 18158 v2.AddArg(v3) 18159 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 18160 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18161 v8.AddArg(y) 18162 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18163 v9.AddArg(y) 18164 v8.AddArg(v9) 18165 v7.AddArg(v8) 18166 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18167 v10.AddArg(y) 18168 v7.AddArg(v10) 18169 v2.AddArg(v7) 18170 v1.AddArg(v2) 18171 v0.AddArg(v1) 18172 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18173 v12 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18174 v12.AddArg(x) 18175 v12.AddArg(y) 18176 v11.AddArg(v12) 18177 v0.AddArg(v11) 18178 v.AddArg(v0) 18179 v13 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 18180 v14 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 18181 v14.AddArg(x) 18182 v14.AddArg(y) 18183 v13.AddArg(v14) 18184 v.AddArg(v13) 18185 return true 18186 } 18187 } 18188 func rewriteValueARM_OpDiv32F_0(v *Value) bool { 18189 // match: (Div32F x y) 18190 // cond: 18191 // result: (DIVF x y) 18192 for { 18193 _ = v.Args[1] 18194 x := v.Args[0] 18195 y := v.Args[1] 18196 v.reset(OpARMDIVF) 18197 v.AddArg(x) 18198 v.AddArg(y) 18199 return true 18200 } 18201 } 18202 func rewriteValueARM_OpDiv32u_0(v *Value) bool { 18203 b := v.Block 18204 _ = b 18205 typ := &b.Func.Config.Types 18206 _ = typ 18207 // match: (Div32u x y) 18208 // cond: 18209 // result: (Select0 <typ.UInt32> (CALLudiv x y)) 18210 for { 18211 _ = v.Args[1] 18212 x := v.Args[0] 18213 y := v.Args[1] 18214 v.reset(OpSelect0) 18215 v.Type = typ.UInt32 18216 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 18217 v0.AddArg(x) 18218 v0.AddArg(y) 18219 v.AddArg(v0) 18220 return true 18221 } 18222 } 18223 func rewriteValueARM_OpDiv64F_0(v *Value) bool { 18224 // match: (Div64F x y) 18225 // cond: 18226 // result: (DIVD x y) 18227 for { 18228 _ = v.Args[1] 18229 x := v.Args[0] 18230 y := v.Args[1] 18231 v.reset(OpARMDIVD) 18232 v.AddArg(x) 18233 v.AddArg(y) 18234 return true 18235 } 18236 } 18237 func rewriteValueARM_OpDiv8_0(v *Value) bool { 18238 b := v.Block 18239 _ = b 18240 typ := &b.Func.Config.Types 18241 _ = typ 18242 // match: (Div8 x y) 18243 // cond: 18244 // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) 18245 for { 18246 _ = v.Args[1] 18247 x := v.Args[0] 18248 y := v.Args[1] 18249 v.reset(OpDiv32) 18250 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18251 v0.AddArg(x) 18252 v.AddArg(v0) 18253 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18254 v1.AddArg(y) 18255 v.AddArg(v1) 18256 return true 18257 } 18258 } 18259 func rewriteValueARM_OpDiv8u_0(v *Value) bool { 18260 b := v.Block 18261 _ = b 18262 typ := &b.Func.Config.Types 18263 _ = typ 18264 // match: (Div8u x y) 18265 // cond: 18266 // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 18267 for { 18268 _ = v.Args[1] 18269 x := v.Args[0] 18270 y := v.Args[1] 18271 v.reset(OpDiv32u) 18272 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18273 v0.AddArg(x) 18274 v.AddArg(v0) 18275 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18276 v1.AddArg(y) 18277 v.AddArg(v1) 18278 return true 18279 } 18280 } 18281 func rewriteValueARM_OpEq16_0(v *Value) bool { 18282 b := v.Block 18283 _ = b 18284 typ := &b.Func.Config.Types 18285 _ = typ 18286 // match: (Eq16 x y) 18287 // cond: 18288 // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18289 for { 18290 _ = v.Args[1] 18291 x := v.Args[0] 18292 y := v.Args[1] 18293 v.reset(OpARMEqual) 18294 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18295 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18296 v1.AddArg(x) 18297 v0.AddArg(v1) 18298 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18299 v2.AddArg(y) 18300 v0.AddArg(v2) 18301 v.AddArg(v0) 18302 return true 18303 } 18304 } 18305 func rewriteValueARM_OpEq32_0(v *Value) bool { 18306 b := v.Block 18307 _ = b 18308 // match: (Eq32 x y) 18309 // cond: 18310 // result: (Equal (CMP x y)) 18311 for { 18312 _ = v.Args[1] 18313 x := v.Args[0] 18314 y := v.Args[1] 18315 v.reset(OpARMEqual) 18316 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18317 v0.AddArg(x) 18318 v0.AddArg(y) 18319 v.AddArg(v0) 18320 return true 18321 } 18322 } 18323 func rewriteValueARM_OpEq32F_0(v *Value) bool { 18324 b := v.Block 18325 _ = b 18326 // match: (Eq32F x y) 18327 // cond: 18328 // result: (Equal (CMPF x y)) 18329 for { 18330 _ = v.Args[1] 18331 x := v.Args[0] 18332 y := v.Args[1] 18333 v.reset(OpARMEqual) 18334 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18335 v0.AddArg(x) 18336 v0.AddArg(y) 18337 v.AddArg(v0) 18338 return true 18339 } 18340 } 18341 func rewriteValueARM_OpEq64F_0(v *Value) bool { 18342 b := v.Block 18343 _ = b 18344 // match: (Eq64F x y) 18345 // cond: 18346 // result: (Equal (CMPD x y)) 18347 for { 18348 _ = v.Args[1] 18349 x := v.Args[0] 18350 y := v.Args[1] 18351 v.reset(OpARMEqual) 18352 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18353 v0.AddArg(x) 18354 v0.AddArg(y) 18355 v.AddArg(v0) 18356 return true 18357 } 18358 } 18359 func rewriteValueARM_OpEq8_0(v *Value) bool { 18360 b := v.Block 18361 _ = b 18362 typ := &b.Func.Config.Types 18363 _ = typ 18364 // match: (Eq8 x y) 18365 // cond: 18366 // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 18367 for { 18368 _ = v.Args[1] 18369 x := v.Args[0] 18370 y := v.Args[1] 18371 v.reset(OpARMEqual) 18372 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18373 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18374 v1.AddArg(x) 18375 v0.AddArg(v1) 18376 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18377 v2.AddArg(y) 18378 v0.AddArg(v2) 18379 v.AddArg(v0) 18380 return true 18381 } 18382 } 18383 func rewriteValueARM_OpEqB_0(v *Value) bool { 18384 b := v.Block 18385 _ = b 18386 typ := &b.Func.Config.Types 18387 _ = typ 18388 // match: (EqB x y) 18389 // cond: 18390 // result: (XORconst [1] (XOR <typ.Bool> x y)) 18391 for { 18392 _ = v.Args[1] 18393 x := v.Args[0] 18394 y := v.Args[1] 18395 v.reset(OpARMXORconst) 18396 v.AuxInt = 1 18397 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool) 18398 v0.AddArg(x) 18399 v0.AddArg(y) 18400 v.AddArg(v0) 18401 return true 18402 } 18403 } 18404 func rewriteValueARM_OpEqPtr_0(v *Value) bool { 18405 b := v.Block 18406 _ = b 18407 // match: (EqPtr x y) 18408 // cond: 18409 // result: (Equal (CMP x y)) 18410 for { 18411 _ = v.Args[1] 18412 x := v.Args[0] 18413 y := v.Args[1] 18414 v.reset(OpARMEqual) 18415 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18416 v0.AddArg(x) 18417 v0.AddArg(y) 18418 v.AddArg(v0) 18419 return true 18420 } 18421 } 18422 func rewriteValueARM_OpGeq16_0(v *Value) bool { 18423 b := v.Block 18424 _ = b 18425 typ := &b.Func.Config.Types 18426 _ = typ 18427 // match: (Geq16 x y) 18428 // cond: 18429 // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 18430 for { 18431 _ = v.Args[1] 18432 x := v.Args[0] 18433 y := v.Args[1] 18434 v.reset(OpARMGreaterEqual) 18435 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18436 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18437 v1.AddArg(x) 18438 v0.AddArg(v1) 18439 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18440 v2.AddArg(y) 18441 v0.AddArg(v2) 18442 v.AddArg(v0) 18443 return true 18444 } 18445 } 18446 func rewriteValueARM_OpGeq16U_0(v *Value) bool { 18447 b := v.Block 18448 _ = b 18449 typ := &b.Func.Config.Types 18450 _ = typ 18451 // match: (Geq16U x y) 18452 // cond: 18453 // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18454 for { 18455 _ = v.Args[1] 18456 x := v.Args[0] 18457 y := v.Args[1] 18458 v.reset(OpARMGreaterEqualU) 18459 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18460 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18461 v1.AddArg(x) 18462 v0.AddArg(v1) 18463 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18464 v2.AddArg(y) 18465 v0.AddArg(v2) 18466 v.AddArg(v0) 18467 return true 18468 } 18469 } 18470 func rewriteValueARM_OpGeq32_0(v *Value) bool { 18471 b := v.Block 18472 _ = b 18473 // match: (Geq32 x y) 18474 // cond: 18475 // result: (GreaterEqual (CMP x y)) 18476 for { 18477 _ = v.Args[1] 18478 x := v.Args[0] 18479 y := v.Args[1] 18480 v.reset(OpARMGreaterEqual) 18481 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18482 v0.AddArg(x) 18483 v0.AddArg(y) 18484 v.AddArg(v0) 18485 return true 18486 } 18487 } 18488 func rewriteValueARM_OpGeq32F_0(v *Value) bool { 18489 b := v.Block 18490 _ = b 18491 // match: (Geq32F x y) 18492 // cond: 18493 // result: (GreaterEqual (CMPF x y)) 18494 for { 18495 _ = v.Args[1] 18496 x := v.Args[0] 18497 y := v.Args[1] 18498 v.reset(OpARMGreaterEqual) 18499 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18500 v0.AddArg(x) 18501 v0.AddArg(y) 18502 v.AddArg(v0) 18503 return true 18504 } 18505 } 18506 func rewriteValueARM_OpGeq32U_0(v *Value) bool { 18507 b := v.Block 18508 _ = b 18509 // match: (Geq32U x y) 18510 // cond: 18511 // result: (GreaterEqualU (CMP x y)) 18512 for { 18513 _ = v.Args[1] 18514 x := v.Args[0] 18515 y := v.Args[1] 18516 v.reset(OpARMGreaterEqualU) 18517 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18518 v0.AddArg(x) 18519 v0.AddArg(y) 18520 v.AddArg(v0) 18521 return true 18522 } 18523 } 18524 func rewriteValueARM_OpGeq64F_0(v *Value) bool { 18525 b := v.Block 18526 _ = b 18527 // match: (Geq64F x y) 18528 // cond: 18529 // result: (GreaterEqual (CMPD x y)) 18530 for { 18531 _ = v.Args[1] 18532 x := v.Args[0] 18533 y := v.Args[1] 18534 v.reset(OpARMGreaterEqual) 18535 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18536 v0.AddArg(x) 18537 v0.AddArg(y) 18538 v.AddArg(v0) 18539 return true 18540 } 18541 } 18542 func rewriteValueARM_OpGeq8_0(v *Value) bool { 18543 b := v.Block 18544 _ = b 18545 typ := &b.Func.Config.Types 18546 _ = typ 18547 // match: (Geq8 x y) 18548 // cond: 18549 // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) 18550 for { 18551 _ = v.Args[1] 18552 x := v.Args[0] 18553 y := v.Args[1] 18554 v.reset(OpARMGreaterEqual) 18555 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18556 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18557 v1.AddArg(x) 18558 v0.AddArg(v1) 18559 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18560 v2.AddArg(y) 18561 v0.AddArg(v2) 18562 v.AddArg(v0) 18563 return true 18564 } 18565 } 18566 func rewriteValueARM_OpGeq8U_0(v *Value) bool { 18567 b := v.Block 18568 _ = b 18569 typ := &b.Func.Config.Types 18570 _ = typ 18571 // match: (Geq8U x y) 18572 // cond: 18573 // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 18574 for { 18575 _ = v.Args[1] 18576 x := v.Args[0] 18577 y := v.Args[1] 18578 v.reset(OpARMGreaterEqualU) 18579 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18580 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18581 v1.AddArg(x) 18582 v0.AddArg(v1) 18583 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18584 v2.AddArg(y) 18585 v0.AddArg(v2) 18586 v.AddArg(v0) 18587 return true 18588 } 18589 } 18590 func rewriteValueARM_OpGetCallerSP_0(v *Value) bool { 18591 // match: (GetCallerSP) 18592 // cond: 18593 // result: (LoweredGetCallerSP) 18594 for { 18595 v.reset(OpARMLoweredGetCallerSP) 18596 return true 18597 } 18598 } 18599 func rewriteValueARM_OpGetClosurePtr_0(v *Value) bool { 18600 // match: (GetClosurePtr) 18601 // cond: 18602 // result: (LoweredGetClosurePtr) 18603 for { 18604 v.reset(OpARMLoweredGetClosurePtr) 18605 return true 18606 } 18607 } 18608 func rewriteValueARM_OpGreater16_0(v *Value) bool { 18609 b := v.Block 18610 _ = b 18611 typ := &b.Func.Config.Types 18612 _ = typ 18613 // match: (Greater16 x y) 18614 // cond: 18615 // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 18616 for { 18617 _ = v.Args[1] 18618 x := v.Args[0] 18619 y := v.Args[1] 18620 v.reset(OpARMGreaterThan) 18621 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18622 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18623 v1.AddArg(x) 18624 v0.AddArg(v1) 18625 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18626 v2.AddArg(y) 18627 v0.AddArg(v2) 18628 v.AddArg(v0) 18629 return true 18630 } 18631 } 18632 func rewriteValueARM_OpGreater16U_0(v *Value) bool { 18633 b := v.Block 18634 _ = b 18635 typ := &b.Func.Config.Types 18636 _ = typ 18637 // match: (Greater16U x y) 18638 // cond: 18639 // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18640 for { 18641 _ = v.Args[1] 18642 x := v.Args[0] 18643 y := v.Args[1] 18644 v.reset(OpARMGreaterThanU) 18645 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18646 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18647 v1.AddArg(x) 18648 v0.AddArg(v1) 18649 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18650 v2.AddArg(y) 18651 v0.AddArg(v2) 18652 v.AddArg(v0) 18653 return true 18654 } 18655 } 18656 func rewriteValueARM_OpGreater32_0(v *Value) bool { 18657 b := v.Block 18658 _ = b 18659 // match: (Greater32 x y) 18660 // cond: 18661 // result: (GreaterThan (CMP x y)) 18662 for { 18663 _ = v.Args[1] 18664 x := v.Args[0] 18665 y := v.Args[1] 18666 v.reset(OpARMGreaterThan) 18667 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18668 v0.AddArg(x) 18669 v0.AddArg(y) 18670 v.AddArg(v0) 18671 return true 18672 } 18673 } 18674 func rewriteValueARM_OpGreater32F_0(v *Value) bool { 18675 b := v.Block 18676 _ = b 18677 // match: (Greater32F x y) 18678 // cond: 18679 // result: (GreaterThan (CMPF x y)) 18680 for { 18681 _ = v.Args[1] 18682 x := v.Args[0] 18683 y := v.Args[1] 18684 v.reset(OpARMGreaterThan) 18685 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18686 v0.AddArg(x) 18687 v0.AddArg(y) 18688 v.AddArg(v0) 18689 return true 18690 } 18691 } 18692 func rewriteValueARM_OpGreater32U_0(v *Value) bool { 18693 b := v.Block 18694 _ = b 18695 // match: (Greater32U x y) 18696 // cond: 18697 // result: (GreaterThanU (CMP x y)) 18698 for { 18699 _ = v.Args[1] 18700 x := v.Args[0] 18701 y := v.Args[1] 18702 v.reset(OpARMGreaterThanU) 18703 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18704 v0.AddArg(x) 18705 v0.AddArg(y) 18706 v.AddArg(v0) 18707 return true 18708 } 18709 } 18710 func rewriteValueARM_OpGreater64F_0(v *Value) bool { 18711 b := v.Block 18712 _ = b 18713 // match: (Greater64F x y) 18714 // cond: 18715 // result: (GreaterThan (CMPD x y)) 18716 for { 18717 _ = v.Args[1] 18718 x := v.Args[0] 18719 y := v.Args[1] 18720 v.reset(OpARMGreaterThan) 18721 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18722 v0.AddArg(x) 18723 v0.AddArg(y) 18724 v.AddArg(v0) 18725 return true 18726 } 18727 } 18728 func rewriteValueARM_OpGreater8_0(v *Value) bool { 18729 b := v.Block 18730 _ = b 18731 typ := &b.Func.Config.Types 18732 _ = typ 18733 // match: (Greater8 x y) 18734 // cond: 18735 // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 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, OpSignExt8to32, typ.Int32) 18743 v1.AddArg(x) 18744 v0.AddArg(v1) 18745 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 18746 v2.AddArg(y) 18747 v0.AddArg(v2) 18748 v.AddArg(v0) 18749 return true 18750 } 18751 } 18752 func rewriteValueARM_OpGreater8U_0(v *Value) bool { 18753 b := v.Block 18754 _ = b 18755 typ := &b.Func.Config.Types 18756 _ = typ 18757 // match: (Greater8U x y) 18758 // cond: 18759 // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 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, OpZeroExt8to32, typ.UInt32) 18767 v1.AddArg(x) 18768 v0.AddArg(v1) 18769 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 18770 v2.AddArg(y) 18771 v0.AddArg(v2) 18772 v.AddArg(v0) 18773 return true 18774 } 18775 } 18776 func rewriteValueARM_OpHmul32_0(v *Value) bool { 18777 // match: (Hmul32 x y) 18778 // cond: 18779 // result: (HMUL x y) 18780 for { 18781 _ = v.Args[1] 18782 x := v.Args[0] 18783 y := v.Args[1] 18784 v.reset(OpARMHMUL) 18785 v.AddArg(x) 18786 v.AddArg(y) 18787 return true 18788 } 18789 } 18790 func rewriteValueARM_OpHmul32u_0(v *Value) bool { 18791 // match: (Hmul32u x y) 18792 // cond: 18793 // result: (HMULU x y) 18794 for { 18795 _ = v.Args[1] 18796 x := v.Args[0] 18797 y := v.Args[1] 18798 v.reset(OpARMHMULU) 18799 v.AddArg(x) 18800 v.AddArg(y) 18801 return true 18802 } 18803 } 18804 func rewriteValueARM_OpInterCall_0(v *Value) bool { 18805 // match: (InterCall [argwid] entry mem) 18806 // cond: 18807 // result: (CALLinter [argwid] entry mem) 18808 for { 18809 argwid := v.AuxInt 18810 _ = v.Args[1] 18811 entry := v.Args[0] 18812 mem := v.Args[1] 18813 v.reset(OpARMCALLinter) 18814 v.AuxInt = argwid 18815 v.AddArg(entry) 18816 v.AddArg(mem) 18817 return true 18818 } 18819 } 18820 func rewriteValueARM_OpIsInBounds_0(v *Value) bool { 18821 b := v.Block 18822 _ = b 18823 // match: (IsInBounds idx len) 18824 // cond: 18825 // result: (LessThanU (CMP idx len)) 18826 for { 18827 _ = v.Args[1] 18828 idx := v.Args[0] 18829 len := v.Args[1] 18830 v.reset(OpARMLessThanU) 18831 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18832 v0.AddArg(idx) 18833 v0.AddArg(len) 18834 v.AddArg(v0) 18835 return true 18836 } 18837 } 18838 func rewriteValueARM_OpIsNonNil_0(v *Value) bool { 18839 b := v.Block 18840 _ = b 18841 // match: (IsNonNil ptr) 18842 // cond: 18843 // result: (NotEqual (CMPconst [0] ptr)) 18844 for { 18845 ptr := v.Args[0] 18846 v.reset(OpARMNotEqual) 18847 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 18848 v0.AuxInt = 0 18849 v0.AddArg(ptr) 18850 v.AddArg(v0) 18851 return true 18852 } 18853 } 18854 func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { 18855 b := v.Block 18856 _ = b 18857 // match: (IsSliceInBounds idx len) 18858 // cond: 18859 // result: (LessEqualU (CMP idx len)) 18860 for { 18861 _ = v.Args[1] 18862 idx := v.Args[0] 18863 len := v.Args[1] 18864 v.reset(OpARMLessEqualU) 18865 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18866 v0.AddArg(idx) 18867 v0.AddArg(len) 18868 v.AddArg(v0) 18869 return true 18870 } 18871 } 18872 func rewriteValueARM_OpLeq16_0(v *Value) bool { 18873 b := v.Block 18874 _ = b 18875 typ := &b.Func.Config.Types 18876 _ = typ 18877 // match: (Leq16 x y) 18878 // cond: 18879 // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) 18880 for { 18881 _ = v.Args[1] 18882 x := v.Args[0] 18883 y := v.Args[1] 18884 v.reset(OpARMLessEqual) 18885 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18886 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18887 v1.AddArg(x) 18888 v0.AddArg(v1) 18889 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 18890 v2.AddArg(y) 18891 v0.AddArg(v2) 18892 v.AddArg(v0) 18893 return true 18894 } 18895 } 18896 func rewriteValueARM_OpLeq16U_0(v *Value) bool { 18897 b := v.Block 18898 _ = b 18899 typ := &b.Func.Config.Types 18900 _ = typ 18901 // match: (Leq16U x y) 18902 // cond: 18903 // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 18904 for { 18905 _ = v.Args[1] 18906 x := v.Args[0] 18907 y := v.Args[1] 18908 v.reset(OpARMLessEqualU) 18909 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18910 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18911 v1.AddArg(x) 18912 v0.AddArg(v1) 18913 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 18914 v2.AddArg(y) 18915 v0.AddArg(v2) 18916 v.AddArg(v0) 18917 return true 18918 } 18919 } 18920 func rewriteValueARM_OpLeq32_0(v *Value) bool { 18921 b := v.Block 18922 _ = b 18923 // match: (Leq32 x y) 18924 // cond: 18925 // result: (LessEqual (CMP x y)) 18926 for { 18927 _ = v.Args[1] 18928 x := v.Args[0] 18929 y := v.Args[1] 18930 v.reset(OpARMLessEqual) 18931 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18932 v0.AddArg(x) 18933 v0.AddArg(y) 18934 v.AddArg(v0) 18935 return true 18936 } 18937 } 18938 func rewriteValueARM_OpLeq32F_0(v *Value) bool { 18939 b := v.Block 18940 _ = b 18941 // match: (Leq32F x y) 18942 // cond: 18943 // result: (GreaterEqual (CMPF y x)) 18944 for { 18945 _ = v.Args[1] 18946 x := v.Args[0] 18947 y := v.Args[1] 18948 v.reset(OpARMGreaterEqual) 18949 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 18950 v0.AddArg(y) 18951 v0.AddArg(x) 18952 v.AddArg(v0) 18953 return true 18954 } 18955 } 18956 func rewriteValueARM_OpLeq32U_0(v *Value) bool { 18957 b := v.Block 18958 _ = b 18959 // match: (Leq32U x y) 18960 // cond: 18961 // result: (LessEqualU (CMP x y)) 18962 for { 18963 _ = v.Args[1] 18964 x := v.Args[0] 18965 y := v.Args[1] 18966 v.reset(OpARMLessEqualU) 18967 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 18968 v0.AddArg(x) 18969 v0.AddArg(y) 18970 v.AddArg(v0) 18971 return true 18972 } 18973 } 18974 func rewriteValueARM_OpLeq64F_0(v *Value) bool { 18975 b := v.Block 18976 _ = b 18977 // match: (Leq64F x y) 18978 // cond: 18979 // result: (GreaterEqual (CMPD y x)) 18980 for { 18981 _ = v.Args[1] 18982 x := v.Args[0] 18983 y := v.Args[1] 18984 v.reset(OpARMGreaterEqual) 18985 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 18986 v0.AddArg(y) 18987 v0.AddArg(x) 18988 v.AddArg(v0) 18989 return true 18990 } 18991 } 18992 func rewriteValueARM_OpLeq8_0(v *Value) bool { 18993 b := v.Block 18994 _ = b 18995 typ := &b.Func.Config.Types 18996 _ = typ 18997 // match: (Leq8 x y) 18998 // cond: 18999 // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 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, OpSignExt8to32, typ.Int32) 19007 v1.AddArg(x) 19008 v0.AddArg(v1) 19009 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19010 v2.AddArg(y) 19011 v0.AddArg(v2) 19012 v.AddArg(v0) 19013 return true 19014 } 19015 } 19016 func rewriteValueARM_OpLeq8U_0(v *Value) bool { 19017 b := v.Block 19018 _ = b 19019 typ := &b.Func.Config.Types 19020 _ = typ 19021 // match: (Leq8U x y) 19022 // cond: 19023 // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 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, OpZeroExt8to32, typ.UInt32) 19031 v1.AddArg(x) 19032 v0.AddArg(v1) 19033 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19034 v2.AddArg(y) 19035 v0.AddArg(v2) 19036 v.AddArg(v0) 19037 return true 19038 } 19039 } 19040 func rewriteValueARM_OpLess16_0(v *Value) bool { 19041 b := v.Block 19042 _ = b 19043 typ := &b.Func.Config.Types 19044 _ = typ 19045 // match: (Less16 x y) 19046 // cond: 19047 // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) 19048 for { 19049 _ = v.Args[1] 19050 x := v.Args[0] 19051 y := v.Args[1] 19052 v.reset(OpARMLessThan) 19053 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19054 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19055 v1.AddArg(x) 19056 v0.AddArg(v1) 19057 v2 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19058 v2.AddArg(y) 19059 v0.AddArg(v2) 19060 v.AddArg(v0) 19061 return true 19062 } 19063 } 19064 func rewriteValueARM_OpLess16U_0(v *Value) bool { 19065 b := v.Block 19066 _ = b 19067 typ := &b.Func.Config.Types 19068 _ = typ 19069 // match: (Less16U x y) 19070 // cond: 19071 // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 19072 for { 19073 _ = v.Args[1] 19074 x := v.Args[0] 19075 y := v.Args[1] 19076 v.reset(OpARMLessThanU) 19077 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19078 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19079 v1.AddArg(x) 19080 v0.AddArg(v1) 19081 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19082 v2.AddArg(y) 19083 v0.AddArg(v2) 19084 v.AddArg(v0) 19085 return true 19086 } 19087 } 19088 func rewriteValueARM_OpLess32_0(v *Value) bool { 19089 b := v.Block 19090 _ = b 19091 // match: (Less32 x y) 19092 // cond: 19093 // result: (LessThan (CMP x y)) 19094 for { 19095 _ = v.Args[1] 19096 x := v.Args[0] 19097 y := v.Args[1] 19098 v.reset(OpARMLessThan) 19099 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19100 v0.AddArg(x) 19101 v0.AddArg(y) 19102 v.AddArg(v0) 19103 return true 19104 } 19105 } 19106 func rewriteValueARM_OpLess32F_0(v *Value) bool { 19107 b := v.Block 19108 _ = b 19109 // match: (Less32F x y) 19110 // cond: 19111 // result: (GreaterThan (CMPF y x)) 19112 for { 19113 _ = v.Args[1] 19114 x := v.Args[0] 19115 y := v.Args[1] 19116 v.reset(OpARMGreaterThan) 19117 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 19118 v0.AddArg(y) 19119 v0.AddArg(x) 19120 v.AddArg(v0) 19121 return true 19122 } 19123 } 19124 func rewriteValueARM_OpLess32U_0(v *Value) bool { 19125 b := v.Block 19126 _ = b 19127 // match: (Less32U x y) 19128 // cond: 19129 // result: (LessThanU (CMP x y)) 19130 for { 19131 _ = v.Args[1] 19132 x := v.Args[0] 19133 y := v.Args[1] 19134 v.reset(OpARMLessThanU) 19135 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 19136 v0.AddArg(x) 19137 v0.AddArg(y) 19138 v.AddArg(v0) 19139 return true 19140 } 19141 } 19142 func rewriteValueARM_OpLess64F_0(v *Value) bool { 19143 b := v.Block 19144 _ = b 19145 // match: (Less64F x y) 19146 // cond: 19147 // result: (GreaterThan (CMPD y x)) 19148 for { 19149 _ = v.Args[1] 19150 x := v.Args[0] 19151 y := v.Args[1] 19152 v.reset(OpARMGreaterThan) 19153 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 19154 v0.AddArg(y) 19155 v0.AddArg(x) 19156 v.AddArg(v0) 19157 return true 19158 } 19159 } 19160 func rewriteValueARM_OpLess8_0(v *Value) bool { 19161 b := v.Block 19162 _ = b 19163 typ := &b.Func.Config.Types 19164 _ = typ 19165 // match: (Less8 x y) 19166 // cond: 19167 // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 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, OpSignExt8to32, typ.Int32) 19175 v1.AddArg(x) 19176 v0.AddArg(v1) 19177 v2 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19178 v2.AddArg(y) 19179 v0.AddArg(v2) 19180 v.AddArg(v0) 19181 return true 19182 } 19183 } 19184 func rewriteValueARM_OpLess8U_0(v *Value) bool { 19185 b := v.Block 19186 _ = b 19187 typ := &b.Func.Config.Types 19188 _ = typ 19189 // match: (Less8U x y) 19190 // cond: 19191 // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 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, OpZeroExt8to32, typ.UInt32) 19199 v1.AddArg(x) 19200 v0.AddArg(v1) 19201 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19202 v2.AddArg(y) 19203 v0.AddArg(v2) 19204 v.AddArg(v0) 19205 return true 19206 } 19207 } 19208 func rewriteValueARM_OpLoad_0(v *Value) bool { 19209 // match: (Load <t> ptr mem) 19210 // cond: t.IsBoolean() 19211 // result: (MOVBUload ptr mem) 19212 for { 19213 t := v.Type 19214 _ = v.Args[1] 19215 ptr := v.Args[0] 19216 mem := v.Args[1] 19217 if !(t.IsBoolean()) { 19218 break 19219 } 19220 v.reset(OpARMMOVBUload) 19221 v.AddArg(ptr) 19222 v.AddArg(mem) 19223 return true 19224 } 19225 // match: (Load <t> ptr mem) 19226 // cond: (is8BitInt(t) && isSigned(t)) 19227 // result: (MOVBload ptr mem) 19228 for { 19229 t := v.Type 19230 _ = v.Args[1] 19231 ptr := v.Args[0] 19232 mem := v.Args[1] 19233 if !(is8BitInt(t) && isSigned(t)) { 19234 break 19235 } 19236 v.reset(OpARMMOVBload) 19237 v.AddArg(ptr) 19238 v.AddArg(mem) 19239 return true 19240 } 19241 // match: (Load <t> ptr mem) 19242 // cond: (is8BitInt(t) && !isSigned(t)) 19243 // result: (MOVBUload ptr mem) 19244 for { 19245 t := v.Type 19246 _ = v.Args[1] 19247 ptr := v.Args[0] 19248 mem := v.Args[1] 19249 if !(is8BitInt(t) && !isSigned(t)) { 19250 break 19251 } 19252 v.reset(OpARMMOVBUload) 19253 v.AddArg(ptr) 19254 v.AddArg(mem) 19255 return true 19256 } 19257 // match: (Load <t> ptr mem) 19258 // cond: (is16BitInt(t) && isSigned(t)) 19259 // result: (MOVHload ptr mem) 19260 for { 19261 t := v.Type 19262 _ = v.Args[1] 19263 ptr := v.Args[0] 19264 mem := v.Args[1] 19265 if !(is16BitInt(t) && isSigned(t)) { 19266 break 19267 } 19268 v.reset(OpARMMOVHload) 19269 v.AddArg(ptr) 19270 v.AddArg(mem) 19271 return true 19272 } 19273 // match: (Load <t> ptr mem) 19274 // cond: (is16BitInt(t) && !isSigned(t)) 19275 // result: (MOVHUload ptr mem) 19276 for { 19277 t := v.Type 19278 _ = v.Args[1] 19279 ptr := v.Args[0] 19280 mem := v.Args[1] 19281 if !(is16BitInt(t) && !isSigned(t)) { 19282 break 19283 } 19284 v.reset(OpARMMOVHUload) 19285 v.AddArg(ptr) 19286 v.AddArg(mem) 19287 return true 19288 } 19289 // match: (Load <t> ptr mem) 19290 // cond: (is32BitInt(t) || isPtr(t)) 19291 // result: (MOVWload ptr mem) 19292 for { 19293 t := v.Type 19294 _ = v.Args[1] 19295 ptr := v.Args[0] 19296 mem := v.Args[1] 19297 if !(is32BitInt(t) || isPtr(t)) { 19298 break 19299 } 19300 v.reset(OpARMMOVWload) 19301 v.AddArg(ptr) 19302 v.AddArg(mem) 19303 return true 19304 } 19305 // match: (Load <t> ptr mem) 19306 // cond: is32BitFloat(t) 19307 // result: (MOVFload ptr mem) 19308 for { 19309 t := v.Type 19310 _ = v.Args[1] 19311 ptr := v.Args[0] 19312 mem := v.Args[1] 19313 if !(is32BitFloat(t)) { 19314 break 19315 } 19316 v.reset(OpARMMOVFload) 19317 v.AddArg(ptr) 19318 v.AddArg(mem) 19319 return true 19320 } 19321 // match: (Load <t> ptr mem) 19322 // cond: is64BitFloat(t) 19323 // result: (MOVDload ptr mem) 19324 for { 19325 t := v.Type 19326 _ = v.Args[1] 19327 ptr := v.Args[0] 19328 mem := v.Args[1] 19329 if !(is64BitFloat(t)) { 19330 break 19331 } 19332 v.reset(OpARMMOVDload) 19333 v.AddArg(ptr) 19334 v.AddArg(mem) 19335 return true 19336 } 19337 return false 19338 } 19339 func rewriteValueARM_OpLsh16x16_0(v *Value) bool { 19340 b := v.Block 19341 _ = b 19342 typ := &b.Func.Config.Types 19343 _ = typ 19344 // match: (Lsh16x16 x y) 19345 // cond: 19346 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19347 for { 19348 _ = v.Args[1] 19349 x := v.Args[0] 19350 y := v.Args[1] 19351 v.reset(OpARMCMOVWHSconst) 19352 v.AuxInt = 0 19353 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19354 v0.AddArg(x) 19355 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19356 v1.AddArg(y) 19357 v0.AddArg(v1) 19358 v.AddArg(v0) 19359 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19360 v2.AuxInt = 256 19361 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19362 v3.AddArg(y) 19363 v2.AddArg(v3) 19364 v.AddArg(v2) 19365 return true 19366 } 19367 } 19368 func rewriteValueARM_OpLsh16x32_0(v *Value) bool { 19369 b := v.Block 19370 _ = b 19371 // match: (Lsh16x32 x y) 19372 // cond: 19373 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19374 for { 19375 _ = v.Args[1] 19376 x := v.Args[0] 19377 y := v.Args[1] 19378 v.reset(OpARMCMOVWHSconst) 19379 v.AuxInt = 0 19380 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19381 v0.AddArg(x) 19382 v0.AddArg(y) 19383 v.AddArg(v0) 19384 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19385 v1.AuxInt = 256 19386 v1.AddArg(y) 19387 v.AddArg(v1) 19388 return true 19389 } 19390 } 19391 func rewriteValueARM_OpLsh16x64_0(v *Value) bool { 19392 // match: (Lsh16x64 x (Const64 [c])) 19393 // cond: uint64(c) < 16 19394 // result: (SLLconst x [c]) 19395 for { 19396 _ = v.Args[1] 19397 x := v.Args[0] 19398 v_1 := v.Args[1] 19399 if v_1.Op != OpConst64 { 19400 break 19401 } 19402 c := v_1.AuxInt 19403 if !(uint64(c) < 16) { 19404 break 19405 } 19406 v.reset(OpARMSLLconst) 19407 v.AuxInt = c 19408 v.AddArg(x) 19409 return true 19410 } 19411 // match: (Lsh16x64 _ (Const64 [c])) 19412 // cond: uint64(c) >= 16 19413 // result: (Const16 [0]) 19414 for { 19415 _ = v.Args[1] 19416 v_1 := v.Args[1] 19417 if v_1.Op != OpConst64 { 19418 break 19419 } 19420 c := v_1.AuxInt 19421 if !(uint64(c) >= 16) { 19422 break 19423 } 19424 v.reset(OpConst16) 19425 v.AuxInt = 0 19426 return true 19427 } 19428 return false 19429 } 19430 func rewriteValueARM_OpLsh16x8_0(v *Value) bool { 19431 b := v.Block 19432 _ = b 19433 typ := &b.Func.Config.Types 19434 _ = typ 19435 // match: (Lsh16x8 x y) 19436 // cond: 19437 // result: (SLL x (ZeroExt8to32 y)) 19438 for { 19439 _ = v.Args[1] 19440 x := v.Args[0] 19441 y := v.Args[1] 19442 v.reset(OpARMSLL) 19443 v.AddArg(x) 19444 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19445 v0.AddArg(y) 19446 v.AddArg(v0) 19447 return true 19448 } 19449 } 19450 func rewriteValueARM_OpLsh32x16_0(v *Value) bool { 19451 b := v.Block 19452 _ = b 19453 typ := &b.Func.Config.Types 19454 _ = typ 19455 // match: (Lsh32x16 x y) 19456 // cond: 19457 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19458 for { 19459 _ = v.Args[1] 19460 x := v.Args[0] 19461 y := v.Args[1] 19462 v.reset(OpARMCMOVWHSconst) 19463 v.AuxInt = 0 19464 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19465 v0.AddArg(x) 19466 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19467 v1.AddArg(y) 19468 v0.AddArg(v1) 19469 v.AddArg(v0) 19470 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19471 v2.AuxInt = 256 19472 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19473 v3.AddArg(y) 19474 v2.AddArg(v3) 19475 v.AddArg(v2) 19476 return true 19477 } 19478 } 19479 func rewriteValueARM_OpLsh32x32_0(v *Value) bool { 19480 b := v.Block 19481 _ = b 19482 // match: (Lsh32x32 x y) 19483 // cond: 19484 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19485 for { 19486 _ = v.Args[1] 19487 x := v.Args[0] 19488 y := v.Args[1] 19489 v.reset(OpARMCMOVWHSconst) 19490 v.AuxInt = 0 19491 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19492 v0.AddArg(x) 19493 v0.AddArg(y) 19494 v.AddArg(v0) 19495 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19496 v1.AuxInt = 256 19497 v1.AddArg(y) 19498 v.AddArg(v1) 19499 return true 19500 } 19501 } 19502 func rewriteValueARM_OpLsh32x64_0(v *Value) bool { 19503 // match: (Lsh32x64 x (Const64 [c])) 19504 // cond: uint64(c) < 32 19505 // result: (SLLconst x [c]) 19506 for { 19507 _ = v.Args[1] 19508 x := v.Args[0] 19509 v_1 := v.Args[1] 19510 if v_1.Op != OpConst64 { 19511 break 19512 } 19513 c := v_1.AuxInt 19514 if !(uint64(c) < 32) { 19515 break 19516 } 19517 v.reset(OpARMSLLconst) 19518 v.AuxInt = c 19519 v.AddArg(x) 19520 return true 19521 } 19522 // match: (Lsh32x64 _ (Const64 [c])) 19523 // cond: uint64(c) >= 32 19524 // result: (Const32 [0]) 19525 for { 19526 _ = v.Args[1] 19527 v_1 := v.Args[1] 19528 if v_1.Op != OpConst64 { 19529 break 19530 } 19531 c := v_1.AuxInt 19532 if !(uint64(c) >= 32) { 19533 break 19534 } 19535 v.reset(OpConst32) 19536 v.AuxInt = 0 19537 return true 19538 } 19539 return false 19540 } 19541 func rewriteValueARM_OpLsh32x8_0(v *Value) bool { 19542 b := v.Block 19543 _ = b 19544 typ := &b.Func.Config.Types 19545 _ = typ 19546 // match: (Lsh32x8 x y) 19547 // cond: 19548 // result: (SLL x (ZeroExt8to32 y)) 19549 for { 19550 _ = v.Args[1] 19551 x := v.Args[0] 19552 y := v.Args[1] 19553 v.reset(OpARMSLL) 19554 v.AddArg(x) 19555 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19556 v0.AddArg(y) 19557 v.AddArg(v0) 19558 return true 19559 } 19560 } 19561 func rewriteValueARM_OpLsh8x16_0(v *Value) bool { 19562 b := v.Block 19563 _ = b 19564 typ := &b.Func.Config.Types 19565 _ = typ 19566 // match: (Lsh8x16 x y) 19567 // cond: 19568 // result: (CMOVWHSconst (SLL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 19569 for { 19570 _ = v.Args[1] 19571 x := v.Args[0] 19572 y := v.Args[1] 19573 v.reset(OpARMCMOVWHSconst) 19574 v.AuxInt = 0 19575 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19576 v0.AddArg(x) 19577 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19578 v1.AddArg(y) 19579 v0.AddArg(v1) 19580 v.AddArg(v0) 19581 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19582 v2.AuxInt = 256 19583 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19584 v3.AddArg(y) 19585 v2.AddArg(v3) 19586 v.AddArg(v2) 19587 return true 19588 } 19589 } 19590 func rewriteValueARM_OpLsh8x32_0(v *Value) bool { 19591 b := v.Block 19592 _ = b 19593 // match: (Lsh8x32 x y) 19594 // cond: 19595 // result: (CMOVWHSconst (SLL <x.Type> x y) (CMPconst [256] y) [0]) 19596 for { 19597 _ = v.Args[1] 19598 x := v.Args[0] 19599 y := v.Args[1] 19600 v.reset(OpARMCMOVWHSconst) 19601 v.AuxInt = 0 19602 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) 19603 v0.AddArg(x) 19604 v0.AddArg(y) 19605 v.AddArg(v0) 19606 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 19607 v1.AuxInt = 256 19608 v1.AddArg(y) 19609 v.AddArg(v1) 19610 return true 19611 } 19612 } 19613 func rewriteValueARM_OpLsh8x64_0(v *Value) bool { 19614 // match: (Lsh8x64 x (Const64 [c])) 19615 // cond: uint64(c) < 8 19616 // result: (SLLconst x [c]) 19617 for { 19618 _ = v.Args[1] 19619 x := v.Args[0] 19620 v_1 := v.Args[1] 19621 if v_1.Op != OpConst64 { 19622 break 19623 } 19624 c := v_1.AuxInt 19625 if !(uint64(c) < 8) { 19626 break 19627 } 19628 v.reset(OpARMSLLconst) 19629 v.AuxInt = c 19630 v.AddArg(x) 19631 return true 19632 } 19633 // match: (Lsh8x64 _ (Const64 [c])) 19634 // cond: uint64(c) >= 8 19635 // result: (Const8 [0]) 19636 for { 19637 _ = v.Args[1] 19638 v_1 := v.Args[1] 19639 if v_1.Op != OpConst64 { 19640 break 19641 } 19642 c := v_1.AuxInt 19643 if !(uint64(c) >= 8) { 19644 break 19645 } 19646 v.reset(OpConst8) 19647 v.AuxInt = 0 19648 return true 19649 } 19650 return false 19651 } 19652 func rewriteValueARM_OpLsh8x8_0(v *Value) bool { 19653 b := v.Block 19654 _ = b 19655 typ := &b.Func.Config.Types 19656 _ = typ 19657 // match: (Lsh8x8 x y) 19658 // cond: 19659 // result: (SLL x (ZeroExt8to32 y)) 19660 for { 19661 _ = v.Args[1] 19662 x := v.Args[0] 19663 y := v.Args[1] 19664 v.reset(OpARMSLL) 19665 v.AddArg(x) 19666 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19667 v0.AddArg(y) 19668 v.AddArg(v0) 19669 return true 19670 } 19671 } 19672 func rewriteValueARM_OpMod16_0(v *Value) bool { 19673 b := v.Block 19674 _ = b 19675 typ := &b.Func.Config.Types 19676 _ = typ 19677 // match: (Mod16 x y) 19678 // cond: 19679 // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) 19680 for { 19681 _ = v.Args[1] 19682 x := v.Args[0] 19683 y := v.Args[1] 19684 v.reset(OpMod32) 19685 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19686 v0.AddArg(x) 19687 v.AddArg(v0) 19688 v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 19689 v1.AddArg(y) 19690 v.AddArg(v1) 19691 return true 19692 } 19693 } 19694 func rewriteValueARM_OpMod16u_0(v *Value) bool { 19695 b := v.Block 19696 _ = b 19697 typ := &b.Func.Config.Types 19698 _ = typ 19699 // match: (Mod16u x y) 19700 // cond: 19701 // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) 19702 for { 19703 _ = v.Args[1] 19704 x := v.Args[0] 19705 y := v.Args[1] 19706 v.reset(OpMod32u) 19707 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19708 v0.AddArg(x) 19709 v.AddArg(v0) 19710 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 19711 v1.AddArg(y) 19712 v.AddArg(v1) 19713 return true 19714 } 19715 } 19716 func rewriteValueARM_OpMod32_0(v *Value) bool { 19717 b := v.Block 19718 _ = b 19719 typ := &b.Func.Config.Types 19720 _ = typ 19721 // match: (Mod32 x y) 19722 // cond: 19723 // 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)) 19724 for { 19725 _ = v.Args[1] 19726 x := v.Args[0] 19727 y := v.Args[1] 19728 v.reset(OpARMSUB) 19729 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19730 v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) 19731 v2 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 19732 v3 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 19733 v4 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19734 v4.AddArg(x) 19735 v5 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19736 v5.AddArg(x) 19737 v4.AddArg(v5) 19738 v3.AddArg(v4) 19739 v6 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19740 v6.AddArg(x) 19741 v3.AddArg(v6) 19742 v2.AddArg(v3) 19743 v7 := b.NewValue0(v.Pos, OpARMSUB, typ.UInt32) 19744 v8 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) 19745 v8.AddArg(y) 19746 v9 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19747 v9.AddArg(y) 19748 v8.AddArg(v9) 19749 v7.AddArg(v8) 19750 v10 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19751 v10.AddArg(y) 19752 v7.AddArg(v10) 19753 v2.AddArg(v7) 19754 v1.AddArg(v2) 19755 v0.AddArg(v1) 19756 v11 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19757 v11.AddArg(x) 19758 v0.AddArg(v11) 19759 v.AddArg(v0) 19760 v12 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 19761 v12.AddArg(x) 19762 v.AddArg(v12) 19763 return true 19764 } 19765 } 19766 func rewriteValueARM_OpMod32u_0(v *Value) bool { 19767 b := v.Block 19768 _ = b 19769 typ := &b.Func.Config.Types 19770 _ = typ 19771 // match: (Mod32u x y) 19772 // cond: 19773 // result: (Select1 <typ.UInt32> (CALLudiv x y)) 19774 for { 19775 _ = v.Args[1] 19776 x := v.Args[0] 19777 y := v.Args[1] 19778 v.reset(OpSelect1) 19779 v.Type = typ.UInt32 19780 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) 19781 v0.AddArg(x) 19782 v0.AddArg(y) 19783 v.AddArg(v0) 19784 return true 19785 } 19786 } 19787 func rewriteValueARM_OpMod8_0(v *Value) bool { 19788 b := v.Block 19789 _ = b 19790 typ := &b.Func.Config.Types 19791 _ = typ 19792 // match: (Mod8 x y) 19793 // cond: 19794 // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) 19795 for { 19796 _ = v.Args[1] 19797 x := v.Args[0] 19798 y := v.Args[1] 19799 v.reset(OpMod32) 19800 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19801 v0.AddArg(x) 19802 v.AddArg(v0) 19803 v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 19804 v1.AddArg(y) 19805 v.AddArg(v1) 19806 return true 19807 } 19808 } 19809 func rewriteValueARM_OpMod8u_0(v *Value) bool { 19810 b := v.Block 19811 _ = b 19812 typ := &b.Func.Config.Types 19813 _ = typ 19814 // match: (Mod8u x y) 19815 // cond: 19816 // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) 19817 for { 19818 _ = v.Args[1] 19819 x := v.Args[0] 19820 y := v.Args[1] 19821 v.reset(OpMod32u) 19822 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19823 v0.AddArg(x) 19824 v.AddArg(v0) 19825 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 19826 v1.AddArg(y) 19827 v.AddArg(v1) 19828 return true 19829 } 19830 } 19831 func rewriteValueARM_OpMove_0(v *Value) bool { 19832 b := v.Block 19833 _ = b 19834 config := b.Func.Config 19835 _ = config 19836 typ := &b.Func.Config.Types 19837 _ = typ 19838 // match: (Move [0] _ _ mem) 19839 // cond: 19840 // result: mem 19841 for { 19842 if v.AuxInt != 0 { 19843 break 19844 } 19845 _ = v.Args[2] 19846 mem := v.Args[2] 19847 v.reset(OpCopy) 19848 v.Type = mem.Type 19849 v.AddArg(mem) 19850 return true 19851 } 19852 // match: (Move [1] dst src mem) 19853 // cond: 19854 // result: (MOVBstore dst (MOVBUload src mem) mem) 19855 for { 19856 if v.AuxInt != 1 { 19857 break 19858 } 19859 _ = v.Args[2] 19860 dst := v.Args[0] 19861 src := v.Args[1] 19862 mem := v.Args[2] 19863 v.reset(OpARMMOVBstore) 19864 v.AddArg(dst) 19865 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 19866 v0.AddArg(src) 19867 v0.AddArg(mem) 19868 v.AddArg(v0) 19869 v.AddArg(mem) 19870 return true 19871 } 19872 // match: (Move [2] {t} dst src mem) 19873 // cond: t.(*types.Type).Alignment()%2 == 0 19874 // result: (MOVHstore dst (MOVHUload src mem) mem) 19875 for { 19876 if v.AuxInt != 2 { 19877 break 19878 } 19879 t := v.Aux 19880 _ = v.Args[2] 19881 dst := v.Args[0] 19882 src := v.Args[1] 19883 mem := v.Args[2] 19884 if !(t.(*types.Type).Alignment()%2 == 0) { 19885 break 19886 } 19887 v.reset(OpARMMOVHstore) 19888 v.AddArg(dst) 19889 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 19890 v0.AddArg(src) 19891 v0.AddArg(mem) 19892 v.AddArg(v0) 19893 v.AddArg(mem) 19894 return true 19895 } 19896 // match: (Move [2] dst src mem) 19897 // cond: 19898 // result: (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem)) 19899 for { 19900 if v.AuxInt != 2 { 19901 break 19902 } 19903 _ = v.Args[2] 19904 dst := v.Args[0] 19905 src := v.Args[1] 19906 mem := v.Args[2] 19907 v.reset(OpARMMOVBstore) 19908 v.AuxInt = 1 19909 v.AddArg(dst) 19910 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 19911 v0.AuxInt = 1 19912 v0.AddArg(src) 19913 v0.AddArg(mem) 19914 v.AddArg(v0) 19915 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 19916 v1.AddArg(dst) 19917 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 19918 v2.AddArg(src) 19919 v2.AddArg(mem) 19920 v1.AddArg(v2) 19921 v1.AddArg(mem) 19922 v.AddArg(v1) 19923 return true 19924 } 19925 // match: (Move [4] {t} dst src mem) 19926 // cond: t.(*types.Type).Alignment()%4 == 0 19927 // result: (MOVWstore dst (MOVWload src mem) mem) 19928 for { 19929 if v.AuxInt != 4 { 19930 break 19931 } 19932 t := v.Aux 19933 _ = v.Args[2] 19934 dst := v.Args[0] 19935 src := v.Args[1] 19936 mem := v.Args[2] 19937 if !(t.(*types.Type).Alignment()%4 == 0) { 19938 break 19939 } 19940 v.reset(OpARMMOVWstore) 19941 v.AddArg(dst) 19942 v0 := b.NewValue0(v.Pos, OpARMMOVWload, typ.UInt32) 19943 v0.AddArg(src) 19944 v0.AddArg(mem) 19945 v.AddArg(v0) 19946 v.AddArg(mem) 19947 return true 19948 } 19949 // match: (Move [4] {t} dst src mem) 19950 // cond: t.(*types.Type).Alignment()%2 == 0 19951 // result: (MOVHstore [2] dst (MOVHUload [2] src mem) (MOVHstore dst (MOVHUload src mem) mem)) 19952 for { 19953 if v.AuxInt != 4 { 19954 break 19955 } 19956 t := v.Aux 19957 _ = v.Args[2] 19958 dst := v.Args[0] 19959 src := v.Args[1] 19960 mem := v.Args[2] 19961 if !(t.(*types.Type).Alignment()%2 == 0) { 19962 break 19963 } 19964 v.reset(OpARMMOVHstore) 19965 v.AuxInt = 2 19966 v.AddArg(dst) 19967 v0 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 19968 v0.AuxInt = 2 19969 v0.AddArg(src) 19970 v0.AddArg(mem) 19971 v.AddArg(v0) 19972 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 19973 v1.AddArg(dst) 19974 v2 := b.NewValue0(v.Pos, OpARMMOVHUload, typ.UInt16) 19975 v2.AddArg(src) 19976 v2.AddArg(mem) 19977 v1.AddArg(v2) 19978 v1.AddArg(mem) 19979 v.AddArg(v1) 19980 return true 19981 } 19982 // match: (Move [4] dst src mem) 19983 // cond: 19984 // 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)))) 19985 for { 19986 if v.AuxInt != 4 { 19987 break 19988 } 19989 _ = v.Args[2] 19990 dst := v.Args[0] 19991 src := v.Args[1] 19992 mem := v.Args[2] 19993 v.reset(OpARMMOVBstore) 19994 v.AuxInt = 3 19995 v.AddArg(dst) 19996 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 19997 v0.AuxInt = 3 19998 v0.AddArg(src) 19999 v0.AddArg(mem) 20000 v.AddArg(v0) 20001 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20002 v1.AuxInt = 2 20003 v1.AddArg(dst) 20004 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20005 v2.AuxInt = 2 20006 v2.AddArg(src) 20007 v2.AddArg(mem) 20008 v1.AddArg(v2) 20009 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20010 v3.AuxInt = 1 20011 v3.AddArg(dst) 20012 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20013 v4.AuxInt = 1 20014 v4.AddArg(src) 20015 v4.AddArg(mem) 20016 v3.AddArg(v4) 20017 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20018 v5.AddArg(dst) 20019 v6 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20020 v6.AddArg(src) 20021 v6.AddArg(mem) 20022 v5.AddArg(v6) 20023 v5.AddArg(mem) 20024 v3.AddArg(v5) 20025 v1.AddArg(v3) 20026 v.AddArg(v1) 20027 return true 20028 } 20029 // match: (Move [3] dst src mem) 20030 // cond: 20031 // result: (MOVBstore [2] dst (MOVBUload [2] src mem) (MOVBstore [1] dst (MOVBUload [1] src mem) (MOVBstore dst (MOVBUload src mem) mem))) 20032 for { 20033 if v.AuxInt != 3 { 20034 break 20035 } 20036 _ = v.Args[2] 20037 dst := v.Args[0] 20038 src := v.Args[1] 20039 mem := v.Args[2] 20040 v.reset(OpARMMOVBstore) 20041 v.AuxInt = 2 20042 v.AddArg(dst) 20043 v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20044 v0.AuxInt = 2 20045 v0.AddArg(src) 20046 v0.AddArg(mem) 20047 v.AddArg(v0) 20048 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20049 v1.AuxInt = 1 20050 v1.AddArg(dst) 20051 v2 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20052 v2.AuxInt = 1 20053 v2.AddArg(src) 20054 v2.AddArg(mem) 20055 v1.AddArg(v2) 20056 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 20057 v3.AddArg(dst) 20058 v4 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) 20059 v4.AddArg(src) 20060 v4.AddArg(mem) 20061 v3.AddArg(v4) 20062 v3.AddArg(mem) 20063 v1.AddArg(v3) 20064 v.AddArg(v1) 20065 return true 20066 } 20067 // match: (Move [s] {t} dst src mem) 20068 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 20069 // result: (DUFFCOPY [8 * (128 - int64(s/4))] dst src mem) 20070 for { 20071 s := v.AuxInt 20072 t := v.Aux 20073 _ = v.Args[2] 20074 dst := v.Args[0] 20075 src := v.Args[1] 20076 mem := v.Args[2] 20077 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 20078 break 20079 } 20080 v.reset(OpARMDUFFCOPY) 20081 v.AuxInt = 8 * (128 - int64(s/4)) 20082 v.AddArg(dst) 20083 v.AddArg(src) 20084 v.AddArg(mem) 20085 return true 20086 } 20087 // match: (Move [s] {t} dst src mem) 20088 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 20089 // result: (LoweredMove [t.(*types.Type).Alignment()] dst src (ADDconst <src.Type> src [s-moveSize(t.(*types.Type).Alignment(), config)]) mem) 20090 for { 20091 s := v.AuxInt 20092 t := v.Aux 20093 _ = v.Args[2] 20094 dst := v.Args[0] 20095 src := v.Args[1] 20096 mem := v.Args[2] 20097 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 20098 break 20099 } 20100 v.reset(OpARMLoweredMove) 20101 v.AuxInt = t.(*types.Type).Alignment() 20102 v.AddArg(dst) 20103 v.AddArg(src) 20104 v0 := b.NewValue0(v.Pos, OpARMADDconst, src.Type) 20105 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 20106 v0.AddArg(src) 20107 v.AddArg(v0) 20108 v.AddArg(mem) 20109 return true 20110 } 20111 return false 20112 } 20113 func rewriteValueARM_OpMul16_0(v *Value) bool { 20114 // match: (Mul16 x y) 20115 // cond: 20116 // result: (MUL x y) 20117 for { 20118 _ = v.Args[1] 20119 x := v.Args[0] 20120 y := v.Args[1] 20121 v.reset(OpARMMUL) 20122 v.AddArg(x) 20123 v.AddArg(y) 20124 return true 20125 } 20126 } 20127 func rewriteValueARM_OpMul32_0(v *Value) bool { 20128 // match: (Mul32 x y) 20129 // cond: 20130 // result: (MUL x y) 20131 for { 20132 _ = v.Args[1] 20133 x := v.Args[0] 20134 y := v.Args[1] 20135 v.reset(OpARMMUL) 20136 v.AddArg(x) 20137 v.AddArg(y) 20138 return true 20139 } 20140 } 20141 func rewriteValueARM_OpMul32F_0(v *Value) bool { 20142 // match: (Mul32F x y) 20143 // cond: 20144 // result: (MULF x y) 20145 for { 20146 _ = v.Args[1] 20147 x := v.Args[0] 20148 y := v.Args[1] 20149 v.reset(OpARMMULF) 20150 v.AddArg(x) 20151 v.AddArg(y) 20152 return true 20153 } 20154 } 20155 func rewriteValueARM_OpMul32uhilo_0(v *Value) bool { 20156 // match: (Mul32uhilo x y) 20157 // cond: 20158 // result: (MULLU x y) 20159 for { 20160 _ = v.Args[1] 20161 x := v.Args[0] 20162 y := v.Args[1] 20163 v.reset(OpARMMULLU) 20164 v.AddArg(x) 20165 v.AddArg(y) 20166 return true 20167 } 20168 } 20169 func rewriteValueARM_OpMul64F_0(v *Value) bool { 20170 // match: (Mul64F x y) 20171 // cond: 20172 // result: (MULD x y) 20173 for { 20174 _ = v.Args[1] 20175 x := v.Args[0] 20176 y := v.Args[1] 20177 v.reset(OpARMMULD) 20178 v.AddArg(x) 20179 v.AddArg(y) 20180 return true 20181 } 20182 } 20183 func rewriteValueARM_OpMul8_0(v *Value) bool { 20184 // match: (Mul8 x y) 20185 // cond: 20186 // result: (MUL x y) 20187 for { 20188 _ = v.Args[1] 20189 x := v.Args[0] 20190 y := v.Args[1] 20191 v.reset(OpARMMUL) 20192 v.AddArg(x) 20193 v.AddArg(y) 20194 return true 20195 } 20196 } 20197 func rewriteValueARM_OpNeg16_0(v *Value) bool { 20198 // match: (Neg16 x) 20199 // cond: 20200 // result: (RSBconst [0] x) 20201 for { 20202 x := v.Args[0] 20203 v.reset(OpARMRSBconst) 20204 v.AuxInt = 0 20205 v.AddArg(x) 20206 return true 20207 } 20208 } 20209 func rewriteValueARM_OpNeg32_0(v *Value) bool { 20210 // match: (Neg32 x) 20211 // cond: 20212 // result: (RSBconst [0] x) 20213 for { 20214 x := v.Args[0] 20215 v.reset(OpARMRSBconst) 20216 v.AuxInt = 0 20217 v.AddArg(x) 20218 return true 20219 } 20220 } 20221 func rewriteValueARM_OpNeg32F_0(v *Value) bool { 20222 // match: (Neg32F x) 20223 // cond: 20224 // result: (NEGF x) 20225 for { 20226 x := v.Args[0] 20227 v.reset(OpARMNEGF) 20228 v.AddArg(x) 20229 return true 20230 } 20231 } 20232 func rewriteValueARM_OpNeg64F_0(v *Value) bool { 20233 // match: (Neg64F x) 20234 // cond: 20235 // result: (NEGD x) 20236 for { 20237 x := v.Args[0] 20238 v.reset(OpARMNEGD) 20239 v.AddArg(x) 20240 return true 20241 } 20242 } 20243 func rewriteValueARM_OpNeg8_0(v *Value) bool { 20244 // match: (Neg8 x) 20245 // cond: 20246 // result: (RSBconst [0] x) 20247 for { 20248 x := v.Args[0] 20249 v.reset(OpARMRSBconst) 20250 v.AuxInt = 0 20251 v.AddArg(x) 20252 return true 20253 } 20254 } 20255 func rewriteValueARM_OpNeq16_0(v *Value) bool { 20256 b := v.Block 20257 _ = b 20258 typ := &b.Func.Config.Types 20259 _ = typ 20260 // match: (Neq16 x y) 20261 // cond: 20262 // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) 20263 for { 20264 _ = v.Args[1] 20265 x := v.Args[0] 20266 y := v.Args[1] 20267 v.reset(OpARMNotEqual) 20268 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20269 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20270 v1.AddArg(x) 20271 v0.AddArg(v1) 20272 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20273 v2.AddArg(y) 20274 v0.AddArg(v2) 20275 v.AddArg(v0) 20276 return true 20277 } 20278 } 20279 func rewriteValueARM_OpNeq32_0(v *Value) bool { 20280 b := v.Block 20281 _ = b 20282 // match: (Neq32 x y) 20283 // cond: 20284 // result: (NotEqual (CMP x y)) 20285 for { 20286 _ = v.Args[1] 20287 x := v.Args[0] 20288 y := v.Args[1] 20289 v.reset(OpARMNotEqual) 20290 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20291 v0.AddArg(x) 20292 v0.AddArg(y) 20293 v.AddArg(v0) 20294 return true 20295 } 20296 } 20297 func rewriteValueARM_OpNeq32F_0(v *Value) bool { 20298 b := v.Block 20299 _ = b 20300 // match: (Neq32F x y) 20301 // cond: 20302 // result: (NotEqual (CMPF x y)) 20303 for { 20304 _ = v.Args[1] 20305 x := v.Args[0] 20306 y := v.Args[1] 20307 v.reset(OpARMNotEqual) 20308 v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) 20309 v0.AddArg(x) 20310 v0.AddArg(y) 20311 v.AddArg(v0) 20312 return true 20313 } 20314 } 20315 func rewriteValueARM_OpNeq64F_0(v *Value) bool { 20316 b := v.Block 20317 _ = b 20318 // match: (Neq64F x y) 20319 // cond: 20320 // result: (NotEqual (CMPD x y)) 20321 for { 20322 _ = v.Args[1] 20323 x := v.Args[0] 20324 y := v.Args[1] 20325 v.reset(OpARMNotEqual) 20326 v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) 20327 v0.AddArg(x) 20328 v0.AddArg(y) 20329 v.AddArg(v0) 20330 return true 20331 } 20332 } 20333 func rewriteValueARM_OpNeq8_0(v *Value) bool { 20334 b := v.Block 20335 _ = b 20336 typ := &b.Func.Config.Types 20337 _ = typ 20338 // match: (Neq8 x y) 20339 // cond: 20340 // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) 20341 for { 20342 _ = v.Args[1] 20343 x := v.Args[0] 20344 y := v.Args[1] 20345 v.reset(OpARMNotEqual) 20346 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20347 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20348 v1.AddArg(x) 20349 v0.AddArg(v1) 20350 v2 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20351 v2.AddArg(y) 20352 v0.AddArg(v2) 20353 v.AddArg(v0) 20354 return true 20355 } 20356 } 20357 func rewriteValueARM_OpNeqB_0(v *Value) bool { 20358 // match: (NeqB x y) 20359 // cond: 20360 // result: (XOR x y) 20361 for { 20362 _ = v.Args[1] 20363 x := v.Args[0] 20364 y := v.Args[1] 20365 v.reset(OpARMXOR) 20366 v.AddArg(x) 20367 v.AddArg(y) 20368 return true 20369 } 20370 } 20371 func rewriteValueARM_OpNeqPtr_0(v *Value) bool { 20372 b := v.Block 20373 _ = b 20374 // match: (NeqPtr x y) 20375 // cond: 20376 // result: (NotEqual (CMP x y)) 20377 for { 20378 _ = v.Args[1] 20379 x := v.Args[0] 20380 y := v.Args[1] 20381 v.reset(OpARMNotEqual) 20382 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 20383 v0.AddArg(x) 20384 v0.AddArg(y) 20385 v.AddArg(v0) 20386 return true 20387 } 20388 } 20389 func rewriteValueARM_OpNilCheck_0(v *Value) bool { 20390 // match: (NilCheck ptr mem) 20391 // cond: 20392 // result: (LoweredNilCheck ptr mem) 20393 for { 20394 _ = v.Args[1] 20395 ptr := v.Args[0] 20396 mem := v.Args[1] 20397 v.reset(OpARMLoweredNilCheck) 20398 v.AddArg(ptr) 20399 v.AddArg(mem) 20400 return true 20401 } 20402 } 20403 func rewriteValueARM_OpNot_0(v *Value) bool { 20404 // match: (Not x) 20405 // cond: 20406 // result: (XORconst [1] x) 20407 for { 20408 x := v.Args[0] 20409 v.reset(OpARMXORconst) 20410 v.AuxInt = 1 20411 v.AddArg(x) 20412 return true 20413 } 20414 } 20415 func rewriteValueARM_OpOffPtr_0(v *Value) bool { 20416 // match: (OffPtr [off] ptr:(SP)) 20417 // cond: 20418 // result: (MOVWaddr [off] ptr) 20419 for { 20420 off := v.AuxInt 20421 ptr := v.Args[0] 20422 if ptr.Op != OpSP { 20423 break 20424 } 20425 v.reset(OpARMMOVWaddr) 20426 v.AuxInt = off 20427 v.AddArg(ptr) 20428 return true 20429 } 20430 // match: (OffPtr [off] ptr) 20431 // cond: 20432 // result: (ADDconst [off] ptr) 20433 for { 20434 off := v.AuxInt 20435 ptr := v.Args[0] 20436 v.reset(OpARMADDconst) 20437 v.AuxInt = off 20438 v.AddArg(ptr) 20439 return true 20440 } 20441 } 20442 func rewriteValueARM_OpOr16_0(v *Value) bool { 20443 // match: (Or16 x y) 20444 // cond: 20445 // result: (OR x y) 20446 for { 20447 _ = v.Args[1] 20448 x := v.Args[0] 20449 y := v.Args[1] 20450 v.reset(OpARMOR) 20451 v.AddArg(x) 20452 v.AddArg(y) 20453 return true 20454 } 20455 } 20456 func rewriteValueARM_OpOr32_0(v *Value) bool { 20457 // match: (Or32 x y) 20458 // cond: 20459 // result: (OR x y) 20460 for { 20461 _ = v.Args[1] 20462 x := v.Args[0] 20463 y := v.Args[1] 20464 v.reset(OpARMOR) 20465 v.AddArg(x) 20466 v.AddArg(y) 20467 return true 20468 } 20469 } 20470 func rewriteValueARM_OpOr8_0(v *Value) bool { 20471 // match: (Or8 x y) 20472 // cond: 20473 // result: (OR x y) 20474 for { 20475 _ = v.Args[1] 20476 x := v.Args[0] 20477 y := v.Args[1] 20478 v.reset(OpARMOR) 20479 v.AddArg(x) 20480 v.AddArg(y) 20481 return true 20482 } 20483 } 20484 func rewriteValueARM_OpOrB_0(v *Value) bool { 20485 // match: (OrB x y) 20486 // cond: 20487 // result: (OR x y) 20488 for { 20489 _ = v.Args[1] 20490 x := v.Args[0] 20491 y := v.Args[1] 20492 v.reset(OpARMOR) 20493 v.AddArg(x) 20494 v.AddArg(y) 20495 return true 20496 } 20497 } 20498 func rewriteValueARM_OpRound32F_0(v *Value) bool { 20499 // match: (Round32F x) 20500 // cond: 20501 // result: x 20502 for { 20503 x := v.Args[0] 20504 v.reset(OpCopy) 20505 v.Type = x.Type 20506 v.AddArg(x) 20507 return true 20508 } 20509 } 20510 func rewriteValueARM_OpRound64F_0(v *Value) bool { 20511 // match: (Round64F x) 20512 // cond: 20513 // result: x 20514 for { 20515 x := v.Args[0] 20516 v.reset(OpCopy) 20517 v.Type = x.Type 20518 v.AddArg(x) 20519 return true 20520 } 20521 } 20522 func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { 20523 b := v.Block 20524 _ = b 20525 typ := &b.Func.Config.Types 20526 _ = typ 20527 // match: (Rsh16Ux16 x y) 20528 // cond: 20529 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 20530 for { 20531 _ = v.Args[1] 20532 x := v.Args[0] 20533 y := v.Args[1] 20534 v.reset(OpARMCMOVWHSconst) 20535 v.AuxInt = 0 20536 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20537 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20538 v1.AddArg(x) 20539 v0.AddArg(v1) 20540 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20541 v2.AddArg(y) 20542 v0.AddArg(v2) 20543 v.AddArg(v0) 20544 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20545 v3.AuxInt = 256 20546 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20547 v4.AddArg(y) 20548 v3.AddArg(v4) 20549 v.AddArg(v3) 20550 return true 20551 } 20552 } 20553 func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { 20554 b := v.Block 20555 _ = b 20556 typ := &b.Func.Config.Types 20557 _ = typ 20558 // match: (Rsh16Ux32 x y) 20559 // cond: 20560 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) 20561 for { 20562 _ = v.Args[1] 20563 x := v.Args[0] 20564 y := v.Args[1] 20565 v.reset(OpARMCMOVWHSconst) 20566 v.AuxInt = 0 20567 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20568 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20569 v1.AddArg(x) 20570 v0.AddArg(v1) 20571 v0.AddArg(y) 20572 v.AddArg(v0) 20573 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20574 v2.AuxInt = 256 20575 v2.AddArg(y) 20576 v.AddArg(v2) 20577 return true 20578 } 20579 } 20580 func rewriteValueARM_OpRsh16Ux64_0(v *Value) bool { 20581 b := v.Block 20582 _ = b 20583 typ := &b.Func.Config.Types 20584 _ = typ 20585 // match: (Rsh16Ux64 x (Const64 [c])) 20586 // cond: uint64(c) < 16 20587 // result: (SRLconst (SLLconst <typ.UInt32> x [16]) [c+16]) 20588 for { 20589 _ = v.Args[1] 20590 x := v.Args[0] 20591 v_1 := v.Args[1] 20592 if v_1.Op != OpConst64 { 20593 break 20594 } 20595 c := v_1.AuxInt 20596 if !(uint64(c) < 16) { 20597 break 20598 } 20599 v.reset(OpARMSRLconst) 20600 v.AuxInt = c + 16 20601 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20602 v0.AuxInt = 16 20603 v0.AddArg(x) 20604 v.AddArg(v0) 20605 return true 20606 } 20607 // match: (Rsh16Ux64 _ (Const64 [c])) 20608 // cond: uint64(c) >= 16 20609 // result: (Const16 [0]) 20610 for { 20611 _ = v.Args[1] 20612 v_1 := v.Args[1] 20613 if v_1.Op != OpConst64 { 20614 break 20615 } 20616 c := v_1.AuxInt 20617 if !(uint64(c) >= 16) { 20618 break 20619 } 20620 v.reset(OpConst16) 20621 v.AuxInt = 0 20622 return true 20623 } 20624 return false 20625 } 20626 func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { 20627 b := v.Block 20628 _ = b 20629 typ := &b.Func.Config.Types 20630 _ = typ 20631 // match: (Rsh16Ux8 x y) 20632 // cond: 20633 // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) 20634 for { 20635 _ = v.Args[1] 20636 x := v.Args[0] 20637 y := v.Args[1] 20638 v.reset(OpARMSRL) 20639 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20640 v0.AddArg(x) 20641 v.AddArg(v0) 20642 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20643 v1.AddArg(y) 20644 v.AddArg(v1) 20645 return true 20646 } 20647 } 20648 func rewriteValueARM_OpRsh16x16_0(v *Value) bool { 20649 b := v.Block 20650 _ = b 20651 typ := &b.Func.Config.Types 20652 _ = typ 20653 // match: (Rsh16x16 x y) 20654 // cond: 20655 // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 20656 for { 20657 _ = v.Args[1] 20658 x := v.Args[0] 20659 y := v.Args[1] 20660 v.reset(OpARMSRAcond) 20661 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20662 v0.AddArg(x) 20663 v.AddArg(v0) 20664 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20665 v1.AddArg(y) 20666 v.AddArg(v1) 20667 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20668 v2.AuxInt = 256 20669 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20670 v3.AddArg(y) 20671 v2.AddArg(v3) 20672 v.AddArg(v2) 20673 return true 20674 } 20675 } 20676 func rewriteValueARM_OpRsh16x32_0(v *Value) bool { 20677 b := v.Block 20678 _ = b 20679 typ := &b.Func.Config.Types 20680 _ = typ 20681 // match: (Rsh16x32 x y) 20682 // cond: 20683 // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) 20684 for { 20685 _ = v.Args[1] 20686 x := v.Args[0] 20687 y := v.Args[1] 20688 v.reset(OpARMSRAcond) 20689 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20690 v0.AddArg(x) 20691 v.AddArg(v0) 20692 v.AddArg(y) 20693 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20694 v1.AuxInt = 256 20695 v1.AddArg(y) 20696 v.AddArg(v1) 20697 return true 20698 } 20699 } 20700 func rewriteValueARM_OpRsh16x64_0(v *Value) bool { 20701 b := v.Block 20702 _ = b 20703 typ := &b.Func.Config.Types 20704 _ = typ 20705 // match: (Rsh16x64 x (Const64 [c])) 20706 // cond: uint64(c) < 16 20707 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [c+16]) 20708 for { 20709 _ = v.Args[1] 20710 x := v.Args[0] 20711 v_1 := v.Args[1] 20712 if v_1.Op != OpConst64 { 20713 break 20714 } 20715 c := v_1.AuxInt 20716 if !(uint64(c) < 16) { 20717 break 20718 } 20719 v.reset(OpARMSRAconst) 20720 v.AuxInt = c + 16 20721 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20722 v0.AuxInt = 16 20723 v0.AddArg(x) 20724 v.AddArg(v0) 20725 return true 20726 } 20727 // match: (Rsh16x64 x (Const64 [c])) 20728 // cond: uint64(c) >= 16 20729 // result: (SRAconst (SLLconst <typ.UInt32> x [16]) [31]) 20730 for { 20731 _ = v.Args[1] 20732 x := v.Args[0] 20733 v_1 := v.Args[1] 20734 if v_1.Op != OpConst64 { 20735 break 20736 } 20737 c := v_1.AuxInt 20738 if !(uint64(c) >= 16) { 20739 break 20740 } 20741 v.reset(OpARMSRAconst) 20742 v.AuxInt = 31 20743 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 20744 v0.AuxInt = 16 20745 v0.AddArg(x) 20746 v.AddArg(v0) 20747 return true 20748 } 20749 return false 20750 } 20751 func rewriteValueARM_OpRsh16x8_0(v *Value) bool { 20752 b := v.Block 20753 _ = b 20754 typ := &b.Func.Config.Types 20755 _ = typ 20756 // match: (Rsh16x8 x y) 20757 // cond: 20758 // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) 20759 for { 20760 _ = v.Args[1] 20761 x := v.Args[0] 20762 y := v.Args[1] 20763 v.reset(OpARMSRA) 20764 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 20765 v0.AddArg(x) 20766 v.AddArg(v0) 20767 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20768 v1.AddArg(y) 20769 v.AddArg(v1) 20770 return true 20771 } 20772 } 20773 func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { 20774 b := v.Block 20775 _ = b 20776 typ := &b.Func.Config.Types 20777 _ = typ 20778 // match: (Rsh32Ux16 x y) 20779 // cond: 20780 // result: (CMOVWHSconst (SRL <x.Type> x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 20781 for { 20782 _ = v.Args[1] 20783 x := v.Args[0] 20784 y := v.Args[1] 20785 v.reset(OpARMCMOVWHSconst) 20786 v.AuxInt = 0 20787 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20788 v0.AddArg(x) 20789 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20790 v1.AddArg(y) 20791 v0.AddArg(v1) 20792 v.AddArg(v0) 20793 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20794 v2.AuxInt = 256 20795 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20796 v3.AddArg(y) 20797 v2.AddArg(v3) 20798 v.AddArg(v2) 20799 return true 20800 } 20801 } 20802 func rewriteValueARM_OpRsh32Ux32_0(v *Value) bool { 20803 b := v.Block 20804 _ = b 20805 // match: (Rsh32Ux32 x y) 20806 // cond: 20807 // result: (CMOVWHSconst (SRL <x.Type> x y) (CMPconst [256] y) [0]) 20808 for { 20809 _ = v.Args[1] 20810 x := v.Args[0] 20811 y := v.Args[1] 20812 v.reset(OpARMCMOVWHSconst) 20813 v.AuxInt = 0 20814 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 20815 v0.AddArg(x) 20816 v0.AddArg(y) 20817 v.AddArg(v0) 20818 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20819 v1.AuxInt = 256 20820 v1.AddArg(y) 20821 v.AddArg(v1) 20822 return true 20823 } 20824 } 20825 func rewriteValueARM_OpRsh32Ux64_0(v *Value) bool { 20826 // match: (Rsh32Ux64 x (Const64 [c])) 20827 // cond: uint64(c) < 32 20828 // result: (SRLconst x [c]) 20829 for { 20830 _ = v.Args[1] 20831 x := v.Args[0] 20832 v_1 := v.Args[1] 20833 if v_1.Op != OpConst64 { 20834 break 20835 } 20836 c := v_1.AuxInt 20837 if !(uint64(c) < 32) { 20838 break 20839 } 20840 v.reset(OpARMSRLconst) 20841 v.AuxInt = c 20842 v.AddArg(x) 20843 return true 20844 } 20845 // match: (Rsh32Ux64 _ (Const64 [c])) 20846 // cond: uint64(c) >= 32 20847 // result: (Const32 [0]) 20848 for { 20849 _ = v.Args[1] 20850 v_1 := v.Args[1] 20851 if v_1.Op != OpConst64 { 20852 break 20853 } 20854 c := v_1.AuxInt 20855 if !(uint64(c) >= 32) { 20856 break 20857 } 20858 v.reset(OpConst32) 20859 v.AuxInt = 0 20860 return true 20861 } 20862 return false 20863 } 20864 func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { 20865 b := v.Block 20866 _ = b 20867 typ := &b.Func.Config.Types 20868 _ = typ 20869 // match: (Rsh32Ux8 x y) 20870 // cond: 20871 // result: (SRL x (ZeroExt8to32 y)) 20872 for { 20873 _ = v.Args[1] 20874 x := v.Args[0] 20875 y := v.Args[1] 20876 v.reset(OpARMSRL) 20877 v.AddArg(x) 20878 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20879 v0.AddArg(y) 20880 v.AddArg(v0) 20881 return true 20882 } 20883 } 20884 func rewriteValueARM_OpRsh32x16_0(v *Value) bool { 20885 b := v.Block 20886 _ = b 20887 typ := &b.Func.Config.Types 20888 _ = typ 20889 // match: (Rsh32x16 x y) 20890 // cond: 20891 // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 20892 for { 20893 _ = v.Args[1] 20894 x := v.Args[0] 20895 y := v.Args[1] 20896 v.reset(OpARMSRAcond) 20897 v.AddArg(x) 20898 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20899 v0.AddArg(y) 20900 v.AddArg(v0) 20901 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20902 v1.AuxInt = 256 20903 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 20904 v2.AddArg(y) 20905 v1.AddArg(v2) 20906 v.AddArg(v1) 20907 return true 20908 } 20909 } 20910 func rewriteValueARM_OpRsh32x32_0(v *Value) bool { 20911 b := v.Block 20912 _ = b 20913 // match: (Rsh32x32 x y) 20914 // cond: 20915 // result: (SRAcond x y (CMPconst [256] y)) 20916 for { 20917 _ = v.Args[1] 20918 x := v.Args[0] 20919 y := v.Args[1] 20920 v.reset(OpARMSRAcond) 20921 v.AddArg(x) 20922 v.AddArg(y) 20923 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 20924 v0.AuxInt = 256 20925 v0.AddArg(y) 20926 v.AddArg(v0) 20927 return true 20928 } 20929 } 20930 func rewriteValueARM_OpRsh32x64_0(v *Value) bool { 20931 // match: (Rsh32x64 x (Const64 [c])) 20932 // cond: uint64(c) < 32 20933 // result: (SRAconst x [c]) 20934 for { 20935 _ = v.Args[1] 20936 x := v.Args[0] 20937 v_1 := v.Args[1] 20938 if v_1.Op != OpConst64 { 20939 break 20940 } 20941 c := v_1.AuxInt 20942 if !(uint64(c) < 32) { 20943 break 20944 } 20945 v.reset(OpARMSRAconst) 20946 v.AuxInt = c 20947 v.AddArg(x) 20948 return true 20949 } 20950 // match: (Rsh32x64 x (Const64 [c])) 20951 // cond: uint64(c) >= 32 20952 // result: (SRAconst x [31]) 20953 for { 20954 _ = v.Args[1] 20955 x := v.Args[0] 20956 v_1 := v.Args[1] 20957 if v_1.Op != OpConst64 { 20958 break 20959 } 20960 c := v_1.AuxInt 20961 if !(uint64(c) >= 32) { 20962 break 20963 } 20964 v.reset(OpARMSRAconst) 20965 v.AuxInt = 31 20966 v.AddArg(x) 20967 return true 20968 } 20969 return false 20970 } 20971 func rewriteValueARM_OpRsh32x8_0(v *Value) bool { 20972 b := v.Block 20973 _ = b 20974 typ := &b.Func.Config.Types 20975 _ = typ 20976 // match: (Rsh32x8 x y) 20977 // cond: 20978 // result: (SRA x (ZeroExt8to32 y)) 20979 for { 20980 _ = v.Args[1] 20981 x := v.Args[0] 20982 y := v.Args[1] 20983 v.reset(OpARMSRA) 20984 v.AddArg(x) 20985 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 20986 v0.AddArg(y) 20987 v.AddArg(v0) 20988 return true 20989 } 20990 } 20991 func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { 20992 b := v.Block 20993 _ = b 20994 typ := &b.Func.Config.Types 20995 _ = typ 20996 // match: (Rsh8Ux16 x y) 20997 // cond: 20998 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) 20999 for { 21000 _ = v.Args[1] 21001 x := v.Args[0] 21002 y := v.Args[1] 21003 v.reset(OpARMCMOVWHSconst) 21004 v.AuxInt = 0 21005 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 21006 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21007 v1.AddArg(x) 21008 v0.AddArg(v1) 21009 v2 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21010 v2.AddArg(y) 21011 v0.AddArg(v2) 21012 v.AddArg(v0) 21013 v3 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21014 v3.AuxInt = 256 21015 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21016 v4.AddArg(y) 21017 v3.AddArg(v4) 21018 v.AddArg(v3) 21019 return true 21020 } 21021 } 21022 func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { 21023 b := v.Block 21024 _ = b 21025 typ := &b.Func.Config.Types 21026 _ = typ 21027 // match: (Rsh8Ux32 x y) 21028 // cond: 21029 // result: (CMOVWHSconst (SRL <x.Type> (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) 21030 for { 21031 _ = v.Args[1] 21032 x := v.Args[0] 21033 y := v.Args[1] 21034 v.reset(OpARMCMOVWHSconst) 21035 v.AuxInt = 0 21036 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) 21037 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21038 v1.AddArg(x) 21039 v0.AddArg(v1) 21040 v0.AddArg(y) 21041 v.AddArg(v0) 21042 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21043 v2.AuxInt = 256 21044 v2.AddArg(y) 21045 v.AddArg(v2) 21046 return true 21047 } 21048 } 21049 func rewriteValueARM_OpRsh8Ux64_0(v *Value) bool { 21050 b := v.Block 21051 _ = b 21052 typ := &b.Func.Config.Types 21053 _ = typ 21054 // match: (Rsh8Ux64 x (Const64 [c])) 21055 // cond: uint64(c) < 8 21056 // result: (SRLconst (SLLconst <typ.UInt32> x [24]) [c+24]) 21057 for { 21058 _ = v.Args[1] 21059 x := v.Args[0] 21060 v_1 := v.Args[1] 21061 if v_1.Op != OpConst64 { 21062 break 21063 } 21064 c := v_1.AuxInt 21065 if !(uint64(c) < 8) { 21066 break 21067 } 21068 v.reset(OpARMSRLconst) 21069 v.AuxInt = c + 24 21070 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21071 v0.AuxInt = 24 21072 v0.AddArg(x) 21073 v.AddArg(v0) 21074 return true 21075 } 21076 // match: (Rsh8Ux64 _ (Const64 [c])) 21077 // cond: uint64(c) >= 8 21078 // result: (Const8 [0]) 21079 for { 21080 _ = v.Args[1] 21081 v_1 := v.Args[1] 21082 if v_1.Op != OpConst64 { 21083 break 21084 } 21085 c := v_1.AuxInt 21086 if !(uint64(c) >= 8) { 21087 break 21088 } 21089 v.reset(OpConst8) 21090 v.AuxInt = 0 21091 return true 21092 } 21093 return false 21094 } 21095 func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { 21096 b := v.Block 21097 _ = b 21098 typ := &b.Func.Config.Types 21099 _ = typ 21100 // match: (Rsh8Ux8 x y) 21101 // cond: 21102 // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) 21103 for { 21104 _ = v.Args[1] 21105 x := v.Args[0] 21106 y := v.Args[1] 21107 v.reset(OpARMSRL) 21108 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21109 v0.AddArg(x) 21110 v.AddArg(v0) 21111 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21112 v1.AddArg(y) 21113 v.AddArg(v1) 21114 return true 21115 } 21116 } 21117 func rewriteValueARM_OpRsh8x16_0(v *Value) bool { 21118 b := v.Block 21119 _ = b 21120 typ := &b.Func.Config.Types 21121 _ = typ 21122 // match: (Rsh8x16 x y) 21123 // cond: 21124 // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) 21125 for { 21126 _ = v.Args[1] 21127 x := v.Args[0] 21128 y := v.Args[1] 21129 v.reset(OpARMSRAcond) 21130 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21131 v0.AddArg(x) 21132 v.AddArg(v0) 21133 v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21134 v1.AddArg(y) 21135 v.AddArg(v1) 21136 v2 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21137 v2.AuxInt = 256 21138 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 21139 v3.AddArg(y) 21140 v2.AddArg(v3) 21141 v.AddArg(v2) 21142 return true 21143 } 21144 } 21145 func rewriteValueARM_OpRsh8x32_0(v *Value) bool { 21146 b := v.Block 21147 _ = b 21148 typ := &b.Func.Config.Types 21149 _ = typ 21150 // match: (Rsh8x32 x y) 21151 // cond: 21152 // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) 21153 for { 21154 _ = v.Args[1] 21155 x := v.Args[0] 21156 y := v.Args[1] 21157 v.reset(OpARMSRAcond) 21158 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21159 v0.AddArg(x) 21160 v.AddArg(v0) 21161 v.AddArg(y) 21162 v1 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 21163 v1.AuxInt = 256 21164 v1.AddArg(y) 21165 v.AddArg(v1) 21166 return true 21167 } 21168 } 21169 func rewriteValueARM_OpRsh8x64_0(v *Value) bool { 21170 b := v.Block 21171 _ = b 21172 typ := &b.Func.Config.Types 21173 _ = typ 21174 // match: (Rsh8x64 x (Const64 [c])) 21175 // cond: uint64(c) < 8 21176 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [c+24]) 21177 for { 21178 _ = v.Args[1] 21179 x := v.Args[0] 21180 v_1 := v.Args[1] 21181 if v_1.Op != OpConst64 { 21182 break 21183 } 21184 c := v_1.AuxInt 21185 if !(uint64(c) < 8) { 21186 break 21187 } 21188 v.reset(OpARMSRAconst) 21189 v.AuxInt = c + 24 21190 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21191 v0.AuxInt = 24 21192 v0.AddArg(x) 21193 v.AddArg(v0) 21194 return true 21195 } 21196 // match: (Rsh8x64 x (Const64 [c])) 21197 // cond: uint64(c) >= 8 21198 // result: (SRAconst (SLLconst <typ.UInt32> x [24]) [31]) 21199 for { 21200 _ = v.Args[1] 21201 x := v.Args[0] 21202 v_1 := v.Args[1] 21203 if v_1.Op != OpConst64 { 21204 break 21205 } 21206 c := v_1.AuxInt 21207 if !(uint64(c) >= 8) { 21208 break 21209 } 21210 v.reset(OpARMSRAconst) 21211 v.AuxInt = 31 21212 v0 := b.NewValue0(v.Pos, OpARMSLLconst, typ.UInt32) 21213 v0.AuxInt = 24 21214 v0.AddArg(x) 21215 v.AddArg(v0) 21216 return true 21217 } 21218 return false 21219 } 21220 func rewriteValueARM_OpRsh8x8_0(v *Value) bool { 21221 b := v.Block 21222 _ = b 21223 typ := &b.Func.Config.Types 21224 _ = typ 21225 // match: (Rsh8x8 x y) 21226 // cond: 21227 // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) 21228 for { 21229 _ = v.Args[1] 21230 x := v.Args[0] 21231 y := v.Args[1] 21232 v.reset(OpARMSRA) 21233 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 21234 v0.AddArg(x) 21235 v.AddArg(v0) 21236 v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 21237 v1.AddArg(y) 21238 v.AddArg(v1) 21239 return true 21240 } 21241 } 21242 func rewriteValueARM_OpSelect0_0(v *Value) bool { 21243 // match: (Select0 (CALLudiv x (MOVWconst [1]))) 21244 // cond: 21245 // result: x 21246 for { 21247 v_0 := v.Args[0] 21248 if v_0.Op != OpARMCALLudiv { 21249 break 21250 } 21251 _ = v_0.Args[1] 21252 x := v_0.Args[0] 21253 v_0_1 := v_0.Args[1] 21254 if v_0_1.Op != OpARMMOVWconst { 21255 break 21256 } 21257 if v_0_1.AuxInt != 1 { 21258 break 21259 } 21260 v.reset(OpCopy) 21261 v.Type = x.Type 21262 v.AddArg(x) 21263 return true 21264 } 21265 // match: (Select0 (CALLudiv x (MOVWconst [c]))) 21266 // cond: isPowerOfTwo(c) 21267 // result: (SRLconst [log2(c)] x) 21268 for { 21269 v_0 := v.Args[0] 21270 if v_0.Op != OpARMCALLudiv { 21271 break 21272 } 21273 _ = v_0.Args[1] 21274 x := v_0.Args[0] 21275 v_0_1 := v_0.Args[1] 21276 if v_0_1.Op != OpARMMOVWconst { 21277 break 21278 } 21279 c := v_0_1.AuxInt 21280 if !(isPowerOfTwo(c)) { 21281 break 21282 } 21283 v.reset(OpARMSRLconst) 21284 v.AuxInt = log2(c) 21285 v.AddArg(x) 21286 return true 21287 } 21288 // match: (Select0 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 21289 // cond: 21290 // result: (MOVWconst [int64(uint32(c)/uint32(d))]) 21291 for { 21292 v_0 := v.Args[0] 21293 if v_0.Op != OpARMCALLudiv { 21294 break 21295 } 21296 _ = v_0.Args[1] 21297 v_0_0 := v_0.Args[0] 21298 if v_0_0.Op != OpARMMOVWconst { 21299 break 21300 } 21301 c := v_0_0.AuxInt 21302 v_0_1 := v_0.Args[1] 21303 if v_0_1.Op != OpARMMOVWconst { 21304 break 21305 } 21306 d := v_0_1.AuxInt 21307 v.reset(OpARMMOVWconst) 21308 v.AuxInt = int64(uint32(c) / uint32(d)) 21309 return true 21310 } 21311 return false 21312 } 21313 func rewriteValueARM_OpSelect1_0(v *Value) bool { 21314 // match: (Select1 (CALLudiv _ (MOVWconst [1]))) 21315 // cond: 21316 // result: (MOVWconst [0]) 21317 for { 21318 v_0 := v.Args[0] 21319 if v_0.Op != OpARMCALLudiv { 21320 break 21321 } 21322 _ = v_0.Args[1] 21323 v_0_1 := v_0.Args[1] 21324 if v_0_1.Op != OpARMMOVWconst { 21325 break 21326 } 21327 if v_0_1.AuxInt != 1 { 21328 break 21329 } 21330 v.reset(OpARMMOVWconst) 21331 v.AuxInt = 0 21332 return true 21333 } 21334 // match: (Select1 (CALLudiv x (MOVWconst [c]))) 21335 // cond: isPowerOfTwo(c) 21336 // result: (ANDconst [c-1] x) 21337 for { 21338 v_0 := v.Args[0] 21339 if v_0.Op != OpARMCALLudiv { 21340 break 21341 } 21342 _ = v_0.Args[1] 21343 x := v_0.Args[0] 21344 v_0_1 := v_0.Args[1] 21345 if v_0_1.Op != OpARMMOVWconst { 21346 break 21347 } 21348 c := v_0_1.AuxInt 21349 if !(isPowerOfTwo(c)) { 21350 break 21351 } 21352 v.reset(OpARMANDconst) 21353 v.AuxInt = c - 1 21354 v.AddArg(x) 21355 return true 21356 } 21357 // match: (Select1 (CALLudiv (MOVWconst [c]) (MOVWconst [d]))) 21358 // cond: 21359 // result: (MOVWconst [int64(uint32(c)%uint32(d))]) 21360 for { 21361 v_0 := v.Args[0] 21362 if v_0.Op != OpARMCALLudiv { 21363 break 21364 } 21365 _ = v_0.Args[1] 21366 v_0_0 := v_0.Args[0] 21367 if v_0_0.Op != OpARMMOVWconst { 21368 break 21369 } 21370 c := v_0_0.AuxInt 21371 v_0_1 := v_0.Args[1] 21372 if v_0_1.Op != OpARMMOVWconst { 21373 break 21374 } 21375 d := v_0_1.AuxInt 21376 v.reset(OpARMMOVWconst) 21377 v.AuxInt = int64(uint32(c) % uint32(d)) 21378 return true 21379 } 21380 return false 21381 } 21382 func rewriteValueARM_OpSignExt16to32_0(v *Value) bool { 21383 // match: (SignExt16to32 x) 21384 // cond: 21385 // result: (MOVHreg x) 21386 for { 21387 x := v.Args[0] 21388 v.reset(OpARMMOVHreg) 21389 v.AddArg(x) 21390 return true 21391 } 21392 } 21393 func rewriteValueARM_OpSignExt8to16_0(v *Value) bool { 21394 // match: (SignExt8to16 x) 21395 // cond: 21396 // result: (MOVBreg x) 21397 for { 21398 x := v.Args[0] 21399 v.reset(OpARMMOVBreg) 21400 v.AddArg(x) 21401 return true 21402 } 21403 } 21404 func rewriteValueARM_OpSignExt8to32_0(v *Value) bool { 21405 // match: (SignExt8to32 x) 21406 // cond: 21407 // result: (MOVBreg x) 21408 for { 21409 x := v.Args[0] 21410 v.reset(OpARMMOVBreg) 21411 v.AddArg(x) 21412 return true 21413 } 21414 } 21415 func rewriteValueARM_OpSignmask_0(v *Value) bool { 21416 // match: (Signmask x) 21417 // cond: 21418 // result: (SRAconst x [31]) 21419 for { 21420 x := v.Args[0] 21421 v.reset(OpARMSRAconst) 21422 v.AuxInt = 31 21423 v.AddArg(x) 21424 return true 21425 } 21426 } 21427 func rewriteValueARM_OpSlicemask_0(v *Value) bool { 21428 b := v.Block 21429 _ = b 21430 // match: (Slicemask <t> x) 21431 // cond: 21432 // result: (SRAconst (RSBconst <t> [0] x) [31]) 21433 for { 21434 t := v.Type 21435 x := v.Args[0] 21436 v.reset(OpARMSRAconst) 21437 v.AuxInt = 31 21438 v0 := b.NewValue0(v.Pos, OpARMRSBconst, t) 21439 v0.AuxInt = 0 21440 v0.AddArg(x) 21441 v.AddArg(v0) 21442 return true 21443 } 21444 } 21445 func rewriteValueARM_OpSqrt_0(v *Value) bool { 21446 // match: (Sqrt x) 21447 // cond: 21448 // result: (SQRTD x) 21449 for { 21450 x := v.Args[0] 21451 v.reset(OpARMSQRTD) 21452 v.AddArg(x) 21453 return true 21454 } 21455 } 21456 func rewriteValueARM_OpStaticCall_0(v *Value) bool { 21457 // match: (StaticCall [argwid] {target} mem) 21458 // cond: 21459 // result: (CALLstatic [argwid] {target} mem) 21460 for { 21461 argwid := v.AuxInt 21462 target := v.Aux 21463 mem := v.Args[0] 21464 v.reset(OpARMCALLstatic) 21465 v.AuxInt = argwid 21466 v.Aux = target 21467 v.AddArg(mem) 21468 return true 21469 } 21470 } 21471 func rewriteValueARM_OpStore_0(v *Value) bool { 21472 // match: (Store {t} ptr val mem) 21473 // cond: t.(*types.Type).Size() == 1 21474 // result: (MOVBstore ptr val mem) 21475 for { 21476 t := v.Aux 21477 _ = v.Args[2] 21478 ptr := v.Args[0] 21479 val := v.Args[1] 21480 mem := v.Args[2] 21481 if !(t.(*types.Type).Size() == 1) { 21482 break 21483 } 21484 v.reset(OpARMMOVBstore) 21485 v.AddArg(ptr) 21486 v.AddArg(val) 21487 v.AddArg(mem) 21488 return true 21489 } 21490 // match: (Store {t} ptr val mem) 21491 // cond: t.(*types.Type).Size() == 2 21492 // result: (MOVHstore ptr val mem) 21493 for { 21494 t := v.Aux 21495 _ = v.Args[2] 21496 ptr := v.Args[0] 21497 val := v.Args[1] 21498 mem := v.Args[2] 21499 if !(t.(*types.Type).Size() == 2) { 21500 break 21501 } 21502 v.reset(OpARMMOVHstore) 21503 v.AddArg(ptr) 21504 v.AddArg(val) 21505 v.AddArg(mem) 21506 return true 21507 } 21508 // match: (Store {t} ptr val mem) 21509 // cond: t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type) 21510 // result: (MOVWstore ptr val mem) 21511 for { 21512 t := v.Aux 21513 _ = v.Args[2] 21514 ptr := v.Args[0] 21515 val := v.Args[1] 21516 mem := v.Args[2] 21517 if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { 21518 break 21519 } 21520 v.reset(OpARMMOVWstore) 21521 v.AddArg(ptr) 21522 v.AddArg(val) 21523 v.AddArg(mem) 21524 return true 21525 } 21526 // match: (Store {t} ptr val mem) 21527 // cond: t.(*types.Type).Size() == 4 && is32BitFloat(val.Type) 21528 // result: (MOVFstore ptr val mem) 21529 for { 21530 t := v.Aux 21531 _ = v.Args[2] 21532 ptr := v.Args[0] 21533 val := v.Args[1] 21534 mem := v.Args[2] 21535 if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { 21536 break 21537 } 21538 v.reset(OpARMMOVFstore) 21539 v.AddArg(ptr) 21540 v.AddArg(val) 21541 v.AddArg(mem) 21542 return true 21543 } 21544 // match: (Store {t} ptr val mem) 21545 // cond: t.(*types.Type).Size() == 8 && is64BitFloat(val.Type) 21546 // result: (MOVDstore ptr val mem) 21547 for { 21548 t := v.Aux 21549 _ = v.Args[2] 21550 ptr := v.Args[0] 21551 val := v.Args[1] 21552 mem := v.Args[2] 21553 if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { 21554 break 21555 } 21556 v.reset(OpARMMOVDstore) 21557 v.AddArg(ptr) 21558 v.AddArg(val) 21559 v.AddArg(mem) 21560 return true 21561 } 21562 return false 21563 } 21564 func rewriteValueARM_OpSub16_0(v *Value) bool { 21565 // match: (Sub16 x y) 21566 // cond: 21567 // result: (SUB x y) 21568 for { 21569 _ = v.Args[1] 21570 x := v.Args[0] 21571 y := v.Args[1] 21572 v.reset(OpARMSUB) 21573 v.AddArg(x) 21574 v.AddArg(y) 21575 return true 21576 } 21577 } 21578 func rewriteValueARM_OpSub32_0(v *Value) bool { 21579 // match: (Sub32 x y) 21580 // cond: 21581 // result: (SUB x y) 21582 for { 21583 _ = v.Args[1] 21584 x := v.Args[0] 21585 y := v.Args[1] 21586 v.reset(OpARMSUB) 21587 v.AddArg(x) 21588 v.AddArg(y) 21589 return true 21590 } 21591 } 21592 func rewriteValueARM_OpSub32F_0(v *Value) bool { 21593 // match: (Sub32F x y) 21594 // cond: 21595 // result: (SUBF x y) 21596 for { 21597 _ = v.Args[1] 21598 x := v.Args[0] 21599 y := v.Args[1] 21600 v.reset(OpARMSUBF) 21601 v.AddArg(x) 21602 v.AddArg(y) 21603 return true 21604 } 21605 } 21606 func rewriteValueARM_OpSub32carry_0(v *Value) bool { 21607 // match: (Sub32carry x y) 21608 // cond: 21609 // result: (SUBS x y) 21610 for { 21611 _ = v.Args[1] 21612 x := v.Args[0] 21613 y := v.Args[1] 21614 v.reset(OpARMSUBS) 21615 v.AddArg(x) 21616 v.AddArg(y) 21617 return true 21618 } 21619 } 21620 func rewriteValueARM_OpSub32withcarry_0(v *Value) bool { 21621 // match: (Sub32withcarry x y c) 21622 // cond: 21623 // result: (SBC x y c) 21624 for { 21625 _ = v.Args[2] 21626 x := v.Args[0] 21627 y := v.Args[1] 21628 c := v.Args[2] 21629 v.reset(OpARMSBC) 21630 v.AddArg(x) 21631 v.AddArg(y) 21632 v.AddArg(c) 21633 return true 21634 } 21635 } 21636 func rewriteValueARM_OpSub64F_0(v *Value) bool { 21637 // match: (Sub64F x y) 21638 // cond: 21639 // result: (SUBD x y) 21640 for { 21641 _ = v.Args[1] 21642 x := v.Args[0] 21643 y := v.Args[1] 21644 v.reset(OpARMSUBD) 21645 v.AddArg(x) 21646 v.AddArg(y) 21647 return true 21648 } 21649 } 21650 func rewriteValueARM_OpSub8_0(v *Value) bool { 21651 // match: (Sub8 x y) 21652 // cond: 21653 // result: (SUB x y) 21654 for { 21655 _ = v.Args[1] 21656 x := v.Args[0] 21657 y := v.Args[1] 21658 v.reset(OpARMSUB) 21659 v.AddArg(x) 21660 v.AddArg(y) 21661 return true 21662 } 21663 } 21664 func rewriteValueARM_OpSubPtr_0(v *Value) bool { 21665 // match: (SubPtr x y) 21666 // cond: 21667 // result: (SUB x y) 21668 for { 21669 _ = v.Args[1] 21670 x := v.Args[0] 21671 y := v.Args[1] 21672 v.reset(OpARMSUB) 21673 v.AddArg(x) 21674 v.AddArg(y) 21675 return true 21676 } 21677 } 21678 func rewriteValueARM_OpTrunc16to8_0(v *Value) bool { 21679 // match: (Trunc16to8 x) 21680 // cond: 21681 // result: x 21682 for { 21683 x := v.Args[0] 21684 v.reset(OpCopy) 21685 v.Type = x.Type 21686 v.AddArg(x) 21687 return true 21688 } 21689 } 21690 func rewriteValueARM_OpTrunc32to16_0(v *Value) bool { 21691 // match: (Trunc32to16 x) 21692 // cond: 21693 // result: x 21694 for { 21695 x := v.Args[0] 21696 v.reset(OpCopy) 21697 v.Type = x.Type 21698 v.AddArg(x) 21699 return true 21700 } 21701 } 21702 func rewriteValueARM_OpTrunc32to8_0(v *Value) bool { 21703 // match: (Trunc32to8 x) 21704 // cond: 21705 // result: x 21706 for { 21707 x := v.Args[0] 21708 v.reset(OpCopy) 21709 v.Type = x.Type 21710 v.AddArg(x) 21711 return true 21712 } 21713 } 21714 func rewriteValueARM_OpWB_0(v *Value) bool { 21715 // match: (WB {fn} destptr srcptr mem) 21716 // cond: 21717 // result: (LoweredWB {fn} destptr srcptr mem) 21718 for { 21719 fn := v.Aux 21720 _ = v.Args[2] 21721 destptr := v.Args[0] 21722 srcptr := v.Args[1] 21723 mem := v.Args[2] 21724 v.reset(OpARMLoweredWB) 21725 v.Aux = fn 21726 v.AddArg(destptr) 21727 v.AddArg(srcptr) 21728 v.AddArg(mem) 21729 return true 21730 } 21731 } 21732 func rewriteValueARM_OpXor16_0(v *Value) bool { 21733 // match: (Xor16 x y) 21734 // cond: 21735 // result: (XOR x y) 21736 for { 21737 _ = v.Args[1] 21738 x := v.Args[0] 21739 y := v.Args[1] 21740 v.reset(OpARMXOR) 21741 v.AddArg(x) 21742 v.AddArg(y) 21743 return true 21744 } 21745 } 21746 func rewriteValueARM_OpXor32_0(v *Value) bool { 21747 // match: (Xor32 x y) 21748 // cond: 21749 // result: (XOR x y) 21750 for { 21751 _ = v.Args[1] 21752 x := v.Args[0] 21753 y := v.Args[1] 21754 v.reset(OpARMXOR) 21755 v.AddArg(x) 21756 v.AddArg(y) 21757 return true 21758 } 21759 } 21760 func rewriteValueARM_OpXor8_0(v *Value) bool { 21761 // match: (Xor8 x y) 21762 // cond: 21763 // result: (XOR x y) 21764 for { 21765 _ = v.Args[1] 21766 x := v.Args[0] 21767 y := v.Args[1] 21768 v.reset(OpARMXOR) 21769 v.AddArg(x) 21770 v.AddArg(y) 21771 return true 21772 } 21773 } 21774 func rewriteValueARM_OpZero_0(v *Value) bool { 21775 b := v.Block 21776 _ = b 21777 config := b.Func.Config 21778 _ = config 21779 typ := &b.Func.Config.Types 21780 _ = typ 21781 // match: (Zero [0] _ mem) 21782 // cond: 21783 // result: mem 21784 for { 21785 if v.AuxInt != 0 { 21786 break 21787 } 21788 _ = v.Args[1] 21789 mem := v.Args[1] 21790 v.reset(OpCopy) 21791 v.Type = mem.Type 21792 v.AddArg(mem) 21793 return true 21794 } 21795 // match: (Zero [1] ptr mem) 21796 // cond: 21797 // result: (MOVBstore ptr (MOVWconst [0]) mem) 21798 for { 21799 if v.AuxInt != 1 { 21800 break 21801 } 21802 _ = v.Args[1] 21803 ptr := v.Args[0] 21804 mem := v.Args[1] 21805 v.reset(OpARMMOVBstore) 21806 v.AddArg(ptr) 21807 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21808 v0.AuxInt = 0 21809 v.AddArg(v0) 21810 v.AddArg(mem) 21811 return true 21812 } 21813 // match: (Zero [2] {t} ptr mem) 21814 // cond: t.(*types.Type).Alignment()%2 == 0 21815 // result: (MOVHstore ptr (MOVWconst [0]) mem) 21816 for { 21817 if v.AuxInt != 2 { 21818 break 21819 } 21820 t := v.Aux 21821 _ = v.Args[1] 21822 ptr := v.Args[0] 21823 mem := v.Args[1] 21824 if !(t.(*types.Type).Alignment()%2 == 0) { 21825 break 21826 } 21827 v.reset(OpARMMOVHstore) 21828 v.AddArg(ptr) 21829 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21830 v0.AuxInt = 0 21831 v.AddArg(v0) 21832 v.AddArg(mem) 21833 return true 21834 } 21835 // match: (Zero [2] ptr mem) 21836 // cond: 21837 // result: (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)) 21838 for { 21839 if v.AuxInt != 2 { 21840 break 21841 } 21842 _ = v.Args[1] 21843 ptr := v.Args[0] 21844 mem := v.Args[1] 21845 v.reset(OpARMMOVBstore) 21846 v.AuxInt = 1 21847 v.AddArg(ptr) 21848 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21849 v0.AuxInt = 0 21850 v.AddArg(v0) 21851 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21852 v1.AuxInt = 0 21853 v1.AddArg(ptr) 21854 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21855 v2.AuxInt = 0 21856 v1.AddArg(v2) 21857 v1.AddArg(mem) 21858 v.AddArg(v1) 21859 return true 21860 } 21861 // match: (Zero [4] {t} ptr mem) 21862 // cond: t.(*types.Type).Alignment()%4 == 0 21863 // result: (MOVWstore ptr (MOVWconst [0]) mem) 21864 for { 21865 if v.AuxInt != 4 { 21866 break 21867 } 21868 t := v.Aux 21869 _ = v.Args[1] 21870 ptr := v.Args[0] 21871 mem := v.Args[1] 21872 if !(t.(*types.Type).Alignment()%4 == 0) { 21873 break 21874 } 21875 v.reset(OpARMMOVWstore) 21876 v.AddArg(ptr) 21877 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21878 v0.AuxInt = 0 21879 v.AddArg(v0) 21880 v.AddArg(mem) 21881 return true 21882 } 21883 // match: (Zero [4] {t} ptr mem) 21884 // cond: t.(*types.Type).Alignment()%2 == 0 21885 // result: (MOVHstore [2] ptr (MOVWconst [0]) (MOVHstore [0] ptr (MOVWconst [0]) mem)) 21886 for { 21887 if v.AuxInt != 4 { 21888 break 21889 } 21890 t := v.Aux 21891 _ = v.Args[1] 21892 ptr := v.Args[0] 21893 mem := v.Args[1] 21894 if !(t.(*types.Type).Alignment()%2 == 0) { 21895 break 21896 } 21897 v.reset(OpARMMOVHstore) 21898 v.AuxInt = 2 21899 v.AddArg(ptr) 21900 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21901 v0.AuxInt = 0 21902 v.AddArg(v0) 21903 v1 := b.NewValue0(v.Pos, OpARMMOVHstore, types.TypeMem) 21904 v1.AuxInt = 0 21905 v1.AddArg(ptr) 21906 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21907 v2.AuxInt = 0 21908 v1.AddArg(v2) 21909 v1.AddArg(mem) 21910 v.AddArg(v1) 21911 return true 21912 } 21913 // match: (Zero [4] ptr mem) 21914 // cond: 21915 // result: (MOVBstore [3] ptr (MOVWconst [0]) (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem)))) 21916 for { 21917 if v.AuxInt != 4 { 21918 break 21919 } 21920 _ = v.Args[1] 21921 ptr := v.Args[0] 21922 mem := v.Args[1] 21923 v.reset(OpARMMOVBstore) 21924 v.AuxInt = 3 21925 v.AddArg(ptr) 21926 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21927 v0.AuxInt = 0 21928 v.AddArg(v0) 21929 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21930 v1.AuxInt = 2 21931 v1.AddArg(ptr) 21932 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21933 v2.AuxInt = 0 21934 v1.AddArg(v2) 21935 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21936 v3.AuxInt = 1 21937 v3.AddArg(ptr) 21938 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21939 v4.AuxInt = 0 21940 v3.AddArg(v4) 21941 v5 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21942 v5.AuxInt = 0 21943 v5.AddArg(ptr) 21944 v6 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21945 v6.AuxInt = 0 21946 v5.AddArg(v6) 21947 v5.AddArg(mem) 21948 v3.AddArg(v5) 21949 v1.AddArg(v3) 21950 v.AddArg(v1) 21951 return true 21952 } 21953 // match: (Zero [3] ptr mem) 21954 // cond: 21955 // result: (MOVBstore [2] ptr (MOVWconst [0]) (MOVBstore [1] ptr (MOVWconst [0]) (MOVBstore [0] ptr (MOVWconst [0]) mem))) 21956 for { 21957 if v.AuxInt != 3 { 21958 break 21959 } 21960 _ = v.Args[1] 21961 ptr := v.Args[0] 21962 mem := v.Args[1] 21963 v.reset(OpARMMOVBstore) 21964 v.AuxInt = 2 21965 v.AddArg(ptr) 21966 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21967 v0.AuxInt = 0 21968 v.AddArg(v0) 21969 v1 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21970 v1.AuxInt = 1 21971 v1.AddArg(ptr) 21972 v2 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21973 v2.AuxInt = 0 21974 v1.AddArg(v2) 21975 v3 := b.NewValue0(v.Pos, OpARMMOVBstore, types.TypeMem) 21976 v3.AuxInt = 0 21977 v3.AddArg(ptr) 21978 v4 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 21979 v4.AuxInt = 0 21980 v3.AddArg(v4) 21981 v3.AddArg(mem) 21982 v1.AddArg(v3) 21983 v.AddArg(v1) 21984 return true 21985 } 21986 // match: (Zero [s] {t} ptr mem) 21987 // cond: s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice 21988 // result: (DUFFZERO [4 * (128 - int64(s/4))] ptr (MOVWconst [0]) mem) 21989 for { 21990 s := v.AuxInt 21991 t := v.Aux 21992 _ = v.Args[1] 21993 ptr := v.Args[0] 21994 mem := v.Args[1] 21995 if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { 21996 break 21997 } 21998 v.reset(OpARMDUFFZERO) 21999 v.AuxInt = 4 * (128 - int64(s/4)) 22000 v.AddArg(ptr) 22001 v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22002 v0.AuxInt = 0 22003 v.AddArg(v0) 22004 v.AddArg(mem) 22005 return true 22006 } 22007 // match: (Zero [s] {t} ptr mem) 22008 // cond: (s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0 22009 // result: (LoweredZero [t.(*types.Type).Alignment()] ptr (ADDconst <ptr.Type> ptr [s-moveSize(t.(*types.Type).Alignment(), config)]) (MOVWconst [0]) mem) 22010 for { 22011 s := v.AuxInt 22012 t := v.Aux 22013 _ = v.Args[1] 22014 ptr := v.Args[0] 22015 mem := v.Args[1] 22016 if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { 22017 break 22018 } 22019 v.reset(OpARMLoweredZero) 22020 v.AuxInt = t.(*types.Type).Alignment() 22021 v.AddArg(ptr) 22022 v0 := b.NewValue0(v.Pos, OpARMADDconst, ptr.Type) 22023 v0.AuxInt = s - moveSize(t.(*types.Type).Alignment(), config) 22024 v0.AddArg(ptr) 22025 v.AddArg(v0) 22026 v1 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) 22027 v1.AuxInt = 0 22028 v.AddArg(v1) 22029 v.AddArg(mem) 22030 return true 22031 } 22032 return false 22033 } 22034 func rewriteValueARM_OpZeroExt16to32_0(v *Value) bool { 22035 // match: (ZeroExt16to32 x) 22036 // cond: 22037 // result: (MOVHUreg x) 22038 for { 22039 x := v.Args[0] 22040 v.reset(OpARMMOVHUreg) 22041 v.AddArg(x) 22042 return true 22043 } 22044 } 22045 func rewriteValueARM_OpZeroExt8to16_0(v *Value) bool { 22046 // match: (ZeroExt8to16 x) 22047 // cond: 22048 // result: (MOVBUreg x) 22049 for { 22050 x := v.Args[0] 22051 v.reset(OpARMMOVBUreg) 22052 v.AddArg(x) 22053 return true 22054 } 22055 } 22056 func rewriteValueARM_OpZeroExt8to32_0(v *Value) bool { 22057 // match: (ZeroExt8to32 x) 22058 // cond: 22059 // result: (MOVBUreg x) 22060 for { 22061 x := v.Args[0] 22062 v.reset(OpARMMOVBUreg) 22063 v.AddArg(x) 22064 return true 22065 } 22066 } 22067 func rewriteValueARM_OpZeromask_0(v *Value) bool { 22068 b := v.Block 22069 _ = b 22070 typ := &b.Func.Config.Types 22071 _ = typ 22072 // match: (Zeromask x) 22073 // cond: 22074 // result: (SRAconst (RSBshiftRL <typ.Int32> x x [1]) [31]) 22075 for { 22076 x := v.Args[0] 22077 v.reset(OpARMSRAconst) 22078 v.AuxInt = 31 22079 v0 := b.NewValue0(v.Pos, OpARMRSBshiftRL, typ.Int32) 22080 v0.AuxInt = 1 22081 v0.AddArg(x) 22082 v0.AddArg(x) 22083 v.AddArg(v0) 22084 return true 22085 } 22086 } 22087 func rewriteBlockARM(b *Block) bool { 22088 config := b.Func.Config 22089 _ = config 22090 fe := b.Func.fe 22091 _ = fe 22092 typ := &config.Types 22093 _ = typ 22094 switch b.Kind { 22095 case BlockARMEQ: 22096 // match: (EQ (FlagEQ) yes no) 22097 // cond: 22098 // result: (First nil yes no) 22099 for { 22100 v := b.Control 22101 if v.Op != OpARMFlagEQ { 22102 break 22103 } 22104 b.Kind = BlockFirst 22105 b.SetControl(nil) 22106 b.Aux = nil 22107 return true 22108 } 22109 // match: (EQ (FlagLT_ULT) yes no) 22110 // cond: 22111 // result: (First nil no yes) 22112 for { 22113 v := b.Control 22114 if v.Op != OpARMFlagLT_ULT { 22115 break 22116 } 22117 b.Kind = BlockFirst 22118 b.SetControl(nil) 22119 b.Aux = nil 22120 b.swapSuccessors() 22121 return true 22122 } 22123 // match: (EQ (FlagLT_UGT) yes no) 22124 // cond: 22125 // result: (First nil no yes) 22126 for { 22127 v := b.Control 22128 if v.Op != OpARMFlagLT_UGT { 22129 break 22130 } 22131 b.Kind = BlockFirst 22132 b.SetControl(nil) 22133 b.Aux = nil 22134 b.swapSuccessors() 22135 return true 22136 } 22137 // match: (EQ (FlagGT_ULT) yes no) 22138 // cond: 22139 // result: (First nil no yes) 22140 for { 22141 v := b.Control 22142 if v.Op != OpARMFlagGT_ULT { 22143 break 22144 } 22145 b.Kind = BlockFirst 22146 b.SetControl(nil) 22147 b.Aux = nil 22148 b.swapSuccessors() 22149 return true 22150 } 22151 // match: (EQ (FlagGT_UGT) yes no) 22152 // cond: 22153 // result: (First nil no yes) 22154 for { 22155 v := b.Control 22156 if v.Op != OpARMFlagGT_UGT { 22157 break 22158 } 22159 b.Kind = BlockFirst 22160 b.SetControl(nil) 22161 b.Aux = nil 22162 b.swapSuccessors() 22163 return true 22164 } 22165 // match: (EQ (InvertFlags cmp) yes no) 22166 // cond: 22167 // result: (EQ cmp yes no) 22168 for { 22169 v := b.Control 22170 if v.Op != OpARMInvertFlags { 22171 break 22172 } 22173 cmp := v.Args[0] 22174 b.Kind = BlockARMEQ 22175 b.SetControl(cmp) 22176 b.Aux = nil 22177 return true 22178 } 22179 // match: (EQ (CMPconst [0] (SUB x y)) yes no) 22180 // cond: 22181 // result: (EQ (CMP x y) yes no) 22182 for { 22183 v := b.Control 22184 if v.Op != OpARMCMPconst { 22185 break 22186 } 22187 if v.AuxInt != 0 { 22188 break 22189 } 22190 v_0 := v.Args[0] 22191 if v_0.Op != OpARMSUB { 22192 break 22193 } 22194 _ = v_0.Args[1] 22195 x := v_0.Args[0] 22196 y := v_0.Args[1] 22197 b.Kind = BlockARMEQ 22198 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 22199 v0.AddArg(x) 22200 v0.AddArg(y) 22201 b.SetControl(v0) 22202 b.Aux = nil 22203 return true 22204 } 22205 // match: (EQ (CMPconst [0] (SUBconst [c] x)) yes no) 22206 // cond: 22207 // result: (EQ (CMPconst [c] x) yes no) 22208 for { 22209 v := b.Control 22210 if v.Op != OpARMCMPconst { 22211 break 22212 } 22213 if v.AuxInt != 0 { 22214 break 22215 } 22216 v_0 := v.Args[0] 22217 if v_0.Op != OpARMSUBconst { 22218 break 22219 } 22220 c := v_0.AuxInt 22221 x := v_0.Args[0] 22222 b.Kind = BlockARMEQ 22223 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 22224 v0.AuxInt = c 22225 v0.AddArg(x) 22226 b.SetControl(v0) 22227 b.Aux = nil 22228 return true 22229 } 22230 // match: (EQ (CMPconst [0] (SUBshiftLL x y [c])) yes no) 22231 // cond: 22232 // result: (EQ (CMPshiftLL x y [c]) yes no) 22233 for { 22234 v := b.Control 22235 if v.Op != OpARMCMPconst { 22236 break 22237 } 22238 if v.AuxInt != 0 { 22239 break 22240 } 22241 v_0 := v.Args[0] 22242 if v_0.Op != OpARMSUBshiftLL { 22243 break 22244 } 22245 c := v_0.AuxInt 22246 _ = v_0.Args[1] 22247 x := v_0.Args[0] 22248 y := v_0.Args[1] 22249 b.Kind = BlockARMEQ 22250 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 22251 v0.AuxInt = c 22252 v0.AddArg(x) 22253 v0.AddArg(y) 22254 b.SetControl(v0) 22255 b.Aux = nil 22256 return true 22257 } 22258 // match: (EQ (CMPconst [0] (SUBshiftRL x y [c])) yes no) 22259 // cond: 22260 // result: (EQ (CMPshiftRL x y [c]) yes no) 22261 for { 22262 v := b.Control 22263 if v.Op != OpARMCMPconst { 22264 break 22265 } 22266 if v.AuxInt != 0 { 22267 break 22268 } 22269 v_0 := v.Args[0] 22270 if v_0.Op != OpARMSUBshiftRL { 22271 break 22272 } 22273 c := v_0.AuxInt 22274 _ = v_0.Args[1] 22275 x := v_0.Args[0] 22276 y := v_0.Args[1] 22277 b.Kind = BlockARMEQ 22278 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 22279 v0.AuxInt = c 22280 v0.AddArg(x) 22281 v0.AddArg(y) 22282 b.SetControl(v0) 22283 b.Aux = nil 22284 return true 22285 } 22286 // match: (EQ (CMPconst [0] (SUBshiftRA x y [c])) yes no) 22287 // cond: 22288 // result: (EQ (CMPshiftRA x y [c]) yes no) 22289 for { 22290 v := b.Control 22291 if v.Op != OpARMCMPconst { 22292 break 22293 } 22294 if v.AuxInt != 0 { 22295 break 22296 } 22297 v_0 := v.Args[0] 22298 if v_0.Op != OpARMSUBshiftRA { 22299 break 22300 } 22301 c := v_0.AuxInt 22302 _ = v_0.Args[1] 22303 x := v_0.Args[0] 22304 y := v_0.Args[1] 22305 b.Kind = BlockARMEQ 22306 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 22307 v0.AuxInt = c 22308 v0.AddArg(x) 22309 v0.AddArg(y) 22310 b.SetControl(v0) 22311 b.Aux = nil 22312 return true 22313 } 22314 // match: (EQ (CMPconst [0] (SUBshiftLLreg x y z)) yes no) 22315 // cond: 22316 // result: (EQ (CMPshiftLLreg x y z) yes no) 22317 for { 22318 v := b.Control 22319 if v.Op != OpARMCMPconst { 22320 break 22321 } 22322 if v.AuxInt != 0 { 22323 break 22324 } 22325 v_0 := v.Args[0] 22326 if v_0.Op != OpARMSUBshiftLLreg { 22327 break 22328 } 22329 _ = v_0.Args[2] 22330 x := v_0.Args[0] 22331 y := v_0.Args[1] 22332 z := v_0.Args[2] 22333 b.Kind = BlockARMEQ 22334 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 22335 v0.AddArg(x) 22336 v0.AddArg(y) 22337 v0.AddArg(z) 22338 b.SetControl(v0) 22339 b.Aux = nil 22340 return true 22341 } 22342 // match: (EQ (CMPconst [0] (SUBshiftRLreg x y z)) yes no) 22343 // cond: 22344 // result: (EQ (CMPshiftRLreg x y z) 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 v_0 := v.Args[0] 22354 if v_0.Op != OpARMSUBshiftRLreg { 22355 break 22356 } 22357 _ = v_0.Args[2] 22358 x := v_0.Args[0] 22359 y := v_0.Args[1] 22360 z := v_0.Args[2] 22361 b.Kind = BlockARMEQ 22362 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 22363 v0.AddArg(x) 22364 v0.AddArg(y) 22365 v0.AddArg(z) 22366 b.SetControl(v0) 22367 b.Aux = nil 22368 return true 22369 } 22370 // match: (EQ (CMPconst [0] (SUBshiftRAreg x y z)) yes no) 22371 // cond: 22372 // result: (EQ (CMPshiftRAreg x y z) yes no) 22373 for { 22374 v := b.Control 22375 if v.Op != OpARMCMPconst { 22376 break 22377 } 22378 if v.AuxInt != 0 { 22379 break 22380 } 22381 v_0 := v.Args[0] 22382 if v_0.Op != OpARMSUBshiftRAreg { 22383 break 22384 } 22385 _ = v_0.Args[2] 22386 x := v_0.Args[0] 22387 y := v_0.Args[1] 22388 z := v_0.Args[2] 22389 b.Kind = BlockARMEQ 22390 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 22391 v0.AddArg(x) 22392 v0.AddArg(y) 22393 v0.AddArg(z) 22394 b.SetControl(v0) 22395 b.Aux = nil 22396 return true 22397 } 22398 // match: (EQ (CMPconst [0] (ADD x y)) yes no) 22399 // cond: 22400 // result: (EQ (CMN x y) yes no) 22401 for { 22402 v := b.Control 22403 if v.Op != OpARMCMPconst { 22404 break 22405 } 22406 if v.AuxInt != 0 { 22407 break 22408 } 22409 v_0 := v.Args[0] 22410 if v_0.Op != OpARMADD { 22411 break 22412 } 22413 _ = v_0.Args[1] 22414 x := v_0.Args[0] 22415 y := v_0.Args[1] 22416 b.Kind = BlockARMEQ 22417 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 22418 v0.AddArg(x) 22419 v0.AddArg(y) 22420 b.SetControl(v0) 22421 b.Aux = nil 22422 return true 22423 } 22424 // match: (EQ (CMPconst [0] (ADDconst [c] x)) yes no) 22425 // cond: 22426 // result: (EQ (CMNconst [c] x) yes no) 22427 for { 22428 v := b.Control 22429 if v.Op != OpARMCMPconst { 22430 break 22431 } 22432 if v.AuxInt != 0 { 22433 break 22434 } 22435 v_0 := v.Args[0] 22436 if v_0.Op != OpARMADDconst { 22437 break 22438 } 22439 c := v_0.AuxInt 22440 x := v_0.Args[0] 22441 b.Kind = BlockARMEQ 22442 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 22443 v0.AuxInt = c 22444 v0.AddArg(x) 22445 b.SetControl(v0) 22446 b.Aux = nil 22447 return true 22448 } 22449 // match: (EQ (CMPconst [0] (ADDshiftLL x y [c])) yes no) 22450 // cond: 22451 // result: (EQ (CMNshiftLL x y [c]) yes no) 22452 for { 22453 v := b.Control 22454 if v.Op != OpARMCMPconst { 22455 break 22456 } 22457 if v.AuxInt != 0 { 22458 break 22459 } 22460 v_0 := v.Args[0] 22461 if v_0.Op != OpARMADDshiftLL { 22462 break 22463 } 22464 c := v_0.AuxInt 22465 _ = v_0.Args[1] 22466 x := v_0.Args[0] 22467 y := v_0.Args[1] 22468 b.Kind = BlockARMEQ 22469 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 22470 v0.AuxInt = c 22471 v0.AddArg(x) 22472 v0.AddArg(y) 22473 b.SetControl(v0) 22474 b.Aux = nil 22475 return true 22476 } 22477 // match: (EQ (CMPconst [0] (ADDshiftRL x y [c])) yes no) 22478 // cond: 22479 // result: (EQ (CMNshiftRL x y [c]) yes no) 22480 for { 22481 v := b.Control 22482 if v.Op != OpARMCMPconst { 22483 break 22484 } 22485 if v.AuxInt != 0 { 22486 break 22487 } 22488 v_0 := v.Args[0] 22489 if v_0.Op != OpARMADDshiftRL { 22490 break 22491 } 22492 c := v_0.AuxInt 22493 _ = v_0.Args[1] 22494 x := v_0.Args[0] 22495 y := v_0.Args[1] 22496 b.Kind = BlockARMEQ 22497 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 22498 v0.AuxInt = c 22499 v0.AddArg(x) 22500 v0.AddArg(y) 22501 b.SetControl(v0) 22502 b.Aux = nil 22503 return true 22504 } 22505 // match: (EQ (CMPconst [0] (ADDshiftRA x y [c])) yes no) 22506 // cond: 22507 // result: (EQ (CMNshiftRA x y [c]) yes no) 22508 for { 22509 v := b.Control 22510 if v.Op != OpARMCMPconst { 22511 break 22512 } 22513 if v.AuxInt != 0 { 22514 break 22515 } 22516 v_0 := v.Args[0] 22517 if v_0.Op != OpARMADDshiftRA { 22518 break 22519 } 22520 c := v_0.AuxInt 22521 _ = v_0.Args[1] 22522 x := v_0.Args[0] 22523 y := v_0.Args[1] 22524 b.Kind = BlockARMEQ 22525 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 22526 v0.AuxInt = c 22527 v0.AddArg(x) 22528 v0.AddArg(y) 22529 b.SetControl(v0) 22530 b.Aux = nil 22531 return true 22532 } 22533 // match: (EQ (CMPconst [0] (ADDshiftLLreg x y z)) yes no) 22534 // cond: 22535 // result: (EQ (CMNshiftLLreg x y z) yes no) 22536 for { 22537 v := b.Control 22538 if v.Op != OpARMCMPconst { 22539 break 22540 } 22541 if v.AuxInt != 0 { 22542 break 22543 } 22544 v_0 := v.Args[0] 22545 if v_0.Op != OpARMADDshiftLLreg { 22546 break 22547 } 22548 _ = v_0.Args[2] 22549 x := v_0.Args[0] 22550 y := v_0.Args[1] 22551 z := v_0.Args[2] 22552 b.Kind = BlockARMEQ 22553 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 22554 v0.AddArg(x) 22555 v0.AddArg(y) 22556 v0.AddArg(z) 22557 b.SetControl(v0) 22558 b.Aux = nil 22559 return true 22560 } 22561 // match: (EQ (CMPconst [0] (ADDshiftRLreg x y z)) yes no) 22562 // cond: 22563 // result: (EQ (CMNshiftRLreg x y z) yes no) 22564 for { 22565 v := b.Control 22566 if v.Op != OpARMCMPconst { 22567 break 22568 } 22569 if v.AuxInt != 0 { 22570 break 22571 } 22572 v_0 := v.Args[0] 22573 if v_0.Op != OpARMADDshiftRLreg { 22574 break 22575 } 22576 _ = v_0.Args[2] 22577 x := v_0.Args[0] 22578 y := v_0.Args[1] 22579 z := v_0.Args[2] 22580 b.Kind = BlockARMEQ 22581 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, 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] (ADDshiftRAreg x y z)) yes no) 22590 // cond: 22591 // result: (EQ (CMNshiftRAreg x y z) 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 v_0 := v.Args[0] 22601 if v_0.Op != OpARMADDshiftRAreg { 22602 break 22603 } 22604 _ = v_0.Args[2] 22605 x := v_0.Args[0] 22606 y := v_0.Args[1] 22607 z := v_0.Args[2] 22608 b.Kind = BlockARMEQ 22609 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 22610 v0.AddArg(x) 22611 v0.AddArg(y) 22612 v0.AddArg(z) 22613 b.SetControl(v0) 22614 b.Aux = nil 22615 return true 22616 } 22617 // match: (EQ (CMPconst [0] (AND x y)) yes no) 22618 // cond: 22619 // result: (EQ (TST x y) yes no) 22620 for { 22621 v := b.Control 22622 if v.Op != OpARMCMPconst { 22623 break 22624 } 22625 if v.AuxInt != 0 { 22626 break 22627 } 22628 v_0 := v.Args[0] 22629 if v_0.Op != OpARMAND { 22630 break 22631 } 22632 _ = v_0.Args[1] 22633 x := v_0.Args[0] 22634 y := v_0.Args[1] 22635 b.Kind = BlockARMEQ 22636 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 22637 v0.AddArg(x) 22638 v0.AddArg(y) 22639 b.SetControl(v0) 22640 b.Aux = nil 22641 return true 22642 } 22643 // match: (EQ (CMPconst [0] (ANDconst [c] x)) yes no) 22644 // cond: 22645 // result: (EQ (TSTconst [c] x) yes no) 22646 for { 22647 v := b.Control 22648 if v.Op != OpARMCMPconst { 22649 break 22650 } 22651 if v.AuxInt != 0 { 22652 break 22653 } 22654 v_0 := v.Args[0] 22655 if v_0.Op != OpARMANDconst { 22656 break 22657 } 22658 c := v_0.AuxInt 22659 x := v_0.Args[0] 22660 b.Kind = BlockARMEQ 22661 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 22662 v0.AuxInt = c 22663 v0.AddArg(x) 22664 b.SetControl(v0) 22665 b.Aux = nil 22666 return true 22667 } 22668 // match: (EQ (CMPconst [0] (ANDshiftLL x y [c])) yes no) 22669 // cond: 22670 // result: (EQ (TSTshiftLL x y [c]) yes no) 22671 for { 22672 v := b.Control 22673 if v.Op != OpARMCMPconst { 22674 break 22675 } 22676 if v.AuxInt != 0 { 22677 break 22678 } 22679 v_0 := v.Args[0] 22680 if v_0.Op != OpARMANDshiftLL { 22681 break 22682 } 22683 c := v_0.AuxInt 22684 _ = v_0.Args[1] 22685 x := v_0.Args[0] 22686 y := v_0.Args[1] 22687 b.Kind = BlockARMEQ 22688 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 22689 v0.AuxInt = c 22690 v0.AddArg(x) 22691 v0.AddArg(y) 22692 b.SetControl(v0) 22693 b.Aux = nil 22694 return true 22695 } 22696 // match: (EQ (CMPconst [0] (ANDshiftRL x y [c])) yes no) 22697 // cond: 22698 // result: (EQ (TSTshiftRL x y [c]) yes no) 22699 for { 22700 v := b.Control 22701 if v.Op != OpARMCMPconst { 22702 break 22703 } 22704 if v.AuxInt != 0 { 22705 break 22706 } 22707 v_0 := v.Args[0] 22708 if v_0.Op != OpARMANDshiftRL { 22709 break 22710 } 22711 c := v_0.AuxInt 22712 _ = v_0.Args[1] 22713 x := v_0.Args[0] 22714 y := v_0.Args[1] 22715 b.Kind = BlockARMEQ 22716 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 22717 v0.AuxInt = c 22718 v0.AddArg(x) 22719 v0.AddArg(y) 22720 b.SetControl(v0) 22721 b.Aux = nil 22722 return true 22723 } 22724 // match: (EQ (CMPconst [0] (ANDshiftRA x y [c])) yes no) 22725 // cond: 22726 // result: (EQ (TSTshiftRA x y [c]) yes no) 22727 for { 22728 v := b.Control 22729 if v.Op != OpARMCMPconst { 22730 break 22731 } 22732 if v.AuxInt != 0 { 22733 break 22734 } 22735 v_0 := v.Args[0] 22736 if v_0.Op != OpARMANDshiftRA { 22737 break 22738 } 22739 c := v_0.AuxInt 22740 _ = v_0.Args[1] 22741 x := v_0.Args[0] 22742 y := v_0.Args[1] 22743 b.Kind = BlockARMEQ 22744 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 22745 v0.AuxInt = c 22746 v0.AddArg(x) 22747 v0.AddArg(y) 22748 b.SetControl(v0) 22749 b.Aux = nil 22750 return true 22751 } 22752 // match: (EQ (CMPconst [0] (ANDshiftLLreg x y z)) yes no) 22753 // cond: 22754 // result: (EQ (TSTshiftLLreg x y z) yes no) 22755 for { 22756 v := b.Control 22757 if v.Op != OpARMCMPconst { 22758 break 22759 } 22760 if v.AuxInt != 0 { 22761 break 22762 } 22763 v_0 := v.Args[0] 22764 if v_0.Op != OpARMANDshiftLLreg { 22765 break 22766 } 22767 _ = v_0.Args[2] 22768 x := v_0.Args[0] 22769 y := v_0.Args[1] 22770 z := v_0.Args[2] 22771 b.Kind = BlockARMEQ 22772 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 22773 v0.AddArg(x) 22774 v0.AddArg(y) 22775 v0.AddArg(z) 22776 b.SetControl(v0) 22777 b.Aux = nil 22778 return true 22779 } 22780 // match: (EQ (CMPconst [0] (ANDshiftRLreg x y z)) yes no) 22781 // cond: 22782 // result: (EQ (TSTshiftRLreg x y z) yes no) 22783 for { 22784 v := b.Control 22785 if v.Op != OpARMCMPconst { 22786 break 22787 } 22788 if v.AuxInt != 0 { 22789 break 22790 } 22791 v_0 := v.Args[0] 22792 if v_0.Op != OpARMANDshiftRLreg { 22793 break 22794 } 22795 _ = v_0.Args[2] 22796 x := v_0.Args[0] 22797 y := v_0.Args[1] 22798 z := v_0.Args[2] 22799 b.Kind = BlockARMEQ 22800 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 22801 v0.AddArg(x) 22802 v0.AddArg(y) 22803 v0.AddArg(z) 22804 b.SetControl(v0) 22805 b.Aux = nil 22806 return true 22807 } 22808 // match: (EQ (CMPconst [0] (ANDshiftRAreg x y z)) yes no) 22809 // cond: 22810 // result: (EQ (TSTshiftRAreg x y z) yes no) 22811 for { 22812 v := b.Control 22813 if v.Op != OpARMCMPconst { 22814 break 22815 } 22816 if v.AuxInt != 0 { 22817 break 22818 } 22819 v_0 := v.Args[0] 22820 if v_0.Op != OpARMANDshiftRAreg { 22821 break 22822 } 22823 _ = v_0.Args[2] 22824 x := v_0.Args[0] 22825 y := v_0.Args[1] 22826 z := v_0.Args[2] 22827 b.Kind = BlockARMEQ 22828 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 22829 v0.AddArg(x) 22830 v0.AddArg(y) 22831 v0.AddArg(z) 22832 b.SetControl(v0) 22833 b.Aux = nil 22834 return true 22835 } 22836 // match: (EQ (CMPconst [0] (XOR x y)) yes no) 22837 // cond: 22838 // result: (EQ (TEQ x y) yes no) 22839 for { 22840 v := b.Control 22841 if v.Op != OpARMCMPconst { 22842 break 22843 } 22844 if v.AuxInt != 0 { 22845 break 22846 } 22847 v_0 := v.Args[0] 22848 if v_0.Op != OpARMXOR { 22849 break 22850 } 22851 _ = v_0.Args[1] 22852 x := v_0.Args[0] 22853 y := v_0.Args[1] 22854 b.Kind = BlockARMEQ 22855 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 22856 v0.AddArg(x) 22857 v0.AddArg(y) 22858 b.SetControl(v0) 22859 b.Aux = nil 22860 return true 22861 } 22862 // match: (EQ (CMPconst [0] (XORconst [c] x)) yes no) 22863 // cond: 22864 // result: (EQ (TEQconst [c] x) yes no) 22865 for { 22866 v := b.Control 22867 if v.Op != OpARMCMPconst { 22868 break 22869 } 22870 if v.AuxInt != 0 { 22871 break 22872 } 22873 v_0 := v.Args[0] 22874 if v_0.Op != OpARMXORconst { 22875 break 22876 } 22877 c := v_0.AuxInt 22878 x := v_0.Args[0] 22879 b.Kind = BlockARMEQ 22880 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 22881 v0.AuxInt = c 22882 v0.AddArg(x) 22883 b.SetControl(v0) 22884 b.Aux = nil 22885 return true 22886 } 22887 // match: (EQ (CMPconst [0] (XORshiftLL x y [c])) yes no) 22888 // cond: 22889 // result: (EQ (TEQshiftLL x y [c]) yes no) 22890 for { 22891 v := b.Control 22892 if v.Op != OpARMCMPconst { 22893 break 22894 } 22895 if v.AuxInt != 0 { 22896 break 22897 } 22898 v_0 := v.Args[0] 22899 if v_0.Op != OpARMXORshiftLL { 22900 break 22901 } 22902 c := v_0.AuxInt 22903 _ = v_0.Args[1] 22904 x := v_0.Args[0] 22905 y := v_0.Args[1] 22906 b.Kind = BlockARMEQ 22907 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 22908 v0.AuxInt = c 22909 v0.AddArg(x) 22910 v0.AddArg(y) 22911 b.SetControl(v0) 22912 b.Aux = nil 22913 return true 22914 } 22915 // match: (EQ (CMPconst [0] (XORshiftRL x y [c])) yes no) 22916 // cond: 22917 // result: (EQ (TEQshiftRL x y [c]) yes no) 22918 for { 22919 v := b.Control 22920 if v.Op != OpARMCMPconst { 22921 break 22922 } 22923 if v.AuxInt != 0 { 22924 break 22925 } 22926 v_0 := v.Args[0] 22927 if v_0.Op != OpARMXORshiftRL { 22928 break 22929 } 22930 c := v_0.AuxInt 22931 _ = v_0.Args[1] 22932 x := v_0.Args[0] 22933 y := v_0.Args[1] 22934 b.Kind = BlockARMEQ 22935 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 22936 v0.AuxInt = c 22937 v0.AddArg(x) 22938 v0.AddArg(y) 22939 b.SetControl(v0) 22940 b.Aux = nil 22941 return true 22942 } 22943 // match: (EQ (CMPconst [0] (XORshiftRA x y [c])) yes no) 22944 // cond: 22945 // result: (EQ (TEQshiftRA x y [c]) yes no) 22946 for { 22947 v := b.Control 22948 if v.Op != OpARMCMPconst { 22949 break 22950 } 22951 if v.AuxInt != 0 { 22952 break 22953 } 22954 v_0 := v.Args[0] 22955 if v_0.Op != OpARMXORshiftRA { 22956 break 22957 } 22958 c := v_0.AuxInt 22959 _ = v_0.Args[1] 22960 x := v_0.Args[0] 22961 y := v_0.Args[1] 22962 b.Kind = BlockARMEQ 22963 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 22964 v0.AuxInt = c 22965 v0.AddArg(x) 22966 v0.AddArg(y) 22967 b.SetControl(v0) 22968 b.Aux = nil 22969 return true 22970 } 22971 // match: (EQ (CMPconst [0] (XORshiftLLreg x y z)) yes no) 22972 // cond: 22973 // result: (EQ (TEQshiftLLreg x y z) yes no) 22974 for { 22975 v := b.Control 22976 if v.Op != OpARMCMPconst { 22977 break 22978 } 22979 if v.AuxInt != 0 { 22980 break 22981 } 22982 v_0 := v.Args[0] 22983 if v_0.Op != OpARMXORshiftLLreg { 22984 break 22985 } 22986 _ = v_0.Args[2] 22987 x := v_0.Args[0] 22988 y := v_0.Args[1] 22989 z := v_0.Args[2] 22990 b.Kind = BlockARMEQ 22991 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 22992 v0.AddArg(x) 22993 v0.AddArg(y) 22994 v0.AddArg(z) 22995 b.SetControl(v0) 22996 b.Aux = nil 22997 return true 22998 } 22999 // match: (EQ (CMPconst [0] (XORshiftRLreg x y z)) yes no) 23000 // cond: 23001 // result: (EQ (TEQshiftRLreg x y z) yes no) 23002 for { 23003 v := b.Control 23004 if v.Op != OpARMCMPconst { 23005 break 23006 } 23007 if v.AuxInt != 0 { 23008 break 23009 } 23010 v_0 := v.Args[0] 23011 if v_0.Op != OpARMXORshiftRLreg { 23012 break 23013 } 23014 _ = v_0.Args[2] 23015 x := v_0.Args[0] 23016 y := v_0.Args[1] 23017 z := v_0.Args[2] 23018 b.Kind = BlockARMEQ 23019 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 23020 v0.AddArg(x) 23021 v0.AddArg(y) 23022 v0.AddArg(z) 23023 b.SetControl(v0) 23024 b.Aux = nil 23025 return true 23026 } 23027 // match: (EQ (CMPconst [0] (XORshiftRAreg x y z)) yes no) 23028 // cond: 23029 // result: (EQ (TEQshiftRAreg x y z) yes no) 23030 for { 23031 v := b.Control 23032 if v.Op != OpARMCMPconst { 23033 break 23034 } 23035 if v.AuxInt != 0 { 23036 break 23037 } 23038 v_0 := v.Args[0] 23039 if v_0.Op != OpARMXORshiftRAreg { 23040 break 23041 } 23042 _ = v_0.Args[2] 23043 x := v_0.Args[0] 23044 y := v_0.Args[1] 23045 z := v_0.Args[2] 23046 b.Kind = BlockARMEQ 23047 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 23048 v0.AddArg(x) 23049 v0.AddArg(y) 23050 v0.AddArg(z) 23051 b.SetControl(v0) 23052 b.Aux = nil 23053 return true 23054 } 23055 case BlockARMGE: 23056 // match: (GE (FlagEQ) yes no) 23057 // cond: 23058 // result: (First nil yes no) 23059 for { 23060 v := b.Control 23061 if v.Op != OpARMFlagEQ { 23062 break 23063 } 23064 b.Kind = BlockFirst 23065 b.SetControl(nil) 23066 b.Aux = nil 23067 return true 23068 } 23069 // match: (GE (FlagLT_ULT) yes no) 23070 // cond: 23071 // result: (First nil no yes) 23072 for { 23073 v := b.Control 23074 if v.Op != OpARMFlagLT_ULT { 23075 break 23076 } 23077 b.Kind = BlockFirst 23078 b.SetControl(nil) 23079 b.Aux = nil 23080 b.swapSuccessors() 23081 return true 23082 } 23083 // match: (GE (FlagLT_UGT) yes no) 23084 // cond: 23085 // result: (First nil no yes) 23086 for { 23087 v := b.Control 23088 if v.Op != OpARMFlagLT_UGT { 23089 break 23090 } 23091 b.Kind = BlockFirst 23092 b.SetControl(nil) 23093 b.Aux = nil 23094 b.swapSuccessors() 23095 return true 23096 } 23097 // match: (GE (FlagGT_ULT) yes no) 23098 // cond: 23099 // result: (First nil yes no) 23100 for { 23101 v := b.Control 23102 if v.Op != OpARMFlagGT_ULT { 23103 break 23104 } 23105 b.Kind = BlockFirst 23106 b.SetControl(nil) 23107 b.Aux = nil 23108 return true 23109 } 23110 // match: (GE (FlagGT_UGT) yes no) 23111 // cond: 23112 // result: (First nil yes no) 23113 for { 23114 v := b.Control 23115 if v.Op != OpARMFlagGT_UGT { 23116 break 23117 } 23118 b.Kind = BlockFirst 23119 b.SetControl(nil) 23120 b.Aux = nil 23121 return true 23122 } 23123 // match: (GE (InvertFlags cmp) yes no) 23124 // cond: 23125 // result: (LE cmp yes no) 23126 for { 23127 v := b.Control 23128 if v.Op != OpARMInvertFlags { 23129 break 23130 } 23131 cmp := v.Args[0] 23132 b.Kind = BlockARMLE 23133 b.SetControl(cmp) 23134 b.Aux = nil 23135 return true 23136 } 23137 case BlockARMGT: 23138 // match: (GT (FlagEQ) yes no) 23139 // cond: 23140 // result: (First nil no yes) 23141 for { 23142 v := b.Control 23143 if v.Op != OpARMFlagEQ { 23144 break 23145 } 23146 b.Kind = BlockFirst 23147 b.SetControl(nil) 23148 b.Aux = nil 23149 b.swapSuccessors() 23150 return true 23151 } 23152 // match: (GT (FlagLT_ULT) yes no) 23153 // cond: 23154 // result: (First nil no yes) 23155 for { 23156 v := b.Control 23157 if v.Op != OpARMFlagLT_ULT { 23158 break 23159 } 23160 b.Kind = BlockFirst 23161 b.SetControl(nil) 23162 b.Aux = nil 23163 b.swapSuccessors() 23164 return true 23165 } 23166 // match: (GT (FlagLT_UGT) yes no) 23167 // cond: 23168 // result: (First nil no yes) 23169 for { 23170 v := b.Control 23171 if v.Op != OpARMFlagLT_UGT { 23172 break 23173 } 23174 b.Kind = BlockFirst 23175 b.SetControl(nil) 23176 b.Aux = nil 23177 b.swapSuccessors() 23178 return true 23179 } 23180 // match: (GT (FlagGT_ULT) yes no) 23181 // cond: 23182 // result: (First nil yes no) 23183 for { 23184 v := b.Control 23185 if v.Op != OpARMFlagGT_ULT { 23186 break 23187 } 23188 b.Kind = BlockFirst 23189 b.SetControl(nil) 23190 b.Aux = nil 23191 return true 23192 } 23193 // match: (GT (FlagGT_UGT) yes no) 23194 // cond: 23195 // result: (First nil yes no) 23196 for { 23197 v := b.Control 23198 if v.Op != OpARMFlagGT_UGT { 23199 break 23200 } 23201 b.Kind = BlockFirst 23202 b.SetControl(nil) 23203 b.Aux = nil 23204 return true 23205 } 23206 // match: (GT (InvertFlags cmp) yes no) 23207 // cond: 23208 // result: (LT cmp yes no) 23209 for { 23210 v := b.Control 23211 if v.Op != OpARMInvertFlags { 23212 break 23213 } 23214 cmp := v.Args[0] 23215 b.Kind = BlockARMLT 23216 b.SetControl(cmp) 23217 b.Aux = nil 23218 return true 23219 } 23220 case BlockIf: 23221 // match: (If (Equal cc) yes no) 23222 // cond: 23223 // result: (EQ cc yes no) 23224 for { 23225 v := b.Control 23226 if v.Op != OpARMEqual { 23227 break 23228 } 23229 cc := v.Args[0] 23230 b.Kind = BlockARMEQ 23231 b.SetControl(cc) 23232 b.Aux = nil 23233 return true 23234 } 23235 // match: (If (NotEqual cc) yes no) 23236 // cond: 23237 // result: (NE cc yes no) 23238 for { 23239 v := b.Control 23240 if v.Op != OpARMNotEqual { 23241 break 23242 } 23243 cc := v.Args[0] 23244 b.Kind = BlockARMNE 23245 b.SetControl(cc) 23246 b.Aux = nil 23247 return true 23248 } 23249 // match: (If (LessThan cc) yes no) 23250 // cond: 23251 // result: (LT cc yes no) 23252 for { 23253 v := b.Control 23254 if v.Op != OpARMLessThan { 23255 break 23256 } 23257 cc := v.Args[0] 23258 b.Kind = BlockARMLT 23259 b.SetControl(cc) 23260 b.Aux = nil 23261 return true 23262 } 23263 // match: (If (LessThanU cc) yes no) 23264 // cond: 23265 // result: (ULT cc yes no) 23266 for { 23267 v := b.Control 23268 if v.Op != OpARMLessThanU { 23269 break 23270 } 23271 cc := v.Args[0] 23272 b.Kind = BlockARMULT 23273 b.SetControl(cc) 23274 b.Aux = nil 23275 return true 23276 } 23277 // match: (If (LessEqual cc) yes no) 23278 // cond: 23279 // result: (LE cc yes no) 23280 for { 23281 v := b.Control 23282 if v.Op != OpARMLessEqual { 23283 break 23284 } 23285 cc := v.Args[0] 23286 b.Kind = BlockARMLE 23287 b.SetControl(cc) 23288 b.Aux = nil 23289 return true 23290 } 23291 // match: (If (LessEqualU cc) yes no) 23292 // cond: 23293 // result: (ULE cc yes no) 23294 for { 23295 v := b.Control 23296 if v.Op != OpARMLessEqualU { 23297 break 23298 } 23299 cc := v.Args[0] 23300 b.Kind = BlockARMULE 23301 b.SetControl(cc) 23302 b.Aux = nil 23303 return true 23304 } 23305 // match: (If (GreaterThan cc) yes no) 23306 // cond: 23307 // result: (GT cc yes no) 23308 for { 23309 v := b.Control 23310 if v.Op != OpARMGreaterThan { 23311 break 23312 } 23313 cc := v.Args[0] 23314 b.Kind = BlockARMGT 23315 b.SetControl(cc) 23316 b.Aux = nil 23317 return true 23318 } 23319 // match: (If (GreaterThanU cc) yes no) 23320 // cond: 23321 // result: (UGT cc yes no) 23322 for { 23323 v := b.Control 23324 if v.Op != OpARMGreaterThanU { 23325 break 23326 } 23327 cc := v.Args[0] 23328 b.Kind = BlockARMUGT 23329 b.SetControl(cc) 23330 b.Aux = nil 23331 return true 23332 } 23333 // match: (If (GreaterEqual cc) yes no) 23334 // cond: 23335 // result: (GE cc yes no) 23336 for { 23337 v := b.Control 23338 if v.Op != OpARMGreaterEqual { 23339 break 23340 } 23341 cc := v.Args[0] 23342 b.Kind = BlockARMGE 23343 b.SetControl(cc) 23344 b.Aux = nil 23345 return true 23346 } 23347 // match: (If (GreaterEqualU cc) yes no) 23348 // cond: 23349 // result: (UGE cc yes no) 23350 for { 23351 v := b.Control 23352 if v.Op != OpARMGreaterEqualU { 23353 break 23354 } 23355 cc := v.Args[0] 23356 b.Kind = BlockARMUGE 23357 b.SetControl(cc) 23358 b.Aux = nil 23359 return true 23360 } 23361 // match: (If cond yes no) 23362 // cond: 23363 // result: (NE (CMPconst [0] cond) yes no) 23364 for { 23365 v := b.Control 23366 _ = v 23367 cond := b.Control 23368 b.Kind = BlockARMNE 23369 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 23370 v0.AuxInt = 0 23371 v0.AddArg(cond) 23372 b.SetControl(v0) 23373 b.Aux = nil 23374 return true 23375 } 23376 case BlockARMLE: 23377 // match: (LE (FlagEQ) yes no) 23378 // cond: 23379 // result: (First nil yes no) 23380 for { 23381 v := b.Control 23382 if v.Op != OpARMFlagEQ { 23383 break 23384 } 23385 b.Kind = BlockFirst 23386 b.SetControl(nil) 23387 b.Aux = nil 23388 return true 23389 } 23390 // match: (LE (FlagLT_ULT) yes no) 23391 // cond: 23392 // result: (First nil yes no) 23393 for { 23394 v := b.Control 23395 if v.Op != OpARMFlagLT_ULT { 23396 break 23397 } 23398 b.Kind = BlockFirst 23399 b.SetControl(nil) 23400 b.Aux = nil 23401 return true 23402 } 23403 // match: (LE (FlagLT_UGT) yes no) 23404 // cond: 23405 // result: (First nil yes no) 23406 for { 23407 v := b.Control 23408 if v.Op != OpARMFlagLT_UGT { 23409 break 23410 } 23411 b.Kind = BlockFirst 23412 b.SetControl(nil) 23413 b.Aux = nil 23414 return true 23415 } 23416 // match: (LE (FlagGT_ULT) yes no) 23417 // cond: 23418 // result: (First nil no yes) 23419 for { 23420 v := b.Control 23421 if v.Op != OpARMFlagGT_ULT { 23422 break 23423 } 23424 b.Kind = BlockFirst 23425 b.SetControl(nil) 23426 b.Aux = nil 23427 b.swapSuccessors() 23428 return true 23429 } 23430 // match: (LE (FlagGT_UGT) yes no) 23431 // cond: 23432 // result: (First nil no yes) 23433 for { 23434 v := b.Control 23435 if v.Op != OpARMFlagGT_UGT { 23436 break 23437 } 23438 b.Kind = BlockFirst 23439 b.SetControl(nil) 23440 b.Aux = nil 23441 b.swapSuccessors() 23442 return true 23443 } 23444 // match: (LE (InvertFlags cmp) yes no) 23445 // cond: 23446 // result: (GE cmp yes no) 23447 for { 23448 v := b.Control 23449 if v.Op != OpARMInvertFlags { 23450 break 23451 } 23452 cmp := v.Args[0] 23453 b.Kind = BlockARMGE 23454 b.SetControl(cmp) 23455 b.Aux = nil 23456 return true 23457 } 23458 case BlockARMLT: 23459 // match: (LT (FlagEQ) yes no) 23460 // cond: 23461 // result: (First nil no yes) 23462 for { 23463 v := b.Control 23464 if v.Op != OpARMFlagEQ { 23465 break 23466 } 23467 b.Kind = BlockFirst 23468 b.SetControl(nil) 23469 b.Aux = nil 23470 b.swapSuccessors() 23471 return true 23472 } 23473 // match: (LT (FlagLT_ULT) yes no) 23474 // cond: 23475 // result: (First nil yes no) 23476 for { 23477 v := b.Control 23478 if v.Op != OpARMFlagLT_ULT { 23479 break 23480 } 23481 b.Kind = BlockFirst 23482 b.SetControl(nil) 23483 b.Aux = nil 23484 return true 23485 } 23486 // match: (LT (FlagLT_UGT) yes no) 23487 // cond: 23488 // result: (First nil yes no) 23489 for { 23490 v := b.Control 23491 if v.Op != OpARMFlagLT_UGT { 23492 break 23493 } 23494 b.Kind = BlockFirst 23495 b.SetControl(nil) 23496 b.Aux = nil 23497 return true 23498 } 23499 // match: (LT (FlagGT_ULT) yes no) 23500 // cond: 23501 // result: (First nil no yes) 23502 for { 23503 v := b.Control 23504 if v.Op != OpARMFlagGT_ULT { 23505 break 23506 } 23507 b.Kind = BlockFirst 23508 b.SetControl(nil) 23509 b.Aux = nil 23510 b.swapSuccessors() 23511 return true 23512 } 23513 // match: (LT (FlagGT_UGT) yes no) 23514 // cond: 23515 // result: (First nil no yes) 23516 for { 23517 v := b.Control 23518 if v.Op != OpARMFlagGT_UGT { 23519 break 23520 } 23521 b.Kind = BlockFirst 23522 b.SetControl(nil) 23523 b.Aux = nil 23524 b.swapSuccessors() 23525 return true 23526 } 23527 // match: (LT (InvertFlags cmp) yes no) 23528 // cond: 23529 // result: (GT cmp yes no) 23530 for { 23531 v := b.Control 23532 if v.Op != OpARMInvertFlags { 23533 break 23534 } 23535 cmp := v.Args[0] 23536 b.Kind = BlockARMGT 23537 b.SetControl(cmp) 23538 b.Aux = nil 23539 return true 23540 } 23541 case BlockARMNE: 23542 // match: (NE (CMPconst [0] (Equal cc)) yes no) 23543 // cond: 23544 // result: (EQ cc yes no) 23545 for { 23546 v := b.Control 23547 if v.Op != OpARMCMPconst { 23548 break 23549 } 23550 if v.AuxInt != 0 { 23551 break 23552 } 23553 v_0 := v.Args[0] 23554 if v_0.Op != OpARMEqual { 23555 break 23556 } 23557 cc := v_0.Args[0] 23558 b.Kind = BlockARMEQ 23559 b.SetControl(cc) 23560 b.Aux = nil 23561 return true 23562 } 23563 // match: (NE (CMPconst [0] (NotEqual cc)) yes no) 23564 // cond: 23565 // result: (NE cc yes no) 23566 for { 23567 v := b.Control 23568 if v.Op != OpARMCMPconst { 23569 break 23570 } 23571 if v.AuxInt != 0 { 23572 break 23573 } 23574 v_0 := v.Args[0] 23575 if v_0.Op != OpARMNotEqual { 23576 break 23577 } 23578 cc := v_0.Args[0] 23579 b.Kind = BlockARMNE 23580 b.SetControl(cc) 23581 b.Aux = nil 23582 return true 23583 } 23584 // match: (NE (CMPconst [0] (LessThan cc)) yes no) 23585 // cond: 23586 // result: (LT cc yes no) 23587 for { 23588 v := b.Control 23589 if v.Op != OpARMCMPconst { 23590 break 23591 } 23592 if v.AuxInt != 0 { 23593 break 23594 } 23595 v_0 := v.Args[0] 23596 if v_0.Op != OpARMLessThan { 23597 break 23598 } 23599 cc := v_0.Args[0] 23600 b.Kind = BlockARMLT 23601 b.SetControl(cc) 23602 b.Aux = nil 23603 return true 23604 } 23605 // match: (NE (CMPconst [0] (LessThanU cc)) yes no) 23606 // cond: 23607 // result: (ULT cc yes no) 23608 for { 23609 v := b.Control 23610 if v.Op != OpARMCMPconst { 23611 break 23612 } 23613 if v.AuxInt != 0 { 23614 break 23615 } 23616 v_0 := v.Args[0] 23617 if v_0.Op != OpARMLessThanU { 23618 break 23619 } 23620 cc := v_0.Args[0] 23621 b.Kind = BlockARMULT 23622 b.SetControl(cc) 23623 b.Aux = nil 23624 return true 23625 } 23626 // match: (NE (CMPconst [0] (LessEqual cc)) yes no) 23627 // cond: 23628 // result: (LE cc yes no) 23629 for { 23630 v := b.Control 23631 if v.Op != OpARMCMPconst { 23632 break 23633 } 23634 if v.AuxInt != 0 { 23635 break 23636 } 23637 v_0 := v.Args[0] 23638 if v_0.Op != OpARMLessEqual { 23639 break 23640 } 23641 cc := v_0.Args[0] 23642 b.Kind = BlockARMLE 23643 b.SetControl(cc) 23644 b.Aux = nil 23645 return true 23646 } 23647 // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) 23648 // cond: 23649 // result: (ULE cc 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 v_0 := v.Args[0] 23659 if v_0.Op != OpARMLessEqualU { 23660 break 23661 } 23662 cc := v_0.Args[0] 23663 b.Kind = BlockARMULE 23664 b.SetControl(cc) 23665 b.Aux = nil 23666 return true 23667 } 23668 // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) 23669 // cond: 23670 // result: (GT cc yes no) 23671 for { 23672 v := b.Control 23673 if v.Op != OpARMCMPconst { 23674 break 23675 } 23676 if v.AuxInt != 0 { 23677 break 23678 } 23679 v_0 := v.Args[0] 23680 if v_0.Op != OpARMGreaterThan { 23681 break 23682 } 23683 cc := v_0.Args[0] 23684 b.Kind = BlockARMGT 23685 b.SetControl(cc) 23686 b.Aux = nil 23687 return true 23688 } 23689 // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) 23690 // cond: 23691 // result: (UGT cc yes no) 23692 for { 23693 v := b.Control 23694 if v.Op != OpARMCMPconst { 23695 break 23696 } 23697 if v.AuxInt != 0 { 23698 break 23699 } 23700 v_0 := v.Args[0] 23701 if v_0.Op != OpARMGreaterThanU { 23702 break 23703 } 23704 cc := v_0.Args[0] 23705 b.Kind = BlockARMUGT 23706 b.SetControl(cc) 23707 b.Aux = nil 23708 return true 23709 } 23710 // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) 23711 // cond: 23712 // result: (GE cc yes no) 23713 for { 23714 v := b.Control 23715 if v.Op != OpARMCMPconst { 23716 break 23717 } 23718 if v.AuxInt != 0 { 23719 break 23720 } 23721 v_0 := v.Args[0] 23722 if v_0.Op != OpARMGreaterEqual { 23723 break 23724 } 23725 cc := v_0.Args[0] 23726 b.Kind = BlockARMGE 23727 b.SetControl(cc) 23728 b.Aux = nil 23729 return true 23730 } 23731 // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) 23732 // cond: 23733 // result: (UGE cc yes no) 23734 for { 23735 v := b.Control 23736 if v.Op != OpARMCMPconst { 23737 break 23738 } 23739 if v.AuxInt != 0 { 23740 break 23741 } 23742 v_0 := v.Args[0] 23743 if v_0.Op != OpARMGreaterEqualU { 23744 break 23745 } 23746 cc := v_0.Args[0] 23747 b.Kind = BlockARMUGE 23748 b.SetControl(cc) 23749 b.Aux = nil 23750 return true 23751 } 23752 // match: (NE (FlagEQ) yes no) 23753 // cond: 23754 // result: (First nil no yes) 23755 for { 23756 v := b.Control 23757 if v.Op != OpARMFlagEQ { 23758 break 23759 } 23760 b.Kind = BlockFirst 23761 b.SetControl(nil) 23762 b.Aux = nil 23763 b.swapSuccessors() 23764 return true 23765 } 23766 // match: (NE (FlagLT_ULT) yes no) 23767 // cond: 23768 // result: (First nil yes no) 23769 for { 23770 v := b.Control 23771 if v.Op != OpARMFlagLT_ULT { 23772 break 23773 } 23774 b.Kind = BlockFirst 23775 b.SetControl(nil) 23776 b.Aux = nil 23777 return true 23778 } 23779 // match: (NE (FlagLT_UGT) yes no) 23780 // cond: 23781 // result: (First nil yes no) 23782 for { 23783 v := b.Control 23784 if v.Op != OpARMFlagLT_UGT { 23785 break 23786 } 23787 b.Kind = BlockFirst 23788 b.SetControl(nil) 23789 b.Aux = nil 23790 return true 23791 } 23792 // match: (NE (FlagGT_ULT) yes no) 23793 // cond: 23794 // result: (First nil yes no) 23795 for { 23796 v := b.Control 23797 if v.Op != OpARMFlagGT_ULT { 23798 break 23799 } 23800 b.Kind = BlockFirst 23801 b.SetControl(nil) 23802 b.Aux = nil 23803 return true 23804 } 23805 // match: (NE (FlagGT_UGT) yes no) 23806 // cond: 23807 // result: (First nil yes no) 23808 for { 23809 v := b.Control 23810 if v.Op != OpARMFlagGT_UGT { 23811 break 23812 } 23813 b.Kind = BlockFirst 23814 b.SetControl(nil) 23815 b.Aux = nil 23816 return true 23817 } 23818 // match: (NE (InvertFlags cmp) yes no) 23819 // cond: 23820 // result: (NE cmp yes no) 23821 for { 23822 v := b.Control 23823 if v.Op != OpARMInvertFlags { 23824 break 23825 } 23826 cmp := v.Args[0] 23827 b.Kind = BlockARMNE 23828 b.SetControl(cmp) 23829 b.Aux = nil 23830 return true 23831 } 23832 // match: (NE (CMPconst [0] (SUB x y)) yes no) 23833 // cond: 23834 // result: (NE (CMP x y) yes no) 23835 for { 23836 v := b.Control 23837 if v.Op != OpARMCMPconst { 23838 break 23839 } 23840 if v.AuxInt != 0 { 23841 break 23842 } 23843 v_0 := v.Args[0] 23844 if v_0.Op != OpARMSUB { 23845 break 23846 } 23847 _ = v_0.Args[1] 23848 x := v_0.Args[0] 23849 y := v_0.Args[1] 23850 b.Kind = BlockARMNE 23851 v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) 23852 v0.AddArg(x) 23853 v0.AddArg(y) 23854 b.SetControl(v0) 23855 b.Aux = nil 23856 return true 23857 } 23858 // match: (NE (CMPconst [0] (SUBconst [c] x)) yes no) 23859 // cond: 23860 // result: (NE (CMPconst [c] x) yes no) 23861 for { 23862 v := b.Control 23863 if v.Op != OpARMCMPconst { 23864 break 23865 } 23866 if v.AuxInt != 0 { 23867 break 23868 } 23869 v_0 := v.Args[0] 23870 if v_0.Op != OpARMSUBconst { 23871 break 23872 } 23873 c := v_0.AuxInt 23874 x := v_0.Args[0] 23875 b.Kind = BlockARMNE 23876 v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) 23877 v0.AuxInt = c 23878 v0.AddArg(x) 23879 b.SetControl(v0) 23880 b.Aux = nil 23881 return true 23882 } 23883 // match: (NE (CMPconst [0] (SUBshiftLL x y [c])) yes no) 23884 // cond: 23885 // result: (NE (CMPshiftLL x y [c]) yes no) 23886 for { 23887 v := b.Control 23888 if v.Op != OpARMCMPconst { 23889 break 23890 } 23891 if v.AuxInt != 0 { 23892 break 23893 } 23894 v_0 := v.Args[0] 23895 if v_0.Op != OpARMSUBshiftLL { 23896 break 23897 } 23898 c := v_0.AuxInt 23899 _ = v_0.Args[1] 23900 x := v_0.Args[0] 23901 y := v_0.Args[1] 23902 b.Kind = BlockARMNE 23903 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) 23904 v0.AuxInt = c 23905 v0.AddArg(x) 23906 v0.AddArg(y) 23907 b.SetControl(v0) 23908 b.Aux = nil 23909 return true 23910 } 23911 // match: (NE (CMPconst [0] (SUBshiftRL x y [c])) yes no) 23912 // cond: 23913 // result: (NE (CMPshiftRL x y [c]) yes no) 23914 for { 23915 v := b.Control 23916 if v.Op != OpARMCMPconst { 23917 break 23918 } 23919 if v.AuxInt != 0 { 23920 break 23921 } 23922 v_0 := v.Args[0] 23923 if v_0.Op != OpARMSUBshiftRL { 23924 break 23925 } 23926 c := v_0.AuxInt 23927 _ = v_0.Args[1] 23928 x := v_0.Args[0] 23929 y := v_0.Args[1] 23930 b.Kind = BlockARMNE 23931 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) 23932 v0.AuxInt = c 23933 v0.AddArg(x) 23934 v0.AddArg(y) 23935 b.SetControl(v0) 23936 b.Aux = nil 23937 return true 23938 } 23939 // match: (NE (CMPconst [0] (SUBshiftRA x y [c])) yes no) 23940 // cond: 23941 // result: (NE (CMPshiftRA x y [c]) yes no) 23942 for { 23943 v := b.Control 23944 if v.Op != OpARMCMPconst { 23945 break 23946 } 23947 if v.AuxInt != 0 { 23948 break 23949 } 23950 v_0 := v.Args[0] 23951 if v_0.Op != OpARMSUBshiftRA { 23952 break 23953 } 23954 c := v_0.AuxInt 23955 _ = v_0.Args[1] 23956 x := v_0.Args[0] 23957 y := v_0.Args[1] 23958 b.Kind = BlockARMNE 23959 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) 23960 v0.AuxInt = c 23961 v0.AddArg(x) 23962 v0.AddArg(y) 23963 b.SetControl(v0) 23964 b.Aux = nil 23965 return true 23966 } 23967 // match: (NE (CMPconst [0] (SUBshiftLLreg x y z)) yes no) 23968 // cond: 23969 // result: (NE (CMPshiftLLreg x y z) yes no) 23970 for { 23971 v := b.Control 23972 if v.Op != OpARMCMPconst { 23973 break 23974 } 23975 if v.AuxInt != 0 { 23976 break 23977 } 23978 v_0 := v.Args[0] 23979 if v_0.Op != OpARMSUBshiftLLreg { 23980 break 23981 } 23982 _ = v_0.Args[2] 23983 x := v_0.Args[0] 23984 y := v_0.Args[1] 23985 z := v_0.Args[2] 23986 b.Kind = BlockARMNE 23987 v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) 23988 v0.AddArg(x) 23989 v0.AddArg(y) 23990 v0.AddArg(z) 23991 b.SetControl(v0) 23992 b.Aux = nil 23993 return true 23994 } 23995 // match: (NE (CMPconst [0] (SUBshiftRLreg x y z)) yes no) 23996 // cond: 23997 // result: (NE (CMPshiftRLreg x y z) yes no) 23998 for { 23999 v := b.Control 24000 if v.Op != OpARMCMPconst { 24001 break 24002 } 24003 if v.AuxInt != 0 { 24004 break 24005 } 24006 v_0 := v.Args[0] 24007 if v_0.Op != OpARMSUBshiftRLreg { 24008 break 24009 } 24010 _ = v_0.Args[2] 24011 x := v_0.Args[0] 24012 y := v_0.Args[1] 24013 z := v_0.Args[2] 24014 b.Kind = BlockARMNE 24015 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) 24016 v0.AddArg(x) 24017 v0.AddArg(y) 24018 v0.AddArg(z) 24019 b.SetControl(v0) 24020 b.Aux = nil 24021 return true 24022 } 24023 // match: (NE (CMPconst [0] (SUBshiftRAreg x y z)) yes no) 24024 // cond: 24025 // result: (NE (CMPshiftRAreg x y z) yes no) 24026 for { 24027 v := b.Control 24028 if v.Op != OpARMCMPconst { 24029 break 24030 } 24031 if v.AuxInt != 0 { 24032 break 24033 } 24034 v_0 := v.Args[0] 24035 if v_0.Op != OpARMSUBshiftRAreg { 24036 break 24037 } 24038 _ = v_0.Args[2] 24039 x := v_0.Args[0] 24040 y := v_0.Args[1] 24041 z := v_0.Args[2] 24042 b.Kind = BlockARMNE 24043 v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) 24044 v0.AddArg(x) 24045 v0.AddArg(y) 24046 v0.AddArg(z) 24047 b.SetControl(v0) 24048 b.Aux = nil 24049 return true 24050 } 24051 // match: (NE (CMPconst [0] (ADD x y)) yes no) 24052 // cond: 24053 // result: (NE (CMN x y) yes no) 24054 for { 24055 v := b.Control 24056 if v.Op != OpARMCMPconst { 24057 break 24058 } 24059 if v.AuxInt != 0 { 24060 break 24061 } 24062 v_0 := v.Args[0] 24063 if v_0.Op != OpARMADD { 24064 break 24065 } 24066 _ = v_0.Args[1] 24067 x := v_0.Args[0] 24068 y := v_0.Args[1] 24069 b.Kind = BlockARMNE 24070 v0 := b.NewValue0(v.Pos, OpARMCMN, types.TypeFlags) 24071 v0.AddArg(x) 24072 v0.AddArg(y) 24073 b.SetControl(v0) 24074 b.Aux = nil 24075 return true 24076 } 24077 // match: (NE (CMPconst [0] (ADDconst [c] x)) yes no) 24078 // cond: 24079 // result: (NE (CMNconst [c] x) yes no) 24080 for { 24081 v := b.Control 24082 if v.Op != OpARMCMPconst { 24083 break 24084 } 24085 if v.AuxInt != 0 { 24086 break 24087 } 24088 v_0 := v.Args[0] 24089 if v_0.Op != OpARMADDconst { 24090 break 24091 } 24092 c := v_0.AuxInt 24093 x := v_0.Args[0] 24094 b.Kind = BlockARMNE 24095 v0 := b.NewValue0(v.Pos, OpARMCMNconst, types.TypeFlags) 24096 v0.AuxInt = c 24097 v0.AddArg(x) 24098 b.SetControl(v0) 24099 b.Aux = nil 24100 return true 24101 } 24102 // match: (NE (CMPconst [0] (ADDshiftLL x y [c])) yes no) 24103 // cond: 24104 // result: (NE (CMNshiftLL x y [c]) yes no) 24105 for { 24106 v := b.Control 24107 if v.Op != OpARMCMPconst { 24108 break 24109 } 24110 if v.AuxInt != 0 { 24111 break 24112 } 24113 v_0 := v.Args[0] 24114 if v_0.Op != OpARMADDshiftLL { 24115 break 24116 } 24117 c := v_0.AuxInt 24118 _ = v_0.Args[1] 24119 x := v_0.Args[0] 24120 y := v_0.Args[1] 24121 b.Kind = BlockARMNE 24122 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLL, types.TypeFlags) 24123 v0.AuxInt = c 24124 v0.AddArg(x) 24125 v0.AddArg(y) 24126 b.SetControl(v0) 24127 b.Aux = nil 24128 return true 24129 } 24130 // match: (NE (CMPconst [0] (ADDshiftRL x y [c])) yes no) 24131 // cond: 24132 // result: (NE (CMNshiftRL x y [c]) yes no) 24133 for { 24134 v := b.Control 24135 if v.Op != OpARMCMPconst { 24136 break 24137 } 24138 if v.AuxInt != 0 { 24139 break 24140 } 24141 v_0 := v.Args[0] 24142 if v_0.Op != OpARMADDshiftRL { 24143 break 24144 } 24145 c := v_0.AuxInt 24146 _ = v_0.Args[1] 24147 x := v_0.Args[0] 24148 y := v_0.Args[1] 24149 b.Kind = BlockARMNE 24150 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRL, types.TypeFlags) 24151 v0.AuxInt = c 24152 v0.AddArg(x) 24153 v0.AddArg(y) 24154 b.SetControl(v0) 24155 b.Aux = nil 24156 return true 24157 } 24158 // match: (NE (CMPconst [0] (ADDshiftRA x y [c])) yes no) 24159 // cond: 24160 // result: (NE (CMNshiftRA x y [c]) yes no) 24161 for { 24162 v := b.Control 24163 if v.Op != OpARMCMPconst { 24164 break 24165 } 24166 if v.AuxInt != 0 { 24167 break 24168 } 24169 v_0 := v.Args[0] 24170 if v_0.Op != OpARMADDshiftRA { 24171 break 24172 } 24173 c := v_0.AuxInt 24174 _ = v_0.Args[1] 24175 x := v_0.Args[0] 24176 y := v_0.Args[1] 24177 b.Kind = BlockARMNE 24178 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRA, types.TypeFlags) 24179 v0.AuxInt = c 24180 v0.AddArg(x) 24181 v0.AddArg(y) 24182 b.SetControl(v0) 24183 b.Aux = nil 24184 return true 24185 } 24186 // match: (NE (CMPconst [0] (ADDshiftLLreg x y z)) yes no) 24187 // cond: 24188 // result: (NE (CMNshiftLLreg x y z) yes no) 24189 for { 24190 v := b.Control 24191 if v.Op != OpARMCMPconst { 24192 break 24193 } 24194 if v.AuxInt != 0 { 24195 break 24196 } 24197 v_0 := v.Args[0] 24198 if v_0.Op != OpARMADDshiftLLreg { 24199 break 24200 } 24201 _ = v_0.Args[2] 24202 x := v_0.Args[0] 24203 y := v_0.Args[1] 24204 z := v_0.Args[2] 24205 b.Kind = BlockARMNE 24206 v0 := b.NewValue0(v.Pos, OpARMCMNshiftLLreg, types.TypeFlags) 24207 v0.AddArg(x) 24208 v0.AddArg(y) 24209 v0.AddArg(z) 24210 b.SetControl(v0) 24211 b.Aux = nil 24212 return true 24213 } 24214 // match: (NE (CMPconst [0] (ADDshiftRLreg x y z)) yes no) 24215 // cond: 24216 // result: (NE (CMNshiftRLreg x y z) yes no) 24217 for { 24218 v := b.Control 24219 if v.Op != OpARMCMPconst { 24220 break 24221 } 24222 if v.AuxInt != 0 { 24223 break 24224 } 24225 v_0 := v.Args[0] 24226 if v_0.Op != OpARMADDshiftRLreg { 24227 break 24228 } 24229 _ = v_0.Args[2] 24230 x := v_0.Args[0] 24231 y := v_0.Args[1] 24232 z := v_0.Args[2] 24233 b.Kind = BlockARMNE 24234 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRLreg, types.TypeFlags) 24235 v0.AddArg(x) 24236 v0.AddArg(y) 24237 v0.AddArg(z) 24238 b.SetControl(v0) 24239 b.Aux = nil 24240 return true 24241 } 24242 // match: (NE (CMPconst [0] (ADDshiftRAreg x y z)) yes no) 24243 // cond: 24244 // result: (NE (CMNshiftRAreg x y z) yes no) 24245 for { 24246 v := b.Control 24247 if v.Op != OpARMCMPconst { 24248 break 24249 } 24250 if v.AuxInt != 0 { 24251 break 24252 } 24253 v_0 := v.Args[0] 24254 if v_0.Op != OpARMADDshiftRAreg { 24255 break 24256 } 24257 _ = v_0.Args[2] 24258 x := v_0.Args[0] 24259 y := v_0.Args[1] 24260 z := v_0.Args[2] 24261 b.Kind = BlockARMNE 24262 v0 := b.NewValue0(v.Pos, OpARMCMNshiftRAreg, types.TypeFlags) 24263 v0.AddArg(x) 24264 v0.AddArg(y) 24265 v0.AddArg(z) 24266 b.SetControl(v0) 24267 b.Aux = nil 24268 return true 24269 } 24270 // match: (NE (CMPconst [0] (AND x y)) yes no) 24271 // cond: 24272 // result: (NE (TST x y) yes no) 24273 for { 24274 v := b.Control 24275 if v.Op != OpARMCMPconst { 24276 break 24277 } 24278 if v.AuxInt != 0 { 24279 break 24280 } 24281 v_0 := v.Args[0] 24282 if v_0.Op != OpARMAND { 24283 break 24284 } 24285 _ = v_0.Args[1] 24286 x := v_0.Args[0] 24287 y := v_0.Args[1] 24288 b.Kind = BlockARMNE 24289 v0 := b.NewValue0(v.Pos, OpARMTST, types.TypeFlags) 24290 v0.AddArg(x) 24291 v0.AddArg(y) 24292 b.SetControl(v0) 24293 b.Aux = nil 24294 return true 24295 } 24296 // match: (NE (CMPconst [0] (ANDconst [c] x)) yes no) 24297 // cond: 24298 // result: (NE (TSTconst [c] x) yes no) 24299 for { 24300 v := b.Control 24301 if v.Op != OpARMCMPconst { 24302 break 24303 } 24304 if v.AuxInt != 0 { 24305 break 24306 } 24307 v_0 := v.Args[0] 24308 if v_0.Op != OpARMANDconst { 24309 break 24310 } 24311 c := v_0.AuxInt 24312 x := v_0.Args[0] 24313 b.Kind = BlockARMNE 24314 v0 := b.NewValue0(v.Pos, OpARMTSTconst, types.TypeFlags) 24315 v0.AuxInt = c 24316 v0.AddArg(x) 24317 b.SetControl(v0) 24318 b.Aux = nil 24319 return true 24320 } 24321 // match: (NE (CMPconst [0] (ANDshiftLL x y [c])) yes no) 24322 // cond: 24323 // result: (NE (TSTshiftLL x y [c]) yes no) 24324 for { 24325 v := b.Control 24326 if v.Op != OpARMCMPconst { 24327 break 24328 } 24329 if v.AuxInt != 0 { 24330 break 24331 } 24332 v_0 := v.Args[0] 24333 if v_0.Op != OpARMANDshiftLL { 24334 break 24335 } 24336 c := v_0.AuxInt 24337 _ = v_0.Args[1] 24338 x := v_0.Args[0] 24339 y := v_0.Args[1] 24340 b.Kind = BlockARMNE 24341 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLL, types.TypeFlags) 24342 v0.AuxInt = c 24343 v0.AddArg(x) 24344 v0.AddArg(y) 24345 b.SetControl(v0) 24346 b.Aux = nil 24347 return true 24348 } 24349 // match: (NE (CMPconst [0] (ANDshiftRL x y [c])) yes no) 24350 // cond: 24351 // result: (NE (TSTshiftRL x y [c]) yes no) 24352 for { 24353 v := b.Control 24354 if v.Op != OpARMCMPconst { 24355 break 24356 } 24357 if v.AuxInt != 0 { 24358 break 24359 } 24360 v_0 := v.Args[0] 24361 if v_0.Op != OpARMANDshiftRL { 24362 break 24363 } 24364 c := v_0.AuxInt 24365 _ = v_0.Args[1] 24366 x := v_0.Args[0] 24367 y := v_0.Args[1] 24368 b.Kind = BlockARMNE 24369 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRL, types.TypeFlags) 24370 v0.AuxInt = c 24371 v0.AddArg(x) 24372 v0.AddArg(y) 24373 b.SetControl(v0) 24374 b.Aux = nil 24375 return true 24376 } 24377 // match: (NE (CMPconst [0] (ANDshiftRA x y [c])) yes no) 24378 // cond: 24379 // result: (NE (TSTshiftRA x y [c]) yes no) 24380 for { 24381 v := b.Control 24382 if v.Op != OpARMCMPconst { 24383 break 24384 } 24385 if v.AuxInt != 0 { 24386 break 24387 } 24388 v_0 := v.Args[0] 24389 if v_0.Op != OpARMANDshiftRA { 24390 break 24391 } 24392 c := v_0.AuxInt 24393 _ = v_0.Args[1] 24394 x := v_0.Args[0] 24395 y := v_0.Args[1] 24396 b.Kind = BlockARMNE 24397 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRA, types.TypeFlags) 24398 v0.AuxInt = c 24399 v0.AddArg(x) 24400 v0.AddArg(y) 24401 b.SetControl(v0) 24402 b.Aux = nil 24403 return true 24404 } 24405 // match: (NE (CMPconst [0] (ANDshiftLLreg x y z)) yes no) 24406 // cond: 24407 // result: (NE (TSTshiftLLreg x y z) yes no) 24408 for { 24409 v := b.Control 24410 if v.Op != OpARMCMPconst { 24411 break 24412 } 24413 if v.AuxInt != 0 { 24414 break 24415 } 24416 v_0 := v.Args[0] 24417 if v_0.Op != OpARMANDshiftLLreg { 24418 break 24419 } 24420 _ = v_0.Args[2] 24421 x := v_0.Args[0] 24422 y := v_0.Args[1] 24423 z := v_0.Args[2] 24424 b.Kind = BlockARMNE 24425 v0 := b.NewValue0(v.Pos, OpARMTSTshiftLLreg, types.TypeFlags) 24426 v0.AddArg(x) 24427 v0.AddArg(y) 24428 v0.AddArg(z) 24429 b.SetControl(v0) 24430 b.Aux = nil 24431 return true 24432 } 24433 // match: (NE (CMPconst [0] (ANDshiftRLreg x y z)) yes no) 24434 // cond: 24435 // result: (NE (TSTshiftRLreg x y z) yes no) 24436 for { 24437 v := b.Control 24438 if v.Op != OpARMCMPconst { 24439 break 24440 } 24441 if v.AuxInt != 0 { 24442 break 24443 } 24444 v_0 := v.Args[0] 24445 if v_0.Op != OpARMANDshiftRLreg { 24446 break 24447 } 24448 _ = v_0.Args[2] 24449 x := v_0.Args[0] 24450 y := v_0.Args[1] 24451 z := v_0.Args[2] 24452 b.Kind = BlockARMNE 24453 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRLreg, types.TypeFlags) 24454 v0.AddArg(x) 24455 v0.AddArg(y) 24456 v0.AddArg(z) 24457 b.SetControl(v0) 24458 b.Aux = nil 24459 return true 24460 } 24461 // match: (NE (CMPconst [0] (ANDshiftRAreg x y z)) yes no) 24462 // cond: 24463 // result: (NE (TSTshiftRAreg x y z) yes no) 24464 for { 24465 v := b.Control 24466 if v.Op != OpARMCMPconst { 24467 break 24468 } 24469 if v.AuxInt != 0 { 24470 break 24471 } 24472 v_0 := v.Args[0] 24473 if v_0.Op != OpARMANDshiftRAreg { 24474 break 24475 } 24476 _ = v_0.Args[2] 24477 x := v_0.Args[0] 24478 y := v_0.Args[1] 24479 z := v_0.Args[2] 24480 b.Kind = BlockARMNE 24481 v0 := b.NewValue0(v.Pos, OpARMTSTshiftRAreg, types.TypeFlags) 24482 v0.AddArg(x) 24483 v0.AddArg(y) 24484 v0.AddArg(z) 24485 b.SetControl(v0) 24486 b.Aux = nil 24487 return true 24488 } 24489 // match: (NE (CMPconst [0] (XOR x y)) yes no) 24490 // cond: 24491 // result: (NE (TEQ x y) yes no) 24492 for { 24493 v := b.Control 24494 if v.Op != OpARMCMPconst { 24495 break 24496 } 24497 if v.AuxInt != 0 { 24498 break 24499 } 24500 v_0 := v.Args[0] 24501 if v_0.Op != OpARMXOR { 24502 break 24503 } 24504 _ = v_0.Args[1] 24505 x := v_0.Args[0] 24506 y := v_0.Args[1] 24507 b.Kind = BlockARMNE 24508 v0 := b.NewValue0(v.Pos, OpARMTEQ, types.TypeFlags) 24509 v0.AddArg(x) 24510 v0.AddArg(y) 24511 b.SetControl(v0) 24512 b.Aux = nil 24513 return true 24514 } 24515 // match: (NE (CMPconst [0] (XORconst [c] x)) yes no) 24516 // cond: 24517 // result: (NE (TEQconst [c] x) yes no) 24518 for { 24519 v := b.Control 24520 if v.Op != OpARMCMPconst { 24521 break 24522 } 24523 if v.AuxInt != 0 { 24524 break 24525 } 24526 v_0 := v.Args[0] 24527 if v_0.Op != OpARMXORconst { 24528 break 24529 } 24530 c := v_0.AuxInt 24531 x := v_0.Args[0] 24532 b.Kind = BlockARMNE 24533 v0 := b.NewValue0(v.Pos, OpARMTEQconst, types.TypeFlags) 24534 v0.AuxInt = c 24535 v0.AddArg(x) 24536 b.SetControl(v0) 24537 b.Aux = nil 24538 return true 24539 } 24540 // match: (NE (CMPconst [0] (XORshiftLL x y [c])) yes no) 24541 // cond: 24542 // result: (NE (TEQshiftLL x y [c]) yes no) 24543 for { 24544 v := b.Control 24545 if v.Op != OpARMCMPconst { 24546 break 24547 } 24548 if v.AuxInt != 0 { 24549 break 24550 } 24551 v_0 := v.Args[0] 24552 if v_0.Op != OpARMXORshiftLL { 24553 break 24554 } 24555 c := v_0.AuxInt 24556 _ = v_0.Args[1] 24557 x := v_0.Args[0] 24558 y := v_0.Args[1] 24559 b.Kind = BlockARMNE 24560 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLL, types.TypeFlags) 24561 v0.AuxInt = c 24562 v0.AddArg(x) 24563 v0.AddArg(y) 24564 b.SetControl(v0) 24565 b.Aux = nil 24566 return true 24567 } 24568 // match: (NE (CMPconst [0] (XORshiftRL x y [c])) yes no) 24569 // cond: 24570 // result: (NE (TEQshiftRL x y [c]) yes no) 24571 for { 24572 v := b.Control 24573 if v.Op != OpARMCMPconst { 24574 break 24575 } 24576 if v.AuxInt != 0 { 24577 break 24578 } 24579 v_0 := v.Args[0] 24580 if v_0.Op != OpARMXORshiftRL { 24581 break 24582 } 24583 c := v_0.AuxInt 24584 _ = v_0.Args[1] 24585 x := v_0.Args[0] 24586 y := v_0.Args[1] 24587 b.Kind = BlockARMNE 24588 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRL, types.TypeFlags) 24589 v0.AuxInt = c 24590 v0.AddArg(x) 24591 v0.AddArg(y) 24592 b.SetControl(v0) 24593 b.Aux = nil 24594 return true 24595 } 24596 // match: (NE (CMPconst [0] (XORshiftRA x y [c])) yes no) 24597 // cond: 24598 // result: (NE (TEQshiftRA x y [c]) yes no) 24599 for { 24600 v := b.Control 24601 if v.Op != OpARMCMPconst { 24602 break 24603 } 24604 if v.AuxInt != 0 { 24605 break 24606 } 24607 v_0 := v.Args[0] 24608 if v_0.Op != OpARMXORshiftRA { 24609 break 24610 } 24611 c := v_0.AuxInt 24612 _ = v_0.Args[1] 24613 x := v_0.Args[0] 24614 y := v_0.Args[1] 24615 b.Kind = BlockARMNE 24616 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRA, types.TypeFlags) 24617 v0.AuxInt = c 24618 v0.AddArg(x) 24619 v0.AddArg(y) 24620 b.SetControl(v0) 24621 b.Aux = nil 24622 return true 24623 } 24624 // match: (NE (CMPconst [0] (XORshiftLLreg x y z)) yes no) 24625 // cond: 24626 // result: (NE (TEQshiftLLreg x y z) yes no) 24627 for { 24628 v := b.Control 24629 if v.Op != OpARMCMPconst { 24630 break 24631 } 24632 if v.AuxInt != 0 { 24633 break 24634 } 24635 v_0 := v.Args[0] 24636 if v_0.Op != OpARMXORshiftLLreg { 24637 break 24638 } 24639 _ = v_0.Args[2] 24640 x := v_0.Args[0] 24641 y := v_0.Args[1] 24642 z := v_0.Args[2] 24643 b.Kind = BlockARMNE 24644 v0 := b.NewValue0(v.Pos, OpARMTEQshiftLLreg, types.TypeFlags) 24645 v0.AddArg(x) 24646 v0.AddArg(y) 24647 v0.AddArg(z) 24648 b.SetControl(v0) 24649 b.Aux = nil 24650 return true 24651 } 24652 // match: (NE (CMPconst [0] (XORshiftRLreg x y z)) yes no) 24653 // cond: 24654 // result: (NE (TEQshiftRLreg x y z) yes no) 24655 for { 24656 v := b.Control 24657 if v.Op != OpARMCMPconst { 24658 break 24659 } 24660 if v.AuxInt != 0 { 24661 break 24662 } 24663 v_0 := v.Args[0] 24664 if v_0.Op != OpARMXORshiftRLreg { 24665 break 24666 } 24667 _ = v_0.Args[2] 24668 x := v_0.Args[0] 24669 y := v_0.Args[1] 24670 z := v_0.Args[2] 24671 b.Kind = BlockARMNE 24672 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRLreg, types.TypeFlags) 24673 v0.AddArg(x) 24674 v0.AddArg(y) 24675 v0.AddArg(z) 24676 b.SetControl(v0) 24677 b.Aux = nil 24678 return true 24679 } 24680 // match: (NE (CMPconst [0] (XORshiftRAreg x y z)) yes no) 24681 // cond: 24682 // result: (NE (TEQshiftRAreg x y z) yes no) 24683 for { 24684 v := b.Control 24685 if v.Op != OpARMCMPconst { 24686 break 24687 } 24688 if v.AuxInt != 0 { 24689 break 24690 } 24691 v_0 := v.Args[0] 24692 if v_0.Op != OpARMXORshiftRAreg { 24693 break 24694 } 24695 _ = v_0.Args[2] 24696 x := v_0.Args[0] 24697 y := v_0.Args[1] 24698 z := v_0.Args[2] 24699 b.Kind = BlockARMNE 24700 v0 := b.NewValue0(v.Pos, OpARMTEQshiftRAreg, types.TypeFlags) 24701 v0.AddArg(x) 24702 v0.AddArg(y) 24703 v0.AddArg(z) 24704 b.SetControl(v0) 24705 b.Aux = nil 24706 return true 24707 } 24708 case BlockARMUGE: 24709 // match: (UGE (FlagEQ) yes no) 24710 // cond: 24711 // result: (First nil yes no) 24712 for { 24713 v := b.Control 24714 if v.Op != OpARMFlagEQ { 24715 break 24716 } 24717 b.Kind = BlockFirst 24718 b.SetControl(nil) 24719 b.Aux = nil 24720 return true 24721 } 24722 // match: (UGE (FlagLT_ULT) yes no) 24723 // cond: 24724 // result: (First nil no yes) 24725 for { 24726 v := b.Control 24727 if v.Op != OpARMFlagLT_ULT { 24728 break 24729 } 24730 b.Kind = BlockFirst 24731 b.SetControl(nil) 24732 b.Aux = nil 24733 b.swapSuccessors() 24734 return true 24735 } 24736 // match: (UGE (FlagLT_UGT) yes no) 24737 // cond: 24738 // result: (First nil yes no) 24739 for { 24740 v := b.Control 24741 if v.Op != OpARMFlagLT_UGT { 24742 break 24743 } 24744 b.Kind = BlockFirst 24745 b.SetControl(nil) 24746 b.Aux = nil 24747 return true 24748 } 24749 // match: (UGE (FlagGT_ULT) yes no) 24750 // cond: 24751 // result: (First nil no yes) 24752 for { 24753 v := b.Control 24754 if v.Op != OpARMFlagGT_ULT { 24755 break 24756 } 24757 b.Kind = BlockFirst 24758 b.SetControl(nil) 24759 b.Aux = nil 24760 b.swapSuccessors() 24761 return true 24762 } 24763 // match: (UGE (FlagGT_UGT) yes no) 24764 // cond: 24765 // result: (First nil yes no) 24766 for { 24767 v := b.Control 24768 if v.Op != OpARMFlagGT_UGT { 24769 break 24770 } 24771 b.Kind = BlockFirst 24772 b.SetControl(nil) 24773 b.Aux = nil 24774 return true 24775 } 24776 // match: (UGE (InvertFlags cmp) yes no) 24777 // cond: 24778 // result: (ULE cmp yes no) 24779 for { 24780 v := b.Control 24781 if v.Op != OpARMInvertFlags { 24782 break 24783 } 24784 cmp := v.Args[0] 24785 b.Kind = BlockARMULE 24786 b.SetControl(cmp) 24787 b.Aux = nil 24788 return true 24789 } 24790 case BlockARMUGT: 24791 // match: (UGT (FlagEQ) yes no) 24792 // cond: 24793 // result: (First nil no yes) 24794 for { 24795 v := b.Control 24796 if v.Op != OpARMFlagEQ { 24797 break 24798 } 24799 b.Kind = BlockFirst 24800 b.SetControl(nil) 24801 b.Aux = nil 24802 b.swapSuccessors() 24803 return true 24804 } 24805 // match: (UGT (FlagLT_ULT) yes no) 24806 // cond: 24807 // result: (First nil no yes) 24808 for { 24809 v := b.Control 24810 if v.Op != OpARMFlagLT_ULT { 24811 break 24812 } 24813 b.Kind = BlockFirst 24814 b.SetControl(nil) 24815 b.Aux = nil 24816 b.swapSuccessors() 24817 return true 24818 } 24819 // match: (UGT (FlagLT_UGT) yes no) 24820 // cond: 24821 // result: (First nil yes no) 24822 for { 24823 v := b.Control 24824 if v.Op != OpARMFlagLT_UGT { 24825 break 24826 } 24827 b.Kind = BlockFirst 24828 b.SetControl(nil) 24829 b.Aux = nil 24830 return true 24831 } 24832 // match: (UGT (FlagGT_ULT) yes no) 24833 // cond: 24834 // result: (First nil no yes) 24835 for { 24836 v := b.Control 24837 if v.Op != OpARMFlagGT_ULT { 24838 break 24839 } 24840 b.Kind = BlockFirst 24841 b.SetControl(nil) 24842 b.Aux = nil 24843 b.swapSuccessors() 24844 return true 24845 } 24846 // match: (UGT (FlagGT_UGT) yes no) 24847 // cond: 24848 // result: (First nil yes no) 24849 for { 24850 v := b.Control 24851 if v.Op != OpARMFlagGT_UGT { 24852 break 24853 } 24854 b.Kind = BlockFirst 24855 b.SetControl(nil) 24856 b.Aux = nil 24857 return true 24858 } 24859 // match: (UGT (InvertFlags cmp) yes no) 24860 // cond: 24861 // result: (ULT cmp yes no) 24862 for { 24863 v := b.Control 24864 if v.Op != OpARMInvertFlags { 24865 break 24866 } 24867 cmp := v.Args[0] 24868 b.Kind = BlockARMULT 24869 b.SetControl(cmp) 24870 b.Aux = nil 24871 return true 24872 } 24873 case BlockARMULE: 24874 // match: (ULE (FlagEQ) yes no) 24875 // cond: 24876 // result: (First nil yes no) 24877 for { 24878 v := b.Control 24879 if v.Op != OpARMFlagEQ { 24880 break 24881 } 24882 b.Kind = BlockFirst 24883 b.SetControl(nil) 24884 b.Aux = nil 24885 return true 24886 } 24887 // match: (ULE (FlagLT_ULT) yes no) 24888 // cond: 24889 // result: (First nil yes no) 24890 for { 24891 v := b.Control 24892 if v.Op != OpARMFlagLT_ULT { 24893 break 24894 } 24895 b.Kind = BlockFirst 24896 b.SetControl(nil) 24897 b.Aux = nil 24898 return true 24899 } 24900 // match: (ULE (FlagLT_UGT) yes no) 24901 // cond: 24902 // result: (First nil no yes) 24903 for { 24904 v := b.Control 24905 if v.Op != OpARMFlagLT_UGT { 24906 break 24907 } 24908 b.Kind = BlockFirst 24909 b.SetControl(nil) 24910 b.Aux = nil 24911 b.swapSuccessors() 24912 return true 24913 } 24914 // match: (ULE (FlagGT_ULT) yes no) 24915 // cond: 24916 // result: (First nil yes no) 24917 for { 24918 v := b.Control 24919 if v.Op != OpARMFlagGT_ULT { 24920 break 24921 } 24922 b.Kind = BlockFirst 24923 b.SetControl(nil) 24924 b.Aux = nil 24925 return true 24926 } 24927 // match: (ULE (FlagGT_UGT) yes no) 24928 // cond: 24929 // result: (First nil no yes) 24930 for { 24931 v := b.Control 24932 if v.Op != OpARMFlagGT_UGT { 24933 break 24934 } 24935 b.Kind = BlockFirst 24936 b.SetControl(nil) 24937 b.Aux = nil 24938 b.swapSuccessors() 24939 return true 24940 } 24941 // match: (ULE (InvertFlags cmp) yes no) 24942 // cond: 24943 // result: (UGE cmp yes no) 24944 for { 24945 v := b.Control 24946 if v.Op != OpARMInvertFlags { 24947 break 24948 } 24949 cmp := v.Args[0] 24950 b.Kind = BlockARMUGE 24951 b.SetControl(cmp) 24952 b.Aux = nil 24953 return true 24954 } 24955 case BlockARMULT: 24956 // match: (ULT (FlagEQ) yes no) 24957 // cond: 24958 // result: (First nil no yes) 24959 for { 24960 v := b.Control 24961 if v.Op != OpARMFlagEQ { 24962 break 24963 } 24964 b.Kind = BlockFirst 24965 b.SetControl(nil) 24966 b.Aux = nil 24967 b.swapSuccessors() 24968 return true 24969 } 24970 // match: (ULT (FlagLT_ULT) yes no) 24971 // cond: 24972 // result: (First nil yes no) 24973 for { 24974 v := b.Control 24975 if v.Op != OpARMFlagLT_ULT { 24976 break 24977 } 24978 b.Kind = BlockFirst 24979 b.SetControl(nil) 24980 b.Aux = nil 24981 return true 24982 } 24983 // match: (ULT (FlagLT_UGT) yes no) 24984 // cond: 24985 // result: (First nil no yes) 24986 for { 24987 v := b.Control 24988 if v.Op != OpARMFlagLT_UGT { 24989 break 24990 } 24991 b.Kind = BlockFirst 24992 b.SetControl(nil) 24993 b.Aux = nil 24994 b.swapSuccessors() 24995 return true 24996 } 24997 // match: (ULT (FlagGT_ULT) yes no) 24998 // cond: 24999 // result: (First nil yes no) 25000 for { 25001 v := b.Control 25002 if v.Op != OpARMFlagGT_ULT { 25003 break 25004 } 25005 b.Kind = BlockFirst 25006 b.SetControl(nil) 25007 b.Aux = nil 25008 return true 25009 } 25010 // match: (ULT (FlagGT_UGT) yes no) 25011 // cond: 25012 // result: (First nil no yes) 25013 for { 25014 v := b.Control 25015 if v.Op != OpARMFlagGT_UGT { 25016 break 25017 } 25018 b.Kind = BlockFirst 25019 b.SetControl(nil) 25020 b.Aux = nil 25021 b.swapSuccessors() 25022 return true 25023 } 25024 // match: (ULT (InvertFlags cmp) yes no) 25025 // cond: 25026 // result: (UGT cmp yes no) 25027 for { 25028 v := b.Control 25029 if v.Op != OpARMInvertFlags { 25030 break 25031 } 25032 cmp := v.Args[0] 25033 b.Kind = BlockARMUGT 25034 b.SetControl(cmp) 25035 b.Aux = nil 25036 return true 25037 } 25038 } 25039 return false 25040 }