github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/src/cmd/compile/internal/ssa/rewritegeneric.go (about) 1 // Code generated from gen/generic.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 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 b := v.Block 5674 _ = b 5675 // match: (ArraySelect (ArrayMake1 x)) 5676 // cond: 5677 // result: x 5678 for { 5679 v_0 := v.Args[0] 5680 if v_0.Op != OpArrayMake1 { 5681 break 5682 } 5683 x := v_0.Args[0] 5684 v.reset(OpCopy) 5685 v.Type = x.Type 5686 v.AddArg(x) 5687 return true 5688 } 5689 // match: (ArraySelect [0] x:(Load ptr mem)) 5690 // cond: 5691 // result: @x.Block (Load <v.Type> ptr mem) 5692 for { 5693 if v.AuxInt != 0 { 5694 break 5695 } 5696 x := v.Args[0] 5697 if x.Op != OpLoad { 5698 break 5699 } 5700 _ = x.Args[1] 5701 ptr := x.Args[0] 5702 mem := x.Args[1] 5703 b = x.Block 5704 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 5705 v.reset(OpCopy) 5706 v.AddArg(v0) 5707 v0.AddArg(ptr) 5708 v0.AddArg(mem) 5709 return true 5710 } 5711 // match: (ArraySelect [0] x:(IData _)) 5712 // cond: 5713 // result: x 5714 for { 5715 if v.AuxInt != 0 { 5716 break 5717 } 5718 x := v.Args[0] 5719 if x.Op != OpIData { 5720 break 5721 } 5722 v.reset(OpCopy) 5723 v.Type = x.Type 5724 v.AddArg(x) 5725 return true 5726 } 5727 return false 5728 } 5729 func rewriteValuegeneric_OpCom16_0(v *Value) bool { 5730 // match: (Com16 (Com16 x)) 5731 // cond: 5732 // result: x 5733 for { 5734 v_0 := v.Args[0] 5735 if v_0.Op != OpCom16 { 5736 break 5737 } 5738 x := v_0.Args[0] 5739 v.reset(OpCopy) 5740 v.Type = x.Type 5741 v.AddArg(x) 5742 return true 5743 } 5744 // match: (Com16 (Const16 [c])) 5745 // cond: 5746 // result: (Const16 [^c]) 5747 for { 5748 v_0 := v.Args[0] 5749 if v_0.Op != OpConst16 { 5750 break 5751 } 5752 c := v_0.AuxInt 5753 v.reset(OpConst16) 5754 v.AuxInt = ^c 5755 return true 5756 } 5757 return false 5758 } 5759 func rewriteValuegeneric_OpCom32_0(v *Value) bool { 5760 // match: (Com32 (Com32 x)) 5761 // cond: 5762 // result: x 5763 for { 5764 v_0 := v.Args[0] 5765 if v_0.Op != OpCom32 { 5766 break 5767 } 5768 x := v_0.Args[0] 5769 v.reset(OpCopy) 5770 v.Type = x.Type 5771 v.AddArg(x) 5772 return true 5773 } 5774 // match: (Com32 (Const32 [c])) 5775 // cond: 5776 // result: (Const32 [^c]) 5777 for { 5778 v_0 := v.Args[0] 5779 if v_0.Op != OpConst32 { 5780 break 5781 } 5782 c := v_0.AuxInt 5783 v.reset(OpConst32) 5784 v.AuxInt = ^c 5785 return true 5786 } 5787 return false 5788 } 5789 func rewriteValuegeneric_OpCom64_0(v *Value) bool { 5790 // match: (Com64 (Com64 x)) 5791 // cond: 5792 // result: x 5793 for { 5794 v_0 := v.Args[0] 5795 if v_0.Op != OpCom64 { 5796 break 5797 } 5798 x := v_0.Args[0] 5799 v.reset(OpCopy) 5800 v.Type = x.Type 5801 v.AddArg(x) 5802 return true 5803 } 5804 // match: (Com64 (Const64 [c])) 5805 // cond: 5806 // result: (Const64 [^c]) 5807 for { 5808 v_0 := v.Args[0] 5809 if v_0.Op != OpConst64 { 5810 break 5811 } 5812 c := v_0.AuxInt 5813 v.reset(OpConst64) 5814 v.AuxInt = ^c 5815 return true 5816 } 5817 return false 5818 } 5819 func rewriteValuegeneric_OpCom8_0(v *Value) bool { 5820 // match: (Com8 (Com8 x)) 5821 // cond: 5822 // result: x 5823 for { 5824 v_0 := v.Args[0] 5825 if v_0.Op != OpCom8 { 5826 break 5827 } 5828 x := v_0.Args[0] 5829 v.reset(OpCopy) 5830 v.Type = x.Type 5831 v.AddArg(x) 5832 return true 5833 } 5834 // match: (Com8 (Const8 [c])) 5835 // cond: 5836 // result: (Const8 [^c]) 5837 for { 5838 v_0 := v.Args[0] 5839 if v_0.Op != OpConst8 { 5840 break 5841 } 5842 c := v_0.AuxInt 5843 v.reset(OpConst8) 5844 v.AuxInt = ^c 5845 return true 5846 } 5847 return false 5848 } 5849 func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { 5850 b := v.Block 5851 _ = b 5852 typ := &b.Func.Config.Types 5853 _ = typ 5854 // match: (ConstInterface) 5855 // cond: 5856 // result: (IMake (ConstNil <typ.BytePtr>) (ConstNil <typ.BytePtr>)) 5857 for { 5858 v.reset(OpIMake) 5859 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 5860 v.AddArg(v0) 5861 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 5862 v.AddArg(v1) 5863 return true 5864 } 5865 } 5866 func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { 5867 b := v.Block 5868 _ = b 5869 config := b.Func.Config 5870 _ = config 5871 typ := &b.Func.Config.Types 5872 _ = typ 5873 // match: (ConstSlice) 5874 // cond: config.PtrSize == 4 5875 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const32 <typ.Int> [0]) (Const32 <typ.Int> [0])) 5876 for { 5877 if !(config.PtrSize == 4) { 5878 break 5879 } 5880 v.reset(OpSliceMake) 5881 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 5882 v.AddArg(v0) 5883 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 5884 v1.AuxInt = 0 5885 v.AddArg(v1) 5886 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 5887 v2.AuxInt = 0 5888 v.AddArg(v2) 5889 return true 5890 } 5891 // match: (ConstSlice) 5892 // cond: config.PtrSize == 8 5893 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const64 <typ.Int> [0]) (Const64 <typ.Int> [0])) 5894 for { 5895 if !(config.PtrSize == 8) { 5896 break 5897 } 5898 v.reset(OpSliceMake) 5899 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 5900 v.AddArg(v0) 5901 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 5902 v1.AuxInt = 0 5903 v.AddArg(v1) 5904 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 5905 v2.AuxInt = 0 5906 v.AddArg(v2) 5907 return true 5908 } 5909 return false 5910 } 5911 func rewriteValuegeneric_OpConstString_0(v *Value) bool { 5912 b := v.Block 5913 _ = b 5914 config := b.Func.Config 5915 _ = config 5916 fe := b.Func.fe 5917 _ = fe 5918 typ := &b.Func.Config.Types 5919 _ = typ 5920 // match: (ConstString {s}) 5921 // cond: config.PtrSize == 4 && s.(string) == "" 5922 // result: (StringMake (ConstNil) (Const32 <typ.Int> [0])) 5923 for { 5924 s := v.Aux 5925 if !(config.PtrSize == 4 && s.(string) == "") { 5926 break 5927 } 5928 v.reset(OpStringMake) 5929 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 5930 v.AddArg(v0) 5931 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 5932 v1.AuxInt = 0 5933 v.AddArg(v1) 5934 return true 5935 } 5936 // match: (ConstString {s}) 5937 // cond: config.PtrSize == 8 && s.(string) == "" 5938 // result: (StringMake (ConstNil) (Const64 <typ.Int> [0])) 5939 for { 5940 s := v.Aux 5941 if !(config.PtrSize == 8 && s.(string) == "") { 5942 break 5943 } 5944 v.reset(OpStringMake) 5945 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 5946 v.AddArg(v0) 5947 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 5948 v1.AuxInt = 0 5949 v.AddArg(v1) 5950 return true 5951 } 5952 // match: (ConstString {s}) 5953 // cond: config.PtrSize == 4 && s.(string) != "" 5954 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const32 <typ.Int> [int64(len(s.(string)))])) 5955 for { 5956 s := v.Aux 5957 if !(config.PtrSize == 4 && s.(string) != "") { 5958 break 5959 } 5960 v.reset(OpStringMake) 5961 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 5962 v0.Aux = fe.StringData(s.(string)) 5963 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 5964 v0.AddArg(v1) 5965 v.AddArg(v0) 5966 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 5967 v2.AuxInt = int64(len(s.(string))) 5968 v.AddArg(v2) 5969 return true 5970 } 5971 // match: (ConstString {s}) 5972 // cond: config.PtrSize == 8 && s.(string) != "" 5973 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const64 <typ.Int> [int64(len(s.(string)))])) 5974 for { 5975 s := v.Aux 5976 if !(config.PtrSize == 8 && s.(string) != "") { 5977 break 5978 } 5979 v.reset(OpStringMake) 5980 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 5981 v0.Aux = fe.StringData(s.(string)) 5982 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 5983 v0.AddArg(v1) 5984 v.AddArg(v0) 5985 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 5986 v2.AuxInt = int64(len(s.(string))) 5987 v.AddArg(v2) 5988 return true 5989 } 5990 return false 5991 } 5992 func rewriteValuegeneric_OpConvert_0(v *Value) bool { 5993 // match: (Convert (Add64 (Convert ptr mem) off) mem) 5994 // cond: 5995 // result: (Add64 ptr off) 5996 for { 5997 _ = v.Args[1] 5998 v_0 := v.Args[0] 5999 if v_0.Op != OpAdd64 { 6000 break 6001 } 6002 _ = v_0.Args[1] 6003 v_0_0 := v_0.Args[0] 6004 if v_0_0.Op != OpConvert { 6005 break 6006 } 6007 _ = v_0_0.Args[1] 6008 ptr := v_0_0.Args[0] 6009 mem := v_0_0.Args[1] 6010 off := v_0.Args[1] 6011 if mem != v.Args[1] { 6012 break 6013 } 6014 v.reset(OpAdd64) 6015 v.AddArg(ptr) 6016 v.AddArg(off) 6017 return true 6018 } 6019 // match: (Convert (Add64 off (Convert ptr mem)) mem) 6020 // cond: 6021 // result: (Add64 ptr off) 6022 for { 6023 _ = v.Args[1] 6024 v_0 := v.Args[0] 6025 if v_0.Op != OpAdd64 { 6026 break 6027 } 6028 _ = v_0.Args[1] 6029 off := v_0.Args[0] 6030 v_0_1 := v_0.Args[1] 6031 if v_0_1.Op != OpConvert { 6032 break 6033 } 6034 _ = v_0_1.Args[1] 6035 ptr := v_0_1.Args[0] 6036 mem := v_0_1.Args[1] 6037 if mem != v.Args[1] { 6038 break 6039 } 6040 v.reset(OpAdd64) 6041 v.AddArg(ptr) 6042 v.AddArg(off) 6043 return true 6044 } 6045 // match: (Convert (Convert ptr mem) mem) 6046 // cond: 6047 // result: ptr 6048 for { 6049 _ = v.Args[1] 6050 v_0 := v.Args[0] 6051 if v_0.Op != OpConvert { 6052 break 6053 } 6054 _ = v_0.Args[1] 6055 ptr := v_0.Args[0] 6056 mem := v_0.Args[1] 6057 if mem != v.Args[1] { 6058 break 6059 } 6060 v.reset(OpCopy) 6061 v.Type = ptr.Type 6062 v.AddArg(ptr) 6063 return true 6064 } 6065 return false 6066 } 6067 func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { 6068 // match: (Cvt32Fto64F (Const32F [c])) 6069 // cond: 6070 // result: (Const64F [c]) 6071 for { 6072 v_0 := v.Args[0] 6073 if v_0.Op != OpConst32F { 6074 break 6075 } 6076 c := v_0.AuxInt 6077 v.reset(OpConst64F) 6078 v.AuxInt = c 6079 return true 6080 } 6081 return false 6082 } 6083 func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { 6084 // match: (Cvt64Fto32F (Const64F [c])) 6085 // cond: 6086 // result: (Const32F [f2i(float64(i2f32(c)))]) 6087 for { 6088 v_0 := v.Args[0] 6089 if v_0.Op != OpConst64F { 6090 break 6091 } 6092 c := v_0.AuxInt 6093 v.reset(OpConst32F) 6094 v.AuxInt = f2i(float64(i2f32(c))) 6095 return true 6096 } 6097 return false 6098 } 6099 func rewriteValuegeneric_OpDiv16_0(v *Value) bool { 6100 b := v.Block 6101 _ = b 6102 typ := &b.Func.Config.Types 6103 _ = typ 6104 // match: (Div16 (Const16 [c]) (Const16 [d])) 6105 // cond: d != 0 6106 // result: (Const16 [int64(int16(c)/int16(d))]) 6107 for { 6108 _ = v.Args[1] 6109 v_0 := v.Args[0] 6110 if v_0.Op != OpConst16 { 6111 break 6112 } 6113 c := v_0.AuxInt 6114 v_1 := v.Args[1] 6115 if v_1.Op != OpConst16 { 6116 break 6117 } 6118 d := v_1.AuxInt 6119 if !(d != 0) { 6120 break 6121 } 6122 v.reset(OpConst16) 6123 v.AuxInt = int64(int16(c) / int16(d)) 6124 return true 6125 } 6126 // match: (Div16 <t> n (Const16 [c])) 6127 // cond: c < 0 && c != -1<<15 6128 // result: (Neg16 (Div16 <t> n (Const16 <t> [-c]))) 6129 for { 6130 t := v.Type 6131 _ = v.Args[1] 6132 n := v.Args[0] 6133 v_1 := v.Args[1] 6134 if v_1.Op != OpConst16 { 6135 break 6136 } 6137 c := v_1.AuxInt 6138 if !(c < 0 && c != -1<<15) { 6139 break 6140 } 6141 v.reset(OpNeg16) 6142 v0 := b.NewValue0(v.Pos, OpDiv16, t) 6143 v0.AddArg(n) 6144 v1 := b.NewValue0(v.Pos, OpConst16, t) 6145 v1.AuxInt = -c 6146 v0.AddArg(v1) 6147 v.AddArg(v0) 6148 return true 6149 } 6150 // match: (Div16 <t> x (Const16 [-1<<15])) 6151 // cond: 6152 // result: (Rsh16Ux64 (And16 <t> x (Neg16 <t> x)) (Const64 <typ.UInt64> [15])) 6153 for { 6154 t := v.Type 6155 _ = v.Args[1] 6156 x := v.Args[0] 6157 v_1 := v.Args[1] 6158 if v_1.Op != OpConst16 { 6159 break 6160 } 6161 if v_1.AuxInt != -1<<15 { 6162 break 6163 } 6164 v.reset(OpRsh16Ux64) 6165 v0 := b.NewValue0(v.Pos, OpAnd16, t) 6166 v0.AddArg(x) 6167 v1 := b.NewValue0(v.Pos, OpNeg16, t) 6168 v1.AddArg(x) 6169 v0.AddArg(v1) 6170 v.AddArg(v0) 6171 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6172 v2.AuxInt = 15 6173 v.AddArg(v2) 6174 return true 6175 } 6176 // match: (Div16 <t> n (Const16 [c])) 6177 // cond: isPowerOfTwo(c) 6178 // 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)])) 6179 for { 6180 t := v.Type 6181 _ = v.Args[1] 6182 n := v.Args[0] 6183 v_1 := v.Args[1] 6184 if v_1.Op != OpConst16 { 6185 break 6186 } 6187 c := v_1.AuxInt 6188 if !(isPowerOfTwo(c)) { 6189 break 6190 } 6191 v.reset(OpRsh16x64) 6192 v0 := b.NewValue0(v.Pos, OpAdd16, t) 6193 v0.AddArg(n) 6194 v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) 6195 v2 := b.NewValue0(v.Pos, OpRsh16x64, t) 6196 v2.AddArg(n) 6197 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6198 v3.AuxInt = 15 6199 v2.AddArg(v3) 6200 v1.AddArg(v2) 6201 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6202 v4.AuxInt = 16 - log2(c) 6203 v1.AddArg(v4) 6204 v0.AddArg(v1) 6205 v.AddArg(v0) 6206 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6207 v5.AuxInt = log2(c) 6208 v.AddArg(v5) 6209 return true 6210 } 6211 // match: (Div16 <t> x (Const16 [c])) 6212 // cond: smagicOK(16,c) 6213 // 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]))) 6214 for { 6215 t := v.Type 6216 _ = v.Args[1] 6217 x := v.Args[0] 6218 v_1 := v.Args[1] 6219 if v_1.Op != OpConst16 { 6220 break 6221 } 6222 c := v_1.AuxInt 6223 if !(smagicOK(16, c)) { 6224 break 6225 } 6226 v.reset(OpSub16) 6227 v.Type = t 6228 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 6229 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 6230 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6231 v2.AuxInt = int64(smagic(16, c).m) 6232 v1.AddArg(v2) 6233 v3 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 6234 v3.AddArg(x) 6235 v1.AddArg(v3) 6236 v0.AddArg(v1) 6237 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6238 v4.AuxInt = 16 + smagic(16, c).s 6239 v0.AddArg(v4) 6240 v.AddArg(v0) 6241 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 6242 v6 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 6243 v6.AddArg(x) 6244 v5.AddArg(v6) 6245 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6246 v7.AuxInt = 31 6247 v5.AddArg(v7) 6248 v.AddArg(v5) 6249 return true 6250 } 6251 return false 6252 } 6253 func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { 6254 b := v.Block 6255 _ = b 6256 config := b.Func.Config 6257 _ = config 6258 typ := &b.Func.Config.Types 6259 _ = typ 6260 // match: (Div16u (Const16 [c]) (Const16 [d])) 6261 // cond: d != 0 6262 // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) 6263 for { 6264 _ = v.Args[1] 6265 v_0 := v.Args[0] 6266 if v_0.Op != OpConst16 { 6267 break 6268 } 6269 c := v_0.AuxInt 6270 v_1 := v.Args[1] 6271 if v_1.Op != OpConst16 { 6272 break 6273 } 6274 d := v_1.AuxInt 6275 if !(d != 0) { 6276 break 6277 } 6278 v.reset(OpConst16) 6279 v.AuxInt = int64(int16(uint16(c) / uint16(d))) 6280 return true 6281 } 6282 // match: (Div16u n (Const16 [c])) 6283 // cond: isPowerOfTwo(c&0xffff) 6284 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 6285 for { 6286 _ = v.Args[1] 6287 n := v.Args[0] 6288 v_1 := v.Args[1] 6289 if v_1.Op != OpConst16 { 6290 break 6291 } 6292 c := v_1.AuxInt 6293 if !(isPowerOfTwo(c & 0xffff)) { 6294 break 6295 } 6296 v.reset(OpRsh16Ux64) 6297 v.AddArg(n) 6298 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6299 v0.AuxInt = log2(c & 0xffff) 6300 v.AddArg(v0) 6301 return true 6302 } 6303 // match: (Div16u x (Const16 [c])) 6304 // cond: umagicOK(16, c) && config.RegSize == 8 6305 // 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]))) 6306 for { 6307 _ = v.Args[1] 6308 x := v.Args[0] 6309 v_1 := v.Args[1] 6310 if v_1.Op != OpConst16 { 6311 break 6312 } 6313 c := v_1.AuxInt 6314 if !(umagicOK(16, c) && config.RegSize == 8) { 6315 break 6316 } 6317 v.reset(OpTrunc64to16) 6318 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6319 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6320 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6321 v2.AuxInt = int64(1<<16 + umagic(16, c).m) 6322 v1.AddArg(v2) 6323 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) 6324 v3.AddArg(x) 6325 v1.AddArg(v3) 6326 v0.AddArg(v1) 6327 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6328 v4.AuxInt = 16 + umagic(16, c).s 6329 v0.AddArg(v4) 6330 v.AddArg(v0) 6331 return true 6332 } 6333 // match: (Div16u x (Const16 [c])) 6334 // cond: umagicOK(16, c) && config.RegSize == 4 && umagic(16,c).m&1 == 0 6335 // 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]))) 6336 for { 6337 _ = v.Args[1] 6338 x := v.Args[0] 6339 v_1 := v.Args[1] 6340 if v_1.Op != OpConst16 { 6341 break 6342 } 6343 c := v_1.AuxInt 6344 if !(umagicOK(16, c) && config.RegSize == 4 && umagic(16, c).m&1 == 0) { 6345 break 6346 } 6347 v.reset(OpTrunc32to16) 6348 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6349 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 6350 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6351 v2.AuxInt = int64(1<<15 + umagic(16, c).m/2) 6352 v1.AddArg(v2) 6353 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 6354 v3.AddArg(x) 6355 v1.AddArg(v3) 6356 v0.AddArg(v1) 6357 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6358 v4.AuxInt = 16 + umagic(16, c).s - 1 6359 v0.AddArg(v4) 6360 v.AddArg(v0) 6361 return true 6362 } 6363 // match: (Div16u x (Const16 [c])) 6364 // cond: umagicOK(16, c) && config.RegSize == 4 && c&1 == 0 6365 // 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]))) 6366 for { 6367 _ = v.Args[1] 6368 x := v.Args[0] 6369 v_1 := v.Args[1] 6370 if v_1.Op != OpConst16 { 6371 break 6372 } 6373 c := v_1.AuxInt 6374 if !(umagicOK(16, c) && config.RegSize == 4 && c&1 == 0) { 6375 break 6376 } 6377 v.reset(OpTrunc32to16) 6378 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6379 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 6380 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6381 v2.AuxInt = int64(1<<15 + (umagic(16, c).m+1)/2) 6382 v1.AddArg(v2) 6383 v3 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6384 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 6385 v4.AddArg(x) 6386 v3.AddArg(v4) 6387 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6388 v5.AuxInt = 1 6389 v3.AddArg(v5) 6390 v1.AddArg(v3) 6391 v0.AddArg(v1) 6392 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6393 v6.AuxInt = 16 + umagic(16, c).s - 2 6394 v0.AddArg(v6) 6395 v.AddArg(v0) 6396 return true 6397 } 6398 // match: (Div16u x (Const16 [c])) 6399 // cond: umagicOK(16, c) && config.RegSize == 4 6400 // 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]))) 6401 for { 6402 _ = v.Args[1] 6403 x := v.Args[0] 6404 v_1 := v.Args[1] 6405 if v_1.Op != OpConst16 { 6406 break 6407 } 6408 c := v_1.AuxInt 6409 if !(umagicOK(16, c) && config.RegSize == 4) { 6410 break 6411 } 6412 v.reset(OpTrunc32to16) 6413 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6414 v1 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 6415 v2 := b.NewValue0(v.Pos, OpLsh32x64, typ.UInt32) 6416 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 6417 v3.AddArg(x) 6418 v2.AddArg(v3) 6419 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6420 v4.AuxInt = 16 6421 v2.AddArg(v4) 6422 v1.AddArg(v2) 6423 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 6424 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6425 v6.AuxInt = int64(umagic(16, c).m) 6426 v5.AddArg(v6) 6427 v7 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 6428 v7.AddArg(x) 6429 v5.AddArg(v7) 6430 v1.AddArg(v5) 6431 v0.AddArg(v1) 6432 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6433 v8.AuxInt = 16 + umagic(16, c).s - 1 6434 v0.AddArg(v8) 6435 v.AddArg(v0) 6436 return true 6437 } 6438 return false 6439 } 6440 func rewriteValuegeneric_OpDiv32_0(v *Value) bool { 6441 b := v.Block 6442 _ = b 6443 config := b.Func.Config 6444 _ = config 6445 typ := &b.Func.Config.Types 6446 _ = typ 6447 // match: (Div32 (Const32 [c]) (Const32 [d])) 6448 // cond: d != 0 6449 // result: (Const32 [int64(int32(c)/int32(d))]) 6450 for { 6451 _ = v.Args[1] 6452 v_0 := v.Args[0] 6453 if v_0.Op != OpConst32 { 6454 break 6455 } 6456 c := v_0.AuxInt 6457 v_1 := v.Args[1] 6458 if v_1.Op != OpConst32 { 6459 break 6460 } 6461 d := v_1.AuxInt 6462 if !(d != 0) { 6463 break 6464 } 6465 v.reset(OpConst32) 6466 v.AuxInt = int64(int32(c) / int32(d)) 6467 return true 6468 } 6469 // match: (Div32 <t> n (Const32 [c])) 6470 // cond: c < 0 && c != -1<<31 6471 // result: (Neg32 (Div32 <t> n (Const32 <t> [-c]))) 6472 for { 6473 t := v.Type 6474 _ = v.Args[1] 6475 n := v.Args[0] 6476 v_1 := v.Args[1] 6477 if v_1.Op != OpConst32 { 6478 break 6479 } 6480 c := v_1.AuxInt 6481 if !(c < 0 && c != -1<<31) { 6482 break 6483 } 6484 v.reset(OpNeg32) 6485 v0 := b.NewValue0(v.Pos, OpDiv32, t) 6486 v0.AddArg(n) 6487 v1 := b.NewValue0(v.Pos, OpConst32, t) 6488 v1.AuxInt = -c 6489 v0.AddArg(v1) 6490 v.AddArg(v0) 6491 return true 6492 } 6493 // match: (Div32 <t> x (Const32 [-1<<31])) 6494 // cond: 6495 // result: (Rsh32Ux64 (And32 <t> x (Neg32 <t> x)) (Const64 <typ.UInt64> [31])) 6496 for { 6497 t := v.Type 6498 _ = v.Args[1] 6499 x := v.Args[0] 6500 v_1 := v.Args[1] 6501 if v_1.Op != OpConst32 { 6502 break 6503 } 6504 if v_1.AuxInt != -1<<31 { 6505 break 6506 } 6507 v.reset(OpRsh32Ux64) 6508 v0 := b.NewValue0(v.Pos, OpAnd32, t) 6509 v0.AddArg(x) 6510 v1 := b.NewValue0(v.Pos, OpNeg32, t) 6511 v1.AddArg(x) 6512 v0.AddArg(v1) 6513 v.AddArg(v0) 6514 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6515 v2.AuxInt = 31 6516 v.AddArg(v2) 6517 return true 6518 } 6519 // match: (Div32 <t> n (Const32 [c])) 6520 // cond: isPowerOfTwo(c) 6521 // 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)])) 6522 for { 6523 t := v.Type 6524 _ = v.Args[1] 6525 n := v.Args[0] 6526 v_1 := v.Args[1] 6527 if v_1.Op != OpConst32 { 6528 break 6529 } 6530 c := v_1.AuxInt 6531 if !(isPowerOfTwo(c)) { 6532 break 6533 } 6534 v.reset(OpRsh32x64) 6535 v0 := b.NewValue0(v.Pos, OpAdd32, t) 6536 v0.AddArg(n) 6537 v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) 6538 v2 := b.NewValue0(v.Pos, OpRsh32x64, t) 6539 v2.AddArg(n) 6540 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6541 v3.AuxInt = 31 6542 v2.AddArg(v3) 6543 v1.AddArg(v2) 6544 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6545 v4.AuxInt = 32 - log2(c) 6546 v1.AddArg(v4) 6547 v0.AddArg(v1) 6548 v.AddArg(v0) 6549 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6550 v5.AuxInt = log2(c) 6551 v.AddArg(v5) 6552 return true 6553 } 6554 // match: (Div32 <t> x (Const32 [c])) 6555 // cond: smagicOK(32,c) && config.RegSize == 8 6556 // 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]))) 6557 for { 6558 t := v.Type 6559 _ = v.Args[1] 6560 x := v.Args[0] 6561 v_1 := v.Args[1] 6562 if v_1.Op != OpConst32 { 6563 break 6564 } 6565 c := v_1.AuxInt 6566 if !(smagicOK(32, c) && config.RegSize == 8) { 6567 break 6568 } 6569 v.reset(OpSub32) 6570 v.Type = t 6571 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 6572 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6573 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6574 v2.AuxInt = int64(smagic(32, c).m) 6575 v1.AddArg(v2) 6576 v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 6577 v3.AddArg(x) 6578 v1.AddArg(v3) 6579 v0.AddArg(v1) 6580 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6581 v4.AuxInt = 32 + smagic(32, c).s 6582 v0.AddArg(v4) 6583 v.AddArg(v0) 6584 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 6585 v6 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 6586 v6.AddArg(x) 6587 v5.AddArg(v6) 6588 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6589 v7.AuxInt = 63 6590 v5.AddArg(v7) 6591 v.AddArg(v5) 6592 return true 6593 } 6594 // match: (Div32 <t> x (Const32 [c])) 6595 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 6596 // 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]))) 6597 for { 6598 t := v.Type 6599 _ = v.Args[1] 6600 x := v.Args[0] 6601 v_1 := v.Args[1] 6602 if v_1.Op != OpConst32 { 6603 break 6604 } 6605 c := v_1.AuxInt 6606 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0) { 6607 break 6608 } 6609 v.reset(OpSub32) 6610 v.Type = t 6611 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 6612 v1 := b.NewValue0(v.Pos, OpHmul32, t) 6613 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6614 v2.AuxInt = int64(int32(smagic(32, c).m / 2)) 6615 v1.AddArg(v2) 6616 v1.AddArg(x) 6617 v0.AddArg(v1) 6618 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6619 v3.AuxInt = smagic(32, c).s - 1 6620 v0.AddArg(v3) 6621 v.AddArg(v0) 6622 v4 := b.NewValue0(v.Pos, OpRsh32x64, t) 6623 v4.AddArg(x) 6624 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6625 v5.AuxInt = 31 6626 v4.AddArg(v5) 6627 v.AddArg(v4) 6628 return true 6629 } 6630 // match: (Div32 <t> x (Const32 [c])) 6631 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 6632 // 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]))) 6633 for { 6634 t := v.Type 6635 _ = v.Args[1] 6636 x := v.Args[0] 6637 v_1 := v.Args[1] 6638 if v_1.Op != OpConst32 { 6639 break 6640 } 6641 c := v_1.AuxInt 6642 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0) { 6643 break 6644 } 6645 v.reset(OpSub32) 6646 v.Type = t 6647 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 6648 v1 := b.NewValue0(v.Pos, OpAdd32, t) 6649 v2 := b.NewValue0(v.Pos, OpHmul32, t) 6650 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6651 v3.AuxInt = int64(int32(smagic(32, c).m)) 6652 v2.AddArg(v3) 6653 v2.AddArg(x) 6654 v1.AddArg(v2) 6655 v1.AddArg(x) 6656 v0.AddArg(v1) 6657 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6658 v4.AuxInt = smagic(32, c).s 6659 v0.AddArg(v4) 6660 v.AddArg(v0) 6661 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 6662 v5.AddArg(x) 6663 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6664 v6.AuxInt = 31 6665 v5.AddArg(v6) 6666 v.AddArg(v5) 6667 return true 6668 } 6669 return false 6670 } 6671 func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { 6672 b := v.Block 6673 _ = b 6674 // match: (Div32F (Const32F [c]) (Const32F [d])) 6675 // cond: 6676 // result: (Const32F [f2i(float64(i2f32(c) / i2f32(d)))]) 6677 for { 6678 _ = v.Args[1] 6679 v_0 := v.Args[0] 6680 if v_0.Op != OpConst32F { 6681 break 6682 } 6683 c := v_0.AuxInt 6684 v_1 := v.Args[1] 6685 if v_1.Op != OpConst32F { 6686 break 6687 } 6688 d := v_1.AuxInt 6689 v.reset(OpConst32F) 6690 v.AuxInt = f2i(float64(i2f32(c) / i2f32(d))) 6691 return true 6692 } 6693 // match: (Div32F x (Const32F <t> [c])) 6694 // cond: reciprocalExact32(float32(i2f(c))) 6695 // result: (Mul32F x (Const32F <t> [f2i(1/i2f(c))])) 6696 for { 6697 _ = v.Args[1] 6698 x := v.Args[0] 6699 v_1 := v.Args[1] 6700 if v_1.Op != OpConst32F { 6701 break 6702 } 6703 t := v_1.Type 6704 c := v_1.AuxInt 6705 if !(reciprocalExact32(float32(i2f(c)))) { 6706 break 6707 } 6708 v.reset(OpMul32F) 6709 v.AddArg(x) 6710 v0 := b.NewValue0(v.Pos, OpConst32F, t) 6711 v0.AuxInt = f2i(1 / i2f(c)) 6712 v.AddArg(v0) 6713 return true 6714 } 6715 return false 6716 } 6717 func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { 6718 b := v.Block 6719 _ = b 6720 config := b.Func.Config 6721 _ = config 6722 typ := &b.Func.Config.Types 6723 _ = typ 6724 // match: (Div32u (Const32 [c]) (Const32 [d])) 6725 // cond: d != 0 6726 // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) 6727 for { 6728 _ = v.Args[1] 6729 v_0 := v.Args[0] 6730 if v_0.Op != OpConst32 { 6731 break 6732 } 6733 c := v_0.AuxInt 6734 v_1 := v.Args[1] 6735 if v_1.Op != OpConst32 { 6736 break 6737 } 6738 d := v_1.AuxInt 6739 if !(d != 0) { 6740 break 6741 } 6742 v.reset(OpConst32) 6743 v.AuxInt = int64(int32(uint32(c) / uint32(d))) 6744 return true 6745 } 6746 // match: (Div32u n (Const32 [c])) 6747 // cond: isPowerOfTwo(c&0xffffffff) 6748 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 6749 for { 6750 _ = v.Args[1] 6751 n := v.Args[0] 6752 v_1 := v.Args[1] 6753 if v_1.Op != OpConst32 { 6754 break 6755 } 6756 c := v_1.AuxInt 6757 if !(isPowerOfTwo(c & 0xffffffff)) { 6758 break 6759 } 6760 v.reset(OpRsh32Ux64) 6761 v.AddArg(n) 6762 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6763 v0.AuxInt = log2(c & 0xffffffff) 6764 v.AddArg(v0) 6765 return true 6766 } 6767 // match: (Div32u x (Const32 [c])) 6768 // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 6769 // 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])) 6770 for { 6771 _ = v.Args[1] 6772 x := v.Args[0] 6773 v_1 := v.Args[1] 6774 if v_1.Op != OpConst32 { 6775 break 6776 } 6777 c := v_1.AuxInt 6778 if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0) { 6779 break 6780 } 6781 v.reset(OpRsh32Ux64) 6782 v.Type = typ.UInt32 6783 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 6784 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6785 v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) 6786 v0.AddArg(v1) 6787 v0.AddArg(x) 6788 v.AddArg(v0) 6789 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6790 v2.AuxInt = umagic(32, c).s - 1 6791 v.AddArg(v2) 6792 return true 6793 } 6794 // match: (Div32u x (Const32 [c])) 6795 // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 6796 // 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])) 6797 for { 6798 _ = v.Args[1] 6799 x := v.Args[0] 6800 v_1 := v.Args[1] 6801 if v_1.Op != OpConst32 { 6802 break 6803 } 6804 c := v_1.AuxInt 6805 if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0) { 6806 break 6807 } 6808 v.reset(OpRsh32Ux64) 6809 v.Type = typ.UInt32 6810 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 6811 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6812 v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) 6813 v0.AddArg(v1) 6814 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 6815 v2.AddArg(x) 6816 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6817 v3.AuxInt = 1 6818 v2.AddArg(v3) 6819 v0.AddArg(v2) 6820 v.AddArg(v0) 6821 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6822 v4.AuxInt = umagic(32, c).s - 2 6823 v.AddArg(v4) 6824 return true 6825 } 6826 // match: (Div32u x (Const32 [c])) 6827 // cond: umagicOK(32, c) && config.RegSize == 4 6828 // 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])) 6829 for { 6830 _ = v.Args[1] 6831 x := v.Args[0] 6832 v_1 := v.Args[1] 6833 if v_1.Op != OpConst32 { 6834 break 6835 } 6836 c := v_1.AuxInt 6837 if !(umagicOK(32, c) && config.RegSize == 4) { 6838 break 6839 } 6840 v.reset(OpRsh32Ux64) 6841 v.Type = typ.UInt32 6842 v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 6843 v0.AddArg(x) 6844 v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 6845 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 6846 v2.AuxInt = int64(int32(umagic(32, c).m)) 6847 v1.AddArg(v2) 6848 v1.AddArg(x) 6849 v0.AddArg(v1) 6850 v.AddArg(v0) 6851 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6852 v3.AuxInt = umagic(32, c).s - 1 6853 v.AddArg(v3) 6854 return true 6855 } 6856 // match: (Div32u x (Const32 [c])) 6857 // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 6858 // 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]))) 6859 for { 6860 _ = v.Args[1] 6861 x := v.Args[0] 6862 v_1 := v.Args[1] 6863 if v_1.Op != OpConst32 { 6864 break 6865 } 6866 c := v_1.AuxInt 6867 if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { 6868 break 6869 } 6870 v.reset(OpTrunc64to32) 6871 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6872 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6873 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6874 v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) 6875 v1.AddArg(v2) 6876 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 6877 v3.AddArg(x) 6878 v1.AddArg(v3) 6879 v0.AddArg(v1) 6880 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6881 v4.AuxInt = 32 + umagic(32, c).s - 1 6882 v0.AddArg(v4) 6883 v.AddArg(v0) 6884 return true 6885 } 6886 // match: (Div32u x (Const32 [c])) 6887 // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 6888 // 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]))) 6889 for { 6890 _ = v.Args[1] 6891 x := v.Args[0] 6892 v_1 := v.Args[1] 6893 if v_1.Op != OpConst32 { 6894 break 6895 } 6896 c := v_1.AuxInt 6897 if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { 6898 break 6899 } 6900 v.reset(OpTrunc64to32) 6901 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6902 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6903 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6904 v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) 6905 v1.AddArg(v2) 6906 v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6907 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 6908 v4.AddArg(x) 6909 v3.AddArg(v4) 6910 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6911 v5.AuxInt = 1 6912 v3.AddArg(v5) 6913 v1.AddArg(v3) 6914 v0.AddArg(v1) 6915 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6916 v6.AuxInt = 32 + umagic(32, c).s - 2 6917 v0.AddArg(v6) 6918 v.AddArg(v0) 6919 return true 6920 } 6921 // match: (Div32u x (Const32 [c])) 6922 // cond: umagicOK(32, c) && config.RegSize == 8 6923 // 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]))) 6924 for { 6925 _ = v.Args[1] 6926 x := v.Args[0] 6927 v_1 := v.Args[1] 6928 if v_1.Op != OpConst32 { 6929 break 6930 } 6931 c := v_1.AuxInt 6932 if !(umagicOK(32, c) && config.RegSize == 8) { 6933 break 6934 } 6935 v.reset(OpTrunc64to32) 6936 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 6937 v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 6938 v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64) 6939 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 6940 v3.AddArg(x) 6941 v2.AddArg(v3) 6942 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6943 v4.AuxInt = 32 6944 v2.AddArg(v4) 6945 v1.AddArg(v2) 6946 v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 6947 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32) 6948 v6.AuxInt = int64(umagic(32, c).m) 6949 v5.AddArg(v6) 6950 v7 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 6951 v7.AddArg(x) 6952 v5.AddArg(v7) 6953 v1.AddArg(v5) 6954 v0.AddArg(v1) 6955 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 6956 v8.AuxInt = 32 + umagic(32, c).s - 1 6957 v0.AddArg(v8) 6958 v.AddArg(v0) 6959 return true 6960 } 6961 return false 6962 } 6963 func rewriteValuegeneric_OpDiv64_0(v *Value) bool { 6964 b := v.Block 6965 _ = b 6966 typ := &b.Func.Config.Types 6967 _ = typ 6968 // match: (Div64 (Const64 [c]) (Const64 [d])) 6969 // cond: d != 0 6970 // result: (Const64 [c/d]) 6971 for { 6972 _ = v.Args[1] 6973 v_0 := v.Args[0] 6974 if v_0.Op != OpConst64 { 6975 break 6976 } 6977 c := v_0.AuxInt 6978 v_1 := v.Args[1] 6979 if v_1.Op != OpConst64 { 6980 break 6981 } 6982 d := v_1.AuxInt 6983 if !(d != 0) { 6984 break 6985 } 6986 v.reset(OpConst64) 6987 v.AuxInt = c / d 6988 return true 6989 } 6990 // match: (Div64 <t> n (Const64 [c])) 6991 // cond: c < 0 && c != -1<<63 6992 // result: (Neg64 (Div64 <t> n (Const64 <t> [-c]))) 6993 for { 6994 t := v.Type 6995 _ = v.Args[1] 6996 n := v.Args[0] 6997 v_1 := v.Args[1] 6998 if v_1.Op != OpConst64 { 6999 break 7000 } 7001 c := v_1.AuxInt 7002 if !(c < 0 && c != -1<<63) { 7003 break 7004 } 7005 v.reset(OpNeg64) 7006 v0 := b.NewValue0(v.Pos, OpDiv64, t) 7007 v0.AddArg(n) 7008 v1 := b.NewValue0(v.Pos, OpConst64, t) 7009 v1.AuxInt = -c 7010 v0.AddArg(v1) 7011 v.AddArg(v0) 7012 return true 7013 } 7014 // match: (Div64 <t> x (Const64 [-1<<63])) 7015 // cond: 7016 // result: (Rsh64Ux64 (And64 <t> x (Neg64 <t> x)) (Const64 <typ.UInt64> [63])) 7017 for { 7018 t := v.Type 7019 _ = v.Args[1] 7020 x := v.Args[0] 7021 v_1 := v.Args[1] 7022 if v_1.Op != OpConst64 { 7023 break 7024 } 7025 if v_1.AuxInt != -1<<63 { 7026 break 7027 } 7028 v.reset(OpRsh64Ux64) 7029 v0 := b.NewValue0(v.Pos, OpAnd64, t) 7030 v0.AddArg(x) 7031 v1 := b.NewValue0(v.Pos, OpNeg64, t) 7032 v1.AddArg(x) 7033 v0.AddArg(v1) 7034 v.AddArg(v0) 7035 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7036 v2.AuxInt = 63 7037 v.AddArg(v2) 7038 return true 7039 } 7040 // match: (Div64 <t> n (Const64 [c])) 7041 // cond: isPowerOfTwo(c) 7042 // 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)])) 7043 for { 7044 t := v.Type 7045 _ = v.Args[1] 7046 n := v.Args[0] 7047 v_1 := v.Args[1] 7048 if v_1.Op != OpConst64 { 7049 break 7050 } 7051 c := v_1.AuxInt 7052 if !(isPowerOfTwo(c)) { 7053 break 7054 } 7055 v.reset(OpRsh64x64) 7056 v0 := b.NewValue0(v.Pos, OpAdd64, t) 7057 v0.AddArg(n) 7058 v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 7059 v2 := b.NewValue0(v.Pos, OpRsh64x64, t) 7060 v2.AddArg(n) 7061 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7062 v3.AuxInt = 63 7063 v2.AddArg(v3) 7064 v1.AddArg(v2) 7065 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7066 v4.AuxInt = 64 - log2(c) 7067 v1.AddArg(v4) 7068 v0.AddArg(v1) 7069 v.AddArg(v0) 7070 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7071 v5.AuxInt = log2(c) 7072 v.AddArg(v5) 7073 return true 7074 } 7075 // match: (Div64 <t> x (Const64 [c])) 7076 // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 7077 // 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]))) 7078 for { 7079 t := v.Type 7080 _ = v.Args[1] 7081 x := v.Args[0] 7082 v_1 := v.Args[1] 7083 if v_1.Op != OpConst64 { 7084 break 7085 } 7086 c := v_1.AuxInt 7087 if !(smagicOK(64, c) && smagic(64, c).m&1 == 0) { 7088 break 7089 } 7090 v.reset(OpSub64) 7091 v.Type = t 7092 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 7093 v1 := b.NewValue0(v.Pos, OpHmul64, t) 7094 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7095 v2.AuxInt = int64(smagic(64, c).m / 2) 7096 v1.AddArg(v2) 7097 v1.AddArg(x) 7098 v0.AddArg(v1) 7099 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7100 v3.AuxInt = smagic(64, c).s - 1 7101 v0.AddArg(v3) 7102 v.AddArg(v0) 7103 v4 := b.NewValue0(v.Pos, OpRsh64x64, t) 7104 v4.AddArg(x) 7105 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7106 v5.AuxInt = 63 7107 v4.AddArg(v5) 7108 v.AddArg(v4) 7109 return true 7110 } 7111 // match: (Div64 <t> x (Const64 [c])) 7112 // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 7113 // 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]))) 7114 for { 7115 t := v.Type 7116 _ = v.Args[1] 7117 x := v.Args[0] 7118 v_1 := v.Args[1] 7119 if v_1.Op != OpConst64 { 7120 break 7121 } 7122 c := v_1.AuxInt 7123 if !(smagicOK(64, c) && smagic(64, c).m&1 != 0) { 7124 break 7125 } 7126 v.reset(OpSub64) 7127 v.Type = t 7128 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 7129 v1 := b.NewValue0(v.Pos, OpAdd64, t) 7130 v2 := b.NewValue0(v.Pos, OpHmul64, t) 7131 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7132 v3.AuxInt = int64(smagic(64, c).m) 7133 v2.AddArg(v3) 7134 v2.AddArg(x) 7135 v1.AddArg(v2) 7136 v1.AddArg(x) 7137 v0.AddArg(v1) 7138 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7139 v4.AuxInt = smagic(64, c).s 7140 v0.AddArg(v4) 7141 v.AddArg(v0) 7142 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 7143 v5.AddArg(x) 7144 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7145 v6.AuxInt = 63 7146 v5.AddArg(v6) 7147 v.AddArg(v5) 7148 return true 7149 } 7150 return false 7151 } 7152 func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { 7153 b := v.Block 7154 _ = b 7155 // match: (Div64F (Const64F [c]) (Const64F [d])) 7156 // cond: 7157 // result: (Const64F [f2i(i2f(c) / i2f(d))]) 7158 for { 7159 _ = v.Args[1] 7160 v_0 := v.Args[0] 7161 if v_0.Op != OpConst64F { 7162 break 7163 } 7164 c := v_0.AuxInt 7165 v_1 := v.Args[1] 7166 if v_1.Op != OpConst64F { 7167 break 7168 } 7169 d := v_1.AuxInt 7170 v.reset(OpConst64F) 7171 v.AuxInt = f2i(i2f(c) / i2f(d)) 7172 return true 7173 } 7174 // match: (Div64F x (Const64F <t> [c])) 7175 // cond: reciprocalExact64(i2f(c)) 7176 // result: (Mul64F x (Const64F <t> [f2i(1/i2f(c))])) 7177 for { 7178 _ = v.Args[1] 7179 x := v.Args[0] 7180 v_1 := v.Args[1] 7181 if v_1.Op != OpConst64F { 7182 break 7183 } 7184 t := v_1.Type 7185 c := v_1.AuxInt 7186 if !(reciprocalExact64(i2f(c))) { 7187 break 7188 } 7189 v.reset(OpMul64F) 7190 v.AddArg(x) 7191 v0 := b.NewValue0(v.Pos, OpConst64F, t) 7192 v0.AuxInt = f2i(1 / i2f(c)) 7193 v.AddArg(v0) 7194 return true 7195 } 7196 return false 7197 } 7198 func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { 7199 b := v.Block 7200 _ = b 7201 config := b.Func.Config 7202 _ = config 7203 typ := &b.Func.Config.Types 7204 _ = typ 7205 // match: (Div64u (Const64 [c]) (Const64 [d])) 7206 // cond: d != 0 7207 // result: (Const64 [int64(uint64(c)/uint64(d))]) 7208 for { 7209 _ = v.Args[1] 7210 v_0 := v.Args[0] 7211 if v_0.Op != OpConst64 { 7212 break 7213 } 7214 c := v_0.AuxInt 7215 v_1 := v.Args[1] 7216 if v_1.Op != OpConst64 { 7217 break 7218 } 7219 d := v_1.AuxInt 7220 if !(d != 0) { 7221 break 7222 } 7223 v.reset(OpConst64) 7224 v.AuxInt = int64(uint64(c) / uint64(d)) 7225 return true 7226 } 7227 // match: (Div64u n (Const64 [c])) 7228 // cond: isPowerOfTwo(c) 7229 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 7230 for { 7231 _ = v.Args[1] 7232 n := v.Args[0] 7233 v_1 := v.Args[1] 7234 if v_1.Op != OpConst64 { 7235 break 7236 } 7237 c := v_1.AuxInt 7238 if !(isPowerOfTwo(c)) { 7239 break 7240 } 7241 v.reset(OpRsh64Ux64) 7242 v.AddArg(n) 7243 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7244 v0.AuxInt = log2(c) 7245 v.AddArg(v0) 7246 return true 7247 } 7248 // match: (Div64u n (Const64 [-1<<63])) 7249 // cond: 7250 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [63])) 7251 for { 7252 _ = v.Args[1] 7253 n := v.Args[0] 7254 v_1 := v.Args[1] 7255 if v_1.Op != OpConst64 { 7256 break 7257 } 7258 if v_1.AuxInt != -1<<63 { 7259 break 7260 } 7261 v.reset(OpRsh64Ux64) 7262 v.AddArg(n) 7263 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7264 v0.AuxInt = 63 7265 v.AddArg(v0) 7266 return true 7267 } 7268 // match: (Div64u x (Const64 [c])) 7269 // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 7270 // 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])) 7271 for { 7272 _ = v.Args[1] 7273 x := v.Args[0] 7274 v_1 := v.Args[1] 7275 if v_1.Op != OpConst64 { 7276 break 7277 } 7278 c := v_1.AuxInt 7279 if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) { 7280 break 7281 } 7282 v.reset(OpRsh64Ux64) 7283 v.Type = typ.UInt64 7284 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 7285 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7286 v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) 7287 v0.AddArg(v1) 7288 v0.AddArg(x) 7289 v.AddArg(v0) 7290 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7291 v2.AuxInt = umagic(64, c).s - 1 7292 v.AddArg(v2) 7293 return true 7294 } 7295 // match: (Div64u x (Const64 [c])) 7296 // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 7297 // 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])) 7298 for { 7299 _ = v.Args[1] 7300 x := v.Args[0] 7301 v_1 := v.Args[1] 7302 if v_1.Op != OpConst64 { 7303 break 7304 } 7305 c := v_1.AuxInt 7306 if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) { 7307 break 7308 } 7309 v.reset(OpRsh64Ux64) 7310 v.Type = typ.UInt64 7311 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 7312 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7313 v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) 7314 v0.AddArg(v1) 7315 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7316 v2.AddArg(x) 7317 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7318 v3.AuxInt = 1 7319 v2.AddArg(v3) 7320 v0.AddArg(v2) 7321 v.AddArg(v0) 7322 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7323 v4.AuxInt = umagic(64, c).s - 2 7324 v.AddArg(v4) 7325 return true 7326 } 7327 // match: (Div64u x (Const64 [c])) 7328 // cond: umagicOK(64, c) && config.RegSize == 8 7329 // 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])) 7330 for { 7331 _ = v.Args[1] 7332 x := v.Args[0] 7333 v_1 := v.Args[1] 7334 if v_1.Op != OpConst64 { 7335 break 7336 } 7337 c := v_1.AuxInt 7338 if !(umagicOK(64, c) && config.RegSize == 8) { 7339 break 7340 } 7341 v.reset(OpRsh64Ux64) 7342 v.Type = typ.UInt64 7343 v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 7344 v0.AddArg(x) 7345 v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 7346 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7347 v2.AuxInt = int64(umagic(64, c).m) 7348 v1.AddArg(v2) 7349 v1.AddArg(x) 7350 v0.AddArg(v1) 7351 v.AddArg(v0) 7352 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7353 v3.AuxInt = umagic(64, c).s - 1 7354 v.AddArg(v3) 7355 return true 7356 } 7357 return false 7358 } 7359 func rewriteValuegeneric_OpDiv8_0(v *Value) bool { 7360 b := v.Block 7361 _ = b 7362 typ := &b.Func.Config.Types 7363 _ = typ 7364 // match: (Div8 (Const8 [c]) (Const8 [d])) 7365 // cond: d != 0 7366 // result: (Const8 [int64(int8(c)/int8(d))]) 7367 for { 7368 _ = v.Args[1] 7369 v_0 := v.Args[0] 7370 if v_0.Op != OpConst8 { 7371 break 7372 } 7373 c := v_0.AuxInt 7374 v_1 := v.Args[1] 7375 if v_1.Op != OpConst8 { 7376 break 7377 } 7378 d := v_1.AuxInt 7379 if !(d != 0) { 7380 break 7381 } 7382 v.reset(OpConst8) 7383 v.AuxInt = int64(int8(c) / int8(d)) 7384 return true 7385 } 7386 // match: (Div8 <t> n (Const8 [c])) 7387 // cond: c < 0 && c != -1<<7 7388 // result: (Neg8 (Div8 <t> n (Const8 <t> [-c]))) 7389 for { 7390 t := v.Type 7391 _ = v.Args[1] 7392 n := v.Args[0] 7393 v_1 := v.Args[1] 7394 if v_1.Op != OpConst8 { 7395 break 7396 } 7397 c := v_1.AuxInt 7398 if !(c < 0 && c != -1<<7) { 7399 break 7400 } 7401 v.reset(OpNeg8) 7402 v0 := b.NewValue0(v.Pos, OpDiv8, t) 7403 v0.AddArg(n) 7404 v1 := b.NewValue0(v.Pos, OpConst8, t) 7405 v1.AuxInt = -c 7406 v0.AddArg(v1) 7407 v.AddArg(v0) 7408 return true 7409 } 7410 // match: (Div8 <t> x (Const8 [-1<<7 ])) 7411 // cond: 7412 // result: (Rsh8Ux64 (And8 <t> x (Neg8 <t> x)) (Const64 <typ.UInt64> [7 ])) 7413 for { 7414 t := v.Type 7415 _ = v.Args[1] 7416 x := v.Args[0] 7417 v_1 := v.Args[1] 7418 if v_1.Op != OpConst8 { 7419 break 7420 } 7421 if v_1.AuxInt != -1<<7 { 7422 break 7423 } 7424 v.reset(OpRsh8Ux64) 7425 v0 := b.NewValue0(v.Pos, OpAnd8, t) 7426 v0.AddArg(x) 7427 v1 := b.NewValue0(v.Pos, OpNeg8, t) 7428 v1.AddArg(x) 7429 v0.AddArg(v1) 7430 v.AddArg(v0) 7431 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7432 v2.AuxInt = 7 7433 v.AddArg(v2) 7434 return true 7435 } 7436 // match: (Div8 <t> n (Const8 [c])) 7437 // cond: isPowerOfTwo(c) 7438 // 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)])) 7439 for { 7440 t := v.Type 7441 _ = v.Args[1] 7442 n := v.Args[0] 7443 v_1 := v.Args[1] 7444 if v_1.Op != OpConst8 { 7445 break 7446 } 7447 c := v_1.AuxInt 7448 if !(isPowerOfTwo(c)) { 7449 break 7450 } 7451 v.reset(OpRsh8x64) 7452 v0 := b.NewValue0(v.Pos, OpAdd8, t) 7453 v0.AddArg(n) 7454 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) 7455 v2 := b.NewValue0(v.Pos, OpRsh8x64, t) 7456 v2.AddArg(n) 7457 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7458 v3.AuxInt = 7 7459 v2.AddArg(v3) 7460 v1.AddArg(v2) 7461 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7462 v4.AuxInt = 8 - log2(c) 7463 v1.AddArg(v4) 7464 v0.AddArg(v1) 7465 v.AddArg(v0) 7466 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7467 v5.AuxInt = log2(c) 7468 v.AddArg(v5) 7469 return true 7470 } 7471 // match: (Div8 <t> x (Const8 [c])) 7472 // cond: smagicOK(8,c) 7473 // 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]))) 7474 for { 7475 t := v.Type 7476 _ = v.Args[1] 7477 x := v.Args[0] 7478 v_1 := v.Args[1] 7479 if v_1.Op != OpConst8 { 7480 break 7481 } 7482 c := v_1.AuxInt 7483 if !(smagicOK(8, c)) { 7484 break 7485 } 7486 v.reset(OpSub8) 7487 v.Type = t 7488 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7489 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7490 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7491 v2.AuxInt = int64(smagic(8, c).m) 7492 v1.AddArg(v2) 7493 v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 7494 v3.AddArg(x) 7495 v1.AddArg(v3) 7496 v0.AddArg(v1) 7497 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7498 v4.AuxInt = 8 + smagic(8, c).s 7499 v0.AddArg(v4) 7500 v.AddArg(v0) 7501 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7502 v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 7503 v6.AddArg(x) 7504 v5.AddArg(v6) 7505 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7506 v7.AuxInt = 31 7507 v5.AddArg(v7) 7508 v.AddArg(v5) 7509 return true 7510 } 7511 return false 7512 } 7513 func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { 7514 b := v.Block 7515 _ = b 7516 typ := &b.Func.Config.Types 7517 _ = typ 7518 // match: (Div8u (Const8 [c]) (Const8 [d])) 7519 // cond: d != 0 7520 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) 7521 for { 7522 _ = v.Args[1] 7523 v_0 := v.Args[0] 7524 if v_0.Op != OpConst8 { 7525 break 7526 } 7527 c := v_0.AuxInt 7528 v_1 := v.Args[1] 7529 if v_1.Op != OpConst8 { 7530 break 7531 } 7532 d := v_1.AuxInt 7533 if !(d != 0) { 7534 break 7535 } 7536 v.reset(OpConst8) 7537 v.AuxInt = int64(int8(uint8(c) / uint8(d))) 7538 return true 7539 } 7540 // match: (Div8u n (Const8 [c])) 7541 // cond: isPowerOfTwo(c&0xff) 7542 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 7543 for { 7544 _ = v.Args[1] 7545 n := v.Args[0] 7546 v_1 := v.Args[1] 7547 if v_1.Op != OpConst8 { 7548 break 7549 } 7550 c := v_1.AuxInt 7551 if !(isPowerOfTwo(c & 0xff)) { 7552 break 7553 } 7554 v.reset(OpRsh8Ux64) 7555 v.AddArg(n) 7556 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7557 v0.AuxInt = log2(c & 0xff) 7558 v.AddArg(v0) 7559 return true 7560 } 7561 // match: (Div8u x (Const8 [c])) 7562 // cond: umagicOK(8, c) 7563 // 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]))) 7564 for { 7565 _ = v.Args[1] 7566 x := v.Args[0] 7567 v_1 := v.Args[1] 7568 if v_1.Op != OpConst8 { 7569 break 7570 } 7571 c := v_1.AuxInt 7572 if !(umagicOK(8, c)) { 7573 break 7574 } 7575 v.reset(OpTrunc32to8) 7576 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7577 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7578 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7579 v2.AuxInt = int64(1<<8 + umagic(8, c).m) 7580 v1.AddArg(v2) 7581 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 7582 v3.AddArg(x) 7583 v1.AddArg(v3) 7584 v0.AddArg(v1) 7585 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7586 v4.AuxInt = 8 + umagic(8, c).s 7587 v0.AddArg(v4) 7588 v.AddArg(v0) 7589 return true 7590 } 7591 return false 7592 } 7593 func rewriteValuegeneric_OpEq16_0(v *Value) bool { 7594 b := v.Block 7595 _ = b 7596 // match: (Eq16 x x) 7597 // cond: 7598 // result: (ConstBool [1]) 7599 for { 7600 _ = v.Args[1] 7601 x := v.Args[0] 7602 if x != v.Args[1] { 7603 break 7604 } 7605 v.reset(OpConstBool) 7606 v.AuxInt = 1 7607 return true 7608 } 7609 // match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 7610 // cond: 7611 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7612 for { 7613 _ = v.Args[1] 7614 v_0 := v.Args[0] 7615 if v_0.Op != OpConst16 { 7616 break 7617 } 7618 t := v_0.Type 7619 c := v_0.AuxInt 7620 v_1 := v.Args[1] 7621 if v_1.Op != OpAdd16 { 7622 break 7623 } 7624 _ = v_1.Args[1] 7625 v_1_0 := v_1.Args[0] 7626 if v_1_0.Op != OpConst16 { 7627 break 7628 } 7629 if v_1_0.Type != t { 7630 break 7631 } 7632 d := v_1_0.AuxInt 7633 x := v_1.Args[1] 7634 v.reset(OpEq16) 7635 v0 := b.NewValue0(v.Pos, OpConst16, t) 7636 v0.AuxInt = int64(int16(c - d)) 7637 v.AddArg(v0) 7638 v.AddArg(x) 7639 return true 7640 } 7641 // match: (Eq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 7642 // cond: 7643 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7644 for { 7645 _ = v.Args[1] 7646 v_0 := v.Args[0] 7647 if v_0.Op != OpConst16 { 7648 break 7649 } 7650 t := v_0.Type 7651 c := v_0.AuxInt 7652 v_1 := v.Args[1] 7653 if v_1.Op != OpAdd16 { 7654 break 7655 } 7656 _ = v_1.Args[1] 7657 x := v_1.Args[0] 7658 v_1_1 := v_1.Args[1] 7659 if v_1_1.Op != OpConst16 { 7660 break 7661 } 7662 if v_1_1.Type != t { 7663 break 7664 } 7665 d := v_1_1.AuxInt 7666 v.reset(OpEq16) 7667 v0 := b.NewValue0(v.Pos, OpConst16, t) 7668 v0.AuxInt = int64(int16(c - d)) 7669 v.AddArg(v0) 7670 v.AddArg(x) 7671 return true 7672 } 7673 // match: (Eq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 7674 // cond: 7675 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7676 for { 7677 _ = v.Args[1] 7678 v_0 := v.Args[0] 7679 if v_0.Op != OpAdd16 { 7680 break 7681 } 7682 _ = v_0.Args[1] 7683 v_0_0 := v_0.Args[0] 7684 if v_0_0.Op != OpConst16 { 7685 break 7686 } 7687 t := v_0_0.Type 7688 d := v_0_0.AuxInt 7689 x := v_0.Args[1] 7690 v_1 := v.Args[1] 7691 if v_1.Op != OpConst16 { 7692 break 7693 } 7694 if v_1.Type != t { 7695 break 7696 } 7697 c := v_1.AuxInt 7698 v.reset(OpEq16) 7699 v0 := b.NewValue0(v.Pos, OpConst16, t) 7700 v0.AuxInt = int64(int16(c - d)) 7701 v.AddArg(v0) 7702 v.AddArg(x) 7703 return true 7704 } 7705 // match: (Eq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 7706 // cond: 7707 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 7708 for { 7709 _ = v.Args[1] 7710 v_0 := v.Args[0] 7711 if v_0.Op != OpAdd16 { 7712 break 7713 } 7714 _ = v_0.Args[1] 7715 x := v_0.Args[0] 7716 v_0_1 := v_0.Args[1] 7717 if v_0_1.Op != OpConst16 { 7718 break 7719 } 7720 t := v_0_1.Type 7721 d := v_0_1.AuxInt 7722 v_1 := v.Args[1] 7723 if v_1.Op != OpConst16 { 7724 break 7725 } 7726 if v_1.Type != t { 7727 break 7728 } 7729 c := v_1.AuxInt 7730 v.reset(OpEq16) 7731 v0 := b.NewValue0(v.Pos, OpConst16, t) 7732 v0.AuxInt = int64(int16(c - d)) 7733 v.AddArg(v0) 7734 v.AddArg(x) 7735 return true 7736 } 7737 // match: (Eq16 (Const16 [c]) (Const16 [d])) 7738 // cond: 7739 // result: (ConstBool [b2i(c == d)]) 7740 for { 7741 _ = v.Args[1] 7742 v_0 := v.Args[0] 7743 if v_0.Op != OpConst16 { 7744 break 7745 } 7746 c := v_0.AuxInt 7747 v_1 := v.Args[1] 7748 if v_1.Op != OpConst16 { 7749 break 7750 } 7751 d := v_1.AuxInt 7752 v.reset(OpConstBool) 7753 v.AuxInt = b2i(c == d) 7754 return true 7755 } 7756 // match: (Eq16 (Const16 [d]) (Const16 [c])) 7757 // cond: 7758 // result: (ConstBool [b2i(c == d)]) 7759 for { 7760 _ = v.Args[1] 7761 v_0 := v.Args[0] 7762 if v_0.Op != OpConst16 { 7763 break 7764 } 7765 d := v_0.AuxInt 7766 v_1 := v.Args[1] 7767 if v_1.Op != OpConst16 { 7768 break 7769 } 7770 c := v_1.AuxInt 7771 v.reset(OpConstBool) 7772 v.AuxInt = b2i(c == d) 7773 return true 7774 } 7775 return false 7776 } 7777 func rewriteValuegeneric_OpEq32_0(v *Value) bool { 7778 b := v.Block 7779 _ = b 7780 // match: (Eq32 x x) 7781 // cond: 7782 // result: (ConstBool [1]) 7783 for { 7784 _ = v.Args[1] 7785 x := v.Args[0] 7786 if x != v.Args[1] { 7787 break 7788 } 7789 v.reset(OpConstBool) 7790 v.AuxInt = 1 7791 return true 7792 } 7793 // match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 7794 // cond: 7795 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7796 for { 7797 _ = v.Args[1] 7798 v_0 := v.Args[0] 7799 if v_0.Op != OpConst32 { 7800 break 7801 } 7802 t := v_0.Type 7803 c := v_0.AuxInt 7804 v_1 := v.Args[1] 7805 if v_1.Op != OpAdd32 { 7806 break 7807 } 7808 _ = v_1.Args[1] 7809 v_1_0 := v_1.Args[0] 7810 if v_1_0.Op != OpConst32 { 7811 break 7812 } 7813 if v_1_0.Type != t { 7814 break 7815 } 7816 d := v_1_0.AuxInt 7817 x := v_1.Args[1] 7818 v.reset(OpEq32) 7819 v0 := b.NewValue0(v.Pos, OpConst32, t) 7820 v0.AuxInt = int64(int32(c - d)) 7821 v.AddArg(v0) 7822 v.AddArg(x) 7823 return true 7824 } 7825 // match: (Eq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 7826 // cond: 7827 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7828 for { 7829 _ = v.Args[1] 7830 v_0 := v.Args[0] 7831 if v_0.Op != OpConst32 { 7832 break 7833 } 7834 t := v_0.Type 7835 c := v_0.AuxInt 7836 v_1 := v.Args[1] 7837 if v_1.Op != OpAdd32 { 7838 break 7839 } 7840 _ = v_1.Args[1] 7841 x := v_1.Args[0] 7842 v_1_1 := v_1.Args[1] 7843 if v_1_1.Op != OpConst32 { 7844 break 7845 } 7846 if v_1_1.Type != t { 7847 break 7848 } 7849 d := v_1_1.AuxInt 7850 v.reset(OpEq32) 7851 v0 := b.NewValue0(v.Pos, OpConst32, t) 7852 v0.AuxInt = int64(int32(c - d)) 7853 v.AddArg(v0) 7854 v.AddArg(x) 7855 return true 7856 } 7857 // match: (Eq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 7858 // cond: 7859 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7860 for { 7861 _ = v.Args[1] 7862 v_0 := v.Args[0] 7863 if v_0.Op != OpAdd32 { 7864 break 7865 } 7866 _ = v_0.Args[1] 7867 v_0_0 := v_0.Args[0] 7868 if v_0_0.Op != OpConst32 { 7869 break 7870 } 7871 t := v_0_0.Type 7872 d := v_0_0.AuxInt 7873 x := v_0.Args[1] 7874 v_1 := v.Args[1] 7875 if v_1.Op != OpConst32 { 7876 break 7877 } 7878 if v_1.Type != t { 7879 break 7880 } 7881 c := v_1.AuxInt 7882 v.reset(OpEq32) 7883 v0 := b.NewValue0(v.Pos, OpConst32, t) 7884 v0.AuxInt = int64(int32(c - d)) 7885 v.AddArg(v0) 7886 v.AddArg(x) 7887 return true 7888 } 7889 // match: (Eq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 7890 // cond: 7891 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 7892 for { 7893 _ = v.Args[1] 7894 v_0 := v.Args[0] 7895 if v_0.Op != OpAdd32 { 7896 break 7897 } 7898 _ = v_0.Args[1] 7899 x := v_0.Args[0] 7900 v_0_1 := v_0.Args[1] 7901 if v_0_1.Op != OpConst32 { 7902 break 7903 } 7904 t := v_0_1.Type 7905 d := v_0_1.AuxInt 7906 v_1 := v.Args[1] 7907 if v_1.Op != OpConst32 { 7908 break 7909 } 7910 if v_1.Type != t { 7911 break 7912 } 7913 c := v_1.AuxInt 7914 v.reset(OpEq32) 7915 v0 := b.NewValue0(v.Pos, OpConst32, t) 7916 v0.AuxInt = int64(int32(c - d)) 7917 v.AddArg(v0) 7918 v.AddArg(x) 7919 return true 7920 } 7921 // match: (Eq32 (Const32 [c]) (Const32 [d])) 7922 // cond: 7923 // result: (ConstBool [b2i(c == d)]) 7924 for { 7925 _ = v.Args[1] 7926 v_0 := v.Args[0] 7927 if v_0.Op != OpConst32 { 7928 break 7929 } 7930 c := v_0.AuxInt 7931 v_1 := v.Args[1] 7932 if v_1.Op != OpConst32 { 7933 break 7934 } 7935 d := v_1.AuxInt 7936 v.reset(OpConstBool) 7937 v.AuxInt = b2i(c == d) 7938 return true 7939 } 7940 // match: (Eq32 (Const32 [d]) (Const32 [c])) 7941 // cond: 7942 // result: (ConstBool [b2i(c == d)]) 7943 for { 7944 _ = v.Args[1] 7945 v_0 := v.Args[0] 7946 if v_0.Op != OpConst32 { 7947 break 7948 } 7949 d := v_0.AuxInt 7950 v_1 := v.Args[1] 7951 if v_1.Op != OpConst32 { 7952 break 7953 } 7954 c := v_1.AuxInt 7955 v.reset(OpConstBool) 7956 v.AuxInt = b2i(c == d) 7957 return true 7958 } 7959 return false 7960 } 7961 func rewriteValuegeneric_OpEq64_0(v *Value) bool { 7962 b := v.Block 7963 _ = b 7964 // match: (Eq64 x x) 7965 // cond: 7966 // result: (ConstBool [1]) 7967 for { 7968 _ = v.Args[1] 7969 x := v.Args[0] 7970 if x != v.Args[1] { 7971 break 7972 } 7973 v.reset(OpConstBool) 7974 v.AuxInt = 1 7975 return true 7976 } 7977 // match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 7978 // cond: 7979 // result: (Eq64 (Const64 <t> [c-d]) x) 7980 for { 7981 _ = v.Args[1] 7982 v_0 := v.Args[0] 7983 if v_0.Op != OpConst64 { 7984 break 7985 } 7986 t := v_0.Type 7987 c := v_0.AuxInt 7988 v_1 := v.Args[1] 7989 if v_1.Op != OpAdd64 { 7990 break 7991 } 7992 _ = v_1.Args[1] 7993 v_1_0 := v_1.Args[0] 7994 if v_1_0.Op != OpConst64 { 7995 break 7996 } 7997 if v_1_0.Type != t { 7998 break 7999 } 8000 d := v_1_0.AuxInt 8001 x := v_1.Args[1] 8002 v.reset(OpEq64) 8003 v0 := b.NewValue0(v.Pos, OpConst64, t) 8004 v0.AuxInt = c - d 8005 v.AddArg(v0) 8006 v.AddArg(x) 8007 return true 8008 } 8009 // match: (Eq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 8010 // cond: 8011 // result: (Eq64 (Const64 <t> [c-d]) x) 8012 for { 8013 _ = v.Args[1] 8014 v_0 := v.Args[0] 8015 if v_0.Op != OpConst64 { 8016 break 8017 } 8018 t := v_0.Type 8019 c := v_0.AuxInt 8020 v_1 := v.Args[1] 8021 if v_1.Op != OpAdd64 { 8022 break 8023 } 8024 _ = v_1.Args[1] 8025 x := v_1.Args[0] 8026 v_1_1 := v_1.Args[1] 8027 if v_1_1.Op != OpConst64 { 8028 break 8029 } 8030 if v_1_1.Type != t { 8031 break 8032 } 8033 d := v_1_1.AuxInt 8034 v.reset(OpEq64) 8035 v0 := b.NewValue0(v.Pos, OpConst64, t) 8036 v0.AuxInt = c - d 8037 v.AddArg(v0) 8038 v.AddArg(x) 8039 return true 8040 } 8041 // match: (Eq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 8042 // cond: 8043 // result: (Eq64 (Const64 <t> [c-d]) x) 8044 for { 8045 _ = v.Args[1] 8046 v_0 := v.Args[0] 8047 if v_0.Op != OpAdd64 { 8048 break 8049 } 8050 _ = v_0.Args[1] 8051 v_0_0 := v_0.Args[0] 8052 if v_0_0.Op != OpConst64 { 8053 break 8054 } 8055 t := v_0_0.Type 8056 d := v_0_0.AuxInt 8057 x := v_0.Args[1] 8058 v_1 := v.Args[1] 8059 if v_1.Op != OpConst64 { 8060 break 8061 } 8062 if v_1.Type != t { 8063 break 8064 } 8065 c := v_1.AuxInt 8066 v.reset(OpEq64) 8067 v0 := b.NewValue0(v.Pos, OpConst64, t) 8068 v0.AuxInt = c - d 8069 v.AddArg(v0) 8070 v.AddArg(x) 8071 return true 8072 } 8073 // match: (Eq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 8074 // cond: 8075 // result: (Eq64 (Const64 <t> [c-d]) x) 8076 for { 8077 _ = v.Args[1] 8078 v_0 := v.Args[0] 8079 if v_0.Op != OpAdd64 { 8080 break 8081 } 8082 _ = v_0.Args[1] 8083 x := v_0.Args[0] 8084 v_0_1 := v_0.Args[1] 8085 if v_0_1.Op != OpConst64 { 8086 break 8087 } 8088 t := v_0_1.Type 8089 d := v_0_1.AuxInt 8090 v_1 := v.Args[1] 8091 if v_1.Op != OpConst64 { 8092 break 8093 } 8094 if v_1.Type != t { 8095 break 8096 } 8097 c := v_1.AuxInt 8098 v.reset(OpEq64) 8099 v0 := b.NewValue0(v.Pos, OpConst64, t) 8100 v0.AuxInt = c - d 8101 v.AddArg(v0) 8102 v.AddArg(x) 8103 return true 8104 } 8105 // match: (Eq64 (Const64 [c]) (Const64 [d])) 8106 // cond: 8107 // result: (ConstBool [b2i(c == d)]) 8108 for { 8109 _ = v.Args[1] 8110 v_0 := v.Args[0] 8111 if v_0.Op != OpConst64 { 8112 break 8113 } 8114 c := v_0.AuxInt 8115 v_1 := v.Args[1] 8116 if v_1.Op != OpConst64 { 8117 break 8118 } 8119 d := v_1.AuxInt 8120 v.reset(OpConstBool) 8121 v.AuxInt = b2i(c == d) 8122 return true 8123 } 8124 // match: (Eq64 (Const64 [d]) (Const64 [c])) 8125 // cond: 8126 // result: (ConstBool [b2i(c == d)]) 8127 for { 8128 _ = v.Args[1] 8129 v_0 := v.Args[0] 8130 if v_0.Op != OpConst64 { 8131 break 8132 } 8133 d := v_0.AuxInt 8134 v_1 := v.Args[1] 8135 if v_1.Op != OpConst64 { 8136 break 8137 } 8138 c := v_1.AuxInt 8139 v.reset(OpConstBool) 8140 v.AuxInt = b2i(c == d) 8141 return true 8142 } 8143 return false 8144 } 8145 func rewriteValuegeneric_OpEq8_0(v *Value) bool { 8146 b := v.Block 8147 _ = b 8148 // match: (Eq8 x x) 8149 // cond: 8150 // result: (ConstBool [1]) 8151 for { 8152 _ = v.Args[1] 8153 x := v.Args[0] 8154 if x != v.Args[1] { 8155 break 8156 } 8157 v.reset(OpConstBool) 8158 v.AuxInt = 1 8159 return true 8160 } 8161 // match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 8162 // cond: 8163 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 8164 for { 8165 _ = v.Args[1] 8166 v_0 := v.Args[0] 8167 if v_0.Op != OpConst8 { 8168 break 8169 } 8170 t := v_0.Type 8171 c := v_0.AuxInt 8172 v_1 := v.Args[1] 8173 if v_1.Op != OpAdd8 { 8174 break 8175 } 8176 _ = v_1.Args[1] 8177 v_1_0 := v_1.Args[0] 8178 if v_1_0.Op != OpConst8 { 8179 break 8180 } 8181 if v_1_0.Type != t { 8182 break 8183 } 8184 d := v_1_0.AuxInt 8185 x := v_1.Args[1] 8186 v.reset(OpEq8) 8187 v0 := b.NewValue0(v.Pos, OpConst8, t) 8188 v0.AuxInt = int64(int8(c - d)) 8189 v.AddArg(v0) 8190 v.AddArg(x) 8191 return true 8192 } 8193 // match: (Eq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 8194 // cond: 8195 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 8196 for { 8197 _ = v.Args[1] 8198 v_0 := v.Args[0] 8199 if v_0.Op != OpConst8 { 8200 break 8201 } 8202 t := v_0.Type 8203 c := v_0.AuxInt 8204 v_1 := v.Args[1] 8205 if v_1.Op != OpAdd8 { 8206 break 8207 } 8208 _ = v_1.Args[1] 8209 x := v_1.Args[0] 8210 v_1_1 := v_1.Args[1] 8211 if v_1_1.Op != OpConst8 { 8212 break 8213 } 8214 if v_1_1.Type != t { 8215 break 8216 } 8217 d := v_1_1.AuxInt 8218 v.reset(OpEq8) 8219 v0 := b.NewValue0(v.Pos, OpConst8, t) 8220 v0.AuxInt = int64(int8(c - d)) 8221 v.AddArg(v0) 8222 v.AddArg(x) 8223 return true 8224 } 8225 // match: (Eq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 8226 // cond: 8227 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 8228 for { 8229 _ = v.Args[1] 8230 v_0 := v.Args[0] 8231 if v_0.Op != OpAdd8 { 8232 break 8233 } 8234 _ = v_0.Args[1] 8235 v_0_0 := v_0.Args[0] 8236 if v_0_0.Op != OpConst8 { 8237 break 8238 } 8239 t := v_0_0.Type 8240 d := v_0_0.AuxInt 8241 x := v_0.Args[1] 8242 v_1 := v.Args[1] 8243 if v_1.Op != OpConst8 { 8244 break 8245 } 8246 if v_1.Type != t { 8247 break 8248 } 8249 c := v_1.AuxInt 8250 v.reset(OpEq8) 8251 v0 := b.NewValue0(v.Pos, OpConst8, t) 8252 v0.AuxInt = int64(int8(c - d)) 8253 v.AddArg(v0) 8254 v.AddArg(x) 8255 return true 8256 } 8257 // match: (Eq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 8258 // cond: 8259 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 8260 for { 8261 _ = v.Args[1] 8262 v_0 := v.Args[0] 8263 if v_0.Op != OpAdd8 { 8264 break 8265 } 8266 _ = v_0.Args[1] 8267 x := v_0.Args[0] 8268 v_0_1 := v_0.Args[1] 8269 if v_0_1.Op != OpConst8 { 8270 break 8271 } 8272 t := v_0_1.Type 8273 d := v_0_1.AuxInt 8274 v_1 := v.Args[1] 8275 if v_1.Op != OpConst8 { 8276 break 8277 } 8278 if v_1.Type != t { 8279 break 8280 } 8281 c := v_1.AuxInt 8282 v.reset(OpEq8) 8283 v0 := b.NewValue0(v.Pos, OpConst8, t) 8284 v0.AuxInt = int64(int8(c - d)) 8285 v.AddArg(v0) 8286 v.AddArg(x) 8287 return true 8288 } 8289 // match: (Eq8 (Const8 [c]) (Const8 [d])) 8290 // cond: 8291 // result: (ConstBool [b2i(c == d)]) 8292 for { 8293 _ = v.Args[1] 8294 v_0 := v.Args[0] 8295 if v_0.Op != OpConst8 { 8296 break 8297 } 8298 c := v_0.AuxInt 8299 v_1 := v.Args[1] 8300 if v_1.Op != OpConst8 { 8301 break 8302 } 8303 d := v_1.AuxInt 8304 v.reset(OpConstBool) 8305 v.AuxInt = b2i(c == d) 8306 return true 8307 } 8308 // match: (Eq8 (Const8 [d]) (Const8 [c])) 8309 // cond: 8310 // result: (ConstBool [b2i(c == d)]) 8311 for { 8312 _ = v.Args[1] 8313 v_0 := v.Args[0] 8314 if v_0.Op != OpConst8 { 8315 break 8316 } 8317 d := v_0.AuxInt 8318 v_1 := v.Args[1] 8319 if v_1.Op != OpConst8 { 8320 break 8321 } 8322 c := v_1.AuxInt 8323 v.reset(OpConstBool) 8324 v.AuxInt = b2i(c == d) 8325 return true 8326 } 8327 return false 8328 } 8329 func rewriteValuegeneric_OpEqB_0(v *Value) bool { 8330 // match: (EqB (ConstBool [c]) (ConstBool [d])) 8331 // cond: 8332 // result: (ConstBool [b2i(c == d)]) 8333 for { 8334 _ = v.Args[1] 8335 v_0 := v.Args[0] 8336 if v_0.Op != OpConstBool { 8337 break 8338 } 8339 c := v_0.AuxInt 8340 v_1 := v.Args[1] 8341 if v_1.Op != OpConstBool { 8342 break 8343 } 8344 d := v_1.AuxInt 8345 v.reset(OpConstBool) 8346 v.AuxInt = b2i(c == d) 8347 return true 8348 } 8349 // match: (EqB (ConstBool [d]) (ConstBool [c])) 8350 // cond: 8351 // result: (ConstBool [b2i(c == d)]) 8352 for { 8353 _ = v.Args[1] 8354 v_0 := v.Args[0] 8355 if v_0.Op != OpConstBool { 8356 break 8357 } 8358 d := v_0.AuxInt 8359 v_1 := v.Args[1] 8360 if v_1.Op != OpConstBool { 8361 break 8362 } 8363 c := v_1.AuxInt 8364 v.reset(OpConstBool) 8365 v.AuxInt = b2i(c == d) 8366 return true 8367 } 8368 // match: (EqB (ConstBool [0]) x) 8369 // cond: 8370 // result: (Not x) 8371 for { 8372 _ = v.Args[1] 8373 v_0 := v.Args[0] 8374 if v_0.Op != OpConstBool { 8375 break 8376 } 8377 if v_0.AuxInt != 0 { 8378 break 8379 } 8380 x := v.Args[1] 8381 v.reset(OpNot) 8382 v.AddArg(x) 8383 return true 8384 } 8385 // match: (EqB x (ConstBool [0])) 8386 // cond: 8387 // result: (Not x) 8388 for { 8389 _ = v.Args[1] 8390 x := v.Args[0] 8391 v_1 := v.Args[1] 8392 if v_1.Op != OpConstBool { 8393 break 8394 } 8395 if v_1.AuxInt != 0 { 8396 break 8397 } 8398 v.reset(OpNot) 8399 v.AddArg(x) 8400 return true 8401 } 8402 // match: (EqB (ConstBool [1]) x) 8403 // cond: 8404 // result: x 8405 for { 8406 _ = v.Args[1] 8407 v_0 := v.Args[0] 8408 if v_0.Op != OpConstBool { 8409 break 8410 } 8411 if v_0.AuxInt != 1 { 8412 break 8413 } 8414 x := v.Args[1] 8415 v.reset(OpCopy) 8416 v.Type = x.Type 8417 v.AddArg(x) 8418 return true 8419 } 8420 // match: (EqB x (ConstBool [1])) 8421 // cond: 8422 // result: x 8423 for { 8424 _ = v.Args[1] 8425 x := v.Args[0] 8426 v_1 := v.Args[1] 8427 if v_1.Op != OpConstBool { 8428 break 8429 } 8430 if v_1.AuxInt != 1 { 8431 break 8432 } 8433 v.reset(OpCopy) 8434 v.Type = x.Type 8435 v.AddArg(x) 8436 return true 8437 } 8438 return false 8439 } 8440 func rewriteValuegeneric_OpEqInter_0(v *Value) bool { 8441 b := v.Block 8442 _ = b 8443 typ := &b.Func.Config.Types 8444 _ = typ 8445 // match: (EqInter x y) 8446 // cond: 8447 // result: (EqPtr (ITab x) (ITab y)) 8448 for { 8449 _ = v.Args[1] 8450 x := v.Args[0] 8451 y := v.Args[1] 8452 v.reset(OpEqPtr) 8453 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 8454 v0.AddArg(x) 8455 v.AddArg(v0) 8456 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 8457 v1.AddArg(y) 8458 v.AddArg(v1) 8459 return true 8460 } 8461 } 8462 func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { 8463 b := v.Block 8464 _ = b 8465 typ := &b.Func.Config.Types 8466 _ = typ 8467 // match: (EqPtr p (ConstNil)) 8468 // cond: 8469 // result: (Not (IsNonNil p)) 8470 for { 8471 _ = v.Args[1] 8472 p := v.Args[0] 8473 v_1 := v.Args[1] 8474 if v_1.Op != OpConstNil { 8475 break 8476 } 8477 v.reset(OpNot) 8478 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 8479 v0.AddArg(p) 8480 v.AddArg(v0) 8481 return true 8482 } 8483 // match: (EqPtr (ConstNil) p) 8484 // cond: 8485 // result: (Not (IsNonNil p)) 8486 for { 8487 _ = v.Args[1] 8488 v_0 := v.Args[0] 8489 if v_0.Op != OpConstNil { 8490 break 8491 } 8492 p := v.Args[1] 8493 v.reset(OpNot) 8494 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 8495 v0.AddArg(p) 8496 v.AddArg(v0) 8497 return true 8498 } 8499 // match: (EqPtr x x) 8500 // cond: 8501 // result: (ConstBool [1]) 8502 for { 8503 _ = v.Args[1] 8504 x := v.Args[0] 8505 if x != v.Args[1] { 8506 break 8507 } 8508 v.reset(OpConstBool) 8509 v.AuxInt = 1 8510 return true 8511 } 8512 // match: (EqPtr (Addr {a} x) (Addr {b} x)) 8513 // cond: 8514 // result: (ConstBool [b2i(a == b)]) 8515 for { 8516 _ = v.Args[1] 8517 v_0 := v.Args[0] 8518 if v_0.Op != OpAddr { 8519 break 8520 } 8521 a := v_0.Aux 8522 x := v_0.Args[0] 8523 v_1 := v.Args[1] 8524 if v_1.Op != OpAddr { 8525 break 8526 } 8527 b := v_1.Aux 8528 if x != v_1.Args[0] { 8529 break 8530 } 8531 v.reset(OpConstBool) 8532 v.AuxInt = b2i(a == b) 8533 return true 8534 } 8535 // match: (EqPtr (Addr {b} x) (Addr {a} x)) 8536 // cond: 8537 // result: (ConstBool [b2i(a == b)]) 8538 for { 8539 _ = v.Args[1] 8540 v_0 := v.Args[0] 8541 if v_0.Op != OpAddr { 8542 break 8543 } 8544 b := v_0.Aux 8545 x := v_0.Args[0] 8546 v_1 := v.Args[1] 8547 if v_1.Op != OpAddr { 8548 break 8549 } 8550 a := v_1.Aux 8551 if x != v_1.Args[0] { 8552 break 8553 } 8554 v.reset(OpConstBool) 8555 v.AuxInt = b2i(a == b) 8556 return true 8557 } 8558 return false 8559 } 8560 func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { 8561 b := v.Block 8562 _ = b 8563 typ := &b.Func.Config.Types 8564 _ = typ 8565 // match: (EqSlice x y) 8566 // cond: 8567 // result: (EqPtr (SlicePtr x) (SlicePtr y)) 8568 for { 8569 _ = v.Args[1] 8570 x := v.Args[0] 8571 y := v.Args[1] 8572 v.reset(OpEqPtr) 8573 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 8574 v0.AddArg(x) 8575 v.AddArg(v0) 8576 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 8577 v1.AddArg(y) 8578 v.AddArg(v1) 8579 return true 8580 } 8581 } 8582 func rewriteValuegeneric_OpGeq16_0(v *Value) bool { 8583 // match: (Geq16 (Const16 [c]) (Const16 [d])) 8584 // cond: 8585 // result: (ConstBool [b2i(c >= d)]) 8586 for { 8587 _ = v.Args[1] 8588 v_0 := v.Args[0] 8589 if v_0.Op != OpConst16 { 8590 break 8591 } 8592 c := v_0.AuxInt 8593 v_1 := v.Args[1] 8594 if v_1.Op != OpConst16 { 8595 break 8596 } 8597 d := v_1.AuxInt 8598 v.reset(OpConstBool) 8599 v.AuxInt = b2i(c >= d) 8600 return true 8601 } 8602 return false 8603 } 8604 func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { 8605 // match: (Geq16U (Const16 [c]) (Const16 [d])) 8606 // cond: 8607 // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) 8608 for { 8609 _ = v.Args[1] 8610 v_0 := v.Args[0] 8611 if v_0.Op != OpConst16 { 8612 break 8613 } 8614 c := v_0.AuxInt 8615 v_1 := v.Args[1] 8616 if v_1.Op != OpConst16 { 8617 break 8618 } 8619 d := v_1.AuxInt 8620 v.reset(OpConstBool) 8621 v.AuxInt = b2i(uint16(c) >= uint16(d)) 8622 return true 8623 } 8624 return false 8625 } 8626 func rewriteValuegeneric_OpGeq32_0(v *Value) bool { 8627 // match: (Geq32 (Const32 [c]) (Const32 [d])) 8628 // cond: 8629 // result: (ConstBool [b2i(c >= d)]) 8630 for { 8631 _ = v.Args[1] 8632 v_0 := v.Args[0] 8633 if v_0.Op != OpConst32 { 8634 break 8635 } 8636 c := v_0.AuxInt 8637 v_1 := v.Args[1] 8638 if v_1.Op != OpConst32 { 8639 break 8640 } 8641 d := v_1.AuxInt 8642 v.reset(OpConstBool) 8643 v.AuxInt = b2i(c >= d) 8644 return true 8645 } 8646 return false 8647 } 8648 func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { 8649 // match: (Geq32U (Const32 [c]) (Const32 [d])) 8650 // cond: 8651 // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) 8652 for { 8653 _ = v.Args[1] 8654 v_0 := v.Args[0] 8655 if v_0.Op != OpConst32 { 8656 break 8657 } 8658 c := v_0.AuxInt 8659 v_1 := v.Args[1] 8660 if v_1.Op != OpConst32 { 8661 break 8662 } 8663 d := v_1.AuxInt 8664 v.reset(OpConstBool) 8665 v.AuxInt = b2i(uint32(c) >= uint32(d)) 8666 return true 8667 } 8668 return false 8669 } 8670 func rewriteValuegeneric_OpGeq64_0(v *Value) bool { 8671 // match: (Geq64 (Const64 [c]) (Const64 [d])) 8672 // cond: 8673 // result: (ConstBool [b2i(c >= d)]) 8674 for { 8675 _ = v.Args[1] 8676 v_0 := v.Args[0] 8677 if v_0.Op != OpConst64 { 8678 break 8679 } 8680 c := v_0.AuxInt 8681 v_1 := v.Args[1] 8682 if v_1.Op != OpConst64 { 8683 break 8684 } 8685 d := v_1.AuxInt 8686 v.reset(OpConstBool) 8687 v.AuxInt = b2i(c >= d) 8688 return true 8689 } 8690 return false 8691 } 8692 func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { 8693 // match: (Geq64U (Const64 [c]) (Const64 [d])) 8694 // cond: 8695 // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) 8696 for { 8697 _ = v.Args[1] 8698 v_0 := v.Args[0] 8699 if v_0.Op != OpConst64 { 8700 break 8701 } 8702 c := v_0.AuxInt 8703 v_1 := v.Args[1] 8704 if v_1.Op != OpConst64 { 8705 break 8706 } 8707 d := v_1.AuxInt 8708 v.reset(OpConstBool) 8709 v.AuxInt = b2i(uint64(c) >= uint64(d)) 8710 return true 8711 } 8712 return false 8713 } 8714 func rewriteValuegeneric_OpGeq8_0(v *Value) bool { 8715 // match: (Geq8 (Const8 [c]) (Const8 [d])) 8716 // cond: 8717 // result: (ConstBool [b2i(c >= d)]) 8718 for { 8719 _ = v.Args[1] 8720 v_0 := v.Args[0] 8721 if v_0.Op != OpConst8 { 8722 break 8723 } 8724 c := v_0.AuxInt 8725 v_1 := v.Args[1] 8726 if v_1.Op != OpConst8 { 8727 break 8728 } 8729 d := v_1.AuxInt 8730 v.reset(OpConstBool) 8731 v.AuxInt = b2i(c >= d) 8732 return true 8733 } 8734 return false 8735 } 8736 func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { 8737 // match: (Geq8U (Const8 [c]) (Const8 [d])) 8738 // cond: 8739 // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) 8740 for { 8741 _ = v.Args[1] 8742 v_0 := v.Args[0] 8743 if v_0.Op != OpConst8 { 8744 break 8745 } 8746 c := v_0.AuxInt 8747 v_1 := v.Args[1] 8748 if v_1.Op != OpConst8 { 8749 break 8750 } 8751 d := v_1.AuxInt 8752 v.reset(OpConstBool) 8753 v.AuxInt = b2i(uint8(c) >= uint8(d)) 8754 return true 8755 } 8756 return false 8757 } 8758 func rewriteValuegeneric_OpGreater16_0(v *Value) bool { 8759 // match: (Greater16 (Const16 [c]) (Const16 [d])) 8760 // cond: 8761 // result: (ConstBool [b2i(c > d)]) 8762 for { 8763 _ = v.Args[1] 8764 v_0 := v.Args[0] 8765 if v_0.Op != OpConst16 { 8766 break 8767 } 8768 c := v_0.AuxInt 8769 v_1 := v.Args[1] 8770 if v_1.Op != OpConst16 { 8771 break 8772 } 8773 d := v_1.AuxInt 8774 v.reset(OpConstBool) 8775 v.AuxInt = b2i(c > d) 8776 return true 8777 } 8778 return false 8779 } 8780 func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { 8781 // match: (Greater16U (Const16 [c]) (Const16 [d])) 8782 // cond: 8783 // result: (ConstBool [b2i(uint16(c) > uint16(d))]) 8784 for { 8785 _ = v.Args[1] 8786 v_0 := v.Args[0] 8787 if v_0.Op != OpConst16 { 8788 break 8789 } 8790 c := v_0.AuxInt 8791 v_1 := v.Args[1] 8792 if v_1.Op != OpConst16 { 8793 break 8794 } 8795 d := v_1.AuxInt 8796 v.reset(OpConstBool) 8797 v.AuxInt = b2i(uint16(c) > uint16(d)) 8798 return true 8799 } 8800 return false 8801 } 8802 func rewriteValuegeneric_OpGreater32_0(v *Value) bool { 8803 // match: (Greater32 (Const32 [c]) (Const32 [d])) 8804 // cond: 8805 // result: (ConstBool [b2i(c > d)]) 8806 for { 8807 _ = v.Args[1] 8808 v_0 := v.Args[0] 8809 if v_0.Op != OpConst32 { 8810 break 8811 } 8812 c := v_0.AuxInt 8813 v_1 := v.Args[1] 8814 if v_1.Op != OpConst32 { 8815 break 8816 } 8817 d := v_1.AuxInt 8818 v.reset(OpConstBool) 8819 v.AuxInt = b2i(c > d) 8820 return true 8821 } 8822 return false 8823 } 8824 func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { 8825 // match: (Greater32U (Const32 [c]) (Const32 [d])) 8826 // cond: 8827 // result: (ConstBool [b2i(uint32(c) > uint32(d))]) 8828 for { 8829 _ = v.Args[1] 8830 v_0 := v.Args[0] 8831 if v_0.Op != OpConst32 { 8832 break 8833 } 8834 c := v_0.AuxInt 8835 v_1 := v.Args[1] 8836 if v_1.Op != OpConst32 { 8837 break 8838 } 8839 d := v_1.AuxInt 8840 v.reset(OpConstBool) 8841 v.AuxInt = b2i(uint32(c) > uint32(d)) 8842 return true 8843 } 8844 return false 8845 } 8846 func rewriteValuegeneric_OpGreater64_0(v *Value) bool { 8847 // match: (Greater64 (Const64 [c]) (Const64 [d])) 8848 // cond: 8849 // result: (ConstBool [b2i(c > d)]) 8850 for { 8851 _ = v.Args[1] 8852 v_0 := v.Args[0] 8853 if v_0.Op != OpConst64 { 8854 break 8855 } 8856 c := v_0.AuxInt 8857 v_1 := v.Args[1] 8858 if v_1.Op != OpConst64 { 8859 break 8860 } 8861 d := v_1.AuxInt 8862 v.reset(OpConstBool) 8863 v.AuxInt = b2i(c > d) 8864 return true 8865 } 8866 return false 8867 } 8868 func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { 8869 // match: (Greater64U (Const64 [c]) (Const64 [d])) 8870 // cond: 8871 // result: (ConstBool [b2i(uint64(c) > uint64(d))]) 8872 for { 8873 _ = v.Args[1] 8874 v_0 := v.Args[0] 8875 if v_0.Op != OpConst64 { 8876 break 8877 } 8878 c := v_0.AuxInt 8879 v_1 := v.Args[1] 8880 if v_1.Op != OpConst64 { 8881 break 8882 } 8883 d := v_1.AuxInt 8884 v.reset(OpConstBool) 8885 v.AuxInt = b2i(uint64(c) > uint64(d)) 8886 return true 8887 } 8888 return false 8889 } 8890 func rewriteValuegeneric_OpGreater8_0(v *Value) bool { 8891 // match: (Greater8 (Const8 [c]) (Const8 [d])) 8892 // cond: 8893 // result: (ConstBool [b2i(c > d)]) 8894 for { 8895 _ = v.Args[1] 8896 v_0 := v.Args[0] 8897 if v_0.Op != OpConst8 { 8898 break 8899 } 8900 c := v_0.AuxInt 8901 v_1 := v.Args[1] 8902 if v_1.Op != OpConst8 { 8903 break 8904 } 8905 d := v_1.AuxInt 8906 v.reset(OpConstBool) 8907 v.AuxInt = b2i(c > d) 8908 return true 8909 } 8910 return false 8911 } 8912 func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { 8913 // match: (Greater8U (Const8 [c]) (Const8 [d])) 8914 // cond: 8915 // result: (ConstBool [b2i(uint8(c) > uint8(d))]) 8916 for { 8917 _ = v.Args[1] 8918 v_0 := v.Args[0] 8919 if v_0.Op != OpConst8 { 8920 break 8921 } 8922 c := v_0.AuxInt 8923 v_1 := v.Args[1] 8924 if v_1.Op != OpConst8 { 8925 break 8926 } 8927 d := v_1.AuxInt 8928 v.reset(OpConstBool) 8929 v.AuxInt = b2i(uint8(c) > uint8(d)) 8930 return true 8931 } 8932 return false 8933 } 8934 func rewriteValuegeneric_OpIMake_0(v *Value) bool { 8935 // match: (IMake typ (StructMake1 val)) 8936 // cond: 8937 // result: (IMake typ val) 8938 for { 8939 _ = v.Args[1] 8940 typ := v.Args[0] 8941 v_1 := v.Args[1] 8942 if v_1.Op != OpStructMake1 { 8943 break 8944 } 8945 val := v_1.Args[0] 8946 v.reset(OpIMake) 8947 v.AddArg(typ) 8948 v.AddArg(val) 8949 return true 8950 } 8951 // match: (IMake typ (ArrayMake1 val)) 8952 // cond: 8953 // result: (IMake typ val) 8954 for { 8955 _ = v.Args[1] 8956 typ := v.Args[0] 8957 v_1 := v.Args[1] 8958 if v_1.Op != OpArrayMake1 { 8959 break 8960 } 8961 val := v_1.Args[0] 8962 v.reset(OpIMake) 8963 v.AddArg(typ) 8964 v.AddArg(val) 8965 return true 8966 } 8967 return false 8968 } 8969 func rewriteValuegeneric_OpInterCall_0(v *Value) bool { 8970 // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) 8971 // cond: devirt(v, itab, off) != nil 8972 // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) 8973 for { 8974 argsize := v.AuxInt 8975 _ = v.Args[1] 8976 v_0 := v.Args[0] 8977 if v_0.Op != OpLoad { 8978 break 8979 } 8980 _ = v_0.Args[1] 8981 v_0_0 := v_0.Args[0] 8982 if v_0_0.Op != OpOffPtr { 8983 break 8984 } 8985 off := v_0_0.AuxInt 8986 v_0_0_0 := v_0_0.Args[0] 8987 if v_0_0_0.Op != OpITab { 8988 break 8989 } 8990 v_0_0_0_0 := v_0_0_0.Args[0] 8991 if v_0_0_0_0.Op != OpIMake { 8992 break 8993 } 8994 _ = v_0_0_0_0.Args[1] 8995 v_0_0_0_0_0 := v_0_0_0_0.Args[0] 8996 if v_0_0_0_0_0.Op != OpAddr { 8997 break 8998 } 8999 itab := v_0_0_0_0_0.Aux 9000 v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] 9001 if v_0_0_0_0_0_0.Op != OpSB { 9002 break 9003 } 9004 mem := v.Args[1] 9005 if !(devirt(v, itab, off) != nil) { 9006 break 9007 } 9008 v.reset(OpStaticCall) 9009 v.AuxInt = argsize 9010 v.Aux = devirt(v, itab, off) 9011 v.AddArg(mem) 9012 return true 9013 } 9014 return false 9015 } 9016 func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { 9017 // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) 9018 // cond: (1 << 8) <= c 9019 // result: (ConstBool [1]) 9020 for { 9021 _ = v.Args[1] 9022 v_0 := v.Args[0] 9023 if v_0.Op != OpZeroExt8to32 { 9024 break 9025 } 9026 v_1 := v.Args[1] 9027 if v_1.Op != OpConst32 { 9028 break 9029 } 9030 c := v_1.AuxInt 9031 if !((1 << 8) <= c) { 9032 break 9033 } 9034 v.reset(OpConstBool) 9035 v.AuxInt = 1 9036 return true 9037 } 9038 // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) 9039 // cond: (1 << 8) <= c 9040 // result: (ConstBool [1]) 9041 for { 9042 _ = v.Args[1] 9043 v_0 := v.Args[0] 9044 if v_0.Op != OpZeroExt8to64 { 9045 break 9046 } 9047 v_1 := v.Args[1] 9048 if v_1.Op != OpConst64 { 9049 break 9050 } 9051 c := v_1.AuxInt 9052 if !((1 << 8) <= c) { 9053 break 9054 } 9055 v.reset(OpConstBool) 9056 v.AuxInt = 1 9057 return true 9058 } 9059 // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) 9060 // cond: (1 << 16) <= c 9061 // result: (ConstBool [1]) 9062 for { 9063 _ = v.Args[1] 9064 v_0 := v.Args[0] 9065 if v_0.Op != OpZeroExt16to32 { 9066 break 9067 } 9068 v_1 := v.Args[1] 9069 if v_1.Op != OpConst32 { 9070 break 9071 } 9072 c := v_1.AuxInt 9073 if !((1 << 16) <= c) { 9074 break 9075 } 9076 v.reset(OpConstBool) 9077 v.AuxInt = 1 9078 return true 9079 } 9080 // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) 9081 // cond: (1 << 16) <= c 9082 // result: (ConstBool [1]) 9083 for { 9084 _ = v.Args[1] 9085 v_0 := v.Args[0] 9086 if v_0.Op != OpZeroExt16to64 { 9087 break 9088 } 9089 v_1 := v.Args[1] 9090 if v_1.Op != OpConst64 { 9091 break 9092 } 9093 c := v_1.AuxInt 9094 if !((1 << 16) <= c) { 9095 break 9096 } 9097 v.reset(OpConstBool) 9098 v.AuxInt = 1 9099 return true 9100 } 9101 // match: (IsInBounds x x) 9102 // cond: 9103 // result: (ConstBool [0]) 9104 for { 9105 _ = v.Args[1] 9106 x := v.Args[0] 9107 if x != v.Args[1] { 9108 break 9109 } 9110 v.reset(OpConstBool) 9111 v.AuxInt = 0 9112 return true 9113 } 9114 // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) 9115 // cond: 0 <= c && c < d 9116 // result: (ConstBool [1]) 9117 for { 9118 _ = v.Args[1] 9119 v_0 := v.Args[0] 9120 if v_0.Op != OpAnd8 { 9121 break 9122 } 9123 _ = v_0.Args[1] 9124 v_0_0 := v_0.Args[0] 9125 if v_0_0.Op != OpConst8 { 9126 break 9127 } 9128 c := v_0_0.AuxInt 9129 v_1 := v.Args[1] 9130 if v_1.Op != OpConst8 { 9131 break 9132 } 9133 d := v_1.AuxInt 9134 if !(0 <= c && c < d) { 9135 break 9136 } 9137 v.reset(OpConstBool) 9138 v.AuxInt = 1 9139 return true 9140 } 9141 // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) 9142 // cond: 0 <= c && c < d 9143 // result: (ConstBool [1]) 9144 for { 9145 _ = v.Args[1] 9146 v_0 := v.Args[0] 9147 if v_0.Op != OpAnd8 { 9148 break 9149 } 9150 _ = v_0.Args[1] 9151 v_0_1 := v_0.Args[1] 9152 if v_0_1.Op != OpConst8 { 9153 break 9154 } 9155 c := v_0_1.AuxInt 9156 v_1 := v.Args[1] 9157 if v_1.Op != OpConst8 { 9158 break 9159 } 9160 d := v_1.AuxInt 9161 if !(0 <= c && c < d) { 9162 break 9163 } 9164 v.reset(OpConstBool) 9165 v.AuxInt = 1 9166 return true 9167 } 9168 // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) 9169 // cond: 0 <= c && c < d 9170 // result: (ConstBool [1]) 9171 for { 9172 _ = v.Args[1] 9173 v_0 := v.Args[0] 9174 if v_0.Op != OpZeroExt8to16 { 9175 break 9176 } 9177 v_0_0 := v_0.Args[0] 9178 if v_0_0.Op != OpAnd8 { 9179 break 9180 } 9181 _ = v_0_0.Args[1] 9182 v_0_0_0 := v_0_0.Args[0] 9183 if v_0_0_0.Op != OpConst8 { 9184 break 9185 } 9186 c := v_0_0_0.AuxInt 9187 v_1 := v.Args[1] 9188 if v_1.Op != OpConst16 { 9189 break 9190 } 9191 d := v_1.AuxInt 9192 if !(0 <= c && c < d) { 9193 break 9194 } 9195 v.reset(OpConstBool) 9196 v.AuxInt = 1 9197 return true 9198 } 9199 // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) 9200 // cond: 0 <= c && c < d 9201 // result: (ConstBool [1]) 9202 for { 9203 _ = v.Args[1] 9204 v_0 := v.Args[0] 9205 if v_0.Op != OpZeroExt8to16 { 9206 break 9207 } 9208 v_0_0 := v_0.Args[0] 9209 if v_0_0.Op != OpAnd8 { 9210 break 9211 } 9212 _ = v_0_0.Args[1] 9213 v_0_0_1 := v_0_0.Args[1] 9214 if v_0_0_1.Op != OpConst8 { 9215 break 9216 } 9217 c := v_0_0_1.AuxInt 9218 v_1 := v.Args[1] 9219 if v_1.Op != OpConst16 { 9220 break 9221 } 9222 d := v_1.AuxInt 9223 if !(0 <= c && c < d) { 9224 break 9225 } 9226 v.reset(OpConstBool) 9227 v.AuxInt = 1 9228 return true 9229 } 9230 // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) 9231 // cond: 0 <= c && c < d 9232 // result: (ConstBool [1]) 9233 for { 9234 _ = v.Args[1] 9235 v_0 := v.Args[0] 9236 if v_0.Op != OpZeroExt8to32 { 9237 break 9238 } 9239 v_0_0 := v_0.Args[0] 9240 if v_0_0.Op != OpAnd8 { 9241 break 9242 } 9243 _ = v_0_0.Args[1] 9244 v_0_0_0 := v_0_0.Args[0] 9245 if v_0_0_0.Op != OpConst8 { 9246 break 9247 } 9248 c := v_0_0_0.AuxInt 9249 v_1 := v.Args[1] 9250 if v_1.Op != OpConst32 { 9251 break 9252 } 9253 d := v_1.AuxInt 9254 if !(0 <= c && c < d) { 9255 break 9256 } 9257 v.reset(OpConstBool) 9258 v.AuxInt = 1 9259 return true 9260 } 9261 return false 9262 } 9263 func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { 9264 // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) 9265 // cond: 0 <= c && c < d 9266 // result: (ConstBool [1]) 9267 for { 9268 _ = v.Args[1] 9269 v_0 := v.Args[0] 9270 if v_0.Op != OpZeroExt8to32 { 9271 break 9272 } 9273 v_0_0 := v_0.Args[0] 9274 if v_0_0.Op != OpAnd8 { 9275 break 9276 } 9277 _ = v_0_0.Args[1] 9278 v_0_0_1 := v_0_0.Args[1] 9279 if v_0_0_1.Op != OpConst8 { 9280 break 9281 } 9282 c := v_0_0_1.AuxInt 9283 v_1 := v.Args[1] 9284 if v_1.Op != OpConst32 { 9285 break 9286 } 9287 d := v_1.AuxInt 9288 if !(0 <= c && c < d) { 9289 break 9290 } 9291 v.reset(OpConstBool) 9292 v.AuxInt = 1 9293 return true 9294 } 9295 // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) 9296 // cond: 0 <= c && c < d 9297 // result: (ConstBool [1]) 9298 for { 9299 _ = v.Args[1] 9300 v_0 := v.Args[0] 9301 if v_0.Op != OpZeroExt8to64 { 9302 break 9303 } 9304 v_0_0 := v_0.Args[0] 9305 if v_0_0.Op != OpAnd8 { 9306 break 9307 } 9308 _ = v_0_0.Args[1] 9309 v_0_0_0 := v_0_0.Args[0] 9310 if v_0_0_0.Op != OpConst8 { 9311 break 9312 } 9313 c := v_0_0_0.AuxInt 9314 v_1 := v.Args[1] 9315 if v_1.Op != OpConst64 { 9316 break 9317 } 9318 d := v_1.AuxInt 9319 if !(0 <= c && c < d) { 9320 break 9321 } 9322 v.reset(OpConstBool) 9323 v.AuxInt = 1 9324 return true 9325 } 9326 // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) 9327 // cond: 0 <= c && c < d 9328 // result: (ConstBool [1]) 9329 for { 9330 _ = v.Args[1] 9331 v_0 := v.Args[0] 9332 if v_0.Op != OpZeroExt8to64 { 9333 break 9334 } 9335 v_0_0 := v_0.Args[0] 9336 if v_0_0.Op != OpAnd8 { 9337 break 9338 } 9339 _ = v_0_0.Args[1] 9340 v_0_0_1 := v_0_0.Args[1] 9341 if v_0_0_1.Op != OpConst8 { 9342 break 9343 } 9344 c := v_0_0_1.AuxInt 9345 v_1 := v.Args[1] 9346 if v_1.Op != OpConst64 { 9347 break 9348 } 9349 d := v_1.AuxInt 9350 if !(0 <= c && c < d) { 9351 break 9352 } 9353 v.reset(OpConstBool) 9354 v.AuxInt = 1 9355 return true 9356 } 9357 // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) 9358 // cond: 0 <= c && c < d 9359 // result: (ConstBool [1]) 9360 for { 9361 _ = v.Args[1] 9362 v_0 := v.Args[0] 9363 if v_0.Op != OpAnd16 { 9364 break 9365 } 9366 _ = v_0.Args[1] 9367 v_0_0 := v_0.Args[0] 9368 if v_0_0.Op != OpConst16 { 9369 break 9370 } 9371 c := v_0_0.AuxInt 9372 v_1 := v.Args[1] 9373 if v_1.Op != OpConst16 { 9374 break 9375 } 9376 d := v_1.AuxInt 9377 if !(0 <= c && c < d) { 9378 break 9379 } 9380 v.reset(OpConstBool) 9381 v.AuxInt = 1 9382 return true 9383 } 9384 // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) 9385 // cond: 0 <= c && c < d 9386 // result: (ConstBool [1]) 9387 for { 9388 _ = v.Args[1] 9389 v_0 := v.Args[0] 9390 if v_0.Op != OpAnd16 { 9391 break 9392 } 9393 _ = v_0.Args[1] 9394 v_0_1 := v_0.Args[1] 9395 if v_0_1.Op != OpConst16 { 9396 break 9397 } 9398 c := v_0_1.AuxInt 9399 v_1 := v.Args[1] 9400 if v_1.Op != OpConst16 { 9401 break 9402 } 9403 d := v_1.AuxInt 9404 if !(0 <= c && c < d) { 9405 break 9406 } 9407 v.reset(OpConstBool) 9408 v.AuxInt = 1 9409 return true 9410 } 9411 // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) 9412 // cond: 0 <= c && c < d 9413 // result: (ConstBool [1]) 9414 for { 9415 _ = v.Args[1] 9416 v_0 := v.Args[0] 9417 if v_0.Op != OpZeroExt16to32 { 9418 break 9419 } 9420 v_0_0 := v_0.Args[0] 9421 if v_0_0.Op != OpAnd16 { 9422 break 9423 } 9424 _ = v_0_0.Args[1] 9425 v_0_0_0 := v_0_0.Args[0] 9426 if v_0_0_0.Op != OpConst16 { 9427 break 9428 } 9429 c := v_0_0_0.AuxInt 9430 v_1 := v.Args[1] 9431 if v_1.Op != OpConst32 { 9432 break 9433 } 9434 d := v_1.AuxInt 9435 if !(0 <= c && c < d) { 9436 break 9437 } 9438 v.reset(OpConstBool) 9439 v.AuxInt = 1 9440 return true 9441 } 9442 // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) 9443 // cond: 0 <= c && c < d 9444 // result: (ConstBool [1]) 9445 for { 9446 _ = v.Args[1] 9447 v_0 := v.Args[0] 9448 if v_0.Op != OpZeroExt16to32 { 9449 break 9450 } 9451 v_0_0 := v_0.Args[0] 9452 if v_0_0.Op != OpAnd16 { 9453 break 9454 } 9455 _ = v_0_0.Args[1] 9456 v_0_0_1 := v_0_0.Args[1] 9457 if v_0_0_1.Op != OpConst16 { 9458 break 9459 } 9460 c := v_0_0_1.AuxInt 9461 v_1 := v.Args[1] 9462 if v_1.Op != OpConst32 { 9463 break 9464 } 9465 d := v_1.AuxInt 9466 if !(0 <= c && c < d) { 9467 break 9468 } 9469 v.reset(OpConstBool) 9470 v.AuxInt = 1 9471 return true 9472 } 9473 // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) 9474 // cond: 0 <= c && c < d 9475 // result: (ConstBool [1]) 9476 for { 9477 _ = v.Args[1] 9478 v_0 := v.Args[0] 9479 if v_0.Op != OpZeroExt16to64 { 9480 break 9481 } 9482 v_0_0 := v_0.Args[0] 9483 if v_0_0.Op != OpAnd16 { 9484 break 9485 } 9486 _ = v_0_0.Args[1] 9487 v_0_0_0 := v_0_0.Args[0] 9488 if v_0_0_0.Op != OpConst16 { 9489 break 9490 } 9491 c := v_0_0_0.AuxInt 9492 v_1 := v.Args[1] 9493 if v_1.Op != OpConst64 { 9494 break 9495 } 9496 d := v_1.AuxInt 9497 if !(0 <= c && c < d) { 9498 break 9499 } 9500 v.reset(OpConstBool) 9501 v.AuxInt = 1 9502 return true 9503 } 9504 // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) 9505 // cond: 0 <= c && c < d 9506 // result: (ConstBool [1]) 9507 for { 9508 _ = v.Args[1] 9509 v_0 := v.Args[0] 9510 if v_0.Op != OpZeroExt16to64 { 9511 break 9512 } 9513 v_0_0 := v_0.Args[0] 9514 if v_0_0.Op != OpAnd16 { 9515 break 9516 } 9517 _ = v_0_0.Args[1] 9518 v_0_0_1 := v_0_0.Args[1] 9519 if v_0_0_1.Op != OpConst16 { 9520 break 9521 } 9522 c := v_0_0_1.AuxInt 9523 v_1 := v.Args[1] 9524 if v_1.Op != OpConst64 { 9525 break 9526 } 9527 d := v_1.AuxInt 9528 if !(0 <= c && c < d) { 9529 break 9530 } 9531 v.reset(OpConstBool) 9532 v.AuxInt = 1 9533 return true 9534 } 9535 // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) 9536 // cond: 0 <= c && c < d 9537 // result: (ConstBool [1]) 9538 for { 9539 _ = v.Args[1] 9540 v_0 := v.Args[0] 9541 if v_0.Op != OpAnd32 { 9542 break 9543 } 9544 _ = v_0.Args[1] 9545 v_0_0 := v_0.Args[0] 9546 if v_0_0.Op != OpConst32 { 9547 break 9548 } 9549 c := v_0_0.AuxInt 9550 v_1 := v.Args[1] 9551 if v_1.Op != OpConst32 { 9552 break 9553 } 9554 d := v_1.AuxInt 9555 if !(0 <= c && c < d) { 9556 break 9557 } 9558 v.reset(OpConstBool) 9559 v.AuxInt = 1 9560 return true 9561 } 9562 return false 9563 } 9564 func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { 9565 // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) 9566 // cond: 0 <= c && c < d 9567 // result: (ConstBool [1]) 9568 for { 9569 _ = v.Args[1] 9570 v_0 := v.Args[0] 9571 if v_0.Op != OpAnd32 { 9572 break 9573 } 9574 _ = v_0.Args[1] 9575 v_0_1 := v_0.Args[1] 9576 if v_0_1.Op != OpConst32 { 9577 break 9578 } 9579 c := v_0_1.AuxInt 9580 v_1 := v.Args[1] 9581 if v_1.Op != OpConst32 { 9582 break 9583 } 9584 d := v_1.AuxInt 9585 if !(0 <= c && c < d) { 9586 break 9587 } 9588 v.reset(OpConstBool) 9589 v.AuxInt = 1 9590 return true 9591 } 9592 // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) 9593 // cond: 0 <= c && c < d 9594 // result: (ConstBool [1]) 9595 for { 9596 _ = v.Args[1] 9597 v_0 := v.Args[0] 9598 if v_0.Op != OpZeroExt32to64 { 9599 break 9600 } 9601 v_0_0 := v_0.Args[0] 9602 if v_0_0.Op != OpAnd32 { 9603 break 9604 } 9605 _ = v_0_0.Args[1] 9606 v_0_0_0 := v_0_0.Args[0] 9607 if v_0_0_0.Op != OpConst32 { 9608 break 9609 } 9610 c := v_0_0_0.AuxInt 9611 v_1 := v.Args[1] 9612 if v_1.Op != OpConst64 { 9613 break 9614 } 9615 d := v_1.AuxInt 9616 if !(0 <= c && c < d) { 9617 break 9618 } 9619 v.reset(OpConstBool) 9620 v.AuxInt = 1 9621 return true 9622 } 9623 // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) 9624 // cond: 0 <= c && c < d 9625 // result: (ConstBool [1]) 9626 for { 9627 _ = v.Args[1] 9628 v_0 := v.Args[0] 9629 if v_0.Op != OpZeroExt32to64 { 9630 break 9631 } 9632 v_0_0 := v_0.Args[0] 9633 if v_0_0.Op != OpAnd32 { 9634 break 9635 } 9636 _ = v_0_0.Args[1] 9637 v_0_0_1 := v_0_0.Args[1] 9638 if v_0_0_1.Op != OpConst32 { 9639 break 9640 } 9641 c := v_0_0_1.AuxInt 9642 v_1 := v.Args[1] 9643 if v_1.Op != OpConst64 { 9644 break 9645 } 9646 d := v_1.AuxInt 9647 if !(0 <= c && c < d) { 9648 break 9649 } 9650 v.reset(OpConstBool) 9651 v.AuxInt = 1 9652 return true 9653 } 9654 // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) 9655 // cond: 0 <= c && c < d 9656 // result: (ConstBool [1]) 9657 for { 9658 _ = v.Args[1] 9659 v_0 := v.Args[0] 9660 if v_0.Op != OpAnd64 { 9661 break 9662 } 9663 _ = v_0.Args[1] 9664 v_0_0 := v_0.Args[0] 9665 if v_0_0.Op != OpConst64 { 9666 break 9667 } 9668 c := v_0_0.AuxInt 9669 v_1 := v.Args[1] 9670 if v_1.Op != OpConst64 { 9671 break 9672 } 9673 d := v_1.AuxInt 9674 if !(0 <= c && c < d) { 9675 break 9676 } 9677 v.reset(OpConstBool) 9678 v.AuxInt = 1 9679 return true 9680 } 9681 // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) 9682 // cond: 0 <= c && c < d 9683 // result: (ConstBool [1]) 9684 for { 9685 _ = v.Args[1] 9686 v_0 := v.Args[0] 9687 if v_0.Op != OpAnd64 { 9688 break 9689 } 9690 _ = v_0.Args[1] 9691 v_0_1 := v_0.Args[1] 9692 if v_0_1.Op != OpConst64 { 9693 break 9694 } 9695 c := v_0_1.AuxInt 9696 v_1 := v.Args[1] 9697 if v_1.Op != OpConst64 { 9698 break 9699 } 9700 d := v_1.AuxInt 9701 if !(0 <= c && c < d) { 9702 break 9703 } 9704 v.reset(OpConstBool) 9705 v.AuxInt = 1 9706 return true 9707 } 9708 // match: (IsInBounds (Const32 [c]) (Const32 [d])) 9709 // cond: 9710 // result: (ConstBool [b2i(0 <= c && c < d)]) 9711 for { 9712 _ = v.Args[1] 9713 v_0 := v.Args[0] 9714 if v_0.Op != OpConst32 { 9715 break 9716 } 9717 c := v_0.AuxInt 9718 v_1 := v.Args[1] 9719 if v_1.Op != OpConst32 { 9720 break 9721 } 9722 d := v_1.AuxInt 9723 v.reset(OpConstBool) 9724 v.AuxInt = b2i(0 <= c && c < d) 9725 return true 9726 } 9727 // match: (IsInBounds (Const64 [c]) (Const64 [d])) 9728 // cond: 9729 // result: (ConstBool [b2i(0 <= c && c < d)]) 9730 for { 9731 _ = v.Args[1] 9732 v_0 := v.Args[0] 9733 if v_0.Op != OpConst64 { 9734 break 9735 } 9736 c := v_0.AuxInt 9737 v_1 := v.Args[1] 9738 if v_1.Op != OpConst64 { 9739 break 9740 } 9741 d := v_1.AuxInt 9742 v.reset(OpConstBool) 9743 v.AuxInt = b2i(0 <= c && c < d) 9744 return true 9745 } 9746 // match: (IsInBounds (Mod32u _ y) y) 9747 // cond: 9748 // result: (ConstBool [1]) 9749 for { 9750 _ = v.Args[1] 9751 v_0 := v.Args[0] 9752 if v_0.Op != OpMod32u { 9753 break 9754 } 9755 _ = v_0.Args[1] 9756 y := v_0.Args[1] 9757 if y != v.Args[1] { 9758 break 9759 } 9760 v.reset(OpConstBool) 9761 v.AuxInt = 1 9762 return true 9763 } 9764 // match: (IsInBounds (Mod64u _ y) y) 9765 // cond: 9766 // result: (ConstBool [1]) 9767 for { 9768 _ = v.Args[1] 9769 v_0 := v.Args[0] 9770 if v_0.Op != OpMod64u { 9771 break 9772 } 9773 _ = v_0.Args[1] 9774 y := v_0.Args[1] 9775 if y != v.Args[1] { 9776 break 9777 } 9778 v.reset(OpConstBool) 9779 v.AuxInt = 1 9780 return true 9781 } 9782 return false 9783 } 9784 func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { 9785 // match: (IsNonNil (ConstNil)) 9786 // cond: 9787 // result: (ConstBool [0]) 9788 for { 9789 v_0 := v.Args[0] 9790 if v_0.Op != OpConstNil { 9791 break 9792 } 9793 v.reset(OpConstBool) 9794 v.AuxInt = 0 9795 return true 9796 } 9797 return false 9798 } 9799 func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { 9800 // match: (IsSliceInBounds x x) 9801 // cond: 9802 // result: (ConstBool [1]) 9803 for { 9804 _ = v.Args[1] 9805 x := v.Args[0] 9806 if x != v.Args[1] { 9807 break 9808 } 9809 v.reset(OpConstBool) 9810 v.AuxInt = 1 9811 return true 9812 } 9813 // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) 9814 // cond: 0 <= c && c <= d 9815 // result: (ConstBool [1]) 9816 for { 9817 _ = v.Args[1] 9818 v_0 := v.Args[0] 9819 if v_0.Op != OpAnd32 { 9820 break 9821 } 9822 _ = v_0.Args[1] 9823 v_0_0 := v_0.Args[0] 9824 if v_0_0.Op != OpConst32 { 9825 break 9826 } 9827 c := v_0_0.AuxInt 9828 v_1 := v.Args[1] 9829 if v_1.Op != OpConst32 { 9830 break 9831 } 9832 d := v_1.AuxInt 9833 if !(0 <= c && c <= d) { 9834 break 9835 } 9836 v.reset(OpConstBool) 9837 v.AuxInt = 1 9838 return true 9839 } 9840 // match: (IsSliceInBounds (And32 _ (Const32 [c])) (Const32 [d])) 9841 // cond: 0 <= c && c <= d 9842 // result: (ConstBool [1]) 9843 for { 9844 _ = v.Args[1] 9845 v_0 := v.Args[0] 9846 if v_0.Op != OpAnd32 { 9847 break 9848 } 9849 _ = v_0.Args[1] 9850 v_0_1 := v_0.Args[1] 9851 if v_0_1.Op != OpConst32 { 9852 break 9853 } 9854 c := v_0_1.AuxInt 9855 v_1 := v.Args[1] 9856 if v_1.Op != OpConst32 { 9857 break 9858 } 9859 d := v_1.AuxInt 9860 if !(0 <= c && c <= d) { 9861 break 9862 } 9863 v.reset(OpConstBool) 9864 v.AuxInt = 1 9865 return true 9866 } 9867 // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) 9868 // cond: 0 <= c && c <= d 9869 // result: (ConstBool [1]) 9870 for { 9871 _ = v.Args[1] 9872 v_0 := v.Args[0] 9873 if v_0.Op != OpAnd64 { 9874 break 9875 } 9876 _ = v_0.Args[1] 9877 v_0_0 := v_0.Args[0] 9878 if v_0_0.Op != OpConst64 { 9879 break 9880 } 9881 c := v_0_0.AuxInt 9882 v_1 := v.Args[1] 9883 if v_1.Op != OpConst64 { 9884 break 9885 } 9886 d := v_1.AuxInt 9887 if !(0 <= c && c <= d) { 9888 break 9889 } 9890 v.reset(OpConstBool) 9891 v.AuxInt = 1 9892 return true 9893 } 9894 // match: (IsSliceInBounds (And64 _ (Const64 [c])) (Const64 [d])) 9895 // cond: 0 <= c && c <= d 9896 // result: (ConstBool [1]) 9897 for { 9898 _ = v.Args[1] 9899 v_0 := v.Args[0] 9900 if v_0.Op != OpAnd64 { 9901 break 9902 } 9903 _ = v_0.Args[1] 9904 v_0_1 := v_0.Args[1] 9905 if v_0_1.Op != OpConst64 { 9906 break 9907 } 9908 c := v_0_1.AuxInt 9909 v_1 := v.Args[1] 9910 if v_1.Op != OpConst64 { 9911 break 9912 } 9913 d := v_1.AuxInt 9914 if !(0 <= c && c <= d) { 9915 break 9916 } 9917 v.reset(OpConstBool) 9918 v.AuxInt = 1 9919 return true 9920 } 9921 // match: (IsSliceInBounds (Const32 [0]) _) 9922 // cond: 9923 // result: (ConstBool [1]) 9924 for { 9925 _ = v.Args[1] 9926 v_0 := v.Args[0] 9927 if v_0.Op != OpConst32 { 9928 break 9929 } 9930 if v_0.AuxInt != 0 { 9931 break 9932 } 9933 v.reset(OpConstBool) 9934 v.AuxInt = 1 9935 return true 9936 } 9937 // match: (IsSliceInBounds (Const64 [0]) _) 9938 // cond: 9939 // result: (ConstBool [1]) 9940 for { 9941 _ = v.Args[1] 9942 v_0 := v.Args[0] 9943 if v_0.Op != OpConst64 { 9944 break 9945 } 9946 if v_0.AuxInt != 0 { 9947 break 9948 } 9949 v.reset(OpConstBool) 9950 v.AuxInt = 1 9951 return true 9952 } 9953 // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) 9954 // cond: 9955 // result: (ConstBool [b2i(0 <= c && c <= d)]) 9956 for { 9957 _ = v.Args[1] 9958 v_0 := v.Args[0] 9959 if v_0.Op != OpConst32 { 9960 break 9961 } 9962 c := v_0.AuxInt 9963 v_1 := v.Args[1] 9964 if v_1.Op != OpConst32 { 9965 break 9966 } 9967 d := v_1.AuxInt 9968 v.reset(OpConstBool) 9969 v.AuxInt = b2i(0 <= c && c <= d) 9970 return true 9971 } 9972 // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) 9973 // cond: 9974 // result: (ConstBool [b2i(0 <= c && c <= d)]) 9975 for { 9976 _ = v.Args[1] 9977 v_0 := v.Args[0] 9978 if v_0.Op != OpConst64 { 9979 break 9980 } 9981 c := v_0.AuxInt 9982 v_1 := v.Args[1] 9983 if v_1.Op != OpConst64 { 9984 break 9985 } 9986 d := v_1.AuxInt 9987 v.reset(OpConstBool) 9988 v.AuxInt = b2i(0 <= c && c <= d) 9989 return true 9990 } 9991 // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) 9992 // cond: 9993 // result: (ConstBool [1]) 9994 for { 9995 _ = v.Args[1] 9996 v_0 := v.Args[0] 9997 if v_0.Op != OpSliceLen { 9998 break 9999 } 10000 x := v_0.Args[0] 10001 v_1 := v.Args[1] 10002 if v_1.Op != OpSliceCap { 10003 break 10004 } 10005 if x != v_1.Args[0] { 10006 break 10007 } 10008 v.reset(OpConstBool) 10009 v.AuxInt = 1 10010 return true 10011 } 10012 return false 10013 } 10014 func rewriteValuegeneric_OpLeq16_0(v *Value) bool { 10015 // match: (Leq16 (Const16 [c]) (Const16 [d])) 10016 // cond: 10017 // result: (ConstBool [b2i(c <= d)]) 10018 for { 10019 _ = v.Args[1] 10020 v_0 := v.Args[0] 10021 if v_0.Op != OpConst16 { 10022 break 10023 } 10024 c := v_0.AuxInt 10025 v_1 := v.Args[1] 10026 if v_1.Op != OpConst16 { 10027 break 10028 } 10029 d := v_1.AuxInt 10030 v.reset(OpConstBool) 10031 v.AuxInt = b2i(c <= d) 10032 return true 10033 } 10034 return false 10035 } 10036 func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { 10037 // match: (Leq16U (Const16 [c]) (Const16 [d])) 10038 // cond: 10039 // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) 10040 for { 10041 _ = v.Args[1] 10042 v_0 := v.Args[0] 10043 if v_0.Op != OpConst16 { 10044 break 10045 } 10046 c := v_0.AuxInt 10047 v_1 := v.Args[1] 10048 if v_1.Op != OpConst16 { 10049 break 10050 } 10051 d := v_1.AuxInt 10052 v.reset(OpConstBool) 10053 v.AuxInt = b2i(uint16(c) <= uint16(d)) 10054 return true 10055 } 10056 return false 10057 } 10058 func rewriteValuegeneric_OpLeq32_0(v *Value) bool { 10059 // match: (Leq32 (Const32 [c]) (Const32 [d])) 10060 // cond: 10061 // result: (ConstBool [b2i(c <= d)]) 10062 for { 10063 _ = v.Args[1] 10064 v_0 := v.Args[0] 10065 if v_0.Op != OpConst32 { 10066 break 10067 } 10068 c := v_0.AuxInt 10069 v_1 := v.Args[1] 10070 if v_1.Op != OpConst32 { 10071 break 10072 } 10073 d := v_1.AuxInt 10074 v.reset(OpConstBool) 10075 v.AuxInt = b2i(c <= d) 10076 return true 10077 } 10078 return false 10079 } 10080 func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { 10081 // match: (Leq32U (Const32 [c]) (Const32 [d])) 10082 // cond: 10083 // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) 10084 for { 10085 _ = v.Args[1] 10086 v_0 := v.Args[0] 10087 if v_0.Op != OpConst32 { 10088 break 10089 } 10090 c := v_0.AuxInt 10091 v_1 := v.Args[1] 10092 if v_1.Op != OpConst32 { 10093 break 10094 } 10095 d := v_1.AuxInt 10096 v.reset(OpConstBool) 10097 v.AuxInt = b2i(uint32(c) <= uint32(d)) 10098 return true 10099 } 10100 return false 10101 } 10102 func rewriteValuegeneric_OpLeq64_0(v *Value) bool { 10103 // match: (Leq64 (Const64 [c]) (Const64 [d])) 10104 // cond: 10105 // result: (ConstBool [b2i(c <= d)]) 10106 for { 10107 _ = v.Args[1] 10108 v_0 := v.Args[0] 10109 if v_0.Op != OpConst64 { 10110 break 10111 } 10112 c := v_0.AuxInt 10113 v_1 := v.Args[1] 10114 if v_1.Op != OpConst64 { 10115 break 10116 } 10117 d := v_1.AuxInt 10118 v.reset(OpConstBool) 10119 v.AuxInt = b2i(c <= d) 10120 return true 10121 } 10122 return false 10123 } 10124 func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { 10125 // match: (Leq64U (Const64 [c]) (Const64 [d])) 10126 // cond: 10127 // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) 10128 for { 10129 _ = v.Args[1] 10130 v_0 := v.Args[0] 10131 if v_0.Op != OpConst64 { 10132 break 10133 } 10134 c := v_0.AuxInt 10135 v_1 := v.Args[1] 10136 if v_1.Op != OpConst64 { 10137 break 10138 } 10139 d := v_1.AuxInt 10140 v.reset(OpConstBool) 10141 v.AuxInt = b2i(uint64(c) <= uint64(d)) 10142 return true 10143 } 10144 return false 10145 } 10146 func rewriteValuegeneric_OpLeq8_0(v *Value) bool { 10147 // match: (Leq8 (Const8 [c]) (Const8 [d])) 10148 // cond: 10149 // result: (ConstBool [b2i(c <= d)]) 10150 for { 10151 _ = v.Args[1] 10152 v_0 := v.Args[0] 10153 if v_0.Op != OpConst8 { 10154 break 10155 } 10156 c := v_0.AuxInt 10157 v_1 := v.Args[1] 10158 if v_1.Op != OpConst8 { 10159 break 10160 } 10161 d := v_1.AuxInt 10162 v.reset(OpConstBool) 10163 v.AuxInt = b2i(c <= d) 10164 return true 10165 } 10166 return false 10167 } 10168 func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { 10169 // match: (Leq8U (Const8 [c]) (Const8 [d])) 10170 // cond: 10171 // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) 10172 for { 10173 _ = v.Args[1] 10174 v_0 := v.Args[0] 10175 if v_0.Op != OpConst8 { 10176 break 10177 } 10178 c := v_0.AuxInt 10179 v_1 := v.Args[1] 10180 if v_1.Op != OpConst8 { 10181 break 10182 } 10183 d := v_1.AuxInt 10184 v.reset(OpConstBool) 10185 v.AuxInt = b2i(uint8(c) <= uint8(d)) 10186 return true 10187 } 10188 return false 10189 } 10190 func rewriteValuegeneric_OpLess16_0(v *Value) bool { 10191 // match: (Less16 (Const16 [c]) (Const16 [d])) 10192 // cond: 10193 // result: (ConstBool [b2i(c < d)]) 10194 for { 10195 _ = v.Args[1] 10196 v_0 := v.Args[0] 10197 if v_0.Op != OpConst16 { 10198 break 10199 } 10200 c := v_0.AuxInt 10201 v_1 := v.Args[1] 10202 if v_1.Op != OpConst16 { 10203 break 10204 } 10205 d := v_1.AuxInt 10206 v.reset(OpConstBool) 10207 v.AuxInt = b2i(c < d) 10208 return true 10209 } 10210 return false 10211 } 10212 func rewriteValuegeneric_OpLess16U_0(v *Value) bool { 10213 // match: (Less16U (Const16 [c]) (Const16 [d])) 10214 // cond: 10215 // result: (ConstBool [b2i(uint16(c) < uint16(d))]) 10216 for { 10217 _ = v.Args[1] 10218 v_0 := v.Args[0] 10219 if v_0.Op != OpConst16 { 10220 break 10221 } 10222 c := v_0.AuxInt 10223 v_1 := v.Args[1] 10224 if v_1.Op != OpConst16 { 10225 break 10226 } 10227 d := v_1.AuxInt 10228 v.reset(OpConstBool) 10229 v.AuxInt = b2i(uint16(c) < uint16(d)) 10230 return true 10231 } 10232 return false 10233 } 10234 func rewriteValuegeneric_OpLess32_0(v *Value) bool { 10235 // match: (Less32 (Const32 [c]) (Const32 [d])) 10236 // cond: 10237 // result: (ConstBool [b2i(c < d)]) 10238 for { 10239 _ = v.Args[1] 10240 v_0 := v.Args[0] 10241 if v_0.Op != OpConst32 { 10242 break 10243 } 10244 c := v_0.AuxInt 10245 v_1 := v.Args[1] 10246 if v_1.Op != OpConst32 { 10247 break 10248 } 10249 d := v_1.AuxInt 10250 v.reset(OpConstBool) 10251 v.AuxInt = b2i(c < d) 10252 return true 10253 } 10254 return false 10255 } 10256 func rewriteValuegeneric_OpLess32U_0(v *Value) bool { 10257 // match: (Less32U (Const32 [c]) (Const32 [d])) 10258 // cond: 10259 // result: (ConstBool [b2i(uint32(c) < uint32(d))]) 10260 for { 10261 _ = v.Args[1] 10262 v_0 := v.Args[0] 10263 if v_0.Op != OpConst32 { 10264 break 10265 } 10266 c := v_0.AuxInt 10267 v_1 := v.Args[1] 10268 if v_1.Op != OpConst32 { 10269 break 10270 } 10271 d := v_1.AuxInt 10272 v.reset(OpConstBool) 10273 v.AuxInt = b2i(uint32(c) < uint32(d)) 10274 return true 10275 } 10276 return false 10277 } 10278 func rewriteValuegeneric_OpLess64_0(v *Value) bool { 10279 // match: (Less64 (Const64 [c]) (Const64 [d])) 10280 // cond: 10281 // result: (ConstBool [b2i(c < d)]) 10282 for { 10283 _ = v.Args[1] 10284 v_0 := v.Args[0] 10285 if v_0.Op != OpConst64 { 10286 break 10287 } 10288 c := v_0.AuxInt 10289 v_1 := v.Args[1] 10290 if v_1.Op != OpConst64 { 10291 break 10292 } 10293 d := v_1.AuxInt 10294 v.reset(OpConstBool) 10295 v.AuxInt = b2i(c < d) 10296 return true 10297 } 10298 return false 10299 } 10300 func rewriteValuegeneric_OpLess64U_0(v *Value) bool { 10301 // match: (Less64U (Const64 [c]) (Const64 [d])) 10302 // cond: 10303 // result: (ConstBool [b2i(uint64(c) < uint64(d))]) 10304 for { 10305 _ = v.Args[1] 10306 v_0 := v.Args[0] 10307 if v_0.Op != OpConst64 { 10308 break 10309 } 10310 c := v_0.AuxInt 10311 v_1 := v.Args[1] 10312 if v_1.Op != OpConst64 { 10313 break 10314 } 10315 d := v_1.AuxInt 10316 v.reset(OpConstBool) 10317 v.AuxInt = b2i(uint64(c) < uint64(d)) 10318 return true 10319 } 10320 return false 10321 } 10322 func rewriteValuegeneric_OpLess8_0(v *Value) bool { 10323 // match: (Less8 (Const8 [c]) (Const8 [d])) 10324 // cond: 10325 // result: (ConstBool [b2i(c < d)]) 10326 for { 10327 _ = v.Args[1] 10328 v_0 := v.Args[0] 10329 if v_0.Op != OpConst8 { 10330 break 10331 } 10332 c := v_0.AuxInt 10333 v_1 := v.Args[1] 10334 if v_1.Op != OpConst8 { 10335 break 10336 } 10337 d := v_1.AuxInt 10338 v.reset(OpConstBool) 10339 v.AuxInt = b2i(c < d) 10340 return true 10341 } 10342 return false 10343 } 10344 func rewriteValuegeneric_OpLess8U_0(v *Value) bool { 10345 // match: (Less8U (Const8 [c]) (Const8 [d])) 10346 // cond: 10347 // result: (ConstBool [b2i(uint8(c) < uint8(d))]) 10348 for { 10349 _ = v.Args[1] 10350 v_0 := v.Args[0] 10351 if v_0.Op != OpConst8 { 10352 break 10353 } 10354 c := v_0.AuxInt 10355 v_1 := v.Args[1] 10356 if v_1.Op != OpConst8 { 10357 break 10358 } 10359 d := v_1.AuxInt 10360 v.reset(OpConstBool) 10361 v.AuxInt = b2i(uint8(c) < uint8(d)) 10362 return true 10363 } 10364 return false 10365 } 10366 func rewriteValuegeneric_OpLoad_0(v *Value) bool { 10367 b := v.Block 10368 _ = b 10369 fe := b.Func.fe 10370 _ = fe 10371 // match: (Load <t1> p1 (Store {t2} p2 x _)) 10372 // cond: isSamePtr(p1,p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size() 10373 // result: x 10374 for { 10375 t1 := v.Type 10376 _ = v.Args[1] 10377 p1 := v.Args[0] 10378 v_1 := v.Args[1] 10379 if v_1.Op != OpStore { 10380 break 10381 } 10382 t2 := v_1.Aux 10383 _ = v_1.Args[2] 10384 p2 := v_1.Args[0] 10385 x := v_1.Args[1] 10386 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size()) { 10387 break 10388 } 10389 v.reset(OpCopy) 10390 v.Type = x.Type 10391 v.AddArg(x) 10392 return true 10393 } 10394 // match: (Load <t> _ _) 10395 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 10396 // result: (StructMake0) 10397 for { 10398 t := v.Type 10399 _ = v.Args[1] 10400 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 10401 break 10402 } 10403 v.reset(OpStructMake0) 10404 return true 10405 } 10406 // match: (Load <t> ptr mem) 10407 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 10408 // result: (StructMake1 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem)) 10409 for { 10410 t := v.Type 10411 _ = v.Args[1] 10412 ptr := v.Args[0] 10413 mem := v.Args[1] 10414 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 10415 break 10416 } 10417 v.reset(OpStructMake1) 10418 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 10419 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 10420 v1.AuxInt = 0 10421 v1.AddArg(ptr) 10422 v0.AddArg(v1) 10423 v0.AddArg(mem) 10424 v.AddArg(v0) 10425 return true 10426 } 10427 // match: (Load <t> ptr mem) 10428 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 10429 // 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)) 10430 for { 10431 t := v.Type 10432 _ = v.Args[1] 10433 ptr := v.Args[0] 10434 mem := v.Args[1] 10435 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 10436 break 10437 } 10438 v.reset(OpStructMake2) 10439 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 10440 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 10441 v1.AuxInt = 0 10442 v1.AddArg(ptr) 10443 v0.AddArg(v1) 10444 v0.AddArg(mem) 10445 v.AddArg(v0) 10446 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 10447 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 10448 v3.AuxInt = t.FieldOff(1) 10449 v3.AddArg(ptr) 10450 v2.AddArg(v3) 10451 v2.AddArg(mem) 10452 v.AddArg(v2) 10453 return true 10454 } 10455 // match: (Load <t> ptr mem) 10456 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 10457 // 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)) 10458 for { 10459 t := v.Type 10460 _ = v.Args[1] 10461 ptr := v.Args[0] 10462 mem := v.Args[1] 10463 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 10464 break 10465 } 10466 v.reset(OpStructMake3) 10467 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 10468 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 10469 v1.AuxInt = 0 10470 v1.AddArg(ptr) 10471 v0.AddArg(v1) 10472 v0.AddArg(mem) 10473 v.AddArg(v0) 10474 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 10475 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 10476 v3.AuxInt = t.FieldOff(1) 10477 v3.AddArg(ptr) 10478 v2.AddArg(v3) 10479 v2.AddArg(mem) 10480 v.AddArg(v2) 10481 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 10482 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 10483 v5.AuxInt = t.FieldOff(2) 10484 v5.AddArg(ptr) 10485 v4.AddArg(v5) 10486 v4.AddArg(mem) 10487 v.AddArg(v4) 10488 return true 10489 } 10490 // match: (Load <t> ptr mem) 10491 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 10492 // 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)) 10493 for { 10494 t := v.Type 10495 _ = v.Args[1] 10496 ptr := v.Args[0] 10497 mem := v.Args[1] 10498 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 10499 break 10500 } 10501 v.reset(OpStructMake4) 10502 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 10503 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 10504 v1.AuxInt = 0 10505 v1.AddArg(ptr) 10506 v0.AddArg(v1) 10507 v0.AddArg(mem) 10508 v.AddArg(v0) 10509 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 10510 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 10511 v3.AuxInt = t.FieldOff(1) 10512 v3.AddArg(ptr) 10513 v2.AddArg(v3) 10514 v2.AddArg(mem) 10515 v.AddArg(v2) 10516 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 10517 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 10518 v5.AuxInt = t.FieldOff(2) 10519 v5.AddArg(ptr) 10520 v4.AddArg(v5) 10521 v4.AddArg(mem) 10522 v.AddArg(v4) 10523 v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) 10524 v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 10525 v7.AuxInt = t.FieldOff(3) 10526 v7.AddArg(ptr) 10527 v6.AddArg(v7) 10528 v6.AddArg(mem) 10529 v.AddArg(v6) 10530 return true 10531 } 10532 // match: (Load <t> _ _) 10533 // cond: t.IsArray() && t.NumElem() == 0 10534 // result: (ArrayMake0) 10535 for { 10536 t := v.Type 10537 _ = v.Args[1] 10538 if !(t.IsArray() && t.NumElem() == 0) { 10539 break 10540 } 10541 v.reset(OpArrayMake0) 10542 return true 10543 } 10544 // match: (Load <t> ptr mem) 10545 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 10546 // result: (ArrayMake1 (Load <t.ElemType()> ptr mem)) 10547 for { 10548 t := v.Type 10549 _ = v.Args[1] 10550 ptr := v.Args[0] 10551 mem := v.Args[1] 10552 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 10553 break 10554 } 10555 v.reset(OpArrayMake1) 10556 v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType()) 10557 v0.AddArg(ptr) 10558 v0.AddArg(mem) 10559 v.AddArg(v0) 10560 return true 10561 } 10562 return false 10563 } 10564 func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { 10565 b := v.Block 10566 _ = b 10567 // match: (Lsh16x16 <t> x (Const16 [c])) 10568 // cond: 10569 // result: (Lsh16x64 x (Const64 <t> [int64(uint16(c))])) 10570 for { 10571 t := v.Type 10572 _ = v.Args[1] 10573 x := v.Args[0] 10574 v_1 := v.Args[1] 10575 if v_1.Op != OpConst16 { 10576 break 10577 } 10578 c := v_1.AuxInt 10579 v.reset(OpLsh16x64) 10580 v.AddArg(x) 10581 v0 := b.NewValue0(v.Pos, OpConst64, t) 10582 v0.AuxInt = int64(uint16(c)) 10583 v.AddArg(v0) 10584 return true 10585 } 10586 // match: (Lsh16x16 (Const16 [0]) _) 10587 // cond: 10588 // result: (Const16 [0]) 10589 for { 10590 _ = v.Args[1] 10591 v_0 := v.Args[0] 10592 if v_0.Op != OpConst16 { 10593 break 10594 } 10595 if v_0.AuxInt != 0 { 10596 break 10597 } 10598 v.reset(OpConst16) 10599 v.AuxInt = 0 10600 return true 10601 } 10602 return false 10603 } 10604 func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { 10605 b := v.Block 10606 _ = b 10607 // match: (Lsh16x32 <t> x (Const32 [c])) 10608 // cond: 10609 // result: (Lsh16x64 x (Const64 <t> [int64(uint32(c))])) 10610 for { 10611 t := v.Type 10612 _ = v.Args[1] 10613 x := v.Args[0] 10614 v_1 := v.Args[1] 10615 if v_1.Op != OpConst32 { 10616 break 10617 } 10618 c := v_1.AuxInt 10619 v.reset(OpLsh16x64) 10620 v.AddArg(x) 10621 v0 := b.NewValue0(v.Pos, OpConst64, t) 10622 v0.AuxInt = int64(uint32(c)) 10623 v.AddArg(v0) 10624 return true 10625 } 10626 // match: (Lsh16x32 (Const16 [0]) _) 10627 // cond: 10628 // result: (Const16 [0]) 10629 for { 10630 _ = v.Args[1] 10631 v_0 := v.Args[0] 10632 if v_0.Op != OpConst16 { 10633 break 10634 } 10635 if v_0.AuxInt != 0 { 10636 break 10637 } 10638 v.reset(OpConst16) 10639 v.AuxInt = 0 10640 return true 10641 } 10642 return false 10643 } 10644 func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { 10645 b := v.Block 10646 _ = b 10647 typ := &b.Func.Config.Types 10648 _ = typ 10649 // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) 10650 // cond: 10651 // result: (Const16 [int64(int16(c) << uint64(d))]) 10652 for { 10653 _ = v.Args[1] 10654 v_0 := v.Args[0] 10655 if v_0.Op != OpConst16 { 10656 break 10657 } 10658 c := v_0.AuxInt 10659 v_1 := v.Args[1] 10660 if v_1.Op != OpConst64 { 10661 break 10662 } 10663 d := v_1.AuxInt 10664 v.reset(OpConst16) 10665 v.AuxInt = int64(int16(c) << uint64(d)) 10666 return true 10667 } 10668 // match: (Lsh16x64 x (Const64 [0])) 10669 // cond: 10670 // result: x 10671 for { 10672 _ = v.Args[1] 10673 x := v.Args[0] 10674 v_1 := v.Args[1] 10675 if v_1.Op != OpConst64 { 10676 break 10677 } 10678 if v_1.AuxInt != 0 { 10679 break 10680 } 10681 v.reset(OpCopy) 10682 v.Type = x.Type 10683 v.AddArg(x) 10684 return true 10685 } 10686 // match: (Lsh16x64 (Const16 [0]) _) 10687 // cond: 10688 // result: (Const16 [0]) 10689 for { 10690 _ = v.Args[1] 10691 v_0 := v.Args[0] 10692 if v_0.Op != OpConst16 { 10693 break 10694 } 10695 if v_0.AuxInt != 0 { 10696 break 10697 } 10698 v.reset(OpConst16) 10699 v.AuxInt = 0 10700 return true 10701 } 10702 // match: (Lsh16x64 _ (Const64 [c])) 10703 // cond: uint64(c) >= 16 10704 // result: (Const16 [0]) 10705 for { 10706 _ = v.Args[1] 10707 v_1 := v.Args[1] 10708 if v_1.Op != OpConst64 { 10709 break 10710 } 10711 c := v_1.AuxInt 10712 if !(uint64(c) >= 16) { 10713 break 10714 } 10715 v.reset(OpConst16) 10716 v.AuxInt = 0 10717 return true 10718 } 10719 // match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d])) 10720 // cond: !uaddOvf(c,d) 10721 // result: (Lsh16x64 x (Const64 <t> [c+d])) 10722 for { 10723 t := v.Type 10724 _ = v.Args[1] 10725 v_0 := v.Args[0] 10726 if v_0.Op != OpLsh16x64 { 10727 break 10728 } 10729 _ = v_0.Args[1] 10730 x := v_0.Args[0] 10731 v_0_1 := v_0.Args[1] 10732 if v_0_1.Op != OpConst64 { 10733 break 10734 } 10735 c := v_0_1.AuxInt 10736 v_1 := v.Args[1] 10737 if v_1.Op != OpConst64 { 10738 break 10739 } 10740 d := v_1.AuxInt 10741 if !(!uaddOvf(c, d)) { 10742 break 10743 } 10744 v.reset(OpLsh16x64) 10745 v.AddArg(x) 10746 v0 := b.NewValue0(v.Pos, OpConst64, t) 10747 v0.AuxInt = c + d 10748 v.AddArg(v0) 10749 return true 10750 } 10751 // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 10752 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 10753 // result: (Lsh16x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 10754 for { 10755 _ = v.Args[1] 10756 v_0 := v.Args[0] 10757 if v_0.Op != OpRsh16Ux64 { 10758 break 10759 } 10760 _ = v_0.Args[1] 10761 v_0_0 := v_0.Args[0] 10762 if v_0_0.Op != OpLsh16x64 { 10763 break 10764 } 10765 _ = v_0_0.Args[1] 10766 x := v_0_0.Args[0] 10767 v_0_0_1 := v_0_0.Args[1] 10768 if v_0_0_1.Op != OpConst64 { 10769 break 10770 } 10771 c1 := v_0_0_1.AuxInt 10772 v_0_1 := v_0.Args[1] 10773 if v_0_1.Op != OpConst64 { 10774 break 10775 } 10776 c2 := v_0_1.AuxInt 10777 v_1 := v.Args[1] 10778 if v_1.Op != OpConst64 { 10779 break 10780 } 10781 c3 := v_1.AuxInt 10782 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 10783 break 10784 } 10785 v.reset(OpLsh16x64) 10786 v.AddArg(x) 10787 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 10788 v0.AuxInt = c1 - c2 + c3 10789 v.AddArg(v0) 10790 return true 10791 } 10792 return false 10793 } 10794 func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { 10795 b := v.Block 10796 _ = b 10797 // match: (Lsh16x8 <t> x (Const8 [c])) 10798 // cond: 10799 // result: (Lsh16x64 x (Const64 <t> [int64(uint8(c))])) 10800 for { 10801 t := v.Type 10802 _ = v.Args[1] 10803 x := v.Args[0] 10804 v_1 := v.Args[1] 10805 if v_1.Op != OpConst8 { 10806 break 10807 } 10808 c := v_1.AuxInt 10809 v.reset(OpLsh16x64) 10810 v.AddArg(x) 10811 v0 := b.NewValue0(v.Pos, OpConst64, t) 10812 v0.AuxInt = int64(uint8(c)) 10813 v.AddArg(v0) 10814 return true 10815 } 10816 // match: (Lsh16x8 (Const16 [0]) _) 10817 // cond: 10818 // result: (Const16 [0]) 10819 for { 10820 _ = v.Args[1] 10821 v_0 := v.Args[0] 10822 if v_0.Op != OpConst16 { 10823 break 10824 } 10825 if v_0.AuxInt != 0 { 10826 break 10827 } 10828 v.reset(OpConst16) 10829 v.AuxInt = 0 10830 return true 10831 } 10832 return false 10833 } 10834 func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { 10835 b := v.Block 10836 _ = b 10837 // match: (Lsh32x16 <t> x (Const16 [c])) 10838 // cond: 10839 // result: (Lsh32x64 x (Const64 <t> [int64(uint16(c))])) 10840 for { 10841 t := v.Type 10842 _ = v.Args[1] 10843 x := v.Args[0] 10844 v_1 := v.Args[1] 10845 if v_1.Op != OpConst16 { 10846 break 10847 } 10848 c := v_1.AuxInt 10849 v.reset(OpLsh32x64) 10850 v.AddArg(x) 10851 v0 := b.NewValue0(v.Pos, OpConst64, t) 10852 v0.AuxInt = int64(uint16(c)) 10853 v.AddArg(v0) 10854 return true 10855 } 10856 // match: (Lsh32x16 (Const32 [0]) _) 10857 // cond: 10858 // result: (Const32 [0]) 10859 for { 10860 _ = v.Args[1] 10861 v_0 := v.Args[0] 10862 if v_0.Op != OpConst32 { 10863 break 10864 } 10865 if v_0.AuxInt != 0 { 10866 break 10867 } 10868 v.reset(OpConst32) 10869 v.AuxInt = 0 10870 return true 10871 } 10872 return false 10873 } 10874 func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { 10875 b := v.Block 10876 _ = b 10877 // match: (Lsh32x32 <t> x (Const32 [c])) 10878 // cond: 10879 // result: (Lsh32x64 x (Const64 <t> [int64(uint32(c))])) 10880 for { 10881 t := v.Type 10882 _ = v.Args[1] 10883 x := v.Args[0] 10884 v_1 := v.Args[1] 10885 if v_1.Op != OpConst32 { 10886 break 10887 } 10888 c := v_1.AuxInt 10889 v.reset(OpLsh32x64) 10890 v.AddArg(x) 10891 v0 := b.NewValue0(v.Pos, OpConst64, t) 10892 v0.AuxInt = int64(uint32(c)) 10893 v.AddArg(v0) 10894 return true 10895 } 10896 // match: (Lsh32x32 (Const32 [0]) _) 10897 // cond: 10898 // result: (Const32 [0]) 10899 for { 10900 _ = v.Args[1] 10901 v_0 := v.Args[0] 10902 if v_0.Op != OpConst32 { 10903 break 10904 } 10905 if v_0.AuxInt != 0 { 10906 break 10907 } 10908 v.reset(OpConst32) 10909 v.AuxInt = 0 10910 return true 10911 } 10912 return false 10913 } 10914 func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { 10915 b := v.Block 10916 _ = b 10917 typ := &b.Func.Config.Types 10918 _ = typ 10919 // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) 10920 // cond: 10921 // result: (Const32 [int64(int32(c) << uint64(d))]) 10922 for { 10923 _ = v.Args[1] 10924 v_0 := v.Args[0] 10925 if v_0.Op != OpConst32 { 10926 break 10927 } 10928 c := v_0.AuxInt 10929 v_1 := v.Args[1] 10930 if v_1.Op != OpConst64 { 10931 break 10932 } 10933 d := v_1.AuxInt 10934 v.reset(OpConst32) 10935 v.AuxInt = int64(int32(c) << uint64(d)) 10936 return true 10937 } 10938 // match: (Lsh32x64 x (Const64 [0])) 10939 // cond: 10940 // result: x 10941 for { 10942 _ = v.Args[1] 10943 x := v.Args[0] 10944 v_1 := v.Args[1] 10945 if v_1.Op != OpConst64 { 10946 break 10947 } 10948 if v_1.AuxInt != 0 { 10949 break 10950 } 10951 v.reset(OpCopy) 10952 v.Type = x.Type 10953 v.AddArg(x) 10954 return true 10955 } 10956 // match: (Lsh32x64 (Const32 [0]) _) 10957 // cond: 10958 // result: (Const32 [0]) 10959 for { 10960 _ = v.Args[1] 10961 v_0 := v.Args[0] 10962 if v_0.Op != OpConst32 { 10963 break 10964 } 10965 if v_0.AuxInt != 0 { 10966 break 10967 } 10968 v.reset(OpConst32) 10969 v.AuxInt = 0 10970 return true 10971 } 10972 // match: (Lsh32x64 _ (Const64 [c])) 10973 // cond: uint64(c) >= 32 10974 // result: (Const32 [0]) 10975 for { 10976 _ = v.Args[1] 10977 v_1 := v.Args[1] 10978 if v_1.Op != OpConst64 { 10979 break 10980 } 10981 c := v_1.AuxInt 10982 if !(uint64(c) >= 32) { 10983 break 10984 } 10985 v.reset(OpConst32) 10986 v.AuxInt = 0 10987 return true 10988 } 10989 // match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d])) 10990 // cond: !uaddOvf(c,d) 10991 // result: (Lsh32x64 x (Const64 <t> [c+d])) 10992 for { 10993 t := v.Type 10994 _ = v.Args[1] 10995 v_0 := v.Args[0] 10996 if v_0.Op != OpLsh32x64 { 10997 break 10998 } 10999 _ = v_0.Args[1] 11000 x := v_0.Args[0] 11001 v_0_1 := v_0.Args[1] 11002 if v_0_1.Op != OpConst64 { 11003 break 11004 } 11005 c := v_0_1.AuxInt 11006 v_1 := v.Args[1] 11007 if v_1.Op != OpConst64 { 11008 break 11009 } 11010 d := v_1.AuxInt 11011 if !(!uaddOvf(c, d)) { 11012 break 11013 } 11014 v.reset(OpLsh32x64) 11015 v.AddArg(x) 11016 v0 := b.NewValue0(v.Pos, OpConst64, t) 11017 v0.AuxInt = c + d 11018 v.AddArg(v0) 11019 return true 11020 } 11021 // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 11022 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 11023 // result: (Lsh32x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 11024 for { 11025 _ = v.Args[1] 11026 v_0 := v.Args[0] 11027 if v_0.Op != OpRsh32Ux64 { 11028 break 11029 } 11030 _ = v_0.Args[1] 11031 v_0_0 := v_0.Args[0] 11032 if v_0_0.Op != OpLsh32x64 { 11033 break 11034 } 11035 _ = v_0_0.Args[1] 11036 x := v_0_0.Args[0] 11037 v_0_0_1 := v_0_0.Args[1] 11038 if v_0_0_1.Op != OpConst64 { 11039 break 11040 } 11041 c1 := v_0_0_1.AuxInt 11042 v_0_1 := v_0.Args[1] 11043 if v_0_1.Op != OpConst64 { 11044 break 11045 } 11046 c2 := v_0_1.AuxInt 11047 v_1 := v.Args[1] 11048 if v_1.Op != OpConst64 { 11049 break 11050 } 11051 c3 := v_1.AuxInt 11052 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 11053 break 11054 } 11055 v.reset(OpLsh32x64) 11056 v.AddArg(x) 11057 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 11058 v0.AuxInt = c1 - c2 + c3 11059 v.AddArg(v0) 11060 return true 11061 } 11062 return false 11063 } 11064 func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { 11065 b := v.Block 11066 _ = b 11067 // match: (Lsh32x8 <t> x (Const8 [c])) 11068 // cond: 11069 // result: (Lsh32x64 x (Const64 <t> [int64(uint8(c))])) 11070 for { 11071 t := v.Type 11072 _ = v.Args[1] 11073 x := v.Args[0] 11074 v_1 := v.Args[1] 11075 if v_1.Op != OpConst8 { 11076 break 11077 } 11078 c := v_1.AuxInt 11079 v.reset(OpLsh32x64) 11080 v.AddArg(x) 11081 v0 := b.NewValue0(v.Pos, OpConst64, t) 11082 v0.AuxInt = int64(uint8(c)) 11083 v.AddArg(v0) 11084 return true 11085 } 11086 // match: (Lsh32x8 (Const32 [0]) _) 11087 // cond: 11088 // result: (Const32 [0]) 11089 for { 11090 _ = v.Args[1] 11091 v_0 := v.Args[0] 11092 if v_0.Op != OpConst32 { 11093 break 11094 } 11095 if v_0.AuxInt != 0 { 11096 break 11097 } 11098 v.reset(OpConst32) 11099 v.AuxInt = 0 11100 return true 11101 } 11102 return false 11103 } 11104 func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { 11105 b := v.Block 11106 _ = b 11107 // match: (Lsh64x16 <t> x (Const16 [c])) 11108 // cond: 11109 // result: (Lsh64x64 x (Const64 <t> [int64(uint16(c))])) 11110 for { 11111 t := v.Type 11112 _ = v.Args[1] 11113 x := v.Args[0] 11114 v_1 := v.Args[1] 11115 if v_1.Op != OpConst16 { 11116 break 11117 } 11118 c := v_1.AuxInt 11119 v.reset(OpLsh64x64) 11120 v.AddArg(x) 11121 v0 := b.NewValue0(v.Pos, OpConst64, t) 11122 v0.AuxInt = int64(uint16(c)) 11123 v.AddArg(v0) 11124 return true 11125 } 11126 // match: (Lsh64x16 (Const64 [0]) _) 11127 // cond: 11128 // result: (Const64 [0]) 11129 for { 11130 _ = v.Args[1] 11131 v_0 := v.Args[0] 11132 if v_0.Op != OpConst64 { 11133 break 11134 } 11135 if v_0.AuxInt != 0 { 11136 break 11137 } 11138 v.reset(OpConst64) 11139 v.AuxInt = 0 11140 return true 11141 } 11142 return false 11143 } 11144 func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { 11145 b := v.Block 11146 _ = b 11147 // match: (Lsh64x32 <t> x (Const32 [c])) 11148 // cond: 11149 // result: (Lsh64x64 x (Const64 <t> [int64(uint32(c))])) 11150 for { 11151 t := v.Type 11152 _ = v.Args[1] 11153 x := v.Args[0] 11154 v_1 := v.Args[1] 11155 if v_1.Op != OpConst32 { 11156 break 11157 } 11158 c := v_1.AuxInt 11159 v.reset(OpLsh64x64) 11160 v.AddArg(x) 11161 v0 := b.NewValue0(v.Pos, OpConst64, t) 11162 v0.AuxInt = int64(uint32(c)) 11163 v.AddArg(v0) 11164 return true 11165 } 11166 // match: (Lsh64x32 (Const64 [0]) _) 11167 // cond: 11168 // result: (Const64 [0]) 11169 for { 11170 _ = v.Args[1] 11171 v_0 := v.Args[0] 11172 if v_0.Op != OpConst64 { 11173 break 11174 } 11175 if v_0.AuxInt != 0 { 11176 break 11177 } 11178 v.reset(OpConst64) 11179 v.AuxInt = 0 11180 return true 11181 } 11182 return false 11183 } 11184 func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { 11185 b := v.Block 11186 _ = b 11187 typ := &b.Func.Config.Types 11188 _ = typ 11189 // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) 11190 // cond: 11191 // result: (Const64 [c << uint64(d)]) 11192 for { 11193 _ = v.Args[1] 11194 v_0 := v.Args[0] 11195 if v_0.Op != OpConst64 { 11196 break 11197 } 11198 c := v_0.AuxInt 11199 v_1 := v.Args[1] 11200 if v_1.Op != OpConst64 { 11201 break 11202 } 11203 d := v_1.AuxInt 11204 v.reset(OpConst64) 11205 v.AuxInt = c << uint64(d) 11206 return true 11207 } 11208 // match: (Lsh64x64 x (Const64 [0])) 11209 // cond: 11210 // result: x 11211 for { 11212 _ = v.Args[1] 11213 x := v.Args[0] 11214 v_1 := v.Args[1] 11215 if v_1.Op != OpConst64 { 11216 break 11217 } 11218 if v_1.AuxInt != 0 { 11219 break 11220 } 11221 v.reset(OpCopy) 11222 v.Type = x.Type 11223 v.AddArg(x) 11224 return true 11225 } 11226 // match: (Lsh64x64 (Const64 [0]) _) 11227 // cond: 11228 // result: (Const64 [0]) 11229 for { 11230 _ = v.Args[1] 11231 v_0 := v.Args[0] 11232 if v_0.Op != OpConst64 { 11233 break 11234 } 11235 if v_0.AuxInt != 0 { 11236 break 11237 } 11238 v.reset(OpConst64) 11239 v.AuxInt = 0 11240 return true 11241 } 11242 // match: (Lsh64x64 _ (Const64 [c])) 11243 // cond: uint64(c) >= 64 11244 // result: (Const64 [0]) 11245 for { 11246 _ = v.Args[1] 11247 v_1 := v.Args[1] 11248 if v_1.Op != OpConst64 { 11249 break 11250 } 11251 c := v_1.AuxInt 11252 if !(uint64(c) >= 64) { 11253 break 11254 } 11255 v.reset(OpConst64) 11256 v.AuxInt = 0 11257 return true 11258 } 11259 // match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d])) 11260 // cond: !uaddOvf(c,d) 11261 // result: (Lsh64x64 x (Const64 <t> [c+d])) 11262 for { 11263 t := v.Type 11264 _ = v.Args[1] 11265 v_0 := v.Args[0] 11266 if v_0.Op != OpLsh64x64 { 11267 break 11268 } 11269 _ = v_0.Args[1] 11270 x := v_0.Args[0] 11271 v_0_1 := v_0.Args[1] 11272 if v_0_1.Op != OpConst64 { 11273 break 11274 } 11275 c := v_0_1.AuxInt 11276 v_1 := v.Args[1] 11277 if v_1.Op != OpConst64 { 11278 break 11279 } 11280 d := v_1.AuxInt 11281 if !(!uaddOvf(c, d)) { 11282 break 11283 } 11284 v.reset(OpLsh64x64) 11285 v.AddArg(x) 11286 v0 := b.NewValue0(v.Pos, OpConst64, t) 11287 v0.AuxInt = c + d 11288 v.AddArg(v0) 11289 return true 11290 } 11291 // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 11292 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 11293 // result: (Lsh64x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 11294 for { 11295 _ = v.Args[1] 11296 v_0 := v.Args[0] 11297 if v_0.Op != OpRsh64Ux64 { 11298 break 11299 } 11300 _ = v_0.Args[1] 11301 v_0_0 := v_0.Args[0] 11302 if v_0_0.Op != OpLsh64x64 { 11303 break 11304 } 11305 _ = v_0_0.Args[1] 11306 x := v_0_0.Args[0] 11307 v_0_0_1 := v_0_0.Args[1] 11308 if v_0_0_1.Op != OpConst64 { 11309 break 11310 } 11311 c1 := v_0_0_1.AuxInt 11312 v_0_1 := v_0.Args[1] 11313 if v_0_1.Op != OpConst64 { 11314 break 11315 } 11316 c2 := v_0_1.AuxInt 11317 v_1 := v.Args[1] 11318 if v_1.Op != OpConst64 { 11319 break 11320 } 11321 c3 := v_1.AuxInt 11322 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 11323 break 11324 } 11325 v.reset(OpLsh64x64) 11326 v.AddArg(x) 11327 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 11328 v0.AuxInt = c1 - c2 + c3 11329 v.AddArg(v0) 11330 return true 11331 } 11332 return false 11333 } 11334 func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { 11335 b := v.Block 11336 _ = b 11337 // match: (Lsh64x8 <t> x (Const8 [c])) 11338 // cond: 11339 // result: (Lsh64x64 x (Const64 <t> [int64(uint8(c))])) 11340 for { 11341 t := v.Type 11342 _ = v.Args[1] 11343 x := v.Args[0] 11344 v_1 := v.Args[1] 11345 if v_1.Op != OpConst8 { 11346 break 11347 } 11348 c := v_1.AuxInt 11349 v.reset(OpLsh64x64) 11350 v.AddArg(x) 11351 v0 := b.NewValue0(v.Pos, OpConst64, t) 11352 v0.AuxInt = int64(uint8(c)) 11353 v.AddArg(v0) 11354 return true 11355 } 11356 // match: (Lsh64x8 (Const64 [0]) _) 11357 // cond: 11358 // result: (Const64 [0]) 11359 for { 11360 _ = v.Args[1] 11361 v_0 := v.Args[0] 11362 if v_0.Op != OpConst64 { 11363 break 11364 } 11365 if v_0.AuxInt != 0 { 11366 break 11367 } 11368 v.reset(OpConst64) 11369 v.AuxInt = 0 11370 return true 11371 } 11372 return false 11373 } 11374 func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { 11375 b := v.Block 11376 _ = b 11377 // match: (Lsh8x16 <t> x (Const16 [c])) 11378 // cond: 11379 // result: (Lsh8x64 x (Const64 <t> [int64(uint16(c))])) 11380 for { 11381 t := v.Type 11382 _ = v.Args[1] 11383 x := v.Args[0] 11384 v_1 := v.Args[1] 11385 if v_1.Op != OpConst16 { 11386 break 11387 } 11388 c := v_1.AuxInt 11389 v.reset(OpLsh8x64) 11390 v.AddArg(x) 11391 v0 := b.NewValue0(v.Pos, OpConst64, t) 11392 v0.AuxInt = int64(uint16(c)) 11393 v.AddArg(v0) 11394 return true 11395 } 11396 // match: (Lsh8x16 (Const8 [0]) _) 11397 // cond: 11398 // result: (Const8 [0]) 11399 for { 11400 _ = v.Args[1] 11401 v_0 := v.Args[0] 11402 if v_0.Op != OpConst8 { 11403 break 11404 } 11405 if v_0.AuxInt != 0 { 11406 break 11407 } 11408 v.reset(OpConst8) 11409 v.AuxInt = 0 11410 return true 11411 } 11412 return false 11413 } 11414 func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { 11415 b := v.Block 11416 _ = b 11417 // match: (Lsh8x32 <t> x (Const32 [c])) 11418 // cond: 11419 // result: (Lsh8x64 x (Const64 <t> [int64(uint32(c))])) 11420 for { 11421 t := v.Type 11422 _ = v.Args[1] 11423 x := v.Args[0] 11424 v_1 := v.Args[1] 11425 if v_1.Op != OpConst32 { 11426 break 11427 } 11428 c := v_1.AuxInt 11429 v.reset(OpLsh8x64) 11430 v.AddArg(x) 11431 v0 := b.NewValue0(v.Pos, OpConst64, t) 11432 v0.AuxInt = int64(uint32(c)) 11433 v.AddArg(v0) 11434 return true 11435 } 11436 // match: (Lsh8x32 (Const8 [0]) _) 11437 // cond: 11438 // result: (Const8 [0]) 11439 for { 11440 _ = v.Args[1] 11441 v_0 := v.Args[0] 11442 if v_0.Op != OpConst8 { 11443 break 11444 } 11445 if v_0.AuxInt != 0 { 11446 break 11447 } 11448 v.reset(OpConst8) 11449 v.AuxInt = 0 11450 return true 11451 } 11452 return false 11453 } 11454 func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { 11455 b := v.Block 11456 _ = b 11457 typ := &b.Func.Config.Types 11458 _ = typ 11459 // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) 11460 // cond: 11461 // result: (Const8 [int64(int8(c) << uint64(d))]) 11462 for { 11463 _ = v.Args[1] 11464 v_0 := v.Args[0] 11465 if v_0.Op != OpConst8 { 11466 break 11467 } 11468 c := v_0.AuxInt 11469 v_1 := v.Args[1] 11470 if v_1.Op != OpConst64 { 11471 break 11472 } 11473 d := v_1.AuxInt 11474 v.reset(OpConst8) 11475 v.AuxInt = int64(int8(c) << uint64(d)) 11476 return true 11477 } 11478 // match: (Lsh8x64 x (Const64 [0])) 11479 // cond: 11480 // result: x 11481 for { 11482 _ = v.Args[1] 11483 x := v.Args[0] 11484 v_1 := v.Args[1] 11485 if v_1.Op != OpConst64 { 11486 break 11487 } 11488 if v_1.AuxInt != 0 { 11489 break 11490 } 11491 v.reset(OpCopy) 11492 v.Type = x.Type 11493 v.AddArg(x) 11494 return true 11495 } 11496 // match: (Lsh8x64 (Const8 [0]) _) 11497 // cond: 11498 // result: (Const8 [0]) 11499 for { 11500 _ = v.Args[1] 11501 v_0 := v.Args[0] 11502 if v_0.Op != OpConst8 { 11503 break 11504 } 11505 if v_0.AuxInt != 0 { 11506 break 11507 } 11508 v.reset(OpConst8) 11509 v.AuxInt = 0 11510 return true 11511 } 11512 // match: (Lsh8x64 _ (Const64 [c])) 11513 // cond: uint64(c) >= 8 11514 // result: (Const8 [0]) 11515 for { 11516 _ = v.Args[1] 11517 v_1 := v.Args[1] 11518 if v_1.Op != OpConst64 { 11519 break 11520 } 11521 c := v_1.AuxInt 11522 if !(uint64(c) >= 8) { 11523 break 11524 } 11525 v.reset(OpConst8) 11526 v.AuxInt = 0 11527 return true 11528 } 11529 // match: (Lsh8x64 <t> (Lsh8x64 x (Const64 [c])) (Const64 [d])) 11530 // cond: !uaddOvf(c,d) 11531 // result: (Lsh8x64 x (Const64 <t> [c+d])) 11532 for { 11533 t := v.Type 11534 _ = v.Args[1] 11535 v_0 := v.Args[0] 11536 if v_0.Op != OpLsh8x64 { 11537 break 11538 } 11539 _ = v_0.Args[1] 11540 x := v_0.Args[0] 11541 v_0_1 := v_0.Args[1] 11542 if v_0_1.Op != OpConst64 { 11543 break 11544 } 11545 c := v_0_1.AuxInt 11546 v_1 := v.Args[1] 11547 if v_1.Op != OpConst64 { 11548 break 11549 } 11550 d := v_1.AuxInt 11551 if !(!uaddOvf(c, d)) { 11552 break 11553 } 11554 v.reset(OpLsh8x64) 11555 v.AddArg(x) 11556 v0 := b.NewValue0(v.Pos, OpConst64, t) 11557 v0.AuxInt = c + d 11558 v.AddArg(v0) 11559 return true 11560 } 11561 // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 11562 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 11563 // result: (Lsh8x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 11564 for { 11565 _ = v.Args[1] 11566 v_0 := v.Args[0] 11567 if v_0.Op != OpRsh8Ux64 { 11568 break 11569 } 11570 _ = v_0.Args[1] 11571 v_0_0 := v_0.Args[0] 11572 if v_0_0.Op != OpLsh8x64 { 11573 break 11574 } 11575 _ = v_0_0.Args[1] 11576 x := v_0_0.Args[0] 11577 v_0_0_1 := v_0_0.Args[1] 11578 if v_0_0_1.Op != OpConst64 { 11579 break 11580 } 11581 c1 := v_0_0_1.AuxInt 11582 v_0_1 := v_0.Args[1] 11583 if v_0_1.Op != OpConst64 { 11584 break 11585 } 11586 c2 := v_0_1.AuxInt 11587 v_1 := v.Args[1] 11588 if v_1.Op != OpConst64 { 11589 break 11590 } 11591 c3 := v_1.AuxInt 11592 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 11593 break 11594 } 11595 v.reset(OpLsh8x64) 11596 v.AddArg(x) 11597 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 11598 v0.AuxInt = c1 - c2 + c3 11599 v.AddArg(v0) 11600 return true 11601 } 11602 return false 11603 } 11604 func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { 11605 b := v.Block 11606 _ = b 11607 // match: (Lsh8x8 <t> x (Const8 [c])) 11608 // cond: 11609 // result: (Lsh8x64 x (Const64 <t> [int64(uint8(c))])) 11610 for { 11611 t := v.Type 11612 _ = v.Args[1] 11613 x := v.Args[0] 11614 v_1 := v.Args[1] 11615 if v_1.Op != OpConst8 { 11616 break 11617 } 11618 c := v_1.AuxInt 11619 v.reset(OpLsh8x64) 11620 v.AddArg(x) 11621 v0 := b.NewValue0(v.Pos, OpConst64, t) 11622 v0.AuxInt = int64(uint8(c)) 11623 v.AddArg(v0) 11624 return true 11625 } 11626 // match: (Lsh8x8 (Const8 [0]) _) 11627 // cond: 11628 // result: (Const8 [0]) 11629 for { 11630 _ = v.Args[1] 11631 v_0 := v.Args[0] 11632 if v_0.Op != OpConst8 { 11633 break 11634 } 11635 if v_0.AuxInt != 0 { 11636 break 11637 } 11638 v.reset(OpConst8) 11639 v.AuxInt = 0 11640 return true 11641 } 11642 return false 11643 } 11644 func rewriteValuegeneric_OpMod16_0(v *Value) bool { 11645 b := v.Block 11646 _ = b 11647 // match: (Mod16 (Const16 [c]) (Const16 [d])) 11648 // cond: d != 0 11649 // result: (Const16 [int64(int16(c % d))]) 11650 for { 11651 _ = v.Args[1] 11652 v_0 := v.Args[0] 11653 if v_0.Op != OpConst16 { 11654 break 11655 } 11656 c := v_0.AuxInt 11657 v_1 := v.Args[1] 11658 if v_1.Op != OpConst16 { 11659 break 11660 } 11661 d := v_1.AuxInt 11662 if !(d != 0) { 11663 break 11664 } 11665 v.reset(OpConst16) 11666 v.AuxInt = int64(int16(c % d)) 11667 return true 11668 } 11669 // match: (Mod16 <t> n (Const16 [c])) 11670 // cond: c < 0 && c != -1<<15 11671 // result: (Mod16 <t> n (Const16 <t> [-c])) 11672 for { 11673 t := v.Type 11674 _ = v.Args[1] 11675 n := v.Args[0] 11676 v_1 := v.Args[1] 11677 if v_1.Op != OpConst16 { 11678 break 11679 } 11680 c := v_1.AuxInt 11681 if !(c < 0 && c != -1<<15) { 11682 break 11683 } 11684 v.reset(OpMod16) 11685 v.Type = t 11686 v.AddArg(n) 11687 v0 := b.NewValue0(v.Pos, OpConst16, t) 11688 v0.AuxInt = -c 11689 v.AddArg(v0) 11690 return true 11691 } 11692 // match: (Mod16 <t> x (Const16 [c])) 11693 // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) 11694 // result: (Sub16 x (Mul16 <t> (Div16 <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 11695 for { 11696 t := v.Type 11697 _ = v.Args[1] 11698 x := v.Args[0] 11699 v_1 := v.Args[1] 11700 if v_1.Op != OpConst16 { 11701 break 11702 } 11703 c := v_1.AuxInt 11704 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { 11705 break 11706 } 11707 v.reset(OpSub16) 11708 v.AddArg(x) 11709 v0 := b.NewValue0(v.Pos, OpMul16, t) 11710 v1 := b.NewValue0(v.Pos, OpDiv16, t) 11711 v1.AddArg(x) 11712 v2 := b.NewValue0(v.Pos, OpConst16, t) 11713 v2.AuxInt = c 11714 v1.AddArg(v2) 11715 v0.AddArg(v1) 11716 v3 := b.NewValue0(v.Pos, OpConst16, t) 11717 v3.AuxInt = c 11718 v0.AddArg(v3) 11719 v.AddArg(v0) 11720 return true 11721 } 11722 return false 11723 } 11724 func rewriteValuegeneric_OpMod16u_0(v *Value) bool { 11725 b := v.Block 11726 _ = b 11727 // match: (Mod16u (Const16 [c]) (Const16 [d])) 11728 // cond: d != 0 11729 // result: (Const16 [int64(uint16(c) % uint16(d))]) 11730 for { 11731 _ = v.Args[1] 11732 v_0 := v.Args[0] 11733 if v_0.Op != OpConst16 { 11734 break 11735 } 11736 c := v_0.AuxInt 11737 v_1 := v.Args[1] 11738 if v_1.Op != OpConst16 { 11739 break 11740 } 11741 d := v_1.AuxInt 11742 if !(d != 0) { 11743 break 11744 } 11745 v.reset(OpConst16) 11746 v.AuxInt = int64(uint16(c) % uint16(d)) 11747 return true 11748 } 11749 // match: (Mod16u <t> n (Const16 [c])) 11750 // cond: isPowerOfTwo(c&0xffff) 11751 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 11752 for { 11753 t := v.Type 11754 _ = v.Args[1] 11755 n := v.Args[0] 11756 v_1 := v.Args[1] 11757 if v_1.Op != OpConst16 { 11758 break 11759 } 11760 c := v_1.AuxInt 11761 if !(isPowerOfTwo(c & 0xffff)) { 11762 break 11763 } 11764 v.reset(OpAnd16) 11765 v.AddArg(n) 11766 v0 := b.NewValue0(v.Pos, OpConst16, t) 11767 v0.AuxInt = (c & 0xffff) - 1 11768 v.AddArg(v0) 11769 return true 11770 } 11771 // match: (Mod16u <t> x (Const16 [c])) 11772 // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) 11773 // result: (Sub16 x (Mul16 <t> (Div16u <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 11774 for { 11775 t := v.Type 11776 _ = v.Args[1] 11777 x := v.Args[0] 11778 v_1 := v.Args[1] 11779 if v_1.Op != OpConst16 { 11780 break 11781 } 11782 c := v_1.AuxInt 11783 if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { 11784 break 11785 } 11786 v.reset(OpSub16) 11787 v.AddArg(x) 11788 v0 := b.NewValue0(v.Pos, OpMul16, t) 11789 v1 := b.NewValue0(v.Pos, OpDiv16u, t) 11790 v1.AddArg(x) 11791 v2 := b.NewValue0(v.Pos, OpConst16, t) 11792 v2.AuxInt = c 11793 v1.AddArg(v2) 11794 v0.AddArg(v1) 11795 v3 := b.NewValue0(v.Pos, OpConst16, t) 11796 v3.AuxInt = c 11797 v0.AddArg(v3) 11798 v.AddArg(v0) 11799 return true 11800 } 11801 return false 11802 } 11803 func rewriteValuegeneric_OpMod32_0(v *Value) bool { 11804 b := v.Block 11805 _ = b 11806 // match: (Mod32 (Const32 [c]) (Const32 [d])) 11807 // cond: d != 0 11808 // result: (Const32 [int64(int32(c % d))]) 11809 for { 11810 _ = v.Args[1] 11811 v_0 := v.Args[0] 11812 if v_0.Op != OpConst32 { 11813 break 11814 } 11815 c := v_0.AuxInt 11816 v_1 := v.Args[1] 11817 if v_1.Op != OpConst32 { 11818 break 11819 } 11820 d := v_1.AuxInt 11821 if !(d != 0) { 11822 break 11823 } 11824 v.reset(OpConst32) 11825 v.AuxInt = int64(int32(c % d)) 11826 return true 11827 } 11828 // match: (Mod32 <t> n (Const32 [c])) 11829 // cond: c < 0 && c != -1<<31 11830 // result: (Mod32 <t> n (Const32 <t> [-c])) 11831 for { 11832 t := v.Type 11833 _ = v.Args[1] 11834 n := v.Args[0] 11835 v_1 := v.Args[1] 11836 if v_1.Op != OpConst32 { 11837 break 11838 } 11839 c := v_1.AuxInt 11840 if !(c < 0 && c != -1<<31) { 11841 break 11842 } 11843 v.reset(OpMod32) 11844 v.Type = t 11845 v.AddArg(n) 11846 v0 := b.NewValue0(v.Pos, OpConst32, t) 11847 v0.AuxInt = -c 11848 v.AddArg(v0) 11849 return true 11850 } 11851 // match: (Mod32 <t> x (Const32 [c])) 11852 // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) 11853 // result: (Sub32 x (Mul32 <t> (Div32 <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 11854 for { 11855 t := v.Type 11856 _ = v.Args[1] 11857 x := v.Args[0] 11858 v_1 := v.Args[1] 11859 if v_1.Op != OpConst32 { 11860 break 11861 } 11862 c := v_1.AuxInt 11863 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { 11864 break 11865 } 11866 v.reset(OpSub32) 11867 v.AddArg(x) 11868 v0 := b.NewValue0(v.Pos, OpMul32, t) 11869 v1 := b.NewValue0(v.Pos, OpDiv32, t) 11870 v1.AddArg(x) 11871 v2 := b.NewValue0(v.Pos, OpConst32, t) 11872 v2.AuxInt = c 11873 v1.AddArg(v2) 11874 v0.AddArg(v1) 11875 v3 := b.NewValue0(v.Pos, OpConst32, t) 11876 v3.AuxInt = c 11877 v0.AddArg(v3) 11878 v.AddArg(v0) 11879 return true 11880 } 11881 return false 11882 } 11883 func rewriteValuegeneric_OpMod32u_0(v *Value) bool { 11884 b := v.Block 11885 _ = b 11886 // match: (Mod32u (Const32 [c]) (Const32 [d])) 11887 // cond: d != 0 11888 // result: (Const32 [int64(uint32(c) % uint32(d))]) 11889 for { 11890 _ = v.Args[1] 11891 v_0 := v.Args[0] 11892 if v_0.Op != OpConst32 { 11893 break 11894 } 11895 c := v_0.AuxInt 11896 v_1 := v.Args[1] 11897 if v_1.Op != OpConst32 { 11898 break 11899 } 11900 d := v_1.AuxInt 11901 if !(d != 0) { 11902 break 11903 } 11904 v.reset(OpConst32) 11905 v.AuxInt = int64(uint32(c) % uint32(d)) 11906 return true 11907 } 11908 // match: (Mod32u <t> n (Const32 [c])) 11909 // cond: isPowerOfTwo(c&0xffffffff) 11910 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 11911 for { 11912 t := v.Type 11913 _ = v.Args[1] 11914 n := v.Args[0] 11915 v_1 := v.Args[1] 11916 if v_1.Op != OpConst32 { 11917 break 11918 } 11919 c := v_1.AuxInt 11920 if !(isPowerOfTwo(c & 0xffffffff)) { 11921 break 11922 } 11923 v.reset(OpAnd32) 11924 v.AddArg(n) 11925 v0 := b.NewValue0(v.Pos, OpConst32, t) 11926 v0.AuxInt = (c & 0xffffffff) - 1 11927 v.AddArg(v0) 11928 return true 11929 } 11930 // match: (Mod32u <t> x (Const32 [c])) 11931 // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) 11932 // result: (Sub32 x (Mul32 <t> (Div32u <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 11933 for { 11934 t := v.Type 11935 _ = v.Args[1] 11936 x := v.Args[0] 11937 v_1 := v.Args[1] 11938 if v_1.Op != OpConst32 { 11939 break 11940 } 11941 c := v_1.AuxInt 11942 if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { 11943 break 11944 } 11945 v.reset(OpSub32) 11946 v.AddArg(x) 11947 v0 := b.NewValue0(v.Pos, OpMul32, t) 11948 v1 := b.NewValue0(v.Pos, OpDiv32u, t) 11949 v1.AddArg(x) 11950 v2 := b.NewValue0(v.Pos, OpConst32, t) 11951 v2.AuxInt = c 11952 v1.AddArg(v2) 11953 v0.AddArg(v1) 11954 v3 := b.NewValue0(v.Pos, OpConst32, t) 11955 v3.AuxInt = c 11956 v0.AddArg(v3) 11957 v.AddArg(v0) 11958 return true 11959 } 11960 return false 11961 } 11962 func rewriteValuegeneric_OpMod64_0(v *Value) bool { 11963 b := v.Block 11964 _ = b 11965 // match: (Mod64 (Const64 [c]) (Const64 [d])) 11966 // cond: d != 0 11967 // result: (Const64 [c % d]) 11968 for { 11969 _ = v.Args[1] 11970 v_0 := v.Args[0] 11971 if v_0.Op != OpConst64 { 11972 break 11973 } 11974 c := v_0.AuxInt 11975 v_1 := v.Args[1] 11976 if v_1.Op != OpConst64 { 11977 break 11978 } 11979 d := v_1.AuxInt 11980 if !(d != 0) { 11981 break 11982 } 11983 v.reset(OpConst64) 11984 v.AuxInt = c % d 11985 return true 11986 } 11987 // match: (Mod64 <t> n (Const64 [c])) 11988 // cond: c < 0 && c != -1<<63 11989 // result: (Mod64 <t> n (Const64 <t> [-c])) 11990 for { 11991 t := v.Type 11992 _ = v.Args[1] 11993 n := v.Args[0] 11994 v_1 := v.Args[1] 11995 if v_1.Op != OpConst64 { 11996 break 11997 } 11998 c := v_1.AuxInt 11999 if !(c < 0 && c != -1<<63) { 12000 break 12001 } 12002 v.reset(OpMod64) 12003 v.Type = t 12004 v.AddArg(n) 12005 v0 := b.NewValue0(v.Pos, OpConst64, t) 12006 v0.AuxInt = -c 12007 v.AddArg(v0) 12008 return true 12009 } 12010 // match: (Mod64 <t> x (Const64 [c])) 12011 // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) 12012 // result: (Sub64 x (Mul64 <t> (Div64 <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 12013 for { 12014 t := v.Type 12015 _ = v.Args[1] 12016 x := v.Args[0] 12017 v_1 := v.Args[1] 12018 if v_1.Op != OpConst64 { 12019 break 12020 } 12021 c := v_1.AuxInt 12022 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { 12023 break 12024 } 12025 v.reset(OpSub64) 12026 v.AddArg(x) 12027 v0 := b.NewValue0(v.Pos, OpMul64, t) 12028 v1 := b.NewValue0(v.Pos, OpDiv64, t) 12029 v1.AddArg(x) 12030 v2 := b.NewValue0(v.Pos, OpConst64, t) 12031 v2.AuxInt = c 12032 v1.AddArg(v2) 12033 v0.AddArg(v1) 12034 v3 := b.NewValue0(v.Pos, OpConst64, t) 12035 v3.AuxInt = c 12036 v0.AddArg(v3) 12037 v.AddArg(v0) 12038 return true 12039 } 12040 return false 12041 } 12042 func rewriteValuegeneric_OpMod64u_0(v *Value) bool { 12043 b := v.Block 12044 _ = b 12045 // match: (Mod64u (Const64 [c]) (Const64 [d])) 12046 // cond: d != 0 12047 // result: (Const64 [int64(uint64(c) % uint64(d))]) 12048 for { 12049 _ = v.Args[1] 12050 v_0 := v.Args[0] 12051 if v_0.Op != OpConst64 { 12052 break 12053 } 12054 c := v_0.AuxInt 12055 v_1 := v.Args[1] 12056 if v_1.Op != OpConst64 { 12057 break 12058 } 12059 d := v_1.AuxInt 12060 if !(d != 0) { 12061 break 12062 } 12063 v.reset(OpConst64) 12064 v.AuxInt = int64(uint64(c) % uint64(d)) 12065 return true 12066 } 12067 // match: (Mod64u <t> n (Const64 [c])) 12068 // cond: isPowerOfTwo(c) 12069 // result: (And64 n (Const64 <t> [c-1])) 12070 for { 12071 t := v.Type 12072 _ = v.Args[1] 12073 n := v.Args[0] 12074 v_1 := v.Args[1] 12075 if v_1.Op != OpConst64 { 12076 break 12077 } 12078 c := v_1.AuxInt 12079 if !(isPowerOfTwo(c)) { 12080 break 12081 } 12082 v.reset(OpAnd64) 12083 v.AddArg(n) 12084 v0 := b.NewValue0(v.Pos, OpConst64, t) 12085 v0.AuxInt = c - 1 12086 v.AddArg(v0) 12087 return true 12088 } 12089 // match: (Mod64u <t> n (Const64 [-1<<63])) 12090 // cond: 12091 // result: (And64 n (Const64 <t> [1<<63-1])) 12092 for { 12093 t := v.Type 12094 _ = v.Args[1] 12095 n := v.Args[0] 12096 v_1 := v.Args[1] 12097 if v_1.Op != OpConst64 { 12098 break 12099 } 12100 if v_1.AuxInt != -1<<63 { 12101 break 12102 } 12103 v.reset(OpAnd64) 12104 v.AddArg(n) 12105 v0 := b.NewValue0(v.Pos, OpConst64, t) 12106 v0.AuxInt = 1<<63 - 1 12107 v.AddArg(v0) 12108 return true 12109 } 12110 // match: (Mod64u <t> x (Const64 [c])) 12111 // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) 12112 // result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 12113 for { 12114 t := v.Type 12115 _ = v.Args[1] 12116 x := v.Args[0] 12117 v_1 := v.Args[1] 12118 if v_1.Op != OpConst64 { 12119 break 12120 } 12121 c := v_1.AuxInt 12122 if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { 12123 break 12124 } 12125 v.reset(OpSub64) 12126 v.AddArg(x) 12127 v0 := b.NewValue0(v.Pos, OpMul64, t) 12128 v1 := b.NewValue0(v.Pos, OpDiv64u, t) 12129 v1.AddArg(x) 12130 v2 := b.NewValue0(v.Pos, OpConst64, t) 12131 v2.AuxInt = c 12132 v1.AddArg(v2) 12133 v0.AddArg(v1) 12134 v3 := b.NewValue0(v.Pos, OpConst64, t) 12135 v3.AuxInt = c 12136 v0.AddArg(v3) 12137 v.AddArg(v0) 12138 return true 12139 } 12140 return false 12141 } 12142 func rewriteValuegeneric_OpMod8_0(v *Value) bool { 12143 b := v.Block 12144 _ = b 12145 // match: (Mod8 (Const8 [c]) (Const8 [d])) 12146 // cond: d != 0 12147 // result: (Const8 [int64(int8(c % d))]) 12148 for { 12149 _ = v.Args[1] 12150 v_0 := v.Args[0] 12151 if v_0.Op != OpConst8 { 12152 break 12153 } 12154 c := v_0.AuxInt 12155 v_1 := v.Args[1] 12156 if v_1.Op != OpConst8 { 12157 break 12158 } 12159 d := v_1.AuxInt 12160 if !(d != 0) { 12161 break 12162 } 12163 v.reset(OpConst8) 12164 v.AuxInt = int64(int8(c % d)) 12165 return true 12166 } 12167 // match: (Mod8 <t> n (Const8 [c])) 12168 // cond: c < 0 && c != -1<<7 12169 // result: (Mod8 <t> n (Const8 <t> [-c])) 12170 for { 12171 t := v.Type 12172 _ = v.Args[1] 12173 n := v.Args[0] 12174 v_1 := v.Args[1] 12175 if v_1.Op != OpConst8 { 12176 break 12177 } 12178 c := v_1.AuxInt 12179 if !(c < 0 && c != -1<<7) { 12180 break 12181 } 12182 v.reset(OpMod8) 12183 v.Type = t 12184 v.AddArg(n) 12185 v0 := b.NewValue0(v.Pos, OpConst8, t) 12186 v0.AuxInt = -c 12187 v.AddArg(v0) 12188 return true 12189 } 12190 // match: (Mod8 <t> x (Const8 [c])) 12191 // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) 12192 // result: (Sub8 x (Mul8 <t> (Div8 <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 12193 for { 12194 t := v.Type 12195 _ = v.Args[1] 12196 x := v.Args[0] 12197 v_1 := v.Args[1] 12198 if v_1.Op != OpConst8 { 12199 break 12200 } 12201 c := v_1.AuxInt 12202 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { 12203 break 12204 } 12205 v.reset(OpSub8) 12206 v.AddArg(x) 12207 v0 := b.NewValue0(v.Pos, OpMul8, t) 12208 v1 := b.NewValue0(v.Pos, OpDiv8, t) 12209 v1.AddArg(x) 12210 v2 := b.NewValue0(v.Pos, OpConst8, t) 12211 v2.AuxInt = c 12212 v1.AddArg(v2) 12213 v0.AddArg(v1) 12214 v3 := b.NewValue0(v.Pos, OpConst8, t) 12215 v3.AuxInt = c 12216 v0.AddArg(v3) 12217 v.AddArg(v0) 12218 return true 12219 } 12220 return false 12221 } 12222 func rewriteValuegeneric_OpMod8u_0(v *Value) bool { 12223 b := v.Block 12224 _ = b 12225 // match: (Mod8u (Const8 [c]) (Const8 [d])) 12226 // cond: d != 0 12227 // result: (Const8 [int64(uint8(c) % uint8(d))]) 12228 for { 12229 _ = v.Args[1] 12230 v_0 := v.Args[0] 12231 if v_0.Op != OpConst8 { 12232 break 12233 } 12234 c := v_0.AuxInt 12235 v_1 := v.Args[1] 12236 if v_1.Op != OpConst8 { 12237 break 12238 } 12239 d := v_1.AuxInt 12240 if !(d != 0) { 12241 break 12242 } 12243 v.reset(OpConst8) 12244 v.AuxInt = int64(uint8(c) % uint8(d)) 12245 return true 12246 } 12247 // match: (Mod8u <t> n (Const8 [c])) 12248 // cond: isPowerOfTwo(c&0xff) 12249 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 12250 for { 12251 t := v.Type 12252 _ = v.Args[1] 12253 n := v.Args[0] 12254 v_1 := v.Args[1] 12255 if v_1.Op != OpConst8 { 12256 break 12257 } 12258 c := v_1.AuxInt 12259 if !(isPowerOfTwo(c & 0xff)) { 12260 break 12261 } 12262 v.reset(OpAnd8) 12263 v.AddArg(n) 12264 v0 := b.NewValue0(v.Pos, OpConst8, t) 12265 v0.AuxInt = (c & 0xff) - 1 12266 v.AddArg(v0) 12267 return true 12268 } 12269 // match: (Mod8u <t> x (Const8 [c])) 12270 // cond: x.Op != OpConst8 && c > 0 && umagicOK(8 ,c) 12271 // result: (Sub8 x (Mul8 <t> (Div8u <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 12272 for { 12273 t := v.Type 12274 _ = v.Args[1] 12275 x := v.Args[0] 12276 v_1 := v.Args[1] 12277 if v_1.Op != OpConst8 { 12278 break 12279 } 12280 c := v_1.AuxInt 12281 if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { 12282 break 12283 } 12284 v.reset(OpSub8) 12285 v.AddArg(x) 12286 v0 := b.NewValue0(v.Pos, OpMul8, t) 12287 v1 := b.NewValue0(v.Pos, OpDiv8u, t) 12288 v1.AddArg(x) 12289 v2 := b.NewValue0(v.Pos, OpConst8, t) 12290 v2.AuxInt = c 12291 v1.AddArg(v2) 12292 v0.AddArg(v1) 12293 v3 := b.NewValue0(v.Pos, OpConst8, t) 12294 v3.AuxInt = c 12295 v0.AddArg(v3) 12296 v.AddArg(v0) 12297 return true 12298 } 12299 return false 12300 } 12301 func rewriteValuegeneric_OpMul16_0(v *Value) bool { 12302 b := v.Block 12303 _ = b 12304 typ := &b.Func.Config.Types 12305 _ = typ 12306 // match: (Mul16 (Const16 [c]) (Const16 [d])) 12307 // cond: 12308 // result: (Const16 [int64(int16(c*d))]) 12309 for { 12310 _ = v.Args[1] 12311 v_0 := v.Args[0] 12312 if v_0.Op != OpConst16 { 12313 break 12314 } 12315 c := v_0.AuxInt 12316 v_1 := v.Args[1] 12317 if v_1.Op != OpConst16 { 12318 break 12319 } 12320 d := v_1.AuxInt 12321 v.reset(OpConst16) 12322 v.AuxInt = int64(int16(c * d)) 12323 return true 12324 } 12325 // match: (Mul16 (Const16 [d]) (Const16 [c])) 12326 // cond: 12327 // result: (Const16 [int64(int16(c*d))]) 12328 for { 12329 _ = v.Args[1] 12330 v_0 := v.Args[0] 12331 if v_0.Op != OpConst16 { 12332 break 12333 } 12334 d := v_0.AuxInt 12335 v_1 := v.Args[1] 12336 if v_1.Op != OpConst16 { 12337 break 12338 } 12339 c := v_1.AuxInt 12340 v.reset(OpConst16) 12341 v.AuxInt = int64(int16(c * d)) 12342 return true 12343 } 12344 // match: (Mul16 (Const16 [1]) x) 12345 // cond: 12346 // result: x 12347 for { 12348 _ = v.Args[1] 12349 v_0 := v.Args[0] 12350 if v_0.Op != OpConst16 { 12351 break 12352 } 12353 if v_0.AuxInt != 1 { 12354 break 12355 } 12356 x := v.Args[1] 12357 v.reset(OpCopy) 12358 v.Type = x.Type 12359 v.AddArg(x) 12360 return true 12361 } 12362 // match: (Mul16 x (Const16 [1])) 12363 // cond: 12364 // result: x 12365 for { 12366 _ = v.Args[1] 12367 x := v.Args[0] 12368 v_1 := v.Args[1] 12369 if v_1.Op != OpConst16 { 12370 break 12371 } 12372 if v_1.AuxInt != 1 { 12373 break 12374 } 12375 v.reset(OpCopy) 12376 v.Type = x.Type 12377 v.AddArg(x) 12378 return true 12379 } 12380 // match: (Mul16 (Const16 [-1]) x) 12381 // cond: 12382 // result: (Neg16 x) 12383 for { 12384 _ = v.Args[1] 12385 v_0 := v.Args[0] 12386 if v_0.Op != OpConst16 { 12387 break 12388 } 12389 if v_0.AuxInt != -1 { 12390 break 12391 } 12392 x := v.Args[1] 12393 v.reset(OpNeg16) 12394 v.AddArg(x) 12395 return true 12396 } 12397 // match: (Mul16 x (Const16 [-1])) 12398 // cond: 12399 // result: (Neg16 x) 12400 for { 12401 _ = v.Args[1] 12402 x := v.Args[0] 12403 v_1 := v.Args[1] 12404 if v_1.Op != OpConst16 { 12405 break 12406 } 12407 if v_1.AuxInt != -1 { 12408 break 12409 } 12410 v.reset(OpNeg16) 12411 v.AddArg(x) 12412 return true 12413 } 12414 // match: (Mul16 <t> n (Const16 [c])) 12415 // cond: isPowerOfTwo(c) 12416 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 12417 for { 12418 t := v.Type 12419 _ = v.Args[1] 12420 n := v.Args[0] 12421 v_1 := v.Args[1] 12422 if v_1.Op != OpConst16 { 12423 break 12424 } 12425 c := v_1.AuxInt 12426 if !(isPowerOfTwo(c)) { 12427 break 12428 } 12429 v.reset(OpLsh16x64) 12430 v.Type = t 12431 v.AddArg(n) 12432 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12433 v0.AuxInt = log2(c) 12434 v.AddArg(v0) 12435 return true 12436 } 12437 // match: (Mul16 <t> (Const16 [c]) n) 12438 // cond: isPowerOfTwo(c) 12439 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 12440 for { 12441 t := v.Type 12442 _ = v.Args[1] 12443 v_0 := v.Args[0] 12444 if v_0.Op != OpConst16 { 12445 break 12446 } 12447 c := v_0.AuxInt 12448 n := v.Args[1] 12449 if !(isPowerOfTwo(c)) { 12450 break 12451 } 12452 v.reset(OpLsh16x64) 12453 v.Type = t 12454 v.AddArg(n) 12455 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12456 v0.AuxInt = log2(c) 12457 v.AddArg(v0) 12458 return true 12459 } 12460 // match: (Mul16 <t> n (Const16 [c])) 12461 // cond: t.IsSigned() && isPowerOfTwo(-c) 12462 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 12463 for { 12464 t := v.Type 12465 _ = v.Args[1] 12466 n := v.Args[0] 12467 v_1 := v.Args[1] 12468 if v_1.Op != OpConst16 { 12469 break 12470 } 12471 c := v_1.AuxInt 12472 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12473 break 12474 } 12475 v.reset(OpNeg16) 12476 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 12477 v0.AddArg(n) 12478 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12479 v1.AuxInt = log2(-c) 12480 v0.AddArg(v1) 12481 v.AddArg(v0) 12482 return true 12483 } 12484 // match: (Mul16 <t> (Const16 [c]) n) 12485 // cond: t.IsSigned() && isPowerOfTwo(-c) 12486 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 12487 for { 12488 t := v.Type 12489 _ = v.Args[1] 12490 v_0 := v.Args[0] 12491 if v_0.Op != OpConst16 { 12492 break 12493 } 12494 c := v_0.AuxInt 12495 n := v.Args[1] 12496 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12497 break 12498 } 12499 v.reset(OpNeg16) 12500 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 12501 v0.AddArg(n) 12502 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12503 v1.AuxInt = log2(-c) 12504 v0.AddArg(v1) 12505 v.AddArg(v0) 12506 return true 12507 } 12508 return false 12509 } 12510 func rewriteValuegeneric_OpMul16_10(v *Value) bool { 12511 b := v.Block 12512 _ = b 12513 // match: (Mul16 (Const16 [0]) _) 12514 // cond: 12515 // result: (Const16 [0]) 12516 for { 12517 _ = v.Args[1] 12518 v_0 := v.Args[0] 12519 if v_0.Op != OpConst16 { 12520 break 12521 } 12522 if v_0.AuxInt != 0 { 12523 break 12524 } 12525 v.reset(OpConst16) 12526 v.AuxInt = 0 12527 return true 12528 } 12529 // match: (Mul16 _ (Const16 [0])) 12530 // cond: 12531 // result: (Const16 [0]) 12532 for { 12533 _ = v.Args[1] 12534 v_1 := v.Args[1] 12535 if v_1.Op != OpConst16 { 12536 break 12537 } 12538 if v_1.AuxInt != 0 { 12539 break 12540 } 12541 v.reset(OpConst16) 12542 v.AuxInt = 0 12543 return true 12544 } 12545 // match: (Mul16 (Const16 <t> [c]) (Mul16 (Const16 <t> [d]) x)) 12546 // cond: 12547 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 12548 for { 12549 _ = v.Args[1] 12550 v_0 := v.Args[0] 12551 if v_0.Op != OpConst16 { 12552 break 12553 } 12554 t := v_0.Type 12555 c := v_0.AuxInt 12556 v_1 := v.Args[1] 12557 if v_1.Op != OpMul16 { 12558 break 12559 } 12560 _ = v_1.Args[1] 12561 v_1_0 := v_1.Args[0] 12562 if v_1_0.Op != OpConst16 { 12563 break 12564 } 12565 if v_1_0.Type != t { 12566 break 12567 } 12568 d := v_1_0.AuxInt 12569 x := v_1.Args[1] 12570 v.reset(OpMul16) 12571 v0 := b.NewValue0(v.Pos, OpConst16, t) 12572 v0.AuxInt = int64(int16(c * d)) 12573 v.AddArg(v0) 12574 v.AddArg(x) 12575 return true 12576 } 12577 // match: (Mul16 (Const16 <t> [c]) (Mul16 x (Const16 <t> [d]))) 12578 // cond: 12579 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 12580 for { 12581 _ = v.Args[1] 12582 v_0 := v.Args[0] 12583 if v_0.Op != OpConst16 { 12584 break 12585 } 12586 t := v_0.Type 12587 c := v_0.AuxInt 12588 v_1 := v.Args[1] 12589 if v_1.Op != OpMul16 { 12590 break 12591 } 12592 _ = v_1.Args[1] 12593 x := v_1.Args[0] 12594 v_1_1 := v_1.Args[1] 12595 if v_1_1.Op != OpConst16 { 12596 break 12597 } 12598 if v_1_1.Type != t { 12599 break 12600 } 12601 d := v_1_1.AuxInt 12602 v.reset(OpMul16) 12603 v0 := b.NewValue0(v.Pos, OpConst16, t) 12604 v0.AuxInt = int64(int16(c * d)) 12605 v.AddArg(v0) 12606 v.AddArg(x) 12607 return true 12608 } 12609 // match: (Mul16 (Mul16 (Const16 <t> [d]) x) (Const16 <t> [c])) 12610 // cond: 12611 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 12612 for { 12613 _ = v.Args[1] 12614 v_0 := v.Args[0] 12615 if v_0.Op != OpMul16 { 12616 break 12617 } 12618 _ = v_0.Args[1] 12619 v_0_0 := v_0.Args[0] 12620 if v_0_0.Op != OpConst16 { 12621 break 12622 } 12623 t := v_0_0.Type 12624 d := v_0_0.AuxInt 12625 x := v_0.Args[1] 12626 v_1 := v.Args[1] 12627 if v_1.Op != OpConst16 { 12628 break 12629 } 12630 if v_1.Type != t { 12631 break 12632 } 12633 c := v_1.AuxInt 12634 v.reset(OpMul16) 12635 v0 := b.NewValue0(v.Pos, OpConst16, t) 12636 v0.AuxInt = int64(int16(c * d)) 12637 v.AddArg(v0) 12638 v.AddArg(x) 12639 return true 12640 } 12641 // match: (Mul16 (Mul16 x (Const16 <t> [d])) (Const16 <t> [c])) 12642 // cond: 12643 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 12644 for { 12645 _ = v.Args[1] 12646 v_0 := v.Args[0] 12647 if v_0.Op != OpMul16 { 12648 break 12649 } 12650 _ = v_0.Args[1] 12651 x := v_0.Args[0] 12652 v_0_1 := v_0.Args[1] 12653 if v_0_1.Op != OpConst16 { 12654 break 12655 } 12656 t := v_0_1.Type 12657 d := v_0_1.AuxInt 12658 v_1 := v.Args[1] 12659 if v_1.Op != OpConst16 { 12660 break 12661 } 12662 if v_1.Type != t { 12663 break 12664 } 12665 c := v_1.AuxInt 12666 v.reset(OpMul16) 12667 v0 := b.NewValue0(v.Pos, OpConst16, t) 12668 v0.AuxInt = int64(int16(c * d)) 12669 v.AddArg(v0) 12670 v.AddArg(x) 12671 return true 12672 } 12673 return false 12674 } 12675 func rewriteValuegeneric_OpMul32_0(v *Value) bool { 12676 b := v.Block 12677 _ = b 12678 typ := &b.Func.Config.Types 12679 _ = typ 12680 // match: (Mul32 (Const32 [c]) (Const32 [d])) 12681 // cond: 12682 // result: (Const32 [int64(int32(c*d))]) 12683 for { 12684 _ = v.Args[1] 12685 v_0 := v.Args[0] 12686 if v_0.Op != OpConst32 { 12687 break 12688 } 12689 c := v_0.AuxInt 12690 v_1 := v.Args[1] 12691 if v_1.Op != OpConst32 { 12692 break 12693 } 12694 d := v_1.AuxInt 12695 v.reset(OpConst32) 12696 v.AuxInt = int64(int32(c * d)) 12697 return true 12698 } 12699 // match: (Mul32 (Const32 [d]) (Const32 [c])) 12700 // cond: 12701 // result: (Const32 [int64(int32(c*d))]) 12702 for { 12703 _ = v.Args[1] 12704 v_0 := v.Args[0] 12705 if v_0.Op != OpConst32 { 12706 break 12707 } 12708 d := v_0.AuxInt 12709 v_1 := v.Args[1] 12710 if v_1.Op != OpConst32 { 12711 break 12712 } 12713 c := v_1.AuxInt 12714 v.reset(OpConst32) 12715 v.AuxInt = int64(int32(c * d)) 12716 return true 12717 } 12718 // match: (Mul32 (Const32 [1]) x) 12719 // cond: 12720 // result: x 12721 for { 12722 _ = v.Args[1] 12723 v_0 := v.Args[0] 12724 if v_0.Op != OpConst32 { 12725 break 12726 } 12727 if v_0.AuxInt != 1 { 12728 break 12729 } 12730 x := v.Args[1] 12731 v.reset(OpCopy) 12732 v.Type = x.Type 12733 v.AddArg(x) 12734 return true 12735 } 12736 // match: (Mul32 x (Const32 [1])) 12737 // cond: 12738 // result: x 12739 for { 12740 _ = v.Args[1] 12741 x := v.Args[0] 12742 v_1 := v.Args[1] 12743 if v_1.Op != OpConst32 { 12744 break 12745 } 12746 if v_1.AuxInt != 1 { 12747 break 12748 } 12749 v.reset(OpCopy) 12750 v.Type = x.Type 12751 v.AddArg(x) 12752 return true 12753 } 12754 // match: (Mul32 (Const32 [-1]) x) 12755 // cond: 12756 // result: (Neg32 x) 12757 for { 12758 _ = v.Args[1] 12759 v_0 := v.Args[0] 12760 if v_0.Op != OpConst32 { 12761 break 12762 } 12763 if v_0.AuxInt != -1 { 12764 break 12765 } 12766 x := v.Args[1] 12767 v.reset(OpNeg32) 12768 v.AddArg(x) 12769 return true 12770 } 12771 // match: (Mul32 x (Const32 [-1])) 12772 // cond: 12773 // result: (Neg32 x) 12774 for { 12775 _ = v.Args[1] 12776 x := v.Args[0] 12777 v_1 := v.Args[1] 12778 if v_1.Op != OpConst32 { 12779 break 12780 } 12781 if v_1.AuxInt != -1 { 12782 break 12783 } 12784 v.reset(OpNeg32) 12785 v.AddArg(x) 12786 return true 12787 } 12788 // match: (Mul32 <t> n (Const32 [c])) 12789 // cond: isPowerOfTwo(c) 12790 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 12791 for { 12792 t := v.Type 12793 _ = v.Args[1] 12794 n := v.Args[0] 12795 v_1 := v.Args[1] 12796 if v_1.Op != OpConst32 { 12797 break 12798 } 12799 c := v_1.AuxInt 12800 if !(isPowerOfTwo(c)) { 12801 break 12802 } 12803 v.reset(OpLsh32x64) 12804 v.Type = t 12805 v.AddArg(n) 12806 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12807 v0.AuxInt = log2(c) 12808 v.AddArg(v0) 12809 return true 12810 } 12811 // match: (Mul32 <t> (Const32 [c]) n) 12812 // cond: isPowerOfTwo(c) 12813 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 12814 for { 12815 t := v.Type 12816 _ = v.Args[1] 12817 v_0 := v.Args[0] 12818 if v_0.Op != OpConst32 { 12819 break 12820 } 12821 c := v_0.AuxInt 12822 n := v.Args[1] 12823 if !(isPowerOfTwo(c)) { 12824 break 12825 } 12826 v.reset(OpLsh32x64) 12827 v.Type = t 12828 v.AddArg(n) 12829 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12830 v0.AuxInt = log2(c) 12831 v.AddArg(v0) 12832 return true 12833 } 12834 // match: (Mul32 <t> n (Const32 [c])) 12835 // cond: t.IsSigned() && isPowerOfTwo(-c) 12836 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 12837 for { 12838 t := v.Type 12839 _ = v.Args[1] 12840 n := v.Args[0] 12841 v_1 := v.Args[1] 12842 if v_1.Op != OpConst32 { 12843 break 12844 } 12845 c := v_1.AuxInt 12846 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12847 break 12848 } 12849 v.reset(OpNeg32) 12850 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 12851 v0.AddArg(n) 12852 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12853 v1.AuxInt = log2(-c) 12854 v0.AddArg(v1) 12855 v.AddArg(v0) 12856 return true 12857 } 12858 // match: (Mul32 <t> (Const32 [c]) n) 12859 // cond: t.IsSigned() && isPowerOfTwo(-c) 12860 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 12861 for { 12862 t := v.Type 12863 _ = v.Args[1] 12864 v_0 := v.Args[0] 12865 if v_0.Op != OpConst32 { 12866 break 12867 } 12868 c := v_0.AuxInt 12869 n := v.Args[1] 12870 if !(t.IsSigned() && isPowerOfTwo(-c)) { 12871 break 12872 } 12873 v.reset(OpNeg32) 12874 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 12875 v0.AddArg(n) 12876 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12877 v1.AuxInt = log2(-c) 12878 v0.AddArg(v1) 12879 v.AddArg(v0) 12880 return true 12881 } 12882 return false 12883 } 12884 func rewriteValuegeneric_OpMul32_10(v *Value) bool { 12885 b := v.Block 12886 _ = b 12887 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x)) 12888 // cond: 12889 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12890 for { 12891 _ = v.Args[1] 12892 v_0 := v.Args[0] 12893 if v_0.Op != OpConst32 { 12894 break 12895 } 12896 t := v_0.Type 12897 c := v_0.AuxInt 12898 v_1 := v.Args[1] 12899 if v_1.Op != OpAdd32 { 12900 break 12901 } 12902 if v_1.Type != t { 12903 break 12904 } 12905 _ = v_1.Args[1] 12906 v_1_0 := v_1.Args[0] 12907 if v_1_0.Op != OpConst32 { 12908 break 12909 } 12910 if v_1_0.Type != t { 12911 break 12912 } 12913 d := v_1_0.AuxInt 12914 x := v_1.Args[1] 12915 v.reset(OpAdd32) 12916 v0 := b.NewValue0(v.Pos, OpConst32, t) 12917 v0.AuxInt = int64(int32(c * d)) 12918 v.AddArg(v0) 12919 v1 := b.NewValue0(v.Pos, OpMul32, t) 12920 v2 := b.NewValue0(v.Pos, OpConst32, t) 12921 v2.AuxInt = c 12922 v1.AddArg(v2) 12923 v1.AddArg(x) 12924 v.AddArg(v1) 12925 return true 12926 } 12927 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> x (Const32 <t> [d]))) 12928 // cond: 12929 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12930 for { 12931 _ = v.Args[1] 12932 v_0 := v.Args[0] 12933 if v_0.Op != OpConst32 { 12934 break 12935 } 12936 t := v_0.Type 12937 c := v_0.AuxInt 12938 v_1 := v.Args[1] 12939 if v_1.Op != OpAdd32 { 12940 break 12941 } 12942 if v_1.Type != t { 12943 break 12944 } 12945 _ = v_1.Args[1] 12946 x := v_1.Args[0] 12947 v_1_1 := v_1.Args[1] 12948 if v_1_1.Op != OpConst32 { 12949 break 12950 } 12951 if v_1_1.Type != t { 12952 break 12953 } 12954 d := v_1_1.AuxInt 12955 v.reset(OpAdd32) 12956 v0 := b.NewValue0(v.Pos, OpConst32, t) 12957 v0.AuxInt = int64(int32(c * d)) 12958 v.AddArg(v0) 12959 v1 := b.NewValue0(v.Pos, OpMul32, t) 12960 v2 := b.NewValue0(v.Pos, OpConst32, t) 12961 v2.AuxInt = c 12962 v1.AddArg(v2) 12963 v1.AddArg(x) 12964 v.AddArg(v1) 12965 return true 12966 } 12967 // match: (Mul32 (Add32 <t> (Const32 <t> [d]) x) (Const32 <t> [c])) 12968 // cond: 12969 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 12970 for { 12971 _ = v.Args[1] 12972 v_0 := v.Args[0] 12973 if v_0.Op != OpAdd32 { 12974 break 12975 } 12976 t := v_0.Type 12977 _ = v_0.Args[1] 12978 v_0_0 := v_0.Args[0] 12979 if v_0_0.Op != OpConst32 { 12980 break 12981 } 12982 if v_0_0.Type != t { 12983 break 12984 } 12985 d := v_0_0.AuxInt 12986 x := v_0.Args[1] 12987 v_1 := v.Args[1] 12988 if v_1.Op != OpConst32 { 12989 break 12990 } 12991 if v_1.Type != t { 12992 break 12993 } 12994 c := v_1.AuxInt 12995 v.reset(OpAdd32) 12996 v0 := b.NewValue0(v.Pos, OpConst32, t) 12997 v0.AuxInt = int64(int32(c * d)) 12998 v.AddArg(v0) 12999 v1 := b.NewValue0(v.Pos, OpMul32, t) 13000 v2 := b.NewValue0(v.Pos, OpConst32, t) 13001 v2.AuxInt = c 13002 v1.AddArg(v2) 13003 v1.AddArg(x) 13004 v.AddArg(v1) 13005 return true 13006 } 13007 // match: (Mul32 (Add32 <t> x (Const32 <t> [d])) (Const32 <t> [c])) 13008 // cond: 13009 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 13010 for { 13011 _ = v.Args[1] 13012 v_0 := v.Args[0] 13013 if v_0.Op != OpAdd32 { 13014 break 13015 } 13016 t := v_0.Type 13017 _ = v_0.Args[1] 13018 x := v_0.Args[0] 13019 v_0_1 := v_0.Args[1] 13020 if v_0_1.Op != OpConst32 { 13021 break 13022 } 13023 if v_0_1.Type != t { 13024 break 13025 } 13026 d := v_0_1.AuxInt 13027 v_1 := v.Args[1] 13028 if v_1.Op != OpConst32 { 13029 break 13030 } 13031 if v_1.Type != t { 13032 break 13033 } 13034 c := v_1.AuxInt 13035 v.reset(OpAdd32) 13036 v0 := b.NewValue0(v.Pos, OpConst32, t) 13037 v0.AuxInt = int64(int32(c * d)) 13038 v.AddArg(v0) 13039 v1 := b.NewValue0(v.Pos, OpMul32, t) 13040 v2 := b.NewValue0(v.Pos, OpConst32, t) 13041 v2.AuxInt = c 13042 v1.AddArg(v2) 13043 v1.AddArg(x) 13044 v.AddArg(v1) 13045 return true 13046 } 13047 // match: (Mul32 (Const32 [0]) _) 13048 // cond: 13049 // result: (Const32 [0]) 13050 for { 13051 _ = v.Args[1] 13052 v_0 := v.Args[0] 13053 if v_0.Op != OpConst32 { 13054 break 13055 } 13056 if v_0.AuxInt != 0 { 13057 break 13058 } 13059 v.reset(OpConst32) 13060 v.AuxInt = 0 13061 return true 13062 } 13063 // match: (Mul32 _ (Const32 [0])) 13064 // cond: 13065 // result: (Const32 [0]) 13066 for { 13067 _ = v.Args[1] 13068 v_1 := v.Args[1] 13069 if v_1.Op != OpConst32 { 13070 break 13071 } 13072 if v_1.AuxInt != 0 { 13073 break 13074 } 13075 v.reset(OpConst32) 13076 v.AuxInt = 0 13077 return true 13078 } 13079 // match: (Mul32 (Const32 <t> [c]) (Mul32 (Const32 <t> [d]) x)) 13080 // cond: 13081 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 13082 for { 13083 _ = v.Args[1] 13084 v_0 := v.Args[0] 13085 if v_0.Op != OpConst32 { 13086 break 13087 } 13088 t := v_0.Type 13089 c := v_0.AuxInt 13090 v_1 := v.Args[1] 13091 if v_1.Op != OpMul32 { 13092 break 13093 } 13094 _ = v_1.Args[1] 13095 v_1_0 := v_1.Args[0] 13096 if v_1_0.Op != OpConst32 { 13097 break 13098 } 13099 if v_1_0.Type != t { 13100 break 13101 } 13102 d := v_1_0.AuxInt 13103 x := v_1.Args[1] 13104 v.reset(OpMul32) 13105 v0 := b.NewValue0(v.Pos, OpConst32, t) 13106 v0.AuxInt = int64(int32(c * d)) 13107 v.AddArg(v0) 13108 v.AddArg(x) 13109 return true 13110 } 13111 // match: (Mul32 (Const32 <t> [c]) (Mul32 x (Const32 <t> [d]))) 13112 // cond: 13113 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 13114 for { 13115 _ = v.Args[1] 13116 v_0 := v.Args[0] 13117 if v_0.Op != OpConst32 { 13118 break 13119 } 13120 t := v_0.Type 13121 c := v_0.AuxInt 13122 v_1 := v.Args[1] 13123 if v_1.Op != OpMul32 { 13124 break 13125 } 13126 _ = v_1.Args[1] 13127 x := v_1.Args[0] 13128 v_1_1 := v_1.Args[1] 13129 if v_1_1.Op != OpConst32 { 13130 break 13131 } 13132 if v_1_1.Type != t { 13133 break 13134 } 13135 d := v_1_1.AuxInt 13136 v.reset(OpMul32) 13137 v0 := b.NewValue0(v.Pos, OpConst32, t) 13138 v0.AuxInt = int64(int32(c * d)) 13139 v.AddArg(v0) 13140 v.AddArg(x) 13141 return true 13142 } 13143 // match: (Mul32 (Mul32 (Const32 <t> [d]) x) (Const32 <t> [c])) 13144 // cond: 13145 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 13146 for { 13147 _ = v.Args[1] 13148 v_0 := v.Args[0] 13149 if v_0.Op != OpMul32 { 13150 break 13151 } 13152 _ = v_0.Args[1] 13153 v_0_0 := v_0.Args[0] 13154 if v_0_0.Op != OpConst32 { 13155 break 13156 } 13157 t := v_0_0.Type 13158 d := v_0_0.AuxInt 13159 x := v_0.Args[1] 13160 v_1 := v.Args[1] 13161 if v_1.Op != OpConst32 { 13162 break 13163 } 13164 if v_1.Type != t { 13165 break 13166 } 13167 c := v_1.AuxInt 13168 v.reset(OpMul32) 13169 v0 := b.NewValue0(v.Pos, OpConst32, t) 13170 v0.AuxInt = int64(int32(c * d)) 13171 v.AddArg(v0) 13172 v.AddArg(x) 13173 return true 13174 } 13175 // match: (Mul32 (Mul32 x (Const32 <t> [d])) (Const32 <t> [c])) 13176 // cond: 13177 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 13178 for { 13179 _ = v.Args[1] 13180 v_0 := v.Args[0] 13181 if v_0.Op != OpMul32 { 13182 break 13183 } 13184 _ = v_0.Args[1] 13185 x := v_0.Args[0] 13186 v_0_1 := v_0.Args[1] 13187 if v_0_1.Op != OpConst32 { 13188 break 13189 } 13190 t := v_0_1.Type 13191 d := v_0_1.AuxInt 13192 v_1 := v.Args[1] 13193 if v_1.Op != OpConst32 { 13194 break 13195 } 13196 if v_1.Type != t { 13197 break 13198 } 13199 c := v_1.AuxInt 13200 v.reset(OpMul32) 13201 v0 := b.NewValue0(v.Pos, OpConst32, t) 13202 v0.AuxInt = int64(int32(c * d)) 13203 v.AddArg(v0) 13204 v.AddArg(x) 13205 return true 13206 } 13207 return false 13208 } 13209 func rewriteValuegeneric_OpMul32F_0(v *Value) bool { 13210 // match: (Mul32F (Const32F [c]) (Const32F [d])) 13211 // cond: 13212 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 13213 for { 13214 _ = v.Args[1] 13215 v_0 := v.Args[0] 13216 if v_0.Op != OpConst32F { 13217 break 13218 } 13219 c := v_0.AuxInt 13220 v_1 := v.Args[1] 13221 if v_1.Op != OpConst32F { 13222 break 13223 } 13224 d := v_1.AuxInt 13225 v.reset(OpConst32F) 13226 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 13227 return true 13228 } 13229 // match: (Mul32F (Const32F [d]) (Const32F [c])) 13230 // cond: 13231 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 13232 for { 13233 _ = v.Args[1] 13234 v_0 := v.Args[0] 13235 if v_0.Op != OpConst32F { 13236 break 13237 } 13238 d := v_0.AuxInt 13239 v_1 := v.Args[1] 13240 if v_1.Op != OpConst32F { 13241 break 13242 } 13243 c := v_1.AuxInt 13244 v.reset(OpConst32F) 13245 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 13246 return true 13247 } 13248 // match: (Mul32F x (Const32F [f2i(1)])) 13249 // cond: 13250 // result: x 13251 for { 13252 _ = v.Args[1] 13253 x := v.Args[0] 13254 v_1 := v.Args[1] 13255 if v_1.Op != OpConst32F { 13256 break 13257 } 13258 if v_1.AuxInt != f2i(1) { 13259 break 13260 } 13261 v.reset(OpCopy) 13262 v.Type = x.Type 13263 v.AddArg(x) 13264 return true 13265 } 13266 // match: (Mul32F (Const32F [f2i(1)]) x) 13267 // cond: 13268 // result: x 13269 for { 13270 _ = v.Args[1] 13271 v_0 := v.Args[0] 13272 if v_0.Op != OpConst32F { 13273 break 13274 } 13275 if v_0.AuxInt != f2i(1) { 13276 break 13277 } 13278 x := v.Args[1] 13279 v.reset(OpCopy) 13280 v.Type = x.Type 13281 v.AddArg(x) 13282 return true 13283 } 13284 // match: (Mul32F x (Const32F [f2i(-1)])) 13285 // cond: 13286 // result: (Neg32F x) 13287 for { 13288 _ = v.Args[1] 13289 x := v.Args[0] 13290 v_1 := v.Args[1] 13291 if v_1.Op != OpConst32F { 13292 break 13293 } 13294 if v_1.AuxInt != f2i(-1) { 13295 break 13296 } 13297 v.reset(OpNeg32F) 13298 v.AddArg(x) 13299 return true 13300 } 13301 // match: (Mul32F (Const32F [f2i(-1)]) x) 13302 // cond: 13303 // result: (Neg32F x) 13304 for { 13305 _ = v.Args[1] 13306 v_0 := v.Args[0] 13307 if v_0.Op != OpConst32F { 13308 break 13309 } 13310 if v_0.AuxInt != f2i(-1) { 13311 break 13312 } 13313 x := v.Args[1] 13314 v.reset(OpNeg32F) 13315 v.AddArg(x) 13316 return true 13317 } 13318 // match: (Mul32F x (Const32F [f2i(2)])) 13319 // cond: 13320 // result: (Add32F x x) 13321 for { 13322 _ = v.Args[1] 13323 x := v.Args[0] 13324 v_1 := v.Args[1] 13325 if v_1.Op != OpConst32F { 13326 break 13327 } 13328 if v_1.AuxInt != f2i(2) { 13329 break 13330 } 13331 v.reset(OpAdd32F) 13332 v.AddArg(x) 13333 v.AddArg(x) 13334 return true 13335 } 13336 // match: (Mul32F (Const32F [f2i(2)]) x) 13337 // cond: 13338 // result: (Add32F x x) 13339 for { 13340 _ = v.Args[1] 13341 v_0 := v.Args[0] 13342 if v_0.Op != OpConst32F { 13343 break 13344 } 13345 if v_0.AuxInt != f2i(2) { 13346 break 13347 } 13348 x := v.Args[1] 13349 v.reset(OpAdd32F) 13350 v.AddArg(x) 13351 v.AddArg(x) 13352 return true 13353 } 13354 return false 13355 } 13356 func rewriteValuegeneric_OpMul64_0(v *Value) bool { 13357 b := v.Block 13358 _ = b 13359 typ := &b.Func.Config.Types 13360 _ = typ 13361 // match: (Mul64 (Const64 [c]) (Const64 [d])) 13362 // cond: 13363 // result: (Const64 [c*d]) 13364 for { 13365 _ = v.Args[1] 13366 v_0 := v.Args[0] 13367 if v_0.Op != OpConst64 { 13368 break 13369 } 13370 c := v_0.AuxInt 13371 v_1 := v.Args[1] 13372 if v_1.Op != OpConst64 { 13373 break 13374 } 13375 d := v_1.AuxInt 13376 v.reset(OpConst64) 13377 v.AuxInt = c * d 13378 return true 13379 } 13380 // match: (Mul64 (Const64 [d]) (Const64 [c])) 13381 // cond: 13382 // result: (Const64 [c*d]) 13383 for { 13384 _ = v.Args[1] 13385 v_0 := v.Args[0] 13386 if v_0.Op != OpConst64 { 13387 break 13388 } 13389 d := v_0.AuxInt 13390 v_1 := v.Args[1] 13391 if v_1.Op != OpConst64 { 13392 break 13393 } 13394 c := v_1.AuxInt 13395 v.reset(OpConst64) 13396 v.AuxInt = c * d 13397 return true 13398 } 13399 // match: (Mul64 (Const64 [1]) x) 13400 // cond: 13401 // result: x 13402 for { 13403 _ = v.Args[1] 13404 v_0 := v.Args[0] 13405 if v_0.Op != OpConst64 { 13406 break 13407 } 13408 if v_0.AuxInt != 1 { 13409 break 13410 } 13411 x := v.Args[1] 13412 v.reset(OpCopy) 13413 v.Type = x.Type 13414 v.AddArg(x) 13415 return true 13416 } 13417 // match: (Mul64 x (Const64 [1])) 13418 // cond: 13419 // result: x 13420 for { 13421 _ = v.Args[1] 13422 x := v.Args[0] 13423 v_1 := v.Args[1] 13424 if v_1.Op != OpConst64 { 13425 break 13426 } 13427 if v_1.AuxInt != 1 { 13428 break 13429 } 13430 v.reset(OpCopy) 13431 v.Type = x.Type 13432 v.AddArg(x) 13433 return true 13434 } 13435 // match: (Mul64 (Const64 [-1]) x) 13436 // cond: 13437 // result: (Neg64 x) 13438 for { 13439 _ = v.Args[1] 13440 v_0 := v.Args[0] 13441 if v_0.Op != OpConst64 { 13442 break 13443 } 13444 if v_0.AuxInt != -1 { 13445 break 13446 } 13447 x := v.Args[1] 13448 v.reset(OpNeg64) 13449 v.AddArg(x) 13450 return true 13451 } 13452 // match: (Mul64 x (Const64 [-1])) 13453 // cond: 13454 // result: (Neg64 x) 13455 for { 13456 _ = v.Args[1] 13457 x := v.Args[0] 13458 v_1 := v.Args[1] 13459 if v_1.Op != OpConst64 { 13460 break 13461 } 13462 if v_1.AuxInt != -1 { 13463 break 13464 } 13465 v.reset(OpNeg64) 13466 v.AddArg(x) 13467 return true 13468 } 13469 // match: (Mul64 <t> n (Const64 [c])) 13470 // cond: isPowerOfTwo(c) 13471 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 13472 for { 13473 t := v.Type 13474 _ = v.Args[1] 13475 n := v.Args[0] 13476 v_1 := v.Args[1] 13477 if v_1.Op != OpConst64 { 13478 break 13479 } 13480 c := v_1.AuxInt 13481 if !(isPowerOfTwo(c)) { 13482 break 13483 } 13484 v.reset(OpLsh64x64) 13485 v.Type = t 13486 v.AddArg(n) 13487 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13488 v0.AuxInt = log2(c) 13489 v.AddArg(v0) 13490 return true 13491 } 13492 // match: (Mul64 <t> (Const64 [c]) n) 13493 // cond: isPowerOfTwo(c) 13494 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 13495 for { 13496 t := v.Type 13497 _ = v.Args[1] 13498 v_0 := v.Args[0] 13499 if v_0.Op != OpConst64 { 13500 break 13501 } 13502 c := v_0.AuxInt 13503 n := v.Args[1] 13504 if !(isPowerOfTwo(c)) { 13505 break 13506 } 13507 v.reset(OpLsh64x64) 13508 v.Type = t 13509 v.AddArg(n) 13510 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13511 v0.AuxInt = log2(c) 13512 v.AddArg(v0) 13513 return true 13514 } 13515 // match: (Mul64 <t> n (Const64 [c])) 13516 // cond: t.IsSigned() && isPowerOfTwo(-c) 13517 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 13518 for { 13519 t := v.Type 13520 _ = v.Args[1] 13521 n := v.Args[0] 13522 v_1 := v.Args[1] 13523 if v_1.Op != OpConst64 { 13524 break 13525 } 13526 c := v_1.AuxInt 13527 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13528 break 13529 } 13530 v.reset(OpNeg64) 13531 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 13532 v0.AddArg(n) 13533 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13534 v1.AuxInt = log2(-c) 13535 v0.AddArg(v1) 13536 v.AddArg(v0) 13537 return true 13538 } 13539 // match: (Mul64 <t> (Const64 [c]) n) 13540 // cond: t.IsSigned() && isPowerOfTwo(-c) 13541 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 13542 for { 13543 t := v.Type 13544 _ = v.Args[1] 13545 v_0 := v.Args[0] 13546 if v_0.Op != OpConst64 { 13547 break 13548 } 13549 c := v_0.AuxInt 13550 n := v.Args[1] 13551 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13552 break 13553 } 13554 v.reset(OpNeg64) 13555 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 13556 v0.AddArg(n) 13557 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13558 v1.AuxInt = log2(-c) 13559 v0.AddArg(v1) 13560 v.AddArg(v0) 13561 return true 13562 } 13563 return false 13564 } 13565 func rewriteValuegeneric_OpMul64_10(v *Value) bool { 13566 b := v.Block 13567 _ = b 13568 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x)) 13569 // cond: 13570 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 13571 for { 13572 _ = v.Args[1] 13573 v_0 := v.Args[0] 13574 if v_0.Op != OpConst64 { 13575 break 13576 } 13577 t := v_0.Type 13578 c := v_0.AuxInt 13579 v_1 := v.Args[1] 13580 if v_1.Op != OpAdd64 { 13581 break 13582 } 13583 if v_1.Type != t { 13584 break 13585 } 13586 _ = v_1.Args[1] 13587 v_1_0 := v_1.Args[0] 13588 if v_1_0.Op != OpConst64 { 13589 break 13590 } 13591 if v_1_0.Type != t { 13592 break 13593 } 13594 d := v_1_0.AuxInt 13595 x := v_1.Args[1] 13596 v.reset(OpAdd64) 13597 v0 := b.NewValue0(v.Pos, OpConst64, t) 13598 v0.AuxInt = c * d 13599 v.AddArg(v0) 13600 v1 := b.NewValue0(v.Pos, OpMul64, t) 13601 v2 := b.NewValue0(v.Pos, OpConst64, t) 13602 v2.AuxInt = c 13603 v1.AddArg(v2) 13604 v1.AddArg(x) 13605 v.AddArg(v1) 13606 return true 13607 } 13608 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> x (Const64 <t> [d]))) 13609 // cond: 13610 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 13611 for { 13612 _ = v.Args[1] 13613 v_0 := v.Args[0] 13614 if v_0.Op != OpConst64 { 13615 break 13616 } 13617 t := v_0.Type 13618 c := v_0.AuxInt 13619 v_1 := v.Args[1] 13620 if v_1.Op != OpAdd64 { 13621 break 13622 } 13623 if v_1.Type != t { 13624 break 13625 } 13626 _ = v_1.Args[1] 13627 x := v_1.Args[0] 13628 v_1_1 := v_1.Args[1] 13629 if v_1_1.Op != OpConst64 { 13630 break 13631 } 13632 if v_1_1.Type != t { 13633 break 13634 } 13635 d := v_1_1.AuxInt 13636 v.reset(OpAdd64) 13637 v0 := b.NewValue0(v.Pos, OpConst64, t) 13638 v0.AuxInt = c * d 13639 v.AddArg(v0) 13640 v1 := b.NewValue0(v.Pos, OpMul64, t) 13641 v2 := b.NewValue0(v.Pos, OpConst64, t) 13642 v2.AuxInt = c 13643 v1.AddArg(v2) 13644 v1.AddArg(x) 13645 v.AddArg(v1) 13646 return true 13647 } 13648 // match: (Mul64 (Add64 <t> (Const64 <t> [d]) x) (Const64 <t> [c])) 13649 // cond: 13650 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 13651 for { 13652 _ = v.Args[1] 13653 v_0 := v.Args[0] 13654 if v_0.Op != OpAdd64 { 13655 break 13656 } 13657 t := v_0.Type 13658 _ = v_0.Args[1] 13659 v_0_0 := v_0.Args[0] 13660 if v_0_0.Op != OpConst64 { 13661 break 13662 } 13663 if v_0_0.Type != t { 13664 break 13665 } 13666 d := v_0_0.AuxInt 13667 x := v_0.Args[1] 13668 v_1 := v.Args[1] 13669 if v_1.Op != OpConst64 { 13670 break 13671 } 13672 if v_1.Type != t { 13673 break 13674 } 13675 c := v_1.AuxInt 13676 v.reset(OpAdd64) 13677 v0 := b.NewValue0(v.Pos, OpConst64, t) 13678 v0.AuxInt = c * d 13679 v.AddArg(v0) 13680 v1 := b.NewValue0(v.Pos, OpMul64, t) 13681 v2 := b.NewValue0(v.Pos, OpConst64, t) 13682 v2.AuxInt = c 13683 v1.AddArg(v2) 13684 v1.AddArg(x) 13685 v.AddArg(v1) 13686 return true 13687 } 13688 // match: (Mul64 (Add64 <t> x (Const64 <t> [d])) (Const64 <t> [c])) 13689 // cond: 13690 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 13691 for { 13692 _ = v.Args[1] 13693 v_0 := v.Args[0] 13694 if v_0.Op != OpAdd64 { 13695 break 13696 } 13697 t := v_0.Type 13698 _ = v_0.Args[1] 13699 x := v_0.Args[0] 13700 v_0_1 := v_0.Args[1] 13701 if v_0_1.Op != OpConst64 { 13702 break 13703 } 13704 if v_0_1.Type != t { 13705 break 13706 } 13707 d := v_0_1.AuxInt 13708 v_1 := v.Args[1] 13709 if v_1.Op != OpConst64 { 13710 break 13711 } 13712 if v_1.Type != t { 13713 break 13714 } 13715 c := v_1.AuxInt 13716 v.reset(OpAdd64) 13717 v0 := b.NewValue0(v.Pos, OpConst64, t) 13718 v0.AuxInt = c * d 13719 v.AddArg(v0) 13720 v1 := b.NewValue0(v.Pos, OpMul64, t) 13721 v2 := b.NewValue0(v.Pos, OpConst64, t) 13722 v2.AuxInt = c 13723 v1.AddArg(v2) 13724 v1.AddArg(x) 13725 v.AddArg(v1) 13726 return true 13727 } 13728 // match: (Mul64 (Const64 [0]) _) 13729 // cond: 13730 // result: (Const64 [0]) 13731 for { 13732 _ = v.Args[1] 13733 v_0 := v.Args[0] 13734 if v_0.Op != OpConst64 { 13735 break 13736 } 13737 if v_0.AuxInt != 0 { 13738 break 13739 } 13740 v.reset(OpConst64) 13741 v.AuxInt = 0 13742 return true 13743 } 13744 // match: (Mul64 _ (Const64 [0])) 13745 // cond: 13746 // result: (Const64 [0]) 13747 for { 13748 _ = v.Args[1] 13749 v_1 := v.Args[1] 13750 if v_1.Op != OpConst64 { 13751 break 13752 } 13753 if v_1.AuxInt != 0 { 13754 break 13755 } 13756 v.reset(OpConst64) 13757 v.AuxInt = 0 13758 return true 13759 } 13760 // match: (Mul64 (Const64 <t> [c]) (Mul64 (Const64 <t> [d]) x)) 13761 // cond: 13762 // result: (Mul64 (Const64 <t> [c*d]) x) 13763 for { 13764 _ = v.Args[1] 13765 v_0 := v.Args[0] 13766 if v_0.Op != OpConst64 { 13767 break 13768 } 13769 t := v_0.Type 13770 c := v_0.AuxInt 13771 v_1 := v.Args[1] 13772 if v_1.Op != OpMul64 { 13773 break 13774 } 13775 _ = v_1.Args[1] 13776 v_1_0 := v_1.Args[0] 13777 if v_1_0.Op != OpConst64 { 13778 break 13779 } 13780 if v_1_0.Type != t { 13781 break 13782 } 13783 d := v_1_0.AuxInt 13784 x := v_1.Args[1] 13785 v.reset(OpMul64) 13786 v0 := b.NewValue0(v.Pos, OpConst64, t) 13787 v0.AuxInt = c * d 13788 v.AddArg(v0) 13789 v.AddArg(x) 13790 return true 13791 } 13792 // match: (Mul64 (Const64 <t> [c]) (Mul64 x (Const64 <t> [d]))) 13793 // cond: 13794 // result: (Mul64 (Const64 <t> [c*d]) x) 13795 for { 13796 _ = v.Args[1] 13797 v_0 := v.Args[0] 13798 if v_0.Op != OpConst64 { 13799 break 13800 } 13801 t := v_0.Type 13802 c := v_0.AuxInt 13803 v_1 := v.Args[1] 13804 if v_1.Op != OpMul64 { 13805 break 13806 } 13807 _ = v_1.Args[1] 13808 x := v_1.Args[0] 13809 v_1_1 := v_1.Args[1] 13810 if v_1_1.Op != OpConst64 { 13811 break 13812 } 13813 if v_1_1.Type != t { 13814 break 13815 } 13816 d := v_1_1.AuxInt 13817 v.reset(OpMul64) 13818 v0 := b.NewValue0(v.Pos, OpConst64, t) 13819 v0.AuxInt = c * d 13820 v.AddArg(v0) 13821 v.AddArg(x) 13822 return true 13823 } 13824 // match: (Mul64 (Mul64 (Const64 <t> [d]) x) (Const64 <t> [c])) 13825 // cond: 13826 // result: (Mul64 (Const64 <t> [c*d]) x) 13827 for { 13828 _ = v.Args[1] 13829 v_0 := v.Args[0] 13830 if v_0.Op != OpMul64 { 13831 break 13832 } 13833 _ = v_0.Args[1] 13834 v_0_0 := v_0.Args[0] 13835 if v_0_0.Op != OpConst64 { 13836 break 13837 } 13838 t := v_0_0.Type 13839 d := v_0_0.AuxInt 13840 x := v_0.Args[1] 13841 v_1 := v.Args[1] 13842 if v_1.Op != OpConst64 { 13843 break 13844 } 13845 if v_1.Type != t { 13846 break 13847 } 13848 c := v_1.AuxInt 13849 v.reset(OpMul64) 13850 v0 := b.NewValue0(v.Pos, OpConst64, t) 13851 v0.AuxInt = c * d 13852 v.AddArg(v0) 13853 v.AddArg(x) 13854 return true 13855 } 13856 // match: (Mul64 (Mul64 x (Const64 <t> [d])) (Const64 <t> [c])) 13857 // cond: 13858 // result: (Mul64 (Const64 <t> [c*d]) x) 13859 for { 13860 _ = v.Args[1] 13861 v_0 := v.Args[0] 13862 if v_0.Op != OpMul64 { 13863 break 13864 } 13865 _ = v_0.Args[1] 13866 x := v_0.Args[0] 13867 v_0_1 := v_0.Args[1] 13868 if v_0_1.Op != OpConst64 { 13869 break 13870 } 13871 t := v_0_1.Type 13872 d := v_0_1.AuxInt 13873 v_1 := v.Args[1] 13874 if v_1.Op != OpConst64 { 13875 break 13876 } 13877 if v_1.Type != t { 13878 break 13879 } 13880 c := v_1.AuxInt 13881 v.reset(OpMul64) 13882 v0 := b.NewValue0(v.Pos, OpConst64, t) 13883 v0.AuxInt = c * d 13884 v.AddArg(v0) 13885 v.AddArg(x) 13886 return true 13887 } 13888 return false 13889 } 13890 func rewriteValuegeneric_OpMul64F_0(v *Value) bool { 13891 // match: (Mul64F (Const64F [c]) (Const64F [d])) 13892 // cond: 13893 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 13894 for { 13895 _ = v.Args[1] 13896 v_0 := v.Args[0] 13897 if v_0.Op != OpConst64F { 13898 break 13899 } 13900 c := v_0.AuxInt 13901 v_1 := v.Args[1] 13902 if v_1.Op != OpConst64F { 13903 break 13904 } 13905 d := v_1.AuxInt 13906 v.reset(OpConst64F) 13907 v.AuxInt = f2i(i2f(c) * i2f(d)) 13908 return true 13909 } 13910 // match: (Mul64F (Const64F [d]) (Const64F [c])) 13911 // cond: 13912 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 13913 for { 13914 _ = v.Args[1] 13915 v_0 := v.Args[0] 13916 if v_0.Op != OpConst64F { 13917 break 13918 } 13919 d := v_0.AuxInt 13920 v_1 := v.Args[1] 13921 if v_1.Op != OpConst64F { 13922 break 13923 } 13924 c := v_1.AuxInt 13925 v.reset(OpConst64F) 13926 v.AuxInt = f2i(i2f(c) * i2f(d)) 13927 return true 13928 } 13929 // match: (Mul64F x (Const64F [f2i(1)])) 13930 // cond: 13931 // result: x 13932 for { 13933 _ = v.Args[1] 13934 x := v.Args[0] 13935 v_1 := v.Args[1] 13936 if v_1.Op != OpConst64F { 13937 break 13938 } 13939 if v_1.AuxInt != f2i(1) { 13940 break 13941 } 13942 v.reset(OpCopy) 13943 v.Type = x.Type 13944 v.AddArg(x) 13945 return true 13946 } 13947 // match: (Mul64F (Const64F [f2i(1)]) x) 13948 // cond: 13949 // result: x 13950 for { 13951 _ = v.Args[1] 13952 v_0 := v.Args[0] 13953 if v_0.Op != OpConst64F { 13954 break 13955 } 13956 if v_0.AuxInt != f2i(1) { 13957 break 13958 } 13959 x := v.Args[1] 13960 v.reset(OpCopy) 13961 v.Type = x.Type 13962 v.AddArg(x) 13963 return true 13964 } 13965 // match: (Mul64F x (Const64F [f2i(-1)])) 13966 // cond: 13967 // result: (Neg64F x) 13968 for { 13969 _ = v.Args[1] 13970 x := v.Args[0] 13971 v_1 := v.Args[1] 13972 if v_1.Op != OpConst64F { 13973 break 13974 } 13975 if v_1.AuxInt != f2i(-1) { 13976 break 13977 } 13978 v.reset(OpNeg64F) 13979 v.AddArg(x) 13980 return true 13981 } 13982 // match: (Mul64F (Const64F [f2i(-1)]) x) 13983 // cond: 13984 // result: (Neg64F x) 13985 for { 13986 _ = v.Args[1] 13987 v_0 := v.Args[0] 13988 if v_0.Op != OpConst64F { 13989 break 13990 } 13991 if v_0.AuxInt != f2i(-1) { 13992 break 13993 } 13994 x := v.Args[1] 13995 v.reset(OpNeg64F) 13996 v.AddArg(x) 13997 return true 13998 } 13999 // match: (Mul64F x (Const64F [f2i(2)])) 14000 // cond: 14001 // result: (Add64F x x) 14002 for { 14003 _ = v.Args[1] 14004 x := v.Args[0] 14005 v_1 := v.Args[1] 14006 if v_1.Op != OpConst64F { 14007 break 14008 } 14009 if v_1.AuxInt != f2i(2) { 14010 break 14011 } 14012 v.reset(OpAdd64F) 14013 v.AddArg(x) 14014 v.AddArg(x) 14015 return true 14016 } 14017 // match: (Mul64F (Const64F [f2i(2)]) x) 14018 // cond: 14019 // result: (Add64F x x) 14020 for { 14021 _ = v.Args[1] 14022 v_0 := v.Args[0] 14023 if v_0.Op != OpConst64F { 14024 break 14025 } 14026 if v_0.AuxInt != f2i(2) { 14027 break 14028 } 14029 x := v.Args[1] 14030 v.reset(OpAdd64F) 14031 v.AddArg(x) 14032 v.AddArg(x) 14033 return true 14034 } 14035 return false 14036 } 14037 func rewriteValuegeneric_OpMul8_0(v *Value) bool { 14038 b := v.Block 14039 _ = b 14040 typ := &b.Func.Config.Types 14041 _ = typ 14042 // match: (Mul8 (Const8 [c]) (Const8 [d])) 14043 // cond: 14044 // result: (Const8 [int64(int8(c*d))]) 14045 for { 14046 _ = v.Args[1] 14047 v_0 := v.Args[0] 14048 if v_0.Op != OpConst8 { 14049 break 14050 } 14051 c := v_0.AuxInt 14052 v_1 := v.Args[1] 14053 if v_1.Op != OpConst8 { 14054 break 14055 } 14056 d := v_1.AuxInt 14057 v.reset(OpConst8) 14058 v.AuxInt = int64(int8(c * d)) 14059 return true 14060 } 14061 // match: (Mul8 (Const8 [d]) (Const8 [c])) 14062 // cond: 14063 // result: (Const8 [int64(int8(c*d))]) 14064 for { 14065 _ = v.Args[1] 14066 v_0 := v.Args[0] 14067 if v_0.Op != OpConst8 { 14068 break 14069 } 14070 d := v_0.AuxInt 14071 v_1 := v.Args[1] 14072 if v_1.Op != OpConst8 { 14073 break 14074 } 14075 c := v_1.AuxInt 14076 v.reset(OpConst8) 14077 v.AuxInt = int64(int8(c * d)) 14078 return true 14079 } 14080 // match: (Mul8 (Const8 [1]) x) 14081 // cond: 14082 // result: x 14083 for { 14084 _ = v.Args[1] 14085 v_0 := v.Args[0] 14086 if v_0.Op != OpConst8 { 14087 break 14088 } 14089 if v_0.AuxInt != 1 { 14090 break 14091 } 14092 x := v.Args[1] 14093 v.reset(OpCopy) 14094 v.Type = x.Type 14095 v.AddArg(x) 14096 return true 14097 } 14098 // match: (Mul8 x (Const8 [1])) 14099 // cond: 14100 // result: x 14101 for { 14102 _ = v.Args[1] 14103 x := v.Args[0] 14104 v_1 := v.Args[1] 14105 if v_1.Op != OpConst8 { 14106 break 14107 } 14108 if v_1.AuxInt != 1 { 14109 break 14110 } 14111 v.reset(OpCopy) 14112 v.Type = x.Type 14113 v.AddArg(x) 14114 return true 14115 } 14116 // match: (Mul8 (Const8 [-1]) x) 14117 // cond: 14118 // result: (Neg8 x) 14119 for { 14120 _ = v.Args[1] 14121 v_0 := v.Args[0] 14122 if v_0.Op != OpConst8 { 14123 break 14124 } 14125 if v_0.AuxInt != -1 { 14126 break 14127 } 14128 x := v.Args[1] 14129 v.reset(OpNeg8) 14130 v.AddArg(x) 14131 return true 14132 } 14133 // match: (Mul8 x (Const8 [-1])) 14134 // cond: 14135 // result: (Neg8 x) 14136 for { 14137 _ = v.Args[1] 14138 x := v.Args[0] 14139 v_1 := v.Args[1] 14140 if v_1.Op != OpConst8 { 14141 break 14142 } 14143 if v_1.AuxInt != -1 { 14144 break 14145 } 14146 v.reset(OpNeg8) 14147 v.AddArg(x) 14148 return true 14149 } 14150 // match: (Mul8 <t> n (Const8 [c])) 14151 // cond: isPowerOfTwo(c) 14152 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14153 for { 14154 t := v.Type 14155 _ = v.Args[1] 14156 n := v.Args[0] 14157 v_1 := v.Args[1] 14158 if v_1.Op != OpConst8 { 14159 break 14160 } 14161 c := v_1.AuxInt 14162 if !(isPowerOfTwo(c)) { 14163 break 14164 } 14165 v.reset(OpLsh8x64) 14166 v.Type = t 14167 v.AddArg(n) 14168 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14169 v0.AuxInt = log2(c) 14170 v.AddArg(v0) 14171 return true 14172 } 14173 // match: (Mul8 <t> (Const8 [c]) n) 14174 // cond: isPowerOfTwo(c) 14175 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14176 for { 14177 t := v.Type 14178 _ = v.Args[1] 14179 v_0 := v.Args[0] 14180 if v_0.Op != OpConst8 { 14181 break 14182 } 14183 c := v_0.AuxInt 14184 n := v.Args[1] 14185 if !(isPowerOfTwo(c)) { 14186 break 14187 } 14188 v.reset(OpLsh8x64) 14189 v.Type = t 14190 v.AddArg(n) 14191 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14192 v0.AuxInt = log2(c) 14193 v.AddArg(v0) 14194 return true 14195 } 14196 // match: (Mul8 <t> n (Const8 [c])) 14197 // cond: t.IsSigned() && isPowerOfTwo(-c) 14198 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14199 for { 14200 t := v.Type 14201 _ = v.Args[1] 14202 n := v.Args[0] 14203 v_1 := v.Args[1] 14204 if v_1.Op != OpConst8 { 14205 break 14206 } 14207 c := v_1.AuxInt 14208 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14209 break 14210 } 14211 v.reset(OpNeg8) 14212 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 14213 v0.AddArg(n) 14214 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14215 v1.AuxInt = log2(-c) 14216 v0.AddArg(v1) 14217 v.AddArg(v0) 14218 return true 14219 } 14220 // match: (Mul8 <t> (Const8 [c]) n) 14221 // cond: t.IsSigned() && isPowerOfTwo(-c) 14222 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14223 for { 14224 t := v.Type 14225 _ = v.Args[1] 14226 v_0 := v.Args[0] 14227 if v_0.Op != OpConst8 { 14228 break 14229 } 14230 c := v_0.AuxInt 14231 n := v.Args[1] 14232 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14233 break 14234 } 14235 v.reset(OpNeg8) 14236 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 14237 v0.AddArg(n) 14238 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14239 v1.AuxInt = log2(-c) 14240 v0.AddArg(v1) 14241 v.AddArg(v0) 14242 return true 14243 } 14244 return false 14245 } 14246 func rewriteValuegeneric_OpMul8_10(v *Value) bool { 14247 b := v.Block 14248 _ = b 14249 // match: (Mul8 (Const8 [0]) _) 14250 // cond: 14251 // result: (Const8 [0]) 14252 for { 14253 _ = v.Args[1] 14254 v_0 := v.Args[0] 14255 if v_0.Op != OpConst8 { 14256 break 14257 } 14258 if v_0.AuxInt != 0 { 14259 break 14260 } 14261 v.reset(OpConst8) 14262 v.AuxInt = 0 14263 return true 14264 } 14265 // match: (Mul8 _ (Const8 [0])) 14266 // cond: 14267 // result: (Const8 [0]) 14268 for { 14269 _ = v.Args[1] 14270 v_1 := v.Args[1] 14271 if v_1.Op != OpConst8 { 14272 break 14273 } 14274 if v_1.AuxInt != 0 { 14275 break 14276 } 14277 v.reset(OpConst8) 14278 v.AuxInt = 0 14279 return true 14280 } 14281 // match: (Mul8 (Const8 <t> [c]) (Mul8 (Const8 <t> [d]) x)) 14282 // cond: 14283 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 14284 for { 14285 _ = v.Args[1] 14286 v_0 := v.Args[0] 14287 if v_0.Op != OpConst8 { 14288 break 14289 } 14290 t := v_0.Type 14291 c := v_0.AuxInt 14292 v_1 := v.Args[1] 14293 if v_1.Op != OpMul8 { 14294 break 14295 } 14296 _ = v_1.Args[1] 14297 v_1_0 := v_1.Args[0] 14298 if v_1_0.Op != OpConst8 { 14299 break 14300 } 14301 if v_1_0.Type != t { 14302 break 14303 } 14304 d := v_1_0.AuxInt 14305 x := v_1.Args[1] 14306 v.reset(OpMul8) 14307 v0 := b.NewValue0(v.Pos, OpConst8, t) 14308 v0.AuxInt = int64(int8(c * d)) 14309 v.AddArg(v0) 14310 v.AddArg(x) 14311 return true 14312 } 14313 // match: (Mul8 (Const8 <t> [c]) (Mul8 x (Const8 <t> [d]))) 14314 // cond: 14315 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 14316 for { 14317 _ = v.Args[1] 14318 v_0 := v.Args[0] 14319 if v_0.Op != OpConst8 { 14320 break 14321 } 14322 t := v_0.Type 14323 c := v_0.AuxInt 14324 v_1 := v.Args[1] 14325 if v_1.Op != OpMul8 { 14326 break 14327 } 14328 _ = v_1.Args[1] 14329 x := v_1.Args[0] 14330 v_1_1 := v_1.Args[1] 14331 if v_1_1.Op != OpConst8 { 14332 break 14333 } 14334 if v_1_1.Type != t { 14335 break 14336 } 14337 d := v_1_1.AuxInt 14338 v.reset(OpMul8) 14339 v0 := b.NewValue0(v.Pos, OpConst8, t) 14340 v0.AuxInt = int64(int8(c * d)) 14341 v.AddArg(v0) 14342 v.AddArg(x) 14343 return true 14344 } 14345 // match: (Mul8 (Mul8 (Const8 <t> [d]) x) (Const8 <t> [c])) 14346 // cond: 14347 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 14348 for { 14349 _ = v.Args[1] 14350 v_0 := v.Args[0] 14351 if v_0.Op != OpMul8 { 14352 break 14353 } 14354 _ = v_0.Args[1] 14355 v_0_0 := v_0.Args[0] 14356 if v_0_0.Op != OpConst8 { 14357 break 14358 } 14359 t := v_0_0.Type 14360 d := v_0_0.AuxInt 14361 x := v_0.Args[1] 14362 v_1 := v.Args[1] 14363 if v_1.Op != OpConst8 { 14364 break 14365 } 14366 if v_1.Type != t { 14367 break 14368 } 14369 c := v_1.AuxInt 14370 v.reset(OpMul8) 14371 v0 := b.NewValue0(v.Pos, OpConst8, t) 14372 v0.AuxInt = int64(int8(c * d)) 14373 v.AddArg(v0) 14374 v.AddArg(x) 14375 return true 14376 } 14377 // match: (Mul8 (Mul8 x (Const8 <t> [d])) (Const8 <t> [c])) 14378 // cond: 14379 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 14380 for { 14381 _ = v.Args[1] 14382 v_0 := v.Args[0] 14383 if v_0.Op != OpMul8 { 14384 break 14385 } 14386 _ = v_0.Args[1] 14387 x := v_0.Args[0] 14388 v_0_1 := v_0.Args[1] 14389 if v_0_1.Op != OpConst8 { 14390 break 14391 } 14392 t := v_0_1.Type 14393 d := v_0_1.AuxInt 14394 v_1 := v.Args[1] 14395 if v_1.Op != OpConst8 { 14396 break 14397 } 14398 if v_1.Type != t { 14399 break 14400 } 14401 c := v_1.AuxInt 14402 v.reset(OpMul8) 14403 v0 := b.NewValue0(v.Pos, OpConst8, t) 14404 v0.AuxInt = int64(int8(c * d)) 14405 v.AddArg(v0) 14406 v.AddArg(x) 14407 return true 14408 } 14409 return false 14410 } 14411 func rewriteValuegeneric_OpNeg16_0(v *Value) bool { 14412 // match: (Neg16 (Const16 [c])) 14413 // cond: 14414 // result: (Const16 [int64(-int16(c))]) 14415 for { 14416 v_0 := v.Args[0] 14417 if v_0.Op != OpConst16 { 14418 break 14419 } 14420 c := v_0.AuxInt 14421 v.reset(OpConst16) 14422 v.AuxInt = int64(-int16(c)) 14423 return true 14424 } 14425 // match: (Neg16 (Sub16 x y)) 14426 // cond: 14427 // result: (Sub16 y x) 14428 for { 14429 v_0 := v.Args[0] 14430 if v_0.Op != OpSub16 { 14431 break 14432 } 14433 _ = v_0.Args[1] 14434 x := v_0.Args[0] 14435 y := v_0.Args[1] 14436 v.reset(OpSub16) 14437 v.AddArg(y) 14438 v.AddArg(x) 14439 return true 14440 } 14441 return false 14442 } 14443 func rewriteValuegeneric_OpNeg32_0(v *Value) bool { 14444 // match: (Neg32 (Const32 [c])) 14445 // cond: 14446 // result: (Const32 [int64(-int32(c))]) 14447 for { 14448 v_0 := v.Args[0] 14449 if v_0.Op != OpConst32 { 14450 break 14451 } 14452 c := v_0.AuxInt 14453 v.reset(OpConst32) 14454 v.AuxInt = int64(-int32(c)) 14455 return true 14456 } 14457 // match: (Neg32 (Sub32 x y)) 14458 // cond: 14459 // result: (Sub32 y x) 14460 for { 14461 v_0 := v.Args[0] 14462 if v_0.Op != OpSub32 { 14463 break 14464 } 14465 _ = v_0.Args[1] 14466 x := v_0.Args[0] 14467 y := v_0.Args[1] 14468 v.reset(OpSub32) 14469 v.AddArg(y) 14470 v.AddArg(x) 14471 return true 14472 } 14473 return false 14474 } 14475 func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { 14476 // match: (Neg32F (Const32F [c])) 14477 // cond: i2f(c) != 0 14478 // result: (Const32F [f2i(-i2f(c))]) 14479 for { 14480 v_0 := v.Args[0] 14481 if v_0.Op != OpConst32F { 14482 break 14483 } 14484 c := v_0.AuxInt 14485 if !(i2f(c) != 0) { 14486 break 14487 } 14488 v.reset(OpConst32F) 14489 v.AuxInt = f2i(-i2f(c)) 14490 return true 14491 } 14492 return false 14493 } 14494 func rewriteValuegeneric_OpNeg64_0(v *Value) bool { 14495 // match: (Neg64 (Const64 [c])) 14496 // cond: 14497 // result: (Const64 [-c]) 14498 for { 14499 v_0 := v.Args[0] 14500 if v_0.Op != OpConst64 { 14501 break 14502 } 14503 c := v_0.AuxInt 14504 v.reset(OpConst64) 14505 v.AuxInt = -c 14506 return true 14507 } 14508 // match: (Neg64 (Sub64 x y)) 14509 // cond: 14510 // result: (Sub64 y x) 14511 for { 14512 v_0 := v.Args[0] 14513 if v_0.Op != OpSub64 { 14514 break 14515 } 14516 _ = v_0.Args[1] 14517 x := v_0.Args[0] 14518 y := v_0.Args[1] 14519 v.reset(OpSub64) 14520 v.AddArg(y) 14521 v.AddArg(x) 14522 return true 14523 } 14524 return false 14525 } 14526 func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { 14527 // match: (Neg64F (Const64F [c])) 14528 // cond: i2f(c) != 0 14529 // result: (Const64F [f2i(-i2f(c))]) 14530 for { 14531 v_0 := v.Args[0] 14532 if v_0.Op != OpConst64F { 14533 break 14534 } 14535 c := v_0.AuxInt 14536 if !(i2f(c) != 0) { 14537 break 14538 } 14539 v.reset(OpConst64F) 14540 v.AuxInt = f2i(-i2f(c)) 14541 return true 14542 } 14543 return false 14544 } 14545 func rewriteValuegeneric_OpNeg8_0(v *Value) bool { 14546 // match: (Neg8 (Const8 [c])) 14547 // cond: 14548 // result: (Const8 [int64( -int8(c))]) 14549 for { 14550 v_0 := v.Args[0] 14551 if v_0.Op != OpConst8 { 14552 break 14553 } 14554 c := v_0.AuxInt 14555 v.reset(OpConst8) 14556 v.AuxInt = int64(-int8(c)) 14557 return true 14558 } 14559 // match: (Neg8 (Sub8 x y)) 14560 // cond: 14561 // result: (Sub8 y x) 14562 for { 14563 v_0 := v.Args[0] 14564 if v_0.Op != OpSub8 { 14565 break 14566 } 14567 _ = v_0.Args[1] 14568 x := v_0.Args[0] 14569 y := v_0.Args[1] 14570 v.reset(OpSub8) 14571 v.AddArg(y) 14572 v.AddArg(x) 14573 return true 14574 } 14575 return false 14576 } 14577 func rewriteValuegeneric_OpNeq16_0(v *Value) bool { 14578 b := v.Block 14579 _ = b 14580 // match: (Neq16 x x) 14581 // cond: 14582 // result: (ConstBool [0]) 14583 for { 14584 _ = v.Args[1] 14585 x := v.Args[0] 14586 if x != v.Args[1] { 14587 break 14588 } 14589 v.reset(OpConstBool) 14590 v.AuxInt = 0 14591 return true 14592 } 14593 // match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 14594 // cond: 14595 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 14596 for { 14597 _ = v.Args[1] 14598 v_0 := v.Args[0] 14599 if v_0.Op != OpConst16 { 14600 break 14601 } 14602 t := v_0.Type 14603 c := v_0.AuxInt 14604 v_1 := v.Args[1] 14605 if v_1.Op != OpAdd16 { 14606 break 14607 } 14608 _ = v_1.Args[1] 14609 v_1_0 := v_1.Args[0] 14610 if v_1_0.Op != OpConst16 { 14611 break 14612 } 14613 if v_1_0.Type != t { 14614 break 14615 } 14616 d := v_1_0.AuxInt 14617 x := v_1.Args[1] 14618 v.reset(OpNeq16) 14619 v0 := b.NewValue0(v.Pos, OpConst16, t) 14620 v0.AuxInt = int64(int16(c - d)) 14621 v.AddArg(v0) 14622 v.AddArg(x) 14623 return true 14624 } 14625 // match: (Neq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 14626 // cond: 14627 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 14628 for { 14629 _ = v.Args[1] 14630 v_0 := v.Args[0] 14631 if v_0.Op != OpConst16 { 14632 break 14633 } 14634 t := v_0.Type 14635 c := v_0.AuxInt 14636 v_1 := v.Args[1] 14637 if v_1.Op != OpAdd16 { 14638 break 14639 } 14640 _ = v_1.Args[1] 14641 x := v_1.Args[0] 14642 v_1_1 := v_1.Args[1] 14643 if v_1_1.Op != OpConst16 { 14644 break 14645 } 14646 if v_1_1.Type != t { 14647 break 14648 } 14649 d := v_1_1.AuxInt 14650 v.reset(OpNeq16) 14651 v0 := b.NewValue0(v.Pos, OpConst16, t) 14652 v0.AuxInt = int64(int16(c - d)) 14653 v.AddArg(v0) 14654 v.AddArg(x) 14655 return true 14656 } 14657 // match: (Neq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 14658 // cond: 14659 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 14660 for { 14661 _ = v.Args[1] 14662 v_0 := v.Args[0] 14663 if v_0.Op != OpAdd16 { 14664 break 14665 } 14666 _ = v_0.Args[1] 14667 v_0_0 := v_0.Args[0] 14668 if v_0_0.Op != OpConst16 { 14669 break 14670 } 14671 t := v_0_0.Type 14672 d := v_0_0.AuxInt 14673 x := v_0.Args[1] 14674 v_1 := v.Args[1] 14675 if v_1.Op != OpConst16 { 14676 break 14677 } 14678 if v_1.Type != t { 14679 break 14680 } 14681 c := v_1.AuxInt 14682 v.reset(OpNeq16) 14683 v0 := b.NewValue0(v.Pos, OpConst16, t) 14684 v0.AuxInt = int64(int16(c - d)) 14685 v.AddArg(v0) 14686 v.AddArg(x) 14687 return true 14688 } 14689 // match: (Neq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 14690 // cond: 14691 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 14692 for { 14693 _ = v.Args[1] 14694 v_0 := v.Args[0] 14695 if v_0.Op != OpAdd16 { 14696 break 14697 } 14698 _ = v_0.Args[1] 14699 x := v_0.Args[0] 14700 v_0_1 := v_0.Args[1] 14701 if v_0_1.Op != OpConst16 { 14702 break 14703 } 14704 t := v_0_1.Type 14705 d := v_0_1.AuxInt 14706 v_1 := v.Args[1] 14707 if v_1.Op != OpConst16 { 14708 break 14709 } 14710 if v_1.Type != t { 14711 break 14712 } 14713 c := v_1.AuxInt 14714 v.reset(OpNeq16) 14715 v0 := b.NewValue0(v.Pos, OpConst16, t) 14716 v0.AuxInt = int64(int16(c - d)) 14717 v.AddArg(v0) 14718 v.AddArg(x) 14719 return true 14720 } 14721 // match: (Neq16 (Const16 [c]) (Const16 [d])) 14722 // cond: 14723 // result: (ConstBool [b2i(c != d)]) 14724 for { 14725 _ = v.Args[1] 14726 v_0 := v.Args[0] 14727 if v_0.Op != OpConst16 { 14728 break 14729 } 14730 c := v_0.AuxInt 14731 v_1 := v.Args[1] 14732 if v_1.Op != OpConst16 { 14733 break 14734 } 14735 d := v_1.AuxInt 14736 v.reset(OpConstBool) 14737 v.AuxInt = b2i(c != d) 14738 return true 14739 } 14740 // match: (Neq16 (Const16 [d]) (Const16 [c])) 14741 // cond: 14742 // result: (ConstBool [b2i(c != d)]) 14743 for { 14744 _ = v.Args[1] 14745 v_0 := v.Args[0] 14746 if v_0.Op != OpConst16 { 14747 break 14748 } 14749 d := v_0.AuxInt 14750 v_1 := v.Args[1] 14751 if v_1.Op != OpConst16 { 14752 break 14753 } 14754 c := v_1.AuxInt 14755 v.reset(OpConstBool) 14756 v.AuxInt = b2i(c != d) 14757 return true 14758 } 14759 return false 14760 } 14761 func rewriteValuegeneric_OpNeq32_0(v *Value) bool { 14762 b := v.Block 14763 _ = b 14764 // match: (Neq32 x x) 14765 // cond: 14766 // result: (ConstBool [0]) 14767 for { 14768 _ = v.Args[1] 14769 x := v.Args[0] 14770 if x != v.Args[1] { 14771 break 14772 } 14773 v.reset(OpConstBool) 14774 v.AuxInt = 0 14775 return true 14776 } 14777 // match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 14778 // cond: 14779 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 14780 for { 14781 _ = v.Args[1] 14782 v_0 := v.Args[0] 14783 if v_0.Op != OpConst32 { 14784 break 14785 } 14786 t := v_0.Type 14787 c := v_0.AuxInt 14788 v_1 := v.Args[1] 14789 if v_1.Op != OpAdd32 { 14790 break 14791 } 14792 _ = v_1.Args[1] 14793 v_1_0 := v_1.Args[0] 14794 if v_1_0.Op != OpConst32 { 14795 break 14796 } 14797 if v_1_0.Type != t { 14798 break 14799 } 14800 d := v_1_0.AuxInt 14801 x := v_1.Args[1] 14802 v.reset(OpNeq32) 14803 v0 := b.NewValue0(v.Pos, OpConst32, t) 14804 v0.AuxInt = int64(int32(c - d)) 14805 v.AddArg(v0) 14806 v.AddArg(x) 14807 return true 14808 } 14809 // match: (Neq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 14810 // cond: 14811 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 14812 for { 14813 _ = v.Args[1] 14814 v_0 := v.Args[0] 14815 if v_0.Op != OpConst32 { 14816 break 14817 } 14818 t := v_0.Type 14819 c := v_0.AuxInt 14820 v_1 := v.Args[1] 14821 if v_1.Op != OpAdd32 { 14822 break 14823 } 14824 _ = v_1.Args[1] 14825 x := v_1.Args[0] 14826 v_1_1 := v_1.Args[1] 14827 if v_1_1.Op != OpConst32 { 14828 break 14829 } 14830 if v_1_1.Type != t { 14831 break 14832 } 14833 d := v_1_1.AuxInt 14834 v.reset(OpNeq32) 14835 v0 := b.NewValue0(v.Pos, OpConst32, t) 14836 v0.AuxInt = int64(int32(c - d)) 14837 v.AddArg(v0) 14838 v.AddArg(x) 14839 return true 14840 } 14841 // match: (Neq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 14842 // cond: 14843 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 14844 for { 14845 _ = v.Args[1] 14846 v_0 := v.Args[0] 14847 if v_0.Op != OpAdd32 { 14848 break 14849 } 14850 _ = v_0.Args[1] 14851 v_0_0 := v_0.Args[0] 14852 if v_0_0.Op != OpConst32 { 14853 break 14854 } 14855 t := v_0_0.Type 14856 d := v_0_0.AuxInt 14857 x := v_0.Args[1] 14858 v_1 := v.Args[1] 14859 if v_1.Op != OpConst32 { 14860 break 14861 } 14862 if v_1.Type != t { 14863 break 14864 } 14865 c := v_1.AuxInt 14866 v.reset(OpNeq32) 14867 v0 := b.NewValue0(v.Pos, OpConst32, t) 14868 v0.AuxInt = int64(int32(c - d)) 14869 v.AddArg(v0) 14870 v.AddArg(x) 14871 return true 14872 } 14873 // match: (Neq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 14874 // cond: 14875 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 14876 for { 14877 _ = v.Args[1] 14878 v_0 := v.Args[0] 14879 if v_0.Op != OpAdd32 { 14880 break 14881 } 14882 _ = v_0.Args[1] 14883 x := v_0.Args[0] 14884 v_0_1 := v_0.Args[1] 14885 if v_0_1.Op != OpConst32 { 14886 break 14887 } 14888 t := v_0_1.Type 14889 d := v_0_1.AuxInt 14890 v_1 := v.Args[1] 14891 if v_1.Op != OpConst32 { 14892 break 14893 } 14894 if v_1.Type != t { 14895 break 14896 } 14897 c := v_1.AuxInt 14898 v.reset(OpNeq32) 14899 v0 := b.NewValue0(v.Pos, OpConst32, t) 14900 v0.AuxInt = int64(int32(c - d)) 14901 v.AddArg(v0) 14902 v.AddArg(x) 14903 return true 14904 } 14905 // match: (Neq32 (Const32 [c]) (Const32 [d])) 14906 // cond: 14907 // result: (ConstBool [b2i(c != d)]) 14908 for { 14909 _ = v.Args[1] 14910 v_0 := v.Args[0] 14911 if v_0.Op != OpConst32 { 14912 break 14913 } 14914 c := v_0.AuxInt 14915 v_1 := v.Args[1] 14916 if v_1.Op != OpConst32 { 14917 break 14918 } 14919 d := v_1.AuxInt 14920 v.reset(OpConstBool) 14921 v.AuxInt = b2i(c != d) 14922 return true 14923 } 14924 // match: (Neq32 (Const32 [d]) (Const32 [c])) 14925 // cond: 14926 // result: (ConstBool [b2i(c != d)]) 14927 for { 14928 _ = v.Args[1] 14929 v_0 := v.Args[0] 14930 if v_0.Op != OpConst32 { 14931 break 14932 } 14933 d := v_0.AuxInt 14934 v_1 := v.Args[1] 14935 if v_1.Op != OpConst32 { 14936 break 14937 } 14938 c := v_1.AuxInt 14939 v.reset(OpConstBool) 14940 v.AuxInt = b2i(c != d) 14941 return true 14942 } 14943 return false 14944 } 14945 func rewriteValuegeneric_OpNeq64_0(v *Value) bool { 14946 b := v.Block 14947 _ = b 14948 // match: (Neq64 x x) 14949 // cond: 14950 // result: (ConstBool [0]) 14951 for { 14952 _ = v.Args[1] 14953 x := v.Args[0] 14954 if x != v.Args[1] { 14955 break 14956 } 14957 v.reset(OpConstBool) 14958 v.AuxInt = 0 14959 return true 14960 } 14961 // match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 14962 // cond: 14963 // result: (Neq64 (Const64 <t> [c-d]) x) 14964 for { 14965 _ = v.Args[1] 14966 v_0 := v.Args[0] 14967 if v_0.Op != OpConst64 { 14968 break 14969 } 14970 t := v_0.Type 14971 c := v_0.AuxInt 14972 v_1 := v.Args[1] 14973 if v_1.Op != OpAdd64 { 14974 break 14975 } 14976 _ = v_1.Args[1] 14977 v_1_0 := v_1.Args[0] 14978 if v_1_0.Op != OpConst64 { 14979 break 14980 } 14981 if v_1_0.Type != t { 14982 break 14983 } 14984 d := v_1_0.AuxInt 14985 x := v_1.Args[1] 14986 v.reset(OpNeq64) 14987 v0 := b.NewValue0(v.Pos, OpConst64, t) 14988 v0.AuxInt = c - d 14989 v.AddArg(v0) 14990 v.AddArg(x) 14991 return true 14992 } 14993 // match: (Neq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 14994 // cond: 14995 // result: (Neq64 (Const64 <t> [c-d]) x) 14996 for { 14997 _ = v.Args[1] 14998 v_0 := v.Args[0] 14999 if v_0.Op != OpConst64 { 15000 break 15001 } 15002 t := v_0.Type 15003 c := v_0.AuxInt 15004 v_1 := v.Args[1] 15005 if v_1.Op != OpAdd64 { 15006 break 15007 } 15008 _ = v_1.Args[1] 15009 x := v_1.Args[0] 15010 v_1_1 := v_1.Args[1] 15011 if v_1_1.Op != OpConst64 { 15012 break 15013 } 15014 if v_1_1.Type != t { 15015 break 15016 } 15017 d := v_1_1.AuxInt 15018 v.reset(OpNeq64) 15019 v0 := b.NewValue0(v.Pos, OpConst64, t) 15020 v0.AuxInt = c - d 15021 v.AddArg(v0) 15022 v.AddArg(x) 15023 return true 15024 } 15025 // match: (Neq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 15026 // cond: 15027 // result: (Neq64 (Const64 <t> [c-d]) x) 15028 for { 15029 _ = v.Args[1] 15030 v_0 := v.Args[0] 15031 if v_0.Op != OpAdd64 { 15032 break 15033 } 15034 _ = v_0.Args[1] 15035 v_0_0 := v_0.Args[0] 15036 if v_0_0.Op != OpConst64 { 15037 break 15038 } 15039 t := v_0_0.Type 15040 d := v_0_0.AuxInt 15041 x := v_0.Args[1] 15042 v_1 := v.Args[1] 15043 if v_1.Op != OpConst64 { 15044 break 15045 } 15046 if v_1.Type != t { 15047 break 15048 } 15049 c := v_1.AuxInt 15050 v.reset(OpNeq64) 15051 v0 := b.NewValue0(v.Pos, OpConst64, t) 15052 v0.AuxInt = c - d 15053 v.AddArg(v0) 15054 v.AddArg(x) 15055 return true 15056 } 15057 // match: (Neq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 15058 // cond: 15059 // result: (Neq64 (Const64 <t> [c-d]) x) 15060 for { 15061 _ = v.Args[1] 15062 v_0 := v.Args[0] 15063 if v_0.Op != OpAdd64 { 15064 break 15065 } 15066 _ = v_0.Args[1] 15067 x := v_0.Args[0] 15068 v_0_1 := v_0.Args[1] 15069 if v_0_1.Op != OpConst64 { 15070 break 15071 } 15072 t := v_0_1.Type 15073 d := v_0_1.AuxInt 15074 v_1 := v.Args[1] 15075 if v_1.Op != OpConst64 { 15076 break 15077 } 15078 if v_1.Type != t { 15079 break 15080 } 15081 c := v_1.AuxInt 15082 v.reset(OpNeq64) 15083 v0 := b.NewValue0(v.Pos, OpConst64, t) 15084 v0.AuxInt = c - d 15085 v.AddArg(v0) 15086 v.AddArg(x) 15087 return true 15088 } 15089 // match: (Neq64 (Const64 [c]) (Const64 [d])) 15090 // cond: 15091 // result: (ConstBool [b2i(c != d)]) 15092 for { 15093 _ = v.Args[1] 15094 v_0 := v.Args[0] 15095 if v_0.Op != OpConst64 { 15096 break 15097 } 15098 c := v_0.AuxInt 15099 v_1 := v.Args[1] 15100 if v_1.Op != OpConst64 { 15101 break 15102 } 15103 d := v_1.AuxInt 15104 v.reset(OpConstBool) 15105 v.AuxInt = b2i(c != d) 15106 return true 15107 } 15108 // match: (Neq64 (Const64 [d]) (Const64 [c])) 15109 // cond: 15110 // result: (ConstBool [b2i(c != d)]) 15111 for { 15112 _ = v.Args[1] 15113 v_0 := v.Args[0] 15114 if v_0.Op != OpConst64 { 15115 break 15116 } 15117 d := v_0.AuxInt 15118 v_1 := v.Args[1] 15119 if v_1.Op != OpConst64 { 15120 break 15121 } 15122 c := v_1.AuxInt 15123 v.reset(OpConstBool) 15124 v.AuxInt = b2i(c != d) 15125 return true 15126 } 15127 return false 15128 } 15129 func rewriteValuegeneric_OpNeq8_0(v *Value) bool { 15130 b := v.Block 15131 _ = b 15132 // match: (Neq8 x x) 15133 // cond: 15134 // result: (ConstBool [0]) 15135 for { 15136 _ = v.Args[1] 15137 x := v.Args[0] 15138 if x != v.Args[1] { 15139 break 15140 } 15141 v.reset(OpConstBool) 15142 v.AuxInt = 0 15143 return true 15144 } 15145 // match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 15146 // cond: 15147 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 15148 for { 15149 _ = v.Args[1] 15150 v_0 := v.Args[0] 15151 if v_0.Op != OpConst8 { 15152 break 15153 } 15154 t := v_0.Type 15155 c := v_0.AuxInt 15156 v_1 := v.Args[1] 15157 if v_1.Op != OpAdd8 { 15158 break 15159 } 15160 _ = v_1.Args[1] 15161 v_1_0 := v_1.Args[0] 15162 if v_1_0.Op != OpConst8 { 15163 break 15164 } 15165 if v_1_0.Type != t { 15166 break 15167 } 15168 d := v_1_0.AuxInt 15169 x := v_1.Args[1] 15170 v.reset(OpNeq8) 15171 v0 := b.NewValue0(v.Pos, OpConst8, t) 15172 v0.AuxInt = int64(int8(c - d)) 15173 v.AddArg(v0) 15174 v.AddArg(x) 15175 return true 15176 } 15177 // match: (Neq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 15178 // cond: 15179 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 15180 for { 15181 _ = v.Args[1] 15182 v_0 := v.Args[0] 15183 if v_0.Op != OpConst8 { 15184 break 15185 } 15186 t := v_0.Type 15187 c := v_0.AuxInt 15188 v_1 := v.Args[1] 15189 if v_1.Op != OpAdd8 { 15190 break 15191 } 15192 _ = v_1.Args[1] 15193 x := v_1.Args[0] 15194 v_1_1 := v_1.Args[1] 15195 if v_1_1.Op != OpConst8 { 15196 break 15197 } 15198 if v_1_1.Type != t { 15199 break 15200 } 15201 d := v_1_1.AuxInt 15202 v.reset(OpNeq8) 15203 v0 := b.NewValue0(v.Pos, OpConst8, t) 15204 v0.AuxInt = int64(int8(c - d)) 15205 v.AddArg(v0) 15206 v.AddArg(x) 15207 return true 15208 } 15209 // match: (Neq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 15210 // cond: 15211 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 15212 for { 15213 _ = v.Args[1] 15214 v_0 := v.Args[0] 15215 if v_0.Op != OpAdd8 { 15216 break 15217 } 15218 _ = v_0.Args[1] 15219 v_0_0 := v_0.Args[0] 15220 if v_0_0.Op != OpConst8 { 15221 break 15222 } 15223 t := v_0_0.Type 15224 d := v_0_0.AuxInt 15225 x := v_0.Args[1] 15226 v_1 := v.Args[1] 15227 if v_1.Op != OpConst8 { 15228 break 15229 } 15230 if v_1.Type != t { 15231 break 15232 } 15233 c := v_1.AuxInt 15234 v.reset(OpNeq8) 15235 v0 := b.NewValue0(v.Pos, OpConst8, t) 15236 v0.AuxInt = int64(int8(c - d)) 15237 v.AddArg(v0) 15238 v.AddArg(x) 15239 return true 15240 } 15241 // match: (Neq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 15242 // cond: 15243 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 15244 for { 15245 _ = v.Args[1] 15246 v_0 := v.Args[0] 15247 if v_0.Op != OpAdd8 { 15248 break 15249 } 15250 _ = v_0.Args[1] 15251 x := v_0.Args[0] 15252 v_0_1 := v_0.Args[1] 15253 if v_0_1.Op != OpConst8 { 15254 break 15255 } 15256 t := v_0_1.Type 15257 d := v_0_1.AuxInt 15258 v_1 := v.Args[1] 15259 if v_1.Op != OpConst8 { 15260 break 15261 } 15262 if v_1.Type != t { 15263 break 15264 } 15265 c := v_1.AuxInt 15266 v.reset(OpNeq8) 15267 v0 := b.NewValue0(v.Pos, OpConst8, t) 15268 v0.AuxInt = int64(int8(c - d)) 15269 v.AddArg(v0) 15270 v.AddArg(x) 15271 return true 15272 } 15273 // match: (Neq8 (Const8 [c]) (Const8 [d])) 15274 // cond: 15275 // result: (ConstBool [b2i(c != d)]) 15276 for { 15277 _ = v.Args[1] 15278 v_0 := v.Args[0] 15279 if v_0.Op != OpConst8 { 15280 break 15281 } 15282 c := v_0.AuxInt 15283 v_1 := v.Args[1] 15284 if v_1.Op != OpConst8 { 15285 break 15286 } 15287 d := v_1.AuxInt 15288 v.reset(OpConstBool) 15289 v.AuxInt = b2i(c != d) 15290 return true 15291 } 15292 // match: (Neq8 (Const8 [d]) (Const8 [c])) 15293 // cond: 15294 // result: (ConstBool [b2i(c != d)]) 15295 for { 15296 _ = v.Args[1] 15297 v_0 := v.Args[0] 15298 if v_0.Op != OpConst8 { 15299 break 15300 } 15301 d := v_0.AuxInt 15302 v_1 := v.Args[1] 15303 if v_1.Op != OpConst8 { 15304 break 15305 } 15306 c := v_1.AuxInt 15307 v.reset(OpConstBool) 15308 v.AuxInt = b2i(c != d) 15309 return true 15310 } 15311 return false 15312 } 15313 func rewriteValuegeneric_OpNeqB_0(v *Value) bool { 15314 // match: (NeqB (ConstBool [c]) (ConstBool [d])) 15315 // cond: 15316 // result: (ConstBool [b2i(c != d)]) 15317 for { 15318 _ = v.Args[1] 15319 v_0 := v.Args[0] 15320 if v_0.Op != OpConstBool { 15321 break 15322 } 15323 c := v_0.AuxInt 15324 v_1 := v.Args[1] 15325 if v_1.Op != OpConstBool { 15326 break 15327 } 15328 d := v_1.AuxInt 15329 v.reset(OpConstBool) 15330 v.AuxInt = b2i(c != d) 15331 return true 15332 } 15333 // match: (NeqB (ConstBool [d]) (ConstBool [c])) 15334 // cond: 15335 // result: (ConstBool [b2i(c != d)]) 15336 for { 15337 _ = v.Args[1] 15338 v_0 := v.Args[0] 15339 if v_0.Op != OpConstBool { 15340 break 15341 } 15342 d := v_0.AuxInt 15343 v_1 := v.Args[1] 15344 if v_1.Op != OpConstBool { 15345 break 15346 } 15347 c := v_1.AuxInt 15348 v.reset(OpConstBool) 15349 v.AuxInt = b2i(c != d) 15350 return true 15351 } 15352 // match: (NeqB (ConstBool [0]) x) 15353 // cond: 15354 // result: x 15355 for { 15356 _ = v.Args[1] 15357 v_0 := v.Args[0] 15358 if v_0.Op != OpConstBool { 15359 break 15360 } 15361 if v_0.AuxInt != 0 { 15362 break 15363 } 15364 x := v.Args[1] 15365 v.reset(OpCopy) 15366 v.Type = x.Type 15367 v.AddArg(x) 15368 return true 15369 } 15370 // match: (NeqB x (ConstBool [0])) 15371 // cond: 15372 // result: x 15373 for { 15374 _ = v.Args[1] 15375 x := v.Args[0] 15376 v_1 := v.Args[1] 15377 if v_1.Op != OpConstBool { 15378 break 15379 } 15380 if v_1.AuxInt != 0 { 15381 break 15382 } 15383 v.reset(OpCopy) 15384 v.Type = x.Type 15385 v.AddArg(x) 15386 return true 15387 } 15388 // match: (NeqB (ConstBool [1]) x) 15389 // cond: 15390 // result: (Not x) 15391 for { 15392 _ = v.Args[1] 15393 v_0 := v.Args[0] 15394 if v_0.Op != OpConstBool { 15395 break 15396 } 15397 if v_0.AuxInt != 1 { 15398 break 15399 } 15400 x := v.Args[1] 15401 v.reset(OpNot) 15402 v.AddArg(x) 15403 return true 15404 } 15405 // match: (NeqB x (ConstBool [1])) 15406 // cond: 15407 // result: (Not x) 15408 for { 15409 _ = v.Args[1] 15410 x := v.Args[0] 15411 v_1 := v.Args[1] 15412 if v_1.Op != OpConstBool { 15413 break 15414 } 15415 if v_1.AuxInt != 1 { 15416 break 15417 } 15418 v.reset(OpNot) 15419 v.AddArg(x) 15420 return true 15421 } 15422 // match: (NeqB (Not x) (Not y)) 15423 // cond: 15424 // result: (NeqB x y) 15425 for { 15426 _ = v.Args[1] 15427 v_0 := v.Args[0] 15428 if v_0.Op != OpNot { 15429 break 15430 } 15431 x := v_0.Args[0] 15432 v_1 := v.Args[1] 15433 if v_1.Op != OpNot { 15434 break 15435 } 15436 y := v_1.Args[0] 15437 v.reset(OpNeqB) 15438 v.AddArg(x) 15439 v.AddArg(y) 15440 return true 15441 } 15442 // match: (NeqB (Not y) (Not x)) 15443 // cond: 15444 // result: (NeqB x y) 15445 for { 15446 _ = v.Args[1] 15447 v_0 := v.Args[0] 15448 if v_0.Op != OpNot { 15449 break 15450 } 15451 y := v_0.Args[0] 15452 v_1 := v.Args[1] 15453 if v_1.Op != OpNot { 15454 break 15455 } 15456 x := v_1.Args[0] 15457 v.reset(OpNeqB) 15458 v.AddArg(x) 15459 v.AddArg(y) 15460 return true 15461 } 15462 return false 15463 } 15464 func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { 15465 b := v.Block 15466 _ = b 15467 typ := &b.Func.Config.Types 15468 _ = typ 15469 // match: (NeqInter x y) 15470 // cond: 15471 // result: (NeqPtr (ITab x) (ITab y)) 15472 for { 15473 _ = v.Args[1] 15474 x := v.Args[0] 15475 y := v.Args[1] 15476 v.reset(OpNeqPtr) 15477 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 15478 v0.AddArg(x) 15479 v.AddArg(v0) 15480 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 15481 v1.AddArg(y) 15482 v.AddArg(v1) 15483 return true 15484 } 15485 } 15486 func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { 15487 // match: (NeqPtr p (ConstNil)) 15488 // cond: 15489 // result: (IsNonNil p) 15490 for { 15491 _ = v.Args[1] 15492 p := v.Args[0] 15493 v_1 := v.Args[1] 15494 if v_1.Op != OpConstNil { 15495 break 15496 } 15497 v.reset(OpIsNonNil) 15498 v.AddArg(p) 15499 return true 15500 } 15501 // match: (NeqPtr (ConstNil) p) 15502 // cond: 15503 // result: (IsNonNil p) 15504 for { 15505 _ = v.Args[1] 15506 v_0 := v.Args[0] 15507 if v_0.Op != OpConstNil { 15508 break 15509 } 15510 p := v.Args[1] 15511 v.reset(OpIsNonNil) 15512 v.AddArg(p) 15513 return true 15514 } 15515 return false 15516 } 15517 func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { 15518 b := v.Block 15519 _ = b 15520 typ := &b.Func.Config.Types 15521 _ = typ 15522 // match: (NeqSlice x y) 15523 // cond: 15524 // result: (NeqPtr (SlicePtr x) (SlicePtr y)) 15525 for { 15526 _ = v.Args[1] 15527 x := v.Args[0] 15528 y := v.Args[1] 15529 v.reset(OpNeqPtr) 15530 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 15531 v0.AddArg(x) 15532 v.AddArg(v0) 15533 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 15534 v1.AddArg(y) 15535 v.AddArg(v1) 15536 return true 15537 } 15538 } 15539 func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { 15540 b := v.Block 15541 _ = b 15542 config := b.Func.Config 15543 _ = config 15544 fe := b.Func.fe 15545 _ = fe 15546 // match: (NilCheck (GetG mem) mem) 15547 // cond: 15548 // result: mem 15549 for { 15550 _ = v.Args[1] 15551 v_0 := v.Args[0] 15552 if v_0.Op != OpGetG { 15553 break 15554 } 15555 mem := v_0.Args[0] 15556 if mem != v.Args[1] { 15557 break 15558 } 15559 v.reset(OpCopy) 15560 v.Type = mem.Type 15561 v.AddArg(mem) 15562 return true 15563 } 15564 // match: (NilCheck (Load (OffPtr [c] (SP)) mem) mem) 15565 // 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") 15566 // result: (Invalid) 15567 for { 15568 _ = v.Args[1] 15569 v_0 := v.Args[0] 15570 if v_0.Op != OpLoad { 15571 break 15572 } 15573 _ = v_0.Args[1] 15574 v_0_0 := v_0.Args[0] 15575 if v_0_0.Op != OpOffPtr { 15576 break 15577 } 15578 c := v_0_0.AuxInt 15579 v_0_0_0 := v_0_0.Args[0] 15580 if v_0_0_0.Op != OpSP { 15581 break 15582 } 15583 mem := v_0.Args[1] 15584 if mem != v.Args[1] { 15585 break 15586 } 15587 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")) { 15588 break 15589 } 15590 v.reset(OpInvalid) 15591 return true 15592 } 15593 // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) mem)) mem) 15594 // 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") 15595 // result: (Invalid) 15596 for { 15597 _ = v.Args[1] 15598 v_0 := v.Args[0] 15599 if v_0.Op != OpOffPtr { 15600 break 15601 } 15602 v_0_0 := v_0.Args[0] 15603 if v_0_0.Op != OpLoad { 15604 break 15605 } 15606 _ = v_0_0.Args[1] 15607 v_0_0_0 := v_0_0.Args[0] 15608 if v_0_0_0.Op != OpOffPtr { 15609 break 15610 } 15611 c := v_0_0_0.AuxInt 15612 v_0_0_0_0 := v_0_0_0.Args[0] 15613 if v_0_0_0_0.Op != OpSP { 15614 break 15615 } 15616 mem := v_0_0.Args[1] 15617 if mem != v.Args[1] { 15618 break 15619 } 15620 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")) { 15621 break 15622 } 15623 v.reset(OpInvalid) 15624 return true 15625 } 15626 return false 15627 } 15628 func rewriteValuegeneric_OpNot_0(v *Value) bool { 15629 // match: (Not (Eq64 x y)) 15630 // cond: 15631 // result: (Neq64 x y) 15632 for { 15633 v_0 := v.Args[0] 15634 if v_0.Op != OpEq64 { 15635 break 15636 } 15637 _ = v_0.Args[1] 15638 x := v_0.Args[0] 15639 y := v_0.Args[1] 15640 v.reset(OpNeq64) 15641 v.AddArg(x) 15642 v.AddArg(y) 15643 return true 15644 } 15645 // match: (Not (Eq32 x y)) 15646 // cond: 15647 // result: (Neq32 x y) 15648 for { 15649 v_0 := v.Args[0] 15650 if v_0.Op != OpEq32 { 15651 break 15652 } 15653 _ = v_0.Args[1] 15654 x := v_0.Args[0] 15655 y := v_0.Args[1] 15656 v.reset(OpNeq32) 15657 v.AddArg(x) 15658 v.AddArg(y) 15659 return true 15660 } 15661 // match: (Not (Eq16 x y)) 15662 // cond: 15663 // result: (Neq16 x y) 15664 for { 15665 v_0 := v.Args[0] 15666 if v_0.Op != OpEq16 { 15667 break 15668 } 15669 _ = v_0.Args[1] 15670 x := v_0.Args[0] 15671 y := v_0.Args[1] 15672 v.reset(OpNeq16) 15673 v.AddArg(x) 15674 v.AddArg(y) 15675 return true 15676 } 15677 // match: (Not (Eq8 x y)) 15678 // cond: 15679 // result: (Neq8 x y) 15680 for { 15681 v_0 := v.Args[0] 15682 if v_0.Op != OpEq8 { 15683 break 15684 } 15685 _ = v_0.Args[1] 15686 x := v_0.Args[0] 15687 y := v_0.Args[1] 15688 v.reset(OpNeq8) 15689 v.AddArg(x) 15690 v.AddArg(y) 15691 return true 15692 } 15693 // match: (Not (EqB x y)) 15694 // cond: 15695 // result: (NeqB x y) 15696 for { 15697 v_0 := v.Args[0] 15698 if v_0.Op != OpEqB { 15699 break 15700 } 15701 _ = v_0.Args[1] 15702 x := v_0.Args[0] 15703 y := v_0.Args[1] 15704 v.reset(OpNeqB) 15705 v.AddArg(x) 15706 v.AddArg(y) 15707 return true 15708 } 15709 // match: (Not (Neq64 x y)) 15710 // cond: 15711 // result: (Eq64 x y) 15712 for { 15713 v_0 := v.Args[0] 15714 if v_0.Op != OpNeq64 { 15715 break 15716 } 15717 _ = v_0.Args[1] 15718 x := v_0.Args[0] 15719 y := v_0.Args[1] 15720 v.reset(OpEq64) 15721 v.AddArg(x) 15722 v.AddArg(y) 15723 return true 15724 } 15725 // match: (Not (Neq32 x y)) 15726 // cond: 15727 // result: (Eq32 x y) 15728 for { 15729 v_0 := v.Args[0] 15730 if v_0.Op != OpNeq32 { 15731 break 15732 } 15733 _ = v_0.Args[1] 15734 x := v_0.Args[0] 15735 y := v_0.Args[1] 15736 v.reset(OpEq32) 15737 v.AddArg(x) 15738 v.AddArg(y) 15739 return true 15740 } 15741 // match: (Not (Neq16 x y)) 15742 // cond: 15743 // result: (Eq16 x y) 15744 for { 15745 v_0 := v.Args[0] 15746 if v_0.Op != OpNeq16 { 15747 break 15748 } 15749 _ = v_0.Args[1] 15750 x := v_0.Args[0] 15751 y := v_0.Args[1] 15752 v.reset(OpEq16) 15753 v.AddArg(x) 15754 v.AddArg(y) 15755 return true 15756 } 15757 // match: (Not (Neq8 x y)) 15758 // cond: 15759 // result: (Eq8 x y) 15760 for { 15761 v_0 := v.Args[0] 15762 if v_0.Op != OpNeq8 { 15763 break 15764 } 15765 _ = v_0.Args[1] 15766 x := v_0.Args[0] 15767 y := v_0.Args[1] 15768 v.reset(OpEq8) 15769 v.AddArg(x) 15770 v.AddArg(y) 15771 return true 15772 } 15773 // match: (Not (NeqB x y)) 15774 // cond: 15775 // result: (EqB x y) 15776 for { 15777 v_0 := v.Args[0] 15778 if v_0.Op != OpNeqB { 15779 break 15780 } 15781 _ = v_0.Args[1] 15782 x := v_0.Args[0] 15783 y := v_0.Args[1] 15784 v.reset(OpEqB) 15785 v.AddArg(x) 15786 v.AddArg(y) 15787 return true 15788 } 15789 return false 15790 } 15791 func rewriteValuegeneric_OpNot_10(v *Value) bool { 15792 // match: (Not (Greater64 x y)) 15793 // cond: 15794 // result: (Leq64 x y) 15795 for { 15796 v_0 := v.Args[0] 15797 if v_0.Op != OpGreater64 { 15798 break 15799 } 15800 _ = v_0.Args[1] 15801 x := v_0.Args[0] 15802 y := v_0.Args[1] 15803 v.reset(OpLeq64) 15804 v.AddArg(x) 15805 v.AddArg(y) 15806 return true 15807 } 15808 // match: (Not (Greater32 x y)) 15809 // cond: 15810 // result: (Leq32 x y) 15811 for { 15812 v_0 := v.Args[0] 15813 if v_0.Op != OpGreater32 { 15814 break 15815 } 15816 _ = v_0.Args[1] 15817 x := v_0.Args[0] 15818 y := v_0.Args[1] 15819 v.reset(OpLeq32) 15820 v.AddArg(x) 15821 v.AddArg(y) 15822 return true 15823 } 15824 // match: (Not (Greater16 x y)) 15825 // cond: 15826 // result: (Leq16 x y) 15827 for { 15828 v_0 := v.Args[0] 15829 if v_0.Op != OpGreater16 { 15830 break 15831 } 15832 _ = v_0.Args[1] 15833 x := v_0.Args[0] 15834 y := v_0.Args[1] 15835 v.reset(OpLeq16) 15836 v.AddArg(x) 15837 v.AddArg(y) 15838 return true 15839 } 15840 // match: (Not (Greater8 x y)) 15841 // cond: 15842 // result: (Leq8 x y) 15843 for { 15844 v_0 := v.Args[0] 15845 if v_0.Op != OpGreater8 { 15846 break 15847 } 15848 _ = v_0.Args[1] 15849 x := v_0.Args[0] 15850 y := v_0.Args[1] 15851 v.reset(OpLeq8) 15852 v.AddArg(x) 15853 v.AddArg(y) 15854 return true 15855 } 15856 // match: (Not (Greater64U x y)) 15857 // cond: 15858 // result: (Leq64U x y) 15859 for { 15860 v_0 := v.Args[0] 15861 if v_0.Op != OpGreater64U { 15862 break 15863 } 15864 _ = v_0.Args[1] 15865 x := v_0.Args[0] 15866 y := v_0.Args[1] 15867 v.reset(OpLeq64U) 15868 v.AddArg(x) 15869 v.AddArg(y) 15870 return true 15871 } 15872 // match: (Not (Greater32U x y)) 15873 // cond: 15874 // result: (Leq32U x y) 15875 for { 15876 v_0 := v.Args[0] 15877 if v_0.Op != OpGreater32U { 15878 break 15879 } 15880 _ = v_0.Args[1] 15881 x := v_0.Args[0] 15882 y := v_0.Args[1] 15883 v.reset(OpLeq32U) 15884 v.AddArg(x) 15885 v.AddArg(y) 15886 return true 15887 } 15888 // match: (Not (Greater16U x y)) 15889 // cond: 15890 // result: (Leq16U x y) 15891 for { 15892 v_0 := v.Args[0] 15893 if v_0.Op != OpGreater16U { 15894 break 15895 } 15896 _ = v_0.Args[1] 15897 x := v_0.Args[0] 15898 y := v_0.Args[1] 15899 v.reset(OpLeq16U) 15900 v.AddArg(x) 15901 v.AddArg(y) 15902 return true 15903 } 15904 // match: (Not (Greater8U x y)) 15905 // cond: 15906 // result: (Leq8U x y) 15907 for { 15908 v_0 := v.Args[0] 15909 if v_0.Op != OpGreater8U { 15910 break 15911 } 15912 _ = v_0.Args[1] 15913 x := v_0.Args[0] 15914 y := v_0.Args[1] 15915 v.reset(OpLeq8U) 15916 v.AddArg(x) 15917 v.AddArg(y) 15918 return true 15919 } 15920 // match: (Not (Geq64 x y)) 15921 // cond: 15922 // result: (Less64 x y) 15923 for { 15924 v_0 := v.Args[0] 15925 if v_0.Op != OpGeq64 { 15926 break 15927 } 15928 _ = v_0.Args[1] 15929 x := v_0.Args[0] 15930 y := v_0.Args[1] 15931 v.reset(OpLess64) 15932 v.AddArg(x) 15933 v.AddArg(y) 15934 return true 15935 } 15936 // match: (Not (Geq32 x y)) 15937 // cond: 15938 // result: (Less32 x y) 15939 for { 15940 v_0 := v.Args[0] 15941 if v_0.Op != OpGeq32 { 15942 break 15943 } 15944 _ = v_0.Args[1] 15945 x := v_0.Args[0] 15946 y := v_0.Args[1] 15947 v.reset(OpLess32) 15948 v.AddArg(x) 15949 v.AddArg(y) 15950 return true 15951 } 15952 return false 15953 } 15954 func rewriteValuegeneric_OpNot_20(v *Value) bool { 15955 // match: (Not (Geq16 x y)) 15956 // cond: 15957 // result: (Less16 x y) 15958 for { 15959 v_0 := v.Args[0] 15960 if v_0.Op != OpGeq16 { 15961 break 15962 } 15963 _ = v_0.Args[1] 15964 x := v_0.Args[0] 15965 y := v_0.Args[1] 15966 v.reset(OpLess16) 15967 v.AddArg(x) 15968 v.AddArg(y) 15969 return true 15970 } 15971 // match: (Not (Geq8 x y)) 15972 // cond: 15973 // result: (Less8 x y) 15974 for { 15975 v_0 := v.Args[0] 15976 if v_0.Op != OpGeq8 { 15977 break 15978 } 15979 _ = v_0.Args[1] 15980 x := v_0.Args[0] 15981 y := v_0.Args[1] 15982 v.reset(OpLess8) 15983 v.AddArg(x) 15984 v.AddArg(y) 15985 return true 15986 } 15987 // match: (Not (Geq64U x y)) 15988 // cond: 15989 // result: (Less64U x y) 15990 for { 15991 v_0 := v.Args[0] 15992 if v_0.Op != OpGeq64U { 15993 break 15994 } 15995 _ = v_0.Args[1] 15996 x := v_0.Args[0] 15997 y := v_0.Args[1] 15998 v.reset(OpLess64U) 15999 v.AddArg(x) 16000 v.AddArg(y) 16001 return true 16002 } 16003 // match: (Not (Geq32U x y)) 16004 // cond: 16005 // result: (Less32U x y) 16006 for { 16007 v_0 := v.Args[0] 16008 if v_0.Op != OpGeq32U { 16009 break 16010 } 16011 _ = v_0.Args[1] 16012 x := v_0.Args[0] 16013 y := v_0.Args[1] 16014 v.reset(OpLess32U) 16015 v.AddArg(x) 16016 v.AddArg(y) 16017 return true 16018 } 16019 // match: (Not (Geq16U x y)) 16020 // cond: 16021 // result: (Less16U x y) 16022 for { 16023 v_0 := v.Args[0] 16024 if v_0.Op != OpGeq16U { 16025 break 16026 } 16027 _ = v_0.Args[1] 16028 x := v_0.Args[0] 16029 y := v_0.Args[1] 16030 v.reset(OpLess16U) 16031 v.AddArg(x) 16032 v.AddArg(y) 16033 return true 16034 } 16035 // match: (Not (Geq8U x y)) 16036 // cond: 16037 // result: (Less8U x y) 16038 for { 16039 v_0 := v.Args[0] 16040 if v_0.Op != OpGeq8U { 16041 break 16042 } 16043 _ = v_0.Args[1] 16044 x := v_0.Args[0] 16045 y := v_0.Args[1] 16046 v.reset(OpLess8U) 16047 v.AddArg(x) 16048 v.AddArg(y) 16049 return true 16050 } 16051 // match: (Not (Less64 x y)) 16052 // cond: 16053 // result: (Geq64 x y) 16054 for { 16055 v_0 := v.Args[0] 16056 if v_0.Op != OpLess64 { 16057 break 16058 } 16059 _ = v_0.Args[1] 16060 x := v_0.Args[0] 16061 y := v_0.Args[1] 16062 v.reset(OpGeq64) 16063 v.AddArg(x) 16064 v.AddArg(y) 16065 return true 16066 } 16067 // match: (Not (Less32 x y)) 16068 // cond: 16069 // result: (Geq32 x y) 16070 for { 16071 v_0 := v.Args[0] 16072 if v_0.Op != OpLess32 { 16073 break 16074 } 16075 _ = v_0.Args[1] 16076 x := v_0.Args[0] 16077 y := v_0.Args[1] 16078 v.reset(OpGeq32) 16079 v.AddArg(x) 16080 v.AddArg(y) 16081 return true 16082 } 16083 // match: (Not (Less16 x y)) 16084 // cond: 16085 // result: (Geq16 x y) 16086 for { 16087 v_0 := v.Args[0] 16088 if v_0.Op != OpLess16 { 16089 break 16090 } 16091 _ = v_0.Args[1] 16092 x := v_0.Args[0] 16093 y := v_0.Args[1] 16094 v.reset(OpGeq16) 16095 v.AddArg(x) 16096 v.AddArg(y) 16097 return true 16098 } 16099 // match: (Not (Less8 x y)) 16100 // cond: 16101 // result: (Geq8 x y) 16102 for { 16103 v_0 := v.Args[0] 16104 if v_0.Op != OpLess8 { 16105 break 16106 } 16107 _ = v_0.Args[1] 16108 x := v_0.Args[0] 16109 y := v_0.Args[1] 16110 v.reset(OpGeq8) 16111 v.AddArg(x) 16112 v.AddArg(y) 16113 return true 16114 } 16115 return false 16116 } 16117 func rewriteValuegeneric_OpNot_30(v *Value) bool { 16118 // match: (Not (Less64U x y)) 16119 // cond: 16120 // result: (Geq64U x y) 16121 for { 16122 v_0 := v.Args[0] 16123 if v_0.Op != OpLess64U { 16124 break 16125 } 16126 _ = v_0.Args[1] 16127 x := v_0.Args[0] 16128 y := v_0.Args[1] 16129 v.reset(OpGeq64U) 16130 v.AddArg(x) 16131 v.AddArg(y) 16132 return true 16133 } 16134 // match: (Not (Less32U x y)) 16135 // cond: 16136 // result: (Geq32U x y) 16137 for { 16138 v_0 := v.Args[0] 16139 if v_0.Op != OpLess32U { 16140 break 16141 } 16142 _ = v_0.Args[1] 16143 x := v_0.Args[0] 16144 y := v_0.Args[1] 16145 v.reset(OpGeq32U) 16146 v.AddArg(x) 16147 v.AddArg(y) 16148 return true 16149 } 16150 // match: (Not (Less16U x y)) 16151 // cond: 16152 // result: (Geq16U x y) 16153 for { 16154 v_0 := v.Args[0] 16155 if v_0.Op != OpLess16U { 16156 break 16157 } 16158 _ = v_0.Args[1] 16159 x := v_0.Args[0] 16160 y := v_0.Args[1] 16161 v.reset(OpGeq16U) 16162 v.AddArg(x) 16163 v.AddArg(y) 16164 return true 16165 } 16166 // match: (Not (Less8U x y)) 16167 // cond: 16168 // result: (Geq8U x y) 16169 for { 16170 v_0 := v.Args[0] 16171 if v_0.Op != OpLess8U { 16172 break 16173 } 16174 _ = v_0.Args[1] 16175 x := v_0.Args[0] 16176 y := v_0.Args[1] 16177 v.reset(OpGeq8U) 16178 v.AddArg(x) 16179 v.AddArg(y) 16180 return true 16181 } 16182 // match: (Not (Leq64 x y)) 16183 // cond: 16184 // result: (Greater64 x y) 16185 for { 16186 v_0 := v.Args[0] 16187 if v_0.Op != OpLeq64 { 16188 break 16189 } 16190 _ = v_0.Args[1] 16191 x := v_0.Args[0] 16192 y := v_0.Args[1] 16193 v.reset(OpGreater64) 16194 v.AddArg(x) 16195 v.AddArg(y) 16196 return true 16197 } 16198 // match: (Not (Leq32 x y)) 16199 // cond: 16200 // result: (Greater32 x y) 16201 for { 16202 v_0 := v.Args[0] 16203 if v_0.Op != OpLeq32 { 16204 break 16205 } 16206 _ = v_0.Args[1] 16207 x := v_0.Args[0] 16208 y := v_0.Args[1] 16209 v.reset(OpGreater32) 16210 v.AddArg(x) 16211 v.AddArg(y) 16212 return true 16213 } 16214 // match: (Not (Leq16 x y)) 16215 // cond: 16216 // result: (Greater16 x y) 16217 for { 16218 v_0 := v.Args[0] 16219 if v_0.Op != OpLeq16 { 16220 break 16221 } 16222 _ = v_0.Args[1] 16223 x := v_0.Args[0] 16224 y := v_0.Args[1] 16225 v.reset(OpGreater16) 16226 v.AddArg(x) 16227 v.AddArg(y) 16228 return true 16229 } 16230 // match: (Not (Leq8 x y)) 16231 // cond: 16232 // result: (Greater8 x y) 16233 for { 16234 v_0 := v.Args[0] 16235 if v_0.Op != OpLeq8 { 16236 break 16237 } 16238 _ = v_0.Args[1] 16239 x := v_0.Args[0] 16240 y := v_0.Args[1] 16241 v.reset(OpGreater8) 16242 v.AddArg(x) 16243 v.AddArg(y) 16244 return true 16245 } 16246 // match: (Not (Leq64U x y)) 16247 // cond: 16248 // result: (Greater64U x y) 16249 for { 16250 v_0 := v.Args[0] 16251 if v_0.Op != OpLeq64U { 16252 break 16253 } 16254 _ = v_0.Args[1] 16255 x := v_0.Args[0] 16256 y := v_0.Args[1] 16257 v.reset(OpGreater64U) 16258 v.AddArg(x) 16259 v.AddArg(y) 16260 return true 16261 } 16262 // match: (Not (Leq32U x y)) 16263 // cond: 16264 // result: (Greater32U x y) 16265 for { 16266 v_0 := v.Args[0] 16267 if v_0.Op != OpLeq32U { 16268 break 16269 } 16270 _ = v_0.Args[1] 16271 x := v_0.Args[0] 16272 y := v_0.Args[1] 16273 v.reset(OpGreater32U) 16274 v.AddArg(x) 16275 v.AddArg(y) 16276 return true 16277 } 16278 return false 16279 } 16280 func rewriteValuegeneric_OpNot_40(v *Value) bool { 16281 // match: (Not (Leq16U x y)) 16282 // cond: 16283 // result: (Greater16U x y) 16284 for { 16285 v_0 := v.Args[0] 16286 if v_0.Op != OpLeq16U { 16287 break 16288 } 16289 _ = v_0.Args[1] 16290 x := v_0.Args[0] 16291 y := v_0.Args[1] 16292 v.reset(OpGreater16U) 16293 v.AddArg(x) 16294 v.AddArg(y) 16295 return true 16296 } 16297 // match: (Not (Leq8U x y)) 16298 // cond: 16299 // result: (Greater8U x y) 16300 for { 16301 v_0 := v.Args[0] 16302 if v_0.Op != OpLeq8U { 16303 break 16304 } 16305 _ = v_0.Args[1] 16306 x := v_0.Args[0] 16307 y := v_0.Args[1] 16308 v.reset(OpGreater8U) 16309 v.AddArg(x) 16310 v.AddArg(y) 16311 return true 16312 } 16313 return false 16314 } 16315 func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { 16316 // match: (OffPtr (OffPtr p [b]) [a]) 16317 // cond: 16318 // result: (OffPtr p [a+b]) 16319 for { 16320 a := v.AuxInt 16321 v_0 := v.Args[0] 16322 if v_0.Op != OpOffPtr { 16323 break 16324 } 16325 b := v_0.AuxInt 16326 p := v_0.Args[0] 16327 v.reset(OpOffPtr) 16328 v.AuxInt = a + b 16329 v.AddArg(p) 16330 return true 16331 } 16332 // match: (OffPtr p [0]) 16333 // cond: v.Type.Compare(p.Type) == types.CMPeq 16334 // result: p 16335 for { 16336 if v.AuxInt != 0 { 16337 break 16338 } 16339 p := v.Args[0] 16340 if !(v.Type.Compare(p.Type) == types.CMPeq) { 16341 break 16342 } 16343 v.reset(OpCopy) 16344 v.Type = p.Type 16345 v.AddArg(p) 16346 return true 16347 } 16348 return false 16349 } 16350 func rewriteValuegeneric_OpOr16_0(v *Value) bool { 16351 // match: (Or16 (Const16 [c]) (Const16 [d])) 16352 // cond: 16353 // result: (Const16 [int64(int16(c|d))]) 16354 for { 16355 _ = v.Args[1] 16356 v_0 := v.Args[0] 16357 if v_0.Op != OpConst16 { 16358 break 16359 } 16360 c := v_0.AuxInt 16361 v_1 := v.Args[1] 16362 if v_1.Op != OpConst16 { 16363 break 16364 } 16365 d := v_1.AuxInt 16366 v.reset(OpConst16) 16367 v.AuxInt = int64(int16(c | d)) 16368 return true 16369 } 16370 // match: (Or16 (Const16 [d]) (Const16 [c])) 16371 // cond: 16372 // result: (Const16 [int64(int16(c|d))]) 16373 for { 16374 _ = v.Args[1] 16375 v_0 := v.Args[0] 16376 if v_0.Op != OpConst16 { 16377 break 16378 } 16379 d := v_0.AuxInt 16380 v_1 := v.Args[1] 16381 if v_1.Op != OpConst16 { 16382 break 16383 } 16384 c := v_1.AuxInt 16385 v.reset(OpConst16) 16386 v.AuxInt = int64(int16(c | d)) 16387 return true 16388 } 16389 // match: (Or16 x x) 16390 // cond: 16391 // result: x 16392 for { 16393 _ = v.Args[1] 16394 x := v.Args[0] 16395 if x != v.Args[1] { 16396 break 16397 } 16398 v.reset(OpCopy) 16399 v.Type = x.Type 16400 v.AddArg(x) 16401 return true 16402 } 16403 // match: (Or16 (Const16 [0]) x) 16404 // cond: 16405 // result: x 16406 for { 16407 _ = v.Args[1] 16408 v_0 := v.Args[0] 16409 if v_0.Op != OpConst16 { 16410 break 16411 } 16412 if v_0.AuxInt != 0 { 16413 break 16414 } 16415 x := v.Args[1] 16416 v.reset(OpCopy) 16417 v.Type = x.Type 16418 v.AddArg(x) 16419 return true 16420 } 16421 // match: (Or16 x (Const16 [0])) 16422 // cond: 16423 // result: x 16424 for { 16425 _ = v.Args[1] 16426 x := v.Args[0] 16427 v_1 := v.Args[1] 16428 if v_1.Op != OpConst16 { 16429 break 16430 } 16431 if v_1.AuxInt != 0 { 16432 break 16433 } 16434 v.reset(OpCopy) 16435 v.Type = x.Type 16436 v.AddArg(x) 16437 return true 16438 } 16439 // match: (Or16 (Const16 [-1]) _) 16440 // cond: 16441 // result: (Const16 [-1]) 16442 for { 16443 _ = v.Args[1] 16444 v_0 := v.Args[0] 16445 if v_0.Op != OpConst16 { 16446 break 16447 } 16448 if v_0.AuxInt != -1 { 16449 break 16450 } 16451 v.reset(OpConst16) 16452 v.AuxInt = -1 16453 return true 16454 } 16455 // match: (Or16 _ (Const16 [-1])) 16456 // cond: 16457 // result: (Const16 [-1]) 16458 for { 16459 _ = v.Args[1] 16460 v_1 := v.Args[1] 16461 if v_1.Op != OpConst16 { 16462 break 16463 } 16464 if v_1.AuxInt != -1 { 16465 break 16466 } 16467 v.reset(OpConst16) 16468 v.AuxInt = -1 16469 return true 16470 } 16471 // match: (Or16 x (Or16 x y)) 16472 // cond: 16473 // result: (Or16 x y) 16474 for { 16475 _ = v.Args[1] 16476 x := v.Args[0] 16477 v_1 := v.Args[1] 16478 if v_1.Op != OpOr16 { 16479 break 16480 } 16481 _ = v_1.Args[1] 16482 if x != v_1.Args[0] { 16483 break 16484 } 16485 y := v_1.Args[1] 16486 v.reset(OpOr16) 16487 v.AddArg(x) 16488 v.AddArg(y) 16489 return true 16490 } 16491 // match: (Or16 x (Or16 y x)) 16492 // cond: 16493 // result: (Or16 x y) 16494 for { 16495 _ = v.Args[1] 16496 x := v.Args[0] 16497 v_1 := v.Args[1] 16498 if v_1.Op != OpOr16 { 16499 break 16500 } 16501 _ = v_1.Args[1] 16502 y := v_1.Args[0] 16503 if x != v_1.Args[1] { 16504 break 16505 } 16506 v.reset(OpOr16) 16507 v.AddArg(x) 16508 v.AddArg(y) 16509 return true 16510 } 16511 // match: (Or16 (Or16 x y) x) 16512 // cond: 16513 // result: (Or16 x y) 16514 for { 16515 _ = v.Args[1] 16516 v_0 := v.Args[0] 16517 if v_0.Op != OpOr16 { 16518 break 16519 } 16520 _ = v_0.Args[1] 16521 x := v_0.Args[0] 16522 y := v_0.Args[1] 16523 if x != v.Args[1] { 16524 break 16525 } 16526 v.reset(OpOr16) 16527 v.AddArg(x) 16528 v.AddArg(y) 16529 return true 16530 } 16531 return false 16532 } 16533 func rewriteValuegeneric_OpOr16_10(v *Value) bool { 16534 b := v.Block 16535 _ = b 16536 // match: (Or16 (Or16 y x) x) 16537 // cond: 16538 // result: (Or16 x y) 16539 for { 16540 _ = v.Args[1] 16541 v_0 := v.Args[0] 16542 if v_0.Op != OpOr16 { 16543 break 16544 } 16545 _ = v_0.Args[1] 16546 y := v_0.Args[0] 16547 x := v_0.Args[1] 16548 if x != v.Args[1] { 16549 break 16550 } 16551 v.reset(OpOr16) 16552 v.AddArg(x) 16553 v.AddArg(y) 16554 return true 16555 } 16556 // match: (Or16 (And16 x (Const16 [c2])) (Const16 <t> [c1])) 16557 // cond: ^(c1 | c2) == 0 16558 // result: (Or16 (Const16 <t> [c1]) x) 16559 for { 16560 _ = v.Args[1] 16561 v_0 := v.Args[0] 16562 if v_0.Op != OpAnd16 { 16563 break 16564 } 16565 _ = v_0.Args[1] 16566 x := v_0.Args[0] 16567 v_0_1 := v_0.Args[1] 16568 if v_0_1.Op != OpConst16 { 16569 break 16570 } 16571 c2 := v_0_1.AuxInt 16572 v_1 := v.Args[1] 16573 if v_1.Op != OpConst16 { 16574 break 16575 } 16576 t := v_1.Type 16577 c1 := v_1.AuxInt 16578 if !(^(c1 | c2) == 0) { 16579 break 16580 } 16581 v.reset(OpOr16) 16582 v0 := b.NewValue0(v.Pos, OpConst16, t) 16583 v0.AuxInt = c1 16584 v.AddArg(v0) 16585 v.AddArg(x) 16586 return true 16587 } 16588 // match: (Or16 (And16 (Const16 [c2]) x) (Const16 <t> [c1])) 16589 // cond: ^(c1 | c2) == 0 16590 // result: (Or16 (Const16 <t> [c1]) x) 16591 for { 16592 _ = v.Args[1] 16593 v_0 := v.Args[0] 16594 if v_0.Op != OpAnd16 { 16595 break 16596 } 16597 _ = v_0.Args[1] 16598 v_0_0 := v_0.Args[0] 16599 if v_0_0.Op != OpConst16 { 16600 break 16601 } 16602 c2 := v_0_0.AuxInt 16603 x := v_0.Args[1] 16604 v_1 := v.Args[1] 16605 if v_1.Op != OpConst16 { 16606 break 16607 } 16608 t := v_1.Type 16609 c1 := v_1.AuxInt 16610 if !(^(c1 | c2) == 0) { 16611 break 16612 } 16613 v.reset(OpOr16) 16614 v0 := b.NewValue0(v.Pos, OpConst16, t) 16615 v0.AuxInt = c1 16616 v.AddArg(v0) 16617 v.AddArg(x) 16618 return true 16619 } 16620 // match: (Or16 (Const16 <t> [c1]) (And16 x (Const16 [c2]))) 16621 // cond: ^(c1 | c2) == 0 16622 // result: (Or16 (Const16 <t> [c1]) x) 16623 for { 16624 _ = v.Args[1] 16625 v_0 := v.Args[0] 16626 if v_0.Op != OpConst16 { 16627 break 16628 } 16629 t := v_0.Type 16630 c1 := v_0.AuxInt 16631 v_1 := v.Args[1] 16632 if v_1.Op != OpAnd16 { 16633 break 16634 } 16635 _ = v_1.Args[1] 16636 x := v_1.Args[0] 16637 v_1_1 := v_1.Args[1] 16638 if v_1_1.Op != OpConst16 { 16639 break 16640 } 16641 c2 := v_1_1.AuxInt 16642 if !(^(c1 | c2) == 0) { 16643 break 16644 } 16645 v.reset(OpOr16) 16646 v0 := b.NewValue0(v.Pos, OpConst16, t) 16647 v0.AuxInt = c1 16648 v.AddArg(v0) 16649 v.AddArg(x) 16650 return true 16651 } 16652 // match: (Or16 (Const16 <t> [c1]) (And16 (Const16 [c2]) x)) 16653 // cond: ^(c1 | c2) == 0 16654 // result: (Or16 (Const16 <t> [c1]) x) 16655 for { 16656 _ = v.Args[1] 16657 v_0 := v.Args[0] 16658 if v_0.Op != OpConst16 { 16659 break 16660 } 16661 t := v_0.Type 16662 c1 := v_0.AuxInt 16663 v_1 := v.Args[1] 16664 if v_1.Op != OpAnd16 { 16665 break 16666 } 16667 _ = v_1.Args[1] 16668 v_1_0 := v_1.Args[0] 16669 if v_1_0.Op != OpConst16 { 16670 break 16671 } 16672 c2 := v_1_0.AuxInt 16673 x := v_1.Args[1] 16674 if !(^(c1 | c2) == 0) { 16675 break 16676 } 16677 v.reset(OpOr16) 16678 v0 := b.NewValue0(v.Pos, OpConst16, t) 16679 v0.AuxInt = c1 16680 v.AddArg(v0) 16681 v.AddArg(x) 16682 return true 16683 } 16684 // match: (Or16 (Or16 i:(Const16 <t>) z) x) 16685 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 16686 // result: (Or16 i (Or16 <t> z x)) 16687 for { 16688 _ = v.Args[1] 16689 v_0 := v.Args[0] 16690 if v_0.Op != OpOr16 { 16691 break 16692 } 16693 _ = v_0.Args[1] 16694 i := v_0.Args[0] 16695 if i.Op != OpConst16 { 16696 break 16697 } 16698 t := i.Type 16699 z := v_0.Args[1] 16700 x := v.Args[1] 16701 if !(z.Op != OpConst16 && x.Op != OpConst16) { 16702 break 16703 } 16704 v.reset(OpOr16) 16705 v.AddArg(i) 16706 v0 := b.NewValue0(v.Pos, OpOr16, t) 16707 v0.AddArg(z) 16708 v0.AddArg(x) 16709 v.AddArg(v0) 16710 return true 16711 } 16712 // match: (Or16 (Or16 z i:(Const16 <t>)) x) 16713 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 16714 // result: (Or16 i (Or16 <t> z x)) 16715 for { 16716 _ = v.Args[1] 16717 v_0 := v.Args[0] 16718 if v_0.Op != OpOr16 { 16719 break 16720 } 16721 _ = v_0.Args[1] 16722 z := v_0.Args[0] 16723 i := v_0.Args[1] 16724 if i.Op != OpConst16 { 16725 break 16726 } 16727 t := i.Type 16728 x := v.Args[1] 16729 if !(z.Op != OpConst16 && x.Op != OpConst16) { 16730 break 16731 } 16732 v.reset(OpOr16) 16733 v.AddArg(i) 16734 v0 := b.NewValue0(v.Pos, OpOr16, t) 16735 v0.AddArg(z) 16736 v0.AddArg(x) 16737 v.AddArg(v0) 16738 return true 16739 } 16740 // match: (Or16 x (Or16 i:(Const16 <t>) z)) 16741 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 16742 // result: (Or16 i (Or16 <t> z x)) 16743 for { 16744 _ = v.Args[1] 16745 x := v.Args[0] 16746 v_1 := v.Args[1] 16747 if v_1.Op != OpOr16 { 16748 break 16749 } 16750 _ = v_1.Args[1] 16751 i := v_1.Args[0] 16752 if i.Op != OpConst16 { 16753 break 16754 } 16755 t := i.Type 16756 z := v_1.Args[1] 16757 if !(z.Op != OpConst16 && x.Op != OpConst16) { 16758 break 16759 } 16760 v.reset(OpOr16) 16761 v.AddArg(i) 16762 v0 := b.NewValue0(v.Pos, OpOr16, t) 16763 v0.AddArg(z) 16764 v0.AddArg(x) 16765 v.AddArg(v0) 16766 return true 16767 } 16768 // match: (Or16 x (Or16 z i:(Const16 <t>))) 16769 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 16770 // result: (Or16 i (Or16 <t> z x)) 16771 for { 16772 _ = v.Args[1] 16773 x := v.Args[0] 16774 v_1 := v.Args[1] 16775 if v_1.Op != OpOr16 { 16776 break 16777 } 16778 _ = v_1.Args[1] 16779 z := v_1.Args[0] 16780 i := v_1.Args[1] 16781 if i.Op != OpConst16 { 16782 break 16783 } 16784 t := i.Type 16785 if !(z.Op != OpConst16 && x.Op != OpConst16) { 16786 break 16787 } 16788 v.reset(OpOr16) 16789 v.AddArg(i) 16790 v0 := b.NewValue0(v.Pos, OpOr16, t) 16791 v0.AddArg(z) 16792 v0.AddArg(x) 16793 v.AddArg(v0) 16794 return true 16795 } 16796 // match: (Or16 (Const16 <t> [c]) (Or16 (Const16 <t> [d]) x)) 16797 // cond: 16798 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 16799 for { 16800 _ = v.Args[1] 16801 v_0 := v.Args[0] 16802 if v_0.Op != OpConst16 { 16803 break 16804 } 16805 t := v_0.Type 16806 c := v_0.AuxInt 16807 v_1 := v.Args[1] 16808 if v_1.Op != OpOr16 { 16809 break 16810 } 16811 _ = v_1.Args[1] 16812 v_1_0 := v_1.Args[0] 16813 if v_1_0.Op != OpConst16 { 16814 break 16815 } 16816 if v_1_0.Type != t { 16817 break 16818 } 16819 d := v_1_0.AuxInt 16820 x := v_1.Args[1] 16821 v.reset(OpOr16) 16822 v0 := b.NewValue0(v.Pos, OpConst16, t) 16823 v0.AuxInt = int64(int16(c | d)) 16824 v.AddArg(v0) 16825 v.AddArg(x) 16826 return true 16827 } 16828 return false 16829 } 16830 func rewriteValuegeneric_OpOr16_20(v *Value) bool { 16831 b := v.Block 16832 _ = b 16833 // match: (Or16 (Const16 <t> [c]) (Or16 x (Const16 <t> [d]))) 16834 // cond: 16835 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 16836 for { 16837 _ = v.Args[1] 16838 v_0 := v.Args[0] 16839 if v_0.Op != OpConst16 { 16840 break 16841 } 16842 t := v_0.Type 16843 c := v_0.AuxInt 16844 v_1 := v.Args[1] 16845 if v_1.Op != OpOr16 { 16846 break 16847 } 16848 _ = v_1.Args[1] 16849 x := v_1.Args[0] 16850 v_1_1 := v_1.Args[1] 16851 if v_1_1.Op != OpConst16 { 16852 break 16853 } 16854 if v_1_1.Type != t { 16855 break 16856 } 16857 d := v_1_1.AuxInt 16858 v.reset(OpOr16) 16859 v0 := b.NewValue0(v.Pos, OpConst16, t) 16860 v0.AuxInt = int64(int16(c | d)) 16861 v.AddArg(v0) 16862 v.AddArg(x) 16863 return true 16864 } 16865 // match: (Or16 (Or16 (Const16 <t> [d]) x) (Const16 <t> [c])) 16866 // cond: 16867 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 16868 for { 16869 _ = v.Args[1] 16870 v_0 := v.Args[0] 16871 if v_0.Op != OpOr16 { 16872 break 16873 } 16874 _ = v_0.Args[1] 16875 v_0_0 := v_0.Args[0] 16876 if v_0_0.Op != OpConst16 { 16877 break 16878 } 16879 t := v_0_0.Type 16880 d := v_0_0.AuxInt 16881 x := v_0.Args[1] 16882 v_1 := v.Args[1] 16883 if v_1.Op != OpConst16 { 16884 break 16885 } 16886 if v_1.Type != t { 16887 break 16888 } 16889 c := v_1.AuxInt 16890 v.reset(OpOr16) 16891 v0 := b.NewValue0(v.Pos, OpConst16, t) 16892 v0.AuxInt = int64(int16(c | d)) 16893 v.AddArg(v0) 16894 v.AddArg(x) 16895 return true 16896 } 16897 // match: (Or16 (Or16 x (Const16 <t> [d])) (Const16 <t> [c])) 16898 // cond: 16899 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 16900 for { 16901 _ = v.Args[1] 16902 v_0 := v.Args[0] 16903 if v_0.Op != OpOr16 { 16904 break 16905 } 16906 _ = v_0.Args[1] 16907 x := v_0.Args[0] 16908 v_0_1 := v_0.Args[1] 16909 if v_0_1.Op != OpConst16 { 16910 break 16911 } 16912 t := v_0_1.Type 16913 d := v_0_1.AuxInt 16914 v_1 := v.Args[1] 16915 if v_1.Op != OpConst16 { 16916 break 16917 } 16918 if v_1.Type != t { 16919 break 16920 } 16921 c := v_1.AuxInt 16922 v.reset(OpOr16) 16923 v0 := b.NewValue0(v.Pos, OpConst16, t) 16924 v0.AuxInt = int64(int16(c | d)) 16925 v.AddArg(v0) 16926 v.AddArg(x) 16927 return true 16928 } 16929 return false 16930 } 16931 func rewriteValuegeneric_OpOr32_0(v *Value) bool { 16932 // match: (Or32 (Const32 [c]) (Const32 [d])) 16933 // cond: 16934 // result: (Const32 [int64(int32(c|d))]) 16935 for { 16936 _ = v.Args[1] 16937 v_0 := v.Args[0] 16938 if v_0.Op != OpConst32 { 16939 break 16940 } 16941 c := v_0.AuxInt 16942 v_1 := v.Args[1] 16943 if v_1.Op != OpConst32 { 16944 break 16945 } 16946 d := v_1.AuxInt 16947 v.reset(OpConst32) 16948 v.AuxInt = int64(int32(c | d)) 16949 return true 16950 } 16951 // match: (Or32 (Const32 [d]) (Const32 [c])) 16952 // cond: 16953 // result: (Const32 [int64(int32(c|d))]) 16954 for { 16955 _ = v.Args[1] 16956 v_0 := v.Args[0] 16957 if v_0.Op != OpConst32 { 16958 break 16959 } 16960 d := v_0.AuxInt 16961 v_1 := v.Args[1] 16962 if v_1.Op != OpConst32 { 16963 break 16964 } 16965 c := v_1.AuxInt 16966 v.reset(OpConst32) 16967 v.AuxInt = int64(int32(c | d)) 16968 return true 16969 } 16970 // match: (Or32 x x) 16971 // cond: 16972 // result: x 16973 for { 16974 _ = v.Args[1] 16975 x := v.Args[0] 16976 if x != v.Args[1] { 16977 break 16978 } 16979 v.reset(OpCopy) 16980 v.Type = x.Type 16981 v.AddArg(x) 16982 return true 16983 } 16984 // match: (Or32 (Const32 [0]) x) 16985 // cond: 16986 // result: x 16987 for { 16988 _ = v.Args[1] 16989 v_0 := v.Args[0] 16990 if v_0.Op != OpConst32 { 16991 break 16992 } 16993 if v_0.AuxInt != 0 { 16994 break 16995 } 16996 x := v.Args[1] 16997 v.reset(OpCopy) 16998 v.Type = x.Type 16999 v.AddArg(x) 17000 return true 17001 } 17002 // match: (Or32 x (Const32 [0])) 17003 // cond: 17004 // result: x 17005 for { 17006 _ = v.Args[1] 17007 x := v.Args[0] 17008 v_1 := v.Args[1] 17009 if v_1.Op != OpConst32 { 17010 break 17011 } 17012 if v_1.AuxInt != 0 { 17013 break 17014 } 17015 v.reset(OpCopy) 17016 v.Type = x.Type 17017 v.AddArg(x) 17018 return true 17019 } 17020 // match: (Or32 (Const32 [-1]) _) 17021 // cond: 17022 // result: (Const32 [-1]) 17023 for { 17024 _ = v.Args[1] 17025 v_0 := v.Args[0] 17026 if v_0.Op != OpConst32 { 17027 break 17028 } 17029 if v_0.AuxInt != -1 { 17030 break 17031 } 17032 v.reset(OpConst32) 17033 v.AuxInt = -1 17034 return true 17035 } 17036 // match: (Or32 _ (Const32 [-1])) 17037 // cond: 17038 // result: (Const32 [-1]) 17039 for { 17040 _ = v.Args[1] 17041 v_1 := v.Args[1] 17042 if v_1.Op != OpConst32 { 17043 break 17044 } 17045 if v_1.AuxInt != -1 { 17046 break 17047 } 17048 v.reset(OpConst32) 17049 v.AuxInt = -1 17050 return true 17051 } 17052 // match: (Or32 x (Or32 x y)) 17053 // cond: 17054 // result: (Or32 x y) 17055 for { 17056 _ = v.Args[1] 17057 x := v.Args[0] 17058 v_1 := v.Args[1] 17059 if v_1.Op != OpOr32 { 17060 break 17061 } 17062 _ = v_1.Args[1] 17063 if x != v_1.Args[0] { 17064 break 17065 } 17066 y := v_1.Args[1] 17067 v.reset(OpOr32) 17068 v.AddArg(x) 17069 v.AddArg(y) 17070 return true 17071 } 17072 // match: (Or32 x (Or32 y x)) 17073 // cond: 17074 // result: (Or32 x y) 17075 for { 17076 _ = v.Args[1] 17077 x := v.Args[0] 17078 v_1 := v.Args[1] 17079 if v_1.Op != OpOr32 { 17080 break 17081 } 17082 _ = v_1.Args[1] 17083 y := v_1.Args[0] 17084 if x != v_1.Args[1] { 17085 break 17086 } 17087 v.reset(OpOr32) 17088 v.AddArg(x) 17089 v.AddArg(y) 17090 return true 17091 } 17092 // match: (Or32 (Or32 x y) x) 17093 // cond: 17094 // result: (Or32 x y) 17095 for { 17096 _ = v.Args[1] 17097 v_0 := v.Args[0] 17098 if v_0.Op != OpOr32 { 17099 break 17100 } 17101 _ = v_0.Args[1] 17102 x := v_0.Args[0] 17103 y := v_0.Args[1] 17104 if x != v.Args[1] { 17105 break 17106 } 17107 v.reset(OpOr32) 17108 v.AddArg(x) 17109 v.AddArg(y) 17110 return true 17111 } 17112 return false 17113 } 17114 func rewriteValuegeneric_OpOr32_10(v *Value) bool { 17115 b := v.Block 17116 _ = b 17117 // match: (Or32 (Or32 y x) x) 17118 // cond: 17119 // result: (Or32 x y) 17120 for { 17121 _ = v.Args[1] 17122 v_0 := v.Args[0] 17123 if v_0.Op != OpOr32 { 17124 break 17125 } 17126 _ = v_0.Args[1] 17127 y := v_0.Args[0] 17128 x := v_0.Args[1] 17129 if x != v.Args[1] { 17130 break 17131 } 17132 v.reset(OpOr32) 17133 v.AddArg(x) 17134 v.AddArg(y) 17135 return true 17136 } 17137 // match: (Or32 (And32 x (Const32 [c2])) (Const32 <t> [c1])) 17138 // cond: ^(c1 | c2) == 0 17139 // result: (Or32 (Const32 <t> [c1]) x) 17140 for { 17141 _ = v.Args[1] 17142 v_0 := v.Args[0] 17143 if v_0.Op != OpAnd32 { 17144 break 17145 } 17146 _ = v_0.Args[1] 17147 x := v_0.Args[0] 17148 v_0_1 := v_0.Args[1] 17149 if v_0_1.Op != OpConst32 { 17150 break 17151 } 17152 c2 := v_0_1.AuxInt 17153 v_1 := v.Args[1] 17154 if v_1.Op != OpConst32 { 17155 break 17156 } 17157 t := v_1.Type 17158 c1 := v_1.AuxInt 17159 if !(^(c1 | c2) == 0) { 17160 break 17161 } 17162 v.reset(OpOr32) 17163 v0 := b.NewValue0(v.Pos, OpConst32, t) 17164 v0.AuxInt = c1 17165 v.AddArg(v0) 17166 v.AddArg(x) 17167 return true 17168 } 17169 // match: (Or32 (And32 (Const32 [c2]) x) (Const32 <t> [c1])) 17170 // cond: ^(c1 | c2) == 0 17171 // result: (Or32 (Const32 <t> [c1]) x) 17172 for { 17173 _ = v.Args[1] 17174 v_0 := v.Args[0] 17175 if v_0.Op != OpAnd32 { 17176 break 17177 } 17178 _ = v_0.Args[1] 17179 v_0_0 := v_0.Args[0] 17180 if v_0_0.Op != OpConst32 { 17181 break 17182 } 17183 c2 := v_0_0.AuxInt 17184 x := v_0.Args[1] 17185 v_1 := v.Args[1] 17186 if v_1.Op != OpConst32 { 17187 break 17188 } 17189 t := v_1.Type 17190 c1 := v_1.AuxInt 17191 if !(^(c1 | c2) == 0) { 17192 break 17193 } 17194 v.reset(OpOr32) 17195 v0 := b.NewValue0(v.Pos, OpConst32, t) 17196 v0.AuxInt = c1 17197 v.AddArg(v0) 17198 v.AddArg(x) 17199 return true 17200 } 17201 // match: (Or32 (Const32 <t> [c1]) (And32 x (Const32 [c2]))) 17202 // cond: ^(c1 | c2) == 0 17203 // result: (Or32 (Const32 <t> [c1]) x) 17204 for { 17205 _ = v.Args[1] 17206 v_0 := v.Args[0] 17207 if v_0.Op != OpConst32 { 17208 break 17209 } 17210 t := v_0.Type 17211 c1 := v_0.AuxInt 17212 v_1 := v.Args[1] 17213 if v_1.Op != OpAnd32 { 17214 break 17215 } 17216 _ = v_1.Args[1] 17217 x := v_1.Args[0] 17218 v_1_1 := v_1.Args[1] 17219 if v_1_1.Op != OpConst32 { 17220 break 17221 } 17222 c2 := v_1_1.AuxInt 17223 if !(^(c1 | c2) == 0) { 17224 break 17225 } 17226 v.reset(OpOr32) 17227 v0 := b.NewValue0(v.Pos, OpConst32, t) 17228 v0.AuxInt = c1 17229 v.AddArg(v0) 17230 v.AddArg(x) 17231 return true 17232 } 17233 // match: (Or32 (Const32 <t> [c1]) (And32 (Const32 [c2]) x)) 17234 // cond: ^(c1 | c2) == 0 17235 // result: (Or32 (Const32 <t> [c1]) x) 17236 for { 17237 _ = v.Args[1] 17238 v_0 := v.Args[0] 17239 if v_0.Op != OpConst32 { 17240 break 17241 } 17242 t := v_0.Type 17243 c1 := v_0.AuxInt 17244 v_1 := v.Args[1] 17245 if v_1.Op != OpAnd32 { 17246 break 17247 } 17248 _ = v_1.Args[1] 17249 v_1_0 := v_1.Args[0] 17250 if v_1_0.Op != OpConst32 { 17251 break 17252 } 17253 c2 := v_1_0.AuxInt 17254 x := v_1.Args[1] 17255 if !(^(c1 | c2) == 0) { 17256 break 17257 } 17258 v.reset(OpOr32) 17259 v0 := b.NewValue0(v.Pos, OpConst32, t) 17260 v0.AuxInt = c1 17261 v.AddArg(v0) 17262 v.AddArg(x) 17263 return true 17264 } 17265 // match: (Or32 (Or32 i:(Const32 <t>) z) x) 17266 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 17267 // result: (Or32 i (Or32 <t> z x)) 17268 for { 17269 _ = v.Args[1] 17270 v_0 := v.Args[0] 17271 if v_0.Op != OpOr32 { 17272 break 17273 } 17274 _ = v_0.Args[1] 17275 i := v_0.Args[0] 17276 if i.Op != OpConst32 { 17277 break 17278 } 17279 t := i.Type 17280 z := v_0.Args[1] 17281 x := v.Args[1] 17282 if !(z.Op != OpConst32 && x.Op != OpConst32) { 17283 break 17284 } 17285 v.reset(OpOr32) 17286 v.AddArg(i) 17287 v0 := b.NewValue0(v.Pos, OpOr32, t) 17288 v0.AddArg(z) 17289 v0.AddArg(x) 17290 v.AddArg(v0) 17291 return true 17292 } 17293 // match: (Or32 (Or32 z i:(Const32 <t>)) x) 17294 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 17295 // result: (Or32 i (Or32 <t> z x)) 17296 for { 17297 _ = v.Args[1] 17298 v_0 := v.Args[0] 17299 if v_0.Op != OpOr32 { 17300 break 17301 } 17302 _ = v_0.Args[1] 17303 z := v_0.Args[0] 17304 i := v_0.Args[1] 17305 if i.Op != OpConst32 { 17306 break 17307 } 17308 t := i.Type 17309 x := v.Args[1] 17310 if !(z.Op != OpConst32 && x.Op != OpConst32) { 17311 break 17312 } 17313 v.reset(OpOr32) 17314 v.AddArg(i) 17315 v0 := b.NewValue0(v.Pos, OpOr32, t) 17316 v0.AddArg(z) 17317 v0.AddArg(x) 17318 v.AddArg(v0) 17319 return true 17320 } 17321 // match: (Or32 x (Or32 i:(Const32 <t>) z)) 17322 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 17323 // result: (Or32 i (Or32 <t> z x)) 17324 for { 17325 _ = v.Args[1] 17326 x := v.Args[0] 17327 v_1 := v.Args[1] 17328 if v_1.Op != OpOr32 { 17329 break 17330 } 17331 _ = v_1.Args[1] 17332 i := v_1.Args[0] 17333 if i.Op != OpConst32 { 17334 break 17335 } 17336 t := i.Type 17337 z := v_1.Args[1] 17338 if !(z.Op != OpConst32 && x.Op != OpConst32) { 17339 break 17340 } 17341 v.reset(OpOr32) 17342 v.AddArg(i) 17343 v0 := b.NewValue0(v.Pos, OpOr32, t) 17344 v0.AddArg(z) 17345 v0.AddArg(x) 17346 v.AddArg(v0) 17347 return true 17348 } 17349 // match: (Or32 x (Or32 z i:(Const32 <t>))) 17350 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 17351 // result: (Or32 i (Or32 <t> z x)) 17352 for { 17353 _ = v.Args[1] 17354 x := v.Args[0] 17355 v_1 := v.Args[1] 17356 if v_1.Op != OpOr32 { 17357 break 17358 } 17359 _ = v_1.Args[1] 17360 z := v_1.Args[0] 17361 i := v_1.Args[1] 17362 if i.Op != OpConst32 { 17363 break 17364 } 17365 t := i.Type 17366 if !(z.Op != OpConst32 && x.Op != OpConst32) { 17367 break 17368 } 17369 v.reset(OpOr32) 17370 v.AddArg(i) 17371 v0 := b.NewValue0(v.Pos, OpOr32, t) 17372 v0.AddArg(z) 17373 v0.AddArg(x) 17374 v.AddArg(v0) 17375 return true 17376 } 17377 // match: (Or32 (Const32 <t> [c]) (Or32 (Const32 <t> [d]) x)) 17378 // cond: 17379 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 17380 for { 17381 _ = v.Args[1] 17382 v_0 := v.Args[0] 17383 if v_0.Op != OpConst32 { 17384 break 17385 } 17386 t := v_0.Type 17387 c := v_0.AuxInt 17388 v_1 := v.Args[1] 17389 if v_1.Op != OpOr32 { 17390 break 17391 } 17392 _ = v_1.Args[1] 17393 v_1_0 := v_1.Args[0] 17394 if v_1_0.Op != OpConst32 { 17395 break 17396 } 17397 if v_1_0.Type != t { 17398 break 17399 } 17400 d := v_1_0.AuxInt 17401 x := v_1.Args[1] 17402 v.reset(OpOr32) 17403 v0 := b.NewValue0(v.Pos, OpConst32, t) 17404 v0.AuxInt = int64(int32(c | d)) 17405 v.AddArg(v0) 17406 v.AddArg(x) 17407 return true 17408 } 17409 return false 17410 } 17411 func rewriteValuegeneric_OpOr32_20(v *Value) bool { 17412 b := v.Block 17413 _ = b 17414 // match: (Or32 (Const32 <t> [c]) (Or32 x (Const32 <t> [d]))) 17415 // cond: 17416 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 17417 for { 17418 _ = v.Args[1] 17419 v_0 := v.Args[0] 17420 if v_0.Op != OpConst32 { 17421 break 17422 } 17423 t := v_0.Type 17424 c := v_0.AuxInt 17425 v_1 := v.Args[1] 17426 if v_1.Op != OpOr32 { 17427 break 17428 } 17429 _ = v_1.Args[1] 17430 x := v_1.Args[0] 17431 v_1_1 := v_1.Args[1] 17432 if v_1_1.Op != OpConst32 { 17433 break 17434 } 17435 if v_1_1.Type != t { 17436 break 17437 } 17438 d := v_1_1.AuxInt 17439 v.reset(OpOr32) 17440 v0 := b.NewValue0(v.Pos, OpConst32, t) 17441 v0.AuxInt = int64(int32(c | d)) 17442 v.AddArg(v0) 17443 v.AddArg(x) 17444 return true 17445 } 17446 // match: (Or32 (Or32 (Const32 <t> [d]) x) (Const32 <t> [c])) 17447 // cond: 17448 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 17449 for { 17450 _ = v.Args[1] 17451 v_0 := v.Args[0] 17452 if v_0.Op != OpOr32 { 17453 break 17454 } 17455 _ = v_0.Args[1] 17456 v_0_0 := v_0.Args[0] 17457 if v_0_0.Op != OpConst32 { 17458 break 17459 } 17460 t := v_0_0.Type 17461 d := v_0_0.AuxInt 17462 x := v_0.Args[1] 17463 v_1 := v.Args[1] 17464 if v_1.Op != OpConst32 { 17465 break 17466 } 17467 if v_1.Type != t { 17468 break 17469 } 17470 c := v_1.AuxInt 17471 v.reset(OpOr32) 17472 v0 := b.NewValue0(v.Pos, OpConst32, t) 17473 v0.AuxInt = int64(int32(c | d)) 17474 v.AddArg(v0) 17475 v.AddArg(x) 17476 return true 17477 } 17478 // match: (Or32 (Or32 x (Const32 <t> [d])) (Const32 <t> [c])) 17479 // cond: 17480 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 17481 for { 17482 _ = v.Args[1] 17483 v_0 := v.Args[0] 17484 if v_0.Op != OpOr32 { 17485 break 17486 } 17487 _ = v_0.Args[1] 17488 x := v_0.Args[0] 17489 v_0_1 := v_0.Args[1] 17490 if v_0_1.Op != OpConst32 { 17491 break 17492 } 17493 t := v_0_1.Type 17494 d := v_0_1.AuxInt 17495 v_1 := v.Args[1] 17496 if v_1.Op != OpConst32 { 17497 break 17498 } 17499 if v_1.Type != t { 17500 break 17501 } 17502 c := v_1.AuxInt 17503 v.reset(OpOr32) 17504 v0 := b.NewValue0(v.Pos, OpConst32, t) 17505 v0.AuxInt = int64(int32(c | d)) 17506 v.AddArg(v0) 17507 v.AddArg(x) 17508 return true 17509 } 17510 return false 17511 } 17512 func rewriteValuegeneric_OpOr64_0(v *Value) bool { 17513 // match: (Or64 (Const64 [c]) (Const64 [d])) 17514 // cond: 17515 // result: (Const64 [c|d]) 17516 for { 17517 _ = v.Args[1] 17518 v_0 := v.Args[0] 17519 if v_0.Op != OpConst64 { 17520 break 17521 } 17522 c := v_0.AuxInt 17523 v_1 := v.Args[1] 17524 if v_1.Op != OpConst64 { 17525 break 17526 } 17527 d := v_1.AuxInt 17528 v.reset(OpConst64) 17529 v.AuxInt = c | d 17530 return true 17531 } 17532 // match: (Or64 (Const64 [d]) (Const64 [c])) 17533 // cond: 17534 // result: (Const64 [c|d]) 17535 for { 17536 _ = v.Args[1] 17537 v_0 := v.Args[0] 17538 if v_0.Op != OpConst64 { 17539 break 17540 } 17541 d := v_0.AuxInt 17542 v_1 := v.Args[1] 17543 if v_1.Op != OpConst64 { 17544 break 17545 } 17546 c := v_1.AuxInt 17547 v.reset(OpConst64) 17548 v.AuxInt = c | d 17549 return true 17550 } 17551 // match: (Or64 x x) 17552 // cond: 17553 // result: x 17554 for { 17555 _ = v.Args[1] 17556 x := v.Args[0] 17557 if x != v.Args[1] { 17558 break 17559 } 17560 v.reset(OpCopy) 17561 v.Type = x.Type 17562 v.AddArg(x) 17563 return true 17564 } 17565 // match: (Or64 (Const64 [0]) x) 17566 // cond: 17567 // result: x 17568 for { 17569 _ = v.Args[1] 17570 v_0 := v.Args[0] 17571 if v_0.Op != OpConst64 { 17572 break 17573 } 17574 if v_0.AuxInt != 0 { 17575 break 17576 } 17577 x := v.Args[1] 17578 v.reset(OpCopy) 17579 v.Type = x.Type 17580 v.AddArg(x) 17581 return true 17582 } 17583 // match: (Or64 x (Const64 [0])) 17584 // cond: 17585 // result: x 17586 for { 17587 _ = v.Args[1] 17588 x := v.Args[0] 17589 v_1 := v.Args[1] 17590 if v_1.Op != OpConst64 { 17591 break 17592 } 17593 if v_1.AuxInt != 0 { 17594 break 17595 } 17596 v.reset(OpCopy) 17597 v.Type = x.Type 17598 v.AddArg(x) 17599 return true 17600 } 17601 // match: (Or64 (Const64 [-1]) _) 17602 // cond: 17603 // result: (Const64 [-1]) 17604 for { 17605 _ = v.Args[1] 17606 v_0 := v.Args[0] 17607 if v_0.Op != OpConst64 { 17608 break 17609 } 17610 if v_0.AuxInt != -1 { 17611 break 17612 } 17613 v.reset(OpConst64) 17614 v.AuxInt = -1 17615 return true 17616 } 17617 // match: (Or64 _ (Const64 [-1])) 17618 // cond: 17619 // result: (Const64 [-1]) 17620 for { 17621 _ = v.Args[1] 17622 v_1 := v.Args[1] 17623 if v_1.Op != OpConst64 { 17624 break 17625 } 17626 if v_1.AuxInt != -1 { 17627 break 17628 } 17629 v.reset(OpConst64) 17630 v.AuxInt = -1 17631 return true 17632 } 17633 // match: (Or64 x (Or64 x y)) 17634 // cond: 17635 // result: (Or64 x y) 17636 for { 17637 _ = v.Args[1] 17638 x := v.Args[0] 17639 v_1 := v.Args[1] 17640 if v_1.Op != OpOr64 { 17641 break 17642 } 17643 _ = v_1.Args[1] 17644 if x != v_1.Args[0] { 17645 break 17646 } 17647 y := v_1.Args[1] 17648 v.reset(OpOr64) 17649 v.AddArg(x) 17650 v.AddArg(y) 17651 return true 17652 } 17653 // match: (Or64 x (Or64 y x)) 17654 // cond: 17655 // result: (Or64 x y) 17656 for { 17657 _ = v.Args[1] 17658 x := v.Args[0] 17659 v_1 := v.Args[1] 17660 if v_1.Op != OpOr64 { 17661 break 17662 } 17663 _ = v_1.Args[1] 17664 y := v_1.Args[0] 17665 if x != v_1.Args[1] { 17666 break 17667 } 17668 v.reset(OpOr64) 17669 v.AddArg(x) 17670 v.AddArg(y) 17671 return true 17672 } 17673 // match: (Or64 (Or64 x y) x) 17674 // cond: 17675 // result: (Or64 x y) 17676 for { 17677 _ = v.Args[1] 17678 v_0 := v.Args[0] 17679 if v_0.Op != OpOr64 { 17680 break 17681 } 17682 _ = v_0.Args[1] 17683 x := v_0.Args[0] 17684 y := v_0.Args[1] 17685 if x != v.Args[1] { 17686 break 17687 } 17688 v.reset(OpOr64) 17689 v.AddArg(x) 17690 v.AddArg(y) 17691 return true 17692 } 17693 return false 17694 } 17695 func rewriteValuegeneric_OpOr64_10(v *Value) bool { 17696 b := v.Block 17697 _ = b 17698 // match: (Or64 (Or64 y x) x) 17699 // cond: 17700 // result: (Or64 x y) 17701 for { 17702 _ = v.Args[1] 17703 v_0 := v.Args[0] 17704 if v_0.Op != OpOr64 { 17705 break 17706 } 17707 _ = v_0.Args[1] 17708 y := v_0.Args[0] 17709 x := v_0.Args[1] 17710 if x != v.Args[1] { 17711 break 17712 } 17713 v.reset(OpOr64) 17714 v.AddArg(x) 17715 v.AddArg(y) 17716 return true 17717 } 17718 // match: (Or64 (And64 x (Const64 [c2])) (Const64 <t> [c1])) 17719 // cond: ^(c1 | c2) == 0 17720 // result: (Or64 (Const64 <t> [c1]) x) 17721 for { 17722 _ = v.Args[1] 17723 v_0 := v.Args[0] 17724 if v_0.Op != OpAnd64 { 17725 break 17726 } 17727 _ = v_0.Args[1] 17728 x := v_0.Args[0] 17729 v_0_1 := v_0.Args[1] 17730 if v_0_1.Op != OpConst64 { 17731 break 17732 } 17733 c2 := v_0_1.AuxInt 17734 v_1 := v.Args[1] 17735 if v_1.Op != OpConst64 { 17736 break 17737 } 17738 t := v_1.Type 17739 c1 := v_1.AuxInt 17740 if !(^(c1 | c2) == 0) { 17741 break 17742 } 17743 v.reset(OpOr64) 17744 v0 := b.NewValue0(v.Pos, OpConst64, t) 17745 v0.AuxInt = c1 17746 v.AddArg(v0) 17747 v.AddArg(x) 17748 return true 17749 } 17750 // match: (Or64 (And64 (Const64 [c2]) x) (Const64 <t> [c1])) 17751 // cond: ^(c1 | c2) == 0 17752 // result: (Or64 (Const64 <t> [c1]) x) 17753 for { 17754 _ = v.Args[1] 17755 v_0 := v.Args[0] 17756 if v_0.Op != OpAnd64 { 17757 break 17758 } 17759 _ = v_0.Args[1] 17760 v_0_0 := v_0.Args[0] 17761 if v_0_0.Op != OpConst64 { 17762 break 17763 } 17764 c2 := v_0_0.AuxInt 17765 x := v_0.Args[1] 17766 v_1 := v.Args[1] 17767 if v_1.Op != OpConst64 { 17768 break 17769 } 17770 t := v_1.Type 17771 c1 := v_1.AuxInt 17772 if !(^(c1 | c2) == 0) { 17773 break 17774 } 17775 v.reset(OpOr64) 17776 v0 := b.NewValue0(v.Pos, OpConst64, t) 17777 v0.AuxInt = c1 17778 v.AddArg(v0) 17779 v.AddArg(x) 17780 return true 17781 } 17782 // match: (Or64 (Const64 <t> [c1]) (And64 x (Const64 [c2]))) 17783 // cond: ^(c1 | c2) == 0 17784 // result: (Or64 (Const64 <t> [c1]) x) 17785 for { 17786 _ = v.Args[1] 17787 v_0 := v.Args[0] 17788 if v_0.Op != OpConst64 { 17789 break 17790 } 17791 t := v_0.Type 17792 c1 := v_0.AuxInt 17793 v_1 := v.Args[1] 17794 if v_1.Op != OpAnd64 { 17795 break 17796 } 17797 _ = v_1.Args[1] 17798 x := v_1.Args[0] 17799 v_1_1 := v_1.Args[1] 17800 if v_1_1.Op != OpConst64 { 17801 break 17802 } 17803 c2 := v_1_1.AuxInt 17804 if !(^(c1 | c2) == 0) { 17805 break 17806 } 17807 v.reset(OpOr64) 17808 v0 := b.NewValue0(v.Pos, OpConst64, t) 17809 v0.AuxInt = c1 17810 v.AddArg(v0) 17811 v.AddArg(x) 17812 return true 17813 } 17814 // match: (Or64 (Const64 <t> [c1]) (And64 (Const64 [c2]) x)) 17815 // cond: ^(c1 | c2) == 0 17816 // result: (Or64 (Const64 <t> [c1]) x) 17817 for { 17818 _ = v.Args[1] 17819 v_0 := v.Args[0] 17820 if v_0.Op != OpConst64 { 17821 break 17822 } 17823 t := v_0.Type 17824 c1 := v_0.AuxInt 17825 v_1 := v.Args[1] 17826 if v_1.Op != OpAnd64 { 17827 break 17828 } 17829 _ = v_1.Args[1] 17830 v_1_0 := v_1.Args[0] 17831 if v_1_0.Op != OpConst64 { 17832 break 17833 } 17834 c2 := v_1_0.AuxInt 17835 x := v_1.Args[1] 17836 if !(^(c1 | c2) == 0) { 17837 break 17838 } 17839 v.reset(OpOr64) 17840 v0 := b.NewValue0(v.Pos, OpConst64, t) 17841 v0.AuxInt = c1 17842 v.AddArg(v0) 17843 v.AddArg(x) 17844 return true 17845 } 17846 // match: (Or64 (Or64 i:(Const64 <t>) z) x) 17847 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 17848 // result: (Or64 i (Or64 <t> z x)) 17849 for { 17850 _ = v.Args[1] 17851 v_0 := v.Args[0] 17852 if v_0.Op != OpOr64 { 17853 break 17854 } 17855 _ = v_0.Args[1] 17856 i := v_0.Args[0] 17857 if i.Op != OpConst64 { 17858 break 17859 } 17860 t := i.Type 17861 z := v_0.Args[1] 17862 x := v.Args[1] 17863 if !(z.Op != OpConst64 && x.Op != OpConst64) { 17864 break 17865 } 17866 v.reset(OpOr64) 17867 v.AddArg(i) 17868 v0 := b.NewValue0(v.Pos, OpOr64, t) 17869 v0.AddArg(z) 17870 v0.AddArg(x) 17871 v.AddArg(v0) 17872 return true 17873 } 17874 // match: (Or64 (Or64 z i:(Const64 <t>)) x) 17875 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 17876 // result: (Or64 i (Or64 <t> z x)) 17877 for { 17878 _ = v.Args[1] 17879 v_0 := v.Args[0] 17880 if v_0.Op != OpOr64 { 17881 break 17882 } 17883 _ = v_0.Args[1] 17884 z := v_0.Args[0] 17885 i := v_0.Args[1] 17886 if i.Op != OpConst64 { 17887 break 17888 } 17889 t := i.Type 17890 x := v.Args[1] 17891 if !(z.Op != OpConst64 && x.Op != OpConst64) { 17892 break 17893 } 17894 v.reset(OpOr64) 17895 v.AddArg(i) 17896 v0 := b.NewValue0(v.Pos, OpOr64, t) 17897 v0.AddArg(z) 17898 v0.AddArg(x) 17899 v.AddArg(v0) 17900 return true 17901 } 17902 // match: (Or64 x (Or64 i:(Const64 <t>) z)) 17903 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 17904 // result: (Or64 i (Or64 <t> z x)) 17905 for { 17906 _ = v.Args[1] 17907 x := v.Args[0] 17908 v_1 := v.Args[1] 17909 if v_1.Op != OpOr64 { 17910 break 17911 } 17912 _ = v_1.Args[1] 17913 i := v_1.Args[0] 17914 if i.Op != OpConst64 { 17915 break 17916 } 17917 t := i.Type 17918 z := v_1.Args[1] 17919 if !(z.Op != OpConst64 && x.Op != OpConst64) { 17920 break 17921 } 17922 v.reset(OpOr64) 17923 v.AddArg(i) 17924 v0 := b.NewValue0(v.Pos, OpOr64, t) 17925 v0.AddArg(z) 17926 v0.AddArg(x) 17927 v.AddArg(v0) 17928 return true 17929 } 17930 // match: (Or64 x (Or64 z i:(Const64 <t>))) 17931 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 17932 // result: (Or64 i (Or64 <t> z x)) 17933 for { 17934 _ = v.Args[1] 17935 x := v.Args[0] 17936 v_1 := v.Args[1] 17937 if v_1.Op != OpOr64 { 17938 break 17939 } 17940 _ = v_1.Args[1] 17941 z := v_1.Args[0] 17942 i := v_1.Args[1] 17943 if i.Op != OpConst64 { 17944 break 17945 } 17946 t := i.Type 17947 if !(z.Op != OpConst64 && x.Op != OpConst64) { 17948 break 17949 } 17950 v.reset(OpOr64) 17951 v.AddArg(i) 17952 v0 := b.NewValue0(v.Pos, OpOr64, t) 17953 v0.AddArg(z) 17954 v0.AddArg(x) 17955 v.AddArg(v0) 17956 return true 17957 } 17958 // match: (Or64 (Const64 <t> [c]) (Or64 (Const64 <t> [d]) x)) 17959 // cond: 17960 // result: (Or64 (Const64 <t> [c|d]) x) 17961 for { 17962 _ = v.Args[1] 17963 v_0 := v.Args[0] 17964 if v_0.Op != OpConst64 { 17965 break 17966 } 17967 t := v_0.Type 17968 c := v_0.AuxInt 17969 v_1 := v.Args[1] 17970 if v_1.Op != OpOr64 { 17971 break 17972 } 17973 _ = v_1.Args[1] 17974 v_1_0 := v_1.Args[0] 17975 if v_1_0.Op != OpConst64 { 17976 break 17977 } 17978 if v_1_0.Type != t { 17979 break 17980 } 17981 d := v_1_0.AuxInt 17982 x := v_1.Args[1] 17983 v.reset(OpOr64) 17984 v0 := b.NewValue0(v.Pos, OpConst64, t) 17985 v0.AuxInt = c | d 17986 v.AddArg(v0) 17987 v.AddArg(x) 17988 return true 17989 } 17990 return false 17991 } 17992 func rewriteValuegeneric_OpOr64_20(v *Value) bool { 17993 b := v.Block 17994 _ = b 17995 // match: (Or64 (Const64 <t> [c]) (Or64 x (Const64 <t> [d]))) 17996 // cond: 17997 // result: (Or64 (Const64 <t> [c|d]) x) 17998 for { 17999 _ = v.Args[1] 18000 v_0 := v.Args[0] 18001 if v_0.Op != OpConst64 { 18002 break 18003 } 18004 t := v_0.Type 18005 c := v_0.AuxInt 18006 v_1 := v.Args[1] 18007 if v_1.Op != OpOr64 { 18008 break 18009 } 18010 _ = v_1.Args[1] 18011 x := v_1.Args[0] 18012 v_1_1 := v_1.Args[1] 18013 if v_1_1.Op != OpConst64 { 18014 break 18015 } 18016 if v_1_1.Type != t { 18017 break 18018 } 18019 d := v_1_1.AuxInt 18020 v.reset(OpOr64) 18021 v0 := b.NewValue0(v.Pos, OpConst64, t) 18022 v0.AuxInt = c | d 18023 v.AddArg(v0) 18024 v.AddArg(x) 18025 return true 18026 } 18027 // match: (Or64 (Or64 (Const64 <t> [d]) x) (Const64 <t> [c])) 18028 // cond: 18029 // result: (Or64 (Const64 <t> [c|d]) x) 18030 for { 18031 _ = v.Args[1] 18032 v_0 := v.Args[0] 18033 if v_0.Op != OpOr64 { 18034 break 18035 } 18036 _ = v_0.Args[1] 18037 v_0_0 := v_0.Args[0] 18038 if v_0_0.Op != OpConst64 { 18039 break 18040 } 18041 t := v_0_0.Type 18042 d := v_0_0.AuxInt 18043 x := v_0.Args[1] 18044 v_1 := v.Args[1] 18045 if v_1.Op != OpConst64 { 18046 break 18047 } 18048 if v_1.Type != t { 18049 break 18050 } 18051 c := v_1.AuxInt 18052 v.reset(OpOr64) 18053 v0 := b.NewValue0(v.Pos, OpConst64, t) 18054 v0.AuxInt = c | d 18055 v.AddArg(v0) 18056 v.AddArg(x) 18057 return true 18058 } 18059 // match: (Or64 (Or64 x (Const64 <t> [d])) (Const64 <t> [c])) 18060 // cond: 18061 // result: (Or64 (Const64 <t> [c|d]) x) 18062 for { 18063 _ = v.Args[1] 18064 v_0 := v.Args[0] 18065 if v_0.Op != OpOr64 { 18066 break 18067 } 18068 _ = v_0.Args[1] 18069 x := v_0.Args[0] 18070 v_0_1 := v_0.Args[1] 18071 if v_0_1.Op != OpConst64 { 18072 break 18073 } 18074 t := v_0_1.Type 18075 d := v_0_1.AuxInt 18076 v_1 := v.Args[1] 18077 if v_1.Op != OpConst64 { 18078 break 18079 } 18080 if v_1.Type != t { 18081 break 18082 } 18083 c := v_1.AuxInt 18084 v.reset(OpOr64) 18085 v0 := b.NewValue0(v.Pos, OpConst64, t) 18086 v0.AuxInt = c | d 18087 v.AddArg(v0) 18088 v.AddArg(x) 18089 return true 18090 } 18091 return false 18092 } 18093 func rewriteValuegeneric_OpOr8_0(v *Value) bool { 18094 // match: (Or8 (Const8 [c]) (Const8 [d])) 18095 // cond: 18096 // result: (Const8 [int64(int8(c|d))]) 18097 for { 18098 _ = v.Args[1] 18099 v_0 := v.Args[0] 18100 if v_0.Op != OpConst8 { 18101 break 18102 } 18103 c := v_0.AuxInt 18104 v_1 := v.Args[1] 18105 if v_1.Op != OpConst8 { 18106 break 18107 } 18108 d := v_1.AuxInt 18109 v.reset(OpConst8) 18110 v.AuxInt = int64(int8(c | d)) 18111 return true 18112 } 18113 // match: (Or8 (Const8 [d]) (Const8 [c])) 18114 // cond: 18115 // result: (Const8 [int64(int8(c|d))]) 18116 for { 18117 _ = v.Args[1] 18118 v_0 := v.Args[0] 18119 if v_0.Op != OpConst8 { 18120 break 18121 } 18122 d := v_0.AuxInt 18123 v_1 := v.Args[1] 18124 if v_1.Op != OpConst8 { 18125 break 18126 } 18127 c := v_1.AuxInt 18128 v.reset(OpConst8) 18129 v.AuxInt = int64(int8(c | d)) 18130 return true 18131 } 18132 // match: (Or8 x x) 18133 // cond: 18134 // result: x 18135 for { 18136 _ = v.Args[1] 18137 x := v.Args[0] 18138 if x != v.Args[1] { 18139 break 18140 } 18141 v.reset(OpCopy) 18142 v.Type = x.Type 18143 v.AddArg(x) 18144 return true 18145 } 18146 // match: (Or8 (Const8 [0]) x) 18147 // cond: 18148 // result: x 18149 for { 18150 _ = v.Args[1] 18151 v_0 := v.Args[0] 18152 if v_0.Op != OpConst8 { 18153 break 18154 } 18155 if v_0.AuxInt != 0 { 18156 break 18157 } 18158 x := v.Args[1] 18159 v.reset(OpCopy) 18160 v.Type = x.Type 18161 v.AddArg(x) 18162 return true 18163 } 18164 // match: (Or8 x (Const8 [0])) 18165 // cond: 18166 // result: x 18167 for { 18168 _ = v.Args[1] 18169 x := v.Args[0] 18170 v_1 := v.Args[1] 18171 if v_1.Op != OpConst8 { 18172 break 18173 } 18174 if v_1.AuxInt != 0 { 18175 break 18176 } 18177 v.reset(OpCopy) 18178 v.Type = x.Type 18179 v.AddArg(x) 18180 return true 18181 } 18182 // match: (Or8 (Const8 [-1]) _) 18183 // cond: 18184 // result: (Const8 [-1]) 18185 for { 18186 _ = v.Args[1] 18187 v_0 := v.Args[0] 18188 if v_0.Op != OpConst8 { 18189 break 18190 } 18191 if v_0.AuxInt != -1 { 18192 break 18193 } 18194 v.reset(OpConst8) 18195 v.AuxInt = -1 18196 return true 18197 } 18198 // match: (Or8 _ (Const8 [-1])) 18199 // cond: 18200 // result: (Const8 [-1]) 18201 for { 18202 _ = v.Args[1] 18203 v_1 := v.Args[1] 18204 if v_1.Op != OpConst8 { 18205 break 18206 } 18207 if v_1.AuxInt != -1 { 18208 break 18209 } 18210 v.reset(OpConst8) 18211 v.AuxInt = -1 18212 return true 18213 } 18214 // match: (Or8 x (Or8 x y)) 18215 // cond: 18216 // result: (Or8 x y) 18217 for { 18218 _ = v.Args[1] 18219 x := v.Args[0] 18220 v_1 := v.Args[1] 18221 if v_1.Op != OpOr8 { 18222 break 18223 } 18224 _ = v_1.Args[1] 18225 if x != v_1.Args[0] { 18226 break 18227 } 18228 y := v_1.Args[1] 18229 v.reset(OpOr8) 18230 v.AddArg(x) 18231 v.AddArg(y) 18232 return true 18233 } 18234 // match: (Or8 x (Or8 y x)) 18235 // cond: 18236 // result: (Or8 x y) 18237 for { 18238 _ = v.Args[1] 18239 x := v.Args[0] 18240 v_1 := v.Args[1] 18241 if v_1.Op != OpOr8 { 18242 break 18243 } 18244 _ = v_1.Args[1] 18245 y := v_1.Args[0] 18246 if x != v_1.Args[1] { 18247 break 18248 } 18249 v.reset(OpOr8) 18250 v.AddArg(x) 18251 v.AddArg(y) 18252 return true 18253 } 18254 // match: (Or8 (Or8 x y) x) 18255 // cond: 18256 // result: (Or8 x y) 18257 for { 18258 _ = v.Args[1] 18259 v_0 := v.Args[0] 18260 if v_0.Op != OpOr8 { 18261 break 18262 } 18263 _ = v_0.Args[1] 18264 x := v_0.Args[0] 18265 y := v_0.Args[1] 18266 if x != v.Args[1] { 18267 break 18268 } 18269 v.reset(OpOr8) 18270 v.AddArg(x) 18271 v.AddArg(y) 18272 return true 18273 } 18274 return false 18275 } 18276 func rewriteValuegeneric_OpOr8_10(v *Value) bool { 18277 b := v.Block 18278 _ = b 18279 // match: (Or8 (Or8 y x) x) 18280 // cond: 18281 // result: (Or8 x y) 18282 for { 18283 _ = v.Args[1] 18284 v_0 := v.Args[0] 18285 if v_0.Op != OpOr8 { 18286 break 18287 } 18288 _ = v_0.Args[1] 18289 y := v_0.Args[0] 18290 x := v_0.Args[1] 18291 if x != v.Args[1] { 18292 break 18293 } 18294 v.reset(OpOr8) 18295 v.AddArg(x) 18296 v.AddArg(y) 18297 return true 18298 } 18299 // match: (Or8 (And8 x (Const8 [c2])) (Const8 <t> [c1])) 18300 // cond: ^(c1 | c2) == 0 18301 // result: (Or8 (Const8 <t> [c1]) x) 18302 for { 18303 _ = v.Args[1] 18304 v_0 := v.Args[0] 18305 if v_0.Op != OpAnd8 { 18306 break 18307 } 18308 _ = v_0.Args[1] 18309 x := v_0.Args[0] 18310 v_0_1 := v_0.Args[1] 18311 if v_0_1.Op != OpConst8 { 18312 break 18313 } 18314 c2 := v_0_1.AuxInt 18315 v_1 := v.Args[1] 18316 if v_1.Op != OpConst8 { 18317 break 18318 } 18319 t := v_1.Type 18320 c1 := v_1.AuxInt 18321 if !(^(c1 | c2) == 0) { 18322 break 18323 } 18324 v.reset(OpOr8) 18325 v0 := b.NewValue0(v.Pos, OpConst8, t) 18326 v0.AuxInt = c1 18327 v.AddArg(v0) 18328 v.AddArg(x) 18329 return true 18330 } 18331 // match: (Or8 (And8 (Const8 [c2]) x) (Const8 <t> [c1])) 18332 // cond: ^(c1 | c2) == 0 18333 // result: (Or8 (Const8 <t> [c1]) x) 18334 for { 18335 _ = v.Args[1] 18336 v_0 := v.Args[0] 18337 if v_0.Op != OpAnd8 { 18338 break 18339 } 18340 _ = v_0.Args[1] 18341 v_0_0 := v_0.Args[0] 18342 if v_0_0.Op != OpConst8 { 18343 break 18344 } 18345 c2 := v_0_0.AuxInt 18346 x := v_0.Args[1] 18347 v_1 := v.Args[1] 18348 if v_1.Op != OpConst8 { 18349 break 18350 } 18351 t := v_1.Type 18352 c1 := v_1.AuxInt 18353 if !(^(c1 | c2) == 0) { 18354 break 18355 } 18356 v.reset(OpOr8) 18357 v0 := b.NewValue0(v.Pos, OpConst8, t) 18358 v0.AuxInt = c1 18359 v.AddArg(v0) 18360 v.AddArg(x) 18361 return true 18362 } 18363 // match: (Or8 (Const8 <t> [c1]) (And8 x (Const8 [c2]))) 18364 // cond: ^(c1 | c2) == 0 18365 // result: (Or8 (Const8 <t> [c1]) x) 18366 for { 18367 _ = v.Args[1] 18368 v_0 := v.Args[0] 18369 if v_0.Op != OpConst8 { 18370 break 18371 } 18372 t := v_0.Type 18373 c1 := v_0.AuxInt 18374 v_1 := v.Args[1] 18375 if v_1.Op != OpAnd8 { 18376 break 18377 } 18378 _ = v_1.Args[1] 18379 x := v_1.Args[0] 18380 v_1_1 := v_1.Args[1] 18381 if v_1_1.Op != OpConst8 { 18382 break 18383 } 18384 c2 := v_1_1.AuxInt 18385 if !(^(c1 | c2) == 0) { 18386 break 18387 } 18388 v.reset(OpOr8) 18389 v0 := b.NewValue0(v.Pos, OpConst8, t) 18390 v0.AuxInt = c1 18391 v.AddArg(v0) 18392 v.AddArg(x) 18393 return true 18394 } 18395 // match: (Or8 (Const8 <t> [c1]) (And8 (Const8 [c2]) x)) 18396 // cond: ^(c1 | c2) == 0 18397 // result: (Or8 (Const8 <t> [c1]) x) 18398 for { 18399 _ = v.Args[1] 18400 v_0 := v.Args[0] 18401 if v_0.Op != OpConst8 { 18402 break 18403 } 18404 t := v_0.Type 18405 c1 := v_0.AuxInt 18406 v_1 := v.Args[1] 18407 if v_1.Op != OpAnd8 { 18408 break 18409 } 18410 _ = v_1.Args[1] 18411 v_1_0 := v_1.Args[0] 18412 if v_1_0.Op != OpConst8 { 18413 break 18414 } 18415 c2 := v_1_0.AuxInt 18416 x := v_1.Args[1] 18417 if !(^(c1 | c2) == 0) { 18418 break 18419 } 18420 v.reset(OpOr8) 18421 v0 := b.NewValue0(v.Pos, OpConst8, t) 18422 v0.AuxInt = c1 18423 v.AddArg(v0) 18424 v.AddArg(x) 18425 return true 18426 } 18427 // match: (Or8 (Or8 i:(Const8 <t>) z) x) 18428 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 18429 // result: (Or8 i (Or8 <t> z x)) 18430 for { 18431 _ = v.Args[1] 18432 v_0 := v.Args[0] 18433 if v_0.Op != OpOr8 { 18434 break 18435 } 18436 _ = v_0.Args[1] 18437 i := v_0.Args[0] 18438 if i.Op != OpConst8 { 18439 break 18440 } 18441 t := i.Type 18442 z := v_0.Args[1] 18443 x := v.Args[1] 18444 if !(z.Op != OpConst8 && x.Op != OpConst8) { 18445 break 18446 } 18447 v.reset(OpOr8) 18448 v.AddArg(i) 18449 v0 := b.NewValue0(v.Pos, OpOr8, t) 18450 v0.AddArg(z) 18451 v0.AddArg(x) 18452 v.AddArg(v0) 18453 return true 18454 } 18455 // match: (Or8 (Or8 z i:(Const8 <t>)) x) 18456 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 18457 // result: (Or8 i (Or8 <t> z x)) 18458 for { 18459 _ = v.Args[1] 18460 v_0 := v.Args[0] 18461 if v_0.Op != OpOr8 { 18462 break 18463 } 18464 _ = v_0.Args[1] 18465 z := v_0.Args[0] 18466 i := v_0.Args[1] 18467 if i.Op != OpConst8 { 18468 break 18469 } 18470 t := i.Type 18471 x := v.Args[1] 18472 if !(z.Op != OpConst8 && x.Op != OpConst8) { 18473 break 18474 } 18475 v.reset(OpOr8) 18476 v.AddArg(i) 18477 v0 := b.NewValue0(v.Pos, OpOr8, t) 18478 v0.AddArg(z) 18479 v0.AddArg(x) 18480 v.AddArg(v0) 18481 return true 18482 } 18483 // match: (Or8 x (Or8 i:(Const8 <t>) z)) 18484 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 18485 // result: (Or8 i (Or8 <t> z x)) 18486 for { 18487 _ = v.Args[1] 18488 x := v.Args[0] 18489 v_1 := v.Args[1] 18490 if v_1.Op != OpOr8 { 18491 break 18492 } 18493 _ = v_1.Args[1] 18494 i := v_1.Args[0] 18495 if i.Op != OpConst8 { 18496 break 18497 } 18498 t := i.Type 18499 z := v_1.Args[1] 18500 if !(z.Op != OpConst8 && x.Op != OpConst8) { 18501 break 18502 } 18503 v.reset(OpOr8) 18504 v.AddArg(i) 18505 v0 := b.NewValue0(v.Pos, OpOr8, t) 18506 v0.AddArg(z) 18507 v0.AddArg(x) 18508 v.AddArg(v0) 18509 return true 18510 } 18511 // match: (Or8 x (Or8 z i:(Const8 <t>))) 18512 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 18513 // result: (Or8 i (Or8 <t> z x)) 18514 for { 18515 _ = v.Args[1] 18516 x := v.Args[0] 18517 v_1 := v.Args[1] 18518 if v_1.Op != OpOr8 { 18519 break 18520 } 18521 _ = v_1.Args[1] 18522 z := v_1.Args[0] 18523 i := v_1.Args[1] 18524 if i.Op != OpConst8 { 18525 break 18526 } 18527 t := i.Type 18528 if !(z.Op != OpConst8 && x.Op != OpConst8) { 18529 break 18530 } 18531 v.reset(OpOr8) 18532 v.AddArg(i) 18533 v0 := b.NewValue0(v.Pos, OpOr8, t) 18534 v0.AddArg(z) 18535 v0.AddArg(x) 18536 v.AddArg(v0) 18537 return true 18538 } 18539 // match: (Or8 (Const8 <t> [c]) (Or8 (Const8 <t> [d]) x)) 18540 // cond: 18541 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 18542 for { 18543 _ = v.Args[1] 18544 v_0 := v.Args[0] 18545 if v_0.Op != OpConst8 { 18546 break 18547 } 18548 t := v_0.Type 18549 c := v_0.AuxInt 18550 v_1 := v.Args[1] 18551 if v_1.Op != OpOr8 { 18552 break 18553 } 18554 _ = v_1.Args[1] 18555 v_1_0 := v_1.Args[0] 18556 if v_1_0.Op != OpConst8 { 18557 break 18558 } 18559 if v_1_0.Type != t { 18560 break 18561 } 18562 d := v_1_0.AuxInt 18563 x := v_1.Args[1] 18564 v.reset(OpOr8) 18565 v0 := b.NewValue0(v.Pos, OpConst8, t) 18566 v0.AuxInt = int64(int8(c | d)) 18567 v.AddArg(v0) 18568 v.AddArg(x) 18569 return true 18570 } 18571 return false 18572 } 18573 func rewriteValuegeneric_OpOr8_20(v *Value) bool { 18574 b := v.Block 18575 _ = b 18576 // match: (Or8 (Const8 <t> [c]) (Or8 x (Const8 <t> [d]))) 18577 // cond: 18578 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 18579 for { 18580 _ = v.Args[1] 18581 v_0 := v.Args[0] 18582 if v_0.Op != OpConst8 { 18583 break 18584 } 18585 t := v_0.Type 18586 c := v_0.AuxInt 18587 v_1 := v.Args[1] 18588 if v_1.Op != OpOr8 { 18589 break 18590 } 18591 _ = v_1.Args[1] 18592 x := v_1.Args[0] 18593 v_1_1 := v_1.Args[1] 18594 if v_1_1.Op != OpConst8 { 18595 break 18596 } 18597 if v_1_1.Type != t { 18598 break 18599 } 18600 d := v_1_1.AuxInt 18601 v.reset(OpOr8) 18602 v0 := b.NewValue0(v.Pos, OpConst8, t) 18603 v0.AuxInt = int64(int8(c | d)) 18604 v.AddArg(v0) 18605 v.AddArg(x) 18606 return true 18607 } 18608 // match: (Or8 (Or8 (Const8 <t> [d]) x) (Const8 <t> [c])) 18609 // cond: 18610 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 18611 for { 18612 _ = v.Args[1] 18613 v_0 := v.Args[0] 18614 if v_0.Op != OpOr8 { 18615 break 18616 } 18617 _ = v_0.Args[1] 18618 v_0_0 := v_0.Args[0] 18619 if v_0_0.Op != OpConst8 { 18620 break 18621 } 18622 t := v_0_0.Type 18623 d := v_0_0.AuxInt 18624 x := v_0.Args[1] 18625 v_1 := v.Args[1] 18626 if v_1.Op != OpConst8 { 18627 break 18628 } 18629 if v_1.Type != t { 18630 break 18631 } 18632 c := v_1.AuxInt 18633 v.reset(OpOr8) 18634 v0 := b.NewValue0(v.Pos, OpConst8, t) 18635 v0.AuxInt = int64(int8(c | d)) 18636 v.AddArg(v0) 18637 v.AddArg(x) 18638 return true 18639 } 18640 // match: (Or8 (Or8 x (Const8 <t> [d])) (Const8 <t> [c])) 18641 // cond: 18642 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 18643 for { 18644 _ = v.Args[1] 18645 v_0 := v.Args[0] 18646 if v_0.Op != OpOr8 { 18647 break 18648 } 18649 _ = v_0.Args[1] 18650 x := v_0.Args[0] 18651 v_0_1 := v_0.Args[1] 18652 if v_0_1.Op != OpConst8 { 18653 break 18654 } 18655 t := v_0_1.Type 18656 d := v_0_1.AuxInt 18657 v_1 := v.Args[1] 18658 if v_1.Op != OpConst8 { 18659 break 18660 } 18661 if v_1.Type != t { 18662 break 18663 } 18664 c := v_1.AuxInt 18665 v.reset(OpOr8) 18666 v0 := b.NewValue0(v.Pos, OpConst8, t) 18667 v0.AuxInt = int64(int8(c | d)) 18668 v.AddArg(v0) 18669 v.AddArg(x) 18670 return true 18671 } 18672 return false 18673 } 18674 func rewriteValuegeneric_OpPhi_0(v *Value) bool { 18675 // match: (Phi (Const8 [c]) (Const8 [c])) 18676 // cond: 18677 // result: (Const8 [c]) 18678 for { 18679 _ = v.Args[1] 18680 v_0 := v.Args[0] 18681 if v_0.Op != OpConst8 { 18682 break 18683 } 18684 c := v_0.AuxInt 18685 v_1 := v.Args[1] 18686 if v_1.Op != OpConst8 { 18687 break 18688 } 18689 if v_1.AuxInt != c { 18690 break 18691 } 18692 if len(v.Args) != 2 { 18693 break 18694 } 18695 v.reset(OpConst8) 18696 v.AuxInt = c 18697 return true 18698 } 18699 // match: (Phi (Const16 [c]) (Const16 [c])) 18700 // cond: 18701 // result: (Const16 [c]) 18702 for { 18703 _ = v.Args[1] 18704 v_0 := v.Args[0] 18705 if v_0.Op != OpConst16 { 18706 break 18707 } 18708 c := v_0.AuxInt 18709 v_1 := v.Args[1] 18710 if v_1.Op != OpConst16 { 18711 break 18712 } 18713 if v_1.AuxInt != c { 18714 break 18715 } 18716 if len(v.Args) != 2 { 18717 break 18718 } 18719 v.reset(OpConst16) 18720 v.AuxInt = c 18721 return true 18722 } 18723 // match: (Phi (Const32 [c]) (Const32 [c])) 18724 // cond: 18725 // result: (Const32 [c]) 18726 for { 18727 _ = v.Args[1] 18728 v_0 := v.Args[0] 18729 if v_0.Op != OpConst32 { 18730 break 18731 } 18732 c := v_0.AuxInt 18733 v_1 := v.Args[1] 18734 if v_1.Op != OpConst32 { 18735 break 18736 } 18737 if v_1.AuxInt != c { 18738 break 18739 } 18740 if len(v.Args) != 2 { 18741 break 18742 } 18743 v.reset(OpConst32) 18744 v.AuxInt = c 18745 return true 18746 } 18747 // match: (Phi (Const64 [c]) (Const64 [c])) 18748 // cond: 18749 // result: (Const64 [c]) 18750 for { 18751 _ = v.Args[1] 18752 v_0 := v.Args[0] 18753 if v_0.Op != OpConst64 { 18754 break 18755 } 18756 c := v_0.AuxInt 18757 v_1 := v.Args[1] 18758 if v_1.Op != OpConst64 { 18759 break 18760 } 18761 if v_1.AuxInt != c { 18762 break 18763 } 18764 if len(v.Args) != 2 { 18765 break 18766 } 18767 v.reset(OpConst64) 18768 v.AuxInt = c 18769 return true 18770 } 18771 return false 18772 } 18773 func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { 18774 b := v.Block 18775 _ = b 18776 config := b.Func.Config 18777 _ = config 18778 typ := &b.Func.Config.Types 18779 _ = typ 18780 // match: (PtrIndex <t> ptr idx) 18781 // cond: config.PtrSize == 4 18782 // result: (AddPtr ptr (Mul32 <typ.Int> idx (Const32 <typ.Int> [t.ElemType().Size()]))) 18783 for { 18784 t := v.Type 18785 _ = v.Args[1] 18786 ptr := v.Args[0] 18787 idx := v.Args[1] 18788 if !(config.PtrSize == 4) { 18789 break 18790 } 18791 v.reset(OpAddPtr) 18792 v.AddArg(ptr) 18793 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) 18794 v0.AddArg(idx) 18795 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 18796 v1.AuxInt = t.ElemType().Size() 18797 v0.AddArg(v1) 18798 v.AddArg(v0) 18799 return true 18800 } 18801 // match: (PtrIndex <t> ptr idx) 18802 // cond: config.PtrSize == 8 18803 // result: (AddPtr ptr (Mul64 <typ.Int> idx (Const64 <typ.Int> [t.ElemType().Size()]))) 18804 for { 18805 t := v.Type 18806 _ = v.Args[1] 18807 ptr := v.Args[0] 18808 idx := v.Args[1] 18809 if !(config.PtrSize == 8) { 18810 break 18811 } 18812 v.reset(OpAddPtr) 18813 v.AddArg(ptr) 18814 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) 18815 v0.AddArg(idx) 18816 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 18817 v1.AuxInt = t.ElemType().Size() 18818 v0.AddArg(v1) 18819 v.AddArg(v0) 18820 return true 18821 } 18822 return false 18823 } 18824 func rewriteValuegeneric_OpRound32F_0(v *Value) bool { 18825 // match: (Round32F x:(Const32F)) 18826 // cond: 18827 // result: x 18828 for { 18829 x := v.Args[0] 18830 if x.Op != OpConst32F { 18831 break 18832 } 18833 v.reset(OpCopy) 18834 v.Type = x.Type 18835 v.AddArg(x) 18836 return true 18837 } 18838 return false 18839 } 18840 func rewriteValuegeneric_OpRound64F_0(v *Value) bool { 18841 // match: (Round64F x:(Const64F)) 18842 // cond: 18843 // result: x 18844 for { 18845 x := v.Args[0] 18846 if x.Op != OpConst64F { 18847 break 18848 } 18849 v.reset(OpCopy) 18850 v.Type = x.Type 18851 v.AddArg(x) 18852 return true 18853 } 18854 return false 18855 } 18856 func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { 18857 b := v.Block 18858 _ = b 18859 // match: (Rsh16Ux16 <t> x (Const16 [c])) 18860 // cond: 18861 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))])) 18862 for { 18863 t := v.Type 18864 _ = v.Args[1] 18865 x := v.Args[0] 18866 v_1 := v.Args[1] 18867 if v_1.Op != OpConst16 { 18868 break 18869 } 18870 c := v_1.AuxInt 18871 v.reset(OpRsh16Ux64) 18872 v.AddArg(x) 18873 v0 := b.NewValue0(v.Pos, OpConst64, t) 18874 v0.AuxInt = int64(uint16(c)) 18875 v.AddArg(v0) 18876 return true 18877 } 18878 // match: (Rsh16Ux16 (Const16 [0]) _) 18879 // cond: 18880 // result: (Const16 [0]) 18881 for { 18882 _ = v.Args[1] 18883 v_0 := v.Args[0] 18884 if v_0.Op != OpConst16 { 18885 break 18886 } 18887 if v_0.AuxInt != 0 { 18888 break 18889 } 18890 v.reset(OpConst16) 18891 v.AuxInt = 0 18892 return true 18893 } 18894 return false 18895 } 18896 func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { 18897 b := v.Block 18898 _ = b 18899 // match: (Rsh16Ux32 <t> x (Const32 [c])) 18900 // cond: 18901 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))])) 18902 for { 18903 t := v.Type 18904 _ = v.Args[1] 18905 x := v.Args[0] 18906 v_1 := v.Args[1] 18907 if v_1.Op != OpConst32 { 18908 break 18909 } 18910 c := v_1.AuxInt 18911 v.reset(OpRsh16Ux64) 18912 v.AddArg(x) 18913 v0 := b.NewValue0(v.Pos, OpConst64, t) 18914 v0.AuxInt = int64(uint32(c)) 18915 v.AddArg(v0) 18916 return true 18917 } 18918 // match: (Rsh16Ux32 (Const16 [0]) _) 18919 // cond: 18920 // result: (Const16 [0]) 18921 for { 18922 _ = v.Args[1] 18923 v_0 := v.Args[0] 18924 if v_0.Op != OpConst16 { 18925 break 18926 } 18927 if v_0.AuxInt != 0 { 18928 break 18929 } 18930 v.reset(OpConst16) 18931 v.AuxInt = 0 18932 return true 18933 } 18934 return false 18935 } 18936 func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { 18937 b := v.Block 18938 _ = b 18939 typ := &b.Func.Config.Types 18940 _ = typ 18941 // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) 18942 // cond: 18943 // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) 18944 for { 18945 _ = v.Args[1] 18946 v_0 := v.Args[0] 18947 if v_0.Op != OpConst16 { 18948 break 18949 } 18950 c := v_0.AuxInt 18951 v_1 := v.Args[1] 18952 if v_1.Op != OpConst64 { 18953 break 18954 } 18955 d := v_1.AuxInt 18956 v.reset(OpConst16) 18957 v.AuxInt = int64(int16(uint16(c) >> uint64(d))) 18958 return true 18959 } 18960 // match: (Rsh16Ux64 x (Const64 [0])) 18961 // cond: 18962 // result: x 18963 for { 18964 _ = v.Args[1] 18965 x := v.Args[0] 18966 v_1 := v.Args[1] 18967 if v_1.Op != OpConst64 { 18968 break 18969 } 18970 if v_1.AuxInt != 0 { 18971 break 18972 } 18973 v.reset(OpCopy) 18974 v.Type = x.Type 18975 v.AddArg(x) 18976 return true 18977 } 18978 // match: (Rsh16Ux64 (Const16 [0]) _) 18979 // cond: 18980 // result: (Const16 [0]) 18981 for { 18982 _ = v.Args[1] 18983 v_0 := v.Args[0] 18984 if v_0.Op != OpConst16 { 18985 break 18986 } 18987 if v_0.AuxInt != 0 { 18988 break 18989 } 18990 v.reset(OpConst16) 18991 v.AuxInt = 0 18992 return true 18993 } 18994 // match: (Rsh16Ux64 _ (Const64 [c])) 18995 // cond: uint64(c) >= 16 18996 // result: (Const16 [0]) 18997 for { 18998 _ = v.Args[1] 18999 v_1 := v.Args[1] 19000 if v_1.Op != OpConst64 { 19001 break 19002 } 19003 c := v_1.AuxInt 19004 if !(uint64(c) >= 16) { 19005 break 19006 } 19007 v.reset(OpConst16) 19008 v.AuxInt = 0 19009 return true 19010 } 19011 // match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) 19012 // cond: !uaddOvf(c,d) 19013 // result: (Rsh16Ux64 x (Const64 <t> [c+d])) 19014 for { 19015 t := v.Type 19016 _ = v.Args[1] 19017 v_0 := v.Args[0] 19018 if v_0.Op != OpRsh16Ux64 { 19019 break 19020 } 19021 _ = v_0.Args[1] 19022 x := v_0.Args[0] 19023 v_0_1 := v_0.Args[1] 19024 if v_0_1.Op != OpConst64 { 19025 break 19026 } 19027 c := v_0_1.AuxInt 19028 v_1 := v.Args[1] 19029 if v_1.Op != OpConst64 { 19030 break 19031 } 19032 d := v_1.AuxInt 19033 if !(!uaddOvf(c, d)) { 19034 break 19035 } 19036 v.reset(OpRsh16Ux64) 19037 v.AddArg(x) 19038 v0 := b.NewValue0(v.Pos, OpConst64, t) 19039 v0.AuxInt = c + d 19040 v.AddArg(v0) 19041 return true 19042 } 19043 // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 19044 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 19045 // result: (Rsh16Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 19046 for { 19047 _ = v.Args[1] 19048 v_0 := v.Args[0] 19049 if v_0.Op != OpLsh16x64 { 19050 break 19051 } 19052 _ = v_0.Args[1] 19053 v_0_0 := v_0.Args[0] 19054 if v_0_0.Op != OpRsh16Ux64 { 19055 break 19056 } 19057 _ = v_0_0.Args[1] 19058 x := v_0_0.Args[0] 19059 v_0_0_1 := v_0_0.Args[1] 19060 if v_0_0_1.Op != OpConst64 { 19061 break 19062 } 19063 c1 := v_0_0_1.AuxInt 19064 v_0_1 := v_0.Args[1] 19065 if v_0_1.Op != OpConst64 { 19066 break 19067 } 19068 c2 := v_0_1.AuxInt 19069 v_1 := v.Args[1] 19070 if v_1.Op != OpConst64 { 19071 break 19072 } 19073 c3 := v_1.AuxInt 19074 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 19075 break 19076 } 19077 v.reset(OpRsh16Ux64) 19078 v.AddArg(x) 19079 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 19080 v0.AuxInt = c1 - c2 + c3 19081 v.AddArg(v0) 19082 return true 19083 } 19084 // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 19085 // cond: 19086 // result: (ZeroExt8to16 (Trunc16to8 <typ.UInt8> x)) 19087 for { 19088 _ = v.Args[1] 19089 v_0 := v.Args[0] 19090 if v_0.Op != OpLsh16x64 { 19091 break 19092 } 19093 _ = v_0.Args[1] 19094 x := v_0.Args[0] 19095 v_0_1 := v_0.Args[1] 19096 if v_0_1.Op != OpConst64 { 19097 break 19098 } 19099 if v_0_1.AuxInt != 8 { 19100 break 19101 } 19102 v_1 := v.Args[1] 19103 if v_1.Op != OpConst64 { 19104 break 19105 } 19106 if v_1.AuxInt != 8 { 19107 break 19108 } 19109 v.reset(OpZeroExt8to16) 19110 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) 19111 v0.AddArg(x) 19112 v.AddArg(v0) 19113 return true 19114 } 19115 return false 19116 } 19117 func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { 19118 b := v.Block 19119 _ = b 19120 // match: (Rsh16Ux8 <t> x (Const8 [c])) 19121 // cond: 19122 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))])) 19123 for { 19124 t := v.Type 19125 _ = v.Args[1] 19126 x := v.Args[0] 19127 v_1 := v.Args[1] 19128 if v_1.Op != OpConst8 { 19129 break 19130 } 19131 c := v_1.AuxInt 19132 v.reset(OpRsh16Ux64) 19133 v.AddArg(x) 19134 v0 := b.NewValue0(v.Pos, OpConst64, t) 19135 v0.AuxInt = int64(uint8(c)) 19136 v.AddArg(v0) 19137 return true 19138 } 19139 // match: (Rsh16Ux8 (Const16 [0]) _) 19140 // cond: 19141 // result: (Const16 [0]) 19142 for { 19143 _ = v.Args[1] 19144 v_0 := v.Args[0] 19145 if v_0.Op != OpConst16 { 19146 break 19147 } 19148 if v_0.AuxInt != 0 { 19149 break 19150 } 19151 v.reset(OpConst16) 19152 v.AuxInt = 0 19153 return true 19154 } 19155 return false 19156 } 19157 func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { 19158 b := v.Block 19159 _ = b 19160 // match: (Rsh16x16 <t> x (Const16 [c])) 19161 // cond: 19162 // result: (Rsh16x64 x (Const64 <t> [int64(uint16(c))])) 19163 for { 19164 t := v.Type 19165 _ = v.Args[1] 19166 x := v.Args[0] 19167 v_1 := v.Args[1] 19168 if v_1.Op != OpConst16 { 19169 break 19170 } 19171 c := v_1.AuxInt 19172 v.reset(OpRsh16x64) 19173 v.AddArg(x) 19174 v0 := b.NewValue0(v.Pos, OpConst64, t) 19175 v0.AuxInt = int64(uint16(c)) 19176 v.AddArg(v0) 19177 return true 19178 } 19179 // match: (Rsh16x16 (Const16 [0]) _) 19180 // cond: 19181 // result: (Const16 [0]) 19182 for { 19183 _ = v.Args[1] 19184 v_0 := v.Args[0] 19185 if v_0.Op != OpConst16 { 19186 break 19187 } 19188 if v_0.AuxInt != 0 { 19189 break 19190 } 19191 v.reset(OpConst16) 19192 v.AuxInt = 0 19193 return true 19194 } 19195 return false 19196 } 19197 func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { 19198 b := v.Block 19199 _ = b 19200 // match: (Rsh16x32 <t> x (Const32 [c])) 19201 // cond: 19202 // result: (Rsh16x64 x (Const64 <t> [int64(uint32(c))])) 19203 for { 19204 t := v.Type 19205 _ = v.Args[1] 19206 x := v.Args[0] 19207 v_1 := v.Args[1] 19208 if v_1.Op != OpConst32 { 19209 break 19210 } 19211 c := v_1.AuxInt 19212 v.reset(OpRsh16x64) 19213 v.AddArg(x) 19214 v0 := b.NewValue0(v.Pos, OpConst64, t) 19215 v0.AuxInt = int64(uint32(c)) 19216 v.AddArg(v0) 19217 return true 19218 } 19219 // match: (Rsh16x32 (Const16 [0]) _) 19220 // cond: 19221 // result: (Const16 [0]) 19222 for { 19223 _ = v.Args[1] 19224 v_0 := v.Args[0] 19225 if v_0.Op != OpConst16 { 19226 break 19227 } 19228 if v_0.AuxInt != 0 { 19229 break 19230 } 19231 v.reset(OpConst16) 19232 v.AuxInt = 0 19233 return true 19234 } 19235 return false 19236 } 19237 func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { 19238 b := v.Block 19239 _ = b 19240 typ := &b.Func.Config.Types 19241 _ = typ 19242 // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) 19243 // cond: 19244 // result: (Const16 [int64(int16(c) >> uint64(d))]) 19245 for { 19246 _ = v.Args[1] 19247 v_0 := v.Args[0] 19248 if v_0.Op != OpConst16 { 19249 break 19250 } 19251 c := v_0.AuxInt 19252 v_1 := v.Args[1] 19253 if v_1.Op != OpConst64 { 19254 break 19255 } 19256 d := v_1.AuxInt 19257 v.reset(OpConst16) 19258 v.AuxInt = int64(int16(c) >> uint64(d)) 19259 return true 19260 } 19261 // match: (Rsh16x64 x (Const64 [0])) 19262 // cond: 19263 // result: x 19264 for { 19265 _ = v.Args[1] 19266 x := v.Args[0] 19267 v_1 := v.Args[1] 19268 if v_1.Op != OpConst64 { 19269 break 19270 } 19271 if v_1.AuxInt != 0 { 19272 break 19273 } 19274 v.reset(OpCopy) 19275 v.Type = x.Type 19276 v.AddArg(x) 19277 return true 19278 } 19279 // match: (Rsh16x64 (Const16 [0]) _) 19280 // cond: 19281 // result: (Const16 [0]) 19282 for { 19283 _ = v.Args[1] 19284 v_0 := v.Args[0] 19285 if v_0.Op != OpConst16 { 19286 break 19287 } 19288 if v_0.AuxInt != 0 { 19289 break 19290 } 19291 v.reset(OpConst16) 19292 v.AuxInt = 0 19293 return true 19294 } 19295 // match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d])) 19296 // cond: !uaddOvf(c,d) 19297 // result: (Rsh16x64 x (Const64 <t> [c+d])) 19298 for { 19299 t := v.Type 19300 _ = v.Args[1] 19301 v_0 := v.Args[0] 19302 if v_0.Op != OpRsh16x64 { 19303 break 19304 } 19305 _ = v_0.Args[1] 19306 x := v_0.Args[0] 19307 v_0_1 := v_0.Args[1] 19308 if v_0_1.Op != OpConst64 { 19309 break 19310 } 19311 c := v_0_1.AuxInt 19312 v_1 := v.Args[1] 19313 if v_1.Op != OpConst64 { 19314 break 19315 } 19316 d := v_1.AuxInt 19317 if !(!uaddOvf(c, d)) { 19318 break 19319 } 19320 v.reset(OpRsh16x64) 19321 v.AddArg(x) 19322 v0 := b.NewValue0(v.Pos, OpConst64, t) 19323 v0.AuxInt = c + d 19324 v.AddArg(v0) 19325 return true 19326 } 19327 // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 19328 // cond: 19329 // result: (SignExt8to16 (Trunc16to8 <typ.Int8> x)) 19330 for { 19331 _ = v.Args[1] 19332 v_0 := v.Args[0] 19333 if v_0.Op != OpLsh16x64 { 19334 break 19335 } 19336 _ = v_0.Args[1] 19337 x := v_0.Args[0] 19338 v_0_1 := v_0.Args[1] 19339 if v_0_1.Op != OpConst64 { 19340 break 19341 } 19342 if v_0_1.AuxInt != 8 { 19343 break 19344 } 19345 v_1 := v.Args[1] 19346 if v_1.Op != OpConst64 { 19347 break 19348 } 19349 if v_1.AuxInt != 8 { 19350 break 19351 } 19352 v.reset(OpSignExt8to16) 19353 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) 19354 v0.AddArg(x) 19355 v.AddArg(v0) 19356 return true 19357 } 19358 return false 19359 } 19360 func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { 19361 b := v.Block 19362 _ = b 19363 // match: (Rsh16x8 <t> x (Const8 [c])) 19364 // cond: 19365 // result: (Rsh16x64 x (Const64 <t> [int64(uint8(c))])) 19366 for { 19367 t := v.Type 19368 _ = v.Args[1] 19369 x := v.Args[0] 19370 v_1 := v.Args[1] 19371 if v_1.Op != OpConst8 { 19372 break 19373 } 19374 c := v_1.AuxInt 19375 v.reset(OpRsh16x64) 19376 v.AddArg(x) 19377 v0 := b.NewValue0(v.Pos, OpConst64, t) 19378 v0.AuxInt = int64(uint8(c)) 19379 v.AddArg(v0) 19380 return true 19381 } 19382 // match: (Rsh16x8 (Const16 [0]) _) 19383 // cond: 19384 // result: (Const16 [0]) 19385 for { 19386 _ = v.Args[1] 19387 v_0 := v.Args[0] 19388 if v_0.Op != OpConst16 { 19389 break 19390 } 19391 if v_0.AuxInt != 0 { 19392 break 19393 } 19394 v.reset(OpConst16) 19395 v.AuxInt = 0 19396 return true 19397 } 19398 return false 19399 } 19400 func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { 19401 b := v.Block 19402 _ = b 19403 // match: (Rsh32Ux16 <t> x (Const16 [c])) 19404 // cond: 19405 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))])) 19406 for { 19407 t := v.Type 19408 _ = v.Args[1] 19409 x := v.Args[0] 19410 v_1 := v.Args[1] 19411 if v_1.Op != OpConst16 { 19412 break 19413 } 19414 c := v_1.AuxInt 19415 v.reset(OpRsh32Ux64) 19416 v.AddArg(x) 19417 v0 := b.NewValue0(v.Pos, OpConst64, t) 19418 v0.AuxInt = int64(uint16(c)) 19419 v.AddArg(v0) 19420 return true 19421 } 19422 // match: (Rsh32Ux16 (Const32 [0]) _) 19423 // cond: 19424 // result: (Const32 [0]) 19425 for { 19426 _ = v.Args[1] 19427 v_0 := v.Args[0] 19428 if v_0.Op != OpConst32 { 19429 break 19430 } 19431 if v_0.AuxInt != 0 { 19432 break 19433 } 19434 v.reset(OpConst32) 19435 v.AuxInt = 0 19436 return true 19437 } 19438 return false 19439 } 19440 func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { 19441 b := v.Block 19442 _ = b 19443 // match: (Rsh32Ux32 <t> x (Const32 [c])) 19444 // cond: 19445 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))])) 19446 for { 19447 t := v.Type 19448 _ = v.Args[1] 19449 x := v.Args[0] 19450 v_1 := v.Args[1] 19451 if v_1.Op != OpConst32 { 19452 break 19453 } 19454 c := v_1.AuxInt 19455 v.reset(OpRsh32Ux64) 19456 v.AddArg(x) 19457 v0 := b.NewValue0(v.Pos, OpConst64, t) 19458 v0.AuxInt = int64(uint32(c)) 19459 v.AddArg(v0) 19460 return true 19461 } 19462 // match: (Rsh32Ux32 (Const32 [0]) _) 19463 // cond: 19464 // result: (Const32 [0]) 19465 for { 19466 _ = v.Args[1] 19467 v_0 := v.Args[0] 19468 if v_0.Op != OpConst32 { 19469 break 19470 } 19471 if v_0.AuxInt != 0 { 19472 break 19473 } 19474 v.reset(OpConst32) 19475 v.AuxInt = 0 19476 return true 19477 } 19478 return false 19479 } 19480 func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { 19481 b := v.Block 19482 _ = b 19483 typ := &b.Func.Config.Types 19484 _ = typ 19485 // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) 19486 // cond: 19487 // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) 19488 for { 19489 _ = v.Args[1] 19490 v_0 := v.Args[0] 19491 if v_0.Op != OpConst32 { 19492 break 19493 } 19494 c := v_0.AuxInt 19495 v_1 := v.Args[1] 19496 if v_1.Op != OpConst64 { 19497 break 19498 } 19499 d := v_1.AuxInt 19500 v.reset(OpConst32) 19501 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 19502 return true 19503 } 19504 // match: (Rsh32Ux64 x (Const64 [0])) 19505 // cond: 19506 // result: x 19507 for { 19508 _ = v.Args[1] 19509 x := v.Args[0] 19510 v_1 := v.Args[1] 19511 if v_1.Op != OpConst64 { 19512 break 19513 } 19514 if v_1.AuxInt != 0 { 19515 break 19516 } 19517 v.reset(OpCopy) 19518 v.Type = x.Type 19519 v.AddArg(x) 19520 return true 19521 } 19522 // match: (Rsh32Ux64 (Const32 [0]) _) 19523 // cond: 19524 // result: (Const32 [0]) 19525 for { 19526 _ = v.Args[1] 19527 v_0 := v.Args[0] 19528 if v_0.Op != OpConst32 { 19529 break 19530 } 19531 if v_0.AuxInt != 0 { 19532 break 19533 } 19534 v.reset(OpConst32) 19535 v.AuxInt = 0 19536 return true 19537 } 19538 // match: (Rsh32Ux64 _ (Const64 [c])) 19539 // cond: uint64(c) >= 32 19540 // result: (Const32 [0]) 19541 for { 19542 _ = v.Args[1] 19543 v_1 := v.Args[1] 19544 if v_1.Op != OpConst64 { 19545 break 19546 } 19547 c := v_1.AuxInt 19548 if !(uint64(c) >= 32) { 19549 break 19550 } 19551 v.reset(OpConst32) 19552 v.AuxInt = 0 19553 return true 19554 } 19555 // match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) 19556 // cond: !uaddOvf(c,d) 19557 // result: (Rsh32Ux64 x (Const64 <t> [c+d])) 19558 for { 19559 t := v.Type 19560 _ = v.Args[1] 19561 v_0 := v.Args[0] 19562 if v_0.Op != OpRsh32Ux64 { 19563 break 19564 } 19565 _ = v_0.Args[1] 19566 x := v_0.Args[0] 19567 v_0_1 := v_0.Args[1] 19568 if v_0_1.Op != OpConst64 { 19569 break 19570 } 19571 c := v_0_1.AuxInt 19572 v_1 := v.Args[1] 19573 if v_1.Op != OpConst64 { 19574 break 19575 } 19576 d := v_1.AuxInt 19577 if !(!uaddOvf(c, d)) { 19578 break 19579 } 19580 v.reset(OpRsh32Ux64) 19581 v.AddArg(x) 19582 v0 := b.NewValue0(v.Pos, OpConst64, t) 19583 v0.AuxInt = c + d 19584 v.AddArg(v0) 19585 return true 19586 } 19587 // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 19588 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 19589 // result: (Rsh32Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 19590 for { 19591 _ = v.Args[1] 19592 v_0 := v.Args[0] 19593 if v_0.Op != OpLsh32x64 { 19594 break 19595 } 19596 _ = v_0.Args[1] 19597 v_0_0 := v_0.Args[0] 19598 if v_0_0.Op != OpRsh32Ux64 { 19599 break 19600 } 19601 _ = v_0_0.Args[1] 19602 x := v_0_0.Args[0] 19603 v_0_0_1 := v_0_0.Args[1] 19604 if v_0_0_1.Op != OpConst64 { 19605 break 19606 } 19607 c1 := v_0_0_1.AuxInt 19608 v_0_1 := v_0.Args[1] 19609 if v_0_1.Op != OpConst64 { 19610 break 19611 } 19612 c2 := v_0_1.AuxInt 19613 v_1 := v.Args[1] 19614 if v_1.Op != OpConst64 { 19615 break 19616 } 19617 c3 := v_1.AuxInt 19618 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 19619 break 19620 } 19621 v.reset(OpRsh32Ux64) 19622 v.AddArg(x) 19623 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 19624 v0.AuxInt = c1 - c2 + c3 19625 v.AddArg(v0) 19626 return true 19627 } 19628 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 19629 // cond: 19630 // result: (ZeroExt8to32 (Trunc32to8 <typ.UInt8> x)) 19631 for { 19632 _ = v.Args[1] 19633 v_0 := v.Args[0] 19634 if v_0.Op != OpLsh32x64 { 19635 break 19636 } 19637 _ = v_0.Args[1] 19638 x := v_0.Args[0] 19639 v_0_1 := v_0.Args[1] 19640 if v_0_1.Op != OpConst64 { 19641 break 19642 } 19643 if v_0_1.AuxInt != 24 { 19644 break 19645 } 19646 v_1 := v.Args[1] 19647 if v_1.Op != OpConst64 { 19648 break 19649 } 19650 if v_1.AuxInt != 24 { 19651 break 19652 } 19653 v.reset(OpZeroExt8to32) 19654 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) 19655 v0.AddArg(x) 19656 v.AddArg(v0) 19657 return true 19658 } 19659 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 19660 // cond: 19661 // result: (ZeroExt16to32 (Trunc32to16 <typ.UInt16> x)) 19662 for { 19663 _ = v.Args[1] 19664 v_0 := v.Args[0] 19665 if v_0.Op != OpLsh32x64 { 19666 break 19667 } 19668 _ = v_0.Args[1] 19669 x := v_0.Args[0] 19670 v_0_1 := v_0.Args[1] 19671 if v_0_1.Op != OpConst64 { 19672 break 19673 } 19674 if v_0_1.AuxInt != 16 { 19675 break 19676 } 19677 v_1 := v.Args[1] 19678 if v_1.Op != OpConst64 { 19679 break 19680 } 19681 if v_1.AuxInt != 16 { 19682 break 19683 } 19684 v.reset(OpZeroExt16to32) 19685 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) 19686 v0.AddArg(x) 19687 v.AddArg(v0) 19688 return true 19689 } 19690 return false 19691 } 19692 func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { 19693 b := v.Block 19694 _ = b 19695 // match: (Rsh32Ux8 <t> x (Const8 [c])) 19696 // cond: 19697 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))])) 19698 for { 19699 t := v.Type 19700 _ = v.Args[1] 19701 x := v.Args[0] 19702 v_1 := v.Args[1] 19703 if v_1.Op != OpConst8 { 19704 break 19705 } 19706 c := v_1.AuxInt 19707 v.reset(OpRsh32Ux64) 19708 v.AddArg(x) 19709 v0 := b.NewValue0(v.Pos, OpConst64, t) 19710 v0.AuxInt = int64(uint8(c)) 19711 v.AddArg(v0) 19712 return true 19713 } 19714 // match: (Rsh32Ux8 (Const32 [0]) _) 19715 // cond: 19716 // result: (Const32 [0]) 19717 for { 19718 _ = v.Args[1] 19719 v_0 := v.Args[0] 19720 if v_0.Op != OpConst32 { 19721 break 19722 } 19723 if v_0.AuxInt != 0 { 19724 break 19725 } 19726 v.reset(OpConst32) 19727 v.AuxInt = 0 19728 return true 19729 } 19730 return false 19731 } 19732 func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { 19733 b := v.Block 19734 _ = b 19735 // match: (Rsh32x16 <t> x (Const16 [c])) 19736 // cond: 19737 // result: (Rsh32x64 x (Const64 <t> [int64(uint16(c))])) 19738 for { 19739 t := v.Type 19740 _ = v.Args[1] 19741 x := v.Args[0] 19742 v_1 := v.Args[1] 19743 if v_1.Op != OpConst16 { 19744 break 19745 } 19746 c := v_1.AuxInt 19747 v.reset(OpRsh32x64) 19748 v.AddArg(x) 19749 v0 := b.NewValue0(v.Pos, OpConst64, t) 19750 v0.AuxInt = int64(uint16(c)) 19751 v.AddArg(v0) 19752 return true 19753 } 19754 // match: (Rsh32x16 (Const32 [0]) _) 19755 // cond: 19756 // result: (Const32 [0]) 19757 for { 19758 _ = v.Args[1] 19759 v_0 := v.Args[0] 19760 if v_0.Op != OpConst32 { 19761 break 19762 } 19763 if v_0.AuxInt != 0 { 19764 break 19765 } 19766 v.reset(OpConst32) 19767 v.AuxInt = 0 19768 return true 19769 } 19770 return false 19771 } 19772 func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { 19773 b := v.Block 19774 _ = b 19775 // match: (Rsh32x32 <t> x (Const32 [c])) 19776 // cond: 19777 // result: (Rsh32x64 x (Const64 <t> [int64(uint32(c))])) 19778 for { 19779 t := v.Type 19780 _ = v.Args[1] 19781 x := v.Args[0] 19782 v_1 := v.Args[1] 19783 if v_1.Op != OpConst32 { 19784 break 19785 } 19786 c := v_1.AuxInt 19787 v.reset(OpRsh32x64) 19788 v.AddArg(x) 19789 v0 := b.NewValue0(v.Pos, OpConst64, t) 19790 v0.AuxInt = int64(uint32(c)) 19791 v.AddArg(v0) 19792 return true 19793 } 19794 // match: (Rsh32x32 (Const32 [0]) _) 19795 // cond: 19796 // result: (Const32 [0]) 19797 for { 19798 _ = v.Args[1] 19799 v_0 := v.Args[0] 19800 if v_0.Op != OpConst32 { 19801 break 19802 } 19803 if v_0.AuxInt != 0 { 19804 break 19805 } 19806 v.reset(OpConst32) 19807 v.AuxInt = 0 19808 return true 19809 } 19810 return false 19811 } 19812 func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { 19813 b := v.Block 19814 _ = b 19815 typ := &b.Func.Config.Types 19816 _ = typ 19817 // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) 19818 // cond: 19819 // result: (Const32 [int64(int32(c) >> uint64(d))]) 19820 for { 19821 _ = v.Args[1] 19822 v_0 := v.Args[0] 19823 if v_0.Op != OpConst32 { 19824 break 19825 } 19826 c := v_0.AuxInt 19827 v_1 := v.Args[1] 19828 if v_1.Op != OpConst64 { 19829 break 19830 } 19831 d := v_1.AuxInt 19832 v.reset(OpConst32) 19833 v.AuxInt = int64(int32(c) >> uint64(d)) 19834 return true 19835 } 19836 // match: (Rsh32x64 x (Const64 [0])) 19837 // cond: 19838 // result: x 19839 for { 19840 _ = v.Args[1] 19841 x := v.Args[0] 19842 v_1 := v.Args[1] 19843 if v_1.Op != OpConst64 { 19844 break 19845 } 19846 if v_1.AuxInt != 0 { 19847 break 19848 } 19849 v.reset(OpCopy) 19850 v.Type = x.Type 19851 v.AddArg(x) 19852 return true 19853 } 19854 // match: (Rsh32x64 (Const32 [0]) _) 19855 // cond: 19856 // result: (Const32 [0]) 19857 for { 19858 _ = v.Args[1] 19859 v_0 := v.Args[0] 19860 if v_0.Op != OpConst32 { 19861 break 19862 } 19863 if v_0.AuxInt != 0 { 19864 break 19865 } 19866 v.reset(OpConst32) 19867 v.AuxInt = 0 19868 return true 19869 } 19870 // match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d])) 19871 // cond: !uaddOvf(c,d) 19872 // result: (Rsh32x64 x (Const64 <t> [c+d])) 19873 for { 19874 t := v.Type 19875 _ = v.Args[1] 19876 v_0 := v.Args[0] 19877 if v_0.Op != OpRsh32x64 { 19878 break 19879 } 19880 _ = v_0.Args[1] 19881 x := v_0.Args[0] 19882 v_0_1 := v_0.Args[1] 19883 if v_0_1.Op != OpConst64 { 19884 break 19885 } 19886 c := v_0_1.AuxInt 19887 v_1 := v.Args[1] 19888 if v_1.Op != OpConst64 { 19889 break 19890 } 19891 d := v_1.AuxInt 19892 if !(!uaddOvf(c, d)) { 19893 break 19894 } 19895 v.reset(OpRsh32x64) 19896 v.AddArg(x) 19897 v0 := b.NewValue0(v.Pos, OpConst64, t) 19898 v0.AuxInt = c + d 19899 v.AddArg(v0) 19900 return true 19901 } 19902 // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 19903 // cond: 19904 // result: (SignExt8to32 (Trunc32to8 <typ.Int8> x)) 19905 for { 19906 _ = v.Args[1] 19907 v_0 := v.Args[0] 19908 if v_0.Op != OpLsh32x64 { 19909 break 19910 } 19911 _ = v_0.Args[1] 19912 x := v_0.Args[0] 19913 v_0_1 := v_0.Args[1] 19914 if v_0_1.Op != OpConst64 { 19915 break 19916 } 19917 if v_0_1.AuxInt != 24 { 19918 break 19919 } 19920 v_1 := v.Args[1] 19921 if v_1.Op != OpConst64 { 19922 break 19923 } 19924 if v_1.AuxInt != 24 { 19925 break 19926 } 19927 v.reset(OpSignExt8to32) 19928 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) 19929 v0.AddArg(x) 19930 v.AddArg(v0) 19931 return true 19932 } 19933 // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 19934 // cond: 19935 // result: (SignExt16to32 (Trunc32to16 <typ.Int16> x)) 19936 for { 19937 _ = v.Args[1] 19938 v_0 := v.Args[0] 19939 if v_0.Op != OpLsh32x64 { 19940 break 19941 } 19942 _ = v_0.Args[1] 19943 x := v_0.Args[0] 19944 v_0_1 := v_0.Args[1] 19945 if v_0_1.Op != OpConst64 { 19946 break 19947 } 19948 if v_0_1.AuxInt != 16 { 19949 break 19950 } 19951 v_1 := v.Args[1] 19952 if v_1.Op != OpConst64 { 19953 break 19954 } 19955 if v_1.AuxInt != 16 { 19956 break 19957 } 19958 v.reset(OpSignExt16to32) 19959 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) 19960 v0.AddArg(x) 19961 v.AddArg(v0) 19962 return true 19963 } 19964 return false 19965 } 19966 func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { 19967 b := v.Block 19968 _ = b 19969 // match: (Rsh32x8 <t> x (Const8 [c])) 19970 // cond: 19971 // result: (Rsh32x64 x (Const64 <t> [int64(uint8(c))])) 19972 for { 19973 t := v.Type 19974 _ = v.Args[1] 19975 x := v.Args[0] 19976 v_1 := v.Args[1] 19977 if v_1.Op != OpConst8 { 19978 break 19979 } 19980 c := v_1.AuxInt 19981 v.reset(OpRsh32x64) 19982 v.AddArg(x) 19983 v0 := b.NewValue0(v.Pos, OpConst64, t) 19984 v0.AuxInt = int64(uint8(c)) 19985 v.AddArg(v0) 19986 return true 19987 } 19988 // match: (Rsh32x8 (Const32 [0]) _) 19989 // cond: 19990 // result: (Const32 [0]) 19991 for { 19992 _ = v.Args[1] 19993 v_0 := v.Args[0] 19994 if v_0.Op != OpConst32 { 19995 break 19996 } 19997 if v_0.AuxInt != 0 { 19998 break 19999 } 20000 v.reset(OpConst32) 20001 v.AuxInt = 0 20002 return true 20003 } 20004 return false 20005 } 20006 func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { 20007 b := v.Block 20008 _ = b 20009 // match: (Rsh64Ux16 <t> x (Const16 [c])) 20010 // cond: 20011 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))])) 20012 for { 20013 t := v.Type 20014 _ = v.Args[1] 20015 x := v.Args[0] 20016 v_1 := v.Args[1] 20017 if v_1.Op != OpConst16 { 20018 break 20019 } 20020 c := v_1.AuxInt 20021 v.reset(OpRsh64Ux64) 20022 v.AddArg(x) 20023 v0 := b.NewValue0(v.Pos, OpConst64, t) 20024 v0.AuxInt = int64(uint16(c)) 20025 v.AddArg(v0) 20026 return true 20027 } 20028 // match: (Rsh64Ux16 (Const64 [0]) _) 20029 // cond: 20030 // result: (Const64 [0]) 20031 for { 20032 _ = v.Args[1] 20033 v_0 := v.Args[0] 20034 if v_0.Op != OpConst64 { 20035 break 20036 } 20037 if v_0.AuxInt != 0 { 20038 break 20039 } 20040 v.reset(OpConst64) 20041 v.AuxInt = 0 20042 return true 20043 } 20044 return false 20045 } 20046 func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { 20047 b := v.Block 20048 _ = b 20049 // match: (Rsh64Ux32 <t> x (Const32 [c])) 20050 // cond: 20051 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))])) 20052 for { 20053 t := v.Type 20054 _ = v.Args[1] 20055 x := v.Args[0] 20056 v_1 := v.Args[1] 20057 if v_1.Op != OpConst32 { 20058 break 20059 } 20060 c := v_1.AuxInt 20061 v.reset(OpRsh64Ux64) 20062 v.AddArg(x) 20063 v0 := b.NewValue0(v.Pos, OpConst64, t) 20064 v0.AuxInt = int64(uint32(c)) 20065 v.AddArg(v0) 20066 return true 20067 } 20068 // match: (Rsh64Ux32 (Const64 [0]) _) 20069 // cond: 20070 // result: (Const64 [0]) 20071 for { 20072 _ = v.Args[1] 20073 v_0 := v.Args[0] 20074 if v_0.Op != OpConst64 { 20075 break 20076 } 20077 if v_0.AuxInt != 0 { 20078 break 20079 } 20080 v.reset(OpConst64) 20081 v.AuxInt = 0 20082 return true 20083 } 20084 return false 20085 } 20086 func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { 20087 b := v.Block 20088 _ = b 20089 typ := &b.Func.Config.Types 20090 _ = typ 20091 // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) 20092 // cond: 20093 // result: (Const64 [int64(uint64(c) >> uint64(d))]) 20094 for { 20095 _ = v.Args[1] 20096 v_0 := v.Args[0] 20097 if v_0.Op != OpConst64 { 20098 break 20099 } 20100 c := v_0.AuxInt 20101 v_1 := v.Args[1] 20102 if v_1.Op != OpConst64 { 20103 break 20104 } 20105 d := v_1.AuxInt 20106 v.reset(OpConst64) 20107 v.AuxInt = int64(uint64(c) >> uint64(d)) 20108 return true 20109 } 20110 // match: (Rsh64Ux64 x (Const64 [0])) 20111 // cond: 20112 // result: x 20113 for { 20114 _ = v.Args[1] 20115 x := v.Args[0] 20116 v_1 := v.Args[1] 20117 if v_1.Op != OpConst64 { 20118 break 20119 } 20120 if v_1.AuxInt != 0 { 20121 break 20122 } 20123 v.reset(OpCopy) 20124 v.Type = x.Type 20125 v.AddArg(x) 20126 return true 20127 } 20128 // match: (Rsh64Ux64 (Const64 [0]) _) 20129 // cond: 20130 // result: (Const64 [0]) 20131 for { 20132 _ = v.Args[1] 20133 v_0 := v.Args[0] 20134 if v_0.Op != OpConst64 { 20135 break 20136 } 20137 if v_0.AuxInt != 0 { 20138 break 20139 } 20140 v.reset(OpConst64) 20141 v.AuxInt = 0 20142 return true 20143 } 20144 // match: (Rsh64Ux64 _ (Const64 [c])) 20145 // cond: uint64(c) >= 64 20146 // result: (Const64 [0]) 20147 for { 20148 _ = v.Args[1] 20149 v_1 := v.Args[1] 20150 if v_1.Op != OpConst64 { 20151 break 20152 } 20153 c := v_1.AuxInt 20154 if !(uint64(c) >= 64) { 20155 break 20156 } 20157 v.reset(OpConst64) 20158 v.AuxInt = 0 20159 return true 20160 } 20161 // match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) 20162 // cond: !uaddOvf(c,d) 20163 // result: (Rsh64Ux64 x (Const64 <t> [c+d])) 20164 for { 20165 t := v.Type 20166 _ = v.Args[1] 20167 v_0 := v.Args[0] 20168 if v_0.Op != OpRsh64Ux64 { 20169 break 20170 } 20171 _ = v_0.Args[1] 20172 x := v_0.Args[0] 20173 v_0_1 := v_0.Args[1] 20174 if v_0_1.Op != OpConst64 { 20175 break 20176 } 20177 c := v_0_1.AuxInt 20178 v_1 := v.Args[1] 20179 if v_1.Op != OpConst64 { 20180 break 20181 } 20182 d := v_1.AuxInt 20183 if !(!uaddOvf(c, d)) { 20184 break 20185 } 20186 v.reset(OpRsh64Ux64) 20187 v.AddArg(x) 20188 v0 := b.NewValue0(v.Pos, OpConst64, t) 20189 v0.AuxInt = c + d 20190 v.AddArg(v0) 20191 return true 20192 } 20193 // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 20194 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 20195 // result: (Rsh64Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 20196 for { 20197 _ = v.Args[1] 20198 v_0 := v.Args[0] 20199 if v_0.Op != OpLsh64x64 { 20200 break 20201 } 20202 _ = v_0.Args[1] 20203 v_0_0 := v_0.Args[0] 20204 if v_0_0.Op != OpRsh64Ux64 { 20205 break 20206 } 20207 _ = v_0_0.Args[1] 20208 x := v_0_0.Args[0] 20209 v_0_0_1 := v_0_0.Args[1] 20210 if v_0_0_1.Op != OpConst64 { 20211 break 20212 } 20213 c1 := v_0_0_1.AuxInt 20214 v_0_1 := v_0.Args[1] 20215 if v_0_1.Op != OpConst64 { 20216 break 20217 } 20218 c2 := v_0_1.AuxInt 20219 v_1 := v.Args[1] 20220 if v_1.Op != OpConst64 { 20221 break 20222 } 20223 c3 := v_1.AuxInt 20224 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 20225 break 20226 } 20227 v.reset(OpRsh64Ux64) 20228 v.AddArg(x) 20229 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 20230 v0.AuxInt = c1 - c2 + c3 20231 v.AddArg(v0) 20232 return true 20233 } 20234 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 20235 // cond: 20236 // result: (ZeroExt8to64 (Trunc64to8 <typ.UInt8> x)) 20237 for { 20238 _ = v.Args[1] 20239 v_0 := v.Args[0] 20240 if v_0.Op != OpLsh64x64 { 20241 break 20242 } 20243 _ = v_0.Args[1] 20244 x := v_0.Args[0] 20245 v_0_1 := v_0.Args[1] 20246 if v_0_1.Op != OpConst64 { 20247 break 20248 } 20249 if v_0_1.AuxInt != 56 { 20250 break 20251 } 20252 v_1 := v.Args[1] 20253 if v_1.Op != OpConst64 { 20254 break 20255 } 20256 if v_1.AuxInt != 56 { 20257 break 20258 } 20259 v.reset(OpZeroExt8to64) 20260 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) 20261 v0.AddArg(x) 20262 v.AddArg(v0) 20263 return true 20264 } 20265 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 20266 // cond: 20267 // result: (ZeroExt16to64 (Trunc64to16 <typ.UInt16> x)) 20268 for { 20269 _ = v.Args[1] 20270 v_0 := v.Args[0] 20271 if v_0.Op != OpLsh64x64 { 20272 break 20273 } 20274 _ = v_0.Args[1] 20275 x := v_0.Args[0] 20276 v_0_1 := v_0.Args[1] 20277 if v_0_1.Op != OpConst64 { 20278 break 20279 } 20280 if v_0_1.AuxInt != 48 { 20281 break 20282 } 20283 v_1 := v.Args[1] 20284 if v_1.Op != OpConst64 { 20285 break 20286 } 20287 if v_1.AuxInt != 48 { 20288 break 20289 } 20290 v.reset(OpZeroExt16to64) 20291 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) 20292 v0.AddArg(x) 20293 v.AddArg(v0) 20294 return true 20295 } 20296 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 20297 // cond: 20298 // result: (ZeroExt32to64 (Trunc64to32 <typ.UInt32> x)) 20299 for { 20300 _ = v.Args[1] 20301 v_0 := v.Args[0] 20302 if v_0.Op != OpLsh64x64 { 20303 break 20304 } 20305 _ = v_0.Args[1] 20306 x := v_0.Args[0] 20307 v_0_1 := v_0.Args[1] 20308 if v_0_1.Op != OpConst64 { 20309 break 20310 } 20311 if v_0_1.AuxInt != 32 { 20312 break 20313 } 20314 v_1 := v.Args[1] 20315 if v_1.Op != OpConst64 { 20316 break 20317 } 20318 if v_1.AuxInt != 32 { 20319 break 20320 } 20321 v.reset(OpZeroExt32to64) 20322 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) 20323 v0.AddArg(x) 20324 v.AddArg(v0) 20325 return true 20326 } 20327 return false 20328 } 20329 func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { 20330 b := v.Block 20331 _ = b 20332 // match: (Rsh64Ux8 <t> x (Const8 [c])) 20333 // cond: 20334 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))])) 20335 for { 20336 t := v.Type 20337 _ = v.Args[1] 20338 x := v.Args[0] 20339 v_1 := v.Args[1] 20340 if v_1.Op != OpConst8 { 20341 break 20342 } 20343 c := v_1.AuxInt 20344 v.reset(OpRsh64Ux64) 20345 v.AddArg(x) 20346 v0 := b.NewValue0(v.Pos, OpConst64, t) 20347 v0.AuxInt = int64(uint8(c)) 20348 v.AddArg(v0) 20349 return true 20350 } 20351 // match: (Rsh64Ux8 (Const64 [0]) _) 20352 // cond: 20353 // result: (Const64 [0]) 20354 for { 20355 _ = v.Args[1] 20356 v_0 := v.Args[0] 20357 if v_0.Op != OpConst64 { 20358 break 20359 } 20360 if v_0.AuxInt != 0 { 20361 break 20362 } 20363 v.reset(OpConst64) 20364 v.AuxInt = 0 20365 return true 20366 } 20367 return false 20368 } 20369 func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { 20370 b := v.Block 20371 _ = b 20372 // match: (Rsh64x16 <t> x (Const16 [c])) 20373 // cond: 20374 // result: (Rsh64x64 x (Const64 <t> [int64(uint16(c))])) 20375 for { 20376 t := v.Type 20377 _ = v.Args[1] 20378 x := v.Args[0] 20379 v_1 := v.Args[1] 20380 if v_1.Op != OpConst16 { 20381 break 20382 } 20383 c := v_1.AuxInt 20384 v.reset(OpRsh64x64) 20385 v.AddArg(x) 20386 v0 := b.NewValue0(v.Pos, OpConst64, t) 20387 v0.AuxInt = int64(uint16(c)) 20388 v.AddArg(v0) 20389 return true 20390 } 20391 // match: (Rsh64x16 (Const64 [0]) _) 20392 // cond: 20393 // result: (Const64 [0]) 20394 for { 20395 _ = v.Args[1] 20396 v_0 := v.Args[0] 20397 if v_0.Op != OpConst64 { 20398 break 20399 } 20400 if v_0.AuxInt != 0 { 20401 break 20402 } 20403 v.reset(OpConst64) 20404 v.AuxInt = 0 20405 return true 20406 } 20407 return false 20408 } 20409 func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { 20410 b := v.Block 20411 _ = b 20412 // match: (Rsh64x32 <t> x (Const32 [c])) 20413 // cond: 20414 // result: (Rsh64x64 x (Const64 <t> [int64(uint32(c))])) 20415 for { 20416 t := v.Type 20417 _ = v.Args[1] 20418 x := v.Args[0] 20419 v_1 := v.Args[1] 20420 if v_1.Op != OpConst32 { 20421 break 20422 } 20423 c := v_1.AuxInt 20424 v.reset(OpRsh64x64) 20425 v.AddArg(x) 20426 v0 := b.NewValue0(v.Pos, OpConst64, t) 20427 v0.AuxInt = int64(uint32(c)) 20428 v.AddArg(v0) 20429 return true 20430 } 20431 // match: (Rsh64x32 (Const64 [0]) _) 20432 // cond: 20433 // result: (Const64 [0]) 20434 for { 20435 _ = v.Args[1] 20436 v_0 := v.Args[0] 20437 if v_0.Op != OpConst64 { 20438 break 20439 } 20440 if v_0.AuxInt != 0 { 20441 break 20442 } 20443 v.reset(OpConst64) 20444 v.AuxInt = 0 20445 return true 20446 } 20447 return false 20448 } 20449 func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { 20450 b := v.Block 20451 _ = b 20452 typ := &b.Func.Config.Types 20453 _ = typ 20454 // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) 20455 // cond: 20456 // result: (Const64 [c >> uint64(d)]) 20457 for { 20458 _ = v.Args[1] 20459 v_0 := v.Args[0] 20460 if v_0.Op != OpConst64 { 20461 break 20462 } 20463 c := v_0.AuxInt 20464 v_1 := v.Args[1] 20465 if v_1.Op != OpConst64 { 20466 break 20467 } 20468 d := v_1.AuxInt 20469 v.reset(OpConst64) 20470 v.AuxInt = c >> uint64(d) 20471 return true 20472 } 20473 // match: (Rsh64x64 x (Const64 [0])) 20474 // cond: 20475 // result: x 20476 for { 20477 _ = v.Args[1] 20478 x := v.Args[0] 20479 v_1 := v.Args[1] 20480 if v_1.Op != OpConst64 { 20481 break 20482 } 20483 if v_1.AuxInt != 0 { 20484 break 20485 } 20486 v.reset(OpCopy) 20487 v.Type = x.Type 20488 v.AddArg(x) 20489 return true 20490 } 20491 // match: (Rsh64x64 (Const64 [0]) _) 20492 // cond: 20493 // result: (Const64 [0]) 20494 for { 20495 _ = v.Args[1] 20496 v_0 := v.Args[0] 20497 if v_0.Op != OpConst64 { 20498 break 20499 } 20500 if v_0.AuxInt != 0 { 20501 break 20502 } 20503 v.reset(OpConst64) 20504 v.AuxInt = 0 20505 return true 20506 } 20507 // match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d])) 20508 // cond: !uaddOvf(c,d) 20509 // result: (Rsh64x64 x (Const64 <t> [c+d])) 20510 for { 20511 t := v.Type 20512 _ = v.Args[1] 20513 v_0 := v.Args[0] 20514 if v_0.Op != OpRsh64x64 { 20515 break 20516 } 20517 _ = v_0.Args[1] 20518 x := v_0.Args[0] 20519 v_0_1 := v_0.Args[1] 20520 if v_0_1.Op != OpConst64 { 20521 break 20522 } 20523 c := v_0_1.AuxInt 20524 v_1 := v.Args[1] 20525 if v_1.Op != OpConst64 { 20526 break 20527 } 20528 d := v_1.AuxInt 20529 if !(!uaddOvf(c, d)) { 20530 break 20531 } 20532 v.reset(OpRsh64x64) 20533 v.AddArg(x) 20534 v0 := b.NewValue0(v.Pos, OpConst64, t) 20535 v0.AuxInt = c + d 20536 v.AddArg(v0) 20537 return true 20538 } 20539 // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 20540 // cond: 20541 // result: (SignExt8to64 (Trunc64to8 <typ.Int8> x)) 20542 for { 20543 _ = v.Args[1] 20544 v_0 := v.Args[0] 20545 if v_0.Op != OpLsh64x64 { 20546 break 20547 } 20548 _ = v_0.Args[1] 20549 x := v_0.Args[0] 20550 v_0_1 := v_0.Args[1] 20551 if v_0_1.Op != OpConst64 { 20552 break 20553 } 20554 if v_0_1.AuxInt != 56 { 20555 break 20556 } 20557 v_1 := v.Args[1] 20558 if v_1.Op != OpConst64 { 20559 break 20560 } 20561 if v_1.AuxInt != 56 { 20562 break 20563 } 20564 v.reset(OpSignExt8to64) 20565 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) 20566 v0.AddArg(x) 20567 v.AddArg(v0) 20568 return true 20569 } 20570 // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 20571 // cond: 20572 // result: (SignExt16to64 (Trunc64to16 <typ.Int16> x)) 20573 for { 20574 _ = v.Args[1] 20575 v_0 := v.Args[0] 20576 if v_0.Op != OpLsh64x64 { 20577 break 20578 } 20579 _ = v_0.Args[1] 20580 x := v_0.Args[0] 20581 v_0_1 := v_0.Args[1] 20582 if v_0_1.Op != OpConst64 { 20583 break 20584 } 20585 if v_0_1.AuxInt != 48 { 20586 break 20587 } 20588 v_1 := v.Args[1] 20589 if v_1.Op != OpConst64 { 20590 break 20591 } 20592 if v_1.AuxInt != 48 { 20593 break 20594 } 20595 v.reset(OpSignExt16to64) 20596 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) 20597 v0.AddArg(x) 20598 v.AddArg(v0) 20599 return true 20600 } 20601 // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 20602 // cond: 20603 // result: (SignExt32to64 (Trunc64to32 <typ.Int32> x)) 20604 for { 20605 _ = v.Args[1] 20606 v_0 := v.Args[0] 20607 if v_0.Op != OpLsh64x64 { 20608 break 20609 } 20610 _ = v_0.Args[1] 20611 x := v_0.Args[0] 20612 v_0_1 := v_0.Args[1] 20613 if v_0_1.Op != OpConst64 { 20614 break 20615 } 20616 if v_0_1.AuxInt != 32 { 20617 break 20618 } 20619 v_1 := v.Args[1] 20620 if v_1.Op != OpConst64 { 20621 break 20622 } 20623 if v_1.AuxInt != 32 { 20624 break 20625 } 20626 v.reset(OpSignExt32to64) 20627 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) 20628 v0.AddArg(x) 20629 v.AddArg(v0) 20630 return true 20631 } 20632 return false 20633 } 20634 func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { 20635 b := v.Block 20636 _ = b 20637 // match: (Rsh64x8 <t> x (Const8 [c])) 20638 // cond: 20639 // result: (Rsh64x64 x (Const64 <t> [int64(uint8(c))])) 20640 for { 20641 t := v.Type 20642 _ = v.Args[1] 20643 x := v.Args[0] 20644 v_1 := v.Args[1] 20645 if v_1.Op != OpConst8 { 20646 break 20647 } 20648 c := v_1.AuxInt 20649 v.reset(OpRsh64x64) 20650 v.AddArg(x) 20651 v0 := b.NewValue0(v.Pos, OpConst64, t) 20652 v0.AuxInt = int64(uint8(c)) 20653 v.AddArg(v0) 20654 return true 20655 } 20656 // match: (Rsh64x8 (Const64 [0]) _) 20657 // cond: 20658 // result: (Const64 [0]) 20659 for { 20660 _ = v.Args[1] 20661 v_0 := v.Args[0] 20662 if v_0.Op != OpConst64 { 20663 break 20664 } 20665 if v_0.AuxInt != 0 { 20666 break 20667 } 20668 v.reset(OpConst64) 20669 v.AuxInt = 0 20670 return true 20671 } 20672 return false 20673 } 20674 func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { 20675 b := v.Block 20676 _ = b 20677 // match: (Rsh8Ux16 <t> x (Const16 [c])) 20678 // cond: 20679 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))])) 20680 for { 20681 t := v.Type 20682 _ = v.Args[1] 20683 x := v.Args[0] 20684 v_1 := v.Args[1] 20685 if v_1.Op != OpConst16 { 20686 break 20687 } 20688 c := v_1.AuxInt 20689 v.reset(OpRsh8Ux64) 20690 v.AddArg(x) 20691 v0 := b.NewValue0(v.Pos, OpConst64, t) 20692 v0.AuxInt = int64(uint16(c)) 20693 v.AddArg(v0) 20694 return true 20695 } 20696 // match: (Rsh8Ux16 (Const8 [0]) _) 20697 // cond: 20698 // result: (Const8 [0]) 20699 for { 20700 _ = v.Args[1] 20701 v_0 := v.Args[0] 20702 if v_0.Op != OpConst8 { 20703 break 20704 } 20705 if v_0.AuxInt != 0 { 20706 break 20707 } 20708 v.reset(OpConst8) 20709 v.AuxInt = 0 20710 return true 20711 } 20712 return false 20713 } 20714 func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { 20715 b := v.Block 20716 _ = b 20717 // match: (Rsh8Ux32 <t> x (Const32 [c])) 20718 // cond: 20719 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))])) 20720 for { 20721 t := v.Type 20722 _ = v.Args[1] 20723 x := v.Args[0] 20724 v_1 := v.Args[1] 20725 if v_1.Op != OpConst32 { 20726 break 20727 } 20728 c := v_1.AuxInt 20729 v.reset(OpRsh8Ux64) 20730 v.AddArg(x) 20731 v0 := b.NewValue0(v.Pos, OpConst64, t) 20732 v0.AuxInt = int64(uint32(c)) 20733 v.AddArg(v0) 20734 return true 20735 } 20736 // match: (Rsh8Ux32 (Const8 [0]) _) 20737 // cond: 20738 // result: (Const8 [0]) 20739 for { 20740 _ = v.Args[1] 20741 v_0 := v.Args[0] 20742 if v_0.Op != OpConst8 { 20743 break 20744 } 20745 if v_0.AuxInt != 0 { 20746 break 20747 } 20748 v.reset(OpConst8) 20749 v.AuxInt = 0 20750 return true 20751 } 20752 return false 20753 } 20754 func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { 20755 b := v.Block 20756 _ = b 20757 typ := &b.Func.Config.Types 20758 _ = typ 20759 // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) 20760 // cond: 20761 // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) 20762 for { 20763 _ = v.Args[1] 20764 v_0 := v.Args[0] 20765 if v_0.Op != OpConst8 { 20766 break 20767 } 20768 c := v_0.AuxInt 20769 v_1 := v.Args[1] 20770 if v_1.Op != OpConst64 { 20771 break 20772 } 20773 d := v_1.AuxInt 20774 v.reset(OpConst8) 20775 v.AuxInt = int64(int8(uint8(c) >> uint64(d))) 20776 return true 20777 } 20778 // match: (Rsh8Ux64 x (Const64 [0])) 20779 // cond: 20780 // result: x 20781 for { 20782 _ = v.Args[1] 20783 x := v.Args[0] 20784 v_1 := v.Args[1] 20785 if v_1.Op != OpConst64 { 20786 break 20787 } 20788 if v_1.AuxInt != 0 { 20789 break 20790 } 20791 v.reset(OpCopy) 20792 v.Type = x.Type 20793 v.AddArg(x) 20794 return true 20795 } 20796 // match: (Rsh8Ux64 (Const8 [0]) _) 20797 // cond: 20798 // result: (Const8 [0]) 20799 for { 20800 _ = v.Args[1] 20801 v_0 := v.Args[0] 20802 if v_0.Op != OpConst8 { 20803 break 20804 } 20805 if v_0.AuxInt != 0 { 20806 break 20807 } 20808 v.reset(OpConst8) 20809 v.AuxInt = 0 20810 return true 20811 } 20812 // match: (Rsh8Ux64 _ (Const64 [c])) 20813 // cond: uint64(c) >= 8 20814 // result: (Const8 [0]) 20815 for { 20816 _ = v.Args[1] 20817 v_1 := v.Args[1] 20818 if v_1.Op != OpConst64 { 20819 break 20820 } 20821 c := v_1.AuxInt 20822 if !(uint64(c) >= 8) { 20823 break 20824 } 20825 v.reset(OpConst8) 20826 v.AuxInt = 0 20827 return true 20828 } 20829 // match: (Rsh8Ux64 <t> (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) 20830 // cond: !uaddOvf(c,d) 20831 // result: (Rsh8Ux64 x (Const64 <t> [c+d])) 20832 for { 20833 t := v.Type 20834 _ = v.Args[1] 20835 v_0 := v.Args[0] 20836 if v_0.Op != OpRsh8Ux64 { 20837 break 20838 } 20839 _ = v_0.Args[1] 20840 x := v_0.Args[0] 20841 v_0_1 := v_0.Args[1] 20842 if v_0_1.Op != OpConst64 { 20843 break 20844 } 20845 c := v_0_1.AuxInt 20846 v_1 := v.Args[1] 20847 if v_1.Op != OpConst64 { 20848 break 20849 } 20850 d := v_1.AuxInt 20851 if !(!uaddOvf(c, d)) { 20852 break 20853 } 20854 v.reset(OpRsh8Ux64) 20855 v.AddArg(x) 20856 v0 := b.NewValue0(v.Pos, OpConst64, t) 20857 v0.AuxInt = c + d 20858 v.AddArg(v0) 20859 return true 20860 } 20861 // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 20862 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 20863 // result: (Rsh8Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 20864 for { 20865 _ = v.Args[1] 20866 v_0 := v.Args[0] 20867 if v_0.Op != OpLsh8x64 { 20868 break 20869 } 20870 _ = v_0.Args[1] 20871 v_0_0 := v_0.Args[0] 20872 if v_0_0.Op != OpRsh8Ux64 { 20873 break 20874 } 20875 _ = v_0_0.Args[1] 20876 x := v_0_0.Args[0] 20877 v_0_0_1 := v_0_0.Args[1] 20878 if v_0_0_1.Op != OpConst64 { 20879 break 20880 } 20881 c1 := v_0_0_1.AuxInt 20882 v_0_1 := v_0.Args[1] 20883 if v_0_1.Op != OpConst64 { 20884 break 20885 } 20886 c2 := v_0_1.AuxInt 20887 v_1 := v.Args[1] 20888 if v_1.Op != OpConst64 { 20889 break 20890 } 20891 c3 := v_1.AuxInt 20892 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 20893 break 20894 } 20895 v.reset(OpRsh8Ux64) 20896 v.AddArg(x) 20897 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 20898 v0.AuxInt = c1 - c2 + c3 20899 v.AddArg(v0) 20900 return true 20901 } 20902 return false 20903 } 20904 func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { 20905 b := v.Block 20906 _ = b 20907 // match: (Rsh8Ux8 <t> x (Const8 [c])) 20908 // cond: 20909 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))])) 20910 for { 20911 t := v.Type 20912 _ = v.Args[1] 20913 x := v.Args[0] 20914 v_1 := v.Args[1] 20915 if v_1.Op != OpConst8 { 20916 break 20917 } 20918 c := v_1.AuxInt 20919 v.reset(OpRsh8Ux64) 20920 v.AddArg(x) 20921 v0 := b.NewValue0(v.Pos, OpConst64, t) 20922 v0.AuxInt = int64(uint8(c)) 20923 v.AddArg(v0) 20924 return true 20925 } 20926 // match: (Rsh8Ux8 (Const8 [0]) _) 20927 // cond: 20928 // result: (Const8 [0]) 20929 for { 20930 _ = v.Args[1] 20931 v_0 := v.Args[0] 20932 if v_0.Op != OpConst8 { 20933 break 20934 } 20935 if v_0.AuxInt != 0 { 20936 break 20937 } 20938 v.reset(OpConst8) 20939 v.AuxInt = 0 20940 return true 20941 } 20942 return false 20943 } 20944 func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { 20945 b := v.Block 20946 _ = b 20947 // match: (Rsh8x16 <t> x (Const16 [c])) 20948 // cond: 20949 // result: (Rsh8x64 x (Const64 <t> [int64(uint16(c))])) 20950 for { 20951 t := v.Type 20952 _ = v.Args[1] 20953 x := v.Args[0] 20954 v_1 := v.Args[1] 20955 if v_1.Op != OpConst16 { 20956 break 20957 } 20958 c := v_1.AuxInt 20959 v.reset(OpRsh8x64) 20960 v.AddArg(x) 20961 v0 := b.NewValue0(v.Pos, OpConst64, t) 20962 v0.AuxInt = int64(uint16(c)) 20963 v.AddArg(v0) 20964 return true 20965 } 20966 // match: (Rsh8x16 (Const8 [0]) _) 20967 // cond: 20968 // result: (Const8 [0]) 20969 for { 20970 _ = v.Args[1] 20971 v_0 := v.Args[0] 20972 if v_0.Op != OpConst8 { 20973 break 20974 } 20975 if v_0.AuxInt != 0 { 20976 break 20977 } 20978 v.reset(OpConst8) 20979 v.AuxInt = 0 20980 return true 20981 } 20982 return false 20983 } 20984 func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { 20985 b := v.Block 20986 _ = b 20987 // match: (Rsh8x32 <t> x (Const32 [c])) 20988 // cond: 20989 // result: (Rsh8x64 x (Const64 <t> [int64(uint32(c))])) 20990 for { 20991 t := v.Type 20992 _ = v.Args[1] 20993 x := v.Args[0] 20994 v_1 := v.Args[1] 20995 if v_1.Op != OpConst32 { 20996 break 20997 } 20998 c := v_1.AuxInt 20999 v.reset(OpRsh8x64) 21000 v.AddArg(x) 21001 v0 := b.NewValue0(v.Pos, OpConst64, t) 21002 v0.AuxInt = int64(uint32(c)) 21003 v.AddArg(v0) 21004 return true 21005 } 21006 // match: (Rsh8x32 (Const8 [0]) _) 21007 // cond: 21008 // result: (Const8 [0]) 21009 for { 21010 _ = v.Args[1] 21011 v_0 := v.Args[0] 21012 if v_0.Op != OpConst8 { 21013 break 21014 } 21015 if v_0.AuxInt != 0 { 21016 break 21017 } 21018 v.reset(OpConst8) 21019 v.AuxInt = 0 21020 return true 21021 } 21022 return false 21023 } 21024 func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { 21025 b := v.Block 21026 _ = b 21027 // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) 21028 // cond: 21029 // result: (Const8 [int64(int8(c) >> uint64(d))]) 21030 for { 21031 _ = v.Args[1] 21032 v_0 := v.Args[0] 21033 if v_0.Op != OpConst8 { 21034 break 21035 } 21036 c := v_0.AuxInt 21037 v_1 := v.Args[1] 21038 if v_1.Op != OpConst64 { 21039 break 21040 } 21041 d := v_1.AuxInt 21042 v.reset(OpConst8) 21043 v.AuxInt = int64(int8(c) >> uint64(d)) 21044 return true 21045 } 21046 // match: (Rsh8x64 x (Const64 [0])) 21047 // cond: 21048 // result: x 21049 for { 21050 _ = v.Args[1] 21051 x := v.Args[0] 21052 v_1 := v.Args[1] 21053 if v_1.Op != OpConst64 { 21054 break 21055 } 21056 if v_1.AuxInt != 0 { 21057 break 21058 } 21059 v.reset(OpCopy) 21060 v.Type = x.Type 21061 v.AddArg(x) 21062 return true 21063 } 21064 // match: (Rsh8x64 (Const8 [0]) _) 21065 // cond: 21066 // result: (Const8 [0]) 21067 for { 21068 _ = v.Args[1] 21069 v_0 := v.Args[0] 21070 if v_0.Op != OpConst8 { 21071 break 21072 } 21073 if v_0.AuxInt != 0 { 21074 break 21075 } 21076 v.reset(OpConst8) 21077 v.AuxInt = 0 21078 return true 21079 } 21080 // match: (Rsh8x64 <t> (Rsh8x64 x (Const64 [c])) (Const64 [d])) 21081 // cond: !uaddOvf(c,d) 21082 // result: (Rsh8x64 x (Const64 <t> [c+d])) 21083 for { 21084 t := v.Type 21085 _ = v.Args[1] 21086 v_0 := v.Args[0] 21087 if v_0.Op != OpRsh8x64 { 21088 break 21089 } 21090 _ = v_0.Args[1] 21091 x := v_0.Args[0] 21092 v_0_1 := v_0.Args[1] 21093 if v_0_1.Op != OpConst64 { 21094 break 21095 } 21096 c := v_0_1.AuxInt 21097 v_1 := v.Args[1] 21098 if v_1.Op != OpConst64 { 21099 break 21100 } 21101 d := v_1.AuxInt 21102 if !(!uaddOvf(c, d)) { 21103 break 21104 } 21105 v.reset(OpRsh8x64) 21106 v.AddArg(x) 21107 v0 := b.NewValue0(v.Pos, OpConst64, t) 21108 v0.AuxInt = c + d 21109 v.AddArg(v0) 21110 return true 21111 } 21112 return false 21113 } 21114 func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { 21115 b := v.Block 21116 _ = b 21117 // match: (Rsh8x8 <t> x (Const8 [c])) 21118 // cond: 21119 // result: (Rsh8x64 x (Const64 <t> [int64(uint8(c))])) 21120 for { 21121 t := v.Type 21122 _ = v.Args[1] 21123 x := v.Args[0] 21124 v_1 := v.Args[1] 21125 if v_1.Op != OpConst8 { 21126 break 21127 } 21128 c := v_1.AuxInt 21129 v.reset(OpRsh8x64) 21130 v.AddArg(x) 21131 v0 := b.NewValue0(v.Pos, OpConst64, t) 21132 v0.AuxInt = int64(uint8(c)) 21133 v.AddArg(v0) 21134 return true 21135 } 21136 // match: (Rsh8x8 (Const8 [0]) _) 21137 // cond: 21138 // result: (Const8 [0]) 21139 for { 21140 _ = v.Args[1] 21141 v_0 := v.Args[0] 21142 if v_0.Op != OpConst8 { 21143 break 21144 } 21145 if v_0.AuxInt != 0 { 21146 break 21147 } 21148 v.reset(OpConst8) 21149 v.AuxInt = 0 21150 return true 21151 } 21152 return false 21153 } 21154 func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { 21155 // match: (SignExt16to32 (Const16 [c])) 21156 // cond: 21157 // result: (Const32 [int64( int16(c))]) 21158 for { 21159 v_0 := v.Args[0] 21160 if v_0.Op != OpConst16 { 21161 break 21162 } 21163 c := v_0.AuxInt 21164 v.reset(OpConst32) 21165 v.AuxInt = int64(int16(c)) 21166 return true 21167 } 21168 // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) 21169 // cond: s >= 16 21170 // result: x 21171 for { 21172 v_0 := v.Args[0] 21173 if v_0.Op != OpTrunc32to16 { 21174 break 21175 } 21176 x := v_0.Args[0] 21177 if x.Op != OpRsh32x64 { 21178 break 21179 } 21180 _ = x.Args[1] 21181 x_1 := x.Args[1] 21182 if x_1.Op != OpConst64 { 21183 break 21184 } 21185 s := x_1.AuxInt 21186 if !(s >= 16) { 21187 break 21188 } 21189 v.reset(OpCopy) 21190 v.Type = x.Type 21191 v.AddArg(x) 21192 return true 21193 } 21194 return false 21195 } 21196 func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { 21197 // match: (SignExt16to64 (Const16 [c])) 21198 // cond: 21199 // result: (Const64 [int64( int16(c))]) 21200 for { 21201 v_0 := v.Args[0] 21202 if v_0.Op != OpConst16 { 21203 break 21204 } 21205 c := v_0.AuxInt 21206 v.reset(OpConst64) 21207 v.AuxInt = int64(int16(c)) 21208 return true 21209 } 21210 // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) 21211 // cond: s >= 48 21212 // result: x 21213 for { 21214 v_0 := v.Args[0] 21215 if v_0.Op != OpTrunc64to16 { 21216 break 21217 } 21218 x := v_0.Args[0] 21219 if x.Op != OpRsh64x64 { 21220 break 21221 } 21222 _ = x.Args[1] 21223 x_1 := x.Args[1] 21224 if x_1.Op != OpConst64 { 21225 break 21226 } 21227 s := x_1.AuxInt 21228 if !(s >= 48) { 21229 break 21230 } 21231 v.reset(OpCopy) 21232 v.Type = x.Type 21233 v.AddArg(x) 21234 return true 21235 } 21236 return false 21237 } 21238 func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { 21239 // match: (SignExt32to64 (Const32 [c])) 21240 // cond: 21241 // result: (Const64 [int64( int32(c))]) 21242 for { 21243 v_0 := v.Args[0] 21244 if v_0.Op != OpConst32 { 21245 break 21246 } 21247 c := v_0.AuxInt 21248 v.reset(OpConst64) 21249 v.AuxInt = int64(int32(c)) 21250 return true 21251 } 21252 // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) 21253 // cond: s >= 32 21254 // result: x 21255 for { 21256 v_0 := v.Args[0] 21257 if v_0.Op != OpTrunc64to32 { 21258 break 21259 } 21260 x := v_0.Args[0] 21261 if x.Op != OpRsh64x64 { 21262 break 21263 } 21264 _ = x.Args[1] 21265 x_1 := x.Args[1] 21266 if x_1.Op != OpConst64 { 21267 break 21268 } 21269 s := x_1.AuxInt 21270 if !(s >= 32) { 21271 break 21272 } 21273 v.reset(OpCopy) 21274 v.Type = x.Type 21275 v.AddArg(x) 21276 return true 21277 } 21278 return false 21279 } 21280 func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { 21281 // match: (SignExt8to16 (Const8 [c])) 21282 // cond: 21283 // result: (Const16 [int64( int8(c))]) 21284 for { 21285 v_0 := v.Args[0] 21286 if v_0.Op != OpConst8 { 21287 break 21288 } 21289 c := v_0.AuxInt 21290 v.reset(OpConst16) 21291 v.AuxInt = int64(int8(c)) 21292 return true 21293 } 21294 // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) 21295 // cond: s >= 8 21296 // result: x 21297 for { 21298 v_0 := v.Args[0] 21299 if v_0.Op != OpTrunc16to8 { 21300 break 21301 } 21302 x := v_0.Args[0] 21303 if x.Op != OpRsh16x64 { 21304 break 21305 } 21306 _ = x.Args[1] 21307 x_1 := x.Args[1] 21308 if x_1.Op != OpConst64 { 21309 break 21310 } 21311 s := x_1.AuxInt 21312 if !(s >= 8) { 21313 break 21314 } 21315 v.reset(OpCopy) 21316 v.Type = x.Type 21317 v.AddArg(x) 21318 return true 21319 } 21320 return false 21321 } 21322 func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { 21323 // match: (SignExt8to32 (Const8 [c])) 21324 // cond: 21325 // result: (Const32 [int64( int8(c))]) 21326 for { 21327 v_0 := v.Args[0] 21328 if v_0.Op != OpConst8 { 21329 break 21330 } 21331 c := v_0.AuxInt 21332 v.reset(OpConst32) 21333 v.AuxInt = int64(int8(c)) 21334 return true 21335 } 21336 // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) 21337 // cond: s >= 24 21338 // result: x 21339 for { 21340 v_0 := v.Args[0] 21341 if v_0.Op != OpTrunc32to8 { 21342 break 21343 } 21344 x := v_0.Args[0] 21345 if x.Op != OpRsh32x64 { 21346 break 21347 } 21348 _ = x.Args[1] 21349 x_1 := x.Args[1] 21350 if x_1.Op != OpConst64 { 21351 break 21352 } 21353 s := x_1.AuxInt 21354 if !(s >= 24) { 21355 break 21356 } 21357 v.reset(OpCopy) 21358 v.Type = x.Type 21359 v.AddArg(x) 21360 return true 21361 } 21362 return false 21363 } 21364 func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { 21365 // match: (SignExt8to64 (Const8 [c])) 21366 // cond: 21367 // result: (Const64 [int64( int8(c))]) 21368 for { 21369 v_0 := v.Args[0] 21370 if v_0.Op != OpConst8 { 21371 break 21372 } 21373 c := v_0.AuxInt 21374 v.reset(OpConst64) 21375 v.AuxInt = int64(int8(c)) 21376 return true 21377 } 21378 // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) 21379 // cond: s >= 56 21380 // result: x 21381 for { 21382 v_0 := v.Args[0] 21383 if v_0.Op != OpTrunc64to8 { 21384 break 21385 } 21386 x := v_0.Args[0] 21387 if x.Op != OpRsh64x64 { 21388 break 21389 } 21390 _ = x.Args[1] 21391 x_1 := x.Args[1] 21392 if x_1.Op != OpConst64 { 21393 break 21394 } 21395 s := x_1.AuxInt 21396 if !(s >= 56) { 21397 break 21398 } 21399 v.reset(OpCopy) 21400 v.Type = x.Type 21401 v.AddArg(x) 21402 return true 21403 } 21404 return false 21405 } 21406 func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { 21407 // match: (SliceCap (SliceMake _ _ (Const64 <t> [c]))) 21408 // cond: 21409 // result: (Const64 <t> [c]) 21410 for { 21411 v_0 := v.Args[0] 21412 if v_0.Op != OpSliceMake { 21413 break 21414 } 21415 _ = v_0.Args[2] 21416 v_0_2 := v_0.Args[2] 21417 if v_0_2.Op != OpConst64 { 21418 break 21419 } 21420 t := v_0_2.Type 21421 c := v_0_2.AuxInt 21422 v.reset(OpConst64) 21423 v.Type = t 21424 v.AuxInt = c 21425 return true 21426 } 21427 // match: (SliceCap (SliceMake _ _ (Const32 <t> [c]))) 21428 // cond: 21429 // result: (Const32 <t> [c]) 21430 for { 21431 v_0 := v.Args[0] 21432 if v_0.Op != OpSliceMake { 21433 break 21434 } 21435 _ = v_0.Args[2] 21436 v_0_2 := v_0.Args[2] 21437 if v_0_2.Op != OpConst32 { 21438 break 21439 } 21440 t := v_0_2.Type 21441 c := v_0_2.AuxInt 21442 v.reset(OpConst32) 21443 v.Type = t 21444 v.AuxInt = c 21445 return true 21446 } 21447 // match: (SliceCap (SliceMake _ _ (SliceCap x))) 21448 // cond: 21449 // result: (SliceCap x) 21450 for { 21451 v_0 := v.Args[0] 21452 if v_0.Op != OpSliceMake { 21453 break 21454 } 21455 _ = v_0.Args[2] 21456 v_0_2 := v_0.Args[2] 21457 if v_0_2.Op != OpSliceCap { 21458 break 21459 } 21460 x := v_0_2.Args[0] 21461 v.reset(OpSliceCap) 21462 v.AddArg(x) 21463 return true 21464 } 21465 // match: (SliceCap (SliceMake _ _ (SliceLen x))) 21466 // cond: 21467 // result: (SliceLen x) 21468 for { 21469 v_0 := v.Args[0] 21470 if v_0.Op != OpSliceMake { 21471 break 21472 } 21473 _ = v_0.Args[2] 21474 v_0_2 := v_0.Args[2] 21475 if v_0_2.Op != OpSliceLen { 21476 break 21477 } 21478 x := v_0_2.Args[0] 21479 v.reset(OpSliceLen) 21480 v.AddArg(x) 21481 return true 21482 } 21483 return false 21484 } 21485 func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { 21486 // match: (SliceLen (SliceMake _ (Const64 <t> [c]) _)) 21487 // cond: 21488 // result: (Const64 <t> [c]) 21489 for { 21490 v_0 := v.Args[0] 21491 if v_0.Op != OpSliceMake { 21492 break 21493 } 21494 _ = v_0.Args[2] 21495 v_0_1 := v_0.Args[1] 21496 if v_0_1.Op != OpConst64 { 21497 break 21498 } 21499 t := v_0_1.Type 21500 c := v_0_1.AuxInt 21501 v.reset(OpConst64) 21502 v.Type = t 21503 v.AuxInt = c 21504 return true 21505 } 21506 // match: (SliceLen (SliceMake _ (Const32 <t> [c]) _)) 21507 // cond: 21508 // result: (Const32 <t> [c]) 21509 for { 21510 v_0 := v.Args[0] 21511 if v_0.Op != OpSliceMake { 21512 break 21513 } 21514 _ = v_0.Args[2] 21515 v_0_1 := v_0.Args[1] 21516 if v_0_1.Op != OpConst32 { 21517 break 21518 } 21519 t := v_0_1.Type 21520 c := v_0_1.AuxInt 21521 v.reset(OpConst32) 21522 v.Type = t 21523 v.AuxInt = c 21524 return true 21525 } 21526 // match: (SliceLen (SliceMake _ (SliceLen x) _)) 21527 // cond: 21528 // result: (SliceLen x) 21529 for { 21530 v_0 := v.Args[0] 21531 if v_0.Op != OpSliceMake { 21532 break 21533 } 21534 _ = v_0.Args[2] 21535 v_0_1 := v_0.Args[1] 21536 if v_0_1.Op != OpSliceLen { 21537 break 21538 } 21539 x := v_0_1.Args[0] 21540 v.reset(OpSliceLen) 21541 v.AddArg(x) 21542 return true 21543 } 21544 return false 21545 } 21546 func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { 21547 // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) 21548 // cond: 21549 // result: (SlicePtr x) 21550 for { 21551 v_0 := v.Args[0] 21552 if v_0.Op != OpSliceMake { 21553 break 21554 } 21555 _ = v_0.Args[2] 21556 v_0_0 := v_0.Args[0] 21557 if v_0_0.Op != OpSlicePtr { 21558 break 21559 } 21560 x := v_0_0.Args[0] 21561 v.reset(OpSlicePtr) 21562 v.AddArg(x) 21563 return true 21564 } 21565 return false 21566 } 21567 func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { 21568 // match: (Slicemask (Const32 [x])) 21569 // cond: x > 0 21570 // result: (Const32 [-1]) 21571 for { 21572 v_0 := v.Args[0] 21573 if v_0.Op != OpConst32 { 21574 break 21575 } 21576 x := v_0.AuxInt 21577 if !(x > 0) { 21578 break 21579 } 21580 v.reset(OpConst32) 21581 v.AuxInt = -1 21582 return true 21583 } 21584 // match: (Slicemask (Const32 [0])) 21585 // cond: 21586 // result: (Const32 [0]) 21587 for { 21588 v_0 := v.Args[0] 21589 if v_0.Op != OpConst32 { 21590 break 21591 } 21592 if v_0.AuxInt != 0 { 21593 break 21594 } 21595 v.reset(OpConst32) 21596 v.AuxInt = 0 21597 return true 21598 } 21599 // match: (Slicemask (Const64 [x])) 21600 // cond: x > 0 21601 // result: (Const64 [-1]) 21602 for { 21603 v_0 := v.Args[0] 21604 if v_0.Op != OpConst64 { 21605 break 21606 } 21607 x := v_0.AuxInt 21608 if !(x > 0) { 21609 break 21610 } 21611 v.reset(OpConst64) 21612 v.AuxInt = -1 21613 return true 21614 } 21615 // match: (Slicemask (Const64 [0])) 21616 // cond: 21617 // result: (Const64 [0]) 21618 for { 21619 v_0 := v.Args[0] 21620 if v_0.Op != OpConst64 { 21621 break 21622 } 21623 if v_0.AuxInt != 0 { 21624 break 21625 } 21626 v.reset(OpConst64) 21627 v.AuxInt = 0 21628 return true 21629 } 21630 return false 21631 } 21632 func rewriteValuegeneric_OpSqrt_0(v *Value) bool { 21633 // match: (Sqrt (Const64F [c])) 21634 // cond: 21635 // result: (Const64F [f2i(math.Sqrt(i2f(c)))]) 21636 for { 21637 v_0 := v.Args[0] 21638 if v_0.Op != OpConst64F { 21639 break 21640 } 21641 c := v_0.AuxInt 21642 v.reset(OpConst64F) 21643 v.AuxInt = f2i(math.Sqrt(i2f(c))) 21644 return true 21645 } 21646 return false 21647 } 21648 func rewriteValuegeneric_OpStore_0(v *Value) bool { 21649 b := v.Block 21650 _ = b 21651 fe := b.Func.fe 21652 _ = fe 21653 // match: (Store {t1} p1 (Load <t2> p2 mem) mem) 21654 // cond: isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size() 21655 // result: mem 21656 for { 21657 t1 := v.Aux 21658 _ = v.Args[2] 21659 p1 := v.Args[0] 21660 v_1 := v.Args[1] 21661 if v_1.Op != OpLoad { 21662 break 21663 } 21664 t2 := v_1.Type 21665 _ = v_1.Args[1] 21666 p2 := v_1.Args[0] 21667 mem := v_1.Args[1] 21668 if mem != v.Args[2] { 21669 break 21670 } 21671 if !(isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size()) { 21672 break 21673 } 21674 v.reset(OpCopy) 21675 v.Type = mem.Type 21676 v.AddArg(mem) 21677 return true 21678 } 21679 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ oldmem)) 21680 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) 21681 // result: mem 21682 for { 21683 t1 := v.Aux 21684 _ = v.Args[2] 21685 v_0 := v.Args[0] 21686 if v_0.Op != OpOffPtr { 21687 break 21688 } 21689 o1 := v_0.AuxInt 21690 p1 := v_0.Args[0] 21691 v_1 := v.Args[1] 21692 if v_1.Op != OpLoad { 21693 break 21694 } 21695 t2 := v_1.Type 21696 _ = v_1.Args[1] 21697 v_1_0 := v_1.Args[0] 21698 if v_1_0.Op != OpOffPtr { 21699 break 21700 } 21701 if v_1_0.AuxInt != o1 { 21702 break 21703 } 21704 p2 := v_1_0.Args[0] 21705 oldmem := v_1.Args[1] 21706 mem := v.Args[2] 21707 if mem.Op != OpStore { 21708 break 21709 } 21710 t3 := mem.Aux 21711 _ = mem.Args[2] 21712 mem_0 := mem.Args[0] 21713 if mem_0.Op != OpOffPtr { 21714 break 21715 } 21716 o3 := mem_0.AuxInt 21717 p3 := mem_0.Args[0] 21718 if oldmem != mem.Args[2] { 21719 break 21720 } 21721 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size())) { 21722 break 21723 } 21724 v.reset(OpCopy) 21725 v.Type = mem.Type 21726 v.AddArg(mem) 21727 return true 21728 } 21729 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ oldmem))) 21730 // 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()) 21731 // result: mem 21732 for { 21733 t1 := v.Aux 21734 _ = v.Args[2] 21735 v_0 := v.Args[0] 21736 if v_0.Op != OpOffPtr { 21737 break 21738 } 21739 o1 := v_0.AuxInt 21740 p1 := v_0.Args[0] 21741 v_1 := v.Args[1] 21742 if v_1.Op != OpLoad { 21743 break 21744 } 21745 t2 := v_1.Type 21746 _ = v_1.Args[1] 21747 v_1_0 := v_1.Args[0] 21748 if v_1_0.Op != OpOffPtr { 21749 break 21750 } 21751 if v_1_0.AuxInt != o1 { 21752 break 21753 } 21754 p2 := v_1_0.Args[0] 21755 oldmem := v_1.Args[1] 21756 mem := v.Args[2] 21757 if mem.Op != OpStore { 21758 break 21759 } 21760 t3 := mem.Aux 21761 _ = mem.Args[2] 21762 mem_0 := mem.Args[0] 21763 if mem_0.Op != OpOffPtr { 21764 break 21765 } 21766 o3 := mem_0.AuxInt 21767 p3 := mem_0.Args[0] 21768 mem_2 := mem.Args[2] 21769 if mem_2.Op != OpStore { 21770 break 21771 } 21772 t4 := mem_2.Aux 21773 _ = mem_2.Args[2] 21774 mem_2_0 := mem_2.Args[0] 21775 if mem_2_0.Op != OpOffPtr { 21776 break 21777 } 21778 o4 := mem_2_0.AuxInt 21779 p4 := mem_2_0.Args[0] 21780 if oldmem != mem_2.Args[2] { 21781 break 21782 } 21783 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())) { 21784 break 21785 } 21786 v.reset(OpCopy) 21787 v.Type = mem.Type 21788 v.AddArg(mem) 21789 return true 21790 } 21791 // 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)))) 21792 // 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()) 21793 // result: mem 21794 for { 21795 t1 := v.Aux 21796 _ = v.Args[2] 21797 v_0 := v.Args[0] 21798 if v_0.Op != OpOffPtr { 21799 break 21800 } 21801 o1 := v_0.AuxInt 21802 p1 := v_0.Args[0] 21803 v_1 := v.Args[1] 21804 if v_1.Op != OpLoad { 21805 break 21806 } 21807 t2 := v_1.Type 21808 _ = v_1.Args[1] 21809 v_1_0 := v_1.Args[0] 21810 if v_1_0.Op != OpOffPtr { 21811 break 21812 } 21813 if v_1_0.AuxInt != o1 { 21814 break 21815 } 21816 p2 := v_1_0.Args[0] 21817 oldmem := v_1.Args[1] 21818 mem := v.Args[2] 21819 if mem.Op != OpStore { 21820 break 21821 } 21822 t3 := mem.Aux 21823 _ = mem.Args[2] 21824 mem_0 := mem.Args[0] 21825 if mem_0.Op != OpOffPtr { 21826 break 21827 } 21828 o3 := mem_0.AuxInt 21829 p3 := mem_0.Args[0] 21830 mem_2 := mem.Args[2] 21831 if mem_2.Op != OpStore { 21832 break 21833 } 21834 t4 := mem_2.Aux 21835 _ = mem_2.Args[2] 21836 mem_2_0 := mem_2.Args[0] 21837 if mem_2_0.Op != OpOffPtr { 21838 break 21839 } 21840 o4 := mem_2_0.AuxInt 21841 p4 := mem_2_0.Args[0] 21842 mem_2_2 := mem_2.Args[2] 21843 if mem_2_2.Op != OpStore { 21844 break 21845 } 21846 t5 := mem_2_2.Aux 21847 _ = mem_2_2.Args[2] 21848 mem_2_2_0 := mem_2_2.Args[0] 21849 if mem_2_2_0.Op != OpOffPtr { 21850 break 21851 } 21852 o5 := mem_2_2_0.AuxInt 21853 p5 := mem_2_2_0.Args[0] 21854 if oldmem != mem_2_2.Args[2] { 21855 break 21856 } 21857 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())) { 21858 break 21859 } 21860 v.reset(OpCopy) 21861 v.Type = mem.Type 21862 v.AddArg(mem) 21863 return true 21864 } 21865 // match: (Store _ (StructMake0) mem) 21866 // cond: 21867 // result: mem 21868 for { 21869 _ = v.Args[2] 21870 v_1 := v.Args[1] 21871 if v_1.Op != OpStructMake0 { 21872 break 21873 } 21874 mem := v.Args[2] 21875 v.reset(OpCopy) 21876 v.Type = mem.Type 21877 v.AddArg(mem) 21878 return true 21879 } 21880 // match: (Store dst (StructMake1 <t> f0) mem) 21881 // cond: 21882 // result: (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem) 21883 for { 21884 _ = v.Args[2] 21885 dst := v.Args[0] 21886 v_1 := v.Args[1] 21887 if v_1.Op != OpStructMake1 { 21888 break 21889 } 21890 t := v_1.Type 21891 f0 := v_1.Args[0] 21892 mem := v.Args[2] 21893 v.reset(OpStore) 21894 v.Aux = t.FieldType(0) 21895 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 21896 v0.AuxInt = 0 21897 v0.AddArg(dst) 21898 v.AddArg(v0) 21899 v.AddArg(f0) 21900 v.AddArg(mem) 21901 return true 21902 } 21903 // match: (Store dst (StructMake2 <t> f0 f1) mem) 21904 // cond: 21905 // 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)) 21906 for { 21907 _ = v.Args[2] 21908 dst := v.Args[0] 21909 v_1 := v.Args[1] 21910 if v_1.Op != OpStructMake2 { 21911 break 21912 } 21913 t := v_1.Type 21914 _ = v_1.Args[1] 21915 f0 := v_1.Args[0] 21916 f1 := v_1.Args[1] 21917 mem := v.Args[2] 21918 v.reset(OpStore) 21919 v.Aux = t.FieldType(1) 21920 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 21921 v0.AuxInt = t.FieldOff(1) 21922 v0.AddArg(dst) 21923 v.AddArg(v0) 21924 v.AddArg(f1) 21925 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 21926 v1.Aux = t.FieldType(0) 21927 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 21928 v2.AuxInt = 0 21929 v2.AddArg(dst) 21930 v1.AddArg(v2) 21931 v1.AddArg(f0) 21932 v1.AddArg(mem) 21933 v.AddArg(v1) 21934 return true 21935 } 21936 // match: (Store dst (StructMake3 <t> f0 f1 f2) mem) 21937 // cond: 21938 // 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))) 21939 for { 21940 _ = v.Args[2] 21941 dst := v.Args[0] 21942 v_1 := v.Args[1] 21943 if v_1.Op != OpStructMake3 { 21944 break 21945 } 21946 t := v_1.Type 21947 _ = v_1.Args[2] 21948 f0 := v_1.Args[0] 21949 f1 := v_1.Args[1] 21950 f2 := v_1.Args[2] 21951 mem := v.Args[2] 21952 v.reset(OpStore) 21953 v.Aux = t.FieldType(2) 21954 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 21955 v0.AuxInt = t.FieldOff(2) 21956 v0.AddArg(dst) 21957 v.AddArg(v0) 21958 v.AddArg(f2) 21959 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 21960 v1.Aux = t.FieldType(1) 21961 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 21962 v2.AuxInt = t.FieldOff(1) 21963 v2.AddArg(dst) 21964 v1.AddArg(v2) 21965 v1.AddArg(f1) 21966 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 21967 v3.Aux = t.FieldType(0) 21968 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 21969 v4.AuxInt = 0 21970 v4.AddArg(dst) 21971 v3.AddArg(v4) 21972 v3.AddArg(f0) 21973 v3.AddArg(mem) 21974 v1.AddArg(v3) 21975 v.AddArg(v1) 21976 return true 21977 } 21978 // match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem) 21979 // cond: 21980 // 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)))) 21981 for { 21982 _ = v.Args[2] 21983 dst := v.Args[0] 21984 v_1 := v.Args[1] 21985 if v_1.Op != OpStructMake4 { 21986 break 21987 } 21988 t := v_1.Type 21989 _ = v_1.Args[3] 21990 f0 := v_1.Args[0] 21991 f1 := v_1.Args[1] 21992 f2 := v_1.Args[2] 21993 f3 := v_1.Args[3] 21994 mem := v.Args[2] 21995 v.reset(OpStore) 21996 v.Aux = t.FieldType(3) 21997 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 21998 v0.AuxInt = t.FieldOff(3) 21999 v0.AddArg(dst) 22000 v.AddArg(v0) 22001 v.AddArg(f3) 22002 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 22003 v1.Aux = t.FieldType(2) 22004 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 22005 v2.AuxInt = t.FieldOff(2) 22006 v2.AddArg(dst) 22007 v1.AddArg(v2) 22008 v1.AddArg(f2) 22009 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 22010 v3.Aux = t.FieldType(1) 22011 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 22012 v4.AuxInt = t.FieldOff(1) 22013 v4.AddArg(dst) 22014 v3.AddArg(v4) 22015 v3.AddArg(f1) 22016 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 22017 v5.Aux = t.FieldType(0) 22018 v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 22019 v6.AuxInt = 0 22020 v6.AddArg(dst) 22021 v5.AddArg(v6) 22022 v5.AddArg(f0) 22023 v5.AddArg(mem) 22024 v3.AddArg(v5) 22025 v1.AddArg(v3) 22026 v.AddArg(v1) 22027 return true 22028 } 22029 // match: (Store {t} dst (Load src mem) mem) 22030 // cond: !fe.CanSSA(t.(*types.Type)) 22031 // result: (Move {t} [t.(*types.Type).Size()] dst src mem) 22032 for { 22033 t := v.Aux 22034 _ = v.Args[2] 22035 dst := v.Args[0] 22036 v_1 := v.Args[1] 22037 if v_1.Op != OpLoad { 22038 break 22039 } 22040 _ = v_1.Args[1] 22041 src := v_1.Args[0] 22042 mem := v_1.Args[1] 22043 if mem != v.Args[2] { 22044 break 22045 } 22046 if !(!fe.CanSSA(t.(*types.Type))) { 22047 break 22048 } 22049 v.reset(OpMove) 22050 v.AuxInt = t.(*types.Type).Size() 22051 v.Aux = t 22052 v.AddArg(dst) 22053 v.AddArg(src) 22054 v.AddArg(mem) 22055 return true 22056 } 22057 return false 22058 } 22059 func rewriteValuegeneric_OpStore_10(v *Value) bool { 22060 b := v.Block 22061 _ = b 22062 config := b.Func.Config 22063 _ = config 22064 fe := b.Func.fe 22065 _ = fe 22066 // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) 22067 // cond: !fe.CanSSA(t.(*types.Type)) 22068 // result: (Move {t} [t.(*types.Type).Size()] dst src (VarDef {x} mem)) 22069 for { 22070 t := v.Aux 22071 _ = v.Args[2] 22072 dst := v.Args[0] 22073 v_1 := v.Args[1] 22074 if v_1.Op != OpLoad { 22075 break 22076 } 22077 _ = v_1.Args[1] 22078 src := v_1.Args[0] 22079 mem := v_1.Args[1] 22080 v_2 := v.Args[2] 22081 if v_2.Op != OpVarDef { 22082 break 22083 } 22084 x := v_2.Aux 22085 if mem != v_2.Args[0] { 22086 break 22087 } 22088 if !(!fe.CanSSA(t.(*types.Type))) { 22089 break 22090 } 22091 v.reset(OpMove) 22092 v.AuxInt = t.(*types.Type).Size() 22093 v.Aux = t 22094 v.AddArg(dst) 22095 v.AddArg(src) 22096 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) 22097 v0.Aux = x 22098 v0.AddArg(mem) 22099 v.AddArg(v0) 22100 return true 22101 } 22102 // match: (Store _ (ArrayMake0) mem) 22103 // cond: 22104 // result: mem 22105 for { 22106 _ = v.Args[2] 22107 v_1 := v.Args[1] 22108 if v_1.Op != OpArrayMake0 { 22109 break 22110 } 22111 mem := v.Args[2] 22112 v.reset(OpCopy) 22113 v.Type = mem.Type 22114 v.AddArg(mem) 22115 return true 22116 } 22117 // match: (Store dst (ArrayMake1 e) mem) 22118 // cond: 22119 // result: (Store {e.Type} dst e mem) 22120 for { 22121 _ = v.Args[2] 22122 dst := v.Args[0] 22123 v_1 := v.Args[1] 22124 if v_1.Op != OpArrayMake1 { 22125 break 22126 } 22127 e := v_1.Args[0] 22128 mem := v.Args[2] 22129 v.reset(OpStore) 22130 v.Aux = e.Type 22131 v.AddArg(dst) 22132 v.AddArg(e) 22133 v.AddArg(mem) 22134 return true 22135 } 22136 // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) 22137 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 22138 // result: mem 22139 for { 22140 _ = v.Args[2] 22141 v_0 := v.Args[0] 22142 if v_0.Op != OpLoad { 22143 break 22144 } 22145 _ = v_0.Args[1] 22146 v_0_0 := v_0.Args[0] 22147 if v_0_0.Op != OpOffPtr { 22148 break 22149 } 22150 c := v_0_0.AuxInt 22151 v_0_0_0 := v_0_0.Args[0] 22152 if v_0_0_0.Op != OpSP { 22153 break 22154 } 22155 mem := v_0.Args[1] 22156 x := v.Args[1] 22157 if mem != v.Args[2] { 22158 break 22159 } 22160 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 22161 break 22162 } 22163 v.reset(OpCopy) 22164 v.Type = mem.Type 22165 v.AddArg(mem) 22166 return true 22167 } 22168 // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) 22169 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 22170 // result: mem 22171 for { 22172 _ = v.Args[2] 22173 v_0 := v.Args[0] 22174 if v_0.Op != OpOffPtr { 22175 break 22176 } 22177 v_0_0 := v_0.Args[0] 22178 if v_0_0.Op != OpLoad { 22179 break 22180 } 22181 _ = v_0_0.Args[1] 22182 v_0_0_0 := v_0_0.Args[0] 22183 if v_0_0_0.Op != OpOffPtr { 22184 break 22185 } 22186 c := v_0_0_0.AuxInt 22187 v_0_0_0_0 := v_0_0_0.Args[0] 22188 if v_0_0_0_0.Op != OpSP { 22189 break 22190 } 22191 mem := v_0_0.Args[1] 22192 x := v.Args[1] 22193 if mem != v.Args[2] { 22194 break 22195 } 22196 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 22197 break 22198 } 22199 v.reset(OpCopy) 22200 v.Type = mem.Type 22201 v.AddArg(mem) 22202 return true 22203 } 22204 return false 22205 } 22206 func rewriteValuegeneric_OpStringLen_0(v *Value) bool { 22207 // match: (StringLen (StringMake _ (Const64 <t> [c]))) 22208 // cond: 22209 // result: (Const64 <t> [c]) 22210 for { 22211 v_0 := v.Args[0] 22212 if v_0.Op != OpStringMake { 22213 break 22214 } 22215 _ = v_0.Args[1] 22216 v_0_1 := v_0.Args[1] 22217 if v_0_1.Op != OpConst64 { 22218 break 22219 } 22220 t := v_0_1.Type 22221 c := v_0_1.AuxInt 22222 v.reset(OpConst64) 22223 v.Type = t 22224 v.AuxInt = c 22225 return true 22226 } 22227 return false 22228 } 22229 func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { 22230 // match: (StringPtr (StringMake (Const64 <t> [c]) _)) 22231 // cond: 22232 // result: (Const64 <t> [c]) 22233 for { 22234 v_0 := v.Args[0] 22235 if v_0.Op != OpStringMake { 22236 break 22237 } 22238 _ = v_0.Args[1] 22239 v_0_0 := v_0.Args[0] 22240 if v_0_0.Op != OpConst64 { 22241 break 22242 } 22243 t := v_0_0.Type 22244 c := v_0_0.AuxInt 22245 v.reset(OpConst64) 22246 v.Type = t 22247 v.AuxInt = c 22248 return true 22249 } 22250 return false 22251 } 22252 func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { 22253 // match: (StructSelect (StructMake1 x)) 22254 // cond: 22255 // result: x 22256 for { 22257 v_0 := v.Args[0] 22258 if v_0.Op != OpStructMake1 { 22259 break 22260 } 22261 x := v_0.Args[0] 22262 v.reset(OpCopy) 22263 v.Type = x.Type 22264 v.AddArg(x) 22265 return true 22266 } 22267 // match: (StructSelect [0] (StructMake2 x _)) 22268 // cond: 22269 // result: x 22270 for { 22271 if v.AuxInt != 0 { 22272 break 22273 } 22274 v_0 := v.Args[0] 22275 if v_0.Op != OpStructMake2 { 22276 break 22277 } 22278 _ = v_0.Args[1] 22279 x := v_0.Args[0] 22280 v.reset(OpCopy) 22281 v.Type = x.Type 22282 v.AddArg(x) 22283 return true 22284 } 22285 // match: (StructSelect [1] (StructMake2 _ x)) 22286 // cond: 22287 // result: x 22288 for { 22289 if v.AuxInt != 1 { 22290 break 22291 } 22292 v_0 := v.Args[0] 22293 if v_0.Op != OpStructMake2 { 22294 break 22295 } 22296 _ = v_0.Args[1] 22297 x := v_0.Args[1] 22298 v.reset(OpCopy) 22299 v.Type = x.Type 22300 v.AddArg(x) 22301 return true 22302 } 22303 // match: (StructSelect [0] (StructMake3 x _ _)) 22304 // cond: 22305 // result: x 22306 for { 22307 if v.AuxInt != 0 { 22308 break 22309 } 22310 v_0 := v.Args[0] 22311 if v_0.Op != OpStructMake3 { 22312 break 22313 } 22314 _ = v_0.Args[2] 22315 x := v_0.Args[0] 22316 v.reset(OpCopy) 22317 v.Type = x.Type 22318 v.AddArg(x) 22319 return true 22320 } 22321 // match: (StructSelect [1] (StructMake3 _ x _)) 22322 // cond: 22323 // result: x 22324 for { 22325 if v.AuxInt != 1 { 22326 break 22327 } 22328 v_0 := v.Args[0] 22329 if v_0.Op != OpStructMake3 { 22330 break 22331 } 22332 _ = v_0.Args[2] 22333 x := v_0.Args[1] 22334 v.reset(OpCopy) 22335 v.Type = x.Type 22336 v.AddArg(x) 22337 return true 22338 } 22339 // match: (StructSelect [2] (StructMake3 _ _ x)) 22340 // cond: 22341 // result: x 22342 for { 22343 if v.AuxInt != 2 { 22344 break 22345 } 22346 v_0 := v.Args[0] 22347 if v_0.Op != OpStructMake3 { 22348 break 22349 } 22350 _ = v_0.Args[2] 22351 x := v_0.Args[2] 22352 v.reset(OpCopy) 22353 v.Type = x.Type 22354 v.AddArg(x) 22355 return true 22356 } 22357 // match: (StructSelect [0] (StructMake4 x _ _ _)) 22358 // cond: 22359 // result: x 22360 for { 22361 if v.AuxInt != 0 { 22362 break 22363 } 22364 v_0 := v.Args[0] 22365 if v_0.Op != OpStructMake4 { 22366 break 22367 } 22368 _ = v_0.Args[3] 22369 x := v_0.Args[0] 22370 v.reset(OpCopy) 22371 v.Type = x.Type 22372 v.AddArg(x) 22373 return true 22374 } 22375 // match: (StructSelect [1] (StructMake4 _ x _ _)) 22376 // cond: 22377 // result: x 22378 for { 22379 if v.AuxInt != 1 { 22380 break 22381 } 22382 v_0 := v.Args[0] 22383 if v_0.Op != OpStructMake4 { 22384 break 22385 } 22386 _ = v_0.Args[3] 22387 x := v_0.Args[1] 22388 v.reset(OpCopy) 22389 v.Type = x.Type 22390 v.AddArg(x) 22391 return true 22392 } 22393 // match: (StructSelect [2] (StructMake4 _ _ x _)) 22394 // cond: 22395 // result: x 22396 for { 22397 if v.AuxInt != 2 { 22398 break 22399 } 22400 v_0 := v.Args[0] 22401 if v_0.Op != OpStructMake4 { 22402 break 22403 } 22404 _ = v_0.Args[3] 22405 x := v_0.Args[2] 22406 v.reset(OpCopy) 22407 v.Type = x.Type 22408 v.AddArg(x) 22409 return true 22410 } 22411 // match: (StructSelect [3] (StructMake4 _ _ _ x)) 22412 // cond: 22413 // result: x 22414 for { 22415 if v.AuxInt != 3 { 22416 break 22417 } 22418 v_0 := v.Args[0] 22419 if v_0.Op != OpStructMake4 { 22420 break 22421 } 22422 _ = v_0.Args[3] 22423 x := v_0.Args[3] 22424 v.reset(OpCopy) 22425 v.Type = x.Type 22426 v.AddArg(x) 22427 return true 22428 } 22429 return false 22430 } 22431 func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { 22432 b := v.Block 22433 _ = b 22434 fe := b.Func.fe 22435 _ = fe 22436 // match: (StructSelect [i] x:(Load <t> ptr mem)) 22437 // cond: !fe.CanSSA(t) 22438 // result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem) 22439 for { 22440 i := v.AuxInt 22441 x := v.Args[0] 22442 if x.Op != OpLoad { 22443 break 22444 } 22445 t := x.Type 22446 _ = x.Args[1] 22447 ptr := x.Args[0] 22448 mem := x.Args[1] 22449 if !(!fe.CanSSA(t)) { 22450 break 22451 } 22452 b = x.Block 22453 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 22454 v.reset(OpCopy) 22455 v.AddArg(v0) 22456 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) 22457 v1.AuxInt = t.FieldOff(int(i)) 22458 v1.AddArg(ptr) 22459 v0.AddArg(v1) 22460 v0.AddArg(mem) 22461 return true 22462 } 22463 // match: (StructSelect [0] x:(IData _)) 22464 // cond: 22465 // result: x 22466 for { 22467 if v.AuxInt != 0 { 22468 break 22469 } 22470 x := v.Args[0] 22471 if x.Op != OpIData { 22472 break 22473 } 22474 v.reset(OpCopy) 22475 v.Type = x.Type 22476 v.AddArg(x) 22477 return true 22478 } 22479 return false 22480 } 22481 func rewriteValuegeneric_OpSub16_0(v *Value) bool { 22482 b := v.Block 22483 _ = b 22484 // match: (Sub16 (Const16 [c]) (Const16 [d])) 22485 // cond: 22486 // result: (Const16 [int64(int16(c-d))]) 22487 for { 22488 _ = v.Args[1] 22489 v_0 := v.Args[0] 22490 if v_0.Op != OpConst16 { 22491 break 22492 } 22493 c := v_0.AuxInt 22494 v_1 := v.Args[1] 22495 if v_1.Op != OpConst16 { 22496 break 22497 } 22498 d := v_1.AuxInt 22499 v.reset(OpConst16) 22500 v.AuxInt = int64(int16(c - d)) 22501 return true 22502 } 22503 // match: (Sub16 x (Const16 <t> [c])) 22504 // cond: x.Op != OpConst16 22505 // result: (Add16 (Const16 <t> [int64(int16(-c))]) x) 22506 for { 22507 _ = v.Args[1] 22508 x := v.Args[0] 22509 v_1 := v.Args[1] 22510 if v_1.Op != OpConst16 { 22511 break 22512 } 22513 t := v_1.Type 22514 c := v_1.AuxInt 22515 if !(x.Op != OpConst16) { 22516 break 22517 } 22518 v.reset(OpAdd16) 22519 v0 := b.NewValue0(v.Pos, OpConst16, t) 22520 v0.AuxInt = int64(int16(-c)) 22521 v.AddArg(v0) 22522 v.AddArg(x) 22523 return true 22524 } 22525 // match: (Sub16 x x) 22526 // cond: 22527 // result: (Const16 [0]) 22528 for { 22529 _ = v.Args[1] 22530 x := v.Args[0] 22531 if x != v.Args[1] { 22532 break 22533 } 22534 v.reset(OpConst16) 22535 v.AuxInt = 0 22536 return true 22537 } 22538 // match: (Sub16 (Add16 x y) x) 22539 // cond: 22540 // result: y 22541 for { 22542 _ = v.Args[1] 22543 v_0 := v.Args[0] 22544 if v_0.Op != OpAdd16 { 22545 break 22546 } 22547 _ = v_0.Args[1] 22548 x := v_0.Args[0] 22549 y := v_0.Args[1] 22550 if x != v.Args[1] { 22551 break 22552 } 22553 v.reset(OpCopy) 22554 v.Type = y.Type 22555 v.AddArg(y) 22556 return true 22557 } 22558 // match: (Sub16 (Add16 y x) x) 22559 // cond: 22560 // result: y 22561 for { 22562 _ = v.Args[1] 22563 v_0 := v.Args[0] 22564 if v_0.Op != OpAdd16 { 22565 break 22566 } 22567 _ = v_0.Args[1] 22568 y := v_0.Args[0] 22569 x := v_0.Args[1] 22570 if x != v.Args[1] { 22571 break 22572 } 22573 v.reset(OpCopy) 22574 v.Type = y.Type 22575 v.AddArg(y) 22576 return true 22577 } 22578 // match: (Sub16 (Add16 x y) y) 22579 // cond: 22580 // result: x 22581 for { 22582 _ = v.Args[1] 22583 v_0 := v.Args[0] 22584 if v_0.Op != OpAdd16 { 22585 break 22586 } 22587 _ = v_0.Args[1] 22588 x := v_0.Args[0] 22589 y := v_0.Args[1] 22590 if y != v.Args[1] { 22591 break 22592 } 22593 v.reset(OpCopy) 22594 v.Type = x.Type 22595 v.AddArg(x) 22596 return true 22597 } 22598 // match: (Sub16 (Add16 y x) y) 22599 // cond: 22600 // result: x 22601 for { 22602 _ = v.Args[1] 22603 v_0 := v.Args[0] 22604 if v_0.Op != OpAdd16 { 22605 break 22606 } 22607 _ = v_0.Args[1] 22608 y := v_0.Args[0] 22609 x := v_0.Args[1] 22610 if y != v.Args[1] { 22611 break 22612 } 22613 v.reset(OpCopy) 22614 v.Type = x.Type 22615 v.AddArg(x) 22616 return true 22617 } 22618 // match: (Sub16 x (Sub16 i:(Const16 <t>) z)) 22619 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 22620 // result: (Sub16 (Add16 <t> x z) i) 22621 for { 22622 _ = v.Args[1] 22623 x := v.Args[0] 22624 v_1 := v.Args[1] 22625 if v_1.Op != OpSub16 { 22626 break 22627 } 22628 _ = v_1.Args[1] 22629 i := v_1.Args[0] 22630 if i.Op != OpConst16 { 22631 break 22632 } 22633 t := i.Type 22634 z := v_1.Args[1] 22635 if !(z.Op != OpConst16 && x.Op != OpConst16) { 22636 break 22637 } 22638 v.reset(OpSub16) 22639 v0 := b.NewValue0(v.Pos, OpAdd16, t) 22640 v0.AddArg(x) 22641 v0.AddArg(z) 22642 v.AddArg(v0) 22643 v.AddArg(i) 22644 return true 22645 } 22646 // match: (Sub16 x (Sub16 z i:(Const16 <t>))) 22647 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 22648 // result: (Add16 i (Sub16 <t> x z)) 22649 for { 22650 _ = v.Args[1] 22651 x := v.Args[0] 22652 v_1 := v.Args[1] 22653 if v_1.Op != OpSub16 { 22654 break 22655 } 22656 _ = v_1.Args[1] 22657 z := v_1.Args[0] 22658 i := v_1.Args[1] 22659 if i.Op != OpConst16 { 22660 break 22661 } 22662 t := i.Type 22663 if !(z.Op != OpConst16 && x.Op != OpConst16) { 22664 break 22665 } 22666 v.reset(OpAdd16) 22667 v.AddArg(i) 22668 v0 := b.NewValue0(v.Pos, OpSub16, t) 22669 v0.AddArg(x) 22670 v0.AddArg(z) 22671 v.AddArg(v0) 22672 return true 22673 } 22674 // match: (Sub16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 22675 // cond: 22676 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 22677 for { 22678 _ = v.Args[1] 22679 v_0 := v.Args[0] 22680 if v_0.Op != OpConst16 { 22681 break 22682 } 22683 t := v_0.Type 22684 c := v_0.AuxInt 22685 v_1 := v.Args[1] 22686 if v_1.Op != OpSub16 { 22687 break 22688 } 22689 _ = v_1.Args[1] 22690 x := v_1.Args[0] 22691 v_1_1 := v_1.Args[1] 22692 if v_1_1.Op != OpConst16 { 22693 break 22694 } 22695 if v_1_1.Type != t { 22696 break 22697 } 22698 d := v_1_1.AuxInt 22699 v.reset(OpSub16) 22700 v0 := b.NewValue0(v.Pos, OpConst16, t) 22701 v0.AuxInt = int64(int16(c + d)) 22702 v.AddArg(v0) 22703 v.AddArg(x) 22704 return true 22705 } 22706 return false 22707 } 22708 func rewriteValuegeneric_OpSub16_10(v *Value) bool { 22709 b := v.Block 22710 _ = b 22711 // match: (Sub16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 22712 // cond: 22713 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 22714 for { 22715 _ = v.Args[1] 22716 v_0 := v.Args[0] 22717 if v_0.Op != OpConst16 { 22718 break 22719 } 22720 t := v_0.Type 22721 c := v_0.AuxInt 22722 v_1 := v.Args[1] 22723 if v_1.Op != OpSub16 { 22724 break 22725 } 22726 _ = v_1.Args[1] 22727 v_1_0 := v_1.Args[0] 22728 if v_1_0.Op != OpConst16 { 22729 break 22730 } 22731 if v_1_0.Type != t { 22732 break 22733 } 22734 d := v_1_0.AuxInt 22735 x := v_1.Args[1] 22736 v.reset(OpAdd16) 22737 v0 := b.NewValue0(v.Pos, OpConst16, t) 22738 v0.AuxInt = int64(int16(c - d)) 22739 v.AddArg(v0) 22740 v.AddArg(x) 22741 return true 22742 } 22743 return false 22744 } 22745 func rewriteValuegeneric_OpSub32_0(v *Value) bool { 22746 b := v.Block 22747 _ = b 22748 // match: (Sub32 (Const32 [c]) (Const32 [d])) 22749 // cond: 22750 // result: (Const32 [int64(int32(c-d))]) 22751 for { 22752 _ = v.Args[1] 22753 v_0 := v.Args[0] 22754 if v_0.Op != OpConst32 { 22755 break 22756 } 22757 c := v_0.AuxInt 22758 v_1 := v.Args[1] 22759 if v_1.Op != OpConst32 { 22760 break 22761 } 22762 d := v_1.AuxInt 22763 v.reset(OpConst32) 22764 v.AuxInt = int64(int32(c - d)) 22765 return true 22766 } 22767 // match: (Sub32 x (Const32 <t> [c])) 22768 // cond: x.Op != OpConst32 22769 // result: (Add32 (Const32 <t> [int64(int32(-c))]) x) 22770 for { 22771 _ = v.Args[1] 22772 x := v.Args[0] 22773 v_1 := v.Args[1] 22774 if v_1.Op != OpConst32 { 22775 break 22776 } 22777 t := v_1.Type 22778 c := v_1.AuxInt 22779 if !(x.Op != OpConst32) { 22780 break 22781 } 22782 v.reset(OpAdd32) 22783 v0 := b.NewValue0(v.Pos, OpConst32, t) 22784 v0.AuxInt = int64(int32(-c)) 22785 v.AddArg(v0) 22786 v.AddArg(x) 22787 return true 22788 } 22789 // match: (Sub32 x x) 22790 // cond: 22791 // result: (Const32 [0]) 22792 for { 22793 _ = v.Args[1] 22794 x := v.Args[0] 22795 if x != v.Args[1] { 22796 break 22797 } 22798 v.reset(OpConst32) 22799 v.AuxInt = 0 22800 return true 22801 } 22802 // match: (Sub32 (Add32 x y) x) 22803 // cond: 22804 // result: y 22805 for { 22806 _ = v.Args[1] 22807 v_0 := v.Args[0] 22808 if v_0.Op != OpAdd32 { 22809 break 22810 } 22811 _ = v_0.Args[1] 22812 x := v_0.Args[0] 22813 y := v_0.Args[1] 22814 if x != v.Args[1] { 22815 break 22816 } 22817 v.reset(OpCopy) 22818 v.Type = y.Type 22819 v.AddArg(y) 22820 return true 22821 } 22822 // match: (Sub32 (Add32 y x) x) 22823 // cond: 22824 // result: y 22825 for { 22826 _ = v.Args[1] 22827 v_0 := v.Args[0] 22828 if v_0.Op != OpAdd32 { 22829 break 22830 } 22831 _ = v_0.Args[1] 22832 y := v_0.Args[0] 22833 x := v_0.Args[1] 22834 if x != v.Args[1] { 22835 break 22836 } 22837 v.reset(OpCopy) 22838 v.Type = y.Type 22839 v.AddArg(y) 22840 return true 22841 } 22842 // match: (Sub32 (Add32 x y) y) 22843 // cond: 22844 // result: x 22845 for { 22846 _ = v.Args[1] 22847 v_0 := v.Args[0] 22848 if v_0.Op != OpAdd32 { 22849 break 22850 } 22851 _ = v_0.Args[1] 22852 x := v_0.Args[0] 22853 y := v_0.Args[1] 22854 if y != v.Args[1] { 22855 break 22856 } 22857 v.reset(OpCopy) 22858 v.Type = x.Type 22859 v.AddArg(x) 22860 return true 22861 } 22862 // match: (Sub32 (Add32 y x) y) 22863 // cond: 22864 // result: x 22865 for { 22866 _ = v.Args[1] 22867 v_0 := v.Args[0] 22868 if v_0.Op != OpAdd32 { 22869 break 22870 } 22871 _ = v_0.Args[1] 22872 y := v_0.Args[0] 22873 x := v_0.Args[1] 22874 if y != v.Args[1] { 22875 break 22876 } 22877 v.reset(OpCopy) 22878 v.Type = x.Type 22879 v.AddArg(x) 22880 return true 22881 } 22882 // match: (Sub32 x (Sub32 i:(Const32 <t>) z)) 22883 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 22884 // result: (Sub32 (Add32 <t> x z) i) 22885 for { 22886 _ = v.Args[1] 22887 x := v.Args[0] 22888 v_1 := v.Args[1] 22889 if v_1.Op != OpSub32 { 22890 break 22891 } 22892 _ = v_1.Args[1] 22893 i := v_1.Args[0] 22894 if i.Op != OpConst32 { 22895 break 22896 } 22897 t := i.Type 22898 z := v_1.Args[1] 22899 if !(z.Op != OpConst32 && x.Op != OpConst32) { 22900 break 22901 } 22902 v.reset(OpSub32) 22903 v0 := b.NewValue0(v.Pos, OpAdd32, t) 22904 v0.AddArg(x) 22905 v0.AddArg(z) 22906 v.AddArg(v0) 22907 v.AddArg(i) 22908 return true 22909 } 22910 // match: (Sub32 x (Sub32 z i:(Const32 <t>))) 22911 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 22912 // result: (Add32 i (Sub32 <t> x z)) 22913 for { 22914 _ = v.Args[1] 22915 x := v.Args[0] 22916 v_1 := v.Args[1] 22917 if v_1.Op != OpSub32 { 22918 break 22919 } 22920 _ = v_1.Args[1] 22921 z := v_1.Args[0] 22922 i := v_1.Args[1] 22923 if i.Op != OpConst32 { 22924 break 22925 } 22926 t := i.Type 22927 if !(z.Op != OpConst32 && x.Op != OpConst32) { 22928 break 22929 } 22930 v.reset(OpAdd32) 22931 v.AddArg(i) 22932 v0 := b.NewValue0(v.Pos, OpSub32, t) 22933 v0.AddArg(x) 22934 v0.AddArg(z) 22935 v.AddArg(v0) 22936 return true 22937 } 22938 // match: (Sub32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 22939 // cond: 22940 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 22941 for { 22942 _ = v.Args[1] 22943 v_0 := v.Args[0] 22944 if v_0.Op != OpConst32 { 22945 break 22946 } 22947 t := v_0.Type 22948 c := v_0.AuxInt 22949 v_1 := v.Args[1] 22950 if v_1.Op != OpSub32 { 22951 break 22952 } 22953 _ = v_1.Args[1] 22954 x := v_1.Args[0] 22955 v_1_1 := v_1.Args[1] 22956 if v_1_1.Op != OpConst32 { 22957 break 22958 } 22959 if v_1_1.Type != t { 22960 break 22961 } 22962 d := v_1_1.AuxInt 22963 v.reset(OpSub32) 22964 v0 := b.NewValue0(v.Pos, OpConst32, t) 22965 v0.AuxInt = int64(int32(c + d)) 22966 v.AddArg(v0) 22967 v.AddArg(x) 22968 return true 22969 } 22970 return false 22971 } 22972 func rewriteValuegeneric_OpSub32_10(v *Value) bool { 22973 b := v.Block 22974 _ = b 22975 // match: (Sub32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 22976 // cond: 22977 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 22978 for { 22979 _ = v.Args[1] 22980 v_0 := v.Args[0] 22981 if v_0.Op != OpConst32 { 22982 break 22983 } 22984 t := v_0.Type 22985 c := v_0.AuxInt 22986 v_1 := v.Args[1] 22987 if v_1.Op != OpSub32 { 22988 break 22989 } 22990 _ = v_1.Args[1] 22991 v_1_0 := v_1.Args[0] 22992 if v_1_0.Op != OpConst32 { 22993 break 22994 } 22995 if v_1_0.Type != t { 22996 break 22997 } 22998 d := v_1_0.AuxInt 22999 x := v_1.Args[1] 23000 v.reset(OpAdd32) 23001 v0 := b.NewValue0(v.Pos, OpConst32, t) 23002 v0.AuxInt = int64(int32(c - d)) 23003 v.AddArg(v0) 23004 v.AddArg(x) 23005 return true 23006 } 23007 return false 23008 } 23009 func rewriteValuegeneric_OpSub32F_0(v *Value) bool { 23010 // match: (Sub32F (Const32F [c]) (Const32F [d])) 23011 // cond: 23012 // result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))]) 23013 for { 23014 _ = v.Args[1] 23015 v_0 := v.Args[0] 23016 if v_0.Op != OpConst32F { 23017 break 23018 } 23019 c := v_0.AuxInt 23020 v_1 := v.Args[1] 23021 if v_1.Op != OpConst32F { 23022 break 23023 } 23024 d := v_1.AuxInt 23025 v.reset(OpConst32F) 23026 v.AuxInt = f2i(float64(i2f32(c) - i2f32(d))) 23027 return true 23028 } 23029 // match: (Sub32F x (Const32F [0])) 23030 // cond: 23031 // result: x 23032 for { 23033 _ = v.Args[1] 23034 x := v.Args[0] 23035 v_1 := v.Args[1] 23036 if v_1.Op != OpConst32F { 23037 break 23038 } 23039 if v_1.AuxInt != 0 { 23040 break 23041 } 23042 v.reset(OpCopy) 23043 v.Type = x.Type 23044 v.AddArg(x) 23045 return true 23046 } 23047 return false 23048 } 23049 func rewriteValuegeneric_OpSub64_0(v *Value) bool { 23050 b := v.Block 23051 _ = b 23052 // match: (Sub64 (Const64 [c]) (Const64 [d])) 23053 // cond: 23054 // result: (Const64 [c-d]) 23055 for { 23056 _ = v.Args[1] 23057 v_0 := v.Args[0] 23058 if v_0.Op != OpConst64 { 23059 break 23060 } 23061 c := v_0.AuxInt 23062 v_1 := v.Args[1] 23063 if v_1.Op != OpConst64 { 23064 break 23065 } 23066 d := v_1.AuxInt 23067 v.reset(OpConst64) 23068 v.AuxInt = c - d 23069 return true 23070 } 23071 // match: (Sub64 x (Const64 <t> [c])) 23072 // cond: x.Op != OpConst64 23073 // result: (Add64 (Const64 <t> [-c]) x) 23074 for { 23075 _ = v.Args[1] 23076 x := v.Args[0] 23077 v_1 := v.Args[1] 23078 if v_1.Op != OpConst64 { 23079 break 23080 } 23081 t := v_1.Type 23082 c := v_1.AuxInt 23083 if !(x.Op != OpConst64) { 23084 break 23085 } 23086 v.reset(OpAdd64) 23087 v0 := b.NewValue0(v.Pos, OpConst64, t) 23088 v0.AuxInt = -c 23089 v.AddArg(v0) 23090 v.AddArg(x) 23091 return true 23092 } 23093 // match: (Sub64 x x) 23094 // cond: 23095 // result: (Const64 [0]) 23096 for { 23097 _ = v.Args[1] 23098 x := v.Args[0] 23099 if x != v.Args[1] { 23100 break 23101 } 23102 v.reset(OpConst64) 23103 v.AuxInt = 0 23104 return true 23105 } 23106 // match: (Sub64 (Add64 x y) x) 23107 // cond: 23108 // result: y 23109 for { 23110 _ = v.Args[1] 23111 v_0 := v.Args[0] 23112 if v_0.Op != OpAdd64 { 23113 break 23114 } 23115 _ = v_0.Args[1] 23116 x := v_0.Args[0] 23117 y := v_0.Args[1] 23118 if x != v.Args[1] { 23119 break 23120 } 23121 v.reset(OpCopy) 23122 v.Type = y.Type 23123 v.AddArg(y) 23124 return true 23125 } 23126 // match: (Sub64 (Add64 y x) x) 23127 // cond: 23128 // result: y 23129 for { 23130 _ = v.Args[1] 23131 v_0 := v.Args[0] 23132 if v_0.Op != OpAdd64 { 23133 break 23134 } 23135 _ = v_0.Args[1] 23136 y := v_0.Args[0] 23137 x := v_0.Args[1] 23138 if x != v.Args[1] { 23139 break 23140 } 23141 v.reset(OpCopy) 23142 v.Type = y.Type 23143 v.AddArg(y) 23144 return true 23145 } 23146 // match: (Sub64 (Add64 x y) y) 23147 // cond: 23148 // result: x 23149 for { 23150 _ = v.Args[1] 23151 v_0 := v.Args[0] 23152 if v_0.Op != OpAdd64 { 23153 break 23154 } 23155 _ = v_0.Args[1] 23156 x := v_0.Args[0] 23157 y := v_0.Args[1] 23158 if y != v.Args[1] { 23159 break 23160 } 23161 v.reset(OpCopy) 23162 v.Type = x.Type 23163 v.AddArg(x) 23164 return true 23165 } 23166 // match: (Sub64 (Add64 y x) y) 23167 // cond: 23168 // result: x 23169 for { 23170 _ = v.Args[1] 23171 v_0 := v.Args[0] 23172 if v_0.Op != OpAdd64 { 23173 break 23174 } 23175 _ = v_0.Args[1] 23176 y := v_0.Args[0] 23177 x := v_0.Args[1] 23178 if y != v.Args[1] { 23179 break 23180 } 23181 v.reset(OpCopy) 23182 v.Type = x.Type 23183 v.AddArg(x) 23184 return true 23185 } 23186 // match: (Sub64 x (Sub64 i:(Const64 <t>) z)) 23187 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 23188 // result: (Sub64 (Add64 <t> x z) i) 23189 for { 23190 _ = v.Args[1] 23191 x := v.Args[0] 23192 v_1 := v.Args[1] 23193 if v_1.Op != OpSub64 { 23194 break 23195 } 23196 _ = v_1.Args[1] 23197 i := v_1.Args[0] 23198 if i.Op != OpConst64 { 23199 break 23200 } 23201 t := i.Type 23202 z := v_1.Args[1] 23203 if !(z.Op != OpConst64 && x.Op != OpConst64) { 23204 break 23205 } 23206 v.reset(OpSub64) 23207 v0 := b.NewValue0(v.Pos, OpAdd64, t) 23208 v0.AddArg(x) 23209 v0.AddArg(z) 23210 v.AddArg(v0) 23211 v.AddArg(i) 23212 return true 23213 } 23214 // match: (Sub64 x (Sub64 z i:(Const64 <t>))) 23215 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 23216 // result: (Add64 i (Sub64 <t> x z)) 23217 for { 23218 _ = v.Args[1] 23219 x := v.Args[0] 23220 v_1 := v.Args[1] 23221 if v_1.Op != OpSub64 { 23222 break 23223 } 23224 _ = v_1.Args[1] 23225 z := v_1.Args[0] 23226 i := v_1.Args[1] 23227 if i.Op != OpConst64 { 23228 break 23229 } 23230 t := i.Type 23231 if !(z.Op != OpConst64 && x.Op != OpConst64) { 23232 break 23233 } 23234 v.reset(OpAdd64) 23235 v.AddArg(i) 23236 v0 := b.NewValue0(v.Pos, OpSub64, t) 23237 v0.AddArg(x) 23238 v0.AddArg(z) 23239 v.AddArg(v0) 23240 return true 23241 } 23242 // match: (Sub64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 23243 // cond: 23244 // result: (Sub64 (Const64 <t> [c+d]) x) 23245 for { 23246 _ = v.Args[1] 23247 v_0 := v.Args[0] 23248 if v_0.Op != OpConst64 { 23249 break 23250 } 23251 t := v_0.Type 23252 c := v_0.AuxInt 23253 v_1 := v.Args[1] 23254 if v_1.Op != OpSub64 { 23255 break 23256 } 23257 _ = v_1.Args[1] 23258 x := v_1.Args[0] 23259 v_1_1 := v_1.Args[1] 23260 if v_1_1.Op != OpConst64 { 23261 break 23262 } 23263 if v_1_1.Type != t { 23264 break 23265 } 23266 d := v_1_1.AuxInt 23267 v.reset(OpSub64) 23268 v0 := b.NewValue0(v.Pos, OpConst64, t) 23269 v0.AuxInt = c + d 23270 v.AddArg(v0) 23271 v.AddArg(x) 23272 return true 23273 } 23274 return false 23275 } 23276 func rewriteValuegeneric_OpSub64_10(v *Value) bool { 23277 b := v.Block 23278 _ = b 23279 // match: (Sub64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 23280 // cond: 23281 // result: (Add64 (Const64 <t> [c-d]) x) 23282 for { 23283 _ = v.Args[1] 23284 v_0 := v.Args[0] 23285 if v_0.Op != OpConst64 { 23286 break 23287 } 23288 t := v_0.Type 23289 c := v_0.AuxInt 23290 v_1 := v.Args[1] 23291 if v_1.Op != OpSub64 { 23292 break 23293 } 23294 _ = v_1.Args[1] 23295 v_1_0 := v_1.Args[0] 23296 if v_1_0.Op != OpConst64 { 23297 break 23298 } 23299 if v_1_0.Type != t { 23300 break 23301 } 23302 d := v_1_0.AuxInt 23303 x := v_1.Args[1] 23304 v.reset(OpAdd64) 23305 v0 := b.NewValue0(v.Pos, OpConst64, t) 23306 v0.AuxInt = c - d 23307 v.AddArg(v0) 23308 v.AddArg(x) 23309 return true 23310 } 23311 return false 23312 } 23313 func rewriteValuegeneric_OpSub64F_0(v *Value) bool { 23314 // match: (Sub64F (Const64F [c]) (Const64F [d])) 23315 // cond: 23316 // result: (Const64F [f2i(i2f(c) - i2f(d))]) 23317 for { 23318 _ = v.Args[1] 23319 v_0 := v.Args[0] 23320 if v_0.Op != OpConst64F { 23321 break 23322 } 23323 c := v_0.AuxInt 23324 v_1 := v.Args[1] 23325 if v_1.Op != OpConst64F { 23326 break 23327 } 23328 d := v_1.AuxInt 23329 v.reset(OpConst64F) 23330 v.AuxInt = f2i(i2f(c) - i2f(d)) 23331 return true 23332 } 23333 // match: (Sub64F x (Const64F [0])) 23334 // cond: 23335 // result: x 23336 for { 23337 _ = v.Args[1] 23338 x := v.Args[0] 23339 v_1 := v.Args[1] 23340 if v_1.Op != OpConst64F { 23341 break 23342 } 23343 if v_1.AuxInt != 0 { 23344 break 23345 } 23346 v.reset(OpCopy) 23347 v.Type = x.Type 23348 v.AddArg(x) 23349 return true 23350 } 23351 return false 23352 } 23353 func rewriteValuegeneric_OpSub8_0(v *Value) bool { 23354 b := v.Block 23355 _ = b 23356 // match: (Sub8 (Const8 [c]) (Const8 [d])) 23357 // cond: 23358 // result: (Const8 [int64(int8(c-d))]) 23359 for { 23360 _ = v.Args[1] 23361 v_0 := v.Args[0] 23362 if v_0.Op != OpConst8 { 23363 break 23364 } 23365 c := v_0.AuxInt 23366 v_1 := v.Args[1] 23367 if v_1.Op != OpConst8 { 23368 break 23369 } 23370 d := v_1.AuxInt 23371 v.reset(OpConst8) 23372 v.AuxInt = int64(int8(c - d)) 23373 return true 23374 } 23375 // match: (Sub8 x (Const8 <t> [c])) 23376 // cond: x.Op != OpConst8 23377 // result: (Add8 (Const8 <t> [int64(int8(-c))]) x) 23378 for { 23379 _ = v.Args[1] 23380 x := v.Args[0] 23381 v_1 := v.Args[1] 23382 if v_1.Op != OpConst8 { 23383 break 23384 } 23385 t := v_1.Type 23386 c := v_1.AuxInt 23387 if !(x.Op != OpConst8) { 23388 break 23389 } 23390 v.reset(OpAdd8) 23391 v0 := b.NewValue0(v.Pos, OpConst8, t) 23392 v0.AuxInt = int64(int8(-c)) 23393 v.AddArg(v0) 23394 v.AddArg(x) 23395 return true 23396 } 23397 // match: (Sub8 x x) 23398 // cond: 23399 // result: (Const8 [0]) 23400 for { 23401 _ = v.Args[1] 23402 x := v.Args[0] 23403 if x != v.Args[1] { 23404 break 23405 } 23406 v.reset(OpConst8) 23407 v.AuxInt = 0 23408 return true 23409 } 23410 // match: (Sub8 (Add8 x y) x) 23411 // cond: 23412 // result: y 23413 for { 23414 _ = v.Args[1] 23415 v_0 := v.Args[0] 23416 if v_0.Op != OpAdd8 { 23417 break 23418 } 23419 _ = v_0.Args[1] 23420 x := v_0.Args[0] 23421 y := v_0.Args[1] 23422 if x != v.Args[1] { 23423 break 23424 } 23425 v.reset(OpCopy) 23426 v.Type = y.Type 23427 v.AddArg(y) 23428 return true 23429 } 23430 // match: (Sub8 (Add8 y x) x) 23431 // cond: 23432 // result: y 23433 for { 23434 _ = v.Args[1] 23435 v_0 := v.Args[0] 23436 if v_0.Op != OpAdd8 { 23437 break 23438 } 23439 _ = v_0.Args[1] 23440 y := v_0.Args[0] 23441 x := v_0.Args[1] 23442 if x != v.Args[1] { 23443 break 23444 } 23445 v.reset(OpCopy) 23446 v.Type = y.Type 23447 v.AddArg(y) 23448 return true 23449 } 23450 // match: (Sub8 (Add8 x y) y) 23451 // cond: 23452 // result: x 23453 for { 23454 _ = v.Args[1] 23455 v_0 := v.Args[0] 23456 if v_0.Op != OpAdd8 { 23457 break 23458 } 23459 _ = v_0.Args[1] 23460 x := v_0.Args[0] 23461 y := v_0.Args[1] 23462 if y != v.Args[1] { 23463 break 23464 } 23465 v.reset(OpCopy) 23466 v.Type = x.Type 23467 v.AddArg(x) 23468 return true 23469 } 23470 // match: (Sub8 (Add8 y x) y) 23471 // cond: 23472 // result: x 23473 for { 23474 _ = v.Args[1] 23475 v_0 := v.Args[0] 23476 if v_0.Op != OpAdd8 { 23477 break 23478 } 23479 _ = v_0.Args[1] 23480 y := v_0.Args[0] 23481 x := v_0.Args[1] 23482 if y != v.Args[1] { 23483 break 23484 } 23485 v.reset(OpCopy) 23486 v.Type = x.Type 23487 v.AddArg(x) 23488 return true 23489 } 23490 // match: (Sub8 x (Sub8 i:(Const8 <t>) z)) 23491 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 23492 // result: (Sub8 (Add8 <t> x z) i) 23493 for { 23494 _ = v.Args[1] 23495 x := v.Args[0] 23496 v_1 := v.Args[1] 23497 if v_1.Op != OpSub8 { 23498 break 23499 } 23500 _ = v_1.Args[1] 23501 i := v_1.Args[0] 23502 if i.Op != OpConst8 { 23503 break 23504 } 23505 t := i.Type 23506 z := v_1.Args[1] 23507 if !(z.Op != OpConst8 && x.Op != OpConst8) { 23508 break 23509 } 23510 v.reset(OpSub8) 23511 v0 := b.NewValue0(v.Pos, OpAdd8, t) 23512 v0.AddArg(x) 23513 v0.AddArg(z) 23514 v.AddArg(v0) 23515 v.AddArg(i) 23516 return true 23517 } 23518 // match: (Sub8 x (Sub8 z i:(Const8 <t>))) 23519 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 23520 // result: (Add8 i (Sub8 <t> x z)) 23521 for { 23522 _ = v.Args[1] 23523 x := v.Args[0] 23524 v_1 := v.Args[1] 23525 if v_1.Op != OpSub8 { 23526 break 23527 } 23528 _ = v_1.Args[1] 23529 z := v_1.Args[0] 23530 i := v_1.Args[1] 23531 if i.Op != OpConst8 { 23532 break 23533 } 23534 t := i.Type 23535 if !(z.Op != OpConst8 && x.Op != OpConst8) { 23536 break 23537 } 23538 v.reset(OpAdd8) 23539 v.AddArg(i) 23540 v0 := b.NewValue0(v.Pos, OpSub8, t) 23541 v0.AddArg(x) 23542 v0.AddArg(z) 23543 v.AddArg(v0) 23544 return true 23545 } 23546 // match: (Sub8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 23547 // cond: 23548 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 23549 for { 23550 _ = v.Args[1] 23551 v_0 := v.Args[0] 23552 if v_0.Op != OpConst8 { 23553 break 23554 } 23555 t := v_0.Type 23556 c := v_0.AuxInt 23557 v_1 := v.Args[1] 23558 if v_1.Op != OpSub8 { 23559 break 23560 } 23561 _ = v_1.Args[1] 23562 x := v_1.Args[0] 23563 v_1_1 := v_1.Args[1] 23564 if v_1_1.Op != OpConst8 { 23565 break 23566 } 23567 if v_1_1.Type != t { 23568 break 23569 } 23570 d := v_1_1.AuxInt 23571 v.reset(OpSub8) 23572 v0 := b.NewValue0(v.Pos, OpConst8, t) 23573 v0.AuxInt = int64(int8(c + d)) 23574 v.AddArg(v0) 23575 v.AddArg(x) 23576 return true 23577 } 23578 return false 23579 } 23580 func rewriteValuegeneric_OpSub8_10(v *Value) bool { 23581 b := v.Block 23582 _ = b 23583 // match: (Sub8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 23584 // cond: 23585 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 23586 for { 23587 _ = v.Args[1] 23588 v_0 := v.Args[0] 23589 if v_0.Op != OpConst8 { 23590 break 23591 } 23592 t := v_0.Type 23593 c := v_0.AuxInt 23594 v_1 := v.Args[1] 23595 if v_1.Op != OpSub8 { 23596 break 23597 } 23598 _ = v_1.Args[1] 23599 v_1_0 := v_1.Args[0] 23600 if v_1_0.Op != OpConst8 { 23601 break 23602 } 23603 if v_1_0.Type != t { 23604 break 23605 } 23606 d := v_1_0.AuxInt 23607 x := v_1.Args[1] 23608 v.reset(OpAdd8) 23609 v0 := b.NewValue0(v.Pos, OpConst8, t) 23610 v0.AuxInt = int64(int8(c - d)) 23611 v.AddArg(v0) 23612 v.AddArg(x) 23613 return true 23614 } 23615 return false 23616 } 23617 func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { 23618 // match: (Trunc16to8 (Const16 [c])) 23619 // cond: 23620 // result: (Const8 [int64(int8(c))]) 23621 for { 23622 v_0 := v.Args[0] 23623 if v_0.Op != OpConst16 { 23624 break 23625 } 23626 c := v_0.AuxInt 23627 v.reset(OpConst8) 23628 v.AuxInt = int64(int8(c)) 23629 return true 23630 } 23631 // match: (Trunc16to8 (ZeroExt8to16 x)) 23632 // cond: 23633 // result: x 23634 for { 23635 v_0 := v.Args[0] 23636 if v_0.Op != OpZeroExt8to16 { 23637 break 23638 } 23639 x := v_0.Args[0] 23640 v.reset(OpCopy) 23641 v.Type = x.Type 23642 v.AddArg(x) 23643 return true 23644 } 23645 // match: (Trunc16to8 (SignExt8to16 x)) 23646 // cond: 23647 // result: x 23648 for { 23649 v_0 := v.Args[0] 23650 if v_0.Op != OpSignExt8to16 { 23651 break 23652 } 23653 x := v_0.Args[0] 23654 v.reset(OpCopy) 23655 v.Type = x.Type 23656 v.AddArg(x) 23657 return true 23658 } 23659 // match: (Trunc16to8 (And16 (Const16 [y]) x)) 23660 // cond: y&0xFF == 0xFF 23661 // result: (Trunc16to8 x) 23662 for { 23663 v_0 := v.Args[0] 23664 if v_0.Op != OpAnd16 { 23665 break 23666 } 23667 _ = v_0.Args[1] 23668 v_0_0 := v_0.Args[0] 23669 if v_0_0.Op != OpConst16 { 23670 break 23671 } 23672 y := v_0_0.AuxInt 23673 x := v_0.Args[1] 23674 if !(y&0xFF == 0xFF) { 23675 break 23676 } 23677 v.reset(OpTrunc16to8) 23678 v.AddArg(x) 23679 return true 23680 } 23681 // match: (Trunc16to8 (And16 x (Const16 [y]))) 23682 // cond: y&0xFF == 0xFF 23683 // result: (Trunc16to8 x) 23684 for { 23685 v_0 := v.Args[0] 23686 if v_0.Op != OpAnd16 { 23687 break 23688 } 23689 _ = v_0.Args[1] 23690 x := v_0.Args[0] 23691 v_0_1 := v_0.Args[1] 23692 if v_0_1.Op != OpConst16 { 23693 break 23694 } 23695 y := v_0_1.AuxInt 23696 if !(y&0xFF == 0xFF) { 23697 break 23698 } 23699 v.reset(OpTrunc16to8) 23700 v.AddArg(x) 23701 return true 23702 } 23703 return false 23704 } 23705 func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { 23706 // match: (Trunc32to16 (Const32 [c])) 23707 // cond: 23708 // result: (Const16 [int64(int16(c))]) 23709 for { 23710 v_0 := v.Args[0] 23711 if v_0.Op != OpConst32 { 23712 break 23713 } 23714 c := v_0.AuxInt 23715 v.reset(OpConst16) 23716 v.AuxInt = int64(int16(c)) 23717 return true 23718 } 23719 // match: (Trunc32to16 (ZeroExt8to32 x)) 23720 // cond: 23721 // result: (ZeroExt8to16 x) 23722 for { 23723 v_0 := v.Args[0] 23724 if v_0.Op != OpZeroExt8to32 { 23725 break 23726 } 23727 x := v_0.Args[0] 23728 v.reset(OpZeroExt8to16) 23729 v.AddArg(x) 23730 return true 23731 } 23732 // match: (Trunc32to16 (ZeroExt16to32 x)) 23733 // cond: 23734 // result: x 23735 for { 23736 v_0 := v.Args[0] 23737 if v_0.Op != OpZeroExt16to32 { 23738 break 23739 } 23740 x := v_0.Args[0] 23741 v.reset(OpCopy) 23742 v.Type = x.Type 23743 v.AddArg(x) 23744 return true 23745 } 23746 // match: (Trunc32to16 (SignExt8to32 x)) 23747 // cond: 23748 // result: (SignExt8to16 x) 23749 for { 23750 v_0 := v.Args[0] 23751 if v_0.Op != OpSignExt8to32 { 23752 break 23753 } 23754 x := v_0.Args[0] 23755 v.reset(OpSignExt8to16) 23756 v.AddArg(x) 23757 return true 23758 } 23759 // match: (Trunc32to16 (SignExt16to32 x)) 23760 // cond: 23761 // result: x 23762 for { 23763 v_0 := v.Args[0] 23764 if v_0.Op != OpSignExt16to32 { 23765 break 23766 } 23767 x := v_0.Args[0] 23768 v.reset(OpCopy) 23769 v.Type = x.Type 23770 v.AddArg(x) 23771 return true 23772 } 23773 // match: (Trunc32to16 (And32 (Const32 [y]) x)) 23774 // cond: y&0xFFFF == 0xFFFF 23775 // result: (Trunc32to16 x) 23776 for { 23777 v_0 := v.Args[0] 23778 if v_0.Op != OpAnd32 { 23779 break 23780 } 23781 _ = v_0.Args[1] 23782 v_0_0 := v_0.Args[0] 23783 if v_0_0.Op != OpConst32 { 23784 break 23785 } 23786 y := v_0_0.AuxInt 23787 x := v_0.Args[1] 23788 if !(y&0xFFFF == 0xFFFF) { 23789 break 23790 } 23791 v.reset(OpTrunc32to16) 23792 v.AddArg(x) 23793 return true 23794 } 23795 // match: (Trunc32to16 (And32 x (Const32 [y]))) 23796 // cond: y&0xFFFF == 0xFFFF 23797 // result: (Trunc32to16 x) 23798 for { 23799 v_0 := v.Args[0] 23800 if v_0.Op != OpAnd32 { 23801 break 23802 } 23803 _ = v_0.Args[1] 23804 x := v_0.Args[0] 23805 v_0_1 := v_0.Args[1] 23806 if v_0_1.Op != OpConst32 { 23807 break 23808 } 23809 y := v_0_1.AuxInt 23810 if !(y&0xFFFF == 0xFFFF) { 23811 break 23812 } 23813 v.reset(OpTrunc32to16) 23814 v.AddArg(x) 23815 return true 23816 } 23817 return false 23818 } 23819 func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { 23820 // match: (Trunc32to8 (Const32 [c])) 23821 // cond: 23822 // result: (Const8 [int64(int8(c))]) 23823 for { 23824 v_0 := v.Args[0] 23825 if v_0.Op != OpConst32 { 23826 break 23827 } 23828 c := v_0.AuxInt 23829 v.reset(OpConst8) 23830 v.AuxInt = int64(int8(c)) 23831 return true 23832 } 23833 // match: (Trunc32to8 (ZeroExt8to32 x)) 23834 // cond: 23835 // result: x 23836 for { 23837 v_0 := v.Args[0] 23838 if v_0.Op != OpZeroExt8to32 { 23839 break 23840 } 23841 x := v_0.Args[0] 23842 v.reset(OpCopy) 23843 v.Type = x.Type 23844 v.AddArg(x) 23845 return true 23846 } 23847 // match: (Trunc32to8 (SignExt8to32 x)) 23848 // cond: 23849 // result: x 23850 for { 23851 v_0 := v.Args[0] 23852 if v_0.Op != OpSignExt8to32 { 23853 break 23854 } 23855 x := v_0.Args[0] 23856 v.reset(OpCopy) 23857 v.Type = x.Type 23858 v.AddArg(x) 23859 return true 23860 } 23861 // match: (Trunc32to8 (And32 (Const32 [y]) x)) 23862 // cond: y&0xFF == 0xFF 23863 // result: (Trunc32to8 x) 23864 for { 23865 v_0 := v.Args[0] 23866 if v_0.Op != OpAnd32 { 23867 break 23868 } 23869 _ = v_0.Args[1] 23870 v_0_0 := v_0.Args[0] 23871 if v_0_0.Op != OpConst32 { 23872 break 23873 } 23874 y := v_0_0.AuxInt 23875 x := v_0.Args[1] 23876 if !(y&0xFF == 0xFF) { 23877 break 23878 } 23879 v.reset(OpTrunc32to8) 23880 v.AddArg(x) 23881 return true 23882 } 23883 // match: (Trunc32to8 (And32 x (Const32 [y]))) 23884 // cond: y&0xFF == 0xFF 23885 // result: (Trunc32to8 x) 23886 for { 23887 v_0 := v.Args[0] 23888 if v_0.Op != OpAnd32 { 23889 break 23890 } 23891 _ = v_0.Args[1] 23892 x := v_0.Args[0] 23893 v_0_1 := v_0.Args[1] 23894 if v_0_1.Op != OpConst32 { 23895 break 23896 } 23897 y := v_0_1.AuxInt 23898 if !(y&0xFF == 0xFF) { 23899 break 23900 } 23901 v.reset(OpTrunc32to8) 23902 v.AddArg(x) 23903 return true 23904 } 23905 return false 23906 } 23907 func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { 23908 // match: (Trunc64to16 (Const64 [c])) 23909 // cond: 23910 // result: (Const16 [int64(int16(c))]) 23911 for { 23912 v_0 := v.Args[0] 23913 if v_0.Op != OpConst64 { 23914 break 23915 } 23916 c := v_0.AuxInt 23917 v.reset(OpConst16) 23918 v.AuxInt = int64(int16(c)) 23919 return true 23920 } 23921 // match: (Trunc64to16 (ZeroExt8to64 x)) 23922 // cond: 23923 // result: (ZeroExt8to16 x) 23924 for { 23925 v_0 := v.Args[0] 23926 if v_0.Op != OpZeroExt8to64 { 23927 break 23928 } 23929 x := v_0.Args[0] 23930 v.reset(OpZeroExt8to16) 23931 v.AddArg(x) 23932 return true 23933 } 23934 // match: (Trunc64to16 (ZeroExt16to64 x)) 23935 // cond: 23936 // result: x 23937 for { 23938 v_0 := v.Args[0] 23939 if v_0.Op != OpZeroExt16to64 { 23940 break 23941 } 23942 x := v_0.Args[0] 23943 v.reset(OpCopy) 23944 v.Type = x.Type 23945 v.AddArg(x) 23946 return true 23947 } 23948 // match: (Trunc64to16 (SignExt8to64 x)) 23949 // cond: 23950 // result: (SignExt8to16 x) 23951 for { 23952 v_0 := v.Args[0] 23953 if v_0.Op != OpSignExt8to64 { 23954 break 23955 } 23956 x := v_0.Args[0] 23957 v.reset(OpSignExt8to16) 23958 v.AddArg(x) 23959 return true 23960 } 23961 // match: (Trunc64to16 (SignExt16to64 x)) 23962 // cond: 23963 // result: x 23964 for { 23965 v_0 := v.Args[0] 23966 if v_0.Op != OpSignExt16to64 { 23967 break 23968 } 23969 x := v_0.Args[0] 23970 v.reset(OpCopy) 23971 v.Type = x.Type 23972 v.AddArg(x) 23973 return true 23974 } 23975 // match: (Trunc64to16 (And64 (Const64 [y]) x)) 23976 // cond: y&0xFFFF == 0xFFFF 23977 // result: (Trunc64to16 x) 23978 for { 23979 v_0 := v.Args[0] 23980 if v_0.Op != OpAnd64 { 23981 break 23982 } 23983 _ = v_0.Args[1] 23984 v_0_0 := v_0.Args[0] 23985 if v_0_0.Op != OpConst64 { 23986 break 23987 } 23988 y := v_0_0.AuxInt 23989 x := v_0.Args[1] 23990 if !(y&0xFFFF == 0xFFFF) { 23991 break 23992 } 23993 v.reset(OpTrunc64to16) 23994 v.AddArg(x) 23995 return true 23996 } 23997 // match: (Trunc64to16 (And64 x (Const64 [y]))) 23998 // cond: y&0xFFFF == 0xFFFF 23999 // result: (Trunc64to16 x) 24000 for { 24001 v_0 := v.Args[0] 24002 if v_0.Op != OpAnd64 { 24003 break 24004 } 24005 _ = v_0.Args[1] 24006 x := v_0.Args[0] 24007 v_0_1 := v_0.Args[1] 24008 if v_0_1.Op != OpConst64 { 24009 break 24010 } 24011 y := v_0_1.AuxInt 24012 if !(y&0xFFFF == 0xFFFF) { 24013 break 24014 } 24015 v.reset(OpTrunc64to16) 24016 v.AddArg(x) 24017 return true 24018 } 24019 return false 24020 } 24021 func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { 24022 // match: (Trunc64to32 (Const64 [c])) 24023 // cond: 24024 // result: (Const32 [int64(int32(c))]) 24025 for { 24026 v_0 := v.Args[0] 24027 if v_0.Op != OpConst64 { 24028 break 24029 } 24030 c := v_0.AuxInt 24031 v.reset(OpConst32) 24032 v.AuxInt = int64(int32(c)) 24033 return true 24034 } 24035 // match: (Trunc64to32 (ZeroExt8to64 x)) 24036 // cond: 24037 // result: (ZeroExt8to32 x) 24038 for { 24039 v_0 := v.Args[0] 24040 if v_0.Op != OpZeroExt8to64 { 24041 break 24042 } 24043 x := v_0.Args[0] 24044 v.reset(OpZeroExt8to32) 24045 v.AddArg(x) 24046 return true 24047 } 24048 // match: (Trunc64to32 (ZeroExt16to64 x)) 24049 // cond: 24050 // result: (ZeroExt16to32 x) 24051 for { 24052 v_0 := v.Args[0] 24053 if v_0.Op != OpZeroExt16to64 { 24054 break 24055 } 24056 x := v_0.Args[0] 24057 v.reset(OpZeroExt16to32) 24058 v.AddArg(x) 24059 return true 24060 } 24061 // match: (Trunc64to32 (ZeroExt32to64 x)) 24062 // cond: 24063 // result: x 24064 for { 24065 v_0 := v.Args[0] 24066 if v_0.Op != OpZeroExt32to64 { 24067 break 24068 } 24069 x := v_0.Args[0] 24070 v.reset(OpCopy) 24071 v.Type = x.Type 24072 v.AddArg(x) 24073 return true 24074 } 24075 // match: (Trunc64to32 (SignExt8to64 x)) 24076 // cond: 24077 // result: (SignExt8to32 x) 24078 for { 24079 v_0 := v.Args[0] 24080 if v_0.Op != OpSignExt8to64 { 24081 break 24082 } 24083 x := v_0.Args[0] 24084 v.reset(OpSignExt8to32) 24085 v.AddArg(x) 24086 return true 24087 } 24088 // match: (Trunc64to32 (SignExt16to64 x)) 24089 // cond: 24090 // result: (SignExt16to32 x) 24091 for { 24092 v_0 := v.Args[0] 24093 if v_0.Op != OpSignExt16to64 { 24094 break 24095 } 24096 x := v_0.Args[0] 24097 v.reset(OpSignExt16to32) 24098 v.AddArg(x) 24099 return true 24100 } 24101 // match: (Trunc64to32 (SignExt32to64 x)) 24102 // cond: 24103 // result: x 24104 for { 24105 v_0 := v.Args[0] 24106 if v_0.Op != OpSignExt32to64 { 24107 break 24108 } 24109 x := v_0.Args[0] 24110 v.reset(OpCopy) 24111 v.Type = x.Type 24112 v.AddArg(x) 24113 return true 24114 } 24115 // match: (Trunc64to32 (And64 (Const64 [y]) x)) 24116 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 24117 // result: (Trunc64to32 x) 24118 for { 24119 v_0 := v.Args[0] 24120 if v_0.Op != OpAnd64 { 24121 break 24122 } 24123 _ = v_0.Args[1] 24124 v_0_0 := v_0.Args[0] 24125 if v_0_0.Op != OpConst64 { 24126 break 24127 } 24128 y := v_0_0.AuxInt 24129 x := v_0.Args[1] 24130 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 24131 break 24132 } 24133 v.reset(OpTrunc64to32) 24134 v.AddArg(x) 24135 return true 24136 } 24137 // match: (Trunc64to32 (And64 x (Const64 [y]))) 24138 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 24139 // result: (Trunc64to32 x) 24140 for { 24141 v_0 := v.Args[0] 24142 if v_0.Op != OpAnd64 { 24143 break 24144 } 24145 _ = v_0.Args[1] 24146 x := v_0.Args[0] 24147 v_0_1 := v_0.Args[1] 24148 if v_0_1.Op != OpConst64 { 24149 break 24150 } 24151 y := v_0_1.AuxInt 24152 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 24153 break 24154 } 24155 v.reset(OpTrunc64to32) 24156 v.AddArg(x) 24157 return true 24158 } 24159 return false 24160 } 24161 func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { 24162 // match: (Trunc64to8 (Const64 [c])) 24163 // cond: 24164 // result: (Const8 [int64(int8(c))]) 24165 for { 24166 v_0 := v.Args[0] 24167 if v_0.Op != OpConst64 { 24168 break 24169 } 24170 c := v_0.AuxInt 24171 v.reset(OpConst8) 24172 v.AuxInt = int64(int8(c)) 24173 return true 24174 } 24175 // match: (Trunc64to8 (ZeroExt8to64 x)) 24176 // cond: 24177 // result: x 24178 for { 24179 v_0 := v.Args[0] 24180 if v_0.Op != OpZeroExt8to64 { 24181 break 24182 } 24183 x := v_0.Args[0] 24184 v.reset(OpCopy) 24185 v.Type = x.Type 24186 v.AddArg(x) 24187 return true 24188 } 24189 // match: (Trunc64to8 (SignExt8to64 x)) 24190 // cond: 24191 // result: x 24192 for { 24193 v_0 := v.Args[0] 24194 if v_0.Op != OpSignExt8to64 { 24195 break 24196 } 24197 x := v_0.Args[0] 24198 v.reset(OpCopy) 24199 v.Type = x.Type 24200 v.AddArg(x) 24201 return true 24202 } 24203 // match: (Trunc64to8 (And64 (Const64 [y]) x)) 24204 // cond: y&0xFF == 0xFF 24205 // result: (Trunc64to8 x) 24206 for { 24207 v_0 := v.Args[0] 24208 if v_0.Op != OpAnd64 { 24209 break 24210 } 24211 _ = v_0.Args[1] 24212 v_0_0 := v_0.Args[0] 24213 if v_0_0.Op != OpConst64 { 24214 break 24215 } 24216 y := v_0_0.AuxInt 24217 x := v_0.Args[1] 24218 if !(y&0xFF == 0xFF) { 24219 break 24220 } 24221 v.reset(OpTrunc64to8) 24222 v.AddArg(x) 24223 return true 24224 } 24225 // match: (Trunc64to8 (And64 x (Const64 [y]))) 24226 // cond: y&0xFF == 0xFF 24227 // result: (Trunc64to8 x) 24228 for { 24229 v_0 := v.Args[0] 24230 if v_0.Op != OpAnd64 { 24231 break 24232 } 24233 _ = v_0.Args[1] 24234 x := v_0.Args[0] 24235 v_0_1 := v_0.Args[1] 24236 if v_0_1.Op != OpConst64 { 24237 break 24238 } 24239 y := v_0_1.AuxInt 24240 if !(y&0xFF == 0xFF) { 24241 break 24242 } 24243 v.reset(OpTrunc64to8) 24244 v.AddArg(x) 24245 return true 24246 } 24247 return false 24248 } 24249 func rewriteValuegeneric_OpXor16_0(v *Value) bool { 24250 b := v.Block 24251 _ = b 24252 // match: (Xor16 (Const16 [c]) (Const16 [d])) 24253 // cond: 24254 // result: (Const16 [int64(int16(c^d))]) 24255 for { 24256 _ = v.Args[1] 24257 v_0 := v.Args[0] 24258 if v_0.Op != OpConst16 { 24259 break 24260 } 24261 c := v_0.AuxInt 24262 v_1 := v.Args[1] 24263 if v_1.Op != OpConst16 { 24264 break 24265 } 24266 d := v_1.AuxInt 24267 v.reset(OpConst16) 24268 v.AuxInt = int64(int16(c ^ d)) 24269 return true 24270 } 24271 // match: (Xor16 (Const16 [d]) (Const16 [c])) 24272 // cond: 24273 // result: (Const16 [int64(int16(c^d))]) 24274 for { 24275 _ = v.Args[1] 24276 v_0 := v.Args[0] 24277 if v_0.Op != OpConst16 { 24278 break 24279 } 24280 d := v_0.AuxInt 24281 v_1 := v.Args[1] 24282 if v_1.Op != OpConst16 { 24283 break 24284 } 24285 c := v_1.AuxInt 24286 v.reset(OpConst16) 24287 v.AuxInt = int64(int16(c ^ d)) 24288 return true 24289 } 24290 // match: (Xor16 x x) 24291 // cond: 24292 // result: (Const16 [0]) 24293 for { 24294 _ = v.Args[1] 24295 x := v.Args[0] 24296 if x != v.Args[1] { 24297 break 24298 } 24299 v.reset(OpConst16) 24300 v.AuxInt = 0 24301 return true 24302 } 24303 // match: (Xor16 (Const16 [0]) x) 24304 // cond: 24305 // result: x 24306 for { 24307 _ = v.Args[1] 24308 v_0 := v.Args[0] 24309 if v_0.Op != OpConst16 { 24310 break 24311 } 24312 if v_0.AuxInt != 0 { 24313 break 24314 } 24315 x := v.Args[1] 24316 v.reset(OpCopy) 24317 v.Type = x.Type 24318 v.AddArg(x) 24319 return true 24320 } 24321 // match: (Xor16 x (Const16 [0])) 24322 // cond: 24323 // result: x 24324 for { 24325 _ = v.Args[1] 24326 x := v.Args[0] 24327 v_1 := v.Args[1] 24328 if v_1.Op != OpConst16 { 24329 break 24330 } 24331 if v_1.AuxInt != 0 { 24332 break 24333 } 24334 v.reset(OpCopy) 24335 v.Type = x.Type 24336 v.AddArg(x) 24337 return true 24338 } 24339 // match: (Xor16 x (Xor16 x y)) 24340 // cond: 24341 // result: y 24342 for { 24343 _ = v.Args[1] 24344 x := v.Args[0] 24345 v_1 := v.Args[1] 24346 if v_1.Op != OpXor16 { 24347 break 24348 } 24349 _ = v_1.Args[1] 24350 if x != v_1.Args[0] { 24351 break 24352 } 24353 y := v_1.Args[1] 24354 v.reset(OpCopy) 24355 v.Type = y.Type 24356 v.AddArg(y) 24357 return true 24358 } 24359 // match: (Xor16 x (Xor16 y x)) 24360 // cond: 24361 // result: y 24362 for { 24363 _ = v.Args[1] 24364 x := v.Args[0] 24365 v_1 := v.Args[1] 24366 if v_1.Op != OpXor16 { 24367 break 24368 } 24369 _ = v_1.Args[1] 24370 y := v_1.Args[0] 24371 if x != v_1.Args[1] { 24372 break 24373 } 24374 v.reset(OpCopy) 24375 v.Type = y.Type 24376 v.AddArg(y) 24377 return true 24378 } 24379 // match: (Xor16 (Xor16 x y) x) 24380 // cond: 24381 // result: y 24382 for { 24383 _ = v.Args[1] 24384 v_0 := v.Args[0] 24385 if v_0.Op != OpXor16 { 24386 break 24387 } 24388 _ = v_0.Args[1] 24389 x := v_0.Args[0] 24390 y := v_0.Args[1] 24391 if x != v.Args[1] { 24392 break 24393 } 24394 v.reset(OpCopy) 24395 v.Type = y.Type 24396 v.AddArg(y) 24397 return true 24398 } 24399 // match: (Xor16 (Xor16 y x) x) 24400 // cond: 24401 // result: y 24402 for { 24403 _ = v.Args[1] 24404 v_0 := v.Args[0] 24405 if v_0.Op != OpXor16 { 24406 break 24407 } 24408 _ = v_0.Args[1] 24409 y := v_0.Args[0] 24410 x := v_0.Args[1] 24411 if x != v.Args[1] { 24412 break 24413 } 24414 v.reset(OpCopy) 24415 v.Type = y.Type 24416 v.AddArg(y) 24417 return true 24418 } 24419 // match: (Xor16 (Xor16 i:(Const16 <t>) z) x) 24420 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24421 // result: (Xor16 i (Xor16 <t> z x)) 24422 for { 24423 _ = v.Args[1] 24424 v_0 := v.Args[0] 24425 if v_0.Op != OpXor16 { 24426 break 24427 } 24428 _ = v_0.Args[1] 24429 i := v_0.Args[0] 24430 if i.Op != OpConst16 { 24431 break 24432 } 24433 t := i.Type 24434 z := v_0.Args[1] 24435 x := v.Args[1] 24436 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24437 break 24438 } 24439 v.reset(OpXor16) 24440 v.AddArg(i) 24441 v0 := b.NewValue0(v.Pos, OpXor16, t) 24442 v0.AddArg(z) 24443 v0.AddArg(x) 24444 v.AddArg(v0) 24445 return true 24446 } 24447 return false 24448 } 24449 func rewriteValuegeneric_OpXor16_10(v *Value) bool { 24450 b := v.Block 24451 _ = b 24452 // match: (Xor16 (Xor16 z i:(Const16 <t>)) x) 24453 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24454 // result: (Xor16 i (Xor16 <t> z x)) 24455 for { 24456 _ = v.Args[1] 24457 v_0 := v.Args[0] 24458 if v_0.Op != OpXor16 { 24459 break 24460 } 24461 _ = v_0.Args[1] 24462 z := v_0.Args[0] 24463 i := v_0.Args[1] 24464 if i.Op != OpConst16 { 24465 break 24466 } 24467 t := i.Type 24468 x := v.Args[1] 24469 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24470 break 24471 } 24472 v.reset(OpXor16) 24473 v.AddArg(i) 24474 v0 := b.NewValue0(v.Pos, OpXor16, t) 24475 v0.AddArg(z) 24476 v0.AddArg(x) 24477 v.AddArg(v0) 24478 return true 24479 } 24480 // match: (Xor16 x (Xor16 i:(Const16 <t>) z)) 24481 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24482 // result: (Xor16 i (Xor16 <t> z x)) 24483 for { 24484 _ = v.Args[1] 24485 x := v.Args[0] 24486 v_1 := v.Args[1] 24487 if v_1.Op != OpXor16 { 24488 break 24489 } 24490 _ = v_1.Args[1] 24491 i := v_1.Args[0] 24492 if i.Op != OpConst16 { 24493 break 24494 } 24495 t := i.Type 24496 z := v_1.Args[1] 24497 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24498 break 24499 } 24500 v.reset(OpXor16) 24501 v.AddArg(i) 24502 v0 := b.NewValue0(v.Pos, OpXor16, t) 24503 v0.AddArg(z) 24504 v0.AddArg(x) 24505 v.AddArg(v0) 24506 return true 24507 } 24508 // match: (Xor16 x (Xor16 z i:(Const16 <t>))) 24509 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24510 // result: (Xor16 i (Xor16 <t> z x)) 24511 for { 24512 _ = v.Args[1] 24513 x := v.Args[0] 24514 v_1 := v.Args[1] 24515 if v_1.Op != OpXor16 { 24516 break 24517 } 24518 _ = v_1.Args[1] 24519 z := v_1.Args[0] 24520 i := v_1.Args[1] 24521 if i.Op != OpConst16 { 24522 break 24523 } 24524 t := i.Type 24525 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24526 break 24527 } 24528 v.reset(OpXor16) 24529 v.AddArg(i) 24530 v0 := b.NewValue0(v.Pos, OpXor16, t) 24531 v0.AddArg(z) 24532 v0.AddArg(x) 24533 v.AddArg(v0) 24534 return true 24535 } 24536 // match: (Xor16 (Const16 <t> [c]) (Xor16 (Const16 <t> [d]) x)) 24537 // cond: 24538 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 24539 for { 24540 _ = v.Args[1] 24541 v_0 := v.Args[0] 24542 if v_0.Op != OpConst16 { 24543 break 24544 } 24545 t := v_0.Type 24546 c := v_0.AuxInt 24547 v_1 := v.Args[1] 24548 if v_1.Op != OpXor16 { 24549 break 24550 } 24551 _ = v_1.Args[1] 24552 v_1_0 := v_1.Args[0] 24553 if v_1_0.Op != OpConst16 { 24554 break 24555 } 24556 if v_1_0.Type != t { 24557 break 24558 } 24559 d := v_1_0.AuxInt 24560 x := v_1.Args[1] 24561 v.reset(OpXor16) 24562 v0 := b.NewValue0(v.Pos, OpConst16, t) 24563 v0.AuxInt = int64(int16(c ^ d)) 24564 v.AddArg(v0) 24565 v.AddArg(x) 24566 return true 24567 } 24568 // match: (Xor16 (Const16 <t> [c]) (Xor16 x (Const16 <t> [d]))) 24569 // cond: 24570 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 24571 for { 24572 _ = v.Args[1] 24573 v_0 := v.Args[0] 24574 if v_0.Op != OpConst16 { 24575 break 24576 } 24577 t := v_0.Type 24578 c := v_0.AuxInt 24579 v_1 := v.Args[1] 24580 if v_1.Op != OpXor16 { 24581 break 24582 } 24583 _ = v_1.Args[1] 24584 x := v_1.Args[0] 24585 v_1_1 := v_1.Args[1] 24586 if v_1_1.Op != OpConst16 { 24587 break 24588 } 24589 if v_1_1.Type != t { 24590 break 24591 } 24592 d := v_1_1.AuxInt 24593 v.reset(OpXor16) 24594 v0 := b.NewValue0(v.Pos, OpConst16, t) 24595 v0.AuxInt = int64(int16(c ^ d)) 24596 v.AddArg(v0) 24597 v.AddArg(x) 24598 return true 24599 } 24600 // match: (Xor16 (Xor16 (Const16 <t> [d]) x) (Const16 <t> [c])) 24601 // cond: 24602 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 24603 for { 24604 _ = v.Args[1] 24605 v_0 := v.Args[0] 24606 if v_0.Op != OpXor16 { 24607 break 24608 } 24609 _ = v_0.Args[1] 24610 v_0_0 := v_0.Args[0] 24611 if v_0_0.Op != OpConst16 { 24612 break 24613 } 24614 t := v_0_0.Type 24615 d := v_0_0.AuxInt 24616 x := v_0.Args[1] 24617 v_1 := v.Args[1] 24618 if v_1.Op != OpConst16 { 24619 break 24620 } 24621 if v_1.Type != t { 24622 break 24623 } 24624 c := v_1.AuxInt 24625 v.reset(OpXor16) 24626 v0 := b.NewValue0(v.Pos, OpConst16, t) 24627 v0.AuxInt = int64(int16(c ^ d)) 24628 v.AddArg(v0) 24629 v.AddArg(x) 24630 return true 24631 } 24632 // match: (Xor16 (Xor16 x (Const16 <t> [d])) (Const16 <t> [c])) 24633 // cond: 24634 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 24635 for { 24636 _ = v.Args[1] 24637 v_0 := v.Args[0] 24638 if v_0.Op != OpXor16 { 24639 break 24640 } 24641 _ = v_0.Args[1] 24642 x := v_0.Args[0] 24643 v_0_1 := v_0.Args[1] 24644 if v_0_1.Op != OpConst16 { 24645 break 24646 } 24647 t := v_0_1.Type 24648 d := v_0_1.AuxInt 24649 v_1 := v.Args[1] 24650 if v_1.Op != OpConst16 { 24651 break 24652 } 24653 if v_1.Type != t { 24654 break 24655 } 24656 c := v_1.AuxInt 24657 v.reset(OpXor16) 24658 v0 := b.NewValue0(v.Pos, OpConst16, t) 24659 v0.AuxInt = int64(int16(c ^ d)) 24660 v.AddArg(v0) 24661 v.AddArg(x) 24662 return true 24663 } 24664 return false 24665 } 24666 func rewriteValuegeneric_OpXor32_0(v *Value) bool { 24667 b := v.Block 24668 _ = b 24669 // match: (Xor32 (Const32 [c]) (Const32 [d])) 24670 // cond: 24671 // result: (Const32 [int64(int32(c^d))]) 24672 for { 24673 _ = v.Args[1] 24674 v_0 := v.Args[0] 24675 if v_0.Op != OpConst32 { 24676 break 24677 } 24678 c := v_0.AuxInt 24679 v_1 := v.Args[1] 24680 if v_1.Op != OpConst32 { 24681 break 24682 } 24683 d := v_1.AuxInt 24684 v.reset(OpConst32) 24685 v.AuxInt = int64(int32(c ^ d)) 24686 return true 24687 } 24688 // match: (Xor32 (Const32 [d]) (Const32 [c])) 24689 // cond: 24690 // result: (Const32 [int64(int32(c^d))]) 24691 for { 24692 _ = v.Args[1] 24693 v_0 := v.Args[0] 24694 if v_0.Op != OpConst32 { 24695 break 24696 } 24697 d := v_0.AuxInt 24698 v_1 := v.Args[1] 24699 if v_1.Op != OpConst32 { 24700 break 24701 } 24702 c := v_1.AuxInt 24703 v.reset(OpConst32) 24704 v.AuxInt = int64(int32(c ^ d)) 24705 return true 24706 } 24707 // match: (Xor32 x x) 24708 // cond: 24709 // result: (Const32 [0]) 24710 for { 24711 _ = v.Args[1] 24712 x := v.Args[0] 24713 if x != v.Args[1] { 24714 break 24715 } 24716 v.reset(OpConst32) 24717 v.AuxInt = 0 24718 return true 24719 } 24720 // match: (Xor32 (Const32 [0]) x) 24721 // cond: 24722 // result: x 24723 for { 24724 _ = v.Args[1] 24725 v_0 := v.Args[0] 24726 if v_0.Op != OpConst32 { 24727 break 24728 } 24729 if v_0.AuxInt != 0 { 24730 break 24731 } 24732 x := v.Args[1] 24733 v.reset(OpCopy) 24734 v.Type = x.Type 24735 v.AddArg(x) 24736 return true 24737 } 24738 // match: (Xor32 x (Const32 [0])) 24739 // cond: 24740 // result: x 24741 for { 24742 _ = v.Args[1] 24743 x := v.Args[0] 24744 v_1 := v.Args[1] 24745 if v_1.Op != OpConst32 { 24746 break 24747 } 24748 if v_1.AuxInt != 0 { 24749 break 24750 } 24751 v.reset(OpCopy) 24752 v.Type = x.Type 24753 v.AddArg(x) 24754 return true 24755 } 24756 // match: (Xor32 x (Xor32 x y)) 24757 // cond: 24758 // result: y 24759 for { 24760 _ = v.Args[1] 24761 x := v.Args[0] 24762 v_1 := v.Args[1] 24763 if v_1.Op != OpXor32 { 24764 break 24765 } 24766 _ = v_1.Args[1] 24767 if x != v_1.Args[0] { 24768 break 24769 } 24770 y := v_1.Args[1] 24771 v.reset(OpCopy) 24772 v.Type = y.Type 24773 v.AddArg(y) 24774 return true 24775 } 24776 // match: (Xor32 x (Xor32 y x)) 24777 // cond: 24778 // result: y 24779 for { 24780 _ = v.Args[1] 24781 x := v.Args[0] 24782 v_1 := v.Args[1] 24783 if v_1.Op != OpXor32 { 24784 break 24785 } 24786 _ = v_1.Args[1] 24787 y := v_1.Args[0] 24788 if x != v_1.Args[1] { 24789 break 24790 } 24791 v.reset(OpCopy) 24792 v.Type = y.Type 24793 v.AddArg(y) 24794 return true 24795 } 24796 // match: (Xor32 (Xor32 x y) x) 24797 // cond: 24798 // result: y 24799 for { 24800 _ = v.Args[1] 24801 v_0 := v.Args[0] 24802 if v_0.Op != OpXor32 { 24803 break 24804 } 24805 _ = v_0.Args[1] 24806 x := v_0.Args[0] 24807 y := v_0.Args[1] 24808 if x != v.Args[1] { 24809 break 24810 } 24811 v.reset(OpCopy) 24812 v.Type = y.Type 24813 v.AddArg(y) 24814 return true 24815 } 24816 // match: (Xor32 (Xor32 y x) x) 24817 // cond: 24818 // result: y 24819 for { 24820 _ = v.Args[1] 24821 v_0 := v.Args[0] 24822 if v_0.Op != OpXor32 { 24823 break 24824 } 24825 _ = v_0.Args[1] 24826 y := v_0.Args[0] 24827 x := v_0.Args[1] 24828 if x != v.Args[1] { 24829 break 24830 } 24831 v.reset(OpCopy) 24832 v.Type = y.Type 24833 v.AddArg(y) 24834 return true 24835 } 24836 // match: (Xor32 (Xor32 i:(Const32 <t>) z) x) 24837 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24838 // result: (Xor32 i (Xor32 <t> z x)) 24839 for { 24840 _ = v.Args[1] 24841 v_0 := v.Args[0] 24842 if v_0.Op != OpXor32 { 24843 break 24844 } 24845 _ = v_0.Args[1] 24846 i := v_0.Args[0] 24847 if i.Op != OpConst32 { 24848 break 24849 } 24850 t := i.Type 24851 z := v_0.Args[1] 24852 x := v.Args[1] 24853 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24854 break 24855 } 24856 v.reset(OpXor32) 24857 v.AddArg(i) 24858 v0 := b.NewValue0(v.Pos, OpXor32, t) 24859 v0.AddArg(z) 24860 v0.AddArg(x) 24861 v.AddArg(v0) 24862 return true 24863 } 24864 return false 24865 } 24866 func rewriteValuegeneric_OpXor32_10(v *Value) bool { 24867 b := v.Block 24868 _ = b 24869 // match: (Xor32 (Xor32 z i:(Const32 <t>)) x) 24870 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24871 // result: (Xor32 i (Xor32 <t> z x)) 24872 for { 24873 _ = v.Args[1] 24874 v_0 := v.Args[0] 24875 if v_0.Op != OpXor32 { 24876 break 24877 } 24878 _ = v_0.Args[1] 24879 z := v_0.Args[0] 24880 i := v_0.Args[1] 24881 if i.Op != OpConst32 { 24882 break 24883 } 24884 t := i.Type 24885 x := v.Args[1] 24886 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24887 break 24888 } 24889 v.reset(OpXor32) 24890 v.AddArg(i) 24891 v0 := b.NewValue0(v.Pos, OpXor32, t) 24892 v0.AddArg(z) 24893 v0.AddArg(x) 24894 v.AddArg(v0) 24895 return true 24896 } 24897 // match: (Xor32 x (Xor32 i:(Const32 <t>) z)) 24898 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24899 // result: (Xor32 i (Xor32 <t> z x)) 24900 for { 24901 _ = v.Args[1] 24902 x := v.Args[0] 24903 v_1 := v.Args[1] 24904 if v_1.Op != OpXor32 { 24905 break 24906 } 24907 _ = v_1.Args[1] 24908 i := v_1.Args[0] 24909 if i.Op != OpConst32 { 24910 break 24911 } 24912 t := i.Type 24913 z := v_1.Args[1] 24914 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24915 break 24916 } 24917 v.reset(OpXor32) 24918 v.AddArg(i) 24919 v0 := b.NewValue0(v.Pos, OpXor32, t) 24920 v0.AddArg(z) 24921 v0.AddArg(x) 24922 v.AddArg(v0) 24923 return true 24924 } 24925 // match: (Xor32 x (Xor32 z i:(Const32 <t>))) 24926 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24927 // result: (Xor32 i (Xor32 <t> z x)) 24928 for { 24929 _ = v.Args[1] 24930 x := v.Args[0] 24931 v_1 := v.Args[1] 24932 if v_1.Op != OpXor32 { 24933 break 24934 } 24935 _ = v_1.Args[1] 24936 z := v_1.Args[0] 24937 i := v_1.Args[1] 24938 if i.Op != OpConst32 { 24939 break 24940 } 24941 t := i.Type 24942 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24943 break 24944 } 24945 v.reset(OpXor32) 24946 v.AddArg(i) 24947 v0 := b.NewValue0(v.Pos, OpXor32, t) 24948 v0.AddArg(z) 24949 v0.AddArg(x) 24950 v.AddArg(v0) 24951 return true 24952 } 24953 // match: (Xor32 (Const32 <t> [c]) (Xor32 (Const32 <t> [d]) x)) 24954 // cond: 24955 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 24956 for { 24957 _ = v.Args[1] 24958 v_0 := v.Args[0] 24959 if v_0.Op != OpConst32 { 24960 break 24961 } 24962 t := v_0.Type 24963 c := v_0.AuxInt 24964 v_1 := v.Args[1] 24965 if v_1.Op != OpXor32 { 24966 break 24967 } 24968 _ = v_1.Args[1] 24969 v_1_0 := v_1.Args[0] 24970 if v_1_0.Op != OpConst32 { 24971 break 24972 } 24973 if v_1_0.Type != t { 24974 break 24975 } 24976 d := v_1_0.AuxInt 24977 x := v_1.Args[1] 24978 v.reset(OpXor32) 24979 v0 := b.NewValue0(v.Pos, OpConst32, t) 24980 v0.AuxInt = int64(int32(c ^ d)) 24981 v.AddArg(v0) 24982 v.AddArg(x) 24983 return true 24984 } 24985 // match: (Xor32 (Const32 <t> [c]) (Xor32 x (Const32 <t> [d]))) 24986 // cond: 24987 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 24988 for { 24989 _ = v.Args[1] 24990 v_0 := v.Args[0] 24991 if v_0.Op != OpConst32 { 24992 break 24993 } 24994 t := v_0.Type 24995 c := v_0.AuxInt 24996 v_1 := v.Args[1] 24997 if v_1.Op != OpXor32 { 24998 break 24999 } 25000 _ = v_1.Args[1] 25001 x := v_1.Args[0] 25002 v_1_1 := v_1.Args[1] 25003 if v_1_1.Op != OpConst32 { 25004 break 25005 } 25006 if v_1_1.Type != t { 25007 break 25008 } 25009 d := v_1_1.AuxInt 25010 v.reset(OpXor32) 25011 v0 := b.NewValue0(v.Pos, OpConst32, t) 25012 v0.AuxInt = int64(int32(c ^ d)) 25013 v.AddArg(v0) 25014 v.AddArg(x) 25015 return true 25016 } 25017 // match: (Xor32 (Xor32 (Const32 <t> [d]) x) (Const32 <t> [c])) 25018 // cond: 25019 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 25020 for { 25021 _ = v.Args[1] 25022 v_0 := v.Args[0] 25023 if v_0.Op != OpXor32 { 25024 break 25025 } 25026 _ = v_0.Args[1] 25027 v_0_0 := v_0.Args[0] 25028 if v_0_0.Op != OpConst32 { 25029 break 25030 } 25031 t := v_0_0.Type 25032 d := v_0_0.AuxInt 25033 x := v_0.Args[1] 25034 v_1 := v.Args[1] 25035 if v_1.Op != OpConst32 { 25036 break 25037 } 25038 if v_1.Type != t { 25039 break 25040 } 25041 c := v_1.AuxInt 25042 v.reset(OpXor32) 25043 v0 := b.NewValue0(v.Pos, OpConst32, t) 25044 v0.AuxInt = int64(int32(c ^ d)) 25045 v.AddArg(v0) 25046 v.AddArg(x) 25047 return true 25048 } 25049 // match: (Xor32 (Xor32 x (Const32 <t> [d])) (Const32 <t> [c])) 25050 // cond: 25051 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 25052 for { 25053 _ = v.Args[1] 25054 v_0 := v.Args[0] 25055 if v_0.Op != OpXor32 { 25056 break 25057 } 25058 _ = v_0.Args[1] 25059 x := v_0.Args[0] 25060 v_0_1 := v_0.Args[1] 25061 if v_0_1.Op != OpConst32 { 25062 break 25063 } 25064 t := v_0_1.Type 25065 d := v_0_1.AuxInt 25066 v_1 := v.Args[1] 25067 if v_1.Op != OpConst32 { 25068 break 25069 } 25070 if v_1.Type != t { 25071 break 25072 } 25073 c := v_1.AuxInt 25074 v.reset(OpXor32) 25075 v0 := b.NewValue0(v.Pos, OpConst32, t) 25076 v0.AuxInt = int64(int32(c ^ d)) 25077 v.AddArg(v0) 25078 v.AddArg(x) 25079 return true 25080 } 25081 return false 25082 } 25083 func rewriteValuegeneric_OpXor64_0(v *Value) bool { 25084 b := v.Block 25085 _ = b 25086 // match: (Xor64 (Const64 [c]) (Const64 [d])) 25087 // cond: 25088 // result: (Const64 [c^d]) 25089 for { 25090 _ = v.Args[1] 25091 v_0 := v.Args[0] 25092 if v_0.Op != OpConst64 { 25093 break 25094 } 25095 c := v_0.AuxInt 25096 v_1 := v.Args[1] 25097 if v_1.Op != OpConst64 { 25098 break 25099 } 25100 d := v_1.AuxInt 25101 v.reset(OpConst64) 25102 v.AuxInt = c ^ d 25103 return true 25104 } 25105 // match: (Xor64 (Const64 [d]) (Const64 [c])) 25106 // cond: 25107 // result: (Const64 [c^d]) 25108 for { 25109 _ = v.Args[1] 25110 v_0 := v.Args[0] 25111 if v_0.Op != OpConst64 { 25112 break 25113 } 25114 d := v_0.AuxInt 25115 v_1 := v.Args[1] 25116 if v_1.Op != OpConst64 { 25117 break 25118 } 25119 c := v_1.AuxInt 25120 v.reset(OpConst64) 25121 v.AuxInt = c ^ d 25122 return true 25123 } 25124 // match: (Xor64 x x) 25125 // cond: 25126 // result: (Const64 [0]) 25127 for { 25128 _ = v.Args[1] 25129 x := v.Args[0] 25130 if x != v.Args[1] { 25131 break 25132 } 25133 v.reset(OpConst64) 25134 v.AuxInt = 0 25135 return true 25136 } 25137 // match: (Xor64 (Const64 [0]) x) 25138 // cond: 25139 // result: x 25140 for { 25141 _ = v.Args[1] 25142 v_0 := v.Args[0] 25143 if v_0.Op != OpConst64 { 25144 break 25145 } 25146 if v_0.AuxInt != 0 { 25147 break 25148 } 25149 x := v.Args[1] 25150 v.reset(OpCopy) 25151 v.Type = x.Type 25152 v.AddArg(x) 25153 return true 25154 } 25155 // match: (Xor64 x (Const64 [0])) 25156 // cond: 25157 // result: x 25158 for { 25159 _ = v.Args[1] 25160 x := v.Args[0] 25161 v_1 := v.Args[1] 25162 if v_1.Op != OpConst64 { 25163 break 25164 } 25165 if v_1.AuxInt != 0 { 25166 break 25167 } 25168 v.reset(OpCopy) 25169 v.Type = x.Type 25170 v.AddArg(x) 25171 return true 25172 } 25173 // match: (Xor64 x (Xor64 x y)) 25174 // cond: 25175 // result: y 25176 for { 25177 _ = v.Args[1] 25178 x := v.Args[0] 25179 v_1 := v.Args[1] 25180 if v_1.Op != OpXor64 { 25181 break 25182 } 25183 _ = v_1.Args[1] 25184 if x != v_1.Args[0] { 25185 break 25186 } 25187 y := v_1.Args[1] 25188 v.reset(OpCopy) 25189 v.Type = y.Type 25190 v.AddArg(y) 25191 return true 25192 } 25193 // match: (Xor64 x (Xor64 y x)) 25194 // cond: 25195 // result: y 25196 for { 25197 _ = v.Args[1] 25198 x := v.Args[0] 25199 v_1 := v.Args[1] 25200 if v_1.Op != OpXor64 { 25201 break 25202 } 25203 _ = v_1.Args[1] 25204 y := v_1.Args[0] 25205 if x != v_1.Args[1] { 25206 break 25207 } 25208 v.reset(OpCopy) 25209 v.Type = y.Type 25210 v.AddArg(y) 25211 return true 25212 } 25213 // match: (Xor64 (Xor64 x y) x) 25214 // cond: 25215 // result: y 25216 for { 25217 _ = v.Args[1] 25218 v_0 := v.Args[0] 25219 if v_0.Op != OpXor64 { 25220 break 25221 } 25222 _ = v_0.Args[1] 25223 x := v_0.Args[0] 25224 y := v_0.Args[1] 25225 if x != v.Args[1] { 25226 break 25227 } 25228 v.reset(OpCopy) 25229 v.Type = y.Type 25230 v.AddArg(y) 25231 return true 25232 } 25233 // match: (Xor64 (Xor64 y x) x) 25234 // cond: 25235 // result: y 25236 for { 25237 _ = v.Args[1] 25238 v_0 := v.Args[0] 25239 if v_0.Op != OpXor64 { 25240 break 25241 } 25242 _ = v_0.Args[1] 25243 y := v_0.Args[0] 25244 x := v_0.Args[1] 25245 if x != v.Args[1] { 25246 break 25247 } 25248 v.reset(OpCopy) 25249 v.Type = y.Type 25250 v.AddArg(y) 25251 return true 25252 } 25253 // match: (Xor64 (Xor64 i:(Const64 <t>) z) x) 25254 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25255 // result: (Xor64 i (Xor64 <t> z x)) 25256 for { 25257 _ = v.Args[1] 25258 v_0 := v.Args[0] 25259 if v_0.Op != OpXor64 { 25260 break 25261 } 25262 _ = v_0.Args[1] 25263 i := v_0.Args[0] 25264 if i.Op != OpConst64 { 25265 break 25266 } 25267 t := i.Type 25268 z := v_0.Args[1] 25269 x := v.Args[1] 25270 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25271 break 25272 } 25273 v.reset(OpXor64) 25274 v.AddArg(i) 25275 v0 := b.NewValue0(v.Pos, OpXor64, t) 25276 v0.AddArg(z) 25277 v0.AddArg(x) 25278 v.AddArg(v0) 25279 return true 25280 } 25281 return false 25282 } 25283 func rewriteValuegeneric_OpXor64_10(v *Value) bool { 25284 b := v.Block 25285 _ = b 25286 // match: (Xor64 (Xor64 z i:(Const64 <t>)) x) 25287 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25288 // result: (Xor64 i (Xor64 <t> z x)) 25289 for { 25290 _ = v.Args[1] 25291 v_0 := v.Args[0] 25292 if v_0.Op != OpXor64 { 25293 break 25294 } 25295 _ = v_0.Args[1] 25296 z := v_0.Args[0] 25297 i := v_0.Args[1] 25298 if i.Op != OpConst64 { 25299 break 25300 } 25301 t := i.Type 25302 x := v.Args[1] 25303 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25304 break 25305 } 25306 v.reset(OpXor64) 25307 v.AddArg(i) 25308 v0 := b.NewValue0(v.Pos, OpXor64, t) 25309 v0.AddArg(z) 25310 v0.AddArg(x) 25311 v.AddArg(v0) 25312 return true 25313 } 25314 // match: (Xor64 x (Xor64 i:(Const64 <t>) z)) 25315 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25316 // result: (Xor64 i (Xor64 <t> z x)) 25317 for { 25318 _ = v.Args[1] 25319 x := v.Args[0] 25320 v_1 := v.Args[1] 25321 if v_1.Op != OpXor64 { 25322 break 25323 } 25324 _ = v_1.Args[1] 25325 i := v_1.Args[0] 25326 if i.Op != OpConst64 { 25327 break 25328 } 25329 t := i.Type 25330 z := v_1.Args[1] 25331 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25332 break 25333 } 25334 v.reset(OpXor64) 25335 v.AddArg(i) 25336 v0 := b.NewValue0(v.Pos, OpXor64, t) 25337 v0.AddArg(z) 25338 v0.AddArg(x) 25339 v.AddArg(v0) 25340 return true 25341 } 25342 // match: (Xor64 x (Xor64 z i:(Const64 <t>))) 25343 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25344 // result: (Xor64 i (Xor64 <t> z x)) 25345 for { 25346 _ = v.Args[1] 25347 x := v.Args[0] 25348 v_1 := v.Args[1] 25349 if v_1.Op != OpXor64 { 25350 break 25351 } 25352 _ = v_1.Args[1] 25353 z := v_1.Args[0] 25354 i := v_1.Args[1] 25355 if i.Op != OpConst64 { 25356 break 25357 } 25358 t := i.Type 25359 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25360 break 25361 } 25362 v.reset(OpXor64) 25363 v.AddArg(i) 25364 v0 := b.NewValue0(v.Pos, OpXor64, t) 25365 v0.AddArg(z) 25366 v0.AddArg(x) 25367 v.AddArg(v0) 25368 return true 25369 } 25370 // match: (Xor64 (Const64 <t> [c]) (Xor64 (Const64 <t> [d]) x)) 25371 // cond: 25372 // result: (Xor64 (Const64 <t> [c^d]) x) 25373 for { 25374 _ = v.Args[1] 25375 v_0 := v.Args[0] 25376 if v_0.Op != OpConst64 { 25377 break 25378 } 25379 t := v_0.Type 25380 c := v_0.AuxInt 25381 v_1 := v.Args[1] 25382 if v_1.Op != OpXor64 { 25383 break 25384 } 25385 _ = v_1.Args[1] 25386 v_1_0 := v_1.Args[0] 25387 if v_1_0.Op != OpConst64 { 25388 break 25389 } 25390 if v_1_0.Type != t { 25391 break 25392 } 25393 d := v_1_0.AuxInt 25394 x := v_1.Args[1] 25395 v.reset(OpXor64) 25396 v0 := b.NewValue0(v.Pos, OpConst64, t) 25397 v0.AuxInt = c ^ d 25398 v.AddArg(v0) 25399 v.AddArg(x) 25400 return true 25401 } 25402 // match: (Xor64 (Const64 <t> [c]) (Xor64 x (Const64 <t> [d]))) 25403 // cond: 25404 // result: (Xor64 (Const64 <t> [c^d]) x) 25405 for { 25406 _ = v.Args[1] 25407 v_0 := v.Args[0] 25408 if v_0.Op != OpConst64 { 25409 break 25410 } 25411 t := v_0.Type 25412 c := v_0.AuxInt 25413 v_1 := v.Args[1] 25414 if v_1.Op != OpXor64 { 25415 break 25416 } 25417 _ = v_1.Args[1] 25418 x := v_1.Args[0] 25419 v_1_1 := v_1.Args[1] 25420 if v_1_1.Op != OpConst64 { 25421 break 25422 } 25423 if v_1_1.Type != t { 25424 break 25425 } 25426 d := v_1_1.AuxInt 25427 v.reset(OpXor64) 25428 v0 := b.NewValue0(v.Pos, OpConst64, t) 25429 v0.AuxInt = c ^ d 25430 v.AddArg(v0) 25431 v.AddArg(x) 25432 return true 25433 } 25434 // match: (Xor64 (Xor64 (Const64 <t> [d]) x) (Const64 <t> [c])) 25435 // cond: 25436 // result: (Xor64 (Const64 <t> [c^d]) x) 25437 for { 25438 _ = v.Args[1] 25439 v_0 := v.Args[0] 25440 if v_0.Op != OpXor64 { 25441 break 25442 } 25443 _ = v_0.Args[1] 25444 v_0_0 := v_0.Args[0] 25445 if v_0_0.Op != OpConst64 { 25446 break 25447 } 25448 t := v_0_0.Type 25449 d := v_0_0.AuxInt 25450 x := v_0.Args[1] 25451 v_1 := v.Args[1] 25452 if v_1.Op != OpConst64 { 25453 break 25454 } 25455 if v_1.Type != t { 25456 break 25457 } 25458 c := v_1.AuxInt 25459 v.reset(OpXor64) 25460 v0 := b.NewValue0(v.Pos, OpConst64, t) 25461 v0.AuxInt = c ^ d 25462 v.AddArg(v0) 25463 v.AddArg(x) 25464 return true 25465 } 25466 // match: (Xor64 (Xor64 x (Const64 <t> [d])) (Const64 <t> [c])) 25467 // cond: 25468 // result: (Xor64 (Const64 <t> [c^d]) x) 25469 for { 25470 _ = v.Args[1] 25471 v_0 := v.Args[0] 25472 if v_0.Op != OpXor64 { 25473 break 25474 } 25475 _ = v_0.Args[1] 25476 x := v_0.Args[0] 25477 v_0_1 := v_0.Args[1] 25478 if v_0_1.Op != OpConst64 { 25479 break 25480 } 25481 t := v_0_1.Type 25482 d := v_0_1.AuxInt 25483 v_1 := v.Args[1] 25484 if v_1.Op != OpConst64 { 25485 break 25486 } 25487 if v_1.Type != t { 25488 break 25489 } 25490 c := v_1.AuxInt 25491 v.reset(OpXor64) 25492 v0 := b.NewValue0(v.Pos, OpConst64, t) 25493 v0.AuxInt = c ^ d 25494 v.AddArg(v0) 25495 v.AddArg(x) 25496 return true 25497 } 25498 return false 25499 } 25500 func rewriteValuegeneric_OpXor8_0(v *Value) bool { 25501 b := v.Block 25502 _ = b 25503 // match: (Xor8 (Const8 [c]) (Const8 [d])) 25504 // cond: 25505 // result: (Const8 [int64(int8(c^d))]) 25506 for { 25507 _ = v.Args[1] 25508 v_0 := v.Args[0] 25509 if v_0.Op != OpConst8 { 25510 break 25511 } 25512 c := v_0.AuxInt 25513 v_1 := v.Args[1] 25514 if v_1.Op != OpConst8 { 25515 break 25516 } 25517 d := v_1.AuxInt 25518 v.reset(OpConst8) 25519 v.AuxInt = int64(int8(c ^ d)) 25520 return true 25521 } 25522 // match: (Xor8 (Const8 [d]) (Const8 [c])) 25523 // cond: 25524 // result: (Const8 [int64(int8(c^d))]) 25525 for { 25526 _ = v.Args[1] 25527 v_0 := v.Args[0] 25528 if v_0.Op != OpConst8 { 25529 break 25530 } 25531 d := v_0.AuxInt 25532 v_1 := v.Args[1] 25533 if v_1.Op != OpConst8 { 25534 break 25535 } 25536 c := v_1.AuxInt 25537 v.reset(OpConst8) 25538 v.AuxInt = int64(int8(c ^ d)) 25539 return true 25540 } 25541 // match: (Xor8 x x) 25542 // cond: 25543 // result: (Const8 [0]) 25544 for { 25545 _ = v.Args[1] 25546 x := v.Args[0] 25547 if x != v.Args[1] { 25548 break 25549 } 25550 v.reset(OpConst8) 25551 v.AuxInt = 0 25552 return true 25553 } 25554 // match: (Xor8 (Const8 [0]) x) 25555 // cond: 25556 // result: x 25557 for { 25558 _ = v.Args[1] 25559 v_0 := v.Args[0] 25560 if v_0.Op != OpConst8 { 25561 break 25562 } 25563 if v_0.AuxInt != 0 { 25564 break 25565 } 25566 x := v.Args[1] 25567 v.reset(OpCopy) 25568 v.Type = x.Type 25569 v.AddArg(x) 25570 return true 25571 } 25572 // match: (Xor8 x (Const8 [0])) 25573 // cond: 25574 // result: x 25575 for { 25576 _ = v.Args[1] 25577 x := v.Args[0] 25578 v_1 := v.Args[1] 25579 if v_1.Op != OpConst8 { 25580 break 25581 } 25582 if v_1.AuxInt != 0 { 25583 break 25584 } 25585 v.reset(OpCopy) 25586 v.Type = x.Type 25587 v.AddArg(x) 25588 return true 25589 } 25590 // match: (Xor8 x (Xor8 x y)) 25591 // cond: 25592 // result: y 25593 for { 25594 _ = v.Args[1] 25595 x := v.Args[0] 25596 v_1 := v.Args[1] 25597 if v_1.Op != OpXor8 { 25598 break 25599 } 25600 _ = v_1.Args[1] 25601 if x != v_1.Args[0] { 25602 break 25603 } 25604 y := v_1.Args[1] 25605 v.reset(OpCopy) 25606 v.Type = y.Type 25607 v.AddArg(y) 25608 return true 25609 } 25610 // match: (Xor8 x (Xor8 y x)) 25611 // cond: 25612 // result: y 25613 for { 25614 _ = v.Args[1] 25615 x := v.Args[0] 25616 v_1 := v.Args[1] 25617 if v_1.Op != OpXor8 { 25618 break 25619 } 25620 _ = v_1.Args[1] 25621 y := v_1.Args[0] 25622 if x != v_1.Args[1] { 25623 break 25624 } 25625 v.reset(OpCopy) 25626 v.Type = y.Type 25627 v.AddArg(y) 25628 return true 25629 } 25630 // match: (Xor8 (Xor8 x y) x) 25631 // cond: 25632 // result: y 25633 for { 25634 _ = v.Args[1] 25635 v_0 := v.Args[0] 25636 if v_0.Op != OpXor8 { 25637 break 25638 } 25639 _ = v_0.Args[1] 25640 x := v_0.Args[0] 25641 y := v_0.Args[1] 25642 if x != v.Args[1] { 25643 break 25644 } 25645 v.reset(OpCopy) 25646 v.Type = y.Type 25647 v.AddArg(y) 25648 return true 25649 } 25650 // match: (Xor8 (Xor8 y x) x) 25651 // cond: 25652 // result: y 25653 for { 25654 _ = v.Args[1] 25655 v_0 := v.Args[0] 25656 if v_0.Op != OpXor8 { 25657 break 25658 } 25659 _ = v_0.Args[1] 25660 y := v_0.Args[0] 25661 x := v_0.Args[1] 25662 if x != v.Args[1] { 25663 break 25664 } 25665 v.reset(OpCopy) 25666 v.Type = y.Type 25667 v.AddArg(y) 25668 return true 25669 } 25670 // match: (Xor8 (Xor8 i:(Const8 <t>) z) x) 25671 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 25672 // result: (Xor8 i (Xor8 <t> z x)) 25673 for { 25674 _ = v.Args[1] 25675 v_0 := v.Args[0] 25676 if v_0.Op != OpXor8 { 25677 break 25678 } 25679 _ = v_0.Args[1] 25680 i := v_0.Args[0] 25681 if i.Op != OpConst8 { 25682 break 25683 } 25684 t := i.Type 25685 z := v_0.Args[1] 25686 x := v.Args[1] 25687 if !(z.Op != OpConst8 && x.Op != OpConst8) { 25688 break 25689 } 25690 v.reset(OpXor8) 25691 v.AddArg(i) 25692 v0 := b.NewValue0(v.Pos, OpXor8, t) 25693 v0.AddArg(z) 25694 v0.AddArg(x) 25695 v.AddArg(v0) 25696 return true 25697 } 25698 return false 25699 } 25700 func rewriteValuegeneric_OpXor8_10(v *Value) bool { 25701 b := v.Block 25702 _ = b 25703 // match: (Xor8 (Xor8 z i:(Const8 <t>)) x) 25704 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 25705 // result: (Xor8 i (Xor8 <t> z x)) 25706 for { 25707 _ = v.Args[1] 25708 v_0 := v.Args[0] 25709 if v_0.Op != OpXor8 { 25710 break 25711 } 25712 _ = v_0.Args[1] 25713 z := v_0.Args[0] 25714 i := v_0.Args[1] 25715 if i.Op != OpConst8 { 25716 break 25717 } 25718 t := i.Type 25719 x := v.Args[1] 25720 if !(z.Op != OpConst8 && x.Op != OpConst8) { 25721 break 25722 } 25723 v.reset(OpXor8) 25724 v.AddArg(i) 25725 v0 := b.NewValue0(v.Pos, OpXor8, t) 25726 v0.AddArg(z) 25727 v0.AddArg(x) 25728 v.AddArg(v0) 25729 return true 25730 } 25731 // match: (Xor8 x (Xor8 i:(Const8 <t>) z)) 25732 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 25733 // result: (Xor8 i (Xor8 <t> z x)) 25734 for { 25735 _ = v.Args[1] 25736 x := v.Args[0] 25737 v_1 := v.Args[1] 25738 if v_1.Op != OpXor8 { 25739 break 25740 } 25741 _ = v_1.Args[1] 25742 i := v_1.Args[0] 25743 if i.Op != OpConst8 { 25744 break 25745 } 25746 t := i.Type 25747 z := v_1.Args[1] 25748 if !(z.Op != OpConst8 && x.Op != OpConst8) { 25749 break 25750 } 25751 v.reset(OpXor8) 25752 v.AddArg(i) 25753 v0 := b.NewValue0(v.Pos, OpXor8, t) 25754 v0.AddArg(z) 25755 v0.AddArg(x) 25756 v.AddArg(v0) 25757 return true 25758 } 25759 // match: (Xor8 x (Xor8 z i:(Const8 <t>))) 25760 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 25761 // result: (Xor8 i (Xor8 <t> z x)) 25762 for { 25763 _ = v.Args[1] 25764 x := v.Args[0] 25765 v_1 := v.Args[1] 25766 if v_1.Op != OpXor8 { 25767 break 25768 } 25769 _ = v_1.Args[1] 25770 z := v_1.Args[0] 25771 i := v_1.Args[1] 25772 if i.Op != OpConst8 { 25773 break 25774 } 25775 t := i.Type 25776 if !(z.Op != OpConst8 && x.Op != OpConst8) { 25777 break 25778 } 25779 v.reset(OpXor8) 25780 v.AddArg(i) 25781 v0 := b.NewValue0(v.Pos, OpXor8, t) 25782 v0.AddArg(z) 25783 v0.AddArg(x) 25784 v.AddArg(v0) 25785 return true 25786 } 25787 // match: (Xor8 (Const8 <t> [c]) (Xor8 (Const8 <t> [d]) x)) 25788 // cond: 25789 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 25790 for { 25791 _ = v.Args[1] 25792 v_0 := v.Args[0] 25793 if v_0.Op != OpConst8 { 25794 break 25795 } 25796 t := v_0.Type 25797 c := v_0.AuxInt 25798 v_1 := v.Args[1] 25799 if v_1.Op != OpXor8 { 25800 break 25801 } 25802 _ = v_1.Args[1] 25803 v_1_0 := v_1.Args[0] 25804 if v_1_0.Op != OpConst8 { 25805 break 25806 } 25807 if v_1_0.Type != t { 25808 break 25809 } 25810 d := v_1_0.AuxInt 25811 x := v_1.Args[1] 25812 v.reset(OpXor8) 25813 v0 := b.NewValue0(v.Pos, OpConst8, t) 25814 v0.AuxInt = int64(int8(c ^ d)) 25815 v.AddArg(v0) 25816 v.AddArg(x) 25817 return true 25818 } 25819 // match: (Xor8 (Const8 <t> [c]) (Xor8 x (Const8 <t> [d]))) 25820 // cond: 25821 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 25822 for { 25823 _ = v.Args[1] 25824 v_0 := v.Args[0] 25825 if v_0.Op != OpConst8 { 25826 break 25827 } 25828 t := v_0.Type 25829 c := v_0.AuxInt 25830 v_1 := v.Args[1] 25831 if v_1.Op != OpXor8 { 25832 break 25833 } 25834 _ = v_1.Args[1] 25835 x := v_1.Args[0] 25836 v_1_1 := v_1.Args[1] 25837 if v_1_1.Op != OpConst8 { 25838 break 25839 } 25840 if v_1_1.Type != t { 25841 break 25842 } 25843 d := v_1_1.AuxInt 25844 v.reset(OpXor8) 25845 v0 := b.NewValue0(v.Pos, OpConst8, t) 25846 v0.AuxInt = int64(int8(c ^ d)) 25847 v.AddArg(v0) 25848 v.AddArg(x) 25849 return true 25850 } 25851 // match: (Xor8 (Xor8 (Const8 <t> [d]) x) (Const8 <t> [c])) 25852 // cond: 25853 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 25854 for { 25855 _ = v.Args[1] 25856 v_0 := v.Args[0] 25857 if v_0.Op != OpXor8 { 25858 break 25859 } 25860 _ = v_0.Args[1] 25861 v_0_0 := v_0.Args[0] 25862 if v_0_0.Op != OpConst8 { 25863 break 25864 } 25865 t := v_0_0.Type 25866 d := v_0_0.AuxInt 25867 x := v_0.Args[1] 25868 v_1 := v.Args[1] 25869 if v_1.Op != OpConst8 { 25870 break 25871 } 25872 if v_1.Type != t { 25873 break 25874 } 25875 c := v_1.AuxInt 25876 v.reset(OpXor8) 25877 v0 := b.NewValue0(v.Pos, OpConst8, t) 25878 v0.AuxInt = int64(int8(c ^ d)) 25879 v.AddArg(v0) 25880 v.AddArg(x) 25881 return true 25882 } 25883 // match: (Xor8 (Xor8 x (Const8 <t> [d])) (Const8 <t> [c])) 25884 // cond: 25885 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 25886 for { 25887 _ = v.Args[1] 25888 v_0 := v.Args[0] 25889 if v_0.Op != OpXor8 { 25890 break 25891 } 25892 _ = v_0.Args[1] 25893 x := v_0.Args[0] 25894 v_0_1 := v_0.Args[1] 25895 if v_0_1.Op != OpConst8 { 25896 break 25897 } 25898 t := v_0_1.Type 25899 d := v_0_1.AuxInt 25900 v_1 := v.Args[1] 25901 if v_1.Op != OpConst8 { 25902 break 25903 } 25904 if v_1.Type != t { 25905 break 25906 } 25907 c := v_1.AuxInt 25908 v.reset(OpXor8) 25909 v0 := b.NewValue0(v.Pos, OpConst8, t) 25910 v0.AuxInt = int64(int8(c ^ d)) 25911 v.AddArg(v0) 25912 v.AddArg(x) 25913 return true 25914 } 25915 return false 25916 } 25917 func rewriteValuegeneric_OpZero_0(v *Value) bool { 25918 b := v.Block 25919 _ = b 25920 config := b.Func.Config 25921 _ = config 25922 // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) 25923 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 25924 // result: mem 25925 for { 25926 _ = v.Args[1] 25927 v_0 := v.Args[0] 25928 if v_0.Op != OpLoad { 25929 break 25930 } 25931 _ = v_0.Args[1] 25932 v_0_0 := v_0.Args[0] 25933 if v_0_0.Op != OpOffPtr { 25934 break 25935 } 25936 c := v_0_0.AuxInt 25937 v_0_0_0 := v_0_0.Args[0] 25938 if v_0_0_0.Op != OpSP { 25939 break 25940 } 25941 mem := v_0.Args[1] 25942 if mem != v.Args[1] { 25943 break 25944 } 25945 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 25946 break 25947 } 25948 v.reset(OpCopy) 25949 v.Type = mem.Type 25950 v.AddArg(mem) 25951 return true 25952 } 25953 return false 25954 } 25955 func rewriteValuegeneric_OpZeroExt16to32_0(v *Value) bool { 25956 // match: (ZeroExt16to32 (Const16 [c])) 25957 // cond: 25958 // result: (Const32 [int64(uint16(c))]) 25959 for { 25960 v_0 := v.Args[0] 25961 if v_0.Op != OpConst16 { 25962 break 25963 } 25964 c := v_0.AuxInt 25965 v.reset(OpConst32) 25966 v.AuxInt = int64(uint16(c)) 25967 return true 25968 } 25969 // match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s])))) 25970 // cond: s >= 16 25971 // result: x 25972 for { 25973 v_0 := v.Args[0] 25974 if v_0.Op != OpTrunc32to16 { 25975 break 25976 } 25977 x := v_0.Args[0] 25978 if x.Op != OpRsh32Ux64 { 25979 break 25980 } 25981 _ = x.Args[1] 25982 x_1 := x.Args[1] 25983 if x_1.Op != OpConst64 { 25984 break 25985 } 25986 s := x_1.AuxInt 25987 if !(s >= 16) { 25988 break 25989 } 25990 v.reset(OpCopy) 25991 v.Type = x.Type 25992 v.AddArg(x) 25993 return true 25994 } 25995 return false 25996 } 25997 func rewriteValuegeneric_OpZeroExt16to64_0(v *Value) bool { 25998 // match: (ZeroExt16to64 (Const16 [c])) 25999 // cond: 26000 // result: (Const64 [int64(uint16(c))]) 26001 for { 26002 v_0 := v.Args[0] 26003 if v_0.Op != OpConst16 { 26004 break 26005 } 26006 c := v_0.AuxInt 26007 v.reset(OpConst64) 26008 v.AuxInt = int64(uint16(c)) 26009 return true 26010 } 26011 // match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s])))) 26012 // cond: s >= 48 26013 // result: x 26014 for { 26015 v_0 := v.Args[0] 26016 if v_0.Op != OpTrunc64to16 { 26017 break 26018 } 26019 x := v_0.Args[0] 26020 if x.Op != OpRsh64Ux64 { 26021 break 26022 } 26023 _ = x.Args[1] 26024 x_1 := x.Args[1] 26025 if x_1.Op != OpConst64 { 26026 break 26027 } 26028 s := x_1.AuxInt 26029 if !(s >= 48) { 26030 break 26031 } 26032 v.reset(OpCopy) 26033 v.Type = x.Type 26034 v.AddArg(x) 26035 return true 26036 } 26037 return false 26038 } 26039 func rewriteValuegeneric_OpZeroExt32to64_0(v *Value) bool { 26040 // match: (ZeroExt32to64 (Const32 [c])) 26041 // cond: 26042 // result: (Const64 [int64(uint32(c))]) 26043 for { 26044 v_0 := v.Args[0] 26045 if v_0.Op != OpConst32 { 26046 break 26047 } 26048 c := v_0.AuxInt 26049 v.reset(OpConst64) 26050 v.AuxInt = int64(uint32(c)) 26051 return true 26052 } 26053 // match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s])))) 26054 // cond: s >= 32 26055 // result: x 26056 for { 26057 v_0 := v.Args[0] 26058 if v_0.Op != OpTrunc64to32 { 26059 break 26060 } 26061 x := v_0.Args[0] 26062 if x.Op != OpRsh64Ux64 { 26063 break 26064 } 26065 _ = x.Args[1] 26066 x_1 := x.Args[1] 26067 if x_1.Op != OpConst64 { 26068 break 26069 } 26070 s := x_1.AuxInt 26071 if !(s >= 32) { 26072 break 26073 } 26074 v.reset(OpCopy) 26075 v.Type = x.Type 26076 v.AddArg(x) 26077 return true 26078 } 26079 return false 26080 } 26081 func rewriteValuegeneric_OpZeroExt8to16_0(v *Value) bool { 26082 // match: (ZeroExt8to16 (Const8 [c])) 26083 // cond: 26084 // result: (Const16 [int64( uint8(c))]) 26085 for { 26086 v_0 := v.Args[0] 26087 if v_0.Op != OpConst8 { 26088 break 26089 } 26090 c := v_0.AuxInt 26091 v.reset(OpConst16) 26092 v.AuxInt = int64(uint8(c)) 26093 return true 26094 } 26095 // match: (ZeroExt8to16 (Trunc16to8 x:(Rsh16Ux64 _ (Const64 [s])))) 26096 // cond: s >= 8 26097 // result: x 26098 for { 26099 v_0 := v.Args[0] 26100 if v_0.Op != OpTrunc16to8 { 26101 break 26102 } 26103 x := v_0.Args[0] 26104 if x.Op != OpRsh16Ux64 { 26105 break 26106 } 26107 _ = x.Args[1] 26108 x_1 := x.Args[1] 26109 if x_1.Op != OpConst64 { 26110 break 26111 } 26112 s := x_1.AuxInt 26113 if !(s >= 8) { 26114 break 26115 } 26116 v.reset(OpCopy) 26117 v.Type = x.Type 26118 v.AddArg(x) 26119 return true 26120 } 26121 return false 26122 } 26123 func rewriteValuegeneric_OpZeroExt8to32_0(v *Value) bool { 26124 // match: (ZeroExt8to32 (Const8 [c])) 26125 // cond: 26126 // result: (Const32 [int64( uint8(c))]) 26127 for { 26128 v_0 := v.Args[0] 26129 if v_0.Op != OpConst8 { 26130 break 26131 } 26132 c := v_0.AuxInt 26133 v.reset(OpConst32) 26134 v.AuxInt = int64(uint8(c)) 26135 return true 26136 } 26137 // match: (ZeroExt8to32 (Trunc32to8 x:(Rsh32Ux64 _ (Const64 [s])))) 26138 // cond: s >= 24 26139 // result: x 26140 for { 26141 v_0 := v.Args[0] 26142 if v_0.Op != OpTrunc32to8 { 26143 break 26144 } 26145 x := v_0.Args[0] 26146 if x.Op != OpRsh32Ux64 { 26147 break 26148 } 26149 _ = x.Args[1] 26150 x_1 := x.Args[1] 26151 if x_1.Op != OpConst64 { 26152 break 26153 } 26154 s := x_1.AuxInt 26155 if !(s >= 24) { 26156 break 26157 } 26158 v.reset(OpCopy) 26159 v.Type = x.Type 26160 v.AddArg(x) 26161 return true 26162 } 26163 return false 26164 } 26165 func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { 26166 // match: (ZeroExt8to64 (Const8 [c])) 26167 // cond: 26168 // result: (Const64 [int64( uint8(c))]) 26169 for { 26170 v_0 := v.Args[0] 26171 if v_0.Op != OpConst8 { 26172 break 26173 } 26174 c := v_0.AuxInt 26175 v.reset(OpConst64) 26176 v.AuxInt = int64(uint8(c)) 26177 return true 26178 } 26179 // match: (ZeroExt8to64 (Trunc64to8 x:(Rsh64Ux64 _ (Const64 [s])))) 26180 // cond: s >= 56 26181 // result: x 26182 for { 26183 v_0 := v.Args[0] 26184 if v_0.Op != OpTrunc64to8 { 26185 break 26186 } 26187 x := v_0.Args[0] 26188 if x.Op != OpRsh64Ux64 { 26189 break 26190 } 26191 _ = x.Args[1] 26192 x_1 := x.Args[1] 26193 if x_1.Op != OpConst64 { 26194 break 26195 } 26196 s := x_1.AuxInt 26197 if !(s >= 56) { 26198 break 26199 } 26200 v.reset(OpCopy) 26201 v.Type = x.Type 26202 v.AddArg(x) 26203 return true 26204 } 26205 return false 26206 } 26207 func rewriteBlockgeneric(b *Block) bool { 26208 config := b.Func.Config 26209 _ = config 26210 fe := b.Func.fe 26211 _ = fe 26212 typ := &config.Types 26213 _ = typ 26214 switch b.Kind { 26215 case BlockIf: 26216 // match: (If (Not cond) yes no) 26217 // cond: 26218 // result: (If cond no yes) 26219 for { 26220 v := b.Control 26221 if v.Op != OpNot { 26222 break 26223 } 26224 cond := v.Args[0] 26225 b.Kind = BlockIf 26226 b.SetControl(cond) 26227 b.swapSuccessors() 26228 return true 26229 } 26230 // match: (If (ConstBool [c]) yes no) 26231 // cond: c == 1 26232 // result: (First nil yes no) 26233 for { 26234 v := b.Control 26235 if v.Op != OpConstBool { 26236 break 26237 } 26238 c := v.AuxInt 26239 if !(c == 1) { 26240 break 26241 } 26242 b.Kind = BlockFirst 26243 b.SetControl(nil) 26244 return true 26245 } 26246 // match: (If (ConstBool [c]) yes no) 26247 // cond: c == 0 26248 // result: (First nil no yes) 26249 for { 26250 v := b.Control 26251 if v.Op != OpConstBool { 26252 break 26253 } 26254 c := v.AuxInt 26255 if !(c == 0) { 26256 break 26257 } 26258 b.Kind = BlockFirst 26259 b.SetControl(nil) 26260 b.swapSuccessors() 26261 return true 26262 } 26263 } 26264 return false 26265 }