github.com/slayercat/go@v0.0.0-20170428012452-c51559813f61/src/cmd/compile/internal/ssa/rewritegeneric.go (about) 1 // Code generated from gen/generic.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 10 var _ = math.MinInt8 // in case not otherwise used 11 var _ = obj.ANOP // in case not otherwise used 12 var _ = objabi.GOROOT // in case not otherwise used 13 14 func rewriteValuegeneric(v *Value) bool { 15 switch v.Op { 16 case OpAdd16: 17 return rewriteValuegeneric_OpAdd16_0(v) || rewriteValuegeneric_OpAdd16_10(v) || rewriteValuegeneric_OpAdd16_20(v) 18 case OpAdd32: 19 return rewriteValuegeneric_OpAdd32_0(v) || rewriteValuegeneric_OpAdd32_10(v) || rewriteValuegeneric_OpAdd32_20(v) 20 case OpAdd32F: 21 return rewriteValuegeneric_OpAdd32F_0(v) 22 case OpAdd64: 23 return rewriteValuegeneric_OpAdd64_0(v) || rewriteValuegeneric_OpAdd64_10(v) || rewriteValuegeneric_OpAdd64_20(v) 24 case OpAdd64F: 25 return rewriteValuegeneric_OpAdd64F_0(v) 26 case OpAdd8: 27 return rewriteValuegeneric_OpAdd8_0(v) || rewriteValuegeneric_OpAdd8_10(v) || rewriteValuegeneric_OpAdd8_20(v) 28 case OpAddPtr: 29 return rewriteValuegeneric_OpAddPtr_0(v) 30 case OpAnd16: 31 return rewriteValuegeneric_OpAnd16_0(v) || rewriteValuegeneric_OpAnd16_10(v) 32 case OpAnd32: 33 return rewriteValuegeneric_OpAnd32_0(v) || rewriteValuegeneric_OpAnd32_10(v) 34 case OpAnd64: 35 return rewriteValuegeneric_OpAnd64_0(v) || rewriteValuegeneric_OpAnd64_10(v) || rewriteValuegeneric_OpAnd64_20(v) 36 case OpAnd8: 37 return rewriteValuegeneric_OpAnd8_0(v) || rewriteValuegeneric_OpAnd8_10(v) 38 case OpArg: 39 return rewriteValuegeneric_OpArg_0(v) || rewriteValuegeneric_OpArg_10(v) 40 case OpArraySelect: 41 return rewriteValuegeneric_OpArraySelect_0(v) 42 case OpCom16: 43 return rewriteValuegeneric_OpCom16_0(v) 44 case OpCom32: 45 return rewriteValuegeneric_OpCom32_0(v) 46 case OpCom64: 47 return rewriteValuegeneric_OpCom64_0(v) 48 case OpCom8: 49 return rewriteValuegeneric_OpCom8_0(v) 50 case OpConstInterface: 51 return rewriteValuegeneric_OpConstInterface_0(v) 52 case OpConstSlice: 53 return rewriteValuegeneric_OpConstSlice_0(v) 54 case OpConstString: 55 return rewriteValuegeneric_OpConstString_0(v) 56 case OpConvert: 57 return rewriteValuegeneric_OpConvert_0(v) 58 case OpCvt32Fto64F: 59 return rewriteValuegeneric_OpCvt32Fto64F_0(v) 60 case OpCvt64Fto32F: 61 return rewriteValuegeneric_OpCvt64Fto32F_0(v) 62 case OpDiv16: 63 return rewriteValuegeneric_OpDiv16_0(v) 64 case OpDiv16u: 65 return rewriteValuegeneric_OpDiv16u_0(v) 66 case OpDiv32: 67 return rewriteValuegeneric_OpDiv32_0(v) 68 case OpDiv32F: 69 return rewriteValuegeneric_OpDiv32F_0(v) 70 case OpDiv32u: 71 return rewriteValuegeneric_OpDiv32u_0(v) 72 case OpDiv64: 73 return rewriteValuegeneric_OpDiv64_0(v) 74 case OpDiv64F: 75 return rewriteValuegeneric_OpDiv64F_0(v) 76 case OpDiv64u: 77 return rewriteValuegeneric_OpDiv64u_0(v) 78 case OpDiv8: 79 return rewriteValuegeneric_OpDiv8_0(v) 80 case OpDiv8u: 81 return rewriteValuegeneric_OpDiv8u_0(v) 82 case OpEq16: 83 return rewriteValuegeneric_OpEq16_0(v) 84 case OpEq32: 85 return rewriteValuegeneric_OpEq32_0(v) 86 case OpEq64: 87 return rewriteValuegeneric_OpEq64_0(v) 88 case OpEq8: 89 return rewriteValuegeneric_OpEq8_0(v) 90 case OpEqB: 91 return rewriteValuegeneric_OpEqB_0(v) 92 case OpEqInter: 93 return rewriteValuegeneric_OpEqInter_0(v) 94 case OpEqPtr: 95 return rewriteValuegeneric_OpEqPtr_0(v) 96 case OpEqSlice: 97 return rewriteValuegeneric_OpEqSlice_0(v) 98 case OpGeq16: 99 return rewriteValuegeneric_OpGeq16_0(v) 100 case OpGeq16U: 101 return rewriteValuegeneric_OpGeq16U_0(v) 102 case OpGeq32: 103 return rewriteValuegeneric_OpGeq32_0(v) 104 case OpGeq32U: 105 return rewriteValuegeneric_OpGeq32U_0(v) 106 case OpGeq64: 107 return rewriteValuegeneric_OpGeq64_0(v) 108 case OpGeq64U: 109 return rewriteValuegeneric_OpGeq64U_0(v) 110 case OpGeq8: 111 return rewriteValuegeneric_OpGeq8_0(v) 112 case OpGeq8U: 113 return rewriteValuegeneric_OpGeq8U_0(v) 114 case OpGreater16: 115 return rewriteValuegeneric_OpGreater16_0(v) 116 case OpGreater16U: 117 return rewriteValuegeneric_OpGreater16U_0(v) 118 case OpGreater32: 119 return rewriteValuegeneric_OpGreater32_0(v) 120 case OpGreater32U: 121 return rewriteValuegeneric_OpGreater32U_0(v) 122 case OpGreater64: 123 return rewriteValuegeneric_OpGreater64_0(v) 124 case OpGreater64U: 125 return rewriteValuegeneric_OpGreater64U_0(v) 126 case OpGreater8: 127 return rewriteValuegeneric_OpGreater8_0(v) 128 case OpGreater8U: 129 return rewriteValuegeneric_OpGreater8U_0(v) 130 case OpIMake: 131 return rewriteValuegeneric_OpIMake_0(v) 132 case OpInterCall: 133 return rewriteValuegeneric_OpInterCall_0(v) 134 case OpIsInBounds: 135 return rewriteValuegeneric_OpIsInBounds_0(v) || rewriteValuegeneric_OpIsInBounds_10(v) || rewriteValuegeneric_OpIsInBounds_20(v) 136 case OpIsNonNil: 137 return rewriteValuegeneric_OpIsNonNil_0(v) 138 case OpIsSliceInBounds: 139 return rewriteValuegeneric_OpIsSliceInBounds_0(v) 140 case OpLeq16: 141 return rewriteValuegeneric_OpLeq16_0(v) 142 case OpLeq16U: 143 return rewriteValuegeneric_OpLeq16U_0(v) 144 case OpLeq32: 145 return rewriteValuegeneric_OpLeq32_0(v) 146 case OpLeq32U: 147 return rewriteValuegeneric_OpLeq32U_0(v) 148 case OpLeq64: 149 return rewriteValuegeneric_OpLeq64_0(v) 150 case OpLeq64U: 151 return rewriteValuegeneric_OpLeq64U_0(v) 152 case OpLeq8: 153 return rewriteValuegeneric_OpLeq8_0(v) 154 case OpLeq8U: 155 return rewriteValuegeneric_OpLeq8U_0(v) 156 case OpLess16: 157 return rewriteValuegeneric_OpLess16_0(v) 158 case OpLess16U: 159 return rewriteValuegeneric_OpLess16U_0(v) 160 case OpLess32: 161 return rewriteValuegeneric_OpLess32_0(v) 162 case OpLess32U: 163 return rewriteValuegeneric_OpLess32U_0(v) 164 case OpLess64: 165 return rewriteValuegeneric_OpLess64_0(v) 166 case OpLess64U: 167 return rewriteValuegeneric_OpLess64U_0(v) 168 case OpLess8: 169 return rewriteValuegeneric_OpLess8_0(v) 170 case OpLess8U: 171 return rewriteValuegeneric_OpLess8U_0(v) 172 case OpLoad: 173 return rewriteValuegeneric_OpLoad_0(v) 174 case OpLsh16x16: 175 return rewriteValuegeneric_OpLsh16x16_0(v) 176 case OpLsh16x32: 177 return rewriteValuegeneric_OpLsh16x32_0(v) 178 case OpLsh16x64: 179 return rewriteValuegeneric_OpLsh16x64_0(v) 180 case OpLsh16x8: 181 return rewriteValuegeneric_OpLsh16x8_0(v) 182 case OpLsh32x16: 183 return rewriteValuegeneric_OpLsh32x16_0(v) 184 case OpLsh32x32: 185 return rewriteValuegeneric_OpLsh32x32_0(v) 186 case OpLsh32x64: 187 return rewriteValuegeneric_OpLsh32x64_0(v) 188 case OpLsh32x8: 189 return rewriteValuegeneric_OpLsh32x8_0(v) 190 case OpLsh64x16: 191 return rewriteValuegeneric_OpLsh64x16_0(v) 192 case OpLsh64x32: 193 return rewriteValuegeneric_OpLsh64x32_0(v) 194 case OpLsh64x64: 195 return rewriteValuegeneric_OpLsh64x64_0(v) 196 case OpLsh64x8: 197 return rewriteValuegeneric_OpLsh64x8_0(v) 198 case OpLsh8x16: 199 return rewriteValuegeneric_OpLsh8x16_0(v) 200 case OpLsh8x32: 201 return rewriteValuegeneric_OpLsh8x32_0(v) 202 case OpLsh8x64: 203 return rewriteValuegeneric_OpLsh8x64_0(v) 204 case OpLsh8x8: 205 return rewriteValuegeneric_OpLsh8x8_0(v) 206 case OpMod16: 207 return rewriteValuegeneric_OpMod16_0(v) 208 case OpMod16u: 209 return rewriteValuegeneric_OpMod16u_0(v) 210 case OpMod32: 211 return rewriteValuegeneric_OpMod32_0(v) 212 case OpMod32u: 213 return rewriteValuegeneric_OpMod32u_0(v) 214 case OpMod64: 215 return rewriteValuegeneric_OpMod64_0(v) 216 case OpMod64u: 217 return rewriteValuegeneric_OpMod64u_0(v) 218 case OpMod8: 219 return rewriteValuegeneric_OpMod8_0(v) 220 case OpMod8u: 221 return rewriteValuegeneric_OpMod8u_0(v) 222 case OpMul16: 223 return rewriteValuegeneric_OpMul16_0(v) || rewriteValuegeneric_OpMul16_10(v) 224 case OpMul32: 225 return rewriteValuegeneric_OpMul32_0(v) || rewriteValuegeneric_OpMul32_10(v) 226 case OpMul32F: 227 return rewriteValuegeneric_OpMul32F_0(v) 228 case OpMul64: 229 return rewriteValuegeneric_OpMul64_0(v) || rewriteValuegeneric_OpMul64_10(v) 230 case OpMul64F: 231 return rewriteValuegeneric_OpMul64F_0(v) 232 case OpMul8: 233 return rewriteValuegeneric_OpMul8_0(v) || rewriteValuegeneric_OpMul8_10(v) 234 case OpNeg16: 235 return rewriteValuegeneric_OpNeg16_0(v) 236 case OpNeg32: 237 return rewriteValuegeneric_OpNeg32_0(v) 238 case OpNeg32F: 239 return rewriteValuegeneric_OpNeg32F_0(v) 240 case OpNeg64: 241 return rewriteValuegeneric_OpNeg64_0(v) 242 case OpNeg64F: 243 return rewriteValuegeneric_OpNeg64F_0(v) 244 case OpNeg8: 245 return rewriteValuegeneric_OpNeg8_0(v) 246 case OpNeq16: 247 return rewriteValuegeneric_OpNeq16_0(v) 248 case OpNeq32: 249 return rewriteValuegeneric_OpNeq32_0(v) 250 case OpNeq64: 251 return rewriteValuegeneric_OpNeq64_0(v) 252 case OpNeq8: 253 return rewriteValuegeneric_OpNeq8_0(v) 254 case OpNeqB: 255 return rewriteValuegeneric_OpNeqB_0(v) 256 case OpNeqInter: 257 return rewriteValuegeneric_OpNeqInter_0(v) 258 case OpNeqPtr: 259 return rewriteValuegeneric_OpNeqPtr_0(v) 260 case OpNeqSlice: 261 return rewriteValuegeneric_OpNeqSlice_0(v) 262 case OpNilCheck: 263 return rewriteValuegeneric_OpNilCheck_0(v) 264 case OpNot: 265 return rewriteValuegeneric_OpNot_0(v) || rewriteValuegeneric_OpNot_10(v) || rewriteValuegeneric_OpNot_20(v) || rewriteValuegeneric_OpNot_30(v) || rewriteValuegeneric_OpNot_40(v) 266 case OpOffPtr: 267 return rewriteValuegeneric_OpOffPtr_0(v) 268 case OpOr16: 269 return rewriteValuegeneric_OpOr16_0(v) || rewriteValuegeneric_OpOr16_10(v) 270 case OpOr32: 271 return rewriteValuegeneric_OpOr32_0(v) || rewriteValuegeneric_OpOr32_10(v) 272 case OpOr64: 273 return rewriteValuegeneric_OpOr64_0(v) || rewriteValuegeneric_OpOr64_10(v) 274 case OpOr8: 275 return rewriteValuegeneric_OpOr8_0(v) || rewriteValuegeneric_OpOr8_10(v) 276 case OpPhi: 277 return rewriteValuegeneric_OpPhi_0(v) 278 case OpPtrIndex: 279 return rewriteValuegeneric_OpPtrIndex_0(v) 280 case OpRound32F: 281 return rewriteValuegeneric_OpRound32F_0(v) 282 case OpRound64F: 283 return rewriteValuegeneric_OpRound64F_0(v) 284 case OpRsh16Ux16: 285 return rewriteValuegeneric_OpRsh16Ux16_0(v) 286 case OpRsh16Ux32: 287 return rewriteValuegeneric_OpRsh16Ux32_0(v) 288 case OpRsh16Ux64: 289 return rewriteValuegeneric_OpRsh16Ux64_0(v) 290 case OpRsh16Ux8: 291 return rewriteValuegeneric_OpRsh16Ux8_0(v) 292 case OpRsh16x16: 293 return rewriteValuegeneric_OpRsh16x16_0(v) 294 case OpRsh16x32: 295 return rewriteValuegeneric_OpRsh16x32_0(v) 296 case OpRsh16x64: 297 return rewriteValuegeneric_OpRsh16x64_0(v) 298 case OpRsh16x8: 299 return rewriteValuegeneric_OpRsh16x8_0(v) 300 case OpRsh32Ux16: 301 return rewriteValuegeneric_OpRsh32Ux16_0(v) 302 case OpRsh32Ux32: 303 return rewriteValuegeneric_OpRsh32Ux32_0(v) 304 case OpRsh32Ux64: 305 return rewriteValuegeneric_OpRsh32Ux64_0(v) 306 case OpRsh32Ux8: 307 return rewriteValuegeneric_OpRsh32Ux8_0(v) 308 case OpRsh32x16: 309 return rewriteValuegeneric_OpRsh32x16_0(v) 310 case OpRsh32x32: 311 return rewriteValuegeneric_OpRsh32x32_0(v) 312 case OpRsh32x64: 313 return rewriteValuegeneric_OpRsh32x64_0(v) 314 case OpRsh32x8: 315 return rewriteValuegeneric_OpRsh32x8_0(v) 316 case OpRsh64Ux16: 317 return rewriteValuegeneric_OpRsh64Ux16_0(v) 318 case OpRsh64Ux32: 319 return rewriteValuegeneric_OpRsh64Ux32_0(v) 320 case OpRsh64Ux64: 321 return rewriteValuegeneric_OpRsh64Ux64_0(v) 322 case OpRsh64Ux8: 323 return rewriteValuegeneric_OpRsh64Ux8_0(v) 324 case OpRsh64x16: 325 return rewriteValuegeneric_OpRsh64x16_0(v) 326 case OpRsh64x32: 327 return rewriteValuegeneric_OpRsh64x32_0(v) 328 case OpRsh64x64: 329 return rewriteValuegeneric_OpRsh64x64_0(v) 330 case OpRsh64x8: 331 return rewriteValuegeneric_OpRsh64x8_0(v) 332 case OpRsh8Ux16: 333 return rewriteValuegeneric_OpRsh8Ux16_0(v) 334 case OpRsh8Ux32: 335 return rewriteValuegeneric_OpRsh8Ux32_0(v) 336 case OpRsh8Ux64: 337 return rewriteValuegeneric_OpRsh8Ux64_0(v) 338 case OpRsh8Ux8: 339 return rewriteValuegeneric_OpRsh8Ux8_0(v) 340 case OpRsh8x16: 341 return rewriteValuegeneric_OpRsh8x16_0(v) 342 case OpRsh8x32: 343 return rewriteValuegeneric_OpRsh8x32_0(v) 344 case OpRsh8x64: 345 return rewriteValuegeneric_OpRsh8x64_0(v) 346 case OpRsh8x8: 347 return rewriteValuegeneric_OpRsh8x8_0(v) 348 case OpSignExt16to32: 349 return rewriteValuegeneric_OpSignExt16to32_0(v) 350 case OpSignExt16to64: 351 return rewriteValuegeneric_OpSignExt16to64_0(v) 352 case OpSignExt32to64: 353 return rewriteValuegeneric_OpSignExt32to64_0(v) 354 case OpSignExt8to16: 355 return rewriteValuegeneric_OpSignExt8to16_0(v) 356 case OpSignExt8to32: 357 return rewriteValuegeneric_OpSignExt8to32_0(v) 358 case OpSignExt8to64: 359 return rewriteValuegeneric_OpSignExt8to64_0(v) 360 case OpSliceCap: 361 return rewriteValuegeneric_OpSliceCap_0(v) 362 case OpSliceLen: 363 return rewriteValuegeneric_OpSliceLen_0(v) 364 case OpSlicePtr: 365 return rewriteValuegeneric_OpSlicePtr_0(v) 366 case OpSlicemask: 367 return rewriteValuegeneric_OpSlicemask_0(v) 368 case OpSqrt: 369 return rewriteValuegeneric_OpSqrt_0(v) 370 case OpStore: 371 return rewriteValuegeneric_OpStore_0(v) || rewriteValuegeneric_OpStore_10(v) 372 case OpStringLen: 373 return rewriteValuegeneric_OpStringLen_0(v) 374 case OpStringPtr: 375 return rewriteValuegeneric_OpStringPtr_0(v) 376 case OpStructSelect: 377 return rewriteValuegeneric_OpStructSelect_0(v) || rewriteValuegeneric_OpStructSelect_10(v) 378 case OpSub16: 379 return rewriteValuegeneric_OpSub16_0(v) || rewriteValuegeneric_OpSub16_10(v) 380 case OpSub32: 381 return rewriteValuegeneric_OpSub32_0(v) || rewriteValuegeneric_OpSub32_10(v) 382 case OpSub32F: 383 return rewriteValuegeneric_OpSub32F_0(v) 384 case OpSub64: 385 return rewriteValuegeneric_OpSub64_0(v) || rewriteValuegeneric_OpSub64_10(v) 386 case OpSub64F: 387 return rewriteValuegeneric_OpSub64F_0(v) 388 case OpSub8: 389 return rewriteValuegeneric_OpSub8_0(v) || rewriteValuegeneric_OpSub8_10(v) 390 case OpTrunc16to8: 391 return rewriteValuegeneric_OpTrunc16to8_0(v) 392 case OpTrunc32to16: 393 return rewriteValuegeneric_OpTrunc32to16_0(v) 394 case OpTrunc32to8: 395 return rewriteValuegeneric_OpTrunc32to8_0(v) 396 case OpTrunc64to16: 397 return rewriteValuegeneric_OpTrunc64to16_0(v) 398 case OpTrunc64to32: 399 return rewriteValuegeneric_OpTrunc64to32_0(v) 400 case OpTrunc64to8: 401 return rewriteValuegeneric_OpTrunc64to8_0(v) 402 case OpXor16: 403 return rewriteValuegeneric_OpXor16_0(v) || rewriteValuegeneric_OpXor16_10(v) 404 case OpXor32: 405 return rewriteValuegeneric_OpXor32_0(v) || rewriteValuegeneric_OpXor32_10(v) 406 case OpXor64: 407 return rewriteValuegeneric_OpXor64_0(v) || rewriteValuegeneric_OpXor64_10(v) 408 case OpXor8: 409 return rewriteValuegeneric_OpXor8_0(v) || rewriteValuegeneric_OpXor8_10(v) 410 case OpZero: 411 return rewriteValuegeneric_OpZero_0(v) 412 case OpZeroExt16to32: 413 return rewriteValuegeneric_OpZeroExt16to32_0(v) 414 case OpZeroExt16to64: 415 return rewriteValuegeneric_OpZeroExt16to64_0(v) 416 case OpZeroExt32to64: 417 return rewriteValuegeneric_OpZeroExt32to64_0(v) 418 case OpZeroExt8to16: 419 return rewriteValuegeneric_OpZeroExt8to16_0(v) 420 case OpZeroExt8to32: 421 return rewriteValuegeneric_OpZeroExt8to32_0(v) 422 case OpZeroExt8to64: 423 return rewriteValuegeneric_OpZeroExt8to64_0(v) 424 } 425 return false 426 } 427 func rewriteValuegeneric_OpAdd16_0(v *Value) bool { 428 b := v.Block 429 _ = b 430 // match: (Add16 (Const16 [c]) (Const16 [d])) 431 // cond: 432 // result: (Const16 [int64(int16(c+d))]) 433 for { 434 v_0 := v.Args[0] 435 if v_0.Op != OpConst16 { 436 break 437 } 438 c := v_0.AuxInt 439 v_1 := v.Args[1] 440 if v_1.Op != OpConst16 { 441 break 442 } 443 d := v_1.AuxInt 444 v.reset(OpConst16) 445 v.AuxInt = int64(int16(c + d)) 446 return true 447 } 448 // match: (Add16 (Const16 [d]) (Const16 [c])) 449 // cond: 450 // result: (Const16 [int64(int16(c+d))]) 451 for { 452 v_0 := v.Args[0] 453 if v_0.Op != OpConst16 { 454 break 455 } 456 d := v_0.AuxInt 457 v_1 := v.Args[1] 458 if v_1.Op != OpConst16 { 459 break 460 } 461 c := v_1.AuxInt 462 v.reset(OpConst16) 463 v.AuxInt = int64(int16(c + d)) 464 return true 465 } 466 // match: (Add16 (Const16 [0]) x) 467 // cond: 468 // result: x 469 for { 470 v_0 := v.Args[0] 471 if v_0.Op != OpConst16 { 472 break 473 } 474 if v_0.AuxInt != 0 { 475 break 476 } 477 x := v.Args[1] 478 v.reset(OpCopy) 479 v.Type = x.Type 480 v.AddArg(x) 481 return true 482 } 483 // match: (Add16 x (Const16 [0])) 484 // cond: 485 // result: x 486 for { 487 x := v.Args[0] 488 v_1 := v.Args[1] 489 if v_1.Op != OpConst16 { 490 break 491 } 492 if v_1.AuxInt != 0 { 493 break 494 } 495 v.reset(OpCopy) 496 v.Type = x.Type 497 v.AddArg(x) 498 return true 499 } 500 // match: (Add16 (Const16 [1]) (Com16 x)) 501 // cond: 502 // result: (Neg16 x) 503 for { 504 v_0 := v.Args[0] 505 if v_0.Op != OpConst16 { 506 break 507 } 508 if v_0.AuxInt != 1 { 509 break 510 } 511 v_1 := v.Args[1] 512 if v_1.Op != OpCom16 { 513 break 514 } 515 x := v_1.Args[0] 516 v.reset(OpNeg16) 517 v.AddArg(x) 518 return true 519 } 520 // match: (Add16 (Com16 x) (Const16 [1])) 521 // cond: 522 // result: (Neg16 x) 523 for { 524 v_0 := v.Args[0] 525 if v_0.Op != OpCom16 { 526 break 527 } 528 x := v_0.Args[0] 529 v_1 := v.Args[1] 530 if v_1.Op != OpConst16 { 531 break 532 } 533 if v_1.AuxInt != 1 { 534 break 535 } 536 v.reset(OpNeg16) 537 v.AddArg(x) 538 return true 539 } 540 // match: (Add16 (Add16 i:(Const16 <t>) z) x) 541 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 542 // result: (Add16 i (Add16 <t> z x)) 543 for { 544 v_0 := v.Args[0] 545 if v_0.Op != OpAdd16 { 546 break 547 } 548 i := v_0.Args[0] 549 if i.Op != OpConst16 { 550 break 551 } 552 t := i.Type 553 z := v_0.Args[1] 554 x := v.Args[1] 555 if !(z.Op != OpConst16 && x.Op != OpConst16) { 556 break 557 } 558 v.reset(OpAdd16) 559 v.AddArg(i) 560 v0 := b.NewValue0(v.Pos, OpAdd16, t) 561 v0.AddArg(z) 562 v0.AddArg(x) 563 v.AddArg(v0) 564 return true 565 } 566 // match: (Add16 (Add16 z i:(Const16 <t>)) x) 567 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 568 // result: (Add16 i (Add16 <t> z x)) 569 for { 570 v_0 := v.Args[0] 571 if v_0.Op != OpAdd16 { 572 break 573 } 574 z := v_0.Args[0] 575 i := v_0.Args[1] 576 if i.Op != OpConst16 { 577 break 578 } 579 t := i.Type 580 x := v.Args[1] 581 if !(z.Op != OpConst16 && x.Op != OpConst16) { 582 break 583 } 584 v.reset(OpAdd16) 585 v.AddArg(i) 586 v0 := b.NewValue0(v.Pos, OpAdd16, t) 587 v0.AddArg(z) 588 v0.AddArg(x) 589 v.AddArg(v0) 590 return true 591 } 592 // match: (Add16 x (Add16 i:(Const16 <t>) z)) 593 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 594 // result: (Add16 i (Add16 <t> z x)) 595 for { 596 x := v.Args[0] 597 v_1 := v.Args[1] 598 if v_1.Op != OpAdd16 { 599 break 600 } 601 i := v_1.Args[0] 602 if i.Op != OpConst16 { 603 break 604 } 605 t := i.Type 606 z := v_1.Args[1] 607 if !(z.Op != OpConst16 && x.Op != OpConst16) { 608 break 609 } 610 v.reset(OpAdd16) 611 v.AddArg(i) 612 v0 := b.NewValue0(v.Pos, OpAdd16, t) 613 v0.AddArg(z) 614 v0.AddArg(x) 615 v.AddArg(v0) 616 return true 617 } 618 // match: (Add16 x (Add16 z i:(Const16 <t>))) 619 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 620 // result: (Add16 i (Add16 <t> z x)) 621 for { 622 x := v.Args[0] 623 v_1 := v.Args[1] 624 if v_1.Op != OpAdd16 { 625 break 626 } 627 z := v_1.Args[0] 628 i := v_1.Args[1] 629 if i.Op != OpConst16 { 630 break 631 } 632 t := i.Type 633 if !(z.Op != OpConst16 && x.Op != OpConst16) { 634 break 635 } 636 v.reset(OpAdd16) 637 v.AddArg(i) 638 v0 := b.NewValue0(v.Pos, OpAdd16, t) 639 v0.AddArg(z) 640 v0.AddArg(x) 641 v.AddArg(v0) 642 return true 643 } 644 return false 645 } 646 func rewriteValuegeneric_OpAdd16_10(v *Value) bool { 647 b := v.Block 648 _ = b 649 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 650 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 651 // result: (Add16 i (Sub16 <t> x z)) 652 for { 653 v_0 := v.Args[0] 654 if v_0.Op != OpSub16 { 655 break 656 } 657 i := v_0.Args[0] 658 if i.Op != OpConst16 { 659 break 660 } 661 t := i.Type 662 z := v_0.Args[1] 663 x := v.Args[1] 664 if !(z.Op != OpConst16 && x.Op != OpConst16) { 665 break 666 } 667 v.reset(OpAdd16) 668 v.AddArg(i) 669 v0 := b.NewValue0(v.Pos, OpSub16, t) 670 v0.AddArg(x) 671 v0.AddArg(z) 672 v.AddArg(v0) 673 return true 674 } 675 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 676 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 677 // result: (Add16 i (Sub16 <t> x z)) 678 for { 679 x := v.Args[0] 680 v_1 := v.Args[1] 681 if v_1.Op != OpSub16 { 682 break 683 } 684 i := v_1.Args[0] 685 if i.Op != OpConst16 { 686 break 687 } 688 t := i.Type 689 z := v_1.Args[1] 690 if !(z.Op != OpConst16 && x.Op != OpConst16) { 691 break 692 } 693 v.reset(OpAdd16) 694 v.AddArg(i) 695 v0 := b.NewValue0(v.Pos, OpSub16, t) 696 v0.AddArg(x) 697 v0.AddArg(z) 698 v.AddArg(v0) 699 return true 700 } 701 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 702 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 703 // result: (Add16 i (Sub16 <t> x z)) 704 for { 705 x := v.Args[0] 706 v_1 := v.Args[1] 707 if v_1.Op != OpSub16 { 708 break 709 } 710 i := v_1.Args[0] 711 if i.Op != OpConst16 { 712 break 713 } 714 t := i.Type 715 z := v_1.Args[1] 716 if !(z.Op != OpConst16 && x.Op != OpConst16) { 717 break 718 } 719 v.reset(OpAdd16) 720 v.AddArg(i) 721 v0 := b.NewValue0(v.Pos, OpSub16, t) 722 v0.AddArg(x) 723 v0.AddArg(z) 724 v.AddArg(v0) 725 return true 726 } 727 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 728 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 729 // result: (Add16 i (Sub16 <t> x z)) 730 for { 731 v_0 := v.Args[0] 732 if v_0.Op != OpSub16 { 733 break 734 } 735 i := v_0.Args[0] 736 if i.Op != OpConst16 { 737 break 738 } 739 t := i.Type 740 z := v_0.Args[1] 741 x := v.Args[1] 742 if !(z.Op != OpConst16 && x.Op != OpConst16) { 743 break 744 } 745 v.reset(OpAdd16) 746 v.AddArg(i) 747 v0 := b.NewValue0(v.Pos, OpSub16, t) 748 v0.AddArg(x) 749 v0.AddArg(z) 750 v.AddArg(v0) 751 return true 752 } 753 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 754 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 755 // result: (Sub16 (Add16 <t> x z) i) 756 for { 757 v_0 := v.Args[0] 758 if v_0.Op != OpSub16 { 759 break 760 } 761 z := v_0.Args[0] 762 i := v_0.Args[1] 763 if i.Op != OpConst16 { 764 break 765 } 766 t := i.Type 767 x := v.Args[1] 768 if !(z.Op != OpConst16 && x.Op != OpConst16) { 769 break 770 } 771 v.reset(OpSub16) 772 v0 := b.NewValue0(v.Pos, OpAdd16, t) 773 v0.AddArg(x) 774 v0.AddArg(z) 775 v.AddArg(v0) 776 v.AddArg(i) 777 return true 778 } 779 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 780 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 781 // result: (Sub16 (Add16 <t> x z) i) 782 for { 783 x := v.Args[0] 784 v_1 := v.Args[1] 785 if v_1.Op != OpSub16 { 786 break 787 } 788 z := v_1.Args[0] 789 i := v_1.Args[1] 790 if i.Op != OpConst16 { 791 break 792 } 793 t := i.Type 794 if !(z.Op != OpConst16 && x.Op != OpConst16) { 795 break 796 } 797 v.reset(OpSub16) 798 v0 := b.NewValue0(v.Pos, OpAdd16, t) 799 v0.AddArg(x) 800 v0.AddArg(z) 801 v.AddArg(v0) 802 v.AddArg(i) 803 return true 804 } 805 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 806 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 807 // result: (Sub16 (Add16 <t> x z) i) 808 for { 809 x := v.Args[0] 810 v_1 := v.Args[1] 811 if v_1.Op != OpSub16 { 812 break 813 } 814 z := v_1.Args[0] 815 i := v_1.Args[1] 816 if i.Op != OpConst16 { 817 break 818 } 819 t := i.Type 820 if !(z.Op != OpConst16 && x.Op != OpConst16) { 821 break 822 } 823 v.reset(OpSub16) 824 v0 := b.NewValue0(v.Pos, OpAdd16, t) 825 v0.AddArg(x) 826 v0.AddArg(z) 827 v.AddArg(v0) 828 v.AddArg(i) 829 return true 830 } 831 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 832 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 833 // result: (Sub16 (Add16 <t> x z) i) 834 for { 835 v_0 := v.Args[0] 836 if v_0.Op != OpSub16 { 837 break 838 } 839 z := v_0.Args[0] 840 i := v_0.Args[1] 841 if i.Op != OpConst16 { 842 break 843 } 844 t := i.Type 845 x := v.Args[1] 846 if !(z.Op != OpConst16 && x.Op != OpConst16) { 847 break 848 } 849 v.reset(OpSub16) 850 v0 := b.NewValue0(v.Pos, OpAdd16, t) 851 v0.AddArg(x) 852 v0.AddArg(z) 853 v.AddArg(v0) 854 v.AddArg(i) 855 return true 856 } 857 // match: (Add16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 858 // cond: 859 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 860 for { 861 v_0 := v.Args[0] 862 if v_0.Op != OpConst16 { 863 break 864 } 865 t := v_0.Type 866 c := v_0.AuxInt 867 v_1 := v.Args[1] 868 if v_1.Op != OpAdd16 { 869 break 870 } 871 v_1_0 := v_1.Args[0] 872 if v_1_0.Op != OpConst16 { 873 break 874 } 875 if v_1_0.Type != t { 876 break 877 } 878 d := v_1_0.AuxInt 879 x := v_1.Args[1] 880 v.reset(OpAdd16) 881 v0 := b.NewValue0(v.Pos, OpConst16, t) 882 v0.AuxInt = int64(int16(c + d)) 883 v.AddArg(v0) 884 v.AddArg(x) 885 return true 886 } 887 // match: (Add16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 888 // cond: 889 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 890 for { 891 v_0 := v.Args[0] 892 if v_0.Op != OpConst16 { 893 break 894 } 895 t := v_0.Type 896 c := v_0.AuxInt 897 v_1 := v.Args[1] 898 if v_1.Op != OpAdd16 { 899 break 900 } 901 x := v_1.Args[0] 902 v_1_1 := v_1.Args[1] 903 if v_1_1.Op != OpConst16 { 904 break 905 } 906 if v_1_1.Type != t { 907 break 908 } 909 d := v_1_1.AuxInt 910 v.reset(OpAdd16) 911 v0 := b.NewValue0(v.Pos, OpConst16, t) 912 v0.AuxInt = int64(int16(c + d)) 913 v.AddArg(v0) 914 v.AddArg(x) 915 return true 916 } 917 return false 918 } 919 func rewriteValuegeneric_OpAdd16_20(v *Value) bool { 920 b := v.Block 921 _ = b 922 // match: (Add16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 923 // cond: 924 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 925 for { 926 v_0 := v.Args[0] 927 if v_0.Op != OpAdd16 { 928 break 929 } 930 v_0_0 := v_0.Args[0] 931 if v_0_0.Op != OpConst16 { 932 break 933 } 934 t := v_0_0.Type 935 d := v_0_0.AuxInt 936 x := v_0.Args[1] 937 v_1 := v.Args[1] 938 if v_1.Op != OpConst16 { 939 break 940 } 941 if v_1.Type != t { 942 break 943 } 944 c := v_1.AuxInt 945 v.reset(OpAdd16) 946 v0 := b.NewValue0(v.Pos, OpConst16, t) 947 v0.AuxInt = int64(int16(c + d)) 948 v.AddArg(v0) 949 v.AddArg(x) 950 return true 951 } 952 // match: (Add16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 953 // cond: 954 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 955 for { 956 v_0 := v.Args[0] 957 if v_0.Op != OpAdd16 { 958 break 959 } 960 x := v_0.Args[0] 961 v_0_1 := v_0.Args[1] 962 if v_0_1.Op != OpConst16 { 963 break 964 } 965 t := v_0_1.Type 966 d := v_0_1.AuxInt 967 v_1 := v.Args[1] 968 if v_1.Op != OpConst16 { 969 break 970 } 971 if v_1.Type != t { 972 break 973 } 974 c := v_1.AuxInt 975 v.reset(OpAdd16) 976 v0 := b.NewValue0(v.Pos, OpConst16, t) 977 v0.AuxInt = int64(int16(c + d)) 978 v.AddArg(v0) 979 v.AddArg(x) 980 return true 981 } 982 // match: (Add16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 983 // cond: 984 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 985 for { 986 v_0 := v.Args[0] 987 if v_0.Op != OpConst16 { 988 break 989 } 990 t := v_0.Type 991 c := v_0.AuxInt 992 v_1 := v.Args[1] 993 if v_1.Op != OpSub16 { 994 break 995 } 996 v_1_0 := v_1.Args[0] 997 if v_1_0.Op != OpConst16 { 998 break 999 } 1000 if v_1_0.Type != t { 1001 break 1002 } 1003 d := v_1_0.AuxInt 1004 x := v_1.Args[1] 1005 v.reset(OpSub16) 1006 v0 := b.NewValue0(v.Pos, OpConst16, t) 1007 v0.AuxInt = int64(int16(c + d)) 1008 v.AddArg(v0) 1009 v.AddArg(x) 1010 return true 1011 } 1012 // match: (Add16 (Sub16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1013 // cond: 1014 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1015 for { 1016 v_0 := v.Args[0] 1017 if v_0.Op != OpSub16 { 1018 break 1019 } 1020 v_0_0 := v_0.Args[0] 1021 if v_0_0.Op != OpConst16 { 1022 break 1023 } 1024 t := v_0_0.Type 1025 d := v_0_0.AuxInt 1026 x := v_0.Args[1] 1027 v_1 := v.Args[1] 1028 if v_1.Op != OpConst16 { 1029 break 1030 } 1031 if v_1.Type != t { 1032 break 1033 } 1034 c := v_1.AuxInt 1035 v.reset(OpSub16) 1036 v0 := b.NewValue0(v.Pos, OpConst16, t) 1037 v0.AuxInt = int64(int16(c + d)) 1038 v.AddArg(v0) 1039 v.AddArg(x) 1040 return true 1041 } 1042 // match: (Add16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 1043 // cond: 1044 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1045 for { 1046 v_0 := v.Args[0] 1047 if v_0.Op != OpConst16 { 1048 break 1049 } 1050 t := v_0.Type 1051 c := v_0.AuxInt 1052 v_1 := v.Args[1] 1053 if v_1.Op != OpSub16 { 1054 break 1055 } 1056 x := v_1.Args[0] 1057 v_1_1 := v_1.Args[1] 1058 if v_1_1.Op != OpConst16 { 1059 break 1060 } 1061 if v_1_1.Type != t { 1062 break 1063 } 1064 d := v_1_1.AuxInt 1065 v.reset(OpAdd16) 1066 v0 := b.NewValue0(v.Pos, OpConst16, t) 1067 v0.AuxInt = int64(int16(c - d)) 1068 v.AddArg(v0) 1069 v.AddArg(x) 1070 return true 1071 } 1072 // match: (Add16 (Sub16 x (Const16 <t> [d])) (Const16 <t> [c])) 1073 // cond: 1074 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1075 for { 1076 v_0 := v.Args[0] 1077 if v_0.Op != OpSub16 { 1078 break 1079 } 1080 x := v_0.Args[0] 1081 v_0_1 := v_0.Args[1] 1082 if v_0_1.Op != OpConst16 { 1083 break 1084 } 1085 t := v_0_1.Type 1086 d := v_0_1.AuxInt 1087 v_1 := v.Args[1] 1088 if v_1.Op != OpConst16 { 1089 break 1090 } 1091 if v_1.Type != t { 1092 break 1093 } 1094 c := v_1.AuxInt 1095 v.reset(OpAdd16) 1096 v0 := b.NewValue0(v.Pos, OpConst16, t) 1097 v0.AuxInt = int64(int16(c - d)) 1098 v.AddArg(v0) 1099 v.AddArg(x) 1100 return true 1101 } 1102 return false 1103 } 1104 func rewriteValuegeneric_OpAdd32_0(v *Value) bool { 1105 b := v.Block 1106 _ = b 1107 // match: (Add32 (Const32 [c]) (Const32 [d])) 1108 // cond: 1109 // result: (Const32 [int64(int32(c+d))]) 1110 for { 1111 v_0 := v.Args[0] 1112 if v_0.Op != OpConst32 { 1113 break 1114 } 1115 c := v_0.AuxInt 1116 v_1 := v.Args[1] 1117 if v_1.Op != OpConst32 { 1118 break 1119 } 1120 d := v_1.AuxInt 1121 v.reset(OpConst32) 1122 v.AuxInt = int64(int32(c + d)) 1123 return true 1124 } 1125 // match: (Add32 (Const32 [d]) (Const32 [c])) 1126 // cond: 1127 // result: (Const32 [int64(int32(c+d))]) 1128 for { 1129 v_0 := v.Args[0] 1130 if v_0.Op != OpConst32 { 1131 break 1132 } 1133 d := v_0.AuxInt 1134 v_1 := v.Args[1] 1135 if v_1.Op != OpConst32 { 1136 break 1137 } 1138 c := v_1.AuxInt 1139 v.reset(OpConst32) 1140 v.AuxInt = int64(int32(c + d)) 1141 return true 1142 } 1143 // match: (Add32 (Const32 [0]) x) 1144 // cond: 1145 // result: x 1146 for { 1147 v_0 := v.Args[0] 1148 if v_0.Op != OpConst32 { 1149 break 1150 } 1151 if v_0.AuxInt != 0 { 1152 break 1153 } 1154 x := v.Args[1] 1155 v.reset(OpCopy) 1156 v.Type = x.Type 1157 v.AddArg(x) 1158 return true 1159 } 1160 // match: (Add32 x (Const32 [0])) 1161 // cond: 1162 // result: x 1163 for { 1164 x := v.Args[0] 1165 v_1 := v.Args[1] 1166 if v_1.Op != OpConst32 { 1167 break 1168 } 1169 if v_1.AuxInt != 0 { 1170 break 1171 } 1172 v.reset(OpCopy) 1173 v.Type = x.Type 1174 v.AddArg(x) 1175 return true 1176 } 1177 // match: (Add32 (Const32 [1]) (Com32 x)) 1178 // cond: 1179 // result: (Neg32 x) 1180 for { 1181 v_0 := v.Args[0] 1182 if v_0.Op != OpConst32 { 1183 break 1184 } 1185 if v_0.AuxInt != 1 { 1186 break 1187 } 1188 v_1 := v.Args[1] 1189 if v_1.Op != OpCom32 { 1190 break 1191 } 1192 x := v_1.Args[0] 1193 v.reset(OpNeg32) 1194 v.AddArg(x) 1195 return true 1196 } 1197 // match: (Add32 (Com32 x) (Const32 [1])) 1198 // cond: 1199 // result: (Neg32 x) 1200 for { 1201 v_0 := v.Args[0] 1202 if v_0.Op != OpCom32 { 1203 break 1204 } 1205 x := v_0.Args[0] 1206 v_1 := v.Args[1] 1207 if v_1.Op != OpConst32 { 1208 break 1209 } 1210 if v_1.AuxInt != 1 { 1211 break 1212 } 1213 v.reset(OpNeg32) 1214 v.AddArg(x) 1215 return true 1216 } 1217 // match: (Add32 (Add32 i:(Const32 <t>) z) x) 1218 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1219 // result: (Add32 i (Add32 <t> z x)) 1220 for { 1221 v_0 := v.Args[0] 1222 if v_0.Op != OpAdd32 { 1223 break 1224 } 1225 i := v_0.Args[0] 1226 if i.Op != OpConst32 { 1227 break 1228 } 1229 t := i.Type 1230 z := v_0.Args[1] 1231 x := v.Args[1] 1232 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1233 break 1234 } 1235 v.reset(OpAdd32) 1236 v.AddArg(i) 1237 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1238 v0.AddArg(z) 1239 v0.AddArg(x) 1240 v.AddArg(v0) 1241 return true 1242 } 1243 // match: (Add32 (Add32 z i:(Const32 <t>)) x) 1244 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1245 // result: (Add32 i (Add32 <t> z x)) 1246 for { 1247 v_0 := v.Args[0] 1248 if v_0.Op != OpAdd32 { 1249 break 1250 } 1251 z := v_0.Args[0] 1252 i := v_0.Args[1] 1253 if i.Op != OpConst32 { 1254 break 1255 } 1256 t := i.Type 1257 x := v.Args[1] 1258 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1259 break 1260 } 1261 v.reset(OpAdd32) 1262 v.AddArg(i) 1263 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1264 v0.AddArg(z) 1265 v0.AddArg(x) 1266 v.AddArg(v0) 1267 return true 1268 } 1269 // match: (Add32 x (Add32 i:(Const32 <t>) z)) 1270 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1271 // result: (Add32 i (Add32 <t> z x)) 1272 for { 1273 x := v.Args[0] 1274 v_1 := v.Args[1] 1275 if v_1.Op != OpAdd32 { 1276 break 1277 } 1278 i := v_1.Args[0] 1279 if i.Op != OpConst32 { 1280 break 1281 } 1282 t := i.Type 1283 z := v_1.Args[1] 1284 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1285 break 1286 } 1287 v.reset(OpAdd32) 1288 v.AddArg(i) 1289 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1290 v0.AddArg(z) 1291 v0.AddArg(x) 1292 v.AddArg(v0) 1293 return true 1294 } 1295 // match: (Add32 x (Add32 z i:(Const32 <t>))) 1296 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1297 // result: (Add32 i (Add32 <t> z x)) 1298 for { 1299 x := v.Args[0] 1300 v_1 := v.Args[1] 1301 if v_1.Op != OpAdd32 { 1302 break 1303 } 1304 z := v_1.Args[0] 1305 i := v_1.Args[1] 1306 if i.Op != OpConst32 { 1307 break 1308 } 1309 t := i.Type 1310 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1311 break 1312 } 1313 v.reset(OpAdd32) 1314 v.AddArg(i) 1315 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1316 v0.AddArg(z) 1317 v0.AddArg(x) 1318 v.AddArg(v0) 1319 return true 1320 } 1321 return false 1322 } 1323 func rewriteValuegeneric_OpAdd32_10(v *Value) bool { 1324 b := v.Block 1325 _ = b 1326 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1327 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1328 // result: (Add32 i (Sub32 <t> x z)) 1329 for { 1330 v_0 := v.Args[0] 1331 if v_0.Op != OpSub32 { 1332 break 1333 } 1334 i := v_0.Args[0] 1335 if i.Op != OpConst32 { 1336 break 1337 } 1338 t := i.Type 1339 z := v_0.Args[1] 1340 x := v.Args[1] 1341 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1342 break 1343 } 1344 v.reset(OpAdd32) 1345 v.AddArg(i) 1346 v0 := b.NewValue0(v.Pos, OpSub32, t) 1347 v0.AddArg(x) 1348 v0.AddArg(z) 1349 v.AddArg(v0) 1350 return true 1351 } 1352 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1353 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1354 // result: (Add32 i (Sub32 <t> x z)) 1355 for { 1356 x := v.Args[0] 1357 v_1 := v.Args[1] 1358 if v_1.Op != OpSub32 { 1359 break 1360 } 1361 i := v_1.Args[0] 1362 if i.Op != OpConst32 { 1363 break 1364 } 1365 t := i.Type 1366 z := v_1.Args[1] 1367 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1368 break 1369 } 1370 v.reset(OpAdd32) 1371 v.AddArg(i) 1372 v0 := b.NewValue0(v.Pos, OpSub32, t) 1373 v0.AddArg(x) 1374 v0.AddArg(z) 1375 v.AddArg(v0) 1376 return true 1377 } 1378 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1379 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1380 // result: (Add32 i (Sub32 <t> x z)) 1381 for { 1382 x := v.Args[0] 1383 v_1 := v.Args[1] 1384 if v_1.Op != OpSub32 { 1385 break 1386 } 1387 i := v_1.Args[0] 1388 if i.Op != OpConst32 { 1389 break 1390 } 1391 t := i.Type 1392 z := v_1.Args[1] 1393 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1394 break 1395 } 1396 v.reset(OpAdd32) 1397 v.AddArg(i) 1398 v0 := b.NewValue0(v.Pos, OpSub32, t) 1399 v0.AddArg(x) 1400 v0.AddArg(z) 1401 v.AddArg(v0) 1402 return true 1403 } 1404 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1405 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1406 // result: (Add32 i (Sub32 <t> x z)) 1407 for { 1408 v_0 := v.Args[0] 1409 if v_0.Op != OpSub32 { 1410 break 1411 } 1412 i := v_0.Args[0] 1413 if i.Op != OpConst32 { 1414 break 1415 } 1416 t := i.Type 1417 z := v_0.Args[1] 1418 x := v.Args[1] 1419 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1420 break 1421 } 1422 v.reset(OpAdd32) 1423 v.AddArg(i) 1424 v0 := b.NewValue0(v.Pos, OpSub32, t) 1425 v0.AddArg(x) 1426 v0.AddArg(z) 1427 v.AddArg(v0) 1428 return true 1429 } 1430 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 1431 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1432 // result: (Sub32 (Add32 <t> x z) i) 1433 for { 1434 v_0 := v.Args[0] 1435 if v_0.Op != OpSub32 { 1436 break 1437 } 1438 z := v_0.Args[0] 1439 i := v_0.Args[1] 1440 if i.Op != OpConst32 { 1441 break 1442 } 1443 t := i.Type 1444 x := v.Args[1] 1445 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1446 break 1447 } 1448 v.reset(OpSub32) 1449 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1450 v0.AddArg(x) 1451 v0.AddArg(z) 1452 v.AddArg(v0) 1453 v.AddArg(i) 1454 return true 1455 } 1456 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 1457 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1458 // result: (Sub32 (Add32 <t> x z) i) 1459 for { 1460 x := v.Args[0] 1461 v_1 := v.Args[1] 1462 if v_1.Op != OpSub32 { 1463 break 1464 } 1465 z := v_1.Args[0] 1466 i := v_1.Args[1] 1467 if i.Op != OpConst32 { 1468 break 1469 } 1470 t := i.Type 1471 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1472 break 1473 } 1474 v.reset(OpSub32) 1475 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1476 v0.AddArg(x) 1477 v0.AddArg(z) 1478 v.AddArg(v0) 1479 v.AddArg(i) 1480 return true 1481 } 1482 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 1483 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1484 // result: (Sub32 (Add32 <t> x z) i) 1485 for { 1486 x := v.Args[0] 1487 v_1 := v.Args[1] 1488 if v_1.Op != OpSub32 { 1489 break 1490 } 1491 z := v_1.Args[0] 1492 i := v_1.Args[1] 1493 if i.Op != OpConst32 { 1494 break 1495 } 1496 t := i.Type 1497 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1498 break 1499 } 1500 v.reset(OpSub32) 1501 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1502 v0.AddArg(x) 1503 v0.AddArg(z) 1504 v.AddArg(v0) 1505 v.AddArg(i) 1506 return true 1507 } 1508 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 1509 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1510 // result: (Sub32 (Add32 <t> x z) i) 1511 for { 1512 v_0 := v.Args[0] 1513 if v_0.Op != OpSub32 { 1514 break 1515 } 1516 z := v_0.Args[0] 1517 i := v_0.Args[1] 1518 if i.Op != OpConst32 { 1519 break 1520 } 1521 t := i.Type 1522 x := v.Args[1] 1523 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1524 break 1525 } 1526 v.reset(OpSub32) 1527 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1528 v0.AddArg(x) 1529 v0.AddArg(z) 1530 v.AddArg(v0) 1531 v.AddArg(i) 1532 return true 1533 } 1534 // match: (Add32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 1535 // cond: 1536 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 1537 for { 1538 v_0 := v.Args[0] 1539 if v_0.Op != OpConst32 { 1540 break 1541 } 1542 t := v_0.Type 1543 c := v_0.AuxInt 1544 v_1 := v.Args[1] 1545 if v_1.Op != OpAdd32 { 1546 break 1547 } 1548 v_1_0 := v_1.Args[0] 1549 if v_1_0.Op != OpConst32 { 1550 break 1551 } 1552 if v_1_0.Type != t { 1553 break 1554 } 1555 d := v_1_0.AuxInt 1556 x := v_1.Args[1] 1557 v.reset(OpAdd32) 1558 v0 := b.NewValue0(v.Pos, OpConst32, t) 1559 v0.AuxInt = int64(int32(c + d)) 1560 v.AddArg(v0) 1561 v.AddArg(x) 1562 return true 1563 } 1564 // match: (Add32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 1565 // cond: 1566 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 1567 for { 1568 v_0 := v.Args[0] 1569 if v_0.Op != OpConst32 { 1570 break 1571 } 1572 t := v_0.Type 1573 c := v_0.AuxInt 1574 v_1 := v.Args[1] 1575 if v_1.Op != OpAdd32 { 1576 break 1577 } 1578 x := v_1.Args[0] 1579 v_1_1 := v_1.Args[1] 1580 if v_1_1.Op != OpConst32 { 1581 break 1582 } 1583 if v_1_1.Type != t { 1584 break 1585 } 1586 d := v_1_1.AuxInt 1587 v.reset(OpAdd32) 1588 v0 := b.NewValue0(v.Pos, OpConst32, t) 1589 v0.AuxInt = int64(int32(c + d)) 1590 v.AddArg(v0) 1591 v.AddArg(x) 1592 return true 1593 } 1594 return false 1595 } 1596 func rewriteValuegeneric_OpAdd32_20(v *Value) bool { 1597 b := v.Block 1598 _ = b 1599 // match: (Add32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 1600 // cond: 1601 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 1602 for { 1603 v_0 := v.Args[0] 1604 if v_0.Op != OpAdd32 { 1605 break 1606 } 1607 v_0_0 := v_0.Args[0] 1608 if v_0_0.Op != OpConst32 { 1609 break 1610 } 1611 t := v_0_0.Type 1612 d := v_0_0.AuxInt 1613 x := v_0.Args[1] 1614 v_1 := v.Args[1] 1615 if v_1.Op != OpConst32 { 1616 break 1617 } 1618 if v_1.Type != t { 1619 break 1620 } 1621 c := v_1.AuxInt 1622 v.reset(OpAdd32) 1623 v0 := b.NewValue0(v.Pos, OpConst32, t) 1624 v0.AuxInt = int64(int32(c + d)) 1625 v.AddArg(v0) 1626 v.AddArg(x) 1627 return true 1628 } 1629 // match: (Add32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 1630 // cond: 1631 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 1632 for { 1633 v_0 := v.Args[0] 1634 if v_0.Op != OpAdd32 { 1635 break 1636 } 1637 x := v_0.Args[0] 1638 v_0_1 := v_0.Args[1] 1639 if v_0_1.Op != OpConst32 { 1640 break 1641 } 1642 t := v_0_1.Type 1643 d := v_0_1.AuxInt 1644 v_1 := v.Args[1] 1645 if v_1.Op != OpConst32 { 1646 break 1647 } 1648 if v_1.Type != t { 1649 break 1650 } 1651 c := v_1.AuxInt 1652 v.reset(OpAdd32) 1653 v0 := b.NewValue0(v.Pos, OpConst32, t) 1654 v0.AuxInt = int64(int32(c + d)) 1655 v.AddArg(v0) 1656 v.AddArg(x) 1657 return true 1658 } 1659 // match: (Add32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 1660 // cond: 1661 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 1662 for { 1663 v_0 := v.Args[0] 1664 if v_0.Op != OpConst32 { 1665 break 1666 } 1667 t := v_0.Type 1668 c := v_0.AuxInt 1669 v_1 := v.Args[1] 1670 if v_1.Op != OpSub32 { 1671 break 1672 } 1673 v_1_0 := v_1.Args[0] 1674 if v_1_0.Op != OpConst32 { 1675 break 1676 } 1677 if v_1_0.Type != t { 1678 break 1679 } 1680 d := v_1_0.AuxInt 1681 x := v_1.Args[1] 1682 v.reset(OpSub32) 1683 v0 := b.NewValue0(v.Pos, OpConst32, t) 1684 v0.AuxInt = int64(int32(c + d)) 1685 v.AddArg(v0) 1686 v.AddArg(x) 1687 return true 1688 } 1689 // match: (Add32 (Sub32 (Const32 <t> [d]) x) (Const32 <t> [c])) 1690 // cond: 1691 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 1692 for { 1693 v_0 := v.Args[0] 1694 if v_0.Op != OpSub32 { 1695 break 1696 } 1697 v_0_0 := v_0.Args[0] 1698 if v_0_0.Op != OpConst32 { 1699 break 1700 } 1701 t := v_0_0.Type 1702 d := v_0_0.AuxInt 1703 x := v_0.Args[1] 1704 v_1 := v.Args[1] 1705 if v_1.Op != OpConst32 { 1706 break 1707 } 1708 if v_1.Type != t { 1709 break 1710 } 1711 c := v_1.AuxInt 1712 v.reset(OpSub32) 1713 v0 := b.NewValue0(v.Pos, OpConst32, t) 1714 v0.AuxInt = int64(int32(c + d)) 1715 v.AddArg(v0) 1716 v.AddArg(x) 1717 return true 1718 } 1719 // match: (Add32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 1720 // cond: 1721 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 1722 for { 1723 v_0 := v.Args[0] 1724 if v_0.Op != OpConst32 { 1725 break 1726 } 1727 t := v_0.Type 1728 c := v_0.AuxInt 1729 v_1 := v.Args[1] 1730 if v_1.Op != OpSub32 { 1731 break 1732 } 1733 x := v_1.Args[0] 1734 v_1_1 := v_1.Args[1] 1735 if v_1_1.Op != OpConst32 { 1736 break 1737 } 1738 if v_1_1.Type != t { 1739 break 1740 } 1741 d := v_1_1.AuxInt 1742 v.reset(OpAdd32) 1743 v0 := b.NewValue0(v.Pos, OpConst32, t) 1744 v0.AuxInt = int64(int32(c - d)) 1745 v.AddArg(v0) 1746 v.AddArg(x) 1747 return true 1748 } 1749 // match: (Add32 (Sub32 x (Const32 <t> [d])) (Const32 <t> [c])) 1750 // cond: 1751 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 1752 for { 1753 v_0 := v.Args[0] 1754 if v_0.Op != OpSub32 { 1755 break 1756 } 1757 x := v_0.Args[0] 1758 v_0_1 := v_0.Args[1] 1759 if v_0_1.Op != OpConst32 { 1760 break 1761 } 1762 t := v_0_1.Type 1763 d := v_0_1.AuxInt 1764 v_1 := v.Args[1] 1765 if v_1.Op != OpConst32 { 1766 break 1767 } 1768 if v_1.Type != t { 1769 break 1770 } 1771 c := v_1.AuxInt 1772 v.reset(OpAdd32) 1773 v0 := b.NewValue0(v.Pos, OpConst32, t) 1774 v0.AuxInt = int64(int32(c - d)) 1775 v.AddArg(v0) 1776 v.AddArg(x) 1777 return true 1778 } 1779 return false 1780 } 1781 func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { 1782 // match: (Add32F (Const32F [c]) (Const32F [d])) 1783 // cond: 1784 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 1785 for { 1786 v_0 := v.Args[0] 1787 if v_0.Op != OpConst32F { 1788 break 1789 } 1790 c := v_0.AuxInt 1791 v_1 := v.Args[1] 1792 if v_1.Op != OpConst32F { 1793 break 1794 } 1795 d := v_1.AuxInt 1796 v.reset(OpConst32F) 1797 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 1798 return true 1799 } 1800 // match: (Add32F (Const32F [d]) (Const32F [c])) 1801 // cond: 1802 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 1803 for { 1804 v_0 := v.Args[0] 1805 if v_0.Op != OpConst32F { 1806 break 1807 } 1808 d := v_0.AuxInt 1809 v_1 := v.Args[1] 1810 if v_1.Op != OpConst32F { 1811 break 1812 } 1813 c := v_1.AuxInt 1814 v.reset(OpConst32F) 1815 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 1816 return true 1817 } 1818 // match: (Add32F x (Const32F [0])) 1819 // cond: 1820 // result: x 1821 for { 1822 x := v.Args[0] 1823 v_1 := v.Args[1] 1824 if v_1.Op != OpConst32F { 1825 break 1826 } 1827 if v_1.AuxInt != 0 { 1828 break 1829 } 1830 v.reset(OpCopy) 1831 v.Type = x.Type 1832 v.AddArg(x) 1833 return true 1834 } 1835 // match: (Add32F (Const32F [0]) x) 1836 // cond: 1837 // result: x 1838 for { 1839 v_0 := v.Args[0] 1840 if v_0.Op != OpConst32F { 1841 break 1842 } 1843 if v_0.AuxInt != 0 { 1844 break 1845 } 1846 x := v.Args[1] 1847 v.reset(OpCopy) 1848 v.Type = x.Type 1849 v.AddArg(x) 1850 return true 1851 } 1852 return false 1853 } 1854 func rewriteValuegeneric_OpAdd64_0(v *Value) bool { 1855 b := v.Block 1856 _ = b 1857 // match: (Add64 (Const64 [c]) (Const64 [d])) 1858 // cond: 1859 // result: (Const64 [c+d]) 1860 for { 1861 v_0 := v.Args[0] 1862 if v_0.Op != OpConst64 { 1863 break 1864 } 1865 c := v_0.AuxInt 1866 v_1 := v.Args[1] 1867 if v_1.Op != OpConst64 { 1868 break 1869 } 1870 d := v_1.AuxInt 1871 v.reset(OpConst64) 1872 v.AuxInt = c + d 1873 return true 1874 } 1875 // match: (Add64 (Const64 [d]) (Const64 [c])) 1876 // cond: 1877 // result: (Const64 [c+d]) 1878 for { 1879 v_0 := v.Args[0] 1880 if v_0.Op != OpConst64 { 1881 break 1882 } 1883 d := v_0.AuxInt 1884 v_1 := v.Args[1] 1885 if v_1.Op != OpConst64 { 1886 break 1887 } 1888 c := v_1.AuxInt 1889 v.reset(OpConst64) 1890 v.AuxInt = c + d 1891 return true 1892 } 1893 // match: (Add64 (Const64 [0]) x) 1894 // cond: 1895 // result: x 1896 for { 1897 v_0 := v.Args[0] 1898 if v_0.Op != OpConst64 { 1899 break 1900 } 1901 if v_0.AuxInt != 0 { 1902 break 1903 } 1904 x := v.Args[1] 1905 v.reset(OpCopy) 1906 v.Type = x.Type 1907 v.AddArg(x) 1908 return true 1909 } 1910 // match: (Add64 x (Const64 [0])) 1911 // cond: 1912 // result: x 1913 for { 1914 x := v.Args[0] 1915 v_1 := v.Args[1] 1916 if v_1.Op != OpConst64 { 1917 break 1918 } 1919 if v_1.AuxInt != 0 { 1920 break 1921 } 1922 v.reset(OpCopy) 1923 v.Type = x.Type 1924 v.AddArg(x) 1925 return true 1926 } 1927 // match: (Add64 (Const64 [1]) (Com64 x)) 1928 // cond: 1929 // result: (Neg64 x) 1930 for { 1931 v_0 := v.Args[0] 1932 if v_0.Op != OpConst64 { 1933 break 1934 } 1935 if v_0.AuxInt != 1 { 1936 break 1937 } 1938 v_1 := v.Args[1] 1939 if v_1.Op != OpCom64 { 1940 break 1941 } 1942 x := v_1.Args[0] 1943 v.reset(OpNeg64) 1944 v.AddArg(x) 1945 return true 1946 } 1947 // match: (Add64 (Com64 x) (Const64 [1])) 1948 // cond: 1949 // result: (Neg64 x) 1950 for { 1951 v_0 := v.Args[0] 1952 if v_0.Op != OpCom64 { 1953 break 1954 } 1955 x := v_0.Args[0] 1956 v_1 := v.Args[1] 1957 if v_1.Op != OpConst64 { 1958 break 1959 } 1960 if v_1.AuxInt != 1 { 1961 break 1962 } 1963 v.reset(OpNeg64) 1964 v.AddArg(x) 1965 return true 1966 } 1967 // match: (Add64 (Add64 i:(Const64 <t>) z) x) 1968 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 1969 // result: (Add64 i (Add64 <t> z x)) 1970 for { 1971 v_0 := v.Args[0] 1972 if v_0.Op != OpAdd64 { 1973 break 1974 } 1975 i := v_0.Args[0] 1976 if i.Op != OpConst64 { 1977 break 1978 } 1979 t := i.Type 1980 z := v_0.Args[1] 1981 x := v.Args[1] 1982 if !(z.Op != OpConst64 && x.Op != OpConst64) { 1983 break 1984 } 1985 v.reset(OpAdd64) 1986 v.AddArg(i) 1987 v0 := b.NewValue0(v.Pos, OpAdd64, t) 1988 v0.AddArg(z) 1989 v0.AddArg(x) 1990 v.AddArg(v0) 1991 return true 1992 } 1993 // match: (Add64 (Add64 z i:(Const64 <t>)) x) 1994 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 1995 // result: (Add64 i (Add64 <t> z x)) 1996 for { 1997 v_0 := v.Args[0] 1998 if v_0.Op != OpAdd64 { 1999 break 2000 } 2001 z := v_0.Args[0] 2002 i := v_0.Args[1] 2003 if i.Op != OpConst64 { 2004 break 2005 } 2006 t := i.Type 2007 x := v.Args[1] 2008 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2009 break 2010 } 2011 v.reset(OpAdd64) 2012 v.AddArg(i) 2013 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2014 v0.AddArg(z) 2015 v0.AddArg(x) 2016 v.AddArg(v0) 2017 return true 2018 } 2019 // match: (Add64 x (Add64 i:(Const64 <t>) z)) 2020 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2021 // result: (Add64 i (Add64 <t> z x)) 2022 for { 2023 x := v.Args[0] 2024 v_1 := v.Args[1] 2025 if v_1.Op != OpAdd64 { 2026 break 2027 } 2028 i := v_1.Args[0] 2029 if i.Op != OpConst64 { 2030 break 2031 } 2032 t := i.Type 2033 z := v_1.Args[1] 2034 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2035 break 2036 } 2037 v.reset(OpAdd64) 2038 v.AddArg(i) 2039 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2040 v0.AddArg(z) 2041 v0.AddArg(x) 2042 v.AddArg(v0) 2043 return true 2044 } 2045 // match: (Add64 x (Add64 z i:(Const64 <t>))) 2046 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2047 // result: (Add64 i (Add64 <t> z x)) 2048 for { 2049 x := v.Args[0] 2050 v_1 := v.Args[1] 2051 if v_1.Op != OpAdd64 { 2052 break 2053 } 2054 z := v_1.Args[0] 2055 i := v_1.Args[1] 2056 if i.Op != OpConst64 { 2057 break 2058 } 2059 t := i.Type 2060 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2061 break 2062 } 2063 v.reset(OpAdd64) 2064 v.AddArg(i) 2065 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2066 v0.AddArg(z) 2067 v0.AddArg(x) 2068 v.AddArg(v0) 2069 return true 2070 } 2071 return false 2072 } 2073 func rewriteValuegeneric_OpAdd64_10(v *Value) bool { 2074 b := v.Block 2075 _ = b 2076 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 2077 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2078 // result: (Add64 i (Sub64 <t> x z)) 2079 for { 2080 v_0 := v.Args[0] 2081 if v_0.Op != OpSub64 { 2082 break 2083 } 2084 i := v_0.Args[0] 2085 if i.Op != OpConst64 { 2086 break 2087 } 2088 t := i.Type 2089 z := v_0.Args[1] 2090 x := v.Args[1] 2091 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2092 break 2093 } 2094 v.reset(OpAdd64) 2095 v.AddArg(i) 2096 v0 := b.NewValue0(v.Pos, OpSub64, t) 2097 v0.AddArg(x) 2098 v0.AddArg(z) 2099 v.AddArg(v0) 2100 return true 2101 } 2102 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2103 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2104 // result: (Add64 i (Sub64 <t> x z)) 2105 for { 2106 x := v.Args[0] 2107 v_1 := v.Args[1] 2108 if v_1.Op != OpSub64 { 2109 break 2110 } 2111 i := v_1.Args[0] 2112 if i.Op != OpConst64 { 2113 break 2114 } 2115 t := i.Type 2116 z := v_1.Args[1] 2117 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2118 break 2119 } 2120 v.reset(OpAdd64) 2121 v.AddArg(i) 2122 v0 := b.NewValue0(v.Pos, OpSub64, t) 2123 v0.AddArg(x) 2124 v0.AddArg(z) 2125 v.AddArg(v0) 2126 return true 2127 } 2128 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2129 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2130 // result: (Add64 i (Sub64 <t> x z)) 2131 for { 2132 x := v.Args[0] 2133 v_1 := v.Args[1] 2134 if v_1.Op != OpSub64 { 2135 break 2136 } 2137 i := v_1.Args[0] 2138 if i.Op != OpConst64 { 2139 break 2140 } 2141 t := i.Type 2142 z := v_1.Args[1] 2143 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2144 break 2145 } 2146 v.reset(OpAdd64) 2147 v.AddArg(i) 2148 v0 := b.NewValue0(v.Pos, OpSub64, t) 2149 v0.AddArg(x) 2150 v0.AddArg(z) 2151 v.AddArg(v0) 2152 return true 2153 } 2154 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 2155 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2156 // result: (Add64 i (Sub64 <t> x z)) 2157 for { 2158 v_0 := v.Args[0] 2159 if v_0.Op != OpSub64 { 2160 break 2161 } 2162 i := v_0.Args[0] 2163 if i.Op != OpConst64 { 2164 break 2165 } 2166 t := i.Type 2167 z := v_0.Args[1] 2168 x := v.Args[1] 2169 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2170 break 2171 } 2172 v.reset(OpAdd64) 2173 v.AddArg(i) 2174 v0 := b.NewValue0(v.Pos, OpSub64, t) 2175 v0.AddArg(x) 2176 v0.AddArg(z) 2177 v.AddArg(v0) 2178 return true 2179 } 2180 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 2181 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2182 // result: (Sub64 (Add64 <t> x z) i) 2183 for { 2184 v_0 := v.Args[0] 2185 if v_0.Op != OpSub64 { 2186 break 2187 } 2188 z := v_0.Args[0] 2189 i := v_0.Args[1] 2190 if i.Op != OpConst64 { 2191 break 2192 } 2193 t := i.Type 2194 x := v.Args[1] 2195 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2196 break 2197 } 2198 v.reset(OpSub64) 2199 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2200 v0.AddArg(x) 2201 v0.AddArg(z) 2202 v.AddArg(v0) 2203 v.AddArg(i) 2204 return true 2205 } 2206 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 2207 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2208 // result: (Sub64 (Add64 <t> x z) i) 2209 for { 2210 x := v.Args[0] 2211 v_1 := v.Args[1] 2212 if v_1.Op != OpSub64 { 2213 break 2214 } 2215 z := v_1.Args[0] 2216 i := v_1.Args[1] 2217 if i.Op != OpConst64 { 2218 break 2219 } 2220 t := i.Type 2221 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2222 break 2223 } 2224 v.reset(OpSub64) 2225 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2226 v0.AddArg(x) 2227 v0.AddArg(z) 2228 v.AddArg(v0) 2229 v.AddArg(i) 2230 return true 2231 } 2232 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 2233 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2234 // result: (Sub64 (Add64 <t> x z) i) 2235 for { 2236 x := v.Args[0] 2237 v_1 := v.Args[1] 2238 if v_1.Op != OpSub64 { 2239 break 2240 } 2241 z := v_1.Args[0] 2242 i := v_1.Args[1] 2243 if i.Op != OpConst64 { 2244 break 2245 } 2246 t := i.Type 2247 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2248 break 2249 } 2250 v.reset(OpSub64) 2251 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2252 v0.AddArg(x) 2253 v0.AddArg(z) 2254 v.AddArg(v0) 2255 v.AddArg(i) 2256 return true 2257 } 2258 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 2259 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2260 // result: (Sub64 (Add64 <t> x z) i) 2261 for { 2262 v_0 := v.Args[0] 2263 if v_0.Op != OpSub64 { 2264 break 2265 } 2266 z := v_0.Args[0] 2267 i := v_0.Args[1] 2268 if i.Op != OpConst64 { 2269 break 2270 } 2271 t := i.Type 2272 x := v.Args[1] 2273 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2274 break 2275 } 2276 v.reset(OpSub64) 2277 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2278 v0.AddArg(x) 2279 v0.AddArg(z) 2280 v.AddArg(v0) 2281 v.AddArg(i) 2282 return true 2283 } 2284 // match: (Add64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 2285 // cond: 2286 // result: (Add64 (Const64 <t> [c+d]) x) 2287 for { 2288 v_0 := v.Args[0] 2289 if v_0.Op != OpConst64 { 2290 break 2291 } 2292 t := v_0.Type 2293 c := v_0.AuxInt 2294 v_1 := v.Args[1] 2295 if v_1.Op != OpAdd64 { 2296 break 2297 } 2298 v_1_0 := v_1.Args[0] 2299 if v_1_0.Op != OpConst64 { 2300 break 2301 } 2302 if v_1_0.Type != t { 2303 break 2304 } 2305 d := v_1_0.AuxInt 2306 x := v_1.Args[1] 2307 v.reset(OpAdd64) 2308 v0 := b.NewValue0(v.Pos, OpConst64, t) 2309 v0.AuxInt = c + d 2310 v.AddArg(v0) 2311 v.AddArg(x) 2312 return true 2313 } 2314 // match: (Add64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 2315 // cond: 2316 // result: (Add64 (Const64 <t> [c+d]) x) 2317 for { 2318 v_0 := v.Args[0] 2319 if v_0.Op != OpConst64 { 2320 break 2321 } 2322 t := v_0.Type 2323 c := v_0.AuxInt 2324 v_1 := v.Args[1] 2325 if v_1.Op != OpAdd64 { 2326 break 2327 } 2328 x := v_1.Args[0] 2329 v_1_1 := v_1.Args[1] 2330 if v_1_1.Op != OpConst64 { 2331 break 2332 } 2333 if v_1_1.Type != t { 2334 break 2335 } 2336 d := v_1_1.AuxInt 2337 v.reset(OpAdd64) 2338 v0 := b.NewValue0(v.Pos, OpConst64, t) 2339 v0.AuxInt = c + d 2340 v.AddArg(v0) 2341 v.AddArg(x) 2342 return true 2343 } 2344 return false 2345 } 2346 func rewriteValuegeneric_OpAdd64_20(v *Value) bool { 2347 b := v.Block 2348 _ = b 2349 // match: (Add64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 2350 // cond: 2351 // result: (Add64 (Const64 <t> [c+d]) x) 2352 for { 2353 v_0 := v.Args[0] 2354 if v_0.Op != OpAdd64 { 2355 break 2356 } 2357 v_0_0 := v_0.Args[0] 2358 if v_0_0.Op != OpConst64 { 2359 break 2360 } 2361 t := v_0_0.Type 2362 d := v_0_0.AuxInt 2363 x := v_0.Args[1] 2364 v_1 := v.Args[1] 2365 if v_1.Op != OpConst64 { 2366 break 2367 } 2368 if v_1.Type != t { 2369 break 2370 } 2371 c := v_1.AuxInt 2372 v.reset(OpAdd64) 2373 v0 := b.NewValue0(v.Pos, OpConst64, t) 2374 v0.AuxInt = c + d 2375 v.AddArg(v0) 2376 v.AddArg(x) 2377 return true 2378 } 2379 // match: (Add64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 2380 // cond: 2381 // result: (Add64 (Const64 <t> [c+d]) x) 2382 for { 2383 v_0 := v.Args[0] 2384 if v_0.Op != OpAdd64 { 2385 break 2386 } 2387 x := v_0.Args[0] 2388 v_0_1 := v_0.Args[1] 2389 if v_0_1.Op != OpConst64 { 2390 break 2391 } 2392 t := v_0_1.Type 2393 d := v_0_1.AuxInt 2394 v_1 := v.Args[1] 2395 if v_1.Op != OpConst64 { 2396 break 2397 } 2398 if v_1.Type != t { 2399 break 2400 } 2401 c := v_1.AuxInt 2402 v.reset(OpAdd64) 2403 v0 := b.NewValue0(v.Pos, OpConst64, t) 2404 v0.AuxInt = c + d 2405 v.AddArg(v0) 2406 v.AddArg(x) 2407 return true 2408 } 2409 // match: (Add64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 2410 // cond: 2411 // result: (Sub64 (Const64 <t> [c+d]) x) 2412 for { 2413 v_0 := v.Args[0] 2414 if v_0.Op != OpConst64 { 2415 break 2416 } 2417 t := v_0.Type 2418 c := v_0.AuxInt 2419 v_1 := v.Args[1] 2420 if v_1.Op != OpSub64 { 2421 break 2422 } 2423 v_1_0 := v_1.Args[0] 2424 if v_1_0.Op != OpConst64 { 2425 break 2426 } 2427 if v_1_0.Type != t { 2428 break 2429 } 2430 d := v_1_0.AuxInt 2431 x := v_1.Args[1] 2432 v.reset(OpSub64) 2433 v0 := b.NewValue0(v.Pos, OpConst64, t) 2434 v0.AuxInt = c + d 2435 v.AddArg(v0) 2436 v.AddArg(x) 2437 return true 2438 } 2439 // match: (Add64 (Sub64 (Const64 <t> [d]) x) (Const64 <t> [c])) 2440 // cond: 2441 // result: (Sub64 (Const64 <t> [c+d]) x) 2442 for { 2443 v_0 := v.Args[0] 2444 if v_0.Op != OpSub64 { 2445 break 2446 } 2447 v_0_0 := v_0.Args[0] 2448 if v_0_0.Op != OpConst64 { 2449 break 2450 } 2451 t := v_0_0.Type 2452 d := v_0_0.AuxInt 2453 x := v_0.Args[1] 2454 v_1 := v.Args[1] 2455 if v_1.Op != OpConst64 { 2456 break 2457 } 2458 if v_1.Type != t { 2459 break 2460 } 2461 c := v_1.AuxInt 2462 v.reset(OpSub64) 2463 v0 := b.NewValue0(v.Pos, OpConst64, t) 2464 v0.AuxInt = c + d 2465 v.AddArg(v0) 2466 v.AddArg(x) 2467 return true 2468 } 2469 // match: (Add64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 2470 // cond: 2471 // result: (Add64 (Const64 <t> [c-d]) x) 2472 for { 2473 v_0 := v.Args[0] 2474 if v_0.Op != OpConst64 { 2475 break 2476 } 2477 t := v_0.Type 2478 c := v_0.AuxInt 2479 v_1 := v.Args[1] 2480 if v_1.Op != OpSub64 { 2481 break 2482 } 2483 x := v_1.Args[0] 2484 v_1_1 := v_1.Args[1] 2485 if v_1_1.Op != OpConst64 { 2486 break 2487 } 2488 if v_1_1.Type != t { 2489 break 2490 } 2491 d := v_1_1.AuxInt 2492 v.reset(OpAdd64) 2493 v0 := b.NewValue0(v.Pos, OpConst64, t) 2494 v0.AuxInt = c - d 2495 v.AddArg(v0) 2496 v.AddArg(x) 2497 return true 2498 } 2499 // match: (Add64 (Sub64 x (Const64 <t> [d])) (Const64 <t> [c])) 2500 // cond: 2501 // result: (Add64 (Const64 <t> [c-d]) x) 2502 for { 2503 v_0 := v.Args[0] 2504 if v_0.Op != OpSub64 { 2505 break 2506 } 2507 x := v_0.Args[0] 2508 v_0_1 := v_0.Args[1] 2509 if v_0_1.Op != OpConst64 { 2510 break 2511 } 2512 t := v_0_1.Type 2513 d := v_0_1.AuxInt 2514 v_1 := v.Args[1] 2515 if v_1.Op != OpConst64 { 2516 break 2517 } 2518 if v_1.Type != t { 2519 break 2520 } 2521 c := v_1.AuxInt 2522 v.reset(OpAdd64) 2523 v0 := b.NewValue0(v.Pos, OpConst64, t) 2524 v0.AuxInt = c - d 2525 v.AddArg(v0) 2526 v.AddArg(x) 2527 return true 2528 } 2529 return false 2530 } 2531 func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { 2532 // match: (Add64F (Const64F [c]) (Const64F [d])) 2533 // cond: 2534 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 2535 for { 2536 v_0 := v.Args[0] 2537 if v_0.Op != OpConst64F { 2538 break 2539 } 2540 c := v_0.AuxInt 2541 v_1 := v.Args[1] 2542 if v_1.Op != OpConst64F { 2543 break 2544 } 2545 d := v_1.AuxInt 2546 v.reset(OpConst64F) 2547 v.AuxInt = f2i(i2f(c) + i2f(d)) 2548 return true 2549 } 2550 // match: (Add64F (Const64F [d]) (Const64F [c])) 2551 // cond: 2552 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 2553 for { 2554 v_0 := v.Args[0] 2555 if v_0.Op != OpConst64F { 2556 break 2557 } 2558 d := v_0.AuxInt 2559 v_1 := v.Args[1] 2560 if v_1.Op != OpConst64F { 2561 break 2562 } 2563 c := v_1.AuxInt 2564 v.reset(OpConst64F) 2565 v.AuxInt = f2i(i2f(c) + i2f(d)) 2566 return true 2567 } 2568 // match: (Add64F x (Const64F [0])) 2569 // cond: 2570 // result: x 2571 for { 2572 x := v.Args[0] 2573 v_1 := v.Args[1] 2574 if v_1.Op != OpConst64F { 2575 break 2576 } 2577 if v_1.AuxInt != 0 { 2578 break 2579 } 2580 v.reset(OpCopy) 2581 v.Type = x.Type 2582 v.AddArg(x) 2583 return true 2584 } 2585 // match: (Add64F (Const64F [0]) x) 2586 // cond: 2587 // result: x 2588 for { 2589 v_0 := v.Args[0] 2590 if v_0.Op != OpConst64F { 2591 break 2592 } 2593 if v_0.AuxInt != 0 { 2594 break 2595 } 2596 x := v.Args[1] 2597 v.reset(OpCopy) 2598 v.Type = x.Type 2599 v.AddArg(x) 2600 return true 2601 } 2602 return false 2603 } 2604 func rewriteValuegeneric_OpAdd8_0(v *Value) bool { 2605 b := v.Block 2606 _ = b 2607 // match: (Add8 (Const8 [c]) (Const8 [d])) 2608 // cond: 2609 // result: (Const8 [int64(int8(c+d))]) 2610 for { 2611 v_0 := v.Args[0] 2612 if v_0.Op != OpConst8 { 2613 break 2614 } 2615 c := v_0.AuxInt 2616 v_1 := v.Args[1] 2617 if v_1.Op != OpConst8 { 2618 break 2619 } 2620 d := v_1.AuxInt 2621 v.reset(OpConst8) 2622 v.AuxInt = int64(int8(c + d)) 2623 return true 2624 } 2625 // match: (Add8 (Const8 [d]) (Const8 [c])) 2626 // cond: 2627 // result: (Const8 [int64(int8(c+d))]) 2628 for { 2629 v_0 := v.Args[0] 2630 if v_0.Op != OpConst8 { 2631 break 2632 } 2633 d := v_0.AuxInt 2634 v_1 := v.Args[1] 2635 if v_1.Op != OpConst8 { 2636 break 2637 } 2638 c := v_1.AuxInt 2639 v.reset(OpConst8) 2640 v.AuxInt = int64(int8(c + d)) 2641 return true 2642 } 2643 // match: (Add8 (Const8 [0]) x) 2644 // cond: 2645 // result: x 2646 for { 2647 v_0 := v.Args[0] 2648 if v_0.Op != OpConst8 { 2649 break 2650 } 2651 if v_0.AuxInt != 0 { 2652 break 2653 } 2654 x := v.Args[1] 2655 v.reset(OpCopy) 2656 v.Type = x.Type 2657 v.AddArg(x) 2658 return true 2659 } 2660 // match: (Add8 x (Const8 [0])) 2661 // cond: 2662 // result: x 2663 for { 2664 x := v.Args[0] 2665 v_1 := v.Args[1] 2666 if v_1.Op != OpConst8 { 2667 break 2668 } 2669 if v_1.AuxInt != 0 { 2670 break 2671 } 2672 v.reset(OpCopy) 2673 v.Type = x.Type 2674 v.AddArg(x) 2675 return true 2676 } 2677 // match: (Add8 (Const8 [1]) (Com8 x)) 2678 // cond: 2679 // result: (Neg8 x) 2680 for { 2681 v_0 := v.Args[0] 2682 if v_0.Op != OpConst8 { 2683 break 2684 } 2685 if v_0.AuxInt != 1 { 2686 break 2687 } 2688 v_1 := v.Args[1] 2689 if v_1.Op != OpCom8 { 2690 break 2691 } 2692 x := v_1.Args[0] 2693 v.reset(OpNeg8) 2694 v.AddArg(x) 2695 return true 2696 } 2697 // match: (Add8 (Com8 x) (Const8 [1])) 2698 // cond: 2699 // result: (Neg8 x) 2700 for { 2701 v_0 := v.Args[0] 2702 if v_0.Op != OpCom8 { 2703 break 2704 } 2705 x := v_0.Args[0] 2706 v_1 := v.Args[1] 2707 if v_1.Op != OpConst8 { 2708 break 2709 } 2710 if v_1.AuxInt != 1 { 2711 break 2712 } 2713 v.reset(OpNeg8) 2714 v.AddArg(x) 2715 return true 2716 } 2717 // match: (Add8 (Add8 i:(Const8 <t>) z) x) 2718 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2719 // result: (Add8 i (Add8 <t> z x)) 2720 for { 2721 v_0 := v.Args[0] 2722 if v_0.Op != OpAdd8 { 2723 break 2724 } 2725 i := v_0.Args[0] 2726 if i.Op != OpConst8 { 2727 break 2728 } 2729 t := i.Type 2730 z := v_0.Args[1] 2731 x := v.Args[1] 2732 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2733 break 2734 } 2735 v.reset(OpAdd8) 2736 v.AddArg(i) 2737 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2738 v0.AddArg(z) 2739 v0.AddArg(x) 2740 v.AddArg(v0) 2741 return true 2742 } 2743 // match: (Add8 (Add8 z i:(Const8 <t>)) x) 2744 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2745 // result: (Add8 i (Add8 <t> z x)) 2746 for { 2747 v_0 := v.Args[0] 2748 if v_0.Op != OpAdd8 { 2749 break 2750 } 2751 z := v_0.Args[0] 2752 i := v_0.Args[1] 2753 if i.Op != OpConst8 { 2754 break 2755 } 2756 t := i.Type 2757 x := v.Args[1] 2758 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2759 break 2760 } 2761 v.reset(OpAdd8) 2762 v.AddArg(i) 2763 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2764 v0.AddArg(z) 2765 v0.AddArg(x) 2766 v.AddArg(v0) 2767 return true 2768 } 2769 // match: (Add8 x (Add8 i:(Const8 <t>) z)) 2770 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2771 // result: (Add8 i (Add8 <t> z x)) 2772 for { 2773 x := v.Args[0] 2774 v_1 := v.Args[1] 2775 if v_1.Op != OpAdd8 { 2776 break 2777 } 2778 i := v_1.Args[0] 2779 if i.Op != OpConst8 { 2780 break 2781 } 2782 t := i.Type 2783 z := v_1.Args[1] 2784 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2785 break 2786 } 2787 v.reset(OpAdd8) 2788 v.AddArg(i) 2789 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2790 v0.AddArg(z) 2791 v0.AddArg(x) 2792 v.AddArg(v0) 2793 return true 2794 } 2795 // match: (Add8 x (Add8 z i:(Const8 <t>))) 2796 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2797 // result: (Add8 i (Add8 <t> z x)) 2798 for { 2799 x := v.Args[0] 2800 v_1 := v.Args[1] 2801 if v_1.Op != OpAdd8 { 2802 break 2803 } 2804 z := v_1.Args[0] 2805 i := v_1.Args[1] 2806 if i.Op != OpConst8 { 2807 break 2808 } 2809 t := i.Type 2810 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2811 break 2812 } 2813 v.reset(OpAdd8) 2814 v.AddArg(i) 2815 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2816 v0.AddArg(z) 2817 v0.AddArg(x) 2818 v.AddArg(v0) 2819 return true 2820 } 2821 return false 2822 } 2823 func rewriteValuegeneric_OpAdd8_10(v *Value) bool { 2824 b := v.Block 2825 _ = b 2826 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 2827 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2828 // result: (Add8 i (Sub8 <t> x z)) 2829 for { 2830 v_0 := v.Args[0] 2831 if v_0.Op != OpSub8 { 2832 break 2833 } 2834 i := v_0.Args[0] 2835 if i.Op != OpConst8 { 2836 break 2837 } 2838 t := i.Type 2839 z := v_0.Args[1] 2840 x := v.Args[1] 2841 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2842 break 2843 } 2844 v.reset(OpAdd8) 2845 v.AddArg(i) 2846 v0 := b.NewValue0(v.Pos, OpSub8, t) 2847 v0.AddArg(x) 2848 v0.AddArg(z) 2849 v.AddArg(v0) 2850 return true 2851 } 2852 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 2853 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2854 // result: (Add8 i (Sub8 <t> x z)) 2855 for { 2856 x := v.Args[0] 2857 v_1 := v.Args[1] 2858 if v_1.Op != OpSub8 { 2859 break 2860 } 2861 i := v_1.Args[0] 2862 if i.Op != OpConst8 { 2863 break 2864 } 2865 t := i.Type 2866 z := v_1.Args[1] 2867 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2868 break 2869 } 2870 v.reset(OpAdd8) 2871 v.AddArg(i) 2872 v0 := b.NewValue0(v.Pos, OpSub8, t) 2873 v0.AddArg(x) 2874 v0.AddArg(z) 2875 v.AddArg(v0) 2876 return true 2877 } 2878 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 2879 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2880 // result: (Add8 i (Sub8 <t> x z)) 2881 for { 2882 x := v.Args[0] 2883 v_1 := v.Args[1] 2884 if v_1.Op != OpSub8 { 2885 break 2886 } 2887 i := v_1.Args[0] 2888 if i.Op != OpConst8 { 2889 break 2890 } 2891 t := i.Type 2892 z := v_1.Args[1] 2893 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2894 break 2895 } 2896 v.reset(OpAdd8) 2897 v.AddArg(i) 2898 v0 := b.NewValue0(v.Pos, OpSub8, t) 2899 v0.AddArg(x) 2900 v0.AddArg(z) 2901 v.AddArg(v0) 2902 return true 2903 } 2904 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 2905 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2906 // result: (Add8 i (Sub8 <t> x z)) 2907 for { 2908 v_0 := v.Args[0] 2909 if v_0.Op != OpSub8 { 2910 break 2911 } 2912 i := v_0.Args[0] 2913 if i.Op != OpConst8 { 2914 break 2915 } 2916 t := i.Type 2917 z := v_0.Args[1] 2918 x := v.Args[1] 2919 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2920 break 2921 } 2922 v.reset(OpAdd8) 2923 v.AddArg(i) 2924 v0 := b.NewValue0(v.Pos, OpSub8, t) 2925 v0.AddArg(x) 2926 v0.AddArg(z) 2927 v.AddArg(v0) 2928 return true 2929 } 2930 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 2931 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2932 // result: (Sub8 (Add8 <t> x z) i) 2933 for { 2934 v_0 := v.Args[0] 2935 if v_0.Op != OpSub8 { 2936 break 2937 } 2938 z := v_0.Args[0] 2939 i := v_0.Args[1] 2940 if i.Op != OpConst8 { 2941 break 2942 } 2943 t := i.Type 2944 x := v.Args[1] 2945 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2946 break 2947 } 2948 v.reset(OpSub8) 2949 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2950 v0.AddArg(x) 2951 v0.AddArg(z) 2952 v.AddArg(v0) 2953 v.AddArg(i) 2954 return true 2955 } 2956 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 2957 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2958 // result: (Sub8 (Add8 <t> x z) i) 2959 for { 2960 x := v.Args[0] 2961 v_1 := v.Args[1] 2962 if v_1.Op != OpSub8 { 2963 break 2964 } 2965 z := v_1.Args[0] 2966 i := v_1.Args[1] 2967 if i.Op != OpConst8 { 2968 break 2969 } 2970 t := i.Type 2971 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2972 break 2973 } 2974 v.reset(OpSub8) 2975 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2976 v0.AddArg(x) 2977 v0.AddArg(z) 2978 v.AddArg(v0) 2979 v.AddArg(i) 2980 return true 2981 } 2982 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 2983 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2984 // result: (Sub8 (Add8 <t> x z) i) 2985 for { 2986 x := v.Args[0] 2987 v_1 := v.Args[1] 2988 if v_1.Op != OpSub8 { 2989 break 2990 } 2991 z := v_1.Args[0] 2992 i := v_1.Args[1] 2993 if i.Op != OpConst8 { 2994 break 2995 } 2996 t := i.Type 2997 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2998 break 2999 } 3000 v.reset(OpSub8) 3001 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3002 v0.AddArg(x) 3003 v0.AddArg(z) 3004 v.AddArg(v0) 3005 v.AddArg(i) 3006 return true 3007 } 3008 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 3009 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3010 // result: (Sub8 (Add8 <t> x z) i) 3011 for { 3012 v_0 := v.Args[0] 3013 if v_0.Op != OpSub8 { 3014 break 3015 } 3016 z := v_0.Args[0] 3017 i := v_0.Args[1] 3018 if i.Op != OpConst8 { 3019 break 3020 } 3021 t := i.Type 3022 x := v.Args[1] 3023 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3024 break 3025 } 3026 v.reset(OpSub8) 3027 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3028 v0.AddArg(x) 3029 v0.AddArg(z) 3030 v.AddArg(v0) 3031 v.AddArg(i) 3032 return true 3033 } 3034 // match: (Add8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 3035 // cond: 3036 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 3037 for { 3038 v_0 := v.Args[0] 3039 if v_0.Op != OpConst8 { 3040 break 3041 } 3042 t := v_0.Type 3043 c := v_0.AuxInt 3044 v_1 := v.Args[1] 3045 if v_1.Op != OpAdd8 { 3046 break 3047 } 3048 v_1_0 := v_1.Args[0] 3049 if v_1_0.Op != OpConst8 { 3050 break 3051 } 3052 if v_1_0.Type != t { 3053 break 3054 } 3055 d := v_1_0.AuxInt 3056 x := v_1.Args[1] 3057 v.reset(OpAdd8) 3058 v0 := b.NewValue0(v.Pos, OpConst8, t) 3059 v0.AuxInt = int64(int8(c + d)) 3060 v.AddArg(v0) 3061 v.AddArg(x) 3062 return true 3063 } 3064 // match: (Add8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 3065 // cond: 3066 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 3067 for { 3068 v_0 := v.Args[0] 3069 if v_0.Op != OpConst8 { 3070 break 3071 } 3072 t := v_0.Type 3073 c := v_0.AuxInt 3074 v_1 := v.Args[1] 3075 if v_1.Op != OpAdd8 { 3076 break 3077 } 3078 x := v_1.Args[0] 3079 v_1_1 := v_1.Args[1] 3080 if v_1_1.Op != OpConst8 { 3081 break 3082 } 3083 if v_1_1.Type != t { 3084 break 3085 } 3086 d := v_1_1.AuxInt 3087 v.reset(OpAdd8) 3088 v0 := b.NewValue0(v.Pos, OpConst8, t) 3089 v0.AuxInt = int64(int8(c + d)) 3090 v.AddArg(v0) 3091 v.AddArg(x) 3092 return true 3093 } 3094 return false 3095 } 3096 func rewriteValuegeneric_OpAdd8_20(v *Value) bool { 3097 b := v.Block 3098 _ = b 3099 // match: (Add8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 3100 // cond: 3101 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 3102 for { 3103 v_0 := v.Args[0] 3104 if v_0.Op != OpAdd8 { 3105 break 3106 } 3107 v_0_0 := v_0.Args[0] 3108 if v_0_0.Op != OpConst8 { 3109 break 3110 } 3111 t := v_0_0.Type 3112 d := v_0_0.AuxInt 3113 x := v_0.Args[1] 3114 v_1 := v.Args[1] 3115 if v_1.Op != OpConst8 { 3116 break 3117 } 3118 if v_1.Type != t { 3119 break 3120 } 3121 c := v_1.AuxInt 3122 v.reset(OpAdd8) 3123 v0 := b.NewValue0(v.Pos, OpConst8, t) 3124 v0.AuxInt = int64(int8(c + d)) 3125 v.AddArg(v0) 3126 v.AddArg(x) 3127 return true 3128 } 3129 // match: (Add8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 3130 // cond: 3131 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 3132 for { 3133 v_0 := v.Args[0] 3134 if v_0.Op != OpAdd8 { 3135 break 3136 } 3137 x := v_0.Args[0] 3138 v_0_1 := v_0.Args[1] 3139 if v_0_1.Op != OpConst8 { 3140 break 3141 } 3142 t := v_0_1.Type 3143 d := v_0_1.AuxInt 3144 v_1 := v.Args[1] 3145 if v_1.Op != OpConst8 { 3146 break 3147 } 3148 if v_1.Type != t { 3149 break 3150 } 3151 c := v_1.AuxInt 3152 v.reset(OpAdd8) 3153 v0 := b.NewValue0(v.Pos, OpConst8, t) 3154 v0.AuxInt = int64(int8(c + d)) 3155 v.AddArg(v0) 3156 v.AddArg(x) 3157 return true 3158 } 3159 // match: (Add8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 3160 // cond: 3161 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 3162 for { 3163 v_0 := v.Args[0] 3164 if v_0.Op != OpConst8 { 3165 break 3166 } 3167 t := v_0.Type 3168 c := v_0.AuxInt 3169 v_1 := v.Args[1] 3170 if v_1.Op != OpSub8 { 3171 break 3172 } 3173 v_1_0 := v_1.Args[0] 3174 if v_1_0.Op != OpConst8 { 3175 break 3176 } 3177 if v_1_0.Type != t { 3178 break 3179 } 3180 d := v_1_0.AuxInt 3181 x := v_1.Args[1] 3182 v.reset(OpSub8) 3183 v0 := b.NewValue0(v.Pos, OpConst8, t) 3184 v0.AuxInt = int64(int8(c + d)) 3185 v.AddArg(v0) 3186 v.AddArg(x) 3187 return true 3188 } 3189 // match: (Add8 (Sub8 (Const8 <t> [d]) x) (Const8 <t> [c])) 3190 // cond: 3191 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 3192 for { 3193 v_0 := v.Args[0] 3194 if v_0.Op != OpSub8 { 3195 break 3196 } 3197 v_0_0 := v_0.Args[0] 3198 if v_0_0.Op != OpConst8 { 3199 break 3200 } 3201 t := v_0_0.Type 3202 d := v_0_0.AuxInt 3203 x := v_0.Args[1] 3204 v_1 := v.Args[1] 3205 if v_1.Op != OpConst8 { 3206 break 3207 } 3208 if v_1.Type != t { 3209 break 3210 } 3211 c := v_1.AuxInt 3212 v.reset(OpSub8) 3213 v0 := b.NewValue0(v.Pos, OpConst8, t) 3214 v0.AuxInt = int64(int8(c + d)) 3215 v.AddArg(v0) 3216 v.AddArg(x) 3217 return true 3218 } 3219 // match: (Add8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 3220 // cond: 3221 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 3222 for { 3223 v_0 := v.Args[0] 3224 if v_0.Op != OpConst8 { 3225 break 3226 } 3227 t := v_0.Type 3228 c := v_0.AuxInt 3229 v_1 := v.Args[1] 3230 if v_1.Op != OpSub8 { 3231 break 3232 } 3233 x := v_1.Args[0] 3234 v_1_1 := v_1.Args[1] 3235 if v_1_1.Op != OpConst8 { 3236 break 3237 } 3238 if v_1_1.Type != t { 3239 break 3240 } 3241 d := v_1_1.AuxInt 3242 v.reset(OpAdd8) 3243 v0 := b.NewValue0(v.Pos, OpConst8, t) 3244 v0.AuxInt = int64(int8(c - d)) 3245 v.AddArg(v0) 3246 v.AddArg(x) 3247 return true 3248 } 3249 // match: (Add8 (Sub8 x (Const8 <t> [d])) (Const8 <t> [c])) 3250 // cond: 3251 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 3252 for { 3253 v_0 := v.Args[0] 3254 if v_0.Op != OpSub8 { 3255 break 3256 } 3257 x := v_0.Args[0] 3258 v_0_1 := v_0.Args[1] 3259 if v_0_1.Op != OpConst8 { 3260 break 3261 } 3262 t := v_0_1.Type 3263 d := v_0_1.AuxInt 3264 v_1 := v.Args[1] 3265 if v_1.Op != OpConst8 { 3266 break 3267 } 3268 if v_1.Type != t { 3269 break 3270 } 3271 c := v_1.AuxInt 3272 v.reset(OpAdd8) 3273 v0 := b.NewValue0(v.Pos, OpConst8, t) 3274 v0.AuxInt = int64(int8(c - d)) 3275 v.AddArg(v0) 3276 v.AddArg(x) 3277 return true 3278 } 3279 return false 3280 } 3281 func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { 3282 // match: (AddPtr <t> x (Const64 [c])) 3283 // cond: 3284 // result: (OffPtr <t> x [c]) 3285 for { 3286 t := v.Type 3287 x := v.Args[0] 3288 v_1 := v.Args[1] 3289 if v_1.Op != OpConst64 { 3290 break 3291 } 3292 c := v_1.AuxInt 3293 v.reset(OpOffPtr) 3294 v.Type = t 3295 v.AuxInt = c 3296 v.AddArg(x) 3297 return true 3298 } 3299 // match: (AddPtr <t> x (Const32 [c])) 3300 // cond: 3301 // result: (OffPtr <t> x [c]) 3302 for { 3303 t := v.Type 3304 x := v.Args[0] 3305 v_1 := v.Args[1] 3306 if v_1.Op != OpConst32 { 3307 break 3308 } 3309 c := v_1.AuxInt 3310 v.reset(OpOffPtr) 3311 v.Type = t 3312 v.AuxInt = c 3313 v.AddArg(x) 3314 return true 3315 } 3316 return false 3317 } 3318 func rewriteValuegeneric_OpAnd16_0(v *Value) bool { 3319 // match: (And16 (Const16 [c]) (Const16 [d])) 3320 // cond: 3321 // result: (Const16 [int64(int16(c&d))]) 3322 for { 3323 v_0 := v.Args[0] 3324 if v_0.Op != OpConst16 { 3325 break 3326 } 3327 c := v_0.AuxInt 3328 v_1 := v.Args[1] 3329 if v_1.Op != OpConst16 { 3330 break 3331 } 3332 d := v_1.AuxInt 3333 v.reset(OpConst16) 3334 v.AuxInt = int64(int16(c & d)) 3335 return true 3336 } 3337 // match: (And16 (Const16 [d]) (Const16 [c])) 3338 // cond: 3339 // result: (Const16 [int64(int16(c&d))]) 3340 for { 3341 v_0 := v.Args[0] 3342 if v_0.Op != OpConst16 { 3343 break 3344 } 3345 d := v_0.AuxInt 3346 v_1 := v.Args[1] 3347 if v_1.Op != OpConst16 { 3348 break 3349 } 3350 c := v_1.AuxInt 3351 v.reset(OpConst16) 3352 v.AuxInt = int64(int16(c & d)) 3353 return true 3354 } 3355 // match: (And16 x x) 3356 // cond: 3357 // result: x 3358 for { 3359 x := v.Args[0] 3360 if x != v.Args[1] { 3361 break 3362 } 3363 v.reset(OpCopy) 3364 v.Type = x.Type 3365 v.AddArg(x) 3366 return true 3367 } 3368 // match: (And16 (Const16 [-1]) x) 3369 // cond: 3370 // result: x 3371 for { 3372 v_0 := v.Args[0] 3373 if v_0.Op != OpConst16 { 3374 break 3375 } 3376 if v_0.AuxInt != -1 { 3377 break 3378 } 3379 x := v.Args[1] 3380 v.reset(OpCopy) 3381 v.Type = x.Type 3382 v.AddArg(x) 3383 return true 3384 } 3385 // match: (And16 x (Const16 [-1])) 3386 // cond: 3387 // result: x 3388 for { 3389 x := v.Args[0] 3390 v_1 := v.Args[1] 3391 if v_1.Op != OpConst16 { 3392 break 3393 } 3394 if v_1.AuxInt != -1 { 3395 break 3396 } 3397 v.reset(OpCopy) 3398 v.Type = x.Type 3399 v.AddArg(x) 3400 return true 3401 } 3402 // match: (And16 (Const16 [0]) _) 3403 // cond: 3404 // result: (Const16 [0]) 3405 for { 3406 v_0 := v.Args[0] 3407 if v_0.Op != OpConst16 { 3408 break 3409 } 3410 if v_0.AuxInt != 0 { 3411 break 3412 } 3413 v.reset(OpConst16) 3414 v.AuxInt = 0 3415 return true 3416 } 3417 // match: (And16 _ (Const16 [0])) 3418 // cond: 3419 // result: (Const16 [0]) 3420 for { 3421 v_1 := v.Args[1] 3422 if v_1.Op != OpConst16 { 3423 break 3424 } 3425 if v_1.AuxInt != 0 { 3426 break 3427 } 3428 v.reset(OpConst16) 3429 v.AuxInt = 0 3430 return true 3431 } 3432 // match: (And16 x (And16 x y)) 3433 // cond: 3434 // result: (And16 x y) 3435 for { 3436 x := v.Args[0] 3437 v_1 := v.Args[1] 3438 if v_1.Op != OpAnd16 { 3439 break 3440 } 3441 if x != v_1.Args[0] { 3442 break 3443 } 3444 y := v_1.Args[1] 3445 v.reset(OpAnd16) 3446 v.AddArg(x) 3447 v.AddArg(y) 3448 return true 3449 } 3450 // match: (And16 x (And16 y x)) 3451 // cond: 3452 // result: (And16 x y) 3453 for { 3454 x := v.Args[0] 3455 v_1 := v.Args[1] 3456 if v_1.Op != OpAnd16 { 3457 break 3458 } 3459 y := v_1.Args[0] 3460 if x != v_1.Args[1] { 3461 break 3462 } 3463 v.reset(OpAnd16) 3464 v.AddArg(x) 3465 v.AddArg(y) 3466 return true 3467 } 3468 // match: (And16 (And16 x y) x) 3469 // cond: 3470 // result: (And16 x y) 3471 for { 3472 v_0 := v.Args[0] 3473 if v_0.Op != OpAnd16 { 3474 break 3475 } 3476 x := v_0.Args[0] 3477 y := v_0.Args[1] 3478 if x != v.Args[1] { 3479 break 3480 } 3481 v.reset(OpAnd16) 3482 v.AddArg(x) 3483 v.AddArg(y) 3484 return true 3485 } 3486 return false 3487 } 3488 func rewriteValuegeneric_OpAnd16_10(v *Value) bool { 3489 b := v.Block 3490 _ = b 3491 // match: (And16 (And16 y x) x) 3492 // cond: 3493 // result: (And16 x y) 3494 for { 3495 v_0 := v.Args[0] 3496 if v_0.Op != OpAnd16 { 3497 break 3498 } 3499 y := v_0.Args[0] 3500 x := v_0.Args[1] 3501 if x != v.Args[1] { 3502 break 3503 } 3504 v.reset(OpAnd16) 3505 v.AddArg(x) 3506 v.AddArg(y) 3507 return true 3508 } 3509 // match: (And16 (And16 i:(Const16 <t>) z) x) 3510 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 3511 // result: (And16 i (And16 <t> z x)) 3512 for { 3513 v_0 := v.Args[0] 3514 if v_0.Op != OpAnd16 { 3515 break 3516 } 3517 i := v_0.Args[0] 3518 if i.Op != OpConst16 { 3519 break 3520 } 3521 t := i.Type 3522 z := v_0.Args[1] 3523 x := v.Args[1] 3524 if !(z.Op != OpConst16 && x.Op != OpConst16) { 3525 break 3526 } 3527 v.reset(OpAnd16) 3528 v.AddArg(i) 3529 v0 := b.NewValue0(v.Pos, OpAnd16, t) 3530 v0.AddArg(z) 3531 v0.AddArg(x) 3532 v.AddArg(v0) 3533 return true 3534 } 3535 // match: (And16 (And16 z i:(Const16 <t>)) x) 3536 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 3537 // result: (And16 i (And16 <t> z x)) 3538 for { 3539 v_0 := v.Args[0] 3540 if v_0.Op != OpAnd16 { 3541 break 3542 } 3543 z := v_0.Args[0] 3544 i := v_0.Args[1] 3545 if i.Op != OpConst16 { 3546 break 3547 } 3548 t := i.Type 3549 x := v.Args[1] 3550 if !(z.Op != OpConst16 && x.Op != OpConst16) { 3551 break 3552 } 3553 v.reset(OpAnd16) 3554 v.AddArg(i) 3555 v0 := b.NewValue0(v.Pos, OpAnd16, t) 3556 v0.AddArg(z) 3557 v0.AddArg(x) 3558 v.AddArg(v0) 3559 return true 3560 } 3561 // match: (And16 x (And16 i:(Const16 <t>) z)) 3562 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 3563 // result: (And16 i (And16 <t> z x)) 3564 for { 3565 x := v.Args[0] 3566 v_1 := v.Args[1] 3567 if v_1.Op != OpAnd16 { 3568 break 3569 } 3570 i := v_1.Args[0] 3571 if i.Op != OpConst16 { 3572 break 3573 } 3574 t := i.Type 3575 z := v_1.Args[1] 3576 if !(z.Op != OpConst16 && x.Op != OpConst16) { 3577 break 3578 } 3579 v.reset(OpAnd16) 3580 v.AddArg(i) 3581 v0 := b.NewValue0(v.Pos, OpAnd16, t) 3582 v0.AddArg(z) 3583 v0.AddArg(x) 3584 v.AddArg(v0) 3585 return true 3586 } 3587 // match: (And16 x (And16 z i:(Const16 <t>))) 3588 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 3589 // result: (And16 i (And16 <t> z x)) 3590 for { 3591 x := v.Args[0] 3592 v_1 := v.Args[1] 3593 if v_1.Op != OpAnd16 { 3594 break 3595 } 3596 z := v_1.Args[0] 3597 i := v_1.Args[1] 3598 if i.Op != OpConst16 { 3599 break 3600 } 3601 t := i.Type 3602 if !(z.Op != OpConst16 && x.Op != OpConst16) { 3603 break 3604 } 3605 v.reset(OpAnd16) 3606 v.AddArg(i) 3607 v0 := b.NewValue0(v.Pos, OpAnd16, t) 3608 v0.AddArg(z) 3609 v0.AddArg(x) 3610 v.AddArg(v0) 3611 return true 3612 } 3613 // match: (And16 (Const16 <t> [c]) (And16 (Const16 <t> [d]) x)) 3614 // cond: 3615 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 3616 for { 3617 v_0 := v.Args[0] 3618 if v_0.Op != OpConst16 { 3619 break 3620 } 3621 t := v_0.Type 3622 c := v_0.AuxInt 3623 v_1 := v.Args[1] 3624 if v_1.Op != OpAnd16 { 3625 break 3626 } 3627 v_1_0 := v_1.Args[0] 3628 if v_1_0.Op != OpConst16 { 3629 break 3630 } 3631 if v_1_0.Type != t { 3632 break 3633 } 3634 d := v_1_0.AuxInt 3635 x := v_1.Args[1] 3636 v.reset(OpAnd16) 3637 v0 := b.NewValue0(v.Pos, OpConst16, t) 3638 v0.AuxInt = int64(int16(c & d)) 3639 v.AddArg(v0) 3640 v.AddArg(x) 3641 return true 3642 } 3643 // match: (And16 (Const16 <t> [c]) (And16 x (Const16 <t> [d]))) 3644 // cond: 3645 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 3646 for { 3647 v_0 := v.Args[0] 3648 if v_0.Op != OpConst16 { 3649 break 3650 } 3651 t := v_0.Type 3652 c := v_0.AuxInt 3653 v_1 := v.Args[1] 3654 if v_1.Op != OpAnd16 { 3655 break 3656 } 3657 x := v_1.Args[0] 3658 v_1_1 := v_1.Args[1] 3659 if v_1_1.Op != OpConst16 { 3660 break 3661 } 3662 if v_1_1.Type != t { 3663 break 3664 } 3665 d := v_1_1.AuxInt 3666 v.reset(OpAnd16) 3667 v0 := b.NewValue0(v.Pos, OpConst16, t) 3668 v0.AuxInt = int64(int16(c & d)) 3669 v.AddArg(v0) 3670 v.AddArg(x) 3671 return true 3672 } 3673 // match: (And16 (And16 (Const16 <t> [d]) x) (Const16 <t> [c])) 3674 // cond: 3675 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 3676 for { 3677 v_0 := v.Args[0] 3678 if v_0.Op != OpAnd16 { 3679 break 3680 } 3681 v_0_0 := v_0.Args[0] 3682 if v_0_0.Op != OpConst16 { 3683 break 3684 } 3685 t := v_0_0.Type 3686 d := v_0_0.AuxInt 3687 x := v_0.Args[1] 3688 v_1 := v.Args[1] 3689 if v_1.Op != OpConst16 { 3690 break 3691 } 3692 if v_1.Type != t { 3693 break 3694 } 3695 c := v_1.AuxInt 3696 v.reset(OpAnd16) 3697 v0 := b.NewValue0(v.Pos, OpConst16, t) 3698 v0.AuxInt = int64(int16(c & d)) 3699 v.AddArg(v0) 3700 v.AddArg(x) 3701 return true 3702 } 3703 // match: (And16 (And16 x (Const16 <t> [d])) (Const16 <t> [c])) 3704 // cond: 3705 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 3706 for { 3707 v_0 := v.Args[0] 3708 if v_0.Op != OpAnd16 { 3709 break 3710 } 3711 x := v_0.Args[0] 3712 v_0_1 := v_0.Args[1] 3713 if v_0_1.Op != OpConst16 { 3714 break 3715 } 3716 t := v_0_1.Type 3717 d := v_0_1.AuxInt 3718 v_1 := v.Args[1] 3719 if v_1.Op != OpConst16 { 3720 break 3721 } 3722 if v_1.Type != t { 3723 break 3724 } 3725 c := v_1.AuxInt 3726 v.reset(OpAnd16) 3727 v0 := b.NewValue0(v.Pos, OpConst16, t) 3728 v0.AuxInt = int64(int16(c & d)) 3729 v.AddArg(v0) 3730 v.AddArg(x) 3731 return true 3732 } 3733 return false 3734 } 3735 func rewriteValuegeneric_OpAnd32_0(v *Value) bool { 3736 // match: (And32 (Const32 [c]) (Const32 [d])) 3737 // cond: 3738 // result: (Const32 [int64(int32(c&d))]) 3739 for { 3740 v_0 := v.Args[0] 3741 if v_0.Op != OpConst32 { 3742 break 3743 } 3744 c := v_0.AuxInt 3745 v_1 := v.Args[1] 3746 if v_1.Op != OpConst32 { 3747 break 3748 } 3749 d := v_1.AuxInt 3750 v.reset(OpConst32) 3751 v.AuxInt = int64(int32(c & d)) 3752 return true 3753 } 3754 // match: (And32 (Const32 [d]) (Const32 [c])) 3755 // cond: 3756 // result: (Const32 [int64(int32(c&d))]) 3757 for { 3758 v_0 := v.Args[0] 3759 if v_0.Op != OpConst32 { 3760 break 3761 } 3762 d := v_0.AuxInt 3763 v_1 := v.Args[1] 3764 if v_1.Op != OpConst32 { 3765 break 3766 } 3767 c := v_1.AuxInt 3768 v.reset(OpConst32) 3769 v.AuxInt = int64(int32(c & d)) 3770 return true 3771 } 3772 // match: (And32 x x) 3773 // cond: 3774 // result: x 3775 for { 3776 x := v.Args[0] 3777 if x != v.Args[1] { 3778 break 3779 } 3780 v.reset(OpCopy) 3781 v.Type = x.Type 3782 v.AddArg(x) 3783 return true 3784 } 3785 // match: (And32 (Const32 [-1]) x) 3786 // cond: 3787 // result: x 3788 for { 3789 v_0 := v.Args[0] 3790 if v_0.Op != OpConst32 { 3791 break 3792 } 3793 if v_0.AuxInt != -1 { 3794 break 3795 } 3796 x := v.Args[1] 3797 v.reset(OpCopy) 3798 v.Type = x.Type 3799 v.AddArg(x) 3800 return true 3801 } 3802 // match: (And32 x (Const32 [-1])) 3803 // cond: 3804 // result: x 3805 for { 3806 x := v.Args[0] 3807 v_1 := v.Args[1] 3808 if v_1.Op != OpConst32 { 3809 break 3810 } 3811 if v_1.AuxInt != -1 { 3812 break 3813 } 3814 v.reset(OpCopy) 3815 v.Type = x.Type 3816 v.AddArg(x) 3817 return true 3818 } 3819 // match: (And32 (Const32 [0]) _) 3820 // cond: 3821 // result: (Const32 [0]) 3822 for { 3823 v_0 := v.Args[0] 3824 if v_0.Op != OpConst32 { 3825 break 3826 } 3827 if v_0.AuxInt != 0 { 3828 break 3829 } 3830 v.reset(OpConst32) 3831 v.AuxInt = 0 3832 return true 3833 } 3834 // match: (And32 _ (Const32 [0])) 3835 // cond: 3836 // result: (Const32 [0]) 3837 for { 3838 v_1 := v.Args[1] 3839 if v_1.Op != OpConst32 { 3840 break 3841 } 3842 if v_1.AuxInt != 0 { 3843 break 3844 } 3845 v.reset(OpConst32) 3846 v.AuxInt = 0 3847 return true 3848 } 3849 // match: (And32 x (And32 x y)) 3850 // cond: 3851 // result: (And32 x y) 3852 for { 3853 x := v.Args[0] 3854 v_1 := v.Args[1] 3855 if v_1.Op != OpAnd32 { 3856 break 3857 } 3858 if x != v_1.Args[0] { 3859 break 3860 } 3861 y := v_1.Args[1] 3862 v.reset(OpAnd32) 3863 v.AddArg(x) 3864 v.AddArg(y) 3865 return true 3866 } 3867 // match: (And32 x (And32 y x)) 3868 // cond: 3869 // result: (And32 x y) 3870 for { 3871 x := v.Args[0] 3872 v_1 := v.Args[1] 3873 if v_1.Op != OpAnd32 { 3874 break 3875 } 3876 y := v_1.Args[0] 3877 if x != v_1.Args[1] { 3878 break 3879 } 3880 v.reset(OpAnd32) 3881 v.AddArg(x) 3882 v.AddArg(y) 3883 return true 3884 } 3885 // match: (And32 (And32 x y) x) 3886 // cond: 3887 // result: (And32 x y) 3888 for { 3889 v_0 := v.Args[0] 3890 if v_0.Op != OpAnd32 { 3891 break 3892 } 3893 x := v_0.Args[0] 3894 y := v_0.Args[1] 3895 if x != v.Args[1] { 3896 break 3897 } 3898 v.reset(OpAnd32) 3899 v.AddArg(x) 3900 v.AddArg(y) 3901 return true 3902 } 3903 return false 3904 } 3905 func rewriteValuegeneric_OpAnd32_10(v *Value) bool { 3906 b := v.Block 3907 _ = b 3908 // match: (And32 (And32 y x) x) 3909 // cond: 3910 // result: (And32 x y) 3911 for { 3912 v_0 := v.Args[0] 3913 if v_0.Op != OpAnd32 { 3914 break 3915 } 3916 y := v_0.Args[0] 3917 x := v_0.Args[1] 3918 if x != v.Args[1] { 3919 break 3920 } 3921 v.reset(OpAnd32) 3922 v.AddArg(x) 3923 v.AddArg(y) 3924 return true 3925 } 3926 // match: (And32 (And32 i:(Const32 <t>) z) x) 3927 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 3928 // result: (And32 i (And32 <t> z x)) 3929 for { 3930 v_0 := v.Args[0] 3931 if v_0.Op != OpAnd32 { 3932 break 3933 } 3934 i := v_0.Args[0] 3935 if i.Op != OpConst32 { 3936 break 3937 } 3938 t := i.Type 3939 z := v_0.Args[1] 3940 x := v.Args[1] 3941 if !(z.Op != OpConst32 && x.Op != OpConst32) { 3942 break 3943 } 3944 v.reset(OpAnd32) 3945 v.AddArg(i) 3946 v0 := b.NewValue0(v.Pos, OpAnd32, t) 3947 v0.AddArg(z) 3948 v0.AddArg(x) 3949 v.AddArg(v0) 3950 return true 3951 } 3952 // match: (And32 (And32 z i:(Const32 <t>)) x) 3953 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 3954 // result: (And32 i (And32 <t> z x)) 3955 for { 3956 v_0 := v.Args[0] 3957 if v_0.Op != OpAnd32 { 3958 break 3959 } 3960 z := v_0.Args[0] 3961 i := v_0.Args[1] 3962 if i.Op != OpConst32 { 3963 break 3964 } 3965 t := i.Type 3966 x := v.Args[1] 3967 if !(z.Op != OpConst32 && x.Op != OpConst32) { 3968 break 3969 } 3970 v.reset(OpAnd32) 3971 v.AddArg(i) 3972 v0 := b.NewValue0(v.Pos, OpAnd32, t) 3973 v0.AddArg(z) 3974 v0.AddArg(x) 3975 v.AddArg(v0) 3976 return true 3977 } 3978 // match: (And32 x (And32 i:(Const32 <t>) z)) 3979 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 3980 // result: (And32 i (And32 <t> z x)) 3981 for { 3982 x := v.Args[0] 3983 v_1 := v.Args[1] 3984 if v_1.Op != OpAnd32 { 3985 break 3986 } 3987 i := v_1.Args[0] 3988 if i.Op != OpConst32 { 3989 break 3990 } 3991 t := i.Type 3992 z := v_1.Args[1] 3993 if !(z.Op != OpConst32 && x.Op != OpConst32) { 3994 break 3995 } 3996 v.reset(OpAnd32) 3997 v.AddArg(i) 3998 v0 := b.NewValue0(v.Pos, OpAnd32, t) 3999 v0.AddArg(z) 4000 v0.AddArg(x) 4001 v.AddArg(v0) 4002 return true 4003 } 4004 // match: (And32 x (And32 z i:(Const32 <t>))) 4005 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 4006 // result: (And32 i (And32 <t> z x)) 4007 for { 4008 x := v.Args[0] 4009 v_1 := v.Args[1] 4010 if v_1.Op != OpAnd32 { 4011 break 4012 } 4013 z := v_1.Args[0] 4014 i := v_1.Args[1] 4015 if i.Op != OpConst32 { 4016 break 4017 } 4018 t := i.Type 4019 if !(z.Op != OpConst32 && x.Op != OpConst32) { 4020 break 4021 } 4022 v.reset(OpAnd32) 4023 v.AddArg(i) 4024 v0 := b.NewValue0(v.Pos, OpAnd32, t) 4025 v0.AddArg(z) 4026 v0.AddArg(x) 4027 v.AddArg(v0) 4028 return true 4029 } 4030 // match: (And32 (Const32 <t> [c]) (And32 (Const32 <t> [d]) x)) 4031 // cond: 4032 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 4033 for { 4034 v_0 := v.Args[0] 4035 if v_0.Op != OpConst32 { 4036 break 4037 } 4038 t := v_0.Type 4039 c := v_0.AuxInt 4040 v_1 := v.Args[1] 4041 if v_1.Op != OpAnd32 { 4042 break 4043 } 4044 v_1_0 := v_1.Args[0] 4045 if v_1_0.Op != OpConst32 { 4046 break 4047 } 4048 if v_1_0.Type != t { 4049 break 4050 } 4051 d := v_1_0.AuxInt 4052 x := v_1.Args[1] 4053 v.reset(OpAnd32) 4054 v0 := b.NewValue0(v.Pos, OpConst32, t) 4055 v0.AuxInt = int64(int32(c & d)) 4056 v.AddArg(v0) 4057 v.AddArg(x) 4058 return true 4059 } 4060 // match: (And32 (Const32 <t> [c]) (And32 x (Const32 <t> [d]))) 4061 // cond: 4062 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 4063 for { 4064 v_0 := v.Args[0] 4065 if v_0.Op != OpConst32 { 4066 break 4067 } 4068 t := v_0.Type 4069 c := v_0.AuxInt 4070 v_1 := v.Args[1] 4071 if v_1.Op != OpAnd32 { 4072 break 4073 } 4074 x := v_1.Args[0] 4075 v_1_1 := v_1.Args[1] 4076 if v_1_1.Op != OpConst32 { 4077 break 4078 } 4079 if v_1_1.Type != t { 4080 break 4081 } 4082 d := v_1_1.AuxInt 4083 v.reset(OpAnd32) 4084 v0 := b.NewValue0(v.Pos, OpConst32, t) 4085 v0.AuxInt = int64(int32(c & d)) 4086 v.AddArg(v0) 4087 v.AddArg(x) 4088 return true 4089 } 4090 // match: (And32 (And32 (Const32 <t> [d]) x) (Const32 <t> [c])) 4091 // cond: 4092 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 4093 for { 4094 v_0 := v.Args[0] 4095 if v_0.Op != OpAnd32 { 4096 break 4097 } 4098 v_0_0 := v_0.Args[0] 4099 if v_0_0.Op != OpConst32 { 4100 break 4101 } 4102 t := v_0_0.Type 4103 d := v_0_0.AuxInt 4104 x := v_0.Args[1] 4105 v_1 := v.Args[1] 4106 if v_1.Op != OpConst32 { 4107 break 4108 } 4109 if v_1.Type != t { 4110 break 4111 } 4112 c := v_1.AuxInt 4113 v.reset(OpAnd32) 4114 v0 := b.NewValue0(v.Pos, OpConst32, t) 4115 v0.AuxInt = int64(int32(c & d)) 4116 v.AddArg(v0) 4117 v.AddArg(x) 4118 return true 4119 } 4120 // match: (And32 (And32 x (Const32 <t> [d])) (Const32 <t> [c])) 4121 // cond: 4122 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 4123 for { 4124 v_0 := v.Args[0] 4125 if v_0.Op != OpAnd32 { 4126 break 4127 } 4128 x := v_0.Args[0] 4129 v_0_1 := v_0.Args[1] 4130 if v_0_1.Op != OpConst32 { 4131 break 4132 } 4133 t := v_0_1.Type 4134 d := v_0_1.AuxInt 4135 v_1 := v.Args[1] 4136 if v_1.Op != OpConst32 { 4137 break 4138 } 4139 if v_1.Type != t { 4140 break 4141 } 4142 c := v_1.AuxInt 4143 v.reset(OpAnd32) 4144 v0 := b.NewValue0(v.Pos, OpConst32, t) 4145 v0.AuxInt = int64(int32(c & d)) 4146 v.AddArg(v0) 4147 v.AddArg(x) 4148 return true 4149 } 4150 return false 4151 } 4152 func rewriteValuegeneric_OpAnd64_0(v *Value) bool { 4153 // match: (And64 (Const64 [c]) (Const64 [d])) 4154 // cond: 4155 // result: (Const64 [c&d]) 4156 for { 4157 v_0 := v.Args[0] 4158 if v_0.Op != OpConst64 { 4159 break 4160 } 4161 c := v_0.AuxInt 4162 v_1 := v.Args[1] 4163 if v_1.Op != OpConst64 { 4164 break 4165 } 4166 d := v_1.AuxInt 4167 v.reset(OpConst64) 4168 v.AuxInt = c & d 4169 return true 4170 } 4171 // match: (And64 (Const64 [d]) (Const64 [c])) 4172 // cond: 4173 // result: (Const64 [c&d]) 4174 for { 4175 v_0 := v.Args[0] 4176 if v_0.Op != OpConst64 { 4177 break 4178 } 4179 d := v_0.AuxInt 4180 v_1 := v.Args[1] 4181 if v_1.Op != OpConst64 { 4182 break 4183 } 4184 c := v_1.AuxInt 4185 v.reset(OpConst64) 4186 v.AuxInt = c & d 4187 return true 4188 } 4189 // match: (And64 x x) 4190 // cond: 4191 // result: x 4192 for { 4193 x := v.Args[0] 4194 if x != v.Args[1] { 4195 break 4196 } 4197 v.reset(OpCopy) 4198 v.Type = x.Type 4199 v.AddArg(x) 4200 return true 4201 } 4202 // match: (And64 (Const64 [-1]) x) 4203 // cond: 4204 // result: x 4205 for { 4206 v_0 := v.Args[0] 4207 if v_0.Op != OpConst64 { 4208 break 4209 } 4210 if v_0.AuxInt != -1 { 4211 break 4212 } 4213 x := v.Args[1] 4214 v.reset(OpCopy) 4215 v.Type = x.Type 4216 v.AddArg(x) 4217 return true 4218 } 4219 // match: (And64 x (Const64 [-1])) 4220 // cond: 4221 // result: x 4222 for { 4223 x := v.Args[0] 4224 v_1 := v.Args[1] 4225 if v_1.Op != OpConst64 { 4226 break 4227 } 4228 if v_1.AuxInt != -1 { 4229 break 4230 } 4231 v.reset(OpCopy) 4232 v.Type = x.Type 4233 v.AddArg(x) 4234 return true 4235 } 4236 // match: (And64 (Const64 [0]) _) 4237 // cond: 4238 // result: (Const64 [0]) 4239 for { 4240 v_0 := v.Args[0] 4241 if v_0.Op != OpConst64 { 4242 break 4243 } 4244 if v_0.AuxInt != 0 { 4245 break 4246 } 4247 v.reset(OpConst64) 4248 v.AuxInt = 0 4249 return true 4250 } 4251 // match: (And64 _ (Const64 [0])) 4252 // cond: 4253 // result: (Const64 [0]) 4254 for { 4255 v_1 := v.Args[1] 4256 if v_1.Op != OpConst64 { 4257 break 4258 } 4259 if v_1.AuxInt != 0 { 4260 break 4261 } 4262 v.reset(OpConst64) 4263 v.AuxInt = 0 4264 return true 4265 } 4266 // match: (And64 x (And64 x y)) 4267 // cond: 4268 // result: (And64 x y) 4269 for { 4270 x := v.Args[0] 4271 v_1 := v.Args[1] 4272 if v_1.Op != OpAnd64 { 4273 break 4274 } 4275 if x != v_1.Args[0] { 4276 break 4277 } 4278 y := v_1.Args[1] 4279 v.reset(OpAnd64) 4280 v.AddArg(x) 4281 v.AddArg(y) 4282 return true 4283 } 4284 // match: (And64 x (And64 y x)) 4285 // cond: 4286 // result: (And64 x y) 4287 for { 4288 x := v.Args[0] 4289 v_1 := v.Args[1] 4290 if v_1.Op != OpAnd64 { 4291 break 4292 } 4293 y := v_1.Args[0] 4294 if x != v_1.Args[1] { 4295 break 4296 } 4297 v.reset(OpAnd64) 4298 v.AddArg(x) 4299 v.AddArg(y) 4300 return true 4301 } 4302 // match: (And64 (And64 x y) x) 4303 // cond: 4304 // result: (And64 x y) 4305 for { 4306 v_0 := v.Args[0] 4307 if v_0.Op != OpAnd64 { 4308 break 4309 } 4310 x := v_0.Args[0] 4311 y := v_0.Args[1] 4312 if x != v.Args[1] { 4313 break 4314 } 4315 v.reset(OpAnd64) 4316 v.AddArg(x) 4317 v.AddArg(y) 4318 return true 4319 } 4320 return false 4321 } 4322 func rewriteValuegeneric_OpAnd64_10(v *Value) bool { 4323 b := v.Block 4324 _ = b 4325 // match: (And64 (And64 y x) x) 4326 // cond: 4327 // result: (And64 x y) 4328 for { 4329 v_0 := v.Args[0] 4330 if v_0.Op != OpAnd64 { 4331 break 4332 } 4333 y := v_0.Args[0] 4334 x := v_0.Args[1] 4335 if x != v.Args[1] { 4336 break 4337 } 4338 v.reset(OpAnd64) 4339 v.AddArg(x) 4340 v.AddArg(y) 4341 return true 4342 } 4343 // match: (And64 <t> (Const64 [y]) x) 4344 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 4345 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 4346 for { 4347 t := v.Type 4348 v_0 := v.Args[0] 4349 if v_0.Op != OpConst64 { 4350 break 4351 } 4352 y := v_0.AuxInt 4353 x := v.Args[1] 4354 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 4355 break 4356 } 4357 v.reset(OpRsh64Ux64) 4358 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 4359 v0.AddArg(x) 4360 v1 := b.NewValue0(v.Pos, OpConst64, t) 4361 v1.AuxInt = nlz(y) 4362 v0.AddArg(v1) 4363 v.AddArg(v0) 4364 v2 := b.NewValue0(v.Pos, OpConst64, t) 4365 v2.AuxInt = nlz(y) 4366 v.AddArg(v2) 4367 return true 4368 } 4369 // match: (And64 <t> x (Const64 [y])) 4370 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 4371 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 4372 for { 4373 t := v.Type 4374 x := v.Args[0] 4375 v_1 := v.Args[1] 4376 if v_1.Op != OpConst64 { 4377 break 4378 } 4379 y := v_1.AuxInt 4380 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 4381 break 4382 } 4383 v.reset(OpRsh64Ux64) 4384 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 4385 v0.AddArg(x) 4386 v1 := b.NewValue0(v.Pos, OpConst64, t) 4387 v1.AuxInt = nlz(y) 4388 v0.AddArg(v1) 4389 v.AddArg(v0) 4390 v2 := b.NewValue0(v.Pos, OpConst64, t) 4391 v2.AuxInt = nlz(y) 4392 v.AddArg(v2) 4393 return true 4394 } 4395 // match: (And64 <t> (Const64 [y]) x) 4396 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 4397 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 4398 for { 4399 t := v.Type 4400 v_0 := v.Args[0] 4401 if v_0.Op != OpConst64 { 4402 break 4403 } 4404 y := v_0.AuxInt 4405 x := v.Args[1] 4406 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 4407 break 4408 } 4409 v.reset(OpLsh64x64) 4410 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 4411 v0.AddArg(x) 4412 v1 := b.NewValue0(v.Pos, OpConst64, t) 4413 v1.AuxInt = ntz(y) 4414 v0.AddArg(v1) 4415 v.AddArg(v0) 4416 v2 := b.NewValue0(v.Pos, OpConst64, t) 4417 v2.AuxInt = ntz(y) 4418 v.AddArg(v2) 4419 return true 4420 } 4421 // match: (And64 <t> x (Const64 [y])) 4422 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 4423 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 4424 for { 4425 t := v.Type 4426 x := v.Args[0] 4427 v_1 := v.Args[1] 4428 if v_1.Op != OpConst64 { 4429 break 4430 } 4431 y := v_1.AuxInt 4432 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 4433 break 4434 } 4435 v.reset(OpLsh64x64) 4436 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 4437 v0.AddArg(x) 4438 v1 := b.NewValue0(v.Pos, OpConst64, t) 4439 v1.AuxInt = ntz(y) 4440 v0.AddArg(v1) 4441 v.AddArg(v0) 4442 v2 := b.NewValue0(v.Pos, OpConst64, t) 4443 v2.AuxInt = ntz(y) 4444 v.AddArg(v2) 4445 return true 4446 } 4447 // match: (And64 (And64 i:(Const64 <t>) z) x) 4448 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 4449 // result: (And64 i (And64 <t> z x)) 4450 for { 4451 v_0 := v.Args[0] 4452 if v_0.Op != OpAnd64 { 4453 break 4454 } 4455 i := v_0.Args[0] 4456 if i.Op != OpConst64 { 4457 break 4458 } 4459 t := i.Type 4460 z := v_0.Args[1] 4461 x := v.Args[1] 4462 if !(z.Op != OpConst64 && x.Op != OpConst64) { 4463 break 4464 } 4465 v.reset(OpAnd64) 4466 v.AddArg(i) 4467 v0 := b.NewValue0(v.Pos, OpAnd64, t) 4468 v0.AddArg(z) 4469 v0.AddArg(x) 4470 v.AddArg(v0) 4471 return true 4472 } 4473 // match: (And64 (And64 z i:(Const64 <t>)) x) 4474 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 4475 // result: (And64 i (And64 <t> z x)) 4476 for { 4477 v_0 := v.Args[0] 4478 if v_0.Op != OpAnd64 { 4479 break 4480 } 4481 z := v_0.Args[0] 4482 i := v_0.Args[1] 4483 if i.Op != OpConst64 { 4484 break 4485 } 4486 t := i.Type 4487 x := v.Args[1] 4488 if !(z.Op != OpConst64 && x.Op != OpConst64) { 4489 break 4490 } 4491 v.reset(OpAnd64) 4492 v.AddArg(i) 4493 v0 := b.NewValue0(v.Pos, OpAnd64, t) 4494 v0.AddArg(z) 4495 v0.AddArg(x) 4496 v.AddArg(v0) 4497 return true 4498 } 4499 // match: (And64 x (And64 i:(Const64 <t>) z)) 4500 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 4501 // result: (And64 i (And64 <t> z x)) 4502 for { 4503 x := v.Args[0] 4504 v_1 := v.Args[1] 4505 if v_1.Op != OpAnd64 { 4506 break 4507 } 4508 i := v_1.Args[0] 4509 if i.Op != OpConst64 { 4510 break 4511 } 4512 t := i.Type 4513 z := v_1.Args[1] 4514 if !(z.Op != OpConst64 && x.Op != OpConst64) { 4515 break 4516 } 4517 v.reset(OpAnd64) 4518 v.AddArg(i) 4519 v0 := b.NewValue0(v.Pos, OpAnd64, t) 4520 v0.AddArg(z) 4521 v0.AddArg(x) 4522 v.AddArg(v0) 4523 return true 4524 } 4525 // match: (And64 x (And64 z i:(Const64 <t>))) 4526 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 4527 // result: (And64 i (And64 <t> z x)) 4528 for { 4529 x := v.Args[0] 4530 v_1 := v.Args[1] 4531 if v_1.Op != OpAnd64 { 4532 break 4533 } 4534 z := v_1.Args[0] 4535 i := v_1.Args[1] 4536 if i.Op != OpConst64 { 4537 break 4538 } 4539 t := i.Type 4540 if !(z.Op != OpConst64 && x.Op != OpConst64) { 4541 break 4542 } 4543 v.reset(OpAnd64) 4544 v.AddArg(i) 4545 v0 := b.NewValue0(v.Pos, OpAnd64, t) 4546 v0.AddArg(z) 4547 v0.AddArg(x) 4548 v.AddArg(v0) 4549 return true 4550 } 4551 // match: (And64 (Const64 <t> [c]) (And64 (Const64 <t> [d]) x)) 4552 // cond: 4553 // result: (And64 (Const64 <t> [c&d]) x) 4554 for { 4555 v_0 := v.Args[0] 4556 if v_0.Op != OpConst64 { 4557 break 4558 } 4559 t := v_0.Type 4560 c := v_0.AuxInt 4561 v_1 := v.Args[1] 4562 if v_1.Op != OpAnd64 { 4563 break 4564 } 4565 v_1_0 := v_1.Args[0] 4566 if v_1_0.Op != OpConst64 { 4567 break 4568 } 4569 if v_1_0.Type != t { 4570 break 4571 } 4572 d := v_1_0.AuxInt 4573 x := v_1.Args[1] 4574 v.reset(OpAnd64) 4575 v0 := b.NewValue0(v.Pos, OpConst64, t) 4576 v0.AuxInt = c & d 4577 v.AddArg(v0) 4578 v.AddArg(x) 4579 return true 4580 } 4581 return false 4582 } 4583 func rewriteValuegeneric_OpAnd64_20(v *Value) bool { 4584 b := v.Block 4585 _ = b 4586 // match: (And64 (Const64 <t> [c]) (And64 x (Const64 <t> [d]))) 4587 // cond: 4588 // result: (And64 (Const64 <t> [c&d]) x) 4589 for { 4590 v_0 := v.Args[0] 4591 if v_0.Op != OpConst64 { 4592 break 4593 } 4594 t := v_0.Type 4595 c := v_0.AuxInt 4596 v_1 := v.Args[1] 4597 if v_1.Op != OpAnd64 { 4598 break 4599 } 4600 x := v_1.Args[0] 4601 v_1_1 := v_1.Args[1] 4602 if v_1_1.Op != OpConst64 { 4603 break 4604 } 4605 if v_1_1.Type != t { 4606 break 4607 } 4608 d := v_1_1.AuxInt 4609 v.reset(OpAnd64) 4610 v0 := b.NewValue0(v.Pos, OpConst64, t) 4611 v0.AuxInt = c & d 4612 v.AddArg(v0) 4613 v.AddArg(x) 4614 return true 4615 } 4616 // match: (And64 (And64 (Const64 <t> [d]) x) (Const64 <t> [c])) 4617 // cond: 4618 // result: (And64 (Const64 <t> [c&d]) x) 4619 for { 4620 v_0 := v.Args[0] 4621 if v_0.Op != OpAnd64 { 4622 break 4623 } 4624 v_0_0 := v_0.Args[0] 4625 if v_0_0.Op != OpConst64 { 4626 break 4627 } 4628 t := v_0_0.Type 4629 d := v_0_0.AuxInt 4630 x := v_0.Args[1] 4631 v_1 := v.Args[1] 4632 if v_1.Op != OpConst64 { 4633 break 4634 } 4635 if v_1.Type != t { 4636 break 4637 } 4638 c := v_1.AuxInt 4639 v.reset(OpAnd64) 4640 v0 := b.NewValue0(v.Pos, OpConst64, t) 4641 v0.AuxInt = c & d 4642 v.AddArg(v0) 4643 v.AddArg(x) 4644 return true 4645 } 4646 // match: (And64 (And64 x (Const64 <t> [d])) (Const64 <t> [c])) 4647 // cond: 4648 // result: (And64 (Const64 <t> [c&d]) x) 4649 for { 4650 v_0 := v.Args[0] 4651 if v_0.Op != OpAnd64 { 4652 break 4653 } 4654 x := v_0.Args[0] 4655 v_0_1 := v_0.Args[1] 4656 if v_0_1.Op != OpConst64 { 4657 break 4658 } 4659 t := v_0_1.Type 4660 d := v_0_1.AuxInt 4661 v_1 := v.Args[1] 4662 if v_1.Op != OpConst64 { 4663 break 4664 } 4665 if v_1.Type != t { 4666 break 4667 } 4668 c := v_1.AuxInt 4669 v.reset(OpAnd64) 4670 v0 := b.NewValue0(v.Pos, OpConst64, t) 4671 v0.AuxInt = c & d 4672 v.AddArg(v0) 4673 v.AddArg(x) 4674 return true 4675 } 4676 return false 4677 } 4678 func rewriteValuegeneric_OpAnd8_0(v *Value) bool { 4679 // match: (And8 (Const8 [c]) (Const8 [d])) 4680 // cond: 4681 // result: (Const8 [int64(int8(c&d))]) 4682 for { 4683 v_0 := v.Args[0] 4684 if v_0.Op != OpConst8 { 4685 break 4686 } 4687 c := v_0.AuxInt 4688 v_1 := v.Args[1] 4689 if v_1.Op != OpConst8 { 4690 break 4691 } 4692 d := v_1.AuxInt 4693 v.reset(OpConst8) 4694 v.AuxInt = int64(int8(c & d)) 4695 return true 4696 } 4697 // match: (And8 (Const8 [d]) (Const8 [c])) 4698 // cond: 4699 // result: (Const8 [int64(int8(c&d))]) 4700 for { 4701 v_0 := v.Args[0] 4702 if v_0.Op != OpConst8 { 4703 break 4704 } 4705 d := v_0.AuxInt 4706 v_1 := v.Args[1] 4707 if v_1.Op != OpConst8 { 4708 break 4709 } 4710 c := v_1.AuxInt 4711 v.reset(OpConst8) 4712 v.AuxInt = int64(int8(c & d)) 4713 return true 4714 } 4715 // match: (And8 x x) 4716 // cond: 4717 // result: x 4718 for { 4719 x := v.Args[0] 4720 if x != v.Args[1] { 4721 break 4722 } 4723 v.reset(OpCopy) 4724 v.Type = x.Type 4725 v.AddArg(x) 4726 return true 4727 } 4728 // match: (And8 (Const8 [-1]) x) 4729 // cond: 4730 // result: x 4731 for { 4732 v_0 := v.Args[0] 4733 if v_0.Op != OpConst8 { 4734 break 4735 } 4736 if v_0.AuxInt != -1 { 4737 break 4738 } 4739 x := v.Args[1] 4740 v.reset(OpCopy) 4741 v.Type = x.Type 4742 v.AddArg(x) 4743 return true 4744 } 4745 // match: (And8 x (Const8 [-1])) 4746 // cond: 4747 // result: x 4748 for { 4749 x := v.Args[0] 4750 v_1 := v.Args[1] 4751 if v_1.Op != OpConst8 { 4752 break 4753 } 4754 if v_1.AuxInt != -1 { 4755 break 4756 } 4757 v.reset(OpCopy) 4758 v.Type = x.Type 4759 v.AddArg(x) 4760 return true 4761 } 4762 // match: (And8 (Const8 [0]) _) 4763 // cond: 4764 // result: (Const8 [0]) 4765 for { 4766 v_0 := v.Args[0] 4767 if v_0.Op != OpConst8 { 4768 break 4769 } 4770 if v_0.AuxInt != 0 { 4771 break 4772 } 4773 v.reset(OpConst8) 4774 v.AuxInt = 0 4775 return true 4776 } 4777 // match: (And8 _ (Const8 [0])) 4778 // cond: 4779 // result: (Const8 [0]) 4780 for { 4781 v_1 := v.Args[1] 4782 if v_1.Op != OpConst8 { 4783 break 4784 } 4785 if v_1.AuxInt != 0 { 4786 break 4787 } 4788 v.reset(OpConst8) 4789 v.AuxInt = 0 4790 return true 4791 } 4792 // match: (And8 x (And8 x y)) 4793 // cond: 4794 // result: (And8 x y) 4795 for { 4796 x := v.Args[0] 4797 v_1 := v.Args[1] 4798 if v_1.Op != OpAnd8 { 4799 break 4800 } 4801 if x != v_1.Args[0] { 4802 break 4803 } 4804 y := v_1.Args[1] 4805 v.reset(OpAnd8) 4806 v.AddArg(x) 4807 v.AddArg(y) 4808 return true 4809 } 4810 // match: (And8 x (And8 y x)) 4811 // cond: 4812 // result: (And8 x y) 4813 for { 4814 x := v.Args[0] 4815 v_1 := v.Args[1] 4816 if v_1.Op != OpAnd8 { 4817 break 4818 } 4819 y := v_1.Args[0] 4820 if x != v_1.Args[1] { 4821 break 4822 } 4823 v.reset(OpAnd8) 4824 v.AddArg(x) 4825 v.AddArg(y) 4826 return true 4827 } 4828 // match: (And8 (And8 x y) x) 4829 // cond: 4830 // result: (And8 x y) 4831 for { 4832 v_0 := v.Args[0] 4833 if v_0.Op != OpAnd8 { 4834 break 4835 } 4836 x := v_0.Args[0] 4837 y := v_0.Args[1] 4838 if x != v.Args[1] { 4839 break 4840 } 4841 v.reset(OpAnd8) 4842 v.AddArg(x) 4843 v.AddArg(y) 4844 return true 4845 } 4846 return false 4847 } 4848 func rewriteValuegeneric_OpAnd8_10(v *Value) bool { 4849 b := v.Block 4850 _ = b 4851 // match: (And8 (And8 y x) x) 4852 // cond: 4853 // result: (And8 x y) 4854 for { 4855 v_0 := v.Args[0] 4856 if v_0.Op != OpAnd8 { 4857 break 4858 } 4859 y := v_0.Args[0] 4860 x := v_0.Args[1] 4861 if x != v.Args[1] { 4862 break 4863 } 4864 v.reset(OpAnd8) 4865 v.AddArg(x) 4866 v.AddArg(y) 4867 return true 4868 } 4869 // match: (And8 (And8 i:(Const8 <t>) z) x) 4870 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4871 // result: (And8 i (And8 <t> z x)) 4872 for { 4873 v_0 := v.Args[0] 4874 if v_0.Op != OpAnd8 { 4875 break 4876 } 4877 i := v_0.Args[0] 4878 if i.Op != OpConst8 { 4879 break 4880 } 4881 t := i.Type 4882 z := v_0.Args[1] 4883 x := v.Args[1] 4884 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4885 break 4886 } 4887 v.reset(OpAnd8) 4888 v.AddArg(i) 4889 v0 := b.NewValue0(v.Pos, OpAnd8, t) 4890 v0.AddArg(z) 4891 v0.AddArg(x) 4892 v.AddArg(v0) 4893 return true 4894 } 4895 // match: (And8 (And8 z i:(Const8 <t>)) x) 4896 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4897 // result: (And8 i (And8 <t> z x)) 4898 for { 4899 v_0 := v.Args[0] 4900 if v_0.Op != OpAnd8 { 4901 break 4902 } 4903 z := v_0.Args[0] 4904 i := v_0.Args[1] 4905 if i.Op != OpConst8 { 4906 break 4907 } 4908 t := i.Type 4909 x := v.Args[1] 4910 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4911 break 4912 } 4913 v.reset(OpAnd8) 4914 v.AddArg(i) 4915 v0 := b.NewValue0(v.Pos, OpAnd8, t) 4916 v0.AddArg(z) 4917 v0.AddArg(x) 4918 v.AddArg(v0) 4919 return true 4920 } 4921 // match: (And8 x (And8 i:(Const8 <t>) z)) 4922 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4923 // result: (And8 i (And8 <t> z x)) 4924 for { 4925 x := v.Args[0] 4926 v_1 := v.Args[1] 4927 if v_1.Op != OpAnd8 { 4928 break 4929 } 4930 i := v_1.Args[0] 4931 if i.Op != OpConst8 { 4932 break 4933 } 4934 t := i.Type 4935 z := v_1.Args[1] 4936 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4937 break 4938 } 4939 v.reset(OpAnd8) 4940 v.AddArg(i) 4941 v0 := b.NewValue0(v.Pos, OpAnd8, t) 4942 v0.AddArg(z) 4943 v0.AddArg(x) 4944 v.AddArg(v0) 4945 return true 4946 } 4947 // match: (And8 x (And8 z i:(Const8 <t>))) 4948 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4949 // result: (And8 i (And8 <t> z x)) 4950 for { 4951 x := v.Args[0] 4952 v_1 := v.Args[1] 4953 if v_1.Op != OpAnd8 { 4954 break 4955 } 4956 z := v_1.Args[0] 4957 i := v_1.Args[1] 4958 if i.Op != OpConst8 { 4959 break 4960 } 4961 t := i.Type 4962 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4963 break 4964 } 4965 v.reset(OpAnd8) 4966 v.AddArg(i) 4967 v0 := b.NewValue0(v.Pos, OpAnd8, t) 4968 v0.AddArg(z) 4969 v0.AddArg(x) 4970 v.AddArg(v0) 4971 return true 4972 } 4973 // match: (And8 (Const8 <t> [c]) (And8 (Const8 <t> [d]) x)) 4974 // cond: 4975 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 4976 for { 4977 v_0 := v.Args[0] 4978 if v_0.Op != OpConst8 { 4979 break 4980 } 4981 t := v_0.Type 4982 c := v_0.AuxInt 4983 v_1 := v.Args[1] 4984 if v_1.Op != OpAnd8 { 4985 break 4986 } 4987 v_1_0 := v_1.Args[0] 4988 if v_1_0.Op != OpConst8 { 4989 break 4990 } 4991 if v_1_0.Type != t { 4992 break 4993 } 4994 d := v_1_0.AuxInt 4995 x := v_1.Args[1] 4996 v.reset(OpAnd8) 4997 v0 := b.NewValue0(v.Pos, OpConst8, t) 4998 v0.AuxInt = int64(int8(c & d)) 4999 v.AddArg(v0) 5000 v.AddArg(x) 5001 return true 5002 } 5003 // match: (And8 (Const8 <t> [c]) (And8 x (Const8 <t> [d]))) 5004 // cond: 5005 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 5006 for { 5007 v_0 := v.Args[0] 5008 if v_0.Op != OpConst8 { 5009 break 5010 } 5011 t := v_0.Type 5012 c := v_0.AuxInt 5013 v_1 := v.Args[1] 5014 if v_1.Op != OpAnd8 { 5015 break 5016 } 5017 x := v_1.Args[0] 5018 v_1_1 := v_1.Args[1] 5019 if v_1_1.Op != OpConst8 { 5020 break 5021 } 5022 if v_1_1.Type != t { 5023 break 5024 } 5025 d := v_1_1.AuxInt 5026 v.reset(OpAnd8) 5027 v0 := b.NewValue0(v.Pos, OpConst8, t) 5028 v0.AuxInt = int64(int8(c & d)) 5029 v.AddArg(v0) 5030 v.AddArg(x) 5031 return true 5032 } 5033 // match: (And8 (And8 (Const8 <t> [d]) x) (Const8 <t> [c])) 5034 // cond: 5035 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 5036 for { 5037 v_0 := v.Args[0] 5038 if v_0.Op != OpAnd8 { 5039 break 5040 } 5041 v_0_0 := v_0.Args[0] 5042 if v_0_0.Op != OpConst8 { 5043 break 5044 } 5045 t := v_0_0.Type 5046 d := v_0_0.AuxInt 5047 x := v_0.Args[1] 5048 v_1 := v.Args[1] 5049 if v_1.Op != OpConst8 { 5050 break 5051 } 5052 if v_1.Type != t { 5053 break 5054 } 5055 c := v_1.AuxInt 5056 v.reset(OpAnd8) 5057 v0 := b.NewValue0(v.Pos, OpConst8, t) 5058 v0.AuxInt = int64(int8(c & d)) 5059 v.AddArg(v0) 5060 v.AddArg(x) 5061 return true 5062 } 5063 // match: (And8 (And8 x (Const8 <t> [d])) (Const8 <t> [c])) 5064 // cond: 5065 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 5066 for { 5067 v_0 := v.Args[0] 5068 if v_0.Op != OpAnd8 { 5069 break 5070 } 5071 x := v_0.Args[0] 5072 v_0_1 := v_0.Args[1] 5073 if v_0_1.Op != OpConst8 { 5074 break 5075 } 5076 t := v_0_1.Type 5077 d := v_0_1.AuxInt 5078 v_1 := v.Args[1] 5079 if v_1.Op != OpConst8 { 5080 break 5081 } 5082 if v_1.Type != t { 5083 break 5084 } 5085 c := v_1.AuxInt 5086 v.reset(OpAnd8) 5087 v0 := b.NewValue0(v.Pos, OpConst8, t) 5088 v0.AuxInt = int64(int8(c & d)) 5089 v.AddArg(v0) 5090 v.AddArg(x) 5091 return true 5092 } 5093 return false 5094 } 5095 func rewriteValuegeneric_OpArg_0(v *Value) bool { 5096 b := v.Block 5097 _ = b 5098 config := b.Func.Config 5099 _ = config 5100 fe := b.Func.fe 5101 _ = fe 5102 types := &b.Func.Config.Types 5103 _ = types 5104 // match: (Arg {n} [off]) 5105 // cond: v.Type.IsString() 5106 // result: (StringMake (Arg <types.BytePtr> {n} [off]) (Arg <types.Int> {n} [off+config.PtrSize])) 5107 for { 5108 off := v.AuxInt 5109 n := v.Aux 5110 if !(v.Type.IsString()) { 5111 break 5112 } 5113 v.reset(OpStringMake) 5114 v0 := b.NewValue0(v.Pos, OpArg, types.BytePtr) 5115 v0.AuxInt = off 5116 v0.Aux = n 5117 v.AddArg(v0) 5118 v1 := b.NewValue0(v.Pos, OpArg, types.Int) 5119 v1.AuxInt = off + config.PtrSize 5120 v1.Aux = n 5121 v.AddArg(v1) 5122 return true 5123 } 5124 // match: (Arg {n} [off]) 5125 // cond: v.Type.IsSlice() 5126 // result: (SliceMake (Arg <v.Type.ElemType().PtrTo()> {n} [off]) (Arg <types.Int> {n} [off+config.PtrSize]) (Arg <types.Int> {n} [off+2*config.PtrSize])) 5127 for { 5128 off := v.AuxInt 5129 n := v.Aux 5130 if !(v.Type.IsSlice()) { 5131 break 5132 } 5133 v.reset(OpSliceMake) 5134 v0 := b.NewValue0(v.Pos, OpArg, v.Type.ElemType().PtrTo()) 5135 v0.AuxInt = off 5136 v0.Aux = n 5137 v.AddArg(v0) 5138 v1 := b.NewValue0(v.Pos, OpArg, types.Int) 5139 v1.AuxInt = off + config.PtrSize 5140 v1.Aux = n 5141 v.AddArg(v1) 5142 v2 := b.NewValue0(v.Pos, OpArg, types.Int) 5143 v2.AuxInt = off + 2*config.PtrSize 5144 v2.Aux = n 5145 v.AddArg(v2) 5146 return true 5147 } 5148 // match: (Arg {n} [off]) 5149 // cond: v.Type.IsInterface() 5150 // result: (IMake (Arg <types.BytePtr> {n} [off]) (Arg <types.BytePtr> {n} [off+config.PtrSize])) 5151 for { 5152 off := v.AuxInt 5153 n := v.Aux 5154 if !(v.Type.IsInterface()) { 5155 break 5156 } 5157 v.reset(OpIMake) 5158 v0 := b.NewValue0(v.Pos, OpArg, types.BytePtr) 5159 v0.AuxInt = off 5160 v0.Aux = n 5161 v.AddArg(v0) 5162 v1 := b.NewValue0(v.Pos, OpArg, types.BytePtr) 5163 v1.AuxInt = off + config.PtrSize 5164 v1.Aux = n 5165 v.AddArg(v1) 5166 return true 5167 } 5168 // match: (Arg {n} [off]) 5169 // cond: v.Type.IsComplex() && v.Type.Size() == 16 5170 // result: (ComplexMake (Arg <types.Float64> {n} [off]) (Arg <types.Float64> {n} [off+8])) 5171 for { 5172 off := v.AuxInt 5173 n := v.Aux 5174 if !(v.Type.IsComplex() && v.Type.Size() == 16) { 5175 break 5176 } 5177 v.reset(OpComplexMake) 5178 v0 := b.NewValue0(v.Pos, OpArg, types.Float64) 5179 v0.AuxInt = off 5180 v0.Aux = n 5181 v.AddArg(v0) 5182 v1 := b.NewValue0(v.Pos, OpArg, types.Float64) 5183 v1.AuxInt = off + 8 5184 v1.Aux = n 5185 v.AddArg(v1) 5186 return true 5187 } 5188 // match: (Arg {n} [off]) 5189 // cond: v.Type.IsComplex() && v.Type.Size() == 8 5190 // result: (ComplexMake (Arg <types.Float32> {n} [off]) (Arg <types.Float32> {n} [off+4])) 5191 for { 5192 off := v.AuxInt 5193 n := v.Aux 5194 if !(v.Type.IsComplex() && v.Type.Size() == 8) { 5195 break 5196 } 5197 v.reset(OpComplexMake) 5198 v0 := b.NewValue0(v.Pos, OpArg, types.Float32) 5199 v0.AuxInt = off 5200 v0.Aux = n 5201 v.AddArg(v0) 5202 v1 := b.NewValue0(v.Pos, OpArg, types.Float32) 5203 v1.AuxInt = off + 4 5204 v1.Aux = n 5205 v.AddArg(v1) 5206 return true 5207 } 5208 // match: (Arg <t>) 5209 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 5210 // result: (StructMake0) 5211 for { 5212 t := v.Type 5213 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 5214 break 5215 } 5216 v.reset(OpStructMake0) 5217 return true 5218 } 5219 // match: (Arg <t> {n} [off]) 5220 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 5221 // result: (StructMake1 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])) 5222 for { 5223 t := v.Type 5224 off := v.AuxInt 5225 n := v.Aux 5226 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 5227 break 5228 } 5229 v.reset(OpStructMake1) 5230 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 5231 v0.AuxInt = off + t.FieldOff(0) 5232 v0.Aux = n 5233 v.AddArg(v0) 5234 return true 5235 } 5236 // match: (Arg <t> {n} [off]) 5237 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 5238 // result: (StructMake2 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])) 5239 for { 5240 t := v.Type 5241 off := v.AuxInt 5242 n := v.Aux 5243 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 5244 break 5245 } 5246 v.reset(OpStructMake2) 5247 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 5248 v0.AuxInt = off + t.FieldOff(0) 5249 v0.Aux = n 5250 v.AddArg(v0) 5251 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 5252 v1.AuxInt = off + t.FieldOff(1) 5253 v1.Aux = n 5254 v.AddArg(v1) 5255 return true 5256 } 5257 // match: (Arg <t> {n} [off]) 5258 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 5259 // result: (StructMake3 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]) (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)])) 5260 for { 5261 t := v.Type 5262 off := v.AuxInt 5263 n := v.Aux 5264 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 5265 break 5266 } 5267 v.reset(OpStructMake3) 5268 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 5269 v0.AuxInt = off + t.FieldOff(0) 5270 v0.Aux = n 5271 v.AddArg(v0) 5272 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 5273 v1.AuxInt = off + t.FieldOff(1) 5274 v1.Aux = n 5275 v.AddArg(v1) 5276 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 5277 v2.AuxInt = off + t.FieldOff(2) 5278 v2.Aux = n 5279 v.AddArg(v2) 5280 return true 5281 } 5282 // match: (Arg <t> {n} [off]) 5283 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 5284 // result: (StructMake4 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]) (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)]) (Arg <t.FieldType(3)> {n} [off+t.FieldOff(3)])) 5285 for { 5286 t := v.Type 5287 off := v.AuxInt 5288 n := v.Aux 5289 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 5290 break 5291 } 5292 v.reset(OpStructMake4) 5293 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 5294 v0.AuxInt = off + t.FieldOff(0) 5295 v0.Aux = n 5296 v.AddArg(v0) 5297 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 5298 v1.AuxInt = off + t.FieldOff(1) 5299 v1.Aux = n 5300 v.AddArg(v1) 5301 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 5302 v2.AuxInt = off + t.FieldOff(2) 5303 v2.Aux = n 5304 v.AddArg(v2) 5305 v3 := b.NewValue0(v.Pos, OpArg, t.FieldType(3)) 5306 v3.AuxInt = off + t.FieldOff(3) 5307 v3.Aux = n 5308 v.AddArg(v3) 5309 return true 5310 } 5311 return false 5312 } 5313 func rewriteValuegeneric_OpArg_10(v *Value) bool { 5314 b := v.Block 5315 _ = b 5316 fe := b.Func.fe 5317 _ = fe 5318 // match: (Arg <t>) 5319 // cond: t.IsArray() && t.NumElem() == 0 5320 // result: (ArrayMake0) 5321 for { 5322 t := v.Type 5323 if !(t.IsArray() && t.NumElem() == 0) { 5324 break 5325 } 5326 v.reset(OpArrayMake0) 5327 return true 5328 } 5329 // match: (Arg <t> {n} [off]) 5330 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 5331 // result: (ArrayMake1 (Arg <t.ElemType()> {n} [off])) 5332 for { 5333 t := v.Type 5334 off := v.AuxInt 5335 n := v.Aux 5336 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 5337 break 5338 } 5339 v.reset(OpArrayMake1) 5340 v0 := b.NewValue0(v.Pos, OpArg, t.ElemType()) 5341 v0.AuxInt = off 5342 v0.Aux = n 5343 v.AddArg(v0) 5344 return true 5345 } 5346 return false 5347 } 5348 func rewriteValuegeneric_OpArraySelect_0(v *Value) bool { 5349 // match: (ArraySelect (ArrayMake1 x)) 5350 // cond: 5351 // result: x 5352 for { 5353 v_0 := v.Args[0] 5354 if v_0.Op != OpArrayMake1 { 5355 break 5356 } 5357 x := v_0.Args[0] 5358 v.reset(OpCopy) 5359 v.Type = x.Type 5360 v.AddArg(x) 5361 return true 5362 } 5363 // match: (ArraySelect [0] (Load ptr mem)) 5364 // cond: 5365 // result: (Load ptr mem) 5366 for { 5367 if v.AuxInt != 0 { 5368 break 5369 } 5370 v_0 := v.Args[0] 5371 if v_0.Op != OpLoad { 5372 break 5373 } 5374 ptr := v_0.Args[0] 5375 mem := v_0.Args[1] 5376 v.reset(OpLoad) 5377 v.AddArg(ptr) 5378 v.AddArg(mem) 5379 return true 5380 } 5381 // match: (ArraySelect [0] x:(IData _)) 5382 // cond: 5383 // result: x 5384 for { 5385 if v.AuxInt != 0 { 5386 break 5387 } 5388 x := v.Args[0] 5389 if x.Op != OpIData { 5390 break 5391 } 5392 v.reset(OpCopy) 5393 v.Type = x.Type 5394 v.AddArg(x) 5395 return true 5396 } 5397 return false 5398 } 5399 func rewriteValuegeneric_OpCom16_0(v *Value) bool { 5400 // match: (Com16 (Com16 x)) 5401 // cond: 5402 // result: x 5403 for { 5404 v_0 := v.Args[0] 5405 if v_0.Op != OpCom16 { 5406 break 5407 } 5408 x := v_0.Args[0] 5409 v.reset(OpCopy) 5410 v.Type = x.Type 5411 v.AddArg(x) 5412 return true 5413 } 5414 return false 5415 } 5416 func rewriteValuegeneric_OpCom32_0(v *Value) bool { 5417 // match: (Com32 (Com32 x)) 5418 // cond: 5419 // result: x 5420 for { 5421 v_0 := v.Args[0] 5422 if v_0.Op != OpCom32 { 5423 break 5424 } 5425 x := v_0.Args[0] 5426 v.reset(OpCopy) 5427 v.Type = x.Type 5428 v.AddArg(x) 5429 return true 5430 } 5431 return false 5432 } 5433 func rewriteValuegeneric_OpCom64_0(v *Value) bool { 5434 // match: (Com64 (Com64 x)) 5435 // cond: 5436 // result: x 5437 for { 5438 v_0 := v.Args[0] 5439 if v_0.Op != OpCom64 { 5440 break 5441 } 5442 x := v_0.Args[0] 5443 v.reset(OpCopy) 5444 v.Type = x.Type 5445 v.AddArg(x) 5446 return true 5447 } 5448 return false 5449 } 5450 func rewriteValuegeneric_OpCom8_0(v *Value) bool { 5451 // match: (Com8 (Com8 x)) 5452 // cond: 5453 // result: x 5454 for { 5455 v_0 := v.Args[0] 5456 if v_0.Op != OpCom8 { 5457 break 5458 } 5459 x := v_0.Args[0] 5460 v.reset(OpCopy) 5461 v.Type = x.Type 5462 v.AddArg(x) 5463 return true 5464 } 5465 return false 5466 } 5467 func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { 5468 b := v.Block 5469 _ = b 5470 types := &b.Func.Config.Types 5471 _ = types 5472 // match: (ConstInterface) 5473 // cond: 5474 // result: (IMake (ConstNil <types.BytePtr>) (ConstNil <types.BytePtr>)) 5475 for { 5476 v.reset(OpIMake) 5477 v0 := b.NewValue0(v.Pos, OpConstNil, types.BytePtr) 5478 v.AddArg(v0) 5479 v1 := b.NewValue0(v.Pos, OpConstNil, types.BytePtr) 5480 v.AddArg(v1) 5481 return true 5482 } 5483 } 5484 func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { 5485 b := v.Block 5486 _ = b 5487 config := b.Func.Config 5488 _ = config 5489 types := &b.Func.Config.Types 5490 _ = types 5491 // match: (ConstSlice) 5492 // cond: config.PtrSize == 4 5493 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const32 <types.Int> [0]) (Const32 <types.Int> [0])) 5494 for { 5495 if !(config.PtrSize == 4) { 5496 break 5497 } 5498 v.reset(OpSliceMake) 5499 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 5500 v.AddArg(v0) 5501 v1 := b.NewValue0(v.Pos, OpConst32, types.Int) 5502 v1.AuxInt = 0 5503 v.AddArg(v1) 5504 v2 := b.NewValue0(v.Pos, OpConst32, types.Int) 5505 v2.AuxInt = 0 5506 v.AddArg(v2) 5507 return true 5508 } 5509 // match: (ConstSlice) 5510 // cond: config.PtrSize == 8 5511 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const64 <types.Int> [0]) (Const64 <types.Int> [0])) 5512 for { 5513 if !(config.PtrSize == 8) { 5514 break 5515 } 5516 v.reset(OpSliceMake) 5517 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 5518 v.AddArg(v0) 5519 v1 := b.NewValue0(v.Pos, OpConst64, types.Int) 5520 v1.AuxInt = 0 5521 v.AddArg(v1) 5522 v2 := b.NewValue0(v.Pos, OpConst64, types.Int) 5523 v2.AuxInt = 0 5524 v.AddArg(v2) 5525 return true 5526 } 5527 return false 5528 } 5529 func rewriteValuegeneric_OpConstString_0(v *Value) bool { 5530 b := v.Block 5531 _ = b 5532 config := b.Func.Config 5533 _ = config 5534 fe := b.Func.fe 5535 _ = fe 5536 types := &b.Func.Config.Types 5537 _ = types 5538 // match: (ConstString {s}) 5539 // cond: config.PtrSize == 4 && s.(string) == "" 5540 // result: (StringMake (ConstNil) (Const32 <types.Int> [0])) 5541 for { 5542 s := v.Aux 5543 if !(config.PtrSize == 4 && s.(string) == "") { 5544 break 5545 } 5546 v.reset(OpStringMake) 5547 v0 := b.NewValue0(v.Pos, OpConstNil, types.BytePtr) 5548 v.AddArg(v0) 5549 v1 := b.NewValue0(v.Pos, OpConst32, types.Int) 5550 v1.AuxInt = 0 5551 v.AddArg(v1) 5552 return true 5553 } 5554 // match: (ConstString {s}) 5555 // cond: config.PtrSize == 8 && s.(string) == "" 5556 // result: (StringMake (ConstNil) (Const64 <types.Int> [0])) 5557 for { 5558 s := v.Aux 5559 if !(config.PtrSize == 8 && s.(string) == "") { 5560 break 5561 } 5562 v.reset(OpStringMake) 5563 v0 := b.NewValue0(v.Pos, OpConstNil, types.BytePtr) 5564 v.AddArg(v0) 5565 v1 := b.NewValue0(v.Pos, OpConst64, types.Int) 5566 v1.AuxInt = 0 5567 v.AddArg(v1) 5568 return true 5569 } 5570 // match: (ConstString {s}) 5571 // cond: config.PtrSize == 4 && s.(string) != "" 5572 // result: (StringMake (Addr <types.BytePtr> {fe.StringData(s.(string))} (SB)) (Const32 <types.Int> [int64(len(s.(string)))])) 5573 for { 5574 s := v.Aux 5575 if !(config.PtrSize == 4 && s.(string) != "") { 5576 break 5577 } 5578 v.reset(OpStringMake) 5579 v0 := b.NewValue0(v.Pos, OpAddr, types.BytePtr) 5580 v0.Aux = fe.StringData(s.(string)) 5581 v1 := b.NewValue0(v.Pos, OpSB, types.Uintptr) 5582 v0.AddArg(v1) 5583 v.AddArg(v0) 5584 v2 := b.NewValue0(v.Pos, OpConst32, types.Int) 5585 v2.AuxInt = int64(len(s.(string))) 5586 v.AddArg(v2) 5587 return true 5588 } 5589 // match: (ConstString {s}) 5590 // cond: config.PtrSize == 8 && s.(string) != "" 5591 // result: (StringMake (Addr <types.BytePtr> {fe.StringData(s.(string))} (SB)) (Const64 <types.Int> [int64(len(s.(string)))])) 5592 for { 5593 s := v.Aux 5594 if !(config.PtrSize == 8 && s.(string) != "") { 5595 break 5596 } 5597 v.reset(OpStringMake) 5598 v0 := b.NewValue0(v.Pos, OpAddr, types.BytePtr) 5599 v0.Aux = fe.StringData(s.(string)) 5600 v1 := b.NewValue0(v.Pos, OpSB, types.Uintptr) 5601 v0.AddArg(v1) 5602 v.AddArg(v0) 5603 v2 := b.NewValue0(v.Pos, OpConst64, types.Int) 5604 v2.AuxInt = int64(len(s.(string))) 5605 v.AddArg(v2) 5606 return true 5607 } 5608 return false 5609 } 5610 func rewriteValuegeneric_OpConvert_0(v *Value) bool { 5611 // match: (Convert (Add64 (Convert ptr mem) off) mem) 5612 // cond: 5613 // result: (Add64 ptr off) 5614 for { 5615 v_0 := v.Args[0] 5616 if v_0.Op != OpAdd64 { 5617 break 5618 } 5619 v_0_0 := v_0.Args[0] 5620 if v_0_0.Op != OpConvert { 5621 break 5622 } 5623 ptr := v_0_0.Args[0] 5624 mem := v_0_0.Args[1] 5625 off := v_0.Args[1] 5626 if mem != v.Args[1] { 5627 break 5628 } 5629 v.reset(OpAdd64) 5630 v.AddArg(ptr) 5631 v.AddArg(off) 5632 return true 5633 } 5634 // match: (Convert (Add64 off (Convert ptr mem)) mem) 5635 // cond: 5636 // result: (Add64 ptr off) 5637 for { 5638 v_0 := v.Args[0] 5639 if v_0.Op != OpAdd64 { 5640 break 5641 } 5642 off := v_0.Args[0] 5643 v_0_1 := v_0.Args[1] 5644 if v_0_1.Op != OpConvert { 5645 break 5646 } 5647 ptr := v_0_1.Args[0] 5648 mem := v_0_1.Args[1] 5649 if mem != v.Args[1] { 5650 break 5651 } 5652 v.reset(OpAdd64) 5653 v.AddArg(ptr) 5654 v.AddArg(off) 5655 return true 5656 } 5657 // match: (Convert (Convert ptr mem) mem) 5658 // cond: 5659 // result: ptr 5660 for { 5661 v_0 := v.Args[0] 5662 if v_0.Op != OpConvert { 5663 break 5664 } 5665 ptr := v_0.Args[0] 5666 mem := v_0.Args[1] 5667 if mem != v.Args[1] { 5668 break 5669 } 5670 v.reset(OpCopy) 5671 v.Type = ptr.Type 5672 v.AddArg(ptr) 5673 return true 5674 } 5675 return false 5676 } 5677 func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { 5678 // match: (Cvt32Fto64F (Const32F [c])) 5679 // cond: 5680 // result: (Const64F [c]) 5681 for { 5682 v_0 := v.Args[0] 5683 if v_0.Op != OpConst32F { 5684 break 5685 } 5686 c := v_0.AuxInt 5687 v.reset(OpConst64F) 5688 v.AuxInt = c 5689 return true 5690 } 5691 return false 5692 } 5693 func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { 5694 // match: (Cvt64Fto32F (Const64F [c])) 5695 // cond: 5696 // result: (Const32F [f2i(float64(i2f32(c)))]) 5697 for { 5698 v_0 := v.Args[0] 5699 if v_0.Op != OpConst64F { 5700 break 5701 } 5702 c := v_0.AuxInt 5703 v.reset(OpConst32F) 5704 v.AuxInt = f2i(float64(i2f32(c))) 5705 return true 5706 } 5707 return false 5708 } 5709 func rewriteValuegeneric_OpDiv16_0(v *Value) bool { 5710 b := v.Block 5711 _ = b 5712 types := &b.Func.Config.Types 5713 _ = types 5714 // match: (Div16 (Const16 [c]) (Const16 [d])) 5715 // cond: d != 0 5716 // result: (Const16 [int64(int16(c)/int16(d))]) 5717 for { 5718 v_0 := v.Args[0] 5719 if v_0.Op != OpConst16 { 5720 break 5721 } 5722 c := v_0.AuxInt 5723 v_1 := v.Args[1] 5724 if v_1.Op != OpConst16 { 5725 break 5726 } 5727 d := v_1.AuxInt 5728 if !(d != 0) { 5729 break 5730 } 5731 v.reset(OpConst16) 5732 v.AuxInt = int64(int16(c) / int16(d)) 5733 return true 5734 } 5735 // match: (Div16 <t> n (Const16 [c])) 5736 // cond: c < 0 && c != -1<<15 5737 // result: (Neg16 (Div16 <t> n (Const16 <t> [-c]))) 5738 for { 5739 t := v.Type 5740 n := v.Args[0] 5741 v_1 := v.Args[1] 5742 if v_1.Op != OpConst16 { 5743 break 5744 } 5745 c := v_1.AuxInt 5746 if !(c < 0 && c != -1<<15) { 5747 break 5748 } 5749 v.reset(OpNeg16) 5750 v0 := b.NewValue0(v.Pos, OpDiv16, t) 5751 v0.AddArg(n) 5752 v1 := b.NewValue0(v.Pos, OpConst16, t) 5753 v1.AuxInt = -c 5754 v0.AddArg(v1) 5755 v.AddArg(v0) 5756 return true 5757 } 5758 // match: (Div16 <t> x (Const16 [-1<<15])) 5759 // cond: 5760 // result: (Rsh16Ux64 (And16 <t> x (Neg16 <t> x)) (Const64 <types.UInt64> [15])) 5761 for { 5762 t := v.Type 5763 x := v.Args[0] 5764 v_1 := v.Args[1] 5765 if v_1.Op != OpConst16 { 5766 break 5767 } 5768 if v_1.AuxInt != -1<<15 { 5769 break 5770 } 5771 v.reset(OpRsh16Ux64) 5772 v0 := b.NewValue0(v.Pos, OpAnd16, t) 5773 v0.AddArg(x) 5774 v1 := b.NewValue0(v.Pos, OpNeg16, t) 5775 v1.AddArg(x) 5776 v0.AddArg(v1) 5777 v.AddArg(v0) 5778 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5779 v2.AuxInt = 15 5780 v.AddArg(v2) 5781 return true 5782 } 5783 // match: (Div16 <t> n (Const16 [c])) 5784 // cond: isPowerOfTwo(c) 5785 // result: (Rsh16x64 (Add16 <t> n (Rsh16Ux64 <t> (Rsh16x64 <t> n (Const64 <types.UInt64> [15])) (Const64 <types.UInt64> [16-log2(c)]))) (Const64 <types.UInt64> [log2(c)])) 5786 for { 5787 t := v.Type 5788 n := v.Args[0] 5789 v_1 := v.Args[1] 5790 if v_1.Op != OpConst16 { 5791 break 5792 } 5793 c := v_1.AuxInt 5794 if !(isPowerOfTwo(c)) { 5795 break 5796 } 5797 v.reset(OpRsh16x64) 5798 v0 := b.NewValue0(v.Pos, OpAdd16, t) 5799 v0.AddArg(n) 5800 v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) 5801 v2 := b.NewValue0(v.Pos, OpRsh16x64, t) 5802 v2.AddArg(n) 5803 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5804 v3.AuxInt = 15 5805 v2.AddArg(v3) 5806 v1.AddArg(v2) 5807 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5808 v4.AuxInt = 16 - log2(c) 5809 v1.AddArg(v4) 5810 v0.AddArg(v1) 5811 v.AddArg(v0) 5812 v5 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5813 v5.AuxInt = log2(c) 5814 v.AddArg(v5) 5815 return true 5816 } 5817 // match: (Div16 <t> x (Const16 [c])) 5818 // cond: smagicOK(16,c) 5819 // result: (Sub16 <t> (Rsh32x64 <t> (Mul32 <types.UInt32> (Const32 <types.UInt32> [int64(smagic(16,c).m)]) (SignExt16to32 x)) (Const64 <types.UInt64> [16+smagic(16,c).s])) (Rsh32x64 <t> (SignExt16to32 x) (Const64 <types.UInt64> [31]))) 5820 for { 5821 t := v.Type 5822 x := v.Args[0] 5823 v_1 := v.Args[1] 5824 if v_1.Op != OpConst16 { 5825 break 5826 } 5827 c := v_1.AuxInt 5828 if !(smagicOK(16, c)) { 5829 break 5830 } 5831 v.reset(OpSub16) 5832 v.Type = t 5833 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 5834 v1 := b.NewValue0(v.Pos, OpMul32, types.UInt32) 5835 v2 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 5836 v2.AuxInt = int64(smagic(16, c).m) 5837 v1.AddArg(v2) 5838 v3 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 5839 v3.AddArg(x) 5840 v1.AddArg(v3) 5841 v0.AddArg(v1) 5842 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5843 v4.AuxInt = 16 + smagic(16, c).s 5844 v0.AddArg(v4) 5845 v.AddArg(v0) 5846 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 5847 v6 := b.NewValue0(v.Pos, OpSignExt16to32, types.Int32) 5848 v6.AddArg(x) 5849 v5.AddArg(v6) 5850 v7 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5851 v7.AuxInt = 31 5852 v5.AddArg(v7) 5853 v.AddArg(v5) 5854 return true 5855 } 5856 return false 5857 } 5858 func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { 5859 b := v.Block 5860 _ = b 5861 config := b.Func.Config 5862 _ = config 5863 types := &b.Func.Config.Types 5864 _ = types 5865 // match: (Div16u (Const16 [c]) (Const16 [d])) 5866 // cond: d != 0 5867 // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) 5868 for { 5869 v_0 := v.Args[0] 5870 if v_0.Op != OpConst16 { 5871 break 5872 } 5873 c := v_0.AuxInt 5874 v_1 := v.Args[1] 5875 if v_1.Op != OpConst16 { 5876 break 5877 } 5878 d := v_1.AuxInt 5879 if !(d != 0) { 5880 break 5881 } 5882 v.reset(OpConst16) 5883 v.AuxInt = int64(int16(uint16(c) / uint16(d))) 5884 return true 5885 } 5886 // match: (Div16u n (Const16 [c])) 5887 // cond: isPowerOfTwo(c&0xffff) 5888 // result: (Rsh16Ux64 n (Const64 <types.UInt64> [log2(c&0xffff)])) 5889 for { 5890 n := v.Args[0] 5891 v_1 := v.Args[1] 5892 if v_1.Op != OpConst16 { 5893 break 5894 } 5895 c := v_1.AuxInt 5896 if !(isPowerOfTwo(c & 0xffff)) { 5897 break 5898 } 5899 v.reset(OpRsh16Ux64) 5900 v.AddArg(n) 5901 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5902 v0.AuxInt = log2(c & 0xffff) 5903 v.AddArg(v0) 5904 return true 5905 } 5906 // match: (Div16u x (Const16 [c])) 5907 // cond: umagicOK(16, c) && config.RegSize == 8 5908 // result: (Trunc64to16 (Rsh64Ux64 <types.UInt64> (Mul64 <types.UInt64> (Const64 <types.UInt64> [int64(1<<16+umagic(16,c).m)]) (ZeroExt16to64 x)) (Const64 <types.UInt64> [16+umagic(16,c).s]))) 5909 for { 5910 x := v.Args[0] 5911 v_1 := v.Args[1] 5912 if v_1.Op != OpConst16 { 5913 break 5914 } 5915 c := v_1.AuxInt 5916 if !(umagicOK(16, c) && config.RegSize == 8) { 5917 break 5918 } 5919 v.reset(OpTrunc64to16) 5920 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, types.UInt64) 5921 v1 := b.NewValue0(v.Pos, OpMul64, types.UInt64) 5922 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5923 v2.AuxInt = int64(1<<16 + umagic(16, c).m) 5924 v1.AddArg(v2) 5925 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, types.UInt64) 5926 v3.AddArg(x) 5927 v1.AddArg(v3) 5928 v0.AddArg(v1) 5929 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5930 v4.AuxInt = 16 + umagic(16, c).s 5931 v0.AddArg(v4) 5932 v.AddArg(v0) 5933 return true 5934 } 5935 // match: (Div16u x (Const16 [c])) 5936 // cond: umagicOK(16, c) && config.RegSize == 4 && umagic(16,c).m&1 == 0 5937 // result: (Trunc32to16 (Rsh32Ux64 <types.UInt32> (Mul32 <types.UInt32> (Const32 <types.UInt32> [int64(1<<15+umagic(16,c).m/2)]) (ZeroExt16to32 x)) (Const64 <types.UInt64> [16+umagic(16,c).s-1]))) 5938 for { 5939 x := v.Args[0] 5940 v_1 := v.Args[1] 5941 if v_1.Op != OpConst16 { 5942 break 5943 } 5944 c := v_1.AuxInt 5945 if !(umagicOK(16, c) && config.RegSize == 4 && umagic(16, c).m&1 == 0) { 5946 break 5947 } 5948 v.reset(OpTrunc32to16) 5949 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, types.UInt32) 5950 v1 := b.NewValue0(v.Pos, OpMul32, types.UInt32) 5951 v2 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 5952 v2.AuxInt = int64(1<<15 + umagic(16, c).m/2) 5953 v1.AddArg(v2) 5954 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 5955 v3.AddArg(x) 5956 v1.AddArg(v3) 5957 v0.AddArg(v1) 5958 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5959 v4.AuxInt = 16 + umagic(16, c).s - 1 5960 v0.AddArg(v4) 5961 v.AddArg(v0) 5962 return true 5963 } 5964 // match: (Div16u x (Const16 [c])) 5965 // cond: umagicOK(16, c) && config.RegSize == 4 && c&1 == 0 5966 // result: (Trunc32to16 (Rsh32Ux64 <types.UInt32> (Mul32 <types.UInt32> (Const32 <types.UInt32> [int64(1<<15+(umagic(16,c).m+1)/2)]) (Rsh32Ux64 <types.UInt32> (ZeroExt16to32 x) (Const64 <types.UInt64> [1]))) (Const64 <types.UInt64> [16+umagic(16,c).s-2]))) 5967 for { 5968 x := v.Args[0] 5969 v_1 := v.Args[1] 5970 if v_1.Op != OpConst16 { 5971 break 5972 } 5973 c := v_1.AuxInt 5974 if !(umagicOK(16, c) && config.RegSize == 4 && c&1 == 0) { 5975 break 5976 } 5977 v.reset(OpTrunc32to16) 5978 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, types.UInt32) 5979 v1 := b.NewValue0(v.Pos, OpMul32, types.UInt32) 5980 v2 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 5981 v2.AuxInt = int64(1<<15 + (umagic(16, c).m+1)/2) 5982 v1.AddArg(v2) 5983 v3 := b.NewValue0(v.Pos, OpRsh32Ux64, types.UInt32) 5984 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 5985 v4.AddArg(x) 5986 v3.AddArg(v4) 5987 v5 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5988 v5.AuxInt = 1 5989 v3.AddArg(v5) 5990 v1.AddArg(v3) 5991 v0.AddArg(v1) 5992 v6 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 5993 v6.AuxInt = 16 + umagic(16, c).s - 2 5994 v0.AddArg(v6) 5995 v.AddArg(v0) 5996 return true 5997 } 5998 // match: (Div16u x (Const16 [c])) 5999 // cond: umagicOK(16, c) && config.RegSize == 4 6000 // result: (Trunc32to16 (Rsh32Ux64 <types.UInt32> (Avg32u (Lsh32x64 <types.UInt32> (ZeroExt16to32 x) (Const64 <types.UInt64> [16])) (Mul32 <types.UInt32> (Const32 <types.UInt32> [int64(umagic(16,c).m)]) (ZeroExt16to32 x))) (Const64 <types.UInt64> [16+umagic(16,c).s-1]))) 6001 for { 6002 x := v.Args[0] 6003 v_1 := v.Args[1] 6004 if v_1.Op != OpConst16 { 6005 break 6006 } 6007 c := v_1.AuxInt 6008 if !(umagicOK(16, c) && config.RegSize == 4) { 6009 break 6010 } 6011 v.reset(OpTrunc32to16) 6012 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, types.UInt32) 6013 v1 := b.NewValue0(v.Pos, OpAvg32u, types.UInt32) 6014 v2 := b.NewValue0(v.Pos, OpLsh32x64, types.UInt32) 6015 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 6016 v3.AddArg(x) 6017 v2.AddArg(v3) 6018 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6019 v4.AuxInt = 16 6020 v2.AddArg(v4) 6021 v1.AddArg(v2) 6022 v5 := b.NewValue0(v.Pos, OpMul32, types.UInt32) 6023 v6 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 6024 v6.AuxInt = int64(umagic(16, c).m) 6025 v5.AddArg(v6) 6026 v7 := b.NewValue0(v.Pos, OpZeroExt16to32, types.UInt32) 6027 v7.AddArg(x) 6028 v5.AddArg(v7) 6029 v1.AddArg(v5) 6030 v0.AddArg(v1) 6031 v8 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6032 v8.AuxInt = 16 + umagic(16, c).s - 1 6033 v0.AddArg(v8) 6034 v.AddArg(v0) 6035 return true 6036 } 6037 return false 6038 } 6039 func rewriteValuegeneric_OpDiv32_0(v *Value) bool { 6040 b := v.Block 6041 _ = b 6042 config := b.Func.Config 6043 _ = config 6044 types := &b.Func.Config.Types 6045 _ = types 6046 // match: (Div32 (Const32 [c]) (Const32 [d])) 6047 // cond: d != 0 6048 // result: (Const32 [int64(int32(c)/int32(d))]) 6049 for { 6050 v_0 := v.Args[0] 6051 if v_0.Op != OpConst32 { 6052 break 6053 } 6054 c := v_0.AuxInt 6055 v_1 := v.Args[1] 6056 if v_1.Op != OpConst32 { 6057 break 6058 } 6059 d := v_1.AuxInt 6060 if !(d != 0) { 6061 break 6062 } 6063 v.reset(OpConst32) 6064 v.AuxInt = int64(int32(c) / int32(d)) 6065 return true 6066 } 6067 // match: (Div32 <t> n (Const32 [c])) 6068 // cond: c < 0 && c != -1<<31 6069 // result: (Neg32 (Div32 <t> n (Const32 <t> [-c]))) 6070 for { 6071 t := v.Type 6072 n := v.Args[0] 6073 v_1 := v.Args[1] 6074 if v_1.Op != OpConst32 { 6075 break 6076 } 6077 c := v_1.AuxInt 6078 if !(c < 0 && c != -1<<31) { 6079 break 6080 } 6081 v.reset(OpNeg32) 6082 v0 := b.NewValue0(v.Pos, OpDiv32, t) 6083 v0.AddArg(n) 6084 v1 := b.NewValue0(v.Pos, OpConst32, t) 6085 v1.AuxInt = -c 6086 v0.AddArg(v1) 6087 v.AddArg(v0) 6088 return true 6089 } 6090 // match: (Div32 <t> x (Const32 [-1<<31])) 6091 // cond: 6092 // result: (Rsh32Ux64 (And32 <t> x (Neg32 <t> x)) (Const64 <types.UInt64> [31])) 6093 for { 6094 t := v.Type 6095 x := v.Args[0] 6096 v_1 := v.Args[1] 6097 if v_1.Op != OpConst32 { 6098 break 6099 } 6100 if v_1.AuxInt != -1<<31 { 6101 break 6102 } 6103 v.reset(OpRsh32Ux64) 6104 v0 := b.NewValue0(v.Pos, OpAnd32, t) 6105 v0.AddArg(x) 6106 v1 := b.NewValue0(v.Pos, OpNeg32, t) 6107 v1.AddArg(x) 6108 v0.AddArg(v1) 6109 v.AddArg(v0) 6110 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6111 v2.AuxInt = 31 6112 v.AddArg(v2) 6113 return true 6114 } 6115 // match: (Div32 <t> n (Const32 [c])) 6116 // cond: isPowerOfTwo(c) 6117 // result: (Rsh32x64 (Add32 <t> n (Rsh32Ux64 <t> (Rsh32x64 <t> n (Const64 <types.UInt64> [31])) (Const64 <types.UInt64> [32-log2(c)]))) (Const64 <types.UInt64> [log2(c)])) 6118 for { 6119 t := v.Type 6120 n := v.Args[0] 6121 v_1 := v.Args[1] 6122 if v_1.Op != OpConst32 { 6123 break 6124 } 6125 c := v_1.AuxInt 6126 if !(isPowerOfTwo(c)) { 6127 break 6128 } 6129 v.reset(OpRsh32x64) 6130 v0 := b.NewValue0(v.Pos, OpAdd32, t) 6131 v0.AddArg(n) 6132 v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) 6133 v2 := b.NewValue0(v.Pos, OpRsh32x64, t) 6134 v2.AddArg(n) 6135 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6136 v3.AuxInt = 31 6137 v2.AddArg(v3) 6138 v1.AddArg(v2) 6139 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6140 v4.AuxInt = 32 - log2(c) 6141 v1.AddArg(v4) 6142 v0.AddArg(v1) 6143 v.AddArg(v0) 6144 v5 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6145 v5.AuxInt = log2(c) 6146 v.AddArg(v5) 6147 return true 6148 } 6149 // match: (Div32 <t> x (Const32 [c])) 6150 // cond: smagicOK(32,c) && config.RegSize == 8 6151 // result: (Sub32 <t> (Rsh64x64 <t> (Mul64 <types.UInt64> (Const64 <types.UInt64> [int64(smagic(32,c).m)]) (SignExt32to64 x)) (Const64 <types.UInt64> [32+smagic(32,c).s])) (Rsh64x64 <t> (SignExt32to64 x) (Const64 <types.UInt64> [63]))) 6152 for { 6153 t := v.Type 6154 x := v.Args[0] 6155 v_1 := v.Args[1] 6156 if v_1.Op != OpConst32 { 6157 break 6158 } 6159 c := v_1.AuxInt 6160 if !(smagicOK(32, c) && config.RegSize == 8) { 6161 break 6162 } 6163 v.reset(OpSub32) 6164 v.Type = t 6165 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 6166 v1 := b.NewValue0(v.Pos, OpMul64, types.UInt64) 6167 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6168 v2.AuxInt = int64(smagic(32, c).m) 6169 v1.AddArg(v2) 6170 v3 := b.NewValue0(v.Pos, OpSignExt32to64, types.Int64) 6171 v3.AddArg(x) 6172 v1.AddArg(v3) 6173 v0.AddArg(v1) 6174 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6175 v4.AuxInt = 32 + smagic(32, c).s 6176 v0.AddArg(v4) 6177 v.AddArg(v0) 6178 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 6179 v6 := b.NewValue0(v.Pos, OpSignExt32to64, types.Int64) 6180 v6.AddArg(x) 6181 v5.AddArg(v6) 6182 v7 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6183 v7.AuxInt = 63 6184 v5.AddArg(v7) 6185 v.AddArg(v5) 6186 return true 6187 } 6188 // match: (Div32 <t> x (Const32 [c])) 6189 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 6190 // result: (Sub32 <t> (Rsh32x64 <t> (Hmul32 <t> (Const32 <types.UInt32> [int64(int32(smagic(32,c).m/2))]) x) (Const64 <types.UInt64> [smagic(32,c).s-1])) (Rsh32x64 <t> x (Const64 <types.UInt64> [31]))) 6191 for { 6192 t := v.Type 6193 x := v.Args[0] 6194 v_1 := v.Args[1] 6195 if v_1.Op != OpConst32 { 6196 break 6197 } 6198 c := v_1.AuxInt 6199 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0) { 6200 break 6201 } 6202 v.reset(OpSub32) 6203 v.Type = t 6204 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 6205 v1 := b.NewValue0(v.Pos, OpHmul32, t) 6206 v2 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 6207 v2.AuxInt = int64(int32(smagic(32, c).m / 2)) 6208 v1.AddArg(v2) 6209 v1.AddArg(x) 6210 v0.AddArg(v1) 6211 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6212 v3.AuxInt = smagic(32, c).s - 1 6213 v0.AddArg(v3) 6214 v.AddArg(v0) 6215 v4 := b.NewValue0(v.Pos, OpRsh32x64, t) 6216 v4.AddArg(x) 6217 v5 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6218 v5.AuxInt = 31 6219 v4.AddArg(v5) 6220 v.AddArg(v4) 6221 return true 6222 } 6223 // match: (Div32 <t> x (Const32 [c])) 6224 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 6225 // result: (Sub32 <t> (Rsh32x64 <t> (Add32 <t> (Hmul32 <t> (Const32 <types.UInt32> [int64(int32(smagic(32,c).m))]) x) x) (Const64 <types.UInt64> [smagic(32,c).s])) (Rsh32x64 <t> x (Const64 <types.UInt64> [31]))) 6226 for { 6227 t := v.Type 6228 x := v.Args[0] 6229 v_1 := v.Args[1] 6230 if v_1.Op != OpConst32 { 6231 break 6232 } 6233 c := v_1.AuxInt 6234 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0) { 6235 break 6236 } 6237 v.reset(OpSub32) 6238 v.Type = t 6239 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 6240 v1 := b.NewValue0(v.Pos, OpAdd32, t) 6241 v2 := b.NewValue0(v.Pos, OpHmul32, t) 6242 v3 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 6243 v3.AuxInt = int64(int32(smagic(32, c).m)) 6244 v2.AddArg(v3) 6245 v2.AddArg(x) 6246 v1.AddArg(v2) 6247 v1.AddArg(x) 6248 v0.AddArg(v1) 6249 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6250 v4.AuxInt = smagic(32, c).s 6251 v0.AddArg(v4) 6252 v.AddArg(v0) 6253 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 6254 v5.AddArg(x) 6255 v6 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6256 v6.AuxInt = 31 6257 v5.AddArg(v6) 6258 v.AddArg(v5) 6259 return true 6260 } 6261 return false 6262 } 6263 func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { 6264 b := v.Block 6265 _ = b 6266 // match: (Div32F (Const32F [c]) (Const32F [d])) 6267 // cond: 6268 // result: (Const32F [f2i(float64(i2f32(c) / i2f32(d)))]) 6269 for { 6270 v_0 := v.Args[0] 6271 if v_0.Op != OpConst32F { 6272 break 6273 } 6274 c := v_0.AuxInt 6275 v_1 := v.Args[1] 6276 if v_1.Op != OpConst32F { 6277 break 6278 } 6279 d := v_1.AuxInt 6280 v.reset(OpConst32F) 6281 v.AuxInt = f2i(float64(i2f32(c) / i2f32(d))) 6282 return true 6283 } 6284 // match: (Div32F x (Const32F <t> [c])) 6285 // cond: reciprocalExact32(float32(i2f(c))) 6286 // result: (Mul32F x (Const32F <t> [f2i(1/i2f(c))])) 6287 for { 6288 x := v.Args[0] 6289 v_1 := v.Args[1] 6290 if v_1.Op != OpConst32F { 6291 break 6292 } 6293 t := v_1.Type 6294 c := v_1.AuxInt 6295 if !(reciprocalExact32(float32(i2f(c)))) { 6296 break 6297 } 6298 v.reset(OpMul32F) 6299 v.AddArg(x) 6300 v0 := b.NewValue0(v.Pos, OpConst32F, t) 6301 v0.AuxInt = f2i(1 / i2f(c)) 6302 v.AddArg(v0) 6303 return true 6304 } 6305 return false 6306 } 6307 func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { 6308 b := v.Block 6309 _ = b 6310 config := b.Func.Config 6311 _ = config 6312 types := &b.Func.Config.Types 6313 _ = types 6314 // match: (Div32u (Const32 [c]) (Const32 [d])) 6315 // cond: d != 0 6316 // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) 6317 for { 6318 v_0 := v.Args[0] 6319 if v_0.Op != OpConst32 { 6320 break 6321 } 6322 c := v_0.AuxInt 6323 v_1 := v.Args[1] 6324 if v_1.Op != OpConst32 { 6325 break 6326 } 6327 d := v_1.AuxInt 6328 if !(d != 0) { 6329 break 6330 } 6331 v.reset(OpConst32) 6332 v.AuxInt = int64(int32(uint32(c) / uint32(d))) 6333 return true 6334 } 6335 // match: (Div32u n (Const32 [c])) 6336 // cond: isPowerOfTwo(c&0xffffffff) 6337 // result: (Rsh32Ux64 n (Const64 <types.UInt64> [log2(c&0xffffffff)])) 6338 for { 6339 n := v.Args[0] 6340 v_1 := v.Args[1] 6341 if v_1.Op != OpConst32 { 6342 break 6343 } 6344 c := v_1.AuxInt 6345 if !(isPowerOfTwo(c & 0xffffffff)) { 6346 break 6347 } 6348 v.reset(OpRsh32Ux64) 6349 v.AddArg(n) 6350 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6351 v0.AuxInt = log2(c & 0xffffffff) 6352 v.AddArg(v0) 6353 return true 6354 } 6355 // match: (Div32u x (Const32 [c])) 6356 // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 6357 // result: (Rsh32Ux64 <types.UInt32> (Hmul32u <types.UInt32> (Const32 <types.UInt32> [int64(int32(1<<31+umagic(32,c).m/2))]) x) (Const64 <types.UInt64> [umagic(32,c).s-1])) 6358 for { 6359 x := v.Args[0] 6360 v_1 := v.Args[1] 6361 if v_1.Op != OpConst32 { 6362 break 6363 } 6364 c := v_1.AuxInt 6365 if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0) { 6366 break 6367 } 6368 v.reset(OpRsh32Ux64) 6369 v.Type = types.UInt32 6370 v0 := b.NewValue0(v.Pos, OpHmul32u, types.UInt32) 6371 v1 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 6372 v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) 6373 v0.AddArg(v1) 6374 v0.AddArg(x) 6375 v.AddArg(v0) 6376 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6377 v2.AuxInt = umagic(32, c).s - 1 6378 v.AddArg(v2) 6379 return true 6380 } 6381 // match: (Div32u x (Const32 [c])) 6382 // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 6383 // result: (Rsh32Ux64 <types.UInt32> (Hmul32u <types.UInt32> (Const32 <types.UInt32> [int64(int32(1<<31+(umagic(32,c).m+1)/2))]) (Rsh32Ux64 <types.UInt32> x (Const64 <types.UInt64> [1]))) (Const64 <types.UInt64> [umagic(32,c).s-2])) 6384 for { 6385 x := v.Args[0] 6386 v_1 := v.Args[1] 6387 if v_1.Op != OpConst32 { 6388 break 6389 } 6390 c := v_1.AuxInt 6391 if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0) { 6392 break 6393 } 6394 v.reset(OpRsh32Ux64) 6395 v.Type = types.UInt32 6396 v0 := b.NewValue0(v.Pos, OpHmul32u, types.UInt32) 6397 v1 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 6398 v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) 6399 v0.AddArg(v1) 6400 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, types.UInt32) 6401 v2.AddArg(x) 6402 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6403 v3.AuxInt = 1 6404 v2.AddArg(v3) 6405 v0.AddArg(v2) 6406 v.AddArg(v0) 6407 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6408 v4.AuxInt = umagic(32, c).s - 2 6409 v.AddArg(v4) 6410 return true 6411 } 6412 // match: (Div32u x (Const32 [c])) 6413 // cond: umagicOK(32, c) && config.RegSize == 4 6414 // result: (Rsh32Ux64 <types.UInt32> (Avg32u x (Hmul32u <types.UInt32> (Const32 <types.UInt32> [int64(int32(umagic(32,c).m))]) x)) (Const64 <types.UInt64> [umagic(32,c).s-1])) 6415 for { 6416 x := v.Args[0] 6417 v_1 := v.Args[1] 6418 if v_1.Op != OpConst32 { 6419 break 6420 } 6421 c := v_1.AuxInt 6422 if !(umagicOK(32, c) && config.RegSize == 4) { 6423 break 6424 } 6425 v.reset(OpRsh32Ux64) 6426 v.Type = types.UInt32 6427 v0 := b.NewValue0(v.Pos, OpAvg32u, types.UInt32) 6428 v0.AddArg(x) 6429 v1 := b.NewValue0(v.Pos, OpHmul32u, types.UInt32) 6430 v2 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 6431 v2.AuxInt = int64(int32(umagic(32, c).m)) 6432 v1.AddArg(v2) 6433 v1.AddArg(x) 6434 v0.AddArg(v1) 6435 v.AddArg(v0) 6436 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6437 v3.AuxInt = umagic(32, c).s - 1 6438 v.AddArg(v3) 6439 return true 6440 } 6441 // match: (Div32u x (Const32 [c])) 6442 // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 6443 // result: (Trunc64to32 (Rsh64Ux64 <types.UInt64> (Mul64 <types.UInt64> (Const64 <types.UInt64> [int64(1<<31+umagic(32,c).m/2)]) (ZeroExt32to64 x)) (Const64 <types.UInt64> [32+umagic(32,c).s-1]))) 6444 for { 6445 x := v.Args[0] 6446 v_1 := v.Args[1] 6447 if v_1.Op != OpConst32 { 6448 break 6449 } 6450 c := v_1.AuxInt 6451 if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { 6452 break 6453 } 6454 v.reset(OpTrunc64to32) 6455 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, types.UInt64) 6456 v1 := b.NewValue0(v.Pos, OpMul64, types.UInt64) 6457 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6458 v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) 6459 v1.AddArg(v2) 6460 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 6461 v3.AddArg(x) 6462 v1.AddArg(v3) 6463 v0.AddArg(v1) 6464 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6465 v4.AuxInt = 32 + umagic(32, c).s - 1 6466 v0.AddArg(v4) 6467 v.AddArg(v0) 6468 return true 6469 } 6470 // match: (Div32u x (Const32 [c])) 6471 // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 6472 // result: (Trunc64to32 (Rsh64Ux64 <types.UInt64> (Mul64 <types.UInt64> (Const64 <types.UInt64> [int64(1<<31+(umagic(32,c).m+1)/2)]) (Rsh64Ux64 <types.UInt64> (ZeroExt32to64 x) (Const64 <types.UInt64> [1]))) (Const64 <types.UInt64> [32+umagic(32,c).s-2]))) 6473 for { 6474 x := v.Args[0] 6475 v_1 := v.Args[1] 6476 if v_1.Op != OpConst32 { 6477 break 6478 } 6479 c := v_1.AuxInt 6480 if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { 6481 break 6482 } 6483 v.reset(OpTrunc64to32) 6484 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, types.UInt64) 6485 v1 := b.NewValue0(v.Pos, OpMul64, types.UInt64) 6486 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6487 v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) 6488 v1.AddArg(v2) 6489 v3 := b.NewValue0(v.Pos, OpRsh64Ux64, types.UInt64) 6490 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 6491 v4.AddArg(x) 6492 v3.AddArg(v4) 6493 v5 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6494 v5.AuxInt = 1 6495 v3.AddArg(v5) 6496 v1.AddArg(v3) 6497 v0.AddArg(v1) 6498 v6 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6499 v6.AuxInt = 32 + umagic(32, c).s - 2 6500 v0.AddArg(v6) 6501 v.AddArg(v0) 6502 return true 6503 } 6504 // match: (Div32u x (Const32 [c])) 6505 // cond: umagicOK(32, c) && config.RegSize == 8 6506 // result: (Trunc64to32 (Rsh64Ux64 <types.UInt64> (Avg64u (Lsh64x64 <types.UInt64> (ZeroExt32to64 x) (Const64 <types.UInt64> [32])) (Mul64 <types.UInt64> (Const64 <types.UInt32> [int64(umagic(32,c).m)]) (ZeroExt32to64 x))) (Const64 <types.UInt64> [32+umagic(32,c).s-1]))) 6507 for { 6508 x := v.Args[0] 6509 v_1 := v.Args[1] 6510 if v_1.Op != OpConst32 { 6511 break 6512 } 6513 c := v_1.AuxInt 6514 if !(umagicOK(32, c) && config.RegSize == 8) { 6515 break 6516 } 6517 v.reset(OpTrunc64to32) 6518 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, types.UInt64) 6519 v1 := b.NewValue0(v.Pos, OpAvg64u, types.UInt64) 6520 v2 := b.NewValue0(v.Pos, OpLsh64x64, types.UInt64) 6521 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 6522 v3.AddArg(x) 6523 v2.AddArg(v3) 6524 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6525 v4.AuxInt = 32 6526 v2.AddArg(v4) 6527 v1.AddArg(v2) 6528 v5 := b.NewValue0(v.Pos, OpMul64, types.UInt64) 6529 v6 := b.NewValue0(v.Pos, OpConst64, types.UInt32) 6530 v6.AuxInt = int64(umagic(32, c).m) 6531 v5.AddArg(v6) 6532 v7 := b.NewValue0(v.Pos, OpZeroExt32to64, types.UInt64) 6533 v7.AddArg(x) 6534 v5.AddArg(v7) 6535 v1.AddArg(v5) 6536 v0.AddArg(v1) 6537 v8 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6538 v8.AuxInt = 32 + umagic(32, c).s - 1 6539 v0.AddArg(v8) 6540 v.AddArg(v0) 6541 return true 6542 } 6543 return false 6544 } 6545 func rewriteValuegeneric_OpDiv64_0(v *Value) bool { 6546 b := v.Block 6547 _ = b 6548 types := &b.Func.Config.Types 6549 _ = types 6550 // match: (Div64 (Const64 [c]) (Const64 [d])) 6551 // cond: d != 0 6552 // result: (Const64 [c/d]) 6553 for { 6554 v_0 := v.Args[0] 6555 if v_0.Op != OpConst64 { 6556 break 6557 } 6558 c := v_0.AuxInt 6559 v_1 := v.Args[1] 6560 if v_1.Op != OpConst64 { 6561 break 6562 } 6563 d := v_1.AuxInt 6564 if !(d != 0) { 6565 break 6566 } 6567 v.reset(OpConst64) 6568 v.AuxInt = c / d 6569 return true 6570 } 6571 // match: (Div64 <t> n (Const64 [c])) 6572 // cond: c < 0 && c != -1<<63 6573 // result: (Neg64 (Div64 <t> n (Const64 <t> [-c]))) 6574 for { 6575 t := v.Type 6576 n := v.Args[0] 6577 v_1 := v.Args[1] 6578 if v_1.Op != OpConst64 { 6579 break 6580 } 6581 c := v_1.AuxInt 6582 if !(c < 0 && c != -1<<63) { 6583 break 6584 } 6585 v.reset(OpNeg64) 6586 v0 := b.NewValue0(v.Pos, OpDiv64, t) 6587 v0.AddArg(n) 6588 v1 := b.NewValue0(v.Pos, OpConst64, t) 6589 v1.AuxInt = -c 6590 v0.AddArg(v1) 6591 v.AddArg(v0) 6592 return true 6593 } 6594 // match: (Div64 <t> x (Const64 [-1<<63])) 6595 // cond: 6596 // result: (Rsh64Ux64 (And64 <t> x (Neg64 <t> x)) (Const64 <types.UInt64> [63])) 6597 for { 6598 t := v.Type 6599 x := v.Args[0] 6600 v_1 := v.Args[1] 6601 if v_1.Op != OpConst64 { 6602 break 6603 } 6604 if v_1.AuxInt != -1<<63 { 6605 break 6606 } 6607 v.reset(OpRsh64Ux64) 6608 v0 := b.NewValue0(v.Pos, OpAnd64, t) 6609 v0.AddArg(x) 6610 v1 := b.NewValue0(v.Pos, OpNeg64, t) 6611 v1.AddArg(x) 6612 v0.AddArg(v1) 6613 v.AddArg(v0) 6614 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6615 v2.AuxInt = 63 6616 v.AddArg(v2) 6617 return true 6618 } 6619 // match: (Div64 <t> n (Const64 [c])) 6620 // cond: isPowerOfTwo(c) 6621 // result: (Rsh64x64 (Add64 <t> n (Rsh64Ux64 <t> (Rsh64x64 <t> n (Const64 <types.UInt64> [63])) (Const64 <types.UInt64> [64-log2(c)]))) (Const64 <types.UInt64> [log2(c)])) 6622 for { 6623 t := v.Type 6624 n := v.Args[0] 6625 v_1 := v.Args[1] 6626 if v_1.Op != OpConst64 { 6627 break 6628 } 6629 c := v_1.AuxInt 6630 if !(isPowerOfTwo(c)) { 6631 break 6632 } 6633 v.reset(OpRsh64x64) 6634 v0 := b.NewValue0(v.Pos, OpAdd64, t) 6635 v0.AddArg(n) 6636 v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 6637 v2 := b.NewValue0(v.Pos, OpRsh64x64, t) 6638 v2.AddArg(n) 6639 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6640 v3.AuxInt = 63 6641 v2.AddArg(v3) 6642 v1.AddArg(v2) 6643 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6644 v4.AuxInt = 64 - log2(c) 6645 v1.AddArg(v4) 6646 v0.AddArg(v1) 6647 v.AddArg(v0) 6648 v5 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6649 v5.AuxInt = log2(c) 6650 v.AddArg(v5) 6651 return true 6652 } 6653 // match: (Div64 <t> x (Const64 [c])) 6654 // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 6655 // result: (Sub64 <t> (Rsh64x64 <t> (Hmul64 <t> (Const64 <types.UInt64> [int64(smagic(64,c).m/2)]) x) (Const64 <types.UInt64> [smagic(64,c).s-1])) (Rsh64x64 <t> x (Const64 <types.UInt64> [63]))) 6656 for { 6657 t := v.Type 6658 x := v.Args[0] 6659 v_1 := v.Args[1] 6660 if v_1.Op != OpConst64 { 6661 break 6662 } 6663 c := v_1.AuxInt 6664 if !(smagicOK(64, c) && smagic(64, c).m&1 == 0) { 6665 break 6666 } 6667 v.reset(OpSub64) 6668 v.Type = t 6669 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 6670 v1 := b.NewValue0(v.Pos, OpHmul64, t) 6671 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6672 v2.AuxInt = int64(smagic(64, c).m / 2) 6673 v1.AddArg(v2) 6674 v1.AddArg(x) 6675 v0.AddArg(v1) 6676 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6677 v3.AuxInt = smagic(64, c).s - 1 6678 v0.AddArg(v3) 6679 v.AddArg(v0) 6680 v4 := b.NewValue0(v.Pos, OpRsh64x64, t) 6681 v4.AddArg(x) 6682 v5 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6683 v5.AuxInt = 63 6684 v4.AddArg(v5) 6685 v.AddArg(v4) 6686 return true 6687 } 6688 // match: (Div64 <t> x (Const64 [c])) 6689 // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 6690 // result: (Sub64 <t> (Rsh64x64 <t> (Add64 <t> (Hmul64 <t> (Const64 <types.UInt64> [int64(smagic(64,c).m)]) x) x) (Const64 <types.UInt64> [smagic(64,c).s])) (Rsh64x64 <t> x (Const64 <types.UInt64> [63]))) 6691 for { 6692 t := v.Type 6693 x := v.Args[0] 6694 v_1 := v.Args[1] 6695 if v_1.Op != OpConst64 { 6696 break 6697 } 6698 c := v_1.AuxInt 6699 if !(smagicOK(64, c) && smagic(64, c).m&1 != 0) { 6700 break 6701 } 6702 v.reset(OpSub64) 6703 v.Type = t 6704 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 6705 v1 := b.NewValue0(v.Pos, OpAdd64, t) 6706 v2 := b.NewValue0(v.Pos, OpHmul64, t) 6707 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6708 v3.AuxInt = int64(smagic(64, c).m) 6709 v2.AddArg(v3) 6710 v2.AddArg(x) 6711 v1.AddArg(v2) 6712 v1.AddArg(x) 6713 v0.AddArg(v1) 6714 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6715 v4.AuxInt = smagic(64, c).s 6716 v0.AddArg(v4) 6717 v.AddArg(v0) 6718 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 6719 v5.AddArg(x) 6720 v6 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6721 v6.AuxInt = 63 6722 v5.AddArg(v6) 6723 v.AddArg(v5) 6724 return true 6725 } 6726 return false 6727 } 6728 func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { 6729 b := v.Block 6730 _ = b 6731 // match: (Div64F (Const64F [c]) (Const64F [d])) 6732 // cond: 6733 // result: (Const64F [f2i(i2f(c) / i2f(d))]) 6734 for { 6735 v_0 := v.Args[0] 6736 if v_0.Op != OpConst64F { 6737 break 6738 } 6739 c := v_0.AuxInt 6740 v_1 := v.Args[1] 6741 if v_1.Op != OpConst64F { 6742 break 6743 } 6744 d := v_1.AuxInt 6745 v.reset(OpConst64F) 6746 v.AuxInt = f2i(i2f(c) / i2f(d)) 6747 return true 6748 } 6749 // match: (Div64F x (Const64F <t> [c])) 6750 // cond: reciprocalExact64(i2f(c)) 6751 // result: (Mul64F x (Const64F <t> [f2i(1/i2f(c))])) 6752 for { 6753 x := v.Args[0] 6754 v_1 := v.Args[1] 6755 if v_1.Op != OpConst64F { 6756 break 6757 } 6758 t := v_1.Type 6759 c := v_1.AuxInt 6760 if !(reciprocalExact64(i2f(c))) { 6761 break 6762 } 6763 v.reset(OpMul64F) 6764 v.AddArg(x) 6765 v0 := b.NewValue0(v.Pos, OpConst64F, t) 6766 v0.AuxInt = f2i(1 / i2f(c)) 6767 v.AddArg(v0) 6768 return true 6769 } 6770 return false 6771 } 6772 func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { 6773 b := v.Block 6774 _ = b 6775 config := b.Func.Config 6776 _ = config 6777 types := &b.Func.Config.Types 6778 _ = types 6779 // match: (Div64u (Const64 [c]) (Const64 [d])) 6780 // cond: d != 0 6781 // result: (Const64 [int64(uint64(c)/uint64(d))]) 6782 for { 6783 v_0 := v.Args[0] 6784 if v_0.Op != OpConst64 { 6785 break 6786 } 6787 c := v_0.AuxInt 6788 v_1 := v.Args[1] 6789 if v_1.Op != OpConst64 { 6790 break 6791 } 6792 d := v_1.AuxInt 6793 if !(d != 0) { 6794 break 6795 } 6796 v.reset(OpConst64) 6797 v.AuxInt = int64(uint64(c) / uint64(d)) 6798 return true 6799 } 6800 // match: (Div64u n (Const64 [c])) 6801 // cond: isPowerOfTwo(c) 6802 // result: (Rsh64Ux64 n (Const64 <types.UInt64> [log2(c)])) 6803 for { 6804 n := v.Args[0] 6805 v_1 := v.Args[1] 6806 if v_1.Op != OpConst64 { 6807 break 6808 } 6809 c := v_1.AuxInt 6810 if !(isPowerOfTwo(c)) { 6811 break 6812 } 6813 v.reset(OpRsh64Ux64) 6814 v.AddArg(n) 6815 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6816 v0.AuxInt = log2(c) 6817 v.AddArg(v0) 6818 return true 6819 } 6820 // match: (Div64u x (Const64 [c])) 6821 // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 6822 // result: (Rsh64Ux64 <types.UInt64> (Hmul64u <types.UInt64> (Const64 <types.UInt64> [int64(1<<63+umagic(64,c).m/2)]) x) (Const64 <types.UInt64> [umagic(64,c).s-1])) 6823 for { 6824 x := v.Args[0] 6825 v_1 := v.Args[1] 6826 if v_1.Op != OpConst64 { 6827 break 6828 } 6829 c := v_1.AuxInt 6830 if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) { 6831 break 6832 } 6833 v.reset(OpRsh64Ux64) 6834 v.Type = types.UInt64 6835 v0 := b.NewValue0(v.Pos, OpHmul64u, types.UInt64) 6836 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6837 v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) 6838 v0.AddArg(v1) 6839 v0.AddArg(x) 6840 v.AddArg(v0) 6841 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6842 v2.AuxInt = umagic(64, c).s - 1 6843 v.AddArg(v2) 6844 return true 6845 } 6846 // match: (Div64u x (Const64 [c])) 6847 // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 6848 // result: (Rsh64Ux64 <types.UInt64> (Hmul64u <types.UInt64> (Const64 <types.UInt64> [int64(1<<63+(umagic(64,c).m+1)/2)]) (Rsh64Ux64 <types.UInt64> x (Const64 <types.UInt64> [1]))) (Const64 <types.UInt64> [umagic(64,c).s-2])) 6849 for { 6850 x := v.Args[0] 6851 v_1 := v.Args[1] 6852 if v_1.Op != OpConst64 { 6853 break 6854 } 6855 c := v_1.AuxInt 6856 if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) { 6857 break 6858 } 6859 v.reset(OpRsh64Ux64) 6860 v.Type = types.UInt64 6861 v0 := b.NewValue0(v.Pos, OpHmul64u, types.UInt64) 6862 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6863 v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) 6864 v0.AddArg(v1) 6865 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, types.UInt64) 6866 v2.AddArg(x) 6867 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6868 v3.AuxInt = 1 6869 v2.AddArg(v3) 6870 v0.AddArg(v2) 6871 v.AddArg(v0) 6872 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6873 v4.AuxInt = umagic(64, c).s - 2 6874 v.AddArg(v4) 6875 return true 6876 } 6877 // match: (Div64u x (Const64 [c])) 6878 // cond: umagicOK(64, c) && config.RegSize == 8 6879 // result: (Rsh64Ux64 <types.UInt64> (Avg64u x (Hmul64u <types.UInt64> (Const64 <types.UInt64> [int64(umagic(64,c).m)]) x)) (Const64 <types.UInt64> [umagic(64,c).s-1])) 6880 for { 6881 x := v.Args[0] 6882 v_1 := v.Args[1] 6883 if v_1.Op != OpConst64 { 6884 break 6885 } 6886 c := v_1.AuxInt 6887 if !(umagicOK(64, c) && config.RegSize == 8) { 6888 break 6889 } 6890 v.reset(OpRsh64Ux64) 6891 v.Type = types.UInt64 6892 v0 := b.NewValue0(v.Pos, OpAvg64u, types.UInt64) 6893 v0.AddArg(x) 6894 v1 := b.NewValue0(v.Pos, OpHmul64u, types.UInt64) 6895 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6896 v2.AuxInt = int64(umagic(64, c).m) 6897 v1.AddArg(v2) 6898 v1.AddArg(x) 6899 v0.AddArg(v1) 6900 v.AddArg(v0) 6901 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6902 v3.AuxInt = umagic(64, c).s - 1 6903 v.AddArg(v3) 6904 return true 6905 } 6906 return false 6907 } 6908 func rewriteValuegeneric_OpDiv8_0(v *Value) bool { 6909 b := v.Block 6910 _ = b 6911 types := &b.Func.Config.Types 6912 _ = types 6913 // match: (Div8 (Const8 [c]) (Const8 [d])) 6914 // cond: d != 0 6915 // result: (Const8 [int64(int8(c)/int8(d))]) 6916 for { 6917 v_0 := v.Args[0] 6918 if v_0.Op != OpConst8 { 6919 break 6920 } 6921 c := v_0.AuxInt 6922 v_1 := v.Args[1] 6923 if v_1.Op != OpConst8 { 6924 break 6925 } 6926 d := v_1.AuxInt 6927 if !(d != 0) { 6928 break 6929 } 6930 v.reset(OpConst8) 6931 v.AuxInt = int64(int8(c) / int8(d)) 6932 return true 6933 } 6934 // match: (Div8 <t> n (Const8 [c])) 6935 // cond: c < 0 && c != -1<<7 6936 // result: (Neg8 (Div8 <t> n (Const8 <t> [-c]))) 6937 for { 6938 t := v.Type 6939 n := v.Args[0] 6940 v_1 := v.Args[1] 6941 if v_1.Op != OpConst8 { 6942 break 6943 } 6944 c := v_1.AuxInt 6945 if !(c < 0 && c != -1<<7) { 6946 break 6947 } 6948 v.reset(OpNeg8) 6949 v0 := b.NewValue0(v.Pos, OpDiv8, t) 6950 v0.AddArg(n) 6951 v1 := b.NewValue0(v.Pos, OpConst8, t) 6952 v1.AuxInt = -c 6953 v0.AddArg(v1) 6954 v.AddArg(v0) 6955 return true 6956 } 6957 // match: (Div8 <t> x (Const8 [-1<<7 ])) 6958 // cond: 6959 // result: (Rsh8Ux64 (And8 <t> x (Neg8 <t> x)) (Const64 <types.UInt64> [7 ])) 6960 for { 6961 t := v.Type 6962 x := v.Args[0] 6963 v_1 := v.Args[1] 6964 if v_1.Op != OpConst8 { 6965 break 6966 } 6967 if v_1.AuxInt != -1<<7 { 6968 break 6969 } 6970 v.reset(OpRsh8Ux64) 6971 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6972 v0.AddArg(x) 6973 v1 := b.NewValue0(v.Pos, OpNeg8, t) 6974 v1.AddArg(x) 6975 v0.AddArg(v1) 6976 v.AddArg(v0) 6977 v2 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 6978 v2.AuxInt = 7 6979 v.AddArg(v2) 6980 return true 6981 } 6982 // match: (Div8 <t> n (Const8 [c])) 6983 // cond: isPowerOfTwo(c) 6984 // result: (Rsh8x64 (Add8 <t> n (Rsh8Ux64 <t> (Rsh8x64 <t> n (Const64 <types.UInt64> [ 7])) (Const64 <types.UInt64> [ 8-log2(c)]))) (Const64 <types.UInt64> [log2(c)])) 6985 for { 6986 t := v.Type 6987 n := v.Args[0] 6988 v_1 := v.Args[1] 6989 if v_1.Op != OpConst8 { 6990 break 6991 } 6992 c := v_1.AuxInt 6993 if !(isPowerOfTwo(c)) { 6994 break 6995 } 6996 v.reset(OpRsh8x64) 6997 v0 := b.NewValue0(v.Pos, OpAdd8, t) 6998 v0.AddArg(n) 6999 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) 7000 v2 := b.NewValue0(v.Pos, OpRsh8x64, t) 7001 v2.AddArg(n) 7002 v3 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 7003 v3.AuxInt = 7 7004 v2.AddArg(v3) 7005 v1.AddArg(v2) 7006 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 7007 v4.AuxInt = 8 - log2(c) 7008 v1.AddArg(v4) 7009 v0.AddArg(v1) 7010 v.AddArg(v0) 7011 v5 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 7012 v5.AuxInt = log2(c) 7013 v.AddArg(v5) 7014 return true 7015 } 7016 // match: (Div8 <t> x (Const8 [c])) 7017 // cond: smagicOK(8,c) 7018 // result: (Sub8 <t> (Rsh32x64 <t> (Mul32 <types.UInt32> (Const32 <types.UInt32> [int64(smagic(8,c).m)]) (SignExt8to32 x)) (Const64 <types.UInt64> [8+smagic(8,c).s])) (Rsh32x64 <t> (SignExt8to32 x) (Const64 <types.UInt64> [31]))) 7019 for { 7020 t := v.Type 7021 x := v.Args[0] 7022 v_1 := v.Args[1] 7023 if v_1.Op != OpConst8 { 7024 break 7025 } 7026 c := v_1.AuxInt 7027 if !(smagicOK(8, c)) { 7028 break 7029 } 7030 v.reset(OpSub8) 7031 v.Type = t 7032 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7033 v1 := b.NewValue0(v.Pos, OpMul32, types.UInt32) 7034 v2 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 7035 v2.AuxInt = int64(smagic(8, c).m) 7036 v1.AddArg(v2) 7037 v3 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 7038 v3.AddArg(x) 7039 v1.AddArg(v3) 7040 v0.AddArg(v1) 7041 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 7042 v4.AuxInt = 8 + smagic(8, c).s 7043 v0.AddArg(v4) 7044 v.AddArg(v0) 7045 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7046 v6 := b.NewValue0(v.Pos, OpSignExt8to32, types.Int32) 7047 v6.AddArg(x) 7048 v5.AddArg(v6) 7049 v7 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 7050 v7.AuxInt = 31 7051 v5.AddArg(v7) 7052 v.AddArg(v5) 7053 return true 7054 } 7055 return false 7056 } 7057 func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { 7058 b := v.Block 7059 _ = b 7060 types := &b.Func.Config.Types 7061 _ = types 7062 // match: (Div8u (Const8 [c]) (Const8 [d])) 7063 // cond: d != 0 7064 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) 7065 for { 7066 v_0 := v.Args[0] 7067 if v_0.Op != OpConst8 { 7068 break 7069 } 7070 c := v_0.AuxInt 7071 v_1 := v.Args[1] 7072 if v_1.Op != OpConst8 { 7073 break 7074 } 7075 d := v_1.AuxInt 7076 if !(d != 0) { 7077 break 7078 } 7079 v.reset(OpConst8) 7080 v.AuxInt = int64(int8(uint8(c) / uint8(d))) 7081 return true 7082 } 7083 // match: (Div8u n (Const8 [c])) 7084 // cond: isPowerOfTwo(c&0xff) 7085 // result: (Rsh8Ux64 n (Const64 <types.UInt64> [log2(c&0xff)])) 7086 for { 7087 n := v.Args[0] 7088 v_1 := v.Args[1] 7089 if v_1.Op != OpConst8 { 7090 break 7091 } 7092 c := v_1.AuxInt 7093 if !(isPowerOfTwo(c & 0xff)) { 7094 break 7095 } 7096 v.reset(OpRsh8Ux64) 7097 v.AddArg(n) 7098 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 7099 v0.AuxInt = log2(c & 0xff) 7100 v.AddArg(v0) 7101 return true 7102 } 7103 // match: (Div8u x (Const8 [c])) 7104 // cond: umagicOK(8, c) 7105 // result: (Trunc32to8 (Rsh32Ux64 <types.UInt32> (Mul32 <types.UInt32> (Const32 <types.UInt32> [int64(1<<8+umagic(8,c).m)]) (ZeroExt8to32 x)) (Const64 <types.UInt64> [8+umagic(8,c).s]))) 7106 for { 7107 x := v.Args[0] 7108 v_1 := v.Args[1] 7109 if v_1.Op != OpConst8 { 7110 break 7111 } 7112 c := v_1.AuxInt 7113 if !(umagicOK(8, c)) { 7114 break 7115 } 7116 v.reset(OpTrunc32to8) 7117 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, types.UInt32) 7118 v1 := b.NewValue0(v.Pos, OpMul32, types.UInt32) 7119 v2 := b.NewValue0(v.Pos, OpConst32, types.UInt32) 7120 v2.AuxInt = int64(1<<8 + umagic(8, c).m) 7121 v1.AddArg(v2) 7122 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, types.UInt32) 7123 v3.AddArg(x) 7124 v1.AddArg(v3) 7125 v0.AddArg(v1) 7126 v4 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 7127 v4.AuxInt = 8 + umagic(8, c).s 7128 v0.AddArg(v4) 7129 v.AddArg(v0) 7130 return true 7131 } 7132 return false 7133 } 7134 func rewriteValuegeneric_OpEq16_0(v *Value) bool { 7135 b := v.Block 7136 _ = b 7137 // match: (Eq16 x x) 7138 // cond: 7139 // result: (ConstBool [1]) 7140 for { 7141 x := v.Args[0] 7142 if x != v.Args[1] { 7143 break 7144 } 7145 v.reset(OpConstBool) 7146 v.AuxInt = 1 7147 return true 7148 } 7149 // match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 7150 // cond: 7151 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7152 for { 7153 v_0 := v.Args[0] 7154 if v_0.Op != OpConst16 { 7155 break 7156 } 7157 t := v_0.Type 7158 c := v_0.AuxInt 7159 v_1 := v.Args[1] 7160 if v_1.Op != OpAdd16 { 7161 break 7162 } 7163 v_1_0 := v_1.Args[0] 7164 if v_1_0.Op != OpConst16 { 7165 break 7166 } 7167 if v_1_0.Type != t { 7168 break 7169 } 7170 d := v_1_0.AuxInt 7171 x := v_1.Args[1] 7172 v.reset(OpEq16) 7173 v0 := b.NewValue0(v.Pos, OpConst16, t) 7174 v0.AuxInt = int64(int16(c - d)) 7175 v.AddArg(v0) 7176 v.AddArg(x) 7177 return true 7178 } 7179 // match: (Eq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 7180 // cond: 7181 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7182 for { 7183 v_0 := v.Args[0] 7184 if v_0.Op != OpConst16 { 7185 break 7186 } 7187 t := v_0.Type 7188 c := v_0.AuxInt 7189 v_1 := v.Args[1] 7190 if v_1.Op != OpAdd16 { 7191 break 7192 } 7193 x := v_1.Args[0] 7194 v_1_1 := v_1.Args[1] 7195 if v_1_1.Op != OpConst16 { 7196 break 7197 } 7198 if v_1_1.Type != t { 7199 break 7200 } 7201 d := v_1_1.AuxInt 7202 v.reset(OpEq16) 7203 v0 := b.NewValue0(v.Pos, OpConst16, t) 7204 v0.AuxInt = int64(int16(c - d)) 7205 v.AddArg(v0) 7206 v.AddArg(x) 7207 return true 7208 } 7209 // match: (Eq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 7210 // cond: 7211 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7212 for { 7213 v_0 := v.Args[0] 7214 if v_0.Op != OpAdd16 { 7215 break 7216 } 7217 v_0_0 := v_0.Args[0] 7218 if v_0_0.Op != OpConst16 { 7219 break 7220 } 7221 t := v_0_0.Type 7222 d := v_0_0.AuxInt 7223 x := v_0.Args[1] 7224 v_1 := v.Args[1] 7225 if v_1.Op != OpConst16 { 7226 break 7227 } 7228 if v_1.Type != t { 7229 break 7230 } 7231 c := v_1.AuxInt 7232 v.reset(OpEq16) 7233 v0 := b.NewValue0(v.Pos, OpConst16, t) 7234 v0.AuxInt = int64(int16(c - d)) 7235 v.AddArg(v0) 7236 v.AddArg(x) 7237 return true 7238 } 7239 // match: (Eq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 7240 // cond: 7241 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7242 for { 7243 v_0 := v.Args[0] 7244 if v_0.Op != OpAdd16 { 7245 break 7246 } 7247 x := v_0.Args[0] 7248 v_0_1 := v_0.Args[1] 7249 if v_0_1.Op != OpConst16 { 7250 break 7251 } 7252 t := v_0_1.Type 7253 d := v_0_1.AuxInt 7254 v_1 := v.Args[1] 7255 if v_1.Op != OpConst16 { 7256 break 7257 } 7258 if v_1.Type != t { 7259 break 7260 } 7261 c := v_1.AuxInt 7262 v.reset(OpEq16) 7263 v0 := b.NewValue0(v.Pos, OpConst16, t) 7264 v0.AuxInt = int64(int16(c - d)) 7265 v.AddArg(v0) 7266 v.AddArg(x) 7267 return true 7268 } 7269 // match: (Eq16 (Const16 [c]) (Const16 [d])) 7270 // cond: 7271 // result: (ConstBool [b2i(c == d)]) 7272 for { 7273 v_0 := v.Args[0] 7274 if v_0.Op != OpConst16 { 7275 break 7276 } 7277 c := v_0.AuxInt 7278 v_1 := v.Args[1] 7279 if v_1.Op != OpConst16 { 7280 break 7281 } 7282 d := v_1.AuxInt 7283 v.reset(OpConstBool) 7284 v.AuxInt = b2i(c == d) 7285 return true 7286 } 7287 // match: (Eq16 (Const16 [d]) (Const16 [c])) 7288 // cond: 7289 // result: (ConstBool [b2i(c == d)]) 7290 for { 7291 v_0 := v.Args[0] 7292 if v_0.Op != OpConst16 { 7293 break 7294 } 7295 d := v_0.AuxInt 7296 v_1 := v.Args[1] 7297 if v_1.Op != OpConst16 { 7298 break 7299 } 7300 c := v_1.AuxInt 7301 v.reset(OpConstBool) 7302 v.AuxInt = b2i(c == d) 7303 return true 7304 } 7305 return false 7306 } 7307 func rewriteValuegeneric_OpEq32_0(v *Value) bool { 7308 b := v.Block 7309 _ = b 7310 // match: (Eq32 x x) 7311 // cond: 7312 // result: (ConstBool [1]) 7313 for { 7314 x := v.Args[0] 7315 if x != v.Args[1] { 7316 break 7317 } 7318 v.reset(OpConstBool) 7319 v.AuxInt = 1 7320 return true 7321 } 7322 // match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 7323 // cond: 7324 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7325 for { 7326 v_0 := v.Args[0] 7327 if v_0.Op != OpConst32 { 7328 break 7329 } 7330 t := v_0.Type 7331 c := v_0.AuxInt 7332 v_1 := v.Args[1] 7333 if v_1.Op != OpAdd32 { 7334 break 7335 } 7336 v_1_0 := v_1.Args[0] 7337 if v_1_0.Op != OpConst32 { 7338 break 7339 } 7340 if v_1_0.Type != t { 7341 break 7342 } 7343 d := v_1_0.AuxInt 7344 x := v_1.Args[1] 7345 v.reset(OpEq32) 7346 v0 := b.NewValue0(v.Pos, OpConst32, t) 7347 v0.AuxInt = int64(int32(c - d)) 7348 v.AddArg(v0) 7349 v.AddArg(x) 7350 return true 7351 } 7352 // match: (Eq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 7353 // cond: 7354 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7355 for { 7356 v_0 := v.Args[0] 7357 if v_0.Op != OpConst32 { 7358 break 7359 } 7360 t := v_0.Type 7361 c := v_0.AuxInt 7362 v_1 := v.Args[1] 7363 if v_1.Op != OpAdd32 { 7364 break 7365 } 7366 x := v_1.Args[0] 7367 v_1_1 := v_1.Args[1] 7368 if v_1_1.Op != OpConst32 { 7369 break 7370 } 7371 if v_1_1.Type != t { 7372 break 7373 } 7374 d := v_1_1.AuxInt 7375 v.reset(OpEq32) 7376 v0 := b.NewValue0(v.Pos, OpConst32, t) 7377 v0.AuxInt = int64(int32(c - d)) 7378 v.AddArg(v0) 7379 v.AddArg(x) 7380 return true 7381 } 7382 // match: (Eq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 7383 // cond: 7384 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7385 for { 7386 v_0 := v.Args[0] 7387 if v_0.Op != OpAdd32 { 7388 break 7389 } 7390 v_0_0 := v_0.Args[0] 7391 if v_0_0.Op != OpConst32 { 7392 break 7393 } 7394 t := v_0_0.Type 7395 d := v_0_0.AuxInt 7396 x := v_0.Args[1] 7397 v_1 := v.Args[1] 7398 if v_1.Op != OpConst32 { 7399 break 7400 } 7401 if v_1.Type != t { 7402 break 7403 } 7404 c := v_1.AuxInt 7405 v.reset(OpEq32) 7406 v0 := b.NewValue0(v.Pos, OpConst32, t) 7407 v0.AuxInt = int64(int32(c - d)) 7408 v.AddArg(v0) 7409 v.AddArg(x) 7410 return true 7411 } 7412 // match: (Eq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 7413 // cond: 7414 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7415 for { 7416 v_0 := v.Args[0] 7417 if v_0.Op != OpAdd32 { 7418 break 7419 } 7420 x := v_0.Args[0] 7421 v_0_1 := v_0.Args[1] 7422 if v_0_1.Op != OpConst32 { 7423 break 7424 } 7425 t := v_0_1.Type 7426 d := v_0_1.AuxInt 7427 v_1 := v.Args[1] 7428 if v_1.Op != OpConst32 { 7429 break 7430 } 7431 if v_1.Type != t { 7432 break 7433 } 7434 c := v_1.AuxInt 7435 v.reset(OpEq32) 7436 v0 := b.NewValue0(v.Pos, OpConst32, t) 7437 v0.AuxInt = int64(int32(c - d)) 7438 v.AddArg(v0) 7439 v.AddArg(x) 7440 return true 7441 } 7442 // match: (Eq32 (Const32 [c]) (Const32 [d])) 7443 // cond: 7444 // result: (ConstBool [b2i(c == d)]) 7445 for { 7446 v_0 := v.Args[0] 7447 if v_0.Op != OpConst32 { 7448 break 7449 } 7450 c := v_0.AuxInt 7451 v_1 := v.Args[1] 7452 if v_1.Op != OpConst32 { 7453 break 7454 } 7455 d := v_1.AuxInt 7456 v.reset(OpConstBool) 7457 v.AuxInt = b2i(c == d) 7458 return true 7459 } 7460 // match: (Eq32 (Const32 [d]) (Const32 [c])) 7461 // cond: 7462 // result: (ConstBool [b2i(c == d)]) 7463 for { 7464 v_0 := v.Args[0] 7465 if v_0.Op != OpConst32 { 7466 break 7467 } 7468 d := v_0.AuxInt 7469 v_1 := v.Args[1] 7470 if v_1.Op != OpConst32 { 7471 break 7472 } 7473 c := v_1.AuxInt 7474 v.reset(OpConstBool) 7475 v.AuxInt = b2i(c == d) 7476 return true 7477 } 7478 return false 7479 } 7480 func rewriteValuegeneric_OpEq64_0(v *Value) bool { 7481 b := v.Block 7482 _ = b 7483 // match: (Eq64 x x) 7484 // cond: 7485 // result: (ConstBool [1]) 7486 for { 7487 x := v.Args[0] 7488 if x != v.Args[1] { 7489 break 7490 } 7491 v.reset(OpConstBool) 7492 v.AuxInt = 1 7493 return true 7494 } 7495 // match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 7496 // cond: 7497 // result: (Eq64 (Const64 <t> [c-d]) x) 7498 for { 7499 v_0 := v.Args[0] 7500 if v_0.Op != OpConst64 { 7501 break 7502 } 7503 t := v_0.Type 7504 c := v_0.AuxInt 7505 v_1 := v.Args[1] 7506 if v_1.Op != OpAdd64 { 7507 break 7508 } 7509 v_1_0 := v_1.Args[0] 7510 if v_1_0.Op != OpConst64 { 7511 break 7512 } 7513 if v_1_0.Type != t { 7514 break 7515 } 7516 d := v_1_0.AuxInt 7517 x := v_1.Args[1] 7518 v.reset(OpEq64) 7519 v0 := b.NewValue0(v.Pos, OpConst64, t) 7520 v0.AuxInt = c - d 7521 v.AddArg(v0) 7522 v.AddArg(x) 7523 return true 7524 } 7525 // match: (Eq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 7526 // cond: 7527 // result: (Eq64 (Const64 <t> [c-d]) x) 7528 for { 7529 v_0 := v.Args[0] 7530 if v_0.Op != OpConst64 { 7531 break 7532 } 7533 t := v_0.Type 7534 c := v_0.AuxInt 7535 v_1 := v.Args[1] 7536 if v_1.Op != OpAdd64 { 7537 break 7538 } 7539 x := v_1.Args[0] 7540 v_1_1 := v_1.Args[1] 7541 if v_1_1.Op != OpConst64 { 7542 break 7543 } 7544 if v_1_1.Type != t { 7545 break 7546 } 7547 d := v_1_1.AuxInt 7548 v.reset(OpEq64) 7549 v0 := b.NewValue0(v.Pos, OpConst64, t) 7550 v0.AuxInt = c - d 7551 v.AddArg(v0) 7552 v.AddArg(x) 7553 return true 7554 } 7555 // match: (Eq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 7556 // cond: 7557 // result: (Eq64 (Const64 <t> [c-d]) x) 7558 for { 7559 v_0 := v.Args[0] 7560 if v_0.Op != OpAdd64 { 7561 break 7562 } 7563 v_0_0 := v_0.Args[0] 7564 if v_0_0.Op != OpConst64 { 7565 break 7566 } 7567 t := v_0_0.Type 7568 d := v_0_0.AuxInt 7569 x := v_0.Args[1] 7570 v_1 := v.Args[1] 7571 if v_1.Op != OpConst64 { 7572 break 7573 } 7574 if v_1.Type != t { 7575 break 7576 } 7577 c := v_1.AuxInt 7578 v.reset(OpEq64) 7579 v0 := b.NewValue0(v.Pos, OpConst64, t) 7580 v0.AuxInt = c - d 7581 v.AddArg(v0) 7582 v.AddArg(x) 7583 return true 7584 } 7585 // match: (Eq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 7586 // cond: 7587 // result: (Eq64 (Const64 <t> [c-d]) x) 7588 for { 7589 v_0 := v.Args[0] 7590 if v_0.Op != OpAdd64 { 7591 break 7592 } 7593 x := v_0.Args[0] 7594 v_0_1 := v_0.Args[1] 7595 if v_0_1.Op != OpConst64 { 7596 break 7597 } 7598 t := v_0_1.Type 7599 d := v_0_1.AuxInt 7600 v_1 := v.Args[1] 7601 if v_1.Op != OpConst64 { 7602 break 7603 } 7604 if v_1.Type != t { 7605 break 7606 } 7607 c := v_1.AuxInt 7608 v.reset(OpEq64) 7609 v0 := b.NewValue0(v.Pos, OpConst64, t) 7610 v0.AuxInt = c - d 7611 v.AddArg(v0) 7612 v.AddArg(x) 7613 return true 7614 } 7615 // match: (Eq64 (Const64 [c]) (Const64 [d])) 7616 // cond: 7617 // result: (ConstBool [b2i(c == d)]) 7618 for { 7619 v_0 := v.Args[0] 7620 if v_0.Op != OpConst64 { 7621 break 7622 } 7623 c := v_0.AuxInt 7624 v_1 := v.Args[1] 7625 if v_1.Op != OpConst64 { 7626 break 7627 } 7628 d := v_1.AuxInt 7629 v.reset(OpConstBool) 7630 v.AuxInt = b2i(c == d) 7631 return true 7632 } 7633 // match: (Eq64 (Const64 [d]) (Const64 [c])) 7634 // cond: 7635 // result: (ConstBool [b2i(c == d)]) 7636 for { 7637 v_0 := v.Args[0] 7638 if v_0.Op != OpConst64 { 7639 break 7640 } 7641 d := v_0.AuxInt 7642 v_1 := v.Args[1] 7643 if v_1.Op != OpConst64 { 7644 break 7645 } 7646 c := v_1.AuxInt 7647 v.reset(OpConstBool) 7648 v.AuxInt = b2i(c == d) 7649 return true 7650 } 7651 return false 7652 } 7653 func rewriteValuegeneric_OpEq8_0(v *Value) bool { 7654 b := v.Block 7655 _ = b 7656 // match: (Eq8 x x) 7657 // cond: 7658 // result: (ConstBool [1]) 7659 for { 7660 x := v.Args[0] 7661 if x != v.Args[1] { 7662 break 7663 } 7664 v.reset(OpConstBool) 7665 v.AuxInt = 1 7666 return true 7667 } 7668 // match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 7669 // cond: 7670 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 7671 for { 7672 v_0 := v.Args[0] 7673 if v_0.Op != OpConst8 { 7674 break 7675 } 7676 t := v_0.Type 7677 c := v_0.AuxInt 7678 v_1 := v.Args[1] 7679 if v_1.Op != OpAdd8 { 7680 break 7681 } 7682 v_1_0 := v_1.Args[0] 7683 if v_1_0.Op != OpConst8 { 7684 break 7685 } 7686 if v_1_0.Type != t { 7687 break 7688 } 7689 d := v_1_0.AuxInt 7690 x := v_1.Args[1] 7691 v.reset(OpEq8) 7692 v0 := b.NewValue0(v.Pos, OpConst8, t) 7693 v0.AuxInt = int64(int8(c - d)) 7694 v.AddArg(v0) 7695 v.AddArg(x) 7696 return true 7697 } 7698 // match: (Eq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 7699 // cond: 7700 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 7701 for { 7702 v_0 := v.Args[0] 7703 if v_0.Op != OpConst8 { 7704 break 7705 } 7706 t := v_0.Type 7707 c := v_0.AuxInt 7708 v_1 := v.Args[1] 7709 if v_1.Op != OpAdd8 { 7710 break 7711 } 7712 x := v_1.Args[0] 7713 v_1_1 := v_1.Args[1] 7714 if v_1_1.Op != OpConst8 { 7715 break 7716 } 7717 if v_1_1.Type != t { 7718 break 7719 } 7720 d := v_1_1.AuxInt 7721 v.reset(OpEq8) 7722 v0 := b.NewValue0(v.Pos, OpConst8, t) 7723 v0.AuxInt = int64(int8(c - d)) 7724 v.AddArg(v0) 7725 v.AddArg(x) 7726 return true 7727 } 7728 // match: (Eq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 7729 // cond: 7730 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 7731 for { 7732 v_0 := v.Args[0] 7733 if v_0.Op != OpAdd8 { 7734 break 7735 } 7736 v_0_0 := v_0.Args[0] 7737 if v_0_0.Op != OpConst8 { 7738 break 7739 } 7740 t := v_0_0.Type 7741 d := v_0_0.AuxInt 7742 x := v_0.Args[1] 7743 v_1 := v.Args[1] 7744 if v_1.Op != OpConst8 { 7745 break 7746 } 7747 if v_1.Type != t { 7748 break 7749 } 7750 c := v_1.AuxInt 7751 v.reset(OpEq8) 7752 v0 := b.NewValue0(v.Pos, OpConst8, t) 7753 v0.AuxInt = int64(int8(c - d)) 7754 v.AddArg(v0) 7755 v.AddArg(x) 7756 return true 7757 } 7758 // match: (Eq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 7759 // cond: 7760 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 7761 for { 7762 v_0 := v.Args[0] 7763 if v_0.Op != OpAdd8 { 7764 break 7765 } 7766 x := v_0.Args[0] 7767 v_0_1 := v_0.Args[1] 7768 if v_0_1.Op != OpConst8 { 7769 break 7770 } 7771 t := v_0_1.Type 7772 d := v_0_1.AuxInt 7773 v_1 := v.Args[1] 7774 if v_1.Op != OpConst8 { 7775 break 7776 } 7777 if v_1.Type != t { 7778 break 7779 } 7780 c := v_1.AuxInt 7781 v.reset(OpEq8) 7782 v0 := b.NewValue0(v.Pos, OpConst8, t) 7783 v0.AuxInt = int64(int8(c - d)) 7784 v.AddArg(v0) 7785 v.AddArg(x) 7786 return true 7787 } 7788 // match: (Eq8 (Const8 [c]) (Const8 [d])) 7789 // cond: 7790 // result: (ConstBool [b2i(c == d)]) 7791 for { 7792 v_0 := v.Args[0] 7793 if v_0.Op != OpConst8 { 7794 break 7795 } 7796 c := v_0.AuxInt 7797 v_1 := v.Args[1] 7798 if v_1.Op != OpConst8 { 7799 break 7800 } 7801 d := v_1.AuxInt 7802 v.reset(OpConstBool) 7803 v.AuxInt = b2i(c == d) 7804 return true 7805 } 7806 // match: (Eq8 (Const8 [d]) (Const8 [c])) 7807 // cond: 7808 // result: (ConstBool [b2i(c == d)]) 7809 for { 7810 v_0 := v.Args[0] 7811 if v_0.Op != OpConst8 { 7812 break 7813 } 7814 d := v_0.AuxInt 7815 v_1 := v.Args[1] 7816 if v_1.Op != OpConst8 { 7817 break 7818 } 7819 c := v_1.AuxInt 7820 v.reset(OpConstBool) 7821 v.AuxInt = b2i(c == d) 7822 return true 7823 } 7824 return false 7825 } 7826 func rewriteValuegeneric_OpEqB_0(v *Value) bool { 7827 // match: (EqB (ConstBool [c]) (ConstBool [d])) 7828 // cond: 7829 // result: (ConstBool [b2i(c == d)]) 7830 for { 7831 v_0 := v.Args[0] 7832 if v_0.Op != OpConstBool { 7833 break 7834 } 7835 c := v_0.AuxInt 7836 v_1 := v.Args[1] 7837 if v_1.Op != OpConstBool { 7838 break 7839 } 7840 d := v_1.AuxInt 7841 v.reset(OpConstBool) 7842 v.AuxInt = b2i(c == d) 7843 return true 7844 } 7845 // match: (EqB (ConstBool [0]) x) 7846 // cond: 7847 // result: (Not x) 7848 for { 7849 v_0 := v.Args[0] 7850 if v_0.Op != OpConstBool { 7851 break 7852 } 7853 if v_0.AuxInt != 0 { 7854 break 7855 } 7856 x := v.Args[1] 7857 v.reset(OpNot) 7858 v.AddArg(x) 7859 return true 7860 } 7861 // match: (EqB (ConstBool [1]) x) 7862 // cond: 7863 // result: x 7864 for { 7865 v_0 := v.Args[0] 7866 if v_0.Op != OpConstBool { 7867 break 7868 } 7869 if v_0.AuxInt != 1 { 7870 break 7871 } 7872 x := v.Args[1] 7873 v.reset(OpCopy) 7874 v.Type = x.Type 7875 v.AddArg(x) 7876 return true 7877 } 7878 return false 7879 } 7880 func rewriteValuegeneric_OpEqInter_0(v *Value) bool { 7881 b := v.Block 7882 _ = b 7883 types := &b.Func.Config.Types 7884 _ = types 7885 // match: (EqInter x y) 7886 // cond: 7887 // result: (EqPtr (ITab x) (ITab y)) 7888 for { 7889 x := v.Args[0] 7890 y := v.Args[1] 7891 v.reset(OpEqPtr) 7892 v0 := b.NewValue0(v.Pos, OpITab, types.BytePtr) 7893 v0.AddArg(x) 7894 v.AddArg(v0) 7895 v1 := b.NewValue0(v.Pos, OpITab, types.BytePtr) 7896 v1.AddArg(y) 7897 v.AddArg(v1) 7898 return true 7899 } 7900 } 7901 func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { 7902 b := v.Block 7903 _ = b 7904 types := &b.Func.Config.Types 7905 _ = types 7906 // match: (EqPtr p (ConstNil)) 7907 // cond: 7908 // result: (Not (IsNonNil p)) 7909 for { 7910 p := v.Args[0] 7911 v_1 := v.Args[1] 7912 if v_1.Op != OpConstNil { 7913 break 7914 } 7915 v.reset(OpNot) 7916 v0 := b.NewValue0(v.Pos, OpIsNonNil, types.Bool) 7917 v0.AddArg(p) 7918 v.AddArg(v0) 7919 return true 7920 } 7921 // match: (EqPtr (ConstNil) p) 7922 // cond: 7923 // result: (Not (IsNonNil p)) 7924 for { 7925 v_0 := v.Args[0] 7926 if v_0.Op != OpConstNil { 7927 break 7928 } 7929 p := v.Args[1] 7930 v.reset(OpNot) 7931 v0 := b.NewValue0(v.Pos, OpIsNonNil, types.Bool) 7932 v0.AddArg(p) 7933 v.AddArg(v0) 7934 return true 7935 } 7936 // match: (EqPtr x x) 7937 // cond: 7938 // result: (ConstBool [1]) 7939 for { 7940 x := v.Args[0] 7941 if x != v.Args[1] { 7942 break 7943 } 7944 v.reset(OpConstBool) 7945 v.AuxInt = 1 7946 return true 7947 } 7948 // match: (EqPtr (Addr {a} x) (Addr {b} x)) 7949 // cond: 7950 // result: (ConstBool [b2i(a == b)]) 7951 for { 7952 v_0 := v.Args[0] 7953 if v_0.Op != OpAddr { 7954 break 7955 } 7956 a := v_0.Aux 7957 x := v_0.Args[0] 7958 v_1 := v.Args[1] 7959 if v_1.Op != OpAddr { 7960 break 7961 } 7962 b := v_1.Aux 7963 if x != v_1.Args[0] { 7964 break 7965 } 7966 v.reset(OpConstBool) 7967 v.AuxInt = b2i(a == b) 7968 return true 7969 } 7970 // match: (EqPtr (Addr {b} x) (Addr {a} x)) 7971 // cond: 7972 // result: (ConstBool [b2i(a == b)]) 7973 for { 7974 v_0 := v.Args[0] 7975 if v_0.Op != OpAddr { 7976 break 7977 } 7978 b := v_0.Aux 7979 x := v_0.Args[0] 7980 v_1 := v.Args[1] 7981 if v_1.Op != OpAddr { 7982 break 7983 } 7984 a := v_1.Aux 7985 if x != v_1.Args[0] { 7986 break 7987 } 7988 v.reset(OpConstBool) 7989 v.AuxInt = b2i(a == b) 7990 return true 7991 } 7992 return false 7993 } 7994 func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { 7995 b := v.Block 7996 _ = b 7997 types := &b.Func.Config.Types 7998 _ = types 7999 // match: (EqSlice x y) 8000 // cond: 8001 // result: (EqPtr (SlicePtr x) (SlicePtr y)) 8002 for { 8003 x := v.Args[0] 8004 y := v.Args[1] 8005 v.reset(OpEqPtr) 8006 v0 := b.NewValue0(v.Pos, OpSlicePtr, types.BytePtr) 8007 v0.AddArg(x) 8008 v.AddArg(v0) 8009 v1 := b.NewValue0(v.Pos, OpSlicePtr, types.BytePtr) 8010 v1.AddArg(y) 8011 v.AddArg(v1) 8012 return true 8013 } 8014 } 8015 func rewriteValuegeneric_OpGeq16_0(v *Value) bool { 8016 // match: (Geq16 (Const16 [c]) (Const16 [d])) 8017 // cond: 8018 // result: (ConstBool [b2i(c >= d)]) 8019 for { 8020 v_0 := v.Args[0] 8021 if v_0.Op != OpConst16 { 8022 break 8023 } 8024 c := v_0.AuxInt 8025 v_1 := v.Args[1] 8026 if v_1.Op != OpConst16 { 8027 break 8028 } 8029 d := v_1.AuxInt 8030 v.reset(OpConstBool) 8031 v.AuxInt = b2i(c >= d) 8032 return true 8033 } 8034 return false 8035 } 8036 func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { 8037 // match: (Geq16U (Const16 [c]) (Const16 [d])) 8038 // cond: 8039 // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) 8040 for { 8041 v_0 := v.Args[0] 8042 if v_0.Op != OpConst16 { 8043 break 8044 } 8045 c := v_0.AuxInt 8046 v_1 := v.Args[1] 8047 if v_1.Op != OpConst16 { 8048 break 8049 } 8050 d := v_1.AuxInt 8051 v.reset(OpConstBool) 8052 v.AuxInt = b2i(uint16(c) >= uint16(d)) 8053 return true 8054 } 8055 return false 8056 } 8057 func rewriteValuegeneric_OpGeq32_0(v *Value) bool { 8058 // match: (Geq32 (Const32 [c]) (Const32 [d])) 8059 // cond: 8060 // result: (ConstBool [b2i(c >= d)]) 8061 for { 8062 v_0 := v.Args[0] 8063 if v_0.Op != OpConst32 { 8064 break 8065 } 8066 c := v_0.AuxInt 8067 v_1 := v.Args[1] 8068 if v_1.Op != OpConst32 { 8069 break 8070 } 8071 d := v_1.AuxInt 8072 v.reset(OpConstBool) 8073 v.AuxInt = b2i(c >= d) 8074 return true 8075 } 8076 return false 8077 } 8078 func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { 8079 // match: (Geq32U (Const32 [c]) (Const32 [d])) 8080 // cond: 8081 // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) 8082 for { 8083 v_0 := v.Args[0] 8084 if v_0.Op != OpConst32 { 8085 break 8086 } 8087 c := v_0.AuxInt 8088 v_1 := v.Args[1] 8089 if v_1.Op != OpConst32 { 8090 break 8091 } 8092 d := v_1.AuxInt 8093 v.reset(OpConstBool) 8094 v.AuxInt = b2i(uint32(c) >= uint32(d)) 8095 return true 8096 } 8097 return false 8098 } 8099 func rewriteValuegeneric_OpGeq64_0(v *Value) bool { 8100 // match: (Geq64 (Const64 [c]) (Const64 [d])) 8101 // cond: 8102 // result: (ConstBool [b2i(c >= d)]) 8103 for { 8104 v_0 := v.Args[0] 8105 if v_0.Op != OpConst64 { 8106 break 8107 } 8108 c := v_0.AuxInt 8109 v_1 := v.Args[1] 8110 if v_1.Op != OpConst64 { 8111 break 8112 } 8113 d := v_1.AuxInt 8114 v.reset(OpConstBool) 8115 v.AuxInt = b2i(c >= d) 8116 return true 8117 } 8118 return false 8119 } 8120 func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { 8121 // match: (Geq64U (Const64 [c]) (Const64 [d])) 8122 // cond: 8123 // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) 8124 for { 8125 v_0 := v.Args[0] 8126 if v_0.Op != OpConst64 { 8127 break 8128 } 8129 c := v_0.AuxInt 8130 v_1 := v.Args[1] 8131 if v_1.Op != OpConst64 { 8132 break 8133 } 8134 d := v_1.AuxInt 8135 v.reset(OpConstBool) 8136 v.AuxInt = b2i(uint64(c) >= uint64(d)) 8137 return true 8138 } 8139 return false 8140 } 8141 func rewriteValuegeneric_OpGeq8_0(v *Value) bool { 8142 // match: (Geq8 (Const8 [c]) (Const8 [d])) 8143 // cond: 8144 // result: (ConstBool [b2i(c >= d)]) 8145 for { 8146 v_0 := v.Args[0] 8147 if v_0.Op != OpConst8 { 8148 break 8149 } 8150 c := v_0.AuxInt 8151 v_1 := v.Args[1] 8152 if v_1.Op != OpConst8 { 8153 break 8154 } 8155 d := v_1.AuxInt 8156 v.reset(OpConstBool) 8157 v.AuxInt = b2i(c >= d) 8158 return true 8159 } 8160 return false 8161 } 8162 func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { 8163 // match: (Geq8U (Const8 [c]) (Const8 [d])) 8164 // cond: 8165 // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) 8166 for { 8167 v_0 := v.Args[0] 8168 if v_0.Op != OpConst8 { 8169 break 8170 } 8171 c := v_0.AuxInt 8172 v_1 := v.Args[1] 8173 if v_1.Op != OpConst8 { 8174 break 8175 } 8176 d := v_1.AuxInt 8177 v.reset(OpConstBool) 8178 v.AuxInt = b2i(uint8(c) >= uint8(d)) 8179 return true 8180 } 8181 return false 8182 } 8183 func rewriteValuegeneric_OpGreater16_0(v *Value) bool { 8184 // match: (Greater16 (Const16 [c]) (Const16 [d])) 8185 // cond: 8186 // result: (ConstBool [b2i(c > d)]) 8187 for { 8188 v_0 := v.Args[0] 8189 if v_0.Op != OpConst16 { 8190 break 8191 } 8192 c := v_0.AuxInt 8193 v_1 := v.Args[1] 8194 if v_1.Op != OpConst16 { 8195 break 8196 } 8197 d := v_1.AuxInt 8198 v.reset(OpConstBool) 8199 v.AuxInt = b2i(c > d) 8200 return true 8201 } 8202 return false 8203 } 8204 func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { 8205 // match: (Greater16U (Const16 [c]) (Const16 [d])) 8206 // cond: 8207 // result: (ConstBool [b2i(uint16(c) > uint16(d))]) 8208 for { 8209 v_0 := v.Args[0] 8210 if v_0.Op != OpConst16 { 8211 break 8212 } 8213 c := v_0.AuxInt 8214 v_1 := v.Args[1] 8215 if v_1.Op != OpConst16 { 8216 break 8217 } 8218 d := v_1.AuxInt 8219 v.reset(OpConstBool) 8220 v.AuxInt = b2i(uint16(c) > uint16(d)) 8221 return true 8222 } 8223 return false 8224 } 8225 func rewriteValuegeneric_OpGreater32_0(v *Value) bool { 8226 // match: (Greater32 (Const32 [c]) (Const32 [d])) 8227 // cond: 8228 // result: (ConstBool [b2i(c > d)]) 8229 for { 8230 v_0 := v.Args[0] 8231 if v_0.Op != OpConst32 { 8232 break 8233 } 8234 c := v_0.AuxInt 8235 v_1 := v.Args[1] 8236 if v_1.Op != OpConst32 { 8237 break 8238 } 8239 d := v_1.AuxInt 8240 v.reset(OpConstBool) 8241 v.AuxInt = b2i(c > d) 8242 return true 8243 } 8244 return false 8245 } 8246 func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { 8247 // match: (Greater32U (Const32 [c]) (Const32 [d])) 8248 // cond: 8249 // result: (ConstBool [b2i(uint32(c) > uint32(d))]) 8250 for { 8251 v_0 := v.Args[0] 8252 if v_0.Op != OpConst32 { 8253 break 8254 } 8255 c := v_0.AuxInt 8256 v_1 := v.Args[1] 8257 if v_1.Op != OpConst32 { 8258 break 8259 } 8260 d := v_1.AuxInt 8261 v.reset(OpConstBool) 8262 v.AuxInt = b2i(uint32(c) > uint32(d)) 8263 return true 8264 } 8265 return false 8266 } 8267 func rewriteValuegeneric_OpGreater64_0(v *Value) bool { 8268 // match: (Greater64 (Const64 [c]) (Const64 [d])) 8269 // cond: 8270 // result: (ConstBool [b2i(c > d)]) 8271 for { 8272 v_0 := v.Args[0] 8273 if v_0.Op != OpConst64 { 8274 break 8275 } 8276 c := v_0.AuxInt 8277 v_1 := v.Args[1] 8278 if v_1.Op != OpConst64 { 8279 break 8280 } 8281 d := v_1.AuxInt 8282 v.reset(OpConstBool) 8283 v.AuxInt = b2i(c > d) 8284 return true 8285 } 8286 return false 8287 } 8288 func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { 8289 // match: (Greater64U (Const64 [c]) (Const64 [d])) 8290 // cond: 8291 // result: (ConstBool [b2i(uint64(c) > uint64(d))]) 8292 for { 8293 v_0 := v.Args[0] 8294 if v_0.Op != OpConst64 { 8295 break 8296 } 8297 c := v_0.AuxInt 8298 v_1 := v.Args[1] 8299 if v_1.Op != OpConst64 { 8300 break 8301 } 8302 d := v_1.AuxInt 8303 v.reset(OpConstBool) 8304 v.AuxInt = b2i(uint64(c) > uint64(d)) 8305 return true 8306 } 8307 return false 8308 } 8309 func rewriteValuegeneric_OpGreater8_0(v *Value) bool { 8310 // match: (Greater8 (Const8 [c]) (Const8 [d])) 8311 // cond: 8312 // result: (ConstBool [b2i(c > d)]) 8313 for { 8314 v_0 := v.Args[0] 8315 if v_0.Op != OpConst8 { 8316 break 8317 } 8318 c := v_0.AuxInt 8319 v_1 := v.Args[1] 8320 if v_1.Op != OpConst8 { 8321 break 8322 } 8323 d := v_1.AuxInt 8324 v.reset(OpConstBool) 8325 v.AuxInt = b2i(c > d) 8326 return true 8327 } 8328 return false 8329 } 8330 func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { 8331 // match: (Greater8U (Const8 [c]) (Const8 [d])) 8332 // cond: 8333 // result: (ConstBool [b2i(uint8(c) > uint8(d))]) 8334 for { 8335 v_0 := v.Args[0] 8336 if v_0.Op != OpConst8 { 8337 break 8338 } 8339 c := v_0.AuxInt 8340 v_1 := v.Args[1] 8341 if v_1.Op != OpConst8 { 8342 break 8343 } 8344 d := v_1.AuxInt 8345 v.reset(OpConstBool) 8346 v.AuxInt = b2i(uint8(c) > uint8(d)) 8347 return true 8348 } 8349 return false 8350 } 8351 func rewriteValuegeneric_OpIMake_0(v *Value) bool { 8352 // match: (IMake typ (StructMake1 val)) 8353 // cond: 8354 // result: (IMake typ val) 8355 for { 8356 typ := v.Args[0] 8357 v_1 := v.Args[1] 8358 if v_1.Op != OpStructMake1 { 8359 break 8360 } 8361 val := v_1.Args[0] 8362 v.reset(OpIMake) 8363 v.AddArg(typ) 8364 v.AddArg(val) 8365 return true 8366 } 8367 // match: (IMake typ (ArrayMake1 val)) 8368 // cond: 8369 // result: (IMake typ val) 8370 for { 8371 typ := v.Args[0] 8372 v_1 := v.Args[1] 8373 if v_1.Op != OpArrayMake1 { 8374 break 8375 } 8376 val := v_1.Args[0] 8377 v.reset(OpIMake) 8378 v.AddArg(typ) 8379 v.AddArg(val) 8380 return true 8381 } 8382 return false 8383 } 8384 func rewriteValuegeneric_OpInterCall_0(v *Value) bool { 8385 // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) 8386 // cond: devirt(v, itab, off) != nil 8387 // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) 8388 for { 8389 argsize := v.AuxInt 8390 v_0 := v.Args[0] 8391 if v_0.Op != OpLoad { 8392 break 8393 } 8394 v_0_0 := v_0.Args[0] 8395 if v_0_0.Op != OpOffPtr { 8396 break 8397 } 8398 off := v_0_0.AuxInt 8399 v_0_0_0 := v_0_0.Args[0] 8400 if v_0_0_0.Op != OpITab { 8401 break 8402 } 8403 v_0_0_0_0 := v_0_0_0.Args[0] 8404 if v_0_0_0_0.Op != OpIMake { 8405 break 8406 } 8407 v_0_0_0_0_0 := v_0_0_0_0.Args[0] 8408 if v_0_0_0_0_0.Op != OpAddr { 8409 break 8410 } 8411 itab := v_0_0_0_0_0.Aux 8412 v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] 8413 if v_0_0_0_0_0_0.Op != OpSB { 8414 break 8415 } 8416 mem := v.Args[1] 8417 if !(devirt(v, itab, off) != nil) { 8418 break 8419 } 8420 v.reset(OpStaticCall) 8421 v.AuxInt = argsize 8422 v.Aux = devirt(v, itab, off) 8423 v.AddArg(mem) 8424 return true 8425 } 8426 return false 8427 } 8428 func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { 8429 // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) 8430 // cond: (1 << 8) <= c 8431 // result: (ConstBool [1]) 8432 for { 8433 v_0 := v.Args[0] 8434 if v_0.Op != OpZeroExt8to32 { 8435 break 8436 } 8437 v_1 := v.Args[1] 8438 if v_1.Op != OpConst32 { 8439 break 8440 } 8441 c := v_1.AuxInt 8442 if !((1 << 8) <= c) { 8443 break 8444 } 8445 v.reset(OpConstBool) 8446 v.AuxInt = 1 8447 return true 8448 } 8449 // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) 8450 // cond: (1 << 8) <= c 8451 // result: (ConstBool [1]) 8452 for { 8453 v_0 := v.Args[0] 8454 if v_0.Op != OpZeroExt8to64 { 8455 break 8456 } 8457 v_1 := v.Args[1] 8458 if v_1.Op != OpConst64 { 8459 break 8460 } 8461 c := v_1.AuxInt 8462 if !((1 << 8) <= c) { 8463 break 8464 } 8465 v.reset(OpConstBool) 8466 v.AuxInt = 1 8467 return true 8468 } 8469 // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) 8470 // cond: (1 << 16) <= c 8471 // result: (ConstBool [1]) 8472 for { 8473 v_0 := v.Args[0] 8474 if v_0.Op != OpZeroExt16to32 { 8475 break 8476 } 8477 v_1 := v.Args[1] 8478 if v_1.Op != OpConst32 { 8479 break 8480 } 8481 c := v_1.AuxInt 8482 if !((1 << 16) <= c) { 8483 break 8484 } 8485 v.reset(OpConstBool) 8486 v.AuxInt = 1 8487 return true 8488 } 8489 // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) 8490 // cond: (1 << 16) <= c 8491 // result: (ConstBool [1]) 8492 for { 8493 v_0 := v.Args[0] 8494 if v_0.Op != OpZeroExt16to64 { 8495 break 8496 } 8497 v_1 := v.Args[1] 8498 if v_1.Op != OpConst64 { 8499 break 8500 } 8501 c := v_1.AuxInt 8502 if !((1 << 16) <= c) { 8503 break 8504 } 8505 v.reset(OpConstBool) 8506 v.AuxInt = 1 8507 return true 8508 } 8509 // match: (IsInBounds x x) 8510 // cond: 8511 // result: (ConstBool [0]) 8512 for { 8513 x := v.Args[0] 8514 if x != v.Args[1] { 8515 break 8516 } 8517 v.reset(OpConstBool) 8518 v.AuxInt = 0 8519 return true 8520 } 8521 // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) 8522 // cond: 0 <= c && c < d 8523 // result: (ConstBool [1]) 8524 for { 8525 v_0 := v.Args[0] 8526 if v_0.Op != OpAnd8 { 8527 break 8528 } 8529 v_0_0 := v_0.Args[0] 8530 if v_0_0.Op != OpConst8 { 8531 break 8532 } 8533 c := v_0_0.AuxInt 8534 v_1 := v.Args[1] 8535 if v_1.Op != OpConst8 { 8536 break 8537 } 8538 d := v_1.AuxInt 8539 if !(0 <= c && c < d) { 8540 break 8541 } 8542 v.reset(OpConstBool) 8543 v.AuxInt = 1 8544 return true 8545 } 8546 // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) 8547 // cond: 0 <= c && c < d 8548 // result: (ConstBool [1]) 8549 for { 8550 v_0 := v.Args[0] 8551 if v_0.Op != OpAnd8 { 8552 break 8553 } 8554 v_0_1 := v_0.Args[1] 8555 if v_0_1.Op != OpConst8 { 8556 break 8557 } 8558 c := v_0_1.AuxInt 8559 v_1 := v.Args[1] 8560 if v_1.Op != OpConst8 { 8561 break 8562 } 8563 d := v_1.AuxInt 8564 if !(0 <= c && c < d) { 8565 break 8566 } 8567 v.reset(OpConstBool) 8568 v.AuxInt = 1 8569 return true 8570 } 8571 // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) 8572 // cond: 0 <= c && c < d 8573 // result: (ConstBool [1]) 8574 for { 8575 v_0 := v.Args[0] 8576 if v_0.Op != OpZeroExt8to16 { 8577 break 8578 } 8579 v_0_0 := v_0.Args[0] 8580 if v_0_0.Op != OpAnd8 { 8581 break 8582 } 8583 v_0_0_0 := v_0_0.Args[0] 8584 if v_0_0_0.Op != OpConst8 { 8585 break 8586 } 8587 c := v_0_0_0.AuxInt 8588 v_1 := v.Args[1] 8589 if v_1.Op != OpConst16 { 8590 break 8591 } 8592 d := v_1.AuxInt 8593 if !(0 <= c && c < d) { 8594 break 8595 } 8596 v.reset(OpConstBool) 8597 v.AuxInt = 1 8598 return true 8599 } 8600 // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) 8601 // cond: 0 <= c && c < d 8602 // result: (ConstBool [1]) 8603 for { 8604 v_0 := v.Args[0] 8605 if v_0.Op != OpZeroExt8to16 { 8606 break 8607 } 8608 v_0_0 := v_0.Args[0] 8609 if v_0_0.Op != OpAnd8 { 8610 break 8611 } 8612 v_0_0_1 := v_0_0.Args[1] 8613 if v_0_0_1.Op != OpConst8 { 8614 break 8615 } 8616 c := v_0_0_1.AuxInt 8617 v_1 := v.Args[1] 8618 if v_1.Op != OpConst16 { 8619 break 8620 } 8621 d := v_1.AuxInt 8622 if !(0 <= c && c < d) { 8623 break 8624 } 8625 v.reset(OpConstBool) 8626 v.AuxInt = 1 8627 return true 8628 } 8629 // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) 8630 // cond: 0 <= c && c < d 8631 // result: (ConstBool [1]) 8632 for { 8633 v_0 := v.Args[0] 8634 if v_0.Op != OpZeroExt8to32 { 8635 break 8636 } 8637 v_0_0 := v_0.Args[0] 8638 if v_0_0.Op != OpAnd8 { 8639 break 8640 } 8641 v_0_0_0 := v_0_0.Args[0] 8642 if v_0_0_0.Op != OpConst8 { 8643 break 8644 } 8645 c := v_0_0_0.AuxInt 8646 v_1 := v.Args[1] 8647 if v_1.Op != OpConst32 { 8648 break 8649 } 8650 d := v_1.AuxInt 8651 if !(0 <= c && c < d) { 8652 break 8653 } 8654 v.reset(OpConstBool) 8655 v.AuxInt = 1 8656 return true 8657 } 8658 return false 8659 } 8660 func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { 8661 // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) 8662 // cond: 0 <= c && c < d 8663 // result: (ConstBool [1]) 8664 for { 8665 v_0 := v.Args[0] 8666 if v_0.Op != OpZeroExt8to32 { 8667 break 8668 } 8669 v_0_0 := v_0.Args[0] 8670 if v_0_0.Op != OpAnd8 { 8671 break 8672 } 8673 v_0_0_1 := v_0_0.Args[1] 8674 if v_0_0_1.Op != OpConst8 { 8675 break 8676 } 8677 c := v_0_0_1.AuxInt 8678 v_1 := v.Args[1] 8679 if v_1.Op != OpConst32 { 8680 break 8681 } 8682 d := v_1.AuxInt 8683 if !(0 <= c && c < d) { 8684 break 8685 } 8686 v.reset(OpConstBool) 8687 v.AuxInt = 1 8688 return true 8689 } 8690 // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) 8691 // cond: 0 <= c && c < d 8692 // result: (ConstBool [1]) 8693 for { 8694 v_0 := v.Args[0] 8695 if v_0.Op != OpZeroExt8to64 { 8696 break 8697 } 8698 v_0_0 := v_0.Args[0] 8699 if v_0_0.Op != OpAnd8 { 8700 break 8701 } 8702 v_0_0_0 := v_0_0.Args[0] 8703 if v_0_0_0.Op != OpConst8 { 8704 break 8705 } 8706 c := v_0_0_0.AuxInt 8707 v_1 := v.Args[1] 8708 if v_1.Op != OpConst64 { 8709 break 8710 } 8711 d := v_1.AuxInt 8712 if !(0 <= c && c < d) { 8713 break 8714 } 8715 v.reset(OpConstBool) 8716 v.AuxInt = 1 8717 return true 8718 } 8719 // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) 8720 // cond: 0 <= c && c < d 8721 // result: (ConstBool [1]) 8722 for { 8723 v_0 := v.Args[0] 8724 if v_0.Op != OpZeroExt8to64 { 8725 break 8726 } 8727 v_0_0 := v_0.Args[0] 8728 if v_0_0.Op != OpAnd8 { 8729 break 8730 } 8731 v_0_0_1 := v_0_0.Args[1] 8732 if v_0_0_1.Op != OpConst8 { 8733 break 8734 } 8735 c := v_0_0_1.AuxInt 8736 v_1 := v.Args[1] 8737 if v_1.Op != OpConst64 { 8738 break 8739 } 8740 d := v_1.AuxInt 8741 if !(0 <= c && c < d) { 8742 break 8743 } 8744 v.reset(OpConstBool) 8745 v.AuxInt = 1 8746 return true 8747 } 8748 // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) 8749 // cond: 0 <= c && c < d 8750 // result: (ConstBool [1]) 8751 for { 8752 v_0 := v.Args[0] 8753 if v_0.Op != OpAnd16 { 8754 break 8755 } 8756 v_0_0 := v_0.Args[0] 8757 if v_0_0.Op != OpConst16 { 8758 break 8759 } 8760 c := v_0_0.AuxInt 8761 v_1 := v.Args[1] 8762 if v_1.Op != OpConst16 { 8763 break 8764 } 8765 d := v_1.AuxInt 8766 if !(0 <= c && c < d) { 8767 break 8768 } 8769 v.reset(OpConstBool) 8770 v.AuxInt = 1 8771 return true 8772 } 8773 // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) 8774 // cond: 0 <= c && c < d 8775 // result: (ConstBool [1]) 8776 for { 8777 v_0 := v.Args[0] 8778 if v_0.Op != OpAnd16 { 8779 break 8780 } 8781 v_0_1 := v_0.Args[1] 8782 if v_0_1.Op != OpConst16 { 8783 break 8784 } 8785 c := v_0_1.AuxInt 8786 v_1 := v.Args[1] 8787 if v_1.Op != OpConst16 { 8788 break 8789 } 8790 d := v_1.AuxInt 8791 if !(0 <= c && c < d) { 8792 break 8793 } 8794 v.reset(OpConstBool) 8795 v.AuxInt = 1 8796 return true 8797 } 8798 // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) 8799 // cond: 0 <= c && c < d 8800 // result: (ConstBool [1]) 8801 for { 8802 v_0 := v.Args[0] 8803 if v_0.Op != OpZeroExt16to32 { 8804 break 8805 } 8806 v_0_0 := v_0.Args[0] 8807 if v_0_0.Op != OpAnd16 { 8808 break 8809 } 8810 v_0_0_0 := v_0_0.Args[0] 8811 if v_0_0_0.Op != OpConst16 { 8812 break 8813 } 8814 c := v_0_0_0.AuxInt 8815 v_1 := v.Args[1] 8816 if v_1.Op != OpConst32 { 8817 break 8818 } 8819 d := v_1.AuxInt 8820 if !(0 <= c && c < d) { 8821 break 8822 } 8823 v.reset(OpConstBool) 8824 v.AuxInt = 1 8825 return true 8826 } 8827 // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) 8828 // cond: 0 <= c && c < d 8829 // result: (ConstBool [1]) 8830 for { 8831 v_0 := v.Args[0] 8832 if v_0.Op != OpZeroExt16to32 { 8833 break 8834 } 8835 v_0_0 := v_0.Args[0] 8836 if v_0_0.Op != OpAnd16 { 8837 break 8838 } 8839 v_0_0_1 := v_0_0.Args[1] 8840 if v_0_0_1.Op != OpConst16 { 8841 break 8842 } 8843 c := v_0_0_1.AuxInt 8844 v_1 := v.Args[1] 8845 if v_1.Op != OpConst32 { 8846 break 8847 } 8848 d := v_1.AuxInt 8849 if !(0 <= c && c < d) { 8850 break 8851 } 8852 v.reset(OpConstBool) 8853 v.AuxInt = 1 8854 return true 8855 } 8856 // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) 8857 // cond: 0 <= c && c < d 8858 // result: (ConstBool [1]) 8859 for { 8860 v_0 := v.Args[0] 8861 if v_0.Op != OpZeroExt16to64 { 8862 break 8863 } 8864 v_0_0 := v_0.Args[0] 8865 if v_0_0.Op != OpAnd16 { 8866 break 8867 } 8868 v_0_0_0 := v_0_0.Args[0] 8869 if v_0_0_0.Op != OpConst16 { 8870 break 8871 } 8872 c := v_0_0_0.AuxInt 8873 v_1 := v.Args[1] 8874 if v_1.Op != OpConst64 { 8875 break 8876 } 8877 d := v_1.AuxInt 8878 if !(0 <= c && c < d) { 8879 break 8880 } 8881 v.reset(OpConstBool) 8882 v.AuxInt = 1 8883 return true 8884 } 8885 // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) 8886 // cond: 0 <= c && c < d 8887 // result: (ConstBool [1]) 8888 for { 8889 v_0 := v.Args[0] 8890 if v_0.Op != OpZeroExt16to64 { 8891 break 8892 } 8893 v_0_0 := v_0.Args[0] 8894 if v_0_0.Op != OpAnd16 { 8895 break 8896 } 8897 v_0_0_1 := v_0_0.Args[1] 8898 if v_0_0_1.Op != OpConst16 { 8899 break 8900 } 8901 c := v_0_0_1.AuxInt 8902 v_1 := v.Args[1] 8903 if v_1.Op != OpConst64 { 8904 break 8905 } 8906 d := v_1.AuxInt 8907 if !(0 <= c && c < d) { 8908 break 8909 } 8910 v.reset(OpConstBool) 8911 v.AuxInt = 1 8912 return true 8913 } 8914 // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) 8915 // cond: 0 <= c && c < d 8916 // result: (ConstBool [1]) 8917 for { 8918 v_0 := v.Args[0] 8919 if v_0.Op != OpAnd32 { 8920 break 8921 } 8922 v_0_0 := v_0.Args[0] 8923 if v_0_0.Op != OpConst32 { 8924 break 8925 } 8926 c := v_0_0.AuxInt 8927 v_1 := v.Args[1] 8928 if v_1.Op != OpConst32 { 8929 break 8930 } 8931 d := v_1.AuxInt 8932 if !(0 <= c && c < d) { 8933 break 8934 } 8935 v.reset(OpConstBool) 8936 v.AuxInt = 1 8937 return true 8938 } 8939 return false 8940 } 8941 func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { 8942 // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) 8943 // cond: 0 <= c && c < d 8944 // result: (ConstBool [1]) 8945 for { 8946 v_0 := v.Args[0] 8947 if v_0.Op != OpAnd32 { 8948 break 8949 } 8950 v_0_1 := v_0.Args[1] 8951 if v_0_1.Op != OpConst32 { 8952 break 8953 } 8954 c := v_0_1.AuxInt 8955 v_1 := v.Args[1] 8956 if v_1.Op != OpConst32 { 8957 break 8958 } 8959 d := v_1.AuxInt 8960 if !(0 <= c && c < d) { 8961 break 8962 } 8963 v.reset(OpConstBool) 8964 v.AuxInt = 1 8965 return true 8966 } 8967 // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) 8968 // cond: 0 <= c && c < d 8969 // result: (ConstBool [1]) 8970 for { 8971 v_0 := v.Args[0] 8972 if v_0.Op != OpZeroExt32to64 { 8973 break 8974 } 8975 v_0_0 := v_0.Args[0] 8976 if v_0_0.Op != OpAnd32 { 8977 break 8978 } 8979 v_0_0_0 := v_0_0.Args[0] 8980 if v_0_0_0.Op != OpConst32 { 8981 break 8982 } 8983 c := v_0_0_0.AuxInt 8984 v_1 := v.Args[1] 8985 if v_1.Op != OpConst64 { 8986 break 8987 } 8988 d := v_1.AuxInt 8989 if !(0 <= c && c < d) { 8990 break 8991 } 8992 v.reset(OpConstBool) 8993 v.AuxInt = 1 8994 return true 8995 } 8996 // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) 8997 // cond: 0 <= c && c < d 8998 // result: (ConstBool [1]) 8999 for { 9000 v_0 := v.Args[0] 9001 if v_0.Op != OpZeroExt32to64 { 9002 break 9003 } 9004 v_0_0 := v_0.Args[0] 9005 if v_0_0.Op != OpAnd32 { 9006 break 9007 } 9008 v_0_0_1 := v_0_0.Args[1] 9009 if v_0_0_1.Op != OpConst32 { 9010 break 9011 } 9012 c := v_0_0_1.AuxInt 9013 v_1 := v.Args[1] 9014 if v_1.Op != OpConst64 { 9015 break 9016 } 9017 d := v_1.AuxInt 9018 if !(0 <= c && c < d) { 9019 break 9020 } 9021 v.reset(OpConstBool) 9022 v.AuxInt = 1 9023 return true 9024 } 9025 // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) 9026 // cond: 0 <= c && c < d 9027 // result: (ConstBool [1]) 9028 for { 9029 v_0 := v.Args[0] 9030 if v_0.Op != OpAnd64 { 9031 break 9032 } 9033 v_0_0 := v_0.Args[0] 9034 if v_0_0.Op != OpConst64 { 9035 break 9036 } 9037 c := v_0_0.AuxInt 9038 v_1 := v.Args[1] 9039 if v_1.Op != OpConst64 { 9040 break 9041 } 9042 d := v_1.AuxInt 9043 if !(0 <= c && c < d) { 9044 break 9045 } 9046 v.reset(OpConstBool) 9047 v.AuxInt = 1 9048 return true 9049 } 9050 // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) 9051 // cond: 0 <= c && c < d 9052 // result: (ConstBool [1]) 9053 for { 9054 v_0 := v.Args[0] 9055 if v_0.Op != OpAnd64 { 9056 break 9057 } 9058 v_0_1 := v_0.Args[1] 9059 if v_0_1.Op != OpConst64 { 9060 break 9061 } 9062 c := v_0_1.AuxInt 9063 v_1 := v.Args[1] 9064 if v_1.Op != OpConst64 { 9065 break 9066 } 9067 d := v_1.AuxInt 9068 if !(0 <= c && c < d) { 9069 break 9070 } 9071 v.reset(OpConstBool) 9072 v.AuxInt = 1 9073 return true 9074 } 9075 // match: (IsInBounds (Const32 [c]) (Const32 [d])) 9076 // cond: 9077 // result: (ConstBool [b2i(0 <= c && c < d)]) 9078 for { 9079 v_0 := v.Args[0] 9080 if v_0.Op != OpConst32 { 9081 break 9082 } 9083 c := v_0.AuxInt 9084 v_1 := v.Args[1] 9085 if v_1.Op != OpConst32 { 9086 break 9087 } 9088 d := v_1.AuxInt 9089 v.reset(OpConstBool) 9090 v.AuxInt = b2i(0 <= c && c < d) 9091 return true 9092 } 9093 // match: (IsInBounds (Const64 [c]) (Const64 [d])) 9094 // cond: 9095 // result: (ConstBool [b2i(0 <= c && c < d)]) 9096 for { 9097 v_0 := v.Args[0] 9098 if v_0.Op != OpConst64 { 9099 break 9100 } 9101 c := v_0.AuxInt 9102 v_1 := v.Args[1] 9103 if v_1.Op != OpConst64 { 9104 break 9105 } 9106 d := v_1.AuxInt 9107 v.reset(OpConstBool) 9108 v.AuxInt = b2i(0 <= c && c < d) 9109 return true 9110 } 9111 // match: (IsInBounds (Mod32u _ y) y) 9112 // cond: 9113 // result: (ConstBool [1]) 9114 for { 9115 v_0 := v.Args[0] 9116 if v_0.Op != OpMod32u { 9117 break 9118 } 9119 y := v_0.Args[1] 9120 if y != v.Args[1] { 9121 break 9122 } 9123 v.reset(OpConstBool) 9124 v.AuxInt = 1 9125 return true 9126 } 9127 // match: (IsInBounds (Mod64u _ y) y) 9128 // cond: 9129 // result: (ConstBool [1]) 9130 for { 9131 v_0 := v.Args[0] 9132 if v_0.Op != OpMod64u { 9133 break 9134 } 9135 y := v_0.Args[1] 9136 if y != v.Args[1] { 9137 break 9138 } 9139 v.reset(OpConstBool) 9140 v.AuxInt = 1 9141 return true 9142 } 9143 return false 9144 } 9145 func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { 9146 // match: (IsNonNil (ConstNil)) 9147 // cond: 9148 // result: (ConstBool [0]) 9149 for { 9150 v_0 := v.Args[0] 9151 if v_0.Op != OpConstNil { 9152 break 9153 } 9154 v.reset(OpConstBool) 9155 v.AuxInt = 0 9156 return true 9157 } 9158 return false 9159 } 9160 func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { 9161 // match: (IsSliceInBounds x x) 9162 // cond: 9163 // result: (ConstBool [1]) 9164 for { 9165 x := v.Args[0] 9166 if x != v.Args[1] { 9167 break 9168 } 9169 v.reset(OpConstBool) 9170 v.AuxInt = 1 9171 return true 9172 } 9173 // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) 9174 // cond: 0 <= c && c <= d 9175 // result: (ConstBool [1]) 9176 for { 9177 v_0 := v.Args[0] 9178 if v_0.Op != OpAnd32 { 9179 break 9180 } 9181 v_0_0 := v_0.Args[0] 9182 if v_0_0.Op != OpConst32 { 9183 break 9184 } 9185 c := v_0_0.AuxInt 9186 v_1 := v.Args[1] 9187 if v_1.Op != OpConst32 { 9188 break 9189 } 9190 d := v_1.AuxInt 9191 if !(0 <= c && c <= d) { 9192 break 9193 } 9194 v.reset(OpConstBool) 9195 v.AuxInt = 1 9196 return true 9197 } 9198 // match: (IsSliceInBounds (And32 _ (Const32 [c])) (Const32 [d])) 9199 // cond: 0 <= c && c <= d 9200 // result: (ConstBool [1]) 9201 for { 9202 v_0 := v.Args[0] 9203 if v_0.Op != OpAnd32 { 9204 break 9205 } 9206 v_0_1 := v_0.Args[1] 9207 if v_0_1.Op != OpConst32 { 9208 break 9209 } 9210 c := v_0_1.AuxInt 9211 v_1 := v.Args[1] 9212 if v_1.Op != OpConst32 { 9213 break 9214 } 9215 d := v_1.AuxInt 9216 if !(0 <= c && c <= d) { 9217 break 9218 } 9219 v.reset(OpConstBool) 9220 v.AuxInt = 1 9221 return true 9222 } 9223 // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) 9224 // cond: 0 <= c && c <= d 9225 // result: (ConstBool [1]) 9226 for { 9227 v_0 := v.Args[0] 9228 if v_0.Op != OpAnd64 { 9229 break 9230 } 9231 v_0_0 := v_0.Args[0] 9232 if v_0_0.Op != OpConst64 { 9233 break 9234 } 9235 c := v_0_0.AuxInt 9236 v_1 := v.Args[1] 9237 if v_1.Op != OpConst64 { 9238 break 9239 } 9240 d := v_1.AuxInt 9241 if !(0 <= c && c <= d) { 9242 break 9243 } 9244 v.reset(OpConstBool) 9245 v.AuxInt = 1 9246 return true 9247 } 9248 // match: (IsSliceInBounds (And64 _ (Const64 [c])) (Const64 [d])) 9249 // cond: 0 <= c && c <= d 9250 // result: (ConstBool [1]) 9251 for { 9252 v_0 := v.Args[0] 9253 if v_0.Op != OpAnd64 { 9254 break 9255 } 9256 v_0_1 := v_0.Args[1] 9257 if v_0_1.Op != OpConst64 { 9258 break 9259 } 9260 c := v_0_1.AuxInt 9261 v_1 := v.Args[1] 9262 if v_1.Op != OpConst64 { 9263 break 9264 } 9265 d := v_1.AuxInt 9266 if !(0 <= c && c <= d) { 9267 break 9268 } 9269 v.reset(OpConstBool) 9270 v.AuxInt = 1 9271 return true 9272 } 9273 // match: (IsSliceInBounds (Const32 [0]) _) 9274 // cond: 9275 // result: (ConstBool [1]) 9276 for { 9277 v_0 := v.Args[0] 9278 if v_0.Op != OpConst32 { 9279 break 9280 } 9281 if v_0.AuxInt != 0 { 9282 break 9283 } 9284 v.reset(OpConstBool) 9285 v.AuxInt = 1 9286 return true 9287 } 9288 // match: (IsSliceInBounds (Const64 [0]) _) 9289 // cond: 9290 // result: (ConstBool [1]) 9291 for { 9292 v_0 := v.Args[0] 9293 if v_0.Op != OpConst64 { 9294 break 9295 } 9296 if v_0.AuxInt != 0 { 9297 break 9298 } 9299 v.reset(OpConstBool) 9300 v.AuxInt = 1 9301 return true 9302 } 9303 // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) 9304 // cond: 9305 // result: (ConstBool [b2i(0 <= c && c <= d)]) 9306 for { 9307 v_0 := v.Args[0] 9308 if v_0.Op != OpConst32 { 9309 break 9310 } 9311 c := v_0.AuxInt 9312 v_1 := v.Args[1] 9313 if v_1.Op != OpConst32 { 9314 break 9315 } 9316 d := v_1.AuxInt 9317 v.reset(OpConstBool) 9318 v.AuxInt = b2i(0 <= c && c <= d) 9319 return true 9320 } 9321 // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) 9322 // cond: 9323 // result: (ConstBool [b2i(0 <= c && c <= d)]) 9324 for { 9325 v_0 := v.Args[0] 9326 if v_0.Op != OpConst64 { 9327 break 9328 } 9329 c := v_0.AuxInt 9330 v_1 := v.Args[1] 9331 if v_1.Op != OpConst64 { 9332 break 9333 } 9334 d := v_1.AuxInt 9335 v.reset(OpConstBool) 9336 v.AuxInt = b2i(0 <= c && c <= d) 9337 return true 9338 } 9339 // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) 9340 // cond: 9341 // result: (ConstBool [1]) 9342 for { 9343 v_0 := v.Args[0] 9344 if v_0.Op != OpSliceLen { 9345 break 9346 } 9347 x := v_0.Args[0] 9348 v_1 := v.Args[1] 9349 if v_1.Op != OpSliceCap { 9350 break 9351 } 9352 if x != v_1.Args[0] { 9353 break 9354 } 9355 v.reset(OpConstBool) 9356 v.AuxInt = 1 9357 return true 9358 } 9359 return false 9360 } 9361 func rewriteValuegeneric_OpLeq16_0(v *Value) bool { 9362 // match: (Leq16 (Const16 [c]) (Const16 [d])) 9363 // cond: 9364 // result: (ConstBool [b2i(c <= d)]) 9365 for { 9366 v_0 := v.Args[0] 9367 if v_0.Op != OpConst16 { 9368 break 9369 } 9370 c := v_0.AuxInt 9371 v_1 := v.Args[1] 9372 if v_1.Op != OpConst16 { 9373 break 9374 } 9375 d := v_1.AuxInt 9376 v.reset(OpConstBool) 9377 v.AuxInt = b2i(c <= d) 9378 return true 9379 } 9380 return false 9381 } 9382 func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { 9383 // match: (Leq16U (Const16 [c]) (Const16 [d])) 9384 // cond: 9385 // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) 9386 for { 9387 v_0 := v.Args[0] 9388 if v_0.Op != OpConst16 { 9389 break 9390 } 9391 c := v_0.AuxInt 9392 v_1 := v.Args[1] 9393 if v_1.Op != OpConst16 { 9394 break 9395 } 9396 d := v_1.AuxInt 9397 v.reset(OpConstBool) 9398 v.AuxInt = b2i(uint16(c) <= uint16(d)) 9399 return true 9400 } 9401 return false 9402 } 9403 func rewriteValuegeneric_OpLeq32_0(v *Value) bool { 9404 // match: (Leq32 (Const32 [c]) (Const32 [d])) 9405 // cond: 9406 // result: (ConstBool [b2i(c <= d)]) 9407 for { 9408 v_0 := v.Args[0] 9409 if v_0.Op != OpConst32 { 9410 break 9411 } 9412 c := v_0.AuxInt 9413 v_1 := v.Args[1] 9414 if v_1.Op != OpConst32 { 9415 break 9416 } 9417 d := v_1.AuxInt 9418 v.reset(OpConstBool) 9419 v.AuxInt = b2i(c <= d) 9420 return true 9421 } 9422 return false 9423 } 9424 func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { 9425 // match: (Leq32U (Const32 [c]) (Const32 [d])) 9426 // cond: 9427 // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) 9428 for { 9429 v_0 := v.Args[0] 9430 if v_0.Op != OpConst32 { 9431 break 9432 } 9433 c := v_0.AuxInt 9434 v_1 := v.Args[1] 9435 if v_1.Op != OpConst32 { 9436 break 9437 } 9438 d := v_1.AuxInt 9439 v.reset(OpConstBool) 9440 v.AuxInt = b2i(uint32(c) <= uint32(d)) 9441 return true 9442 } 9443 return false 9444 } 9445 func rewriteValuegeneric_OpLeq64_0(v *Value) bool { 9446 // match: (Leq64 (Const64 [c]) (Const64 [d])) 9447 // cond: 9448 // result: (ConstBool [b2i(c <= d)]) 9449 for { 9450 v_0 := v.Args[0] 9451 if v_0.Op != OpConst64 { 9452 break 9453 } 9454 c := v_0.AuxInt 9455 v_1 := v.Args[1] 9456 if v_1.Op != OpConst64 { 9457 break 9458 } 9459 d := v_1.AuxInt 9460 v.reset(OpConstBool) 9461 v.AuxInt = b2i(c <= d) 9462 return true 9463 } 9464 return false 9465 } 9466 func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { 9467 // match: (Leq64U (Const64 [c]) (Const64 [d])) 9468 // cond: 9469 // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) 9470 for { 9471 v_0 := v.Args[0] 9472 if v_0.Op != OpConst64 { 9473 break 9474 } 9475 c := v_0.AuxInt 9476 v_1 := v.Args[1] 9477 if v_1.Op != OpConst64 { 9478 break 9479 } 9480 d := v_1.AuxInt 9481 v.reset(OpConstBool) 9482 v.AuxInt = b2i(uint64(c) <= uint64(d)) 9483 return true 9484 } 9485 return false 9486 } 9487 func rewriteValuegeneric_OpLeq8_0(v *Value) bool { 9488 // match: (Leq8 (Const8 [c]) (Const8 [d])) 9489 // cond: 9490 // result: (ConstBool [b2i(c <= d)]) 9491 for { 9492 v_0 := v.Args[0] 9493 if v_0.Op != OpConst8 { 9494 break 9495 } 9496 c := v_0.AuxInt 9497 v_1 := v.Args[1] 9498 if v_1.Op != OpConst8 { 9499 break 9500 } 9501 d := v_1.AuxInt 9502 v.reset(OpConstBool) 9503 v.AuxInt = b2i(c <= d) 9504 return true 9505 } 9506 return false 9507 } 9508 func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { 9509 // match: (Leq8U (Const8 [c]) (Const8 [d])) 9510 // cond: 9511 // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) 9512 for { 9513 v_0 := v.Args[0] 9514 if v_0.Op != OpConst8 { 9515 break 9516 } 9517 c := v_0.AuxInt 9518 v_1 := v.Args[1] 9519 if v_1.Op != OpConst8 { 9520 break 9521 } 9522 d := v_1.AuxInt 9523 v.reset(OpConstBool) 9524 v.AuxInt = b2i(uint8(c) <= uint8(d)) 9525 return true 9526 } 9527 return false 9528 } 9529 func rewriteValuegeneric_OpLess16_0(v *Value) bool { 9530 // match: (Less16 (Const16 [c]) (Const16 [d])) 9531 // cond: 9532 // result: (ConstBool [b2i(c < d)]) 9533 for { 9534 v_0 := v.Args[0] 9535 if v_0.Op != OpConst16 { 9536 break 9537 } 9538 c := v_0.AuxInt 9539 v_1 := v.Args[1] 9540 if v_1.Op != OpConst16 { 9541 break 9542 } 9543 d := v_1.AuxInt 9544 v.reset(OpConstBool) 9545 v.AuxInt = b2i(c < d) 9546 return true 9547 } 9548 return false 9549 } 9550 func rewriteValuegeneric_OpLess16U_0(v *Value) bool { 9551 // match: (Less16U (Const16 [c]) (Const16 [d])) 9552 // cond: 9553 // result: (ConstBool [b2i(uint16(c) < uint16(d))]) 9554 for { 9555 v_0 := v.Args[0] 9556 if v_0.Op != OpConst16 { 9557 break 9558 } 9559 c := v_0.AuxInt 9560 v_1 := v.Args[1] 9561 if v_1.Op != OpConst16 { 9562 break 9563 } 9564 d := v_1.AuxInt 9565 v.reset(OpConstBool) 9566 v.AuxInt = b2i(uint16(c) < uint16(d)) 9567 return true 9568 } 9569 return false 9570 } 9571 func rewriteValuegeneric_OpLess32_0(v *Value) bool { 9572 // match: (Less32 (Const32 [c]) (Const32 [d])) 9573 // cond: 9574 // result: (ConstBool [b2i(c < d)]) 9575 for { 9576 v_0 := v.Args[0] 9577 if v_0.Op != OpConst32 { 9578 break 9579 } 9580 c := v_0.AuxInt 9581 v_1 := v.Args[1] 9582 if v_1.Op != OpConst32 { 9583 break 9584 } 9585 d := v_1.AuxInt 9586 v.reset(OpConstBool) 9587 v.AuxInt = b2i(c < d) 9588 return true 9589 } 9590 return false 9591 } 9592 func rewriteValuegeneric_OpLess32U_0(v *Value) bool { 9593 // match: (Less32U (Const32 [c]) (Const32 [d])) 9594 // cond: 9595 // result: (ConstBool [b2i(uint32(c) < uint32(d))]) 9596 for { 9597 v_0 := v.Args[0] 9598 if v_0.Op != OpConst32 { 9599 break 9600 } 9601 c := v_0.AuxInt 9602 v_1 := v.Args[1] 9603 if v_1.Op != OpConst32 { 9604 break 9605 } 9606 d := v_1.AuxInt 9607 v.reset(OpConstBool) 9608 v.AuxInt = b2i(uint32(c) < uint32(d)) 9609 return true 9610 } 9611 return false 9612 } 9613 func rewriteValuegeneric_OpLess64_0(v *Value) bool { 9614 // match: (Less64 (Const64 [c]) (Const64 [d])) 9615 // cond: 9616 // result: (ConstBool [b2i(c < d)]) 9617 for { 9618 v_0 := v.Args[0] 9619 if v_0.Op != OpConst64 { 9620 break 9621 } 9622 c := v_0.AuxInt 9623 v_1 := v.Args[1] 9624 if v_1.Op != OpConst64 { 9625 break 9626 } 9627 d := v_1.AuxInt 9628 v.reset(OpConstBool) 9629 v.AuxInt = b2i(c < d) 9630 return true 9631 } 9632 return false 9633 } 9634 func rewriteValuegeneric_OpLess64U_0(v *Value) bool { 9635 // match: (Less64U (Const64 [c]) (Const64 [d])) 9636 // cond: 9637 // result: (ConstBool [b2i(uint64(c) < uint64(d))]) 9638 for { 9639 v_0 := v.Args[0] 9640 if v_0.Op != OpConst64 { 9641 break 9642 } 9643 c := v_0.AuxInt 9644 v_1 := v.Args[1] 9645 if v_1.Op != OpConst64 { 9646 break 9647 } 9648 d := v_1.AuxInt 9649 v.reset(OpConstBool) 9650 v.AuxInt = b2i(uint64(c) < uint64(d)) 9651 return true 9652 } 9653 return false 9654 } 9655 func rewriteValuegeneric_OpLess8_0(v *Value) bool { 9656 // match: (Less8 (Const8 [c]) (Const8 [d])) 9657 // cond: 9658 // result: (ConstBool [b2i(c < d)]) 9659 for { 9660 v_0 := v.Args[0] 9661 if v_0.Op != OpConst8 { 9662 break 9663 } 9664 c := v_0.AuxInt 9665 v_1 := v.Args[1] 9666 if v_1.Op != OpConst8 { 9667 break 9668 } 9669 d := v_1.AuxInt 9670 v.reset(OpConstBool) 9671 v.AuxInt = b2i(c < d) 9672 return true 9673 } 9674 return false 9675 } 9676 func rewriteValuegeneric_OpLess8U_0(v *Value) bool { 9677 // match: (Less8U (Const8 [c]) (Const8 [d])) 9678 // cond: 9679 // result: (ConstBool [b2i(uint8(c) < uint8(d))]) 9680 for { 9681 v_0 := v.Args[0] 9682 if v_0.Op != OpConst8 { 9683 break 9684 } 9685 c := v_0.AuxInt 9686 v_1 := v.Args[1] 9687 if v_1.Op != OpConst8 { 9688 break 9689 } 9690 d := v_1.AuxInt 9691 v.reset(OpConstBool) 9692 v.AuxInt = b2i(uint8(c) < uint8(d)) 9693 return true 9694 } 9695 return false 9696 } 9697 func rewriteValuegeneric_OpLoad_0(v *Value) bool { 9698 b := v.Block 9699 _ = b 9700 fe := b.Func.fe 9701 _ = fe 9702 // match: (Load <t1> p1 (Store {t2} p2 x _)) 9703 // cond: isSamePtr(p1,p2) && t1.Compare(x.Type)==CMPeq && t1.Size() == t2.(Type).Size() 9704 // result: x 9705 for { 9706 t1 := v.Type 9707 p1 := v.Args[0] 9708 v_1 := v.Args[1] 9709 if v_1.Op != OpStore { 9710 break 9711 } 9712 t2 := v_1.Aux 9713 p2 := v_1.Args[0] 9714 x := v_1.Args[1] 9715 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == CMPeq && t1.Size() == t2.(Type).Size()) { 9716 break 9717 } 9718 v.reset(OpCopy) 9719 v.Type = x.Type 9720 v.AddArg(x) 9721 return true 9722 } 9723 // match: (Load <t> _ _) 9724 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 9725 // result: (StructMake0) 9726 for { 9727 t := v.Type 9728 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 9729 break 9730 } 9731 v.reset(OpStructMake0) 9732 return true 9733 } 9734 // match: (Load <t> ptr mem) 9735 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 9736 // result: (StructMake1 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem)) 9737 for { 9738 t := v.Type 9739 ptr := v.Args[0] 9740 mem := v.Args[1] 9741 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 9742 break 9743 } 9744 v.reset(OpStructMake1) 9745 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 9746 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 9747 v1.AuxInt = 0 9748 v1.AddArg(ptr) 9749 v0.AddArg(v1) 9750 v0.AddArg(mem) 9751 v.AddArg(v0) 9752 return true 9753 } 9754 // match: (Load <t> ptr mem) 9755 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 9756 // result: (StructMake2 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem)) 9757 for { 9758 t := v.Type 9759 ptr := v.Args[0] 9760 mem := v.Args[1] 9761 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 9762 break 9763 } 9764 v.reset(OpStructMake2) 9765 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 9766 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 9767 v1.AuxInt = 0 9768 v1.AddArg(ptr) 9769 v0.AddArg(v1) 9770 v0.AddArg(mem) 9771 v.AddArg(v0) 9772 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 9773 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 9774 v3.AuxInt = t.FieldOff(1) 9775 v3.AddArg(ptr) 9776 v2.AddArg(v3) 9777 v2.AddArg(mem) 9778 v.AddArg(v2) 9779 return true 9780 } 9781 // match: (Load <t> ptr mem) 9782 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 9783 // result: (StructMake3 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem) (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem)) 9784 for { 9785 t := v.Type 9786 ptr := v.Args[0] 9787 mem := v.Args[1] 9788 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 9789 break 9790 } 9791 v.reset(OpStructMake3) 9792 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 9793 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 9794 v1.AuxInt = 0 9795 v1.AddArg(ptr) 9796 v0.AddArg(v1) 9797 v0.AddArg(mem) 9798 v.AddArg(v0) 9799 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 9800 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 9801 v3.AuxInt = t.FieldOff(1) 9802 v3.AddArg(ptr) 9803 v2.AddArg(v3) 9804 v2.AddArg(mem) 9805 v.AddArg(v2) 9806 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 9807 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 9808 v5.AuxInt = t.FieldOff(2) 9809 v5.AddArg(ptr) 9810 v4.AddArg(v5) 9811 v4.AddArg(mem) 9812 v.AddArg(v4) 9813 return true 9814 } 9815 // match: (Load <t> ptr mem) 9816 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 9817 // result: (StructMake4 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem) (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem) (Load <t.FieldType(3)> (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] ptr) mem)) 9818 for { 9819 t := v.Type 9820 ptr := v.Args[0] 9821 mem := v.Args[1] 9822 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 9823 break 9824 } 9825 v.reset(OpStructMake4) 9826 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 9827 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 9828 v1.AuxInt = 0 9829 v1.AddArg(ptr) 9830 v0.AddArg(v1) 9831 v0.AddArg(mem) 9832 v.AddArg(v0) 9833 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 9834 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 9835 v3.AuxInt = t.FieldOff(1) 9836 v3.AddArg(ptr) 9837 v2.AddArg(v3) 9838 v2.AddArg(mem) 9839 v.AddArg(v2) 9840 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 9841 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 9842 v5.AuxInt = t.FieldOff(2) 9843 v5.AddArg(ptr) 9844 v4.AddArg(v5) 9845 v4.AddArg(mem) 9846 v.AddArg(v4) 9847 v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) 9848 v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 9849 v7.AuxInt = t.FieldOff(3) 9850 v7.AddArg(ptr) 9851 v6.AddArg(v7) 9852 v6.AddArg(mem) 9853 v.AddArg(v6) 9854 return true 9855 } 9856 // match: (Load <t> _ _) 9857 // cond: t.IsArray() && t.NumElem() == 0 9858 // result: (ArrayMake0) 9859 for { 9860 t := v.Type 9861 if !(t.IsArray() && t.NumElem() == 0) { 9862 break 9863 } 9864 v.reset(OpArrayMake0) 9865 return true 9866 } 9867 // match: (Load <t> ptr mem) 9868 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 9869 // result: (ArrayMake1 (Load <t.ElemType()> ptr mem)) 9870 for { 9871 t := v.Type 9872 ptr := v.Args[0] 9873 mem := v.Args[1] 9874 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 9875 break 9876 } 9877 v.reset(OpArrayMake1) 9878 v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType()) 9879 v0.AddArg(ptr) 9880 v0.AddArg(mem) 9881 v.AddArg(v0) 9882 return true 9883 } 9884 return false 9885 } 9886 func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { 9887 b := v.Block 9888 _ = b 9889 // match: (Lsh16x16 <t> x (Const16 [c])) 9890 // cond: 9891 // result: (Lsh16x64 x (Const64 <t> [int64(uint16(c))])) 9892 for { 9893 t := v.Type 9894 x := v.Args[0] 9895 v_1 := v.Args[1] 9896 if v_1.Op != OpConst16 { 9897 break 9898 } 9899 c := v_1.AuxInt 9900 v.reset(OpLsh16x64) 9901 v.AddArg(x) 9902 v0 := b.NewValue0(v.Pos, OpConst64, t) 9903 v0.AuxInt = int64(uint16(c)) 9904 v.AddArg(v0) 9905 return true 9906 } 9907 // match: (Lsh16x16 (Const16 [0]) _) 9908 // cond: 9909 // result: (Const16 [0]) 9910 for { 9911 v_0 := v.Args[0] 9912 if v_0.Op != OpConst16 { 9913 break 9914 } 9915 if v_0.AuxInt != 0 { 9916 break 9917 } 9918 v.reset(OpConst16) 9919 v.AuxInt = 0 9920 return true 9921 } 9922 return false 9923 } 9924 func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { 9925 b := v.Block 9926 _ = b 9927 // match: (Lsh16x32 <t> x (Const32 [c])) 9928 // cond: 9929 // result: (Lsh16x64 x (Const64 <t> [int64(uint32(c))])) 9930 for { 9931 t := v.Type 9932 x := v.Args[0] 9933 v_1 := v.Args[1] 9934 if v_1.Op != OpConst32 { 9935 break 9936 } 9937 c := v_1.AuxInt 9938 v.reset(OpLsh16x64) 9939 v.AddArg(x) 9940 v0 := b.NewValue0(v.Pos, OpConst64, t) 9941 v0.AuxInt = int64(uint32(c)) 9942 v.AddArg(v0) 9943 return true 9944 } 9945 // match: (Lsh16x32 (Const16 [0]) _) 9946 // cond: 9947 // result: (Const16 [0]) 9948 for { 9949 v_0 := v.Args[0] 9950 if v_0.Op != OpConst16 { 9951 break 9952 } 9953 if v_0.AuxInt != 0 { 9954 break 9955 } 9956 v.reset(OpConst16) 9957 v.AuxInt = 0 9958 return true 9959 } 9960 return false 9961 } 9962 func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { 9963 b := v.Block 9964 _ = b 9965 types := &b.Func.Config.Types 9966 _ = types 9967 // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) 9968 // cond: 9969 // result: (Const16 [int64(int16(c) << uint64(d))]) 9970 for { 9971 v_0 := v.Args[0] 9972 if v_0.Op != OpConst16 { 9973 break 9974 } 9975 c := v_0.AuxInt 9976 v_1 := v.Args[1] 9977 if v_1.Op != OpConst64 { 9978 break 9979 } 9980 d := v_1.AuxInt 9981 v.reset(OpConst16) 9982 v.AuxInt = int64(int16(c) << uint64(d)) 9983 return true 9984 } 9985 // match: (Lsh16x64 x (Const64 [0])) 9986 // cond: 9987 // result: x 9988 for { 9989 x := v.Args[0] 9990 v_1 := v.Args[1] 9991 if v_1.Op != OpConst64 { 9992 break 9993 } 9994 if v_1.AuxInt != 0 { 9995 break 9996 } 9997 v.reset(OpCopy) 9998 v.Type = x.Type 9999 v.AddArg(x) 10000 return true 10001 } 10002 // match: (Lsh16x64 (Const16 [0]) _) 10003 // cond: 10004 // result: (Const16 [0]) 10005 for { 10006 v_0 := v.Args[0] 10007 if v_0.Op != OpConst16 { 10008 break 10009 } 10010 if v_0.AuxInt != 0 { 10011 break 10012 } 10013 v.reset(OpConst16) 10014 v.AuxInt = 0 10015 return true 10016 } 10017 // match: (Lsh16x64 _ (Const64 [c])) 10018 // cond: uint64(c) >= 16 10019 // result: (Const16 [0]) 10020 for { 10021 v_1 := v.Args[1] 10022 if v_1.Op != OpConst64 { 10023 break 10024 } 10025 c := v_1.AuxInt 10026 if !(uint64(c) >= 16) { 10027 break 10028 } 10029 v.reset(OpConst16) 10030 v.AuxInt = 0 10031 return true 10032 } 10033 // match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d])) 10034 // cond: !uaddOvf(c,d) 10035 // result: (Lsh16x64 x (Const64 <t> [c+d])) 10036 for { 10037 t := v.Type 10038 v_0 := v.Args[0] 10039 if v_0.Op != OpLsh16x64 { 10040 break 10041 } 10042 x := v_0.Args[0] 10043 v_0_1 := v_0.Args[1] 10044 if v_0_1.Op != OpConst64 { 10045 break 10046 } 10047 c := v_0_1.AuxInt 10048 v_1 := v.Args[1] 10049 if v_1.Op != OpConst64 { 10050 break 10051 } 10052 d := v_1.AuxInt 10053 if !(!uaddOvf(c, d)) { 10054 break 10055 } 10056 v.reset(OpLsh16x64) 10057 v.AddArg(x) 10058 v0 := b.NewValue0(v.Pos, OpConst64, t) 10059 v0.AuxInt = c + d 10060 v.AddArg(v0) 10061 return true 10062 } 10063 // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 10064 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 10065 // result: (Lsh16x64 x (Const64 <types.UInt64> [c1-c2+c3])) 10066 for { 10067 v_0 := v.Args[0] 10068 if v_0.Op != OpRsh16Ux64 { 10069 break 10070 } 10071 v_0_0 := v_0.Args[0] 10072 if v_0_0.Op != OpLsh16x64 { 10073 break 10074 } 10075 x := v_0_0.Args[0] 10076 v_0_0_1 := v_0_0.Args[1] 10077 if v_0_0_1.Op != OpConst64 { 10078 break 10079 } 10080 c1 := v_0_0_1.AuxInt 10081 v_0_1 := v_0.Args[1] 10082 if v_0_1.Op != OpConst64 { 10083 break 10084 } 10085 c2 := v_0_1.AuxInt 10086 v_1 := v.Args[1] 10087 if v_1.Op != OpConst64 { 10088 break 10089 } 10090 c3 := v_1.AuxInt 10091 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 10092 break 10093 } 10094 v.reset(OpLsh16x64) 10095 v.AddArg(x) 10096 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 10097 v0.AuxInt = c1 - c2 + c3 10098 v.AddArg(v0) 10099 return true 10100 } 10101 return false 10102 } 10103 func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { 10104 b := v.Block 10105 _ = b 10106 // match: (Lsh16x8 <t> x (Const8 [c])) 10107 // cond: 10108 // result: (Lsh16x64 x (Const64 <t> [int64(uint8(c))])) 10109 for { 10110 t := v.Type 10111 x := v.Args[0] 10112 v_1 := v.Args[1] 10113 if v_1.Op != OpConst8 { 10114 break 10115 } 10116 c := v_1.AuxInt 10117 v.reset(OpLsh16x64) 10118 v.AddArg(x) 10119 v0 := b.NewValue0(v.Pos, OpConst64, t) 10120 v0.AuxInt = int64(uint8(c)) 10121 v.AddArg(v0) 10122 return true 10123 } 10124 // match: (Lsh16x8 (Const16 [0]) _) 10125 // cond: 10126 // result: (Const16 [0]) 10127 for { 10128 v_0 := v.Args[0] 10129 if v_0.Op != OpConst16 { 10130 break 10131 } 10132 if v_0.AuxInt != 0 { 10133 break 10134 } 10135 v.reset(OpConst16) 10136 v.AuxInt = 0 10137 return true 10138 } 10139 return false 10140 } 10141 func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { 10142 b := v.Block 10143 _ = b 10144 // match: (Lsh32x16 <t> x (Const16 [c])) 10145 // cond: 10146 // result: (Lsh32x64 x (Const64 <t> [int64(uint16(c))])) 10147 for { 10148 t := v.Type 10149 x := v.Args[0] 10150 v_1 := v.Args[1] 10151 if v_1.Op != OpConst16 { 10152 break 10153 } 10154 c := v_1.AuxInt 10155 v.reset(OpLsh32x64) 10156 v.AddArg(x) 10157 v0 := b.NewValue0(v.Pos, OpConst64, t) 10158 v0.AuxInt = int64(uint16(c)) 10159 v.AddArg(v0) 10160 return true 10161 } 10162 // match: (Lsh32x16 (Const32 [0]) _) 10163 // cond: 10164 // result: (Const32 [0]) 10165 for { 10166 v_0 := v.Args[0] 10167 if v_0.Op != OpConst32 { 10168 break 10169 } 10170 if v_0.AuxInt != 0 { 10171 break 10172 } 10173 v.reset(OpConst32) 10174 v.AuxInt = 0 10175 return true 10176 } 10177 return false 10178 } 10179 func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { 10180 b := v.Block 10181 _ = b 10182 // match: (Lsh32x32 <t> x (Const32 [c])) 10183 // cond: 10184 // result: (Lsh32x64 x (Const64 <t> [int64(uint32(c))])) 10185 for { 10186 t := v.Type 10187 x := v.Args[0] 10188 v_1 := v.Args[1] 10189 if v_1.Op != OpConst32 { 10190 break 10191 } 10192 c := v_1.AuxInt 10193 v.reset(OpLsh32x64) 10194 v.AddArg(x) 10195 v0 := b.NewValue0(v.Pos, OpConst64, t) 10196 v0.AuxInt = int64(uint32(c)) 10197 v.AddArg(v0) 10198 return true 10199 } 10200 // match: (Lsh32x32 (Const32 [0]) _) 10201 // cond: 10202 // result: (Const32 [0]) 10203 for { 10204 v_0 := v.Args[0] 10205 if v_0.Op != OpConst32 { 10206 break 10207 } 10208 if v_0.AuxInt != 0 { 10209 break 10210 } 10211 v.reset(OpConst32) 10212 v.AuxInt = 0 10213 return true 10214 } 10215 return false 10216 } 10217 func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { 10218 b := v.Block 10219 _ = b 10220 types := &b.Func.Config.Types 10221 _ = types 10222 // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) 10223 // cond: 10224 // result: (Const32 [int64(int32(c) << uint64(d))]) 10225 for { 10226 v_0 := v.Args[0] 10227 if v_0.Op != OpConst32 { 10228 break 10229 } 10230 c := v_0.AuxInt 10231 v_1 := v.Args[1] 10232 if v_1.Op != OpConst64 { 10233 break 10234 } 10235 d := v_1.AuxInt 10236 v.reset(OpConst32) 10237 v.AuxInt = int64(int32(c) << uint64(d)) 10238 return true 10239 } 10240 // match: (Lsh32x64 x (Const64 [0])) 10241 // cond: 10242 // result: x 10243 for { 10244 x := v.Args[0] 10245 v_1 := v.Args[1] 10246 if v_1.Op != OpConst64 { 10247 break 10248 } 10249 if v_1.AuxInt != 0 { 10250 break 10251 } 10252 v.reset(OpCopy) 10253 v.Type = x.Type 10254 v.AddArg(x) 10255 return true 10256 } 10257 // match: (Lsh32x64 (Const32 [0]) _) 10258 // cond: 10259 // result: (Const32 [0]) 10260 for { 10261 v_0 := v.Args[0] 10262 if v_0.Op != OpConst32 { 10263 break 10264 } 10265 if v_0.AuxInt != 0 { 10266 break 10267 } 10268 v.reset(OpConst32) 10269 v.AuxInt = 0 10270 return true 10271 } 10272 // match: (Lsh32x64 _ (Const64 [c])) 10273 // cond: uint64(c) >= 32 10274 // result: (Const32 [0]) 10275 for { 10276 v_1 := v.Args[1] 10277 if v_1.Op != OpConst64 { 10278 break 10279 } 10280 c := v_1.AuxInt 10281 if !(uint64(c) >= 32) { 10282 break 10283 } 10284 v.reset(OpConst32) 10285 v.AuxInt = 0 10286 return true 10287 } 10288 // match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d])) 10289 // cond: !uaddOvf(c,d) 10290 // result: (Lsh32x64 x (Const64 <t> [c+d])) 10291 for { 10292 t := v.Type 10293 v_0 := v.Args[0] 10294 if v_0.Op != OpLsh32x64 { 10295 break 10296 } 10297 x := v_0.Args[0] 10298 v_0_1 := v_0.Args[1] 10299 if v_0_1.Op != OpConst64 { 10300 break 10301 } 10302 c := v_0_1.AuxInt 10303 v_1 := v.Args[1] 10304 if v_1.Op != OpConst64 { 10305 break 10306 } 10307 d := v_1.AuxInt 10308 if !(!uaddOvf(c, d)) { 10309 break 10310 } 10311 v.reset(OpLsh32x64) 10312 v.AddArg(x) 10313 v0 := b.NewValue0(v.Pos, OpConst64, t) 10314 v0.AuxInt = c + d 10315 v.AddArg(v0) 10316 return true 10317 } 10318 // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 10319 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 10320 // result: (Lsh32x64 x (Const64 <types.UInt64> [c1-c2+c3])) 10321 for { 10322 v_0 := v.Args[0] 10323 if v_0.Op != OpRsh32Ux64 { 10324 break 10325 } 10326 v_0_0 := v_0.Args[0] 10327 if v_0_0.Op != OpLsh32x64 { 10328 break 10329 } 10330 x := v_0_0.Args[0] 10331 v_0_0_1 := v_0_0.Args[1] 10332 if v_0_0_1.Op != OpConst64 { 10333 break 10334 } 10335 c1 := v_0_0_1.AuxInt 10336 v_0_1 := v_0.Args[1] 10337 if v_0_1.Op != OpConst64 { 10338 break 10339 } 10340 c2 := v_0_1.AuxInt 10341 v_1 := v.Args[1] 10342 if v_1.Op != OpConst64 { 10343 break 10344 } 10345 c3 := v_1.AuxInt 10346 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 10347 break 10348 } 10349 v.reset(OpLsh32x64) 10350 v.AddArg(x) 10351 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 10352 v0.AuxInt = c1 - c2 + c3 10353 v.AddArg(v0) 10354 return true 10355 } 10356 return false 10357 } 10358 func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { 10359 b := v.Block 10360 _ = b 10361 // match: (Lsh32x8 <t> x (Const8 [c])) 10362 // cond: 10363 // result: (Lsh32x64 x (Const64 <t> [int64(uint8(c))])) 10364 for { 10365 t := v.Type 10366 x := v.Args[0] 10367 v_1 := v.Args[1] 10368 if v_1.Op != OpConst8 { 10369 break 10370 } 10371 c := v_1.AuxInt 10372 v.reset(OpLsh32x64) 10373 v.AddArg(x) 10374 v0 := b.NewValue0(v.Pos, OpConst64, t) 10375 v0.AuxInt = int64(uint8(c)) 10376 v.AddArg(v0) 10377 return true 10378 } 10379 // match: (Lsh32x8 (Const32 [0]) _) 10380 // cond: 10381 // result: (Const32 [0]) 10382 for { 10383 v_0 := v.Args[0] 10384 if v_0.Op != OpConst32 { 10385 break 10386 } 10387 if v_0.AuxInt != 0 { 10388 break 10389 } 10390 v.reset(OpConst32) 10391 v.AuxInt = 0 10392 return true 10393 } 10394 return false 10395 } 10396 func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { 10397 b := v.Block 10398 _ = b 10399 // match: (Lsh64x16 <t> x (Const16 [c])) 10400 // cond: 10401 // result: (Lsh64x64 x (Const64 <t> [int64(uint16(c))])) 10402 for { 10403 t := v.Type 10404 x := v.Args[0] 10405 v_1 := v.Args[1] 10406 if v_1.Op != OpConst16 { 10407 break 10408 } 10409 c := v_1.AuxInt 10410 v.reset(OpLsh64x64) 10411 v.AddArg(x) 10412 v0 := b.NewValue0(v.Pos, OpConst64, t) 10413 v0.AuxInt = int64(uint16(c)) 10414 v.AddArg(v0) 10415 return true 10416 } 10417 // match: (Lsh64x16 (Const64 [0]) _) 10418 // cond: 10419 // result: (Const64 [0]) 10420 for { 10421 v_0 := v.Args[0] 10422 if v_0.Op != OpConst64 { 10423 break 10424 } 10425 if v_0.AuxInt != 0 { 10426 break 10427 } 10428 v.reset(OpConst64) 10429 v.AuxInt = 0 10430 return true 10431 } 10432 return false 10433 } 10434 func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { 10435 b := v.Block 10436 _ = b 10437 // match: (Lsh64x32 <t> x (Const32 [c])) 10438 // cond: 10439 // result: (Lsh64x64 x (Const64 <t> [int64(uint32(c))])) 10440 for { 10441 t := v.Type 10442 x := v.Args[0] 10443 v_1 := v.Args[1] 10444 if v_1.Op != OpConst32 { 10445 break 10446 } 10447 c := v_1.AuxInt 10448 v.reset(OpLsh64x64) 10449 v.AddArg(x) 10450 v0 := b.NewValue0(v.Pos, OpConst64, t) 10451 v0.AuxInt = int64(uint32(c)) 10452 v.AddArg(v0) 10453 return true 10454 } 10455 // match: (Lsh64x32 (Const64 [0]) _) 10456 // cond: 10457 // result: (Const64 [0]) 10458 for { 10459 v_0 := v.Args[0] 10460 if v_0.Op != OpConst64 { 10461 break 10462 } 10463 if v_0.AuxInt != 0 { 10464 break 10465 } 10466 v.reset(OpConst64) 10467 v.AuxInt = 0 10468 return true 10469 } 10470 return false 10471 } 10472 func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { 10473 b := v.Block 10474 _ = b 10475 types := &b.Func.Config.Types 10476 _ = types 10477 // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) 10478 // cond: 10479 // result: (Const64 [c << uint64(d)]) 10480 for { 10481 v_0 := v.Args[0] 10482 if v_0.Op != OpConst64 { 10483 break 10484 } 10485 c := v_0.AuxInt 10486 v_1 := v.Args[1] 10487 if v_1.Op != OpConst64 { 10488 break 10489 } 10490 d := v_1.AuxInt 10491 v.reset(OpConst64) 10492 v.AuxInt = c << uint64(d) 10493 return true 10494 } 10495 // match: (Lsh64x64 x (Const64 [0])) 10496 // cond: 10497 // result: x 10498 for { 10499 x := v.Args[0] 10500 v_1 := v.Args[1] 10501 if v_1.Op != OpConst64 { 10502 break 10503 } 10504 if v_1.AuxInt != 0 { 10505 break 10506 } 10507 v.reset(OpCopy) 10508 v.Type = x.Type 10509 v.AddArg(x) 10510 return true 10511 } 10512 // match: (Lsh64x64 (Const64 [0]) _) 10513 // cond: 10514 // result: (Const64 [0]) 10515 for { 10516 v_0 := v.Args[0] 10517 if v_0.Op != OpConst64 { 10518 break 10519 } 10520 if v_0.AuxInt != 0 { 10521 break 10522 } 10523 v.reset(OpConst64) 10524 v.AuxInt = 0 10525 return true 10526 } 10527 // match: (Lsh64x64 _ (Const64 [c])) 10528 // cond: uint64(c) >= 64 10529 // result: (Const64 [0]) 10530 for { 10531 v_1 := v.Args[1] 10532 if v_1.Op != OpConst64 { 10533 break 10534 } 10535 c := v_1.AuxInt 10536 if !(uint64(c) >= 64) { 10537 break 10538 } 10539 v.reset(OpConst64) 10540 v.AuxInt = 0 10541 return true 10542 } 10543 // match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d])) 10544 // cond: !uaddOvf(c,d) 10545 // result: (Lsh64x64 x (Const64 <t> [c+d])) 10546 for { 10547 t := v.Type 10548 v_0 := v.Args[0] 10549 if v_0.Op != OpLsh64x64 { 10550 break 10551 } 10552 x := v_0.Args[0] 10553 v_0_1 := v_0.Args[1] 10554 if v_0_1.Op != OpConst64 { 10555 break 10556 } 10557 c := v_0_1.AuxInt 10558 v_1 := v.Args[1] 10559 if v_1.Op != OpConst64 { 10560 break 10561 } 10562 d := v_1.AuxInt 10563 if !(!uaddOvf(c, d)) { 10564 break 10565 } 10566 v.reset(OpLsh64x64) 10567 v.AddArg(x) 10568 v0 := b.NewValue0(v.Pos, OpConst64, t) 10569 v0.AuxInt = c + d 10570 v.AddArg(v0) 10571 return true 10572 } 10573 // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 10574 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 10575 // result: (Lsh64x64 x (Const64 <types.UInt64> [c1-c2+c3])) 10576 for { 10577 v_0 := v.Args[0] 10578 if v_0.Op != OpRsh64Ux64 { 10579 break 10580 } 10581 v_0_0 := v_0.Args[0] 10582 if v_0_0.Op != OpLsh64x64 { 10583 break 10584 } 10585 x := v_0_0.Args[0] 10586 v_0_0_1 := v_0_0.Args[1] 10587 if v_0_0_1.Op != OpConst64 { 10588 break 10589 } 10590 c1 := v_0_0_1.AuxInt 10591 v_0_1 := v_0.Args[1] 10592 if v_0_1.Op != OpConst64 { 10593 break 10594 } 10595 c2 := v_0_1.AuxInt 10596 v_1 := v.Args[1] 10597 if v_1.Op != OpConst64 { 10598 break 10599 } 10600 c3 := v_1.AuxInt 10601 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 10602 break 10603 } 10604 v.reset(OpLsh64x64) 10605 v.AddArg(x) 10606 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 10607 v0.AuxInt = c1 - c2 + c3 10608 v.AddArg(v0) 10609 return true 10610 } 10611 return false 10612 } 10613 func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { 10614 b := v.Block 10615 _ = b 10616 // match: (Lsh64x8 <t> x (Const8 [c])) 10617 // cond: 10618 // result: (Lsh64x64 x (Const64 <t> [int64(uint8(c))])) 10619 for { 10620 t := v.Type 10621 x := v.Args[0] 10622 v_1 := v.Args[1] 10623 if v_1.Op != OpConst8 { 10624 break 10625 } 10626 c := v_1.AuxInt 10627 v.reset(OpLsh64x64) 10628 v.AddArg(x) 10629 v0 := b.NewValue0(v.Pos, OpConst64, t) 10630 v0.AuxInt = int64(uint8(c)) 10631 v.AddArg(v0) 10632 return true 10633 } 10634 // match: (Lsh64x8 (Const64 [0]) _) 10635 // cond: 10636 // result: (Const64 [0]) 10637 for { 10638 v_0 := v.Args[0] 10639 if v_0.Op != OpConst64 { 10640 break 10641 } 10642 if v_0.AuxInt != 0 { 10643 break 10644 } 10645 v.reset(OpConst64) 10646 v.AuxInt = 0 10647 return true 10648 } 10649 return false 10650 } 10651 func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { 10652 b := v.Block 10653 _ = b 10654 // match: (Lsh8x16 <t> x (Const16 [c])) 10655 // cond: 10656 // result: (Lsh8x64 x (Const64 <t> [int64(uint16(c))])) 10657 for { 10658 t := v.Type 10659 x := v.Args[0] 10660 v_1 := v.Args[1] 10661 if v_1.Op != OpConst16 { 10662 break 10663 } 10664 c := v_1.AuxInt 10665 v.reset(OpLsh8x64) 10666 v.AddArg(x) 10667 v0 := b.NewValue0(v.Pos, OpConst64, t) 10668 v0.AuxInt = int64(uint16(c)) 10669 v.AddArg(v0) 10670 return true 10671 } 10672 // match: (Lsh8x16 (Const8 [0]) _) 10673 // cond: 10674 // result: (Const8 [0]) 10675 for { 10676 v_0 := v.Args[0] 10677 if v_0.Op != OpConst8 { 10678 break 10679 } 10680 if v_0.AuxInt != 0 { 10681 break 10682 } 10683 v.reset(OpConst8) 10684 v.AuxInt = 0 10685 return true 10686 } 10687 return false 10688 } 10689 func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { 10690 b := v.Block 10691 _ = b 10692 // match: (Lsh8x32 <t> x (Const32 [c])) 10693 // cond: 10694 // result: (Lsh8x64 x (Const64 <t> [int64(uint32(c))])) 10695 for { 10696 t := v.Type 10697 x := v.Args[0] 10698 v_1 := v.Args[1] 10699 if v_1.Op != OpConst32 { 10700 break 10701 } 10702 c := v_1.AuxInt 10703 v.reset(OpLsh8x64) 10704 v.AddArg(x) 10705 v0 := b.NewValue0(v.Pos, OpConst64, t) 10706 v0.AuxInt = int64(uint32(c)) 10707 v.AddArg(v0) 10708 return true 10709 } 10710 // match: (Lsh8x32 (Const8 [0]) _) 10711 // cond: 10712 // result: (Const8 [0]) 10713 for { 10714 v_0 := v.Args[0] 10715 if v_0.Op != OpConst8 { 10716 break 10717 } 10718 if v_0.AuxInt != 0 { 10719 break 10720 } 10721 v.reset(OpConst8) 10722 v.AuxInt = 0 10723 return true 10724 } 10725 return false 10726 } 10727 func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { 10728 b := v.Block 10729 _ = b 10730 types := &b.Func.Config.Types 10731 _ = types 10732 // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) 10733 // cond: 10734 // result: (Const8 [int64(int8(c) << uint64(d))]) 10735 for { 10736 v_0 := v.Args[0] 10737 if v_0.Op != OpConst8 { 10738 break 10739 } 10740 c := v_0.AuxInt 10741 v_1 := v.Args[1] 10742 if v_1.Op != OpConst64 { 10743 break 10744 } 10745 d := v_1.AuxInt 10746 v.reset(OpConst8) 10747 v.AuxInt = int64(int8(c) << uint64(d)) 10748 return true 10749 } 10750 // match: (Lsh8x64 x (Const64 [0])) 10751 // cond: 10752 // result: x 10753 for { 10754 x := v.Args[0] 10755 v_1 := v.Args[1] 10756 if v_1.Op != OpConst64 { 10757 break 10758 } 10759 if v_1.AuxInt != 0 { 10760 break 10761 } 10762 v.reset(OpCopy) 10763 v.Type = x.Type 10764 v.AddArg(x) 10765 return true 10766 } 10767 // match: (Lsh8x64 (Const8 [0]) _) 10768 // cond: 10769 // result: (Const8 [0]) 10770 for { 10771 v_0 := v.Args[0] 10772 if v_0.Op != OpConst8 { 10773 break 10774 } 10775 if v_0.AuxInt != 0 { 10776 break 10777 } 10778 v.reset(OpConst8) 10779 v.AuxInt = 0 10780 return true 10781 } 10782 // match: (Lsh8x64 _ (Const64 [c])) 10783 // cond: uint64(c) >= 8 10784 // result: (Const8 [0]) 10785 for { 10786 v_1 := v.Args[1] 10787 if v_1.Op != OpConst64 { 10788 break 10789 } 10790 c := v_1.AuxInt 10791 if !(uint64(c) >= 8) { 10792 break 10793 } 10794 v.reset(OpConst8) 10795 v.AuxInt = 0 10796 return true 10797 } 10798 // match: (Lsh8x64 <t> (Lsh8x64 x (Const64 [c])) (Const64 [d])) 10799 // cond: !uaddOvf(c,d) 10800 // result: (Lsh8x64 x (Const64 <t> [c+d])) 10801 for { 10802 t := v.Type 10803 v_0 := v.Args[0] 10804 if v_0.Op != OpLsh8x64 { 10805 break 10806 } 10807 x := v_0.Args[0] 10808 v_0_1 := v_0.Args[1] 10809 if v_0_1.Op != OpConst64 { 10810 break 10811 } 10812 c := v_0_1.AuxInt 10813 v_1 := v.Args[1] 10814 if v_1.Op != OpConst64 { 10815 break 10816 } 10817 d := v_1.AuxInt 10818 if !(!uaddOvf(c, d)) { 10819 break 10820 } 10821 v.reset(OpLsh8x64) 10822 v.AddArg(x) 10823 v0 := b.NewValue0(v.Pos, OpConst64, t) 10824 v0.AuxInt = c + d 10825 v.AddArg(v0) 10826 return true 10827 } 10828 // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 10829 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 10830 // result: (Lsh8x64 x (Const64 <types.UInt64> [c1-c2+c3])) 10831 for { 10832 v_0 := v.Args[0] 10833 if v_0.Op != OpRsh8Ux64 { 10834 break 10835 } 10836 v_0_0 := v_0.Args[0] 10837 if v_0_0.Op != OpLsh8x64 { 10838 break 10839 } 10840 x := v_0_0.Args[0] 10841 v_0_0_1 := v_0_0.Args[1] 10842 if v_0_0_1.Op != OpConst64 { 10843 break 10844 } 10845 c1 := v_0_0_1.AuxInt 10846 v_0_1 := v_0.Args[1] 10847 if v_0_1.Op != OpConst64 { 10848 break 10849 } 10850 c2 := v_0_1.AuxInt 10851 v_1 := v.Args[1] 10852 if v_1.Op != OpConst64 { 10853 break 10854 } 10855 c3 := v_1.AuxInt 10856 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 10857 break 10858 } 10859 v.reset(OpLsh8x64) 10860 v.AddArg(x) 10861 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 10862 v0.AuxInt = c1 - c2 + c3 10863 v.AddArg(v0) 10864 return true 10865 } 10866 return false 10867 } 10868 func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { 10869 b := v.Block 10870 _ = b 10871 // match: (Lsh8x8 <t> x (Const8 [c])) 10872 // cond: 10873 // result: (Lsh8x64 x (Const64 <t> [int64(uint8(c))])) 10874 for { 10875 t := v.Type 10876 x := v.Args[0] 10877 v_1 := v.Args[1] 10878 if v_1.Op != OpConst8 { 10879 break 10880 } 10881 c := v_1.AuxInt 10882 v.reset(OpLsh8x64) 10883 v.AddArg(x) 10884 v0 := b.NewValue0(v.Pos, OpConst64, t) 10885 v0.AuxInt = int64(uint8(c)) 10886 v.AddArg(v0) 10887 return true 10888 } 10889 // match: (Lsh8x8 (Const8 [0]) _) 10890 // cond: 10891 // result: (Const8 [0]) 10892 for { 10893 v_0 := v.Args[0] 10894 if v_0.Op != OpConst8 { 10895 break 10896 } 10897 if v_0.AuxInt != 0 { 10898 break 10899 } 10900 v.reset(OpConst8) 10901 v.AuxInt = 0 10902 return true 10903 } 10904 return false 10905 } 10906 func rewriteValuegeneric_OpMod16_0(v *Value) bool { 10907 b := v.Block 10908 _ = b 10909 // match: (Mod16 (Const16 [c]) (Const16 [d])) 10910 // cond: d != 0 10911 // result: (Const16 [int64(int16(c % d))]) 10912 for { 10913 v_0 := v.Args[0] 10914 if v_0.Op != OpConst16 { 10915 break 10916 } 10917 c := v_0.AuxInt 10918 v_1 := v.Args[1] 10919 if v_1.Op != OpConst16 { 10920 break 10921 } 10922 d := v_1.AuxInt 10923 if !(d != 0) { 10924 break 10925 } 10926 v.reset(OpConst16) 10927 v.AuxInt = int64(int16(c % d)) 10928 return true 10929 } 10930 // match: (Mod16 <t> n (Const16 [c])) 10931 // cond: c < 0 && c != -1<<15 10932 // result: (Mod16 <t> n (Const16 <t> [-c])) 10933 for { 10934 t := v.Type 10935 n := v.Args[0] 10936 v_1 := v.Args[1] 10937 if v_1.Op != OpConst16 { 10938 break 10939 } 10940 c := v_1.AuxInt 10941 if !(c < 0 && c != -1<<15) { 10942 break 10943 } 10944 v.reset(OpMod16) 10945 v.Type = t 10946 v.AddArg(n) 10947 v0 := b.NewValue0(v.Pos, OpConst16, t) 10948 v0.AuxInt = -c 10949 v.AddArg(v0) 10950 return true 10951 } 10952 // match: (Mod16 <t> x (Const16 [c])) 10953 // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) 10954 // result: (Sub16 x (Mul16 <t> (Div16 <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 10955 for { 10956 t := v.Type 10957 x := v.Args[0] 10958 v_1 := v.Args[1] 10959 if v_1.Op != OpConst16 { 10960 break 10961 } 10962 c := v_1.AuxInt 10963 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { 10964 break 10965 } 10966 v.reset(OpSub16) 10967 v.AddArg(x) 10968 v0 := b.NewValue0(v.Pos, OpMul16, t) 10969 v1 := b.NewValue0(v.Pos, OpDiv16, t) 10970 v1.AddArg(x) 10971 v2 := b.NewValue0(v.Pos, OpConst16, t) 10972 v2.AuxInt = c 10973 v1.AddArg(v2) 10974 v0.AddArg(v1) 10975 v3 := b.NewValue0(v.Pos, OpConst16, t) 10976 v3.AuxInt = c 10977 v0.AddArg(v3) 10978 v.AddArg(v0) 10979 return true 10980 } 10981 return false 10982 } 10983 func rewriteValuegeneric_OpMod16u_0(v *Value) bool { 10984 b := v.Block 10985 _ = b 10986 // match: (Mod16u (Const16 [c]) (Const16 [d])) 10987 // cond: d != 0 10988 // result: (Const16 [int64(uint16(c) % uint16(d))]) 10989 for { 10990 v_0 := v.Args[0] 10991 if v_0.Op != OpConst16 { 10992 break 10993 } 10994 c := v_0.AuxInt 10995 v_1 := v.Args[1] 10996 if v_1.Op != OpConst16 { 10997 break 10998 } 10999 d := v_1.AuxInt 11000 if !(d != 0) { 11001 break 11002 } 11003 v.reset(OpConst16) 11004 v.AuxInt = int64(uint16(c) % uint16(d)) 11005 return true 11006 } 11007 // match: (Mod16u <t> n (Const16 [c])) 11008 // cond: isPowerOfTwo(c&0xffff) 11009 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 11010 for { 11011 t := v.Type 11012 n := v.Args[0] 11013 v_1 := v.Args[1] 11014 if v_1.Op != OpConst16 { 11015 break 11016 } 11017 c := v_1.AuxInt 11018 if !(isPowerOfTwo(c & 0xffff)) { 11019 break 11020 } 11021 v.reset(OpAnd16) 11022 v.AddArg(n) 11023 v0 := b.NewValue0(v.Pos, OpConst16, t) 11024 v0.AuxInt = (c & 0xffff) - 1 11025 v.AddArg(v0) 11026 return true 11027 } 11028 // match: (Mod16u <t> x (Const16 [c])) 11029 // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) 11030 // result: (Sub16 x (Mul16 <t> (Div16u <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 11031 for { 11032 t := v.Type 11033 x := v.Args[0] 11034 v_1 := v.Args[1] 11035 if v_1.Op != OpConst16 { 11036 break 11037 } 11038 c := v_1.AuxInt 11039 if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { 11040 break 11041 } 11042 v.reset(OpSub16) 11043 v.AddArg(x) 11044 v0 := b.NewValue0(v.Pos, OpMul16, t) 11045 v1 := b.NewValue0(v.Pos, OpDiv16u, t) 11046 v1.AddArg(x) 11047 v2 := b.NewValue0(v.Pos, OpConst16, t) 11048 v2.AuxInt = c 11049 v1.AddArg(v2) 11050 v0.AddArg(v1) 11051 v3 := b.NewValue0(v.Pos, OpConst16, t) 11052 v3.AuxInt = c 11053 v0.AddArg(v3) 11054 v.AddArg(v0) 11055 return true 11056 } 11057 return false 11058 } 11059 func rewriteValuegeneric_OpMod32_0(v *Value) bool { 11060 b := v.Block 11061 _ = b 11062 // match: (Mod32 (Const32 [c]) (Const32 [d])) 11063 // cond: d != 0 11064 // result: (Const32 [int64(int32(c % d))]) 11065 for { 11066 v_0 := v.Args[0] 11067 if v_0.Op != OpConst32 { 11068 break 11069 } 11070 c := v_0.AuxInt 11071 v_1 := v.Args[1] 11072 if v_1.Op != OpConst32 { 11073 break 11074 } 11075 d := v_1.AuxInt 11076 if !(d != 0) { 11077 break 11078 } 11079 v.reset(OpConst32) 11080 v.AuxInt = int64(int32(c % d)) 11081 return true 11082 } 11083 // match: (Mod32 <t> n (Const32 [c])) 11084 // cond: c < 0 && c != -1<<31 11085 // result: (Mod32 <t> n (Const32 <t> [-c])) 11086 for { 11087 t := v.Type 11088 n := v.Args[0] 11089 v_1 := v.Args[1] 11090 if v_1.Op != OpConst32 { 11091 break 11092 } 11093 c := v_1.AuxInt 11094 if !(c < 0 && c != -1<<31) { 11095 break 11096 } 11097 v.reset(OpMod32) 11098 v.Type = t 11099 v.AddArg(n) 11100 v0 := b.NewValue0(v.Pos, OpConst32, t) 11101 v0.AuxInt = -c 11102 v.AddArg(v0) 11103 return true 11104 } 11105 // match: (Mod32 <t> x (Const32 [c])) 11106 // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) 11107 // result: (Sub32 x (Mul32 <t> (Div32 <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 11108 for { 11109 t := v.Type 11110 x := v.Args[0] 11111 v_1 := v.Args[1] 11112 if v_1.Op != OpConst32 { 11113 break 11114 } 11115 c := v_1.AuxInt 11116 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { 11117 break 11118 } 11119 v.reset(OpSub32) 11120 v.AddArg(x) 11121 v0 := b.NewValue0(v.Pos, OpMul32, t) 11122 v1 := b.NewValue0(v.Pos, OpDiv32, t) 11123 v1.AddArg(x) 11124 v2 := b.NewValue0(v.Pos, OpConst32, t) 11125 v2.AuxInt = c 11126 v1.AddArg(v2) 11127 v0.AddArg(v1) 11128 v3 := b.NewValue0(v.Pos, OpConst32, t) 11129 v3.AuxInt = c 11130 v0.AddArg(v3) 11131 v.AddArg(v0) 11132 return true 11133 } 11134 return false 11135 } 11136 func rewriteValuegeneric_OpMod32u_0(v *Value) bool { 11137 b := v.Block 11138 _ = b 11139 // match: (Mod32u (Const32 [c]) (Const32 [d])) 11140 // cond: d != 0 11141 // result: (Const32 [int64(uint32(c) % uint32(d))]) 11142 for { 11143 v_0 := v.Args[0] 11144 if v_0.Op != OpConst32 { 11145 break 11146 } 11147 c := v_0.AuxInt 11148 v_1 := v.Args[1] 11149 if v_1.Op != OpConst32 { 11150 break 11151 } 11152 d := v_1.AuxInt 11153 if !(d != 0) { 11154 break 11155 } 11156 v.reset(OpConst32) 11157 v.AuxInt = int64(uint32(c) % uint32(d)) 11158 return true 11159 } 11160 // match: (Mod32u <t> n (Const32 [c])) 11161 // cond: isPowerOfTwo(c&0xffffffff) 11162 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 11163 for { 11164 t := v.Type 11165 n := v.Args[0] 11166 v_1 := v.Args[1] 11167 if v_1.Op != OpConst32 { 11168 break 11169 } 11170 c := v_1.AuxInt 11171 if !(isPowerOfTwo(c & 0xffffffff)) { 11172 break 11173 } 11174 v.reset(OpAnd32) 11175 v.AddArg(n) 11176 v0 := b.NewValue0(v.Pos, OpConst32, t) 11177 v0.AuxInt = (c & 0xffffffff) - 1 11178 v.AddArg(v0) 11179 return true 11180 } 11181 // match: (Mod32u <t> x (Const32 [c])) 11182 // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) 11183 // result: (Sub32 x (Mul32 <t> (Div32u <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 11184 for { 11185 t := v.Type 11186 x := v.Args[0] 11187 v_1 := v.Args[1] 11188 if v_1.Op != OpConst32 { 11189 break 11190 } 11191 c := v_1.AuxInt 11192 if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { 11193 break 11194 } 11195 v.reset(OpSub32) 11196 v.AddArg(x) 11197 v0 := b.NewValue0(v.Pos, OpMul32, t) 11198 v1 := b.NewValue0(v.Pos, OpDiv32u, t) 11199 v1.AddArg(x) 11200 v2 := b.NewValue0(v.Pos, OpConst32, t) 11201 v2.AuxInt = c 11202 v1.AddArg(v2) 11203 v0.AddArg(v1) 11204 v3 := b.NewValue0(v.Pos, OpConst32, t) 11205 v3.AuxInt = c 11206 v0.AddArg(v3) 11207 v.AddArg(v0) 11208 return true 11209 } 11210 return false 11211 } 11212 func rewriteValuegeneric_OpMod64_0(v *Value) bool { 11213 b := v.Block 11214 _ = b 11215 // match: (Mod64 (Const64 [c]) (Const64 [d])) 11216 // cond: d != 0 11217 // result: (Const64 [c % d]) 11218 for { 11219 v_0 := v.Args[0] 11220 if v_0.Op != OpConst64 { 11221 break 11222 } 11223 c := v_0.AuxInt 11224 v_1 := v.Args[1] 11225 if v_1.Op != OpConst64 { 11226 break 11227 } 11228 d := v_1.AuxInt 11229 if !(d != 0) { 11230 break 11231 } 11232 v.reset(OpConst64) 11233 v.AuxInt = c % d 11234 return true 11235 } 11236 // match: (Mod64 <t> n (Const64 [c])) 11237 // cond: c < 0 && c != -1<<63 11238 // result: (Mod64 <t> n (Const64 <t> [-c])) 11239 for { 11240 t := v.Type 11241 n := v.Args[0] 11242 v_1 := v.Args[1] 11243 if v_1.Op != OpConst64 { 11244 break 11245 } 11246 c := v_1.AuxInt 11247 if !(c < 0 && c != -1<<63) { 11248 break 11249 } 11250 v.reset(OpMod64) 11251 v.Type = t 11252 v.AddArg(n) 11253 v0 := b.NewValue0(v.Pos, OpConst64, t) 11254 v0.AuxInt = -c 11255 v.AddArg(v0) 11256 return true 11257 } 11258 // match: (Mod64 <t> x (Const64 [c])) 11259 // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) 11260 // result: (Sub64 x (Mul64 <t> (Div64 <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 11261 for { 11262 t := v.Type 11263 x := v.Args[0] 11264 v_1 := v.Args[1] 11265 if v_1.Op != OpConst64 { 11266 break 11267 } 11268 c := v_1.AuxInt 11269 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { 11270 break 11271 } 11272 v.reset(OpSub64) 11273 v.AddArg(x) 11274 v0 := b.NewValue0(v.Pos, OpMul64, t) 11275 v1 := b.NewValue0(v.Pos, OpDiv64, t) 11276 v1.AddArg(x) 11277 v2 := b.NewValue0(v.Pos, OpConst64, t) 11278 v2.AuxInt = c 11279 v1.AddArg(v2) 11280 v0.AddArg(v1) 11281 v3 := b.NewValue0(v.Pos, OpConst64, t) 11282 v3.AuxInt = c 11283 v0.AddArg(v3) 11284 v.AddArg(v0) 11285 return true 11286 } 11287 return false 11288 } 11289 func rewriteValuegeneric_OpMod64u_0(v *Value) bool { 11290 b := v.Block 11291 _ = b 11292 // match: (Mod64u (Const64 [c]) (Const64 [d])) 11293 // cond: d != 0 11294 // result: (Const64 [int64(uint64(c) % uint64(d))]) 11295 for { 11296 v_0 := v.Args[0] 11297 if v_0.Op != OpConst64 { 11298 break 11299 } 11300 c := v_0.AuxInt 11301 v_1 := v.Args[1] 11302 if v_1.Op != OpConst64 { 11303 break 11304 } 11305 d := v_1.AuxInt 11306 if !(d != 0) { 11307 break 11308 } 11309 v.reset(OpConst64) 11310 v.AuxInt = int64(uint64(c) % uint64(d)) 11311 return true 11312 } 11313 // match: (Mod64u <t> n (Const64 [c])) 11314 // cond: isPowerOfTwo(c) 11315 // result: (And64 n (Const64 <t> [c-1])) 11316 for { 11317 t := v.Type 11318 n := v.Args[0] 11319 v_1 := v.Args[1] 11320 if v_1.Op != OpConst64 { 11321 break 11322 } 11323 c := v_1.AuxInt 11324 if !(isPowerOfTwo(c)) { 11325 break 11326 } 11327 v.reset(OpAnd64) 11328 v.AddArg(n) 11329 v0 := b.NewValue0(v.Pos, OpConst64, t) 11330 v0.AuxInt = c - 1 11331 v.AddArg(v0) 11332 return true 11333 } 11334 // match: (Mod64u <t> x (Const64 [c])) 11335 // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) 11336 // result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 11337 for { 11338 t := v.Type 11339 x := v.Args[0] 11340 v_1 := v.Args[1] 11341 if v_1.Op != OpConst64 { 11342 break 11343 } 11344 c := v_1.AuxInt 11345 if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { 11346 break 11347 } 11348 v.reset(OpSub64) 11349 v.AddArg(x) 11350 v0 := b.NewValue0(v.Pos, OpMul64, t) 11351 v1 := b.NewValue0(v.Pos, OpDiv64u, t) 11352 v1.AddArg(x) 11353 v2 := b.NewValue0(v.Pos, OpConst64, t) 11354 v2.AuxInt = c 11355 v1.AddArg(v2) 11356 v0.AddArg(v1) 11357 v3 := b.NewValue0(v.Pos, OpConst64, t) 11358 v3.AuxInt = c 11359 v0.AddArg(v3) 11360 v.AddArg(v0) 11361 return true 11362 } 11363 return false 11364 } 11365 func rewriteValuegeneric_OpMod8_0(v *Value) bool { 11366 b := v.Block 11367 _ = b 11368 // match: (Mod8 (Const8 [c]) (Const8 [d])) 11369 // cond: d != 0 11370 // result: (Const8 [int64(int8(c % d))]) 11371 for { 11372 v_0 := v.Args[0] 11373 if v_0.Op != OpConst8 { 11374 break 11375 } 11376 c := v_0.AuxInt 11377 v_1 := v.Args[1] 11378 if v_1.Op != OpConst8 { 11379 break 11380 } 11381 d := v_1.AuxInt 11382 if !(d != 0) { 11383 break 11384 } 11385 v.reset(OpConst8) 11386 v.AuxInt = int64(int8(c % d)) 11387 return true 11388 } 11389 // match: (Mod8 <t> n (Const8 [c])) 11390 // cond: c < 0 && c != -1<<7 11391 // result: (Mod8 <t> n (Const8 <t> [-c])) 11392 for { 11393 t := v.Type 11394 n := v.Args[0] 11395 v_1 := v.Args[1] 11396 if v_1.Op != OpConst8 { 11397 break 11398 } 11399 c := v_1.AuxInt 11400 if !(c < 0 && c != -1<<7) { 11401 break 11402 } 11403 v.reset(OpMod8) 11404 v.Type = t 11405 v.AddArg(n) 11406 v0 := b.NewValue0(v.Pos, OpConst8, t) 11407 v0.AuxInt = -c 11408 v.AddArg(v0) 11409 return true 11410 } 11411 // match: (Mod8 <t> x (Const8 [c])) 11412 // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) 11413 // result: (Sub8 x (Mul8 <t> (Div8 <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 11414 for { 11415 t := v.Type 11416 x := v.Args[0] 11417 v_1 := v.Args[1] 11418 if v_1.Op != OpConst8 { 11419 break 11420 } 11421 c := v_1.AuxInt 11422 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { 11423 break 11424 } 11425 v.reset(OpSub8) 11426 v.AddArg(x) 11427 v0 := b.NewValue0(v.Pos, OpMul8, t) 11428 v1 := b.NewValue0(v.Pos, OpDiv8, t) 11429 v1.AddArg(x) 11430 v2 := b.NewValue0(v.Pos, OpConst8, t) 11431 v2.AuxInt = c 11432 v1.AddArg(v2) 11433 v0.AddArg(v1) 11434 v3 := b.NewValue0(v.Pos, OpConst8, t) 11435 v3.AuxInt = c 11436 v0.AddArg(v3) 11437 v.AddArg(v0) 11438 return true 11439 } 11440 return false 11441 } 11442 func rewriteValuegeneric_OpMod8u_0(v *Value) bool { 11443 b := v.Block 11444 _ = b 11445 // match: (Mod8u (Const8 [c]) (Const8 [d])) 11446 // cond: d != 0 11447 // result: (Const8 [int64(uint8(c) % uint8(d))]) 11448 for { 11449 v_0 := v.Args[0] 11450 if v_0.Op != OpConst8 { 11451 break 11452 } 11453 c := v_0.AuxInt 11454 v_1 := v.Args[1] 11455 if v_1.Op != OpConst8 { 11456 break 11457 } 11458 d := v_1.AuxInt 11459 if !(d != 0) { 11460 break 11461 } 11462 v.reset(OpConst8) 11463 v.AuxInt = int64(uint8(c) % uint8(d)) 11464 return true 11465 } 11466 // match: (Mod8u <t> n (Const8 [c])) 11467 // cond: isPowerOfTwo(c&0xff) 11468 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 11469 for { 11470 t := v.Type 11471 n := v.Args[0] 11472 v_1 := v.Args[1] 11473 if v_1.Op != OpConst8 { 11474 break 11475 } 11476 c := v_1.AuxInt 11477 if !(isPowerOfTwo(c & 0xff)) { 11478 break 11479 } 11480 v.reset(OpAnd8) 11481 v.AddArg(n) 11482 v0 := b.NewValue0(v.Pos, OpConst8, t) 11483 v0.AuxInt = (c & 0xff) - 1 11484 v.AddArg(v0) 11485 return true 11486 } 11487 // match: (Mod8u <t> x (Const8 [c])) 11488 // cond: x.Op != OpConst8 && c > 0 && umagicOK(8 ,c) 11489 // result: (Sub8 x (Mul8 <t> (Div8u <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 11490 for { 11491 t := v.Type 11492 x := v.Args[0] 11493 v_1 := v.Args[1] 11494 if v_1.Op != OpConst8 { 11495 break 11496 } 11497 c := v_1.AuxInt 11498 if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { 11499 break 11500 } 11501 v.reset(OpSub8) 11502 v.AddArg(x) 11503 v0 := b.NewValue0(v.Pos, OpMul8, t) 11504 v1 := b.NewValue0(v.Pos, OpDiv8u, t) 11505 v1.AddArg(x) 11506 v2 := b.NewValue0(v.Pos, OpConst8, t) 11507 v2.AuxInt = c 11508 v1.AddArg(v2) 11509 v0.AddArg(v1) 11510 v3 := b.NewValue0(v.Pos, OpConst8, t) 11511 v3.AuxInt = c 11512 v0.AddArg(v3) 11513 v.AddArg(v0) 11514 return true 11515 } 11516 return false 11517 } 11518 func rewriteValuegeneric_OpMul16_0(v *Value) bool { 11519 b := v.Block 11520 _ = b 11521 types := &b.Func.Config.Types 11522 _ = types 11523 // match: (Mul16 (Const16 [c]) (Const16 [d])) 11524 // cond: 11525 // result: (Const16 [int64(int16(c*d))]) 11526 for { 11527 v_0 := v.Args[0] 11528 if v_0.Op != OpConst16 { 11529 break 11530 } 11531 c := v_0.AuxInt 11532 v_1 := v.Args[1] 11533 if v_1.Op != OpConst16 { 11534 break 11535 } 11536 d := v_1.AuxInt 11537 v.reset(OpConst16) 11538 v.AuxInt = int64(int16(c * d)) 11539 return true 11540 } 11541 // match: (Mul16 (Const16 [d]) (Const16 [c])) 11542 // cond: 11543 // result: (Const16 [int64(int16(c*d))]) 11544 for { 11545 v_0 := v.Args[0] 11546 if v_0.Op != OpConst16 { 11547 break 11548 } 11549 d := v_0.AuxInt 11550 v_1 := v.Args[1] 11551 if v_1.Op != OpConst16 { 11552 break 11553 } 11554 c := v_1.AuxInt 11555 v.reset(OpConst16) 11556 v.AuxInt = int64(int16(c * d)) 11557 return true 11558 } 11559 // match: (Mul16 (Const16 [1]) x) 11560 // cond: 11561 // result: x 11562 for { 11563 v_0 := v.Args[0] 11564 if v_0.Op != OpConst16 { 11565 break 11566 } 11567 if v_0.AuxInt != 1 { 11568 break 11569 } 11570 x := v.Args[1] 11571 v.reset(OpCopy) 11572 v.Type = x.Type 11573 v.AddArg(x) 11574 return true 11575 } 11576 // match: (Mul16 x (Const16 [1])) 11577 // cond: 11578 // result: x 11579 for { 11580 x := v.Args[0] 11581 v_1 := v.Args[1] 11582 if v_1.Op != OpConst16 { 11583 break 11584 } 11585 if v_1.AuxInt != 1 { 11586 break 11587 } 11588 v.reset(OpCopy) 11589 v.Type = x.Type 11590 v.AddArg(x) 11591 return true 11592 } 11593 // match: (Mul16 (Const16 [-1]) x) 11594 // cond: 11595 // result: (Neg16 x) 11596 for { 11597 v_0 := v.Args[0] 11598 if v_0.Op != OpConst16 { 11599 break 11600 } 11601 if v_0.AuxInt != -1 { 11602 break 11603 } 11604 x := v.Args[1] 11605 v.reset(OpNeg16) 11606 v.AddArg(x) 11607 return true 11608 } 11609 // match: (Mul16 x (Const16 [-1])) 11610 // cond: 11611 // result: (Neg16 x) 11612 for { 11613 x := v.Args[0] 11614 v_1 := v.Args[1] 11615 if v_1.Op != OpConst16 { 11616 break 11617 } 11618 if v_1.AuxInt != -1 { 11619 break 11620 } 11621 v.reset(OpNeg16) 11622 v.AddArg(x) 11623 return true 11624 } 11625 // match: (Mul16 <t> n (Const16 [c])) 11626 // cond: isPowerOfTwo(c) 11627 // result: (Lsh16x64 <t> n (Const64 <types.UInt64> [log2(c)])) 11628 for { 11629 t := v.Type 11630 n := v.Args[0] 11631 v_1 := v.Args[1] 11632 if v_1.Op != OpConst16 { 11633 break 11634 } 11635 c := v_1.AuxInt 11636 if !(isPowerOfTwo(c)) { 11637 break 11638 } 11639 v.reset(OpLsh16x64) 11640 v.Type = t 11641 v.AddArg(n) 11642 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 11643 v0.AuxInt = log2(c) 11644 v.AddArg(v0) 11645 return true 11646 } 11647 // match: (Mul16 <t> (Const16 [c]) n) 11648 // cond: isPowerOfTwo(c) 11649 // result: (Lsh16x64 <t> n (Const64 <types.UInt64> [log2(c)])) 11650 for { 11651 t := v.Type 11652 v_0 := v.Args[0] 11653 if v_0.Op != OpConst16 { 11654 break 11655 } 11656 c := v_0.AuxInt 11657 n := v.Args[1] 11658 if !(isPowerOfTwo(c)) { 11659 break 11660 } 11661 v.reset(OpLsh16x64) 11662 v.Type = t 11663 v.AddArg(n) 11664 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 11665 v0.AuxInt = log2(c) 11666 v.AddArg(v0) 11667 return true 11668 } 11669 // match: (Mul16 <t> n (Const16 [c])) 11670 // cond: t.IsSigned() && isPowerOfTwo(-c) 11671 // result: (Neg16 (Lsh16x64 <t> n (Const64 <types.UInt64> [log2(-c)]))) 11672 for { 11673 t := v.Type 11674 n := v.Args[0] 11675 v_1 := v.Args[1] 11676 if v_1.Op != OpConst16 { 11677 break 11678 } 11679 c := v_1.AuxInt 11680 if !(t.IsSigned() && isPowerOfTwo(-c)) { 11681 break 11682 } 11683 v.reset(OpNeg16) 11684 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 11685 v0.AddArg(n) 11686 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 11687 v1.AuxInt = log2(-c) 11688 v0.AddArg(v1) 11689 v.AddArg(v0) 11690 return true 11691 } 11692 // match: (Mul16 <t> (Const16 [c]) n) 11693 // cond: t.IsSigned() && isPowerOfTwo(-c) 11694 // result: (Neg16 (Lsh16x64 <t> n (Const64 <types.UInt64> [log2(-c)]))) 11695 for { 11696 t := v.Type 11697 v_0 := v.Args[0] 11698 if v_0.Op != OpConst16 { 11699 break 11700 } 11701 c := v_0.AuxInt 11702 n := v.Args[1] 11703 if !(t.IsSigned() && isPowerOfTwo(-c)) { 11704 break 11705 } 11706 v.reset(OpNeg16) 11707 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 11708 v0.AddArg(n) 11709 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 11710 v1.AuxInt = log2(-c) 11711 v0.AddArg(v1) 11712 v.AddArg(v0) 11713 return true 11714 } 11715 return false 11716 } 11717 func rewriteValuegeneric_OpMul16_10(v *Value) bool { 11718 b := v.Block 11719 _ = b 11720 // match: (Mul16 (Const16 [0]) _) 11721 // cond: 11722 // result: (Const16 [0]) 11723 for { 11724 v_0 := v.Args[0] 11725 if v_0.Op != OpConst16 { 11726 break 11727 } 11728 if v_0.AuxInt != 0 { 11729 break 11730 } 11731 v.reset(OpConst16) 11732 v.AuxInt = 0 11733 return true 11734 } 11735 // match: (Mul16 _ (Const16 [0])) 11736 // cond: 11737 // result: (Const16 [0]) 11738 for { 11739 v_1 := v.Args[1] 11740 if v_1.Op != OpConst16 { 11741 break 11742 } 11743 if v_1.AuxInt != 0 { 11744 break 11745 } 11746 v.reset(OpConst16) 11747 v.AuxInt = 0 11748 return true 11749 } 11750 // match: (Mul16 (Const16 <t> [c]) (Mul16 (Const16 <t> [d]) x)) 11751 // cond: 11752 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 11753 for { 11754 v_0 := v.Args[0] 11755 if v_0.Op != OpConst16 { 11756 break 11757 } 11758 t := v_0.Type 11759 c := v_0.AuxInt 11760 v_1 := v.Args[1] 11761 if v_1.Op != OpMul16 { 11762 break 11763 } 11764 v_1_0 := v_1.Args[0] 11765 if v_1_0.Op != OpConst16 { 11766 break 11767 } 11768 if v_1_0.Type != t { 11769 break 11770 } 11771 d := v_1_0.AuxInt 11772 x := v_1.Args[1] 11773 v.reset(OpMul16) 11774 v0 := b.NewValue0(v.Pos, OpConst16, t) 11775 v0.AuxInt = int64(int16(c * d)) 11776 v.AddArg(v0) 11777 v.AddArg(x) 11778 return true 11779 } 11780 // match: (Mul16 (Const16 <t> [c]) (Mul16 x (Const16 <t> [d]))) 11781 // cond: 11782 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 11783 for { 11784 v_0 := v.Args[0] 11785 if v_0.Op != OpConst16 { 11786 break 11787 } 11788 t := v_0.Type 11789 c := v_0.AuxInt 11790 v_1 := v.Args[1] 11791 if v_1.Op != OpMul16 { 11792 break 11793 } 11794 x := v_1.Args[0] 11795 v_1_1 := v_1.Args[1] 11796 if v_1_1.Op != OpConst16 { 11797 break 11798 } 11799 if v_1_1.Type != t { 11800 break 11801 } 11802 d := v_1_1.AuxInt 11803 v.reset(OpMul16) 11804 v0 := b.NewValue0(v.Pos, OpConst16, t) 11805 v0.AuxInt = int64(int16(c * d)) 11806 v.AddArg(v0) 11807 v.AddArg(x) 11808 return true 11809 } 11810 // match: (Mul16 (Mul16 (Const16 <t> [d]) x) (Const16 <t> [c])) 11811 // cond: 11812 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 11813 for { 11814 v_0 := v.Args[0] 11815 if v_0.Op != OpMul16 { 11816 break 11817 } 11818 v_0_0 := v_0.Args[0] 11819 if v_0_0.Op != OpConst16 { 11820 break 11821 } 11822 t := v_0_0.Type 11823 d := v_0_0.AuxInt 11824 x := v_0.Args[1] 11825 v_1 := v.Args[1] 11826 if v_1.Op != OpConst16 { 11827 break 11828 } 11829 if v_1.Type != t { 11830 break 11831 } 11832 c := v_1.AuxInt 11833 v.reset(OpMul16) 11834 v0 := b.NewValue0(v.Pos, OpConst16, t) 11835 v0.AuxInt = int64(int16(c * d)) 11836 v.AddArg(v0) 11837 v.AddArg(x) 11838 return true 11839 } 11840 // match: (Mul16 (Mul16 x (Const16 <t> [d])) (Const16 <t> [c])) 11841 // cond: 11842 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 11843 for { 11844 v_0 := v.Args[0] 11845 if v_0.Op != OpMul16 { 11846 break 11847 } 11848 x := v_0.Args[0] 11849 v_0_1 := v_0.Args[1] 11850 if v_0_1.Op != OpConst16 { 11851 break 11852 } 11853 t := v_0_1.Type 11854 d := v_0_1.AuxInt 11855 v_1 := v.Args[1] 11856 if v_1.Op != OpConst16 { 11857 break 11858 } 11859 if v_1.Type != t { 11860 break 11861 } 11862 c := v_1.AuxInt 11863 v.reset(OpMul16) 11864 v0 := b.NewValue0(v.Pos, OpConst16, t) 11865 v0.AuxInt = int64(int16(c * d)) 11866 v.AddArg(v0) 11867 v.AddArg(x) 11868 return true 11869 } 11870 return false 11871 } 11872 func rewriteValuegeneric_OpMul32_0(v *Value) bool { 11873 b := v.Block 11874 _ = b 11875 types := &b.Func.Config.Types 11876 _ = types 11877 // match: (Mul32 (Const32 [c]) (Const32 [d])) 11878 // cond: 11879 // result: (Const32 [int64(int32(c*d))]) 11880 for { 11881 v_0 := v.Args[0] 11882 if v_0.Op != OpConst32 { 11883 break 11884 } 11885 c := v_0.AuxInt 11886 v_1 := v.Args[1] 11887 if v_1.Op != OpConst32 { 11888 break 11889 } 11890 d := v_1.AuxInt 11891 v.reset(OpConst32) 11892 v.AuxInt = int64(int32(c * d)) 11893 return true 11894 } 11895 // match: (Mul32 (Const32 [d]) (Const32 [c])) 11896 // cond: 11897 // result: (Const32 [int64(int32(c*d))]) 11898 for { 11899 v_0 := v.Args[0] 11900 if v_0.Op != OpConst32 { 11901 break 11902 } 11903 d := v_0.AuxInt 11904 v_1 := v.Args[1] 11905 if v_1.Op != OpConst32 { 11906 break 11907 } 11908 c := v_1.AuxInt 11909 v.reset(OpConst32) 11910 v.AuxInt = int64(int32(c * d)) 11911 return true 11912 } 11913 // match: (Mul32 (Const32 [1]) x) 11914 // cond: 11915 // result: x 11916 for { 11917 v_0 := v.Args[0] 11918 if v_0.Op != OpConst32 { 11919 break 11920 } 11921 if v_0.AuxInt != 1 { 11922 break 11923 } 11924 x := v.Args[1] 11925 v.reset(OpCopy) 11926 v.Type = x.Type 11927 v.AddArg(x) 11928 return true 11929 } 11930 // match: (Mul32 x (Const32 [1])) 11931 // cond: 11932 // result: x 11933 for { 11934 x := v.Args[0] 11935 v_1 := v.Args[1] 11936 if v_1.Op != OpConst32 { 11937 break 11938 } 11939 if v_1.AuxInt != 1 { 11940 break 11941 } 11942 v.reset(OpCopy) 11943 v.Type = x.Type 11944 v.AddArg(x) 11945 return true 11946 } 11947 // match: (Mul32 (Const32 [-1]) x) 11948 // cond: 11949 // result: (Neg32 x) 11950 for { 11951 v_0 := v.Args[0] 11952 if v_0.Op != OpConst32 { 11953 break 11954 } 11955 if v_0.AuxInt != -1 { 11956 break 11957 } 11958 x := v.Args[1] 11959 v.reset(OpNeg32) 11960 v.AddArg(x) 11961 return true 11962 } 11963 // match: (Mul32 x (Const32 [-1])) 11964 // cond: 11965 // result: (Neg32 x) 11966 for { 11967 x := v.Args[0] 11968 v_1 := v.Args[1] 11969 if v_1.Op != OpConst32 { 11970 break 11971 } 11972 if v_1.AuxInt != -1 { 11973 break 11974 } 11975 v.reset(OpNeg32) 11976 v.AddArg(x) 11977 return true 11978 } 11979 // match: (Mul32 <t> n (Const32 [c])) 11980 // cond: isPowerOfTwo(c) 11981 // result: (Lsh32x64 <t> n (Const64 <types.UInt64> [log2(c)])) 11982 for { 11983 t := v.Type 11984 n := v.Args[0] 11985 v_1 := v.Args[1] 11986 if v_1.Op != OpConst32 { 11987 break 11988 } 11989 c := v_1.AuxInt 11990 if !(isPowerOfTwo(c)) { 11991 break 11992 } 11993 v.reset(OpLsh32x64) 11994 v.Type = t 11995 v.AddArg(n) 11996 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 11997 v0.AuxInt = log2(c) 11998 v.AddArg(v0) 11999 return true 12000 } 12001 // match: (Mul32 <t> (Const32 [c]) n) 12002 // cond: isPowerOfTwo(c) 12003 // result: (Lsh32x64 <t> n (Const64 <types.UInt64> [log2(c)])) 12004 for { 12005 t := v.Type 12006 v_0 := v.Args[0] 12007 if v_0.Op != OpConst32 { 12008 break 12009 } 12010 c := v_0.AuxInt 12011 n := v.Args[1] 12012 if !(isPowerOfTwo(c)) { 12013 break 12014 } 12015 v.reset(OpLsh32x64) 12016 v.Type = t 12017 v.AddArg(n) 12018 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 12019 v0.AuxInt = log2(c) 12020 v.AddArg(v0) 12021 return true 12022 } 12023 // match: (Mul32 <t> n (Const32 [c])) 12024 // cond: t.IsSigned() && isPowerOfTwo(-c) 12025 // result: (Neg32 (Lsh32x64 <t> n (Const64 <types.UInt64> [log2(-c)]))) 12026 for { 12027 t := v.Type 12028 n := v.Args[0] 12029 v_1 := v.Args[1] 12030 if v_1.Op != OpConst32 { 12031 break 12032 } 12033 c := v_1.AuxInt 12034 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12035 break 12036 } 12037 v.reset(OpNeg32) 12038 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 12039 v0.AddArg(n) 12040 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 12041 v1.AuxInt = log2(-c) 12042 v0.AddArg(v1) 12043 v.AddArg(v0) 12044 return true 12045 } 12046 // match: (Mul32 <t> (Const32 [c]) n) 12047 // cond: t.IsSigned() && isPowerOfTwo(-c) 12048 // result: (Neg32 (Lsh32x64 <t> n (Const64 <types.UInt64> [log2(-c)]))) 12049 for { 12050 t := v.Type 12051 v_0 := v.Args[0] 12052 if v_0.Op != OpConst32 { 12053 break 12054 } 12055 c := v_0.AuxInt 12056 n := v.Args[1] 12057 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12058 break 12059 } 12060 v.reset(OpNeg32) 12061 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 12062 v0.AddArg(n) 12063 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 12064 v1.AuxInt = log2(-c) 12065 v0.AddArg(v1) 12066 v.AddArg(v0) 12067 return true 12068 } 12069 return false 12070 } 12071 func rewriteValuegeneric_OpMul32_10(v *Value) bool { 12072 b := v.Block 12073 _ = b 12074 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x)) 12075 // cond: 12076 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12077 for { 12078 v_0 := v.Args[0] 12079 if v_0.Op != OpConst32 { 12080 break 12081 } 12082 t := v_0.Type 12083 c := v_0.AuxInt 12084 v_1 := v.Args[1] 12085 if v_1.Op != OpAdd32 { 12086 break 12087 } 12088 if v_1.Type != t { 12089 break 12090 } 12091 v_1_0 := v_1.Args[0] 12092 if v_1_0.Op != OpConst32 { 12093 break 12094 } 12095 if v_1_0.Type != t { 12096 break 12097 } 12098 d := v_1_0.AuxInt 12099 x := v_1.Args[1] 12100 v.reset(OpAdd32) 12101 v0 := b.NewValue0(v.Pos, OpConst32, t) 12102 v0.AuxInt = int64(int32(c * d)) 12103 v.AddArg(v0) 12104 v1 := b.NewValue0(v.Pos, OpMul32, t) 12105 v2 := b.NewValue0(v.Pos, OpConst32, t) 12106 v2.AuxInt = c 12107 v1.AddArg(v2) 12108 v1.AddArg(x) 12109 v.AddArg(v1) 12110 return true 12111 } 12112 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> x (Const32 <t> [d]))) 12113 // cond: 12114 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12115 for { 12116 v_0 := v.Args[0] 12117 if v_0.Op != OpConst32 { 12118 break 12119 } 12120 t := v_0.Type 12121 c := v_0.AuxInt 12122 v_1 := v.Args[1] 12123 if v_1.Op != OpAdd32 { 12124 break 12125 } 12126 if v_1.Type != t { 12127 break 12128 } 12129 x := v_1.Args[0] 12130 v_1_1 := v_1.Args[1] 12131 if v_1_1.Op != OpConst32 { 12132 break 12133 } 12134 if v_1_1.Type != t { 12135 break 12136 } 12137 d := v_1_1.AuxInt 12138 v.reset(OpAdd32) 12139 v0 := b.NewValue0(v.Pos, OpConst32, t) 12140 v0.AuxInt = int64(int32(c * d)) 12141 v.AddArg(v0) 12142 v1 := b.NewValue0(v.Pos, OpMul32, t) 12143 v2 := b.NewValue0(v.Pos, OpConst32, t) 12144 v2.AuxInt = c 12145 v1.AddArg(v2) 12146 v1.AddArg(x) 12147 v.AddArg(v1) 12148 return true 12149 } 12150 // match: (Mul32 (Add32 <t> (Const32 <t> [d]) x) (Const32 <t> [c])) 12151 // cond: 12152 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12153 for { 12154 v_0 := v.Args[0] 12155 if v_0.Op != OpAdd32 { 12156 break 12157 } 12158 t := v_0.Type 12159 v_0_0 := v_0.Args[0] 12160 if v_0_0.Op != OpConst32 { 12161 break 12162 } 12163 if v_0_0.Type != t { 12164 break 12165 } 12166 d := v_0_0.AuxInt 12167 x := v_0.Args[1] 12168 v_1 := v.Args[1] 12169 if v_1.Op != OpConst32 { 12170 break 12171 } 12172 if v_1.Type != t { 12173 break 12174 } 12175 c := v_1.AuxInt 12176 v.reset(OpAdd32) 12177 v0 := b.NewValue0(v.Pos, OpConst32, t) 12178 v0.AuxInt = int64(int32(c * d)) 12179 v.AddArg(v0) 12180 v1 := b.NewValue0(v.Pos, OpMul32, t) 12181 v2 := b.NewValue0(v.Pos, OpConst32, t) 12182 v2.AuxInt = c 12183 v1.AddArg(v2) 12184 v1.AddArg(x) 12185 v.AddArg(v1) 12186 return true 12187 } 12188 // match: (Mul32 (Add32 <t> x (Const32 <t> [d])) (Const32 <t> [c])) 12189 // cond: 12190 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12191 for { 12192 v_0 := v.Args[0] 12193 if v_0.Op != OpAdd32 { 12194 break 12195 } 12196 t := v_0.Type 12197 x := v_0.Args[0] 12198 v_0_1 := v_0.Args[1] 12199 if v_0_1.Op != OpConst32 { 12200 break 12201 } 12202 if v_0_1.Type != t { 12203 break 12204 } 12205 d := v_0_1.AuxInt 12206 v_1 := v.Args[1] 12207 if v_1.Op != OpConst32 { 12208 break 12209 } 12210 if v_1.Type != t { 12211 break 12212 } 12213 c := v_1.AuxInt 12214 v.reset(OpAdd32) 12215 v0 := b.NewValue0(v.Pos, OpConst32, t) 12216 v0.AuxInt = int64(int32(c * d)) 12217 v.AddArg(v0) 12218 v1 := b.NewValue0(v.Pos, OpMul32, t) 12219 v2 := b.NewValue0(v.Pos, OpConst32, t) 12220 v2.AuxInt = c 12221 v1.AddArg(v2) 12222 v1.AddArg(x) 12223 v.AddArg(v1) 12224 return true 12225 } 12226 // match: (Mul32 (Const32 [0]) _) 12227 // cond: 12228 // result: (Const32 [0]) 12229 for { 12230 v_0 := v.Args[0] 12231 if v_0.Op != OpConst32 { 12232 break 12233 } 12234 if v_0.AuxInt != 0 { 12235 break 12236 } 12237 v.reset(OpConst32) 12238 v.AuxInt = 0 12239 return true 12240 } 12241 // match: (Mul32 _ (Const32 [0])) 12242 // cond: 12243 // result: (Const32 [0]) 12244 for { 12245 v_1 := v.Args[1] 12246 if v_1.Op != OpConst32 { 12247 break 12248 } 12249 if v_1.AuxInt != 0 { 12250 break 12251 } 12252 v.reset(OpConst32) 12253 v.AuxInt = 0 12254 return true 12255 } 12256 // match: (Mul32 (Const32 <t> [c]) (Mul32 (Const32 <t> [d]) x)) 12257 // cond: 12258 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 12259 for { 12260 v_0 := v.Args[0] 12261 if v_0.Op != OpConst32 { 12262 break 12263 } 12264 t := v_0.Type 12265 c := v_0.AuxInt 12266 v_1 := v.Args[1] 12267 if v_1.Op != OpMul32 { 12268 break 12269 } 12270 v_1_0 := v_1.Args[0] 12271 if v_1_0.Op != OpConst32 { 12272 break 12273 } 12274 if v_1_0.Type != t { 12275 break 12276 } 12277 d := v_1_0.AuxInt 12278 x := v_1.Args[1] 12279 v.reset(OpMul32) 12280 v0 := b.NewValue0(v.Pos, OpConst32, t) 12281 v0.AuxInt = int64(int32(c * d)) 12282 v.AddArg(v0) 12283 v.AddArg(x) 12284 return true 12285 } 12286 // match: (Mul32 (Const32 <t> [c]) (Mul32 x (Const32 <t> [d]))) 12287 // cond: 12288 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 12289 for { 12290 v_0 := v.Args[0] 12291 if v_0.Op != OpConst32 { 12292 break 12293 } 12294 t := v_0.Type 12295 c := v_0.AuxInt 12296 v_1 := v.Args[1] 12297 if v_1.Op != OpMul32 { 12298 break 12299 } 12300 x := v_1.Args[0] 12301 v_1_1 := v_1.Args[1] 12302 if v_1_1.Op != OpConst32 { 12303 break 12304 } 12305 if v_1_1.Type != t { 12306 break 12307 } 12308 d := v_1_1.AuxInt 12309 v.reset(OpMul32) 12310 v0 := b.NewValue0(v.Pos, OpConst32, t) 12311 v0.AuxInt = int64(int32(c * d)) 12312 v.AddArg(v0) 12313 v.AddArg(x) 12314 return true 12315 } 12316 // match: (Mul32 (Mul32 (Const32 <t> [d]) x) (Const32 <t> [c])) 12317 // cond: 12318 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 12319 for { 12320 v_0 := v.Args[0] 12321 if v_0.Op != OpMul32 { 12322 break 12323 } 12324 v_0_0 := v_0.Args[0] 12325 if v_0_0.Op != OpConst32 { 12326 break 12327 } 12328 t := v_0_0.Type 12329 d := v_0_0.AuxInt 12330 x := v_0.Args[1] 12331 v_1 := v.Args[1] 12332 if v_1.Op != OpConst32 { 12333 break 12334 } 12335 if v_1.Type != t { 12336 break 12337 } 12338 c := v_1.AuxInt 12339 v.reset(OpMul32) 12340 v0 := b.NewValue0(v.Pos, OpConst32, t) 12341 v0.AuxInt = int64(int32(c * d)) 12342 v.AddArg(v0) 12343 v.AddArg(x) 12344 return true 12345 } 12346 // match: (Mul32 (Mul32 x (Const32 <t> [d])) (Const32 <t> [c])) 12347 // cond: 12348 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 12349 for { 12350 v_0 := v.Args[0] 12351 if v_0.Op != OpMul32 { 12352 break 12353 } 12354 x := v_0.Args[0] 12355 v_0_1 := v_0.Args[1] 12356 if v_0_1.Op != OpConst32 { 12357 break 12358 } 12359 t := v_0_1.Type 12360 d := v_0_1.AuxInt 12361 v_1 := v.Args[1] 12362 if v_1.Op != OpConst32 { 12363 break 12364 } 12365 if v_1.Type != t { 12366 break 12367 } 12368 c := v_1.AuxInt 12369 v.reset(OpMul32) 12370 v0 := b.NewValue0(v.Pos, OpConst32, t) 12371 v0.AuxInt = int64(int32(c * d)) 12372 v.AddArg(v0) 12373 v.AddArg(x) 12374 return true 12375 } 12376 return false 12377 } 12378 func rewriteValuegeneric_OpMul32F_0(v *Value) bool { 12379 // match: (Mul32F (Const32F [c]) (Const32F [d])) 12380 // cond: 12381 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 12382 for { 12383 v_0 := v.Args[0] 12384 if v_0.Op != OpConst32F { 12385 break 12386 } 12387 c := v_0.AuxInt 12388 v_1 := v.Args[1] 12389 if v_1.Op != OpConst32F { 12390 break 12391 } 12392 d := v_1.AuxInt 12393 v.reset(OpConst32F) 12394 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 12395 return true 12396 } 12397 // match: (Mul32F (Const32F [d]) (Const32F [c])) 12398 // cond: 12399 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 12400 for { 12401 v_0 := v.Args[0] 12402 if v_0.Op != OpConst32F { 12403 break 12404 } 12405 d := v_0.AuxInt 12406 v_1 := v.Args[1] 12407 if v_1.Op != OpConst32F { 12408 break 12409 } 12410 c := v_1.AuxInt 12411 v.reset(OpConst32F) 12412 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 12413 return true 12414 } 12415 // match: (Mul32F x (Const32F [f2i(1)])) 12416 // cond: 12417 // result: x 12418 for { 12419 x := v.Args[0] 12420 v_1 := v.Args[1] 12421 if v_1.Op != OpConst32F { 12422 break 12423 } 12424 if v_1.AuxInt != f2i(1) { 12425 break 12426 } 12427 v.reset(OpCopy) 12428 v.Type = x.Type 12429 v.AddArg(x) 12430 return true 12431 } 12432 // match: (Mul32F (Const32F [f2i(1)]) x) 12433 // cond: 12434 // result: x 12435 for { 12436 v_0 := v.Args[0] 12437 if v_0.Op != OpConst32F { 12438 break 12439 } 12440 if v_0.AuxInt != f2i(1) { 12441 break 12442 } 12443 x := v.Args[1] 12444 v.reset(OpCopy) 12445 v.Type = x.Type 12446 v.AddArg(x) 12447 return true 12448 } 12449 // match: (Mul32F x (Const32F [f2i(-1)])) 12450 // cond: 12451 // result: (Neg32F x) 12452 for { 12453 x := v.Args[0] 12454 v_1 := v.Args[1] 12455 if v_1.Op != OpConst32F { 12456 break 12457 } 12458 if v_1.AuxInt != f2i(-1) { 12459 break 12460 } 12461 v.reset(OpNeg32F) 12462 v.AddArg(x) 12463 return true 12464 } 12465 // match: (Mul32F (Const32F [f2i(-1)]) x) 12466 // cond: 12467 // result: (Neg32F x) 12468 for { 12469 v_0 := v.Args[0] 12470 if v_0.Op != OpConst32F { 12471 break 12472 } 12473 if v_0.AuxInt != f2i(-1) { 12474 break 12475 } 12476 x := v.Args[1] 12477 v.reset(OpNeg32F) 12478 v.AddArg(x) 12479 return true 12480 } 12481 // match: (Mul32F x (Const32F [f2i(2)])) 12482 // cond: 12483 // result: (Add32F x x) 12484 for { 12485 x := v.Args[0] 12486 v_1 := v.Args[1] 12487 if v_1.Op != OpConst32F { 12488 break 12489 } 12490 if v_1.AuxInt != f2i(2) { 12491 break 12492 } 12493 v.reset(OpAdd32F) 12494 v.AddArg(x) 12495 v.AddArg(x) 12496 return true 12497 } 12498 // match: (Mul32F (Const32F [f2i(2)]) x) 12499 // cond: 12500 // result: (Add32F x x) 12501 for { 12502 v_0 := v.Args[0] 12503 if v_0.Op != OpConst32F { 12504 break 12505 } 12506 if v_0.AuxInt != f2i(2) { 12507 break 12508 } 12509 x := v.Args[1] 12510 v.reset(OpAdd32F) 12511 v.AddArg(x) 12512 v.AddArg(x) 12513 return true 12514 } 12515 return false 12516 } 12517 func rewriteValuegeneric_OpMul64_0(v *Value) bool { 12518 b := v.Block 12519 _ = b 12520 types := &b.Func.Config.Types 12521 _ = types 12522 // match: (Mul64 (Const64 [c]) (Const64 [d])) 12523 // cond: 12524 // result: (Const64 [c*d]) 12525 for { 12526 v_0 := v.Args[0] 12527 if v_0.Op != OpConst64 { 12528 break 12529 } 12530 c := v_0.AuxInt 12531 v_1 := v.Args[1] 12532 if v_1.Op != OpConst64 { 12533 break 12534 } 12535 d := v_1.AuxInt 12536 v.reset(OpConst64) 12537 v.AuxInt = c * d 12538 return true 12539 } 12540 // match: (Mul64 (Const64 [d]) (Const64 [c])) 12541 // cond: 12542 // result: (Const64 [c*d]) 12543 for { 12544 v_0 := v.Args[0] 12545 if v_0.Op != OpConst64 { 12546 break 12547 } 12548 d := v_0.AuxInt 12549 v_1 := v.Args[1] 12550 if v_1.Op != OpConst64 { 12551 break 12552 } 12553 c := v_1.AuxInt 12554 v.reset(OpConst64) 12555 v.AuxInt = c * d 12556 return true 12557 } 12558 // match: (Mul64 (Const64 [1]) x) 12559 // cond: 12560 // result: x 12561 for { 12562 v_0 := v.Args[0] 12563 if v_0.Op != OpConst64 { 12564 break 12565 } 12566 if v_0.AuxInt != 1 { 12567 break 12568 } 12569 x := v.Args[1] 12570 v.reset(OpCopy) 12571 v.Type = x.Type 12572 v.AddArg(x) 12573 return true 12574 } 12575 // match: (Mul64 x (Const64 [1])) 12576 // cond: 12577 // result: x 12578 for { 12579 x := v.Args[0] 12580 v_1 := v.Args[1] 12581 if v_1.Op != OpConst64 { 12582 break 12583 } 12584 if v_1.AuxInt != 1 { 12585 break 12586 } 12587 v.reset(OpCopy) 12588 v.Type = x.Type 12589 v.AddArg(x) 12590 return true 12591 } 12592 // match: (Mul64 (Const64 [-1]) x) 12593 // cond: 12594 // result: (Neg64 x) 12595 for { 12596 v_0 := v.Args[0] 12597 if v_0.Op != OpConst64 { 12598 break 12599 } 12600 if v_0.AuxInt != -1 { 12601 break 12602 } 12603 x := v.Args[1] 12604 v.reset(OpNeg64) 12605 v.AddArg(x) 12606 return true 12607 } 12608 // match: (Mul64 x (Const64 [-1])) 12609 // cond: 12610 // result: (Neg64 x) 12611 for { 12612 x := v.Args[0] 12613 v_1 := v.Args[1] 12614 if v_1.Op != OpConst64 { 12615 break 12616 } 12617 if v_1.AuxInt != -1 { 12618 break 12619 } 12620 v.reset(OpNeg64) 12621 v.AddArg(x) 12622 return true 12623 } 12624 // match: (Mul64 <t> n (Const64 [c])) 12625 // cond: isPowerOfTwo(c) 12626 // result: (Lsh64x64 <t> n (Const64 <types.UInt64> [log2(c)])) 12627 for { 12628 t := v.Type 12629 n := v.Args[0] 12630 v_1 := v.Args[1] 12631 if v_1.Op != OpConst64 { 12632 break 12633 } 12634 c := v_1.AuxInt 12635 if !(isPowerOfTwo(c)) { 12636 break 12637 } 12638 v.reset(OpLsh64x64) 12639 v.Type = t 12640 v.AddArg(n) 12641 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 12642 v0.AuxInt = log2(c) 12643 v.AddArg(v0) 12644 return true 12645 } 12646 // match: (Mul64 <t> (Const64 [c]) n) 12647 // cond: isPowerOfTwo(c) 12648 // result: (Lsh64x64 <t> n (Const64 <types.UInt64> [log2(c)])) 12649 for { 12650 t := v.Type 12651 v_0 := v.Args[0] 12652 if v_0.Op != OpConst64 { 12653 break 12654 } 12655 c := v_0.AuxInt 12656 n := v.Args[1] 12657 if !(isPowerOfTwo(c)) { 12658 break 12659 } 12660 v.reset(OpLsh64x64) 12661 v.Type = t 12662 v.AddArg(n) 12663 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 12664 v0.AuxInt = log2(c) 12665 v.AddArg(v0) 12666 return true 12667 } 12668 // match: (Mul64 <t> n (Const64 [c])) 12669 // cond: t.IsSigned() && isPowerOfTwo(-c) 12670 // result: (Neg64 (Lsh64x64 <t> n (Const64 <types.UInt64> [log2(-c)]))) 12671 for { 12672 t := v.Type 12673 n := v.Args[0] 12674 v_1 := v.Args[1] 12675 if v_1.Op != OpConst64 { 12676 break 12677 } 12678 c := v_1.AuxInt 12679 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12680 break 12681 } 12682 v.reset(OpNeg64) 12683 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 12684 v0.AddArg(n) 12685 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 12686 v1.AuxInt = log2(-c) 12687 v0.AddArg(v1) 12688 v.AddArg(v0) 12689 return true 12690 } 12691 // match: (Mul64 <t> (Const64 [c]) n) 12692 // cond: t.IsSigned() && isPowerOfTwo(-c) 12693 // result: (Neg64 (Lsh64x64 <t> n (Const64 <types.UInt64> [log2(-c)]))) 12694 for { 12695 t := v.Type 12696 v_0 := v.Args[0] 12697 if v_0.Op != OpConst64 { 12698 break 12699 } 12700 c := v_0.AuxInt 12701 n := v.Args[1] 12702 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12703 break 12704 } 12705 v.reset(OpNeg64) 12706 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 12707 v0.AddArg(n) 12708 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 12709 v1.AuxInt = log2(-c) 12710 v0.AddArg(v1) 12711 v.AddArg(v0) 12712 return true 12713 } 12714 return false 12715 } 12716 func rewriteValuegeneric_OpMul64_10(v *Value) bool { 12717 b := v.Block 12718 _ = b 12719 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x)) 12720 // cond: 12721 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 12722 for { 12723 v_0 := v.Args[0] 12724 if v_0.Op != OpConst64 { 12725 break 12726 } 12727 t := v_0.Type 12728 c := v_0.AuxInt 12729 v_1 := v.Args[1] 12730 if v_1.Op != OpAdd64 { 12731 break 12732 } 12733 if v_1.Type != t { 12734 break 12735 } 12736 v_1_0 := v_1.Args[0] 12737 if v_1_0.Op != OpConst64 { 12738 break 12739 } 12740 if v_1_0.Type != t { 12741 break 12742 } 12743 d := v_1_0.AuxInt 12744 x := v_1.Args[1] 12745 v.reset(OpAdd64) 12746 v0 := b.NewValue0(v.Pos, OpConst64, t) 12747 v0.AuxInt = c * d 12748 v.AddArg(v0) 12749 v1 := b.NewValue0(v.Pos, OpMul64, t) 12750 v2 := b.NewValue0(v.Pos, OpConst64, t) 12751 v2.AuxInt = c 12752 v1.AddArg(v2) 12753 v1.AddArg(x) 12754 v.AddArg(v1) 12755 return true 12756 } 12757 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> x (Const64 <t> [d]))) 12758 // cond: 12759 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 12760 for { 12761 v_0 := v.Args[0] 12762 if v_0.Op != OpConst64 { 12763 break 12764 } 12765 t := v_0.Type 12766 c := v_0.AuxInt 12767 v_1 := v.Args[1] 12768 if v_1.Op != OpAdd64 { 12769 break 12770 } 12771 if v_1.Type != t { 12772 break 12773 } 12774 x := v_1.Args[0] 12775 v_1_1 := v_1.Args[1] 12776 if v_1_1.Op != OpConst64 { 12777 break 12778 } 12779 if v_1_1.Type != t { 12780 break 12781 } 12782 d := v_1_1.AuxInt 12783 v.reset(OpAdd64) 12784 v0 := b.NewValue0(v.Pos, OpConst64, t) 12785 v0.AuxInt = c * d 12786 v.AddArg(v0) 12787 v1 := b.NewValue0(v.Pos, OpMul64, t) 12788 v2 := b.NewValue0(v.Pos, OpConst64, t) 12789 v2.AuxInt = c 12790 v1.AddArg(v2) 12791 v1.AddArg(x) 12792 v.AddArg(v1) 12793 return true 12794 } 12795 // match: (Mul64 (Add64 <t> (Const64 <t> [d]) x) (Const64 <t> [c])) 12796 // cond: 12797 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 12798 for { 12799 v_0 := v.Args[0] 12800 if v_0.Op != OpAdd64 { 12801 break 12802 } 12803 t := v_0.Type 12804 v_0_0 := v_0.Args[0] 12805 if v_0_0.Op != OpConst64 { 12806 break 12807 } 12808 if v_0_0.Type != t { 12809 break 12810 } 12811 d := v_0_0.AuxInt 12812 x := v_0.Args[1] 12813 v_1 := v.Args[1] 12814 if v_1.Op != OpConst64 { 12815 break 12816 } 12817 if v_1.Type != t { 12818 break 12819 } 12820 c := v_1.AuxInt 12821 v.reset(OpAdd64) 12822 v0 := b.NewValue0(v.Pos, OpConst64, t) 12823 v0.AuxInt = c * d 12824 v.AddArg(v0) 12825 v1 := b.NewValue0(v.Pos, OpMul64, t) 12826 v2 := b.NewValue0(v.Pos, OpConst64, t) 12827 v2.AuxInt = c 12828 v1.AddArg(v2) 12829 v1.AddArg(x) 12830 v.AddArg(v1) 12831 return true 12832 } 12833 // match: (Mul64 (Add64 <t> x (Const64 <t> [d])) (Const64 <t> [c])) 12834 // cond: 12835 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 12836 for { 12837 v_0 := v.Args[0] 12838 if v_0.Op != OpAdd64 { 12839 break 12840 } 12841 t := v_0.Type 12842 x := v_0.Args[0] 12843 v_0_1 := v_0.Args[1] 12844 if v_0_1.Op != OpConst64 { 12845 break 12846 } 12847 if v_0_1.Type != t { 12848 break 12849 } 12850 d := v_0_1.AuxInt 12851 v_1 := v.Args[1] 12852 if v_1.Op != OpConst64 { 12853 break 12854 } 12855 if v_1.Type != t { 12856 break 12857 } 12858 c := v_1.AuxInt 12859 v.reset(OpAdd64) 12860 v0 := b.NewValue0(v.Pos, OpConst64, t) 12861 v0.AuxInt = c * d 12862 v.AddArg(v0) 12863 v1 := b.NewValue0(v.Pos, OpMul64, t) 12864 v2 := b.NewValue0(v.Pos, OpConst64, t) 12865 v2.AuxInt = c 12866 v1.AddArg(v2) 12867 v1.AddArg(x) 12868 v.AddArg(v1) 12869 return true 12870 } 12871 // match: (Mul64 (Const64 [0]) _) 12872 // cond: 12873 // result: (Const64 [0]) 12874 for { 12875 v_0 := v.Args[0] 12876 if v_0.Op != OpConst64 { 12877 break 12878 } 12879 if v_0.AuxInt != 0 { 12880 break 12881 } 12882 v.reset(OpConst64) 12883 v.AuxInt = 0 12884 return true 12885 } 12886 // match: (Mul64 _ (Const64 [0])) 12887 // cond: 12888 // result: (Const64 [0]) 12889 for { 12890 v_1 := v.Args[1] 12891 if v_1.Op != OpConst64 { 12892 break 12893 } 12894 if v_1.AuxInt != 0 { 12895 break 12896 } 12897 v.reset(OpConst64) 12898 v.AuxInt = 0 12899 return true 12900 } 12901 // match: (Mul64 (Const64 <t> [c]) (Mul64 (Const64 <t> [d]) x)) 12902 // cond: 12903 // result: (Mul64 (Const64 <t> [c*d]) x) 12904 for { 12905 v_0 := v.Args[0] 12906 if v_0.Op != OpConst64 { 12907 break 12908 } 12909 t := v_0.Type 12910 c := v_0.AuxInt 12911 v_1 := v.Args[1] 12912 if v_1.Op != OpMul64 { 12913 break 12914 } 12915 v_1_0 := v_1.Args[0] 12916 if v_1_0.Op != OpConst64 { 12917 break 12918 } 12919 if v_1_0.Type != t { 12920 break 12921 } 12922 d := v_1_0.AuxInt 12923 x := v_1.Args[1] 12924 v.reset(OpMul64) 12925 v0 := b.NewValue0(v.Pos, OpConst64, t) 12926 v0.AuxInt = c * d 12927 v.AddArg(v0) 12928 v.AddArg(x) 12929 return true 12930 } 12931 // match: (Mul64 (Const64 <t> [c]) (Mul64 x (Const64 <t> [d]))) 12932 // cond: 12933 // result: (Mul64 (Const64 <t> [c*d]) x) 12934 for { 12935 v_0 := v.Args[0] 12936 if v_0.Op != OpConst64 { 12937 break 12938 } 12939 t := v_0.Type 12940 c := v_0.AuxInt 12941 v_1 := v.Args[1] 12942 if v_1.Op != OpMul64 { 12943 break 12944 } 12945 x := v_1.Args[0] 12946 v_1_1 := v_1.Args[1] 12947 if v_1_1.Op != OpConst64 { 12948 break 12949 } 12950 if v_1_1.Type != t { 12951 break 12952 } 12953 d := v_1_1.AuxInt 12954 v.reset(OpMul64) 12955 v0 := b.NewValue0(v.Pos, OpConst64, t) 12956 v0.AuxInt = c * d 12957 v.AddArg(v0) 12958 v.AddArg(x) 12959 return true 12960 } 12961 // match: (Mul64 (Mul64 (Const64 <t> [d]) x) (Const64 <t> [c])) 12962 // cond: 12963 // result: (Mul64 (Const64 <t> [c*d]) x) 12964 for { 12965 v_0 := v.Args[0] 12966 if v_0.Op != OpMul64 { 12967 break 12968 } 12969 v_0_0 := v_0.Args[0] 12970 if v_0_0.Op != OpConst64 { 12971 break 12972 } 12973 t := v_0_0.Type 12974 d := v_0_0.AuxInt 12975 x := v_0.Args[1] 12976 v_1 := v.Args[1] 12977 if v_1.Op != OpConst64 { 12978 break 12979 } 12980 if v_1.Type != t { 12981 break 12982 } 12983 c := v_1.AuxInt 12984 v.reset(OpMul64) 12985 v0 := b.NewValue0(v.Pos, OpConst64, t) 12986 v0.AuxInt = c * d 12987 v.AddArg(v0) 12988 v.AddArg(x) 12989 return true 12990 } 12991 // match: (Mul64 (Mul64 x (Const64 <t> [d])) (Const64 <t> [c])) 12992 // cond: 12993 // result: (Mul64 (Const64 <t> [c*d]) x) 12994 for { 12995 v_0 := v.Args[0] 12996 if v_0.Op != OpMul64 { 12997 break 12998 } 12999 x := v_0.Args[0] 13000 v_0_1 := v_0.Args[1] 13001 if v_0_1.Op != OpConst64 { 13002 break 13003 } 13004 t := v_0_1.Type 13005 d := v_0_1.AuxInt 13006 v_1 := v.Args[1] 13007 if v_1.Op != OpConst64 { 13008 break 13009 } 13010 if v_1.Type != t { 13011 break 13012 } 13013 c := v_1.AuxInt 13014 v.reset(OpMul64) 13015 v0 := b.NewValue0(v.Pos, OpConst64, t) 13016 v0.AuxInt = c * d 13017 v.AddArg(v0) 13018 v.AddArg(x) 13019 return true 13020 } 13021 return false 13022 } 13023 func rewriteValuegeneric_OpMul64F_0(v *Value) bool { 13024 // match: (Mul64F (Const64F [c]) (Const64F [d])) 13025 // cond: 13026 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 13027 for { 13028 v_0 := v.Args[0] 13029 if v_0.Op != OpConst64F { 13030 break 13031 } 13032 c := v_0.AuxInt 13033 v_1 := v.Args[1] 13034 if v_1.Op != OpConst64F { 13035 break 13036 } 13037 d := v_1.AuxInt 13038 v.reset(OpConst64F) 13039 v.AuxInt = f2i(i2f(c) * i2f(d)) 13040 return true 13041 } 13042 // match: (Mul64F (Const64F [d]) (Const64F [c])) 13043 // cond: 13044 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 13045 for { 13046 v_0 := v.Args[0] 13047 if v_0.Op != OpConst64F { 13048 break 13049 } 13050 d := v_0.AuxInt 13051 v_1 := v.Args[1] 13052 if v_1.Op != OpConst64F { 13053 break 13054 } 13055 c := v_1.AuxInt 13056 v.reset(OpConst64F) 13057 v.AuxInt = f2i(i2f(c) * i2f(d)) 13058 return true 13059 } 13060 // match: (Mul64F x (Const64F [f2i(1)])) 13061 // cond: 13062 // result: x 13063 for { 13064 x := v.Args[0] 13065 v_1 := v.Args[1] 13066 if v_1.Op != OpConst64F { 13067 break 13068 } 13069 if v_1.AuxInt != f2i(1) { 13070 break 13071 } 13072 v.reset(OpCopy) 13073 v.Type = x.Type 13074 v.AddArg(x) 13075 return true 13076 } 13077 // match: (Mul64F (Const64F [f2i(1)]) x) 13078 // cond: 13079 // result: x 13080 for { 13081 v_0 := v.Args[0] 13082 if v_0.Op != OpConst64F { 13083 break 13084 } 13085 if v_0.AuxInt != f2i(1) { 13086 break 13087 } 13088 x := v.Args[1] 13089 v.reset(OpCopy) 13090 v.Type = x.Type 13091 v.AddArg(x) 13092 return true 13093 } 13094 // match: (Mul64F x (Const64F [f2i(-1)])) 13095 // cond: 13096 // result: (Neg64F x) 13097 for { 13098 x := v.Args[0] 13099 v_1 := v.Args[1] 13100 if v_1.Op != OpConst64F { 13101 break 13102 } 13103 if v_1.AuxInt != f2i(-1) { 13104 break 13105 } 13106 v.reset(OpNeg64F) 13107 v.AddArg(x) 13108 return true 13109 } 13110 // match: (Mul64F (Const64F [f2i(-1)]) x) 13111 // cond: 13112 // result: (Neg64F x) 13113 for { 13114 v_0 := v.Args[0] 13115 if v_0.Op != OpConst64F { 13116 break 13117 } 13118 if v_0.AuxInt != f2i(-1) { 13119 break 13120 } 13121 x := v.Args[1] 13122 v.reset(OpNeg64F) 13123 v.AddArg(x) 13124 return true 13125 } 13126 // match: (Mul64F x (Const64F [f2i(2)])) 13127 // cond: 13128 // result: (Add64F x x) 13129 for { 13130 x := v.Args[0] 13131 v_1 := v.Args[1] 13132 if v_1.Op != OpConst64F { 13133 break 13134 } 13135 if v_1.AuxInt != f2i(2) { 13136 break 13137 } 13138 v.reset(OpAdd64F) 13139 v.AddArg(x) 13140 v.AddArg(x) 13141 return true 13142 } 13143 // match: (Mul64F (Const64F [f2i(2)]) x) 13144 // cond: 13145 // result: (Add64F x x) 13146 for { 13147 v_0 := v.Args[0] 13148 if v_0.Op != OpConst64F { 13149 break 13150 } 13151 if v_0.AuxInt != f2i(2) { 13152 break 13153 } 13154 x := v.Args[1] 13155 v.reset(OpAdd64F) 13156 v.AddArg(x) 13157 v.AddArg(x) 13158 return true 13159 } 13160 return false 13161 } 13162 func rewriteValuegeneric_OpMul8_0(v *Value) bool { 13163 b := v.Block 13164 _ = b 13165 types := &b.Func.Config.Types 13166 _ = types 13167 // match: (Mul8 (Const8 [c]) (Const8 [d])) 13168 // cond: 13169 // result: (Const8 [int64(int8(c*d))]) 13170 for { 13171 v_0 := v.Args[0] 13172 if v_0.Op != OpConst8 { 13173 break 13174 } 13175 c := v_0.AuxInt 13176 v_1 := v.Args[1] 13177 if v_1.Op != OpConst8 { 13178 break 13179 } 13180 d := v_1.AuxInt 13181 v.reset(OpConst8) 13182 v.AuxInt = int64(int8(c * d)) 13183 return true 13184 } 13185 // match: (Mul8 (Const8 [d]) (Const8 [c])) 13186 // cond: 13187 // result: (Const8 [int64(int8(c*d))]) 13188 for { 13189 v_0 := v.Args[0] 13190 if v_0.Op != OpConst8 { 13191 break 13192 } 13193 d := v_0.AuxInt 13194 v_1 := v.Args[1] 13195 if v_1.Op != OpConst8 { 13196 break 13197 } 13198 c := v_1.AuxInt 13199 v.reset(OpConst8) 13200 v.AuxInt = int64(int8(c * d)) 13201 return true 13202 } 13203 // match: (Mul8 (Const8 [1]) x) 13204 // cond: 13205 // result: x 13206 for { 13207 v_0 := v.Args[0] 13208 if v_0.Op != OpConst8 { 13209 break 13210 } 13211 if v_0.AuxInt != 1 { 13212 break 13213 } 13214 x := v.Args[1] 13215 v.reset(OpCopy) 13216 v.Type = x.Type 13217 v.AddArg(x) 13218 return true 13219 } 13220 // match: (Mul8 x (Const8 [1])) 13221 // cond: 13222 // result: x 13223 for { 13224 x := v.Args[0] 13225 v_1 := v.Args[1] 13226 if v_1.Op != OpConst8 { 13227 break 13228 } 13229 if v_1.AuxInt != 1 { 13230 break 13231 } 13232 v.reset(OpCopy) 13233 v.Type = x.Type 13234 v.AddArg(x) 13235 return true 13236 } 13237 // match: (Mul8 (Const8 [-1]) x) 13238 // cond: 13239 // result: (Neg8 x) 13240 for { 13241 v_0 := v.Args[0] 13242 if v_0.Op != OpConst8 { 13243 break 13244 } 13245 if v_0.AuxInt != -1 { 13246 break 13247 } 13248 x := v.Args[1] 13249 v.reset(OpNeg8) 13250 v.AddArg(x) 13251 return true 13252 } 13253 // match: (Mul8 x (Const8 [-1])) 13254 // cond: 13255 // result: (Neg8 x) 13256 for { 13257 x := v.Args[0] 13258 v_1 := v.Args[1] 13259 if v_1.Op != OpConst8 { 13260 break 13261 } 13262 if v_1.AuxInt != -1 { 13263 break 13264 } 13265 v.reset(OpNeg8) 13266 v.AddArg(x) 13267 return true 13268 } 13269 // match: (Mul8 <t> n (Const8 [c])) 13270 // cond: isPowerOfTwo(c) 13271 // result: (Lsh8x64 <t> n (Const64 <types.UInt64> [log2(c)])) 13272 for { 13273 t := v.Type 13274 n := v.Args[0] 13275 v_1 := v.Args[1] 13276 if v_1.Op != OpConst8 { 13277 break 13278 } 13279 c := v_1.AuxInt 13280 if !(isPowerOfTwo(c)) { 13281 break 13282 } 13283 v.reset(OpLsh8x64) 13284 v.Type = t 13285 v.AddArg(n) 13286 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 13287 v0.AuxInt = log2(c) 13288 v.AddArg(v0) 13289 return true 13290 } 13291 // match: (Mul8 <t> (Const8 [c]) n) 13292 // cond: isPowerOfTwo(c) 13293 // result: (Lsh8x64 <t> n (Const64 <types.UInt64> [log2(c)])) 13294 for { 13295 t := v.Type 13296 v_0 := v.Args[0] 13297 if v_0.Op != OpConst8 { 13298 break 13299 } 13300 c := v_0.AuxInt 13301 n := v.Args[1] 13302 if !(isPowerOfTwo(c)) { 13303 break 13304 } 13305 v.reset(OpLsh8x64) 13306 v.Type = t 13307 v.AddArg(n) 13308 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 13309 v0.AuxInt = log2(c) 13310 v.AddArg(v0) 13311 return true 13312 } 13313 // match: (Mul8 <t> n (Const8 [c])) 13314 // cond: t.IsSigned() && isPowerOfTwo(-c) 13315 // result: (Neg8 (Lsh8x64 <t> n (Const64 <types.UInt64> [log2(-c)]))) 13316 for { 13317 t := v.Type 13318 n := v.Args[0] 13319 v_1 := v.Args[1] 13320 if v_1.Op != OpConst8 { 13321 break 13322 } 13323 c := v_1.AuxInt 13324 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13325 break 13326 } 13327 v.reset(OpNeg8) 13328 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 13329 v0.AddArg(n) 13330 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 13331 v1.AuxInt = log2(-c) 13332 v0.AddArg(v1) 13333 v.AddArg(v0) 13334 return true 13335 } 13336 // match: (Mul8 <t> (Const8 [c]) n) 13337 // cond: t.IsSigned() && isPowerOfTwo(-c) 13338 // result: (Neg8 (Lsh8x64 <t> n (Const64 <types.UInt64> [log2(-c)]))) 13339 for { 13340 t := v.Type 13341 v_0 := v.Args[0] 13342 if v_0.Op != OpConst8 { 13343 break 13344 } 13345 c := v_0.AuxInt 13346 n := v.Args[1] 13347 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13348 break 13349 } 13350 v.reset(OpNeg8) 13351 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 13352 v0.AddArg(n) 13353 v1 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 13354 v1.AuxInt = log2(-c) 13355 v0.AddArg(v1) 13356 v.AddArg(v0) 13357 return true 13358 } 13359 return false 13360 } 13361 func rewriteValuegeneric_OpMul8_10(v *Value) bool { 13362 b := v.Block 13363 _ = b 13364 // match: (Mul8 (Const8 [0]) _) 13365 // cond: 13366 // result: (Const8 [0]) 13367 for { 13368 v_0 := v.Args[0] 13369 if v_0.Op != OpConst8 { 13370 break 13371 } 13372 if v_0.AuxInt != 0 { 13373 break 13374 } 13375 v.reset(OpConst8) 13376 v.AuxInt = 0 13377 return true 13378 } 13379 // match: (Mul8 _ (Const8 [0])) 13380 // cond: 13381 // result: (Const8 [0]) 13382 for { 13383 v_1 := v.Args[1] 13384 if v_1.Op != OpConst8 { 13385 break 13386 } 13387 if v_1.AuxInt != 0 { 13388 break 13389 } 13390 v.reset(OpConst8) 13391 v.AuxInt = 0 13392 return true 13393 } 13394 // match: (Mul8 (Const8 <t> [c]) (Mul8 (Const8 <t> [d]) x)) 13395 // cond: 13396 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 13397 for { 13398 v_0 := v.Args[0] 13399 if v_0.Op != OpConst8 { 13400 break 13401 } 13402 t := v_0.Type 13403 c := v_0.AuxInt 13404 v_1 := v.Args[1] 13405 if v_1.Op != OpMul8 { 13406 break 13407 } 13408 v_1_0 := v_1.Args[0] 13409 if v_1_0.Op != OpConst8 { 13410 break 13411 } 13412 if v_1_0.Type != t { 13413 break 13414 } 13415 d := v_1_0.AuxInt 13416 x := v_1.Args[1] 13417 v.reset(OpMul8) 13418 v0 := b.NewValue0(v.Pos, OpConst8, t) 13419 v0.AuxInt = int64(int8(c * d)) 13420 v.AddArg(v0) 13421 v.AddArg(x) 13422 return true 13423 } 13424 // match: (Mul8 (Const8 <t> [c]) (Mul8 x (Const8 <t> [d]))) 13425 // cond: 13426 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 13427 for { 13428 v_0 := v.Args[0] 13429 if v_0.Op != OpConst8 { 13430 break 13431 } 13432 t := v_0.Type 13433 c := v_0.AuxInt 13434 v_1 := v.Args[1] 13435 if v_1.Op != OpMul8 { 13436 break 13437 } 13438 x := v_1.Args[0] 13439 v_1_1 := v_1.Args[1] 13440 if v_1_1.Op != OpConst8 { 13441 break 13442 } 13443 if v_1_1.Type != t { 13444 break 13445 } 13446 d := v_1_1.AuxInt 13447 v.reset(OpMul8) 13448 v0 := b.NewValue0(v.Pos, OpConst8, t) 13449 v0.AuxInt = int64(int8(c * d)) 13450 v.AddArg(v0) 13451 v.AddArg(x) 13452 return true 13453 } 13454 // match: (Mul8 (Mul8 (Const8 <t> [d]) x) (Const8 <t> [c])) 13455 // cond: 13456 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 13457 for { 13458 v_0 := v.Args[0] 13459 if v_0.Op != OpMul8 { 13460 break 13461 } 13462 v_0_0 := v_0.Args[0] 13463 if v_0_0.Op != OpConst8 { 13464 break 13465 } 13466 t := v_0_0.Type 13467 d := v_0_0.AuxInt 13468 x := v_0.Args[1] 13469 v_1 := v.Args[1] 13470 if v_1.Op != OpConst8 { 13471 break 13472 } 13473 if v_1.Type != t { 13474 break 13475 } 13476 c := v_1.AuxInt 13477 v.reset(OpMul8) 13478 v0 := b.NewValue0(v.Pos, OpConst8, t) 13479 v0.AuxInt = int64(int8(c * d)) 13480 v.AddArg(v0) 13481 v.AddArg(x) 13482 return true 13483 } 13484 // match: (Mul8 (Mul8 x (Const8 <t> [d])) (Const8 <t> [c])) 13485 // cond: 13486 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 13487 for { 13488 v_0 := v.Args[0] 13489 if v_0.Op != OpMul8 { 13490 break 13491 } 13492 x := v_0.Args[0] 13493 v_0_1 := v_0.Args[1] 13494 if v_0_1.Op != OpConst8 { 13495 break 13496 } 13497 t := v_0_1.Type 13498 d := v_0_1.AuxInt 13499 v_1 := v.Args[1] 13500 if v_1.Op != OpConst8 { 13501 break 13502 } 13503 if v_1.Type != t { 13504 break 13505 } 13506 c := v_1.AuxInt 13507 v.reset(OpMul8) 13508 v0 := b.NewValue0(v.Pos, OpConst8, t) 13509 v0.AuxInt = int64(int8(c * d)) 13510 v.AddArg(v0) 13511 v.AddArg(x) 13512 return true 13513 } 13514 return false 13515 } 13516 func rewriteValuegeneric_OpNeg16_0(v *Value) bool { 13517 // match: (Neg16 (Const16 [c])) 13518 // cond: 13519 // result: (Const16 [int64(-int16(c))]) 13520 for { 13521 v_0 := v.Args[0] 13522 if v_0.Op != OpConst16 { 13523 break 13524 } 13525 c := v_0.AuxInt 13526 v.reset(OpConst16) 13527 v.AuxInt = int64(-int16(c)) 13528 return true 13529 } 13530 // match: (Neg16 (Sub16 x y)) 13531 // cond: 13532 // result: (Sub16 y x) 13533 for { 13534 v_0 := v.Args[0] 13535 if v_0.Op != OpSub16 { 13536 break 13537 } 13538 x := v_0.Args[0] 13539 y := v_0.Args[1] 13540 v.reset(OpSub16) 13541 v.AddArg(y) 13542 v.AddArg(x) 13543 return true 13544 } 13545 return false 13546 } 13547 func rewriteValuegeneric_OpNeg32_0(v *Value) bool { 13548 // match: (Neg32 (Const32 [c])) 13549 // cond: 13550 // result: (Const32 [int64(-int32(c))]) 13551 for { 13552 v_0 := v.Args[0] 13553 if v_0.Op != OpConst32 { 13554 break 13555 } 13556 c := v_0.AuxInt 13557 v.reset(OpConst32) 13558 v.AuxInt = int64(-int32(c)) 13559 return true 13560 } 13561 // match: (Neg32 (Sub32 x y)) 13562 // cond: 13563 // result: (Sub32 y x) 13564 for { 13565 v_0 := v.Args[0] 13566 if v_0.Op != OpSub32 { 13567 break 13568 } 13569 x := v_0.Args[0] 13570 y := v_0.Args[1] 13571 v.reset(OpSub32) 13572 v.AddArg(y) 13573 v.AddArg(x) 13574 return true 13575 } 13576 return false 13577 } 13578 func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { 13579 // match: (Neg32F (Const32F [c])) 13580 // cond: i2f(c) != 0 13581 // result: (Const32F [f2i(-i2f(c))]) 13582 for { 13583 v_0 := v.Args[0] 13584 if v_0.Op != OpConst32F { 13585 break 13586 } 13587 c := v_0.AuxInt 13588 if !(i2f(c) != 0) { 13589 break 13590 } 13591 v.reset(OpConst32F) 13592 v.AuxInt = f2i(-i2f(c)) 13593 return true 13594 } 13595 return false 13596 } 13597 func rewriteValuegeneric_OpNeg64_0(v *Value) bool { 13598 // match: (Neg64 (Const64 [c])) 13599 // cond: 13600 // result: (Const64 [-c]) 13601 for { 13602 v_0 := v.Args[0] 13603 if v_0.Op != OpConst64 { 13604 break 13605 } 13606 c := v_0.AuxInt 13607 v.reset(OpConst64) 13608 v.AuxInt = -c 13609 return true 13610 } 13611 // match: (Neg64 (Sub64 x y)) 13612 // cond: 13613 // result: (Sub64 y x) 13614 for { 13615 v_0 := v.Args[0] 13616 if v_0.Op != OpSub64 { 13617 break 13618 } 13619 x := v_0.Args[0] 13620 y := v_0.Args[1] 13621 v.reset(OpSub64) 13622 v.AddArg(y) 13623 v.AddArg(x) 13624 return true 13625 } 13626 return false 13627 } 13628 func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { 13629 // match: (Neg64F (Const64F [c])) 13630 // cond: i2f(c) != 0 13631 // result: (Const64F [f2i(-i2f(c))]) 13632 for { 13633 v_0 := v.Args[0] 13634 if v_0.Op != OpConst64F { 13635 break 13636 } 13637 c := v_0.AuxInt 13638 if !(i2f(c) != 0) { 13639 break 13640 } 13641 v.reset(OpConst64F) 13642 v.AuxInt = f2i(-i2f(c)) 13643 return true 13644 } 13645 return false 13646 } 13647 func rewriteValuegeneric_OpNeg8_0(v *Value) bool { 13648 // match: (Neg8 (Const8 [c])) 13649 // cond: 13650 // result: (Const8 [int64( -int8(c))]) 13651 for { 13652 v_0 := v.Args[0] 13653 if v_0.Op != OpConst8 { 13654 break 13655 } 13656 c := v_0.AuxInt 13657 v.reset(OpConst8) 13658 v.AuxInt = int64(-int8(c)) 13659 return true 13660 } 13661 // match: (Neg8 (Sub8 x y)) 13662 // cond: 13663 // result: (Sub8 y x) 13664 for { 13665 v_0 := v.Args[0] 13666 if v_0.Op != OpSub8 { 13667 break 13668 } 13669 x := v_0.Args[0] 13670 y := v_0.Args[1] 13671 v.reset(OpSub8) 13672 v.AddArg(y) 13673 v.AddArg(x) 13674 return true 13675 } 13676 return false 13677 } 13678 func rewriteValuegeneric_OpNeq16_0(v *Value) bool { 13679 b := v.Block 13680 _ = b 13681 // match: (Neq16 x x) 13682 // cond: 13683 // result: (ConstBool [0]) 13684 for { 13685 x := v.Args[0] 13686 if x != v.Args[1] { 13687 break 13688 } 13689 v.reset(OpConstBool) 13690 v.AuxInt = 0 13691 return true 13692 } 13693 // match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 13694 // cond: 13695 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 13696 for { 13697 v_0 := v.Args[0] 13698 if v_0.Op != OpConst16 { 13699 break 13700 } 13701 t := v_0.Type 13702 c := v_0.AuxInt 13703 v_1 := v.Args[1] 13704 if v_1.Op != OpAdd16 { 13705 break 13706 } 13707 v_1_0 := v_1.Args[0] 13708 if v_1_0.Op != OpConst16 { 13709 break 13710 } 13711 if v_1_0.Type != t { 13712 break 13713 } 13714 d := v_1_0.AuxInt 13715 x := v_1.Args[1] 13716 v.reset(OpNeq16) 13717 v0 := b.NewValue0(v.Pos, OpConst16, t) 13718 v0.AuxInt = int64(int16(c - d)) 13719 v.AddArg(v0) 13720 v.AddArg(x) 13721 return true 13722 } 13723 // match: (Neq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 13724 // cond: 13725 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 13726 for { 13727 v_0 := v.Args[0] 13728 if v_0.Op != OpConst16 { 13729 break 13730 } 13731 t := v_0.Type 13732 c := v_0.AuxInt 13733 v_1 := v.Args[1] 13734 if v_1.Op != OpAdd16 { 13735 break 13736 } 13737 x := v_1.Args[0] 13738 v_1_1 := v_1.Args[1] 13739 if v_1_1.Op != OpConst16 { 13740 break 13741 } 13742 if v_1_1.Type != t { 13743 break 13744 } 13745 d := v_1_1.AuxInt 13746 v.reset(OpNeq16) 13747 v0 := b.NewValue0(v.Pos, OpConst16, t) 13748 v0.AuxInt = int64(int16(c - d)) 13749 v.AddArg(v0) 13750 v.AddArg(x) 13751 return true 13752 } 13753 // match: (Neq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 13754 // cond: 13755 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 13756 for { 13757 v_0 := v.Args[0] 13758 if v_0.Op != OpAdd16 { 13759 break 13760 } 13761 v_0_0 := v_0.Args[0] 13762 if v_0_0.Op != OpConst16 { 13763 break 13764 } 13765 t := v_0_0.Type 13766 d := v_0_0.AuxInt 13767 x := v_0.Args[1] 13768 v_1 := v.Args[1] 13769 if v_1.Op != OpConst16 { 13770 break 13771 } 13772 if v_1.Type != t { 13773 break 13774 } 13775 c := v_1.AuxInt 13776 v.reset(OpNeq16) 13777 v0 := b.NewValue0(v.Pos, OpConst16, t) 13778 v0.AuxInt = int64(int16(c - d)) 13779 v.AddArg(v0) 13780 v.AddArg(x) 13781 return true 13782 } 13783 // match: (Neq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 13784 // cond: 13785 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 13786 for { 13787 v_0 := v.Args[0] 13788 if v_0.Op != OpAdd16 { 13789 break 13790 } 13791 x := v_0.Args[0] 13792 v_0_1 := v_0.Args[1] 13793 if v_0_1.Op != OpConst16 { 13794 break 13795 } 13796 t := v_0_1.Type 13797 d := v_0_1.AuxInt 13798 v_1 := v.Args[1] 13799 if v_1.Op != OpConst16 { 13800 break 13801 } 13802 if v_1.Type != t { 13803 break 13804 } 13805 c := v_1.AuxInt 13806 v.reset(OpNeq16) 13807 v0 := b.NewValue0(v.Pos, OpConst16, t) 13808 v0.AuxInt = int64(int16(c - d)) 13809 v.AddArg(v0) 13810 v.AddArg(x) 13811 return true 13812 } 13813 // match: (Neq16 (Const16 [c]) (Const16 [d])) 13814 // cond: 13815 // result: (ConstBool [b2i(c != d)]) 13816 for { 13817 v_0 := v.Args[0] 13818 if v_0.Op != OpConst16 { 13819 break 13820 } 13821 c := v_0.AuxInt 13822 v_1 := v.Args[1] 13823 if v_1.Op != OpConst16 { 13824 break 13825 } 13826 d := v_1.AuxInt 13827 v.reset(OpConstBool) 13828 v.AuxInt = b2i(c != d) 13829 return true 13830 } 13831 // match: (Neq16 (Const16 [d]) (Const16 [c])) 13832 // cond: 13833 // result: (ConstBool [b2i(c != d)]) 13834 for { 13835 v_0 := v.Args[0] 13836 if v_0.Op != OpConst16 { 13837 break 13838 } 13839 d := v_0.AuxInt 13840 v_1 := v.Args[1] 13841 if v_1.Op != OpConst16 { 13842 break 13843 } 13844 c := v_1.AuxInt 13845 v.reset(OpConstBool) 13846 v.AuxInt = b2i(c != d) 13847 return true 13848 } 13849 return false 13850 } 13851 func rewriteValuegeneric_OpNeq32_0(v *Value) bool { 13852 b := v.Block 13853 _ = b 13854 // match: (Neq32 x x) 13855 // cond: 13856 // result: (ConstBool [0]) 13857 for { 13858 x := v.Args[0] 13859 if x != v.Args[1] { 13860 break 13861 } 13862 v.reset(OpConstBool) 13863 v.AuxInt = 0 13864 return true 13865 } 13866 // match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 13867 // cond: 13868 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 13869 for { 13870 v_0 := v.Args[0] 13871 if v_0.Op != OpConst32 { 13872 break 13873 } 13874 t := v_0.Type 13875 c := v_0.AuxInt 13876 v_1 := v.Args[1] 13877 if v_1.Op != OpAdd32 { 13878 break 13879 } 13880 v_1_0 := v_1.Args[0] 13881 if v_1_0.Op != OpConst32 { 13882 break 13883 } 13884 if v_1_0.Type != t { 13885 break 13886 } 13887 d := v_1_0.AuxInt 13888 x := v_1.Args[1] 13889 v.reset(OpNeq32) 13890 v0 := b.NewValue0(v.Pos, OpConst32, t) 13891 v0.AuxInt = int64(int32(c - d)) 13892 v.AddArg(v0) 13893 v.AddArg(x) 13894 return true 13895 } 13896 // match: (Neq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 13897 // cond: 13898 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 13899 for { 13900 v_0 := v.Args[0] 13901 if v_0.Op != OpConst32 { 13902 break 13903 } 13904 t := v_0.Type 13905 c := v_0.AuxInt 13906 v_1 := v.Args[1] 13907 if v_1.Op != OpAdd32 { 13908 break 13909 } 13910 x := v_1.Args[0] 13911 v_1_1 := v_1.Args[1] 13912 if v_1_1.Op != OpConst32 { 13913 break 13914 } 13915 if v_1_1.Type != t { 13916 break 13917 } 13918 d := v_1_1.AuxInt 13919 v.reset(OpNeq32) 13920 v0 := b.NewValue0(v.Pos, OpConst32, t) 13921 v0.AuxInt = int64(int32(c - d)) 13922 v.AddArg(v0) 13923 v.AddArg(x) 13924 return true 13925 } 13926 // match: (Neq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 13927 // cond: 13928 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 13929 for { 13930 v_0 := v.Args[0] 13931 if v_0.Op != OpAdd32 { 13932 break 13933 } 13934 v_0_0 := v_0.Args[0] 13935 if v_0_0.Op != OpConst32 { 13936 break 13937 } 13938 t := v_0_0.Type 13939 d := v_0_0.AuxInt 13940 x := v_0.Args[1] 13941 v_1 := v.Args[1] 13942 if v_1.Op != OpConst32 { 13943 break 13944 } 13945 if v_1.Type != t { 13946 break 13947 } 13948 c := v_1.AuxInt 13949 v.reset(OpNeq32) 13950 v0 := b.NewValue0(v.Pos, OpConst32, t) 13951 v0.AuxInt = int64(int32(c - d)) 13952 v.AddArg(v0) 13953 v.AddArg(x) 13954 return true 13955 } 13956 // match: (Neq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 13957 // cond: 13958 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 13959 for { 13960 v_0 := v.Args[0] 13961 if v_0.Op != OpAdd32 { 13962 break 13963 } 13964 x := v_0.Args[0] 13965 v_0_1 := v_0.Args[1] 13966 if v_0_1.Op != OpConst32 { 13967 break 13968 } 13969 t := v_0_1.Type 13970 d := v_0_1.AuxInt 13971 v_1 := v.Args[1] 13972 if v_1.Op != OpConst32 { 13973 break 13974 } 13975 if v_1.Type != t { 13976 break 13977 } 13978 c := v_1.AuxInt 13979 v.reset(OpNeq32) 13980 v0 := b.NewValue0(v.Pos, OpConst32, t) 13981 v0.AuxInt = int64(int32(c - d)) 13982 v.AddArg(v0) 13983 v.AddArg(x) 13984 return true 13985 } 13986 // match: (Neq32 (Const32 [c]) (Const32 [d])) 13987 // cond: 13988 // result: (ConstBool [b2i(c != d)]) 13989 for { 13990 v_0 := v.Args[0] 13991 if v_0.Op != OpConst32 { 13992 break 13993 } 13994 c := v_0.AuxInt 13995 v_1 := v.Args[1] 13996 if v_1.Op != OpConst32 { 13997 break 13998 } 13999 d := v_1.AuxInt 14000 v.reset(OpConstBool) 14001 v.AuxInt = b2i(c != d) 14002 return true 14003 } 14004 // match: (Neq32 (Const32 [d]) (Const32 [c])) 14005 // cond: 14006 // result: (ConstBool [b2i(c != d)]) 14007 for { 14008 v_0 := v.Args[0] 14009 if v_0.Op != OpConst32 { 14010 break 14011 } 14012 d := v_0.AuxInt 14013 v_1 := v.Args[1] 14014 if v_1.Op != OpConst32 { 14015 break 14016 } 14017 c := v_1.AuxInt 14018 v.reset(OpConstBool) 14019 v.AuxInt = b2i(c != d) 14020 return true 14021 } 14022 return false 14023 } 14024 func rewriteValuegeneric_OpNeq64_0(v *Value) bool { 14025 b := v.Block 14026 _ = b 14027 // match: (Neq64 x x) 14028 // cond: 14029 // result: (ConstBool [0]) 14030 for { 14031 x := v.Args[0] 14032 if x != v.Args[1] { 14033 break 14034 } 14035 v.reset(OpConstBool) 14036 v.AuxInt = 0 14037 return true 14038 } 14039 // match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 14040 // cond: 14041 // result: (Neq64 (Const64 <t> [c-d]) x) 14042 for { 14043 v_0 := v.Args[0] 14044 if v_0.Op != OpConst64 { 14045 break 14046 } 14047 t := v_0.Type 14048 c := v_0.AuxInt 14049 v_1 := v.Args[1] 14050 if v_1.Op != OpAdd64 { 14051 break 14052 } 14053 v_1_0 := v_1.Args[0] 14054 if v_1_0.Op != OpConst64 { 14055 break 14056 } 14057 if v_1_0.Type != t { 14058 break 14059 } 14060 d := v_1_0.AuxInt 14061 x := v_1.Args[1] 14062 v.reset(OpNeq64) 14063 v0 := b.NewValue0(v.Pos, OpConst64, t) 14064 v0.AuxInt = c - d 14065 v.AddArg(v0) 14066 v.AddArg(x) 14067 return true 14068 } 14069 // match: (Neq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 14070 // cond: 14071 // result: (Neq64 (Const64 <t> [c-d]) x) 14072 for { 14073 v_0 := v.Args[0] 14074 if v_0.Op != OpConst64 { 14075 break 14076 } 14077 t := v_0.Type 14078 c := v_0.AuxInt 14079 v_1 := v.Args[1] 14080 if v_1.Op != OpAdd64 { 14081 break 14082 } 14083 x := v_1.Args[0] 14084 v_1_1 := v_1.Args[1] 14085 if v_1_1.Op != OpConst64 { 14086 break 14087 } 14088 if v_1_1.Type != t { 14089 break 14090 } 14091 d := v_1_1.AuxInt 14092 v.reset(OpNeq64) 14093 v0 := b.NewValue0(v.Pos, OpConst64, t) 14094 v0.AuxInt = c - d 14095 v.AddArg(v0) 14096 v.AddArg(x) 14097 return true 14098 } 14099 // match: (Neq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 14100 // cond: 14101 // result: (Neq64 (Const64 <t> [c-d]) x) 14102 for { 14103 v_0 := v.Args[0] 14104 if v_0.Op != OpAdd64 { 14105 break 14106 } 14107 v_0_0 := v_0.Args[0] 14108 if v_0_0.Op != OpConst64 { 14109 break 14110 } 14111 t := v_0_0.Type 14112 d := v_0_0.AuxInt 14113 x := v_0.Args[1] 14114 v_1 := v.Args[1] 14115 if v_1.Op != OpConst64 { 14116 break 14117 } 14118 if v_1.Type != t { 14119 break 14120 } 14121 c := v_1.AuxInt 14122 v.reset(OpNeq64) 14123 v0 := b.NewValue0(v.Pos, OpConst64, t) 14124 v0.AuxInt = c - d 14125 v.AddArg(v0) 14126 v.AddArg(x) 14127 return true 14128 } 14129 // match: (Neq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 14130 // cond: 14131 // result: (Neq64 (Const64 <t> [c-d]) x) 14132 for { 14133 v_0 := v.Args[0] 14134 if v_0.Op != OpAdd64 { 14135 break 14136 } 14137 x := v_0.Args[0] 14138 v_0_1 := v_0.Args[1] 14139 if v_0_1.Op != OpConst64 { 14140 break 14141 } 14142 t := v_0_1.Type 14143 d := v_0_1.AuxInt 14144 v_1 := v.Args[1] 14145 if v_1.Op != OpConst64 { 14146 break 14147 } 14148 if v_1.Type != t { 14149 break 14150 } 14151 c := v_1.AuxInt 14152 v.reset(OpNeq64) 14153 v0 := b.NewValue0(v.Pos, OpConst64, t) 14154 v0.AuxInt = c - d 14155 v.AddArg(v0) 14156 v.AddArg(x) 14157 return true 14158 } 14159 // match: (Neq64 (Const64 [c]) (Const64 [d])) 14160 // cond: 14161 // result: (ConstBool [b2i(c != d)]) 14162 for { 14163 v_0 := v.Args[0] 14164 if v_0.Op != OpConst64 { 14165 break 14166 } 14167 c := v_0.AuxInt 14168 v_1 := v.Args[1] 14169 if v_1.Op != OpConst64 { 14170 break 14171 } 14172 d := v_1.AuxInt 14173 v.reset(OpConstBool) 14174 v.AuxInt = b2i(c != d) 14175 return true 14176 } 14177 // match: (Neq64 (Const64 [d]) (Const64 [c])) 14178 // cond: 14179 // result: (ConstBool [b2i(c != d)]) 14180 for { 14181 v_0 := v.Args[0] 14182 if v_0.Op != OpConst64 { 14183 break 14184 } 14185 d := v_0.AuxInt 14186 v_1 := v.Args[1] 14187 if v_1.Op != OpConst64 { 14188 break 14189 } 14190 c := v_1.AuxInt 14191 v.reset(OpConstBool) 14192 v.AuxInt = b2i(c != d) 14193 return true 14194 } 14195 return false 14196 } 14197 func rewriteValuegeneric_OpNeq8_0(v *Value) bool { 14198 b := v.Block 14199 _ = b 14200 // match: (Neq8 x x) 14201 // cond: 14202 // result: (ConstBool [0]) 14203 for { 14204 x := v.Args[0] 14205 if x != v.Args[1] { 14206 break 14207 } 14208 v.reset(OpConstBool) 14209 v.AuxInt = 0 14210 return true 14211 } 14212 // match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 14213 // cond: 14214 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 14215 for { 14216 v_0 := v.Args[0] 14217 if v_0.Op != OpConst8 { 14218 break 14219 } 14220 t := v_0.Type 14221 c := v_0.AuxInt 14222 v_1 := v.Args[1] 14223 if v_1.Op != OpAdd8 { 14224 break 14225 } 14226 v_1_0 := v_1.Args[0] 14227 if v_1_0.Op != OpConst8 { 14228 break 14229 } 14230 if v_1_0.Type != t { 14231 break 14232 } 14233 d := v_1_0.AuxInt 14234 x := v_1.Args[1] 14235 v.reset(OpNeq8) 14236 v0 := b.NewValue0(v.Pos, OpConst8, t) 14237 v0.AuxInt = int64(int8(c - d)) 14238 v.AddArg(v0) 14239 v.AddArg(x) 14240 return true 14241 } 14242 // match: (Neq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 14243 // cond: 14244 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 14245 for { 14246 v_0 := v.Args[0] 14247 if v_0.Op != OpConst8 { 14248 break 14249 } 14250 t := v_0.Type 14251 c := v_0.AuxInt 14252 v_1 := v.Args[1] 14253 if v_1.Op != OpAdd8 { 14254 break 14255 } 14256 x := v_1.Args[0] 14257 v_1_1 := v_1.Args[1] 14258 if v_1_1.Op != OpConst8 { 14259 break 14260 } 14261 if v_1_1.Type != t { 14262 break 14263 } 14264 d := v_1_1.AuxInt 14265 v.reset(OpNeq8) 14266 v0 := b.NewValue0(v.Pos, OpConst8, t) 14267 v0.AuxInt = int64(int8(c - d)) 14268 v.AddArg(v0) 14269 v.AddArg(x) 14270 return true 14271 } 14272 // match: (Neq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 14273 // cond: 14274 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 14275 for { 14276 v_0 := v.Args[0] 14277 if v_0.Op != OpAdd8 { 14278 break 14279 } 14280 v_0_0 := v_0.Args[0] 14281 if v_0_0.Op != OpConst8 { 14282 break 14283 } 14284 t := v_0_0.Type 14285 d := v_0_0.AuxInt 14286 x := v_0.Args[1] 14287 v_1 := v.Args[1] 14288 if v_1.Op != OpConst8 { 14289 break 14290 } 14291 if v_1.Type != t { 14292 break 14293 } 14294 c := v_1.AuxInt 14295 v.reset(OpNeq8) 14296 v0 := b.NewValue0(v.Pos, OpConst8, t) 14297 v0.AuxInt = int64(int8(c - d)) 14298 v.AddArg(v0) 14299 v.AddArg(x) 14300 return true 14301 } 14302 // match: (Neq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 14303 // cond: 14304 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 14305 for { 14306 v_0 := v.Args[0] 14307 if v_0.Op != OpAdd8 { 14308 break 14309 } 14310 x := v_0.Args[0] 14311 v_0_1 := v_0.Args[1] 14312 if v_0_1.Op != OpConst8 { 14313 break 14314 } 14315 t := v_0_1.Type 14316 d := v_0_1.AuxInt 14317 v_1 := v.Args[1] 14318 if v_1.Op != OpConst8 { 14319 break 14320 } 14321 if v_1.Type != t { 14322 break 14323 } 14324 c := v_1.AuxInt 14325 v.reset(OpNeq8) 14326 v0 := b.NewValue0(v.Pos, OpConst8, t) 14327 v0.AuxInt = int64(int8(c - d)) 14328 v.AddArg(v0) 14329 v.AddArg(x) 14330 return true 14331 } 14332 // match: (Neq8 (Const8 [c]) (Const8 [d])) 14333 // cond: 14334 // result: (ConstBool [b2i(c != d)]) 14335 for { 14336 v_0 := v.Args[0] 14337 if v_0.Op != OpConst8 { 14338 break 14339 } 14340 c := v_0.AuxInt 14341 v_1 := v.Args[1] 14342 if v_1.Op != OpConst8 { 14343 break 14344 } 14345 d := v_1.AuxInt 14346 v.reset(OpConstBool) 14347 v.AuxInt = b2i(c != d) 14348 return true 14349 } 14350 // match: (Neq8 (Const8 [d]) (Const8 [c])) 14351 // cond: 14352 // result: (ConstBool [b2i(c != d)]) 14353 for { 14354 v_0 := v.Args[0] 14355 if v_0.Op != OpConst8 { 14356 break 14357 } 14358 d := v_0.AuxInt 14359 v_1 := v.Args[1] 14360 if v_1.Op != OpConst8 { 14361 break 14362 } 14363 c := v_1.AuxInt 14364 v.reset(OpConstBool) 14365 v.AuxInt = b2i(c != d) 14366 return true 14367 } 14368 return false 14369 } 14370 func rewriteValuegeneric_OpNeqB_0(v *Value) bool { 14371 // match: (NeqB (ConstBool [c]) (ConstBool [d])) 14372 // cond: 14373 // result: (ConstBool [b2i(c != d)]) 14374 for { 14375 v_0 := v.Args[0] 14376 if v_0.Op != OpConstBool { 14377 break 14378 } 14379 c := v_0.AuxInt 14380 v_1 := v.Args[1] 14381 if v_1.Op != OpConstBool { 14382 break 14383 } 14384 d := v_1.AuxInt 14385 v.reset(OpConstBool) 14386 v.AuxInt = b2i(c != d) 14387 return true 14388 } 14389 // match: (NeqB (ConstBool [0]) x) 14390 // cond: 14391 // result: x 14392 for { 14393 v_0 := v.Args[0] 14394 if v_0.Op != OpConstBool { 14395 break 14396 } 14397 if v_0.AuxInt != 0 { 14398 break 14399 } 14400 x := v.Args[1] 14401 v.reset(OpCopy) 14402 v.Type = x.Type 14403 v.AddArg(x) 14404 return true 14405 } 14406 // match: (NeqB (ConstBool [1]) x) 14407 // cond: 14408 // result: (Not x) 14409 for { 14410 v_0 := v.Args[0] 14411 if v_0.Op != OpConstBool { 14412 break 14413 } 14414 if v_0.AuxInt != 1 { 14415 break 14416 } 14417 x := v.Args[1] 14418 v.reset(OpNot) 14419 v.AddArg(x) 14420 return true 14421 } 14422 return false 14423 } 14424 func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { 14425 b := v.Block 14426 _ = b 14427 types := &b.Func.Config.Types 14428 _ = types 14429 // match: (NeqInter x y) 14430 // cond: 14431 // result: (NeqPtr (ITab x) (ITab y)) 14432 for { 14433 x := v.Args[0] 14434 y := v.Args[1] 14435 v.reset(OpNeqPtr) 14436 v0 := b.NewValue0(v.Pos, OpITab, types.BytePtr) 14437 v0.AddArg(x) 14438 v.AddArg(v0) 14439 v1 := b.NewValue0(v.Pos, OpITab, types.BytePtr) 14440 v1.AddArg(y) 14441 v.AddArg(v1) 14442 return true 14443 } 14444 } 14445 func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { 14446 // match: (NeqPtr p (ConstNil)) 14447 // cond: 14448 // result: (IsNonNil p) 14449 for { 14450 p := v.Args[0] 14451 v_1 := v.Args[1] 14452 if v_1.Op != OpConstNil { 14453 break 14454 } 14455 v.reset(OpIsNonNil) 14456 v.AddArg(p) 14457 return true 14458 } 14459 // match: (NeqPtr (ConstNil) p) 14460 // cond: 14461 // result: (IsNonNil p) 14462 for { 14463 v_0 := v.Args[0] 14464 if v_0.Op != OpConstNil { 14465 break 14466 } 14467 p := v.Args[1] 14468 v.reset(OpIsNonNil) 14469 v.AddArg(p) 14470 return true 14471 } 14472 return false 14473 } 14474 func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { 14475 b := v.Block 14476 _ = b 14477 types := &b.Func.Config.Types 14478 _ = types 14479 // match: (NeqSlice x y) 14480 // cond: 14481 // result: (NeqPtr (SlicePtr x) (SlicePtr y)) 14482 for { 14483 x := v.Args[0] 14484 y := v.Args[1] 14485 v.reset(OpNeqPtr) 14486 v0 := b.NewValue0(v.Pos, OpSlicePtr, types.BytePtr) 14487 v0.AddArg(x) 14488 v.AddArg(v0) 14489 v1 := b.NewValue0(v.Pos, OpSlicePtr, types.BytePtr) 14490 v1.AddArg(y) 14491 v.AddArg(v1) 14492 return true 14493 } 14494 } 14495 func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { 14496 b := v.Block 14497 _ = b 14498 config := b.Func.Config 14499 _ = config 14500 fe := b.Func.fe 14501 _ = fe 14502 // match: (NilCheck (GetG mem) mem) 14503 // cond: 14504 // result: mem 14505 for { 14506 v_0 := v.Args[0] 14507 if v_0.Op != OpGetG { 14508 break 14509 } 14510 mem := v_0.Args[0] 14511 if mem != v.Args[1] { 14512 break 14513 } 14514 v.reset(OpCopy) 14515 v.Type = mem.Type 14516 v.AddArg(mem) 14517 return true 14518 } 14519 // match: (NilCheck (Load (OffPtr [c] (SP)) mem) mem) 14520 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 14521 // result: (Invalid) 14522 for { 14523 v_0 := v.Args[0] 14524 if v_0.Op != OpLoad { 14525 break 14526 } 14527 v_0_0 := v_0.Args[0] 14528 if v_0_0.Op != OpOffPtr { 14529 break 14530 } 14531 c := v_0_0.AuxInt 14532 v_0_0_0 := v_0_0.Args[0] 14533 if v_0_0_0.Op != OpSP { 14534 break 14535 } 14536 mem := v_0.Args[1] 14537 if mem != v.Args[1] { 14538 break 14539 } 14540 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 14541 break 14542 } 14543 v.reset(OpInvalid) 14544 return true 14545 } 14546 // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) mem)) mem) 14547 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 14548 // result: (Invalid) 14549 for { 14550 v_0 := v.Args[0] 14551 if v_0.Op != OpOffPtr { 14552 break 14553 } 14554 v_0_0 := v_0.Args[0] 14555 if v_0_0.Op != OpLoad { 14556 break 14557 } 14558 v_0_0_0 := v_0_0.Args[0] 14559 if v_0_0_0.Op != OpOffPtr { 14560 break 14561 } 14562 c := v_0_0_0.AuxInt 14563 v_0_0_0_0 := v_0_0_0.Args[0] 14564 if v_0_0_0_0.Op != OpSP { 14565 break 14566 } 14567 mem := v_0_0.Args[1] 14568 if mem != v.Args[1] { 14569 break 14570 } 14571 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 14572 break 14573 } 14574 v.reset(OpInvalid) 14575 return true 14576 } 14577 return false 14578 } 14579 func rewriteValuegeneric_OpNot_0(v *Value) bool { 14580 // match: (Not (Eq64 x y)) 14581 // cond: 14582 // result: (Neq64 x y) 14583 for { 14584 v_0 := v.Args[0] 14585 if v_0.Op != OpEq64 { 14586 break 14587 } 14588 x := v_0.Args[0] 14589 y := v_0.Args[1] 14590 v.reset(OpNeq64) 14591 v.AddArg(x) 14592 v.AddArg(y) 14593 return true 14594 } 14595 // match: (Not (Eq32 x y)) 14596 // cond: 14597 // result: (Neq32 x y) 14598 for { 14599 v_0 := v.Args[0] 14600 if v_0.Op != OpEq32 { 14601 break 14602 } 14603 x := v_0.Args[0] 14604 y := v_0.Args[1] 14605 v.reset(OpNeq32) 14606 v.AddArg(x) 14607 v.AddArg(y) 14608 return true 14609 } 14610 // match: (Not (Eq16 x y)) 14611 // cond: 14612 // result: (Neq16 x y) 14613 for { 14614 v_0 := v.Args[0] 14615 if v_0.Op != OpEq16 { 14616 break 14617 } 14618 x := v_0.Args[0] 14619 y := v_0.Args[1] 14620 v.reset(OpNeq16) 14621 v.AddArg(x) 14622 v.AddArg(y) 14623 return true 14624 } 14625 // match: (Not (Eq8 x y)) 14626 // cond: 14627 // result: (Neq8 x y) 14628 for { 14629 v_0 := v.Args[0] 14630 if v_0.Op != OpEq8 { 14631 break 14632 } 14633 x := v_0.Args[0] 14634 y := v_0.Args[1] 14635 v.reset(OpNeq8) 14636 v.AddArg(x) 14637 v.AddArg(y) 14638 return true 14639 } 14640 // match: (Not (EqB x y)) 14641 // cond: 14642 // result: (NeqB x y) 14643 for { 14644 v_0 := v.Args[0] 14645 if v_0.Op != OpEqB { 14646 break 14647 } 14648 x := v_0.Args[0] 14649 y := v_0.Args[1] 14650 v.reset(OpNeqB) 14651 v.AddArg(x) 14652 v.AddArg(y) 14653 return true 14654 } 14655 // match: (Not (Neq64 x y)) 14656 // cond: 14657 // result: (Eq64 x y) 14658 for { 14659 v_0 := v.Args[0] 14660 if v_0.Op != OpNeq64 { 14661 break 14662 } 14663 x := v_0.Args[0] 14664 y := v_0.Args[1] 14665 v.reset(OpEq64) 14666 v.AddArg(x) 14667 v.AddArg(y) 14668 return true 14669 } 14670 // match: (Not (Neq32 x y)) 14671 // cond: 14672 // result: (Eq32 x y) 14673 for { 14674 v_0 := v.Args[0] 14675 if v_0.Op != OpNeq32 { 14676 break 14677 } 14678 x := v_0.Args[0] 14679 y := v_0.Args[1] 14680 v.reset(OpEq32) 14681 v.AddArg(x) 14682 v.AddArg(y) 14683 return true 14684 } 14685 // match: (Not (Neq16 x y)) 14686 // cond: 14687 // result: (Eq16 x y) 14688 for { 14689 v_0 := v.Args[0] 14690 if v_0.Op != OpNeq16 { 14691 break 14692 } 14693 x := v_0.Args[0] 14694 y := v_0.Args[1] 14695 v.reset(OpEq16) 14696 v.AddArg(x) 14697 v.AddArg(y) 14698 return true 14699 } 14700 // match: (Not (Neq8 x y)) 14701 // cond: 14702 // result: (Eq8 x y) 14703 for { 14704 v_0 := v.Args[0] 14705 if v_0.Op != OpNeq8 { 14706 break 14707 } 14708 x := v_0.Args[0] 14709 y := v_0.Args[1] 14710 v.reset(OpEq8) 14711 v.AddArg(x) 14712 v.AddArg(y) 14713 return true 14714 } 14715 // match: (Not (NeqB x y)) 14716 // cond: 14717 // result: (EqB x y) 14718 for { 14719 v_0 := v.Args[0] 14720 if v_0.Op != OpNeqB { 14721 break 14722 } 14723 x := v_0.Args[0] 14724 y := v_0.Args[1] 14725 v.reset(OpEqB) 14726 v.AddArg(x) 14727 v.AddArg(y) 14728 return true 14729 } 14730 return false 14731 } 14732 func rewriteValuegeneric_OpNot_10(v *Value) bool { 14733 // match: (Not (Greater64 x y)) 14734 // cond: 14735 // result: (Leq64 x y) 14736 for { 14737 v_0 := v.Args[0] 14738 if v_0.Op != OpGreater64 { 14739 break 14740 } 14741 x := v_0.Args[0] 14742 y := v_0.Args[1] 14743 v.reset(OpLeq64) 14744 v.AddArg(x) 14745 v.AddArg(y) 14746 return true 14747 } 14748 // match: (Not (Greater32 x y)) 14749 // cond: 14750 // result: (Leq32 x y) 14751 for { 14752 v_0 := v.Args[0] 14753 if v_0.Op != OpGreater32 { 14754 break 14755 } 14756 x := v_0.Args[0] 14757 y := v_0.Args[1] 14758 v.reset(OpLeq32) 14759 v.AddArg(x) 14760 v.AddArg(y) 14761 return true 14762 } 14763 // match: (Not (Greater16 x y)) 14764 // cond: 14765 // result: (Leq16 x y) 14766 for { 14767 v_0 := v.Args[0] 14768 if v_0.Op != OpGreater16 { 14769 break 14770 } 14771 x := v_0.Args[0] 14772 y := v_0.Args[1] 14773 v.reset(OpLeq16) 14774 v.AddArg(x) 14775 v.AddArg(y) 14776 return true 14777 } 14778 // match: (Not (Greater8 x y)) 14779 // cond: 14780 // result: (Leq8 x y) 14781 for { 14782 v_0 := v.Args[0] 14783 if v_0.Op != OpGreater8 { 14784 break 14785 } 14786 x := v_0.Args[0] 14787 y := v_0.Args[1] 14788 v.reset(OpLeq8) 14789 v.AddArg(x) 14790 v.AddArg(y) 14791 return true 14792 } 14793 // match: (Not (Greater64U x y)) 14794 // cond: 14795 // result: (Leq64U x y) 14796 for { 14797 v_0 := v.Args[0] 14798 if v_0.Op != OpGreater64U { 14799 break 14800 } 14801 x := v_0.Args[0] 14802 y := v_0.Args[1] 14803 v.reset(OpLeq64U) 14804 v.AddArg(x) 14805 v.AddArg(y) 14806 return true 14807 } 14808 // match: (Not (Greater32U x y)) 14809 // cond: 14810 // result: (Leq32U x y) 14811 for { 14812 v_0 := v.Args[0] 14813 if v_0.Op != OpGreater32U { 14814 break 14815 } 14816 x := v_0.Args[0] 14817 y := v_0.Args[1] 14818 v.reset(OpLeq32U) 14819 v.AddArg(x) 14820 v.AddArg(y) 14821 return true 14822 } 14823 // match: (Not (Greater16U x y)) 14824 // cond: 14825 // result: (Leq16U x y) 14826 for { 14827 v_0 := v.Args[0] 14828 if v_0.Op != OpGreater16U { 14829 break 14830 } 14831 x := v_0.Args[0] 14832 y := v_0.Args[1] 14833 v.reset(OpLeq16U) 14834 v.AddArg(x) 14835 v.AddArg(y) 14836 return true 14837 } 14838 // match: (Not (Greater8U x y)) 14839 // cond: 14840 // result: (Leq8U x y) 14841 for { 14842 v_0 := v.Args[0] 14843 if v_0.Op != OpGreater8U { 14844 break 14845 } 14846 x := v_0.Args[0] 14847 y := v_0.Args[1] 14848 v.reset(OpLeq8U) 14849 v.AddArg(x) 14850 v.AddArg(y) 14851 return true 14852 } 14853 // match: (Not (Geq64 x y)) 14854 // cond: 14855 // result: (Less64 x y) 14856 for { 14857 v_0 := v.Args[0] 14858 if v_0.Op != OpGeq64 { 14859 break 14860 } 14861 x := v_0.Args[0] 14862 y := v_0.Args[1] 14863 v.reset(OpLess64) 14864 v.AddArg(x) 14865 v.AddArg(y) 14866 return true 14867 } 14868 // match: (Not (Geq32 x y)) 14869 // cond: 14870 // result: (Less32 x y) 14871 for { 14872 v_0 := v.Args[0] 14873 if v_0.Op != OpGeq32 { 14874 break 14875 } 14876 x := v_0.Args[0] 14877 y := v_0.Args[1] 14878 v.reset(OpLess32) 14879 v.AddArg(x) 14880 v.AddArg(y) 14881 return true 14882 } 14883 return false 14884 } 14885 func rewriteValuegeneric_OpNot_20(v *Value) bool { 14886 // match: (Not (Geq16 x y)) 14887 // cond: 14888 // result: (Less16 x y) 14889 for { 14890 v_0 := v.Args[0] 14891 if v_0.Op != OpGeq16 { 14892 break 14893 } 14894 x := v_0.Args[0] 14895 y := v_0.Args[1] 14896 v.reset(OpLess16) 14897 v.AddArg(x) 14898 v.AddArg(y) 14899 return true 14900 } 14901 // match: (Not (Geq8 x y)) 14902 // cond: 14903 // result: (Less8 x y) 14904 for { 14905 v_0 := v.Args[0] 14906 if v_0.Op != OpGeq8 { 14907 break 14908 } 14909 x := v_0.Args[0] 14910 y := v_0.Args[1] 14911 v.reset(OpLess8) 14912 v.AddArg(x) 14913 v.AddArg(y) 14914 return true 14915 } 14916 // match: (Not (Geq64U x y)) 14917 // cond: 14918 // result: (Less64U x y) 14919 for { 14920 v_0 := v.Args[0] 14921 if v_0.Op != OpGeq64U { 14922 break 14923 } 14924 x := v_0.Args[0] 14925 y := v_0.Args[1] 14926 v.reset(OpLess64U) 14927 v.AddArg(x) 14928 v.AddArg(y) 14929 return true 14930 } 14931 // match: (Not (Geq32U x y)) 14932 // cond: 14933 // result: (Less32U x y) 14934 for { 14935 v_0 := v.Args[0] 14936 if v_0.Op != OpGeq32U { 14937 break 14938 } 14939 x := v_0.Args[0] 14940 y := v_0.Args[1] 14941 v.reset(OpLess32U) 14942 v.AddArg(x) 14943 v.AddArg(y) 14944 return true 14945 } 14946 // match: (Not (Geq16U x y)) 14947 // cond: 14948 // result: (Less16U x y) 14949 for { 14950 v_0 := v.Args[0] 14951 if v_0.Op != OpGeq16U { 14952 break 14953 } 14954 x := v_0.Args[0] 14955 y := v_0.Args[1] 14956 v.reset(OpLess16U) 14957 v.AddArg(x) 14958 v.AddArg(y) 14959 return true 14960 } 14961 // match: (Not (Geq8U x y)) 14962 // cond: 14963 // result: (Less8U x y) 14964 for { 14965 v_0 := v.Args[0] 14966 if v_0.Op != OpGeq8U { 14967 break 14968 } 14969 x := v_0.Args[0] 14970 y := v_0.Args[1] 14971 v.reset(OpLess8U) 14972 v.AddArg(x) 14973 v.AddArg(y) 14974 return true 14975 } 14976 // match: (Not (Less64 x y)) 14977 // cond: 14978 // result: (Geq64 x y) 14979 for { 14980 v_0 := v.Args[0] 14981 if v_0.Op != OpLess64 { 14982 break 14983 } 14984 x := v_0.Args[0] 14985 y := v_0.Args[1] 14986 v.reset(OpGeq64) 14987 v.AddArg(x) 14988 v.AddArg(y) 14989 return true 14990 } 14991 // match: (Not (Less32 x y)) 14992 // cond: 14993 // result: (Geq32 x y) 14994 for { 14995 v_0 := v.Args[0] 14996 if v_0.Op != OpLess32 { 14997 break 14998 } 14999 x := v_0.Args[0] 15000 y := v_0.Args[1] 15001 v.reset(OpGeq32) 15002 v.AddArg(x) 15003 v.AddArg(y) 15004 return true 15005 } 15006 // match: (Not (Less16 x y)) 15007 // cond: 15008 // result: (Geq16 x y) 15009 for { 15010 v_0 := v.Args[0] 15011 if v_0.Op != OpLess16 { 15012 break 15013 } 15014 x := v_0.Args[0] 15015 y := v_0.Args[1] 15016 v.reset(OpGeq16) 15017 v.AddArg(x) 15018 v.AddArg(y) 15019 return true 15020 } 15021 // match: (Not (Less8 x y)) 15022 // cond: 15023 // result: (Geq8 x y) 15024 for { 15025 v_0 := v.Args[0] 15026 if v_0.Op != OpLess8 { 15027 break 15028 } 15029 x := v_0.Args[0] 15030 y := v_0.Args[1] 15031 v.reset(OpGeq8) 15032 v.AddArg(x) 15033 v.AddArg(y) 15034 return true 15035 } 15036 return false 15037 } 15038 func rewriteValuegeneric_OpNot_30(v *Value) bool { 15039 // match: (Not (Less64U x y)) 15040 // cond: 15041 // result: (Geq64U x y) 15042 for { 15043 v_0 := v.Args[0] 15044 if v_0.Op != OpLess64U { 15045 break 15046 } 15047 x := v_0.Args[0] 15048 y := v_0.Args[1] 15049 v.reset(OpGeq64U) 15050 v.AddArg(x) 15051 v.AddArg(y) 15052 return true 15053 } 15054 // match: (Not (Less32U x y)) 15055 // cond: 15056 // result: (Geq32U x y) 15057 for { 15058 v_0 := v.Args[0] 15059 if v_0.Op != OpLess32U { 15060 break 15061 } 15062 x := v_0.Args[0] 15063 y := v_0.Args[1] 15064 v.reset(OpGeq32U) 15065 v.AddArg(x) 15066 v.AddArg(y) 15067 return true 15068 } 15069 // match: (Not (Less16U x y)) 15070 // cond: 15071 // result: (Geq16U x y) 15072 for { 15073 v_0 := v.Args[0] 15074 if v_0.Op != OpLess16U { 15075 break 15076 } 15077 x := v_0.Args[0] 15078 y := v_0.Args[1] 15079 v.reset(OpGeq16U) 15080 v.AddArg(x) 15081 v.AddArg(y) 15082 return true 15083 } 15084 // match: (Not (Less8U x y)) 15085 // cond: 15086 // result: (Geq8U x y) 15087 for { 15088 v_0 := v.Args[0] 15089 if v_0.Op != OpLess8U { 15090 break 15091 } 15092 x := v_0.Args[0] 15093 y := v_0.Args[1] 15094 v.reset(OpGeq8U) 15095 v.AddArg(x) 15096 v.AddArg(y) 15097 return true 15098 } 15099 // match: (Not (Leq64 x y)) 15100 // cond: 15101 // result: (Greater64 x y) 15102 for { 15103 v_0 := v.Args[0] 15104 if v_0.Op != OpLeq64 { 15105 break 15106 } 15107 x := v_0.Args[0] 15108 y := v_0.Args[1] 15109 v.reset(OpGreater64) 15110 v.AddArg(x) 15111 v.AddArg(y) 15112 return true 15113 } 15114 // match: (Not (Leq32 x y)) 15115 // cond: 15116 // result: (Greater32 x y) 15117 for { 15118 v_0 := v.Args[0] 15119 if v_0.Op != OpLeq32 { 15120 break 15121 } 15122 x := v_0.Args[0] 15123 y := v_0.Args[1] 15124 v.reset(OpGreater32) 15125 v.AddArg(x) 15126 v.AddArg(y) 15127 return true 15128 } 15129 // match: (Not (Leq16 x y)) 15130 // cond: 15131 // result: (Greater16 x y) 15132 for { 15133 v_0 := v.Args[0] 15134 if v_0.Op != OpLeq16 { 15135 break 15136 } 15137 x := v_0.Args[0] 15138 y := v_0.Args[1] 15139 v.reset(OpGreater16) 15140 v.AddArg(x) 15141 v.AddArg(y) 15142 return true 15143 } 15144 // match: (Not (Leq8 x y)) 15145 // cond: 15146 // result: (Greater8 x y) 15147 for { 15148 v_0 := v.Args[0] 15149 if v_0.Op != OpLeq8 { 15150 break 15151 } 15152 x := v_0.Args[0] 15153 y := v_0.Args[1] 15154 v.reset(OpGreater8) 15155 v.AddArg(x) 15156 v.AddArg(y) 15157 return true 15158 } 15159 // match: (Not (Leq64U x y)) 15160 // cond: 15161 // result: (Greater64U x y) 15162 for { 15163 v_0 := v.Args[0] 15164 if v_0.Op != OpLeq64U { 15165 break 15166 } 15167 x := v_0.Args[0] 15168 y := v_0.Args[1] 15169 v.reset(OpGreater64U) 15170 v.AddArg(x) 15171 v.AddArg(y) 15172 return true 15173 } 15174 // match: (Not (Leq32U x y)) 15175 // cond: 15176 // result: (Greater32U x y) 15177 for { 15178 v_0 := v.Args[0] 15179 if v_0.Op != OpLeq32U { 15180 break 15181 } 15182 x := v_0.Args[0] 15183 y := v_0.Args[1] 15184 v.reset(OpGreater32U) 15185 v.AddArg(x) 15186 v.AddArg(y) 15187 return true 15188 } 15189 return false 15190 } 15191 func rewriteValuegeneric_OpNot_40(v *Value) bool { 15192 // match: (Not (Leq16U x y)) 15193 // cond: 15194 // result: (Greater16U x y) 15195 for { 15196 v_0 := v.Args[0] 15197 if v_0.Op != OpLeq16U { 15198 break 15199 } 15200 x := v_0.Args[0] 15201 y := v_0.Args[1] 15202 v.reset(OpGreater16U) 15203 v.AddArg(x) 15204 v.AddArg(y) 15205 return true 15206 } 15207 // match: (Not (Leq8U x y)) 15208 // cond: 15209 // result: (Greater8U x y) 15210 for { 15211 v_0 := v.Args[0] 15212 if v_0.Op != OpLeq8U { 15213 break 15214 } 15215 x := v_0.Args[0] 15216 y := v_0.Args[1] 15217 v.reset(OpGreater8U) 15218 v.AddArg(x) 15219 v.AddArg(y) 15220 return true 15221 } 15222 return false 15223 } 15224 func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { 15225 // match: (OffPtr (OffPtr p [b]) [a]) 15226 // cond: 15227 // result: (OffPtr p [a+b]) 15228 for { 15229 a := v.AuxInt 15230 v_0 := v.Args[0] 15231 if v_0.Op != OpOffPtr { 15232 break 15233 } 15234 b := v_0.AuxInt 15235 p := v_0.Args[0] 15236 v.reset(OpOffPtr) 15237 v.AuxInt = a + b 15238 v.AddArg(p) 15239 return true 15240 } 15241 // match: (OffPtr p [0]) 15242 // cond: v.Type.Compare(p.Type) == CMPeq 15243 // result: p 15244 for { 15245 if v.AuxInt != 0 { 15246 break 15247 } 15248 p := v.Args[0] 15249 if !(v.Type.Compare(p.Type) == CMPeq) { 15250 break 15251 } 15252 v.reset(OpCopy) 15253 v.Type = p.Type 15254 v.AddArg(p) 15255 return true 15256 } 15257 return false 15258 } 15259 func rewriteValuegeneric_OpOr16_0(v *Value) bool { 15260 // match: (Or16 (Const16 [c]) (Const16 [d])) 15261 // cond: 15262 // result: (Const16 [int64(int16(c|d))]) 15263 for { 15264 v_0 := v.Args[0] 15265 if v_0.Op != OpConst16 { 15266 break 15267 } 15268 c := v_0.AuxInt 15269 v_1 := v.Args[1] 15270 if v_1.Op != OpConst16 { 15271 break 15272 } 15273 d := v_1.AuxInt 15274 v.reset(OpConst16) 15275 v.AuxInt = int64(int16(c | d)) 15276 return true 15277 } 15278 // match: (Or16 (Const16 [d]) (Const16 [c])) 15279 // cond: 15280 // result: (Const16 [int64(int16(c|d))]) 15281 for { 15282 v_0 := v.Args[0] 15283 if v_0.Op != OpConst16 { 15284 break 15285 } 15286 d := v_0.AuxInt 15287 v_1 := v.Args[1] 15288 if v_1.Op != OpConst16 { 15289 break 15290 } 15291 c := v_1.AuxInt 15292 v.reset(OpConst16) 15293 v.AuxInt = int64(int16(c | d)) 15294 return true 15295 } 15296 // match: (Or16 x x) 15297 // cond: 15298 // result: x 15299 for { 15300 x := v.Args[0] 15301 if x != v.Args[1] { 15302 break 15303 } 15304 v.reset(OpCopy) 15305 v.Type = x.Type 15306 v.AddArg(x) 15307 return true 15308 } 15309 // match: (Or16 (Const16 [0]) x) 15310 // cond: 15311 // result: x 15312 for { 15313 v_0 := v.Args[0] 15314 if v_0.Op != OpConst16 { 15315 break 15316 } 15317 if v_0.AuxInt != 0 { 15318 break 15319 } 15320 x := v.Args[1] 15321 v.reset(OpCopy) 15322 v.Type = x.Type 15323 v.AddArg(x) 15324 return true 15325 } 15326 // match: (Or16 x (Const16 [0])) 15327 // cond: 15328 // result: x 15329 for { 15330 x := v.Args[0] 15331 v_1 := v.Args[1] 15332 if v_1.Op != OpConst16 { 15333 break 15334 } 15335 if v_1.AuxInt != 0 { 15336 break 15337 } 15338 v.reset(OpCopy) 15339 v.Type = x.Type 15340 v.AddArg(x) 15341 return true 15342 } 15343 // match: (Or16 (Const16 [-1]) _) 15344 // cond: 15345 // result: (Const16 [-1]) 15346 for { 15347 v_0 := v.Args[0] 15348 if v_0.Op != OpConst16 { 15349 break 15350 } 15351 if v_0.AuxInt != -1 { 15352 break 15353 } 15354 v.reset(OpConst16) 15355 v.AuxInt = -1 15356 return true 15357 } 15358 // match: (Or16 _ (Const16 [-1])) 15359 // cond: 15360 // result: (Const16 [-1]) 15361 for { 15362 v_1 := v.Args[1] 15363 if v_1.Op != OpConst16 { 15364 break 15365 } 15366 if v_1.AuxInt != -1 { 15367 break 15368 } 15369 v.reset(OpConst16) 15370 v.AuxInt = -1 15371 return true 15372 } 15373 // match: (Or16 x (Or16 x y)) 15374 // cond: 15375 // result: (Or16 x y) 15376 for { 15377 x := v.Args[0] 15378 v_1 := v.Args[1] 15379 if v_1.Op != OpOr16 { 15380 break 15381 } 15382 if x != v_1.Args[0] { 15383 break 15384 } 15385 y := v_1.Args[1] 15386 v.reset(OpOr16) 15387 v.AddArg(x) 15388 v.AddArg(y) 15389 return true 15390 } 15391 // match: (Or16 x (Or16 y x)) 15392 // cond: 15393 // result: (Or16 x y) 15394 for { 15395 x := v.Args[0] 15396 v_1 := v.Args[1] 15397 if v_1.Op != OpOr16 { 15398 break 15399 } 15400 y := v_1.Args[0] 15401 if x != v_1.Args[1] { 15402 break 15403 } 15404 v.reset(OpOr16) 15405 v.AddArg(x) 15406 v.AddArg(y) 15407 return true 15408 } 15409 // match: (Or16 (Or16 x y) x) 15410 // cond: 15411 // result: (Or16 x y) 15412 for { 15413 v_0 := v.Args[0] 15414 if v_0.Op != OpOr16 { 15415 break 15416 } 15417 x := v_0.Args[0] 15418 y := v_0.Args[1] 15419 if x != v.Args[1] { 15420 break 15421 } 15422 v.reset(OpOr16) 15423 v.AddArg(x) 15424 v.AddArg(y) 15425 return true 15426 } 15427 return false 15428 } 15429 func rewriteValuegeneric_OpOr16_10(v *Value) bool { 15430 b := v.Block 15431 _ = b 15432 // match: (Or16 (Or16 y x) x) 15433 // cond: 15434 // result: (Or16 x y) 15435 for { 15436 v_0 := v.Args[0] 15437 if v_0.Op != OpOr16 { 15438 break 15439 } 15440 y := v_0.Args[0] 15441 x := v_0.Args[1] 15442 if x != v.Args[1] { 15443 break 15444 } 15445 v.reset(OpOr16) 15446 v.AddArg(x) 15447 v.AddArg(y) 15448 return true 15449 } 15450 // match: (Or16 (Or16 i:(Const16 <t>) z) x) 15451 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 15452 // result: (Or16 i (Or16 <t> z x)) 15453 for { 15454 v_0 := v.Args[0] 15455 if v_0.Op != OpOr16 { 15456 break 15457 } 15458 i := v_0.Args[0] 15459 if i.Op != OpConst16 { 15460 break 15461 } 15462 t := i.Type 15463 z := v_0.Args[1] 15464 x := v.Args[1] 15465 if !(z.Op != OpConst16 && x.Op != OpConst16) { 15466 break 15467 } 15468 v.reset(OpOr16) 15469 v.AddArg(i) 15470 v0 := b.NewValue0(v.Pos, OpOr16, t) 15471 v0.AddArg(z) 15472 v0.AddArg(x) 15473 v.AddArg(v0) 15474 return true 15475 } 15476 // match: (Or16 (Or16 z i:(Const16 <t>)) x) 15477 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 15478 // result: (Or16 i (Or16 <t> z x)) 15479 for { 15480 v_0 := v.Args[0] 15481 if v_0.Op != OpOr16 { 15482 break 15483 } 15484 z := v_0.Args[0] 15485 i := v_0.Args[1] 15486 if i.Op != OpConst16 { 15487 break 15488 } 15489 t := i.Type 15490 x := v.Args[1] 15491 if !(z.Op != OpConst16 && x.Op != OpConst16) { 15492 break 15493 } 15494 v.reset(OpOr16) 15495 v.AddArg(i) 15496 v0 := b.NewValue0(v.Pos, OpOr16, t) 15497 v0.AddArg(z) 15498 v0.AddArg(x) 15499 v.AddArg(v0) 15500 return true 15501 } 15502 // match: (Or16 x (Or16 i:(Const16 <t>) z)) 15503 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 15504 // result: (Or16 i (Or16 <t> z x)) 15505 for { 15506 x := v.Args[0] 15507 v_1 := v.Args[1] 15508 if v_1.Op != OpOr16 { 15509 break 15510 } 15511 i := v_1.Args[0] 15512 if i.Op != OpConst16 { 15513 break 15514 } 15515 t := i.Type 15516 z := v_1.Args[1] 15517 if !(z.Op != OpConst16 && x.Op != OpConst16) { 15518 break 15519 } 15520 v.reset(OpOr16) 15521 v.AddArg(i) 15522 v0 := b.NewValue0(v.Pos, OpOr16, t) 15523 v0.AddArg(z) 15524 v0.AddArg(x) 15525 v.AddArg(v0) 15526 return true 15527 } 15528 // match: (Or16 x (Or16 z i:(Const16 <t>))) 15529 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 15530 // result: (Or16 i (Or16 <t> z x)) 15531 for { 15532 x := v.Args[0] 15533 v_1 := v.Args[1] 15534 if v_1.Op != OpOr16 { 15535 break 15536 } 15537 z := v_1.Args[0] 15538 i := v_1.Args[1] 15539 if i.Op != OpConst16 { 15540 break 15541 } 15542 t := i.Type 15543 if !(z.Op != OpConst16 && x.Op != OpConst16) { 15544 break 15545 } 15546 v.reset(OpOr16) 15547 v.AddArg(i) 15548 v0 := b.NewValue0(v.Pos, OpOr16, t) 15549 v0.AddArg(z) 15550 v0.AddArg(x) 15551 v.AddArg(v0) 15552 return true 15553 } 15554 // match: (Or16 (Const16 <t> [c]) (Or16 (Const16 <t> [d]) x)) 15555 // cond: 15556 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 15557 for { 15558 v_0 := v.Args[0] 15559 if v_0.Op != OpConst16 { 15560 break 15561 } 15562 t := v_0.Type 15563 c := v_0.AuxInt 15564 v_1 := v.Args[1] 15565 if v_1.Op != OpOr16 { 15566 break 15567 } 15568 v_1_0 := v_1.Args[0] 15569 if v_1_0.Op != OpConst16 { 15570 break 15571 } 15572 if v_1_0.Type != t { 15573 break 15574 } 15575 d := v_1_0.AuxInt 15576 x := v_1.Args[1] 15577 v.reset(OpOr16) 15578 v0 := b.NewValue0(v.Pos, OpConst16, t) 15579 v0.AuxInt = int64(int16(c | d)) 15580 v.AddArg(v0) 15581 v.AddArg(x) 15582 return true 15583 } 15584 // match: (Or16 (Const16 <t> [c]) (Or16 x (Const16 <t> [d]))) 15585 // cond: 15586 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 15587 for { 15588 v_0 := v.Args[0] 15589 if v_0.Op != OpConst16 { 15590 break 15591 } 15592 t := v_0.Type 15593 c := v_0.AuxInt 15594 v_1 := v.Args[1] 15595 if v_1.Op != OpOr16 { 15596 break 15597 } 15598 x := v_1.Args[0] 15599 v_1_1 := v_1.Args[1] 15600 if v_1_1.Op != OpConst16 { 15601 break 15602 } 15603 if v_1_1.Type != t { 15604 break 15605 } 15606 d := v_1_1.AuxInt 15607 v.reset(OpOr16) 15608 v0 := b.NewValue0(v.Pos, OpConst16, t) 15609 v0.AuxInt = int64(int16(c | d)) 15610 v.AddArg(v0) 15611 v.AddArg(x) 15612 return true 15613 } 15614 // match: (Or16 (Or16 (Const16 <t> [d]) x) (Const16 <t> [c])) 15615 // cond: 15616 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 15617 for { 15618 v_0 := v.Args[0] 15619 if v_0.Op != OpOr16 { 15620 break 15621 } 15622 v_0_0 := v_0.Args[0] 15623 if v_0_0.Op != OpConst16 { 15624 break 15625 } 15626 t := v_0_0.Type 15627 d := v_0_0.AuxInt 15628 x := v_0.Args[1] 15629 v_1 := v.Args[1] 15630 if v_1.Op != OpConst16 { 15631 break 15632 } 15633 if v_1.Type != t { 15634 break 15635 } 15636 c := v_1.AuxInt 15637 v.reset(OpOr16) 15638 v0 := b.NewValue0(v.Pos, OpConst16, t) 15639 v0.AuxInt = int64(int16(c | d)) 15640 v.AddArg(v0) 15641 v.AddArg(x) 15642 return true 15643 } 15644 // match: (Or16 (Or16 x (Const16 <t> [d])) (Const16 <t> [c])) 15645 // cond: 15646 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 15647 for { 15648 v_0 := v.Args[0] 15649 if v_0.Op != OpOr16 { 15650 break 15651 } 15652 x := v_0.Args[0] 15653 v_0_1 := v_0.Args[1] 15654 if v_0_1.Op != OpConst16 { 15655 break 15656 } 15657 t := v_0_1.Type 15658 d := v_0_1.AuxInt 15659 v_1 := v.Args[1] 15660 if v_1.Op != OpConst16 { 15661 break 15662 } 15663 if v_1.Type != t { 15664 break 15665 } 15666 c := v_1.AuxInt 15667 v.reset(OpOr16) 15668 v0 := b.NewValue0(v.Pos, OpConst16, t) 15669 v0.AuxInt = int64(int16(c | d)) 15670 v.AddArg(v0) 15671 v.AddArg(x) 15672 return true 15673 } 15674 return false 15675 } 15676 func rewriteValuegeneric_OpOr32_0(v *Value) bool { 15677 // match: (Or32 (Const32 [c]) (Const32 [d])) 15678 // cond: 15679 // result: (Const32 [int64(int32(c|d))]) 15680 for { 15681 v_0 := v.Args[0] 15682 if v_0.Op != OpConst32 { 15683 break 15684 } 15685 c := v_0.AuxInt 15686 v_1 := v.Args[1] 15687 if v_1.Op != OpConst32 { 15688 break 15689 } 15690 d := v_1.AuxInt 15691 v.reset(OpConst32) 15692 v.AuxInt = int64(int32(c | d)) 15693 return true 15694 } 15695 // match: (Or32 (Const32 [d]) (Const32 [c])) 15696 // cond: 15697 // result: (Const32 [int64(int32(c|d))]) 15698 for { 15699 v_0 := v.Args[0] 15700 if v_0.Op != OpConst32 { 15701 break 15702 } 15703 d := v_0.AuxInt 15704 v_1 := v.Args[1] 15705 if v_1.Op != OpConst32 { 15706 break 15707 } 15708 c := v_1.AuxInt 15709 v.reset(OpConst32) 15710 v.AuxInt = int64(int32(c | d)) 15711 return true 15712 } 15713 // match: (Or32 x x) 15714 // cond: 15715 // result: x 15716 for { 15717 x := v.Args[0] 15718 if x != v.Args[1] { 15719 break 15720 } 15721 v.reset(OpCopy) 15722 v.Type = x.Type 15723 v.AddArg(x) 15724 return true 15725 } 15726 // match: (Or32 (Const32 [0]) x) 15727 // cond: 15728 // result: x 15729 for { 15730 v_0 := v.Args[0] 15731 if v_0.Op != OpConst32 { 15732 break 15733 } 15734 if v_0.AuxInt != 0 { 15735 break 15736 } 15737 x := v.Args[1] 15738 v.reset(OpCopy) 15739 v.Type = x.Type 15740 v.AddArg(x) 15741 return true 15742 } 15743 // match: (Or32 x (Const32 [0])) 15744 // cond: 15745 // result: x 15746 for { 15747 x := v.Args[0] 15748 v_1 := v.Args[1] 15749 if v_1.Op != OpConst32 { 15750 break 15751 } 15752 if v_1.AuxInt != 0 { 15753 break 15754 } 15755 v.reset(OpCopy) 15756 v.Type = x.Type 15757 v.AddArg(x) 15758 return true 15759 } 15760 // match: (Or32 (Const32 [-1]) _) 15761 // cond: 15762 // result: (Const32 [-1]) 15763 for { 15764 v_0 := v.Args[0] 15765 if v_0.Op != OpConst32 { 15766 break 15767 } 15768 if v_0.AuxInt != -1 { 15769 break 15770 } 15771 v.reset(OpConst32) 15772 v.AuxInt = -1 15773 return true 15774 } 15775 // match: (Or32 _ (Const32 [-1])) 15776 // cond: 15777 // result: (Const32 [-1]) 15778 for { 15779 v_1 := v.Args[1] 15780 if v_1.Op != OpConst32 { 15781 break 15782 } 15783 if v_1.AuxInt != -1 { 15784 break 15785 } 15786 v.reset(OpConst32) 15787 v.AuxInt = -1 15788 return true 15789 } 15790 // match: (Or32 x (Or32 x y)) 15791 // cond: 15792 // result: (Or32 x y) 15793 for { 15794 x := v.Args[0] 15795 v_1 := v.Args[1] 15796 if v_1.Op != OpOr32 { 15797 break 15798 } 15799 if x != v_1.Args[0] { 15800 break 15801 } 15802 y := v_1.Args[1] 15803 v.reset(OpOr32) 15804 v.AddArg(x) 15805 v.AddArg(y) 15806 return true 15807 } 15808 // match: (Or32 x (Or32 y x)) 15809 // cond: 15810 // result: (Or32 x y) 15811 for { 15812 x := v.Args[0] 15813 v_1 := v.Args[1] 15814 if v_1.Op != OpOr32 { 15815 break 15816 } 15817 y := v_1.Args[0] 15818 if x != v_1.Args[1] { 15819 break 15820 } 15821 v.reset(OpOr32) 15822 v.AddArg(x) 15823 v.AddArg(y) 15824 return true 15825 } 15826 // match: (Or32 (Or32 x y) x) 15827 // cond: 15828 // result: (Or32 x y) 15829 for { 15830 v_0 := v.Args[0] 15831 if v_0.Op != OpOr32 { 15832 break 15833 } 15834 x := v_0.Args[0] 15835 y := v_0.Args[1] 15836 if x != v.Args[1] { 15837 break 15838 } 15839 v.reset(OpOr32) 15840 v.AddArg(x) 15841 v.AddArg(y) 15842 return true 15843 } 15844 return false 15845 } 15846 func rewriteValuegeneric_OpOr32_10(v *Value) bool { 15847 b := v.Block 15848 _ = b 15849 // match: (Or32 (Or32 y x) x) 15850 // cond: 15851 // result: (Or32 x y) 15852 for { 15853 v_0 := v.Args[0] 15854 if v_0.Op != OpOr32 { 15855 break 15856 } 15857 y := v_0.Args[0] 15858 x := v_0.Args[1] 15859 if x != v.Args[1] { 15860 break 15861 } 15862 v.reset(OpOr32) 15863 v.AddArg(x) 15864 v.AddArg(y) 15865 return true 15866 } 15867 // match: (Or32 (Or32 i:(Const32 <t>) z) x) 15868 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 15869 // result: (Or32 i (Or32 <t> z x)) 15870 for { 15871 v_0 := v.Args[0] 15872 if v_0.Op != OpOr32 { 15873 break 15874 } 15875 i := v_0.Args[0] 15876 if i.Op != OpConst32 { 15877 break 15878 } 15879 t := i.Type 15880 z := v_0.Args[1] 15881 x := v.Args[1] 15882 if !(z.Op != OpConst32 && x.Op != OpConst32) { 15883 break 15884 } 15885 v.reset(OpOr32) 15886 v.AddArg(i) 15887 v0 := b.NewValue0(v.Pos, OpOr32, t) 15888 v0.AddArg(z) 15889 v0.AddArg(x) 15890 v.AddArg(v0) 15891 return true 15892 } 15893 // match: (Or32 (Or32 z i:(Const32 <t>)) x) 15894 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 15895 // result: (Or32 i (Or32 <t> z x)) 15896 for { 15897 v_0 := v.Args[0] 15898 if v_0.Op != OpOr32 { 15899 break 15900 } 15901 z := v_0.Args[0] 15902 i := v_0.Args[1] 15903 if i.Op != OpConst32 { 15904 break 15905 } 15906 t := i.Type 15907 x := v.Args[1] 15908 if !(z.Op != OpConst32 && x.Op != OpConst32) { 15909 break 15910 } 15911 v.reset(OpOr32) 15912 v.AddArg(i) 15913 v0 := b.NewValue0(v.Pos, OpOr32, t) 15914 v0.AddArg(z) 15915 v0.AddArg(x) 15916 v.AddArg(v0) 15917 return true 15918 } 15919 // match: (Or32 x (Or32 i:(Const32 <t>) z)) 15920 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 15921 // result: (Or32 i (Or32 <t> z x)) 15922 for { 15923 x := v.Args[0] 15924 v_1 := v.Args[1] 15925 if v_1.Op != OpOr32 { 15926 break 15927 } 15928 i := v_1.Args[0] 15929 if i.Op != OpConst32 { 15930 break 15931 } 15932 t := i.Type 15933 z := v_1.Args[1] 15934 if !(z.Op != OpConst32 && x.Op != OpConst32) { 15935 break 15936 } 15937 v.reset(OpOr32) 15938 v.AddArg(i) 15939 v0 := b.NewValue0(v.Pos, OpOr32, t) 15940 v0.AddArg(z) 15941 v0.AddArg(x) 15942 v.AddArg(v0) 15943 return true 15944 } 15945 // match: (Or32 x (Or32 z i:(Const32 <t>))) 15946 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 15947 // result: (Or32 i (Or32 <t> z x)) 15948 for { 15949 x := v.Args[0] 15950 v_1 := v.Args[1] 15951 if v_1.Op != OpOr32 { 15952 break 15953 } 15954 z := v_1.Args[0] 15955 i := v_1.Args[1] 15956 if i.Op != OpConst32 { 15957 break 15958 } 15959 t := i.Type 15960 if !(z.Op != OpConst32 && x.Op != OpConst32) { 15961 break 15962 } 15963 v.reset(OpOr32) 15964 v.AddArg(i) 15965 v0 := b.NewValue0(v.Pos, OpOr32, t) 15966 v0.AddArg(z) 15967 v0.AddArg(x) 15968 v.AddArg(v0) 15969 return true 15970 } 15971 // match: (Or32 (Const32 <t> [c]) (Or32 (Const32 <t> [d]) x)) 15972 // cond: 15973 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 15974 for { 15975 v_0 := v.Args[0] 15976 if v_0.Op != OpConst32 { 15977 break 15978 } 15979 t := v_0.Type 15980 c := v_0.AuxInt 15981 v_1 := v.Args[1] 15982 if v_1.Op != OpOr32 { 15983 break 15984 } 15985 v_1_0 := v_1.Args[0] 15986 if v_1_0.Op != OpConst32 { 15987 break 15988 } 15989 if v_1_0.Type != t { 15990 break 15991 } 15992 d := v_1_0.AuxInt 15993 x := v_1.Args[1] 15994 v.reset(OpOr32) 15995 v0 := b.NewValue0(v.Pos, OpConst32, t) 15996 v0.AuxInt = int64(int32(c | d)) 15997 v.AddArg(v0) 15998 v.AddArg(x) 15999 return true 16000 } 16001 // match: (Or32 (Const32 <t> [c]) (Or32 x (Const32 <t> [d]))) 16002 // cond: 16003 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 16004 for { 16005 v_0 := v.Args[0] 16006 if v_0.Op != OpConst32 { 16007 break 16008 } 16009 t := v_0.Type 16010 c := v_0.AuxInt 16011 v_1 := v.Args[1] 16012 if v_1.Op != OpOr32 { 16013 break 16014 } 16015 x := v_1.Args[0] 16016 v_1_1 := v_1.Args[1] 16017 if v_1_1.Op != OpConst32 { 16018 break 16019 } 16020 if v_1_1.Type != t { 16021 break 16022 } 16023 d := v_1_1.AuxInt 16024 v.reset(OpOr32) 16025 v0 := b.NewValue0(v.Pos, OpConst32, t) 16026 v0.AuxInt = int64(int32(c | d)) 16027 v.AddArg(v0) 16028 v.AddArg(x) 16029 return true 16030 } 16031 // match: (Or32 (Or32 (Const32 <t> [d]) x) (Const32 <t> [c])) 16032 // cond: 16033 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 16034 for { 16035 v_0 := v.Args[0] 16036 if v_0.Op != OpOr32 { 16037 break 16038 } 16039 v_0_0 := v_0.Args[0] 16040 if v_0_0.Op != OpConst32 { 16041 break 16042 } 16043 t := v_0_0.Type 16044 d := v_0_0.AuxInt 16045 x := v_0.Args[1] 16046 v_1 := v.Args[1] 16047 if v_1.Op != OpConst32 { 16048 break 16049 } 16050 if v_1.Type != t { 16051 break 16052 } 16053 c := v_1.AuxInt 16054 v.reset(OpOr32) 16055 v0 := b.NewValue0(v.Pos, OpConst32, t) 16056 v0.AuxInt = int64(int32(c | d)) 16057 v.AddArg(v0) 16058 v.AddArg(x) 16059 return true 16060 } 16061 // match: (Or32 (Or32 x (Const32 <t> [d])) (Const32 <t> [c])) 16062 // cond: 16063 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 16064 for { 16065 v_0 := v.Args[0] 16066 if v_0.Op != OpOr32 { 16067 break 16068 } 16069 x := v_0.Args[0] 16070 v_0_1 := v_0.Args[1] 16071 if v_0_1.Op != OpConst32 { 16072 break 16073 } 16074 t := v_0_1.Type 16075 d := v_0_1.AuxInt 16076 v_1 := v.Args[1] 16077 if v_1.Op != OpConst32 { 16078 break 16079 } 16080 if v_1.Type != t { 16081 break 16082 } 16083 c := v_1.AuxInt 16084 v.reset(OpOr32) 16085 v0 := b.NewValue0(v.Pos, OpConst32, t) 16086 v0.AuxInt = int64(int32(c | d)) 16087 v.AddArg(v0) 16088 v.AddArg(x) 16089 return true 16090 } 16091 return false 16092 } 16093 func rewriteValuegeneric_OpOr64_0(v *Value) bool { 16094 // match: (Or64 (Const64 [c]) (Const64 [d])) 16095 // cond: 16096 // result: (Const64 [c|d]) 16097 for { 16098 v_0 := v.Args[0] 16099 if v_0.Op != OpConst64 { 16100 break 16101 } 16102 c := v_0.AuxInt 16103 v_1 := v.Args[1] 16104 if v_1.Op != OpConst64 { 16105 break 16106 } 16107 d := v_1.AuxInt 16108 v.reset(OpConst64) 16109 v.AuxInt = c | d 16110 return true 16111 } 16112 // match: (Or64 (Const64 [d]) (Const64 [c])) 16113 // cond: 16114 // result: (Const64 [c|d]) 16115 for { 16116 v_0 := v.Args[0] 16117 if v_0.Op != OpConst64 { 16118 break 16119 } 16120 d := v_0.AuxInt 16121 v_1 := v.Args[1] 16122 if v_1.Op != OpConst64 { 16123 break 16124 } 16125 c := v_1.AuxInt 16126 v.reset(OpConst64) 16127 v.AuxInt = c | d 16128 return true 16129 } 16130 // match: (Or64 x x) 16131 // cond: 16132 // result: x 16133 for { 16134 x := v.Args[0] 16135 if x != v.Args[1] { 16136 break 16137 } 16138 v.reset(OpCopy) 16139 v.Type = x.Type 16140 v.AddArg(x) 16141 return true 16142 } 16143 // match: (Or64 (Const64 [0]) x) 16144 // cond: 16145 // result: x 16146 for { 16147 v_0 := v.Args[0] 16148 if v_0.Op != OpConst64 { 16149 break 16150 } 16151 if v_0.AuxInt != 0 { 16152 break 16153 } 16154 x := v.Args[1] 16155 v.reset(OpCopy) 16156 v.Type = x.Type 16157 v.AddArg(x) 16158 return true 16159 } 16160 // match: (Or64 x (Const64 [0])) 16161 // cond: 16162 // result: x 16163 for { 16164 x := v.Args[0] 16165 v_1 := v.Args[1] 16166 if v_1.Op != OpConst64 { 16167 break 16168 } 16169 if v_1.AuxInt != 0 { 16170 break 16171 } 16172 v.reset(OpCopy) 16173 v.Type = x.Type 16174 v.AddArg(x) 16175 return true 16176 } 16177 // match: (Or64 (Const64 [-1]) _) 16178 // cond: 16179 // result: (Const64 [-1]) 16180 for { 16181 v_0 := v.Args[0] 16182 if v_0.Op != OpConst64 { 16183 break 16184 } 16185 if v_0.AuxInt != -1 { 16186 break 16187 } 16188 v.reset(OpConst64) 16189 v.AuxInt = -1 16190 return true 16191 } 16192 // match: (Or64 _ (Const64 [-1])) 16193 // cond: 16194 // result: (Const64 [-1]) 16195 for { 16196 v_1 := v.Args[1] 16197 if v_1.Op != OpConst64 { 16198 break 16199 } 16200 if v_1.AuxInt != -1 { 16201 break 16202 } 16203 v.reset(OpConst64) 16204 v.AuxInt = -1 16205 return true 16206 } 16207 // match: (Or64 x (Or64 x y)) 16208 // cond: 16209 // result: (Or64 x y) 16210 for { 16211 x := v.Args[0] 16212 v_1 := v.Args[1] 16213 if v_1.Op != OpOr64 { 16214 break 16215 } 16216 if x != v_1.Args[0] { 16217 break 16218 } 16219 y := v_1.Args[1] 16220 v.reset(OpOr64) 16221 v.AddArg(x) 16222 v.AddArg(y) 16223 return true 16224 } 16225 // match: (Or64 x (Or64 y x)) 16226 // cond: 16227 // result: (Or64 x y) 16228 for { 16229 x := v.Args[0] 16230 v_1 := v.Args[1] 16231 if v_1.Op != OpOr64 { 16232 break 16233 } 16234 y := v_1.Args[0] 16235 if x != v_1.Args[1] { 16236 break 16237 } 16238 v.reset(OpOr64) 16239 v.AddArg(x) 16240 v.AddArg(y) 16241 return true 16242 } 16243 // match: (Or64 (Or64 x y) x) 16244 // cond: 16245 // result: (Or64 x y) 16246 for { 16247 v_0 := v.Args[0] 16248 if v_0.Op != OpOr64 { 16249 break 16250 } 16251 x := v_0.Args[0] 16252 y := v_0.Args[1] 16253 if x != v.Args[1] { 16254 break 16255 } 16256 v.reset(OpOr64) 16257 v.AddArg(x) 16258 v.AddArg(y) 16259 return true 16260 } 16261 return false 16262 } 16263 func rewriteValuegeneric_OpOr64_10(v *Value) bool { 16264 b := v.Block 16265 _ = b 16266 // match: (Or64 (Or64 y x) x) 16267 // cond: 16268 // result: (Or64 x y) 16269 for { 16270 v_0 := v.Args[0] 16271 if v_0.Op != OpOr64 { 16272 break 16273 } 16274 y := v_0.Args[0] 16275 x := v_0.Args[1] 16276 if x != v.Args[1] { 16277 break 16278 } 16279 v.reset(OpOr64) 16280 v.AddArg(x) 16281 v.AddArg(y) 16282 return true 16283 } 16284 // match: (Or64 (Or64 i:(Const64 <t>) z) x) 16285 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 16286 // result: (Or64 i (Or64 <t> z x)) 16287 for { 16288 v_0 := v.Args[0] 16289 if v_0.Op != OpOr64 { 16290 break 16291 } 16292 i := v_0.Args[0] 16293 if i.Op != OpConst64 { 16294 break 16295 } 16296 t := i.Type 16297 z := v_0.Args[1] 16298 x := v.Args[1] 16299 if !(z.Op != OpConst64 && x.Op != OpConst64) { 16300 break 16301 } 16302 v.reset(OpOr64) 16303 v.AddArg(i) 16304 v0 := b.NewValue0(v.Pos, OpOr64, t) 16305 v0.AddArg(z) 16306 v0.AddArg(x) 16307 v.AddArg(v0) 16308 return true 16309 } 16310 // match: (Or64 (Or64 z i:(Const64 <t>)) x) 16311 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 16312 // result: (Or64 i (Or64 <t> z x)) 16313 for { 16314 v_0 := v.Args[0] 16315 if v_0.Op != OpOr64 { 16316 break 16317 } 16318 z := v_0.Args[0] 16319 i := v_0.Args[1] 16320 if i.Op != OpConst64 { 16321 break 16322 } 16323 t := i.Type 16324 x := v.Args[1] 16325 if !(z.Op != OpConst64 && x.Op != OpConst64) { 16326 break 16327 } 16328 v.reset(OpOr64) 16329 v.AddArg(i) 16330 v0 := b.NewValue0(v.Pos, OpOr64, t) 16331 v0.AddArg(z) 16332 v0.AddArg(x) 16333 v.AddArg(v0) 16334 return true 16335 } 16336 // match: (Or64 x (Or64 i:(Const64 <t>) z)) 16337 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 16338 // result: (Or64 i (Or64 <t> z x)) 16339 for { 16340 x := v.Args[0] 16341 v_1 := v.Args[1] 16342 if v_1.Op != OpOr64 { 16343 break 16344 } 16345 i := v_1.Args[0] 16346 if i.Op != OpConst64 { 16347 break 16348 } 16349 t := i.Type 16350 z := v_1.Args[1] 16351 if !(z.Op != OpConst64 && x.Op != OpConst64) { 16352 break 16353 } 16354 v.reset(OpOr64) 16355 v.AddArg(i) 16356 v0 := b.NewValue0(v.Pos, OpOr64, t) 16357 v0.AddArg(z) 16358 v0.AddArg(x) 16359 v.AddArg(v0) 16360 return true 16361 } 16362 // match: (Or64 x (Or64 z i:(Const64 <t>))) 16363 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 16364 // result: (Or64 i (Or64 <t> z x)) 16365 for { 16366 x := v.Args[0] 16367 v_1 := v.Args[1] 16368 if v_1.Op != OpOr64 { 16369 break 16370 } 16371 z := v_1.Args[0] 16372 i := v_1.Args[1] 16373 if i.Op != OpConst64 { 16374 break 16375 } 16376 t := i.Type 16377 if !(z.Op != OpConst64 && x.Op != OpConst64) { 16378 break 16379 } 16380 v.reset(OpOr64) 16381 v.AddArg(i) 16382 v0 := b.NewValue0(v.Pos, OpOr64, t) 16383 v0.AddArg(z) 16384 v0.AddArg(x) 16385 v.AddArg(v0) 16386 return true 16387 } 16388 // match: (Or64 (Const64 <t> [c]) (Or64 (Const64 <t> [d]) x)) 16389 // cond: 16390 // result: (Or64 (Const64 <t> [c|d]) x) 16391 for { 16392 v_0 := v.Args[0] 16393 if v_0.Op != OpConst64 { 16394 break 16395 } 16396 t := v_0.Type 16397 c := v_0.AuxInt 16398 v_1 := v.Args[1] 16399 if v_1.Op != OpOr64 { 16400 break 16401 } 16402 v_1_0 := v_1.Args[0] 16403 if v_1_0.Op != OpConst64 { 16404 break 16405 } 16406 if v_1_0.Type != t { 16407 break 16408 } 16409 d := v_1_0.AuxInt 16410 x := v_1.Args[1] 16411 v.reset(OpOr64) 16412 v0 := b.NewValue0(v.Pos, OpConst64, t) 16413 v0.AuxInt = c | d 16414 v.AddArg(v0) 16415 v.AddArg(x) 16416 return true 16417 } 16418 // match: (Or64 (Const64 <t> [c]) (Or64 x (Const64 <t> [d]))) 16419 // cond: 16420 // result: (Or64 (Const64 <t> [c|d]) x) 16421 for { 16422 v_0 := v.Args[0] 16423 if v_0.Op != OpConst64 { 16424 break 16425 } 16426 t := v_0.Type 16427 c := v_0.AuxInt 16428 v_1 := v.Args[1] 16429 if v_1.Op != OpOr64 { 16430 break 16431 } 16432 x := v_1.Args[0] 16433 v_1_1 := v_1.Args[1] 16434 if v_1_1.Op != OpConst64 { 16435 break 16436 } 16437 if v_1_1.Type != t { 16438 break 16439 } 16440 d := v_1_1.AuxInt 16441 v.reset(OpOr64) 16442 v0 := b.NewValue0(v.Pos, OpConst64, t) 16443 v0.AuxInt = c | d 16444 v.AddArg(v0) 16445 v.AddArg(x) 16446 return true 16447 } 16448 // match: (Or64 (Or64 (Const64 <t> [d]) x) (Const64 <t> [c])) 16449 // cond: 16450 // result: (Or64 (Const64 <t> [c|d]) x) 16451 for { 16452 v_0 := v.Args[0] 16453 if v_0.Op != OpOr64 { 16454 break 16455 } 16456 v_0_0 := v_0.Args[0] 16457 if v_0_0.Op != OpConst64 { 16458 break 16459 } 16460 t := v_0_0.Type 16461 d := v_0_0.AuxInt 16462 x := v_0.Args[1] 16463 v_1 := v.Args[1] 16464 if v_1.Op != OpConst64 { 16465 break 16466 } 16467 if v_1.Type != t { 16468 break 16469 } 16470 c := v_1.AuxInt 16471 v.reset(OpOr64) 16472 v0 := b.NewValue0(v.Pos, OpConst64, t) 16473 v0.AuxInt = c | d 16474 v.AddArg(v0) 16475 v.AddArg(x) 16476 return true 16477 } 16478 // match: (Or64 (Or64 x (Const64 <t> [d])) (Const64 <t> [c])) 16479 // cond: 16480 // result: (Or64 (Const64 <t> [c|d]) x) 16481 for { 16482 v_0 := v.Args[0] 16483 if v_0.Op != OpOr64 { 16484 break 16485 } 16486 x := v_0.Args[0] 16487 v_0_1 := v_0.Args[1] 16488 if v_0_1.Op != OpConst64 { 16489 break 16490 } 16491 t := v_0_1.Type 16492 d := v_0_1.AuxInt 16493 v_1 := v.Args[1] 16494 if v_1.Op != OpConst64 { 16495 break 16496 } 16497 if v_1.Type != t { 16498 break 16499 } 16500 c := v_1.AuxInt 16501 v.reset(OpOr64) 16502 v0 := b.NewValue0(v.Pos, OpConst64, t) 16503 v0.AuxInt = c | d 16504 v.AddArg(v0) 16505 v.AddArg(x) 16506 return true 16507 } 16508 return false 16509 } 16510 func rewriteValuegeneric_OpOr8_0(v *Value) bool { 16511 // match: (Or8 (Const8 [c]) (Const8 [d])) 16512 // cond: 16513 // result: (Const8 [int64(int8(c|d))]) 16514 for { 16515 v_0 := v.Args[0] 16516 if v_0.Op != OpConst8 { 16517 break 16518 } 16519 c := v_0.AuxInt 16520 v_1 := v.Args[1] 16521 if v_1.Op != OpConst8 { 16522 break 16523 } 16524 d := v_1.AuxInt 16525 v.reset(OpConst8) 16526 v.AuxInt = int64(int8(c | d)) 16527 return true 16528 } 16529 // match: (Or8 (Const8 [d]) (Const8 [c])) 16530 // cond: 16531 // result: (Const8 [int64(int8(c|d))]) 16532 for { 16533 v_0 := v.Args[0] 16534 if v_0.Op != OpConst8 { 16535 break 16536 } 16537 d := v_0.AuxInt 16538 v_1 := v.Args[1] 16539 if v_1.Op != OpConst8 { 16540 break 16541 } 16542 c := v_1.AuxInt 16543 v.reset(OpConst8) 16544 v.AuxInt = int64(int8(c | d)) 16545 return true 16546 } 16547 // match: (Or8 x x) 16548 // cond: 16549 // result: x 16550 for { 16551 x := v.Args[0] 16552 if x != v.Args[1] { 16553 break 16554 } 16555 v.reset(OpCopy) 16556 v.Type = x.Type 16557 v.AddArg(x) 16558 return true 16559 } 16560 // match: (Or8 (Const8 [0]) x) 16561 // cond: 16562 // result: x 16563 for { 16564 v_0 := v.Args[0] 16565 if v_0.Op != OpConst8 { 16566 break 16567 } 16568 if v_0.AuxInt != 0 { 16569 break 16570 } 16571 x := v.Args[1] 16572 v.reset(OpCopy) 16573 v.Type = x.Type 16574 v.AddArg(x) 16575 return true 16576 } 16577 // match: (Or8 x (Const8 [0])) 16578 // cond: 16579 // result: x 16580 for { 16581 x := v.Args[0] 16582 v_1 := v.Args[1] 16583 if v_1.Op != OpConst8 { 16584 break 16585 } 16586 if v_1.AuxInt != 0 { 16587 break 16588 } 16589 v.reset(OpCopy) 16590 v.Type = x.Type 16591 v.AddArg(x) 16592 return true 16593 } 16594 // match: (Or8 (Const8 [-1]) _) 16595 // cond: 16596 // result: (Const8 [-1]) 16597 for { 16598 v_0 := v.Args[0] 16599 if v_0.Op != OpConst8 { 16600 break 16601 } 16602 if v_0.AuxInt != -1 { 16603 break 16604 } 16605 v.reset(OpConst8) 16606 v.AuxInt = -1 16607 return true 16608 } 16609 // match: (Or8 _ (Const8 [-1])) 16610 // cond: 16611 // result: (Const8 [-1]) 16612 for { 16613 v_1 := v.Args[1] 16614 if v_1.Op != OpConst8 { 16615 break 16616 } 16617 if v_1.AuxInt != -1 { 16618 break 16619 } 16620 v.reset(OpConst8) 16621 v.AuxInt = -1 16622 return true 16623 } 16624 // match: (Or8 x (Or8 x y)) 16625 // cond: 16626 // result: (Or8 x y) 16627 for { 16628 x := v.Args[0] 16629 v_1 := v.Args[1] 16630 if v_1.Op != OpOr8 { 16631 break 16632 } 16633 if x != v_1.Args[0] { 16634 break 16635 } 16636 y := v_1.Args[1] 16637 v.reset(OpOr8) 16638 v.AddArg(x) 16639 v.AddArg(y) 16640 return true 16641 } 16642 // match: (Or8 x (Or8 y x)) 16643 // cond: 16644 // result: (Or8 x y) 16645 for { 16646 x := v.Args[0] 16647 v_1 := v.Args[1] 16648 if v_1.Op != OpOr8 { 16649 break 16650 } 16651 y := v_1.Args[0] 16652 if x != v_1.Args[1] { 16653 break 16654 } 16655 v.reset(OpOr8) 16656 v.AddArg(x) 16657 v.AddArg(y) 16658 return true 16659 } 16660 // match: (Or8 (Or8 x y) x) 16661 // cond: 16662 // result: (Or8 x y) 16663 for { 16664 v_0 := v.Args[0] 16665 if v_0.Op != OpOr8 { 16666 break 16667 } 16668 x := v_0.Args[0] 16669 y := v_0.Args[1] 16670 if x != v.Args[1] { 16671 break 16672 } 16673 v.reset(OpOr8) 16674 v.AddArg(x) 16675 v.AddArg(y) 16676 return true 16677 } 16678 return false 16679 } 16680 func rewriteValuegeneric_OpOr8_10(v *Value) bool { 16681 b := v.Block 16682 _ = b 16683 // match: (Or8 (Or8 y x) x) 16684 // cond: 16685 // result: (Or8 x y) 16686 for { 16687 v_0 := v.Args[0] 16688 if v_0.Op != OpOr8 { 16689 break 16690 } 16691 y := v_0.Args[0] 16692 x := v_0.Args[1] 16693 if x != v.Args[1] { 16694 break 16695 } 16696 v.reset(OpOr8) 16697 v.AddArg(x) 16698 v.AddArg(y) 16699 return true 16700 } 16701 // match: (Or8 (Or8 i:(Const8 <t>) z) x) 16702 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 16703 // result: (Or8 i (Or8 <t> z x)) 16704 for { 16705 v_0 := v.Args[0] 16706 if v_0.Op != OpOr8 { 16707 break 16708 } 16709 i := v_0.Args[0] 16710 if i.Op != OpConst8 { 16711 break 16712 } 16713 t := i.Type 16714 z := v_0.Args[1] 16715 x := v.Args[1] 16716 if !(z.Op != OpConst8 && x.Op != OpConst8) { 16717 break 16718 } 16719 v.reset(OpOr8) 16720 v.AddArg(i) 16721 v0 := b.NewValue0(v.Pos, OpOr8, t) 16722 v0.AddArg(z) 16723 v0.AddArg(x) 16724 v.AddArg(v0) 16725 return true 16726 } 16727 // match: (Or8 (Or8 z i:(Const8 <t>)) x) 16728 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 16729 // result: (Or8 i (Or8 <t> z x)) 16730 for { 16731 v_0 := v.Args[0] 16732 if v_0.Op != OpOr8 { 16733 break 16734 } 16735 z := v_0.Args[0] 16736 i := v_0.Args[1] 16737 if i.Op != OpConst8 { 16738 break 16739 } 16740 t := i.Type 16741 x := v.Args[1] 16742 if !(z.Op != OpConst8 && x.Op != OpConst8) { 16743 break 16744 } 16745 v.reset(OpOr8) 16746 v.AddArg(i) 16747 v0 := b.NewValue0(v.Pos, OpOr8, t) 16748 v0.AddArg(z) 16749 v0.AddArg(x) 16750 v.AddArg(v0) 16751 return true 16752 } 16753 // match: (Or8 x (Or8 i:(Const8 <t>) z)) 16754 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 16755 // result: (Or8 i (Or8 <t> z x)) 16756 for { 16757 x := v.Args[0] 16758 v_1 := v.Args[1] 16759 if v_1.Op != OpOr8 { 16760 break 16761 } 16762 i := v_1.Args[0] 16763 if i.Op != OpConst8 { 16764 break 16765 } 16766 t := i.Type 16767 z := v_1.Args[1] 16768 if !(z.Op != OpConst8 && x.Op != OpConst8) { 16769 break 16770 } 16771 v.reset(OpOr8) 16772 v.AddArg(i) 16773 v0 := b.NewValue0(v.Pos, OpOr8, t) 16774 v0.AddArg(z) 16775 v0.AddArg(x) 16776 v.AddArg(v0) 16777 return true 16778 } 16779 // match: (Or8 x (Or8 z i:(Const8 <t>))) 16780 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 16781 // result: (Or8 i (Or8 <t> z x)) 16782 for { 16783 x := v.Args[0] 16784 v_1 := v.Args[1] 16785 if v_1.Op != OpOr8 { 16786 break 16787 } 16788 z := v_1.Args[0] 16789 i := v_1.Args[1] 16790 if i.Op != OpConst8 { 16791 break 16792 } 16793 t := i.Type 16794 if !(z.Op != OpConst8 && x.Op != OpConst8) { 16795 break 16796 } 16797 v.reset(OpOr8) 16798 v.AddArg(i) 16799 v0 := b.NewValue0(v.Pos, OpOr8, t) 16800 v0.AddArg(z) 16801 v0.AddArg(x) 16802 v.AddArg(v0) 16803 return true 16804 } 16805 // match: (Or8 (Const8 <t> [c]) (Or8 (Const8 <t> [d]) x)) 16806 // cond: 16807 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 16808 for { 16809 v_0 := v.Args[0] 16810 if v_0.Op != OpConst8 { 16811 break 16812 } 16813 t := v_0.Type 16814 c := v_0.AuxInt 16815 v_1 := v.Args[1] 16816 if v_1.Op != OpOr8 { 16817 break 16818 } 16819 v_1_0 := v_1.Args[0] 16820 if v_1_0.Op != OpConst8 { 16821 break 16822 } 16823 if v_1_0.Type != t { 16824 break 16825 } 16826 d := v_1_0.AuxInt 16827 x := v_1.Args[1] 16828 v.reset(OpOr8) 16829 v0 := b.NewValue0(v.Pos, OpConst8, t) 16830 v0.AuxInt = int64(int8(c | d)) 16831 v.AddArg(v0) 16832 v.AddArg(x) 16833 return true 16834 } 16835 // match: (Or8 (Const8 <t> [c]) (Or8 x (Const8 <t> [d]))) 16836 // cond: 16837 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 16838 for { 16839 v_0 := v.Args[0] 16840 if v_0.Op != OpConst8 { 16841 break 16842 } 16843 t := v_0.Type 16844 c := v_0.AuxInt 16845 v_1 := v.Args[1] 16846 if v_1.Op != OpOr8 { 16847 break 16848 } 16849 x := v_1.Args[0] 16850 v_1_1 := v_1.Args[1] 16851 if v_1_1.Op != OpConst8 { 16852 break 16853 } 16854 if v_1_1.Type != t { 16855 break 16856 } 16857 d := v_1_1.AuxInt 16858 v.reset(OpOr8) 16859 v0 := b.NewValue0(v.Pos, OpConst8, t) 16860 v0.AuxInt = int64(int8(c | d)) 16861 v.AddArg(v0) 16862 v.AddArg(x) 16863 return true 16864 } 16865 // match: (Or8 (Or8 (Const8 <t> [d]) x) (Const8 <t> [c])) 16866 // cond: 16867 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 16868 for { 16869 v_0 := v.Args[0] 16870 if v_0.Op != OpOr8 { 16871 break 16872 } 16873 v_0_0 := v_0.Args[0] 16874 if v_0_0.Op != OpConst8 { 16875 break 16876 } 16877 t := v_0_0.Type 16878 d := v_0_0.AuxInt 16879 x := v_0.Args[1] 16880 v_1 := v.Args[1] 16881 if v_1.Op != OpConst8 { 16882 break 16883 } 16884 if v_1.Type != t { 16885 break 16886 } 16887 c := v_1.AuxInt 16888 v.reset(OpOr8) 16889 v0 := b.NewValue0(v.Pos, OpConst8, t) 16890 v0.AuxInt = int64(int8(c | d)) 16891 v.AddArg(v0) 16892 v.AddArg(x) 16893 return true 16894 } 16895 // match: (Or8 (Or8 x (Const8 <t> [d])) (Const8 <t> [c])) 16896 // cond: 16897 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 16898 for { 16899 v_0 := v.Args[0] 16900 if v_0.Op != OpOr8 { 16901 break 16902 } 16903 x := v_0.Args[0] 16904 v_0_1 := v_0.Args[1] 16905 if v_0_1.Op != OpConst8 { 16906 break 16907 } 16908 t := v_0_1.Type 16909 d := v_0_1.AuxInt 16910 v_1 := v.Args[1] 16911 if v_1.Op != OpConst8 { 16912 break 16913 } 16914 if v_1.Type != t { 16915 break 16916 } 16917 c := v_1.AuxInt 16918 v.reset(OpOr8) 16919 v0 := b.NewValue0(v.Pos, OpConst8, t) 16920 v0.AuxInt = int64(int8(c | d)) 16921 v.AddArg(v0) 16922 v.AddArg(x) 16923 return true 16924 } 16925 return false 16926 } 16927 func rewriteValuegeneric_OpPhi_0(v *Value) bool { 16928 // match: (Phi (Const8 [c]) (Const8 [c])) 16929 // cond: 16930 // result: (Const8 [c]) 16931 for { 16932 v_0 := v.Args[0] 16933 if v_0.Op != OpConst8 { 16934 break 16935 } 16936 c := v_0.AuxInt 16937 v_1 := v.Args[1] 16938 if v_1.Op != OpConst8 { 16939 break 16940 } 16941 if v_1.AuxInt != c { 16942 break 16943 } 16944 if len(v.Args) != 2 { 16945 break 16946 } 16947 v.reset(OpConst8) 16948 v.AuxInt = c 16949 return true 16950 } 16951 // match: (Phi (Const16 [c]) (Const16 [c])) 16952 // cond: 16953 // result: (Const16 [c]) 16954 for { 16955 v_0 := v.Args[0] 16956 if v_0.Op != OpConst16 { 16957 break 16958 } 16959 c := v_0.AuxInt 16960 v_1 := v.Args[1] 16961 if v_1.Op != OpConst16 { 16962 break 16963 } 16964 if v_1.AuxInt != c { 16965 break 16966 } 16967 if len(v.Args) != 2 { 16968 break 16969 } 16970 v.reset(OpConst16) 16971 v.AuxInt = c 16972 return true 16973 } 16974 // match: (Phi (Const32 [c]) (Const32 [c])) 16975 // cond: 16976 // result: (Const32 [c]) 16977 for { 16978 v_0 := v.Args[0] 16979 if v_0.Op != OpConst32 { 16980 break 16981 } 16982 c := v_0.AuxInt 16983 v_1 := v.Args[1] 16984 if v_1.Op != OpConst32 { 16985 break 16986 } 16987 if v_1.AuxInt != c { 16988 break 16989 } 16990 if len(v.Args) != 2 { 16991 break 16992 } 16993 v.reset(OpConst32) 16994 v.AuxInt = c 16995 return true 16996 } 16997 // match: (Phi (Const64 [c]) (Const64 [c])) 16998 // cond: 16999 // result: (Const64 [c]) 17000 for { 17001 v_0 := v.Args[0] 17002 if v_0.Op != OpConst64 { 17003 break 17004 } 17005 c := v_0.AuxInt 17006 v_1 := v.Args[1] 17007 if v_1.Op != OpConst64 { 17008 break 17009 } 17010 if v_1.AuxInt != c { 17011 break 17012 } 17013 if len(v.Args) != 2 { 17014 break 17015 } 17016 v.reset(OpConst64) 17017 v.AuxInt = c 17018 return true 17019 } 17020 return false 17021 } 17022 func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { 17023 b := v.Block 17024 _ = b 17025 config := b.Func.Config 17026 _ = config 17027 types := &b.Func.Config.Types 17028 _ = types 17029 // match: (PtrIndex <t> ptr idx) 17030 // cond: config.PtrSize == 4 17031 // result: (AddPtr ptr (Mul32 <types.Int> idx (Const32 <types.Int> [t.ElemType().Size()]))) 17032 for { 17033 t := v.Type 17034 ptr := v.Args[0] 17035 idx := v.Args[1] 17036 if !(config.PtrSize == 4) { 17037 break 17038 } 17039 v.reset(OpAddPtr) 17040 v.AddArg(ptr) 17041 v0 := b.NewValue0(v.Pos, OpMul32, types.Int) 17042 v0.AddArg(idx) 17043 v1 := b.NewValue0(v.Pos, OpConst32, types.Int) 17044 v1.AuxInt = t.ElemType().Size() 17045 v0.AddArg(v1) 17046 v.AddArg(v0) 17047 return true 17048 } 17049 // match: (PtrIndex <t> ptr idx) 17050 // cond: config.PtrSize == 8 17051 // result: (AddPtr ptr (Mul64 <types.Int> idx (Const64 <types.Int> [t.ElemType().Size()]))) 17052 for { 17053 t := v.Type 17054 ptr := v.Args[0] 17055 idx := v.Args[1] 17056 if !(config.PtrSize == 8) { 17057 break 17058 } 17059 v.reset(OpAddPtr) 17060 v.AddArg(ptr) 17061 v0 := b.NewValue0(v.Pos, OpMul64, types.Int) 17062 v0.AddArg(idx) 17063 v1 := b.NewValue0(v.Pos, OpConst64, types.Int) 17064 v1.AuxInt = t.ElemType().Size() 17065 v0.AddArg(v1) 17066 v.AddArg(v0) 17067 return true 17068 } 17069 return false 17070 } 17071 func rewriteValuegeneric_OpRound32F_0(v *Value) bool { 17072 // match: (Round32F x:(Const32F)) 17073 // cond: 17074 // result: x 17075 for { 17076 x := v.Args[0] 17077 if x.Op != OpConst32F { 17078 break 17079 } 17080 v.reset(OpCopy) 17081 v.Type = x.Type 17082 v.AddArg(x) 17083 return true 17084 } 17085 return false 17086 } 17087 func rewriteValuegeneric_OpRound64F_0(v *Value) bool { 17088 // match: (Round64F x:(Const64F)) 17089 // cond: 17090 // result: x 17091 for { 17092 x := v.Args[0] 17093 if x.Op != OpConst64F { 17094 break 17095 } 17096 v.reset(OpCopy) 17097 v.Type = x.Type 17098 v.AddArg(x) 17099 return true 17100 } 17101 return false 17102 } 17103 func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { 17104 b := v.Block 17105 _ = b 17106 // match: (Rsh16Ux16 <t> x (Const16 [c])) 17107 // cond: 17108 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))])) 17109 for { 17110 t := v.Type 17111 x := v.Args[0] 17112 v_1 := v.Args[1] 17113 if v_1.Op != OpConst16 { 17114 break 17115 } 17116 c := v_1.AuxInt 17117 v.reset(OpRsh16Ux64) 17118 v.AddArg(x) 17119 v0 := b.NewValue0(v.Pos, OpConst64, t) 17120 v0.AuxInt = int64(uint16(c)) 17121 v.AddArg(v0) 17122 return true 17123 } 17124 // match: (Rsh16Ux16 (Const16 [0]) _) 17125 // cond: 17126 // result: (Const16 [0]) 17127 for { 17128 v_0 := v.Args[0] 17129 if v_0.Op != OpConst16 { 17130 break 17131 } 17132 if v_0.AuxInt != 0 { 17133 break 17134 } 17135 v.reset(OpConst16) 17136 v.AuxInt = 0 17137 return true 17138 } 17139 return false 17140 } 17141 func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { 17142 b := v.Block 17143 _ = b 17144 // match: (Rsh16Ux32 <t> x (Const32 [c])) 17145 // cond: 17146 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))])) 17147 for { 17148 t := v.Type 17149 x := v.Args[0] 17150 v_1 := v.Args[1] 17151 if v_1.Op != OpConst32 { 17152 break 17153 } 17154 c := v_1.AuxInt 17155 v.reset(OpRsh16Ux64) 17156 v.AddArg(x) 17157 v0 := b.NewValue0(v.Pos, OpConst64, t) 17158 v0.AuxInt = int64(uint32(c)) 17159 v.AddArg(v0) 17160 return true 17161 } 17162 // match: (Rsh16Ux32 (Const16 [0]) _) 17163 // cond: 17164 // result: (Const16 [0]) 17165 for { 17166 v_0 := v.Args[0] 17167 if v_0.Op != OpConst16 { 17168 break 17169 } 17170 if v_0.AuxInt != 0 { 17171 break 17172 } 17173 v.reset(OpConst16) 17174 v.AuxInt = 0 17175 return true 17176 } 17177 return false 17178 } 17179 func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { 17180 b := v.Block 17181 _ = b 17182 types := &b.Func.Config.Types 17183 _ = types 17184 // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) 17185 // cond: 17186 // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) 17187 for { 17188 v_0 := v.Args[0] 17189 if v_0.Op != OpConst16 { 17190 break 17191 } 17192 c := v_0.AuxInt 17193 v_1 := v.Args[1] 17194 if v_1.Op != OpConst64 { 17195 break 17196 } 17197 d := v_1.AuxInt 17198 v.reset(OpConst16) 17199 v.AuxInt = int64(int16(uint16(c) >> uint64(d))) 17200 return true 17201 } 17202 // match: (Rsh16Ux64 x (Const64 [0])) 17203 // cond: 17204 // result: x 17205 for { 17206 x := v.Args[0] 17207 v_1 := v.Args[1] 17208 if v_1.Op != OpConst64 { 17209 break 17210 } 17211 if v_1.AuxInt != 0 { 17212 break 17213 } 17214 v.reset(OpCopy) 17215 v.Type = x.Type 17216 v.AddArg(x) 17217 return true 17218 } 17219 // match: (Rsh16Ux64 (Const16 [0]) _) 17220 // cond: 17221 // result: (Const16 [0]) 17222 for { 17223 v_0 := v.Args[0] 17224 if v_0.Op != OpConst16 { 17225 break 17226 } 17227 if v_0.AuxInt != 0 { 17228 break 17229 } 17230 v.reset(OpConst16) 17231 v.AuxInt = 0 17232 return true 17233 } 17234 // match: (Rsh16Ux64 _ (Const64 [c])) 17235 // cond: uint64(c) >= 16 17236 // result: (Const16 [0]) 17237 for { 17238 v_1 := v.Args[1] 17239 if v_1.Op != OpConst64 { 17240 break 17241 } 17242 c := v_1.AuxInt 17243 if !(uint64(c) >= 16) { 17244 break 17245 } 17246 v.reset(OpConst16) 17247 v.AuxInt = 0 17248 return true 17249 } 17250 // match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) 17251 // cond: !uaddOvf(c,d) 17252 // result: (Rsh16Ux64 x (Const64 <t> [c+d])) 17253 for { 17254 t := v.Type 17255 v_0 := v.Args[0] 17256 if v_0.Op != OpRsh16Ux64 { 17257 break 17258 } 17259 x := v_0.Args[0] 17260 v_0_1 := v_0.Args[1] 17261 if v_0_1.Op != OpConst64 { 17262 break 17263 } 17264 c := v_0_1.AuxInt 17265 v_1 := v.Args[1] 17266 if v_1.Op != OpConst64 { 17267 break 17268 } 17269 d := v_1.AuxInt 17270 if !(!uaddOvf(c, d)) { 17271 break 17272 } 17273 v.reset(OpRsh16Ux64) 17274 v.AddArg(x) 17275 v0 := b.NewValue0(v.Pos, OpConst64, t) 17276 v0.AuxInt = c + d 17277 v.AddArg(v0) 17278 return true 17279 } 17280 // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 17281 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 17282 // result: (Rsh16Ux64 x (Const64 <types.UInt64> [c1-c2+c3])) 17283 for { 17284 v_0 := v.Args[0] 17285 if v_0.Op != OpLsh16x64 { 17286 break 17287 } 17288 v_0_0 := v_0.Args[0] 17289 if v_0_0.Op != OpRsh16Ux64 { 17290 break 17291 } 17292 x := v_0_0.Args[0] 17293 v_0_0_1 := v_0_0.Args[1] 17294 if v_0_0_1.Op != OpConst64 { 17295 break 17296 } 17297 c1 := v_0_0_1.AuxInt 17298 v_0_1 := v_0.Args[1] 17299 if v_0_1.Op != OpConst64 { 17300 break 17301 } 17302 c2 := v_0_1.AuxInt 17303 v_1 := v.Args[1] 17304 if v_1.Op != OpConst64 { 17305 break 17306 } 17307 c3 := v_1.AuxInt 17308 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 17309 break 17310 } 17311 v.reset(OpRsh16Ux64) 17312 v.AddArg(x) 17313 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 17314 v0.AuxInt = c1 - c2 + c3 17315 v.AddArg(v0) 17316 return true 17317 } 17318 // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 17319 // cond: 17320 // result: (ZeroExt8to16 (Trunc16to8 <types.UInt8> x)) 17321 for { 17322 v_0 := v.Args[0] 17323 if v_0.Op != OpLsh16x64 { 17324 break 17325 } 17326 x := v_0.Args[0] 17327 v_0_1 := v_0.Args[1] 17328 if v_0_1.Op != OpConst64 { 17329 break 17330 } 17331 if v_0_1.AuxInt != 8 { 17332 break 17333 } 17334 v_1 := v.Args[1] 17335 if v_1.Op != OpConst64 { 17336 break 17337 } 17338 if v_1.AuxInt != 8 { 17339 break 17340 } 17341 v.reset(OpZeroExt8to16) 17342 v0 := b.NewValue0(v.Pos, OpTrunc16to8, types.UInt8) 17343 v0.AddArg(x) 17344 v.AddArg(v0) 17345 return true 17346 } 17347 return false 17348 } 17349 func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { 17350 b := v.Block 17351 _ = b 17352 // match: (Rsh16Ux8 <t> x (Const8 [c])) 17353 // cond: 17354 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))])) 17355 for { 17356 t := v.Type 17357 x := v.Args[0] 17358 v_1 := v.Args[1] 17359 if v_1.Op != OpConst8 { 17360 break 17361 } 17362 c := v_1.AuxInt 17363 v.reset(OpRsh16Ux64) 17364 v.AddArg(x) 17365 v0 := b.NewValue0(v.Pos, OpConst64, t) 17366 v0.AuxInt = int64(uint8(c)) 17367 v.AddArg(v0) 17368 return true 17369 } 17370 // match: (Rsh16Ux8 (Const16 [0]) _) 17371 // cond: 17372 // result: (Const16 [0]) 17373 for { 17374 v_0 := v.Args[0] 17375 if v_0.Op != OpConst16 { 17376 break 17377 } 17378 if v_0.AuxInt != 0 { 17379 break 17380 } 17381 v.reset(OpConst16) 17382 v.AuxInt = 0 17383 return true 17384 } 17385 return false 17386 } 17387 func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { 17388 b := v.Block 17389 _ = b 17390 // match: (Rsh16x16 <t> x (Const16 [c])) 17391 // cond: 17392 // result: (Rsh16x64 x (Const64 <t> [int64(uint16(c))])) 17393 for { 17394 t := v.Type 17395 x := v.Args[0] 17396 v_1 := v.Args[1] 17397 if v_1.Op != OpConst16 { 17398 break 17399 } 17400 c := v_1.AuxInt 17401 v.reset(OpRsh16x64) 17402 v.AddArg(x) 17403 v0 := b.NewValue0(v.Pos, OpConst64, t) 17404 v0.AuxInt = int64(uint16(c)) 17405 v.AddArg(v0) 17406 return true 17407 } 17408 // match: (Rsh16x16 (Const16 [0]) _) 17409 // cond: 17410 // result: (Const16 [0]) 17411 for { 17412 v_0 := v.Args[0] 17413 if v_0.Op != OpConst16 { 17414 break 17415 } 17416 if v_0.AuxInt != 0 { 17417 break 17418 } 17419 v.reset(OpConst16) 17420 v.AuxInt = 0 17421 return true 17422 } 17423 return false 17424 } 17425 func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { 17426 b := v.Block 17427 _ = b 17428 // match: (Rsh16x32 <t> x (Const32 [c])) 17429 // cond: 17430 // result: (Rsh16x64 x (Const64 <t> [int64(uint32(c))])) 17431 for { 17432 t := v.Type 17433 x := v.Args[0] 17434 v_1 := v.Args[1] 17435 if v_1.Op != OpConst32 { 17436 break 17437 } 17438 c := v_1.AuxInt 17439 v.reset(OpRsh16x64) 17440 v.AddArg(x) 17441 v0 := b.NewValue0(v.Pos, OpConst64, t) 17442 v0.AuxInt = int64(uint32(c)) 17443 v.AddArg(v0) 17444 return true 17445 } 17446 // match: (Rsh16x32 (Const16 [0]) _) 17447 // cond: 17448 // result: (Const16 [0]) 17449 for { 17450 v_0 := v.Args[0] 17451 if v_0.Op != OpConst16 { 17452 break 17453 } 17454 if v_0.AuxInt != 0 { 17455 break 17456 } 17457 v.reset(OpConst16) 17458 v.AuxInt = 0 17459 return true 17460 } 17461 return false 17462 } 17463 func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { 17464 b := v.Block 17465 _ = b 17466 types := &b.Func.Config.Types 17467 _ = types 17468 // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) 17469 // cond: 17470 // result: (Const16 [int64(int16(c) >> uint64(d))]) 17471 for { 17472 v_0 := v.Args[0] 17473 if v_0.Op != OpConst16 { 17474 break 17475 } 17476 c := v_0.AuxInt 17477 v_1 := v.Args[1] 17478 if v_1.Op != OpConst64 { 17479 break 17480 } 17481 d := v_1.AuxInt 17482 v.reset(OpConst16) 17483 v.AuxInt = int64(int16(c) >> uint64(d)) 17484 return true 17485 } 17486 // match: (Rsh16x64 x (Const64 [0])) 17487 // cond: 17488 // result: x 17489 for { 17490 x := v.Args[0] 17491 v_1 := v.Args[1] 17492 if v_1.Op != OpConst64 { 17493 break 17494 } 17495 if v_1.AuxInt != 0 { 17496 break 17497 } 17498 v.reset(OpCopy) 17499 v.Type = x.Type 17500 v.AddArg(x) 17501 return true 17502 } 17503 // match: (Rsh16x64 (Const16 [0]) _) 17504 // cond: 17505 // result: (Const16 [0]) 17506 for { 17507 v_0 := v.Args[0] 17508 if v_0.Op != OpConst16 { 17509 break 17510 } 17511 if v_0.AuxInt != 0 { 17512 break 17513 } 17514 v.reset(OpConst16) 17515 v.AuxInt = 0 17516 return true 17517 } 17518 // match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d])) 17519 // cond: !uaddOvf(c,d) 17520 // result: (Rsh16x64 x (Const64 <t> [c+d])) 17521 for { 17522 t := v.Type 17523 v_0 := v.Args[0] 17524 if v_0.Op != OpRsh16x64 { 17525 break 17526 } 17527 x := v_0.Args[0] 17528 v_0_1 := v_0.Args[1] 17529 if v_0_1.Op != OpConst64 { 17530 break 17531 } 17532 c := v_0_1.AuxInt 17533 v_1 := v.Args[1] 17534 if v_1.Op != OpConst64 { 17535 break 17536 } 17537 d := v_1.AuxInt 17538 if !(!uaddOvf(c, d)) { 17539 break 17540 } 17541 v.reset(OpRsh16x64) 17542 v.AddArg(x) 17543 v0 := b.NewValue0(v.Pos, OpConst64, t) 17544 v0.AuxInt = c + d 17545 v.AddArg(v0) 17546 return true 17547 } 17548 // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 17549 // cond: 17550 // result: (SignExt8to16 (Trunc16to8 <types.Int8> x)) 17551 for { 17552 v_0 := v.Args[0] 17553 if v_0.Op != OpLsh16x64 { 17554 break 17555 } 17556 x := v_0.Args[0] 17557 v_0_1 := v_0.Args[1] 17558 if v_0_1.Op != OpConst64 { 17559 break 17560 } 17561 if v_0_1.AuxInt != 8 { 17562 break 17563 } 17564 v_1 := v.Args[1] 17565 if v_1.Op != OpConst64 { 17566 break 17567 } 17568 if v_1.AuxInt != 8 { 17569 break 17570 } 17571 v.reset(OpSignExt8to16) 17572 v0 := b.NewValue0(v.Pos, OpTrunc16to8, types.Int8) 17573 v0.AddArg(x) 17574 v.AddArg(v0) 17575 return true 17576 } 17577 return false 17578 } 17579 func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { 17580 b := v.Block 17581 _ = b 17582 // match: (Rsh16x8 <t> x (Const8 [c])) 17583 // cond: 17584 // result: (Rsh16x64 x (Const64 <t> [int64(uint8(c))])) 17585 for { 17586 t := v.Type 17587 x := v.Args[0] 17588 v_1 := v.Args[1] 17589 if v_1.Op != OpConst8 { 17590 break 17591 } 17592 c := v_1.AuxInt 17593 v.reset(OpRsh16x64) 17594 v.AddArg(x) 17595 v0 := b.NewValue0(v.Pos, OpConst64, t) 17596 v0.AuxInt = int64(uint8(c)) 17597 v.AddArg(v0) 17598 return true 17599 } 17600 // match: (Rsh16x8 (Const16 [0]) _) 17601 // cond: 17602 // result: (Const16 [0]) 17603 for { 17604 v_0 := v.Args[0] 17605 if v_0.Op != OpConst16 { 17606 break 17607 } 17608 if v_0.AuxInt != 0 { 17609 break 17610 } 17611 v.reset(OpConst16) 17612 v.AuxInt = 0 17613 return true 17614 } 17615 return false 17616 } 17617 func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { 17618 b := v.Block 17619 _ = b 17620 // match: (Rsh32Ux16 <t> x (Const16 [c])) 17621 // cond: 17622 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))])) 17623 for { 17624 t := v.Type 17625 x := v.Args[0] 17626 v_1 := v.Args[1] 17627 if v_1.Op != OpConst16 { 17628 break 17629 } 17630 c := v_1.AuxInt 17631 v.reset(OpRsh32Ux64) 17632 v.AddArg(x) 17633 v0 := b.NewValue0(v.Pos, OpConst64, t) 17634 v0.AuxInt = int64(uint16(c)) 17635 v.AddArg(v0) 17636 return true 17637 } 17638 // match: (Rsh32Ux16 (Const32 [0]) _) 17639 // cond: 17640 // result: (Const32 [0]) 17641 for { 17642 v_0 := v.Args[0] 17643 if v_0.Op != OpConst32 { 17644 break 17645 } 17646 if v_0.AuxInt != 0 { 17647 break 17648 } 17649 v.reset(OpConst32) 17650 v.AuxInt = 0 17651 return true 17652 } 17653 return false 17654 } 17655 func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { 17656 b := v.Block 17657 _ = b 17658 // match: (Rsh32Ux32 <t> x (Const32 [c])) 17659 // cond: 17660 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))])) 17661 for { 17662 t := v.Type 17663 x := v.Args[0] 17664 v_1 := v.Args[1] 17665 if v_1.Op != OpConst32 { 17666 break 17667 } 17668 c := v_1.AuxInt 17669 v.reset(OpRsh32Ux64) 17670 v.AddArg(x) 17671 v0 := b.NewValue0(v.Pos, OpConst64, t) 17672 v0.AuxInt = int64(uint32(c)) 17673 v.AddArg(v0) 17674 return true 17675 } 17676 // match: (Rsh32Ux32 (Const32 [0]) _) 17677 // cond: 17678 // result: (Const32 [0]) 17679 for { 17680 v_0 := v.Args[0] 17681 if v_0.Op != OpConst32 { 17682 break 17683 } 17684 if v_0.AuxInt != 0 { 17685 break 17686 } 17687 v.reset(OpConst32) 17688 v.AuxInt = 0 17689 return true 17690 } 17691 return false 17692 } 17693 func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { 17694 b := v.Block 17695 _ = b 17696 types := &b.Func.Config.Types 17697 _ = types 17698 // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) 17699 // cond: 17700 // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) 17701 for { 17702 v_0 := v.Args[0] 17703 if v_0.Op != OpConst32 { 17704 break 17705 } 17706 c := v_0.AuxInt 17707 v_1 := v.Args[1] 17708 if v_1.Op != OpConst64 { 17709 break 17710 } 17711 d := v_1.AuxInt 17712 v.reset(OpConst32) 17713 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 17714 return true 17715 } 17716 // match: (Rsh32Ux64 x (Const64 [0])) 17717 // cond: 17718 // result: x 17719 for { 17720 x := v.Args[0] 17721 v_1 := v.Args[1] 17722 if v_1.Op != OpConst64 { 17723 break 17724 } 17725 if v_1.AuxInt != 0 { 17726 break 17727 } 17728 v.reset(OpCopy) 17729 v.Type = x.Type 17730 v.AddArg(x) 17731 return true 17732 } 17733 // match: (Rsh32Ux64 (Const32 [0]) _) 17734 // cond: 17735 // result: (Const32 [0]) 17736 for { 17737 v_0 := v.Args[0] 17738 if v_0.Op != OpConst32 { 17739 break 17740 } 17741 if v_0.AuxInt != 0 { 17742 break 17743 } 17744 v.reset(OpConst32) 17745 v.AuxInt = 0 17746 return true 17747 } 17748 // match: (Rsh32Ux64 _ (Const64 [c])) 17749 // cond: uint64(c) >= 32 17750 // result: (Const32 [0]) 17751 for { 17752 v_1 := v.Args[1] 17753 if v_1.Op != OpConst64 { 17754 break 17755 } 17756 c := v_1.AuxInt 17757 if !(uint64(c) >= 32) { 17758 break 17759 } 17760 v.reset(OpConst32) 17761 v.AuxInt = 0 17762 return true 17763 } 17764 // match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) 17765 // cond: !uaddOvf(c,d) 17766 // result: (Rsh32Ux64 x (Const64 <t> [c+d])) 17767 for { 17768 t := v.Type 17769 v_0 := v.Args[0] 17770 if v_0.Op != OpRsh32Ux64 { 17771 break 17772 } 17773 x := v_0.Args[0] 17774 v_0_1 := v_0.Args[1] 17775 if v_0_1.Op != OpConst64 { 17776 break 17777 } 17778 c := v_0_1.AuxInt 17779 v_1 := v.Args[1] 17780 if v_1.Op != OpConst64 { 17781 break 17782 } 17783 d := v_1.AuxInt 17784 if !(!uaddOvf(c, d)) { 17785 break 17786 } 17787 v.reset(OpRsh32Ux64) 17788 v.AddArg(x) 17789 v0 := b.NewValue0(v.Pos, OpConst64, t) 17790 v0.AuxInt = c + d 17791 v.AddArg(v0) 17792 return true 17793 } 17794 // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 17795 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 17796 // result: (Rsh32Ux64 x (Const64 <types.UInt64> [c1-c2+c3])) 17797 for { 17798 v_0 := v.Args[0] 17799 if v_0.Op != OpLsh32x64 { 17800 break 17801 } 17802 v_0_0 := v_0.Args[0] 17803 if v_0_0.Op != OpRsh32Ux64 { 17804 break 17805 } 17806 x := v_0_0.Args[0] 17807 v_0_0_1 := v_0_0.Args[1] 17808 if v_0_0_1.Op != OpConst64 { 17809 break 17810 } 17811 c1 := v_0_0_1.AuxInt 17812 v_0_1 := v_0.Args[1] 17813 if v_0_1.Op != OpConst64 { 17814 break 17815 } 17816 c2 := v_0_1.AuxInt 17817 v_1 := v.Args[1] 17818 if v_1.Op != OpConst64 { 17819 break 17820 } 17821 c3 := v_1.AuxInt 17822 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 17823 break 17824 } 17825 v.reset(OpRsh32Ux64) 17826 v.AddArg(x) 17827 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 17828 v0.AuxInt = c1 - c2 + c3 17829 v.AddArg(v0) 17830 return true 17831 } 17832 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 17833 // cond: 17834 // result: (ZeroExt8to32 (Trunc32to8 <types.UInt8> x)) 17835 for { 17836 v_0 := v.Args[0] 17837 if v_0.Op != OpLsh32x64 { 17838 break 17839 } 17840 x := v_0.Args[0] 17841 v_0_1 := v_0.Args[1] 17842 if v_0_1.Op != OpConst64 { 17843 break 17844 } 17845 if v_0_1.AuxInt != 24 { 17846 break 17847 } 17848 v_1 := v.Args[1] 17849 if v_1.Op != OpConst64 { 17850 break 17851 } 17852 if v_1.AuxInt != 24 { 17853 break 17854 } 17855 v.reset(OpZeroExt8to32) 17856 v0 := b.NewValue0(v.Pos, OpTrunc32to8, types.UInt8) 17857 v0.AddArg(x) 17858 v.AddArg(v0) 17859 return true 17860 } 17861 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 17862 // cond: 17863 // result: (ZeroExt16to32 (Trunc32to16 <types.UInt16> x)) 17864 for { 17865 v_0 := v.Args[0] 17866 if v_0.Op != OpLsh32x64 { 17867 break 17868 } 17869 x := v_0.Args[0] 17870 v_0_1 := v_0.Args[1] 17871 if v_0_1.Op != OpConst64 { 17872 break 17873 } 17874 if v_0_1.AuxInt != 16 { 17875 break 17876 } 17877 v_1 := v.Args[1] 17878 if v_1.Op != OpConst64 { 17879 break 17880 } 17881 if v_1.AuxInt != 16 { 17882 break 17883 } 17884 v.reset(OpZeroExt16to32) 17885 v0 := b.NewValue0(v.Pos, OpTrunc32to16, types.UInt16) 17886 v0.AddArg(x) 17887 v.AddArg(v0) 17888 return true 17889 } 17890 return false 17891 } 17892 func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { 17893 b := v.Block 17894 _ = b 17895 // match: (Rsh32Ux8 <t> x (Const8 [c])) 17896 // cond: 17897 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))])) 17898 for { 17899 t := v.Type 17900 x := v.Args[0] 17901 v_1 := v.Args[1] 17902 if v_1.Op != OpConst8 { 17903 break 17904 } 17905 c := v_1.AuxInt 17906 v.reset(OpRsh32Ux64) 17907 v.AddArg(x) 17908 v0 := b.NewValue0(v.Pos, OpConst64, t) 17909 v0.AuxInt = int64(uint8(c)) 17910 v.AddArg(v0) 17911 return true 17912 } 17913 // match: (Rsh32Ux8 (Const32 [0]) _) 17914 // cond: 17915 // result: (Const32 [0]) 17916 for { 17917 v_0 := v.Args[0] 17918 if v_0.Op != OpConst32 { 17919 break 17920 } 17921 if v_0.AuxInt != 0 { 17922 break 17923 } 17924 v.reset(OpConst32) 17925 v.AuxInt = 0 17926 return true 17927 } 17928 return false 17929 } 17930 func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { 17931 b := v.Block 17932 _ = b 17933 // match: (Rsh32x16 <t> x (Const16 [c])) 17934 // cond: 17935 // result: (Rsh32x64 x (Const64 <t> [int64(uint16(c))])) 17936 for { 17937 t := v.Type 17938 x := v.Args[0] 17939 v_1 := v.Args[1] 17940 if v_1.Op != OpConst16 { 17941 break 17942 } 17943 c := v_1.AuxInt 17944 v.reset(OpRsh32x64) 17945 v.AddArg(x) 17946 v0 := b.NewValue0(v.Pos, OpConst64, t) 17947 v0.AuxInt = int64(uint16(c)) 17948 v.AddArg(v0) 17949 return true 17950 } 17951 // match: (Rsh32x16 (Const32 [0]) _) 17952 // cond: 17953 // result: (Const32 [0]) 17954 for { 17955 v_0 := v.Args[0] 17956 if v_0.Op != OpConst32 { 17957 break 17958 } 17959 if v_0.AuxInt != 0 { 17960 break 17961 } 17962 v.reset(OpConst32) 17963 v.AuxInt = 0 17964 return true 17965 } 17966 return false 17967 } 17968 func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { 17969 b := v.Block 17970 _ = b 17971 // match: (Rsh32x32 <t> x (Const32 [c])) 17972 // cond: 17973 // result: (Rsh32x64 x (Const64 <t> [int64(uint32(c))])) 17974 for { 17975 t := v.Type 17976 x := v.Args[0] 17977 v_1 := v.Args[1] 17978 if v_1.Op != OpConst32 { 17979 break 17980 } 17981 c := v_1.AuxInt 17982 v.reset(OpRsh32x64) 17983 v.AddArg(x) 17984 v0 := b.NewValue0(v.Pos, OpConst64, t) 17985 v0.AuxInt = int64(uint32(c)) 17986 v.AddArg(v0) 17987 return true 17988 } 17989 // match: (Rsh32x32 (Const32 [0]) _) 17990 // cond: 17991 // result: (Const32 [0]) 17992 for { 17993 v_0 := v.Args[0] 17994 if v_0.Op != OpConst32 { 17995 break 17996 } 17997 if v_0.AuxInt != 0 { 17998 break 17999 } 18000 v.reset(OpConst32) 18001 v.AuxInt = 0 18002 return true 18003 } 18004 return false 18005 } 18006 func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { 18007 b := v.Block 18008 _ = b 18009 types := &b.Func.Config.Types 18010 _ = types 18011 // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) 18012 // cond: 18013 // result: (Const32 [int64(int32(c) >> uint64(d))]) 18014 for { 18015 v_0 := v.Args[0] 18016 if v_0.Op != OpConst32 { 18017 break 18018 } 18019 c := v_0.AuxInt 18020 v_1 := v.Args[1] 18021 if v_1.Op != OpConst64 { 18022 break 18023 } 18024 d := v_1.AuxInt 18025 v.reset(OpConst32) 18026 v.AuxInt = int64(int32(c) >> uint64(d)) 18027 return true 18028 } 18029 // match: (Rsh32x64 x (Const64 [0])) 18030 // cond: 18031 // result: x 18032 for { 18033 x := v.Args[0] 18034 v_1 := v.Args[1] 18035 if v_1.Op != OpConst64 { 18036 break 18037 } 18038 if v_1.AuxInt != 0 { 18039 break 18040 } 18041 v.reset(OpCopy) 18042 v.Type = x.Type 18043 v.AddArg(x) 18044 return true 18045 } 18046 // match: (Rsh32x64 (Const32 [0]) _) 18047 // cond: 18048 // result: (Const32 [0]) 18049 for { 18050 v_0 := v.Args[0] 18051 if v_0.Op != OpConst32 { 18052 break 18053 } 18054 if v_0.AuxInt != 0 { 18055 break 18056 } 18057 v.reset(OpConst32) 18058 v.AuxInt = 0 18059 return true 18060 } 18061 // match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d])) 18062 // cond: !uaddOvf(c,d) 18063 // result: (Rsh32x64 x (Const64 <t> [c+d])) 18064 for { 18065 t := v.Type 18066 v_0 := v.Args[0] 18067 if v_0.Op != OpRsh32x64 { 18068 break 18069 } 18070 x := v_0.Args[0] 18071 v_0_1 := v_0.Args[1] 18072 if v_0_1.Op != OpConst64 { 18073 break 18074 } 18075 c := v_0_1.AuxInt 18076 v_1 := v.Args[1] 18077 if v_1.Op != OpConst64 { 18078 break 18079 } 18080 d := v_1.AuxInt 18081 if !(!uaddOvf(c, d)) { 18082 break 18083 } 18084 v.reset(OpRsh32x64) 18085 v.AddArg(x) 18086 v0 := b.NewValue0(v.Pos, OpConst64, t) 18087 v0.AuxInt = c + d 18088 v.AddArg(v0) 18089 return true 18090 } 18091 // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 18092 // cond: 18093 // result: (SignExt8to32 (Trunc32to8 <types.Int8> x)) 18094 for { 18095 v_0 := v.Args[0] 18096 if v_0.Op != OpLsh32x64 { 18097 break 18098 } 18099 x := v_0.Args[0] 18100 v_0_1 := v_0.Args[1] 18101 if v_0_1.Op != OpConst64 { 18102 break 18103 } 18104 if v_0_1.AuxInt != 24 { 18105 break 18106 } 18107 v_1 := v.Args[1] 18108 if v_1.Op != OpConst64 { 18109 break 18110 } 18111 if v_1.AuxInt != 24 { 18112 break 18113 } 18114 v.reset(OpSignExt8to32) 18115 v0 := b.NewValue0(v.Pos, OpTrunc32to8, types.Int8) 18116 v0.AddArg(x) 18117 v.AddArg(v0) 18118 return true 18119 } 18120 // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 18121 // cond: 18122 // result: (SignExt16to32 (Trunc32to16 <types.Int16> x)) 18123 for { 18124 v_0 := v.Args[0] 18125 if v_0.Op != OpLsh32x64 { 18126 break 18127 } 18128 x := v_0.Args[0] 18129 v_0_1 := v_0.Args[1] 18130 if v_0_1.Op != OpConst64 { 18131 break 18132 } 18133 if v_0_1.AuxInt != 16 { 18134 break 18135 } 18136 v_1 := v.Args[1] 18137 if v_1.Op != OpConst64 { 18138 break 18139 } 18140 if v_1.AuxInt != 16 { 18141 break 18142 } 18143 v.reset(OpSignExt16to32) 18144 v0 := b.NewValue0(v.Pos, OpTrunc32to16, types.Int16) 18145 v0.AddArg(x) 18146 v.AddArg(v0) 18147 return true 18148 } 18149 return false 18150 } 18151 func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { 18152 b := v.Block 18153 _ = b 18154 // match: (Rsh32x8 <t> x (Const8 [c])) 18155 // cond: 18156 // result: (Rsh32x64 x (Const64 <t> [int64(uint8(c))])) 18157 for { 18158 t := v.Type 18159 x := v.Args[0] 18160 v_1 := v.Args[1] 18161 if v_1.Op != OpConst8 { 18162 break 18163 } 18164 c := v_1.AuxInt 18165 v.reset(OpRsh32x64) 18166 v.AddArg(x) 18167 v0 := b.NewValue0(v.Pos, OpConst64, t) 18168 v0.AuxInt = int64(uint8(c)) 18169 v.AddArg(v0) 18170 return true 18171 } 18172 // match: (Rsh32x8 (Const32 [0]) _) 18173 // cond: 18174 // result: (Const32 [0]) 18175 for { 18176 v_0 := v.Args[0] 18177 if v_0.Op != OpConst32 { 18178 break 18179 } 18180 if v_0.AuxInt != 0 { 18181 break 18182 } 18183 v.reset(OpConst32) 18184 v.AuxInt = 0 18185 return true 18186 } 18187 return false 18188 } 18189 func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { 18190 b := v.Block 18191 _ = b 18192 // match: (Rsh64Ux16 <t> x (Const16 [c])) 18193 // cond: 18194 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))])) 18195 for { 18196 t := v.Type 18197 x := v.Args[0] 18198 v_1 := v.Args[1] 18199 if v_1.Op != OpConst16 { 18200 break 18201 } 18202 c := v_1.AuxInt 18203 v.reset(OpRsh64Ux64) 18204 v.AddArg(x) 18205 v0 := b.NewValue0(v.Pos, OpConst64, t) 18206 v0.AuxInt = int64(uint16(c)) 18207 v.AddArg(v0) 18208 return true 18209 } 18210 // match: (Rsh64Ux16 (Const64 [0]) _) 18211 // cond: 18212 // result: (Const64 [0]) 18213 for { 18214 v_0 := v.Args[0] 18215 if v_0.Op != OpConst64 { 18216 break 18217 } 18218 if v_0.AuxInt != 0 { 18219 break 18220 } 18221 v.reset(OpConst64) 18222 v.AuxInt = 0 18223 return true 18224 } 18225 return false 18226 } 18227 func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { 18228 b := v.Block 18229 _ = b 18230 // match: (Rsh64Ux32 <t> x (Const32 [c])) 18231 // cond: 18232 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))])) 18233 for { 18234 t := v.Type 18235 x := v.Args[0] 18236 v_1 := v.Args[1] 18237 if v_1.Op != OpConst32 { 18238 break 18239 } 18240 c := v_1.AuxInt 18241 v.reset(OpRsh64Ux64) 18242 v.AddArg(x) 18243 v0 := b.NewValue0(v.Pos, OpConst64, t) 18244 v0.AuxInt = int64(uint32(c)) 18245 v.AddArg(v0) 18246 return true 18247 } 18248 // match: (Rsh64Ux32 (Const64 [0]) _) 18249 // cond: 18250 // result: (Const64 [0]) 18251 for { 18252 v_0 := v.Args[0] 18253 if v_0.Op != OpConst64 { 18254 break 18255 } 18256 if v_0.AuxInt != 0 { 18257 break 18258 } 18259 v.reset(OpConst64) 18260 v.AuxInt = 0 18261 return true 18262 } 18263 return false 18264 } 18265 func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { 18266 b := v.Block 18267 _ = b 18268 types := &b.Func.Config.Types 18269 _ = types 18270 // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) 18271 // cond: 18272 // result: (Const64 [int64(uint64(c) >> uint64(d))]) 18273 for { 18274 v_0 := v.Args[0] 18275 if v_0.Op != OpConst64 { 18276 break 18277 } 18278 c := v_0.AuxInt 18279 v_1 := v.Args[1] 18280 if v_1.Op != OpConst64 { 18281 break 18282 } 18283 d := v_1.AuxInt 18284 v.reset(OpConst64) 18285 v.AuxInt = int64(uint64(c) >> uint64(d)) 18286 return true 18287 } 18288 // match: (Rsh64Ux64 x (Const64 [0])) 18289 // cond: 18290 // result: x 18291 for { 18292 x := v.Args[0] 18293 v_1 := v.Args[1] 18294 if v_1.Op != OpConst64 { 18295 break 18296 } 18297 if v_1.AuxInt != 0 { 18298 break 18299 } 18300 v.reset(OpCopy) 18301 v.Type = x.Type 18302 v.AddArg(x) 18303 return true 18304 } 18305 // match: (Rsh64Ux64 (Const64 [0]) _) 18306 // cond: 18307 // result: (Const64 [0]) 18308 for { 18309 v_0 := v.Args[0] 18310 if v_0.Op != OpConst64 { 18311 break 18312 } 18313 if v_0.AuxInt != 0 { 18314 break 18315 } 18316 v.reset(OpConst64) 18317 v.AuxInt = 0 18318 return true 18319 } 18320 // match: (Rsh64Ux64 _ (Const64 [c])) 18321 // cond: uint64(c) >= 64 18322 // result: (Const64 [0]) 18323 for { 18324 v_1 := v.Args[1] 18325 if v_1.Op != OpConst64 { 18326 break 18327 } 18328 c := v_1.AuxInt 18329 if !(uint64(c) >= 64) { 18330 break 18331 } 18332 v.reset(OpConst64) 18333 v.AuxInt = 0 18334 return true 18335 } 18336 // match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) 18337 // cond: !uaddOvf(c,d) 18338 // result: (Rsh64Ux64 x (Const64 <t> [c+d])) 18339 for { 18340 t := v.Type 18341 v_0 := v.Args[0] 18342 if v_0.Op != OpRsh64Ux64 { 18343 break 18344 } 18345 x := v_0.Args[0] 18346 v_0_1 := v_0.Args[1] 18347 if v_0_1.Op != OpConst64 { 18348 break 18349 } 18350 c := v_0_1.AuxInt 18351 v_1 := v.Args[1] 18352 if v_1.Op != OpConst64 { 18353 break 18354 } 18355 d := v_1.AuxInt 18356 if !(!uaddOvf(c, d)) { 18357 break 18358 } 18359 v.reset(OpRsh64Ux64) 18360 v.AddArg(x) 18361 v0 := b.NewValue0(v.Pos, OpConst64, t) 18362 v0.AuxInt = c + d 18363 v.AddArg(v0) 18364 return true 18365 } 18366 // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 18367 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 18368 // result: (Rsh64Ux64 x (Const64 <types.UInt64> [c1-c2+c3])) 18369 for { 18370 v_0 := v.Args[0] 18371 if v_0.Op != OpLsh64x64 { 18372 break 18373 } 18374 v_0_0 := v_0.Args[0] 18375 if v_0_0.Op != OpRsh64Ux64 { 18376 break 18377 } 18378 x := v_0_0.Args[0] 18379 v_0_0_1 := v_0_0.Args[1] 18380 if v_0_0_1.Op != OpConst64 { 18381 break 18382 } 18383 c1 := v_0_0_1.AuxInt 18384 v_0_1 := v_0.Args[1] 18385 if v_0_1.Op != OpConst64 { 18386 break 18387 } 18388 c2 := v_0_1.AuxInt 18389 v_1 := v.Args[1] 18390 if v_1.Op != OpConst64 { 18391 break 18392 } 18393 c3 := v_1.AuxInt 18394 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 18395 break 18396 } 18397 v.reset(OpRsh64Ux64) 18398 v.AddArg(x) 18399 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 18400 v0.AuxInt = c1 - c2 + c3 18401 v.AddArg(v0) 18402 return true 18403 } 18404 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 18405 // cond: 18406 // result: (ZeroExt8to64 (Trunc64to8 <types.UInt8> x)) 18407 for { 18408 v_0 := v.Args[0] 18409 if v_0.Op != OpLsh64x64 { 18410 break 18411 } 18412 x := v_0.Args[0] 18413 v_0_1 := v_0.Args[1] 18414 if v_0_1.Op != OpConst64 { 18415 break 18416 } 18417 if v_0_1.AuxInt != 56 { 18418 break 18419 } 18420 v_1 := v.Args[1] 18421 if v_1.Op != OpConst64 { 18422 break 18423 } 18424 if v_1.AuxInt != 56 { 18425 break 18426 } 18427 v.reset(OpZeroExt8to64) 18428 v0 := b.NewValue0(v.Pos, OpTrunc64to8, types.UInt8) 18429 v0.AddArg(x) 18430 v.AddArg(v0) 18431 return true 18432 } 18433 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 18434 // cond: 18435 // result: (ZeroExt16to64 (Trunc64to16 <types.UInt16> x)) 18436 for { 18437 v_0 := v.Args[0] 18438 if v_0.Op != OpLsh64x64 { 18439 break 18440 } 18441 x := v_0.Args[0] 18442 v_0_1 := v_0.Args[1] 18443 if v_0_1.Op != OpConst64 { 18444 break 18445 } 18446 if v_0_1.AuxInt != 48 { 18447 break 18448 } 18449 v_1 := v.Args[1] 18450 if v_1.Op != OpConst64 { 18451 break 18452 } 18453 if v_1.AuxInt != 48 { 18454 break 18455 } 18456 v.reset(OpZeroExt16to64) 18457 v0 := b.NewValue0(v.Pos, OpTrunc64to16, types.UInt16) 18458 v0.AddArg(x) 18459 v.AddArg(v0) 18460 return true 18461 } 18462 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 18463 // cond: 18464 // result: (ZeroExt32to64 (Trunc64to32 <types.UInt32> x)) 18465 for { 18466 v_0 := v.Args[0] 18467 if v_0.Op != OpLsh64x64 { 18468 break 18469 } 18470 x := v_0.Args[0] 18471 v_0_1 := v_0.Args[1] 18472 if v_0_1.Op != OpConst64 { 18473 break 18474 } 18475 if v_0_1.AuxInt != 32 { 18476 break 18477 } 18478 v_1 := v.Args[1] 18479 if v_1.Op != OpConst64 { 18480 break 18481 } 18482 if v_1.AuxInt != 32 { 18483 break 18484 } 18485 v.reset(OpZeroExt32to64) 18486 v0 := b.NewValue0(v.Pos, OpTrunc64to32, types.UInt32) 18487 v0.AddArg(x) 18488 v.AddArg(v0) 18489 return true 18490 } 18491 return false 18492 } 18493 func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { 18494 b := v.Block 18495 _ = b 18496 // match: (Rsh64Ux8 <t> x (Const8 [c])) 18497 // cond: 18498 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))])) 18499 for { 18500 t := v.Type 18501 x := v.Args[0] 18502 v_1 := v.Args[1] 18503 if v_1.Op != OpConst8 { 18504 break 18505 } 18506 c := v_1.AuxInt 18507 v.reset(OpRsh64Ux64) 18508 v.AddArg(x) 18509 v0 := b.NewValue0(v.Pos, OpConst64, t) 18510 v0.AuxInt = int64(uint8(c)) 18511 v.AddArg(v0) 18512 return true 18513 } 18514 // match: (Rsh64Ux8 (Const64 [0]) _) 18515 // cond: 18516 // result: (Const64 [0]) 18517 for { 18518 v_0 := v.Args[0] 18519 if v_0.Op != OpConst64 { 18520 break 18521 } 18522 if v_0.AuxInt != 0 { 18523 break 18524 } 18525 v.reset(OpConst64) 18526 v.AuxInt = 0 18527 return true 18528 } 18529 return false 18530 } 18531 func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { 18532 b := v.Block 18533 _ = b 18534 // match: (Rsh64x16 <t> x (Const16 [c])) 18535 // cond: 18536 // result: (Rsh64x64 x (Const64 <t> [int64(uint16(c))])) 18537 for { 18538 t := v.Type 18539 x := v.Args[0] 18540 v_1 := v.Args[1] 18541 if v_1.Op != OpConst16 { 18542 break 18543 } 18544 c := v_1.AuxInt 18545 v.reset(OpRsh64x64) 18546 v.AddArg(x) 18547 v0 := b.NewValue0(v.Pos, OpConst64, t) 18548 v0.AuxInt = int64(uint16(c)) 18549 v.AddArg(v0) 18550 return true 18551 } 18552 // match: (Rsh64x16 (Const64 [0]) _) 18553 // cond: 18554 // result: (Const64 [0]) 18555 for { 18556 v_0 := v.Args[0] 18557 if v_0.Op != OpConst64 { 18558 break 18559 } 18560 if v_0.AuxInt != 0 { 18561 break 18562 } 18563 v.reset(OpConst64) 18564 v.AuxInt = 0 18565 return true 18566 } 18567 return false 18568 } 18569 func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { 18570 b := v.Block 18571 _ = b 18572 // match: (Rsh64x32 <t> x (Const32 [c])) 18573 // cond: 18574 // result: (Rsh64x64 x (Const64 <t> [int64(uint32(c))])) 18575 for { 18576 t := v.Type 18577 x := v.Args[0] 18578 v_1 := v.Args[1] 18579 if v_1.Op != OpConst32 { 18580 break 18581 } 18582 c := v_1.AuxInt 18583 v.reset(OpRsh64x64) 18584 v.AddArg(x) 18585 v0 := b.NewValue0(v.Pos, OpConst64, t) 18586 v0.AuxInt = int64(uint32(c)) 18587 v.AddArg(v0) 18588 return true 18589 } 18590 // match: (Rsh64x32 (Const64 [0]) _) 18591 // cond: 18592 // result: (Const64 [0]) 18593 for { 18594 v_0 := v.Args[0] 18595 if v_0.Op != OpConst64 { 18596 break 18597 } 18598 if v_0.AuxInt != 0 { 18599 break 18600 } 18601 v.reset(OpConst64) 18602 v.AuxInt = 0 18603 return true 18604 } 18605 return false 18606 } 18607 func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { 18608 b := v.Block 18609 _ = b 18610 types := &b.Func.Config.Types 18611 _ = types 18612 // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) 18613 // cond: 18614 // result: (Const64 [c >> uint64(d)]) 18615 for { 18616 v_0 := v.Args[0] 18617 if v_0.Op != OpConst64 { 18618 break 18619 } 18620 c := v_0.AuxInt 18621 v_1 := v.Args[1] 18622 if v_1.Op != OpConst64 { 18623 break 18624 } 18625 d := v_1.AuxInt 18626 v.reset(OpConst64) 18627 v.AuxInt = c >> uint64(d) 18628 return true 18629 } 18630 // match: (Rsh64x64 x (Const64 [0])) 18631 // cond: 18632 // result: x 18633 for { 18634 x := v.Args[0] 18635 v_1 := v.Args[1] 18636 if v_1.Op != OpConst64 { 18637 break 18638 } 18639 if v_1.AuxInt != 0 { 18640 break 18641 } 18642 v.reset(OpCopy) 18643 v.Type = x.Type 18644 v.AddArg(x) 18645 return true 18646 } 18647 // match: (Rsh64x64 (Const64 [0]) _) 18648 // cond: 18649 // result: (Const64 [0]) 18650 for { 18651 v_0 := v.Args[0] 18652 if v_0.Op != OpConst64 { 18653 break 18654 } 18655 if v_0.AuxInt != 0 { 18656 break 18657 } 18658 v.reset(OpConst64) 18659 v.AuxInt = 0 18660 return true 18661 } 18662 // match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d])) 18663 // cond: !uaddOvf(c,d) 18664 // result: (Rsh64x64 x (Const64 <t> [c+d])) 18665 for { 18666 t := v.Type 18667 v_0 := v.Args[0] 18668 if v_0.Op != OpRsh64x64 { 18669 break 18670 } 18671 x := v_0.Args[0] 18672 v_0_1 := v_0.Args[1] 18673 if v_0_1.Op != OpConst64 { 18674 break 18675 } 18676 c := v_0_1.AuxInt 18677 v_1 := v.Args[1] 18678 if v_1.Op != OpConst64 { 18679 break 18680 } 18681 d := v_1.AuxInt 18682 if !(!uaddOvf(c, d)) { 18683 break 18684 } 18685 v.reset(OpRsh64x64) 18686 v.AddArg(x) 18687 v0 := b.NewValue0(v.Pos, OpConst64, t) 18688 v0.AuxInt = c + d 18689 v.AddArg(v0) 18690 return true 18691 } 18692 // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 18693 // cond: 18694 // result: (SignExt8to64 (Trunc64to8 <types.Int8> x)) 18695 for { 18696 v_0 := v.Args[0] 18697 if v_0.Op != OpLsh64x64 { 18698 break 18699 } 18700 x := v_0.Args[0] 18701 v_0_1 := v_0.Args[1] 18702 if v_0_1.Op != OpConst64 { 18703 break 18704 } 18705 if v_0_1.AuxInt != 56 { 18706 break 18707 } 18708 v_1 := v.Args[1] 18709 if v_1.Op != OpConst64 { 18710 break 18711 } 18712 if v_1.AuxInt != 56 { 18713 break 18714 } 18715 v.reset(OpSignExt8to64) 18716 v0 := b.NewValue0(v.Pos, OpTrunc64to8, types.Int8) 18717 v0.AddArg(x) 18718 v.AddArg(v0) 18719 return true 18720 } 18721 // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 18722 // cond: 18723 // result: (SignExt16to64 (Trunc64to16 <types.Int16> x)) 18724 for { 18725 v_0 := v.Args[0] 18726 if v_0.Op != OpLsh64x64 { 18727 break 18728 } 18729 x := v_0.Args[0] 18730 v_0_1 := v_0.Args[1] 18731 if v_0_1.Op != OpConst64 { 18732 break 18733 } 18734 if v_0_1.AuxInt != 48 { 18735 break 18736 } 18737 v_1 := v.Args[1] 18738 if v_1.Op != OpConst64 { 18739 break 18740 } 18741 if v_1.AuxInt != 48 { 18742 break 18743 } 18744 v.reset(OpSignExt16to64) 18745 v0 := b.NewValue0(v.Pos, OpTrunc64to16, types.Int16) 18746 v0.AddArg(x) 18747 v.AddArg(v0) 18748 return true 18749 } 18750 // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 18751 // cond: 18752 // result: (SignExt32to64 (Trunc64to32 <types.Int32> x)) 18753 for { 18754 v_0 := v.Args[0] 18755 if v_0.Op != OpLsh64x64 { 18756 break 18757 } 18758 x := v_0.Args[0] 18759 v_0_1 := v_0.Args[1] 18760 if v_0_1.Op != OpConst64 { 18761 break 18762 } 18763 if v_0_1.AuxInt != 32 { 18764 break 18765 } 18766 v_1 := v.Args[1] 18767 if v_1.Op != OpConst64 { 18768 break 18769 } 18770 if v_1.AuxInt != 32 { 18771 break 18772 } 18773 v.reset(OpSignExt32to64) 18774 v0 := b.NewValue0(v.Pos, OpTrunc64to32, types.Int32) 18775 v0.AddArg(x) 18776 v.AddArg(v0) 18777 return true 18778 } 18779 return false 18780 } 18781 func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { 18782 b := v.Block 18783 _ = b 18784 // match: (Rsh64x8 <t> x (Const8 [c])) 18785 // cond: 18786 // result: (Rsh64x64 x (Const64 <t> [int64(uint8(c))])) 18787 for { 18788 t := v.Type 18789 x := v.Args[0] 18790 v_1 := v.Args[1] 18791 if v_1.Op != OpConst8 { 18792 break 18793 } 18794 c := v_1.AuxInt 18795 v.reset(OpRsh64x64) 18796 v.AddArg(x) 18797 v0 := b.NewValue0(v.Pos, OpConst64, t) 18798 v0.AuxInt = int64(uint8(c)) 18799 v.AddArg(v0) 18800 return true 18801 } 18802 // match: (Rsh64x8 (Const64 [0]) _) 18803 // cond: 18804 // result: (Const64 [0]) 18805 for { 18806 v_0 := v.Args[0] 18807 if v_0.Op != OpConst64 { 18808 break 18809 } 18810 if v_0.AuxInt != 0 { 18811 break 18812 } 18813 v.reset(OpConst64) 18814 v.AuxInt = 0 18815 return true 18816 } 18817 return false 18818 } 18819 func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { 18820 b := v.Block 18821 _ = b 18822 // match: (Rsh8Ux16 <t> x (Const16 [c])) 18823 // cond: 18824 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))])) 18825 for { 18826 t := v.Type 18827 x := v.Args[0] 18828 v_1 := v.Args[1] 18829 if v_1.Op != OpConst16 { 18830 break 18831 } 18832 c := v_1.AuxInt 18833 v.reset(OpRsh8Ux64) 18834 v.AddArg(x) 18835 v0 := b.NewValue0(v.Pos, OpConst64, t) 18836 v0.AuxInt = int64(uint16(c)) 18837 v.AddArg(v0) 18838 return true 18839 } 18840 // match: (Rsh8Ux16 (Const8 [0]) _) 18841 // cond: 18842 // result: (Const8 [0]) 18843 for { 18844 v_0 := v.Args[0] 18845 if v_0.Op != OpConst8 { 18846 break 18847 } 18848 if v_0.AuxInt != 0 { 18849 break 18850 } 18851 v.reset(OpConst8) 18852 v.AuxInt = 0 18853 return true 18854 } 18855 return false 18856 } 18857 func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { 18858 b := v.Block 18859 _ = b 18860 // match: (Rsh8Ux32 <t> x (Const32 [c])) 18861 // cond: 18862 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))])) 18863 for { 18864 t := v.Type 18865 x := v.Args[0] 18866 v_1 := v.Args[1] 18867 if v_1.Op != OpConst32 { 18868 break 18869 } 18870 c := v_1.AuxInt 18871 v.reset(OpRsh8Ux64) 18872 v.AddArg(x) 18873 v0 := b.NewValue0(v.Pos, OpConst64, t) 18874 v0.AuxInt = int64(uint32(c)) 18875 v.AddArg(v0) 18876 return true 18877 } 18878 // match: (Rsh8Ux32 (Const8 [0]) _) 18879 // cond: 18880 // result: (Const8 [0]) 18881 for { 18882 v_0 := v.Args[0] 18883 if v_0.Op != OpConst8 { 18884 break 18885 } 18886 if v_0.AuxInt != 0 { 18887 break 18888 } 18889 v.reset(OpConst8) 18890 v.AuxInt = 0 18891 return true 18892 } 18893 return false 18894 } 18895 func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { 18896 b := v.Block 18897 _ = b 18898 types := &b.Func.Config.Types 18899 _ = types 18900 // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) 18901 // cond: 18902 // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) 18903 for { 18904 v_0 := v.Args[0] 18905 if v_0.Op != OpConst8 { 18906 break 18907 } 18908 c := v_0.AuxInt 18909 v_1 := v.Args[1] 18910 if v_1.Op != OpConst64 { 18911 break 18912 } 18913 d := v_1.AuxInt 18914 v.reset(OpConst8) 18915 v.AuxInt = int64(int8(uint8(c) >> uint64(d))) 18916 return true 18917 } 18918 // match: (Rsh8Ux64 x (Const64 [0])) 18919 // cond: 18920 // result: x 18921 for { 18922 x := v.Args[0] 18923 v_1 := v.Args[1] 18924 if v_1.Op != OpConst64 { 18925 break 18926 } 18927 if v_1.AuxInt != 0 { 18928 break 18929 } 18930 v.reset(OpCopy) 18931 v.Type = x.Type 18932 v.AddArg(x) 18933 return true 18934 } 18935 // match: (Rsh8Ux64 (Const8 [0]) _) 18936 // cond: 18937 // result: (Const8 [0]) 18938 for { 18939 v_0 := v.Args[0] 18940 if v_0.Op != OpConst8 { 18941 break 18942 } 18943 if v_0.AuxInt != 0 { 18944 break 18945 } 18946 v.reset(OpConst8) 18947 v.AuxInt = 0 18948 return true 18949 } 18950 // match: (Rsh8Ux64 _ (Const64 [c])) 18951 // cond: uint64(c) >= 8 18952 // result: (Const8 [0]) 18953 for { 18954 v_1 := v.Args[1] 18955 if v_1.Op != OpConst64 { 18956 break 18957 } 18958 c := v_1.AuxInt 18959 if !(uint64(c) >= 8) { 18960 break 18961 } 18962 v.reset(OpConst8) 18963 v.AuxInt = 0 18964 return true 18965 } 18966 // match: (Rsh8Ux64 <t> (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) 18967 // cond: !uaddOvf(c,d) 18968 // result: (Rsh8Ux64 x (Const64 <t> [c+d])) 18969 for { 18970 t := v.Type 18971 v_0 := v.Args[0] 18972 if v_0.Op != OpRsh8Ux64 { 18973 break 18974 } 18975 x := v_0.Args[0] 18976 v_0_1 := v_0.Args[1] 18977 if v_0_1.Op != OpConst64 { 18978 break 18979 } 18980 c := v_0_1.AuxInt 18981 v_1 := v.Args[1] 18982 if v_1.Op != OpConst64 { 18983 break 18984 } 18985 d := v_1.AuxInt 18986 if !(!uaddOvf(c, d)) { 18987 break 18988 } 18989 v.reset(OpRsh8Ux64) 18990 v.AddArg(x) 18991 v0 := b.NewValue0(v.Pos, OpConst64, t) 18992 v0.AuxInt = c + d 18993 v.AddArg(v0) 18994 return true 18995 } 18996 // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 18997 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 18998 // result: (Rsh8Ux64 x (Const64 <types.UInt64> [c1-c2+c3])) 18999 for { 19000 v_0 := v.Args[0] 19001 if v_0.Op != OpLsh8x64 { 19002 break 19003 } 19004 v_0_0 := v_0.Args[0] 19005 if v_0_0.Op != OpRsh8Ux64 { 19006 break 19007 } 19008 x := v_0_0.Args[0] 19009 v_0_0_1 := v_0_0.Args[1] 19010 if v_0_0_1.Op != OpConst64 { 19011 break 19012 } 19013 c1 := v_0_0_1.AuxInt 19014 v_0_1 := v_0.Args[1] 19015 if v_0_1.Op != OpConst64 { 19016 break 19017 } 19018 c2 := v_0_1.AuxInt 19019 v_1 := v.Args[1] 19020 if v_1.Op != OpConst64 { 19021 break 19022 } 19023 c3 := v_1.AuxInt 19024 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 19025 break 19026 } 19027 v.reset(OpRsh8Ux64) 19028 v.AddArg(x) 19029 v0 := b.NewValue0(v.Pos, OpConst64, types.UInt64) 19030 v0.AuxInt = c1 - c2 + c3 19031 v.AddArg(v0) 19032 return true 19033 } 19034 return false 19035 } 19036 func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { 19037 b := v.Block 19038 _ = b 19039 // match: (Rsh8Ux8 <t> x (Const8 [c])) 19040 // cond: 19041 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))])) 19042 for { 19043 t := v.Type 19044 x := v.Args[0] 19045 v_1 := v.Args[1] 19046 if v_1.Op != OpConst8 { 19047 break 19048 } 19049 c := v_1.AuxInt 19050 v.reset(OpRsh8Ux64) 19051 v.AddArg(x) 19052 v0 := b.NewValue0(v.Pos, OpConst64, t) 19053 v0.AuxInt = int64(uint8(c)) 19054 v.AddArg(v0) 19055 return true 19056 } 19057 // match: (Rsh8Ux8 (Const8 [0]) _) 19058 // cond: 19059 // result: (Const8 [0]) 19060 for { 19061 v_0 := v.Args[0] 19062 if v_0.Op != OpConst8 { 19063 break 19064 } 19065 if v_0.AuxInt != 0 { 19066 break 19067 } 19068 v.reset(OpConst8) 19069 v.AuxInt = 0 19070 return true 19071 } 19072 return false 19073 } 19074 func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { 19075 b := v.Block 19076 _ = b 19077 // match: (Rsh8x16 <t> x (Const16 [c])) 19078 // cond: 19079 // result: (Rsh8x64 x (Const64 <t> [int64(uint16(c))])) 19080 for { 19081 t := v.Type 19082 x := v.Args[0] 19083 v_1 := v.Args[1] 19084 if v_1.Op != OpConst16 { 19085 break 19086 } 19087 c := v_1.AuxInt 19088 v.reset(OpRsh8x64) 19089 v.AddArg(x) 19090 v0 := b.NewValue0(v.Pos, OpConst64, t) 19091 v0.AuxInt = int64(uint16(c)) 19092 v.AddArg(v0) 19093 return true 19094 } 19095 // match: (Rsh8x16 (Const8 [0]) _) 19096 // cond: 19097 // result: (Const8 [0]) 19098 for { 19099 v_0 := v.Args[0] 19100 if v_0.Op != OpConst8 { 19101 break 19102 } 19103 if v_0.AuxInt != 0 { 19104 break 19105 } 19106 v.reset(OpConst8) 19107 v.AuxInt = 0 19108 return true 19109 } 19110 return false 19111 } 19112 func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { 19113 b := v.Block 19114 _ = b 19115 // match: (Rsh8x32 <t> x (Const32 [c])) 19116 // cond: 19117 // result: (Rsh8x64 x (Const64 <t> [int64(uint32(c))])) 19118 for { 19119 t := v.Type 19120 x := v.Args[0] 19121 v_1 := v.Args[1] 19122 if v_1.Op != OpConst32 { 19123 break 19124 } 19125 c := v_1.AuxInt 19126 v.reset(OpRsh8x64) 19127 v.AddArg(x) 19128 v0 := b.NewValue0(v.Pos, OpConst64, t) 19129 v0.AuxInt = int64(uint32(c)) 19130 v.AddArg(v0) 19131 return true 19132 } 19133 // match: (Rsh8x32 (Const8 [0]) _) 19134 // cond: 19135 // result: (Const8 [0]) 19136 for { 19137 v_0 := v.Args[0] 19138 if v_0.Op != OpConst8 { 19139 break 19140 } 19141 if v_0.AuxInt != 0 { 19142 break 19143 } 19144 v.reset(OpConst8) 19145 v.AuxInt = 0 19146 return true 19147 } 19148 return false 19149 } 19150 func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { 19151 b := v.Block 19152 _ = b 19153 // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) 19154 // cond: 19155 // result: (Const8 [int64(int8(c) >> uint64(d))]) 19156 for { 19157 v_0 := v.Args[0] 19158 if v_0.Op != OpConst8 { 19159 break 19160 } 19161 c := v_0.AuxInt 19162 v_1 := v.Args[1] 19163 if v_1.Op != OpConst64 { 19164 break 19165 } 19166 d := v_1.AuxInt 19167 v.reset(OpConst8) 19168 v.AuxInt = int64(int8(c) >> uint64(d)) 19169 return true 19170 } 19171 // match: (Rsh8x64 x (Const64 [0])) 19172 // cond: 19173 // result: x 19174 for { 19175 x := v.Args[0] 19176 v_1 := v.Args[1] 19177 if v_1.Op != OpConst64 { 19178 break 19179 } 19180 if v_1.AuxInt != 0 { 19181 break 19182 } 19183 v.reset(OpCopy) 19184 v.Type = x.Type 19185 v.AddArg(x) 19186 return true 19187 } 19188 // match: (Rsh8x64 (Const8 [0]) _) 19189 // cond: 19190 // result: (Const8 [0]) 19191 for { 19192 v_0 := v.Args[0] 19193 if v_0.Op != OpConst8 { 19194 break 19195 } 19196 if v_0.AuxInt != 0 { 19197 break 19198 } 19199 v.reset(OpConst8) 19200 v.AuxInt = 0 19201 return true 19202 } 19203 // match: (Rsh8x64 <t> (Rsh8x64 x (Const64 [c])) (Const64 [d])) 19204 // cond: !uaddOvf(c,d) 19205 // result: (Rsh8x64 x (Const64 <t> [c+d])) 19206 for { 19207 t := v.Type 19208 v_0 := v.Args[0] 19209 if v_0.Op != OpRsh8x64 { 19210 break 19211 } 19212 x := v_0.Args[0] 19213 v_0_1 := v_0.Args[1] 19214 if v_0_1.Op != OpConst64 { 19215 break 19216 } 19217 c := v_0_1.AuxInt 19218 v_1 := v.Args[1] 19219 if v_1.Op != OpConst64 { 19220 break 19221 } 19222 d := v_1.AuxInt 19223 if !(!uaddOvf(c, d)) { 19224 break 19225 } 19226 v.reset(OpRsh8x64) 19227 v.AddArg(x) 19228 v0 := b.NewValue0(v.Pos, OpConst64, t) 19229 v0.AuxInt = c + d 19230 v.AddArg(v0) 19231 return true 19232 } 19233 return false 19234 } 19235 func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { 19236 b := v.Block 19237 _ = b 19238 // match: (Rsh8x8 <t> x (Const8 [c])) 19239 // cond: 19240 // result: (Rsh8x64 x (Const64 <t> [int64(uint8(c))])) 19241 for { 19242 t := v.Type 19243 x := v.Args[0] 19244 v_1 := v.Args[1] 19245 if v_1.Op != OpConst8 { 19246 break 19247 } 19248 c := v_1.AuxInt 19249 v.reset(OpRsh8x64) 19250 v.AddArg(x) 19251 v0 := b.NewValue0(v.Pos, OpConst64, t) 19252 v0.AuxInt = int64(uint8(c)) 19253 v.AddArg(v0) 19254 return true 19255 } 19256 // match: (Rsh8x8 (Const8 [0]) _) 19257 // cond: 19258 // result: (Const8 [0]) 19259 for { 19260 v_0 := v.Args[0] 19261 if v_0.Op != OpConst8 { 19262 break 19263 } 19264 if v_0.AuxInt != 0 { 19265 break 19266 } 19267 v.reset(OpConst8) 19268 v.AuxInt = 0 19269 return true 19270 } 19271 return false 19272 } 19273 func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { 19274 // match: (SignExt16to32 (Const16 [c])) 19275 // cond: 19276 // result: (Const32 [int64( int16(c))]) 19277 for { 19278 v_0 := v.Args[0] 19279 if v_0.Op != OpConst16 { 19280 break 19281 } 19282 c := v_0.AuxInt 19283 v.reset(OpConst32) 19284 v.AuxInt = int64(int16(c)) 19285 return true 19286 } 19287 // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) 19288 // cond: s >= 16 19289 // result: x 19290 for { 19291 v_0 := v.Args[0] 19292 if v_0.Op != OpTrunc32to16 { 19293 break 19294 } 19295 x := v_0.Args[0] 19296 if x.Op != OpRsh32x64 { 19297 break 19298 } 19299 x_1 := x.Args[1] 19300 if x_1.Op != OpConst64 { 19301 break 19302 } 19303 s := x_1.AuxInt 19304 if !(s >= 16) { 19305 break 19306 } 19307 v.reset(OpCopy) 19308 v.Type = x.Type 19309 v.AddArg(x) 19310 return true 19311 } 19312 return false 19313 } 19314 func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { 19315 // match: (SignExt16to64 (Const16 [c])) 19316 // cond: 19317 // result: (Const64 [int64( int16(c))]) 19318 for { 19319 v_0 := v.Args[0] 19320 if v_0.Op != OpConst16 { 19321 break 19322 } 19323 c := v_0.AuxInt 19324 v.reset(OpConst64) 19325 v.AuxInt = int64(int16(c)) 19326 return true 19327 } 19328 // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) 19329 // cond: s >= 48 19330 // result: x 19331 for { 19332 v_0 := v.Args[0] 19333 if v_0.Op != OpTrunc64to16 { 19334 break 19335 } 19336 x := v_0.Args[0] 19337 if x.Op != OpRsh64x64 { 19338 break 19339 } 19340 x_1 := x.Args[1] 19341 if x_1.Op != OpConst64 { 19342 break 19343 } 19344 s := x_1.AuxInt 19345 if !(s >= 48) { 19346 break 19347 } 19348 v.reset(OpCopy) 19349 v.Type = x.Type 19350 v.AddArg(x) 19351 return true 19352 } 19353 return false 19354 } 19355 func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { 19356 // match: (SignExt32to64 (Const32 [c])) 19357 // cond: 19358 // result: (Const64 [int64( int32(c))]) 19359 for { 19360 v_0 := v.Args[0] 19361 if v_0.Op != OpConst32 { 19362 break 19363 } 19364 c := v_0.AuxInt 19365 v.reset(OpConst64) 19366 v.AuxInt = int64(int32(c)) 19367 return true 19368 } 19369 // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) 19370 // cond: s >= 32 19371 // result: x 19372 for { 19373 v_0 := v.Args[0] 19374 if v_0.Op != OpTrunc64to32 { 19375 break 19376 } 19377 x := v_0.Args[0] 19378 if x.Op != OpRsh64x64 { 19379 break 19380 } 19381 x_1 := x.Args[1] 19382 if x_1.Op != OpConst64 { 19383 break 19384 } 19385 s := x_1.AuxInt 19386 if !(s >= 32) { 19387 break 19388 } 19389 v.reset(OpCopy) 19390 v.Type = x.Type 19391 v.AddArg(x) 19392 return true 19393 } 19394 return false 19395 } 19396 func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { 19397 // match: (SignExt8to16 (Const8 [c])) 19398 // cond: 19399 // result: (Const16 [int64( int8(c))]) 19400 for { 19401 v_0 := v.Args[0] 19402 if v_0.Op != OpConst8 { 19403 break 19404 } 19405 c := v_0.AuxInt 19406 v.reset(OpConst16) 19407 v.AuxInt = int64(int8(c)) 19408 return true 19409 } 19410 // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) 19411 // cond: s >= 8 19412 // result: x 19413 for { 19414 v_0 := v.Args[0] 19415 if v_0.Op != OpTrunc16to8 { 19416 break 19417 } 19418 x := v_0.Args[0] 19419 if x.Op != OpRsh16x64 { 19420 break 19421 } 19422 x_1 := x.Args[1] 19423 if x_1.Op != OpConst64 { 19424 break 19425 } 19426 s := x_1.AuxInt 19427 if !(s >= 8) { 19428 break 19429 } 19430 v.reset(OpCopy) 19431 v.Type = x.Type 19432 v.AddArg(x) 19433 return true 19434 } 19435 return false 19436 } 19437 func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { 19438 // match: (SignExt8to32 (Const8 [c])) 19439 // cond: 19440 // result: (Const32 [int64( int8(c))]) 19441 for { 19442 v_0 := v.Args[0] 19443 if v_0.Op != OpConst8 { 19444 break 19445 } 19446 c := v_0.AuxInt 19447 v.reset(OpConst32) 19448 v.AuxInt = int64(int8(c)) 19449 return true 19450 } 19451 // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) 19452 // cond: s >= 24 19453 // result: x 19454 for { 19455 v_0 := v.Args[0] 19456 if v_0.Op != OpTrunc32to8 { 19457 break 19458 } 19459 x := v_0.Args[0] 19460 if x.Op != OpRsh32x64 { 19461 break 19462 } 19463 x_1 := x.Args[1] 19464 if x_1.Op != OpConst64 { 19465 break 19466 } 19467 s := x_1.AuxInt 19468 if !(s >= 24) { 19469 break 19470 } 19471 v.reset(OpCopy) 19472 v.Type = x.Type 19473 v.AddArg(x) 19474 return true 19475 } 19476 return false 19477 } 19478 func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { 19479 // match: (SignExt8to64 (Const8 [c])) 19480 // cond: 19481 // result: (Const64 [int64( int8(c))]) 19482 for { 19483 v_0 := v.Args[0] 19484 if v_0.Op != OpConst8 { 19485 break 19486 } 19487 c := v_0.AuxInt 19488 v.reset(OpConst64) 19489 v.AuxInt = int64(int8(c)) 19490 return true 19491 } 19492 // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) 19493 // cond: s >= 56 19494 // result: x 19495 for { 19496 v_0 := v.Args[0] 19497 if v_0.Op != OpTrunc64to8 { 19498 break 19499 } 19500 x := v_0.Args[0] 19501 if x.Op != OpRsh64x64 { 19502 break 19503 } 19504 x_1 := x.Args[1] 19505 if x_1.Op != OpConst64 { 19506 break 19507 } 19508 s := x_1.AuxInt 19509 if !(s >= 56) { 19510 break 19511 } 19512 v.reset(OpCopy) 19513 v.Type = x.Type 19514 v.AddArg(x) 19515 return true 19516 } 19517 return false 19518 } 19519 func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { 19520 // match: (SliceCap (SliceMake _ _ (Const64 <t> [c]))) 19521 // cond: 19522 // result: (Const64 <t> [c]) 19523 for { 19524 v_0 := v.Args[0] 19525 if v_0.Op != OpSliceMake { 19526 break 19527 } 19528 v_0_2 := v_0.Args[2] 19529 if v_0_2.Op != OpConst64 { 19530 break 19531 } 19532 t := v_0_2.Type 19533 c := v_0_2.AuxInt 19534 v.reset(OpConst64) 19535 v.Type = t 19536 v.AuxInt = c 19537 return true 19538 } 19539 // match: (SliceCap (SliceMake _ _ (Const32 <t> [c]))) 19540 // cond: 19541 // result: (Const32 <t> [c]) 19542 for { 19543 v_0 := v.Args[0] 19544 if v_0.Op != OpSliceMake { 19545 break 19546 } 19547 v_0_2 := v_0.Args[2] 19548 if v_0_2.Op != OpConst32 { 19549 break 19550 } 19551 t := v_0_2.Type 19552 c := v_0_2.AuxInt 19553 v.reset(OpConst32) 19554 v.Type = t 19555 v.AuxInt = c 19556 return true 19557 } 19558 // match: (SliceCap (SliceMake _ _ (SliceCap x))) 19559 // cond: 19560 // result: (SliceCap x) 19561 for { 19562 v_0 := v.Args[0] 19563 if v_0.Op != OpSliceMake { 19564 break 19565 } 19566 v_0_2 := v_0.Args[2] 19567 if v_0_2.Op != OpSliceCap { 19568 break 19569 } 19570 x := v_0_2.Args[0] 19571 v.reset(OpSliceCap) 19572 v.AddArg(x) 19573 return true 19574 } 19575 // match: (SliceCap (SliceMake _ _ (SliceLen x))) 19576 // cond: 19577 // result: (SliceLen x) 19578 for { 19579 v_0 := v.Args[0] 19580 if v_0.Op != OpSliceMake { 19581 break 19582 } 19583 v_0_2 := v_0.Args[2] 19584 if v_0_2.Op != OpSliceLen { 19585 break 19586 } 19587 x := v_0_2.Args[0] 19588 v.reset(OpSliceLen) 19589 v.AddArg(x) 19590 return true 19591 } 19592 return false 19593 } 19594 func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { 19595 // match: (SliceLen (SliceMake _ (Const64 <t> [c]) _)) 19596 // cond: 19597 // result: (Const64 <t> [c]) 19598 for { 19599 v_0 := v.Args[0] 19600 if v_0.Op != OpSliceMake { 19601 break 19602 } 19603 v_0_1 := v_0.Args[1] 19604 if v_0_1.Op != OpConst64 { 19605 break 19606 } 19607 t := v_0_1.Type 19608 c := v_0_1.AuxInt 19609 v.reset(OpConst64) 19610 v.Type = t 19611 v.AuxInt = c 19612 return true 19613 } 19614 // match: (SliceLen (SliceMake _ (Const32 <t> [c]) _)) 19615 // cond: 19616 // result: (Const32 <t> [c]) 19617 for { 19618 v_0 := v.Args[0] 19619 if v_0.Op != OpSliceMake { 19620 break 19621 } 19622 v_0_1 := v_0.Args[1] 19623 if v_0_1.Op != OpConst32 { 19624 break 19625 } 19626 t := v_0_1.Type 19627 c := v_0_1.AuxInt 19628 v.reset(OpConst32) 19629 v.Type = t 19630 v.AuxInt = c 19631 return true 19632 } 19633 // match: (SliceLen (SliceMake _ (SliceLen x) _)) 19634 // cond: 19635 // result: (SliceLen x) 19636 for { 19637 v_0 := v.Args[0] 19638 if v_0.Op != OpSliceMake { 19639 break 19640 } 19641 v_0_1 := v_0.Args[1] 19642 if v_0_1.Op != OpSliceLen { 19643 break 19644 } 19645 x := v_0_1.Args[0] 19646 v.reset(OpSliceLen) 19647 v.AddArg(x) 19648 return true 19649 } 19650 return false 19651 } 19652 func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { 19653 // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) 19654 // cond: 19655 // result: (SlicePtr x) 19656 for { 19657 v_0 := v.Args[0] 19658 if v_0.Op != OpSliceMake { 19659 break 19660 } 19661 v_0_0 := v_0.Args[0] 19662 if v_0_0.Op != OpSlicePtr { 19663 break 19664 } 19665 x := v_0_0.Args[0] 19666 v.reset(OpSlicePtr) 19667 v.AddArg(x) 19668 return true 19669 } 19670 return false 19671 } 19672 func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { 19673 // match: (Slicemask (Const32 [x])) 19674 // cond: x > 0 19675 // result: (Const32 [-1]) 19676 for { 19677 v_0 := v.Args[0] 19678 if v_0.Op != OpConst32 { 19679 break 19680 } 19681 x := v_0.AuxInt 19682 if !(x > 0) { 19683 break 19684 } 19685 v.reset(OpConst32) 19686 v.AuxInt = -1 19687 return true 19688 } 19689 // match: (Slicemask (Const32 [0])) 19690 // cond: 19691 // result: (Const32 [0]) 19692 for { 19693 v_0 := v.Args[0] 19694 if v_0.Op != OpConst32 { 19695 break 19696 } 19697 if v_0.AuxInt != 0 { 19698 break 19699 } 19700 v.reset(OpConst32) 19701 v.AuxInt = 0 19702 return true 19703 } 19704 // match: (Slicemask (Const64 [x])) 19705 // cond: x > 0 19706 // result: (Const64 [-1]) 19707 for { 19708 v_0 := v.Args[0] 19709 if v_0.Op != OpConst64 { 19710 break 19711 } 19712 x := v_0.AuxInt 19713 if !(x > 0) { 19714 break 19715 } 19716 v.reset(OpConst64) 19717 v.AuxInt = -1 19718 return true 19719 } 19720 // match: (Slicemask (Const64 [0])) 19721 // cond: 19722 // result: (Const64 [0]) 19723 for { 19724 v_0 := v.Args[0] 19725 if v_0.Op != OpConst64 { 19726 break 19727 } 19728 if v_0.AuxInt != 0 { 19729 break 19730 } 19731 v.reset(OpConst64) 19732 v.AuxInt = 0 19733 return true 19734 } 19735 return false 19736 } 19737 func rewriteValuegeneric_OpSqrt_0(v *Value) bool { 19738 // match: (Sqrt (Const64F [c])) 19739 // cond: 19740 // result: (Const64F [f2i(math.Sqrt(i2f(c)))]) 19741 for { 19742 v_0 := v.Args[0] 19743 if v_0.Op != OpConst64F { 19744 break 19745 } 19746 c := v_0.AuxInt 19747 v.reset(OpConst64F) 19748 v.AuxInt = f2i(math.Sqrt(i2f(c))) 19749 return true 19750 } 19751 return false 19752 } 19753 func rewriteValuegeneric_OpStore_0(v *Value) bool { 19754 b := v.Block 19755 _ = b 19756 config := b.Func.Config 19757 _ = config 19758 fe := b.Func.fe 19759 _ = fe 19760 // match: (Store _ (StructMake0) mem) 19761 // cond: 19762 // result: mem 19763 for { 19764 v_1 := v.Args[1] 19765 if v_1.Op != OpStructMake0 { 19766 break 19767 } 19768 mem := v.Args[2] 19769 v.reset(OpCopy) 19770 v.Type = mem.Type 19771 v.AddArg(mem) 19772 return true 19773 } 19774 // match: (Store dst (StructMake1 <t> f0) mem) 19775 // cond: 19776 // result: (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem) 19777 for { 19778 dst := v.Args[0] 19779 v_1 := v.Args[1] 19780 if v_1.Op != OpStructMake1 { 19781 break 19782 } 19783 t := v_1.Type 19784 f0 := v_1.Args[0] 19785 mem := v.Args[2] 19786 v.reset(OpStore) 19787 v.Aux = t.FieldType(0) 19788 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 19789 v0.AuxInt = 0 19790 v0.AddArg(dst) 19791 v.AddArg(v0) 19792 v.AddArg(f0) 19793 v.AddArg(mem) 19794 return true 19795 } 19796 // match: (Store dst (StructMake2 <t> f0 f1) mem) 19797 // cond: 19798 // result: (Store {t.FieldType(1)} (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem)) 19799 for { 19800 dst := v.Args[0] 19801 v_1 := v.Args[1] 19802 if v_1.Op != OpStructMake2 { 19803 break 19804 } 19805 t := v_1.Type 19806 f0 := v_1.Args[0] 19807 f1 := v_1.Args[1] 19808 mem := v.Args[2] 19809 v.reset(OpStore) 19810 v.Aux = t.FieldType(1) 19811 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 19812 v0.AuxInt = t.FieldOff(1) 19813 v0.AddArg(dst) 19814 v.AddArg(v0) 19815 v.AddArg(f1) 19816 v1 := b.NewValue0(v.Pos, OpStore, TypeMem) 19817 v1.Aux = t.FieldType(0) 19818 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 19819 v2.AuxInt = 0 19820 v2.AddArg(dst) 19821 v1.AddArg(v2) 19822 v1.AddArg(f0) 19823 v1.AddArg(mem) 19824 v.AddArg(v1) 19825 return true 19826 } 19827 // match: (Store dst (StructMake3 <t> f0 f1 f2) mem) 19828 // cond: 19829 // result: (Store {t.FieldType(2)} (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem))) 19830 for { 19831 dst := v.Args[0] 19832 v_1 := v.Args[1] 19833 if v_1.Op != OpStructMake3 { 19834 break 19835 } 19836 t := v_1.Type 19837 f0 := v_1.Args[0] 19838 f1 := v_1.Args[1] 19839 f2 := v_1.Args[2] 19840 mem := v.Args[2] 19841 v.reset(OpStore) 19842 v.Aux = t.FieldType(2) 19843 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 19844 v0.AuxInt = t.FieldOff(2) 19845 v0.AddArg(dst) 19846 v.AddArg(v0) 19847 v.AddArg(f2) 19848 v1 := b.NewValue0(v.Pos, OpStore, TypeMem) 19849 v1.Aux = t.FieldType(1) 19850 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 19851 v2.AuxInt = t.FieldOff(1) 19852 v2.AddArg(dst) 19853 v1.AddArg(v2) 19854 v1.AddArg(f1) 19855 v3 := b.NewValue0(v.Pos, OpStore, TypeMem) 19856 v3.Aux = t.FieldType(0) 19857 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 19858 v4.AuxInt = 0 19859 v4.AddArg(dst) 19860 v3.AddArg(v4) 19861 v3.AddArg(f0) 19862 v3.AddArg(mem) 19863 v1.AddArg(v3) 19864 v.AddArg(v1) 19865 return true 19866 } 19867 // match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem) 19868 // cond: 19869 // result: (Store {t.FieldType(3)} (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] dst) f3 (Store {t.FieldType(2)} (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem)))) 19870 for { 19871 dst := v.Args[0] 19872 v_1 := v.Args[1] 19873 if v_1.Op != OpStructMake4 { 19874 break 19875 } 19876 t := v_1.Type 19877 f0 := v_1.Args[0] 19878 f1 := v_1.Args[1] 19879 f2 := v_1.Args[2] 19880 f3 := v_1.Args[3] 19881 mem := v.Args[2] 19882 v.reset(OpStore) 19883 v.Aux = t.FieldType(3) 19884 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 19885 v0.AuxInt = t.FieldOff(3) 19886 v0.AddArg(dst) 19887 v.AddArg(v0) 19888 v.AddArg(f3) 19889 v1 := b.NewValue0(v.Pos, OpStore, TypeMem) 19890 v1.Aux = t.FieldType(2) 19891 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 19892 v2.AuxInt = t.FieldOff(2) 19893 v2.AddArg(dst) 19894 v1.AddArg(v2) 19895 v1.AddArg(f2) 19896 v3 := b.NewValue0(v.Pos, OpStore, TypeMem) 19897 v3.Aux = t.FieldType(1) 19898 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 19899 v4.AuxInt = t.FieldOff(1) 19900 v4.AddArg(dst) 19901 v3.AddArg(v4) 19902 v3.AddArg(f1) 19903 v5 := b.NewValue0(v.Pos, OpStore, TypeMem) 19904 v5.Aux = t.FieldType(0) 19905 v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 19906 v6.AuxInt = 0 19907 v6.AddArg(dst) 19908 v5.AddArg(v6) 19909 v5.AddArg(f0) 19910 v5.AddArg(mem) 19911 v3.AddArg(v5) 19912 v1.AddArg(v3) 19913 v.AddArg(v1) 19914 return true 19915 } 19916 // match: (Store {t} dst (Load src mem) mem) 19917 // cond: !fe.CanSSA(t.(Type)) 19918 // result: (Move {t} [t.(Type).Size()] dst src mem) 19919 for { 19920 t := v.Aux 19921 dst := v.Args[0] 19922 v_1 := v.Args[1] 19923 if v_1.Op != OpLoad { 19924 break 19925 } 19926 src := v_1.Args[0] 19927 mem := v_1.Args[1] 19928 if mem != v.Args[2] { 19929 break 19930 } 19931 if !(!fe.CanSSA(t.(Type))) { 19932 break 19933 } 19934 v.reset(OpMove) 19935 v.AuxInt = t.(Type).Size() 19936 v.Aux = t 19937 v.AddArg(dst) 19938 v.AddArg(src) 19939 v.AddArg(mem) 19940 return true 19941 } 19942 // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) 19943 // cond: !fe.CanSSA(t.(Type)) 19944 // result: (Move {t} [t.(Type).Size()] dst src (VarDef {x} mem)) 19945 for { 19946 t := v.Aux 19947 dst := v.Args[0] 19948 v_1 := v.Args[1] 19949 if v_1.Op != OpLoad { 19950 break 19951 } 19952 src := v_1.Args[0] 19953 mem := v_1.Args[1] 19954 v_2 := v.Args[2] 19955 if v_2.Op != OpVarDef { 19956 break 19957 } 19958 x := v_2.Aux 19959 if mem != v_2.Args[0] { 19960 break 19961 } 19962 if !(!fe.CanSSA(t.(Type))) { 19963 break 19964 } 19965 v.reset(OpMove) 19966 v.AuxInt = t.(Type).Size() 19967 v.Aux = t 19968 v.AddArg(dst) 19969 v.AddArg(src) 19970 v0 := b.NewValue0(v.Pos, OpVarDef, TypeMem) 19971 v0.Aux = x 19972 v0.AddArg(mem) 19973 v.AddArg(v0) 19974 return true 19975 } 19976 // match: (Store _ (ArrayMake0) mem) 19977 // cond: 19978 // result: mem 19979 for { 19980 v_1 := v.Args[1] 19981 if v_1.Op != OpArrayMake0 { 19982 break 19983 } 19984 mem := v.Args[2] 19985 v.reset(OpCopy) 19986 v.Type = mem.Type 19987 v.AddArg(mem) 19988 return true 19989 } 19990 // match: (Store dst (ArrayMake1 e) mem) 19991 // cond: 19992 // result: (Store {e.Type} dst e mem) 19993 for { 19994 dst := v.Args[0] 19995 v_1 := v.Args[1] 19996 if v_1.Op != OpArrayMake1 { 19997 break 19998 } 19999 e := v_1.Args[0] 20000 mem := v.Args[2] 20001 v.reset(OpStore) 20002 v.Aux = e.Type 20003 v.AddArg(dst) 20004 v.AddArg(e) 20005 v.AddArg(mem) 20006 return true 20007 } 20008 // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) 20009 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 20010 // result: mem 20011 for { 20012 v_0 := v.Args[0] 20013 if v_0.Op != OpLoad { 20014 break 20015 } 20016 v_0_0 := v_0.Args[0] 20017 if v_0_0.Op != OpOffPtr { 20018 break 20019 } 20020 c := v_0_0.AuxInt 20021 v_0_0_0 := v_0_0.Args[0] 20022 if v_0_0_0.Op != OpSP { 20023 break 20024 } 20025 mem := v_0.Args[1] 20026 x := v.Args[1] 20027 if mem != v.Args[2] { 20028 break 20029 } 20030 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 20031 break 20032 } 20033 v.reset(OpCopy) 20034 v.Type = mem.Type 20035 v.AddArg(mem) 20036 return true 20037 } 20038 return false 20039 } 20040 func rewriteValuegeneric_OpStore_10(v *Value) bool { 20041 b := v.Block 20042 _ = b 20043 config := b.Func.Config 20044 _ = config 20045 // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) 20046 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 20047 // result: mem 20048 for { 20049 v_0 := v.Args[0] 20050 if v_0.Op != OpOffPtr { 20051 break 20052 } 20053 v_0_0 := v_0.Args[0] 20054 if v_0_0.Op != OpLoad { 20055 break 20056 } 20057 v_0_0_0 := v_0_0.Args[0] 20058 if v_0_0_0.Op != OpOffPtr { 20059 break 20060 } 20061 c := v_0_0_0.AuxInt 20062 v_0_0_0_0 := v_0_0_0.Args[0] 20063 if v_0_0_0_0.Op != OpSP { 20064 break 20065 } 20066 mem := v_0_0.Args[1] 20067 x := v.Args[1] 20068 if mem != v.Args[2] { 20069 break 20070 } 20071 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 20072 break 20073 } 20074 v.reset(OpCopy) 20075 v.Type = mem.Type 20076 v.AddArg(mem) 20077 return true 20078 } 20079 return false 20080 } 20081 func rewriteValuegeneric_OpStringLen_0(v *Value) bool { 20082 // match: (StringLen (StringMake _ (Const64 <t> [c]))) 20083 // cond: 20084 // result: (Const64 <t> [c]) 20085 for { 20086 v_0 := v.Args[0] 20087 if v_0.Op != OpStringMake { 20088 break 20089 } 20090 v_0_1 := v_0.Args[1] 20091 if v_0_1.Op != OpConst64 { 20092 break 20093 } 20094 t := v_0_1.Type 20095 c := v_0_1.AuxInt 20096 v.reset(OpConst64) 20097 v.Type = t 20098 v.AuxInt = c 20099 return true 20100 } 20101 return false 20102 } 20103 func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { 20104 // match: (StringPtr (StringMake (Const64 <t> [c]) _)) 20105 // cond: 20106 // result: (Const64 <t> [c]) 20107 for { 20108 v_0 := v.Args[0] 20109 if v_0.Op != OpStringMake { 20110 break 20111 } 20112 v_0_0 := v_0.Args[0] 20113 if v_0_0.Op != OpConst64 { 20114 break 20115 } 20116 t := v_0_0.Type 20117 c := v_0_0.AuxInt 20118 v.reset(OpConst64) 20119 v.Type = t 20120 v.AuxInt = c 20121 return true 20122 } 20123 return false 20124 } 20125 func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { 20126 // match: (StructSelect (StructMake1 x)) 20127 // cond: 20128 // result: x 20129 for { 20130 v_0 := v.Args[0] 20131 if v_0.Op != OpStructMake1 { 20132 break 20133 } 20134 x := v_0.Args[0] 20135 v.reset(OpCopy) 20136 v.Type = x.Type 20137 v.AddArg(x) 20138 return true 20139 } 20140 // match: (StructSelect [0] (StructMake2 x _)) 20141 // cond: 20142 // result: x 20143 for { 20144 if v.AuxInt != 0 { 20145 break 20146 } 20147 v_0 := v.Args[0] 20148 if v_0.Op != OpStructMake2 { 20149 break 20150 } 20151 x := v_0.Args[0] 20152 v.reset(OpCopy) 20153 v.Type = x.Type 20154 v.AddArg(x) 20155 return true 20156 } 20157 // match: (StructSelect [1] (StructMake2 _ x)) 20158 // cond: 20159 // result: x 20160 for { 20161 if v.AuxInt != 1 { 20162 break 20163 } 20164 v_0 := v.Args[0] 20165 if v_0.Op != OpStructMake2 { 20166 break 20167 } 20168 x := v_0.Args[1] 20169 v.reset(OpCopy) 20170 v.Type = x.Type 20171 v.AddArg(x) 20172 return true 20173 } 20174 // match: (StructSelect [0] (StructMake3 x _ _)) 20175 // cond: 20176 // result: x 20177 for { 20178 if v.AuxInt != 0 { 20179 break 20180 } 20181 v_0 := v.Args[0] 20182 if v_0.Op != OpStructMake3 { 20183 break 20184 } 20185 x := v_0.Args[0] 20186 v.reset(OpCopy) 20187 v.Type = x.Type 20188 v.AddArg(x) 20189 return true 20190 } 20191 // match: (StructSelect [1] (StructMake3 _ x _)) 20192 // cond: 20193 // result: x 20194 for { 20195 if v.AuxInt != 1 { 20196 break 20197 } 20198 v_0 := v.Args[0] 20199 if v_0.Op != OpStructMake3 { 20200 break 20201 } 20202 x := v_0.Args[1] 20203 v.reset(OpCopy) 20204 v.Type = x.Type 20205 v.AddArg(x) 20206 return true 20207 } 20208 // match: (StructSelect [2] (StructMake3 _ _ x)) 20209 // cond: 20210 // result: x 20211 for { 20212 if v.AuxInt != 2 { 20213 break 20214 } 20215 v_0 := v.Args[0] 20216 if v_0.Op != OpStructMake3 { 20217 break 20218 } 20219 x := v_0.Args[2] 20220 v.reset(OpCopy) 20221 v.Type = x.Type 20222 v.AddArg(x) 20223 return true 20224 } 20225 // match: (StructSelect [0] (StructMake4 x _ _ _)) 20226 // cond: 20227 // result: x 20228 for { 20229 if v.AuxInt != 0 { 20230 break 20231 } 20232 v_0 := v.Args[0] 20233 if v_0.Op != OpStructMake4 { 20234 break 20235 } 20236 x := v_0.Args[0] 20237 v.reset(OpCopy) 20238 v.Type = x.Type 20239 v.AddArg(x) 20240 return true 20241 } 20242 // match: (StructSelect [1] (StructMake4 _ x _ _)) 20243 // cond: 20244 // result: x 20245 for { 20246 if v.AuxInt != 1 { 20247 break 20248 } 20249 v_0 := v.Args[0] 20250 if v_0.Op != OpStructMake4 { 20251 break 20252 } 20253 x := v_0.Args[1] 20254 v.reset(OpCopy) 20255 v.Type = x.Type 20256 v.AddArg(x) 20257 return true 20258 } 20259 // match: (StructSelect [2] (StructMake4 _ _ x _)) 20260 // cond: 20261 // result: x 20262 for { 20263 if v.AuxInt != 2 { 20264 break 20265 } 20266 v_0 := v.Args[0] 20267 if v_0.Op != OpStructMake4 { 20268 break 20269 } 20270 x := v_0.Args[2] 20271 v.reset(OpCopy) 20272 v.Type = x.Type 20273 v.AddArg(x) 20274 return true 20275 } 20276 // match: (StructSelect [3] (StructMake4 _ _ _ x)) 20277 // cond: 20278 // result: x 20279 for { 20280 if v.AuxInt != 3 { 20281 break 20282 } 20283 v_0 := v.Args[0] 20284 if v_0.Op != OpStructMake4 { 20285 break 20286 } 20287 x := v_0.Args[3] 20288 v.reset(OpCopy) 20289 v.Type = x.Type 20290 v.AddArg(x) 20291 return true 20292 } 20293 return false 20294 } 20295 func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { 20296 b := v.Block 20297 _ = b 20298 fe := b.Func.fe 20299 _ = fe 20300 // match: (StructSelect [i] x:(Load <t> ptr mem)) 20301 // cond: !fe.CanSSA(t) 20302 // result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem) 20303 for { 20304 i := v.AuxInt 20305 x := v.Args[0] 20306 if x.Op != OpLoad { 20307 break 20308 } 20309 t := x.Type 20310 ptr := x.Args[0] 20311 mem := x.Args[1] 20312 if !(!fe.CanSSA(t)) { 20313 break 20314 } 20315 b = x.Block 20316 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 20317 v.reset(OpCopy) 20318 v.AddArg(v0) 20319 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) 20320 v1.AuxInt = t.FieldOff(int(i)) 20321 v1.AddArg(ptr) 20322 v0.AddArg(v1) 20323 v0.AddArg(mem) 20324 return true 20325 } 20326 // match: (StructSelect [0] x:(IData _)) 20327 // cond: 20328 // result: x 20329 for { 20330 if v.AuxInt != 0 { 20331 break 20332 } 20333 x := v.Args[0] 20334 if x.Op != OpIData { 20335 break 20336 } 20337 v.reset(OpCopy) 20338 v.Type = x.Type 20339 v.AddArg(x) 20340 return true 20341 } 20342 return false 20343 } 20344 func rewriteValuegeneric_OpSub16_0(v *Value) bool { 20345 b := v.Block 20346 _ = b 20347 // match: (Sub16 (Const16 [c]) (Const16 [d])) 20348 // cond: 20349 // result: (Const16 [int64(int16(c-d))]) 20350 for { 20351 v_0 := v.Args[0] 20352 if v_0.Op != OpConst16 { 20353 break 20354 } 20355 c := v_0.AuxInt 20356 v_1 := v.Args[1] 20357 if v_1.Op != OpConst16 { 20358 break 20359 } 20360 d := v_1.AuxInt 20361 v.reset(OpConst16) 20362 v.AuxInt = int64(int16(c - d)) 20363 return true 20364 } 20365 // match: (Sub16 x (Const16 <t> [c])) 20366 // cond: x.Op != OpConst16 20367 // result: (Add16 (Const16 <t> [int64(int16(-c))]) x) 20368 for { 20369 x := v.Args[0] 20370 v_1 := v.Args[1] 20371 if v_1.Op != OpConst16 { 20372 break 20373 } 20374 t := v_1.Type 20375 c := v_1.AuxInt 20376 if !(x.Op != OpConst16) { 20377 break 20378 } 20379 v.reset(OpAdd16) 20380 v0 := b.NewValue0(v.Pos, OpConst16, t) 20381 v0.AuxInt = int64(int16(-c)) 20382 v.AddArg(v0) 20383 v.AddArg(x) 20384 return true 20385 } 20386 // match: (Sub16 x x) 20387 // cond: 20388 // result: (Const16 [0]) 20389 for { 20390 x := v.Args[0] 20391 if x != v.Args[1] { 20392 break 20393 } 20394 v.reset(OpConst16) 20395 v.AuxInt = 0 20396 return true 20397 } 20398 // match: (Sub16 (Add16 x y) x) 20399 // cond: 20400 // result: y 20401 for { 20402 v_0 := v.Args[0] 20403 if v_0.Op != OpAdd16 { 20404 break 20405 } 20406 x := v_0.Args[0] 20407 y := v_0.Args[1] 20408 if x != v.Args[1] { 20409 break 20410 } 20411 v.reset(OpCopy) 20412 v.Type = y.Type 20413 v.AddArg(y) 20414 return true 20415 } 20416 // match: (Sub16 (Add16 y x) x) 20417 // cond: 20418 // result: y 20419 for { 20420 v_0 := v.Args[0] 20421 if v_0.Op != OpAdd16 { 20422 break 20423 } 20424 y := v_0.Args[0] 20425 x := v_0.Args[1] 20426 if x != v.Args[1] { 20427 break 20428 } 20429 v.reset(OpCopy) 20430 v.Type = y.Type 20431 v.AddArg(y) 20432 return true 20433 } 20434 // match: (Sub16 (Add16 x y) y) 20435 // cond: 20436 // result: x 20437 for { 20438 v_0 := v.Args[0] 20439 if v_0.Op != OpAdd16 { 20440 break 20441 } 20442 x := v_0.Args[0] 20443 y := v_0.Args[1] 20444 if y != v.Args[1] { 20445 break 20446 } 20447 v.reset(OpCopy) 20448 v.Type = x.Type 20449 v.AddArg(x) 20450 return true 20451 } 20452 // match: (Sub16 (Add16 y x) y) 20453 // cond: 20454 // result: x 20455 for { 20456 v_0 := v.Args[0] 20457 if v_0.Op != OpAdd16 { 20458 break 20459 } 20460 y := v_0.Args[0] 20461 x := v_0.Args[1] 20462 if y != v.Args[1] { 20463 break 20464 } 20465 v.reset(OpCopy) 20466 v.Type = x.Type 20467 v.AddArg(x) 20468 return true 20469 } 20470 // match: (Sub16 x (Sub16 i:(Const16 <t>) z)) 20471 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 20472 // result: (Sub16 (Add16 <t> x z) i) 20473 for { 20474 x := v.Args[0] 20475 v_1 := v.Args[1] 20476 if v_1.Op != OpSub16 { 20477 break 20478 } 20479 i := v_1.Args[0] 20480 if i.Op != OpConst16 { 20481 break 20482 } 20483 t := i.Type 20484 z := v_1.Args[1] 20485 if !(z.Op != OpConst16 && x.Op != OpConst16) { 20486 break 20487 } 20488 v.reset(OpSub16) 20489 v0 := b.NewValue0(v.Pos, OpAdd16, t) 20490 v0.AddArg(x) 20491 v0.AddArg(z) 20492 v.AddArg(v0) 20493 v.AddArg(i) 20494 return true 20495 } 20496 // match: (Sub16 x (Sub16 z i:(Const16 <t>))) 20497 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 20498 // result: (Add16 i (Sub16 <t> x z)) 20499 for { 20500 x := v.Args[0] 20501 v_1 := v.Args[1] 20502 if v_1.Op != OpSub16 { 20503 break 20504 } 20505 z := v_1.Args[0] 20506 i := v_1.Args[1] 20507 if i.Op != OpConst16 { 20508 break 20509 } 20510 t := i.Type 20511 if !(z.Op != OpConst16 && x.Op != OpConst16) { 20512 break 20513 } 20514 v.reset(OpAdd16) 20515 v.AddArg(i) 20516 v0 := b.NewValue0(v.Pos, OpSub16, t) 20517 v0.AddArg(x) 20518 v0.AddArg(z) 20519 v.AddArg(v0) 20520 return true 20521 } 20522 // match: (Sub16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 20523 // cond: 20524 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 20525 for { 20526 v_0 := v.Args[0] 20527 if v_0.Op != OpConst16 { 20528 break 20529 } 20530 t := v_0.Type 20531 c := v_0.AuxInt 20532 v_1 := v.Args[1] 20533 if v_1.Op != OpSub16 { 20534 break 20535 } 20536 x := v_1.Args[0] 20537 v_1_1 := v_1.Args[1] 20538 if v_1_1.Op != OpConst16 { 20539 break 20540 } 20541 if v_1_1.Type != t { 20542 break 20543 } 20544 d := v_1_1.AuxInt 20545 v.reset(OpSub16) 20546 v0 := b.NewValue0(v.Pos, OpConst16, t) 20547 v0.AuxInt = int64(int16(c + d)) 20548 v.AddArg(v0) 20549 v.AddArg(x) 20550 return true 20551 } 20552 return false 20553 } 20554 func rewriteValuegeneric_OpSub16_10(v *Value) bool { 20555 b := v.Block 20556 _ = b 20557 // match: (Sub16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 20558 // cond: 20559 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 20560 for { 20561 v_0 := v.Args[0] 20562 if v_0.Op != OpConst16 { 20563 break 20564 } 20565 t := v_0.Type 20566 c := v_0.AuxInt 20567 v_1 := v.Args[1] 20568 if v_1.Op != OpSub16 { 20569 break 20570 } 20571 v_1_0 := v_1.Args[0] 20572 if v_1_0.Op != OpConst16 { 20573 break 20574 } 20575 if v_1_0.Type != t { 20576 break 20577 } 20578 d := v_1_0.AuxInt 20579 x := v_1.Args[1] 20580 v.reset(OpAdd16) 20581 v0 := b.NewValue0(v.Pos, OpConst16, t) 20582 v0.AuxInt = int64(int16(c - d)) 20583 v.AddArg(v0) 20584 v.AddArg(x) 20585 return true 20586 } 20587 return false 20588 } 20589 func rewriteValuegeneric_OpSub32_0(v *Value) bool { 20590 b := v.Block 20591 _ = b 20592 // match: (Sub32 (Const32 [c]) (Const32 [d])) 20593 // cond: 20594 // result: (Const32 [int64(int32(c-d))]) 20595 for { 20596 v_0 := v.Args[0] 20597 if v_0.Op != OpConst32 { 20598 break 20599 } 20600 c := v_0.AuxInt 20601 v_1 := v.Args[1] 20602 if v_1.Op != OpConst32 { 20603 break 20604 } 20605 d := v_1.AuxInt 20606 v.reset(OpConst32) 20607 v.AuxInt = int64(int32(c - d)) 20608 return true 20609 } 20610 // match: (Sub32 x (Const32 <t> [c])) 20611 // cond: x.Op != OpConst32 20612 // result: (Add32 (Const32 <t> [int64(int32(-c))]) x) 20613 for { 20614 x := v.Args[0] 20615 v_1 := v.Args[1] 20616 if v_1.Op != OpConst32 { 20617 break 20618 } 20619 t := v_1.Type 20620 c := v_1.AuxInt 20621 if !(x.Op != OpConst32) { 20622 break 20623 } 20624 v.reset(OpAdd32) 20625 v0 := b.NewValue0(v.Pos, OpConst32, t) 20626 v0.AuxInt = int64(int32(-c)) 20627 v.AddArg(v0) 20628 v.AddArg(x) 20629 return true 20630 } 20631 // match: (Sub32 x x) 20632 // cond: 20633 // result: (Const32 [0]) 20634 for { 20635 x := v.Args[0] 20636 if x != v.Args[1] { 20637 break 20638 } 20639 v.reset(OpConst32) 20640 v.AuxInt = 0 20641 return true 20642 } 20643 // match: (Sub32 (Add32 x y) x) 20644 // cond: 20645 // result: y 20646 for { 20647 v_0 := v.Args[0] 20648 if v_0.Op != OpAdd32 { 20649 break 20650 } 20651 x := v_0.Args[0] 20652 y := v_0.Args[1] 20653 if x != v.Args[1] { 20654 break 20655 } 20656 v.reset(OpCopy) 20657 v.Type = y.Type 20658 v.AddArg(y) 20659 return true 20660 } 20661 // match: (Sub32 (Add32 y x) x) 20662 // cond: 20663 // result: y 20664 for { 20665 v_0 := v.Args[0] 20666 if v_0.Op != OpAdd32 { 20667 break 20668 } 20669 y := v_0.Args[0] 20670 x := v_0.Args[1] 20671 if x != v.Args[1] { 20672 break 20673 } 20674 v.reset(OpCopy) 20675 v.Type = y.Type 20676 v.AddArg(y) 20677 return true 20678 } 20679 // match: (Sub32 (Add32 x y) y) 20680 // cond: 20681 // result: x 20682 for { 20683 v_0 := v.Args[0] 20684 if v_0.Op != OpAdd32 { 20685 break 20686 } 20687 x := v_0.Args[0] 20688 y := v_0.Args[1] 20689 if y != v.Args[1] { 20690 break 20691 } 20692 v.reset(OpCopy) 20693 v.Type = x.Type 20694 v.AddArg(x) 20695 return true 20696 } 20697 // match: (Sub32 (Add32 y x) y) 20698 // cond: 20699 // result: x 20700 for { 20701 v_0 := v.Args[0] 20702 if v_0.Op != OpAdd32 { 20703 break 20704 } 20705 y := v_0.Args[0] 20706 x := v_0.Args[1] 20707 if y != v.Args[1] { 20708 break 20709 } 20710 v.reset(OpCopy) 20711 v.Type = x.Type 20712 v.AddArg(x) 20713 return true 20714 } 20715 // match: (Sub32 x (Sub32 i:(Const32 <t>) z)) 20716 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 20717 // result: (Sub32 (Add32 <t> x z) i) 20718 for { 20719 x := v.Args[0] 20720 v_1 := v.Args[1] 20721 if v_1.Op != OpSub32 { 20722 break 20723 } 20724 i := v_1.Args[0] 20725 if i.Op != OpConst32 { 20726 break 20727 } 20728 t := i.Type 20729 z := v_1.Args[1] 20730 if !(z.Op != OpConst32 && x.Op != OpConst32) { 20731 break 20732 } 20733 v.reset(OpSub32) 20734 v0 := b.NewValue0(v.Pos, OpAdd32, t) 20735 v0.AddArg(x) 20736 v0.AddArg(z) 20737 v.AddArg(v0) 20738 v.AddArg(i) 20739 return true 20740 } 20741 // match: (Sub32 x (Sub32 z i:(Const32 <t>))) 20742 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 20743 // result: (Add32 i (Sub32 <t> x z)) 20744 for { 20745 x := v.Args[0] 20746 v_1 := v.Args[1] 20747 if v_1.Op != OpSub32 { 20748 break 20749 } 20750 z := v_1.Args[0] 20751 i := v_1.Args[1] 20752 if i.Op != OpConst32 { 20753 break 20754 } 20755 t := i.Type 20756 if !(z.Op != OpConst32 && x.Op != OpConst32) { 20757 break 20758 } 20759 v.reset(OpAdd32) 20760 v.AddArg(i) 20761 v0 := b.NewValue0(v.Pos, OpSub32, t) 20762 v0.AddArg(x) 20763 v0.AddArg(z) 20764 v.AddArg(v0) 20765 return true 20766 } 20767 // match: (Sub32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 20768 // cond: 20769 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 20770 for { 20771 v_0 := v.Args[0] 20772 if v_0.Op != OpConst32 { 20773 break 20774 } 20775 t := v_0.Type 20776 c := v_0.AuxInt 20777 v_1 := v.Args[1] 20778 if v_1.Op != OpSub32 { 20779 break 20780 } 20781 x := v_1.Args[0] 20782 v_1_1 := v_1.Args[1] 20783 if v_1_1.Op != OpConst32 { 20784 break 20785 } 20786 if v_1_1.Type != t { 20787 break 20788 } 20789 d := v_1_1.AuxInt 20790 v.reset(OpSub32) 20791 v0 := b.NewValue0(v.Pos, OpConst32, t) 20792 v0.AuxInt = int64(int32(c + d)) 20793 v.AddArg(v0) 20794 v.AddArg(x) 20795 return true 20796 } 20797 return false 20798 } 20799 func rewriteValuegeneric_OpSub32_10(v *Value) bool { 20800 b := v.Block 20801 _ = b 20802 // match: (Sub32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 20803 // cond: 20804 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 20805 for { 20806 v_0 := v.Args[0] 20807 if v_0.Op != OpConst32 { 20808 break 20809 } 20810 t := v_0.Type 20811 c := v_0.AuxInt 20812 v_1 := v.Args[1] 20813 if v_1.Op != OpSub32 { 20814 break 20815 } 20816 v_1_0 := v_1.Args[0] 20817 if v_1_0.Op != OpConst32 { 20818 break 20819 } 20820 if v_1_0.Type != t { 20821 break 20822 } 20823 d := v_1_0.AuxInt 20824 x := v_1.Args[1] 20825 v.reset(OpAdd32) 20826 v0 := b.NewValue0(v.Pos, OpConst32, t) 20827 v0.AuxInt = int64(int32(c - d)) 20828 v.AddArg(v0) 20829 v.AddArg(x) 20830 return true 20831 } 20832 return false 20833 } 20834 func rewriteValuegeneric_OpSub32F_0(v *Value) bool { 20835 // match: (Sub32F (Const32F [c]) (Const32F [d])) 20836 // cond: 20837 // result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))]) 20838 for { 20839 v_0 := v.Args[0] 20840 if v_0.Op != OpConst32F { 20841 break 20842 } 20843 c := v_0.AuxInt 20844 v_1 := v.Args[1] 20845 if v_1.Op != OpConst32F { 20846 break 20847 } 20848 d := v_1.AuxInt 20849 v.reset(OpConst32F) 20850 v.AuxInt = f2i(float64(i2f32(c) - i2f32(d))) 20851 return true 20852 } 20853 // match: (Sub32F x (Const32F [0])) 20854 // cond: 20855 // result: x 20856 for { 20857 x := v.Args[0] 20858 v_1 := v.Args[1] 20859 if v_1.Op != OpConst32F { 20860 break 20861 } 20862 if v_1.AuxInt != 0 { 20863 break 20864 } 20865 v.reset(OpCopy) 20866 v.Type = x.Type 20867 v.AddArg(x) 20868 return true 20869 } 20870 return false 20871 } 20872 func rewriteValuegeneric_OpSub64_0(v *Value) bool { 20873 b := v.Block 20874 _ = b 20875 // match: (Sub64 (Const64 [c]) (Const64 [d])) 20876 // cond: 20877 // result: (Const64 [c-d]) 20878 for { 20879 v_0 := v.Args[0] 20880 if v_0.Op != OpConst64 { 20881 break 20882 } 20883 c := v_0.AuxInt 20884 v_1 := v.Args[1] 20885 if v_1.Op != OpConst64 { 20886 break 20887 } 20888 d := v_1.AuxInt 20889 v.reset(OpConst64) 20890 v.AuxInt = c - d 20891 return true 20892 } 20893 // match: (Sub64 x (Const64 <t> [c])) 20894 // cond: x.Op != OpConst64 20895 // result: (Add64 (Const64 <t> [-c]) x) 20896 for { 20897 x := v.Args[0] 20898 v_1 := v.Args[1] 20899 if v_1.Op != OpConst64 { 20900 break 20901 } 20902 t := v_1.Type 20903 c := v_1.AuxInt 20904 if !(x.Op != OpConst64) { 20905 break 20906 } 20907 v.reset(OpAdd64) 20908 v0 := b.NewValue0(v.Pos, OpConst64, t) 20909 v0.AuxInt = -c 20910 v.AddArg(v0) 20911 v.AddArg(x) 20912 return true 20913 } 20914 // match: (Sub64 x x) 20915 // cond: 20916 // result: (Const64 [0]) 20917 for { 20918 x := v.Args[0] 20919 if x != v.Args[1] { 20920 break 20921 } 20922 v.reset(OpConst64) 20923 v.AuxInt = 0 20924 return true 20925 } 20926 // match: (Sub64 (Add64 x y) x) 20927 // cond: 20928 // result: y 20929 for { 20930 v_0 := v.Args[0] 20931 if v_0.Op != OpAdd64 { 20932 break 20933 } 20934 x := v_0.Args[0] 20935 y := v_0.Args[1] 20936 if x != v.Args[1] { 20937 break 20938 } 20939 v.reset(OpCopy) 20940 v.Type = y.Type 20941 v.AddArg(y) 20942 return true 20943 } 20944 // match: (Sub64 (Add64 y x) x) 20945 // cond: 20946 // result: y 20947 for { 20948 v_0 := v.Args[0] 20949 if v_0.Op != OpAdd64 { 20950 break 20951 } 20952 y := v_0.Args[0] 20953 x := v_0.Args[1] 20954 if x != v.Args[1] { 20955 break 20956 } 20957 v.reset(OpCopy) 20958 v.Type = y.Type 20959 v.AddArg(y) 20960 return true 20961 } 20962 // match: (Sub64 (Add64 x y) y) 20963 // cond: 20964 // result: x 20965 for { 20966 v_0 := v.Args[0] 20967 if v_0.Op != OpAdd64 { 20968 break 20969 } 20970 x := v_0.Args[0] 20971 y := v_0.Args[1] 20972 if y != v.Args[1] { 20973 break 20974 } 20975 v.reset(OpCopy) 20976 v.Type = x.Type 20977 v.AddArg(x) 20978 return true 20979 } 20980 // match: (Sub64 (Add64 y x) y) 20981 // cond: 20982 // result: x 20983 for { 20984 v_0 := v.Args[0] 20985 if v_0.Op != OpAdd64 { 20986 break 20987 } 20988 y := v_0.Args[0] 20989 x := v_0.Args[1] 20990 if y != v.Args[1] { 20991 break 20992 } 20993 v.reset(OpCopy) 20994 v.Type = x.Type 20995 v.AddArg(x) 20996 return true 20997 } 20998 // match: (Sub64 x (Sub64 i:(Const64 <t>) z)) 20999 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 21000 // result: (Sub64 (Add64 <t> x z) i) 21001 for { 21002 x := v.Args[0] 21003 v_1 := v.Args[1] 21004 if v_1.Op != OpSub64 { 21005 break 21006 } 21007 i := v_1.Args[0] 21008 if i.Op != OpConst64 { 21009 break 21010 } 21011 t := i.Type 21012 z := v_1.Args[1] 21013 if !(z.Op != OpConst64 && x.Op != OpConst64) { 21014 break 21015 } 21016 v.reset(OpSub64) 21017 v0 := b.NewValue0(v.Pos, OpAdd64, t) 21018 v0.AddArg(x) 21019 v0.AddArg(z) 21020 v.AddArg(v0) 21021 v.AddArg(i) 21022 return true 21023 } 21024 // match: (Sub64 x (Sub64 z i:(Const64 <t>))) 21025 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 21026 // result: (Add64 i (Sub64 <t> x z)) 21027 for { 21028 x := v.Args[0] 21029 v_1 := v.Args[1] 21030 if v_1.Op != OpSub64 { 21031 break 21032 } 21033 z := v_1.Args[0] 21034 i := v_1.Args[1] 21035 if i.Op != OpConst64 { 21036 break 21037 } 21038 t := i.Type 21039 if !(z.Op != OpConst64 && x.Op != OpConst64) { 21040 break 21041 } 21042 v.reset(OpAdd64) 21043 v.AddArg(i) 21044 v0 := b.NewValue0(v.Pos, OpSub64, t) 21045 v0.AddArg(x) 21046 v0.AddArg(z) 21047 v.AddArg(v0) 21048 return true 21049 } 21050 // match: (Sub64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 21051 // cond: 21052 // result: (Sub64 (Const64 <t> [c+d]) x) 21053 for { 21054 v_0 := v.Args[0] 21055 if v_0.Op != OpConst64 { 21056 break 21057 } 21058 t := v_0.Type 21059 c := v_0.AuxInt 21060 v_1 := v.Args[1] 21061 if v_1.Op != OpSub64 { 21062 break 21063 } 21064 x := v_1.Args[0] 21065 v_1_1 := v_1.Args[1] 21066 if v_1_1.Op != OpConst64 { 21067 break 21068 } 21069 if v_1_1.Type != t { 21070 break 21071 } 21072 d := v_1_1.AuxInt 21073 v.reset(OpSub64) 21074 v0 := b.NewValue0(v.Pos, OpConst64, t) 21075 v0.AuxInt = c + d 21076 v.AddArg(v0) 21077 v.AddArg(x) 21078 return true 21079 } 21080 return false 21081 } 21082 func rewriteValuegeneric_OpSub64_10(v *Value) bool { 21083 b := v.Block 21084 _ = b 21085 // match: (Sub64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 21086 // cond: 21087 // result: (Add64 (Const64 <t> [c-d]) x) 21088 for { 21089 v_0 := v.Args[0] 21090 if v_0.Op != OpConst64 { 21091 break 21092 } 21093 t := v_0.Type 21094 c := v_0.AuxInt 21095 v_1 := v.Args[1] 21096 if v_1.Op != OpSub64 { 21097 break 21098 } 21099 v_1_0 := v_1.Args[0] 21100 if v_1_0.Op != OpConst64 { 21101 break 21102 } 21103 if v_1_0.Type != t { 21104 break 21105 } 21106 d := v_1_0.AuxInt 21107 x := v_1.Args[1] 21108 v.reset(OpAdd64) 21109 v0 := b.NewValue0(v.Pos, OpConst64, t) 21110 v0.AuxInt = c - d 21111 v.AddArg(v0) 21112 v.AddArg(x) 21113 return true 21114 } 21115 return false 21116 } 21117 func rewriteValuegeneric_OpSub64F_0(v *Value) bool { 21118 // match: (Sub64F (Const64F [c]) (Const64F [d])) 21119 // cond: 21120 // result: (Const64F [f2i(i2f(c) - i2f(d))]) 21121 for { 21122 v_0 := v.Args[0] 21123 if v_0.Op != OpConst64F { 21124 break 21125 } 21126 c := v_0.AuxInt 21127 v_1 := v.Args[1] 21128 if v_1.Op != OpConst64F { 21129 break 21130 } 21131 d := v_1.AuxInt 21132 v.reset(OpConst64F) 21133 v.AuxInt = f2i(i2f(c) - i2f(d)) 21134 return true 21135 } 21136 // match: (Sub64F x (Const64F [0])) 21137 // cond: 21138 // result: x 21139 for { 21140 x := v.Args[0] 21141 v_1 := v.Args[1] 21142 if v_1.Op != OpConst64F { 21143 break 21144 } 21145 if v_1.AuxInt != 0 { 21146 break 21147 } 21148 v.reset(OpCopy) 21149 v.Type = x.Type 21150 v.AddArg(x) 21151 return true 21152 } 21153 return false 21154 } 21155 func rewriteValuegeneric_OpSub8_0(v *Value) bool { 21156 b := v.Block 21157 _ = b 21158 // match: (Sub8 (Const8 [c]) (Const8 [d])) 21159 // cond: 21160 // result: (Const8 [int64(int8(c-d))]) 21161 for { 21162 v_0 := v.Args[0] 21163 if v_0.Op != OpConst8 { 21164 break 21165 } 21166 c := v_0.AuxInt 21167 v_1 := v.Args[1] 21168 if v_1.Op != OpConst8 { 21169 break 21170 } 21171 d := v_1.AuxInt 21172 v.reset(OpConst8) 21173 v.AuxInt = int64(int8(c - d)) 21174 return true 21175 } 21176 // match: (Sub8 x (Const8 <t> [c])) 21177 // cond: x.Op != OpConst8 21178 // result: (Add8 (Const8 <t> [int64(int8(-c))]) x) 21179 for { 21180 x := v.Args[0] 21181 v_1 := v.Args[1] 21182 if v_1.Op != OpConst8 { 21183 break 21184 } 21185 t := v_1.Type 21186 c := v_1.AuxInt 21187 if !(x.Op != OpConst8) { 21188 break 21189 } 21190 v.reset(OpAdd8) 21191 v0 := b.NewValue0(v.Pos, OpConst8, t) 21192 v0.AuxInt = int64(int8(-c)) 21193 v.AddArg(v0) 21194 v.AddArg(x) 21195 return true 21196 } 21197 // match: (Sub8 x x) 21198 // cond: 21199 // result: (Const8 [0]) 21200 for { 21201 x := v.Args[0] 21202 if x != v.Args[1] { 21203 break 21204 } 21205 v.reset(OpConst8) 21206 v.AuxInt = 0 21207 return true 21208 } 21209 // match: (Sub8 (Add8 x y) x) 21210 // cond: 21211 // result: y 21212 for { 21213 v_0 := v.Args[0] 21214 if v_0.Op != OpAdd8 { 21215 break 21216 } 21217 x := v_0.Args[0] 21218 y := v_0.Args[1] 21219 if x != v.Args[1] { 21220 break 21221 } 21222 v.reset(OpCopy) 21223 v.Type = y.Type 21224 v.AddArg(y) 21225 return true 21226 } 21227 // match: (Sub8 (Add8 y x) x) 21228 // cond: 21229 // result: y 21230 for { 21231 v_0 := v.Args[0] 21232 if v_0.Op != OpAdd8 { 21233 break 21234 } 21235 y := v_0.Args[0] 21236 x := v_0.Args[1] 21237 if x != v.Args[1] { 21238 break 21239 } 21240 v.reset(OpCopy) 21241 v.Type = y.Type 21242 v.AddArg(y) 21243 return true 21244 } 21245 // match: (Sub8 (Add8 x y) y) 21246 // cond: 21247 // result: x 21248 for { 21249 v_0 := v.Args[0] 21250 if v_0.Op != OpAdd8 { 21251 break 21252 } 21253 x := v_0.Args[0] 21254 y := v_0.Args[1] 21255 if y != v.Args[1] { 21256 break 21257 } 21258 v.reset(OpCopy) 21259 v.Type = x.Type 21260 v.AddArg(x) 21261 return true 21262 } 21263 // match: (Sub8 (Add8 y x) y) 21264 // cond: 21265 // result: x 21266 for { 21267 v_0 := v.Args[0] 21268 if v_0.Op != OpAdd8 { 21269 break 21270 } 21271 y := v_0.Args[0] 21272 x := v_0.Args[1] 21273 if y != v.Args[1] { 21274 break 21275 } 21276 v.reset(OpCopy) 21277 v.Type = x.Type 21278 v.AddArg(x) 21279 return true 21280 } 21281 // match: (Sub8 x (Sub8 i:(Const8 <t>) z)) 21282 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 21283 // result: (Sub8 (Add8 <t> x z) i) 21284 for { 21285 x := v.Args[0] 21286 v_1 := v.Args[1] 21287 if v_1.Op != OpSub8 { 21288 break 21289 } 21290 i := v_1.Args[0] 21291 if i.Op != OpConst8 { 21292 break 21293 } 21294 t := i.Type 21295 z := v_1.Args[1] 21296 if !(z.Op != OpConst8 && x.Op != OpConst8) { 21297 break 21298 } 21299 v.reset(OpSub8) 21300 v0 := b.NewValue0(v.Pos, OpAdd8, t) 21301 v0.AddArg(x) 21302 v0.AddArg(z) 21303 v.AddArg(v0) 21304 v.AddArg(i) 21305 return true 21306 } 21307 // match: (Sub8 x (Sub8 z i:(Const8 <t>))) 21308 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 21309 // result: (Add8 i (Sub8 <t> x z)) 21310 for { 21311 x := v.Args[0] 21312 v_1 := v.Args[1] 21313 if v_1.Op != OpSub8 { 21314 break 21315 } 21316 z := v_1.Args[0] 21317 i := v_1.Args[1] 21318 if i.Op != OpConst8 { 21319 break 21320 } 21321 t := i.Type 21322 if !(z.Op != OpConst8 && x.Op != OpConst8) { 21323 break 21324 } 21325 v.reset(OpAdd8) 21326 v.AddArg(i) 21327 v0 := b.NewValue0(v.Pos, OpSub8, t) 21328 v0.AddArg(x) 21329 v0.AddArg(z) 21330 v.AddArg(v0) 21331 return true 21332 } 21333 // match: (Sub8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 21334 // cond: 21335 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 21336 for { 21337 v_0 := v.Args[0] 21338 if v_0.Op != OpConst8 { 21339 break 21340 } 21341 t := v_0.Type 21342 c := v_0.AuxInt 21343 v_1 := v.Args[1] 21344 if v_1.Op != OpSub8 { 21345 break 21346 } 21347 x := v_1.Args[0] 21348 v_1_1 := v_1.Args[1] 21349 if v_1_1.Op != OpConst8 { 21350 break 21351 } 21352 if v_1_1.Type != t { 21353 break 21354 } 21355 d := v_1_1.AuxInt 21356 v.reset(OpSub8) 21357 v0 := b.NewValue0(v.Pos, OpConst8, t) 21358 v0.AuxInt = int64(int8(c + d)) 21359 v.AddArg(v0) 21360 v.AddArg(x) 21361 return true 21362 } 21363 return false 21364 } 21365 func rewriteValuegeneric_OpSub8_10(v *Value) bool { 21366 b := v.Block 21367 _ = b 21368 // match: (Sub8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 21369 // cond: 21370 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 21371 for { 21372 v_0 := v.Args[0] 21373 if v_0.Op != OpConst8 { 21374 break 21375 } 21376 t := v_0.Type 21377 c := v_0.AuxInt 21378 v_1 := v.Args[1] 21379 if v_1.Op != OpSub8 { 21380 break 21381 } 21382 v_1_0 := v_1.Args[0] 21383 if v_1_0.Op != OpConst8 { 21384 break 21385 } 21386 if v_1_0.Type != t { 21387 break 21388 } 21389 d := v_1_0.AuxInt 21390 x := v_1.Args[1] 21391 v.reset(OpAdd8) 21392 v0 := b.NewValue0(v.Pos, OpConst8, t) 21393 v0.AuxInt = int64(int8(c - d)) 21394 v.AddArg(v0) 21395 v.AddArg(x) 21396 return true 21397 } 21398 return false 21399 } 21400 func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { 21401 // match: (Trunc16to8 (Const16 [c])) 21402 // cond: 21403 // result: (Const8 [int64(int8(c))]) 21404 for { 21405 v_0 := v.Args[0] 21406 if v_0.Op != OpConst16 { 21407 break 21408 } 21409 c := v_0.AuxInt 21410 v.reset(OpConst8) 21411 v.AuxInt = int64(int8(c)) 21412 return true 21413 } 21414 // match: (Trunc16to8 (ZeroExt8to16 x)) 21415 // cond: 21416 // result: x 21417 for { 21418 v_0 := v.Args[0] 21419 if v_0.Op != OpZeroExt8to16 { 21420 break 21421 } 21422 x := v_0.Args[0] 21423 v.reset(OpCopy) 21424 v.Type = x.Type 21425 v.AddArg(x) 21426 return true 21427 } 21428 // match: (Trunc16to8 (SignExt8to16 x)) 21429 // cond: 21430 // result: x 21431 for { 21432 v_0 := v.Args[0] 21433 if v_0.Op != OpSignExt8to16 { 21434 break 21435 } 21436 x := v_0.Args[0] 21437 v.reset(OpCopy) 21438 v.Type = x.Type 21439 v.AddArg(x) 21440 return true 21441 } 21442 // match: (Trunc16to8 (And16 (Const16 [y]) x)) 21443 // cond: y&0xFF == 0xFF 21444 // result: (Trunc16to8 x) 21445 for { 21446 v_0 := v.Args[0] 21447 if v_0.Op != OpAnd16 { 21448 break 21449 } 21450 v_0_0 := v_0.Args[0] 21451 if v_0_0.Op != OpConst16 { 21452 break 21453 } 21454 y := v_0_0.AuxInt 21455 x := v_0.Args[1] 21456 if !(y&0xFF == 0xFF) { 21457 break 21458 } 21459 v.reset(OpTrunc16to8) 21460 v.AddArg(x) 21461 return true 21462 } 21463 // match: (Trunc16to8 (And16 x (Const16 [y]))) 21464 // cond: y&0xFF == 0xFF 21465 // result: (Trunc16to8 x) 21466 for { 21467 v_0 := v.Args[0] 21468 if v_0.Op != OpAnd16 { 21469 break 21470 } 21471 x := v_0.Args[0] 21472 v_0_1 := v_0.Args[1] 21473 if v_0_1.Op != OpConst16 { 21474 break 21475 } 21476 y := v_0_1.AuxInt 21477 if !(y&0xFF == 0xFF) { 21478 break 21479 } 21480 v.reset(OpTrunc16to8) 21481 v.AddArg(x) 21482 return true 21483 } 21484 return false 21485 } 21486 func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { 21487 // match: (Trunc32to16 (Const32 [c])) 21488 // cond: 21489 // result: (Const16 [int64(int16(c))]) 21490 for { 21491 v_0 := v.Args[0] 21492 if v_0.Op != OpConst32 { 21493 break 21494 } 21495 c := v_0.AuxInt 21496 v.reset(OpConst16) 21497 v.AuxInt = int64(int16(c)) 21498 return true 21499 } 21500 // match: (Trunc32to16 (ZeroExt8to32 x)) 21501 // cond: 21502 // result: (ZeroExt8to16 x) 21503 for { 21504 v_0 := v.Args[0] 21505 if v_0.Op != OpZeroExt8to32 { 21506 break 21507 } 21508 x := v_0.Args[0] 21509 v.reset(OpZeroExt8to16) 21510 v.AddArg(x) 21511 return true 21512 } 21513 // match: (Trunc32to16 (ZeroExt16to32 x)) 21514 // cond: 21515 // result: x 21516 for { 21517 v_0 := v.Args[0] 21518 if v_0.Op != OpZeroExt16to32 { 21519 break 21520 } 21521 x := v_0.Args[0] 21522 v.reset(OpCopy) 21523 v.Type = x.Type 21524 v.AddArg(x) 21525 return true 21526 } 21527 // match: (Trunc32to16 (SignExt8to32 x)) 21528 // cond: 21529 // result: (SignExt8to16 x) 21530 for { 21531 v_0 := v.Args[0] 21532 if v_0.Op != OpSignExt8to32 { 21533 break 21534 } 21535 x := v_0.Args[0] 21536 v.reset(OpSignExt8to16) 21537 v.AddArg(x) 21538 return true 21539 } 21540 // match: (Trunc32to16 (SignExt16to32 x)) 21541 // cond: 21542 // result: x 21543 for { 21544 v_0 := v.Args[0] 21545 if v_0.Op != OpSignExt16to32 { 21546 break 21547 } 21548 x := v_0.Args[0] 21549 v.reset(OpCopy) 21550 v.Type = x.Type 21551 v.AddArg(x) 21552 return true 21553 } 21554 // match: (Trunc32to16 (And32 (Const32 [y]) x)) 21555 // cond: y&0xFFFF == 0xFFFF 21556 // result: (Trunc32to16 x) 21557 for { 21558 v_0 := v.Args[0] 21559 if v_0.Op != OpAnd32 { 21560 break 21561 } 21562 v_0_0 := v_0.Args[0] 21563 if v_0_0.Op != OpConst32 { 21564 break 21565 } 21566 y := v_0_0.AuxInt 21567 x := v_0.Args[1] 21568 if !(y&0xFFFF == 0xFFFF) { 21569 break 21570 } 21571 v.reset(OpTrunc32to16) 21572 v.AddArg(x) 21573 return true 21574 } 21575 // match: (Trunc32to16 (And32 x (Const32 [y]))) 21576 // cond: y&0xFFFF == 0xFFFF 21577 // result: (Trunc32to16 x) 21578 for { 21579 v_0 := v.Args[0] 21580 if v_0.Op != OpAnd32 { 21581 break 21582 } 21583 x := v_0.Args[0] 21584 v_0_1 := v_0.Args[1] 21585 if v_0_1.Op != OpConst32 { 21586 break 21587 } 21588 y := v_0_1.AuxInt 21589 if !(y&0xFFFF == 0xFFFF) { 21590 break 21591 } 21592 v.reset(OpTrunc32to16) 21593 v.AddArg(x) 21594 return true 21595 } 21596 return false 21597 } 21598 func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { 21599 // match: (Trunc32to8 (Const32 [c])) 21600 // cond: 21601 // result: (Const8 [int64(int8(c))]) 21602 for { 21603 v_0 := v.Args[0] 21604 if v_0.Op != OpConst32 { 21605 break 21606 } 21607 c := v_0.AuxInt 21608 v.reset(OpConst8) 21609 v.AuxInt = int64(int8(c)) 21610 return true 21611 } 21612 // match: (Trunc32to8 (ZeroExt8to32 x)) 21613 // cond: 21614 // result: x 21615 for { 21616 v_0 := v.Args[0] 21617 if v_0.Op != OpZeroExt8to32 { 21618 break 21619 } 21620 x := v_0.Args[0] 21621 v.reset(OpCopy) 21622 v.Type = x.Type 21623 v.AddArg(x) 21624 return true 21625 } 21626 // match: (Trunc32to8 (SignExt8to32 x)) 21627 // cond: 21628 // result: x 21629 for { 21630 v_0 := v.Args[0] 21631 if v_0.Op != OpSignExt8to32 { 21632 break 21633 } 21634 x := v_0.Args[0] 21635 v.reset(OpCopy) 21636 v.Type = x.Type 21637 v.AddArg(x) 21638 return true 21639 } 21640 // match: (Trunc32to8 (And32 (Const32 [y]) x)) 21641 // cond: y&0xFF == 0xFF 21642 // result: (Trunc32to8 x) 21643 for { 21644 v_0 := v.Args[0] 21645 if v_0.Op != OpAnd32 { 21646 break 21647 } 21648 v_0_0 := v_0.Args[0] 21649 if v_0_0.Op != OpConst32 { 21650 break 21651 } 21652 y := v_0_0.AuxInt 21653 x := v_0.Args[1] 21654 if !(y&0xFF == 0xFF) { 21655 break 21656 } 21657 v.reset(OpTrunc32to8) 21658 v.AddArg(x) 21659 return true 21660 } 21661 // match: (Trunc32to8 (And32 x (Const32 [y]))) 21662 // cond: y&0xFF == 0xFF 21663 // result: (Trunc32to8 x) 21664 for { 21665 v_0 := v.Args[0] 21666 if v_0.Op != OpAnd32 { 21667 break 21668 } 21669 x := v_0.Args[0] 21670 v_0_1 := v_0.Args[1] 21671 if v_0_1.Op != OpConst32 { 21672 break 21673 } 21674 y := v_0_1.AuxInt 21675 if !(y&0xFF == 0xFF) { 21676 break 21677 } 21678 v.reset(OpTrunc32to8) 21679 v.AddArg(x) 21680 return true 21681 } 21682 return false 21683 } 21684 func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { 21685 // match: (Trunc64to16 (Const64 [c])) 21686 // cond: 21687 // result: (Const16 [int64(int16(c))]) 21688 for { 21689 v_0 := v.Args[0] 21690 if v_0.Op != OpConst64 { 21691 break 21692 } 21693 c := v_0.AuxInt 21694 v.reset(OpConst16) 21695 v.AuxInt = int64(int16(c)) 21696 return true 21697 } 21698 // match: (Trunc64to16 (ZeroExt8to64 x)) 21699 // cond: 21700 // result: (ZeroExt8to16 x) 21701 for { 21702 v_0 := v.Args[0] 21703 if v_0.Op != OpZeroExt8to64 { 21704 break 21705 } 21706 x := v_0.Args[0] 21707 v.reset(OpZeroExt8to16) 21708 v.AddArg(x) 21709 return true 21710 } 21711 // match: (Trunc64to16 (ZeroExt16to64 x)) 21712 // cond: 21713 // result: x 21714 for { 21715 v_0 := v.Args[0] 21716 if v_0.Op != OpZeroExt16to64 { 21717 break 21718 } 21719 x := v_0.Args[0] 21720 v.reset(OpCopy) 21721 v.Type = x.Type 21722 v.AddArg(x) 21723 return true 21724 } 21725 // match: (Trunc64to16 (SignExt8to64 x)) 21726 // cond: 21727 // result: (SignExt8to16 x) 21728 for { 21729 v_0 := v.Args[0] 21730 if v_0.Op != OpSignExt8to64 { 21731 break 21732 } 21733 x := v_0.Args[0] 21734 v.reset(OpSignExt8to16) 21735 v.AddArg(x) 21736 return true 21737 } 21738 // match: (Trunc64to16 (SignExt16to64 x)) 21739 // cond: 21740 // result: x 21741 for { 21742 v_0 := v.Args[0] 21743 if v_0.Op != OpSignExt16to64 { 21744 break 21745 } 21746 x := v_0.Args[0] 21747 v.reset(OpCopy) 21748 v.Type = x.Type 21749 v.AddArg(x) 21750 return true 21751 } 21752 // match: (Trunc64to16 (And64 (Const64 [y]) x)) 21753 // cond: y&0xFFFF == 0xFFFF 21754 // result: (Trunc64to16 x) 21755 for { 21756 v_0 := v.Args[0] 21757 if v_0.Op != OpAnd64 { 21758 break 21759 } 21760 v_0_0 := v_0.Args[0] 21761 if v_0_0.Op != OpConst64 { 21762 break 21763 } 21764 y := v_0_0.AuxInt 21765 x := v_0.Args[1] 21766 if !(y&0xFFFF == 0xFFFF) { 21767 break 21768 } 21769 v.reset(OpTrunc64to16) 21770 v.AddArg(x) 21771 return true 21772 } 21773 // match: (Trunc64to16 (And64 x (Const64 [y]))) 21774 // cond: y&0xFFFF == 0xFFFF 21775 // result: (Trunc64to16 x) 21776 for { 21777 v_0 := v.Args[0] 21778 if v_0.Op != OpAnd64 { 21779 break 21780 } 21781 x := v_0.Args[0] 21782 v_0_1 := v_0.Args[1] 21783 if v_0_1.Op != OpConst64 { 21784 break 21785 } 21786 y := v_0_1.AuxInt 21787 if !(y&0xFFFF == 0xFFFF) { 21788 break 21789 } 21790 v.reset(OpTrunc64to16) 21791 v.AddArg(x) 21792 return true 21793 } 21794 return false 21795 } 21796 func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { 21797 // match: (Trunc64to32 (Const64 [c])) 21798 // cond: 21799 // result: (Const32 [int64(int32(c))]) 21800 for { 21801 v_0 := v.Args[0] 21802 if v_0.Op != OpConst64 { 21803 break 21804 } 21805 c := v_0.AuxInt 21806 v.reset(OpConst32) 21807 v.AuxInt = int64(int32(c)) 21808 return true 21809 } 21810 // match: (Trunc64to32 (ZeroExt8to64 x)) 21811 // cond: 21812 // result: (ZeroExt8to32 x) 21813 for { 21814 v_0 := v.Args[0] 21815 if v_0.Op != OpZeroExt8to64 { 21816 break 21817 } 21818 x := v_0.Args[0] 21819 v.reset(OpZeroExt8to32) 21820 v.AddArg(x) 21821 return true 21822 } 21823 // match: (Trunc64to32 (ZeroExt16to64 x)) 21824 // cond: 21825 // result: (ZeroExt16to32 x) 21826 for { 21827 v_0 := v.Args[0] 21828 if v_0.Op != OpZeroExt16to64 { 21829 break 21830 } 21831 x := v_0.Args[0] 21832 v.reset(OpZeroExt16to32) 21833 v.AddArg(x) 21834 return true 21835 } 21836 // match: (Trunc64to32 (ZeroExt32to64 x)) 21837 // cond: 21838 // result: x 21839 for { 21840 v_0 := v.Args[0] 21841 if v_0.Op != OpZeroExt32to64 { 21842 break 21843 } 21844 x := v_0.Args[0] 21845 v.reset(OpCopy) 21846 v.Type = x.Type 21847 v.AddArg(x) 21848 return true 21849 } 21850 // match: (Trunc64to32 (SignExt8to64 x)) 21851 // cond: 21852 // result: (SignExt8to32 x) 21853 for { 21854 v_0 := v.Args[0] 21855 if v_0.Op != OpSignExt8to64 { 21856 break 21857 } 21858 x := v_0.Args[0] 21859 v.reset(OpSignExt8to32) 21860 v.AddArg(x) 21861 return true 21862 } 21863 // match: (Trunc64to32 (SignExt16to64 x)) 21864 // cond: 21865 // result: (SignExt16to32 x) 21866 for { 21867 v_0 := v.Args[0] 21868 if v_0.Op != OpSignExt16to64 { 21869 break 21870 } 21871 x := v_0.Args[0] 21872 v.reset(OpSignExt16to32) 21873 v.AddArg(x) 21874 return true 21875 } 21876 // match: (Trunc64to32 (SignExt32to64 x)) 21877 // cond: 21878 // result: x 21879 for { 21880 v_0 := v.Args[0] 21881 if v_0.Op != OpSignExt32to64 { 21882 break 21883 } 21884 x := v_0.Args[0] 21885 v.reset(OpCopy) 21886 v.Type = x.Type 21887 v.AddArg(x) 21888 return true 21889 } 21890 // match: (Trunc64to32 (And64 (Const64 [y]) x)) 21891 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 21892 // result: (Trunc64to32 x) 21893 for { 21894 v_0 := v.Args[0] 21895 if v_0.Op != OpAnd64 { 21896 break 21897 } 21898 v_0_0 := v_0.Args[0] 21899 if v_0_0.Op != OpConst64 { 21900 break 21901 } 21902 y := v_0_0.AuxInt 21903 x := v_0.Args[1] 21904 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 21905 break 21906 } 21907 v.reset(OpTrunc64to32) 21908 v.AddArg(x) 21909 return true 21910 } 21911 // match: (Trunc64to32 (And64 x (Const64 [y]))) 21912 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 21913 // result: (Trunc64to32 x) 21914 for { 21915 v_0 := v.Args[0] 21916 if v_0.Op != OpAnd64 { 21917 break 21918 } 21919 x := v_0.Args[0] 21920 v_0_1 := v_0.Args[1] 21921 if v_0_1.Op != OpConst64 { 21922 break 21923 } 21924 y := v_0_1.AuxInt 21925 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 21926 break 21927 } 21928 v.reset(OpTrunc64to32) 21929 v.AddArg(x) 21930 return true 21931 } 21932 return false 21933 } 21934 func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { 21935 // match: (Trunc64to8 (Const64 [c])) 21936 // cond: 21937 // result: (Const8 [int64(int8(c))]) 21938 for { 21939 v_0 := v.Args[0] 21940 if v_0.Op != OpConst64 { 21941 break 21942 } 21943 c := v_0.AuxInt 21944 v.reset(OpConst8) 21945 v.AuxInt = int64(int8(c)) 21946 return true 21947 } 21948 // match: (Trunc64to8 (ZeroExt8to64 x)) 21949 // cond: 21950 // result: x 21951 for { 21952 v_0 := v.Args[0] 21953 if v_0.Op != OpZeroExt8to64 { 21954 break 21955 } 21956 x := v_0.Args[0] 21957 v.reset(OpCopy) 21958 v.Type = x.Type 21959 v.AddArg(x) 21960 return true 21961 } 21962 // match: (Trunc64to8 (SignExt8to64 x)) 21963 // cond: 21964 // result: x 21965 for { 21966 v_0 := v.Args[0] 21967 if v_0.Op != OpSignExt8to64 { 21968 break 21969 } 21970 x := v_0.Args[0] 21971 v.reset(OpCopy) 21972 v.Type = x.Type 21973 v.AddArg(x) 21974 return true 21975 } 21976 // match: (Trunc64to8 (And64 (Const64 [y]) x)) 21977 // cond: y&0xFF == 0xFF 21978 // result: (Trunc64to8 x) 21979 for { 21980 v_0 := v.Args[0] 21981 if v_0.Op != OpAnd64 { 21982 break 21983 } 21984 v_0_0 := v_0.Args[0] 21985 if v_0_0.Op != OpConst64 { 21986 break 21987 } 21988 y := v_0_0.AuxInt 21989 x := v_0.Args[1] 21990 if !(y&0xFF == 0xFF) { 21991 break 21992 } 21993 v.reset(OpTrunc64to8) 21994 v.AddArg(x) 21995 return true 21996 } 21997 // match: (Trunc64to8 (And64 x (Const64 [y]))) 21998 // cond: y&0xFF == 0xFF 21999 // result: (Trunc64to8 x) 22000 for { 22001 v_0 := v.Args[0] 22002 if v_0.Op != OpAnd64 { 22003 break 22004 } 22005 x := v_0.Args[0] 22006 v_0_1 := v_0.Args[1] 22007 if v_0_1.Op != OpConst64 { 22008 break 22009 } 22010 y := v_0_1.AuxInt 22011 if !(y&0xFF == 0xFF) { 22012 break 22013 } 22014 v.reset(OpTrunc64to8) 22015 v.AddArg(x) 22016 return true 22017 } 22018 return false 22019 } 22020 func rewriteValuegeneric_OpXor16_0(v *Value) bool { 22021 b := v.Block 22022 _ = b 22023 // match: (Xor16 (Const16 [c]) (Const16 [d])) 22024 // cond: 22025 // result: (Const16 [int64(int16(c^d))]) 22026 for { 22027 v_0 := v.Args[0] 22028 if v_0.Op != OpConst16 { 22029 break 22030 } 22031 c := v_0.AuxInt 22032 v_1 := v.Args[1] 22033 if v_1.Op != OpConst16 { 22034 break 22035 } 22036 d := v_1.AuxInt 22037 v.reset(OpConst16) 22038 v.AuxInt = int64(int16(c ^ d)) 22039 return true 22040 } 22041 // match: (Xor16 (Const16 [d]) (Const16 [c])) 22042 // cond: 22043 // result: (Const16 [int64(int16(c^d))]) 22044 for { 22045 v_0 := v.Args[0] 22046 if v_0.Op != OpConst16 { 22047 break 22048 } 22049 d := v_0.AuxInt 22050 v_1 := v.Args[1] 22051 if v_1.Op != OpConst16 { 22052 break 22053 } 22054 c := v_1.AuxInt 22055 v.reset(OpConst16) 22056 v.AuxInt = int64(int16(c ^ d)) 22057 return true 22058 } 22059 // match: (Xor16 x x) 22060 // cond: 22061 // result: (Const16 [0]) 22062 for { 22063 x := v.Args[0] 22064 if x != v.Args[1] { 22065 break 22066 } 22067 v.reset(OpConst16) 22068 v.AuxInt = 0 22069 return true 22070 } 22071 // match: (Xor16 (Const16 [0]) x) 22072 // cond: 22073 // result: x 22074 for { 22075 v_0 := v.Args[0] 22076 if v_0.Op != OpConst16 { 22077 break 22078 } 22079 if v_0.AuxInt != 0 { 22080 break 22081 } 22082 x := v.Args[1] 22083 v.reset(OpCopy) 22084 v.Type = x.Type 22085 v.AddArg(x) 22086 return true 22087 } 22088 // match: (Xor16 x (Const16 [0])) 22089 // cond: 22090 // result: x 22091 for { 22092 x := v.Args[0] 22093 v_1 := v.Args[1] 22094 if v_1.Op != OpConst16 { 22095 break 22096 } 22097 if v_1.AuxInt != 0 { 22098 break 22099 } 22100 v.reset(OpCopy) 22101 v.Type = x.Type 22102 v.AddArg(x) 22103 return true 22104 } 22105 // match: (Xor16 x (Xor16 x y)) 22106 // cond: 22107 // result: y 22108 for { 22109 x := v.Args[0] 22110 v_1 := v.Args[1] 22111 if v_1.Op != OpXor16 { 22112 break 22113 } 22114 if x != v_1.Args[0] { 22115 break 22116 } 22117 y := v_1.Args[1] 22118 v.reset(OpCopy) 22119 v.Type = y.Type 22120 v.AddArg(y) 22121 return true 22122 } 22123 // match: (Xor16 x (Xor16 y x)) 22124 // cond: 22125 // result: y 22126 for { 22127 x := v.Args[0] 22128 v_1 := v.Args[1] 22129 if v_1.Op != OpXor16 { 22130 break 22131 } 22132 y := v_1.Args[0] 22133 if x != v_1.Args[1] { 22134 break 22135 } 22136 v.reset(OpCopy) 22137 v.Type = y.Type 22138 v.AddArg(y) 22139 return true 22140 } 22141 // match: (Xor16 (Xor16 x y) x) 22142 // cond: 22143 // result: y 22144 for { 22145 v_0 := v.Args[0] 22146 if v_0.Op != OpXor16 { 22147 break 22148 } 22149 x := v_0.Args[0] 22150 y := v_0.Args[1] 22151 if x != v.Args[1] { 22152 break 22153 } 22154 v.reset(OpCopy) 22155 v.Type = y.Type 22156 v.AddArg(y) 22157 return true 22158 } 22159 // match: (Xor16 (Xor16 y x) x) 22160 // cond: 22161 // result: y 22162 for { 22163 v_0 := v.Args[0] 22164 if v_0.Op != OpXor16 { 22165 break 22166 } 22167 y := v_0.Args[0] 22168 x := v_0.Args[1] 22169 if x != v.Args[1] { 22170 break 22171 } 22172 v.reset(OpCopy) 22173 v.Type = y.Type 22174 v.AddArg(y) 22175 return true 22176 } 22177 // match: (Xor16 (Xor16 i:(Const16 <t>) z) x) 22178 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 22179 // result: (Xor16 i (Xor16 <t> z x)) 22180 for { 22181 v_0 := v.Args[0] 22182 if v_0.Op != OpXor16 { 22183 break 22184 } 22185 i := v_0.Args[0] 22186 if i.Op != OpConst16 { 22187 break 22188 } 22189 t := i.Type 22190 z := v_0.Args[1] 22191 x := v.Args[1] 22192 if !(z.Op != OpConst16 && x.Op != OpConst16) { 22193 break 22194 } 22195 v.reset(OpXor16) 22196 v.AddArg(i) 22197 v0 := b.NewValue0(v.Pos, OpXor16, t) 22198 v0.AddArg(z) 22199 v0.AddArg(x) 22200 v.AddArg(v0) 22201 return true 22202 } 22203 return false 22204 } 22205 func rewriteValuegeneric_OpXor16_10(v *Value) bool { 22206 b := v.Block 22207 _ = b 22208 // match: (Xor16 (Xor16 z i:(Const16 <t>)) x) 22209 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 22210 // result: (Xor16 i (Xor16 <t> z x)) 22211 for { 22212 v_0 := v.Args[0] 22213 if v_0.Op != OpXor16 { 22214 break 22215 } 22216 z := v_0.Args[0] 22217 i := v_0.Args[1] 22218 if i.Op != OpConst16 { 22219 break 22220 } 22221 t := i.Type 22222 x := v.Args[1] 22223 if !(z.Op != OpConst16 && x.Op != OpConst16) { 22224 break 22225 } 22226 v.reset(OpXor16) 22227 v.AddArg(i) 22228 v0 := b.NewValue0(v.Pos, OpXor16, t) 22229 v0.AddArg(z) 22230 v0.AddArg(x) 22231 v.AddArg(v0) 22232 return true 22233 } 22234 // match: (Xor16 x (Xor16 i:(Const16 <t>) z)) 22235 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 22236 // result: (Xor16 i (Xor16 <t> z x)) 22237 for { 22238 x := v.Args[0] 22239 v_1 := v.Args[1] 22240 if v_1.Op != OpXor16 { 22241 break 22242 } 22243 i := v_1.Args[0] 22244 if i.Op != OpConst16 { 22245 break 22246 } 22247 t := i.Type 22248 z := v_1.Args[1] 22249 if !(z.Op != OpConst16 && x.Op != OpConst16) { 22250 break 22251 } 22252 v.reset(OpXor16) 22253 v.AddArg(i) 22254 v0 := b.NewValue0(v.Pos, OpXor16, t) 22255 v0.AddArg(z) 22256 v0.AddArg(x) 22257 v.AddArg(v0) 22258 return true 22259 } 22260 // match: (Xor16 x (Xor16 z i:(Const16 <t>))) 22261 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 22262 // result: (Xor16 i (Xor16 <t> z x)) 22263 for { 22264 x := v.Args[0] 22265 v_1 := v.Args[1] 22266 if v_1.Op != OpXor16 { 22267 break 22268 } 22269 z := v_1.Args[0] 22270 i := v_1.Args[1] 22271 if i.Op != OpConst16 { 22272 break 22273 } 22274 t := i.Type 22275 if !(z.Op != OpConst16 && x.Op != OpConst16) { 22276 break 22277 } 22278 v.reset(OpXor16) 22279 v.AddArg(i) 22280 v0 := b.NewValue0(v.Pos, OpXor16, t) 22281 v0.AddArg(z) 22282 v0.AddArg(x) 22283 v.AddArg(v0) 22284 return true 22285 } 22286 // match: (Xor16 (Const16 <t> [c]) (Xor16 (Const16 <t> [d]) x)) 22287 // cond: 22288 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 22289 for { 22290 v_0 := v.Args[0] 22291 if v_0.Op != OpConst16 { 22292 break 22293 } 22294 t := v_0.Type 22295 c := v_0.AuxInt 22296 v_1 := v.Args[1] 22297 if v_1.Op != OpXor16 { 22298 break 22299 } 22300 v_1_0 := v_1.Args[0] 22301 if v_1_0.Op != OpConst16 { 22302 break 22303 } 22304 if v_1_0.Type != t { 22305 break 22306 } 22307 d := v_1_0.AuxInt 22308 x := v_1.Args[1] 22309 v.reset(OpXor16) 22310 v0 := b.NewValue0(v.Pos, OpConst16, t) 22311 v0.AuxInt = int64(int16(c ^ d)) 22312 v.AddArg(v0) 22313 v.AddArg(x) 22314 return true 22315 } 22316 // match: (Xor16 (Const16 <t> [c]) (Xor16 x (Const16 <t> [d]))) 22317 // cond: 22318 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 22319 for { 22320 v_0 := v.Args[0] 22321 if v_0.Op != OpConst16 { 22322 break 22323 } 22324 t := v_0.Type 22325 c := v_0.AuxInt 22326 v_1 := v.Args[1] 22327 if v_1.Op != OpXor16 { 22328 break 22329 } 22330 x := v_1.Args[0] 22331 v_1_1 := v_1.Args[1] 22332 if v_1_1.Op != OpConst16 { 22333 break 22334 } 22335 if v_1_1.Type != t { 22336 break 22337 } 22338 d := v_1_1.AuxInt 22339 v.reset(OpXor16) 22340 v0 := b.NewValue0(v.Pos, OpConst16, t) 22341 v0.AuxInt = int64(int16(c ^ d)) 22342 v.AddArg(v0) 22343 v.AddArg(x) 22344 return true 22345 } 22346 // match: (Xor16 (Xor16 (Const16 <t> [d]) x) (Const16 <t> [c])) 22347 // cond: 22348 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 22349 for { 22350 v_0 := v.Args[0] 22351 if v_0.Op != OpXor16 { 22352 break 22353 } 22354 v_0_0 := v_0.Args[0] 22355 if v_0_0.Op != OpConst16 { 22356 break 22357 } 22358 t := v_0_0.Type 22359 d := v_0_0.AuxInt 22360 x := v_0.Args[1] 22361 v_1 := v.Args[1] 22362 if v_1.Op != OpConst16 { 22363 break 22364 } 22365 if v_1.Type != t { 22366 break 22367 } 22368 c := v_1.AuxInt 22369 v.reset(OpXor16) 22370 v0 := b.NewValue0(v.Pos, OpConst16, t) 22371 v0.AuxInt = int64(int16(c ^ d)) 22372 v.AddArg(v0) 22373 v.AddArg(x) 22374 return true 22375 } 22376 // match: (Xor16 (Xor16 x (Const16 <t> [d])) (Const16 <t> [c])) 22377 // cond: 22378 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 22379 for { 22380 v_0 := v.Args[0] 22381 if v_0.Op != OpXor16 { 22382 break 22383 } 22384 x := v_0.Args[0] 22385 v_0_1 := v_0.Args[1] 22386 if v_0_1.Op != OpConst16 { 22387 break 22388 } 22389 t := v_0_1.Type 22390 d := v_0_1.AuxInt 22391 v_1 := v.Args[1] 22392 if v_1.Op != OpConst16 { 22393 break 22394 } 22395 if v_1.Type != t { 22396 break 22397 } 22398 c := v_1.AuxInt 22399 v.reset(OpXor16) 22400 v0 := b.NewValue0(v.Pos, OpConst16, t) 22401 v0.AuxInt = int64(int16(c ^ d)) 22402 v.AddArg(v0) 22403 v.AddArg(x) 22404 return true 22405 } 22406 return false 22407 } 22408 func rewriteValuegeneric_OpXor32_0(v *Value) bool { 22409 b := v.Block 22410 _ = b 22411 // match: (Xor32 (Const32 [c]) (Const32 [d])) 22412 // cond: 22413 // result: (Const32 [int64(int32(c^d))]) 22414 for { 22415 v_0 := v.Args[0] 22416 if v_0.Op != OpConst32 { 22417 break 22418 } 22419 c := v_0.AuxInt 22420 v_1 := v.Args[1] 22421 if v_1.Op != OpConst32 { 22422 break 22423 } 22424 d := v_1.AuxInt 22425 v.reset(OpConst32) 22426 v.AuxInt = int64(int32(c ^ d)) 22427 return true 22428 } 22429 // match: (Xor32 (Const32 [d]) (Const32 [c])) 22430 // cond: 22431 // result: (Const32 [int64(int32(c^d))]) 22432 for { 22433 v_0 := v.Args[0] 22434 if v_0.Op != OpConst32 { 22435 break 22436 } 22437 d := v_0.AuxInt 22438 v_1 := v.Args[1] 22439 if v_1.Op != OpConst32 { 22440 break 22441 } 22442 c := v_1.AuxInt 22443 v.reset(OpConst32) 22444 v.AuxInt = int64(int32(c ^ d)) 22445 return true 22446 } 22447 // match: (Xor32 x x) 22448 // cond: 22449 // result: (Const32 [0]) 22450 for { 22451 x := v.Args[0] 22452 if x != v.Args[1] { 22453 break 22454 } 22455 v.reset(OpConst32) 22456 v.AuxInt = 0 22457 return true 22458 } 22459 // match: (Xor32 (Const32 [0]) x) 22460 // cond: 22461 // result: x 22462 for { 22463 v_0 := v.Args[0] 22464 if v_0.Op != OpConst32 { 22465 break 22466 } 22467 if v_0.AuxInt != 0 { 22468 break 22469 } 22470 x := v.Args[1] 22471 v.reset(OpCopy) 22472 v.Type = x.Type 22473 v.AddArg(x) 22474 return true 22475 } 22476 // match: (Xor32 x (Const32 [0])) 22477 // cond: 22478 // result: x 22479 for { 22480 x := v.Args[0] 22481 v_1 := v.Args[1] 22482 if v_1.Op != OpConst32 { 22483 break 22484 } 22485 if v_1.AuxInt != 0 { 22486 break 22487 } 22488 v.reset(OpCopy) 22489 v.Type = x.Type 22490 v.AddArg(x) 22491 return true 22492 } 22493 // match: (Xor32 x (Xor32 x y)) 22494 // cond: 22495 // result: y 22496 for { 22497 x := v.Args[0] 22498 v_1 := v.Args[1] 22499 if v_1.Op != OpXor32 { 22500 break 22501 } 22502 if x != v_1.Args[0] { 22503 break 22504 } 22505 y := v_1.Args[1] 22506 v.reset(OpCopy) 22507 v.Type = y.Type 22508 v.AddArg(y) 22509 return true 22510 } 22511 // match: (Xor32 x (Xor32 y x)) 22512 // cond: 22513 // result: y 22514 for { 22515 x := v.Args[0] 22516 v_1 := v.Args[1] 22517 if v_1.Op != OpXor32 { 22518 break 22519 } 22520 y := v_1.Args[0] 22521 if x != v_1.Args[1] { 22522 break 22523 } 22524 v.reset(OpCopy) 22525 v.Type = y.Type 22526 v.AddArg(y) 22527 return true 22528 } 22529 // match: (Xor32 (Xor32 x y) x) 22530 // cond: 22531 // result: y 22532 for { 22533 v_0 := v.Args[0] 22534 if v_0.Op != OpXor32 { 22535 break 22536 } 22537 x := v_0.Args[0] 22538 y := v_0.Args[1] 22539 if x != v.Args[1] { 22540 break 22541 } 22542 v.reset(OpCopy) 22543 v.Type = y.Type 22544 v.AddArg(y) 22545 return true 22546 } 22547 // match: (Xor32 (Xor32 y x) x) 22548 // cond: 22549 // result: y 22550 for { 22551 v_0 := v.Args[0] 22552 if v_0.Op != OpXor32 { 22553 break 22554 } 22555 y := v_0.Args[0] 22556 x := v_0.Args[1] 22557 if x != v.Args[1] { 22558 break 22559 } 22560 v.reset(OpCopy) 22561 v.Type = y.Type 22562 v.AddArg(y) 22563 return true 22564 } 22565 // match: (Xor32 (Xor32 i:(Const32 <t>) z) x) 22566 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 22567 // result: (Xor32 i (Xor32 <t> z x)) 22568 for { 22569 v_0 := v.Args[0] 22570 if v_0.Op != OpXor32 { 22571 break 22572 } 22573 i := v_0.Args[0] 22574 if i.Op != OpConst32 { 22575 break 22576 } 22577 t := i.Type 22578 z := v_0.Args[1] 22579 x := v.Args[1] 22580 if !(z.Op != OpConst32 && x.Op != OpConst32) { 22581 break 22582 } 22583 v.reset(OpXor32) 22584 v.AddArg(i) 22585 v0 := b.NewValue0(v.Pos, OpXor32, t) 22586 v0.AddArg(z) 22587 v0.AddArg(x) 22588 v.AddArg(v0) 22589 return true 22590 } 22591 return false 22592 } 22593 func rewriteValuegeneric_OpXor32_10(v *Value) bool { 22594 b := v.Block 22595 _ = b 22596 // match: (Xor32 (Xor32 z i:(Const32 <t>)) x) 22597 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 22598 // result: (Xor32 i (Xor32 <t> z x)) 22599 for { 22600 v_0 := v.Args[0] 22601 if v_0.Op != OpXor32 { 22602 break 22603 } 22604 z := v_0.Args[0] 22605 i := v_0.Args[1] 22606 if i.Op != OpConst32 { 22607 break 22608 } 22609 t := i.Type 22610 x := v.Args[1] 22611 if !(z.Op != OpConst32 && x.Op != OpConst32) { 22612 break 22613 } 22614 v.reset(OpXor32) 22615 v.AddArg(i) 22616 v0 := b.NewValue0(v.Pos, OpXor32, t) 22617 v0.AddArg(z) 22618 v0.AddArg(x) 22619 v.AddArg(v0) 22620 return true 22621 } 22622 // match: (Xor32 x (Xor32 i:(Const32 <t>) z)) 22623 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 22624 // result: (Xor32 i (Xor32 <t> z x)) 22625 for { 22626 x := v.Args[0] 22627 v_1 := v.Args[1] 22628 if v_1.Op != OpXor32 { 22629 break 22630 } 22631 i := v_1.Args[0] 22632 if i.Op != OpConst32 { 22633 break 22634 } 22635 t := i.Type 22636 z := v_1.Args[1] 22637 if !(z.Op != OpConst32 && x.Op != OpConst32) { 22638 break 22639 } 22640 v.reset(OpXor32) 22641 v.AddArg(i) 22642 v0 := b.NewValue0(v.Pos, OpXor32, t) 22643 v0.AddArg(z) 22644 v0.AddArg(x) 22645 v.AddArg(v0) 22646 return true 22647 } 22648 // match: (Xor32 x (Xor32 z i:(Const32 <t>))) 22649 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 22650 // result: (Xor32 i (Xor32 <t> z x)) 22651 for { 22652 x := v.Args[0] 22653 v_1 := v.Args[1] 22654 if v_1.Op != OpXor32 { 22655 break 22656 } 22657 z := v_1.Args[0] 22658 i := v_1.Args[1] 22659 if i.Op != OpConst32 { 22660 break 22661 } 22662 t := i.Type 22663 if !(z.Op != OpConst32 && x.Op != OpConst32) { 22664 break 22665 } 22666 v.reset(OpXor32) 22667 v.AddArg(i) 22668 v0 := b.NewValue0(v.Pos, OpXor32, t) 22669 v0.AddArg(z) 22670 v0.AddArg(x) 22671 v.AddArg(v0) 22672 return true 22673 } 22674 // match: (Xor32 (Const32 <t> [c]) (Xor32 (Const32 <t> [d]) x)) 22675 // cond: 22676 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 22677 for { 22678 v_0 := v.Args[0] 22679 if v_0.Op != OpConst32 { 22680 break 22681 } 22682 t := v_0.Type 22683 c := v_0.AuxInt 22684 v_1 := v.Args[1] 22685 if v_1.Op != OpXor32 { 22686 break 22687 } 22688 v_1_0 := v_1.Args[0] 22689 if v_1_0.Op != OpConst32 { 22690 break 22691 } 22692 if v_1_0.Type != t { 22693 break 22694 } 22695 d := v_1_0.AuxInt 22696 x := v_1.Args[1] 22697 v.reset(OpXor32) 22698 v0 := b.NewValue0(v.Pos, OpConst32, t) 22699 v0.AuxInt = int64(int32(c ^ d)) 22700 v.AddArg(v0) 22701 v.AddArg(x) 22702 return true 22703 } 22704 // match: (Xor32 (Const32 <t> [c]) (Xor32 x (Const32 <t> [d]))) 22705 // cond: 22706 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 22707 for { 22708 v_0 := v.Args[0] 22709 if v_0.Op != OpConst32 { 22710 break 22711 } 22712 t := v_0.Type 22713 c := v_0.AuxInt 22714 v_1 := v.Args[1] 22715 if v_1.Op != OpXor32 { 22716 break 22717 } 22718 x := v_1.Args[0] 22719 v_1_1 := v_1.Args[1] 22720 if v_1_1.Op != OpConst32 { 22721 break 22722 } 22723 if v_1_1.Type != t { 22724 break 22725 } 22726 d := v_1_1.AuxInt 22727 v.reset(OpXor32) 22728 v0 := b.NewValue0(v.Pos, OpConst32, t) 22729 v0.AuxInt = int64(int32(c ^ d)) 22730 v.AddArg(v0) 22731 v.AddArg(x) 22732 return true 22733 } 22734 // match: (Xor32 (Xor32 (Const32 <t> [d]) x) (Const32 <t> [c])) 22735 // cond: 22736 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 22737 for { 22738 v_0 := v.Args[0] 22739 if v_0.Op != OpXor32 { 22740 break 22741 } 22742 v_0_0 := v_0.Args[0] 22743 if v_0_0.Op != OpConst32 { 22744 break 22745 } 22746 t := v_0_0.Type 22747 d := v_0_0.AuxInt 22748 x := v_0.Args[1] 22749 v_1 := v.Args[1] 22750 if v_1.Op != OpConst32 { 22751 break 22752 } 22753 if v_1.Type != t { 22754 break 22755 } 22756 c := v_1.AuxInt 22757 v.reset(OpXor32) 22758 v0 := b.NewValue0(v.Pos, OpConst32, t) 22759 v0.AuxInt = int64(int32(c ^ d)) 22760 v.AddArg(v0) 22761 v.AddArg(x) 22762 return true 22763 } 22764 // match: (Xor32 (Xor32 x (Const32 <t> [d])) (Const32 <t> [c])) 22765 // cond: 22766 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 22767 for { 22768 v_0 := v.Args[0] 22769 if v_0.Op != OpXor32 { 22770 break 22771 } 22772 x := v_0.Args[0] 22773 v_0_1 := v_0.Args[1] 22774 if v_0_1.Op != OpConst32 { 22775 break 22776 } 22777 t := v_0_1.Type 22778 d := v_0_1.AuxInt 22779 v_1 := v.Args[1] 22780 if v_1.Op != OpConst32 { 22781 break 22782 } 22783 if v_1.Type != t { 22784 break 22785 } 22786 c := v_1.AuxInt 22787 v.reset(OpXor32) 22788 v0 := b.NewValue0(v.Pos, OpConst32, t) 22789 v0.AuxInt = int64(int32(c ^ d)) 22790 v.AddArg(v0) 22791 v.AddArg(x) 22792 return true 22793 } 22794 return false 22795 } 22796 func rewriteValuegeneric_OpXor64_0(v *Value) bool { 22797 b := v.Block 22798 _ = b 22799 // match: (Xor64 (Const64 [c]) (Const64 [d])) 22800 // cond: 22801 // result: (Const64 [c^d]) 22802 for { 22803 v_0 := v.Args[0] 22804 if v_0.Op != OpConst64 { 22805 break 22806 } 22807 c := v_0.AuxInt 22808 v_1 := v.Args[1] 22809 if v_1.Op != OpConst64 { 22810 break 22811 } 22812 d := v_1.AuxInt 22813 v.reset(OpConst64) 22814 v.AuxInt = c ^ d 22815 return true 22816 } 22817 // match: (Xor64 (Const64 [d]) (Const64 [c])) 22818 // cond: 22819 // result: (Const64 [c^d]) 22820 for { 22821 v_0 := v.Args[0] 22822 if v_0.Op != OpConst64 { 22823 break 22824 } 22825 d := v_0.AuxInt 22826 v_1 := v.Args[1] 22827 if v_1.Op != OpConst64 { 22828 break 22829 } 22830 c := v_1.AuxInt 22831 v.reset(OpConst64) 22832 v.AuxInt = c ^ d 22833 return true 22834 } 22835 // match: (Xor64 x x) 22836 // cond: 22837 // result: (Const64 [0]) 22838 for { 22839 x := v.Args[0] 22840 if x != v.Args[1] { 22841 break 22842 } 22843 v.reset(OpConst64) 22844 v.AuxInt = 0 22845 return true 22846 } 22847 // match: (Xor64 (Const64 [0]) x) 22848 // cond: 22849 // result: x 22850 for { 22851 v_0 := v.Args[0] 22852 if v_0.Op != OpConst64 { 22853 break 22854 } 22855 if v_0.AuxInt != 0 { 22856 break 22857 } 22858 x := v.Args[1] 22859 v.reset(OpCopy) 22860 v.Type = x.Type 22861 v.AddArg(x) 22862 return true 22863 } 22864 // match: (Xor64 x (Const64 [0])) 22865 // cond: 22866 // result: x 22867 for { 22868 x := v.Args[0] 22869 v_1 := v.Args[1] 22870 if v_1.Op != OpConst64 { 22871 break 22872 } 22873 if v_1.AuxInt != 0 { 22874 break 22875 } 22876 v.reset(OpCopy) 22877 v.Type = x.Type 22878 v.AddArg(x) 22879 return true 22880 } 22881 // match: (Xor64 x (Xor64 x y)) 22882 // cond: 22883 // result: y 22884 for { 22885 x := v.Args[0] 22886 v_1 := v.Args[1] 22887 if v_1.Op != OpXor64 { 22888 break 22889 } 22890 if x != v_1.Args[0] { 22891 break 22892 } 22893 y := v_1.Args[1] 22894 v.reset(OpCopy) 22895 v.Type = y.Type 22896 v.AddArg(y) 22897 return true 22898 } 22899 // match: (Xor64 x (Xor64 y x)) 22900 // cond: 22901 // result: y 22902 for { 22903 x := v.Args[0] 22904 v_1 := v.Args[1] 22905 if v_1.Op != OpXor64 { 22906 break 22907 } 22908 y := v_1.Args[0] 22909 if x != v_1.Args[1] { 22910 break 22911 } 22912 v.reset(OpCopy) 22913 v.Type = y.Type 22914 v.AddArg(y) 22915 return true 22916 } 22917 // match: (Xor64 (Xor64 x y) x) 22918 // cond: 22919 // result: y 22920 for { 22921 v_0 := v.Args[0] 22922 if v_0.Op != OpXor64 { 22923 break 22924 } 22925 x := v_0.Args[0] 22926 y := v_0.Args[1] 22927 if x != v.Args[1] { 22928 break 22929 } 22930 v.reset(OpCopy) 22931 v.Type = y.Type 22932 v.AddArg(y) 22933 return true 22934 } 22935 // match: (Xor64 (Xor64 y x) x) 22936 // cond: 22937 // result: y 22938 for { 22939 v_0 := v.Args[0] 22940 if v_0.Op != OpXor64 { 22941 break 22942 } 22943 y := v_0.Args[0] 22944 x := v_0.Args[1] 22945 if x != v.Args[1] { 22946 break 22947 } 22948 v.reset(OpCopy) 22949 v.Type = y.Type 22950 v.AddArg(y) 22951 return true 22952 } 22953 // match: (Xor64 (Xor64 i:(Const64 <t>) z) x) 22954 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 22955 // result: (Xor64 i (Xor64 <t> z x)) 22956 for { 22957 v_0 := v.Args[0] 22958 if v_0.Op != OpXor64 { 22959 break 22960 } 22961 i := v_0.Args[0] 22962 if i.Op != OpConst64 { 22963 break 22964 } 22965 t := i.Type 22966 z := v_0.Args[1] 22967 x := v.Args[1] 22968 if !(z.Op != OpConst64 && x.Op != OpConst64) { 22969 break 22970 } 22971 v.reset(OpXor64) 22972 v.AddArg(i) 22973 v0 := b.NewValue0(v.Pos, OpXor64, t) 22974 v0.AddArg(z) 22975 v0.AddArg(x) 22976 v.AddArg(v0) 22977 return true 22978 } 22979 return false 22980 } 22981 func rewriteValuegeneric_OpXor64_10(v *Value) bool { 22982 b := v.Block 22983 _ = b 22984 // match: (Xor64 (Xor64 z i:(Const64 <t>)) x) 22985 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 22986 // result: (Xor64 i (Xor64 <t> z x)) 22987 for { 22988 v_0 := v.Args[0] 22989 if v_0.Op != OpXor64 { 22990 break 22991 } 22992 z := v_0.Args[0] 22993 i := v_0.Args[1] 22994 if i.Op != OpConst64 { 22995 break 22996 } 22997 t := i.Type 22998 x := v.Args[1] 22999 if !(z.Op != OpConst64 && x.Op != OpConst64) { 23000 break 23001 } 23002 v.reset(OpXor64) 23003 v.AddArg(i) 23004 v0 := b.NewValue0(v.Pos, OpXor64, t) 23005 v0.AddArg(z) 23006 v0.AddArg(x) 23007 v.AddArg(v0) 23008 return true 23009 } 23010 // match: (Xor64 x (Xor64 i:(Const64 <t>) z)) 23011 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 23012 // result: (Xor64 i (Xor64 <t> z x)) 23013 for { 23014 x := v.Args[0] 23015 v_1 := v.Args[1] 23016 if v_1.Op != OpXor64 { 23017 break 23018 } 23019 i := v_1.Args[0] 23020 if i.Op != OpConst64 { 23021 break 23022 } 23023 t := i.Type 23024 z := v_1.Args[1] 23025 if !(z.Op != OpConst64 && x.Op != OpConst64) { 23026 break 23027 } 23028 v.reset(OpXor64) 23029 v.AddArg(i) 23030 v0 := b.NewValue0(v.Pos, OpXor64, t) 23031 v0.AddArg(z) 23032 v0.AddArg(x) 23033 v.AddArg(v0) 23034 return true 23035 } 23036 // match: (Xor64 x (Xor64 z i:(Const64 <t>))) 23037 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 23038 // result: (Xor64 i (Xor64 <t> z x)) 23039 for { 23040 x := v.Args[0] 23041 v_1 := v.Args[1] 23042 if v_1.Op != OpXor64 { 23043 break 23044 } 23045 z := v_1.Args[0] 23046 i := v_1.Args[1] 23047 if i.Op != OpConst64 { 23048 break 23049 } 23050 t := i.Type 23051 if !(z.Op != OpConst64 && x.Op != OpConst64) { 23052 break 23053 } 23054 v.reset(OpXor64) 23055 v.AddArg(i) 23056 v0 := b.NewValue0(v.Pos, OpXor64, t) 23057 v0.AddArg(z) 23058 v0.AddArg(x) 23059 v.AddArg(v0) 23060 return true 23061 } 23062 // match: (Xor64 (Const64 <t> [c]) (Xor64 (Const64 <t> [d]) x)) 23063 // cond: 23064 // result: (Xor64 (Const64 <t> [c^d]) x) 23065 for { 23066 v_0 := v.Args[0] 23067 if v_0.Op != OpConst64 { 23068 break 23069 } 23070 t := v_0.Type 23071 c := v_0.AuxInt 23072 v_1 := v.Args[1] 23073 if v_1.Op != OpXor64 { 23074 break 23075 } 23076 v_1_0 := v_1.Args[0] 23077 if v_1_0.Op != OpConst64 { 23078 break 23079 } 23080 if v_1_0.Type != t { 23081 break 23082 } 23083 d := v_1_0.AuxInt 23084 x := v_1.Args[1] 23085 v.reset(OpXor64) 23086 v0 := b.NewValue0(v.Pos, OpConst64, t) 23087 v0.AuxInt = c ^ d 23088 v.AddArg(v0) 23089 v.AddArg(x) 23090 return true 23091 } 23092 // match: (Xor64 (Const64 <t> [c]) (Xor64 x (Const64 <t> [d]))) 23093 // cond: 23094 // result: (Xor64 (Const64 <t> [c^d]) x) 23095 for { 23096 v_0 := v.Args[0] 23097 if v_0.Op != OpConst64 { 23098 break 23099 } 23100 t := v_0.Type 23101 c := v_0.AuxInt 23102 v_1 := v.Args[1] 23103 if v_1.Op != OpXor64 { 23104 break 23105 } 23106 x := v_1.Args[0] 23107 v_1_1 := v_1.Args[1] 23108 if v_1_1.Op != OpConst64 { 23109 break 23110 } 23111 if v_1_1.Type != t { 23112 break 23113 } 23114 d := v_1_1.AuxInt 23115 v.reset(OpXor64) 23116 v0 := b.NewValue0(v.Pos, OpConst64, t) 23117 v0.AuxInt = c ^ d 23118 v.AddArg(v0) 23119 v.AddArg(x) 23120 return true 23121 } 23122 // match: (Xor64 (Xor64 (Const64 <t> [d]) x) (Const64 <t> [c])) 23123 // cond: 23124 // result: (Xor64 (Const64 <t> [c^d]) x) 23125 for { 23126 v_0 := v.Args[0] 23127 if v_0.Op != OpXor64 { 23128 break 23129 } 23130 v_0_0 := v_0.Args[0] 23131 if v_0_0.Op != OpConst64 { 23132 break 23133 } 23134 t := v_0_0.Type 23135 d := v_0_0.AuxInt 23136 x := v_0.Args[1] 23137 v_1 := v.Args[1] 23138 if v_1.Op != OpConst64 { 23139 break 23140 } 23141 if v_1.Type != t { 23142 break 23143 } 23144 c := v_1.AuxInt 23145 v.reset(OpXor64) 23146 v0 := b.NewValue0(v.Pos, OpConst64, t) 23147 v0.AuxInt = c ^ d 23148 v.AddArg(v0) 23149 v.AddArg(x) 23150 return true 23151 } 23152 // match: (Xor64 (Xor64 x (Const64 <t> [d])) (Const64 <t> [c])) 23153 // cond: 23154 // result: (Xor64 (Const64 <t> [c^d]) x) 23155 for { 23156 v_0 := v.Args[0] 23157 if v_0.Op != OpXor64 { 23158 break 23159 } 23160 x := v_0.Args[0] 23161 v_0_1 := v_0.Args[1] 23162 if v_0_1.Op != OpConst64 { 23163 break 23164 } 23165 t := v_0_1.Type 23166 d := v_0_1.AuxInt 23167 v_1 := v.Args[1] 23168 if v_1.Op != OpConst64 { 23169 break 23170 } 23171 if v_1.Type != t { 23172 break 23173 } 23174 c := v_1.AuxInt 23175 v.reset(OpXor64) 23176 v0 := b.NewValue0(v.Pos, OpConst64, t) 23177 v0.AuxInt = c ^ d 23178 v.AddArg(v0) 23179 v.AddArg(x) 23180 return true 23181 } 23182 return false 23183 } 23184 func rewriteValuegeneric_OpXor8_0(v *Value) bool { 23185 b := v.Block 23186 _ = b 23187 // match: (Xor8 (Const8 [c]) (Const8 [d])) 23188 // cond: 23189 // result: (Const8 [int64(int8(c^d))]) 23190 for { 23191 v_0 := v.Args[0] 23192 if v_0.Op != OpConst8 { 23193 break 23194 } 23195 c := v_0.AuxInt 23196 v_1 := v.Args[1] 23197 if v_1.Op != OpConst8 { 23198 break 23199 } 23200 d := v_1.AuxInt 23201 v.reset(OpConst8) 23202 v.AuxInt = int64(int8(c ^ d)) 23203 return true 23204 } 23205 // match: (Xor8 (Const8 [d]) (Const8 [c])) 23206 // cond: 23207 // result: (Const8 [int64(int8(c^d))]) 23208 for { 23209 v_0 := v.Args[0] 23210 if v_0.Op != OpConst8 { 23211 break 23212 } 23213 d := v_0.AuxInt 23214 v_1 := v.Args[1] 23215 if v_1.Op != OpConst8 { 23216 break 23217 } 23218 c := v_1.AuxInt 23219 v.reset(OpConst8) 23220 v.AuxInt = int64(int8(c ^ d)) 23221 return true 23222 } 23223 // match: (Xor8 x x) 23224 // cond: 23225 // result: (Const8 [0]) 23226 for { 23227 x := v.Args[0] 23228 if x != v.Args[1] { 23229 break 23230 } 23231 v.reset(OpConst8) 23232 v.AuxInt = 0 23233 return true 23234 } 23235 // match: (Xor8 (Const8 [0]) x) 23236 // cond: 23237 // result: x 23238 for { 23239 v_0 := v.Args[0] 23240 if v_0.Op != OpConst8 { 23241 break 23242 } 23243 if v_0.AuxInt != 0 { 23244 break 23245 } 23246 x := v.Args[1] 23247 v.reset(OpCopy) 23248 v.Type = x.Type 23249 v.AddArg(x) 23250 return true 23251 } 23252 // match: (Xor8 x (Const8 [0])) 23253 // cond: 23254 // result: x 23255 for { 23256 x := v.Args[0] 23257 v_1 := v.Args[1] 23258 if v_1.Op != OpConst8 { 23259 break 23260 } 23261 if v_1.AuxInt != 0 { 23262 break 23263 } 23264 v.reset(OpCopy) 23265 v.Type = x.Type 23266 v.AddArg(x) 23267 return true 23268 } 23269 // match: (Xor8 x (Xor8 x y)) 23270 // cond: 23271 // result: y 23272 for { 23273 x := v.Args[0] 23274 v_1 := v.Args[1] 23275 if v_1.Op != OpXor8 { 23276 break 23277 } 23278 if x != v_1.Args[0] { 23279 break 23280 } 23281 y := v_1.Args[1] 23282 v.reset(OpCopy) 23283 v.Type = y.Type 23284 v.AddArg(y) 23285 return true 23286 } 23287 // match: (Xor8 x (Xor8 y x)) 23288 // cond: 23289 // result: y 23290 for { 23291 x := v.Args[0] 23292 v_1 := v.Args[1] 23293 if v_1.Op != OpXor8 { 23294 break 23295 } 23296 y := v_1.Args[0] 23297 if x != v_1.Args[1] { 23298 break 23299 } 23300 v.reset(OpCopy) 23301 v.Type = y.Type 23302 v.AddArg(y) 23303 return true 23304 } 23305 // match: (Xor8 (Xor8 x y) x) 23306 // cond: 23307 // result: y 23308 for { 23309 v_0 := v.Args[0] 23310 if v_0.Op != OpXor8 { 23311 break 23312 } 23313 x := v_0.Args[0] 23314 y := v_0.Args[1] 23315 if x != v.Args[1] { 23316 break 23317 } 23318 v.reset(OpCopy) 23319 v.Type = y.Type 23320 v.AddArg(y) 23321 return true 23322 } 23323 // match: (Xor8 (Xor8 y x) x) 23324 // cond: 23325 // result: y 23326 for { 23327 v_0 := v.Args[0] 23328 if v_0.Op != OpXor8 { 23329 break 23330 } 23331 y := v_0.Args[0] 23332 x := v_0.Args[1] 23333 if x != v.Args[1] { 23334 break 23335 } 23336 v.reset(OpCopy) 23337 v.Type = y.Type 23338 v.AddArg(y) 23339 return true 23340 } 23341 // match: (Xor8 (Xor8 i:(Const8 <t>) z) x) 23342 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 23343 // result: (Xor8 i (Xor8 <t> z x)) 23344 for { 23345 v_0 := v.Args[0] 23346 if v_0.Op != OpXor8 { 23347 break 23348 } 23349 i := v_0.Args[0] 23350 if i.Op != OpConst8 { 23351 break 23352 } 23353 t := i.Type 23354 z := v_0.Args[1] 23355 x := v.Args[1] 23356 if !(z.Op != OpConst8 && x.Op != OpConst8) { 23357 break 23358 } 23359 v.reset(OpXor8) 23360 v.AddArg(i) 23361 v0 := b.NewValue0(v.Pos, OpXor8, t) 23362 v0.AddArg(z) 23363 v0.AddArg(x) 23364 v.AddArg(v0) 23365 return true 23366 } 23367 return false 23368 } 23369 func rewriteValuegeneric_OpXor8_10(v *Value) bool { 23370 b := v.Block 23371 _ = b 23372 // match: (Xor8 (Xor8 z i:(Const8 <t>)) x) 23373 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 23374 // result: (Xor8 i (Xor8 <t> z x)) 23375 for { 23376 v_0 := v.Args[0] 23377 if v_0.Op != OpXor8 { 23378 break 23379 } 23380 z := v_0.Args[0] 23381 i := v_0.Args[1] 23382 if i.Op != OpConst8 { 23383 break 23384 } 23385 t := i.Type 23386 x := v.Args[1] 23387 if !(z.Op != OpConst8 && x.Op != OpConst8) { 23388 break 23389 } 23390 v.reset(OpXor8) 23391 v.AddArg(i) 23392 v0 := b.NewValue0(v.Pos, OpXor8, t) 23393 v0.AddArg(z) 23394 v0.AddArg(x) 23395 v.AddArg(v0) 23396 return true 23397 } 23398 // match: (Xor8 x (Xor8 i:(Const8 <t>) z)) 23399 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 23400 // result: (Xor8 i (Xor8 <t> z x)) 23401 for { 23402 x := v.Args[0] 23403 v_1 := v.Args[1] 23404 if v_1.Op != OpXor8 { 23405 break 23406 } 23407 i := v_1.Args[0] 23408 if i.Op != OpConst8 { 23409 break 23410 } 23411 t := i.Type 23412 z := v_1.Args[1] 23413 if !(z.Op != OpConst8 && x.Op != OpConst8) { 23414 break 23415 } 23416 v.reset(OpXor8) 23417 v.AddArg(i) 23418 v0 := b.NewValue0(v.Pos, OpXor8, t) 23419 v0.AddArg(z) 23420 v0.AddArg(x) 23421 v.AddArg(v0) 23422 return true 23423 } 23424 // match: (Xor8 x (Xor8 z i:(Const8 <t>))) 23425 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 23426 // result: (Xor8 i (Xor8 <t> z x)) 23427 for { 23428 x := v.Args[0] 23429 v_1 := v.Args[1] 23430 if v_1.Op != OpXor8 { 23431 break 23432 } 23433 z := v_1.Args[0] 23434 i := v_1.Args[1] 23435 if i.Op != OpConst8 { 23436 break 23437 } 23438 t := i.Type 23439 if !(z.Op != OpConst8 && x.Op != OpConst8) { 23440 break 23441 } 23442 v.reset(OpXor8) 23443 v.AddArg(i) 23444 v0 := b.NewValue0(v.Pos, OpXor8, t) 23445 v0.AddArg(z) 23446 v0.AddArg(x) 23447 v.AddArg(v0) 23448 return true 23449 } 23450 // match: (Xor8 (Const8 <t> [c]) (Xor8 (Const8 <t> [d]) x)) 23451 // cond: 23452 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 23453 for { 23454 v_0 := v.Args[0] 23455 if v_0.Op != OpConst8 { 23456 break 23457 } 23458 t := v_0.Type 23459 c := v_0.AuxInt 23460 v_1 := v.Args[1] 23461 if v_1.Op != OpXor8 { 23462 break 23463 } 23464 v_1_0 := v_1.Args[0] 23465 if v_1_0.Op != OpConst8 { 23466 break 23467 } 23468 if v_1_0.Type != t { 23469 break 23470 } 23471 d := v_1_0.AuxInt 23472 x := v_1.Args[1] 23473 v.reset(OpXor8) 23474 v0 := b.NewValue0(v.Pos, OpConst8, t) 23475 v0.AuxInt = int64(int8(c ^ d)) 23476 v.AddArg(v0) 23477 v.AddArg(x) 23478 return true 23479 } 23480 // match: (Xor8 (Const8 <t> [c]) (Xor8 x (Const8 <t> [d]))) 23481 // cond: 23482 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 23483 for { 23484 v_0 := v.Args[0] 23485 if v_0.Op != OpConst8 { 23486 break 23487 } 23488 t := v_0.Type 23489 c := v_0.AuxInt 23490 v_1 := v.Args[1] 23491 if v_1.Op != OpXor8 { 23492 break 23493 } 23494 x := v_1.Args[0] 23495 v_1_1 := v_1.Args[1] 23496 if v_1_1.Op != OpConst8 { 23497 break 23498 } 23499 if v_1_1.Type != t { 23500 break 23501 } 23502 d := v_1_1.AuxInt 23503 v.reset(OpXor8) 23504 v0 := b.NewValue0(v.Pos, OpConst8, t) 23505 v0.AuxInt = int64(int8(c ^ d)) 23506 v.AddArg(v0) 23507 v.AddArg(x) 23508 return true 23509 } 23510 // match: (Xor8 (Xor8 (Const8 <t> [d]) x) (Const8 <t> [c])) 23511 // cond: 23512 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 23513 for { 23514 v_0 := v.Args[0] 23515 if v_0.Op != OpXor8 { 23516 break 23517 } 23518 v_0_0 := v_0.Args[0] 23519 if v_0_0.Op != OpConst8 { 23520 break 23521 } 23522 t := v_0_0.Type 23523 d := v_0_0.AuxInt 23524 x := v_0.Args[1] 23525 v_1 := v.Args[1] 23526 if v_1.Op != OpConst8 { 23527 break 23528 } 23529 if v_1.Type != t { 23530 break 23531 } 23532 c := v_1.AuxInt 23533 v.reset(OpXor8) 23534 v0 := b.NewValue0(v.Pos, OpConst8, t) 23535 v0.AuxInt = int64(int8(c ^ d)) 23536 v.AddArg(v0) 23537 v.AddArg(x) 23538 return true 23539 } 23540 // match: (Xor8 (Xor8 x (Const8 <t> [d])) (Const8 <t> [c])) 23541 // cond: 23542 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 23543 for { 23544 v_0 := v.Args[0] 23545 if v_0.Op != OpXor8 { 23546 break 23547 } 23548 x := v_0.Args[0] 23549 v_0_1 := v_0.Args[1] 23550 if v_0_1.Op != OpConst8 { 23551 break 23552 } 23553 t := v_0_1.Type 23554 d := v_0_1.AuxInt 23555 v_1 := v.Args[1] 23556 if v_1.Op != OpConst8 { 23557 break 23558 } 23559 if v_1.Type != t { 23560 break 23561 } 23562 c := v_1.AuxInt 23563 v.reset(OpXor8) 23564 v0 := b.NewValue0(v.Pos, OpConst8, t) 23565 v0.AuxInt = int64(int8(c ^ d)) 23566 v.AddArg(v0) 23567 v.AddArg(x) 23568 return true 23569 } 23570 return false 23571 } 23572 func rewriteValuegeneric_OpZero_0(v *Value) bool { 23573 b := v.Block 23574 _ = b 23575 config := b.Func.Config 23576 _ = config 23577 // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) 23578 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 23579 // result: mem 23580 for { 23581 v_0 := v.Args[0] 23582 if v_0.Op != OpLoad { 23583 break 23584 } 23585 v_0_0 := v_0.Args[0] 23586 if v_0_0.Op != OpOffPtr { 23587 break 23588 } 23589 c := v_0_0.AuxInt 23590 v_0_0_0 := v_0_0.Args[0] 23591 if v_0_0_0.Op != OpSP { 23592 break 23593 } 23594 mem := v_0.Args[1] 23595 if mem != v.Args[1] { 23596 break 23597 } 23598 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 23599 break 23600 } 23601 v.reset(OpCopy) 23602 v.Type = mem.Type 23603 v.AddArg(mem) 23604 return true 23605 } 23606 return false 23607 } 23608 func rewriteValuegeneric_OpZeroExt16to32_0(v *Value) bool { 23609 // match: (ZeroExt16to32 (Const16 [c])) 23610 // cond: 23611 // result: (Const32 [int64(uint16(c))]) 23612 for { 23613 v_0 := v.Args[0] 23614 if v_0.Op != OpConst16 { 23615 break 23616 } 23617 c := v_0.AuxInt 23618 v.reset(OpConst32) 23619 v.AuxInt = int64(uint16(c)) 23620 return true 23621 } 23622 // match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s])))) 23623 // cond: s >= 16 23624 // result: x 23625 for { 23626 v_0 := v.Args[0] 23627 if v_0.Op != OpTrunc32to16 { 23628 break 23629 } 23630 x := v_0.Args[0] 23631 if x.Op != OpRsh32Ux64 { 23632 break 23633 } 23634 x_1 := x.Args[1] 23635 if x_1.Op != OpConst64 { 23636 break 23637 } 23638 s := x_1.AuxInt 23639 if !(s >= 16) { 23640 break 23641 } 23642 v.reset(OpCopy) 23643 v.Type = x.Type 23644 v.AddArg(x) 23645 return true 23646 } 23647 return false 23648 } 23649 func rewriteValuegeneric_OpZeroExt16to64_0(v *Value) bool { 23650 // match: (ZeroExt16to64 (Const16 [c])) 23651 // cond: 23652 // result: (Const64 [int64(uint16(c))]) 23653 for { 23654 v_0 := v.Args[0] 23655 if v_0.Op != OpConst16 { 23656 break 23657 } 23658 c := v_0.AuxInt 23659 v.reset(OpConst64) 23660 v.AuxInt = int64(uint16(c)) 23661 return true 23662 } 23663 // match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s])))) 23664 // cond: s >= 48 23665 // result: x 23666 for { 23667 v_0 := v.Args[0] 23668 if v_0.Op != OpTrunc64to16 { 23669 break 23670 } 23671 x := v_0.Args[0] 23672 if x.Op != OpRsh64Ux64 { 23673 break 23674 } 23675 x_1 := x.Args[1] 23676 if x_1.Op != OpConst64 { 23677 break 23678 } 23679 s := x_1.AuxInt 23680 if !(s >= 48) { 23681 break 23682 } 23683 v.reset(OpCopy) 23684 v.Type = x.Type 23685 v.AddArg(x) 23686 return true 23687 } 23688 return false 23689 } 23690 func rewriteValuegeneric_OpZeroExt32to64_0(v *Value) bool { 23691 // match: (ZeroExt32to64 (Const32 [c])) 23692 // cond: 23693 // result: (Const64 [int64(uint32(c))]) 23694 for { 23695 v_0 := v.Args[0] 23696 if v_0.Op != OpConst32 { 23697 break 23698 } 23699 c := v_0.AuxInt 23700 v.reset(OpConst64) 23701 v.AuxInt = int64(uint32(c)) 23702 return true 23703 } 23704 // match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s])))) 23705 // cond: s >= 32 23706 // result: x 23707 for { 23708 v_0 := v.Args[0] 23709 if v_0.Op != OpTrunc64to32 { 23710 break 23711 } 23712 x := v_0.Args[0] 23713 if x.Op != OpRsh64Ux64 { 23714 break 23715 } 23716 x_1 := x.Args[1] 23717 if x_1.Op != OpConst64 { 23718 break 23719 } 23720 s := x_1.AuxInt 23721 if !(s >= 32) { 23722 break 23723 } 23724 v.reset(OpCopy) 23725 v.Type = x.Type 23726 v.AddArg(x) 23727 return true 23728 } 23729 return false 23730 } 23731 func rewriteValuegeneric_OpZeroExt8to16_0(v *Value) bool { 23732 // match: (ZeroExt8to16 (Const8 [c])) 23733 // cond: 23734 // result: (Const16 [int64( uint8(c))]) 23735 for { 23736 v_0 := v.Args[0] 23737 if v_0.Op != OpConst8 { 23738 break 23739 } 23740 c := v_0.AuxInt 23741 v.reset(OpConst16) 23742 v.AuxInt = int64(uint8(c)) 23743 return true 23744 } 23745 // match: (ZeroExt8to16 (Trunc16to8 x:(Rsh16Ux64 _ (Const64 [s])))) 23746 // cond: s >= 8 23747 // result: x 23748 for { 23749 v_0 := v.Args[0] 23750 if v_0.Op != OpTrunc16to8 { 23751 break 23752 } 23753 x := v_0.Args[0] 23754 if x.Op != OpRsh16Ux64 { 23755 break 23756 } 23757 x_1 := x.Args[1] 23758 if x_1.Op != OpConst64 { 23759 break 23760 } 23761 s := x_1.AuxInt 23762 if !(s >= 8) { 23763 break 23764 } 23765 v.reset(OpCopy) 23766 v.Type = x.Type 23767 v.AddArg(x) 23768 return true 23769 } 23770 return false 23771 } 23772 func rewriteValuegeneric_OpZeroExt8to32_0(v *Value) bool { 23773 // match: (ZeroExt8to32 (Const8 [c])) 23774 // cond: 23775 // result: (Const32 [int64( uint8(c))]) 23776 for { 23777 v_0 := v.Args[0] 23778 if v_0.Op != OpConst8 { 23779 break 23780 } 23781 c := v_0.AuxInt 23782 v.reset(OpConst32) 23783 v.AuxInt = int64(uint8(c)) 23784 return true 23785 } 23786 // match: (ZeroExt8to32 (Trunc32to8 x:(Rsh32Ux64 _ (Const64 [s])))) 23787 // cond: s >= 24 23788 // result: x 23789 for { 23790 v_0 := v.Args[0] 23791 if v_0.Op != OpTrunc32to8 { 23792 break 23793 } 23794 x := v_0.Args[0] 23795 if x.Op != OpRsh32Ux64 { 23796 break 23797 } 23798 x_1 := x.Args[1] 23799 if x_1.Op != OpConst64 { 23800 break 23801 } 23802 s := x_1.AuxInt 23803 if !(s >= 24) { 23804 break 23805 } 23806 v.reset(OpCopy) 23807 v.Type = x.Type 23808 v.AddArg(x) 23809 return true 23810 } 23811 return false 23812 } 23813 func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { 23814 // match: (ZeroExt8to64 (Const8 [c])) 23815 // cond: 23816 // result: (Const64 [int64( uint8(c))]) 23817 for { 23818 v_0 := v.Args[0] 23819 if v_0.Op != OpConst8 { 23820 break 23821 } 23822 c := v_0.AuxInt 23823 v.reset(OpConst64) 23824 v.AuxInt = int64(uint8(c)) 23825 return true 23826 } 23827 // match: (ZeroExt8to64 (Trunc64to8 x:(Rsh64Ux64 _ (Const64 [s])))) 23828 // cond: s >= 56 23829 // result: x 23830 for { 23831 v_0 := v.Args[0] 23832 if v_0.Op != OpTrunc64to8 { 23833 break 23834 } 23835 x := v_0.Args[0] 23836 if x.Op != OpRsh64Ux64 { 23837 break 23838 } 23839 x_1 := x.Args[1] 23840 if x_1.Op != OpConst64 { 23841 break 23842 } 23843 s := x_1.AuxInt 23844 if !(s >= 56) { 23845 break 23846 } 23847 v.reset(OpCopy) 23848 v.Type = x.Type 23849 v.AddArg(x) 23850 return true 23851 } 23852 return false 23853 } 23854 func rewriteBlockgeneric(b *Block) bool { 23855 config := b.Func.Config 23856 _ = config 23857 fe := b.Func.fe 23858 _ = fe 23859 types := &config.Types 23860 _ = types 23861 switch b.Kind { 23862 case BlockIf: 23863 // match: (If (Not cond) yes no) 23864 // cond: 23865 // result: (If cond no yes) 23866 for { 23867 v := b.Control 23868 if v.Op != OpNot { 23869 break 23870 } 23871 cond := v.Args[0] 23872 b.Kind = BlockIf 23873 b.SetControl(cond) 23874 b.swapSuccessors() 23875 return true 23876 } 23877 // match: (If (ConstBool [c]) yes no) 23878 // cond: c == 1 23879 // result: (First nil yes no) 23880 for { 23881 v := b.Control 23882 if v.Op != OpConstBool { 23883 break 23884 } 23885 c := v.AuxInt 23886 if !(c == 1) { 23887 break 23888 } 23889 b.Kind = BlockFirst 23890 b.SetControl(nil) 23891 return true 23892 } 23893 // match: (If (ConstBool [c]) yes no) 23894 // cond: c == 0 23895 // result: (First nil no yes) 23896 for { 23897 v := b.Control 23898 if v.Op != OpConstBool { 23899 break 23900 } 23901 c := v.AuxInt 23902 if !(c == 0) { 23903 break 23904 } 23905 b.Kind = BlockFirst 23906 b.SetControl(nil) 23907 b.swapSuccessors() 23908 return true 23909 } 23910 } 23911 return false 23912 }