github.com/karrick/go@v0.0.0-20170817181416-d5b0ec858b37/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) || rewriteValuegeneric_OpAdd16_30(v) 20 case OpAdd32: 21 return rewriteValuegeneric_OpAdd32_0(v) || rewriteValuegeneric_OpAdd32_10(v) || rewriteValuegeneric_OpAdd32_20(v) || rewriteValuegeneric_OpAdd32_30(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) || rewriteValuegeneric_OpAdd64_30(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) || rewriteValuegeneric_OpAdd8_30(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) || rewriteValuegeneric_OpIsInBounds_30(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 <t> (Mul16 x y) (Mul16 x z)) 471 // cond: 472 // result: (Mul16 x (Add16 <t> y z)) 473 for { 474 t := v.Type 475 _ = v.Args[1] 476 v_0 := v.Args[0] 477 if v_0.Op != OpMul16 { 478 break 479 } 480 _ = v_0.Args[1] 481 x := v_0.Args[0] 482 y := v_0.Args[1] 483 v_1 := v.Args[1] 484 if v_1.Op != OpMul16 { 485 break 486 } 487 _ = v_1.Args[1] 488 if x != v_1.Args[0] { 489 break 490 } 491 z := v_1.Args[1] 492 v.reset(OpMul16) 493 v.AddArg(x) 494 v0 := b.NewValue0(v.Pos, OpAdd16, t) 495 v0.AddArg(y) 496 v0.AddArg(z) 497 v.AddArg(v0) 498 return true 499 } 500 // match: (Add16 <t> (Mul16 y x) (Mul16 x z)) 501 // cond: 502 // result: (Mul16 x (Add16 <t> y z)) 503 for { 504 t := v.Type 505 _ = v.Args[1] 506 v_0 := v.Args[0] 507 if v_0.Op != OpMul16 { 508 break 509 } 510 _ = v_0.Args[1] 511 y := v_0.Args[0] 512 x := v_0.Args[1] 513 v_1 := v.Args[1] 514 if v_1.Op != OpMul16 { 515 break 516 } 517 _ = v_1.Args[1] 518 if x != v_1.Args[0] { 519 break 520 } 521 z := v_1.Args[1] 522 v.reset(OpMul16) 523 v.AddArg(x) 524 v0 := b.NewValue0(v.Pos, OpAdd16, t) 525 v0.AddArg(y) 526 v0.AddArg(z) 527 v.AddArg(v0) 528 return true 529 } 530 // match: (Add16 <t> (Mul16 x y) (Mul16 z x)) 531 // cond: 532 // result: (Mul16 x (Add16 <t> y z)) 533 for { 534 t := v.Type 535 _ = v.Args[1] 536 v_0 := v.Args[0] 537 if v_0.Op != OpMul16 { 538 break 539 } 540 _ = v_0.Args[1] 541 x := v_0.Args[0] 542 y := v_0.Args[1] 543 v_1 := v.Args[1] 544 if v_1.Op != OpMul16 { 545 break 546 } 547 _ = v_1.Args[1] 548 z := v_1.Args[0] 549 if x != v_1.Args[1] { 550 break 551 } 552 v.reset(OpMul16) 553 v.AddArg(x) 554 v0 := b.NewValue0(v.Pos, OpAdd16, t) 555 v0.AddArg(y) 556 v0.AddArg(z) 557 v.AddArg(v0) 558 return true 559 } 560 // match: (Add16 <t> (Mul16 y x) (Mul16 z x)) 561 // cond: 562 // result: (Mul16 x (Add16 <t> y z)) 563 for { 564 t := v.Type 565 _ = v.Args[1] 566 v_0 := v.Args[0] 567 if v_0.Op != OpMul16 { 568 break 569 } 570 _ = v_0.Args[1] 571 y := v_0.Args[0] 572 x := v_0.Args[1] 573 v_1 := v.Args[1] 574 if v_1.Op != OpMul16 { 575 break 576 } 577 _ = v_1.Args[1] 578 z := v_1.Args[0] 579 if x != v_1.Args[1] { 580 break 581 } 582 v.reset(OpMul16) 583 v.AddArg(x) 584 v0 := b.NewValue0(v.Pos, OpAdd16, t) 585 v0.AddArg(y) 586 v0.AddArg(z) 587 v.AddArg(v0) 588 return true 589 } 590 // match: (Add16 <t> (Mul16 x z) (Mul16 x y)) 591 // cond: 592 // result: (Mul16 x (Add16 <t> y z)) 593 for { 594 t := v.Type 595 _ = v.Args[1] 596 v_0 := v.Args[0] 597 if v_0.Op != OpMul16 { 598 break 599 } 600 _ = v_0.Args[1] 601 x := v_0.Args[0] 602 z := v_0.Args[1] 603 v_1 := v.Args[1] 604 if v_1.Op != OpMul16 { 605 break 606 } 607 _ = v_1.Args[1] 608 if x != v_1.Args[0] { 609 break 610 } 611 y := v_1.Args[1] 612 v.reset(OpMul16) 613 v.AddArg(x) 614 v0 := b.NewValue0(v.Pos, OpAdd16, t) 615 v0.AddArg(y) 616 v0.AddArg(z) 617 v.AddArg(v0) 618 return true 619 } 620 // match: (Add16 <t> (Mul16 z x) (Mul16 x y)) 621 // cond: 622 // result: (Mul16 x (Add16 <t> y z)) 623 for { 624 t := v.Type 625 _ = v.Args[1] 626 v_0 := v.Args[0] 627 if v_0.Op != OpMul16 { 628 break 629 } 630 _ = v_0.Args[1] 631 z := v_0.Args[0] 632 x := v_0.Args[1] 633 v_1 := v.Args[1] 634 if v_1.Op != OpMul16 { 635 break 636 } 637 _ = v_1.Args[1] 638 if x != v_1.Args[0] { 639 break 640 } 641 y := v_1.Args[1] 642 v.reset(OpMul16) 643 v.AddArg(x) 644 v0 := b.NewValue0(v.Pos, OpAdd16, t) 645 v0.AddArg(y) 646 v0.AddArg(z) 647 v.AddArg(v0) 648 return true 649 } 650 // match: (Add16 <t> (Mul16 x z) (Mul16 y x)) 651 // cond: 652 // result: (Mul16 x (Add16 <t> y z)) 653 for { 654 t := v.Type 655 _ = v.Args[1] 656 v_0 := v.Args[0] 657 if v_0.Op != OpMul16 { 658 break 659 } 660 _ = v_0.Args[1] 661 x := v_0.Args[0] 662 z := v_0.Args[1] 663 v_1 := v.Args[1] 664 if v_1.Op != OpMul16 { 665 break 666 } 667 _ = v_1.Args[1] 668 y := v_1.Args[0] 669 if x != v_1.Args[1] { 670 break 671 } 672 v.reset(OpMul16) 673 v.AddArg(x) 674 v0 := b.NewValue0(v.Pos, OpAdd16, t) 675 v0.AddArg(y) 676 v0.AddArg(z) 677 v.AddArg(v0) 678 return true 679 } 680 // match: (Add16 <t> (Mul16 z x) (Mul16 y x)) 681 // cond: 682 // result: (Mul16 x (Add16 <t> y z)) 683 for { 684 t := v.Type 685 _ = v.Args[1] 686 v_0 := v.Args[0] 687 if v_0.Op != OpMul16 { 688 break 689 } 690 _ = v_0.Args[1] 691 z := v_0.Args[0] 692 x := v_0.Args[1] 693 v_1 := v.Args[1] 694 if v_1.Op != OpMul16 { 695 break 696 } 697 _ = v_1.Args[1] 698 y := v_1.Args[0] 699 if x != v_1.Args[1] { 700 break 701 } 702 v.reset(OpMul16) 703 v.AddArg(x) 704 v0 := b.NewValue0(v.Pos, OpAdd16, t) 705 v0.AddArg(y) 706 v0.AddArg(z) 707 v.AddArg(v0) 708 return true 709 } 710 return false 711 } 712 func rewriteValuegeneric_OpAdd16_10(v *Value) bool { 713 b := v.Block 714 _ = b 715 // match: (Add16 (Const16 [0]) x) 716 // cond: 717 // result: x 718 for { 719 _ = v.Args[1] 720 v_0 := v.Args[0] 721 if v_0.Op != OpConst16 { 722 break 723 } 724 if v_0.AuxInt != 0 { 725 break 726 } 727 x := v.Args[1] 728 v.reset(OpCopy) 729 v.Type = x.Type 730 v.AddArg(x) 731 return true 732 } 733 // match: (Add16 x (Const16 [0])) 734 // cond: 735 // result: x 736 for { 737 _ = v.Args[1] 738 x := v.Args[0] 739 v_1 := v.Args[1] 740 if v_1.Op != OpConst16 { 741 break 742 } 743 if v_1.AuxInt != 0 { 744 break 745 } 746 v.reset(OpCopy) 747 v.Type = x.Type 748 v.AddArg(x) 749 return true 750 } 751 // match: (Add16 (Const16 [1]) (Com16 x)) 752 // cond: 753 // result: (Neg16 x) 754 for { 755 _ = v.Args[1] 756 v_0 := v.Args[0] 757 if v_0.Op != OpConst16 { 758 break 759 } 760 if v_0.AuxInt != 1 { 761 break 762 } 763 v_1 := v.Args[1] 764 if v_1.Op != OpCom16 { 765 break 766 } 767 x := v_1.Args[0] 768 v.reset(OpNeg16) 769 v.AddArg(x) 770 return true 771 } 772 // match: (Add16 (Com16 x) (Const16 [1])) 773 // cond: 774 // result: (Neg16 x) 775 for { 776 _ = v.Args[1] 777 v_0 := v.Args[0] 778 if v_0.Op != OpCom16 { 779 break 780 } 781 x := v_0.Args[0] 782 v_1 := v.Args[1] 783 if v_1.Op != OpConst16 { 784 break 785 } 786 if v_1.AuxInt != 1 { 787 break 788 } 789 v.reset(OpNeg16) 790 v.AddArg(x) 791 return true 792 } 793 // match: (Add16 (Add16 i:(Const16 <t>) z) x) 794 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 795 // result: (Add16 i (Add16 <t> z x)) 796 for { 797 _ = v.Args[1] 798 v_0 := v.Args[0] 799 if v_0.Op != OpAdd16 { 800 break 801 } 802 _ = v_0.Args[1] 803 i := v_0.Args[0] 804 if i.Op != OpConst16 { 805 break 806 } 807 t := i.Type 808 z := v_0.Args[1] 809 x := v.Args[1] 810 if !(z.Op != OpConst16 && x.Op != OpConst16) { 811 break 812 } 813 v.reset(OpAdd16) 814 v.AddArg(i) 815 v0 := b.NewValue0(v.Pos, OpAdd16, t) 816 v0.AddArg(z) 817 v0.AddArg(x) 818 v.AddArg(v0) 819 return true 820 } 821 // match: (Add16 (Add16 z i:(Const16 <t>)) x) 822 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 823 // result: (Add16 i (Add16 <t> z x)) 824 for { 825 _ = v.Args[1] 826 v_0 := v.Args[0] 827 if v_0.Op != OpAdd16 { 828 break 829 } 830 _ = v_0.Args[1] 831 z := v_0.Args[0] 832 i := v_0.Args[1] 833 if i.Op != OpConst16 { 834 break 835 } 836 t := i.Type 837 x := v.Args[1] 838 if !(z.Op != OpConst16 && x.Op != OpConst16) { 839 break 840 } 841 v.reset(OpAdd16) 842 v.AddArg(i) 843 v0 := b.NewValue0(v.Pos, OpAdd16, t) 844 v0.AddArg(z) 845 v0.AddArg(x) 846 v.AddArg(v0) 847 return true 848 } 849 // match: (Add16 x (Add16 i:(Const16 <t>) z)) 850 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 851 // result: (Add16 i (Add16 <t> z x)) 852 for { 853 _ = v.Args[1] 854 x := v.Args[0] 855 v_1 := v.Args[1] 856 if v_1.Op != OpAdd16 { 857 break 858 } 859 _ = v_1.Args[1] 860 i := v_1.Args[0] 861 if i.Op != OpConst16 { 862 break 863 } 864 t := i.Type 865 z := v_1.Args[1] 866 if !(z.Op != OpConst16 && x.Op != OpConst16) { 867 break 868 } 869 v.reset(OpAdd16) 870 v.AddArg(i) 871 v0 := b.NewValue0(v.Pos, OpAdd16, t) 872 v0.AddArg(z) 873 v0.AddArg(x) 874 v.AddArg(v0) 875 return true 876 } 877 // match: (Add16 x (Add16 z i:(Const16 <t>))) 878 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 879 // result: (Add16 i (Add16 <t> z x)) 880 for { 881 _ = v.Args[1] 882 x := v.Args[0] 883 v_1 := v.Args[1] 884 if v_1.Op != OpAdd16 { 885 break 886 } 887 _ = v_1.Args[1] 888 z := v_1.Args[0] 889 i := v_1.Args[1] 890 if i.Op != OpConst16 { 891 break 892 } 893 t := i.Type 894 if !(z.Op != OpConst16 && x.Op != OpConst16) { 895 break 896 } 897 v.reset(OpAdd16) 898 v.AddArg(i) 899 v0 := b.NewValue0(v.Pos, OpAdd16, t) 900 v0.AddArg(z) 901 v0.AddArg(x) 902 v.AddArg(v0) 903 return true 904 } 905 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 906 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 907 // result: (Add16 i (Sub16 <t> x z)) 908 for { 909 _ = v.Args[1] 910 v_0 := v.Args[0] 911 if v_0.Op != OpSub16 { 912 break 913 } 914 _ = v_0.Args[1] 915 i := v_0.Args[0] 916 if i.Op != OpConst16 { 917 break 918 } 919 t := i.Type 920 z := v_0.Args[1] 921 x := v.Args[1] 922 if !(z.Op != OpConst16 && x.Op != OpConst16) { 923 break 924 } 925 v.reset(OpAdd16) 926 v.AddArg(i) 927 v0 := b.NewValue0(v.Pos, OpSub16, t) 928 v0.AddArg(x) 929 v0.AddArg(z) 930 v.AddArg(v0) 931 return true 932 } 933 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 934 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 935 // result: (Add16 i (Sub16 <t> x z)) 936 for { 937 _ = v.Args[1] 938 x := v.Args[0] 939 v_1 := v.Args[1] 940 if v_1.Op != OpSub16 { 941 break 942 } 943 _ = v_1.Args[1] 944 i := v_1.Args[0] 945 if i.Op != OpConst16 { 946 break 947 } 948 t := i.Type 949 z := v_1.Args[1] 950 if !(z.Op != OpConst16 && x.Op != OpConst16) { 951 break 952 } 953 v.reset(OpAdd16) 954 v.AddArg(i) 955 v0 := b.NewValue0(v.Pos, OpSub16, t) 956 v0.AddArg(x) 957 v0.AddArg(z) 958 v.AddArg(v0) 959 return true 960 } 961 return false 962 } 963 func rewriteValuegeneric_OpAdd16_20(v *Value) bool { 964 b := v.Block 965 _ = b 966 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 967 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 968 // result: (Add16 i (Sub16 <t> x z)) 969 for { 970 _ = v.Args[1] 971 x := v.Args[0] 972 v_1 := v.Args[1] 973 if v_1.Op != OpSub16 { 974 break 975 } 976 _ = v_1.Args[1] 977 i := v_1.Args[0] 978 if i.Op != OpConst16 { 979 break 980 } 981 t := i.Type 982 z := v_1.Args[1] 983 if !(z.Op != OpConst16 && x.Op != OpConst16) { 984 break 985 } 986 v.reset(OpAdd16) 987 v.AddArg(i) 988 v0 := b.NewValue0(v.Pos, OpSub16, t) 989 v0.AddArg(x) 990 v0.AddArg(z) 991 v.AddArg(v0) 992 return true 993 } 994 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 995 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 996 // result: (Add16 i (Sub16 <t> x z)) 997 for { 998 _ = v.Args[1] 999 v_0 := v.Args[0] 1000 if v_0.Op != OpSub16 { 1001 break 1002 } 1003 _ = v_0.Args[1] 1004 i := v_0.Args[0] 1005 if i.Op != OpConst16 { 1006 break 1007 } 1008 t := i.Type 1009 z := v_0.Args[1] 1010 x := v.Args[1] 1011 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1012 break 1013 } 1014 v.reset(OpAdd16) 1015 v.AddArg(i) 1016 v0 := b.NewValue0(v.Pos, OpSub16, t) 1017 v0.AddArg(x) 1018 v0.AddArg(z) 1019 v.AddArg(v0) 1020 return true 1021 } 1022 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 1023 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1024 // result: (Sub16 (Add16 <t> x z) i) 1025 for { 1026 _ = v.Args[1] 1027 v_0 := v.Args[0] 1028 if v_0.Op != OpSub16 { 1029 break 1030 } 1031 _ = v_0.Args[1] 1032 z := v_0.Args[0] 1033 i := v_0.Args[1] 1034 if i.Op != OpConst16 { 1035 break 1036 } 1037 t := i.Type 1038 x := v.Args[1] 1039 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1040 break 1041 } 1042 v.reset(OpSub16) 1043 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1044 v0.AddArg(x) 1045 v0.AddArg(z) 1046 v.AddArg(v0) 1047 v.AddArg(i) 1048 return true 1049 } 1050 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 1051 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1052 // result: (Sub16 (Add16 <t> x z) i) 1053 for { 1054 _ = v.Args[1] 1055 x := v.Args[0] 1056 v_1 := v.Args[1] 1057 if v_1.Op != OpSub16 { 1058 break 1059 } 1060 _ = v_1.Args[1] 1061 z := v_1.Args[0] 1062 i := v_1.Args[1] 1063 if i.Op != OpConst16 { 1064 break 1065 } 1066 t := i.Type 1067 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1068 break 1069 } 1070 v.reset(OpSub16) 1071 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1072 v0.AddArg(x) 1073 v0.AddArg(z) 1074 v.AddArg(v0) 1075 v.AddArg(i) 1076 return true 1077 } 1078 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 1079 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1080 // result: (Sub16 (Add16 <t> x z) i) 1081 for { 1082 _ = v.Args[1] 1083 x := v.Args[0] 1084 v_1 := v.Args[1] 1085 if v_1.Op != OpSub16 { 1086 break 1087 } 1088 _ = v_1.Args[1] 1089 z := v_1.Args[0] 1090 i := v_1.Args[1] 1091 if i.Op != OpConst16 { 1092 break 1093 } 1094 t := i.Type 1095 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1096 break 1097 } 1098 v.reset(OpSub16) 1099 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1100 v0.AddArg(x) 1101 v0.AddArg(z) 1102 v.AddArg(v0) 1103 v.AddArg(i) 1104 return true 1105 } 1106 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 1107 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1108 // result: (Sub16 (Add16 <t> x z) i) 1109 for { 1110 _ = v.Args[1] 1111 v_0 := v.Args[0] 1112 if v_0.Op != OpSub16 { 1113 break 1114 } 1115 _ = v_0.Args[1] 1116 z := v_0.Args[0] 1117 i := v_0.Args[1] 1118 if i.Op != OpConst16 { 1119 break 1120 } 1121 t := i.Type 1122 x := v.Args[1] 1123 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1124 break 1125 } 1126 v.reset(OpSub16) 1127 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1128 v0.AddArg(x) 1129 v0.AddArg(z) 1130 v.AddArg(v0) 1131 v.AddArg(i) 1132 return true 1133 } 1134 // match: (Add16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 1135 // cond: 1136 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1137 for { 1138 _ = v.Args[1] 1139 v_0 := v.Args[0] 1140 if v_0.Op != OpConst16 { 1141 break 1142 } 1143 t := v_0.Type 1144 c := v_0.AuxInt 1145 v_1 := v.Args[1] 1146 if v_1.Op != OpAdd16 { 1147 break 1148 } 1149 _ = v_1.Args[1] 1150 v_1_0 := v_1.Args[0] 1151 if v_1_0.Op != OpConst16 { 1152 break 1153 } 1154 if v_1_0.Type != t { 1155 break 1156 } 1157 d := v_1_0.AuxInt 1158 x := v_1.Args[1] 1159 v.reset(OpAdd16) 1160 v0 := b.NewValue0(v.Pos, OpConst16, t) 1161 v0.AuxInt = int64(int16(c + d)) 1162 v.AddArg(v0) 1163 v.AddArg(x) 1164 return true 1165 } 1166 // match: (Add16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 1167 // cond: 1168 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1169 for { 1170 _ = v.Args[1] 1171 v_0 := v.Args[0] 1172 if v_0.Op != OpConst16 { 1173 break 1174 } 1175 t := v_0.Type 1176 c := v_0.AuxInt 1177 v_1 := v.Args[1] 1178 if v_1.Op != OpAdd16 { 1179 break 1180 } 1181 _ = v_1.Args[1] 1182 x := v_1.Args[0] 1183 v_1_1 := v_1.Args[1] 1184 if v_1_1.Op != OpConst16 { 1185 break 1186 } 1187 if v_1_1.Type != t { 1188 break 1189 } 1190 d := v_1_1.AuxInt 1191 v.reset(OpAdd16) 1192 v0 := b.NewValue0(v.Pos, OpConst16, t) 1193 v0.AuxInt = int64(int16(c + d)) 1194 v.AddArg(v0) 1195 v.AddArg(x) 1196 return true 1197 } 1198 // match: (Add16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1199 // cond: 1200 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1201 for { 1202 _ = v.Args[1] 1203 v_0 := v.Args[0] 1204 if v_0.Op != OpAdd16 { 1205 break 1206 } 1207 _ = v_0.Args[1] 1208 v_0_0 := v_0.Args[0] 1209 if v_0_0.Op != OpConst16 { 1210 break 1211 } 1212 t := v_0_0.Type 1213 d := v_0_0.AuxInt 1214 x := v_0.Args[1] 1215 v_1 := v.Args[1] 1216 if v_1.Op != OpConst16 { 1217 break 1218 } 1219 if v_1.Type != t { 1220 break 1221 } 1222 c := v_1.AuxInt 1223 v.reset(OpAdd16) 1224 v0 := b.NewValue0(v.Pos, OpConst16, t) 1225 v0.AuxInt = int64(int16(c + d)) 1226 v.AddArg(v0) 1227 v.AddArg(x) 1228 return true 1229 } 1230 // match: (Add16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 1231 // cond: 1232 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1233 for { 1234 _ = v.Args[1] 1235 v_0 := v.Args[0] 1236 if v_0.Op != OpAdd16 { 1237 break 1238 } 1239 _ = v_0.Args[1] 1240 x := v_0.Args[0] 1241 v_0_1 := v_0.Args[1] 1242 if v_0_1.Op != OpConst16 { 1243 break 1244 } 1245 t := v_0_1.Type 1246 d := v_0_1.AuxInt 1247 v_1 := v.Args[1] 1248 if v_1.Op != OpConst16 { 1249 break 1250 } 1251 if v_1.Type != t { 1252 break 1253 } 1254 c := v_1.AuxInt 1255 v.reset(OpAdd16) 1256 v0 := b.NewValue0(v.Pos, OpConst16, t) 1257 v0.AuxInt = int64(int16(c + d)) 1258 v.AddArg(v0) 1259 v.AddArg(x) 1260 return true 1261 } 1262 return false 1263 } 1264 func rewriteValuegeneric_OpAdd16_30(v *Value) bool { 1265 b := v.Block 1266 _ = b 1267 // match: (Add16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 1268 // cond: 1269 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1270 for { 1271 _ = v.Args[1] 1272 v_0 := v.Args[0] 1273 if v_0.Op != OpConst16 { 1274 break 1275 } 1276 t := v_0.Type 1277 c := v_0.AuxInt 1278 v_1 := v.Args[1] 1279 if v_1.Op != OpSub16 { 1280 break 1281 } 1282 _ = v_1.Args[1] 1283 v_1_0 := v_1.Args[0] 1284 if v_1_0.Op != OpConst16 { 1285 break 1286 } 1287 if v_1_0.Type != t { 1288 break 1289 } 1290 d := v_1_0.AuxInt 1291 x := v_1.Args[1] 1292 v.reset(OpSub16) 1293 v0 := b.NewValue0(v.Pos, OpConst16, t) 1294 v0.AuxInt = int64(int16(c + d)) 1295 v.AddArg(v0) 1296 v.AddArg(x) 1297 return true 1298 } 1299 // match: (Add16 (Sub16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1300 // cond: 1301 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1302 for { 1303 _ = v.Args[1] 1304 v_0 := v.Args[0] 1305 if v_0.Op != OpSub16 { 1306 break 1307 } 1308 _ = v_0.Args[1] 1309 v_0_0 := v_0.Args[0] 1310 if v_0_0.Op != OpConst16 { 1311 break 1312 } 1313 t := v_0_0.Type 1314 d := v_0_0.AuxInt 1315 x := v_0.Args[1] 1316 v_1 := v.Args[1] 1317 if v_1.Op != OpConst16 { 1318 break 1319 } 1320 if v_1.Type != t { 1321 break 1322 } 1323 c := v_1.AuxInt 1324 v.reset(OpSub16) 1325 v0 := b.NewValue0(v.Pos, OpConst16, t) 1326 v0.AuxInt = int64(int16(c + d)) 1327 v.AddArg(v0) 1328 v.AddArg(x) 1329 return true 1330 } 1331 // match: (Add16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 1332 // cond: 1333 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1334 for { 1335 _ = v.Args[1] 1336 v_0 := v.Args[0] 1337 if v_0.Op != OpConst16 { 1338 break 1339 } 1340 t := v_0.Type 1341 c := v_0.AuxInt 1342 v_1 := v.Args[1] 1343 if v_1.Op != OpSub16 { 1344 break 1345 } 1346 _ = v_1.Args[1] 1347 x := v_1.Args[0] 1348 v_1_1 := v_1.Args[1] 1349 if v_1_1.Op != OpConst16 { 1350 break 1351 } 1352 if v_1_1.Type != t { 1353 break 1354 } 1355 d := v_1_1.AuxInt 1356 v.reset(OpAdd16) 1357 v0 := b.NewValue0(v.Pos, OpConst16, t) 1358 v0.AuxInt = int64(int16(c - d)) 1359 v.AddArg(v0) 1360 v.AddArg(x) 1361 return true 1362 } 1363 // match: (Add16 (Sub16 x (Const16 <t> [d])) (Const16 <t> [c])) 1364 // cond: 1365 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1366 for { 1367 _ = v.Args[1] 1368 v_0 := v.Args[0] 1369 if v_0.Op != OpSub16 { 1370 break 1371 } 1372 _ = v_0.Args[1] 1373 x := v_0.Args[0] 1374 v_0_1 := v_0.Args[1] 1375 if v_0_1.Op != OpConst16 { 1376 break 1377 } 1378 t := v_0_1.Type 1379 d := v_0_1.AuxInt 1380 v_1 := v.Args[1] 1381 if v_1.Op != OpConst16 { 1382 break 1383 } 1384 if v_1.Type != t { 1385 break 1386 } 1387 c := v_1.AuxInt 1388 v.reset(OpAdd16) 1389 v0 := b.NewValue0(v.Pos, OpConst16, t) 1390 v0.AuxInt = int64(int16(c - d)) 1391 v.AddArg(v0) 1392 v.AddArg(x) 1393 return true 1394 } 1395 return false 1396 } 1397 func rewriteValuegeneric_OpAdd32_0(v *Value) bool { 1398 b := v.Block 1399 _ = b 1400 // match: (Add32 (Const32 [c]) (Const32 [d])) 1401 // cond: 1402 // result: (Const32 [int64(int32(c+d))]) 1403 for { 1404 _ = v.Args[1] 1405 v_0 := v.Args[0] 1406 if v_0.Op != OpConst32 { 1407 break 1408 } 1409 c := v_0.AuxInt 1410 v_1 := v.Args[1] 1411 if v_1.Op != OpConst32 { 1412 break 1413 } 1414 d := v_1.AuxInt 1415 v.reset(OpConst32) 1416 v.AuxInt = int64(int32(c + d)) 1417 return true 1418 } 1419 // match: (Add32 (Const32 [d]) (Const32 [c])) 1420 // cond: 1421 // result: (Const32 [int64(int32(c+d))]) 1422 for { 1423 _ = v.Args[1] 1424 v_0 := v.Args[0] 1425 if v_0.Op != OpConst32 { 1426 break 1427 } 1428 d := v_0.AuxInt 1429 v_1 := v.Args[1] 1430 if v_1.Op != OpConst32 { 1431 break 1432 } 1433 c := v_1.AuxInt 1434 v.reset(OpConst32) 1435 v.AuxInt = int64(int32(c + d)) 1436 return true 1437 } 1438 // match: (Add32 <t> (Mul32 x y) (Mul32 x z)) 1439 // cond: 1440 // result: (Mul32 x (Add32 <t> y z)) 1441 for { 1442 t := v.Type 1443 _ = v.Args[1] 1444 v_0 := v.Args[0] 1445 if v_0.Op != OpMul32 { 1446 break 1447 } 1448 _ = v_0.Args[1] 1449 x := v_0.Args[0] 1450 y := v_0.Args[1] 1451 v_1 := v.Args[1] 1452 if v_1.Op != OpMul32 { 1453 break 1454 } 1455 _ = v_1.Args[1] 1456 if x != v_1.Args[0] { 1457 break 1458 } 1459 z := v_1.Args[1] 1460 v.reset(OpMul32) 1461 v.AddArg(x) 1462 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1463 v0.AddArg(y) 1464 v0.AddArg(z) 1465 v.AddArg(v0) 1466 return true 1467 } 1468 // match: (Add32 <t> (Mul32 y x) (Mul32 x z)) 1469 // cond: 1470 // result: (Mul32 x (Add32 <t> y z)) 1471 for { 1472 t := v.Type 1473 _ = v.Args[1] 1474 v_0 := v.Args[0] 1475 if v_0.Op != OpMul32 { 1476 break 1477 } 1478 _ = v_0.Args[1] 1479 y := v_0.Args[0] 1480 x := v_0.Args[1] 1481 v_1 := v.Args[1] 1482 if v_1.Op != OpMul32 { 1483 break 1484 } 1485 _ = v_1.Args[1] 1486 if x != v_1.Args[0] { 1487 break 1488 } 1489 z := v_1.Args[1] 1490 v.reset(OpMul32) 1491 v.AddArg(x) 1492 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1493 v0.AddArg(y) 1494 v0.AddArg(z) 1495 v.AddArg(v0) 1496 return true 1497 } 1498 // match: (Add32 <t> (Mul32 x y) (Mul32 z x)) 1499 // cond: 1500 // result: (Mul32 x (Add32 <t> y z)) 1501 for { 1502 t := v.Type 1503 _ = v.Args[1] 1504 v_0 := v.Args[0] 1505 if v_0.Op != OpMul32 { 1506 break 1507 } 1508 _ = v_0.Args[1] 1509 x := v_0.Args[0] 1510 y := v_0.Args[1] 1511 v_1 := v.Args[1] 1512 if v_1.Op != OpMul32 { 1513 break 1514 } 1515 _ = v_1.Args[1] 1516 z := v_1.Args[0] 1517 if x != v_1.Args[1] { 1518 break 1519 } 1520 v.reset(OpMul32) 1521 v.AddArg(x) 1522 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1523 v0.AddArg(y) 1524 v0.AddArg(z) 1525 v.AddArg(v0) 1526 return true 1527 } 1528 // match: (Add32 <t> (Mul32 y x) (Mul32 z x)) 1529 // cond: 1530 // result: (Mul32 x (Add32 <t> y z)) 1531 for { 1532 t := v.Type 1533 _ = v.Args[1] 1534 v_0 := v.Args[0] 1535 if v_0.Op != OpMul32 { 1536 break 1537 } 1538 _ = v_0.Args[1] 1539 y := v_0.Args[0] 1540 x := v_0.Args[1] 1541 v_1 := v.Args[1] 1542 if v_1.Op != OpMul32 { 1543 break 1544 } 1545 _ = v_1.Args[1] 1546 z := v_1.Args[0] 1547 if x != v_1.Args[1] { 1548 break 1549 } 1550 v.reset(OpMul32) 1551 v.AddArg(x) 1552 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1553 v0.AddArg(y) 1554 v0.AddArg(z) 1555 v.AddArg(v0) 1556 return true 1557 } 1558 // match: (Add32 <t> (Mul32 x z) (Mul32 x y)) 1559 // cond: 1560 // result: (Mul32 x (Add32 <t> y z)) 1561 for { 1562 t := v.Type 1563 _ = v.Args[1] 1564 v_0 := v.Args[0] 1565 if v_0.Op != OpMul32 { 1566 break 1567 } 1568 _ = v_0.Args[1] 1569 x := v_0.Args[0] 1570 z := v_0.Args[1] 1571 v_1 := v.Args[1] 1572 if v_1.Op != OpMul32 { 1573 break 1574 } 1575 _ = v_1.Args[1] 1576 if x != v_1.Args[0] { 1577 break 1578 } 1579 y := v_1.Args[1] 1580 v.reset(OpMul32) 1581 v.AddArg(x) 1582 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1583 v0.AddArg(y) 1584 v0.AddArg(z) 1585 v.AddArg(v0) 1586 return true 1587 } 1588 // match: (Add32 <t> (Mul32 z x) (Mul32 x y)) 1589 // cond: 1590 // result: (Mul32 x (Add32 <t> y z)) 1591 for { 1592 t := v.Type 1593 _ = v.Args[1] 1594 v_0 := v.Args[0] 1595 if v_0.Op != OpMul32 { 1596 break 1597 } 1598 _ = v_0.Args[1] 1599 z := v_0.Args[0] 1600 x := v_0.Args[1] 1601 v_1 := v.Args[1] 1602 if v_1.Op != OpMul32 { 1603 break 1604 } 1605 _ = v_1.Args[1] 1606 if x != v_1.Args[0] { 1607 break 1608 } 1609 y := v_1.Args[1] 1610 v.reset(OpMul32) 1611 v.AddArg(x) 1612 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1613 v0.AddArg(y) 1614 v0.AddArg(z) 1615 v.AddArg(v0) 1616 return true 1617 } 1618 // match: (Add32 <t> (Mul32 x z) (Mul32 y x)) 1619 // cond: 1620 // result: (Mul32 x (Add32 <t> y z)) 1621 for { 1622 t := v.Type 1623 _ = v.Args[1] 1624 v_0 := v.Args[0] 1625 if v_0.Op != OpMul32 { 1626 break 1627 } 1628 _ = v_0.Args[1] 1629 x := v_0.Args[0] 1630 z := v_0.Args[1] 1631 v_1 := v.Args[1] 1632 if v_1.Op != OpMul32 { 1633 break 1634 } 1635 _ = v_1.Args[1] 1636 y := v_1.Args[0] 1637 if x != v_1.Args[1] { 1638 break 1639 } 1640 v.reset(OpMul32) 1641 v.AddArg(x) 1642 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1643 v0.AddArg(y) 1644 v0.AddArg(z) 1645 v.AddArg(v0) 1646 return true 1647 } 1648 // match: (Add32 <t> (Mul32 z x) (Mul32 y x)) 1649 // cond: 1650 // result: (Mul32 x (Add32 <t> y z)) 1651 for { 1652 t := v.Type 1653 _ = v.Args[1] 1654 v_0 := v.Args[0] 1655 if v_0.Op != OpMul32 { 1656 break 1657 } 1658 _ = v_0.Args[1] 1659 z := v_0.Args[0] 1660 x := v_0.Args[1] 1661 v_1 := v.Args[1] 1662 if v_1.Op != OpMul32 { 1663 break 1664 } 1665 _ = v_1.Args[1] 1666 y := v_1.Args[0] 1667 if x != v_1.Args[1] { 1668 break 1669 } 1670 v.reset(OpMul32) 1671 v.AddArg(x) 1672 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1673 v0.AddArg(y) 1674 v0.AddArg(z) 1675 v.AddArg(v0) 1676 return true 1677 } 1678 return false 1679 } 1680 func rewriteValuegeneric_OpAdd32_10(v *Value) bool { 1681 b := v.Block 1682 _ = b 1683 // match: (Add32 (Const32 [0]) x) 1684 // cond: 1685 // result: x 1686 for { 1687 _ = v.Args[1] 1688 v_0 := v.Args[0] 1689 if v_0.Op != OpConst32 { 1690 break 1691 } 1692 if v_0.AuxInt != 0 { 1693 break 1694 } 1695 x := v.Args[1] 1696 v.reset(OpCopy) 1697 v.Type = x.Type 1698 v.AddArg(x) 1699 return true 1700 } 1701 // match: (Add32 x (Const32 [0])) 1702 // cond: 1703 // result: x 1704 for { 1705 _ = v.Args[1] 1706 x := v.Args[0] 1707 v_1 := v.Args[1] 1708 if v_1.Op != OpConst32 { 1709 break 1710 } 1711 if v_1.AuxInt != 0 { 1712 break 1713 } 1714 v.reset(OpCopy) 1715 v.Type = x.Type 1716 v.AddArg(x) 1717 return true 1718 } 1719 // match: (Add32 (Const32 [1]) (Com32 x)) 1720 // cond: 1721 // result: (Neg32 x) 1722 for { 1723 _ = v.Args[1] 1724 v_0 := v.Args[0] 1725 if v_0.Op != OpConst32 { 1726 break 1727 } 1728 if v_0.AuxInt != 1 { 1729 break 1730 } 1731 v_1 := v.Args[1] 1732 if v_1.Op != OpCom32 { 1733 break 1734 } 1735 x := v_1.Args[0] 1736 v.reset(OpNeg32) 1737 v.AddArg(x) 1738 return true 1739 } 1740 // match: (Add32 (Com32 x) (Const32 [1])) 1741 // cond: 1742 // result: (Neg32 x) 1743 for { 1744 _ = v.Args[1] 1745 v_0 := v.Args[0] 1746 if v_0.Op != OpCom32 { 1747 break 1748 } 1749 x := v_0.Args[0] 1750 v_1 := v.Args[1] 1751 if v_1.Op != OpConst32 { 1752 break 1753 } 1754 if v_1.AuxInt != 1 { 1755 break 1756 } 1757 v.reset(OpNeg32) 1758 v.AddArg(x) 1759 return true 1760 } 1761 // match: (Add32 (Add32 i:(Const32 <t>) z) x) 1762 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1763 // result: (Add32 i (Add32 <t> z x)) 1764 for { 1765 _ = v.Args[1] 1766 v_0 := v.Args[0] 1767 if v_0.Op != OpAdd32 { 1768 break 1769 } 1770 _ = v_0.Args[1] 1771 i := v_0.Args[0] 1772 if i.Op != OpConst32 { 1773 break 1774 } 1775 t := i.Type 1776 z := v_0.Args[1] 1777 x := v.Args[1] 1778 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1779 break 1780 } 1781 v.reset(OpAdd32) 1782 v.AddArg(i) 1783 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1784 v0.AddArg(z) 1785 v0.AddArg(x) 1786 v.AddArg(v0) 1787 return true 1788 } 1789 // match: (Add32 (Add32 z i:(Const32 <t>)) x) 1790 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1791 // result: (Add32 i (Add32 <t> z x)) 1792 for { 1793 _ = v.Args[1] 1794 v_0 := v.Args[0] 1795 if v_0.Op != OpAdd32 { 1796 break 1797 } 1798 _ = v_0.Args[1] 1799 z := v_0.Args[0] 1800 i := v_0.Args[1] 1801 if i.Op != OpConst32 { 1802 break 1803 } 1804 t := i.Type 1805 x := v.Args[1] 1806 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1807 break 1808 } 1809 v.reset(OpAdd32) 1810 v.AddArg(i) 1811 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1812 v0.AddArg(z) 1813 v0.AddArg(x) 1814 v.AddArg(v0) 1815 return true 1816 } 1817 // match: (Add32 x (Add32 i:(Const32 <t>) z)) 1818 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1819 // result: (Add32 i (Add32 <t> z x)) 1820 for { 1821 _ = v.Args[1] 1822 x := v.Args[0] 1823 v_1 := v.Args[1] 1824 if v_1.Op != OpAdd32 { 1825 break 1826 } 1827 _ = v_1.Args[1] 1828 i := v_1.Args[0] 1829 if i.Op != OpConst32 { 1830 break 1831 } 1832 t := i.Type 1833 z := v_1.Args[1] 1834 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1835 break 1836 } 1837 v.reset(OpAdd32) 1838 v.AddArg(i) 1839 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1840 v0.AddArg(z) 1841 v0.AddArg(x) 1842 v.AddArg(v0) 1843 return true 1844 } 1845 // match: (Add32 x (Add32 z i:(Const32 <t>))) 1846 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1847 // result: (Add32 i (Add32 <t> z x)) 1848 for { 1849 _ = v.Args[1] 1850 x := v.Args[0] 1851 v_1 := v.Args[1] 1852 if v_1.Op != OpAdd32 { 1853 break 1854 } 1855 _ = v_1.Args[1] 1856 z := v_1.Args[0] 1857 i := v_1.Args[1] 1858 if i.Op != OpConst32 { 1859 break 1860 } 1861 t := i.Type 1862 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1863 break 1864 } 1865 v.reset(OpAdd32) 1866 v.AddArg(i) 1867 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1868 v0.AddArg(z) 1869 v0.AddArg(x) 1870 v.AddArg(v0) 1871 return true 1872 } 1873 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1874 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1875 // result: (Add32 i (Sub32 <t> x z)) 1876 for { 1877 _ = v.Args[1] 1878 v_0 := v.Args[0] 1879 if v_0.Op != OpSub32 { 1880 break 1881 } 1882 _ = v_0.Args[1] 1883 i := v_0.Args[0] 1884 if i.Op != OpConst32 { 1885 break 1886 } 1887 t := i.Type 1888 z := v_0.Args[1] 1889 x := v.Args[1] 1890 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1891 break 1892 } 1893 v.reset(OpAdd32) 1894 v.AddArg(i) 1895 v0 := b.NewValue0(v.Pos, OpSub32, t) 1896 v0.AddArg(x) 1897 v0.AddArg(z) 1898 v.AddArg(v0) 1899 return true 1900 } 1901 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1902 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1903 // result: (Add32 i (Sub32 <t> x z)) 1904 for { 1905 _ = v.Args[1] 1906 x := v.Args[0] 1907 v_1 := v.Args[1] 1908 if v_1.Op != OpSub32 { 1909 break 1910 } 1911 _ = v_1.Args[1] 1912 i := v_1.Args[0] 1913 if i.Op != OpConst32 { 1914 break 1915 } 1916 t := i.Type 1917 z := v_1.Args[1] 1918 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1919 break 1920 } 1921 v.reset(OpAdd32) 1922 v.AddArg(i) 1923 v0 := b.NewValue0(v.Pos, OpSub32, t) 1924 v0.AddArg(x) 1925 v0.AddArg(z) 1926 v.AddArg(v0) 1927 return true 1928 } 1929 return false 1930 } 1931 func rewriteValuegeneric_OpAdd32_20(v *Value) bool { 1932 b := v.Block 1933 _ = b 1934 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1935 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1936 // result: (Add32 i (Sub32 <t> x z)) 1937 for { 1938 _ = v.Args[1] 1939 x := v.Args[0] 1940 v_1 := v.Args[1] 1941 if v_1.Op != OpSub32 { 1942 break 1943 } 1944 _ = v_1.Args[1] 1945 i := v_1.Args[0] 1946 if i.Op != OpConst32 { 1947 break 1948 } 1949 t := i.Type 1950 z := v_1.Args[1] 1951 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1952 break 1953 } 1954 v.reset(OpAdd32) 1955 v.AddArg(i) 1956 v0 := b.NewValue0(v.Pos, OpSub32, t) 1957 v0.AddArg(x) 1958 v0.AddArg(z) 1959 v.AddArg(v0) 1960 return true 1961 } 1962 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1963 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1964 // result: (Add32 i (Sub32 <t> x z)) 1965 for { 1966 _ = v.Args[1] 1967 v_0 := v.Args[0] 1968 if v_0.Op != OpSub32 { 1969 break 1970 } 1971 _ = v_0.Args[1] 1972 i := v_0.Args[0] 1973 if i.Op != OpConst32 { 1974 break 1975 } 1976 t := i.Type 1977 z := v_0.Args[1] 1978 x := v.Args[1] 1979 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1980 break 1981 } 1982 v.reset(OpAdd32) 1983 v.AddArg(i) 1984 v0 := b.NewValue0(v.Pos, OpSub32, t) 1985 v0.AddArg(x) 1986 v0.AddArg(z) 1987 v.AddArg(v0) 1988 return true 1989 } 1990 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 1991 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1992 // result: (Sub32 (Add32 <t> x z) i) 1993 for { 1994 _ = v.Args[1] 1995 v_0 := v.Args[0] 1996 if v_0.Op != OpSub32 { 1997 break 1998 } 1999 _ = v_0.Args[1] 2000 z := v_0.Args[0] 2001 i := v_0.Args[1] 2002 if i.Op != OpConst32 { 2003 break 2004 } 2005 t := i.Type 2006 x := v.Args[1] 2007 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2008 break 2009 } 2010 v.reset(OpSub32) 2011 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2012 v0.AddArg(x) 2013 v0.AddArg(z) 2014 v.AddArg(v0) 2015 v.AddArg(i) 2016 return true 2017 } 2018 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 2019 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2020 // result: (Sub32 (Add32 <t> x z) i) 2021 for { 2022 _ = v.Args[1] 2023 x := v.Args[0] 2024 v_1 := v.Args[1] 2025 if v_1.Op != OpSub32 { 2026 break 2027 } 2028 _ = v_1.Args[1] 2029 z := v_1.Args[0] 2030 i := v_1.Args[1] 2031 if i.Op != OpConst32 { 2032 break 2033 } 2034 t := i.Type 2035 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2036 break 2037 } 2038 v.reset(OpSub32) 2039 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2040 v0.AddArg(x) 2041 v0.AddArg(z) 2042 v.AddArg(v0) 2043 v.AddArg(i) 2044 return true 2045 } 2046 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 2047 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2048 // result: (Sub32 (Add32 <t> x z) i) 2049 for { 2050 _ = v.Args[1] 2051 x := v.Args[0] 2052 v_1 := v.Args[1] 2053 if v_1.Op != OpSub32 { 2054 break 2055 } 2056 _ = v_1.Args[1] 2057 z := v_1.Args[0] 2058 i := v_1.Args[1] 2059 if i.Op != OpConst32 { 2060 break 2061 } 2062 t := i.Type 2063 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2064 break 2065 } 2066 v.reset(OpSub32) 2067 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2068 v0.AddArg(x) 2069 v0.AddArg(z) 2070 v.AddArg(v0) 2071 v.AddArg(i) 2072 return true 2073 } 2074 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 2075 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2076 // result: (Sub32 (Add32 <t> x z) i) 2077 for { 2078 _ = v.Args[1] 2079 v_0 := v.Args[0] 2080 if v_0.Op != OpSub32 { 2081 break 2082 } 2083 _ = v_0.Args[1] 2084 z := v_0.Args[0] 2085 i := v_0.Args[1] 2086 if i.Op != OpConst32 { 2087 break 2088 } 2089 t := i.Type 2090 x := v.Args[1] 2091 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2092 break 2093 } 2094 v.reset(OpSub32) 2095 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2096 v0.AddArg(x) 2097 v0.AddArg(z) 2098 v.AddArg(v0) 2099 v.AddArg(i) 2100 return true 2101 } 2102 // match: (Add32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 2103 // cond: 2104 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2105 for { 2106 _ = v.Args[1] 2107 v_0 := v.Args[0] 2108 if v_0.Op != OpConst32 { 2109 break 2110 } 2111 t := v_0.Type 2112 c := v_0.AuxInt 2113 v_1 := v.Args[1] 2114 if v_1.Op != OpAdd32 { 2115 break 2116 } 2117 _ = v_1.Args[1] 2118 v_1_0 := v_1.Args[0] 2119 if v_1_0.Op != OpConst32 { 2120 break 2121 } 2122 if v_1_0.Type != t { 2123 break 2124 } 2125 d := v_1_0.AuxInt 2126 x := v_1.Args[1] 2127 v.reset(OpAdd32) 2128 v0 := b.NewValue0(v.Pos, OpConst32, t) 2129 v0.AuxInt = int64(int32(c + d)) 2130 v.AddArg(v0) 2131 v.AddArg(x) 2132 return true 2133 } 2134 // match: (Add32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 2135 // cond: 2136 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2137 for { 2138 _ = v.Args[1] 2139 v_0 := v.Args[0] 2140 if v_0.Op != OpConst32 { 2141 break 2142 } 2143 t := v_0.Type 2144 c := v_0.AuxInt 2145 v_1 := v.Args[1] 2146 if v_1.Op != OpAdd32 { 2147 break 2148 } 2149 _ = v_1.Args[1] 2150 x := v_1.Args[0] 2151 v_1_1 := v_1.Args[1] 2152 if v_1_1.Op != OpConst32 { 2153 break 2154 } 2155 if v_1_1.Type != t { 2156 break 2157 } 2158 d := v_1_1.AuxInt 2159 v.reset(OpAdd32) 2160 v0 := b.NewValue0(v.Pos, OpConst32, t) 2161 v0.AuxInt = int64(int32(c + d)) 2162 v.AddArg(v0) 2163 v.AddArg(x) 2164 return true 2165 } 2166 // match: (Add32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 2167 // cond: 2168 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2169 for { 2170 _ = v.Args[1] 2171 v_0 := v.Args[0] 2172 if v_0.Op != OpAdd32 { 2173 break 2174 } 2175 _ = v_0.Args[1] 2176 v_0_0 := v_0.Args[0] 2177 if v_0_0.Op != OpConst32 { 2178 break 2179 } 2180 t := v_0_0.Type 2181 d := v_0_0.AuxInt 2182 x := v_0.Args[1] 2183 v_1 := v.Args[1] 2184 if v_1.Op != OpConst32 { 2185 break 2186 } 2187 if v_1.Type != t { 2188 break 2189 } 2190 c := v_1.AuxInt 2191 v.reset(OpAdd32) 2192 v0 := b.NewValue0(v.Pos, OpConst32, t) 2193 v0.AuxInt = int64(int32(c + d)) 2194 v.AddArg(v0) 2195 v.AddArg(x) 2196 return true 2197 } 2198 // match: (Add32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 2199 // cond: 2200 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2201 for { 2202 _ = v.Args[1] 2203 v_0 := v.Args[0] 2204 if v_0.Op != OpAdd32 { 2205 break 2206 } 2207 _ = v_0.Args[1] 2208 x := v_0.Args[0] 2209 v_0_1 := v_0.Args[1] 2210 if v_0_1.Op != OpConst32 { 2211 break 2212 } 2213 t := v_0_1.Type 2214 d := v_0_1.AuxInt 2215 v_1 := v.Args[1] 2216 if v_1.Op != OpConst32 { 2217 break 2218 } 2219 if v_1.Type != t { 2220 break 2221 } 2222 c := v_1.AuxInt 2223 v.reset(OpAdd32) 2224 v0 := b.NewValue0(v.Pos, OpConst32, t) 2225 v0.AuxInt = int64(int32(c + d)) 2226 v.AddArg(v0) 2227 v.AddArg(x) 2228 return true 2229 } 2230 return false 2231 } 2232 func rewriteValuegeneric_OpAdd32_30(v *Value) bool { 2233 b := v.Block 2234 _ = b 2235 // match: (Add32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 2236 // cond: 2237 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 2238 for { 2239 _ = v.Args[1] 2240 v_0 := v.Args[0] 2241 if v_0.Op != OpConst32 { 2242 break 2243 } 2244 t := v_0.Type 2245 c := v_0.AuxInt 2246 v_1 := v.Args[1] 2247 if v_1.Op != OpSub32 { 2248 break 2249 } 2250 _ = v_1.Args[1] 2251 v_1_0 := v_1.Args[0] 2252 if v_1_0.Op != OpConst32 { 2253 break 2254 } 2255 if v_1_0.Type != t { 2256 break 2257 } 2258 d := v_1_0.AuxInt 2259 x := v_1.Args[1] 2260 v.reset(OpSub32) 2261 v0 := b.NewValue0(v.Pos, OpConst32, t) 2262 v0.AuxInt = int64(int32(c + d)) 2263 v.AddArg(v0) 2264 v.AddArg(x) 2265 return true 2266 } 2267 // match: (Add32 (Sub32 (Const32 <t> [d]) x) (Const32 <t> [c])) 2268 // cond: 2269 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 2270 for { 2271 _ = v.Args[1] 2272 v_0 := v.Args[0] 2273 if v_0.Op != OpSub32 { 2274 break 2275 } 2276 _ = v_0.Args[1] 2277 v_0_0 := v_0.Args[0] 2278 if v_0_0.Op != OpConst32 { 2279 break 2280 } 2281 t := v_0_0.Type 2282 d := v_0_0.AuxInt 2283 x := v_0.Args[1] 2284 v_1 := v.Args[1] 2285 if v_1.Op != OpConst32 { 2286 break 2287 } 2288 if v_1.Type != t { 2289 break 2290 } 2291 c := v_1.AuxInt 2292 v.reset(OpSub32) 2293 v0 := b.NewValue0(v.Pos, OpConst32, t) 2294 v0.AuxInt = int64(int32(c + d)) 2295 v.AddArg(v0) 2296 v.AddArg(x) 2297 return true 2298 } 2299 // match: (Add32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 2300 // cond: 2301 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 2302 for { 2303 _ = v.Args[1] 2304 v_0 := v.Args[0] 2305 if v_0.Op != OpConst32 { 2306 break 2307 } 2308 t := v_0.Type 2309 c := v_0.AuxInt 2310 v_1 := v.Args[1] 2311 if v_1.Op != OpSub32 { 2312 break 2313 } 2314 _ = v_1.Args[1] 2315 x := v_1.Args[0] 2316 v_1_1 := v_1.Args[1] 2317 if v_1_1.Op != OpConst32 { 2318 break 2319 } 2320 if v_1_1.Type != t { 2321 break 2322 } 2323 d := v_1_1.AuxInt 2324 v.reset(OpAdd32) 2325 v0 := b.NewValue0(v.Pos, OpConst32, t) 2326 v0.AuxInt = int64(int32(c - d)) 2327 v.AddArg(v0) 2328 v.AddArg(x) 2329 return true 2330 } 2331 // match: (Add32 (Sub32 x (Const32 <t> [d])) (Const32 <t> [c])) 2332 // cond: 2333 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 2334 for { 2335 _ = v.Args[1] 2336 v_0 := v.Args[0] 2337 if v_0.Op != OpSub32 { 2338 break 2339 } 2340 _ = v_0.Args[1] 2341 x := v_0.Args[0] 2342 v_0_1 := v_0.Args[1] 2343 if v_0_1.Op != OpConst32 { 2344 break 2345 } 2346 t := v_0_1.Type 2347 d := v_0_1.AuxInt 2348 v_1 := v.Args[1] 2349 if v_1.Op != OpConst32 { 2350 break 2351 } 2352 if v_1.Type != t { 2353 break 2354 } 2355 c := v_1.AuxInt 2356 v.reset(OpAdd32) 2357 v0 := b.NewValue0(v.Pos, OpConst32, t) 2358 v0.AuxInt = int64(int32(c - d)) 2359 v.AddArg(v0) 2360 v.AddArg(x) 2361 return true 2362 } 2363 return false 2364 } 2365 func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { 2366 // match: (Add32F (Const32F [c]) (Const32F [d])) 2367 // cond: 2368 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 2369 for { 2370 _ = v.Args[1] 2371 v_0 := v.Args[0] 2372 if v_0.Op != OpConst32F { 2373 break 2374 } 2375 c := v_0.AuxInt 2376 v_1 := v.Args[1] 2377 if v_1.Op != OpConst32F { 2378 break 2379 } 2380 d := v_1.AuxInt 2381 v.reset(OpConst32F) 2382 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 2383 return true 2384 } 2385 // match: (Add32F (Const32F [d]) (Const32F [c])) 2386 // cond: 2387 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 2388 for { 2389 _ = v.Args[1] 2390 v_0 := v.Args[0] 2391 if v_0.Op != OpConst32F { 2392 break 2393 } 2394 d := v_0.AuxInt 2395 v_1 := v.Args[1] 2396 if v_1.Op != OpConst32F { 2397 break 2398 } 2399 c := v_1.AuxInt 2400 v.reset(OpConst32F) 2401 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 2402 return true 2403 } 2404 // match: (Add32F x (Const32F [0])) 2405 // cond: 2406 // result: x 2407 for { 2408 _ = v.Args[1] 2409 x := v.Args[0] 2410 v_1 := v.Args[1] 2411 if v_1.Op != OpConst32F { 2412 break 2413 } 2414 if v_1.AuxInt != 0 { 2415 break 2416 } 2417 v.reset(OpCopy) 2418 v.Type = x.Type 2419 v.AddArg(x) 2420 return true 2421 } 2422 // match: (Add32F (Const32F [0]) x) 2423 // cond: 2424 // result: x 2425 for { 2426 _ = v.Args[1] 2427 v_0 := v.Args[0] 2428 if v_0.Op != OpConst32F { 2429 break 2430 } 2431 if v_0.AuxInt != 0 { 2432 break 2433 } 2434 x := v.Args[1] 2435 v.reset(OpCopy) 2436 v.Type = x.Type 2437 v.AddArg(x) 2438 return true 2439 } 2440 return false 2441 } 2442 func rewriteValuegeneric_OpAdd64_0(v *Value) bool { 2443 b := v.Block 2444 _ = b 2445 // match: (Add64 (Const64 [c]) (Const64 [d])) 2446 // cond: 2447 // result: (Const64 [c+d]) 2448 for { 2449 _ = v.Args[1] 2450 v_0 := v.Args[0] 2451 if v_0.Op != OpConst64 { 2452 break 2453 } 2454 c := v_0.AuxInt 2455 v_1 := v.Args[1] 2456 if v_1.Op != OpConst64 { 2457 break 2458 } 2459 d := v_1.AuxInt 2460 v.reset(OpConst64) 2461 v.AuxInt = c + d 2462 return true 2463 } 2464 // match: (Add64 (Const64 [d]) (Const64 [c])) 2465 // cond: 2466 // result: (Const64 [c+d]) 2467 for { 2468 _ = v.Args[1] 2469 v_0 := v.Args[0] 2470 if v_0.Op != OpConst64 { 2471 break 2472 } 2473 d := v_0.AuxInt 2474 v_1 := v.Args[1] 2475 if v_1.Op != OpConst64 { 2476 break 2477 } 2478 c := v_1.AuxInt 2479 v.reset(OpConst64) 2480 v.AuxInt = c + d 2481 return true 2482 } 2483 // match: (Add64 <t> (Mul64 x y) (Mul64 x z)) 2484 // cond: 2485 // result: (Mul64 x (Add64 <t> y z)) 2486 for { 2487 t := v.Type 2488 _ = v.Args[1] 2489 v_0 := v.Args[0] 2490 if v_0.Op != OpMul64 { 2491 break 2492 } 2493 _ = v_0.Args[1] 2494 x := v_0.Args[0] 2495 y := v_0.Args[1] 2496 v_1 := v.Args[1] 2497 if v_1.Op != OpMul64 { 2498 break 2499 } 2500 _ = v_1.Args[1] 2501 if x != v_1.Args[0] { 2502 break 2503 } 2504 z := v_1.Args[1] 2505 v.reset(OpMul64) 2506 v.AddArg(x) 2507 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2508 v0.AddArg(y) 2509 v0.AddArg(z) 2510 v.AddArg(v0) 2511 return true 2512 } 2513 // match: (Add64 <t> (Mul64 y x) (Mul64 x z)) 2514 // cond: 2515 // result: (Mul64 x (Add64 <t> y z)) 2516 for { 2517 t := v.Type 2518 _ = v.Args[1] 2519 v_0 := v.Args[0] 2520 if v_0.Op != OpMul64 { 2521 break 2522 } 2523 _ = v_0.Args[1] 2524 y := v_0.Args[0] 2525 x := v_0.Args[1] 2526 v_1 := v.Args[1] 2527 if v_1.Op != OpMul64 { 2528 break 2529 } 2530 _ = v_1.Args[1] 2531 if x != v_1.Args[0] { 2532 break 2533 } 2534 z := v_1.Args[1] 2535 v.reset(OpMul64) 2536 v.AddArg(x) 2537 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2538 v0.AddArg(y) 2539 v0.AddArg(z) 2540 v.AddArg(v0) 2541 return true 2542 } 2543 // match: (Add64 <t> (Mul64 x y) (Mul64 z x)) 2544 // cond: 2545 // result: (Mul64 x (Add64 <t> y z)) 2546 for { 2547 t := v.Type 2548 _ = v.Args[1] 2549 v_0 := v.Args[0] 2550 if v_0.Op != OpMul64 { 2551 break 2552 } 2553 _ = v_0.Args[1] 2554 x := v_0.Args[0] 2555 y := v_0.Args[1] 2556 v_1 := v.Args[1] 2557 if v_1.Op != OpMul64 { 2558 break 2559 } 2560 _ = v_1.Args[1] 2561 z := v_1.Args[0] 2562 if x != v_1.Args[1] { 2563 break 2564 } 2565 v.reset(OpMul64) 2566 v.AddArg(x) 2567 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2568 v0.AddArg(y) 2569 v0.AddArg(z) 2570 v.AddArg(v0) 2571 return true 2572 } 2573 // match: (Add64 <t> (Mul64 y x) (Mul64 z x)) 2574 // cond: 2575 // result: (Mul64 x (Add64 <t> y z)) 2576 for { 2577 t := v.Type 2578 _ = v.Args[1] 2579 v_0 := v.Args[0] 2580 if v_0.Op != OpMul64 { 2581 break 2582 } 2583 _ = v_0.Args[1] 2584 y := v_0.Args[0] 2585 x := v_0.Args[1] 2586 v_1 := v.Args[1] 2587 if v_1.Op != OpMul64 { 2588 break 2589 } 2590 _ = v_1.Args[1] 2591 z := v_1.Args[0] 2592 if x != v_1.Args[1] { 2593 break 2594 } 2595 v.reset(OpMul64) 2596 v.AddArg(x) 2597 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2598 v0.AddArg(y) 2599 v0.AddArg(z) 2600 v.AddArg(v0) 2601 return true 2602 } 2603 // match: (Add64 <t> (Mul64 x z) (Mul64 x y)) 2604 // cond: 2605 // result: (Mul64 x (Add64 <t> y z)) 2606 for { 2607 t := v.Type 2608 _ = v.Args[1] 2609 v_0 := v.Args[0] 2610 if v_0.Op != OpMul64 { 2611 break 2612 } 2613 _ = v_0.Args[1] 2614 x := v_0.Args[0] 2615 z := v_0.Args[1] 2616 v_1 := v.Args[1] 2617 if v_1.Op != OpMul64 { 2618 break 2619 } 2620 _ = v_1.Args[1] 2621 if x != v_1.Args[0] { 2622 break 2623 } 2624 y := v_1.Args[1] 2625 v.reset(OpMul64) 2626 v.AddArg(x) 2627 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2628 v0.AddArg(y) 2629 v0.AddArg(z) 2630 v.AddArg(v0) 2631 return true 2632 } 2633 // match: (Add64 <t> (Mul64 z x) (Mul64 x y)) 2634 // cond: 2635 // result: (Mul64 x (Add64 <t> y z)) 2636 for { 2637 t := v.Type 2638 _ = v.Args[1] 2639 v_0 := v.Args[0] 2640 if v_0.Op != OpMul64 { 2641 break 2642 } 2643 _ = v_0.Args[1] 2644 z := v_0.Args[0] 2645 x := v_0.Args[1] 2646 v_1 := v.Args[1] 2647 if v_1.Op != OpMul64 { 2648 break 2649 } 2650 _ = v_1.Args[1] 2651 if x != v_1.Args[0] { 2652 break 2653 } 2654 y := v_1.Args[1] 2655 v.reset(OpMul64) 2656 v.AddArg(x) 2657 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2658 v0.AddArg(y) 2659 v0.AddArg(z) 2660 v.AddArg(v0) 2661 return true 2662 } 2663 // match: (Add64 <t> (Mul64 x z) (Mul64 y x)) 2664 // cond: 2665 // result: (Mul64 x (Add64 <t> y z)) 2666 for { 2667 t := v.Type 2668 _ = v.Args[1] 2669 v_0 := v.Args[0] 2670 if v_0.Op != OpMul64 { 2671 break 2672 } 2673 _ = v_0.Args[1] 2674 x := v_0.Args[0] 2675 z := v_0.Args[1] 2676 v_1 := v.Args[1] 2677 if v_1.Op != OpMul64 { 2678 break 2679 } 2680 _ = v_1.Args[1] 2681 y := v_1.Args[0] 2682 if x != v_1.Args[1] { 2683 break 2684 } 2685 v.reset(OpMul64) 2686 v.AddArg(x) 2687 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2688 v0.AddArg(y) 2689 v0.AddArg(z) 2690 v.AddArg(v0) 2691 return true 2692 } 2693 // match: (Add64 <t> (Mul64 z x) (Mul64 y x)) 2694 // cond: 2695 // result: (Mul64 x (Add64 <t> y z)) 2696 for { 2697 t := v.Type 2698 _ = v.Args[1] 2699 v_0 := v.Args[0] 2700 if v_0.Op != OpMul64 { 2701 break 2702 } 2703 _ = v_0.Args[1] 2704 z := v_0.Args[0] 2705 x := v_0.Args[1] 2706 v_1 := v.Args[1] 2707 if v_1.Op != OpMul64 { 2708 break 2709 } 2710 _ = v_1.Args[1] 2711 y := v_1.Args[0] 2712 if x != v_1.Args[1] { 2713 break 2714 } 2715 v.reset(OpMul64) 2716 v.AddArg(x) 2717 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2718 v0.AddArg(y) 2719 v0.AddArg(z) 2720 v.AddArg(v0) 2721 return true 2722 } 2723 return false 2724 } 2725 func rewriteValuegeneric_OpAdd64_10(v *Value) bool { 2726 b := v.Block 2727 _ = b 2728 // match: (Add64 (Const64 [0]) x) 2729 // cond: 2730 // result: x 2731 for { 2732 _ = v.Args[1] 2733 v_0 := v.Args[0] 2734 if v_0.Op != OpConst64 { 2735 break 2736 } 2737 if v_0.AuxInt != 0 { 2738 break 2739 } 2740 x := v.Args[1] 2741 v.reset(OpCopy) 2742 v.Type = x.Type 2743 v.AddArg(x) 2744 return true 2745 } 2746 // match: (Add64 x (Const64 [0])) 2747 // cond: 2748 // result: x 2749 for { 2750 _ = v.Args[1] 2751 x := v.Args[0] 2752 v_1 := v.Args[1] 2753 if v_1.Op != OpConst64 { 2754 break 2755 } 2756 if v_1.AuxInt != 0 { 2757 break 2758 } 2759 v.reset(OpCopy) 2760 v.Type = x.Type 2761 v.AddArg(x) 2762 return true 2763 } 2764 // match: (Add64 (Const64 [1]) (Com64 x)) 2765 // cond: 2766 // result: (Neg64 x) 2767 for { 2768 _ = v.Args[1] 2769 v_0 := v.Args[0] 2770 if v_0.Op != OpConst64 { 2771 break 2772 } 2773 if v_0.AuxInt != 1 { 2774 break 2775 } 2776 v_1 := v.Args[1] 2777 if v_1.Op != OpCom64 { 2778 break 2779 } 2780 x := v_1.Args[0] 2781 v.reset(OpNeg64) 2782 v.AddArg(x) 2783 return true 2784 } 2785 // match: (Add64 (Com64 x) (Const64 [1])) 2786 // cond: 2787 // result: (Neg64 x) 2788 for { 2789 _ = v.Args[1] 2790 v_0 := v.Args[0] 2791 if v_0.Op != OpCom64 { 2792 break 2793 } 2794 x := v_0.Args[0] 2795 v_1 := v.Args[1] 2796 if v_1.Op != OpConst64 { 2797 break 2798 } 2799 if v_1.AuxInt != 1 { 2800 break 2801 } 2802 v.reset(OpNeg64) 2803 v.AddArg(x) 2804 return true 2805 } 2806 // match: (Add64 (Add64 i:(Const64 <t>) z) x) 2807 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2808 // result: (Add64 i (Add64 <t> z x)) 2809 for { 2810 _ = v.Args[1] 2811 v_0 := v.Args[0] 2812 if v_0.Op != OpAdd64 { 2813 break 2814 } 2815 _ = v_0.Args[1] 2816 i := v_0.Args[0] 2817 if i.Op != OpConst64 { 2818 break 2819 } 2820 t := i.Type 2821 z := v_0.Args[1] 2822 x := v.Args[1] 2823 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2824 break 2825 } 2826 v.reset(OpAdd64) 2827 v.AddArg(i) 2828 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2829 v0.AddArg(z) 2830 v0.AddArg(x) 2831 v.AddArg(v0) 2832 return true 2833 } 2834 // match: (Add64 (Add64 z i:(Const64 <t>)) x) 2835 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2836 // result: (Add64 i (Add64 <t> z x)) 2837 for { 2838 _ = v.Args[1] 2839 v_0 := v.Args[0] 2840 if v_0.Op != OpAdd64 { 2841 break 2842 } 2843 _ = v_0.Args[1] 2844 z := v_0.Args[0] 2845 i := v_0.Args[1] 2846 if i.Op != OpConst64 { 2847 break 2848 } 2849 t := i.Type 2850 x := v.Args[1] 2851 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2852 break 2853 } 2854 v.reset(OpAdd64) 2855 v.AddArg(i) 2856 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2857 v0.AddArg(z) 2858 v0.AddArg(x) 2859 v.AddArg(v0) 2860 return true 2861 } 2862 // match: (Add64 x (Add64 i:(Const64 <t>) z)) 2863 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2864 // result: (Add64 i (Add64 <t> z x)) 2865 for { 2866 _ = v.Args[1] 2867 x := v.Args[0] 2868 v_1 := v.Args[1] 2869 if v_1.Op != OpAdd64 { 2870 break 2871 } 2872 _ = v_1.Args[1] 2873 i := v_1.Args[0] 2874 if i.Op != OpConst64 { 2875 break 2876 } 2877 t := i.Type 2878 z := v_1.Args[1] 2879 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2880 break 2881 } 2882 v.reset(OpAdd64) 2883 v.AddArg(i) 2884 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2885 v0.AddArg(z) 2886 v0.AddArg(x) 2887 v.AddArg(v0) 2888 return true 2889 } 2890 // match: (Add64 x (Add64 z i:(Const64 <t>))) 2891 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2892 // result: (Add64 i (Add64 <t> z x)) 2893 for { 2894 _ = v.Args[1] 2895 x := v.Args[0] 2896 v_1 := v.Args[1] 2897 if v_1.Op != OpAdd64 { 2898 break 2899 } 2900 _ = v_1.Args[1] 2901 z := v_1.Args[0] 2902 i := v_1.Args[1] 2903 if i.Op != OpConst64 { 2904 break 2905 } 2906 t := i.Type 2907 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2908 break 2909 } 2910 v.reset(OpAdd64) 2911 v.AddArg(i) 2912 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2913 v0.AddArg(z) 2914 v0.AddArg(x) 2915 v.AddArg(v0) 2916 return true 2917 } 2918 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 2919 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2920 // result: (Add64 i (Sub64 <t> x z)) 2921 for { 2922 _ = v.Args[1] 2923 v_0 := v.Args[0] 2924 if v_0.Op != OpSub64 { 2925 break 2926 } 2927 _ = v_0.Args[1] 2928 i := v_0.Args[0] 2929 if i.Op != OpConst64 { 2930 break 2931 } 2932 t := i.Type 2933 z := v_0.Args[1] 2934 x := v.Args[1] 2935 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2936 break 2937 } 2938 v.reset(OpAdd64) 2939 v.AddArg(i) 2940 v0 := b.NewValue0(v.Pos, OpSub64, t) 2941 v0.AddArg(x) 2942 v0.AddArg(z) 2943 v.AddArg(v0) 2944 return true 2945 } 2946 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2947 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2948 // result: (Add64 i (Sub64 <t> x z)) 2949 for { 2950 _ = v.Args[1] 2951 x := v.Args[0] 2952 v_1 := v.Args[1] 2953 if v_1.Op != OpSub64 { 2954 break 2955 } 2956 _ = v_1.Args[1] 2957 i := v_1.Args[0] 2958 if i.Op != OpConst64 { 2959 break 2960 } 2961 t := i.Type 2962 z := v_1.Args[1] 2963 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2964 break 2965 } 2966 v.reset(OpAdd64) 2967 v.AddArg(i) 2968 v0 := b.NewValue0(v.Pos, OpSub64, t) 2969 v0.AddArg(x) 2970 v0.AddArg(z) 2971 v.AddArg(v0) 2972 return true 2973 } 2974 return false 2975 } 2976 func rewriteValuegeneric_OpAdd64_20(v *Value) bool { 2977 b := v.Block 2978 _ = b 2979 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2980 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2981 // result: (Add64 i (Sub64 <t> x z)) 2982 for { 2983 _ = v.Args[1] 2984 x := v.Args[0] 2985 v_1 := v.Args[1] 2986 if v_1.Op != OpSub64 { 2987 break 2988 } 2989 _ = v_1.Args[1] 2990 i := v_1.Args[0] 2991 if i.Op != OpConst64 { 2992 break 2993 } 2994 t := i.Type 2995 z := v_1.Args[1] 2996 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2997 break 2998 } 2999 v.reset(OpAdd64) 3000 v.AddArg(i) 3001 v0 := b.NewValue0(v.Pos, OpSub64, t) 3002 v0.AddArg(x) 3003 v0.AddArg(z) 3004 v.AddArg(v0) 3005 return true 3006 } 3007 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 3008 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3009 // result: (Add64 i (Sub64 <t> x z)) 3010 for { 3011 _ = v.Args[1] 3012 v_0 := v.Args[0] 3013 if v_0.Op != OpSub64 { 3014 break 3015 } 3016 _ = v_0.Args[1] 3017 i := v_0.Args[0] 3018 if i.Op != OpConst64 { 3019 break 3020 } 3021 t := i.Type 3022 z := v_0.Args[1] 3023 x := v.Args[1] 3024 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3025 break 3026 } 3027 v.reset(OpAdd64) 3028 v.AddArg(i) 3029 v0 := b.NewValue0(v.Pos, OpSub64, t) 3030 v0.AddArg(x) 3031 v0.AddArg(z) 3032 v.AddArg(v0) 3033 return true 3034 } 3035 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 3036 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3037 // result: (Sub64 (Add64 <t> x z) i) 3038 for { 3039 _ = v.Args[1] 3040 v_0 := v.Args[0] 3041 if v_0.Op != OpSub64 { 3042 break 3043 } 3044 _ = v_0.Args[1] 3045 z := v_0.Args[0] 3046 i := v_0.Args[1] 3047 if i.Op != OpConst64 { 3048 break 3049 } 3050 t := i.Type 3051 x := v.Args[1] 3052 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3053 break 3054 } 3055 v.reset(OpSub64) 3056 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3057 v0.AddArg(x) 3058 v0.AddArg(z) 3059 v.AddArg(v0) 3060 v.AddArg(i) 3061 return true 3062 } 3063 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 3064 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3065 // result: (Sub64 (Add64 <t> x z) i) 3066 for { 3067 _ = v.Args[1] 3068 x := v.Args[0] 3069 v_1 := v.Args[1] 3070 if v_1.Op != OpSub64 { 3071 break 3072 } 3073 _ = v_1.Args[1] 3074 z := v_1.Args[0] 3075 i := v_1.Args[1] 3076 if i.Op != OpConst64 { 3077 break 3078 } 3079 t := i.Type 3080 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3081 break 3082 } 3083 v.reset(OpSub64) 3084 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3085 v0.AddArg(x) 3086 v0.AddArg(z) 3087 v.AddArg(v0) 3088 v.AddArg(i) 3089 return true 3090 } 3091 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 3092 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3093 // result: (Sub64 (Add64 <t> x z) i) 3094 for { 3095 _ = v.Args[1] 3096 x := v.Args[0] 3097 v_1 := v.Args[1] 3098 if v_1.Op != OpSub64 { 3099 break 3100 } 3101 _ = v_1.Args[1] 3102 z := v_1.Args[0] 3103 i := v_1.Args[1] 3104 if i.Op != OpConst64 { 3105 break 3106 } 3107 t := i.Type 3108 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3109 break 3110 } 3111 v.reset(OpSub64) 3112 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3113 v0.AddArg(x) 3114 v0.AddArg(z) 3115 v.AddArg(v0) 3116 v.AddArg(i) 3117 return true 3118 } 3119 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 3120 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3121 // result: (Sub64 (Add64 <t> x z) i) 3122 for { 3123 _ = v.Args[1] 3124 v_0 := v.Args[0] 3125 if v_0.Op != OpSub64 { 3126 break 3127 } 3128 _ = v_0.Args[1] 3129 z := v_0.Args[0] 3130 i := v_0.Args[1] 3131 if i.Op != OpConst64 { 3132 break 3133 } 3134 t := i.Type 3135 x := v.Args[1] 3136 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3137 break 3138 } 3139 v.reset(OpSub64) 3140 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3141 v0.AddArg(x) 3142 v0.AddArg(z) 3143 v.AddArg(v0) 3144 v.AddArg(i) 3145 return true 3146 } 3147 // match: (Add64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 3148 // cond: 3149 // result: (Add64 (Const64 <t> [c+d]) x) 3150 for { 3151 _ = v.Args[1] 3152 v_0 := v.Args[0] 3153 if v_0.Op != OpConst64 { 3154 break 3155 } 3156 t := v_0.Type 3157 c := v_0.AuxInt 3158 v_1 := v.Args[1] 3159 if v_1.Op != OpAdd64 { 3160 break 3161 } 3162 _ = v_1.Args[1] 3163 v_1_0 := v_1.Args[0] 3164 if v_1_0.Op != OpConst64 { 3165 break 3166 } 3167 if v_1_0.Type != t { 3168 break 3169 } 3170 d := v_1_0.AuxInt 3171 x := v_1.Args[1] 3172 v.reset(OpAdd64) 3173 v0 := b.NewValue0(v.Pos, OpConst64, t) 3174 v0.AuxInt = c + d 3175 v.AddArg(v0) 3176 v.AddArg(x) 3177 return true 3178 } 3179 // match: (Add64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 3180 // cond: 3181 // result: (Add64 (Const64 <t> [c+d]) x) 3182 for { 3183 _ = v.Args[1] 3184 v_0 := v.Args[0] 3185 if v_0.Op != OpConst64 { 3186 break 3187 } 3188 t := v_0.Type 3189 c := v_0.AuxInt 3190 v_1 := v.Args[1] 3191 if v_1.Op != OpAdd64 { 3192 break 3193 } 3194 _ = v_1.Args[1] 3195 x := v_1.Args[0] 3196 v_1_1 := v_1.Args[1] 3197 if v_1_1.Op != OpConst64 { 3198 break 3199 } 3200 if v_1_1.Type != t { 3201 break 3202 } 3203 d := v_1_1.AuxInt 3204 v.reset(OpAdd64) 3205 v0 := b.NewValue0(v.Pos, OpConst64, t) 3206 v0.AuxInt = c + d 3207 v.AddArg(v0) 3208 v.AddArg(x) 3209 return true 3210 } 3211 // match: (Add64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 3212 // cond: 3213 // result: (Add64 (Const64 <t> [c+d]) x) 3214 for { 3215 _ = v.Args[1] 3216 v_0 := v.Args[0] 3217 if v_0.Op != OpAdd64 { 3218 break 3219 } 3220 _ = v_0.Args[1] 3221 v_0_0 := v_0.Args[0] 3222 if v_0_0.Op != OpConst64 { 3223 break 3224 } 3225 t := v_0_0.Type 3226 d := v_0_0.AuxInt 3227 x := v_0.Args[1] 3228 v_1 := v.Args[1] 3229 if v_1.Op != OpConst64 { 3230 break 3231 } 3232 if v_1.Type != t { 3233 break 3234 } 3235 c := v_1.AuxInt 3236 v.reset(OpAdd64) 3237 v0 := b.NewValue0(v.Pos, OpConst64, t) 3238 v0.AuxInt = c + d 3239 v.AddArg(v0) 3240 v.AddArg(x) 3241 return true 3242 } 3243 // match: (Add64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 3244 // cond: 3245 // result: (Add64 (Const64 <t> [c+d]) x) 3246 for { 3247 _ = v.Args[1] 3248 v_0 := v.Args[0] 3249 if v_0.Op != OpAdd64 { 3250 break 3251 } 3252 _ = v_0.Args[1] 3253 x := v_0.Args[0] 3254 v_0_1 := v_0.Args[1] 3255 if v_0_1.Op != OpConst64 { 3256 break 3257 } 3258 t := v_0_1.Type 3259 d := v_0_1.AuxInt 3260 v_1 := v.Args[1] 3261 if v_1.Op != OpConst64 { 3262 break 3263 } 3264 if v_1.Type != t { 3265 break 3266 } 3267 c := v_1.AuxInt 3268 v.reset(OpAdd64) 3269 v0 := b.NewValue0(v.Pos, OpConst64, t) 3270 v0.AuxInt = c + d 3271 v.AddArg(v0) 3272 v.AddArg(x) 3273 return true 3274 } 3275 return false 3276 } 3277 func rewriteValuegeneric_OpAdd64_30(v *Value) bool { 3278 b := v.Block 3279 _ = b 3280 // match: (Add64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 3281 // cond: 3282 // result: (Sub64 (Const64 <t> [c+d]) x) 3283 for { 3284 _ = v.Args[1] 3285 v_0 := v.Args[0] 3286 if v_0.Op != OpConst64 { 3287 break 3288 } 3289 t := v_0.Type 3290 c := v_0.AuxInt 3291 v_1 := v.Args[1] 3292 if v_1.Op != OpSub64 { 3293 break 3294 } 3295 _ = v_1.Args[1] 3296 v_1_0 := v_1.Args[0] 3297 if v_1_0.Op != OpConst64 { 3298 break 3299 } 3300 if v_1_0.Type != t { 3301 break 3302 } 3303 d := v_1_0.AuxInt 3304 x := v_1.Args[1] 3305 v.reset(OpSub64) 3306 v0 := b.NewValue0(v.Pos, OpConst64, t) 3307 v0.AuxInt = c + d 3308 v.AddArg(v0) 3309 v.AddArg(x) 3310 return true 3311 } 3312 // match: (Add64 (Sub64 (Const64 <t> [d]) x) (Const64 <t> [c])) 3313 // cond: 3314 // result: (Sub64 (Const64 <t> [c+d]) x) 3315 for { 3316 _ = v.Args[1] 3317 v_0 := v.Args[0] 3318 if v_0.Op != OpSub64 { 3319 break 3320 } 3321 _ = v_0.Args[1] 3322 v_0_0 := v_0.Args[0] 3323 if v_0_0.Op != OpConst64 { 3324 break 3325 } 3326 t := v_0_0.Type 3327 d := v_0_0.AuxInt 3328 x := v_0.Args[1] 3329 v_1 := v.Args[1] 3330 if v_1.Op != OpConst64 { 3331 break 3332 } 3333 if v_1.Type != t { 3334 break 3335 } 3336 c := v_1.AuxInt 3337 v.reset(OpSub64) 3338 v0 := b.NewValue0(v.Pos, OpConst64, t) 3339 v0.AuxInt = c + d 3340 v.AddArg(v0) 3341 v.AddArg(x) 3342 return true 3343 } 3344 // match: (Add64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 3345 // cond: 3346 // result: (Add64 (Const64 <t> [c-d]) x) 3347 for { 3348 _ = v.Args[1] 3349 v_0 := v.Args[0] 3350 if v_0.Op != OpConst64 { 3351 break 3352 } 3353 t := v_0.Type 3354 c := v_0.AuxInt 3355 v_1 := v.Args[1] 3356 if v_1.Op != OpSub64 { 3357 break 3358 } 3359 _ = v_1.Args[1] 3360 x := v_1.Args[0] 3361 v_1_1 := v_1.Args[1] 3362 if v_1_1.Op != OpConst64 { 3363 break 3364 } 3365 if v_1_1.Type != t { 3366 break 3367 } 3368 d := v_1_1.AuxInt 3369 v.reset(OpAdd64) 3370 v0 := b.NewValue0(v.Pos, OpConst64, t) 3371 v0.AuxInt = c - d 3372 v.AddArg(v0) 3373 v.AddArg(x) 3374 return true 3375 } 3376 // match: (Add64 (Sub64 x (Const64 <t> [d])) (Const64 <t> [c])) 3377 // cond: 3378 // result: (Add64 (Const64 <t> [c-d]) x) 3379 for { 3380 _ = v.Args[1] 3381 v_0 := v.Args[0] 3382 if v_0.Op != OpSub64 { 3383 break 3384 } 3385 _ = v_0.Args[1] 3386 x := v_0.Args[0] 3387 v_0_1 := v_0.Args[1] 3388 if v_0_1.Op != OpConst64 { 3389 break 3390 } 3391 t := v_0_1.Type 3392 d := v_0_1.AuxInt 3393 v_1 := v.Args[1] 3394 if v_1.Op != OpConst64 { 3395 break 3396 } 3397 if v_1.Type != t { 3398 break 3399 } 3400 c := v_1.AuxInt 3401 v.reset(OpAdd64) 3402 v0 := b.NewValue0(v.Pos, OpConst64, t) 3403 v0.AuxInt = c - d 3404 v.AddArg(v0) 3405 v.AddArg(x) 3406 return true 3407 } 3408 return false 3409 } 3410 func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { 3411 // match: (Add64F (Const64F [c]) (Const64F [d])) 3412 // cond: 3413 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 3414 for { 3415 _ = v.Args[1] 3416 v_0 := v.Args[0] 3417 if v_0.Op != OpConst64F { 3418 break 3419 } 3420 c := v_0.AuxInt 3421 v_1 := v.Args[1] 3422 if v_1.Op != OpConst64F { 3423 break 3424 } 3425 d := v_1.AuxInt 3426 v.reset(OpConst64F) 3427 v.AuxInt = f2i(i2f(c) + i2f(d)) 3428 return true 3429 } 3430 // match: (Add64F (Const64F [d]) (Const64F [c])) 3431 // cond: 3432 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 3433 for { 3434 _ = v.Args[1] 3435 v_0 := v.Args[0] 3436 if v_0.Op != OpConst64F { 3437 break 3438 } 3439 d := v_0.AuxInt 3440 v_1 := v.Args[1] 3441 if v_1.Op != OpConst64F { 3442 break 3443 } 3444 c := v_1.AuxInt 3445 v.reset(OpConst64F) 3446 v.AuxInt = f2i(i2f(c) + i2f(d)) 3447 return true 3448 } 3449 // match: (Add64F x (Const64F [0])) 3450 // cond: 3451 // result: x 3452 for { 3453 _ = v.Args[1] 3454 x := v.Args[0] 3455 v_1 := v.Args[1] 3456 if v_1.Op != OpConst64F { 3457 break 3458 } 3459 if v_1.AuxInt != 0 { 3460 break 3461 } 3462 v.reset(OpCopy) 3463 v.Type = x.Type 3464 v.AddArg(x) 3465 return true 3466 } 3467 // match: (Add64F (Const64F [0]) x) 3468 // cond: 3469 // result: x 3470 for { 3471 _ = v.Args[1] 3472 v_0 := v.Args[0] 3473 if v_0.Op != OpConst64F { 3474 break 3475 } 3476 if v_0.AuxInt != 0 { 3477 break 3478 } 3479 x := v.Args[1] 3480 v.reset(OpCopy) 3481 v.Type = x.Type 3482 v.AddArg(x) 3483 return true 3484 } 3485 return false 3486 } 3487 func rewriteValuegeneric_OpAdd8_0(v *Value) bool { 3488 b := v.Block 3489 _ = b 3490 // match: (Add8 (Const8 [c]) (Const8 [d])) 3491 // cond: 3492 // result: (Const8 [int64(int8(c+d))]) 3493 for { 3494 _ = v.Args[1] 3495 v_0 := v.Args[0] 3496 if v_0.Op != OpConst8 { 3497 break 3498 } 3499 c := v_0.AuxInt 3500 v_1 := v.Args[1] 3501 if v_1.Op != OpConst8 { 3502 break 3503 } 3504 d := v_1.AuxInt 3505 v.reset(OpConst8) 3506 v.AuxInt = int64(int8(c + d)) 3507 return true 3508 } 3509 // match: (Add8 (Const8 [d]) (Const8 [c])) 3510 // cond: 3511 // result: (Const8 [int64(int8(c+d))]) 3512 for { 3513 _ = v.Args[1] 3514 v_0 := v.Args[0] 3515 if v_0.Op != OpConst8 { 3516 break 3517 } 3518 d := v_0.AuxInt 3519 v_1 := v.Args[1] 3520 if v_1.Op != OpConst8 { 3521 break 3522 } 3523 c := v_1.AuxInt 3524 v.reset(OpConst8) 3525 v.AuxInt = int64(int8(c + d)) 3526 return true 3527 } 3528 // match: (Add8 <t> (Mul8 x y) (Mul8 x z)) 3529 // cond: 3530 // result: (Mul8 x (Add8 <t> y z)) 3531 for { 3532 t := v.Type 3533 _ = v.Args[1] 3534 v_0 := v.Args[0] 3535 if v_0.Op != OpMul8 { 3536 break 3537 } 3538 _ = v_0.Args[1] 3539 x := v_0.Args[0] 3540 y := v_0.Args[1] 3541 v_1 := v.Args[1] 3542 if v_1.Op != OpMul8 { 3543 break 3544 } 3545 _ = v_1.Args[1] 3546 if x != v_1.Args[0] { 3547 break 3548 } 3549 z := v_1.Args[1] 3550 v.reset(OpMul8) 3551 v.AddArg(x) 3552 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3553 v0.AddArg(y) 3554 v0.AddArg(z) 3555 v.AddArg(v0) 3556 return true 3557 } 3558 // match: (Add8 <t> (Mul8 y x) (Mul8 x z)) 3559 // cond: 3560 // result: (Mul8 x (Add8 <t> y z)) 3561 for { 3562 t := v.Type 3563 _ = v.Args[1] 3564 v_0 := v.Args[0] 3565 if v_0.Op != OpMul8 { 3566 break 3567 } 3568 _ = v_0.Args[1] 3569 y := v_0.Args[0] 3570 x := v_0.Args[1] 3571 v_1 := v.Args[1] 3572 if v_1.Op != OpMul8 { 3573 break 3574 } 3575 _ = v_1.Args[1] 3576 if x != v_1.Args[0] { 3577 break 3578 } 3579 z := v_1.Args[1] 3580 v.reset(OpMul8) 3581 v.AddArg(x) 3582 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3583 v0.AddArg(y) 3584 v0.AddArg(z) 3585 v.AddArg(v0) 3586 return true 3587 } 3588 // match: (Add8 <t> (Mul8 x y) (Mul8 z x)) 3589 // cond: 3590 // result: (Mul8 x (Add8 <t> y z)) 3591 for { 3592 t := v.Type 3593 _ = v.Args[1] 3594 v_0 := v.Args[0] 3595 if v_0.Op != OpMul8 { 3596 break 3597 } 3598 _ = v_0.Args[1] 3599 x := v_0.Args[0] 3600 y := v_0.Args[1] 3601 v_1 := v.Args[1] 3602 if v_1.Op != OpMul8 { 3603 break 3604 } 3605 _ = v_1.Args[1] 3606 z := v_1.Args[0] 3607 if x != v_1.Args[1] { 3608 break 3609 } 3610 v.reset(OpMul8) 3611 v.AddArg(x) 3612 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3613 v0.AddArg(y) 3614 v0.AddArg(z) 3615 v.AddArg(v0) 3616 return true 3617 } 3618 // match: (Add8 <t> (Mul8 y x) (Mul8 z x)) 3619 // cond: 3620 // result: (Mul8 x (Add8 <t> y z)) 3621 for { 3622 t := v.Type 3623 _ = v.Args[1] 3624 v_0 := v.Args[0] 3625 if v_0.Op != OpMul8 { 3626 break 3627 } 3628 _ = v_0.Args[1] 3629 y := v_0.Args[0] 3630 x := v_0.Args[1] 3631 v_1 := v.Args[1] 3632 if v_1.Op != OpMul8 { 3633 break 3634 } 3635 _ = v_1.Args[1] 3636 z := v_1.Args[0] 3637 if x != v_1.Args[1] { 3638 break 3639 } 3640 v.reset(OpMul8) 3641 v.AddArg(x) 3642 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3643 v0.AddArg(y) 3644 v0.AddArg(z) 3645 v.AddArg(v0) 3646 return true 3647 } 3648 // match: (Add8 <t> (Mul8 x z) (Mul8 x y)) 3649 // cond: 3650 // result: (Mul8 x (Add8 <t> y z)) 3651 for { 3652 t := v.Type 3653 _ = v.Args[1] 3654 v_0 := v.Args[0] 3655 if v_0.Op != OpMul8 { 3656 break 3657 } 3658 _ = v_0.Args[1] 3659 x := v_0.Args[0] 3660 z := v_0.Args[1] 3661 v_1 := v.Args[1] 3662 if v_1.Op != OpMul8 { 3663 break 3664 } 3665 _ = v_1.Args[1] 3666 if x != v_1.Args[0] { 3667 break 3668 } 3669 y := v_1.Args[1] 3670 v.reset(OpMul8) 3671 v.AddArg(x) 3672 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3673 v0.AddArg(y) 3674 v0.AddArg(z) 3675 v.AddArg(v0) 3676 return true 3677 } 3678 // match: (Add8 <t> (Mul8 z x) (Mul8 x y)) 3679 // cond: 3680 // result: (Mul8 x (Add8 <t> y z)) 3681 for { 3682 t := v.Type 3683 _ = v.Args[1] 3684 v_0 := v.Args[0] 3685 if v_0.Op != OpMul8 { 3686 break 3687 } 3688 _ = v_0.Args[1] 3689 z := v_0.Args[0] 3690 x := v_0.Args[1] 3691 v_1 := v.Args[1] 3692 if v_1.Op != OpMul8 { 3693 break 3694 } 3695 _ = v_1.Args[1] 3696 if x != v_1.Args[0] { 3697 break 3698 } 3699 y := v_1.Args[1] 3700 v.reset(OpMul8) 3701 v.AddArg(x) 3702 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3703 v0.AddArg(y) 3704 v0.AddArg(z) 3705 v.AddArg(v0) 3706 return true 3707 } 3708 // match: (Add8 <t> (Mul8 x z) (Mul8 y x)) 3709 // cond: 3710 // result: (Mul8 x (Add8 <t> y z)) 3711 for { 3712 t := v.Type 3713 _ = v.Args[1] 3714 v_0 := v.Args[0] 3715 if v_0.Op != OpMul8 { 3716 break 3717 } 3718 _ = v_0.Args[1] 3719 x := v_0.Args[0] 3720 z := v_0.Args[1] 3721 v_1 := v.Args[1] 3722 if v_1.Op != OpMul8 { 3723 break 3724 } 3725 _ = v_1.Args[1] 3726 y := v_1.Args[0] 3727 if x != v_1.Args[1] { 3728 break 3729 } 3730 v.reset(OpMul8) 3731 v.AddArg(x) 3732 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3733 v0.AddArg(y) 3734 v0.AddArg(z) 3735 v.AddArg(v0) 3736 return true 3737 } 3738 // match: (Add8 <t> (Mul8 z x) (Mul8 y x)) 3739 // cond: 3740 // result: (Mul8 x (Add8 <t> y z)) 3741 for { 3742 t := v.Type 3743 _ = v.Args[1] 3744 v_0 := v.Args[0] 3745 if v_0.Op != OpMul8 { 3746 break 3747 } 3748 _ = v_0.Args[1] 3749 z := v_0.Args[0] 3750 x := v_0.Args[1] 3751 v_1 := v.Args[1] 3752 if v_1.Op != OpMul8 { 3753 break 3754 } 3755 _ = v_1.Args[1] 3756 y := v_1.Args[0] 3757 if x != v_1.Args[1] { 3758 break 3759 } 3760 v.reset(OpMul8) 3761 v.AddArg(x) 3762 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3763 v0.AddArg(y) 3764 v0.AddArg(z) 3765 v.AddArg(v0) 3766 return true 3767 } 3768 return false 3769 } 3770 func rewriteValuegeneric_OpAdd8_10(v *Value) bool { 3771 b := v.Block 3772 _ = b 3773 // match: (Add8 (Const8 [0]) x) 3774 // cond: 3775 // result: x 3776 for { 3777 _ = v.Args[1] 3778 v_0 := v.Args[0] 3779 if v_0.Op != OpConst8 { 3780 break 3781 } 3782 if v_0.AuxInt != 0 { 3783 break 3784 } 3785 x := v.Args[1] 3786 v.reset(OpCopy) 3787 v.Type = x.Type 3788 v.AddArg(x) 3789 return true 3790 } 3791 // match: (Add8 x (Const8 [0])) 3792 // cond: 3793 // result: x 3794 for { 3795 _ = v.Args[1] 3796 x := v.Args[0] 3797 v_1 := v.Args[1] 3798 if v_1.Op != OpConst8 { 3799 break 3800 } 3801 if v_1.AuxInt != 0 { 3802 break 3803 } 3804 v.reset(OpCopy) 3805 v.Type = x.Type 3806 v.AddArg(x) 3807 return true 3808 } 3809 // match: (Add8 (Const8 [1]) (Com8 x)) 3810 // cond: 3811 // result: (Neg8 x) 3812 for { 3813 _ = v.Args[1] 3814 v_0 := v.Args[0] 3815 if v_0.Op != OpConst8 { 3816 break 3817 } 3818 if v_0.AuxInt != 1 { 3819 break 3820 } 3821 v_1 := v.Args[1] 3822 if v_1.Op != OpCom8 { 3823 break 3824 } 3825 x := v_1.Args[0] 3826 v.reset(OpNeg8) 3827 v.AddArg(x) 3828 return true 3829 } 3830 // match: (Add8 (Com8 x) (Const8 [1])) 3831 // cond: 3832 // result: (Neg8 x) 3833 for { 3834 _ = v.Args[1] 3835 v_0 := v.Args[0] 3836 if v_0.Op != OpCom8 { 3837 break 3838 } 3839 x := v_0.Args[0] 3840 v_1 := v.Args[1] 3841 if v_1.Op != OpConst8 { 3842 break 3843 } 3844 if v_1.AuxInt != 1 { 3845 break 3846 } 3847 v.reset(OpNeg8) 3848 v.AddArg(x) 3849 return true 3850 } 3851 // match: (Add8 (Add8 i:(Const8 <t>) z) x) 3852 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3853 // result: (Add8 i (Add8 <t> z x)) 3854 for { 3855 _ = v.Args[1] 3856 v_0 := v.Args[0] 3857 if v_0.Op != OpAdd8 { 3858 break 3859 } 3860 _ = v_0.Args[1] 3861 i := v_0.Args[0] 3862 if i.Op != OpConst8 { 3863 break 3864 } 3865 t := i.Type 3866 z := v_0.Args[1] 3867 x := v.Args[1] 3868 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3869 break 3870 } 3871 v.reset(OpAdd8) 3872 v.AddArg(i) 3873 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3874 v0.AddArg(z) 3875 v0.AddArg(x) 3876 v.AddArg(v0) 3877 return true 3878 } 3879 // match: (Add8 (Add8 z i:(Const8 <t>)) x) 3880 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3881 // result: (Add8 i (Add8 <t> z x)) 3882 for { 3883 _ = v.Args[1] 3884 v_0 := v.Args[0] 3885 if v_0.Op != OpAdd8 { 3886 break 3887 } 3888 _ = v_0.Args[1] 3889 z := v_0.Args[0] 3890 i := v_0.Args[1] 3891 if i.Op != OpConst8 { 3892 break 3893 } 3894 t := i.Type 3895 x := v.Args[1] 3896 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3897 break 3898 } 3899 v.reset(OpAdd8) 3900 v.AddArg(i) 3901 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3902 v0.AddArg(z) 3903 v0.AddArg(x) 3904 v.AddArg(v0) 3905 return true 3906 } 3907 // match: (Add8 x (Add8 i:(Const8 <t>) z)) 3908 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3909 // result: (Add8 i (Add8 <t> z x)) 3910 for { 3911 _ = v.Args[1] 3912 x := v.Args[0] 3913 v_1 := v.Args[1] 3914 if v_1.Op != OpAdd8 { 3915 break 3916 } 3917 _ = v_1.Args[1] 3918 i := v_1.Args[0] 3919 if i.Op != OpConst8 { 3920 break 3921 } 3922 t := i.Type 3923 z := v_1.Args[1] 3924 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3925 break 3926 } 3927 v.reset(OpAdd8) 3928 v.AddArg(i) 3929 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3930 v0.AddArg(z) 3931 v0.AddArg(x) 3932 v.AddArg(v0) 3933 return true 3934 } 3935 // match: (Add8 x (Add8 z i:(Const8 <t>))) 3936 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3937 // result: (Add8 i (Add8 <t> z x)) 3938 for { 3939 _ = v.Args[1] 3940 x := v.Args[0] 3941 v_1 := v.Args[1] 3942 if v_1.Op != OpAdd8 { 3943 break 3944 } 3945 _ = v_1.Args[1] 3946 z := v_1.Args[0] 3947 i := v_1.Args[1] 3948 if i.Op != OpConst8 { 3949 break 3950 } 3951 t := i.Type 3952 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3953 break 3954 } 3955 v.reset(OpAdd8) 3956 v.AddArg(i) 3957 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3958 v0.AddArg(z) 3959 v0.AddArg(x) 3960 v.AddArg(v0) 3961 return true 3962 } 3963 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 3964 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3965 // result: (Add8 i (Sub8 <t> x z)) 3966 for { 3967 _ = v.Args[1] 3968 v_0 := v.Args[0] 3969 if v_0.Op != OpSub8 { 3970 break 3971 } 3972 _ = v_0.Args[1] 3973 i := v_0.Args[0] 3974 if i.Op != OpConst8 { 3975 break 3976 } 3977 t := i.Type 3978 z := v_0.Args[1] 3979 x := v.Args[1] 3980 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3981 break 3982 } 3983 v.reset(OpAdd8) 3984 v.AddArg(i) 3985 v0 := b.NewValue0(v.Pos, OpSub8, t) 3986 v0.AddArg(x) 3987 v0.AddArg(z) 3988 v.AddArg(v0) 3989 return true 3990 } 3991 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 3992 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3993 // result: (Add8 i (Sub8 <t> x z)) 3994 for { 3995 _ = v.Args[1] 3996 x := v.Args[0] 3997 v_1 := v.Args[1] 3998 if v_1.Op != OpSub8 { 3999 break 4000 } 4001 _ = v_1.Args[1] 4002 i := v_1.Args[0] 4003 if i.Op != OpConst8 { 4004 break 4005 } 4006 t := i.Type 4007 z := v_1.Args[1] 4008 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4009 break 4010 } 4011 v.reset(OpAdd8) 4012 v.AddArg(i) 4013 v0 := b.NewValue0(v.Pos, OpSub8, t) 4014 v0.AddArg(x) 4015 v0.AddArg(z) 4016 v.AddArg(v0) 4017 return true 4018 } 4019 return false 4020 } 4021 func rewriteValuegeneric_OpAdd8_20(v *Value) bool { 4022 b := v.Block 4023 _ = b 4024 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 4025 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4026 // result: (Add8 i (Sub8 <t> x z)) 4027 for { 4028 _ = v.Args[1] 4029 x := v.Args[0] 4030 v_1 := v.Args[1] 4031 if v_1.Op != OpSub8 { 4032 break 4033 } 4034 _ = v_1.Args[1] 4035 i := v_1.Args[0] 4036 if i.Op != OpConst8 { 4037 break 4038 } 4039 t := i.Type 4040 z := v_1.Args[1] 4041 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4042 break 4043 } 4044 v.reset(OpAdd8) 4045 v.AddArg(i) 4046 v0 := b.NewValue0(v.Pos, OpSub8, t) 4047 v0.AddArg(x) 4048 v0.AddArg(z) 4049 v.AddArg(v0) 4050 return true 4051 } 4052 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 4053 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4054 // result: (Add8 i (Sub8 <t> x z)) 4055 for { 4056 _ = v.Args[1] 4057 v_0 := v.Args[0] 4058 if v_0.Op != OpSub8 { 4059 break 4060 } 4061 _ = v_0.Args[1] 4062 i := v_0.Args[0] 4063 if i.Op != OpConst8 { 4064 break 4065 } 4066 t := i.Type 4067 z := v_0.Args[1] 4068 x := v.Args[1] 4069 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4070 break 4071 } 4072 v.reset(OpAdd8) 4073 v.AddArg(i) 4074 v0 := b.NewValue0(v.Pos, OpSub8, t) 4075 v0.AddArg(x) 4076 v0.AddArg(z) 4077 v.AddArg(v0) 4078 return true 4079 } 4080 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 4081 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4082 // result: (Sub8 (Add8 <t> x z) i) 4083 for { 4084 _ = v.Args[1] 4085 v_0 := v.Args[0] 4086 if v_0.Op != OpSub8 { 4087 break 4088 } 4089 _ = v_0.Args[1] 4090 z := v_0.Args[0] 4091 i := v_0.Args[1] 4092 if i.Op != OpConst8 { 4093 break 4094 } 4095 t := i.Type 4096 x := v.Args[1] 4097 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4098 break 4099 } 4100 v.reset(OpSub8) 4101 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4102 v0.AddArg(x) 4103 v0.AddArg(z) 4104 v.AddArg(v0) 4105 v.AddArg(i) 4106 return true 4107 } 4108 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 4109 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4110 // result: (Sub8 (Add8 <t> x z) i) 4111 for { 4112 _ = v.Args[1] 4113 x := v.Args[0] 4114 v_1 := v.Args[1] 4115 if v_1.Op != OpSub8 { 4116 break 4117 } 4118 _ = v_1.Args[1] 4119 z := v_1.Args[0] 4120 i := v_1.Args[1] 4121 if i.Op != OpConst8 { 4122 break 4123 } 4124 t := i.Type 4125 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4126 break 4127 } 4128 v.reset(OpSub8) 4129 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4130 v0.AddArg(x) 4131 v0.AddArg(z) 4132 v.AddArg(v0) 4133 v.AddArg(i) 4134 return true 4135 } 4136 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 4137 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4138 // result: (Sub8 (Add8 <t> x z) i) 4139 for { 4140 _ = v.Args[1] 4141 x := v.Args[0] 4142 v_1 := v.Args[1] 4143 if v_1.Op != OpSub8 { 4144 break 4145 } 4146 _ = v_1.Args[1] 4147 z := v_1.Args[0] 4148 i := v_1.Args[1] 4149 if i.Op != OpConst8 { 4150 break 4151 } 4152 t := i.Type 4153 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4154 break 4155 } 4156 v.reset(OpSub8) 4157 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4158 v0.AddArg(x) 4159 v0.AddArg(z) 4160 v.AddArg(v0) 4161 v.AddArg(i) 4162 return true 4163 } 4164 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 4165 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4166 // result: (Sub8 (Add8 <t> x z) i) 4167 for { 4168 _ = v.Args[1] 4169 v_0 := v.Args[0] 4170 if v_0.Op != OpSub8 { 4171 break 4172 } 4173 _ = v_0.Args[1] 4174 z := v_0.Args[0] 4175 i := v_0.Args[1] 4176 if i.Op != OpConst8 { 4177 break 4178 } 4179 t := i.Type 4180 x := v.Args[1] 4181 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4182 break 4183 } 4184 v.reset(OpSub8) 4185 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4186 v0.AddArg(x) 4187 v0.AddArg(z) 4188 v.AddArg(v0) 4189 v.AddArg(i) 4190 return true 4191 } 4192 // match: (Add8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 4193 // cond: 4194 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4195 for { 4196 _ = v.Args[1] 4197 v_0 := v.Args[0] 4198 if v_0.Op != OpConst8 { 4199 break 4200 } 4201 t := v_0.Type 4202 c := v_0.AuxInt 4203 v_1 := v.Args[1] 4204 if v_1.Op != OpAdd8 { 4205 break 4206 } 4207 _ = v_1.Args[1] 4208 v_1_0 := v_1.Args[0] 4209 if v_1_0.Op != OpConst8 { 4210 break 4211 } 4212 if v_1_0.Type != t { 4213 break 4214 } 4215 d := v_1_0.AuxInt 4216 x := v_1.Args[1] 4217 v.reset(OpAdd8) 4218 v0 := b.NewValue0(v.Pos, OpConst8, t) 4219 v0.AuxInt = int64(int8(c + d)) 4220 v.AddArg(v0) 4221 v.AddArg(x) 4222 return true 4223 } 4224 // match: (Add8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 4225 // cond: 4226 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4227 for { 4228 _ = v.Args[1] 4229 v_0 := v.Args[0] 4230 if v_0.Op != OpConst8 { 4231 break 4232 } 4233 t := v_0.Type 4234 c := v_0.AuxInt 4235 v_1 := v.Args[1] 4236 if v_1.Op != OpAdd8 { 4237 break 4238 } 4239 _ = v_1.Args[1] 4240 x := v_1.Args[0] 4241 v_1_1 := v_1.Args[1] 4242 if v_1_1.Op != OpConst8 { 4243 break 4244 } 4245 if v_1_1.Type != t { 4246 break 4247 } 4248 d := v_1_1.AuxInt 4249 v.reset(OpAdd8) 4250 v0 := b.NewValue0(v.Pos, OpConst8, t) 4251 v0.AuxInt = int64(int8(c + d)) 4252 v.AddArg(v0) 4253 v.AddArg(x) 4254 return true 4255 } 4256 // match: (Add8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 4257 // cond: 4258 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4259 for { 4260 _ = v.Args[1] 4261 v_0 := v.Args[0] 4262 if v_0.Op != OpAdd8 { 4263 break 4264 } 4265 _ = v_0.Args[1] 4266 v_0_0 := v_0.Args[0] 4267 if v_0_0.Op != OpConst8 { 4268 break 4269 } 4270 t := v_0_0.Type 4271 d := v_0_0.AuxInt 4272 x := v_0.Args[1] 4273 v_1 := v.Args[1] 4274 if v_1.Op != OpConst8 { 4275 break 4276 } 4277 if v_1.Type != t { 4278 break 4279 } 4280 c := v_1.AuxInt 4281 v.reset(OpAdd8) 4282 v0 := b.NewValue0(v.Pos, OpConst8, t) 4283 v0.AuxInt = int64(int8(c + d)) 4284 v.AddArg(v0) 4285 v.AddArg(x) 4286 return true 4287 } 4288 // match: (Add8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 4289 // cond: 4290 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4291 for { 4292 _ = v.Args[1] 4293 v_0 := v.Args[0] 4294 if v_0.Op != OpAdd8 { 4295 break 4296 } 4297 _ = v_0.Args[1] 4298 x := v_0.Args[0] 4299 v_0_1 := v_0.Args[1] 4300 if v_0_1.Op != OpConst8 { 4301 break 4302 } 4303 t := v_0_1.Type 4304 d := v_0_1.AuxInt 4305 v_1 := v.Args[1] 4306 if v_1.Op != OpConst8 { 4307 break 4308 } 4309 if v_1.Type != t { 4310 break 4311 } 4312 c := v_1.AuxInt 4313 v.reset(OpAdd8) 4314 v0 := b.NewValue0(v.Pos, OpConst8, t) 4315 v0.AuxInt = int64(int8(c + d)) 4316 v.AddArg(v0) 4317 v.AddArg(x) 4318 return true 4319 } 4320 return false 4321 } 4322 func rewriteValuegeneric_OpAdd8_30(v *Value) bool { 4323 b := v.Block 4324 _ = b 4325 // match: (Add8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 4326 // cond: 4327 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 4328 for { 4329 _ = v.Args[1] 4330 v_0 := v.Args[0] 4331 if v_0.Op != OpConst8 { 4332 break 4333 } 4334 t := v_0.Type 4335 c := v_0.AuxInt 4336 v_1 := v.Args[1] 4337 if v_1.Op != OpSub8 { 4338 break 4339 } 4340 _ = v_1.Args[1] 4341 v_1_0 := v_1.Args[0] 4342 if v_1_0.Op != OpConst8 { 4343 break 4344 } 4345 if v_1_0.Type != t { 4346 break 4347 } 4348 d := v_1_0.AuxInt 4349 x := v_1.Args[1] 4350 v.reset(OpSub8) 4351 v0 := b.NewValue0(v.Pos, OpConst8, t) 4352 v0.AuxInt = int64(int8(c + d)) 4353 v.AddArg(v0) 4354 v.AddArg(x) 4355 return true 4356 } 4357 // match: (Add8 (Sub8 (Const8 <t> [d]) x) (Const8 <t> [c])) 4358 // cond: 4359 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 4360 for { 4361 _ = v.Args[1] 4362 v_0 := v.Args[0] 4363 if v_0.Op != OpSub8 { 4364 break 4365 } 4366 _ = v_0.Args[1] 4367 v_0_0 := v_0.Args[0] 4368 if v_0_0.Op != OpConst8 { 4369 break 4370 } 4371 t := v_0_0.Type 4372 d := v_0_0.AuxInt 4373 x := v_0.Args[1] 4374 v_1 := v.Args[1] 4375 if v_1.Op != OpConst8 { 4376 break 4377 } 4378 if v_1.Type != t { 4379 break 4380 } 4381 c := v_1.AuxInt 4382 v.reset(OpSub8) 4383 v0 := b.NewValue0(v.Pos, OpConst8, t) 4384 v0.AuxInt = int64(int8(c + d)) 4385 v.AddArg(v0) 4386 v.AddArg(x) 4387 return true 4388 } 4389 // match: (Add8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 4390 // cond: 4391 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 4392 for { 4393 _ = v.Args[1] 4394 v_0 := v.Args[0] 4395 if v_0.Op != OpConst8 { 4396 break 4397 } 4398 t := v_0.Type 4399 c := v_0.AuxInt 4400 v_1 := v.Args[1] 4401 if v_1.Op != OpSub8 { 4402 break 4403 } 4404 _ = v_1.Args[1] 4405 x := v_1.Args[0] 4406 v_1_1 := v_1.Args[1] 4407 if v_1_1.Op != OpConst8 { 4408 break 4409 } 4410 if v_1_1.Type != t { 4411 break 4412 } 4413 d := v_1_1.AuxInt 4414 v.reset(OpAdd8) 4415 v0 := b.NewValue0(v.Pos, OpConst8, t) 4416 v0.AuxInt = int64(int8(c - d)) 4417 v.AddArg(v0) 4418 v.AddArg(x) 4419 return true 4420 } 4421 // match: (Add8 (Sub8 x (Const8 <t> [d])) (Const8 <t> [c])) 4422 // cond: 4423 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 4424 for { 4425 _ = v.Args[1] 4426 v_0 := v.Args[0] 4427 if v_0.Op != OpSub8 { 4428 break 4429 } 4430 _ = v_0.Args[1] 4431 x := v_0.Args[0] 4432 v_0_1 := v_0.Args[1] 4433 if v_0_1.Op != OpConst8 { 4434 break 4435 } 4436 t := v_0_1.Type 4437 d := v_0_1.AuxInt 4438 v_1 := v.Args[1] 4439 if v_1.Op != OpConst8 { 4440 break 4441 } 4442 if v_1.Type != t { 4443 break 4444 } 4445 c := v_1.AuxInt 4446 v.reset(OpAdd8) 4447 v0 := b.NewValue0(v.Pos, OpConst8, t) 4448 v0.AuxInt = int64(int8(c - d)) 4449 v.AddArg(v0) 4450 v.AddArg(x) 4451 return true 4452 } 4453 return false 4454 } 4455 func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { 4456 // match: (AddPtr <t> x (Const64 [c])) 4457 // cond: 4458 // result: (OffPtr <t> x [c]) 4459 for { 4460 t := v.Type 4461 _ = v.Args[1] 4462 x := v.Args[0] 4463 v_1 := v.Args[1] 4464 if v_1.Op != OpConst64 { 4465 break 4466 } 4467 c := v_1.AuxInt 4468 v.reset(OpOffPtr) 4469 v.Type = t 4470 v.AuxInt = c 4471 v.AddArg(x) 4472 return true 4473 } 4474 // match: (AddPtr <t> x (Const32 [c])) 4475 // cond: 4476 // result: (OffPtr <t> x [c]) 4477 for { 4478 t := v.Type 4479 _ = v.Args[1] 4480 x := v.Args[0] 4481 v_1 := v.Args[1] 4482 if v_1.Op != OpConst32 { 4483 break 4484 } 4485 c := v_1.AuxInt 4486 v.reset(OpOffPtr) 4487 v.Type = t 4488 v.AuxInt = c 4489 v.AddArg(x) 4490 return true 4491 } 4492 return false 4493 } 4494 func rewriteValuegeneric_OpAnd16_0(v *Value) bool { 4495 // match: (And16 (Const16 [c]) (Const16 [d])) 4496 // cond: 4497 // result: (Const16 [int64(int16(c&d))]) 4498 for { 4499 _ = v.Args[1] 4500 v_0 := v.Args[0] 4501 if v_0.Op != OpConst16 { 4502 break 4503 } 4504 c := v_0.AuxInt 4505 v_1 := v.Args[1] 4506 if v_1.Op != OpConst16 { 4507 break 4508 } 4509 d := v_1.AuxInt 4510 v.reset(OpConst16) 4511 v.AuxInt = int64(int16(c & d)) 4512 return true 4513 } 4514 // match: (And16 (Const16 [d]) (Const16 [c])) 4515 // cond: 4516 // result: (Const16 [int64(int16(c&d))]) 4517 for { 4518 _ = v.Args[1] 4519 v_0 := v.Args[0] 4520 if v_0.Op != OpConst16 { 4521 break 4522 } 4523 d := v_0.AuxInt 4524 v_1 := v.Args[1] 4525 if v_1.Op != OpConst16 { 4526 break 4527 } 4528 c := v_1.AuxInt 4529 v.reset(OpConst16) 4530 v.AuxInt = int64(int16(c & d)) 4531 return true 4532 } 4533 // match: (And16 x x) 4534 // cond: 4535 // result: x 4536 for { 4537 _ = v.Args[1] 4538 x := v.Args[0] 4539 if x != v.Args[1] { 4540 break 4541 } 4542 v.reset(OpCopy) 4543 v.Type = x.Type 4544 v.AddArg(x) 4545 return true 4546 } 4547 // match: (And16 (Const16 [-1]) x) 4548 // cond: 4549 // result: x 4550 for { 4551 _ = v.Args[1] 4552 v_0 := v.Args[0] 4553 if v_0.Op != OpConst16 { 4554 break 4555 } 4556 if v_0.AuxInt != -1 { 4557 break 4558 } 4559 x := v.Args[1] 4560 v.reset(OpCopy) 4561 v.Type = x.Type 4562 v.AddArg(x) 4563 return true 4564 } 4565 // match: (And16 x (Const16 [-1])) 4566 // cond: 4567 // result: x 4568 for { 4569 _ = v.Args[1] 4570 x := v.Args[0] 4571 v_1 := v.Args[1] 4572 if v_1.Op != OpConst16 { 4573 break 4574 } 4575 if v_1.AuxInt != -1 { 4576 break 4577 } 4578 v.reset(OpCopy) 4579 v.Type = x.Type 4580 v.AddArg(x) 4581 return true 4582 } 4583 // match: (And16 (Const16 [0]) _) 4584 // cond: 4585 // result: (Const16 [0]) 4586 for { 4587 _ = v.Args[1] 4588 v_0 := v.Args[0] 4589 if v_0.Op != OpConst16 { 4590 break 4591 } 4592 if v_0.AuxInt != 0 { 4593 break 4594 } 4595 v.reset(OpConst16) 4596 v.AuxInt = 0 4597 return true 4598 } 4599 // match: (And16 _ (Const16 [0])) 4600 // cond: 4601 // result: (Const16 [0]) 4602 for { 4603 _ = v.Args[1] 4604 v_1 := v.Args[1] 4605 if v_1.Op != OpConst16 { 4606 break 4607 } 4608 if v_1.AuxInt != 0 { 4609 break 4610 } 4611 v.reset(OpConst16) 4612 v.AuxInt = 0 4613 return true 4614 } 4615 // match: (And16 x (And16 x y)) 4616 // cond: 4617 // result: (And16 x y) 4618 for { 4619 _ = v.Args[1] 4620 x := v.Args[0] 4621 v_1 := v.Args[1] 4622 if v_1.Op != OpAnd16 { 4623 break 4624 } 4625 _ = v_1.Args[1] 4626 if x != v_1.Args[0] { 4627 break 4628 } 4629 y := v_1.Args[1] 4630 v.reset(OpAnd16) 4631 v.AddArg(x) 4632 v.AddArg(y) 4633 return true 4634 } 4635 // match: (And16 x (And16 y x)) 4636 // cond: 4637 // result: (And16 x y) 4638 for { 4639 _ = v.Args[1] 4640 x := v.Args[0] 4641 v_1 := v.Args[1] 4642 if v_1.Op != OpAnd16 { 4643 break 4644 } 4645 _ = v_1.Args[1] 4646 y := v_1.Args[0] 4647 if x != v_1.Args[1] { 4648 break 4649 } 4650 v.reset(OpAnd16) 4651 v.AddArg(x) 4652 v.AddArg(y) 4653 return true 4654 } 4655 // match: (And16 (And16 x y) x) 4656 // cond: 4657 // result: (And16 x y) 4658 for { 4659 _ = v.Args[1] 4660 v_0 := v.Args[0] 4661 if v_0.Op != OpAnd16 { 4662 break 4663 } 4664 _ = v_0.Args[1] 4665 x := v_0.Args[0] 4666 y := v_0.Args[1] 4667 if x != v.Args[1] { 4668 break 4669 } 4670 v.reset(OpAnd16) 4671 v.AddArg(x) 4672 v.AddArg(y) 4673 return true 4674 } 4675 return false 4676 } 4677 func rewriteValuegeneric_OpAnd16_10(v *Value) bool { 4678 b := v.Block 4679 _ = b 4680 // match: (And16 (And16 y x) x) 4681 // cond: 4682 // result: (And16 x y) 4683 for { 4684 _ = v.Args[1] 4685 v_0 := v.Args[0] 4686 if v_0.Op != OpAnd16 { 4687 break 4688 } 4689 _ = v_0.Args[1] 4690 y := v_0.Args[0] 4691 x := v_0.Args[1] 4692 if x != v.Args[1] { 4693 break 4694 } 4695 v.reset(OpAnd16) 4696 v.AddArg(x) 4697 v.AddArg(y) 4698 return true 4699 } 4700 // match: (And16 (And16 i:(Const16 <t>) z) x) 4701 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4702 // result: (And16 i (And16 <t> z x)) 4703 for { 4704 _ = v.Args[1] 4705 v_0 := v.Args[0] 4706 if v_0.Op != OpAnd16 { 4707 break 4708 } 4709 _ = v_0.Args[1] 4710 i := v_0.Args[0] 4711 if i.Op != OpConst16 { 4712 break 4713 } 4714 t := i.Type 4715 z := v_0.Args[1] 4716 x := v.Args[1] 4717 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4718 break 4719 } 4720 v.reset(OpAnd16) 4721 v.AddArg(i) 4722 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4723 v0.AddArg(z) 4724 v0.AddArg(x) 4725 v.AddArg(v0) 4726 return true 4727 } 4728 // match: (And16 (And16 z i:(Const16 <t>)) x) 4729 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4730 // result: (And16 i (And16 <t> z x)) 4731 for { 4732 _ = v.Args[1] 4733 v_0 := v.Args[0] 4734 if v_0.Op != OpAnd16 { 4735 break 4736 } 4737 _ = v_0.Args[1] 4738 z := v_0.Args[0] 4739 i := v_0.Args[1] 4740 if i.Op != OpConst16 { 4741 break 4742 } 4743 t := i.Type 4744 x := v.Args[1] 4745 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4746 break 4747 } 4748 v.reset(OpAnd16) 4749 v.AddArg(i) 4750 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4751 v0.AddArg(z) 4752 v0.AddArg(x) 4753 v.AddArg(v0) 4754 return true 4755 } 4756 // match: (And16 x (And16 i:(Const16 <t>) z)) 4757 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4758 // result: (And16 i (And16 <t> z x)) 4759 for { 4760 _ = v.Args[1] 4761 x := v.Args[0] 4762 v_1 := v.Args[1] 4763 if v_1.Op != OpAnd16 { 4764 break 4765 } 4766 _ = v_1.Args[1] 4767 i := v_1.Args[0] 4768 if i.Op != OpConst16 { 4769 break 4770 } 4771 t := i.Type 4772 z := v_1.Args[1] 4773 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4774 break 4775 } 4776 v.reset(OpAnd16) 4777 v.AddArg(i) 4778 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4779 v0.AddArg(z) 4780 v0.AddArg(x) 4781 v.AddArg(v0) 4782 return true 4783 } 4784 // match: (And16 x (And16 z i:(Const16 <t>))) 4785 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4786 // result: (And16 i (And16 <t> z x)) 4787 for { 4788 _ = v.Args[1] 4789 x := v.Args[0] 4790 v_1 := v.Args[1] 4791 if v_1.Op != OpAnd16 { 4792 break 4793 } 4794 _ = v_1.Args[1] 4795 z := v_1.Args[0] 4796 i := v_1.Args[1] 4797 if i.Op != OpConst16 { 4798 break 4799 } 4800 t := i.Type 4801 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4802 break 4803 } 4804 v.reset(OpAnd16) 4805 v.AddArg(i) 4806 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4807 v0.AddArg(z) 4808 v0.AddArg(x) 4809 v.AddArg(v0) 4810 return true 4811 } 4812 // match: (And16 (Const16 <t> [c]) (And16 (Const16 <t> [d]) x)) 4813 // cond: 4814 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4815 for { 4816 _ = v.Args[1] 4817 v_0 := v.Args[0] 4818 if v_0.Op != OpConst16 { 4819 break 4820 } 4821 t := v_0.Type 4822 c := v_0.AuxInt 4823 v_1 := v.Args[1] 4824 if v_1.Op != OpAnd16 { 4825 break 4826 } 4827 _ = v_1.Args[1] 4828 v_1_0 := v_1.Args[0] 4829 if v_1_0.Op != OpConst16 { 4830 break 4831 } 4832 if v_1_0.Type != t { 4833 break 4834 } 4835 d := v_1_0.AuxInt 4836 x := v_1.Args[1] 4837 v.reset(OpAnd16) 4838 v0 := b.NewValue0(v.Pos, OpConst16, t) 4839 v0.AuxInt = int64(int16(c & d)) 4840 v.AddArg(v0) 4841 v.AddArg(x) 4842 return true 4843 } 4844 // match: (And16 (Const16 <t> [c]) (And16 x (Const16 <t> [d]))) 4845 // cond: 4846 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4847 for { 4848 _ = v.Args[1] 4849 v_0 := v.Args[0] 4850 if v_0.Op != OpConst16 { 4851 break 4852 } 4853 t := v_0.Type 4854 c := v_0.AuxInt 4855 v_1 := v.Args[1] 4856 if v_1.Op != OpAnd16 { 4857 break 4858 } 4859 _ = v_1.Args[1] 4860 x := v_1.Args[0] 4861 v_1_1 := v_1.Args[1] 4862 if v_1_1.Op != OpConst16 { 4863 break 4864 } 4865 if v_1_1.Type != t { 4866 break 4867 } 4868 d := v_1_1.AuxInt 4869 v.reset(OpAnd16) 4870 v0 := b.NewValue0(v.Pos, OpConst16, t) 4871 v0.AuxInt = int64(int16(c & d)) 4872 v.AddArg(v0) 4873 v.AddArg(x) 4874 return true 4875 } 4876 // match: (And16 (And16 (Const16 <t> [d]) x) (Const16 <t> [c])) 4877 // cond: 4878 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4879 for { 4880 _ = v.Args[1] 4881 v_0 := v.Args[0] 4882 if v_0.Op != OpAnd16 { 4883 break 4884 } 4885 _ = v_0.Args[1] 4886 v_0_0 := v_0.Args[0] 4887 if v_0_0.Op != OpConst16 { 4888 break 4889 } 4890 t := v_0_0.Type 4891 d := v_0_0.AuxInt 4892 x := v_0.Args[1] 4893 v_1 := v.Args[1] 4894 if v_1.Op != OpConst16 { 4895 break 4896 } 4897 if v_1.Type != t { 4898 break 4899 } 4900 c := v_1.AuxInt 4901 v.reset(OpAnd16) 4902 v0 := b.NewValue0(v.Pos, OpConst16, t) 4903 v0.AuxInt = int64(int16(c & d)) 4904 v.AddArg(v0) 4905 v.AddArg(x) 4906 return true 4907 } 4908 // match: (And16 (And16 x (Const16 <t> [d])) (Const16 <t> [c])) 4909 // cond: 4910 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4911 for { 4912 _ = v.Args[1] 4913 v_0 := v.Args[0] 4914 if v_0.Op != OpAnd16 { 4915 break 4916 } 4917 _ = v_0.Args[1] 4918 x := v_0.Args[0] 4919 v_0_1 := v_0.Args[1] 4920 if v_0_1.Op != OpConst16 { 4921 break 4922 } 4923 t := v_0_1.Type 4924 d := v_0_1.AuxInt 4925 v_1 := v.Args[1] 4926 if v_1.Op != OpConst16 { 4927 break 4928 } 4929 if v_1.Type != t { 4930 break 4931 } 4932 c := v_1.AuxInt 4933 v.reset(OpAnd16) 4934 v0 := b.NewValue0(v.Pos, OpConst16, t) 4935 v0.AuxInt = int64(int16(c & d)) 4936 v.AddArg(v0) 4937 v.AddArg(x) 4938 return true 4939 } 4940 return false 4941 } 4942 func rewriteValuegeneric_OpAnd32_0(v *Value) bool { 4943 // match: (And32 (Const32 [c]) (Const32 [d])) 4944 // cond: 4945 // result: (Const32 [int64(int32(c&d))]) 4946 for { 4947 _ = v.Args[1] 4948 v_0 := v.Args[0] 4949 if v_0.Op != OpConst32 { 4950 break 4951 } 4952 c := v_0.AuxInt 4953 v_1 := v.Args[1] 4954 if v_1.Op != OpConst32 { 4955 break 4956 } 4957 d := v_1.AuxInt 4958 v.reset(OpConst32) 4959 v.AuxInt = int64(int32(c & d)) 4960 return true 4961 } 4962 // match: (And32 (Const32 [d]) (Const32 [c])) 4963 // cond: 4964 // result: (Const32 [int64(int32(c&d))]) 4965 for { 4966 _ = v.Args[1] 4967 v_0 := v.Args[0] 4968 if v_0.Op != OpConst32 { 4969 break 4970 } 4971 d := v_0.AuxInt 4972 v_1 := v.Args[1] 4973 if v_1.Op != OpConst32 { 4974 break 4975 } 4976 c := v_1.AuxInt 4977 v.reset(OpConst32) 4978 v.AuxInt = int64(int32(c & d)) 4979 return true 4980 } 4981 // match: (And32 x x) 4982 // cond: 4983 // result: x 4984 for { 4985 _ = v.Args[1] 4986 x := v.Args[0] 4987 if x != v.Args[1] { 4988 break 4989 } 4990 v.reset(OpCopy) 4991 v.Type = x.Type 4992 v.AddArg(x) 4993 return true 4994 } 4995 // match: (And32 (Const32 [-1]) x) 4996 // cond: 4997 // result: x 4998 for { 4999 _ = v.Args[1] 5000 v_0 := v.Args[0] 5001 if v_0.Op != OpConst32 { 5002 break 5003 } 5004 if v_0.AuxInt != -1 { 5005 break 5006 } 5007 x := v.Args[1] 5008 v.reset(OpCopy) 5009 v.Type = x.Type 5010 v.AddArg(x) 5011 return true 5012 } 5013 // match: (And32 x (Const32 [-1])) 5014 // cond: 5015 // result: x 5016 for { 5017 _ = v.Args[1] 5018 x := v.Args[0] 5019 v_1 := v.Args[1] 5020 if v_1.Op != OpConst32 { 5021 break 5022 } 5023 if v_1.AuxInt != -1 { 5024 break 5025 } 5026 v.reset(OpCopy) 5027 v.Type = x.Type 5028 v.AddArg(x) 5029 return true 5030 } 5031 // match: (And32 (Const32 [0]) _) 5032 // cond: 5033 // result: (Const32 [0]) 5034 for { 5035 _ = v.Args[1] 5036 v_0 := v.Args[0] 5037 if v_0.Op != OpConst32 { 5038 break 5039 } 5040 if v_0.AuxInt != 0 { 5041 break 5042 } 5043 v.reset(OpConst32) 5044 v.AuxInt = 0 5045 return true 5046 } 5047 // match: (And32 _ (Const32 [0])) 5048 // cond: 5049 // result: (Const32 [0]) 5050 for { 5051 _ = v.Args[1] 5052 v_1 := v.Args[1] 5053 if v_1.Op != OpConst32 { 5054 break 5055 } 5056 if v_1.AuxInt != 0 { 5057 break 5058 } 5059 v.reset(OpConst32) 5060 v.AuxInt = 0 5061 return true 5062 } 5063 // match: (And32 x (And32 x y)) 5064 // cond: 5065 // result: (And32 x y) 5066 for { 5067 _ = v.Args[1] 5068 x := v.Args[0] 5069 v_1 := v.Args[1] 5070 if v_1.Op != OpAnd32 { 5071 break 5072 } 5073 _ = v_1.Args[1] 5074 if x != v_1.Args[0] { 5075 break 5076 } 5077 y := v_1.Args[1] 5078 v.reset(OpAnd32) 5079 v.AddArg(x) 5080 v.AddArg(y) 5081 return true 5082 } 5083 // match: (And32 x (And32 y x)) 5084 // cond: 5085 // result: (And32 x y) 5086 for { 5087 _ = v.Args[1] 5088 x := v.Args[0] 5089 v_1 := v.Args[1] 5090 if v_1.Op != OpAnd32 { 5091 break 5092 } 5093 _ = v_1.Args[1] 5094 y := v_1.Args[0] 5095 if x != v_1.Args[1] { 5096 break 5097 } 5098 v.reset(OpAnd32) 5099 v.AddArg(x) 5100 v.AddArg(y) 5101 return true 5102 } 5103 // match: (And32 (And32 x y) x) 5104 // cond: 5105 // result: (And32 x y) 5106 for { 5107 _ = v.Args[1] 5108 v_0 := v.Args[0] 5109 if v_0.Op != OpAnd32 { 5110 break 5111 } 5112 _ = v_0.Args[1] 5113 x := v_0.Args[0] 5114 y := v_0.Args[1] 5115 if x != v.Args[1] { 5116 break 5117 } 5118 v.reset(OpAnd32) 5119 v.AddArg(x) 5120 v.AddArg(y) 5121 return true 5122 } 5123 return false 5124 } 5125 func rewriteValuegeneric_OpAnd32_10(v *Value) bool { 5126 b := v.Block 5127 _ = b 5128 // match: (And32 (And32 y x) x) 5129 // cond: 5130 // result: (And32 x y) 5131 for { 5132 _ = v.Args[1] 5133 v_0 := v.Args[0] 5134 if v_0.Op != OpAnd32 { 5135 break 5136 } 5137 _ = v_0.Args[1] 5138 y := v_0.Args[0] 5139 x := v_0.Args[1] 5140 if x != v.Args[1] { 5141 break 5142 } 5143 v.reset(OpAnd32) 5144 v.AddArg(x) 5145 v.AddArg(y) 5146 return true 5147 } 5148 // match: (And32 (And32 i:(Const32 <t>) z) x) 5149 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5150 // result: (And32 i (And32 <t> z x)) 5151 for { 5152 _ = v.Args[1] 5153 v_0 := v.Args[0] 5154 if v_0.Op != OpAnd32 { 5155 break 5156 } 5157 _ = v_0.Args[1] 5158 i := v_0.Args[0] 5159 if i.Op != OpConst32 { 5160 break 5161 } 5162 t := i.Type 5163 z := v_0.Args[1] 5164 x := v.Args[1] 5165 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5166 break 5167 } 5168 v.reset(OpAnd32) 5169 v.AddArg(i) 5170 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5171 v0.AddArg(z) 5172 v0.AddArg(x) 5173 v.AddArg(v0) 5174 return true 5175 } 5176 // match: (And32 (And32 z i:(Const32 <t>)) x) 5177 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5178 // result: (And32 i (And32 <t> z x)) 5179 for { 5180 _ = v.Args[1] 5181 v_0 := v.Args[0] 5182 if v_0.Op != OpAnd32 { 5183 break 5184 } 5185 _ = v_0.Args[1] 5186 z := v_0.Args[0] 5187 i := v_0.Args[1] 5188 if i.Op != OpConst32 { 5189 break 5190 } 5191 t := i.Type 5192 x := v.Args[1] 5193 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5194 break 5195 } 5196 v.reset(OpAnd32) 5197 v.AddArg(i) 5198 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5199 v0.AddArg(z) 5200 v0.AddArg(x) 5201 v.AddArg(v0) 5202 return true 5203 } 5204 // match: (And32 x (And32 i:(Const32 <t>) z)) 5205 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5206 // result: (And32 i (And32 <t> z x)) 5207 for { 5208 _ = v.Args[1] 5209 x := v.Args[0] 5210 v_1 := v.Args[1] 5211 if v_1.Op != OpAnd32 { 5212 break 5213 } 5214 _ = v_1.Args[1] 5215 i := v_1.Args[0] 5216 if i.Op != OpConst32 { 5217 break 5218 } 5219 t := i.Type 5220 z := v_1.Args[1] 5221 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5222 break 5223 } 5224 v.reset(OpAnd32) 5225 v.AddArg(i) 5226 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5227 v0.AddArg(z) 5228 v0.AddArg(x) 5229 v.AddArg(v0) 5230 return true 5231 } 5232 // match: (And32 x (And32 z i:(Const32 <t>))) 5233 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5234 // result: (And32 i (And32 <t> z x)) 5235 for { 5236 _ = v.Args[1] 5237 x := v.Args[0] 5238 v_1 := v.Args[1] 5239 if v_1.Op != OpAnd32 { 5240 break 5241 } 5242 _ = v_1.Args[1] 5243 z := v_1.Args[0] 5244 i := v_1.Args[1] 5245 if i.Op != OpConst32 { 5246 break 5247 } 5248 t := i.Type 5249 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5250 break 5251 } 5252 v.reset(OpAnd32) 5253 v.AddArg(i) 5254 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5255 v0.AddArg(z) 5256 v0.AddArg(x) 5257 v.AddArg(v0) 5258 return true 5259 } 5260 // match: (And32 (Const32 <t> [c]) (And32 (Const32 <t> [d]) x)) 5261 // cond: 5262 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5263 for { 5264 _ = v.Args[1] 5265 v_0 := v.Args[0] 5266 if v_0.Op != OpConst32 { 5267 break 5268 } 5269 t := v_0.Type 5270 c := v_0.AuxInt 5271 v_1 := v.Args[1] 5272 if v_1.Op != OpAnd32 { 5273 break 5274 } 5275 _ = v_1.Args[1] 5276 v_1_0 := v_1.Args[0] 5277 if v_1_0.Op != OpConst32 { 5278 break 5279 } 5280 if v_1_0.Type != t { 5281 break 5282 } 5283 d := v_1_0.AuxInt 5284 x := v_1.Args[1] 5285 v.reset(OpAnd32) 5286 v0 := b.NewValue0(v.Pos, OpConst32, t) 5287 v0.AuxInt = int64(int32(c & d)) 5288 v.AddArg(v0) 5289 v.AddArg(x) 5290 return true 5291 } 5292 // match: (And32 (Const32 <t> [c]) (And32 x (Const32 <t> [d]))) 5293 // cond: 5294 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5295 for { 5296 _ = v.Args[1] 5297 v_0 := v.Args[0] 5298 if v_0.Op != OpConst32 { 5299 break 5300 } 5301 t := v_0.Type 5302 c := v_0.AuxInt 5303 v_1 := v.Args[1] 5304 if v_1.Op != OpAnd32 { 5305 break 5306 } 5307 _ = v_1.Args[1] 5308 x := v_1.Args[0] 5309 v_1_1 := v_1.Args[1] 5310 if v_1_1.Op != OpConst32 { 5311 break 5312 } 5313 if v_1_1.Type != t { 5314 break 5315 } 5316 d := v_1_1.AuxInt 5317 v.reset(OpAnd32) 5318 v0 := b.NewValue0(v.Pos, OpConst32, t) 5319 v0.AuxInt = int64(int32(c & d)) 5320 v.AddArg(v0) 5321 v.AddArg(x) 5322 return true 5323 } 5324 // match: (And32 (And32 (Const32 <t> [d]) x) (Const32 <t> [c])) 5325 // cond: 5326 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5327 for { 5328 _ = v.Args[1] 5329 v_0 := v.Args[0] 5330 if v_0.Op != OpAnd32 { 5331 break 5332 } 5333 _ = v_0.Args[1] 5334 v_0_0 := v_0.Args[0] 5335 if v_0_0.Op != OpConst32 { 5336 break 5337 } 5338 t := v_0_0.Type 5339 d := v_0_0.AuxInt 5340 x := v_0.Args[1] 5341 v_1 := v.Args[1] 5342 if v_1.Op != OpConst32 { 5343 break 5344 } 5345 if v_1.Type != t { 5346 break 5347 } 5348 c := v_1.AuxInt 5349 v.reset(OpAnd32) 5350 v0 := b.NewValue0(v.Pos, OpConst32, t) 5351 v0.AuxInt = int64(int32(c & d)) 5352 v.AddArg(v0) 5353 v.AddArg(x) 5354 return true 5355 } 5356 // match: (And32 (And32 x (Const32 <t> [d])) (Const32 <t> [c])) 5357 // cond: 5358 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5359 for { 5360 _ = v.Args[1] 5361 v_0 := v.Args[0] 5362 if v_0.Op != OpAnd32 { 5363 break 5364 } 5365 _ = v_0.Args[1] 5366 x := v_0.Args[0] 5367 v_0_1 := v_0.Args[1] 5368 if v_0_1.Op != OpConst32 { 5369 break 5370 } 5371 t := v_0_1.Type 5372 d := v_0_1.AuxInt 5373 v_1 := v.Args[1] 5374 if v_1.Op != OpConst32 { 5375 break 5376 } 5377 if v_1.Type != t { 5378 break 5379 } 5380 c := v_1.AuxInt 5381 v.reset(OpAnd32) 5382 v0 := b.NewValue0(v.Pos, OpConst32, t) 5383 v0.AuxInt = int64(int32(c & d)) 5384 v.AddArg(v0) 5385 v.AddArg(x) 5386 return true 5387 } 5388 return false 5389 } 5390 func rewriteValuegeneric_OpAnd64_0(v *Value) bool { 5391 // match: (And64 (Const64 [c]) (Const64 [d])) 5392 // cond: 5393 // result: (Const64 [c&d]) 5394 for { 5395 _ = v.Args[1] 5396 v_0 := v.Args[0] 5397 if v_0.Op != OpConst64 { 5398 break 5399 } 5400 c := v_0.AuxInt 5401 v_1 := v.Args[1] 5402 if v_1.Op != OpConst64 { 5403 break 5404 } 5405 d := v_1.AuxInt 5406 v.reset(OpConst64) 5407 v.AuxInt = c & d 5408 return true 5409 } 5410 // match: (And64 (Const64 [d]) (Const64 [c])) 5411 // cond: 5412 // result: (Const64 [c&d]) 5413 for { 5414 _ = v.Args[1] 5415 v_0 := v.Args[0] 5416 if v_0.Op != OpConst64 { 5417 break 5418 } 5419 d := v_0.AuxInt 5420 v_1 := v.Args[1] 5421 if v_1.Op != OpConst64 { 5422 break 5423 } 5424 c := v_1.AuxInt 5425 v.reset(OpConst64) 5426 v.AuxInt = c & d 5427 return true 5428 } 5429 // match: (And64 x x) 5430 // cond: 5431 // result: x 5432 for { 5433 _ = v.Args[1] 5434 x := v.Args[0] 5435 if x != v.Args[1] { 5436 break 5437 } 5438 v.reset(OpCopy) 5439 v.Type = x.Type 5440 v.AddArg(x) 5441 return true 5442 } 5443 // match: (And64 (Const64 [-1]) x) 5444 // cond: 5445 // result: x 5446 for { 5447 _ = v.Args[1] 5448 v_0 := v.Args[0] 5449 if v_0.Op != OpConst64 { 5450 break 5451 } 5452 if v_0.AuxInt != -1 { 5453 break 5454 } 5455 x := v.Args[1] 5456 v.reset(OpCopy) 5457 v.Type = x.Type 5458 v.AddArg(x) 5459 return true 5460 } 5461 // match: (And64 x (Const64 [-1])) 5462 // cond: 5463 // result: x 5464 for { 5465 _ = v.Args[1] 5466 x := v.Args[0] 5467 v_1 := v.Args[1] 5468 if v_1.Op != OpConst64 { 5469 break 5470 } 5471 if v_1.AuxInt != -1 { 5472 break 5473 } 5474 v.reset(OpCopy) 5475 v.Type = x.Type 5476 v.AddArg(x) 5477 return true 5478 } 5479 // match: (And64 (Const64 [0]) _) 5480 // cond: 5481 // result: (Const64 [0]) 5482 for { 5483 _ = v.Args[1] 5484 v_0 := v.Args[0] 5485 if v_0.Op != OpConst64 { 5486 break 5487 } 5488 if v_0.AuxInt != 0 { 5489 break 5490 } 5491 v.reset(OpConst64) 5492 v.AuxInt = 0 5493 return true 5494 } 5495 // match: (And64 _ (Const64 [0])) 5496 // cond: 5497 // result: (Const64 [0]) 5498 for { 5499 _ = v.Args[1] 5500 v_1 := v.Args[1] 5501 if v_1.Op != OpConst64 { 5502 break 5503 } 5504 if v_1.AuxInt != 0 { 5505 break 5506 } 5507 v.reset(OpConst64) 5508 v.AuxInt = 0 5509 return true 5510 } 5511 // match: (And64 x (And64 x y)) 5512 // cond: 5513 // result: (And64 x y) 5514 for { 5515 _ = v.Args[1] 5516 x := v.Args[0] 5517 v_1 := v.Args[1] 5518 if v_1.Op != OpAnd64 { 5519 break 5520 } 5521 _ = v_1.Args[1] 5522 if x != v_1.Args[0] { 5523 break 5524 } 5525 y := v_1.Args[1] 5526 v.reset(OpAnd64) 5527 v.AddArg(x) 5528 v.AddArg(y) 5529 return true 5530 } 5531 // match: (And64 x (And64 y x)) 5532 // cond: 5533 // result: (And64 x y) 5534 for { 5535 _ = v.Args[1] 5536 x := v.Args[0] 5537 v_1 := v.Args[1] 5538 if v_1.Op != OpAnd64 { 5539 break 5540 } 5541 _ = v_1.Args[1] 5542 y := v_1.Args[0] 5543 if x != v_1.Args[1] { 5544 break 5545 } 5546 v.reset(OpAnd64) 5547 v.AddArg(x) 5548 v.AddArg(y) 5549 return true 5550 } 5551 // match: (And64 (And64 x y) x) 5552 // cond: 5553 // result: (And64 x y) 5554 for { 5555 _ = v.Args[1] 5556 v_0 := v.Args[0] 5557 if v_0.Op != OpAnd64 { 5558 break 5559 } 5560 _ = v_0.Args[1] 5561 x := v_0.Args[0] 5562 y := v_0.Args[1] 5563 if x != v.Args[1] { 5564 break 5565 } 5566 v.reset(OpAnd64) 5567 v.AddArg(x) 5568 v.AddArg(y) 5569 return true 5570 } 5571 return false 5572 } 5573 func rewriteValuegeneric_OpAnd64_10(v *Value) bool { 5574 b := v.Block 5575 _ = b 5576 // match: (And64 (And64 y x) x) 5577 // cond: 5578 // result: (And64 x y) 5579 for { 5580 _ = v.Args[1] 5581 v_0 := v.Args[0] 5582 if v_0.Op != OpAnd64 { 5583 break 5584 } 5585 _ = v_0.Args[1] 5586 y := v_0.Args[0] 5587 x := v_0.Args[1] 5588 if x != v.Args[1] { 5589 break 5590 } 5591 v.reset(OpAnd64) 5592 v.AddArg(x) 5593 v.AddArg(y) 5594 return true 5595 } 5596 // match: (And64 <t> (Const64 [y]) x) 5597 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 5598 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 5599 for { 5600 t := v.Type 5601 _ = v.Args[1] 5602 v_0 := v.Args[0] 5603 if v_0.Op != OpConst64 { 5604 break 5605 } 5606 y := v_0.AuxInt 5607 x := v.Args[1] 5608 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 5609 break 5610 } 5611 v.reset(OpRsh64Ux64) 5612 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 5613 v0.AddArg(x) 5614 v1 := b.NewValue0(v.Pos, OpConst64, t) 5615 v1.AuxInt = nlz(y) 5616 v0.AddArg(v1) 5617 v.AddArg(v0) 5618 v2 := b.NewValue0(v.Pos, OpConst64, t) 5619 v2.AuxInt = nlz(y) 5620 v.AddArg(v2) 5621 return true 5622 } 5623 // match: (And64 <t> x (Const64 [y])) 5624 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 5625 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 5626 for { 5627 t := v.Type 5628 _ = v.Args[1] 5629 x := v.Args[0] 5630 v_1 := v.Args[1] 5631 if v_1.Op != OpConst64 { 5632 break 5633 } 5634 y := v_1.AuxInt 5635 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 5636 break 5637 } 5638 v.reset(OpRsh64Ux64) 5639 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 5640 v0.AddArg(x) 5641 v1 := b.NewValue0(v.Pos, OpConst64, t) 5642 v1.AuxInt = nlz(y) 5643 v0.AddArg(v1) 5644 v.AddArg(v0) 5645 v2 := b.NewValue0(v.Pos, OpConst64, t) 5646 v2.AuxInt = nlz(y) 5647 v.AddArg(v2) 5648 return true 5649 } 5650 // match: (And64 <t> (Const64 [y]) x) 5651 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 5652 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 5653 for { 5654 t := v.Type 5655 _ = v.Args[1] 5656 v_0 := v.Args[0] 5657 if v_0.Op != OpConst64 { 5658 break 5659 } 5660 y := v_0.AuxInt 5661 x := v.Args[1] 5662 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 5663 break 5664 } 5665 v.reset(OpLsh64x64) 5666 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 5667 v0.AddArg(x) 5668 v1 := b.NewValue0(v.Pos, OpConst64, t) 5669 v1.AuxInt = ntz(y) 5670 v0.AddArg(v1) 5671 v.AddArg(v0) 5672 v2 := b.NewValue0(v.Pos, OpConst64, t) 5673 v2.AuxInt = ntz(y) 5674 v.AddArg(v2) 5675 return true 5676 } 5677 // match: (And64 <t> x (Const64 [y])) 5678 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 5679 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 5680 for { 5681 t := v.Type 5682 _ = v.Args[1] 5683 x := v.Args[0] 5684 v_1 := v.Args[1] 5685 if v_1.Op != OpConst64 { 5686 break 5687 } 5688 y := v_1.AuxInt 5689 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 5690 break 5691 } 5692 v.reset(OpLsh64x64) 5693 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 5694 v0.AddArg(x) 5695 v1 := b.NewValue0(v.Pos, OpConst64, t) 5696 v1.AuxInt = ntz(y) 5697 v0.AddArg(v1) 5698 v.AddArg(v0) 5699 v2 := b.NewValue0(v.Pos, OpConst64, t) 5700 v2.AuxInt = ntz(y) 5701 v.AddArg(v2) 5702 return true 5703 } 5704 // match: (And64 (And64 i:(Const64 <t>) z) x) 5705 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5706 // result: (And64 i (And64 <t> z x)) 5707 for { 5708 _ = v.Args[1] 5709 v_0 := v.Args[0] 5710 if v_0.Op != OpAnd64 { 5711 break 5712 } 5713 _ = v_0.Args[1] 5714 i := v_0.Args[0] 5715 if i.Op != OpConst64 { 5716 break 5717 } 5718 t := i.Type 5719 z := v_0.Args[1] 5720 x := v.Args[1] 5721 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5722 break 5723 } 5724 v.reset(OpAnd64) 5725 v.AddArg(i) 5726 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5727 v0.AddArg(z) 5728 v0.AddArg(x) 5729 v.AddArg(v0) 5730 return true 5731 } 5732 // match: (And64 (And64 z i:(Const64 <t>)) x) 5733 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5734 // result: (And64 i (And64 <t> z x)) 5735 for { 5736 _ = v.Args[1] 5737 v_0 := v.Args[0] 5738 if v_0.Op != OpAnd64 { 5739 break 5740 } 5741 _ = v_0.Args[1] 5742 z := v_0.Args[0] 5743 i := v_0.Args[1] 5744 if i.Op != OpConst64 { 5745 break 5746 } 5747 t := i.Type 5748 x := v.Args[1] 5749 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5750 break 5751 } 5752 v.reset(OpAnd64) 5753 v.AddArg(i) 5754 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5755 v0.AddArg(z) 5756 v0.AddArg(x) 5757 v.AddArg(v0) 5758 return true 5759 } 5760 // match: (And64 x (And64 i:(Const64 <t>) z)) 5761 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5762 // result: (And64 i (And64 <t> z x)) 5763 for { 5764 _ = v.Args[1] 5765 x := v.Args[0] 5766 v_1 := v.Args[1] 5767 if v_1.Op != OpAnd64 { 5768 break 5769 } 5770 _ = v_1.Args[1] 5771 i := v_1.Args[0] 5772 if i.Op != OpConst64 { 5773 break 5774 } 5775 t := i.Type 5776 z := v_1.Args[1] 5777 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5778 break 5779 } 5780 v.reset(OpAnd64) 5781 v.AddArg(i) 5782 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5783 v0.AddArg(z) 5784 v0.AddArg(x) 5785 v.AddArg(v0) 5786 return true 5787 } 5788 // match: (And64 x (And64 z i:(Const64 <t>))) 5789 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5790 // result: (And64 i (And64 <t> z x)) 5791 for { 5792 _ = v.Args[1] 5793 x := v.Args[0] 5794 v_1 := v.Args[1] 5795 if v_1.Op != OpAnd64 { 5796 break 5797 } 5798 _ = v_1.Args[1] 5799 z := v_1.Args[0] 5800 i := v_1.Args[1] 5801 if i.Op != OpConst64 { 5802 break 5803 } 5804 t := i.Type 5805 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5806 break 5807 } 5808 v.reset(OpAnd64) 5809 v.AddArg(i) 5810 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5811 v0.AddArg(z) 5812 v0.AddArg(x) 5813 v.AddArg(v0) 5814 return true 5815 } 5816 // match: (And64 (Const64 <t> [c]) (And64 (Const64 <t> [d]) x)) 5817 // cond: 5818 // result: (And64 (Const64 <t> [c&d]) x) 5819 for { 5820 _ = v.Args[1] 5821 v_0 := v.Args[0] 5822 if v_0.Op != OpConst64 { 5823 break 5824 } 5825 t := v_0.Type 5826 c := v_0.AuxInt 5827 v_1 := v.Args[1] 5828 if v_1.Op != OpAnd64 { 5829 break 5830 } 5831 _ = v_1.Args[1] 5832 v_1_0 := v_1.Args[0] 5833 if v_1_0.Op != OpConst64 { 5834 break 5835 } 5836 if v_1_0.Type != t { 5837 break 5838 } 5839 d := v_1_0.AuxInt 5840 x := v_1.Args[1] 5841 v.reset(OpAnd64) 5842 v0 := b.NewValue0(v.Pos, OpConst64, t) 5843 v0.AuxInt = c & d 5844 v.AddArg(v0) 5845 v.AddArg(x) 5846 return true 5847 } 5848 return false 5849 } 5850 func rewriteValuegeneric_OpAnd64_20(v *Value) bool { 5851 b := v.Block 5852 _ = b 5853 // match: (And64 (Const64 <t> [c]) (And64 x (Const64 <t> [d]))) 5854 // cond: 5855 // result: (And64 (Const64 <t> [c&d]) x) 5856 for { 5857 _ = v.Args[1] 5858 v_0 := v.Args[0] 5859 if v_0.Op != OpConst64 { 5860 break 5861 } 5862 t := v_0.Type 5863 c := v_0.AuxInt 5864 v_1 := v.Args[1] 5865 if v_1.Op != OpAnd64 { 5866 break 5867 } 5868 _ = v_1.Args[1] 5869 x := v_1.Args[0] 5870 v_1_1 := v_1.Args[1] 5871 if v_1_1.Op != OpConst64 { 5872 break 5873 } 5874 if v_1_1.Type != t { 5875 break 5876 } 5877 d := v_1_1.AuxInt 5878 v.reset(OpAnd64) 5879 v0 := b.NewValue0(v.Pos, OpConst64, t) 5880 v0.AuxInt = c & d 5881 v.AddArg(v0) 5882 v.AddArg(x) 5883 return true 5884 } 5885 // match: (And64 (And64 (Const64 <t> [d]) x) (Const64 <t> [c])) 5886 // cond: 5887 // result: (And64 (Const64 <t> [c&d]) x) 5888 for { 5889 _ = v.Args[1] 5890 v_0 := v.Args[0] 5891 if v_0.Op != OpAnd64 { 5892 break 5893 } 5894 _ = v_0.Args[1] 5895 v_0_0 := v_0.Args[0] 5896 if v_0_0.Op != OpConst64 { 5897 break 5898 } 5899 t := v_0_0.Type 5900 d := v_0_0.AuxInt 5901 x := v_0.Args[1] 5902 v_1 := v.Args[1] 5903 if v_1.Op != OpConst64 { 5904 break 5905 } 5906 if v_1.Type != t { 5907 break 5908 } 5909 c := v_1.AuxInt 5910 v.reset(OpAnd64) 5911 v0 := b.NewValue0(v.Pos, OpConst64, t) 5912 v0.AuxInt = c & d 5913 v.AddArg(v0) 5914 v.AddArg(x) 5915 return true 5916 } 5917 // match: (And64 (And64 x (Const64 <t> [d])) (Const64 <t> [c])) 5918 // cond: 5919 // result: (And64 (Const64 <t> [c&d]) x) 5920 for { 5921 _ = v.Args[1] 5922 v_0 := v.Args[0] 5923 if v_0.Op != OpAnd64 { 5924 break 5925 } 5926 _ = v_0.Args[1] 5927 x := v_0.Args[0] 5928 v_0_1 := v_0.Args[1] 5929 if v_0_1.Op != OpConst64 { 5930 break 5931 } 5932 t := v_0_1.Type 5933 d := v_0_1.AuxInt 5934 v_1 := v.Args[1] 5935 if v_1.Op != OpConst64 { 5936 break 5937 } 5938 if v_1.Type != t { 5939 break 5940 } 5941 c := v_1.AuxInt 5942 v.reset(OpAnd64) 5943 v0 := b.NewValue0(v.Pos, OpConst64, t) 5944 v0.AuxInt = c & d 5945 v.AddArg(v0) 5946 v.AddArg(x) 5947 return true 5948 } 5949 return false 5950 } 5951 func rewriteValuegeneric_OpAnd8_0(v *Value) bool { 5952 // match: (And8 (Const8 [c]) (Const8 [d])) 5953 // cond: 5954 // result: (Const8 [int64(int8(c&d))]) 5955 for { 5956 _ = v.Args[1] 5957 v_0 := v.Args[0] 5958 if v_0.Op != OpConst8 { 5959 break 5960 } 5961 c := v_0.AuxInt 5962 v_1 := v.Args[1] 5963 if v_1.Op != OpConst8 { 5964 break 5965 } 5966 d := v_1.AuxInt 5967 v.reset(OpConst8) 5968 v.AuxInt = int64(int8(c & d)) 5969 return true 5970 } 5971 // match: (And8 (Const8 [d]) (Const8 [c])) 5972 // cond: 5973 // result: (Const8 [int64(int8(c&d))]) 5974 for { 5975 _ = v.Args[1] 5976 v_0 := v.Args[0] 5977 if v_0.Op != OpConst8 { 5978 break 5979 } 5980 d := v_0.AuxInt 5981 v_1 := v.Args[1] 5982 if v_1.Op != OpConst8 { 5983 break 5984 } 5985 c := v_1.AuxInt 5986 v.reset(OpConst8) 5987 v.AuxInt = int64(int8(c & d)) 5988 return true 5989 } 5990 // match: (And8 x x) 5991 // cond: 5992 // result: x 5993 for { 5994 _ = v.Args[1] 5995 x := v.Args[0] 5996 if x != v.Args[1] { 5997 break 5998 } 5999 v.reset(OpCopy) 6000 v.Type = x.Type 6001 v.AddArg(x) 6002 return true 6003 } 6004 // match: (And8 (Const8 [-1]) x) 6005 // cond: 6006 // result: x 6007 for { 6008 _ = v.Args[1] 6009 v_0 := v.Args[0] 6010 if v_0.Op != OpConst8 { 6011 break 6012 } 6013 if v_0.AuxInt != -1 { 6014 break 6015 } 6016 x := v.Args[1] 6017 v.reset(OpCopy) 6018 v.Type = x.Type 6019 v.AddArg(x) 6020 return true 6021 } 6022 // match: (And8 x (Const8 [-1])) 6023 // cond: 6024 // result: x 6025 for { 6026 _ = v.Args[1] 6027 x := v.Args[0] 6028 v_1 := v.Args[1] 6029 if v_1.Op != OpConst8 { 6030 break 6031 } 6032 if v_1.AuxInt != -1 { 6033 break 6034 } 6035 v.reset(OpCopy) 6036 v.Type = x.Type 6037 v.AddArg(x) 6038 return true 6039 } 6040 // match: (And8 (Const8 [0]) _) 6041 // cond: 6042 // result: (Const8 [0]) 6043 for { 6044 _ = v.Args[1] 6045 v_0 := v.Args[0] 6046 if v_0.Op != OpConst8 { 6047 break 6048 } 6049 if v_0.AuxInt != 0 { 6050 break 6051 } 6052 v.reset(OpConst8) 6053 v.AuxInt = 0 6054 return true 6055 } 6056 // match: (And8 _ (Const8 [0])) 6057 // cond: 6058 // result: (Const8 [0]) 6059 for { 6060 _ = v.Args[1] 6061 v_1 := v.Args[1] 6062 if v_1.Op != OpConst8 { 6063 break 6064 } 6065 if v_1.AuxInt != 0 { 6066 break 6067 } 6068 v.reset(OpConst8) 6069 v.AuxInt = 0 6070 return true 6071 } 6072 // match: (And8 x (And8 x y)) 6073 // cond: 6074 // result: (And8 x y) 6075 for { 6076 _ = v.Args[1] 6077 x := v.Args[0] 6078 v_1 := v.Args[1] 6079 if v_1.Op != OpAnd8 { 6080 break 6081 } 6082 _ = v_1.Args[1] 6083 if x != v_1.Args[0] { 6084 break 6085 } 6086 y := v_1.Args[1] 6087 v.reset(OpAnd8) 6088 v.AddArg(x) 6089 v.AddArg(y) 6090 return true 6091 } 6092 // match: (And8 x (And8 y x)) 6093 // cond: 6094 // result: (And8 x y) 6095 for { 6096 _ = v.Args[1] 6097 x := v.Args[0] 6098 v_1 := v.Args[1] 6099 if v_1.Op != OpAnd8 { 6100 break 6101 } 6102 _ = v_1.Args[1] 6103 y := v_1.Args[0] 6104 if x != v_1.Args[1] { 6105 break 6106 } 6107 v.reset(OpAnd8) 6108 v.AddArg(x) 6109 v.AddArg(y) 6110 return true 6111 } 6112 // match: (And8 (And8 x y) x) 6113 // cond: 6114 // result: (And8 x y) 6115 for { 6116 _ = v.Args[1] 6117 v_0 := v.Args[0] 6118 if v_0.Op != OpAnd8 { 6119 break 6120 } 6121 _ = v_0.Args[1] 6122 x := v_0.Args[0] 6123 y := v_0.Args[1] 6124 if x != v.Args[1] { 6125 break 6126 } 6127 v.reset(OpAnd8) 6128 v.AddArg(x) 6129 v.AddArg(y) 6130 return true 6131 } 6132 return false 6133 } 6134 func rewriteValuegeneric_OpAnd8_10(v *Value) bool { 6135 b := v.Block 6136 _ = b 6137 // match: (And8 (And8 y x) x) 6138 // cond: 6139 // result: (And8 x y) 6140 for { 6141 _ = v.Args[1] 6142 v_0 := v.Args[0] 6143 if v_0.Op != OpAnd8 { 6144 break 6145 } 6146 _ = v_0.Args[1] 6147 y := v_0.Args[0] 6148 x := v_0.Args[1] 6149 if x != v.Args[1] { 6150 break 6151 } 6152 v.reset(OpAnd8) 6153 v.AddArg(x) 6154 v.AddArg(y) 6155 return true 6156 } 6157 // match: (And8 (And8 i:(Const8 <t>) z) x) 6158 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6159 // result: (And8 i (And8 <t> z x)) 6160 for { 6161 _ = v.Args[1] 6162 v_0 := v.Args[0] 6163 if v_0.Op != OpAnd8 { 6164 break 6165 } 6166 _ = v_0.Args[1] 6167 i := v_0.Args[0] 6168 if i.Op != OpConst8 { 6169 break 6170 } 6171 t := i.Type 6172 z := v_0.Args[1] 6173 x := v.Args[1] 6174 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6175 break 6176 } 6177 v.reset(OpAnd8) 6178 v.AddArg(i) 6179 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6180 v0.AddArg(z) 6181 v0.AddArg(x) 6182 v.AddArg(v0) 6183 return true 6184 } 6185 // match: (And8 (And8 z i:(Const8 <t>)) x) 6186 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6187 // result: (And8 i (And8 <t> z x)) 6188 for { 6189 _ = v.Args[1] 6190 v_0 := v.Args[0] 6191 if v_0.Op != OpAnd8 { 6192 break 6193 } 6194 _ = v_0.Args[1] 6195 z := v_0.Args[0] 6196 i := v_0.Args[1] 6197 if i.Op != OpConst8 { 6198 break 6199 } 6200 t := i.Type 6201 x := v.Args[1] 6202 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6203 break 6204 } 6205 v.reset(OpAnd8) 6206 v.AddArg(i) 6207 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6208 v0.AddArg(z) 6209 v0.AddArg(x) 6210 v.AddArg(v0) 6211 return true 6212 } 6213 // match: (And8 x (And8 i:(Const8 <t>) z)) 6214 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6215 // result: (And8 i (And8 <t> z x)) 6216 for { 6217 _ = v.Args[1] 6218 x := v.Args[0] 6219 v_1 := v.Args[1] 6220 if v_1.Op != OpAnd8 { 6221 break 6222 } 6223 _ = v_1.Args[1] 6224 i := v_1.Args[0] 6225 if i.Op != OpConst8 { 6226 break 6227 } 6228 t := i.Type 6229 z := v_1.Args[1] 6230 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6231 break 6232 } 6233 v.reset(OpAnd8) 6234 v.AddArg(i) 6235 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6236 v0.AddArg(z) 6237 v0.AddArg(x) 6238 v.AddArg(v0) 6239 return true 6240 } 6241 // match: (And8 x (And8 z i:(Const8 <t>))) 6242 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6243 // result: (And8 i (And8 <t> z x)) 6244 for { 6245 _ = v.Args[1] 6246 x := v.Args[0] 6247 v_1 := v.Args[1] 6248 if v_1.Op != OpAnd8 { 6249 break 6250 } 6251 _ = v_1.Args[1] 6252 z := v_1.Args[0] 6253 i := v_1.Args[1] 6254 if i.Op != OpConst8 { 6255 break 6256 } 6257 t := i.Type 6258 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6259 break 6260 } 6261 v.reset(OpAnd8) 6262 v.AddArg(i) 6263 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6264 v0.AddArg(z) 6265 v0.AddArg(x) 6266 v.AddArg(v0) 6267 return true 6268 } 6269 // match: (And8 (Const8 <t> [c]) (And8 (Const8 <t> [d]) x)) 6270 // cond: 6271 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6272 for { 6273 _ = v.Args[1] 6274 v_0 := v.Args[0] 6275 if v_0.Op != OpConst8 { 6276 break 6277 } 6278 t := v_0.Type 6279 c := v_0.AuxInt 6280 v_1 := v.Args[1] 6281 if v_1.Op != OpAnd8 { 6282 break 6283 } 6284 _ = v_1.Args[1] 6285 v_1_0 := v_1.Args[0] 6286 if v_1_0.Op != OpConst8 { 6287 break 6288 } 6289 if v_1_0.Type != t { 6290 break 6291 } 6292 d := v_1_0.AuxInt 6293 x := v_1.Args[1] 6294 v.reset(OpAnd8) 6295 v0 := b.NewValue0(v.Pos, OpConst8, t) 6296 v0.AuxInt = int64(int8(c & d)) 6297 v.AddArg(v0) 6298 v.AddArg(x) 6299 return true 6300 } 6301 // match: (And8 (Const8 <t> [c]) (And8 x (Const8 <t> [d]))) 6302 // cond: 6303 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6304 for { 6305 _ = v.Args[1] 6306 v_0 := v.Args[0] 6307 if v_0.Op != OpConst8 { 6308 break 6309 } 6310 t := v_0.Type 6311 c := v_0.AuxInt 6312 v_1 := v.Args[1] 6313 if v_1.Op != OpAnd8 { 6314 break 6315 } 6316 _ = v_1.Args[1] 6317 x := v_1.Args[0] 6318 v_1_1 := v_1.Args[1] 6319 if v_1_1.Op != OpConst8 { 6320 break 6321 } 6322 if v_1_1.Type != t { 6323 break 6324 } 6325 d := v_1_1.AuxInt 6326 v.reset(OpAnd8) 6327 v0 := b.NewValue0(v.Pos, OpConst8, t) 6328 v0.AuxInt = int64(int8(c & d)) 6329 v.AddArg(v0) 6330 v.AddArg(x) 6331 return true 6332 } 6333 // match: (And8 (And8 (Const8 <t> [d]) x) (Const8 <t> [c])) 6334 // cond: 6335 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6336 for { 6337 _ = v.Args[1] 6338 v_0 := v.Args[0] 6339 if v_0.Op != OpAnd8 { 6340 break 6341 } 6342 _ = v_0.Args[1] 6343 v_0_0 := v_0.Args[0] 6344 if v_0_0.Op != OpConst8 { 6345 break 6346 } 6347 t := v_0_0.Type 6348 d := v_0_0.AuxInt 6349 x := v_0.Args[1] 6350 v_1 := v.Args[1] 6351 if v_1.Op != OpConst8 { 6352 break 6353 } 6354 if v_1.Type != t { 6355 break 6356 } 6357 c := v_1.AuxInt 6358 v.reset(OpAnd8) 6359 v0 := b.NewValue0(v.Pos, OpConst8, t) 6360 v0.AuxInt = int64(int8(c & d)) 6361 v.AddArg(v0) 6362 v.AddArg(x) 6363 return true 6364 } 6365 // match: (And8 (And8 x (Const8 <t> [d])) (Const8 <t> [c])) 6366 // cond: 6367 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6368 for { 6369 _ = v.Args[1] 6370 v_0 := v.Args[0] 6371 if v_0.Op != OpAnd8 { 6372 break 6373 } 6374 _ = v_0.Args[1] 6375 x := v_0.Args[0] 6376 v_0_1 := v_0.Args[1] 6377 if v_0_1.Op != OpConst8 { 6378 break 6379 } 6380 t := v_0_1.Type 6381 d := v_0_1.AuxInt 6382 v_1 := v.Args[1] 6383 if v_1.Op != OpConst8 { 6384 break 6385 } 6386 if v_1.Type != t { 6387 break 6388 } 6389 c := v_1.AuxInt 6390 v.reset(OpAnd8) 6391 v0 := b.NewValue0(v.Pos, OpConst8, t) 6392 v0.AuxInt = int64(int8(c & d)) 6393 v.AddArg(v0) 6394 v.AddArg(x) 6395 return true 6396 } 6397 return false 6398 } 6399 func rewriteValuegeneric_OpArg_0(v *Value) bool { 6400 b := v.Block 6401 _ = b 6402 config := b.Func.Config 6403 _ = config 6404 fe := b.Func.fe 6405 _ = fe 6406 typ := &b.Func.Config.Types 6407 _ = typ 6408 // match: (Arg {n} [off]) 6409 // cond: v.Type.IsString() 6410 // result: (StringMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize])) 6411 for { 6412 off := v.AuxInt 6413 n := v.Aux 6414 if !(v.Type.IsString()) { 6415 break 6416 } 6417 v.reset(OpStringMake) 6418 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6419 v0.AuxInt = off 6420 v0.Aux = n 6421 v.AddArg(v0) 6422 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 6423 v1.AuxInt = off + config.PtrSize 6424 v1.Aux = n 6425 v.AddArg(v1) 6426 return true 6427 } 6428 // match: (Arg {n} [off]) 6429 // cond: v.Type.IsSlice() 6430 // result: (SliceMake (Arg <v.Type.ElemType().PtrTo()> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize]) (Arg <typ.Int> {n} [off+2*config.PtrSize])) 6431 for { 6432 off := v.AuxInt 6433 n := v.Aux 6434 if !(v.Type.IsSlice()) { 6435 break 6436 } 6437 v.reset(OpSliceMake) 6438 v0 := b.NewValue0(v.Pos, OpArg, v.Type.ElemType().PtrTo()) 6439 v0.AuxInt = off 6440 v0.Aux = n 6441 v.AddArg(v0) 6442 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 6443 v1.AuxInt = off + config.PtrSize 6444 v1.Aux = n 6445 v.AddArg(v1) 6446 v2 := b.NewValue0(v.Pos, OpArg, typ.Int) 6447 v2.AuxInt = off + 2*config.PtrSize 6448 v2.Aux = n 6449 v.AddArg(v2) 6450 return true 6451 } 6452 // match: (Arg {n} [off]) 6453 // cond: v.Type.IsInterface() 6454 // result: (IMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.BytePtr> {n} [off+config.PtrSize])) 6455 for { 6456 off := v.AuxInt 6457 n := v.Aux 6458 if !(v.Type.IsInterface()) { 6459 break 6460 } 6461 v.reset(OpIMake) 6462 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6463 v0.AuxInt = off 6464 v0.Aux = n 6465 v.AddArg(v0) 6466 v1 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6467 v1.AuxInt = off + config.PtrSize 6468 v1.Aux = n 6469 v.AddArg(v1) 6470 return true 6471 } 6472 // match: (Arg {n} [off]) 6473 // cond: v.Type.IsComplex() && v.Type.Size() == 16 6474 // result: (ComplexMake (Arg <typ.Float64> {n} [off]) (Arg <typ.Float64> {n} [off+8])) 6475 for { 6476 off := v.AuxInt 6477 n := v.Aux 6478 if !(v.Type.IsComplex() && v.Type.Size() == 16) { 6479 break 6480 } 6481 v.reset(OpComplexMake) 6482 v0 := b.NewValue0(v.Pos, OpArg, typ.Float64) 6483 v0.AuxInt = off 6484 v0.Aux = n 6485 v.AddArg(v0) 6486 v1 := b.NewValue0(v.Pos, OpArg, typ.Float64) 6487 v1.AuxInt = off + 8 6488 v1.Aux = n 6489 v.AddArg(v1) 6490 return true 6491 } 6492 // match: (Arg {n} [off]) 6493 // cond: v.Type.IsComplex() && v.Type.Size() == 8 6494 // result: (ComplexMake (Arg <typ.Float32> {n} [off]) (Arg <typ.Float32> {n} [off+4])) 6495 for { 6496 off := v.AuxInt 6497 n := v.Aux 6498 if !(v.Type.IsComplex() && v.Type.Size() == 8) { 6499 break 6500 } 6501 v.reset(OpComplexMake) 6502 v0 := b.NewValue0(v.Pos, OpArg, typ.Float32) 6503 v0.AuxInt = off 6504 v0.Aux = n 6505 v.AddArg(v0) 6506 v1 := b.NewValue0(v.Pos, OpArg, typ.Float32) 6507 v1.AuxInt = off + 4 6508 v1.Aux = n 6509 v.AddArg(v1) 6510 return true 6511 } 6512 // match: (Arg <t>) 6513 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 6514 // result: (StructMake0) 6515 for { 6516 t := v.Type 6517 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 6518 break 6519 } 6520 v.reset(OpStructMake0) 6521 return true 6522 } 6523 // match: (Arg <t> {n} [off]) 6524 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 6525 // result: (StructMake1 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])) 6526 for { 6527 t := v.Type 6528 off := v.AuxInt 6529 n := v.Aux 6530 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 6531 break 6532 } 6533 v.reset(OpStructMake1) 6534 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6535 v0.AuxInt = off + t.FieldOff(0) 6536 v0.Aux = n 6537 v.AddArg(v0) 6538 return true 6539 } 6540 // match: (Arg <t> {n} [off]) 6541 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 6542 // result: (StructMake2 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])) 6543 for { 6544 t := v.Type 6545 off := v.AuxInt 6546 n := v.Aux 6547 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 6548 break 6549 } 6550 v.reset(OpStructMake2) 6551 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6552 v0.AuxInt = off + t.FieldOff(0) 6553 v0.Aux = n 6554 v.AddArg(v0) 6555 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6556 v1.AuxInt = off + t.FieldOff(1) 6557 v1.Aux = n 6558 v.AddArg(v1) 6559 return true 6560 } 6561 // match: (Arg <t> {n} [off]) 6562 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 6563 // 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)])) 6564 for { 6565 t := v.Type 6566 off := v.AuxInt 6567 n := v.Aux 6568 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 6569 break 6570 } 6571 v.reset(OpStructMake3) 6572 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6573 v0.AuxInt = off + t.FieldOff(0) 6574 v0.Aux = n 6575 v.AddArg(v0) 6576 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6577 v1.AuxInt = off + t.FieldOff(1) 6578 v1.Aux = n 6579 v.AddArg(v1) 6580 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 6581 v2.AuxInt = off + t.FieldOff(2) 6582 v2.Aux = n 6583 v.AddArg(v2) 6584 return true 6585 } 6586 // match: (Arg <t> {n} [off]) 6587 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 6588 // 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)])) 6589 for { 6590 t := v.Type 6591 off := v.AuxInt 6592 n := v.Aux 6593 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 6594 break 6595 } 6596 v.reset(OpStructMake4) 6597 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6598 v0.AuxInt = off + t.FieldOff(0) 6599 v0.Aux = n 6600 v.AddArg(v0) 6601 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6602 v1.AuxInt = off + t.FieldOff(1) 6603 v1.Aux = n 6604 v.AddArg(v1) 6605 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 6606 v2.AuxInt = off + t.FieldOff(2) 6607 v2.Aux = n 6608 v.AddArg(v2) 6609 v3 := b.NewValue0(v.Pos, OpArg, t.FieldType(3)) 6610 v3.AuxInt = off + t.FieldOff(3) 6611 v3.Aux = n 6612 v.AddArg(v3) 6613 return true 6614 } 6615 return false 6616 } 6617 func rewriteValuegeneric_OpArg_10(v *Value) bool { 6618 b := v.Block 6619 _ = b 6620 fe := b.Func.fe 6621 _ = fe 6622 // match: (Arg <t>) 6623 // cond: t.IsArray() && t.NumElem() == 0 6624 // result: (ArrayMake0) 6625 for { 6626 t := v.Type 6627 if !(t.IsArray() && t.NumElem() == 0) { 6628 break 6629 } 6630 v.reset(OpArrayMake0) 6631 return true 6632 } 6633 // match: (Arg <t> {n} [off]) 6634 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 6635 // result: (ArrayMake1 (Arg <t.ElemType()> {n} [off])) 6636 for { 6637 t := v.Type 6638 off := v.AuxInt 6639 n := v.Aux 6640 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 6641 break 6642 } 6643 v.reset(OpArrayMake1) 6644 v0 := b.NewValue0(v.Pos, OpArg, t.ElemType()) 6645 v0.AuxInt = off 6646 v0.Aux = n 6647 v.AddArg(v0) 6648 return true 6649 } 6650 return false 6651 } 6652 func rewriteValuegeneric_OpArraySelect_0(v *Value) bool { 6653 // match: (ArraySelect (ArrayMake1 x)) 6654 // cond: 6655 // result: x 6656 for { 6657 v_0 := v.Args[0] 6658 if v_0.Op != OpArrayMake1 { 6659 break 6660 } 6661 x := v_0.Args[0] 6662 v.reset(OpCopy) 6663 v.Type = x.Type 6664 v.AddArg(x) 6665 return true 6666 } 6667 // match: (ArraySelect [0] (Load ptr mem)) 6668 // cond: 6669 // result: (Load ptr mem) 6670 for { 6671 if v.AuxInt != 0 { 6672 break 6673 } 6674 v_0 := v.Args[0] 6675 if v_0.Op != OpLoad { 6676 break 6677 } 6678 _ = v_0.Args[1] 6679 ptr := v_0.Args[0] 6680 mem := v_0.Args[1] 6681 v.reset(OpLoad) 6682 v.AddArg(ptr) 6683 v.AddArg(mem) 6684 return true 6685 } 6686 // match: (ArraySelect [0] x:(IData _)) 6687 // cond: 6688 // result: x 6689 for { 6690 if v.AuxInt != 0 { 6691 break 6692 } 6693 x := v.Args[0] 6694 if x.Op != OpIData { 6695 break 6696 } 6697 v.reset(OpCopy) 6698 v.Type = x.Type 6699 v.AddArg(x) 6700 return true 6701 } 6702 return false 6703 } 6704 func rewriteValuegeneric_OpCom16_0(v *Value) bool { 6705 // match: (Com16 (Com16 x)) 6706 // cond: 6707 // result: x 6708 for { 6709 v_0 := v.Args[0] 6710 if v_0.Op != OpCom16 { 6711 break 6712 } 6713 x := v_0.Args[0] 6714 v.reset(OpCopy) 6715 v.Type = x.Type 6716 v.AddArg(x) 6717 return true 6718 } 6719 // match: (Com16 (Const16 [c])) 6720 // cond: 6721 // result: (Const16 [^c]) 6722 for { 6723 v_0 := v.Args[0] 6724 if v_0.Op != OpConst16 { 6725 break 6726 } 6727 c := v_0.AuxInt 6728 v.reset(OpConst16) 6729 v.AuxInt = ^c 6730 return true 6731 } 6732 return false 6733 } 6734 func rewriteValuegeneric_OpCom32_0(v *Value) bool { 6735 // match: (Com32 (Com32 x)) 6736 // cond: 6737 // result: x 6738 for { 6739 v_0 := v.Args[0] 6740 if v_0.Op != OpCom32 { 6741 break 6742 } 6743 x := v_0.Args[0] 6744 v.reset(OpCopy) 6745 v.Type = x.Type 6746 v.AddArg(x) 6747 return true 6748 } 6749 // match: (Com32 (Const32 [c])) 6750 // cond: 6751 // result: (Const32 [^c]) 6752 for { 6753 v_0 := v.Args[0] 6754 if v_0.Op != OpConst32 { 6755 break 6756 } 6757 c := v_0.AuxInt 6758 v.reset(OpConst32) 6759 v.AuxInt = ^c 6760 return true 6761 } 6762 return false 6763 } 6764 func rewriteValuegeneric_OpCom64_0(v *Value) bool { 6765 // match: (Com64 (Com64 x)) 6766 // cond: 6767 // result: x 6768 for { 6769 v_0 := v.Args[0] 6770 if v_0.Op != OpCom64 { 6771 break 6772 } 6773 x := v_0.Args[0] 6774 v.reset(OpCopy) 6775 v.Type = x.Type 6776 v.AddArg(x) 6777 return true 6778 } 6779 // match: (Com64 (Const64 [c])) 6780 // cond: 6781 // result: (Const64 [^c]) 6782 for { 6783 v_0 := v.Args[0] 6784 if v_0.Op != OpConst64 { 6785 break 6786 } 6787 c := v_0.AuxInt 6788 v.reset(OpConst64) 6789 v.AuxInt = ^c 6790 return true 6791 } 6792 return false 6793 } 6794 func rewriteValuegeneric_OpCom8_0(v *Value) bool { 6795 // match: (Com8 (Com8 x)) 6796 // cond: 6797 // result: x 6798 for { 6799 v_0 := v.Args[0] 6800 if v_0.Op != OpCom8 { 6801 break 6802 } 6803 x := v_0.Args[0] 6804 v.reset(OpCopy) 6805 v.Type = x.Type 6806 v.AddArg(x) 6807 return true 6808 } 6809 // match: (Com8 (Const8 [c])) 6810 // cond: 6811 // result: (Const8 [^c]) 6812 for { 6813 v_0 := v.Args[0] 6814 if v_0.Op != OpConst8 { 6815 break 6816 } 6817 c := v_0.AuxInt 6818 v.reset(OpConst8) 6819 v.AuxInt = ^c 6820 return true 6821 } 6822 return false 6823 } 6824 func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { 6825 b := v.Block 6826 _ = b 6827 typ := &b.Func.Config.Types 6828 _ = typ 6829 // match: (ConstInterface) 6830 // cond: 6831 // result: (IMake (ConstNil <typ.BytePtr>) (ConstNil <typ.BytePtr>)) 6832 for { 6833 v.reset(OpIMake) 6834 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6835 v.AddArg(v0) 6836 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6837 v.AddArg(v1) 6838 return true 6839 } 6840 } 6841 func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { 6842 b := v.Block 6843 _ = b 6844 config := b.Func.Config 6845 _ = config 6846 typ := &b.Func.Config.Types 6847 _ = typ 6848 // match: (ConstSlice) 6849 // cond: config.PtrSize == 4 6850 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const32 <typ.Int> [0]) (Const32 <typ.Int> [0])) 6851 for { 6852 if !(config.PtrSize == 4) { 6853 break 6854 } 6855 v.reset(OpSliceMake) 6856 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 6857 v.AddArg(v0) 6858 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6859 v1.AuxInt = 0 6860 v.AddArg(v1) 6861 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6862 v2.AuxInt = 0 6863 v.AddArg(v2) 6864 return true 6865 } 6866 // match: (ConstSlice) 6867 // cond: config.PtrSize == 8 6868 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const64 <typ.Int> [0]) (Const64 <typ.Int> [0])) 6869 for { 6870 if !(config.PtrSize == 8) { 6871 break 6872 } 6873 v.reset(OpSliceMake) 6874 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 6875 v.AddArg(v0) 6876 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6877 v1.AuxInt = 0 6878 v.AddArg(v1) 6879 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6880 v2.AuxInt = 0 6881 v.AddArg(v2) 6882 return true 6883 } 6884 return false 6885 } 6886 func rewriteValuegeneric_OpConstString_0(v *Value) bool { 6887 b := v.Block 6888 _ = b 6889 config := b.Func.Config 6890 _ = config 6891 fe := b.Func.fe 6892 _ = fe 6893 typ := &b.Func.Config.Types 6894 _ = typ 6895 // match: (ConstString {s}) 6896 // cond: config.PtrSize == 4 && s.(string) == "" 6897 // result: (StringMake (ConstNil) (Const32 <typ.Int> [0])) 6898 for { 6899 s := v.Aux 6900 if !(config.PtrSize == 4 && s.(string) == "") { 6901 break 6902 } 6903 v.reset(OpStringMake) 6904 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6905 v.AddArg(v0) 6906 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6907 v1.AuxInt = 0 6908 v.AddArg(v1) 6909 return true 6910 } 6911 // match: (ConstString {s}) 6912 // cond: config.PtrSize == 8 && s.(string) == "" 6913 // result: (StringMake (ConstNil) (Const64 <typ.Int> [0])) 6914 for { 6915 s := v.Aux 6916 if !(config.PtrSize == 8 && s.(string) == "") { 6917 break 6918 } 6919 v.reset(OpStringMake) 6920 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6921 v.AddArg(v0) 6922 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6923 v1.AuxInt = 0 6924 v.AddArg(v1) 6925 return true 6926 } 6927 // match: (ConstString {s}) 6928 // cond: config.PtrSize == 4 && s.(string) != "" 6929 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const32 <typ.Int> [int64(len(s.(string)))])) 6930 for { 6931 s := v.Aux 6932 if !(config.PtrSize == 4 && s.(string) != "") { 6933 break 6934 } 6935 v.reset(OpStringMake) 6936 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 6937 v0.Aux = fe.StringData(s.(string)) 6938 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 6939 v0.AddArg(v1) 6940 v.AddArg(v0) 6941 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6942 v2.AuxInt = int64(len(s.(string))) 6943 v.AddArg(v2) 6944 return true 6945 } 6946 // match: (ConstString {s}) 6947 // cond: config.PtrSize == 8 && s.(string) != "" 6948 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const64 <typ.Int> [int64(len(s.(string)))])) 6949 for { 6950 s := v.Aux 6951 if !(config.PtrSize == 8 && s.(string) != "") { 6952 break 6953 } 6954 v.reset(OpStringMake) 6955 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 6956 v0.Aux = fe.StringData(s.(string)) 6957 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 6958 v0.AddArg(v1) 6959 v.AddArg(v0) 6960 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6961 v2.AuxInt = int64(len(s.(string))) 6962 v.AddArg(v2) 6963 return true 6964 } 6965 return false 6966 } 6967 func rewriteValuegeneric_OpConvert_0(v *Value) bool { 6968 // match: (Convert (Add64 (Convert ptr mem) off) mem) 6969 // cond: 6970 // result: (Add64 ptr off) 6971 for { 6972 _ = v.Args[1] 6973 v_0 := v.Args[0] 6974 if v_0.Op != OpAdd64 { 6975 break 6976 } 6977 _ = v_0.Args[1] 6978 v_0_0 := v_0.Args[0] 6979 if v_0_0.Op != OpConvert { 6980 break 6981 } 6982 _ = v_0_0.Args[1] 6983 ptr := v_0_0.Args[0] 6984 mem := v_0_0.Args[1] 6985 off := v_0.Args[1] 6986 if mem != v.Args[1] { 6987 break 6988 } 6989 v.reset(OpAdd64) 6990 v.AddArg(ptr) 6991 v.AddArg(off) 6992 return true 6993 } 6994 // match: (Convert (Add64 off (Convert ptr mem)) mem) 6995 // cond: 6996 // result: (Add64 ptr off) 6997 for { 6998 _ = v.Args[1] 6999 v_0 := v.Args[0] 7000 if v_0.Op != OpAdd64 { 7001 break 7002 } 7003 _ = v_0.Args[1] 7004 off := v_0.Args[0] 7005 v_0_1 := v_0.Args[1] 7006 if v_0_1.Op != OpConvert { 7007 break 7008 } 7009 _ = v_0_1.Args[1] 7010 ptr := v_0_1.Args[0] 7011 mem := v_0_1.Args[1] 7012 if mem != v.Args[1] { 7013 break 7014 } 7015 v.reset(OpAdd64) 7016 v.AddArg(ptr) 7017 v.AddArg(off) 7018 return true 7019 } 7020 // match: (Convert (Convert ptr mem) mem) 7021 // cond: 7022 // result: ptr 7023 for { 7024 _ = v.Args[1] 7025 v_0 := v.Args[0] 7026 if v_0.Op != OpConvert { 7027 break 7028 } 7029 _ = v_0.Args[1] 7030 ptr := v_0.Args[0] 7031 mem := v_0.Args[1] 7032 if mem != v.Args[1] { 7033 break 7034 } 7035 v.reset(OpCopy) 7036 v.Type = ptr.Type 7037 v.AddArg(ptr) 7038 return true 7039 } 7040 return false 7041 } 7042 func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { 7043 // match: (Cvt32Fto64F (Const32F [c])) 7044 // cond: 7045 // result: (Const64F [c]) 7046 for { 7047 v_0 := v.Args[0] 7048 if v_0.Op != OpConst32F { 7049 break 7050 } 7051 c := v_0.AuxInt 7052 v.reset(OpConst64F) 7053 v.AuxInt = c 7054 return true 7055 } 7056 return false 7057 } 7058 func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { 7059 // match: (Cvt64Fto32F (Const64F [c])) 7060 // cond: 7061 // result: (Const32F [f2i(float64(i2f32(c)))]) 7062 for { 7063 v_0 := v.Args[0] 7064 if v_0.Op != OpConst64F { 7065 break 7066 } 7067 c := v_0.AuxInt 7068 v.reset(OpConst32F) 7069 v.AuxInt = f2i(float64(i2f32(c))) 7070 return true 7071 } 7072 return false 7073 } 7074 func rewriteValuegeneric_OpDiv16_0(v *Value) bool { 7075 b := v.Block 7076 _ = b 7077 typ := &b.Func.Config.Types 7078 _ = typ 7079 // match: (Div16 (Const16 [c]) (Const16 [d])) 7080 // cond: d != 0 7081 // result: (Const16 [int64(int16(c)/int16(d))]) 7082 for { 7083 _ = v.Args[1] 7084 v_0 := v.Args[0] 7085 if v_0.Op != OpConst16 { 7086 break 7087 } 7088 c := v_0.AuxInt 7089 v_1 := v.Args[1] 7090 if v_1.Op != OpConst16 { 7091 break 7092 } 7093 d := v_1.AuxInt 7094 if !(d != 0) { 7095 break 7096 } 7097 v.reset(OpConst16) 7098 v.AuxInt = int64(int16(c) / int16(d)) 7099 return true 7100 } 7101 // match: (Div16 <t> n (Const16 [c])) 7102 // cond: c < 0 && c != -1<<15 7103 // result: (Neg16 (Div16 <t> n (Const16 <t> [-c]))) 7104 for { 7105 t := v.Type 7106 _ = v.Args[1] 7107 n := v.Args[0] 7108 v_1 := v.Args[1] 7109 if v_1.Op != OpConst16 { 7110 break 7111 } 7112 c := v_1.AuxInt 7113 if !(c < 0 && c != -1<<15) { 7114 break 7115 } 7116 v.reset(OpNeg16) 7117 v0 := b.NewValue0(v.Pos, OpDiv16, t) 7118 v0.AddArg(n) 7119 v1 := b.NewValue0(v.Pos, OpConst16, t) 7120 v1.AuxInt = -c 7121 v0.AddArg(v1) 7122 v.AddArg(v0) 7123 return true 7124 } 7125 // match: (Div16 <t> x (Const16 [-1<<15])) 7126 // cond: 7127 // result: (Rsh16Ux64 (And16 <t> x (Neg16 <t> x)) (Const64 <typ.UInt64> [15])) 7128 for { 7129 t := v.Type 7130 _ = v.Args[1] 7131 x := v.Args[0] 7132 v_1 := v.Args[1] 7133 if v_1.Op != OpConst16 { 7134 break 7135 } 7136 if v_1.AuxInt != -1<<15 { 7137 break 7138 } 7139 v.reset(OpRsh16Ux64) 7140 v0 := b.NewValue0(v.Pos, OpAnd16, t) 7141 v0.AddArg(x) 7142 v1 := b.NewValue0(v.Pos, OpNeg16, t) 7143 v1.AddArg(x) 7144 v0.AddArg(v1) 7145 v.AddArg(v0) 7146 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7147 v2.AuxInt = 15 7148 v.AddArg(v2) 7149 return true 7150 } 7151 // match: (Div16 <t> n (Const16 [c])) 7152 // cond: isPowerOfTwo(c) 7153 // 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)])) 7154 for { 7155 t := v.Type 7156 _ = v.Args[1] 7157 n := v.Args[0] 7158 v_1 := v.Args[1] 7159 if v_1.Op != OpConst16 { 7160 break 7161 } 7162 c := v_1.AuxInt 7163 if !(isPowerOfTwo(c)) { 7164 break 7165 } 7166 v.reset(OpRsh16x64) 7167 v0 := b.NewValue0(v.Pos, OpAdd16, t) 7168 v0.AddArg(n) 7169 v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) 7170 v2 := b.NewValue0(v.Pos, OpRsh16x64, t) 7171 v2.AddArg(n) 7172 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7173 v3.AuxInt = 15 7174 v2.AddArg(v3) 7175 v1.AddArg(v2) 7176 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7177 v4.AuxInt = 16 - log2(c) 7178 v1.AddArg(v4) 7179 v0.AddArg(v1) 7180 v.AddArg(v0) 7181 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7182 v5.AuxInt = log2(c) 7183 v.AddArg(v5) 7184 return true 7185 } 7186 // match: (Div16 <t> x (Const16 [c])) 7187 // cond: smagicOK(16,c) 7188 // 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]))) 7189 for { 7190 t := v.Type 7191 _ = v.Args[1] 7192 x := v.Args[0] 7193 v_1 := v.Args[1] 7194 if v_1.Op != OpConst16 { 7195 break 7196 } 7197 c := v_1.AuxInt 7198 if !(smagicOK(16, c)) { 7199 break 7200 } 7201 v.reset(OpSub16) 7202 v.Type = t 7203 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7204 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7205 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7206 v2.AuxInt = int64(smagic(16, c).m) 7207 v1.AddArg(v2) 7208 v3 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 7209 v3.AddArg(x) 7210 v1.AddArg(v3) 7211 v0.AddArg(v1) 7212 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7213 v4.AuxInt = 16 + smagic(16, c).s 7214 v0.AddArg(v4) 7215 v.AddArg(v0) 7216 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7217 v6 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 7218 v6.AddArg(x) 7219 v5.AddArg(v6) 7220 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7221 v7.AuxInt = 31 7222 v5.AddArg(v7) 7223 v.AddArg(v5) 7224 return true 7225 } 7226 return false 7227 } 7228 func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { 7229 b := v.Block 7230 _ = b 7231 config := b.Func.Config 7232 _ = config 7233 typ := &b.Func.Config.Types 7234 _ = typ 7235 // match: (Div16u (Const16 [c]) (Const16 [d])) 7236 // cond: d != 0 7237 // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) 7238 for { 7239 _ = v.Args[1] 7240 v_0 := v.Args[0] 7241 if v_0.Op != OpConst16 { 7242 break 7243 } 7244 c := v_0.AuxInt 7245 v_1 := v.Args[1] 7246 if v_1.Op != OpConst16 { 7247 break 7248 } 7249 d := v_1.AuxInt 7250 if !(d != 0) { 7251 break 7252 } 7253 v.reset(OpConst16) 7254 v.AuxInt = int64(int16(uint16(c) / uint16(d))) 7255 return true 7256 } 7257 // match: (Div16u n (Const16 [c])) 7258 // cond: isPowerOfTwo(c&0xffff) 7259 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 7260 for { 7261 _ = v.Args[1] 7262 n := v.Args[0] 7263 v_1 := v.Args[1] 7264 if v_1.Op != OpConst16 { 7265 break 7266 } 7267 c := v_1.AuxInt 7268 if !(isPowerOfTwo(c & 0xffff)) { 7269 break 7270 } 7271 v.reset(OpRsh16Ux64) 7272 v.AddArg(n) 7273 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7274 v0.AuxInt = log2(c & 0xffff) 7275 v.AddArg(v0) 7276 return true 7277 } 7278 // match: (Div16u x (Const16 [c])) 7279 // cond: umagicOK(16, c) && config.RegSize == 8 7280 // 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]))) 7281 for { 7282 _ = v.Args[1] 7283 x := v.Args[0] 7284 v_1 := v.Args[1] 7285 if v_1.Op != OpConst16 { 7286 break 7287 } 7288 c := v_1.AuxInt 7289 if !(umagicOK(16, c) && config.RegSize == 8) { 7290 break 7291 } 7292 v.reset(OpTrunc64to16) 7293 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7294 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7295 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7296 v2.AuxInt = int64(1<<16 + umagic(16, c).m) 7297 v1.AddArg(v2) 7298 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) 7299 v3.AddArg(x) 7300 v1.AddArg(v3) 7301 v0.AddArg(v1) 7302 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7303 v4.AuxInt = 16 + umagic(16, c).s 7304 v0.AddArg(v4) 7305 v.AddArg(v0) 7306 return true 7307 } 7308 // match: (Div16u x (Const16 [c])) 7309 // cond: umagicOK(16, c) && config.RegSize == 4 && umagic(16,c).m&1 == 0 7310 // 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]))) 7311 for { 7312 _ = v.Args[1] 7313 x := v.Args[0] 7314 v_1 := v.Args[1] 7315 if v_1.Op != OpConst16 { 7316 break 7317 } 7318 c := v_1.AuxInt 7319 if !(umagicOK(16, c) && config.RegSize == 4 && umagic(16, c).m&1 == 0) { 7320 break 7321 } 7322 v.reset(OpTrunc32to16) 7323 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7324 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7325 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7326 v2.AuxInt = int64(1<<15 + umagic(16, c).m/2) 7327 v1.AddArg(v2) 7328 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7329 v3.AddArg(x) 7330 v1.AddArg(v3) 7331 v0.AddArg(v1) 7332 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7333 v4.AuxInt = 16 + umagic(16, c).s - 1 7334 v0.AddArg(v4) 7335 v.AddArg(v0) 7336 return true 7337 } 7338 // match: (Div16u x (Const16 [c])) 7339 // cond: umagicOK(16, c) && config.RegSize == 4 && c&1 == 0 7340 // 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]))) 7341 for { 7342 _ = v.Args[1] 7343 x := v.Args[0] 7344 v_1 := v.Args[1] 7345 if v_1.Op != OpConst16 { 7346 break 7347 } 7348 c := v_1.AuxInt 7349 if !(umagicOK(16, c) && config.RegSize == 4 && c&1 == 0) { 7350 break 7351 } 7352 v.reset(OpTrunc32to16) 7353 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7354 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7355 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7356 v2.AuxInt = int64(1<<15 + (umagic(16, c).m+1)/2) 7357 v1.AddArg(v2) 7358 v3 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7359 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7360 v4.AddArg(x) 7361 v3.AddArg(v4) 7362 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7363 v5.AuxInt = 1 7364 v3.AddArg(v5) 7365 v1.AddArg(v3) 7366 v0.AddArg(v1) 7367 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7368 v6.AuxInt = 16 + umagic(16, c).s - 2 7369 v0.AddArg(v6) 7370 v.AddArg(v0) 7371 return true 7372 } 7373 // match: (Div16u x (Const16 [c])) 7374 // cond: umagicOK(16, c) && config.RegSize == 4 7375 // 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]))) 7376 for { 7377 _ = v.Args[1] 7378 x := v.Args[0] 7379 v_1 := v.Args[1] 7380 if v_1.Op != OpConst16 { 7381 break 7382 } 7383 c := v_1.AuxInt 7384 if !(umagicOK(16, c) && config.RegSize == 4) { 7385 break 7386 } 7387 v.reset(OpTrunc32to16) 7388 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7389 v1 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 7390 v2 := b.NewValue0(v.Pos, OpLsh32x64, typ.UInt32) 7391 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7392 v3.AddArg(x) 7393 v2.AddArg(v3) 7394 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7395 v4.AuxInt = 16 7396 v2.AddArg(v4) 7397 v1.AddArg(v2) 7398 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7399 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7400 v6.AuxInt = int64(umagic(16, c).m) 7401 v5.AddArg(v6) 7402 v7 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7403 v7.AddArg(x) 7404 v5.AddArg(v7) 7405 v1.AddArg(v5) 7406 v0.AddArg(v1) 7407 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7408 v8.AuxInt = 16 + umagic(16, c).s - 1 7409 v0.AddArg(v8) 7410 v.AddArg(v0) 7411 return true 7412 } 7413 return false 7414 } 7415 func rewriteValuegeneric_OpDiv32_0(v *Value) bool { 7416 b := v.Block 7417 _ = b 7418 config := b.Func.Config 7419 _ = config 7420 typ := &b.Func.Config.Types 7421 _ = typ 7422 // match: (Div32 (Const32 [c]) (Const32 [d])) 7423 // cond: d != 0 7424 // result: (Const32 [int64(int32(c)/int32(d))]) 7425 for { 7426 _ = v.Args[1] 7427 v_0 := v.Args[0] 7428 if v_0.Op != OpConst32 { 7429 break 7430 } 7431 c := v_0.AuxInt 7432 v_1 := v.Args[1] 7433 if v_1.Op != OpConst32 { 7434 break 7435 } 7436 d := v_1.AuxInt 7437 if !(d != 0) { 7438 break 7439 } 7440 v.reset(OpConst32) 7441 v.AuxInt = int64(int32(c) / int32(d)) 7442 return true 7443 } 7444 // match: (Div32 <t> n (Const32 [c])) 7445 // cond: c < 0 && c != -1<<31 7446 // result: (Neg32 (Div32 <t> n (Const32 <t> [-c]))) 7447 for { 7448 t := v.Type 7449 _ = v.Args[1] 7450 n := v.Args[0] 7451 v_1 := v.Args[1] 7452 if v_1.Op != OpConst32 { 7453 break 7454 } 7455 c := v_1.AuxInt 7456 if !(c < 0 && c != -1<<31) { 7457 break 7458 } 7459 v.reset(OpNeg32) 7460 v0 := b.NewValue0(v.Pos, OpDiv32, t) 7461 v0.AddArg(n) 7462 v1 := b.NewValue0(v.Pos, OpConst32, t) 7463 v1.AuxInt = -c 7464 v0.AddArg(v1) 7465 v.AddArg(v0) 7466 return true 7467 } 7468 // match: (Div32 <t> x (Const32 [-1<<31])) 7469 // cond: 7470 // result: (Rsh32Ux64 (And32 <t> x (Neg32 <t> x)) (Const64 <typ.UInt64> [31])) 7471 for { 7472 t := v.Type 7473 _ = v.Args[1] 7474 x := v.Args[0] 7475 v_1 := v.Args[1] 7476 if v_1.Op != OpConst32 { 7477 break 7478 } 7479 if v_1.AuxInt != -1<<31 { 7480 break 7481 } 7482 v.reset(OpRsh32Ux64) 7483 v0 := b.NewValue0(v.Pos, OpAnd32, t) 7484 v0.AddArg(x) 7485 v1 := b.NewValue0(v.Pos, OpNeg32, t) 7486 v1.AddArg(x) 7487 v0.AddArg(v1) 7488 v.AddArg(v0) 7489 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7490 v2.AuxInt = 31 7491 v.AddArg(v2) 7492 return true 7493 } 7494 // match: (Div32 <t> n (Const32 [c])) 7495 // cond: isPowerOfTwo(c) 7496 // 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)])) 7497 for { 7498 t := v.Type 7499 _ = v.Args[1] 7500 n := v.Args[0] 7501 v_1 := v.Args[1] 7502 if v_1.Op != OpConst32 { 7503 break 7504 } 7505 c := v_1.AuxInt 7506 if !(isPowerOfTwo(c)) { 7507 break 7508 } 7509 v.reset(OpRsh32x64) 7510 v0 := b.NewValue0(v.Pos, OpAdd32, t) 7511 v0.AddArg(n) 7512 v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) 7513 v2 := b.NewValue0(v.Pos, OpRsh32x64, t) 7514 v2.AddArg(n) 7515 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7516 v3.AuxInt = 31 7517 v2.AddArg(v3) 7518 v1.AddArg(v2) 7519 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7520 v4.AuxInt = 32 - log2(c) 7521 v1.AddArg(v4) 7522 v0.AddArg(v1) 7523 v.AddArg(v0) 7524 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7525 v5.AuxInt = log2(c) 7526 v.AddArg(v5) 7527 return true 7528 } 7529 // match: (Div32 <t> x (Const32 [c])) 7530 // cond: smagicOK(32,c) && config.RegSize == 8 7531 // 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]))) 7532 for { 7533 t := v.Type 7534 _ = v.Args[1] 7535 x := v.Args[0] 7536 v_1 := v.Args[1] 7537 if v_1.Op != OpConst32 { 7538 break 7539 } 7540 c := v_1.AuxInt 7541 if !(smagicOK(32, c) && config.RegSize == 8) { 7542 break 7543 } 7544 v.reset(OpSub32) 7545 v.Type = t 7546 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 7547 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7548 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7549 v2.AuxInt = int64(smagic(32, c).m) 7550 v1.AddArg(v2) 7551 v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 7552 v3.AddArg(x) 7553 v1.AddArg(v3) 7554 v0.AddArg(v1) 7555 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7556 v4.AuxInt = 32 + smagic(32, c).s 7557 v0.AddArg(v4) 7558 v.AddArg(v0) 7559 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 7560 v6 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 7561 v6.AddArg(x) 7562 v5.AddArg(v6) 7563 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7564 v7.AuxInt = 63 7565 v5.AddArg(v7) 7566 v.AddArg(v5) 7567 return true 7568 } 7569 // match: (Div32 <t> x (Const32 [c])) 7570 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 7571 // 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]))) 7572 for { 7573 t := v.Type 7574 _ = v.Args[1] 7575 x := v.Args[0] 7576 v_1 := v.Args[1] 7577 if v_1.Op != OpConst32 { 7578 break 7579 } 7580 c := v_1.AuxInt 7581 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0) { 7582 break 7583 } 7584 v.reset(OpSub32) 7585 v.Type = t 7586 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7587 v1 := b.NewValue0(v.Pos, OpHmul32, t) 7588 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7589 v2.AuxInt = int64(int32(smagic(32, c).m / 2)) 7590 v1.AddArg(v2) 7591 v1.AddArg(x) 7592 v0.AddArg(v1) 7593 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7594 v3.AuxInt = smagic(32, c).s - 1 7595 v0.AddArg(v3) 7596 v.AddArg(v0) 7597 v4 := b.NewValue0(v.Pos, OpRsh32x64, t) 7598 v4.AddArg(x) 7599 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7600 v5.AuxInt = 31 7601 v4.AddArg(v5) 7602 v.AddArg(v4) 7603 return true 7604 } 7605 // match: (Div32 <t> x (Const32 [c])) 7606 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 7607 // 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]))) 7608 for { 7609 t := v.Type 7610 _ = v.Args[1] 7611 x := v.Args[0] 7612 v_1 := v.Args[1] 7613 if v_1.Op != OpConst32 { 7614 break 7615 } 7616 c := v_1.AuxInt 7617 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0) { 7618 break 7619 } 7620 v.reset(OpSub32) 7621 v.Type = t 7622 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7623 v1 := b.NewValue0(v.Pos, OpAdd32, t) 7624 v2 := b.NewValue0(v.Pos, OpHmul32, t) 7625 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7626 v3.AuxInt = int64(int32(smagic(32, c).m)) 7627 v2.AddArg(v3) 7628 v2.AddArg(x) 7629 v1.AddArg(v2) 7630 v1.AddArg(x) 7631 v0.AddArg(v1) 7632 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7633 v4.AuxInt = smagic(32, c).s 7634 v0.AddArg(v4) 7635 v.AddArg(v0) 7636 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7637 v5.AddArg(x) 7638 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7639 v6.AuxInt = 31 7640 v5.AddArg(v6) 7641 v.AddArg(v5) 7642 return true 7643 } 7644 return false 7645 } 7646 func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { 7647 b := v.Block 7648 _ = b 7649 // match: (Div32F (Const32F [c]) (Const32F [d])) 7650 // cond: 7651 // result: (Const32F [f2i(float64(i2f32(c) / i2f32(d)))]) 7652 for { 7653 _ = v.Args[1] 7654 v_0 := v.Args[0] 7655 if v_0.Op != OpConst32F { 7656 break 7657 } 7658 c := v_0.AuxInt 7659 v_1 := v.Args[1] 7660 if v_1.Op != OpConst32F { 7661 break 7662 } 7663 d := v_1.AuxInt 7664 v.reset(OpConst32F) 7665 v.AuxInt = f2i(float64(i2f32(c) / i2f32(d))) 7666 return true 7667 } 7668 // match: (Div32F x (Const32F <t> [c])) 7669 // cond: reciprocalExact32(float32(i2f(c))) 7670 // result: (Mul32F x (Const32F <t> [f2i(1/i2f(c))])) 7671 for { 7672 _ = v.Args[1] 7673 x := v.Args[0] 7674 v_1 := v.Args[1] 7675 if v_1.Op != OpConst32F { 7676 break 7677 } 7678 t := v_1.Type 7679 c := v_1.AuxInt 7680 if !(reciprocalExact32(float32(i2f(c)))) { 7681 break 7682 } 7683 v.reset(OpMul32F) 7684 v.AddArg(x) 7685 v0 := b.NewValue0(v.Pos, OpConst32F, t) 7686 v0.AuxInt = f2i(1 / i2f(c)) 7687 v.AddArg(v0) 7688 return true 7689 } 7690 return false 7691 } 7692 func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { 7693 b := v.Block 7694 _ = b 7695 config := b.Func.Config 7696 _ = config 7697 typ := &b.Func.Config.Types 7698 _ = typ 7699 // match: (Div32u (Const32 [c]) (Const32 [d])) 7700 // cond: d != 0 7701 // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) 7702 for { 7703 _ = v.Args[1] 7704 v_0 := v.Args[0] 7705 if v_0.Op != OpConst32 { 7706 break 7707 } 7708 c := v_0.AuxInt 7709 v_1 := v.Args[1] 7710 if v_1.Op != OpConst32 { 7711 break 7712 } 7713 d := v_1.AuxInt 7714 if !(d != 0) { 7715 break 7716 } 7717 v.reset(OpConst32) 7718 v.AuxInt = int64(int32(uint32(c) / uint32(d))) 7719 return true 7720 } 7721 // match: (Div32u n (Const32 [c])) 7722 // cond: isPowerOfTwo(c&0xffffffff) 7723 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 7724 for { 7725 _ = v.Args[1] 7726 n := v.Args[0] 7727 v_1 := v.Args[1] 7728 if v_1.Op != OpConst32 { 7729 break 7730 } 7731 c := v_1.AuxInt 7732 if !(isPowerOfTwo(c & 0xffffffff)) { 7733 break 7734 } 7735 v.reset(OpRsh32Ux64) 7736 v.AddArg(n) 7737 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7738 v0.AuxInt = log2(c & 0xffffffff) 7739 v.AddArg(v0) 7740 return true 7741 } 7742 // match: (Div32u x (Const32 [c])) 7743 // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 7744 // 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])) 7745 for { 7746 _ = v.Args[1] 7747 x := v.Args[0] 7748 v_1 := v.Args[1] 7749 if v_1.Op != OpConst32 { 7750 break 7751 } 7752 c := v_1.AuxInt 7753 if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0) { 7754 break 7755 } 7756 v.reset(OpRsh32Ux64) 7757 v.Type = typ.UInt32 7758 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7759 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7760 v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) 7761 v0.AddArg(v1) 7762 v0.AddArg(x) 7763 v.AddArg(v0) 7764 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7765 v2.AuxInt = umagic(32, c).s - 1 7766 v.AddArg(v2) 7767 return true 7768 } 7769 // match: (Div32u x (Const32 [c])) 7770 // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 7771 // 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])) 7772 for { 7773 _ = v.Args[1] 7774 x := v.Args[0] 7775 v_1 := v.Args[1] 7776 if v_1.Op != OpConst32 { 7777 break 7778 } 7779 c := v_1.AuxInt 7780 if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0) { 7781 break 7782 } 7783 v.reset(OpRsh32Ux64) 7784 v.Type = typ.UInt32 7785 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7786 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7787 v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) 7788 v0.AddArg(v1) 7789 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7790 v2.AddArg(x) 7791 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7792 v3.AuxInt = 1 7793 v2.AddArg(v3) 7794 v0.AddArg(v2) 7795 v.AddArg(v0) 7796 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7797 v4.AuxInt = umagic(32, c).s - 2 7798 v.AddArg(v4) 7799 return true 7800 } 7801 // match: (Div32u x (Const32 [c])) 7802 // cond: umagicOK(32, c) && config.RegSize == 4 7803 // 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])) 7804 for { 7805 _ = v.Args[1] 7806 x := v.Args[0] 7807 v_1 := v.Args[1] 7808 if v_1.Op != OpConst32 { 7809 break 7810 } 7811 c := v_1.AuxInt 7812 if !(umagicOK(32, c) && config.RegSize == 4) { 7813 break 7814 } 7815 v.reset(OpRsh32Ux64) 7816 v.Type = typ.UInt32 7817 v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 7818 v0.AddArg(x) 7819 v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7820 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7821 v2.AuxInt = int64(int32(umagic(32, c).m)) 7822 v1.AddArg(v2) 7823 v1.AddArg(x) 7824 v0.AddArg(v1) 7825 v.AddArg(v0) 7826 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7827 v3.AuxInt = umagic(32, c).s - 1 7828 v.AddArg(v3) 7829 return true 7830 } 7831 // match: (Div32u x (Const32 [c])) 7832 // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 7833 // 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]))) 7834 for { 7835 _ = v.Args[1] 7836 x := v.Args[0] 7837 v_1 := v.Args[1] 7838 if v_1.Op != OpConst32 { 7839 break 7840 } 7841 c := v_1.AuxInt 7842 if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { 7843 break 7844 } 7845 v.reset(OpTrunc64to32) 7846 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7847 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7848 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7849 v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) 7850 v1.AddArg(v2) 7851 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 7852 v3.AddArg(x) 7853 v1.AddArg(v3) 7854 v0.AddArg(v1) 7855 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7856 v4.AuxInt = 32 + umagic(32, c).s - 1 7857 v0.AddArg(v4) 7858 v.AddArg(v0) 7859 return true 7860 } 7861 // match: (Div32u x (Const32 [c])) 7862 // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 7863 // 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]))) 7864 for { 7865 _ = v.Args[1] 7866 x := v.Args[0] 7867 v_1 := v.Args[1] 7868 if v_1.Op != OpConst32 { 7869 break 7870 } 7871 c := v_1.AuxInt 7872 if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { 7873 break 7874 } 7875 v.reset(OpTrunc64to32) 7876 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7877 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7878 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7879 v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) 7880 v1.AddArg(v2) 7881 v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7882 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 7883 v4.AddArg(x) 7884 v3.AddArg(v4) 7885 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7886 v5.AuxInt = 1 7887 v3.AddArg(v5) 7888 v1.AddArg(v3) 7889 v0.AddArg(v1) 7890 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7891 v6.AuxInt = 32 + umagic(32, c).s - 2 7892 v0.AddArg(v6) 7893 v.AddArg(v0) 7894 return true 7895 } 7896 // match: (Div32u x (Const32 [c])) 7897 // cond: umagicOK(32, c) && config.RegSize == 8 7898 // 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]))) 7899 for { 7900 _ = v.Args[1] 7901 x := v.Args[0] 7902 v_1 := v.Args[1] 7903 if v_1.Op != OpConst32 { 7904 break 7905 } 7906 c := v_1.AuxInt 7907 if !(umagicOK(32, c) && config.RegSize == 8) { 7908 break 7909 } 7910 v.reset(OpTrunc64to32) 7911 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7912 v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 7913 v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64) 7914 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 7915 v3.AddArg(x) 7916 v2.AddArg(v3) 7917 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7918 v4.AuxInt = 32 7919 v2.AddArg(v4) 7920 v1.AddArg(v2) 7921 v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7922 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32) 7923 v6.AuxInt = int64(umagic(32, c).m) 7924 v5.AddArg(v6) 7925 v7 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 7926 v7.AddArg(x) 7927 v5.AddArg(v7) 7928 v1.AddArg(v5) 7929 v0.AddArg(v1) 7930 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7931 v8.AuxInt = 32 + umagic(32, c).s - 1 7932 v0.AddArg(v8) 7933 v.AddArg(v0) 7934 return true 7935 } 7936 return false 7937 } 7938 func rewriteValuegeneric_OpDiv64_0(v *Value) bool { 7939 b := v.Block 7940 _ = b 7941 typ := &b.Func.Config.Types 7942 _ = typ 7943 // match: (Div64 (Const64 [c]) (Const64 [d])) 7944 // cond: d != 0 7945 // result: (Const64 [c/d]) 7946 for { 7947 _ = v.Args[1] 7948 v_0 := v.Args[0] 7949 if v_0.Op != OpConst64 { 7950 break 7951 } 7952 c := v_0.AuxInt 7953 v_1 := v.Args[1] 7954 if v_1.Op != OpConst64 { 7955 break 7956 } 7957 d := v_1.AuxInt 7958 if !(d != 0) { 7959 break 7960 } 7961 v.reset(OpConst64) 7962 v.AuxInt = c / d 7963 return true 7964 } 7965 // match: (Div64 <t> n (Const64 [c])) 7966 // cond: c < 0 && c != -1<<63 7967 // result: (Neg64 (Div64 <t> n (Const64 <t> [-c]))) 7968 for { 7969 t := v.Type 7970 _ = v.Args[1] 7971 n := v.Args[0] 7972 v_1 := v.Args[1] 7973 if v_1.Op != OpConst64 { 7974 break 7975 } 7976 c := v_1.AuxInt 7977 if !(c < 0 && c != -1<<63) { 7978 break 7979 } 7980 v.reset(OpNeg64) 7981 v0 := b.NewValue0(v.Pos, OpDiv64, t) 7982 v0.AddArg(n) 7983 v1 := b.NewValue0(v.Pos, OpConst64, t) 7984 v1.AuxInt = -c 7985 v0.AddArg(v1) 7986 v.AddArg(v0) 7987 return true 7988 } 7989 // match: (Div64 <t> x (Const64 [-1<<63])) 7990 // cond: 7991 // result: (Rsh64Ux64 (And64 <t> x (Neg64 <t> x)) (Const64 <typ.UInt64> [63])) 7992 for { 7993 t := v.Type 7994 _ = v.Args[1] 7995 x := v.Args[0] 7996 v_1 := v.Args[1] 7997 if v_1.Op != OpConst64 { 7998 break 7999 } 8000 if v_1.AuxInt != -1<<63 { 8001 break 8002 } 8003 v.reset(OpRsh64Ux64) 8004 v0 := b.NewValue0(v.Pos, OpAnd64, t) 8005 v0.AddArg(x) 8006 v1 := b.NewValue0(v.Pos, OpNeg64, t) 8007 v1.AddArg(x) 8008 v0.AddArg(v1) 8009 v.AddArg(v0) 8010 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8011 v2.AuxInt = 63 8012 v.AddArg(v2) 8013 return true 8014 } 8015 // match: (Div64 <t> n (Const64 [c])) 8016 // cond: isPowerOfTwo(c) 8017 // 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)])) 8018 for { 8019 t := v.Type 8020 _ = v.Args[1] 8021 n := v.Args[0] 8022 v_1 := v.Args[1] 8023 if v_1.Op != OpConst64 { 8024 break 8025 } 8026 c := v_1.AuxInt 8027 if !(isPowerOfTwo(c)) { 8028 break 8029 } 8030 v.reset(OpRsh64x64) 8031 v0 := b.NewValue0(v.Pos, OpAdd64, t) 8032 v0.AddArg(n) 8033 v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 8034 v2 := b.NewValue0(v.Pos, OpRsh64x64, t) 8035 v2.AddArg(n) 8036 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8037 v3.AuxInt = 63 8038 v2.AddArg(v3) 8039 v1.AddArg(v2) 8040 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8041 v4.AuxInt = 64 - log2(c) 8042 v1.AddArg(v4) 8043 v0.AddArg(v1) 8044 v.AddArg(v0) 8045 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8046 v5.AuxInt = log2(c) 8047 v.AddArg(v5) 8048 return true 8049 } 8050 // match: (Div64 <t> x (Const64 [c])) 8051 // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 8052 // 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]))) 8053 for { 8054 t := v.Type 8055 _ = v.Args[1] 8056 x := v.Args[0] 8057 v_1 := v.Args[1] 8058 if v_1.Op != OpConst64 { 8059 break 8060 } 8061 c := v_1.AuxInt 8062 if !(smagicOK(64, c) && smagic(64, c).m&1 == 0) { 8063 break 8064 } 8065 v.reset(OpSub64) 8066 v.Type = t 8067 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 8068 v1 := b.NewValue0(v.Pos, OpHmul64, t) 8069 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8070 v2.AuxInt = int64(smagic(64, c).m / 2) 8071 v1.AddArg(v2) 8072 v1.AddArg(x) 8073 v0.AddArg(v1) 8074 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8075 v3.AuxInt = smagic(64, c).s - 1 8076 v0.AddArg(v3) 8077 v.AddArg(v0) 8078 v4 := b.NewValue0(v.Pos, OpRsh64x64, t) 8079 v4.AddArg(x) 8080 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8081 v5.AuxInt = 63 8082 v4.AddArg(v5) 8083 v.AddArg(v4) 8084 return true 8085 } 8086 // match: (Div64 <t> x (Const64 [c])) 8087 // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 8088 // 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]))) 8089 for { 8090 t := v.Type 8091 _ = v.Args[1] 8092 x := v.Args[0] 8093 v_1 := v.Args[1] 8094 if v_1.Op != OpConst64 { 8095 break 8096 } 8097 c := v_1.AuxInt 8098 if !(smagicOK(64, c) && smagic(64, c).m&1 != 0) { 8099 break 8100 } 8101 v.reset(OpSub64) 8102 v.Type = t 8103 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 8104 v1 := b.NewValue0(v.Pos, OpAdd64, t) 8105 v2 := b.NewValue0(v.Pos, OpHmul64, t) 8106 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8107 v3.AuxInt = int64(smagic(64, c).m) 8108 v2.AddArg(v3) 8109 v2.AddArg(x) 8110 v1.AddArg(v2) 8111 v1.AddArg(x) 8112 v0.AddArg(v1) 8113 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8114 v4.AuxInt = smagic(64, c).s 8115 v0.AddArg(v4) 8116 v.AddArg(v0) 8117 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 8118 v5.AddArg(x) 8119 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8120 v6.AuxInt = 63 8121 v5.AddArg(v6) 8122 v.AddArg(v5) 8123 return true 8124 } 8125 return false 8126 } 8127 func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { 8128 b := v.Block 8129 _ = b 8130 // match: (Div64F (Const64F [c]) (Const64F [d])) 8131 // cond: 8132 // result: (Const64F [f2i(i2f(c) / i2f(d))]) 8133 for { 8134 _ = v.Args[1] 8135 v_0 := v.Args[0] 8136 if v_0.Op != OpConst64F { 8137 break 8138 } 8139 c := v_0.AuxInt 8140 v_1 := v.Args[1] 8141 if v_1.Op != OpConst64F { 8142 break 8143 } 8144 d := v_1.AuxInt 8145 v.reset(OpConst64F) 8146 v.AuxInt = f2i(i2f(c) / i2f(d)) 8147 return true 8148 } 8149 // match: (Div64F x (Const64F <t> [c])) 8150 // cond: reciprocalExact64(i2f(c)) 8151 // result: (Mul64F x (Const64F <t> [f2i(1/i2f(c))])) 8152 for { 8153 _ = v.Args[1] 8154 x := v.Args[0] 8155 v_1 := v.Args[1] 8156 if v_1.Op != OpConst64F { 8157 break 8158 } 8159 t := v_1.Type 8160 c := v_1.AuxInt 8161 if !(reciprocalExact64(i2f(c))) { 8162 break 8163 } 8164 v.reset(OpMul64F) 8165 v.AddArg(x) 8166 v0 := b.NewValue0(v.Pos, OpConst64F, t) 8167 v0.AuxInt = f2i(1 / i2f(c)) 8168 v.AddArg(v0) 8169 return true 8170 } 8171 return false 8172 } 8173 func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { 8174 b := v.Block 8175 _ = b 8176 config := b.Func.Config 8177 _ = config 8178 typ := &b.Func.Config.Types 8179 _ = typ 8180 // match: (Div64u (Const64 [c]) (Const64 [d])) 8181 // cond: d != 0 8182 // result: (Const64 [int64(uint64(c)/uint64(d))]) 8183 for { 8184 _ = v.Args[1] 8185 v_0 := v.Args[0] 8186 if v_0.Op != OpConst64 { 8187 break 8188 } 8189 c := v_0.AuxInt 8190 v_1 := v.Args[1] 8191 if v_1.Op != OpConst64 { 8192 break 8193 } 8194 d := v_1.AuxInt 8195 if !(d != 0) { 8196 break 8197 } 8198 v.reset(OpConst64) 8199 v.AuxInt = int64(uint64(c) / uint64(d)) 8200 return true 8201 } 8202 // match: (Div64u n (Const64 [c])) 8203 // cond: isPowerOfTwo(c) 8204 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 8205 for { 8206 _ = v.Args[1] 8207 n := v.Args[0] 8208 v_1 := v.Args[1] 8209 if v_1.Op != OpConst64 { 8210 break 8211 } 8212 c := v_1.AuxInt 8213 if !(isPowerOfTwo(c)) { 8214 break 8215 } 8216 v.reset(OpRsh64Ux64) 8217 v.AddArg(n) 8218 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8219 v0.AuxInt = log2(c) 8220 v.AddArg(v0) 8221 return true 8222 } 8223 // match: (Div64u x (Const64 [c])) 8224 // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 8225 // 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])) 8226 for { 8227 _ = v.Args[1] 8228 x := v.Args[0] 8229 v_1 := v.Args[1] 8230 if v_1.Op != OpConst64 { 8231 break 8232 } 8233 c := v_1.AuxInt 8234 if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) { 8235 break 8236 } 8237 v.reset(OpRsh64Ux64) 8238 v.Type = typ.UInt64 8239 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8240 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8241 v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) 8242 v0.AddArg(v1) 8243 v0.AddArg(x) 8244 v.AddArg(v0) 8245 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8246 v2.AuxInt = umagic(64, c).s - 1 8247 v.AddArg(v2) 8248 return true 8249 } 8250 // match: (Div64u x (Const64 [c])) 8251 // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 8252 // 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])) 8253 for { 8254 _ = v.Args[1] 8255 x := v.Args[0] 8256 v_1 := v.Args[1] 8257 if v_1.Op != OpConst64 { 8258 break 8259 } 8260 c := v_1.AuxInt 8261 if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) { 8262 break 8263 } 8264 v.reset(OpRsh64Ux64) 8265 v.Type = typ.UInt64 8266 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8267 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8268 v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) 8269 v0.AddArg(v1) 8270 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8271 v2.AddArg(x) 8272 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8273 v3.AuxInt = 1 8274 v2.AddArg(v3) 8275 v0.AddArg(v2) 8276 v.AddArg(v0) 8277 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8278 v4.AuxInt = umagic(64, c).s - 2 8279 v.AddArg(v4) 8280 return true 8281 } 8282 // match: (Div64u x (Const64 [c])) 8283 // cond: umagicOK(64, c) && config.RegSize == 8 8284 // 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])) 8285 for { 8286 _ = v.Args[1] 8287 x := v.Args[0] 8288 v_1 := v.Args[1] 8289 if v_1.Op != OpConst64 { 8290 break 8291 } 8292 c := v_1.AuxInt 8293 if !(umagicOK(64, c) && config.RegSize == 8) { 8294 break 8295 } 8296 v.reset(OpRsh64Ux64) 8297 v.Type = typ.UInt64 8298 v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 8299 v0.AddArg(x) 8300 v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8301 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8302 v2.AuxInt = int64(umagic(64, c).m) 8303 v1.AddArg(v2) 8304 v1.AddArg(x) 8305 v0.AddArg(v1) 8306 v.AddArg(v0) 8307 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8308 v3.AuxInt = umagic(64, c).s - 1 8309 v.AddArg(v3) 8310 return true 8311 } 8312 return false 8313 } 8314 func rewriteValuegeneric_OpDiv8_0(v *Value) bool { 8315 b := v.Block 8316 _ = b 8317 typ := &b.Func.Config.Types 8318 _ = typ 8319 // match: (Div8 (Const8 [c]) (Const8 [d])) 8320 // cond: d != 0 8321 // result: (Const8 [int64(int8(c)/int8(d))]) 8322 for { 8323 _ = v.Args[1] 8324 v_0 := v.Args[0] 8325 if v_0.Op != OpConst8 { 8326 break 8327 } 8328 c := v_0.AuxInt 8329 v_1 := v.Args[1] 8330 if v_1.Op != OpConst8 { 8331 break 8332 } 8333 d := v_1.AuxInt 8334 if !(d != 0) { 8335 break 8336 } 8337 v.reset(OpConst8) 8338 v.AuxInt = int64(int8(c) / int8(d)) 8339 return true 8340 } 8341 // match: (Div8 <t> n (Const8 [c])) 8342 // cond: c < 0 && c != -1<<7 8343 // result: (Neg8 (Div8 <t> n (Const8 <t> [-c]))) 8344 for { 8345 t := v.Type 8346 _ = v.Args[1] 8347 n := v.Args[0] 8348 v_1 := v.Args[1] 8349 if v_1.Op != OpConst8 { 8350 break 8351 } 8352 c := v_1.AuxInt 8353 if !(c < 0 && c != -1<<7) { 8354 break 8355 } 8356 v.reset(OpNeg8) 8357 v0 := b.NewValue0(v.Pos, OpDiv8, t) 8358 v0.AddArg(n) 8359 v1 := b.NewValue0(v.Pos, OpConst8, t) 8360 v1.AuxInt = -c 8361 v0.AddArg(v1) 8362 v.AddArg(v0) 8363 return true 8364 } 8365 // match: (Div8 <t> x (Const8 [-1<<7 ])) 8366 // cond: 8367 // result: (Rsh8Ux64 (And8 <t> x (Neg8 <t> x)) (Const64 <typ.UInt64> [7 ])) 8368 for { 8369 t := v.Type 8370 _ = v.Args[1] 8371 x := v.Args[0] 8372 v_1 := v.Args[1] 8373 if v_1.Op != OpConst8 { 8374 break 8375 } 8376 if v_1.AuxInt != -1<<7 { 8377 break 8378 } 8379 v.reset(OpRsh8Ux64) 8380 v0 := b.NewValue0(v.Pos, OpAnd8, t) 8381 v0.AddArg(x) 8382 v1 := b.NewValue0(v.Pos, OpNeg8, t) 8383 v1.AddArg(x) 8384 v0.AddArg(v1) 8385 v.AddArg(v0) 8386 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8387 v2.AuxInt = 7 8388 v.AddArg(v2) 8389 return true 8390 } 8391 // match: (Div8 <t> n (Const8 [c])) 8392 // cond: isPowerOfTwo(c) 8393 // 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)])) 8394 for { 8395 t := v.Type 8396 _ = v.Args[1] 8397 n := v.Args[0] 8398 v_1 := v.Args[1] 8399 if v_1.Op != OpConst8 { 8400 break 8401 } 8402 c := v_1.AuxInt 8403 if !(isPowerOfTwo(c)) { 8404 break 8405 } 8406 v.reset(OpRsh8x64) 8407 v0 := b.NewValue0(v.Pos, OpAdd8, t) 8408 v0.AddArg(n) 8409 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) 8410 v2 := b.NewValue0(v.Pos, OpRsh8x64, t) 8411 v2.AddArg(n) 8412 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8413 v3.AuxInt = 7 8414 v2.AddArg(v3) 8415 v1.AddArg(v2) 8416 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8417 v4.AuxInt = 8 - log2(c) 8418 v1.AddArg(v4) 8419 v0.AddArg(v1) 8420 v.AddArg(v0) 8421 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8422 v5.AuxInt = log2(c) 8423 v.AddArg(v5) 8424 return true 8425 } 8426 // match: (Div8 <t> x (Const8 [c])) 8427 // cond: smagicOK(8,c) 8428 // 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]))) 8429 for { 8430 t := v.Type 8431 _ = v.Args[1] 8432 x := v.Args[0] 8433 v_1 := v.Args[1] 8434 if v_1.Op != OpConst8 { 8435 break 8436 } 8437 c := v_1.AuxInt 8438 if !(smagicOK(8, c)) { 8439 break 8440 } 8441 v.reset(OpSub8) 8442 v.Type = t 8443 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 8444 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8445 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8446 v2.AuxInt = int64(smagic(8, c).m) 8447 v1.AddArg(v2) 8448 v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8449 v3.AddArg(x) 8450 v1.AddArg(v3) 8451 v0.AddArg(v1) 8452 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8453 v4.AuxInt = 8 + smagic(8, c).s 8454 v0.AddArg(v4) 8455 v.AddArg(v0) 8456 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 8457 v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8458 v6.AddArg(x) 8459 v5.AddArg(v6) 8460 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8461 v7.AuxInt = 31 8462 v5.AddArg(v7) 8463 v.AddArg(v5) 8464 return true 8465 } 8466 return false 8467 } 8468 func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { 8469 b := v.Block 8470 _ = b 8471 typ := &b.Func.Config.Types 8472 _ = typ 8473 // match: (Div8u (Const8 [c]) (Const8 [d])) 8474 // cond: d != 0 8475 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) 8476 for { 8477 _ = v.Args[1] 8478 v_0 := v.Args[0] 8479 if v_0.Op != OpConst8 { 8480 break 8481 } 8482 c := v_0.AuxInt 8483 v_1 := v.Args[1] 8484 if v_1.Op != OpConst8 { 8485 break 8486 } 8487 d := v_1.AuxInt 8488 if !(d != 0) { 8489 break 8490 } 8491 v.reset(OpConst8) 8492 v.AuxInt = int64(int8(uint8(c) / uint8(d))) 8493 return true 8494 } 8495 // match: (Div8u n (Const8 [c])) 8496 // cond: isPowerOfTwo(c&0xff) 8497 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 8498 for { 8499 _ = v.Args[1] 8500 n := v.Args[0] 8501 v_1 := v.Args[1] 8502 if v_1.Op != OpConst8 { 8503 break 8504 } 8505 c := v_1.AuxInt 8506 if !(isPowerOfTwo(c & 0xff)) { 8507 break 8508 } 8509 v.reset(OpRsh8Ux64) 8510 v.AddArg(n) 8511 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8512 v0.AuxInt = log2(c & 0xff) 8513 v.AddArg(v0) 8514 return true 8515 } 8516 // match: (Div8u x (Const8 [c])) 8517 // cond: umagicOK(8, c) 8518 // 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]))) 8519 for { 8520 _ = v.Args[1] 8521 x := v.Args[0] 8522 v_1 := v.Args[1] 8523 if v_1.Op != OpConst8 { 8524 break 8525 } 8526 c := v_1.AuxInt 8527 if !(umagicOK(8, c)) { 8528 break 8529 } 8530 v.reset(OpTrunc32to8) 8531 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 8532 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8533 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8534 v2.AuxInt = int64(1<<8 + umagic(8, c).m) 8535 v1.AddArg(v2) 8536 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 8537 v3.AddArg(x) 8538 v1.AddArg(v3) 8539 v0.AddArg(v1) 8540 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8541 v4.AuxInt = 8 + umagic(8, c).s 8542 v0.AddArg(v4) 8543 v.AddArg(v0) 8544 return true 8545 } 8546 return false 8547 } 8548 func rewriteValuegeneric_OpEq16_0(v *Value) bool { 8549 b := v.Block 8550 _ = b 8551 // match: (Eq16 x x) 8552 // cond: 8553 // result: (ConstBool [1]) 8554 for { 8555 _ = v.Args[1] 8556 x := v.Args[0] 8557 if x != v.Args[1] { 8558 break 8559 } 8560 v.reset(OpConstBool) 8561 v.AuxInt = 1 8562 return true 8563 } 8564 // match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 8565 // cond: 8566 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8567 for { 8568 _ = v.Args[1] 8569 v_0 := v.Args[0] 8570 if v_0.Op != OpConst16 { 8571 break 8572 } 8573 t := v_0.Type 8574 c := v_0.AuxInt 8575 v_1 := v.Args[1] 8576 if v_1.Op != OpAdd16 { 8577 break 8578 } 8579 _ = v_1.Args[1] 8580 v_1_0 := v_1.Args[0] 8581 if v_1_0.Op != OpConst16 { 8582 break 8583 } 8584 if v_1_0.Type != t { 8585 break 8586 } 8587 d := v_1_0.AuxInt 8588 x := v_1.Args[1] 8589 v.reset(OpEq16) 8590 v0 := b.NewValue0(v.Pos, OpConst16, t) 8591 v0.AuxInt = int64(int16(c - d)) 8592 v.AddArg(v0) 8593 v.AddArg(x) 8594 return true 8595 } 8596 // match: (Eq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 8597 // cond: 8598 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8599 for { 8600 _ = v.Args[1] 8601 v_0 := v.Args[0] 8602 if v_0.Op != OpConst16 { 8603 break 8604 } 8605 t := v_0.Type 8606 c := v_0.AuxInt 8607 v_1 := v.Args[1] 8608 if v_1.Op != OpAdd16 { 8609 break 8610 } 8611 _ = v_1.Args[1] 8612 x := v_1.Args[0] 8613 v_1_1 := v_1.Args[1] 8614 if v_1_1.Op != OpConst16 { 8615 break 8616 } 8617 if v_1_1.Type != t { 8618 break 8619 } 8620 d := v_1_1.AuxInt 8621 v.reset(OpEq16) 8622 v0 := b.NewValue0(v.Pos, OpConst16, t) 8623 v0.AuxInt = int64(int16(c - d)) 8624 v.AddArg(v0) 8625 v.AddArg(x) 8626 return true 8627 } 8628 // match: (Eq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 8629 // cond: 8630 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8631 for { 8632 _ = v.Args[1] 8633 v_0 := v.Args[0] 8634 if v_0.Op != OpAdd16 { 8635 break 8636 } 8637 _ = v_0.Args[1] 8638 v_0_0 := v_0.Args[0] 8639 if v_0_0.Op != OpConst16 { 8640 break 8641 } 8642 t := v_0_0.Type 8643 d := v_0_0.AuxInt 8644 x := v_0.Args[1] 8645 v_1 := v.Args[1] 8646 if v_1.Op != OpConst16 { 8647 break 8648 } 8649 if v_1.Type != t { 8650 break 8651 } 8652 c := v_1.AuxInt 8653 v.reset(OpEq16) 8654 v0 := b.NewValue0(v.Pos, OpConst16, t) 8655 v0.AuxInt = int64(int16(c - d)) 8656 v.AddArg(v0) 8657 v.AddArg(x) 8658 return true 8659 } 8660 // match: (Eq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 8661 // cond: 8662 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8663 for { 8664 _ = v.Args[1] 8665 v_0 := v.Args[0] 8666 if v_0.Op != OpAdd16 { 8667 break 8668 } 8669 _ = v_0.Args[1] 8670 x := v_0.Args[0] 8671 v_0_1 := v_0.Args[1] 8672 if v_0_1.Op != OpConst16 { 8673 break 8674 } 8675 t := v_0_1.Type 8676 d := v_0_1.AuxInt 8677 v_1 := v.Args[1] 8678 if v_1.Op != OpConst16 { 8679 break 8680 } 8681 if v_1.Type != t { 8682 break 8683 } 8684 c := v_1.AuxInt 8685 v.reset(OpEq16) 8686 v0 := b.NewValue0(v.Pos, OpConst16, t) 8687 v0.AuxInt = int64(int16(c - d)) 8688 v.AddArg(v0) 8689 v.AddArg(x) 8690 return true 8691 } 8692 // match: (Eq16 (Const16 [c]) (Const16 [d])) 8693 // cond: 8694 // result: (ConstBool [b2i(c == d)]) 8695 for { 8696 _ = v.Args[1] 8697 v_0 := v.Args[0] 8698 if v_0.Op != OpConst16 { 8699 break 8700 } 8701 c := v_0.AuxInt 8702 v_1 := v.Args[1] 8703 if v_1.Op != OpConst16 { 8704 break 8705 } 8706 d := v_1.AuxInt 8707 v.reset(OpConstBool) 8708 v.AuxInt = b2i(c == d) 8709 return true 8710 } 8711 // match: (Eq16 (Const16 [d]) (Const16 [c])) 8712 // cond: 8713 // result: (ConstBool [b2i(c == d)]) 8714 for { 8715 _ = v.Args[1] 8716 v_0 := v.Args[0] 8717 if v_0.Op != OpConst16 { 8718 break 8719 } 8720 d := v_0.AuxInt 8721 v_1 := v.Args[1] 8722 if v_1.Op != OpConst16 { 8723 break 8724 } 8725 c := v_1.AuxInt 8726 v.reset(OpConstBool) 8727 v.AuxInt = b2i(c == d) 8728 return true 8729 } 8730 return false 8731 } 8732 func rewriteValuegeneric_OpEq32_0(v *Value) bool { 8733 b := v.Block 8734 _ = b 8735 // match: (Eq32 x x) 8736 // cond: 8737 // result: (ConstBool [1]) 8738 for { 8739 _ = v.Args[1] 8740 x := v.Args[0] 8741 if x != v.Args[1] { 8742 break 8743 } 8744 v.reset(OpConstBool) 8745 v.AuxInt = 1 8746 return true 8747 } 8748 // match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 8749 // cond: 8750 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 8751 for { 8752 _ = v.Args[1] 8753 v_0 := v.Args[0] 8754 if v_0.Op != OpConst32 { 8755 break 8756 } 8757 t := v_0.Type 8758 c := v_0.AuxInt 8759 v_1 := v.Args[1] 8760 if v_1.Op != OpAdd32 { 8761 break 8762 } 8763 _ = v_1.Args[1] 8764 v_1_0 := v_1.Args[0] 8765 if v_1_0.Op != OpConst32 { 8766 break 8767 } 8768 if v_1_0.Type != t { 8769 break 8770 } 8771 d := v_1_0.AuxInt 8772 x := v_1.Args[1] 8773 v.reset(OpEq32) 8774 v0 := b.NewValue0(v.Pos, OpConst32, t) 8775 v0.AuxInt = int64(int32(c - d)) 8776 v.AddArg(v0) 8777 v.AddArg(x) 8778 return true 8779 } 8780 // match: (Eq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 8781 // cond: 8782 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 8783 for { 8784 _ = v.Args[1] 8785 v_0 := v.Args[0] 8786 if v_0.Op != OpConst32 { 8787 break 8788 } 8789 t := v_0.Type 8790 c := v_0.AuxInt 8791 v_1 := v.Args[1] 8792 if v_1.Op != OpAdd32 { 8793 break 8794 } 8795 _ = v_1.Args[1] 8796 x := v_1.Args[0] 8797 v_1_1 := v_1.Args[1] 8798 if v_1_1.Op != OpConst32 { 8799 break 8800 } 8801 if v_1_1.Type != t { 8802 break 8803 } 8804 d := v_1_1.AuxInt 8805 v.reset(OpEq32) 8806 v0 := b.NewValue0(v.Pos, OpConst32, t) 8807 v0.AuxInt = int64(int32(c - d)) 8808 v.AddArg(v0) 8809 v.AddArg(x) 8810 return true 8811 } 8812 // match: (Eq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 8813 // cond: 8814 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 8815 for { 8816 _ = v.Args[1] 8817 v_0 := v.Args[0] 8818 if v_0.Op != OpAdd32 { 8819 break 8820 } 8821 _ = v_0.Args[1] 8822 v_0_0 := v_0.Args[0] 8823 if v_0_0.Op != OpConst32 { 8824 break 8825 } 8826 t := v_0_0.Type 8827 d := v_0_0.AuxInt 8828 x := v_0.Args[1] 8829 v_1 := v.Args[1] 8830 if v_1.Op != OpConst32 { 8831 break 8832 } 8833 if v_1.Type != t { 8834 break 8835 } 8836 c := v_1.AuxInt 8837 v.reset(OpEq32) 8838 v0 := b.NewValue0(v.Pos, OpConst32, t) 8839 v0.AuxInt = int64(int32(c - d)) 8840 v.AddArg(v0) 8841 v.AddArg(x) 8842 return true 8843 } 8844 // match: (Eq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 8845 // cond: 8846 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 8847 for { 8848 _ = v.Args[1] 8849 v_0 := v.Args[0] 8850 if v_0.Op != OpAdd32 { 8851 break 8852 } 8853 _ = v_0.Args[1] 8854 x := v_0.Args[0] 8855 v_0_1 := v_0.Args[1] 8856 if v_0_1.Op != OpConst32 { 8857 break 8858 } 8859 t := v_0_1.Type 8860 d := v_0_1.AuxInt 8861 v_1 := v.Args[1] 8862 if v_1.Op != OpConst32 { 8863 break 8864 } 8865 if v_1.Type != t { 8866 break 8867 } 8868 c := v_1.AuxInt 8869 v.reset(OpEq32) 8870 v0 := b.NewValue0(v.Pos, OpConst32, t) 8871 v0.AuxInt = int64(int32(c - d)) 8872 v.AddArg(v0) 8873 v.AddArg(x) 8874 return true 8875 } 8876 // match: (Eq32 (Const32 [c]) (Const32 [d])) 8877 // cond: 8878 // result: (ConstBool [b2i(c == d)]) 8879 for { 8880 _ = v.Args[1] 8881 v_0 := v.Args[0] 8882 if v_0.Op != OpConst32 { 8883 break 8884 } 8885 c := v_0.AuxInt 8886 v_1 := v.Args[1] 8887 if v_1.Op != OpConst32 { 8888 break 8889 } 8890 d := v_1.AuxInt 8891 v.reset(OpConstBool) 8892 v.AuxInt = b2i(c == d) 8893 return true 8894 } 8895 // match: (Eq32 (Const32 [d]) (Const32 [c])) 8896 // cond: 8897 // result: (ConstBool [b2i(c == d)]) 8898 for { 8899 _ = v.Args[1] 8900 v_0 := v.Args[0] 8901 if v_0.Op != OpConst32 { 8902 break 8903 } 8904 d := v_0.AuxInt 8905 v_1 := v.Args[1] 8906 if v_1.Op != OpConst32 { 8907 break 8908 } 8909 c := v_1.AuxInt 8910 v.reset(OpConstBool) 8911 v.AuxInt = b2i(c == d) 8912 return true 8913 } 8914 return false 8915 } 8916 func rewriteValuegeneric_OpEq64_0(v *Value) bool { 8917 b := v.Block 8918 _ = b 8919 // match: (Eq64 x x) 8920 // cond: 8921 // result: (ConstBool [1]) 8922 for { 8923 _ = v.Args[1] 8924 x := v.Args[0] 8925 if x != v.Args[1] { 8926 break 8927 } 8928 v.reset(OpConstBool) 8929 v.AuxInt = 1 8930 return true 8931 } 8932 // match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 8933 // cond: 8934 // result: (Eq64 (Const64 <t> [c-d]) x) 8935 for { 8936 _ = v.Args[1] 8937 v_0 := v.Args[0] 8938 if v_0.Op != OpConst64 { 8939 break 8940 } 8941 t := v_0.Type 8942 c := v_0.AuxInt 8943 v_1 := v.Args[1] 8944 if v_1.Op != OpAdd64 { 8945 break 8946 } 8947 _ = v_1.Args[1] 8948 v_1_0 := v_1.Args[0] 8949 if v_1_0.Op != OpConst64 { 8950 break 8951 } 8952 if v_1_0.Type != t { 8953 break 8954 } 8955 d := v_1_0.AuxInt 8956 x := v_1.Args[1] 8957 v.reset(OpEq64) 8958 v0 := b.NewValue0(v.Pos, OpConst64, t) 8959 v0.AuxInt = c - d 8960 v.AddArg(v0) 8961 v.AddArg(x) 8962 return true 8963 } 8964 // match: (Eq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 8965 // cond: 8966 // result: (Eq64 (Const64 <t> [c-d]) x) 8967 for { 8968 _ = v.Args[1] 8969 v_0 := v.Args[0] 8970 if v_0.Op != OpConst64 { 8971 break 8972 } 8973 t := v_0.Type 8974 c := v_0.AuxInt 8975 v_1 := v.Args[1] 8976 if v_1.Op != OpAdd64 { 8977 break 8978 } 8979 _ = v_1.Args[1] 8980 x := v_1.Args[0] 8981 v_1_1 := v_1.Args[1] 8982 if v_1_1.Op != OpConst64 { 8983 break 8984 } 8985 if v_1_1.Type != t { 8986 break 8987 } 8988 d := v_1_1.AuxInt 8989 v.reset(OpEq64) 8990 v0 := b.NewValue0(v.Pos, OpConst64, t) 8991 v0.AuxInt = c - d 8992 v.AddArg(v0) 8993 v.AddArg(x) 8994 return true 8995 } 8996 // match: (Eq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 8997 // cond: 8998 // result: (Eq64 (Const64 <t> [c-d]) x) 8999 for { 9000 _ = v.Args[1] 9001 v_0 := v.Args[0] 9002 if v_0.Op != OpAdd64 { 9003 break 9004 } 9005 _ = v_0.Args[1] 9006 v_0_0 := v_0.Args[0] 9007 if v_0_0.Op != OpConst64 { 9008 break 9009 } 9010 t := v_0_0.Type 9011 d := v_0_0.AuxInt 9012 x := v_0.Args[1] 9013 v_1 := v.Args[1] 9014 if v_1.Op != OpConst64 { 9015 break 9016 } 9017 if v_1.Type != t { 9018 break 9019 } 9020 c := v_1.AuxInt 9021 v.reset(OpEq64) 9022 v0 := b.NewValue0(v.Pos, OpConst64, t) 9023 v0.AuxInt = c - d 9024 v.AddArg(v0) 9025 v.AddArg(x) 9026 return true 9027 } 9028 // match: (Eq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 9029 // cond: 9030 // result: (Eq64 (Const64 <t> [c-d]) x) 9031 for { 9032 _ = v.Args[1] 9033 v_0 := v.Args[0] 9034 if v_0.Op != OpAdd64 { 9035 break 9036 } 9037 _ = v_0.Args[1] 9038 x := v_0.Args[0] 9039 v_0_1 := v_0.Args[1] 9040 if v_0_1.Op != OpConst64 { 9041 break 9042 } 9043 t := v_0_1.Type 9044 d := v_0_1.AuxInt 9045 v_1 := v.Args[1] 9046 if v_1.Op != OpConst64 { 9047 break 9048 } 9049 if v_1.Type != t { 9050 break 9051 } 9052 c := v_1.AuxInt 9053 v.reset(OpEq64) 9054 v0 := b.NewValue0(v.Pos, OpConst64, t) 9055 v0.AuxInt = c - d 9056 v.AddArg(v0) 9057 v.AddArg(x) 9058 return true 9059 } 9060 // match: (Eq64 (Const64 [c]) (Const64 [d])) 9061 // cond: 9062 // result: (ConstBool [b2i(c == d)]) 9063 for { 9064 _ = v.Args[1] 9065 v_0 := v.Args[0] 9066 if v_0.Op != OpConst64 { 9067 break 9068 } 9069 c := v_0.AuxInt 9070 v_1 := v.Args[1] 9071 if v_1.Op != OpConst64 { 9072 break 9073 } 9074 d := v_1.AuxInt 9075 v.reset(OpConstBool) 9076 v.AuxInt = b2i(c == d) 9077 return true 9078 } 9079 // match: (Eq64 (Const64 [d]) (Const64 [c])) 9080 // cond: 9081 // result: (ConstBool [b2i(c == d)]) 9082 for { 9083 _ = v.Args[1] 9084 v_0 := v.Args[0] 9085 if v_0.Op != OpConst64 { 9086 break 9087 } 9088 d := v_0.AuxInt 9089 v_1 := v.Args[1] 9090 if v_1.Op != OpConst64 { 9091 break 9092 } 9093 c := v_1.AuxInt 9094 v.reset(OpConstBool) 9095 v.AuxInt = b2i(c == d) 9096 return true 9097 } 9098 return false 9099 } 9100 func rewriteValuegeneric_OpEq8_0(v *Value) bool { 9101 b := v.Block 9102 _ = b 9103 // match: (Eq8 x x) 9104 // cond: 9105 // result: (ConstBool [1]) 9106 for { 9107 _ = v.Args[1] 9108 x := v.Args[0] 9109 if x != v.Args[1] { 9110 break 9111 } 9112 v.reset(OpConstBool) 9113 v.AuxInt = 1 9114 return true 9115 } 9116 // match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 9117 // cond: 9118 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9119 for { 9120 _ = v.Args[1] 9121 v_0 := v.Args[0] 9122 if v_0.Op != OpConst8 { 9123 break 9124 } 9125 t := v_0.Type 9126 c := v_0.AuxInt 9127 v_1 := v.Args[1] 9128 if v_1.Op != OpAdd8 { 9129 break 9130 } 9131 _ = v_1.Args[1] 9132 v_1_0 := v_1.Args[0] 9133 if v_1_0.Op != OpConst8 { 9134 break 9135 } 9136 if v_1_0.Type != t { 9137 break 9138 } 9139 d := v_1_0.AuxInt 9140 x := v_1.Args[1] 9141 v.reset(OpEq8) 9142 v0 := b.NewValue0(v.Pos, OpConst8, t) 9143 v0.AuxInt = int64(int8(c - d)) 9144 v.AddArg(v0) 9145 v.AddArg(x) 9146 return true 9147 } 9148 // match: (Eq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 9149 // cond: 9150 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9151 for { 9152 _ = v.Args[1] 9153 v_0 := v.Args[0] 9154 if v_0.Op != OpConst8 { 9155 break 9156 } 9157 t := v_0.Type 9158 c := v_0.AuxInt 9159 v_1 := v.Args[1] 9160 if v_1.Op != OpAdd8 { 9161 break 9162 } 9163 _ = v_1.Args[1] 9164 x := v_1.Args[0] 9165 v_1_1 := v_1.Args[1] 9166 if v_1_1.Op != OpConst8 { 9167 break 9168 } 9169 if v_1_1.Type != t { 9170 break 9171 } 9172 d := v_1_1.AuxInt 9173 v.reset(OpEq8) 9174 v0 := b.NewValue0(v.Pos, OpConst8, t) 9175 v0.AuxInt = int64(int8(c - d)) 9176 v.AddArg(v0) 9177 v.AddArg(x) 9178 return true 9179 } 9180 // match: (Eq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 9181 // cond: 9182 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9183 for { 9184 _ = v.Args[1] 9185 v_0 := v.Args[0] 9186 if v_0.Op != OpAdd8 { 9187 break 9188 } 9189 _ = v_0.Args[1] 9190 v_0_0 := v_0.Args[0] 9191 if v_0_0.Op != OpConst8 { 9192 break 9193 } 9194 t := v_0_0.Type 9195 d := v_0_0.AuxInt 9196 x := v_0.Args[1] 9197 v_1 := v.Args[1] 9198 if v_1.Op != OpConst8 { 9199 break 9200 } 9201 if v_1.Type != t { 9202 break 9203 } 9204 c := v_1.AuxInt 9205 v.reset(OpEq8) 9206 v0 := b.NewValue0(v.Pos, OpConst8, t) 9207 v0.AuxInt = int64(int8(c - d)) 9208 v.AddArg(v0) 9209 v.AddArg(x) 9210 return true 9211 } 9212 // match: (Eq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 9213 // cond: 9214 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9215 for { 9216 _ = v.Args[1] 9217 v_0 := v.Args[0] 9218 if v_0.Op != OpAdd8 { 9219 break 9220 } 9221 _ = v_0.Args[1] 9222 x := v_0.Args[0] 9223 v_0_1 := v_0.Args[1] 9224 if v_0_1.Op != OpConst8 { 9225 break 9226 } 9227 t := v_0_1.Type 9228 d := v_0_1.AuxInt 9229 v_1 := v.Args[1] 9230 if v_1.Op != OpConst8 { 9231 break 9232 } 9233 if v_1.Type != t { 9234 break 9235 } 9236 c := v_1.AuxInt 9237 v.reset(OpEq8) 9238 v0 := b.NewValue0(v.Pos, OpConst8, t) 9239 v0.AuxInt = int64(int8(c - d)) 9240 v.AddArg(v0) 9241 v.AddArg(x) 9242 return true 9243 } 9244 // match: (Eq8 (Const8 [c]) (Const8 [d])) 9245 // cond: 9246 // result: (ConstBool [b2i(c == d)]) 9247 for { 9248 _ = v.Args[1] 9249 v_0 := v.Args[0] 9250 if v_0.Op != OpConst8 { 9251 break 9252 } 9253 c := v_0.AuxInt 9254 v_1 := v.Args[1] 9255 if v_1.Op != OpConst8 { 9256 break 9257 } 9258 d := v_1.AuxInt 9259 v.reset(OpConstBool) 9260 v.AuxInt = b2i(c == d) 9261 return true 9262 } 9263 // match: (Eq8 (Const8 [d]) (Const8 [c])) 9264 // cond: 9265 // result: (ConstBool [b2i(c == d)]) 9266 for { 9267 _ = v.Args[1] 9268 v_0 := v.Args[0] 9269 if v_0.Op != OpConst8 { 9270 break 9271 } 9272 d := v_0.AuxInt 9273 v_1 := v.Args[1] 9274 if v_1.Op != OpConst8 { 9275 break 9276 } 9277 c := v_1.AuxInt 9278 v.reset(OpConstBool) 9279 v.AuxInt = b2i(c == d) 9280 return true 9281 } 9282 return false 9283 } 9284 func rewriteValuegeneric_OpEqB_0(v *Value) bool { 9285 // match: (EqB (ConstBool [c]) (ConstBool [d])) 9286 // cond: 9287 // result: (ConstBool [b2i(c == d)]) 9288 for { 9289 _ = v.Args[1] 9290 v_0 := v.Args[0] 9291 if v_0.Op != OpConstBool { 9292 break 9293 } 9294 c := v_0.AuxInt 9295 v_1 := v.Args[1] 9296 if v_1.Op != OpConstBool { 9297 break 9298 } 9299 d := v_1.AuxInt 9300 v.reset(OpConstBool) 9301 v.AuxInt = b2i(c == d) 9302 return true 9303 } 9304 // match: (EqB (ConstBool [d]) (ConstBool [c])) 9305 // cond: 9306 // result: (ConstBool [b2i(c == d)]) 9307 for { 9308 _ = v.Args[1] 9309 v_0 := v.Args[0] 9310 if v_0.Op != OpConstBool { 9311 break 9312 } 9313 d := v_0.AuxInt 9314 v_1 := v.Args[1] 9315 if v_1.Op != OpConstBool { 9316 break 9317 } 9318 c := v_1.AuxInt 9319 v.reset(OpConstBool) 9320 v.AuxInt = b2i(c == d) 9321 return true 9322 } 9323 // match: (EqB (ConstBool [0]) x) 9324 // cond: 9325 // result: (Not x) 9326 for { 9327 _ = v.Args[1] 9328 v_0 := v.Args[0] 9329 if v_0.Op != OpConstBool { 9330 break 9331 } 9332 if v_0.AuxInt != 0 { 9333 break 9334 } 9335 x := v.Args[1] 9336 v.reset(OpNot) 9337 v.AddArg(x) 9338 return true 9339 } 9340 // match: (EqB x (ConstBool [0])) 9341 // cond: 9342 // result: (Not x) 9343 for { 9344 _ = v.Args[1] 9345 x := v.Args[0] 9346 v_1 := v.Args[1] 9347 if v_1.Op != OpConstBool { 9348 break 9349 } 9350 if v_1.AuxInt != 0 { 9351 break 9352 } 9353 v.reset(OpNot) 9354 v.AddArg(x) 9355 return true 9356 } 9357 // match: (EqB (ConstBool [1]) x) 9358 // cond: 9359 // result: x 9360 for { 9361 _ = v.Args[1] 9362 v_0 := v.Args[0] 9363 if v_0.Op != OpConstBool { 9364 break 9365 } 9366 if v_0.AuxInt != 1 { 9367 break 9368 } 9369 x := v.Args[1] 9370 v.reset(OpCopy) 9371 v.Type = x.Type 9372 v.AddArg(x) 9373 return true 9374 } 9375 // match: (EqB x (ConstBool [1])) 9376 // cond: 9377 // result: x 9378 for { 9379 _ = v.Args[1] 9380 x := v.Args[0] 9381 v_1 := v.Args[1] 9382 if v_1.Op != OpConstBool { 9383 break 9384 } 9385 if v_1.AuxInt != 1 { 9386 break 9387 } 9388 v.reset(OpCopy) 9389 v.Type = x.Type 9390 v.AddArg(x) 9391 return true 9392 } 9393 return false 9394 } 9395 func rewriteValuegeneric_OpEqInter_0(v *Value) bool { 9396 b := v.Block 9397 _ = b 9398 typ := &b.Func.Config.Types 9399 _ = typ 9400 // match: (EqInter x y) 9401 // cond: 9402 // result: (EqPtr (ITab x) (ITab y)) 9403 for { 9404 _ = v.Args[1] 9405 x := v.Args[0] 9406 y := v.Args[1] 9407 v.reset(OpEqPtr) 9408 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9409 v0.AddArg(x) 9410 v.AddArg(v0) 9411 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9412 v1.AddArg(y) 9413 v.AddArg(v1) 9414 return true 9415 } 9416 } 9417 func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { 9418 b := v.Block 9419 _ = b 9420 typ := &b.Func.Config.Types 9421 _ = typ 9422 // match: (EqPtr p (ConstNil)) 9423 // cond: 9424 // result: (Not (IsNonNil p)) 9425 for { 9426 _ = v.Args[1] 9427 p := v.Args[0] 9428 v_1 := v.Args[1] 9429 if v_1.Op != OpConstNil { 9430 break 9431 } 9432 v.reset(OpNot) 9433 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9434 v0.AddArg(p) 9435 v.AddArg(v0) 9436 return true 9437 } 9438 // match: (EqPtr (ConstNil) p) 9439 // cond: 9440 // result: (Not (IsNonNil p)) 9441 for { 9442 _ = v.Args[1] 9443 v_0 := v.Args[0] 9444 if v_0.Op != OpConstNil { 9445 break 9446 } 9447 p := v.Args[1] 9448 v.reset(OpNot) 9449 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9450 v0.AddArg(p) 9451 v.AddArg(v0) 9452 return true 9453 } 9454 // match: (EqPtr x x) 9455 // cond: 9456 // result: (ConstBool [1]) 9457 for { 9458 _ = v.Args[1] 9459 x := v.Args[0] 9460 if x != v.Args[1] { 9461 break 9462 } 9463 v.reset(OpConstBool) 9464 v.AuxInt = 1 9465 return true 9466 } 9467 // match: (EqPtr (Addr {a} x) (Addr {b} x)) 9468 // cond: 9469 // result: (ConstBool [b2i(a == b)]) 9470 for { 9471 _ = v.Args[1] 9472 v_0 := v.Args[0] 9473 if v_0.Op != OpAddr { 9474 break 9475 } 9476 a := v_0.Aux 9477 x := v_0.Args[0] 9478 v_1 := v.Args[1] 9479 if v_1.Op != OpAddr { 9480 break 9481 } 9482 b := v_1.Aux 9483 if x != v_1.Args[0] { 9484 break 9485 } 9486 v.reset(OpConstBool) 9487 v.AuxInt = b2i(a == b) 9488 return true 9489 } 9490 // match: (EqPtr (Addr {b} x) (Addr {a} x)) 9491 // cond: 9492 // result: (ConstBool [b2i(a == b)]) 9493 for { 9494 _ = v.Args[1] 9495 v_0 := v.Args[0] 9496 if v_0.Op != OpAddr { 9497 break 9498 } 9499 b := v_0.Aux 9500 x := v_0.Args[0] 9501 v_1 := v.Args[1] 9502 if v_1.Op != OpAddr { 9503 break 9504 } 9505 a := v_1.Aux 9506 if x != v_1.Args[0] { 9507 break 9508 } 9509 v.reset(OpConstBool) 9510 v.AuxInt = b2i(a == b) 9511 return true 9512 } 9513 return false 9514 } 9515 func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { 9516 b := v.Block 9517 _ = b 9518 typ := &b.Func.Config.Types 9519 _ = typ 9520 // match: (EqSlice x y) 9521 // cond: 9522 // result: (EqPtr (SlicePtr x) (SlicePtr y)) 9523 for { 9524 _ = v.Args[1] 9525 x := v.Args[0] 9526 y := v.Args[1] 9527 v.reset(OpEqPtr) 9528 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9529 v0.AddArg(x) 9530 v.AddArg(v0) 9531 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9532 v1.AddArg(y) 9533 v.AddArg(v1) 9534 return true 9535 } 9536 } 9537 func rewriteValuegeneric_OpGeq16_0(v *Value) bool { 9538 // match: (Geq16 (Const16 [c]) (Const16 [d])) 9539 // cond: 9540 // result: (ConstBool [b2i(c >= d)]) 9541 for { 9542 _ = v.Args[1] 9543 v_0 := v.Args[0] 9544 if v_0.Op != OpConst16 { 9545 break 9546 } 9547 c := v_0.AuxInt 9548 v_1 := v.Args[1] 9549 if v_1.Op != OpConst16 { 9550 break 9551 } 9552 d := v_1.AuxInt 9553 v.reset(OpConstBool) 9554 v.AuxInt = b2i(c >= d) 9555 return true 9556 } 9557 return false 9558 } 9559 func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { 9560 // match: (Geq16U (Const16 [c]) (Const16 [d])) 9561 // cond: 9562 // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) 9563 for { 9564 _ = v.Args[1] 9565 v_0 := v.Args[0] 9566 if v_0.Op != OpConst16 { 9567 break 9568 } 9569 c := v_0.AuxInt 9570 v_1 := v.Args[1] 9571 if v_1.Op != OpConst16 { 9572 break 9573 } 9574 d := v_1.AuxInt 9575 v.reset(OpConstBool) 9576 v.AuxInt = b2i(uint16(c) >= uint16(d)) 9577 return true 9578 } 9579 return false 9580 } 9581 func rewriteValuegeneric_OpGeq32_0(v *Value) bool { 9582 // match: (Geq32 (Const32 [c]) (Const32 [d])) 9583 // cond: 9584 // result: (ConstBool [b2i(c >= d)]) 9585 for { 9586 _ = v.Args[1] 9587 v_0 := v.Args[0] 9588 if v_0.Op != OpConst32 { 9589 break 9590 } 9591 c := v_0.AuxInt 9592 v_1 := v.Args[1] 9593 if v_1.Op != OpConst32 { 9594 break 9595 } 9596 d := v_1.AuxInt 9597 v.reset(OpConstBool) 9598 v.AuxInt = b2i(c >= d) 9599 return true 9600 } 9601 return false 9602 } 9603 func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { 9604 // match: (Geq32U (Const32 [c]) (Const32 [d])) 9605 // cond: 9606 // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) 9607 for { 9608 _ = v.Args[1] 9609 v_0 := v.Args[0] 9610 if v_0.Op != OpConst32 { 9611 break 9612 } 9613 c := v_0.AuxInt 9614 v_1 := v.Args[1] 9615 if v_1.Op != OpConst32 { 9616 break 9617 } 9618 d := v_1.AuxInt 9619 v.reset(OpConstBool) 9620 v.AuxInt = b2i(uint32(c) >= uint32(d)) 9621 return true 9622 } 9623 return false 9624 } 9625 func rewriteValuegeneric_OpGeq64_0(v *Value) bool { 9626 // match: (Geq64 (Const64 [c]) (Const64 [d])) 9627 // cond: 9628 // result: (ConstBool [b2i(c >= d)]) 9629 for { 9630 _ = v.Args[1] 9631 v_0 := v.Args[0] 9632 if v_0.Op != OpConst64 { 9633 break 9634 } 9635 c := v_0.AuxInt 9636 v_1 := v.Args[1] 9637 if v_1.Op != OpConst64 { 9638 break 9639 } 9640 d := v_1.AuxInt 9641 v.reset(OpConstBool) 9642 v.AuxInt = b2i(c >= d) 9643 return true 9644 } 9645 return false 9646 } 9647 func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { 9648 // match: (Geq64U (Const64 [c]) (Const64 [d])) 9649 // cond: 9650 // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) 9651 for { 9652 _ = v.Args[1] 9653 v_0 := v.Args[0] 9654 if v_0.Op != OpConst64 { 9655 break 9656 } 9657 c := v_0.AuxInt 9658 v_1 := v.Args[1] 9659 if v_1.Op != OpConst64 { 9660 break 9661 } 9662 d := v_1.AuxInt 9663 v.reset(OpConstBool) 9664 v.AuxInt = b2i(uint64(c) >= uint64(d)) 9665 return true 9666 } 9667 return false 9668 } 9669 func rewriteValuegeneric_OpGeq8_0(v *Value) bool { 9670 // match: (Geq8 (Const8 [c]) (Const8 [d])) 9671 // cond: 9672 // result: (ConstBool [b2i(c >= d)]) 9673 for { 9674 _ = v.Args[1] 9675 v_0 := v.Args[0] 9676 if v_0.Op != OpConst8 { 9677 break 9678 } 9679 c := v_0.AuxInt 9680 v_1 := v.Args[1] 9681 if v_1.Op != OpConst8 { 9682 break 9683 } 9684 d := v_1.AuxInt 9685 v.reset(OpConstBool) 9686 v.AuxInt = b2i(c >= d) 9687 return true 9688 } 9689 return false 9690 } 9691 func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { 9692 // match: (Geq8U (Const8 [c]) (Const8 [d])) 9693 // cond: 9694 // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) 9695 for { 9696 _ = v.Args[1] 9697 v_0 := v.Args[0] 9698 if v_0.Op != OpConst8 { 9699 break 9700 } 9701 c := v_0.AuxInt 9702 v_1 := v.Args[1] 9703 if v_1.Op != OpConst8 { 9704 break 9705 } 9706 d := v_1.AuxInt 9707 v.reset(OpConstBool) 9708 v.AuxInt = b2i(uint8(c) >= uint8(d)) 9709 return true 9710 } 9711 return false 9712 } 9713 func rewriteValuegeneric_OpGreater16_0(v *Value) bool { 9714 // match: (Greater16 (Const16 [c]) (Const16 [d])) 9715 // cond: 9716 // result: (ConstBool [b2i(c > d)]) 9717 for { 9718 _ = v.Args[1] 9719 v_0 := v.Args[0] 9720 if v_0.Op != OpConst16 { 9721 break 9722 } 9723 c := v_0.AuxInt 9724 v_1 := v.Args[1] 9725 if v_1.Op != OpConst16 { 9726 break 9727 } 9728 d := v_1.AuxInt 9729 v.reset(OpConstBool) 9730 v.AuxInt = b2i(c > d) 9731 return true 9732 } 9733 return false 9734 } 9735 func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { 9736 // match: (Greater16U (Const16 [c]) (Const16 [d])) 9737 // cond: 9738 // result: (ConstBool [b2i(uint16(c) > uint16(d))]) 9739 for { 9740 _ = v.Args[1] 9741 v_0 := v.Args[0] 9742 if v_0.Op != OpConst16 { 9743 break 9744 } 9745 c := v_0.AuxInt 9746 v_1 := v.Args[1] 9747 if v_1.Op != OpConst16 { 9748 break 9749 } 9750 d := v_1.AuxInt 9751 v.reset(OpConstBool) 9752 v.AuxInt = b2i(uint16(c) > uint16(d)) 9753 return true 9754 } 9755 return false 9756 } 9757 func rewriteValuegeneric_OpGreater32_0(v *Value) bool { 9758 // match: (Greater32 (Const32 [c]) (Const32 [d])) 9759 // cond: 9760 // result: (ConstBool [b2i(c > d)]) 9761 for { 9762 _ = v.Args[1] 9763 v_0 := v.Args[0] 9764 if v_0.Op != OpConst32 { 9765 break 9766 } 9767 c := v_0.AuxInt 9768 v_1 := v.Args[1] 9769 if v_1.Op != OpConst32 { 9770 break 9771 } 9772 d := v_1.AuxInt 9773 v.reset(OpConstBool) 9774 v.AuxInt = b2i(c > d) 9775 return true 9776 } 9777 return false 9778 } 9779 func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { 9780 // match: (Greater32U (Const32 [c]) (Const32 [d])) 9781 // cond: 9782 // result: (ConstBool [b2i(uint32(c) > uint32(d))]) 9783 for { 9784 _ = v.Args[1] 9785 v_0 := v.Args[0] 9786 if v_0.Op != OpConst32 { 9787 break 9788 } 9789 c := v_0.AuxInt 9790 v_1 := v.Args[1] 9791 if v_1.Op != OpConst32 { 9792 break 9793 } 9794 d := v_1.AuxInt 9795 v.reset(OpConstBool) 9796 v.AuxInt = b2i(uint32(c) > uint32(d)) 9797 return true 9798 } 9799 return false 9800 } 9801 func rewriteValuegeneric_OpGreater64_0(v *Value) bool { 9802 // match: (Greater64 (Const64 [c]) (Const64 [d])) 9803 // cond: 9804 // result: (ConstBool [b2i(c > d)]) 9805 for { 9806 _ = v.Args[1] 9807 v_0 := v.Args[0] 9808 if v_0.Op != OpConst64 { 9809 break 9810 } 9811 c := v_0.AuxInt 9812 v_1 := v.Args[1] 9813 if v_1.Op != OpConst64 { 9814 break 9815 } 9816 d := v_1.AuxInt 9817 v.reset(OpConstBool) 9818 v.AuxInt = b2i(c > d) 9819 return true 9820 } 9821 return false 9822 } 9823 func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { 9824 // match: (Greater64U (Const64 [c]) (Const64 [d])) 9825 // cond: 9826 // result: (ConstBool [b2i(uint64(c) > uint64(d))]) 9827 for { 9828 _ = v.Args[1] 9829 v_0 := v.Args[0] 9830 if v_0.Op != OpConst64 { 9831 break 9832 } 9833 c := v_0.AuxInt 9834 v_1 := v.Args[1] 9835 if v_1.Op != OpConst64 { 9836 break 9837 } 9838 d := v_1.AuxInt 9839 v.reset(OpConstBool) 9840 v.AuxInt = b2i(uint64(c) > uint64(d)) 9841 return true 9842 } 9843 return false 9844 } 9845 func rewriteValuegeneric_OpGreater8_0(v *Value) bool { 9846 // match: (Greater8 (Const8 [c]) (Const8 [d])) 9847 // cond: 9848 // result: (ConstBool [b2i(c > d)]) 9849 for { 9850 _ = v.Args[1] 9851 v_0 := v.Args[0] 9852 if v_0.Op != OpConst8 { 9853 break 9854 } 9855 c := v_0.AuxInt 9856 v_1 := v.Args[1] 9857 if v_1.Op != OpConst8 { 9858 break 9859 } 9860 d := v_1.AuxInt 9861 v.reset(OpConstBool) 9862 v.AuxInt = b2i(c > d) 9863 return true 9864 } 9865 return false 9866 } 9867 func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { 9868 // match: (Greater8U (Const8 [c]) (Const8 [d])) 9869 // cond: 9870 // result: (ConstBool [b2i(uint8(c) > uint8(d))]) 9871 for { 9872 _ = v.Args[1] 9873 v_0 := v.Args[0] 9874 if v_0.Op != OpConst8 { 9875 break 9876 } 9877 c := v_0.AuxInt 9878 v_1 := v.Args[1] 9879 if v_1.Op != OpConst8 { 9880 break 9881 } 9882 d := v_1.AuxInt 9883 v.reset(OpConstBool) 9884 v.AuxInt = b2i(uint8(c) > uint8(d)) 9885 return true 9886 } 9887 return false 9888 } 9889 func rewriteValuegeneric_OpIMake_0(v *Value) bool { 9890 // match: (IMake typ (StructMake1 val)) 9891 // cond: 9892 // result: (IMake typ val) 9893 for { 9894 _ = v.Args[1] 9895 typ := v.Args[0] 9896 v_1 := v.Args[1] 9897 if v_1.Op != OpStructMake1 { 9898 break 9899 } 9900 val := v_1.Args[0] 9901 v.reset(OpIMake) 9902 v.AddArg(typ) 9903 v.AddArg(val) 9904 return true 9905 } 9906 // match: (IMake typ (ArrayMake1 val)) 9907 // cond: 9908 // result: (IMake typ val) 9909 for { 9910 _ = v.Args[1] 9911 typ := v.Args[0] 9912 v_1 := v.Args[1] 9913 if v_1.Op != OpArrayMake1 { 9914 break 9915 } 9916 val := v_1.Args[0] 9917 v.reset(OpIMake) 9918 v.AddArg(typ) 9919 v.AddArg(val) 9920 return true 9921 } 9922 return false 9923 } 9924 func rewriteValuegeneric_OpInterCall_0(v *Value) bool { 9925 // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) 9926 // cond: devirt(v, itab, off) != nil 9927 // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) 9928 for { 9929 argsize := v.AuxInt 9930 _ = v.Args[1] 9931 v_0 := v.Args[0] 9932 if v_0.Op != OpLoad { 9933 break 9934 } 9935 _ = v_0.Args[1] 9936 v_0_0 := v_0.Args[0] 9937 if v_0_0.Op != OpOffPtr { 9938 break 9939 } 9940 off := v_0_0.AuxInt 9941 v_0_0_0 := v_0_0.Args[0] 9942 if v_0_0_0.Op != OpITab { 9943 break 9944 } 9945 v_0_0_0_0 := v_0_0_0.Args[0] 9946 if v_0_0_0_0.Op != OpIMake { 9947 break 9948 } 9949 _ = v_0_0_0_0.Args[1] 9950 v_0_0_0_0_0 := v_0_0_0_0.Args[0] 9951 if v_0_0_0_0_0.Op != OpAddr { 9952 break 9953 } 9954 itab := v_0_0_0_0_0.Aux 9955 v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] 9956 if v_0_0_0_0_0_0.Op != OpSB { 9957 break 9958 } 9959 mem := v.Args[1] 9960 if !(devirt(v, itab, off) != nil) { 9961 break 9962 } 9963 v.reset(OpStaticCall) 9964 v.AuxInt = argsize 9965 v.Aux = devirt(v, itab, off) 9966 v.AddArg(mem) 9967 return true 9968 } 9969 return false 9970 } 9971 func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { 9972 // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) 9973 // cond: (1 << 8) <= c 9974 // result: (ConstBool [1]) 9975 for { 9976 _ = v.Args[1] 9977 v_0 := v.Args[0] 9978 if v_0.Op != OpZeroExt8to32 { 9979 break 9980 } 9981 v_1 := v.Args[1] 9982 if v_1.Op != OpConst32 { 9983 break 9984 } 9985 c := v_1.AuxInt 9986 if !((1 << 8) <= c) { 9987 break 9988 } 9989 v.reset(OpConstBool) 9990 v.AuxInt = 1 9991 return true 9992 } 9993 // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) 9994 // cond: (1 << 8) <= c 9995 // result: (ConstBool [1]) 9996 for { 9997 _ = v.Args[1] 9998 v_0 := v.Args[0] 9999 if v_0.Op != OpZeroExt8to64 { 10000 break 10001 } 10002 v_1 := v.Args[1] 10003 if v_1.Op != OpConst64 { 10004 break 10005 } 10006 c := v_1.AuxInt 10007 if !((1 << 8) <= c) { 10008 break 10009 } 10010 v.reset(OpConstBool) 10011 v.AuxInt = 1 10012 return true 10013 } 10014 // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) 10015 // cond: (1 << 16) <= c 10016 // result: (ConstBool [1]) 10017 for { 10018 _ = v.Args[1] 10019 v_0 := v.Args[0] 10020 if v_0.Op != OpZeroExt16to32 { 10021 break 10022 } 10023 v_1 := v.Args[1] 10024 if v_1.Op != OpConst32 { 10025 break 10026 } 10027 c := v_1.AuxInt 10028 if !((1 << 16) <= c) { 10029 break 10030 } 10031 v.reset(OpConstBool) 10032 v.AuxInt = 1 10033 return true 10034 } 10035 // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) 10036 // cond: (1 << 16) <= c 10037 // result: (ConstBool [1]) 10038 for { 10039 _ = v.Args[1] 10040 v_0 := v.Args[0] 10041 if v_0.Op != OpZeroExt16to64 { 10042 break 10043 } 10044 v_1 := v.Args[1] 10045 if v_1.Op != OpConst64 { 10046 break 10047 } 10048 c := v_1.AuxInt 10049 if !((1 << 16) <= c) { 10050 break 10051 } 10052 v.reset(OpConstBool) 10053 v.AuxInt = 1 10054 return true 10055 } 10056 // match: (IsInBounds x x) 10057 // cond: 10058 // result: (ConstBool [0]) 10059 for { 10060 _ = v.Args[1] 10061 x := v.Args[0] 10062 if x != v.Args[1] { 10063 break 10064 } 10065 v.reset(OpConstBool) 10066 v.AuxInt = 0 10067 return true 10068 } 10069 // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) 10070 // cond: 0 <= c && c < d 10071 // result: (ConstBool [1]) 10072 for { 10073 _ = v.Args[1] 10074 v_0 := v.Args[0] 10075 if v_0.Op != OpAnd8 { 10076 break 10077 } 10078 _ = v_0.Args[1] 10079 v_0_0 := v_0.Args[0] 10080 if v_0_0.Op != OpConst8 { 10081 break 10082 } 10083 c := v_0_0.AuxInt 10084 v_1 := v.Args[1] 10085 if v_1.Op != OpConst8 { 10086 break 10087 } 10088 d := v_1.AuxInt 10089 if !(0 <= c && c < d) { 10090 break 10091 } 10092 v.reset(OpConstBool) 10093 v.AuxInt = 1 10094 return true 10095 } 10096 // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) 10097 // cond: 0 <= c && c < d 10098 // result: (ConstBool [1]) 10099 for { 10100 _ = v.Args[1] 10101 v_0 := v.Args[0] 10102 if v_0.Op != OpAnd8 { 10103 break 10104 } 10105 _ = v_0.Args[1] 10106 v_0_1 := v_0.Args[1] 10107 if v_0_1.Op != OpConst8 { 10108 break 10109 } 10110 c := v_0_1.AuxInt 10111 v_1 := v.Args[1] 10112 if v_1.Op != OpConst8 { 10113 break 10114 } 10115 d := v_1.AuxInt 10116 if !(0 <= c && c < d) { 10117 break 10118 } 10119 v.reset(OpConstBool) 10120 v.AuxInt = 1 10121 return true 10122 } 10123 // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) 10124 // cond: 0 <= c && c < d 10125 // result: (ConstBool [1]) 10126 for { 10127 _ = v.Args[1] 10128 v_0 := v.Args[0] 10129 if v_0.Op != OpZeroExt8to16 { 10130 break 10131 } 10132 v_0_0 := v_0.Args[0] 10133 if v_0_0.Op != OpAnd8 { 10134 break 10135 } 10136 _ = v_0_0.Args[1] 10137 v_0_0_0 := v_0_0.Args[0] 10138 if v_0_0_0.Op != OpConst8 { 10139 break 10140 } 10141 c := v_0_0_0.AuxInt 10142 v_1 := v.Args[1] 10143 if v_1.Op != OpConst16 { 10144 break 10145 } 10146 d := v_1.AuxInt 10147 if !(0 <= c && c < d) { 10148 break 10149 } 10150 v.reset(OpConstBool) 10151 v.AuxInt = 1 10152 return true 10153 } 10154 // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) 10155 // cond: 0 <= c && c < d 10156 // result: (ConstBool [1]) 10157 for { 10158 _ = v.Args[1] 10159 v_0 := v.Args[0] 10160 if v_0.Op != OpZeroExt8to16 { 10161 break 10162 } 10163 v_0_0 := v_0.Args[0] 10164 if v_0_0.Op != OpAnd8 { 10165 break 10166 } 10167 _ = v_0_0.Args[1] 10168 v_0_0_1 := v_0_0.Args[1] 10169 if v_0_0_1.Op != OpConst8 { 10170 break 10171 } 10172 c := v_0_0_1.AuxInt 10173 v_1 := v.Args[1] 10174 if v_1.Op != OpConst16 { 10175 break 10176 } 10177 d := v_1.AuxInt 10178 if !(0 <= c && c < d) { 10179 break 10180 } 10181 v.reset(OpConstBool) 10182 v.AuxInt = 1 10183 return true 10184 } 10185 // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) 10186 // cond: 0 <= c && c < d 10187 // result: (ConstBool [1]) 10188 for { 10189 _ = v.Args[1] 10190 v_0 := v.Args[0] 10191 if v_0.Op != OpZeroExt8to32 { 10192 break 10193 } 10194 v_0_0 := v_0.Args[0] 10195 if v_0_0.Op != OpAnd8 { 10196 break 10197 } 10198 _ = v_0_0.Args[1] 10199 v_0_0_0 := v_0_0.Args[0] 10200 if v_0_0_0.Op != OpConst8 { 10201 break 10202 } 10203 c := v_0_0_0.AuxInt 10204 v_1 := v.Args[1] 10205 if v_1.Op != OpConst32 { 10206 break 10207 } 10208 d := v_1.AuxInt 10209 if !(0 <= c && c < d) { 10210 break 10211 } 10212 v.reset(OpConstBool) 10213 v.AuxInt = 1 10214 return true 10215 } 10216 return false 10217 } 10218 func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { 10219 // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) 10220 // cond: 0 <= c && c < d 10221 // result: (ConstBool [1]) 10222 for { 10223 _ = v.Args[1] 10224 v_0 := v.Args[0] 10225 if v_0.Op != OpZeroExt8to32 { 10226 break 10227 } 10228 v_0_0 := v_0.Args[0] 10229 if v_0_0.Op != OpAnd8 { 10230 break 10231 } 10232 _ = v_0_0.Args[1] 10233 v_0_0_1 := v_0_0.Args[1] 10234 if v_0_0_1.Op != OpConst8 { 10235 break 10236 } 10237 c := v_0_0_1.AuxInt 10238 v_1 := v.Args[1] 10239 if v_1.Op != OpConst32 { 10240 break 10241 } 10242 d := v_1.AuxInt 10243 if !(0 <= c && c < d) { 10244 break 10245 } 10246 v.reset(OpConstBool) 10247 v.AuxInt = 1 10248 return true 10249 } 10250 // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) 10251 // cond: 0 <= c && c < d 10252 // result: (ConstBool [1]) 10253 for { 10254 _ = v.Args[1] 10255 v_0 := v.Args[0] 10256 if v_0.Op != OpZeroExt8to64 { 10257 break 10258 } 10259 v_0_0 := v_0.Args[0] 10260 if v_0_0.Op != OpAnd8 { 10261 break 10262 } 10263 _ = v_0_0.Args[1] 10264 v_0_0_0 := v_0_0.Args[0] 10265 if v_0_0_0.Op != OpConst8 { 10266 break 10267 } 10268 c := v_0_0_0.AuxInt 10269 v_1 := v.Args[1] 10270 if v_1.Op != OpConst64 { 10271 break 10272 } 10273 d := v_1.AuxInt 10274 if !(0 <= c && c < d) { 10275 break 10276 } 10277 v.reset(OpConstBool) 10278 v.AuxInt = 1 10279 return true 10280 } 10281 // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) 10282 // cond: 0 <= c && c < d 10283 // result: (ConstBool [1]) 10284 for { 10285 _ = v.Args[1] 10286 v_0 := v.Args[0] 10287 if v_0.Op != OpZeroExt8to64 { 10288 break 10289 } 10290 v_0_0 := v_0.Args[0] 10291 if v_0_0.Op != OpAnd8 { 10292 break 10293 } 10294 _ = v_0_0.Args[1] 10295 v_0_0_1 := v_0_0.Args[1] 10296 if v_0_0_1.Op != OpConst8 { 10297 break 10298 } 10299 c := v_0_0_1.AuxInt 10300 v_1 := v.Args[1] 10301 if v_1.Op != OpConst64 { 10302 break 10303 } 10304 d := v_1.AuxInt 10305 if !(0 <= c && c < d) { 10306 break 10307 } 10308 v.reset(OpConstBool) 10309 v.AuxInt = 1 10310 return true 10311 } 10312 // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) 10313 // cond: 0 <= c && c < d 10314 // result: (ConstBool [1]) 10315 for { 10316 _ = v.Args[1] 10317 v_0 := v.Args[0] 10318 if v_0.Op != OpAnd16 { 10319 break 10320 } 10321 _ = v_0.Args[1] 10322 v_0_0 := v_0.Args[0] 10323 if v_0_0.Op != OpConst16 { 10324 break 10325 } 10326 c := v_0_0.AuxInt 10327 v_1 := v.Args[1] 10328 if v_1.Op != OpConst16 { 10329 break 10330 } 10331 d := v_1.AuxInt 10332 if !(0 <= c && c < d) { 10333 break 10334 } 10335 v.reset(OpConstBool) 10336 v.AuxInt = 1 10337 return true 10338 } 10339 // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) 10340 // cond: 0 <= c && c < d 10341 // result: (ConstBool [1]) 10342 for { 10343 _ = v.Args[1] 10344 v_0 := v.Args[0] 10345 if v_0.Op != OpAnd16 { 10346 break 10347 } 10348 _ = v_0.Args[1] 10349 v_0_1 := v_0.Args[1] 10350 if v_0_1.Op != OpConst16 { 10351 break 10352 } 10353 c := v_0_1.AuxInt 10354 v_1 := v.Args[1] 10355 if v_1.Op != OpConst16 { 10356 break 10357 } 10358 d := v_1.AuxInt 10359 if !(0 <= c && c < d) { 10360 break 10361 } 10362 v.reset(OpConstBool) 10363 v.AuxInt = 1 10364 return true 10365 } 10366 // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) 10367 // cond: 0 <= c && c < d 10368 // result: (ConstBool [1]) 10369 for { 10370 _ = v.Args[1] 10371 v_0 := v.Args[0] 10372 if v_0.Op != OpZeroExt16to32 { 10373 break 10374 } 10375 v_0_0 := v_0.Args[0] 10376 if v_0_0.Op != OpAnd16 { 10377 break 10378 } 10379 _ = v_0_0.Args[1] 10380 v_0_0_0 := v_0_0.Args[0] 10381 if v_0_0_0.Op != OpConst16 { 10382 break 10383 } 10384 c := v_0_0_0.AuxInt 10385 v_1 := v.Args[1] 10386 if v_1.Op != OpConst32 { 10387 break 10388 } 10389 d := v_1.AuxInt 10390 if !(0 <= c && c < d) { 10391 break 10392 } 10393 v.reset(OpConstBool) 10394 v.AuxInt = 1 10395 return true 10396 } 10397 // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) 10398 // cond: 0 <= c && c < d 10399 // result: (ConstBool [1]) 10400 for { 10401 _ = v.Args[1] 10402 v_0 := v.Args[0] 10403 if v_0.Op != OpZeroExt16to32 { 10404 break 10405 } 10406 v_0_0 := v_0.Args[0] 10407 if v_0_0.Op != OpAnd16 { 10408 break 10409 } 10410 _ = v_0_0.Args[1] 10411 v_0_0_1 := v_0_0.Args[1] 10412 if v_0_0_1.Op != OpConst16 { 10413 break 10414 } 10415 c := v_0_0_1.AuxInt 10416 v_1 := v.Args[1] 10417 if v_1.Op != OpConst32 { 10418 break 10419 } 10420 d := v_1.AuxInt 10421 if !(0 <= c && c < d) { 10422 break 10423 } 10424 v.reset(OpConstBool) 10425 v.AuxInt = 1 10426 return true 10427 } 10428 // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) 10429 // cond: 0 <= c && c < d 10430 // result: (ConstBool [1]) 10431 for { 10432 _ = v.Args[1] 10433 v_0 := v.Args[0] 10434 if v_0.Op != OpZeroExt16to64 { 10435 break 10436 } 10437 v_0_0 := v_0.Args[0] 10438 if v_0_0.Op != OpAnd16 { 10439 break 10440 } 10441 _ = v_0_0.Args[1] 10442 v_0_0_0 := v_0_0.Args[0] 10443 if v_0_0_0.Op != OpConst16 { 10444 break 10445 } 10446 c := v_0_0_0.AuxInt 10447 v_1 := v.Args[1] 10448 if v_1.Op != OpConst64 { 10449 break 10450 } 10451 d := v_1.AuxInt 10452 if !(0 <= c && c < d) { 10453 break 10454 } 10455 v.reset(OpConstBool) 10456 v.AuxInt = 1 10457 return true 10458 } 10459 // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) 10460 // cond: 0 <= c && c < d 10461 // result: (ConstBool [1]) 10462 for { 10463 _ = v.Args[1] 10464 v_0 := v.Args[0] 10465 if v_0.Op != OpZeroExt16to64 { 10466 break 10467 } 10468 v_0_0 := v_0.Args[0] 10469 if v_0_0.Op != OpAnd16 { 10470 break 10471 } 10472 _ = v_0_0.Args[1] 10473 v_0_0_1 := v_0_0.Args[1] 10474 if v_0_0_1.Op != OpConst16 { 10475 break 10476 } 10477 c := v_0_0_1.AuxInt 10478 v_1 := v.Args[1] 10479 if v_1.Op != OpConst64 { 10480 break 10481 } 10482 d := v_1.AuxInt 10483 if !(0 <= c && c < d) { 10484 break 10485 } 10486 v.reset(OpConstBool) 10487 v.AuxInt = 1 10488 return true 10489 } 10490 // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) 10491 // cond: 0 <= c && c < d 10492 // result: (ConstBool [1]) 10493 for { 10494 _ = v.Args[1] 10495 v_0 := v.Args[0] 10496 if v_0.Op != OpAnd32 { 10497 break 10498 } 10499 _ = v_0.Args[1] 10500 v_0_0 := v_0.Args[0] 10501 if v_0_0.Op != OpConst32 { 10502 break 10503 } 10504 c := v_0_0.AuxInt 10505 v_1 := v.Args[1] 10506 if v_1.Op != OpConst32 { 10507 break 10508 } 10509 d := v_1.AuxInt 10510 if !(0 <= c && c < d) { 10511 break 10512 } 10513 v.reset(OpConstBool) 10514 v.AuxInt = 1 10515 return true 10516 } 10517 return false 10518 } 10519 func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { 10520 // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) 10521 // cond: 0 <= c && c < d 10522 // result: (ConstBool [1]) 10523 for { 10524 _ = v.Args[1] 10525 v_0 := v.Args[0] 10526 if v_0.Op != OpAnd32 { 10527 break 10528 } 10529 _ = v_0.Args[1] 10530 v_0_1 := v_0.Args[1] 10531 if v_0_1.Op != OpConst32 { 10532 break 10533 } 10534 c := v_0_1.AuxInt 10535 v_1 := v.Args[1] 10536 if v_1.Op != OpConst32 { 10537 break 10538 } 10539 d := v_1.AuxInt 10540 if !(0 <= c && c < d) { 10541 break 10542 } 10543 v.reset(OpConstBool) 10544 v.AuxInt = 1 10545 return true 10546 } 10547 // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) 10548 // cond: 0 <= c && c < d 10549 // result: (ConstBool [1]) 10550 for { 10551 _ = v.Args[1] 10552 v_0 := v.Args[0] 10553 if v_0.Op != OpZeroExt32to64 { 10554 break 10555 } 10556 v_0_0 := v_0.Args[0] 10557 if v_0_0.Op != OpAnd32 { 10558 break 10559 } 10560 _ = v_0_0.Args[1] 10561 v_0_0_0 := v_0_0.Args[0] 10562 if v_0_0_0.Op != OpConst32 { 10563 break 10564 } 10565 c := v_0_0_0.AuxInt 10566 v_1 := v.Args[1] 10567 if v_1.Op != OpConst64 { 10568 break 10569 } 10570 d := v_1.AuxInt 10571 if !(0 <= c && c < d) { 10572 break 10573 } 10574 v.reset(OpConstBool) 10575 v.AuxInt = 1 10576 return true 10577 } 10578 // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) 10579 // cond: 0 <= c && c < d 10580 // result: (ConstBool [1]) 10581 for { 10582 _ = v.Args[1] 10583 v_0 := v.Args[0] 10584 if v_0.Op != OpZeroExt32to64 { 10585 break 10586 } 10587 v_0_0 := v_0.Args[0] 10588 if v_0_0.Op != OpAnd32 { 10589 break 10590 } 10591 _ = v_0_0.Args[1] 10592 v_0_0_1 := v_0_0.Args[1] 10593 if v_0_0_1.Op != OpConst32 { 10594 break 10595 } 10596 c := v_0_0_1.AuxInt 10597 v_1 := v.Args[1] 10598 if v_1.Op != OpConst64 { 10599 break 10600 } 10601 d := v_1.AuxInt 10602 if !(0 <= c && c < d) { 10603 break 10604 } 10605 v.reset(OpConstBool) 10606 v.AuxInt = 1 10607 return true 10608 } 10609 // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) 10610 // cond: 0 <= c && c < d 10611 // result: (ConstBool [1]) 10612 for { 10613 _ = v.Args[1] 10614 v_0 := v.Args[0] 10615 if v_0.Op != OpAnd64 { 10616 break 10617 } 10618 _ = v_0.Args[1] 10619 v_0_0 := v_0.Args[0] 10620 if v_0_0.Op != OpConst64 { 10621 break 10622 } 10623 c := v_0_0.AuxInt 10624 v_1 := v.Args[1] 10625 if v_1.Op != OpConst64 { 10626 break 10627 } 10628 d := v_1.AuxInt 10629 if !(0 <= c && c < d) { 10630 break 10631 } 10632 v.reset(OpConstBool) 10633 v.AuxInt = 1 10634 return true 10635 } 10636 // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) 10637 // cond: 0 <= c && c < d 10638 // result: (ConstBool [1]) 10639 for { 10640 _ = v.Args[1] 10641 v_0 := v.Args[0] 10642 if v_0.Op != OpAnd64 { 10643 break 10644 } 10645 _ = v_0.Args[1] 10646 v_0_1 := v_0.Args[1] 10647 if v_0_1.Op != OpConst64 { 10648 break 10649 } 10650 c := v_0_1.AuxInt 10651 v_1 := v.Args[1] 10652 if v_1.Op != OpConst64 { 10653 break 10654 } 10655 d := v_1.AuxInt 10656 if !(0 <= c && c < d) { 10657 break 10658 } 10659 v.reset(OpConstBool) 10660 v.AuxInt = 1 10661 return true 10662 } 10663 // match: (IsInBounds (Const32 [c]) (Const32 [d])) 10664 // cond: 10665 // result: (ConstBool [b2i(0 <= c && c < d)]) 10666 for { 10667 _ = v.Args[1] 10668 v_0 := v.Args[0] 10669 if v_0.Op != OpConst32 { 10670 break 10671 } 10672 c := v_0.AuxInt 10673 v_1 := v.Args[1] 10674 if v_1.Op != OpConst32 { 10675 break 10676 } 10677 d := v_1.AuxInt 10678 v.reset(OpConstBool) 10679 v.AuxInt = b2i(0 <= c && c < d) 10680 return true 10681 } 10682 // match: (IsInBounds (Const64 [c]) (Const64 [d])) 10683 // cond: 10684 // result: (ConstBool [b2i(0 <= c && c < d)]) 10685 for { 10686 _ = v.Args[1] 10687 v_0 := v.Args[0] 10688 if v_0.Op != OpConst64 { 10689 break 10690 } 10691 c := v_0.AuxInt 10692 v_1 := v.Args[1] 10693 if v_1.Op != OpConst64 { 10694 break 10695 } 10696 d := v_1.AuxInt 10697 v.reset(OpConstBool) 10698 v.AuxInt = b2i(0 <= c && c < d) 10699 return true 10700 } 10701 // match: (IsInBounds (Mod32u _ y) y) 10702 // cond: 10703 // result: (ConstBool [1]) 10704 for { 10705 _ = v.Args[1] 10706 v_0 := v.Args[0] 10707 if v_0.Op != OpMod32u { 10708 break 10709 } 10710 _ = v_0.Args[1] 10711 y := v_0.Args[1] 10712 if y != v.Args[1] { 10713 break 10714 } 10715 v.reset(OpConstBool) 10716 v.AuxInt = 1 10717 return true 10718 } 10719 // match: (IsInBounds (Mod64u _ y) y) 10720 // cond: 10721 // result: (ConstBool [1]) 10722 for { 10723 _ = v.Args[1] 10724 v_0 := v.Args[0] 10725 if v_0.Op != OpMod64u { 10726 break 10727 } 10728 _ = v_0.Args[1] 10729 y := v_0.Args[1] 10730 if y != v.Args[1] { 10731 break 10732 } 10733 v.reset(OpConstBool) 10734 v.AuxInt = 1 10735 return true 10736 } 10737 // match: (IsInBounds (ZeroExt8to64 (Rsh8Ux64 _ (Const64 [c]))) (Const64 [d])) 10738 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 10739 // result: (ConstBool [1]) 10740 for { 10741 _ = v.Args[1] 10742 v_0 := v.Args[0] 10743 if v_0.Op != OpZeroExt8to64 { 10744 break 10745 } 10746 v_0_0 := v_0.Args[0] 10747 if v_0_0.Op != OpRsh8Ux64 { 10748 break 10749 } 10750 _ = v_0_0.Args[1] 10751 v_0_0_1 := v_0_0.Args[1] 10752 if v_0_0_1.Op != OpConst64 { 10753 break 10754 } 10755 c := v_0_0_1.AuxInt 10756 v_1 := v.Args[1] 10757 if v_1.Op != OpConst64 { 10758 break 10759 } 10760 d := v_1.AuxInt 10761 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 10762 break 10763 } 10764 v.reset(OpConstBool) 10765 v.AuxInt = 1 10766 return true 10767 } 10768 return false 10769 } 10770 func rewriteValuegeneric_OpIsInBounds_30(v *Value) bool { 10771 // match: (IsInBounds (ZeroExt8to32 (Rsh8Ux64 _ (Const64 [c]))) (Const32 [d])) 10772 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 10773 // result: (ConstBool [1]) 10774 for { 10775 _ = v.Args[1] 10776 v_0 := v.Args[0] 10777 if v_0.Op != OpZeroExt8to32 { 10778 break 10779 } 10780 v_0_0 := v_0.Args[0] 10781 if v_0_0.Op != OpRsh8Ux64 { 10782 break 10783 } 10784 _ = v_0_0.Args[1] 10785 v_0_0_1 := v_0_0.Args[1] 10786 if v_0_0_1.Op != OpConst64 { 10787 break 10788 } 10789 c := v_0_0_1.AuxInt 10790 v_1 := v.Args[1] 10791 if v_1.Op != OpConst32 { 10792 break 10793 } 10794 d := v_1.AuxInt 10795 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 10796 break 10797 } 10798 v.reset(OpConstBool) 10799 v.AuxInt = 1 10800 return true 10801 } 10802 // match: (IsInBounds (ZeroExt8to16 (Rsh8Ux64 _ (Const64 [c]))) (Const16 [d])) 10803 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 10804 // result: (ConstBool [1]) 10805 for { 10806 _ = v.Args[1] 10807 v_0 := v.Args[0] 10808 if v_0.Op != OpZeroExt8to16 { 10809 break 10810 } 10811 v_0_0 := v_0.Args[0] 10812 if v_0_0.Op != OpRsh8Ux64 { 10813 break 10814 } 10815 _ = v_0_0.Args[1] 10816 v_0_0_1 := v_0_0.Args[1] 10817 if v_0_0_1.Op != OpConst64 { 10818 break 10819 } 10820 c := v_0_0_1.AuxInt 10821 v_1 := v.Args[1] 10822 if v_1.Op != OpConst16 { 10823 break 10824 } 10825 d := v_1.AuxInt 10826 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 10827 break 10828 } 10829 v.reset(OpConstBool) 10830 v.AuxInt = 1 10831 return true 10832 } 10833 // match: (IsInBounds (Rsh8Ux64 _ (Const64 [c])) (Const64 [d])) 10834 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 10835 // result: (ConstBool [1]) 10836 for { 10837 _ = v.Args[1] 10838 v_0 := v.Args[0] 10839 if v_0.Op != OpRsh8Ux64 { 10840 break 10841 } 10842 _ = v_0.Args[1] 10843 v_0_1 := v_0.Args[1] 10844 if v_0_1.Op != OpConst64 { 10845 break 10846 } 10847 c := v_0_1.AuxInt 10848 v_1 := v.Args[1] 10849 if v_1.Op != OpConst64 { 10850 break 10851 } 10852 d := v_1.AuxInt 10853 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 10854 break 10855 } 10856 v.reset(OpConstBool) 10857 v.AuxInt = 1 10858 return true 10859 } 10860 // match: (IsInBounds (ZeroExt16to64 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 10861 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 10862 // result: (ConstBool [1]) 10863 for { 10864 _ = v.Args[1] 10865 v_0 := v.Args[0] 10866 if v_0.Op != OpZeroExt16to64 { 10867 break 10868 } 10869 v_0_0 := v_0.Args[0] 10870 if v_0_0.Op != OpRsh16Ux64 { 10871 break 10872 } 10873 _ = v_0_0.Args[1] 10874 v_0_0_1 := v_0_0.Args[1] 10875 if v_0_0_1.Op != OpConst64 { 10876 break 10877 } 10878 c := v_0_0_1.AuxInt 10879 v_1 := v.Args[1] 10880 if v_1.Op != OpConst64 { 10881 break 10882 } 10883 d := v_1.AuxInt 10884 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 10885 break 10886 } 10887 v.reset(OpConstBool) 10888 v.AuxInt = 1 10889 return true 10890 } 10891 // match: (IsInBounds (ZeroExt16to32 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 10892 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 10893 // result: (ConstBool [1]) 10894 for { 10895 _ = v.Args[1] 10896 v_0 := v.Args[0] 10897 if v_0.Op != OpZeroExt16to32 { 10898 break 10899 } 10900 v_0_0 := v_0.Args[0] 10901 if v_0_0.Op != OpRsh16Ux64 { 10902 break 10903 } 10904 _ = v_0_0.Args[1] 10905 v_0_0_1 := v_0_0.Args[1] 10906 if v_0_0_1.Op != OpConst64 { 10907 break 10908 } 10909 c := v_0_0_1.AuxInt 10910 v_1 := v.Args[1] 10911 if v_1.Op != OpConst64 { 10912 break 10913 } 10914 d := v_1.AuxInt 10915 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 10916 break 10917 } 10918 v.reset(OpConstBool) 10919 v.AuxInt = 1 10920 return true 10921 } 10922 // match: (IsInBounds (Rsh16Ux64 _ (Const64 [c])) (Const64 [d])) 10923 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 10924 // result: (ConstBool [1]) 10925 for { 10926 _ = v.Args[1] 10927 v_0 := v.Args[0] 10928 if v_0.Op != OpRsh16Ux64 { 10929 break 10930 } 10931 _ = v_0.Args[1] 10932 v_0_1 := v_0.Args[1] 10933 if v_0_1.Op != OpConst64 { 10934 break 10935 } 10936 c := v_0_1.AuxInt 10937 v_1 := v.Args[1] 10938 if v_1.Op != OpConst64 { 10939 break 10940 } 10941 d := v_1.AuxInt 10942 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 10943 break 10944 } 10945 v.reset(OpConstBool) 10946 v.AuxInt = 1 10947 return true 10948 } 10949 // match: (IsInBounds (ZeroExt32to64 (Rsh32Ux64 _ (Const64 [c]))) (Const64 [d])) 10950 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 10951 // result: (ConstBool [1]) 10952 for { 10953 _ = v.Args[1] 10954 v_0 := v.Args[0] 10955 if v_0.Op != OpZeroExt32to64 { 10956 break 10957 } 10958 v_0_0 := v_0.Args[0] 10959 if v_0_0.Op != OpRsh32Ux64 { 10960 break 10961 } 10962 _ = v_0_0.Args[1] 10963 v_0_0_1 := v_0_0.Args[1] 10964 if v_0_0_1.Op != OpConst64 { 10965 break 10966 } 10967 c := v_0_0_1.AuxInt 10968 v_1 := v.Args[1] 10969 if v_1.Op != OpConst64 { 10970 break 10971 } 10972 d := v_1.AuxInt 10973 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 10974 break 10975 } 10976 v.reset(OpConstBool) 10977 v.AuxInt = 1 10978 return true 10979 } 10980 // match: (IsInBounds (Rsh32Ux64 _ (Const64 [c])) (Const64 [d])) 10981 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 10982 // result: (ConstBool [1]) 10983 for { 10984 _ = v.Args[1] 10985 v_0 := v.Args[0] 10986 if v_0.Op != OpRsh32Ux64 { 10987 break 10988 } 10989 _ = v_0.Args[1] 10990 v_0_1 := v_0.Args[1] 10991 if v_0_1.Op != OpConst64 { 10992 break 10993 } 10994 c := v_0_1.AuxInt 10995 v_1 := v.Args[1] 10996 if v_1.Op != OpConst64 { 10997 break 10998 } 10999 d := v_1.AuxInt 11000 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 11001 break 11002 } 11003 v.reset(OpConstBool) 11004 v.AuxInt = 1 11005 return true 11006 } 11007 // match: (IsInBounds (Rsh64Ux64 _ (Const64 [c])) (Const64 [d])) 11008 // cond: 0 < c && c < 64 && 1<<uint(64-c)-1 < d 11009 // result: (ConstBool [1]) 11010 for { 11011 _ = v.Args[1] 11012 v_0 := v.Args[0] 11013 if v_0.Op != OpRsh64Ux64 { 11014 break 11015 } 11016 _ = v_0.Args[1] 11017 v_0_1 := v_0.Args[1] 11018 if v_0_1.Op != OpConst64 { 11019 break 11020 } 11021 c := v_0_1.AuxInt 11022 v_1 := v.Args[1] 11023 if v_1.Op != OpConst64 { 11024 break 11025 } 11026 d := v_1.AuxInt 11027 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) { 11028 break 11029 } 11030 v.reset(OpConstBool) 11031 v.AuxInt = 1 11032 return true 11033 } 11034 return false 11035 } 11036 func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { 11037 // match: (IsNonNil (ConstNil)) 11038 // cond: 11039 // result: (ConstBool [0]) 11040 for { 11041 v_0 := v.Args[0] 11042 if v_0.Op != OpConstNil { 11043 break 11044 } 11045 v.reset(OpConstBool) 11046 v.AuxInt = 0 11047 return true 11048 } 11049 return false 11050 } 11051 func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { 11052 // match: (IsSliceInBounds x x) 11053 // cond: 11054 // result: (ConstBool [1]) 11055 for { 11056 _ = v.Args[1] 11057 x := v.Args[0] 11058 if x != v.Args[1] { 11059 break 11060 } 11061 v.reset(OpConstBool) 11062 v.AuxInt = 1 11063 return true 11064 } 11065 // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) 11066 // cond: 0 <= c && c <= d 11067 // result: (ConstBool [1]) 11068 for { 11069 _ = v.Args[1] 11070 v_0 := v.Args[0] 11071 if v_0.Op != OpAnd32 { 11072 break 11073 } 11074 _ = v_0.Args[1] 11075 v_0_0 := v_0.Args[0] 11076 if v_0_0.Op != OpConst32 { 11077 break 11078 } 11079 c := v_0_0.AuxInt 11080 v_1 := v.Args[1] 11081 if v_1.Op != OpConst32 { 11082 break 11083 } 11084 d := v_1.AuxInt 11085 if !(0 <= c && c <= d) { 11086 break 11087 } 11088 v.reset(OpConstBool) 11089 v.AuxInt = 1 11090 return true 11091 } 11092 // match: (IsSliceInBounds (And32 _ (Const32 [c])) (Const32 [d])) 11093 // cond: 0 <= c && c <= d 11094 // result: (ConstBool [1]) 11095 for { 11096 _ = v.Args[1] 11097 v_0 := v.Args[0] 11098 if v_0.Op != OpAnd32 { 11099 break 11100 } 11101 _ = v_0.Args[1] 11102 v_0_1 := v_0.Args[1] 11103 if v_0_1.Op != OpConst32 { 11104 break 11105 } 11106 c := v_0_1.AuxInt 11107 v_1 := v.Args[1] 11108 if v_1.Op != OpConst32 { 11109 break 11110 } 11111 d := v_1.AuxInt 11112 if !(0 <= c && c <= d) { 11113 break 11114 } 11115 v.reset(OpConstBool) 11116 v.AuxInt = 1 11117 return true 11118 } 11119 // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) 11120 // cond: 0 <= c && c <= d 11121 // result: (ConstBool [1]) 11122 for { 11123 _ = v.Args[1] 11124 v_0 := v.Args[0] 11125 if v_0.Op != OpAnd64 { 11126 break 11127 } 11128 _ = v_0.Args[1] 11129 v_0_0 := v_0.Args[0] 11130 if v_0_0.Op != OpConst64 { 11131 break 11132 } 11133 c := v_0_0.AuxInt 11134 v_1 := v.Args[1] 11135 if v_1.Op != OpConst64 { 11136 break 11137 } 11138 d := v_1.AuxInt 11139 if !(0 <= c && c <= d) { 11140 break 11141 } 11142 v.reset(OpConstBool) 11143 v.AuxInt = 1 11144 return true 11145 } 11146 // match: (IsSliceInBounds (And64 _ (Const64 [c])) (Const64 [d])) 11147 // cond: 0 <= c && c <= d 11148 // result: (ConstBool [1]) 11149 for { 11150 _ = v.Args[1] 11151 v_0 := v.Args[0] 11152 if v_0.Op != OpAnd64 { 11153 break 11154 } 11155 _ = v_0.Args[1] 11156 v_0_1 := v_0.Args[1] 11157 if v_0_1.Op != OpConst64 { 11158 break 11159 } 11160 c := v_0_1.AuxInt 11161 v_1 := v.Args[1] 11162 if v_1.Op != OpConst64 { 11163 break 11164 } 11165 d := v_1.AuxInt 11166 if !(0 <= c && c <= d) { 11167 break 11168 } 11169 v.reset(OpConstBool) 11170 v.AuxInt = 1 11171 return true 11172 } 11173 // match: (IsSliceInBounds (Const32 [0]) _) 11174 // cond: 11175 // result: (ConstBool [1]) 11176 for { 11177 _ = v.Args[1] 11178 v_0 := v.Args[0] 11179 if v_0.Op != OpConst32 { 11180 break 11181 } 11182 if v_0.AuxInt != 0 { 11183 break 11184 } 11185 v.reset(OpConstBool) 11186 v.AuxInt = 1 11187 return true 11188 } 11189 // match: (IsSliceInBounds (Const64 [0]) _) 11190 // cond: 11191 // result: (ConstBool [1]) 11192 for { 11193 _ = v.Args[1] 11194 v_0 := v.Args[0] 11195 if v_0.Op != OpConst64 { 11196 break 11197 } 11198 if v_0.AuxInt != 0 { 11199 break 11200 } 11201 v.reset(OpConstBool) 11202 v.AuxInt = 1 11203 return true 11204 } 11205 // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) 11206 // cond: 11207 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11208 for { 11209 _ = v.Args[1] 11210 v_0 := v.Args[0] 11211 if v_0.Op != OpConst32 { 11212 break 11213 } 11214 c := v_0.AuxInt 11215 v_1 := v.Args[1] 11216 if v_1.Op != OpConst32 { 11217 break 11218 } 11219 d := v_1.AuxInt 11220 v.reset(OpConstBool) 11221 v.AuxInt = b2i(0 <= c && c <= d) 11222 return true 11223 } 11224 // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) 11225 // cond: 11226 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11227 for { 11228 _ = v.Args[1] 11229 v_0 := v.Args[0] 11230 if v_0.Op != OpConst64 { 11231 break 11232 } 11233 c := v_0.AuxInt 11234 v_1 := v.Args[1] 11235 if v_1.Op != OpConst64 { 11236 break 11237 } 11238 d := v_1.AuxInt 11239 v.reset(OpConstBool) 11240 v.AuxInt = b2i(0 <= c && c <= d) 11241 return true 11242 } 11243 // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) 11244 // cond: 11245 // result: (ConstBool [1]) 11246 for { 11247 _ = v.Args[1] 11248 v_0 := v.Args[0] 11249 if v_0.Op != OpSliceLen { 11250 break 11251 } 11252 x := v_0.Args[0] 11253 v_1 := v.Args[1] 11254 if v_1.Op != OpSliceCap { 11255 break 11256 } 11257 if x != v_1.Args[0] { 11258 break 11259 } 11260 v.reset(OpConstBool) 11261 v.AuxInt = 1 11262 return true 11263 } 11264 return false 11265 } 11266 func rewriteValuegeneric_OpLeq16_0(v *Value) bool { 11267 // match: (Leq16 (Const16 [c]) (Const16 [d])) 11268 // cond: 11269 // result: (ConstBool [b2i(c <= d)]) 11270 for { 11271 _ = v.Args[1] 11272 v_0 := v.Args[0] 11273 if v_0.Op != OpConst16 { 11274 break 11275 } 11276 c := v_0.AuxInt 11277 v_1 := v.Args[1] 11278 if v_1.Op != OpConst16 { 11279 break 11280 } 11281 d := v_1.AuxInt 11282 v.reset(OpConstBool) 11283 v.AuxInt = b2i(c <= d) 11284 return true 11285 } 11286 return false 11287 } 11288 func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { 11289 // match: (Leq16U (Const16 [c]) (Const16 [d])) 11290 // cond: 11291 // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) 11292 for { 11293 _ = v.Args[1] 11294 v_0 := v.Args[0] 11295 if v_0.Op != OpConst16 { 11296 break 11297 } 11298 c := v_0.AuxInt 11299 v_1 := v.Args[1] 11300 if v_1.Op != OpConst16 { 11301 break 11302 } 11303 d := v_1.AuxInt 11304 v.reset(OpConstBool) 11305 v.AuxInt = b2i(uint16(c) <= uint16(d)) 11306 return true 11307 } 11308 return false 11309 } 11310 func rewriteValuegeneric_OpLeq32_0(v *Value) bool { 11311 // match: (Leq32 (Const32 [c]) (Const32 [d])) 11312 // cond: 11313 // result: (ConstBool [b2i(c <= d)]) 11314 for { 11315 _ = v.Args[1] 11316 v_0 := v.Args[0] 11317 if v_0.Op != OpConst32 { 11318 break 11319 } 11320 c := v_0.AuxInt 11321 v_1 := v.Args[1] 11322 if v_1.Op != OpConst32 { 11323 break 11324 } 11325 d := v_1.AuxInt 11326 v.reset(OpConstBool) 11327 v.AuxInt = b2i(c <= d) 11328 return true 11329 } 11330 return false 11331 } 11332 func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { 11333 // match: (Leq32U (Const32 [c]) (Const32 [d])) 11334 // cond: 11335 // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) 11336 for { 11337 _ = v.Args[1] 11338 v_0 := v.Args[0] 11339 if v_0.Op != OpConst32 { 11340 break 11341 } 11342 c := v_0.AuxInt 11343 v_1 := v.Args[1] 11344 if v_1.Op != OpConst32 { 11345 break 11346 } 11347 d := v_1.AuxInt 11348 v.reset(OpConstBool) 11349 v.AuxInt = b2i(uint32(c) <= uint32(d)) 11350 return true 11351 } 11352 return false 11353 } 11354 func rewriteValuegeneric_OpLeq64_0(v *Value) bool { 11355 // match: (Leq64 (Const64 [c]) (Const64 [d])) 11356 // cond: 11357 // result: (ConstBool [b2i(c <= d)]) 11358 for { 11359 _ = v.Args[1] 11360 v_0 := v.Args[0] 11361 if v_0.Op != OpConst64 { 11362 break 11363 } 11364 c := v_0.AuxInt 11365 v_1 := v.Args[1] 11366 if v_1.Op != OpConst64 { 11367 break 11368 } 11369 d := v_1.AuxInt 11370 v.reset(OpConstBool) 11371 v.AuxInt = b2i(c <= d) 11372 return true 11373 } 11374 return false 11375 } 11376 func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { 11377 // match: (Leq64U (Const64 [c]) (Const64 [d])) 11378 // cond: 11379 // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) 11380 for { 11381 _ = v.Args[1] 11382 v_0 := v.Args[0] 11383 if v_0.Op != OpConst64 { 11384 break 11385 } 11386 c := v_0.AuxInt 11387 v_1 := v.Args[1] 11388 if v_1.Op != OpConst64 { 11389 break 11390 } 11391 d := v_1.AuxInt 11392 v.reset(OpConstBool) 11393 v.AuxInt = b2i(uint64(c) <= uint64(d)) 11394 return true 11395 } 11396 return false 11397 } 11398 func rewriteValuegeneric_OpLeq8_0(v *Value) bool { 11399 // match: (Leq8 (Const8 [c]) (Const8 [d])) 11400 // cond: 11401 // result: (ConstBool [b2i(c <= d)]) 11402 for { 11403 _ = v.Args[1] 11404 v_0 := v.Args[0] 11405 if v_0.Op != OpConst8 { 11406 break 11407 } 11408 c := v_0.AuxInt 11409 v_1 := v.Args[1] 11410 if v_1.Op != OpConst8 { 11411 break 11412 } 11413 d := v_1.AuxInt 11414 v.reset(OpConstBool) 11415 v.AuxInt = b2i(c <= d) 11416 return true 11417 } 11418 return false 11419 } 11420 func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { 11421 // match: (Leq8U (Const8 [c]) (Const8 [d])) 11422 // cond: 11423 // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) 11424 for { 11425 _ = v.Args[1] 11426 v_0 := v.Args[0] 11427 if v_0.Op != OpConst8 { 11428 break 11429 } 11430 c := v_0.AuxInt 11431 v_1 := v.Args[1] 11432 if v_1.Op != OpConst8 { 11433 break 11434 } 11435 d := v_1.AuxInt 11436 v.reset(OpConstBool) 11437 v.AuxInt = b2i(uint8(c) <= uint8(d)) 11438 return true 11439 } 11440 return false 11441 } 11442 func rewriteValuegeneric_OpLess16_0(v *Value) bool { 11443 // match: (Less16 (Const16 [c]) (Const16 [d])) 11444 // cond: 11445 // result: (ConstBool [b2i(c < d)]) 11446 for { 11447 _ = v.Args[1] 11448 v_0 := v.Args[0] 11449 if v_0.Op != OpConst16 { 11450 break 11451 } 11452 c := v_0.AuxInt 11453 v_1 := v.Args[1] 11454 if v_1.Op != OpConst16 { 11455 break 11456 } 11457 d := v_1.AuxInt 11458 v.reset(OpConstBool) 11459 v.AuxInt = b2i(c < d) 11460 return true 11461 } 11462 return false 11463 } 11464 func rewriteValuegeneric_OpLess16U_0(v *Value) bool { 11465 // match: (Less16U (Const16 [c]) (Const16 [d])) 11466 // cond: 11467 // result: (ConstBool [b2i(uint16(c) < uint16(d))]) 11468 for { 11469 _ = v.Args[1] 11470 v_0 := v.Args[0] 11471 if v_0.Op != OpConst16 { 11472 break 11473 } 11474 c := v_0.AuxInt 11475 v_1 := v.Args[1] 11476 if v_1.Op != OpConst16 { 11477 break 11478 } 11479 d := v_1.AuxInt 11480 v.reset(OpConstBool) 11481 v.AuxInt = b2i(uint16(c) < uint16(d)) 11482 return true 11483 } 11484 return false 11485 } 11486 func rewriteValuegeneric_OpLess32_0(v *Value) bool { 11487 // match: (Less32 (Const32 [c]) (Const32 [d])) 11488 // cond: 11489 // result: (ConstBool [b2i(c < d)]) 11490 for { 11491 _ = v.Args[1] 11492 v_0 := v.Args[0] 11493 if v_0.Op != OpConst32 { 11494 break 11495 } 11496 c := v_0.AuxInt 11497 v_1 := v.Args[1] 11498 if v_1.Op != OpConst32 { 11499 break 11500 } 11501 d := v_1.AuxInt 11502 v.reset(OpConstBool) 11503 v.AuxInt = b2i(c < d) 11504 return true 11505 } 11506 return false 11507 } 11508 func rewriteValuegeneric_OpLess32U_0(v *Value) bool { 11509 // match: (Less32U (Const32 [c]) (Const32 [d])) 11510 // cond: 11511 // result: (ConstBool [b2i(uint32(c) < uint32(d))]) 11512 for { 11513 _ = v.Args[1] 11514 v_0 := v.Args[0] 11515 if v_0.Op != OpConst32 { 11516 break 11517 } 11518 c := v_0.AuxInt 11519 v_1 := v.Args[1] 11520 if v_1.Op != OpConst32 { 11521 break 11522 } 11523 d := v_1.AuxInt 11524 v.reset(OpConstBool) 11525 v.AuxInt = b2i(uint32(c) < uint32(d)) 11526 return true 11527 } 11528 return false 11529 } 11530 func rewriteValuegeneric_OpLess64_0(v *Value) bool { 11531 // match: (Less64 (Const64 [c]) (Const64 [d])) 11532 // cond: 11533 // result: (ConstBool [b2i(c < d)]) 11534 for { 11535 _ = v.Args[1] 11536 v_0 := v.Args[0] 11537 if v_0.Op != OpConst64 { 11538 break 11539 } 11540 c := v_0.AuxInt 11541 v_1 := v.Args[1] 11542 if v_1.Op != OpConst64 { 11543 break 11544 } 11545 d := v_1.AuxInt 11546 v.reset(OpConstBool) 11547 v.AuxInt = b2i(c < d) 11548 return true 11549 } 11550 return false 11551 } 11552 func rewriteValuegeneric_OpLess64U_0(v *Value) bool { 11553 // match: (Less64U (Const64 [c]) (Const64 [d])) 11554 // cond: 11555 // result: (ConstBool [b2i(uint64(c) < uint64(d))]) 11556 for { 11557 _ = v.Args[1] 11558 v_0 := v.Args[0] 11559 if v_0.Op != OpConst64 { 11560 break 11561 } 11562 c := v_0.AuxInt 11563 v_1 := v.Args[1] 11564 if v_1.Op != OpConst64 { 11565 break 11566 } 11567 d := v_1.AuxInt 11568 v.reset(OpConstBool) 11569 v.AuxInt = b2i(uint64(c) < uint64(d)) 11570 return true 11571 } 11572 return false 11573 } 11574 func rewriteValuegeneric_OpLess8_0(v *Value) bool { 11575 // match: (Less8 (Const8 [c]) (Const8 [d])) 11576 // cond: 11577 // result: (ConstBool [b2i(c < d)]) 11578 for { 11579 _ = v.Args[1] 11580 v_0 := v.Args[0] 11581 if v_0.Op != OpConst8 { 11582 break 11583 } 11584 c := v_0.AuxInt 11585 v_1 := v.Args[1] 11586 if v_1.Op != OpConst8 { 11587 break 11588 } 11589 d := v_1.AuxInt 11590 v.reset(OpConstBool) 11591 v.AuxInt = b2i(c < d) 11592 return true 11593 } 11594 return false 11595 } 11596 func rewriteValuegeneric_OpLess8U_0(v *Value) bool { 11597 // match: (Less8U (Const8 [c]) (Const8 [d])) 11598 // cond: 11599 // result: (ConstBool [b2i(uint8(c) < uint8(d))]) 11600 for { 11601 _ = v.Args[1] 11602 v_0 := v.Args[0] 11603 if v_0.Op != OpConst8 { 11604 break 11605 } 11606 c := v_0.AuxInt 11607 v_1 := v.Args[1] 11608 if v_1.Op != OpConst8 { 11609 break 11610 } 11611 d := v_1.AuxInt 11612 v.reset(OpConstBool) 11613 v.AuxInt = b2i(uint8(c) < uint8(d)) 11614 return true 11615 } 11616 return false 11617 } 11618 func rewriteValuegeneric_OpLoad_0(v *Value) bool { 11619 b := v.Block 11620 _ = b 11621 fe := b.Func.fe 11622 _ = fe 11623 // match: (Load <t1> p1 (Store {t2} p2 x _)) 11624 // cond: isSamePtr(p1,p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size() 11625 // result: x 11626 for { 11627 t1 := v.Type 11628 _ = v.Args[1] 11629 p1 := v.Args[0] 11630 v_1 := v.Args[1] 11631 if v_1.Op != OpStore { 11632 break 11633 } 11634 t2 := v_1.Aux 11635 _ = v_1.Args[2] 11636 p2 := v_1.Args[0] 11637 x := v_1.Args[1] 11638 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size()) { 11639 break 11640 } 11641 v.reset(OpCopy) 11642 v.Type = x.Type 11643 v.AddArg(x) 11644 return true 11645 } 11646 // match: (Load <t> _ _) 11647 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 11648 // result: (StructMake0) 11649 for { 11650 t := v.Type 11651 _ = v.Args[1] 11652 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 11653 break 11654 } 11655 v.reset(OpStructMake0) 11656 return true 11657 } 11658 // match: (Load <t> ptr mem) 11659 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 11660 // result: (StructMake1 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem)) 11661 for { 11662 t := v.Type 11663 _ = v.Args[1] 11664 ptr := v.Args[0] 11665 mem := v.Args[1] 11666 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 11667 break 11668 } 11669 v.reset(OpStructMake1) 11670 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 11671 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 11672 v1.AuxInt = 0 11673 v1.AddArg(ptr) 11674 v0.AddArg(v1) 11675 v0.AddArg(mem) 11676 v.AddArg(v0) 11677 return true 11678 } 11679 // match: (Load <t> ptr mem) 11680 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 11681 // 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)) 11682 for { 11683 t := v.Type 11684 _ = v.Args[1] 11685 ptr := v.Args[0] 11686 mem := v.Args[1] 11687 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 11688 break 11689 } 11690 v.reset(OpStructMake2) 11691 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 11692 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 11693 v1.AuxInt = 0 11694 v1.AddArg(ptr) 11695 v0.AddArg(v1) 11696 v0.AddArg(mem) 11697 v.AddArg(v0) 11698 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 11699 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 11700 v3.AuxInt = t.FieldOff(1) 11701 v3.AddArg(ptr) 11702 v2.AddArg(v3) 11703 v2.AddArg(mem) 11704 v.AddArg(v2) 11705 return true 11706 } 11707 // match: (Load <t> ptr mem) 11708 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 11709 // 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)) 11710 for { 11711 t := v.Type 11712 _ = v.Args[1] 11713 ptr := v.Args[0] 11714 mem := v.Args[1] 11715 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 11716 break 11717 } 11718 v.reset(OpStructMake3) 11719 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 11720 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 11721 v1.AuxInt = 0 11722 v1.AddArg(ptr) 11723 v0.AddArg(v1) 11724 v0.AddArg(mem) 11725 v.AddArg(v0) 11726 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 11727 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 11728 v3.AuxInt = t.FieldOff(1) 11729 v3.AddArg(ptr) 11730 v2.AddArg(v3) 11731 v2.AddArg(mem) 11732 v.AddArg(v2) 11733 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 11734 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 11735 v5.AuxInt = t.FieldOff(2) 11736 v5.AddArg(ptr) 11737 v4.AddArg(v5) 11738 v4.AddArg(mem) 11739 v.AddArg(v4) 11740 return true 11741 } 11742 // match: (Load <t> ptr mem) 11743 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 11744 // 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)) 11745 for { 11746 t := v.Type 11747 _ = v.Args[1] 11748 ptr := v.Args[0] 11749 mem := v.Args[1] 11750 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 11751 break 11752 } 11753 v.reset(OpStructMake4) 11754 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 11755 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 11756 v1.AuxInt = 0 11757 v1.AddArg(ptr) 11758 v0.AddArg(v1) 11759 v0.AddArg(mem) 11760 v.AddArg(v0) 11761 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 11762 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 11763 v3.AuxInt = t.FieldOff(1) 11764 v3.AddArg(ptr) 11765 v2.AddArg(v3) 11766 v2.AddArg(mem) 11767 v.AddArg(v2) 11768 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 11769 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 11770 v5.AuxInt = t.FieldOff(2) 11771 v5.AddArg(ptr) 11772 v4.AddArg(v5) 11773 v4.AddArg(mem) 11774 v.AddArg(v4) 11775 v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) 11776 v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 11777 v7.AuxInt = t.FieldOff(3) 11778 v7.AddArg(ptr) 11779 v6.AddArg(v7) 11780 v6.AddArg(mem) 11781 v.AddArg(v6) 11782 return true 11783 } 11784 // match: (Load <t> _ _) 11785 // cond: t.IsArray() && t.NumElem() == 0 11786 // result: (ArrayMake0) 11787 for { 11788 t := v.Type 11789 _ = v.Args[1] 11790 if !(t.IsArray() && t.NumElem() == 0) { 11791 break 11792 } 11793 v.reset(OpArrayMake0) 11794 return true 11795 } 11796 // match: (Load <t> ptr mem) 11797 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 11798 // result: (ArrayMake1 (Load <t.ElemType()> ptr mem)) 11799 for { 11800 t := v.Type 11801 _ = v.Args[1] 11802 ptr := v.Args[0] 11803 mem := v.Args[1] 11804 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 11805 break 11806 } 11807 v.reset(OpArrayMake1) 11808 v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType()) 11809 v0.AddArg(ptr) 11810 v0.AddArg(mem) 11811 v.AddArg(v0) 11812 return true 11813 } 11814 return false 11815 } 11816 func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { 11817 b := v.Block 11818 _ = b 11819 // match: (Lsh16x16 <t> x (Const16 [c])) 11820 // cond: 11821 // result: (Lsh16x64 x (Const64 <t> [int64(uint16(c))])) 11822 for { 11823 t := v.Type 11824 _ = v.Args[1] 11825 x := v.Args[0] 11826 v_1 := v.Args[1] 11827 if v_1.Op != OpConst16 { 11828 break 11829 } 11830 c := v_1.AuxInt 11831 v.reset(OpLsh16x64) 11832 v.AddArg(x) 11833 v0 := b.NewValue0(v.Pos, OpConst64, t) 11834 v0.AuxInt = int64(uint16(c)) 11835 v.AddArg(v0) 11836 return true 11837 } 11838 // match: (Lsh16x16 (Const16 [0]) _) 11839 // cond: 11840 // result: (Const16 [0]) 11841 for { 11842 _ = v.Args[1] 11843 v_0 := v.Args[0] 11844 if v_0.Op != OpConst16 { 11845 break 11846 } 11847 if v_0.AuxInt != 0 { 11848 break 11849 } 11850 v.reset(OpConst16) 11851 v.AuxInt = 0 11852 return true 11853 } 11854 return false 11855 } 11856 func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { 11857 b := v.Block 11858 _ = b 11859 // match: (Lsh16x32 <t> x (Const32 [c])) 11860 // cond: 11861 // result: (Lsh16x64 x (Const64 <t> [int64(uint32(c))])) 11862 for { 11863 t := v.Type 11864 _ = v.Args[1] 11865 x := v.Args[0] 11866 v_1 := v.Args[1] 11867 if v_1.Op != OpConst32 { 11868 break 11869 } 11870 c := v_1.AuxInt 11871 v.reset(OpLsh16x64) 11872 v.AddArg(x) 11873 v0 := b.NewValue0(v.Pos, OpConst64, t) 11874 v0.AuxInt = int64(uint32(c)) 11875 v.AddArg(v0) 11876 return true 11877 } 11878 // match: (Lsh16x32 (Const16 [0]) _) 11879 // cond: 11880 // result: (Const16 [0]) 11881 for { 11882 _ = v.Args[1] 11883 v_0 := v.Args[0] 11884 if v_0.Op != OpConst16 { 11885 break 11886 } 11887 if v_0.AuxInt != 0 { 11888 break 11889 } 11890 v.reset(OpConst16) 11891 v.AuxInt = 0 11892 return true 11893 } 11894 return false 11895 } 11896 func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { 11897 b := v.Block 11898 _ = b 11899 typ := &b.Func.Config.Types 11900 _ = typ 11901 // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) 11902 // cond: 11903 // result: (Const16 [int64(int16(c) << uint64(d))]) 11904 for { 11905 _ = v.Args[1] 11906 v_0 := v.Args[0] 11907 if v_0.Op != OpConst16 { 11908 break 11909 } 11910 c := v_0.AuxInt 11911 v_1 := v.Args[1] 11912 if v_1.Op != OpConst64 { 11913 break 11914 } 11915 d := v_1.AuxInt 11916 v.reset(OpConst16) 11917 v.AuxInt = int64(int16(c) << uint64(d)) 11918 return true 11919 } 11920 // match: (Lsh16x64 x (Const64 [0])) 11921 // cond: 11922 // result: x 11923 for { 11924 _ = v.Args[1] 11925 x := v.Args[0] 11926 v_1 := v.Args[1] 11927 if v_1.Op != OpConst64 { 11928 break 11929 } 11930 if v_1.AuxInt != 0 { 11931 break 11932 } 11933 v.reset(OpCopy) 11934 v.Type = x.Type 11935 v.AddArg(x) 11936 return true 11937 } 11938 // match: (Lsh16x64 (Const16 [0]) _) 11939 // cond: 11940 // result: (Const16 [0]) 11941 for { 11942 _ = v.Args[1] 11943 v_0 := v.Args[0] 11944 if v_0.Op != OpConst16 { 11945 break 11946 } 11947 if v_0.AuxInt != 0 { 11948 break 11949 } 11950 v.reset(OpConst16) 11951 v.AuxInt = 0 11952 return true 11953 } 11954 // match: (Lsh16x64 _ (Const64 [c])) 11955 // cond: uint64(c) >= 16 11956 // result: (Const16 [0]) 11957 for { 11958 _ = v.Args[1] 11959 v_1 := v.Args[1] 11960 if v_1.Op != OpConst64 { 11961 break 11962 } 11963 c := v_1.AuxInt 11964 if !(uint64(c) >= 16) { 11965 break 11966 } 11967 v.reset(OpConst16) 11968 v.AuxInt = 0 11969 return true 11970 } 11971 // match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d])) 11972 // cond: !uaddOvf(c,d) 11973 // result: (Lsh16x64 x (Const64 <t> [c+d])) 11974 for { 11975 t := v.Type 11976 _ = v.Args[1] 11977 v_0 := v.Args[0] 11978 if v_0.Op != OpLsh16x64 { 11979 break 11980 } 11981 _ = v_0.Args[1] 11982 x := v_0.Args[0] 11983 v_0_1 := v_0.Args[1] 11984 if v_0_1.Op != OpConst64 { 11985 break 11986 } 11987 c := v_0_1.AuxInt 11988 v_1 := v.Args[1] 11989 if v_1.Op != OpConst64 { 11990 break 11991 } 11992 d := v_1.AuxInt 11993 if !(!uaddOvf(c, d)) { 11994 break 11995 } 11996 v.reset(OpLsh16x64) 11997 v.AddArg(x) 11998 v0 := b.NewValue0(v.Pos, OpConst64, t) 11999 v0.AuxInt = c + d 12000 v.AddArg(v0) 12001 return true 12002 } 12003 // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12004 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12005 // result: (Lsh16x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12006 for { 12007 _ = v.Args[1] 12008 v_0 := v.Args[0] 12009 if v_0.Op != OpRsh16Ux64 { 12010 break 12011 } 12012 _ = v_0.Args[1] 12013 v_0_0 := v_0.Args[0] 12014 if v_0_0.Op != OpLsh16x64 { 12015 break 12016 } 12017 _ = v_0_0.Args[1] 12018 x := v_0_0.Args[0] 12019 v_0_0_1 := v_0_0.Args[1] 12020 if v_0_0_1.Op != OpConst64 { 12021 break 12022 } 12023 c1 := v_0_0_1.AuxInt 12024 v_0_1 := v_0.Args[1] 12025 if v_0_1.Op != OpConst64 { 12026 break 12027 } 12028 c2 := v_0_1.AuxInt 12029 v_1 := v.Args[1] 12030 if v_1.Op != OpConst64 { 12031 break 12032 } 12033 c3 := v_1.AuxInt 12034 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12035 break 12036 } 12037 v.reset(OpLsh16x64) 12038 v.AddArg(x) 12039 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12040 v0.AuxInt = c1 - c2 + c3 12041 v.AddArg(v0) 12042 return true 12043 } 12044 return false 12045 } 12046 func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { 12047 b := v.Block 12048 _ = b 12049 // match: (Lsh16x8 <t> x (Const8 [c])) 12050 // cond: 12051 // result: (Lsh16x64 x (Const64 <t> [int64(uint8(c))])) 12052 for { 12053 t := v.Type 12054 _ = v.Args[1] 12055 x := v.Args[0] 12056 v_1 := v.Args[1] 12057 if v_1.Op != OpConst8 { 12058 break 12059 } 12060 c := v_1.AuxInt 12061 v.reset(OpLsh16x64) 12062 v.AddArg(x) 12063 v0 := b.NewValue0(v.Pos, OpConst64, t) 12064 v0.AuxInt = int64(uint8(c)) 12065 v.AddArg(v0) 12066 return true 12067 } 12068 // match: (Lsh16x8 (Const16 [0]) _) 12069 // cond: 12070 // result: (Const16 [0]) 12071 for { 12072 _ = v.Args[1] 12073 v_0 := v.Args[0] 12074 if v_0.Op != OpConst16 { 12075 break 12076 } 12077 if v_0.AuxInt != 0 { 12078 break 12079 } 12080 v.reset(OpConst16) 12081 v.AuxInt = 0 12082 return true 12083 } 12084 return false 12085 } 12086 func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { 12087 b := v.Block 12088 _ = b 12089 // match: (Lsh32x16 <t> x (Const16 [c])) 12090 // cond: 12091 // result: (Lsh32x64 x (Const64 <t> [int64(uint16(c))])) 12092 for { 12093 t := v.Type 12094 _ = v.Args[1] 12095 x := v.Args[0] 12096 v_1 := v.Args[1] 12097 if v_1.Op != OpConst16 { 12098 break 12099 } 12100 c := v_1.AuxInt 12101 v.reset(OpLsh32x64) 12102 v.AddArg(x) 12103 v0 := b.NewValue0(v.Pos, OpConst64, t) 12104 v0.AuxInt = int64(uint16(c)) 12105 v.AddArg(v0) 12106 return true 12107 } 12108 // match: (Lsh32x16 (Const32 [0]) _) 12109 // cond: 12110 // result: (Const32 [0]) 12111 for { 12112 _ = v.Args[1] 12113 v_0 := v.Args[0] 12114 if v_0.Op != OpConst32 { 12115 break 12116 } 12117 if v_0.AuxInt != 0 { 12118 break 12119 } 12120 v.reset(OpConst32) 12121 v.AuxInt = 0 12122 return true 12123 } 12124 return false 12125 } 12126 func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { 12127 b := v.Block 12128 _ = b 12129 // match: (Lsh32x32 <t> x (Const32 [c])) 12130 // cond: 12131 // result: (Lsh32x64 x (Const64 <t> [int64(uint32(c))])) 12132 for { 12133 t := v.Type 12134 _ = v.Args[1] 12135 x := v.Args[0] 12136 v_1 := v.Args[1] 12137 if v_1.Op != OpConst32 { 12138 break 12139 } 12140 c := v_1.AuxInt 12141 v.reset(OpLsh32x64) 12142 v.AddArg(x) 12143 v0 := b.NewValue0(v.Pos, OpConst64, t) 12144 v0.AuxInt = int64(uint32(c)) 12145 v.AddArg(v0) 12146 return true 12147 } 12148 // match: (Lsh32x32 (Const32 [0]) _) 12149 // cond: 12150 // result: (Const32 [0]) 12151 for { 12152 _ = v.Args[1] 12153 v_0 := v.Args[0] 12154 if v_0.Op != OpConst32 { 12155 break 12156 } 12157 if v_0.AuxInt != 0 { 12158 break 12159 } 12160 v.reset(OpConst32) 12161 v.AuxInt = 0 12162 return true 12163 } 12164 return false 12165 } 12166 func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { 12167 b := v.Block 12168 _ = b 12169 typ := &b.Func.Config.Types 12170 _ = typ 12171 // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) 12172 // cond: 12173 // result: (Const32 [int64(int32(c) << uint64(d))]) 12174 for { 12175 _ = v.Args[1] 12176 v_0 := v.Args[0] 12177 if v_0.Op != OpConst32 { 12178 break 12179 } 12180 c := v_0.AuxInt 12181 v_1 := v.Args[1] 12182 if v_1.Op != OpConst64 { 12183 break 12184 } 12185 d := v_1.AuxInt 12186 v.reset(OpConst32) 12187 v.AuxInt = int64(int32(c) << uint64(d)) 12188 return true 12189 } 12190 // match: (Lsh32x64 x (Const64 [0])) 12191 // cond: 12192 // result: x 12193 for { 12194 _ = v.Args[1] 12195 x := v.Args[0] 12196 v_1 := v.Args[1] 12197 if v_1.Op != OpConst64 { 12198 break 12199 } 12200 if v_1.AuxInt != 0 { 12201 break 12202 } 12203 v.reset(OpCopy) 12204 v.Type = x.Type 12205 v.AddArg(x) 12206 return true 12207 } 12208 // match: (Lsh32x64 (Const32 [0]) _) 12209 // cond: 12210 // result: (Const32 [0]) 12211 for { 12212 _ = v.Args[1] 12213 v_0 := v.Args[0] 12214 if v_0.Op != OpConst32 { 12215 break 12216 } 12217 if v_0.AuxInt != 0 { 12218 break 12219 } 12220 v.reset(OpConst32) 12221 v.AuxInt = 0 12222 return true 12223 } 12224 // match: (Lsh32x64 _ (Const64 [c])) 12225 // cond: uint64(c) >= 32 12226 // result: (Const32 [0]) 12227 for { 12228 _ = v.Args[1] 12229 v_1 := v.Args[1] 12230 if v_1.Op != OpConst64 { 12231 break 12232 } 12233 c := v_1.AuxInt 12234 if !(uint64(c) >= 32) { 12235 break 12236 } 12237 v.reset(OpConst32) 12238 v.AuxInt = 0 12239 return true 12240 } 12241 // match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d])) 12242 // cond: !uaddOvf(c,d) 12243 // result: (Lsh32x64 x (Const64 <t> [c+d])) 12244 for { 12245 t := v.Type 12246 _ = v.Args[1] 12247 v_0 := v.Args[0] 12248 if v_0.Op != OpLsh32x64 { 12249 break 12250 } 12251 _ = v_0.Args[1] 12252 x := v_0.Args[0] 12253 v_0_1 := v_0.Args[1] 12254 if v_0_1.Op != OpConst64 { 12255 break 12256 } 12257 c := v_0_1.AuxInt 12258 v_1 := v.Args[1] 12259 if v_1.Op != OpConst64 { 12260 break 12261 } 12262 d := v_1.AuxInt 12263 if !(!uaddOvf(c, d)) { 12264 break 12265 } 12266 v.reset(OpLsh32x64) 12267 v.AddArg(x) 12268 v0 := b.NewValue0(v.Pos, OpConst64, t) 12269 v0.AuxInt = c + d 12270 v.AddArg(v0) 12271 return true 12272 } 12273 // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12274 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12275 // result: (Lsh32x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12276 for { 12277 _ = v.Args[1] 12278 v_0 := v.Args[0] 12279 if v_0.Op != OpRsh32Ux64 { 12280 break 12281 } 12282 _ = v_0.Args[1] 12283 v_0_0 := v_0.Args[0] 12284 if v_0_0.Op != OpLsh32x64 { 12285 break 12286 } 12287 _ = v_0_0.Args[1] 12288 x := v_0_0.Args[0] 12289 v_0_0_1 := v_0_0.Args[1] 12290 if v_0_0_1.Op != OpConst64 { 12291 break 12292 } 12293 c1 := v_0_0_1.AuxInt 12294 v_0_1 := v_0.Args[1] 12295 if v_0_1.Op != OpConst64 { 12296 break 12297 } 12298 c2 := v_0_1.AuxInt 12299 v_1 := v.Args[1] 12300 if v_1.Op != OpConst64 { 12301 break 12302 } 12303 c3 := v_1.AuxInt 12304 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12305 break 12306 } 12307 v.reset(OpLsh32x64) 12308 v.AddArg(x) 12309 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12310 v0.AuxInt = c1 - c2 + c3 12311 v.AddArg(v0) 12312 return true 12313 } 12314 return false 12315 } 12316 func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { 12317 b := v.Block 12318 _ = b 12319 // match: (Lsh32x8 <t> x (Const8 [c])) 12320 // cond: 12321 // result: (Lsh32x64 x (Const64 <t> [int64(uint8(c))])) 12322 for { 12323 t := v.Type 12324 _ = v.Args[1] 12325 x := v.Args[0] 12326 v_1 := v.Args[1] 12327 if v_1.Op != OpConst8 { 12328 break 12329 } 12330 c := v_1.AuxInt 12331 v.reset(OpLsh32x64) 12332 v.AddArg(x) 12333 v0 := b.NewValue0(v.Pos, OpConst64, t) 12334 v0.AuxInt = int64(uint8(c)) 12335 v.AddArg(v0) 12336 return true 12337 } 12338 // match: (Lsh32x8 (Const32 [0]) _) 12339 // cond: 12340 // result: (Const32 [0]) 12341 for { 12342 _ = v.Args[1] 12343 v_0 := v.Args[0] 12344 if v_0.Op != OpConst32 { 12345 break 12346 } 12347 if v_0.AuxInt != 0 { 12348 break 12349 } 12350 v.reset(OpConst32) 12351 v.AuxInt = 0 12352 return true 12353 } 12354 return false 12355 } 12356 func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { 12357 b := v.Block 12358 _ = b 12359 // match: (Lsh64x16 <t> x (Const16 [c])) 12360 // cond: 12361 // result: (Lsh64x64 x (Const64 <t> [int64(uint16(c))])) 12362 for { 12363 t := v.Type 12364 _ = v.Args[1] 12365 x := v.Args[0] 12366 v_1 := v.Args[1] 12367 if v_1.Op != OpConst16 { 12368 break 12369 } 12370 c := v_1.AuxInt 12371 v.reset(OpLsh64x64) 12372 v.AddArg(x) 12373 v0 := b.NewValue0(v.Pos, OpConst64, t) 12374 v0.AuxInt = int64(uint16(c)) 12375 v.AddArg(v0) 12376 return true 12377 } 12378 // match: (Lsh64x16 (Const64 [0]) _) 12379 // cond: 12380 // result: (Const64 [0]) 12381 for { 12382 _ = v.Args[1] 12383 v_0 := v.Args[0] 12384 if v_0.Op != OpConst64 { 12385 break 12386 } 12387 if v_0.AuxInt != 0 { 12388 break 12389 } 12390 v.reset(OpConst64) 12391 v.AuxInt = 0 12392 return true 12393 } 12394 return false 12395 } 12396 func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { 12397 b := v.Block 12398 _ = b 12399 // match: (Lsh64x32 <t> x (Const32 [c])) 12400 // cond: 12401 // result: (Lsh64x64 x (Const64 <t> [int64(uint32(c))])) 12402 for { 12403 t := v.Type 12404 _ = v.Args[1] 12405 x := v.Args[0] 12406 v_1 := v.Args[1] 12407 if v_1.Op != OpConst32 { 12408 break 12409 } 12410 c := v_1.AuxInt 12411 v.reset(OpLsh64x64) 12412 v.AddArg(x) 12413 v0 := b.NewValue0(v.Pos, OpConst64, t) 12414 v0.AuxInt = int64(uint32(c)) 12415 v.AddArg(v0) 12416 return true 12417 } 12418 // match: (Lsh64x32 (Const64 [0]) _) 12419 // cond: 12420 // result: (Const64 [0]) 12421 for { 12422 _ = v.Args[1] 12423 v_0 := v.Args[0] 12424 if v_0.Op != OpConst64 { 12425 break 12426 } 12427 if v_0.AuxInt != 0 { 12428 break 12429 } 12430 v.reset(OpConst64) 12431 v.AuxInt = 0 12432 return true 12433 } 12434 return false 12435 } 12436 func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { 12437 b := v.Block 12438 _ = b 12439 typ := &b.Func.Config.Types 12440 _ = typ 12441 // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) 12442 // cond: 12443 // result: (Const64 [c << uint64(d)]) 12444 for { 12445 _ = v.Args[1] 12446 v_0 := v.Args[0] 12447 if v_0.Op != OpConst64 { 12448 break 12449 } 12450 c := v_0.AuxInt 12451 v_1 := v.Args[1] 12452 if v_1.Op != OpConst64 { 12453 break 12454 } 12455 d := v_1.AuxInt 12456 v.reset(OpConst64) 12457 v.AuxInt = c << uint64(d) 12458 return true 12459 } 12460 // match: (Lsh64x64 x (Const64 [0])) 12461 // cond: 12462 // result: x 12463 for { 12464 _ = v.Args[1] 12465 x := v.Args[0] 12466 v_1 := v.Args[1] 12467 if v_1.Op != OpConst64 { 12468 break 12469 } 12470 if v_1.AuxInt != 0 { 12471 break 12472 } 12473 v.reset(OpCopy) 12474 v.Type = x.Type 12475 v.AddArg(x) 12476 return true 12477 } 12478 // match: (Lsh64x64 (Const64 [0]) _) 12479 // cond: 12480 // result: (Const64 [0]) 12481 for { 12482 _ = v.Args[1] 12483 v_0 := v.Args[0] 12484 if v_0.Op != OpConst64 { 12485 break 12486 } 12487 if v_0.AuxInt != 0 { 12488 break 12489 } 12490 v.reset(OpConst64) 12491 v.AuxInt = 0 12492 return true 12493 } 12494 // match: (Lsh64x64 _ (Const64 [c])) 12495 // cond: uint64(c) >= 64 12496 // result: (Const64 [0]) 12497 for { 12498 _ = v.Args[1] 12499 v_1 := v.Args[1] 12500 if v_1.Op != OpConst64 { 12501 break 12502 } 12503 c := v_1.AuxInt 12504 if !(uint64(c) >= 64) { 12505 break 12506 } 12507 v.reset(OpConst64) 12508 v.AuxInt = 0 12509 return true 12510 } 12511 // match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d])) 12512 // cond: !uaddOvf(c,d) 12513 // result: (Lsh64x64 x (Const64 <t> [c+d])) 12514 for { 12515 t := v.Type 12516 _ = v.Args[1] 12517 v_0 := v.Args[0] 12518 if v_0.Op != OpLsh64x64 { 12519 break 12520 } 12521 _ = v_0.Args[1] 12522 x := v_0.Args[0] 12523 v_0_1 := v_0.Args[1] 12524 if v_0_1.Op != OpConst64 { 12525 break 12526 } 12527 c := v_0_1.AuxInt 12528 v_1 := v.Args[1] 12529 if v_1.Op != OpConst64 { 12530 break 12531 } 12532 d := v_1.AuxInt 12533 if !(!uaddOvf(c, d)) { 12534 break 12535 } 12536 v.reset(OpLsh64x64) 12537 v.AddArg(x) 12538 v0 := b.NewValue0(v.Pos, OpConst64, t) 12539 v0.AuxInt = c + d 12540 v.AddArg(v0) 12541 return true 12542 } 12543 // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12544 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12545 // result: (Lsh64x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12546 for { 12547 _ = v.Args[1] 12548 v_0 := v.Args[0] 12549 if v_0.Op != OpRsh64Ux64 { 12550 break 12551 } 12552 _ = v_0.Args[1] 12553 v_0_0 := v_0.Args[0] 12554 if v_0_0.Op != OpLsh64x64 { 12555 break 12556 } 12557 _ = v_0_0.Args[1] 12558 x := v_0_0.Args[0] 12559 v_0_0_1 := v_0_0.Args[1] 12560 if v_0_0_1.Op != OpConst64 { 12561 break 12562 } 12563 c1 := v_0_0_1.AuxInt 12564 v_0_1 := v_0.Args[1] 12565 if v_0_1.Op != OpConst64 { 12566 break 12567 } 12568 c2 := v_0_1.AuxInt 12569 v_1 := v.Args[1] 12570 if v_1.Op != OpConst64 { 12571 break 12572 } 12573 c3 := v_1.AuxInt 12574 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12575 break 12576 } 12577 v.reset(OpLsh64x64) 12578 v.AddArg(x) 12579 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12580 v0.AuxInt = c1 - c2 + c3 12581 v.AddArg(v0) 12582 return true 12583 } 12584 return false 12585 } 12586 func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { 12587 b := v.Block 12588 _ = b 12589 // match: (Lsh64x8 <t> x (Const8 [c])) 12590 // cond: 12591 // result: (Lsh64x64 x (Const64 <t> [int64(uint8(c))])) 12592 for { 12593 t := v.Type 12594 _ = v.Args[1] 12595 x := v.Args[0] 12596 v_1 := v.Args[1] 12597 if v_1.Op != OpConst8 { 12598 break 12599 } 12600 c := v_1.AuxInt 12601 v.reset(OpLsh64x64) 12602 v.AddArg(x) 12603 v0 := b.NewValue0(v.Pos, OpConst64, t) 12604 v0.AuxInt = int64(uint8(c)) 12605 v.AddArg(v0) 12606 return true 12607 } 12608 // match: (Lsh64x8 (Const64 [0]) _) 12609 // cond: 12610 // result: (Const64 [0]) 12611 for { 12612 _ = v.Args[1] 12613 v_0 := v.Args[0] 12614 if v_0.Op != OpConst64 { 12615 break 12616 } 12617 if v_0.AuxInt != 0 { 12618 break 12619 } 12620 v.reset(OpConst64) 12621 v.AuxInt = 0 12622 return true 12623 } 12624 return false 12625 } 12626 func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { 12627 b := v.Block 12628 _ = b 12629 // match: (Lsh8x16 <t> x (Const16 [c])) 12630 // cond: 12631 // result: (Lsh8x64 x (Const64 <t> [int64(uint16(c))])) 12632 for { 12633 t := v.Type 12634 _ = v.Args[1] 12635 x := v.Args[0] 12636 v_1 := v.Args[1] 12637 if v_1.Op != OpConst16 { 12638 break 12639 } 12640 c := v_1.AuxInt 12641 v.reset(OpLsh8x64) 12642 v.AddArg(x) 12643 v0 := b.NewValue0(v.Pos, OpConst64, t) 12644 v0.AuxInt = int64(uint16(c)) 12645 v.AddArg(v0) 12646 return true 12647 } 12648 // match: (Lsh8x16 (Const8 [0]) _) 12649 // cond: 12650 // result: (Const8 [0]) 12651 for { 12652 _ = v.Args[1] 12653 v_0 := v.Args[0] 12654 if v_0.Op != OpConst8 { 12655 break 12656 } 12657 if v_0.AuxInt != 0 { 12658 break 12659 } 12660 v.reset(OpConst8) 12661 v.AuxInt = 0 12662 return true 12663 } 12664 return false 12665 } 12666 func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { 12667 b := v.Block 12668 _ = b 12669 // match: (Lsh8x32 <t> x (Const32 [c])) 12670 // cond: 12671 // result: (Lsh8x64 x (Const64 <t> [int64(uint32(c))])) 12672 for { 12673 t := v.Type 12674 _ = v.Args[1] 12675 x := v.Args[0] 12676 v_1 := v.Args[1] 12677 if v_1.Op != OpConst32 { 12678 break 12679 } 12680 c := v_1.AuxInt 12681 v.reset(OpLsh8x64) 12682 v.AddArg(x) 12683 v0 := b.NewValue0(v.Pos, OpConst64, t) 12684 v0.AuxInt = int64(uint32(c)) 12685 v.AddArg(v0) 12686 return true 12687 } 12688 // match: (Lsh8x32 (Const8 [0]) _) 12689 // cond: 12690 // result: (Const8 [0]) 12691 for { 12692 _ = v.Args[1] 12693 v_0 := v.Args[0] 12694 if v_0.Op != OpConst8 { 12695 break 12696 } 12697 if v_0.AuxInt != 0 { 12698 break 12699 } 12700 v.reset(OpConst8) 12701 v.AuxInt = 0 12702 return true 12703 } 12704 return false 12705 } 12706 func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { 12707 b := v.Block 12708 _ = b 12709 typ := &b.Func.Config.Types 12710 _ = typ 12711 // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) 12712 // cond: 12713 // result: (Const8 [int64(int8(c) << uint64(d))]) 12714 for { 12715 _ = v.Args[1] 12716 v_0 := v.Args[0] 12717 if v_0.Op != OpConst8 { 12718 break 12719 } 12720 c := v_0.AuxInt 12721 v_1 := v.Args[1] 12722 if v_1.Op != OpConst64 { 12723 break 12724 } 12725 d := v_1.AuxInt 12726 v.reset(OpConst8) 12727 v.AuxInt = int64(int8(c) << uint64(d)) 12728 return true 12729 } 12730 // match: (Lsh8x64 x (Const64 [0])) 12731 // cond: 12732 // result: x 12733 for { 12734 _ = v.Args[1] 12735 x := v.Args[0] 12736 v_1 := v.Args[1] 12737 if v_1.Op != OpConst64 { 12738 break 12739 } 12740 if v_1.AuxInt != 0 { 12741 break 12742 } 12743 v.reset(OpCopy) 12744 v.Type = x.Type 12745 v.AddArg(x) 12746 return true 12747 } 12748 // match: (Lsh8x64 (Const8 [0]) _) 12749 // cond: 12750 // result: (Const8 [0]) 12751 for { 12752 _ = v.Args[1] 12753 v_0 := v.Args[0] 12754 if v_0.Op != OpConst8 { 12755 break 12756 } 12757 if v_0.AuxInt != 0 { 12758 break 12759 } 12760 v.reset(OpConst8) 12761 v.AuxInt = 0 12762 return true 12763 } 12764 // match: (Lsh8x64 _ (Const64 [c])) 12765 // cond: uint64(c) >= 8 12766 // result: (Const8 [0]) 12767 for { 12768 _ = v.Args[1] 12769 v_1 := v.Args[1] 12770 if v_1.Op != OpConst64 { 12771 break 12772 } 12773 c := v_1.AuxInt 12774 if !(uint64(c) >= 8) { 12775 break 12776 } 12777 v.reset(OpConst8) 12778 v.AuxInt = 0 12779 return true 12780 } 12781 // match: (Lsh8x64 <t> (Lsh8x64 x (Const64 [c])) (Const64 [d])) 12782 // cond: !uaddOvf(c,d) 12783 // result: (Lsh8x64 x (Const64 <t> [c+d])) 12784 for { 12785 t := v.Type 12786 _ = v.Args[1] 12787 v_0 := v.Args[0] 12788 if v_0.Op != OpLsh8x64 { 12789 break 12790 } 12791 _ = v_0.Args[1] 12792 x := v_0.Args[0] 12793 v_0_1 := v_0.Args[1] 12794 if v_0_1.Op != OpConst64 { 12795 break 12796 } 12797 c := v_0_1.AuxInt 12798 v_1 := v.Args[1] 12799 if v_1.Op != OpConst64 { 12800 break 12801 } 12802 d := v_1.AuxInt 12803 if !(!uaddOvf(c, d)) { 12804 break 12805 } 12806 v.reset(OpLsh8x64) 12807 v.AddArg(x) 12808 v0 := b.NewValue0(v.Pos, OpConst64, t) 12809 v0.AuxInt = c + d 12810 v.AddArg(v0) 12811 return true 12812 } 12813 // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12814 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12815 // result: (Lsh8x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12816 for { 12817 _ = v.Args[1] 12818 v_0 := v.Args[0] 12819 if v_0.Op != OpRsh8Ux64 { 12820 break 12821 } 12822 _ = v_0.Args[1] 12823 v_0_0 := v_0.Args[0] 12824 if v_0_0.Op != OpLsh8x64 { 12825 break 12826 } 12827 _ = v_0_0.Args[1] 12828 x := v_0_0.Args[0] 12829 v_0_0_1 := v_0_0.Args[1] 12830 if v_0_0_1.Op != OpConst64 { 12831 break 12832 } 12833 c1 := v_0_0_1.AuxInt 12834 v_0_1 := v_0.Args[1] 12835 if v_0_1.Op != OpConst64 { 12836 break 12837 } 12838 c2 := v_0_1.AuxInt 12839 v_1 := v.Args[1] 12840 if v_1.Op != OpConst64 { 12841 break 12842 } 12843 c3 := v_1.AuxInt 12844 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12845 break 12846 } 12847 v.reset(OpLsh8x64) 12848 v.AddArg(x) 12849 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12850 v0.AuxInt = c1 - c2 + c3 12851 v.AddArg(v0) 12852 return true 12853 } 12854 return false 12855 } 12856 func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { 12857 b := v.Block 12858 _ = b 12859 // match: (Lsh8x8 <t> x (Const8 [c])) 12860 // cond: 12861 // result: (Lsh8x64 x (Const64 <t> [int64(uint8(c))])) 12862 for { 12863 t := v.Type 12864 _ = v.Args[1] 12865 x := v.Args[0] 12866 v_1 := v.Args[1] 12867 if v_1.Op != OpConst8 { 12868 break 12869 } 12870 c := v_1.AuxInt 12871 v.reset(OpLsh8x64) 12872 v.AddArg(x) 12873 v0 := b.NewValue0(v.Pos, OpConst64, t) 12874 v0.AuxInt = int64(uint8(c)) 12875 v.AddArg(v0) 12876 return true 12877 } 12878 // match: (Lsh8x8 (Const8 [0]) _) 12879 // cond: 12880 // result: (Const8 [0]) 12881 for { 12882 _ = v.Args[1] 12883 v_0 := v.Args[0] 12884 if v_0.Op != OpConst8 { 12885 break 12886 } 12887 if v_0.AuxInt != 0 { 12888 break 12889 } 12890 v.reset(OpConst8) 12891 v.AuxInt = 0 12892 return true 12893 } 12894 return false 12895 } 12896 func rewriteValuegeneric_OpMod16_0(v *Value) bool { 12897 b := v.Block 12898 _ = b 12899 // match: (Mod16 (Const16 [c]) (Const16 [d])) 12900 // cond: d != 0 12901 // result: (Const16 [int64(int16(c % d))]) 12902 for { 12903 _ = v.Args[1] 12904 v_0 := v.Args[0] 12905 if v_0.Op != OpConst16 { 12906 break 12907 } 12908 c := v_0.AuxInt 12909 v_1 := v.Args[1] 12910 if v_1.Op != OpConst16 { 12911 break 12912 } 12913 d := v_1.AuxInt 12914 if !(d != 0) { 12915 break 12916 } 12917 v.reset(OpConst16) 12918 v.AuxInt = int64(int16(c % d)) 12919 return true 12920 } 12921 // match: (Mod16 <t> n (Const16 [c])) 12922 // cond: c < 0 && c != -1<<15 12923 // result: (Mod16 <t> n (Const16 <t> [-c])) 12924 for { 12925 t := v.Type 12926 _ = v.Args[1] 12927 n := v.Args[0] 12928 v_1 := v.Args[1] 12929 if v_1.Op != OpConst16 { 12930 break 12931 } 12932 c := v_1.AuxInt 12933 if !(c < 0 && c != -1<<15) { 12934 break 12935 } 12936 v.reset(OpMod16) 12937 v.Type = t 12938 v.AddArg(n) 12939 v0 := b.NewValue0(v.Pos, OpConst16, t) 12940 v0.AuxInt = -c 12941 v.AddArg(v0) 12942 return true 12943 } 12944 // match: (Mod16 <t> x (Const16 [c])) 12945 // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) 12946 // result: (Sub16 x (Mul16 <t> (Div16 <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 12947 for { 12948 t := v.Type 12949 _ = v.Args[1] 12950 x := v.Args[0] 12951 v_1 := v.Args[1] 12952 if v_1.Op != OpConst16 { 12953 break 12954 } 12955 c := v_1.AuxInt 12956 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { 12957 break 12958 } 12959 v.reset(OpSub16) 12960 v.AddArg(x) 12961 v0 := b.NewValue0(v.Pos, OpMul16, t) 12962 v1 := b.NewValue0(v.Pos, OpDiv16, t) 12963 v1.AddArg(x) 12964 v2 := b.NewValue0(v.Pos, OpConst16, t) 12965 v2.AuxInt = c 12966 v1.AddArg(v2) 12967 v0.AddArg(v1) 12968 v3 := b.NewValue0(v.Pos, OpConst16, t) 12969 v3.AuxInt = c 12970 v0.AddArg(v3) 12971 v.AddArg(v0) 12972 return true 12973 } 12974 return false 12975 } 12976 func rewriteValuegeneric_OpMod16u_0(v *Value) bool { 12977 b := v.Block 12978 _ = b 12979 // match: (Mod16u (Const16 [c]) (Const16 [d])) 12980 // cond: d != 0 12981 // result: (Const16 [int64(uint16(c) % uint16(d))]) 12982 for { 12983 _ = v.Args[1] 12984 v_0 := v.Args[0] 12985 if v_0.Op != OpConst16 { 12986 break 12987 } 12988 c := v_0.AuxInt 12989 v_1 := v.Args[1] 12990 if v_1.Op != OpConst16 { 12991 break 12992 } 12993 d := v_1.AuxInt 12994 if !(d != 0) { 12995 break 12996 } 12997 v.reset(OpConst16) 12998 v.AuxInt = int64(uint16(c) % uint16(d)) 12999 return true 13000 } 13001 // match: (Mod16u <t> n (Const16 [c])) 13002 // cond: isPowerOfTwo(c&0xffff) 13003 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 13004 for { 13005 t := v.Type 13006 _ = v.Args[1] 13007 n := v.Args[0] 13008 v_1 := v.Args[1] 13009 if v_1.Op != OpConst16 { 13010 break 13011 } 13012 c := v_1.AuxInt 13013 if !(isPowerOfTwo(c & 0xffff)) { 13014 break 13015 } 13016 v.reset(OpAnd16) 13017 v.AddArg(n) 13018 v0 := b.NewValue0(v.Pos, OpConst16, t) 13019 v0.AuxInt = (c & 0xffff) - 1 13020 v.AddArg(v0) 13021 return true 13022 } 13023 // match: (Mod16u <t> x (Const16 [c])) 13024 // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) 13025 // result: (Sub16 x (Mul16 <t> (Div16u <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 13026 for { 13027 t := v.Type 13028 _ = v.Args[1] 13029 x := v.Args[0] 13030 v_1 := v.Args[1] 13031 if v_1.Op != OpConst16 { 13032 break 13033 } 13034 c := v_1.AuxInt 13035 if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { 13036 break 13037 } 13038 v.reset(OpSub16) 13039 v.AddArg(x) 13040 v0 := b.NewValue0(v.Pos, OpMul16, t) 13041 v1 := b.NewValue0(v.Pos, OpDiv16u, t) 13042 v1.AddArg(x) 13043 v2 := b.NewValue0(v.Pos, OpConst16, t) 13044 v2.AuxInt = c 13045 v1.AddArg(v2) 13046 v0.AddArg(v1) 13047 v3 := b.NewValue0(v.Pos, OpConst16, t) 13048 v3.AuxInt = c 13049 v0.AddArg(v3) 13050 v.AddArg(v0) 13051 return true 13052 } 13053 return false 13054 } 13055 func rewriteValuegeneric_OpMod32_0(v *Value) bool { 13056 b := v.Block 13057 _ = b 13058 // match: (Mod32 (Const32 [c]) (Const32 [d])) 13059 // cond: d != 0 13060 // result: (Const32 [int64(int32(c % d))]) 13061 for { 13062 _ = v.Args[1] 13063 v_0 := v.Args[0] 13064 if v_0.Op != OpConst32 { 13065 break 13066 } 13067 c := v_0.AuxInt 13068 v_1 := v.Args[1] 13069 if v_1.Op != OpConst32 { 13070 break 13071 } 13072 d := v_1.AuxInt 13073 if !(d != 0) { 13074 break 13075 } 13076 v.reset(OpConst32) 13077 v.AuxInt = int64(int32(c % d)) 13078 return true 13079 } 13080 // match: (Mod32 <t> n (Const32 [c])) 13081 // cond: c < 0 && c != -1<<31 13082 // result: (Mod32 <t> n (Const32 <t> [-c])) 13083 for { 13084 t := v.Type 13085 _ = v.Args[1] 13086 n := v.Args[0] 13087 v_1 := v.Args[1] 13088 if v_1.Op != OpConst32 { 13089 break 13090 } 13091 c := v_1.AuxInt 13092 if !(c < 0 && c != -1<<31) { 13093 break 13094 } 13095 v.reset(OpMod32) 13096 v.Type = t 13097 v.AddArg(n) 13098 v0 := b.NewValue0(v.Pos, OpConst32, t) 13099 v0.AuxInt = -c 13100 v.AddArg(v0) 13101 return true 13102 } 13103 // match: (Mod32 <t> x (Const32 [c])) 13104 // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) 13105 // result: (Sub32 x (Mul32 <t> (Div32 <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13106 for { 13107 t := v.Type 13108 _ = v.Args[1] 13109 x := v.Args[0] 13110 v_1 := v.Args[1] 13111 if v_1.Op != OpConst32 { 13112 break 13113 } 13114 c := v_1.AuxInt 13115 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { 13116 break 13117 } 13118 v.reset(OpSub32) 13119 v.AddArg(x) 13120 v0 := b.NewValue0(v.Pos, OpMul32, t) 13121 v1 := b.NewValue0(v.Pos, OpDiv32, t) 13122 v1.AddArg(x) 13123 v2 := b.NewValue0(v.Pos, OpConst32, t) 13124 v2.AuxInt = c 13125 v1.AddArg(v2) 13126 v0.AddArg(v1) 13127 v3 := b.NewValue0(v.Pos, OpConst32, t) 13128 v3.AuxInt = c 13129 v0.AddArg(v3) 13130 v.AddArg(v0) 13131 return true 13132 } 13133 return false 13134 } 13135 func rewriteValuegeneric_OpMod32u_0(v *Value) bool { 13136 b := v.Block 13137 _ = b 13138 // match: (Mod32u (Const32 [c]) (Const32 [d])) 13139 // cond: d != 0 13140 // result: (Const32 [int64(uint32(c) % uint32(d))]) 13141 for { 13142 _ = v.Args[1] 13143 v_0 := v.Args[0] 13144 if v_0.Op != OpConst32 { 13145 break 13146 } 13147 c := v_0.AuxInt 13148 v_1 := v.Args[1] 13149 if v_1.Op != OpConst32 { 13150 break 13151 } 13152 d := v_1.AuxInt 13153 if !(d != 0) { 13154 break 13155 } 13156 v.reset(OpConst32) 13157 v.AuxInt = int64(uint32(c) % uint32(d)) 13158 return true 13159 } 13160 // match: (Mod32u <t> n (Const32 [c])) 13161 // cond: isPowerOfTwo(c&0xffffffff) 13162 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 13163 for { 13164 t := v.Type 13165 _ = v.Args[1] 13166 n := v.Args[0] 13167 v_1 := v.Args[1] 13168 if v_1.Op != OpConst32 { 13169 break 13170 } 13171 c := v_1.AuxInt 13172 if !(isPowerOfTwo(c & 0xffffffff)) { 13173 break 13174 } 13175 v.reset(OpAnd32) 13176 v.AddArg(n) 13177 v0 := b.NewValue0(v.Pos, OpConst32, t) 13178 v0.AuxInt = (c & 0xffffffff) - 1 13179 v.AddArg(v0) 13180 return true 13181 } 13182 // match: (Mod32u <t> x (Const32 [c])) 13183 // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) 13184 // result: (Sub32 x (Mul32 <t> (Div32u <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13185 for { 13186 t := v.Type 13187 _ = v.Args[1] 13188 x := v.Args[0] 13189 v_1 := v.Args[1] 13190 if v_1.Op != OpConst32 { 13191 break 13192 } 13193 c := v_1.AuxInt 13194 if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { 13195 break 13196 } 13197 v.reset(OpSub32) 13198 v.AddArg(x) 13199 v0 := b.NewValue0(v.Pos, OpMul32, t) 13200 v1 := b.NewValue0(v.Pos, OpDiv32u, t) 13201 v1.AddArg(x) 13202 v2 := b.NewValue0(v.Pos, OpConst32, t) 13203 v2.AuxInt = c 13204 v1.AddArg(v2) 13205 v0.AddArg(v1) 13206 v3 := b.NewValue0(v.Pos, OpConst32, t) 13207 v3.AuxInt = c 13208 v0.AddArg(v3) 13209 v.AddArg(v0) 13210 return true 13211 } 13212 return false 13213 } 13214 func rewriteValuegeneric_OpMod64_0(v *Value) bool { 13215 b := v.Block 13216 _ = b 13217 // match: (Mod64 (Const64 [c]) (Const64 [d])) 13218 // cond: d != 0 13219 // result: (Const64 [c % d]) 13220 for { 13221 _ = v.Args[1] 13222 v_0 := v.Args[0] 13223 if v_0.Op != OpConst64 { 13224 break 13225 } 13226 c := v_0.AuxInt 13227 v_1 := v.Args[1] 13228 if v_1.Op != OpConst64 { 13229 break 13230 } 13231 d := v_1.AuxInt 13232 if !(d != 0) { 13233 break 13234 } 13235 v.reset(OpConst64) 13236 v.AuxInt = c % d 13237 return true 13238 } 13239 // match: (Mod64 <t> n (Const64 [c])) 13240 // cond: c < 0 && c != -1<<63 13241 // result: (Mod64 <t> n (Const64 <t> [-c])) 13242 for { 13243 t := v.Type 13244 _ = v.Args[1] 13245 n := v.Args[0] 13246 v_1 := v.Args[1] 13247 if v_1.Op != OpConst64 { 13248 break 13249 } 13250 c := v_1.AuxInt 13251 if !(c < 0 && c != -1<<63) { 13252 break 13253 } 13254 v.reset(OpMod64) 13255 v.Type = t 13256 v.AddArg(n) 13257 v0 := b.NewValue0(v.Pos, OpConst64, t) 13258 v0.AuxInt = -c 13259 v.AddArg(v0) 13260 return true 13261 } 13262 // match: (Mod64 <t> x (Const64 [c])) 13263 // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) 13264 // result: (Sub64 x (Mul64 <t> (Div64 <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 13265 for { 13266 t := v.Type 13267 _ = v.Args[1] 13268 x := v.Args[0] 13269 v_1 := v.Args[1] 13270 if v_1.Op != OpConst64 { 13271 break 13272 } 13273 c := v_1.AuxInt 13274 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { 13275 break 13276 } 13277 v.reset(OpSub64) 13278 v.AddArg(x) 13279 v0 := b.NewValue0(v.Pos, OpMul64, t) 13280 v1 := b.NewValue0(v.Pos, OpDiv64, t) 13281 v1.AddArg(x) 13282 v2 := b.NewValue0(v.Pos, OpConst64, t) 13283 v2.AuxInt = c 13284 v1.AddArg(v2) 13285 v0.AddArg(v1) 13286 v3 := b.NewValue0(v.Pos, OpConst64, t) 13287 v3.AuxInt = c 13288 v0.AddArg(v3) 13289 v.AddArg(v0) 13290 return true 13291 } 13292 return false 13293 } 13294 func rewriteValuegeneric_OpMod64u_0(v *Value) bool { 13295 b := v.Block 13296 _ = b 13297 // match: (Mod64u (Const64 [c]) (Const64 [d])) 13298 // cond: d != 0 13299 // result: (Const64 [int64(uint64(c) % uint64(d))]) 13300 for { 13301 _ = v.Args[1] 13302 v_0 := v.Args[0] 13303 if v_0.Op != OpConst64 { 13304 break 13305 } 13306 c := v_0.AuxInt 13307 v_1 := v.Args[1] 13308 if v_1.Op != OpConst64 { 13309 break 13310 } 13311 d := v_1.AuxInt 13312 if !(d != 0) { 13313 break 13314 } 13315 v.reset(OpConst64) 13316 v.AuxInt = int64(uint64(c) % uint64(d)) 13317 return true 13318 } 13319 // match: (Mod64u <t> n (Const64 [c])) 13320 // cond: isPowerOfTwo(c) 13321 // result: (And64 n (Const64 <t> [c-1])) 13322 for { 13323 t := v.Type 13324 _ = v.Args[1] 13325 n := v.Args[0] 13326 v_1 := v.Args[1] 13327 if v_1.Op != OpConst64 { 13328 break 13329 } 13330 c := v_1.AuxInt 13331 if !(isPowerOfTwo(c)) { 13332 break 13333 } 13334 v.reset(OpAnd64) 13335 v.AddArg(n) 13336 v0 := b.NewValue0(v.Pos, OpConst64, t) 13337 v0.AuxInt = c - 1 13338 v.AddArg(v0) 13339 return true 13340 } 13341 // match: (Mod64u <t> x (Const64 [c])) 13342 // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) 13343 // result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 13344 for { 13345 t := v.Type 13346 _ = v.Args[1] 13347 x := v.Args[0] 13348 v_1 := v.Args[1] 13349 if v_1.Op != OpConst64 { 13350 break 13351 } 13352 c := v_1.AuxInt 13353 if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { 13354 break 13355 } 13356 v.reset(OpSub64) 13357 v.AddArg(x) 13358 v0 := b.NewValue0(v.Pos, OpMul64, t) 13359 v1 := b.NewValue0(v.Pos, OpDiv64u, t) 13360 v1.AddArg(x) 13361 v2 := b.NewValue0(v.Pos, OpConst64, t) 13362 v2.AuxInt = c 13363 v1.AddArg(v2) 13364 v0.AddArg(v1) 13365 v3 := b.NewValue0(v.Pos, OpConst64, t) 13366 v3.AuxInt = c 13367 v0.AddArg(v3) 13368 v.AddArg(v0) 13369 return true 13370 } 13371 return false 13372 } 13373 func rewriteValuegeneric_OpMod8_0(v *Value) bool { 13374 b := v.Block 13375 _ = b 13376 // match: (Mod8 (Const8 [c]) (Const8 [d])) 13377 // cond: d != 0 13378 // result: (Const8 [int64(int8(c % d))]) 13379 for { 13380 _ = v.Args[1] 13381 v_0 := v.Args[0] 13382 if v_0.Op != OpConst8 { 13383 break 13384 } 13385 c := v_0.AuxInt 13386 v_1 := v.Args[1] 13387 if v_1.Op != OpConst8 { 13388 break 13389 } 13390 d := v_1.AuxInt 13391 if !(d != 0) { 13392 break 13393 } 13394 v.reset(OpConst8) 13395 v.AuxInt = int64(int8(c % d)) 13396 return true 13397 } 13398 // match: (Mod8 <t> n (Const8 [c])) 13399 // cond: c < 0 && c != -1<<7 13400 // result: (Mod8 <t> n (Const8 <t> [-c])) 13401 for { 13402 t := v.Type 13403 _ = v.Args[1] 13404 n := v.Args[0] 13405 v_1 := v.Args[1] 13406 if v_1.Op != OpConst8 { 13407 break 13408 } 13409 c := v_1.AuxInt 13410 if !(c < 0 && c != -1<<7) { 13411 break 13412 } 13413 v.reset(OpMod8) 13414 v.Type = t 13415 v.AddArg(n) 13416 v0 := b.NewValue0(v.Pos, OpConst8, t) 13417 v0.AuxInt = -c 13418 v.AddArg(v0) 13419 return true 13420 } 13421 // match: (Mod8 <t> x (Const8 [c])) 13422 // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) 13423 // result: (Sub8 x (Mul8 <t> (Div8 <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 13424 for { 13425 t := v.Type 13426 _ = v.Args[1] 13427 x := v.Args[0] 13428 v_1 := v.Args[1] 13429 if v_1.Op != OpConst8 { 13430 break 13431 } 13432 c := v_1.AuxInt 13433 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { 13434 break 13435 } 13436 v.reset(OpSub8) 13437 v.AddArg(x) 13438 v0 := b.NewValue0(v.Pos, OpMul8, t) 13439 v1 := b.NewValue0(v.Pos, OpDiv8, t) 13440 v1.AddArg(x) 13441 v2 := b.NewValue0(v.Pos, OpConst8, t) 13442 v2.AuxInt = c 13443 v1.AddArg(v2) 13444 v0.AddArg(v1) 13445 v3 := b.NewValue0(v.Pos, OpConst8, t) 13446 v3.AuxInt = c 13447 v0.AddArg(v3) 13448 v.AddArg(v0) 13449 return true 13450 } 13451 return false 13452 } 13453 func rewriteValuegeneric_OpMod8u_0(v *Value) bool { 13454 b := v.Block 13455 _ = b 13456 // match: (Mod8u (Const8 [c]) (Const8 [d])) 13457 // cond: d != 0 13458 // result: (Const8 [int64(uint8(c) % uint8(d))]) 13459 for { 13460 _ = v.Args[1] 13461 v_0 := v.Args[0] 13462 if v_0.Op != OpConst8 { 13463 break 13464 } 13465 c := v_0.AuxInt 13466 v_1 := v.Args[1] 13467 if v_1.Op != OpConst8 { 13468 break 13469 } 13470 d := v_1.AuxInt 13471 if !(d != 0) { 13472 break 13473 } 13474 v.reset(OpConst8) 13475 v.AuxInt = int64(uint8(c) % uint8(d)) 13476 return true 13477 } 13478 // match: (Mod8u <t> n (Const8 [c])) 13479 // cond: isPowerOfTwo(c&0xff) 13480 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 13481 for { 13482 t := v.Type 13483 _ = v.Args[1] 13484 n := v.Args[0] 13485 v_1 := v.Args[1] 13486 if v_1.Op != OpConst8 { 13487 break 13488 } 13489 c := v_1.AuxInt 13490 if !(isPowerOfTwo(c & 0xff)) { 13491 break 13492 } 13493 v.reset(OpAnd8) 13494 v.AddArg(n) 13495 v0 := b.NewValue0(v.Pos, OpConst8, t) 13496 v0.AuxInt = (c & 0xff) - 1 13497 v.AddArg(v0) 13498 return true 13499 } 13500 // match: (Mod8u <t> x (Const8 [c])) 13501 // cond: x.Op != OpConst8 && c > 0 && umagicOK(8 ,c) 13502 // result: (Sub8 x (Mul8 <t> (Div8u <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 13503 for { 13504 t := v.Type 13505 _ = v.Args[1] 13506 x := v.Args[0] 13507 v_1 := v.Args[1] 13508 if v_1.Op != OpConst8 { 13509 break 13510 } 13511 c := v_1.AuxInt 13512 if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { 13513 break 13514 } 13515 v.reset(OpSub8) 13516 v.AddArg(x) 13517 v0 := b.NewValue0(v.Pos, OpMul8, t) 13518 v1 := b.NewValue0(v.Pos, OpDiv8u, t) 13519 v1.AddArg(x) 13520 v2 := b.NewValue0(v.Pos, OpConst8, t) 13521 v2.AuxInt = c 13522 v1.AddArg(v2) 13523 v0.AddArg(v1) 13524 v3 := b.NewValue0(v.Pos, OpConst8, t) 13525 v3.AuxInt = c 13526 v0.AddArg(v3) 13527 v.AddArg(v0) 13528 return true 13529 } 13530 return false 13531 } 13532 func rewriteValuegeneric_OpMul16_0(v *Value) bool { 13533 b := v.Block 13534 _ = b 13535 typ := &b.Func.Config.Types 13536 _ = typ 13537 // match: (Mul16 (Const16 [c]) (Const16 [d])) 13538 // cond: 13539 // result: (Const16 [int64(int16(c*d))]) 13540 for { 13541 _ = v.Args[1] 13542 v_0 := v.Args[0] 13543 if v_0.Op != OpConst16 { 13544 break 13545 } 13546 c := v_0.AuxInt 13547 v_1 := v.Args[1] 13548 if v_1.Op != OpConst16 { 13549 break 13550 } 13551 d := v_1.AuxInt 13552 v.reset(OpConst16) 13553 v.AuxInt = int64(int16(c * d)) 13554 return true 13555 } 13556 // match: (Mul16 (Const16 [d]) (Const16 [c])) 13557 // cond: 13558 // result: (Const16 [int64(int16(c*d))]) 13559 for { 13560 _ = v.Args[1] 13561 v_0 := v.Args[0] 13562 if v_0.Op != OpConst16 { 13563 break 13564 } 13565 d := v_0.AuxInt 13566 v_1 := v.Args[1] 13567 if v_1.Op != OpConst16 { 13568 break 13569 } 13570 c := v_1.AuxInt 13571 v.reset(OpConst16) 13572 v.AuxInt = int64(int16(c * d)) 13573 return true 13574 } 13575 // match: (Mul16 (Const16 [1]) x) 13576 // cond: 13577 // result: x 13578 for { 13579 _ = v.Args[1] 13580 v_0 := v.Args[0] 13581 if v_0.Op != OpConst16 { 13582 break 13583 } 13584 if v_0.AuxInt != 1 { 13585 break 13586 } 13587 x := v.Args[1] 13588 v.reset(OpCopy) 13589 v.Type = x.Type 13590 v.AddArg(x) 13591 return true 13592 } 13593 // match: (Mul16 x (Const16 [1])) 13594 // cond: 13595 // result: x 13596 for { 13597 _ = v.Args[1] 13598 x := v.Args[0] 13599 v_1 := v.Args[1] 13600 if v_1.Op != OpConst16 { 13601 break 13602 } 13603 if v_1.AuxInt != 1 { 13604 break 13605 } 13606 v.reset(OpCopy) 13607 v.Type = x.Type 13608 v.AddArg(x) 13609 return true 13610 } 13611 // match: (Mul16 (Const16 [-1]) x) 13612 // cond: 13613 // result: (Neg16 x) 13614 for { 13615 _ = v.Args[1] 13616 v_0 := v.Args[0] 13617 if v_0.Op != OpConst16 { 13618 break 13619 } 13620 if v_0.AuxInt != -1 { 13621 break 13622 } 13623 x := v.Args[1] 13624 v.reset(OpNeg16) 13625 v.AddArg(x) 13626 return true 13627 } 13628 // match: (Mul16 x (Const16 [-1])) 13629 // cond: 13630 // result: (Neg16 x) 13631 for { 13632 _ = v.Args[1] 13633 x := v.Args[0] 13634 v_1 := v.Args[1] 13635 if v_1.Op != OpConst16 { 13636 break 13637 } 13638 if v_1.AuxInt != -1 { 13639 break 13640 } 13641 v.reset(OpNeg16) 13642 v.AddArg(x) 13643 return true 13644 } 13645 // match: (Mul16 <t> n (Const16 [c])) 13646 // cond: isPowerOfTwo(c) 13647 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 13648 for { 13649 t := v.Type 13650 _ = v.Args[1] 13651 n := v.Args[0] 13652 v_1 := v.Args[1] 13653 if v_1.Op != OpConst16 { 13654 break 13655 } 13656 c := v_1.AuxInt 13657 if !(isPowerOfTwo(c)) { 13658 break 13659 } 13660 v.reset(OpLsh16x64) 13661 v.Type = t 13662 v.AddArg(n) 13663 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13664 v0.AuxInt = log2(c) 13665 v.AddArg(v0) 13666 return true 13667 } 13668 // match: (Mul16 <t> (Const16 [c]) n) 13669 // cond: isPowerOfTwo(c) 13670 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 13671 for { 13672 t := v.Type 13673 _ = v.Args[1] 13674 v_0 := v.Args[0] 13675 if v_0.Op != OpConst16 { 13676 break 13677 } 13678 c := v_0.AuxInt 13679 n := v.Args[1] 13680 if !(isPowerOfTwo(c)) { 13681 break 13682 } 13683 v.reset(OpLsh16x64) 13684 v.Type = t 13685 v.AddArg(n) 13686 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13687 v0.AuxInt = log2(c) 13688 v.AddArg(v0) 13689 return true 13690 } 13691 // match: (Mul16 <t> n (Const16 [c])) 13692 // cond: t.IsSigned() && isPowerOfTwo(-c) 13693 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 13694 for { 13695 t := v.Type 13696 _ = v.Args[1] 13697 n := v.Args[0] 13698 v_1 := v.Args[1] 13699 if v_1.Op != OpConst16 { 13700 break 13701 } 13702 c := v_1.AuxInt 13703 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13704 break 13705 } 13706 v.reset(OpNeg16) 13707 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 13708 v0.AddArg(n) 13709 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13710 v1.AuxInt = log2(-c) 13711 v0.AddArg(v1) 13712 v.AddArg(v0) 13713 return true 13714 } 13715 // match: (Mul16 <t> (Const16 [c]) n) 13716 // cond: t.IsSigned() && isPowerOfTwo(-c) 13717 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 13718 for { 13719 t := v.Type 13720 _ = v.Args[1] 13721 v_0 := v.Args[0] 13722 if v_0.Op != OpConst16 { 13723 break 13724 } 13725 c := v_0.AuxInt 13726 n := v.Args[1] 13727 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13728 break 13729 } 13730 v.reset(OpNeg16) 13731 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 13732 v0.AddArg(n) 13733 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13734 v1.AuxInt = log2(-c) 13735 v0.AddArg(v1) 13736 v.AddArg(v0) 13737 return true 13738 } 13739 return false 13740 } 13741 func rewriteValuegeneric_OpMul16_10(v *Value) bool { 13742 b := v.Block 13743 _ = b 13744 // match: (Mul16 (Const16 [0]) _) 13745 // cond: 13746 // result: (Const16 [0]) 13747 for { 13748 _ = v.Args[1] 13749 v_0 := v.Args[0] 13750 if v_0.Op != OpConst16 { 13751 break 13752 } 13753 if v_0.AuxInt != 0 { 13754 break 13755 } 13756 v.reset(OpConst16) 13757 v.AuxInt = 0 13758 return true 13759 } 13760 // match: (Mul16 _ (Const16 [0])) 13761 // cond: 13762 // result: (Const16 [0]) 13763 for { 13764 _ = v.Args[1] 13765 v_1 := v.Args[1] 13766 if v_1.Op != OpConst16 { 13767 break 13768 } 13769 if v_1.AuxInt != 0 { 13770 break 13771 } 13772 v.reset(OpConst16) 13773 v.AuxInt = 0 13774 return true 13775 } 13776 // match: (Mul16 (Const16 <t> [c]) (Mul16 (Const16 <t> [d]) x)) 13777 // cond: 13778 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 13779 for { 13780 _ = v.Args[1] 13781 v_0 := v.Args[0] 13782 if v_0.Op != OpConst16 { 13783 break 13784 } 13785 t := v_0.Type 13786 c := v_0.AuxInt 13787 v_1 := v.Args[1] 13788 if v_1.Op != OpMul16 { 13789 break 13790 } 13791 _ = v_1.Args[1] 13792 v_1_0 := v_1.Args[0] 13793 if v_1_0.Op != OpConst16 { 13794 break 13795 } 13796 if v_1_0.Type != t { 13797 break 13798 } 13799 d := v_1_0.AuxInt 13800 x := v_1.Args[1] 13801 v.reset(OpMul16) 13802 v0 := b.NewValue0(v.Pos, OpConst16, t) 13803 v0.AuxInt = int64(int16(c * d)) 13804 v.AddArg(v0) 13805 v.AddArg(x) 13806 return true 13807 } 13808 // match: (Mul16 (Const16 <t> [c]) (Mul16 x (Const16 <t> [d]))) 13809 // cond: 13810 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 13811 for { 13812 _ = v.Args[1] 13813 v_0 := v.Args[0] 13814 if v_0.Op != OpConst16 { 13815 break 13816 } 13817 t := v_0.Type 13818 c := v_0.AuxInt 13819 v_1 := v.Args[1] 13820 if v_1.Op != OpMul16 { 13821 break 13822 } 13823 _ = v_1.Args[1] 13824 x := v_1.Args[0] 13825 v_1_1 := v_1.Args[1] 13826 if v_1_1.Op != OpConst16 { 13827 break 13828 } 13829 if v_1_1.Type != t { 13830 break 13831 } 13832 d := v_1_1.AuxInt 13833 v.reset(OpMul16) 13834 v0 := b.NewValue0(v.Pos, OpConst16, t) 13835 v0.AuxInt = int64(int16(c * d)) 13836 v.AddArg(v0) 13837 v.AddArg(x) 13838 return true 13839 } 13840 // match: (Mul16 (Mul16 (Const16 <t> [d]) x) (Const16 <t> [c])) 13841 // cond: 13842 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 13843 for { 13844 _ = v.Args[1] 13845 v_0 := v.Args[0] 13846 if v_0.Op != OpMul16 { 13847 break 13848 } 13849 _ = v_0.Args[1] 13850 v_0_0 := v_0.Args[0] 13851 if v_0_0.Op != OpConst16 { 13852 break 13853 } 13854 t := v_0_0.Type 13855 d := v_0_0.AuxInt 13856 x := v_0.Args[1] 13857 v_1 := v.Args[1] 13858 if v_1.Op != OpConst16 { 13859 break 13860 } 13861 if v_1.Type != t { 13862 break 13863 } 13864 c := v_1.AuxInt 13865 v.reset(OpMul16) 13866 v0 := b.NewValue0(v.Pos, OpConst16, t) 13867 v0.AuxInt = int64(int16(c * d)) 13868 v.AddArg(v0) 13869 v.AddArg(x) 13870 return true 13871 } 13872 // match: (Mul16 (Mul16 x (Const16 <t> [d])) (Const16 <t> [c])) 13873 // cond: 13874 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 13875 for { 13876 _ = v.Args[1] 13877 v_0 := v.Args[0] 13878 if v_0.Op != OpMul16 { 13879 break 13880 } 13881 _ = v_0.Args[1] 13882 x := v_0.Args[0] 13883 v_0_1 := v_0.Args[1] 13884 if v_0_1.Op != OpConst16 { 13885 break 13886 } 13887 t := v_0_1.Type 13888 d := v_0_1.AuxInt 13889 v_1 := v.Args[1] 13890 if v_1.Op != OpConst16 { 13891 break 13892 } 13893 if v_1.Type != t { 13894 break 13895 } 13896 c := v_1.AuxInt 13897 v.reset(OpMul16) 13898 v0 := b.NewValue0(v.Pos, OpConst16, t) 13899 v0.AuxInt = int64(int16(c * d)) 13900 v.AddArg(v0) 13901 v.AddArg(x) 13902 return true 13903 } 13904 return false 13905 } 13906 func rewriteValuegeneric_OpMul32_0(v *Value) bool { 13907 b := v.Block 13908 _ = b 13909 typ := &b.Func.Config.Types 13910 _ = typ 13911 // match: (Mul32 (Const32 [c]) (Const32 [d])) 13912 // cond: 13913 // result: (Const32 [int64(int32(c*d))]) 13914 for { 13915 _ = v.Args[1] 13916 v_0 := v.Args[0] 13917 if v_0.Op != OpConst32 { 13918 break 13919 } 13920 c := v_0.AuxInt 13921 v_1 := v.Args[1] 13922 if v_1.Op != OpConst32 { 13923 break 13924 } 13925 d := v_1.AuxInt 13926 v.reset(OpConst32) 13927 v.AuxInt = int64(int32(c * d)) 13928 return true 13929 } 13930 // match: (Mul32 (Const32 [d]) (Const32 [c])) 13931 // cond: 13932 // result: (Const32 [int64(int32(c*d))]) 13933 for { 13934 _ = v.Args[1] 13935 v_0 := v.Args[0] 13936 if v_0.Op != OpConst32 { 13937 break 13938 } 13939 d := v_0.AuxInt 13940 v_1 := v.Args[1] 13941 if v_1.Op != OpConst32 { 13942 break 13943 } 13944 c := v_1.AuxInt 13945 v.reset(OpConst32) 13946 v.AuxInt = int64(int32(c * d)) 13947 return true 13948 } 13949 // match: (Mul32 (Const32 [1]) x) 13950 // cond: 13951 // result: x 13952 for { 13953 _ = v.Args[1] 13954 v_0 := v.Args[0] 13955 if v_0.Op != OpConst32 { 13956 break 13957 } 13958 if v_0.AuxInt != 1 { 13959 break 13960 } 13961 x := v.Args[1] 13962 v.reset(OpCopy) 13963 v.Type = x.Type 13964 v.AddArg(x) 13965 return true 13966 } 13967 // match: (Mul32 x (Const32 [1])) 13968 // cond: 13969 // result: x 13970 for { 13971 _ = v.Args[1] 13972 x := v.Args[0] 13973 v_1 := v.Args[1] 13974 if v_1.Op != OpConst32 { 13975 break 13976 } 13977 if v_1.AuxInt != 1 { 13978 break 13979 } 13980 v.reset(OpCopy) 13981 v.Type = x.Type 13982 v.AddArg(x) 13983 return true 13984 } 13985 // match: (Mul32 (Const32 [-1]) x) 13986 // cond: 13987 // result: (Neg32 x) 13988 for { 13989 _ = v.Args[1] 13990 v_0 := v.Args[0] 13991 if v_0.Op != OpConst32 { 13992 break 13993 } 13994 if v_0.AuxInt != -1 { 13995 break 13996 } 13997 x := v.Args[1] 13998 v.reset(OpNeg32) 13999 v.AddArg(x) 14000 return true 14001 } 14002 // match: (Mul32 x (Const32 [-1])) 14003 // cond: 14004 // result: (Neg32 x) 14005 for { 14006 _ = v.Args[1] 14007 x := v.Args[0] 14008 v_1 := v.Args[1] 14009 if v_1.Op != OpConst32 { 14010 break 14011 } 14012 if v_1.AuxInt != -1 { 14013 break 14014 } 14015 v.reset(OpNeg32) 14016 v.AddArg(x) 14017 return true 14018 } 14019 // match: (Mul32 <t> n (Const32 [c])) 14020 // cond: isPowerOfTwo(c) 14021 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14022 for { 14023 t := v.Type 14024 _ = v.Args[1] 14025 n := v.Args[0] 14026 v_1 := v.Args[1] 14027 if v_1.Op != OpConst32 { 14028 break 14029 } 14030 c := v_1.AuxInt 14031 if !(isPowerOfTwo(c)) { 14032 break 14033 } 14034 v.reset(OpLsh32x64) 14035 v.Type = t 14036 v.AddArg(n) 14037 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14038 v0.AuxInt = log2(c) 14039 v.AddArg(v0) 14040 return true 14041 } 14042 // match: (Mul32 <t> (Const32 [c]) n) 14043 // cond: isPowerOfTwo(c) 14044 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14045 for { 14046 t := v.Type 14047 _ = v.Args[1] 14048 v_0 := v.Args[0] 14049 if v_0.Op != OpConst32 { 14050 break 14051 } 14052 c := v_0.AuxInt 14053 n := v.Args[1] 14054 if !(isPowerOfTwo(c)) { 14055 break 14056 } 14057 v.reset(OpLsh32x64) 14058 v.Type = t 14059 v.AddArg(n) 14060 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14061 v0.AuxInt = log2(c) 14062 v.AddArg(v0) 14063 return true 14064 } 14065 // match: (Mul32 <t> n (Const32 [c])) 14066 // cond: t.IsSigned() && isPowerOfTwo(-c) 14067 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14068 for { 14069 t := v.Type 14070 _ = v.Args[1] 14071 n := v.Args[0] 14072 v_1 := v.Args[1] 14073 if v_1.Op != OpConst32 { 14074 break 14075 } 14076 c := v_1.AuxInt 14077 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14078 break 14079 } 14080 v.reset(OpNeg32) 14081 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14082 v0.AddArg(n) 14083 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14084 v1.AuxInt = log2(-c) 14085 v0.AddArg(v1) 14086 v.AddArg(v0) 14087 return true 14088 } 14089 // match: (Mul32 <t> (Const32 [c]) n) 14090 // cond: t.IsSigned() && isPowerOfTwo(-c) 14091 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14092 for { 14093 t := v.Type 14094 _ = v.Args[1] 14095 v_0 := v.Args[0] 14096 if v_0.Op != OpConst32 { 14097 break 14098 } 14099 c := v_0.AuxInt 14100 n := v.Args[1] 14101 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14102 break 14103 } 14104 v.reset(OpNeg32) 14105 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14106 v0.AddArg(n) 14107 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14108 v1.AuxInt = log2(-c) 14109 v0.AddArg(v1) 14110 v.AddArg(v0) 14111 return true 14112 } 14113 return false 14114 } 14115 func rewriteValuegeneric_OpMul32_10(v *Value) bool { 14116 b := v.Block 14117 _ = b 14118 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x)) 14119 // cond: 14120 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14121 for { 14122 _ = v.Args[1] 14123 v_0 := v.Args[0] 14124 if v_0.Op != OpConst32 { 14125 break 14126 } 14127 t := v_0.Type 14128 c := v_0.AuxInt 14129 v_1 := v.Args[1] 14130 if v_1.Op != OpAdd32 { 14131 break 14132 } 14133 if v_1.Type != t { 14134 break 14135 } 14136 _ = v_1.Args[1] 14137 v_1_0 := v_1.Args[0] 14138 if v_1_0.Op != OpConst32 { 14139 break 14140 } 14141 if v_1_0.Type != t { 14142 break 14143 } 14144 d := v_1_0.AuxInt 14145 x := v_1.Args[1] 14146 v.reset(OpAdd32) 14147 v0 := b.NewValue0(v.Pos, OpConst32, t) 14148 v0.AuxInt = int64(int32(c * d)) 14149 v.AddArg(v0) 14150 v1 := b.NewValue0(v.Pos, OpMul32, t) 14151 v2 := b.NewValue0(v.Pos, OpConst32, t) 14152 v2.AuxInt = c 14153 v1.AddArg(v2) 14154 v1.AddArg(x) 14155 v.AddArg(v1) 14156 return true 14157 } 14158 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> x (Const32 <t> [d]))) 14159 // cond: 14160 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14161 for { 14162 _ = v.Args[1] 14163 v_0 := v.Args[0] 14164 if v_0.Op != OpConst32 { 14165 break 14166 } 14167 t := v_0.Type 14168 c := v_0.AuxInt 14169 v_1 := v.Args[1] 14170 if v_1.Op != OpAdd32 { 14171 break 14172 } 14173 if v_1.Type != t { 14174 break 14175 } 14176 _ = v_1.Args[1] 14177 x := v_1.Args[0] 14178 v_1_1 := v_1.Args[1] 14179 if v_1_1.Op != OpConst32 { 14180 break 14181 } 14182 if v_1_1.Type != t { 14183 break 14184 } 14185 d := v_1_1.AuxInt 14186 v.reset(OpAdd32) 14187 v0 := b.NewValue0(v.Pos, OpConst32, t) 14188 v0.AuxInt = int64(int32(c * d)) 14189 v.AddArg(v0) 14190 v1 := b.NewValue0(v.Pos, OpMul32, t) 14191 v2 := b.NewValue0(v.Pos, OpConst32, t) 14192 v2.AuxInt = c 14193 v1.AddArg(v2) 14194 v1.AddArg(x) 14195 v.AddArg(v1) 14196 return true 14197 } 14198 // match: (Mul32 (Add32 <t> (Const32 <t> [d]) x) (Const32 <t> [c])) 14199 // cond: 14200 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14201 for { 14202 _ = v.Args[1] 14203 v_0 := v.Args[0] 14204 if v_0.Op != OpAdd32 { 14205 break 14206 } 14207 t := v_0.Type 14208 _ = v_0.Args[1] 14209 v_0_0 := v_0.Args[0] 14210 if v_0_0.Op != OpConst32 { 14211 break 14212 } 14213 if v_0_0.Type != t { 14214 break 14215 } 14216 d := v_0_0.AuxInt 14217 x := v_0.Args[1] 14218 v_1 := v.Args[1] 14219 if v_1.Op != OpConst32 { 14220 break 14221 } 14222 if v_1.Type != t { 14223 break 14224 } 14225 c := v_1.AuxInt 14226 v.reset(OpAdd32) 14227 v0 := b.NewValue0(v.Pos, OpConst32, t) 14228 v0.AuxInt = int64(int32(c * d)) 14229 v.AddArg(v0) 14230 v1 := b.NewValue0(v.Pos, OpMul32, t) 14231 v2 := b.NewValue0(v.Pos, OpConst32, t) 14232 v2.AuxInt = c 14233 v1.AddArg(v2) 14234 v1.AddArg(x) 14235 v.AddArg(v1) 14236 return true 14237 } 14238 // match: (Mul32 (Add32 <t> x (Const32 <t> [d])) (Const32 <t> [c])) 14239 // cond: 14240 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14241 for { 14242 _ = v.Args[1] 14243 v_0 := v.Args[0] 14244 if v_0.Op != OpAdd32 { 14245 break 14246 } 14247 t := v_0.Type 14248 _ = v_0.Args[1] 14249 x := v_0.Args[0] 14250 v_0_1 := v_0.Args[1] 14251 if v_0_1.Op != OpConst32 { 14252 break 14253 } 14254 if v_0_1.Type != t { 14255 break 14256 } 14257 d := v_0_1.AuxInt 14258 v_1 := v.Args[1] 14259 if v_1.Op != OpConst32 { 14260 break 14261 } 14262 if v_1.Type != t { 14263 break 14264 } 14265 c := v_1.AuxInt 14266 v.reset(OpAdd32) 14267 v0 := b.NewValue0(v.Pos, OpConst32, t) 14268 v0.AuxInt = int64(int32(c * d)) 14269 v.AddArg(v0) 14270 v1 := b.NewValue0(v.Pos, OpMul32, t) 14271 v2 := b.NewValue0(v.Pos, OpConst32, t) 14272 v2.AuxInt = c 14273 v1.AddArg(v2) 14274 v1.AddArg(x) 14275 v.AddArg(v1) 14276 return true 14277 } 14278 // match: (Mul32 (Const32 [0]) _) 14279 // cond: 14280 // result: (Const32 [0]) 14281 for { 14282 _ = v.Args[1] 14283 v_0 := v.Args[0] 14284 if v_0.Op != OpConst32 { 14285 break 14286 } 14287 if v_0.AuxInt != 0 { 14288 break 14289 } 14290 v.reset(OpConst32) 14291 v.AuxInt = 0 14292 return true 14293 } 14294 // match: (Mul32 _ (Const32 [0])) 14295 // cond: 14296 // result: (Const32 [0]) 14297 for { 14298 _ = v.Args[1] 14299 v_1 := v.Args[1] 14300 if v_1.Op != OpConst32 { 14301 break 14302 } 14303 if v_1.AuxInt != 0 { 14304 break 14305 } 14306 v.reset(OpConst32) 14307 v.AuxInt = 0 14308 return true 14309 } 14310 // match: (Mul32 (Const32 <t> [c]) (Mul32 (Const32 <t> [d]) x)) 14311 // cond: 14312 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 14313 for { 14314 _ = v.Args[1] 14315 v_0 := v.Args[0] 14316 if v_0.Op != OpConst32 { 14317 break 14318 } 14319 t := v_0.Type 14320 c := v_0.AuxInt 14321 v_1 := v.Args[1] 14322 if v_1.Op != OpMul32 { 14323 break 14324 } 14325 _ = v_1.Args[1] 14326 v_1_0 := v_1.Args[0] 14327 if v_1_0.Op != OpConst32 { 14328 break 14329 } 14330 if v_1_0.Type != t { 14331 break 14332 } 14333 d := v_1_0.AuxInt 14334 x := v_1.Args[1] 14335 v.reset(OpMul32) 14336 v0 := b.NewValue0(v.Pos, OpConst32, t) 14337 v0.AuxInt = int64(int32(c * d)) 14338 v.AddArg(v0) 14339 v.AddArg(x) 14340 return true 14341 } 14342 // match: (Mul32 (Const32 <t> [c]) (Mul32 x (Const32 <t> [d]))) 14343 // cond: 14344 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 14345 for { 14346 _ = v.Args[1] 14347 v_0 := v.Args[0] 14348 if v_0.Op != OpConst32 { 14349 break 14350 } 14351 t := v_0.Type 14352 c := v_0.AuxInt 14353 v_1 := v.Args[1] 14354 if v_1.Op != OpMul32 { 14355 break 14356 } 14357 _ = v_1.Args[1] 14358 x := v_1.Args[0] 14359 v_1_1 := v_1.Args[1] 14360 if v_1_1.Op != OpConst32 { 14361 break 14362 } 14363 if v_1_1.Type != t { 14364 break 14365 } 14366 d := v_1_1.AuxInt 14367 v.reset(OpMul32) 14368 v0 := b.NewValue0(v.Pos, OpConst32, t) 14369 v0.AuxInt = int64(int32(c * d)) 14370 v.AddArg(v0) 14371 v.AddArg(x) 14372 return true 14373 } 14374 // match: (Mul32 (Mul32 (Const32 <t> [d]) x) (Const32 <t> [c])) 14375 // cond: 14376 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 14377 for { 14378 _ = v.Args[1] 14379 v_0 := v.Args[0] 14380 if v_0.Op != OpMul32 { 14381 break 14382 } 14383 _ = v_0.Args[1] 14384 v_0_0 := v_0.Args[0] 14385 if v_0_0.Op != OpConst32 { 14386 break 14387 } 14388 t := v_0_0.Type 14389 d := v_0_0.AuxInt 14390 x := v_0.Args[1] 14391 v_1 := v.Args[1] 14392 if v_1.Op != OpConst32 { 14393 break 14394 } 14395 if v_1.Type != t { 14396 break 14397 } 14398 c := v_1.AuxInt 14399 v.reset(OpMul32) 14400 v0 := b.NewValue0(v.Pos, OpConst32, t) 14401 v0.AuxInt = int64(int32(c * d)) 14402 v.AddArg(v0) 14403 v.AddArg(x) 14404 return true 14405 } 14406 // match: (Mul32 (Mul32 x (Const32 <t> [d])) (Const32 <t> [c])) 14407 // cond: 14408 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 14409 for { 14410 _ = v.Args[1] 14411 v_0 := v.Args[0] 14412 if v_0.Op != OpMul32 { 14413 break 14414 } 14415 _ = v_0.Args[1] 14416 x := v_0.Args[0] 14417 v_0_1 := v_0.Args[1] 14418 if v_0_1.Op != OpConst32 { 14419 break 14420 } 14421 t := v_0_1.Type 14422 d := v_0_1.AuxInt 14423 v_1 := v.Args[1] 14424 if v_1.Op != OpConst32 { 14425 break 14426 } 14427 if v_1.Type != t { 14428 break 14429 } 14430 c := v_1.AuxInt 14431 v.reset(OpMul32) 14432 v0 := b.NewValue0(v.Pos, OpConst32, t) 14433 v0.AuxInt = int64(int32(c * d)) 14434 v.AddArg(v0) 14435 v.AddArg(x) 14436 return true 14437 } 14438 return false 14439 } 14440 func rewriteValuegeneric_OpMul32F_0(v *Value) bool { 14441 // match: (Mul32F (Const32F [c]) (Const32F [d])) 14442 // cond: 14443 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 14444 for { 14445 _ = v.Args[1] 14446 v_0 := v.Args[0] 14447 if v_0.Op != OpConst32F { 14448 break 14449 } 14450 c := v_0.AuxInt 14451 v_1 := v.Args[1] 14452 if v_1.Op != OpConst32F { 14453 break 14454 } 14455 d := v_1.AuxInt 14456 v.reset(OpConst32F) 14457 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 14458 return true 14459 } 14460 // match: (Mul32F (Const32F [d]) (Const32F [c])) 14461 // cond: 14462 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 14463 for { 14464 _ = v.Args[1] 14465 v_0 := v.Args[0] 14466 if v_0.Op != OpConst32F { 14467 break 14468 } 14469 d := v_0.AuxInt 14470 v_1 := v.Args[1] 14471 if v_1.Op != OpConst32F { 14472 break 14473 } 14474 c := v_1.AuxInt 14475 v.reset(OpConst32F) 14476 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 14477 return true 14478 } 14479 // match: (Mul32F x (Const32F [f2i(1)])) 14480 // cond: 14481 // result: x 14482 for { 14483 _ = v.Args[1] 14484 x := v.Args[0] 14485 v_1 := v.Args[1] 14486 if v_1.Op != OpConst32F { 14487 break 14488 } 14489 if v_1.AuxInt != f2i(1) { 14490 break 14491 } 14492 v.reset(OpCopy) 14493 v.Type = x.Type 14494 v.AddArg(x) 14495 return true 14496 } 14497 // match: (Mul32F (Const32F [f2i(1)]) x) 14498 // cond: 14499 // result: x 14500 for { 14501 _ = v.Args[1] 14502 v_0 := v.Args[0] 14503 if v_0.Op != OpConst32F { 14504 break 14505 } 14506 if v_0.AuxInt != f2i(1) { 14507 break 14508 } 14509 x := v.Args[1] 14510 v.reset(OpCopy) 14511 v.Type = x.Type 14512 v.AddArg(x) 14513 return true 14514 } 14515 // match: (Mul32F x (Const32F [f2i(-1)])) 14516 // cond: 14517 // result: (Neg32F x) 14518 for { 14519 _ = v.Args[1] 14520 x := v.Args[0] 14521 v_1 := v.Args[1] 14522 if v_1.Op != OpConst32F { 14523 break 14524 } 14525 if v_1.AuxInt != f2i(-1) { 14526 break 14527 } 14528 v.reset(OpNeg32F) 14529 v.AddArg(x) 14530 return true 14531 } 14532 // match: (Mul32F (Const32F [f2i(-1)]) x) 14533 // cond: 14534 // result: (Neg32F x) 14535 for { 14536 _ = v.Args[1] 14537 v_0 := v.Args[0] 14538 if v_0.Op != OpConst32F { 14539 break 14540 } 14541 if v_0.AuxInt != f2i(-1) { 14542 break 14543 } 14544 x := v.Args[1] 14545 v.reset(OpNeg32F) 14546 v.AddArg(x) 14547 return true 14548 } 14549 // match: (Mul32F x (Const32F [f2i(2)])) 14550 // cond: 14551 // result: (Add32F x x) 14552 for { 14553 _ = v.Args[1] 14554 x := v.Args[0] 14555 v_1 := v.Args[1] 14556 if v_1.Op != OpConst32F { 14557 break 14558 } 14559 if v_1.AuxInt != f2i(2) { 14560 break 14561 } 14562 v.reset(OpAdd32F) 14563 v.AddArg(x) 14564 v.AddArg(x) 14565 return true 14566 } 14567 // match: (Mul32F (Const32F [f2i(2)]) x) 14568 // cond: 14569 // result: (Add32F x x) 14570 for { 14571 _ = v.Args[1] 14572 v_0 := v.Args[0] 14573 if v_0.Op != OpConst32F { 14574 break 14575 } 14576 if v_0.AuxInt != f2i(2) { 14577 break 14578 } 14579 x := v.Args[1] 14580 v.reset(OpAdd32F) 14581 v.AddArg(x) 14582 v.AddArg(x) 14583 return true 14584 } 14585 return false 14586 } 14587 func rewriteValuegeneric_OpMul64_0(v *Value) bool { 14588 b := v.Block 14589 _ = b 14590 typ := &b.Func.Config.Types 14591 _ = typ 14592 // match: (Mul64 (Const64 [c]) (Const64 [d])) 14593 // cond: 14594 // result: (Const64 [c*d]) 14595 for { 14596 _ = v.Args[1] 14597 v_0 := v.Args[0] 14598 if v_0.Op != OpConst64 { 14599 break 14600 } 14601 c := v_0.AuxInt 14602 v_1 := v.Args[1] 14603 if v_1.Op != OpConst64 { 14604 break 14605 } 14606 d := v_1.AuxInt 14607 v.reset(OpConst64) 14608 v.AuxInt = c * d 14609 return true 14610 } 14611 // match: (Mul64 (Const64 [d]) (Const64 [c])) 14612 // cond: 14613 // result: (Const64 [c*d]) 14614 for { 14615 _ = v.Args[1] 14616 v_0 := v.Args[0] 14617 if v_0.Op != OpConst64 { 14618 break 14619 } 14620 d := v_0.AuxInt 14621 v_1 := v.Args[1] 14622 if v_1.Op != OpConst64 { 14623 break 14624 } 14625 c := v_1.AuxInt 14626 v.reset(OpConst64) 14627 v.AuxInt = c * d 14628 return true 14629 } 14630 // match: (Mul64 (Const64 [1]) x) 14631 // cond: 14632 // result: x 14633 for { 14634 _ = v.Args[1] 14635 v_0 := v.Args[0] 14636 if v_0.Op != OpConst64 { 14637 break 14638 } 14639 if v_0.AuxInt != 1 { 14640 break 14641 } 14642 x := v.Args[1] 14643 v.reset(OpCopy) 14644 v.Type = x.Type 14645 v.AddArg(x) 14646 return true 14647 } 14648 // match: (Mul64 x (Const64 [1])) 14649 // cond: 14650 // result: x 14651 for { 14652 _ = v.Args[1] 14653 x := v.Args[0] 14654 v_1 := v.Args[1] 14655 if v_1.Op != OpConst64 { 14656 break 14657 } 14658 if v_1.AuxInt != 1 { 14659 break 14660 } 14661 v.reset(OpCopy) 14662 v.Type = x.Type 14663 v.AddArg(x) 14664 return true 14665 } 14666 // match: (Mul64 (Const64 [-1]) x) 14667 // cond: 14668 // result: (Neg64 x) 14669 for { 14670 _ = v.Args[1] 14671 v_0 := v.Args[0] 14672 if v_0.Op != OpConst64 { 14673 break 14674 } 14675 if v_0.AuxInt != -1 { 14676 break 14677 } 14678 x := v.Args[1] 14679 v.reset(OpNeg64) 14680 v.AddArg(x) 14681 return true 14682 } 14683 // match: (Mul64 x (Const64 [-1])) 14684 // cond: 14685 // result: (Neg64 x) 14686 for { 14687 _ = v.Args[1] 14688 x := v.Args[0] 14689 v_1 := v.Args[1] 14690 if v_1.Op != OpConst64 { 14691 break 14692 } 14693 if v_1.AuxInt != -1 { 14694 break 14695 } 14696 v.reset(OpNeg64) 14697 v.AddArg(x) 14698 return true 14699 } 14700 // match: (Mul64 <t> n (Const64 [c])) 14701 // cond: isPowerOfTwo(c) 14702 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14703 for { 14704 t := v.Type 14705 _ = v.Args[1] 14706 n := v.Args[0] 14707 v_1 := v.Args[1] 14708 if v_1.Op != OpConst64 { 14709 break 14710 } 14711 c := v_1.AuxInt 14712 if !(isPowerOfTwo(c)) { 14713 break 14714 } 14715 v.reset(OpLsh64x64) 14716 v.Type = t 14717 v.AddArg(n) 14718 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14719 v0.AuxInt = log2(c) 14720 v.AddArg(v0) 14721 return true 14722 } 14723 // match: (Mul64 <t> (Const64 [c]) n) 14724 // cond: isPowerOfTwo(c) 14725 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14726 for { 14727 t := v.Type 14728 _ = v.Args[1] 14729 v_0 := v.Args[0] 14730 if v_0.Op != OpConst64 { 14731 break 14732 } 14733 c := v_0.AuxInt 14734 n := v.Args[1] 14735 if !(isPowerOfTwo(c)) { 14736 break 14737 } 14738 v.reset(OpLsh64x64) 14739 v.Type = t 14740 v.AddArg(n) 14741 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14742 v0.AuxInt = log2(c) 14743 v.AddArg(v0) 14744 return true 14745 } 14746 // match: (Mul64 <t> n (Const64 [c])) 14747 // cond: t.IsSigned() && isPowerOfTwo(-c) 14748 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14749 for { 14750 t := v.Type 14751 _ = v.Args[1] 14752 n := v.Args[0] 14753 v_1 := v.Args[1] 14754 if v_1.Op != OpConst64 { 14755 break 14756 } 14757 c := v_1.AuxInt 14758 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14759 break 14760 } 14761 v.reset(OpNeg64) 14762 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 14763 v0.AddArg(n) 14764 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14765 v1.AuxInt = log2(-c) 14766 v0.AddArg(v1) 14767 v.AddArg(v0) 14768 return true 14769 } 14770 // match: (Mul64 <t> (Const64 [c]) n) 14771 // cond: t.IsSigned() && isPowerOfTwo(-c) 14772 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14773 for { 14774 t := v.Type 14775 _ = v.Args[1] 14776 v_0 := v.Args[0] 14777 if v_0.Op != OpConst64 { 14778 break 14779 } 14780 c := v_0.AuxInt 14781 n := v.Args[1] 14782 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14783 break 14784 } 14785 v.reset(OpNeg64) 14786 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 14787 v0.AddArg(n) 14788 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14789 v1.AuxInt = log2(-c) 14790 v0.AddArg(v1) 14791 v.AddArg(v0) 14792 return true 14793 } 14794 return false 14795 } 14796 func rewriteValuegeneric_OpMul64_10(v *Value) bool { 14797 b := v.Block 14798 _ = b 14799 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x)) 14800 // cond: 14801 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 14802 for { 14803 _ = v.Args[1] 14804 v_0 := v.Args[0] 14805 if v_0.Op != OpConst64 { 14806 break 14807 } 14808 t := v_0.Type 14809 c := v_0.AuxInt 14810 v_1 := v.Args[1] 14811 if v_1.Op != OpAdd64 { 14812 break 14813 } 14814 if v_1.Type != t { 14815 break 14816 } 14817 _ = v_1.Args[1] 14818 v_1_0 := v_1.Args[0] 14819 if v_1_0.Op != OpConst64 { 14820 break 14821 } 14822 if v_1_0.Type != t { 14823 break 14824 } 14825 d := v_1_0.AuxInt 14826 x := v_1.Args[1] 14827 v.reset(OpAdd64) 14828 v0 := b.NewValue0(v.Pos, OpConst64, t) 14829 v0.AuxInt = c * d 14830 v.AddArg(v0) 14831 v1 := b.NewValue0(v.Pos, OpMul64, t) 14832 v2 := b.NewValue0(v.Pos, OpConst64, t) 14833 v2.AuxInt = c 14834 v1.AddArg(v2) 14835 v1.AddArg(x) 14836 v.AddArg(v1) 14837 return true 14838 } 14839 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> x (Const64 <t> [d]))) 14840 // cond: 14841 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 14842 for { 14843 _ = v.Args[1] 14844 v_0 := v.Args[0] 14845 if v_0.Op != OpConst64 { 14846 break 14847 } 14848 t := v_0.Type 14849 c := v_0.AuxInt 14850 v_1 := v.Args[1] 14851 if v_1.Op != OpAdd64 { 14852 break 14853 } 14854 if v_1.Type != t { 14855 break 14856 } 14857 _ = v_1.Args[1] 14858 x := v_1.Args[0] 14859 v_1_1 := v_1.Args[1] 14860 if v_1_1.Op != OpConst64 { 14861 break 14862 } 14863 if v_1_1.Type != t { 14864 break 14865 } 14866 d := v_1_1.AuxInt 14867 v.reset(OpAdd64) 14868 v0 := b.NewValue0(v.Pos, OpConst64, t) 14869 v0.AuxInt = c * d 14870 v.AddArg(v0) 14871 v1 := b.NewValue0(v.Pos, OpMul64, t) 14872 v2 := b.NewValue0(v.Pos, OpConst64, t) 14873 v2.AuxInt = c 14874 v1.AddArg(v2) 14875 v1.AddArg(x) 14876 v.AddArg(v1) 14877 return true 14878 } 14879 // match: (Mul64 (Add64 <t> (Const64 <t> [d]) x) (Const64 <t> [c])) 14880 // cond: 14881 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 14882 for { 14883 _ = v.Args[1] 14884 v_0 := v.Args[0] 14885 if v_0.Op != OpAdd64 { 14886 break 14887 } 14888 t := v_0.Type 14889 _ = v_0.Args[1] 14890 v_0_0 := v_0.Args[0] 14891 if v_0_0.Op != OpConst64 { 14892 break 14893 } 14894 if v_0_0.Type != t { 14895 break 14896 } 14897 d := v_0_0.AuxInt 14898 x := v_0.Args[1] 14899 v_1 := v.Args[1] 14900 if v_1.Op != OpConst64 { 14901 break 14902 } 14903 if v_1.Type != t { 14904 break 14905 } 14906 c := v_1.AuxInt 14907 v.reset(OpAdd64) 14908 v0 := b.NewValue0(v.Pos, OpConst64, t) 14909 v0.AuxInt = c * d 14910 v.AddArg(v0) 14911 v1 := b.NewValue0(v.Pos, OpMul64, t) 14912 v2 := b.NewValue0(v.Pos, OpConst64, t) 14913 v2.AuxInt = c 14914 v1.AddArg(v2) 14915 v1.AddArg(x) 14916 v.AddArg(v1) 14917 return true 14918 } 14919 // match: (Mul64 (Add64 <t> x (Const64 <t> [d])) (Const64 <t> [c])) 14920 // cond: 14921 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 14922 for { 14923 _ = v.Args[1] 14924 v_0 := v.Args[0] 14925 if v_0.Op != OpAdd64 { 14926 break 14927 } 14928 t := v_0.Type 14929 _ = v_0.Args[1] 14930 x := v_0.Args[0] 14931 v_0_1 := v_0.Args[1] 14932 if v_0_1.Op != OpConst64 { 14933 break 14934 } 14935 if v_0_1.Type != t { 14936 break 14937 } 14938 d := v_0_1.AuxInt 14939 v_1 := v.Args[1] 14940 if v_1.Op != OpConst64 { 14941 break 14942 } 14943 if v_1.Type != t { 14944 break 14945 } 14946 c := v_1.AuxInt 14947 v.reset(OpAdd64) 14948 v0 := b.NewValue0(v.Pos, OpConst64, t) 14949 v0.AuxInt = c * d 14950 v.AddArg(v0) 14951 v1 := b.NewValue0(v.Pos, OpMul64, t) 14952 v2 := b.NewValue0(v.Pos, OpConst64, t) 14953 v2.AuxInt = c 14954 v1.AddArg(v2) 14955 v1.AddArg(x) 14956 v.AddArg(v1) 14957 return true 14958 } 14959 // match: (Mul64 (Const64 [0]) _) 14960 // cond: 14961 // result: (Const64 [0]) 14962 for { 14963 _ = v.Args[1] 14964 v_0 := v.Args[0] 14965 if v_0.Op != OpConst64 { 14966 break 14967 } 14968 if v_0.AuxInt != 0 { 14969 break 14970 } 14971 v.reset(OpConst64) 14972 v.AuxInt = 0 14973 return true 14974 } 14975 // match: (Mul64 _ (Const64 [0])) 14976 // cond: 14977 // result: (Const64 [0]) 14978 for { 14979 _ = v.Args[1] 14980 v_1 := v.Args[1] 14981 if v_1.Op != OpConst64 { 14982 break 14983 } 14984 if v_1.AuxInt != 0 { 14985 break 14986 } 14987 v.reset(OpConst64) 14988 v.AuxInt = 0 14989 return true 14990 } 14991 // match: (Mul64 (Const64 <t> [c]) (Mul64 (Const64 <t> [d]) x)) 14992 // cond: 14993 // result: (Mul64 (Const64 <t> [c*d]) x) 14994 for { 14995 _ = v.Args[1] 14996 v_0 := v.Args[0] 14997 if v_0.Op != OpConst64 { 14998 break 14999 } 15000 t := v_0.Type 15001 c := v_0.AuxInt 15002 v_1 := v.Args[1] 15003 if v_1.Op != OpMul64 { 15004 break 15005 } 15006 _ = v_1.Args[1] 15007 v_1_0 := v_1.Args[0] 15008 if v_1_0.Op != OpConst64 { 15009 break 15010 } 15011 if v_1_0.Type != t { 15012 break 15013 } 15014 d := v_1_0.AuxInt 15015 x := v_1.Args[1] 15016 v.reset(OpMul64) 15017 v0 := b.NewValue0(v.Pos, OpConst64, t) 15018 v0.AuxInt = c * d 15019 v.AddArg(v0) 15020 v.AddArg(x) 15021 return true 15022 } 15023 // match: (Mul64 (Const64 <t> [c]) (Mul64 x (Const64 <t> [d]))) 15024 // cond: 15025 // result: (Mul64 (Const64 <t> [c*d]) x) 15026 for { 15027 _ = v.Args[1] 15028 v_0 := v.Args[0] 15029 if v_0.Op != OpConst64 { 15030 break 15031 } 15032 t := v_0.Type 15033 c := v_0.AuxInt 15034 v_1 := v.Args[1] 15035 if v_1.Op != OpMul64 { 15036 break 15037 } 15038 _ = v_1.Args[1] 15039 x := v_1.Args[0] 15040 v_1_1 := v_1.Args[1] 15041 if v_1_1.Op != OpConst64 { 15042 break 15043 } 15044 if v_1_1.Type != t { 15045 break 15046 } 15047 d := v_1_1.AuxInt 15048 v.reset(OpMul64) 15049 v0 := b.NewValue0(v.Pos, OpConst64, t) 15050 v0.AuxInt = c * d 15051 v.AddArg(v0) 15052 v.AddArg(x) 15053 return true 15054 } 15055 // match: (Mul64 (Mul64 (Const64 <t> [d]) x) (Const64 <t> [c])) 15056 // cond: 15057 // result: (Mul64 (Const64 <t> [c*d]) x) 15058 for { 15059 _ = v.Args[1] 15060 v_0 := v.Args[0] 15061 if v_0.Op != OpMul64 { 15062 break 15063 } 15064 _ = v_0.Args[1] 15065 v_0_0 := v_0.Args[0] 15066 if v_0_0.Op != OpConst64 { 15067 break 15068 } 15069 t := v_0_0.Type 15070 d := v_0_0.AuxInt 15071 x := v_0.Args[1] 15072 v_1 := v.Args[1] 15073 if v_1.Op != OpConst64 { 15074 break 15075 } 15076 if v_1.Type != t { 15077 break 15078 } 15079 c := v_1.AuxInt 15080 v.reset(OpMul64) 15081 v0 := b.NewValue0(v.Pos, OpConst64, t) 15082 v0.AuxInt = c * d 15083 v.AddArg(v0) 15084 v.AddArg(x) 15085 return true 15086 } 15087 // match: (Mul64 (Mul64 x (Const64 <t> [d])) (Const64 <t> [c])) 15088 // cond: 15089 // result: (Mul64 (Const64 <t> [c*d]) x) 15090 for { 15091 _ = v.Args[1] 15092 v_0 := v.Args[0] 15093 if v_0.Op != OpMul64 { 15094 break 15095 } 15096 _ = v_0.Args[1] 15097 x := v_0.Args[0] 15098 v_0_1 := v_0.Args[1] 15099 if v_0_1.Op != OpConst64 { 15100 break 15101 } 15102 t := v_0_1.Type 15103 d := v_0_1.AuxInt 15104 v_1 := v.Args[1] 15105 if v_1.Op != OpConst64 { 15106 break 15107 } 15108 if v_1.Type != t { 15109 break 15110 } 15111 c := v_1.AuxInt 15112 v.reset(OpMul64) 15113 v0 := b.NewValue0(v.Pos, OpConst64, t) 15114 v0.AuxInt = c * d 15115 v.AddArg(v0) 15116 v.AddArg(x) 15117 return true 15118 } 15119 return false 15120 } 15121 func rewriteValuegeneric_OpMul64F_0(v *Value) bool { 15122 // match: (Mul64F (Const64F [c]) (Const64F [d])) 15123 // cond: 15124 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15125 for { 15126 _ = v.Args[1] 15127 v_0 := v.Args[0] 15128 if v_0.Op != OpConst64F { 15129 break 15130 } 15131 c := v_0.AuxInt 15132 v_1 := v.Args[1] 15133 if v_1.Op != OpConst64F { 15134 break 15135 } 15136 d := v_1.AuxInt 15137 v.reset(OpConst64F) 15138 v.AuxInt = f2i(i2f(c) * i2f(d)) 15139 return true 15140 } 15141 // match: (Mul64F (Const64F [d]) (Const64F [c])) 15142 // cond: 15143 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15144 for { 15145 _ = v.Args[1] 15146 v_0 := v.Args[0] 15147 if v_0.Op != OpConst64F { 15148 break 15149 } 15150 d := v_0.AuxInt 15151 v_1 := v.Args[1] 15152 if v_1.Op != OpConst64F { 15153 break 15154 } 15155 c := v_1.AuxInt 15156 v.reset(OpConst64F) 15157 v.AuxInt = f2i(i2f(c) * i2f(d)) 15158 return true 15159 } 15160 // match: (Mul64F x (Const64F [f2i(1)])) 15161 // cond: 15162 // result: x 15163 for { 15164 _ = v.Args[1] 15165 x := v.Args[0] 15166 v_1 := v.Args[1] 15167 if v_1.Op != OpConst64F { 15168 break 15169 } 15170 if v_1.AuxInt != f2i(1) { 15171 break 15172 } 15173 v.reset(OpCopy) 15174 v.Type = x.Type 15175 v.AddArg(x) 15176 return true 15177 } 15178 // match: (Mul64F (Const64F [f2i(1)]) x) 15179 // cond: 15180 // result: x 15181 for { 15182 _ = v.Args[1] 15183 v_0 := v.Args[0] 15184 if v_0.Op != OpConst64F { 15185 break 15186 } 15187 if v_0.AuxInt != f2i(1) { 15188 break 15189 } 15190 x := v.Args[1] 15191 v.reset(OpCopy) 15192 v.Type = x.Type 15193 v.AddArg(x) 15194 return true 15195 } 15196 // match: (Mul64F x (Const64F [f2i(-1)])) 15197 // cond: 15198 // result: (Neg64F x) 15199 for { 15200 _ = v.Args[1] 15201 x := v.Args[0] 15202 v_1 := v.Args[1] 15203 if v_1.Op != OpConst64F { 15204 break 15205 } 15206 if v_1.AuxInt != f2i(-1) { 15207 break 15208 } 15209 v.reset(OpNeg64F) 15210 v.AddArg(x) 15211 return true 15212 } 15213 // match: (Mul64F (Const64F [f2i(-1)]) x) 15214 // cond: 15215 // result: (Neg64F x) 15216 for { 15217 _ = v.Args[1] 15218 v_0 := v.Args[0] 15219 if v_0.Op != OpConst64F { 15220 break 15221 } 15222 if v_0.AuxInt != f2i(-1) { 15223 break 15224 } 15225 x := v.Args[1] 15226 v.reset(OpNeg64F) 15227 v.AddArg(x) 15228 return true 15229 } 15230 // match: (Mul64F x (Const64F [f2i(2)])) 15231 // cond: 15232 // result: (Add64F x x) 15233 for { 15234 _ = v.Args[1] 15235 x := v.Args[0] 15236 v_1 := v.Args[1] 15237 if v_1.Op != OpConst64F { 15238 break 15239 } 15240 if v_1.AuxInt != f2i(2) { 15241 break 15242 } 15243 v.reset(OpAdd64F) 15244 v.AddArg(x) 15245 v.AddArg(x) 15246 return true 15247 } 15248 // match: (Mul64F (Const64F [f2i(2)]) x) 15249 // cond: 15250 // result: (Add64F x x) 15251 for { 15252 _ = v.Args[1] 15253 v_0 := v.Args[0] 15254 if v_0.Op != OpConst64F { 15255 break 15256 } 15257 if v_0.AuxInt != f2i(2) { 15258 break 15259 } 15260 x := v.Args[1] 15261 v.reset(OpAdd64F) 15262 v.AddArg(x) 15263 v.AddArg(x) 15264 return true 15265 } 15266 return false 15267 } 15268 func rewriteValuegeneric_OpMul8_0(v *Value) bool { 15269 b := v.Block 15270 _ = b 15271 typ := &b.Func.Config.Types 15272 _ = typ 15273 // match: (Mul8 (Const8 [c]) (Const8 [d])) 15274 // cond: 15275 // result: (Const8 [int64(int8(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(OpConst8) 15289 v.AuxInt = int64(int8(c * d)) 15290 return true 15291 } 15292 // match: (Mul8 (Const8 [d]) (Const8 [c])) 15293 // cond: 15294 // result: (Const8 [int64(int8(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(OpConst8) 15308 v.AuxInt = int64(int8(c * d)) 15309 return true 15310 } 15311 // match: (Mul8 (Const8 [1]) x) 15312 // cond: 15313 // result: x 15314 for { 15315 _ = v.Args[1] 15316 v_0 := v.Args[0] 15317 if v_0.Op != OpConst8 { 15318 break 15319 } 15320 if v_0.AuxInt != 1 { 15321 break 15322 } 15323 x := v.Args[1] 15324 v.reset(OpCopy) 15325 v.Type = x.Type 15326 v.AddArg(x) 15327 return true 15328 } 15329 // match: (Mul8 x (Const8 [1])) 15330 // cond: 15331 // result: x 15332 for { 15333 _ = v.Args[1] 15334 x := v.Args[0] 15335 v_1 := v.Args[1] 15336 if v_1.Op != OpConst8 { 15337 break 15338 } 15339 if v_1.AuxInt != 1 { 15340 break 15341 } 15342 v.reset(OpCopy) 15343 v.Type = x.Type 15344 v.AddArg(x) 15345 return true 15346 } 15347 // match: (Mul8 (Const8 [-1]) x) 15348 // cond: 15349 // result: (Neg8 x) 15350 for { 15351 _ = v.Args[1] 15352 v_0 := v.Args[0] 15353 if v_0.Op != OpConst8 { 15354 break 15355 } 15356 if v_0.AuxInt != -1 { 15357 break 15358 } 15359 x := v.Args[1] 15360 v.reset(OpNeg8) 15361 v.AddArg(x) 15362 return true 15363 } 15364 // match: (Mul8 x (Const8 [-1])) 15365 // cond: 15366 // result: (Neg8 x) 15367 for { 15368 _ = v.Args[1] 15369 x := v.Args[0] 15370 v_1 := v.Args[1] 15371 if v_1.Op != OpConst8 { 15372 break 15373 } 15374 if v_1.AuxInt != -1 { 15375 break 15376 } 15377 v.reset(OpNeg8) 15378 v.AddArg(x) 15379 return true 15380 } 15381 // match: (Mul8 <t> n (Const8 [c])) 15382 // cond: isPowerOfTwo(c) 15383 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15384 for { 15385 t := v.Type 15386 _ = v.Args[1] 15387 n := v.Args[0] 15388 v_1 := v.Args[1] 15389 if v_1.Op != OpConst8 { 15390 break 15391 } 15392 c := v_1.AuxInt 15393 if !(isPowerOfTwo(c)) { 15394 break 15395 } 15396 v.reset(OpLsh8x64) 15397 v.Type = t 15398 v.AddArg(n) 15399 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15400 v0.AuxInt = log2(c) 15401 v.AddArg(v0) 15402 return true 15403 } 15404 // match: (Mul8 <t> (Const8 [c]) n) 15405 // cond: isPowerOfTwo(c) 15406 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15407 for { 15408 t := v.Type 15409 _ = v.Args[1] 15410 v_0 := v.Args[0] 15411 if v_0.Op != OpConst8 { 15412 break 15413 } 15414 c := v_0.AuxInt 15415 n := v.Args[1] 15416 if !(isPowerOfTwo(c)) { 15417 break 15418 } 15419 v.reset(OpLsh8x64) 15420 v.Type = t 15421 v.AddArg(n) 15422 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15423 v0.AuxInt = log2(c) 15424 v.AddArg(v0) 15425 return true 15426 } 15427 // match: (Mul8 <t> n (Const8 [c])) 15428 // cond: t.IsSigned() && isPowerOfTwo(-c) 15429 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15430 for { 15431 t := v.Type 15432 _ = v.Args[1] 15433 n := v.Args[0] 15434 v_1 := v.Args[1] 15435 if v_1.Op != OpConst8 { 15436 break 15437 } 15438 c := v_1.AuxInt 15439 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15440 break 15441 } 15442 v.reset(OpNeg8) 15443 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 15444 v0.AddArg(n) 15445 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15446 v1.AuxInt = log2(-c) 15447 v0.AddArg(v1) 15448 v.AddArg(v0) 15449 return true 15450 } 15451 // match: (Mul8 <t> (Const8 [c]) n) 15452 // cond: t.IsSigned() && isPowerOfTwo(-c) 15453 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15454 for { 15455 t := v.Type 15456 _ = v.Args[1] 15457 v_0 := v.Args[0] 15458 if v_0.Op != OpConst8 { 15459 break 15460 } 15461 c := v_0.AuxInt 15462 n := v.Args[1] 15463 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15464 break 15465 } 15466 v.reset(OpNeg8) 15467 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 15468 v0.AddArg(n) 15469 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15470 v1.AuxInt = log2(-c) 15471 v0.AddArg(v1) 15472 v.AddArg(v0) 15473 return true 15474 } 15475 return false 15476 } 15477 func rewriteValuegeneric_OpMul8_10(v *Value) bool { 15478 b := v.Block 15479 _ = b 15480 // match: (Mul8 (Const8 [0]) _) 15481 // cond: 15482 // result: (Const8 [0]) 15483 for { 15484 _ = v.Args[1] 15485 v_0 := v.Args[0] 15486 if v_0.Op != OpConst8 { 15487 break 15488 } 15489 if v_0.AuxInt != 0 { 15490 break 15491 } 15492 v.reset(OpConst8) 15493 v.AuxInt = 0 15494 return true 15495 } 15496 // match: (Mul8 _ (Const8 [0])) 15497 // cond: 15498 // result: (Const8 [0]) 15499 for { 15500 _ = v.Args[1] 15501 v_1 := v.Args[1] 15502 if v_1.Op != OpConst8 { 15503 break 15504 } 15505 if v_1.AuxInt != 0 { 15506 break 15507 } 15508 v.reset(OpConst8) 15509 v.AuxInt = 0 15510 return true 15511 } 15512 // match: (Mul8 (Const8 <t> [c]) (Mul8 (Const8 <t> [d]) x)) 15513 // cond: 15514 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 15515 for { 15516 _ = v.Args[1] 15517 v_0 := v.Args[0] 15518 if v_0.Op != OpConst8 { 15519 break 15520 } 15521 t := v_0.Type 15522 c := v_0.AuxInt 15523 v_1 := v.Args[1] 15524 if v_1.Op != OpMul8 { 15525 break 15526 } 15527 _ = v_1.Args[1] 15528 v_1_0 := v_1.Args[0] 15529 if v_1_0.Op != OpConst8 { 15530 break 15531 } 15532 if v_1_0.Type != t { 15533 break 15534 } 15535 d := v_1_0.AuxInt 15536 x := v_1.Args[1] 15537 v.reset(OpMul8) 15538 v0 := b.NewValue0(v.Pos, OpConst8, t) 15539 v0.AuxInt = int64(int8(c * d)) 15540 v.AddArg(v0) 15541 v.AddArg(x) 15542 return true 15543 } 15544 // match: (Mul8 (Const8 <t> [c]) (Mul8 x (Const8 <t> [d]))) 15545 // cond: 15546 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 15547 for { 15548 _ = v.Args[1] 15549 v_0 := v.Args[0] 15550 if v_0.Op != OpConst8 { 15551 break 15552 } 15553 t := v_0.Type 15554 c := v_0.AuxInt 15555 v_1 := v.Args[1] 15556 if v_1.Op != OpMul8 { 15557 break 15558 } 15559 _ = v_1.Args[1] 15560 x := v_1.Args[0] 15561 v_1_1 := v_1.Args[1] 15562 if v_1_1.Op != OpConst8 { 15563 break 15564 } 15565 if v_1_1.Type != t { 15566 break 15567 } 15568 d := v_1_1.AuxInt 15569 v.reset(OpMul8) 15570 v0 := b.NewValue0(v.Pos, OpConst8, t) 15571 v0.AuxInt = int64(int8(c * d)) 15572 v.AddArg(v0) 15573 v.AddArg(x) 15574 return true 15575 } 15576 // match: (Mul8 (Mul8 (Const8 <t> [d]) x) (Const8 <t> [c])) 15577 // cond: 15578 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 15579 for { 15580 _ = v.Args[1] 15581 v_0 := v.Args[0] 15582 if v_0.Op != OpMul8 { 15583 break 15584 } 15585 _ = v_0.Args[1] 15586 v_0_0 := v_0.Args[0] 15587 if v_0_0.Op != OpConst8 { 15588 break 15589 } 15590 t := v_0_0.Type 15591 d := v_0_0.AuxInt 15592 x := v_0.Args[1] 15593 v_1 := v.Args[1] 15594 if v_1.Op != OpConst8 { 15595 break 15596 } 15597 if v_1.Type != t { 15598 break 15599 } 15600 c := v_1.AuxInt 15601 v.reset(OpMul8) 15602 v0 := b.NewValue0(v.Pos, OpConst8, t) 15603 v0.AuxInt = int64(int8(c * d)) 15604 v.AddArg(v0) 15605 v.AddArg(x) 15606 return true 15607 } 15608 // match: (Mul8 (Mul8 x (Const8 <t> [d])) (Const8 <t> [c])) 15609 // cond: 15610 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 15611 for { 15612 _ = v.Args[1] 15613 v_0 := v.Args[0] 15614 if v_0.Op != OpMul8 { 15615 break 15616 } 15617 _ = v_0.Args[1] 15618 x := v_0.Args[0] 15619 v_0_1 := v_0.Args[1] 15620 if v_0_1.Op != OpConst8 { 15621 break 15622 } 15623 t := v_0_1.Type 15624 d := v_0_1.AuxInt 15625 v_1 := v.Args[1] 15626 if v_1.Op != OpConst8 { 15627 break 15628 } 15629 if v_1.Type != t { 15630 break 15631 } 15632 c := v_1.AuxInt 15633 v.reset(OpMul8) 15634 v0 := b.NewValue0(v.Pos, OpConst8, t) 15635 v0.AuxInt = int64(int8(c * d)) 15636 v.AddArg(v0) 15637 v.AddArg(x) 15638 return true 15639 } 15640 return false 15641 } 15642 func rewriteValuegeneric_OpNeg16_0(v *Value) bool { 15643 // match: (Neg16 (Const16 [c])) 15644 // cond: 15645 // result: (Const16 [int64(-int16(c))]) 15646 for { 15647 v_0 := v.Args[0] 15648 if v_0.Op != OpConst16 { 15649 break 15650 } 15651 c := v_0.AuxInt 15652 v.reset(OpConst16) 15653 v.AuxInt = int64(-int16(c)) 15654 return true 15655 } 15656 // match: (Neg16 (Sub16 x y)) 15657 // cond: 15658 // result: (Sub16 y x) 15659 for { 15660 v_0 := v.Args[0] 15661 if v_0.Op != OpSub16 { 15662 break 15663 } 15664 _ = v_0.Args[1] 15665 x := v_0.Args[0] 15666 y := v_0.Args[1] 15667 v.reset(OpSub16) 15668 v.AddArg(y) 15669 v.AddArg(x) 15670 return true 15671 } 15672 return false 15673 } 15674 func rewriteValuegeneric_OpNeg32_0(v *Value) bool { 15675 // match: (Neg32 (Const32 [c])) 15676 // cond: 15677 // result: (Const32 [int64(-int32(c))]) 15678 for { 15679 v_0 := v.Args[0] 15680 if v_0.Op != OpConst32 { 15681 break 15682 } 15683 c := v_0.AuxInt 15684 v.reset(OpConst32) 15685 v.AuxInt = int64(-int32(c)) 15686 return true 15687 } 15688 // match: (Neg32 (Sub32 x y)) 15689 // cond: 15690 // result: (Sub32 y x) 15691 for { 15692 v_0 := v.Args[0] 15693 if v_0.Op != OpSub32 { 15694 break 15695 } 15696 _ = v_0.Args[1] 15697 x := v_0.Args[0] 15698 y := v_0.Args[1] 15699 v.reset(OpSub32) 15700 v.AddArg(y) 15701 v.AddArg(x) 15702 return true 15703 } 15704 return false 15705 } 15706 func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { 15707 // match: (Neg32F (Const32F [c])) 15708 // cond: i2f(c) != 0 15709 // result: (Const32F [f2i(-i2f(c))]) 15710 for { 15711 v_0 := v.Args[0] 15712 if v_0.Op != OpConst32F { 15713 break 15714 } 15715 c := v_0.AuxInt 15716 if !(i2f(c) != 0) { 15717 break 15718 } 15719 v.reset(OpConst32F) 15720 v.AuxInt = f2i(-i2f(c)) 15721 return true 15722 } 15723 return false 15724 } 15725 func rewriteValuegeneric_OpNeg64_0(v *Value) bool { 15726 // match: (Neg64 (Const64 [c])) 15727 // cond: 15728 // result: (Const64 [-c]) 15729 for { 15730 v_0 := v.Args[0] 15731 if v_0.Op != OpConst64 { 15732 break 15733 } 15734 c := v_0.AuxInt 15735 v.reset(OpConst64) 15736 v.AuxInt = -c 15737 return true 15738 } 15739 // match: (Neg64 (Sub64 x y)) 15740 // cond: 15741 // result: (Sub64 y x) 15742 for { 15743 v_0 := v.Args[0] 15744 if v_0.Op != OpSub64 { 15745 break 15746 } 15747 _ = v_0.Args[1] 15748 x := v_0.Args[0] 15749 y := v_0.Args[1] 15750 v.reset(OpSub64) 15751 v.AddArg(y) 15752 v.AddArg(x) 15753 return true 15754 } 15755 return false 15756 } 15757 func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { 15758 // match: (Neg64F (Const64F [c])) 15759 // cond: i2f(c) != 0 15760 // result: (Const64F [f2i(-i2f(c))]) 15761 for { 15762 v_0 := v.Args[0] 15763 if v_0.Op != OpConst64F { 15764 break 15765 } 15766 c := v_0.AuxInt 15767 if !(i2f(c) != 0) { 15768 break 15769 } 15770 v.reset(OpConst64F) 15771 v.AuxInt = f2i(-i2f(c)) 15772 return true 15773 } 15774 return false 15775 } 15776 func rewriteValuegeneric_OpNeg8_0(v *Value) bool { 15777 // match: (Neg8 (Const8 [c])) 15778 // cond: 15779 // result: (Const8 [int64( -int8(c))]) 15780 for { 15781 v_0 := v.Args[0] 15782 if v_0.Op != OpConst8 { 15783 break 15784 } 15785 c := v_0.AuxInt 15786 v.reset(OpConst8) 15787 v.AuxInt = int64(-int8(c)) 15788 return true 15789 } 15790 // match: (Neg8 (Sub8 x y)) 15791 // cond: 15792 // result: (Sub8 y x) 15793 for { 15794 v_0 := v.Args[0] 15795 if v_0.Op != OpSub8 { 15796 break 15797 } 15798 _ = v_0.Args[1] 15799 x := v_0.Args[0] 15800 y := v_0.Args[1] 15801 v.reset(OpSub8) 15802 v.AddArg(y) 15803 v.AddArg(x) 15804 return true 15805 } 15806 return false 15807 } 15808 func rewriteValuegeneric_OpNeq16_0(v *Value) bool { 15809 b := v.Block 15810 _ = b 15811 // match: (Neq16 x x) 15812 // cond: 15813 // result: (ConstBool [0]) 15814 for { 15815 _ = v.Args[1] 15816 x := v.Args[0] 15817 if x != v.Args[1] { 15818 break 15819 } 15820 v.reset(OpConstBool) 15821 v.AuxInt = 0 15822 return true 15823 } 15824 // match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 15825 // cond: 15826 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 15827 for { 15828 _ = v.Args[1] 15829 v_0 := v.Args[0] 15830 if v_0.Op != OpConst16 { 15831 break 15832 } 15833 t := v_0.Type 15834 c := v_0.AuxInt 15835 v_1 := v.Args[1] 15836 if v_1.Op != OpAdd16 { 15837 break 15838 } 15839 _ = v_1.Args[1] 15840 v_1_0 := v_1.Args[0] 15841 if v_1_0.Op != OpConst16 { 15842 break 15843 } 15844 if v_1_0.Type != t { 15845 break 15846 } 15847 d := v_1_0.AuxInt 15848 x := v_1.Args[1] 15849 v.reset(OpNeq16) 15850 v0 := b.NewValue0(v.Pos, OpConst16, t) 15851 v0.AuxInt = int64(int16(c - d)) 15852 v.AddArg(v0) 15853 v.AddArg(x) 15854 return true 15855 } 15856 // match: (Neq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 15857 // cond: 15858 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 15859 for { 15860 _ = v.Args[1] 15861 v_0 := v.Args[0] 15862 if v_0.Op != OpConst16 { 15863 break 15864 } 15865 t := v_0.Type 15866 c := v_0.AuxInt 15867 v_1 := v.Args[1] 15868 if v_1.Op != OpAdd16 { 15869 break 15870 } 15871 _ = v_1.Args[1] 15872 x := v_1.Args[0] 15873 v_1_1 := v_1.Args[1] 15874 if v_1_1.Op != OpConst16 { 15875 break 15876 } 15877 if v_1_1.Type != t { 15878 break 15879 } 15880 d := v_1_1.AuxInt 15881 v.reset(OpNeq16) 15882 v0 := b.NewValue0(v.Pos, OpConst16, t) 15883 v0.AuxInt = int64(int16(c - d)) 15884 v.AddArg(v0) 15885 v.AddArg(x) 15886 return true 15887 } 15888 // match: (Neq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 15889 // cond: 15890 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 15891 for { 15892 _ = v.Args[1] 15893 v_0 := v.Args[0] 15894 if v_0.Op != OpAdd16 { 15895 break 15896 } 15897 _ = v_0.Args[1] 15898 v_0_0 := v_0.Args[0] 15899 if v_0_0.Op != OpConst16 { 15900 break 15901 } 15902 t := v_0_0.Type 15903 d := v_0_0.AuxInt 15904 x := v_0.Args[1] 15905 v_1 := v.Args[1] 15906 if v_1.Op != OpConst16 { 15907 break 15908 } 15909 if v_1.Type != t { 15910 break 15911 } 15912 c := v_1.AuxInt 15913 v.reset(OpNeq16) 15914 v0 := b.NewValue0(v.Pos, OpConst16, t) 15915 v0.AuxInt = int64(int16(c - d)) 15916 v.AddArg(v0) 15917 v.AddArg(x) 15918 return true 15919 } 15920 // match: (Neq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 15921 // cond: 15922 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 15923 for { 15924 _ = v.Args[1] 15925 v_0 := v.Args[0] 15926 if v_0.Op != OpAdd16 { 15927 break 15928 } 15929 _ = v_0.Args[1] 15930 x := v_0.Args[0] 15931 v_0_1 := v_0.Args[1] 15932 if v_0_1.Op != OpConst16 { 15933 break 15934 } 15935 t := v_0_1.Type 15936 d := v_0_1.AuxInt 15937 v_1 := v.Args[1] 15938 if v_1.Op != OpConst16 { 15939 break 15940 } 15941 if v_1.Type != t { 15942 break 15943 } 15944 c := v_1.AuxInt 15945 v.reset(OpNeq16) 15946 v0 := b.NewValue0(v.Pos, OpConst16, t) 15947 v0.AuxInt = int64(int16(c - d)) 15948 v.AddArg(v0) 15949 v.AddArg(x) 15950 return true 15951 } 15952 // match: (Neq16 (Const16 [c]) (Const16 [d])) 15953 // cond: 15954 // result: (ConstBool [b2i(c != d)]) 15955 for { 15956 _ = v.Args[1] 15957 v_0 := v.Args[0] 15958 if v_0.Op != OpConst16 { 15959 break 15960 } 15961 c := v_0.AuxInt 15962 v_1 := v.Args[1] 15963 if v_1.Op != OpConst16 { 15964 break 15965 } 15966 d := v_1.AuxInt 15967 v.reset(OpConstBool) 15968 v.AuxInt = b2i(c != d) 15969 return true 15970 } 15971 // match: (Neq16 (Const16 [d]) (Const16 [c])) 15972 // cond: 15973 // result: (ConstBool [b2i(c != d)]) 15974 for { 15975 _ = v.Args[1] 15976 v_0 := v.Args[0] 15977 if v_0.Op != OpConst16 { 15978 break 15979 } 15980 d := v_0.AuxInt 15981 v_1 := v.Args[1] 15982 if v_1.Op != OpConst16 { 15983 break 15984 } 15985 c := v_1.AuxInt 15986 v.reset(OpConstBool) 15987 v.AuxInt = b2i(c != d) 15988 return true 15989 } 15990 return false 15991 } 15992 func rewriteValuegeneric_OpNeq32_0(v *Value) bool { 15993 b := v.Block 15994 _ = b 15995 // match: (Neq32 x x) 15996 // cond: 15997 // result: (ConstBool [0]) 15998 for { 15999 _ = v.Args[1] 16000 x := v.Args[0] 16001 if x != v.Args[1] { 16002 break 16003 } 16004 v.reset(OpConstBool) 16005 v.AuxInt = 0 16006 return true 16007 } 16008 // match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 16009 // cond: 16010 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16011 for { 16012 _ = v.Args[1] 16013 v_0 := v.Args[0] 16014 if v_0.Op != OpConst32 { 16015 break 16016 } 16017 t := v_0.Type 16018 c := v_0.AuxInt 16019 v_1 := v.Args[1] 16020 if v_1.Op != OpAdd32 { 16021 break 16022 } 16023 _ = v_1.Args[1] 16024 v_1_0 := v_1.Args[0] 16025 if v_1_0.Op != OpConst32 { 16026 break 16027 } 16028 if v_1_0.Type != t { 16029 break 16030 } 16031 d := v_1_0.AuxInt 16032 x := v_1.Args[1] 16033 v.reset(OpNeq32) 16034 v0 := b.NewValue0(v.Pos, OpConst32, t) 16035 v0.AuxInt = int64(int32(c - d)) 16036 v.AddArg(v0) 16037 v.AddArg(x) 16038 return true 16039 } 16040 // match: (Neq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 16041 // cond: 16042 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16043 for { 16044 _ = v.Args[1] 16045 v_0 := v.Args[0] 16046 if v_0.Op != OpConst32 { 16047 break 16048 } 16049 t := v_0.Type 16050 c := v_0.AuxInt 16051 v_1 := v.Args[1] 16052 if v_1.Op != OpAdd32 { 16053 break 16054 } 16055 _ = v_1.Args[1] 16056 x := v_1.Args[0] 16057 v_1_1 := v_1.Args[1] 16058 if v_1_1.Op != OpConst32 { 16059 break 16060 } 16061 if v_1_1.Type != t { 16062 break 16063 } 16064 d := v_1_1.AuxInt 16065 v.reset(OpNeq32) 16066 v0 := b.NewValue0(v.Pos, OpConst32, t) 16067 v0.AuxInt = int64(int32(c - d)) 16068 v.AddArg(v0) 16069 v.AddArg(x) 16070 return true 16071 } 16072 // match: (Neq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 16073 // cond: 16074 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16075 for { 16076 _ = v.Args[1] 16077 v_0 := v.Args[0] 16078 if v_0.Op != OpAdd32 { 16079 break 16080 } 16081 _ = v_0.Args[1] 16082 v_0_0 := v_0.Args[0] 16083 if v_0_0.Op != OpConst32 { 16084 break 16085 } 16086 t := v_0_0.Type 16087 d := v_0_0.AuxInt 16088 x := v_0.Args[1] 16089 v_1 := v.Args[1] 16090 if v_1.Op != OpConst32 { 16091 break 16092 } 16093 if v_1.Type != t { 16094 break 16095 } 16096 c := v_1.AuxInt 16097 v.reset(OpNeq32) 16098 v0 := b.NewValue0(v.Pos, OpConst32, t) 16099 v0.AuxInt = int64(int32(c - d)) 16100 v.AddArg(v0) 16101 v.AddArg(x) 16102 return true 16103 } 16104 // match: (Neq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 16105 // cond: 16106 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16107 for { 16108 _ = v.Args[1] 16109 v_0 := v.Args[0] 16110 if v_0.Op != OpAdd32 { 16111 break 16112 } 16113 _ = v_0.Args[1] 16114 x := v_0.Args[0] 16115 v_0_1 := v_0.Args[1] 16116 if v_0_1.Op != OpConst32 { 16117 break 16118 } 16119 t := v_0_1.Type 16120 d := v_0_1.AuxInt 16121 v_1 := v.Args[1] 16122 if v_1.Op != OpConst32 { 16123 break 16124 } 16125 if v_1.Type != t { 16126 break 16127 } 16128 c := v_1.AuxInt 16129 v.reset(OpNeq32) 16130 v0 := b.NewValue0(v.Pos, OpConst32, t) 16131 v0.AuxInt = int64(int32(c - d)) 16132 v.AddArg(v0) 16133 v.AddArg(x) 16134 return true 16135 } 16136 // match: (Neq32 (Const32 [c]) (Const32 [d])) 16137 // cond: 16138 // result: (ConstBool [b2i(c != d)]) 16139 for { 16140 _ = v.Args[1] 16141 v_0 := v.Args[0] 16142 if v_0.Op != OpConst32 { 16143 break 16144 } 16145 c := v_0.AuxInt 16146 v_1 := v.Args[1] 16147 if v_1.Op != OpConst32 { 16148 break 16149 } 16150 d := v_1.AuxInt 16151 v.reset(OpConstBool) 16152 v.AuxInt = b2i(c != d) 16153 return true 16154 } 16155 // match: (Neq32 (Const32 [d]) (Const32 [c])) 16156 // cond: 16157 // result: (ConstBool [b2i(c != d)]) 16158 for { 16159 _ = v.Args[1] 16160 v_0 := v.Args[0] 16161 if v_0.Op != OpConst32 { 16162 break 16163 } 16164 d := v_0.AuxInt 16165 v_1 := v.Args[1] 16166 if v_1.Op != OpConst32 { 16167 break 16168 } 16169 c := v_1.AuxInt 16170 v.reset(OpConstBool) 16171 v.AuxInt = b2i(c != d) 16172 return true 16173 } 16174 return false 16175 } 16176 func rewriteValuegeneric_OpNeq64_0(v *Value) bool { 16177 b := v.Block 16178 _ = b 16179 // match: (Neq64 x x) 16180 // cond: 16181 // result: (ConstBool [0]) 16182 for { 16183 _ = v.Args[1] 16184 x := v.Args[0] 16185 if x != v.Args[1] { 16186 break 16187 } 16188 v.reset(OpConstBool) 16189 v.AuxInt = 0 16190 return true 16191 } 16192 // match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 16193 // cond: 16194 // result: (Neq64 (Const64 <t> [c-d]) x) 16195 for { 16196 _ = v.Args[1] 16197 v_0 := v.Args[0] 16198 if v_0.Op != OpConst64 { 16199 break 16200 } 16201 t := v_0.Type 16202 c := v_0.AuxInt 16203 v_1 := v.Args[1] 16204 if v_1.Op != OpAdd64 { 16205 break 16206 } 16207 _ = v_1.Args[1] 16208 v_1_0 := v_1.Args[0] 16209 if v_1_0.Op != OpConst64 { 16210 break 16211 } 16212 if v_1_0.Type != t { 16213 break 16214 } 16215 d := v_1_0.AuxInt 16216 x := v_1.Args[1] 16217 v.reset(OpNeq64) 16218 v0 := b.NewValue0(v.Pos, OpConst64, t) 16219 v0.AuxInt = c - d 16220 v.AddArg(v0) 16221 v.AddArg(x) 16222 return true 16223 } 16224 // match: (Neq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 16225 // cond: 16226 // result: (Neq64 (Const64 <t> [c-d]) x) 16227 for { 16228 _ = v.Args[1] 16229 v_0 := v.Args[0] 16230 if v_0.Op != OpConst64 { 16231 break 16232 } 16233 t := v_0.Type 16234 c := v_0.AuxInt 16235 v_1 := v.Args[1] 16236 if v_1.Op != OpAdd64 { 16237 break 16238 } 16239 _ = v_1.Args[1] 16240 x := v_1.Args[0] 16241 v_1_1 := v_1.Args[1] 16242 if v_1_1.Op != OpConst64 { 16243 break 16244 } 16245 if v_1_1.Type != t { 16246 break 16247 } 16248 d := v_1_1.AuxInt 16249 v.reset(OpNeq64) 16250 v0 := b.NewValue0(v.Pos, OpConst64, t) 16251 v0.AuxInt = c - d 16252 v.AddArg(v0) 16253 v.AddArg(x) 16254 return true 16255 } 16256 // match: (Neq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 16257 // cond: 16258 // result: (Neq64 (Const64 <t> [c-d]) x) 16259 for { 16260 _ = v.Args[1] 16261 v_0 := v.Args[0] 16262 if v_0.Op != OpAdd64 { 16263 break 16264 } 16265 _ = v_0.Args[1] 16266 v_0_0 := v_0.Args[0] 16267 if v_0_0.Op != OpConst64 { 16268 break 16269 } 16270 t := v_0_0.Type 16271 d := v_0_0.AuxInt 16272 x := v_0.Args[1] 16273 v_1 := v.Args[1] 16274 if v_1.Op != OpConst64 { 16275 break 16276 } 16277 if v_1.Type != t { 16278 break 16279 } 16280 c := v_1.AuxInt 16281 v.reset(OpNeq64) 16282 v0 := b.NewValue0(v.Pos, OpConst64, t) 16283 v0.AuxInt = c - d 16284 v.AddArg(v0) 16285 v.AddArg(x) 16286 return true 16287 } 16288 // match: (Neq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 16289 // cond: 16290 // result: (Neq64 (Const64 <t> [c-d]) x) 16291 for { 16292 _ = v.Args[1] 16293 v_0 := v.Args[0] 16294 if v_0.Op != OpAdd64 { 16295 break 16296 } 16297 _ = v_0.Args[1] 16298 x := v_0.Args[0] 16299 v_0_1 := v_0.Args[1] 16300 if v_0_1.Op != OpConst64 { 16301 break 16302 } 16303 t := v_0_1.Type 16304 d := v_0_1.AuxInt 16305 v_1 := v.Args[1] 16306 if v_1.Op != OpConst64 { 16307 break 16308 } 16309 if v_1.Type != t { 16310 break 16311 } 16312 c := v_1.AuxInt 16313 v.reset(OpNeq64) 16314 v0 := b.NewValue0(v.Pos, OpConst64, t) 16315 v0.AuxInt = c - d 16316 v.AddArg(v0) 16317 v.AddArg(x) 16318 return true 16319 } 16320 // match: (Neq64 (Const64 [c]) (Const64 [d])) 16321 // cond: 16322 // result: (ConstBool [b2i(c != d)]) 16323 for { 16324 _ = v.Args[1] 16325 v_0 := v.Args[0] 16326 if v_0.Op != OpConst64 { 16327 break 16328 } 16329 c := v_0.AuxInt 16330 v_1 := v.Args[1] 16331 if v_1.Op != OpConst64 { 16332 break 16333 } 16334 d := v_1.AuxInt 16335 v.reset(OpConstBool) 16336 v.AuxInt = b2i(c != d) 16337 return true 16338 } 16339 // match: (Neq64 (Const64 [d]) (Const64 [c])) 16340 // cond: 16341 // result: (ConstBool [b2i(c != d)]) 16342 for { 16343 _ = v.Args[1] 16344 v_0 := v.Args[0] 16345 if v_0.Op != OpConst64 { 16346 break 16347 } 16348 d := v_0.AuxInt 16349 v_1 := v.Args[1] 16350 if v_1.Op != OpConst64 { 16351 break 16352 } 16353 c := v_1.AuxInt 16354 v.reset(OpConstBool) 16355 v.AuxInt = b2i(c != d) 16356 return true 16357 } 16358 return false 16359 } 16360 func rewriteValuegeneric_OpNeq8_0(v *Value) bool { 16361 b := v.Block 16362 _ = b 16363 // match: (Neq8 x x) 16364 // cond: 16365 // result: (ConstBool [0]) 16366 for { 16367 _ = v.Args[1] 16368 x := v.Args[0] 16369 if x != v.Args[1] { 16370 break 16371 } 16372 v.reset(OpConstBool) 16373 v.AuxInt = 0 16374 return true 16375 } 16376 // match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 16377 // cond: 16378 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 16379 for { 16380 _ = v.Args[1] 16381 v_0 := v.Args[0] 16382 if v_0.Op != OpConst8 { 16383 break 16384 } 16385 t := v_0.Type 16386 c := v_0.AuxInt 16387 v_1 := v.Args[1] 16388 if v_1.Op != OpAdd8 { 16389 break 16390 } 16391 _ = v_1.Args[1] 16392 v_1_0 := v_1.Args[0] 16393 if v_1_0.Op != OpConst8 { 16394 break 16395 } 16396 if v_1_0.Type != t { 16397 break 16398 } 16399 d := v_1_0.AuxInt 16400 x := v_1.Args[1] 16401 v.reset(OpNeq8) 16402 v0 := b.NewValue0(v.Pos, OpConst8, t) 16403 v0.AuxInt = int64(int8(c - d)) 16404 v.AddArg(v0) 16405 v.AddArg(x) 16406 return true 16407 } 16408 // match: (Neq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 16409 // cond: 16410 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 16411 for { 16412 _ = v.Args[1] 16413 v_0 := v.Args[0] 16414 if v_0.Op != OpConst8 { 16415 break 16416 } 16417 t := v_0.Type 16418 c := v_0.AuxInt 16419 v_1 := v.Args[1] 16420 if v_1.Op != OpAdd8 { 16421 break 16422 } 16423 _ = v_1.Args[1] 16424 x := v_1.Args[0] 16425 v_1_1 := v_1.Args[1] 16426 if v_1_1.Op != OpConst8 { 16427 break 16428 } 16429 if v_1_1.Type != t { 16430 break 16431 } 16432 d := v_1_1.AuxInt 16433 v.reset(OpNeq8) 16434 v0 := b.NewValue0(v.Pos, OpConst8, t) 16435 v0.AuxInt = int64(int8(c - d)) 16436 v.AddArg(v0) 16437 v.AddArg(x) 16438 return true 16439 } 16440 // match: (Neq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 16441 // cond: 16442 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 16443 for { 16444 _ = v.Args[1] 16445 v_0 := v.Args[0] 16446 if v_0.Op != OpAdd8 { 16447 break 16448 } 16449 _ = v_0.Args[1] 16450 v_0_0 := v_0.Args[0] 16451 if v_0_0.Op != OpConst8 { 16452 break 16453 } 16454 t := v_0_0.Type 16455 d := v_0_0.AuxInt 16456 x := v_0.Args[1] 16457 v_1 := v.Args[1] 16458 if v_1.Op != OpConst8 { 16459 break 16460 } 16461 if v_1.Type != t { 16462 break 16463 } 16464 c := v_1.AuxInt 16465 v.reset(OpNeq8) 16466 v0 := b.NewValue0(v.Pos, OpConst8, t) 16467 v0.AuxInt = int64(int8(c - d)) 16468 v.AddArg(v0) 16469 v.AddArg(x) 16470 return true 16471 } 16472 // match: (Neq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 16473 // cond: 16474 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 16475 for { 16476 _ = v.Args[1] 16477 v_0 := v.Args[0] 16478 if v_0.Op != OpAdd8 { 16479 break 16480 } 16481 _ = v_0.Args[1] 16482 x := v_0.Args[0] 16483 v_0_1 := v_0.Args[1] 16484 if v_0_1.Op != OpConst8 { 16485 break 16486 } 16487 t := v_0_1.Type 16488 d := v_0_1.AuxInt 16489 v_1 := v.Args[1] 16490 if v_1.Op != OpConst8 { 16491 break 16492 } 16493 if v_1.Type != t { 16494 break 16495 } 16496 c := v_1.AuxInt 16497 v.reset(OpNeq8) 16498 v0 := b.NewValue0(v.Pos, OpConst8, t) 16499 v0.AuxInt = int64(int8(c - d)) 16500 v.AddArg(v0) 16501 v.AddArg(x) 16502 return true 16503 } 16504 // match: (Neq8 (Const8 [c]) (Const8 [d])) 16505 // cond: 16506 // result: (ConstBool [b2i(c != d)]) 16507 for { 16508 _ = v.Args[1] 16509 v_0 := v.Args[0] 16510 if v_0.Op != OpConst8 { 16511 break 16512 } 16513 c := v_0.AuxInt 16514 v_1 := v.Args[1] 16515 if v_1.Op != OpConst8 { 16516 break 16517 } 16518 d := v_1.AuxInt 16519 v.reset(OpConstBool) 16520 v.AuxInt = b2i(c != d) 16521 return true 16522 } 16523 // match: (Neq8 (Const8 [d]) (Const8 [c])) 16524 // cond: 16525 // result: (ConstBool [b2i(c != d)]) 16526 for { 16527 _ = v.Args[1] 16528 v_0 := v.Args[0] 16529 if v_0.Op != OpConst8 { 16530 break 16531 } 16532 d := v_0.AuxInt 16533 v_1 := v.Args[1] 16534 if v_1.Op != OpConst8 { 16535 break 16536 } 16537 c := v_1.AuxInt 16538 v.reset(OpConstBool) 16539 v.AuxInt = b2i(c != d) 16540 return true 16541 } 16542 return false 16543 } 16544 func rewriteValuegeneric_OpNeqB_0(v *Value) bool { 16545 // match: (NeqB (ConstBool [c]) (ConstBool [d])) 16546 // cond: 16547 // result: (ConstBool [b2i(c != d)]) 16548 for { 16549 _ = v.Args[1] 16550 v_0 := v.Args[0] 16551 if v_0.Op != OpConstBool { 16552 break 16553 } 16554 c := v_0.AuxInt 16555 v_1 := v.Args[1] 16556 if v_1.Op != OpConstBool { 16557 break 16558 } 16559 d := v_1.AuxInt 16560 v.reset(OpConstBool) 16561 v.AuxInt = b2i(c != d) 16562 return true 16563 } 16564 // match: (NeqB (ConstBool [d]) (ConstBool [c])) 16565 // cond: 16566 // result: (ConstBool [b2i(c != d)]) 16567 for { 16568 _ = v.Args[1] 16569 v_0 := v.Args[0] 16570 if v_0.Op != OpConstBool { 16571 break 16572 } 16573 d := v_0.AuxInt 16574 v_1 := v.Args[1] 16575 if v_1.Op != OpConstBool { 16576 break 16577 } 16578 c := v_1.AuxInt 16579 v.reset(OpConstBool) 16580 v.AuxInt = b2i(c != d) 16581 return true 16582 } 16583 // match: (NeqB (ConstBool [0]) x) 16584 // cond: 16585 // result: x 16586 for { 16587 _ = v.Args[1] 16588 v_0 := v.Args[0] 16589 if v_0.Op != OpConstBool { 16590 break 16591 } 16592 if v_0.AuxInt != 0 { 16593 break 16594 } 16595 x := v.Args[1] 16596 v.reset(OpCopy) 16597 v.Type = x.Type 16598 v.AddArg(x) 16599 return true 16600 } 16601 // match: (NeqB x (ConstBool [0])) 16602 // cond: 16603 // result: x 16604 for { 16605 _ = v.Args[1] 16606 x := v.Args[0] 16607 v_1 := v.Args[1] 16608 if v_1.Op != OpConstBool { 16609 break 16610 } 16611 if v_1.AuxInt != 0 { 16612 break 16613 } 16614 v.reset(OpCopy) 16615 v.Type = x.Type 16616 v.AddArg(x) 16617 return true 16618 } 16619 // match: (NeqB (ConstBool [1]) x) 16620 // cond: 16621 // result: (Not x) 16622 for { 16623 _ = v.Args[1] 16624 v_0 := v.Args[0] 16625 if v_0.Op != OpConstBool { 16626 break 16627 } 16628 if v_0.AuxInt != 1 { 16629 break 16630 } 16631 x := v.Args[1] 16632 v.reset(OpNot) 16633 v.AddArg(x) 16634 return true 16635 } 16636 // match: (NeqB x (ConstBool [1])) 16637 // cond: 16638 // result: (Not x) 16639 for { 16640 _ = v.Args[1] 16641 x := v.Args[0] 16642 v_1 := v.Args[1] 16643 if v_1.Op != OpConstBool { 16644 break 16645 } 16646 if v_1.AuxInt != 1 { 16647 break 16648 } 16649 v.reset(OpNot) 16650 v.AddArg(x) 16651 return true 16652 } 16653 // match: (NeqB (Not x) (Not y)) 16654 // cond: 16655 // result: (NeqB x y) 16656 for { 16657 _ = v.Args[1] 16658 v_0 := v.Args[0] 16659 if v_0.Op != OpNot { 16660 break 16661 } 16662 x := v_0.Args[0] 16663 v_1 := v.Args[1] 16664 if v_1.Op != OpNot { 16665 break 16666 } 16667 y := v_1.Args[0] 16668 v.reset(OpNeqB) 16669 v.AddArg(x) 16670 v.AddArg(y) 16671 return true 16672 } 16673 // match: (NeqB (Not y) (Not x)) 16674 // cond: 16675 // result: (NeqB x y) 16676 for { 16677 _ = v.Args[1] 16678 v_0 := v.Args[0] 16679 if v_0.Op != OpNot { 16680 break 16681 } 16682 y := v_0.Args[0] 16683 v_1 := v.Args[1] 16684 if v_1.Op != OpNot { 16685 break 16686 } 16687 x := v_1.Args[0] 16688 v.reset(OpNeqB) 16689 v.AddArg(x) 16690 v.AddArg(y) 16691 return true 16692 } 16693 return false 16694 } 16695 func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { 16696 b := v.Block 16697 _ = b 16698 typ := &b.Func.Config.Types 16699 _ = typ 16700 // match: (NeqInter x y) 16701 // cond: 16702 // result: (NeqPtr (ITab x) (ITab y)) 16703 for { 16704 _ = v.Args[1] 16705 x := v.Args[0] 16706 y := v.Args[1] 16707 v.reset(OpNeqPtr) 16708 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 16709 v0.AddArg(x) 16710 v.AddArg(v0) 16711 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 16712 v1.AddArg(y) 16713 v.AddArg(v1) 16714 return true 16715 } 16716 } 16717 func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { 16718 // match: (NeqPtr p (ConstNil)) 16719 // cond: 16720 // result: (IsNonNil p) 16721 for { 16722 _ = v.Args[1] 16723 p := v.Args[0] 16724 v_1 := v.Args[1] 16725 if v_1.Op != OpConstNil { 16726 break 16727 } 16728 v.reset(OpIsNonNil) 16729 v.AddArg(p) 16730 return true 16731 } 16732 // match: (NeqPtr (ConstNil) p) 16733 // cond: 16734 // result: (IsNonNil p) 16735 for { 16736 _ = v.Args[1] 16737 v_0 := v.Args[0] 16738 if v_0.Op != OpConstNil { 16739 break 16740 } 16741 p := v.Args[1] 16742 v.reset(OpIsNonNil) 16743 v.AddArg(p) 16744 return true 16745 } 16746 return false 16747 } 16748 func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { 16749 b := v.Block 16750 _ = b 16751 typ := &b.Func.Config.Types 16752 _ = typ 16753 // match: (NeqSlice x y) 16754 // cond: 16755 // result: (NeqPtr (SlicePtr x) (SlicePtr y)) 16756 for { 16757 _ = v.Args[1] 16758 x := v.Args[0] 16759 y := v.Args[1] 16760 v.reset(OpNeqPtr) 16761 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 16762 v0.AddArg(x) 16763 v.AddArg(v0) 16764 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 16765 v1.AddArg(y) 16766 v.AddArg(v1) 16767 return true 16768 } 16769 } 16770 func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { 16771 b := v.Block 16772 _ = b 16773 config := b.Func.Config 16774 _ = config 16775 fe := b.Func.fe 16776 _ = fe 16777 // match: (NilCheck (GetG mem) mem) 16778 // cond: 16779 // result: mem 16780 for { 16781 _ = v.Args[1] 16782 v_0 := v.Args[0] 16783 if v_0.Op != OpGetG { 16784 break 16785 } 16786 mem := v_0.Args[0] 16787 if mem != v.Args[1] { 16788 break 16789 } 16790 v.reset(OpCopy) 16791 v.Type = mem.Type 16792 v.AddArg(mem) 16793 return true 16794 } 16795 // match: (NilCheck (Load (OffPtr [c] (SP)) mem) mem) 16796 // 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") 16797 // result: (Invalid) 16798 for { 16799 _ = v.Args[1] 16800 v_0 := v.Args[0] 16801 if v_0.Op != OpLoad { 16802 break 16803 } 16804 _ = v_0.Args[1] 16805 v_0_0 := v_0.Args[0] 16806 if v_0_0.Op != OpOffPtr { 16807 break 16808 } 16809 c := v_0_0.AuxInt 16810 v_0_0_0 := v_0_0.Args[0] 16811 if v_0_0_0.Op != OpSP { 16812 break 16813 } 16814 mem := v_0.Args[1] 16815 if mem != v.Args[1] { 16816 break 16817 } 16818 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")) { 16819 break 16820 } 16821 v.reset(OpInvalid) 16822 return true 16823 } 16824 // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) mem)) mem) 16825 // 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") 16826 // result: (Invalid) 16827 for { 16828 _ = v.Args[1] 16829 v_0 := v.Args[0] 16830 if v_0.Op != OpOffPtr { 16831 break 16832 } 16833 v_0_0 := v_0.Args[0] 16834 if v_0_0.Op != OpLoad { 16835 break 16836 } 16837 _ = v_0_0.Args[1] 16838 v_0_0_0 := v_0_0.Args[0] 16839 if v_0_0_0.Op != OpOffPtr { 16840 break 16841 } 16842 c := v_0_0_0.AuxInt 16843 v_0_0_0_0 := v_0_0_0.Args[0] 16844 if v_0_0_0_0.Op != OpSP { 16845 break 16846 } 16847 mem := v_0_0.Args[1] 16848 if mem != v.Args[1] { 16849 break 16850 } 16851 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")) { 16852 break 16853 } 16854 v.reset(OpInvalid) 16855 return true 16856 } 16857 return false 16858 } 16859 func rewriteValuegeneric_OpNot_0(v *Value) bool { 16860 // match: (Not (Eq64 x y)) 16861 // cond: 16862 // result: (Neq64 x y) 16863 for { 16864 v_0 := v.Args[0] 16865 if v_0.Op != OpEq64 { 16866 break 16867 } 16868 _ = v_0.Args[1] 16869 x := v_0.Args[0] 16870 y := v_0.Args[1] 16871 v.reset(OpNeq64) 16872 v.AddArg(x) 16873 v.AddArg(y) 16874 return true 16875 } 16876 // match: (Not (Eq32 x y)) 16877 // cond: 16878 // result: (Neq32 x y) 16879 for { 16880 v_0 := v.Args[0] 16881 if v_0.Op != OpEq32 { 16882 break 16883 } 16884 _ = v_0.Args[1] 16885 x := v_0.Args[0] 16886 y := v_0.Args[1] 16887 v.reset(OpNeq32) 16888 v.AddArg(x) 16889 v.AddArg(y) 16890 return true 16891 } 16892 // match: (Not (Eq16 x y)) 16893 // cond: 16894 // result: (Neq16 x y) 16895 for { 16896 v_0 := v.Args[0] 16897 if v_0.Op != OpEq16 { 16898 break 16899 } 16900 _ = v_0.Args[1] 16901 x := v_0.Args[0] 16902 y := v_0.Args[1] 16903 v.reset(OpNeq16) 16904 v.AddArg(x) 16905 v.AddArg(y) 16906 return true 16907 } 16908 // match: (Not (Eq8 x y)) 16909 // cond: 16910 // result: (Neq8 x y) 16911 for { 16912 v_0 := v.Args[0] 16913 if v_0.Op != OpEq8 { 16914 break 16915 } 16916 _ = v_0.Args[1] 16917 x := v_0.Args[0] 16918 y := v_0.Args[1] 16919 v.reset(OpNeq8) 16920 v.AddArg(x) 16921 v.AddArg(y) 16922 return true 16923 } 16924 // match: (Not (EqB x y)) 16925 // cond: 16926 // result: (NeqB x y) 16927 for { 16928 v_0 := v.Args[0] 16929 if v_0.Op != OpEqB { 16930 break 16931 } 16932 _ = v_0.Args[1] 16933 x := v_0.Args[0] 16934 y := v_0.Args[1] 16935 v.reset(OpNeqB) 16936 v.AddArg(x) 16937 v.AddArg(y) 16938 return true 16939 } 16940 // match: (Not (Neq64 x y)) 16941 // cond: 16942 // result: (Eq64 x y) 16943 for { 16944 v_0 := v.Args[0] 16945 if v_0.Op != OpNeq64 { 16946 break 16947 } 16948 _ = v_0.Args[1] 16949 x := v_0.Args[0] 16950 y := v_0.Args[1] 16951 v.reset(OpEq64) 16952 v.AddArg(x) 16953 v.AddArg(y) 16954 return true 16955 } 16956 // match: (Not (Neq32 x y)) 16957 // cond: 16958 // result: (Eq32 x y) 16959 for { 16960 v_0 := v.Args[0] 16961 if v_0.Op != OpNeq32 { 16962 break 16963 } 16964 _ = v_0.Args[1] 16965 x := v_0.Args[0] 16966 y := v_0.Args[1] 16967 v.reset(OpEq32) 16968 v.AddArg(x) 16969 v.AddArg(y) 16970 return true 16971 } 16972 // match: (Not (Neq16 x y)) 16973 // cond: 16974 // result: (Eq16 x y) 16975 for { 16976 v_0 := v.Args[0] 16977 if v_0.Op != OpNeq16 { 16978 break 16979 } 16980 _ = v_0.Args[1] 16981 x := v_0.Args[0] 16982 y := v_0.Args[1] 16983 v.reset(OpEq16) 16984 v.AddArg(x) 16985 v.AddArg(y) 16986 return true 16987 } 16988 // match: (Not (Neq8 x y)) 16989 // cond: 16990 // result: (Eq8 x y) 16991 for { 16992 v_0 := v.Args[0] 16993 if v_0.Op != OpNeq8 { 16994 break 16995 } 16996 _ = v_0.Args[1] 16997 x := v_0.Args[0] 16998 y := v_0.Args[1] 16999 v.reset(OpEq8) 17000 v.AddArg(x) 17001 v.AddArg(y) 17002 return true 17003 } 17004 // match: (Not (NeqB x y)) 17005 // cond: 17006 // result: (EqB x y) 17007 for { 17008 v_0 := v.Args[0] 17009 if v_0.Op != OpNeqB { 17010 break 17011 } 17012 _ = v_0.Args[1] 17013 x := v_0.Args[0] 17014 y := v_0.Args[1] 17015 v.reset(OpEqB) 17016 v.AddArg(x) 17017 v.AddArg(y) 17018 return true 17019 } 17020 return false 17021 } 17022 func rewriteValuegeneric_OpNot_10(v *Value) bool { 17023 // match: (Not (Greater64 x y)) 17024 // cond: 17025 // result: (Leq64 x y) 17026 for { 17027 v_0 := v.Args[0] 17028 if v_0.Op != OpGreater64 { 17029 break 17030 } 17031 _ = v_0.Args[1] 17032 x := v_0.Args[0] 17033 y := v_0.Args[1] 17034 v.reset(OpLeq64) 17035 v.AddArg(x) 17036 v.AddArg(y) 17037 return true 17038 } 17039 // match: (Not (Greater32 x y)) 17040 // cond: 17041 // result: (Leq32 x y) 17042 for { 17043 v_0 := v.Args[0] 17044 if v_0.Op != OpGreater32 { 17045 break 17046 } 17047 _ = v_0.Args[1] 17048 x := v_0.Args[0] 17049 y := v_0.Args[1] 17050 v.reset(OpLeq32) 17051 v.AddArg(x) 17052 v.AddArg(y) 17053 return true 17054 } 17055 // match: (Not (Greater16 x y)) 17056 // cond: 17057 // result: (Leq16 x y) 17058 for { 17059 v_0 := v.Args[0] 17060 if v_0.Op != OpGreater16 { 17061 break 17062 } 17063 _ = v_0.Args[1] 17064 x := v_0.Args[0] 17065 y := v_0.Args[1] 17066 v.reset(OpLeq16) 17067 v.AddArg(x) 17068 v.AddArg(y) 17069 return true 17070 } 17071 // match: (Not (Greater8 x y)) 17072 // cond: 17073 // result: (Leq8 x y) 17074 for { 17075 v_0 := v.Args[0] 17076 if v_0.Op != OpGreater8 { 17077 break 17078 } 17079 _ = v_0.Args[1] 17080 x := v_0.Args[0] 17081 y := v_0.Args[1] 17082 v.reset(OpLeq8) 17083 v.AddArg(x) 17084 v.AddArg(y) 17085 return true 17086 } 17087 // match: (Not (Greater64U x y)) 17088 // cond: 17089 // result: (Leq64U x y) 17090 for { 17091 v_0 := v.Args[0] 17092 if v_0.Op != OpGreater64U { 17093 break 17094 } 17095 _ = v_0.Args[1] 17096 x := v_0.Args[0] 17097 y := v_0.Args[1] 17098 v.reset(OpLeq64U) 17099 v.AddArg(x) 17100 v.AddArg(y) 17101 return true 17102 } 17103 // match: (Not (Greater32U x y)) 17104 // cond: 17105 // result: (Leq32U x y) 17106 for { 17107 v_0 := v.Args[0] 17108 if v_0.Op != OpGreater32U { 17109 break 17110 } 17111 _ = v_0.Args[1] 17112 x := v_0.Args[0] 17113 y := v_0.Args[1] 17114 v.reset(OpLeq32U) 17115 v.AddArg(x) 17116 v.AddArg(y) 17117 return true 17118 } 17119 // match: (Not (Greater16U x y)) 17120 // cond: 17121 // result: (Leq16U x y) 17122 for { 17123 v_0 := v.Args[0] 17124 if v_0.Op != OpGreater16U { 17125 break 17126 } 17127 _ = v_0.Args[1] 17128 x := v_0.Args[0] 17129 y := v_0.Args[1] 17130 v.reset(OpLeq16U) 17131 v.AddArg(x) 17132 v.AddArg(y) 17133 return true 17134 } 17135 // match: (Not (Greater8U x y)) 17136 // cond: 17137 // result: (Leq8U x y) 17138 for { 17139 v_0 := v.Args[0] 17140 if v_0.Op != OpGreater8U { 17141 break 17142 } 17143 _ = v_0.Args[1] 17144 x := v_0.Args[0] 17145 y := v_0.Args[1] 17146 v.reset(OpLeq8U) 17147 v.AddArg(x) 17148 v.AddArg(y) 17149 return true 17150 } 17151 // match: (Not (Geq64 x y)) 17152 // cond: 17153 // result: (Less64 x y) 17154 for { 17155 v_0 := v.Args[0] 17156 if v_0.Op != OpGeq64 { 17157 break 17158 } 17159 _ = v_0.Args[1] 17160 x := v_0.Args[0] 17161 y := v_0.Args[1] 17162 v.reset(OpLess64) 17163 v.AddArg(x) 17164 v.AddArg(y) 17165 return true 17166 } 17167 // match: (Not (Geq32 x y)) 17168 // cond: 17169 // result: (Less32 x y) 17170 for { 17171 v_0 := v.Args[0] 17172 if v_0.Op != OpGeq32 { 17173 break 17174 } 17175 _ = v_0.Args[1] 17176 x := v_0.Args[0] 17177 y := v_0.Args[1] 17178 v.reset(OpLess32) 17179 v.AddArg(x) 17180 v.AddArg(y) 17181 return true 17182 } 17183 return false 17184 } 17185 func rewriteValuegeneric_OpNot_20(v *Value) bool { 17186 // match: (Not (Geq16 x y)) 17187 // cond: 17188 // result: (Less16 x y) 17189 for { 17190 v_0 := v.Args[0] 17191 if v_0.Op != OpGeq16 { 17192 break 17193 } 17194 _ = v_0.Args[1] 17195 x := v_0.Args[0] 17196 y := v_0.Args[1] 17197 v.reset(OpLess16) 17198 v.AddArg(x) 17199 v.AddArg(y) 17200 return true 17201 } 17202 // match: (Not (Geq8 x y)) 17203 // cond: 17204 // result: (Less8 x y) 17205 for { 17206 v_0 := v.Args[0] 17207 if v_0.Op != OpGeq8 { 17208 break 17209 } 17210 _ = v_0.Args[1] 17211 x := v_0.Args[0] 17212 y := v_0.Args[1] 17213 v.reset(OpLess8) 17214 v.AddArg(x) 17215 v.AddArg(y) 17216 return true 17217 } 17218 // match: (Not (Geq64U x y)) 17219 // cond: 17220 // result: (Less64U x y) 17221 for { 17222 v_0 := v.Args[0] 17223 if v_0.Op != OpGeq64U { 17224 break 17225 } 17226 _ = v_0.Args[1] 17227 x := v_0.Args[0] 17228 y := v_0.Args[1] 17229 v.reset(OpLess64U) 17230 v.AddArg(x) 17231 v.AddArg(y) 17232 return true 17233 } 17234 // match: (Not (Geq32U x y)) 17235 // cond: 17236 // result: (Less32U x y) 17237 for { 17238 v_0 := v.Args[0] 17239 if v_0.Op != OpGeq32U { 17240 break 17241 } 17242 _ = v_0.Args[1] 17243 x := v_0.Args[0] 17244 y := v_0.Args[1] 17245 v.reset(OpLess32U) 17246 v.AddArg(x) 17247 v.AddArg(y) 17248 return true 17249 } 17250 // match: (Not (Geq16U x y)) 17251 // cond: 17252 // result: (Less16U x y) 17253 for { 17254 v_0 := v.Args[0] 17255 if v_0.Op != OpGeq16U { 17256 break 17257 } 17258 _ = v_0.Args[1] 17259 x := v_0.Args[0] 17260 y := v_0.Args[1] 17261 v.reset(OpLess16U) 17262 v.AddArg(x) 17263 v.AddArg(y) 17264 return true 17265 } 17266 // match: (Not (Geq8U x y)) 17267 // cond: 17268 // result: (Less8U x y) 17269 for { 17270 v_0 := v.Args[0] 17271 if v_0.Op != OpGeq8U { 17272 break 17273 } 17274 _ = v_0.Args[1] 17275 x := v_0.Args[0] 17276 y := v_0.Args[1] 17277 v.reset(OpLess8U) 17278 v.AddArg(x) 17279 v.AddArg(y) 17280 return true 17281 } 17282 // match: (Not (Less64 x y)) 17283 // cond: 17284 // result: (Geq64 x y) 17285 for { 17286 v_0 := v.Args[0] 17287 if v_0.Op != OpLess64 { 17288 break 17289 } 17290 _ = v_0.Args[1] 17291 x := v_0.Args[0] 17292 y := v_0.Args[1] 17293 v.reset(OpGeq64) 17294 v.AddArg(x) 17295 v.AddArg(y) 17296 return true 17297 } 17298 // match: (Not (Less32 x y)) 17299 // cond: 17300 // result: (Geq32 x y) 17301 for { 17302 v_0 := v.Args[0] 17303 if v_0.Op != OpLess32 { 17304 break 17305 } 17306 _ = v_0.Args[1] 17307 x := v_0.Args[0] 17308 y := v_0.Args[1] 17309 v.reset(OpGeq32) 17310 v.AddArg(x) 17311 v.AddArg(y) 17312 return true 17313 } 17314 // match: (Not (Less16 x y)) 17315 // cond: 17316 // result: (Geq16 x y) 17317 for { 17318 v_0 := v.Args[0] 17319 if v_0.Op != OpLess16 { 17320 break 17321 } 17322 _ = v_0.Args[1] 17323 x := v_0.Args[0] 17324 y := v_0.Args[1] 17325 v.reset(OpGeq16) 17326 v.AddArg(x) 17327 v.AddArg(y) 17328 return true 17329 } 17330 // match: (Not (Less8 x y)) 17331 // cond: 17332 // result: (Geq8 x y) 17333 for { 17334 v_0 := v.Args[0] 17335 if v_0.Op != OpLess8 { 17336 break 17337 } 17338 _ = v_0.Args[1] 17339 x := v_0.Args[0] 17340 y := v_0.Args[1] 17341 v.reset(OpGeq8) 17342 v.AddArg(x) 17343 v.AddArg(y) 17344 return true 17345 } 17346 return false 17347 } 17348 func rewriteValuegeneric_OpNot_30(v *Value) bool { 17349 // match: (Not (Less64U x y)) 17350 // cond: 17351 // result: (Geq64U x y) 17352 for { 17353 v_0 := v.Args[0] 17354 if v_0.Op != OpLess64U { 17355 break 17356 } 17357 _ = v_0.Args[1] 17358 x := v_0.Args[0] 17359 y := v_0.Args[1] 17360 v.reset(OpGeq64U) 17361 v.AddArg(x) 17362 v.AddArg(y) 17363 return true 17364 } 17365 // match: (Not (Less32U x y)) 17366 // cond: 17367 // result: (Geq32U x y) 17368 for { 17369 v_0 := v.Args[0] 17370 if v_0.Op != OpLess32U { 17371 break 17372 } 17373 _ = v_0.Args[1] 17374 x := v_0.Args[0] 17375 y := v_0.Args[1] 17376 v.reset(OpGeq32U) 17377 v.AddArg(x) 17378 v.AddArg(y) 17379 return true 17380 } 17381 // match: (Not (Less16U x y)) 17382 // cond: 17383 // result: (Geq16U x y) 17384 for { 17385 v_0 := v.Args[0] 17386 if v_0.Op != OpLess16U { 17387 break 17388 } 17389 _ = v_0.Args[1] 17390 x := v_0.Args[0] 17391 y := v_0.Args[1] 17392 v.reset(OpGeq16U) 17393 v.AddArg(x) 17394 v.AddArg(y) 17395 return true 17396 } 17397 // match: (Not (Less8U x y)) 17398 // cond: 17399 // result: (Geq8U x y) 17400 for { 17401 v_0 := v.Args[0] 17402 if v_0.Op != OpLess8U { 17403 break 17404 } 17405 _ = v_0.Args[1] 17406 x := v_0.Args[0] 17407 y := v_0.Args[1] 17408 v.reset(OpGeq8U) 17409 v.AddArg(x) 17410 v.AddArg(y) 17411 return true 17412 } 17413 // match: (Not (Leq64 x y)) 17414 // cond: 17415 // result: (Greater64 x y) 17416 for { 17417 v_0 := v.Args[0] 17418 if v_0.Op != OpLeq64 { 17419 break 17420 } 17421 _ = v_0.Args[1] 17422 x := v_0.Args[0] 17423 y := v_0.Args[1] 17424 v.reset(OpGreater64) 17425 v.AddArg(x) 17426 v.AddArg(y) 17427 return true 17428 } 17429 // match: (Not (Leq32 x y)) 17430 // cond: 17431 // result: (Greater32 x y) 17432 for { 17433 v_0 := v.Args[0] 17434 if v_0.Op != OpLeq32 { 17435 break 17436 } 17437 _ = v_0.Args[1] 17438 x := v_0.Args[0] 17439 y := v_0.Args[1] 17440 v.reset(OpGreater32) 17441 v.AddArg(x) 17442 v.AddArg(y) 17443 return true 17444 } 17445 // match: (Not (Leq16 x y)) 17446 // cond: 17447 // result: (Greater16 x y) 17448 for { 17449 v_0 := v.Args[0] 17450 if v_0.Op != OpLeq16 { 17451 break 17452 } 17453 _ = v_0.Args[1] 17454 x := v_0.Args[0] 17455 y := v_0.Args[1] 17456 v.reset(OpGreater16) 17457 v.AddArg(x) 17458 v.AddArg(y) 17459 return true 17460 } 17461 // match: (Not (Leq8 x y)) 17462 // cond: 17463 // result: (Greater8 x y) 17464 for { 17465 v_0 := v.Args[0] 17466 if v_0.Op != OpLeq8 { 17467 break 17468 } 17469 _ = v_0.Args[1] 17470 x := v_0.Args[0] 17471 y := v_0.Args[1] 17472 v.reset(OpGreater8) 17473 v.AddArg(x) 17474 v.AddArg(y) 17475 return true 17476 } 17477 // match: (Not (Leq64U x y)) 17478 // cond: 17479 // result: (Greater64U x y) 17480 for { 17481 v_0 := v.Args[0] 17482 if v_0.Op != OpLeq64U { 17483 break 17484 } 17485 _ = v_0.Args[1] 17486 x := v_0.Args[0] 17487 y := v_0.Args[1] 17488 v.reset(OpGreater64U) 17489 v.AddArg(x) 17490 v.AddArg(y) 17491 return true 17492 } 17493 // match: (Not (Leq32U x y)) 17494 // cond: 17495 // result: (Greater32U x y) 17496 for { 17497 v_0 := v.Args[0] 17498 if v_0.Op != OpLeq32U { 17499 break 17500 } 17501 _ = v_0.Args[1] 17502 x := v_0.Args[0] 17503 y := v_0.Args[1] 17504 v.reset(OpGreater32U) 17505 v.AddArg(x) 17506 v.AddArg(y) 17507 return true 17508 } 17509 return false 17510 } 17511 func rewriteValuegeneric_OpNot_40(v *Value) bool { 17512 // match: (Not (Leq16U x y)) 17513 // cond: 17514 // result: (Greater16U x y) 17515 for { 17516 v_0 := v.Args[0] 17517 if v_0.Op != OpLeq16U { 17518 break 17519 } 17520 _ = v_0.Args[1] 17521 x := v_0.Args[0] 17522 y := v_0.Args[1] 17523 v.reset(OpGreater16U) 17524 v.AddArg(x) 17525 v.AddArg(y) 17526 return true 17527 } 17528 // match: (Not (Leq8U x y)) 17529 // cond: 17530 // result: (Greater8U x y) 17531 for { 17532 v_0 := v.Args[0] 17533 if v_0.Op != OpLeq8U { 17534 break 17535 } 17536 _ = v_0.Args[1] 17537 x := v_0.Args[0] 17538 y := v_0.Args[1] 17539 v.reset(OpGreater8U) 17540 v.AddArg(x) 17541 v.AddArg(y) 17542 return true 17543 } 17544 return false 17545 } 17546 func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { 17547 // match: (OffPtr (OffPtr p [b]) [a]) 17548 // cond: 17549 // result: (OffPtr p [a+b]) 17550 for { 17551 a := v.AuxInt 17552 v_0 := v.Args[0] 17553 if v_0.Op != OpOffPtr { 17554 break 17555 } 17556 b := v_0.AuxInt 17557 p := v_0.Args[0] 17558 v.reset(OpOffPtr) 17559 v.AuxInt = a + b 17560 v.AddArg(p) 17561 return true 17562 } 17563 // match: (OffPtr p [0]) 17564 // cond: v.Type.Compare(p.Type) == types.CMPeq 17565 // result: p 17566 for { 17567 if v.AuxInt != 0 { 17568 break 17569 } 17570 p := v.Args[0] 17571 if !(v.Type.Compare(p.Type) == types.CMPeq) { 17572 break 17573 } 17574 v.reset(OpCopy) 17575 v.Type = p.Type 17576 v.AddArg(p) 17577 return true 17578 } 17579 return false 17580 } 17581 func rewriteValuegeneric_OpOr16_0(v *Value) bool { 17582 // match: (Or16 (Const16 [c]) (Const16 [d])) 17583 // cond: 17584 // result: (Const16 [int64(int16(c|d))]) 17585 for { 17586 _ = v.Args[1] 17587 v_0 := v.Args[0] 17588 if v_0.Op != OpConst16 { 17589 break 17590 } 17591 c := v_0.AuxInt 17592 v_1 := v.Args[1] 17593 if v_1.Op != OpConst16 { 17594 break 17595 } 17596 d := v_1.AuxInt 17597 v.reset(OpConst16) 17598 v.AuxInt = int64(int16(c | d)) 17599 return true 17600 } 17601 // match: (Or16 (Const16 [d]) (Const16 [c])) 17602 // cond: 17603 // result: (Const16 [int64(int16(c|d))]) 17604 for { 17605 _ = v.Args[1] 17606 v_0 := v.Args[0] 17607 if v_0.Op != OpConst16 { 17608 break 17609 } 17610 d := v_0.AuxInt 17611 v_1 := v.Args[1] 17612 if v_1.Op != OpConst16 { 17613 break 17614 } 17615 c := v_1.AuxInt 17616 v.reset(OpConst16) 17617 v.AuxInt = int64(int16(c | d)) 17618 return true 17619 } 17620 // match: (Or16 x x) 17621 // cond: 17622 // result: x 17623 for { 17624 _ = v.Args[1] 17625 x := v.Args[0] 17626 if x != v.Args[1] { 17627 break 17628 } 17629 v.reset(OpCopy) 17630 v.Type = x.Type 17631 v.AddArg(x) 17632 return true 17633 } 17634 // match: (Or16 (Const16 [0]) x) 17635 // cond: 17636 // result: x 17637 for { 17638 _ = v.Args[1] 17639 v_0 := v.Args[0] 17640 if v_0.Op != OpConst16 { 17641 break 17642 } 17643 if v_0.AuxInt != 0 { 17644 break 17645 } 17646 x := v.Args[1] 17647 v.reset(OpCopy) 17648 v.Type = x.Type 17649 v.AddArg(x) 17650 return true 17651 } 17652 // match: (Or16 x (Const16 [0])) 17653 // cond: 17654 // result: x 17655 for { 17656 _ = v.Args[1] 17657 x := v.Args[0] 17658 v_1 := v.Args[1] 17659 if v_1.Op != OpConst16 { 17660 break 17661 } 17662 if v_1.AuxInt != 0 { 17663 break 17664 } 17665 v.reset(OpCopy) 17666 v.Type = x.Type 17667 v.AddArg(x) 17668 return true 17669 } 17670 // match: (Or16 (Const16 [-1]) _) 17671 // cond: 17672 // result: (Const16 [-1]) 17673 for { 17674 _ = v.Args[1] 17675 v_0 := v.Args[0] 17676 if v_0.Op != OpConst16 { 17677 break 17678 } 17679 if v_0.AuxInt != -1 { 17680 break 17681 } 17682 v.reset(OpConst16) 17683 v.AuxInt = -1 17684 return true 17685 } 17686 // match: (Or16 _ (Const16 [-1])) 17687 // cond: 17688 // result: (Const16 [-1]) 17689 for { 17690 _ = v.Args[1] 17691 v_1 := v.Args[1] 17692 if v_1.Op != OpConst16 { 17693 break 17694 } 17695 if v_1.AuxInt != -1 { 17696 break 17697 } 17698 v.reset(OpConst16) 17699 v.AuxInt = -1 17700 return true 17701 } 17702 // match: (Or16 x (Or16 x y)) 17703 // cond: 17704 // result: (Or16 x y) 17705 for { 17706 _ = v.Args[1] 17707 x := v.Args[0] 17708 v_1 := v.Args[1] 17709 if v_1.Op != OpOr16 { 17710 break 17711 } 17712 _ = v_1.Args[1] 17713 if x != v_1.Args[0] { 17714 break 17715 } 17716 y := v_1.Args[1] 17717 v.reset(OpOr16) 17718 v.AddArg(x) 17719 v.AddArg(y) 17720 return true 17721 } 17722 // match: (Or16 x (Or16 y x)) 17723 // cond: 17724 // result: (Or16 x y) 17725 for { 17726 _ = v.Args[1] 17727 x := v.Args[0] 17728 v_1 := v.Args[1] 17729 if v_1.Op != OpOr16 { 17730 break 17731 } 17732 _ = v_1.Args[1] 17733 y := v_1.Args[0] 17734 if x != v_1.Args[1] { 17735 break 17736 } 17737 v.reset(OpOr16) 17738 v.AddArg(x) 17739 v.AddArg(y) 17740 return true 17741 } 17742 // match: (Or16 (Or16 x y) x) 17743 // cond: 17744 // result: (Or16 x y) 17745 for { 17746 _ = v.Args[1] 17747 v_0 := v.Args[0] 17748 if v_0.Op != OpOr16 { 17749 break 17750 } 17751 _ = v_0.Args[1] 17752 x := v_0.Args[0] 17753 y := v_0.Args[1] 17754 if x != v.Args[1] { 17755 break 17756 } 17757 v.reset(OpOr16) 17758 v.AddArg(x) 17759 v.AddArg(y) 17760 return true 17761 } 17762 return false 17763 } 17764 func rewriteValuegeneric_OpOr16_10(v *Value) bool { 17765 b := v.Block 17766 _ = b 17767 // match: (Or16 (Or16 y x) x) 17768 // cond: 17769 // result: (Or16 x y) 17770 for { 17771 _ = v.Args[1] 17772 v_0 := v.Args[0] 17773 if v_0.Op != OpOr16 { 17774 break 17775 } 17776 _ = v_0.Args[1] 17777 y := v_0.Args[0] 17778 x := v_0.Args[1] 17779 if x != v.Args[1] { 17780 break 17781 } 17782 v.reset(OpOr16) 17783 v.AddArg(x) 17784 v.AddArg(y) 17785 return true 17786 } 17787 // match: (Or16 (And16 x (Const16 [c2])) (Const16 <t> [c1])) 17788 // cond: ^(c1 | c2) == 0 17789 // result: (Or16 (Const16 <t> [c1]) x) 17790 for { 17791 _ = v.Args[1] 17792 v_0 := v.Args[0] 17793 if v_0.Op != OpAnd16 { 17794 break 17795 } 17796 _ = v_0.Args[1] 17797 x := v_0.Args[0] 17798 v_0_1 := v_0.Args[1] 17799 if v_0_1.Op != OpConst16 { 17800 break 17801 } 17802 c2 := v_0_1.AuxInt 17803 v_1 := v.Args[1] 17804 if v_1.Op != OpConst16 { 17805 break 17806 } 17807 t := v_1.Type 17808 c1 := v_1.AuxInt 17809 if !(^(c1 | c2) == 0) { 17810 break 17811 } 17812 v.reset(OpOr16) 17813 v0 := b.NewValue0(v.Pos, OpConst16, t) 17814 v0.AuxInt = c1 17815 v.AddArg(v0) 17816 v.AddArg(x) 17817 return true 17818 } 17819 // match: (Or16 (And16 (Const16 [c2]) x) (Const16 <t> [c1])) 17820 // cond: ^(c1 | c2) == 0 17821 // result: (Or16 (Const16 <t> [c1]) x) 17822 for { 17823 _ = v.Args[1] 17824 v_0 := v.Args[0] 17825 if v_0.Op != OpAnd16 { 17826 break 17827 } 17828 _ = v_0.Args[1] 17829 v_0_0 := v_0.Args[0] 17830 if v_0_0.Op != OpConst16 { 17831 break 17832 } 17833 c2 := v_0_0.AuxInt 17834 x := v_0.Args[1] 17835 v_1 := v.Args[1] 17836 if v_1.Op != OpConst16 { 17837 break 17838 } 17839 t := v_1.Type 17840 c1 := v_1.AuxInt 17841 if !(^(c1 | c2) == 0) { 17842 break 17843 } 17844 v.reset(OpOr16) 17845 v0 := b.NewValue0(v.Pos, OpConst16, t) 17846 v0.AuxInt = c1 17847 v.AddArg(v0) 17848 v.AddArg(x) 17849 return true 17850 } 17851 // match: (Or16 (Const16 <t> [c1]) (And16 x (Const16 [c2]))) 17852 // cond: ^(c1 | c2) == 0 17853 // result: (Or16 (Const16 <t> [c1]) x) 17854 for { 17855 _ = v.Args[1] 17856 v_0 := v.Args[0] 17857 if v_0.Op != OpConst16 { 17858 break 17859 } 17860 t := v_0.Type 17861 c1 := v_0.AuxInt 17862 v_1 := v.Args[1] 17863 if v_1.Op != OpAnd16 { 17864 break 17865 } 17866 _ = v_1.Args[1] 17867 x := v_1.Args[0] 17868 v_1_1 := v_1.Args[1] 17869 if v_1_1.Op != OpConst16 { 17870 break 17871 } 17872 c2 := v_1_1.AuxInt 17873 if !(^(c1 | c2) == 0) { 17874 break 17875 } 17876 v.reset(OpOr16) 17877 v0 := b.NewValue0(v.Pos, OpConst16, t) 17878 v0.AuxInt = c1 17879 v.AddArg(v0) 17880 v.AddArg(x) 17881 return true 17882 } 17883 // match: (Or16 (Const16 <t> [c1]) (And16 (Const16 [c2]) x)) 17884 // cond: ^(c1 | c2) == 0 17885 // result: (Or16 (Const16 <t> [c1]) x) 17886 for { 17887 _ = v.Args[1] 17888 v_0 := v.Args[0] 17889 if v_0.Op != OpConst16 { 17890 break 17891 } 17892 t := v_0.Type 17893 c1 := v_0.AuxInt 17894 v_1 := v.Args[1] 17895 if v_1.Op != OpAnd16 { 17896 break 17897 } 17898 _ = v_1.Args[1] 17899 v_1_0 := v_1.Args[0] 17900 if v_1_0.Op != OpConst16 { 17901 break 17902 } 17903 c2 := v_1_0.AuxInt 17904 x := v_1.Args[1] 17905 if !(^(c1 | c2) == 0) { 17906 break 17907 } 17908 v.reset(OpOr16) 17909 v0 := b.NewValue0(v.Pos, OpConst16, t) 17910 v0.AuxInt = c1 17911 v.AddArg(v0) 17912 v.AddArg(x) 17913 return true 17914 } 17915 // match: (Or16 (Or16 i:(Const16 <t>) z) x) 17916 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 17917 // result: (Or16 i (Or16 <t> z x)) 17918 for { 17919 _ = v.Args[1] 17920 v_0 := v.Args[0] 17921 if v_0.Op != OpOr16 { 17922 break 17923 } 17924 _ = v_0.Args[1] 17925 i := v_0.Args[0] 17926 if i.Op != OpConst16 { 17927 break 17928 } 17929 t := i.Type 17930 z := v_0.Args[1] 17931 x := v.Args[1] 17932 if !(z.Op != OpConst16 && x.Op != OpConst16) { 17933 break 17934 } 17935 v.reset(OpOr16) 17936 v.AddArg(i) 17937 v0 := b.NewValue0(v.Pos, OpOr16, t) 17938 v0.AddArg(z) 17939 v0.AddArg(x) 17940 v.AddArg(v0) 17941 return true 17942 } 17943 // match: (Or16 (Or16 z i:(Const16 <t>)) x) 17944 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 17945 // result: (Or16 i (Or16 <t> z x)) 17946 for { 17947 _ = v.Args[1] 17948 v_0 := v.Args[0] 17949 if v_0.Op != OpOr16 { 17950 break 17951 } 17952 _ = v_0.Args[1] 17953 z := v_0.Args[0] 17954 i := v_0.Args[1] 17955 if i.Op != OpConst16 { 17956 break 17957 } 17958 t := i.Type 17959 x := v.Args[1] 17960 if !(z.Op != OpConst16 && x.Op != OpConst16) { 17961 break 17962 } 17963 v.reset(OpOr16) 17964 v.AddArg(i) 17965 v0 := b.NewValue0(v.Pos, OpOr16, t) 17966 v0.AddArg(z) 17967 v0.AddArg(x) 17968 v.AddArg(v0) 17969 return true 17970 } 17971 // match: (Or16 x (Or16 i:(Const16 <t>) z)) 17972 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 17973 // result: (Or16 i (Or16 <t> z x)) 17974 for { 17975 _ = v.Args[1] 17976 x := v.Args[0] 17977 v_1 := v.Args[1] 17978 if v_1.Op != OpOr16 { 17979 break 17980 } 17981 _ = v_1.Args[1] 17982 i := v_1.Args[0] 17983 if i.Op != OpConst16 { 17984 break 17985 } 17986 t := i.Type 17987 z := v_1.Args[1] 17988 if !(z.Op != OpConst16 && x.Op != OpConst16) { 17989 break 17990 } 17991 v.reset(OpOr16) 17992 v.AddArg(i) 17993 v0 := b.NewValue0(v.Pos, OpOr16, t) 17994 v0.AddArg(z) 17995 v0.AddArg(x) 17996 v.AddArg(v0) 17997 return true 17998 } 17999 // match: (Or16 x (Or16 z i:(Const16 <t>))) 18000 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18001 // result: (Or16 i (Or16 <t> z x)) 18002 for { 18003 _ = v.Args[1] 18004 x := v.Args[0] 18005 v_1 := v.Args[1] 18006 if v_1.Op != OpOr16 { 18007 break 18008 } 18009 _ = v_1.Args[1] 18010 z := v_1.Args[0] 18011 i := v_1.Args[1] 18012 if i.Op != OpConst16 { 18013 break 18014 } 18015 t := i.Type 18016 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18017 break 18018 } 18019 v.reset(OpOr16) 18020 v.AddArg(i) 18021 v0 := b.NewValue0(v.Pos, OpOr16, t) 18022 v0.AddArg(z) 18023 v0.AddArg(x) 18024 v.AddArg(v0) 18025 return true 18026 } 18027 // match: (Or16 (Const16 <t> [c]) (Or16 (Const16 <t> [d]) x)) 18028 // cond: 18029 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18030 for { 18031 _ = v.Args[1] 18032 v_0 := v.Args[0] 18033 if v_0.Op != OpConst16 { 18034 break 18035 } 18036 t := v_0.Type 18037 c := v_0.AuxInt 18038 v_1 := v.Args[1] 18039 if v_1.Op != OpOr16 { 18040 break 18041 } 18042 _ = v_1.Args[1] 18043 v_1_0 := v_1.Args[0] 18044 if v_1_0.Op != OpConst16 { 18045 break 18046 } 18047 if v_1_0.Type != t { 18048 break 18049 } 18050 d := v_1_0.AuxInt 18051 x := v_1.Args[1] 18052 v.reset(OpOr16) 18053 v0 := b.NewValue0(v.Pos, OpConst16, t) 18054 v0.AuxInt = int64(int16(c | d)) 18055 v.AddArg(v0) 18056 v.AddArg(x) 18057 return true 18058 } 18059 return false 18060 } 18061 func rewriteValuegeneric_OpOr16_20(v *Value) bool { 18062 b := v.Block 18063 _ = b 18064 // match: (Or16 (Const16 <t> [c]) (Or16 x (Const16 <t> [d]))) 18065 // cond: 18066 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18067 for { 18068 _ = v.Args[1] 18069 v_0 := v.Args[0] 18070 if v_0.Op != OpConst16 { 18071 break 18072 } 18073 t := v_0.Type 18074 c := v_0.AuxInt 18075 v_1 := v.Args[1] 18076 if v_1.Op != OpOr16 { 18077 break 18078 } 18079 _ = v_1.Args[1] 18080 x := v_1.Args[0] 18081 v_1_1 := v_1.Args[1] 18082 if v_1_1.Op != OpConst16 { 18083 break 18084 } 18085 if v_1_1.Type != t { 18086 break 18087 } 18088 d := v_1_1.AuxInt 18089 v.reset(OpOr16) 18090 v0 := b.NewValue0(v.Pos, OpConst16, t) 18091 v0.AuxInt = int64(int16(c | d)) 18092 v.AddArg(v0) 18093 v.AddArg(x) 18094 return true 18095 } 18096 // match: (Or16 (Or16 (Const16 <t> [d]) x) (Const16 <t> [c])) 18097 // cond: 18098 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18099 for { 18100 _ = v.Args[1] 18101 v_0 := v.Args[0] 18102 if v_0.Op != OpOr16 { 18103 break 18104 } 18105 _ = v_0.Args[1] 18106 v_0_0 := v_0.Args[0] 18107 if v_0_0.Op != OpConst16 { 18108 break 18109 } 18110 t := v_0_0.Type 18111 d := v_0_0.AuxInt 18112 x := v_0.Args[1] 18113 v_1 := v.Args[1] 18114 if v_1.Op != OpConst16 { 18115 break 18116 } 18117 if v_1.Type != t { 18118 break 18119 } 18120 c := v_1.AuxInt 18121 v.reset(OpOr16) 18122 v0 := b.NewValue0(v.Pos, OpConst16, t) 18123 v0.AuxInt = int64(int16(c | d)) 18124 v.AddArg(v0) 18125 v.AddArg(x) 18126 return true 18127 } 18128 // match: (Or16 (Or16 x (Const16 <t> [d])) (Const16 <t> [c])) 18129 // cond: 18130 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18131 for { 18132 _ = v.Args[1] 18133 v_0 := v.Args[0] 18134 if v_0.Op != OpOr16 { 18135 break 18136 } 18137 _ = v_0.Args[1] 18138 x := v_0.Args[0] 18139 v_0_1 := v_0.Args[1] 18140 if v_0_1.Op != OpConst16 { 18141 break 18142 } 18143 t := v_0_1.Type 18144 d := v_0_1.AuxInt 18145 v_1 := v.Args[1] 18146 if v_1.Op != OpConst16 { 18147 break 18148 } 18149 if v_1.Type != t { 18150 break 18151 } 18152 c := v_1.AuxInt 18153 v.reset(OpOr16) 18154 v0 := b.NewValue0(v.Pos, OpConst16, t) 18155 v0.AuxInt = int64(int16(c | d)) 18156 v.AddArg(v0) 18157 v.AddArg(x) 18158 return true 18159 } 18160 return false 18161 } 18162 func rewriteValuegeneric_OpOr32_0(v *Value) bool { 18163 // match: (Or32 (Const32 [c]) (Const32 [d])) 18164 // cond: 18165 // result: (Const32 [int64(int32(c|d))]) 18166 for { 18167 _ = v.Args[1] 18168 v_0 := v.Args[0] 18169 if v_0.Op != OpConst32 { 18170 break 18171 } 18172 c := v_0.AuxInt 18173 v_1 := v.Args[1] 18174 if v_1.Op != OpConst32 { 18175 break 18176 } 18177 d := v_1.AuxInt 18178 v.reset(OpConst32) 18179 v.AuxInt = int64(int32(c | d)) 18180 return true 18181 } 18182 // match: (Or32 (Const32 [d]) (Const32 [c])) 18183 // cond: 18184 // result: (Const32 [int64(int32(c|d))]) 18185 for { 18186 _ = v.Args[1] 18187 v_0 := v.Args[0] 18188 if v_0.Op != OpConst32 { 18189 break 18190 } 18191 d := v_0.AuxInt 18192 v_1 := v.Args[1] 18193 if v_1.Op != OpConst32 { 18194 break 18195 } 18196 c := v_1.AuxInt 18197 v.reset(OpConst32) 18198 v.AuxInt = int64(int32(c | d)) 18199 return true 18200 } 18201 // match: (Or32 x x) 18202 // cond: 18203 // result: x 18204 for { 18205 _ = v.Args[1] 18206 x := v.Args[0] 18207 if x != v.Args[1] { 18208 break 18209 } 18210 v.reset(OpCopy) 18211 v.Type = x.Type 18212 v.AddArg(x) 18213 return true 18214 } 18215 // match: (Or32 (Const32 [0]) x) 18216 // cond: 18217 // result: x 18218 for { 18219 _ = v.Args[1] 18220 v_0 := v.Args[0] 18221 if v_0.Op != OpConst32 { 18222 break 18223 } 18224 if v_0.AuxInt != 0 { 18225 break 18226 } 18227 x := v.Args[1] 18228 v.reset(OpCopy) 18229 v.Type = x.Type 18230 v.AddArg(x) 18231 return true 18232 } 18233 // match: (Or32 x (Const32 [0])) 18234 // cond: 18235 // result: x 18236 for { 18237 _ = v.Args[1] 18238 x := v.Args[0] 18239 v_1 := v.Args[1] 18240 if v_1.Op != OpConst32 { 18241 break 18242 } 18243 if v_1.AuxInt != 0 { 18244 break 18245 } 18246 v.reset(OpCopy) 18247 v.Type = x.Type 18248 v.AddArg(x) 18249 return true 18250 } 18251 // match: (Or32 (Const32 [-1]) _) 18252 // cond: 18253 // result: (Const32 [-1]) 18254 for { 18255 _ = v.Args[1] 18256 v_0 := v.Args[0] 18257 if v_0.Op != OpConst32 { 18258 break 18259 } 18260 if v_0.AuxInt != -1 { 18261 break 18262 } 18263 v.reset(OpConst32) 18264 v.AuxInt = -1 18265 return true 18266 } 18267 // match: (Or32 _ (Const32 [-1])) 18268 // cond: 18269 // result: (Const32 [-1]) 18270 for { 18271 _ = v.Args[1] 18272 v_1 := v.Args[1] 18273 if v_1.Op != OpConst32 { 18274 break 18275 } 18276 if v_1.AuxInt != -1 { 18277 break 18278 } 18279 v.reset(OpConst32) 18280 v.AuxInt = -1 18281 return true 18282 } 18283 // match: (Or32 x (Or32 x y)) 18284 // cond: 18285 // result: (Or32 x y) 18286 for { 18287 _ = v.Args[1] 18288 x := v.Args[0] 18289 v_1 := v.Args[1] 18290 if v_1.Op != OpOr32 { 18291 break 18292 } 18293 _ = v_1.Args[1] 18294 if x != v_1.Args[0] { 18295 break 18296 } 18297 y := v_1.Args[1] 18298 v.reset(OpOr32) 18299 v.AddArg(x) 18300 v.AddArg(y) 18301 return true 18302 } 18303 // match: (Or32 x (Or32 y x)) 18304 // cond: 18305 // result: (Or32 x y) 18306 for { 18307 _ = v.Args[1] 18308 x := v.Args[0] 18309 v_1 := v.Args[1] 18310 if v_1.Op != OpOr32 { 18311 break 18312 } 18313 _ = v_1.Args[1] 18314 y := v_1.Args[0] 18315 if x != v_1.Args[1] { 18316 break 18317 } 18318 v.reset(OpOr32) 18319 v.AddArg(x) 18320 v.AddArg(y) 18321 return true 18322 } 18323 // match: (Or32 (Or32 x y) x) 18324 // cond: 18325 // result: (Or32 x y) 18326 for { 18327 _ = v.Args[1] 18328 v_0 := v.Args[0] 18329 if v_0.Op != OpOr32 { 18330 break 18331 } 18332 _ = v_0.Args[1] 18333 x := v_0.Args[0] 18334 y := v_0.Args[1] 18335 if x != v.Args[1] { 18336 break 18337 } 18338 v.reset(OpOr32) 18339 v.AddArg(x) 18340 v.AddArg(y) 18341 return true 18342 } 18343 return false 18344 } 18345 func rewriteValuegeneric_OpOr32_10(v *Value) bool { 18346 b := v.Block 18347 _ = b 18348 // match: (Or32 (Or32 y x) x) 18349 // cond: 18350 // result: (Or32 x y) 18351 for { 18352 _ = v.Args[1] 18353 v_0 := v.Args[0] 18354 if v_0.Op != OpOr32 { 18355 break 18356 } 18357 _ = v_0.Args[1] 18358 y := v_0.Args[0] 18359 x := v_0.Args[1] 18360 if x != v.Args[1] { 18361 break 18362 } 18363 v.reset(OpOr32) 18364 v.AddArg(x) 18365 v.AddArg(y) 18366 return true 18367 } 18368 // match: (Or32 (And32 x (Const32 [c2])) (Const32 <t> [c1])) 18369 // cond: ^(c1 | c2) == 0 18370 // result: (Or32 (Const32 <t> [c1]) x) 18371 for { 18372 _ = v.Args[1] 18373 v_0 := v.Args[0] 18374 if v_0.Op != OpAnd32 { 18375 break 18376 } 18377 _ = v_0.Args[1] 18378 x := v_0.Args[0] 18379 v_0_1 := v_0.Args[1] 18380 if v_0_1.Op != OpConst32 { 18381 break 18382 } 18383 c2 := v_0_1.AuxInt 18384 v_1 := v.Args[1] 18385 if v_1.Op != OpConst32 { 18386 break 18387 } 18388 t := v_1.Type 18389 c1 := v_1.AuxInt 18390 if !(^(c1 | c2) == 0) { 18391 break 18392 } 18393 v.reset(OpOr32) 18394 v0 := b.NewValue0(v.Pos, OpConst32, t) 18395 v0.AuxInt = c1 18396 v.AddArg(v0) 18397 v.AddArg(x) 18398 return true 18399 } 18400 // match: (Or32 (And32 (Const32 [c2]) x) (Const32 <t> [c1])) 18401 // cond: ^(c1 | c2) == 0 18402 // result: (Or32 (Const32 <t> [c1]) x) 18403 for { 18404 _ = v.Args[1] 18405 v_0 := v.Args[0] 18406 if v_0.Op != OpAnd32 { 18407 break 18408 } 18409 _ = v_0.Args[1] 18410 v_0_0 := v_0.Args[0] 18411 if v_0_0.Op != OpConst32 { 18412 break 18413 } 18414 c2 := v_0_0.AuxInt 18415 x := v_0.Args[1] 18416 v_1 := v.Args[1] 18417 if v_1.Op != OpConst32 { 18418 break 18419 } 18420 t := v_1.Type 18421 c1 := v_1.AuxInt 18422 if !(^(c1 | c2) == 0) { 18423 break 18424 } 18425 v.reset(OpOr32) 18426 v0 := b.NewValue0(v.Pos, OpConst32, t) 18427 v0.AuxInt = c1 18428 v.AddArg(v0) 18429 v.AddArg(x) 18430 return true 18431 } 18432 // match: (Or32 (Const32 <t> [c1]) (And32 x (Const32 [c2]))) 18433 // cond: ^(c1 | c2) == 0 18434 // result: (Or32 (Const32 <t> [c1]) x) 18435 for { 18436 _ = v.Args[1] 18437 v_0 := v.Args[0] 18438 if v_0.Op != OpConst32 { 18439 break 18440 } 18441 t := v_0.Type 18442 c1 := v_0.AuxInt 18443 v_1 := v.Args[1] 18444 if v_1.Op != OpAnd32 { 18445 break 18446 } 18447 _ = v_1.Args[1] 18448 x := v_1.Args[0] 18449 v_1_1 := v_1.Args[1] 18450 if v_1_1.Op != OpConst32 { 18451 break 18452 } 18453 c2 := v_1_1.AuxInt 18454 if !(^(c1 | c2) == 0) { 18455 break 18456 } 18457 v.reset(OpOr32) 18458 v0 := b.NewValue0(v.Pos, OpConst32, t) 18459 v0.AuxInt = c1 18460 v.AddArg(v0) 18461 v.AddArg(x) 18462 return true 18463 } 18464 // match: (Or32 (Const32 <t> [c1]) (And32 (Const32 [c2]) x)) 18465 // cond: ^(c1 | c2) == 0 18466 // result: (Or32 (Const32 <t> [c1]) x) 18467 for { 18468 _ = v.Args[1] 18469 v_0 := v.Args[0] 18470 if v_0.Op != OpConst32 { 18471 break 18472 } 18473 t := v_0.Type 18474 c1 := v_0.AuxInt 18475 v_1 := v.Args[1] 18476 if v_1.Op != OpAnd32 { 18477 break 18478 } 18479 _ = v_1.Args[1] 18480 v_1_0 := v_1.Args[0] 18481 if v_1_0.Op != OpConst32 { 18482 break 18483 } 18484 c2 := v_1_0.AuxInt 18485 x := v_1.Args[1] 18486 if !(^(c1 | c2) == 0) { 18487 break 18488 } 18489 v.reset(OpOr32) 18490 v0 := b.NewValue0(v.Pos, OpConst32, t) 18491 v0.AuxInt = c1 18492 v.AddArg(v0) 18493 v.AddArg(x) 18494 return true 18495 } 18496 // match: (Or32 (Or32 i:(Const32 <t>) z) x) 18497 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 18498 // result: (Or32 i (Or32 <t> z x)) 18499 for { 18500 _ = v.Args[1] 18501 v_0 := v.Args[0] 18502 if v_0.Op != OpOr32 { 18503 break 18504 } 18505 _ = v_0.Args[1] 18506 i := v_0.Args[0] 18507 if i.Op != OpConst32 { 18508 break 18509 } 18510 t := i.Type 18511 z := v_0.Args[1] 18512 x := v.Args[1] 18513 if !(z.Op != OpConst32 && x.Op != OpConst32) { 18514 break 18515 } 18516 v.reset(OpOr32) 18517 v.AddArg(i) 18518 v0 := b.NewValue0(v.Pos, OpOr32, t) 18519 v0.AddArg(z) 18520 v0.AddArg(x) 18521 v.AddArg(v0) 18522 return true 18523 } 18524 // match: (Or32 (Or32 z i:(Const32 <t>)) x) 18525 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 18526 // result: (Or32 i (Or32 <t> z x)) 18527 for { 18528 _ = v.Args[1] 18529 v_0 := v.Args[0] 18530 if v_0.Op != OpOr32 { 18531 break 18532 } 18533 _ = v_0.Args[1] 18534 z := v_0.Args[0] 18535 i := v_0.Args[1] 18536 if i.Op != OpConst32 { 18537 break 18538 } 18539 t := i.Type 18540 x := v.Args[1] 18541 if !(z.Op != OpConst32 && x.Op != OpConst32) { 18542 break 18543 } 18544 v.reset(OpOr32) 18545 v.AddArg(i) 18546 v0 := b.NewValue0(v.Pos, OpOr32, t) 18547 v0.AddArg(z) 18548 v0.AddArg(x) 18549 v.AddArg(v0) 18550 return true 18551 } 18552 // match: (Or32 x (Or32 i:(Const32 <t>) z)) 18553 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 18554 // result: (Or32 i (Or32 <t> z x)) 18555 for { 18556 _ = v.Args[1] 18557 x := v.Args[0] 18558 v_1 := v.Args[1] 18559 if v_1.Op != OpOr32 { 18560 break 18561 } 18562 _ = v_1.Args[1] 18563 i := v_1.Args[0] 18564 if i.Op != OpConst32 { 18565 break 18566 } 18567 t := i.Type 18568 z := v_1.Args[1] 18569 if !(z.Op != OpConst32 && x.Op != OpConst32) { 18570 break 18571 } 18572 v.reset(OpOr32) 18573 v.AddArg(i) 18574 v0 := b.NewValue0(v.Pos, OpOr32, t) 18575 v0.AddArg(z) 18576 v0.AddArg(x) 18577 v.AddArg(v0) 18578 return true 18579 } 18580 // match: (Or32 x (Or32 z i:(Const32 <t>))) 18581 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 18582 // result: (Or32 i (Or32 <t> z x)) 18583 for { 18584 _ = v.Args[1] 18585 x := v.Args[0] 18586 v_1 := v.Args[1] 18587 if v_1.Op != OpOr32 { 18588 break 18589 } 18590 _ = v_1.Args[1] 18591 z := v_1.Args[0] 18592 i := v_1.Args[1] 18593 if i.Op != OpConst32 { 18594 break 18595 } 18596 t := i.Type 18597 if !(z.Op != OpConst32 && x.Op != OpConst32) { 18598 break 18599 } 18600 v.reset(OpOr32) 18601 v.AddArg(i) 18602 v0 := b.NewValue0(v.Pos, OpOr32, t) 18603 v0.AddArg(z) 18604 v0.AddArg(x) 18605 v.AddArg(v0) 18606 return true 18607 } 18608 // match: (Or32 (Const32 <t> [c]) (Or32 (Const32 <t> [d]) x)) 18609 // cond: 18610 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 18611 for { 18612 _ = v.Args[1] 18613 v_0 := v.Args[0] 18614 if v_0.Op != OpConst32 { 18615 break 18616 } 18617 t := v_0.Type 18618 c := v_0.AuxInt 18619 v_1 := v.Args[1] 18620 if v_1.Op != OpOr32 { 18621 break 18622 } 18623 _ = v_1.Args[1] 18624 v_1_0 := v_1.Args[0] 18625 if v_1_0.Op != OpConst32 { 18626 break 18627 } 18628 if v_1_0.Type != t { 18629 break 18630 } 18631 d := v_1_0.AuxInt 18632 x := v_1.Args[1] 18633 v.reset(OpOr32) 18634 v0 := b.NewValue0(v.Pos, OpConst32, t) 18635 v0.AuxInt = int64(int32(c | d)) 18636 v.AddArg(v0) 18637 v.AddArg(x) 18638 return true 18639 } 18640 return false 18641 } 18642 func rewriteValuegeneric_OpOr32_20(v *Value) bool { 18643 b := v.Block 18644 _ = b 18645 // match: (Or32 (Const32 <t> [c]) (Or32 x (Const32 <t> [d]))) 18646 // cond: 18647 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 18648 for { 18649 _ = v.Args[1] 18650 v_0 := v.Args[0] 18651 if v_0.Op != OpConst32 { 18652 break 18653 } 18654 t := v_0.Type 18655 c := v_0.AuxInt 18656 v_1 := v.Args[1] 18657 if v_1.Op != OpOr32 { 18658 break 18659 } 18660 _ = v_1.Args[1] 18661 x := v_1.Args[0] 18662 v_1_1 := v_1.Args[1] 18663 if v_1_1.Op != OpConst32 { 18664 break 18665 } 18666 if v_1_1.Type != t { 18667 break 18668 } 18669 d := v_1_1.AuxInt 18670 v.reset(OpOr32) 18671 v0 := b.NewValue0(v.Pos, OpConst32, t) 18672 v0.AuxInt = int64(int32(c | d)) 18673 v.AddArg(v0) 18674 v.AddArg(x) 18675 return true 18676 } 18677 // match: (Or32 (Or32 (Const32 <t> [d]) x) (Const32 <t> [c])) 18678 // cond: 18679 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 18680 for { 18681 _ = v.Args[1] 18682 v_0 := v.Args[0] 18683 if v_0.Op != OpOr32 { 18684 break 18685 } 18686 _ = v_0.Args[1] 18687 v_0_0 := v_0.Args[0] 18688 if v_0_0.Op != OpConst32 { 18689 break 18690 } 18691 t := v_0_0.Type 18692 d := v_0_0.AuxInt 18693 x := v_0.Args[1] 18694 v_1 := v.Args[1] 18695 if v_1.Op != OpConst32 { 18696 break 18697 } 18698 if v_1.Type != t { 18699 break 18700 } 18701 c := v_1.AuxInt 18702 v.reset(OpOr32) 18703 v0 := b.NewValue0(v.Pos, OpConst32, t) 18704 v0.AuxInt = int64(int32(c | d)) 18705 v.AddArg(v0) 18706 v.AddArg(x) 18707 return true 18708 } 18709 // match: (Or32 (Or32 x (Const32 <t> [d])) (Const32 <t> [c])) 18710 // cond: 18711 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 18712 for { 18713 _ = v.Args[1] 18714 v_0 := v.Args[0] 18715 if v_0.Op != OpOr32 { 18716 break 18717 } 18718 _ = v_0.Args[1] 18719 x := v_0.Args[0] 18720 v_0_1 := v_0.Args[1] 18721 if v_0_1.Op != OpConst32 { 18722 break 18723 } 18724 t := v_0_1.Type 18725 d := v_0_1.AuxInt 18726 v_1 := v.Args[1] 18727 if v_1.Op != OpConst32 { 18728 break 18729 } 18730 if v_1.Type != t { 18731 break 18732 } 18733 c := v_1.AuxInt 18734 v.reset(OpOr32) 18735 v0 := b.NewValue0(v.Pos, OpConst32, t) 18736 v0.AuxInt = int64(int32(c | d)) 18737 v.AddArg(v0) 18738 v.AddArg(x) 18739 return true 18740 } 18741 return false 18742 } 18743 func rewriteValuegeneric_OpOr64_0(v *Value) bool { 18744 // match: (Or64 (Const64 [c]) (Const64 [d])) 18745 // cond: 18746 // result: (Const64 [c|d]) 18747 for { 18748 _ = v.Args[1] 18749 v_0 := v.Args[0] 18750 if v_0.Op != OpConst64 { 18751 break 18752 } 18753 c := v_0.AuxInt 18754 v_1 := v.Args[1] 18755 if v_1.Op != OpConst64 { 18756 break 18757 } 18758 d := v_1.AuxInt 18759 v.reset(OpConst64) 18760 v.AuxInt = c | d 18761 return true 18762 } 18763 // match: (Or64 (Const64 [d]) (Const64 [c])) 18764 // cond: 18765 // result: (Const64 [c|d]) 18766 for { 18767 _ = v.Args[1] 18768 v_0 := v.Args[0] 18769 if v_0.Op != OpConst64 { 18770 break 18771 } 18772 d := v_0.AuxInt 18773 v_1 := v.Args[1] 18774 if v_1.Op != OpConst64 { 18775 break 18776 } 18777 c := v_1.AuxInt 18778 v.reset(OpConst64) 18779 v.AuxInt = c | d 18780 return true 18781 } 18782 // match: (Or64 x x) 18783 // cond: 18784 // result: x 18785 for { 18786 _ = v.Args[1] 18787 x := v.Args[0] 18788 if x != v.Args[1] { 18789 break 18790 } 18791 v.reset(OpCopy) 18792 v.Type = x.Type 18793 v.AddArg(x) 18794 return true 18795 } 18796 // match: (Or64 (Const64 [0]) x) 18797 // cond: 18798 // result: x 18799 for { 18800 _ = v.Args[1] 18801 v_0 := v.Args[0] 18802 if v_0.Op != OpConst64 { 18803 break 18804 } 18805 if v_0.AuxInt != 0 { 18806 break 18807 } 18808 x := v.Args[1] 18809 v.reset(OpCopy) 18810 v.Type = x.Type 18811 v.AddArg(x) 18812 return true 18813 } 18814 // match: (Or64 x (Const64 [0])) 18815 // cond: 18816 // result: x 18817 for { 18818 _ = v.Args[1] 18819 x := v.Args[0] 18820 v_1 := v.Args[1] 18821 if v_1.Op != OpConst64 { 18822 break 18823 } 18824 if v_1.AuxInt != 0 { 18825 break 18826 } 18827 v.reset(OpCopy) 18828 v.Type = x.Type 18829 v.AddArg(x) 18830 return true 18831 } 18832 // match: (Or64 (Const64 [-1]) _) 18833 // cond: 18834 // result: (Const64 [-1]) 18835 for { 18836 _ = v.Args[1] 18837 v_0 := v.Args[0] 18838 if v_0.Op != OpConst64 { 18839 break 18840 } 18841 if v_0.AuxInt != -1 { 18842 break 18843 } 18844 v.reset(OpConst64) 18845 v.AuxInt = -1 18846 return true 18847 } 18848 // match: (Or64 _ (Const64 [-1])) 18849 // cond: 18850 // result: (Const64 [-1]) 18851 for { 18852 _ = v.Args[1] 18853 v_1 := v.Args[1] 18854 if v_1.Op != OpConst64 { 18855 break 18856 } 18857 if v_1.AuxInt != -1 { 18858 break 18859 } 18860 v.reset(OpConst64) 18861 v.AuxInt = -1 18862 return true 18863 } 18864 // match: (Or64 x (Or64 x y)) 18865 // cond: 18866 // result: (Or64 x y) 18867 for { 18868 _ = v.Args[1] 18869 x := v.Args[0] 18870 v_1 := v.Args[1] 18871 if v_1.Op != OpOr64 { 18872 break 18873 } 18874 _ = v_1.Args[1] 18875 if x != v_1.Args[0] { 18876 break 18877 } 18878 y := v_1.Args[1] 18879 v.reset(OpOr64) 18880 v.AddArg(x) 18881 v.AddArg(y) 18882 return true 18883 } 18884 // match: (Or64 x (Or64 y x)) 18885 // cond: 18886 // result: (Or64 x y) 18887 for { 18888 _ = v.Args[1] 18889 x := v.Args[0] 18890 v_1 := v.Args[1] 18891 if v_1.Op != OpOr64 { 18892 break 18893 } 18894 _ = v_1.Args[1] 18895 y := v_1.Args[0] 18896 if x != v_1.Args[1] { 18897 break 18898 } 18899 v.reset(OpOr64) 18900 v.AddArg(x) 18901 v.AddArg(y) 18902 return true 18903 } 18904 // match: (Or64 (Or64 x y) x) 18905 // cond: 18906 // result: (Or64 x y) 18907 for { 18908 _ = v.Args[1] 18909 v_0 := v.Args[0] 18910 if v_0.Op != OpOr64 { 18911 break 18912 } 18913 _ = v_0.Args[1] 18914 x := v_0.Args[0] 18915 y := v_0.Args[1] 18916 if x != v.Args[1] { 18917 break 18918 } 18919 v.reset(OpOr64) 18920 v.AddArg(x) 18921 v.AddArg(y) 18922 return true 18923 } 18924 return false 18925 } 18926 func rewriteValuegeneric_OpOr64_10(v *Value) bool { 18927 b := v.Block 18928 _ = b 18929 // match: (Or64 (Or64 y x) x) 18930 // cond: 18931 // result: (Or64 x y) 18932 for { 18933 _ = v.Args[1] 18934 v_0 := v.Args[0] 18935 if v_0.Op != OpOr64 { 18936 break 18937 } 18938 _ = v_0.Args[1] 18939 y := v_0.Args[0] 18940 x := v_0.Args[1] 18941 if x != v.Args[1] { 18942 break 18943 } 18944 v.reset(OpOr64) 18945 v.AddArg(x) 18946 v.AddArg(y) 18947 return true 18948 } 18949 // match: (Or64 (And64 x (Const64 [c2])) (Const64 <t> [c1])) 18950 // cond: ^(c1 | c2) == 0 18951 // result: (Or64 (Const64 <t> [c1]) x) 18952 for { 18953 _ = v.Args[1] 18954 v_0 := v.Args[0] 18955 if v_0.Op != OpAnd64 { 18956 break 18957 } 18958 _ = v_0.Args[1] 18959 x := v_0.Args[0] 18960 v_0_1 := v_0.Args[1] 18961 if v_0_1.Op != OpConst64 { 18962 break 18963 } 18964 c2 := v_0_1.AuxInt 18965 v_1 := v.Args[1] 18966 if v_1.Op != OpConst64 { 18967 break 18968 } 18969 t := v_1.Type 18970 c1 := v_1.AuxInt 18971 if !(^(c1 | c2) == 0) { 18972 break 18973 } 18974 v.reset(OpOr64) 18975 v0 := b.NewValue0(v.Pos, OpConst64, t) 18976 v0.AuxInt = c1 18977 v.AddArg(v0) 18978 v.AddArg(x) 18979 return true 18980 } 18981 // match: (Or64 (And64 (Const64 [c2]) x) (Const64 <t> [c1])) 18982 // cond: ^(c1 | c2) == 0 18983 // result: (Or64 (Const64 <t> [c1]) x) 18984 for { 18985 _ = v.Args[1] 18986 v_0 := v.Args[0] 18987 if v_0.Op != OpAnd64 { 18988 break 18989 } 18990 _ = v_0.Args[1] 18991 v_0_0 := v_0.Args[0] 18992 if v_0_0.Op != OpConst64 { 18993 break 18994 } 18995 c2 := v_0_0.AuxInt 18996 x := v_0.Args[1] 18997 v_1 := v.Args[1] 18998 if v_1.Op != OpConst64 { 18999 break 19000 } 19001 t := v_1.Type 19002 c1 := v_1.AuxInt 19003 if !(^(c1 | c2) == 0) { 19004 break 19005 } 19006 v.reset(OpOr64) 19007 v0 := b.NewValue0(v.Pos, OpConst64, t) 19008 v0.AuxInt = c1 19009 v.AddArg(v0) 19010 v.AddArg(x) 19011 return true 19012 } 19013 // match: (Or64 (Const64 <t> [c1]) (And64 x (Const64 [c2]))) 19014 // cond: ^(c1 | c2) == 0 19015 // result: (Or64 (Const64 <t> [c1]) x) 19016 for { 19017 _ = v.Args[1] 19018 v_0 := v.Args[0] 19019 if v_0.Op != OpConst64 { 19020 break 19021 } 19022 t := v_0.Type 19023 c1 := v_0.AuxInt 19024 v_1 := v.Args[1] 19025 if v_1.Op != OpAnd64 { 19026 break 19027 } 19028 _ = v_1.Args[1] 19029 x := v_1.Args[0] 19030 v_1_1 := v_1.Args[1] 19031 if v_1_1.Op != OpConst64 { 19032 break 19033 } 19034 c2 := v_1_1.AuxInt 19035 if !(^(c1 | c2) == 0) { 19036 break 19037 } 19038 v.reset(OpOr64) 19039 v0 := b.NewValue0(v.Pos, OpConst64, t) 19040 v0.AuxInt = c1 19041 v.AddArg(v0) 19042 v.AddArg(x) 19043 return true 19044 } 19045 // match: (Or64 (Const64 <t> [c1]) (And64 (Const64 [c2]) x)) 19046 // cond: ^(c1 | c2) == 0 19047 // result: (Or64 (Const64 <t> [c1]) x) 19048 for { 19049 _ = v.Args[1] 19050 v_0 := v.Args[0] 19051 if v_0.Op != OpConst64 { 19052 break 19053 } 19054 t := v_0.Type 19055 c1 := v_0.AuxInt 19056 v_1 := v.Args[1] 19057 if v_1.Op != OpAnd64 { 19058 break 19059 } 19060 _ = v_1.Args[1] 19061 v_1_0 := v_1.Args[0] 19062 if v_1_0.Op != OpConst64 { 19063 break 19064 } 19065 c2 := v_1_0.AuxInt 19066 x := v_1.Args[1] 19067 if !(^(c1 | c2) == 0) { 19068 break 19069 } 19070 v.reset(OpOr64) 19071 v0 := b.NewValue0(v.Pos, OpConst64, t) 19072 v0.AuxInt = c1 19073 v.AddArg(v0) 19074 v.AddArg(x) 19075 return true 19076 } 19077 // match: (Or64 (Or64 i:(Const64 <t>) z) x) 19078 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19079 // result: (Or64 i (Or64 <t> z x)) 19080 for { 19081 _ = v.Args[1] 19082 v_0 := v.Args[0] 19083 if v_0.Op != OpOr64 { 19084 break 19085 } 19086 _ = v_0.Args[1] 19087 i := v_0.Args[0] 19088 if i.Op != OpConst64 { 19089 break 19090 } 19091 t := i.Type 19092 z := v_0.Args[1] 19093 x := v.Args[1] 19094 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19095 break 19096 } 19097 v.reset(OpOr64) 19098 v.AddArg(i) 19099 v0 := b.NewValue0(v.Pos, OpOr64, t) 19100 v0.AddArg(z) 19101 v0.AddArg(x) 19102 v.AddArg(v0) 19103 return true 19104 } 19105 // match: (Or64 (Or64 z i:(Const64 <t>)) x) 19106 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19107 // result: (Or64 i (Or64 <t> z x)) 19108 for { 19109 _ = v.Args[1] 19110 v_0 := v.Args[0] 19111 if v_0.Op != OpOr64 { 19112 break 19113 } 19114 _ = v_0.Args[1] 19115 z := v_0.Args[0] 19116 i := v_0.Args[1] 19117 if i.Op != OpConst64 { 19118 break 19119 } 19120 t := i.Type 19121 x := v.Args[1] 19122 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19123 break 19124 } 19125 v.reset(OpOr64) 19126 v.AddArg(i) 19127 v0 := b.NewValue0(v.Pos, OpOr64, t) 19128 v0.AddArg(z) 19129 v0.AddArg(x) 19130 v.AddArg(v0) 19131 return true 19132 } 19133 // match: (Or64 x (Or64 i:(Const64 <t>) z)) 19134 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19135 // result: (Or64 i (Or64 <t> z x)) 19136 for { 19137 _ = v.Args[1] 19138 x := v.Args[0] 19139 v_1 := v.Args[1] 19140 if v_1.Op != OpOr64 { 19141 break 19142 } 19143 _ = v_1.Args[1] 19144 i := v_1.Args[0] 19145 if i.Op != OpConst64 { 19146 break 19147 } 19148 t := i.Type 19149 z := v_1.Args[1] 19150 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19151 break 19152 } 19153 v.reset(OpOr64) 19154 v.AddArg(i) 19155 v0 := b.NewValue0(v.Pos, OpOr64, t) 19156 v0.AddArg(z) 19157 v0.AddArg(x) 19158 v.AddArg(v0) 19159 return true 19160 } 19161 // match: (Or64 x (Or64 z i:(Const64 <t>))) 19162 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19163 // result: (Or64 i (Or64 <t> z x)) 19164 for { 19165 _ = v.Args[1] 19166 x := v.Args[0] 19167 v_1 := v.Args[1] 19168 if v_1.Op != OpOr64 { 19169 break 19170 } 19171 _ = v_1.Args[1] 19172 z := v_1.Args[0] 19173 i := v_1.Args[1] 19174 if i.Op != OpConst64 { 19175 break 19176 } 19177 t := i.Type 19178 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19179 break 19180 } 19181 v.reset(OpOr64) 19182 v.AddArg(i) 19183 v0 := b.NewValue0(v.Pos, OpOr64, t) 19184 v0.AddArg(z) 19185 v0.AddArg(x) 19186 v.AddArg(v0) 19187 return true 19188 } 19189 // match: (Or64 (Const64 <t> [c]) (Or64 (Const64 <t> [d]) x)) 19190 // cond: 19191 // result: (Or64 (Const64 <t> [c|d]) x) 19192 for { 19193 _ = v.Args[1] 19194 v_0 := v.Args[0] 19195 if v_0.Op != OpConst64 { 19196 break 19197 } 19198 t := v_0.Type 19199 c := v_0.AuxInt 19200 v_1 := v.Args[1] 19201 if v_1.Op != OpOr64 { 19202 break 19203 } 19204 _ = v_1.Args[1] 19205 v_1_0 := v_1.Args[0] 19206 if v_1_0.Op != OpConst64 { 19207 break 19208 } 19209 if v_1_0.Type != t { 19210 break 19211 } 19212 d := v_1_0.AuxInt 19213 x := v_1.Args[1] 19214 v.reset(OpOr64) 19215 v0 := b.NewValue0(v.Pos, OpConst64, t) 19216 v0.AuxInt = c | d 19217 v.AddArg(v0) 19218 v.AddArg(x) 19219 return true 19220 } 19221 return false 19222 } 19223 func rewriteValuegeneric_OpOr64_20(v *Value) bool { 19224 b := v.Block 19225 _ = b 19226 // match: (Or64 (Const64 <t> [c]) (Or64 x (Const64 <t> [d]))) 19227 // cond: 19228 // result: (Or64 (Const64 <t> [c|d]) x) 19229 for { 19230 _ = v.Args[1] 19231 v_0 := v.Args[0] 19232 if v_0.Op != OpConst64 { 19233 break 19234 } 19235 t := v_0.Type 19236 c := v_0.AuxInt 19237 v_1 := v.Args[1] 19238 if v_1.Op != OpOr64 { 19239 break 19240 } 19241 _ = v_1.Args[1] 19242 x := v_1.Args[0] 19243 v_1_1 := v_1.Args[1] 19244 if v_1_1.Op != OpConst64 { 19245 break 19246 } 19247 if v_1_1.Type != t { 19248 break 19249 } 19250 d := v_1_1.AuxInt 19251 v.reset(OpOr64) 19252 v0 := b.NewValue0(v.Pos, OpConst64, t) 19253 v0.AuxInt = c | d 19254 v.AddArg(v0) 19255 v.AddArg(x) 19256 return true 19257 } 19258 // match: (Or64 (Or64 (Const64 <t> [d]) x) (Const64 <t> [c])) 19259 // cond: 19260 // result: (Or64 (Const64 <t> [c|d]) x) 19261 for { 19262 _ = v.Args[1] 19263 v_0 := v.Args[0] 19264 if v_0.Op != OpOr64 { 19265 break 19266 } 19267 _ = v_0.Args[1] 19268 v_0_0 := v_0.Args[0] 19269 if v_0_0.Op != OpConst64 { 19270 break 19271 } 19272 t := v_0_0.Type 19273 d := v_0_0.AuxInt 19274 x := v_0.Args[1] 19275 v_1 := v.Args[1] 19276 if v_1.Op != OpConst64 { 19277 break 19278 } 19279 if v_1.Type != t { 19280 break 19281 } 19282 c := v_1.AuxInt 19283 v.reset(OpOr64) 19284 v0 := b.NewValue0(v.Pos, OpConst64, t) 19285 v0.AuxInt = c | d 19286 v.AddArg(v0) 19287 v.AddArg(x) 19288 return true 19289 } 19290 // match: (Or64 (Or64 x (Const64 <t> [d])) (Const64 <t> [c])) 19291 // cond: 19292 // result: (Or64 (Const64 <t> [c|d]) x) 19293 for { 19294 _ = v.Args[1] 19295 v_0 := v.Args[0] 19296 if v_0.Op != OpOr64 { 19297 break 19298 } 19299 _ = v_0.Args[1] 19300 x := v_0.Args[0] 19301 v_0_1 := v_0.Args[1] 19302 if v_0_1.Op != OpConst64 { 19303 break 19304 } 19305 t := v_0_1.Type 19306 d := v_0_1.AuxInt 19307 v_1 := v.Args[1] 19308 if v_1.Op != OpConst64 { 19309 break 19310 } 19311 if v_1.Type != t { 19312 break 19313 } 19314 c := v_1.AuxInt 19315 v.reset(OpOr64) 19316 v0 := b.NewValue0(v.Pos, OpConst64, t) 19317 v0.AuxInt = c | d 19318 v.AddArg(v0) 19319 v.AddArg(x) 19320 return true 19321 } 19322 return false 19323 } 19324 func rewriteValuegeneric_OpOr8_0(v *Value) bool { 19325 // match: (Or8 (Const8 [c]) (Const8 [d])) 19326 // cond: 19327 // result: (Const8 [int64(int8(c|d))]) 19328 for { 19329 _ = v.Args[1] 19330 v_0 := v.Args[0] 19331 if v_0.Op != OpConst8 { 19332 break 19333 } 19334 c := v_0.AuxInt 19335 v_1 := v.Args[1] 19336 if v_1.Op != OpConst8 { 19337 break 19338 } 19339 d := v_1.AuxInt 19340 v.reset(OpConst8) 19341 v.AuxInt = int64(int8(c | d)) 19342 return true 19343 } 19344 // match: (Or8 (Const8 [d]) (Const8 [c])) 19345 // cond: 19346 // result: (Const8 [int64(int8(c|d))]) 19347 for { 19348 _ = v.Args[1] 19349 v_0 := v.Args[0] 19350 if v_0.Op != OpConst8 { 19351 break 19352 } 19353 d := v_0.AuxInt 19354 v_1 := v.Args[1] 19355 if v_1.Op != OpConst8 { 19356 break 19357 } 19358 c := v_1.AuxInt 19359 v.reset(OpConst8) 19360 v.AuxInt = int64(int8(c | d)) 19361 return true 19362 } 19363 // match: (Or8 x x) 19364 // cond: 19365 // result: x 19366 for { 19367 _ = v.Args[1] 19368 x := v.Args[0] 19369 if x != v.Args[1] { 19370 break 19371 } 19372 v.reset(OpCopy) 19373 v.Type = x.Type 19374 v.AddArg(x) 19375 return true 19376 } 19377 // match: (Or8 (Const8 [0]) x) 19378 // cond: 19379 // result: x 19380 for { 19381 _ = v.Args[1] 19382 v_0 := v.Args[0] 19383 if v_0.Op != OpConst8 { 19384 break 19385 } 19386 if v_0.AuxInt != 0 { 19387 break 19388 } 19389 x := v.Args[1] 19390 v.reset(OpCopy) 19391 v.Type = x.Type 19392 v.AddArg(x) 19393 return true 19394 } 19395 // match: (Or8 x (Const8 [0])) 19396 // cond: 19397 // result: x 19398 for { 19399 _ = v.Args[1] 19400 x := v.Args[0] 19401 v_1 := v.Args[1] 19402 if v_1.Op != OpConst8 { 19403 break 19404 } 19405 if v_1.AuxInt != 0 { 19406 break 19407 } 19408 v.reset(OpCopy) 19409 v.Type = x.Type 19410 v.AddArg(x) 19411 return true 19412 } 19413 // match: (Or8 (Const8 [-1]) _) 19414 // cond: 19415 // result: (Const8 [-1]) 19416 for { 19417 _ = v.Args[1] 19418 v_0 := v.Args[0] 19419 if v_0.Op != OpConst8 { 19420 break 19421 } 19422 if v_0.AuxInt != -1 { 19423 break 19424 } 19425 v.reset(OpConst8) 19426 v.AuxInt = -1 19427 return true 19428 } 19429 // match: (Or8 _ (Const8 [-1])) 19430 // cond: 19431 // result: (Const8 [-1]) 19432 for { 19433 _ = v.Args[1] 19434 v_1 := v.Args[1] 19435 if v_1.Op != OpConst8 { 19436 break 19437 } 19438 if v_1.AuxInt != -1 { 19439 break 19440 } 19441 v.reset(OpConst8) 19442 v.AuxInt = -1 19443 return true 19444 } 19445 // match: (Or8 x (Or8 x y)) 19446 // cond: 19447 // result: (Or8 x y) 19448 for { 19449 _ = v.Args[1] 19450 x := v.Args[0] 19451 v_1 := v.Args[1] 19452 if v_1.Op != OpOr8 { 19453 break 19454 } 19455 _ = v_1.Args[1] 19456 if x != v_1.Args[0] { 19457 break 19458 } 19459 y := v_1.Args[1] 19460 v.reset(OpOr8) 19461 v.AddArg(x) 19462 v.AddArg(y) 19463 return true 19464 } 19465 // match: (Or8 x (Or8 y x)) 19466 // cond: 19467 // result: (Or8 x y) 19468 for { 19469 _ = v.Args[1] 19470 x := v.Args[0] 19471 v_1 := v.Args[1] 19472 if v_1.Op != OpOr8 { 19473 break 19474 } 19475 _ = v_1.Args[1] 19476 y := v_1.Args[0] 19477 if x != v_1.Args[1] { 19478 break 19479 } 19480 v.reset(OpOr8) 19481 v.AddArg(x) 19482 v.AddArg(y) 19483 return true 19484 } 19485 // match: (Or8 (Or8 x y) x) 19486 // cond: 19487 // result: (Or8 x y) 19488 for { 19489 _ = v.Args[1] 19490 v_0 := v.Args[0] 19491 if v_0.Op != OpOr8 { 19492 break 19493 } 19494 _ = v_0.Args[1] 19495 x := v_0.Args[0] 19496 y := v_0.Args[1] 19497 if x != v.Args[1] { 19498 break 19499 } 19500 v.reset(OpOr8) 19501 v.AddArg(x) 19502 v.AddArg(y) 19503 return true 19504 } 19505 return false 19506 } 19507 func rewriteValuegeneric_OpOr8_10(v *Value) bool { 19508 b := v.Block 19509 _ = b 19510 // match: (Or8 (Or8 y x) x) 19511 // cond: 19512 // result: (Or8 x y) 19513 for { 19514 _ = v.Args[1] 19515 v_0 := v.Args[0] 19516 if v_0.Op != OpOr8 { 19517 break 19518 } 19519 _ = v_0.Args[1] 19520 y := v_0.Args[0] 19521 x := v_0.Args[1] 19522 if x != v.Args[1] { 19523 break 19524 } 19525 v.reset(OpOr8) 19526 v.AddArg(x) 19527 v.AddArg(y) 19528 return true 19529 } 19530 // match: (Or8 (And8 x (Const8 [c2])) (Const8 <t> [c1])) 19531 // cond: ^(c1 | c2) == 0 19532 // result: (Or8 (Const8 <t> [c1]) x) 19533 for { 19534 _ = v.Args[1] 19535 v_0 := v.Args[0] 19536 if v_0.Op != OpAnd8 { 19537 break 19538 } 19539 _ = v_0.Args[1] 19540 x := v_0.Args[0] 19541 v_0_1 := v_0.Args[1] 19542 if v_0_1.Op != OpConst8 { 19543 break 19544 } 19545 c2 := v_0_1.AuxInt 19546 v_1 := v.Args[1] 19547 if v_1.Op != OpConst8 { 19548 break 19549 } 19550 t := v_1.Type 19551 c1 := v_1.AuxInt 19552 if !(^(c1 | c2) == 0) { 19553 break 19554 } 19555 v.reset(OpOr8) 19556 v0 := b.NewValue0(v.Pos, OpConst8, t) 19557 v0.AuxInt = c1 19558 v.AddArg(v0) 19559 v.AddArg(x) 19560 return true 19561 } 19562 // match: (Or8 (And8 (Const8 [c2]) x) (Const8 <t> [c1])) 19563 // cond: ^(c1 | c2) == 0 19564 // result: (Or8 (Const8 <t> [c1]) x) 19565 for { 19566 _ = v.Args[1] 19567 v_0 := v.Args[0] 19568 if v_0.Op != OpAnd8 { 19569 break 19570 } 19571 _ = v_0.Args[1] 19572 v_0_0 := v_0.Args[0] 19573 if v_0_0.Op != OpConst8 { 19574 break 19575 } 19576 c2 := v_0_0.AuxInt 19577 x := v_0.Args[1] 19578 v_1 := v.Args[1] 19579 if v_1.Op != OpConst8 { 19580 break 19581 } 19582 t := v_1.Type 19583 c1 := v_1.AuxInt 19584 if !(^(c1 | c2) == 0) { 19585 break 19586 } 19587 v.reset(OpOr8) 19588 v0 := b.NewValue0(v.Pos, OpConst8, t) 19589 v0.AuxInt = c1 19590 v.AddArg(v0) 19591 v.AddArg(x) 19592 return true 19593 } 19594 // match: (Or8 (Const8 <t> [c1]) (And8 x (Const8 [c2]))) 19595 // cond: ^(c1 | c2) == 0 19596 // result: (Or8 (Const8 <t> [c1]) x) 19597 for { 19598 _ = v.Args[1] 19599 v_0 := v.Args[0] 19600 if v_0.Op != OpConst8 { 19601 break 19602 } 19603 t := v_0.Type 19604 c1 := v_0.AuxInt 19605 v_1 := v.Args[1] 19606 if v_1.Op != OpAnd8 { 19607 break 19608 } 19609 _ = v_1.Args[1] 19610 x := v_1.Args[0] 19611 v_1_1 := v_1.Args[1] 19612 if v_1_1.Op != OpConst8 { 19613 break 19614 } 19615 c2 := v_1_1.AuxInt 19616 if !(^(c1 | c2) == 0) { 19617 break 19618 } 19619 v.reset(OpOr8) 19620 v0 := b.NewValue0(v.Pos, OpConst8, t) 19621 v0.AuxInt = c1 19622 v.AddArg(v0) 19623 v.AddArg(x) 19624 return true 19625 } 19626 // match: (Or8 (Const8 <t> [c1]) (And8 (Const8 [c2]) x)) 19627 // cond: ^(c1 | c2) == 0 19628 // result: (Or8 (Const8 <t> [c1]) x) 19629 for { 19630 _ = v.Args[1] 19631 v_0 := v.Args[0] 19632 if v_0.Op != OpConst8 { 19633 break 19634 } 19635 t := v_0.Type 19636 c1 := v_0.AuxInt 19637 v_1 := v.Args[1] 19638 if v_1.Op != OpAnd8 { 19639 break 19640 } 19641 _ = v_1.Args[1] 19642 v_1_0 := v_1.Args[0] 19643 if v_1_0.Op != OpConst8 { 19644 break 19645 } 19646 c2 := v_1_0.AuxInt 19647 x := v_1.Args[1] 19648 if !(^(c1 | c2) == 0) { 19649 break 19650 } 19651 v.reset(OpOr8) 19652 v0 := b.NewValue0(v.Pos, OpConst8, t) 19653 v0.AuxInt = c1 19654 v.AddArg(v0) 19655 v.AddArg(x) 19656 return true 19657 } 19658 // match: (Or8 (Or8 i:(Const8 <t>) z) x) 19659 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 19660 // result: (Or8 i (Or8 <t> z x)) 19661 for { 19662 _ = v.Args[1] 19663 v_0 := v.Args[0] 19664 if v_0.Op != OpOr8 { 19665 break 19666 } 19667 _ = v_0.Args[1] 19668 i := v_0.Args[0] 19669 if i.Op != OpConst8 { 19670 break 19671 } 19672 t := i.Type 19673 z := v_0.Args[1] 19674 x := v.Args[1] 19675 if !(z.Op != OpConst8 && x.Op != OpConst8) { 19676 break 19677 } 19678 v.reset(OpOr8) 19679 v.AddArg(i) 19680 v0 := b.NewValue0(v.Pos, OpOr8, t) 19681 v0.AddArg(z) 19682 v0.AddArg(x) 19683 v.AddArg(v0) 19684 return true 19685 } 19686 // match: (Or8 (Or8 z i:(Const8 <t>)) x) 19687 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 19688 // result: (Or8 i (Or8 <t> z x)) 19689 for { 19690 _ = v.Args[1] 19691 v_0 := v.Args[0] 19692 if v_0.Op != OpOr8 { 19693 break 19694 } 19695 _ = v_0.Args[1] 19696 z := v_0.Args[0] 19697 i := v_0.Args[1] 19698 if i.Op != OpConst8 { 19699 break 19700 } 19701 t := i.Type 19702 x := v.Args[1] 19703 if !(z.Op != OpConst8 && x.Op != OpConst8) { 19704 break 19705 } 19706 v.reset(OpOr8) 19707 v.AddArg(i) 19708 v0 := b.NewValue0(v.Pos, OpOr8, t) 19709 v0.AddArg(z) 19710 v0.AddArg(x) 19711 v.AddArg(v0) 19712 return true 19713 } 19714 // match: (Or8 x (Or8 i:(Const8 <t>) z)) 19715 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 19716 // result: (Or8 i (Or8 <t> z x)) 19717 for { 19718 _ = v.Args[1] 19719 x := v.Args[0] 19720 v_1 := v.Args[1] 19721 if v_1.Op != OpOr8 { 19722 break 19723 } 19724 _ = v_1.Args[1] 19725 i := v_1.Args[0] 19726 if i.Op != OpConst8 { 19727 break 19728 } 19729 t := i.Type 19730 z := v_1.Args[1] 19731 if !(z.Op != OpConst8 && x.Op != OpConst8) { 19732 break 19733 } 19734 v.reset(OpOr8) 19735 v.AddArg(i) 19736 v0 := b.NewValue0(v.Pos, OpOr8, t) 19737 v0.AddArg(z) 19738 v0.AddArg(x) 19739 v.AddArg(v0) 19740 return true 19741 } 19742 // match: (Or8 x (Or8 z i:(Const8 <t>))) 19743 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 19744 // result: (Or8 i (Or8 <t> z x)) 19745 for { 19746 _ = v.Args[1] 19747 x := v.Args[0] 19748 v_1 := v.Args[1] 19749 if v_1.Op != OpOr8 { 19750 break 19751 } 19752 _ = v_1.Args[1] 19753 z := v_1.Args[0] 19754 i := v_1.Args[1] 19755 if i.Op != OpConst8 { 19756 break 19757 } 19758 t := i.Type 19759 if !(z.Op != OpConst8 && x.Op != OpConst8) { 19760 break 19761 } 19762 v.reset(OpOr8) 19763 v.AddArg(i) 19764 v0 := b.NewValue0(v.Pos, OpOr8, t) 19765 v0.AddArg(z) 19766 v0.AddArg(x) 19767 v.AddArg(v0) 19768 return true 19769 } 19770 // match: (Or8 (Const8 <t> [c]) (Or8 (Const8 <t> [d]) x)) 19771 // cond: 19772 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 19773 for { 19774 _ = v.Args[1] 19775 v_0 := v.Args[0] 19776 if v_0.Op != OpConst8 { 19777 break 19778 } 19779 t := v_0.Type 19780 c := v_0.AuxInt 19781 v_1 := v.Args[1] 19782 if v_1.Op != OpOr8 { 19783 break 19784 } 19785 _ = v_1.Args[1] 19786 v_1_0 := v_1.Args[0] 19787 if v_1_0.Op != OpConst8 { 19788 break 19789 } 19790 if v_1_0.Type != t { 19791 break 19792 } 19793 d := v_1_0.AuxInt 19794 x := v_1.Args[1] 19795 v.reset(OpOr8) 19796 v0 := b.NewValue0(v.Pos, OpConst8, t) 19797 v0.AuxInt = int64(int8(c | d)) 19798 v.AddArg(v0) 19799 v.AddArg(x) 19800 return true 19801 } 19802 return false 19803 } 19804 func rewriteValuegeneric_OpOr8_20(v *Value) bool { 19805 b := v.Block 19806 _ = b 19807 // match: (Or8 (Const8 <t> [c]) (Or8 x (Const8 <t> [d]))) 19808 // cond: 19809 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 19810 for { 19811 _ = v.Args[1] 19812 v_0 := v.Args[0] 19813 if v_0.Op != OpConst8 { 19814 break 19815 } 19816 t := v_0.Type 19817 c := v_0.AuxInt 19818 v_1 := v.Args[1] 19819 if v_1.Op != OpOr8 { 19820 break 19821 } 19822 _ = v_1.Args[1] 19823 x := v_1.Args[0] 19824 v_1_1 := v_1.Args[1] 19825 if v_1_1.Op != OpConst8 { 19826 break 19827 } 19828 if v_1_1.Type != t { 19829 break 19830 } 19831 d := v_1_1.AuxInt 19832 v.reset(OpOr8) 19833 v0 := b.NewValue0(v.Pos, OpConst8, t) 19834 v0.AuxInt = int64(int8(c | d)) 19835 v.AddArg(v0) 19836 v.AddArg(x) 19837 return true 19838 } 19839 // match: (Or8 (Or8 (Const8 <t> [d]) x) (Const8 <t> [c])) 19840 // cond: 19841 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 19842 for { 19843 _ = v.Args[1] 19844 v_0 := v.Args[0] 19845 if v_0.Op != OpOr8 { 19846 break 19847 } 19848 _ = v_0.Args[1] 19849 v_0_0 := v_0.Args[0] 19850 if v_0_0.Op != OpConst8 { 19851 break 19852 } 19853 t := v_0_0.Type 19854 d := v_0_0.AuxInt 19855 x := v_0.Args[1] 19856 v_1 := v.Args[1] 19857 if v_1.Op != OpConst8 { 19858 break 19859 } 19860 if v_1.Type != t { 19861 break 19862 } 19863 c := v_1.AuxInt 19864 v.reset(OpOr8) 19865 v0 := b.NewValue0(v.Pos, OpConst8, t) 19866 v0.AuxInt = int64(int8(c | d)) 19867 v.AddArg(v0) 19868 v.AddArg(x) 19869 return true 19870 } 19871 // match: (Or8 (Or8 x (Const8 <t> [d])) (Const8 <t> [c])) 19872 // cond: 19873 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 19874 for { 19875 _ = v.Args[1] 19876 v_0 := v.Args[0] 19877 if v_0.Op != OpOr8 { 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 != OpConst8 { 19884 break 19885 } 19886 t := v_0_1.Type 19887 d := v_0_1.AuxInt 19888 v_1 := v.Args[1] 19889 if v_1.Op != OpConst8 { 19890 break 19891 } 19892 if v_1.Type != t { 19893 break 19894 } 19895 c := v_1.AuxInt 19896 v.reset(OpOr8) 19897 v0 := b.NewValue0(v.Pos, OpConst8, t) 19898 v0.AuxInt = int64(int8(c | d)) 19899 v.AddArg(v0) 19900 v.AddArg(x) 19901 return true 19902 } 19903 return false 19904 } 19905 func rewriteValuegeneric_OpPhi_0(v *Value) bool { 19906 // match: (Phi (Const8 [c]) (Const8 [c])) 19907 // cond: 19908 // result: (Const8 [c]) 19909 for { 19910 _ = v.Args[1] 19911 v_0 := v.Args[0] 19912 if v_0.Op != OpConst8 { 19913 break 19914 } 19915 c := v_0.AuxInt 19916 v_1 := v.Args[1] 19917 if v_1.Op != OpConst8 { 19918 break 19919 } 19920 if v_1.AuxInt != c { 19921 break 19922 } 19923 if len(v.Args) != 2 { 19924 break 19925 } 19926 v.reset(OpConst8) 19927 v.AuxInt = c 19928 return true 19929 } 19930 // match: (Phi (Const16 [c]) (Const16 [c])) 19931 // cond: 19932 // result: (Const16 [c]) 19933 for { 19934 _ = v.Args[1] 19935 v_0 := v.Args[0] 19936 if v_0.Op != OpConst16 { 19937 break 19938 } 19939 c := v_0.AuxInt 19940 v_1 := v.Args[1] 19941 if v_1.Op != OpConst16 { 19942 break 19943 } 19944 if v_1.AuxInt != c { 19945 break 19946 } 19947 if len(v.Args) != 2 { 19948 break 19949 } 19950 v.reset(OpConst16) 19951 v.AuxInt = c 19952 return true 19953 } 19954 // match: (Phi (Const32 [c]) (Const32 [c])) 19955 // cond: 19956 // result: (Const32 [c]) 19957 for { 19958 _ = v.Args[1] 19959 v_0 := v.Args[0] 19960 if v_0.Op != OpConst32 { 19961 break 19962 } 19963 c := v_0.AuxInt 19964 v_1 := v.Args[1] 19965 if v_1.Op != OpConst32 { 19966 break 19967 } 19968 if v_1.AuxInt != c { 19969 break 19970 } 19971 if len(v.Args) != 2 { 19972 break 19973 } 19974 v.reset(OpConst32) 19975 v.AuxInt = c 19976 return true 19977 } 19978 // match: (Phi (Const64 [c]) (Const64 [c])) 19979 // cond: 19980 // result: (Const64 [c]) 19981 for { 19982 _ = v.Args[1] 19983 v_0 := v.Args[0] 19984 if v_0.Op != OpConst64 { 19985 break 19986 } 19987 c := v_0.AuxInt 19988 v_1 := v.Args[1] 19989 if v_1.Op != OpConst64 { 19990 break 19991 } 19992 if v_1.AuxInt != c { 19993 break 19994 } 19995 if len(v.Args) != 2 { 19996 break 19997 } 19998 v.reset(OpConst64) 19999 v.AuxInt = c 20000 return true 20001 } 20002 return false 20003 } 20004 func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { 20005 b := v.Block 20006 _ = b 20007 config := b.Func.Config 20008 _ = config 20009 typ := &b.Func.Config.Types 20010 _ = typ 20011 // match: (PtrIndex <t> ptr idx) 20012 // cond: config.PtrSize == 4 20013 // result: (AddPtr ptr (Mul32 <typ.Int> idx (Const32 <typ.Int> [t.ElemType().Size()]))) 20014 for { 20015 t := v.Type 20016 _ = v.Args[1] 20017 ptr := v.Args[0] 20018 idx := v.Args[1] 20019 if !(config.PtrSize == 4) { 20020 break 20021 } 20022 v.reset(OpAddPtr) 20023 v.AddArg(ptr) 20024 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) 20025 v0.AddArg(idx) 20026 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 20027 v1.AuxInt = t.ElemType().Size() 20028 v0.AddArg(v1) 20029 v.AddArg(v0) 20030 return true 20031 } 20032 // match: (PtrIndex <t> ptr idx) 20033 // cond: config.PtrSize == 8 20034 // result: (AddPtr ptr (Mul64 <typ.Int> idx (Const64 <typ.Int> [t.ElemType().Size()]))) 20035 for { 20036 t := v.Type 20037 _ = v.Args[1] 20038 ptr := v.Args[0] 20039 idx := v.Args[1] 20040 if !(config.PtrSize == 8) { 20041 break 20042 } 20043 v.reset(OpAddPtr) 20044 v.AddArg(ptr) 20045 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) 20046 v0.AddArg(idx) 20047 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 20048 v1.AuxInt = t.ElemType().Size() 20049 v0.AddArg(v1) 20050 v.AddArg(v0) 20051 return true 20052 } 20053 return false 20054 } 20055 func rewriteValuegeneric_OpRound32F_0(v *Value) bool { 20056 // match: (Round32F x:(Const32F)) 20057 // cond: 20058 // result: x 20059 for { 20060 x := v.Args[0] 20061 if x.Op != OpConst32F { 20062 break 20063 } 20064 v.reset(OpCopy) 20065 v.Type = x.Type 20066 v.AddArg(x) 20067 return true 20068 } 20069 return false 20070 } 20071 func rewriteValuegeneric_OpRound64F_0(v *Value) bool { 20072 // match: (Round64F x:(Const64F)) 20073 // cond: 20074 // result: x 20075 for { 20076 x := v.Args[0] 20077 if x.Op != OpConst64F { 20078 break 20079 } 20080 v.reset(OpCopy) 20081 v.Type = x.Type 20082 v.AddArg(x) 20083 return true 20084 } 20085 return false 20086 } 20087 func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { 20088 b := v.Block 20089 _ = b 20090 // match: (Rsh16Ux16 <t> x (Const16 [c])) 20091 // cond: 20092 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))])) 20093 for { 20094 t := v.Type 20095 _ = v.Args[1] 20096 x := v.Args[0] 20097 v_1 := v.Args[1] 20098 if v_1.Op != OpConst16 { 20099 break 20100 } 20101 c := v_1.AuxInt 20102 v.reset(OpRsh16Ux64) 20103 v.AddArg(x) 20104 v0 := b.NewValue0(v.Pos, OpConst64, t) 20105 v0.AuxInt = int64(uint16(c)) 20106 v.AddArg(v0) 20107 return true 20108 } 20109 // match: (Rsh16Ux16 (Const16 [0]) _) 20110 // cond: 20111 // result: (Const16 [0]) 20112 for { 20113 _ = v.Args[1] 20114 v_0 := v.Args[0] 20115 if v_0.Op != OpConst16 { 20116 break 20117 } 20118 if v_0.AuxInt != 0 { 20119 break 20120 } 20121 v.reset(OpConst16) 20122 v.AuxInt = 0 20123 return true 20124 } 20125 return false 20126 } 20127 func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { 20128 b := v.Block 20129 _ = b 20130 // match: (Rsh16Ux32 <t> x (Const32 [c])) 20131 // cond: 20132 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))])) 20133 for { 20134 t := v.Type 20135 _ = v.Args[1] 20136 x := v.Args[0] 20137 v_1 := v.Args[1] 20138 if v_1.Op != OpConst32 { 20139 break 20140 } 20141 c := v_1.AuxInt 20142 v.reset(OpRsh16Ux64) 20143 v.AddArg(x) 20144 v0 := b.NewValue0(v.Pos, OpConst64, t) 20145 v0.AuxInt = int64(uint32(c)) 20146 v.AddArg(v0) 20147 return true 20148 } 20149 // match: (Rsh16Ux32 (Const16 [0]) _) 20150 // cond: 20151 // result: (Const16 [0]) 20152 for { 20153 _ = v.Args[1] 20154 v_0 := v.Args[0] 20155 if v_0.Op != OpConst16 { 20156 break 20157 } 20158 if v_0.AuxInt != 0 { 20159 break 20160 } 20161 v.reset(OpConst16) 20162 v.AuxInt = 0 20163 return true 20164 } 20165 return false 20166 } 20167 func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { 20168 b := v.Block 20169 _ = b 20170 typ := &b.Func.Config.Types 20171 _ = typ 20172 // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) 20173 // cond: 20174 // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) 20175 for { 20176 _ = v.Args[1] 20177 v_0 := v.Args[0] 20178 if v_0.Op != OpConst16 { 20179 break 20180 } 20181 c := v_0.AuxInt 20182 v_1 := v.Args[1] 20183 if v_1.Op != OpConst64 { 20184 break 20185 } 20186 d := v_1.AuxInt 20187 v.reset(OpConst16) 20188 v.AuxInt = int64(int16(uint16(c) >> uint64(d))) 20189 return true 20190 } 20191 // match: (Rsh16Ux64 x (Const64 [0])) 20192 // cond: 20193 // result: x 20194 for { 20195 _ = v.Args[1] 20196 x := v.Args[0] 20197 v_1 := v.Args[1] 20198 if v_1.Op != OpConst64 { 20199 break 20200 } 20201 if v_1.AuxInt != 0 { 20202 break 20203 } 20204 v.reset(OpCopy) 20205 v.Type = x.Type 20206 v.AddArg(x) 20207 return true 20208 } 20209 // match: (Rsh16Ux64 (Const16 [0]) _) 20210 // cond: 20211 // result: (Const16 [0]) 20212 for { 20213 _ = v.Args[1] 20214 v_0 := v.Args[0] 20215 if v_0.Op != OpConst16 { 20216 break 20217 } 20218 if v_0.AuxInt != 0 { 20219 break 20220 } 20221 v.reset(OpConst16) 20222 v.AuxInt = 0 20223 return true 20224 } 20225 // match: (Rsh16Ux64 _ (Const64 [c])) 20226 // cond: uint64(c) >= 16 20227 // result: (Const16 [0]) 20228 for { 20229 _ = v.Args[1] 20230 v_1 := v.Args[1] 20231 if v_1.Op != OpConst64 { 20232 break 20233 } 20234 c := v_1.AuxInt 20235 if !(uint64(c) >= 16) { 20236 break 20237 } 20238 v.reset(OpConst16) 20239 v.AuxInt = 0 20240 return true 20241 } 20242 // match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) 20243 // cond: !uaddOvf(c,d) 20244 // result: (Rsh16Ux64 x (Const64 <t> [c+d])) 20245 for { 20246 t := v.Type 20247 _ = v.Args[1] 20248 v_0 := v.Args[0] 20249 if v_0.Op != OpRsh16Ux64 { 20250 break 20251 } 20252 _ = v_0.Args[1] 20253 x := v_0.Args[0] 20254 v_0_1 := v_0.Args[1] 20255 if v_0_1.Op != OpConst64 { 20256 break 20257 } 20258 c := v_0_1.AuxInt 20259 v_1 := v.Args[1] 20260 if v_1.Op != OpConst64 { 20261 break 20262 } 20263 d := v_1.AuxInt 20264 if !(!uaddOvf(c, d)) { 20265 break 20266 } 20267 v.reset(OpRsh16Ux64) 20268 v.AddArg(x) 20269 v0 := b.NewValue0(v.Pos, OpConst64, t) 20270 v0.AuxInt = c + d 20271 v.AddArg(v0) 20272 return true 20273 } 20274 // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 20275 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 20276 // result: (Rsh16Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 20277 for { 20278 _ = v.Args[1] 20279 v_0 := v.Args[0] 20280 if v_0.Op != OpLsh16x64 { 20281 break 20282 } 20283 _ = v_0.Args[1] 20284 v_0_0 := v_0.Args[0] 20285 if v_0_0.Op != OpRsh16Ux64 { 20286 break 20287 } 20288 _ = v_0_0.Args[1] 20289 x := v_0_0.Args[0] 20290 v_0_0_1 := v_0_0.Args[1] 20291 if v_0_0_1.Op != OpConst64 { 20292 break 20293 } 20294 c1 := v_0_0_1.AuxInt 20295 v_0_1 := v_0.Args[1] 20296 if v_0_1.Op != OpConst64 { 20297 break 20298 } 20299 c2 := v_0_1.AuxInt 20300 v_1 := v.Args[1] 20301 if v_1.Op != OpConst64 { 20302 break 20303 } 20304 c3 := v_1.AuxInt 20305 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 20306 break 20307 } 20308 v.reset(OpRsh16Ux64) 20309 v.AddArg(x) 20310 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 20311 v0.AuxInt = c1 - c2 + c3 20312 v.AddArg(v0) 20313 return true 20314 } 20315 // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 20316 // cond: 20317 // result: (ZeroExt8to16 (Trunc16to8 <typ.UInt8> x)) 20318 for { 20319 _ = v.Args[1] 20320 v_0 := v.Args[0] 20321 if v_0.Op != OpLsh16x64 { 20322 break 20323 } 20324 _ = v_0.Args[1] 20325 x := v_0.Args[0] 20326 v_0_1 := v_0.Args[1] 20327 if v_0_1.Op != OpConst64 { 20328 break 20329 } 20330 if v_0_1.AuxInt != 8 { 20331 break 20332 } 20333 v_1 := v.Args[1] 20334 if v_1.Op != OpConst64 { 20335 break 20336 } 20337 if v_1.AuxInt != 8 { 20338 break 20339 } 20340 v.reset(OpZeroExt8to16) 20341 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) 20342 v0.AddArg(x) 20343 v.AddArg(v0) 20344 return true 20345 } 20346 return false 20347 } 20348 func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { 20349 b := v.Block 20350 _ = b 20351 // match: (Rsh16Ux8 <t> x (Const8 [c])) 20352 // cond: 20353 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))])) 20354 for { 20355 t := v.Type 20356 _ = v.Args[1] 20357 x := v.Args[0] 20358 v_1 := v.Args[1] 20359 if v_1.Op != OpConst8 { 20360 break 20361 } 20362 c := v_1.AuxInt 20363 v.reset(OpRsh16Ux64) 20364 v.AddArg(x) 20365 v0 := b.NewValue0(v.Pos, OpConst64, t) 20366 v0.AuxInt = int64(uint8(c)) 20367 v.AddArg(v0) 20368 return true 20369 } 20370 // match: (Rsh16Ux8 (Const16 [0]) _) 20371 // cond: 20372 // result: (Const16 [0]) 20373 for { 20374 _ = v.Args[1] 20375 v_0 := v.Args[0] 20376 if v_0.Op != OpConst16 { 20377 break 20378 } 20379 if v_0.AuxInt != 0 { 20380 break 20381 } 20382 v.reset(OpConst16) 20383 v.AuxInt = 0 20384 return true 20385 } 20386 return false 20387 } 20388 func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { 20389 b := v.Block 20390 _ = b 20391 // match: (Rsh16x16 <t> x (Const16 [c])) 20392 // cond: 20393 // result: (Rsh16x64 x (Const64 <t> [int64(uint16(c))])) 20394 for { 20395 t := v.Type 20396 _ = v.Args[1] 20397 x := v.Args[0] 20398 v_1 := v.Args[1] 20399 if v_1.Op != OpConst16 { 20400 break 20401 } 20402 c := v_1.AuxInt 20403 v.reset(OpRsh16x64) 20404 v.AddArg(x) 20405 v0 := b.NewValue0(v.Pos, OpConst64, t) 20406 v0.AuxInt = int64(uint16(c)) 20407 v.AddArg(v0) 20408 return true 20409 } 20410 // match: (Rsh16x16 (Const16 [0]) _) 20411 // cond: 20412 // result: (Const16 [0]) 20413 for { 20414 _ = v.Args[1] 20415 v_0 := v.Args[0] 20416 if v_0.Op != OpConst16 { 20417 break 20418 } 20419 if v_0.AuxInt != 0 { 20420 break 20421 } 20422 v.reset(OpConst16) 20423 v.AuxInt = 0 20424 return true 20425 } 20426 return false 20427 } 20428 func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { 20429 b := v.Block 20430 _ = b 20431 // match: (Rsh16x32 <t> x (Const32 [c])) 20432 // cond: 20433 // result: (Rsh16x64 x (Const64 <t> [int64(uint32(c))])) 20434 for { 20435 t := v.Type 20436 _ = v.Args[1] 20437 x := v.Args[0] 20438 v_1 := v.Args[1] 20439 if v_1.Op != OpConst32 { 20440 break 20441 } 20442 c := v_1.AuxInt 20443 v.reset(OpRsh16x64) 20444 v.AddArg(x) 20445 v0 := b.NewValue0(v.Pos, OpConst64, t) 20446 v0.AuxInt = int64(uint32(c)) 20447 v.AddArg(v0) 20448 return true 20449 } 20450 // match: (Rsh16x32 (Const16 [0]) _) 20451 // cond: 20452 // result: (Const16 [0]) 20453 for { 20454 _ = v.Args[1] 20455 v_0 := v.Args[0] 20456 if v_0.Op != OpConst16 { 20457 break 20458 } 20459 if v_0.AuxInt != 0 { 20460 break 20461 } 20462 v.reset(OpConst16) 20463 v.AuxInt = 0 20464 return true 20465 } 20466 return false 20467 } 20468 func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { 20469 b := v.Block 20470 _ = b 20471 typ := &b.Func.Config.Types 20472 _ = typ 20473 // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) 20474 // cond: 20475 // result: (Const16 [int64(int16(c) >> uint64(d))]) 20476 for { 20477 _ = v.Args[1] 20478 v_0 := v.Args[0] 20479 if v_0.Op != OpConst16 { 20480 break 20481 } 20482 c := v_0.AuxInt 20483 v_1 := v.Args[1] 20484 if v_1.Op != OpConst64 { 20485 break 20486 } 20487 d := v_1.AuxInt 20488 v.reset(OpConst16) 20489 v.AuxInt = int64(int16(c) >> uint64(d)) 20490 return true 20491 } 20492 // match: (Rsh16x64 x (Const64 [0])) 20493 // cond: 20494 // result: x 20495 for { 20496 _ = v.Args[1] 20497 x := v.Args[0] 20498 v_1 := v.Args[1] 20499 if v_1.Op != OpConst64 { 20500 break 20501 } 20502 if v_1.AuxInt != 0 { 20503 break 20504 } 20505 v.reset(OpCopy) 20506 v.Type = x.Type 20507 v.AddArg(x) 20508 return true 20509 } 20510 // match: (Rsh16x64 (Const16 [0]) _) 20511 // cond: 20512 // result: (Const16 [0]) 20513 for { 20514 _ = v.Args[1] 20515 v_0 := v.Args[0] 20516 if v_0.Op != OpConst16 { 20517 break 20518 } 20519 if v_0.AuxInt != 0 { 20520 break 20521 } 20522 v.reset(OpConst16) 20523 v.AuxInt = 0 20524 return true 20525 } 20526 // match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d])) 20527 // cond: !uaddOvf(c,d) 20528 // result: (Rsh16x64 x (Const64 <t> [c+d])) 20529 for { 20530 t := v.Type 20531 _ = v.Args[1] 20532 v_0 := v.Args[0] 20533 if v_0.Op != OpRsh16x64 { 20534 break 20535 } 20536 _ = v_0.Args[1] 20537 x := v_0.Args[0] 20538 v_0_1 := v_0.Args[1] 20539 if v_0_1.Op != OpConst64 { 20540 break 20541 } 20542 c := v_0_1.AuxInt 20543 v_1 := v.Args[1] 20544 if v_1.Op != OpConst64 { 20545 break 20546 } 20547 d := v_1.AuxInt 20548 if !(!uaddOvf(c, d)) { 20549 break 20550 } 20551 v.reset(OpRsh16x64) 20552 v.AddArg(x) 20553 v0 := b.NewValue0(v.Pos, OpConst64, t) 20554 v0.AuxInt = c + d 20555 v.AddArg(v0) 20556 return true 20557 } 20558 // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 20559 // cond: 20560 // result: (SignExt8to16 (Trunc16to8 <typ.Int8> x)) 20561 for { 20562 _ = v.Args[1] 20563 v_0 := v.Args[0] 20564 if v_0.Op != OpLsh16x64 { 20565 break 20566 } 20567 _ = v_0.Args[1] 20568 x := v_0.Args[0] 20569 v_0_1 := v_0.Args[1] 20570 if v_0_1.Op != OpConst64 { 20571 break 20572 } 20573 if v_0_1.AuxInt != 8 { 20574 break 20575 } 20576 v_1 := v.Args[1] 20577 if v_1.Op != OpConst64 { 20578 break 20579 } 20580 if v_1.AuxInt != 8 { 20581 break 20582 } 20583 v.reset(OpSignExt8to16) 20584 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) 20585 v0.AddArg(x) 20586 v.AddArg(v0) 20587 return true 20588 } 20589 return false 20590 } 20591 func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { 20592 b := v.Block 20593 _ = b 20594 // match: (Rsh16x8 <t> x (Const8 [c])) 20595 // cond: 20596 // result: (Rsh16x64 x (Const64 <t> [int64(uint8(c))])) 20597 for { 20598 t := v.Type 20599 _ = v.Args[1] 20600 x := v.Args[0] 20601 v_1 := v.Args[1] 20602 if v_1.Op != OpConst8 { 20603 break 20604 } 20605 c := v_1.AuxInt 20606 v.reset(OpRsh16x64) 20607 v.AddArg(x) 20608 v0 := b.NewValue0(v.Pos, OpConst64, t) 20609 v0.AuxInt = int64(uint8(c)) 20610 v.AddArg(v0) 20611 return true 20612 } 20613 // match: (Rsh16x8 (Const16 [0]) _) 20614 // cond: 20615 // result: (Const16 [0]) 20616 for { 20617 _ = v.Args[1] 20618 v_0 := v.Args[0] 20619 if v_0.Op != OpConst16 { 20620 break 20621 } 20622 if v_0.AuxInt != 0 { 20623 break 20624 } 20625 v.reset(OpConst16) 20626 v.AuxInt = 0 20627 return true 20628 } 20629 return false 20630 } 20631 func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { 20632 b := v.Block 20633 _ = b 20634 // match: (Rsh32Ux16 <t> x (Const16 [c])) 20635 // cond: 20636 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))])) 20637 for { 20638 t := v.Type 20639 _ = v.Args[1] 20640 x := v.Args[0] 20641 v_1 := v.Args[1] 20642 if v_1.Op != OpConst16 { 20643 break 20644 } 20645 c := v_1.AuxInt 20646 v.reset(OpRsh32Ux64) 20647 v.AddArg(x) 20648 v0 := b.NewValue0(v.Pos, OpConst64, t) 20649 v0.AuxInt = int64(uint16(c)) 20650 v.AddArg(v0) 20651 return true 20652 } 20653 // match: (Rsh32Ux16 (Const32 [0]) _) 20654 // cond: 20655 // result: (Const32 [0]) 20656 for { 20657 _ = v.Args[1] 20658 v_0 := v.Args[0] 20659 if v_0.Op != OpConst32 { 20660 break 20661 } 20662 if v_0.AuxInt != 0 { 20663 break 20664 } 20665 v.reset(OpConst32) 20666 v.AuxInt = 0 20667 return true 20668 } 20669 return false 20670 } 20671 func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { 20672 b := v.Block 20673 _ = b 20674 // match: (Rsh32Ux32 <t> x (Const32 [c])) 20675 // cond: 20676 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))])) 20677 for { 20678 t := v.Type 20679 _ = v.Args[1] 20680 x := v.Args[0] 20681 v_1 := v.Args[1] 20682 if v_1.Op != OpConst32 { 20683 break 20684 } 20685 c := v_1.AuxInt 20686 v.reset(OpRsh32Ux64) 20687 v.AddArg(x) 20688 v0 := b.NewValue0(v.Pos, OpConst64, t) 20689 v0.AuxInt = int64(uint32(c)) 20690 v.AddArg(v0) 20691 return true 20692 } 20693 // match: (Rsh32Ux32 (Const32 [0]) _) 20694 // cond: 20695 // result: (Const32 [0]) 20696 for { 20697 _ = v.Args[1] 20698 v_0 := v.Args[0] 20699 if v_0.Op != OpConst32 { 20700 break 20701 } 20702 if v_0.AuxInt != 0 { 20703 break 20704 } 20705 v.reset(OpConst32) 20706 v.AuxInt = 0 20707 return true 20708 } 20709 return false 20710 } 20711 func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { 20712 b := v.Block 20713 _ = b 20714 typ := &b.Func.Config.Types 20715 _ = typ 20716 // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) 20717 // cond: 20718 // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) 20719 for { 20720 _ = v.Args[1] 20721 v_0 := v.Args[0] 20722 if v_0.Op != OpConst32 { 20723 break 20724 } 20725 c := v_0.AuxInt 20726 v_1 := v.Args[1] 20727 if v_1.Op != OpConst64 { 20728 break 20729 } 20730 d := v_1.AuxInt 20731 v.reset(OpConst32) 20732 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 20733 return true 20734 } 20735 // match: (Rsh32Ux64 x (Const64 [0])) 20736 // cond: 20737 // result: x 20738 for { 20739 _ = v.Args[1] 20740 x := v.Args[0] 20741 v_1 := v.Args[1] 20742 if v_1.Op != OpConst64 { 20743 break 20744 } 20745 if v_1.AuxInt != 0 { 20746 break 20747 } 20748 v.reset(OpCopy) 20749 v.Type = x.Type 20750 v.AddArg(x) 20751 return true 20752 } 20753 // match: (Rsh32Ux64 (Const32 [0]) _) 20754 // cond: 20755 // result: (Const32 [0]) 20756 for { 20757 _ = v.Args[1] 20758 v_0 := v.Args[0] 20759 if v_0.Op != OpConst32 { 20760 break 20761 } 20762 if v_0.AuxInt != 0 { 20763 break 20764 } 20765 v.reset(OpConst32) 20766 v.AuxInt = 0 20767 return true 20768 } 20769 // match: (Rsh32Ux64 _ (Const64 [c])) 20770 // cond: uint64(c) >= 32 20771 // result: (Const32 [0]) 20772 for { 20773 _ = v.Args[1] 20774 v_1 := v.Args[1] 20775 if v_1.Op != OpConst64 { 20776 break 20777 } 20778 c := v_1.AuxInt 20779 if !(uint64(c) >= 32) { 20780 break 20781 } 20782 v.reset(OpConst32) 20783 v.AuxInt = 0 20784 return true 20785 } 20786 // match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) 20787 // cond: !uaddOvf(c,d) 20788 // result: (Rsh32Ux64 x (Const64 <t> [c+d])) 20789 for { 20790 t := v.Type 20791 _ = v.Args[1] 20792 v_0 := v.Args[0] 20793 if v_0.Op != OpRsh32Ux64 { 20794 break 20795 } 20796 _ = v_0.Args[1] 20797 x := v_0.Args[0] 20798 v_0_1 := v_0.Args[1] 20799 if v_0_1.Op != OpConst64 { 20800 break 20801 } 20802 c := v_0_1.AuxInt 20803 v_1 := v.Args[1] 20804 if v_1.Op != OpConst64 { 20805 break 20806 } 20807 d := v_1.AuxInt 20808 if !(!uaddOvf(c, d)) { 20809 break 20810 } 20811 v.reset(OpRsh32Ux64) 20812 v.AddArg(x) 20813 v0 := b.NewValue0(v.Pos, OpConst64, t) 20814 v0.AuxInt = c + d 20815 v.AddArg(v0) 20816 return true 20817 } 20818 // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 20819 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 20820 // result: (Rsh32Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 20821 for { 20822 _ = v.Args[1] 20823 v_0 := v.Args[0] 20824 if v_0.Op != OpLsh32x64 { 20825 break 20826 } 20827 _ = v_0.Args[1] 20828 v_0_0 := v_0.Args[0] 20829 if v_0_0.Op != OpRsh32Ux64 { 20830 break 20831 } 20832 _ = v_0_0.Args[1] 20833 x := v_0_0.Args[0] 20834 v_0_0_1 := v_0_0.Args[1] 20835 if v_0_0_1.Op != OpConst64 { 20836 break 20837 } 20838 c1 := v_0_0_1.AuxInt 20839 v_0_1 := v_0.Args[1] 20840 if v_0_1.Op != OpConst64 { 20841 break 20842 } 20843 c2 := v_0_1.AuxInt 20844 v_1 := v.Args[1] 20845 if v_1.Op != OpConst64 { 20846 break 20847 } 20848 c3 := v_1.AuxInt 20849 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 20850 break 20851 } 20852 v.reset(OpRsh32Ux64) 20853 v.AddArg(x) 20854 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 20855 v0.AuxInt = c1 - c2 + c3 20856 v.AddArg(v0) 20857 return true 20858 } 20859 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 20860 // cond: 20861 // result: (ZeroExt8to32 (Trunc32to8 <typ.UInt8> x)) 20862 for { 20863 _ = v.Args[1] 20864 v_0 := v.Args[0] 20865 if v_0.Op != OpLsh32x64 { 20866 break 20867 } 20868 _ = v_0.Args[1] 20869 x := v_0.Args[0] 20870 v_0_1 := v_0.Args[1] 20871 if v_0_1.Op != OpConst64 { 20872 break 20873 } 20874 if v_0_1.AuxInt != 24 { 20875 break 20876 } 20877 v_1 := v.Args[1] 20878 if v_1.Op != OpConst64 { 20879 break 20880 } 20881 if v_1.AuxInt != 24 { 20882 break 20883 } 20884 v.reset(OpZeroExt8to32) 20885 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) 20886 v0.AddArg(x) 20887 v.AddArg(v0) 20888 return true 20889 } 20890 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 20891 // cond: 20892 // result: (ZeroExt16to32 (Trunc32to16 <typ.UInt16> x)) 20893 for { 20894 _ = v.Args[1] 20895 v_0 := v.Args[0] 20896 if v_0.Op != OpLsh32x64 { 20897 break 20898 } 20899 _ = v_0.Args[1] 20900 x := v_0.Args[0] 20901 v_0_1 := v_0.Args[1] 20902 if v_0_1.Op != OpConst64 { 20903 break 20904 } 20905 if v_0_1.AuxInt != 16 { 20906 break 20907 } 20908 v_1 := v.Args[1] 20909 if v_1.Op != OpConst64 { 20910 break 20911 } 20912 if v_1.AuxInt != 16 { 20913 break 20914 } 20915 v.reset(OpZeroExt16to32) 20916 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) 20917 v0.AddArg(x) 20918 v.AddArg(v0) 20919 return true 20920 } 20921 return false 20922 } 20923 func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { 20924 b := v.Block 20925 _ = b 20926 // match: (Rsh32Ux8 <t> x (Const8 [c])) 20927 // cond: 20928 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))])) 20929 for { 20930 t := v.Type 20931 _ = v.Args[1] 20932 x := v.Args[0] 20933 v_1 := v.Args[1] 20934 if v_1.Op != OpConst8 { 20935 break 20936 } 20937 c := v_1.AuxInt 20938 v.reset(OpRsh32Ux64) 20939 v.AddArg(x) 20940 v0 := b.NewValue0(v.Pos, OpConst64, t) 20941 v0.AuxInt = int64(uint8(c)) 20942 v.AddArg(v0) 20943 return true 20944 } 20945 // match: (Rsh32Ux8 (Const32 [0]) _) 20946 // cond: 20947 // result: (Const32 [0]) 20948 for { 20949 _ = v.Args[1] 20950 v_0 := v.Args[0] 20951 if v_0.Op != OpConst32 { 20952 break 20953 } 20954 if v_0.AuxInt != 0 { 20955 break 20956 } 20957 v.reset(OpConst32) 20958 v.AuxInt = 0 20959 return true 20960 } 20961 return false 20962 } 20963 func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { 20964 b := v.Block 20965 _ = b 20966 // match: (Rsh32x16 <t> x (Const16 [c])) 20967 // cond: 20968 // result: (Rsh32x64 x (Const64 <t> [int64(uint16(c))])) 20969 for { 20970 t := v.Type 20971 _ = v.Args[1] 20972 x := v.Args[0] 20973 v_1 := v.Args[1] 20974 if v_1.Op != OpConst16 { 20975 break 20976 } 20977 c := v_1.AuxInt 20978 v.reset(OpRsh32x64) 20979 v.AddArg(x) 20980 v0 := b.NewValue0(v.Pos, OpConst64, t) 20981 v0.AuxInt = int64(uint16(c)) 20982 v.AddArg(v0) 20983 return true 20984 } 20985 // match: (Rsh32x16 (Const32 [0]) _) 20986 // cond: 20987 // result: (Const32 [0]) 20988 for { 20989 _ = v.Args[1] 20990 v_0 := v.Args[0] 20991 if v_0.Op != OpConst32 { 20992 break 20993 } 20994 if v_0.AuxInt != 0 { 20995 break 20996 } 20997 v.reset(OpConst32) 20998 v.AuxInt = 0 20999 return true 21000 } 21001 return false 21002 } 21003 func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { 21004 b := v.Block 21005 _ = b 21006 // match: (Rsh32x32 <t> x (Const32 [c])) 21007 // cond: 21008 // result: (Rsh32x64 x (Const64 <t> [int64(uint32(c))])) 21009 for { 21010 t := v.Type 21011 _ = v.Args[1] 21012 x := v.Args[0] 21013 v_1 := v.Args[1] 21014 if v_1.Op != OpConst32 { 21015 break 21016 } 21017 c := v_1.AuxInt 21018 v.reset(OpRsh32x64) 21019 v.AddArg(x) 21020 v0 := b.NewValue0(v.Pos, OpConst64, t) 21021 v0.AuxInt = int64(uint32(c)) 21022 v.AddArg(v0) 21023 return true 21024 } 21025 // match: (Rsh32x32 (Const32 [0]) _) 21026 // cond: 21027 // result: (Const32 [0]) 21028 for { 21029 _ = v.Args[1] 21030 v_0 := v.Args[0] 21031 if v_0.Op != OpConst32 { 21032 break 21033 } 21034 if v_0.AuxInt != 0 { 21035 break 21036 } 21037 v.reset(OpConst32) 21038 v.AuxInt = 0 21039 return true 21040 } 21041 return false 21042 } 21043 func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { 21044 b := v.Block 21045 _ = b 21046 typ := &b.Func.Config.Types 21047 _ = typ 21048 // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) 21049 // cond: 21050 // result: (Const32 [int64(int32(c) >> uint64(d))]) 21051 for { 21052 _ = v.Args[1] 21053 v_0 := v.Args[0] 21054 if v_0.Op != OpConst32 { 21055 break 21056 } 21057 c := v_0.AuxInt 21058 v_1 := v.Args[1] 21059 if v_1.Op != OpConst64 { 21060 break 21061 } 21062 d := v_1.AuxInt 21063 v.reset(OpConst32) 21064 v.AuxInt = int64(int32(c) >> uint64(d)) 21065 return true 21066 } 21067 // match: (Rsh32x64 x (Const64 [0])) 21068 // cond: 21069 // result: x 21070 for { 21071 _ = v.Args[1] 21072 x := v.Args[0] 21073 v_1 := v.Args[1] 21074 if v_1.Op != OpConst64 { 21075 break 21076 } 21077 if v_1.AuxInt != 0 { 21078 break 21079 } 21080 v.reset(OpCopy) 21081 v.Type = x.Type 21082 v.AddArg(x) 21083 return true 21084 } 21085 // match: (Rsh32x64 (Const32 [0]) _) 21086 // cond: 21087 // result: (Const32 [0]) 21088 for { 21089 _ = v.Args[1] 21090 v_0 := v.Args[0] 21091 if v_0.Op != OpConst32 { 21092 break 21093 } 21094 if v_0.AuxInt != 0 { 21095 break 21096 } 21097 v.reset(OpConst32) 21098 v.AuxInt = 0 21099 return true 21100 } 21101 // match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d])) 21102 // cond: !uaddOvf(c,d) 21103 // result: (Rsh32x64 x (Const64 <t> [c+d])) 21104 for { 21105 t := v.Type 21106 _ = v.Args[1] 21107 v_0 := v.Args[0] 21108 if v_0.Op != OpRsh32x64 { 21109 break 21110 } 21111 _ = v_0.Args[1] 21112 x := v_0.Args[0] 21113 v_0_1 := v_0.Args[1] 21114 if v_0_1.Op != OpConst64 { 21115 break 21116 } 21117 c := v_0_1.AuxInt 21118 v_1 := v.Args[1] 21119 if v_1.Op != OpConst64 { 21120 break 21121 } 21122 d := v_1.AuxInt 21123 if !(!uaddOvf(c, d)) { 21124 break 21125 } 21126 v.reset(OpRsh32x64) 21127 v.AddArg(x) 21128 v0 := b.NewValue0(v.Pos, OpConst64, t) 21129 v0.AuxInt = c + d 21130 v.AddArg(v0) 21131 return true 21132 } 21133 // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 21134 // cond: 21135 // result: (SignExt8to32 (Trunc32to8 <typ.Int8> x)) 21136 for { 21137 _ = v.Args[1] 21138 v_0 := v.Args[0] 21139 if v_0.Op != OpLsh32x64 { 21140 break 21141 } 21142 _ = v_0.Args[1] 21143 x := v_0.Args[0] 21144 v_0_1 := v_0.Args[1] 21145 if v_0_1.Op != OpConst64 { 21146 break 21147 } 21148 if v_0_1.AuxInt != 24 { 21149 break 21150 } 21151 v_1 := v.Args[1] 21152 if v_1.Op != OpConst64 { 21153 break 21154 } 21155 if v_1.AuxInt != 24 { 21156 break 21157 } 21158 v.reset(OpSignExt8to32) 21159 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) 21160 v0.AddArg(x) 21161 v.AddArg(v0) 21162 return true 21163 } 21164 // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 21165 // cond: 21166 // result: (SignExt16to32 (Trunc32to16 <typ.Int16> x)) 21167 for { 21168 _ = v.Args[1] 21169 v_0 := v.Args[0] 21170 if v_0.Op != OpLsh32x64 { 21171 break 21172 } 21173 _ = v_0.Args[1] 21174 x := v_0.Args[0] 21175 v_0_1 := v_0.Args[1] 21176 if v_0_1.Op != OpConst64 { 21177 break 21178 } 21179 if v_0_1.AuxInt != 16 { 21180 break 21181 } 21182 v_1 := v.Args[1] 21183 if v_1.Op != OpConst64 { 21184 break 21185 } 21186 if v_1.AuxInt != 16 { 21187 break 21188 } 21189 v.reset(OpSignExt16to32) 21190 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) 21191 v0.AddArg(x) 21192 v.AddArg(v0) 21193 return true 21194 } 21195 return false 21196 } 21197 func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { 21198 b := v.Block 21199 _ = b 21200 // match: (Rsh32x8 <t> x (Const8 [c])) 21201 // cond: 21202 // result: (Rsh32x64 x (Const64 <t> [int64(uint8(c))])) 21203 for { 21204 t := v.Type 21205 _ = v.Args[1] 21206 x := v.Args[0] 21207 v_1 := v.Args[1] 21208 if v_1.Op != OpConst8 { 21209 break 21210 } 21211 c := v_1.AuxInt 21212 v.reset(OpRsh32x64) 21213 v.AddArg(x) 21214 v0 := b.NewValue0(v.Pos, OpConst64, t) 21215 v0.AuxInt = int64(uint8(c)) 21216 v.AddArg(v0) 21217 return true 21218 } 21219 // match: (Rsh32x8 (Const32 [0]) _) 21220 // cond: 21221 // result: (Const32 [0]) 21222 for { 21223 _ = v.Args[1] 21224 v_0 := v.Args[0] 21225 if v_0.Op != OpConst32 { 21226 break 21227 } 21228 if v_0.AuxInt != 0 { 21229 break 21230 } 21231 v.reset(OpConst32) 21232 v.AuxInt = 0 21233 return true 21234 } 21235 return false 21236 } 21237 func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { 21238 b := v.Block 21239 _ = b 21240 // match: (Rsh64Ux16 <t> x (Const16 [c])) 21241 // cond: 21242 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))])) 21243 for { 21244 t := v.Type 21245 _ = v.Args[1] 21246 x := v.Args[0] 21247 v_1 := v.Args[1] 21248 if v_1.Op != OpConst16 { 21249 break 21250 } 21251 c := v_1.AuxInt 21252 v.reset(OpRsh64Ux64) 21253 v.AddArg(x) 21254 v0 := b.NewValue0(v.Pos, OpConst64, t) 21255 v0.AuxInt = int64(uint16(c)) 21256 v.AddArg(v0) 21257 return true 21258 } 21259 // match: (Rsh64Ux16 (Const64 [0]) _) 21260 // cond: 21261 // result: (Const64 [0]) 21262 for { 21263 _ = v.Args[1] 21264 v_0 := v.Args[0] 21265 if v_0.Op != OpConst64 { 21266 break 21267 } 21268 if v_0.AuxInt != 0 { 21269 break 21270 } 21271 v.reset(OpConst64) 21272 v.AuxInt = 0 21273 return true 21274 } 21275 return false 21276 } 21277 func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { 21278 b := v.Block 21279 _ = b 21280 // match: (Rsh64Ux32 <t> x (Const32 [c])) 21281 // cond: 21282 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))])) 21283 for { 21284 t := v.Type 21285 _ = v.Args[1] 21286 x := v.Args[0] 21287 v_1 := v.Args[1] 21288 if v_1.Op != OpConst32 { 21289 break 21290 } 21291 c := v_1.AuxInt 21292 v.reset(OpRsh64Ux64) 21293 v.AddArg(x) 21294 v0 := b.NewValue0(v.Pos, OpConst64, t) 21295 v0.AuxInt = int64(uint32(c)) 21296 v.AddArg(v0) 21297 return true 21298 } 21299 // match: (Rsh64Ux32 (Const64 [0]) _) 21300 // cond: 21301 // result: (Const64 [0]) 21302 for { 21303 _ = v.Args[1] 21304 v_0 := v.Args[0] 21305 if v_0.Op != OpConst64 { 21306 break 21307 } 21308 if v_0.AuxInt != 0 { 21309 break 21310 } 21311 v.reset(OpConst64) 21312 v.AuxInt = 0 21313 return true 21314 } 21315 return false 21316 } 21317 func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { 21318 b := v.Block 21319 _ = b 21320 typ := &b.Func.Config.Types 21321 _ = typ 21322 // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) 21323 // cond: 21324 // result: (Const64 [int64(uint64(c) >> uint64(d))]) 21325 for { 21326 _ = v.Args[1] 21327 v_0 := v.Args[0] 21328 if v_0.Op != OpConst64 { 21329 break 21330 } 21331 c := v_0.AuxInt 21332 v_1 := v.Args[1] 21333 if v_1.Op != OpConst64 { 21334 break 21335 } 21336 d := v_1.AuxInt 21337 v.reset(OpConst64) 21338 v.AuxInt = int64(uint64(c) >> uint64(d)) 21339 return true 21340 } 21341 // match: (Rsh64Ux64 x (Const64 [0])) 21342 // cond: 21343 // result: x 21344 for { 21345 _ = v.Args[1] 21346 x := v.Args[0] 21347 v_1 := v.Args[1] 21348 if v_1.Op != OpConst64 { 21349 break 21350 } 21351 if v_1.AuxInt != 0 { 21352 break 21353 } 21354 v.reset(OpCopy) 21355 v.Type = x.Type 21356 v.AddArg(x) 21357 return true 21358 } 21359 // match: (Rsh64Ux64 (Const64 [0]) _) 21360 // cond: 21361 // result: (Const64 [0]) 21362 for { 21363 _ = v.Args[1] 21364 v_0 := v.Args[0] 21365 if v_0.Op != OpConst64 { 21366 break 21367 } 21368 if v_0.AuxInt != 0 { 21369 break 21370 } 21371 v.reset(OpConst64) 21372 v.AuxInt = 0 21373 return true 21374 } 21375 // match: (Rsh64Ux64 _ (Const64 [c])) 21376 // cond: uint64(c) >= 64 21377 // result: (Const64 [0]) 21378 for { 21379 _ = v.Args[1] 21380 v_1 := v.Args[1] 21381 if v_1.Op != OpConst64 { 21382 break 21383 } 21384 c := v_1.AuxInt 21385 if !(uint64(c) >= 64) { 21386 break 21387 } 21388 v.reset(OpConst64) 21389 v.AuxInt = 0 21390 return true 21391 } 21392 // match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) 21393 // cond: !uaddOvf(c,d) 21394 // result: (Rsh64Ux64 x (Const64 <t> [c+d])) 21395 for { 21396 t := v.Type 21397 _ = v.Args[1] 21398 v_0 := v.Args[0] 21399 if v_0.Op != OpRsh64Ux64 { 21400 break 21401 } 21402 _ = v_0.Args[1] 21403 x := v_0.Args[0] 21404 v_0_1 := v_0.Args[1] 21405 if v_0_1.Op != OpConst64 { 21406 break 21407 } 21408 c := v_0_1.AuxInt 21409 v_1 := v.Args[1] 21410 if v_1.Op != OpConst64 { 21411 break 21412 } 21413 d := v_1.AuxInt 21414 if !(!uaddOvf(c, d)) { 21415 break 21416 } 21417 v.reset(OpRsh64Ux64) 21418 v.AddArg(x) 21419 v0 := b.NewValue0(v.Pos, OpConst64, t) 21420 v0.AuxInt = c + d 21421 v.AddArg(v0) 21422 return true 21423 } 21424 // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 21425 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 21426 // result: (Rsh64Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 21427 for { 21428 _ = v.Args[1] 21429 v_0 := v.Args[0] 21430 if v_0.Op != OpLsh64x64 { 21431 break 21432 } 21433 _ = v_0.Args[1] 21434 v_0_0 := v_0.Args[0] 21435 if v_0_0.Op != OpRsh64Ux64 { 21436 break 21437 } 21438 _ = v_0_0.Args[1] 21439 x := v_0_0.Args[0] 21440 v_0_0_1 := v_0_0.Args[1] 21441 if v_0_0_1.Op != OpConst64 { 21442 break 21443 } 21444 c1 := v_0_0_1.AuxInt 21445 v_0_1 := v_0.Args[1] 21446 if v_0_1.Op != OpConst64 { 21447 break 21448 } 21449 c2 := v_0_1.AuxInt 21450 v_1 := v.Args[1] 21451 if v_1.Op != OpConst64 { 21452 break 21453 } 21454 c3 := v_1.AuxInt 21455 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 21456 break 21457 } 21458 v.reset(OpRsh64Ux64) 21459 v.AddArg(x) 21460 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 21461 v0.AuxInt = c1 - c2 + c3 21462 v.AddArg(v0) 21463 return true 21464 } 21465 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 21466 // cond: 21467 // result: (ZeroExt8to64 (Trunc64to8 <typ.UInt8> x)) 21468 for { 21469 _ = v.Args[1] 21470 v_0 := v.Args[0] 21471 if v_0.Op != OpLsh64x64 { 21472 break 21473 } 21474 _ = v_0.Args[1] 21475 x := v_0.Args[0] 21476 v_0_1 := v_0.Args[1] 21477 if v_0_1.Op != OpConst64 { 21478 break 21479 } 21480 if v_0_1.AuxInt != 56 { 21481 break 21482 } 21483 v_1 := v.Args[1] 21484 if v_1.Op != OpConst64 { 21485 break 21486 } 21487 if v_1.AuxInt != 56 { 21488 break 21489 } 21490 v.reset(OpZeroExt8to64) 21491 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) 21492 v0.AddArg(x) 21493 v.AddArg(v0) 21494 return true 21495 } 21496 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 21497 // cond: 21498 // result: (ZeroExt16to64 (Trunc64to16 <typ.UInt16> x)) 21499 for { 21500 _ = v.Args[1] 21501 v_0 := v.Args[0] 21502 if v_0.Op != OpLsh64x64 { 21503 break 21504 } 21505 _ = v_0.Args[1] 21506 x := v_0.Args[0] 21507 v_0_1 := v_0.Args[1] 21508 if v_0_1.Op != OpConst64 { 21509 break 21510 } 21511 if v_0_1.AuxInt != 48 { 21512 break 21513 } 21514 v_1 := v.Args[1] 21515 if v_1.Op != OpConst64 { 21516 break 21517 } 21518 if v_1.AuxInt != 48 { 21519 break 21520 } 21521 v.reset(OpZeroExt16to64) 21522 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) 21523 v0.AddArg(x) 21524 v.AddArg(v0) 21525 return true 21526 } 21527 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 21528 // cond: 21529 // result: (ZeroExt32to64 (Trunc64to32 <typ.UInt32> x)) 21530 for { 21531 _ = v.Args[1] 21532 v_0 := v.Args[0] 21533 if v_0.Op != OpLsh64x64 { 21534 break 21535 } 21536 _ = v_0.Args[1] 21537 x := v_0.Args[0] 21538 v_0_1 := v_0.Args[1] 21539 if v_0_1.Op != OpConst64 { 21540 break 21541 } 21542 if v_0_1.AuxInt != 32 { 21543 break 21544 } 21545 v_1 := v.Args[1] 21546 if v_1.Op != OpConst64 { 21547 break 21548 } 21549 if v_1.AuxInt != 32 { 21550 break 21551 } 21552 v.reset(OpZeroExt32to64) 21553 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) 21554 v0.AddArg(x) 21555 v.AddArg(v0) 21556 return true 21557 } 21558 return false 21559 } 21560 func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { 21561 b := v.Block 21562 _ = b 21563 // match: (Rsh64Ux8 <t> x (Const8 [c])) 21564 // cond: 21565 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))])) 21566 for { 21567 t := v.Type 21568 _ = v.Args[1] 21569 x := v.Args[0] 21570 v_1 := v.Args[1] 21571 if v_1.Op != OpConst8 { 21572 break 21573 } 21574 c := v_1.AuxInt 21575 v.reset(OpRsh64Ux64) 21576 v.AddArg(x) 21577 v0 := b.NewValue0(v.Pos, OpConst64, t) 21578 v0.AuxInt = int64(uint8(c)) 21579 v.AddArg(v0) 21580 return true 21581 } 21582 // match: (Rsh64Ux8 (Const64 [0]) _) 21583 // cond: 21584 // result: (Const64 [0]) 21585 for { 21586 _ = v.Args[1] 21587 v_0 := v.Args[0] 21588 if v_0.Op != OpConst64 { 21589 break 21590 } 21591 if v_0.AuxInt != 0 { 21592 break 21593 } 21594 v.reset(OpConst64) 21595 v.AuxInt = 0 21596 return true 21597 } 21598 return false 21599 } 21600 func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { 21601 b := v.Block 21602 _ = b 21603 // match: (Rsh64x16 <t> x (Const16 [c])) 21604 // cond: 21605 // result: (Rsh64x64 x (Const64 <t> [int64(uint16(c))])) 21606 for { 21607 t := v.Type 21608 _ = v.Args[1] 21609 x := v.Args[0] 21610 v_1 := v.Args[1] 21611 if v_1.Op != OpConst16 { 21612 break 21613 } 21614 c := v_1.AuxInt 21615 v.reset(OpRsh64x64) 21616 v.AddArg(x) 21617 v0 := b.NewValue0(v.Pos, OpConst64, t) 21618 v0.AuxInt = int64(uint16(c)) 21619 v.AddArg(v0) 21620 return true 21621 } 21622 // match: (Rsh64x16 (Const64 [0]) _) 21623 // cond: 21624 // result: (Const64 [0]) 21625 for { 21626 _ = v.Args[1] 21627 v_0 := v.Args[0] 21628 if v_0.Op != OpConst64 { 21629 break 21630 } 21631 if v_0.AuxInt != 0 { 21632 break 21633 } 21634 v.reset(OpConst64) 21635 v.AuxInt = 0 21636 return true 21637 } 21638 return false 21639 } 21640 func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { 21641 b := v.Block 21642 _ = b 21643 // match: (Rsh64x32 <t> x (Const32 [c])) 21644 // cond: 21645 // result: (Rsh64x64 x (Const64 <t> [int64(uint32(c))])) 21646 for { 21647 t := v.Type 21648 _ = v.Args[1] 21649 x := v.Args[0] 21650 v_1 := v.Args[1] 21651 if v_1.Op != OpConst32 { 21652 break 21653 } 21654 c := v_1.AuxInt 21655 v.reset(OpRsh64x64) 21656 v.AddArg(x) 21657 v0 := b.NewValue0(v.Pos, OpConst64, t) 21658 v0.AuxInt = int64(uint32(c)) 21659 v.AddArg(v0) 21660 return true 21661 } 21662 // match: (Rsh64x32 (Const64 [0]) _) 21663 // cond: 21664 // result: (Const64 [0]) 21665 for { 21666 _ = v.Args[1] 21667 v_0 := v.Args[0] 21668 if v_0.Op != OpConst64 { 21669 break 21670 } 21671 if v_0.AuxInt != 0 { 21672 break 21673 } 21674 v.reset(OpConst64) 21675 v.AuxInt = 0 21676 return true 21677 } 21678 return false 21679 } 21680 func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { 21681 b := v.Block 21682 _ = b 21683 typ := &b.Func.Config.Types 21684 _ = typ 21685 // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) 21686 // cond: 21687 // result: (Const64 [c >> uint64(d)]) 21688 for { 21689 _ = v.Args[1] 21690 v_0 := v.Args[0] 21691 if v_0.Op != OpConst64 { 21692 break 21693 } 21694 c := v_0.AuxInt 21695 v_1 := v.Args[1] 21696 if v_1.Op != OpConst64 { 21697 break 21698 } 21699 d := v_1.AuxInt 21700 v.reset(OpConst64) 21701 v.AuxInt = c >> uint64(d) 21702 return true 21703 } 21704 // match: (Rsh64x64 x (Const64 [0])) 21705 // cond: 21706 // result: x 21707 for { 21708 _ = v.Args[1] 21709 x := v.Args[0] 21710 v_1 := v.Args[1] 21711 if v_1.Op != OpConst64 { 21712 break 21713 } 21714 if v_1.AuxInt != 0 { 21715 break 21716 } 21717 v.reset(OpCopy) 21718 v.Type = x.Type 21719 v.AddArg(x) 21720 return true 21721 } 21722 // match: (Rsh64x64 (Const64 [0]) _) 21723 // cond: 21724 // result: (Const64 [0]) 21725 for { 21726 _ = v.Args[1] 21727 v_0 := v.Args[0] 21728 if v_0.Op != OpConst64 { 21729 break 21730 } 21731 if v_0.AuxInt != 0 { 21732 break 21733 } 21734 v.reset(OpConst64) 21735 v.AuxInt = 0 21736 return true 21737 } 21738 // match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d])) 21739 // cond: !uaddOvf(c,d) 21740 // result: (Rsh64x64 x (Const64 <t> [c+d])) 21741 for { 21742 t := v.Type 21743 _ = v.Args[1] 21744 v_0 := v.Args[0] 21745 if v_0.Op != OpRsh64x64 { 21746 break 21747 } 21748 _ = v_0.Args[1] 21749 x := v_0.Args[0] 21750 v_0_1 := v_0.Args[1] 21751 if v_0_1.Op != OpConst64 { 21752 break 21753 } 21754 c := v_0_1.AuxInt 21755 v_1 := v.Args[1] 21756 if v_1.Op != OpConst64 { 21757 break 21758 } 21759 d := v_1.AuxInt 21760 if !(!uaddOvf(c, d)) { 21761 break 21762 } 21763 v.reset(OpRsh64x64) 21764 v.AddArg(x) 21765 v0 := b.NewValue0(v.Pos, OpConst64, t) 21766 v0.AuxInt = c + d 21767 v.AddArg(v0) 21768 return true 21769 } 21770 // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 21771 // cond: 21772 // result: (SignExt8to64 (Trunc64to8 <typ.Int8> x)) 21773 for { 21774 _ = v.Args[1] 21775 v_0 := v.Args[0] 21776 if v_0.Op != OpLsh64x64 { 21777 break 21778 } 21779 _ = v_0.Args[1] 21780 x := v_0.Args[0] 21781 v_0_1 := v_0.Args[1] 21782 if v_0_1.Op != OpConst64 { 21783 break 21784 } 21785 if v_0_1.AuxInt != 56 { 21786 break 21787 } 21788 v_1 := v.Args[1] 21789 if v_1.Op != OpConst64 { 21790 break 21791 } 21792 if v_1.AuxInt != 56 { 21793 break 21794 } 21795 v.reset(OpSignExt8to64) 21796 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) 21797 v0.AddArg(x) 21798 v.AddArg(v0) 21799 return true 21800 } 21801 // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 21802 // cond: 21803 // result: (SignExt16to64 (Trunc64to16 <typ.Int16> x)) 21804 for { 21805 _ = v.Args[1] 21806 v_0 := v.Args[0] 21807 if v_0.Op != OpLsh64x64 { 21808 break 21809 } 21810 _ = v_0.Args[1] 21811 x := v_0.Args[0] 21812 v_0_1 := v_0.Args[1] 21813 if v_0_1.Op != OpConst64 { 21814 break 21815 } 21816 if v_0_1.AuxInt != 48 { 21817 break 21818 } 21819 v_1 := v.Args[1] 21820 if v_1.Op != OpConst64 { 21821 break 21822 } 21823 if v_1.AuxInt != 48 { 21824 break 21825 } 21826 v.reset(OpSignExt16to64) 21827 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) 21828 v0.AddArg(x) 21829 v.AddArg(v0) 21830 return true 21831 } 21832 // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 21833 // cond: 21834 // result: (SignExt32to64 (Trunc64to32 <typ.Int32> x)) 21835 for { 21836 _ = v.Args[1] 21837 v_0 := v.Args[0] 21838 if v_0.Op != OpLsh64x64 { 21839 break 21840 } 21841 _ = v_0.Args[1] 21842 x := v_0.Args[0] 21843 v_0_1 := v_0.Args[1] 21844 if v_0_1.Op != OpConst64 { 21845 break 21846 } 21847 if v_0_1.AuxInt != 32 { 21848 break 21849 } 21850 v_1 := v.Args[1] 21851 if v_1.Op != OpConst64 { 21852 break 21853 } 21854 if v_1.AuxInt != 32 { 21855 break 21856 } 21857 v.reset(OpSignExt32to64) 21858 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) 21859 v0.AddArg(x) 21860 v.AddArg(v0) 21861 return true 21862 } 21863 return false 21864 } 21865 func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { 21866 b := v.Block 21867 _ = b 21868 // match: (Rsh64x8 <t> x (Const8 [c])) 21869 // cond: 21870 // result: (Rsh64x64 x (Const64 <t> [int64(uint8(c))])) 21871 for { 21872 t := v.Type 21873 _ = v.Args[1] 21874 x := v.Args[0] 21875 v_1 := v.Args[1] 21876 if v_1.Op != OpConst8 { 21877 break 21878 } 21879 c := v_1.AuxInt 21880 v.reset(OpRsh64x64) 21881 v.AddArg(x) 21882 v0 := b.NewValue0(v.Pos, OpConst64, t) 21883 v0.AuxInt = int64(uint8(c)) 21884 v.AddArg(v0) 21885 return true 21886 } 21887 // match: (Rsh64x8 (Const64 [0]) _) 21888 // cond: 21889 // result: (Const64 [0]) 21890 for { 21891 _ = v.Args[1] 21892 v_0 := v.Args[0] 21893 if v_0.Op != OpConst64 { 21894 break 21895 } 21896 if v_0.AuxInt != 0 { 21897 break 21898 } 21899 v.reset(OpConst64) 21900 v.AuxInt = 0 21901 return true 21902 } 21903 return false 21904 } 21905 func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { 21906 b := v.Block 21907 _ = b 21908 // match: (Rsh8Ux16 <t> x (Const16 [c])) 21909 // cond: 21910 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))])) 21911 for { 21912 t := v.Type 21913 _ = v.Args[1] 21914 x := v.Args[0] 21915 v_1 := v.Args[1] 21916 if v_1.Op != OpConst16 { 21917 break 21918 } 21919 c := v_1.AuxInt 21920 v.reset(OpRsh8Ux64) 21921 v.AddArg(x) 21922 v0 := b.NewValue0(v.Pos, OpConst64, t) 21923 v0.AuxInt = int64(uint16(c)) 21924 v.AddArg(v0) 21925 return true 21926 } 21927 // match: (Rsh8Ux16 (Const8 [0]) _) 21928 // cond: 21929 // result: (Const8 [0]) 21930 for { 21931 _ = v.Args[1] 21932 v_0 := v.Args[0] 21933 if v_0.Op != OpConst8 { 21934 break 21935 } 21936 if v_0.AuxInt != 0 { 21937 break 21938 } 21939 v.reset(OpConst8) 21940 v.AuxInt = 0 21941 return true 21942 } 21943 return false 21944 } 21945 func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { 21946 b := v.Block 21947 _ = b 21948 // match: (Rsh8Ux32 <t> x (Const32 [c])) 21949 // cond: 21950 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))])) 21951 for { 21952 t := v.Type 21953 _ = v.Args[1] 21954 x := v.Args[0] 21955 v_1 := v.Args[1] 21956 if v_1.Op != OpConst32 { 21957 break 21958 } 21959 c := v_1.AuxInt 21960 v.reset(OpRsh8Ux64) 21961 v.AddArg(x) 21962 v0 := b.NewValue0(v.Pos, OpConst64, t) 21963 v0.AuxInt = int64(uint32(c)) 21964 v.AddArg(v0) 21965 return true 21966 } 21967 // match: (Rsh8Ux32 (Const8 [0]) _) 21968 // cond: 21969 // result: (Const8 [0]) 21970 for { 21971 _ = v.Args[1] 21972 v_0 := v.Args[0] 21973 if v_0.Op != OpConst8 { 21974 break 21975 } 21976 if v_0.AuxInt != 0 { 21977 break 21978 } 21979 v.reset(OpConst8) 21980 v.AuxInt = 0 21981 return true 21982 } 21983 return false 21984 } 21985 func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { 21986 b := v.Block 21987 _ = b 21988 typ := &b.Func.Config.Types 21989 _ = typ 21990 // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) 21991 // cond: 21992 // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) 21993 for { 21994 _ = v.Args[1] 21995 v_0 := v.Args[0] 21996 if v_0.Op != OpConst8 { 21997 break 21998 } 21999 c := v_0.AuxInt 22000 v_1 := v.Args[1] 22001 if v_1.Op != OpConst64 { 22002 break 22003 } 22004 d := v_1.AuxInt 22005 v.reset(OpConst8) 22006 v.AuxInt = int64(int8(uint8(c) >> uint64(d))) 22007 return true 22008 } 22009 // match: (Rsh8Ux64 x (Const64 [0])) 22010 // cond: 22011 // result: x 22012 for { 22013 _ = v.Args[1] 22014 x := v.Args[0] 22015 v_1 := v.Args[1] 22016 if v_1.Op != OpConst64 { 22017 break 22018 } 22019 if v_1.AuxInt != 0 { 22020 break 22021 } 22022 v.reset(OpCopy) 22023 v.Type = x.Type 22024 v.AddArg(x) 22025 return true 22026 } 22027 // match: (Rsh8Ux64 (Const8 [0]) _) 22028 // cond: 22029 // result: (Const8 [0]) 22030 for { 22031 _ = v.Args[1] 22032 v_0 := v.Args[0] 22033 if v_0.Op != OpConst8 { 22034 break 22035 } 22036 if v_0.AuxInt != 0 { 22037 break 22038 } 22039 v.reset(OpConst8) 22040 v.AuxInt = 0 22041 return true 22042 } 22043 // match: (Rsh8Ux64 _ (Const64 [c])) 22044 // cond: uint64(c) >= 8 22045 // result: (Const8 [0]) 22046 for { 22047 _ = v.Args[1] 22048 v_1 := v.Args[1] 22049 if v_1.Op != OpConst64 { 22050 break 22051 } 22052 c := v_1.AuxInt 22053 if !(uint64(c) >= 8) { 22054 break 22055 } 22056 v.reset(OpConst8) 22057 v.AuxInt = 0 22058 return true 22059 } 22060 // match: (Rsh8Ux64 <t> (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) 22061 // cond: !uaddOvf(c,d) 22062 // result: (Rsh8Ux64 x (Const64 <t> [c+d])) 22063 for { 22064 t := v.Type 22065 _ = v.Args[1] 22066 v_0 := v.Args[0] 22067 if v_0.Op != OpRsh8Ux64 { 22068 break 22069 } 22070 _ = v_0.Args[1] 22071 x := v_0.Args[0] 22072 v_0_1 := v_0.Args[1] 22073 if v_0_1.Op != OpConst64 { 22074 break 22075 } 22076 c := v_0_1.AuxInt 22077 v_1 := v.Args[1] 22078 if v_1.Op != OpConst64 { 22079 break 22080 } 22081 d := v_1.AuxInt 22082 if !(!uaddOvf(c, d)) { 22083 break 22084 } 22085 v.reset(OpRsh8Ux64) 22086 v.AddArg(x) 22087 v0 := b.NewValue0(v.Pos, OpConst64, t) 22088 v0.AuxInt = c + d 22089 v.AddArg(v0) 22090 return true 22091 } 22092 // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 22093 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 22094 // result: (Rsh8Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 22095 for { 22096 _ = v.Args[1] 22097 v_0 := v.Args[0] 22098 if v_0.Op != OpLsh8x64 { 22099 break 22100 } 22101 _ = v_0.Args[1] 22102 v_0_0 := v_0.Args[0] 22103 if v_0_0.Op != OpRsh8Ux64 { 22104 break 22105 } 22106 _ = v_0_0.Args[1] 22107 x := v_0_0.Args[0] 22108 v_0_0_1 := v_0_0.Args[1] 22109 if v_0_0_1.Op != OpConst64 { 22110 break 22111 } 22112 c1 := v_0_0_1.AuxInt 22113 v_0_1 := v_0.Args[1] 22114 if v_0_1.Op != OpConst64 { 22115 break 22116 } 22117 c2 := v_0_1.AuxInt 22118 v_1 := v.Args[1] 22119 if v_1.Op != OpConst64 { 22120 break 22121 } 22122 c3 := v_1.AuxInt 22123 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 22124 break 22125 } 22126 v.reset(OpRsh8Ux64) 22127 v.AddArg(x) 22128 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 22129 v0.AuxInt = c1 - c2 + c3 22130 v.AddArg(v0) 22131 return true 22132 } 22133 return false 22134 } 22135 func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { 22136 b := v.Block 22137 _ = b 22138 // match: (Rsh8Ux8 <t> x (Const8 [c])) 22139 // cond: 22140 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))])) 22141 for { 22142 t := v.Type 22143 _ = v.Args[1] 22144 x := v.Args[0] 22145 v_1 := v.Args[1] 22146 if v_1.Op != OpConst8 { 22147 break 22148 } 22149 c := v_1.AuxInt 22150 v.reset(OpRsh8Ux64) 22151 v.AddArg(x) 22152 v0 := b.NewValue0(v.Pos, OpConst64, t) 22153 v0.AuxInt = int64(uint8(c)) 22154 v.AddArg(v0) 22155 return true 22156 } 22157 // match: (Rsh8Ux8 (Const8 [0]) _) 22158 // cond: 22159 // result: (Const8 [0]) 22160 for { 22161 _ = v.Args[1] 22162 v_0 := v.Args[0] 22163 if v_0.Op != OpConst8 { 22164 break 22165 } 22166 if v_0.AuxInt != 0 { 22167 break 22168 } 22169 v.reset(OpConst8) 22170 v.AuxInt = 0 22171 return true 22172 } 22173 return false 22174 } 22175 func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { 22176 b := v.Block 22177 _ = b 22178 // match: (Rsh8x16 <t> x (Const16 [c])) 22179 // cond: 22180 // result: (Rsh8x64 x (Const64 <t> [int64(uint16(c))])) 22181 for { 22182 t := v.Type 22183 _ = v.Args[1] 22184 x := v.Args[0] 22185 v_1 := v.Args[1] 22186 if v_1.Op != OpConst16 { 22187 break 22188 } 22189 c := v_1.AuxInt 22190 v.reset(OpRsh8x64) 22191 v.AddArg(x) 22192 v0 := b.NewValue0(v.Pos, OpConst64, t) 22193 v0.AuxInt = int64(uint16(c)) 22194 v.AddArg(v0) 22195 return true 22196 } 22197 // match: (Rsh8x16 (Const8 [0]) _) 22198 // cond: 22199 // result: (Const8 [0]) 22200 for { 22201 _ = v.Args[1] 22202 v_0 := v.Args[0] 22203 if v_0.Op != OpConst8 { 22204 break 22205 } 22206 if v_0.AuxInt != 0 { 22207 break 22208 } 22209 v.reset(OpConst8) 22210 v.AuxInt = 0 22211 return true 22212 } 22213 return false 22214 } 22215 func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { 22216 b := v.Block 22217 _ = b 22218 // match: (Rsh8x32 <t> x (Const32 [c])) 22219 // cond: 22220 // result: (Rsh8x64 x (Const64 <t> [int64(uint32(c))])) 22221 for { 22222 t := v.Type 22223 _ = v.Args[1] 22224 x := v.Args[0] 22225 v_1 := v.Args[1] 22226 if v_1.Op != OpConst32 { 22227 break 22228 } 22229 c := v_1.AuxInt 22230 v.reset(OpRsh8x64) 22231 v.AddArg(x) 22232 v0 := b.NewValue0(v.Pos, OpConst64, t) 22233 v0.AuxInt = int64(uint32(c)) 22234 v.AddArg(v0) 22235 return true 22236 } 22237 // match: (Rsh8x32 (Const8 [0]) _) 22238 // cond: 22239 // result: (Const8 [0]) 22240 for { 22241 _ = v.Args[1] 22242 v_0 := v.Args[0] 22243 if v_0.Op != OpConst8 { 22244 break 22245 } 22246 if v_0.AuxInt != 0 { 22247 break 22248 } 22249 v.reset(OpConst8) 22250 v.AuxInt = 0 22251 return true 22252 } 22253 return false 22254 } 22255 func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { 22256 b := v.Block 22257 _ = b 22258 // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) 22259 // cond: 22260 // result: (Const8 [int64(int8(c) >> uint64(d))]) 22261 for { 22262 _ = v.Args[1] 22263 v_0 := v.Args[0] 22264 if v_0.Op != OpConst8 { 22265 break 22266 } 22267 c := v_0.AuxInt 22268 v_1 := v.Args[1] 22269 if v_1.Op != OpConst64 { 22270 break 22271 } 22272 d := v_1.AuxInt 22273 v.reset(OpConst8) 22274 v.AuxInt = int64(int8(c) >> uint64(d)) 22275 return true 22276 } 22277 // match: (Rsh8x64 x (Const64 [0])) 22278 // cond: 22279 // result: x 22280 for { 22281 _ = v.Args[1] 22282 x := v.Args[0] 22283 v_1 := v.Args[1] 22284 if v_1.Op != OpConst64 { 22285 break 22286 } 22287 if v_1.AuxInt != 0 { 22288 break 22289 } 22290 v.reset(OpCopy) 22291 v.Type = x.Type 22292 v.AddArg(x) 22293 return true 22294 } 22295 // match: (Rsh8x64 (Const8 [0]) _) 22296 // cond: 22297 // result: (Const8 [0]) 22298 for { 22299 _ = v.Args[1] 22300 v_0 := v.Args[0] 22301 if v_0.Op != OpConst8 { 22302 break 22303 } 22304 if v_0.AuxInt != 0 { 22305 break 22306 } 22307 v.reset(OpConst8) 22308 v.AuxInt = 0 22309 return true 22310 } 22311 // match: (Rsh8x64 <t> (Rsh8x64 x (Const64 [c])) (Const64 [d])) 22312 // cond: !uaddOvf(c,d) 22313 // result: (Rsh8x64 x (Const64 <t> [c+d])) 22314 for { 22315 t := v.Type 22316 _ = v.Args[1] 22317 v_0 := v.Args[0] 22318 if v_0.Op != OpRsh8x64 { 22319 break 22320 } 22321 _ = v_0.Args[1] 22322 x := v_0.Args[0] 22323 v_0_1 := v_0.Args[1] 22324 if v_0_1.Op != OpConst64 { 22325 break 22326 } 22327 c := v_0_1.AuxInt 22328 v_1 := v.Args[1] 22329 if v_1.Op != OpConst64 { 22330 break 22331 } 22332 d := v_1.AuxInt 22333 if !(!uaddOvf(c, d)) { 22334 break 22335 } 22336 v.reset(OpRsh8x64) 22337 v.AddArg(x) 22338 v0 := b.NewValue0(v.Pos, OpConst64, t) 22339 v0.AuxInt = c + d 22340 v.AddArg(v0) 22341 return true 22342 } 22343 return false 22344 } 22345 func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { 22346 b := v.Block 22347 _ = b 22348 // match: (Rsh8x8 <t> x (Const8 [c])) 22349 // cond: 22350 // result: (Rsh8x64 x (Const64 <t> [int64(uint8(c))])) 22351 for { 22352 t := v.Type 22353 _ = v.Args[1] 22354 x := v.Args[0] 22355 v_1 := v.Args[1] 22356 if v_1.Op != OpConst8 { 22357 break 22358 } 22359 c := v_1.AuxInt 22360 v.reset(OpRsh8x64) 22361 v.AddArg(x) 22362 v0 := b.NewValue0(v.Pos, OpConst64, t) 22363 v0.AuxInt = int64(uint8(c)) 22364 v.AddArg(v0) 22365 return true 22366 } 22367 // match: (Rsh8x8 (Const8 [0]) _) 22368 // cond: 22369 // result: (Const8 [0]) 22370 for { 22371 _ = v.Args[1] 22372 v_0 := v.Args[0] 22373 if v_0.Op != OpConst8 { 22374 break 22375 } 22376 if v_0.AuxInt != 0 { 22377 break 22378 } 22379 v.reset(OpConst8) 22380 v.AuxInt = 0 22381 return true 22382 } 22383 return false 22384 } 22385 func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { 22386 // match: (SignExt16to32 (Const16 [c])) 22387 // cond: 22388 // result: (Const32 [int64( int16(c))]) 22389 for { 22390 v_0 := v.Args[0] 22391 if v_0.Op != OpConst16 { 22392 break 22393 } 22394 c := v_0.AuxInt 22395 v.reset(OpConst32) 22396 v.AuxInt = int64(int16(c)) 22397 return true 22398 } 22399 // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) 22400 // cond: s >= 16 22401 // result: x 22402 for { 22403 v_0 := v.Args[0] 22404 if v_0.Op != OpTrunc32to16 { 22405 break 22406 } 22407 x := v_0.Args[0] 22408 if x.Op != OpRsh32x64 { 22409 break 22410 } 22411 _ = x.Args[1] 22412 x_1 := x.Args[1] 22413 if x_1.Op != OpConst64 { 22414 break 22415 } 22416 s := x_1.AuxInt 22417 if !(s >= 16) { 22418 break 22419 } 22420 v.reset(OpCopy) 22421 v.Type = x.Type 22422 v.AddArg(x) 22423 return true 22424 } 22425 return false 22426 } 22427 func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { 22428 // match: (SignExt16to64 (Const16 [c])) 22429 // cond: 22430 // result: (Const64 [int64( int16(c))]) 22431 for { 22432 v_0 := v.Args[0] 22433 if v_0.Op != OpConst16 { 22434 break 22435 } 22436 c := v_0.AuxInt 22437 v.reset(OpConst64) 22438 v.AuxInt = int64(int16(c)) 22439 return true 22440 } 22441 // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) 22442 // cond: s >= 48 22443 // result: x 22444 for { 22445 v_0 := v.Args[0] 22446 if v_0.Op != OpTrunc64to16 { 22447 break 22448 } 22449 x := v_0.Args[0] 22450 if x.Op != OpRsh64x64 { 22451 break 22452 } 22453 _ = x.Args[1] 22454 x_1 := x.Args[1] 22455 if x_1.Op != OpConst64 { 22456 break 22457 } 22458 s := x_1.AuxInt 22459 if !(s >= 48) { 22460 break 22461 } 22462 v.reset(OpCopy) 22463 v.Type = x.Type 22464 v.AddArg(x) 22465 return true 22466 } 22467 return false 22468 } 22469 func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { 22470 // match: (SignExt32to64 (Const32 [c])) 22471 // cond: 22472 // result: (Const64 [int64( int32(c))]) 22473 for { 22474 v_0 := v.Args[0] 22475 if v_0.Op != OpConst32 { 22476 break 22477 } 22478 c := v_0.AuxInt 22479 v.reset(OpConst64) 22480 v.AuxInt = int64(int32(c)) 22481 return true 22482 } 22483 // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) 22484 // cond: s >= 32 22485 // result: x 22486 for { 22487 v_0 := v.Args[0] 22488 if v_0.Op != OpTrunc64to32 { 22489 break 22490 } 22491 x := v_0.Args[0] 22492 if x.Op != OpRsh64x64 { 22493 break 22494 } 22495 _ = x.Args[1] 22496 x_1 := x.Args[1] 22497 if x_1.Op != OpConst64 { 22498 break 22499 } 22500 s := x_1.AuxInt 22501 if !(s >= 32) { 22502 break 22503 } 22504 v.reset(OpCopy) 22505 v.Type = x.Type 22506 v.AddArg(x) 22507 return true 22508 } 22509 return false 22510 } 22511 func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { 22512 // match: (SignExt8to16 (Const8 [c])) 22513 // cond: 22514 // result: (Const16 [int64( int8(c))]) 22515 for { 22516 v_0 := v.Args[0] 22517 if v_0.Op != OpConst8 { 22518 break 22519 } 22520 c := v_0.AuxInt 22521 v.reset(OpConst16) 22522 v.AuxInt = int64(int8(c)) 22523 return true 22524 } 22525 // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) 22526 // cond: s >= 8 22527 // result: x 22528 for { 22529 v_0 := v.Args[0] 22530 if v_0.Op != OpTrunc16to8 { 22531 break 22532 } 22533 x := v_0.Args[0] 22534 if x.Op != OpRsh16x64 { 22535 break 22536 } 22537 _ = x.Args[1] 22538 x_1 := x.Args[1] 22539 if x_1.Op != OpConst64 { 22540 break 22541 } 22542 s := x_1.AuxInt 22543 if !(s >= 8) { 22544 break 22545 } 22546 v.reset(OpCopy) 22547 v.Type = x.Type 22548 v.AddArg(x) 22549 return true 22550 } 22551 return false 22552 } 22553 func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { 22554 // match: (SignExt8to32 (Const8 [c])) 22555 // cond: 22556 // result: (Const32 [int64( int8(c))]) 22557 for { 22558 v_0 := v.Args[0] 22559 if v_0.Op != OpConst8 { 22560 break 22561 } 22562 c := v_0.AuxInt 22563 v.reset(OpConst32) 22564 v.AuxInt = int64(int8(c)) 22565 return true 22566 } 22567 // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) 22568 // cond: s >= 24 22569 // result: x 22570 for { 22571 v_0 := v.Args[0] 22572 if v_0.Op != OpTrunc32to8 { 22573 break 22574 } 22575 x := v_0.Args[0] 22576 if x.Op != OpRsh32x64 { 22577 break 22578 } 22579 _ = x.Args[1] 22580 x_1 := x.Args[1] 22581 if x_1.Op != OpConst64 { 22582 break 22583 } 22584 s := x_1.AuxInt 22585 if !(s >= 24) { 22586 break 22587 } 22588 v.reset(OpCopy) 22589 v.Type = x.Type 22590 v.AddArg(x) 22591 return true 22592 } 22593 return false 22594 } 22595 func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { 22596 // match: (SignExt8to64 (Const8 [c])) 22597 // cond: 22598 // result: (Const64 [int64( int8(c))]) 22599 for { 22600 v_0 := v.Args[0] 22601 if v_0.Op != OpConst8 { 22602 break 22603 } 22604 c := v_0.AuxInt 22605 v.reset(OpConst64) 22606 v.AuxInt = int64(int8(c)) 22607 return true 22608 } 22609 // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) 22610 // cond: s >= 56 22611 // result: x 22612 for { 22613 v_0 := v.Args[0] 22614 if v_0.Op != OpTrunc64to8 { 22615 break 22616 } 22617 x := v_0.Args[0] 22618 if x.Op != OpRsh64x64 { 22619 break 22620 } 22621 _ = x.Args[1] 22622 x_1 := x.Args[1] 22623 if x_1.Op != OpConst64 { 22624 break 22625 } 22626 s := x_1.AuxInt 22627 if !(s >= 56) { 22628 break 22629 } 22630 v.reset(OpCopy) 22631 v.Type = x.Type 22632 v.AddArg(x) 22633 return true 22634 } 22635 return false 22636 } 22637 func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { 22638 // match: (SliceCap (SliceMake _ _ (Const64 <t> [c]))) 22639 // cond: 22640 // result: (Const64 <t> [c]) 22641 for { 22642 v_0 := v.Args[0] 22643 if v_0.Op != OpSliceMake { 22644 break 22645 } 22646 _ = v_0.Args[2] 22647 v_0_2 := v_0.Args[2] 22648 if v_0_2.Op != OpConst64 { 22649 break 22650 } 22651 t := v_0_2.Type 22652 c := v_0_2.AuxInt 22653 v.reset(OpConst64) 22654 v.Type = t 22655 v.AuxInt = c 22656 return true 22657 } 22658 // match: (SliceCap (SliceMake _ _ (Const32 <t> [c]))) 22659 // cond: 22660 // result: (Const32 <t> [c]) 22661 for { 22662 v_0 := v.Args[0] 22663 if v_0.Op != OpSliceMake { 22664 break 22665 } 22666 _ = v_0.Args[2] 22667 v_0_2 := v_0.Args[2] 22668 if v_0_2.Op != OpConst32 { 22669 break 22670 } 22671 t := v_0_2.Type 22672 c := v_0_2.AuxInt 22673 v.reset(OpConst32) 22674 v.Type = t 22675 v.AuxInt = c 22676 return true 22677 } 22678 // match: (SliceCap (SliceMake _ _ (SliceCap x))) 22679 // cond: 22680 // result: (SliceCap x) 22681 for { 22682 v_0 := v.Args[0] 22683 if v_0.Op != OpSliceMake { 22684 break 22685 } 22686 _ = v_0.Args[2] 22687 v_0_2 := v_0.Args[2] 22688 if v_0_2.Op != OpSliceCap { 22689 break 22690 } 22691 x := v_0_2.Args[0] 22692 v.reset(OpSliceCap) 22693 v.AddArg(x) 22694 return true 22695 } 22696 // match: (SliceCap (SliceMake _ _ (SliceLen x))) 22697 // cond: 22698 // result: (SliceLen x) 22699 for { 22700 v_0 := v.Args[0] 22701 if v_0.Op != OpSliceMake { 22702 break 22703 } 22704 _ = v_0.Args[2] 22705 v_0_2 := v_0.Args[2] 22706 if v_0_2.Op != OpSliceLen { 22707 break 22708 } 22709 x := v_0_2.Args[0] 22710 v.reset(OpSliceLen) 22711 v.AddArg(x) 22712 return true 22713 } 22714 return false 22715 } 22716 func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { 22717 // match: (SliceLen (SliceMake _ (Const64 <t> [c]) _)) 22718 // cond: 22719 // result: (Const64 <t> [c]) 22720 for { 22721 v_0 := v.Args[0] 22722 if v_0.Op != OpSliceMake { 22723 break 22724 } 22725 _ = v_0.Args[2] 22726 v_0_1 := v_0.Args[1] 22727 if v_0_1.Op != OpConst64 { 22728 break 22729 } 22730 t := v_0_1.Type 22731 c := v_0_1.AuxInt 22732 v.reset(OpConst64) 22733 v.Type = t 22734 v.AuxInt = c 22735 return true 22736 } 22737 // match: (SliceLen (SliceMake _ (Const32 <t> [c]) _)) 22738 // cond: 22739 // result: (Const32 <t> [c]) 22740 for { 22741 v_0 := v.Args[0] 22742 if v_0.Op != OpSliceMake { 22743 break 22744 } 22745 _ = v_0.Args[2] 22746 v_0_1 := v_0.Args[1] 22747 if v_0_1.Op != OpConst32 { 22748 break 22749 } 22750 t := v_0_1.Type 22751 c := v_0_1.AuxInt 22752 v.reset(OpConst32) 22753 v.Type = t 22754 v.AuxInt = c 22755 return true 22756 } 22757 // match: (SliceLen (SliceMake _ (SliceLen x) _)) 22758 // cond: 22759 // result: (SliceLen x) 22760 for { 22761 v_0 := v.Args[0] 22762 if v_0.Op != OpSliceMake { 22763 break 22764 } 22765 _ = v_0.Args[2] 22766 v_0_1 := v_0.Args[1] 22767 if v_0_1.Op != OpSliceLen { 22768 break 22769 } 22770 x := v_0_1.Args[0] 22771 v.reset(OpSliceLen) 22772 v.AddArg(x) 22773 return true 22774 } 22775 return false 22776 } 22777 func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { 22778 // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) 22779 // cond: 22780 // result: (SlicePtr x) 22781 for { 22782 v_0 := v.Args[0] 22783 if v_0.Op != OpSliceMake { 22784 break 22785 } 22786 _ = v_0.Args[2] 22787 v_0_0 := v_0.Args[0] 22788 if v_0_0.Op != OpSlicePtr { 22789 break 22790 } 22791 x := v_0_0.Args[0] 22792 v.reset(OpSlicePtr) 22793 v.AddArg(x) 22794 return true 22795 } 22796 return false 22797 } 22798 func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { 22799 // match: (Slicemask (Const32 [x])) 22800 // cond: x > 0 22801 // result: (Const32 [-1]) 22802 for { 22803 v_0 := v.Args[0] 22804 if v_0.Op != OpConst32 { 22805 break 22806 } 22807 x := v_0.AuxInt 22808 if !(x > 0) { 22809 break 22810 } 22811 v.reset(OpConst32) 22812 v.AuxInt = -1 22813 return true 22814 } 22815 // match: (Slicemask (Const32 [0])) 22816 // cond: 22817 // result: (Const32 [0]) 22818 for { 22819 v_0 := v.Args[0] 22820 if v_0.Op != OpConst32 { 22821 break 22822 } 22823 if v_0.AuxInt != 0 { 22824 break 22825 } 22826 v.reset(OpConst32) 22827 v.AuxInt = 0 22828 return true 22829 } 22830 // match: (Slicemask (Const64 [x])) 22831 // cond: x > 0 22832 // result: (Const64 [-1]) 22833 for { 22834 v_0 := v.Args[0] 22835 if v_0.Op != OpConst64 { 22836 break 22837 } 22838 x := v_0.AuxInt 22839 if !(x > 0) { 22840 break 22841 } 22842 v.reset(OpConst64) 22843 v.AuxInt = -1 22844 return true 22845 } 22846 // match: (Slicemask (Const64 [0])) 22847 // cond: 22848 // result: (Const64 [0]) 22849 for { 22850 v_0 := v.Args[0] 22851 if v_0.Op != OpConst64 { 22852 break 22853 } 22854 if v_0.AuxInt != 0 { 22855 break 22856 } 22857 v.reset(OpConst64) 22858 v.AuxInt = 0 22859 return true 22860 } 22861 return false 22862 } 22863 func rewriteValuegeneric_OpSqrt_0(v *Value) bool { 22864 // match: (Sqrt (Const64F [c])) 22865 // cond: 22866 // result: (Const64F [f2i(math.Sqrt(i2f(c)))]) 22867 for { 22868 v_0 := v.Args[0] 22869 if v_0.Op != OpConst64F { 22870 break 22871 } 22872 c := v_0.AuxInt 22873 v.reset(OpConst64F) 22874 v.AuxInt = f2i(math.Sqrt(i2f(c))) 22875 return true 22876 } 22877 return false 22878 } 22879 func rewriteValuegeneric_OpStore_0(v *Value) bool { 22880 b := v.Block 22881 _ = b 22882 fe := b.Func.fe 22883 _ = fe 22884 // match: (Store {t1} p1 (Load <t2> p2 mem) mem) 22885 // cond: isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size() 22886 // result: mem 22887 for { 22888 t1 := v.Aux 22889 _ = v.Args[2] 22890 p1 := v.Args[0] 22891 v_1 := v.Args[1] 22892 if v_1.Op != OpLoad { 22893 break 22894 } 22895 t2 := v_1.Type 22896 _ = v_1.Args[1] 22897 p2 := v_1.Args[0] 22898 mem := v_1.Args[1] 22899 if mem != v.Args[2] { 22900 break 22901 } 22902 if !(isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size()) { 22903 break 22904 } 22905 v.reset(OpCopy) 22906 v.Type = mem.Type 22907 v.AddArg(mem) 22908 return true 22909 } 22910 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ oldmem)) 22911 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) 22912 // result: mem 22913 for { 22914 t1 := v.Aux 22915 _ = v.Args[2] 22916 v_0 := v.Args[0] 22917 if v_0.Op != OpOffPtr { 22918 break 22919 } 22920 o1 := v_0.AuxInt 22921 p1 := v_0.Args[0] 22922 v_1 := v.Args[1] 22923 if v_1.Op != OpLoad { 22924 break 22925 } 22926 t2 := v_1.Type 22927 _ = v_1.Args[1] 22928 v_1_0 := v_1.Args[0] 22929 if v_1_0.Op != OpOffPtr { 22930 break 22931 } 22932 if v_1_0.AuxInt != o1 { 22933 break 22934 } 22935 p2 := v_1_0.Args[0] 22936 oldmem := v_1.Args[1] 22937 mem := v.Args[2] 22938 if mem.Op != OpStore { 22939 break 22940 } 22941 t3 := mem.Aux 22942 _ = mem.Args[2] 22943 mem_0 := mem.Args[0] 22944 if mem_0.Op != OpOffPtr { 22945 break 22946 } 22947 o3 := mem_0.AuxInt 22948 p3 := mem_0.Args[0] 22949 if oldmem != mem.Args[2] { 22950 break 22951 } 22952 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size())) { 22953 break 22954 } 22955 v.reset(OpCopy) 22956 v.Type = mem.Type 22957 v.AddArg(mem) 22958 return true 22959 } 22960 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ oldmem))) 22961 // 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()) 22962 // result: mem 22963 for { 22964 t1 := v.Aux 22965 _ = v.Args[2] 22966 v_0 := v.Args[0] 22967 if v_0.Op != OpOffPtr { 22968 break 22969 } 22970 o1 := v_0.AuxInt 22971 p1 := v_0.Args[0] 22972 v_1 := v.Args[1] 22973 if v_1.Op != OpLoad { 22974 break 22975 } 22976 t2 := v_1.Type 22977 _ = v_1.Args[1] 22978 v_1_0 := v_1.Args[0] 22979 if v_1_0.Op != OpOffPtr { 22980 break 22981 } 22982 if v_1_0.AuxInt != o1 { 22983 break 22984 } 22985 p2 := v_1_0.Args[0] 22986 oldmem := v_1.Args[1] 22987 mem := v.Args[2] 22988 if mem.Op != OpStore { 22989 break 22990 } 22991 t3 := mem.Aux 22992 _ = mem.Args[2] 22993 mem_0 := mem.Args[0] 22994 if mem_0.Op != OpOffPtr { 22995 break 22996 } 22997 o3 := mem_0.AuxInt 22998 p3 := mem_0.Args[0] 22999 mem_2 := mem.Args[2] 23000 if mem_2.Op != OpStore { 23001 break 23002 } 23003 t4 := mem_2.Aux 23004 _ = mem_2.Args[2] 23005 mem_2_0 := mem_2.Args[0] 23006 if mem_2_0.Op != OpOffPtr { 23007 break 23008 } 23009 o4 := mem_2_0.AuxInt 23010 p4 := mem_2_0.Args[0] 23011 if oldmem != mem_2.Args[2] { 23012 break 23013 } 23014 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())) { 23015 break 23016 } 23017 v.reset(OpCopy) 23018 v.Type = mem.Type 23019 v.AddArg(mem) 23020 return true 23021 } 23022 // 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)))) 23023 // 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()) 23024 // result: mem 23025 for { 23026 t1 := v.Aux 23027 _ = v.Args[2] 23028 v_0 := v.Args[0] 23029 if v_0.Op != OpOffPtr { 23030 break 23031 } 23032 o1 := v_0.AuxInt 23033 p1 := v_0.Args[0] 23034 v_1 := v.Args[1] 23035 if v_1.Op != OpLoad { 23036 break 23037 } 23038 t2 := v_1.Type 23039 _ = v_1.Args[1] 23040 v_1_0 := v_1.Args[0] 23041 if v_1_0.Op != OpOffPtr { 23042 break 23043 } 23044 if v_1_0.AuxInt != o1 { 23045 break 23046 } 23047 p2 := v_1_0.Args[0] 23048 oldmem := v_1.Args[1] 23049 mem := v.Args[2] 23050 if mem.Op != OpStore { 23051 break 23052 } 23053 t3 := mem.Aux 23054 _ = mem.Args[2] 23055 mem_0 := mem.Args[0] 23056 if mem_0.Op != OpOffPtr { 23057 break 23058 } 23059 o3 := mem_0.AuxInt 23060 p3 := mem_0.Args[0] 23061 mem_2 := mem.Args[2] 23062 if mem_2.Op != OpStore { 23063 break 23064 } 23065 t4 := mem_2.Aux 23066 _ = mem_2.Args[2] 23067 mem_2_0 := mem_2.Args[0] 23068 if mem_2_0.Op != OpOffPtr { 23069 break 23070 } 23071 o4 := mem_2_0.AuxInt 23072 p4 := mem_2_0.Args[0] 23073 mem_2_2 := mem_2.Args[2] 23074 if mem_2_2.Op != OpStore { 23075 break 23076 } 23077 t5 := mem_2_2.Aux 23078 _ = mem_2_2.Args[2] 23079 mem_2_2_0 := mem_2_2.Args[0] 23080 if mem_2_2_0.Op != OpOffPtr { 23081 break 23082 } 23083 o5 := mem_2_2_0.AuxInt 23084 p5 := mem_2_2_0.Args[0] 23085 if oldmem != mem_2_2.Args[2] { 23086 break 23087 } 23088 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())) { 23089 break 23090 } 23091 v.reset(OpCopy) 23092 v.Type = mem.Type 23093 v.AddArg(mem) 23094 return true 23095 } 23096 // match: (Store _ (StructMake0) mem) 23097 // cond: 23098 // result: mem 23099 for { 23100 _ = v.Args[2] 23101 v_1 := v.Args[1] 23102 if v_1.Op != OpStructMake0 { 23103 break 23104 } 23105 mem := v.Args[2] 23106 v.reset(OpCopy) 23107 v.Type = mem.Type 23108 v.AddArg(mem) 23109 return true 23110 } 23111 // match: (Store dst (StructMake1 <t> f0) mem) 23112 // cond: 23113 // result: (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem) 23114 for { 23115 _ = v.Args[2] 23116 dst := v.Args[0] 23117 v_1 := v.Args[1] 23118 if v_1.Op != OpStructMake1 { 23119 break 23120 } 23121 t := v_1.Type 23122 f0 := v_1.Args[0] 23123 mem := v.Args[2] 23124 v.reset(OpStore) 23125 v.Aux = t.FieldType(0) 23126 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 23127 v0.AuxInt = 0 23128 v0.AddArg(dst) 23129 v.AddArg(v0) 23130 v.AddArg(f0) 23131 v.AddArg(mem) 23132 return true 23133 } 23134 // match: (Store dst (StructMake2 <t> f0 f1) mem) 23135 // cond: 23136 // 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)) 23137 for { 23138 _ = v.Args[2] 23139 dst := v.Args[0] 23140 v_1 := v.Args[1] 23141 if v_1.Op != OpStructMake2 { 23142 break 23143 } 23144 t := v_1.Type 23145 _ = v_1.Args[1] 23146 f0 := v_1.Args[0] 23147 f1 := v_1.Args[1] 23148 mem := v.Args[2] 23149 v.reset(OpStore) 23150 v.Aux = t.FieldType(1) 23151 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 23152 v0.AuxInt = t.FieldOff(1) 23153 v0.AddArg(dst) 23154 v.AddArg(v0) 23155 v.AddArg(f1) 23156 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23157 v1.Aux = t.FieldType(0) 23158 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 23159 v2.AuxInt = 0 23160 v2.AddArg(dst) 23161 v1.AddArg(v2) 23162 v1.AddArg(f0) 23163 v1.AddArg(mem) 23164 v.AddArg(v1) 23165 return true 23166 } 23167 // match: (Store dst (StructMake3 <t> f0 f1 f2) mem) 23168 // cond: 23169 // 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))) 23170 for { 23171 _ = v.Args[2] 23172 dst := v.Args[0] 23173 v_1 := v.Args[1] 23174 if v_1.Op != OpStructMake3 { 23175 break 23176 } 23177 t := v_1.Type 23178 _ = v_1.Args[2] 23179 f0 := v_1.Args[0] 23180 f1 := v_1.Args[1] 23181 f2 := v_1.Args[2] 23182 mem := v.Args[2] 23183 v.reset(OpStore) 23184 v.Aux = t.FieldType(2) 23185 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 23186 v0.AuxInt = t.FieldOff(2) 23187 v0.AddArg(dst) 23188 v.AddArg(v0) 23189 v.AddArg(f2) 23190 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23191 v1.Aux = t.FieldType(1) 23192 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 23193 v2.AuxInt = t.FieldOff(1) 23194 v2.AddArg(dst) 23195 v1.AddArg(v2) 23196 v1.AddArg(f1) 23197 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23198 v3.Aux = t.FieldType(0) 23199 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 23200 v4.AuxInt = 0 23201 v4.AddArg(dst) 23202 v3.AddArg(v4) 23203 v3.AddArg(f0) 23204 v3.AddArg(mem) 23205 v1.AddArg(v3) 23206 v.AddArg(v1) 23207 return true 23208 } 23209 // match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem) 23210 // cond: 23211 // 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)))) 23212 for { 23213 _ = v.Args[2] 23214 dst := v.Args[0] 23215 v_1 := v.Args[1] 23216 if v_1.Op != OpStructMake4 { 23217 break 23218 } 23219 t := v_1.Type 23220 _ = v_1.Args[3] 23221 f0 := v_1.Args[0] 23222 f1 := v_1.Args[1] 23223 f2 := v_1.Args[2] 23224 f3 := v_1.Args[3] 23225 mem := v.Args[2] 23226 v.reset(OpStore) 23227 v.Aux = t.FieldType(3) 23228 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 23229 v0.AuxInt = t.FieldOff(3) 23230 v0.AddArg(dst) 23231 v.AddArg(v0) 23232 v.AddArg(f3) 23233 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23234 v1.Aux = t.FieldType(2) 23235 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 23236 v2.AuxInt = t.FieldOff(2) 23237 v2.AddArg(dst) 23238 v1.AddArg(v2) 23239 v1.AddArg(f2) 23240 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23241 v3.Aux = t.FieldType(1) 23242 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 23243 v4.AuxInt = t.FieldOff(1) 23244 v4.AddArg(dst) 23245 v3.AddArg(v4) 23246 v3.AddArg(f1) 23247 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23248 v5.Aux = t.FieldType(0) 23249 v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 23250 v6.AuxInt = 0 23251 v6.AddArg(dst) 23252 v5.AddArg(v6) 23253 v5.AddArg(f0) 23254 v5.AddArg(mem) 23255 v3.AddArg(v5) 23256 v1.AddArg(v3) 23257 v.AddArg(v1) 23258 return true 23259 } 23260 // match: (Store {t} dst (Load src mem) mem) 23261 // cond: !fe.CanSSA(t.(*types.Type)) 23262 // result: (Move {t} [t.(*types.Type).Size()] dst src mem) 23263 for { 23264 t := v.Aux 23265 _ = v.Args[2] 23266 dst := v.Args[0] 23267 v_1 := v.Args[1] 23268 if v_1.Op != OpLoad { 23269 break 23270 } 23271 _ = v_1.Args[1] 23272 src := v_1.Args[0] 23273 mem := v_1.Args[1] 23274 if mem != v.Args[2] { 23275 break 23276 } 23277 if !(!fe.CanSSA(t.(*types.Type))) { 23278 break 23279 } 23280 v.reset(OpMove) 23281 v.AuxInt = t.(*types.Type).Size() 23282 v.Aux = t 23283 v.AddArg(dst) 23284 v.AddArg(src) 23285 v.AddArg(mem) 23286 return true 23287 } 23288 return false 23289 } 23290 func rewriteValuegeneric_OpStore_10(v *Value) bool { 23291 b := v.Block 23292 _ = b 23293 config := b.Func.Config 23294 _ = config 23295 fe := b.Func.fe 23296 _ = fe 23297 // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) 23298 // cond: !fe.CanSSA(t.(*types.Type)) 23299 // result: (Move {t} [t.(*types.Type).Size()] dst src (VarDef {x} mem)) 23300 for { 23301 t := v.Aux 23302 _ = v.Args[2] 23303 dst := v.Args[0] 23304 v_1 := v.Args[1] 23305 if v_1.Op != OpLoad { 23306 break 23307 } 23308 _ = v_1.Args[1] 23309 src := v_1.Args[0] 23310 mem := v_1.Args[1] 23311 v_2 := v.Args[2] 23312 if v_2.Op != OpVarDef { 23313 break 23314 } 23315 x := v_2.Aux 23316 if mem != v_2.Args[0] { 23317 break 23318 } 23319 if !(!fe.CanSSA(t.(*types.Type))) { 23320 break 23321 } 23322 v.reset(OpMove) 23323 v.AuxInt = t.(*types.Type).Size() 23324 v.Aux = t 23325 v.AddArg(dst) 23326 v.AddArg(src) 23327 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) 23328 v0.Aux = x 23329 v0.AddArg(mem) 23330 v.AddArg(v0) 23331 return true 23332 } 23333 // match: (Store _ (ArrayMake0) mem) 23334 // cond: 23335 // result: mem 23336 for { 23337 _ = v.Args[2] 23338 v_1 := v.Args[1] 23339 if v_1.Op != OpArrayMake0 { 23340 break 23341 } 23342 mem := v.Args[2] 23343 v.reset(OpCopy) 23344 v.Type = mem.Type 23345 v.AddArg(mem) 23346 return true 23347 } 23348 // match: (Store dst (ArrayMake1 e) mem) 23349 // cond: 23350 // result: (Store {e.Type} dst e mem) 23351 for { 23352 _ = v.Args[2] 23353 dst := v.Args[0] 23354 v_1 := v.Args[1] 23355 if v_1.Op != OpArrayMake1 { 23356 break 23357 } 23358 e := v_1.Args[0] 23359 mem := v.Args[2] 23360 v.reset(OpStore) 23361 v.Aux = e.Type 23362 v.AddArg(dst) 23363 v.AddArg(e) 23364 v.AddArg(mem) 23365 return true 23366 } 23367 // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) 23368 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 23369 // result: mem 23370 for { 23371 _ = v.Args[2] 23372 v_0 := v.Args[0] 23373 if v_0.Op != OpLoad { 23374 break 23375 } 23376 _ = v_0.Args[1] 23377 v_0_0 := v_0.Args[0] 23378 if v_0_0.Op != OpOffPtr { 23379 break 23380 } 23381 c := v_0_0.AuxInt 23382 v_0_0_0 := v_0_0.Args[0] 23383 if v_0_0_0.Op != OpSP { 23384 break 23385 } 23386 mem := v_0.Args[1] 23387 x := v.Args[1] 23388 if mem != v.Args[2] { 23389 break 23390 } 23391 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 23392 break 23393 } 23394 v.reset(OpCopy) 23395 v.Type = mem.Type 23396 v.AddArg(mem) 23397 return true 23398 } 23399 // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) 23400 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 23401 // result: mem 23402 for { 23403 _ = v.Args[2] 23404 v_0 := v.Args[0] 23405 if v_0.Op != OpOffPtr { 23406 break 23407 } 23408 v_0_0 := v_0.Args[0] 23409 if v_0_0.Op != OpLoad { 23410 break 23411 } 23412 _ = v_0_0.Args[1] 23413 v_0_0_0 := v_0_0.Args[0] 23414 if v_0_0_0.Op != OpOffPtr { 23415 break 23416 } 23417 c := v_0_0_0.AuxInt 23418 v_0_0_0_0 := v_0_0_0.Args[0] 23419 if v_0_0_0_0.Op != OpSP { 23420 break 23421 } 23422 mem := v_0_0.Args[1] 23423 x := v.Args[1] 23424 if mem != v.Args[2] { 23425 break 23426 } 23427 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 23428 break 23429 } 23430 v.reset(OpCopy) 23431 v.Type = mem.Type 23432 v.AddArg(mem) 23433 return true 23434 } 23435 return false 23436 } 23437 func rewriteValuegeneric_OpStringLen_0(v *Value) bool { 23438 // match: (StringLen (StringMake _ (Const64 <t> [c]))) 23439 // cond: 23440 // result: (Const64 <t> [c]) 23441 for { 23442 v_0 := v.Args[0] 23443 if v_0.Op != OpStringMake { 23444 break 23445 } 23446 _ = v_0.Args[1] 23447 v_0_1 := v_0.Args[1] 23448 if v_0_1.Op != OpConst64 { 23449 break 23450 } 23451 t := v_0_1.Type 23452 c := v_0_1.AuxInt 23453 v.reset(OpConst64) 23454 v.Type = t 23455 v.AuxInt = c 23456 return true 23457 } 23458 return false 23459 } 23460 func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { 23461 // match: (StringPtr (StringMake (Const64 <t> [c]) _)) 23462 // cond: 23463 // result: (Const64 <t> [c]) 23464 for { 23465 v_0 := v.Args[0] 23466 if v_0.Op != OpStringMake { 23467 break 23468 } 23469 _ = v_0.Args[1] 23470 v_0_0 := v_0.Args[0] 23471 if v_0_0.Op != OpConst64 { 23472 break 23473 } 23474 t := v_0_0.Type 23475 c := v_0_0.AuxInt 23476 v.reset(OpConst64) 23477 v.Type = t 23478 v.AuxInt = c 23479 return true 23480 } 23481 return false 23482 } 23483 func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { 23484 // match: (StructSelect (StructMake1 x)) 23485 // cond: 23486 // result: x 23487 for { 23488 v_0 := v.Args[0] 23489 if v_0.Op != OpStructMake1 { 23490 break 23491 } 23492 x := v_0.Args[0] 23493 v.reset(OpCopy) 23494 v.Type = x.Type 23495 v.AddArg(x) 23496 return true 23497 } 23498 // match: (StructSelect [0] (StructMake2 x _)) 23499 // cond: 23500 // result: x 23501 for { 23502 if v.AuxInt != 0 { 23503 break 23504 } 23505 v_0 := v.Args[0] 23506 if v_0.Op != OpStructMake2 { 23507 break 23508 } 23509 _ = v_0.Args[1] 23510 x := v_0.Args[0] 23511 v.reset(OpCopy) 23512 v.Type = x.Type 23513 v.AddArg(x) 23514 return true 23515 } 23516 // match: (StructSelect [1] (StructMake2 _ x)) 23517 // cond: 23518 // result: x 23519 for { 23520 if v.AuxInt != 1 { 23521 break 23522 } 23523 v_0 := v.Args[0] 23524 if v_0.Op != OpStructMake2 { 23525 break 23526 } 23527 _ = v_0.Args[1] 23528 x := v_0.Args[1] 23529 v.reset(OpCopy) 23530 v.Type = x.Type 23531 v.AddArg(x) 23532 return true 23533 } 23534 // match: (StructSelect [0] (StructMake3 x _ _)) 23535 // cond: 23536 // result: x 23537 for { 23538 if v.AuxInt != 0 { 23539 break 23540 } 23541 v_0 := v.Args[0] 23542 if v_0.Op != OpStructMake3 { 23543 break 23544 } 23545 _ = v_0.Args[2] 23546 x := v_0.Args[0] 23547 v.reset(OpCopy) 23548 v.Type = x.Type 23549 v.AddArg(x) 23550 return true 23551 } 23552 // match: (StructSelect [1] (StructMake3 _ x _)) 23553 // cond: 23554 // result: x 23555 for { 23556 if v.AuxInt != 1 { 23557 break 23558 } 23559 v_0 := v.Args[0] 23560 if v_0.Op != OpStructMake3 { 23561 break 23562 } 23563 _ = v_0.Args[2] 23564 x := v_0.Args[1] 23565 v.reset(OpCopy) 23566 v.Type = x.Type 23567 v.AddArg(x) 23568 return true 23569 } 23570 // match: (StructSelect [2] (StructMake3 _ _ x)) 23571 // cond: 23572 // result: x 23573 for { 23574 if v.AuxInt != 2 { 23575 break 23576 } 23577 v_0 := v.Args[0] 23578 if v_0.Op != OpStructMake3 { 23579 break 23580 } 23581 _ = v_0.Args[2] 23582 x := v_0.Args[2] 23583 v.reset(OpCopy) 23584 v.Type = x.Type 23585 v.AddArg(x) 23586 return true 23587 } 23588 // match: (StructSelect [0] (StructMake4 x _ _ _)) 23589 // cond: 23590 // result: x 23591 for { 23592 if v.AuxInt != 0 { 23593 break 23594 } 23595 v_0 := v.Args[0] 23596 if v_0.Op != OpStructMake4 { 23597 break 23598 } 23599 _ = v_0.Args[3] 23600 x := v_0.Args[0] 23601 v.reset(OpCopy) 23602 v.Type = x.Type 23603 v.AddArg(x) 23604 return true 23605 } 23606 // match: (StructSelect [1] (StructMake4 _ x _ _)) 23607 // cond: 23608 // result: x 23609 for { 23610 if v.AuxInt != 1 { 23611 break 23612 } 23613 v_0 := v.Args[0] 23614 if v_0.Op != OpStructMake4 { 23615 break 23616 } 23617 _ = v_0.Args[3] 23618 x := v_0.Args[1] 23619 v.reset(OpCopy) 23620 v.Type = x.Type 23621 v.AddArg(x) 23622 return true 23623 } 23624 // match: (StructSelect [2] (StructMake4 _ _ x _)) 23625 // cond: 23626 // result: x 23627 for { 23628 if v.AuxInt != 2 { 23629 break 23630 } 23631 v_0 := v.Args[0] 23632 if v_0.Op != OpStructMake4 { 23633 break 23634 } 23635 _ = v_0.Args[3] 23636 x := v_0.Args[2] 23637 v.reset(OpCopy) 23638 v.Type = x.Type 23639 v.AddArg(x) 23640 return true 23641 } 23642 // match: (StructSelect [3] (StructMake4 _ _ _ x)) 23643 // cond: 23644 // result: x 23645 for { 23646 if v.AuxInt != 3 { 23647 break 23648 } 23649 v_0 := v.Args[0] 23650 if v_0.Op != OpStructMake4 { 23651 break 23652 } 23653 _ = v_0.Args[3] 23654 x := v_0.Args[3] 23655 v.reset(OpCopy) 23656 v.Type = x.Type 23657 v.AddArg(x) 23658 return true 23659 } 23660 return false 23661 } 23662 func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { 23663 b := v.Block 23664 _ = b 23665 fe := b.Func.fe 23666 _ = fe 23667 // match: (StructSelect [i] x:(Load <t> ptr mem)) 23668 // cond: !fe.CanSSA(t) 23669 // result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem) 23670 for { 23671 i := v.AuxInt 23672 x := v.Args[0] 23673 if x.Op != OpLoad { 23674 break 23675 } 23676 t := x.Type 23677 _ = x.Args[1] 23678 ptr := x.Args[0] 23679 mem := x.Args[1] 23680 if !(!fe.CanSSA(t)) { 23681 break 23682 } 23683 b = x.Block 23684 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 23685 v.reset(OpCopy) 23686 v.AddArg(v0) 23687 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) 23688 v1.AuxInt = t.FieldOff(int(i)) 23689 v1.AddArg(ptr) 23690 v0.AddArg(v1) 23691 v0.AddArg(mem) 23692 return true 23693 } 23694 // match: (StructSelect [0] x:(IData _)) 23695 // cond: 23696 // result: x 23697 for { 23698 if v.AuxInt != 0 { 23699 break 23700 } 23701 x := v.Args[0] 23702 if x.Op != OpIData { 23703 break 23704 } 23705 v.reset(OpCopy) 23706 v.Type = x.Type 23707 v.AddArg(x) 23708 return true 23709 } 23710 return false 23711 } 23712 func rewriteValuegeneric_OpSub16_0(v *Value) bool { 23713 b := v.Block 23714 _ = b 23715 // match: (Sub16 (Const16 [c]) (Const16 [d])) 23716 // cond: 23717 // result: (Const16 [int64(int16(c-d))]) 23718 for { 23719 _ = v.Args[1] 23720 v_0 := v.Args[0] 23721 if v_0.Op != OpConst16 { 23722 break 23723 } 23724 c := v_0.AuxInt 23725 v_1 := v.Args[1] 23726 if v_1.Op != OpConst16 { 23727 break 23728 } 23729 d := v_1.AuxInt 23730 v.reset(OpConst16) 23731 v.AuxInt = int64(int16(c - d)) 23732 return true 23733 } 23734 // match: (Sub16 x (Const16 <t> [c])) 23735 // cond: x.Op != OpConst16 23736 // result: (Add16 (Const16 <t> [int64(int16(-c))]) x) 23737 for { 23738 _ = v.Args[1] 23739 x := v.Args[0] 23740 v_1 := v.Args[1] 23741 if v_1.Op != OpConst16 { 23742 break 23743 } 23744 t := v_1.Type 23745 c := v_1.AuxInt 23746 if !(x.Op != OpConst16) { 23747 break 23748 } 23749 v.reset(OpAdd16) 23750 v0 := b.NewValue0(v.Pos, OpConst16, t) 23751 v0.AuxInt = int64(int16(-c)) 23752 v.AddArg(v0) 23753 v.AddArg(x) 23754 return true 23755 } 23756 // match: (Sub16 x x) 23757 // cond: 23758 // result: (Const16 [0]) 23759 for { 23760 _ = v.Args[1] 23761 x := v.Args[0] 23762 if x != v.Args[1] { 23763 break 23764 } 23765 v.reset(OpConst16) 23766 v.AuxInt = 0 23767 return true 23768 } 23769 // match: (Sub16 (Add16 x y) x) 23770 // cond: 23771 // result: y 23772 for { 23773 _ = v.Args[1] 23774 v_0 := v.Args[0] 23775 if v_0.Op != OpAdd16 { 23776 break 23777 } 23778 _ = v_0.Args[1] 23779 x := v_0.Args[0] 23780 y := v_0.Args[1] 23781 if x != v.Args[1] { 23782 break 23783 } 23784 v.reset(OpCopy) 23785 v.Type = y.Type 23786 v.AddArg(y) 23787 return true 23788 } 23789 // match: (Sub16 (Add16 y x) x) 23790 // cond: 23791 // result: y 23792 for { 23793 _ = v.Args[1] 23794 v_0 := v.Args[0] 23795 if v_0.Op != OpAdd16 { 23796 break 23797 } 23798 _ = v_0.Args[1] 23799 y := v_0.Args[0] 23800 x := v_0.Args[1] 23801 if x != v.Args[1] { 23802 break 23803 } 23804 v.reset(OpCopy) 23805 v.Type = y.Type 23806 v.AddArg(y) 23807 return true 23808 } 23809 // match: (Sub16 (Add16 x y) y) 23810 // cond: 23811 // result: x 23812 for { 23813 _ = v.Args[1] 23814 v_0 := v.Args[0] 23815 if v_0.Op != OpAdd16 { 23816 break 23817 } 23818 _ = v_0.Args[1] 23819 x := v_0.Args[0] 23820 y := v_0.Args[1] 23821 if y != v.Args[1] { 23822 break 23823 } 23824 v.reset(OpCopy) 23825 v.Type = x.Type 23826 v.AddArg(x) 23827 return true 23828 } 23829 // match: (Sub16 (Add16 y x) y) 23830 // cond: 23831 // result: x 23832 for { 23833 _ = v.Args[1] 23834 v_0 := v.Args[0] 23835 if v_0.Op != OpAdd16 { 23836 break 23837 } 23838 _ = v_0.Args[1] 23839 y := v_0.Args[0] 23840 x := v_0.Args[1] 23841 if y != v.Args[1] { 23842 break 23843 } 23844 v.reset(OpCopy) 23845 v.Type = x.Type 23846 v.AddArg(x) 23847 return true 23848 } 23849 // match: (Sub16 x (Sub16 i:(Const16 <t>) z)) 23850 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 23851 // result: (Sub16 (Add16 <t> x z) i) 23852 for { 23853 _ = v.Args[1] 23854 x := v.Args[0] 23855 v_1 := v.Args[1] 23856 if v_1.Op != OpSub16 { 23857 break 23858 } 23859 _ = v_1.Args[1] 23860 i := v_1.Args[0] 23861 if i.Op != OpConst16 { 23862 break 23863 } 23864 t := i.Type 23865 z := v_1.Args[1] 23866 if !(z.Op != OpConst16 && x.Op != OpConst16) { 23867 break 23868 } 23869 v.reset(OpSub16) 23870 v0 := b.NewValue0(v.Pos, OpAdd16, t) 23871 v0.AddArg(x) 23872 v0.AddArg(z) 23873 v.AddArg(v0) 23874 v.AddArg(i) 23875 return true 23876 } 23877 // match: (Sub16 x (Sub16 z i:(Const16 <t>))) 23878 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 23879 // result: (Add16 i (Sub16 <t> x z)) 23880 for { 23881 _ = v.Args[1] 23882 x := v.Args[0] 23883 v_1 := v.Args[1] 23884 if v_1.Op != OpSub16 { 23885 break 23886 } 23887 _ = v_1.Args[1] 23888 z := v_1.Args[0] 23889 i := v_1.Args[1] 23890 if i.Op != OpConst16 { 23891 break 23892 } 23893 t := i.Type 23894 if !(z.Op != OpConst16 && x.Op != OpConst16) { 23895 break 23896 } 23897 v.reset(OpAdd16) 23898 v.AddArg(i) 23899 v0 := b.NewValue0(v.Pos, OpSub16, t) 23900 v0.AddArg(x) 23901 v0.AddArg(z) 23902 v.AddArg(v0) 23903 return true 23904 } 23905 // match: (Sub16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 23906 // cond: 23907 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 23908 for { 23909 _ = v.Args[1] 23910 v_0 := v.Args[0] 23911 if v_0.Op != OpConst16 { 23912 break 23913 } 23914 t := v_0.Type 23915 c := v_0.AuxInt 23916 v_1 := v.Args[1] 23917 if v_1.Op != OpSub16 { 23918 break 23919 } 23920 _ = v_1.Args[1] 23921 x := v_1.Args[0] 23922 v_1_1 := v_1.Args[1] 23923 if v_1_1.Op != OpConst16 { 23924 break 23925 } 23926 if v_1_1.Type != t { 23927 break 23928 } 23929 d := v_1_1.AuxInt 23930 v.reset(OpSub16) 23931 v0 := b.NewValue0(v.Pos, OpConst16, t) 23932 v0.AuxInt = int64(int16(c + d)) 23933 v.AddArg(v0) 23934 v.AddArg(x) 23935 return true 23936 } 23937 return false 23938 } 23939 func rewriteValuegeneric_OpSub16_10(v *Value) bool { 23940 b := v.Block 23941 _ = b 23942 // match: (Sub16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 23943 // cond: 23944 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 23945 for { 23946 _ = v.Args[1] 23947 v_0 := v.Args[0] 23948 if v_0.Op != OpConst16 { 23949 break 23950 } 23951 t := v_0.Type 23952 c := v_0.AuxInt 23953 v_1 := v.Args[1] 23954 if v_1.Op != OpSub16 { 23955 break 23956 } 23957 _ = v_1.Args[1] 23958 v_1_0 := v_1.Args[0] 23959 if v_1_0.Op != OpConst16 { 23960 break 23961 } 23962 if v_1_0.Type != t { 23963 break 23964 } 23965 d := v_1_0.AuxInt 23966 x := v_1.Args[1] 23967 v.reset(OpAdd16) 23968 v0 := b.NewValue0(v.Pos, OpConst16, t) 23969 v0.AuxInt = int64(int16(c - d)) 23970 v.AddArg(v0) 23971 v.AddArg(x) 23972 return true 23973 } 23974 return false 23975 } 23976 func rewriteValuegeneric_OpSub32_0(v *Value) bool { 23977 b := v.Block 23978 _ = b 23979 // match: (Sub32 (Const32 [c]) (Const32 [d])) 23980 // cond: 23981 // result: (Const32 [int64(int32(c-d))]) 23982 for { 23983 _ = v.Args[1] 23984 v_0 := v.Args[0] 23985 if v_0.Op != OpConst32 { 23986 break 23987 } 23988 c := v_0.AuxInt 23989 v_1 := v.Args[1] 23990 if v_1.Op != OpConst32 { 23991 break 23992 } 23993 d := v_1.AuxInt 23994 v.reset(OpConst32) 23995 v.AuxInt = int64(int32(c - d)) 23996 return true 23997 } 23998 // match: (Sub32 x (Const32 <t> [c])) 23999 // cond: x.Op != OpConst32 24000 // result: (Add32 (Const32 <t> [int64(int32(-c))]) x) 24001 for { 24002 _ = v.Args[1] 24003 x := v.Args[0] 24004 v_1 := v.Args[1] 24005 if v_1.Op != OpConst32 { 24006 break 24007 } 24008 t := v_1.Type 24009 c := v_1.AuxInt 24010 if !(x.Op != OpConst32) { 24011 break 24012 } 24013 v.reset(OpAdd32) 24014 v0 := b.NewValue0(v.Pos, OpConst32, t) 24015 v0.AuxInt = int64(int32(-c)) 24016 v.AddArg(v0) 24017 v.AddArg(x) 24018 return true 24019 } 24020 // match: (Sub32 x x) 24021 // cond: 24022 // result: (Const32 [0]) 24023 for { 24024 _ = v.Args[1] 24025 x := v.Args[0] 24026 if x != v.Args[1] { 24027 break 24028 } 24029 v.reset(OpConst32) 24030 v.AuxInt = 0 24031 return true 24032 } 24033 // match: (Sub32 (Add32 x y) x) 24034 // cond: 24035 // result: y 24036 for { 24037 _ = v.Args[1] 24038 v_0 := v.Args[0] 24039 if v_0.Op != OpAdd32 { 24040 break 24041 } 24042 _ = v_0.Args[1] 24043 x := v_0.Args[0] 24044 y := v_0.Args[1] 24045 if x != v.Args[1] { 24046 break 24047 } 24048 v.reset(OpCopy) 24049 v.Type = y.Type 24050 v.AddArg(y) 24051 return true 24052 } 24053 // match: (Sub32 (Add32 y x) x) 24054 // cond: 24055 // result: y 24056 for { 24057 _ = v.Args[1] 24058 v_0 := v.Args[0] 24059 if v_0.Op != OpAdd32 { 24060 break 24061 } 24062 _ = v_0.Args[1] 24063 y := v_0.Args[0] 24064 x := v_0.Args[1] 24065 if x != v.Args[1] { 24066 break 24067 } 24068 v.reset(OpCopy) 24069 v.Type = y.Type 24070 v.AddArg(y) 24071 return true 24072 } 24073 // match: (Sub32 (Add32 x y) y) 24074 // cond: 24075 // result: x 24076 for { 24077 _ = v.Args[1] 24078 v_0 := v.Args[0] 24079 if v_0.Op != OpAdd32 { 24080 break 24081 } 24082 _ = v_0.Args[1] 24083 x := v_0.Args[0] 24084 y := v_0.Args[1] 24085 if y != v.Args[1] { 24086 break 24087 } 24088 v.reset(OpCopy) 24089 v.Type = x.Type 24090 v.AddArg(x) 24091 return true 24092 } 24093 // match: (Sub32 (Add32 y x) y) 24094 // cond: 24095 // result: x 24096 for { 24097 _ = v.Args[1] 24098 v_0 := v.Args[0] 24099 if v_0.Op != OpAdd32 { 24100 break 24101 } 24102 _ = v_0.Args[1] 24103 y := v_0.Args[0] 24104 x := v_0.Args[1] 24105 if y != v.Args[1] { 24106 break 24107 } 24108 v.reset(OpCopy) 24109 v.Type = x.Type 24110 v.AddArg(x) 24111 return true 24112 } 24113 // match: (Sub32 x (Sub32 i:(Const32 <t>) z)) 24114 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24115 // result: (Sub32 (Add32 <t> x z) i) 24116 for { 24117 _ = v.Args[1] 24118 x := v.Args[0] 24119 v_1 := v.Args[1] 24120 if v_1.Op != OpSub32 { 24121 break 24122 } 24123 _ = v_1.Args[1] 24124 i := v_1.Args[0] 24125 if i.Op != OpConst32 { 24126 break 24127 } 24128 t := i.Type 24129 z := v_1.Args[1] 24130 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24131 break 24132 } 24133 v.reset(OpSub32) 24134 v0 := b.NewValue0(v.Pos, OpAdd32, t) 24135 v0.AddArg(x) 24136 v0.AddArg(z) 24137 v.AddArg(v0) 24138 v.AddArg(i) 24139 return true 24140 } 24141 // match: (Sub32 x (Sub32 z i:(Const32 <t>))) 24142 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24143 // result: (Add32 i (Sub32 <t> x z)) 24144 for { 24145 _ = v.Args[1] 24146 x := v.Args[0] 24147 v_1 := v.Args[1] 24148 if v_1.Op != OpSub32 { 24149 break 24150 } 24151 _ = v_1.Args[1] 24152 z := v_1.Args[0] 24153 i := v_1.Args[1] 24154 if i.Op != OpConst32 { 24155 break 24156 } 24157 t := i.Type 24158 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24159 break 24160 } 24161 v.reset(OpAdd32) 24162 v.AddArg(i) 24163 v0 := b.NewValue0(v.Pos, OpSub32, t) 24164 v0.AddArg(x) 24165 v0.AddArg(z) 24166 v.AddArg(v0) 24167 return true 24168 } 24169 // match: (Sub32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 24170 // cond: 24171 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 24172 for { 24173 _ = v.Args[1] 24174 v_0 := v.Args[0] 24175 if v_0.Op != OpConst32 { 24176 break 24177 } 24178 t := v_0.Type 24179 c := v_0.AuxInt 24180 v_1 := v.Args[1] 24181 if v_1.Op != OpSub32 { 24182 break 24183 } 24184 _ = v_1.Args[1] 24185 x := v_1.Args[0] 24186 v_1_1 := v_1.Args[1] 24187 if v_1_1.Op != OpConst32 { 24188 break 24189 } 24190 if v_1_1.Type != t { 24191 break 24192 } 24193 d := v_1_1.AuxInt 24194 v.reset(OpSub32) 24195 v0 := b.NewValue0(v.Pos, OpConst32, t) 24196 v0.AuxInt = int64(int32(c + d)) 24197 v.AddArg(v0) 24198 v.AddArg(x) 24199 return true 24200 } 24201 return false 24202 } 24203 func rewriteValuegeneric_OpSub32_10(v *Value) bool { 24204 b := v.Block 24205 _ = b 24206 // match: (Sub32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 24207 // cond: 24208 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 24209 for { 24210 _ = v.Args[1] 24211 v_0 := v.Args[0] 24212 if v_0.Op != OpConst32 { 24213 break 24214 } 24215 t := v_0.Type 24216 c := v_0.AuxInt 24217 v_1 := v.Args[1] 24218 if v_1.Op != OpSub32 { 24219 break 24220 } 24221 _ = v_1.Args[1] 24222 v_1_0 := v_1.Args[0] 24223 if v_1_0.Op != OpConst32 { 24224 break 24225 } 24226 if v_1_0.Type != t { 24227 break 24228 } 24229 d := v_1_0.AuxInt 24230 x := v_1.Args[1] 24231 v.reset(OpAdd32) 24232 v0 := b.NewValue0(v.Pos, OpConst32, t) 24233 v0.AuxInt = int64(int32(c - d)) 24234 v.AddArg(v0) 24235 v.AddArg(x) 24236 return true 24237 } 24238 return false 24239 } 24240 func rewriteValuegeneric_OpSub32F_0(v *Value) bool { 24241 // match: (Sub32F (Const32F [c]) (Const32F [d])) 24242 // cond: 24243 // result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))]) 24244 for { 24245 _ = v.Args[1] 24246 v_0 := v.Args[0] 24247 if v_0.Op != OpConst32F { 24248 break 24249 } 24250 c := v_0.AuxInt 24251 v_1 := v.Args[1] 24252 if v_1.Op != OpConst32F { 24253 break 24254 } 24255 d := v_1.AuxInt 24256 v.reset(OpConst32F) 24257 v.AuxInt = f2i(float64(i2f32(c) - i2f32(d))) 24258 return true 24259 } 24260 // match: (Sub32F x (Const32F [0])) 24261 // cond: 24262 // result: x 24263 for { 24264 _ = v.Args[1] 24265 x := v.Args[0] 24266 v_1 := v.Args[1] 24267 if v_1.Op != OpConst32F { 24268 break 24269 } 24270 if v_1.AuxInt != 0 { 24271 break 24272 } 24273 v.reset(OpCopy) 24274 v.Type = x.Type 24275 v.AddArg(x) 24276 return true 24277 } 24278 return false 24279 } 24280 func rewriteValuegeneric_OpSub64_0(v *Value) bool { 24281 b := v.Block 24282 _ = b 24283 // match: (Sub64 (Const64 [c]) (Const64 [d])) 24284 // cond: 24285 // result: (Const64 [c-d]) 24286 for { 24287 _ = v.Args[1] 24288 v_0 := v.Args[0] 24289 if v_0.Op != OpConst64 { 24290 break 24291 } 24292 c := v_0.AuxInt 24293 v_1 := v.Args[1] 24294 if v_1.Op != OpConst64 { 24295 break 24296 } 24297 d := v_1.AuxInt 24298 v.reset(OpConst64) 24299 v.AuxInt = c - d 24300 return true 24301 } 24302 // match: (Sub64 x (Const64 <t> [c])) 24303 // cond: x.Op != OpConst64 24304 // result: (Add64 (Const64 <t> [-c]) x) 24305 for { 24306 _ = v.Args[1] 24307 x := v.Args[0] 24308 v_1 := v.Args[1] 24309 if v_1.Op != OpConst64 { 24310 break 24311 } 24312 t := v_1.Type 24313 c := v_1.AuxInt 24314 if !(x.Op != OpConst64) { 24315 break 24316 } 24317 v.reset(OpAdd64) 24318 v0 := b.NewValue0(v.Pos, OpConst64, t) 24319 v0.AuxInt = -c 24320 v.AddArg(v0) 24321 v.AddArg(x) 24322 return true 24323 } 24324 // match: (Sub64 x x) 24325 // cond: 24326 // result: (Const64 [0]) 24327 for { 24328 _ = v.Args[1] 24329 x := v.Args[0] 24330 if x != v.Args[1] { 24331 break 24332 } 24333 v.reset(OpConst64) 24334 v.AuxInt = 0 24335 return true 24336 } 24337 // match: (Sub64 (Add64 x y) x) 24338 // cond: 24339 // result: y 24340 for { 24341 _ = v.Args[1] 24342 v_0 := v.Args[0] 24343 if v_0.Op != OpAdd64 { 24344 break 24345 } 24346 _ = v_0.Args[1] 24347 x := v_0.Args[0] 24348 y := v_0.Args[1] 24349 if x != v.Args[1] { 24350 break 24351 } 24352 v.reset(OpCopy) 24353 v.Type = y.Type 24354 v.AddArg(y) 24355 return true 24356 } 24357 // match: (Sub64 (Add64 y x) x) 24358 // cond: 24359 // result: y 24360 for { 24361 _ = v.Args[1] 24362 v_0 := v.Args[0] 24363 if v_0.Op != OpAdd64 { 24364 break 24365 } 24366 _ = v_0.Args[1] 24367 y := v_0.Args[0] 24368 x := v_0.Args[1] 24369 if x != v.Args[1] { 24370 break 24371 } 24372 v.reset(OpCopy) 24373 v.Type = y.Type 24374 v.AddArg(y) 24375 return true 24376 } 24377 // match: (Sub64 (Add64 x y) y) 24378 // cond: 24379 // result: x 24380 for { 24381 _ = v.Args[1] 24382 v_0 := v.Args[0] 24383 if v_0.Op != OpAdd64 { 24384 break 24385 } 24386 _ = v_0.Args[1] 24387 x := v_0.Args[0] 24388 y := v_0.Args[1] 24389 if y != v.Args[1] { 24390 break 24391 } 24392 v.reset(OpCopy) 24393 v.Type = x.Type 24394 v.AddArg(x) 24395 return true 24396 } 24397 // match: (Sub64 (Add64 y x) y) 24398 // cond: 24399 // result: x 24400 for { 24401 _ = v.Args[1] 24402 v_0 := v.Args[0] 24403 if v_0.Op != OpAdd64 { 24404 break 24405 } 24406 _ = v_0.Args[1] 24407 y := v_0.Args[0] 24408 x := v_0.Args[1] 24409 if y != v.Args[1] { 24410 break 24411 } 24412 v.reset(OpCopy) 24413 v.Type = x.Type 24414 v.AddArg(x) 24415 return true 24416 } 24417 // match: (Sub64 x (Sub64 i:(Const64 <t>) z)) 24418 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 24419 // result: (Sub64 (Add64 <t> x z) i) 24420 for { 24421 _ = v.Args[1] 24422 x := v.Args[0] 24423 v_1 := v.Args[1] 24424 if v_1.Op != OpSub64 { 24425 break 24426 } 24427 _ = v_1.Args[1] 24428 i := v_1.Args[0] 24429 if i.Op != OpConst64 { 24430 break 24431 } 24432 t := i.Type 24433 z := v_1.Args[1] 24434 if !(z.Op != OpConst64 && x.Op != OpConst64) { 24435 break 24436 } 24437 v.reset(OpSub64) 24438 v0 := b.NewValue0(v.Pos, OpAdd64, t) 24439 v0.AddArg(x) 24440 v0.AddArg(z) 24441 v.AddArg(v0) 24442 v.AddArg(i) 24443 return true 24444 } 24445 // match: (Sub64 x (Sub64 z i:(Const64 <t>))) 24446 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 24447 // result: (Add64 i (Sub64 <t> x z)) 24448 for { 24449 _ = v.Args[1] 24450 x := v.Args[0] 24451 v_1 := v.Args[1] 24452 if v_1.Op != OpSub64 { 24453 break 24454 } 24455 _ = v_1.Args[1] 24456 z := v_1.Args[0] 24457 i := v_1.Args[1] 24458 if i.Op != OpConst64 { 24459 break 24460 } 24461 t := i.Type 24462 if !(z.Op != OpConst64 && x.Op != OpConst64) { 24463 break 24464 } 24465 v.reset(OpAdd64) 24466 v.AddArg(i) 24467 v0 := b.NewValue0(v.Pos, OpSub64, t) 24468 v0.AddArg(x) 24469 v0.AddArg(z) 24470 v.AddArg(v0) 24471 return true 24472 } 24473 // match: (Sub64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 24474 // cond: 24475 // result: (Sub64 (Const64 <t> [c+d]) x) 24476 for { 24477 _ = v.Args[1] 24478 v_0 := v.Args[0] 24479 if v_0.Op != OpConst64 { 24480 break 24481 } 24482 t := v_0.Type 24483 c := v_0.AuxInt 24484 v_1 := v.Args[1] 24485 if v_1.Op != OpSub64 { 24486 break 24487 } 24488 _ = v_1.Args[1] 24489 x := v_1.Args[0] 24490 v_1_1 := v_1.Args[1] 24491 if v_1_1.Op != OpConst64 { 24492 break 24493 } 24494 if v_1_1.Type != t { 24495 break 24496 } 24497 d := v_1_1.AuxInt 24498 v.reset(OpSub64) 24499 v0 := b.NewValue0(v.Pos, OpConst64, t) 24500 v0.AuxInt = c + d 24501 v.AddArg(v0) 24502 v.AddArg(x) 24503 return true 24504 } 24505 return false 24506 } 24507 func rewriteValuegeneric_OpSub64_10(v *Value) bool { 24508 b := v.Block 24509 _ = b 24510 // match: (Sub64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 24511 // cond: 24512 // result: (Add64 (Const64 <t> [c-d]) x) 24513 for { 24514 _ = v.Args[1] 24515 v_0 := v.Args[0] 24516 if v_0.Op != OpConst64 { 24517 break 24518 } 24519 t := v_0.Type 24520 c := v_0.AuxInt 24521 v_1 := v.Args[1] 24522 if v_1.Op != OpSub64 { 24523 break 24524 } 24525 _ = v_1.Args[1] 24526 v_1_0 := v_1.Args[0] 24527 if v_1_0.Op != OpConst64 { 24528 break 24529 } 24530 if v_1_0.Type != t { 24531 break 24532 } 24533 d := v_1_0.AuxInt 24534 x := v_1.Args[1] 24535 v.reset(OpAdd64) 24536 v0 := b.NewValue0(v.Pos, OpConst64, t) 24537 v0.AuxInt = c - d 24538 v.AddArg(v0) 24539 v.AddArg(x) 24540 return true 24541 } 24542 return false 24543 } 24544 func rewriteValuegeneric_OpSub64F_0(v *Value) bool { 24545 // match: (Sub64F (Const64F [c]) (Const64F [d])) 24546 // cond: 24547 // result: (Const64F [f2i(i2f(c) - i2f(d))]) 24548 for { 24549 _ = v.Args[1] 24550 v_0 := v.Args[0] 24551 if v_0.Op != OpConst64F { 24552 break 24553 } 24554 c := v_0.AuxInt 24555 v_1 := v.Args[1] 24556 if v_1.Op != OpConst64F { 24557 break 24558 } 24559 d := v_1.AuxInt 24560 v.reset(OpConst64F) 24561 v.AuxInt = f2i(i2f(c) - i2f(d)) 24562 return true 24563 } 24564 // match: (Sub64F x (Const64F [0])) 24565 // cond: 24566 // result: x 24567 for { 24568 _ = v.Args[1] 24569 x := v.Args[0] 24570 v_1 := v.Args[1] 24571 if v_1.Op != OpConst64F { 24572 break 24573 } 24574 if v_1.AuxInt != 0 { 24575 break 24576 } 24577 v.reset(OpCopy) 24578 v.Type = x.Type 24579 v.AddArg(x) 24580 return true 24581 } 24582 return false 24583 } 24584 func rewriteValuegeneric_OpSub8_0(v *Value) bool { 24585 b := v.Block 24586 _ = b 24587 // match: (Sub8 (Const8 [c]) (Const8 [d])) 24588 // cond: 24589 // result: (Const8 [int64(int8(c-d))]) 24590 for { 24591 _ = v.Args[1] 24592 v_0 := v.Args[0] 24593 if v_0.Op != OpConst8 { 24594 break 24595 } 24596 c := v_0.AuxInt 24597 v_1 := v.Args[1] 24598 if v_1.Op != OpConst8 { 24599 break 24600 } 24601 d := v_1.AuxInt 24602 v.reset(OpConst8) 24603 v.AuxInt = int64(int8(c - d)) 24604 return true 24605 } 24606 // match: (Sub8 x (Const8 <t> [c])) 24607 // cond: x.Op != OpConst8 24608 // result: (Add8 (Const8 <t> [int64(int8(-c))]) x) 24609 for { 24610 _ = v.Args[1] 24611 x := v.Args[0] 24612 v_1 := v.Args[1] 24613 if v_1.Op != OpConst8 { 24614 break 24615 } 24616 t := v_1.Type 24617 c := v_1.AuxInt 24618 if !(x.Op != OpConst8) { 24619 break 24620 } 24621 v.reset(OpAdd8) 24622 v0 := b.NewValue0(v.Pos, OpConst8, t) 24623 v0.AuxInt = int64(int8(-c)) 24624 v.AddArg(v0) 24625 v.AddArg(x) 24626 return true 24627 } 24628 // match: (Sub8 x x) 24629 // cond: 24630 // result: (Const8 [0]) 24631 for { 24632 _ = v.Args[1] 24633 x := v.Args[0] 24634 if x != v.Args[1] { 24635 break 24636 } 24637 v.reset(OpConst8) 24638 v.AuxInt = 0 24639 return true 24640 } 24641 // match: (Sub8 (Add8 x y) x) 24642 // cond: 24643 // result: y 24644 for { 24645 _ = v.Args[1] 24646 v_0 := v.Args[0] 24647 if v_0.Op != OpAdd8 { 24648 break 24649 } 24650 _ = v_0.Args[1] 24651 x := v_0.Args[0] 24652 y := v_0.Args[1] 24653 if x != v.Args[1] { 24654 break 24655 } 24656 v.reset(OpCopy) 24657 v.Type = y.Type 24658 v.AddArg(y) 24659 return true 24660 } 24661 // match: (Sub8 (Add8 y x) x) 24662 // cond: 24663 // result: y 24664 for { 24665 _ = v.Args[1] 24666 v_0 := v.Args[0] 24667 if v_0.Op != OpAdd8 { 24668 break 24669 } 24670 _ = v_0.Args[1] 24671 y := v_0.Args[0] 24672 x := v_0.Args[1] 24673 if x != v.Args[1] { 24674 break 24675 } 24676 v.reset(OpCopy) 24677 v.Type = y.Type 24678 v.AddArg(y) 24679 return true 24680 } 24681 // match: (Sub8 (Add8 x y) y) 24682 // cond: 24683 // result: x 24684 for { 24685 _ = v.Args[1] 24686 v_0 := v.Args[0] 24687 if v_0.Op != OpAdd8 { 24688 break 24689 } 24690 _ = v_0.Args[1] 24691 x := v_0.Args[0] 24692 y := v_0.Args[1] 24693 if y != v.Args[1] { 24694 break 24695 } 24696 v.reset(OpCopy) 24697 v.Type = x.Type 24698 v.AddArg(x) 24699 return true 24700 } 24701 // match: (Sub8 (Add8 y x) y) 24702 // cond: 24703 // result: x 24704 for { 24705 _ = v.Args[1] 24706 v_0 := v.Args[0] 24707 if v_0.Op != OpAdd8 { 24708 break 24709 } 24710 _ = v_0.Args[1] 24711 y := v_0.Args[0] 24712 x := v_0.Args[1] 24713 if y != v.Args[1] { 24714 break 24715 } 24716 v.reset(OpCopy) 24717 v.Type = x.Type 24718 v.AddArg(x) 24719 return true 24720 } 24721 // match: (Sub8 x (Sub8 i:(Const8 <t>) z)) 24722 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 24723 // result: (Sub8 (Add8 <t> x z) i) 24724 for { 24725 _ = v.Args[1] 24726 x := v.Args[0] 24727 v_1 := v.Args[1] 24728 if v_1.Op != OpSub8 { 24729 break 24730 } 24731 _ = v_1.Args[1] 24732 i := v_1.Args[0] 24733 if i.Op != OpConst8 { 24734 break 24735 } 24736 t := i.Type 24737 z := v_1.Args[1] 24738 if !(z.Op != OpConst8 && x.Op != OpConst8) { 24739 break 24740 } 24741 v.reset(OpSub8) 24742 v0 := b.NewValue0(v.Pos, OpAdd8, t) 24743 v0.AddArg(x) 24744 v0.AddArg(z) 24745 v.AddArg(v0) 24746 v.AddArg(i) 24747 return true 24748 } 24749 // match: (Sub8 x (Sub8 z i:(Const8 <t>))) 24750 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 24751 // result: (Add8 i (Sub8 <t> x z)) 24752 for { 24753 _ = v.Args[1] 24754 x := v.Args[0] 24755 v_1 := v.Args[1] 24756 if v_1.Op != OpSub8 { 24757 break 24758 } 24759 _ = v_1.Args[1] 24760 z := v_1.Args[0] 24761 i := v_1.Args[1] 24762 if i.Op != OpConst8 { 24763 break 24764 } 24765 t := i.Type 24766 if !(z.Op != OpConst8 && x.Op != OpConst8) { 24767 break 24768 } 24769 v.reset(OpAdd8) 24770 v.AddArg(i) 24771 v0 := b.NewValue0(v.Pos, OpSub8, t) 24772 v0.AddArg(x) 24773 v0.AddArg(z) 24774 v.AddArg(v0) 24775 return true 24776 } 24777 // match: (Sub8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 24778 // cond: 24779 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 24780 for { 24781 _ = v.Args[1] 24782 v_0 := v.Args[0] 24783 if v_0.Op != OpConst8 { 24784 break 24785 } 24786 t := v_0.Type 24787 c := v_0.AuxInt 24788 v_1 := v.Args[1] 24789 if v_1.Op != OpSub8 { 24790 break 24791 } 24792 _ = v_1.Args[1] 24793 x := v_1.Args[0] 24794 v_1_1 := v_1.Args[1] 24795 if v_1_1.Op != OpConst8 { 24796 break 24797 } 24798 if v_1_1.Type != t { 24799 break 24800 } 24801 d := v_1_1.AuxInt 24802 v.reset(OpSub8) 24803 v0 := b.NewValue0(v.Pos, OpConst8, t) 24804 v0.AuxInt = int64(int8(c + d)) 24805 v.AddArg(v0) 24806 v.AddArg(x) 24807 return true 24808 } 24809 return false 24810 } 24811 func rewriteValuegeneric_OpSub8_10(v *Value) bool { 24812 b := v.Block 24813 _ = b 24814 // match: (Sub8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 24815 // cond: 24816 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 24817 for { 24818 _ = v.Args[1] 24819 v_0 := v.Args[0] 24820 if v_0.Op != OpConst8 { 24821 break 24822 } 24823 t := v_0.Type 24824 c := v_0.AuxInt 24825 v_1 := v.Args[1] 24826 if v_1.Op != OpSub8 { 24827 break 24828 } 24829 _ = v_1.Args[1] 24830 v_1_0 := v_1.Args[0] 24831 if v_1_0.Op != OpConst8 { 24832 break 24833 } 24834 if v_1_0.Type != t { 24835 break 24836 } 24837 d := v_1_0.AuxInt 24838 x := v_1.Args[1] 24839 v.reset(OpAdd8) 24840 v0 := b.NewValue0(v.Pos, OpConst8, t) 24841 v0.AuxInt = int64(int8(c - d)) 24842 v.AddArg(v0) 24843 v.AddArg(x) 24844 return true 24845 } 24846 return false 24847 } 24848 func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { 24849 // match: (Trunc16to8 (Const16 [c])) 24850 // cond: 24851 // result: (Const8 [int64(int8(c))]) 24852 for { 24853 v_0 := v.Args[0] 24854 if v_0.Op != OpConst16 { 24855 break 24856 } 24857 c := v_0.AuxInt 24858 v.reset(OpConst8) 24859 v.AuxInt = int64(int8(c)) 24860 return true 24861 } 24862 // match: (Trunc16to8 (ZeroExt8to16 x)) 24863 // cond: 24864 // result: x 24865 for { 24866 v_0 := v.Args[0] 24867 if v_0.Op != OpZeroExt8to16 { 24868 break 24869 } 24870 x := v_0.Args[0] 24871 v.reset(OpCopy) 24872 v.Type = x.Type 24873 v.AddArg(x) 24874 return true 24875 } 24876 // match: (Trunc16to8 (SignExt8to16 x)) 24877 // cond: 24878 // result: x 24879 for { 24880 v_0 := v.Args[0] 24881 if v_0.Op != OpSignExt8to16 { 24882 break 24883 } 24884 x := v_0.Args[0] 24885 v.reset(OpCopy) 24886 v.Type = x.Type 24887 v.AddArg(x) 24888 return true 24889 } 24890 // match: (Trunc16to8 (And16 (Const16 [y]) x)) 24891 // cond: y&0xFF == 0xFF 24892 // result: (Trunc16to8 x) 24893 for { 24894 v_0 := v.Args[0] 24895 if v_0.Op != OpAnd16 { 24896 break 24897 } 24898 _ = v_0.Args[1] 24899 v_0_0 := v_0.Args[0] 24900 if v_0_0.Op != OpConst16 { 24901 break 24902 } 24903 y := v_0_0.AuxInt 24904 x := v_0.Args[1] 24905 if !(y&0xFF == 0xFF) { 24906 break 24907 } 24908 v.reset(OpTrunc16to8) 24909 v.AddArg(x) 24910 return true 24911 } 24912 // match: (Trunc16to8 (And16 x (Const16 [y]))) 24913 // cond: y&0xFF == 0xFF 24914 // result: (Trunc16to8 x) 24915 for { 24916 v_0 := v.Args[0] 24917 if v_0.Op != OpAnd16 { 24918 break 24919 } 24920 _ = v_0.Args[1] 24921 x := v_0.Args[0] 24922 v_0_1 := v_0.Args[1] 24923 if v_0_1.Op != OpConst16 { 24924 break 24925 } 24926 y := v_0_1.AuxInt 24927 if !(y&0xFF == 0xFF) { 24928 break 24929 } 24930 v.reset(OpTrunc16to8) 24931 v.AddArg(x) 24932 return true 24933 } 24934 return false 24935 } 24936 func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { 24937 // match: (Trunc32to16 (Const32 [c])) 24938 // cond: 24939 // result: (Const16 [int64(int16(c))]) 24940 for { 24941 v_0 := v.Args[0] 24942 if v_0.Op != OpConst32 { 24943 break 24944 } 24945 c := v_0.AuxInt 24946 v.reset(OpConst16) 24947 v.AuxInt = int64(int16(c)) 24948 return true 24949 } 24950 // match: (Trunc32to16 (ZeroExt8to32 x)) 24951 // cond: 24952 // result: (ZeroExt8to16 x) 24953 for { 24954 v_0 := v.Args[0] 24955 if v_0.Op != OpZeroExt8to32 { 24956 break 24957 } 24958 x := v_0.Args[0] 24959 v.reset(OpZeroExt8to16) 24960 v.AddArg(x) 24961 return true 24962 } 24963 // match: (Trunc32to16 (ZeroExt16to32 x)) 24964 // cond: 24965 // result: x 24966 for { 24967 v_0 := v.Args[0] 24968 if v_0.Op != OpZeroExt16to32 { 24969 break 24970 } 24971 x := v_0.Args[0] 24972 v.reset(OpCopy) 24973 v.Type = x.Type 24974 v.AddArg(x) 24975 return true 24976 } 24977 // match: (Trunc32to16 (SignExt8to32 x)) 24978 // cond: 24979 // result: (SignExt8to16 x) 24980 for { 24981 v_0 := v.Args[0] 24982 if v_0.Op != OpSignExt8to32 { 24983 break 24984 } 24985 x := v_0.Args[0] 24986 v.reset(OpSignExt8to16) 24987 v.AddArg(x) 24988 return true 24989 } 24990 // match: (Trunc32to16 (SignExt16to32 x)) 24991 // cond: 24992 // result: x 24993 for { 24994 v_0 := v.Args[0] 24995 if v_0.Op != OpSignExt16to32 { 24996 break 24997 } 24998 x := v_0.Args[0] 24999 v.reset(OpCopy) 25000 v.Type = x.Type 25001 v.AddArg(x) 25002 return true 25003 } 25004 // match: (Trunc32to16 (And32 (Const32 [y]) x)) 25005 // cond: y&0xFFFF == 0xFFFF 25006 // result: (Trunc32to16 x) 25007 for { 25008 v_0 := v.Args[0] 25009 if v_0.Op != OpAnd32 { 25010 break 25011 } 25012 _ = v_0.Args[1] 25013 v_0_0 := v_0.Args[0] 25014 if v_0_0.Op != OpConst32 { 25015 break 25016 } 25017 y := v_0_0.AuxInt 25018 x := v_0.Args[1] 25019 if !(y&0xFFFF == 0xFFFF) { 25020 break 25021 } 25022 v.reset(OpTrunc32to16) 25023 v.AddArg(x) 25024 return true 25025 } 25026 // match: (Trunc32to16 (And32 x (Const32 [y]))) 25027 // cond: y&0xFFFF == 0xFFFF 25028 // result: (Trunc32to16 x) 25029 for { 25030 v_0 := v.Args[0] 25031 if v_0.Op != OpAnd32 { 25032 break 25033 } 25034 _ = v_0.Args[1] 25035 x := v_0.Args[0] 25036 v_0_1 := v_0.Args[1] 25037 if v_0_1.Op != OpConst32 { 25038 break 25039 } 25040 y := v_0_1.AuxInt 25041 if !(y&0xFFFF == 0xFFFF) { 25042 break 25043 } 25044 v.reset(OpTrunc32to16) 25045 v.AddArg(x) 25046 return true 25047 } 25048 return false 25049 } 25050 func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { 25051 // match: (Trunc32to8 (Const32 [c])) 25052 // cond: 25053 // result: (Const8 [int64(int8(c))]) 25054 for { 25055 v_0 := v.Args[0] 25056 if v_0.Op != OpConst32 { 25057 break 25058 } 25059 c := v_0.AuxInt 25060 v.reset(OpConst8) 25061 v.AuxInt = int64(int8(c)) 25062 return true 25063 } 25064 // match: (Trunc32to8 (ZeroExt8to32 x)) 25065 // cond: 25066 // result: x 25067 for { 25068 v_0 := v.Args[0] 25069 if v_0.Op != OpZeroExt8to32 { 25070 break 25071 } 25072 x := v_0.Args[0] 25073 v.reset(OpCopy) 25074 v.Type = x.Type 25075 v.AddArg(x) 25076 return true 25077 } 25078 // match: (Trunc32to8 (SignExt8to32 x)) 25079 // cond: 25080 // result: x 25081 for { 25082 v_0 := v.Args[0] 25083 if v_0.Op != OpSignExt8to32 { 25084 break 25085 } 25086 x := v_0.Args[0] 25087 v.reset(OpCopy) 25088 v.Type = x.Type 25089 v.AddArg(x) 25090 return true 25091 } 25092 // match: (Trunc32to8 (And32 (Const32 [y]) x)) 25093 // cond: y&0xFF == 0xFF 25094 // result: (Trunc32to8 x) 25095 for { 25096 v_0 := v.Args[0] 25097 if v_0.Op != OpAnd32 { 25098 break 25099 } 25100 _ = v_0.Args[1] 25101 v_0_0 := v_0.Args[0] 25102 if v_0_0.Op != OpConst32 { 25103 break 25104 } 25105 y := v_0_0.AuxInt 25106 x := v_0.Args[1] 25107 if !(y&0xFF == 0xFF) { 25108 break 25109 } 25110 v.reset(OpTrunc32to8) 25111 v.AddArg(x) 25112 return true 25113 } 25114 // match: (Trunc32to8 (And32 x (Const32 [y]))) 25115 // cond: y&0xFF == 0xFF 25116 // result: (Trunc32to8 x) 25117 for { 25118 v_0 := v.Args[0] 25119 if v_0.Op != OpAnd32 { 25120 break 25121 } 25122 _ = v_0.Args[1] 25123 x := v_0.Args[0] 25124 v_0_1 := v_0.Args[1] 25125 if v_0_1.Op != OpConst32 { 25126 break 25127 } 25128 y := v_0_1.AuxInt 25129 if !(y&0xFF == 0xFF) { 25130 break 25131 } 25132 v.reset(OpTrunc32to8) 25133 v.AddArg(x) 25134 return true 25135 } 25136 return false 25137 } 25138 func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { 25139 // match: (Trunc64to16 (Const64 [c])) 25140 // cond: 25141 // result: (Const16 [int64(int16(c))]) 25142 for { 25143 v_0 := v.Args[0] 25144 if v_0.Op != OpConst64 { 25145 break 25146 } 25147 c := v_0.AuxInt 25148 v.reset(OpConst16) 25149 v.AuxInt = int64(int16(c)) 25150 return true 25151 } 25152 // match: (Trunc64to16 (ZeroExt8to64 x)) 25153 // cond: 25154 // result: (ZeroExt8to16 x) 25155 for { 25156 v_0 := v.Args[0] 25157 if v_0.Op != OpZeroExt8to64 { 25158 break 25159 } 25160 x := v_0.Args[0] 25161 v.reset(OpZeroExt8to16) 25162 v.AddArg(x) 25163 return true 25164 } 25165 // match: (Trunc64to16 (ZeroExt16to64 x)) 25166 // cond: 25167 // result: x 25168 for { 25169 v_0 := v.Args[0] 25170 if v_0.Op != OpZeroExt16to64 { 25171 break 25172 } 25173 x := v_0.Args[0] 25174 v.reset(OpCopy) 25175 v.Type = x.Type 25176 v.AddArg(x) 25177 return true 25178 } 25179 // match: (Trunc64to16 (SignExt8to64 x)) 25180 // cond: 25181 // result: (SignExt8to16 x) 25182 for { 25183 v_0 := v.Args[0] 25184 if v_0.Op != OpSignExt8to64 { 25185 break 25186 } 25187 x := v_0.Args[0] 25188 v.reset(OpSignExt8to16) 25189 v.AddArg(x) 25190 return true 25191 } 25192 // match: (Trunc64to16 (SignExt16to64 x)) 25193 // cond: 25194 // result: x 25195 for { 25196 v_0 := v.Args[0] 25197 if v_0.Op != OpSignExt16to64 { 25198 break 25199 } 25200 x := v_0.Args[0] 25201 v.reset(OpCopy) 25202 v.Type = x.Type 25203 v.AddArg(x) 25204 return true 25205 } 25206 // match: (Trunc64to16 (And64 (Const64 [y]) x)) 25207 // cond: y&0xFFFF == 0xFFFF 25208 // result: (Trunc64to16 x) 25209 for { 25210 v_0 := v.Args[0] 25211 if v_0.Op != OpAnd64 { 25212 break 25213 } 25214 _ = v_0.Args[1] 25215 v_0_0 := v_0.Args[0] 25216 if v_0_0.Op != OpConst64 { 25217 break 25218 } 25219 y := v_0_0.AuxInt 25220 x := v_0.Args[1] 25221 if !(y&0xFFFF == 0xFFFF) { 25222 break 25223 } 25224 v.reset(OpTrunc64to16) 25225 v.AddArg(x) 25226 return true 25227 } 25228 // match: (Trunc64to16 (And64 x (Const64 [y]))) 25229 // cond: y&0xFFFF == 0xFFFF 25230 // result: (Trunc64to16 x) 25231 for { 25232 v_0 := v.Args[0] 25233 if v_0.Op != OpAnd64 { 25234 break 25235 } 25236 _ = v_0.Args[1] 25237 x := v_0.Args[0] 25238 v_0_1 := v_0.Args[1] 25239 if v_0_1.Op != OpConst64 { 25240 break 25241 } 25242 y := v_0_1.AuxInt 25243 if !(y&0xFFFF == 0xFFFF) { 25244 break 25245 } 25246 v.reset(OpTrunc64to16) 25247 v.AddArg(x) 25248 return true 25249 } 25250 return false 25251 } 25252 func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { 25253 // match: (Trunc64to32 (Const64 [c])) 25254 // cond: 25255 // result: (Const32 [int64(int32(c))]) 25256 for { 25257 v_0 := v.Args[0] 25258 if v_0.Op != OpConst64 { 25259 break 25260 } 25261 c := v_0.AuxInt 25262 v.reset(OpConst32) 25263 v.AuxInt = int64(int32(c)) 25264 return true 25265 } 25266 // match: (Trunc64to32 (ZeroExt8to64 x)) 25267 // cond: 25268 // result: (ZeroExt8to32 x) 25269 for { 25270 v_0 := v.Args[0] 25271 if v_0.Op != OpZeroExt8to64 { 25272 break 25273 } 25274 x := v_0.Args[0] 25275 v.reset(OpZeroExt8to32) 25276 v.AddArg(x) 25277 return true 25278 } 25279 // match: (Trunc64to32 (ZeroExt16to64 x)) 25280 // cond: 25281 // result: (ZeroExt16to32 x) 25282 for { 25283 v_0 := v.Args[0] 25284 if v_0.Op != OpZeroExt16to64 { 25285 break 25286 } 25287 x := v_0.Args[0] 25288 v.reset(OpZeroExt16to32) 25289 v.AddArg(x) 25290 return true 25291 } 25292 // match: (Trunc64to32 (ZeroExt32to64 x)) 25293 // cond: 25294 // result: x 25295 for { 25296 v_0 := v.Args[0] 25297 if v_0.Op != OpZeroExt32to64 { 25298 break 25299 } 25300 x := v_0.Args[0] 25301 v.reset(OpCopy) 25302 v.Type = x.Type 25303 v.AddArg(x) 25304 return true 25305 } 25306 // match: (Trunc64to32 (SignExt8to64 x)) 25307 // cond: 25308 // result: (SignExt8to32 x) 25309 for { 25310 v_0 := v.Args[0] 25311 if v_0.Op != OpSignExt8to64 { 25312 break 25313 } 25314 x := v_0.Args[0] 25315 v.reset(OpSignExt8to32) 25316 v.AddArg(x) 25317 return true 25318 } 25319 // match: (Trunc64to32 (SignExt16to64 x)) 25320 // cond: 25321 // result: (SignExt16to32 x) 25322 for { 25323 v_0 := v.Args[0] 25324 if v_0.Op != OpSignExt16to64 { 25325 break 25326 } 25327 x := v_0.Args[0] 25328 v.reset(OpSignExt16to32) 25329 v.AddArg(x) 25330 return true 25331 } 25332 // match: (Trunc64to32 (SignExt32to64 x)) 25333 // cond: 25334 // result: x 25335 for { 25336 v_0 := v.Args[0] 25337 if v_0.Op != OpSignExt32to64 { 25338 break 25339 } 25340 x := v_0.Args[0] 25341 v.reset(OpCopy) 25342 v.Type = x.Type 25343 v.AddArg(x) 25344 return true 25345 } 25346 // match: (Trunc64to32 (And64 (Const64 [y]) x)) 25347 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 25348 // result: (Trunc64to32 x) 25349 for { 25350 v_0 := v.Args[0] 25351 if v_0.Op != OpAnd64 { 25352 break 25353 } 25354 _ = v_0.Args[1] 25355 v_0_0 := v_0.Args[0] 25356 if v_0_0.Op != OpConst64 { 25357 break 25358 } 25359 y := v_0_0.AuxInt 25360 x := v_0.Args[1] 25361 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 25362 break 25363 } 25364 v.reset(OpTrunc64to32) 25365 v.AddArg(x) 25366 return true 25367 } 25368 // match: (Trunc64to32 (And64 x (Const64 [y]))) 25369 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 25370 // result: (Trunc64to32 x) 25371 for { 25372 v_0 := v.Args[0] 25373 if v_0.Op != OpAnd64 { 25374 break 25375 } 25376 _ = v_0.Args[1] 25377 x := v_0.Args[0] 25378 v_0_1 := v_0.Args[1] 25379 if v_0_1.Op != OpConst64 { 25380 break 25381 } 25382 y := v_0_1.AuxInt 25383 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 25384 break 25385 } 25386 v.reset(OpTrunc64to32) 25387 v.AddArg(x) 25388 return true 25389 } 25390 return false 25391 } 25392 func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { 25393 // match: (Trunc64to8 (Const64 [c])) 25394 // cond: 25395 // result: (Const8 [int64(int8(c))]) 25396 for { 25397 v_0 := v.Args[0] 25398 if v_0.Op != OpConst64 { 25399 break 25400 } 25401 c := v_0.AuxInt 25402 v.reset(OpConst8) 25403 v.AuxInt = int64(int8(c)) 25404 return true 25405 } 25406 // match: (Trunc64to8 (ZeroExt8to64 x)) 25407 // cond: 25408 // result: x 25409 for { 25410 v_0 := v.Args[0] 25411 if v_0.Op != OpZeroExt8to64 { 25412 break 25413 } 25414 x := v_0.Args[0] 25415 v.reset(OpCopy) 25416 v.Type = x.Type 25417 v.AddArg(x) 25418 return true 25419 } 25420 // match: (Trunc64to8 (SignExt8to64 x)) 25421 // cond: 25422 // result: x 25423 for { 25424 v_0 := v.Args[0] 25425 if v_0.Op != OpSignExt8to64 { 25426 break 25427 } 25428 x := v_0.Args[0] 25429 v.reset(OpCopy) 25430 v.Type = x.Type 25431 v.AddArg(x) 25432 return true 25433 } 25434 // match: (Trunc64to8 (And64 (Const64 [y]) x)) 25435 // cond: y&0xFF == 0xFF 25436 // result: (Trunc64to8 x) 25437 for { 25438 v_0 := v.Args[0] 25439 if v_0.Op != OpAnd64 { 25440 break 25441 } 25442 _ = v_0.Args[1] 25443 v_0_0 := v_0.Args[0] 25444 if v_0_0.Op != OpConst64 { 25445 break 25446 } 25447 y := v_0_0.AuxInt 25448 x := v_0.Args[1] 25449 if !(y&0xFF == 0xFF) { 25450 break 25451 } 25452 v.reset(OpTrunc64to8) 25453 v.AddArg(x) 25454 return true 25455 } 25456 // match: (Trunc64to8 (And64 x (Const64 [y]))) 25457 // cond: y&0xFF == 0xFF 25458 // result: (Trunc64to8 x) 25459 for { 25460 v_0 := v.Args[0] 25461 if v_0.Op != OpAnd64 { 25462 break 25463 } 25464 _ = v_0.Args[1] 25465 x := v_0.Args[0] 25466 v_0_1 := v_0.Args[1] 25467 if v_0_1.Op != OpConst64 { 25468 break 25469 } 25470 y := v_0_1.AuxInt 25471 if !(y&0xFF == 0xFF) { 25472 break 25473 } 25474 v.reset(OpTrunc64to8) 25475 v.AddArg(x) 25476 return true 25477 } 25478 return false 25479 } 25480 func rewriteValuegeneric_OpXor16_0(v *Value) bool { 25481 b := v.Block 25482 _ = b 25483 // match: (Xor16 (Const16 [c]) (Const16 [d])) 25484 // cond: 25485 // result: (Const16 [int64(int16(c^d))]) 25486 for { 25487 _ = v.Args[1] 25488 v_0 := v.Args[0] 25489 if v_0.Op != OpConst16 { 25490 break 25491 } 25492 c := v_0.AuxInt 25493 v_1 := v.Args[1] 25494 if v_1.Op != OpConst16 { 25495 break 25496 } 25497 d := v_1.AuxInt 25498 v.reset(OpConst16) 25499 v.AuxInt = int64(int16(c ^ d)) 25500 return true 25501 } 25502 // match: (Xor16 (Const16 [d]) (Const16 [c])) 25503 // cond: 25504 // result: (Const16 [int64(int16(c^d))]) 25505 for { 25506 _ = v.Args[1] 25507 v_0 := v.Args[0] 25508 if v_0.Op != OpConst16 { 25509 break 25510 } 25511 d := v_0.AuxInt 25512 v_1 := v.Args[1] 25513 if v_1.Op != OpConst16 { 25514 break 25515 } 25516 c := v_1.AuxInt 25517 v.reset(OpConst16) 25518 v.AuxInt = int64(int16(c ^ d)) 25519 return true 25520 } 25521 // match: (Xor16 x x) 25522 // cond: 25523 // result: (Const16 [0]) 25524 for { 25525 _ = v.Args[1] 25526 x := v.Args[0] 25527 if x != v.Args[1] { 25528 break 25529 } 25530 v.reset(OpConst16) 25531 v.AuxInt = 0 25532 return true 25533 } 25534 // match: (Xor16 (Const16 [0]) x) 25535 // cond: 25536 // result: x 25537 for { 25538 _ = v.Args[1] 25539 v_0 := v.Args[0] 25540 if v_0.Op != OpConst16 { 25541 break 25542 } 25543 if v_0.AuxInt != 0 { 25544 break 25545 } 25546 x := v.Args[1] 25547 v.reset(OpCopy) 25548 v.Type = x.Type 25549 v.AddArg(x) 25550 return true 25551 } 25552 // match: (Xor16 x (Const16 [0])) 25553 // cond: 25554 // result: x 25555 for { 25556 _ = v.Args[1] 25557 x := v.Args[0] 25558 v_1 := v.Args[1] 25559 if v_1.Op != OpConst16 { 25560 break 25561 } 25562 if v_1.AuxInt != 0 { 25563 break 25564 } 25565 v.reset(OpCopy) 25566 v.Type = x.Type 25567 v.AddArg(x) 25568 return true 25569 } 25570 // match: (Xor16 x (Xor16 x y)) 25571 // cond: 25572 // result: y 25573 for { 25574 _ = v.Args[1] 25575 x := v.Args[0] 25576 v_1 := v.Args[1] 25577 if v_1.Op != OpXor16 { 25578 break 25579 } 25580 _ = v_1.Args[1] 25581 if x != v_1.Args[0] { 25582 break 25583 } 25584 y := v_1.Args[1] 25585 v.reset(OpCopy) 25586 v.Type = y.Type 25587 v.AddArg(y) 25588 return true 25589 } 25590 // match: (Xor16 x (Xor16 y x)) 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 != OpXor16 { 25598 break 25599 } 25600 _ = v_1.Args[1] 25601 y := v_1.Args[0] 25602 if x != v_1.Args[1] { 25603 break 25604 } 25605 v.reset(OpCopy) 25606 v.Type = y.Type 25607 v.AddArg(y) 25608 return true 25609 } 25610 // match: (Xor16 (Xor16 x y) x) 25611 // cond: 25612 // result: y 25613 for { 25614 _ = v.Args[1] 25615 v_0 := v.Args[0] 25616 if v_0.Op != OpXor16 { 25617 break 25618 } 25619 _ = v_0.Args[1] 25620 x := v_0.Args[0] 25621 y := v_0.Args[1] 25622 if x != v.Args[1] { 25623 break 25624 } 25625 v.reset(OpCopy) 25626 v.Type = y.Type 25627 v.AddArg(y) 25628 return true 25629 } 25630 // match: (Xor16 (Xor16 y x) x) 25631 // cond: 25632 // result: y 25633 for { 25634 _ = v.Args[1] 25635 v_0 := v.Args[0] 25636 if v_0.Op != OpXor16 { 25637 break 25638 } 25639 _ = v_0.Args[1] 25640 y := v_0.Args[0] 25641 x := 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: (Xor16 (Xor16 i:(Const16 <t>) z) x) 25651 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 25652 // result: (Xor16 i (Xor16 <t> z x)) 25653 for { 25654 _ = v.Args[1] 25655 v_0 := v.Args[0] 25656 if v_0.Op != OpXor16 { 25657 break 25658 } 25659 _ = v_0.Args[1] 25660 i := v_0.Args[0] 25661 if i.Op != OpConst16 { 25662 break 25663 } 25664 t := i.Type 25665 z := v_0.Args[1] 25666 x := v.Args[1] 25667 if !(z.Op != OpConst16 && x.Op != OpConst16) { 25668 break 25669 } 25670 v.reset(OpXor16) 25671 v.AddArg(i) 25672 v0 := b.NewValue0(v.Pos, OpXor16, t) 25673 v0.AddArg(z) 25674 v0.AddArg(x) 25675 v.AddArg(v0) 25676 return true 25677 } 25678 return false 25679 } 25680 func rewriteValuegeneric_OpXor16_10(v *Value) bool { 25681 b := v.Block 25682 _ = b 25683 // match: (Xor16 (Xor16 z i:(Const16 <t>)) x) 25684 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 25685 // result: (Xor16 i (Xor16 <t> z x)) 25686 for { 25687 _ = v.Args[1] 25688 v_0 := v.Args[0] 25689 if v_0.Op != OpXor16 { 25690 break 25691 } 25692 _ = v_0.Args[1] 25693 z := v_0.Args[0] 25694 i := v_0.Args[1] 25695 if i.Op != OpConst16 { 25696 break 25697 } 25698 t := i.Type 25699 x := v.Args[1] 25700 if !(z.Op != OpConst16 && x.Op != OpConst16) { 25701 break 25702 } 25703 v.reset(OpXor16) 25704 v.AddArg(i) 25705 v0 := b.NewValue0(v.Pos, OpXor16, t) 25706 v0.AddArg(z) 25707 v0.AddArg(x) 25708 v.AddArg(v0) 25709 return true 25710 } 25711 // match: (Xor16 x (Xor16 i:(Const16 <t>) z)) 25712 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 25713 // result: (Xor16 i (Xor16 <t> z x)) 25714 for { 25715 _ = v.Args[1] 25716 x := v.Args[0] 25717 v_1 := v.Args[1] 25718 if v_1.Op != OpXor16 { 25719 break 25720 } 25721 _ = v_1.Args[1] 25722 i := v_1.Args[0] 25723 if i.Op != OpConst16 { 25724 break 25725 } 25726 t := i.Type 25727 z := v_1.Args[1] 25728 if !(z.Op != OpConst16 && x.Op != OpConst16) { 25729 break 25730 } 25731 v.reset(OpXor16) 25732 v.AddArg(i) 25733 v0 := b.NewValue0(v.Pos, OpXor16, t) 25734 v0.AddArg(z) 25735 v0.AddArg(x) 25736 v.AddArg(v0) 25737 return true 25738 } 25739 // match: (Xor16 x (Xor16 z i:(Const16 <t>))) 25740 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 25741 // result: (Xor16 i (Xor16 <t> z x)) 25742 for { 25743 _ = v.Args[1] 25744 x := v.Args[0] 25745 v_1 := v.Args[1] 25746 if v_1.Op != OpXor16 { 25747 break 25748 } 25749 _ = v_1.Args[1] 25750 z := v_1.Args[0] 25751 i := v_1.Args[1] 25752 if i.Op != OpConst16 { 25753 break 25754 } 25755 t := i.Type 25756 if !(z.Op != OpConst16 && x.Op != OpConst16) { 25757 break 25758 } 25759 v.reset(OpXor16) 25760 v.AddArg(i) 25761 v0 := b.NewValue0(v.Pos, OpXor16, t) 25762 v0.AddArg(z) 25763 v0.AddArg(x) 25764 v.AddArg(v0) 25765 return true 25766 } 25767 // match: (Xor16 (Const16 <t> [c]) (Xor16 (Const16 <t> [d]) x)) 25768 // cond: 25769 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 25770 for { 25771 _ = v.Args[1] 25772 v_0 := v.Args[0] 25773 if v_0.Op != OpConst16 { 25774 break 25775 } 25776 t := v_0.Type 25777 c := v_0.AuxInt 25778 v_1 := v.Args[1] 25779 if v_1.Op != OpXor16 { 25780 break 25781 } 25782 _ = v_1.Args[1] 25783 v_1_0 := v_1.Args[0] 25784 if v_1_0.Op != OpConst16 { 25785 break 25786 } 25787 if v_1_0.Type != t { 25788 break 25789 } 25790 d := v_1_0.AuxInt 25791 x := v_1.Args[1] 25792 v.reset(OpXor16) 25793 v0 := b.NewValue0(v.Pos, OpConst16, t) 25794 v0.AuxInt = int64(int16(c ^ d)) 25795 v.AddArg(v0) 25796 v.AddArg(x) 25797 return true 25798 } 25799 // match: (Xor16 (Const16 <t> [c]) (Xor16 x (Const16 <t> [d]))) 25800 // cond: 25801 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 25802 for { 25803 _ = v.Args[1] 25804 v_0 := v.Args[0] 25805 if v_0.Op != OpConst16 { 25806 break 25807 } 25808 t := v_0.Type 25809 c := v_0.AuxInt 25810 v_1 := v.Args[1] 25811 if v_1.Op != OpXor16 { 25812 break 25813 } 25814 _ = v_1.Args[1] 25815 x := v_1.Args[0] 25816 v_1_1 := v_1.Args[1] 25817 if v_1_1.Op != OpConst16 { 25818 break 25819 } 25820 if v_1_1.Type != t { 25821 break 25822 } 25823 d := v_1_1.AuxInt 25824 v.reset(OpXor16) 25825 v0 := b.NewValue0(v.Pos, OpConst16, t) 25826 v0.AuxInt = int64(int16(c ^ d)) 25827 v.AddArg(v0) 25828 v.AddArg(x) 25829 return true 25830 } 25831 // match: (Xor16 (Xor16 (Const16 <t> [d]) x) (Const16 <t> [c])) 25832 // cond: 25833 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 25834 for { 25835 _ = v.Args[1] 25836 v_0 := v.Args[0] 25837 if v_0.Op != OpXor16 { 25838 break 25839 } 25840 _ = v_0.Args[1] 25841 v_0_0 := v_0.Args[0] 25842 if v_0_0.Op != OpConst16 { 25843 break 25844 } 25845 t := v_0_0.Type 25846 d := v_0_0.AuxInt 25847 x := v_0.Args[1] 25848 v_1 := v.Args[1] 25849 if v_1.Op != OpConst16 { 25850 break 25851 } 25852 if v_1.Type != t { 25853 break 25854 } 25855 c := v_1.AuxInt 25856 v.reset(OpXor16) 25857 v0 := b.NewValue0(v.Pos, OpConst16, t) 25858 v0.AuxInt = int64(int16(c ^ d)) 25859 v.AddArg(v0) 25860 v.AddArg(x) 25861 return true 25862 } 25863 // match: (Xor16 (Xor16 x (Const16 <t> [d])) (Const16 <t> [c])) 25864 // cond: 25865 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 25866 for { 25867 _ = v.Args[1] 25868 v_0 := v.Args[0] 25869 if v_0.Op != OpXor16 { 25870 break 25871 } 25872 _ = v_0.Args[1] 25873 x := v_0.Args[0] 25874 v_0_1 := v_0.Args[1] 25875 if v_0_1.Op != OpConst16 { 25876 break 25877 } 25878 t := v_0_1.Type 25879 d := v_0_1.AuxInt 25880 v_1 := v.Args[1] 25881 if v_1.Op != OpConst16 { 25882 break 25883 } 25884 if v_1.Type != t { 25885 break 25886 } 25887 c := v_1.AuxInt 25888 v.reset(OpXor16) 25889 v0 := b.NewValue0(v.Pos, OpConst16, t) 25890 v0.AuxInt = int64(int16(c ^ d)) 25891 v.AddArg(v0) 25892 v.AddArg(x) 25893 return true 25894 } 25895 return false 25896 } 25897 func rewriteValuegeneric_OpXor32_0(v *Value) bool { 25898 b := v.Block 25899 _ = b 25900 // match: (Xor32 (Const32 [c]) (Const32 [d])) 25901 // cond: 25902 // result: (Const32 [int64(int32(c^d))]) 25903 for { 25904 _ = v.Args[1] 25905 v_0 := v.Args[0] 25906 if v_0.Op != OpConst32 { 25907 break 25908 } 25909 c := v_0.AuxInt 25910 v_1 := v.Args[1] 25911 if v_1.Op != OpConst32 { 25912 break 25913 } 25914 d := v_1.AuxInt 25915 v.reset(OpConst32) 25916 v.AuxInt = int64(int32(c ^ d)) 25917 return true 25918 } 25919 // match: (Xor32 (Const32 [d]) (Const32 [c])) 25920 // cond: 25921 // result: (Const32 [int64(int32(c^d))]) 25922 for { 25923 _ = v.Args[1] 25924 v_0 := v.Args[0] 25925 if v_0.Op != OpConst32 { 25926 break 25927 } 25928 d := v_0.AuxInt 25929 v_1 := v.Args[1] 25930 if v_1.Op != OpConst32 { 25931 break 25932 } 25933 c := v_1.AuxInt 25934 v.reset(OpConst32) 25935 v.AuxInt = int64(int32(c ^ d)) 25936 return true 25937 } 25938 // match: (Xor32 x x) 25939 // cond: 25940 // result: (Const32 [0]) 25941 for { 25942 _ = v.Args[1] 25943 x := v.Args[0] 25944 if x != v.Args[1] { 25945 break 25946 } 25947 v.reset(OpConst32) 25948 v.AuxInt = 0 25949 return true 25950 } 25951 // match: (Xor32 (Const32 [0]) x) 25952 // cond: 25953 // result: x 25954 for { 25955 _ = v.Args[1] 25956 v_0 := v.Args[0] 25957 if v_0.Op != OpConst32 { 25958 break 25959 } 25960 if v_0.AuxInt != 0 { 25961 break 25962 } 25963 x := v.Args[1] 25964 v.reset(OpCopy) 25965 v.Type = x.Type 25966 v.AddArg(x) 25967 return true 25968 } 25969 // match: (Xor32 x (Const32 [0])) 25970 // cond: 25971 // result: x 25972 for { 25973 _ = v.Args[1] 25974 x := v.Args[0] 25975 v_1 := v.Args[1] 25976 if v_1.Op != OpConst32 { 25977 break 25978 } 25979 if v_1.AuxInt != 0 { 25980 break 25981 } 25982 v.reset(OpCopy) 25983 v.Type = x.Type 25984 v.AddArg(x) 25985 return true 25986 } 25987 // match: (Xor32 x (Xor32 x y)) 25988 // cond: 25989 // result: y 25990 for { 25991 _ = v.Args[1] 25992 x := v.Args[0] 25993 v_1 := v.Args[1] 25994 if v_1.Op != OpXor32 { 25995 break 25996 } 25997 _ = v_1.Args[1] 25998 if x != v_1.Args[0] { 25999 break 26000 } 26001 y := v_1.Args[1] 26002 v.reset(OpCopy) 26003 v.Type = y.Type 26004 v.AddArg(y) 26005 return true 26006 } 26007 // match: (Xor32 x (Xor32 y x)) 26008 // cond: 26009 // result: y 26010 for { 26011 _ = v.Args[1] 26012 x := v.Args[0] 26013 v_1 := v.Args[1] 26014 if v_1.Op != OpXor32 { 26015 break 26016 } 26017 _ = v_1.Args[1] 26018 y := v_1.Args[0] 26019 if x != v_1.Args[1] { 26020 break 26021 } 26022 v.reset(OpCopy) 26023 v.Type = y.Type 26024 v.AddArg(y) 26025 return true 26026 } 26027 // match: (Xor32 (Xor32 x y) x) 26028 // cond: 26029 // result: y 26030 for { 26031 _ = v.Args[1] 26032 v_0 := v.Args[0] 26033 if v_0.Op != OpXor32 { 26034 break 26035 } 26036 _ = v_0.Args[1] 26037 x := v_0.Args[0] 26038 y := v_0.Args[1] 26039 if x != v.Args[1] { 26040 break 26041 } 26042 v.reset(OpCopy) 26043 v.Type = y.Type 26044 v.AddArg(y) 26045 return true 26046 } 26047 // match: (Xor32 (Xor32 y x) x) 26048 // cond: 26049 // result: y 26050 for { 26051 _ = v.Args[1] 26052 v_0 := v.Args[0] 26053 if v_0.Op != OpXor32 { 26054 break 26055 } 26056 _ = v_0.Args[1] 26057 y := v_0.Args[0] 26058 x := v_0.Args[1] 26059 if x != v.Args[1] { 26060 break 26061 } 26062 v.reset(OpCopy) 26063 v.Type = y.Type 26064 v.AddArg(y) 26065 return true 26066 } 26067 // match: (Xor32 (Xor32 i:(Const32 <t>) z) x) 26068 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 26069 // result: (Xor32 i (Xor32 <t> z x)) 26070 for { 26071 _ = v.Args[1] 26072 v_0 := v.Args[0] 26073 if v_0.Op != OpXor32 { 26074 break 26075 } 26076 _ = v_0.Args[1] 26077 i := v_0.Args[0] 26078 if i.Op != OpConst32 { 26079 break 26080 } 26081 t := i.Type 26082 z := v_0.Args[1] 26083 x := v.Args[1] 26084 if !(z.Op != OpConst32 && x.Op != OpConst32) { 26085 break 26086 } 26087 v.reset(OpXor32) 26088 v.AddArg(i) 26089 v0 := b.NewValue0(v.Pos, OpXor32, t) 26090 v0.AddArg(z) 26091 v0.AddArg(x) 26092 v.AddArg(v0) 26093 return true 26094 } 26095 return false 26096 } 26097 func rewriteValuegeneric_OpXor32_10(v *Value) bool { 26098 b := v.Block 26099 _ = b 26100 // match: (Xor32 (Xor32 z i:(Const32 <t>)) x) 26101 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 26102 // result: (Xor32 i (Xor32 <t> z x)) 26103 for { 26104 _ = v.Args[1] 26105 v_0 := v.Args[0] 26106 if v_0.Op != OpXor32 { 26107 break 26108 } 26109 _ = v_0.Args[1] 26110 z := v_0.Args[0] 26111 i := v_0.Args[1] 26112 if i.Op != OpConst32 { 26113 break 26114 } 26115 t := i.Type 26116 x := v.Args[1] 26117 if !(z.Op != OpConst32 && x.Op != OpConst32) { 26118 break 26119 } 26120 v.reset(OpXor32) 26121 v.AddArg(i) 26122 v0 := b.NewValue0(v.Pos, OpXor32, t) 26123 v0.AddArg(z) 26124 v0.AddArg(x) 26125 v.AddArg(v0) 26126 return true 26127 } 26128 // match: (Xor32 x (Xor32 i:(Const32 <t>) z)) 26129 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 26130 // result: (Xor32 i (Xor32 <t> z x)) 26131 for { 26132 _ = v.Args[1] 26133 x := v.Args[0] 26134 v_1 := v.Args[1] 26135 if v_1.Op != OpXor32 { 26136 break 26137 } 26138 _ = v_1.Args[1] 26139 i := v_1.Args[0] 26140 if i.Op != OpConst32 { 26141 break 26142 } 26143 t := i.Type 26144 z := v_1.Args[1] 26145 if !(z.Op != OpConst32 && x.Op != OpConst32) { 26146 break 26147 } 26148 v.reset(OpXor32) 26149 v.AddArg(i) 26150 v0 := b.NewValue0(v.Pos, OpXor32, t) 26151 v0.AddArg(z) 26152 v0.AddArg(x) 26153 v.AddArg(v0) 26154 return true 26155 } 26156 // match: (Xor32 x (Xor32 z i:(Const32 <t>))) 26157 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 26158 // result: (Xor32 i (Xor32 <t> z x)) 26159 for { 26160 _ = v.Args[1] 26161 x := v.Args[0] 26162 v_1 := v.Args[1] 26163 if v_1.Op != OpXor32 { 26164 break 26165 } 26166 _ = v_1.Args[1] 26167 z := v_1.Args[0] 26168 i := v_1.Args[1] 26169 if i.Op != OpConst32 { 26170 break 26171 } 26172 t := i.Type 26173 if !(z.Op != OpConst32 && x.Op != OpConst32) { 26174 break 26175 } 26176 v.reset(OpXor32) 26177 v.AddArg(i) 26178 v0 := b.NewValue0(v.Pos, OpXor32, t) 26179 v0.AddArg(z) 26180 v0.AddArg(x) 26181 v.AddArg(v0) 26182 return true 26183 } 26184 // match: (Xor32 (Const32 <t> [c]) (Xor32 (Const32 <t> [d]) x)) 26185 // cond: 26186 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 26187 for { 26188 _ = v.Args[1] 26189 v_0 := v.Args[0] 26190 if v_0.Op != OpConst32 { 26191 break 26192 } 26193 t := v_0.Type 26194 c := v_0.AuxInt 26195 v_1 := v.Args[1] 26196 if v_1.Op != OpXor32 { 26197 break 26198 } 26199 _ = v_1.Args[1] 26200 v_1_0 := v_1.Args[0] 26201 if v_1_0.Op != OpConst32 { 26202 break 26203 } 26204 if v_1_0.Type != t { 26205 break 26206 } 26207 d := v_1_0.AuxInt 26208 x := v_1.Args[1] 26209 v.reset(OpXor32) 26210 v0 := b.NewValue0(v.Pos, OpConst32, t) 26211 v0.AuxInt = int64(int32(c ^ d)) 26212 v.AddArg(v0) 26213 v.AddArg(x) 26214 return true 26215 } 26216 // match: (Xor32 (Const32 <t> [c]) (Xor32 x (Const32 <t> [d]))) 26217 // cond: 26218 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 26219 for { 26220 _ = v.Args[1] 26221 v_0 := v.Args[0] 26222 if v_0.Op != OpConst32 { 26223 break 26224 } 26225 t := v_0.Type 26226 c := v_0.AuxInt 26227 v_1 := v.Args[1] 26228 if v_1.Op != OpXor32 { 26229 break 26230 } 26231 _ = v_1.Args[1] 26232 x := v_1.Args[0] 26233 v_1_1 := v_1.Args[1] 26234 if v_1_1.Op != OpConst32 { 26235 break 26236 } 26237 if v_1_1.Type != t { 26238 break 26239 } 26240 d := v_1_1.AuxInt 26241 v.reset(OpXor32) 26242 v0 := b.NewValue0(v.Pos, OpConst32, t) 26243 v0.AuxInt = int64(int32(c ^ d)) 26244 v.AddArg(v0) 26245 v.AddArg(x) 26246 return true 26247 } 26248 // match: (Xor32 (Xor32 (Const32 <t> [d]) x) (Const32 <t> [c])) 26249 // cond: 26250 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 26251 for { 26252 _ = v.Args[1] 26253 v_0 := v.Args[0] 26254 if v_0.Op != OpXor32 { 26255 break 26256 } 26257 _ = v_0.Args[1] 26258 v_0_0 := v_0.Args[0] 26259 if v_0_0.Op != OpConst32 { 26260 break 26261 } 26262 t := v_0_0.Type 26263 d := v_0_0.AuxInt 26264 x := v_0.Args[1] 26265 v_1 := v.Args[1] 26266 if v_1.Op != OpConst32 { 26267 break 26268 } 26269 if v_1.Type != t { 26270 break 26271 } 26272 c := v_1.AuxInt 26273 v.reset(OpXor32) 26274 v0 := b.NewValue0(v.Pos, OpConst32, t) 26275 v0.AuxInt = int64(int32(c ^ d)) 26276 v.AddArg(v0) 26277 v.AddArg(x) 26278 return true 26279 } 26280 // match: (Xor32 (Xor32 x (Const32 <t> [d])) (Const32 <t> [c])) 26281 // cond: 26282 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 26283 for { 26284 _ = v.Args[1] 26285 v_0 := v.Args[0] 26286 if v_0.Op != OpXor32 { 26287 break 26288 } 26289 _ = v_0.Args[1] 26290 x := v_0.Args[0] 26291 v_0_1 := v_0.Args[1] 26292 if v_0_1.Op != OpConst32 { 26293 break 26294 } 26295 t := v_0_1.Type 26296 d := v_0_1.AuxInt 26297 v_1 := v.Args[1] 26298 if v_1.Op != OpConst32 { 26299 break 26300 } 26301 if v_1.Type != t { 26302 break 26303 } 26304 c := v_1.AuxInt 26305 v.reset(OpXor32) 26306 v0 := b.NewValue0(v.Pos, OpConst32, t) 26307 v0.AuxInt = int64(int32(c ^ d)) 26308 v.AddArg(v0) 26309 v.AddArg(x) 26310 return true 26311 } 26312 return false 26313 } 26314 func rewriteValuegeneric_OpXor64_0(v *Value) bool { 26315 b := v.Block 26316 _ = b 26317 // match: (Xor64 (Const64 [c]) (Const64 [d])) 26318 // cond: 26319 // result: (Const64 [c^d]) 26320 for { 26321 _ = v.Args[1] 26322 v_0 := v.Args[0] 26323 if v_0.Op != OpConst64 { 26324 break 26325 } 26326 c := v_0.AuxInt 26327 v_1 := v.Args[1] 26328 if v_1.Op != OpConst64 { 26329 break 26330 } 26331 d := v_1.AuxInt 26332 v.reset(OpConst64) 26333 v.AuxInt = c ^ d 26334 return true 26335 } 26336 // match: (Xor64 (Const64 [d]) (Const64 [c])) 26337 // cond: 26338 // result: (Const64 [c^d]) 26339 for { 26340 _ = v.Args[1] 26341 v_0 := v.Args[0] 26342 if v_0.Op != OpConst64 { 26343 break 26344 } 26345 d := v_0.AuxInt 26346 v_1 := v.Args[1] 26347 if v_1.Op != OpConst64 { 26348 break 26349 } 26350 c := v_1.AuxInt 26351 v.reset(OpConst64) 26352 v.AuxInt = c ^ d 26353 return true 26354 } 26355 // match: (Xor64 x x) 26356 // cond: 26357 // result: (Const64 [0]) 26358 for { 26359 _ = v.Args[1] 26360 x := v.Args[0] 26361 if x != v.Args[1] { 26362 break 26363 } 26364 v.reset(OpConst64) 26365 v.AuxInt = 0 26366 return true 26367 } 26368 // match: (Xor64 (Const64 [0]) x) 26369 // cond: 26370 // result: x 26371 for { 26372 _ = v.Args[1] 26373 v_0 := v.Args[0] 26374 if v_0.Op != OpConst64 { 26375 break 26376 } 26377 if v_0.AuxInt != 0 { 26378 break 26379 } 26380 x := v.Args[1] 26381 v.reset(OpCopy) 26382 v.Type = x.Type 26383 v.AddArg(x) 26384 return true 26385 } 26386 // match: (Xor64 x (Const64 [0])) 26387 // cond: 26388 // result: x 26389 for { 26390 _ = v.Args[1] 26391 x := v.Args[0] 26392 v_1 := v.Args[1] 26393 if v_1.Op != OpConst64 { 26394 break 26395 } 26396 if v_1.AuxInt != 0 { 26397 break 26398 } 26399 v.reset(OpCopy) 26400 v.Type = x.Type 26401 v.AddArg(x) 26402 return true 26403 } 26404 // match: (Xor64 x (Xor64 x y)) 26405 // cond: 26406 // result: y 26407 for { 26408 _ = v.Args[1] 26409 x := v.Args[0] 26410 v_1 := v.Args[1] 26411 if v_1.Op != OpXor64 { 26412 break 26413 } 26414 _ = v_1.Args[1] 26415 if x != v_1.Args[0] { 26416 break 26417 } 26418 y := v_1.Args[1] 26419 v.reset(OpCopy) 26420 v.Type = y.Type 26421 v.AddArg(y) 26422 return true 26423 } 26424 // match: (Xor64 x (Xor64 y x)) 26425 // cond: 26426 // result: y 26427 for { 26428 _ = v.Args[1] 26429 x := v.Args[0] 26430 v_1 := v.Args[1] 26431 if v_1.Op != OpXor64 { 26432 break 26433 } 26434 _ = v_1.Args[1] 26435 y := v_1.Args[0] 26436 if x != v_1.Args[1] { 26437 break 26438 } 26439 v.reset(OpCopy) 26440 v.Type = y.Type 26441 v.AddArg(y) 26442 return true 26443 } 26444 // match: (Xor64 (Xor64 x y) x) 26445 // cond: 26446 // result: y 26447 for { 26448 _ = v.Args[1] 26449 v_0 := v.Args[0] 26450 if v_0.Op != OpXor64 { 26451 break 26452 } 26453 _ = v_0.Args[1] 26454 x := v_0.Args[0] 26455 y := v_0.Args[1] 26456 if x != v.Args[1] { 26457 break 26458 } 26459 v.reset(OpCopy) 26460 v.Type = y.Type 26461 v.AddArg(y) 26462 return true 26463 } 26464 // match: (Xor64 (Xor64 y x) x) 26465 // cond: 26466 // result: y 26467 for { 26468 _ = v.Args[1] 26469 v_0 := v.Args[0] 26470 if v_0.Op != OpXor64 { 26471 break 26472 } 26473 _ = v_0.Args[1] 26474 y := v_0.Args[0] 26475 x := v_0.Args[1] 26476 if x != v.Args[1] { 26477 break 26478 } 26479 v.reset(OpCopy) 26480 v.Type = y.Type 26481 v.AddArg(y) 26482 return true 26483 } 26484 // match: (Xor64 (Xor64 i:(Const64 <t>) z) x) 26485 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 26486 // result: (Xor64 i (Xor64 <t> z x)) 26487 for { 26488 _ = v.Args[1] 26489 v_0 := v.Args[0] 26490 if v_0.Op != OpXor64 { 26491 break 26492 } 26493 _ = v_0.Args[1] 26494 i := v_0.Args[0] 26495 if i.Op != OpConst64 { 26496 break 26497 } 26498 t := i.Type 26499 z := v_0.Args[1] 26500 x := v.Args[1] 26501 if !(z.Op != OpConst64 && x.Op != OpConst64) { 26502 break 26503 } 26504 v.reset(OpXor64) 26505 v.AddArg(i) 26506 v0 := b.NewValue0(v.Pos, OpXor64, t) 26507 v0.AddArg(z) 26508 v0.AddArg(x) 26509 v.AddArg(v0) 26510 return true 26511 } 26512 return false 26513 } 26514 func rewriteValuegeneric_OpXor64_10(v *Value) bool { 26515 b := v.Block 26516 _ = b 26517 // match: (Xor64 (Xor64 z i:(Const64 <t>)) x) 26518 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 26519 // result: (Xor64 i (Xor64 <t> z x)) 26520 for { 26521 _ = v.Args[1] 26522 v_0 := v.Args[0] 26523 if v_0.Op != OpXor64 { 26524 break 26525 } 26526 _ = v_0.Args[1] 26527 z := v_0.Args[0] 26528 i := v_0.Args[1] 26529 if i.Op != OpConst64 { 26530 break 26531 } 26532 t := i.Type 26533 x := v.Args[1] 26534 if !(z.Op != OpConst64 && x.Op != OpConst64) { 26535 break 26536 } 26537 v.reset(OpXor64) 26538 v.AddArg(i) 26539 v0 := b.NewValue0(v.Pos, OpXor64, t) 26540 v0.AddArg(z) 26541 v0.AddArg(x) 26542 v.AddArg(v0) 26543 return true 26544 } 26545 // match: (Xor64 x (Xor64 i:(Const64 <t>) z)) 26546 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 26547 // result: (Xor64 i (Xor64 <t> z x)) 26548 for { 26549 _ = v.Args[1] 26550 x := v.Args[0] 26551 v_1 := v.Args[1] 26552 if v_1.Op != OpXor64 { 26553 break 26554 } 26555 _ = v_1.Args[1] 26556 i := v_1.Args[0] 26557 if i.Op != OpConst64 { 26558 break 26559 } 26560 t := i.Type 26561 z := v_1.Args[1] 26562 if !(z.Op != OpConst64 && x.Op != OpConst64) { 26563 break 26564 } 26565 v.reset(OpXor64) 26566 v.AddArg(i) 26567 v0 := b.NewValue0(v.Pos, OpXor64, t) 26568 v0.AddArg(z) 26569 v0.AddArg(x) 26570 v.AddArg(v0) 26571 return true 26572 } 26573 // match: (Xor64 x (Xor64 z i:(Const64 <t>))) 26574 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 26575 // result: (Xor64 i (Xor64 <t> z x)) 26576 for { 26577 _ = v.Args[1] 26578 x := v.Args[0] 26579 v_1 := v.Args[1] 26580 if v_1.Op != OpXor64 { 26581 break 26582 } 26583 _ = v_1.Args[1] 26584 z := v_1.Args[0] 26585 i := v_1.Args[1] 26586 if i.Op != OpConst64 { 26587 break 26588 } 26589 t := i.Type 26590 if !(z.Op != OpConst64 && x.Op != OpConst64) { 26591 break 26592 } 26593 v.reset(OpXor64) 26594 v.AddArg(i) 26595 v0 := b.NewValue0(v.Pos, OpXor64, t) 26596 v0.AddArg(z) 26597 v0.AddArg(x) 26598 v.AddArg(v0) 26599 return true 26600 } 26601 // match: (Xor64 (Const64 <t> [c]) (Xor64 (Const64 <t> [d]) x)) 26602 // cond: 26603 // result: (Xor64 (Const64 <t> [c^d]) x) 26604 for { 26605 _ = v.Args[1] 26606 v_0 := v.Args[0] 26607 if v_0.Op != OpConst64 { 26608 break 26609 } 26610 t := v_0.Type 26611 c := v_0.AuxInt 26612 v_1 := v.Args[1] 26613 if v_1.Op != OpXor64 { 26614 break 26615 } 26616 _ = v_1.Args[1] 26617 v_1_0 := v_1.Args[0] 26618 if v_1_0.Op != OpConst64 { 26619 break 26620 } 26621 if v_1_0.Type != t { 26622 break 26623 } 26624 d := v_1_0.AuxInt 26625 x := v_1.Args[1] 26626 v.reset(OpXor64) 26627 v0 := b.NewValue0(v.Pos, OpConst64, t) 26628 v0.AuxInt = c ^ d 26629 v.AddArg(v0) 26630 v.AddArg(x) 26631 return true 26632 } 26633 // match: (Xor64 (Const64 <t> [c]) (Xor64 x (Const64 <t> [d]))) 26634 // cond: 26635 // result: (Xor64 (Const64 <t> [c^d]) x) 26636 for { 26637 _ = v.Args[1] 26638 v_0 := v.Args[0] 26639 if v_0.Op != OpConst64 { 26640 break 26641 } 26642 t := v_0.Type 26643 c := v_0.AuxInt 26644 v_1 := v.Args[1] 26645 if v_1.Op != OpXor64 { 26646 break 26647 } 26648 _ = v_1.Args[1] 26649 x := v_1.Args[0] 26650 v_1_1 := v_1.Args[1] 26651 if v_1_1.Op != OpConst64 { 26652 break 26653 } 26654 if v_1_1.Type != t { 26655 break 26656 } 26657 d := v_1_1.AuxInt 26658 v.reset(OpXor64) 26659 v0 := b.NewValue0(v.Pos, OpConst64, t) 26660 v0.AuxInt = c ^ d 26661 v.AddArg(v0) 26662 v.AddArg(x) 26663 return true 26664 } 26665 // match: (Xor64 (Xor64 (Const64 <t> [d]) x) (Const64 <t> [c])) 26666 // cond: 26667 // result: (Xor64 (Const64 <t> [c^d]) x) 26668 for { 26669 _ = v.Args[1] 26670 v_0 := v.Args[0] 26671 if v_0.Op != OpXor64 { 26672 break 26673 } 26674 _ = v_0.Args[1] 26675 v_0_0 := v_0.Args[0] 26676 if v_0_0.Op != OpConst64 { 26677 break 26678 } 26679 t := v_0_0.Type 26680 d := v_0_0.AuxInt 26681 x := v_0.Args[1] 26682 v_1 := v.Args[1] 26683 if v_1.Op != OpConst64 { 26684 break 26685 } 26686 if v_1.Type != t { 26687 break 26688 } 26689 c := v_1.AuxInt 26690 v.reset(OpXor64) 26691 v0 := b.NewValue0(v.Pos, OpConst64, t) 26692 v0.AuxInt = c ^ d 26693 v.AddArg(v0) 26694 v.AddArg(x) 26695 return true 26696 } 26697 // match: (Xor64 (Xor64 x (Const64 <t> [d])) (Const64 <t> [c])) 26698 // cond: 26699 // result: (Xor64 (Const64 <t> [c^d]) x) 26700 for { 26701 _ = v.Args[1] 26702 v_0 := v.Args[0] 26703 if v_0.Op != OpXor64 { 26704 break 26705 } 26706 _ = v_0.Args[1] 26707 x := v_0.Args[0] 26708 v_0_1 := v_0.Args[1] 26709 if v_0_1.Op != OpConst64 { 26710 break 26711 } 26712 t := v_0_1.Type 26713 d := v_0_1.AuxInt 26714 v_1 := v.Args[1] 26715 if v_1.Op != OpConst64 { 26716 break 26717 } 26718 if v_1.Type != t { 26719 break 26720 } 26721 c := v_1.AuxInt 26722 v.reset(OpXor64) 26723 v0 := b.NewValue0(v.Pos, OpConst64, t) 26724 v0.AuxInt = c ^ d 26725 v.AddArg(v0) 26726 v.AddArg(x) 26727 return true 26728 } 26729 return false 26730 } 26731 func rewriteValuegeneric_OpXor8_0(v *Value) bool { 26732 b := v.Block 26733 _ = b 26734 // match: (Xor8 (Const8 [c]) (Const8 [d])) 26735 // cond: 26736 // result: (Const8 [int64(int8(c^d))]) 26737 for { 26738 _ = v.Args[1] 26739 v_0 := v.Args[0] 26740 if v_0.Op != OpConst8 { 26741 break 26742 } 26743 c := v_0.AuxInt 26744 v_1 := v.Args[1] 26745 if v_1.Op != OpConst8 { 26746 break 26747 } 26748 d := v_1.AuxInt 26749 v.reset(OpConst8) 26750 v.AuxInt = int64(int8(c ^ d)) 26751 return true 26752 } 26753 // match: (Xor8 (Const8 [d]) (Const8 [c])) 26754 // cond: 26755 // result: (Const8 [int64(int8(c^d))]) 26756 for { 26757 _ = v.Args[1] 26758 v_0 := v.Args[0] 26759 if v_0.Op != OpConst8 { 26760 break 26761 } 26762 d := v_0.AuxInt 26763 v_1 := v.Args[1] 26764 if v_1.Op != OpConst8 { 26765 break 26766 } 26767 c := v_1.AuxInt 26768 v.reset(OpConst8) 26769 v.AuxInt = int64(int8(c ^ d)) 26770 return true 26771 } 26772 // match: (Xor8 x x) 26773 // cond: 26774 // result: (Const8 [0]) 26775 for { 26776 _ = v.Args[1] 26777 x := v.Args[0] 26778 if x != v.Args[1] { 26779 break 26780 } 26781 v.reset(OpConst8) 26782 v.AuxInt = 0 26783 return true 26784 } 26785 // match: (Xor8 (Const8 [0]) x) 26786 // cond: 26787 // result: x 26788 for { 26789 _ = v.Args[1] 26790 v_0 := v.Args[0] 26791 if v_0.Op != OpConst8 { 26792 break 26793 } 26794 if v_0.AuxInt != 0 { 26795 break 26796 } 26797 x := v.Args[1] 26798 v.reset(OpCopy) 26799 v.Type = x.Type 26800 v.AddArg(x) 26801 return true 26802 } 26803 // match: (Xor8 x (Const8 [0])) 26804 // cond: 26805 // result: x 26806 for { 26807 _ = v.Args[1] 26808 x := v.Args[0] 26809 v_1 := v.Args[1] 26810 if v_1.Op != OpConst8 { 26811 break 26812 } 26813 if v_1.AuxInt != 0 { 26814 break 26815 } 26816 v.reset(OpCopy) 26817 v.Type = x.Type 26818 v.AddArg(x) 26819 return true 26820 } 26821 // match: (Xor8 x (Xor8 x y)) 26822 // cond: 26823 // result: y 26824 for { 26825 _ = v.Args[1] 26826 x := v.Args[0] 26827 v_1 := v.Args[1] 26828 if v_1.Op != OpXor8 { 26829 break 26830 } 26831 _ = v_1.Args[1] 26832 if x != v_1.Args[0] { 26833 break 26834 } 26835 y := v_1.Args[1] 26836 v.reset(OpCopy) 26837 v.Type = y.Type 26838 v.AddArg(y) 26839 return true 26840 } 26841 // match: (Xor8 x (Xor8 y x)) 26842 // cond: 26843 // result: y 26844 for { 26845 _ = v.Args[1] 26846 x := v.Args[0] 26847 v_1 := v.Args[1] 26848 if v_1.Op != OpXor8 { 26849 break 26850 } 26851 _ = v_1.Args[1] 26852 y := v_1.Args[0] 26853 if x != v_1.Args[1] { 26854 break 26855 } 26856 v.reset(OpCopy) 26857 v.Type = y.Type 26858 v.AddArg(y) 26859 return true 26860 } 26861 // match: (Xor8 (Xor8 x y) x) 26862 // cond: 26863 // result: y 26864 for { 26865 _ = v.Args[1] 26866 v_0 := v.Args[0] 26867 if v_0.Op != OpXor8 { 26868 break 26869 } 26870 _ = v_0.Args[1] 26871 x := v_0.Args[0] 26872 y := v_0.Args[1] 26873 if x != v.Args[1] { 26874 break 26875 } 26876 v.reset(OpCopy) 26877 v.Type = y.Type 26878 v.AddArg(y) 26879 return true 26880 } 26881 // match: (Xor8 (Xor8 y x) x) 26882 // cond: 26883 // result: y 26884 for { 26885 _ = v.Args[1] 26886 v_0 := v.Args[0] 26887 if v_0.Op != OpXor8 { 26888 break 26889 } 26890 _ = v_0.Args[1] 26891 y := v_0.Args[0] 26892 x := v_0.Args[1] 26893 if x != v.Args[1] { 26894 break 26895 } 26896 v.reset(OpCopy) 26897 v.Type = y.Type 26898 v.AddArg(y) 26899 return true 26900 } 26901 // match: (Xor8 (Xor8 i:(Const8 <t>) z) x) 26902 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26903 // result: (Xor8 i (Xor8 <t> z x)) 26904 for { 26905 _ = v.Args[1] 26906 v_0 := v.Args[0] 26907 if v_0.Op != OpXor8 { 26908 break 26909 } 26910 _ = v_0.Args[1] 26911 i := v_0.Args[0] 26912 if i.Op != OpConst8 { 26913 break 26914 } 26915 t := i.Type 26916 z := v_0.Args[1] 26917 x := v.Args[1] 26918 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26919 break 26920 } 26921 v.reset(OpXor8) 26922 v.AddArg(i) 26923 v0 := b.NewValue0(v.Pos, OpXor8, t) 26924 v0.AddArg(z) 26925 v0.AddArg(x) 26926 v.AddArg(v0) 26927 return true 26928 } 26929 return false 26930 } 26931 func rewriteValuegeneric_OpXor8_10(v *Value) bool { 26932 b := v.Block 26933 _ = b 26934 // match: (Xor8 (Xor8 z i:(Const8 <t>)) x) 26935 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26936 // result: (Xor8 i (Xor8 <t> z x)) 26937 for { 26938 _ = v.Args[1] 26939 v_0 := v.Args[0] 26940 if v_0.Op != OpXor8 { 26941 break 26942 } 26943 _ = v_0.Args[1] 26944 z := v_0.Args[0] 26945 i := v_0.Args[1] 26946 if i.Op != OpConst8 { 26947 break 26948 } 26949 t := i.Type 26950 x := v.Args[1] 26951 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26952 break 26953 } 26954 v.reset(OpXor8) 26955 v.AddArg(i) 26956 v0 := b.NewValue0(v.Pos, OpXor8, t) 26957 v0.AddArg(z) 26958 v0.AddArg(x) 26959 v.AddArg(v0) 26960 return true 26961 } 26962 // match: (Xor8 x (Xor8 i:(Const8 <t>) z)) 26963 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26964 // result: (Xor8 i (Xor8 <t> z x)) 26965 for { 26966 _ = v.Args[1] 26967 x := v.Args[0] 26968 v_1 := v.Args[1] 26969 if v_1.Op != OpXor8 { 26970 break 26971 } 26972 _ = v_1.Args[1] 26973 i := v_1.Args[0] 26974 if i.Op != OpConst8 { 26975 break 26976 } 26977 t := i.Type 26978 z := v_1.Args[1] 26979 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26980 break 26981 } 26982 v.reset(OpXor8) 26983 v.AddArg(i) 26984 v0 := b.NewValue0(v.Pos, OpXor8, t) 26985 v0.AddArg(z) 26986 v0.AddArg(x) 26987 v.AddArg(v0) 26988 return true 26989 } 26990 // match: (Xor8 x (Xor8 z i:(Const8 <t>))) 26991 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26992 // result: (Xor8 i (Xor8 <t> z x)) 26993 for { 26994 _ = v.Args[1] 26995 x := v.Args[0] 26996 v_1 := v.Args[1] 26997 if v_1.Op != OpXor8 { 26998 break 26999 } 27000 _ = v_1.Args[1] 27001 z := v_1.Args[0] 27002 i := v_1.Args[1] 27003 if i.Op != OpConst8 { 27004 break 27005 } 27006 t := i.Type 27007 if !(z.Op != OpConst8 && x.Op != OpConst8) { 27008 break 27009 } 27010 v.reset(OpXor8) 27011 v.AddArg(i) 27012 v0 := b.NewValue0(v.Pos, OpXor8, t) 27013 v0.AddArg(z) 27014 v0.AddArg(x) 27015 v.AddArg(v0) 27016 return true 27017 } 27018 // match: (Xor8 (Const8 <t> [c]) (Xor8 (Const8 <t> [d]) x)) 27019 // cond: 27020 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 27021 for { 27022 _ = v.Args[1] 27023 v_0 := v.Args[0] 27024 if v_0.Op != OpConst8 { 27025 break 27026 } 27027 t := v_0.Type 27028 c := v_0.AuxInt 27029 v_1 := v.Args[1] 27030 if v_1.Op != OpXor8 { 27031 break 27032 } 27033 _ = v_1.Args[1] 27034 v_1_0 := v_1.Args[0] 27035 if v_1_0.Op != OpConst8 { 27036 break 27037 } 27038 if v_1_0.Type != t { 27039 break 27040 } 27041 d := v_1_0.AuxInt 27042 x := v_1.Args[1] 27043 v.reset(OpXor8) 27044 v0 := b.NewValue0(v.Pos, OpConst8, t) 27045 v0.AuxInt = int64(int8(c ^ d)) 27046 v.AddArg(v0) 27047 v.AddArg(x) 27048 return true 27049 } 27050 // match: (Xor8 (Const8 <t> [c]) (Xor8 x (Const8 <t> [d]))) 27051 // cond: 27052 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 27053 for { 27054 _ = v.Args[1] 27055 v_0 := v.Args[0] 27056 if v_0.Op != OpConst8 { 27057 break 27058 } 27059 t := v_0.Type 27060 c := v_0.AuxInt 27061 v_1 := v.Args[1] 27062 if v_1.Op != OpXor8 { 27063 break 27064 } 27065 _ = v_1.Args[1] 27066 x := v_1.Args[0] 27067 v_1_1 := v_1.Args[1] 27068 if v_1_1.Op != OpConst8 { 27069 break 27070 } 27071 if v_1_1.Type != t { 27072 break 27073 } 27074 d := v_1_1.AuxInt 27075 v.reset(OpXor8) 27076 v0 := b.NewValue0(v.Pos, OpConst8, t) 27077 v0.AuxInt = int64(int8(c ^ d)) 27078 v.AddArg(v0) 27079 v.AddArg(x) 27080 return true 27081 } 27082 // match: (Xor8 (Xor8 (Const8 <t> [d]) x) (Const8 <t> [c])) 27083 // cond: 27084 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 27085 for { 27086 _ = v.Args[1] 27087 v_0 := v.Args[0] 27088 if v_0.Op != OpXor8 { 27089 break 27090 } 27091 _ = v_0.Args[1] 27092 v_0_0 := v_0.Args[0] 27093 if v_0_0.Op != OpConst8 { 27094 break 27095 } 27096 t := v_0_0.Type 27097 d := v_0_0.AuxInt 27098 x := v_0.Args[1] 27099 v_1 := v.Args[1] 27100 if v_1.Op != OpConst8 { 27101 break 27102 } 27103 if v_1.Type != t { 27104 break 27105 } 27106 c := v_1.AuxInt 27107 v.reset(OpXor8) 27108 v0 := b.NewValue0(v.Pos, OpConst8, t) 27109 v0.AuxInt = int64(int8(c ^ d)) 27110 v.AddArg(v0) 27111 v.AddArg(x) 27112 return true 27113 } 27114 // match: (Xor8 (Xor8 x (Const8 <t> [d])) (Const8 <t> [c])) 27115 // cond: 27116 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 27117 for { 27118 _ = v.Args[1] 27119 v_0 := v.Args[0] 27120 if v_0.Op != OpXor8 { 27121 break 27122 } 27123 _ = v_0.Args[1] 27124 x := v_0.Args[0] 27125 v_0_1 := v_0.Args[1] 27126 if v_0_1.Op != OpConst8 { 27127 break 27128 } 27129 t := v_0_1.Type 27130 d := v_0_1.AuxInt 27131 v_1 := v.Args[1] 27132 if v_1.Op != OpConst8 { 27133 break 27134 } 27135 if v_1.Type != t { 27136 break 27137 } 27138 c := v_1.AuxInt 27139 v.reset(OpXor8) 27140 v0 := b.NewValue0(v.Pos, OpConst8, t) 27141 v0.AuxInt = int64(int8(c ^ d)) 27142 v.AddArg(v0) 27143 v.AddArg(x) 27144 return true 27145 } 27146 return false 27147 } 27148 func rewriteValuegeneric_OpZero_0(v *Value) bool { 27149 b := v.Block 27150 _ = b 27151 config := b.Func.Config 27152 _ = config 27153 // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) 27154 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 27155 // result: mem 27156 for { 27157 _ = v.Args[1] 27158 v_0 := v.Args[0] 27159 if v_0.Op != OpLoad { 27160 break 27161 } 27162 _ = v_0.Args[1] 27163 v_0_0 := v_0.Args[0] 27164 if v_0_0.Op != OpOffPtr { 27165 break 27166 } 27167 c := v_0_0.AuxInt 27168 v_0_0_0 := v_0_0.Args[0] 27169 if v_0_0_0.Op != OpSP { 27170 break 27171 } 27172 mem := v_0.Args[1] 27173 if mem != v.Args[1] { 27174 break 27175 } 27176 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 27177 break 27178 } 27179 v.reset(OpCopy) 27180 v.Type = mem.Type 27181 v.AddArg(mem) 27182 return true 27183 } 27184 return false 27185 } 27186 func rewriteValuegeneric_OpZeroExt16to32_0(v *Value) bool { 27187 // match: (ZeroExt16to32 (Const16 [c])) 27188 // cond: 27189 // result: (Const32 [int64(uint16(c))]) 27190 for { 27191 v_0 := v.Args[0] 27192 if v_0.Op != OpConst16 { 27193 break 27194 } 27195 c := v_0.AuxInt 27196 v.reset(OpConst32) 27197 v.AuxInt = int64(uint16(c)) 27198 return true 27199 } 27200 // match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s])))) 27201 // cond: s >= 16 27202 // result: x 27203 for { 27204 v_0 := v.Args[0] 27205 if v_0.Op != OpTrunc32to16 { 27206 break 27207 } 27208 x := v_0.Args[0] 27209 if x.Op != OpRsh32Ux64 { 27210 break 27211 } 27212 _ = x.Args[1] 27213 x_1 := x.Args[1] 27214 if x_1.Op != OpConst64 { 27215 break 27216 } 27217 s := x_1.AuxInt 27218 if !(s >= 16) { 27219 break 27220 } 27221 v.reset(OpCopy) 27222 v.Type = x.Type 27223 v.AddArg(x) 27224 return true 27225 } 27226 return false 27227 } 27228 func rewriteValuegeneric_OpZeroExt16to64_0(v *Value) bool { 27229 // match: (ZeroExt16to64 (Const16 [c])) 27230 // cond: 27231 // result: (Const64 [int64(uint16(c))]) 27232 for { 27233 v_0 := v.Args[0] 27234 if v_0.Op != OpConst16 { 27235 break 27236 } 27237 c := v_0.AuxInt 27238 v.reset(OpConst64) 27239 v.AuxInt = int64(uint16(c)) 27240 return true 27241 } 27242 // match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s])))) 27243 // cond: s >= 48 27244 // result: x 27245 for { 27246 v_0 := v.Args[0] 27247 if v_0.Op != OpTrunc64to16 { 27248 break 27249 } 27250 x := v_0.Args[0] 27251 if x.Op != OpRsh64Ux64 { 27252 break 27253 } 27254 _ = x.Args[1] 27255 x_1 := x.Args[1] 27256 if x_1.Op != OpConst64 { 27257 break 27258 } 27259 s := x_1.AuxInt 27260 if !(s >= 48) { 27261 break 27262 } 27263 v.reset(OpCopy) 27264 v.Type = x.Type 27265 v.AddArg(x) 27266 return true 27267 } 27268 return false 27269 } 27270 func rewriteValuegeneric_OpZeroExt32to64_0(v *Value) bool { 27271 // match: (ZeroExt32to64 (Const32 [c])) 27272 // cond: 27273 // result: (Const64 [int64(uint32(c))]) 27274 for { 27275 v_0 := v.Args[0] 27276 if v_0.Op != OpConst32 { 27277 break 27278 } 27279 c := v_0.AuxInt 27280 v.reset(OpConst64) 27281 v.AuxInt = int64(uint32(c)) 27282 return true 27283 } 27284 // match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s])))) 27285 // cond: s >= 32 27286 // result: x 27287 for { 27288 v_0 := v.Args[0] 27289 if v_0.Op != OpTrunc64to32 { 27290 break 27291 } 27292 x := v_0.Args[0] 27293 if x.Op != OpRsh64Ux64 { 27294 break 27295 } 27296 _ = x.Args[1] 27297 x_1 := x.Args[1] 27298 if x_1.Op != OpConst64 { 27299 break 27300 } 27301 s := x_1.AuxInt 27302 if !(s >= 32) { 27303 break 27304 } 27305 v.reset(OpCopy) 27306 v.Type = x.Type 27307 v.AddArg(x) 27308 return true 27309 } 27310 return false 27311 } 27312 func rewriteValuegeneric_OpZeroExt8to16_0(v *Value) bool { 27313 // match: (ZeroExt8to16 (Const8 [c])) 27314 // cond: 27315 // result: (Const16 [int64( uint8(c))]) 27316 for { 27317 v_0 := v.Args[0] 27318 if v_0.Op != OpConst8 { 27319 break 27320 } 27321 c := v_0.AuxInt 27322 v.reset(OpConst16) 27323 v.AuxInt = int64(uint8(c)) 27324 return true 27325 } 27326 // match: (ZeroExt8to16 (Trunc16to8 x:(Rsh16Ux64 _ (Const64 [s])))) 27327 // cond: s >= 8 27328 // result: x 27329 for { 27330 v_0 := v.Args[0] 27331 if v_0.Op != OpTrunc16to8 { 27332 break 27333 } 27334 x := v_0.Args[0] 27335 if x.Op != OpRsh16Ux64 { 27336 break 27337 } 27338 _ = x.Args[1] 27339 x_1 := x.Args[1] 27340 if x_1.Op != OpConst64 { 27341 break 27342 } 27343 s := x_1.AuxInt 27344 if !(s >= 8) { 27345 break 27346 } 27347 v.reset(OpCopy) 27348 v.Type = x.Type 27349 v.AddArg(x) 27350 return true 27351 } 27352 return false 27353 } 27354 func rewriteValuegeneric_OpZeroExt8to32_0(v *Value) bool { 27355 // match: (ZeroExt8to32 (Const8 [c])) 27356 // cond: 27357 // result: (Const32 [int64( uint8(c))]) 27358 for { 27359 v_0 := v.Args[0] 27360 if v_0.Op != OpConst8 { 27361 break 27362 } 27363 c := v_0.AuxInt 27364 v.reset(OpConst32) 27365 v.AuxInt = int64(uint8(c)) 27366 return true 27367 } 27368 // match: (ZeroExt8to32 (Trunc32to8 x:(Rsh32Ux64 _ (Const64 [s])))) 27369 // cond: s >= 24 27370 // result: x 27371 for { 27372 v_0 := v.Args[0] 27373 if v_0.Op != OpTrunc32to8 { 27374 break 27375 } 27376 x := v_0.Args[0] 27377 if x.Op != OpRsh32Ux64 { 27378 break 27379 } 27380 _ = x.Args[1] 27381 x_1 := x.Args[1] 27382 if x_1.Op != OpConst64 { 27383 break 27384 } 27385 s := x_1.AuxInt 27386 if !(s >= 24) { 27387 break 27388 } 27389 v.reset(OpCopy) 27390 v.Type = x.Type 27391 v.AddArg(x) 27392 return true 27393 } 27394 return false 27395 } 27396 func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { 27397 // match: (ZeroExt8to64 (Const8 [c])) 27398 // cond: 27399 // result: (Const64 [int64( uint8(c))]) 27400 for { 27401 v_0 := v.Args[0] 27402 if v_0.Op != OpConst8 { 27403 break 27404 } 27405 c := v_0.AuxInt 27406 v.reset(OpConst64) 27407 v.AuxInt = int64(uint8(c)) 27408 return true 27409 } 27410 // match: (ZeroExt8to64 (Trunc64to8 x:(Rsh64Ux64 _ (Const64 [s])))) 27411 // cond: s >= 56 27412 // result: x 27413 for { 27414 v_0 := v.Args[0] 27415 if v_0.Op != OpTrunc64to8 { 27416 break 27417 } 27418 x := v_0.Args[0] 27419 if x.Op != OpRsh64Ux64 { 27420 break 27421 } 27422 _ = x.Args[1] 27423 x_1 := x.Args[1] 27424 if x_1.Op != OpConst64 { 27425 break 27426 } 27427 s := x_1.AuxInt 27428 if !(s >= 56) { 27429 break 27430 } 27431 v.reset(OpCopy) 27432 v.Type = x.Type 27433 v.AddArg(x) 27434 return true 27435 } 27436 return false 27437 } 27438 func rewriteBlockgeneric(b *Block) bool { 27439 config := b.Func.Config 27440 _ = config 27441 fe := b.Func.fe 27442 _ = fe 27443 typ := &config.Types 27444 _ = typ 27445 switch b.Kind { 27446 case BlockIf: 27447 // match: (If (Not cond) yes no) 27448 // cond: 27449 // result: (If cond no yes) 27450 for { 27451 v := b.Control 27452 if v.Op != OpNot { 27453 break 27454 } 27455 cond := v.Args[0] 27456 b.Kind = BlockIf 27457 b.SetControl(cond) 27458 b.Aux = nil 27459 b.swapSuccessors() 27460 return true 27461 } 27462 // match: (If (ConstBool [c]) yes no) 27463 // cond: c == 1 27464 // result: (First nil yes no) 27465 for { 27466 v := b.Control 27467 if v.Op != OpConstBool { 27468 break 27469 } 27470 c := v.AuxInt 27471 if !(c == 1) { 27472 break 27473 } 27474 b.Kind = BlockFirst 27475 b.SetControl(nil) 27476 b.Aux = nil 27477 return true 27478 } 27479 // match: (If (ConstBool [c]) yes no) 27480 // cond: c == 0 27481 // result: (First nil no yes) 27482 for { 27483 v := b.Control 27484 if v.Op != OpConstBool { 27485 break 27486 } 27487 c := v.AuxInt 27488 if !(c == 0) { 27489 break 27490 } 27491 b.Kind = BlockFirst 27492 b.SetControl(nil) 27493 b.Aux = nil 27494 b.swapSuccessors() 27495 return true 27496 } 27497 } 27498 return false 27499 }