github.com/zxy12/golang_with_comment@v0.0.0-20190701084843-0e6b2aff5ef3/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 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValuegeneric(v *Value) bool { 17 switch v.Op { 18 case OpAdd16: 19 return rewriteValuegeneric_OpAdd16_0(v) || rewriteValuegeneric_OpAdd16_10(v) || rewriteValuegeneric_OpAdd16_20(v) 20 case OpAdd32: 21 return rewriteValuegeneric_OpAdd32_0(v) || rewriteValuegeneric_OpAdd32_10(v) || rewriteValuegeneric_OpAdd32_20(v) 22 case OpAdd32F: 23 return rewriteValuegeneric_OpAdd32F_0(v) 24 case OpAdd64: 25 return rewriteValuegeneric_OpAdd64_0(v) || rewriteValuegeneric_OpAdd64_10(v) || rewriteValuegeneric_OpAdd64_20(v) 26 case OpAdd64F: 27 return rewriteValuegeneric_OpAdd64F_0(v) 28 case OpAdd8: 29 return rewriteValuegeneric_OpAdd8_0(v) || rewriteValuegeneric_OpAdd8_10(v) || rewriteValuegeneric_OpAdd8_20(v) 30 case OpAddPtr: 31 return rewriteValuegeneric_OpAddPtr_0(v) 32 case OpAnd16: 33 return rewriteValuegeneric_OpAnd16_0(v) || rewriteValuegeneric_OpAnd16_10(v) 34 case OpAnd32: 35 return rewriteValuegeneric_OpAnd32_0(v) || rewriteValuegeneric_OpAnd32_10(v) 36 case OpAnd64: 37 return rewriteValuegeneric_OpAnd64_0(v) || rewriteValuegeneric_OpAnd64_10(v) || rewriteValuegeneric_OpAnd64_20(v) 38 case OpAnd8: 39 return rewriteValuegeneric_OpAnd8_0(v) || rewriteValuegeneric_OpAnd8_10(v) 40 case OpArg: 41 return rewriteValuegeneric_OpArg_0(v) || rewriteValuegeneric_OpArg_10(v) 42 case OpArraySelect: 43 return rewriteValuegeneric_OpArraySelect_0(v) 44 case OpCom16: 45 return rewriteValuegeneric_OpCom16_0(v) 46 case OpCom32: 47 return rewriteValuegeneric_OpCom32_0(v) 48 case OpCom64: 49 return rewriteValuegeneric_OpCom64_0(v) 50 case OpCom8: 51 return rewriteValuegeneric_OpCom8_0(v) 52 case OpConstInterface: 53 return rewriteValuegeneric_OpConstInterface_0(v) 54 case OpConstSlice: 55 return rewriteValuegeneric_OpConstSlice_0(v) 56 case OpConstString: 57 return rewriteValuegeneric_OpConstString_0(v) 58 case OpConvert: 59 return rewriteValuegeneric_OpConvert_0(v) 60 case OpCvt32Fto64F: 61 return rewriteValuegeneric_OpCvt32Fto64F_0(v) 62 case OpCvt64Fto32F: 63 return rewriteValuegeneric_OpCvt64Fto32F_0(v) 64 case OpDiv16: 65 return rewriteValuegeneric_OpDiv16_0(v) 66 case OpDiv16u: 67 return rewriteValuegeneric_OpDiv16u_0(v) 68 case OpDiv32: 69 return rewriteValuegeneric_OpDiv32_0(v) 70 case OpDiv32F: 71 return rewriteValuegeneric_OpDiv32F_0(v) 72 case OpDiv32u: 73 return rewriteValuegeneric_OpDiv32u_0(v) 74 case OpDiv64: 75 return rewriteValuegeneric_OpDiv64_0(v) 76 case OpDiv64F: 77 return rewriteValuegeneric_OpDiv64F_0(v) 78 case OpDiv64u: 79 return rewriteValuegeneric_OpDiv64u_0(v) 80 case OpDiv8: 81 return rewriteValuegeneric_OpDiv8_0(v) 82 case OpDiv8u: 83 return rewriteValuegeneric_OpDiv8u_0(v) 84 case OpEq16: 85 return rewriteValuegeneric_OpEq16_0(v) 86 case OpEq32: 87 return rewriteValuegeneric_OpEq32_0(v) 88 case OpEq64: 89 return rewriteValuegeneric_OpEq64_0(v) 90 case OpEq8: 91 return rewriteValuegeneric_OpEq8_0(v) 92 case OpEqB: 93 return rewriteValuegeneric_OpEqB_0(v) 94 case OpEqInter: 95 return rewriteValuegeneric_OpEqInter_0(v) 96 case OpEqPtr: 97 return rewriteValuegeneric_OpEqPtr_0(v) 98 case OpEqSlice: 99 return rewriteValuegeneric_OpEqSlice_0(v) 100 case OpGeq16: 101 return rewriteValuegeneric_OpGeq16_0(v) 102 case OpGeq16U: 103 return rewriteValuegeneric_OpGeq16U_0(v) 104 case OpGeq32: 105 return rewriteValuegeneric_OpGeq32_0(v) 106 case OpGeq32U: 107 return rewriteValuegeneric_OpGeq32U_0(v) 108 case OpGeq64: 109 return rewriteValuegeneric_OpGeq64_0(v) 110 case OpGeq64U: 111 return rewriteValuegeneric_OpGeq64U_0(v) 112 case OpGeq8: 113 return rewriteValuegeneric_OpGeq8_0(v) 114 case OpGeq8U: 115 return rewriteValuegeneric_OpGeq8U_0(v) 116 case OpGreater16: 117 return rewriteValuegeneric_OpGreater16_0(v) 118 case OpGreater16U: 119 return rewriteValuegeneric_OpGreater16U_0(v) 120 case OpGreater32: 121 return rewriteValuegeneric_OpGreater32_0(v) 122 case OpGreater32U: 123 return rewriteValuegeneric_OpGreater32U_0(v) 124 case OpGreater64: 125 return rewriteValuegeneric_OpGreater64_0(v) 126 case OpGreater64U: 127 return rewriteValuegeneric_OpGreater64U_0(v) 128 case OpGreater8: 129 return rewriteValuegeneric_OpGreater8_0(v) 130 case OpGreater8U: 131 return rewriteValuegeneric_OpGreater8U_0(v) 132 case OpIMake: 133 return rewriteValuegeneric_OpIMake_0(v) 134 case OpInterCall: 135 return rewriteValuegeneric_OpInterCall_0(v) 136 case OpIsInBounds: 137 return rewriteValuegeneric_OpIsInBounds_0(v) || rewriteValuegeneric_OpIsInBounds_10(v) || rewriteValuegeneric_OpIsInBounds_20(v) 138 case OpIsNonNil: 139 return rewriteValuegeneric_OpIsNonNil_0(v) 140 case OpIsSliceInBounds: 141 return rewriteValuegeneric_OpIsSliceInBounds_0(v) 142 case OpLeq16: 143 return rewriteValuegeneric_OpLeq16_0(v) 144 case OpLeq16U: 145 return rewriteValuegeneric_OpLeq16U_0(v) 146 case OpLeq32: 147 return rewriteValuegeneric_OpLeq32_0(v) 148 case OpLeq32U: 149 return rewriteValuegeneric_OpLeq32U_0(v) 150 case OpLeq64: 151 return rewriteValuegeneric_OpLeq64_0(v) 152 case OpLeq64U: 153 return rewriteValuegeneric_OpLeq64U_0(v) 154 case OpLeq8: 155 return rewriteValuegeneric_OpLeq8_0(v) 156 case OpLeq8U: 157 return rewriteValuegeneric_OpLeq8U_0(v) 158 case OpLess16: 159 return rewriteValuegeneric_OpLess16_0(v) 160 case OpLess16U: 161 return rewriteValuegeneric_OpLess16U_0(v) 162 case OpLess32: 163 return rewriteValuegeneric_OpLess32_0(v) 164 case OpLess32U: 165 return rewriteValuegeneric_OpLess32U_0(v) 166 case OpLess64: 167 return rewriteValuegeneric_OpLess64_0(v) 168 case OpLess64U: 169 return rewriteValuegeneric_OpLess64U_0(v) 170 case OpLess8: 171 return rewriteValuegeneric_OpLess8_0(v) 172 case OpLess8U: 173 return rewriteValuegeneric_OpLess8U_0(v) 174 case OpLoad: 175 return rewriteValuegeneric_OpLoad_0(v) 176 case OpLsh16x16: 177 return rewriteValuegeneric_OpLsh16x16_0(v) 178 case OpLsh16x32: 179 return rewriteValuegeneric_OpLsh16x32_0(v) 180 case OpLsh16x64: 181 return rewriteValuegeneric_OpLsh16x64_0(v) 182 case OpLsh16x8: 183 return rewriteValuegeneric_OpLsh16x8_0(v) 184 case OpLsh32x16: 185 return rewriteValuegeneric_OpLsh32x16_0(v) 186 case OpLsh32x32: 187 return rewriteValuegeneric_OpLsh32x32_0(v) 188 case OpLsh32x64: 189 return rewriteValuegeneric_OpLsh32x64_0(v) 190 case OpLsh32x8: 191 return rewriteValuegeneric_OpLsh32x8_0(v) 192 case OpLsh64x16: 193 return rewriteValuegeneric_OpLsh64x16_0(v) 194 case OpLsh64x32: 195 return rewriteValuegeneric_OpLsh64x32_0(v) 196 case OpLsh64x64: 197 return rewriteValuegeneric_OpLsh64x64_0(v) 198 case OpLsh64x8: 199 return rewriteValuegeneric_OpLsh64x8_0(v) 200 case OpLsh8x16: 201 return rewriteValuegeneric_OpLsh8x16_0(v) 202 case OpLsh8x32: 203 return rewriteValuegeneric_OpLsh8x32_0(v) 204 case OpLsh8x64: 205 return rewriteValuegeneric_OpLsh8x64_0(v) 206 case OpLsh8x8: 207 return rewriteValuegeneric_OpLsh8x8_0(v) 208 case OpMod16: 209 return rewriteValuegeneric_OpMod16_0(v) 210 case OpMod16u: 211 return rewriteValuegeneric_OpMod16u_0(v) 212 case OpMod32: 213 return rewriteValuegeneric_OpMod32_0(v) 214 case OpMod32u: 215 return rewriteValuegeneric_OpMod32u_0(v) 216 case OpMod64: 217 return rewriteValuegeneric_OpMod64_0(v) 218 case OpMod64u: 219 return rewriteValuegeneric_OpMod64u_0(v) 220 case OpMod8: 221 return rewriteValuegeneric_OpMod8_0(v) 222 case OpMod8u: 223 return rewriteValuegeneric_OpMod8u_0(v) 224 case OpMul16: 225 return rewriteValuegeneric_OpMul16_0(v) || rewriteValuegeneric_OpMul16_10(v) 226 case OpMul32: 227 return rewriteValuegeneric_OpMul32_0(v) || rewriteValuegeneric_OpMul32_10(v) 228 case OpMul32F: 229 return rewriteValuegeneric_OpMul32F_0(v) 230 case OpMul64: 231 return rewriteValuegeneric_OpMul64_0(v) || rewriteValuegeneric_OpMul64_10(v) 232 case OpMul64F: 233 return rewriteValuegeneric_OpMul64F_0(v) 234 case OpMul8: 235 return rewriteValuegeneric_OpMul8_0(v) || rewriteValuegeneric_OpMul8_10(v) 236 case OpNeg16: 237 return rewriteValuegeneric_OpNeg16_0(v) 238 case OpNeg32: 239 return rewriteValuegeneric_OpNeg32_0(v) 240 case OpNeg32F: 241 return rewriteValuegeneric_OpNeg32F_0(v) 242 case OpNeg64: 243 return rewriteValuegeneric_OpNeg64_0(v) 244 case OpNeg64F: 245 return rewriteValuegeneric_OpNeg64F_0(v) 246 case OpNeg8: 247 return rewriteValuegeneric_OpNeg8_0(v) 248 case OpNeq16: 249 return rewriteValuegeneric_OpNeq16_0(v) 250 case OpNeq32: 251 return rewriteValuegeneric_OpNeq32_0(v) 252 case OpNeq64: 253 return rewriteValuegeneric_OpNeq64_0(v) 254 case OpNeq8: 255 return rewriteValuegeneric_OpNeq8_0(v) 256 case OpNeqB: 257 return rewriteValuegeneric_OpNeqB_0(v) 258 case OpNeqInter: 259 return rewriteValuegeneric_OpNeqInter_0(v) 260 case OpNeqPtr: 261 return rewriteValuegeneric_OpNeqPtr_0(v) 262 case OpNeqSlice: 263 return rewriteValuegeneric_OpNeqSlice_0(v) 264 case OpNilCheck: 265 return rewriteValuegeneric_OpNilCheck_0(v) 266 case OpNot: 267 return rewriteValuegeneric_OpNot_0(v) || rewriteValuegeneric_OpNot_10(v) || rewriteValuegeneric_OpNot_20(v) || rewriteValuegeneric_OpNot_30(v) || rewriteValuegeneric_OpNot_40(v) 268 case OpOffPtr: 269 return rewriteValuegeneric_OpOffPtr_0(v) 270 case OpOr16: 271 return rewriteValuegeneric_OpOr16_0(v) || rewriteValuegeneric_OpOr16_10(v) || rewriteValuegeneric_OpOr16_20(v) 272 case OpOr32: 273 return rewriteValuegeneric_OpOr32_0(v) || rewriteValuegeneric_OpOr32_10(v) || rewriteValuegeneric_OpOr32_20(v) 274 case OpOr64: 275 return rewriteValuegeneric_OpOr64_0(v) || rewriteValuegeneric_OpOr64_10(v) || rewriteValuegeneric_OpOr64_20(v) 276 case OpOr8: 277 return rewriteValuegeneric_OpOr8_0(v) || rewriteValuegeneric_OpOr8_10(v) || rewriteValuegeneric_OpOr8_20(v) 278 case OpPhi: 279 return rewriteValuegeneric_OpPhi_0(v) 280 case OpPtrIndex: 281 return rewriteValuegeneric_OpPtrIndex_0(v) 282 case OpRound32F: 283 return rewriteValuegeneric_OpRound32F_0(v) 284 case OpRound64F: 285 return rewriteValuegeneric_OpRound64F_0(v) 286 case OpRsh16Ux16: 287 return rewriteValuegeneric_OpRsh16Ux16_0(v) 288 case OpRsh16Ux32: 289 return rewriteValuegeneric_OpRsh16Ux32_0(v) 290 case OpRsh16Ux64: 291 return rewriteValuegeneric_OpRsh16Ux64_0(v) 292 case OpRsh16Ux8: 293 return rewriteValuegeneric_OpRsh16Ux8_0(v) 294 case OpRsh16x16: 295 return rewriteValuegeneric_OpRsh16x16_0(v) 296 case OpRsh16x32: 297 return rewriteValuegeneric_OpRsh16x32_0(v) 298 case OpRsh16x64: 299 return rewriteValuegeneric_OpRsh16x64_0(v) 300 case OpRsh16x8: 301 return rewriteValuegeneric_OpRsh16x8_0(v) 302 case OpRsh32Ux16: 303 return rewriteValuegeneric_OpRsh32Ux16_0(v) 304 case OpRsh32Ux32: 305 return rewriteValuegeneric_OpRsh32Ux32_0(v) 306 case OpRsh32Ux64: 307 return rewriteValuegeneric_OpRsh32Ux64_0(v) 308 case OpRsh32Ux8: 309 return rewriteValuegeneric_OpRsh32Ux8_0(v) 310 case OpRsh32x16: 311 return rewriteValuegeneric_OpRsh32x16_0(v) 312 case OpRsh32x32: 313 return rewriteValuegeneric_OpRsh32x32_0(v) 314 case OpRsh32x64: 315 return rewriteValuegeneric_OpRsh32x64_0(v) 316 case OpRsh32x8: 317 return rewriteValuegeneric_OpRsh32x8_0(v) 318 case OpRsh64Ux16: 319 return rewriteValuegeneric_OpRsh64Ux16_0(v) 320 case OpRsh64Ux32: 321 return rewriteValuegeneric_OpRsh64Ux32_0(v) 322 case OpRsh64Ux64: 323 return rewriteValuegeneric_OpRsh64Ux64_0(v) 324 case OpRsh64Ux8: 325 return rewriteValuegeneric_OpRsh64Ux8_0(v) 326 case OpRsh64x16: 327 return rewriteValuegeneric_OpRsh64x16_0(v) 328 case OpRsh64x32: 329 return rewriteValuegeneric_OpRsh64x32_0(v) 330 case OpRsh64x64: 331 return rewriteValuegeneric_OpRsh64x64_0(v) 332 case OpRsh64x8: 333 return rewriteValuegeneric_OpRsh64x8_0(v) 334 case OpRsh8Ux16: 335 return rewriteValuegeneric_OpRsh8Ux16_0(v) 336 case OpRsh8Ux32: 337 return rewriteValuegeneric_OpRsh8Ux32_0(v) 338 case OpRsh8Ux64: 339 return rewriteValuegeneric_OpRsh8Ux64_0(v) 340 case OpRsh8Ux8: 341 return rewriteValuegeneric_OpRsh8Ux8_0(v) 342 case OpRsh8x16: 343 return rewriteValuegeneric_OpRsh8x16_0(v) 344 case OpRsh8x32: 345 return rewriteValuegeneric_OpRsh8x32_0(v) 346 case OpRsh8x64: 347 return rewriteValuegeneric_OpRsh8x64_0(v) 348 case OpRsh8x8: 349 return rewriteValuegeneric_OpRsh8x8_0(v) 350 case OpSignExt16to32: 351 return rewriteValuegeneric_OpSignExt16to32_0(v) 352 case OpSignExt16to64: 353 return rewriteValuegeneric_OpSignExt16to64_0(v) 354 case OpSignExt32to64: 355 return rewriteValuegeneric_OpSignExt32to64_0(v) 356 case OpSignExt8to16: 357 return rewriteValuegeneric_OpSignExt8to16_0(v) 358 case OpSignExt8to32: 359 return rewriteValuegeneric_OpSignExt8to32_0(v) 360 case OpSignExt8to64: 361 return rewriteValuegeneric_OpSignExt8to64_0(v) 362 case OpSliceCap: 363 return rewriteValuegeneric_OpSliceCap_0(v) 364 case OpSliceLen: 365 return rewriteValuegeneric_OpSliceLen_0(v) 366 case OpSlicePtr: 367 return rewriteValuegeneric_OpSlicePtr_0(v) 368 case OpSlicemask: 369 return rewriteValuegeneric_OpSlicemask_0(v) 370 case OpSqrt: 371 return rewriteValuegeneric_OpSqrt_0(v) 372 case OpStore: 373 return rewriteValuegeneric_OpStore_0(v) || rewriteValuegeneric_OpStore_10(v) 374 case OpStringLen: 375 return rewriteValuegeneric_OpStringLen_0(v) 376 case OpStringPtr: 377 return rewriteValuegeneric_OpStringPtr_0(v) 378 case OpStructSelect: 379 return rewriteValuegeneric_OpStructSelect_0(v) || rewriteValuegeneric_OpStructSelect_10(v) 380 case OpSub16: 381 return rewriteValuegeneric_OpSub16_0(v) || rewriteValuegeneric_OpSub16_10(v) 382 case OpSub32: 383 return rewriteValuegeneric_OpSub32_0(v) || rewriteValuegeneric_OpSub32_10(v) 384 case OpSub32F: 385 return rewriteValuegeneric_OpSub32F_0(v) 386 case OpSub64: 387 return rewriteValuegeneric_OpSub64_0(v) || rewriteValuegeneric_OpSub64_10(v) 388 case OpSub64F: 389 return rewriteValuegeneric_OpSub64F_0(v) 390 case OpSub8: 391 return rewriteValuegeneric_OpSub8_0(v) || rewriteValuegeneric_OpSub8_10(v) 392 case OpTrunc16to8: 393 return rewriteValuegeneric_OpTrunc16to8_0(v) 394 case OpTrunc32to16: 395 return rewriteValuegeneric_OpTrunc32to16_0(v) 396 case OpTrunc32to8: 397 return rewriteValuegeneric_OpTrunc32to8_0(v) 398 case OpTrunc64to16: 399 return rewriteValuegeneric_OpTrunc64to16_0(v) 400 case OpTrunc64to32: 401 return rewriteValuegeneric_OpTrunc64to32_0(v) 402 case OpTrunc64to8: 403 return rewriteValuegeneric_OpTrunc64to8_0(v) 404 case OpXor16: 405 return rewriteValuegeneric_OpXor16_0(v) || rewriteValuegeneric_OpXor16_10(v) 406 case OpXor32: 407 return rewriteValuegeneric_OpXor32_0(v) || rewriteValuegeneric_OpXor32_10(v) 408 case OpXor64: 409 return rewriteValuegeneric_OpXor64_0(v) || rewriteValuegeneric_OpXor64_10(v) 410 case OpXor8: 411 return rewriteValuegeneric_OpXor8_0(v) || rewriteValuegeneric_OpXor8_10(v) 412 case OpZero: 413 return rewriteValuegeneric_OpZero_0(v) 414 case OpZeroExt16to32: 415 return rewriteValuegeneric_OpZeroExt16to32_0(v) 416 case OpZeroExt16to64: 417 return rewriteValuegeneric_OpZeroExt16to64_0(v) 418 case OpZeroExt32to64: 419 return rewriteValuegeneric_OpZeroExt32to64_0(v) 420 case OpZeroExt8to16: 421 return rewriteValuegeneric_OpZeroExt8to16_0(v) 422 case OpZeroExt8to32: 423 return rewriteValuegeneric_OpZeroExt8to32_0(v) 424 case OpZeroExt8to64: 425 return rewriteValuegeneric_OpZeroExt8to64_0(v) 426 } 427 return false 428 } 429 func rewriteValuegeneric_OpAdd16_0(v *Value) bool { 430 b := v.Block 431 _ = b 432 // match: (Add16 (Const16 [c]) (Const16 [d])) 433 // cond: 434 // result: (Const16 [int64(int16(c+d))]) 435 for { 436 _ = v.Args[1] 437 v_0 := v.Args[0] 438 if v_0.Op != OpConst16 { 439 break 440 } 441 c := v_0.AuxInt 442 v_1 := v.Args[1] 443 if v_1.Op != OpConst16 { 444 break 445 } 446 d := v_1.AuxInt 447 v.reset(OpConst16) 448 v.AuxInt = int64(int16(c + d)) 449 return true 450 } 451 // match: (Add16 (Const16 [d]) (Const16 [c])) 452 // cond: 453 // result: (Const16 [int64(int16(c+d))]) 454 for { 455 _ = v.Args[1] 456 v_0 := v.Args[0] 457 if v_0.Op != OpConst16 { 458 break 459 } 460 d := v_0.AuxInt 461 v_1 := v.Args[1] 462 if v_1.Op != OpConst16 { 463 break 464 } 465 c := v_1.AuxInt 466 v.reset(OpConst16) 467 v.AuxInt = int64(int16(c + d)) 468 return true 469 } 470 // match: (Add16 (Const16 [0]) x) 471 // cond: 472 // result: x 473 for { 474 _ = v.Args[1] 475 v_0 := v.Args[0] 476 if v_0.Op != OpConst16 { 477 break 478 } 479 if v_0.AuxInt != 0 { 480 break 481 } 482 x := v.Args[1] 483 v.reset(OpCopy) 484 v.Type = x.Type 485 v.AddArg(x) 486 return true 487 } 488 // match: (Add16 x (Const16 [0])) 489 // cond: 490 // result: x 491 for { 492 _ = v.Args[1] 493 x := v.Args[0] 494 v_1 := v.Args[1] 495 if v_1.Op != OpConst16 { 496 break 497 } 498 if v_1.AuxInt != 0 { 499 break 500 } 501 v.reset(OpCopy) 502 v.Type = x.Type 503 v.AddArg(x) 504 return true 505 } 506 // match: (Add16 (Const16 [1]) (Com16 x)) 507 // cond: 508 // result: (Neg16 x) 509 for { 510 _ = v.Args[1] 511 v_0 := v.Args[0] 512 if v_0.Op != OpConst16 { 513 break 514 } 515 if v_0.AuxInt != 1 { 516 break 517 } 518 v_1 := v.Args[1] 519 if v_1.Op != OpCom16 { 520 break 521 } 522 x := v_1.Args[0] 523 v.reset(OpNeg16) 524 v.AddArg(x) 525 return true 526 } 527 // match: (Add16 (Com16 x) (Const16 [1])) 528 // cond: 529 // result: (Neg16 x) 530 for { 531 _ = v.Args[1] 532 v_0 := v.Args[0] 533 if v_0.Op != OpCom16 { 534 break 535 } 536 x := v_0.Args[0] 537 v_1 := v.Args[1] 538 if v_1.Op != OpConst16 { 539 break 540 } 541 if v_1.AuxInt != 1 { 542 break 543 } 544 v.reset(OpNeg16) 545 v.AddArg(x) 546 return true 547 } 548 // match: (Add16 (Add16 i:(Const16 <t>) z) x) 549 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 550 // result: (Add16 i (Add16 <t> z x)) 551 for { 552 _ = v.Args[1] 553 v_0 := v.Args[0] 554 if v_0.Op != OpAdd16 { 555 break 556 } 557 _ = v_0.Args[1] 558 i := v_0.Args[0] 559 if i.Op != OpConst16 { 560 break 561 } 562 t := i.Type 563 z := v_0.Args[1] 564 x := v.Args[1] 565 if !(z.Op != OpConst16 && x.Op != OpConst16) { 566 break 567 } 568 v.reset(OpAdd16) 569 v.AddArg(i) 570 v0 := b.NewValue0(v.Pos, OpAdd16, t) 571 v0.AddArg(z) 572 v0.AddArg(x) 573 v.AddArg(v0) 574 return true 575 } 576 // match: (Add16 (Add16 z i:(Const16 <t>)) x) 577 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 578 // result: (Add16 i (Add16 <t> z x)) 579 for { 580 _ = v.Args[1] 581 v_0 := v.Args[0] 582 if v_0.Op != OpAdd16 { 583 break 584 } 585 _ = v_0.Args[1] 586 z := v_0.Args[0] 587 i := v_0.Args[1] 588 if i.Op != OpConst16 { 589 break 590 } 591 t := i.Type 592 x := v.Args[1] 593 if !(z.Op != OpConst16 && x.Op != OpConst16) { 594 break 595 } 596 v.reset(OpAdd16) 597 v.AddArg(i) 598 v0 := b.NewValue0(v.Pos, OpAdd16, t) 599 v0.AddArg(z) 600 v0.AddArg(x) 601 v.AddArg(v0) 602 return true 603 } 604 // match: (Add16 x (Add16 i:(Const16 <t>) z)) 605 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 606 // result: (Add16 i (Add16 <t> z x)) 607 for { 608 _ = v.Args[1] 609 x := v.Args[0] 610 v_1 := v.Args[1] 611 if v_1.Op != OpAdd16 { 612 break 613 } 614 _ = v_1.Args[1] 615 i := v_1.Args[0] 616 if i.Op != OpConst16 { 617 break 618 } 619 t := i.Type 620 z := v_1.Args[1] 621 if !(z.Op != OpConst16 && x.Op != OpConst16) { 622 break 623 } 624 v.reset(OpAdd16) 625 v.AddArg(i) 626 v0 := b.NewValue0(v.Pos, OpAdd16, t) 627 v0.AddArg(z) 628 v0.AddArg(x) 629 v.AddArg(v0) 630 return true 631 } 632 // match: (Add16 x (Add16 z i:(Const16 <t>))) 633 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 634 // result: (Add16 i (Add16 <t> z x)) 635 for { 636 _ = v.Args[1] 637 x := v.Args[0] 638 v_1 := v.Args[1] 639 if v_1.Op != OpAdd16 { 640 break 641 } 642 _ = v_1.Args[1] 643 z := v_1.Args[0] 644 i := v_1.Args[1] 645 if i.Op != OpConst16 { 646 break 647 } 648 t := i.Type 649 if !(z.Op != OpConst16 && x.Op != OpConst16) { 650 break 651 } 652 v.reset(OpAdd16) 653 v.AddArg(i) 654 v0 := b.NewValue0(v.Pos, OpAdd16, t) 655 v0.AddArg(z) 656 v0.AddArg(x) 657 v.AddArg(v0) 658 return true 659 } 660 return false 661 } 662 func rewriteValuegeneric_OpAdd16_10(v *Value) bool { 663 b := v.Block 664 _ = b 665 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 666 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 667 // result: (Add16 i (Sub16 <t> x z)) 668 for { 669 _ = v.Args[1] 670 v_0 := v.Args[0] 671 if v_0.Op != OpSub16 { 672 break 673 } 674 _ = v_0.Args[1] 675 i := v_0.Args[0] 676 if i.Op != OpConst16 { 677 break 678 } 679 t := i.Type 680 z := v_0.Args[1] 681 x := v.Args[1] 682 if !(z.Op != OpConst16 && x.Op != OpConst16) { 683 break 684 } 685 v.reset(OpAdd16) 686 v.AddArg(i) 687 v0 := b.NewValue0(v.Pos, OpSub16, t) 688 v0.AddArg(x) 689 v0.AddArg(z) 690 v.AddArg(v0) 691 return true 692 } 693 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 694 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 695 // result: (Add16 i (Sub16 <t> x z)) 696 for { 697 _ = v.Args[1] 698 x := v.Args[0] 699 v_1 := v.Args[1] 700 if v_1.Op != OpSub16 { 701 break 702 } 703 _ = v_1.Args[1] 704 i := v_1.Args[0] 705 if i.Op != OpConst16 { 706 break 707 } 708 t := i.Type 709 z := v_1.Args[1] 710 if !(z.Op != OpConst16 && x.Op != OpConst16) { 711 break 712 } 713 v.reset(OpAdd16) 714 v.AddArg(i) 715 v0 := b.NewValue0(v.Pos, OpSub16, t) 716 v0.AddArg(x) 717 v0.AddArg(z) 718 v.AddArg(v0) 719 return true 720 } 721 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 722 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 723 // result: (Add16 i (Sub16 <t> x z)) 724 for { 725 _ = v.Args[1] 726 x := v.Args[0] 727 v_1 := v.Args[1] 728 if v_1.Op != OpSub16 { 729 break 730 } 731 _ = v_1.Args[1] 732 i := v_1.Args[0] 733 if i.Op != OpConst16 { 734 break 735 } 736 t := i.Type 737 z := v_1.Args[1] 738 if !(z.Op != OpConst16 && x.Op != OpConst16) { 739 break 740 } 741 v.reset(OpAdd16) 742 v.AddArg(i) 743 v0 := b.NewValue0(v.Pos, OpSub16, t) 744 v0.AddArg(x) 745 v0.AddArg(z) 746 v.AddArg(v0) 747 return true 748 } 749 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 750 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 751 // result: (Add16 i (Sub16 <t> x z)) 752 for { 753 _ = v.Args[1] 754 v_0 := v.Args[0] 755 if v_0.Op != OpSub16 { 756 break 757 } 758 _ = v_0.Args[1] 759 i := v_0.Args[0] 760 if i.Op != OpConst16 { 761 break 762 } 763 t := i.Type 764 z := v_0.Args[1] 765 x := v.Args[1] 766 if !(z.Op != OpConst16 && x.Op != OpConst16) { 767 break 768 } 769 v.reset(OpAdd16) 770 v.AddArg(i) 771 v0 := b.NewValue0(v.Pos, OpSub16, t) 772 v0.AddArg(x) 773 v0.AddArg(z) 774 v.AddArg(v0) 775 return true 776 } 777 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 778 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 779 // result: (Sub16 (Add16 <t> x z) i) 780 for { 781 _ = v.Args[1] 782 v_0 := v.Args[0] 783 if v_0.Op != OpSub16 { 784 break 785 } 786 _ = v_0.Args[1] 787 z := v_0.Args[0] 788 i := v_0.Args[1] 789 if i.Op != OpConst16 { 790 break 791 } 792 t := i.Type 793 x := v.Args[1] 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 _ = v.Args[1] 810 x := v.Args[0] 811 v_1 := v.Args[1] 812 if v_1.Op != OpSub16 { 813 break 814 } 815 _ = v_1.Args[1] 816 z := v_1.Args[0] 817 i := v_1.Args[1] 818 if i.Op != OpConst16 { 819 break 820 } 821 t := i.Type 822 if !(z.Op != OpConst16 && x.Op != OpConst16) { 823 break 824 } 825 v.reset(OpSub16) 826 v0 := b.NewValue0(v.Pos, OpAdd16, t) 827 v0.AddArg(x) 828 v0.AddArg(z) 829 v.AddArg(v0) 830 v.AddArg(i) 831 return true 832 } 833 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 834 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 835 // result: (Sub16 (Add16 <t> x z) i) 836 for { 837 _ = v.Args[1] 838 x := v.Args[0] 839 v_1 := v.Args[1] 840 if v_1.Op != OpSub16 { 841 break 842 } 843 _ = v_1.Args[1] 844 z := v_1.Args[0] 845 i := v_1.Args[1] 846 if i.Op != OpConst16 { 847 break 848 } 849 t := i.Type 850 if !(z.Op != OpConst16 && x.Op != OpConst16) { 851 break 852 } 853 v.reset(OpSub16) 854 v0 := b.NewValue0(v.Pos, OpAdd16, t) 855 v0.AddArg(x) 856 v0.AddArg(z) 857 v.AddArg(v0) 858 v.AddArg(i) 859 return true 860 } 861 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 862 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 863 // result: (Sub16 (Add16 <t> x z) i) 864 for { 865 _ = v.Args[1] 866 v_0 := v.Args[0] 867 if v_0.Op != OpSub16 { 868 break 869 } 870 _ = v_0.Args[1] 871 z := v_0.Args[0] 872 i := v_0.Args[1] 873 if i.Op != OpConst16 { 874 break 875 } 876 t := i.Type 877 x := v.Args[1] 878 if !(z.Op != OpConst16 && x.Op != OpConst16) { 879 break 880 } 881 v.reset(OpSub16) 882 v0 := b.NewValue0(v.Pos, OpAdd16, t) 883 v0.AddArg(x) 884 v0.AddArg(z) 885 v.AddArg(v0) 886 v.AddArg(i) 887 return true 888 } 889 // match: (Add16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 890 // cond: 891 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 892 for { 893 _ = v.Args[1] 894 v_0 := v.Args[0] 895 if v_0.Op != OpConst16 { 896 break 897 } 898 t := v_0.Type 899 c := v_0.AuxInt 900 v_1 := v.Args[1] 901 if v_1.Op != OpAdd16 { 902 break 903 } 904 _ = v_1.Args[1] 905 v_1_0 := v_1.Args[0] 906 if v_1_0.Op != OpConst16 { 907 break 908 } 909 if v_1_0.Type != t { 910 break 911 } 912 d := v_1_0.AuxInt 913 x := v_1.Args[1] 914 v.reset(OpAdd16) 915 v0 := b.NewValue0(v.Pos, OpConst16, t) 916 v0.AuxInt = int64(int16(c + d)) 917 v.AddArg(v0) 918 v.AddArg(x) 919 return true 920 } 921 // match: (Add16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 922 // cond: 923 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 924 for { 925 _ = v.Args[1] 926 v_0 := v.Args[0] 927 if v_0.Op != OpConst16 { 928 break 929 } 930 t := v_0.Type 931 c := v_0.AuxInt 932 v_1 := v.Args[1] 933 if v_1.Op != OpAdd16 { 934 break 935 } 936 _ = v_1.Args[1] 937 x := v_1.Args[0] 938 v_1_1 := v_1.Args[1] 939 if v_1_1.Op != OpConst16 { 940 break 941 } 942 if v_1_1.Type != t { 943 break 944 } 945 d := v_1_1.AuxInt 946 v.reset(OpAdd16) 947 v0 := b.NewValue0(v.Pos, OpConst16, t) 948 v0.AuxInt = int64(int16(c + d)) 949 v.AddArg(v0) 950 v.AddArg(x) 951 return true 952 } 953 return false 954 } 955 func rewriteValuegeneric_OpAdd16_20(v *Value) bool { 956 b := v.Block 957 _ = b 958 // match: (Add16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 959 // cond: 960 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 961 for { 962 _ = v.Args[1] 963 v_0 := v.Args[0] 964 if v_0.Op != OpAdd16 { 965 break 966 } 967 _ = v_0.Args[1] 968 v_0_0 := v_0.Args[0] 969 if v_0_0.Op != OpConst16 { 970 break 971 } 972 t := v_0_0.Type 973 d := v_0_0.AuxInt 974 x := v_0.Args[1] 975 v_1 := v.Args[1] 976 if v_1.Op != OpConst16 { 977 break 978 } 979 if v_1.Type != t { 980 break 981 } 982 c := v_1.AuxInt 983 v.reset(OpAdd16) 984 v0 := b.NewValue0(v.Pos, OpConst16, t) 985 v0.AuxInt = int64(int16(c + d)) 986 v.AddArg(v0) 987 v.AddArg(x) 988 return true 989 } 990 // match: (Add16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 991 // cond: 992 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 993 for { 994 _ = v.Args[1] 995 v_0 := v.Args[0] 996 if v_0.Op != OpAdd16 { 997 break 998 } 999 _ = v_0.Args[1] 1000 x := v_0.Args[0] 1001 v_0_1 := v_0.Args[1] 1002 if v_0_1.Op != OpConst16 { 1003 break 1004 } 1005 t := v_0_1.Type 1006 d := v_0_1.AuxInt 1007 v_1 := v.Args[1] 1008 if v_1.Op != OpConst16 { 1009 break 1010 } 1011 if v_1.Type != t { 1012 break 1013 } 1014 c := v_1.AuxInt 1015 v.reset(OpAdd16) 1016 v0 := b.NewValue0(v.Pos, OpConst16, t) 1017 v0.AuxInt = int64(int16(c + d)) 1018 v.AddArg(v0) 1019 v.AddArg(x) 1020 return true 1021 } 1022 // match: (Add16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 1023 // cond: 1024 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1025 for { 1026 _ = v.Args[1] 1027 v_0 := v.Args[0] 1028 if v_0.Op != OpConst16 { 1029 break 1030 } 1031 t := v_0.Type 1032 c := v_0.AuxInt 1033 v_1 := v.Args[1] 1034 if v_1.Op != OpSub16 { 1035 break 1036 } 1037 _ = v_1.Args[1] 1038 v_1_0 := v_1.Args[0] 1039 if v_1_0.Op != OpConst16 { 1040 break 1041 } 1042 if v_1_0.Type != t { 1043 break 1044 } 1045 d := v_1_0.AuxInt 1046 x := v_1.Args[1] 1047 v.reset(OpSub16) 1048 v0 := b.NewValue0(v.Pos, OpConst16, t) 1049 v0.AuxInt = int64(int16(c + d)) 1050 v.AddArg(v0) 1051 v.AddArg(x) 1052 return true 1053 } 1054 // match: (Add16 (Sub16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1055 // cond: 1056 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1057 for { 1058 _ = v.Args[1] 1059 v_0 := v.Args[0] 1060 if v_0.Op != OpSub16 { 1061 break 1062 } 1063 _ = v_0.Args[1] 1064 v_0_0 := v_0.Args[0] 1065 if v_0_0.Op != OpConst16 { 1066 break 1067 } 1068 t := v_0_0.Type 1069 d := v_0_0.AuxInt 1070 x := v_0.Args[1] 1071 v_1 := v.Args[1] 1072 if v_1.Op != OpConst16 { 1073 break 1074 } 1075 if v_1.Type != t { 1076 break 1077 } 1078 c := v_1.AuxInt 1079 v.reset(OpSub16) 1080 v0 := b.NewValue0(v.Pos, OpConst16, t) 1081 v0.AuxInt = int64(int16(c + d)) 1082 v.AddArg(v0) 1083 v.AddArg(x) 1084 return true 1085 } 1086 // match: (Add16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 1087 // cond: 1088 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1089 for { 1090 _ = v.Args[1] 1091 v_0 := v.Args[0] 1092 if v_0.Op != OpConst16 { 1093 break 1094 } 1095 t := v_0.Type 1096 c := v_0.AuxInt 1097 v_1 := v.Args[1] 1098 if v_1.Op != OpSub16 { 1099 break 1100 } 1101 _ = v_1.Args[1] 1102 x := v_1.Args[0] 1103 v_1_1 := v_1.Args[1] 1104 if v_1_1.Op != OpConst16 { 1105 break 1106 } 1107 if v_1_1.Type != t { 1108 break 1109 } 1110 d := v_1_1.AuxInt 1111 v.reset(OpAdd16) 1112 v0 := b.NewValue0(v.Pos, OpConst16, t) 1113 v0.AuxInt = int64(int16(c - d)) 1114 v.AddArg(v0) 1115 v.AddArg(x) 1116 return true 1117 } 1118 // match: (Add16 (Sub16 x (Const16 <t> [d])) (Const16 <t> [c])) 1119 // cond: 1120 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1121 for { 1122 _ = v.Args[1] 1123 v_0 := v.Args[0] 1124 if v_0.Op != OpSub16 { 1125 break 1126 } 1127 _ = v_0.Args[1] 1128 x := v_0.Args[0] 1129 v_0_1 := v_0.Args[1] 1130 if v_0_1.Op != OpConst16 { 1131 break 1132 } 1133 t := v_0_1.Type 1134 d := v_0_1.AuxInt 1135 v_1 := v.Args[1] 1136 if v_1.Op != OpConst16 { 1137 break 1138 } 1139 if v_1.Type != t { 1140 break 1141 } 1142 c := v_1.AuxInt 1143 v.reset(OpAdd16) 1144 v0 := b.NewValue0(v.Pos, OpConst16, t) 1145 v0.AuxInt = int64(int16(c - d)) 1146 v.AddArg(v0) 1147 v.AddArg(x) 1148 return true 1149 } 1150 return false 1151 } 1152 func rewriteValuegeneric_OpAdd32_0(v *Value) bool { 1153 b := v.Block 1154 _ = b 1155 // match: (Add32 (Const32 [c]) (Const32 [d])) 1156 // cond: 1157 // result: (Const32 [int64(int32(c+d))]) 1158 for { 1159 _ = v.Args[1] 1160 v_0 := v.Args[0] 1161 if v_0.Op != OpConst32 { 1162 break 1163 } 1164 c := v_0.AuxInt 1165 v_1 := v.Args[1] 1166 if v_1.Op != OpConst32 { 1167 break 1168 } 1169 d := v_1.AuxInt 1170 v.reset(OpConst32) 1171 v.AuxInt = int64(int32(c + d)) 1172 return true 1173 } 1174 // match: (Add32 (Const32 [d]) (Const32 [c])) 1175 // cond: 1176 // result: (Const32 [int64(int32(c+d))]) 1177 for { 1178 _ = v.Args[1] 1179 v_0 := v.Args[0] 1180 if v_0.Op != OpConst32 { 1181 break 1182 } 1183 d := v_0.AuxInt 1184 v_1 := v.Args[1] 1185 if v_1.Op != OpConst32 { 1186 break 1187 } 1188 c := v_1.AuxInt 1189 v.reset(OpConst32) 1190 v.AuxInt = int64(int32(c + d)) 1191 return true 1192 } 1193 // match: (Add32 (Const32 [0]) x) 1194 // cond: 1195 // result: x 1196 for { 1197 _ = v.Args[1] 1198 v_0 := v.Args[0] 1199 if v_0.Op != OpConst32 { 1200 break 1201 } 1202 if v_0.AuxInt != 0 { 1203 break 1204 } 1205 x := v.Args[1] 1206 v.reset(OpCopy) 1207 v.Type = x.Type 1208 v.AddArg(x) 1209 return true 1210 } 1211 // match: (Add32 x (Const32 [0])) 1212 // cond: 1213 // result: x 1214 for { 1215 _ = v.Args[1] 1216 x := v.Args[0] 1217 v_1 := v.Args[1] 1218 if v_1.Op != OpConst32 { 1219 break 1220 } 1221 if v_1.AuxInt != 0 { 1222 break 1223 } 1224 v.reset(OpCopy) 1225 v.Type = x.Type 1226 v.AddArg(x) 1227 return true 1228 } 1229 // match: (Add32 (Const32 [1]) (Com32 x)) 1230 // cond: 1231 // result: (Neg32 x) 1232 for { 1233 _ = v.Args[1] 1234 v_0 := v.Args[0] 1235 if v_0.Op != OpConst32 { 1236 break 1237 } 1238 if v_0.AuxInt != 1 { 1239 break 1240 } 1241 v_1 := v.Args[1] 1242 if v_1.Op != OpCom32 { 1243 break 1244 } 1245 x := v_1.Args[0] 1246 v.reset(OpNeg32) 1247 v.AddArg(x) 1248 return true 1249 } 1250 // match: (Add32 (Com32 x) (Const32 [1])) 1251 // cond: 1252 // result: (Neg32 x) 1253 for { 1254 _ = v.Args[1] 1255 v_0 := v.Args[0] 1256 if v_0.Op != OpCom32 { 1257 break 1258 } 1259 x := v_0.Args[0] 1260 v_1 := v.Args[1] 1261 if v_1.Op != OpConst32 { 1262 break 1263 } 1264 if v_1.AuxInt != 1 { 1265 break 1266 } 1267 v.reset(OpNeg32) 1268 v.AddArg(x) 1269 return true 1270 } 1271 // match: (Add32 (Add32 i:(Const32 <t>) z) x) 1272 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1273 // result: (Add32 i (Add32 <t> z x)) 1274 for { 1275 _ = v.Args[1] 1276 v_0 := v.Args[0] 1277 if v_0.Op != OpAdd32 { 1278 break 1279 } 1280 _ = v_0.Args[1] 1281 i := v_0.Args[0] 1282 if i.Op != OpConst32 { 1283 break 1284 } 1285 t := i.Type 1286 z := v_0.Args[1] 1287 x := v.Args[1] 1288 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1289 break 1290 } 1291 v.reset(OpAdd32) 1292 v.AddArg(i) 1293 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1294 v0.AddArg(z) 1295 v0.AddArg(x) 1296 v.AddArg(v0) 1297 return true 1298 } 1299 // match: (Add32 (Add32 z i:(Const32 <t>)) x) 1300 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1301 // result: (Add32 i (Add32 <t> z x)) 1302 for { 1303 _ = v.Args[1] 1304 v_0 := v.Args[0] 1305 if v_0.Op != OpAdd32 { 1306 break 1307 } 1308 _ = v_0.Args[1] 1309 z := v_0.Args[0] 1310 i := v_0.Args[1] 1311 if i.Op != OpConst32 { 1312 break 1313 } 1314 t := i.Type 1315 x := v.Args[1] 1316 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1317 break 1318 } 1319 v.reset(OpAdd32) 1320 v.AddArg(i) 1321 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1322 v0.AddArg(z) 1323 v0.AddArg(x) 1324 v.AddArg(v0) 1325 return true 1326 } 1327 // match: (Add32 x (Add32 i:(Const32 <t>) z)) 1328 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1329 // result: (Add32 i (Add32 <t> z x)) 1330 for { 1331 _ = v.Args[1] 1332 x := v.Args[0] 1333 v_1 := v.Args[1] 1334 if v_1.Op != OpAdd32 { 1335 break 1336 } 1337 _ = v_1.Args[1] 1338 i := v_1.Args[0] 1339 if i.Op != OpConst32 { 1340 break 1341 } 1342 t := i.Type 1343 z := v_1.Args[1] 1344 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1345 break 1346 } 1347 v.reset(OpAdd32) 1348 v.AddArg(i) 1349 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1350 v0.AddArg(z) 1351 v0.AddArg(x) 1352 v.AddArg(v0) 1353 return true 1354 } 1355 // match: (Add32 x (Add32 z i:(Const32 <t>))) 1356 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1357 // result: (Add32 i (Add32 <t> z x)) 1358 for { 1359 _ = v.Args[1] 1360 x := v.Args[0] 1361 v_1 := v.Args[1] 1362 if v_1.Op != OpAdd32 { 1363 break 1364 } 1365 _ = v_1.Args[1] 1366 z := v_1.Args[0] 1367 i := v_1.Args[1] 1368 if i.Op != OpConst32 { 1369 break 1370 } 1371 t := i.Type 1372 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1373 break 1374 } 1375 v.reset(OpAdd32) 1376 v.AddArg(i) 1377 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1378 v0.AddArg(z) 1379 v0.AddArg(x) 1380 v.AddArg(v0) 1381 return true 1382 } 1383 return false 1384 } 1385 func rewriteValuegeneric_OpAdd32_10(v *Value) bool { 1386 b := v.Block 1387 _ = b 1388 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1389 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1390 // result: (Add32 i (Sub32 <t> x z)) 1391 for { 1392 _ = v.Args[1] 1393 v_0 := v.Args[0] 1394 if v_0.Op != OpSub32 { 1395 break 1396 } 1397 _ = v_0.Args[1] 1398 i := v_0.Args[0] 1399 if i.Op != OpConst32 { 1400 break 1401 } 1402 t := i.Type 1403 z := v_0.Args[1] 1404 x := v.Args[1] 1405 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1406 break 1407 } 1408 v.reset(OpAdd32) 1409 v.AddArg(i) 1410 v0 := b.NewValue0(v.Pos, OpSub32, t) 1411 v0.AddArg(x) 1412 v0.AddArg(z) 1413 v.AddArg(v0) 1414 return true 1415 } 1416 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1417 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1418 // result: (Add32 i (Sub32 <t> x z)) 1419 for { 1420 _ = v.Args[1] 1421 x := v.Args[0] 1422 v_1 := v.Args[1] 1423 if v_1.Op != OpSub32 { 1424 break 1425 } 1426 _ = v_1.Args[1] 1427 i := v_1.Args[0] 1428 if i.Op != OpConst32 { 1429 break 1430 } 1431 t := i.Type 1432 z := v_1.Args[1] 1433 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1434 break 1435 } 1436 v.reset(OpAdd32) 1437 v.AddArg(i) 1438 v0 := b.NewValue0(v.Pos, OpSub32, t) 1439 v0.AddArg(x) 1440 v0.AddArg(z) 1441 v.AddArg(v0) 1442 return true 1443 } 1444 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1445 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1446 // result: (Add32 i (Sub32 <t> x z)) 1447 for { 1448 _ = v.Args[1] 1449 x := v.Args[0] 1450 v_1 := v.Args[1] 1451 if v_1.Op != OpSub32 { 1452 break 1453 } 1454 _ = v_1.Args[1] 1455 i := v_1.Args[0] 1456 if i.Op != OpConst32 { 1457 break 1458 } 1459 t := i.Type 1460 z := v_1.Args[1] 1461 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1462 break 1463 } 1464 v.reset(OpAdd32) 1465 v.AddArg(i) 1466 v0 := b.NewValue0(v.Pos, OpSub32, t) 1467 v0.AddArg(x) 1468 v0.AddArg(z) 1469 v.AddArg(v0) 1470 return true 1471 } 1472 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1473 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1474 // result: (Add32 i (Sub32 <t> x z)) 1475 for { 1476 _ = v.Args[1] 1477 v_0 := v.Args[0] 1478 if v_0.Op != OpSub32 { 1479 break 1480 } 1481 _ = v_0.Args[1] 1482 i := v_0.Args[0] 1483 if i.Op != OpConst32 { 1484 break 1485 } 1486 t := i.Type 1487 z := v_0.Args[1] 1488 x := v.Args[1] 1489 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1490 break 1491 } 1492 v.reset(OpAdd32) 1493 v.AddArg(i) 1494 v0 := b.NewValue0(v.Pos, OpSub32, t) 1495 v0.AddArg(x) 1496 v0.AddArg(z) 1497 v.AddArg(v0) 1498 return true 1499 } 1500 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 1501 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1502 // result: (Sub32 (Add32 <t> x z) i) 1503 for { 1504 _ = v.Args[1] 1505 v_0 := v.Args[0] 1506 if v_0.Op != OpSub32 { 1507 break 1508 } 1509 _ = v_0.Args[1] 1510 z := v_0.Args[0] 1511 i := v_0.Args[1] 1512 if i.Op != OpConst32 { 1513 break 1514 } 1515 t := i.Type 1516 x := v.Args[1] 1517 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1518 break 1519 } 1520 v.reset(OpSub32) 1521 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1522 v0.AddArg(x) 1523 v0.AddArg(z) 1524 v.AddArg(v0) 1525 v.AddArg(i) 1526 return true 1527 } 1528 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 1529 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1530 // result: (Sub32 (Add32 <t> x z) i) 1531 for { 1532 _ = v.Args[1] 1533 x := v.Args[0] 1534 v_1 := v.Args[1] 1535 if v_1.Op != OpSub32 { 1536 break 1537 } 1538 _ = v_1.Args[1] 1539 z := v_1.Args[0] 1540 i := v_1.Args[1] 1541 if i.Op != OpConst32 { 1542 break 1543 } 1544 t := i.Type 1545 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1546 break 1547 } 1548 v.reset(OpSub32) 1549 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1550 v0.AddArg(x) 1551 v0.AddArg(z) 1552 v.AddArg(v0) 1553 v.AddArg(i) 1554 return true 1555 } 1556 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 1557 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1558 // result: (Sub32 (Add32 <t> x z) i) 1559 for { 1560 _ = v.Args[1] 1561 x := v.Args[0] 1562 v_1 := v.Args[1] 1563 if v_1.Op != OpSub32 { 1564 break 1565 } 1566 _ = v_1.Args[1] 1567 z := v_1.Args[0] 1568 i := v_1.Args[1] 1569 if i.Op != OpConst32 { 1570 break 1571 } 1572 t := i.Type 1573 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1574 break 1575 } 1576 v.reset(OpSub32) 1577 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1578 v0.AddArg(x) 1579 v0.AddArg(z) 1580 v.AddArg(v0) 1581 v.AddArg(i) 1582 return true 1583 } 1584 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 1585 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1586 // result: (Sub32 (Add32 <t> x z) i) 1587 for { 1588 _ = v.Args[1] 1589 v_0 := v.Args[0] 1590 if v_0.Op != OpSub32 { 1591 break 1592 } 1593 _ = v_0.Args[1] 1594 z := v_0.Args[0] 1595 i := v_0.Args[1] 1596 if i.Op != OpConst32 { 1597 break 1598 } 1599 t := i.Type 1600 x := v.Args[1] 1601 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1602 break 1603 } 1604 v.reset(OpSub32) 1605 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1606 v0.AddArg(x) 1607 v0.AddArg(z) 1608 v.AddArg(v0) 1609 v.AddArg(i) 1610 return true 1611 } 1612 // match: (Add32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 1613 // cond: 1614 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 1615 for { 1616 _ = v.Args[1] 1617 v_0 := v.Args[0] 1618 if v_0.Op != OpConst32 { 1619 break 1620 } 1621 t := v_0.Type 1622 c := v_0.AuxInt 1623 v_1 := v.Args[1] 1624 if v_1.Op != OpAdd32 { 1625 break 1626 } 1627 _ = v_1.Args[1] 1628 v_1_0 := v_1.Args[0] 1629 if v_1_0.Op != OpConst32 { 1630 break 1631 } 1632 if v_1_0.Type != t { 1633 break 1634 } 1635 d := v_1_0.AuxInt 1636 x := v_1.Args[1] 1637 v.reset(OpAdd32) 1638 v0 := b.NewValue0(v.Pos, OpConst32, t) 1639 v0.AuxInt = int64(int32(c + d)) 1640 v.AddArg(v0) 1641 v.AddArg(x) 1642 return true 1643 } 1644 // match: (Add32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 1645 // cond: 1646 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 1647 for { 1648 _ = v.Args[1] 1649 v_0 := v.Args[0] 1650 if v_0.Op != OpConst32 { 1651 break 1652 } 1653 t := v_0.Type 1654 c := v_0.AuxInt 1655 v_1 := v.Args[1] 1656 if v_1.Op != OpAdd32 { 1657 break 1658 } 1659 _ = v_1.Args[1] 1660 x := v_1.Args[0] 1661 v_1_1 := v_1.Args[1] 1662 if v_1_1.Op != OpConst32 { 1663 break 1664 } 1665 if v_1_1.Type != t { 1666 break 1667 } 1668 d := v_1_1.AuxInt 1669 v.reset(OpAdd32) 1670 v0 := b.NewValue0(v.Pos, OpConst32, t) 1671 v0.AuxInt = int64(int32(c + d)) 1672 v.AddArg(v0) 1673 v.AddArg(x) 1674 return true 1675 } 1676 return false 1677 } 1678 func rewriteValuegeneric_OpAdd32_20(v *Value) bool { 1679 b := v.Block 1680 _ = b 1681 // match: (Add32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 1682 // cond: 1683 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 1684 for { 1685 _ = v.Args[1] 1686 v_0 := v.Args[0] 1687 if v_0.Op != OpAdd32 { 1688 break 1689 } 1690 _ = v_0.Args[1] 1691 v_0_0 := v_0.Args[0] 1692 if v_0_0.Op != OpConst32 { 1693 break 1694 } 1695 t := v_0_0.Type 1696 d := v_0_0.AuxInt 1697 x := v_0.Args[1] 1698 v_1 := v.Args[1] 1699 if v_1.Op != OpConst32 { 1700 break 1701 } 1702 if v_1.Type != t { 1703 break 1704 } 1705 c := v_1.AuxInt 1706 v.reset(OpAdd32) 1707 v0 := b.NewValue0(v.Pos, OpConst32, t) 1708 v0.AuxInt = int64(int32(c + d)) 1709 v.AddArg(v0) 1710 v.AddArg(x) 1711 return true 1712 } 1713 // match: (Add32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 1714 // cond: 1715 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 1716 for { 1717 _ = v.Args[1] 1718 v_0 := v.Args[0] 1719 if v_0.Op != OpAdd32 { 1720 break 1721 } 1722 _ = v_0.Args[1] 1723 x := v_0.Args[0] 1724 v_0_1 := v_0.Args[1] 1725 if v_0_1.Op != OpConst32 { 1726 break 1727 } 1728 t := v_0_1.Type 1729 d := v_0_1.AuxInt 1730 v_1 := v.Args[1] 1731 if v_1.Op != OpConst32 { 1732 break 1733 } 1734 if v_1.Type != t { 1735 break 1736 } 1737 c := v_1.AuxInt 1738 v.reset(OpAdd32) 1739 v0 := b.NewValue0(v.Pos, OpConst32, t) 1740 v0.AuxInt = int64(int32(c + d)) 1741 v.AddArg(v0) 1742 v.AddArg(x) 1743 return true 1744 } 1745 // match: (Add32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 1746 // cond: 1747 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 1748 for { 1749 _ = v.Args[1] 1750 v_0 := v.Args[0] 1751 if v_0.Op != OpConst32 { 1752 break 1753 } 1754 t := v_0.Type 1755 c := v_0.AuxInt 1756 v_1 := v.Args[1] 1757 if v_1.Op != OpSub32 { 1758 break 1759 } 1760 _ = v_1.Args[1] 1761 v_1_0 := v_1.Args[0] 1762 if v_1_0.Op != OpConst32 { 1763 break 1764 } 1765 if v_1_0.Type != t { 1766 break 1767 } 1768 d := v_1_0.AuxInt 1769 x := v_1.Args[1] 1770 v.reset(OpSub32) 1771 v0 := b.NewValue0(v.Pos, OpConst32, t) 1772 v0.AuxInt = int64(int32(c + d)) 1773 v.AddArg(v0) 1774 v.AddArg(x) 1775 return true 1776 } 1777 // match: (Add32 (Sub32 (Const32 <t> [d]) x) (Const32 <t> [c])) 1778 // cond: 1779 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 1780 for { 1781 _ = v.Args[1] 1782 v_0 := v.Args[0] 1783 if v_0.Op != OpSub32 { 1784 break 1785 } 1786 _ = v_0.Args[1] 1787 v_0_0 := v_0.Args[0] 1788 if v_0_0.Op != OpConst32 { 1789 break 1790 } 1791 t := v_0_0.Type 1792 d := v_0_0.AuxInt 1793 x := v_0.Args[1] 1794 v_1 := v.Args[1] 1795 if v_1.Op != OpConst32 { 1796 break 1797 } 1798 if v_1.Type != t { 1799 break 1800 } 1801 c := v_1.AuxInt 1802 v.reset(OpSub32) 1803 v0 := b.NewValue0(v.Pos, OpConst32, t) 1804 v0.AuxInt = int64(int32(c + d)) 1805 v.AddArg(v0) 1806 v.AddArg(x) 1807 return true 1808 } 1809 // match: (Add32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 1810 // cond: 1811 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 1812 for { 1813 _ = v.Args[1] 1814 v_0 := v.Args[0] 1815 if v_0.Op != OpConst32 { 1816 break 1817 } 1818 t := v_0.Type 1819 c := v_0.AuxInt 1820 v_1 := v.Args[1] 1821 if v_1.Op != OpSub32 { 1822 break 1823 } 1824 _ = v_1.Args[1] 1825 x := v_1.Args[0] 1826 v_1_1 := v_1.Args[1] 1827 if v_1_1.Op != OpConst32 { 1828 break 1829 } 1830 if v_1_1.Type != t { 1831 break 1832 } 1833 d := v_1_1.AuxInt 1834 v.reset(OpAdd32) 1835 v0 := b.NewValue0(v.Pos, OpConst32, t) 1836 v0.AuxInt = int64(int32(c - d)) 1837 v.AddArg(v0) 1838 v.AddArg(x) 1839 return true 1840 } 1841 // match: (Add32 (Sub32 x (Const32 <t> [d])) (Const32 <t> [c])) 1842 // cond: 1843 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 1844 for { 1845 _ = v.Args[1] 1846 v_0 := v.Args[0] 1847 if v_0.Op != OpSub32 { 1848 break 1849 } 1850 _ = v_0.Args[1] 1851 x := v_0.Args[0] 1852 v_0_1 := v_0.Args[1] 1853 if v_0_1.Op != OpConst32 { 1854 break 1855 } 1856 t := v_0_1.Type 1857 d := v_0_1.AuxInt 1858 v_1 := v.Args[1] 1859 if v_1.Op != OpConst32 { 1860 break 1861 } 1862 if v_1.Type != t { 1863 break 1864 } 1865 c := v_1.AuxInt 1866 v.reset(OpAdd32) 1867 v0 := b.NewValue0(v.Pos, OpConst32, t) 1868 v0.AuxInt = int64(int32(c - d)) 1869 v.AddArg(v0) 1870 v.AddArg(x) 1871 return true 1872 } 1873 return false 1874 } 1875 func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { 1876 // match: (Add32F (Const32F [c]) (Const32F [d])) 1877 // cond: 1878 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 1879 for { 1880 _ = v.Args[1] 1881 v_0 := v.Args[0] 1882 if v_0.Op != OpConst32F { 1883 break 1884 } 1885 c := v_0.AuxInt 1886 v_1 := v.Args[1] 1887 if v_1.Op != OpConst32F { 1888 break 1889 } 1890 d := v_1.AuxInt 1891 v.reset(OpConst32F) 1892 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 1893 return true 1894 } 1895 // match: (Add32F (Const32F [d]) (Const32F [c])) 1896 // cond: 1897 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 1898 for { 1899 _ = v.Args[1] 1900 v_0 := v.Args[0] 1901 if v_0.Op != OpConst32F { 1902 break 1903 } 1904 d := v_0.AuxInt 1905 v_1 := v.Args[1] 1906 if v_1.Op != OpConst32F { 1907 break 1908 } 1909 c := v_1.AuxInt 1910 v.reset(OpConst32F) 1911 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 1912 return true 1913 } 1914 // match: (Add32F x (Const32F [0])) 1915 // cond: 1916 // result: x 1917 for { 1918 _ = v.Args[1] 1919 x := v.Args[0] 1920 v_1 := v.Args[1] 1921 if v_1.Op != OpConst32F { 1922 break 1923 } 1924 if v_1.AuxInt != 0 { 1925 break 1926 } 1927 v.reset(OpCopy) 1928 v.Type = x.Type 1929 v.AddArg(x) 1930 return true 1931 } 1932 // match: (Add32F (Const32F [0]) x) 1933 // cond: 1934 // result: x 1935 for { 1936 _ = v.Args[1] 1937 v_0 := v.Args[0] 1938 if v_0.Op != OpConst32F { 1939 break 1940 } 1941 if v_0.AuxInt != 0 { 1942 break 1943 } 1944 x := v.Args[1] 1945 v.reset(OpCopy) 1946 v.Type = x.Type 1947 v.AddArg(x) 1948 return true 1949 } 1950 return false 1951 } 1952 func rewriteValuegeneric_OpAdd64_0(v *Value) bool { 1953 b := v.Block 1954 _ = b 1955 // match: (Add64 (Const64 [c]) (Const64 [d])) 1956 // cond: 1957 // result: (Const64 [c+d]) 1958 for { 1959 _ = v.Args[1] 1960 v_0 := v.Args[0] 1961 if v_0.Op != OpConst64 { 1962 break 1963 } 1964 c := v_0.AuxInt 1965 v_1 := v.Args[1] 1966 if v_1.Op != OpConst64 { 1967 break 1968 } 1969 d := v_1.AuxInt 1970 v.reset(OpConst64) 1971 v.AuxInt = c + d 1972 return true 1973 } 1974 // match: (Add64 (Const64 [d]) (Const64 [c])) 1975 // cond: 1976 // result: (Const64 [c+d]) 1977 for { 1978 _ = v.Args[1] 1979 v_0 := v.Args[0] 1980 if v_0.Op != OpConst64 { 1981 break 1982 } 1983 d := v_0.AuxInt 1984 v_1 := v.Args[1] 1985 if v_1.Op != OpConst64 { 1986 break 1987 } 1988 c := v_1.AuxInt 1989 v.reset(OpConst64) 1990 v.AuxInt = c + d 1991 return true 1992 } 1993 // match: (Add64 (Const64 [0]) x) 1994 // cond: 1995 // result: x 1996 for { 1997 _ = v.Args[1] 1998 v_0 := v.Args[0] 1999 if v_0.Op != OpConst64 { 2000 break 2001 } 2002 if v_0.AuxInt != 0 { 2003 break 2004 } 2005 x := v.Args[1] 2006 v.reset(OpCopy) 2007 v.Type = x.Type 2008 v.AddArg(x) 2009 return true 2010 } 2011 // match: (Add64 x (Const64 [0])) 2012 // cond: 2013 // result: x 2014 for { 2015 _ = v.Args[1] 2016 x := v.Args[0] 2017 v_1 := v.Args[1] 2018 if v_1.Op != OpConst64 { 2019 break 2020 } 2021 if v_1.AuxInt != 0 { 2022 break 2023 } 2024 v.reset(OpCopy) 2025 v.Type = x.Type 2026 v.AddArg(x) 2027 return true 2028 } 2029 // match: (Add64 (Const64 [1]) (Com64 x)) 2030 // cond: 2031 // result: (Neg64 x) 2032 for { 2033 _ = v.Args[1] 2034 v_0 := v.Args[0] 2035 if v_0.Op != OpConst64 { 2036 break 2037 } 2038 if v_0.AuxInt != 1 { 2039 break 2040 } 2041 v_1 := v.Args[1] 2042 if v_1.Op != OpCom64 { 2043 break 2044 } 2045 x := v_1.Args[0] 2046 v.reset(OpNeg64) 2047 v.AddArg(x) 2048 return true 2049 } 2050 // match: (Add64 (Com64 x) (Const64 [1])) 2051 // cond: 2052 // result: (Neg64 x) 2053 for { 2054 _ = v.Args[1] 2055 v_0 := v.Args[0] 2056 if v_0.Op != OpCom64 { 2057 break 2058 } 2059 x := v_0.Args[0] 2060 v_1 := v.Args[1] 2061 if v_1.Op != OpConst64 { 2062 break 2063 } 2064 if v_1.AuxInt != 1 { 2065 break 2066 } 2067 v.reset(OpNeg64) 2068 v.AddArg(x) 2069 return true 2070 } 2071 // match: (Add64 (Add64 i:(Const64 <t>) z) x) 2072 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2073 // result: (Add64 i (Add64 <t> z x)) 2074 for { 2075 _ = v.Args[1] 2076 v_0 := v.Args[0] 2077 if v_0.Op != OpAdd64 { 2078 break 2079 } 2080 _ = v_0.Args[1] 2081 i := v_0.Args[0] 2082 if i.Op != OpConst64 { 2083 break 2084 } 2085 t := i.Type 2086 z := v_0.Args[1] 2087 x := v.Args[1] 2088 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2089 break 2090 } 2091 v.reset(OpAdd64) 2092 v.AddArg(i) 2093 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2094 v0.AddArg(z) 2095 v0.AddArg(x) 2096 v.AddArg(v0) 2097 return true 2098 } 2099 // match: (Add64 (Add64 z i:(Const64 <t>)) x) 2100 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2101 // result: (Add64 i (Add64 <t> z x)) 2102 for { 2103 _ = v.Args[1] 2104 v_0 := v.Args[0] 2105 if v_0.Op != OpAdd64 { 2106 break 2107 } 2108 _ = v_0.Args[1] 2109 z := v_0.Args[0] 2110 i := v_0.Args[1] 2111 if i.Op != OpConst64 { 2112 break 2113 } 2114 t := i.Type 2115 x := v.Args[1] 2116 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2117 break 2118 } 2119 v.reset(OpAdd64) 2120 v.AddArg(i) 2121 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2122 v0.AddArg(z) 2123 v0.AddArg(x) 2124 v.AddArg(v0) 2125 return true 2126 } 2127 // match: (Add64 x (Add64 i:(Const64 <t>) z)) 2128 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2129 // result: (Add64 i (Add64 <t> z x)) 2130 for { 2131 _ = v.Args[1] 2132 x := v.Args[0] 2133 v_1 := v.Args[1] 2134 if v_1.Op != OpAdd64 { 2135 break 2136 } 2137 _ = v_1.Args[1] 2138 i := v_1.Args[0] 2139 if i.Op != OpConst64 { 2140 break 2141 } 2142 t := i.Type 2143 z := v_1.Args[1] 2144 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2145 break 2146 } 2147 v.reset(OpAdd64) 2148 v.AddArg(i) 2149 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2150 v0.AddArg(z) 2151 v0.AddArg(x) 2152 v.AddArg(v0) 2153 return true 2154 } 2155 // match: (Add64 x (Add64 z i:(Const64 <t>))) 2156 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2157 // result: (Add64 i (Add64 <t> z x)) 2158 for { 2159 _ = v.Args[1] 2160 x := v.Args[0] 2161 v_1 := v.Args[1] 2162 if v_1.Op != OpAdd64 { 2163 break 2164 } 2165 _ = v_1.Args[1] 2166 z := v_1.Args[0] 2167 i := v_1.Args[1] 2168 if i.Op != OpConst64 { 2169 break 2170 } 2171 t := i.Type 2172 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2173 break 2174 } 2175 v.reset(OpAdd64) 2176 v.AddArg(i) 2177 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2178 v0.AddArg(z) 2179 v0.AddArg(x) 2180 v.AddArg(v0) 2181 return true 2182 } 2183 return false 2184 } 2185 func rewriteValuegeneric_OpAdd64_10(v *Value) bool { 2186 b := v.Block 2187 _ = b 2188 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 2189 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2190 // result: (Add64 i (Sub64 <t> x z)) 2191 for { 2192 _ = v.Args[1] 2193 v_0 := v.Args[0] 2194 if v_0.Op != OpSub64 { 2195 break 2196 } 2197 _ = v_0.Args[1] 2198 i := v_0.Args[0] 2199 if i.Op != OpConst64 { 2200 break 2201 } 2202 t := i.Type 2203 z := v_0.Args[1] 2204 x := v.Args[1] 2205 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2206 break 2207 } 2208 v.reset(OpAdd64) 2209 v.AddArg(i) 2210 v0 := b.NewValue0(v.Pos, OpSub64, t) 2211 v0.AddArg(x) 2212 v0.AddArg(z) 2213 v.AddArg(v0) 2214 return true 2215 } 2216 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2217 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2218 // result: (Add64 i (Sub64 <t> x z)) 2219 for { 2220 _ = v.Args[1] 2221 x := v.Args[0] 2222 v_1 := v.Args[1] 2223 if v_1.Op != OpSub64 { 2224 break 2225 } 2226 _ = v_1.Args[1] 2227 i := v_1.Args[0] 2228 if i.Op != OpConst64 { 2229 break 2230 } 2231 t := i.Type 2232 z := v_1.Args[1] 2233 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2234 break 2235 } 2236 v.reset(OpAdd64) 2237 v.AddArg(i) 2238 v0 := b.NewValue0(v.Pos, OpSub64, t) 2239 v0.AddArg(x) 2240 v0.AddArg(z) 2241 v.AddArg(v0) 2242 return true 2243 } 2244 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2245 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2246 // result: (Add64 i (Sub64 <t> x z)) 2247 for { 2248 _ = v.Args[1] 2249 x := v.Args[0] 2250 v_1 := v.Args[1] 2251 if v_1.Op != OpSub64 { 2252 break 2253 } 2254 _ = v_1.Args[1] 2255 i := v_1.Args[0] 2256 if i.Op != OpConst64 { 2257 break 2258 } 2259 t := i.Type 2260 z := v_1.Args[1] 2261 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2262 break 2263 } 2264 v.reset(OpAdd64) 2265 v.AddArg(i) 2266 v0 := b.NewValue0(v.Pos, OpSub64, t) 2267 v0.AddArg(x) 2268 v0.AddArg(z) 2269 v.AddArg(v0) 2270 return true 2271 } 2272 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 2273 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2274 // result: (Add64 i (Sub64 <t> x z)) 2275 for { 2276 _ = v.Args[1] 2277 v_0 := v.Args[0] 2278 if v_0.Op != OpSub64 { 2279 break 2280 } 2281 _ = v_0.Args[1] 2282 i := v_0.Args[0] 2283 if i.Op != OpConst64 { 2284 break 2285 } 2286 t := i.Type 2287 z := v_0.Args[1] 2288 x := v.Args[1] 2289 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2290 break 2291 } 2292 v.reset(OpAdd64) 2293 v.AddArg(i) 2294 v0 := b.NewValue0(v.Pos, OpSub64, t) 2295 v0.AddArg(x) 2296 v0.AddArg(z) 2297 v.AddArg(v0) 2298 return true 2299 } 2300 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 2301 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2302 // result: (Sub64 (Add64 <t> x z) i) 2303 for { 2304 _ = v.Args[1] 2305 v_0 := v.Args[0] 2306 if v_0.Op != OpSub64 { 2307 break 2308 } 2309 _ = v_0.Args[1] 2310 z := v_0.Args[0] 2311 i := v_0.Args[1] 2312 if i.Op != OpConst64 { 2313 break 2314 } 2315 t := i.Type 2316 x := v.Args[1] 2317 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2318 break 2319 } 2320 v.reset(OpSub64) 2321 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2322 v0.AddArg(x) 2323 v0.AddArg(z) 2324 v.AddArg(v0) 2325 v.AddArg(i) 2326 return true 2327 } 2328 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 2329 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2330 // result: (Sub64 (Add64 <t> x z) i) 2331 for { 2332 _ = v.Args[1] 2333 x := v.Args[0] 2334 v_1 := v.Args[1] 2335 if v_1.Op != OpSub64 { 2336 break 2337 } 2338 _ = v_1.Args[1] 2339 z := v_1.Args[0] 2340 i := v_1.Args[1] 2341 if i.Op != OpConst64 { 2342 break 2343 } 2344 t := i.Type 2345 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2346 break 2347 } 2348 v.reset(OpSub64) 2349 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2350 v0.AddArg(x) 2351 v0.AddArg(z) 2352 v.AddArg(v0) 2353 v.AddArg(i) 2354 return true 2355 } 2356 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 2357 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2358 // result: (Sub64 (Add64 <t> x z) i) 2359 for { 2360 _ = v.Args[1] 2361 x := v.Args[0] 2362 v_1 := v.Args[1] 2363 if v_1.Op != OpSub64 { 2364 break 2365 } 2366 _ = v_1.Args[1] 2367 z := v_1.Args[0] 2368 i := v_1.Args[1] 2369 if i.Op != OpConst64 { 2370 break 2371 } 2372 t := i.Type 2373 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2374 break 2375 } 2376 v.reset(OpSub64) 2377 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2378 v0.AddArg(x) 2379 v0.AddArg(z) 2380 v.AddArg(v0) 2381 v.AddArg(i) 2382 return true 2383 } 2384 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 2385 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2386 // result: (Sub64 (Add64 <t> x z) i) 2387 for { 2388 _ = v.Args[1] 2389 v_0 := v.Args[0] 2390 if v_0.Op != OpSub64 { 2391 break 2392 } 2393 _ = v_0.Args[1] 2394 z := v_0.Args[0] 2395 i := v_0.Args[1] 2396 if i.Op != OpConst64 { 2397 break 2398 } 2399 t := i.Type 2400 x := v.Args[1] 2401 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2402 break 2403 } 2404 v.reset(OpSub64) 2405 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2406 v0.AddArg(x) 2407 v0.AddArg(z) 2408 v.AddArg(v0) 2409 v.AddArg(i) 2410 return true 2411 } 2412 // match: (Add64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 2413 // cond: 2414 // result: (Add64 (Const64 <t> [c+d]) x) 2415 for { 2416 _ = v.Args[1] 2417 v_0 := v.Args[0] 2418 if v_0.Op != OpConst64 { 2419 break 2420 } 2421 t := v_0.Type 2422 c := v_0.AuxInt 2423 v_1 := v.Args[1] 2424 if v_1.Op != OpAdd64 { 2425 break 2426 } 2427 _ = v_1.Args[1] 2428 v_1_0 := v_1.Args[0] 2429 if v_1_0.Op != OpConst64 { 2430 break 2431 } 2432 if v_1_0.Type != t { 2433 break 2434 } 2435 d := v_1_0.AuxInt 2436 x := v_1.Args[1] 2437 v.reset(OpAdd64) 2438 v0 := b.NewValue0(v.Pos, OpConst64, t) 2439 v0.AuxInt = c + d 2440 v.AddArg(v0) 2441 v.AddArg(x) 2442 return true 2443 } 2444 // match: (Add64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 2445 // cond: 2446 // result: (Add64 (Const64 <t> [c+d]) x) 2447 for { 2448 _ = v.Args[1] 2449 v_0 := v.Args[0] 2450 if v_0.Op != OpConst64 { 2451 break 2452 } 2453 t := v_0.Type 2454 c := v_0.AuxInt 2455 v_1 := v.Args[1] 2456 if v_1.Op != OpAdd64 { 2457 break 2458 } 2459 _ = v_1.Args[1] 2460 x := v_1.Args[0] 2461 v_1_1 := v_1.Args[1] 2462 if v_1_1.Op != OpConst64 { 2463 break 2464 } 2465 if v_1_1.Type != t { 2466 break 2467 } 2468 d := v_1_1.AuxInt 2469 v.reset(OpAdd64) 2470 v0 := b.NewValue0(v.Pos, OpConst64, t) 2471 v0.AuxInt = c + d 2472 v.AddArg(v0) 2473 v.AddArg(x) 2474 return true 2475 } 2476 return false 2477 } 2478 func rewriteValuegeneric_OpAdd64_20(v *Value) bool { 2479 b := v.Block 2480 _ = b 2481 // match: (Add64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 2482 // cond: 2483 // result: (Add64 (Const64 <t> [c+d]) x) 2484 for { 2485 _ = v.Args[1] 2486 v_0 := v.Args[0] 2487 if v_0.Op != OpAdd64 { 2488 break 2489 } 2490 _ = v_0.Args[1] 2491 v_0_0 := v_0.Args[0] 2492 if v_0_0.Op != OpConst64 { 2493 break 2494 } 2495 t := v_0_0.Type 2496 d := v_0_0.AuxInt 2497 x := v_0.Args[1] 2498 v_1 := v.Args[1] 2499 if v_1.Op != OpConst64 { 2500 break 2501 } 2502 if v_1.Type != t { 2503 break 2504 } 2505 c := v_1.AuxInt 2506 v.reset(OpAdd64) 2507 v0 := b.NewValue0(v.Pos, OpConst64, t) 2508 v0.AuxInt = c + d 2509 v.AddArg(v0) 2510 v.AddArg(x) 2511 return true 2512 } 2513 // match: (Add64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 2514 // cond: 2515 // result: (Add64 (Const64 <t> [c+d]) x) 2516 for { 2517 _ = v.Args[1] 2518 v_0 := v.Args[0] 2519 if v_0.Op != OpAdd64 { 2520 break 2521 } 2522 _ = v_0.Args[1] 2523 x := v_0.Args[0] 2524 v_0_1 := v_0.Args[1] 2525 if v_0_1.Op != OpConst64 { 2526 break 2527 } 2528 t := v_0_1.Type 2529 d := v_0_1.AuxInt 2530 v_1 := v.Args[1] 2531 if v_1.Op != OpConst64 { 2532 break 2533 } 2534 if v_1.Type != t { 2535 break 2536 } 2537 c := v_1.AuxInt 2538 v.reset(OpAdd64) 2539 v0 := b.NewValue0(v.Pos, OpConst64, t) 2540 v0.AuxInt = c + d 2541 v.AddArg(v0) 2542 v.AddArg(x) 2543 return true 2544 } 2545 // match: (Add64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 2546 // cond: 2547 // result: (Sub64 (Const64 <t> [c+d]) x) 2548 for { 2549 _ = v.Args[1] 2550 v_0 := v.Args[0] 2551 if v_0.Op != OpConst64 { 2552 break 2553 } 2554 t := v_0.Type 2555 c := v_0.AuxInt 2556 v_1 := v.Args[1] 2557 if v_1.Op != OpSub64 { 2558 break 2559 } 2560 _ = v_1.Args[1] 2561 v_1_0 := v_1.Args[0] 2562 if v_1_0.Op != OpConst64 { 2563 break 2564 } 2565 if v_1_0.Type != t { 2566 break 2567 } 2568 d := v_1_0.AuxInt 2569 x := v_1.Args[1] 2570 v.reset(OpSub64) 2571 v0 := b.NewValue0(v.Pos, OpConst64, t) 2572 v0.AuxInt = c + d 2573 v.AddArg(v0) 2574 v.AddArg(x) 2575 return true 2576 } 2577 // match: (Add64 (Sub64 (Const64 <t> [d]) x) (Const64 <t> [c])) 2578 // cond: 2579 // result: (Sub64 (Const64 <t> [c+d]) x) 2580 for { 2581 _ = v.Args[1] 2582 v_0 := v.Args[0] 2583 if v_0.Op != OpSub64 { 2584 break 2585 } 2586 _ = v_0.Args[1] 2587 v_0_0 := v_0.Args[0] 2588 if v_0_0.Op != OpConst64 { 2589 break 2590 } 2591 t := v_0_0.Type 2592 d := v_0_0.AuxInt 2593 x := v_0.Args[1] 2594 v_1 := v.Args[1] 2595 if v_1.Op != OpConst64 { 2596 break 2597 } 2598 if v_1.Type != t { 2599 break 2600 } 2601 c := v_1.AuxInt 2602 v.reset(OpSub64) 2603 v0 := b.NewValue0(v.Pos, OpConst64, t) 2604 v0.AuxInt = c + d 2605 v.AddArg(v0) 2606 v.AddArg(x) 2607 return true 2608 } 2609 // match: (Add64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 2610 // cond: 2611 // result: (Add64 (Const64 <t> [c-d]) x) 2612 for { 2613 _ = v.Args[1] 2614 v_0 := v.Args[0] 2615 if v_0.Op != OpConst64 { 2616 break 2617 } 2618 t := v_0.Type 2619 c := v_0.AuxInt 2620 v_1 := v.Args[1] 2621 if v_1.Op != OpSub64 { 2622 break 2623 } 2624 _ = v_1.Args[1] 2625 x := v_1.Args[0] 2626 v_1_1 := v_1.Args[1] 2627 if v_1_1.Op != OpConst64 { 2628 break 2629 } 2630 if v_1_1.Type != t { 2631 break 2632 } 2633 d := v_1_1.AuxInt 2634 v.reset(OpAdd64) 2635 v0 := b.NewValue0(v.Pos, OpConst64, t) 2636 v0.AuxInt = c - d 2637 v.AddArg(v0) 2638 v.AddArg(x) 2639 return true 2640 } 2641 // match: (Add64 (Sub64 x (Const64 <t> [d])) (Const64 <t> [c])) 2642 // cond: 2643 // result: (Add64 (Const64 <t> [c-d]) x) 2644 for { 2645 _ = v.Args[1] 2646 v_0 := v.Args[0] 2647 if v_0.Op != OpSub64 { 2648 break 2649 } 2650 _ = v_0.Args[1] 2651 x := v_0.Args[0] 2652 v_0_1 := v_0.Args[1] 2653 if v_0_1.Op != OpConst64 { 2654 break 2655 } 2656 t := v_0_1.Type 2657 d := v_0_1.AuxInt 2658 v_1 := v.Args[1] 2659 if v_1.Op != OpConst64 { 2660 break 2661 } 2662 if v_1.Type != t { 2663 break 2664 } 2665 c := v_1.AuxInt 2666 v.reset(OpAdd64) 2667 v0 := b.NewValue0(v.Pos, OpConst64, t) 2668 v0.AuxInt = c - d 2669 v.AddArg(v0) 2670 v.AddArg(x) 2671 return true 2672 } 2673 return false 2674 } 2675 func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { 2676 // match: (Add64F (Const64F [c]) (Const64F [d])) 2677 // cond: 2678 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 2679 for { 2680 _ = v.Args[1] 2681 v_0 := v.Args[0] 2682 if v_0.Op != OpConst64F { 2683 break 2684 } 2685 c := v_0.AuxInt 2686 v_1 := v.Args[1] 2687 if v_1.Op != OpConst64F { 2688 break 2689 } 2690 d := v_1.AuxInt 2691 v.reset(OpConst64F) 2692 v.AuxInt = f2i(i2f(c) + i2f(d)) 2693 return true 2694 } 2695 // match: (Add64F (Const64F [d]) (Const64F [c])) 2696 // cond: 2697 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 2698 for { 2699 _ = v.Args[1] 2700 v_0 := v.Args[0] 2701 if v_0.Op != OpConst64F { 2702 break 2703 } 2704 d := v_0.AuxInt 2705 v_1 := v.Args[1] 2706 if v_1.Op != OpConst64F { 2707 break 2708 } 2709 c := v_1.AuxInt 2710 v.reset(OpConst64F) 2711 v.AuxInt = f2i(i2f(c) + i2f(d)) 2712 return true 2713 } 2714 // match: (Add64F x (Const64F [0])) 2715 // cond: 2716 // result: x 2717 for { 2718 _ = v.Args[1] 2719 x := v.Args[0] 2720 v_1 := v.Args[1] 2721 if v_1.Op != OpConst64F { 2722 break 2723 } 2724 if v_1.AuxInt != 0 { 2725 break 2726 } 2727 v.reset(OpCopy) 2728 v.Type = x.Type 2729 v.AddArg(x) 2730 return true 2731 } 2732 // match: (Add64F (Const64F [0]) x) 2733 // cond: 2734 // result: x 2735 for { 2736 _ = v.Args[1] 2737 v_0 := v.Args[0] 2738 if v_0.Op != OpConst64F { 2739 break 2740 } 2741 if v_0.AuxInt != 0 { 2742 break 2743 } 2744 x := v.Args[1] 2745 v.reset(OpCopy) 2746 v.Type = x.Type 2747 v.AddArg(x) 2748 return true 2749 } 2750 return false 2751 } 2752 func rewriteValuegeneric_OpAdd8_0(v *Value) bool { 2753 b := v.Block 2754 _ = b 2755 // match: (Add8 (Const8 [c]) (Const8 [d])) 2756 // cond: 2757 // result: (Const8 [int64(int8(c+d))]) 2758 for { 2759 _ = v.Args[1] 2760 v_0 := v.Args[0] 2761 if v_0.Op != OpConst8 { 2762 break 2763 } 2764 c := v_0.AuxInt 2765 v_1 := v.Args[1] 2766 if v_1.Op != OpConst8 { 2767 break 2768 } 2769 d := v_1.AuxInt 2770 v.reset(OpConst8) 2771 v.AuxInt = int64(int8(c + d)) 2772 return true 2773 } 2774 // match: (Add8 (Const8 [d]) (Const8 [c])) 2775 // cond: 2776 // result: (Const8 [int64(int8(c+d))]) 2777 for { 2778 _ = v.Args[1] 2779 v_0 := v.Args[0] 2780 if v_0.Op != OpConst8 { 2781 break 2782 } 2783 d := v_0.AuxInt 2784 v_1 := v.Args[1] 2785 if v_1.Op != OpConst8 { 2786 break 2787 } 2788 c := v_1.AuxInt 2789 v.reset(OpConst8) 2790 v.AuxInt = int64(int8(c + d)) 2791 return true 2792 } 2793 // match: (Add8 (Const8 [0]) x) 2794 // cond: 2795 // result: x 2796 for { 2797 _ = v.Args[1] 2798 v_0 := v.Args[0] 2799 if v_0.Op != OpConst8 { 2800 break 2801 } 2802 if v_0.AuxInt != 0 { 2803 break 2804 } 2805 x := v.Args[1] 2806 v.reset(OpCopy) 2807 v.Type = x.Type 2808 v.AddArg(x) 2809 return true 2810 } 2811 // match: (Add8 x (Const8 [0])) 2812 // cond: 2813 // result: x 2814 for { 2815 _ = v.Args[1] 2816 x := v.Args[0] 2817 v_1 := v.Args[1] 2818 if v_1.Op != OpConst8 { 2819 break 2820 } 2821 if v_1.AuxInt != 0 { 2822 break 2823 } 2824 v.reset(OpCopy) 2825 v.Type = x.Type 2826 v.AddArg(x) 2827 return true 2828 } 2829 // match: (Add8 (Const8 [1]) (Com8 x)) 2830 // cond: 2831 // result: (Neg8 x) 2832 for { 2833 _ = v.Args[1] 2834 v_0 := v.Args[0] 2835 if v_0.Op != OpConst8 { 2836 break 2837 } 2838 if v_0.AuxInt != 1 { 2839 break 2840 } 2841 v_1 := v.Args[1] 2842 if v_1.Op != OpCom8 { 2843 break 2844 } 2845 x := v_1.Args[0] 2846 v.reset(OpNeg8) 2847 v.AddArg(x) 2848 return true 2849 } 2850 // match: (Add8 (Com8 x) (Const8 [1])) 2851 // cond: 2852 // result: (Neg8 x) 2853 for { 2854 _ = v.Args[1] 2855 v_0 := v.Args[0] 2856 if v_0.Op != OpCom8 { 2857 break 2858 } 2859 x := v_0.Args[0] 2860 v_1 := v.Args[1] 2861 if v_1.Op != OpConst8 { 2862 break 2863 } 2864 if v_1.AuxInt != 1 { 2865 break 2866 } 2867 v.reset(OpNeg8) 2868 v.AddArg(x) 2869 return true 2870 } 2871 // match: (Add8 (Add8 i:(Const8 <t>) z) x) 2872 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2873 // result: (Add8 i (Add8 <t> z x)) 2874 for { 2875 _ = v.Args[1] 2876 v_0 := v.Args[0] 2877 if v_0.Op != OpAdd8 { 2878 break 2879 } 2880 _ = v_0.Args[1] 2881 i := v_0.Args[0] 2882 if i.Op != OpConst8 { 2883 break 2884 } 2885 t := i.Type 2886 z := v_0.Args[1] 2887 x := v.Args[1] 2888 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2889 break 2890 } 2891 v.reset(OpAdd8) 2892 v.AddArg(i) 2893 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2894 v0.AddArg(z) 2895 v0.AddArg(x) 2896 v.AddArg(v0) 2897 return true 2898 } 2899 // match: (Add8 (Add8 z i:(Const8 <t>)) x) 2900 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2901 // result: (Add8 i (Add8 <t> z x)) 2902 for { 2903 _ = v.Args[1] 2904 v_0 := v.Args[0] 2905 if v_0.Op != OpAdd8 { 2906 break 2907 } 2908 _ = v_0.Args[1] 2909 z := v_0.Args[0] 2910 i := v_0.Args[1] 2911 if i.Op != OpConst8 { 2912 break 2913 } 2914 t := i.Type 2915 x := v.Args[1] 2916 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2917 break 2918 } 2919 v.reset(OpAdd8) 2920 v.AddArg(i) 2921 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2922 v0.AddArg(z) 2923 v0.AddArg(x) 2924 v.AddArg(v0) 2925 return true 2926 } 2927 // match: (Add8 x (Add8 i:(Const8 <t>) z)) 2928 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2929 // result: (Add8 i (Add8 <t> z x)) 2930 for { 2931 _ = v.Args[1] 2932 x := v.Args[0] 2933 v_1 := v.Args[1] 2934 if v_1.Op != OpAdd8 { 2935 break 2936 } 2937 _ = v_1.Args[1] 2938 i := v_1.Args[0] 2939 if i.Op != OpConst8 { 2940 break 2941 } 2942 t := i.Type 2943 z := v_1.Args[1] 2944 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2945 break 2946 } 2947 v.reset(OpAdd8) 2948 v.AddArg(i) 2949 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2950 v0.AddArg(z) 2951 v0.AddArg(x) 2952 v.AddArg(v0) 2953 return true 2954 } 2955 // match: (Add8 x (Add8 z i:(Const8 <t>))) 2956 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2957 // result: (Add8 i (Add8 <t> z x)) 2958 for { 2959 _ = v.Args[1] 2960 x := v.Args[0] 2961 v_1 := v.Args[1] 2962 if v_1.Op != OpAdd8 { 2963 break 2964 } 2965 _ = v_1.Args[1] 2966 z := v_1.Args[0] 2967 i := v_1.Args[1] 2968 if i.Op != OpConst8 { 2969 break 2970 } 2971 t := i.Type 2972 if !(z.Op != OpConst8 && x.Op != OpConst8) { 2973 break 2974 } 2975 v.reset(OpAdd8) 2976 v.AddArg(i) 2977 v0 := b.NewValue0(v.Pos, OpAdd8, t) 2978 v0.AddArg(z) 2979 v0.AddArg(x) 2980 v.AddArg(v0) 2981 return true 2982 } 2983 return false 2984 } 2985 func rewriteValuegeneric_OpAdd8_10(v *Value) bool { 2986 b := v.Block 2987 _ = b 2988 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 2989 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 2990 // result: (Add8 i (Sub8 <t> x z)) 2991 for { 2992 _ = v.Args[1] 2993 v_0 := v.Args[0] 2994 if v_0.Op != OpSub8 { 2995 break 2996 } 2997 _ = v_0.Args[1] 2998 i := v_0.Args[0] 2999 if i.Op != OpConst8 { 3000 break 3001 } 3002 t := i.Type 3003 z := v_0.Args[1] 3004 x := v.Args[1] 3005 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3006 break 3007 } 3008 v.reset(OpAdd8) 3009 v.AddArg(i) 3010 v0 := b.NewValue0(v.Pos, OpSub8, t) 3011 v0.AddArg(x) 3012 v0.AddArg(z) 3013 v.AddArg(v0) 3014 return true 3015 } 3016 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 3017 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3018 // result: (Add8 i (Sub8 <t> x z)) 3019 for { 3020 _ = v.Args[1] 3021 x := v.Args[0] 3022 v_1 := v.Args[1] 3023 if v_1.Op != OpSub8 { 3024 break 3025 } 3026 _ = v_1.Args[1] 3027 i := v_1.Args[0] 3028 if i.Op != OpConst8 { 3029 break 3030 } 3031 t := i.Type 3032 z := v_1.Args[1] 3033 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3034 break 3035 } 3036 v.reset(OpAdd8) 3037 v.AddArg(i) 3038 v0 := b.NewValue0(v.Pos, OpSub8, t) 3039 v0.AddArg(x) 3040 v0.AddArg(z) 3041 v.AddArg(v0) 3042 return true 3043 } 3044 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 3045 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3046 // result: (Add8 i (Sub8 <t> x z)) 3047 for { 3048 _ = v.Args[1] 3049 x := v.Args[0] 3050 v_1 := v.Args[1] 3051 if v_1.Op != OpSub8 { 3052 break 3053 } 3054 _ = v_1.Args[1] 3055 i := v_1.Args[0] 3056 if i.Op != OpConst8 { 3057 break 3058 } 3059 t := i.Type 3060 z := v_1.Args[1] 3061 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3062 break 3063 } 3064 v.reset(OpAdd8) 3065 v.AddArg(i) 3066 v0 := b.NewValue0(v.Pos, OpSub8, t) 3067 v0.AddArg(x) 3068 v0.AddArg(z) 3069 v.AddArg(v0) 3070 return true 3071 } 3072 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 3073 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3074 // result: (Add8 i (Sub8 <t> x z)) 3075 for { 3076 _ = v.Args[1] 3077 v_0 := v.Args[0] 3078 if v_0.Op != OpSub8 { 3079 break 3080 } 3081 _ = v_0.Args[1] 3082 i := v_0.Args[0] 3083 if i.Op != OpConst8 { 3084 break 3085 } 3086 t := i.Type 3087 z := v_0.Args[1] 3088 x := v.Args[1] 3089 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3090 break 3091 } 3092 v.reset(OpAdd8) 3093 v.AddArg(i) 3094 v0 := b.NewValue0(v.Pos, OpSub8, t) 3095 v0.AddArg(x) 3096 v0.AddArg(z) 3097 v.AddArg(v0) 3098 return true 3099 } 3100 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 3101 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3102 // result: (Sub8 (Add8 <t> x z) i) 3103 for { 3104 _ = v.Args[1] 3105 v_0 := v.Args[0] 3106 if v_0.Op != OpSub8 { 3107 break 3108 } 3109 _ = v_0.Args[1] 3110 z := v_0.Args[0] 3111 i := v_0.Args[1] 3112 if i.Op != OpConst8 { 3113 break 3114 } 3115 t := i.Type 3116 x := v.Args[1] 3117 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3118 break 3119 } 3120 v.reset(OpSub8) 3121 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3122 v0.AddArg(x) 3123 v0.AddArg(z) 3124 v.AddArg(v0) 3125 v.AddArg(i) 3126 return true 3127 } 3128 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 3129 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3130 // result: (Sub8 (Add8 <t> x z) i) 3131 for { 3132 _ = v.Args[1] 3133 x := v.Args[0] 3134 v_1 := v.Args[1] 3135 if v_1.Op != OpSub8 { 3136 break 3137 } 3138 _ = v_1.Args[1] 3139 z := v_1.Args[0] 3140 i := v_1.Args[1] 3141 if i.Op != OpConst8 { 3142 break 3143 } 3144 t := i.Type 3145 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3146 break 3147 } 3148 v.reset(OpSub8) 3149 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3150 v0.AddArg(x) 3151 v0.AddArg(z) 3152 v.AddArg(v0) 3153 v.AddArg(i) 3154 return true 3155 } 3156 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 3157 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3158 // result: (Sub8 (Add8 <t> x z) i) 3159 for { 3160 _ = v.Args[1] 3161 x := v.Args[0] 3162 v_1 := v.Args[1] 3163 if v_1.Op != OpSub8 { 3164 break 3165 } 3166 _ = v_1.Args[1] 3167 z := v_1.Args[0] 3168 i := v_1.Args[1] 3169 if i.Op != OpConst8 { 3170 break 3171 } 3172 t := i.Type 3173 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3174 break 3175 } 3176 v.reset(OpSub8) 3177 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3178 v0.AddArg(x) 3179 v0.AddArg(z) 3180 v.AddArg(v0) 3181 v.AddArg(i) 3182 return true 3183 } 3184 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 3185 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3186 // result: (Sub8 (Add8 <t> x z) i) 3187 for { 3188 _ = v.Args[1] 3189 v_0 := v.Args[0] 3190 if v_0.Op != OpSub8 { 3191 break 3192 } 3193 _ = v_0.Args[1] 3194 z := v_0.Args[0] 3195 i := v_0.Args[1] 3196 if i.Op != OpConst8 { 3197 break 3198 } 3199 t := i.Type 3200 x := v.Args[1] 3201 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3202 break 3203 } 3204 v.reset(OpSub8) 3205 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3206 v0.AddArg(x) 3207 v0.AddArg(z) 3208 v.AddArg(v0) 3209 v.AddArg(i) 3210 return true 3211 } 3212 // match: (Add8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 3213 // cond: 3214 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 3215 for { 3216 _ = v.Args[1] 3217 v_0 := v.Args[0] 3218 if v_0.Op != OpConst8 { 3219 break 3220 } 3221 t := v_0.Type 3222 c := v_0.AuxInt 3223 v_1 := v.Args[1] 3224 if v_1.Op != OpAdd8 { 3225 break 3226 } 3227 _ = v_1.Args[1] 3228 v_1_0 := v_1.Args[0] 3229 if v_1_0.Op != OpConst8 { 3230 break 3231 } 3232 if v_1_0.Type != t { 3233 break 3234 } 3235 d := v_1_0.AuxInt 3236 x := v_1.Args[1] 3237 v.reset(OpAdd8) 3238 v0 := b.NewValue0(v.Pos, OpConst8, t) 3239 v0.AuxInt = int64(int8(c + d)) 3240 v.AddArg(v0) 3241 v.AddArg(x) 3242 return true 3243 } 3244 // match: (Add8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 3245 // cond: 3246 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 3247 for { 3248 _ = v.Args[1] 3249 v_0 := v.Args[0] 3250 if v_0.Op != OpConst8 { 3251 break 3252 } 3253 t := v_0.Type 3254 c := v_0.AuxInt 3255 v_1 := v.Args[1] 3256 if v_1.Op != OpAdd8 { 3257 break 3258 } 3259 _ = v_1.Args[1] 3260 x := v_1.Args[0] 3261 v_1_1 := v_1.Args[1] 3262 if v_1_1.Op != OpConst8 { 3263 break 3264 } 3265 if v_1_1.Type != t { 3266 break 3267 } 3268 d := v_1_1.AuxInt 3269 v.reset(OpAdd8) 3270 v0 := b.NewValue0(v.Pos, OpConst8, t) 3271 v0.AuxInt = int64(int8(c + d)) 3272 v.AddArg(v0) 3273 v.AddArg(x) 3274 return true 3275 } 3276 return false 3277 } 3278 func rewriteValuegeneric_OpAdd8_20(v *Value) bool { 3279 b := v.Block 3280 _ = b 3281 // match: (Add8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 3282 // cond: 3283 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 3284 for { 3285 _ = v.Args[1] 3286 v_0 := v.Args[0] 3287 if v_0.Op != OpAdd8 { 3288 break 3289 } 3290 _ = v_0.Args[1] 3291 v_0_0 := v_0.Args[0] 3292 if v_0_0.Op != OpConst8 { 3293 break 3294 } 3295 t := v_0_0.Type 3296 d := v_0_0.AuxInt 3297 x := v_0.Args[1] 3298 v_1 := v.Args[1] 3299 if v_1.Op != OpConst8 { 3300 break 3301 } 3302 if v_1.Type != t { 3303 break 3304 } 3305 c := v_1.AuxInt 3306 v.reset(OpAdd8) 3307 v0 := b.NewValue0(v.Pos, OpConst8, t) 3308 v0.AuxInt = int64(int8(c + d)) 3309 v.AddArg(v0) 3310 v.AddArg(x) 3311 return true 3312 } 3313 // match: (Add8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 3314 // cond: 3315 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 3316 for { 3317 _ = v.Args[1] 3318 v_0 := v.Args[0] 3319 if v_0.Op != OpAdd8 { 3320 break 3321 } 3322 _ = v_0.Args[1] 3323 x := v_0.Args[0] 3324 v_0_1 := v_0.Args[1] 3325 if v_0_1.Op != OpConst8 { 3326 break 3327 } 3328 t := v_0_1.Type 3329 d := v_0_1.AuxInt 3330 v_1 := v.Args[1] 3331 if v_1.Op != OpConst8 { 3332 break 3333 } 3334 if v_1.Type != t { 3335 break 3336 } 3337 c := v_1.AuxInt 3338 v.reset(OpAdd8) 3339 v0 := b.NewValue0(v.Pos, OpConst8, t) 3340 v0.AuxInt = int64(int8(c + d)) 3341 v.AddArg(v0) 3342 v.AddArg(x) 3343 return true 3344 } 3345 // match: (Add8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 3346 // cond: 3347 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 3348 for { 3349 _ = v.Args[1] 3350 v_0 := v.Args[0] 3351 if v_0.Op != OpConst8 { 3352 break 3353 } 3354 t := v_0.Type 3355 c := v_0.AuxInt 3356 v_1 := v.Args[1] 3357 if v_1.Op != OpSub8 { 3358 break 3359 } 3360 _ = v_1.Args[1] 3361 v_1_0 := v_1.Args[0] 3362 if v_1_0.Op != OpConst8 { 3363 break 3364 } 3365 if v_1_0.Type != t { 3366 break 3367 } 3368 d := v_1_0.AuxInt 3369 x := v_1.Args[1] 3370 v.reset(OpSub8) 3371 v0 := b.NewValue0(v.Pos, OpConst8, t) 3372 v0.AuxInt = int64(int8(c + d)) 3373 v.AddArg(v0) 3374 v.AddArg(x) 3375 return true 3376 } 3377 // match: (Add8 (Sub8 (Const8 <t> [d]) x) (Const8 <t> [c])) 3378 // cond: 3379 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 3380 for { 3381 _ = v.Args[1] 3382 v_0 := v.Args[0] 3383 if v_0.Op != OpSub8 { 3384 break 3385 } 3386 _ = v_0.Args[1] 3387 v_0_0 := v_0.Args[0] 3388 if v_0_0.Op != OpConst8 { 3389 break 3390 } 3391 t := v_0_0.Type 3392 d := v_0_0.AuxInt 3393 x := v_0.Args[1] 3394 v_1 := v.Args[1] 3395 if v_1.Op != OpConst8 { 3396 break 3397 } 3398 if v_1.Type != t { 3399 break 3400 } 3401 c := v_1.AuxInt 3402 v.reset(OpSub8) 3403 v0 := b.NewValue0(v.Pos, OpConst8, t) 3404 v0.AuxInt = int64(int8(c + d)) 3405 v.AddArg(v0) 3406 v.AddArg(x) 3407 return true 3408 } 3409 // match: (Add8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 3410 // cond: 3411 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 3412 for { 3413 _ = v.Args[1] 3414 v_0 := v.Args[0] 3415 if v_0.Op != OpConst8 { 3416 break 3417 } 3418 t := v_0.Type 3419 c := v_0.AuxInt 3420 v_1 := v.Args[1] 3421 if v_1.Op != OpSub8 { 3422 break 3423 } 3424 _ = v_1.Args[1] 3425 x := v_1.Args[0] 3426 v_1_1 := v_1.Args[1] 3427 if v_1_1.Op != OpConst8 { 3428 break 3429 } 3430 if v_1_1.Type != t { 3431 break 3432 } 3433 d := v_1_1.AuxInt 3434 v.reset(OpAdd8) 3435 v0 := b.NewValue0(v.Pos, OpConst8, t) 3436 v0.AuxInt = int64(int8(c - d)) 3437 v.AddArg(v0) 3438 v.AddArg(x) 3439 return true 3440 } 3441 // match: (Add8 (Sub8 x (Const8 <t> [d])) (Const8 <t> [c])) 3442 // cond: 3443 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 3444 for { 3445 _ = v.Args[1] 3446 v_0 := v.Args[0] 3447 if v_0.Op != OpSub8 { 3448 break 3449 } 3450 _ = v_0.Args[1] 3451 x := v_0.Args[0] 3452 v_0_1 := v_0.Args[1] 3453 if v_0_1.Op != OpConst8 { 3454 break 3455 } 3456 t := v_0_1.Type 3457 d := v_0_1.AuxInt 3458 v_1 := v.Args[1] 3459 if v_1.Op != OpConst8 { 3460 break 3461 } 3462 if v_1.Type != t { 3463 break 3464 } 3465 c := v_1.AuxInt 3466 v.reset(OpAdd8) 3467 v0 := b.NewValue0(v.Pos, OpConst8, t) 3468 v0.AuxInt = int64(int8(c - d)) 3469 v.AddArg(v0) 3470 v.AddArg(x) 3471 return true 3472 } 3473 return false 3474 } 3475 func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { 3476 // match: (AddPtr <t> x (Const64 [c])) 3477 // cond: 3478 // result: (OffPtr <t> x [c]) 3479 for { 3480 t := v.Type 3481 _ = v.Args[1] 3482 x := v.Args[0] 3483 v_1 := v.Args[1] 3484 if v_1.Op != OpConst64 { 3485 break 3486 } 3487 c := v_1.AuxInt 3488 v.reset(OpOffPtr) 3489 v.Type = t 3490 v.AuxInt = c 3491 v.AddArg(x) 3492 return true 3493 } 3494 // match: (AddPtr <t> x (Const32 [c])) 3495 // cond: 3496 // result: (OffPtr <t> x [c]) 3497 for { 3498 t := v.Type 3499 _ = v.Args[1] 3500 x := v.Args[0] 3501 v_1 := v.Args[1] 3502 if v_1.Op != OpConst32 { 3503 break 3504 } 3505 c := v_1.AuxInt 3506 v.reset(OpOffPtr) 3507 v.Type = t 3508 v.AuxInt = c 3509 v.AddArg(x) 3510 return true 3511 } 3512 return false 3513 } 3514 func rewriteValuegeneric_OpAnd16_0(v *Value) bool { 3515 // match: (And16 (Const16 [c]) (Const16 [d])) 3516 // cond: 3517 // result: (Const16 [int64(int16(c&d))]) 3518 for { 3519 _ = v.Args[1] 3520 v_0 := v.Args[0] 3521 if v_0.Op != OpConst16 { 3522 break 3523 } 3524 c := v_0.AuxInt 3525 v_1 := v.Args[1] 3526 if v_1.Op != OpConst16 { 3527 break 3528 } 3529 d := v_1.AuxInt 3530 v.reset(OpConst16) 3531 v.AuxInt = int64(int16(c & d)) 3532 return true 3533 } 3534 // match: (And16 (Const16 [d]) (Const16 [c])) 3535 // cond: 3536 // result: (Const16 [int64(int16(c&d))]) 3537 for { 3538 _ = v.Args[1] 3539 v_0 := v.Args[0] 3540 if v_0.Op != OpConst16 { 3541 break 3542 } 3543 d := v_0.AuxInt 3544 v_1 := v.Args[1] 3545 if v_1.Op != OpConst16 { 3546 break 3547 } 3548 c := v_1.AuxInt 3549 v.reset(OpConst16) 3550 v.AuxInt = int64(int16(c & d)) 3551 return true 3552 } 3553 // match: (And16 x x) 3554 // cond: 3555 // result: x 3556 for { 3557 _ = v.Args[1] 3558 x := v.Args[0] 3559 if x != v.Args[1] { 3560 break 3561 } 3562 v.reset(OpCopy) 3563 v.Type = x.Type 3564 v.AddArg(x) 3565 return true 3566 } 3567 // match: (And16 (Const16 [-1]) x) 3568 // cond: 3569 // result: x 3570 for { 3571 _ = v.Args[1] 3572 v_0 := v.Args[0] 3573 if v_0.Op != OpConst16 { 3574 break 3575 } 3576 if v_0.AuxInt != -1 { 3577 break 3578 } 3579 x := v.Args[1] 3580 v.reset(OpCopy) 3581 v.Type = x.Type 3582 v.AddArg(x) 3583 return true 3584 } 3585 // match: (And16 x (Const16 [-1])) 3586 // cond: 3587 // result: x 3588 for { 3589 _ = v.Args[1] 3590 x := v.Args[0] 3591 v_1 := v.Args[1] 3592 if v_1.Op != OpConst16 { 3593 break 3594 } 3595 if v_1.AuxInt != -1 { 3596 break 3597 } 3598 v.reset(OpCopy) 3599 v.Type = x.Type 3600 v.AddArg(x) 3601 return true 3602 } 3603 // match: (And16 (Const16 [0]) _) 3604 // cond: 3605 // result: (Const16 [0]) 3606 for { 3607 _ = v.Args[1] 3608 v_0 := v.Args[0] 3609 if v_0.Op != OpConst16 { 3610 break 3611 } 3612 if v_0.AuxInt != 0 { 3613 break 3614 } 3615 v.reset(OpConst16) 3616 v.AuxInt = 0 3617 return true 3618 } 3619 // match: (And16 _ (Const16 [0])) 3620 // cond: 3621 // result: (Const16 [0]) 3622 for { 3623 _ = v.Args[1] 3624 v_1 := v.Args[1] 3625 if v_1.Op != OpConst16 { 3626 break 3627 } 3628 if v_1.AuxInt != 0 { 3629 break 3630 } 3631 v.reset(OpConst16) 3632 v.AuxInt = 0 3633 return true 3634 } 3635 // match: (And16 x (And16 x y)) 3636 // cond: 3637 // result: (And16 x y) 3638 for { 3639 _ = v.Args[1] 3640 x := v.Args[0] 3641 v_1 := v.Args[1] 3642 if v_1.Op != OpAnd16 { 3643 break 3644 } 3645 _ = v_1.Args[1] 3646 if x != v_1.Args[0] { 3647 break 3648 } 3649 y := v_1.Args[1] 3650 v.reset(OpAnd16) 3651 v.AddArg(x) 3652 v.AddArg(y) 3653 return true 3654 } 3655 // match: (And16 x (And16 y x)) 3656 // cond: 3657 // result: (And16 x y) 3658 for { 3659 _ = v.Args[1] 3660 x := v.Args[0] 3661 v_1 := v.Args[1] 3662 if v_1.Op != OpAnd16 { 3663 break 3664 } 3665 _ = v_1.Args[1] 3666 y := v_1.Args[0] 3667 if x != v_1.Args[1] { 3668 break 3669 } 3670 v.reset(OpAnd16) 3671 v.AddArg(x) 3672 v.AddArg(y) 3673 return true 3674 } 3675 // match: (And16 (And16 x y) x) 3676 // cond: 3677 // result: (And16 x y) 3678 for { 3679 _ = v.Args[1] 3680 v_0 := v.Args[0] 3681 if v_0.Op != OpAnd16 { 3682 break 3683 } 3684 _ = v_0.Args[1] 3685 x := v_0.Args[0] 3686 y := v_0.Args[1] 3687 if x != v.Args[1] { 3688 break 3689 } 3690 v.reset(OpAnd16) 3691 v.AddArg(x) 3692 v.AddArg(y) 3693 return true 3694 } 3695 return false 3696 } 3697 func rewriteValuegeneric_OpAnd16_10(v *Value) bool { 3698 b := v.Block 3699 _ = b 3700 // match: (And16 (And16 y x) x) 3701 // cond: 3702 // result: (And16 x y) 3703 for { 3704 _ = v.Args[1] 3705 v_0 := v.Args[0] 3706 if v_0.Op != OpAnd16 { 3707 break 3708 } 3709 _ = v_0.Args[1] 3710 y := v_0.Args[0] 3711 x := v_0.Args[1] 3712 if x != v.Args[1] { 3713 break 3714 } 3715 v.reset(OpAnd16) 3716 v.AddArg(x) 3717 v.AddArg(y) 3718 return true 3719 } 3720 // match: (And16 (And16 i:(Const16 <t>) z) x) 3721 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 3722 // result: (And16 i (And16 <t> z x)) 3723 for { 3724 _ = v.Args[1] 3725 v_0 := v.Args[0] 3726 if v_0.Op != OpAnd16 { 3727 break 3728 } 3729 _ = v_0.Args[1] 3730 i := v_0.Args[0] 3731 if i.Op != OpConst16 { 3732 break 3733 } 3734 t := i.Type 3735 z := v_0.Args[1] 3736 x := v.Args[1] 3737 if !(z.Op != OpConst16 && x.Op != OpConst16) { 3738 break 3739 } 3740 v.reset(OpAnd16) 3741 v.AddArg(i) 3742 v0 := b.NewValue0(v.Pos, OpAnd16, t) 3743 v0.AddArg(z) 3744 v0.AddArg(x) 3745 v.AddArg(v0) 3746 return true 3747 } 3748 // match: (And16 (And16 z i:(Const16 <t>)) x) 3749 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 3750 // result: (And16 i (And16 <t> z x)) 3751 for { 3752 _ = v.Args[1] 3753 v_0 := v.Args[0] 3754 if v_0.Op != OpAnd16 { 3755 break 3756 } 3757 _ = v_0.Args[1] 3758 z := v_0.Args[0] 3759 i := v_0.Args[1] 3760 if i.Op != OpConst16 { 3761 break 3762 } 3763 t := i.Type 3764 x := v.Args[1] 3765 if !(z.Op != OpConst16 && x.Op != OpConst16) { 3766 break 3767 } 3768 v.reset(OpAnd16) 3769 v.AddArg(i) 3770 v0 := b.NewValue0(v.Pos, OpAnd16, t) 3771 v0.AddArg(z) 3772 v0.AddArg(x) 3773 v.AddArg(v0) 3774 return true 3775 } 3776 // match: (And16 x (And16 i:(Const16 <t>) z)) 3777 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 3778 // result: (And16 i (And16 <t> z x)) 3779 for { 3780 _ = v.Args[1] 3781 x := v.Args[0] 3782 v_1 := v.Args[1] 3783 if v_1.Op != OpAnd16 { 3784 break 3785 } 3786 _ = v_1.Args[1] 3787 i := v_1.Args[0] 3788 if i.Op != OpConst16 { 3789 break 3790 } 3791 t := i.Type 3792 z := v_1.Args[1] 3793 if !(z.Op != OpConst16 && x.Op != OpConst16) { 3794 break 3795 } 3796 v.reset(OpAnd16) 3797 v.AddArg(i) 3798 v0 := b.NewValue0(v.Pos, OpAnd16, t) 3799 v0.AddArg(z) 3800 v0.AddArg(x) 3801 v.AddArg(v0) 3802 return true 3803 } 3804 // match: (And16 x (And16 z i:(Const16 <t>))) 3805 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 3806 // result: (And16 i (And16 <t> z x)) 3807 for { 3808 _ = v.Args[1] 3809 x := v.Args[0] 3810 v_1 := v.Args[1] 3811 if v_1.Op != OpAnd16 { 3812 break 3813 } 3814 _ = v_1.Args[1] 3815 z := v_1.Args[0] 3816 i := v_1.Args[1] 3817 if i.Op != OpConst16 { 3818 break 3819 } 3820 t := i.Type 3821 if !(z.Op != OpConst16 && x.Op != OpConst16) { 3822 break 3823 } 3824 v.reset(OpAnd16) 3825 v.AddArg(i) 3826 v0 := b.NewValue0(v.Pos, OpAnd16, t) 3827 v0.AddArg(z) 3828 v0.AddArg(x) 3829 v.AddArg(v0) 3830 return true 3831 } 3832 // match: (And16 (Const16 <t> [c]) (And16 (Const16 <t> [d]) x)) 3833 // cond: 3834 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 3835 for { 3836 _ = v.Args[1] 3837 v_0 := v.Args[0] 3838 if v_0.Op != OpConst16 { 3839 break 3840 } 3841 t := v_0.Type 3842 c := v_0.AuxInt 3843 v_1 := v.Args[1] 3844 if v_1.Op != OpAnd16 { 3845 break 3846 } 3847 _ = v_1.Args[1] 3848 v_1_0 := v_1.Args[0] 3849 if v_1_0.Op != OpConst16 { 3850 break 3851 } 3852 if v_1_0.Type != t { 3853 break 3854 } 3855 d := v_1_0.AuxInt 3856 x := v_1.Args[1] 3857 v.reset(OpAnd16) 3858 v0 := b.NewValue0(v.Pos, OpConst16, t) 3859 v0.AuxInt = int64(int16(c & d)) 3860 v.AddArg(v0) 3861 v.AddArg(x) 3862 return true 3863 } 3864 // match: (And16 (Const16 <t> [c]) (And16 x (Const16 <t> [d]))) 3865 // cond: 3866 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 3867 for { 3868 _ = v.Args[1] 3869 v_0 := v.Args[0] 3870 if v_0.Op != OpConst16 { 3871 break 3872 } 3873 t := v_0.Type 3874 c := v_0.AuxInt 3875 v_1 := v.Args[1] 3876 if v_1.Op != OpAnd16 { 3877 break 3878 } 3879 _ = v_1.Args[1] 3880 x := v_1.Args[0] 3881 v_1_1 := v_1.Args[1] 3882 if v_1_1.Op != OpConst16 { 3883 break 3884 } 3885 if v_1_1.Type != t { 3886 break 3887 } 3888 d := v_1_1.AuxInt 3889 v.reset(OpAnd16) 3890 v0 := b.NewValue0(v.Pos, OpConst16, t) 3891 v0.AuxInt = int64(int16(c & d)) 3892 v.AddArg(v0) 3893 v.AddArg(x) 3894 return true 3895 } 3896 // match: (And16 (And16 (Const16 <t> [d]) x) (Const16 <t> [c])) 3897 // cond: 3898 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 3899 for { 3900 _ = v.Args[1] 3901 v_0 := v.Args[0] 3902 if v_0.Op != OpAnd16 { 3903 break 3904 } 3905 _ = v_0.Args[1] 3906 v_0_0 := v_0.Args[0] 3907 if v_0_0.Op != OpConst16 { 3908 break 3909 } 3910 t := v_0_0.Type 3911 d := v_0_0.AuxInt 3912 x := v_0.Args[1] 3913 v_1 := v.Args[1] 3914 if v_1.Op != OpConst16 { 3915 break 3916 } 3917 if v_1.Type != t { 3918 break 3919 } 3920 c := v_1.AuxInt 3921 v.reset(OpAnd16) 3922 v0 := b.NewValue0(v.Pos, OpConst16, t) 3923 v0.AuxInt = int64(int16(c & d)) 3924 v.AddArg(v0) 3925 v.AddArg(x) 3926 return true 3927 } 3928 // match: (And16 (And16 x (Const16 <t> [d])) (Const16 <t> [c])) 3929 // cond: 3930 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 3931 for { 3932 _ = v.Args[1] 3933 v_0 := v.Args[0] 3934 if v_0.Op != OpAnd16 { 3935 break 3936 } 3937 _ = v_0.Args[1] 3938 x := v_0.Args[0] 3939 v_0_1 := v_0.Args[1] 3940 if v_0_1.Op != OpConst16 { 3941 break 3942 } 3943 t := v_0_1.Type 3944 d := v_0_1.AuxInt 3945 v_1 := v.Args[1] 3946 if v_1.Op != OpConst16 { 3947 break 3948 } 3949 if v_1.Type != t { 3950 break 3951 } 3952 c := v_1.AuxInt 3953 v.reset(OpAnd16) 3954 v0 := b.NewValue0(v.Pos, OpConst16, t) 3955 v0.AuxInt = int64(int16(c & d)) 3956 v.AddArg(v0) 3957 v.AddArg(x) 3958 return true 3959 } 3960 return false 3961 } 3962 func rewriteValuegeneric_OpAnd32_0(v *Value) bool { 3963 // match: (And32 (Const32 [c]) (Const32 [d])) 3964 // cond: 3965 // result: (Const32 [int64(int32(c&d))]) 3966 for { 3967 _ = v.Args[1] 3968 v_0 := v.Args[0] 3969 if v_0.Op != OpConst32 { 3970 break 3971 } 3972 c := v_0.AuxInt 3973 v_1 := v.Args[1] 3974 if v_1.Op != OpConst32 { 3975 break 3976 } 3977 d := v_1.AuxInt 3978 v.reset(OpConst32) 3979 v.AuxInt = int64(int32(c & d)) 3980 return true 3981 } 3982 // match: (And32 (Const32 [d]) (Const32 [c])) 3983 // cond: 3984 // result: (Const32 [int64(int32(c&d))]) 3985 for { 3986 _ = v.Args[1] 3987 v_0 := v.Args[0] 3988 if v_0.Op != OpConst32 { 3989 break 3990 } 3991 d := v_0.AuxInt 3992 v_1 := v.Args[1] 3993 if v_1.Op != OpConst32 { 3994 break 3995 } 3996 c := v_1.AuxInt 3997 v.reset(OpConst32) 3998 v.AuxInt = int64(int32(c & d)) 3999 return true 4000 } 4001 // match: (And32 x x) 4002 // cond: 4003 // result: x 4004 for { 4005 _ = v.Args[1] 4006 x := v.Args[0] 4007 if x != v.Args[1] { 4008 break 4009 } 4010 v.reset(OpCopy) 4011 v.Type = x.Type 4012 v.AddArg(x) 4013 return true 4014 } 4015 // match: (And32 (Const32 [-1]) x) 4016 // cond: 4017 // result: x 4018 for { 4019 _ = v.Args[1] 4020 v_0 := v.Args[0] 4021 if v_0.Op != OpConst32 { 4022 break 4023 } 4024 if v_0.AuxInt != -1 { 4025 break 4026 } 4027 x := v.Args[1] 4028 v.reset(OpCopy) 4029 v.Type = x.Type 4030 v.AddArg(x) 4031 return true 4032 } 4033 // match: (And32 x (Const32 [-1])) 4034 // cond: 4035 // result: x 4036 for { 4037 _ = v.Args[1] 4038 x := v.Args[0] 4039 v_1 := v.Args[1] 4040 if v_1.Op != OpConst32 { 4041 break 4042 } 4043 if v_1.AuxInt != -1 { 4044 break 4045 } 4046 v.reset(OpCopy) 4047 v.Type = x.Type 4048 v.AddArg(x) 4049 return true 4050 } 4051 // match: (And32 (Const32 [0]) _) 4052 // cond: 4053 // result: (Const32 [0]) 4054 for { 4055 _ = v.Args[1] 4056 v_0 := v.Args[0] 4057 if v_0.Op != OpConst32 { 4058 break 4059 } 4060 if v_0.AuxInt != 0 { 4061 break 4062 } 4063 v.reset(OpConst32) 4064 v.AuxInt = 0 4065 return true 4066 } 4067 // match: (And32 _ (Const32 [0])) 4068 // cond: 4069 // result: (Const32 [0]) 4070 for { 4071 _ = v.Args[1] 4072 v_1 := v.Args[1] 4073 if v_1.Op != OpConst32 { 4074 break 4075 } 4076 if v_1.AuxInt != 0 { 4077 break 4078 } 4079 v.reset(OpConst32) 4080 v.AuxInt = 0 4081 return true 4082 } 4083 // match: (And32 x (And32 x y)) 4084 // cond: 4085 // result: (And32 x y) 4086 for { 4087 _ = v.Args[1] 4088 x := v.Args[0] 4089 v_1 := v.Args[1] 4090 if v_1.Op != OpAnd32 { 4091 break 4092 } 4093 _ = v_1.Args[1] 4094 if x != v_1.Args[0] { 4095 break 4096 } 4097 y := v_1.Args[1] 4098 v.reset(OpAnd32) 4099 v.AddArg(x) 4100 v.AddArg(y) 4101 return true 4102 } 4103 // match: (And32 x (And32 y x)) 4104 // cond: 4105 // result: (And32 x y) 4106 for { 4107 _ = v.Args[1] 4108 x := v.Args[0] 4109 v_1 := v.Args[1] 4110 if v_1.Op != OpAnd32 { 4111 break 4112 } 4113 _ = v_1.Args[1] 4114 y := v_1.Args[0] 4115 if x != v_1.Args[1] { 4116 break 4117 } 4118 v.reset(OpAnd32) 4119 v.AddArg(x) 4120 v.AddArg(y) 4121 return true 4122 } 4123 // match: (And32 (And32 x y) x) 4124 // cond: 4125 // result: (And32 x y) 4126 for { 4127 _ = v.Args[1] 4128 v_0 := v.Args[0] 4129 if v_0.Op != OpAnd32 { 4130 break 4131 } 4132 _ = v_0.Args[1] 4133 x := v_0.Args[0] 4134 y := v_0.Args[1] 4135 if x != v.Args[1] { 4136 break 4137 } 4138 v.reset(OpAnd32) 4139 v.AddArg(x) 4140 v.AddArg(y) 4141 return true 4142 } 4143 return false 4144 } 4145 func rewriteValuegeneric_OpAnd32_10(v *Value) bool { 4146 b := v.Block 4147 _ = b 4148 // match: (And32 (And32 y x) x) 4149 // cond: 4150 // result: (And32 x y) 4151 for { 4152 _ = v.Args[1] 4153 v_0 := v.Args[0] 4154 if v_0.Op != OpAnd32 { 4155 break 4156 } 4157 _ = v_0.Args[1] 4158 y := v_0.Args[0] 4159 x := v_0.Args[1] 4160 if x != v.Args[1] { 4161 break 4162 } 4163 v.reset(OpAnd32) 4164 v.AddArg(x) 4165 v.AddArg(y) 4166 return true 4167 } 4168 // match: (And32 (And32 i:(Const32 <t>) z) x) 4169 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 4170 // result: (And32 i (And32 <t> z x)) 4171 for { 4172 _ = v.Args[1] 4173 v_0 := v.Args[0] 4174 if v_0.Op != OpAnd32 { 4175 break 4176 } 4177 _ = v_0.Args[1] 4178 i := v_0.Args[0] 4179 if i.Op != OpConst32 { 4180 break 4181 } 4182 t := i.Type 4183 z := v_0.Args[1] 4184 x := v.Args[1] 4185 if !(z.Op != OpConst32 && x.Op != OpConst32) { 4186 break 4187 } 4188 v.reset(OpAnd32) 4189 v.AddArg(i) 4190 v0 := b.NewValue0(v.Pos, OpAnd32, t) 4191 v0.AddArg(z) 4192 v0.AddArg(x) 4193 v.AddArg(v0) 4194 return true 4195 } 4196 // match: (And32 (And32 z i:(Const32 <t>)) x) 4197 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 4198 // result: (And32 i (And32 <t> z x)) 4199 for { 4200 _ = v.Args[1] 4201 v_0 := v.Args[0] 4202 if v_0.Op != OpAnd32 { 4203 break 4204 } 4205 _ = v_0.Args[1] 4206 z := v_0.Args[0] 4207 i := v_0.Args[1] 4208 if i.Op != OpConst32 { 4209 break 4210 } 4211 t := i.Type 4212 x := v.Args[1] 4213 if !(z.Op != OpConst32 && x.Op != OpConst32) { 4214 break 4215 } 4216 v.reset(OpAnd32) 4217 v.AddArg(i) 4218 v0 := b.NewValue0(v.Pos, OpAnd32, t) 4219 v0.AddArg(z) 4220 v0.AddArg(x) 4221 v.AddArg(v0) 4222 return true 4223 } 4224 // match: (And32 x (And32 i:(Const32 <t>) z)) 4225 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 4226 // result: (And32 i (And32 <t> z x)) 4227 for { 4228 _ = v.Args[1] 4229 x := v.Args[0] 4230 v_1 := v.Args[1] 4231 if v_1.Op != OpAnd32 { 4232 break 4233 } 4234 _ = v_1.Args[1] 4235 i := v_1.Args[0] 4236 if i.Op != OpConst32 { 4237 break 4238 } 4239 t := i.Type 4240 z := v_1.Args[1] 4241 if !(z.Op != OpConst32 && x.Op != OpConst32) { 4242 break 4243 } 4244 v.reset(OpAnd32) 4245 v.AddArg(i) 4246 v0 := b.NewValue0(v.Pos, OpAnd32, t) 4247 v0.AddArg(z) 4248 v0.AddArg(x) 4249 v.AddArg(v0) 4250 return true 4251 } 4252 // match: (And32 x (And32 z i:(Const32 <t>))) 4253 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 4254 // result: (And32 i (And32 <t> z x)) 4255 for { 4256 _ = v.Args[1] 4257 x := v.Args[0] 4258 v_1 := v.Args[1] 4259 if v_1.Op != OpAnd32 { 4260 break 4261 } 4262 _ = v_1.Args[1] 4263 z := v_1.Args[0] 4264 i := v_1.Args[1] 4265 if i.Op != OpConst32 { 4266 break 4267 } 4268 t := i.Type 4269 if !(z.Op != OpConst32 && x.Op != OpConst32) { 4270 break 4271 } 4272 v.reset(OpAnd32) 4273 v.AddArg(i) 4274 v0 := b.NewValue0(v.Pos, OpAnd32, t) 4275 v0.AddArg(z) 4276 v0.AddArg(x) 4277 v.AddArg(v0) 4278 return true 4279 } 4280 // match: (And32 (Const32 <t> [c]) (And32 (Const32 <t> [d]) x)) 4281 // cond: 4282 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 4283 for { 4284 _ = v.Args[1] 4285 v_0 := v.Args[0] 4286 if v_0.Op != OpConst32 { 4287 break 4288 } 4289 t := v_0.Type 4290 c := v_0.AuxInt 4291 v_1 := v.Args[1] 4292 if v_1.Op != OpAnd32 { 4293 break 4294 } 4295 _ = v_1.Args[1] 4296 v_1_0 := v_1.Args[0] 4297 if v_1_0.Op != OpConst32 { 4298 break 4299 } 4300 if v_1_0.Type != t { 4301 break 4302 } 4303 d := v_1_0.AuxInt 4304 x := v_1.Args[1] 4305 v.reset(OpAnd32) 4306 v0 := b.NewValue0(v.Pos, OpConst32, t) 4307 v0.AuxInt = int64(int32(c & d)) 4308 v.AddArg(v0) 4309 v.AddArg(x) 4310 return true 4311 } 4312 // match: (And32 (Const32 <t> [c]) (And32 x (Const32 <t> [d]))) 4313 // cond: 4314 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 4315 for { 4316 _ = v.Args[1] 4317 v_0 := v.Args[0] 4318 if v_0.Op != OpConst32 { 4319 break 4320 } 4321 t := v_0.Type 4322 c := v_0.AuxInt 4323 v_1 := v.Args[1] 4324 if v_1.Op != OpAnd32 { 4325 break 4326 } 4327 _ = v_1.Args[1] 4328 x := v_1.Args[0] 4329 v_1_1 := v_1.Args[1] 4330 if v_1_1.Op != OpConst32 { 4331 break 4332 } 4333 if v_1_1.Type != t { 4334 break 4335 } 4336 d := v_1_1.AuxInt 4337 v.reset(OpAnd32) 4338 v0 := b.NewValue0(v.Pos, OpConst32, t) 4339 v0.AuxInt = int64(int32(c & d)) 4340 v.AddArg(v0) 4341 v.AddArg(x) 4342 return true 4343 } 4344 // match: (And32 (And32 (Const32 <t> [d]) x) (Const32 <t> [c])) 4345 // cond: 4346 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 4347 for { 4348 _ = v.Args[1] 4349 v_0 := v.Args[0] 4350 if v_0.Op != OpAnd32 { 4351 break 4352 } 4353 _ = v_0.Args[1] 4354 v_0_0 := v_0.Args[0] 4355 if v_0_0.Op != OpConst32 { 4356 break 4357 } 4358 t := v_0_0.Type 4359 d := v_0_0.AuxInt 4360 x := v_0.Args[1] 4361 v_1 := v.Args[1] 4362 if v_1.Op != OpConst32 { 4363 break 4364 } 4365 if v_1.Type != t { 4366 break 4367 } 4368 c := v_1.AuxInt 4369 v.reset(OpAnd32) 4370 v0 := b.NewValue0(v.Pos, OpConst32, t) 4371 v0.AuxInt = int64(int32(c & d)) 4372 v.AddArg(v0) 4373 v.AddArg(x) 4374 return true 4375 } 4376 // match: (And32 (And32 x (Const32 <t> [d])) (Const32 <t> [c])) 4377 // cond: 4378 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 4379 for { 4380 _ = v.Args[1] 4381 v_0 := v.Args[0] 4382 if v_0.Op != OpAnd32 { 4383 break 4384 } 4385 _ = v_0.Args[1] 4386 x := v_0.Args[0] 4387 v_0_1 := v_0.Args[1] 4388 if v_0_1.Op != OpConst32 { 4389 break 4390 } 4391 t := v_0_1.Type 4392 d := v_0_1.AuxInt 4393 v_1 := v.Args[1] 4394 if v_1.Op != OpConst32 { 4395 break 4396 } 4397 if v_1.Type != t { 4398 break 4399 } 4400 c := v_1.AuxInt 4401 v.reset(OpAnd32) 4402 v0 := b.NewValue0(v.Pos, OpConst32, t) 4403 v0.AuxInt = int64(int32(c & d)) 4404 v.AddArg(v0) 4405 v.AddArg(x) 4406 return true 4407 } 4408 return false 4409 } 4410 func rewriteValuegeneric_OpAnd64_0(v *Value) bool { 4411 // match: (And64 (Const64 [c]) (Const64 [d])) 4412 // cond: 4413 // result: (Const64 [c&d]) 4414 for { 4415 _ = v.Args[1] 4416 v_0 := v.Args[0] 4417 if v_0.Op != OpConst64 { 4418 break 4419 } 4420 c := v_0.AuxInt 4421 v_1 := v.Args[1] 4422 if v_1.Op != OpConst64 { 4423 break 4424 } 4425 d := v_1.AuxInt 4426 v.reset(OpConst64) 4427 v.AuxInt = c & d 4428 return true 4429 } 4430 // match: (And64 (Const64 [d]) (Const64 [c])) 4431 // cond: 4432 // result: (Const64 [c&d]) 4433 for { 4434 _ = v.Args[1] 4435 v_0 := v.Args[0] 4436 if v_0.Op != OpConst64 { 4437 break 4438 } 4439 d := v_0.AuxInt 4440 v_1 := v.Args[1] 4441 if v_1.Op != OpConst64 { 4442 break 4443 } 4444 c := v_1.AuxInt 4445 v.reset(OpConst64) 4446 v.AuxInt = c & d 4447 return true 4448 } 4449 // match: (And64 x x) 4450 // cond: 4451 // result: x 4452 for { 4453 _ = v.Args[1] 4454 x := v.Args[0] 4455 if x != v.Args[1] { 4456 break 4457 } 4458 v.reset(OpCopy) 4459 v.Type = x.Type 4460 v.AddArg(x) 4461 return true 4462 } 4463 // match: (And64 (Const64 [-1]) x) 4464 // cond: 4465 // result: x 4466 for { 4467 _ = v.Args[1] 4468 v_0 := v.Args[0] 4469 if v_0.Op != OpConst64 { 4470 break 4471 } 4472 if v_0.AuxInt != -1 { 4473 break 4474 } 4475 x := v.Args[1] 4476 v.reset(OpCopy) 4477 v.Type = x.Type 4478 v.AddArg(x) 4479 return true 4480 } 4481 // match: (And64 x (Const64 [-1])) 4482 // cond: 4483 // result: x 4484 for { 4485 _ = v.Args[1] 4486 x := v.Args[0] 4487 v_1 := v.Args[1] 4488 if v_1.Op != OpConst64 { 4489 break 4490 } 4491 if v_1.AuxInt != -1 { 4492 break 4493 } 4494 v.reset(OpCopy) 4495 v.Type = x.Type 4496 v.AddArg(x) 4497 return true 4498 } 4499 // match: (And64 (Const64 [0]) _) 4500 // cond: 4501 // result: (Const64 [0]) 4502 for { 4503 _ = v.Args[1] 4504 v_0 := v.Args[0] 4505 if v_0.Op != OpConst64 { 4506 break 4507 } 4508 if v_0.AuxInt != 0 { 4509 break 4510 } 4511 v.reset(OpConst64) 4512 v.AuxInt = 0 4513 return true 4514 } 4515 // match: (And64 _ (Const64 [0])) 4516 // cond: 4517 // result: (Const64 [0]) 4518 for { 4519 _ = v.Args[1] 4520 v_1 := v.Args[1] 4521 if v_1.Op != OpConst64 { 4522 break 4523 } 4524 if v_1.AuxInt != 0 { 4525 break 4526 } 4527 v.reset(OpConst64) 4528 v.AuxInt = 0 4529 return true 4530 } 4531 // match: (And64 x (And64 x y)) 4532 // cond: 4533 // result: (And64 x y) 4534 for { 4535 _ = v.Args[1] 4536 x := v.Args[0] 4537 v_1 := v.Args[1] 4538 if v_1.Op != OpAnd64 { 4539 break 4540 } 4541 _ = v_1.Args[1] 4542 if x != v_1.Args[0] { 4543 break 4544 } 4545 y := v_1.Args[1] 4546 v.reset(OpAnd64) 4547 v.AddArg(x) 4548 v.AddArg(y) 4549 return true 4550 } 4551 // match: (And64 x (And64 y x)) 4552 // cond: 4553 // result: (And64 x y) 4554 for { 4555 _ = v.Args[1] 4556 x := v.Args[0] 4557 v_1 := v.Args[1] 4558 if v_1.Op != OpAnd64 { 4559 break 4560 } 4561 _ = v_1.Args[1] 4562 y := v_1.Args[0] 4563 if x != v_1.Args[1] { 4564 break 4565 } 4566 v.reset(OpAnd64) 4567 v.AddArg(x) 4568 v.AddArg(y) 4569 return true 4570 } 4571 // match: (And64 (And64 x y) x) 4572 // cond: 4573 // result: (And64 x y) 4574 for { 4575 _ = v.Args[1] 4576 v_0 := v.Args[0] 4577 if v_0.Op != OpAnd64 { 4578 break 4579 } 4580 _ = v_0.Args[1] 4581 x := v_0.Args[0] 4582 y := v_0.Args[1] 4583 if x != v.Args[1] { 4584 break 4585 } 4586 v.reset(OpAnd64) 4587 v.AddArg(x) 4588 v.AddArg(y) 4589 return true 4590 } 4591 return false 4592 } 4593 func rewriteValuegeneric_OpAnd64_10(v *Value) bool { 4594 b := v.Block 4595 _ = b 4596 // match: (And64 (And64 y x) x) 4597 // cond: 4598 // result: (And64 x y) 4599 for { 4600 _ = v.Args[1] 4601 v_0 := v.Args[0] 4602 if v_0.Op != OpAnd64 { 4603 break 4604 } 4605 _ = v_0.Args[1] 4606 y := v_0.Args[0] 4607 x := v_0.Args[1] 4608 if x != v.Args[1] { 4609 break 4610 } 4611 v.reset(OpAnd64) 4612 v.AddArg(x) 4613 v.AddArg(y) 4614 return true 4615 } 4616 // match: (And64 <t> (Const64 [y]) x) 4617 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 4618 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 4619 for { 4620 t := v.Type 4621 _ = v.Args[1] 4622 v_0 := v.Args[0] 4623 if v_0.Op != OpConst64 { 4624 break 4625 } 4626 y := v_0.AuxInt 4627 x := v.Args[1] 4628 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 4629 break 4630 } 4631 v.reset(OpRsh64Ux64) 4632 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 4633 v0.AddArg(x) 4634 v1 := b.NewValue0(v.Pos, OpConst64, t) 4635 v1.AuxInt = nlz(y) 4636 v0.AddArg(v1) 4637 v.AddArg(v0) 4638 v2 := b.NewValue0(v.Pos, OpConst64, t) 4639 v2.AuxInt = nlz(y) 4640 v.AddArg(v2) 4641 return true 4642 } 4643 // match: (And64 <t> x (Const64 [y])) 4644 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 4645 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 4646 for { 4647 t := v.Type 4648 _ = v.Args[1] 4649 x := v.Args[0] 4650 v_1 := v.Args[1] 4651 if v_1.Op != OpConst64 { 4652 break 4653 } 4654 y := v_1.AuxInt 4655 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 4656 break 4657 } 4658 v.reset(OpRsh64Ux64) 4659 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 4660 v0.AddArg(x) 4661 v1 := b.NewValue0(v.Pos, OpConst64, t) 4662 v1.AuxInt = nlz(y) 4663 v0.AddArg(v1) 4664 v.AddArg(v0) 4665 v2 := b.NewValue0(v.Pos, OpConst64, t) 4666 v2.AuxInt = nlz(y) 4667 v.AddArg(v2) 4668 return true 4669 } 4670 // match: (And64 <t> (Const64 [y]) x) 4671 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 4672 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 4673 for { 4674 t := v.Type 4675 _ = v.Args[1] 4676 v_0 := v.Args[0] 4677 if v_0.Op != OpConst64 { 4678 break 4679 } 4680 y := v_0.AuxInt 4681 x := v.Args[1] 4682 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 4683 break 4684 } 4685 v.reset(OpLsh64x64) 4686 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 4687 v0.AddArg(x) 4688 v1 := b.NewValue0(v.Pos, OpConst64, t) 4689 v1.AuxInt = ntz(y) 4690 v0.AddArg(v1) 4691 v.AddArg(v0) 4692 v2 := b.NewValue0(v.Pos, OpConst64, t) 4693 v2.AuxInt = ntz(y) 4694 v.AddArg(v2) 4695 return true 4696 } 4697 // match: (And64 <t> x (Const64 [y])) 4698 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 4699 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 4700 for { 4701 t := v.Type 4702 _ = v.Args[1] 4703 x := v.Args[0] 4704 v_1 := v.Args[1] 4705 if v_1.Op != OpConst64 { 4706 break 4707 } 4708 y := v_1.AuxInt 4709 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 4710 break 4711 } 4712 v.reset(OpLsh64x64) 4713 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 4714 v0.AddArg(x) 4715 v1 := b.NewValue0(v.Pos, OpConst64, t) 4716 v1.AuxInt = ntz(y) 4717 v0.AddArg(v1) 4718 v.AddArg(v0) 4719 v2 := b.NewValue0(v.Pos, OpConst64, t) 4720 v2.AuxInt = ntz(y) 4721 v.AddArg(v2) 4722 return true 4723 } 4724 // match: (And64 (And64 i:(Const64 <t>) z) x) 4725 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 4726 // result: (And64 i (And64 <t> z x)) 4727 for { 4728 _ = v.Args[1] 4729 v_0 := v.Args[0] 4730 if v_0.Op != OpAnd64 { 4731 break 4732 } 4733 _ = v_0.Args[1] 4734 i := v_0.Args[0] 4735 if i.Op != OpConst64 { 4736 break 4737 } 4738 t := i.Type 4739 z := v_0.Args[1] 4740 x := v.Args[1] 4741 if !(z.Op != OpConst64 && x.Op != OpConst64) { 4742 break 4743 } 4744 v.reset(OpAnd64) 4745 v.AddArg(i) 4746 v0 := b.NewValue0(v.Pos, OpAnd64, t) 4747 v0.AddArg(z) 4748 v0.AddArg(x) 4749 v.AddArg(v0) 4750 return true 4751 } 4752 // match: (And64 (And64 z i:(Const64 <t>)) x) 4753 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 4754 // result: (And64 i (And64 <t> z x)) 4755 for { 4756 _ = v.Args[1] 4757 v_0 := v.Args[0] 4758 if v_0.Op != OpAnd64 { 4759 break 4760 } 4761 _ = v_0.Args[1] 4762 z := v_0.Args[0] 4763 i := v_0.Args[1] 4764 if i.Op != OpConst64 { 4765 break 4766 } 4767 t := i.Type 4768 x := v.Args[1] 4769 if !(z.Op != OpConst64 && x.Op != OpConst64) { 4770 break 4771 } 4772 v.reset(OpAnd64) 4773 v.AddArg(i) 4774 v0 := b.NewValue0(v.Pos, OpAnd64, t) 4775 v0.AddArg(z) 4776 v0.AddArg(x) 4777 v.AddArg(v0) 4778 return true 4779 } 4780 // match: (And64 x (And64 i:(Const64 <t>) z)) 4781 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 4782 // result: (And64 i (And64 <t> z x)) 4783 for { 4784 _ = v.Args[1] 4785 x := v.Args[0] 4786 v_1 := v.Args[1] 4787 if v_1.Op != OpAnd64 { 4788 break 4789 } 4790 _ = v_1.Args[1] 4791 i := v_1.Args[0] 4792 if i.Op != OpConst64 { 4793 break 4794 } 4795 t := i.Type 4796 z := v_1.Args[1] 4797 if !(z.Op != OpConst64 && x.Op != OpConst64) { 4798 break 4799 } 4800 v.reset(OpAnd64) 4801 v.AddArg(i) 4802 v0 := b.NewValue0(v.Pos, OpAnd64, t) 4803 v0.AddArg(z) 4804 v0.AddArg(x) 4805 v.AddArg(v0) 4806 return true 4807 } 4808 // match: (And64 x (And64 z i:(Const64 <t>))) 4809 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 4810 // result: (And64 i (And64 <t> z x)) 4811 for { 4812 _ = v.Args[1] 4813 x := v.Args[0] 4814 v_1 := v.Args[1] 4815 if v_1.Op != OpAnd64 { 4816 break 4817 } 4818 _ = v_1.Args[1] 4819 z := v_1.Args[0] 4820 i := v_1.Args[1] 4821 if i.Op != OpConst64 { 4822 break 4823 } 4824 t := i.Type 4825 if !(z.Op != OpConst64 && x.Op != OpConst64) { 4826 break 4827 } 4828 v.reset(OpAnd64) 4829 v.AddArg(i) 4830 v0 := b.NewValue0(v.Pos, OpAnd64, t) 4831 v0.AddArg(z) 4832 v0.AddArg(x) 4833 v.AddArg(v0) 4834 return true 4835 } 4836 // match: (And64 (Const64 <t> [c]) (And64 (Const64 <t> [d]) x)) 4837 // cond: 4838 // result: (And64 (Const64 <t> [c&d]) x) 4839 for { 4840 _ = v.Args[1] 4841 v_0 := v.Args[0] 4842 if v_0.Op != OpConst64 { 4843 break 4844 } 4845 t := v_0.Type 4846 c := v_0.AuxInt 4847 v_1 := v.Args[1] 4848 if v_1.Op != OpAnd64 { 4849 break 4850 } 4851 _ = v_1.Args[1] 4852 v_1_0 := v_1.Args[0] 4853 if v_1_0.Op != OpConst64 { 4854 break 4855 } 4856 if v_1_0.Type != t { 4857 break 4858 } 4859 d := v_1_0.AuxInt 4860 x := v_1.Args[1] 4861 v.reset(OpAnd64) 4862 v0 := b.NewValue0(v.Pos, OpConst64, t) 4863 v0.AuxInt = c & d 4864 v.AddArg(v0) 4865 v.AddArg(x) 4866 return true 4867 } 4868 return false 4869 } 4870 func rewriteValuegeneric_OpAnd64_20(v *Value) bool { 4871 b := v.Block 4872 _ = b 4873 // match: (And64 (Const64 <t> [c]) (And64 x (Const64 <t> [d]))) 4874 // cond: 4875 // result: (And64 (Const64 <t> [c&d]) x) 4876 for { 4877 _ = v.Args[1] 4878 v_0 := v.Args[0] 4879 if v_0.Op != OpConst64 { 4880 break 4881 } 4882 t := v_0.Type 4883 c := v_0.AuxInt 4884 v_1 := v.Args[1] 4885 if v_1.Op != OpAnd64 { 4886 break 4887 } 4888 _ = v_1.Args[1] 4889 x := v_1.Args[0] 4890 v_1_1 := v_1.Args[1] 4891 if v_1_1.Op != OpConst64 { 4892 break 4893 } 4894 if v_1_1.Type != t { 4895 break 4896 } 4897 d := v_1_1.AuxInt 4898 v.reset(OpAnd64) 4899 v0 := b.NewValue0(v.Pos, OpConst64, t) 4900 v0.AuxInt = c & d 4901 v.AddArg(v0) 4902 v.AddArg(x) 4903 return true 4904 } 4905 // match: (And64 (And64 (Const64 <t> [d]) x) (Const64 <t> [c])) 4906 // cond: 4907 // result: (And64 (Const64 <t> [c&d]) x) 4908 for { 4909 _ = v.Args[1] 4910 v_0 := v.Args[0] 4911 if v_0.Op != OpAnd64 { 4912 break 4913 } 4914 _ = v_0.Args[1] 4915 v_0_0 := v_0.Args[0] 4916 if v_0_0.Op != OpConst64 { 4917 break 4918 } 4919 t := v_0_0.Type 4920 d := v_0_0.AuxInt 4921 x := v_0.Args[1] 4922 v_1 := v.Args[1] 4923 if v_1.Op != OpConst64 { 4924 break 4925 } 4926 if v_1.Type != t { 4927 break 4928 } 4929 c := v_1.AuxInt 4930 v.reset(OpAnd64) 4931 v0 := b.NewValue0(v.Pos, OpConst64, t) 4932 v0.AuxInt = c & d 4933 v.AddArg(v0) 4934 v.AddArg(x) 4935 return true 4936 } 4937 // match: (And64 (And64 x (Const64 <t> [d])) (Const64 <t> [c])) 4938 // cond: 4939 // result: (And64 (Const64 <t> [c&d]) x) 4940 for { 4941 _ = v.Args[1] 4942 v_0 := v.Args[0] 4943 if v_0.Op != OpAnd64 { 4944 break 4945 } 4946 _ = v_0.Args[1] 4947 x := v_0.Args[0] 4948 v_0_1 := v_0.Args[1] 4949 if v_0_1.Op != OpConst64 { 4950 break 4951 } 4952 t := v_0_1.Type 4953 d := v_0_1.AuxInt 4954 v_1 := v.Args[1] 4955 if v_1.Op != OpConst64 { 4956 break 4957 } 4958 if v_1.Type != t { 4959 break 4960 } 4961 c := v_1.AuxInt 4962 v.reset(OpAnd64) 4963 v0 := b.NewValue0(v.Pos, OpConst64, t) 4964 v0.AuxInt = c & d 4965 v.AddArg(v0) 4966 v.AddArg(x) 4967 return true 4968 } 4969 return false 4970 } 4971 func rewriteValuegeneric_OpAnd8_0(v *Value) bool { 4972 // match: (And8 (Const8 [c]) (Const8 [d])) 4973 // cond: 4974 // result: (Const8 [int64(int8(c&d))]) 4975 for { 4976 _ = v.Args[1] 4977 v_0 := v.Args[0] 4978 if v_0.Op != OpConst8 { 4979 break 4980 } 4981 c := v_0.AuxInt 4982 v_1 := v.Args[1] 4983 if v_1.Op != OpConst8 { 4984 break 4985 } 4986 d := v_1.AuxInt 4987 v.reset(OpConst8) 4988 v.AuxInt = int64(int8(c & d)) 4989 return true 4990 } 4991 // match: (And8 (Const8 [d]) (Const8 [c])) 4992 // cond: 4993 // result: (Const8 [int64(int8(c&d))]) 4994 for { 4995 _ = v.Args[1] 4996 v_0 := v.Args[0] 4997 if v_0.Op != OpConst8 { 4998 break 4999 } 5000 d := v_0.AuxInt 5001 v_1 := v.Args[1] 5002 if v_1.Op != OpConst8 { 5003 break 5004 } 5005 c := v_1.AuxInt 5006 v.reset(OpConst8) 5007 v.AuxInt = int64(int8(c & d)) 5008 return true 5009 } 5010 // match: (And8 x x) 5011 // cond: 5012 // result: x 5013 for { 5014 _ = v.Args[1] 5015 x := v.Args[0] 5016 if x != v.Args[1] { 5017 break 5018 } 5019 v.reset(OpCopy) 5020 v.Type = x.Type 5021 v.AddArg(x) 5022 return true 5023 } 5024 // match: (And8 (Const8 [-1]) x) 5025 // cond: 5026 // result: x 5027 for { 5028 _ = v.Args[1] 5029 v_0 := v.Args[0] 5030 if v_0.Op != OpConst8 { 5031 break 5032 } 5033 if v_0.AuxInt != -1 { 5034 break 5035 } 5036 x := v.Args[1] 5037 v.reset(OpCopy) 5038 v.Type = x.Type 5039 v.AddArg(x) 5040 return true 5041 } 5042 // match: (And8 x (Const8 [-1])) 5043 // cond: 5044 // result: x 5045 for { 5046 _ = v.Args[1] 5047 x := v.Args[0] 5048 v_1 := v.Args[1] 5049 if v_1.Op != OpConst8 { 5050 break 5051 } 5052 if v_1.AuxInt != -1 { 5053 break 5054 } 5055 v.reset(OpCopy) 5056 v.Type = x.Type 5057 v.AddArg(x) 5058 return true 5059 } 5060 // match: (And8 (Const8 [0]) _) 5061 // cond: 5062 // result: (Const8 [0]) 5063 for { 5064 _ = v.Args[1] 5065 v_0 := v.Args[0] 5066 if v_0.Op != OpConst8 { 5067 break 5068 } 5069 if v_0.AuxInt != 0 { 5070 break 5071 } 5072 v.reset(OpConst8) 5073 v.AuxInt = 0 5074 return true 5075 } 5076 // match: (And8 _ (Const8 [0])) 5077 // cond: 5078 // result: (Const8 [0]) 5079 for { 5080 _ = v.Args[1] 5081 v_1 := v.Args[1] 5082 if v_1.Op != OpConst8 { 5083 break 5084 } 5085 if v_1.AuxInt != 0 { 5086 break 5087 } 5088 v.reset(OpConst8) 5089 v.AuxInt = 0 5090 return true 5091 } 5092 // match: (And8 x (And8 x y)) 5093 // cond: 5094 // result: (And8 x y) 5095 for { 5096 _ = v.Args[1] 5097 x := v.Args[0] 5098 v_1 := v.Args[1] 5099 if v_1.Op != OpAnd8 { 5100 break 5101 } 5102 _ = v_1.Args[1] 5103 if x != v_1.Args[0] { 5104 break 5105 } 5106 y := v_1.Args[1] 5107 v.reset(OpAnd8) 5108 v.AddArg(x) 5109 v.AddArg(y) 5110 return true 5111 } 5112 // match: (And8 x (And8 y x)) 5113 // cond: 5114 // result: (And8 x y) 5115 for { 5116 _ = v.Args[1] 5117 x := v.Args[0] 5118 v_1 := v.Args[1] 5119 if v_1.Op != OpAnd8 { 5120 break 5121 } 5122 _ = v_1.Args[1] 5123 y := v_1.Args[0] 5124 if x != v_1.Args[1] { 5125 break 5126 } 5127 v.reset(OpAnd8) 5128 v.AddArg(x) 5129 v.AddArg(y) 5130 return true 5131 } 5132 // match: (And8 (And8 x y) x) 5133 // cond: 5134 // result: (And8 x y) 5135 for { 5136 _ = v.Args[1] 5137 v_0 := v.Args[0] 5138 if v_0.Op != OpAnd8 { 5139 break 5140 } 5141 _ = v_0.Args[1] 5142 x := v_0.Args[0] 5143 y := v_0.Args[1] 5144 if x != v.Args[1] { 5145 break 5146 } 5147 v.reset(OpAnd8) 5148 v.AddArg(x) 5149 v.AddArg(y) 5150 return true 5151 } 5152 return false 5153 } 5154 func rewriteValuegeneric_OpAnd8_10(v *Value) bool { 5155 b := v.Block 5156 _ = b 5157 // match: (And8 (And8 y x) x) 5158 // cond: 5159 // result: (And8 x y) 5160 for { 5161 _ = v.Args[1] 5162 v_0 := v.Args[0] 5163 if v_0.Op != OpAnd8 { 5164 break 5165 } 5166 _ = v_0.Args[1] 5167 y := v_0.Args[0] 5168 x := v_0.Args[1] 5169 if x != v.Args[1] { 5170 break 5171 } 5172 v.reset(OpAnd8) 5173 v.AddArg(x) 5174 v.AddArg(y) 5175 return true 5176 } 5177 // match: (And8 (And8 i:(Const8 <t>) z) x) 5178 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 5179 // result: (And8 i (And8 <t> z x)) 5180 for { 5181 _ = v.Args[1] 5182 v_0 := v.Args[0] 5183 if v_0.Op != OpAnd8 { 5184 break 5185 } 5186 _ = v_0.Args[1] 5187 i := v_0.Args[0] 5188 if i.Op != OpConst8 { 5189 break 5190 } 5191 t := i.Type 5192 z := v_0.Args[1] 5193 x := v.Args[1] 5194 if !(z.Op != OpConst8 && x.Op != OpConst8) { 5195 break 5196 } 5197 v.reset(OpAnd8) 5198 v.AddArg(i) 5199 v0 := b.NewValue0(v.Pos, OpAnd8, t) 5200 v0.AddArg(z) 5201 v0.AddArg(x) 5202 v.AddArg(v0) 5203 return true 5204 } 5205 // match: (And8 (And8 z i:(Const8 <t>)) x) 5206 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 5207 // result: (And8 i (And8 <t> z x)) 5208 for { 5209 _ = v.Args[1] 5210 v_0 := v.Args[0] 5211 if v_0.Op != OpAnd8 { 5212 break 5213 } 5214 _ = v_0.Args[1] 5215 z := v_0.Args[0] 5216 i := v_0.Args[1] 5217 if i.Op != OpConst8 { 5218 break 5219 } 5220 t := i.Type 5221 x := v.Args[1] 5222 if !(z.Op != OpConst8 && x.Op != OpConst8) { 5223 break 5224 } 5225 v.reset(OpAnd8) 5226 v.AddArg(i) 5227 v0 := b.NewValue0(v.Pos, OpAnd8, t) 5228 v0.AddArg(z) 5229 v0.AddArg(x) 5230 v.AddArg(v0) 5231 return true 5232 } 5233 // match: (And8 x (And8 i:(Const8 <t>) z)) 5234 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 5235 // result: (And8 i (And8 <t> z x)) 5236 for { 5237 _ = v.Args[1] 5238 x := v.Args[0] 5239 v_1 := v.Args[1] 5240 if v_1.Op != OpAnd8 { 5241 break 5242 } 5243 _ = v_1.Args[1] 5244 i := v_1.Args[0] 5245 if i.Op != OpConst8 { 5246 break 5247 } 5248 t := i.Type 5249 z := v_1.Args[1] 5250 if !(z.Op != OpConst8 && x.Op != OpConst8) { 5251 break 5252 } 5253 v.reset(OpAnd8) 5254 v.AddArg(i) 5255 v0 := b.NewValue0(v.Pos, OpAnd8, t) 5256 v0.AddArg(z) 5257 v0.AddArg(x) 5258 v.AddArg(v0) 5259 return true 5260 } 5261 // match: (And8 x (And8 z i:(Const8 <t>))) 5262 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 5263 // result: (And8 i (And8 <t> z x)) 5264 for { 5265 _ = v.Args[1] 5266 x := v.Args[0] 5267 v_1 := v.Args[1] 5268 if v_1.Op != OpAnd8 { 5269 break 5270 } 5271 _ = v_1.Args[1] 5272 z := v_1.Args[0] 5273 i := v_1.Args[1] 5274 if i.Op != OpConst8 { 5275 break 5276 } 5277 t := i.Type 5278 if !(z.Op != OpConst8 && x.Op != OpConst8) { 5279 break 5280 } 5281 v.reset(OpAnd8) 5282 v.AddArg(i) 5283 v0 := b.NewValue0(v.Pos, OpAnd8, t) 5284 v0.AddArg(z) 5285 v0.AddArg(x) 5286 v.AddArg(v0) 5287 return true 5288 } 5289 // match: (And8 (Const8 <t> [c]) (And8 (Const8 <t> [d]) x)) 5290 // cond: 5291 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 5292 for { 5293 _ = v.Args[1] 5294 v_0 := v.Args[0] 5295 if v_0.Op != OpConst8 { 5296 break 5297 } 5298 t := v_0.Type 5299 c := v_0.AuxInt 5300 v_1 := v.Args[1] 5301 if v_1.Op != OpAnd8 { 5302 break 5303 } 5304 _ = v_1.Args[1] 5305 v_1_0 := v_1.Args[0] 5306 if v_1_0.Op != OpConst8 { 5307 break 5308 } 5309 if v_1_0.Type != t { 5310 break 5311 } 5312 d := v_1_0.AuxInt 5313 x := v_1.Args[1] 5314 v.reset(OpAnd8) 5315 v0 := b.NewValue0(v.Pos, OpConst8, t) 5316 v0.AuxInt = int64(int8(c & d)) 5317 v.AddArg(v0) 5318 v.AddArg(x) 5319 return true 5320 } 5321 // match: (And8 (Const8 <t> [c]) (And8 x (Const8 <t> [d]))) 5322 // cond: 5323 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 5324 for { 5325 _ = v.Args[1] 5326 v_0 := v.Args[0] 5327 if v_0.Op != OpConst8 { 5328 break 5329 } 5330 t := v_0.Type 5331 c := v_0.AuxInt 5332 v_1 := v.Args[1] 5333 if v_1.Op != OpAnd8 { 5334 break 5335 } 5336 _ = v_1.Args[1] 5337 x := v_1.Args[0] 5338 v_1_1 := v_1.Args[1] 5339 if v_1_1.Op != OpConst8 { 5340 break 5341 } 5342 if v_1_1.Type != t { 5343 break 5344 } 5345 d := v_1_1.AuxInt 5346 v.reset(OpAnd8) 5347 v0 := b.NewValue0(v.Pos, OpConst8, t) 5348 v0.AuxInt = int64(int8(c & d)) 5349 v.AddArg(v0) 5350 v.AddArg(x) 5351 return true 5352 } 5353 // match: (And8 (And8 (Const8 <t> [d]) x) (Const8 <t> [c])) 5354 // cond: 5355 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 5356 for { 5357 _ = v.Args[1] 5358 v_0 := v.Args[0] 5359 if v_0.Op != OpAnd8 { 5360 break 5361 } 5362 _ = v_0.Args[1] 5363 v_0_0 := v_0.Args[0] 5364 if v_0_0.Op != OpConst8 { 5365 break 5366 } 5367 t := v_0_0.Type 5368 d := v_0_0.AuxInt 5369 x := v_0.Args[1] 5370 v_1 := v.Args[1] 5371 if v_1.Op != OpConst8 { 5372 break 5373 } 5374 if v_1.Type != t { 5375 break 5376 } 5377 c := v_1.AuxInt 5378 v.reset(OpAnd8) 5379 v0 := b.NewValue0(v.Pos, OpConst8, t) 5380 v0.AuxInt = int64(int8(c & d)) 5381 v.AddArg(v0) 5382 v.AddArg(x) 5383 return true 5384 } 5385 // match: (And8 (And8 x (Const8 <t> [d])) (Const8 <t> [c])) 5386 // cond: 5387 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 5388 for { 5389 _ = v.Args[1] 5390 v_0 := v.Args[0] 5391 if v_0.Op != OpAnd8 { 5392 break 5393 } 5394 _ = v_0.Args[1] 5395 x := v_0.Args[0] 5396 v_0_1 := v_0.Args[1] 5397 if v_0_1.Op != OpConst8 { 5398 break 5399 } 5400 t := v_0_1.Type 5401 d := v_0_1.AuxInt 5402 v_1 := v.Args[1] 5403 if v_1.Op != OpConst8 { 5404 break 5405 } 5406 if v_1.Type != t { 5407 break 5408 } 5409 c := v_1.AuxInt 5410 v.reset(OpAnd8) 5411 v0 := b.NewValue0(v.Pos, OpConst8, t) 5412 v0.AuxInt = int64(int8(c & d)) 5413 v.AddArg(v0) 5414 v.AddArg(x) 5415 return true 5416 } 5417 return false 5418 } 5419 func rewriteValuegeneric_OpArg_0(v *Value) bool { 5420 b := v.Block 5421 _ = b 5422 config := b.Func.Config 5423 _ = config 5424 fe := b.Func.fe 5425 _ = fe 5426 typ := &b.Func.Config.Types 5427 _ = typ 5428 // match: (Arg {n} [off]) 5429 // cond: v.Type.IsString() 5430 // result: (StringMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize])) 5431 for { 5432 off := v.AuxInt 5433 n := v.Aux 5434 if !(v.Type.IsString()) { 5435 break 5436 } 5437 v.reset(OpStringMake) 5438 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 5439 v0.AuxInt = off 5440 v0.Aux = n 5441 v.AddArg(v0) 5442 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 5443 v1.AuxInt = off + config.PtrSize 5444 v1.Aux = n 5445 v.AddArg(v1) 5446 return true 5447 } 5448 // match: (Arg {n} [off]) 5449 // cond: v.Type.IsSlice() 5450 // result: (SliceMake (Arg <v.Type.ElemType().PtrTo()> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize]) (Arg <typ.Int> {n} [off+2*config.PtrSize])) 5451 for { 5452 off := v.AuxInt 5453 n := v.Aux 5454 if !(v.Type.IsSlice()) { 5455 break 5456 } 5457 v.reset(OpSliceMake) 5458 v0 := b.NewValue0(v.Pos, OpArg, v.Type.ElemType().PtrTo()) 5459 v0.AuxInt = off 5460 v0.Aux = n 5461 v.AddArg(v0) 5462 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 5463 v1.AuxInt = off + config.PtrSize 5464 v1.Aux = n 5465 v.AddArg(v1) 5466 v2 := b.NewValue0(v.Pos, OpArg, typ.Int) 5467 v2.AuxInt = off + 2*config.PtrSize 5468 v2.Aux = n 5469 v.AddArg(v2) 5470 return true 5471 } 5472 // match: (Arg {n} [off]) 5473 // cond: v.Type.IsInterface() 5474 // result: (IMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.BytePtr> {n} [off+config.PtrSize])) 5475 for { 5476 off := v.AuxInt 5477 n := v.Aux 5478 if !(v.Type.IsInterface()) { 5479 break 5480 } 5481 v.reset(OpIMake) 5482 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 5483 v0.AuxInt = off 5484 v0.Aux = n 5485 v.AddArg(v0) 5486 v1 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 5487 v1.AuxInt = off + config.PtrSize 5488 v1.Aux = n 5489 v.AddArg(v1) 5490 return true 5491 } 5492 // match: (Arg {n} [off]) 5493 // cond: v.Type.IsComplex() && v.Type.Size() == 16 5494 // result: (ComplexMake (Arg <typ.Float64> {n} [off]) (Arg <typ.Float64> {n} [off+8])) 5495 for { 5496 off := v.AuxInt 5497 n := v.Aux 5498 if !(v.Type.IsComplex() && v.Type.Size() == 16) { 5499 break 5500 } 5501 v.reset(OpComplexMake) 5502 v0 := b.NewValue0(v.Pos, OpArg, typ.Float64) 5503 v0.AuxInt = off 5504 v0.Aux = n 5505 v.AddArg(v0) 5506 v1 := b.NewValue0(v.Pos, OpArg, typ.Float64) 5507 v1.AuxInt = off + 8 5508 v1.Aux = n 5509 v.AddArg(v1) 5510 return true 5511 } 5512 // match: (Arg {n} [off]) 5513 // cond: v.Type.IsComplex() && v.Type.Size() == 8 5514 // result: (ComplexMake (Arg <typ.Float32> {n} [off]) (Arg <typ.Float32> {n} [off+4])) 5515 for { 5516 off := v.AuxInt 5517 n := v.Aux 5518 if !(v.Type.IsComplex() && v.Type.Size() == 8) { 5519 break 5520 } 5521 v.reset(OpComplexMake) 5522 v0 := b.NewValue0(v.Pos, OpArg, typ.Float32) 5523 v0.AuxInt = off 5524 v0.Aux = n 5525 v.AddArg(v0) 5526 v1 := b.NewValue0(v.Pos, OpArg, typ.Float32) 5527 v1.AuxInt = off + 4 5528 v1.Aux = n 5529 v.AddArg(v1) 5530 return true 5531 } 5532 // match: (Arg <t>) 5533 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 5534 // result: (StructMake0) 5535 for { 5536 t := v.Type 5537 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 5538 break 5539 } 5540 v.reset(OpStructMake0) 5541 return true 5542 } 5543 // match: (Arg <t> {n} [off]) 5544 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 5545 // result: (StructMake1 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])) 5546 for { 5547 t := v.Type 5548 off := v.AuxInt 5549 n := v.Aux 5550 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 5551 break 5552 } 5553 v.reset(OpStructMake1) 5554 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 5555 v0.AuxInt = off + t.FieldOff(0) 5556 v0.Aux = n 5557 v.AddArg(v0) 5558 return true 5559 } 5560 // match: (Arg <t> {n} [off]) 5561 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 5562 // result: (StructMake2 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])) 5563 for { 5564 t := v.Type 5565 off := v.AuxInt 5566 n := v.Aux 5567 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 5568 break 5569 } 5570 v.reset(OpStructMake2) 5571 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 5572 v0.AuxInt = off + t.FieldOff(0) 5573 v0.Aux = n 5574 v.AddArg(v0) 5575 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 5576 v1.AuxInt = off + t.FieldOff(1) 5577 v1.Aux = n 5578 v.AddArg(v1) 5579 return true 5580 } 5581 // match: (Arg <t> {n} [off]) 5582 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 5583 // 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)])) 5584 for { 5585 t := v.Type 5586 off := v.AuxInt 5587 n := v.Aux 5588 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 5589 break 5590 } 5591 v.reset(OpStructMake3) 5592 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 5593 v0.AuxInt = off + t.FieldOff(0) 5594 v0.Aux = n 5595 v.AddArg(v0) 5596 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 5597 v1.AuxInt = off + t.FieldOff(1) 5598 v1.Aux = n 5599 v.AddArg(v1) 5600 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 5601 v2.AuxInt = off + t.FieldOff(2) 5602 v2.Aux = n 5603 v.AddArg(v2) 5604 return true 5605 } 5606 // match: (Arg <t> {n} [off]) 5607 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 5608 // 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)])) 5609 for { 5610 t := v.Type 5611 off := v.AuxInt 5612 n := v.Aux 5613 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 5614 break 5615 } 5616 v.reset(OpStructMake4) 5617 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 5618 v0.AuxInt = off + t.FieldOff(0) 5619 v0.Aux = n 5620 v.AddArg(v0) 5621 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 5622 v1.AuxInt = off + t.FieldOff(1) 5623 v1.Aux = n 5624 v.AddArg(v1) 5625 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 5626 v2.AuxInt = off + t.FieldOff(2) 5627 v2.Aux = n 5628 v.AddArg(v2) 5629 v3 := b.NewValue0(v.Pos, OpArg, t.FieldType(3)) 5630 v3.AuxInt = off + t.FieldOff(3) 5631 v3.Aux = n 5632 v.AddArg(v3) 5633 return true 5634 } 5635 return false 5636 } 5637 func rewriteValuegeneric_OpArg_10(v *Value) bool { 5638 b := v.Block 5639 _ = b 5640 fe := b.Func.fe 5641 _ = fe 5642 // match: (Arg <t>) 5643 // cond: t.IsArray() && t.NumElem() == 0 5644 // result: (ArrayMake0) 5645 for { 5646 t := v.Type 5647 if !(t.IsArray() && t.NumElem() == 0) { 5648 break 5649 } 5650 v.reset(OpArrayMake0) 5651 return true 5652 } 5653 // match: (Arg <t> {n} [off]) 5654 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 5655 // result: (ArrayMake1 (Arg <t.ElemType()> {n} [off])) 5656 for { 5657 t := v.Type 5658 off := v.AuxInt 5659 n := v.Aux 5660 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 5661 break 5662 } 5663 v.reset(OpArrayMake1) 5664 v0 := b.NewValue0(v.Pos, OpArg, t.ElemType()) 5665 v0.AuxInt = off 5666 v0.Aux = n 5667 v.AddArg(v0) 5668 return true 5669 } 5670 return false 5671 } 5672 func rewriteValuegeneric_OpArraySelect_0(v *Value) bool { 5673 // match: (ArraySelect (ArrayMake1 x)) 5674 // cond: 5675 // result: x 5676 for { 5677 v_0 := v.Args[0] 5678 if v_0.Op != OpArrayMake1 { 5679 break 5680 } 5681 x := v_0.Args[0] 5682 v.reset(OpCopy) 5683 v.Type = x.Type 5684 v.AddArg(x) 5685 return true 5686 } 5687 // match: (ArraySelect [0] (Load ptr mem)) 5688 // cond: 5689 // result: (Load ptr mem) 5690 for { 5691 if v.AuxInt != 0 { 5692 break 5693 } 5694 v_0 := v.Args[0] 5695 if v_0.Op != OpLoad { 5696 break 5697 } 5698 _ = v_0.Args[1] 5699 ptr := v_0.Args[0] 5700 mem := v_0.Args[1] 5701 v.reset(OpLoad) 5702 v.AddArg(ptr) 5703 v.AddArg(mem) 5704 return true 5705 } 5706 // match: (ArraySelect [0] x:(IData _)) 5707 // cond: 5708 // result: x 5709 for { 5710 if v.AuxInt != 0 { 5711 break 5712 } 5713 x := v.Args[0] 5714 if x.Op != OpIData { 5715 break 5716 } 5717 v.reset(OpCopy) 5718 v.Type = x.Type 5719 v.AddArg(x) 5720 return true 5721 } 5722 return false 5723 } 5724 func rewriteValuegeneric_OpCom16_0(v *Value) bool { 5725 // match: (Com16 (Com16 x)) 5726 // cond: 5727 // result: x 5728 for { 5729 v_0 := v.Args[0] 5730 if v_0.Op != OpCom16 { 5731 break 5732 } 5733 x := v_0.Args[0] 5734 v.reset(OpCopy) 5735 v.Type = x.Type 5736 v.AddArg(x) 5737 return true 5738 } 5739 // match: (Com16 (Const16 [c])) 5740 // cond: 5741 // result: (Const16 [^c]) 5742 for { 5743 v_0 := v.Args[0] 5744 if v_0.Op != OpConst16 { 5745 break 5746 } 5747 c := v_0.AuxInt 5748 v.reset(OpConst16) 5749 v.AuxInt = ^c 5750 return true 5751 } 5752 return false 5753 } 5754 func rewriteValuegeneric_OpCom32_0(v *Value) bool { 5755 // match: (Com32 (Com32 x)) 5756 // cond: 5757 // result: x 5758 for { 5759 v_0 := v.Args[0] 5760 if v_0.Op != OpCom32 { 5761 break 5762 } 5763 x := v_0.Args[0] 5764 v.reset(OpCopy) 5765 v.Type = x.Type 5766 v.AddArg(x) 5767 return true 5768 } 5769 // match: (Com32 (Const32 [c])) 5770 // cond: 5771 // result: (Const32 [^c]) 5772 for { 5773 v_0 := v.Args[0] 5774 if v_0.Op != OpConst32 { 5775 break 5776 } 5777 c := v_0.AuxInt 5778 v.reset(OpConst32) 5779 v.AuxInt = ^c 5780 return true 5781 } 5782 return false 5783 } 5784 func rewriteValuegeneric_OpCom64_0(v *Value) bool { 5785 // match: (Com64 (Com64 x)) 5786 // cond: 5787 // result: x 5788 for { 5789 v_0 := v.Args[0] 5790 if v_0.Op != OpCom64 { 5791 break 5792 } 5793 x := v_0.Args[0] 5794 v.reset(OpCopy) 5795 v.Type = x.Type 5796 v.AddArg(x) 5797 return true 5798 } 5799 // match: (Com64 (Const64 [c])) 5800 // cond: 5801 // result: (Const64 [^c]) 5802 for { 5803 v_0 := v.Args[0] 5804 if v_0.Op != OpConst64 { 5805 break 5806 } 5807 c := v_0.AuxInt 5808 v.reset(OpConst64) 5809 v.AuxInt = ^c 5810 return true 5811 } 5812 return false 5813 } 5814 func rewriteValuegeneric_OpCom8_0(v *Value) bool { 5815 // match: (Com8 (Com8 x)) 5816 // cond: 5817 // result: x 5818 for { 5819 v_0 := v.Args[0] 5820 if v_0.Op != OpCom8 { 5821 break 5822 } 5823 x := v_0.Args[0] 5824 v.reset(OpCopy) 5825 v.Type = x.Type 5826 v.AddArg(x) 5827 return true 5828 } 5829 // match: (Com8 (Const8 [c])) 5830 // cond: 5831 // result: (Const8 [^c]) 5832 for { 5833 v_0 := v.Args[0] 5834 if v_0.Op != OpConst8 { 5835 break 5836 } 5837 c := v_0.AuxInt 5838 v.reset(OpConst8) 5839 v.AuxInt = ^c 5840 return true 5841 } 5842 return false 5843 } 5844 func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { 5845 b := v.Block 5846 _ = b 5847 typ := &b.Func.Config.Types 5848 _ = typ 5849 // match: (ConstInterface) 5850 // cond: 5851 // result: (IMake (ConstNil <typ.BytePtr>) (ConstNil <typ.BytePtr>)) 5852 for { 5853 v.reset(OpIMake) 5854 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 5855 v.AddArg(v0) 5856 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 5857 v.AddArg(v1) 5858 return true 5859 } 5860 } 5861 func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { 5862 b := v.Block 5863 _ = b 5864 config := b.Func.Config 5865 _ = config 5866 typ := &b.Func.Config.Types 5867 _ = typ 5868 // match: (ConstSlice) 5869 // cond: config.PtrSize == 4 5870 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const32 <typ.Int> [0]) (Const32 <typ.Int> [0])) 5871 for { 5872 if !(config.PtrSize == 4) { 5873 break 5874 } 5875 v.reset(OpSliceMake) 5876 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 5877 v.AddArg(v0) 5878 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 5879 v1.AuxInt = 0 5880 v.AddArg(v1) 5881 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 5882 v2.AuxInt = 0 5883 v.AddArg(v2) 5884 return true 5885 } 5886 // match: (ConstSlice) 5887 // cond: config.PtrSize == 8 5888 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const64 <typ.Int> [0]) (Const64 <typ.Int> [0])) 5889 for { 5890 if !(config.PtrSize == 8) { 5891 break 5892 } 5893 v.reset(OpSliceMake) 5894 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 5895 v.AddArg(v0) 5896 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 5897 v1.AuxInt = 0 5898 v.AddArg(v1) 5899 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 5900 v2.AuxInt = 0 5901 v.AddArg(v2) 5902 return true 5903 } 5904 return false 5905 } 5906 func rewriteValuegeneric_OpConstString_0(v *Value) bool { 5907 b := v.Block 5908 _ = b 5909 config := b.Func.Config 5910 _ = config 5911 fe := b.Func.fe 5912 _ = fe 5913 typ := &b.Func.Config.Types 5914 _ = typ 5915 // match: (ConstString {s}) 5916 // cond: config.PtrSize == 4 && s.(string) == "" 5917 // result: (StringMake (ConstNil) (Const32 <typ.Int> [0])) 5918 for { 5919 s := v.Aux 5920 if !(config.PtrSize == 4 && s.(string) == "") { 5921 break 5922 } 5923 v.reset(OpStringMake) 5924 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 5925 v.AddArg(v0) 5926 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 5927 v1.AuxInt = 0 5928 v.AddArg(v1) 5929 return true 5930 } 5931 // match: (ConstString {s}) 5932 // cond: config.PtrSize == 8 && s.(string) == "" 5933 // result: (StringMake (ConstNil) (Const64 <typ.Int> [0])) 5934 for { 5935 s := v.Aux 5936 if !(config.PtrSize == 8 && s.(string) == "") { 5937 break 5938 } 5939 v.reset(OpStringMake) 5940 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 5941 v.AddArg(v0) 5942 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 5943 v1.AuxInt = 0 5944 v.AddArg(v1) 5945 return true 5946 } 5947 // match: (ConstString {s}) 5948 // cond: config.PtrSize == 4 && s.(string) != "" 5949 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const32 <typ.Int> [int64(len(s.(string)))])) 5950 for { 5951 s := v.Aux 5952 if !(config.PtrSize == 4 && s.(string) != "") { 5953 break 5954 } 5955 v.reset(OpStringMake) 5956 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 5957 v0.Aux = fe.StringData(s.(string)) 5958 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 5959 v0.AddArg(v1) 5960 v.AddArg(v0) 5961 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 5962 v2.AuxInt = int64(len(s.(string))) 5963 v.AddArg(v2) 5964 return true 5965 } 5966 // match: (ConstString {s}) 5967 // cond: config.PtrSize == 8 && s.(string) != "" 5968 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const64 <typ.Int> [int64(len(s.(string)))])) 5969 for { 5970 s := v.Aux 5971 if !(config.PtrSize == 8 && s.(string) != "") { 5972 break 5973 } 5974 v.reset(OpStringMake) 5975 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 5976 v0.Aux = fe.StringData(s.(string)) 5977 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 5978 v0.AddArg(v1) 5979 v.AddArg(v0) 5980 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 5981 v2.AuxInt = int64(len(s.(string))) 5982 v.AddArg(v2) 5983 return true 5984 } 5985 return false 5986 } 5987 func rewriteValuegeneric_OpConvert_0(v *Value) bool { 5988 // match: (Convert (Add64 (Convert ptr mem) off) mem) 5989 // cond: 5990 // result: (Add64 ptr off) 5991 for { 5992 _ = v.Args[1] 5993 v_0 := v.Args[0] 5994 if v_0.Op != OpAdd64 { 5995 break 5996 } 5997 _ = v_0.Args[1] 5998 v_0_0 := v_0.Args[0] 5999 if v_0_0.Op != OpConvert { 6000 break 6001 } 6002 _ = v_0_0.Args[1] 6003 ptr := v_0_0.Args[0] 6004 mem := v_0_0.Args[1] 6005 off := v_0.Args[1] 6006 if mem != v.Args[1] { 6007 break 6008 } 6009 v.reset(OpAdd64) 6010 v.AddArg(ptr) 6011 v.AddArg(off) 6012 return true 6013 } 6014 // match: (Convert (Add64 off (Convert ptr mem)) mem) 6015 // cond: 6016 // result: (Add64 ptr off) 6017 for { 6018 _ = v.Args[1] 6019 v_0 := v.Args[0] 6020 if v_0.Op != OpAdd64 { 6021 break 6022 } 6023 _ = v_0.Args[1] 6024 off := v_0.Args[0] 6025 v_0_1 := v_0.Args[1] 6026 if v_0_1.Op != OpConvert { 6027 break 6028 } 6029 _ = v_0_1.Args[1] 6030 ptr := v_0_1.Args[0] 6031 mem := v_0_1.Args[1] 6032 if mem != v.Args[1] { 6033 break 6034 } 6035 v.reset(OpAdd64) 6036 v.AddArg(ptr) 6037 v.AddArg(off) 6038 return true 6039 } 6040 // match: (Convert (Convert ptr mem) mem) 6041 // cond: 6042 // result: ptr 6043 for { 6044 _ = v.Args[1] 6045 v_0 := v.Args[0] 6046 if v_0.Op != OpConvert { 6047 break 6048 } 6049 _ = v_0.Args[1] 6050 ptr := v_0.Args[0] 6051 mem := v_0.Args[1] 6052 if mem != v.Args[1] { 6053 break 6054 } 6055 v.reset(OpCopy) 6056 v.Type = ptr.Type 6057 v.AddArg(ptr) 6058 return true 6059 } 6060 return false 6061 } 6062 func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { 6063 // match: (Cvt32Fto64F (Const32F [c])) 6064 // cond: 6065 // result: (Const64F [c]) 6066 for { 6067 v_0 := v.Args[0] 6068 if v_0.Op != OpConst32F { 6069 break 6070 } 6071 c := v_0.AuxInt 6072 v.reset(OpConst64F) 6073 v.AuxInt = c 6074 return true 6075 } 6076 return false 6077 } 6078 func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { 6079 // match: (Cvt64Fto32F (Const64F [c])) 6080 // cond: 6081 // result: (Const32F [f2i(float64(i2f32(c)))]) 6082 for { 6083 v_0 := v.Args[0] 6084 if v_0.Op != OpConst64F { 6085 break 6086 } 6087 c := v_0.AuxInt 6088 v.reset(OpConst32F) 6089 v.AuxInt = f2i(float64(i2f32(c))) 6090 return true 6091 } 6092 return false 6093 } 6094 func rewriteValuegeneric_OpDiv16_0(v *Value) bool { 6095 b := v.Block 6096 _ = b 6097 typ := &b.Func.Config.Types 6098 _ = typ 6099 // match: (Div16 (Const16 [c]) (Const16 [d])) 6100 // cond: d != 0 6101 // result: (Const16 [int64(int16(c)/int16(d))]) 6102 for { 6103 _ = v.Args[1] 6104 v_0 := v.Args[0] 6105 if v_0.Op != OpConst16 { 6106 break 6107 } 6108 c := v_0.AuxInt 6109 v_1 := v.Args[1] 6110 if v_1.Op != OpConst16 { 6111 break 6112 } 6113 d := v_1.AuxInt 6114 if !(d != 0) { 6115 break 6116 } 6117 v.reset(OpConst16) 6118 v.AuxInt = int64(int16(c) / int16(d)) 6119 return true 6120 } 6121 // match: (Div16 <t> n (Const16 [c])) 6122 // cond: c < 0 && c != -1<<15 6123 // result: (Neg16 (Div16 <t> n (Const16 <t> [-c]))) 6124 for { 6125 t := v.Type 6126 _ = v.Args[1] 6127 n := v.Args[0] 6128 v_1 := v.Args[1] 6129 if v_1.Op != OpConst16 { 6130 break 6131 } 6132 c := v_1.AuxInt 6133 if !(c < 0 && c != -1<<15) { 6134 break 6135 } 6136 v.reset(OpNeg16) 6137 v0 := b.NewValue0(v.Pos, OpDiv16, t) 6138 v0.AddArg(n) 6139 v1 := b.NewValue0(v.Pos, OpConst16, t) 6140 v1.AuxInt = -c 6141 v0.AddArg(v1) 6142 v.AddArg(v0) 6143 return true 6144 } 6145 // match: (Div16 <t> x (Const16 [-1<<15])) 6146 // cond: 6147 // result: (Rsh16Ux64 (And16 <t> x (Neg16 <t> x)) (Const64 <typ.UInt64> [15])) 6148 for { 6149 t := v.Type 6150 _ = v.Args[1] 6151 x := v.Args[0] 6152 v_1 := v.Args[1] 6153 if v_1.Op != OpConst16 { 6154 break 6155 } 6156 if v_1.AuxInt != -1<<15 { 6157 break 6158 } 6159 v.reset(OpRsh16Ux64) 6160 v0 := b.NewValue0(v.Pos, OpAnd16, t) 6161 v0.AddArg(x) 6162 v1 := b.NewValue0(v.Pos, OpNeg16, t) 6163 v1.AddArg(x) 6164 v0.AddArg(v1) 6165 v.AddArg(v0) 6166 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6167 v2.AuxInt = 15 6168 v.AddArg(v2) 6169 return true 6170 } 6171 // match: (Div16 <t> n (Const16 [c])) 6172 // cond: isPowerOfTwo(c) 6173 // result: (Rsh16x64 (Add16 <t> n (Rsh16Ux64 <t> (Rsh16x64 <t> n (Const64 <typ.UInt64> [15])) (Const64 <typ.UInt64> [16-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 6174 for { 6175 t := v.Type 6176 _ = v.Args[1] 6177 n := v.Args[0] 6178 v_1 := v.Args[1] 6179 if v_1.Op != OpConst16 { 6180 break 6181 } 6182 c := v_1.AuxInt 6183 if !(isPowerOfTwo(c)) { 6184 break 6185 } 6186 v.reset(OpRsh16x64) 6187 v0 := b.NewValue0(v.Pos, OpAdd16, t) 6188 v0.AddArg(n) 6189 v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) 6190 v2 := b.NewValue0(v.Pos, OpRsh16x64, t) 6191 v2.AddArg(n) 6192 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6193 v3.AuxInt = 15 6194 v2.AddArg(v3) 6195 v1.AddArg(v2) 6196 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6197 v4.AuxInt = 16 - log2(c) 6198 v1.AddArg(v4) 6199 v0.AddArg(v1) 6200 v.AddArg(v0) 6201 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6202 v5.AuxInt = log2(c) 6203 v.AddArg(v5) 6204 return true 6205 } 6206 // match: (Div16 <t> x (Const16 [c])) 6207 // cond: smagicOK(16,c) 6208 // result: (Sub16 <t> (Rsh32x64 <t> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(smagic(16,c).m)]) (SignExt16to32 x)) (Const64 <typ.UInt64> [16+smagic(16,c).s])) (Rsh32x64 <t> (SignExt16to32 x) (Const64 <typ.UInt64> [31]))) 6209 for { 6210 t := v.Type 6211 _ = v.Args[1] 6212 x := v.Args[0] 6213 v_1 := v.Args[1] 6214 if v_1.Op != OpConst16 { 6215 break 6216 } 6217 c := v_1.AuxInt 6218 if !(smagicOK(16, c)) { 6219 break 6220 } 6221 v.reset(OpSub16) 6222 v.Type = t 6223 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 6224 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 6225 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6226 v2.AuxInt = int64(smagic(16, c).m) 6227 v1.AddArg(v2) 6228 v3 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 6229 v3.AddArg(x) 6230 v1.AddArg(v3) 6231 v0.AddArg(v1) 6232 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6233 v4.AuxInt = 16 + smagic(16, c).s 6234 v0.AddArg(v4) 6235 v.AddArg(v0) 6236 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 6237 v6 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 6238 v6.AddArg(x) 6239 v5.AddArg(v6) 6240 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6241 v7.AuxInt = 31 6242 v5.AddArg(v7) 6243 v.AddArg(v5) 6244 return true 6245 } 6246 return false 6247 } 6248 func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { 6249 b := v.Block 6250 _ = b 6251 config := b.Func.Config 6252 _ = config 6253 typ := &b.Func.Config.Types 6254 _ = typ 6255 // match: (Div16u (Const16 [c]) (Const16 [d])) 6256 // cond: d != 0 6257 // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) 6258 for { 6259 _ = v.Args[1] 6260 v_0 := v.Args[0] 6261 if v_0.Op != OpConst16 { 6262 break 6263 } 6264 c := v_0.AuxInt 6265 v_1 := v.Args[1] 6266 if v_1.Op != OpConst16 { 6267 break 6268 } 6269 d := v_1.AuxInt 6270 if !(d != 0) { 6271 break 6272 } 6273 v.reset(OpConst16) 6274 v.AuxInt = int64(int16(uint16(c) / uint16(d))) 6275 return true 6276 } 6277 // match: (Div16u n (Const16 [c])) 6278 // cond: isPowerOfTwo(c&0xffff) 6279 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 6280 for { 6281 _ = v.Args[1] 6282 n := v.Args[0] 6283 v_1 := v.Args[1] 6284 if v_1.Op != OpConst16 { 6285 break 6286 } 6287 c := v_1.AuxInt 6288 if !(isPowerOfTwo(c & 0xffff)) { 6289 break 6290 } 6291 v.reset(OpRsh16Ux64) 6292 v.AddArg(n) 6293 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6294 v0.AuxInt = log2(c & 0xffff) 6295 v.AddArg(v0) 6296 return true 6297 } 6298 // match: (Div16u x (Const16 [c])) 6299 // cond: umagicOK(16, c) && config.RegSize == 8 6300 // result: (Trunc64to16 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<16+umagic(16,c).m)]) (ZeroExt16to64 x)) (Const64 <typ.UInt64> [16+umagic(16,c).s]))) 6301 for { 6302 _ = v.Args[1] 6303 x := v.Args[0] 6304 v_1 := v.Args[1] 6305 if v_1.Op != OpConst16 { 6306 break 6307 } 6308 c := v_1.AuxInt 6309 if !(umagicOK(16, c) && config.RegSize == 8) { 6310 break 6311 } 6312 v.reset(OpTrunc64to16) 6313 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6314 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6315 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6316 v2.AuxInt = int64(1<<16 + umagic(16, c).m) 6317 v1.AddArg(v2) 6318 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) 6319 v3.AddArg(x) 6320 v1.AddArg(v3) 6321 v0.AddArg(v1) 6322 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6323 v4.AuxInt = 16 + umagic(16, c).s 6324 v0.AddArg(v4) 6325 v.AddArg(v0) 6326 return true 6327 } 6328 // match: (Div16u x (Const16 [c])) 6329 // cond: umagicOK(16, c) && config.RegSize == 4 && umagic(16,c).m&1 == 0 6330 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<15+umagic(16,c).m/2)]) (ZeroExt16to32 x)) (Const64 <typ.UInt64> [16+umagic(16,c).s-1]))) 6331 for { 6332 _ = v.Args[1] 6333 x := v.Args[0] 6334 v_1 := v.Args[1] 6335 if v_1.Op != OpConst16 { 6336 break 6337 } 6338 c := v_1.AuxInt 6339 if !(umagicOK(16, c) && config.RegSize == 4 && umagic(16, c).m&1 == 0) { 6340 break 6341 } 6342 v.reset(OpTrunc32to16) 6343 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6344 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 6345 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6346 v2.AuxInt = int64(1<<15 + umagic(16, c).m/2) 6347 v1.AddArg(v2) 6348 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 6349 v3.AddArg(x) 6350 v1.AddArg(v3) 6351 v0.AddArg(v1) 6352 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6353 v4.AuxInt = 16 + umagic(16, c).s - 1 6354 v0.AddArg(v4) 6355 v.AddArg(v0) 6356 return true 6357 } 6358 // match: (Div16u x (Const16 [c])) 6359 // cond: umagicOK(16, c) && config.RegSize == 4 && c&1 == 0 6360 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<15+(umagic(16,c).m+1)/2)]) (Rsh32Ux64 <typ.UInt32> (ZeroExt16to32 x) (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [16+umagic(16,c).s-2]))) 6361 for { 6362 _ = v.Args[1] 6363 x := v.Args[0] 6364 v_1 := v.Args[1] 6365 if v_1.Op != OpConst16 { 6366 break 6367 } 6368 c := v_1.AuxInt 6369 if !(umagicOK(16, c) && config.RegSize == 4 && c&1 == 0) { 6370 break 6371 } 6372 v.reset(OpTrunc32to16) 6373 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6374 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 6375 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6376 v2.AuxInt = int64(1<<15 + (umagic(16, c).m+1)/2) 6377 v1.AddArg(v2) 6378 v3 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6379 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 6380 v4.AddArg(x) 6381 v3.AddArg(v4) 6382 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6383 v5.AuxInt = 1 6384 v3.AddArg(v5) 6385 v1.AddArg(v3) 6386 v0.AddArg(v1) 6387 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6388 v6.AuxInt = 16 + umagic(16, c).s - 2 6389 v0.AddArg(v6) 6390 v.AddArg(v0) 6391 return true 6392 } 6393 // match: (Div16u x (Const16 [c])) 6394 // cond: umagicOK(16, c) && config.RegSize == 4 6395 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Avg32u (Lsh32x64 <typ.UInt32> (ZeroExt16to32 x) (Const64 <typ.UInt64> [16])) (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(umagic(16,c).m)]) (ZeroExt16to32 x))) (Const64 <typ.UInt64> [16+umagic(16,c).s-1]))) 6396 for { 6397 _ = v.Args[1] 6398 x := v.Args[0] 6399 v_1 := v.Args[1] 6400 if v_1.Op != OpConst16 { 6401 break 6402 } 6403 c := v_1.AuxInt 6404 if !(umagicOK(16, c) && config.RegSize == 4) { 6405 break 6406 } 6407 v.reset(OpTrunc32to16) 6408 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6409 v1 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 6410 v2 := b.NewValue0(v.Pos, OpLsh32x64, typ.UInt32) 6411 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 6412 v3.AddArg(x) 6413 v2.AddArg(v3) 6414 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6415 v4.AuxInt = 16 6416 v2.AddArg(v4) 6417 v1.AddArg(v2) 6418 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 6419 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6420 v6.AuxInt = int64(umagic(16, c).m) 6421 v5.AddArg(v6) 6422 v7 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 6423 v7.AddArg(x) 6424 v5.AddArg(v7) 6425 v1.AddArg(v5) 6426 v0.AddArg(v1) 6427 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6428 v8.AuxInt = 16 + umagic(16, c).s - 1 6429 v0.AddArg(v8) 6430 v.AddArg(v0) 6431 return true 6432 } 6433 return false 6434 } 6435 func rewriteValuegeneric_OpDiv32_0(v *Value) bool { 6436 b := v.Block 6437 _ = b 6438 config := b.Func.Config 6439 _ = config 6440 typ := &b.Func.Config.Types 6441 _ = typ 6442 // match: (Div32 (Const32 [c]) (Const32 [d])) 6443 // cond: d != 0 6444 // result: (Const32 [int64(int32(c)/int32(d))]) 6445 for { 6446 _ = v.Args[1] 6447 v_0 := v.Args[0] 6448 if v_0.Op != OpConst32 { 6449 break 6450 } 6451 c := v_0.AuxInt 6452 v_1 := v.Args[1] 6453 if v_1.Op != OpConst32 { 6454 break 6455 } 6456 d := v_1.AuxInt 6457 if !(d != 0) { 6458 break 6459 } 6460 v.reset(OpConst32) 6461 v.AuxInt = int64(int32(c) / int32(d)) 6462 return true 6463 } 6464 // match: (Div32 <t> n (Const32 [c])) 6465 // cond: c < 0 && c != -1<<31 6466 // result: (Neg32 (Div32 <t> n (Const32 <t> [-c]))) 6467 for { 6468 t := v.Type 6469 _ = v.Args[1] 6470 n := v.Args[0] 6471 v_1 := v.Args[1] 6472 if v_1.Op != OpConst32 { 6473 break 6474 } 6475 c := v_1.AuxInt 6476 if !(c < 0 && c != -1<<31) { 6477 break 6478 } 6479 v.reset(OpNeg32) 6480 v0 := b.NewValue0(v.Pos, OpDiv32, t) 6481 v0.AddArg(n) 6482 v1 := b.NewValue0(v.Pos, OpConst32, t) 6483 v1.AuxInt = -c 6484 v0.AddArg(v1) 6485 v.AddArg(v0) 6486 return true 6487 } 6488 // match: (Div32 <t> x (Const32 [-1<<31])) 6489 // cond: 6490 // result: (Rsh32Ux64 (And32 <t> x (Neg32 <t> x)) (Const64 <typ.UInt64> [31])) 6491 for { 6492 t := v.Type 6493 _ = v.Args[1] 6494 x := v.Args[0] 6495 v_1 := v.Args[1] 6496 if v_1.Op != OpConst32 { 6497 break 6498 } 6499 if v_1.AuxInt != -1<<31 { 6500 break 6501 } 6502 v.reset(OpRsh32Ux64) 6503 v0 := b.NewValue0(v.Pos, OpAnd32, t) 6504 v0.AddArg(x) 6505 v1 := b.NewValue0(v.Pos, OpNeg32, t) 6506 v1.AddArg(x) 6507 v0.AddArg(v1) 6508 v.AddArg(v0) 6509 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6510 v2.AuxInt = 31 6511 v.AddArg(v2) 6512 return true 6513 } 6514 // match: (Div32 <t> n (Const32 [c])) 6515 // cond: isPowerOfTwo(c) 6516 // result: (Rsh32x64 (Add32 <t> n (Rsh32Ux64 <t> (Rsh32x64 <t> n (Const64 <typ.UInt64> [31])) (Const64 <typ.UInt64> [32-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 6517 for { 6518 t := v.Type 6519 _ = v.Args[1] 6520 n := v.Args[0] 6521 v_1 := v.Args[1] 6522 if v_1.Op != OpConst32 { 6523 break 6524 } 6525 c := v_1.AuxInt 6526 if !(isPowerOfTwo(c)) { 6527 break 6528 } 6529 v.reset(OpRsh32x64) 6530 v0 := b.NewValue0(v.Pos, OpAdd32, t) 6531 v0.AddArg(n) 6532 v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) 6533 v2 := b.NewValue0(v.Pos, OpRsh32x64, t) 6534 v2.AddArg(n) 6535 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6536 v3.AuxInt = 31 6537 v2.AddArg(v3) 6538 v1.AddArg(v2) 6539 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6540 v4.AuxInt = 32 - log2(c) 6541 v1.AddArg(v4) 6542 v0.AddArg(v1) 6543 v.AddArg(v0) 6544 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6545 v5.AuxInt = log2(c) 6546 v.AddArg(v5) 6547 return true 6548 } 6549 // match: (Div32 <t> x (Const32 [c])) 6550 // cond: smagicOK(32,c) && config.RegSize == 8 6551 // result: (Sub32 <t> (Rsh64x64 <t> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(smagic(32,c).m)]) (SignExt32to64 x)) (Const64 <typ.UInt64> [32+smagic(32,c).s])) (Rsh64x64 <t> (SignExt32to64 x) (Const64 <typ.UInt64> [63]))) 6552 for { 6553 t := v.Type 6554 _ = v.Args[1] 6555 x := v.Args[0] 6556 v_1 := v.Args[1] 6557 if v_1.Op != OpConst32 { 6558 break 6559 } 6560 c := v_1.AuxInt 6561 if !(smagicOK(32, c) && config.RegSize == 8) { 6562 break 6563 } 6564 v.reset(OpSub32) 6565 v.Type = t 6566 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 6567 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6568 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6569 v2.AuxInt = int64(smagic(32, c).m) 6570 v1.AddArg(v2) 6571 v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 6572 v3.AddArg(x) 6573 v1.AddArg(v3) 6574 v0.AddArg(v1) 6575 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6576 v4.AuxInt = 32 + smagic(32, c).s 6577 v0.AddArg(v4) 6578 v.AddArg(v0) 6579 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 6580 v6 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 6581 v6.AddArg(x) 6582 v5.AddArg(v6) 6583 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6584 v7.AuxInt = 63 6585 v5.AddArg(v7) 6586 v.AddArg(v5) 6587 return true 6588 } 6589 // match: (Div32 <t> x (Const32 [c])) 6590 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 6591 // result: (Sub32 <t> (Rsh32x64 <t> (Hmul32 <t> (Const32 <typ.UInt32> [int64(int32(smagic(32,c).m/2))]) x) (Const64 <typ.UInt64> [smagic(32,c).s-1])) (Rsh32x64 <t> x (Const64 <typ.UInt64> [31]))) 6592 for { 6593 t := v.Type 6594 _ = v.Args[1] 6595 x := v.Args[0] 6596 v_1 := v.Args[1] 6597 if v_1.Op != OpConst32 { 6598 break 6599 } 6600 c := v_1.AuxInt 6601 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0) { 6602 break 6603 } 6604 v.reset(OpSub32) 6605 v.Type = t 6606 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 6607 v1 := b.NewValue0(v.Pos, OpHmul32, t) 6608 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6609 v2.AuxInt = int64(int32(smagic(32, c).m / 2)) 6610 v1.AddArg(v2) 6611 v1.AddArg(x) 6612 v0.AddArg(v1) 6613 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6614 v3.AuxInt = smagic(32, c).s - 1 6615 v0.AddArg(v3) 6616 v.AddArg(v0) 6617 v4 := b.NewValue0(v.Pos, OpRsh32x64, t) 6618 v4.AddArg(x) 6619 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6620 v5.AuxInt = 31 6621 v4.AddArg(v5) 6622 v.AddArg(v4) 6623 return true 6624 } 6625 // match: (Div32 <t> x (Const32 [c])) 6626 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 6627 // result: (Sub32 <t> (Rsh32x64 <t> (Add32 <t> (Hmul32 <t> (Const32 <typ.UInt32> [int64(int32(smagic(32,c).m))]) x) x) (Const64 <typ.UInt64> [smagic(32,c).s])) (Rsh32x64 <t> x (Const64 <typ.UInt64> [31]))) 6628 for { 6629 t := v.Type 6630 _ = v.Args[1] 6631 x := v.Args[0] 6632 v_1 := v.Args[1] 6633 if v_1.Op != OpConst32 { 6634 break 6635 } 6636 c := v_1.AuxInt 6637 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0) { 6638 break 6639 } 6640 v.reset(OpSub32) 6641 v.Type = t 6642 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 6643 v1 := b.NewValue0(v.Pos, OpAdd32, t) 6644 v2 := b.NewValue0(v.Pos, OpHmul32, t) 6645 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6646 v3.AuxInt = int64(int32(smagic(32, c).m)) 6647 v2.AddArg(v3) 6648 v2.AddArg(x) 6649 v1.AddArg(v2) 6650 v1.AddArg(x) 6651 v0.AddArg(v1) 6652 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6653 v4.AuxInt = smagic(32, c).s 6654 v0.AddArg(v4) 6655 v.AddArg(v0) 6656 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 6657 v5.AddArg(x) 6658 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6659 v6.AuxInt = 31 6660 v5.AddArg(v6) 6661 v.AddArg(v5) 6662 return true 6663 } 6664 return false 6665 } 6666 func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { 6667 b := v.Block 6668 _ = b 6669 // match: (Div32F (Const32F [c]) (Const32F [d])) 6670 // cond: 6671 // result: (Const32F [f2i(float64(i2f32(c) / i2f32(d)))]) 6672 for { 6673 _ = v.Args[1] 6674 v_0 := v.Args[0] 6675 if v_0.Op != OpConst32F { 6676 break 6677 } 6678 c := v_0.AuxInt 6679 v_1 := v.Args[1] 6680 if v_1.Op != OpConst32F { 6681 break 6682 } 6683 d := v_1.AuxInt 6684 v.reset(OpConst32F) 6685 v.AuxInt = f2i(float64(i2f32(c) / i2f32(d))) 6686 return true 6687 } 6688 // match: (Div32F x (Const32F <t> [c])) 6689 // cond: reciprocalExact32(float32(i2f(c))) 6690 // result: (Mul32F x (Const32F <t> [f2i(1/i2f(c))])) 6691 for { 6692 _ = v.Args[1] 6693 x := v.Args[0] 6694 v_1 := v.Args[1] 6695 if v_1.Op != OpConst32F { 6696 break 6697 } 6698 t := v_1.Type 6699 c := v_1.AuxInt 6700 if !(reciprocalExact32(float32(i2f(c)))) { 6701 break 6702 } 6703 v.reset(OpMul32F) 6704 v.AddArg(x) 6705 v0 := b.NewValue0(v.Pos, OpConst32F, t) 6706 v0.AuxInt = f2i(1 / i2f(c)) 6707 v.AddArg(v0) 6708 return true 6709 } 6710 return false 6711 } 6712 func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { 6713 b := v.Block 6714 _ = b 6715 config := b.Func.Config 6716 _ = config 6717 typ := &b.Func.Config.Types 6718 _ = typ 6719 // match: (Div32u (Const32 [c]) (Const32 [d])) 6720 // cond: d != 0 6721 // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) 6722 for { 6723 _ = v.Args[1] 6724 v_0 := v.Args[0] 6725 if v_0.Op != OpConst32 { 6726 break 6727 } 6728 c := v_0.AuxInt 6729 v_1 := v.Args[1] 6730 if v_1.Op != OpConst32 { 6731 break 6732 } 6733 d := v_1.AuxInt 6734 if !(d != 0) { 6735 break 6736 } 6737 v.reset(OpConst32) 6738 v.AuxInt = int64(int32(uint32(c) / uint32(d))) 6739 return true 6740 } 6741 // match: (Div32u n (Const32 [c])) 6742 // cond: isPowerOfTwo(c&0xffffffff) 6743 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 6744 for { 6745 _ = v.Args[1] 6746 n := v.Args[0] 6747 v_1 := v.Args[1] 6748 if v_1.Op != OpConst32 { 6749 break 6750 } 6751 c := v_1.AuxInt 6752 if !(isPowerOfTwo(c & 0xffffffff)) { 6753 break 6754 } 6755 v.reset(OpRsh32Ux64) 6756 v.AddArg(n) 6757 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6758 v0.AuxInt = log2(c & 0xffffffff) 6759 v.AddArg(v0) 6760 return true 6761 } 6762 // match: (Div32u x (Const32 [c])) 6763 // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 6764 // result: (Rsh32Ux64 <typ.UInt32> (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(1<<31+umagic(32,c).m/2))]) x) (Const64 <typ.UInt64> [umagic(32,c).s-1])) 6765 for { 6766 _ = v.Args[1] 6767 x := v.Args[0] 6768 v_1 := v.Args[1] 6769 if v_1.Op != OpConst32 { 6770 break 6771 } 6772 c := v_1.AuxInt 6773 if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0) { 6774 break 6775 } 6776 v.reset(OpRsh32Ux64) 6777 v.Type = typ.UInt32 6778 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 6779 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6780 v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) 6781 v0.AddArg(v1) 6782 v0.AddArg(x) 6783 v.AddArg(v0) 6784 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6785 v2.AuxInt = umagic(32, c).s - 1 6786 v.AddArg(v2) 6787 return true 6788 } 6789 // match: (Div32u x (Const32 [c])) 6790 // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 6791 // result: (Rsh32Ux64 <typ.UInt32> (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(1<<31+(umagic(32,c).m+1)/2))]) (Rsh32Ux64 <typ.UInt32> x (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [umagic(32,c).s-2])) 6792 for { 6793 _ = v.Args[1] 6794 x := v.Args[0] 6795 v_1 := v.Args[1] 6796 if v_1.Op != OpConst32 { 6797 break 6798 } 6799 c := v_1.AuxInt 6800 if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0) { 6801 break 6802 } 6803 v.reset(OpRsh32Ux64) 6804 v.Type = typ.UInt32 6805 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 6806 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6807 v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) 6808 v0.AddArg(v1) 6809 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6810 v2.AddArg(x) 6811 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6812 v3.AuxInt = 1 6813 v2.AddArg(v3) 6814 v0.AddArg(v2) 6815 v.AddArg(v0) 6816 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6817 v4.AuxInt = umagic(32, c).s - 2 6818 v.AddArg(v4) 6819 return true 6820 } 6821 // match: (Div32u x (Const32 [c])) 6822 // cond: umagicOK(32, c) && config.RegSize == 4 6823 // result: (Rsh32Ux64 <typ.UInt32> (Avg32u x (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(umagic(32,c).m))]) x)) (Const64 <typ.UInt64> [umagic(32,c).s-1])) 6824 for { 6825 _ = v.Args[1] 6826 x := v.Args[0] 6827 v_1 := v.Args[1] 6828 if v_1.Op != OpConst32 { 6829 break 6830 } 6831 c := v_1.AuxInt 6832 if !(umagicOK(32, c) && config.RegSize == 4) { 6833 break 6834 } 6835 v.reset(OpRsh32Ux64) 6836 v.Type = typ.UInt32 6837 v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 6838 v0.AddArg(x) 6839 v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 6840 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6841 v2.AuxInt = int64(int32(umagic(32, c).m)) 6842 v1.AddArg(v2) 6843 v1.AddArg(x) 6844 v0.AddArg(v1) 6845 v.AddArg(v0) 6846 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6847 v3.AuxInt = umagic(32, c).s - 1 6848 v.AddArg(v3) 6849 return true 6850 } 6851 // match: (Div32u x (Const32 [c])) 6852 // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 6853 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<31+umagic(32,c).m/2)]) (ZeroExt32to64 x)) (Const64 <typ.UInt64> [32+umagic(32,c).s-1]))) 6854 for { 6855 _ = v.Args[1] 6856 x := v.Args[0] 6857 v_1 := v.Args[1] 6858 if v_1.Op != OpConst32 { 6859 break 6860 } 6861 c := v_1.AuxInt 6862 if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { 6863 break 6864 } 6865 v.reset(OpTrunc64to32) 6866 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6867 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6868 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6869 v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) 6870 v1.AddArg(v2) 6871 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 6872 v3.AddArg(x) 6873 v1.AddArg(v3) 6874 v0.AddArg(v1) 6875 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6876 v4.AuxInt = 32 + umagic(32, c).s - 1 6877 v0.AddArg(v4) 6878 v.AddArg(v0) 6879 return true 6880 } 6881 // match: (Div32u x (Const32 [c])) 6882 // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 6883 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<31+(umagic(32,c).m+1)/2)]) (Rsh64Ux64 <typ.UInt64> (ZeroExt32to64 x) (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [32+umagic(32,c).s-2]))) 6884 for { 6885 _ = v.Args[1] 6886 x := v.Args[0] 6887 v_1 := v.Args[1] 6888 if v_1.Op != OpConst32 { 6889 break 6890 } 6891 c := v_1.AuxInt 6892 if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { 6893 break 6894 } 6895 v.reset(OpTrunc64to32) 6896 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6897 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6898 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6899 v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) 6900 v1.AddArg(v2) 6901 v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6902 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 6903 v4.AddArg(x) 6904 v3.AddArg(v4) 6905 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6906 v5.AuxInt = 1 6907 v3.AddArg(v5) 6908 v1.AddArg(v3) 6909 v0.AddArg(v1) 6910 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6911 v6.AuxInt = 32 + umagic(32, c).s - 2 6912 v0.AddArg(v6) 6913 v.AddArg(v0) 6914 return true 6915 } 6916 // match: (Div32u x (Const32 [c])) 6917 // cond: umagicOK(32, c) && config.RegSize == 8 6918 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Avg64u (Lsh64x64 <typ.UInt64> (ZeroExt32to64 x) (Const64 <typ.UInt64> [32])) (Mul64 <typ.UInt64> (Const64 <typ.UInt32> [int64(umagic(32,c).m)]) (ZeroExt32to64 x))) (Const64 <typ.UInt64> [32+umagic(32,c).s-1]))) 6919 for { 6920 _ = v.Args[1] 6921 x := v.Args[0] 6922 v_1 := v.Args[1] 6923 if v_1.Op != OpConst32 { 6924 break 6925 } 6926 c := v_1.AuxInt 6927 if !(umagicOK(32, c) && config.RegSize == 8) { 6928 break 6929 } 6930 v.reset(OpTrunc64to32) 6931 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6932 v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 6933 v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64) 6934 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 6935 v3.AddArg(x) 6936 v2.AddArg(v3) 6937 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6938 v4.AuxInt = 32 6939 v2.AddArg(v4) 6940 v1.AddArg(v2) 6941 v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6942 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32) 6943 v6.AuxInt = int64(umagic(32, c).m) 6944 v5.AddArg(v6) 6945 v7 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 6946 v7.AddArg(x) 6947 v5.AddArg(v7) 6948 v1.AddArg(v5) 6949 v0.AddArg(v1) 6950 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6951 v8.AuxInt = 32 + umagic(32, c).s - 1 6952 v0.AddArg(v8) 6953 v.AddArg(v0) 6954 return true 6955 } 6956 return false 6957 } 6958 func rewriteValuegeneric_OpDiv64_0(v *Value) bool { 6959 b := v.Block 6960 _ = b 6961 typ := &b.Func.Config.Types 6962 _ = typ 6963 // match: (Div64 (Const64 [c]) (Const64 [d])) 6964 // cond: d != 0 6965 // result: (Const64 [c/d]) 6966 for { 6967 _ = v.Args[1] 6968 v_0 := v.Args[0] 6969 if v_0.Op != OpConst64 { 6970 break 6971 } 6972 c := v_0.AuxInt 6973 v_1 := v.Args[1] 6974 if v_1.Op != OpConst64 { 6975 break 6976 } 6977 d := v_1.AuxInt 6978 if !(d != 0) { 6979 break 6980 } 6981 v.reset(OpConst64) 6982 v.AuxInt = c / d 6983 return true 6984 } 6985 // match: (Div64 <t> n (Const64 [c])) 6986 // cond: c < 0 && c != -1<<63 6987 // result: (Neg64 (Div64 <t> n (Const64 <t> [-c]))) 6988 for { 6989 t := v.Type 6990 _ = v.Args[1] 6991 n := v.Args[0] 6992 v_1 := v.Args[1] 6993 if v_1.Op != OpConst64 { 6994 break 6995 } 6996 c := v_1.AuxInt 6997 if !(c < 0 && c != -1<<63) { 6998 break 6999 } 7000 v.reset(OpNeg64) 7001 v0 := b.NewValue0(v.Pos, OpDiv64, t) 7002 v0.AddArg(n) 7003 v1 := b.NewValue0(v.Pos, OpConst64, t) 7004 v1.AuxInt = -c 7005 v0.AddArg(v1) 7006 v.AddArg(v0) 7007 return true 7008 } 7009 // match: (Div64 <t> x (Const64 [-1<<63])) 7010 // cond: 7011 // result: (Rsh64Ux64 (And64 <t> x (Neg64 <t> x)) (Const64 <typ.UInt64> [63])) 7012 for { 7013 t := v.Type 7014 _ = v.Args[1] 7015 x := v.Args[0] 7016 v_1 := v.Args[1] 7017 if v_1.Op != OpConst64 { 7018 break 7019 } 7020 if v_1.AuxInt != -1<<63 { 7021 break 7022 } 7023 v.reset(OpRsh64Ux64) 7024 v0 := b.NewValue0(v.Pos, OpAnd64, t) 7025 v0.AddArg(x) 7026 v1 := b.NewValue0(v.Pos, OpNeg64, t) 7027 v1.AddArg(x) 7028 v0.AddArg(v1) 7029 v.AddArg(v0) 7030 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7031 v2.AuxInt = 63 7032 v.AddArg(v2) 7033 return true 7034 } 7035 // match: (Div64 <t> n (Const64 [c])) 7036 // cond: isPowerOfTwo(c) 7037 // result: (Rsh64x64 (Add64 <t> n (Rsh64Ux64 <t> (Rsh64x64 <t> n (Const64 <typ.UInt64> [63])) (Const64 <typ.UInt64> [64-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 7038 for { 7039 t := v.Type 7040 _ = v.Args[1] 7041 n := v.Args[0] 7042 v_1 := v.Args[1] 7043 if v_1.Op != OpConst64 { 7044 break 7045 } 7046 c := v_1.AuxInt 7047 if !(isPowerOfTwo(c)) { 7048 break 7049 } 7050 v.reset(OpRsh64x64) 7051 v0 := b.NewValue0(v.Pos, OpAdd64, t) 7052 v0.AddArg(n) 7053 v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 7054 v2 := b.NewValue0(v.Pos, OpRsh64x64, t) 7055 v2.AddArg(n) 7056 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7057 v3.AuxInt = 63 7058 v2.AddArg(v3) 7059 v1.AddArg(v2) 7060 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7061 v4.AuxInt = 64 - log2(c) 7062 v1.AddArg(v4) 7063 v0.AddArg(v1) 7064 v.AddArg(v0) 7065 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7066 v5.AuxInt = log2(c) 7067 v.AddArg(v5) 7068 return true 7069 } 7070 // match: (Div64 <t> x (Const64 [c])) 7071 // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 7072 // result: (Sub64 <t> (Rsh64x64 <t> (Hmul64 <t> (Const64 <typ.UInt64> [int64(smagic(64,c).m/2)]) x) (Const64 <typ.UInt64> [smagic(64,c).s-1])) (Rsh64x64 <t> x (Const64 <typ.UInt64> [63]))) 7073 for { 7074 t := v.Type 7075 _ = v.Args[1] 7076 x := v.Args[0] 7077 v_1 := v.Args[1] 7078 if v_1.Op != OpConst64 { 7079 break 7080 } 7081 c := v_1.AuxInt 7082 if !(smagicOK(64, c) && smagic(64, c).m&1 == 0) { 7083 break 7084 } 7085 v.reset(OpSub64) 7086 v.Type = t 7087 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 7088 v1 := b.NewValue0(v.Pos, OpHmul64, t) 7089 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7090 v2.AuxInt = int64(smagic(64, c).m / 2) 7091 v1.AddArg(v2) 7092 v1.AddArg(x) 7093 v0.AddArg(v1) 7094 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7095 v3.AuxInt = smagic(64, c).s - 1 7096 v0.AddArg(v3) 7097 v.AddArg(v0) 7098 v4 := b.NewValue0(v.Pos, OpRsh64x64, t) 7099 v4.AddArg(x) 7100 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7101 v5.AuxInt = 63 7102 v4.AddArg(v5) 7103 v.AddArg(v4) 7104 return true 7105 } 7106 // match: (Div64 <t> x (Const64 [c])) 7107 // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 7108 // result: (Sub64 <t> (Rsh64x64 <t> (Add64 <t> (Hmul64 <t> (Const64 <typ.UInt64> [int64(smagic(64,c).m)]) x) x) (Const64 <typ.UInt64> [smagic(64,c).s])) (Rsh64x64 <t> x (Const64 <typ.UInt64> [63]))) 7109 for { 7110 t := v.Type 7111 _ = v.Args[1] 7112 x := v.Args[0] 7113 v_1 := v.Args[1] 7114 if v_1.Op != OpConst64 { 7115 break 7116 } 7117 c := v_1.AuxInt 7118 if !(smagicOK(64, c) && smagic(64, c).m&1 != 0) { 7119 break 7120 } 7121 v.reset(OpSub64) 7122 v.Type = t 7123 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 7124 v1 := b.NewValue0(v.Pos, OpAdd64, t) 7125 v2 := b.NewValue0(v.Pos, OpHmul64, t) 7126 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7127 v3.AuxInt = int64(smagic(64, c).m) 7128 v2.AddArg(v3) 7129 v2.AddArg(x) 7130 v1.AddArg(v2) 7131 v1.AddArg(x) 7132 v0.AddArg(v1) 7133 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7134 v4.AuxInt = smagic(64, c).s 7135 v0.AddArg(v4) 7136 v.AddArg(v0) 7137 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 7138 v5.AddArg(x) 7139 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7140 v6.AuxInt = 63 7141 v5.AddArg(v6) 7142 v.AddArg(v5) 7143 return true 7144 } 7145 return false 7146 } 7147 func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { 7148 b := v.Block 7149 _ = b 7150 // match: (Div64F (Const64F [c]) (Const64F [d])) 7151 // cond: 7152 // result: (Const64F [f2i(i2f(c) / i2f(d))]) 7153 for { 7154 _ = v.Args[1] 7155 v_0 := v.Args[0] 7156 if v_0.Op != OpConst64F { 7157 break 7158 } 7159 c := v_0.AuxInt 7160 v_1 := v.Args[1] 7161 if v_1.Op != OpConst64F { 7162 break 7163 } 7164 d := v_1.AuxInt 7165 v.reset(OpConst64F) 7166 v.AuxInt = f2i(i2f(c) / i2f(d)) 7167 return true 7168 } 7169 // match: (Div64F x (Const64F <t> [c])) 7170 // cond: reciprocalExact64(i2f(c)) 7171 // result: (Mul64F x (Const64F <t> [f2i(1/i2f(c))])) 7172 for { 7173 _ = v.Args[1] 7174 x := v.Args[0] 7175 v_1 := v.Args[1] 7176 if v_1.Op != OpConst64F { 7177 break 7178 } 7179 t := v_1.Type 7180 c := v_1.AuxInt 7181 if !(reciprocalExact64(i2f(c))) { 7182 break 7183 } 7184 v.reset(OpMul64F) 7185 v.AddArg(x) 7186 v0 := b.NewValue0(v.Pos, OpConst64F, t) 7187 v0.AuxInt = f2i(1 / i2f(c)) 7188 v.AddArg(v0) 7189 return true 7190 } 7191 return false 7192 } 7193 func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { 7194 b := v.Block 7195 _ = b 7196 config := b.Func.Config 7197 _ = config 7198 typ := &b.Func.Config.Types 7199 _ = typ 7200 // match: (Div64u (Const64 [c]) (Const64 [d])) 7201 // cond: d != 0 7202 // result: (Const64 [int64(uint64(c)/uint64(d))]) 7203 for { 7204 _ = v.Args[1] 7205 v_0 := v.Args[0] 7206 if v_0.Op != OpConst64 { 7207 break 7208 } 7209 c := v_0.AuxInt 7210 v_1 := v.Args[1] 7211 if v_1.Op != OpConst64 { 7212 break 7213 } 7214 d := v_1.AuxInt 7215 if !(d != 0) { 7216 break 7217 } 7218 v.reset(OpConst64) 7219 v.AuxInt = int64(uint64(c) / uint64(d)) 7220 return true 7221 } 7222 // match: (Div64u n (Const64 [c])) 7223 // cond: isPowerOfTwo(c) 7224 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 7225 for { 7226 _ = v.Args[1] 7227 n := v.Args[0] 7228 v_1 := v.Args[1] 7229 if v_1.Op != OpConst64 { 7230 break 7231 } 7232 c := v_1.AuxInt 7233 if !(isPowerOfTwo(c)) { 7234 break 7235 } 7236 v.reset(OpRsh64Ux64) 7237 v.AddArg(n) 7238 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7239 v0.AuxInt = log2(c) 7240 v.AddArg(v0) 7241 return true 7242 } 7243 // match: (Div64u n (Const64 [-1<<63])) 7244 // cond: 7245 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [63])) 7246 for { 7247 _ = v.Args[1] 7248 n := v.Args[0] 7249 v_1 := v.Args[1] 7250 if v_1.Op != OpConst64 { 7251 break 7252 } 7253 if v_1.AuxInt != -1<<63 { 7254 break 7255 } 7256 v.reset(OpRsh64Ux64) 7257 v.AddArg(n) 7258 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7259 v0.AuxInt = 63 7260 v.AddArg(v0) 7261 return true 7262 } 7263 // match: (Div64u x (Const64 [c])) 7264 // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 7265 // result: (Rsh64Ux64 <typ.UInt64> (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<63+umagic(64,c).m/2)]) x) (Const64 <typ.UInt64> [umagic(64,c).s-1])) 7266 for { 7267 _ = v.Args[1] 7268 x := v.Args[0] 7269 v_1 := v.Args[1] 7270 if v_1.Op != OpConst64 { 7271 break 7272 } 7273 c := v_1.AuxInt 7274 if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) { 7275 break 7276 } 7277 v.reset(OpRsh64Ux64) 7278 v.Type = typ.UInt64 7279 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 7280 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7281 v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) 7282 v0.AddArg(v1) 7283 v0.AddArg(x) 7284 v.AddArg(v0) 7285 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7286 v2.AuxInt = umagic(64, c).s - 1 7287 v.AddArg(v2) 7288 return true 7289 } 7290 // match: (Div64u x (Const64 [c])) 7291 // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 7292 // result: (Rsh64Ux64 <typ.UInt64> (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<63+(umagic(64,c).m+1)/2)]) (Rsh64Ux64 <typ.UInt64> x (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [umagic(64,c).s-2])) 7293 for { 7294 _ = v.Args[1] 7295 x := v.Args[0] 7296 v_1 := v.Args[1] 7297 if v_1.Op != OpConst64 { 7298 break 7299 } 7300 c := v_1.AuxInt 7301 if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) { 7302 break 7303 } 7304 v.reset(OpRsh64Ux64) 7305 v.Type = typ.UInt64 7306 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 7307 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7308 v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) 7309 v0.AddArg(v1) 7310 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7311 v2.AddArg(x) 7312 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7313 v3.AuxInt = 1 7314 v2.AddArg(v3) 7315 v0.AddArg(v2) 7316 v.AddArg(v0) 7317 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7318 v4.AuxInt = umagic(64, c).s - 2 7319 v.AddArg(v4) 7320 return true 7321 } 7322 // match: (Div64u x (Const64 [c])) 7323 // cond: umagicOK(64, c) && config.RegSize == 8 7324 // result: (Rsh64Ux64 <typ.UInt64> (Avg64u x (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(umagic(64,c).m)]) x)) (Const64 <typ.UInt64> [umagic(64,c).s-1])) 7325 for { 7326 _ = v.Args[1] 7327 x := v.Args[0] 7328 v_1 := v.Args[1] 7329 if v_1.Op != OpConst64 { 7330 break 7331 } 7332 c := v_1.AuxInt 7333 if !(umagicOK(64, c) && config.RegSize == 8) { 7334 break 7335 } 7336 v.reset(OpRsh64Ux64) 7337 v.Type = typ.UInt64 7338 v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 7339 v0.AddArg(x) 7340 v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 7341 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7342 v2.AuxInt = int64(umagic(64, c).m) 7343 v1.AddArg(v2) 7344 v1.AddArg(x) 7345 v0.AddArg(v1) 7346 v.AddArg(v0) 7347 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7348 v3.AuxInt = umagic(64, c).s - 1 7349 v.AddArg(v3) 7350 return true 7351 } 7352 return false 7353 } 7354 func rewriteValuegeneric_OpDiv8_0(v *Value) bool { 7355 b := v.Block 7356 _ = b 7357 typ := &b.Func.Config.Types 7358 _ = typ 7359 // match: (Div8 (Const8 [c]) (Const8 [d])) 7360 // cond: d != 0 7361 // result: (Const8 [int64(int8(c)/int8(d))]) 7362 for { 7363 _ = v.Args[1] 7364 v_0 := v.Args[0] 7365 if v_0.Op != OpConst8 { 7366 break 7367 } 7368 c := v_0.AuxInt 7369 v_1 := v.Args[1] 7370 if v_1.Op != OpConst8 { 7371 break 7372 } 7373 d := v_1.AuxInt 7374 if !(d != 0) { 7375 break 7376 } 7377 v.reset(OpConst8) 7378 v.AuxInt = int64(int8(c) / int8(d)) 7379 return true 7380 } 7381 // match: (Div8 <t> n (Const8 [c])) 7382 // cond: c < 0 && c != -1<<7 7383 // result: (Neg8 (Div8 <t> n (Const8 <t> [-c]))) 7384 for { 7385 t := v.Type 7386 _ = v.Args[1] 7387 n := v.Args[0] 7388 v_1 := v.Args[1] 7389 if v_1.Op != OpConst8 { 7390 break 7391 } 7392 c := v_1.AuxInt 7393 if !(c < 0 && c != -1<<7) { 7394 break 7395 } 7396 v.reset(OpNeg8) 7397 v0 := b.NewValue0(v.Pos, OpDiv8, t) 7398 v0.AddArg(n) 7399 v1 := b.NewValue0(v.Pos, OpConst8, t) 7400 v1.AuxInt = -c 7401 v0.AddArg(v1) 7402 v.AddArg(v0) 7403 return true 7404 } 7405 // match: (Div8 <t> x (Const8 [-1<<7 ])) 7406 // cond: 7407 // result: (Rsh8Ux64 (And8 <t> x (Neg8 <t> x)) (Const64 <typ.UInt64> [7 ])) 7408 for { 7409 t := v.Type 7410 _ = v.Args[1] 7411 x := v.Args[0] 7412 v_1 := v.Args[1] 7413 if v_1.Op != OpConst8 { 7414 break 7415 } 7416 if v_1.AuxInt != -1<<7 { 7417 break 7418 } 7419 v.reset(OpRsh8Ux64) 7420 v0 := b.NewValue0(v.Pos, OpAnd8, t) 7421 v0.AddArg(x) 7422 v1 := b.NewValue0(v.Pos, OpNeg8, t) 7423 v1.AddArg(x) 7424 v0.AddArg(v1) 7425 v.AddArg(v0) 7426 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7427 v2.AuxInt = 7 7428 v.AddArg(v2) 7429 return true 7430 } 7431 // match: (Div8 <t> n (Const8 [c])) 7432 // cond: isPowerOfTwo(c) 7433 // result: (Rsh8x64 (Add8 <t> n (Rsh8Ux64 <t> (Rsh8x64 <t> n (Const64 <typ.UInt64> [ 7])) (Const64 <typ.UInt64> [ 8-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 7434 for { 7435 t := v.Type 7436 _ = v.Args[1] 7437 n := v.Args[0] 7438 v_1 := v.Args[1] 7439 if v_1.Op != OpConst8 { 7440 break 7441 } 7442 c := v_1.AuxInt 7443 if !(isPowerOfTwo(c)) { 7444 break 7445 } 7446 v.reset(OpRsh8x64) 7447 v0 := b.NewValue0(v.Pos, OpAdd8, t) 7448 v0.AddArg(n) 7449 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) 7450 v2 := b.NewValue0(v.Pos, OpRsh8x64, t) 7451 v2.AddArg(n) 7452 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7453 v3.AuxInt = 7 7454 v2.AddArg(v3) 7455 v1.AddArg(v2) 7456 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7457 v4.AuxInt = 8 - log2(c) 7458 v1.AddArg(v4) 7459 v0.AddArg(v1) 7460 v.AddArg(v0) 7461 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7462 v5.AuxInt = log2(c) 7463 v.AddArg(v5) 7464 return true 7465 } 7466 // match: (Div8 <t> x (Const8 [c])) 7467 // cond: smagicOK(8,c) 7468 // result: (Sub8 <t> (Rsh32x64 <t> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(smagic(8,c).m)]) (SignExt8to32 x)) (Const64 <typ.UInt64> [8+smagic(8,c).s])) (Rsh32x64 <t> (SignExt8to32 x) (Const64 <typ.UInt64> [31]))) 7469 for { 7470 t := v.Type 7471 _ = v.Args[1] 7472 x := v.Args[0] 7473 v_1 := v.Args[1] 7474 if v_1.Op != OpConst8 { 7475 break 7476 } 7477 c := v_1.AuxInt 7478 if !(smagicOK(8, c)) { 7479 break 7480 } 7481 v.reset(OpSub8) 7482 v.Type = t 7483 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7484 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7485 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7486 v2.AuxInt = int64(smagic(8, c).m) 7487 v1.AddArg(v2) 7488 v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 7489 v3.AddArg(x) 7490 v1.AddArg(v3) 7491 v0.AddArg(v1) 7492 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7493 v4.AuxInt = 8 + smagic(8, c).s 7494 v0.AddArg(v4) 7495 v.AddArg(v0) 7496 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7497 v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 7498 v6.AddArg(x) 7499 v5.AddArg(v6) 7500 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7501 v7.AuxInt = 31 7502 v5.AddArg(v7) 7503 v.AddArg(v5) 7504 return true 7505 } 7506 return false 7507 } 7508 func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { 7509 b := v.Block 7510 _ = b 7511 typ := &b.Func.Config.Types 7512 _ = typ 7513 // match: (Div8u (Const8 [c]) (Const8 [d])) 7514 // cond: d != 0 7515 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) 7516 for { 7517 _ = v.Args[1] 7518 v_0 := v.Args[0] 7519 if v_0.Op != OpConst8 { 7520 break 7521 } 7522 c := v_0.AuxInt 7523 v_1 := v.Args[1] 7524 if v_1.Op != OpConst8 { 7525 break 7526 } 7527 d := v_1.AuxInt 7528 if !(d != 0) { 7529 break 7530 } 7531 v.reset(OpConst8) 7532 v.AuxInt = int64(int8(uint8(c) / uint8(d))) 7533 return true 7534 } 7535 // match: (Div8u n (Const8 [c])) 7536 // cond: isPowerOfTwo(c&0xff) 7537 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 7538 for { 7539 _ = v.Args[1] 7540 n := v.Args[0] 7541 v_1 := v.Args[1] 7542 if v_1.Op != OpConst8 { 7543 break 7544 } 7545 c := v_1.AuxInt 7546 if !(isPowerOfTwo(c & 0xff)) { 7547 break 7548 } 7549 v.reset(OpRsh8Ux64) 7550 v.AddArg(n) 7551 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7552 v0.AuxInt = log2(c & 0xff) 7553 v.AddArg(v0) 7554 return true 7555 } 7556 // match: (Div8u x (Const8 [c])) 7557 // cond: umagicOK(8, c) 7558 // result: (Trunc32to8 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<8+umagic(8,c).m)]) (ZeroExt8to32 x)) (Const64 <typ.UInt64> [8+umagic(8,c).s]))) 7559 for { 7560 _ = v.Args[1] 7561 x := v.Args[0] 7562 v_1 := v.Args[1] 7563 if v_1.Op != OpConst8 { 7564 break 7565 } 7566 c := v_1.AuxInt 7567 if !(umagicOK(8, c)) { 7568 break 7569 } 7570 v.reset(OpTrunc32to8) 7571 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7572 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7573 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7574 v2.AuxInt = int64(1<<8 + umagic(8, c).m) 7575 v1.AddArg(v2) 7576 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 7577 v3.AddArg(x) 7578 v1.AddArg(v3) 7579 v0.AddArg(v1) 7580 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7581 v4.AuxInt = 8 + umagic(8, c).s 7582 v0.AddArg(v4) 7583 v.AddArg(v0) 7584 return true 7585 } 7586 return false 7587 } 7588 func rewriteValuegeneric_OpEq16_0(v *Value) bool { 7589 b := v.Block 7590 _ = b 7591 // match: (Eq16 x x) 7592 // cond: 7593 // result: (ConstBool [1]) 7594 for { 7595 _ = v.Args[1] 7596 x := v.Args[0] 7597 if x != v.Args[1] { 7598 break 7599 } 7600 v.reset(OpConstBool) 7601 v.AuxInt = 1 7602 return true 7603 } 7604 // match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 7605 // cond: 7606 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7607 for { 7608 _ = v.Args[1] 7609 v_0 := v.Args[0] 7610 if v_0.Op != OpConst16 { 7611 break 7612 } 7613 t := v_0.Type 7614 c := v_0.AuxInt 7615 v_1 := v.Args[1] 7616 if v_1.Op != OpAdd16 { 7617 break 7618 } 7619 _ = v_1.Args[1] 7620 v_1_0 := v_1.Args[0] 7621 if v_1_0.Op != OpConst16 { 7622 break 7623 } 7624 if v_1_0.Type != t { 7625 break 7626 } 7627 d := v_1_0.AuxInt 7628 x := v_1.Args[1] 7629 v.reset(OpEq16) 7630 v0 := b.NewValue0(v.Pos, OpConst16, t) 7631 v0.AuxInt = int64(int16(c - d)) 7632 v.AddArg(v0) 7633 v.AddArg(x) 7634 return true 7635 } 7636 // match: (Eq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 7637 // cond: 7638 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7639 for { 7640 _ = v.Args[1] 7641 v_0 := v.Args[0] 7642 if v_0.Op != OpConst16 { 7643 break 7644 } 7645 t := v_0.Type 7646 c := v_0.AuxInt 7647 v_1 := v.Args[1] 7648 if v_1.Op != OpAdd16 { 7649 break 7650 } 7651 _ = v_1.Args[1] 7652 x := v_1.Args[0] 7653 v_1_1 := v_1.Args[1] 7654 if v_1_1.Op != OpConst16 { 7655 break 7656 } 7657 if v_1_1.Type != t { 7658 break 7659 } 7660 d := v_1_1.AuxInt 7661 v.reset(OpEq16) 7662 v0 := b.NewValue0(v.Pos, OpConst16, t) 7663 v0.AuxInt = int64(int16(c - d)) 7664 v.AddArg(v0) 7665 v.AddArg(x) 7666 return true 7667 } 7668 // match: (Eq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 7669 // cond: 7670 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7671 for { 7672 _ = v.Args[1] 7673 v_0 := v.Args[0] 7674 if v_0.Op != OpAdd16 { 7675 break 7676 } 7677 _ = v_0.Args[1] 7678 v_0_0 := v_0.Args[0] 7679 if v_0_0.Op != OpConst16 { 7680 break 7681 } 7682 t := v_0_0.Type 7683 d := v_0_0.AuxInt 7684 x := v_0.Args[1] 7685 v_1 := v.Args[1] 7686 if v_1.Op != OpConst16 { 7687 break 7688 } 7689 if v_1.Type != t { 7690 break 7691 } 7692 c := v_1.AuxInt 7693 v.reset(OpEq16) 7694 v0 := b.NewValue0(v.Pos, OpConst16, t) 7695 v0.AuxInt = int64(int16(c - d)) 7696 v.AddArg(v0) 7697 v.AddArg(x) 7698 return true 7699 } 7700 // match: (Eq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 7701 // cond: 7702 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7703 for { 7704 _ = v.Args[1] 7705 v_0 := v.Args[0] 7706 if v_0.Op != OpAdd16 { 7707 break 7708 } 7709 _ = v_0.Args[1] 7710 x := v_0.Args[0] 7711 v_0_1 := v_0.Args[1] 7712 if v_0_1.Op != OpConst16 { 7713 break 7714 } 7715 t := v_0_1.Type 7716 d := v_0_1.AuxInt 7717 v_1 := v.Args[1] 7718 if v_1.Op != OpConst16 { 7719 break 7720 } 7721 if v_1.Type != t { 7722 break 7723 } 7724 c := v_1.AuxInt 7725 v.reset(OpEq16) 7726 v0 := b.NewValue0(v.Pos, OpConst16, t) 7727 v0.AuxInt = int64(int16(c - d)) 7728 v.AddArg(v0) 7729 v.AddArg(x) 7730 return true 7731 } 7732 // match: (Eq16 (Const16 [c]) (Const16 [d])) 7733 // cond: 7734 // result: (ConstBool [b2i(c == d)]) 7735 for { 7736 _ = v.Args[1] 7737 v_0 := v.Args[0] 7738 if v_0.Op != OpConst16 { 7739 break 7740 } 7741 c := v_0.AuxInt 7742 v_1 := v.Args[1] 7743 if v_1.Op != OpConst16 { 7744 break 7745 } 7746 d := v_1.AuxInt 7747 v.reset(OpConstBool) 7748 v.AuxInt = b2i(c == d) 7749 return true 7750 } 7751 // match: (Eq16 (Const16 [d]) (Const16 [c])) 7752 // cond: 7753 // result: (ConstBool [b2i(c == d)]) 7754 for { 7755 _ = v.Args[1] 7756 v_0 := v.Args[0] 7757 if v_0.Op != OpConst16 { 7758 break 7759 } 7760 d := v_0.AuxInt 7761 v_1 := v.Args[1] 7762 if v_1.Op != OpConst16 { 7763 break 7764 } 7765 c := v_1.AuxInt 7766 v.reset(OpConstBool) 7767 v.AuxInt = b2i(c == d) 7768 return true 7769 } 7770 return false 7771 } 7772 func rewriteValuegeneric_OpEq32_0(v *Value) bool { 7773 b := v.Block 7774 _ = b 7775 // match: (Eq32 x x) 7776 // cond: 7777 // result: (ConstBool [1]) 7778 for { 7779 _ = v.Args[1] 7780 x := v.Args[0] 7781 if x != v.Args[1] { 7782 break 7783 } 7784 v.reset(OpConstBool) 7785 v.AuxInt = 1 7786 return true 7787 } 7788 // match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 7789 // cond: 7790 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7791 for { 7792 _ = v.Args[1] 7793 v_0 := v.Args[0] 7794 if v_0.Op != OpConst32 { 7795 break 7796 } 7797 t := v_0.Type 7798 c := v_0.AuxInt 7799 v_1 := v.Args[1] 7800 if v_1.Op != OpAdd32 { 7801 break 7802 } 7803 _ = v_1.Args[1] 7804 v_1_0 := v_1.Args[0] 7805 if v_1_0.Op != OpConst32 { 7806 break 7807 } 7808 if v_1_0.Type != t { 7809 break 7810 } 7811 d := v_1_0.AuxInt 7812 x := v_1.Args[1] 7813 v.reset(OpEq32) 7814 v0 := b.NewValue0(v.Pos, OpConst32, t) 7815 v0.AuxInt = int64(int32(c - d)) 7816 v.AddArg(v0) 7817 v.AddArg(x) 7818 return true 7819 } 7820 // match: (Eq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 7821 // cond: 7822 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7823 for { 7824 _ = v.Args[1] 7825 v_0 := v.Args[0] 7826 if v_0.Op != OpConst32 { 7827 break 7828 } 7829 t := v_0.Type 7830 c := v_0.AuxInt 7831 v_1 := v.Args[1] 7832 if v_1.Op != OpAdd32 { 7833 break 7834 } 7835 _ = v_1.Args[1] 7836 x := v_1.Args[0] 7837 v_1_1 := v_1.Args[1] 7838 if v_1_1.Op != OpConst32 { 7839 break 7840 } 7841 if v_1_1.Type != t { 7842 break 7843 } 7844 d := v_1_1.AuxInt 7845 v.reset(OpEq32) 7846 v0 := b.NewValue0(v.Pos, OpConst32, t) 7847 v0.AuxInt = int64(int32(c - d)) 7848 v.AddArg(v0) 7849 v.AddArg(x) 7850 return true 7851 } 7852 // match: (Eq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 7853 // cond: 7854 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7855 for { 7856 _ = v.Args[1] 7857 v_0 := v.Args[0] 7858 if v_0.Op != OpAdd32 { 7859 break 7860 } 7861 _ = v_0.Args[1] 7862 v_0_0 := v_0.Args[0] 7863 if v_0_0.Op != OpConst32 { 7864 break 7865 } 7866 t := v_0_0.Type 7867 d := v_0_0.AuxInt 7868 x := v_0.Args[1] 7869 v_1 := v.Args[1] 7870 if v_1.Op != OpConst32 { 7871 break 7872 } 7873 if v_1.Type != t { 7874 break 7875 } 7876 c := v_1.AuxInt 7877 v.reset(OpEq32) 7878 v0 := b.NewValue0(v.Pos, OpConst32, t) 7879 v0.AuxInt = int64(int32(c - d)) 7880 v.AddArg(v0) 7881 v.AddArg(x) 7882 return true 7883 } 7884 // match: (Eq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 7885 // cond: 7886 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7887 for { 7888 _ = v.Args[1] 7889 v_0 := v.Args[0] 7890 if v_0.Op != OpAdd32 { 7891 break 7892 } 7893 _ = v_0.Args[1] 7894 x := v_0.Args[0] 7895 v_0_1 := v_0.Args[1] 7896 if v_0_1.Op != OpConst32 { 7897 break 7898 } 7899 t := v_0_1.Type 7900 d := v_0_1.AuxInt 7901 v_1 := v.Args[1] 7902 if v_1.Op != OpConst32 { 7903 break 7904 } 7905 if v_1.Type != t { 7906 break 7907 } 7908 c := v_1.AuxInt 7909 v.reset(OpEq32) 7910 v0 := b.NewValue0(v.Pos, OpConst32, t) 7911 v0.AuxInt = int64(int32(c - d)) 7912 v.AddArg(v0) 7913 v.AddArg(x) 7914 return true 7915 } 7916 // match: (Eq32 (Const32 [c]) (Const32 [d])) 7917 // cond: 7918 // result: (ConstBool [b2i(c == d)]) 7919 for { 7920 _ = v.Args[1] 7921 v_0 := v.Args[0] 7922 if v_0.Op != OpConst32 { 7923 break 7924 } 7925 c := v_0.AuxInt 7926 v_1 := v.Args[1] 7927 if v_1.Op != OpConst32 { 7928 break 7929 } 7930 d := v_1.AuxInt 7931 v.reset(OpConstBool) 7932 v.AuxInt = b2i(c == d) 7933 return true 7934 } 7935 // match: (Eq32 (Const32 [d]) (Const32 [c])) 7936 // cond: 7937 // result: (ConstBool [b2i(c == d)]) 7938 for { 7939 _ = v.Args[1] 7940 v_0 := v.Args[0] 7941 if v_0.Op != OpConst32 { 7942 break 7943 } 7944 d := v_0.AuxInt 7945 v_1 := v.Args[1] 7946 if v_1.Op != OpConst32 { 7947 break 7948 } 7949 c := v_1.AuxInt 7950 v.reset(OpConstBool) 7951 v.AuxInt = b2i(c == d) 7952 return true 7953 } 7954 return false 7955 } 7956 func rewriteValuegeneric_OpEq64_0(v *Value) bool { 7957 b := v.Block 7958 _ = b 7959 // match: (Eq64 x x) 7960 // cond: 7961 // result: (ConstBool [1]) 7962 for { 7963 _ = v.Args[1] 7964 x := v.Args[0] 7965 if x != v.Args[1] { 7966 break 7967 } 7968 v.reset(OpConstBool) 7969 v.AuxInt = 1 7970 return true 7971 } 7972 // match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 7973 // cond: 7974 // result: (Eq64 (Const64 <t> [c-d]) x) 7975 for { 7976 _ = v.Args[1] 7977 v_0 := v.Args[0] 7978 if v_0.Op != OpConst64 { 7979 break 7980 } 7981 t := v_0.Type 7982 c := v_0.AuxInt 7983 v_1 := v.Args[1] 7984 if v_1.Op != OpAdd64 { 7985 break 7986 } 7987 _ = v_1.Args[1] 7988 v_1_0 := v_1.Args[0] 7989 if v_1_0.Op != OpConst64 { 7990 break 7991 } 7992 if v_1_0.Type != t { 7993 break 7994 } 7995 d := v_1_0.AuxInt 7996 x := v_1.Args[1] 7997 v.reset(OpEq64) 7998 v0 := b.NewValue0(v.Pos, OpConst64, t) 7999 v0.AuxInt = c - d 8000 v.AddArg(v0) 8001 v.AddArg(x) 8002 return true 8003 } 8004 // match: (Eq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 8005 // cond: 8006 // result: (Eq64 (Const64 <t> [c-d]) x) 8007 for { 8008 _ = v.Args[1] 8009 v_0 := v.Args[0] 8010 if v_0.Op != OpConst64 { 8011 break 8012 } 8013 t := v_0.Type 8014 c := v_0.AuxInt 8015 v_1 := v.Args[1] 8016 if v_1.Op != OpAdd64 { 8017 break 8018 } 8019 _ = v_1.Args[1] 8020 x := v_1.Args[0] 8021 v_1_1 := v_1.Args[1] 8022 if v_1_1.Op != OpConst64 { 8023 break 8024 } 8025 if v_1_1.Type != t { 8026 break 8027 } 8028 d := v_1_1.AuxInt 8029 v.reset(OpEq64) 8030 v0 := b.NewValue0(v.Pos, OpConst64, t) 8031 v0.AuxInt = c - d 8032 v.AddArg(v0) 8033 v.AddArg(x) 8034 return true 8035 } 8036 // match: (Eq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 8037 // cond: 8038 // result: (Eq64 (Const64 <t> [c-d]) x) 8039 for { 8040 _ = v.Args[1] 8041 v_0 := v.Args[0] 8042 if v_0.Op != OpAdd64 { 8043 break 8044 } 8045 _ = v_0.Args[1] 8046 v_0_0 := v_0.Args[0] 8047 if v_0_0.Op != OpConst64 { 8048 break 8049 } 8050 t := v_0_0.Type 8051 d := v_0_0.AuxInt 8052 x := v_0.Args[1] 8053 v_1 := v.Args[1] 8054 if v_1.Op != OpConst64 { 8055 break 8056 } 8057 if v_1.Type != t { 8058 break 8059 } 8060 c := v_1.AuxInt 8061 v.reset(OpEq64) 8062 v0 := b.NewValue0(v.Pos, OpConst64, t) 8063 v0.AuxInt = c - d 8064 v.AddArg(v0) 8065 v.AddArg(x) 8066 return true 8067 } 8068 // match: (Eq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 8069 // cond: 8070 // result: (Eq64 (Const64 <t> [c-d]) x) 8071 for { 8072 _ = v.Args[1] 8073 v_0 := v.Args[0] 8074 if v_0.Op != OpAdd64 { 8075 break 8076 } 8077 _ = v_0.Args[1] 8078 x := v_0.Args[0] 8079 v_0_1 := v_0.Args[1] 8080 if v_0_1.Op != OpConst64 { 8081 break 8082 } 8083 t := v_0_1.Type 8084 d := v_0_1.AuxInt 8085 v_1 := v.Args[1] 8086 if v_1.Op != OpConst64 { 8087 break 8088 } 8089 if v_1.Type != t { 8090 break 8091 } 8092 c := v_1.AuxInt 8093 v.reset(OpEq64) 8094 v0 := b.NewValue0(v.Pos, OpConst64, t) 8095 v0.AuxInt = c - d 8096 v.AddArg(v0) 8097 v.AddArg(x) 8098 return true 8099 } 8100 // match: (Eq64 (Const64 [c]) (Const64 [d])) 8101 // cond: 8102 // result: (ConstBool [b2i(c == d)]) 8103 for { 8104 _ = v.Args[1] 8105 v_0 := v.Args[0] 8106 if v_0.Op != OpConst64 { 8107 break 8108 } 8109 c := v_0.AuxInt 8110 v_1 := v.Args[1] 8111 if v_1.Op != OpConst64 { 8112 break 8113 } 8114 d := v_1.AuxInt 8115 v.reset(OpConstBool) 8116 v.AuxInt = b2i(c == d) 8117 return true 8118 } 8119 // match: (Eq64 (Const64 [d]) (Const64 [c])) 8120 // cond: 8121 // result: (ConstBool [b2i(c == d)]) 8122 for { 8123 _ = v.Args[1] 8124 v_0 := v.Args[0] 8125 if v_0.Op != OpConst64 { 8126 break 8127 } 8128 d := v_0.AuxInt 8129 v_1 := v.Args[1] 8130 if v_1.Op != OpConst64 { 8131 break 8132 } 8133 c := v_1.AuxInt 8134 v.reset(OpConstBool) 8135 v.AuxInt = b2i(c == d) 8136 return true 8137 } 8138 return false 8139 } 8140 func rewriteValuegeneric_OpEq8_0(v *Value) bool { 8141 b := v.Block 8142 _ = b 8143 // match: (Eq8 x x) 8144 // cond: 8145 // result: (ConstBool [1]) 8146 for { 8147 _ = v.Args[1] 8148 x := v.Args[0] 8149 if x != v.Args[1] { 8150 break 8151 } 8152 v.reset(OpConstBool) 8153 v.AuxInt = 1 8154 return true 8155 } 8156 // match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 8157 // cond: 8158 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 8159 for { 8160 _ = v.Args[1] 8161 v_0 := v.Args[0] 8162 if v_0.Op != OpConst8 { 8163 break 8164 } 8165 t := v_0.Type 8166 c := v_0.AuxInt 8167 v_1 := v.Args[1] 8168 if v_1.Op != OpAdd8 { 8169 break 8170 } 8171 _ = v_1.Args[1] 8172 v_1_0 := v_1.Args[0] 8173 if v_1_0.Op != OpConst8 { 8174 break 8175 } 8176 if v_1_0.Type != t { 8177 break 8178 } 8179 d := v_1_0.AuxInt 8180 x := v_1.Args[1] 8181 v.reset(OpEq8) 8182 v0 := b.NewValue0(v.Pos, OpConst8, t) 8183 v0.AuxInt = int64(int8(c - d)) 8184 v.AddArg(v0) 8185 v.AddArg(x) 8186 return true 8187 } 8188 // match: (Eq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 8189 // cond: 8190 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 8191 for { 8192 _ = v.Args[1] 8193 v_0 := v.Args[0] 8194 if v_0.Op != OpConst8 { 8195 break 8196 } 8197 t := v_0.Type 8198 c := v_0.AuxInt 8199 v_1 := v.Args[1] 8200 if v_1.Op != OpAdd8 { 8201 break 8202 } 8203 _ = v_1.Args[1] 8204 x := v_1.Args[0] 8205 v_1_1 := v_1.Args[1] 8206 if v_1_1.Op != OpConst8 { 8207 break 8208 } 8209 if v_1_1.Type != t { 8210 break 8211 } 8212 d := v_1_1.AuxInt 8213 v.reset(OpEq8) 8214 v0 := b.NewValue0(v.Pos, OpConst8, t) 8215 v0.AuxInt = int64(int8(c - d)) 8216 v.AddArg(v0) 8217 v.AddArg(x) 8218 return true 8219 } 8220 // match: (Eq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 8221 // cond: 8222 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 8223 for { 8224 _ = v.Args[1] 8225 v_0 := v.Args[0] 8226 if v_0.Op != OpAdd8 { 8227 break 8228 } 8229 _ = v_0.Args[1] 8230 v_0_0 := v_0.Args[0] 8231 if v_0_0.Op != OpConst8 { 8232 break 8233 } 8234 t := v_0_0.Type 8235 d := v_0_0.AuxInt 8236 x := v_0.Args[1] 8237 v_1 := v.Args[1] 8238 if v_1.Op != OpConst8 { 8239 break 8240 } 8241 if v_1.Type != t { 8242 break 8243 } 8244 c := v_1.AuxInt 8245 v.reset(OpEq8) 8246 v0 := b.NewValue0(v.Pos, OpConst8, t) 8247 v0.AuxInt = int64(int8(c - d)) 8248 v.AddArg(v0) 8249 v.AddArg(x) 8250 return true 8251 } 8252 // match: (Eq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 8253 // cond: 8254 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 8255 for { 8256 _ = v.Args[1] 8257 v_0 := v.Args[0] 8258 if v_0.Op != OpAdd8 { 8259 break 8260 } 8261 _ = v_0.Args[1] 8262 x := v_0.Args[0] 8263 v_0_1 := v_0.Args[1] 8264 if v_0_1.Op != OpConst8 { 8265 break 8266 } 8267 t := v_0_1.Type 8268 d := v_0_1.AuxInt 8269 v_1 := v.Args[1] 8270 if v_1.Op != OpConst8 { 8271 break 8272 } 8273 if v_1.Type != t { 8274 break 8275 } 8276 c := v_1.AuxInt 8277 v.reset(OpEq8) 8278 v0 := b.NewValue0(v.Pos, OpConst8, t) 8279 v0.AuxInt = int64(int8(c - d)) 8280 v.AddArg(v0) 8281 v.AddArg(x) 8282 return true 8283 } 8284 // match: (Eq8 (Const8 [c]) (Const8 [d])) 8285 // cond: 8286 // result: (ConstBool [b2i(c == d)]) 8287 for { 8288 _ = v.Args[1] 8289 v_0 := v.Args[0] 8290 if v_0.Op != OpConst8 { 8291 break 8292 } 8293 c := v_0.AuxInt 8294 v_1 := v.Args[1] 8295 if v_1.Op != OpConst8 { 8296 break 8297 } 8298 d := v_1.AuxInt 8299 v.reset(OpConstBool) 8300 v.AuxInt = b2i(c == d) 8301 return true 8302 } 8303 // match: (Eq8 (Const8 [d]) (Const8 [c])) 8304 // cond: 8305 // result: (ConstBool [b2i(c == d)]) 8306 for { 8307 _ = v.Args[1] 8308 v_0 := v.Args[0] 8309 if v_0.Op != OpConst8 { 8310 break 8311 } 8312 d := v_0.AuxInt 8313 v_1 := v.Args[1] 8314 if v_1.Op != OpConst8 { 8315 break 8316 } 8317 c := v_1.AuxInt 8318 v.reset(OpConstBool) 8319 v.AuxInt = b2i(c == d) 8320 return true 8321 } 8322 return false 8323 } 8324 func rewriteValuegeneric_OpEqB_0(v *Value) bool { 8325 // match: (EqB (ConstBool [c]) (ConstBool [d])) 8326 // cond: 8327 // result: (ConstBool [b2i(c == d)]) 8328 for { 8329 _ = v.Args[1] 8330 v_0 := v.Args[0] 8331 if v_0.Op != OpConstBool { 8332 break 8333 } 8334 c := v_0.AuxInt 8335 v_1 := v.Args[1] 8336 if v_1.Op != OpConstBool { 8337 break 8338 } 8339 d := v_1.AuxInt 8340 v.reset(OpConstBool) 8341 v.AuxInt = b2i(c == d) 8342 return true 8343 } 8344 // match: (EqB (ConstBool [d]) (ConstBool [c])) 8345 // cond: 8346 // result: (ConstBool [b2i(c == d)]) 8347 for { 8348 _ = v.Args[1] 8349 v_0 := v.Args[0] 8350 if v_0.Op != OpConstBool { 8351 break 8352 } 8353 d := v_0.AuxInt 8354 v_1 := v.Args[1] 8355 if v_1.Op != OpConstBool { 8356 break 8357 } 8358 c := v_1.AuxInt 8359 v.reset(OpConstBool) 8360 v.AuxInt = b2i(c == d) 8361 return true 8362 } 8363 // match: (EqB (ConstBool [0]) x) 8364 // cond: 8365 // result: (Not x) 8366 for { 8367 _ = v.Args[1] 8368 v_0 := v.Args[0] 8369 if v_0.Op != OpConstBool { 8370 break 8371 } 8372 if v_0.AuxInt != 0 { 8373 break 8374 } 8375 x := v.Args[1] 8376 v.reset(OpNot) 8377 v.AddArg(x) 8378 return true 8379 } 8380 // match: (EqB x (ConstBool [0])) 8381 // cond: 8382 // result: (Not x) 8383 for { 8384 _ = v.Args[1] 8385 x := v.Args[0] 8386 v_1 := v.Args[1] 8387 if v_1.Op != OpConstBool { 8388 break 8389 } 8390 if v_1.AuxInt != 0 { 8391 break 8392 } 8393 v.reset(OpNot) 8394 v.AddArg(x) 8395 return true 8396 } 8397 // match: (EqB (ConstBool [1]) x) 8398 // cond: 8399 // result: x 8400 for { 8401 _ = v.Args[1] 8402 v_0 := v.Args[0] 8403 if v_0.Op != OpConstBool { 8404 break 8405 } 8406 if v_0.AuxInt != 1 { 8407 break 8408 } 8409 x := v.Args[1] 8410 v.reset(OpCopy) 8411 v.Type = x.Type 8412 v.AddArg(x) 8413 return true 8414 } 8415 // match: (EqB x (ConstBool [1])) 8416 // cond: 8417 // result: x 8418 for { 8419 _ = v.Args[1] 8420 x := v.Args[0] 8421 v_1 := v.Args[1] 8422 if v_1.Op != OpConstBool { 8423 break 8424 } 8425 if v_1.AuxInt != 1 { 8426 break 8427 } 8428 v.reset(OpCopy) 8429 v.Type = x.Type 8430 v.AddArg(x) 8431 return true 8432 } 8433 return false 8434 } 8435 func rewriteValuegeneric_OpEqInter_0(v *Value) bool { 8436 b := v.Block 8437 _ = b 8438 typ := &b.Func.Config.Types 8439 _ = typ 8440 // match: (EqInter x y) 8441 // cond: 8442 // result: (EqPtr (ITab x) (ITab y)) 8443 for { 8444 _ = v.Args[1] 8445 x := v.Args[0] 8446 y := v.Args[1] 8447 v.reset(OpEqPtr) 8448 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 8449 v0.AddArg(x) 8450 v.AddArg(v0) 8451 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 8452 v1.AddArg(y) 8453 v.AddArg(v1) 8454 return true 8455 } 8456 } 8457 func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { 8458 b := v.Block 8459 _ = b 8460 typ := &b.Func.Config.Types 8461 _ = typ 8462 // match: (EqPtr p (ConstNil)) 8463 // cond: 8464 // result: (Not (IsNonNil p)) 8465 for { 8466 _ = v.Args[1] 8467 p := v.Args[0] 8468 v_1 := v.Args[1] 8469 if v_1.Op != OpConstNil { 8470 break 8471 } 8472 v.reset(OpNot) 8473 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 8474 v0.AddArg(p) 8475 v.AddArg(v0) 8476 return true 8477 } 8478 // match: (EqPtr (ConstNil) p) 8479 // cond: 8480 // result: (Not (IsNonNil p)) 8481 for { 8482 _ = v.Args[1] 8483 v_0 := v.Args[0] 8484 if v_0.Op != OpConstNil { 8485 break 8486 } 8487 p := v.Args[1] 8488 v.reset(OpNot) 8489 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 8490 v0.AddArg(p) 8491 v.AddArg(v0) 8492 return true 8493 } 8494 // match: (EqPtr x x) 8495 // cond: 8496 // result: (ConstBool [1]) 8497 for { 8498 _ = v.Args[1] 8499 x := v.Args[0] 8500 if x != v.Args[1] { 8501 break 8502 } 8503 v.reset(OpConstBool) 8504 v.AuxInt = 1 8505 return true 8506 } 8507 // match: (EqPtr (Addr {a} x) (Addr {b} x)) 8508 // cond: 8509 // result: (ConstBool [b2i(a == b)]) 8510 for { 8511 _ = v.Args[1] 8512 v_0 := v.Args[0] 8513 if v_0.Op != OpAddr { 8514 break 8515 } 8516 a := v_0.Aux 8517 x := v_0.Args[0] 8518 v_1 := v.Args[1] 8519 if v_1.Op != OpAddr { 8520 break 8521 } 8522 b := v_1.Aux 8523 if x != v_1.Args[0] { 8524 break 8525 } 8526 v.reset(OpConstBool) 8527 v.AuxInt = b2i(a == b) 8528 return true 8529 } 8530 // match: (EqPtr (Addr {b} x) (Addr {a} x)) 8531 // cond: 8532 // result: (ConstBool [b2i(a == b)]) 8533 for { 8534 _ = v.Args[1] 8535 v_0 := v.Args[0] 8536 if v_0.Op != OpAddr { 8537 break 8538 } 8539 b := v_0.Aux 8540 x := v_0.Args[0] 8541 v_1 := v.Args[1] 8542 if v_1.Op != OpAddr { 8543 break 8544 } 8545 a := v_1.Aux 8546 if x != v_1.Args[0] { 8547 break 8548 } 8549 v.reset(OpConstBool) 8550 v.AuxInt = b2i(a == b) 8551 return true 8552 } 8553 return false 8554 } 8555 func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { 8556 b := v.Block 8557 _ = b 8558 typ := &b.Func.Config.Types 8559 _ = typ 8560 // match: (EqSlice x y) 8561 // cond: 8562 // result: (EqPtr (SlicePtr x) (SlicePtr y)) 8563 for { 8564 _ = v.Args[1] 8565 x := v.Args[0] 8566 y := v.Args[1] 8567 v.reset(OpEqPtr) 8568 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 8569 v0.AddArg(x) 8570 v.AddArg(v0) 8571 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 8572 v1.AddArg(y) 8573 v.AddArg(v1) 8574 return true 8575 } 8576 } 8577 func rewriteValuegeneric_OpGeq16_0(v *Value) bool { 8578 // match: (Geq16 (Const16 [c]) (Const16 [d])) 8579 // cond: 8580 // result: (ConstBool [b2i(c >= d)]) 8581 for { 8582 _ = v.Args[1] 8583 v_0 := v.Args[0] 8584 if v_0.Op != OpConst16 { 8585 break 8586 } 8587 c := v_0.AuxInt 8588 v_1 := v.Args[1] 8589 if v_1.Op != OpConst16 { 8590 break 8591 } 8592 d := v_1.AuxInt 8593 v.reset(OpConstBool) 8594 v.AuxInt = b2i(c >= d) 8595 return true 8596 } 8597 return false 8598 } 8599 func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { 8600 // match: (Geq16U (Const16 [c]) (Const16 [d])) 8601 // cond: 8602 // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) 8603 for { 8604 _ = v.Args[1] 8605 v_0 := v.Args[0] 8606 if v_0.Op != OpConst16 { 8607 break 8608 } 8609 c := v_0.AuxInt 8610 v_1 := v.Args[1] 8611 if v_1.Op != OpConst16 { 8612 break 8613 } 8614 d := v_1.AuxInt 8615 v.reset(OpConstBool) 8616 v.AuxInt = b2i(uint16(c) >= uint16(d)) 8617 return true 8618 } 8619 return false 8620 } 8621 func rewriteValuegeneric_OpGeq32_0(v *Value) bool { 8622 // match: (Geq32 (Const32 [c]) (Const32 [d])) 8623 // cond: 8624 // result: (ConstBool [b2i(c >= d)]) 8625 for { 8626 _ = v.Args[1] 8627 v_0 := v.Args[0] 8628 if v_0.Op != OpConst32 { 8629 break 8630 } 8631 c := v_0.AuxInt 8632 v_1 := v.Args[1] 8633 if v_1.Op != OpConst32 { 8634 break 8635 } 8636 d := v_1.AuxInt 8637 v.reset(OpConstBool) 8638 v.AuxInt = b2i(c >= d) 8639 return true 8640 } 8641 return false 8642 } 8643 func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { 8644 // match: (Geq32U (Const32 [c]) (Const32 [d])) 8645 // cond: 8646 // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) 8647 for { 8648 _ = v.Args[1] 8649 v_0 := v.Args[0] 8650 if v_0.Op != OpConst32 { 8651 break 8652 } 8653 c := v_0.AuxInt 8654 v_1 := v.Args[1] 8655 if v_1.Op != OpConst32 { 8656 break 8657 } 8658 d := v_1.AuxInt 8659 v.reset(OpConstBool) 8660 v.AuxInt = b2i(uint32(c) >= uint32(d)) 8661 return true 8662 } 8663 return false 8664 } 8665 func rewriteValuegeneric_OpGeq64_0(v *Value) bool { 8666 // match: (Geq64 (Const64 [c]) (Const64 [d])) 8667 // cond: 8668 // result: (ConstBool [b2i(c >= d)]) 8669 for { 8670 _ = v.Args[1] 8671 v_0 := v.Args[0] 8672 if v_0.Op != OpConst64 { 8673 break 8674 } 8675 c := v_0.AuxInt 8676 v_1 := v.Args[1] 8677 if v_1.Op != OpConst64 { 8678 break 8679 } 8680 d := v_1.AuxInt 8681 v.reset(OpConstBool) 8682 v.AuxInt = b2i(c >= d) 8683 return true 8684 } 8685 return false 8686 } 8687 func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { 8688 // match: (Geq64U (Const64 [c]) (Const64 [d])) 8689 // cond: 8690 // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) 8691 for { 8692 _ = v.Args[1] 8693 v_0 := v.Args[0] 8694 if v_0.Op != OpConst64 { 8695 break 8696 } 8697 c := v_0.AuxInt 8698 v_1 := v.Args[1] 8699 if v_1.Op != OpConst64 { 8700 break 8701 } 8702 d := v_1.AuxInt 8703 v.reset(OpConstBool) 8704 v.AuxInt = b2i(uint64(c) >= uint64(d)) 8705 return true 8706 } 8707 return false 8708 } 8709 func rewriteValuegeneric_OpGeq8_0(v *Value) bool { 8710 // match: (Geq8 (Const8 [c]) (Const8 [d])) 8711 // cond: 8712 // result: (ConstBool [b2i(c >= d)]) 8713 for { 8714 _ = v.Args[1] 8715 v_0 := v.Args[0] 8716 if v_0.Op != OpConst8 { 8717 break 8718 } 8719 c := v_0.AuxInt 8720 v_1 := v.Args[1] 8721 if v_1.Op != OpConst8 { 8722 break 8723 } 8724 d := v_1.AuxInt 8725 v.reset(OpConstBool) 8726 v.AuxInt = b2i(c >= d) 8727 return true 8728 } 8729 return false 8730 } 8731 func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { 8732 // match: (Geq8U (Const8 [c]) (Const8 [d])) 8733 // cond: 8734 // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) 8735 for { 8736 _ = v.Args[1] 8737 v_0 := v.Args[0] 8738 if v_0.Op != OpConst8 { 8739 break 8740 } 8741 c := v_0.AuxInt 8742 v_1 := v.Args[1] 8743 if v_1.Op != OpConst8 { 8744 break 8745 } 8746 d := v_1.AuxInt 8747 v.reset(OpConstBool) 8748 v.AuxInt = b2i(uint8(c) >= uint8(d)) 8749 return true 8750 } 8751 return false 8752 } 8753 func rewriteValuegeneric_OpGreater16_0(v *Value) bool { 8754 // match: (Greater16 (Const16 [c]) (Const16 [d])) 8755 // cond: 8756 // result: (ConstBool [b2i(c > d)]) 8757 for { 8758 _ = v.Args[1] 8759 v_0 := v.Args[0] 8760 if v_0.Op != OpConst16 { 8761 break 8762 } 8763 c := v_0.AuxInt 8764 v_1 := v.Args[1] 8765 if v_1.Op != OpConst16 { 8766 break 8767 } 8768 d := v_1.AuxInt 8769 v.reset(OpConstBool) 8770 v.AuxInt = b2i(c > d) 8771 return true 8772 } 8773 return false 8774 } 8775 func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { 8776 // match: (Greater16U (Const16 [c]) (Const16 [d])) 8777 // cond: 8778 // result: (ConstBool [b2i(uint16(c) > uint16(d))]) 8779 for { 8780 _ = v.Args[1] 8781 v_0 := v.Args[0] 8782 if v_0.Op != OpConst16 { 8783 break 8784 } 8785 c := v_0.AuxInt 8786 v_1 := v.Args[1] 8787 if v_1.Op != OpConst16 { 8788 break 8789 } 8790 d := v_1.AuxInt 8791 v.reset(OpConstBool) 8792 v.AuxInt = b2i(uint16(c) > uint16(d)) 8793 return true 8794 } 8795 return false 8796 } 8797 func rewriteValuegeneric_OpGreater32_0(v *Value) bool { 8798 // match: (Greater32 (Const32 [c]) (Const32 [d])) 8799 // cond: 8800 // result: (ConstBool [b2i(c > d)]) 8801 for { 8802 _ = v.Args[1] 8803 v_0 := v.Args[0] 8804 if v_0.Op != OpConst32 { 8805 break 8806 } 8807 c := v_0.AuxInt 8808 v_1 := v.Args[1] 8809 if v_1.Op != OpConst32 { 8810 break 8811 } 8812 d := v_1.AuxInt 8813 v.reset(OpConstBool) 8814 v.AuxInt = b2i(c > d) 8815 return true 8816 } 8817 return false 8818 } 8819 func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { 8820 // match: (Greater32U (Const32 [c]) (Const32 [d])) 8821 // cond: 8822 // result: (ConstBool [b2i(uint32(c) > uint32(d))]) 8823 for { 8824 _ = v.Args[1] 8825 v_0 := v.Args[0] 8826 if v_0.Op != OpConst32 { 8827 break 8828 } 8829 c := v_0.AuxInt 8830 v_1 := v.Args[1] 8831 if v_1.Op != OpConst32 { 8832 break 8833 } 8834 d := v_1.AuxInt 8835 v.reset(OpConstBool) 8836 v.AuxInt = b2i(uint32(c) > uint32(d)) 8837 return true 8838 } 8839 return false 8840 } 8841 func rewriteValuegeneric_OpGreater64_0(v *Value) bool { 8842 // match: (Greater64 (Const64 [c]) (Const64 [d])) 8843 // cond: 8844 // result: (ConstBool [b2i(c > d)]) 8845 for { 8846 _ = v.Args[1] 8847 v_0 := v.Args[0] 8848 if v_0.Op != OpConst64 { 8849 break 8850 } 8851 c := v_0.AuxInt 8852 v_1 := v.Args[1] 8853 if v_1.Op != OpConst64 { 8854 break 8855 } 8856 d := v_1.AuxInt 8857 v.reset(OpConstBool) 8858 v.AuxInt = b2i(c > d) 8859 return true 8860 } 8861 return false 8862 } 8863 func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { 8864 // match: (Greater64U (Const64 [c]) (Const64 [d])) 8865 // cond: 8866 // result: (ConstBool [b2i(uint64(c) > uint64(d))]) 8867 for { 8868 _ = v.Args[1] 8869 v_0 := v.Args[0] 8870 if v_0.Op != OpConst64 { 8871 break 8872 } 8873 c := v_0.AuxInt 8874 v_1 := v.Args[1] 8875 if v_1.Op != OpConst64 { 8876 break 8877 } 8878 d := v_1.AuxInt 8879 v.reset(OpConstBool) 8880 v.AuxInt = b2i(uint64(c) > uint64(d)) 8881 return true 8882 } 8883 return false 8884 } 8885 func rewriteValuegeneric_OpGreater8_0(v *Value) bool { 8886 // match: (Greater8 (Const8 [c]) (Const8 [d])) 8887 // cond: 8888 // result: (ConstBool [b2i(c > d)]) 8889 for { 8890 _ = v.Args[1] 8891 v_0 := v.Args[0] 8892 if v_0.Op != OpConst8 { 8893 break 8894 } 8895 c := v_0.AuxInt 8896 v_1 := v.Args[1] 8897 if v_1.Op != OpConst8 { 8898 break 8899 } 8900 d := v_1.AuxInt 8901 v.reset(OpConstBool) 8902 v.AuxInt = b2i(c > d) 8903 return true 8904 } 8905 return false 8906 } 8907 func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { 8908 // match: (Greater8U (Const8 [c]) (Const8 [d])) 8909 // cond: 8910 // result: (ConstBool [b2i(uint8(c) > uint8(d))]) 8911 for { 8912 _ = v.Args[1] 8913 v_0 := v.Args[0] 8914 if v_0.Op != OpConst8 { 8915 break 8916 } 8917 c := v_0.AuxInt 8918 v_1 := v.Args[1] 8919 if v_1.Op != OpConst8 { 8920 break 8921 } 8922 d := v_1.AuxInt 8923 v.reset(OpConstBool) 8924 v.AuxInt = b2i(uint8(c) > uint8(d)) 8925 return true 8926 } 8927 return false 8928 } 8929 func rewriteValuegeneric_OpIMake_0(v *Value) bool { 8930 // match: (IMake typ (StructMake1 val)) 8931 // cond: 8932 // result: (IMake typ val) 8933 for { 8934 _ = v.Args[1] 8935 typ := v.Args[0] 8936 v_1 := v.Args[1] 8937 if v_1.Op != OpStructMake1 { 8938 break 8939 } 8940 val := v_1.Args[0] 8941 v.reset(OpIMake) 8942 v.AddArg(typ) 8943 v.AddArg(val) 8944 return true 8945 } 8946 // match: (IMake typ (ArrayMake1 val)) 8947 // cond: 8948 // result: (IMake typ val) 8949 for { 8950 _ = v.Args[1] 8951 typ := v.Args[0] 8952 v_1 := v.Args[1] 8953 if v_1.Op != OpArrayMake1 { 8954 break 8955 } 8956 val := v_1.Args[0] 8957 v.reset(OpIMake) 8958 v.AddArg(typ) 8959 v.AddArg(val) 8960 return true 8961 } 8962 return false 8963 } 8964 func rewriteValuegeneric_OpInterCall_0(v *Value) bool { 8965 // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) 8966 // cond: devirt(v, itab, off) != nil 8967 // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) 8968 for { 8969 argsize := v.AuxInt 8970 _ = v.Args[1] 8971 v_0 := v.Args[0] 8972 if v_0.Op != OpLoad { 8973 break 8974 } 8975 _ = v_0.Args[1] 8976 v_0_0 := v_0.Args[0] 8977 if v_0_0.Op != OpOffPtr { 8978 break 8979 } 8980 off := v_0_0.AuxInt 8981 v_0_0_0 := v_0_0.Args[0] 8982 if v_0_0_0.Op != OpITab { 8983 break 8984 } 8985 v_0_0_0_0 := v_0_0_0.Args[0] 8986 if v_0_0_0_0.Op != OpIMake { 8987 break 8988 } 8989 _ = v_0_0_0_0.Args[1] 8990 v_0_0_0_0_0 := v_0_0_0_0.Args[0] 8991 if v_0_0_0_0_0.Op != OpAddr { 8992 break 8993 } 8994 itab := v_0_0_0_0_0.Aux 8995 v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] 8996 if v_0_0_0_0_0_0.Op != OpSB { 8997 break 8998 } 8999 mem := v.Args[1] 9000 if !(devirt(v, itab, off) != nil) { 9001 break 9002 } 9003 v.reset(OpStaticCall) 9004 v.AuxInt = argsize 9005 v.Aux = devirt(v, itab, off) 9006 v.AddArg(mem) 9007 return true 9008 } 9009 return false 9010 } 9011 func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { 9012 // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) 9013 // cond: (1 << 8) <= c 9014 // result: (ConstBool [1]) 9015 for { 9016 _ = v.Args[1] 9017 v_0 := v.Args[0] 9018 if v_0.Op != OpZeroExt8to32 { 9019 break 9020 } 9021 v_1 := v.Args[1] 9022 if v_1.Op != OpConst32 { 9023 break 9024 } 9025 c := v_1.AuxInt 9026 if !((1 << 8) <= c) { 9027 break 9028 } 9029 v.reset(OpConstBool) 9030 v.AuxInt = 1 9031 return true 9032 } 9033 // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) 9034 // cond: (1 << 8) <= c 9035 // result: (ConstBool [1]) 9036 for { 9037 _ = v.Args[1] 9038 v_0 := v.Args[0] 9039 if v_0.Op != OpZeroExt8to64 { 9040 break 9041 } 9042 v_1 := v.Args[1] 9043 if v_1.Op != OpConst64 { 9044 break 9045 } 9046 c := v_1.AuxInt 9047 if !((1 << 8) <= c) { 9048 break 9049 } 9050 v.reset(OpConstBool) 9051 v.AuxInt = 1 9052 return true 9053 } 9054 // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) 9055 // cond: (1 << 16) <= c 9056 // result: (ConstBool [1]) 9057 for { 9058 _ = v.Args[1] 9059 v_0 := v.Args[0] 9060 if v_0.Op != OpZeroExt16to32 { 9061 break 9062 } 9063 v_1 := v.Args[1] 9064 if v_1.Op != OpConst32 { 9065 break 9066 } 9067 c := v_1.AuxInt 9068 if !((1 << 16) <= c) { 9069 break 9070 } 9071 v.reset(OpConstBool) 9072 v.AuxInt = 1 9073 return true 9074 } 9075 // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) 9076 // cond: (1 << 16) <= c 9077 // result: (ConstBool [1]) 9078 for { 9079 _ = v.Args[1] 9080 v_0 := v.Args[0] 9081 if v_0.Op != OpZeroExt16to64 { 9082 break 9083 } 9084 v_1 := v.Args[1] 9085 if v_1.Op != OpConst64 { 9086 break 9087 } 9088 c := v_1.AuxInt 9089 if !((1 << 16) <= c) { 9090 break 9091 } 9092 v.reset(OpConstBool) 9093 v.AuxInt = 1 9094 return true 9095 } 9096 // match: (IsInBounds x x) 9097 // cond: 9098 // result: (ConstBool [0]) 9099 for { 9100 _ = v.Args[1] 9101 x := v.Args[0] 9102 if x != v.Args[1] { 9103 break 9104 } 9105 v.reset(OpConstBool) 9106 v.AuxInt = 0 9107 return true 9108 } 9109 // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) 9110 // cond: 0 <= c && c < d 9111 // result: (ConstBool [1]) 9112 for { 9113 _ = v.Args[1] 9114 v_0 := v.Args[0] 9115 if v_0.Op != OpAnd8 { 9116 break 9117 } 9118 _ = v_0.Args[1] 9119 v_0_0 := v_0.Args[0] 9120 if v_0_0.Op != OpConst8 { 9121 break 9122 } 9123 c := v_0_0.AuxInt 9124 v_1 := v.Args[1] 9125 if v_1.Op != OpConst8 { 9126 break 9127 } 9128 d := v_1.AuxInt 9129 if !(0 <= c && c < d) { 9130 break 9131 } 9132 v.reset(OpConstBool) 9133 v.AuxInt = 1 9134 return true 9135 } 9136 // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) 9137 // cond: 0 <= c && c < d 9138 // result: (ConstBool [1]) 9139 for { 9140 _ = v.Args[1] 9141 v_0 := v.Args[0] 9142 if v_0.Op != OpAnd8 { 9143 break 9144 } 9145 _ = v_0.Args[1] 9146 v_0_1 := v_0.Args[1] 9147 if v_0_1.Op != OpConst8 { 9148 break 9149 } 9150 c := v_0_1.AuxInt 9151 v_1 := v.Args[1] 9152 if v_1.Op != OpConst8 { 9153 break 9154 } 9155 d := v_1.AuxInt 9156 if !(0 <= c && c < d) { 9157 break 9158 } 9159 v.reset(OpConstBool) 9160 v.AuxInt = 1 9161 return true 9162 } 9163 // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) 9164 // cond: 0 <= c && c < d 9165 // result: (ConstBool [1]) 9166 for { 9167 _ = v.Args[1] 9168 v_0 := v.Args[0] 9169 if v_0.Op != OpZeroExt8to16 { 9170 break 9171 } 9172 v_0_0 := v_0.Args[0] 9173 if v_0_0.Op != OpAnd8 { 9174 break 9175 } 9176 _ = v_0_0.Args[1] 9177 v_0_0_0 := v_0_0.Args[0] 9178 if v_0_0_0.Op != OpConst8 { 9179 break 9180 } 9181 c := v_0_0_0.AuxInt 9182 v_1 := v.Args[1] 9183 if v_1.Op != OpConst16 { 9184 break 9185 } 9186 d := v_1.AuxInt 9187 if !(0 <= c && c < d) { 9188 break 9189 } 9190 v.reset(OpConstBool) 9191 v.AuxInt = 1 9192 return true 9193 } 9194 // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) 9195 // cond: 0 <= c && c < d 9196 // result: (ConstBool [1]) 9197 for { 9198 _ = v.Args[1] 9199 v_0 := v.Args[0] 9200 if v_0.Op != OpZeroExt8to16 { 9201 break 9202 } 9203 v_0_0 := v_0.Args[0] 9204 if v_0_0.Op != OpAnd8 { 9205 break 9206 } 9207 _ = v_0_0.Args[1] 9208 v_0_0_1 := v_0_0.Args[1] 9209 if v_0_0_1.Op != OpConst8 { 9210 break 9211 } 9212 c := v_0_0_1.AuxInt 9213 v_1 := v.Args[1] 9214 if v_1.Op != OpConst16 { 9215 break 9216 } 9217 d := v_1.AuxInt 9218 if !(0 <= c && c < d) { 9219 break 9220 } 9221 v.reset(OpConstBool) 9222 v.AuxInt = 1 9223 return true 9224 } 9225 // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) 9226 // cond: 0 <= c && c < d 9227 // result: (ConstBool [1]) 9228 for { 9229 _ = v.Args[1] 9230 v_0 := v.Args[0] 9231 if v_0.Op != OpZeroExt8to32 { 9232 break 9233 } 9234 v_0_0 := v_0.Args[0] 9235 if v_0_0.Op != OpAnd8 { 9236 break 9237 } 9238 _ = v_0_0.Args[1] 9239 v_0_0_0 := v_0_0.Args[0] 9240 if v_0_0_0.Op != OpConst8 { 9241 break 9242 } 9243 c := v_0_0_0.AuxInt 9244 v_1 := v.Args[1] 9245 if v_1.Op != OpConst32 { 9246 break 9247 } 9248 d := v_1.AuxInt 9249 if !(0 <= c && c < d) { 9250 break 9251 } 9252 v.reset(OpConstBool) 9253 v.AuxInt = 1 9254 return true 9255 } 9256 return false 9257 } 9258 func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { 9259 // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) 9260 // cond: 0 <= c && c < d 9261 // result: (ConstBool [1]) 9262 for { 9263 _ = v.Args[1] 9264 v_0 := v.Args[0] 9265 if v_0.Op != OpZeroExt8to32 { 9266 break 9267 } 9268 v_0_0 := v_0.Args[0] 9269 if v_0_0.Op != OpAnd8 { 9270 break 9271 } 9272 _ = v_0_0.Args[1] 9273 v_0_0_1 := v_0_0.Args[1] 9274 if v_0_0_1.Op != OpConst8 { 9275 break 9276 } 9277 c := v_0_0_1.AuxInt 9278 v_1 := v.Args[1] 9279 if v_1.Op != OpConst32 { 9280 break 9281 } 9282 d := v_1.AuxInt 9283 if !(0 <= c && c < d) { 9284 break 9285 } 9286 v.reset(OpConstBool) 9287 v.AuxInt = 1 9288 return true 9289 } 9290 // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) 9291 // cond: 0 <= c && c < d 9292 // result: (ConstBool [1]) 9293 for { 9294 _ = v.Args[1] 9295 v_0 := v.Args[0] 9296 if v_0.Op != OpZeroExt8to64 { 9297 break 9298 } 9299 v_0_0 := v_0.Args[0] 9300 if v_0_0.Op != OpAnd8 { 9301 break 9302 } 9303 _ = v_0_0.Args[1] 9304 v_0_0_0 := v_0_0.Args[0] 9305 if v_0_0_0.Op != OpConst8 { 9306 break 9307 } 9308 c := v_0_0_0.AuxInt 9309 v_1 := v.Args[1] 9310 if v_1.Op != OpConst64 { 9311 break 9312 } 9313 d := v_1.AuxInt 9314 if !(0 <= c && c < d) { 9315 break 9316 } 9317 v.reset(OpConstBool) 9318 v.AuxInt = 1 9319 return true 9320 } 9321 // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) 9322 // cond: 0 <= c && c < d 9323 // result: (ConstBool [1]) 9324 for { 9325 _ = v.Args[1] 9326 v_0 := v.Args[0] 9327 if v_0.Op != OpZeroExt8to64 { 9328 break 9329 } 9330 v_0_0 := v_0.Args[0] 9331 if v_0_0.Op != OpAnd8 { 9332 break 9333 } 9334 _ = v_0_0.Args[1] 9335 v_0_0_1 := v_0_0.Args[1] 9336 if v_0_0_1.Op != OpConst8 { 9337 break 9338 } 9339 c := v_0_0_1.AuxInt 9340 v_1 := v.Args[1] 9341 if v_1.Op != OpConst64 { 9342 break 9343 } 9344 d := v_1.AuxInt 9345 if !(0 <= c && c < d) { 9346 break 9347 } 9348 v.reset(OpConstBool) 9349 v.AuxInt = 1 9350 return true 9351 } 9352 // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) 9353 // cond: 0 <= c && c < d 9354 // result: (ConstBool [1]) 9355 for { 9356 _ = v.Args[1] 9357 v_0 := v.Args[0] 9358 if v_0.Op != OpAnd16 { 9359 break 9360 } 9361 _ = v_0.Args[1] 9362 v_0_0 := v_0.Args[0] 9363 if v_0_0.Op != OpConst16 { 9364 break 9365 } 9366 c := v_0_0.AuxInt 9367 v_1 := v.Args[1] 9368 if v_1.Op != OpConst16 { 9369 break 9370 } 9371 d := v_1.AuxInt 9372 if !(0 <= c && c < d) { 9373 break 9374 } 9375 v.reset(OpConstBool) 9376 v.AuxInt = 1 9377 return true 9378 } 9379 // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) 9380 // cond: 0 <= c && c < d 9381 // result: (ConstBool [1]) 9382 for { 9383 _ = v.Args[1] 9384 v_0 := v.Args[0] 9385 if v_0.Op != OpAnd16 { 9386 break 9387 } 9388 _ = v_0.Args[1] 9389 v_0_1 := v_0.Args[1] 9390 if v_0_1.Op != OpConst16 { 9391 break 9392 } 9393 c := v_0_1.AuxInt 9394 v_1 := v.Args[1] 9395 if v_1.Op != OpConst16 { 9396 break 9397 } 9398 d := v_1.AuxInt 9399 if !(0 <= c && c < d) { 9400 break 9401 } 9402 v.reset(OpConstBool) 9403 v.AuxInt = 1 9404 return true 9405 } 9406 // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) 9407 // cond: 0 <= c && c < d 9408 // result: (ConstBool [1]) 9409 for { 9410 _ = v.Args[1] 9411 v_0 := v.Args[0] 9412 if v_0.Op != OpZeroExt16to32 { 9413 break 9414 } 9415 v_0_0 := v_0.Args[0] 9416 if v_0_0.Op != OpAnd16 { 9417 break 9418 } 9419 _ = v_0_0.Args[1] 9420 v_0_0_0 := v_0_0.Args[0] 9421 if v_0_0_0.Op != OpConst16 { 9422 break 9423 } 9424 c := v_0_0_0.AuxInt 9425 v_1 := v.Args[1] 9426 if v_1.Op != OpConst32 { 9427 break 9428 } 9429 d := v_1.AuxInt 9430 if !(0 <= c && c < d) { 9431 break 9432 } 9433 v.reset(OpConstBool) 9434 v.AuxInt = 1 9435 return true 9436 } 9437 // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) 9438 // cond: 0 <= c && c < d 9439 // result: (ConstBool [1]) 9440 for { 9441 _ = v.Args[1] 9442 v_0 := v.Args[0] 9443 if v_0.Op != OpZeroExt16to32 { 9444 break 9445 } 9446 v_0_0 := v_0.Args[0] 9447 if v_0_0.Op != OpAnd16 { 9448 break 9449 } 9450 _ = v_0_0.Args[1] 9451 v_0_0_1 := v_0_0.Args[1] 9452 if v_0_0_1.Op != OpConst16 { 9453 break 9454 } 9455 c := v_0_0_1.AuxInt 9456 v_1 := v.Args[1] 9457 if v_1.Op != OpConst32 { 9458 break 9459 } 9460 d := v_1.AuxInt 9461 if !(0 <= c && c < d) { 9462 break 9463 } 9464 v.reset(OpConstBool) 9465 v.AuxInt = 1 9466 return true 9467 } 9468 // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) 9469 // cond: 0 <= c && c < d 9470 // result: (ConstBool [1]) 9471 for { 9472 _ = v.Args[1] 9473 v_0 := v.Args[0] 9474 if v_0.Op != OpZeroExt16to64 { 9475 break 9476 } 9477 v_0_0 := v_0.Args[0] 9478 if v_0_0.Op != OpAnd16 { 9479 break 9480 } 9481 _ = v_0_0.Args[1] 9482 v_0_0_0 := v_0_0.Args[0] 9483 if v_0_0_0.Op != OpConst16 { 9484 break 9485 } 9486 c := v_0_0_0.AuxInt 9487 v_1 := v.Args[1] 9488 if v_1.Op != OpConst64 { 9489 break 9490 } 9491 d := v_1.AuxInt 9492 if !(0 <= c && c < d) { 9493 break 9494 } 9495 v.reset(OpConstBool) 9496 v.AuxInt = 1 9497 return true 9498 } 9499 // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) 9500 // cond: 0 <= c && c < d 9501 // result: (ConstBool [1]) 9502 for { 9503 _ = v.Args[1] 9504 v_0 := v.Args[0] 9505 if v_0.Op != OpZeroExt16to64 { 9506 break 9507 } 9508 v_0_0 := v_0.Args[0] 9509 if v_0_0.Op != OpAnd16 { 9510 break 9511 } 9512 _ = v_0_0.Args[1] 9513 v_0_0_1 := v_0_0.Args[1] 9514 if v_0_0_1.Op != OpConst16 { 9515 break 9516 } 9517 c := v_0_0_1.AuxInt 9518 v_1 := v.Args[1] 9519 if v_1.Op != OpConst64 { 9520 break 9521 } 9522 d := v_1.AuxInt 9523 if !(0 <= c && c < d) { 9524 break 9525 } 9526 v.reset(OpConstBool) 9527 v.AuxInt = 1 9528 return true 9529 } 9530 // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) 9531 // cond: 0 <= c && c < d 9532 // result: (ConstBool [1]) 9533 for { 9534 _ = v.Args[1] 9535 v_0 := v.Args[0] 9536 if v_0.Op != OpAnd32 { 9537 break 9538 } 9539 _ = v_0.Args[1] 9540 v_0_0 := v_0.Args[0] 9541 if v_0_0.Op != OpConst32 { 9542 break 9543 } 9544 c := v_0_0.AuxInt 9545 v_1 := v.Args[1] 9546 if v_1.Op != OpConst32 { 9547 break 9548 } 9549 d := v_1.AuxInt 9550 if !(0 <= c && c < d) { 9551 break 9552 } 9553 v.reset(OpConstBool) 9554 v.AuxInt = 1 9555 return true 9556 } 9557 return false 9558 } 9559 func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { 9560 // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) 9561 // cond: 0 <= c && c < d 9562 // result: (ConstBool [1]) 9563 for { 9564 _ = v.Args[1] 9565 v_0 := v.Args[0] 9566 if v_0.Op != OpAnd32 { 9567 break 9568 } 9569 _ = v_0.Args[1] 9570 v_0_1 := v_0.Args[1] 9571 if v_0_1.Op != OpConst32 { 9572 break 9573 } 9574 c := v_0_1.AuxInt 9575 v_1 := v.Args[1] 9576 if v_1.Op != OpConst32 { 9577 break 9578 } 9579 d := v_1.AuxInt 9580 if !(0 <= c && c < d) { 9581 break 9582 } 9583 v.reset(OpConstBool) 9584 v.AuxInt = 1 9585 return true 9586 } 9587 // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) 9588 // cond: 0 <= c && c < d 9589 // result: (ConstBool [1]) 9590 for { 9591 _ = v.Args[1] 9592 v_0 := v.Args[0] 9593 if v_0.Op != OpZeroExt32to64 { 9594 break 9595 } 9596 v_0_0 := v_0.Args[0] 9597 if v_0_0.Op != OpAnd32 { 9598 break 9599 } 9600 _ = v_0_0.Args[1] 9601 v_0_0_0 := v_0_0.Args[0] 9602 if v_0_0_0.Op != OpConst32 { 9603 break 9604 } 9605 c := v_0_0_0.AuxInt 9606 v_1 := v.Args[1] 9607 if v_1.Op != OpConst64 { 9608 break 9609 } 9610 d := v_1.AuxInt 9611 if !(0 <= c && c < d) { 9612 break 9613 } 9614 v.reset(OpConstBool) 9615 v.AuxInt = 1 9616 return true 9617 } 9618 // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) 9619 // cond: 0 <= c && c < d 9620 // result: (ConstBool [1]) 9621 for { 9622 _ = v.Args[1] 9623 v_0 := v.Args[0] 9624 if v_0.Op != OpZeroExt32to64 { 9625 break 9626 } 9627 v_0_0 := v_0.Args[0] 9628 if v_0_0.Op != OpAnd32 { 9629 break 9630 } 9631 _ = v_0_0.Args[1] 9632 v_0_0_1 := v_0_0.Args[1] 9633 if v_0_0_1.Op != OpConst32 { 9634 break 9635 } 9636 c := v_0_0_1.AuxInt 9637 v_1 := v.Args[1] 9638 if v_1.Op != OpConst64 { 9639 break 9640 } 9641 d := v_1.AuxInt 9642 if !(0 <= c && c < d) { 9643 break 9644 } 9645 v.reset(OpConstBool) 9646 v.AuxInt = 1 9647 return true 9648 } 9649 // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) 9650 // cond: 0 <= c && c < d 9651 // result: (ConstBool [1]) 9652 for { 9653 _ = v.Args[1] 9654 v_0 := v.Args[0] 9655 if v_0.Op != OpAnd64 { 9656 break 9657 } 9658 _ = v_0.Args[1] 9659 v_0_0 := v_0.Args[0] 9660 if v_0_0.Op != OpConst64 { 9661 break 9662 } 9663 c := v_0_0.AuxInt 9664 v_1 := v.Args[1] 9665 if v_1.Op != OpConst64 { 9666 break 9667 } 9668 d := v_1.AuxInt 9669 if !(0 <= c && c < d) { 9670 break 9671 } 9672 v.reset(OpConstBool) 9673 v.AuxInt = 1 9674 return true 9675 } 9676 // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) 9677 // cond: 0 <= c && c < d 9678 // result: (ConstBool [1]) 9679 for { 9680 _ = v.Args[1] 9681 v_0 := v.Args[0] 9682 if v_0.Op != OpAnd64 { 9683 break 9684 } 9685 _ = v_0.Args[1] 9686 v_0_1 := v_0.Args[1] 9687 if v_0_1.Op != OpConst64 { 9688 break 9689 } 9690 c := v_0_1.AuxInt 9691 v_1 := v.Args[1] 9692 if v_1.Op != OpConst64 { 9693 break 9694 } 9695 d := v_1.AuxInt 9696 if !(0 <= c && c < d) { 9697 break 9698 } 9699 v.reset(OpConstBool) 9700 v.AuxInt = 1 9701 return true 9702 } 9703 // match: (IsInBounds (Const32 [c]) (Const32 [d])) 9704 // cond: 9705 // result: (ConstBool [b2i(0 <= c && c < d)]) 9706 for { 9707 _ = v.Args[1] 9708 v_0 := v.Args[0] 9709 if v_0.Op != OpConst32 { 9710 break 9711 } 9712 c := v_0.AuxInt 9713 v_1 := v.Args[1] 9714 if v_1.Op != OpConst32 { 9715 break 9716 } 9717 d := v_1.AuxInt 9718 v.reset(OpConstBool) 9719 v.AuxInt = b2i(0 <= c && c < d) 9720 return true 9721 } 9722 // match: (IsInBounds (Const64 [c]) (Const64 [d])) 9723 // cond: 9724 // result: (ConstBool [b2i(0 <= c && c < d)]) 9725 for { 9726 _ = v.Args[1] 9727 v_0 := v.Args[0] 9728 if v_0.Op != OpConst64 { 9729 break 9730 } 9731 c := v_0.AuxInt 9732 v_1 := v.Args[1] 9733 if v_1.Op != OpConst64 { 9734 break 9735 } 9736 d := v_1.AuxInt 9737 v.reset(OpConstBool) 9738 v.AuxInt = b2i(0 <= c && c < d) 9739 return true 9740 } 9741 // match: (IsInBounds (Mod32u _ y) y) 9742 // cond: 9743 // result: (ConstBool [1]) 9744 for { 9745 _ = v.Args[1] 9746 v_0 := v.Args[0] 9747 if v_0.Op != OpMod32u { 9748 break 9749 } 9750 _ = v_0.Args[1] 9751 y := v_0.Args[1] 9752 if y != v.Args[1] { 9753 break 9754 } 9755 v.reset(OpConstBool) 9756 v.AuxInt = 1 9757 return true 9758 } 9759 // match: (IsInBounds (Mod64u _ y) y) 9760 // cond: 9761 // result: (ConstBool [1]) 9762 for { 9763 _ = v.Args[1] 9764 v_0 := v.Args[0] 9765 if v_0.Op != OpMod64u { 9766 break 9767 } 9768 _ = v_0.Args[1] 9769 y := v_0.Args[1] 9770 if y != v.Args[1] { 9771 break 9772 } 9773 v.reset(OpConstBool) 9774 v.AuxInt = 1 9775 return true 9776 } 9777 return false 9778 } 9779 func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { 9780 // match: (IsNonNil (ConstNil)) 9781 // cond: 9782 // result: (ConstBool [0]) 9783 for { 9784 v_0 := v.Args[0] 9785 if v_0.Op != OpConstNil { 9786 break 9787 } 9788 v.reset(OpConstBool) 9789 v.AuxInt = 0 9790 return true 9791 } 9792 return false 9793 } 9794 func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { 9795 // match: (IsSliceInBounds x x) 9796 // cond: 9797 // result: (ConstBool [1]) 9798 for { 9799 _ = v.Args[1] 9800 x := v.Args[0] 9801 if x != v.Args[1] { 9802 break 9803 } 9804 v.reset(OpConstBool) 9805 v.AuxInt = 1 9806 return true 9807 } 9808 // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) 9809 // cond: 0 <= c && c <= d 9810 // result: (ConstBool [1]) 9811 for { 9812 _ = v.Args[1] 9813 v_0 := v.Args[0] 9814 if v_0.Op != OpAnd32 { 9815 break 9816 } 9817 _ = v_0.Args[1] 9818 v_0_0 := v_0.Args[0] 9819 if v_0_0.Op != OpConst32 { 9820 break 9821 } 9822 c := v_0_0.AuxInt 9823 v_1 := v.Args[1] 9824 if v_1.Op != OpConst32 { 9825 break 9826 } 9827 d := v_1.AuxInt 9828 if !(0 <= c && c <= d) { 9829 break 9830 } 9831 v.reset(OpConstBool) 9832 v.AuxInt = 1 9833 return true 9834 } 9835 // match: (IsSliceInBounds (And32 _ (Const32 [c])) (Const32 [d])) 9836 // cond: 0 <= c && c <= d 9837 // result: (ConstBool [1]) 9838 for { 9839 _ = v.Args[1] 9840 v_0 := v.Args[0] 9841 if v_0.Op != OpAnd32 { 9842 break 9843 } 9844 _ = v_0.Args[1] 9845 v_0_1 := v_0.Args[1] 9846 if v_0_1.Op != OpConst32 { 9847 break 9848 } 9849 c := v_0_1.AuxInt 9850 v_1 := v.Args[1] 9851 if v_1.Op != OpConst32 { 9852 break 9853 } 9854 d := v_1.AuxInt 9855 if !(0 <= c && c <= d) { 9856 break 9857 } 9858 v.reset(OpConstBool) 9859 v.AuxInt = 1 9860 return true 9861 } 9862 // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) 9863 // cond: 0 <= c && c <= d 9864 // result: (ConstBool [1]) 9865 for { 9866 _ = v.Args[1] 9867 v_0 := v.Args[0] 9868 if v_0.Op != OpAnd64 { 9869 break 9870 } 9871 _ = v_0.Args[1] 9872 v_0_0 := v_0.Args[0] 9873 if v_0_0.Op != OpConst64 { 9874 break 9875 } 9876 c := v_0_0.AuxInt 9877 v_1 := v.Args[1] 9878 if v_1.Op != OpConst64 { 9879 break 9880 } 9881 d := v_1.AuxInt 9882 if !(0 <= c && c <= d) { 9883 break 9884 } 9885 v.reset(OpConstBool) 9886 v.AuxInt = 1 9887 return true 9888 } 9889 // match: (IsSliceInBounds (And64 _ (Const64 [c])) (Const64 [d])) 9890 // cond: 0 <= c && c <= d 9891 // result: (ConstBool [1]) 9892 for { 9893 _ = v.Args[1] 9894 v_0 := v.Args[0] 9895 if v_0.Op != OpAnd64 { 9896 break 9897 } 9898 _ = v_0.Args[1] 9899 v_0_1 := v_0.Args[1] 9900 if v_0_1.Op != OpConst64 { 9901 break 9902 } 9903 c := v_0_1.AuxInt 9904 v_1 := v.Args[1] 9905 if v_1.Op != OpConst64 { 9906 break 9907 } 9908 d := v_1.AuxInt 9909 if !(0 <= c && c <= d) { 9910 break 9911 } 9912 v.reset(OpConstBool) 9913 v.AuxInt = 1 9914 return true 9915 } 9916 // match: (IsSliceInBounds (Const32 [0]) _) 9917 // cond: 9918 // result: (ConstBool [1]) 9919 for { 9920 _ = v.Args[1] 9921 v_0 := v.Args[0] 9922 if v_0.Op != OpConst32 { 9923 break 9924 } 9925 if v_0.AuxInt != 0 { 9926 break 9927 } 9928 v.reset(OpConstBool) 9929 v.AuxInt = 1 9930 return true 9931 } 9932 // match: (IsSliceInBounds (Const64 [0]) _) 9933 // cond: 9934 // result: (ConstBool [1]) 9935 for { 9936 _ = v.Args[1] 9937 v_0 := v.Args[0] 9938 if v_0.Op != OpConst64 { 9939 break 9940 } 9941 if v_0.AuxInt != 0 { 9942 break 9943 } 9944 v.reset(OpConstBool) 9945 v.AuxInt = 1 9946 return true 9947 } 9948 // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) 9949 // cond: 9950 // result: (ConstBool [b2i(0 <= c && c <= d)]) 9951 for { 9952 _ = v.Args[1] 9953 v_0 := v.Args[0] 9954 if v_0.Op != OpConst32 { 9955 break 9956 } 9957 c := v_0.AuxInt 9958 v_1 := v.Args[1] 9959 if v_1.Op != OpConst32 { 9960 break 9961 } 9962 d := v_1.AuxInt 9963 v.reset(OpConstBool) 9964 v.AuxInt = b2i(0 <= c && c <= d) 9965 return true 9966 } 9967 // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) 9968 // cond: 9969 // result: (ConstBool [b2i(0 <= c && c <= d)]) 9970 for { 9971 _ = v.Args[1] 9972 v_0 := v.Args[0] 9973 if v_0.Op != OpConst64 { 9974 break 9975 } 9976 c := v_0.AuxInt 9977 v_1 := v.Args[1] 9978 if v_1.Op != OpConst64 { 9979 break 9980 } 9981 d := v_1.AuxInt 9982 v.reset(OpConstBool) 9983 v.AuxInt = b2i(0 <= c && c <= d) 9984 return true 9985 } 9986 // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) 9987 // cond: 9988 // result: (ConstBool [1]) 9989 for { 9990 _ = v.Args[1] 9991 v_0 := v.Args[0] 9992 if v_0.Op != OpSliceLen { 9993 break 9994 } 9995 x := v_0.Args[0] 9996 v_1 := v.Args[1] 9997 if v_1.Op != OpSliceCap { 9998 break 9999 } 10000 if x != v_1.Args[0] { 10001 break 10002 } 10003 v.reset(OpConstBool) 10004 v.AuxInt = 1 10005 return true 10006 } 10007 return false 10008 } 10009 func rewriteValuegeneric_OpLeq16_0(v *Value) bool { 10010 // match: (Leq16 (Const16 [c]) (Const16 [d])) 10011 // cond: 10012 // result: (ConstBool [b2i(c <= d)]) 10013 for { 10014 _ = v.Args[1] 10015 v_0 := v.Args[0] 10016 if v_0.Op != OpConst16 { 10017 break 10018 } 10019 c := v_0.AuxInt 10020 v_1 := v.Args[1] 10021 if v_1.Op != OpConst16 { 10022 break 10023 } 10024 d := v_1.AuxInt 10025 v.reset(OpConstBool) 10026 v.AuxInt = b2i(c <= d) 10027 return true 10028 } 10029 return false 10030 } 10031 func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { 10032 // match: (Leq16U (Const16 [c]) (Const16 [d])) 10033 // cond: 10034 // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) 10035 for { 10036 _ = v.Args[1] 10037 v_0 := v.Args[0] 10038 if v_0.Op != OpConst16 { 10039 break 10040 } 10041 c := v_0.AuxInt 10042 v_1 := v.Args[1] 10043 if v_1.Op != OpConst16 { 10044 break 10045 } 10046 d := v_1.AuxInt 10047 v.reset(OpConstBool) 10048 v.AuxInt = b2i(uint16(c) <= uint16(d)) 10049 return true 10050 } 10051 return false 10052 } 10053 func rewriteValuegeneric_OpLeq32_0(v *Value) bool { 10054 // match: (Leq32 (Const32 [c]) (Const32 [d])) 10055 // cond: 10056 // result: (ConstBool [b2i(c <= d)]) 10057 for { 10058 _ = v.Args[1] 10059 v_0 := v.Args[0] 10060 if v_0.Op != OpConst32 { 10061 break 10062 } 10063 c := v_0.AuxInt 10064 v_1 := v.Args[1] 10065 if v_1.Op != OpConst32 { 10066 break 10067 } 10068 d := v_1.AuxInt 10069 v.reset(OpConstBool) 10070 v.AuxInt = b2i(c <= d) 10071 return true 10072 } 10073 return false 10074 } 10075 func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { 10076 // match: (Leq32U (Const32 [c]) (Const32 [d])) 10077 // cond: 10078 // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) 10079 for { 10080 _ = v.Args[1] 10081 v_0 := v.Args[0] 10082 if v_0.Op != OpConst32 { 10083 break 10084 } 10085 c := v_0.AuxInt 10086 v_1 := v.Args[1] 10087 if v_1.Op != OpConst32 { 10088 break 10089 } 10090 d := v_1.AuxInt 10091 v.reset(OpConstBool) 10092 v.AuxInt = b2i(uint32(c) <= uint32(d)) 10093 return true 10094 } 10095 return false 10096 } 10097 func rewriteValuegeneric_OpLeq64_0(v *Value) bool { 10098 // match: (Leq64 (Const64 [c]) (Const64 [d])) 10099 // cond: 10100 // result: (ConstBool [b2i(c <= d)]) 10101 for { 10102 _ = v.Args[1] 10103 v_0 := v.Args[0] 10104 if v_0.Op != OpConst64 { 10105 break 10106 } 10107 c := v_0.AuxInt 10108 v_1 := v.Args[1] 10109 if v_1.Op != OpConst64 { 10110 break 10111 } 10112 d := v_1.AuxInt 10113 v.reset(OpConstBool) 10114 v.AuxInt = b2i(c <= d) 10115 return true 10116 } 10117 return false 10118 } 10119 func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { 10120 // match: (Leq64U (Const64 [c]) (Const64 [d])) 10121 // cond: 10122 // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) 10123 for { 10124 _ = v.Args[1] 10125 v_0 := v.Args[0] 10126 if v_0.Op != OpConst64 { 10127 break 10128 } 10129 c := v_0.AuxInt 10130 v_1 := v.Args[1] 10131 if v_1.Op != OpConst64 { 10132 break 10133 } 10134 d := v_1.AuxInt 10135 v.reset(OpConstBool) 10136 v.AuxInt = b2i(uint64(c) <= uint64(d)) 10137 return true 10138 } 10139 return false 10140 } 10141 func rewriteValuegeneric_OpLeq8_0(v *Value) bool { 10142 // match: (Leq8 (Const8 [c]) (Const8 [d])) 10143 // cond: 10144 // result: (ConstBool [b2i(c <= d)]) 10145 for { 10146 _ = v.Args[1] 10147 v_0 := v.Args[0] 10148 if v_0.Op != OpConst8 { 10149 break 10150 } 10151 c := v_0.AuxInt 10152 v_1 := v.Args[1] 10153 if v_1.Op != OpConst8 { 10154 break 10155 } 10156 d := v_1.AuxInt 10157 v.reset(OpConstBool) 10158 v.AuxInt = b2i(c <= d) 10159 return true 10160 } 10161 return false 10162 } 10163 func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { 10164 // match: (Leq8U (Const8 [c]) (Const8 [d])) 10165 // cond: 10166 // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) 10167 for { 10168 _ = v.Args[1] 10169 v_0 := v.Args[0] 10170 if v_0.Op != OpConst8 { 10171 break 10172 } 10173 c := v_0.AuxInt 10174 v_1 := v.Args[1] 10175 if v_1.Op != OpConst8 { 10176 break 10177 } 10178 d := v_1.AuxInt 10179 v.reset(OpConstBool) 10180 v.AuxInt = b2i(uint8(c) <= uint8(d)) 10181 return true 10182 } 10183 return false 10184 } 10185 func rewriteValuegeneric_OpLess16_0(v *Value) bool { 10186 // match: (Less16 (Const16 [c]) (Const16 [d])) 10187 // cond: 10188 // result: (ConstBool [b2i(c < d)]) 10189 for { 10190 _ = v.Args[1] 10191 v_0 := v.Args[0] 10192 if v_0.Op != OpConst16 { 10193 break 10194 } 10195 c := v_0.AuxInt 10196 v_1 := v.Args[1] 10197 if v_1.Op != OpConst16 { 10198 break 10199 } 10200 d := v_1.AuxInt 10201 v.reset(OpConstBool) 10202 v.AuxInt = b2i(c < d) 10203 return true 10204 } 10205 return false 10206 } 10207 func rewriteValuegeneric_OpLess16U_0(v *Value) bool { 10208 // match: (Less16U (Const16 [c]) (Const16 [d])) 10209 // cond: 10210 // result: (ConstBool [b2i(uint16(c) < uint16(d))]) 10211 for { 10212 _ = v.Args[1] 10213 v_0 := v.Args[0] 10214 if v_0.Op != OpConst16 { 10215 break 10216 } 10217 c := v_0.AuxInt 10218 v_1 := v.Args[1] 10219 if v_1.Op != OpConst16 { 10220 break 10221 } 10222 d := v_1.AuxInt 10223 v.reset(OpConstBool) 10224 v.AuxInt = b2i(uint16(c) < uint16(d)) 10225 return true 10226 } 10227 return false 10228 } 10229 func rewriteValuegeneric_OpLess32_0(v *Value) bool { 10230 // match: (Less32 (Const32 [c]) (Const32 [d])) 10231 // cond: 10232 // result: (ConstBool [b2i(c < d)]) 10233 for { 10234 _ = v.Args[1] 10235 v_0 := v.Args[0] 10236 if v_0.Op != OpConst32 { 10237 break 10238 } 10239 c := v_0.AuxInt 10240 v_1 := v.Args[1] 10241 if v_1.Op != OpConst32 { 10242 break 10243 } 10244 d := v_1.AuxInt 10245 v.reset(OpConstBool) 10246 v.AuxInt = b2i(c < d) 10247 return true 10248 } 10249 return false 10250 } 10251 func rewriteValuegeneric_OpLess32U_0(v *Value) bool { 10252 // match: (Less32U (Const32 [c]) (Const32 [d])) 10253 // cond: 10254 // result: (ConstBool [b2i(uint32(c) < uint32(d))]) 10255 for { 10256 _ = v.Args[1] 10257 v_0 := v.Args[0] 10258 if v_0.Op != OpConst32 { 10259 break 10260 } 10261 c := v_0.AuxInt 10262 v_1 := v.Args[1] 10263 if v_1.Op != OpConst32 { 10264 break 10265 } 10266 d := v_1.AuxInt 10267 v.reset(OpConstBool) 10268 v.AuxInt = b2i(uint32(c) < uint32(d)) 10269 return true 10270 } 10271 return false 10272 } 10273 func rewriteValuegeneric_OpLess64_0(v *Value) bool { 10274 // match: (Less64 (Const64 [c]) (Const64 [d])) 10275 // cond: 10276 // result: (ConstBool [b2i(c < d)]) 10277 for { 10278 _ = v.Args[1] 10279 v_0 := v.Args[0] 10280 if v_0.Op != OpConst64 { 10281 break 10282 } 10283 c := v_0.AuxInt 10284 v_1 := v.Args[1] 10285 if v_1.Op != OpConst64 { 10286 break 10287 } 10288 d := v_1.AuxInt 10289 v.reset(OpConstBool) 10290 v.AuxInt = b2i(c < d) 10291 return true 10292 } 10293 return false 10294 } 10295 func rewriteValuegeneric_OpLess64U_0(v *Value) bool { 10296 // match: (Less64U (Const64 [c]) (Const64 [d])) 10297 // cond: 10298 // result: (ConstBool [b2i(uint64(c) < uint64(d))]) 10299 for { 10300 _ = v.Args[1] 10301 v_0 := v.Args[0] 10302 if v_0.Op != OpConst64 { 10303 break 10304 } 10305 c := v_0.AuxInt 10306 v_1 := v.Args[1] 10307 if v_1.Op != OpConst64 { 10308 break 10309 } 10310 d := v_1.AuxInt 10311 v.reset(OpConstBool) 10312 v.AuxInt = b2i(uint64(c) < uint64(d)) 10313 return true 10314 } 10315 return false 10316 } 10317 func rewriteValuegeneric_OpLess8_0(v *Value) bool { 10318 // match: (Less8 (Const8 [c]) (Const8 [d])) 10319 // cond: 10320 // result: (ConstBool [b2i(c < d)]) 10321 for { 10322 _ = v.Args[1] 10323 v_0 := v.Args[0] 10324 if v_0.Op != OpConst8 { 10325 break 10326 } 10327 c := v_0.AuxInt 10328 v_1 := v.Args[1] 10329 if v_1.Op != OpConst8 { 10330 break 10331 } 10332 d := v_1.AuxInt 10333 v.reset(OpConstBool) 10334 v.AuxInt = b2i(c < d) 10335 return true 10336 } 10337 return false 10338 } 10339 func rewriteValuegeneric_OpLess8U_0(v *Value) bool { 10340 // match: (Less8U (Const8 [c]) (Const8 [d])) 10341 // cond: 10342 // result: (ConstBool [b2i(uint8(c) < uint8(d))]) 10343 for { 10344 _ = v.Args[1] 10345 v_0 := v.Args[0] 10346 if v_0.Op != OpConst8 { 10347 break 10348 } 10349 c := v_0.AuxInt 10350 v_1 := v.Args[1] 10351 if v_1.Op != OpConst8 { 10352 break 10353 } 10354 d := v_1.AuxInt 10355 v.reset(OpConstBool) 10356 v.AuxInt = b2i(uint8(c) < uint8(d)) 10357 return true 10358 } 10359 return false 10360 } 10361 func rewriteValuegeneric_OpLoad_0(v *Value) bool { 10362 b := v.Block 10363 _ = b 10364 fe := b.Func.fe 10365 _ = fe 10366 // match: (Load <t1> p1 (Store {t2} p2 x _)) 10367 // cond: isSamePtr(p1,p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size() 10368 // result: x 10369 for { 10370 t1 := v.Type 10371 _ = v.Args[1] 10372 p1 := v.Args[0] 10373 v_1 := v.Args[1] 10374 if v_1.Op != OpStore { 10375 break 10376 } 10377 t2 := v_1.Aux 10378 _ = v_1.Args[2] 10379 p2 := v_1.Args[0] 10380 x := v_1.Args[1] 10381 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size()) { 10382 break 10383 } 10384 v.reset(OpCopy) 10385 v.Type = x.Type 10386 v.AddArg(x) 10387 return true 10388 } 10389 // match: (Load <t> _ _) 10390 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 10391 // result: (StructMake0) 10392 for { 10393 t := v.Type 10394 _ = v.Args[1] 10395 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 10396 break 10397 } 10398 v.reset(OpStructMake0) 10399 return true 10400 } 10401 // match: (Load <t> ptr mem) 10402 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 10403 // result: (StructMake1 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem)) 10404 for { 10405 t := v.Type 10406 _ = v.Args[1] 10407 ptr := v.Args[0] 10408 mem := v.Args[1] 10409 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 10410 break 10411 } 10412 v.reset(OpStructMake1) 10413 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 10414 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 10415 v1.AuxInt = 0 10416 v1.AddArg(ptr) 10417 v0.AddArg(v1) 10418 v0.AddArg(mem) 10419 v.AddArg(v0) 10420 return true 10421 } 10422 // match: (Load <t> ptr mem) 10423 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 10424 // 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)) 10425 for { 10426 t := v.Type 10427 _ = v.Args[1] 10428 ptr := v.Args[0] 10429 mem := v.Args[1] 10430 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 10431 break 10432 } 10433 v.reset(OpStructMake2) 10434 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 10435 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 10436 v1.AuxInt = 0 10437 v1.AddArg(ptr) 10438 v0.AddArg(v1) 10439 v0.AddArg(mem) 10440 v.AddArg(v0) 10441 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 10442 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 10443 v3.AuxInt = t.FieldOff(1) 10444 v3.AddArg(ptr) 10445 v2.AddArg(v3) 10446 v2.AddArg(mem) 10447 v.AddArg(v2) 10448 return true 10449 } 10450 // match: (Load <t> ptr mem) 10451 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 10452 // 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)) 10453 for { 10454 t := v.Type 10455 _ = v.Args[1] 10456 ptr := v.Args[0] 10457 mem := v.Args[1] 10458 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 10459 break 10460 } 10461 v.reset(OpStructMake3) 10462 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 10463 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 10464 v1.AuxInt = 0 10465 v1.AddArg(ptr) 10466 v0.AddArg(v1) 10467 v0.AddArg(mem) 10468 v.AddArg(v0) 10469 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 10470 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 10471 v3.AuxInt = t.FieldOff(1) 10472 v3.AddArg(ptr) 10473 v2.AddArg(v3) 10474 v2.AddArg(mem) 10475 v.AddArg(v2) 10476 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 10477 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 10478 v5.AuxInt = t.FieldOff(2) 10479 v5.AddArg(ptr) 10480 v4.AddArg(v5) 10481 v4.AddArg(mem) 10482 v.AddArg(v4) 10483 return true 10484 } 10485 // match: (Load <t> ptr mem) 10486 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 10487 // 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)) 10488 for { 10489 t := v.Type 10490 _ = v.Args[1] 10491 ptr := v.Args[0] 10492 mem := v.Args[1] 10493 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 10494 break 10495 } 10496 v.reset(OpStructMake4) 10497 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 10498 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 10499 v1.AuxInt = 0 10500 v1.AddArg(ptr) 10501 v0.AddArg(v1) 10502 v0.AddArg(mem) 10503 v.AddArg(v0) 10504 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 10505 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 10506 v3.AuxInt = t.FieldOff(1) 10507 v3.AddArg(ptr) 10508 v2.AddArg(v3) 10509 v2.AddArg(mem) 10510 v.AddArg(v2) 10511 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 10512 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 10513 v5.AuxInt = t.FieldOff(2) 10514 v5.AddArg(ptr) 10515 v4.AddArg(v5) 10516 v4.AddArg(mem) 10517 v.AddArg(v4) 10518 v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) 10519 v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 10520 v7.AuxInt = t.FieldOff(3) 10521 v7.AddArg(ptr) 10522 v6.AddArg(v7) 10523 v6.AddArg(mem) 10524 v.AddArg(v6) 10525 return true 10526 } 10527 // match: (Load <t> _ _) 10528 // cond: t.IsArray() && t.NumElem() == 0 10529 // result: (ArrayMake0) 10530 for { 10531 t := v.Type 10532 _ = v.Args[1] 10533 if !(t.IsArray() && t.NumElem() == 0) { 10534 break 10535 } 10536 v.reset(OpArrayMake0) 10537 return true 10538 } 10539 // match: (Load <t> ptr mem) 10540 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 10541 // result: (ArrayMake1 (Load <t.ElemType()> ptr mem)) 10542 for { 10543 t := v.Type 10544 _ = v.Args[1] 10545 ptr := v.Args[0] 10546 mem := v.Args[1] 10547 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 10548 break 10549 } 10550 v.reset(OpArrayMake1) 10551 v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType()) 10552 v0.AddArg(ptr) 10553 v0.AddArg(mem) 10554 v.AddArg(v0) 10555 return true 10556 } 10557 return false 10558 } 10559 func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { 10560 b := v.Block 10561 _ = b 10562 // match: (Lsh16x16 <t> x (Const16 [c])) 10563 // cond: 10564 // result: (Lsh16x64 x (Const64 <t> [int64(uint16(c))])) 10565 for { 10566 t := v.Type 10567 _ = v.Args[1] 10568 x := v.Args[0] 10569 v_1 := v.Args[1] 10570 if v_1.Op != OpConst16 { 10571 break 10572 } 10573 c := v_1.AuxInt 10574 v.reset(OpLsh16x64) 10575 v.AddArg(x) 10576 v0 := b.NewValue0(v.Pos, OpConst64, t) 10577 v0.AuxInt = int64(uint16(c)) 10578 v.AddArg(v0) 10579 return true 10580 } 10581 // match: (Lsh16x16 (Const16 [0]) _) 10582 // cond: 10583 // result: (Const16 [0]) 10584 for { 10585 _ = v.Args[1] 10586 v_0 := v.Args[0] 10587 if v_0.Op != OpConst16 { 10588 break 10589 } 10590 if v_0.AuxInt != 0 { 10591 break 10592 } 10593 v.reset(OpConst16) 10594 v.AuxInt = 0 10595 return true 10596 } 10597 return false 10598 } 10599 func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { 10600 b := v.Block 10601 _ = b 10602 // match: (Lsh16x32 <t> x (Const32 [c])) 10603 // cond: 10604 // result: (Lsh16x64 x (Const64 <t> [int64(uint32(c))])) 10605 for { 10606 t := v.Type 10607 _ = v.Args[1] 10608 x := v.Args[0] 10609 v_1 := v.Args[1] 10610 if v_1.Op != OpConst32 { 10611 break 10612 } 10613 c := v_1.AuxInt 10614 v.reset(OpLsh16x64) 10615 v.AddArg(x) 10616 v0 := b.NewValue0(v.Pos, OpConst64, t) 10617 v0.AuxInt = int64(uint32(c)) 10618 v.AddArg(v0) 10619 return true 10620 } 10621 // match: (Lsh16x32 (Const16 [0]) _) 10622 // cond: 10623 // result: (Const16 [0]) 10624 for { 10625 _ = v.Args[1] 10626 v_0 := v.Args[0] 10627 if v_0.Op != OpConst16 { 10628 break 10629 } 10630 if v_0.AuxInt != 0 { 10631 break 10632 } 10633 v.reset(OpConst16) 10634 v.AuxInt = 0 10635 return true 10636 } 10637 return false 10638 } 10639 func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { 10640 b := v.Block 10641 _ = b 10642 typ := &b.Func.Config.Types 10643 _ = typ 10644 // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) 10645 // cond: 10646 // result: (Const16 [int64(int16(c) << uint64(d))]) 10647 for { 10648 _ = v.Args[1] 10649 v_0 := v.Args[0] 10650 if v_0.Op != OpConst16 { 10651 break 10652 } 10653 c := v_0.AuxInt 10654 v_1 := v.Args[1] 10655 if v_1.Op != OpConst64 { 10656 break 10657 } 10658 d := v_1.AuxInt 10659 v.reset(OpConst16) 10660 v.AuxInt = int64(int16(c) << uint64(d)) 10661 return true 10662 } 10663 // match: (Lsh16x64 x (Const64 [0])) 10664 // cond: 10665 // result: x 10666 for { 10667 _ = v.Args[1] 10668 x := v.Args[0] 10669 v_1 := v.Args[1] 10670 if v_1.Op != OpConst64 { 10671 break 10672 } 10673 if v_1.AuxInt != 0 { 10674 break 10675 } 10676 v.reset(OpCopy) 10677 v.Type = x.Type 10678 v.AddArg(x) 10679 return true 10680 } 10681 // match: (Lsh16x64 (Const16 [0]) _) 10682 // cond: 10683 // result: (Const16 [0]) 10684 for { 10685 _ = v.Args[1] 10686 v_0 := v.Args[0] 10687 if v_0.Op != OpConst16 { 10688 break 10689 } 10690 if v_0.AuxInt != 0 { 10691 break 10692 } 10693 v.reset(OpConst16) 10694 v.AuxInt = 0 10695 return true 10696 } 10697 // match: (Lsh16x64 _ (Const64 [c])) 10698 // cond: uint64(c) >= 16 10699 // result: (Const16 [0]) 10700 for { 10701 _ = v.Args[1] 10702 v_1 := v.Args[1] 10703 if v_1.Op != OpConst64 { 10704 break 10705 } 10706 c := v_1.AuxInt 10707 if !(uint64(c) >= 16) { 10708 break 10709 } 10710 v.reset(OpConst16) 10711 v.AuxInt = 0 10712 return true 10713 } 10714 // match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d])) 10715 // cond: !uaddOvf(c,d) 10716 // result: (Lsh16x64 x (Const64 <t> [c+d])) 10717 for { 10718 t := v.Type 10719 _ = v.Args[1] 10720 v_0 := v.Args[0] 10721 if v_0.Op != OpLsh16x64 { 10722 break 10723 } 10724 _ = v_0.Args[1] 10725 x := v_0.Args[0] 10726 v_0_1 := v_0.Args[1] 10727 if v_0_1.Op != OpConst64 { 10728 break 10729 } 10730 c := v_0_1.AuxInt 10731 v_1 := v.Args[1] 10732 if v_1.Op != OpConst64 { 10733 break 10734 } 10735 d := v_1.AuxInt 10736 if !(!uaddOvf(c, d)) { 10737 break 10738 } 10739 v.reset(OpLsh16x64) 10740 v.AddArg(x) 10741 v0 := b.NewValue0(v.Pos, OpConst64, t) 10742 v0.AuxInt = c + d 10743 v.AddArg(v0) 10744 return true 10745 } 10746 // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 10747 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 10748 // result: (Lsh16x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 10749 for { 10750 _ = v.Args[1] 10751 v_0 := v.Args[0] 10752 if v_0.Op != OpRsh16Ux64 { 10753 break 10754 } 10755 _ = v_0.Args[1] 10756 v_0_0 := v_0.Args[0] 10757 if v_0_0.Op != OpLsh16x64 { 10758 break 10759 } 10760 _ = v_0_0.Args[1] 10761 x := v_0_0.Args[0] 10762 v_0_0_1 := v_0_0.Args[1] 10763 if v_0_0_1.Op != OpConst64 { 10764 break 10765 } 10766 c1 := v_0_0_1.AuxInt 10767 v_0_1 := v_0.Args[1] 10768 if v_0_1.Op != OpConst64 { 10769 break 10770 } 10771 c2 := v_0_1.AuxInt 10772 v_1 := v.Args[1] 10773 if v_1.Op != OpConst64 { 10774 break 10775 } 10776 c3 := v_1.AuxInt 10777 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 10778 break 10779 } 10780 v.reset(OpLsh16x64) 10781 v.AddArg(x) 10782 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 10783 v0.AuxInt = c1 - c2 + c3 10784 v.AddArg(v0) 10785 return true 10786 } 10787 return false 10788 } 10789 func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { 10790 b := v.Block 10791 _ = b 10792 // match: (Lsh16x8 <t> x (Const8 [c])) 10793 // cond: 10794 // result: (Lsh16x64 x (Const64 <t> [int64(uint8(c))])) 10795 for { 10796 t := v.Type 10797 _ = v.Args[1] 10798 x := v.Args[0] 10799 v_1 := v.Args[1] 10800 if v_1.Op != OpConst8 { 10801 break 10802 } 10803 c := v_1.AuxInt 10804 v.reset(OpLsh16x64) 10805 v.AddArg(x) 10806 v0 := b.NewValue0(v.Pos, OpConst64, t) 10807 v0.AuxInt = int64(uint8(c)) 10808 v.AddArg(v0) 10809 return true 10810 } 10811 // match: (Lsh16x8 (Const16 [0]) _) 10812 // cond: 10813 // result: (Const16 [0]) 10814 for { 10815 _ = v.Args[1] 10816 v_0 := v.Args[0] 10817 if v_0.Op != OpConst16 { 10818 break 10819 } 10820 if v_0.AuxInt != 0 { 10821 break 10822 } 10823 v.reset(OpConst16) 10824 v.AuxInt = 0 10825 return true 10826 } 10827 return false 10828 } 10829 func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { 10830 b := v.Block 10831 _ = b 10832 // match: (Lsh32x16 <t> x (Const16 [c])) 10833 // cond: 10834 // result: (Lsh32x64 x (Const64 <t> [int64(uint16(c))])) 10835 for { 10836 t := v.Type 10837 _ = v.Args[1] 10838 x := v.Args[0] 10839 v_1 := v.Args[1] 10840 if v_1.Op != OpConst16 { 10841 break 10842 } 10843 c := v_1.AuxInt 10844 v.reset(OpLsh32x64) 10845 v.AddArg(x) 10846 v0 := b.NewValue0(v.Pos, OpConst64, t) 10847 v0.AuxInt = int64(uint16(c)) 10848 v.AddArg(v0) 10849 return true 10850 } 10851 // match: (Lsh32x16 (Const32 [0]) _) 10852 // cond: 10853 // result: (Const32 [0]) 10854 for { 10855 _ = v.Args[1] 10856 v_0 := v.Args[0] 10857 if v_0.Op != OpConst32 { 10858 break 10859 } 10860 if v_0.AuxInt != 0 { 10861 break 10862 } 10863 v.reset(OpConst32) 10864 v.AuxInt = 0 10865 return true 10866 } 10867 return false 10868 } 10869 func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { 10870 b := v.Block 10871 _ = b 10872 // match: (Lsh32x32 <t> x (Const32 [c])) 10873 // cond: 10874 // result: (Lsh32x64 x (Const64 <t> [int64(uint32(c))])) 10875 for { 10876 t := v.Type 10877 _ = v.Args[1] 10878 x := v.Args[0] 10879 v_1 := v.Args[1] 10880 if v_1.Op != OpConst32 { 10881 break 10882 } 10883 c := v_1.AuxInt 10884 v.reset(OpLsh32x64) 10885 v.AddArg(x) 10886 v0 := b.NewValue0(v.Pos, OpConst64, t) 10887 v0.AuxInt = int64(uint32(c)) 10888 v.AddArg(v0) 10889 return true 10890 } 10891 // match: (Lsh32x32 (Const32 [0]) _) 10892 // cond: 10893 // result: (Const32 [0]) 10894 for { 10895 _ = v.Args[1] 10896 v_0 := v.Args[0] 10897 if v_0.Op != OpConst32 { 10898 break 10899 } 10900 if v_0.AuxInt != 0 { 10901 break 10902 } 10903 v.reset(OpConst32) 10904 v.AuxInt = 0 10905 return true 10906 } 10907 return false 10908 } 10909 func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { 10910 b := v.Block 10911 _ = b 10912 typ := &b.Func.Config.Types 10913 _ = typ 10914 // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) 10915 // cond: 10916 // result: (Const32 [int64(int32(c) << uint64(d))]) 10917 for { 10918 _ = v.Args[1] 10919 v_0 := v.Args[0] 10920 if v_0.Op != OpConst32 { 10921 break 10922 } 10923 c := v_0.AuxInt 10924 v_1 := v.Args[1] 10925 if v_1.Op != OpConst64 { 10926 break 10927 } 10928 d := v_1.AuxInt 10929 v.reset(OpConst32) 10930 v.AuxInt = int64(int32(c) << uint64(d)) 10931 return true 10932 } 10933 // match: (Lsh32x64 x (Const64 [0])) 10934 // cond: 10935 // result: x 10936 for { 10937 _ = v.Args[1] 10938 x := v.Args[0] 10939 v_1 := v.Args[1] 10940 if v_1.Op != OpConst64 { 10941 break 10942 } 10943 if v_1.AuxInt != 0 { 10944 break 10945 } 10946 v.reset(OpCopy) 10947 v.Type = x.Type 10948 v.AddArg(x) 10949 return true 10950 } 10951 // match: (Lsh32x64 (Const32 [0]) _) 10952 // cond: 10953 // result: (Const32 [0]) 10954 for { 10955 _ = v.Args[1] 10956 v_0 := v.Args[0] 10957 if v_0.Op != OpConst32 { 10958 break 10959 } 10960 if v_0.AuxInt != 0 { 10961 break 10962 } 10963 v.reset(OpConst32) 10964 v.AuxInt = 0 10965 return true 10966 } 10967 // match: (Lsh32x64 _ (Const64 [c])) 10968 // cond: uint64(c) >= 32 10969 // result: (Const32 [0]) 10970 for { 10971 _ = v.Args[1] 10972 v_1 := v.Args[1] 10973 if v_1.Op != OpConst64 { 10974 break 10975 } 10976 c := v_1.AuxInt 10977 if !(uint64(c) >= 32) { 10978 break 10979 } 10980 v.reset(OpConst32) 10981 v.AuxInt = 0 10982 return true 10983 } 10984 // match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d])) 10985 // cond: !uaddOvf(c,d) 10986 // result: (Lsh32x64 x (Const64 <t> [c+d])) 10987 for { 10988 t := v.Type 10989 _ = v.Args[1] 10990 v_0 := v.Args[0] 10991 if v_0.Op != OpLsh32x64 { 10992 break 10993 } 10994 _ = v_0.Args[1] 10995 x := v_0.Args[0] 10996 v_0_1 := v_0.Args[1] 10997 if v_0_1.Op != OpConst64 { 10998 break 10999 } 11000 c := v_0_1.AuxInt 11001 v_1 := v.Args[1] 11002 if v_1.Op != OpConst64 { 11003 break 11004 } 11005 d := v_1.AuxInt 11006 if !(!uaddOvf(c, d)) { 11007 break 11008 } 11009 v.reset(OpLsh32x64) 11010 v.AddArg(x) 11011 v0 := b.NewValue0(v.Pos, OpConst64, t) 11012 v0.AuxInt = c + d 11013 v.AddArg(v0) 11014 return true 11015 } 11016 // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 11017 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 11018 // result: (Lsh32x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 11019 for { 11020 _ = v.Args[1] 11021 v_0 := v.Args[0] 11022 if v_0.Op != OpRsh32Ux64 { 11023 break 11024 } 11025 _ = v_0.Args[1] 11026 v_0_0 := v_0.Args[0] 11027 if v_0_0.Op != OpLsh32x64 { 11028 break 11029 } 11030 _ = v_0_0.Args[1] 11031 x := v_0_0.Args[0] 11032 v_0_0_1 := v_0_0.Args[1] 11033 if v_0_0_1.Op != OpConst64 { 11034 break 11035 } 11036 c1 := v_0_0_1.AuxInt 11037 v_0_1 := v_0.Args[1] 11038 if v_0_1.Op != OpConst64 { 11039 break 11040 } 11041 c2 := v_0_1.AuxInt 11042 v_1 := v.Args[1] 11043 if v_1.Op != OpConst64 { 11044 break 11045 } 11046 c3 := v_1.AuxInt 11047 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 11048 break 11049 } 11050 v.reset(OpLsh32x64) 11051 v.AddArg(x) 11052 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 11053 v0.AuxInt = c1 - c2 + c3 11054 v.AddArg(v0) 11055 return true 11056 } 11057 return false 11058 } 11059 func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { 11060 b := v.Block 11061 _ = b 11062 // match: (Lsh32x8 <t> x (Const8 [c])) 11063 // cond: 11064 // result: (Lsh32x64 x (Const64 <t> [int64(uint8(c))])) 11065 for { 11066 t := v.Type 11067 _ = v.Args[1] 11068 x := v.Args[0] 11069 v_1 := v.Args[1] 11070 if v_1.Op != OpConst8 { 11071 break 11072 } 11073 c := v_1.AuxInt 11074 v.reset(OpLsh32x64) 11075 v.AddArg(x) 11076 v0 := b.NewValue0(v.Pos, OpConst64, t) 11077 v0.AuxInt = int64(uint8(c)) 11078 v.AddArg(v0) 11079 return true 11080 } 11081 // match: (Lsh32x8 (Const32 [0]) _) 11082 // cond: 11083 // result: (Const32 [0]) 11084 for { 11085 _ = v.Args[1] 11086 v_0 := v.Args[0] 11087 if v_0.Op != OpConst32 { 11088 break 11089 } 11090 if v_0.AuxInt != 0 { 11091 break 11092 } 11093 v.reset(OpConst32) 11094 v.AuxInt = 0 11095 return true 11096 } 11097 return false 11098 } 11099 func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { 11100 b := v.Block 11101 _ = b 11102 // match: (Lsh64x16 <t> x (Const16 [c])) 11103 // cond: 11104 // result: (Lsh64x64 x (Const64 <t> [int64(uint16(c))])) 11105 for { 11106 t := v.Type 11107 _ = v.Args[1] 11108 x := v.Args[0] 11109 v_1 := v.Args[1] 11110 if v_1.Op != OpConst16 { 11111 break 11112 } 11113 c := v_1.AuxInt 11114 v.reset(OpLsh64x64) 11115 v.AddArg(x) 11116 v0 := b.NewValue0(v.Pos, OpConst64, t) 11117 v0.AuxInt = int64(uint16(c)) 11118 v.AddArg(v0) 11119 return true 11120 } 11121 // match: (Lsh64x16 (Const64 [0]) _) 11122 // cond: 11123 // result: (Const64 [0]) 11124 for { 11125 _ = v.Args[1] 11126 v_0 := v.Args[0] 11127 if v_0.Op != OpConst64 { 11128 break 11129 } 11130 if v_0.AuxInt != 0 { 11131 break 11132 } 11133 v.reset(OpConst64) 11134 v.AuxInt = 0 11135 return true 11136 } 11137 return false 11138 } 11139 func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { 11140 b := v.Block 11141 _ = b 11142 // match: (Lsh64x32 <t> x (Const32 [c])) 11143 // cond: 11144 // result: (Lsh64x64 x (Const64 <t> [int64(uint32(c))])) 11145 for { 11146 t := v.Type 11147 _ = v.Args[1] 11148 x := v.Args[0] 11149 v_1 := v.Args[1] 11150 if v_1.Op != OpConst32 { 11151 break 11152 } 11153 c := v_1.AuxInt 11154 v.reset(OpLsh64x64) 11155 v.AddArg(x) 11156 v0 := b.NewValue0(v.Pos, OpConst64, t) 11157 v0.AuxInt = int64(uint32(c)) 11158 v.AddArg(v0) 11159 return true 11160 } 11161 // match: (Lsh64x32 (Const64 [0]) _) 11162 // cond: 11163 // result: (Const64 [0]) 11164 for { 11165 _ = v.Args[1] 11166 v_0 := v.Args[0] 11167 if v_0.Op != OpConst64 { 11168 break 11169 } 11170 if v_0.AuxInt != 0 { 11171 break 11172 } 11173 v.reset(OpConst64) 11174 v.AuxInt = 0 11175 return true 11176 } 11177 return false 11178 } 11179 func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { 11180 b := v.Block 11181 _ = b 11182 typ := &b.Func.Config.Types 11183 _ = typ 11184 // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) 11185 // cond: 11186 // result: (Const64 [c << uint64(d)]) 11187 for { 11188 _ = v.Args[1] 11189 v_0 := v.Args[0] 11190 if v_0.Op != OpConst64 { 11191 break 11192 } 11193 c := v_0.AuxInt 11194 v_1 := v.Args[1] 11195 if v_1.Op != OpConst64 { 11196 break 11197 } 11198 d := v_1.AuxInt 11199 v.reset(OpConst64) 11200 v.AuxInt = c << uint64(d) 11201 return true 11202 } 11203 // match: (Lsh64x64 x (Const64 [0])) 11204 // cond: 11205 // result: x 11206 for { 11207 _ = v.Args[1] 11208 x := v.Args[0] 11209 v_1 := v.Args[1] 11210 if v_1.Op != OpConst64 { 11211 break 11212 } 11213 if v_1.AuxInt != 0 { 11214 break 11215 } 11216 v.reset(OpCopy) 11217 v.Type = x.Type 11218 v.AddArg(x) 11219 return true 11220 } 11221 // match: (Lsh64x64 (Const64 [0]) _) 11222 // cond: 11223 // result: (Const64 [0]) 11224 for { 11225 _ = v.Args[1] 11226 v_0 := v.Args[0] 11227 if v_0.Op != OpConst64 { 11228 break 11229 } 11230 if v_0.AuxInt != 0 { 11231 break 11232 } 11233 v.reset(OpConst64) 11234 v.AuxInt = 0 11235 return true 11236 } 11237 // match: (Lsh64x64 _ (Const64 [c])) 11238 // cond: uint64(c) >= 64 11239 // result: (Const64 [0]) 11240 for { 11241 _ = v.Args[1] 11242 v_1 := v.Args[1] 11243 if v_1.Op != OpConst64 { 11244 break 11245 } 11246 c := v_1.AuxInt 11247 if !(uint64(c) >= 64) { 11248 break 11249 } 11250 v.reset(OpConst64) 11251 v.AuxInt = 0 11252 return true 11253 } 11254 // match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d])) 11255 // cond: !uaddOvf(c,d) 11256 // result: (Lsh64x64 x (Const64 <t> [c+d])) 11257 for { 11258 t := v.Type 11259 _ = v.Args[1] 11260 v_0 := v.Args[0] 11261 if v_0.Op != OpLsh64x64 { 11262 break 11263 } 11264 _ = v_0.Args[1] 11265 x := v_0.Args[0] 11266 v_0_1 := v_0.Args[1] 11267 if v_0_1.Op != OpConst64 { 11268 break 11269 } 11270 c := v_0_1.AuxInt 11271 v_1 := v.Args[1] 11272 if v_1.Op != OpConst64 { 11273 break 11274 } 11275 d := v_1.AuxInt 11276 if !(!uaddOvf(c, d)) { 11277 break 11278 } 11279 v.reset(OpLsh64x64) 11280 v.AddArg(x) 11281 v0 := b.NewValue0(v.Pos, OpConst64, t) 11282 v0.AuxInt = c + d 11283 v.AddArg(v0) 11284 return true 11285 } 11286 // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 11287 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 11288 // result: (Lsh64x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 11289 for { 11290 _ = v.Args[1] 11291 v_0 := v.Args[0] 11292 if v_0.Op != OpRsh64Ux64 { 11293 break 11294 } 11295 _ = v_0.Args[1] 11296 v_0_0 := v_0.Args[0] 11297 if v_0_0.Op != OpLsh64x64 { 11298 break 11299 } 11300 _ = v_0_0.Args[1] 11301 x := v_0_0.Args[0] 11302 v_0_0_1 := v_0_0.Args[1] 11303 if v_0_0_1.Op != OpConst64 { 11304 break 11305 } 11306 c1 := v_0_0_1.AuxInt 11307 v_0_1 := v_0.Args[1] 11308 if v_0_1.Op != OpConst64 { 11309 break 11310 } 11311 c2 := v_0_1.AuxInt 11312 v_1 := v.Args[1] 11313 if v_1.Op != OpConst64 { 11314 break 11315 } 11316 c3 := v_1.AuxInt 11317 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 11318 break 11319 } 11320 v.reset(OpLsh64x64) 11321 v.AddArg(x) 11322 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 11323 v0.AuxInt = c1 - c2 + c3 11324 v.AddArg(v0) 11325 return true 11326 } 11327 return false 11328 } 11329 func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { 11330 b := v.Block 11331 _ = b 11332 // match: (Lsh64x8 <t> x (Const8 [c])) 11333 // cond: 11334 // result: (Lsh64x64 x (Const64 <t> [int64(uint8(c))])) 11335 for { 11336 t := v.Type 11337 _ = v.Args[1] 11338 x := v.Args[0] 11339 v_1 := v.Args[1] 11340 if v_1.Op != OpConst8 { 11341 break 11342 } 11343 c := v_1.AuxInt 11344 v.reset(OpLsh64x64) 11345 v.AddArg(x) 11346 v0 := b.NewValue0(v.Pos, OpConst64, t) 11347 v0.AuxInt = int64(uint8(c)) 11348 v.AddArg(v0) 11349 return true 11350 } 11351 // match: (Lsh64x8 (Const64 [0]) _) 11352 // cond: 11353 // result: (Const64 [0]) 11354 for { 11355 _ = v.Args[1] 11356 v_0 := v.Args[0] 11357 if v_0.Op != OpConst64 { 11358 break 11359 } 11360 if v_0.AuxInt != 0 { 11361 break 11362 } 11363 v.reset(OpConst64) 11364 v.AuxInt = 0 11365 return true 11366 } 11367 return false 11368 } 11369 func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { 11370 b := v.Block 11371 _ = b 11372 // match: (Lsh8x16 <t> x (Const16 [c])) 11373 // cond: 11374 // result: (Lsh8x64 x (Const64 <t> [int64(uint16(c))])) 11375 for { 11376 t := v.Type 11377 _ = v.Args[1] 11378 x := v.Args[0] 11379 v_1 := v.Args[1] 11380 if v_1.Op != OpConst16 { 11381 break 11382 } 11383 c := v_1.AuxInt 11384 v.reset(OpLsh8x64) 11385 v.AddArg(x) 11386 v0 := b.NewValue0(v.Pos, OpConst64, t) 11387 v0.AuxInt = int64(uint16(c)) 11388 v.AddArg(v0) 11389 return true 11390 } 11391 // match: (Lsh8x16 (Const8 [0]) _) 11392 // cond: 11393 // result: (Const8 [0]) 11394 for { 11395 _ = v.Args[1] 11396 v_0 := v.Args[0] 11397 if v_0.Op != OpConst8 { 11398 break 11399 } 11400 if v_0.AuxInt != 0 { 11401 break 11402 } 11403 v.reset(OpConst8) 11404 v.AuxInt = 0 11405 return true 11406 } 11407 return false 11408 } 11409 func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { 11410 b := v.Block 11411 _ = b 11412 // match: (Lsh8x32 <t> x (Const32 [c])) 11413 // cond: 11414 // result: (Lsh8x64 x (Const64 <t> [int64(uint32(c))])) 11415 for { 11416 t := v.Type 11417 _ = v.Args[1] 11418 x := v.Args[0] 11419 v_1 := v.Args[1] 11420 if v_1.Op != OpConst32 { 11421 break 11422 } 11423 c := v_1.AuxInt 11424 v.reset(OpLsh8x64) 11425 v.AddArg(x) 11426 v0 := b.NewValue0(v.Pos, OpConst64, t) 11427 v0.AuxInt = int64(uint32(c)) 11428 v.AddArg(v0) 11429 return true 11430 } 11431 // match: (Lsh8x32 (Const8 [0]) _) 11432 // cond: 11433 // result: (Const8 [0]) 11434 for { 11435 _ = v.Args[1] 11436 v_0 := v.Args[0] 11437 if v_0.Op != OpConst8 { 11438 break 11439 } 11440 if v_0.AuxInt != 0 { 11441 break 11442 } 11443 v.reset(OpConst8) 11444 v.AuxInt = 0 11445 return true 11446 } 11447 return false 11448 } 11449 func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { 11450 b := v.Block 11451 _ = b 11452 typ := &b.Func.Config.Types 11453 _ = typ 11454 // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) 11455 // cond: 11456 // result: (Const8 [int64(int8(c) << uint64(d))]) 11457 for { 11458 _ = v.Args[1] 11459 v_0 := v.Args[0] 11460 if v_0.Op != OpConst8 { 11461 break 11462 } 11463 c := v_0.AuxInt 11464 v_1 := v.Args[1] 11465 if v_1.Op != OpConst64 { 11466 break 11467 } 11468 d := v_1.AuxInt 11469 v.reset(OpConst8) 11470 v.AuxInt = int64(int8(c) << uint64(d)) 11471 return true 11472 } 11473 // match: (Lsh8x64 x (Const64 [0])) 11474 // cond: 11475 // result: x 11476 for { 11477 _ = v.Args[1] 11478 x := v.Args[0] 11479 v_1 := v.Args[1] 11480 if v_1.Op != OpConst64 { 11481 break 11482 } 11483 if v_1.AuxInt != 0 { 11484 break 11485 } 11486 v.reset(OpCopy) 11487 v.Type = x.Type 11488 v.AddArg(x) 11489 return true 11490 } 11491 // match: (Lsh8x64 (Const8 [0]) _) 11492 // cond: 11493 // result: (Const8 [0]) 11494 for { 11495 _ = v.Args[1] 11496 v_0 := v.Args[0] 11497 if v_0.Op != OpConst8 { 11498 break 11499 } 11500 if v_0.AuxInt != 0 { 11501 break 11502 } 11503 v.reset(OpConst8) 11504 v.AuxInt = 0 11505 return true 11506 } 11507 // match: (Lsh8x64 _ (Const64 [c])) 11508 // cond: uint64(c) >= 8 11509 // result: (Const8 [0]) 11510 for { 11511 _ = v.Args[1] 11512 v_1 := v.Args[1] 11513 if v_1.Op != OpConst64 { 11514 break 11515 } 11516 c := v_1.AuxInt 11517 if !(uint64(c) >= 8) { 11518 break 11519 } 11520 v.reset(OpConst8) 11521 v.AuxInt = 0 11522 return true 11523 } 11524 // match: (Lsh8x64 <t> (Lsh8x64 x (Const64 [c])) (Const64 [d])) 11525 // cond: !uaddOvf(c,d) 11526 // result: (Lsh8x64 x (Const64 <t> [c+d])) 11527 for { 11528 t := v.Type 11529 _ = v.Args[1] 11530 v_0 := v.Args[0] 11531 if v_0.Op != OpLsh8x64 { 11532 break 11533 } 11534 _ = v_0.Args[1] 11535 x := v_0.Args[0] 11536 v_0_1 := v_0.Args[1] 11537 if v_0_1.Op != OpConst64 { 11538 break 11539 } 11540 c := v_0_1.AuxInt 11541 v_1 := v.Args[1] 11542 if v_1.Op != OpConst64 { 11543 break 11544 } 11545 d := v_1.AuxInt 11546 if !(!uaddOvf(c, d)) { 11547 break 11548 } 11549 v.reset(OpLsh8x64) 11550 v.AddArg(x) 11551 v0 := b.NewValue0(v.Pos, OpConst64, t) 11552 v0.AuxInt = c + d 11553 v.AddArg(v0) 11554 return true 11555 } 11556 // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 11557 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 11558 // result: (Lsh8x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 11559 for { 11560 _ = v.Args[1] 11561 v_0 := v.Args[0] 11562 if v_0.Op != OpRsh8Ux64 { 11563 break 11564 } 11565 _ = v_0.Args[1] 11566 v_0_0 := v_0.Args[0] 11567 if v_0_0.Op != OpLsh8x64 { 11568 break 11569 } 11570 _ = v_0_0.Args[1] 11571 x := v_0_0.Args[0] 11572 v_0_0_1 := v_0_0.Args[1] 11573 if v_0_0_1.Op != OpConst64 { 11574 break 11575 } 11576 c1 := v_0_0_1.AuxInt 11577 v_0_1 := v_0.Args[1] 11578 if v_0_1.Op != OpConst64 { 11579 break 11580 } 11581 c2 := v_0_1.AuxInt 11582 v_1 := v.Args[1] 11583 if v_1.Op != OpConst64 { 11584 break 11585 } 11586 c3 := v_1.AuxInt 11587 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 11588 break 11589 } 11590 v.reset(OpLsh8x64) 11591 v.AddArg(x) 11592 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 11593 v0.AuxInt = c1 - c2 + c3 11594 v.AddArg(v0) 11595 return true 11596 } 11597 return false 11598 } 11599 func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { 11600 b := v.Block 11601 _ = b 11602 // match: (Lsh8x8 <t> x (Const8 [c])) 11603 // cond: 11604 // result: (Lsh8x64 x (Const64 <t> [int64(uint8(c))])) 11605 for { 11606 t := v.Type 11607 _ = v.Args[1] 11608 x := v.Args[0] 11609 v_1 := v.Args[1] 11610 if v_1.Op != OpConst8 { 11611 break 11612 } 11613 c := v_1.AuxInt 11614 v.reset(OpLsh8x64) 11615 v.AddArg(x) 11616 v0 := b.NewValue0(v.Pos, OpConst64, t) 11617 v0.AuxInt = int64(uint8(c)) 11618 v.AddArg(v0) 11619 return true 11620 } 11621 // match: (Lsh8x8 (Const8 [0]) _) 11622 // cond: 11623 // result: (Const8 [0]) 11624 for { 11625 _ = v.Args[1] 11626 v_0 := v.Args[0] 11627 if v_0.Op != OpConst8 { 11628 break 11629 } 11630 if v_0.AuxInt != 0 { 11631 break 11632 } 11633 v.reset(OpConst8) 11634 v.AuxInt = 0 11635 return true 11636 } 11637 return false 11638 } 11639 func rewriteValuegeneric_OpMod16_0(v *Value) bool { 11640 b := v.Block 11641 _ = b 11642 // match: (Mod16 (Const16 [c]) (Const16 [d])) 11643 // cond: d != 0 11644 // result: (Const16 [int64(int16(c % d))]) 11645 for { 11646 _ = v.Args[1] 11647 v_0 := v.Args[0] 11648 if v_0.Op != OpConst16 { 11649 break 11650 } 11651 c := v_0.AuxInt 11652 v_1 := v.Args[1] 11653 if v_1.Op != OpConst16 { 11654 break 11655 } 11656 d := v_1.AuxInt 11657 if !(d != 0) { 11658 break 11659 } 11660 v.reset(OpConst16) 11661 v.AuxInt = int64(int16(c % d)) 11662 return true 11663 } 11664 // match: (Mod16 <t> n (Const16 [c])) 11665 // cond: c < 0 && c != -1<<15 11666 // result: (Mod16 <t> n (Const16 <t> [-c])) 11667 for { 11668 t := v.Type 11669 _ = v.Args[1] 11670 n := v.Args[0] 11671 v_1 := v.Args[1] 11672 if v_1.Op != OpConst16 { 11673 break 11674 } 11675 c := v_1.AuxInt 11676 if !(c < 0 && c != -1<<15) { 11677 break 11678 } 11679 v.reset(OpMod16) 11680 v.Type = t 11681 v.AddArg(n) 11682 v0 := b.NewValue0(v.Pos, OpConst16, t) 11683 v0.AuxInt = -c 11684 v.AddArg(v0) 11685 return true 11686 } 11687 // match: (Mod16 <t> x (Const16 [c])) 11688 // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) 11689 // result: (Sub16 x (Mul16 <t> (Div16 <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 11690 for { 11691 t := v.Type 11692 _ = v.Args[1] 11693 x := v.Args[0] 11694 v_1 := v.Args[1] 11695 if v_1.Op != OpConst16 { 11696 break 11697 } 11698 c := v_1.AuxInt 11699 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { 11700 break 11701 } 11702 v.reset(OpSub16) 11703 v.AddArg(x) 11704 v0 := b.NewValue0(v.Pos, OpMul16, t) 11705 v1 := b.NewValue0(v.Pos, OpDiv16, t) 11706 v1.AddArg(x) 11707 v2 := b.NewValue0(v.Pos, OpConst16, t) 11708 v2.AuxInt = c 11709 v1.AddArg(v2) 11710 v0.AddArg(v1) 11711 v3 := b.NewValue0(v.Pos, OpConst16, t) 11712 v3.AuxInt = c 11713 v0.AddArg(v3) 11714 v.AddArg(v0) 11715 return true 11716 } 11717 return false 11718 } 11719 func rewriteValuegeneric_OpMod16u_0(v *Value) bool { 11720 b := v.Block 11721 _ = b 11722 // match: (Mod16u (Const16 [c]) (Const16 [d])) 11723 // cond: d != 0 11724 // result: (Const16 [int64(uint16(c) % uint16(d))]) 11725 for { 11726 _ = v.Args[1] 11727 v_0 := v.Args[0] 11728 if v_0.Op != OpConst16 { 11729 break 11730 } 11731 c := v_0.AuxInt 11732 v_1 := v.Args[1] 11733 if v_1.Op != OpConst16 { 11734 break 11735 } 11736 d := v_1.AuxInt 11737 if !(d != 0) { 11738 break 11739 } 11740 v.reset(OpConst16) 11741 v.AuxInt = int64(uint16(c) % uint16(d)) 11742 return true 11743 } 11744 // match: (Mod16u <t> n (Const16 [c])) 11745 // cond: isPowerOfTwo(c&0xffff) 11746 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 11747 for { 11748 t := v.Type 11749 _ = v.Args[1] 11750 n := v.Args[0] 11751 v_1 := v.Args[1] 11752 if v_1.Op != OpConst16 { 11753 break 11754 } 11755 c := v_1.AuxInt 11756 if !(isPowerOfTwo(c & 0xffff)) { 11757 break 11758 } 11759 v.reset(OpAnd16) 11760 v.AddArg(n) 11761 v0 := b.NewValue0(v.Pos, OpConst16, t) 11762 v0.AuxInt = (c & 0xffff) - 1 11763 v.AddArg(v0) 11764 return true 11765 } 11766 // match: (Mod16u <t> x (Const16 [c])) 11767 // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) 11768 // result: (Sub16 x (Mul16 <t> (Div16u <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 11769 for { 11770 t := v.Type 11771 _ = v.Args[1] 11772 x := v.Args[0] 11773 v_1 := v.Args[1] 11774 if v_1.Op != OpConst16 { 11775 break 11776 } 11777 c := v_1.AuxInt 11778 if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { 11779 break 11780 } 11781 v.reset(OpSub16) 11782 v.AddArg(x) 11783 v0 := b.NewValue0(v.Pos, OpMul16, t) 11784 v1 := b.NewValue0(v.Pos, OpDiv16u, t) 11785 v1.AddArg(x) 11786 v2 := b.NewValue0(v.Pos, OpConst16, t) 11787 v2.AuxInt = c 11788 v1.AddArg(v2) 11789 v0.AddArg(v1) 11790 v3 := b.NewValue0(v.Pos, OpConst16, t) 11791 v3.AuxInt = c 11792 v0.AddArg(v3) 11793 v.AddArg(v0) 11794 return true 11795 } 11796 return false 11797 } 11798 func rewriteValuegeneric_OpMod32_0(v *Value) bool { 11799 b := v.Block 11800 _ = b 11801 // match: (Mod32 (Const32 [c]) (Const32 [d])) 11802 // cond: d != 0 11803 // result: (Const32 [int64(int32(c % d))]) 11804 for { 11805 _ = v.Args[1] 11806 v_0 := v.Args[0] 11807 if v_0.Op != OpConst32 { 11808 break 11809 } 11810 c := v_0.AuxInt 11811 v_1 := v.Args[1] 11812 if v_1.Op != OpConst32 { 11813 break 11814 } 11815 d := v_1.AuxInt 11816 if !(d != 0) { 11817 break 11818 } 11819 v.reset(OpConst32) 11820 v.AuxInt = int64(int32(c % d)) 11821 return true 11822 } 11823 // match: (Mod32 <t> n (Const32 [c])) 11824 // cond: c < 0 && c != -1<<31 11825 // result: (Mod32 <t> n (Const32 <t> [-c])) 11826 for { 11827 t := v.Type 11828 _ = v.Args[1] 11829 n := v.Args[0] 11830 v_1 := v.Args[1] 11831 if v_1.Op != OpConst32 { 11832 break 11833 } 11834 c := v_1.AuxInt 11835 if !(c < 0 && c != -1<<31) { 11836 break 11837 } 11838 v.reset(OpMod32) 11839 v.Type = t 11840 v.AddArg(n) 11841 v0 := b.NewValue0(v.Pos, OpConst32, t) 11842 v0.AuxInt = -c 11843 v.AddArg(v0) 11844 return true 11845 } 11846 // match: (Mod32 <t> x (Const32 [c])) 11847 // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) 11848 // result: (Sub32 x (Mul32 <t> (Div32 <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 11849 for { 11850 t := v.Type 11851 _ = v.Args[1] 11852 x := v.Args[0] 11853 v_1 := v.Args[1] 11854 if v_1.Op != OpConst32 { 11855 break 11856 } 11857 c := v_1.AuxInt 11858 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { 11859 break 11860 } 11861 v.reset(OpSub32) 11862 v.AddArg(x) 11863 v0 := b.NewValue0(v.Pos, OpMul32, t) 11864 v1 := b.NewValue0(v.Pos, OpDiv32, t) 11865 v1.AddArg(x) 11866 v2 := b.NewValue0(v.Pos, OpConst32, t) 11867 v2.AuxInt = c 11868 v1.AddArg(v2) 11869 v0.AddArg(v1) 11870 v3 := b.NewValue0(v.Pos, OpConst32, t) 11871 v3.AuxInt = c 11872 v0.AddArg(v3) 11873 v.AddArg(v0) 11874 return true 11875 } 11876 return false 11877 } 11878 func rewriteValuegeneric_OpMod32u_0(v *Value) bool { 11879 b := v.Block 11880 _ = b 11881 // match: (Mod32u (Const32 [c]) (Const32 [d])) 11882 // cond: d != 0 11883 // result: (Const32 [int64(uint32(c) % uint32(d))]) 11884 for { 11885 _ = v.Args[1] 11886 v_0 := v.Args[0] 11887 if v_0.Op != OpConst32 { 11888 break 11889 } 11890 c := v_0.AuxInt 11891 v_1 := v.Args[1] 11892 if v_1.Op != OpConst32 { 11893 break 11894 } 11895 d := v_1.AuxInt 11896 if !(d != 0) { 11897 break 11898 } 11899 v.reset(OpConst32) 11900 v.AuxInt = int64(uint32(c) % uint32(d)) 11901 return true 11902 } 11903 // match: (Mod32u <t> n (Const32 [c])) 11904 // cond: isPowerOfTwo(c&0xffffffff) 11905 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 11906 for { 11907 t := v.Type 11908 _ = v.Args[1] 11909 n := v.Args[0] 11910 v_1 := v.Args[1] 11911 if v_1.Op != OpConst32 { 11912 break 11913 } 11914 c := v_1.AuxInt 11915 if !(isPowerOfTwo(c & 0xffffffff)) { 11916 break 11917 } 11918 v.reset(OpAnd32) 11919 v.AddArg(n) 11920 v0 := b.NewValue0(v.Pos, OpConst32, t) 11921 v0.AuxInt = (c & 0xffffffff) - 1 11922 v.AddArg(v0) 11923 return true 11924 } 11925 // match: (Mod32u <t> x (Const32 [c])) 11926 // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) 11927 // result: (Sub32 x (Mul32 <t> (Div32u <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 11928 for { 11929 t := v.Type 11930 _ = v.Args[1] 11931 x := v.Args[0] 11932 v_1 := v.Args[1] 11933 if v_1.Op != OpConst32 { 11934 break 11935 } 11936 c := v_1.AuxInt 11937 if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { 11938 break 11939 } 11940 v.reset(OpSub32) 11941 v.AddArg(x) 11942 v0 := b.NewValue0(v.Pos, OpMul32, t) 11943 v1 := b.NewValue0(v.Pos, OpDiv32u, t) 11944 v1.AddArg(x) 11945 v2 := b.NewValue0(v.Pos, OpConst32, t) 11946 v2.AuxInt = c 11947 v1.AddArg(v2) 11948 v0.AddArg(v1) 11949 v3 := b.NewValue0(v.Pos, OpConst32, t) 11950 v3.AuxInt = c 11951 v0.AddArg(v3) 11952 v.AddArg(v0) 11953 return true 11954 } 11955 return false 11956 } 11957 func rewriteValuegeneric_OpMod64_0(v *Value) bool { 11958 b := v.Block 11959 _ = b 11960 // match: (Mod64 (Const64 [c]) (Const64 [d])) 11961 // cond: d != 0 11962 // result: (Const64 [c % d]) 11963 for { 11964 _ = v.Args[1] 11965 v_0 := v.Args[0] 11966 if v_0.Op != OpConst64 { 11967 break 11968 } 11969 c := v_0.AuxInt 11970 v_1 := v.Args[1] 11971 if v_1.Op != OpConst64 { 11972 break 11973 } 11974 d := v_1.AuxInt 11975 if !(d != 0) { 11976 break 11977 } 11978 v.reset(OpConst64) 11979 v.AuxInt = c % d 11980 return true 11981 } 11982 // match: (Mod64 <t> n (Const64 [c])) 11983 // cond: c < 0 && c != -1<<63 11984 // result: (Mod64 <t> n (Const64 <t> [-c])) 11985 for { 11986 t := v.Type 11987 _ = v.Args[1] 11988 n := v.Args[0] 11989 v_1 := v.Args[1] 11990 if v_1.Op != OpConst64 { 11991 break 11992 } 11993 c := v_1.AuxInt 11994 if !(c < 0 && c != -1<<63) { 11995 break 11996 } 11997 v.reset(OpMod64) 11998 v.Type = t 11999 v.AddArg(n) 12000 v0 := b.NewValue0(v.Pos, OpConst64, t) 12001 v0.AuxInt = -c 12002 v.AddArg(v0) 12003 return true 12004 } 12005 // match: (Mod64 <t> x (Const64 [c])) 12006 // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) 12007 // result: (Sub64 x (Mul64 <t> (Div64 <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 12008 for { 12009 t := v.Type 12010 _ = v.Args[1] 12011 x := v.Args[0] 12012 v_1 := v.Args[1] 12013 if v_1.Op != OpConst64 { 12014 break 12015 } 12016 c := v_1.AuxInt 12017 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { 12018 break 12019 } 12020 v.reset(OpSub64) 12021 v.AddArg(x) 12022 v0 := b.NewValue0(v.Pos, OpMul64, t) 12023 v1 := b.NewValue0(v.Pos, OpDiv64, t) 12024 v1.AddArg(x) 12025 v2 := b.NewValue0(v.Pos, OpConst64, t) 12026 v2.AuxInt = c 12027 v1.AddArg(v2) 12028 v0.AddArg(v1) 12029 v3 := b.NewValue0(v.Pos, OpConst64, t) 12030 v3.AuxInt = c 12031 v0.AddArg(v3) 12032 v.AddArg(v0) 12033 return true 12034 } 12035 return false 12036 } 12037 func rewriteValuegeneric_OpMod64u_0(v *Value) bool { 12038 b := v.Block 12039 _ = b 12040 // match: (Mod64u (Const64 [c]) (Const64 [d])) 12041 // cond: d != 0 12042 // result: (Const64 [int64(uint64(c) % uint64(d))]) 12043 for { 12044 _ = v.Args[1] 12045 v_0 := v.Args[0] 12046 if v_0.Op != OpConst64 { 12047 break 12048 } 12049 c := v_0.AuxInt 12050 v_1 := v.Args[1] 12051 if v_1.Op != OpConst64 { 12052 break 12053 } 12054 d := v_1.AuxInt 12055 if !(d != 0) { 12056 break 12057 } 12058 v.reset(OpConst64) 12059 v.AuxInt = int64(uint64(c) % uint64(d)) 12060 return true 12061 } 12062 // match: (Mod64u <t> n (Const64 [c])) 12063 // cond: isPowerOfTwo(c) 12064 // result: (And64 n (Const64 <t> [c-1])) 12065 for { 12066 t := v.Type 12067 _ = v.Args[1] 12068 n := v.Args[0] 12069 v_1 := v.Args[1] 12070 if v_1.Op != OpConst64 { 12071 break 12072 } 12073 c := v_1.AuxInt 12074 if !(isPowerOfTwo(c)) { 12075 break 12076 } 12077 v.reset(OpAnd64) 12078 v.AddArg(n) 12079 v0 := b.NewValue0(v.Pos, OpConst64, t) 12080 v0.AuxInt = c - 1 12081 v.AddArg(v0) 12082 return true 12083 } 12084 // match: (Mod64u <t> n (Const64 [-1<<63])) 12085 // cond: 12086 // result: (And64 n (Const64 <t> [1<<63-1])) 12087 for { 12088 t := v.Type 12089 _ = v.Args[1] 12090 n := v.Args[0] 12091 v_1 := v.Args[1] 12092 if v_1.Op != OpConst64 { 12093 break 12094 } 12095 if v_1.AuxInt != -1<<63 { 12096 break 12097 } 12098 v.reset(OpAnd64) 12099 v.AddArg(n) 12100 v0 := b.NewValue0(v.Pos, OpConst64, t) 12101 v0.AuxInt = 1<<63 - 1 12102 v.AddArg(v0) 12103 return true 12104 } 12105 // match: (Mod64u <t> x (Const64 [c])) 12106 // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) 12107 // result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 12108 for { 12109 t := v.Type 12110 _ = v.Args[1] 12111 x := v.Args[0] 12112 v_1 := v.Args[1] 12113 if v_1.Op != OpConst64 { 12114 break 12115 } 12116 c := v_1.AuxInt 12117 if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { 12118 break 12119 } 12120 v.reset(OpSub64) 12121 v.AddArg(x) 12122 v0 := b.NewValue0(v.Pos, OpMul64, t) 12123 v1 := b.NewValue0(v.Pos, OpDiv64u, t) 12124 v1.AddArg(x) 12125 v2 := b.NewValue0(v.Pos, OpConst64, t) 12126 v2.AuxInt = c 12127 v1.AddArg(v2) 12128 v0.AddArg(v1) 12129 v3 := b.NewValue0(v.Pos, OpConst64, t) 12130 v3.AuxInt = c 12131 v0.AddArg(v3) 12132 v.AddArg(v0) 12133 return true 12134 } 12135 return false 12136 } 12137 func rewriteValuegeneric_OpMod8_0(v *Value) bool { 12138 b := v.Block 12139 _ = b 12140 // match: (Mod8 (Const8 [c]) (Const8 [d])) 12141 // cond: d != 0 12142 // result: (Const8 [int64(int8(c % d))]) 12143 for { 12144 _ = v.Args[1] 12145 v_0 := v.Args[0] 12146 if v_0.Op != OpConst8 { 12147 break 12148 } 12149 c := v_0.AuxInt 12150 v_1 := v.Args[1] 12151 if v_1.Op != OpConst8 { 12152 break 12153 } 12154 d := v_1.AuxInt 12155 if !(d != 0) { 12156 break 12157 } 12158 v.reset(OpConst8) 12159 v.AuxInt = int64(int8(c % d)) 12160 return true 12161 } 12162 // match: (Mod8 <t> n (Const8 [c])) 12163 // cond: c < 0 && c != -1<<7 12164 // result: (Mod8 <t> n (Const8 <t> [-c])) 12165 for { 12166 t := v.Type 12167 _ = v.Args[1] 12168 n := v.Args[0] 12169 v_1 := v.Args[1] 12170 if v_1.Op != OpConst8 { 12171 break 12172 } 12173 c := v_1.AuxInt 12174 if !(c < 0 && c != -1<<7) { 12175 break 12176 } 12177 v.reset(OpMod8) 12178 v.Type = t 12179 v.AddArg(n) 12180 v0 := b.NewValue0(v.Pos, OpConst8, t) 12181 v0.AuxInt = -c 12182 v.AddArg(v0) 12183 return true 12184 } 12185 // match: (Mod8 <t> x (Const8 [c])) 12186 // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) 12187 // result: (Sub8 x (Mul8 <t> (Div8 <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 12188 for { 12189 t := v.Type 12190 _ = v.Args[1] 12191 x := v.Args[0] 12192 v_1 := v.Args[1] 12193 if v_1.Op != OpConst8 { 12194 break 12195 } 12196 c := v_1.AuxInt 12197 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { 12198 break 12199 } 12200 v.reset(OpSub8) 12201 v.AddArg(x) 12202 v0 := b.NewValue0(v.Pos, OpMul8, t) 12203 v1 := b.NewValue0(v.Pos, OpDiv8, t) 12204 v1.AddArg(x) 12205 v2 := b.NewValue0(v.Pos, OpConst8, t) 12206 v2.AuxInt = c 12207 v1.AddArg(v2) 12208 v0.AddArg(v1) 12209 v3 := b.NewValue0(v.Pos, OpConst8, t) 12210 v3.AuxInt = c 12211 v0.AddArg(v3) 12212 v.AddArg(v0) 12213 return true 12214 } 12215 return false 12216 } 12217 func rewriteValuegeneric_OpMod8u_0(v *Value) bool { 12218 b := v.Block 12219 _ = b 12220 // match: (Mod8u (Const8 [c]) (Const8 [d])) 12221 // cond: d != 0 12222 // result: (Const8 [int64(uint8(c) % uint8(d))]) 12223 for { 12224 _ = v.Args[1] 12225 v_0 := v.Args[0] 12226 if v_0.Op != OpConst8 { 12227 break 12228 } 12229 c := v_0.AuxInt 12230 v_1 := v.Args[1] 12231 if v_1.Op != OpConst8 { 12232 break 12233 } 12234 d := v_1.AuxInt 12235 if !(d != 0) { 12236 break 12237 } 12238 v.reset(OpConst8) 12239 v.AuxInt = int64(uint8(c) % uint8(d)) 12240 return true 12241 } 12242 // match: (Mod8u <t> n (Const8 [c])) 12243 // cond: isPowerOfTwo(c&0xff) 12244 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 12245 for { 12246 t := v.Type 12247 _ = v.Args[1] 12248 n := v.Args[0] 12249 v_1 := v.Args[1] 12250 if v_1.Op != OpConst8 { 12251 break 12252 } 12253 c := v_1.AuxInt 12254 if !(isPowerOfTwo(c & 0xff)) { 12255 break 12256 } 12257 v.reset(OpAnd8) 12258 v.AddArg(n) 12259 v0 := b.NewValue0(v.Pos, OpConst8, t) 12260 v0.AuxInt = (c & 0xff) - 1 12261 v.AddArg(v0) 12262 return true 12263 } 12264 // match: (Mod8u <t> x (Const8 [c])) 12265 // cond: x.Op != OpConst8 && c > 0 && umagicOK(8 ,c) 12266 // result: (Sub8 x (Mul8 <t> (Div8u <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 12267 for { 12268 t := v.Type 12269 _ = v.Args[1] 12270 x := v.Args[0] 12271 v_1 := v.Args[1] 12272 if v_1.Op != OpConst8 { 12273 break 12274 } 12275 c := v_1.AuxInt 12276 if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { 12277 break 12278 } 12279 v.reset(OpSub8) 12280 v.AddArg(x) 12281 v0 := b.NewValue0(v.Pos, OpMul8, t) 12282 v1 := b.NewValue0(v.Pos, OpDiv8u, t) 12283 v1.AddArg(x) 12284 v2 := b.NewValue0(v.Pos, OpConst8, t) 12285 v2.AuxInt = c 12286 v1.AddArg(v2) 12287 v0.AddArg(v1) 12288 v3 := b.NewValue0(v.Pos, OpConst8, t) 12289 v3.AuxInt = c 12290 v0.AddArg(v3) 12291 v.AddArg(v0) 12292 return true 12293 } 12294 return false 12295 } 12296 func rewriteValuegeneric_OpMul16_0(v *Value) bool { 12297 b := v.Block 12298 _ = b 12299 typ := &b.Func.Config.Types 12300 _ = typ 12301 // match: (Mul16 (Const16 [c]) (Const16 [d])) 12302 // cond: 12303 // result: (Const16 [int64(int16(c*d))]) 12304 for { 12305 _ = v.Args[1] 12306 v_0 := v.Args[0] 12307 if v_0.Op != OpConst16 { 12308 break 12309 } 12310 c := v_0.AuxInt 12311 v_1 := v.Args[1] 12312 if v_1.Op != OpConst16 { 12313 break 12314 } 12315 d := v_1.AuxInt 12316 v.reset(OpConst16) 12317 v.AuxInt = int64(int16(c * d)) 12318 return true 12319 } 12320 // match: (Mul16 (Const16 [d]) (Const16 [c])) 12321 // cond: 12322 // result: (Const16 [int64(int16(c*d))]) 12323 for { 12324 _ = v.Args[1] 12325 v_0 := v.Args[0] 12326 if v_0.Op != OpConst16 { 12327 break 12328 } 12329 d := v_0.AuxInt 12330 v_1 := v.Args[1] 12331 if v_1.Op != OpConst16 { 12332 break 12333 } 12334 c := v_1.AuxInt 12335 v.reset(OpConst16) 12336 v.AuxInt = int64(int16(c * d)) 12337 return true 12338 } 12339 // match: (Mul16 (Const16 [1]) x) 12340 // cond: 12341 // result: x 12342 for { 12343 _ = v.Args[1] 12344 v_0 := v.Args[0] 12345 if v_0.Op != OpConst16 { 12346 break 12347 } 12348 if v_0.AuxInt != 1 { 12349 break 12350 } 12351 x := v.Args[1] 12352 v.reset(OpCopy) 12353 v.Type = x.Type 12354 v.AddArg(x) 12355 return true 12356 } 12357 // match: (Mul16 x (Const16 [1])) 12358 // cond: 12359 // result: x 12360 for { 12361 _ = v.Args[1] 12362 x := v.Args[0] 12363 v_1 := v.Args[1] 12364 if v_1.Op != OpConst16 { 12365 break 12366 } 12367 if v_1.AuxInt != 1 { 12368 break 12369 } 12370 v.reset(OpCopy) 12371 v.Type = x.Type 12372 v.AddArg(x) 12373 return true 12374 } 12375 // match: (Mul16 (Const16 [-1]) x) 12376 // cond: 12377 // result: (Neg16 x) 12378 for { 12379 _ = v.Args[1] 12380 v_0 := v.Args[0] 12381 if v_0.Op != OpConst16 { 12382 break 12383 } 12384 if v_0.AuxInt != -1 { 12385 break 12386 } 12387 x := v.Args[1] 12388 v.reset(OpNeg16) 12389 v.AddArg(x) 12390 return true 12391 } 12392 // match: (Mul16 x (Const16 [-1])) 12393 // cond: 12394 // result: (Neg16 x) 12395 for { 12396 _ = v.Args[1] 12397 x := v.Args[0] 12398 v_1 := v.Args[1] 12399 if v_1.Op != OpConst16 { 12400 break 12401 } 12402 if v_1.AuxInt != -1 { 12403 break 12404 } 12405 v.reset(OpNeg16) 12406 v.AddArg(x) 12407 return true 12408 } 12409 // match: (Mul16 <t> n (Const16 [c])) 12410 // cond: isPowerOfTwo(c) 12411 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 12412 for { 12413 t := v.Type 12414 _ = v.Args[1] 12415 n := v.Args[0] 12416 v_1 := v.Args[1] 12417 if v_1.Op != OpConst16 { 12418 break 12419 } 12420 c := v_1.AuxInt 12421 if !(isPowerOfTwo(c)) { 12422 break 12423 } 12424 v.reset(OpLsh16x64) 12425 v.Type = t 12426 v.AddArg(n) 12427 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12428 v0.AuxInt = log2(c) 12429 v.AddArg(v0) 12430 return true 12431 } 12432 // match: (Mul16 <t> (Const16 [c]) n) 12433 // cond: isPowerOfTwo(c) 12434 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 12435 for { 12436 t := v.Type 12437 _ = v.Args[1] 12438 v_0 := v.Args[0] 12439 if v_0.Op != OpConst16 { 12440 break 12441 } 12442 c := v_0.AuxInt 12443 n := v.Args[1] 12444 if !(isPowerOfTwo(c)) { 12445 break 12446 } 12447 v.reset(OpLsh16x64) 12448 v.Type = t 12449 v.AddArg(n) 12450 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12451 v0.AuxInt = log2(c) 12452 v.AddArg(v0) 12453 return true 12454 } 12455 // match: (Mul16 <t> n (Const16 [c])) 12456 // cond: t.IsSigned() && isPowerOfTwo(-c) 12457 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 12458 for { 12459 t := v.Type 12460 _ = v.Args[1] 12461 n := v.Args[0] 12462 v_1 := v.Args[1] 12463 if v_1.Op != OpConst16 { 12464 break 12465 } 12466 c := v_1.AuxInt 12467 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12468 break 12469 } 12470 v.reset(OpNeg16) 12471 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 12472 v0.AddArg(n) 12473 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12474 v1.AuxInt = log2(-c) 12475 v0.AddArg(v1) 12476 v.AddArg(v0) 12477 return true 12478 } 12479 // match: (Mul16 <t> (Const16 [c]) n) 12480 // cond: t.IsSigned() && isPowerOfTwo(-c) 12481 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 12482 for { 12483 t := v.Type 12484 _ = v.Args[1] 12485 v_0 := v.Args[0] 12486 if v_0.Op != OpConst16 { 12487 break 12488 } 12489 c := v_0.AuxInt 12490 n := v.Args[1] 12491 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12492 break 12493 } 12494 v.reset(OpNeg16) 12495 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 12496 v0.AddArg(n) 12497 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12498 v1.AuxInt = log2(-c) 12499 v0.AddArg(v1) 12500 v.AddArg(v0) 12501 return true 12502 } 12503 return false 12504 } 12505 func rewriteValuegeneric_OpMul16_10(v *Value) bool { 12506 b := v.Block 12507 _ = b 12508 // match: (Mul16 (Const16 [0]) _) 12509 // cond: 12510 // result: (Const16 [0]) 12511 for { 12512 _ = v.Args[1] 12513 v_0 := v.Args[0] 12514 if v_0.Op != OpConst16 { 12515 break 12516 } 12517 if v_0.AuxInt != 0 { 12518 break 12519 } 12520 v.reset(OpConst16) 12521 v.AuxInt = 0 12522 return true 12523 } 12524 // match: (Mul16 _ (Const16 [0])) 12525 // cond: 12526 // result: (Const16 [0]) 12527 for { 12528 _ = v.Args[1] 12529 v_1 := v.Args[1] 12530 if v_1.Op != OpConst16 { 12531 break 12532 } 12533 if v_1.AuxInt != 0 { 12534 break 12535 } 12536 v.reset(OpConst16) 12537 v.AuxInt = 0 12538 return true 12539 } 12540 // match: (Mul16 (Const16 <t> [c]) (Mul16 (Const16 <t> [d]) x)) 12541 // cond: 12542 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 12543 for { 12544 _ = v.Args[1] 12545 v_0 := v.Args[0] 12546 if v_0.Op != OpConst16 { 12547 break 12548 } 12549 t := v_0.Type 12550 c := v_0.AuxInt 12551 v_1 := v.Args[1] 12552 if v_1.Op != OpMul16 { 12553 break 12554 } 12555 _ = v_1.Args[1] 12556 v_1_0 := v_1.Args[0] 12557 if v_1_0.Op != OpConst16 { 12558 break 12559 } 12560 if v_1_0.Type != t { 12561 break 12562 } 12563 d := v_1_0.AuxInt 12564 x := v_1.Args[1] 12565 v.reset(OpMul16) 12566 v0 := b.NewValue0(v.Pos, OpConst16, t) 12567 v0.AuxInt = int64(int16(c * d)) 12568 v.AddArg(v0) 12569 v.AddArg(x) 12570 return true 12571 } 12572 // match: (Mul16 (Const16 <t> [c]) (Mul16 x (Const16 <t> [d]))) 12573 // cond: 12574 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 12575 for { 12576 _ = v.Args[1] 12577 v_0 := v.Args[0] 12578 if v_0.Op != OpConst16 { 12579 break 12580 } 12581 t := v_0.Type 12582 c := v_0.AuxInt 12583 v_1 := v.Args[1] 12584 if v_1.Op != OpMul16 { 12585 break 12586 } 12587 _ = v_1.Args[1] 12588 x := v_1.Args[0] 12589 v_1_1 := v_1.Args[1] 12590 if v_1_1.Op != OpConst16 { 12591 break 12592 } 12593 if v_1_1.Type != t { 12594 break 12595 } 12596 d := v_1_1.AuxInt 12597 v.reset(OpMul16) 12598 v0 := b.NewValue0(v.Pos, OpConst16, t) 12599 v0.AuxInt = int64(int16(c * d)) 12600 v.AddArg(v0) 12601 v.AddArg(x) 12602 return true 12603 } 12604 // match: (Mul16 (Mul16 (Const16 <t> [d]) x) (Const16 <t> [c])) 12605 // cond: 12606 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 12607 for { 12608 _ = v.Args[1] 12609 v_0 := v.Args[0] 12610 if v_0.Op != OpMul16 { 12611 break 12612 } 12613 _ = v_0.Args[1] 12614 v_0_0 := v_0.Args[0] 12615 if v_0_0.Op != OpConst16 { 12616 break 12617 } 12618 t := v_0_0.Type 12619 d := v_0_0.AuxInt 12620 x := v_0.Args[1] 12621 v_1 := v.Args[1] 12622 if v_1.Op != OpConst16 { 12623 break 12624 } 12625 if v_1.Type != t { 12626 break 12627 } 12628 c := v_1.AuxInt 12629 v.reset(OpMul16) 12630 v0 := b.NewValue0(v.Pos, OpConst16, t) 12631 v0.AuxInt = int64(int16(c * d)) 12632 v.AddArg(v0) 12633 v.AddArg(x) 12634 return true 12635 } 12636 // match: (Mul16 (Mul16 x (Const16 <t> [d])) (Const16 <t> [c])) 12637 // cond: 12638 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 12639 for { 12640 _ = v.Args[1] 12641 v_0 := v.Args[0] 12642 if v_0.Op != OpMul16 { 12643 break 12644 } 12645 _ = v_0.Args[1] 12646 x := v_0.Args[0] 12647 v_0_1 := v_0.Args[1] 12648 if v_0_1.Op != OpConst16 { 12649 break 12650 } 12651 t := v_0_1.Type 12652 d := v_0_1.AuxInt 12653 v_1 := v.Args[1] 12654 if v_1.Op != OpConst16 { 12655 break 12656 } 12657 if v_1.Type != t { 12658 break 12659 } 12660 c := v_1.AuxInt 12661 v.reset(OpMul16) 12662 v0 := b.NewValue0(v.Pos, OpConst16, t) 12663 v0.AuxInt = int64(int16(c * d)) 12664 v.AddArg(v0) 12665 v.AddArg(x) 12666 return true 12667 } 12668 return false 12669 } 12670 func rewriteValuegeneric_OpMul32_0(v *Value) bool { 12671 b := v.Block 12672 _ = b 12673 typ := &b.Func.Config.Types 12674 _ = typ 12675 // match: (Mul32 (Const32 [c]) (Const32 [d])) 12676 // cond: 12677 // result: (Const32 [int64(int32(c*d))]) 12678 for { 12679 _ = v.Args[1] 12680 v_0 := v.Args[0] 12681 if v_0.Op != OpConst32 { 12682 break 12683 } 12684 c := v_0.AuxInt 12685 v_1 := v.Args[1] 12686 if v_1.Op != OpConst32 { 12687 break 12688 } 12689 d := v_1.AuxInt 12690 v.reset(OpConst32) 12691 v.AuxInt = int64(int32(c * d)) 12692 return true 12693 } 12694 // match: (Mul32 (Const32 [d]) (Const32 [c])) 12695 // cond: 12696 // result: (Const32 [int64(int32(c*d))]) 12697 for { 12698 _ = v.Args[1] 12699 v_0 := v.Args[0] 12700 if v_0.Op != OpConst32 { 12701 break 12702 } 12703 d := v_0.AuxInt 12704 v_1 := v.Args[1] 12705 if v_1.Op != OpConst32 { 12706 break 12707 } 12708 c := v_1.AuxInt 12709 v.reset(OpConst32) 12710 v.AuxInt = int64(int32(c * d)) 12711 return true 12712 } 12713 // match: (Mul32 (Const32 [1]) x) 12714 // cond: 12715 // result: x 12716 for { 12717 _ = v.Args[1] 12718 v_0 := v.Args[0] 12719 if v_0.Op != OpConst32 { 12720 break 12721 } 12722 if v_0.AuxInt != 1 { 12723 break 12724 } 12725 x := v.Args[1] 12726 v.reset(OpCopy) 12727 v.Type = x.Type 12728 v.AddArg(x) 12729 return true 12730 } 12731 // match: (Mul32 x (Const32 [1])) 12732 // cond: 12733 // result: x 12734 for { 12735 _ = v.Args[1] 12736 x := v.Args[0] 12737 v_1 := v.Args[1] 12738 if v_1.Op != OpConst32 { 12739 break 12740 } 12741 if v_1.AuxInt != 1 { 12742 break 12743 } 12744 v.reset(OpCopy) 12745 v.Type = x.Type 12746 v.AddArg(x) 12747 return true 12748 } 12749 // match: (Mul32 (Const32 [-1]) x) 12750 // cond: 12751 // result: (Neg32 x) 12752 for { 12753 _ = v.Args[1] 12754 v_0 := v.Args[0] 12755 if v_0.Op != OpConst32 { 12756 break 12757 } 12758 if v_0.AuxInt != -1 { 12759 break 12760 } 12761 x := v.Args[1] 12762 v.reset(OpNeg32) 12763 v.AddArg(x) 12764 return true 12765 } 12766 // match: (Mul32 x (Const32 [-1])) 12767 // cond: 12768 // result: (Neg32 x) 12769 for { 12770 _ = v.Args[1] 12771 x := v.Args[0] 12772 v_1 := v.Args[1] 12773 if v_1.Op != OpConst32 { 12774 break 12775 } 12776 if v_1.AuxInt != -1 { 12777 break 12778 } 12779 v.reset(OpNeg32) 12780 v.AddArg(x) 12781 return true 12782 } 12783 // match: (Mul32 <t> n (Const32 [c])) 12784 // cond: isPowerOfTwo(c) 12785 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 12786 for { 12787 t := v.Type 12788 _ = v.Args[1] 12789 n := v.Args[0] 12790 v_1 := v.Args[1] 12791 if v_1.Op != OpConst32 { 12792 break 12793 } 12794 c := v_1.AuxInt 12795 if !(isPowerOfTwo(c)) { 12796 break 12797 } 12798 v.reset(OpLsh32x64) 12799 v.Type = t 12800 v.AddArg(n) 12801 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12802 v0.AuxInt = log2(c) 12803 v.AddArg(v0) 12804 return true 12805 } 12806 // match: (Mul32 <t> (Const32 [c]) n) 12807 // cond: isPowerOfTwo(c) 12808 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 12809 for { 12810 t := v.Type 12811 _ = v.Args[1] 12812 v_0 := v.Args[0] 12813 if v_0.Op != OpConst32 { 12814 break 12815 } 12816 c := v_0.AuxInt 12817 n := v.Args[1] 12818 if !(isPowerOfTwo(c)) { 12819 break 12820 } 12821 v.reset(OpLsh32x64) 12822 v.Type = t 12823 v.AddArg(n) 12824 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12825 v0.AuxInt = log2(c) 12826 v.AddArg(v0) 12827 return true 12828 } 12829 // match: (Mul32 <t> n (Const32 [c])) 12830 // cond: t.IsSigned() && isPowerOfTwo(-c) 12831 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 12832 for { 12833 t := v.Type 12834 _ = v.Args[1] 12835 n := v.Args[0] 12836 v_1 := v.Args[1] 12837 if v_1.Op != OpConst32 { 12838 break 12839 } 12840 c := v_1.AuxInt 12841 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12842 break 12843 } 12844 v.reset(OpNeg32) 12845 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 12846 v0.AddArg(n) 12847 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12848 v1.AuxInt = log2(-c) 12849 v0.AddArg(v1) 12850 v.AddArg(v0) 12851 return true 12852 } 12853 // match: (Mul32 <t> (Const32 [c]) n) 12854 // cond: t.IsSigned() && isPowerOfTwo(-c) 12855 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 12856 for { 12857 t := v.Type 12858 _ = v.Args[1] 12859 v_0 := v.Args[0] 12860 if v_0.Op != OpConst32 { 12861 break 12862 } 12863 c := v_0.AuxInt 12864 n := v.Args[1] 12865 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12866 break 12867 } 12868 v.reset(OpNeg32) 12869 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 12870 v0.AddArg(n) 12871 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12872 v1.AuxInt = log2(-c) 12873 v0.AddArg(v1) 12874 v.AddArg(v0) 12875 return true 12876 } 12877 return false 12878 } 12879 func rewriteValuegeneric_OpMul32_10(v *Value) bool { 12880 b := v.Block 12881 _ = b 12882 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x)) 12883 // cond: 12884 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12885 for { 12886 _ = v.Args[1] 12887 v_0 := v.Args[0] 12888 if v_0.Op != OpConst32 { 12889 break 12890 } 12891 t := v_0.Type 12892 c := v_0.AuxInt 12893 v_1 := v.Args[1] 12894 if v_1.Op != OpAdd32 { 12895 break 12896 } 12897 if v_1.Type != t { 12898 break 12899 } 12900 _ = v_1.Args[1] 12901 v_1_0 := v_1.Args[0] 12902 if v_1_0.Op != OpConst32 { 12903 break 12904 } 12905 if v_1_0.Type != t { 12906 break 12907 } 12908 d := v_1_0.AuxInt 12909 x := v_1.Args[1] 12910 v.reset(OpAdd32) 12911 v0 := b.NewValue0(v.Pos, OpConst32, t) 12912 v0.AuxInt = int64(int32(c * d)) 12913 v.AddArg(v0) 12914 v1 := b.NewValue0(v.Pos, OpMul32, t) 12915 v2 := b.NewValue0(v.Pos, OpConst32, t) 12916 v2.AuxInt = c 12917 v1.AddArg(v2) 12918 v1.AddArg(x) 12919 v.AddArg(v1) 12920 return true 12921 } 12922 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> x (Const32 <t> [d]))) 12923 // cond: 12924 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12925 for { 12926 _ = v.Args[1] 12927 v_0 := v.Args[0] 12928 if v_0.Op != OpConst32 { 12929 break 12930 } 12931 t := v_0.Type 12932 c := v_0.AuxInt 12933 v_1 := v.Args[1] 12934 if v_1.Op != OpAdd32 { 12935 break 12936 } 12937 if v_1.Type != t { 12938 break 12939 } 12940 _ = v_1.Args[1] 12941 x := v_1.Args[0] 12942 v_1_1 := v_1.Args[1] 12943 if v_1_1.Op != OpConst32 { 12944 break 12945 } 12946 if v_1_1.Type != t { 12947 break 12948 } 12949 d := v_1_1.AuxInt 12950 v.reset(OpAdd32) 12951 v0 := b.NewValue0(v.Pos, OpConst32, t) 12952 v0.AuxInt = int64(int32(c * d)) 12953 v.AddArg(v0) 12954 v1 := b.NewValue0(v.Pos, OpMul32, t) 12955 v2 := b.NewValue0(v.Pos, OpConst32, t) 12956 v2.AuxInt = c 12957 v1.AddArg(v2) 12958 v1.AddArg(x) 12959 v.AddArg(v1) 12960 return true 12961 } 12962 // match: (Mul32 (Add32 <t> (Const32 <t> [d]) x) (Const32 <t> [c])) 12963 // cond: 12964 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12965 for { 12966 _ = v.Args[1] 12967 v_0 := v.Args[0] 12968 if v_0.Op != OpAdd32 { 12969 break 12970 } 12971 t := v_0.Type 12972 _ = v_0.Args[1] 12973 v_0_0 := v_0.Args[0] 12974 if v_0_0.Op != OpConst32 { 12975 break 12976 } 12977 if v_0_0.Type != t { 12978 break 12979 } 12980 d := v_0_0.AuxInt 12981 x := v_0.Args[1] 12982 v_1 := v.Args[1] 12983 if v_1.Op != OpConst32 { 12984 break 12985 } 12986 if v_1.Type != t { 12987 break 12988 } 12989 c := v_1.AuxInt 12990 v.reset(OpAdd32) 12991 v0 := b.NewValue0(v.Pos, OpConst32, t) 12992 v0.AuxInt = int64(int32(c * d)) 12993 v.AddArg(v0) 12994 v1 := b.NewValue0(v.Pos, OpMul32, t) 12995 v2 := b.NewValue0(v.Pos, OpConst32, t) 12996 v2.AuxInt = c 12997 v1.AddArg(v2) 12998 v1.AddArg(x) 12999 v.AddArg(v1) 13000 return true 13001 } 13002 // match: (Mul32 (Add32 <t> x (Const32 <t> [d])) (Const32 <t> [c])) 13003 // cond: 13004 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 13005 for { 13006 _ = v.Args[1] 13007 v_0 := v.Args[0] 13008 if v_0.Op != OpAdd32 { 13009 break 13010 } 13011 t := v_0.Type 13012 _ = v_0.Args[1] 13013 x := v_0.Args[0] 13014 v_0_1 := v_0.Args[1] 13015 if v_0_1.Op != OpConst32 { 13016 break 13017 } 13018 if v_0_1.Type != t { 13019 break 13020 } 13021 d := v_0_1.AuxInt 13022 v_1 := v.Args[1] 13023 if v_1.Op != OpConst32 { 13024 break 13025 } 13026 if v_1.Type != t { 13027 break 13028 } 13029 c := v_1.AuxInt 13030 v.reset(OpAdd32) 13031 v0 := b.NewValue0(v.Pos, OpConst32, t) 13032 v0.AuxInt = int64(int32(c * d)) 13033 v.AddArg(v0) 13034 v1 := b.NewValue0(v.Pos, OpMul32, t) 13035 v2 := b.NewValue0(v.Pos, OpConst32, t) 13036 v2.AuxInt = c 13037 v1.AddArg(v2) 13038 v1.AddArg(x) 13039 v.AddArg(v1) 13040 return true 13041 } 13042 // match: (Mul32 (Const32 [0]) _) 13043 // cond: 13044 // result: (Const32 [0]) 13045 for { 13046 _ = v.Args[1] 13047 v_0 := v.Args[0] 13048 if v_0.Op != OpConst32 { 13049 break 13050 } 13051 if v_0.AuxInt != 0 { 13052 break 13053 } 13054 v.reset(OpConst32) 13055 v.AuxInt = 0 13056 return true 13057 } 13058 // match: (Mul32 _ (Const32 [0])) 13059 // cond: 13060 // result: (Const32 [0]) 13061 for { 13062 _ = v.Args[1] 13063 v_1 := v.Args[1] 13064 if v_1.Op != OpConst32 { 13065 break 13066 } 13067 if v_1.AuxInt != 0 { 13068 break 13069 } 13070 v.reset(OpConst32) 13071 v.AuxInt = 0 13072 return true 13073 } 13074 // match: (Mul32 (Const32 <t> [c]) (Mul32 (Const32 <t> [d]) x)) 13075 // cond: 13076 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 13077 for { 13078 _ = v.Args[1] 13079 v_0 := v.Args[0] 13080 if v_0.Op != OpConst32 { 13081 break 13082 } 13083 t := v_0.Type 13084 c := v_0.AuxInt 13085 v_1 := v.Args[1] 13086 if v_1.Op != OpMul32 { 13087 break 13088 } 13089 _ = v_1.Args[1] 13090 v_1_0 := v_1.Args[0] 13091 if v_1_0.Op != OpConst32 { 13092 break 13093 } 13094 if v_1_0.Type != t { 13095 break 13096 } 13097 d := v_1_0.AuxInt 13098 x := v_1.Args[1] 13099 v.reset(OpMul32) 13100 v0 := b.NewValue0(v.Pos, OpConst32, t) 13101 v0.AuxInt = int64(int32(c * d)) 13102 v.AddArg(v0) 13103 v.AddArg(x) 13104 return true 13105 } 13106 // match: (Mul32 (Const32 <t> [c]) (Mul32 x (Const32 <t> [d]))) 13107 // cond: 13108 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 13109 for { 13110 _ = v.Args[1] 13111 v_0 := v.Args[0] 13112 if v_0.Op != OpConst32 { 13113 break 13114 } 13115 t := v_0.Type 13116 c := v_0.AuxInt 13117 v_1 := v.Args[1] 13118 if v_1.Op != OpMul32 { 13119 break 13120 } 13121 _ = v_1.Args[1] 13122 x := v_1.Args[0] 13123 v_1_1 := v_1.Args[1] 13124 if v_1_1.Op != OpConst32 { 13125 break 13126 } 13127 if v_1_1.Type != t { 13128 break 13129 } 13130 d := v_1_1.AuxInt 13131 v.reset(OpMul32) 13132 v0 := b.NewValue0(v.Pos, OpConst32, t) 13133 v0.AuxInt = int64(int32(c * d)) 13134 v.AddArg(v0) 13135 v.AddArg(x) 13136 return true 13137 } 13138 // match: (Mul32 (Mul32 (Const32 <t> [d]) x) (Const32 <t> [c])) 13139 // cond: 13140 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 13141 for { 13142 _ = v.Args[1] 13143 v_0 := v.Args[0] 13144 if v_0.Op != OpMul32 { 13145 break 13146 } 13147 _ = v_0.Args[1] 13148 v_0_0 := v_0.Args[0] 13149 if v_0_0.Op != OpConst32 { 13150 break 13151 } 13152 t := v_0_0.Type 13153 d := v_0_0.AuxInt 13154 x := v_0.Args[1] 13155 v_1 := v.Args[1] 13156 if v_1.Op != OpConst32 { 13157 break 13158 } 13159 if v_1.Type != t { 13160 break 13161 } 13162 c := v_1.AuxInt 13163 v.reset(OpMul32) 13164 v0 := b.NewValue0(v.Pos, OpConst32, t) 13165 v0.AuxInt = int64(int32(c * d)) 13166 v.AddArg(v0) 13167 v.AddArg(x) 13168 return true 13169 } 13170 // match: (Mul32 (Mul32 x (Const32 <t> [d])) (Const32 <t> [c])) 13171 // cond: 13172 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 13173 for { 13174 _ = v.Args[1] 13175 v_0 := v.Args[0] 13176 if v_0.Op != OpMul32 { 13177 break 13178 } 13179 _ = v_0.Args[1] 13180 x := v_0.Args[0] 13181 v_0_1 := v_0.Args[1] 13182 if v_0_1.Op != OpConst32 { 13183 break 13184 } 13185 t := v_0_1.Type 13186 d := v_0_1.AuxInt 13187 v_1 := v.Args[1] 13188 if v_1.Op != OpConst32 { 13189 break 13190 } 13191 if v_1.Type != t { 13192 break 13193 } 13194 c := v_1.AuxInt 13195 v.reset(OpMul32) 13196 v0 := b.NewValue0(v.Pos, OpConst32, t) 13197 v0.AuxInt = int64(int32(c * d)) 13198 v.AddArg(v0) 13199 v.AddArg(x) 13200 return true 13201 } 13202 return false 13203 } 13204 func rewriteValuegeneric_OpMul32F_0(v *Value) bool { 13205 // match: (Mul32F (Const32F [c]) (Const32F [d])) 13206 // cond: 13207 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 13208 for { 13209 _ = v.Args[1] 13210 v_0 := v.Args[0] 13211 if v_0.Op != OpConst32F { 13212 break 13213 } 13214 c := v_0.AuxInt 13215 v_1 := v.Args[1] 13216 if v_1.Op != OpConst32F { 13217 break 13218 } 13219 d := v_1.AuxInt 13220 v.reset(OpConst32F) 13221 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 13222 return true 13223 } 13224 // match: (Mul32F (Const32F [d]) (Const32F [c])) 13225 // cond: 13226 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 13227 for { 13228 _ = v.Args[1] 13229 v_0 := v.Args[0] 13230 if v_0.Op != OpConst32F { 13231 break 13232 } 13233 d := v_0.AuxInt 13234 v_1 := v.Args[1] 13235 if v_1.Op != OpConst32F { 13236 break 13237 } 13238 c := v_1.AuxInt 13239 v.reset(OpConst32F) 13240 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 13241 return true 13242 } 13243 // match: (Mul32F x (Const32F [f2i(1)])) 13244 // cond: 13245 // result: x 13246 for { 13247 _ = v.Args[1] 13248 x := v.Args[0] 13249 v_1 := v.Args[1] 13250 if v_1.Op != OpConst32F { 13251 break 13252 } 13253 if v_1.AuxInt != f2i(1) { 13254 break 13255 } 13256 v.reset(OpCopy) 13257 v.Type = x.Type 13258 v.AddArg(x) 13259 return true 13260 } 13261 // match: (Mul32F (Const32F [f2i(1)]) x) 13262 // cond: 13263 // result: x 13264 for { 13265 _ = v.Args[1] 13266 v_0 := v.Args[0] 13267 if v_0.Op != OpConst32F { 13268 break 13269 } 13270 if v_0.AuxInt != f2i(1) { 13271 break 13272 } 13273 x := v.Args[1] 13274 v.reset(OpCopy) 13275 v.Type = x.Type 13276 v.AddArg(x) 13277 return true 13278 } 13279 // match: (Mul32F x (Const32F [f2i(-1)])) 13280 // cond: 13281 // result: (Neg32F x) 13282 for { 13283 _ = v.Args[1] 13284 x := v.Args[0] 13285 v_1 := v.Args[1] 13286 if v_1.Op != OpConst32F { 13287 break 13288 } 13289 if v_1.AuxInt != f2i(-1) { 13290 break 13291 } 13292 v.reset(OpNeg32F) 13293 v.AddArg(x) 13294 return true 13295 } 13296 // match: (Mul32F (Const32F [f2i(-1)]) x) 13297 // cond: 13298 // result: (Neg32F x) 13299 for { 13300 _ = v.Args[1] 13301 v_0 := v.Args[0] 13302 if v_0.Op != OpConst32F { 13303 break 13304 } 13305 if v_0.AuxInt != f2i(-1) { 13306 break 13307 } 13308 x := v.Args[1] 13309 v.reset(OpNeg32F) 13310 v.AddArg(x) 13311 return true 13312 } 13313 // match: (Mul32F x (Const32F [f2i(2)])) 13314 // cond: 13315 // result: (Add32F x x) 13316 for { 13317 _ = v.Args[1] 13318 x := v.Args[0] 13319 v_1 := v.Args[1] 13320 if v_1.Op != OpConst32F { 13321 break 13322 } 13323 if v_1.AuxInt != f2i(2) { 13324 break 13325 } 13326 v.reset(OpAdd32F) 13327 v.AddArg(x) 13328 v.AddArg(x) 13329 return true 13330 } 13331 // match: (Mul32F (Const32F [f2i(2)]) x) 13332 // cond: 13333 // result: (Add32F x x) 13334 for { 13335 _ = v.Args[1] 13336 v_0 := v.Args[0] 13337 if v_0.Op != OpConst32F { 13338 break 13339 } 13340 if v_0.AuxInt != f2i(2) { 13341 break 13342 } 13343 x := v.Args[1] 13344 v.reset(OpAdd32F) 13345 v.AddArg(x) 13346 v.AddArg(x) 13347 return true 13348 } 13349 return false 13350 } 13351 func rewriteValuegeneric_OpMul64_0(v *Value) bool { 13352 b := v.Block 13353 _ = b 13354 typ := &b.Func.Config.Types 13355 _ = typ 13356 // match: (Mul64 (Const64 [c]) (Const64 [d])) 13357 // cond: 13358 // result: (Const64 [c*d]) 13359 for { 13360 _ = v.Args[1] 13361 v_0 := v.Args[0] 13362 if v_0.Op != OpConst64 { 13363 break 13364 } 13365 c := v_0.AuxInt 13366 v_1 := v.Args[1] 13367 if v_1.Op != OpConst64 { 13368 break 13369 } 13370 d := v_1.AuxInt 13371 v.reset(OpConst64) 13372 v.AuxInt = c * d 13373 return true 13374 } 13375 // match: (Mul64 (Const64 [d]) (Const64 [c])) 13376 // cond: 13377 // result: (Const64 [c*d]) 13378 for { 13379 _ = v.Args[1] 13380 v_0 := v.Args[0] 13381 if v_0.Op != OpConst64 { 13382 break 13383 } 13384 d := v_0.AuxInt 13385 v_1 := v.Args[1] 13386 if v_1.Op != OpConst64 { 13387 break 13388 } 13389 c := v_1.AuxInt 13390 v.reset(OpConst64) 13391 v.AuxInt = c * d 13392 return true 13393 } 13394 // match: (Mul64 (Const64 [1]) x) 13395 // cond: 13396 // result: x 13397 for { 13398 _ = v.Args[1] 13399 v_0 := v.Args[0] 13400 if v_0.Op != OpConst64 { 13401 break 13402 } 13403 if v_0.AuxInt != 1 { 13404 break 13405 } 13406 x := v.Args[1] 13407 v.reset(OpCopy) 13408 v.Type = x.Type 13409 v.AddArg(x) 13410 return true 13411 } 13412 // match: (Mul64 x (Const64 [1])) 13413 // cond: 13414 // result: x 13415 for { 13416 _ = v.Args[1] 13417 x := v.Args[0] 13418 v_1 := v.Args[1] 13419 if v_1.Op != OpConst64 { 13420 break 13421 } 13422 if v_1.AuxInt != 1 { 13423 break 13424 } 13425 v.reset(OpCopy) 13426 v.Type = x.Type 13427 v.AddArg(x) 13428 return true 13429 } 13430 // match: (Mul64 (Const64 [-1]) x) 13431 // cond: 13432 // result: (Neg64 x) 13433 for { 13434 _ = v.Args[1] 13435 v_0 := v.Args[0] 13436 if v_0.Op != OpConst64 { 13437 break 13438 } 13439 if v_0.AuxInt != -1 { 13440 break 13441 } 13442 x := v.Args[1] 13443 v.reset(OpNeg64) 13444 v.AddArg(x) 13445 return true 13446 } 13447 // match: (Mul64 x (Const64 [-1])) 13448 // cond: 13449 // result: (Neg64 x) 13450 for { 13451 _ = v.Args[1] 13452 x := v.Args[0] 13453 v_1 := v.Args[1] 13454 if v_1.Op != OpConst64 { 13455 break 13456 } 13457 if v_1.AuxInt != -1 { 13458 break 13459 } 13460 v.reset(OpNeg64) 13461 v.AddArg(x) 13462 return true 13463 } 13464 // match: (Mul64 <t> n (Const64 [c])) 13465 // cond: isPowerOfTwo(c) 13466 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 13467 for { 13468 t := v.Type 13469 _ = v.Args[1] 13470 n := v.Args[0] 13471 v_1 := v.Args[1] 13472 if v_1.Op != OpConst64 { 13473 break 13474 } 13475 c := v_1.AuxInt 13476 if !(isPowerOfTwo(c)) { 13477 break 13478 } 13479 v.reset(OpLsh64x64) 13480 v.Type = t 13481 v.AddArg(n) 13482 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13483 v0.AuxInt = log2(c) 13484 v.AddArg(v0) 13485 return true 13486 } 13487 // match: (Mul64 <t> (Const64 [c]) n) 13488 // cond: isPowerOfTwo(c) 13489 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 13490 for { 13491 t := v.Type 13492 _ = v.Args[1] 13493 v_0 := v.Args[0] 13494 if v_0.Op != OpConst64 { 13495 break 13496 } 13497 c := v_0.AuxInt 13498 n := v.Args[1] 13499 if !(isPowerOfTwo(c)) { 13500 break 13501 } 13502 v.reset(OpLsh64x64) 13503 v.Type = t 13504 v.AddArg(n) 13505 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13506 v0.AuxInt = log2(c) 13507 v.AddArg(v0) 13508 return true 13509 } 13510 // match: (Mul64 <t> n (Const64 [c])) 13511 // cond: t.IsSigned() && isPowerOfTwo(-c) 13512 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 13513 for { 13514 t := v.Type 13515 _ = v.Args[1] 13516 n := v.Args[0] 13517 v_1 := v.Args[1] 13518 if v_1.Op != OpConst64 { 13519 break 13520 } 13521 c := v_1.AuxInt 13522 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13523 break 13524 } 13525 v.reset(OpNeg64) 13526 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 13527 v0.AddArg(n) 13528 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13529 v1.AuxInt = log2(-c) 13530 v0.AddArg(v1) 13531 v.AddArg(v0) 13532 return true 13533 } 13534 // match: (Mul64 <t> (Const64 [c]) n) 13535 // cond: t.IsSigned() && isPowerOfTwo(-c) 13536 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 13537 for { 13538 t := v.Type 13539 _ = v.Args[1] 13540 v_0 := v.Args[0] 13541 if v_0.Op != OpConst64 { 13542 break 13543 } 13544 c := v_0.AuxInt 13545 n := v.Args[1] 13546 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13547 break 13548 } 13549 v.reset(OpNeg64) 13550 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 13551 v0.AddArg(n) 13552 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13553 v1.AuxInt = log2(-c) 13554 v0.AddArg(v1) 13555 v.AddArg(v0) 13556 return true 13557 } 13558 return false 13559 } 13560 func rewriteValuegeneric_OpMul64_10(v *Value) bool { 13561 b := v.Block 13562 _ = b 13563 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x)) 13564 // cond: 13565 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 13566 for { 13567 _ = v.Args[1] 13568 v_0 := v.Args[0] 13569 if v_0.Op != OpConst64 { 13570 break 13571 } 13572 t := v_0.Type 13573 c := v_0.AuxInt 13574 v_1 := v.Args[1] 13575 if v_1.Op != OpAdd64 { 13576 break 13577 } 13578 if v_1.Type != t { 13579 break 13580 } 13581 _ = v_1.Args[1] 13582 v_1_0 := v_1.Args[0] 13583 if v_1_0.Op != OpConst64 { 13584 break 13585 } 13586 if v_1_0.Type != t { 13587 break 13588 } 13589 d := v_1_0.AuxInt 13590 x := v_1.Args[1] 13591 v.reset(OpAdd64) 13592 v0 := b.NewValue0(v.Pos, OpConst64, t) 13593 v0.AuxInt = c * d 13594 v.AddArg(v0) 13595 v1 := b.NewValue0(v.Pos, OpMul64, t) 13596 v2 := b.NewValue0(v.Pos, OpConst64, t) 13597 v2.AuxInt = c 13598 v1.AddArg(v2) 13599 v1.AddArg(x) 13600 v.AddArg(v1) 13601 return true 13602 } 13603 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> x (Const64 <t> [d]))) 13604 // cond: 13605 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 13606 for { 13607 _ = v.Args[1] 13608 v_0 := v.Args[0] 13609 if v_0.Op != OpConst64 { 13610 break 13611 } 13612 t := v_0.Type 13613 c := v_0.AuxInt 13614 v_1 := v.Args[1] 13615 if v_1.Op != OpAdd64 { 13616 break 13617 } 13618 if v_1.Type != t { 13619 break 13620 } 13621 _ = v_1.Args[1] 13622 x := v_1.Args[0] 13623 v_1_1 := v_1.Args[1] 13624 if v_1_1.Op != OpConst64 { 13625 break 13626 } 13627 if v_1_1.Type != t { 13628 break 13629 } 13630 d := v_1_1.AuxInt 13631 v.reset(OpAdd64) 13632 v0 := b.NewValue0(v.Pos, OpConst64, t) 13633 v0.AuxInt = c * d 13634 v.AddArg(v0) 13635 v1 := b.NewValue0(v.Pos, OpMul64, t) 13636 v2 := b.NewValue0(v.Pos, OpConst64, t) 13637 v2.AuxInt = c 13638 v1.AddArg(v2) 13639 v1.AddArg(x) 13640 v.AddArg(v1) 13641 return true 13642 } 13643 // match: (Mul64 (Add64 <t> (Const64 <t> [d]) x) (Const64 <t> [c])) 13644 // cond: 13645 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 13646 for { 13647 _ = v.Args[1] 13648 v_0 := v.Args[0] 13649 if v_0.Op != OpAdd64 { 13650 break 13651 } 13652 t := v_0.Type 13653 _ = v_0.Args[1] 13654 v_0_0 := v_0.Args[0] 13655 if v_0_0.Op != OpConst64 { 13656 break 13657 } 13658 if v_0_0.Type != t { 13659 break 13660 } 13661 d := v_0_0.AuxInt 13662 x := v_0.Args[1] 13663 v_1 := v.Args[1] 13664 if v_1.Op != OpConst64 { 13665 break 13666 } 13667 if v_1.Type != t { 13668 break 13669 } 13670 c := v_1.AuxInt 13671 v.reset(OpAdd64) 13672 v0 := b.NewValue0(v.Pos, OpConst64, t) 13673 v0.AuxInt = c * d 13674 v.AddArg(v0) 13675 v1 := b.NewValue0(v.Pos, OpMul64, t) 13676 v2 := b.NewValue0(v.Pos, OpConst64, t) 13677 v2.AuxInt = c 13678 v1.AddArg(v2) 13679 v1.AddArg(x) 13680 v.AddArg(v1) 13681 return true 13682 } 13683 // match: (Mul64 (Add64 <t> x (Const64 <t> [d])) (Const64 <t> [c])) 13684 // cond: 13685 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 13686 for { 13687 _ = v.Args[1] 13688 v_0 := v.Args[0] 13689 if v_0.Op != OpAdd64 { 13690 break 13691 } 13692 t := v_0.Type 13693 _ = v_0.Args[1] 13694 x := v_0.Args[0] 13695 v_0_1 := v_0.Args[1] 13696 if v_0_1.Op != OpConst64 { 13697 break 13698 } 13699 if v_0_1.Type != t { 13700 break 13701 } 13702 d := v_0_1.AuxInt 13703 v_1 := v.Args[1] 13704 if v_1.Op != OpConst64 { 13705 break 13706 } 13707 if v_1.Type != t { 13708 break 13709 } 13710 c := v_1.AuxInt 13711 v.reset(OpAdd64) 13712 v0 := b.NewValue0(v.Pos, OpConst64, t) 13713 v0.AuxInt = c * d 13714 v.AddArg(v0) 13715 v1 := b.NewValue0(v.Pos, OpMul64, t) 13716 v2 := b.NewValue0(v.Pos, OpConst64, t) 13717 v2.AuxInt = c 13718 v1.AddArg(v2) 13719 v1.AddArg(x) 13720 v.AddArg(v1) 13721 return true 13722 } 13723 // match: (Mul64 (Const64 [0]) _) 13724 // cond: 13725 // result: (Const64 [0]) 13726 for { 13727 _ = v.Args[1] 13728 v_0 := v.Args[0] 13729 if v_0.Op != OpConst64 { 13730 break 13731 } 13732 if v_0.AuxInt != 0 { 13733 break 13734 } 13735 v.reset(OpConst64) 13736 v.AuxInt = 0 13737 return true 13738 } 13739 // match: (Mul64 _ (Const64 [0])) 13740 // cond: 13741 // result: (Const64 [0]) 13742 for { 13743 _ = v.Args[1] 13744 v_1 := v.Args[1] 13745 if v_1.Op != OpConst64 { 13746 break 13747 } 13748 if v_1.AuxInt != 0 { 13749 break 13750 } 13751 v.reset(OpConst64) 13752 v.AuxInt = 0 13753 return true 13754 } 13755 // match: (Mul64 (Const64 <t> [c]) (Mul64 (Const64 <t> [d]) x)) 13756 // cond: 13757 // result: (Mul64 (Const64 <t> [c*d]) x) 13758 for { 13759 _ = v.Args[1] 13760 v_0 := v.Args[0] 13761 if v_0.Op != OpConst64 { 13762 break 13763 } 13764 t := v_0.Type 13765 c := v_0.AuxInt 13766 v_1 := v.Args[1] 13767 if v_1.Op != OpMul64 { 13768 break 13769 } 13770 _ = v_1.Args[1] 13771 v_1_0 := v_1.Args[0] 13772 if v_1_0.Op != OpConst64 { 13773 break 13774 } 13775 if v_1_0.Type != t { 13776 break 13777 } 13778 d := v_1_0.AuxInt 13779 x := v_1.Args[1] 13780 v.reset(OpMul64) 13781 v0 := b.NewValue0(v.Pos, OpConst64, t) 13782 v0.AuxInt = c * d 13783 v.AddArg(v0) 13784 v.AddArg(x) 13785 return true 13786 } 13787 // match: (Mul64 (Const64 <t> [c]) (Mul64 x (Const64 <t> [d]))) 13788 // cond: 13789 // result: (Mul64 (Const64 <t> [c*d]) x) 13790 for { 13791 _ = v.Args[1] 13792 v_0 := v.Args[0] 13793 if v_0.Op != OpConst64 { 13794 break 13795 } 13796 t := v_0.Type 13797 c := v_0.AuxInt 13798 v_1 := v.Args[1] 13799 if v_1.Op != OpMul64 { 13800 break 13801 } 13802 _ = v_1.Args[1] 13803 x := v_1.Args[0] 13804 v_1_1 := v_1.Args[1] 13805 if v_1_1.Op != OpConst64 { 13806 break 13807 } 13808 if v_1_1.Type != t { 13809 break 13810 } 13811 d := v_1_1.AuxInt 13812 v.reset(OpMul64) 13813 v0 := b.NewValue0(v.Pos, OpConst64, t) 13814 v0.AuxInt = c * d 13815 v.AddArg(v0) 13816 v.AddArg(x) 13817 return true 13818 } 13819 // match: (Mul64 (Mul64 (Const64 <t> [d]) x) (Const64 <t> [c])) 13820 // cond: 13821 // result: (Mul64 (Const64 <t> [c*d]) x) 13822 for { 13823 _ = v.Args[1] 13824 v_0 := v.Args[0] 13825 if v_0.Op != OpMul64 { 13826 break 13827 } 13828 _ = v_0.Args[1] 13829 v_0_0 := v_0.Args[0] 13830 if v_0_0.Op != OpConst64 { 13831 break 13832 } 13833 t := v_0_0.Type 13834 d := v_0_0.AuxInt 13835 x := v_0.Args[1] 13836 v_1 := v.Args[1] 13837 if v_1.Op != OpConst64 { 13838 break 13839 } 13840 if v_1.Type != t { 13841 break 13842 } 13843 c := v_1.AuxInt 13844 v.reset(OpMul64) 13845 v0 := b.NewValue0(v.Pos, OpConst64, t) 13846 v0.AuxInt = c * d 13847 v.AddArg(v0) 13848 v.AddArg(x) 13849 return true 13850 } 13851 // match: (Mul64 (Mul64 x (Const64 <t> [d])) (Const64 <t> [c])) 13852 // cond: 13853 // result: (Mul64 (Const64 <t> [c*d]) x) 13854 for { 13855 _ = v.Args[1] 13856 v_0 := v.Args[0] 13857 if v_0.Op != OpMul64 { 13858 break 13859 } 13860 _ = v_0.Args[1] 13861 x := v_0.Args[0] 13862 v_0_1 := v_0.Args[1] 13863 if v_0_1.Op != OpConst64 { 13864 break 13865 } 13866 t := v_0_1.Type 13867 d := v_0_1.AuxInt 13868 v_1 := v.Args[1] 13869 if v_1.Op != OpConst64 { 13870 break 13871 } 13872 if v_1.Type != t { 13873 break 13874 } 13875 c := v_1.AuxInt 13876 v.reset(OpMul64) 13877 v0 := b.NewValue0(v.Pos, OpConst64, t) 13878 v0.AuxInt = c * d 13879 v.AddArg(v0) 13880 v.AddArg(x) 13881 return true 13882 } 13883 return false 13884 } 13885 func rewriteValuegeneric_OpMul64F_0(v *Value) bool { 13886 // match: (Mul64F (Const64F [c]) (Const64F [d])) 13887 // cond: 13888 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 13889 for { 13890 _ = v.Args[1] 13891 v_0 := v.Args[0] 13892 if v_0.Op != OpConst64F { 13893 break 13894 } 13895 c := v_0.AuxInt 13896 v_1 := v.Args[1] 13897 if v_1.Op != OpConst64F { 13898 break 13899 } 13900 d := v_1.AuxInt 13901 v.reset(OpConst64F) 13902 v.AuxInt = f2i(i2f(c) * i2f(d)) 13903 return true 13904 } 13905 // match: (Mul64F (Const64F [d]) (Const64F [c])) 13906 // cond: 13907 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 13908 for { 13909 _ = v.Args[1] 13910 v_0 := v.Args[0] 13911 if v_0.Op != OpConst64F { 13912 break 13913 } 13914 d := v_0.AuxInt 13915 v_1 := v.Args[1] 13916 if v_1.Op != OpConst64F { 13917 break 13918 } 13919 c := v_1.AuxInt 13920 v.reset(OpConst64F) 13921 v.AuxInt = f2i(i2f(c) * i2f(d)) 13922 return true 13923 } 13924 // match: (Mul64F x (Const64F [f2i(1)])) 13925 // cond: 13926 // result: x 13927 for { 13928 _ = v.Args[1] 13929 x := v.Args[0] 13930 v_1 := v.Args[1] 13931 if v_1.Op != OpConst64F { 13932 break 13933 } 13934 if v_1.AuxInt != f2i(1) { 13935 break 13936 } 13937 v.reset(OpCopy) 13938 v.Type = x.Type 13939 v.AddArg(x) 13940 return true 13941 } 13942 // match: (Mul64F (Const64F [f2i(1)]) x) 13943 // cond: 13944 // result: x 13945 for { 13946 _ = v.Args[1] 13947 v_0 := v.Args[0] 13948 if v_0.Op != OpConst64F { 13949 break 13950 } 13951 if v_0.AuxInt != f2i(1) { 13952 break 13953 } 13954 x := v.Args[1] 13955 v.reset(OpCopy) 13956 v.Type = x.Type 13957 v.AddArg(x) 13958 return true 13959 } 13960 // match: (Mul64F x (Const64F [f2i(-1)])) 13961 // cond: 13962 // result: (Neg64F x) 13963 for { 13964 _ = v.Args[1] 13965 x := v.Args[0] 13966 v_1 := v.Args[1] 13967 if v_1.Op != OpConst64F { 13968 break 13969 } 13970 if v_1.AuxInt != f2i(-1) { 13971 break 13972 } 13973 v.reset(OpNeg64F) 13974 v.AddArg(x) 13975 return true 13976 } 13977 // match: (Mul64F (Const64F [f2i(-1)]) x) 13978 // cond: 13979 // result: (Neg64F x) 13980 for { 13981 _ = v.Args[1] 13982 v_0 := v.Args[0] 13983 if v_0.Op != OpConst64F { 13984 break 13985 } 13986 if v_0.AuxInt != f2i(-1) { 13987 break 13988 } 13989 x := v.Args[1] 13990 v.reset(OpNeg64F) 13991 v.AddArg(x) 13992 return true 13993 } 13994 // match: (Mul64F x (Const64F [f2i(2)])) 13995 // cond: 13996 // result: (Add64F x x) 13997 for { 13998 _ = v.Args[1] 13999 x := v.Args[0] 14000 v_1 := v.Args[1] 14001 if v_1.Op != OpConst64F { 14002 break 14003 } 14004 if v_1.AuxInt != f2i(2) { 14005 break 14006 } 14007 v.reset(OpAdd64F) 14008 v.AddArg(x) 14009 v.AddArg(x) 14010 return true 14011 } 14012 // match: (Mul64F (Const64F [f2i(2)]) x) 14013 // cond: 14014 // result: (Add64F x x) 14015 for { 14016 _ = v.Args[1] 14017 v_0 := v.Args[0] 14018 if v_0.Op != OpConst64F { 14019 break 14020 } 14021 if v_0.AuxInt != f2i(2) { 14022 break 14023 } 14024 x := v.Args[1] 14025 v.reset(OpAdd64F) 14026 v.AddArg(x) 14027 v.AddArg(x) 14028 return true 14029 } 14030 return false 14031 } 14032 func rewriteValuegeneric_OpMul8_0(v *Value) bool { 14033 b := v.Block 14034 _ = b 14035 typ := &b.Func.Config.Types 14036 _ = typ 14037 // match: (Mul8 (Const8 [c]) (Const8 [d])) 14038 // cond: 14039 // result: (Const8 [int64(int8(c*d))]) 14040 for { 14041 _ = v.Args[1] 14042 v_0 := v.Args[0] 14043 if v_0.Op != OpConst8 { 14044 break 14045 } 14046 c := v_0.AuxInt 14047 v_1 := v.Args[1] 14048 if v_1.Op != OpConst8 { 14049 break 14050 } 14051 d := v_1.AuxInt 14052 v.reset(OpConst8) 14053 v.AuxInt = int64(int8(c * d)) 14054 return true 14055 } 14056 // match: (Mul8 (Const8 [d]) (Const8 [c])) 14057 // cond: 14058 // result: (Const8 [int64(int8(c*d))]) 14059 for { 14060 _ = v.Args[1] 14061 v_0 := v.Args[0] 14062 if v_0.Op != OpConst8 { 14063 break 14064 } 14065 d := v_0.AuxInt 14066 v_1 := v.Args[1] 14067 if v_1.Op != OpConst8 { 14068 break 14069 } 14070 c := v_1.AuxInt 14071 v.reset(OpConst8) 14072 v.AuxInt = int64(int8(c * d)) 14073 return true 14074 } 14075 // match: (Mul8 (Const8 [1]) x) 14076 // cond: 14077 // result: x 14078 for { 14079 _ = v.Args[1] 14080 v_0 := v.Args[0] 14081 if v_0.Op != OpConst8 { 14082 break 14083 } 14084 if v_0.AuxInt != 1 { 14085 break 14086 } 14087 x := v.Args[1] 14088 v.reset(OpCopy) 14089 v.Type = x.Type 14090 v.AddArg(x) 14091 return true 14092 } 14093 // match: (Mul8 x (Const8 [1])) 14094 // cond: 14095 // result: x 14096 for { 14097 _ = v.Args[1] 14098 x := v.Args[0] 14099 v_1 := v.Args[1] 14100 if v_1.Op != OpConst8 { 14101 break 14102 } 14103 if v_1.AuxInt != 1 { 14104 break 14105 } 14106 v.reset(OpCopy) 14107 v.Type = x.Type 14108 v.AddArg(x) 14109 return true 14110 } 14111 // match: (Mul8 (Const8 [-1]) x) 14112 // cond: 14113 // result: (Neg8 x) 14114 for { 14115 _ = v.Args[1] 14116 v_0 := v.Args[0] 14117 if v_0.Op != OpConst8 { 14118 break 14119 } 14120 if v_0.AuxInt != -1 { 14121 break 14122 } 14123 x := v.Args[1] 14124 v.reset(OpNeg8) 14125 v.AddArg(x) 14126 return true 14127 } 14128 // match: (Mul8 x (Const8 [-1])) 14129 // cond: 14130 // result: (Neg8 x) 14131 for { 14132 _ = v.Args[1] 14133 x := v.Args[0] 14134 v_1 := v.Args[1] 14135 if v_1.Op != OpConst8 { 14136 break 14137 } 14138 if v_1.AuxInt != -1 { 14139 break 14140 } 14141 v.reset(OpNeg8) 14142 v.AddArg(x) 14143 return true 14144 } 14145 // match: (Mul8 <t> n (Const8 [c])) 14146 // cond: isPowerOfTwo(c) 14147 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14148 for { 14149 t := v.Type 14150 _ = v.Args[1] 14151 n := v.Args[0] 14152 v_1 := v.Args[1] 14153 if v_1.Op != OpConst8 { 14154 break 14155 } 14156 c := v_1.AuxInt 14157 if !(isPowerOfTwo(c)) { 14158 break 14159 } 14160 v.reset(OpLsh8x64) 14161 v.Type = t 14162 v.AddArg(n) 14163 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14164 v0.AuxInt = log2(c) 14165 v.AddArg(v0) 14166 return true 14167 } 14168 // match: (Mul8 <t> (Const8 [c]) n) 14169 // cond: isPowerOfTwo(c) 14170 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14171 for { 14172 t := v.Type 14173 _ = v.Args[1] 14174 v_0 := v.Args[0] 14175 if v_0.Op != OpConst8 { 14176 break 14177 } 14178 c := v_0.AuxInt 14179 n := v.Args[1] 14180 if !(isPowerOfTwo(c)) { 14181 break 14182 } 14183 v.reset(OpLsh8x64) 14184 v.Type = t 14185 v.AddArg(n) 14186 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14187 v0.AuxInt = log2(c) 14188 v.AddArg(v0) 14189 return true 14190 } 14191 // match: (Mul8 <t> n (Const8 [c])) 14192 // cond: t.IsSigned() && isPowerOfTwo(-c) 14193 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14194 for { 14195 t := v.Type 14196 _ = v.Args[1] 14197 n := v.Args[0] 14198 v_1 := v.Args[1] 14199 if v_1.Op != OpConst8 { 14200 break 14201 } 14202 c := v_1.AuxInt 14203 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14204 break 14205 } 14206 v.reset(OpNeg8) 14207 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 14208 v0.AddArg(n) 14209 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14210 v1.AuxInt = log2(-c) 14211 v0.AddArg(v1) 14212 v.AddArg(v0) 14213 return true 14214 } 14215 // match: (Mul8 <t> (Const8 [c]) n) 14216 // cond: t.IsSigned() && isPowerOfTwo(-c) 14217 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14218 for { 14219 t := v.Type 14220 _ = v.Args[1] 14221 v_0 := v.Args[0] 14222 if v_0.Op != OpConst8 { 14223 break 14224 } 14225 c := v_0.AuxInt 14226 n := v.Args[1] 14227 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14228 break 14229 } 14230 v.reset(OpNeg8) 14231 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 14232 v0.AddArg(n) 14233 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14234 v1.AuxInt = log2(-c) 14235 v0.AddArg(v1) 14236 v.AddArg(v0) 14237 return true 14238 } 14239 return false 14240 } 14241 func rewriteValuegeneric_OpMul8_10(v *Value) bool { 14242 b := v.Block 14243 _ = b 14244 // match: (Mul8 (Const8 [0]) _) 14245 // cond: 14246 // result: (Const8 [0]) 14247 for { 14248 _ = v.Args[1] 14249 v_0 := v.Args[0] 14250 if v_0.Op != OpConst8 { 14251 break 14252 } 14253 if v_0.AuxInt != 0 { 14254 break 14255 } 14256 v.reset(OpConst8) 14257 v.AuxInt = 0 14258 return true 14259 } 14260 // match: (Mul8 _ (Const8 [0])) 14261 // cond: 14262 // result: (Const8 [0]) 14263 for { 14264 _ = v.Args[1] 14265 v_1 := v.Args[1] 14266 if v_1.Op != OpConst8 { 14267 break 14268 } 14269 if v_1.AuxInt != 0 { 14270 break 14271 } 14272 v.reset(OpConst8) 14273 v.AuxInt = 0 14274 return true 14275 } 14276 // match: (Mul8 (Const8 <t> [c]) (Mul8 (Const8 <t> [d]) x)) 14277 // cond: 14278 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 14279 for { 14280 _ = v.Args[1] 14281 v_0 := v.Args[0] 14282 if v_0.Op != OpConst8 { 14283 break 14284 } 14285 t := v_0.Type 14286 c := v_0.AuxInt 14287 v_1 := v.Args[1] 14288 if v_1.Op != OpMul8 { 14289 break 14290 } 14291 _ = v_1.Args[1] 14292 v_1_0 := v_1.Args[0] 14293 if v_1_0.Op != OpConst8 { 14294 break 14295 } 14296 if v_1_0.Type != t { 14297 break 14298 } 14299 d := v_1_0.AuxInt 14300 x := v_1.Args[1] 14301 v.reset(OpMul8) 14302 v0 := b.NewValue0(v.Pos, OpConst8, t) 14303 v0.AuxInt = int64(int8(c * d)) 14304 v.AddArg(v0) 14305 v.AddArg(x) 14306 return true 14307 } 14308 // match: (Mul8 (Const8 <t> [c]) (Mul8 x (Const8 <t> [d]))) 14309 // cond: 14310 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 14311 for { 14312 _ = v.Args[1] 14313 v_0 := v.Args[0] 14314 if v_0.Op != OpConst8 { 14315 break 14316 } 14317 t := v_0.Type 14318 c := v_0.AuxInt 14319 v_1 := v.Args[1] 14320 if v_1.Op != OpMul8 { 14321 break 14322 } 14323 _ = v_1.Args[1] 14324 x := v_1.Args[0] 14325 v_1_1 := v_1.Args[1] 14326 if v_1_1.Op != OpConst8 { 14327 break 14328 } 14329 if v_1_1.Type != t { 14330 break 14331 } 14332 d := v_1_1.AuxInt 14333 v.reset(OpMul8) 14334 v0 := b.NewValue0(v.Pos, OpConst8, t) 14335 v0.AuxInt = int64(int8(c * d)) 14336 v.AddArg(v0) 14337 v.AddArg(x) 14338 return true 14339 } 14340 // match: (Mul8 (Mul8 (Const8 <t> [d]) x) (Const8 <t> [c])) 14341 // cond: 14342 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 14343 for { 14344 _ = v.Args[1] 14345 v_0 := v.Args[0] 14346 if v_0.Op != OpMul8 { 14347 break 14348 } 14349 _ = v_0.Args[1] 14350 v_0_0 := v_0.Args[0] 14351 if v_0_0.Op != OpConst8 { 14352 break 14353 } 14354 t := v_0_0.Type 14355 d := v_0_0.AuxInt 14356 x := v_0.Args[1] 14357 v_1 := v.Args[1] 14358 if v_1.Op != OpConst8 { 14359 break 14360 } 14361 if v_1.Type != t { 14362 break 14363 } 14364 c := v_1.AuxInt 14365 v.reset(OpMul8) 14366 v0 := b.NewValue0(v.Pos, OpConst8, t) 14367 v0.AuxInt = int64(int8(c * d)) 14368 v.AddArg(v0) 14369 v.AddArg(x) 14370 return true 14371 } 14372 // match: (Mul8 (Mul8 x (Const8 <t> [d])) (Const8 <t> [c])) 14373 // cond: 14374 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 14375 for { 14376 _ = v.Args[1] 14377 v_0 := v.Args[0] 14378 if v_0.Op != OpMul8 { 14379 break 14380 } 14381 _ = v_0.Args[1] 14382 x := v_0.Args[0] 14383 v_0_1 := v_0.Args[1] 14384 if v_0_1.Op != OpConst8 { 14385 break 14386 } 14387 t := v_0_1.Type 14388 d := v_0_1.AuxInt 14389 v_1 := v.Args[1] 14390 if v_1.Op != OpConst8 { 14391 break 14392 } 14393 if v_1.Type != t { 14394 break 14395 } 14396 c := v_1.AuxInt 14397 v.reset(OpMul8) 14398 v0 := b.NewValue0(v.Pos, OpConst8, t) 14399 v0.AuxInt = int64(int8(c * d)) 14400 v.AddArg(v0) 14401 v.AddArg(x) 14402 return true 14403 } 14404 return false 14405 } 14406 func rewriteValuegeneric_OpNeg16_0(v *Value) bool { 14407 // match: (Neg16 (Const16 [c])) 14408 // cond: 14409 // result: (Const16 [int64(-int16(c))]) 14410 for { 14411 v_0 := v.Args[0] 14412 if v_0.Op != OpConst16 { 14413 break 14414 } 14415 c := v_0.AuxInt 14416 v.reset(OpConst16) 14417 v.AuxInt = int64(-int16(c)) 14418 return true 14419 } 14420 // match: (Neg16 (Sub16 x y)) 14421 // cond: 14422 // result: (Sub16 y x) 14423 for { 14424 v_0 := v.Args[0] 14425 if v_0.Op != OpSub16 { 14426 break 14427 } 14428 _ = v_0.Args[1] 14429 x := v_0.Args[0] 14430 y := v_0.Args[1] 14431 v.reset(OpSub16) 14432 v.AddArg(y) 14433 v.AddArg(x) 14434 return true 14435 } 14436 return false 14437 } 14438 func rewriteValuegeneric_OpNeg32_0(v *Value) bool { 14439 // match: (Neg32 (Const32 [c])) 14440 // cond: 14441 // result: (Const32 [int64(-int32(c))]) 14442 for { 14443 v_0 := v.Args[0] 14444 if v_0.Op != OpConst32 { 14445 break 14446 } 14447 c := v_0.AuxInt 14448 v.reset(OpConst32) 14449 v.AuxInt = int64(-int32(c)) 14450 return true 14451 } 14452 // match: (Neg32 (Sub32 x y)) 14453 // cond: 14454 // result: (Sub32 y x) 14455 for { 14456 v_0 := v.Args[0] 14457 if v_0.Op != OpSub32 { 14458 break 14459 } 14460 _ = v_0.Args[1] 14461 x := v_0.Args[0] 14462 y := v_0.Args[1] 14463 v.reset(OpSub32) 14464 v.AddArg(y) 14465 v.AddArg(x) 14466 return true 14467 } 14468 return false 14469 } 14470 func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { 14471 // match: (Neg32F (Const32F [c])) 14472 // cond: i2f(c) != 0 14473 // result: (Const32F [f2i(-i2f(c))]) 14474 for { 14475 v_0 := v.Args[0] 14476 if v_0.Op != OpConst32F { 14477 break 14478 } 14479 c := v_0.AuxInt 14480 if !(i2f(c) != 0) { 14481 break 14482 } 14483 v.reset(OpConst32F) 14484 v.AuxInt = f2i(-i2f(c)) 14485 return true 14486 } 14487 return false 14488 } 14489 func rewriteValuegeneric_OpNeg64_0(v *Value) bool { 14490 // match: (Neg64 (Const64 [c])) 14491 // cond: 14492 // result: (Const64 [-c]) 14493 for { 14494 v_0 := v.Args[0] 14495 if v_0.Op != OpConst64 { 14496 break 14497 } 14498 c := v_0.AuxInt 14499 v.reset(OpConst64) 14500 v.AuxInt = -c 14501 return true 14502 } 14503 // match: (Neg64 (Sub64 x y)) 14504 // cond: 14505 // result: (Sub64 y x) 14506 for { 14507 v_0 := v.Args[0] 14508 if v_0.Op != OpSub64 { 14509 break 14510 } 14511 _ = v_0.Args[1] 14512 x := v_0.Args[0] 14513 y := v_0.Args[1] 14514 v.reset(OpSub64) 14515 v.AddArg(y) 14516 v.AddArg(x) 14517 return true 14518 } 14519 return false 14520 } 14521 func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { 14522 // match: (Neg64F (Const64F [c])) 14523 // cond: i2f(c) != 0 14524 // result: (Const64F [f2i(-i2f(c))]) 14525 for { 14526 v_0 := v.Args[0] 14527 if v_0.Op != OpConst64F { 14528 break 14529 } 14530 c := v_0.AuxInt 14531 if !(i2f(c) != 0) { 14532 break 14533 } 14534 v.reset(OpConst64F) 14535 v.AuxInt = f2i(-i2f(c)) 14536 return true 14537 } 14538 return false 14539 } 14540 func rewriteValuegeneric_OpNeg8_0(v *Value) bool { 14541 // match: (Neg8 (Const8 [c])) 14542 // cond: 14543 // result: (Const8 [int64( -int8(c))]) 14544 for { 14545 v_0 := v.Args[0] 14546 if v_0.Op != OpConst8 { 14547 break 14548 } 14549 c := v_0.AuxInt 14550 v.reset(OpConst8) 14551 v.AuxInt = int64(-int8(c)) 14552 return true 14553 } 14554 // match: (Neg8 (Sub8 x y)) 14555 // cond: 14556 // result: (Sub8 y x) 14557 for { 14558 v_0 := v.Args[0] 14559 if v_0.Op != OpSub8 { 14560 break 14561 } 14562 _ = v_0.Args[1] 14563 x := v_0.Args[0] 14564 y := v_0.Args[1] 14565 v.reset(OpSub8) 14566 v.AddArg(y) 14567 v.AddArg(x) 14568 return true 14569 } 14570 return false 14571 } 14572 func rewriteValuegeneric_OpNeq16_0(v *Value) bool { 14573 b := v.Block 14574 _ = b 14575 // match: (Neq16 x x) 14576 // cond: 14577 // result: (ConstBool [0]) 14578 for { 14579 _ = v.Args[1] 14580 x := v.Args[0] 14581 if x != v.Args[1] { 14582 break 14583 } 14584 v.reset(OpConstBool) 14585 v.AuxInt = 0 14586 return true 14587 } 14588 // match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 14589 // cond: 14590 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 14591 for { 14592 _ = v.Args[1] 14593 v_0 := v.Args[0] 14594 if v_0.Op != OpConst16 { 14595 break 14596 } 14597 t := v_0.Type 14598 c := v_0.AuxInt 14599 v_1 := v.Args[1] 14600 if v_1.Op != OpAdd16 { 14601 break 14602 } 14603 _ = v_1.Args[1] 14604 v_1_0 := v_1.Args[0] 14605 if v_1_0.Op != OpConst16 { 14606 break 14607 } 14608 if v_1_0.Type != t { 14609 break 14610 } 14611 d := v_1_0.AuxInt 14612 x := v_1.Args[1] 14613 v.reset(OpNeq16) 14614 v0 := b.NewValue0(v.Pos, OpConst16, t) 14615 v0.AuxInt = int64(int16(c - d)) 14616 v.AddArg(v0) 14617 v.AddArg(x) 14618 return true 14619 } 14620 // match: (Neq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 14621 // cond: 14622 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 14623 for { 14624 _ = v.Args[1] 14625 v_0 := v.Args[0] 14626 if v_0.Op != OpConst16 { 14627 break 14628 } 14629 t := v_0.Type 14630 c := v_0.AuxInt 14631 v_1 := v.Args[1] 14632 if v_1.Op != OpAdd16 { 14633 break 14634 } 14635 _ = v_1.Args[1] 14636 x := v_1.Args[0] 14637 v_1_1 := v_1.Args[1] 14638 if v_1_1.Op != OpConst16 { 14639 break 14640 } 14641 if v_1_1.Type != t { 14642 break 14643 } 14644 d := v_1_1.AuxInt 14645 v.reset(OpNeq16) 14646 v0 := b.NewValue0(v.Pos, OpConst16, t) 14647 v0.AuxInt = int64(int16(c - d)) 14648 v.AddArg(v0) 14649 v.AddArg(x) 14650 return true 14651 } 14652 // match: (Neq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 14653 // cond: 14654 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 14655 for { 14656 _ = v.Args[1] 14657 v_0 := v.Args[0] 14658 if v_0.Op != OpAdd16 { 14659 break 14660 } 14661 _ = v_0.Args[1] 14662 v_0_0 := v_0.Args[0] 14663 if v_0_0.Op != OpConst16 { 14664 break 14665 } 14666 t := v_0_0.Type 14667 d := v_0_0.AuxInt 14668 x := v_0.Args[1] 14669 v_1 := v.Args[1] 14670 if v_1.Op != OpConst16 { 14671 break 14672 } 14673 if v_1.Type != t { 14674 break 14675 } 14676 c := v_1.AuxInt 14677 v.reset(OpNeq16) 14678 v0 := b.NewValue0(v.Pos, OpConst16, t) 14679 v0.AuxInt = int64(int16(c - d)) 14680 v.AddArg(v0) 14681 v.AddArg(x) 14682 return true 14683 } 14684 // match: (Neq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 14685 // cond: 14686 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 14687 for { 14688 _ = v.Args[1] 14689 v_0 := v.Args[0] 14690 if v_0.Op != OpAdd16 { 14691 break 14692 } 14693 _ = v_0.Args[1] 14694 x := v_0.Args[0] 14695 v_0_1 := v_0.Args[1] 14696 if v_0_1.Op != OpConst16 { 14697 break 14698 } 14699 t := v_0_1.Type 14700 d := v_0_1.AuxInt 14701 v_1 := v.Args[1] 14702 if v_1.Op != OpConst16 { 14703 break 14704 } 14705 if v_1.Type != t { 14706 break 14707 } 14708 c := v_1.AuxInt 14709 v.reset(OpNeq16) 14710 v0 := b.NewValue0(v.Pos, OpConst16, t) 14711 v0.AuxInt = int64(int16(c - d)) 14712 v.AddArg(v0) 14713 v.AddArg(x) 14714 return true 14715 } 14716 // match: (Neq16 (Const16 [c]) (Const16 [d])) 14717 // cond: 14718 // result: (ConstBool [b2i(c != d)]) 14719 for { 14720 _ = v.Args[1] 14721 v_0 := v.Args[0] 14722 if v_0.Op != OpConst16 { 14723 break 14724 } 14725 c := v_0.AuxInt 14726 v_1 := v.Args[1] 14727 if v_1.Op != OpConst16 { 14728 break 14729 } 14730 d := v_1.AuxInt 14731 v.reset(OpConstBool) 14732 v.AuxInt = b2i(c != d) 14733 return true 14734 } 14735 // match: (Neq16 (Const16 [d]) (Const16 [c])) 14736 // cond: 14737 // result: (ConstBool [b2i(c != d)]) 14738 for { 14739 _ = v.Args[1] 14740 v_0 := v.Args[0] 14741 if v_0.Op != OpConst16 { 14742 break 14743 } 14744 d := v_0.AuxInt 14745 v_1 := v.Args[1] 14746 if v_1.Op != OpConst16 { 14747 break 14748 } 14749 c := v_1.AuxInt 14750 v.reset(OpConstBool) 14751 v.AuxInt = b2i(c != d) 14752 return true 14753 } 14754 return false 14755 } 14756 func rewriteValuegeneric_OpNeq32_0(v *Value) bool { 14757 b := v.Block 14758 _ = b 14759 // match: (Neq32 x x) 14760 // cond: 14761 // result: (ConstBool [0]) 14762 for { 14763 _ = v.Args[1] 14764 x := v.Args[0] 14765 if x != v.Args[1] { 14766 break 14767 } 14768 v.reset(OpConstBool) 14769 v.AuxInt = 0 14770 return true 14771 } 14772 // match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 14773 // cond: 14774 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 14775 for { 14776 _ = v.Args[1] 14777 v_0 := v.Args[0] 14778 if v_0.Op != OpConst32 { 14779 break 14780 } 14781 t := v_0.Type 14782 c := v_0.AuxInt 14783 v_1 := v.Args[1] 14784 if v_1.Op != OpAdd32 { 14785 break 14786 } 14787 _ = v_1.Args[1] 14788 v_1_0 := v_1.Args[0] 14789 if v_1_0.Op != OpConst32 { 14790 break 14791 } 14792 if v_1_0.Type != t { 14793 break 14794 } 14795 d := v_1_0.AuxInt 14796 x := v_1.Args[1] 14797 v.reset(OpNeq32) 14798 v0 := b.NewValue0(v.Pos, OpConst32, t) 14799 v0.AuxInt = int64(int32(c - d)) 14800 v.AddArg(v0) 14801 v.AddArg(x) 14802 return true 14803 } 14804 // match: (Neq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 14805 // cond: 14806 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 14807 for { 14808 _ = v.Args[1] 14809 v_0 := v.Args[0] 14810 if v_0.Op != OpConst32 { 14811 break 14812 } 14813 t := v_0.Type 14814 c := v_0.AuxInt 14815 v_1 := v.Args[1] 14816 if v_1.Op != OpAdd32 { 14817 break 14818 } 14819 _ = v_1.Args[1] 14820 x := v_1.Args[0] 14821 v_1_1 := v_1.Args[1] 14822 if v_1_1.Op != OpConst32 { 14823 break 14824 } 14825 if v_1_1.Type != t { 14826 break 14827 } 14828 d := v_1_1.AuxInt 14829 v.reset(OpNeq32) 14830 v0 := b.NewValue0(v.Pos, OpConst32, t) 14831 v0.AuxInt = int64(int32(c - d)) 14832 v.AddArg(v0) 14833 v.AddArg(x) 14834 return true 14835 } 14836 // match: (Neq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 14837 // cond: 14838 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 14839 for { 14840 _ = v.Args[1] 14841 v_0 := v.Args[0] 14842 if v_0.Op != OpAdd32 { 14843 break 14844 } 14845 _ = v_0.Args[1] 14846 v_0_0 := v_0.Args[0] 14847 if v_0_0.Op != OpConst32 { 14848 break 14849 } 14850 t := v_0_0.Type 14851 d := v_0_0.AuxInt 14852 x := v_0.Args[1] 14853 v_1 := v.Args[1] 14854 if v_1.Op != OpConst32 { 14855 break 14856 } 14857 if v_1.Type != t { 14858 break 14859 } 14860 c := v_1.AuxInt 14861 v.reset(OpNeq32) 14862 v0 := b.NewValue0(v.Pos, OpConst32, t) 14863 v0.AuxInt = int64(int32(c - d)) 14864 v.AddArg(v0) 14865 v.AddArg(x) 14866 return true 14867 } 14868 // match: (Neq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 14869 // cond: 14870 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 14871 for { 14872 _ = v.Args[1] 14873 v_0 := v.Args[0] 14874 if v_0.Op != OpAdd32 { 14875 break 14876 } 14877 _ = v_0.Args[1] 14878 x := v_0.Args[0] 14879 v_0_1 := v_0.Args[1] 14880 if v_0_1.Op != OpConst32 { 14881 break 14882 } 14883 t := v_0_1.Type 14884 d := v_0_1.AuxInt 14885 v_1 := v.Args[1] 14886 if v_1.Op != OpConst32 { 14887 break 14888 } 14889 if v_1.Type != t { 14890 break 14891 } 14892 c := v_1.AuxInt 14893 v.reset(OpNeq32) 14894 v0 := b.NewValue0(v.Pos, OpConst32, t) 14895 v0.AuxInt = int64(int32(c - d)) 14896 v.AddArg(v0) 14897 v.AddArg(x) 14898 return true 14899 } 14900 // match: (Neq32 (Const32 [c]) (Const32 [d])) 14901 // cond: 14902 // result: (ConstBool [b2i(c != d)]) 14903 for { 14904 _ = v.Args[1] 14905 v_0 := v.Args[0] 14906 if v_0.Op != OpConst32 { 14907 break 14908 } 14909 c := v_0.AuxInt 14910 v_1 := v.Args[1] 14911 if v_1.Op != OpConst32 { 14912 break 14913 } 14914 d := v_1.AuxInt 14915 v.reset(OpConstBool) 14916 v.AuxInt = b2i(c != d) 14917 return true 14918 } 14919 // match: (Neq32 (Const32 [d]) (Const32 [c])) 14920 // cond: 14921 // result: (ConstBool [b2i(c != d)]) 14922 for { 14923 _ = v.Args[1] 14924 v_0 := v.Args[0] 14925 if v_0.Op != OpConst32 { 14926 break 14927 } 14928 d := v_0.AuxInt 14929 v_1 := v.Args[1] 14930 if v_1.Op != OpConst32 { 14931 break 14932 } 14933 c := v_1.AuxInt 14934 v.reset(OpConstBool) 14935 v.AuxInt = b2i(c != d) 14936 return true 14937 } 14938 return false 14939 } 14940 func rewriteValuegeneric_OpNeq64_0(v *Value) bool { 14941 b := v.Block 14942 _ = b 14943 // match: (Neq64 x x) 14944 // cond: 14945 // result: (ConstBool [0]) 14946 for { 14947 _ = v.Args[1] 14948 x := v.Args[0] 14949 if x != v.Args[1] { 14950 break 14951 } 14952 v.reset(OpConstBool) 14953 v.AuxInt = 0 14954 return true 14955 } 14956 // match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 14957 // cond: 14958 // result: (Neq64 (Const64 <t> [c-d]) x) 14959 for { 14960 _ = v.Args[1] 14961 v_0 := v.Args[0] 14962 if v_0.Op != OpConst64 { 14963 break 14964 } 14965 t := v_0.Type 14966 c := v_0.AuxInt 14967 v_1 := v.Args[1] 14968 if v_1.Op != OpAdd64 { 14969 break 14970 } 14971 _ = v_1.Args[1] 14972 v_1_0 := v_1.Args[0] 14973 if v_1_0.Op != OpConst64 { 14974 break 14975 } 14976 if v_1_0.Type != t { 14977 break 14978 } 14979 d := v_1_0.AuxInt 14980 x := v_1.Args[1] 14981 v.reset(OpNeq64) 14982 v0 := b.NewValue0(v.Pos, OpConst64, t) 14983 v0.AuxInt = c - d 14984 v.AddArg(v0) 14985 v.AddArg(x) 14986 return true 14987 } 14988 // match: (Neq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 14989 // cond: 14990 // result: (Neq64 (Const64 <t> [c-d]) x) 14991 for { 14992 _ = v.Args[1] 14993 v_0 := v.Args[0] 14994 if v_0.Op != OpConst64 { 14995 break 14996 } 14997 t := v_0.Type 14998 c := v_0.AuxInt 14999 v_1 := v.Args[1] 15000 if v_1.Op != OpAdd64 { 15001 break 15002 } 15003 _ = v_1.Args[1] 15004 x := v_1.Args[0] 15005 v_1_1 := v_1.Args[1] 15006 if v_1_1.Op != OpConst64 { 15007 break 15008 } 15009 if v_1_1.Type != t { 15010 break 15011 } 15012 d := v_1_1.AuxInt 15013 v.reset(OpNeq64) 15014 v0 := b.NewValue0(v.Pos, OpConst64, t) 15015 v0.AuxInt = c - d 15016 v.AddArg(v0) 15017 v.AddArg(x) 15018 return true 15019 } 15020 // match: (Neq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 15021 // cond: 15022 // result: (Neq64 (Const64 <t> [c-d]) x) 15023 for { 15024 _ = v.Args[1] 15025 v_0 := v.Args[0] 15026 if v_0.Op != OpAdd64 { 15027 break 15028 } 15029 _ = v_0.Args[1] 15030 v_0_0 := v_0.Args[0] 15031 if v_0_0.Op != OpConst64 { 15032 break 15033 } 15034 t := v_0_0.Type 15035 d := v_0_0.AuxInt 15036 x := v_0.Args[1] 15037 v_1 := v.Args[1] 15038 if v_1.Op != OpConst64 { 15039 break 15040 } 15041 if v_1.Type != t { 15042 break 15043 } 15044 c := v_1.AuxInt 15045 v.reset(OpNeq64) 15046 v0 := b.NewValue0(v.Pos, OpConst64, t) 15047 v0.AuxInt = c - d 15048 v.AddArg(v0) 15049 v.AddArg(x) 15050 return true 15051 } 15052 // match: (Neq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 15053 // cond: 15054 // result: (Neq64 (Const64 <t> [c-d]) x) 15055 for { 15056 _ = v.Args[1] 15057 v_0 := v.Args[0] 15058 if v_0.Op != OpAdd64 { 15059 break 15060 } 15061 _ = v_0.Args[1] 15062 x := v_0.Args[0] 15063 v_0_1 := v_0.Args[1] 15064 if v_0_1.Op != OpConst64 { 15065 break 15066 } 15067 t := v_0_1.Type 15068 d := v_0_1.AuxInt 15069 v_1 := v.Args[1] 15070 if v_1.Op != OpConst64 { 15071 break 15072 } 15073 if v_1.Type != t { 15074 break 15075 } 15076 c := v_1.AuxInt 15077 v.reset(OpNeq64) 15078 v0 := b.NewValue0(v.Pos, OpConst64, t) 15079 v0.AuxInt = c - d 15080 v.AddArg(v0) 15081 v.AddArg(x) 15082 return true 15083 } 15084 // match: (Neq64 (Const64 [c]) (Const64 [d])) 15085 // cond: 15086 // result: (ConstBool [b2i(c != d)]) 15087 for { 15088 _ = v.Args[1] 15089 v_0 := v.Args[0] 15090 if v_0.Op != OpConst64 { 15091 break 15092 } 15093 c := v_0.AuxInt 15094 v_1 := v.Args[1] 15095 if v_1.Op != OpConst64 { 15096 break 15097 } 15098 d := v_1.AuxInt 15099 v.reset(OpConstBool) 15100 v.AuxInt = b2i(c != d) 15101 return true 15102 } 15103 // match: (Neq64 (Const64 [d]) (Const64 [c])) 15104 // cond: 15105 // result: (ConstBool [b2i(c != d)]) 15106 for { 15107 _ = v.Args[1] 15108 v_0 := v.Args[0] 15109 if v_0.Op != OpConst64 { 15110 break 15111 } 15112 d := v_0.AuxInt 15113 v_1 := v.Args[1] 15114 if v_1.Op != OpConst64 { 15115 break 15116 } 15117 c := v_1.AuxInt 15118 v.reset(OpConstBool) 15119 v.AuxInt = b2i(c != d) 15120 return true 15121 } 15122 return false 15123 } 15124 func rewriteValuegeneric_OpNeq8_0(v *Value) bool { 15125 b := v.Block 15126 _ = b 15127 // match: (Neq8 x x) 15128 // cond: 15129 // result: (ConstBool [0]) 15130 for { 15131 _ = v.Args[1] 15132 x := v.Args[0] 15133 if x != v.Args[1] { 15134 break 15135 } 15136 v.reset(OpConstBool) 15137 v.AuxInt = 0 15138 return true 15139 } 15140 // match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 15141 // cond: 15142 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 15143 for { 15144 _ = v.Args[1] 15145 v_0 := v.Args[0] 15146 if v_0.Op != OpConst8 { 15147 break 15148 } 15149 t := v_0.Type 15150 c := v_0.AuxInt 15151 v_1 := v.Args[1] 15152 if v_1.Op != OpAdd8 { 15153 break 15154 } 15155 _ = v_1.Args[1] 15156 v_1_0 := v_1.Args[0] 15157 if v_1_0.Op != OpConst8 { 15158 break 15159 } 15160 if v_1_0.Type != t { 15161 break 15162 } 15163 d := v_1_0.AuxInt 15164 x := v_1.Args[1] 15165 v.reset(OpNeq8) 15166 v0 := b.NewValue0(v.Pos, OpConst8, t) 15167 v0.AuxInt = int64(int8(c - d)) 15168 v.AddArg(v0) 15169 v.AddArg(x) 15170 return true 15171 } 15172 // match: (Neq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 15173 // cond: 15174 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 15175 for { 15176 _ = v.Args[1] 15177 v_0 := v.Args[0] 15178 if v_0.Op != OpConst8 { 15179 break 15180 } 15181 t := v_0.Type 15182 c := v_0.AuxInt 15183 v_1 := v.Args[1] 15184 if v_1.Op != OpAdd8 { 15185 break 15186 } 15187 _ = v_1.Args[1] 15188 x := v_1.Args[0] 15189 v_1_1 := v_1.Args[1] 15190 if v_1_1.Op != OpConst8 { 15191 break 15192 } 15193 if v_1_1.Type != t { 15194 break 15195 } 15196 d := v_1_1.AuxInt 15197 v.reset(OpNeq8) 15198 v0 := b.NewValue0(v.Pos, OpConst8, t) 15199 v0.AuxInt = int64(int8(c - d)) 15200 v.AddArg(v0) 15201 v.AddArg(x) 15202 return true 15203 } 15204 // match: (Neq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 15205 // cond: 15206 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 15207 for { 15208 _ = v.Args[1] 15209 v_0 := v.Args[0] 15210 if v_0.Op != OpAdd8 { 15211 break 15212 } 15213 _ = v_0.Args[1] 15214 v_0_0 := v_0.Args[0] 15215 if v_0_0.Op != OpConst8 { 15216 break 15217 } 15218 t := v_0_0.Type 15219 d := v_0_0.AuxInt 15220 x := v_0.Args[1] 15221 v_1 := v.Args[1] 15222 if v_1.Op != OpConst8 { 15223 break 15224 } 15225 if v_1.Type != t { 15226 break 15227 } 15228 c := v_1.AuxInt 15229 v.reset(OpNeq8) 15230 v0 := b.NewValue0(v.Pos, OpConst8, t) 15231 v0.AuxInt = int64(int8(c - d)) 15232 v.AddArg(v0) 15233 v.AddArg(x) 15234 return true 15235 } 15236 // match: (Neq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 15237 // cond: 15238 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 15239 for { 15240 _ = v.Args[1] 15241 v_0 := v.Args[0] 15242 if v_0.Op != OpAdd8 { 15243 break 15244 } 15245 _ = v_0.Args[1] 15246 x := v_0.Args[0] 15247 v_0_1 := v_0.Args[1] 15248 if v_0_1.Op != OpConst8 { 15249 break 15250 } 15251 t := v_0_1.Type 15252 d := v_0_1.AuxInt 15253 v_1 := v.Args[1] 15254 if v_1.Op != OpConst8 { 15255 break 15256 } 15257 if v_1.Type != t { 15258 break 15259 } 15260 c := v_1.AuxInt 15261 v.reset(OpNeq8) 15262 v0 := b.NewValue0(v.Pos, OpConst8, t) 15263 v0.AuxInt = int64(int8(c - d)) 15264 v.AddArg(v0) 15265 v.AddArg(x) 15266 return true 15267 } 15268 // match: (Neq8 (Const8 [c]) (Const8 [d])) 15269 // cond: 15270 // result: (ConstBool [b2i(c != d)]) 15271 for { 15272 _ = v.Args[1] 15273 v_0 := v.Args[0] 15274 if v_0.Op != OpConst8 { 15275 break 15276 } 15277 c := v_0.AuxInt 15278 v_1 := v.Args[1] 15279 if v_1.Op != OpConst8 { 15280 break 15281 } 15282 d := v_1.AuxInt 15283 v.reset(OpConstBool) 15284 v.AuxInt = b2i(c != d) 15285 return true 15286 } 15287 // match: (Neq8 (Const8 [d]) (Const8 [c])) 15288 // cond: 15289 // result: (ConstBool [b2i(c != d)]) 15290 for { 15291 _ = v.Args[1] 15292 v_0 := v.Args[0] 15293 if v_0.Op != OpConst8 { 15294 break 15295 } 15296 d := v_0.AuxInt 15297 v_1 := v.Args[1] 15298 if v_1.Op != OpConst8 { 15299 break 15300 } 15301 c := v_1.AuxInt 15302 v.reset(OpConstBool) 15303 v.AuxInt = b2i(c != d) 15304 return true 15305 } 15306 return false 15307 } 15308 func rewriteValuegeneric_OpNeqB_0(v *Value) bool { 15309 // match: (NeqB (ConstBool [c]) (ConstBool [d])) 15310 // cond: 15311 // result: (ConstBool [b2i(c != d)]) 15312 for { 15313 _ = v.Args[1] 15314 v_0 := v.Args[0] 15315 if v_0.Op != OpConstBool { 15316 break 15317 } 15318 c := v_0.AuxInt 15319 v_1 := v.Args[1] 15320 if v_1.Op != OpConstBool { 15321 break 15322 } 15323 d := v_1.AuxInt 15324 v.reset(OpConstBool) 15325 v.AuxInt = b2i(c != d) 15326 return true 15327 } 15328 // match: (NeqB (ConstBool [d]) (ConstBool [c])) 15329 // cond: 15330 // result: (ConstBool [b2i(c != d)]) 15331 for { 15332 _ = v.Args[1] 15333 v_0 := v.Args[0] 15334 if v_0.Op != OpConstBool { 15335 break 15336 } 15337 d := v_0.AuxInt 15338 v_1 := v.Args[1] 15339 if v_1.Op != OpConstBool { 15340 break 15341 } 15342 c := v_1.AuxInt 15343 v.reset(OpConstBool) 15344 v.AuxInt = b2i(c != d) 15345 return true 15346 } 15347 // match: (NeqB (ConstBool [0]) x) 15348 // cond: 15349 // result: x 15350 for { 15351 _ = v.Args[1] 15352 v_0 := v.Args[0] 15353 if v_0.Op != OpConstBool { 15354 break 15355 } 15356 if v_0.AuxInt != 0 { 15357 break 15358 } 15359 x := v.Args[1] 15360 v.reset(OpCopy) 15361 v.Type = x.Type 15362 v.AddArg(x) 15363 return true 15364 } 15365 // match: (NeqB x (ConstBool [0])) 15366 // cond: 15367 // result: x 15368 for { 15369 _ = v.Args[1] 15370 x := v.Args[0] 15371 v_1 := v.Args[1] 15372 if v_1.Op != OpConstBool { 15373 break 15374 } 15375 if v_1.AuxInt != 0 { 15376 break 15377 } 15378 v.reset(OpCopy) 15379 v.Type = x.Type 15380 v.AddArg(x) 15381 return true 15382 } 15383 // match: (NeqB (ConstBool [1]) x) 15384 // cond: 15385 // result: (Not x) 15386 for { 15387 _ = v.Args[1] 15388 v_0 := v.Args[0] 15389 if v_0.Op != OpConstBool { 15390 break 15391 } 15392 if v_0.AuxInt != 1 { 15393 break 15394 } 15395 x := v.Args[1] 15396 v.reset(OpNot) 15397 v.AddArg(x) 15398 return true 15399 } 15400 // match: (NeqB x (ConstBool [1])) 15401 // cond: 15402 // result: (Not x) 15403 for { 15404 _ = v.Args[1] 15405 x := v.Args[0] 15406 v_1 := v.Args[1] 15407 if v_1.Op != OpConstBool { 15408 break 15409 } 15410 if v_1.AuxInt != 1 { 15411 break 15412 } 15413 v.reset(OpNot) 15414 v.AddArg(x) 15415 return true 15416 } 15417 // match: (NeqB (Not x) (Not y)) 15418 // cond: 15419 // result: (NeqB x y) 15420 for { 15421 _ = v.Args[1] 15422 v_0 := v.Args[0] 15423 if v_0.Op != OpNot { 15424 break 15425 } 15426 x := v_0.Args[0] 15427 v_1 := v.Args[1] 15428 if v_1.Op != OpNot { 15429 break 15430 } 15431 y := v_1.Args[0] 15432 v.reset(OpNeqB) 15433 v.AddArg(x) 15434 v.AddArg(y) 15435 return true 15436 } 15437 // match: (NeqB (Not y) (Not x)) 15438 // cond: 15439 // result: (NeqB x y) 15440 for { 15441 _ = v.Args[1] 15442 v_0 := v.Args[0] 15443 if v_0.Op != OpNot { 15444 break 15445 } 15446 y := v_0.Args[0] 15447 v_1 := v.Args[1] 15448 if v_1.Op != OpNot { 15449 break 15450 } 15451 x := v_1.Args[0] 15452 v.reset(OpNeqB) 15453 v.AddArg(x) 15454 v.AddArg(y) 15455 return true 15456 } 15457 return false 15458 } 15459 func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { 15460 b := v.Block 15461 _ = b 15462 typ := &b.Func.Config.Types 15463 _ = typ 15464 // match: (NeqInter x y) 15465 // cond: 15466 // result: (NeqPtr (ITab x) (ITab y)) 15467 for { 15468 _ = v.Args[1] 15469 x := v.Args[0] 15470 y := v.Args[1] 15471 v.reset(OpNeqPtr) 15472 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 15473 v0.AddArg(x) 15474 v.AddArg(v0) 15475 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 15476 v1.AddArg(y) 15477 v.AddArg(v1) 15478 return true 15479 } 15480 } 15481 func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { 15482 // match: (NeqPtr p (ConstNil)) 15483 // cond: 15484 // result: (IsNonNil p) 15485 for { 15486 _ = v.Args[1] 15487 p := v.Args[0] 15488 v_1 := v.Args[1] 15489 if v_1.Op != OpConstNil { 15490 break 15491 } 15492 v.reset(OpIsNonNil) 15493 v.AddArg(p) 15494 return true 15495 } 15496 // match: (NeqPtr (ConstNil) p) 15497 // cond: 15498 // result: (IsNonNil p) 15499 for { 15500 _ = v.Args[1] 15501 v_0 := v.Args[0] 15502 if v_0.Op != OpConstNil { 15503 break 15504 } 15505 p := v.Args[1] 15506 v.reset(OpIsNonNil) 15507 v.AddArg(p) 15508 return true 15509 } 15510 return false 15511 } 15512 func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { 15513 b := v.Block 15514 _ = b 15515 typ := &b.Func.Config.Types 15516 _ = typ 15517 // match: (NeqSlice x y) 15518 // cond: 15519 // result: (NeqPtr (SlicePtr x) (SlicePtr y)) 15520 for { 15521 _ = v.Args[1] 15522 x := v.Args[0] 15523 y := v.Args[1] 15524 v.reset(OpNeqPtr) 15525 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 15526 v0.AddArg(x) 15527 v.AddArg(v0) 15528 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 15529 v1.AddArg(y) 15530 v.AddArg(v1) 15531 return true 15532 } 15533 } 15534 func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { 15535 b := v.Block 15536 _ = b 15537 config := b.Func.Config 15538 _ = config 15539 fe := b.Func.fe 15540 _ = fe 15541 // match: (NilCheck (GetG mem) mem) 15542 // cond: 15543 // result: mem 15544 for { 15545 _ = v.Args[1] 15546 v_0 := v.Args[0] 15547 if v_0.Op != OpGetG { 15548 break 15549 } 15550 mem := v_0.Args[0] 15551 if mem != v.Args[1] { 15552 break 15553 } 15554 v.reset(OpCopy) 15555 v.Type = mem.Type 15556 v.AddArg(mem) 15557 return true 15558 } 15559 // match: (NilCheck (Load (OffPtr [c] (SP)) mem) mem) 15560 // 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") 15561 // result: (Invalid) 15562 for { 15563 _ = v.Args[1] 15564 v_0 := v.Args[0] 15565 if v_0.Op != OpLoad { 15566 break 15567 } 15568 _ = v_0.Args[1] 15569 v_0_0 := v_0.Args[0] 15570 if v_0_0.Op != OpOffPtr { 15571 break 15572 } 15573 c := v_0_0.AuxInt 15574 v_0_0_0 := v_0_0.Args[0] 15575 if v_0_0_0.Op != OpSP { 15576 break 15577 } 15578 mem := v_0.Args[1] 15579 if mem != v.Args[1] { 15580 break 15581 } 15582 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")) { 15583 break 15584 } 15585 v.reset(OpInvalid) 15586 return true 15587 } 15588 // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) mem)) mem) 15589 // 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") 15590 // result: (Invalid) 15591 for { 15592 _ = v.Args[1] 15593 v_0 := v.Args[0] 15594 if v_0.Op != OpOffPtr { 15595 break 15596 } 15597 v_0_0 := v_0.Args[0] 15598 if v_0_0.Op != OpLoad { 15599 break 15600 } 15601 _ = v_0_0.Args[1] 15602 v_0_0_0 := v_0_0.Args[0] 15603 if v_0_0_0.Op != OpOffPtr { 15604 break 15605 } 15606 c := v_0_0_0.AuxInt 15607 v_0_0_0_0 := v_0_0_0.Args[0] 15608 if v_0_0_0_0.Op != OpSP { 15609 break 15610 } 15611 mem := v_0_0.Args[1] 15612 if mem != v.Args[1] { 15613 break 15614 } 15615 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")) { 15616 break 15617 } 15618 v.reset(OpInvalid) 15619 return true 15620 } 15621 return false 15622 } 15623 func rewriteValuegeneric_OpNot_0(v *Value) bool { 15624 // match: (Not (Eq64 x y)) 15625 // cond: 15626 // result: (Neq64 x y) 15627 for { 15628 v_0 := v.Args[0] 15629 if v_0.Op != OpEq64 { 15630 break 15631 } 15632 _ = v_0.Args[1] 15633 x := v_0.Args[0] 15634 y := v_0.Args[1] 15635 v.reset(OpNeq64) 15636 v.AddArg(x) 15637 v.AddArg(y) 15638 return true 15639 } 15640 // match: (Not (Eq32 x y)) 15641 // cond: 15642 // result: (Neq32 x y) 15643 for { 15644 v_0 := v.Args[0] 15645 if v_0.Op != OpEq32 { 15646 break 15647 } 15648 _ = v_0.Args[1] 15649 x := v_0.Args[0] 15650 y := v_0.Args[1] 15651 v.reset(OpNeq32) 15652 v.AddArg(x) 15653 v.AddArg(y) 15654 return true 15655 } 15656 // match: (Not (Eq16 x y)) 15657 // cond: 15658 // result: (Neq16 x y) 15659 for { 15660 v_0 := v.Args[0] 15661 if v_0.Op != OpEq16 { 15662 break 15663 } 15664 _ = v_0.Args[1] 15665 x := v_0.Args[0] 15666 y := v_0.Args[1] 15667 v.reset(OpNeq16) 15668 v.AddArg(x) 15669 v.AddArg(y) 15670 return true 15671 } 15672 // match: (Not (Eq8 x y)) 15673 // cond: 15674 // result: (Neq8 x y) 15675 for { 15676 v_0 := v.Args[0] 15677 if v_0.Op != OpEq8 { 15678 break 15679 } 15680 _ = v_0.Args[1] 15681 x := v_0.Args[0] 15682 y := v_0.Args[1] 15683 v.reset(OpNeq8) 15684 v.AddArg(x) 15685 v.AddArg(y) 15686 return true 15687 } 15688 // match: (Not (EqB x y)) 15689 // cond: 15690 // result: (NeqB x y) 15691 for { 15692 v_0 := v.Args[0] 15693 if v_0.Op != OpEqB { 15694 break 15695 } 15696 _ = v_0.Args[1] 15697 x := v_0.Args[0] 15698 y := v_0.Args[1] 15699 v.reset(OpNeqB) 15700 v.AddArg(x) 15701 v.AddArg(y) 15702 return true 15703 } 15704 // match: (Not (Neq64 x y)) 15705 // cond: 15706 // result: (Eq64 x y) 15707 for { 15708 v_0 := v.Args[0] 15709 if v_0.Op != OpNeq64 { 15710 break 15711 } 15712 _ = v_0.Args[1] 15713 x := v_0.Args[0] 15714 y := v_0.Args[1] 15715 v.reset(OpEq64) 15716 v.AddArg(x) 15717 v.AddArg(y) 15718 return true 15719 } 15720 // match: (Not (Neq32 x y)) 15721 // cond: 15722 // result: (Eq32 x y) 15723 for { 15724 v_0 := v.Args[0] 15725 if v_0.Op != OpNeq32 { 15726 break 15727 } 15728 _ = v_0.Args[1] 15729 x := v_0.Args[0] 15730 y := v_0.Args[1] 15731 v.reset(OpEq32) 15732 v.AddArg(x) 15733 v.AddArg(y) 15734 return true 15735 } 15736 // match: (Not (Neq16 x y)) 15737 // cond: 15738 // result: (Eq16 x y) 15739 for { 15740 v_0 := v.Args[0] 15741 if v_0.Op != OpNeq16 { 15742 break 15743 } 15744 _ = v_0.Args[1] 15745 x := v_0.Args[0] 15746 y := v_0.Args[1] 15747 v.reset(OpEq16) 15748 v.AddArg(x) 15749 v.AddArg(y) 15750 return true 15751 } 15752 // match: (Not (Neq8 x y)) 15753 // cond: 15754 // result: (Eq8 x y) 15755 for { 15756 v_0 := v.Args[0] 15757 if v_0.Op != OpNeq8 { 15758 break 15759 } 15760 _ = v_0.Args[1] 15761 x := v_0.Args[0] 15762 y := v_0.Args[1] 15763 v.reset(OpEq8) 15764 v.AddArg(x) 15765 v.AddArg(y) 15766 return true 15767 } 15768 // match: (Not (NeqB x y)) 15769 // cond: 15770 // result: (EqB x y) 15771 for { 15772 v_0 := v.Args[0] 15773 if v_0.Op != OpNeqB { 15774 break 15775 } 15776 _ = v_0.Args[1] 15777 x := v_0.Args[0] 15778 y := v_0.Args[1] 15779 v.reset(OpEqB) 15780 v.AddArg(x) 15781 v.AddArg(y) 15782 return true 15783 } 15784 return false 15785 } 15786 func rewriteValuegeneric_OpNot_10(v *Value) bool { 15787 // match: (Not (Greater64 x y)) 15788 // cond: 15789 // result: (Leq64 x y) 15790 for { 15791 v_0 := v.Args[0] 15792 if v_0.Op != OpGreater64 { 15793 break 15794 } 15795 _ = v_0.Args[1] 15796 x := v_0.Args[0] 15797 y := v_0.Args[1] 15798 v.reset(OpLeq64) 15799 v.AddArg(x) 15800 v.AddArg(y) 15801 return true 15802 } 15803 // match: (Not (Greater32 x y)) 15804 // cond: 15805 // result: (Leq32 x y) 15806 for { 15807 v_0 := v.Args[0] 15808 if v_0.Op != OpGreater32 { 15809 break 15810 } 15811 _ = v_0.Args[1] 15812 x := v_0.Args[0] 15813 y := v_0.Args[1] 15814 v.reset(OpLeq32) 15815 v.AddArg(x) 15816 v.AddArg(y) 15817 return true 15818 } 15819 // match: (Not (Greater16 x y)) 15820 // cond: 15821 // result: (Leq16 x y) 15822 for { 15823 v_0 := v.Args[0] 15824 if v_0.Op != OpGreater16 { 15825 break 15826 } 15827 _ = v_0.Args[1] 15828 x := v_0.Args[0] 15829 y := v_0.Args[1] 15830 v.reset(OpLeq16) 15831 v.AddArg(x) 15832 v.AddArg(y) 15833 return true 15834 } 15835 // match: (Not (Greater8 x y)) 15836 // cond: 15837 // result: (Leq8 x y) 15838 for { 15839 v_0 := v.Args[0] 15840 if v_0.Op != OpGreater8 { 15841 break 15842 } 15843 _ = v_0.Args[1] 15844 x := v_0.Args[0] 15845 y := v_0.Args[1] 15846 v.reset(OpLeq8) 15847 v.AddArg(x) 15848 v.AddArg(y) 15849 return true 15850 } 15851 // match: (Not (Greater64U x y)) 15852 // cond: 15853 // result: (Leq64U x y) 15854 for { 15855 v_0 := v.Args[0] 15856 if v_0.Op != OpGreater64U { 15857 break 15858 } 15859 _ = v_0.Args[1] 15860 x := v_0.Args[0] 15861 y := v_0.Args[1] 15862 v.reset(OpLeq64U) 15863 v.AddArg(x) 15864 v.AddArg(y) 15865 return true 15866 } 15867 // match: (Not (Greater32U x y)) 15868 // cond: 15869 // result: (Leq32U x y) 15870 for { 15871 v_0 := v.Args[0] 15872 if v_0.Op != OpGreater32U { 15873 break 15874 } 15875 _ = v_0.Args[1] 15876 x := v_0.Args[0] 15877 y := v_0.Args[1] 15878 v.reset(OpLeq32U) 15879 v.AddArg(x) 15880 v.AddArg(y) 15881 return true 15882 } 15883 // match: (Not (Greater16U x y)) 15884 // cond: 15885 // result: (Leq16U x y) 15886 for { 15887 v_0 := v.Args[0] 15888 if v_0.Op != OpGreater16U { 15889 break 15890 } 15891 _ = v_0.Args[1] 15892 x := v_0.Args[0] 15893 y := v_0.Args[1] 15894 v.reset(OpLeq16U) 15895 v.AddArg(x) 15896 v.AddArg(y) 15897 return true 15898 } 15899 // match: (Not (Greater8U x y)) 15900 // cond: 15901 // result: (Leq8U x y) 15902 for { 15903 v_0 := v.Args[0] 15904 if v_0.Op != OpGreater8U { 15905 break 15906 } 15907 _ = v_0.Args[1] 15908 x := v_0.Args[0] 15909 y := v_0.Args[1] 15910 v.reset(OpLeq8U) 15911 v.AddArg(x) 15912 v.AddArg(y) 15913 return true 15914 } 15915 // match: (Not (Geq64 x y)) 15916 // cond: 15917 // result: (Less64 x y) 15918 for { 15919 v_0 := v.Args[0] 15920 if v_0.Op != OpGeq64 { 15921 break 15922 } 15923 _ = v_0.Args[1] 15924 x := v_0.Args[0] 15925 y := v_0.Args[1] 15926 v.reset(OpLess64) 15927 v.AddArg(x) 15928 v.AddArg(y) 15929 return true 15930 } 15931 // match: (Not (Geq32 x y)) 15932 // cond: 15933 // result: (Less32 x y) 15934 for { 15935 v_0 := v.Args[0] 15936 if v_0.Op != OpGeq32 { 15937 break 15938 } 15939 _ = v_0.Args[1] 15940 x := v_0.Args[0] 15941 y := v_0.Args[1] 15942 v.reset(OpLess32) 15943 v.AddArg(x) 15944 v.AddArg(y) 15945 return true 15946 } 15947 return false 15948 } 15949 func rewriteValuegeneric_OpNot_20(v *Value) bool { 15950 // match: (Not (Geq16 x y)) 15951 // cond: 15952 // result: (Less16 x y) 15953 for { 15954 v_0 := v.Args[0] 15955 if v_0.Op != OpGeq16 { 15956 break 15957 } 15958 _ = v_0.Args[1] 15959 x := v_0.Args[0] 15960 y := v_0.Args[1] 15961 v.reset(OpLess16) 15962 v.AddArg(x) 15963 v.AddArg(y) 15964 return true 15965 } 15966 // match: (Not (Geq8 x y)) 15967 // cond: 15968 // result: (Less8 x y) 15969 for { 15970 v_0 := v.Args[0] 15971 if v_0.Op != OpGeq8 { 15972 break 15973 } 15974 _ = v_0.Args[1] 15975 x := v_0.Args[0] 15976 y := v_0.Args[1] 15977 v.reset(OpLess8) 15978 v.AddArg(x) 15979 v.AddArg(y) 15980 return true 15981 } 15982 // match: (Not (Geq64U x y)) 15983 // cond: 15984 // result: (Less64U x y) 15985 for { 15986 v_0 := v.Args[0] 15987 if v_0.Op != OpGeq64U { 15988 break 15989 } 15990 _ = v_0.Args[1] 15991 x := v_0.Args[0] 15992 y := v_0.Args[1] 15993 v.reset(OpLess64U) 15994 v.AddArg(x) 15995 v.AddArg(y) 15996 return true 15997 } 15998 // match: (Not (Geq32U x y)) 15999 // cond: 16000 // result: (Less32U x y) 16001 for { 16002 v_0 := v.Args[0] 16003 if v_0.Op != OpGeq32U { 16004 break 16005 } 16006 _ = v_0.Args[1] 16007 x := v_0.Args[0] 16008 y := v_0.Args[1] 16009 v.reset(OpLess32U) 16010 v.AddArg(x) 16011 v.AddArg(y) 16012 return true 16013 } 16014 // match: (Not (Geq16U x y)) 16015 // cond: 16016 // result: (Less16U x y) 16017 for { 16018 v_0 := v.Args[0] 16019 if v_0.Op != OpGeq16U { 16020 break 16021 } 16022 _ = v_0.Args[1] 16023 x := v_0.Args[0] 16024 y := v_0.Args[1] 16025 v.reset(OpLess16U) 16026 v.AddArg(x) 16027 v.AddArg(y) 16028 return true 16029 } 16030 // match: (Not (Geq8U x y)) 16031 // cond: 16032 // result: (Less8U x y) 16033 for { 16034 v_0 := v.Args[0] 16035 if v_0.Op != OpGeq8U { 16036 break 16037 } 16038 _ = v_0.Args[1] 16039 x := v_0.Args[0] 16040 y := v_0.Args[1] 16041 v.reset(OpLess8U) 16042 v.AddArg(x) 16043 v.AddArg(y) 16044 return true 16045 } 16046 // match: (Not (Less64 x y)) 16047 // cond: 16048 // result: (Geq64 x y) 16049 for { 16050 v_0 := v.Args[0] 16051 if v_0.Op != OpLess64 { 16052 break 16053 } 16054 _ = v_0.Args[1] 16055 x := v_0.Args[0] 16056 y := v_0.Args[1] 16057 v.reset(OpGeq64) 16058 v.AddArg(x) 16059 v.AddArg(y) 16060 return true 16061 } 16062 // match: (Not (Less32 x y)) 16063 // cond: 16064 // result: (Geq32 x y) 16065 for { 16066 v_0 := v.Args[0] 16067 if v_0.Op != OpLess32 { 16068 break 16069 } 16070 _ = v_0.Args[1] 16071 x := v_0.Args[0] 16072 y := v_0.Args[1] 16073 v.reset(OpGeq32) 16074 v.AddArg(x) 16075 v.AddArg(y) 16076 return true 16077 } 16078 // match: (Not (Less16 x y)) 16079 // cond: 16080 // result: (Geq16 x y) 16081 for { 16082 v_0 := v.Args[0] 16083 if v_0.Op != OpLess16 { 16084 break 16085 } 16086 _ = v_0.Args[1] 16087 x := v_0.Args[0] 16088 y := v_0.Args[1] 16089 v.reset(OpGeq16) 16090 v.AddArg(x) 16091 v.AddArg(y) 16092 return true 16093 } 16094 // match: (Not (Less8 x y)) 16095 // cond: 16096 // result: (Geq8 x y) 16097 for { 16098 v_0 := v.Args[0] 16099 if v_0.Op != OpLess8 { 16100 break 16101 } 16102 _ = v_0.Args[1] 16103 x := v_0.Args[0] 16104 y := v_0.Args[1] 16105 v.reset(OpGeq8) 16106 v.AddArg(x) 16107 v.AddArg(y) 16108 return true 16109 } 16110 return false 16111 } 16112 func rewriteValuegeneric_OpNot_30(v *Value) bool { 16113 // match: (Not (Less64U x y)) 16114 // cond: 16115 // result: (Geq64U x y) 16116 for { 16117 v_0 := v.Args[0] 16118 if v_0.Op != OpLess64U { 16119 break 16120 } 16121 _ = v_0.Args[1] 16122 x := v_0.Args[0] 16123 y := v_0.Args[1] 16124 v.reset(OpGeq64U) 16125 v.AddArg(x) 16126 v.AddArg(y) 16127 return true 16128 } 16129 // match: (Not (Less32U x y)) 16130 // cond: 16131 // result: (Geq32U x y) 16132 for { 16133 v_0 := v.Args[0] 16134 if v_0.Op != OpLess32U { 16135 break 16136 } 16137 _ = v_0.Args[1] 16138 x := v_0.Args[0] 16139 y := v_0.Args[1] 16140 v.reset(OpGeq32U) 16141 v.AddArg(x) 16142 v.AddArg(y) 16143 return true 16144 } 16145 // match: (Not (Less16U x y)) 16146 // cond: 16147 // result: (Geq16U x y) 16148 for { 16149 v_0 := v.Args[0] 16150 if v_0.Op != OpLess16U { 16151 break 16152 } 16153 _ = v_0.Args[1] 16154 x := v_0.Args[0] 16155 y := v_0.Args[1] 16156 v.reset(OpGeq16U) 16157 v.AddArg(x) 16158 v.AddArg(y) 16159 return true 16160 } 16161 // match: (Not (Less8U x y)) 16162 // cond: 16163 // result: (Geq8U x y) 16164 for { 16165 v_0 := v.Args[0] 16166 if v_0.Op != OpLess8U { 16167 break 16168 } 16169 _ = v_0.Args[1] 16170 x := v_0.Args[0] 16171 y := v_0.Args[1] 16172 v.reset(OpGeq8U) 16173 v.AddArg(x) 16174 v.AddArg(y) 16175 return true 16176 } 16177 // match: (Not (Leq64 x y)) 16178 // cond: 16179 // result: (Greater64 x y) 16180 for { 16181 v_0 := v.Args[0] 16182 if v_0.Op != OpLeq64 { 16183 break 16184 } 16185 _ = v_0.Args[1] 16186 x := v_0.Args[0] 16187 y := v_0.Args[1] 16188 v.reset(OpGreater64) 16189 v.AddArg(x) 16190 v.AddArg(y) 16191 return true 16192 } 16193 // match: (Not (Leq32 x y)) 16194 // cond: 16195 // result: (Greater32 x y) 16196 for { 16197 v_0 := v.Args[0] 16198 if v_0.Op != OpLeq32 { 16199 break 16200 } 16201 _ = v_0.Args[1] 16202 x := v_0.Args[0] 16203 y := v_0.Args[1] 16204 v.reset(OpGreater32) 16205 v.AddArg(x) 16206 v.AddArg(y) 16207 return true 16208 } 16209 // match: (Not (Leq16 x y)) 16210 // cond: 16211 // result: (Greater16 x y) 16212 for { 16213 v_0 := v.Args[0] 16214 if v_0.Op != OpLeq16 { 16215 break 16216 } 16217 _ = v_0.Args[1] 16218 x := v_0.Args[0] 16219 y := v_0.Args[1] 16220 v.reset(OpGreater16) 16221 v.AddArg(x) 16222 v.AddArg(y) 16223 return true 16224 } 16225 // match: (Not (Leq8 x y)) 16226 // cond: 16227 // result: (Greater8 x y) 16228 for { 16229 v_0 := v.Args[0] 16230 if v_0.Op != OpLeq8 { 16231 break 16232 } 16233 _ = v_0.Args[1] 16234 x := v_0.Args[0] 16235 y := v_0.Args[1] 16236 v.reset(OpGreater8) 16237 v.AddArg(x) 16238 v.AddArg(y) 16239 return true 16240 } 16241 // match: (Not (Leq64U x y)) 16242 // cond: 16243 // result: (Greater64U x y) 16244 for { 16245 v_0 := v.Args[0] 16246 if v_0.Op != OpLeq64U { 16247 break 16248 } 16249 _ = v_0.Args[1] 16250 x := v_0.Args[0] 16251 y := v_0.Args[1] 16252 v.reset(OpGreater64U) 16253 v.AddArg(x) 16254 v.AddArg(y) 16255 return true 16256 } 16257 // match: (Not (Leq32U x y)) 16258 // cond: 16259 // result: (Greater32U x y) 16260 for { 16261 v_0 := v.Args[0] 16262 if v_0.Op != OpLeq32U { 16263 break 16264 } 16265 _ = v_0.Args[1] 16266 x := v_0.Args[0] 16267 y := v_0.Args[1] 16268 v.reset(OpGreater32U) 16269 v.AddArg(x) 16270 v.AddArg(y) 16271 return true 16272 } 16273 return false 16274 } 16275 func rewriteValuegeneric_OpNot_40(v *Value) bool { 16276 // match: (Not (Leq16U x y)) 16277 // cond: 16278 // result: (Greater16U x y) 16279 for { 16280 v_0 := v.Args[0] 16281 if v_0.Op != OpLeq16U { 16282 break 16283 } 16284 _ = v_0.Args[1] 16285 x := v_0.Args[0] 16286 y := v_0.Args[1] 16287 v.reset(OpGreater16U) 16288 v.AddArg(x) 16289 v.AddArg(y) 16290 return true 16291 } 16292 // match: (Not (Leq8U x y)) 16293 // cond: 16294 // result: (Greater8U x y) 16295 for { 16296 v_0 := v.Args[0] 16297 if v_0.Op != OpLeq8U { 16298 break 16299 } 16300 _ = v_0.Args[1] 16301 x := v_0.Args[0] 16302 y := v_0.Args[1] 16303 v.reset(OpGreater8U) 16304 v.AddArg(x) 16305 v.AddArg(y) 16306 return true 16307 } 16308 return false 16309 } 16310 func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { 16311 // match: (OffPtr (OffPtr p [b]) [a]) 16312 // cond: 16313 // result: (OffPtr p [a+b]) 16314 for { 16315 a := v.AuxInt 16316 v_0 := v.Args[0] 16317 if v_0.Op != OpOffPtr { 16318 break 16319 } 16320 b := v_0.AuxInt 16321 p := v_0.Args[0] 16322 v.reset(OpOffPtr) 16323 v.AuxInt = a + b 16324 v.AddArg(p) 16325 return true 16326 } 16327 // match: (OffPtr p [0]) 16328 // cond: v.Type.Compare(p.Type) == types.CMPeq 16329 // result: p 16330 for { 16331 if v.AuxInt != 0 { 16332 break 16333 } 16334 p := v.Args[0] 16335 if !(v.Type.Compare(p.Type) == types.CMPeq) { 16336 break 16337 } 16338 v.reset(OpCopy) 16339 v.Type = p.Type 16340 v.AddArg(p) 16341 return true 16342 } 16343 return false 16344 } 16345 func rewriteValuegeneric_OpOr16_0(v *Value) bool { 16346 // match: (Or16 (Const16 [c]) (Const16 [d])) 16347 // cond: 16348 // result: (Const16 [int64(int16(c|d))]) 16349 for { 16350 _ = v.Args[1] 16351 v_0 := v.Args[0] 16352 if v_0.Op != OpConst16 { 16353 break 16354 } 16355 c := v_0.AuxInt 16356 v_1 := v.Args[1] 16357 if v_1.Op != OpConst16 { 16358 break 16359 } 16360 d := v_1.AuxInt 16361 v.reset(OpConst16) 16362 v.AuxInt = int64(int16(c | d)) 16363 return true 16364 } 16365 // match: (Or16 (Const16 [d]) (Const16 [c])) 16366 // cond: 16367 // result: (Const16 [int64(int16(c|d))]) 16368 for { 16369 _ = v.Args[1] 16370 v_0 := v.Args[0] 16371 if v_0.Op != OpConst16 { 16372 break 16373 } 16374 d := v_0.AuxInt 16375 v_1 := v.Args[1] 16376 if v_1.Op != OpConst16 { 16377 break 16378 } 16379 c := v_1.AuxInt 16380 v.reset(OpConst16) 16381 v.AuxInt = int64(int16(c | d)) 16382 return true 16383 } 16384 // match: (Or16 x x) 16385 // cond: 16386 // result: x 16387 for { 16388 _ = v.Args[1] 16389 x := v.Args[0] 16390 if x != v.Args[1] { 16391 break 16392 } 16393 v.reset(OpCopy) 16394 v.Type = x.Type 16395 v.AddArg(x) 16396 return true 16397 } 16398 // match: (Or16 (Const16 [0]) x) 16399 // cond: 16400 // result: x 16401 for { 16402 _ = v.Args[1] 16403 v_0 := v.Args[0] 16404 if v_0.Op != OpConst16 { 16405 break 16406 } 16407 if v_0.AuxInt != 0 { 16408 break 16409 } 16410 x := v.Args[1] 16411 v.reset(OpCopy) 16412 v.Type = x.Type 16413 v.AddArg(x) 16414 return true 16415 } 16416 // match: (Or16 x (Const16 [0])) 16417 // cond: 16418 // result: x 16419 for { 16420 _ = v.Args[1] 16421 x := v.Args[0] 16422 v_1 := v.Args[1] 16423 if v_1.Op != OpConst16 { 16424 break 16425 } 16426 if v_1.AuxInt != 0 { 16427 break 16428 } 16429 v.reset(OpCopy) 16430 v.Type = x.Type 16431 v.AddArg(x) 16432 return true 16433 } 16434 // match: (Or16 (Const16 [-1]) _) 16435 // cond: 16436 // result: (Const16 [-1]) 16437 for { 16438 _ = v.Args[1] 16439 v_0 := v.Args[0] 16440 if v_0.Op != OpConst16 { 16441 break 16442 } 16443 if v_0.AuxInt != -1 { 16444 break 16445 } 16446 v.reset(OpConst16) 16447 v.AuxInt = -1 16448 return true 16449 } 16450 // match: (Or16 _ (Const16 [-1])) 16451 // cond: 16452 // result: (Const16 [-1]) 16453 for { 16454 _ = v.Args[1] 16455 v_1 := v.Args[1] 16456 if v_1.Op != OpConst16 { 16457 break 16458 } 16459 if v_1.AuxInt != -1 { 16460 break 16461 } 16462 v.reset(OpConst16) 16463 v.AuxInt = -1 16464 return true 16465 } 16466 // match: (Or16 x (Or16 x y)) 16467 // cond: 16468 // result: (Or16 x y) 16469 for { 16470 _ = v.Args[1] 16471 x := v.Args[0] 16472 v_1 := v.Args[1] 16473 if v_1.Op != OpOr16 { 16474 break 16475 } 16476 _ = v_1.Args[1] 16477 if x != v_1.Args[0] { 16478 break 16479 } 16480 y := v_1.Args[1] 16481 v.reset(OpOr16) 16482 v.AddArg(x) 16483 v.AddArg(y) 16484 return true 16485 } 16486 // match: (Or16 x (Or16 y x)) 16487 // cond: 16488 // result: (Or16 x y) 16489 for { 16490 _ = v.Args[1] 16491 x := v.Args[0] 16492 v_1 := v.Args[1] 16493 if v_1.Op != OpOr16 { 16494 break 16495 } 16496 _ = v_1.Args[1] 16497 y := v_1.Args[0] 16498 if x != v_1.Args[1] { 16499 break 16500 } 16501 v.reset(OpOr16) 16502 v.AddArg(x) 16503 v.AddArg(y) 16504 return true 16505 } 16506 // match: (Or16 (Or16 x y) x) 16507 // cond: 16508 // result: (Or16 x y) 16509 for { 16510 _ = v.Args[1] 16511 v_0 := v.Args[0] 16512 if v_0.Op != OpOr16 { 16513 break 16514 } 16515 _ = v_0.Args[1] 16516 x := v_0.Args[0] 16517 y := v_0.Args[1] 16518 if x != v.Args[1] { 16519 break 16520 } 16521 v.reset(OpOr16) 16522 v.AddArg(x) 16523 v.AddArg(y) 16524 return true 16525 } 16526 return false 16527 } 16528 func rewriteValuegeneric_OpOr16_10(v *Value) bool { 16529 b := v.Block 16530 _ = b 16531 // match: (Or16 (Or16 y x) x) 16532 // cond: 16533 // result: (Or16 x y) 16534 for { 16535 _ = v.Args[1] 16536 v_0 := v.Args[0] 16537 if v_0.Op != OpOr16 { 16538 break 16539 } 16540 _ = v_0.Args[1] 16541 y := v_0.Args[0] 16542 x := v_0.Args[1] 16543 if x != v.Args[1] { 16544 break 16545 } 16546 v.reset(OpOr16) 16547 v.AddArg(x) 16548 v.AddArg(y) 16549 return true 16550 } 16551 // match: (Or16 (And16 x (Const16 [c2])) (Const16 <t> [c1])) 16552 // cond: ^(c1 | c2) == 0 16553 // result: (Or16 (Const16 <t> [c1]) x) 16554 for { 16555 _ = v.Args[1] 16556 v_0 := v.Args[0] 16557 if v_0.Op != OpAnd16 { 16558 break 16559 } 16560 _ = v_0.Args[1] 16561 x := v_0.Args[0] 16562 v_0_1 := v_0.Args[1] 16563 if v_0_1.Op != OpConst16 { 16564 break 16565 } 16566 c2 := v_0_1.AuxInt 16567 v_1 := v.Args[1] 16568 if v_1.Op != OpConst16 { 16569 break 16570 } 16571 t := v_1.Type 16572 c1 := v_1.AuxInt 16573 if !(^(c1 | c2) == 0) { 16574 break 16575 } 16576 v.reset(OpOr16) 16577 v0 := b.NewValue0(v.Pos, OpConst16, t) 16578 v0.AuxInt = c1 16579 v.AddArg(v0) 16580 v.AddArg(x) 16581 return true 16582 } 16583 // match: (Or16 (And16 (Const16 [c2]) x) (Const16 <t> [c1])) 16584 // cond: ^(c1 | c2) == 0 16585 // result: (Or16 (Const16 <t> [c1]) x) 16586 for { 16587 _ = v.Args[1] 16588 v_0 := v.Args[0] 16589 if v_0.Op != OpAnd16 { 16590 break 16591 } 16592 _ = v_0.Args[1] 16593 v_0_0 := v_0.Args[0] 16594 if v_0_0.Op != OpConst16 { 16595 break 16596 } 16597 c2 := v_0_0.AuxInt 16598 x := v_0.Args[1] 16599 v_1 := v.Args[1] 16600 if v_1.Op != OpConst16 { 16601 break 16602 } 16603 t := v_1.Type 16604 c1 := v_1.AuxInt 16605 if !(^(c1 | c2) == 0) { 16606 break 16607 } 16608 v.reset(OpOr16) 16609 v0 := b.NewValue0(v.Pos, OpConst16, t) 16610 v0.AuxInt = c1 16611 v.AddArg(v0) 16612 v.AddArg(x) 16613 return true 16614 } 16615 // match: (Or16 (Const16 <t> [c1]) (And16 x (Const16 [c2]))) 16616 // cond: ^(c1 | c2) == 0 16617 // result: (Or16 (Const16 <t> [c1]) x) 16618 for { 16619 _ = v.Args[1] 16620 v_0 := v.Args[0] 16621 if v_0.Op != OpConst16 { 16622 break 16623 } 16624 t := v_0.Type 16625 c1 := v_0.AuxInt 16626 v_1 := v.Args[1] 16627 if v_1.Op != OpAnd16 { 16628 break 16629 } 16630 _ = v_1.Args[1] 16631 x := v_1.Args[0] 16632 v_1_1 := v_1.Args[1] 16633 if v_1_1.Op != OpConst16 { 16634 break 16635 } 16636 c2 := v_1_1.AuxInt 16637 if !(^(c1 | c2) == 0) { 16638 break 16639 } 16640 v.reset(OpOr16) 16641 v0 := b.NewValue0(v.Pos, OpConst16, t) 16642 v0.AuxInt = c1 16643 v.AddArg(v0) 16644 v.AddArg(x) 16645 return true 16646 } 16647 // match: (Or16 (Const16 <t> [c1]) (And16 (Const16 [c2]) x)) 16648 // cond: ^(c1 | c2) == 0 16649 // result: (Or16 (Const16 <t> [c1]) x) 16650 for { 16651 _ = v.Args[1] 16652 v_0 := v.Args[0] 16653 if v_0.Op != OpConst16 { 16654 break 16655 } 16656 t := v_0.Type 16657 c1 := v_0.AuxInt 16658 v_1 := v.Args[1] 16659 if v_1.Op != OpAnd16 { 16660 break 16661 } 16662 _ = v_1.Args[1] 16663 v_1_0 := v_1.Args[0] 16664 if v_1_0.Op != OpConst16 { 16665 break 16666 } 16667 c2 := v_1_0.AuxInt 16668 x := v_1.Args[1] 16669 if !(^(c1 | c2) == 0) { 16670 break 16671 } 16672 v.reset(OpOr16) 16673 v0 := b.NewValue0(v.Pos, OpConst16, t) 16674 v0.AuxInt = c1 16675 v.AddArg(v0) 16676 v.AddArg(x) 16677 return true 16678 } 16679 // match: (Or16 (Or16 i:(Const16 <t>) z) x) 16680 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 16681 // result: (Or16 i (Or16 <t> z x)) 16682 for { 16683 _ = v.Args[1] 16684 v_0 := v.Args[0] 16685 if v_0.Op != OpOr16 { 16686 break 16687 } 16688 _ = v_0.Args[1] 16689 i := v_0.Args[0] 16690 if i.Op != OpConst16 { 16691 break 16692 } 16693 t := i.Type 16694 z := v_0.Args[1] 16695 x := v.Args[1] 16696 if !(z.Op != OpConst16 && x.Op != OpConst16) { 16697 break 16698 } 16699 v.reset(OpOr16) 16700 v.AddArg(i) 16701 v0 := b.NewValue0(v.Pos, OpOr16, t) 16702 v0.AddArg(z) 16703 v0.AddArg(x) 16704 v.AddArg(v0) 16705 return true 16706 } 16707 // match: (Or16 (Or16 z i:(Const16 <t>)) x) 16708 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 16709 // result: (Or16 i (Or16 <t> z x)) 16710 for { 16711 _ = v.Args[1] 16712 v_0 := v.Args[0] 16713 if v_0.Op != OpOr16 { 16714 break 16715 } 16716 _ = v_0.Args[1] 16717 z := v_0.Args[0] 16718 i := v_0.Args[1] 16719 if i.Op != OpConst16 { 16720 break 16721 } 16722 t := i.Type 16723 x := v.Args[1] 16724 if !(z.Op != OpConst16 && x.Op != OpConst16) { 16725 break 16726 } 16727 v.reset(OpOr16) 16728 v.AddArg(i) 16729 v0 := b.NewValue0(v.Pos, OpOr16, t) 16730 v0.AddArg(z) 16731 v0.AddArg(x) 16732 v.AddArg(v0) 16733 return true 16734 } 16735 // match: (Or16 x (Or16 i:(Const16 <t>) z)) 16736 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 16737 // result: (Or16 i (Or16 <t> z x)) 16738 for { 16739 _ = v.Args[1] 16740 x := v.Args[0] 16741 v_1 := v.Args[1] 16742 if v_1.Op != OpOr16 { 16743 break 16744 } 16745 _ = v_1.Args[1] 16746 i := v_1.Args[0] 16747 if i.Op != OpConst16 { 16748 break 16749 } 16750 t := i.Type 16751 z := v_1.Args[1] 16752 if !(z.Op != OpConst16 && x.Op != OpConst16) { 16753 break 16754 } 16755 v.reset(OpOr16) 16756 v.AddArg(i) 16757 v0 := b.NewValue0(v.Pos, OpOr16, t) 16758 v0.AddArg(z) 16759 v0.AddArg(x) 16760 v.AddArg(v0) 16761 return true 16762 } 16763 // match: (Or16 x (Or16 z i:(Const16 <t>))) 16764 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 16765 // result: (Or16 i (Or16 <t> z x)) 16766 for { 16767 _ = v.Args[1] 16768 x := v.Args[0] 16769 v_1 := v.Args[1] 16770 if v_1.Op != OpOr16 { 16771 break 16772 } 16773 _ = v_1.Args[1] 16774 z := v_1.Args[0] 16775 i := v_1.Args[1] 16776 if i.Op != OpConst16 { 16777 break 16778 } 16779 t := i.Type 16780 if !(z.Op != OpConst16 && x.Op != OpConst16) { 16781 break 16782 } 16783 v.reset(OpOr16) 16784 v.AddArg(i) 16785 v0 := b.NewValue0(v.Pos, OpOr16, t) 16786 v0.AddArg(z) 16787 v0.AddArg(x) 16788 v.AddArg(v0) 16789 return true 16790 } 16791 // match: (Or16 (Const16 <t> [c]) (Or16 (Const16 <t> [d]) x)) 16792 // cond: 16793 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 16794 for { 16795 _ = v.Args[1] 16796 v_0 := v.Args[0] 16797 if v_0.Op != OpConst16 { 16798 break 16799 } 16800 t := v_0.Type 16801 c := v_0.AuxInt 16802 v_1 := v.Args[1] 16803 if v_1.Op != OpOr16 { 16804 break 16805 } 16806 _ = v_1.Args[1] 16807 v_1_0 := v_1.Args[0] 16808 if v_1_0.Op != OpConst16 { 16809 break 16810 } 16811 if v_1_0.Type != t { 16812 break 16813 } 16814 d := v_1_0.AuxInt 16815 x := v_1.Args[1] 16816 v.reset(OpOr16) 16817 v0 := b.NewValue0(v.Pos, OpConst16, t) 16818 v0.AuxInt = int64(int16(c | d)) 16819 v.AddArg(v0) 16820 v.AddArg(x) 16821 return true 16822 } 16823 return false 16824 } 16825 func rewriteValuegeneric_OpOr16_20(v *Value) bool { 16826 b := v.Block 16827 _ = b 16828 // match: (Or16 (Const16 <t> [c]) (Or16 x (Const16 <t> [d]))) 16829 // cond: 16830 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 16831 for { 16832 _ = v.Args[1] 16833 v_0 := v.Args[0] 16834 if v_0.Op != OpConst16 { 16835 break 16836 } 16837 t := v_0.Type 16838 c := v_0.AuxInt 16839 v_1 := v.Args[1] 16840 if v_1.Op != OpOr16 { 16841 break 16842 } 16843 _ = v_1.Args[1] 16844 x := v_1.Args[0] 16845 v_1_1 := v_1.Args[1] 16846 if v_1_1.Op != OpConst16 { 16847 break 16848 } 16849 if v_1_1.Type != t { 16850 break 16851 } 16852 d := v_1_1.AuxInt 16853 v.reset(OpOr16) 16854 v0 := b.NewValue0(v.Pos, OpConst16, t) 16855 v0.AuxInt = int64(int16(c | d)) 16856 v.AddArg(v0) 16857 v.AddArg(x) 16858 return true 16859 } 16860 // match: (Or16 (Or16 (Const16 <t> [d]) x) (Const16 <t> [c])) 16861 // cond: 16862 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 16863 for { 16864 _ = v.Args[1] 16865 v_0 := v.Args[0] 16866 if v_0.Op != OpOr16 { 16867 break 16868 } 16869 _ = v_0.Args[1] 16870 v_0_0 := v_0.Args[0] 16871 if v_0_0.Op != OpConst16 { 16872 break 16873 } 16874 t := v_0_0.Type 16875 d := v_0_0.AuxInt 16876 x := v_0.Args[1] 16877 v_1 := v.Args[1] 16878 if v_1.Op != OpConst16 { 16879 break 16880 } 16881 if v_1.Type != t { 16882 break 16883 } 16884 c := v_1.AuxInt 16885 v.reset(OpOr16) 16886 v0 := b.NewValue0(v.Pos, OpConst16, t) 16887 v0.AuxInt = int64(int16(c | d)) 16888 v.AddArg(v0) 16889 v.AddArg(x) 16890 return true 16891 } 16892 // match: (Or16 (Or16 x (Const16 <t> [d])) (Const16 <t> [c])) 16893 // cond: 16894 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 16895 for { 16896 _ = v.Args[1] 16897 v_0 := v.Args[0] 16898 if v_0.Op != OpOr16 { 16899 break 16900 } 16901 _ = v_0.Args[1] 16902 x := v_0.Args[0] 16903 v_0_1 := v_0.Args[1] 16904 if v_0_1.Op != OpConst16 { 16905 break 16906 } 16907 t := v_0_1.Type 16908 d := v_0_1.AuxInt 16909 v_1 := v.Args[1] 16910 if v_1.Op != OpConst16 { 16911 break 16912 } 16913 if v_1.Type != t { 16914 break 16915 } 16916 c := v_1.AuxInt 16917 v.reset(OpOr16) 16918 v0 := b.NewValue0(v.Pos, OpConst16, t) 16919 v0.AuxInt = int64(int16(c | d)) 16920 v.AddArg(v0) 16921 v.AddArg(x) 16922 return true 16923 } 16924 return false 16925 } 16926 func rewriteValuegeneric_OpOr32_0(v *Value) bool { 16927 // match: (Or32 (Const32 [c]) (Const32 [d])) 16928 // cond: 16929 // result: (Const32 [int64(int32(c|d))]) 16930 for { 16931 _ = v.Args[1] 16932 v_0 := v.Args[0] 16933 if v_0.Op != OpConst32 { 16934 break 16935 } 16936 c := v_0.AuxInt 16937 v_1 := v.Args[1] 16938 if v_1.Op != OpConst32 { 16939 break 16940 } 16941 d := v_1.AuxInt 16942 v.reset(OpConst32) 16943 v.AuxInt = int64(int32(c | d)) 16944 return true 16945 } 16946 // match: (Or32 (Const32 [d]) (Const32 [c])) 16947 // cond: 16948 // result: (Const32 [int64(int32(c|d))]) 16949 for { 16950 _ = v.Args[1] 16951 v_0 := v.Args[0] 16952 if v_0.Op != OpConst32 { 16953 break 16954 } 16955 d := v_0.AuxInt 16956 v_1 := v.Args[1] 16957 if v_1.Op != OpConst32 { 16958 break 16959 } 16960 c := v_1.AuxInt 16961 v.reset(OpConst32) 16962 v.AuxInt = int64(int32(c | d)) 16963 return true 16964 } 16965 // match: (Or32 x x) 16966 // cond: 16967 // result: x 16968 for { 16969 _ = v.Args[1] 16970 x := v.Args[0] 16971 if x != v.Args[1] { 16972 break 16973 } 16974 v.reset(OpCopy) 16975 v.Type = x.Type 16976 v.AddArg(x) 16977 return true 16978 } 16979 // match: (Or32 (Const32 [0]) x) 16980 // cond: 16981 // result: x 16982 for { 16983 _ = v.Args[1] 16984 v_0 := v.Args[0] 16985 if v_0.Op != OpConst32 { 16986 break 16987 } 16988 if v_0.AuxInt != 0 { 16989 break 16990 } 16991 x := v.Args[1] 16992 v.reset(OpCopy) 16993 v.Type = x.Type 16994 v.AddArg(x) 16995 return true 16996 } 16997 // match: (Or32 x (Const32 [0])) 16998 // cond: 16999 // result: x 17000 for { 17001 _ = v.Args[1] 17002 x := v.Args[0] 17003 v_1 := v.Args[1] 17004 if v_1.Op != OpConst32 { 17005 break 17006 } 17007 if v_1.AuxInt != 0 { 17008 break 17009 } 17010 v.reset(OpCopy) 17011 v.Type = x.Type 17012 v.AddArg(x) 17013 return true 17014 } 17015 // match: (Or32 (Const32 [-1]) _) 17016 // cond: 17017 // result: (Const32 [-1]) 17018 for { 17019 _ = v.Args[1] 17020 v_0 := v.Args[0] 17021 if v_0.Op != OpConst32 { 17022 break 17023 } 17024 if v_0.AuxInt != -1 { 17025 break 17026 } 17027 v.reset(OpConst32) 17028 v.AuxInt = -1 17029 return true 17030 } 17031 // match: (Or32 _ (Const32 [-1])) 17032 // cond: 17033 // result: (Const32 [-1]) 17034 for { 17035 _ = v.Args[1] 17036 v_1 := v.Args[1] 17037 if v_1.Op != OpConst32 { 17038 break 17039 } 17040 if v_1.AuxInt != -1 { 17041 break 17042 } 17043 v.reset(OpConst32) 17044 v.AuxInt = -1 17045 return true 17046 } 17047 // match: (Or32 x (Or32 x y)) 17048 // cond: 17049 // result: (Or32 x y) 17050 for { 17051 _ = v.Args[1] 17052 x := v.Args[0] 17053 v_1 := v.Args[1] 17054 if v_1.Op != OpOr32 { 17055 break 17056 } 17057 _ = v_1.Args[1] 17058 if x != v_1.Args[0] { 17059 break 17060 } 17061 y := v_1.Args[1] 17062 v.reset(OpOr32) 17063 v.AddArg(x) 17064 v.AddArg(y) 17065 return true 17066 } 17067 // match: (Or32 x (Or32 y x)) 17068 // cond: 17069 // result: (Or32 x y) 17070 for { 17071 _ = v.Args[1] 17072 x := v.Args[0] 17073 v_1 := v.Args[1] 17074 if v_1.Op != OpOr32 { 17075 break 17076 } 17077 _ = v_1.Args[1] 17078 y := v_1.Args[0] 17079 if x != v_1.Args[1] { 17080 break 17081 } 17082 v.reset(OpOr32) 17083 v.AddArg(x) 17084 v.AddArg(y) 17085 return true 17086 } 17087 // match: (Or32 (Or32 x y) x) 17088 // cond: 17089 // result: (Or32 x y) 17090 for { 17091 _ = v.Args[1] 17092 v_0 := v.Args[0] 17093 if v_0.Op != OpOr32 { 17094 break 17095 } 17096 _ = v_0.Args[1] 17097 x := v_0.Args[0] 17098 y := v_0.Args[1] 17099 if x != v.Args[1] { 17100 break 17101 } 17102 v.reset(OpOr32) 17103 v.AddArg(x) 17104 v.AddArg(y) 17105 return true 17106 } 17107 return false 17108 } 17109 func rewriteValuegeneric_OpOr32_10(v *Value) bool { 17110 b := v.Block 17111 _ = b 17112 // match: (Or32 (Or32 y x) x) 17113 // cond: 17114 // result: (Or32 x y) 17115 for { 17116 _ = v.Args[1] 17117 v_0 := v.Args[0] 17118 if v_0.Op != OpOr32 { 17119 break 17120 } 17121 _ = v_0.Args[1] 17122 y := v_0.Args[0] 17123 x := v_0.Args[1] 17124 if x != v.Args[1] { 17125 break 17126 } 17127 v.reset(OpOr32) 17128 v.AddArg(x) 17129 v.AddArg(y) 17130 return true 17131 } 17132 // match: (Or32 (And32 x (Const32 [c2])) (Const32 <t> [c1])) 17133 // cond: ^(c1 | c2) == 0 17134 // result: (Or32 (Const32 <t> [c1]) x) 17135 for { 17136 _ = v.Args[1] 17137 v_0 := v.Args[0] 17138 if v_0.Op != OpAnd32 { 17139 break 17140 } 17141 _ = v_0.Args[1] 17142 x := v_0.Args[0] 17143 v_0_1 := v_0.Args[1] 17144 if v_0_1.Op != OpConst32 { 17145 break 17146 } 17147 c2 := v_0_1.AuxInt 17148 v_1 := v.Args[1] 17149 if v_1.Op != OpConst32 { 17150 break 17151 } 17152 t := v_1.Type 17153 c1 := v_1.AuxInt 17154 if !(^(c1 | c2) == 0) { 17155 break 17156 } 17157 v.reset(OpOr32) 17158 v0 := b.NewValue0(v.Pos, OpConst32, t) 17159 v0.AuxInt = c1 17160 v.AddArg(v0) 17161 v.AddArg(x) 17162 return true 17163 } 17164 // match: (Or32 (And32 (Const32 [c2]) x) (Const32 <t> [c1])) 17165 // cond: ^(c1 | c2) == 0 17166 // result: (Or32 (Const32 <t> [c1]) x) 17167 for { 17168 _ = v.Args[1] 17169 v_0 := v.Args[0] 17170 if v_0.Op != OpAnd32 { 17171 break 17172 } 17173 _ = v_0.Args[1] 17174 v_0_0 := v_0.Args[0] 17175 if v_0_0.Op != OpConst32 { 17176 break 17177 } 17178 c2 := v_0_0.AuxInt 17179 x := v_0.Args[1] 17180 v_1 := v.Args[1] 17181 if v_1.Op != OpConst32 { 17182 break 17183 } 17184 t := v_1.Type 17185 c1 := v_1.AuxInt 17186 if !(^(c1 | c2) == 0) { 17187 break 17188 } 17189 v.reset(OpOr32) 17190 v0 := b.NewValue0(v.Pos, OpConst32, t) 17191 v0.AuxInt = c1 17192 v.AddArg(v0) 17193 v.AddArg(x) 17194 return true 17195 } 17196 // match: (Or32 (Const32 <t> [c1]) (And32 x (Const32 [c2]))) 17197 // cond: ^(c1 | c2) == 0 17198 // result: (Or32 (Const32 <t> [c1]) x) 17199 for { 17200 _ = v.Args[1] 17201 v_0 := v.Args[0] 17202 if v_0.Op != OpConst32 { 17203 break 17204 } 17205 t := v_0.Type 17206 c1 := v_0.AuxInt 17207 v_1 := v.Args[1] 17208 if v_1.Op != OpAnd32 { 17209 break 17210 } 17211 _ = v_1.Args[1] 17212 x := v_1.Args[0] 17213 v_1_1 := v_1.Args[1] 17214 if v_1_1.Op != OpConst32 { 17215 break 17216 } 17217 c2 := v_1_1.AuxInt 17218 if !(^(c1 | c2) == 0) { 17219 break 17220 } 17221 v.reset(OpOr32) 17222 v0 := b.NewValue0(v.Pos, OpConst32, t) 17223 v0.AuxInt = c1 17224 v.AddArg(v0) 17225 v.AddArg(x) 17226 return true 17227 } 17228 // match: (Or32 (Const32 <t> [c1]) (And32 (Const32 [c2]) x)) 17229 // cond: ^(c1 | c2) == 0 17230 // result: (Or32 (Const32 <t> [c1]) x) 17231 for { 17232 _ = v.Args[1] 17233 v_0 := v.Args[0] 17234 if v_0.Op != OpConst32 { 17235 break 17236 } 17237 t := v_0.Type 17238 c1 := v_0.AuxInt 17239 v_1 := v.Args[1] 17240 if v_1.Op != OpAnd32 { 17241 break 17242 } 17243 _ = v_1.Args[1] 17244 v_1_0 := v_1.Args[0] 17245 if v_1_0.Op != OpConst32 { 17246 break 17247 } 17248 c2 := v_1_0.AuxInt 17249 x := v_1.Args[1] 17250 if !(^(c1 | c2) == 0) { 17251 break 17252 } 17253 v.reset(OpOr32) 17254 v0 := b.NewValue0(v.Pos, OpConst32, t) 17255 v0.AuxInt = c1 17256 v.AddArg(v0) 17257 v.AddArg(x) 17258 return true 17259 } 17260 // match: (Or32 (Or32 i:(Const32 <t>) z) x) 17261 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 17262 // result: (Or32 i (Or32 <t> z x)) 17263 for { 17264 _ = v.Args[1] 17265 v_0 := v.Args[0] 17266 if v_0.Op != OpOr32 { 17267 break 17268 } 17269 _ = v_0.Args[1] 17270 i := v_0.Args[0] 17271 if i.Op != OpConst32 { 17272 break 17273 } 17274 t := i.Type 17275 z := v_0.Args[1] 17276 x := v.Args[1] 17277 if !(z.Op != OpConst32 && x.Op != OpConst32) { 17278 break 17279 } 17280 v.reset(OpOr32) 17281 v.AddArg(i) 17282 v0 := b.NewValue0(v.Pos, OpOr32, t) 17283 v0.AddArg(z) 17284 v0.AddArg(x) 17285 v.AddArg(v0) 17286 return true 17287 } 17288 // match: (Or32 (Or32 z i:(Const32 <t>)) x) 17289 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 17290 // result: (Or32 i (Or32 <t> z x)) 17291 for { 17292 _ = v.Args[1] 17293 v_0 := v.Args[0] 17294 if v_0.Op != OpOr32 { 17295 break 17296 } 17297 _ = v_0.Args[1] 17298 z := v_0.Args[0] 17299 i := v_0.Args[1] 17300 if i.Op != OpConst32 { 17301 break 17302 } 17303 t := i.Type 17304 x := v.Args[1] 17305 if !(z.Op != OpConst32 && x.Op != OpConst32) { 17306 break 17307 } 17308 v.reset(OpOr32) 17309 v.AddArg(i) 17310 v0 := b.NewValue0(v.Pos, OpOr32, t) 17311 v0.AddArg(z) 17312 v0.AddArg(x) 17313 v.AddArg(v0) 17314 return true 17315 } 17316 // match: (Or32 x (Or32 i:(Const32 <t>) z)) 17317 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 17318 // result: (Or32 i (Or32 <t> z x)) 17319 for { 17320 _ = v.Args[1] 17321 x := v.Args[0] 17322 v_1 := v.Args[1] 17323 if v_1.Op != OpOr32 { 17324 break 17325 } 17326 _ = v_1.Args[1] 17327 i := v_1.Args[0] 17328 if i.Op != OpConst32 { 17329 break 17330 } 17331 t := i.Type 17332 z := v_1.Args[1] 17333 if !(z.Op != OpConst32 && x.Op != OpConst32) { 17334 break 17335 } 17336 v.reset(OpOr32) 17337 v.AddArg(i) 17338 v0 := b.NewValue0(v.Pos, OpOr32, t) 17339 v0.AddArg(z) 17340 v0.AddArg(x) 17341 v.AddArg(v0) 17342 return true 17343 } 17344 // match: (Or32 x (Or32 z i:(Const32 <t>))) 17345 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 17346 // result: (Or32 i (Or32 <t> z x)) 17347 for { 17348 _ = v.Args[1] 17349 x := v.Args[0] 17350 v_1 := v.Args[1] 17351 if v_1.Op != OpOr32 { 17352 break 17353 } 17354 _ = v_1.Args[1] 17355 z := v_1.Args[0] 17356 i := v_1.Args[1] 17357 if i.Op != OpConst32 { 17358 break 17359 } 17360 t := i.Type 17361 if !(z.Op != OpConst32 && x.Op != OpConst32) { 17362 break 17363 } 17364 v.reset(OpOr32) 17365 v.AddArg(i) 17366 v0 := b.NewValue0(v.Pos, OpOr32, t) 17367 v0.AddArg(z) 17368 v0.AddArg(x) 17369 v.AddArg(v0) 17370 return true 17371 } 17372 // match: (Or32 (Const32 <t> [c]) (Or32 (Const32 <t> [d]) x)) 17373 // cond: 17374 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 17375 for { 17376 _ = v.Args[1] 17377 v_0 := v.Args[0] 17378 if v_0.Op != OpConst32 { 17379 break 17380 } 17381 t := v_0.Type 17382 c := v_0.AuxInt 17383 v_1 := v.Args[1] 17384 if v_1.Op != OpOr32 { 17385 break 17386 } 17387 _ = v_1.Args[1] 17388 v_1_0 := v_1.Args[0] 17389 if v_1_0.Op != OpConst32 { 17390 break 17391 } 17392 if v_1_0.Type != t { 17393 break 17394 } 17395 d := v_1_0.AuxInt 17396 x := v_1.Args[1] 17397 v.reset(OpOr32) 17398 v0 := b.NewValue0(v.Pos, OpConst32, t) 17399 v0.AuxInt = int64(int32(c | d)) 17400 v.AddArg(v0) 17401 v.AddArg(x) 17402 return true 17403 } 17404 return false 17405 } 17406 func rewriteValuegeneric_OpOr32_20(v *Value) bool { 17407 b := v.Block 17408 _ = b 17409 // match: (Or32 (Const32 <t> [c]) (Or32 x (Const32 <t> [d]))) 17410 // cond: 17411 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 17412 for { 17413 _ = v.Args[1] 17414 v_0 := v.Args[0] 17415 if v_0.Op != OpConst32 { 17416 break 17417 } 17418 t := v_0.Type 17419 c := v_0.AuxInt 17420 v_1 := v.Args[1] 17421 if v_1.Op != OpOr32 { 17422 break 17423 } 17424 _ = v_1.Args[1] 17425 x := v_1.Args[0] 17426 v_1_1 := v_1.Args[1] 17427 if v_1_1.Op != OpConst32 { 17428 break 17429 } 17430 if v_1_1.Type != t { 17431 break 17432 } 17433 d := v_1_1.AuxInt 17434 v.reset(OpOr32) 17435 v0 := b.NewValue0(v.Pos, OpConst32, t) 17436 v0.AuxInt = int64(int32(c | d)) 17437 v.AddArg(v0) 17438 v.AddArg(x) 17439 return true 17440 } 17441 // match: (Or32 (Or32 (Const32 <t> [d]) x) (Const32 <t> [c])) 17442 // cond: 17443 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 17444 for { 17445 _ = v.Args[1] 17446 v_0 := v.Args[0] 17447 if v_0.Op != OpOr32 { 17448 break 17449 } 17450 _ = v_0.Args[1] 17451 v_0_0 := v_0.Args[0] 17452 if v_0_0.Op != OpConst32 { 17453 break 17454 } 17455 t := v_0_0.Type 17456 d := v_0_0.AuxInt 17457 x := v_0.Args[1] 17458 v_1 := v.Args[1] 17459 if v_1.Op != OpConst32 { 17460 break 17461 } 17462 if v_1.Type != t { 17463 break 17464 } 17465 c := v_1.AuxInt 17466 v.reset(OpOr32) 17467 v0 := b.NewValue0(v.Pos, OpConst32, t) 17468 v0.AuxInt = int64(int32(c | d)) 17469 v.AddArg(v0) 17470 v.AddArg(x) 17471 return true 17472 } 17473 // match: (Or32 (Or32 x (Const32 <t> [d])) (Const32 <t> [c])) 17474 // cond: 17475 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 17476 for { 17477 _ = v.Args[1] 17478 v_0 := v.Args[0] 17479 if v_0.Op != OpOr32 { 17480 break 17481 } 17482 _ = v_0.Args[1] 17483 x := v_0.Args[0] 17484 v_0_1 := v_0.Args[1] 17485 if v_0_1.Op != OpConst32 { 17486 break 17487 } 17488 t := v_0_1.Type 17489 d := v_0_1.AuxInt 17490 v_1 := v.Args[1] 17491 if v_1.Op != OpConst32 { 17492 break 17493 } 17494 if v_1.Type != t { 17495 break 17496 } 17497 c := v_1.AuxInt 17498 v.reset(OpOr32) 17499 v0 := b.NewValue0(v.Pos, OpConst32, t) 17500 v0.AuxInt = int64(int32(c | d)) 17501 v.AddArg(v0) 17502 v.AddArg(x) 17503 return true 17504 } 17505 return false 17506 } 17507 func rewriteValuegeneric_OpOr64_0(v *Value) bool { 17508 // match: (Or64 (Const64 [c]) (Const64 [d])) 17509 // cond: 17510 // result: (Const64 [c|d]) 17511 for { 17512 _ = v.Args[1] 17513 v_0 := v.Args[0] 17514 if v_0.Op != OpConst64 { 17515 break 17516 } 17517 c := v_0.AuxInt 17518 v_1 := v.Args[1] 17519 if v_1.Op != OpConst64 { 17520 break 17521 } 17522 d := v_1.AuxInt 17523 v.reset(OpConst64) 17524 v.AuxInt = c | d 17525 return true 17526 } 17527 // match: (Or64 (Const64 [d]) (Const64 [c])) 17528 // cond: 17529 // result: (Const64 [c|d]) 17530 for { 17531 _ = v.Args[1] 17532 v_0 := v.Args[0] 17533 if v_0.Op != OpConst64 { 17534 break 17535 } 17536 d := v_0.AuxInt 17537 v_1 := v.Args[1] 17538 if v_1.Op != OpConst64 { 17539 break 17540 } 17541 c := v_1.AuxInt 17542 v.reset(OpConst64) 17543 v.AuxInt = c | d 17544 return true 17545 } 17546 // match: (Or64 x x) 17547 // cond: 17548 // result: x 17549 for { 17550 _ = v.Args[1] 17551 x := v.Args[0] 17552 if x != v.Args[1] { 17553 break 17554 } 17555 v.reset(OpCopy) 17556 v.Type = x.Type 17557 v.AddArg(x) 17558 return true 17559 } 17560 // match: (Or64 (Const64 [0]) x) 17561 // cond: 17562 // result: x 17563 for { 17564 _ = v.Args[1] 17565 v_0 := v.Args[0] 17566 if v_0.Op != OpConst64 { 17567 break 17568 } 17569 if v_0.AuxInt != 0 { 17570 break 17571 } 17572 x := v.Args[1] 17573 v.reset(OpCopy) 17574 v.Type = x.Type 17575 v.AddArg(x) 17576 return true 17577 } 17578 // match: (Or64 x (Const64 [0])) 17579 // cond: 17580 // result: x 17581 for { 17582 _ = v.Args[1] 17583 x := v.Args[0] 17584 v_1 := v.Args[1] 17585 if v_1.Op != OpConst64 { 17586 break 17587 } 17588 if v_1.AuxInt != 0 { 17589 break 17590 } 17591 v.reset(OpCopy) 17592 v.Type = x.Type 17593 v.AddArg(x) 17594 return true 17595 } 17596 // match: (Or64 (Const64 [-1]) _) 17597 // cond: 17598 // result: (Const64 [-1]) 17599 for { 17600 _ = v.Args[1] 17601 v_0 := v.Args[0] 17602 if v_0.Op != OpConst64 { 17603 break 17604 } 17605 if v_0.AuxInt != -1 { 17606 break 17607 } 17608 v.reset(OpConst64) 17609 v.AuxInt = -1 17610 return true 17611 } 17612 // match: (Or64 _ (Const64 [-1])) 17613 // cond: 17614 // result: (Const64 [-1]) 17615 for { 17616 _ = v.Args[1] 17617 v_1 := v.Args[1] 17618 if v_1.Op != OpConst64 { 17619 break 17620 } 17621 if v_1.AuxInt != -1 { 17622 break 17623 } 17624 v.reset(OpConst64) 17625 v.AuxInt = -1 17626 return true 17627 } 17628 // match: (Or64 x (Or64 x y)) 17629 // cond: 17630 // result: (Or64 x y) 17631 for { 17632 _ = v.Args[1] 17633 x := v.Args[0] 17634 v_1 := v.Args[1] 17635 if v_1.Op != OpOr64 { 17636 break 17637 } 17638 _ = v_1.Args[1] 17639 if x != v_1.Args[0] { 17640 break 17641 } 17642 y := v_1.Args[1] 17643 v.reset(OpOr64) 17644 v.AddArg(x) 17645 v.AddArg(y) 17646 return true 17647 } 17648 // match: (Or64 x (Or64 y x)) 17649 // cond: 17650 // result: (Or64 x y) 17651 for { 17652 _ = v.Args[1] 17653 x := v.Args[0] 17654 v_1 := v.Args[1] 17655 if v_1.Op != OpOr64 { 17656 break 17657 } 17658 _ = v_1.Args[1] 17659 y := v_1.Args[0] 17660 if x != v_1.Args[1] { 17661 break 17662 } 17663 v.reset(OpOr64) 17664 v.AddArg(x) 17665 v.AddArg(y) 17666 return true 17667 } 17668 // match: (Or64 (Or64 x y) x) 17669 // cond: 17670 // result: (Or64 x y) 17671 for { 17672 _ = v.Args[1] 17673 v_0 := v.Args[0] 17674 if v_0.Op != OpOr64 { 17675 break 17676 } 17677 _ = v_0.Args[1] 17678 x := v_0.Args[0] 17679 y := v_0.Args[1] 17680 if x != v.Args[1] { 17681 break 17682 } 17683 v.reset(OpOr64) 17684 v.AddArg(x) 17685 v.AddArg(y) 17686 return true 17687 } 17688 return false 17689 } 17690 func rewriteValuegeneric_OpOr64_10(v *Value) bool { 17691 b := v.Block 17692 _ = b 17693 // match: (Or64 (Or64 y x) x) 17694 // cond: 17695 // result: (Or64 x y) 17696 for { 17697 _ = v.Args[1] 17698 v_0 := v.Args[0] 17699 if v_0.Op != OpOr64 { 17700 break 17701 } 17702 _ = v_0.Args[1] 17703 y := v_0.Args[0] 17704 x := v_0.Args[1] 17705 if x != v.Args[1] { 17706 break 17707 } 17708 v.reset(OpOr64) 17709 v.AddArg(x) 17710 v.AddArg(y) 17711 return true 17712 } 17713 // match: (Or64 (And64 x (Const64 [c2])) (Const64 <t> [c1])) 17714 // cond: ^(c1 | c2) == 0 17715 // result: (Or64 (Const64 <t> [c1]) x) 17716 for { 17717 _ = v.Args[1] 17718 v_0 := v.Args[0] 17719 if v_0.Op != OpAnd64 { 17720 break 17721 } 17722 _ = v_0.Args[1] 17723 x := v_0.Args[0] 17724 v_0_1 := v_0.Args[1] 17725 if v_0_1.Op != OpConst64 { 17726 break 17727 } 17728 c2 := v_0_1.AuxInt 17729 v_1 := v.Args[1] 17730 if v_1.Op != OpConst64 { 17731 break 17732 } 17733 t := v_1.Type 17734 c1 := v_1.AuxInt 17735 if !(^(c1 | c2) == 0) { 17736 break 17737 } 17738 v.reset(OpOr64) 17739 v0 := b.NewValue0(v.Pos, OpConst64, t) 17740 v0.AuxInt = c1 17741 v.AddArg(v0) 17742 v.AddArg(x) 17743 return true 17744 } 17745 // match: (Or64 (And64 (Const64 [c2]) x) (Const64 <t> [c1])) 17746 // cond: ^(c1 | c2) == 0 17747 // result: (Or64 (Const64 <t> [c1]) x) 17748 for { 17749 _ = v.Args[1] 17750 v_0 := v.Args[0] 17751 if v_0.Op != OpAnd64 { 17752 break 17753 } 17754 _ = v_0.Args[1] 17755 v_0_0 := v_0.Args[0] 17756 if v_0_0.Op != OpConst64 { 17757 break 17758 } 17759 c2 := v_0_0.AuxInt 17760 x := v_0.Args[1] 17761 v_1 := v.Args[1] 17762 if v_1.Op != OpConst64 { 17763 break 17764 } 17765 t := v_1.Type 17766 c1 := v_1.AuxInt 17767 if !(^(c1 | c2) == 0) { 17768 break 17769 } 17770 v.reset(OpOr64) 17771 v0 := b.NewValue0(v.Pos, OpConst64, t) 17772 v0.AuxInt = c1 17773 v.AddArg(v0) 17774 v.AddArg(x) 17775 return true 17776 } 17777 // match: (Or64 (Const64 <t> [c1]) (And64 x (Const64 [c2]))) 17778 // cond: ^(c1 | c2) == 0 17779 // result: (Or64 (Const64 <t> [c1]) x) 17780 for { 17781 _ = v.Args[1] 17782 v_0 := v.Args[0] 17783 if v_0.Op != OpConst64 { 17784 break 17785 } 17786 t := v_0.Type 17787 c1 := v_0.AuxInt 17788 v_1 := v.Args[1] 17789 if v_1.Op != OpAnd64 { 17790 break 17791 } 17792 _ = v_1.Args[1] 17793 x := v_1.Args[0] 17794 v_1_1 := v_1.Args[1] 17795 if v_1_1.Op != OpConst64 { 17796 break 17797 } 17798 c2 := v_1_1.AuxInt 17799 if !(^(c1 | c2) == 0) { 17800 break 17801 } 17802 v.reset(OpOr64) 17803 v0 := b.NewValue0(v.Pos, OpConst64, t) 17804 v0.AuxInt = c1 17805 v.AddArg(v0) 17806 v.AddArg(x) 17807 return true 17808 } 17809 // match: (Or64 (Const64 <t> [c1]) (And64 (Const64 [c2]) x)) 17810 // cond: ^(c1 | c2) == 0 17811 // result: (Or64 (Const64 <t> [c1]) x) 17812 for { 17813 _ = v.Args[1] 17814 v_0 := v.Args[0] 17815 if v_0.Op != OpConst64 { 17816 break 17817 } 17818 t := v_0.Type 17819 c1 := v_0.AuxInt 17820 v_1 := v.Args[1] 17821 if v_1.Op != OpAnd64 { 17822 break 17823 } 17824 _ = v_1.Args[1] 17825 v_1_0 := v_1.Args[0] 17826 if v_1_0.Op != OpConst64 { 17827 break 17828 } 17829 c2 := v_1_0.AuxInt 17830 x := v_1.Args[1] 17831 if !(^(c1 | c2) == 0) { 17832 break 17833 } 17834 v.reset(OpOr64) 17835 v0 := b.NewValue0(v.Pos, OpConst64, t) 17836 v0.AuxInt = c1 17837 v.AddArg(v0) 17838 v.AddArg(x) 17839 return true 17840 } 17841 // match: (Or64 (Or64 i:(Const64 <t>) z) x) 17842 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 17843 // result: (Or64 i (Or64 <t> z x)) 17844 for { 17845 _ = v.Args[1] 17846 v_0 := v.Args[0] 17847 if v_0.Op != OpOr64 { 17848 break 17849 } 17850 _ = v_0.Args[1] 17851 i := v_0.Args[0] 17852 if i.Op != OpConst64 { 17853 break 17854 } 17855 t := i.Type 17856 z := v_0.Args[1] 17857 x := v.Args[1] 17858 if !(z.Op != OpConst64 && x.Op != OpConst64) { 17859 break 17860 } 17861 v.reset(OpOr64) 17862 v.AddArg(i) 17863 v0 := b.NewValue0(v.Pos, OpOr64, t) 17864 v0.AddArg(z) 17865 v0.AddArg(x) 17866 v.AddArg(v0) 17867 return true 17868 } 17869 // match: (Or64 (Or64 z i:(Const64 <t>)) x) 17870 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 17871 // result: (Or64 i (Or64 <t> z x)) 17872 for { 17873 _ = v.Args[1] 17874 v_0 := v.Args[0] 17875 if v_0.Op != OpOr64 { 17876 break 17877 } 17878 _ = v_0.Args[1] 17879 z := v_0.Args[0] 17880 i := v_0.Args[1] 17881 if i.Op != OpConst64 { 17882 break 17883 } 17884 t := i.Type 17885 x := v.Args[1] 17886 if !(z.Op != OpConst64 && x.Op != OpConst64) { 17887 break 17888 } 17889 v.reset(OpOr64) 17890 v.AddArg(i) 17891 v0 := b.NewValue0(v.Pos, OpOr64, t) 17892 v0.AddArg(z) 17893 v0.AddArg(x) 17894 v.AddArg(v0) 17895 return true 17896 } 17897 // match: (Or64 x (Or64 i:(Const64 <t>) z)) 17898 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 17899 // result: (Or64 i (Or64 <t> z x)) 17900 for { 17901 _ = v.Args[1] 17902 x := v.Args[0] 17903 v_1 := v.Args[1] 17904 if v_1.Op != OpOr64 { 17905 break 17906 } 17907 _ = v_1.Args[1] 17908 i := v_1.Args[0] 17909 if i.Op != OpConst64 { 17910 break 17911 } 17912 t := i.Type 17913 z := v_1.Args[1] 17914 if !(z.Op != OpConst64 && x.Op != OpConst64) { 17915 break 17916 } 17917 v.reset(OpOr64) 17918 v.AddArg(i) 17919 v0 := b.NewValue0(v.Pos, OpOr64, t) 17920 v0.AddArg(z) 17921 v0.AddArg(x) 17922 v.AddArg(v0) 17923 return true 17924 } 17925 // match: (Or64 x (Or64 z i:(Const64 <t>))) 17926 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 17927 // result: (Or64 i (Or64 <t> z x)) 17928 for { 17929 _ = v.Args[1] 17930 x := v.Args[0] 17931 v_1 := v.Args[1] 17932 if v_1.Op != OpOr64 { 17933 break 17934 } 17935 _ = v_1.Args[1] 17936 z := v_1.Args[0] 17937 i := v_1.Args[1] 17938 if i.Op != OpConst64 { 17939 break 17940 } 17941 t := i.Type 17942 if !(z.Op != OpConst64 && x.Op != OpConst64) { 17943 break 17944 } 17945 v.reset(OpOr64) 17946 v.AddArg(i) 17947 v0 := b.NewValue0(v.Pos, OpOr64, t) 17948 v0.AddArg(z) 17949 v0.AddArg(x) 17950 v.AddArg(v0) 17951 return true 17952 } 17953 // match: (Or64 (Const64 <t> [c]) (Or64 (Const64 <t> [d]) x)) 17954 // cond: 17955 // result: (Or64 (Const64 <t> [c|d]) x) 17956 for { 17957 _ = v.Args[1] 17958 v_0 := v.Args[0] 17959 if v_0.Op != OpConst64 { 17960 break 17961 } 17962 t := v_0.Type 17963 c := v_0.AuxInt 17964 v_1 := v.Args[1] 17965 if v_1.Op != OpOr64 { 17966 break 17967 } 17968 _ = v_1.Args[1] 17969 v_1_0 := v_1.Args[0] 17970 if v_1_0.Op != OpConst64 { 17971 break 17972 } 17973 if v_1_0.Type != t { 17974 break 17975 } 17976 d := v_1_0.AuxInt 17977 x := v_1.Args[1] 17978 v.reset(OpOr64) 17979 v0 := b.NewValue0(v.Pos, OpConst64, t) 17980 v0.AuxInt = c | d 17981 v.AddArg(v0) 17982 v.AddArg(x) 17983 return true 17984 } 17985 return false 17986 } 17987 func rewriteValuegeneric_OpOr64_20(v *Value) bool { 17988 b := v.Block 17989 _ = b 17990 // match: (Or64 (Const64 <t> [c]) (Or64 x (Const64 <t> [d]))) 17991 // cond: 17992 // result: (Or64 (Const64 <t> [c|d]) x) 17993 for { 17994 _ = v.Args[1] 17995 v_0 := v.Args[0] 17996 if v_0.Op != OpConst64 { 17997 break 17998 } 17999 t := v_0.Type 18000 c := v_0.AuxInt 18001 v_1 := v.Args[1] 18002 if v_1.Op != OpOr64 { 18003 break 18004 } 18005 _ = v_1.Args[1] 18006 x := v_1.Args[0] 18007 v_1_1 := v_1.Args[1] 18008 if v_1_1.Op != OpConst64 { 18009 break 18010 } 18011 if v_1_1.Type != t { 18012 break 18013 } 18014 d := v_1_1.AuxInt 18015 v.reset(OpOr64) 18016 v0 := b.NewValue0(v.Pos, OpConst64, t) 18017 v0.AuxInt = c | d 18018 v.AddArg(v0) 18019 v.AddArg(x) 18020 return true 18021 } 18022 // match: (Or64 (Or64 (Const64 <t> [d]) x) (Const64 <t> [c])) 18023 // cond: 18024 // result: (Or64 (Const64 <t> [c|d]) x) 18025 for { 18026 _ = v.Args[1] 18027 v_0 := v.Args[0] 18028 if v_0.Op != OpOr64 { 18029 break 18030 } 18031 _ = v_0.Args[1] 18032 v_0_0 := v_0.Args[0] 18033 if v_0_0.Op != OpConst64 { 18034 break 18035 } 18036 t := v_0_0.Type 18037 d := v_0_0.AuxInt 18038 x := v_0.Args[1] 18039 v_1 := v.Args[1] 18040 if v_1.Op != OpConst64 { 18041 break 18042 } 18043 if v_1.Type != t { 18044 break 18045 } 18046 c := v_1.AuxInt 18047 v.reset(OpOr64) 18048 v0 := b.NewValue0(v.Pos, OpConst64, t) 18049 v0.AuxInt = c | d 18050 v.AddArg(v0) 18051 v.AddArg(x) 18052 return true 18053 } 18054 // match: (Or64 (Or64 x (Const64 <t> [d])) (Const64 <t> [c])) 18055 // cond: 18056 // result: (Or64 (Const64 <t> [c|d]) x) 18057 for { 18058 _ = v.Args[1] 18059 v_0 := v.Args[0] 18060 if v_0.Op != OpOr64 { 18061 break 18062 } 18063 _ = v_0.Args[1] 18064 x := v_0.Args[0] 18065 v_0_1 := v_0.Args[1] 18066 if v_0_1.Op != OpConst64 { 18067 break 18068 } 18069 t := v_0_1.Type 18070 d := v_0_1.AuxInt 18071 v_1 := v.Args[1] 18072 if v_1.Op != OpConst64 { 18073 break 18074 } 18075 if v_1.Type != t { 18076 break 18077 } 18078 c := v_1.AuxInt 18079 v.reset(OpOr64) 18080 v0 := b.NewValue0(v.Pos, OpConst64, t) 18081 v0.AuxInt = c | d 18082 v.AddArg(v0) 18083 v.AddArg(x) 18084 return true 18085 } 18086 return false 18087 } 18088 func rewriteValuegeneric_OpOr8_0(v *Value) bool { 18089 // match: (Or8 (Const8 [c]) (Const8 [d])) 18090 // cond: 18091 // result: (Const8 [int64(int8(c|d))]) 18092 for { 18093 _ = v.Args[1] 18094 v_0 := v.Args[0] 18095 if v_0.Op != OpConst8 { 18096 break 18097 } 18098 c := v_0.AuxInt 18099 v_1 := v.Args[1] 18100 if v_1.Op != OpConst8 { 18101 break 18102 } 18103 d := v_1.AuxInt 18104 v.reset(OpConst8) 18105 v.AuxInt = int64(int8(c | d)) 18106 return true 18107 } 18108 // match: (Or8 (Const8 [d]) (Const8 [c])) 18109 // cond: 18110 // result: (Const8 [int64(int8(c|d))]) 18111 for { 18112 _ = v.Args[1] 18113 v_0 := v.Args[0] 18114 if v_0.Op != OpConst8 { 18115 break 18116 } 18117 d := v_0.AuxInt 18118 v_1 := v.Args[1] 18119 if v_1.Op != OpConst8 { 18120 break 18121 } 18122 c := v_1.AuxInt 18123 v.reset(OpConst8) 18124 v.AuxInt = int64(int8(c | d)) 18125 return true 18126 } 18127 // match: (Or8 x x) 18128 // cond: 18129 // result: x 18130 for { 18131 _ = v.Args[1] 18132 x := v.Args[0] 18133 if x != v.Args[1] { 18134 break 18135 } 18136 v.reset(OpCopy) 18137 v.Type = x.Type 18138 v.AddArg(x) 18139 return true 18140 } 18141 // match: (Or8 (Const8 [0]) x) 18142 // cond: 18143 // result: x 18144 for { 18145 _ = v.Args[1] 18146 v_0 := v.Args[0] 18147 if v_0.Op != OpConst8 { 18148 break 18149 } 18150 if v_0.AuxInt != 0 { 18151 break 18152 } 18153 x := v.Args[1] 18154 v.reset(OpCopy) 18155 v.Type = x.Type 18156 v.AddArg(x) 18157 return true 18158 } 18159 // match: (Or8 x (Const8 [0])) 18160 // cond: 18161 // result: x 18162 for { 18163 _ = v.Args[1] 18164 x := v.Args[0] 18165 v_1 := v.Args[1] 18166 if v_1.Op != OpConst8 { 18167 break 18168 } 18169 if v_1.AuxInt != 0 { 18170 break 18171 } 18172 v.reset(OpCopy) 18173 v.Type = x.Type 18174 v.AddArg(x) 18175 return true 18176 } 18177 // match: (Or8 (Const8 [-1]) _) 18178 // cond: 18179 // result: (Const8 [-1]) 18180 for { 18181 _ = v.Args[1] 18182 v_0 := v.Args[0] 18183 if v_0.Op != OpConst8 { 18184 break 18185 } 18186 if v_0.AuxInt != -1 { 18187 break 18188 } 18189 v.reset(OpConst8) 18190 v.AuxInt = -1 18191 return true 18192 } 18193 // match: (Or8 _ (Const8 [-1])) 18194 // cond: 18195 // result: (Const8 [-1]) 18196 for { 18197 _ = v.Args[1] 18198 v_1 := v.Args[1] 18199 if v_1.Op != OpConst8 { 18200 break 18201 } 18202 if v_1.AuxInt != -1 { 18203 break 18204 } 18205 v.reset(OpConst8) 18206 v.AuxInt = -1 18207 return true 18208 } 18209 // match: (Or8 x (Or8 x y)) 18210 // cond: 18211 // result: (Or8 x y) 18212 for { 18213 _ = v.Args[1] 18214 x := v.Args[0] 18215 v_1 := v.Args[1] 18216 if v_1.Op != OpOr8 { 18217 break 18218 } 18219 _ = v_1.Args[1] 18220 if x != v_1.Args[0] { 18221 break 18222 } 18223 y := v_1.Args[1] 18224 v.reset(OpOr8) 18225 v.AddArg(x) 18226 v.AddArg(y) 18227 return true 18228 } 18229 // match: (Or8 x (Or8 y x)) 18230 // cond: 18231 // result: (Or8 x y) 18232 for { 18233 _ = v.Args[1] 18234 x := v.Args[0] 18235 v_1 := v.Args[1] 18236 if v_1.Op != OpOr8 { 18237 break 18238 } 18239 _ = v_1.Args[1] 18240 y := v_1.Args[0] 18241 if x != v_1.Args[1] { 18242 break 18243 } 18244 v.reset(OpOr8) 18245 v.AddArg(x) 18246 v.AddArg(y) 18247 return true 18248 } 18249 // match: (Or8 (Or8 x y) x) 18250 // cond: 18251 // result: (Or8 x y) 18252 for { 18253 _ = v.Args[1] 18254 v_0 := v.Args[0] 18255 if v_0.Op != OpOr8 { 18256 break 18257 } 18258 _ = v_0.Args[1] 18259 x := v_0.Args[0] 18260 y := v_0.Args[1] 18261 if x != v.Args[1] { 18262 break 18263 } 18264 v.reset(OpOr8) 18265 v.AddArg(x) 18266 v.AddArg(y) 18267 return true 18268 } 18269 return false 18270 } 18271 func rewriteValuegeneric_OpOr8_10(v *Value) bool { 18272 b := v.Block 18273 _ = b 18274 // match: (Or8 (Or8 y x) x) 18275 // cond: 18276 // result: (Or8 x y) 18277 for { 18278 _ = v.Args[1] 18279 v_0 := v.Args[0] 18280 if v_0.Op != OpOr8 { 18281 break 18282 } 18283 _ = v_0.Args[1] 18284 y := v_0.Args[0] 18285 x := v_0.Args[1] 18286 if x != v.Args[1] { 18287 break 18288 } 18289 v.reset(OpOr8) 18290 v.AddArg(x) 18291 v.AddArg(y) 18292 return true 18293 } 18294 // match: (Or8 (And8 x (Const8 [c2])) (Const8 <t> [c1])) 18295 // cond: ^(c1 | c2) == 0 18296 // result: (Or8 (Const8 <t> [c1]) x) 18297 for { 18298 _ = v.Args[1] 18299 v_0 := v.Args[0] 18300 if v_0.Op != OpAnd8 { 18301 break 18302 } 18303 _ = v_0.Args[1] 18304 x := v_0.Args[0] 18305 v_0_1 := v_0.Args[1] 18306 if v_0_1.Op != OpConst8 { 18307 break 18308 } 18309 c2 := v_0_1.AuxInt 18310 v_1 := v.Args[1] 18311 if v_1.Op != OpConst8 { 18312 break 18313 } 18314 t := v_1.Type 18315 c1 := v_1.AuxInt 18316 if !(^(c1 | c2) == 0) { 18317 break 18318 } 18319 v.reset(OpOr8) 18320 v0 := b.NewValue0(v.Pos, OpConst8, t) 18321 v0.AuxInt = c1 18322 v.AddArg(v0) 18323 v.AddArg(x) 18324 return true 18325 } 18326 // match: (Or8 (And8 (Const8 [c2]) x) (Const8 <t> [c1])) 18327 // cond: ^(c1 | c2) == 0 18328 // result: (Or8 (Const8 <t> [c1]) x) 18329 for { 18330 _ = v.Args[1] 18331 v_0 := v.Args[0] 18332 if v_0.Op != OpAnd8 { 18333 break 18334 } 18335 _ = v_0.Args[1] 18336 v_0_0 := v_0.Args[0] 18337 if v_0_0.Op != OpConst8 { 18338 break 18339 } 18340 c2 := v_0_0.AuxInt 18341 x := v_0.Args[1] 18342 v_1 := v.Args[1] 18343 if v_1.Op != OpConst8 { 18344 break 18345 } 18346 t := v_1.Type 18347 c1 := v_1.AuxInt 18348 if !(^(c1 | c2) == 0) { 18349 break 18350 } 18351 v.reset(OpOr8) 18352 v0 := b.NewValue0(v.Pos, OpConst8, t) 18353 v0.AuxInt = c1 18354 v.AddArg(v0) 18355 v.AddArg(x) 18356 return true 18357 } 18358 // match: (Or8 (Const8 <t> [c1]) (And8 x (Const8 [c2]))) 18359 // cond: ^(c1 | c2) == 0 18360 // result: (Or8 (Const8 <t> [c1]) x) 18361 for { 18362 _ = v.Args[1] 18363 v_0 := v.Args[0] 18364 if v_0.Op != OpConst8 { 18365 break 18366 } 18367 t := v_0.Type 18368 c1 := v_0.AuxInt 18369 v_1 := v.Args[1] 18370 if v_1.Op != OpAnd8 { 18371 break 18372 } 18373 _ = v_1.Args[1] 18374 x := v_1.Args[0] 18375 v_1_1 := v_1.Args[1] 18376 if v_1_1.Op != OpConst8 { 18377 break 18378 } 18379 c2 := v_1_1.AuxInt 18380 if !(^(c1 | c2) == 0) { 18381 break 18382 } 18383 v.reset(OpOr8) 18384 v0 := b.NewValue0(v.Pos, OpConst8, t) 18385 v0.AuxInt = c1 18386 v.AddArg(v0) 18387 v.AddArg(x) 18388 return true 18389 } 18390 // match: (Or8 (Const8 <t> [c1]) (And8 (Const8 [c2]) x)) 18391 // cond: ^(c1 | c2) == 0 18392 // result: (Or8 (Const8 <t> [c1]) x) 18393 for { 18394 _ = v.Args[1] 18395 v_0 := v.Args[0] 18396 if v_0.Op != OpConst8 { 18397 break 18398 } 18399 t := v_0.Type 18400 c1 := v_0.AuxInt 18401 v_1 := v.Args[1] 18402 if v_1.Op != OpAnd8 { 18403 break 18404 } 18405 _ = v_1.Args[1] 18406 v_1_0 := v_1.Args[0] 18407 if v_1_0.Op != OpConst8 { 18408 break 18409 } 18410 c2 := v_1_0.AuxInt 18411 x := v_1.Args[1] 18412 if !(^(c1 | c2) == 0) { 18413 break 18414 } 18415 v.reset(OpOr8) 18416 v0 := b.NewValue0(v.Pos, OpConst8, t) 18417 v0.AuxInt = c1 18418 v.AddArg(v0) 18419 v.AddArg(x) 18420 return true 18421 } 18422 // match: (Or8 (Or8 i:(Const8 <t>) z) x) 18423 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 18424 // result: (Or8 i (Or8 <t> z x)) 18425 for { 18426 _ = v.Args[1] 18427 v_0 := v.Args[0] 18428 if v_0.Op != OpOr8 { 18429 break 18430 } 18431 _ = v_0.Args[1] 18432 i := v_0.Args[0] 18433 if i.Op != OpConst8 { 18434 break 18435 } 18436 t := i.Type 18437 z := v_0.Args[1] 18438 x := v.Args[1] 18439 if !(z.Op != OpConst8 && x.Op != OpConst8) { 18440 break 18441 } 18442 v.reset(OpOr8) 18443 v.AddArg(i) 18444 v0 := b.NewValue0(v.Pos, OpOr8, t) 18445 v0.AddArg(z) 18446 v0.AddArg(x) 18447 v.AddArg(v0) 18448 return true 18449 } 18450 // match: (Or8 (Or8 z i:(Const8 <t>)) x) 18451 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 18452 // result: (Or8 i (Or8 <t> z x)) 18453 for { 18454 _ = v.Args[1] 18455 v_0 := v.Args[0] 18456 if v_0.Op != OpOr8 { 18457 break 18458 } 18459 _ = v_0.Args[1] 18460 z := v_0.Args[0] 18461 i := v_0.Args[1] 18462 if i.Op != OpConst8 { 18463 break 18464 } 18465 t := i.Type 18466 x := v.Args[1] 18467 if !(z.Op != OpConst8 && x.Op != OpConst8) { 18468 break 18469 } 18470 v.reset(OpOr8) 18471 v.AddArg(i) 18472 v0 := b.NewValue0(v.Pos, OpOr8, t) 18473 v0.AddArg(z) 18474 v0.AddArg(x) 18475 v.AddArg(v0) 18476 return true 18477 } 18478 // match: (Or8 x (Or8 i:(Const8 <t>) z)) 18479 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 18480 // result: (Or8 i (Or8 <t> z x)) 18481 for { 18482 _ = v.Args[1] 18483 x := v.Args[0] 18484 v_1 := v.Args[1] 18485 if v_1.Op != OpOr8 { 18486 break 18487 } 18488 _ = v_1.Args[1] 18489 i := v_1.Args[0] 18490 if i.Op != OpConst8 { 18491 break 18492 } 18493 t := i.Type 18494 z := v_1.Args[1] 18495 if !(z.Op != OpConst8 && x.Op != OpConst8) { 18496 break 18497 } 18498 v.reset(OpOr8) 18499 v.AddArg(i) 18500 v0 := b.NewValue0(v.Pos, OpOr8, t) 18501 v0.AddArg(z) 18502 v0.AddArg(x) 18503 v.AddArg(v0) 18504 return true 18505 } 18506 // match: (Or8 x (Or8 z i:(Const8 <t>))) 18507 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 18508 // result: (Or8 i (Or8 <t> z x)) 18509 for { 18510 _ = v.Args[1] 18511 x := v.Args[0] 18512 v_1 := v.Args[1] 18513 if v_1.Op != OpOr8 { 18514 break 18515 } 18516 _ = v_1.Args[1] 18517 z := v_1.Args[0] 18518 i := v_1.Args[1] 18519 if i.Op != OpConst8 { 18520 break 18521 } 18522 t := i.Type 18523 if !(z.Op != OpConst8 && x.Op != OpConst8) { 18524 break 18525 } 18526 v.reset(OpOr8) 18527 v.AddArg(i) 18528 v0 := b.NewValue0(v.Pos, OpOr8, t) 18529 v0.AddArg(z) 18530 v0.AddArg(x) 18531 v.AddArg(v0) 18532 return true 18533 } 18534 // match: (Or8 (Const8 <t> [c]) (Or8 (Const8 <t> [d]) x)) 18535 // cond: 18536 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 18537 for { 18538 _ = v.Args[1] 18539 v_0 := v.Args[0] 18540 if v_0.Op != OpConst8 { 18541 break 18542 } 18543 t := v_0.Type 18544 c := v_0.AuxInt 18545 v_1 := v.Args[1] 18546 if v_1.Op != OpOr8 { 18547 break 18548 } 18549 _ = v_1.Args[1] 18550 v_1_0 := v_1.Args[0] 18551 if v_1_0.Op != OpConst8 { 18552 break 18553 } 18554 if v_1_0.Type != t { 18555 break 18556 } 18557 d := v_1_0.AuxInt 18558 x := v_1.Args[1] 18559 v.reset(OpOr8) 18560 v0 := b.NewValue0(v.Pos, OpConst8, t) 18561 v0.AuxInt = int64(int8(c | d)) 18562 v.AddArg(v0) 18563 v.AddArg(x) 18564 return true 18565 } 18566 return false 18567 } 18568 func rewriteValuegeneric_OpOr8_20(v *Value) bool { 18569 b := v.Block 18570 _ = b 18571 // match: (Or8 (Const8 <t> [c]) (Or8 x (Const8 <t> [d]))) 18572 // cond: 18573 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 18574 for { 18575 _ = v.Args[1] 18576 v_0 := v.Args[0] 18577 if v_0.Op != OpConst8 { 18578 break 18579 } 18580 t := v_0.Type 18581 c := v_0.AuxInt 18582 v_1 := v.Args[1] 18583 if v_1.Op != OpOr8 { 18584 break 18585 } 18586 _ = v_1.Args[1] 18587 x := v_1.Args[0] 18588 v_1_1 := v_1.Args[1] 18589 if v_1_1.Op != OpConst8 { 18590 break 18591 } 18592 if v_1_1.Type != t { 18593 break 18594 } 18595 d := v_1_1.AuxInt 18596 v.reset(OpOr8) 18597 v0 := b.NewValue0(v.Pos, OpConst8, t) 18598 v0.AuxInt = int64(int8(c | d)) 18599 v.AddArg(v0) 18600 v.AddArg(x) 18601 return true 18602 } 18603 // match: (Or8 (Or8 (Const8 <t> [d]) x) (Const8 <t> [c])) 18604 // cond: 18605 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 18606 for { 18607 _ = v.Args[1] 18608 v_0 := v.Args[0] 18609 if v_0.Op != OpOr8 { 18610 break 18611 } 18612 _ = v_0.Args[1] 18613 v_0_0 := v_0.Args[0] 18614 if v_0_0.Op != OpConst8 { 18615 break 18616 } 18617 t := v_0_0.Type 18618 d := v_0_0.AuxInt 18619 x := v_0.Args[1] 18620 v_1 := v.Args[1] 18621 if v_1.Op != OpConst8 { 18622 break 18623 } 18624 if v_1.Type != t { 18625 break 18626 } 18627 c := v_1.AuxInt 18628 v.reset(OpOr8) 18629 v0 := b.NewValue0(v.Pos, OpConst8, t) 18630 v0.AuxInt = int64(int8(c | d)) 18631 v.AddArg(v0) 18632 v.AddArg(x) 18633 return true 18634 } 18635 // match: (Or8 (Or8 x (Const8 <t> [d])) (Const8 <t> [c])) 18636 // cond: 18637 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 18638 for { 18639 _ = v.Args[1] 18640 v_0 := v.Args[0] 18641 if v_0.Op != OpOr8 { 18642 break 18643 } 18644 _ = v_0.Args[1] 18645 x := v_0.Args[0] 18646 v_0_1 := v_0.Args[1] 18647 if v_0_1.Op != OpConst8 { 18648 break 18649 } 18650 t := v_0_1.Type 18651 d := v_0_1.AuxInt 18652 v_1 := v.Args[1] 18653 if v_1.Op != OpConst8 { 18654 break 18655 } 18656 if v_1.Type != t { 18657 break 18658 } 18659 c := v_1.AuxInt 18660 v.reset(OpOr8) 18661 v0 := b.NewValue0(v.Pos, OpConst8, t) 18662 v0.AuxInt = int64(int8(c | d)) 18663 v.AddArg(v0) 18664 v.AddArg(x) 18665 return true 18666 } 18667 return false 18668 } 18669 func rewriteValuegeneric_OpPhi_0(v *Value) bool { 18670 // match: (Phi (Const8 [c]) (Const8 [c])) 18671 // cond: 18672 // result: (Const8 [c]) 18673 for { 18674 _ = v.Args[1] 18675 v_0 := v.Args[0] 18676 if v_0.Op != OpConst8 { 18677 break 18678 } 18679 c := v_0.AuxInt 18680 v_1 := v.Args[1] 18681 if v_1.Op != OpConst8 { 18682 break 18683 } 18684 if v_1.AuxInt != c { 18685 break 18686 } 18687 if len(v.Args) != 2 { 18688 break 18689 } 18690 v.reset(OpConst8) 18691 v.AuxInt = c 18692 return true 18693 } 18694 // match: (Phi (Const16 [c]) (Const16 [c])) 18695 // cond: 18696 // result: (Const16 [c]) 18697 for { 18698 _ = v.Args[1] 18699 v_0 := v.Args[0] 18700 if v_0.Op != OpConst16 { 18701 break 18702 } 18703 c := v_0.AuxInt 18704 v_1 := v.Args[1] 18705 if v_1.Op != OpConst16 { 18706 break 18707 } 18708 if v_1.AuxInt != c { 18709 break 18710 } 18711 if len(v.Args) != 2 { 18712 break 18713 } 18714 v.reset(OpConst16) 18715 v.AuxInt = c 18716 return true 18717 } 18718 // match: (Phi (Const32 [c]) (Const32 [c])) 18719 // cond: 18720 // result: (Const32 [c]) 18721 for { 18722 _ = v.Args[1] 18723 v_0 := v.Args[0] 18724 if v_0.Op != OpConst32 { 18725 break 18726 } 18727 c := v_0.AuxInt 18728 v_1 := v.Args[1] 18729 if v_1.Op != OpConst32 { 18730 break 18731 } 18732 if v_1.AuxInt != c { 18733 break 18734 } 18735 if len(v.Args) != 2 { 18736 break 18737 } 18738 v.reset(OpConst32) 18739 v.AuxInt = c 18740 return true 18741 } 18742 // match: (Phi (Const64 [c]) (Const64 [c])) 18743 // cond: 18744 // result: (Const64 [c]) 18745 for { 18746 _ = v.Args[1] 18747 v_0 := v.Args[0] 18748 if v_0.Op != OpConst64 { 18749 break 18750 } 18751 c := v_0.AuxInt 18752 v_1 := v.Args[1] 18753 if v_1.Op != OpConst64 { 18754 break 18755 } 18756 if v_1.AuxInt != c { 18757 break 18758 } 18759 if len(v.Args) != 2 { 18760 break 18761 } 18762 v.reset(OpConst64) 18763 v.AuxInt = c 18764 return true 18765 } 18766 return false 18767 } 18768 func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { 18769 b := v.Block 18770 _ = b 18771 config := b.Func.Config 18772 _ = config 18773 typ := &b.Func.Config.Types 18774 _ = typ 18775 // match: (PtrIndex <t> ptr idx) 18776 // cond: config.PtrSize == 4 18777 // result: (AddPtr ptr (Mul32 <typ.Int> idx (Const32 <typ.Int> [t.ElemType().Size()]))) 18778 for { 18779 t := v.Type 18780 _ = v.Args[1] 18781 ptr := v.Args[0] 18782 idx := v.Args[1] 18783 if !(config.PtrSize == 4) { 18784 break 18785 } 18786 v.reset(OpAddPtr) 18787 v.AddArg(ptr) 18788 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) 18789 v0.AddArg(idx) 18790 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 18791 v1.AuxInt = t.ElemType().Size() 18792 v0.AddArg(v1) 18793 v.AddArg(v0) 18794 return true 18795 } 18796 // match: (PtrIndex <t> ptr idx) 18797 // cond: config.PtrSize == 8 18798 // result: (AddPtr ptr (Mul64 <typ.Int> idx (Const64 <typ.Int> [t.ElemType().Size()]))) 18799 for { 18800 t := v.Type 18801 _ = v.Args[1] 18802 ptr := v.Args[0] 18803 idx := v.Args[1] 18804 if !(config.PtrSize == 8) { 18805 break 18806 } 18807 v.reset(OpAddPtr) 18808 v.AddArg(ptr) 18809 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) 18810 v0.AddArg(idx) 18811 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 18812 v1.AuxInt = t.ElemType().Size() 18813 v0.AddArg(v1) 18814 v.AddArg(v0) 18815 return true 18816 } 18817 return false 18818 } 18819 func rewriteValuegeneric_OpRound32F_0(v *Value) bool { 18820 // match: (Round32F x:(Const32F)) 18821 // cond: 18822 // result: x 18823 for { 18824 x := v.Args[0] 18825 if x.Op != OpConst32F { 18826 break 18827 } 18828 v.reset(OpCopy) 18829 v.Type = x.Type 18830 v.AddArg(x) 18831 return true 18832 } 18833 return false 18834 } 18835 func rewriteValuegeneric_OpRound64F_0(v *Value) bool { 18836 // match: (Round64F x:(Const64F)) 18837 // cond: 18838 // result: x 18839 for { 18840 x := v.Args[0] 18841 if x.Op != OpConst64F { 18842 break 18843 } 18844 v.reset(OpCopy) 18845 v.Type = x.Type 18846 v.AddArg(x) 18847 return true 18848 } 18849 return false 18850 } 18851 func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { 18852 b := v.Block 18853 _ = b 18854 // match: (Rsh16Ux16 <t> x (Const16 [c])) 18855 // cond: 18856 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))])) 18857 for { 18858 t := v.Type 18859 _ = v.Args[1] 18860 x := v.Args[0] 18861 v_1 := v.Args[1] 18862 if v_1.Op != OpConst16 { 18863 break 18864 } 18865 c := v_1.AuxInt 18866 v.reset(OpRsh16Ux64) 18867 v.AddArg(x) 18868 v0 := b.NewValue0(v.Pos, OpConst64, t) 18869 v0.AuxInt = int64(uint16(c)) 18870 v.AddArg(v0) 18871 return true 18872 } 18873 // match: (Rsh16Ux16 (Const16 [0]) _) 18874 // cond: 18875 // result: (Const16 [0]) 18876 for { 18877 _ = v.Args[1] 18878 v_0 := v.Args[0] 18879 if v_0.Op != OpConst16 { 18880 break 18881 } 18882 if v_0.AuxInt != 0 { 18883 break 18884 } 18885 v.reset(OpConst16) 18886 v.AuxInt = 0 18887 return true 18888 } 18889 return false 18890 } 18891 func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { 18892 b := v.Block 18893 _ = b 18894 // match: (Rsh16Ux32 <t> x (Const32 [c])) 18895 // cond: 18896 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))])) 18897 for { 18898 t := v.Type 18899 _ = v.Args[1] 18900 x := v.Args[0] 18901 v_1 := v.Args[1] 18902 if v_1.Op != OpConst32 { 18903 break 18904 } 18905 c := v_1.AuxInt 18906 v.reset(OpRsh16Ux64) 18907 v.AddArg(x) 18908 v0 := b.NewValue0(v.Pos, OpConst64, t) 18909 v0.AuxInt = int64(uint32(c)) 18910 v.AddArg(v0) 18911 return true 18912 } 18913 // match: (Rsh16Ux32 (Const16 [0]) _) 18914 // cond: 18915 // result: (Const16 [0]) 18916 for { 18917 _ = v.Args[1] 18918 v_0 := v.Args[0] 18919 if v_0.Op != OpConst16 { 18920 break 18921 } 18922 if v_0.AuxInt != 0 { 18923 break 18924 } 18925 v.reset(OpConst16) 18926 v.AuxInt = 0 18927 return true 18928 } 18929 return false 18930 } 18931 func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { 18932 b := v.Block 18933 _ = b 18934 typ := &b.Func.Config.Types 18935 _ = typ 18936 // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) 18937 // cond: 18938 // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) 18939 for { 18940 _ = v.Args[1] 18941 v_0 := v.Args[0] 18942 if v_0.Op != OpConst16 { 18943 break 18944 } 18945 c := v_0.AuxInt 18946 v_1 := v.Args[1] 18947 if v_1.Op != OpConst64 { 18948 break 18949 } 18950 d := v_1.AuxInt 18951 v.reset(OpConst16) 18952 v.AuxInt = int64(int16(uint16(c) >> uint64(d))) 18953 return true 18954 } 18955 // match: (Rsh16Ux64 x (Const64 [0])) 18956 // cond: 18957 // result: x 18958 for { 18959 _ = v.Args[1] 18960 x := v.Args[0] 18961 v_1 := v.Args[1] 18962 if v_1.Op != OpConst64 { 18963 break 18964 } 18965 if v_1.AuxInt != 0 { 18966 break 18967 } 18968 v.reset(OpCopy) 18969 v.Type = x.Type 18970 v.AddArg(x) 18971 return true 18972 } 18973 // match: (Rsh16Ux64 (Const16 [0]) _) 18974 // cond: 18975 // result: (Const16 [0]) 18976 for { 18977 _ = v.Args[1] 18978 v_0 := v.Args[0] 18979 if v_0.Op != OpConst16 { 18980 break 18981 } 18982 if v_0.AuxInt != 0 { 18983 break 18984 } 18985 v.reset(OpConst16) 18986 v.AuxInt = 0 18987 return true 18988 } 18989 // match: (Rsh16Ux64 _ (Const64 [c])) 18990 // cond: uint64(c) >= 16 18991 // result: (Const16 [0]) 18992 for { 18993 _ = v.Args[1] 18994 v_1 := v.Args[1] 18995 if v_1.Op != OpConst64 { 18996 break 18997 } 18998 c := v_1.AuxInt 18999 if !(uint64(c) >= 16) { 19000 break 19001 } 19002 v.reset(OpConst16) 19003 v.AuxInt = 0 19004 return true 19005 } 19006 // match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) 19007 // cond: !uaddOvf(c,d) 19008 // result: (Rsh16Ux64 x (Const64 <t> [c+d])) 19009 for { 19010 t := v.Type 19011 _ = v.Args[1] 19012 v_0 := v.Args[0] 19013 if v_0.Op != OpRsh16Ux64 { 19014 break 19015 } 19016 _ = v_0.Args[1] 19017 x := v_0.Args[0] 19018 v_0_1 := v_0.Args[1] 19019 if v_0_1.Op != OpConst64 { 19020 break 19021 } 19022 c := v_0_1.AuxInt 19023 v_1 := v.Args[1] 19024 if v_1.Op != OpConst64 { 19025 break 19026 } 19027 d := v_1.AuxInt 19028 if !(!uaddOvf(c, d)) { 19029 break 19030 } 19031 v.reset(OpRsh16Ux64) 19032 v.AddArg(x) 19033 v0 := b.NewValue0(v.Pos, OpConst64, t) 19034 v0.AuxInt = c + d 19035 v.AddArg(v0) 19036 return true 19037 } 19038 // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 19039 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 19040 // result: (Rsh16Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 19041 for { 19042 _ = v.Args[1] 19043 v_0 := v.Args[0] 19044 if v_0.Op != OpLsh16x64 { 19045 break 19046 } 19047 _ = v_0.Args[1] 19048 v_0_0 := v_0.Args[0] 19049 if v_0_0.Op != OpRsh16Ux64 { 19050 break 19051 } 19052 _ = v_0_0.Args[1] 19053 x := v_0_0.Args[0] 19054 v_0_0_1 := v_0_0.Args[1] 19055 if v_0_0_1.Op != OpConst64 { 19056 break 19057 } 19058 c1 := v_0_0_1.AuxInt 19059 v_0_1 := v_0.Args[1] 19060 if v_0_1.Op != OpConst64 { 19061 break 19062 } 19063 c2 := v_0_1.AuxInt 19064 v_1 := v.Args[1] 19065 if v_1.Op != OpConst64 { 19066 break 19067 } 19068 c3 := v_1.AuxInt 19069 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 19070 break 19071 } 19072 v.reset(OpRsh16Ux64) 19073 v.AddArg(x) 19074 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 19075 v0.AuxInt = c1 - c2 + c3 19076 v.AddArg(v0) 19077 return true 19078 } 19079 // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 19080 // cond: 19081 // result: (ZeroExt8to16 (Trunc16to8 <typ.UInt8> x)) 19082 for { 19083 _ = v.Args[1] 19084 v_0 := v.Args[0] 19085 if v_0.Op != OpLsh16x64 { 19086 break 19087 } 19088 _ = v_0.Args[1] 19089 x := v_0.Args[0] 19090 v_0_1 := v_0.Args[1] 19091 if v_0_1.Op != OpConst64 { 19092 break 19093 } 19094 if v_0_1.AuxInt != 8 { 19095 break 19096 } 19097 v_1 := v.Args[1] 19098 if v_1.Op != OpConst64 { 19099 break 19100 } 19101 if v_1.AuxInt != 8 { 19102 break 19103 } 19104 v.reset(OpZeroExt8to16) 19105 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) 19106 v0.AddArg(x) 19107 v.AddArg(v0) 19108 return true 19109 } 19110 return false 19111 } 19112 func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { 19113 b := v.Block 19114 _ = b 19115 // match: (Rsh16Ux8 <t> x (Const8 [c])) 19116 // cond: 19117 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))])) 19118 for { 19119 t := v.Type 19120 _ = v.Args[1] 19121 x := v.Args[0] 19122 v_1 := v.Args[1] 19123 if v_1.Op != OpConst8 { 19124 break 19125 } 19126 c := v_1.AuxInt 19127 v.reset(OpRsh16Ux64) 19128 v.AddArg(x) 19129 v0 := b.NewValue0(v.Pos, OpConst64, t) 19130 v0.AuxInt = int64(uint8(c)) 19131 v.AddArg(v0) 19132 return true 19133 } 19134 // match: (Rsh16Ux8 (Const16 [0]) _) 19135 // cond: 19136 // result: (Const16 [0]) 19137 for { 19138 _ = v.Args[1] 19139 v_0 := v.Args[0] 19140 if v_0.Op != OpConst16 { 19141 break 19142 } 19143 if v_0.AuxInt != 0 { 19144 break 19145 } 19146 v.reset(OpConst16) 19147 v.AuxInt = 0 19148 return true 19149 } 19150 return false 19151 } 19152 func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { 19153 b := v.Block 19154 _ = b 19155 // match: (Rsh16x16 <t> x (Const16 [c])) 19156 // cond: 19157 // result: (Rsh16x64 x (Const64 <t> [int64(uint16(c))])) 19158 for { 19159 t := v.Type 19160 _ = v.Args[1] 19161 x := v.Args[0] 19162 v_1 := v.Args[1] 19163 if v_1.Op != OpConst16 { 19164 break 19165 } 19166 c := v_1.AuxInt 19167 v.reset(OpRsh16x64) 19168 v.AddArg(x) 19169 v0 := b.NewValue0(v.Pos, OpConst64, t) 19170 v0.AuxInt = int64(uint16(c)) 19171 v.AddArg(v0) 19172 return true 19173 } 19174 // match: (Rsh16x16 (Const16 [0]) _) 19175 // cond: 19176 // result: (Const16 [0]) 19177 for { 19178 _ = v.Args[1] 19179 v_0 := v.Args[0] 19180 if v_0.Op != OpConst16 { 19181 break 19182 } 19183 if v_0.AuxInt != 0 { 19184 break 19185 } 19186 v.reset(OpConst16) 19187 v.AuxInt = 0 19188 return true 19189 } 19190 return false 19191 } 19192 func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { 19193 b := v.Block 19194 _ = b 19195 // match: (Rsh16x32 <t> x (Const32 [c])) 19196 // cond: 19197 // result: (Rsh16x64 x (Const64 <t> [int64(uint32(c))])) 19198 for { 19199 t := v.Type 19200 _ = v.Args[1] 19201 x := v.Args[0] 19202 v_1 := v.Args[1] 19203 if v_1.Op != OpConst32 { 19204 break 19205 } 19206 c := v_1.AuxInt 19207 v.reset(OpRsh16x64) 19208 v.AddArg(x) 19209 v0 := b.NewValue0(v.Pos, OpConst64, t) 19210 v0.AuxInt = int64(uint32(c)) 19211 v.AddArg(v0) 19212 return true 19213 } 19214 // match: (Rsh16x32 (Const16 [0]) _) 19215 // cond: 19216 // result: (Const16 [0]) 19217 for { 19218 _ = v.Args[1] 19219 v_0 := v.Args[0] 19220 if v_0.Op != OpConst16 { 19221 break 19222 } 19223 if v_0.AuxInt != 0 { 19224 break 19225 } 19226 v.reset(OpConst16) 19227 v.AuxInt = 0 19228 return true 19229 } 19230 return false 19231 } 19232 func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { 19233 b := v.Block 19234 _ = b 19235 typ := &b.Func.Config.Types 19236 _ = typ 19237 // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) 19238 // cond: 19239 // result: (Const16 [int64(int16(c) >> uint64(d))]) 19240 for { 19241 _ = v.Args[1] 19242 v_0 := v.Args[0] 19243 if v_0.Op != OpConst16 { 19244 break 19245 } 19246 c := v_0.AuxInt 19247 v_1 := v.Args[1] 19248 if v_1.Op != OpConst64 { 19249 break 19250 } 19251 d := v_1.AuxInt 19252 v.reset(OpConst16) 19253 v.AuxInt = int64(int16(c) >> uint64(d)) 19254 return true 19255 } 19256 // match: (Rsh16x64 x (Const64 [0])) 19257 // cond: 19258 // result: x 19259 for { 19260 _ = v.Args[1] 19261 x := v.Args[0] 19262 v_1 := v.Args[1] 19263 if v_1.Op != OpConst64 { 19264 break 19265 } 19266 if v_1.AuxInt != 0 { 19267 break 19268 } 19269 v.reset(OpCopy) 19270 v.Type = x.Type 19271 v.AddArg(x) 19272 return true 19273 } 19274 // match: (Rsh16x64 (Const16 [0]) _) 19275 // cond: 19276 // result: (Const16 [0]) 19277 for { 19278 _ = v.Args[1] 19279 v_0 := v.Args[0] 19280 if v_0.Op != OpConst16 { 19281 break 19282 } 19283 if v_0.AuxInt != 0 { 19284 break 19285 } 19286 v.reset(OpConst16) 19287 v.AuxInt = 0 19288 return true 19289 } 19290 // match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d])) 19291 // cond: !uaddOvf(c,d) 19292 // result: (Rsh16x64 x (Const64 <t> [c+d])) 19293 for { 19294 t := v.Type 19295 _ = v.Args[1] 19296 v_0 := v.Args[0] 19297 if v_0.Op != OpRsh16x64 { 19298 break 19299 } 19300 _ = v_0.Args[1] 19301 x := v_0.Args[0] 19302 v_0_1 := v_0.Args[1] 19303 if v_0_1.Op != OpConst64 { 19304 break 19305 } 19306 c := v_0_1.AuxInt 19307 v_1 := v.Args[1] 19308 if v_1.Op != OpConst64 { 19309 break 19310 } 19311 d := v_1.AuxInt 19312 if !(!uaddOvf(c, d)) { 19313 break 19314 } 19315 v.reset(OpRsh16x64) 19316 v.AddArg(x) 19317 v0 := b.NewValue0(v.Pos, OpConst64, t) 19318 v0.AuxInt = c + d 19319 v.AddArg(v0) 19320 return true 19321 } 19322 // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 19323 // cond: 19324 // result: (SignExt8to16 (Trunc16to8 <typ.Int8> x)) 19325 for { 19326 _ = v.Args[1] 19327 v_0 := v.Args[0] 19328 if v_0.Op != OpLsh16x64 { 19329 break 19330 } 19331 _ = v_0.Args[1] 19332 x := v_0.Args[0] 19333 v_0_1 := v_0.Args[1] 19334 if v_0_1.Op != OpConst64 { 19335 break 19336 } 19337 if v_0_1.AuxInt != 8 { 19338 break 19339 } 19340 v_1 := v.Args[1] 19341 if v_1.Op != OpConst64 { 19342 break 19343 } 19344 if v_1.AuxInt != 8 { 19345 break 19346 } 19347 v.reset(OpSignExt8to16) 19348 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) 19349 v0.AddArg(x) 19350 v.AddArg(v0) 19351 return true 19352 } 19353 return false 19354 } 19355 func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { 19356 b := v.Block 19357 _ = b 19358 // match: (Rsh16x8 <t> x (Const8 [c])) 19359 // cond: 19360 // result: (Rsh16x64 x (Const64 <t> [int64(uint8(c))])) 19361 for { 19362 t := v.Type 19363 _ = v.Args[1] 19364 x := v.Args[0] 19365 v_1 := v.Args[1] 19366 if v_1.Op != OpConst8 { 19367 break 19368 } 19369 c := v_1.AuxInt 19370 v.reset(OpRsh16x64) 19371 v.AddArg(x) 19372 v0 := b.NewValue0(v.Pos, OpConst64, t) 19373 v0.AuxInt = int64(uint8(c)) 19374 v.AddArg(v0) 19375 return true 19376 } 19377 // match: (Rsh16x8 (Const16 [0]) _) 19378 // cond: 19379 // result: (Const16 [0]) 19380 for { 19381 _ = v.Args[1] 19382 v_0 := v.Args[0] 19383 if v_0.Op != OpConst16 { 19384 break 19385 } 19386 if v_0.AuxInt != 0 { 19387 break 19388 } 19389 v.reset(OpConst16) 19390 v.AuxInt = 0 19391 return true 19392 } 19393 return false 19394 } 19395 func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { 19396 b := v.Block 19397 _ = b 19398 // match: (Rsh32Ux16 <t> x (Const16 [c])) 19399 // cond: 19400 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))])) 19401 for { 19402 t := v.Type 19403 _ = v.Args[1] 19404 x := v.Args[0] 19405 v_1 := v.Args[1] 19406 if v_1.Op != OpConst16 { 19407 break 19408 } 19409 c := v_1.AuxInt 19410 v.reset(OpRsh32Ux64) 19411 v.AddArg(x) 19412 v0 := b.NewValue0(v.Pos, OpConst64, t) 19413 v0.AuxInt = int64(uint16(c)) 19414 v.AddArg(v0) 19415 return true 19416 } 19417 // match: (Rsh32Ux16 (Const32 [0]) _) 19418 // cond: 19419 // result: (Const32 [0]) 19420 for { 19421 _ = v.Args[1] 19422 v_0 := v.Args[0] 19423 if v_0.Op != OpConst32 { 19424 break 19425 } 19426 if v_0.AuxInt != 0 { 19427 break 19428 } 19429 v.reset(OpConst32) 19430 v.AuxInt = 0 19431 return true 19432 } 19433 return false 19434 } 19435 func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { 19436 b := v.Block 19437 _ = b 19438 // match: (Rsh32Ux32 <t> x (Const32 [c])) 19439 // cond: 19440 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))])) 19441 for { 19442 t := v.Type 19443 _ = v.Args[1] 19444 x := v.Args[0] 19445 v_1 := v.Args[1] 19446 if v_1.Op != OpConst32 { 19447 break 19448 } 19449 c := v_1.AuxInt 19450 v.reset(OpRsh32Ux64) 19451 v.AddArg(x) 19452 v0 := b.NewValue0(v.Pos, OpConst64, t) 19453 v0.AuxInt = int64(uint32(c)) 19454 v.AddArg(v0) 19455 return true 19456 } 19457 // match: (Rsh32Ux32 (Const32 [0]) _) 19458 // cond: 19459 // result: (Const32 [0]) 19460 for { 19461 _ = v.Args[1] 19462 v_0 := v.Args[0] 19463 if v_0.Op != OpConst32 { 19464 break 19465 } 19466 if v_0.AuxInt != 0 { 19467 break 19468 } 19469 v.reset(OpConst32) 19470 v.AuxInt = 0 19471 return true 19472 } 19473 return false 19474 } 19475 func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { 19476 b := v.Block 19477 _ = b 19478 typ := &b.Func.Config.Types 19479 _ = typ 19480 // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) 19481 // cond: 19482 // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) 19483 for { 19484 _ = v.Args[1] 19485 v_0 := v.Args[0] 19486 if v_0.Op != OpConst32 { 19487 break 19488 } 19489 c := v_0.AuxInt 19490 v_1 := v.Args[1] 19491 if v_1.Op != OpConst64 { 19492 break 19493 } 19494 d := v_1.AuxInt 19495 v.reset(OpConst32) 19496 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 19497 return true 19498 } 19499 // match: (Rsh32Ux64 x (Const64 [0])) 19500 // cond: 19501 // result: x 19502 for { 19503 _ = v.Args[1] 19504 x := v.Args[0] 19505 v_1 := v.Args[1] 19506 if v_1.Op != OpConst64 { 19507 break 19508 } 19509 if v_1.AuxInt != 0 { 19510 break 19511 } 19512 v.reset(OpCopy) 19513 v.Type = x.Type 19514 v.AddArg(x) 19515 return true 19516 } 19517 // match: (Rsh32Ux64 (Const32 [0]) _) 19518 // cond: 19519 // result: (Const32 [0]) 19520 for { 19521 _ = v.Args[1] 19522 v_0 := v.Args[0] 19523 if v_0.Op != OpConst32 { 19524 break 19525 } 19526 if v_0.AuxInt != 0 { 19527 break 19528 } 19529 v.reset(OpConst32) 19530 v.AuxInt = 0 19531 return true 19532 } 19533 // match: (Rsh32Ux64 _ (Const64 [c])) 19534 // cond: uint64(c) >= 32 19535 // result: (Const32 [0]) 19536 for { 19537 _ = v.Args[1] 19538 v_1 := v.Args[1] 19539 if v_1.Op != OpConst64 { 19540 break 19541 } 19542 c := v_1.AuxInt 19543 if !(uint64(c) >= 32) { 19544 break 19545 } 19546 v.reset(OpConst32) 19547 v.AuxInt = 0 19548 return true 19549 } 19550 // match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) 19551 // cond: !uaddOvf(c,d) 19552 // result: (Rsh32Ux64 x (Const64 <t> [c+d])) 19553 for { 19554 t := v.Type 19555 _ = v.Args[1] 19556 v_0 := v.Args[0] 19557 if v_0.Op != OpRsh32Ux64 { 19558 break 19559 } 19560 _ = v_0.Args[1] 19561 x := v_0.Args[0] 19562 v_0_1 := v_0.Args[1] 19563 if v_0_1.Op != OpConst64 { 19564 break 19565 } 19566 c := v_0_1.AuxInt 19567 v_1 := v.Args[1] 19568 if v_1.Op != OpConst64 { 19569 break 19570 } 19571 d := v_1.AuxInt 19572 if !(!uaddOvf(c, d)) { 19573 break 19574 } 19575 v.reset(OpRsh32Ux64) 19576 v.AddArg(x) 19577 v0 := b.NewValue0(v.Pos, OpConst64, t) 19578 v0.AuxInt = c + d 19579 v.AddArg(v0) 19580 return true 19581 } 19582 // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 19583 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 19584 // result: (Rsh32Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 19585 for { 19586 _ = v.Args[1] 19587 v_0 := v.Args[0] 19588 if v_0.Op != OpLsh32x64 { 19589 break 19590 } 19591 _ = v_0.Args[1] 19592 v_0_0 := v_0.Args[0] 19593 if v_0_0.Op != OpRsh32Ux64 { 19594 break 19595 } 19596 _ = v_0_0.Args[1] 19597 x := v_0_0.Args[0] 19598 v_0_0_1 := v_0_0.Args[1] 19599 if v_0_0_1.Op != OpConst64 { 19600 break 19601 } 19602 c1 := v_0_0_1.AuxInt 19603 v_0_1 := v_0.Args[1] 19604 if v_0_1.Op != OpConst64 { 19605 break 19606 } 19607 c2 := v_0_1.AuxInt 19608 v_1 := v.Args[1] 19609 if v_1.Op != OpConst64 { 19610 break 19611 } 19612 c3 := v_1.AuxInt 19613 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 19614 break 19615 } 19616 v.reset(OpRsh32Ux64) 19617 v.AddArg(x) 19618 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 19619 v0.AuxInt = c1 - c2 + c3 19620 v.AddArg(v0) 19621 return true 19622 } 19623 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 19624 // cond: 19625 // result: (ZeroExt8to32 (Trunc32to8 <typ.UInt8> x)) 19626 for { 19627 _ = v.Args[1] 19628 v_0 := v.Args[0] 19629 if v_0.Op != OpLsh32x64 { 19630 break 19631 } 19632 _ = v_0.Args[1] 19633 x := v_0.Args[0] 19634 v_0_1 := v_0.Args[1] 19635 if v_0_1.Op != OpConst64 { 19636 break 19637 } 19638 if v_0_1.AuxInt != 24 { 19639 break 19640 } 19641 v_1 := v.Args[1] 19642 if v_1.Op != OpConst64 { 19643 break 19644 } 19645 if v_1.AuxInt != 24 { 19646 break 19647 } 19648 v.reset(OpZeroExt8to32) 19649 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) 19650 v0.AddArg(x) 19651 v.AddArg(v0) 19652 return true 19653 } 19654 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 19655 // cond: 19656 // result: (ZeroExt16to32 (Trunc32to16 <typ.UInt16> x)) 19657 for { 19658 _ = v.Args[1] 19659 v_0 := v.Args[0] 19660 if v_0.Op != OpLsh32x64 { 19661 break 19662 } 19663 _ = v_0.Args[1] 19664 x := v_0.Args[0] 19665 v_0_1 := v_0.Args[1] 19666 if v_0_1.Op != OpConst64 { 19667 break 19668 } 19669 if v_0_1.AuxInt != 16 { 19670 break 19671 } 19672 v_1 := v.Args[1] 19673 if v_1.Op != OpConst64 { 19674 break 19675 } 19676 if v_1.AuxInt != 16 { 19677 break 19678 } 19679 v.reset(OpZeroExt16to32) 19680 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) 19681 v0.AddArg(x) 19682 v.AddArg(v0) 19683 return true 19684 } 19685 return false 19686 } 19687 func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { 19688 b := v.Block 19689 _ = b 19690 // match: (Rsh32Ux8 <t> x (Const8 [c])) 19691 // cond: 19692 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))])) 19693 for { 19694 t := v.Type 19695 _ = v.Args[1] 19696 x := v.Args[0] 19697 v_1 := v.Args[1] 19698 if v_1.Op != OpConst8 { 19699 break 19700 } 19701 c := v_1.AuxInt 19702 v.reset(OpRsh32Ux64) 19703 v.AddArg(x) 19704 v0 := b.NewValue0(v.Pos, OpConst64, t) 19705 v0.AuxInt = int64(uint8(c)) 19706 v.AddArg(v0) 19707 return true 19708 } 19709 // match: (Rsh32Ux8 (Const32 [0]) _) 19710 // cond: 19711 // result: (Const32 [0]) 19712 for { 19713 _ = v.Args[1] 19714 v_0 := v.Args[0] 19715 if v_0.Op != OpConst32 { 19716 break 19717 } 19718 if v_0.AuxInt != 0 { 19719 break 19720 } 19721 v.reset(OpConst32) 19722 v.AuxInt = 0 19723 return true 19724 } 19725 return false 19726 } 19727 func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { 19728 b := v.Block 19729 _ = b 19730 // match: (Rsh32x16 <t> x (Const16 [c])) 19731 // cond: 19732 // result: (Rsh32x64 x (Const64 <t> [int64(uint16(c))])) 19733 for { 19734 t := v.Type 19735 _ = v.Args[1] 19736 x := v.Args[0] 19737 v_1 := v.Args[1] 19738 if v_1.Op != OpConst16 { 19739 break 19740 } 19741 c := v_1.AuxInt 19742 v.reset(OpRsh32x64) 19743 v.AddArg(x) 19744 v0 := b.NewValue0(v.Pos, OpConst64, t) 19745 v0.AuxInt = int64(uint16(c)) 19746 v.AddArg(v0) 19747 return true 19748 } 19749 // match: (Rsh32x16 (Const32 [0]) _) 19750 // cond: 19751 // result: (Const32 [0]) 19752 for { 19753 _ = v.Args[1] 19754 v_0 := v.Args[0] 19755 if v_0.Op != OpConst32 { 19756 break 19757 } 19758 if v_0.AuxInt != 0 { 19759 break 19760 } 19761 v.reset(OpConst32) 19762 v.AuxInt = 0 19763 return true 19764 } 19765 return false 19766 } 19767 func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { 19768 b := v.Block 19769 _ = b 19770 // match: (Rsh32x32 <t> x (Const32 [c])) 19771 // cond: 19772 // result: (Rsh32x64 x (Const64 <t> [int64(uint32(c))])) 19773 for { 19774 t := v.Type 19775 _ = v.Args[1] 19776 x := v.Args[0] 19777 v_1 := v.Args[1] 19778 if v_1.Op != OpConst32 { 19779 break 19780 } 19781 c := v_1.AuxInt 19782 v.reset(OpRsh32x64) 19783 v.AddArg(x) 19784 v0 := b.NewValue0(v.Pos, OpConst64, t) 19785 v0.AuxInt = int64(uint32(c)) 19786 v.AddArg(v0) 19787 return true 19788 } 19789 // match: (Rsh32x32 (Const32 [0]) _) 19790 // cond: 19791 // result: (Const32 [0]) 19792 for { 19793 _ = v.Args[1] 19794 v_0 := v.Args[0] 19795 if v_0.Op != OpConst32 { 19796 break 19797 } 19798 if v_0.AuxInt != 0 { 19799 break 19800 } 19801 v.reset(OpConst32) 19802 v.AuxInt = 0 19803 return true 19804 } 19805 return false 19806 } 19807 func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { 19808 b := v.Block 19809 _ = b 19810 typ := &b.Func.Config.Types 19811 _ = typ 19812 // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) 19813 // cond: 19814 // result: (Const32 [int64(int32(c) >> uint64(d))]) 19815 for { 19816 _ = v.Args[1] 19817 v_0 := v.Args[0] 19818 if v_0.Op != OpConst32 { 19819 break 19820 } 19821 c := v_0.AuxInt 19822 v_1 := v.Args[1] 19823 if v_1.Op != OpConst64 { 19824 break 19825 } 19826 d := v_1.AuxInt 19827 v.reset(OpConst32) 19828 v.AuxInt = int64(int32(c) >> uint64(d)) 19829 return true 19830 } 19831 // match: (Rsh32x64 x (Const64 [0])) 19832 // cond: 19833 // result: x 19834 for { 19835 _ = v.Args[1] 19836 x := v.Args[0] 19837 v_1 := v.Args[1] 19838 if v_1.Op != OpConst64 { 19839 break 19840 } 19841 if v_1.AuxInt != 0 { 19842 break 19843 } 19844 v.reset(OpCopy) 19845 v.Type = x.Type 19846 v.AddArg(x) 19847 return true 19848 } 19849 // match: (Rsh32x64 (Const32 [0]) _) 19850 // cond: 19851 // result: (Const32 [0]) 19852 for { 19853 _ = v.Args[1] 19854 v_0 := v.Args[0] 19855 if v_0.Op != OpConst32 { 19856 break 19857 } 19858 if v_0.AuxInt != 0 { 19859 break 19860 } 19861 v.reset(OpConst32) 19862 v.AuxInt = 0 19863 return true 19864 } 19865 // match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d])) 19866 // cond: !uaddOvf(c,d) 19867 // result: (Rsh32x64 x (Const64 <t> [c+d])) 19868 for { 19869 t := v.Type 19870 _ = v.Args[1] 19871 v_0 := v.Args[0] 19872 if v_0.Op != OpRsh32x64 { 19873 break 19874 } 19875 _ = v_0.Args[1] 19876 x := v_0.Args[0] 19877 v_0_1 := v_0.Args[1] 19878 if v_0_1.Op != OpConst64 { 19879 break 19880 } 19881 c := v_0_1.AuxInt 19882 v_1 := v.Args[1] 19883 if v_1.Op != OpConst64 { 19884 break 19885 } 19886 d := v_1.AuxInt 19887 if !(!uaddOvf(c, d)) { 19888 break 19889 } 19890 v.reset(OpRsh32x64) 19891 v.AddArg(x) 19892 v0 := b.NewValue0(v.Pos, OpConst64, t) 19893 v0.AuxInt = c + d 19894 v.AddArg(v0) 19895 return true 19896 } 19897 // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 19898 // cond: 19899 // result: (SignExt8to32 (Trunc32to8 <typ.Int8> x)) 19900 for { 19901 _ = v.Args[1] 19902 v_0 := v.Args[0] 19903 if v_0.Op != OpLsh32x64 { 19904 break 19905 } 19906 _ = v_0.Args[1] 19907 x := v_0.Args[0] 19908 v_0_1 := v_0.Args[1] 19909 if v_0_1.Op != OpConst64 { 19910 break 19911 } 19912 if v_0_1.AuxInt != 24 { 19913 break 19914 } 19915 v_1 := v.Args[1] 19916 if v_1.Op != OpConst64 { 19917 break 19918 } 19919 if v_1.AuxInt != 24 { 19920 break 19921 } 19922 v.reset(OpSignExt8to32) 19923 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) 19924 v0.AddArg(x) 19925 v.AddArg(v0) 19926 return true 19927 } 19928 // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 19929 // cond: 19930 // result: (SignExt16to32 (Trunc32to16 <typ.Int16> x)) 19931 for { 19932 _ = v.Args[1] 19933 v_0 := v.Args[0] 19934 if v_0.Op != OpLsh32x64 { 19935 break 19936 } 19937 _ = v_0.Args[1] 19938 x := v_0.Args[0] 19939 v_0_1 := v_0.Args[1] 19940 if v_0_1.Op != OpConst64 { 19941 break 19942 } 19943 if v_0_1.AuxInt != 16 { 19944 break 19945 } 19946 v_1 := v.Args[1] 19947 if v_1.Op != OpConst64 { 19948 break 19949 } 19950 if v_1.AuxInt != 16 { 19951 break 19952 } 19953 v.reset(OpSignExt16to32) 19954 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) 19955 v0.AddArg(x) 19956 v.AddArg(v0) 19957 return true 19958 } 19959 return false 19960 } 19961 func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { 19962 b := v.Block 19963 _ = b 19964 // match: (Rsh32x8 <t> x (Const8 [c])) 19965 // cond: 19966 // result: (Rsh32x64 x (Const64 <t> [int64(uint8(c))])) 19967 for { 19968 t := v.Type 19969 _ = v.Args[1] 19970 x := v.Args[0] 19971 v_1 := v.Args[1] 19972 if v_1.Op != OpConst8 { 19973 break 19974 } 19975 c := v_1.AuxInt 19976 v.reset(OpRsh32x64) 19977 v.AddArg(x) 19978 v0 := b.NewValue0(v.Pos, OpConst64, t) 19979 v0.AuxInt = int64(uint8(c)) 19980 v.AddArg(v0) 19981 return true 19982 } 19983 // match: (Rsh32x8 (Const32 [0]) _) 19984 // cond: 19985 // result: (Const32 [0]) 19986 for { 19987 _ = v.Args[1] 19988 v_0 := v.Args[0] 19989 if v_0.Op != OpConst32 { 19990 break 19991 } 19992 if v_0.AuxInt != 0 { 19993 break 19994 } 19995 v.reset(OpConst32) 19996 v.AuxInt = 0 19997 return true 19998 } 19999 return false 20000 } 20001 func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { 20002 b := v.Block 20003 _ = b 20004 // match: (Rsh64Ux16 <t> x (Const16 [c])) 20005 // cond: 20006 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))])) 20007 for { 20008 t := v.Type 20009 _ = v.Args[1] 20010 x := v.Args[0] 20011 v_1 := v.Args[1] 20012 if v_1.Op != OpConst16 { 20013 break 20014 } 20015 c := v_1.AuxInt 20016 v.reset(OpRsh64Ux64) 20017 v.AddArg(x) 20018 v0 := b.NewValue0(v.Pos, OpConst64, t) 20019 v0.AuxInt = int64(uint16(c)) 20020 v.AddArg(v0) 20021 return true 20022 } 20023 // match: (Rsh64Ux16 (Const64 [0]) _) 20024 // cond: 20025 // result: (Const64 [0]) 20026 for { 20027 _ = v.Args[1] 20028 v_0 := v.Args[0] 20029 if v_0.Op != OpConst64 { 20030 break 20031 } 20032 if v_0.AuxInt != 0 { 20033 break 20034 } 20035 v.reset(OpConst64) 20036 v.AuxInt = 0 20037 return true 20038 } 20039 return false 20040 } 20041 func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { 20042 b := v.Block 20043 _ = b 20044 // match: (Rsh64Ux32 <t> x (Const32 [c])) 20045 // cond: 20046 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))])) 20047 for { 20048 t := v.Type 20049 _ = v.Args[1] 20050 x := v.Args[0] 20051 v_1 := v.Args[1] 20052 if v_1.Op != OpConst32 { 20053 break 20054 } 20055 c := v_1.AuxInt 20056 v.reset(OpRsh64Ux64) 20057 v.AddArg(x) 20058 v0 := b.NewValue0(v.Pos, OpConst64, t) 20059 v0.AuxInt = int64(uint32(c)) 20060 v.AddArg(v0) 20061 return true 20062 } 20063 // match: (Rsh64Ux32 (Const64 [0]) _) 20064 // cond: 20065 // result: (Const64 [0]) 20066 for { 20067 _ = v.Args[1] 20068 v_0 := v.Args[0] 20069 if v_0.Op != OpConst64 { 20070 break 20071 } 20072 if v_0.AuxInt != 0 { 20073 break 20074 } 20075 v.reset(OpConst64) 20076 v.AuxInt = 0 20077 return true 20078 } 20079 return false 20080 } 20081 func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { 20082 b := v.Block 20083 _ = b 20084 typ := &b.Func.Config.Types 20085 _ = typ 20086 // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) 20087 // cond: 20088 // result: (Const64 [int64(uint64(c) >> uint64(d))]) 20089 for { 20090 _ = v.Args[1] 20091 v_0 := v.Args[0] 20092 if v_0.Op != OpConst64 { 20093 break 20094 } 20095 c := v_0.AuxInt 20096 v_1 := v.Args[1] 20097 if v_1.Op != OpConst64 { 20098 break 20099 } 20100 d := v_1.AuxInt 20101 v.reset(OpConst64) 20102 v.AuxInt = int64(uint64(c) >> uint64(d)) 20103 return true 20104 } 20105 // match: (Rsh64Ux64 x (Const64 [0])) 20106 // cond: 20107 // result: x 20108 for { 20109 _ = v.Args[1] 20110 x := v.Args[0] 20111 v_1 := v.Args[1] 20112 if v_1.Op != OpConst64 { 20113 break 20114 } 20115 if v_1.AuxInt != 0 { 20116 break 20117 } 20118 v.reset(OpCopy) 20119 v.Type = x.Type 20120 v.AddArg(x) 20121 return true 20122 } 20123 // match: (Rsh64Ux64 (Const64 [0]) _) 20124 // cond: 20125 // result: (Const64 [0]) 20126 for { 20127 _ = v.Args[1] 20128 v_0 := v.Args[0] 20129 if v_0.Op != OpConst64 { 20130 break 20131 } 20132 if v_0.AuxInt != 0 { 20133 break 20134 } 20135 v.reset(OpConst64) 20136 v.AuxInt = 0 20137 return true 20138 } 20139 // match: (Rsh64Ux64 _ (Const64 [c])) 20140 // cond: uint64(c) >= 64 20141 // result: (Const64 [0]) 20142 for { 20143 _ = v.Args[1] 20144 v_1 := v.Args[1] 20145 if v_1.Op != OpConst64 { 20146 break 20147 } 20148 c := v_1.AuxInt 20149 if !(uint64(c) >= 64) { 20150 break 20151 } 20152 v.reset(OpConst64) 20153 v.AuxInt = 0 20154 return true 20155 } 20156 // match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) 20157 // cond: !uaddOvf(c,d) 20158 // result: (Rsh64Ux64 x (Const64 <t> [c+d])) 20159 for { 20160 t := v.Type 20161 _ = v.Args[1] 20162 v_0 := v.Args[0] 20163 if v_0.Op != OpRsh64Ux64 { 20164 break 20165 } 20166 _ = v_0.Args[1] 20167 x := v_0.Args[0] 20168 v_0_1 := v_0.Args[1] 20169 if v_0_1.Op != OpConst64 { 20170 break 20171 } 20172 c := v_0_1.AuxInt 20173 v_1 := v.Args[1] 20174 if v_1.Op != OpConst64 { 20175 break 20176 } 20177 d := v_1.AuxInt 20178 if !(!uaddOvf(c, d)) { 20179 break 20180 } 20181 v.reset(OpRsh64Ux64) 20182 v.AddArg(x) 20183 v0 := b.NewValue0(v.Pos, OpConst64, t) 20184 v0.AuxInt = c + d 20185 v.AddArg(v0) 20186 return true 20187 } 20188 // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 20189 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 20190 // result: (Rsh64Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 20191 for { 20192 _ = v.Args[1] 20193 v_0 := v.Args[0] 20194 if v_0.Op != OpLsh64x64 { 20195 break 20196 } 20197 _ = v_0.Args[1] 20198 v_0_0 := v_0.Args[0] 20199 if v_0_0.Op != OpRsh64Ux64 { 20200 break 20201 } 20202 _ = v_0_0.Args[1] 20203 x := v_0_0.Args[0] 20204 v_0_0_1 := v_0_0.Args[1] 20205 if v_0_0_1.Op != OpConst64 { 20206 break 20207 } 20208 c1 := v_0_0_1.AuxInt 20209 v_0_1 := v_0.Args[1] 20210 if v_0_1.Op != OpConst64 { 20211 break 20212 } 20213 c2 := v_0_1.AuxInt 20214 v_1 := v.Args[1] 20215 if v_1.Op != OpConst64 { 20216 break 20217 } 20218 c3 := v_1.AuxInt 20219 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 20220 break 20221 } 20222 v.reset(OpRsh64Ux64) 20223 v.AddArg(x) 20224 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 20225 v0.AuxInt = c1 - c2 + c3 20226 v.AddArg(v0) 20227 return true 20228 } 20229 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 20230 // cond: 20231 // result: (ZeroExt8to64 (Trunc64to8 <typ.UInt8> x)) 20232 for { 20233 _ = v.Args[1] 20234 v_0 := v.Args[0] 20235 if v_0.Op != OpLsh64x64 { 20236 break 20237 } 20238 _ = v_0.Args[1] 20239 x := v_0.Args[0] 20240 v_0_1 := v_0.Args[1] 20241 if v_0_1.Op != OpConst64 { 20242 break 20243 } 20244 if v_0_1.AuxInt != 56 { 20245 break 20246 } 20247 v_1 := v.Args[1] 20248 if v_1.Op != OpConst64 { 20249 break 20250 } 20251 if v_1.AuxInt != 56 { 20252 break 20253 } 20254 v.reset(OpZeroExt8to64) 20255 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) 20256 v0.AddArg(x) 20257 v.AddArg(v0) 20258 return true 20259 } 20260 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 20261 // cond: 20262 // result: (ZeroExt16to64 (Trunc64to16 <typ.UInt16> x)) 20263 for { 20264 _ = v.Args[1] 20265 v_0 := v.Args[0] 20266 if v_0.Op != OpLsh64x64 { 20267 break 20268 } 20269 _ = v_0.Args[1] 20270 x := v_0.Args[0] 20271 v_0_1 := v_0.Args[1] 20272 if v_0_1.Op != OpConst64 { 20273 break 20274 } 20275 if v_0_1.AuxInt != 48 { 20276 break 20277 } 20278 v_1 := v.Args[1] 20279 if v_1.Op != OpConst64 { 20280 break 20281 } 20282 if v_1.AuxInt != 48 { 20283 break 20284 } 20285 v.reset(OpZeroExt16to64) 20286 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) 20287 v0.AddArg(x) 20288 v.AddArg(v0) 20289 return true 20290 } 20291 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 20292 // cond: 20293 // result: (ZeroExt32to64 (Trunc64to32 <typ.UInt32> x)) 20294 for { 20295 _ = v.Args[1] 20296 v_0 := v.Args[0] 20297 if v_0.Op != OpLsh64x64 { 20298 break 20299 } 20300 _ = v_0.Args[1] 20301 x := v_0.Args[0] 20302 v_0_1 := v_0.Args[1] 20303 if v_0_1.Op != OpConst64 { 20304 break 20305 } 20306 if v_0_1.AuxInt != 32 { 20307 break 20308 } 20309 v_1 := v.Args[1] 20310 if v_1.Op != OpConst64 { 20311 break 20312 } 20313 if v_1.AuxInt != 32 { 20314 break 20315 } 20316 v.reset(OpZeroExt32to64) 20317 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) 20318 v0.AddArg(x) 20319 v.AddArg(v0) 20320 return true 20321 } 20322 return false 20323 } 20324 func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { 20325 b := v.Block 20326 _ = b 20327 // match: (Rsh64Ux8 <t> x (Const8 [c])) 20328 // cond: 20329 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))])) 20330 for { 20331 t := v.Type 20332 _ = v.Args[1] 20333 x := v.Args[0] 20334 v_1 := v.Args[1] 20335 if v_1.Op != OpConst8 { 20336 break 20337 } 20338 c := v_1.AuxInt 20339 v.reset(OpRsh64Ux64) 20340 v.AddArg(x) 20341 v0 := b.NewValue0(v.Pos, OpConst64, t) 20342 v0.AuxInt = int64(uint8(c)) 20343 v.AddArg(v0) 20344 return true 20345 } 20346 // match: (Rsh64Ux8 (Const64 [0]) _) 20347 // cond: 20348 // result: (Const64 [0]) 20349 for { 20350 _ = v.Args[1] 20351 v_0 := v.Args[0] 20352 if v_0.Op != OpConst64 { 20353 break 20354 } 20355 if v_0.AuxInt != 0 { 20356 break 20357 } 20358 v.reset(OpConst64) 20359 v.AuxInt = 0 20360 return true 20361 } 20362 return false 20363 } 20364 func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { 20365 b := v.Block 20366 _ = b 20367 // match: (Rsh64x16 <t> x (Const16 [c])) 20368 // cond: 20369 // result: (Rsh64x64 x (Const64 <t> [int64(uint16(c))])) 20370 for { 20371 t := v.Type 20372 _ = v.Args[1] 20373 x := v.Args[0] 20374 v_1 := v.Args[1] 20375 if v_1.Op != OpConst16 { 20376 break 20377 } 20378 c := v_1.AuxInt 20379 v.reset(OpRsh64x64) 20380 v.AddArg(x) 20381 v0 := b.NewValue0(v.Pos, OpConst64, t) 20382 v0.AuxInt = int64(uint16(c)) 20383 v.AddArg(v0) 20384 return true 20385 } 20386 // match: (Rsh64x16 (Const64 [0]) _) 20387 // cond: 20388 // result: (Const64 [0]) 20389 for { 20390 _ = v.Args[1] 20391 v_0 := v.Args[0] 20392 if v_0.Op != OpConst64 { 20393 break 20394 } 20395 if v_0.AuxInt != 0 { 20396 break 20397 } 20398 v.reset(OpConst64) 20399 v.AuxInt = 0 20400 return true 20401 } 20402 return false 20403 } 20404 func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { 20405 b := v.Block 20406 _ = b 20407 // match: (Rsh64x32 <t> x (Const32 [c])) 20408 // cond: 20409 // result: (Rsh64x64 x (Const64 <t> [int64(uint32(c))])) 20410 for { 20411 t := v.Type 20412 _ = v.Args[1] 20413 x := v.Args[0] 20414 v_1 := v.Args[1] 20415 if v_1.Op != OpConst32 { 20416 break 20417 } 20418 c := v_1.AuxInt 20419 v.reset(OpRsh64x64) 20420 v.AddArg(x) 20421 v0 := b.NewValue0(v.Pos, OpConst64, t) 20422 v0.AuxInt = int64(uint32(c)) 20423 v.AddArg(v0) 20424 return true 20425 } 20426 // match: (Rsh64x32 (Const64 [0]) _) 20427 // cond: 20428 // result: (Const64 [0]) 20429 for { 20430 _ = v.Args[1] 20431 v_0 := v.Args[0] 20432 if v_0.Op != OpConst64 { 20433 break 20434 } 20435 if v_0.AuxInt != 0 { 20436 break 20437 } 20438 v.reset(OpConst64) 20439 v.AuxInt = 0 20440 return true 20441 } 20442 return false 20443 } 20444 func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { 20445 b := v.Block 20446 _ = b 20447 typ := &b.Func.Config.Types 20448 _ = typ 20449 // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) 20450 // cond: 20451 // result: (Const64 [c >> uint64(d)]) 20452 for { 20453 _ = v.Args[1] 20454 v_0 := v.Args[0] 20455 if v_0.Op != OpConst64 { 20456 break 20457 } 20458 c := v_0.AuxInt 20459 v_1 := v.Args[1] 20460 if v_1.Op != OpConst64 { 20461 break 20462 } 20463 d := v_1.AuxInt 20464 v.reset(OpConst64) 20465 v.AuxInt = c >> uint64(d) 20466 return true 20467 } 20468 // match: (Rsh64x64 x (Const64 [0])) 20469 // cond: 20470 // result: x 20471 for { 20472 _ = v.Args[1] 20473 x := v.Args[0] 20474 v_1 := v.Args[1] 20475 if v_1.Op != OpConst64 { 20476 break 20477 } 20478 if v_1.AuxInt != 0 { 20479 break 20480 } 20481 v.reset(OpCopy) 20482 v.Type = x.Type 20483 v.AddArg(x) 20484 return true 20485 } 20486 // match: (Rsh64x64 (Const64 [0]) _) 20487 // cond: 20488 // result: (Const64 [0]) 20489 for { 20490 _ = v.Args[1] 20491 v_0 := v.Args[0] 20492 if v_0.Op != OpConst64 { 20493 break 20494 } 20495 if v_0.AuxInt != 0 { 20496 break 20497 } 20498 v.reset(OpConst64) 20499 v.AuxInt = 0 20500 return true 20501 } 20502 // match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d])) 20503 // cond: !uaddOvf(c,d) 20504 // result: (Rsh64x64 x (Const64 <t> [c+d])) 20505 for { 20506 t := v.Type 20507 _ = v.Args[1] 20508 v_0 := v.Args[0] 20509 if v_0.Op != OpRsh64x64 { 20510 break 20511 } 20512 _ = v_0.Args[1] 20513 x := v_0.Args[0] 20514 v_0_1 := v_0.Args[1] 20515 if v_0_1.Op != OpConst64 { 20516 break 20517 } 20518 c := v_0_1.AuxInt 20519 v_1 := v.Args[1] 20520 if v_1.Op != OpConst64 { 20521 break 20522 } 20523 d := v_1.AuxInt 20524 if !(!uaddOvf(c, d)) { 20525 break 20526 } 20527 v.reset(OpRsh64x64) 20528 v.AddArg(x) 20529 v0 := b.NewValue0(v.Pos, OpConst64, t) 20530 v0.AuxInt = c + d 20531 v.AddArg(v0) 20532 return true 20533 } 20534 // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 20535 // cond: 20536 // result: (SignExt8to64 (Trunc64to8 <typ.Int8> x)) 20537 for { 20538 _ = v.Args[1] 20539 v_0 := v.Args[0] 20540 if v_0.Op != OpLsh64x64 { 20541 break 20542 } 20543 _ = v_0.Args[1] 20544 x := v_0.Args[0] 20545 v_0_1 := v_0.Args[1] 20546 if v_0_1.Op != OpConst64 { 20547 break 20548 } 20549 if v_0_1.AuxInt != 56 { 20550 break 20551 } 20552 v_1 := v.Args[1] 20553 if v_1.Op != OpConst64 { 20554 break 20555 } 20556 if v_1.AuxInt != 56 { 20557 break 20558 } 20559 v.reset(OpSignExt8to64) 20560 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) 20561 v0.AddArg(x) 20562 v.AddArg(v0) 20563 return true 20564 } 20565 // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 20566 // cond: 20567 // result: (SignExt16to64 (Trunc64to16 <typ.Int16> x)) 20568 for { 20569 _ = v.Args[1] 20570 v_0 := v.Args[0] 20571 if v_0.Op != OpLsh64x64 { 20572 break 20573 } 20574 _ = v_0.Args[1] 20575 x := v_0.Args[0] 20576 v_0_1 := v_0.Args[1] 20577 if v_0_1.Op != OpConst64 { 20578 break 20579 } 20580 if v_0_1.AuxInt != 48 { 20581 break 20582 } 20583 v_1 := v.Args[1] 20584 if v_1.Op != OpConst64 { 20585 break 20586 } 20587 if v_1.AuxInt != 48 { 20588 break 20589 } 20590 v.reset(OpSignExt16to64) 20591 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) 20592 v0.AddArg(x) 20593 v.AddArg(v0) 20594 return true 20595 } 20596 // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 20597 // cond: 20598 // result: (SignExt32to64 (Trunc64to32 <typ.Int32> x)) 20599 for { 20600 _ = v.Args[1] 20601 v_0 := v.Args[0] 20602 if v_0.Op != OpLsh64x64 { 20603 break 20604 } 20605 _ = v_0.Args[1] 20606 x := v_0.Args[0] 20607 v_0_1 := v_0.Args[1] 20608 if v_0_1.Op != OpConst64 { 20609 break 20610 } 20611 if v_0_1.AuxInt != 32 { 20612 break 20613 } 20614 v_1 := v.Args[1] 20615 if v_1.Op != OpConst64 { 20616 break 20617 } 20618 if v_1.AuxInt != 32 { 20619 break 20620 } 20621 v.reset(OpSignExt32to64) 20622 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) 20623 v0.AddArg(x) 20624 v.AddArg(v0) 20625 return true 20626 } 20627 return false 20628 } 20629 func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { 20630 b := v.Block 20631 _ = b 20632 // match: (Rsh64x8 <t> x (Const8 [c])) 20633 // cond: 20634 // result: (Rsh64x64 x (Const64 <t> [int64(uint8(c))])) 20635 for { 20636 t := v.Type 20637 _ = v.Args[1] 20638 x := v.Args[0] 20639 v_1 := v.Args[1] 20640 if v_1.Op != OpConst8 { 20641 break 20642 } 20643 c := v_1.AuxInt 20644 v.reset(OpRsh64x64) 20645 v.AddArg(x) 20646 v0 := b.NewValue0(v.Pos, OpConst64, t) 20647 v0.AuxInt = int64(uint8(c)) 20648 v.AddArg(v0) 20649 return true 20650 } 20651 // match: (Rsh64x8 (Const64 [0]) _) 20652 // cond: 20653 // result: (Const64 [0]) 20654 for { 20655 _ = v.Args[1] 20656 v_0 := v.Args[0] 20657 if v_0.Op != OpConst64 { 20658 break 20659 } 20660 if v_0.AuxInt != 0 { 20661 break 20662 } 20663 v.reset(OpConst64) 20664 v.AuxInt = 0 20665 return true 20666 } 20667 return false 20668 } 20669 func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { 20670 b := v.Block 20671 _ = b 20672 // match: (Rsh8Ux16 <t> x (Const16 [c])) 20673 // cond: 20674 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))])) 20675 for { 20676 t := v.Type 20677 _ = v.Args[1] 20678 x := v.Args[0] 20679 v_1 := v.Args[1] 20680 if v_1.Op != OpConst16 { 20681 break 20682 } 20683 c := v_1.AuxInt 20684 v.reset(OpRsh8Ux64) 20685 v.AddArg(x) 20686 v0 := b.NewValue0(v.Pos, OpConst64, t) 20687 v0.AuxInt = int64(uint16(c)) 20688 v.AddArg(v0) 20689 return true 20690 } 20691 // match: (Rsh8Ux16 (Const8 [0]) _) 20692 // cond: 20693 // result: (Const8 [0]) 20694 for { 20695 _ = v.Args[1] 20696 v_0 := v.Args[0] 20697 if v_0.Op != OpConst8 { 20698 break 20699 } 20700 if v_0.AuxInt != 0 { 20701 break 20702 } 20703 v.reset(OpConst8) 20704 v.AuxInt = 0 20705 return true 20706 } 20707 return false 20708 } 20709 func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { 20710 b := v.Block 20711 _ = b 20712 // match: (Rsh8Ux32 <t> x (Const32 [c])) 20713 // cond: 20714 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))])) 20715 for { 20716 t := v.Type 20717 _ = v.Args[1] 20718 x := v.Args[0] 20719 v_1 := v.Args[1] 20720 if v_1.Op != OpConst32 { 20721 break 20722 } 20723 c := v_1.AuxInt 20724 v.reset(OpRsh8Ux64) 20725 v.AddArg(x) 20726 v0 := b.NewValue0(v.Pos, OpConst64, t) 20727 v0.AuxInt = int64(uint32(c)) 20728 v.AddArg(v0) 20729 return true 20730 } 20731 // match: (Rsh8Ux32 (Const8 [0]) _) 20732 // cond: 20733 // result: (Const8 [0]) 20734 for { 20735 _ = v.Args[1] 20736 v_0 := v.Args[0] 20737 if v_0.Op != OpConst8 { 20738 break 20739 } 20740 if v_0.AuxInt != 0 { 20741 break 20742 } 20743 v.reset(OpConst8) 20744 v.AuxInt = 0 20745 return true 20746 } 20747 return false 20748 } 20749 func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { 20750 b := v.Block 20751 _ = b 20752 typ := &b.Func.Config.Types 20753 _ = typ 20754 // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) 20755 // cond: 20756 // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) 20757 for { 20758 _ = v.Args[1] 20759 v_0 := v.Args[0] 20760 if v_0.Op != OpConst8 { 20761 break 20762 } 20763 c := v_0.AuxInt 20764 v_1 := v.Args[1] 20765 if v_1.Op != OpConst64 { 20766 break 20767 } 20768 d := v_1.AuxInt 20769 v.reset(OpConst8) 20770 v.AuxInt = int64(int8(uint8(c) >> uint64(d))) 20771 return true 20772 } 20773 // match: (Rsh8Ux64 x (Const64 [0])) 20774 // cond: 20775 // result: x 20776 for { 20777 _ = v.Args[1] 20778 x := v.Args[0] 20779 v_1 := v.Args[1] 20780 if v_1.Op != OpConst64 { 20781 break 20782 } 20783 if v_1.AuxInt != 0 { 20784 break 20785 } 20786 v.reset(OpCopy) 20787 v.Type = x.Type 20788 v.AddArg(x) 20789 return true 20790 } 20791 // match: (Rsh8Ux64 (Const8 [0]) _) 20792 // cond: 20793 // result: (Const8 [0]) 20794 for { 20795 _ = v.Args[1] 20796 v_0 := v.Args[0] 20797 if v_0.Op != OpConst8 { 20798 break 20799 } 20800 if v_0.AuxInt != 0 { 20801 break 20802 } 20803 v.reset(OpConst8) 20804 v.AuxInt = 0 20805 return true 20806 } 20807 // match: (Rsh8Ux64 _ (Const64 [c])) 20808 // cond: uint64(c) >= 8 20809 // result: (Const8 [0]) 20810 for { 20811 _ = v.Args[1] 20812 v_1 := v.Args[1] 20813 if v_1.Op != OpConst64 { 20814 break 20815 } 20816 c := v_1.AuxInt 20817 if !(uint64(c) >= 8) { 20818 break 20819 } 20820 v.reset(OpConst8) 20821 v.AuxInt = 0 20822 return true 20823 } 20824 // match: (Rsh8Ux64 <t> (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) 20825 // cond: !uaddOvf(c,d) 20826 // result: (Rsh8Ux64 x (Const64 <t> [c+d])) 20827 for { 20828 t := v.Type 20829 _ = v.Args[1] 20830 v_0 := v.Args[0] 20831 if v_0.Op != OpRsh8Ux64 { 20832 break 20833 } 20834 _ = v_0.Args[1] 20835 x := v_0.Args[0] 20836 v_0_1 := v_0.Args[1] 20837 if v_0_1.Op != OpConst64 { 20838 break 20839 } 20840 c := v_0_1.AuxInt 20841 v_1 := v.Args[1] 20842 if v_1.Op != OpConst64 { 20843 break 20844 } 20845 d := v_1.AuxInt 20846 if !(!uaddOvf(c, d)) { 20847 break 20848 } 20849 v.reset(OpRsh8Ux64) 20850 v.AddArg(x) 20851 v0 := b.NewValue0(v.Pos, OpConst64, t) 20852 v0.AuxInt = c + d 20853 v.AddArg(v0) 20854 return true 20855 } 20856 // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 20857 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 20858 // result: (Rsh8Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 20859 for { 20860 _ = v.Args[1] 20861 v_0 := v.Args[0] 20862 if v_0.Op != OpLsh8x64 { 20863 break 20864 } 20865 _ = v_0.Args[1] 20866 v_0_0 := v_0.Args[0] 20867 if v_0_0.Op != OpRsh8Ux64 { 20868 break 20869 } 20870 _ = v_0_0.Args[1] 20871 x := v_0_0.Args[0] 20872 v_0_0_1 := v_0_0.Args[1] 20873 if v_0_0_1.Op != OpConst64 { 20874 break 20875 } 20876 c1 := v_0_0_1.AuxInt 20877 v_0_1 := v_0.Args[1] 20878 if v_0_1.Op != OpConst64 { 20879 break 20880 } 20881 c2 := v_0_1.AuxInt 20882 v_1 := v.Args[1] 20883 if v_1.Op != OpConst64 { 20884 break 20885 } 20886 c3 := v_1.AuxInt 20887 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 20888 break 20889 } 20890 v.reset(OpRsh8Ux64) 20891 v.AddArg(x) 20892 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 20893 v0.AuxInt = c1 - c2 + c3 20894 v.AddArg(v0) 20895 return true 20896 } 20897 return false 20898 } 20899 func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { 20900 b := v.Block 20901 _ = b 20902 // match: (Rsh8Ux8 <t> x (Const8 [c])) 20903 // cond: 20904 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))])) 20905 for { 20906 t := v.Type 20907 _ = v.Args[1] 20908 x := v.Args[0] 20909 v_1 := v.Args[1] 20910 if v_1.Op != OpConst8 { 20911 break 20912 } 20913 c := v_1.AuxInt 20914 v.reset(OpRsh8Ux64) 20915 v.AddArg(x) 20916 v0 := b.NewValue0(v.Pos, OpConst64, t) 20917 v0.AuxInt = int64(uint8(c)) 20918 v.AddArg(v0) 20919 return true 20920 } 20921 // match: (Rsh8Ux8 (Const8 [0]) _) 20922 // cond: 20923 // result: (Const8 [0]) 20924 for { 20925 _ = v.Args[1] 20926 v_0 := v.Args[0] 20927 if v_0.Op != OpConst8 { 20928 break 20929 } 20930 if v_0.AuxInt != 0 { 20931 break 20932 } 20933 v.reset(OpConst8) 20934 v.AuxInt = 0 20935 return true 20936 } 20937 return false 20938 } 20939 func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { 20940 b := v.Block 20941 _ = b 20942 // match: (Rsh8x16 <t> x (Const16 [c])) 20943 // cond: 20944 // result: (Rsh8x64 x (Const64 <t> [int64(uint16(c))])) 20945 for { 20946 t := v.Type 20947 _ = v.Args[1] 20948 x := v.Args[0] 20949 v_1 := v.Args[1] 20950 if v_1.Op != OpConst16 { 20951 break 20952 } 20953 c := v_1.AuxInt 20954 v.reset(OpRsh8x64) 20955 v.AddArg(x) 20956 v0 := b.NewValue0(v.Pos, OpConst64, t) 20957 v0.AuxInt = int64(uint16(c)) 20958 v.AddArg(v0) 20959 return true 20960 } 20961 // match: (Rsh8x16 (Const8 [0]) _) 20962 // cond: 20963 // result: (Const8 [0]) 20964 for { 20965 _ = v.Args[1] 20966 v_0 := v.Args[0] 20967 if v_0.Op != OpConst8 { 20968 break 20969 } 20970 if v_0.AuxInt != 0 { 20971 break 20972 } 20973 v.reset(OpConst8) 20974 v.AuxInt = 0 20975 return true 20976 } 20977 return false 20978 } 20979 func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { 20980 b := v.Block 20981 _ = b 20982 // match: (Rsh8x32 <t> x (Const32 [c])) 20983 // cond: 20984 // result: (Rsh8x64 x (Const64 <t> [int64(uint32(c))])) 20985 for { 20986 t := v.Type 20987 _ = v.Args[1] 20988 x := v.Args[0] 20989 v_1 := v.Args[1] 20990 if v_1.Op != OpConst32 { 20991 break 20992 } 20993 c := v_1.AuxInt 20994 v.reset(OpRsh8x64) 20995 v.AddArg(x) 20996 v0 := b.NewValue0(v.Pos, OpConst64, t) 20997 v0.AuxInt = int64(uint32(c)) 20998 v.AddArg(v0) 20999 return true 21000 } 21001 // match: (Rsh8x32 (Const8 [0]) _) 21002 // cond: 21003 // result: (Const8 [0]) 21004 for { 21005 _ = v.Args[1] 21006 v_0 := v.Args[0] 21007 if v_0.Op != OpConst8 { 21008 break 21009 } 21010 if v_0.AuxInt != 0 { 21011 break 21012 } 21013 v.reset(OpConst8) 21014 v.AuxInt = 0 21015 return true 21016 } 21017 return false 21018 } 21019 func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { 21020 b := v.Block 21021 _ = b 21022 // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) 21023 // cond: 21024 // result: (Const8 [int64(int8(c) >> uint64(d))]) 21025 for { 21026 _ = v.Args[1] 21027 v_0 := v.Args[0] 21028 if v_0.Op != OpConst8 { 21029 break 21030 } 21031 c := v_0.AuxInt 21032 v_1 := v.Args[1] 21033 if v_1.Op != OpConst64 { 21034 break 21035 } 21036 d := v_1.AuxInt 21037 v.reset(OpConst8) 21038 v.AuxInt = int64(int8(c) >> uint64(d)) 21039 return true 21040 } 21041 // match: (Rsh8x64 x (Const64 [0])) 21042 // cond: 21043 // result: x 21044 for { 21045 _ = v.Args[1] 21046 x := v.Args[0] 21047 v_1 := v.Args[1] 21048 if v_1.Op != OpConst64 { 21049 break 21050 } 21051 if v_1.AuxInt != 0 { 21052 break 21053 } 21054 v.reset(OpCopy) 21055 v.Type = x.Type 21056 v.AddArg(x) 21057 return true 21058 } 21059 // match: (Rsh8x64 (Const8 [0]) _) 21060 // cond: 21061 // result: (Const8 [0]) 21062 for { 21063 _ = v.Args[1] 21064 v_0 := v.Args[0] 21065 if v_0.Op != OpConst8 { 21066 break 21067 } 21068 if v_0.AuxInt != 0 { 21069 break 21070 } 21071 v.reset(OpConst8) 21072 v.AuxInt = 0 21073 return true 21074 } 21075 // match: (Rsh8x64 <t> (Rsh8x64 x (Const64 [c])) (Const64 [d])) 21076 // cond: !uaddOvf(c,d) 21077 // result: (Rsh8x64 x (Const64 <t> [c+d])) 21078 for { 21079 t := v.Type 21080 _ = v.Args[1] 21081 v_0 := v.Args[0] 21082 if v_0.Op != OpRsh8x64 { 21083 break 21084 } 21085 _ = v_0.Args[1] 21086 x := v_0.Args[0] 21087 v_0_1 := v_0.Args[1] 21088 if v_0_1.Op != OpConst64 { 21089 break 21090 } 21091 c := v_0_1.AuxInt 21092 v_1 := v.Args[1] 21093 if v_1.Op != OpConst64 { 21094 break 21095 } 21096 d := v_1.AuxInt 21097 if !(!uaddOvf(c, d)) { 21098 break 21099 } 21100 v.reset(OpRsh8x64) 21101 v.AddArg(x) 21102 v0 := b.NewValue0(v.Pos, OpConst64, t) 21103 v0.AuxInt = c + d 21104 v.AddArg(v0) 21105 return true 21106 } 21107 return false 21108 } 21109 func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { 21110 b := v.Block 21111 _ = b 21112 // match: (Rsh8x8 <t> x (Const8 [c])) 21113 // cond: 21114 // result: (Rsh8x64 x (Const64 <t> [int64(uint8(c))])) 21115 for { 21116 t := v.Type 21117 _ = v.Args[1] 21118 x := v.Args[0] 21119 v_1 := v.Args[1] 21120 if v_1.Op != OpConst8 { 21121 break 21122 } 21123 c := v_1.AuxInt 21124 v.reset(OpRsh8x64) 21125 v.AddArg(x) 21126 v0 := b.NewValue0(v.Pos, OpConst64, t) 21127 v0.AuxInt = int64(uint8(c)) 21128 v.AddArg(v0) 21129 return true 21130 } 21131 // match: (Rsh8x8 (Const8 [0]) _) 21132 // cond: 21133 // result: (Const8 [0]) 21134 for { 21135 _ = v.Args[1] 21136 v_0 := v.Args[0] 21137 if v_0.Op != OpConst8 { 21138 break 21139 } 21140 if v_0.AuxInt != 0 { 21141 break 21142 } 21143 v.reset(OpConst8) 21144 v.AuxInt = 0 21145 return true 21146 } 21147 return false 21148 } 21149 func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { 21150 // match: (SignExt16to32 (Const16 [c])) 21151 // cond: 21152 // result: (Const32 [int64( int16(c))]) 21153 for { 21154 v_0 := v.Args[0] 21155 if v_0.Op != OpConst16 { 21156 break 21157 } 21158 c := v_0.AuxInt 21159 v.reset(OpConst32) 21160 v.AuxInt = int64(int16(c)) 21161 return true 21162 } 21163 // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) 21164 // cond: s >= 16 21165 // result: x 21166 for { 21167 v_0 := v.Args[0] 21168 if v_0.Op != OpTrunc32to16 { 21169 break 21170 } 21171 x := v_0.Args[0] 21172 if x.Op != OpRsh32x64 { 21173 break 21174 } 21175 _ = x.Args[1] 21176 x_1 := x.Args[1] 21177 if x_1.Op != OpConst64 { 21178 break 21179 } 21180 s := x_1.AuxInt 21181 if !(s >= 16) { 21182 break 21183 } 21184 v.reset(OpCopy) 21185 v.Type = x.Type 21186 v.AddArg(x) 21187 return true 21188 } 21189 return false 21190 } 21191 func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { 21192 // match: (SignExt16to64 (Const16 [c])) 21193 // cond: 21194 // result: (Const64 [int64( int16(c))]) 21195 for { 21196 v_0 := v.Args[0] 21197 if v_0.Op != OpConst16 { 21198 break 21199 } 21200 c := v_0.AuxInt 21201 v.reset(OpConst64) 21202 v.AuxInt = int64(int16(c)) 21203 return true 21204 } 21205 // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) 21206 // cond: s >= 48 21207 // result: x 21208 for { 21209 v_0 := v.Args[0] 21210 if v_0.Op != OpTrunc64to16 { 21211 break 21212 } 21213 x := v_0.Args[0] 21214 if x.Op != OpRsh64x64 { 21215 break 21216 } 21217 _ = x.Args[1] 21218 x_1 := x.Args[1] 21219 if x_1.Op != OpConst64 { 21220 break 21221 } 21222 s := x_1.AuxInt 21223 if !(s >= 48) { 21224 break 21225 } 21226 v.reset(OpCopy) 21227 v.Type = x.Type 21228 v.AddArg(x) 21229 return true 21230 } 21231 return false 21232 } 21233 func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { 21234 // match: (SignExt32to64 (Const32 [c])) 21235 // cond: 21236 // result: (Const64 [int64( int32(c))]) 21237 for { 21238 v_0 := v.Args[0] 21239 if v_0.Op != OpConst32 { 21240 break 21241 } 21242 c := v_0.AuxInt 21243 v.reset(OpConst64) 21244 v.AuxInt = int64(int32(c)) 21245 return true 21246 } 21247 // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) 21248 // cond: s >= 32 21249 // result: x 21250 for { 21251 v_0 := v.Args[0] 21252 if v_0.Op != OpTrunc64to32 { 21253 break 21254 } 21255 x := v_0.Args[0] 21256 if x.Op != OpRsh64x64 { 21257 break 21258 } 21259 _ = x.Args[1] 21260 x_1 := x.Args[1] 21261 if x_1.Op != OpConst64 { 21262 break 21263 } 21264 s := x_1.AuxInt 21265 if !(s >= 32) { 21266 break 21267 } 21268 v.reset(OpCopy) 21269 v.Type = x.Type 21270 v.AddArg(x) 21271 return true 21272 } 21273 return false 21274 } 21275 func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { 21276 // match: (SignExt8to16 (Const8 [c])) 21277 // cond: 21278 // result: (Const16 [int64( int8(c))]) 21279 for { 21280 v_0 := v.Args[0] 21281 if v_0.Op != OpConst8 { 21282 break 21283 } 21284 c := v_0.AuxInt 21285 v.reset(OpConst16) 21286 v.AuxInt = int64(int8(c)) 21287 return true 21288 } 21289 // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) 21290 // cond: s >= 8 21291 // result: x 21292 for { 21293 v_0 := v.Args[0] 21294 if v_0.Op != OpTrunc16to8 { 21295 break 21296 } 21297 x := v_0.Args[0] 21298 if x.Op != OpRsh16x64 { 21299 break 21300 } 21301 _ = x.Args[1] 21302 x_1 := x.Args[1] 21303 if x_1.Op != OpConst64 { 21304 break 21305 } 21306 s := x_1.AuxInt 21307 if !(s >= 8) { 21308 break 21309 } 21310 v.reset(OpCopy) 21311 v.Type = x.Type 21312 v.AddArg(x) 21313 return true 21314 } 21315 return false 21316 } 21317 func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { 21318 // match: (SignExt8to32 (Const8 [c])) 21319 // cond: 21320 // result: (Const32 [int64( int8(c))]) 21321 for { 21322 v_0 := v.Args[0] 21323 if v_0.Op != OpConst8 { 21324 break 21325 } 21326 c := v_0.AuxInt 21327 v.reset(OpConst32) 21328 v.AuxInt = int64(int8(c)) 21329 return true 21330 } 21331 // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) 21332 // cond: s >= 24 21333 // result: x 21334 for { 21335 v_0 := v.Args[0] 21336 if v_0.Op != OpTrunc32to8 { 21337 break 21338 } 21339 x := v_0.Args[0] 21340 if x.Op != OpRsh32x64 { 21341 break 21342 } 21343 _ = x.Args[1] 21344 x_1 := x.Args[1] 21345 if x_1.Op != OpConst64 { 21346 break 21347 } 21348 s := x_1.AuxInt 21349 if !(s >= 24) { 21350 break 21351 } 21352 v.reset(OpCopy) 21353 v.Type = x.Type 21354 v.AddArg(x) 21355 return true 21356 } 21357 return false 21358 } 21359 func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { 21360 // match: (SignExt8to64 (Const8 [c])) 21361 // cond: 21362 // result: (Const64 [int64( int8(c))]) 21363 for { 21364 v_0 := v.Args[0] 21365 if v_0.Op != OpConst8 { 21366 break 21367 } 21368 c := v_0.AuxInt 21369 v.reset(OpConst64) 21370 v.AuxInt = int64(int8(c)) 21371 return true 21372 } 21373 // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) 21374 // cond: s >= 56 21375 // result: x 21376 for { 21377 v_0 := v.Args[0] 21378 if v_0.Op != OpTrunc64to8 { 21379 break 21380 } 21381 x := v_0.Args[0] 21382 if x.Op != OpRsh64x64 { 21383 break 21384 } 21385 _ = x.Args[1] 21386 x_1 := x.Args[1] 21387 if x_1.Op != OpConst64 { 21388 break 21389 } 21390 s := x_1.AuxInt 21391 if !(s >= 56) { 21392 break 21393 } 21394 v.reset(OpCopy) 21395 v.Type = x.Type 21396 v.AddArg(x) 21397 return true 21398 } 21399 return false 21400 } 21401 func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { 21402 // match: (SliceCap (SliceMake _ _ (Const64 <t> [c]))) 21403 // cond: 21404 // result: (Const64 <t> [c]) 21405 for { 21406 v_0 := v.Args[0] 21407 if v_0.Op != OpSliceMake { 21408 break 21409 } 21410 _ = v_0.Args[2] 21411 v_0_2 := v_0.Args[2] 21412 if v_0_2.Op != OpConst64 { 21413 break 21414 } 21415 t := v_0_2.Type 21416 c := v_0_2.AuxInt 21417 v.reset(OpConst64) 21418 v.Type = t 21419 v.AuxInt = c 21420 return true 21421 } 21422 // match: (SliceCap (SliceMake _ _ (Const32 <t> [c]))) 21423 // cond: 21424 // result: (Const32 <t> [c]) 21425 for { 21426 v_0 := v.Args[0] 21427 if v_0.Op != OpSliceMake { 21428 break 21429 } 21430 _ = v_0.Args[2] 21431 v_0_2 := v_0.Args[2] 21432 if v_0_2.Op != OpConst32 { 21433 break 21434 } 21435 t := v_0_2.Type 21436 c := v_0_2.AuxInt 21437 v.reset(OpConst32) 21438 v.Type = t 21439 v.AuxInt = c 21440 return true 21441 } 21442 // match: (SliceCap (SliceMake _ _ (SliceCap x))) 21443 // cond: 21444 // result: (SliceCap x) 21445 for { 21446 v_0 := v.Args[0] 21447 if v_0.Op != OpSliceMake { 21448 break 21449 } 21450 _ = v_0.Args[2] 21451 v_0_2 := v_0.Args[2] 21452 if v_0_2.Op != OpSliceCap { 21453 break 21454 } 21455 x := v_0_2.Args[0] 21456 v.reset(OpSliceCap) 21457 v.AddArg(x) 21458 return true 21459 } 21460 // match: (SliceCap (SliceMake _ _ (SliceLen x))) 21461 // cond: 21462 // result: (SliceLen x) 21463 for { 21464 v_0 := v.Args[0] 21465 if v_0.Op != OpSliceMake { 21466 break 21467 } 21468 _ = v_0.Args[2] 21469 v_0_2 := v_0.Args[2] 21470 if v_0_2.Op != OpSliceLen { 21471 break 21472 } 21473 x := v_0_2.Args[0] 21474 v.reset(OpSliceLen) 21475 v.AddArg(x) 21476 return true 21477 } 21478 return false 21479 } 21480 func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { 21481 // match: (SliceLen (SliceMake _ (Const64 <t> [c]) _)) 21482 // cond: 21483 // result: (Const64 <t> [c]) 21484 for { 21485 v_0 := v.Args[0] 21486 if v_0.Op != OpSliceMake { 21487 break 21488 } 21489 _ = v_0.Args[2] 21490 v_0_1 := v_0.Args[1] 21491 if v_0_1.Op != OpConst64 { 21492 break 21493 } 21494 t := v_0_1.Type 21495 c := v_0_1.AuxInt 21496 v.reset(OpConst64) 21497 v.Type = t 21498 v.AuxInt = c 21499 return true 21500 } 21501 // match: (SliceLen (SliceMake _ (Const32 <t> [c]) _)) 21502 // cond: 21503 // result: (Const32 <t> [c]) 21504 for { 21505 v_0 := v.Args[0] 21506 if v_0.Op != OpSliceMake { 21507 break 21508 } 21509 _ = v_0.Args[2] 21510 v_0_1 := v_0.Args[1] 21511 if v_0_1.Op != OpConst32 { 21512 break 21513 } 21514 t := v_0_1.Type 21515 c := v_0_1.AuxInt 21516 v.reset(OpConst32) 21517 v.Type = t 21518 v.AuxInt = c 21519 return true 21520 } 21521 // match: (SliceLen (SliceMake _ (SliceLen x) _)) 21522 // cond: 21523 // result: (SliceLen x) 21524 for { 21525 v_0 := v.Args[0] 21526 if v_0.Op != OpSliceMake { 21527 break 21528 } 21529 _ = v_0.Args[2] 21530 v_0_1 := v_0.Args[1] 21531 if v_0_1.Op != OpSliceLen { 21532 break 21533 } 21534 x := v_0_1.Args[0] 21535 v.reset(OpSliceLen) 21536 v.AddArg(x) 21537 return true 21538 } 21539 return false 21540 } 21541 func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { 21542 // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) 21543 // cond: 21544 // result: (SlicePtr x) 21545 for { 21546 v_0 := v.Args[0] 21547 if v_0.Op != OpSliceMake { 21548 break 21549 } 21550 _ = v_0.Args[2] 21551 v_0_0 := v_0.Args[0] 21552 if v_0_0.Op != OpSlicePtr { 21553 break 21554 } 21555 x := v_0_0.Args[0] 21556 v.reset(OpSlicePtr) 21557 v.AddArg(x) 21558 return true 21559 } 21560 return false 21561 } 21562 func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { 21563 // match: (Slicemask (Const32 [x])) 21564 // cond: x > 0 21565 // result: (Const32 [-1]) 21566 for { 21567 v_0 := v.Args[0] 21568 if v_0.Op != OpConst32 { 21569 break 21570 } 21571 x := v_0.AuxInt 21572 if !(x > 0) { 21573 break 21574 } 21575 v.reset(OpConst32) 21576 v.AuxInt = -1 21577 return true 21578 } 21579 // match: (Slicemask (Const32 [0])) 21580 // cond: 21581 // result: (Const32 [0]) 21582 for { 21583 v_0 := v.Args[0] 21584 if v_0.Op != OpConst32 { 21585 break 21586 } 21587 if v_0.AuxInt != 0 { 21588 break 21589 } 21590 v.reset(OpConst32) 21591 v.AuxInt = 0 21592 return true 21593 } 21594 // match: (Slicemask (Const64 [x])) 21595 // cond: x > 0 21596 // result: (Const64 [-1]) 21597 for { 21598 v_0 := v.Args[0] 21599 if v_0.Op != OpConst64 { 21600 break 21601 } 21602 x := v_0.AuxInt 21603 if !(x > 0) { 21604 break 21605 } 21606 v.reset(OpConst64) 21607 v.AuxInt = -1 21608 return true 21609 } 21610 // match: (Slicemask (Const64 [0])) 21611 // cond: 21612 // result: (Const64 [0]) 21613 for { 21614 v_0 := v.Args[0] 21615 if v_0.Op != OpConst64 { 21616 break 21617 } 21618 if v_0.AuxInt != 0 { 21619 break 21620 } 21621 v.reset(OpConst64) 21622 v.AuxInt = 0 21623 return true 21624 } 21625 return false 21626 } 21627 func rewriteValuegeneric_OpSqrt_0(v *Value) bool { 21628 // match: (Sqrt (Const64F [c])) 21629 // cond: 21630 // result: (Const64F [f2i(math.Sqrt(i2f(c)))]) 21631 for { 21632 v_0 := v.Args[0] 21633 if v_0.Op != OpConst64F { 21634 break 21635 } 21636 c := v_0.AuxInt 21637 v.reset(OpConst64F) 21638 v.AuxInt = f2i(math.Sqrt(i2f(c))) 21639 return true 21640 } 21641 return false 21642 } 21643 func rewriteValuegeneric_OpStore_0(v *Value) bool { 21644 b := v.Block 21645 _ = b 21646 fe := b.Func.fe 21647 _ = fe 21648 // match: (Store {t1} p1 (Load <t2> p2 mem) mem) 21649 // cond: isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size() 21650 // result: mem 21651 for { 21652 t1 := v.Aux 21653 _ = v.Args[2] 21654 p1 := v.Args[0] 21655 v_1 := v.Args[1] 21656 if v_1.Op != OpLoad { 21657 break 21658 } 21659 t2 := v_1.Type 21660 _ = v_1.Args[1] 21661 p2 := v_1.Args[0] 21662 mem := v_1.Args[1] 21663 if mem != v.Args[2] { 21664 break 21665 } 21666 if !(isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size()) { 21667 break 21668 } 21669 v.reset(OpCopy) 21670 v.Type = mem.Type 21671 v.AddArg(mem) 21672 return true 21673 } 21674 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ oldmem)) 21675 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) 21676 // result: mem 21677 for { 21678 t1 := v.Aux 21679 _ = v.Args[2] 21680 v_0 := v.Args[0] 21681 if v_0.Op != OpOffPtr { 21682 break 21683 } 21684 o1 := v_0.AuxInt 21685 p1 := v_0.Args[0] 21686 v_1 := v.Args[1] 21687 if v_1.Op != OpLoad { 21688 break 21689 } 21690 t2 := v_1.Type 21691 _ = v_1.Args[1] 21692 v_1_0 := v_1.Args[0] 21693 if v_1_0.Op != OpOffPtr { 21694 break 21695 } 21696 if v_1_0.AuxInt != o1 { 21697 break 21698 } 21699 p2 := v_1_0.Args[0] 21700 oldmem := v_1.Args[1] 21701 mem := v.Args[2] 21702 if mem.Op != OpStore { 21703 break 21704 } 21705 t3 := mem.Aux 21706 _ = mem.Args[2] 21707 mem_0 := mem.Args[0] 21708 if mem_0.Op != OpOffPtr { 21709 break 21710 } 21711 o3 := mem_0.AuxInt 21712 p3 := mem_0.Args[0] 21713 if oldmem != mem.Args[2] { 21714 break 21715 } 21716 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size())) { 21717 break 21718 } 21719 v.reset(OpCopy) 21720 v.Type = mem.Type 21721 v.AddArg(mem) 21722 return true 21723 } 21724 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ oldmem))) 21725 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && isSamePtr(p1, p4) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) && !overlap(o1, t2.Size(), o4, t4.(*types.Type).Size()) 21726 // result: mem 21727 for { 21728 t1 := v.Aux 21729 _ = v.Args[2] 21730 v_0 := v.Args[0] 21731 if v_0.Op != OpOffPtr { 21732 break 21733 } 21734 o1 := v_0.AuxInt 21735 p1 := v_0.Args[0] 21736 v_1 := v.Args[1] 21737 if v_1.Op != OpLoad { 21738 break 21739 } 21740 t2 := v_1.Type 21741 _ = v_1.Args[1] 21742 v_1_0 := v_1.Args[0] 21743 if v_1_0.Op != OpOffPtr { 21744 break 21745 } 21746 if v_1_0.AuxInt != o1 { 21747 break 21748 } 21749 p2 := v_1_0.Args[0] 21750 oldmem := v_1.Args[1] 21751 mem := v.Args[2] 21752 if mem.Op != OpStore { 21753 break 21754 } 21755 t3 := mem.Aux 21756 _ = mem.Args[2] 21757 mem_0 := mem.Args[0] 21758 if mem_0.Op != OpOffPtr { 21759 break 21760 } 21761 o3 := mem_0.AuxInt 21762 p3 := mem_0.Args[0] 21763 mem_2 := mem.Args[2] 21764 if mem_2.Op != OpStore { 21765 break 21766 } 21767 t4 := mem_2.Aux 21768 _ = mem_2.Args[2] 21769 mem_2_0 := mem_2.Args[0] 21770 if mem_2_0.Op != OpOffPtr { 21771 break 21772 } 21773 o4 := mem_2_0.AuxInt 21774 p4 := mem_2_0.Args[0] 21775 if oldmem != mem_2.Args[2] { 21776 break 21777 } 21778 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && isSamePtr(p1, p4) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) && !overlap(o1, t2.Size(), o4, t4.(*types.Type).Size())) { 21779 break 21780 } 21781 v.reset(OpCopy) 21782 v.Type = mem.Type 21783 v.AddArg(mem) 21784 return true 21785 } 21786 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ (Store {t5} (OffPtr [o5] p5) _ oldmem)))) 21787 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && isSamePtr(p1, p4) && isSamePtr(p1, p5) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) && !overlap(o1, t2.Size(), o4, t4.(*types.Type).Size()) && !overlap(o1, t2.Size(), o5, t5.(*types.Type).Size()) 21788 // result: mem 21789 for { 21790 t1 := v.Aux 21791 _ = v.Args[2] 21792 v_0 := v.Args[0] 21793 if v_0.Op != OpOffPtr { 21794 break 21795 } 21796 o1 := v_0.AuxInt 21797 p1 := v_0.Args[0] 21798 v_1 := v.Args[1] 21799 if v_1.Op != OpLoad { 21800 break 21801 } 21802 t2 := v_1.Type 21803 _ = v_1.Args[1] 21804 v_1_0 := v_1.Args[0] 21805 if v_1_0.Op != OpOffPtr { 21806 break 21807 } 21808 if v_1_0.AuxInt != o1 { 21809 break 21810 } 21811 p2 := v_1_0.Args[0] 21812 oldmem := v_1.Args[1] 21813 mem := v.Args[2] 21814 if mem.Op != OpStore { 21815 break 21816 } 21817 t3 := mem.Aux 21818 _ = mem.Args[2] 21819 mem_0 := mem.Args[0] 21820 if mem_0.Op != OpOffPtr { 21821 break 21822 } 21823 o3 := mem_0.AuxInt 21824 p3 := mem_0.Args[0] 21825 mem_2 := mem.Args[2] 21826 if mem_2.Op != OpStore { 21827 break 21828 } 21829 t4 := mem_2.Aux 21830 _ = mem_2.Args[2] 21831 mem_2_0 := mem_2.Args[0] 21832 if mem_2_0.Op != OpOffPtr { 21833 break 21834 } 21835 o4 := mem_2_0.AuxInt 21836 p4 := mem_2_0.Args[0] 21837 mem_2_2 := mem_2.Args[2] 21838 if mem_2_2.Op != OpStore { 21839 break 21840 } 21841 t5 := mem_2_2.Aux 21842 _ = mem_2_2.Args[2] 21843 mem_2_2_0 := mem_2_2.Args[0] 21844 if mem_2_2_0.Op != OpOffPtr { 21845 break 21846 } 21847 o5 := mem_2_2_0.AuxInt 21848 p5 := mem_2_2_0.Args[0] 21849 if oldmem != mem_2_2.Args[2] { 21850 break 21851 } 21852 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && isSamePtr(p1, p4) && isSamePtr(p1, p5) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) && !overlap(o1, t2.Size(), o4, t4.(*types.Type).Size()) && !overlap(o1, t2.Size(), o5, t5.(*types.Type).Size())) { 21853 break 21854 } 21855 v.reset(OpCopy) 21856 v.Type = mem.Type 21857 v.AddArg(mem) 21858 return true 21859 } 21860 // match: (Store _ (StructMake0) mem) 21861 // cond: 21862 // result: mem 21863 for { 21864 _ = v.Args[2] 21865 v_1 := v.Args[1] 21866 if v_1.Op != OpStructMake0 { 21867 break 21868 } 21869 mem := v.Args[2] 21870 v.reset(OpCopy) 21871 v.Type = mem.Type 21872 v.AddArg(mem) 21873 return true 21874 } 21875 // match: (Store dst (StructMake1 <t> f0) mem) 21876 // cond: 21877 // result: (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem) 21878 for { 21879 _ = v.Args[2] 21880 dst := v.Args[0] 21881 v_1 := v.Args[1] 21882 if v_1.Op != OpStructMake1 { 21883 break 21884 } 21885 t := v_1.Type 21886 f0 := v_1.Args[0] 21887 mem := v.Args[2] 21888 v.reset(OpStore) 21889 v.Aux = t.FieldType(0) 21890 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 21891 v0.AuxInt = 0 21892 v0.AddArg(dst) 21893 v.AddArg(v0) 21894 v.AddArg(f0) 21895 v.AddArg(mem) 21896 return true 21897 } 21898 // match: (Store dst (StructMake2 <t> f0 f1) mem) 21899 // cond: 21900 // 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)) 21901 for { 21902 _ = v.Args[2] 21903 dst := v.Args[0] 21904 v_1 := v.Args[1] 21905 if v_1.Op != OpStructMake2 { 21906 break 21907 } 21908 t := v_1.Type 21909 _ = v_1.Args[1] 21910 f0 := v_1.Args[0] 21911 f1 := v_1.Args[1] 21912 mem := v.Args[2] 21913 v.reset(OpStore) 21914 v.Aux = t.FieldType(1) 21915 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 21916 v0.AuxInt = t.FieldOff(1) 21917 v0.AddArg(dst) 21918 v.AddArg(v0) 21919 v.AddArg(f1) 21920 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 21921 v1.Aux = t.FieldType(0) 21922 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 21923 v2.AuxInt = 0 21924 v2.AddArg(dst) 21925 v1.AddArg(v2) 21926 v1.AddArg(f0) 21927 v1.AddArg(mem) 21928 v.AddArg(v1) 21929 return true 21930 } 21931 // match: (Store dst (StructMake3 <t> f0 f1 f2) mem) 21932 // cond: 21933 // 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))) 21934 for { 21935 _ = v.Args[2] 21936 dst := v.Args[0] 21937 v_1 := v.Args[1] 21938 if v_1.Op != OpStructMake3 { 21939 break 21940 } 21941 t := v_1.Type 21942 _ = v_1.Args[2] 21943 f0 := v_1.Args[0] 21944 f1 := v_1.Args[1] 21945 f2 := v_1.Args[2] 21946 mem := v.Args[2] 21947 v.reset(OpStore) 21948 v.Aux = t.FieldType(2) 21949 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 21950 v0.AuxInt = t.FieldOff(2) 21951 v0.AddArg(dst) 21952 v.AddArg(v0) 21953 v.AddArg(f2) 21954 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 21955 v1.Aux = t.FieldType(1) 21956 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 21957 v2.AuxInt = t.FieldOff(1) 21958 v2.AddArg(dst) 21959 v1.AddArg(v2) 21960 v1.AddArg(f1) 21961 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 21962 v3.Aux = t.FieldType(0) 21963 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 21964 v4.AuxInt = 0 21965 v4.AddArg(dst) 21966 v3.AddArg(v4) 21967 v3.AddArg(f0) 21968 v3.AddArg(mem) 21969 v1.AddArg(v3) 21970 v.AddArg(v1) 21971 return true 21972 } 21973 // match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem) 21974 // cond: 21975 // 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)))) 21976 for { 21977 _ = v.Args[2] 21978 dst := v.Args[0] 21979 v_1 := v.Args[1] 21980 if v_1.Op != OpStructMake4 { 21981 break 21982 } 21983 t := v_1.Type 21984 _ = v_1.Args[3] 21985 f0 := v_1.Args[0] 21986 f1 := v_1.Args[1] 21987 f2 := v_1.Args[2] 21988 f3 := v_1.Args[3] 21989 mem := v.Args[2] 21990 v.reset(OpStore) 21991 v.Aux = t.FieldType(3) 21992 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 21993 v0.AuxInt = t.FieldOff(3) 21994 v0.AddArg(dst) 21995 v.AddArg(v0) 21996 v.AddArg(f3) 21997 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 21998 v1.Aux = t.FieldType(2) 21999 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 22000 v2.AuxInt = t.FieldOff(2) 22001 v2.AddArg(dst) 22002 v1.AddArg(v2) 22003 v1.AddArg(f2) 22004 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 22005 v3.Aux = t.FieldType(1) 22006 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 22007 v4.AuxInt = t.FieldOff(1) 22008 v4.AddArg(dst) 22009 v3.AddArg(v4) 22010 v3.AddArg(f1) 22011 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 22012 v5.Aux = t.FieldType(0) 22013 v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 22014 v6.AuxInt = 0 22015 v6.AddArg(dst) 22016 v5.AddArg(v6) 22017 v5.AddArg(f0) 22018 v5.AddArg(mem) 22019 v3.AddArg(v5) 22020 v1.AddArg(v3) 22021 v.AddArg(v1) 22022 return true 22023 } 22024 // match: (Store {t} dst (Load src mem) mem) 22025 // cond: !fe.CanSSA(t.(*types.Type)) 22026 // result: (Move {t} [t.(*types.Type).Size()] dst src mem) 22027 for { 22028 t := v.Aux 22029 _ = v.Args[2] 22030 dst := v.Args[0] 22031 v_1 := v.Args[1] 22032 if v_1.Op != OpLoad { 22033 break 22034 } 22035 _ = v_1.Args[1] 22036 src := v_1.Args[0] 22037 mem := v_1.Args[1] 22038 if mem != v.Args[2] { 22039 break 22040 } 22041 if !(!fe.CanSSA(t.(*types.Type))) { 22042 break 22043 } 22044 v.reset(OpMove) 22045 v.AuxInt = t.(*types.Type).Size() 22046 v.Aux = t 22047 v.AddArg(dst) 22048 v.AddArg(src) 22049 v.AddArg(mem) 22050 return true 22051 } 22052 return false 22053 } 22054 func rewriteValuegeneric_OpStore_10(v *Value) bool { 22055 b := v.Block 22056 _ = b 22057 config := b.Func.Config 22058 _ = config 22059 fe := b.Func.fe 22060 _ = fe 22061 // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) 22062 // cond: !fe.CanSSA(t.(*types.Type)) 22063 // result: (Move {t} [t.(*types.Type).Size()] dst src (VarDef {x} mem)) 22064 for { 22065 t := v.Aux 22066 _ = v.Args[2] 22067 dst := v.Args[0] 22068 v_1 := v.Args[1] 22069 if v_1.Op != OpLoad { 22070 break 22071 } 22072 _ = v_1.Args[1] 22073 src := v_1.Args[0] 22074 mem := v_1.Args[1] 22075 v_2 := v.Args[2] 22076 if v_2.Op != OpVarDef { 22077 break 22078 } 22079 x := v_2.Aux 22080 if mem != v_2.Args[0] { 22081 break 22082 } 22083 if !(!fe.CanSSA(t.(*types.Type))) { 22084 break 22085 } 22086 v.reset(OpMove) 22087 v.AuxInt = t.(*types.Type).Size() 22088 v.Aux = t 22089 v.AddArg(dst) 22090 v.AddArg(src) 22091 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) 22092 v0.Aux = x 22093 v0.AddArg(mem) 22094 v.AddArg(v0) 22095 return true 22096 } 22097 // match: (Store _ (ArrayMake0) mem) 22098 // cond: 22099 // result: mem 22100 for { 22101 _ = v.Args[2] 22102 v_1 := v.Args[1] 22103 if v_1.Op != OpArrayMake0 { 22104 break 22105 } 22106 mem := v.Args[2] 22107 v.reset(OpCopy) 22108 v.Type = mem.Type 22109 v.AddArg(mem) 22110 return true 22111 } 22112 // match: (Store dst (ArrayMake1 e) mem) 22113 // cond: 22114 // result: (Store {e.Type} dst e mem) 22115 for { 22116 _ = v.Args[2] 22117 dst := v.Args[0] 22118 v_1 := v.Args[1] 22119 if v_1.Op != OpArrayMake1 { 22120 break 22121 } 22122 e := v_1.Args[0] 22123 mem := v.Args[2] 22124 v.reset(OpStore) 22125 v.Aux = e.Type 22126 v.AddArg(dst) 22127 v.AddArg(e) 22128 v.AddArg(mem) 22129 return true 22130 } 22131 // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) 22132 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 22133 // result: mem 22134 for { 22135 _ = v.Args[2] 22136 v_0 := v.Args[0] 22137 if v_0.Op != OpLoad { 22138 break 22139 } 22140 _ = v_0.Args[1] 22141 v_0_0 := v_0.Args[0] 22142 if v_0_0.Op != OpOffPtr { 22143 break 22144 } 22145 c := v_0_0.AuxInt 22146 v_0_0_0 := v_0_0.Args[0] 22147 if v_0_0_0.Op != OpSP { 22148 break 22149 } 22150 mem := v_0.Args[1] 22151 x := v.Args[1] 22152 if mem != v.Args[2] { 22153 break 22154 } 22155 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 22156 break 22157 } 22158 v.reset(OpCopy) 22159 v.Type = mem.Type 22160 v.AddArg(mem) 22161 return true 22162 } 22163 // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) 22164 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 22165 // result: mem 22166 for { 22167 _ = v.Args[2] 22168 v_0 := v.Args[0] 22169 if v_0.Op != OpOffPtr { 22170 break 22171 } 22172 v_0_0 := v_0.Args[0] 22173 if v_0_0.Op != OpLoad { 22174 break 22175 } 22176 _ = v_0_0.Args[1] 22177 v_0_0_0 := v_0_0.Args[0] 22178 if v_0_0_0.Op != OpOffPtr { 22179 break 22180 } 22181 c := v_0_0_0.AuxInt 22182 v_0_0_0_0 := v_0_0_0.Args[0] 22183 if v_0_0_0_0.Op != OpSP { 22184 break 22185 } 22186 mem := v_0_0.Args[1] 22187 x := v.Args[1] 22188 if mem != v.Args[2] { 22189 break 22190 } 22191 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 22192 break 22193 } 22194 v.reset(OpCopy) 22195 v.Type = mem.Type 22196 v.AddArg(mem) 22197 return true 22198 } 22199 return false 22200 } 22201 func rewriteValuegeneric_OpStringLen_0(v *Value) bool { 22202 // match: (StringLen (StringMake _ (Const64 <t> [c]))) 22203 // cond: 22204 // result: (Const64 <t> [c]) 22205 for { 22206 v_0 := v.Args[0] 22207 if v_0.Op != OpStringMake { 22208 break 22209 } 22210 _ = v_0.Args[1] 22211 v_0_1 := v_0.Args[1] 22212 if v_0_1.Op != OpConst64 { 22213 break 22214 } 22215 t := v_0_1.Type 22216 c := v_0_1.AuxInt 22217 v.reset(OpConst64) 22218 v.Type = t 22219 v.AuxInt = c 22220 return true 22221 } 22222 return false 22223 } 22224 func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { 22225 // match: (StringPtr (StringMake (Const64 <t> [c]) _)) 22226 // cond: 22227 // result: (Const64 <t> [c]) 22228 for { 22229 v_0 := v.Args[0] 22230 if v_0.Op != OpStringMake { 22231 break 22232 } 22233 _ = v_0.Args[1] 22234 v_0_0 := v_0.Args[0] 22235 if v_0_0.Op != OpConst64 { 22236 break 22237 } 22238 t := v_0_0.Type 22239 c := v_0_0.AuxInt 22240 v.reset(OpConst64) 22241 v.Type = t 22242 v.AuxInt = c 22243 return true 22244 } 22245 return false 22246 } 22247 func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { 22248 // match: (StructSelect (StructMake1 x)) 22249 // cond: 22250 // result: x 22251 for { 22252 v_0 := v.Args[0] 22253 if v_0.Op != OpStructMake1 { 22254 break 22255 } 22256 x := v_0.Args[0] 22257 v.reset(OpCopy) 22258 v.Type = x.Type 22259 v.AddArg(x) 22260 return true 22261 } 22262 // match: (StructSelect [0] (StructMake2 x _)) 22263 // cond: 22264 // result: x 22265 for { 22266 if v.AuxInt != 0 { 22267 break 22268 } 22269 v_0 := v.Args[0] 22270 if v_0.Op != OpStructMake2 { 22271 break 22272 } 22273 _ = v_0.Args[1] 22274 x := v_0.Args[0] 22275 v.reset(OpCopy) 22276 v.Type = x.Type 22277 v.AddArg(x) 22278 return true 22279 } 22280 // match: (StructSelect [1] (StructMake2 _ x)) 22281 // cond: 22282 // result: x 22283 for { 22284 if v.AuxInt != 1 { 22285 break 22286 } 22287 v_0 := v.Args[0] 22288 if v_0.Op != OpStructMake2 { 22289 break 22290 } 22291 _ = v_0.Args[1] 22292 x := v_0.Args[1] 22293 v.reset(OpCopy) 22294 v.Type = x.Type 22295 v.AddArg(x) 22296 return true 22297 } 22298 // match: (StructSelect [0] (StructMake3 x _ _)) 22299 // cond: 22300 // result: x 22301 for { 22302 if v.AuxInt != 0 { 22303 break 22304 } 22305 v_0 := v.Args[0] 22306 if v_0.Op != OpStructMake3 { 22307 break 22308 } 22309 _ = v_0.Args[2] 22310 x := v_0.Args[0] 22311 v.reset(OpCopy) 22312 v.Type = x.Type 22313 v.AddArg(x) 22314 return true 22315 } 22316 // match: (StructSelect [1] (StructMake3 _ x _)) 22317 // cond: 22318 // result: x 22319 for { 22320 if v.AuxInt != 1 { 22321 break 22322 } 22323 v_0 := v.Args[0] 22324 if v_0.Op != OpStructMake3 { 22325 break 22326 } 22327 _ = v_0.Args[2] 22328 x := v_0.Args[1] 22329 v.reset(OpCopy) 22330 v.Type = x.Type 22331 v.AddArg(x) 22332 return true 22333 } 22334 // match: (StructSelect [2] (StructMake3 _ _ x)) 22335 // cond: 22336 // result: x 22337 for { 22338 if v.AuxInt != 2 { 22339 break 22340 } 22341 v_0 := v.Args[0] 22342 if v_0.Op != OpStructMake3 { 22343 break 22344 } 22345 _ = v_0.Args[2] 22346 x := v_0.Args[2] 22347 v.reset(OpCopy) 22348 v.Type = x.Type 22349 v.AddArg(x) 22350 return true 22351 } 22352 // match: (StructSelect [0] (StructMake4 x _ _ _)) 22353 // cond: 22354 // result: x 22355 for { 22356 if v.AuxInt != 0 { 22357 break 22358 } 22359 v_0 := v.Args[0] 22360 if v_0.Op != OpStructMake4 { 22361 break 22362 } 22363 _ = v_0.Args[3] 22364 x := v_0.Args[0] 22365 v.reset(OpCopy) 22366 v.Type = x.Type 22367 v.AddArg(x) 22368 return true 22369 } 22370 // match: (StructSelect [1] (StructMake4 _ x _ _)) 22371 // cond: 22372 // result: x 22373 for { 22374 if v.AuxInt != 1 { 22375 break 22376 } 22377 v_0 := v.Args[0] 22378 if v_0.Op != OpStructMake4 { 22379 break 22380 } 22381 _ = v_0.Args[3] 22382 x := v_0.Args[1] 22383 v.reset(OpCopy) 22384 v.Type = x.Type 22385 v.AddArg(x) 22386 return true 22387 } 22388 // match: (StructSelect [2] (StructMake4 _ _ x _)) 22389 // cond: 22390 // result: x 22391 for { 22392 if v.AuxInt != 2 { 22393 break 22394 } 22395 v_0 := v.Args[0] 22396 if v_0.Op != OpStructMake4 { 22397 break 22398 } 22399 _ = v_0.Args[3] 22400 x := v_0.Args[2] 22401 v.reset(OpCopy) 22402 v.Type = x.Type 22403 v.AddArg(x) 22404 return true 22405 } 22406 // match: (StructSelect [3] (StructMake4 _ _ _ x)) 22407 // cond: 22408 // result: x 22409 for { 22410 if v.AuxInt != 3 { 22411 break 22412 } 22413 v_0 := v.Args[0] 22414 if v_0.Op != OpStructMake4 { 22415 break 22416 } 22417 _ = v_0.Args[3] 22418 x := v_0.Args[3] 22419 v.reset(OpCopy) 22420 v.Type = x.Type 22421 v.AddArg(x) 22422 return true 22423 } 22424 return false 22425 } 22426 func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { 22427 b := v.Block 22428 _ = b 22429 fe := b.Func.fe 22430 _ = fe 22431 // match: (StructSelect [i] x:(Load <t> ptr mem)) 22432 // cond: !fe.CanSSA(t) 22433 // result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem) 22434 for { 22435 i := v.AuxInt 22436 x := v.Args[0] 22437 if x.Op != OpLoad { 22438 break 22439 } 22440 t := x.Type 22441 _ = x.Args[1] 22442 ptr := x.Args[0] 22443 mem := x.Args[1] 22444 if !(!fe.CanSSA(t)) { 22445 break 22446 } 22447 b = x.Block 22448 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 22449 v.reset(OpCopy) 22450 v.AddArg(v0) 22451 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) 22452 v1.AuxInt = t.FieldOff(int(i)) 22453 v1.AddArg(ptr) 22454 v0.AddArg(v1) 22455 v0.AddArg(mem) 22456 return true 22457 } 22458 // match: (StructSelect [0] x:(IData _)) 22459 // cond: 22460 // result: x 22461 for { 22462 if v.AuxInt != 0 { 22463 break 22464 } 22465 x := v.Args[0] 22466 if x.Op != OpIData { 22467 break 22468 } 22469 v.reset(OpCopy) 22470 v.Type = x.Type 22471 v.AddArg(x) 22472 return true 22473 } 22474 return false 22475 } 22476 func rewriteValuegeneric_OpSub16_0(v *Value) bool { 22477 b := v.Block 22478 _ = b 22479 // match: (Sub16 (Const16 [c]) (Const16 [d])) 22480 // cond: 22481 // result: (Const16 [int64(int16(c-d))]) 22482 for { 22483 _ = v.Args[1] 22484 v_0 := v.Args[0] 22485 if v_0.Op != OpConst16 { 22486 break 22487 } 22488 c := v_0.AuxInt 22489 v_1 := v.Args[1] 22490 if v_1.Op != OpConst16 { 22491 break 22492 } 22493 d := v_1.AuxInt 22494 v.reset(OpConst16) 22495 v.AuxInt = int64(int16(c - d)) 22496 return true 22497 } 22498 // match: (Sub16 x (Const16 <t> [c])) 22499 // cond: x.Op != OpConst16 22500 // result: (Add16 (Const16 <t> [int64(int16(-c))]) x) 22501 for { 22502 _ = v.Args[1] 22503 x := v.Args[0] 22504 v_1 := v.Args[1] 22505 if v_1.Op != OpConst16 { 22506 break 22507 } 22508 t := v_1.Type 22509 c := v_1.AuxInt 22510 if !(x.Op != OpConst16) { 22511 break 22512 } 22513 v.reset(OpAdd16) 22514 v0 := b.NewValue0(v.Pos, OpConst16, t) 22515 v0.AuxInt = int64(int16(-c)) 22516 v.AddArg(v0) 22517 v.AddArg(x) 22518 return true 22519 } 22520 // match: (Sub16 x x) 22521 // cond: 22522 // result: (Const16 [0]) 22523 for { 22524 _ = v.Args[1] 22525 x := v.Args[0] 22526 if x != v.Args[1] { 22527 break 22528 } 22529 v.reset(OpConst16) 22530 v.AuxInt = 0 22531 return true 22532 } 22533 // match: (Sub16 (Add16 x y) x) 22534 // cond: 22535 // result: y 22536 for { 22537 _ = v.Args[1] 22538 v_0 := v.Args[0] 22539 if v_0.Op != OpAdd16 { 22540 break 22541 } 22542 _ = v_0.Args[1] 22543 x := v_0.Args[0] 22544 y := v_0.Args[1] 22545 if x != v.Args[1] { 22546 break 22547 } 22548 v.reset(OpCopy) 22549 v.Type = y.Type 22550 v.AddArg(y) 22551 return true 22552 } 22553 // match: (Sub16 (Add16 y x) x) 22554 // cond: 22555 // result: y 22556 for { 22557 _ = v.Args[1] 22558 v_0 := v.Args[0] 22559 if v_0.Op != OpAdd16 { 22560 break 22561 } 22562 _ = v_0.Args[1] 22563 y := v_0.Args[0] 22564 x := v_0.Args[1] 22565 if x != v.Args[1] { 22566 break 22567 } 22568 v.reset(OpCopy) 22569 v.Type = y.Type 22570 v.AddArg(y) 22571 return true 22572 } 22573 // match: (Sub16 (Add16 x y) y) 22574 // cond: 22575 // result: x 22576 for { 22577 _ = v.Args[1] 22578 v_0 := v.Args[0] 22579 if v_0.Op != OpAdd16 { 22580 break 22581 } 22582 _ = v_0.Args[1] 22583 x := v_0.Args[0] 22584 y := v_0.Args[1] 22585 if y != v.Args[1] { 22586 break 22587 } 22588 v.reset(OpCopy) 22589 v.Type = x.Type 22590 v.AddArg(x) 22591 return true 22592 } 22593 // match: (Sub16 (Add16 y x) y) 22594 // cond: 22595 // result: x 22596 for { 22597 _ = v.Args[1] 22598 v_0 := v.Args[0] 22599 if v_0.Op != OpAdd16 { 22600 break 22601 } 22602 _ = v_0.Args[1] 22603 y := v_0.Args[0] 22604 x := v_0.Args[1] 22605 if y != v.Args[1] { 22606 break 22607 } 22608 v.reset(OpCopy) 22609 v.Type = x.Type 22610 v.AddArg(x) 22611 return true 22612 } 22613 // match: (Sub16 x (Sub16 i:(Const16 <t>) z)) 22614 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 22615 // result: (Sub16 (Add16 <t> x z) i) 22616 for { 22617 _ = v.Args[1] 22618 x := v.Args[0] 22619 v_1 := v.Args[1] 22620 if v_1.Op != OpSub16 { 22621 break 22622 } 22623 _ = v_1.Args[1] 22624 i := v_1.Args[0] 22625 if i.Op != OpConst16 { 22626 break 22627 } 22628 t := i.Type 22629 z := v_1.Args[1] 22630 if !(z.Op != OpConst16 && x.Op != OpConst16) { 22631 break 22632 } 22633 v.reset(OpSub16) 22634 v0 := b.NewValue0(v.Pos, OpAdd16, t) 22635 v0.AddArg(x) 22636 v0.AddArg(z) 22637 v.AddArg(v0) 22638 v.AddArg(i) 22639 return true 22640 } 22641 // match: (Sub16 x (Sub16 z i:(Const16 <t>))) 22642 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 22643 // result: (Add16 i (Sub16 <t> x z)) 22644 for { 22645 _ = v.Args[1] 22646 x := v.Args[0] 22647 v_1 := v.Args[1] 22648 if v_1.Op != OpSub16 { 22649 break 22650 } 22651 _ = v_1.Args[1] 22652 z := v_1.Args[0] 22653 i := v_1.Args[1] 22654 if i.Op != OpConst16 { 22655 break 22656 } 22657 t := i.Type 22658 if !(z.Op != OpConst16 && x.Op != OpConst16) { 22659 break 22660 } 22661 v.reset(OpAdd16) 22662 v.AddArg(i) 22663 v0 := b.NewValue0(v.Pos, OpSub16, t) 22664 v0.AddArg(x) 22665 v0.AddArg(z) 22666 v.AddArg(v0) 22667 return true 22668 } 22669 // match: (Sub16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 22670 // cond: 22671 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 22672 for { 22673 _ = v.Args[1] 22674 v_0 := v.Args[0] 22675 if v_0.Op != OpConst16 { 22676 break 22677 } 22678 t := v_0.Type 22679 c := v_0.AuxInt 22680 v_1 := v.Args[1] 22681 if v_1.Op != OpSub16 { 22682 break 22683 } 22684 _ = v_1.Args[1] 22685 x := v_1.Args[0] 22686 v_1_1 := v_1.Args[1] 22687 if v_1_1.Op != OpConst16 { 22688 break 22689 } 22690 if v_1_1.Type != t { 22691 break 22692 } 22693 d := v_1_1.AuxInt 22694 v.reset(OpSub16) 22695 v0 := b.NewValue0(v.Pos, OpConst16, t) 22696 v0.AuxInt = int64(int16(c + d)) 22697 v.AddArg(v0) 22698 v.AddArg(x) 22699 return true 22700 } 22701 return false 22702 } 22703 func rewriteValuegeneric_OpSub16_10(v *Value) bool { 22704 b := v.Block 22705 _ = b 22706 // match: (Sub16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 22707 // cond: 22708 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 22709 for { 22710 _ = v.Args[1] 22711 v_0 := v.Args[0] 22712 if v_0.Op != OpConst16 { 22713 break 22714 } 22715 t := v_0.Type 22716 c := v_0.AuxInt 22717 v_1 := v.Args[1] 22718 if v_1.Op != OpSub16 { 22719 break 22720 } 22721 _ = v_1.Args[1] 22722 v_1_0 := v_1.Args[0] 22723 if v_1_0.Op != OpConst16 { 22724 break 22725 } 22726 if v_1_0.Type != t { 22727 break 22728 } 22729 d := v_1_0.AuxInt 22730 x := v_1.Args[1] 22731 v.reset(OpAdd16) 22732 v0 := b.NewValue0(v.Pos, OpConst16, t) 22733 v0.AuxInt = int64(int16(c - d)) 22734 v.AddArg(v0) 22735 v.AddArg(x) 22736 return true 22737 } 22738 return false 22739 } 22740 func rewriteValuegeneric_OpSub32_0(v *Value) bool { 22741 b := v.Block 22742 _ = b 22743 // match: (Sub32 (Const32 [c]) (Const32 [d])) 22744 // cond: 22745 // result: (Const32 [int64(int32(c-d))]) 22746 for { 22747 _ = v.Args[1] 22748 v_0 := v.Args[0] 22749 if v_0.Op != OpConst32 { 22750 break 22751 } 22752 c := v_0.AuxInt 22753 v_1 := v.Args[1] 22754 if v_1.Op != OpConst32 { 22755 break 22756 } 22757 d := v_1.AuxInt 22758 v.reset(OpConst32) 22759 v.AuxInt = int64(int32(c - d)) 22760 return true 22761 } 22762 // match: (Sub32 x (Const32 <t> [c])) 22763 // cond: x.Op != OpConst32 22764 // result: (Add32 (Const32 <t> [int64(int32(-c))]) x) 22765 for { 22766 _ = v.Args[1] 22767 x := v.Args[0] 22768 v_1 := v.Args[1] 22769 if v_1.Op != OpConst32 { 22770 break 22771 } 22772 t := v_1.Type 22773 c := v_1.AuxInt 22774 if !(x.Op != OpConst32) { 22775 break 22776 } 22777 v.reset(OpAdd32) 22778 v0 := b.NewValue0(v.Pos, OpConst32, t) 22779 v0.AuxInt = int64(int32(-c)) 22780 v.AddArg(v0) 22781 v.AddArg(x) 22782 return true 22783 } 22784 // match: (Sub32 x x) 22785 // cond: 22786 // result: (Const32 [0]) 22787 for { 22788 _ = v.Args[1] 22789 x := v.Args[0] 22790 if x != v.Args[1] { 22791 break 22792 } 22793 v.reset(OpConst32) 22794 v.AuxInt = 0 22795 return true 22796 } 22797 // match: (Sub32 (Add32 x y) x) 22798 // cond: 22799 // result: y 22800 for { 22801 _ = v.Args[1] 22802 v_0 := v.Args[0] 22803 if v_0.Op != OpAdd32 { 22804 break 22805 } 22806 _ = v_0.Args[1] 22807 x := v_0.Args[0] 22808 y := v_0.Args[1] 22809 if x != v.Args[1] { 22810 break 22811 } 22812 v.reset(OpCopy) 22813 v.Type = y.Type 22814 v.AddArg(y) 22815 return true 22816 } 22817 // match: (Sub32 (Add32 y x) x) 22818 // cond: 22819 // result: y 22820 for { 22821 _ = v.Args[1] 22822 v_0 := v.Args[0] 22823 if v_0.Op != OpAdd32 { 22824 break 22825 } 22826 _ = v_0.Args[1] 22827 y := v_0.Args[0] 22828 x := v_0.Args[1] 22829 if x != v.Args[1] { 22830 break 22831 } 22832 v.reset(OpCopy) 22833 v.Type = y.Type 22834 v.AddArg(y) 22835 return true 22836 } 22837 // match: (Sub32 (Add32 x y) y) 22838 // cond: 22839 // result: x 22840 for { 22841 _ = v.Args[1] 22842 v_0 := v.Args[0] 22843 if v_0.Op != OpAdd32 { 22844 break 22845 } 22846 _ = v_0.Args[1] 22847 x := v_0.Args[0] 22848 y := v_0.Args[1] 22849 if y != v.Args[1] { 22850 break 22851 } 22852 v.reset(OpCopy) 22853 v.Type = x.Type 22854 v.AddArg(x) 22855 return true 22856 } 22857 // match: (Sub32 (Add32 y x) y) 22858 // cond: 22859 // result: x 22860 for { 22861 _ = v.Args[1] 22862 v_0 := v.Args[0] 22863 if v_0.Op != OpAdd32 { 22864 break 22865 } 22866 _ = v_0.Args[1] 22867 y := v_0.Args[0] 22868 x := v_0.Args[1] 22869 if y != v.Args[1] { 22870 break 22871 } 22872 v.reset(OpCopy) 22873 v.Type = x.Type 22874 v.AddArg(x) 22875 return true 22876 } 22877 // match: (Sub32 x (Sub32 i:(Const32 <t>) z)) 22878 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 22879 // result: (Sub32 (Add32 <t> x z) i) 22880 for { 22881 _ = v.Args[1] 22882 x := v.Args[0] 22883 v_1 := v.Args[1] 22884 if v_1.Op != OpSub32 { 22885 break 22886 } 22887 _ = v_1.Args[1] 22888 i := v_1.Args[0] 22889 if i.Op != OpConst32 { 22890 break 22891 } 22892 t := i.Type 22893 z := v_1.Args[1] 22894 if !(z.Op != OpConst32 && x.Op != OpConst32) { 22895 break 22896 } 22897 v.reset(OpSub32) 22898 v0 := b.NewValue0(v.Pos, OpAdd32, t) 22899 v0.AddArg(x) 22900 v0.AddArg(z) 22901 v.AddArg(v0) 22902 v.AddArg(i) 22903 return true 22904 } 22905 // match: (Sub32 x (Sub32 z i:(Const32 <t>))) 22906 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 22907 // result: (Add32 i (Sub32 <t> x z)) 22908 for { 22909 _ = v.Args[1] 22910 x := v.Args[0] 22911 v_1 := v.Args[1] 22912 if v_1.Op != OpSub32 { 22913 break 22914 } 22915 _ = v_1.Args[1] 22916 z := v_1.Args[0] 22917 i := v_1.Args[1] 22918 if i.Op != OpConst32 { 22919 break 22920 } 22921 t := i.Type 22922 if !(z.Op != OpConst32 && x.Op != OpConst32) { 22923 break 22924 } 22925 v.reset(OpAdd32) 22926 v.AddArg(i) 22927 v0 := b.NewValue0(v.Pos, OpSub32, t) 22928 v0.AddArg(x) 22929 v0.AddArg(z) 22930 v.AddArg(v0) 22931 return true 22932 } 22933 // match: (Sub32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 22934 // cond: 22935 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 22936 for { 22937 _ = v.Args[1] 22938 v_0 := v.Args[0] 22939 if v_0.Op != OpConst32 { 22940 break 22941 } 22942 t := v_0.Type 22943 c := v_0.AuxInt 22944 v_1 := v.Args[1] 22945 if v_1.Op != OpSub32 { 22946 break 22947 } 22948 _ = v_1.Args[1] 22949 x := v_1.Args[0] 22950 v_1_1 := v_1.Args[1] 22951 if v_1_1.Op != OpConst32 { 22952 break 22953 } 22954 if v_1_1.Type != t { 22955 break 22956 } 22957 d := v_1_1.AuxInt 22958 v.reset(OpSub32) 22959 v0 := b.NewValue0(v.Pos, OpConst32, t) 22960 v0.AuxInt = int64(int32(c + d)) 22961 v.AddArg(v0) 22962 v.AddArg(x) 22963 return true 22964 } 22965 return false 22966 } 22967 func rewriteValuegeneric_OpSub32_10(v *Value) bool { 22968 b := v.Block 22969 _ = b 22970 // match: (Sub32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 22971 // cond: 22972 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 22973 for { 22974 _ = v.Args[1] 22975 v_0 := v.Args[0] 22976 if v_0.Op != OpConst32 { 22977 break 22978 } 22979 t := v_0.Type 22980 c := v_0.AuxInt 22981 v_1 := v.Args[1] 22982 if v_1.Op != OpSub32 { 22983 break 22984 } 22985 _ = v_1.Args[1] 22986 v_1_0 := v_1.Args[0] 22987 if v_1_0.Op != OpConst32 { 22988 break 22989 } 22990 if v_1_0.Type != t { 22991 break 22992 } 22993 d := v_1_0.AuxInt 22994 x := v_1.Args[1] 22995 v.reset(OpAdd32) 22996 v0 := b.NewValue0(v.Pos, OpConst32, t) 22997 v0.AuxInt = int64(int32(c - d)) 22998 v.AddArg(v0) 22999 v.AddArg(x) 23000 return true 23001 } 23002 return false 23003 } 23004 func rewriteValuegeneric_OpSub32F_0(v *Value) bool { 23005 // match: (Sub32F (Const32F [c]) (Const32F [d])) 23006 // cond: 23007 // result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))]) 23008 for { 23009 _ = v.Args[1] 23010 v_0 := v.Args[0] 23011 if v_0.Op != OpConst32F { 23012 break 23013 } 23014 c := v_0.AuxInt 23015 v_1 := v.Args[1] 23016 if v_1.Op != OpConst32F { 23017 break 23018 } 23019 d := v_1.AuxInt 23020 v.reset(OpConst32F) 23021 v.AuxInt = f2i(float64(i2f32(c) - i2f32(d))) 23022 return true 23023 } 23024 // match: (Sub32F x (Const32F [0])) 23025 // cond: 23026 // result: x 23027 for { 23028 _ = v.Args[1] 23029 x := v.Args[0] 23030 v_1 := v.Args[1] 23031 if v_1.Op != OpConst32F { 23032 break 23033 } 23034 if v_1.AuxInt != 0 { 23035 break 23036 } 23037 v.reset(OpCopy) 23038 v.Type = x.Type 23039 v.AddArg(x) 23040 return true 23041 } 23042 return false 23043 } 23044 func rewriteValuegeneric_OpSub64_0(v *Value) bool { 23045 b := v.Block 23046 _ = b 23047 // match: (Sub64 (Const64 [c]) (Const64 [d])) 23048 // cond: 23049 // result: (Const64 [c-d]) 23050 for { 23051 _ = v.Args[1] 23052 v_0 := v.Args[0] 23053 if v_0.Op != OpConst64 { 23054 break 23055 } 23056 c := v_0.AuxInt 23057 v_1 := v.Args[1] 23058 if v_1.Op != OpConst64 { 23059 break 23060 } 23061 d := v_1.AuxInt 23062 v.reset(OpConst64) 23063 v.AuxInt = c - d 23064 return true 23065 } 23066 // match: (Sub64 x (Const64 <t> [c])) 23067 // cond: x.Op != OpConst64 23068 // result: (Add64 (Const64 <t> [-c]) x) 23069 for { 23070 _ = v.Args[1] 23071 x := v.Args[0] 23072 v_1 := v.Args[1] 23073 if v_1.Op != OpConst64 { 23074 break 23075 } 23076 t := v_1.Type 23077 c := v_1.AuxInt 23078 if !(x.Op != OpConst64) { 23079 break 23080 } 23081 v.reset(OpAdd64) 23082 v0 := b.NewValue0(v.Pos, OpConst64, t) 23083 v0.AuxInt = -c 23084 v.AddArg(v0) 23085 v.AddArg(x) 23086 return true 23087 } 23088 // match: (Sub64 x x) 23089 // cond: 23090 // result: (Const64 [0]) 23091 for { 23092 _ = v.Args[1] 23093 x := v.Args[0] 23094 if x != v.Args[1] { 23095 break 23096 } 23097 v.reset(OpConst64) 23098 v.AuxInt = 0 23099 return true 23100 } 23101 // match: (Sub64 (Add64 x y) x) 23102 // cond: 23103 // result: y 23104 for { 23105 _ = v.Args[1] 23106 v_0 := v.Args[0] 23107 if v_0.Op != OpAdd64 { 23108 break 23109 } 23110 _ = v_0.Args[1] 23111 x := v_0.Args[0] 23112 y := v_0.Args[1] 23113 if x != v.Args[1] { 23114 break 23115 } 23116 v.reset(OpCopy) 23117 v.Type = y.Type 23118 v.AddArg(y) 23119 return true 23120 } 23121 // match: (Sub64 (Add64 y x) x) 23122 // cond: 23123 // result: y 23124 for { 23125 _ = v.Args[1] 23126 v_0 := v.Args[0] 23127 if v_0.Op != OpAdd64 { 23128 break 23129 } 23130 _ = v_0.Args[1] 23131 y := v_0.Args[0] 23132 x := v_0.Args[1] 23133 if x != v.Args[1] { 23134 break 23135 } 23136 v.reset(OpCopy) 23137 v.Type = y.Type 23138 v.AddArg(y) 23139 return true 23140 } 23141 // match: (Sub64 (Add64 x y) y) 23142 // cond: 23143 // result: x 23144 for { 23145 _ = v.Args[1] 23146 v_0 := v.Args[0] 23147 if v_0.Op != OpAdd64 { 23148 break 23149 } 23150 _ = v_0.Args[1] 23151 x := v_0.Args[0] 23152 y := v_0.Args[1] 23153 if y != v.Args[1] { 23154 break 23155 } 23156 v.reset(OpCopy) 23157 v.Type = x.Type 23158 v.AddArg(x) 23159 return true 23160 } 23161 // match: (Sub64 (Add64 y x) y) 23162 // cond: 23163 // result: x 23164 for { 23165 _ = v.Args[1] 23166 v_0 := v.Args[0] 23167 if v_0.Op != OpAdd64 { 23168 break 23169 } 23170 _ = v_0.Args[1] 23171 y := v_0.Args[0] 23172 x := v_0.Args[1] 23173 if y != v.Args[1] { 23174 break 23175 } 23176 v.reset(OpCopy) 23177 v.Type = x.Type 23178 v.AddArg(x) 23179 return true 23180 } 23181 // match: (Sub64 x (Sub64 i:(Const64 <t>) z)) 23182 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 23183 // result: (Sub64 (Add64 <t> x z) i) 23184 for { 23185 _ = v.Args[1] 23186 x := v.Args[0] 23187 v_1 := v.Args[1] 23188 if v_1.Op != OpSub64 { 23189 break 23190 } 23191 _ = v_1.Args[1] 23192 i := v_1.Args[0] 23193 if i.Op != OpConst64 { 23194 break 23195 } 23196 t := i.Type 23197 z := v_1.Args[1] 23198 if !(z.Op != OpConst64 && x.Op != OpConst64) { 23199 break 23200 } 23201 v.reset(OpSub64) 23202 v0 := b.NewValue0(v.Pos, OpAdd64, t) 23203 v0.AddArg(x) 23204 v0.AddArg(z) 23205 v.AddArg(v0) 23206 v.AddArg(i) 23207 return true 23208 } 23209 // match: (Sub64 x (Sub64 z i:(Const64 <t>))) 23210 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 23211 // result: (Add64 i (Sub64 <t> x z)) 23212 for { 23213 _ = v.Args[1] 23214 x := v.Args[0] 23215 v_1 := v.Args[1] 23216 if v_1.Op != OpSub64 { 23217 break 23218 } 23219 _ = v_1.Args[1] 23220 z := v_1.Args[0] 23221 i := v_1.Args[1] 23222 if i.Op != OpConst64 { 23223 break 23224 } 23225 t := i.Type 23226 if !(z.Op != OpConst64 && x.Op != OpConst64) { 23227 break 23228 } 23229 v.reset(OpAdd64) 23230 v.AddArg(i) 23231 v0 := b.NewValue0(v.Pos, OpSub64, t) 23232 v0.AddArg(x) 23233 v0.AddArg(z) 23234 v.AddArg(v0) 23235 return true 23236 } 23237 // match: (Sub64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 23238 // cond: 23239 // result: (Sub64 (Const64 <t> [c+d]) x) 23240 for { 23241 _ = v.Args[1] 23242 v_0 := v.Args[0] 23243 if v_0.Op != OpConst64 { 23244 break 23245 } 23246 t := v_0.Type 23247 c := v_0.AuxInt 23248 v_1 := v.Args[1] 23249 if v_1.Op != OpSub64 { 23250 break 23251 } 23252 _ = v_1.Args[1] 23253 x := v_1.Args[0] 23254 v_1_1 := v_1.Args[1] 23255 if v_1_1.Op != OpConst64 { 23256 break 23257 } 23258 if v_1_1.Type != t { 23259 break 23260 } 23261 d := v_1_1.AuxInt 23262 v.reset(OpSub64) 23263 v0 := b.NewValue0(v.Pos, OpConst64, t) 23264 v0.AuxInt = c + d 23265 v.AddArg(v0) 23266 v.AddArg(x) 23267 return true 23268 } 23269 return false 23270 } 23271 func rewriteValuegeneric_OpSub64_10(v *Value) bool { 23272 b := v.Block 23273 _ = b 23274 // match: (Sub64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 23275 // cond: 23276 // result: (Add64 (Const64 <t> [c-d]) x) 23277 for { 23278 _ = v.Args[1] 23279 v_0 := v.Args[0] 23280 if v_0.Op != OpConst64 { 23281 break 23282 } 23283 t := v_0.Type 23284 c := v_0.AuxInt 23285 v_1 := v.Args[1] 23286 if v_1.Op != OpSub64 { 23287 break 23288 } 23289 _ = v_1.Args[1] 23290 v_1_0 := v_1.Args[0] 23291 if v_1_0.Op != OpConst64 { 23292 break 23293 } 23294 if v_1_0.Type != t { 23295 break 23296 } 23297 d := v_1_0.AuxInt 23298 x := v_1.Args[1] 23299 v.reset(OpAdd64) 23300 v0 := b.NewValue0(v.Pos, OpConst64, t) 23301 v0.AuxInt = c - d 23302 v.AddArg(v0) 23303 v.AddArg(x) 23304 return true 23305 } 23306 return false 23307 } 23308 func rewriteValuegeneric_OpSub64F_0(v *Value) bool { 23309 // match: (Sub64F (Const64F [c]) (Const64F [d])) 23310 // cond: 23311 // result: (Const64F [f2i(i2f(c) - i2f(d))]) 23312 for { 23313 _ = v.Args[1] 23314 v_0 := v.Args[0] 23315 if v_0.Op != OpConst64F { 23316 break 23317 } 23318 c := v_0.AuxInt 23319 v_1 := v.Args[1] 23320 if v_1.Op != OpConst64F { 23321 break 23322 } 23323 d := v_1.AuxInt 23324 v.reset(OpConst64F) 23325 v.AuxInt = f2i(i2f(c) - i2f(d)) 23326 return true 23327 } 23328 // match: (Sub64F x (Const64F [0])) 23329 // cond: 23330 // result: x 23331 for { 23332 _ = v.Args[1] 23333 x := v.Args[0] 23334 v_1 := v.Args[1] 23335 if v_1.Op != OpConst64F { 23336 break 23337 } 23338 if v_1.AuxInt != 0 { 23339 break 23340 } 23341 v.reset(OpCopy) 23342 v.Type = x.Type 23343 v.AddArg(x) 23344 return true 23345 } 23346 return false 23347 } 23348 func rewriteValuegeneric_OpSub8_0(v *Value) bool { 23349 b := v.Block 23350 _ = b 23351 // match: (Sub8 (Const8 [c]) (Const8 [d])) 23352 // cond: 23353 // result: (Const8 [int64(int8(c-d))]) 23354 for { 23355 _ = v.Args[1] 23356 v_0 := v.Args[0] 23357 if v_0.Op != OpConst8 { 23358 break 23359 } 23360 c := v_0.AuxInt 23361 v_1 := v.Args[1] 23362 if v_1.Op != OpConst8 { 23363 break 23364 } 23365 d := v_1.AuxInt 23366 v.reset(OpConst8) 23367 v.AuxInt = int64(int8(c - d)) 23368 return true 23369 } 23370 // match: (Sub8 x (Const8 <t> [c])) 23371 // cond: x.Op != OpConst8 23372 // result: (Add8 (Const8 <t> [int64(int8(-c))]) x) 23373 for { 23374 _ = v.Args[1] 23375 x := v.Args[0] 23376 v_1 := v.Args[1] 23377 if v_1.Op != OpConst8 { 23378 break 23379 } 23380 t := v_1.Type 23381 c := v_1.AuxInt 23382 if !(x.Op != OpConst8) { 23383 break 23384 } 23385 v.reset(OpAdd8) 23386 v0 := b.NewValue0(v.Pos, OpConst8, t) 23387 v0.AuxInt = int64(int8(-c)) 23388 v.AddArg(v0) 23389 v.AddArg(x) 23390 return true 23391 } 23392 // match: (Sub8 x x) 23393 // cond: 23394 // result: (Const8 [0]) 23395 for { 23396 _ = v.Args[1] 23397 x := v.Args[0] 23398 if x != v.Args[1] { 23399 break 23400 } 23401 v.reset(OpConst8) 23402 v.AuxInt = 0 23403 return true 23404 } 23405 // match: (Sub8 (Add8 x y) x) 23406 // cond: 23407 // result: y 23408 for { 23409 _ = v.Args[1] 23410 v_0 := v.Args[0] 23411 if v_0.Op != OpAdd8 { 23412 break 23413 } 23414 _ = v_0.Args[1] 23415 x := v_0.Args[0] 23416 y := v_0.Args[1] 23417 if x != v.Args[1] { 23418 break 23419 } 23420 v.reset(OpCopy) 23421 v.Type = y.Type 23422 v.AddArg(y) 23423 return true 23424 } 23425 // match: (Sub8 (Add8 y x) x) 23426 // cond: 23427 // result: y 23428 for { 23429 _ = v.Args[1] 23430 v_0 := v.Args[0] 23431 if v_0.Op != OpAdd8 { 23432 break 23433 } 23434 _ = v_0.Args[1] 23435 y := v_0.Args[0] 23436 x := v_0.Args[1] 23437 if x != v.Args[1] { 23438 break 23439 } 23440 v.reset(OpCopy) 23441 v.Type = y.Type 23442 v.AddArg(y) 23443 return true 23444 } 23445 // match: (Sub8 (Add8 x y) y) 23446 // cond: 23447 // result: x 23448 for { 23449 _ = v.Args[1] 23450 v_0 := v.Args[0] 23451 if v_0.Op != OpAdd8 { 23452 break 23453 } 23454 _ = v_0.Args[1] 23455 x := v_0.Args[0] 23456 y := v_0.Args[1] 23457 if y != v.Args[1] { 23458 break 23459 } 23460 v.reset(OpCopy) 23461 v.Type = x.Type 23462 v.AddArg(x) 23463 return true 23464 } 23465 // match: (Sub8 (Add8 y x) y) 23466 // cond: 23467 // result: x 23468 for { 23469 _ = v.Args[1] 23470 v_0 := v.Args[0] 23471 if v_0.Op != OpAdd8 { 23472 break 23473 } 23474 _ = v_0.Args[1] 23475 y := v_0.Args[0] 23476 x := v_0.Args[1] 23477 if y != v.Args[1] { 23478 break 23479 } 23480 v.reset(OpCopy) 23481 v.Type = x.Type 23482 v.AddArg(x) 23483 return true 23484 } 23485 // match: (Sub8 x (Sub8 i:(Const8 <t>) z)) 23486 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 23487 // result: (Sub8 (Add8 <t> x z) i) 23488 for { 23489 _ = v.Args[1] 23490 x := v.Args[0] 23491 v_1 := v.Args[1] 23492 if v_1.Op != OpSub8 { 23493 break 23494 } 23495 _ = v_1.Args[1] 23496 i := v_1.Args[0] 23497 if i.Op != OpConst8 { 23498 break 23499 } 23500 t := i.Type 23501 z := v_1.Args[1] 23502 if !(z.Op != OpConst8 && x.Op != OpConst8) { 23503 break 23504 } 23505 v.reset(OpSub8) 23506 v0 := b.NewValue0(v.Pos, OpAdd8, t) 23507 v0.AddArg(x) 23508 v0.AddArg(z) 23509 v.AddArg(v0) 23510 v.AddArg(i) 23511 return true 23512 } 23513 // match: (Sub8 x (Sub8 z i:(Const8 <t>))) 23514 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 23515 // result: (Add8 i (Sub8 <t> x z)) 23516 for { 23517 _ = v.Args[1] 23518 x := v.Args[0] 23519 v_1 := v.Args[1] 23520 if v_1.Op != OpSub8 { 23521 break 23522 } 23523 _ = v_1.Args[1] 23524 z := v_1.Args[0] 23525 i := v_1.Args[1] 23526 if i.Op != OpConst8 { 23527 break 23528 } 23529 t := i.Type 23530 if !(z.Op != OpConst8 && x.Op != OpConst8) { 23531 break 23532 } 23533 v.reset(OpAdd8) 23534 v.AddArg(i) 23535 v0 := b.NewValue0(v.Pos, OpSub8, t) 23536 v0.AddArg(x) 23537 v0.AddArg(z) 23538 v.AddArg(v0) 23539 return true 23540 } 23541 // match: (Sub8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 23542 // cond: 23543 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 23544 for { 23545 _ = v.Args[1] 23546 v_0 := v.Args[0] 23547 if v_0.Op != OpConst8 { 23548 break 23549 } 23550 t := v_0.Type 23551 c := v_0.AuxInt 23552 v_1 := v.Args[1] 23553 if v_1.Op != OpSub8 { 23554 break 23555 } 23556 _ = v_1.Args[1] 23557 x := v_1.Args[0] 23558 v_1_1 := v_1.Args[1] 23559 if v_1_1.Op != OpConst8 { 23560 break 23561 } 23562 if v_1_1.Type != t { 23563 break 23564 } 23565 d := v_1_1.AuxInt 23566 v.reset(OpSub8) 23567 v0 := b.NewValue0(v.Pos, OpConst8, t) 23568 v0.AuxInt = int64(int8(c + d)) 23569 v.AddArg(v0) 23570 v.AddArg(x) 23571 return true 23572 } 23573 return false 23574 } 23575 func rewriteValuegeneric_OpSub8_10(v *Value) bool { 23576 b := v.Block 23577 _ = b 23578 // match: (Sub8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 23579 // cond: 23580 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 23581 for { 23582 _ = v.Args[1] 23583 v_0 := v.Args[0] 23584 if v_0.Op != OpConst8 { 23585 break 23586 } 23587 t := v_0.Type 23588 c := v_0.AuxInt 23589 v_1 := v.Args[1] 23590 if v_1.Op != OpSub8 { 23591 break 23592 } 23593 _ = v_1.Args[1] 23594 v_1_0 := v_1.Args[0] 23595 if v_1_0.Op != OpConst8 { 23596 break 23597 } 23598 if v_1_0.Type != t { 23599 break 23600 } 23601 d := v_1_0.AuxInt 23602 x := v_1.Args[1] 23603 v.reset(OpAdd8) 23604 v0 := b.NewValue0(v.Pos, OpConst8, t) 23605 v0.AuxInt = int64(int8(c - d)) 23606 v.AddArg(v0) 23607 v.AddArg(x) 23608 return true 23609 } 23610 return false 23611 } 23612 func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { 23613 // match: (Trunc16to8 (Const16 [c])) 23614 // cond: 23615 // result: (Const8 [int64(int8(c))]) 23616 for { 23617 v_0 := v.Args[0] 23618 if v_0.Op != OpConst16 { 23619 break 23620 } 23621 c := v_0.AuxInt 23622 v.reset(OpConst8) 23623 v.AuxInt = int64(int8(c)) 23624 return true 23625 } 23626 // match: (Trunc16to8 (ZeroExt8to16 x)) 23627 // cond: 23628 // result: x 23629 for { 23630 v_0 := v.Args[0] 23631 if v_0.Op != OpZeroExt8to16 { 23632 break 23633 } 23634 x := v_0.Args[0] 23635 v.reset(OpCopy) 23636 v.Type = x.Type 23637 v.AddArg(x) 23638 return true 23639 } 23640 // match: (Trunc16to8 (SignExt8to16 x)) 23641 // cond: 23642 // result: x 23643 for { 23644 v_0 := v.Args[0] 23645 if v_0.Op != OpSignExt8to16 { 23646 break 23647 } 23648 x := v_0.Args[0] 23649 v.reset(OpCopy) 23650 v.Type = x.Type 23651 v.AddArg(x) 23652 return true 23653 } 23654 // match: (Trunc16to8 (And16 (Const16 [y]) x)) 23655 // cond: y&0xFF == 0xFF 23656 // result: (Trunc16to8 x) 23657 for { 23658 v_0 := v.Args[0] 23659 if v_0.Op != OpAnd16 { 23660 break 23661 } 23662 _ = v_0.Args[1] 23663 v_0_0 := v_0.Args[0] 23664 if v_0_0.Op != OpConst16 { 23665 break 23666 } 23667 y := v_0_0.AuxInt 23668 x := v_0.Args[1] 23669 if !(y&0xFF == 0xFF) { 23670 break 23671 } 23672 v.reset(OpTrunc16to8) 23673 v.AddArg(x) 23674 return true 23675 } 23676 // match: (Trunc16to8 (And16 x (Const16 [y]))) 23677 // cond: y&0xFF == 0xFF 23678 // result: (Trunc16to8 x) 23679 for { 23680 v_0 := v.Args[0] 23681 if v_0.Op != OpAnd16 { 23682 break 23683 } 23684 _ = v_0.Args[1] 23685 x := v_0.Args[0] 23686 v_0_1 := v_0.Args[1] 23687 if v_0_1.Op != OpConst16 { 23688 break 23689 } 23690 y := v_0_1.AuxInt 23691 if !(y&0xFF == 0xFF) { 23692 break 23693 } 23694 v.reset(OpTrunc16to8) 23695 v.AddArg(x) 23696 return true 23697 } 23698 return false 23699 } 23700 func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { 23701 // match: (Trunc32to16 (Const32 [c])) 23702 // cond: 23703 // result: (Const16 [int64(int16(c))]) 23704 for { 23705 v_0 := v.Args[0] 23706 if v_0.Op != OpConst32 { 23707 break 23708 } 23709 c := v_0.AuxInt 23710 v.reset(OpConst16) 23711 v.AuxInt = int64(int16(c)) 23712 return true 23713 } 23714 // match: (Trunc32to16 (ZeroExt8to32 x)) 23715 // cond: 23716 // result: (ZeroExt8to16 x) 23717 for { 23718 v_0 := v.Args[0] 23719 if v_0.Op != OpZeroExt8to32 { 23720 break 23721 } 23722 x := v_0.Args[0] 23723 v.reset(OpZeroExt8to16) 23724 v.AddArg(x) 23725 return true 23726 } 23727 // match: (Trunc32to16 (ZeroExt16to32 x)) 23728 // cond: 23729 // result: x 23730 for { 23731 v_0 := v.Args[0] 23732 if v_0.Op != OpZeroExt16to32 { 23733 break 23734 } 23735 x := v_0.Args[0] 23736 v.reset(OpCopy) 23737 v.Type = x.Type 23738 v.AddArg(x) 23739 return true 23740 } 23741 // match: (Trunc32to16 (SignExt8to32 x)) 23742 // cond: 23743 // result: (SignExt8to16 x) 23744 for { 23745 v_0 := v.Args[0] 23746 if v_0.Op != OpSignExt8to32 { 23747 break 23748 } 23749 x := v_0.Args[0] 23750 v.reset(OpSignExt8to16) 23751 v.AddArg(x) 23752 return true 23753 } 23754 // match: (Trunc32to16 (SignExt16to32 x)) 23755 // cond: 23756 // result: x 23757 for { 23758 v_0 := v.Args[0] 23759 if v_0.Op != OpSignExt16to32 { 23760 break 23761 } 23762 x := v_0.Args[0] 23763 v.reset(OpCopy) 23764 v.Type = x.Type 23765 v.AddArg(x) 23766 return true 23767 } 23768 // match: (Trunc32to16 (And32 (Const32 [y]) x)) 23769 // cond: y&0xFFFF == 0xFFFF 23770 // result: (Trunc32to16 x) 23771 for { 23772 v_0 := v.Args[0] 23773 if v_0.Op != OpAnd32 { 23774 break 23775 } 23776 _ = v_0.Args[1] 23777 v_0_0 := v_0.Args[0] 23778 if v_0_0.Op != OpConst32 { 23779 break 23780 } 23781 y := v_0_0.AuxInt 23782 x := v_0.Args[1] 23783 if !(y&0xFFFF == 0xFFFF) { 23784 break 23785 } 23786 v.reset(OpTrunc32to16) 23787 v.AddArg(x) 23788 return true 23789 } 23790 // match: (Trunc32to16 (And32 x (Const32 [y]))) 23791 // cond: y&0xFFFF == 0xFFFF 23792 // result: (Trunc32to16 x) 23793 for { 23794 v_0 := v.Args[0] 23795 if v_0.Op != OpAnd32 { 23796 break 23797 } 23798 _ = v_0.Args[1] 23799 x := v_0.Args[0] 23800 v_0_1 := v_0.Args[1] 23801 if v_0_1.Op != OpConst32 { 23802 break 23803 } 23804 y := v_0_1.AuxInt 23805 if !(y&0xFFFF == 0xFFFF) { 23806 break 23807 } 23808 v.reset(OpTrunc32to16) 23809 v.AddArg(x) 23810 return true 23811 } 23812 return false 23813 } 23814 func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { 23815 // match: (Trunc32to8 (Const32 [c])) 23816 // cond: 23817 // result: (Const8 [int64(int8(c))]) 23818 for { 23819 v_0 := v.Args[0] 23820 if v_0.Op != OpConst32 { 23821 break 23822 } 23823 c := v_0.AuxInt 23824 v.reset(OpConst8) 23825 v.AuxInt = int64(int8(c)) 23826 return true 23827 } 23828 // match: (Trunc32to8 (ZeroExt8to32 x)) 23829 // cond: 23830 // result: x 23831 for { 23832 v_0 := v.Args[0] 23833 if v_0.Op != OpZeroExt8to32 { 23834 break 23835 } 23836 x := v_0.Args[0] 23837 v.reset(OpCopy) 23838 v.Type = x.Type 23839 v.AddArg(x) 23840 return true 23841 } 23842 // match: (Trunc32to8 (SignExt8to32 x)) 23843 // cond: 23844 // result: x 23845 for { 23846 v_0 := v.Args[0] 23847 if v_0.Op != OpSignExt8to32 { 23848 break 23849 } 23850 x := v_0.Args[0] 23851 v.reset(OpCopy) 23852 v.Type = x.Type 23853 v.AddArg(x) 23854 return true 23855 } 23856 // match: (Trunc32to8 (And32 (Const32 [y]) x)) 23857 // cond: y&0xFF == 0xFF 23858 // result: (Trunc32to8 x) 23859 for { 23860 v_0 := v.Args[0] 23861 if v_0.Op != OpAnd32 { 23862 break 23863 } 23864 _ = v_0.Args[1] 23865 v_0_0 := v_0.Args[0] 23866 if v_0_0.Op != OpConst32 { 23867 break 23868 } 23869 y := v_0_0.AuxInt 23870 x := v_0.Args[1] 23871 if !(y&0xFF == 0xFF) { 23872 break 23873 } 23874 v.reset(OpTrunc32to8) 23875 v.AddArg(x) 23876 return true 23877 } 23878 // match: (Trunc32to8 (And32 x (Const32 [y]))) 23879 // cond: y&0xFF == 0xFF 23880 // result: (Trunc32to8 x) 23881 for { 23882 v_0 := v.Args[0] 23883 if v_0.Op != OpAnd32 { 23884 break 23885 } 23886 _ = v_0.Args[1] 23887 x := v_0.Args[0] 23888 v_0_1 := v_0.Args[1] 23889 if v_0_1.Op != OpConst32 { 23890 break 23891 } 23892 y := v_0_1.AuxInt 23893 if !(y&0xFF == 0xFF) { 23894 break 23895 } 23896 v.reset(OpTrunc32to8) 23897 v.AddArg(x) 23898 return true 23899 } 23900 return false 23901 } 23902 func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { 23903 // match: (Trunc64to16 (Const64 [c])) 23904 // cond: 23905 // result: (Const16 [int64(int16(c))]) 23906 for { 23907 v_0 := v.Args[0] 23908 if v_0.Op != OpConst64 { 23909 break 23910 } 23911 c := v_0.AuxInt 23912 v.reset(OpConst16) 23913 v.AuxInt = int64(int16(c)) 23914 return true 23915 } 23916 // match: (Trunc64to16 (ZeroExt8to64 x)) 23917 // cond: 23918 // result: (ZeroExt8to16 x) 23919 for { 23920 v_0 := v.Args[0] 23921 if v_0.Op != OpZeroExt8to64 { 23922 break 23923 } 23924 x := v_0.Args[0] 23925 v.reset(OpZeroExt8to16) 23926 v.AddArg(x) 23927 return true 23928 } 23929 // match: (Trunc64to16 (ZeroExt16to64 x)) 23930 // cond: 23931 // result: x 23932 for { 23933 v_0 := v.Args[0] 23934 if v_0.Op != OpZeroExt16to64 { 23935 break 23936 } 23937 x := v_0.Args[0] 23938 v.reset(OpCopy) 23939 v.Type = x.Type 23940 v.AddArg(x) 23941 return true 23942 } 23943 // match: (Trunc64to16 (SignExt8to64 x)) 23944 // cond: 23945 // result: (SignExt8to16 x) 23946 for { 23947 v_0 := v.Args[0] 23948 if v_0.Op != OpSignExt8to64 { 23949 break 23950 } 23951 x := v_0.Args[0] 23952 v.reset(OpSignExt8to16) 23953 v.AddArg(x) 23954 return true 23955 } 23956 // match: (Trunc64to16 (SignExt16to64 x)) 23957 // cond: 23958 // result: x 23959 for { 23960 v_0 := v.Args[0] 23961 if v_0.Op != OpSignExt16to64 { 23962 break 23963 } 23964 x := v_0.Args[0] 23965 v.reset(OpCopy) 23966 v.Type = x.Type 23967 v.AddArg(x) 23968 return true 23969 } 23970 // match: (Trunc64to16 (And64 (Const64 [y]) x)) 23971 // cond: y&0xFFFF == 0xFFFF 23972 // result: (Trunc64to16 x) 23973 for { 23974 v_0 := v.Args[0] 23975 if v_0.Op != OpAnd64 { 23976 break 23977 } 23978 _ = v_0.Args[1] 23979 v_0_0 := v_0.Args[0] 23980 if v_0_0.Op != OpConst64 { 23981 break 23982 } 23983 y := v_0_0.AuxInt 23984 x := v_0.Args[1] 23985 if !(y&0xFFFF == 0xFFFF) { 23986 break 23987 } 23988 v.reset(OpTrunc64to16) 23989 v.AddArg(x) 23990 return true 23991 } 23992 // match: (Trunc64to16 (And64 x (Const64 [y]))) 23993 // cond: y&0xFFFF == 0xFFFF 23994 // result: (Trunc64to16 x) 23995 for { 23996 v_0 := v.Args[0] 23997 if v_0.Op != OpAnd64 { 23998 break 23999 } 24000 _ = v_0.Args[1] 24001 x := v_0.Args[0] 24002 v_0_1 := v_0.Args[1] 24003 if v_0_1.Op != OpConst64 { 24004 break 24005 } 24006 y := v_0_1.AuxInt 24007 if !(y&0xFFFF == 0xFFFF) { 24008 break 24009 } 24010 v.reset(OpTrunc64to16) 24011 v.AddArg(x) 24012 return true 24013 } 24014 return false 24015 } 24016 func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { 24017 // match: (Trunc64to32 (Const64 [c])) 24018 // cond: 24019 // result: (Const32 [int64(int32(c))]) 24020 for { 24021 v_0 := v.Args[0] 24022 if v_0.Op != OpConst64 { 24023 break 24024 } 24025 c := v_0.AuxInt 24026 v.reset(OpConst32) 24027 v.AuxInt = int64(int32(c)) 24028 return true 24029 } 24030 // match: (Trunc64to32 (ZeroExt8to64 x)) 24031 // cond: 24032 // result: (ZeroExt8to32 x) 24033 for { 24034 v_0 := v.Args[0] 24035 if v_0.Op != OpZeroExt8to64 { 24036 break 24037 } 24038 x := v_0.Args[0] 24039 v.reset(OpZeroExt8to32) 24040 v.AddArg(x) 24041 return true 24042 } 24043 // match: (Trunc64to32 (ZeroExt16to64 x)) 24044 // cond: 24045 // result: (ZeroExt16to32 x) 24046 for { 24047 v_0 := v.Args[0] 24048 if v_0.Op != OpZeroExt16to64 { 24049 break 24050 } 24051 x := v_0.Args[0] 24052 v.reset(OpZeroExt16to32) 24053 v.AddArg(x) 24054 return true 24055 } 24056 // match: (Trunc64to32 (ZeroExt32to64 x)) 24057 // cond: 24058 // result: x 24059 for { 24060 v_0 := v.Args[0] 24061 if v_0.Op != OpZeroExt32to64 { 24062 break 24063 } 24064 x := v_0.Args[0] 24065 v.reset(OpCopy) 24066 v.Type = x.Type 24067 v.AddArg(x) 24068 return true 24069 } 24070 // match: (Trunc64to32 (SignExt8to64 x)) 24071 // cond: 24072 // result: (SignExt8to32 x) 24073 for { 24074 v_0 := v.Args[0] 24075 if v_0.Op != OpSignExt8to64 { 24076 break 24077 } 24078 x := v_0.Args[0] 24079 v.reset(OpSignExt8to32) 24080 v.AddArg(x) 24081 return true 24082 } 24083 // match: (Trunc64to32 (SignExt16to64 x)) 24084 // cond: 24085 // result: (SignExt16to32 x) 24086 for { 24087 v_0 := v.Args[0] 24088 if v_0.Op != OpSignExt16to64 { 24089 break 24090 } 24091 x := v_0.Args[0] 24092 v.reset(OpSignExt16to32) 24093 v.AddArg(x) 24094 return true 24095 } 24096 // match: (Trunc64to32 (SignExt32to64 x)) 24097 // cond: 24098 // result: x 24099 for { 24100 v_0 := v.Args[0] 24101 if v_0.Op != OpSignExt32to64 { 24102 break 24103 } 24104 x := v_0.Args[0] 24105 v.reset(OpCopy) 24106 v.Type = x.Type 24107 v.AddArg(x) 24108 return true 24109 } 24110 // match: (Trunc64to32 (And64 (Const64 [y]) x)) 24111 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 24112 // result: (Trunc64to32 x) 24113 for { 24114 v_0 := v.Args[0] 24115 if v_0.Op != OpAnd64 { 24116 break 24117 } 24118 _ = v_0.Args[1] 24119 v_0_0 := v_0.Args[0] 24120 if v_0_0.Op != OpConst64 { 24121 break 24122 } 24123 y := v_0_0.AuxInt 24124 x := v_0.Args[1] 24125 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 24126 break 24127 } 24128 v.reset(OpTrunc64to32) 24129 v.AddArg(x) 24130 return true 24131 } 24132 // match: (Trunc64to32 (And64 x (Const64 [y]))) 24133 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 24134 // result: (Trunc64to32 x) 24135 for { 24136 v_0 := v.Args[0] 24137 if v_0.Op != OpAnd64 { 24138 break 24139 } 24140 _ = v_0.Args[1] 24141 x := v_0.Args[0] 24142 v_0_1 := v_0.Args[1] 24143 if v_0_1.Op != OpConst64 { 24144 break 24145 } 24146 y := v_0_1.AuxInt 24147 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 24148 break 24149 } 24150 v.reset(OpTrunc64to32) 24151 v.AddArg(x) 24152 return true 24153 } 24154 return false 24155 } 24156 func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { 24157 // match: (Trunc64to8 (Const64 [c])) 24158 // cond: 24159 // result: (Const8 [int64(int8(c))]) 24160 for { 24161 v_0 := v.Args[0] 24162 if v_0.Op != OpConst64 { 24163 break 24164 } 24165 c := v_0.AuxInt 24166 v.reset(OpConst8) 24167 v.AuxInt = int64(int8(c)) 24168 return true 24169 } 24170 // match: (Trunc64to8 (ZeroExt8to64 x)) 24171 // cond: 24172 // result: x 24173 for { 24174 v_0 := v.Args[0] 24175 if v_0.Op != OpZeroExt8to64 { 24176 break 24177 } 24178 x := v_0.Args[0] 24179 v.reset(OpCopy) 24180 v.Type = x.Type 24181 v.AddArg(x) 24182 return true 24183 } 24184 // match: (Trunc64to8 (SignExt8to64 x)) 24185 // cond: 24186 // result: x 24187 for { 24188 v_0 := v.Args[0] 24189 if v_0.Op != OpSignExt8to64 { 24190 break 24191 } 24192 x := v_0.Args[0] 24193 v.reset(OpCopy) 24194 v.Type = x.Type 24195 v.AddArg(x) 24196 return true 24197 } 24198 // match: (Trunc64to8 (And64 (Const64 [y]) x)) 24199 // cond: y&0xFF == 0xFF 24200 // result: (Trunc64to8 x) 24201 for { 24202 v_0 := v.Args[0] 24203 if v_0.Op != OpAnd64 { 24204 break 24205 } 24206 _ = v_0.Args[1] 24207 v_0_0 := v_0.Args[0] 24208 if v_0_0.Op != OpConst64 { 24209 break 24210 } 24211 y := v_0_0.AuxInt 24212 x := v_0.Args[1] 24213 if !(y&0xFF == 0xFF) { 24214 break 24215 } 24216 v.reset(OpTrunc64to8) 24217 v.AddArg(x) 24218 return true 24219 } 24220 // match: (Trunc64to8 (And64 x (Const64 [y]))) 24221 // cond: y&0xFF == 0xFF 24222 // result: (Trunc64to8 x) 24223 for { 24224 v_0 := v.Args[0] 24225 if v_0.Op != OpAnd64 { 24226 break 24227 } 24228 _ = v_0.Args[1] 24229 x := v_0.Args[0] 24230 v_0_1 := v_0.Args[1] 24231 if v_0_1.Op != OpConst64 { 24232 break 24233 } 24234 y := v_0_1.AuxInt 24235 if !(y&0xFF == 0xFF) { 24236 break 24237 } 24238 v.reset(OpTrunc64to8) 24239 v.AddArg(x) 24240 return true 24241 } 24242 return false 24243 } 24244 func rewriteValuegeneric_OpXor16_0(v *Value) bool { 24245 b := v.Block 24246 _ = b 24247 // match: (Xor16 (Const16 [c]) (Const16 [d])) 24248 // cond: 24249 // result: (Const16 [int64(int16(c^d))]) 24250 for { 24251 _ = v.Args[1] 24252 v_0 := v.Args[0] 24253 if v_0.Op != OpConst16 { 24254 break 24255 } 24256 c := v_0.AuxInt 24257 v_1 := v.Args[1] 24258 if v_1.Op != OpConst16 { 24259 break 24260 } 24261 d := v_1.AuxInt 24262 v.reset(OpConst16) 24263 v.AuxInt = int64(int16(c ^ d)) 24264 return true 24265 } 24266 // match: (Xor16 (Const16 [d]) (Const16 [c])) 24267 // cond: 24268 // result: (Const16 [int64(int16(c^d))]) 24269 for { 24270 _ = v.Args[1] 24271 v_0 := v.Args[0] 24272 if v_0.Op != OpConst16 { 24273 break 24274 } 24275 d := v_0.AuxInt 24276 v_1 := v.Args[1] 24277 if v_1.Op != OpConst16 { 24278 break 24279 } 24280 c := v_1.AuxInt 24281 v.reset(OpConst16) 24282 v.AuxInt = int64(int16(c ^ d)) 24283 return true 24284 } 24285 // match: (Xor16 x x) 24286 // cond: 24287 // result: (Const16 [0]) 24288 for { 24289 _ = v.Args[1] 24290 x := v.Args[0] 24291 if x != v.Args[1] { 24292 break 24293 } 24294 v.reset(OpConst16) 24295 v.AuxInt = 0 24296 return true 24297 } 24298 // match: (Xor16 (Const16 [0]) x) 24299 // cond: 24300 // result: x 24301 for { 24302 _ = v.Args[1] 24303 v_0 := v.Args[0] 24304 if v_0.Op != OpConst16 { 24305 break 24306 } 24307 if v_0.AuxInt != 0 { 24308 break 24309 } 24310 x := v.Args[1] 24311 v.reset(OpCopy) 24312 v.Type = x.Type 24313 v.AddArg(x) 24314 return true 24315 } 24316 // match: (Xor16 x (Const16 [0])) 24317 // cond: 24318 // result: x 24319 for { 24320 _ = v.Args[1] 24321 x := v.Args[0] 24322 v_1 := v.Args[1] 24323 if v_1.Op != OpConst16 { 24324 break 24325 } 24326 if v_1.AuxInt != 0 { 24327 break 24328 } 24329 v.reset(OpCopy) 24330 v.Type = x.Type 24331 v.AddArg(x) 24332 return true 24333 } 24334 // match: (Xor16 x (Xor16 x y)) 24335 // cond: 24336 // result: y 24337 for { 24338 _ = v.Args[1] 24339 x := v.Args[0] 24340 v_1 := v.Args[1] 24341 if v_1.Op != OpXor16 { 24342 break 24343 } 24344 _ = v_1.Args[1] 24345 if x != v_1.Args[0] { 24346 break 24347 } 24348 y := v_1.Args[1] 24349 v.reset(OpCopy) 24350 v.Type = y.Type 24351 v.AddArg(y) 24352 return true 24353 } 24354 // match: (Xor16 x (Xor16 y x)) 24355 // cond: 24356 // result: y 24357 for { 24358 _ = v.Args[1] 24359 x := v.Args[0] 24360 v_1 := v.Args[1] 24361 if v_1.Op != OpXor16 { 24362 break 24363 } 24364 _ = v_1.Args[1] 24365 y := v_1.Args[0] 24366 if x != v_1.Args[1] { 24367 break 24368 } 24369 v.reset(OpCopy) 24370 v.Type = y.Type 24371 v.AddArg(y) 24372 return true 24373 } 24374 // match: (Xor16 (Xor16 x y) x) 24375 // cond: 24376 // result: y 24377 for { 24378 _ = v.Args[1] 24379 v_0 := v.Args[0] 24380 if v_0.Op != OpXor16 { 24381 break 24382 } 24383 _ = v_0.Args[1] 24384 x := v_0.Args[0] 24385 y := v_0.Args[1] 24386 if x != v.Args[1] { 24387 break 24388 } 24389 v.reset(OpCopy) 24390 v.Type = y.Type 24391 v.AddArg(y) 24392 return true 24393 } 24394 // match: (Xor16 (Xor16 y x) x) 24395 // cond: 24396 // result: y 24397 for { 24398 _ = v.Args[1] 24399 v_0 := v.Args[0] 24400 if v_0.Op != OpXor16 { 24401 break 24402 } 24403 _ = v_0.Args[1] 24404 y := v_0.Args[0] 24405 x := v_0.Args[1] 24406 if x != v.Args[1] { 24407 break 24408 } 24409 v.reset(OpCopy) 24410 v.Type = y.Type 24411 v.AddArg(y) 24412 return true 24413 } 24414 // match: (Xor16 (Xor16 i:(Const16 <t>) z) x) 24415 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24416 // result: (Xor16 i (Xor16 <t> z x)) 24417 for { 24418 _ = v.Args[1] 24419 v_0 := v.Args[0] 24420 if v_0.Op != OpXor16 { 24421 break 24422 } 24423 _ = v_0.Args[1] 24424 i := v_0.Args[0] 24425 if i.Op != OpConst16 { 24426 break 24427 } 24428 t := i.Type 24429 z := v_0.Args[1] 24430 x := v.Args[1] 24431 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24432 break 24433 } 24434 v.reset(OpXor16) 24435 v.AddArg(i) 24436 v0 := b.NewValue0(v.Pos, OpXor16, t) 24437 v0.AddArg(z) 24438 v0.AddArg(x) 24439 v.AddArg(v0) 24440 return true 24441 } 24442 return false 24443 } 24444 func rewriteValuegeneric_OpXor16_10(v *Value) bool { 24445 b := v.Block 24446 _ = b 24447 // match: (Xor16 (Xor16 z i:(Const16 <t>)) x) 24448 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24449 // result: (Xor16 i (Xor16 <t> z x)) 24450 for { 24451 _ = v.Args[1] 24452 v_0 := v.Args[0] 24453 if v_0.Op != OpXor16 { 24454 break 24455 } 24456 _ = v_0.Args[1] 24457 z := v_0.Args[0] 24458 i := v_0.Args[1] 24459 if i.Op != OpConst16 { 24460 break 24461 } 24462 t := i.Type 24463 x := v.Args[1] 24464 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24465 break 24466 } 24467 v.reset(OpXor16) 24468 v.AddArg(i) 24469 v0 := b.NewValue0(v.Pos, OpXor16, t) 24470 v0.AddArg(z) 24471 v0.AddArg(x) 24472 v.AddArg(v0) 24473 return true 24474 } 24475 // match: (Xor16 x (Xor16 i:(Const16 <t>) z)) 24476 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24477 // result: (Xor16 i (Xor16 <t> z x)) 24478 for { 24479 _ = v.Args[1] 24480 x := v.Args[0] 24481 v_1 := v.Args[1] 24482 if v_1.Op != OpXor16 { 24483 break 24484 } 24485 _ = v_1.Args[1] 24486 i := v_1.Args[0] 24487 if i.Op != OpConst16 { 24488 break 24489 } 24490 t := i.Type 24491 z := v_1.Args[1] 24492 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24493 break 24494 } 24495 v.reset(OpXor16) 24496 v.AddArg(i) 24497 v0 := b.NewValue0(v.Pos, OpXor16, t) 24498 v0.AddArg(z) 24499 v0.AddArg(x) 24500 v.AddArg(v0) 24501 return true 24502 } 24503 // match: (Xor16 x (Xor16 z i:(Const16 <t>))) 24504 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24505 // result: (Xor16 i (Xor16 <t> z x)) 24506 for { 24507 _ = v.Args[1] 24508 x := v.Args[0] 24509 v_1 := v.Args[1] 24510 if v_1.Op != OpXor16 { 24511 break 24512 } 24513 _ = v_1.Args[1] 24514 z := v_1.Args[0] 24515 i := v_1.Args[1] 24516 if i.Op != OpConst16 { 24517 break 24518 } 24519 t := i.Type 24520 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24521 break 24522 } 24523 v.reset(OpXor16) 24524 v.AddArg(i) 24525 v0 := b.NewValue0(v.Pos, OpXor16, t) 24526 v0.AddArg(z) 24527 v0.AddArg(x) 24528 v.AddArg(v0) 24529 return true 24530 } 24531 // match: (Xor16 (Const16 <t> [c]) (Xor16 (Const16 <t> [d]) x)) 24532 // cond: 24533 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 24534 for { 24535 _ = v.Args[1] 24536 v_0 := v.Args[0] 24537 if v_0.Op != OpConst16 { 24538 break 24539 } 24540 t := v_0.Type 24541 c := v_0.AuxInt 24542 v_1 := v.Args[1] 24543 if v_1.Op != OpXor16 { 24544 break 24545 } 24546 _ = v_1.Args[1] 24547 v_1_0 := v_1.Args[0] 24548 if v_1_0.Op != OpConst16 { 24549 break 24550 } 24551 if v_1_0.Type != t { 24552 break 24553 } 24554 d := v_1_0.AuxInt 24555 x := v_1.Args[1] 24556 v.reset(OpXor16) 24557 v0 := b.NewValue0(v.Pos, OpConst16, t) 24558 v0.AuxInt = int64(int16(c ^ d)) 24559 v.AddArg(v0) 24560 v.AddArg(x) 24561 return true 24562 } 24563 // match: (Xor16 (Const16 <t> [c]) (Xor16 x (Const16 <t> [d]))) 24564 // cond: 24565 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 24566 for { 24567 _ = v.Args[1] 24568 v_0 := v.Args[0] 24569 if v_0.Op != OpConst16 { 24570 break 24571 } 24572 t := v_0.Type 24573 c := v_0.AuxInt 24574 v_1 := v.Args[1] 24575 if v_1.Op != OpXor16 { 24576 break 24577 } 24578 _ = v_1.Args[1] 24579 x := v_1.Args[0] 24580 v_1_1 := v_1.Args[1] 24581 if v_1_1.Op != OpConst16 { 24582 break 24583 } 24584 if v_1_1.Type != t { 24585 break 24586 } 24587 d := v_1_1.AuxInt 24588 v.reset(OpXor16) 24589 v0 := b.NewValue0(v.Pos, OpConst16, t) 24590 v0.AuxInt = int64(int16(c ^ d)) 24591 v.AddArg(v0) 24592 v.AddArg(x) 24593 return true 24594 } 24595 // match: (Xor16 (Xor16 (Const16 <t> [d]) x) (Const16 <t> [c])) 24596 // cond: 24597 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 24598 for { 24599 _ = v.Args[1] 24600 v_0 := v.Args[0] 24601 if v_0.Op != OpXor16 { 24602 break 24603 } 24604 _ = v_0.Args[1] 24605 v_0_0 := v_0.Args[0] 24606 if v_0_0.Op != OpConst16 { 24607 break 24608 } 24609 t := v_0_0.Type 24610 d := v_0_0.AuxInt 24611 x := v_0.Args[1] 24612 v_1 := v.Args[1] 24613 if v_1.Op != OpConst16 { 24614 break 24615 } 24616 if v_1.Type != t { 24617 break 24618 } 24619 c := v_1.AuxInt 24620 v.reset(OpXor16) 24621 v0 := b.NewValue0(v.Pos, OpConst16, t) 24622 v0.AuxInt = int64(int16(c ^ d)) 24623 v.AddArg(v0) 24624 v.AddArg(x) 24625 return true 24626 } 24627 // match: (Xor16 (Xor16 x (Const16 <t> [d])) (Const16 <t> [c])) 24628 // cond: 24629 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 24630 for { 24631 _ = v.Args[1] 24632 v_0 := v.Args[0] 24633 if v_0.Op != OpXor16 { 24634 break 24635 } 24636 _ = v_0.Args[1] 24637 x := v_0.Args[0] 24638 v_0_1 := v_0.Args[1] 24639 if v_0_1.Op != OpConst16 { 24640 break 24641 } 24642 t := v_0_1.Type 24643 d := v_0_1.AuxInt 24644 v_1 := v.Args[1] 24645 if v_1.Op != OpConst16 { 24646 break 24647 } 24648 if v_1.Type != t { 24649 break 24650 } 24651 c := v_1.AuxInt 24652 v.reset(OpXor16) 24653 v0 := b.NewValue0(v.Pos, OpConst16, t) 24654 v0.AuxInt = int64(int16(c ^ d)) 24655 v.AddArg(v0) 24656 v.AddArg(x) 24657 return true 24658 } 24659 return false 24660 } 24661 func rewriteValuegeneric_OpXor32_0(v *Value) bool { 24662 b := v.Block 24663 _ = b 24664 // match: (Xor32 (Const32 [c]) (Const32 [d])) 24665 // cond: 24666 // result: (Const32 [int64(int32(c^d))]) 24667 for { 24668 _ = v.Args[1] 24669 v_0 := v.Args[0] 24670 if v_0.Op != OpConst32 { 24671 break 24672 } 24673 c := v_0.AuxInt 24674 v_1 := v.Args[1] 24675 if v_1.Op != OpConst32 { 24676 break 24677 } 24678 d := v_1.AuxInt 24679 v.reset(OpConst32) 24680 v.AuxInt = int64(int32(c ^ d)) 24681 return true 24682 } 24683 // match: (Xor32 (Const32 [d]) (Const32 [c])) 24684 // cond: 24685 // result: (Const32 [int64(int32(c^d))]) 24686 for { 24687 _ = v.Args[1] 24688 v_0 := v.Args[0] 24689 if v_0.Op != OpConst32 { 24690 break 24691 } 24692 d := v_0.AuxInt 24693 v_1 := v.Args[1] 24694 if v_1.Op != OpConst32 { 24695 break 24696 } 24697 c := v_1.AuxInt 24698 v.reset(OpConst32) 24699 v.AuxInt = int64(int32(c ^ d)) 24700 return true 24701 } 24702 // match: (Xor32 x x) 24703 // cond: 24704 // result: (Const32 [0]) 24705 for { 24706 _ = v.Args[1] 24707 x := v.Args[0] 24708 if x != v.Args[1] { 24709 break 24710 } 24711 v.reset(OpConst32) 24712 v.AuxInt = 0 24713 return true 24714 } 24715 // match: (Xor32 (Const32 [0]) x) 24716 // cond: 24717 // result: x 24718 for { 24719 _ = v.Args[1] 24720 v_0 := v.Args[0] 24721 if v_0.Op != OpConst32 { 24722 break 24723 } 24724 if v_0.AuxInt != 0 { 24725 break 24726 } 24727 x := v.Args[1] 24728 v.reset(OpCopy) 24729 v.Type = x.Type 24730 v.AddArg(x) 24731 return true 24732 } 24733 // match: (Xor32 x (Const32 [0])) 24734 // cond: 24735 // result: x 24736 for { 24737 _ = v.Args[1] 24738 x := v.Args[0] 24739 v_1 := v.Args[1] 24740 if v_1.Op != OpConst32 { 24741 break 24742 } 24743 if v_1.AuxInt != 0 { 24744 break 24745 } 24746 v.reset(OpCopy) 24747 v.Type = x.Type 24748 v.AddArg(x) 24749 return true 24750 } 24751 // match: (Xor32 x (Xor32 x y)) 24752 // cond: 24753 // result: y 24754 for { 24755 _ = v.Args[1] 24756 x := v.Args[0] 24757 v_1 := v.Args[1] 24758 if v_1.Op != OpXor32 { 24759 break 24760 } 24761 _ = v_1.Args[1] 24762 if x != v_1.Args[0] { 24763 break 24764 } 24765 y := v_1.Args[1] 24766 v.reset(OpCopy) 24767 v.Type = y.Type 24768 v.AddArg(y) 24769 return true 24770 } 24771 // match: (Xor32 x (Xor32 y x)) 24772 // cond: 24773 // result: y 24774 for { 24775 _ = v.Args[1] 24776 x := v.Args[0] 24777 v_1 := v.Args[1] 24778 if v_1.Op != OpXor32 { 24779 break 24780 } 24781 _ = v_1.Args[1] 24782 y := v_1.Args[0] 24783 if x != v_1.Args[1] { 24784 break 24785 } 24786 v.reset(OpCopy) 24787 v.Type = y.Type 24788 v.AddArg(y) 24789 return true 24790 } 24791 // match: (Xor32 (Xor32 x y) x) 24792 // cond: 24793 // result: y 24794 for { 24795 _ = v.Args[1] 24796 v_0 := v.Args[0] 24797 if v_0.Op != OpXor32 { 24798 break 24799 } 24800 _ = v_0.Args[1] 24801 x := v_0.Args[0] 24802 y := v_0.Args[1] 24803 if x != v.Args[1] { 24804 break 24805 } 24806 v.reset(OpCopy) 24807 v.Type = y.Type 24808 v.AddArg(y) 24809 return true 24810 } 24811 // match: (Xor32 (Xor32 y x) x) 24812 // cond: 24813 // result: y 24814 for { 24815 _ = v.Args[1] 24816 v_0 := v.Args[0] 24817 if v_0.Op != OpXor32 { 24818 break 24819 } 24820 _ = v_0.Args[1] 24821 y := v_0.Args[0] 24822 x := v_0.Args[1] 24823 if x != v.Args[1] { 24824 break 24825 } 24826 v.reset(OpCopy) 24827 v.Type = y.Type 24828 v.AddArg(y) 24829 return true 24830 } 24831 // match: (Xor32 (Xor32 i:(Const32 <t>) z) x) 24832 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24833 // result: (Xor32 i (Xor32 <t> z x)) 24834 for { 24835 _ = v.Args[1] 24836 v_0 := v.Args[0] 24837 if v_0.Op != OpXor32 { 24838 break 24839 } 24840 _ = v_0.Args[1] 24841 i := v_0.Args[0] 24842 if i.Op != OpConst32 { 24843 break 24844 } 24845 t := i.Type 24846 z := v_0.Args[1] 24847 x := v.Args[1] 24848 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24849 break 24850 } 24851 v.reset(OpXor32) 24852 v.AddArg(i) 24853 v0 := b.NewValue0(v.Pos, OpXor32, t) 24854 v0.AddArg(z) 24855 v0.AddArg(x) 24856 v.AddArg(v0) 24857 return true 24858 } 24859 return false 24860 } 24861 func rewriteValuegeneric_OpXor32_10(v *Value) bool { 24862 b := v.Block 24863 _ = b 24864 // match: (Xor32 (Xor32 z i:(Const32 <t>)) x) 24865 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24866 // result: (Xor32 i (Xor32 <t> z x)) 24867 for { 24868 _ = v.Args[1] 24869 v_0 := v.Args[0] 24870 if v_0.Op != OpXor32 { 24871 break 24872 } 24873 _ = v_0.Args[1] 24874 z := v_0.Args[0] 24875 i := v_0.Args[1] 24876 if i.Op != OpConst32 { 24877 break 24878 } 24879 t := i.Type 24880 x := v.Args[1] 24881 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24882 break 24883 } 24884 v.reset(OpXor32) 24885 v.AddArg(i) 24886 v0 := b.NewValue0(v.Pos, OpXor32, t) 24887 v0.AddArg(z) 24888 v0.AddArg(x) 24889 v.AddArg(v0) 24890 return true 24891 } 24892 // match: (Xor32 x (Xor32 i:(Const32 <t>) z)) 24893 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24894 // result: (Xor32 i (Xor32 <t> z x)) 24895 for { 24896 _ = v.Args[1] 24897 x := v.Args[0] 24898 v_1 := v.Args[1] 24899 if v_1.Op != OpXor32 { 24900 break 24901 } 24902 _ = v_1.Args[1] 24903 i := v_1.Args[0] 24904 if i.Op != OpConst32 { 24905 break 24906 } 24907 t := i.Type 24908 z := v_1.Args[1] 24909 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24910 break 24911 } 24912 v.reset(OpXor32) 24913 v.AddArg(i) 24914 v0 := b.NewValue0(v.Pos, OpXor32, t) 24915 v0.AddArg(z) 24916 v0.AddArg(x) 24917 v.AddArg(v0) 24918 return true 24919 } 24920 // match: (Xor32 x (Xor32 z i:(Const32 <t>))) 24921 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24922 // result: (Xor32 i (Xor32 <t> z x)) 24923 for { 24924 _ = v.Args[1] 24925 x := v.Args[0] 24926 v_1 := v.Args[1] 24927 if v_1.Op != OpXor32 { 24928 break 24929 } 24930 _ = v_1.Args[1] 24931 z := v_1.Args[0] 24932 i := v_1.Args[1] 24933 if i.Op != OpConst32 { 24934 break 24935 } 24936 t := i.Type 24937 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24938 break 24939 } 24940 v.reset(OpXor32) 24941 v.AddArg(i) 24942 v0 := b.NewValue0(v.Pos, OpXor32, t) 24943 v0.AddArg(z) 24944 v0.AddArg(x) 24945 v.AddArg(v0) 24946 return true 24947 } 24948 // match: (Xor32 (Const32 <t> [c]) (Xor32 (Const32 <t> [d]) x)) 24949 // cond: 24950 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 24951 for { 24952 _ = v.Args[1] 24953 v_0 := v.Args[0] 24954 if v_0.Op != OpConst32 { 24955 break 24956 } 24957 t := v_0.Type 24958 c := v_0.AuxInt 24959 v_1 := v.Args[1] 24960 if v_1.Op != OpXor32 { 24961 break 24962 } 24963 _ = v_1.Args[1] 24964 v_1_0 := v_1.Args[0] 24965 if v_1_0.Op != OpConst32 { 24966 break 24967 } 24968 if v_1_0.Type != t { 24969 break 24970 } 24971 d := v_1_0.AuxInt 24972 x := v_1.Args[1] 24973 v.reset(OpXor32) 24974 v0 := b.NewValue0(v.Pos, OpConst32, t) 24975 v0.AuxInt = int64(int32(c ^ d)) 24976 v.AddArg(v0) 24977 v.AddArg(x) 24978 return true 24979 } 24980 // match: (Xor32 (Const32 <t> [c]) (Xor32 x (Const32 <t> [d]))) 24981 // cond: 24982 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 24983 for { 24984 _ = v.Args[1] 24985 v_0 := v.Args[0] 24986 if v_0.Op != OpConst32 { 24987 break 24988 } 24989 t := v_0.Type 24990 c := v_0.AuxInt 24991 v_1 := v.Args[1] 24992 if v_1.Op != OpXor32 { 24993 break 24994 } 24995 _ = v_1.Args[1] 24996 x := v_1.Args[0] 24997 v_1_1 := v_1.Args[1] 24998 if v_1_1.Op != OpConst32 { 24999 break 25000 } 25001 if v_1_1.Type != t { 25002 break 25003 } 25004 d := v_1_1.AuxInt 25005 v.reset(OpXor32) 25006 v0 := b.NewValue0(v.Pos, OpConst32, t) 25007 v0.AuxInt = int64(int32(c ^ d)) 25008 v.AddArg(v0) 25009 v.AddArg(x) 25010 return true 25011 } 25012 // match: (Xor32 (Xor32 (Const32 <t> [d]) x) (Const32 <t> [c])) 25013 // cond: 25014 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 25015 for { 25016 _ = v.Args[1] 25017 v_0 := v.Args[0] 25018 if v_0.Op != OpXor32 { 25019 break 25020 } 25021 _ = v_0.Args[1] 25022 v_0_0 := v_0.Args[0] 25023 if v_0_0.Op != OpConst32 { 25024 break 25025 } 25026 t := v_0_0.Type 25027 d := v_0_0.AuxInt 25028 x := v_0.Args[1] 25029 v_1 := v.Args[1] 25030 if v_1.Op != OpConst32 { 25031 break 25032 } 25033 if v_1.Type != t { 25034 break 25035 } 25036 c := v_1.AuxInt 25037 v.reset(OpXor32) 25038 v0 := b.NewValue0(v.Pos, OpConst32, t) 25039 v0.AuxInt = int64(int32(c ^ d)) 25040 v.AddArg(v0) 25041 v.AddArg(x) 25042 return true 25043 } 25044 // match: (Xor32 (Xor32 x (Const32 <t> [d])) (Const32 <t> [c])) 25045 // cond: 25046 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 25047 for { 25048 _ = v.Args[1] 25049 v_0 := v.Args[0] 25050 if v_0.Op != OpXor32 { 25051 break 25052 } 25053 _ = v_0.Args[1] 25054 x := v_0.Args[0] 25055 v_0_1 := v_0.Args[1] 25056 if v_0_1.Op != OpConst32 { 25057 break 25058 } 25059 t := v_0_1.Type 25060 d := v_0_1.AuxInt 25061 v_1 := v.Args[1] 25062 if v_1.Op != OpConst32 { 25063 break 25064 } 25065 if v_1.Type != t { 25066 break 25067 } 25068 c := v_1.AuxInt 25069 v.reset(OpXor32) 25070 v0 := b.NewValue0(v.Pos, OpConst32, t) 25071 v0.AuxInt = int64(int32(c ^ d)) 25072 v.AddArg(v0) 25073 v.AddArg(x) 25074 return true 25075 } 25076 return false 25077 } 25078 func rewriteValuegeneric_OpXor64_0(v *Value) bool { 25079 b := v.Block 25080 _ = b 25081 // match: (Xor64 (Const64 [c]) (Const64 [d])) 25082 // cond: 25083 // result: (Const64 [c^d]) 25084 for { 25085 _ = v.Args[1] 25086 v_0 := v.Args[0] 25087 if v_0.Op != OpConst64 { 25088 break 25089 } 25090 c := v_0.AuxInt 25091 v_1 := v.Args[1] 25092 if v_1.Op != OpConst64 { 25093 break 25094 } 25095 d := v_1.AuxInt 25096 v.reset(OpConst64) 25097 v.AuxInt = c ^ d 25098 return true 25099 } 25100 // match: (Xor64 (Const64 [d]) (Const64 [c])) 25101 // cond: 25102 // result: (Const64 [c^d]) 25103 for { 25104 _ = v.Args[1] 25105 v_0 := v.Args[0] 25106 if v_0.Op != OpConst64 { 25107 break 25108 } 25109 d := v_0.AuxInt 25110 v_1 := v.Args[1] 25111 if v_1.Op != OpConst64 { 25112 break 25113 } 25114 c := v_1.AuxInt 25115 v.reset(OpConst64) 25116 v.AuxInt = c ^ d 25117 return true 25118 } 25119 // match: (Xor64 x x) 25120 // cond: 25121 // result: (Const64 [0]) 25122 for { 25123 _ = v.Args[1] 25124 x := v.Args[0] 25125 if x != v.Args[1] { 25126 break 25127 } 25128 v.reset(OpConst64) 25129 v.AuxInt = 0 25130 return true 25131 } 25132 // match: (Xor64 (Const64 [0]) x) 25133 // cond: 25134 // result: x 25135 for { 25136 _ = v.Args[1] 25137 v_0 := v.Args[0] 25138 if v_0.Op != OpConst64 { 25139 break 25140 } 25141 if v_0.AuxInt != 0 { 25142 break 25143 } 25144 x := v.Args[1] 25145 v.reset(OpCopy) 25146 v.Type = x.Type 25147 v.AddArg(x) 25148 return true 25149 } 25150 // match: (Xor64 x (Const64 [0])) 25151 // cond: 25152 // result: x 25153 for { 25154 _ = v.Args[1] 25155 x := v.Args[0] 25156 v_1 := v.Args[1] 25157 if v_1.Op != OpConst64 { 25158 break 25159 } 25160 if v_1.AuxInt != 0 { 25161 break 25162 } 25163 v.reset(OpCopy) 25164 v.Type = x.Type 25165 v.AddArg(x) 25166 return true 25167 } 25168 // match: (Xor64 x (Xor64 x y)) 25169 // cond: 25170 // result: y 25171 for { 25172 _ = v.Args[1] 25173 x := v.Args[0] 25174 v_1 := v.Args[1] 25175 if v_1.Op != OpXor64 { 25176 break 25177 } 25178 _ = v_1.Args[1] 25179 if x != v_1.Args[0] { 25180 break 25181 } 25182 y := v_1.Args[1] 25183 v.reset(OpCopy) 25184 v.Type = y.Type 25185 v.AddArg(y) 25186 return true 25187 } 25188 // match: (Xor64 x (Xor64 y x)) 25189 // cond: 25190 // result: y 25191 for { 25192 _ = v.Args[1] 25193 x := v.Args[0] 25194 v_1 := v.Args[1] 25195 if v_1.Op != OpXor64 { 25196 break 25197 } 25198 _ = v_1.Args[1] 25199 y := v_1.Args[0] 25200 if x != v_1.Args[1] { 25201 break 25202 } 25203 v.reset(OpCopy) 25204 v.Type = y.Type 25205 v.AddArg(y) 25206 return true 25207 } 25208 // match: (Xor64 (Xor64 x y) x) 25209 // cond: 25210 // result: y 25211 for { 25212 _ = v.Args[1] 25213 v_0 := v.Args[0] 25214 if v_0.Op != OpXor64 { 25215 break 25216 } 25217 _ = v_0.Args[1] 25218 x := v_0.Args[0] 25219 y := v_0.Args[1] 25220 if x != v.Args[1] { 25221 break 25222 } 25223 v.reset(OpCopy) 25224 v.Type = y.Type 25225 v.AddArg(y) 25226 return true 25227 } 25228 // match: (Xor64 (Xor64 y x) x) 25229 // cond: 25230 // result: y 25231 for { 25232 _ = v.Args[1] 25233 v_0 := v.Args[0] 25234 if v_0.Op != OpXor64 { 25235 break 25236 } 25237 _ = v_0.Args[1] 25238 y := v_0.Args[0] 25239 x := v_0.Args[1] 25240 if x != v.Args[1] { 25241 break 25242 } 25243 v.reset(OpCopy) 25244 v.Type = y.Type 25245 v.AddArg(y) 25246 return true 25247 } 25248 // match: (Xor64 (Xor64 i:(Const64 <t>) z) x) 25249 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25250 // result: (Xor64 i (Xor64 <t> z x)) 25251 for { 25252 _ = v.Args[1] 25253 v_0 := v.Args[0] 25254 if v_0.Op != OpXor64 { 25255 break 25256 } 25257 _ = v_0.Args[1] 25258 i := v_0.Args[0] 25259 if i.Op != OpConst64 { 25260 break 25261 } 25262 t := i.Type 25263 z := v_0.Args[1] 25264 x := v.Args[1] 25265 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25266 break 25267 } 25268 v.reset(OpXor64) 25269 v.AddArg(i) 25270 v0 := b.NewValue0(v.Pos, OpXor64, t) 25271 v0.AddArg(z) 25272 v0.AddArg(x) 25273 v.AddArg(v0) 25274 return true 25275 } 25276 return false 25277 } 25278 func rewriteValuegeneric_OpXor64_10(v *Value) bool { 25279 b := v.Block 25280 _ = b 25281 // match: (Xor64 (Xor64 z i:(Const64 <t>)) x) 25282 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25283 // result: (Xor64 i (Xor64 <t> z x)) 25284 for { 25285 _ = v.Args[1] 25286 v_0 := v.Args[0] 25287 if v_0.Op != OpXor64 { 25288 break 25289 } 25290 _ = v_0.Args[1] 25291 z := v_0.Args[0] 25292 i := v_0.Args[1] 25293 if i.Op != OpConst64 { 25294 break 25295 } 25296 t := i.Type 25297 x := v.Args[1] 25298 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25299 break 25300 } 25301 v.reset(OpXor64) 25302 v.AddArg(i) 25303 v0 := b.NewValue0(v.Pos, OpXor64, t) 25304 v0.AddArg(z) 25305 v0.AddArg(x) 25306 v.AddArg(v0) 25307 return true 25308 } 25309 // match: (Xor64 x (Xor64 i:(Const64 <t>) z)) 25310 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25311 // result: (Xor64 i (Xor64 <t> z x)) 25312 for { 25313 _ = v.Args[1] 25314 x := v.Args[0] 25315 v_1 := v.Args[1] 25316 if v_1.Op != OpXor64 { 25317 break 25318 } 25319 _ = v_1.Args[1] 25320 i := v_1.Args[0] 25321 if i.Op != OpConst64 { 25322 break 25323 } 25324 t := i.Type 25325 z := v_1.Args[1] 25326 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25327 break 25328 } 25329 v.reset(OpXor64) 25330 v.AddArg(i) 25331 v0 := b.NewValue0(v.Pos, OpXor64, t) 25332 v0.AddArg(z) 25333 v0.AddArg(x) 25334 v.AddArg(v0) 25335 return true 25336 } 25337 // match: (Xor64 x (Xor64 z i:(Const64 <t>))) 25338 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25339 // result: (Xor64 i (Xor64 <t> z x)) 25340 for { 25341 _ = v.Args[1] 25342 x := v.Args[0] 25343 v_1 := v.Args[1] 25344 if v_1.Op != OpXor64 { 25345 break 25346 } 25347 _ = v_1.Args[1] 25348 z := v_1.Args[0] 25349 i := v_1.Args[1] 25350 if i.Op != OpConst64 { 25351 break 25352 } 25353 t := i.Type 25354 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25355 break 25356 } 25357 v.reset(OpXor64) 25358 v.AddArg(i) 25359 v0 := b.NewValue0(v.Pos, OpXor64, t) 25360 v0.AddArg(z) 25361 v0.AddArg(x) 25362 v.AddArg(v0) 25363 return true 25364 } 25365 // match: (Xor64 (Const64 <t> [c]) (Xor64 (Const64 <t> [d]) x)) 25366 // cond: 25367 // result: (Xor64 (Const64 <t> [c^d]) x) 25368 for { 25369 _ = v.Args[1] 25370 v_0 := v.Args[0] 25371 if v_0.Op != OpConst64 { 25372 break 25373 } 25374 t := v_0.Type 25375 c := v_0.AuxInt 25376 v_1 := v.Args[1] 25377 if v_1.Op != OpXor64 { 25378 break 25379 } 25380 _ = v_1.Args[1] 25381 v_1_0 := v_1.Args[0] 25382 if v_1_0.Op != OpConst64 { 25383 break 25384 } 25385 if v_1_0.Type != t { 25386 break 25387 } 25388 d := v_1_0.AuxInt 25389 x := v_1.Args[1] 25390 v.reset(OpXor64) 25391 v0 := b.NewValue0(v.Pos, OpConst64, t) 25392 v0.AuxInt = c ^ d 25393 v.AddArg(v0) 25394 v.AddArg(x) 25395 return true 25396 } 25397 // match: (Xor64 (Const64 <t> [c]) (Xor64 x (Const64 <t> [d]))) 25398 // cond: 25399 // result: (Xor64 (Const64 <t> [c^d]) x) 25400 for { 25401 _ = v.Args[1] 25402 v_0 := v.Args[0] 25403 if v_0.Op != OpConst64 { 25404 break 25405 } 25406 t := v_0.Type 25407 c := v_0.AuxInt 25408 v_1 := v.Args[1] 25409 if v_1.Op != OpXor64 { 25410 break 25411 } 25412 _ = v_1.Args[1] 25413 x := v_1.Args[0] 25414 v_1_1 := v_1.Args[1] 25415 if v_1_1.Op != OpConst64 { 25416 break 25417 } 25418 if v_1_1.Type != t { 25419 break 25420 } 25421 d := v_1_1.AuxInt 25422 v.reset(OpXor64) 25423 v0 := b.NewValue0(v.Pos, OpConst64, t) 25424 v0.AuxInt = c ^ d 25425 v.AddArg(v0) 25426 v.AddArg(x) 25427 return true 25428 } 25429 // match: (Xor64 (Xor64 (Const64 <t> [d]) x) (Const64 <t> [c])) 25430 // cond: 25431 // result: (Xor64 (Const64 <t> [c^d]) x) 25432 for { 25433 _ = v.Args[1] 25434 v_0 := v.Args[0] 25435 if v_0.Op != OpXor64 { 25436 break 25437 } 25438 _ = v_0.Args[1] 25439 v_0_0 := v_0.Args[0] 25440 if v_0_0.Op != OpConst64 { 25441 break 25442 } 25443 t := v_0_0.Type 25444 d := v_0_0.AuxInt 25445 x := v_0.Args[1] 25446 v_1 := v.Args[1] 25447 if v_1.Op != OpConst64 { 25448 break 25449 } 25450 if v_1.Type != t { 25451 break 25452 } 25453 c := v_1.AuxInt 25454 v.reset(OpXor64) 25455 v0 := b.NewValue0(v.Pos, OpConst64, t) 25456 v0.AuxInt = c ^ d 25457 v.AddArg(v0) 25458 v.AddArg(x) 25459 return true 25460 } 25461 // match: (Xor64 (Xor64 x (Const64 <t> [d])) (Const64 <t> [c])) 25462 // cond: 25463 // result: (Xor64 (Const64 <t> [c^d]) x) 25464 for { 25465 _ = v.Args[1] 25466 v_0 := v.Args[0] 25467 if v_0.Op != OpXor64 { 25468 break 25469 } 25470 _ = v_0.Args[1] 25471 x := v_0.Args[0] 25472 v_0_1 := v_0.Args[1] 25473 if v_0_1.Op != OpConst64 { 25474 break 25475 } 25476 t := v_0_1.Type 25477 d := v_0_1.AuxInt 25478 v_1 := v.Args[1] 25479 if v_1.Op != OpConst64 { 25480 break 25481 } 25482 if v_1.Type != t { 25483 break 25484 } 25485 c := v_1.AuxInt 25486 v.reset(OpXor64) 25487 v0 := b.NewValue0(v.Pos, OpConst64, t) 25488 v0.AuxInt = c ^ d 25489 v.AddArg(v0) 25490 v.AddArg(x) 25491 return true 25492 } 25493 return false 25494 } 25495 func rewriteValuegeneric_OpXor8_0(v *Value) bool { 25496 b := v.Block 25497 _ = b 25498 // match: (Xor8 (Const8 [c]) (Const8 [d])) 25499 // cond: 25500 // result: (Const8 [int64(int8(c^d))]) 25501 for { 25502 _ = v.Args[1] 25503 v_0 := v.Args[0] 25504 if v_0.Op != OpConst8 { 25505 break 25506 } 25507 c := v_0.AuxInt 25508 v_1 := v.Args[1] 25509 if v_1.Op != OpConst8 { 25510 break 25511 } 25512 d := v_1.AuxInt 25513 v.reset(OpConst8) 25514 v.AuxInt = int64(int8(c ^ d)) 25515 return true 25516 } 25517 // match: (Xor8 (Const8 [d]) (Const8 [c])) 25518 // cond: 25519 // result: (Const8 [int64(int8(c^d))]) 25520 for { 25521 _ = v.Args[1] 25522 v_0 := v.Args[0] 25523 if v_0.Op != OpConst8 { 25524 break 25525 } 25526 d := v_0.AuxInt 25527 v_1 := v.Args[1] 25528 if v_1.Op != OpConst8 { 25529 break 25530 } 25531 c := v_1.AuxInt 25532 v.reset(OpConst8) 25533 v.AuxInt = int64(int8(c ^ d)) 25534 return true 25535 } 25536 // match: (Xor8 x x) 25537 // cond: 25538 // result: (Const8 [0]) 25539 for { 25540 _ = v.Args[1] 25541 x := v.Args[0] 25542 if x != v.Args[1] { 25543 break 25544 } 25545 v.reset(OpConst8) 25546 v.AuxInt = 0 25547 return true 25548 } 25549 // match: (Xor8 (Const8 [0]) x) 25550 // cond: 25551 // result: x 25552 for { 25553 _ = v.Args[1] 25554 v_0 := v.Args[0] 25555 if v_0.Op != OpConst8 { 25556 break 25557 } 25558 if v_0.AuxInt != 0 { 25559 break 25560 } 25561 x := v.Args[1] 25562 v.reset(OpCopy) 25563 v.Type = x.Type 25564 v.AddArg(x) 25565 return true 25566 } 25567 // match: (Xor8 x (Const8 [0])) 25568 // cond: 25569 // result: x 25570 for { 25571 _ = v.Args[1] 25572 x := v.Args[0] 25573 v_1 := v.Args[1] 25574 if v_1.Op != OpConst8 { 25575 break 25576 } 25577 if v_1.AuxInt != 0 { 25578 break 25579 } 25580 v.reset(OpCopy) 25581 v.Type = x.Type 25582 v.AddArg(x) 25583 return true 25584 } 25585 // match: (Xor8 x (Xor8 x y)) 25586 // cond: 25587 // result: y 25588 for { 25589 _ = v.Args[1] 25590 x := v.Args[0] 25591 v_1 := v.Args[1] 25592 if v_1.Op != OpXor8 { 25593 break 25594 } 25595 _ = v_1.Args[1] 25596 if x != v_1.Args[0] { 25597 break 25598 } 25599 y := v_1.Args[1] 25600 v.reset(OpCopy) 25601 v.Type = y.Type 25602 v.AddArg(y) 25603 return true 25604 } 25605 // match: (Xor8 x (Xor8 y x)) 25606 // cond: 25607 // result: y 25608 for { 25609 _ = v.Args[1] 25610 x := v.Args[0] 25611 v_1 := v.Args[1] 25612 if v_1.Op != OpXor8 { 25613 break 25614 } 25615 _ = v_1.Args[1] 25616 y := v_1.Args[0] 25617 if x != v_1.Args[1] { 25618 break 25619 } 25620 v.reset(OpCopy) 25621 v.Type = y.Type 25622 v.AddArg(y) 25623 return true 25624 } 25625 // match: (Xor8 (Xor8 x y) x) 25626 // cond: 25627 // result: y 25628 for { 25629 _ = v.Args[1] 25630 v_0 := v.Args[0] 25631 if v_0.Op != OpXor8 { 25632 break 25633 } 25634 _ = v_0.Args[1] 25635 x := v_0.Args[0] 25636 y := v_0.Args[1] 25637 if x != v.Args[1] { 25638 break 25639 } 25640 v.reset(OpCopy) 25641 v.Type = y.Type 25642 v.AddArg(y) 25643 return true 25644 } 25645 // match: (Xor8 (Xor8 y x) x) 25646 // cond: 25647 // result: y 25648 for { 25649 _ = v.Args[1] 25650 v_0 := v.Args[0] 25651 if v_0.Op != OpXor8 { 25652 break 25653 } 25654 _ = v_0.Args[1] 25655 y := v_0.Args[0] 25656 x := v_0.Args[1] 25657 if x != v.Args[1] { 25658 break 25659 } 25660 v.reset(OpCopy) 25661 v.Type = y.Type 25662 v.AddArg(y) 25663 return true 25664 } 25665 // match: (Xor8 (Xor8 i:(Const8 <t>) z) x) 25666 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 25667 // result: (Xor8 i (Xor8 <t> z x)) 25668 for { 25669 _ = v.Args[1] 25670 v_0 := v.Args[0] 25671 if v_0.Op != OpXor8 { 25672 break 25673 } 25674 _ = v_0.Args[1] 25675 i := v_0.Args[0] 25676 if i.Op != OpConst8 { 25677 break 25678 } 25679 t := i.Type 25680 z := v_0.Args[1] 25681 x := v.Args[1] 25682 if !(z.Op != OpConst8 && x.Op != OpConst8) { 25683 break 25684 } 25685 v.reset(OpXor8) 25686 v.AddArg(i) 25687 v0 := b.NewValue0(v.Pos, OpXor8, t) 25688 v0.AddArg(z) 25689 v0.AddArg(x) 25690 v.AddArg(v0) 25691 return true 25692 } 25693 return false 25694 } 25695 func rewriteValuegeneric_OpXor8_10(v *Value) bool { 25696 b := v.Block 25697 _ = b 25698 // match: (Xor8 (Xor8 z i:(Const8 <t>)) x) 25699 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 25700 // result: (Xor8 i (Xor8 <t> z x)) 25701 for { 25702 _ = v.Args[1] 25703 v_0 := v.Args[0] 25704 if v_0.Op != OpXor8 { 25705 break 25706 } 25707 _ = v_0.Args[1] 25708 z := v_0.Args[0] 25709 i := v_0.Args[1] 25710 if i.Op != OpConst8 { 25711 break 25712 } 25713 t := i.Type 25714 x := v.Args[1] 25715 if !(z.Op != OpConst8 && x.Op != OpConst8) { 25716 break 25717 } 25718 v.reset(OpXor8) 25719 v.AddArg(i) 25720 v0 := b.NewValue0(v.Pos, OpXor8, t) 25721 v0.AddArg(z) 25722 v0.AddArg(x) 25723 v.AddArg(v0) 25724 return true 25725 } 25726 // match: (Xor8 x (Xor8 i:(Const8 <t>) z)) 25727 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 25728 // result: (Xor8 i (Xor8 <t> z x)) 25729 for { 25730 _ = v.Args[1] 25731 x := v.Args[0] 25732 v_1 := v.Args[1] 25733 if v_1.Op != OpXor8 { 25734 break 25735 } 25736 _ = v_1.Args[1] 25737 i := v_1.Args[0] 25738 if i.Op != OpConst8 { 25739 break 25740 } 25741 t := i.Type 25742 z := v_1.Args[1] 25743 if !(z.Op != OpConst8 && x.Op != OpConst8) { 25744 break 25745 } 25746 v.reset(OpXor8) 25747 v.AddArg(i) 25748 v0 := b.NewValue0(v.Pos, OpXor8, t) 25749 v0.AddArg(z) 25750 v0.AddArg(x) 25751 v.AddArg(v0) 25752 return true 25753 } 25754 // match: (Xor8 x (Xor8 z i:(Const8 <t>))) 25755 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 25756 // result: (Xor8 i (Xor8 <t> z x)) 25757 for { 25758 _ = v.Args[1] 25759 x := v.Args[0] 25760 v_1 := v.Args[1] 25761 if v_1.Op != OpXor8 { 25762 break 25763 } 25764 _ = v_1.Args[1] 25765 z := v_1.Args[0] 25766 i := v_1.Args[1] 25767 if i.Op != OpConst8 { 25768 break 25769 } 25770 t := i.Type 25771 if !(z.Op != OpConst8 && x.Op != OpConst8) { 25772 break 25773 } 25774 v.reset(OpXor8) 25775 v.AddArg(i) 25776 v0 := b.NewValue0(v.Pos, OpXor8, t) 25777 v0.AddArg(z) 25778 v0.AddArg(x) 25779 v.AddArg(v0) 25780 return true 25781 } 25782 // match: (Xor8 (Const8 <t> [c]) (Xor8 (Const8 <t> [d]) x)) 25783 // cond: 25784 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 25785 for { 25786 _ = v.Args[1] 25787 v_0 := v.Args[0] 25788 if v_0.Op != OpConst8 { 25789 break 25790 } 25791 t := v_0.Type 25792 c := v_0.AuxInt 25793 v_1 := v.Args[1] 25794 if v_1.Op != OpXor8 { 25795 break 25796 } 25797 _ = v_1.Args[1] 25798 v_1_0 := v_1.Args[0] 25799 if v_1_0.Op != OpConst8 { 25800 break 25801 } 25802 if v_1_0.Type != t { 25803 break 25804 } 25805 d := v_1_0.AuxInt 25806 x := v_1.Args[1] 25807 v.reset(OpXor8) 25808 v0 := b.NewValue0(v.Pos, OpConst8, t) 25809 v0.AuxInt = int64(int8(c ^ d)) 25810 v.AddArg(v0) 25811 v.AddArg(x) 25812 return true 25813 } 25814 // match: (Xor8 (Const8 <t> [c]) (Xor8 x (Const8 <t> [d]))) 25815 // cond: 25816 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 25817 for { 25818 _ = v.Args[1] 25819 v_0 := v.Args[0] 25820 if v_0.Op != OpConst8 { 25821 break 25822 } 25823 t := v_0.Type 25824 c := v_0.AuxInt 25825 v_1 := v.Args[1] 25826 if v_1.Op != OpXor8 { 25827 break 25828 } 25829 _ = v_1.Args[1] 25830 x := v_1.Args[0] 25831 v_1_1 := v_1.Args[1] 25832 if v_1_1.Op != OpConst8 { 25833 break 25834 } 25835 if v_1_1.Type != t { 25836 break 25837 } 25838 d := v_1_1.AuxInt 25839 v.reset(OpXor8) 25840 v0 := b.NewValue0(v.Pos, OpConst8, t) 25841 v0.AuxInt = int64(int8(c ^ d)) 25842 v.AddArg(v0) 25843 v.AddArg(x) 25844 return true 25845 } 25846 // match: (Xor8 (Xor8 (Const8 <t> [d]) x) (Const8 <t> [c])) 25847 // cond: 25848 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 25849 for { 25850 _ = v.Args[1] 25851 v_0 := v.Args[0] 25852 if v_0.Op != OpXor8 { 25853 break 25854 } 25855 _ = v_0.Args[1] 25856 v_0_0 := v_0.Args[0] 25857 if v_0_0.Op != OpConst8 { 25858 break 25859 } 25860 t := v_0_0.Type 25861 d := v_0_0.AuxInt 25862 x := v_0.Args[1] 25863 v_1 := v.Args[1] 25864 if v_1.Op != OpConst8 { 25865 break 25866 } 25867 if v_1.Type != t { 25868 break 25869 } 25870 c := v_1.AuxInt 25871 v.reset(OpXor8) 25872 v0 := b.NewValue0(v.Pos, OpConst8, t) 25873 v0.AuxInt = int64(int8(c ^ d)) 25874 v.AddArg(v0) 25875 v.AddArg(x) 25876 return true 25877 } 25878 // match: (Xor8 (Xor8 x (Const8 <t> [d])) (Const8 <t> [c])) 25879 // cond: 25880 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 25881 for { 25882 _ = v.Args[1] 25883 v_0 := v.Args[0] 25884 if v_0.Op != OpXor8 { 25885 break 25886 } 25887 _ = v_0.Args[1] 25888 x := v_0.Args[0] 25889 v_0_1 := v_0.Args[1] 25890 if v_0_1.Op != OpConst8 { 25891 break 25892 } 25893 t := v_0_1.Type 25894 d := v_0_1.AuxInt 25895 v_1 := v.Args[1] 25896 if v_1.Op != OpConst8 { 25897 break 25898 } 25899 if v_1.Type != t { 25900 break 25901 } 25902 c := v_1.AuxInt 25903 v.reset(OpXor8) 25904 v0 := b.NewValue0(v.Pos, OpConst8, t) 25905 v0.AuxInt = int64(int8(c ^ d)) 25906 v.AddArg(v0) 25907 v.AddArg(x) 25908 return true 25909 } 25910 return false 25911 } 25912 func rewriteValuegeneric_OpZero_0(v *Value) bool { 25913 b := v.Block 25914 _ = b 25915 config := b.Func.Config 25916 _ = config 25917 // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) 25918 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 25919 // result: mem 25920 for { 25921 _ = v.Args[1] 25922 v_0 := v.Args[0] 25923 if v_0.Op != OpLoad { 25924 break 25925 } 25926 _ = v_0.Args[1] 25927 v_0_0 := v_0.Args[0] 25928 if v_0_0.Op != OpOffPtr { 25929 break 25930 } 25931 c := v_0_0.AuxInt 25932 v_0_0_0 := v_0_0.Args[0] 25933 if v_0_0_0.Op != OpSP { 25934 break 25935 } 25936 mem := v_0.Args[1] 25937 if mem != v.Args[1] { 25938 break 25939 } 25940 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 25941 break 25942 } 25943 v.reset(OpCopy) 25944 v.Type = mem.Type 25945 v.AddArg(mem) 25946 return true 25947 } 25948 return false 25949 } 25950 func rewriteValuegeneric_OpZeroExt16to32_0(v *Value) bool { 25951 // match: (ZeroExt16to32 (Const16 [c])) 25952 // cond: 25953 // result: (Const32 [int64(uint16(c))]) 25954 for { 25955 v_0 := v.Args[0] 25956 if v_0.Op != OpConst16 { 25957 break 25958 } 25959 c := v_0.AuxInt 25960 v.reset(OpConst32) 25961 v.AuxInt = int64(uint16(c)) 25962 return true 25963 } 25964 // match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s])))) 25965 // cond: s >= 16 25966 // result: x 25967 for { 25968 v_0 := v.Args[0] 25969 if v_0.Op != OpTrunc32to16 { 25970 break 25971 } 25972 x := v_0.Args[0] 25973 if x.Op != OpRsh32Ux64 { 25974 break 25975 } 25976 _ = x.Args[1] 25977 x_1 := x.Args[1] 25978 if x_1.Op != OpConst64 { 25979 break 25980 } 25981 s := x_1.AuxInt 25982 if !(s >= 16) { 25983 break 25984 } 25985 v.reset(OpCopy) 25986 v.Type = x.Type 25987 v.AddArg(x) 25988 return true 25989 } 25990 return false 25991 } 25992 func rewriteValuegeneric_OpZeroExt16to64_0(v *Value) bool { 25993 // match: (ZeroExt16to64 (Const16 [c])) 25994 // cond: 25995 // result: (Const64 [int64(uint16(c))]) 25996 for { 25997 v_0 := v.Args[0] 25998 if v_0.Op != OpConst16 { 25999 break 26000 } 26001 c := v_0.AuxInt 26002 v.reset(OpConst64) 26003 v.AuxInt = int64(uint16(c)) 26004 return true 26005 } 26006 // match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s])))) 26007 // cond: s >= 48 26008 // result: x 26009 for { 26010 v_0 := v.Args[0] 26011 if v_0.Op != OpTrunc64to16 { 26012 break 26013 } 26014 x := v_0.Args[0] 26015 if x.Op != OpRsh64Ux64 { 26016 break 26017 } 26018 _ = x.Args[1] 26019 x_1 := x.Args[1] 26020 if x_1.Op != OpConst64 { 26021 break 26022 } 26023 s := x_1.AuxInt 26024 if !(s >= 48) { 26025 break 26026 } 26027 v.reset(OpCopy) 26028 v.Type = x.Type 26029 v.AddArg(x) 26030 return true 26031 } 26032 return false 26033 } 26034 func rewriteValuegeneric_OpZeroExt32to64_0(v *Value) bool { 26035 // match: (ZeroExt32to64 (Const32 [c])) 26036 // cond: 26037 // result: (Const64 [int64(uint32(c))]) 26038 for { 26039 v_0 := v.Args[0] 26040 if v_0.Op != OpConst32 { 26041 break 26042 } 26043 c := v_0.AuxInt 26044 v.reset(OpConst64) 26045 v.AuxInt = int64(uint32(c)) 26046 return true 26047 } 26048 // match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s])))) 26049 // cond: s >= 32 26050 // result: x 26051 for { 26052 v_0 := v.Args[0] 26053 if v_0.Op != OpTrunc64to32 { 26054 break 26055 } 26056 x := v_0.Args[0] 26057 if x.Op != OpRsh64Ux64 { 26058 break 26059 } 26060 _ = x.Args[1] 26061 x_1 := x.Args[1] 26062 if x_1.Op != OpConst64 { 26063 break 26064 } 26065 s := x_1.AuxInt 26066 if !(s >= 32) { 26067 break 26068 } 26069 v.reset(OpCopy) 26070 v.Type = x.Type 26071 v.AddArg(x) 26072 return true 26073 } 26074 return false 26075 } 26076 func rewriteValuegeneric_OpZeroExt8to16_0(v *Value) bool { 26077 // match: (ZeroExt8to16 (Const8 [c])) 26078 // cond: 26079 // result: (Const16 [int64( uint8(c))]) 26080 for { 26081 v_0 := v.Args[0] 26082 if v_0.Op != OpConst8 { 26083 break 26084 } 26085 c := v_0.AuxInt 26086 v.reset(OpConst16) 26087 v.AuxInt = int64(uint8(c)) 26088 return true 26089 } 26090 // match: (ZeroExt8to16 (Trunc16to8 x:(Rsh16Ux64 _ (Const64 [s])))) 26091 // cond: s >= 8 26092 // result: x 26093 for { 26094 v_0 := v.Args[0] 26095 if v_0.Op != OpTrunc16to8 { 26096 break 26097 } 26098 x := v_0.Args[0] 26099 if x.Op != OpRsh16Ux64 { 26100 break 26101 } 26102 _ = x.Args[1] 26103 x_1 := x.Args[1] 26104 if x_1.Op != OpConst64 { 26105 break 26106 } 26107 s := x_1.AuxInt 26108 if !(s >= 8) { 26109 break 26110 } 26111 v.reset(OpCopy) 26112 v.Type = x.Type 26113 v.AddArg(x) 26114 return true 26115 } 26116 return false 26117 } 26118 func rewriteValuegeneric_OpZeroExt8to32_0(v *Value) bool { 26119 // match: (ZeroExt8to32 (Const8 [c])) 26120 // cond: 26121 // result: (Const32 [int64( uint8(c))]) 26122 for { 26123 v_0 := v.Args[0] 26124 if v_0.Op != OpConst8 { 26125 break 26126 } 26127 c := v_0.AuxInt 26128 v.reset(OpConst32) 26129 v.AuxInt = int64(uint8(c)) 26130 return true 26131 } 26132 // match: (ZeroExt8to32 (Trunc32to8 x:(Rsh32Ux64 _ (Const64 [s])))) 26133 // cond: s >= 24 26134 // result: x 26135 for { 26136 v_0 := v.Args[0] 26137 if v_0.Op != OpTrunc32to8 { 26138 break 26139 } 26140 x := v_0.Args[0] 26141 if x.Op != OpRsh32Ux64 { 26142 break 26143 } 26144 _ = x.Args[1] 26145 x_1 := x.Args[1] 26146 if x_1.Op != OpConst64 { 26147 break 26148 } 26149 s := x_1.AuxInt 26150 if !(s >= 24) { 26151 break 26152 } 26153 v.reset(OpCopy) 26154 v.Type = x.Type 26155 v.AddArg(x) 26156 return true 26157 } 26158 return false 26159 } 26160 func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { 26161 // match: (ZeroExt8to64 (Const8 [c])) 26162 // cond: 26163 // result: (Const64 [int64( uint8(c))]) 26164 for { 26165 v_0 := v.Args[0] 26166 if v_0.Op != OpConst8 { 26167 break 26168 } 26169 c := v_0.AuxInt 26170 v.reset(OpConst64) 26171 v.AuxInt = int64(uint8(c)) 26172 return true 26173 } 26174 // match: (ZeroExt8to64 (Trunc64to8 x:(Rsh64Ux64 _ (Const64 [s])))) 26175 // cond: s >= 56 26176 // result: x 26177 for { 26178 v_0 := v.Args[0] 26179 if v_0.Op != OpTrunc64to8 { 26180 break 26181 } 26182 x := v_0.Args[0] 26183 if x.Op != OpRsh64Ux64 { 26184 break 26185 } 26186 _ = x.Args[1] 26187 x_1 := x.Args[1] 26188 if x_1.Op != OpConst64 { 26189 break 26190 } 26191 s := x_1.AuxInt 26192 if !(s >= 56) { 26193 break 26194 } 26195 v.reset(OpCopy) 26196 v.Type = x.Type 26197 v.AddArg(x) 26198 return true 26199 } 26200 return false 26201 } 26202 func rewriteBlockgeneric(b *Block) bool { 26203 config := b.Func.Config 26204 _ = config 26205 fe := b.Func.fe 26206 _ = fe 26207 typ := &config.Types 26208 _ = typ 26209 switch b.Kind { 26210 case BlockIf: 26211 // match: (If (Not cond) yes no) 26212 // cond: 26213 // result: (If cond no yes) 26214 for { 26215 v := b.Control 26216 if v.Op != OpNot { 26217 break 26218 } 26219 cond := v.Args[0] 26220 b.Kind = BlockIf 26221 b.SetControl(cond) 26222 b.swapSuccessors() 26223 return true 26224 } 26225 // match: (If (ConstBool [c]) yes no) 26226 // cond: c == 1 26227 // result: (First nil yes no) 26228 for { 26229 v := b.Control 26230 if v.Op != OpConstBool { 26231 break 26232 } 26233 c := v.AuxInt 26234 if !(c == 1) { 26235 break 26236 } 26237 b.Kind = BlockFirst 26238 b.SetControl(nil) 26239 return true 26240 } 26241 // match: (If (ConstBool [c]) yes no) 26242 // cond: c == 0 26243 // result: (First nil no yes) 26244 for { 26245 v := b.Control 26246 if v.Op != OpConstBool { 26247 break 26248 } 26249 c := v.AuxInt 26250 if !(c == 0) { 26251 break 26252 } 26253 b.Kind = BlockFirst 26254 b.SetControl(nil) 26255 b.swapSuccessors() 26256 return true 26257 } 26258 } 26259 return false 26260 }