github.com/Filosottile/go@v0.0.0-20170906193555-dbed9972d994/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 n (Const64 [-1<<63])) 8224 // cond: 8225 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [63])) 8226 for { 8227 _ = v.Args[1] 8228 n := v.Args[0] 8229 v_1 := v.Args[1] 8230 if v_1.Op != OpConst64 { 8231 break 8232 } 8233 if v_1.AuxInt != -1<<63 { 8234 break 8235 } 8236 v.reset(OpRsh64Ux64) 8237 v.AddArg(n) 8238 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8239 v0.AuxInt = 63 8240 v.AddArg(v0) 8241 return true 8242 } 8243 // match: (Div64u x (Const64 [c])) 8244 // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 8245 // 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])) 8246 for { 8247 _ = v.Args[1] 8248 x := v.Args[0] 8249 v_1 := v.Args[1] 8250 if v_1.Op != OpConst64 { 8251 break 8252 } 8253 c := v_1.AuxInt 8254 if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) { 8255 break 8256 } 8257 v.reset(OpRsh64Ux64) 8258 v.Type = typ.UInt64 8259 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8260 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8261 v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) 8262 v0.AddArg(v1) 8263 v0.AddArg(x) 8264 v.AddArg(v0) 8265 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8266 v2.AuxInt = umagic(64, c).s - 1 8267 v.AddArg(v2) 8268 return true 8269 } 8270 // match: (Div64u x (Const64 [c])) 8271 // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 8272 // 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])) 8273 for { 8274 _ = v.Args[1] 8275 x := v.Args[0] 8276 v_1 := v.Args[1] 8277 if v_1.Op != OpConst64 { 8278 break 8279 } 8280 c := v_1.AuxInt 8281 if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) { 8282 break 8283 } 8284 v.reset(OpRsh64Ux64) 8285 v.Type = typ.UInt64 8286 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8287 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8288 v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) 8289 v0.AddArg(v1) 8290 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8291 v2.AddArg(x) 8292 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8293 v3.AuxInt = 1 8294 v2.AddArg(v3) 8295 v0.AddArg(v2) 8296 v.AddArg(v0) 8297 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8298 v4.AuxInt = umagic(64, c).s - 2 8299 v.AddArg(v4) 8300 return true 8301 } 8302 // match: (Div64u x (Const64 [c])) 8303 // cond: umagicOK(64, c) && config.RegSize == 8 8304 // 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])) 8305 for { 8306 _ = v.Args[1] 8307 x := v.Args[0] 8308 v_1 := v.Args[1] 8309 if v_1.Op != OpConst64 { 8310 break 8311 } 8312 c := v_1.AuxInt 8313 if !(umagicOK(64, c) && config.RegSize == 8) { 8314 break 8315 } 8316 v.reset(OpRsh64Ux64) 8317 v.Type = typ.UInt64 8318 v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 8319 v0.AddArg(x) 8320 v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8321 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8322 v2.AuxInt = int64(umagic(64, c).m) 8323 v1.AddArg(v2) 8324 v1.AddArg(x) 8325 v0.AddArg(v1) 8326 v.AddArg(v0) 8327 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8328 v3.AuxInt = umagic(64, c).s - 1 8329 v.AddArg(v3) 8330 return true 8331 } 8332 return false 8333 } 8334 func rewriteValuegeneric_OpDiv8_0(v *Value) bool { 8335 b := v.Block 8336 _ = b 8337 typ := &b.Func.Config.Types 8338 _ = typ 8339 // match: (Div8 (Const8 [c]) (Const8 [d])) 8340 // cond: d != 0 8341 // result: (Const8 [int64(int8(c)/int8(d))]) 8342 for { 8343 _ = v.Args[1] 8344 v_0 := v.Args[0] 8345 if v_0.Op != OpConst8 { 8346 break 8347 } 8348 c := v_0.AuxInt 8349 v_1 := v.Args[1] 8350 if v_1.Op != OpConst8 { 8351 break 8352 } 8353 d := v_1.AuxInt 8354 if !(d != 0) { 8355 break 8356 } 8357 v.reset(OpConst8) 8358 v.AuxInt = int64(int8(c) / int8(d)) 8359 return true 8360 } 8361 // match: (Div8 <t> n (Const8 [c])) 8362 // cond: c < 0 && c != -1<<7 8363 // result: (Neg8 (Div8 <t> n (Const8 <t> [-c]))) 8364 for { 8365 t := v.Type 8366 _ = v.Args[1] 8367 n := v.Args[0] 8368 v_1 := v.Args[1] 8369 if v_1.Op != OpConst8 { 8370 break 8371 } 8372 c := v_1.AuxInt 8373 if !(c < 0 && c != -1<<7) { 8374 break 8375 } 8376 v.reset(OpNeg8) 8377 v0 := b.NewValue0(v.Pos, OpDiv8, t) 8378 v0.AddArg(n) 8379 v1 := b.NewValue0(v.Pos, OpConst8, t) 8380 v1.AuxInt = -c 8381 v0.AddArg(v1) 8382 v.AddArg(v0) 8383 return true 8384 } 8385 // match: (Div8 <t> x (Const8 [-1<<7 ])) 8386 // cond: 8387 // result: (Rsh8Ux64 (And8 <t> x (Neg8 <t> x)) (Const64 <typ.UInt64> [7 ])) 8388 for { 8389 t := v.Type 8390 _ = v.Args[1] 8391 x := v.Args[0] 8392 v_1 := v.Args[1] 8393 if v_1.Op != OpConst8 { 8394 break 8395 } 8396 if v_1.AuxInt != -1<<7 { 8397 break 8398 } 8399 v.reset(OpRsh8Ux64) 8400 v0 := b.NewValue0(v.Pos, OpAnd8, t) 8401 v0.AddArg(x) 8402 v1 := b.NewValue0(v.Pos, OpNeg8, t) 8403 v1.AddArg(x) 8404 v0.AddArg(v1) 8405 v.AddArg(v0) 8406 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8407 v2.AuxInt = 7 8408 v.AddArg(v2) 8409 return true 8410 } 8411 // match: (Div8 <t> n (Const8 [c])) 8412 // cond: isPowerOfTwo(c) 8413 // 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)])) 8414 for { 8415 t := v.Type 8416 _ = v.Args[1] 8417 n := v.Args[0] 8418 v_1 := v.Args[1] 8419 if v_1.Op != OpConst8 { 8420 break 8421 } 8422 c := v_1.AuxInt 8423 if !(isPowerOfTwo(c)) { 8424 break 8425 } 8426 v.reset(OpRsh8x64) 8427 v0 := b.NewValue0(v.Pos, OpAdd8, t) 8428 v0.AddArg(n) 8429 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) 8430 v2 := b.NewValue0(v.Pos, OpRsh8x64, t) 8431 v2.AddArg(n) 8432 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8433 v3.AuxInt = 7 8434 v2.AddArg(v3) 8435 v1.AddArg(v2) 8436 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8437 v4.AuxInt = 8 - log2(c) 8438 v1.AddArg(v4) 8439 v0.AddArg(v1) 8440 v.AddArg(v0) 8441 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8442 v5.AuxInt = log2(c) 8443 v.AddArg(v5) 8444 return true 8445 } 8446 // match: (Div8 <t> x (Const8 [c])) 8447 // cond: smagicOK(8,c) 8448 // 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]))) 8449 for { 8450 t := v.Type 8451 _ = v.Args[1] 8452 x := v.Args[0] 8453 v_1 := v.Args[1] 8454 if v_1.Op != OpConst8 { 8455 break 8456 } 8457 c := v_1.AuxInt 8458 if !(smagicOK(8, c)) { 8459 break 8460 } 8461 v.reset(OpSub8) 8462 v.Type = t 8463 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 8464 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8465 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8466 v2.AuxInt = int64(smagic(8, c).m) 8467 v1.AddArg(v2) 8468 v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8469 v3.AddArg(x) 8470 v1.AddArg(v3) 8471 v0.AddArg(v1) 8472 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8473 v4.AuxInt = 8 + smagic(8, c).s 8474 v0.AddArg(v4) 8475 v.AddArg(v0) 8476 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 8477 v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8478 v6.AddArg(x) 8479 v5.AddArg(v6) 8480 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8481 v7.AuxInt = 31 8482 v5.AddArg(v7) 8483 v.AddArg(v5) 8484 return true 8485 } 8486 return false 8487 } 8488 func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { 8489 b := v.Block 8490 _ = b 8491 typ := &b.Func.Config.Types 8492 _ = typ 8493 // match: (Div8u (Const8 [c]) (Const8 [d])) 8494 // cond: d != 0 8495 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) 8496 for { 8497 _ = v.Args[1] 8498 v_0 := v.Args[0] 8499 if v_0.Op != OpConst8 { 8500 break 8501 } 8502 c := v_0.AuxInt 8503 v_1 := v.Args[1] 8504 if v_1.Op != OpConst8 { 8505 break 8506 } 8507 d := v_1.AuxInt 8508 if !(d != 0) { 8509 break 8510 } 8511 v.reset(OpConst8) 8512 v.AuxInt = int64(int8(uint8(c) / uint8(d))) 8513 return true 8514 } 8515 // match: (Div8u n (Const8 [c])) 8516 // cond: isPowerOfTwo(c&0xff) 8517 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 8518 for { 8519 _ = v.Args[1] 8520 n := v.Args[0] 8521 v_1 := v.Args[1] 8522 if v_1.Op != OpConst8 { 8523 break 8524 } 8525 c := v_1.AuxInt 8526 if !(isPowerOfTwo(c & 0xff)) { 8527 break 8528 } 8529 v.reset(OpRsh8Ux64) 8530 v.AddArg(n) 8531 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8532 v0.AuxInt = log2(c & 0xff) 8533 v.AddArg(v0) 8534 return true 8535 } 8536 // match: (Div8u x (Const8 [c])) 8537 // cond: umagicOK(8, c) 8538 // 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]))) 8539 for { 8540 _ = v.Args[1] 8541 x := v.Args[0] 8542 v_1 := v.Args[1] 8543 if v_1.Op != OpConst8 { 8544 break 8545 } 8546 c := v_1.AuxInt 8547 if !(umagicOK(8, c)) { 8548 break 8549 } 8550 v.reset(OpTrunc32to8) 8551 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 8552 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8553 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8554 v2.AuxInt = int64(1<<8 + umagic(8, c).m) 8555 v1.AddArg(v2) 8556 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 8557 v3.AddArg(x) 8558 v1.AddArg(v3) 8559 v0.AddArg(v1) 8560 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8561 v4.AuxInt = 8 + umagic(8, c).s 8562 v0.AddArg(v4) 8563 v.AddArg(v0) 8564 return true 8565 } 8566 return false 8567 } 8568 func rewriteValuegeneric_OpEq16_0(v *Value) bool { 8569 b := v.Block 8570 _ = b 8571 // match: (Eq16 x x) 8572 // cond: 8573 // result: (ConstBool [1]) 8574 for { 8575 _ = v.Args[1] 8576 x := v.Args[0] 8577 if x != v.Args[1] { 8578 break 8579 } 8580 v.reset(OpConstBool) 8581 v.AuxInt = 1 8582 return true 8583 } 8584 // match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 8585 // cond: 8586 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8587 for { 8588 _ = v.Args[1] 8589 v_0 := v.Args[0] 8590 if v_0.Op != OpConst16 { 8591 break 8592 } 8593 t := v_0.Type 8594 c := v_0.AuxInt 8595 v_1 := v.Args[1] 8596 if v_1.Op != OpAdd16 { 8597 break 8598 } 8599 _ = v_1.Args[1] 8600 v_1_0 := v_1.Args[0] 8601 if v_1_0.Op != OpConst16 { 8602 break 8603 } 8604 if v_1_0.Type != t { 8605 break 8606 } 8607 d := v_1_0.AuxInt 8608 x := v_1.Args[1] 8609 v.reset(OpEq16) 8610 v0 := b.NewValue0(v.Pos, OpConst16, t) 8611 v0.AuxInt = int64(int16(c - d)) 8612 v.AddArg(v0) 8613 v.AddArg(x) 8614 return true 8615 } 8616 // match: (Eq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 8617 // cond: 8618 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8619 for { 8620 _ = v.Args[1] 8621 v_0 := v.Args[0] 8622 if v_0.Op != OpConst16 { 8623 break 8624 } 8625 t := v_0.Type 8626 c := v_0.AuxInt 8627 v_1 := v.Args[1] 8628 if v_1.Op != OpAdd16 { 8629 break 8630 } 8631 _ = v_1.Args[1] 8632 x := v_1.Args[0] 8633 v_1_1 := v_1.Args[1] 8634 if v_1_1.Op != OpConst16 { 8635 break 8636 } 8637 if v_1_1.Type != t { 8638 break 8639 } 8640 d := v_1_1.AuxInt 8641 v.reset(OpEq16) 8642 v0 := b.NewValue0(v.Pos, OpConst16, t) 8643 v0.AuxInt = int64(int16(c - d)) 8644 v.AddArg(v0) 8645 v.AddArg(x) 8646 return true 8647 } 8648 // match: (Eq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 8649 // cond: 8650 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8651 for { 8652 _ = v.Args[1] 8653 v_0 := v.Args[0] 8654 if v_0.Op != OpAdd16 { 8655 break 8656 } 8657 _ = v_0.Args[1] 8658 v_0_0 := v_0.Args[0] 8659 if v_0_0.Op != OpConst16 { 8660 break 8661 } 8662 t := v_0_0.Type 8663 d := v_0_0.AuxInt 8664 x := v_0.Args[1] 8665 v_1 := v.Args[1] 8666 if v_1.Op != OpConst16 { 8667 break 8668 } 8669 if v_1.Type != t { 8670 break 8671 } 8672 c := v_1.AuxInt 8673 v.reset(OpEq16) 8674 v0 := b.NewValue0(v.Pos, OpConst16, t) 8675 v0.AuxInt = int64(int16(c - d)) 8676 v.AddArg(v0) 8677 v.AddArg(x) 8678 return true 8679 } 8680 // match: (Eq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 8681 // cond: 8682 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8683 for { 8684 _ = v.Args[1] 8685 v_0 := v.Args[0] 8686 if v_0.Op != OpAdd16 { 8687 break 8688 } 8689 _ = v_0.Args[1] 8690 x := v_0.Args[0] 8691 v_0_1 := v_0.Args[1] 8692 if v_0_1.Op != OpConst16 { 8693 break 8694 } 8695 t := v_0_1.Type 8696 d := v_0_1.AuxInt 8697 v_1 := v.Args[1] 8698 if v_1.Op != OpConst16 { 8699 break 8700 } 8701 if v_1.Type != t { 8702 break 8703 } 8704 c := v_1.AuxInt 8705 v.reset(OpEq16) 8706 v0 := b.NewValue0(v.Pos, OpConst16, t) 8707 v0.AuxInt = int64(int16(c - d)) 8708 v.AddArg(v0) 8709 v.AddArg(x) 8710 return true 8711 } 8712 // match: (Eq16 (Const16 [c]) (Const16 [d])) 8713 // cond: 8714 // result: (ConstBool [b2i(c == d)]) 8715 for { 8716 _ = v.Args[1] 8717 v_0 := v.Args[0] 8718 if v_0.Op != OpConst16 { 8719 break 8720 } 8721 c := v_0.AuxInt 8722 v_1 := v.Args[1] 8723 if v_1.Op != OpConst16 { 8724 break 8725 } 8726 d := v_1.AuxInt 8727 v.reset(OpConstBool) 8728 v.AuxInt = b2i(c == d) 8729 return true 8730 } 8731 // match: (Eq16 (Const16 [d]) (Const16 [c])) 8732 // cond: 8733 // result: (ConstBool [b2i(c == d)]) 8734 for { 8735 _ = v.Args[1] 8736 v_0 := v.Args[0] 8737 if v_0.Op != OpConst16 { 8738 break 8739 } 8740 d := v_0.AuxInt 8741 v_1 := v.Args[1] 8742 if v_1.Op != OpConst16 { 8743 break 8744 } 8745 c := v_1.AuxInt 8746 v.reset(OpConstBool) 8747 v.AuxInt = b2i(c == d) 8748 return true 8749 } 8750 return false 8751 } 8752 func rewriteValuegeneric_OpEq32_0(v *Value) bool { 8753 b := v.Block 8754 _ = b 8755 // match: (Eq32 x x) 8756 // cond: 8757 // result: (ConstBool [1]) 8758 for { 8759 _ = v.Args[1] 8760 x := v.Args[0] 8761 if x != v.Args[1] { 8762 break 8763 } 8764 v.reset(OpConstBool) 8765 v.AuxInt = 1 8766 return true 8767 } 8768 // match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 8769 // cond: 8770 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 8771 for { 8772 _ = v.Args[1] 8773 v_0 := v.Args[0] 8774 if v_0.Op != OpConst32 { 8775 break 8776 } 8777 t := v_0.Type 8778 c := v_0.AuxInt 8779 v_1 := v.Args[1] 8780 if v_1.Op != OpAdd32 { 8781 break 8782 } 8783 _ = v_1.Args[1] 8784 v_1_0 := v_1.Args[0] 8785 if v_1_0.Op != OpConst32 { 8786 break 8787 } 8788 if v_1_0.Type != t { 8789 break 8790 } 8791 d := v_1_0.AuxInt 8792 x := v_1.Args[1] 8793 v.reset(OpEq32) 8794 v0 := b.NewValue0(v.Pos, OpConst32, t) 8795 v0.AuxInt = int64(int32(c - d)) 8796 v.AddArg(v0) 8797 v.AddArg(x) 8798 return true 8799 } 8800 // match: (Eq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 8801 // cond: 8802 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 8803 for { 8804 _ = v.Args[1] 8805 v_0 := v.Args[0] 8806 if v_0.Op != OpConst32 { 8807 break 8808 } 8809 t := v_0.Type 8810 c := v_0.AuxInt 8811 v_1 := v.Args[1] 8812 if v_1.Op != OpAdd32 { 8813 break 8814 } 8815 _ = v_1.Args[1] 8816 x := v_1.Args[0] 8817 v_1_1 := v_1.Args[1] 8818 if v_1_1.Op != OpConst32 { 8819 break 8820 } 8821 if v_1_1.Type != t { 8822 break 8823 } 8824 d := v_1_1.AuxInt 8825 v.reset(OpEq32) 8826 v0 := b.NewValue0(v.Pos, OpConst32, t) 8827 v0.AuxInt = int64(int32(c - d)) 8828 v.AddArg(v0) 8829 v.AddArg(x) 8830 return true 8831 } 8832 // match: (Eq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 8833 // cond: 8834 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 8835 for { 8836 _ = v.Args[1] 8837 v_0 := v.Args[0] 8838 if v_0.Op != OpAdd32 { 8839 break 8840 } 8841 _ = v_0.Args[1] 8842 v_0_0 := v_0.Args[0] 8843 if v_0_0.Op != OpConst32 { 8844 break 8845 } 8846 t := v_0_0.Type 8847 d := v_0_0.AuxInt 8848 x := v_0.Args[1] 8849 v_1 := v.Args[1] 8850 if v_1.Op != OpConst32 { 8851 break 8852 } 8853 if v_1.Type != t { 8854 break 8855 } 8856 c := v_1.AuxInt 8857 v.reset(OpEq32) 8858 v0 := b.NewValue0(v.Pos, OpConst32, t) 8859 v0.AuxInt = int64(int32(c - d)) 8860 v.AddArg(v0) 8861 v.AddArg(x) 8862 return true 8863 } 8864 // match: (Eq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 8865 // cond: 8866 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 8867 for { 8868 _ = v.Args[1] 8869 v_0 := v.Args[0] 8870 if v_0.Op != OpAdd32 { 8871 break 8872 } 8873 _ = v_0.Args[1] 8874 x := v_0.Args[0] 8875 v_0_1 := v_0.Args[1] 8876 if v_0_1.Op != OpConst32 { 8877 break 8878 } 8879 t := v_0_1.Type 8880 d := v_0_1.AuxInt 8881 v_1 := v.Args[1] 8882 if v_1.Op != OpConst32 { 8883 break 8884 } 8885 if v_1.Type != t { 8886 break 8887 } 8888 c := v_1.AuxInt 8889 v.reset(OpEq32) 8890 v0 := b.NewValue0(v.Pos, OpConst32, t) 8891 v0.AuxInt = int64(int32(c - d)) 8892 v.AddArg(v0) 8893 v.AddArg(x) 8894 return true 8895 } 8896 // match: (Eq32 (Const32 [c]) (Const32 [d])) 8897 // cond: 8898 // result: (ConstBool [b2i(c == d)]) 8899 for { 8900 _ = v.Args[1] 8901 v_0 := v.Args[0] 8902 if v_0.Op != OpConst32 { 8903 break 8904 } 8905 c := v_0.AuxInt 8906 v_1 := v.Args[1] 8907 if v_1.Op != OpConst32 { 8908 break 8909 } 8910 d := v_1.AuxInt 8911 v.reset(OpConstBool) 8912 v.AuxInt = b2i(c == d) 8913 return true 8914 } 8915 // match: (Eq32 (Const32 [d]) (Const32 [c])) 8916 // cond: 8917 // result: (ConstBool [b2i(c == d)]) 8918 for { 8919 _ = v.Args[1] 8920 v_0 := v.Args[0] 8921 if v_0.Op != OpConst32 { 8922 break 8923 } 8924 d := v_0.AuxInt 8925 v_1 := v.Args[1] 8926 if v_1.Op != OpConst32 { 8927 break 8928 } 8929 c := v_1.AuxInt 8930 v.reset(OpConstBool) 8931 v.AuxInt = b2i(c == d) 8932 return true 8933 } 8934 return false 8935 } 8936 func rewriteValuegeneric_OpEq64_0(v *Value) bool { 8937 b := v.Block 8938 _ = b 8939 // match: (Eq64 x x) 8940 // cond: 8941 // result: (ConstBool [1]) 8942 for { 8943 _ = v.Args[1] 8944 x := v.Args[0] 8945 if x != v.Args[1] { 8946 break 8947 } 8948 v.reset(OpConstBool) 8949 v.AuxInt = 1 8950 return true 8951 } 8952 // match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 8953 // cond: 8954 // result: (Eq64 (Const64 <t> [c-d]) x) 8955 for { 8956 _ = v.Args[1] 8957 v_0 := v.Args[0] 8958 if v_0.Op != OpConst64 { 8959 break 8960 } 8961 t := v_0.Type 8962 c := v_0.AuxInt 8963 v_1 := v.Args[1] 8964 if v_1.Op != OpAdd64 { 8965 break 8966 } 8967 _ = v_1.Args[1] 8968 v_1_0 := v_1.Args[0] 8969 if v_1_0.Op != OpConst64 { 8970 break 8971 } 8972 if v_1_0.Type != t { 8973 break 8974 } 8975 d := v_1_0.AuxInt 8976 x := v_1.Args[1] 8977 v.reset(OpEq64) 8978 v0 := b.NewValue0(v.Pos, OpConst64, t) 8979 v0.AuxInt = c - d 8980 v.AddArg(v0) 8981 v.AddArg(x) 8982 return true 8983 } 8984 // match: (Eq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 8985 // cond: 8986 // result: (Eq64 (Const64 <t> [c-d]) x) 8987 for { 8988 _ = v.Args[1] 8989 v_0 := v.Args[0] 8990 if v_0.Op != OpConst64 { 8991 break 8992 } 8993 t := v_0.Type 8994 c := v_0.AuxInt 8995 v_1 := v.Args[1] 8996 if v_1.Op != OpAdd64 { 8997 break 8998 } 8999 _ = v_1.Args[1] 9000 x := v_1.Args[0] 9001 v_1_1 := v_1.Args[1] 9002 if v_1_1.Op != OpConst64 { 9003 break 9004 } 9005 if v_1_1.Type != t { 9006 break 9007 } 9008 d := v_1_1.AuxInt 9009 v.reset(OpEq64) 9010 v0 := b.NewValue0(v.Pos, OpConst64, t) 9011 v0.AuxInt = c - d 9012 v.AddArg(v0) 9013 v.AddArg(x) 9014 return true 9015 } 9016 // match: (Eq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 9017 // cond: 9018 // result: (Eq64 (Const64 <t> [c-d]) x) 9019 for { 9020 _ = v.Args[1] 9021 v_0 := v.Args[0] 9022 if v_0.Op != OpAdd64 { 9023 break 9024 } 9025 _ = v_0.Args[1] 9026 v_0_0 := v_0.Args[0] 9027 if v_0_0.Op != OpConst64 { 9028 break 9029 } 9030 t := v_0_0.Type 9031 d := v_0_0.AuxInt 9032 x := v_0.Args[1] 9033 v_1 := v.Args[1] 9034 if v_1.Op != OpConst64 { 9035 break 9036 } 9037 if v_1.Type != t { 9038 break 9039 } 9040 c := v_1.AuxInt 9041 v.reset(OpEq64) 9042 v0 := b.NewValue0(v.Pos, OpConst64, t) 9043 v0.AuxInt = c - d 9044 v.AddArg(v0) 9045 v.AddArg(x) 9046 return true 9047 } 9048 // match: (Eq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 9049 // cond: 9050 // result: (Eq64 (Const64 <t> [c-d]) x) 9051 for { 9052 _ = v.Args[1] 9053 v_0 := v.Args[0] 9054 if v_0.Op != OpAdd64 { 9055 break 9056 } 9057 _ = v_0.Args[1] 9058 x := v_0.Args[0] 9059 v_0_1 := v_0.Args[1] 9060 if v_0_1.Op != OpConst64 { 9061 break 9062 } 9063 t := v_0_1.Type 9064 d := v_0_1.AuxInt 9065 v_1 := v.Args[1] 9066 if v_1.Op != OpConst64 { 9067 break 9068 } 9069 if v_1.Type != t { 9070 break 9071 } 9072 c := v_1.AuxInt 9073 v.reset(OpEq64) 9074 v0 := b.NewValue0(v.Pos, OpConst64, t) 9075 v0.AuxInt = c - d 9076 v.AddArg(v0) 9077 v.AddArg(x) 9078 return true 9079 } 9080 // match: (Eq64 (Const64 [c]) (Const64 [d])) 9081 // cond: 9082 // result: (ConstBool [b2i(c == d)]) 9083 for { 9084 _ = v.Args[1] 9085 v_0 := v.Args[0] 9086 if v_0.Op != OpConst64 { 9087 break 9088 } 9089 c := v_0.AuxInt 9090 v_1 := v.Args[1] 9091 if v_1.Op != OpConst64 { 9092 break 9093 } 9094 d := v_1.AuxInt 9095 v.reset(OpConstBool) 9096 v.AuxInt = b2i(c == d) 9097 return true 9098 } 9099 // match: (Eq64 (Const64 [d]) (Const64 [c])) 9100 // cond: 9101 // result: (ConstBool [b2i(c == d)]) 9102 for { 9103 _ = v.Args[1] 9104 v_0 := v.Args[0] 9105 if v_0.Op != OpConst64 { 9106 break 9107 } 9108 d := v_0.AuxInt 9109 v_1 := v.Args[1] 9110 if v_1.Op != OpConst64 { 9111 break 9112 } 9113 c := v_1.AuxInt 9114 v.reset(OpConstBool) 9115 v.AuxInt = b2i(c == d) 9116 return true 9117 } 9118 return false 9119 } 9120 func rewriteValuegeneric_OpEq8_0(v *Value) bool { 9121 b := v.Block 9122 _ = b 9123 // match: (Eq8 x x) 9124 // cond: 9125 // result: (ConstBool [1]) 9126 for { 9127 _ = v.Args[1] 9128 x := v.Args[0] 9129 if x != v.Args[1] { 9130 break 9131 } 9132 v.reset(OpConstBool) 9133 v.AuxInt = 1 9134 return true 9135 } 9136 // match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 9137 // cond: 9138 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9139 for { 9140 _ = v.Args[1] 9141 v_0 := v.Args[0] 9142 if v_0.Op != OpConst8 { 9143 break 9144 } 9145 t := v_0.Type 9146 c := v_0.AuxInt 9147 v_1 := v.Args[1] 9148 if v_1.Op != OpAdd8 { 9149 break 9150 } 9151 _ = v_1.Args[1] 9152 v_1_0 := v_1.Args[0] 9153 if v_1_0.Op != OpConst8 { 9154 break 9155 } 9156 if v_1_0.Type != t { 9157 break 9158 } 9159 d := v_1_0.AuxInt 9160 x := v_1.Args[1] 9161 v.reset(OpEq8) 9162 v0 := b.NewValue0(v.Pos, OpConst8, t) 9163 v0.AuxInt = int64(int8(c - d)) 9164 v.AddArg(v0) 9165 v.AddArg(x) 9166 return true 9167 } 9168 // match: (Eq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 9169 // cond: 9170 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9171 for { 9172 _ = v.Args[1] 9173 v_0 := v.Args[0] 9174 if v_0.Op != OpConst8 { 9175 break 9176 } 9177 t := v_0.Type 9178 c := v_0.AuxInt 9179 v_1 := v.Args[1] 9180 if v_1.Op != OpAdd8 { 9181 break 9182 } 9183 _ = v_1.Args[1] 9184 x := v_1.Args[0] 9185 v_1_1 := v_1.Args[1] 9186 if v_1_1.Op != OpConst8 { 9187 break 9188 } 9189 if v_1_1.Type != t { 9190 break 9191 } 9192 d := v_1_1.AuxInt 9193 v.reset(OpEq8) 9194 v0 := b.NewValue0(v.Pos, OpConst8, t) 9195 v0.AuxInt = int64(int8(c - d)) 9196 v.AddArg(v0) 9197 v.AddArg(x) 9198 return true 9199 } 9200 // match: (Eq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 9201 // cond: 9202 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9203 for { 9204 _ = v.Args[1] 9205 v_0 := v.Args[0] 9206 if v_0.Op != OpAdd8 { 9207 break 9208 } 9209 _ = v_0.Args[1] 9210 v_0_0 := v_0.Args[0] 9211 if v_0_0.Op != OpConst8 { 9212 break 9213 } 9214 t := v_0_0.Type 9215 d := v_0_0.AuxInt 9216 x := v_0.Args[1] 9217 v_1 := v.Args[1] 9218 if v_1.Op != OpConst8 { 9219 break 9220 } 9221 if v_1.Type != t { 9222 break 9223 } 9224 c := v_1.AuxInt 9225 v.reset(OpEq8) 9226 v0 := b.NewValue0(v.Pos, OpConst8, t) 9227 v0.AuxInt = int64(int8(c - d)) 9228 v.AddArg(v0) 9229 v.AddArg(x) 9230 return true 9231 } 9232 // match: (Eq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 9233 // cond: 9234 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9235 for { 9236 _ = v.Args[1] 9237 v_0 := v.Args[0] 9238 if v_0.Op != OpAdd8 { 9239 break 9240 } 9241 _ = v_0.Args[1] 9242 x := v_0.Args[0] 9243 v_0_1 := v_0.Args[1] 9244 if v_0_1.Op != OpConst8 { 9245 break 9246 } 9247 t := v_0_1.Type 9248 d := v_0_1.AuxInt 9249 v_1 := v.Args[1] 9250 if v_1.Op != OpConst8 { 9251 break 9252 } 9253 if v_1.Type != t { 9254 break 9255 } 9256 c := v_1.AuxInt 9257 v.reset(OpEq8) 9258 v0 := b.NewValue0(v.Pos, OpConst8, t) 9259 v0.AuxInt = int64(int8(c - d)) 9260 v.AddArg(v0) 9261 v.AddArg(x) 9262 return true 9263 } 9264 // match: (Eq8 (Const8 [c]) (Const8 [d])) 9265 // cond: 9266 // result: (ConstBool [b2i(c == d)]) 9267 for { 9268 _ = v.Args[1] 9269 v_0 := v.Args[0] 9270 if v_0.Op != OpConst8 { 9271 break 9272 } 9273 c := v_0.AuxInt 9274 v_1 := v.Args[1] 9275 if v_1.Op != OpConst8 { 9276 break 9277 } 9278 d := v_1.AuxInt 9279 v.reset(OpConstBool) 9280 v.AuxInt = b2i(c == d) 9281 return true 9282 } 9283 // match: (Eq8 (Const8 [d]) (Const8 [c])) 9284 // cond: 9285 // result: (ConstBool [b2i(c == d)]) 9286 for { 9287 _ = v.Args[1] 9288 v_0 := v.Args[0] 9289 if v_0.Op != OpConst8 { 9290 break 9291 } 9292 d := v_0.AuxInt 9293 v_1 := v.Args[1] 9294 if v_1.Op != OpConst8 { 9295 break 9296 } 9297 c := v_1.AuxInt 9298 v.reset(OpConstBool) 9299 v.AuxInt = b2i(c == d) 9300 return true 9301 } 9302 return false 9303 } 9304 func rewriteValuegeneric_OpEqB_0(v *Value) bool { 9305 // match: (EqB (ConstBool [c]) (ConstBool [d])) 9306 // cond: 9307 // result: (ConstBool [b2i(c == d)]) 9308 for { 9309 _ = v.Args[1] 9310 v_0 := v.Args[0] 9311 if v_0.Op != OpConstBool { 9312 break 9313 } 9314 c := v_0.AuxInt 9315 v_1 := v.Args[1] 9316 if v_1.Op != OpConstBool { 9317 break 9318 } 9319 d := v_1.AuxInt 9320 v.reset(OpConstBool) 9321 v.AuxInt = b2i(c == d) 9322 return true 9323 } 9324 // match: (EqB (ConstBool [d]) (ConstBool [c])) 9325 // cond: 9326 // result: (ConstBool [b2i(c == d)]) 9327 for { 9328 _ = v.Args[1] 9329 v_0 := v.Args[0] 9330 if v_0.Op != OpConstBool { 9331 break 9332 } 9333 d := v_0.AuxInt 9334 v_1 := v.Args[1] 9335 if v_1.Op != OpConstBool { 9336 break 9337 } 9338 c := v_1.AuxInt 9339 v.reset(OpConstBool) 9340 v.AuxInt = b2i(c == d) 9341 return true 9342 } 9343 // match: (EqB (ConstBool [0]) x) 9344 // cond: 9345 // result: (Not x) 9346 for { 9347 _ = v.Args[1] 9348 v_0 := v.Args[0] 9349 if v_0.Op != OpConstBool { 9350 break 9351 } 9352 if v_0.AuxInt != 0 { 9353 break 9354 } 9355 x := v.Args[1] 9356 v.reset(OpNot) 9357 v.AddArg(x) 9358 return true 9359 } 9360 // match: (EqB x (ConstBool [0])) 9361 // cond: 9362 // result: (Not x) 9363 for { 9364 _ = v.Args[1] 9365 x := v.Args[0] 9366 v_1 := v.Args[1] 9367 if v_1.Op != OpConstBool { 9368 break 9369 } 9370 if v_1.AuxInt != 0 { 9371 break 9372 } 9373 v.reset(OpNot) 9374 v.AddArg(x) 9375 return true 9376 } 9377 // match: (EqB (ConstBool [1]) x) 9378 // cond: 9379 // result: x 9380 for { 9381 _ = v.Args[1] 9382 v_0 := v.Args[0] 9383 if v_0.Op != OpConstBool { 9384 break 9385 } 9386 if v_0.AuxInt != 1 { 9387 break 9388 } 9389 x := v.Args[1] 9390 v.reset(OpCopy) 9391 v.Type = x.Type 9392 v.AddArg(x) 9393 return true 9394 } 9395 // match: (EqB x (ConstBool [1])) 9396 // cond: 9397 // result: x 9398 for { 9399 _ = v.Args[1] 9400 x := v.Args[0] 9401 v_1 := v.Args[1] 9402 if v_1.Op != OpConstBool { 9403 break 9404 } 9405 if v_1.AuxInt != 1 { 9406 break 9407 } 9408 v.reset(OpCopy) 9409 v.Type = x.Type 9410 v.AddArg(x) 9411 return true 9412 } 9413 return false 9414 } 9415 func rewriteValuegeneric_OpEqInter_0(v *Value) bool { 9416 b := v.Block 9417 _ = b 9418 typ := &b.Func.Config.Types 9419 _ = typ 9420 // match: (EqInter x y) 9421 // cond: 9422 // result: (EqPtr (ITab x) (ITab y)) 9423 for { 9424 _ = v.Args[1] 9425 x := v.Args[0] 9426 y := v.Args[1] 9427 v.reset(OpEqPtr) 9428 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9429 v0.AddArg(x) 9430 v.AddArg(v0) 9431 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9432 v1.AddArg(y) 9433 v.AddArg(v1) 9434 return true 9435 } 9436 } 9437 func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { 9438 b := v.Block 9439 _ = b 9440 typ := &b.Func.Config.Types 9441 _ = typ 9442 // match: (EqPtr p (ConstNil)) 9443 // cond: 9444 // result: (Not (IsNonNil p)) 9445 for { 9446 _ = v.Args[1] 9447 p := v.Args[0] 9448 v_1 := v.Args[1] 9449 if v_1.Op != OpConstNil { 9450 break 9451 } 9452 v.reset(OpNot) 9453 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9454 v0.AddArg(p) 9455 v.AddArg(v0) 9456 return true 9457 } 9458 // match: (EqPtr (ConstNil) p) 9459 // cond: 9460 // result: (Not (IsNonNil p)) 9461 for { 9462 _ = v.Args[1] 9463 v_0 := v.Args[0] 9464 if v_0.Op != OpConstNil { 9465 break 9466 } 9467 p := v.Args[1] 9468 v.reset(OpNot) 9469 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9470 v0.AddArg(p) 9471 v.AddArg(v0) 9472 return true 9473 } 9474 // match: (EqPtr x x) 9475 // cond: 9476 // result: (ConstBool [1]) 9477 for { 9478 _ = v.Args[1] 9479 x := v.Args[0] 9480 if x != v.Args[1] { 9481 break 9482 } 9483 v.reset(OpConstBool) 9484 v.AuxInt = 1 9485 return true 9486 } 9487 // match: (EqPtr (Addr {a} x) (Addr {b} x)) 9488 // cond: 9489 // result: (ConstBool [b2i(a == b)]) 9490 for { 9491 _ = v.Args[1] 9492 v_0 := v.Args[0] 9493 if v_0.Op != OpAddr { 9494 break 9495 } 9496 a := v_0.Aux 9497 x := v_0.Args[0] 9498 v_1 := v.Args[1] 9499 if v_1.Op != OpAddr { 9500 break 9501 } 9502 b := v_1.Aux 9503 if x != v_1.Args[0] { 9504 break 9505 } 9506 v.reset(OpConstBool) 9507 v.AuxInt = b2i(a == b) 9508 return true 9509 } 9510 // match: (EqPtr (Addr {b} x) (Addr {a} x)) 9511 // cond: 9512 // result: (ConstBool [b2i(a == b)]) 9513 for { 9514 _ = v.Args[1] 9515 v_0 := v.Args[0] 9516 if v_0.Op != OpAddr { 9517 break 9518 } 9519 b := v_0.Aux 9520 x := v_0.Args[0] 9521 v_1 := v.Args[1] 9522 if v_1.Op != OpAddr { 9523 break 9524 } 9525 a := v_1.Aux 9526 if x != v_1.Args[0] { 9527 break 9528 } 9529 v.reset(OpConstBool) 9530 v.AuxInt = b2i(a == b) 9531 return true 9532 } 9533 return false 9534 } 9535 func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { 9536 b := v.Block 9537 _ = b 9538 typ := &b.Func.Config.Types 9539 _ = typ 9540 // match: (EqSlice x y) 9541 // cond: 9542 // result: (EqPtr (SlicePtr x) (SlicePtr y)) 9543 for { 9544 _ = v.Args[1] 9545 x := v.Args[0] 9546 y := v.Args[1] 9547 v.reset(OpEqPtr) 9548 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9549 v0.AddArg(x) 9550 v.AddArg(v0) 9551 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9552 v1.AddArg(y) 9553 v.AddArg(v1) 9554 return true 9555 } 9556 } 9557 func rewriteValuegeneric_OpGeq16_0(v *Value) bool { 9558 // match: (Geq16 (Const16 [c]) (Const16 [d])) 9559 // cond: 9560 // result: (ConstBool [b2i(c >= d)]) 9561 for { 9562 _ = v.Args[1] 9563 v_0 := v.Args[0] 9564 if v_0.Op != OpConst16 { 9565 break 9566 } 9567 c := v_0.AuxInt 9568 v_1 := v.Args[1] 9569 if v_1.Op != OpConst16 { 9570 break 9571 } 9572 d := v_1.AuxInt 9573 v.reset(OpConstBool) 9574 v.AuxInt = b2i(c >= d) 9575 return true 9576 } 9577 return false 9578 } 9579 func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { 9580 // match: (Geq16U (Const16 [c]) (Const16 [d])) 9581 // cond: 9582 // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) 9583 for { 9584 _ = v.Args[1] 9585 v_0 := v.Args[0] 9586 if v_0.Op != OpConst16 { 9587 break 9588 } 9589 c := v_0.AuxInt 9590 v_1 := v.Args[1] 9591 if v_1.Op != OpConst16 { 9592 break 9593 } 9594 d := v_1.AuxInt 9595 v.reset(OpConstBool) 9596 v.AuxInt = b2i(uint16(c) >= uint16(d)) 9597 return true 9598 } 9599 return false 9600 } 9601 func rewriteValuegeneric_OpGeq32_0(v *Value) bool { 9602 // match: (Geq32 (Const32 [c]) (Const32 [d])) 9603 // cond: 9604 // result: (ConstBool [b2i(c >= d)]) 9605 for { 9606 _ = v.Args[1] 9607 v_0 := v.Args[0] 9608 if v_0.Op != OpConst32 { 9609 break 9610 } 9611 c := v_0.AuxInt 9612 v_1 := v.Args[1] 9613 if v_1.Op != OpConst32 { 9614 break 9615 } 9616 d := v_1.AuxInt 9617 v.reset(OpConstBool) 9618 v.AuxInt = b2i(c >= d) 9619 return true 9620 } 9621 return false 9622 } 9623 func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { 9624 // match: (Geq32U (Const32 [c]) (Const32 [d])) 9625 // cond: 9626 // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) 9627 for { 9628 _ = v.Args[1] 9629 v_0 := v.Args[0] 9630 if v_0.Op != OpConst32 { 9631 break 9632 } 9633 c := v_0.AuxInt 9634 v_1 := v.Args[1] 9635 if v_1.Op != OpConst32 { 9636 break 9637 } 9638 d := v_1.AuxInt 9639 v.reset(OpConstBool) 9640 v.AuxInt = b2i(uint32(c) >= uint32(d)) 9641 return true 9642 } 9643 return false 9644 } 9645 func rewriteValuegeneric_OpGeq64_0(v *Value) bool { 9646 // match: (Geq64 (Const64 [c]) (Const64 [d])) 9647 // cond: 9648 // result: (ConstBool [b2i(c >= d)]) 9649 for { 9650 _ = v.Args[1] 9651 v_0 := v.Args[0] 9652 if v_0.Op != OpConst64 { 9653 break 9654 } 9655 c := v_0.AuxInt 9656 v_1 := v.Args[1] 9657 if v_1.Op != OpConst64 { 9658 break 9659 } 9660 d := v_1.AuxInt 9661 v.reset(OpConstBool) 9662 v.AuxInt = b2i(c >= d) 9663 return true 9664 } 9665 return false 9666 } 9667 func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { 9668 // match: (Geq64U (Const64 [c]) (Const64 [d])) 9669 // cond: 9670 // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) 9671 for { 9672 _ = v.Args[1] 9673 v_0 := v.Args[0] 9674 if v_0.Op != OpConst64 { 9675 break 9676 } 9677 c := v_0.AuxInt 9678 v_1 := v.Args[1] 9679 if v_1.Op != OpConst64 { 9680 break 9681 } 9682 d := v_1.AuxInt 9683 v.reset(OpConstBool) 9684 v.AuxInt = b2i(uint64(c) >= uint64(d)) 9685 return true 9686 } 9687 return false 9688 } 9689 func rewriteValuegeneric_OpGeq8_0(v *Value) bool { 9690 // match: (Geq8 (Const8 [c]) (Const8 [d])) 9691 // cond: 9692 // result: (ConstBool [b2i(c >= d)]) 9693 for { 9694 _ = v.Args[1] 9695 v_0 := v.Args[0] 9696 if v_0.Op != OpConst8 { 9697 break 9698 } 9699 c := v_0.AuxInt 9700 v_1 := v.Args[1] 9701 if v_1.Op != OpConst8 { 9702 break 9703 } 9704 d := v_1.AuxInt 9705 v.reset(OpConstBool) 9706 v.AuxInt = b2i(c >= d) 9707 return true 9708 } 9709 return false 9710 } 9711 func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { 9712 // match: (Geq8U (Const8 [c]) (Const8 [d])) 9713 // cond: 9714 // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) 9715 for { 9716 _ = v.Args[1] 9717 v_0 := v.Args[0] 9718 if v_0.Op != OpConst8 { 9719 break 9720 } 9721 c := v_0.AuxInt 9722 v_1 := v.Args[1] 9723 if v_1.Op != OpConst8 { 9724 break 9725 } 9726 d := v_1.AuxInt 9727 v.reset(OpConstBool) 9728 v.AuxInt = b2i(uint8(c) >= uint8(d)) 9729 return true 9730 } 9731 return false 9732 } 9733 func rewriteValuegeneric_OpGreater16_0(v *Value) bool { 9734 // match: (Greater16 (Const16 [c]) (Const16 [d])) 9735 // cond: 9736 // result: (ConstBool [b2i(c > d)]) 9737 for { 9738 _ = v.Args[1] 9739 v_0 := v.Args[0] 9740 if v_0.Op != OpConst16 { 9741 break 9742 } 9743 c := v_0.AuxInt 9744 v_1 := v.Args[1] 9745 if v_1.Op != OpConst16 { 9746 break 9747 } 9748 d := v_1.AuxInt 9749 v.reset(OpConstBool) 9750 v.AuxInt = b2i(c > d) 9751 return true 9752 } 9753 return false 9754 } 9755 func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { 9756 // match: (Greater16U (Const16 [c]) (Const16 [d])) 9757 // cond: 9758 // result: (ConstBool [b2i(uint16(c) > uint16(d))]) 9759 for { 9760 _ = v.Args[1] 9761 v_0 := v.Args[0] 9762 if v_0.Op != OpConst16 { 9763 break 9764 } 9765 c := v_0.AuxInt 9766 v_1 := v.Args[1] 9767 if v_1.Op != OpConst16 { 9768 break 9769 } 9770 d := v_1.AuxInt 9771 v.reset(OpConstBool) 9772 v.AuxInt = b2i(uint16(c) > uint16(d)) 9773 return true 9774 } 9775 return false 9776 } 9777 func rewriteValuegeneric_OpGreater32_0(v *Value) bool { 9778 // match: (Greater32 (Const32 [c]) (Const32 [d])) 9779 // cond: 9780 // result: (ConstBool [b2i(c > d)]) 9781 for { 9782 _ = v.Args[1] 9783 v_0 := v.Args[0] 9784 if v_0.Op != OpConst32 { 9785 break 9786 } 9787 c := v_0.AuxInt 9788 v_1 := v.Args[1] 9789 if v_1.Op != OpConst32 { 9790 break 9791 } 9792 d := v_1.AuxInt 9793 v.reset(OpConstBool) 9794 v.AuxInt = b2i(c > d) 9795 return true 9796 } 9797 return false 9798 } 9799 func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { 9800 // match: (Greater32U (Const32 [c]) (Const32 [d])) 9801 // cond: 9802 // result: (ConstBool [b2i(uint32(c) > uint32(d))]) 9803 for { 9804 _ = v.Args[1] 9805 v_0 := v.Args[0] 9806 if v_0.Op != OpConst32 { 9807 break 9808 } 9809 c := v_0.AuxInt 9810 v_1 := v.Args[1] 9811 if v_1.Op != OpConst32 { 9812 break 9813 } 9814 d := v_1.AuxInt 9815 v.reset(OpConstBool) 9816 v.AuxInt = b2i(uint32(c) > uint32(d)) 9817 return true 9818 } 9819 return false 9820 } 9821 func rewriteValuegeneric_OpGreater64_0(v *Value) bool { 9822 // match: (Greater64 (Const64 [c]) (Const64 [d])) 9823 // cond: 9824 // result: (ConstBool [b2i(c > d)]) 9825 for { 9826 _ = v.Args[1] 9827 v_0 := v.Args[0] 9828 if v_0.Op != OpConst64 { 9829 break 9830 } 9831 c := v_0.AuxInt 9832 v_1 := v.Args[1] 9833 if v_1.Op != OpConst64 { 9834 break 9835 } 9836 d := v_1.AuxInt 9837 v.reset(OpConstBool) 9838 v.AuxInt = b2i(c > d) 9839 return true 9840 } 9841 return false 9842 } 9843 func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { 9844 // match: (Greater64U (Const64 [c]) (Const64 [d])) 9845 // cond: 9846 // result: (ConstBool [b2i(uint64(c) > uint64(d))]) 9847 for { 9848 _ = v.Args[1] 9849 v_0 := v.Args[0] 9850 if v_0.Op != OpConst64 { 9851 break 9852 } 9853 c := v_0.AuxInt 9854 v_1 := v.Args[1] 9855 if v_1.Op != OpConst64 { 9856 break 9857 } 9858 d := v_1.AuxInt 9859 v.reset(OpConstBool) 9860 v.AuxInt = b2i(uint64(c) > uint64(d)) 9861 return true 9862 } 9863 return false 9864 } 9865 func rewriteValuegeneric_OpGreater8_0(v *Value) bool { 9866 // match: (Greater8 (Const8 [c]) (Const8 [d])) 9867 // cond: 9868 // result: (ConstBool [b2i(c > d)]) 9869 for { 9870 _ = v.Args[1] 9871 v_0 := v.Args[0] 9872 if v_0.Op != OpConst8 { 9873 break 9874 } 9875 c := v_0.AuxInt 9876 v_1 := v.Args[1] 9877 if v_1.Op != OpConst8 { 9878 break 9879 } 9880 d := v_1.AuxInt 9881 v.reset(OpConstBool) 9882 v.AuxInt = b2i(c > d) 9883 return true 9884 } 9885 return false 9886 } 9887 func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { 9888 // match: (Greater8U (Const8 [c]) (Const8 [d])) 9889 // cond: 9890 // result: (ConstBool [b2i(uint8(c) > uint8(d))]) 9891 for { 9892 _ = v.Args[1] 9893 v_0 := v.Args[0] 9894 if v_0.Op != OpConst8 { 9895 break 9896 } 9897 c := v_0.AuxInt 9898 v_1 := v.Args[1] 9899 if v_1.Op != OpConst8 { 9900 break 9901 } 9902 d := v_1.AuxInt 9903 v.reset(OpConstBool) 9904 v.AuxInt = b2i(uint8(c) > uint8(d)) 9905 return true 9906 } 9907 return false 9908 } 9909 func rewriteValuegeneric_OpIMake_0(v *Value) bool { 9910 // match: (IMake typ (StructMake1 val)) 9911 // cond: 9912 // result: (IMake typ val) 9913 for { 9914 _ = v.Args[1] 9915 typ := v.Args[0] 9916 v_1 := v.Args[1] 9917 if v_1.Op != OpStructMake1 { 9918 break 9919 } 9920 val := v_1.Args[0] 9921 v.reset(OpIMake) 9922 v.AddArg(typ) 9923 v.AddArg(val) 9924 return true 9925 } 9926 // match: (IMake typ (ArrayMake1 val)) 9927 // cond: 9928 // result: (IMake typ val) 9929 for { 9930 _ = v.Args[1] 9931 typ := v.Args[0] 9932 v_1 := v.Args[1] 9933 if v_1.Op != OpArrayMake1 { 9934 break 9935 } 9936 val := v_1.Args[0] 9937 v.reset(OpIMake) 9938 v.AddArg(typ) 9939 v.AddArg(val) 9940 return true 9941 } 9942 return false 9943 } 9944 func rewriteValuegeneric_OpInterCall_0(v *Value) bool { 9945 // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) 9946 // cond: devirt(v, itab, off) != nil 9947 // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) 9948 for { 9949 argsize := v.AuxInt 9950 _ = v.Args[1] 9951 v_0 := v.Args[0] 9952 if v_0.Op != OpLoad { 9953 break 9954 } 9955 _ = v_0.Args[1] 9956 v_0_0 := v_0.Args[0] 9957 if v_0_0.Op != OpOffPtr { 9958 break 9959 } 9960 off := v_0_0.AuxInt 9961 v_0_0_0 := v_0_0.Args[0] 9962 if v_0_0_0.Op != OpITab { 9963 break 9964 } 9965 v_0_0_0_0 := v_0_0_0.Args[0] 9966 if v_0_0_0_0.Op != OpIMake { 9967 break 9968 } 9969 _ = v_0_0_0_0.Args[1] 9970 v_0_0_0_0_0 := v_0_0_0_0.Args[0] 9971 if v_0_0_0_0_0.Op != OpAddr { 9972 break 9973 } 9974 itab := v_0_0_0_0_0.Aux 9975 v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] 9976 if v_0_0_0_0_0_0.Op != OpSB { 9977 break 9978 } 9979 mem := v.Args[1] 9980 if !(devirt(v, itab, off) != nil) { 9981 break 9982 } 9983 v.reset(OpStaticCall) 9984 v.AuxInt = argsize 9985 v.Aux = devirt(v, itab, off) 9986 v.AddArg(mem) 9987 return true 9988 } 9989 return false 9990 } 9991 func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { 9992 // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) 9993 // cond: (1 << 8) <= c 9994 // result: (ConstBool [1]) 9995 for { 9996 _ = v.Args[1] 9997 v_0 := v.Args[0] 9998 if v_0.Op != OpZeroExt8to32 { 9999 break 10000 } 10001 v_1 := v.Args[1] 10002 if v_1.Op != OpConst32 { 10003 break 10004 } 10005 c := v_1.AuxInt 10006 if !((1 << 8) <= c) { 10007 break 10008 } 10009 v.reset(OpConstBool) 10010 v.AuxInt = 1 10011 return true 10012 } 10013 // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) 10014 // cond: (1 << 8) <= c 10015 // result: (ConstBool [1]) 10016 for { 10017 _ = v.Args[1] 10018 v_0 := v.Args[0] 10019 if v_0.Op != OpZeroExt8to64 { 10020 break 10021 } 10022 v_1 := v.Args[1] 10023 if v_1.Op != OpConst64 { 10024 break 10025 } 10026 c := v_1.AuxInt 10027 if !((1 << 8) <= c) { 10028 break 10029 } 10030 v.reset(OpConstBool) 10031 v.AuxInt = 1 10032 return true 10033 } 10034 // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) 10035 // cond: (1 << 16) <= c 10036 // result: (ConstBool [1]) 10037 for { 10038 _ = v.Args[1] 10039 v_0 := v.Args[0] 10040 if v_0.Op != OpZeroExt16to32 { 10041 break 10042 } 10043 v_1 := v.Args[1] 10044 if v_1.Op != OpConst32 { 10045 break 10046 } 10047 c := v_1.AuxInt 10048 if !((1 << 16) <= c) { 10049 break 10050 } 10051 v.reset(OpConstBool) 10052 v.AuxInt = 1 10053 return true 10054 } 10055 // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) 10056 // cond: (1 << 16) <= c 10057 // result: (ConstBool [1]) 10058 for { 10059 _ = v.Args[1] 10060 v_0 := v.Args[0] 10061 if v_0.Op != OpZeroExt16to64 { 10062 break 10063 } 10064 v_1 := v.Args[1] 10065 if v_1.Op != OpConst64 { 10066 break 10067 } 10068 c := v_1.AuxInt 10069 if !((1 << 16) <= c) { 10070 break 10071 } 10072 v.reset(OpConstBool) 10073 v.AuxInt = 1 10074 return true 10075 } 10076 // match: (IsInBounds x x) 10077 // cond: 10078 // result: (ConstBool [0]) 10079 for { 10080 _ = v.Args[1] 10081 x := v.Args[0] 10082 if x != v.Args[1] { 10083 break 10084 } 10085 v.reset(OpConstBool) 10086 v.AuxInt = 0 10087 return true 10088 } 10089 // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) 10090 // cond: 0 <= c && c < d 10091 // result: (ConstBool [1]) 10092 for { 10093 _ = v.Args[1] 10094 v_0 := v.Args[0] 10095 if v_0.Op != OpAnd8 { 10096 break 10097 } 10098 _ = v_0.Args[1] 10099 v_0_0 := v_0.Args[0] 10100 if v_0_0.Op != OpConst8 { 10101 break 10102 } 10103 c := v_0_0.AuxInt 10104 v_1 := v.Args[1] 10105 if v_1.Op != OpConst8 { 10106 break 10107 } 10108 d := v_1.AuxInt 10109 if !(0 <= c && c < d) { 10110 break 10111 } 10112 v.reset(OpConstBool) 10113 v.AuxInt = 1 10114 return true 10115 } 10116 // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) 10117 // cond: 0 <= c && c < d 10118 // result: (ConstBool [1]) 10119 for { 10120 _ = v.Args[1] 10121 v_0 := v.Args[0] 10122 if v_0.Op != OpAnd8 { 10123 break 10124 } 10125 _ = v_0.Args[1] 10126 v_0_1 := v_0.Args[1] 10127 if v_0_1.Op != OpConst8 { 10128 break 10129 } 10130 c := v_0_1.AuxInt 10131 v_1 := v.Args[1] 10132 if v_1.Op != OpConst8 { 10133 break 10134 } 10135 d := v_1.AuxInt 10136 if !(0 <= c && c < d) { 10137 break 10138 } 10139 v.reset(OpConstBool) 10140 v.AuxInt = 1 10141 return true 10142 } 10143 // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) 10144 // cond: 0 <= c && c < d 10145 // result: (ConstBool [1]) 10146 for { 10147 _ = v.Args[1] 10148 v_0 := v.Args[0] 10149 if v_0.Op != OpZeroExt8to16 { 10150 break 10151 } 10152 v_0_0 := v_0.Args[0] 10153 if v_0_0.Op != OpAnd8 { 10154 break 10155 } 10156 _ = v_0_0.Args[1] 10157 v_0_0_0 := v_0_0.Args[0] 10158 if v_0_0_0.Op != OpConst8 { 10159 break 10160 } 10161 c := v_0_0_0.AuxInt 10162 v_1 := v.Args[1] 10163 if v_1.Op != OpConst16 { 10164 break 10165 } 10166 d := v_1.AuxInt 10167 if !(0 <= c && c < d) { 10168 break 10169 } 10170 v.reset(OpConstBool) 10171 v.AuxInt = 1 10172 return true 10173 } 10174 // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) 10175 // cond: 0 <= c && c < d 10176 // result: (ConstBool [1]) 10177 for { 10178 _ = v.Args[1] 10179 v_0 := v.Args[0] 10180 if v_0.Op != OpZeroExt8to16 { 10181 break 10182 } 10183 v_0_0 := v_0.Args[0] 10184 if v_0_0.Op != OpAnd8 { 10185 break 10186 } 10187 _ = v_0_0.Args[1] 10188 v_0_0_1 := v_0_0.Args[1] 10189 if v_0_0_1.Op != OpConst8 { 10190 break 10191 } 10192 c := v_0_0_1.AuxInt 10193 v_1 := v.Args[1] 10194 if v_1.Op != OpConst16 { 10195 break 10196 } 10197 d := v_1.AuxInt 10198 if !(0 <= c && c < d) { 10199 break 10200 } 10201 v.reset(OpConstBool) 10202 v.AuxInt = 1 10203 return true 10204 } 10205 // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) 10206 // cond: 0 <= c && c < d 10207 // result: (ConstBool [1]) 10208 for { 10209 _ = v.Args[1] 10210 v_0 := v.Args[0] 10211 if v_0.Op != OpZeroExt8to32 { 10212 break 10213 } 10214 v_0_0 := v_0.Args[0] 10215 if v_0_0.Op != OpAnd8 { 10216 break 10217 } 10218 _ = v_0_0.Args[1] 10219 v_0_0_0 := v_0_0.Args[0] 10220 if v_0_0_0.Op != OpConst8 { 10221 break 10222 } 10223 c := v_0_0_0.AuxInt 10224 v_1 := v.Args[1] 10225 if v_1.Op != OpConst32 { 10226 break 10227 } 10228 d := v_1.AuxInt 10229 if !(0 <= c && c < d) { 10230 break 10231 } 10232 v.reset(OpConstBool) 10233 v.AuxInt = 1 10234 return true 10235 } 10236 return false 10237 } 10238 func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { 10239 // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) 10240 // cond: 0 <= c && c < d 10241 // result: (ConstBool [1]) 10242 for { 10243 _ = v.Args[1] 10244 v_0 := v.Args[0] 10245 if v_0.Op != OpZeroExt8to32 { 10246 break 10247 } 10248 v_0_0 := v_0.Args[0] 10249 if v_0_0.Op != OpAnd8 { 10250 break 10251 } 10252 _ = v_0_0.Args[1] 10253 v_0_0_1 := v_0_0.Args[1] 10254 if v_0_0_1.Op != OpConst8 { 10255 break 10256 } 10257 c := v_0_0_1.AuxInt 10258 v_1 := v.Args[1] 10259 if v_1.Op != OpConst32 { 10260 break 10261 } 10262 d := v_1.AuxInt 10263 if !(0 <= c && c < d) { 10264 break 10265 } 10266 v.reset(OpConstBool) 10267 v.AuxInt = 1 10268 return true 10269 } 10270 // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) 10271 // cond: 0 <= c && c < d 10272 // result: (ConstBool [1]) 10273 for { 10274 _ = v.Args[1] 10275 v_0 := v.Args[0] 10276 if v_0.Op != OpZeroExt8to64 { 10277 break 10278 } 10279 v_0_0 := v_0.Args[0] 10280 if v_0_0.Op != OpAnd8 { 10281 break 10282 } 10283 _ = v_0_0.Args[1] 10284 v_0_0_0 := v_0_0.Args[0] 10285 if v_0_0_0.Op != OpConst8 { 10286 break 10287 } 10288 c := v_0_0_0.AuxInt 10289 v_1 := v.Args[1] 10290 if v_1.Op != OpConst64 { 10291 break 10292 } 10293 d := v_1.AuxInt 10294 if !(0 <= c && c < d) { 10295 break 10296 } 10297 v.reset(OpConstBool) 10298 v.AuxInt = 1 10299 return true 10300 } 10301 // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) 10302 // cond: 0 <= c && c < d 10303 // result: (ConstBool [1]) 10304 for { 10305 _ = v.Args[1] 10306 v_0 := v.Args[0] 10307 if v_0.Op != OpZeroExt8to64 { 10308 break 10309 } 10310 v_0_0 := v_0.Args[0] 10311 if v_0_0.Op != OpAnd8 { 10312 break 10313 } 10314 _ = v_0_0.Args[1] 10315 v_0_0_1 := v_0_0.Args[1] 10316 if v_0_0_1.Op != OpConst8 { 10317 break 10318 } 10319 c := v_0_0_1.AuxInt 10320 v_1 := v.Args[1] 10321 if v_1.Op != OpConst64 { 10322 break 10323 } 10324 d := v_1.AuxInt 10325 if !(0 <= c && c < d) { 10326 break 10327 } 10328 v.reset(OpConstBool) 10329 v.AuxInt = 1 10330 return true 10331 } 10332 // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) 10333 // cond: 0 <= c && c < d 10334 // result: (ConstBool [1]) 10335 for { 10336 _ = v.Args[1] 10337 v_0 := v.Args[0] 10338 if v_0.Op != OpAnd16 { 10339 break 10340 } 10341 _ = v_0.Args[1] 10342 v_0_0 := v_0.Args[0] 10343 if v_0_0.Op != OpConst16 { 10344 break 10345 } 10346 c := v_0_0.AuxInt 10347 v_1 := v.Args[1] 10348 if v_1.Op != OpConst16 { 10349 break 10350 } 10351 d := v_1.AuxInt 10352 if !(0 <= c && c < d) { 10353 break 10354 } 10355 v.reset(OpConstBool) 10356 v.AuxInt = 1 10357 return true 10358 } 10359 // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) 10360 // cond: 0 <= c && c < d 10361 // result: (ConstBool [1]) 10362 for { 10363 _ = v.Args[1] 10364 v_0 := v.Args[0] 10365 if v_0.Op != OpAnd16 { 10366 break 10367 } 10368 _ = v_0.Args[1] 10369 v_0_1 := v_0.Args[1] 10370 if v_0_1.Op != OpConst16 { 10371 break 10372 } 10373 c := v_0_1.AuxInt 10374 v_1 := v.Args[1] 10375 if v_1.Op != OpConst16 { 10376 break 10377 } 10378 d := v_1.AuxInt 10379 if !(0 <= c && c < d) { 10380 break 10381 } 10382 v.reset(OpConstBool) 10383 v.AuxInt = 1 10384 return true 10385 } 10386 // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) 10387 // cond: 0 <= c && c < d 10388 // result: (ConstBool [1]) 10389 for { 10390 _ = v.Args[1] 10391 v_0 := v.Args[0] 10392 if v_0.Op != OpZeroExt16to32 { 10393 break 10394 } 10395 v_0_0 := v_0.Args[0] 10396 if v_0_0.Op != OpAnd16 { 10397 break 10398 } 10399 _ = v_0_0.Args[1] 10400 v_0_0_0 := v_0_0.Args[0] 10401 if v_0_0_0.Op != OpConst16 { 10402 break 10403 } 10404 c := v_0_0_0.AuxInt 10405 v_1 := v.Args[1] 10406 if v_1.Op != OpConst32 { 10407 break 10408 } 10409 d := v_1.AuxInt 10410 if !(0 <= c && c < d) { 10411 break 10412 } 10413 v.reset(OpConstBool) 10414 v.AuxInt = 1 10415 return true 10416 } 10417 // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) 10418 // cond: 0 <= c && c < d 10419 // result: (ConstBool [1]) 10420 for { 10421 _ = v.Args[1] 10422 v_0 := v.Args[0] 10423 if v_0.Op != OpZeroExt16to32 { 10424 break 10425 } 10426 v_0_0 := v_0.Args[0] 10427 if v_0_0.Op != OpAnd16 { 10428 break 10429 } 10430 _ = v_0_0.Args[1] 10431 v_0_0_1 := v_0_0.Args[1] 10432 if v_0_0_1.Op != OpConst16 { 10433 break 10434 } 10435 c := v_0_0_1.AuxInt 10436 v_1 := v.Args[1] 10437 if v_1.Op != OpConst32 { 10438 break 10439 } 10440 d := v_1.AuxInt 10441 if !(0 <= c && c < d) { 10442 break 10443 } 10444 v.reset(OpConstBool) 10445 v.AuxInt = 1 10446 return true 10447 } 10448 // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) 10449 // cond: 0 <= c && c < d 10450 // result: (ConstBool [1]) 10451 for { 10452 _ = v.Args[1] 10453 v_0 := v.Args[0] 10454 if v_0.Op != OpZeroExt16to64 { 10455 break 10456 } 10457 v_0_0 := v_0.Args[0] 10458 if v_0_0.Op != OpAnd16 { 10459 break 10460 } 10461 _ = v_0_0.Args[1] 10462 v_0_0_0 := v_0_0.Args[0] 10463 if v_0_0_0.Op != OpConst16 { 10464 break 10465 } 10466 c := v_0_0_0.AuxInt 10467 v_1 := v.Args[1] 10468 if v_1.Op != OpConst64 { 10469 break 10470 } 10471 d := v_1.AuxInt 10472 if !(0 <= c && c < d) { 10473 break 10474 } 10475 v.reset(OpConstBool) 10476 v.AuxInt = 1 10477 return true 10478 } 10479 // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) 10480 // cond: 0 <= c && c < d 10481 // result: (ConstBool [1]) 10482 for { 10483 _ = v.Args[1] 10484 v_0 := v.Args[0] 10485 if v_0.Op != OpZeroExt16to64 { 10486 break 10487 } 10488 v_0_0 := v_0.Args[0] 10489 if v_0_0.Op != OpAnd16 { 10490 break 10491 } 10492 _ = v_0_0.Args[1] 10493 v_0_0_1 := v_0_0.Args[1] 10494 if v_0_0_1.Op != OpConst16 { 10495 break 10496 } 10497 c := v_0_0_1.AuxInt 10498 v_1 := v.Args[1] 10499 if v_1.Op != OpConst64 { 10500 break 10501 } 10502 d := v_1.AuxInt 10503 if !(0 <= c && c < d) { 10504 break 10505 } 10506 v.reset(OpConstBool) 10507 v.AuxInt = 1 10508 return true 10509 } 10510 // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) 10511 // cond: 0 <= c && c < d 10512 // result: (ConstBool [1]) 10513 for { 10514 _ = v.Args[1] 10515 v_0 := v.Args[0] 10516 if v_0.Op != OpAnd32 { 10517 break 10518 } 10519 _ = v_0.Args[1] 10520 v_0_0 := v_0.Args[0] 10521 if v_0_0.Op != OpConst32 { 10522 break 10523 } 10524 c := v_0_0.AuxInt 10525 v_1 := v.Args[1] 10526 if v_1.Op != OpConst32 { 10527 break 10528 } 10529 d := v_1.AuxInt 10530 if !(0 <= c && c < d) { 10531 break 10532 } 10533 v.reset(OpConstBool) 10534 v.AuxInt = 1 10535 return true 10536 } 10537 return false 10538 } 10539 func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { 10540 // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) 10541 // cond: 0 <= c && c < d 10542 // result: (ConstBool [1]) 10543 for { 10544 _ = v.Args[1] 10545 v_0 := v.Args[0] 10546 if v_0.Op != OpAnd32 { 10547 break 10548 } 10549 _ = v_0.Args[1] 10550 v_0_1 := v_0.Args[1] 10551 if v_0_1.Op != OpConst32 { 10552 break 10553 } 10554 c := v_0_1.AuxInt 10555 v_1 := v.Args[1] 10556 if v_1.Op != OpConst32 { 10557 break 10558 } 10559 d := v_1.AuxInt 10560 if !(0 <= c && c < d) { 10561 break 10562 } 10563 v.reset(OpConstBool) 10564 v.AuxInt = 1 10565 return true 10566 } 10567 // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) 10568 // cond: 0 <= c && c < d 10569 // result: (ConstBool [1]) 10570 for { 10571 _ = v.Args[1] 10572 v_0 := v.Args[0] 10573 if v_0.Op != OpZeroExt32to64 { 10574 break 10575 } 10576 v_0_0 := v_0.Args[0] 10577 if v_0_0.Op != OpAnd32 { 10578 break 10579 } 10580 _ = v_0_0.Args[1] 10581 v_0_0_0 := v_0_0.Args[0] 10582 if v_0_0_0.Op != OpConst32 { 10583 break 10584 } 10585 c := v_0_0_0.AuxInt 10586 v_1 := v.Args[1] 10587 if v_1.Op != OpConst64 { 10588 break 10589 } 10590 d := v_1.AuxInt 10591 if !(0 <= c && c < d) { 10592 break 10593 } 10594 v.reset(OpConstBool) 10595 v.AuxInt = 1 10596 return true 10597 } 10598 // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) 10599 // cond: 0 <= c && c < d 10600 // result: (ConstBool [1]) 10601 for { 10602 _ = v.Args[1] 10603 v_0 := v.Args[0] 10604 if v_0.Op != OpZeroExt32to64 { 10605 break 10606 } 10607 v_0_0 := v_0.Args[0] 10608 if v_0_0.Op != OpAnd32 { 10609 break 10610 } 10611 _ = v_0_0.Args[1] 10612 v_0_0_1 := v_0_0.Args[1] 10613 if v_0_0_1.Op != OpConst32 { 10614 break 10615 } 10616 c := v_0_0_1.AuxInt 10617 v_1 := v.Args[1] 10618 if v_1.Op != OpConst64 { 10619 break 10620 } 10621 d := v_1.AuxInt 10622 if !(0 <= c && c < d) { 10623 break 10624 } 10625 v.reset(OpConstBool) 10626 v.AuxInt = 1 10627 return true 10628 } 10629 // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) 10630 // cond: 0 <= c && c < d 10631 // result: (ConstBool [1]) 10632 for { 10633 _ = v.Args[1] 10634 v_0 := v.Args[0] 10635 if v_0.Op != OpAnd64 { 10636 break 10637 } 10638 _ = v_0.Args[1] 10639 v_0_0 := v_0.Args[0] 10640 if v_0_0.Op != OpConst64 { 10641 break 10642 } 10643 c := v_0_0.AuxInt 10644 v_1 := v.Args[1] 10645 if v_1.Op != OpConst64 { 10646 break 10647 } 10648 d := v_1.AuxInt 10649 if !(0 <= c && c < d) { 10650 break 10651 } 10652 v.reset(OpConstBool) 10653 v.AuxInt = 1 10654 return true 10655 } 10656 // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) 10657 // cond: 0 <= c && c < d 10658 // result: (ConstBool [1]) 10659 for { 10660 _ = v.Args[1] 10661 v_0 := v.Args[0] 10662 if v_0.Op != OpAnd64 { 10663 break 10664 } 10665 _ = v_0.Args[1] 10666 v_0_1 := v_0.Args[1] 10667 if v_0_1.Op != OpConst64 { 10668 break 10669 } 10670 c := v_0_1.AuxInt 10671 v_1 := v.Args[1] 10672 if v_1.Op != OpConst64 { 10673 break 10674 } 10675 d := v_1.AuxInt 10676 if !(0 <= c && c < d) { 10677 break 10678 } 10679 v.reset(OpConstBool) 10680 v.AuxInt = 1 10681 return true 10682 } 10683 // match: (IsInBounds (Const32 [c]) (Const32 [d])) 10684 // cond: 10685 // result: (ConstBool [b2i(0 <= c && c < d)]) 10686 for { 10687 _ = v.Args[1] 10688 v_0 := v.Args[0] 10689 if v_0.Op != OpConst32 { 10690 break 10691 } 10692 c := v_0.AuxInt 10693 v_1 := v.Args[1] 10694 if v_1.Op != OpConst32 { 10695 break 10696 } 10697 d := v_1.AuxInt 10698 v.reset(OpConstBool) 10699 v.AuxInt = b2i(0 <= c && c < d) 10700 return true 10701 } 10702 // match: (IsInBounds (Const64 [c]) (Const64 [d])) 10703 // cond: 10704 // result: (ConstBool [b2i(0 <= c && c < d)]) 10705 for { 10706 _ = v.Args[1] 10707 v_0 := v.Args[0] 10708 if v_0.Op != OpConst64 { 10709 break 10710 } 10711 c := v_0.AuxInt 10712 v_1 := v.Args[1] 10713 if v_1.Op != OpConst64 { 10714 break 10715 } 10716 d := v_1.AuxInt 10717 v.reset(OpConstBool) 10718 v.AuxInt = b2i(0 <= c && c < d) 10719 return true 10720 } 10721 // match: (IsInBounds (Mod32u _ y) y) 10722 // cond: 10723 // result: (ConstBool [1]) 10724 for { 10725 _ = v.Args[1] 10726 v_0 := v.Args[0] 10727 if v_0.Op != OpMod32u { 10728 break 10729 } 10730 _ = v_0.Args[1] 10731 y := v_0.Args[1] 10732 if y != v.Args[1] { 10733 break 10734 } 10735 v.reset(OpConstBool) 10736 v.AuxInt = 1 10737 return true 10738 } 10739 // match: (IsInBounds (Mod64u _ y) y) 10740 // cond: 10741 // result: (ConstBool [1]) 10742 for { 10743 _ = v.Args[1] 10744 v_0 := v.Args[0] 10745 if v_0.Op != OpMod64u { 10746 break 10747 } 10748 _ = v_0.Args[1] 10749 y := v_0.Args[1] 10750 if y != v.Args[1] { 10751 break 10752 } 10753 v.reset(OpConstBool) 10754 v.AuxInt = 1 10755 return true 10756 } 10757 // match: (IsInBounds (ZeroExt8to64 (Rsh8Ux64 _ (Const64 [c]))) (Const64 [d])) 10758 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 10759 // result: (ConstBool [1]) 10760 for { 10761 _ = v.Args[1] 10762 v_0 := v.Args[0] 10763 if v_0.Op != OpZeroExt8to64 { 10764 break 10765 } 10766 v_0_0 := v_0.Args[0] 10767 if v_0_0.Op != OpRsh8Ux64 { 10768 break 10769 } 10770 _ = v_0_0.Args[1] 10771 v_0_0_1 := v_0_0.Args[1] 10772 if v_0_0_1.Op != OpConst64 { 10773 break 10774 } 10775 c := v_0_0_1.AuxInt 10776 v_1 := v.Args[1] 10777 if v_1.Op != OpConst64 { 10778 break 10779 } 10780 d := v_1.AuxInt 10781 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 10782 break 10783 } 10784 v.reset(OpConstBool) 10785 v.AuxInt = 1 10786 return true 10787 } 10788 return false 10789 } 10790 func rewriteValuegeneric_OpIsInBounds_30(v *Value) bool { 10791 // match: (IsInBounds (ZeroExt8to32 (Rsh8Ux64 _ (Const64 [c]))) (Const32 [d])) 10792 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 10793 // result: (ConstBool [1]) 10794 for { 10795 _ = v.Args[1] 10796 v_0 := v.Args[0] 10797 if v_0.Op != OpZeroExt8to32 { 10798 break 10799 } 10800 v_0_0 := v_0.Args[0] 10801 if v_0_0.Op != OpRsh8Ux64 { 10802 break 10803 } 10804 _ = v_0_0.Args[1] 10805 v_0_0_1 := v_0_0.Args[1] 10806 if v_0_0_1.Op != OpConst64 { 10807 break 10808 } 10809 c := v_0_0_1.AuxInt 10810 v_1 := v.Args[1] 10811 if v_1.Op != OpConst32 { 10812 break 10813 } 10814 d := v_1.AuxInt 10815 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 10816 break 10817 } 10818 v.reset(OpConstBool) 10819 v.AuxInt = 1 10820 return true 10821 } 10822 // match: (IsInBounds (ZeroExt8to16 (Rsh8Ux64 _ (Const64 [c]))) (Const16 [d])) 10823 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 10824 // result: (ConstBool [1]) 10825 for { 10826 _ = v.Args[1] 10827 v_0 := v.Args[0] 10828 if v_0.Op != OpZeroExt8to16 { 10829 break 10830 } 10831 v_0_0 := v_0.Args[0] 10832 if v_0_0.Op != OpRsh8Ux64 { 10833 break 10834 } 10835 _ = v_0_0.Args[1] 10836 v_0_0_1 := v_0_0.Args[1] 10837 if v_0_0_1.Op != OpConst64 { 10838 break 10839 } 10840 c := v_0_0_1.AuxInt 10841 v_1 := v.Args[1] 10842 if v_1.Op != OpConst16 { 10843 break 10844 } 10845 d := v_1.AuxInt 10846 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 10847 break 10848 } 10849 v.reset(OpConstBool) 10850 v.AuxInt = 1 10851 return true 10852 } 10853 // match: (IsInBounds (Rsh8Ux64 _ (Const64 [c])) (Const64 [d])) 10854 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 10855 // result: (ConstBool [1]) 10856 for { 10857 _ = v.Args[1] 10858 v_0 := v.Args[0] 10859 if v_0.Op != OpRsh8Ux64 { 10860 break 10861 } 10862 _ = v_0.Args[1] 10863 v_0_1 := v_0.Args[1] 10864 if v_0_1.Op != OpConst64 { 10865 break 10866 } 10867 c := v_0_1.AuxInt 10868 v_1 := v.Args[1] 10869 if v_1.Op != OpConst64 { 10870 break 10871 } 10872 d := v_1.AuxInt 10873 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 10874 break 10875 } 10876 v.reset(OpConstBool) 10877 v.AuxInt = 1 10878 return true 10879 } 10880 // match: (IsInBounds (ZeroExt16to64 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 10881 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 10882 // result: (ConstBool [1]) 10883 for { 10884 _ = v.Args[1] 10885 v_0 := v.Args[0] 10886 if v_0.Op != OpZeroExt16to64 { 10887 break 10888 } 10889 v_0_0 := v_0.Args[0] 10890 if v_0_0.Op != OpRsh16Ux64 { 10891 break 10892 } 10893 _ = v_0_0.Args[1] 10894 v_0_0_1 := v_0_0.Args[1] 10895 if v_0_0_1.Op != OpConst64 { 10896 break 10897 } 10898 c := v_0_0_1.AuxInt 10899 v_1 := v.Args[1] 10900 if v_1.Op != OpConst64 { 10901 break 10902 } 10903 d := v_1.AuxInt 10904 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 10905 break 10906 } 10907 v.reset(OpConstBool) 10908 v.AuxInt = 1 10909 return true 10910 } 10911 // match: (IsInBounds (ZeroExt16to32 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 10912 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 10913 // result: (ConstBool [1]) 10914 for { 10915 _ = v.Args[1] 10916 v_0 := v.Args[0] 10917 if v_0.Op != OpZeroExt16to32 { 10918 break 10919 } 10920 v_0_0 := v_0.Args[0] 10921 if v_0_0.Op != OpRsh16Ux64 { 10922 break 10923 } 10924 _ = v_0_0.Args[1] 10925 v_0_0_1 := v_0_0.Args[1] 10926 if v_0_0_1.Op != OpConst64 { 10927 break 10928 } 10929 c := v_0_0_1.AuxInt 10930 v_1 := v.Args[1] 10931 if v_1.Op != OpConst64 { 10932 break 10933 } 10934 d := v_1.AuxInt 10935 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 10936 break 10937 } 10938 v.reset(OpConstBool) 10939 v.AuxInt = 1 10940 return true 10941 } 10942 // match: (IsInBounds (Rsh16Ux64 _ (Const64 [c])) (Const64 [d])) 10943 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 10944 // result: (ConstBool [1]) 10945 for { 10946 _ = v.Args[1] 10947 v_0 := v.Args[0] 10948 if v_0.Op != OpRsh16Ux64 { 10949 break 10950 } 10951 _ = v_0.Args[1] 10952 v_0_1 := v_0.Args[1] 10953 if v_0_1.Op != OpConst64 { 10954 break 10955 } 10956 c := v_0_1.AuxInt 10957 v_1 := v.Args[1] 10958 if v_1.Op != OpConst64 { 10959 break 10960 } 10961 d := v_1.AuxInt 10962 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 10963 break 10964 } 10965 v.reset(OpConstBool) 10966 v.AuxInt = 1 10967 return true 10968 } 10969 // match: (IsInBounds (ZeroExt32to64 (Rsh32Ux64 _ (Const64 [c]))) (Const64 [d])) 10970 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 10971 // result: (ConstBool [1]) 10972 for { 10973 _ = v.Args[1] 10974 v_0 := v.Args[0] 10975 if v_0.Op != OpZeroExt32to64 { 10976 break 10977 } 10978 v_0_0 := v_0.Args[0] 10979 if v_0_0.Op != OpRsh32Ux64 { 10980 break 10981 } 10982 _ = v_0_0.Args[1] 10983 v_0_0_1 := v_0_0.Args[1] 10984 if v_0_0_1.Op != OpConst64 { 10985 break 10986 } 10987 c := v_0_0_1.AuxInt 10988 v_1 := v.Args[1] 10989 if v_1.Op != OpConst64 { 10990 break 10991 } 10992 d := v_1.AuxInt 10993 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 10994 break 10995 } 10996 v.reset(OpConstBool) 10997 v.AuxInt = 1 10998 return true 10999 } 11000 // match: (IsInBounds (Rsh32Ux64 _ (Const64 [c])) (Const64 [d])) 11001 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 11002 // result: (ConstBool [1]) 11003 for { 11004 _ = v.Args[1] 11005 v_0 := v.Args[0] 11006 if v_0.Op != OpRsh32Ux64 { 11007 break 11008 } 11009 _ = v_0.Args[1] 11010 v_0_1 := v_0.Args[1] 11011 if v_0_1.Op != OpConst64 { 11012 break 11013 } 11014 c := v_0_1.AuxInt 11015 v_1 := v.Args[1] 11016 if v_1.Op != OpConst64 { 11017 break 11018 } 11019 d := v_1.AuxInt 11020 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 11021 break 11022 } 11023 v.reset(OpConstBool) 11024 v.AuxInt = 1 11025 return true 11026 } 11027 // match: (IsInBounds (Rsh64Ux64 _ (Const64 [c])) (Const64 [d])) 11028 // cond: 0 < c && c < 64 && 1<<uint(64-c)-1 < d 11029 // result: (ConstBool [1]) 11030 for { 11031 _ = v.Args[1] 11032 v_0 := v.Args[0] 11033 if v_0.Op != OpRsh64Ux64 { 11034 break 11035 } 11036 _ = v_0.Args[1] 11037 v_0_1 := v_0.Args[1] 11038 if v_0_1.Op != OpConst64 { 11039 break 11040 } 11041 c := v_0_1.AuxInt 11042 v_1 := v.Args[1] 11043 if v_1.Op != OpConst64 { 11044 break 11045 } 11046 d := v_1.AuxInt 11047 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) { 11048 break 11049 } 11050 v.reset(OpConstBool) 11051 v.AuxInt = 1 11052 return true 11053 } 11054 return false 11055 } 11056 func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { 11057 // match: (IsNonNil (ConstNil)) 11058 // cond: 11059 // result: (ConstBool [0]) 11060 for { 11061 v_0 := v.Args[0] 11062 if v_0.Op != OpConstNil { 11063 break 11064 } 11065 v.reset(OpConstBool) 11066 v.AuxInt = 0 11067 return true 11068 } 11069 return false 11070 } 11071 func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { 11072 // match: (IsSliceInBounds x x) 11073 // cond: 11074 // result: (ConstBool [1]) 11075 for { 11076 _ = v.Args[1] 11077 x := v.Args[0] 11078 if x != v.Args[1] { 11079 break 11080 } 11081 v.reset(OpConstBool) 11082 v.AuxInt = 1 11083 return true 11084 } 11085 // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) 11086 // cond: 0 <= c && c <= d 11087 // result: (ConstBool [1]) 11088 for { 11089 _ = v.Args[1] 11090 v_0 := v.Args[0] 11091 if v_0.Op != OpAnd32 { 11092 break 11093 } 11094 _ = v_0.Args[1] 11095 v_0_0 := v_0.Args[0] 11096 if v_0_0.Op != OpConst32 { 11097 break 11098 } 11099 c := v_0_0.AuxInt 11100 v_1 := v.Args[1] 11101 if v_1.Op != OpConst32 { 11102 break 11103 } 11104 d := v_1.AuxInt 11105 if !(0 <= c && c <= d) { 11106 break 11107 } 11108 v.reset(OpConstBool) 11109 v.AuxInt = 1 11110 return true 11111 } 11112 // match: (IsSliceInBounds (And32 _ (Const32 [c])) (Const32 [d])) 11113 // cond: 0 <= c && c <= d 11114 // result: (ConstBool [1]) 11115 for { 11116 _ = v.Args[1] 11117 v_0 := v.Args[0] 11118 if v_0.Op != OpAnd32 { 11119 break 11120 } 11121 _ = v_0.Args[1] 11122 v_0_1 := v_0.Args[1] 11123 if v_0_1.Op != OpConst32 { 11124 break 11125 } 11126 c := v_0_1.AuxInt 11127 v_1 := v.Args[1] 11128 if v_1.Op != OpConst32 { 11129 break 11130 } 11131 d := v_1.AuxInt 11132 if !(0 <= c && c <= d) { 11133 break 11134 } 11135 v.reset(OpConstBool) 11136 v.AuxInt = 1 11137 return true 11138 } 11139 // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) 11140 // cond: 0 <= c && c <= d 11141 // result: (ConstBool [1]) 11142 for { 11143 _ = v.Args[1] 11144 v_0 := v.Args[0] 11145 if v_0.Op != OpAnd64 { 11146 break 11147 } 11148 _ = v_0.Args[1] 11149 v_0_0 := v_0.Args[0] 11150 if v_0_0.Op != OpConst64 { 11151 break 11152 } 11153 c := v_0_0.AuxInt 11154 v_1 := v.Args[1] 11155 if v_1.Op != OpConst64 { 11156 break 11157 } 11158 d := v_1.AuxInt 11159 if !(0 <= c && c <= d) { 11160 break 11161 } 11162 v.reset(OpConstBool) 11163 v.AuxInt = 1 11164 return true 11165 } 11166 // match: (IsSliceInBounds (And64 _ (Const64 [c])) (Const64 [d])) 11167 // cond: 0 <= c && c <= d 11168 // result: (ConstBool [1]) 11169 for { 11170 _ = v.Args[1] 11171 v_0 := v.Args[0] 11172 if v_0.Op != OpAnd64 { 11173 break 11174 } 11175 _ = v_0.Args[1] 11176 v_0_1 := v_0.Args[1] 11177 if v_0_1.Op != OpConst64 { 11178 break 11179 } 11180 c := v_0_1.AuxInt 11181 v_1 := v.Args[1] 11182 if v_1.Op != OpConst64 { 11183 break 11184 } 11185 d := v_1.AuxInt 11186 if !(0 <= c && c <= d) { 11187 break 11188 } 11189 v.reset(OpConstBool) 11190 v.AuxInt = 1 11191 return true 11192 } 11193 // match: (IsSliceInBounds (Const32 [0]) _) 11194 // cond: 11195 // result: (ConstBool [1]) 11196 for { 11197 _ = v.Args[1] 11198 v_0 := v.Args[0] 11199 if v_0.Op != OpConst32 { 11200 break 11201 } 11202 if v_0.AuxInt != 0 { 11203 break 11204 } 11205 v.reset(OpConstBool) 11206 v.AuxInt = 1 11207 return true 11208 } 11209 // match: (IsSliceInBounds (Const64 [0]) _) 11210 // cond: 11211 // result: (ConstBool [1]) 11212 for { 11213 _ = v.Args[1] 11214 v_0 := v.Args[0] 11215 if v_0.Op != OpConst64 { 11216 break 11217 } 11218 if v_0.AuxInt != 0 { 11219 break 11220 } 11221 v.reset(OpConstBool) 11222 v.AuxInt = 1 11223 return true 11224 } 11225 // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) 11226 // cond: 11227 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11228 for { 11229 _ = v.Args[1] 11230 v_0 := v.Args[0] 11231 if v_0.Op != OpConst32 { 11232 break 11233 } 11234 c := v_0.AuxInt 11235 v_1 := v.Args[1] 11236 if v_1.Op != OpConst32 { 11237 break 11238 } 11239 d := v_1.AuxInt 11240 v.reset(OpConstBool) 11241 v.AuxInt = b2i(0 <= c && c <= d) 11242 return true 11243 } 11244 // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) 11245 // cond: 11246 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11247 for { 11248 _ = v.Args[1] 11249 v_0 := v.Args[0] 11250 if v_0.Op != OpConst64 { 11251 break 11252 } 11253 c := v_0.AuxInt 11254 v_1 := v.Args[1] 11255 if v_1.Op != OpConst64 { 11256 break 11257 } 11258 d := v_1.AuxInt 11259 v.reset(OpConstBool) 11260 v.AuxInt = b2i(0 <= c && c <= d) 11261 return true 11262 } 11263 // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) 11264 // cond: 11265 // result: (ConstBool [1]) 11266 for { 11267 _ = v.Args[1] 11268 v_0 := v.Args[0] 11269 if v_0.Op != OpSliceLen { 11270 break 11271 } 11272 x := v_0.Args[0] 11273 v_1 := v.Args[1] 11274 if v_1.Op != OpSliceCap { 11275 break 11276 } 11277 if x != v_1.Args[0] { 11278 break 11279 } 11280 v.reset(OpConstBool) 11281 v.AuxInt = 1 11282 return true 11283 } 11284 return false 11285 } 11286 func rewriteValuegeneric_OpLeq16_0(v *Value) bool { 11287 // match: (Leq16 (Const16 [c]) (Const16 [d])) 11288 // cond: 11289 // result: (ConstBool [b2i(c <= d)]) 11290 for { 11291 _ = v.Args[1] 11292 v_0 := v.Args[0] 11293 if v_0.Op != OpConst16 { 11294 break 11295 } 11296 c := v_0.AuxInt 11297 v_1 := v.Args[1] 11298 if v_1.Op != OpConst16 { 11299 break 11300 } 11301 d := v_1.AuxInt 11302 v.reset(OpConstBool) 11303 v.AuxInt = b2i(c <= d) 11304 return true 11305 } 11306 return false 11307 } 11308 func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { 11309 // match: (Leq16U (Const16 [c]) (Const16 [d])) 11310 // cond: 11311 // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) 11312 for { 11313 _ = v.Args[1] 11314 v_0 := v.Args[0] 11315 if v_0.Op != OpConst16 { 11316 break 11317 } 11318 c := v_0.AuxInt 11319 v_1 := v.Args[1] 11320 if v_1.Op != OpConst16 { 11321 break 11322 } 11323 d := v_1.AuxInt 11324 v.reset(OpConstBool) 11325 v.AuxInt = b2i(uint16(c) <= uint16(d)) 11326 return true 11327 } 11328 return false 11329 } 11330 func rewriteValuegeneric_OpLeq32_0(v *Value) bool { 11331 // match: (Leq32 (Const32 [c]) (Const32 [d])) 11332 // cond: 11333 // result: (ConstBool [b2i(c <= d)]) 11334 for { 11335 _ = v.Args[1] 11336 v_0 := v.Args[0] 11337 if v_0.Op != OpConst32 { 11338 break 11339 } 11340 c := v_0.AuxInt 11341 v_1 := v.Args[1] 11342 if v_1.Op != OpConst32 { 11343 break 11344 } 11345 d := v_1.AuxInt 11346 v.reset(OpConstBool) 11347 v.AuxInt = b2i(c <= d) 11348 return true 11349 } 11350 return false 11351 } 11352 func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { 11353 // match: (Leq32U (Const32 [c]) (Const32 [d])) 11354 // cond: 11355 // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) 11356 for { 11357 _ = v.Args[1] 11358 v_0 := v.Args[0] 11359 if v_0.Op != OpConst32 { 11360 break 11361 } 11362 c := v_0.AuxInt 11363 v_1 := v.Args[1] 11364 if v_1.Op != OpConst32 { 11365 break 11366 } 11367 d := v_1.AuxInt 11368 v.reset(OpConstBool) 11369 v.AuxInt = b2i(uint32(c) <= uint32(d)) 11370 return true 11371 } 11372 return false 11373 } 11374 func rewriteValuegeneric_OpLeq64_0(v *Value) bool { 11375 // match: (Leq64 (Const64 [c]) (Const64 [d])) 11376 // cond: 11377 // result: (ConstBool [b2i(c <= d)]) 11378 for { 11379 _ = v.Args[1] 11380 v_0 := v.Args[0] 11381 if v_0.Op != OpConst64 { 11382 break 11383 } 11384 c := v_0.AuxInt 11385 v_1 := v.Args[1] 11386 if v_1.Op != OpConst64 { 11387 break 11388 } 11389 d := v_1.AuxInt 11390 v.reset(OpConstBool) 11391 v.AuxInt = b2i(c <= d) 11392 return true 11393 } 11394 return false 11395 } 11396 func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { 11397 // match: (Leq64U (Const64 [c]) (Const64 [d])) 11398 // cond: 11399 // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) 11400 for { 11401 _ = v.Args[1] 11402 v_0 := v.Args[0] 11403 if v_0.Op != OpConst64 { 11404 break 11405 } 11406 c := v_0.AuxInt 11407 v_1 := v.Args[1] 11408 if v_1.Op != OpConst64 { 11409 break 11410 } 11411 d := v_1.AuxInt 11412 v.reset(OpConstBool) 11413 v.AuxInt = b2i(uint64(c) <= uint64(d)) 11414 return true 11415 } 11416 return false 11417 } 11418 func rewriteValuegeneric_OpLeq8_0(v *Value) bool { 11419 // match: (Leq8 (Const8 [c]) (Const8 [d])) 11420 // cond: 11421 // result: (ConstBool [b2i(c <= d)]) 11422 for { 11423 _ = v.Args[1] 11424 v_0 := v.Args[0] 11425 if v_0.Op != OpConst8 { 11426 break 11427 } 11428 c := v_0.AuxInt 11429 v_1 := v.Args[1] 11430 if v_1.Op != OpConst8 { 11431 break 11432 } 11433 d := v_1.AuxInt 11434 v.reset(OpConstBool) 11435 v.AuxInt = b2i(c <= d) 11436 return true 11437 } 11438 return false 11439 } 11440 func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { 11441 // match: (Leq8U (Const8 [c]) (Const8 [d])) 11442 // cond: 11443 // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) 11444 for { 11445 _ = v.Args[1] 11446 v_0 := v.Args[0] 11447 if v_0.Op != OpConst8 { 11448 break 11449 } 11450 c := v_0.AuxInt 11451 v_1 := v.Args[1] 11452 if v_1.Op != OpConst8 { 11453 break 11454 } 11455 d := v_1.AuxInt 11456 v.reset(OpConstBool) 11457 v.AuxInt = b2i(uint8(c) <= uint8(d)) 11458 return true 11459 } 11460 return false 11461 } 11462 func rewriteValuegeneric_OpLess16_0(v *Value) bool { 11463 // match: (Less16 (Const16 [c]) (Const16 [d])) 11464 // cond: 11465 // result: (ConstBool [b2i(c < d)]) 11466 for { 11467 _ = v.Args[1] 11468 v_0 := v.Args[0] 11469 if v_0.Op != OpConst16 { 11470 break 11471 } 11472 c := v_0.AuxInt 11473 v_1 := v.Args[1] 11474 if v_1.Op != OpConst16 { 11475 break 11476 } 11477 d := v_1.AuxInt 11478 v.reset(OpConstBool) 11479 v.AuxInt = b2i(c < d) 11480 return true 11481 } 11482 return false 11483 } 11484 func rewriteValuegeneric_OpLess16U_0(v *Value) bool { 11485 // match: (Less16U (Const16 [c]) (Const16 [d])) 11486 // cond: 11487 // result: (ConstBool [b2i(uint16(c) < uint16(d))]) 11488 for { 11489 _ = v.Args[1] 11490 v_0 := v.Args[0] 11491 if v_0.Op != OpConst16 { 11492 break 11493 } 11494 c := v_0.AuxInt 11495 v_1 := v.Args[1] 11496 if v_1.Op != OpConst16 { 11497 break 11498 } 11499 d := v_1.AuxInt 11500 v.reset(OpConstBool) 11501 v.AuxInt = b2i(uint16(c) < uint16(d)) 11502 return true 11503 } 11504 return false 11505 } 11506 func rewriteValuegeneric_OpLess32_0(v *Value) bool { 11507 // match: (Less32 (Const32 [c]) (Const32 [d])) 11508 // cond: 11509 // result: (ConstBool [b2i(c < d)]) 11510 for { 11511 _ = v.Args[1] 11512 v_0 := v.Args[0] 11513 if v_0.Op != OpConst32 { 11514 break 11515 } 11516 c := v_0.AuxInt 11517 v_1 := v.Args[1] 11518 if v_1.Op != OpConst32 { 11519 break 11520 } 11521 d := v_1.AuxInt 11522 v.reset(OpConstBool) 11523 v.AuxInt = b2i(c < d) 11524 return true 11525 } 11526 return false 11527 } 11528 func rewriteValuegeneric_OpLess32U_0(v *Value) bool { 11529 // match: (Less32U (Const32 [c]) (Const32 [d])) 11530 // cond: 11531 // result: (ConstBool [b2i(uint32(c) < uint32(d))]) 11532 for { 11533 _ = v.Args[1] 11534 v_0 := v.Args[0] 11535 if v_0.Op != OpConst32 { 11536 break 11537 } 11538 c := v_0.AuxInt 11539 v_1 := v.Args[1] 11540 if v_1.Op != OpConst32 { 11541 break 11542 } 11543 d := v_1.AuxInt 11544 v.reset(OpConstBool) 11545 v.AuxInt = b2i(uint32(c) < uint32(d)) 11546 return true 11547 } 11548 return false 11549 } 11550 func rewriteValuegeneric_OpLess64_0(v *Value) bool { 11551 // match: (Less64 (Const64 [c]) (Const64 [d])) 11552 // cond: 11553 // result: (ConstBool [b2i(c < d)]) 11554 for { 11555 _ = v.Args[1] 11556 v_0 := v.Args[0] 11557 if v_0.Op != OpConst64 { 11558 break 11559 } 11560 c := v_0.AuxInt 11561 v_1 := v.Args[1] 11562 if v_1.Op != OpConst64 { 11563 break 11564 } 11565 d := v_1.AuxInt 11566 v.reset(OpConstBool) 11567 v.AuxInt = b2i(c < d) 11568 return true 11569 } 11570 return false 11571 } 11572 func rewriteValuegeneric_OpLess64U_0(v *Value) bool { 11573 // match: (Less64U (Const64 [c]) (Const64 [d])) 11574 // cond: 11575 // result: (ConstBool [b2i(uint64(c) < uint64(d))]) 11576 for { 11577 _ = v.Args[1] 11578 v_0 := v.Args[0] 11579 if v_0.Op != OpConst64 { 11580 break 11581 } 11582 c := v_0.AuxInt 11583 v_1 := v.Args[1] 11584 if v_1.Op != OpConst64 { 11585 break 11586 } 11587 d := v_1.AuxInt 11588 v.reset(OpConstBool) 11589 v.AuxInt = b2i(uint64(c) < uint64(d)) 11590 return true 11591 } 11592 return false 11593 } 11594 func rewriteValuegeneric_OpLess8_0(v *Value) bool { 11595 // match: (Less8 (Const8 [c]) (Const8 [d])) 11596 // cond: 11597 // result: (ConstBool [b2i(c < d)]) 11598 for { 11599 _ = v.Args[1] 11600 v_0 := v.Args[0] 11601 if v_0.Op != OpConst8 { 11602 break 11603 } 11604 c := v_0.AuxInt 11605 v_1 := v.Args[1] 11606 if v_1.Op != OpConst8 { 11607 break 11608 } 11609 d := v_1.AuxInt 11610 v.reset(OpConstBool) 11611 v.AuxInt = b2i(c < d) 11612 return true 11613 } 11614 return false 11615 } 11616 func rewriteValuegeneric_OpLess8U_0(v *Value) bool { 11617 // match: (Less8U (Const8 [c]) (Const8 [d])) 11618 // cond: 11619 // result: (ConstBool [b2i(uint8(c) < uint8(d))]) 11620 for { 11621 _ = v.Args[1] 11622 v_0 := v.Args[0] 11623 if v_0.Op != OpConst8 { 11624 break 11625 } 11626 c := v_0.AuxInt 11627 v_1 := v.Args[1] 11628 if v_1.Op != OpConst8 { 11629 break 11630 } 11631 d := v_1.AuxInt 11632 v.reset(OpConstBool) 11633 v.AuxInt = b2i(uint8(c) < uint8(d)) 11634 return true 11635 } 11636 return false 11637 } 11638 func rewriteValuegeneric_OpLoad_0(v *Value) bool { 11639 b := v.Block 11640 _ = b 11641 fe := b.Func.fe 11642 _ = fe 11643 // match: (Load <t1> p1 (Store {t2} p2 x _)) 11644 // cond: isSamePtr(p1,p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size() 11645 // result: x 11646 for { 11647 t1 := v.Type 11648 _ = v.Args[1] 11649 p1 := v.Args[0] 11650 v_1 := v.Args[1] 11651 if v_1.Op != OpStore { 11652 break 11653 } 11654 t2 := v_1.Aux 11655 _ = v_1.Args[2] 11656 p2 := v_1.Args[0] 11657 x := v_1.Args[1] 11658 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size()) { 11659 break 11660 } 11661 v.reset(OpCopy) 11662 v.Type = x.Type 11663 v.AddArg(x) 11664 return true 11665 } 11666 // match: (Load <t> _ _) 11667 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 11668 // result: (StructMake0) 11669 for { 11670 t := v.Type 11671 _ = v.Args[1] 11672 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 11673 break 11674 } 11675 v.reset(OpStructMake0) 11676 return true 11677 } 11678 // match: (Load <t> ptr mem) 11679 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 11680 // result: (StructMake1 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem)) 11681 for { 11682 t := v.Type 11683 _ = v.Args[1] 11684 ptr := v.Args[0] 11685 mem := v.Args[1] 11686 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 11687 break 11688 } 11689 v.reset(OpStructMake1) 11690 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 11691 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 11692 v1.AuxInt = 0 11693 v1.AddArg(ptr) 11694 v0.AddArg(v1) 11695 v0.AddArg(mem) 11696 v.AddArg(v0) 11697 return true 11698 } 11699 // match: (Load <t> ptr mem) 11700 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 11701 // 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)) 11702 for { 11703 t := v.Type 11704 _ = v.Args[1] 11705 ptr := v.Args[0] 11706 mem := v.Args[1] 11707 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 11708 break 11709 } 11710 v.reset(OpStructMake2) 11711 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 11712 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 11713 v1.AuxInt = 0 11714 v1.AddArg(ptr) 11715 v0.AddArg(v1) 11716 v0.AddArg(mem) 11717 v.AddArg(v0) 11718 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 11719 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 11720 v3.AuxInt = t.FieldOff(1) 11721 v3.AddArg(ptr) 11722 v2.AddArg(v3) 11723 v2.AddArg(mem) 11724 v.AddArg(v2) 11725 return true 11726 } 11727 // match: (Load <t> ptr mem) 11728 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 11729 // 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)) 11730 for { 11731 t := v.Type 11732 _ = v.Args[1] 11733 ptr := v.Args[0] 11734 mem := v.Args[1] 11735 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 11736 break 11737 } 11738 v.reset(OpStructMake3) 11739 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 11740 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 11741 v1.AuxInt = 0 11742 v1.AddArg(ptr) 11743 v0.AddArg(v1) 11744 v0.AddArg(mem) 11745 v.AddArg(v0) 11746 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 11747 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 11748 v3.AuxInt = t.FieldOff(1) 11749 v3.AddArg(ptr) 11750 v2.AddArg(v3) 11751 v2.AddArg(mem) 11752 v.AddArg(v2) 11753 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 11754 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 11755 v5.AuxInt = t.FieldOff(2) 11756 v5.AddArg(ptr) 11757 v4.AddArg(v5) 11758 v4.AddArg(mem) 11759 v.AddArg(v4) 11760 return true 11761 } 11762 // match: (Load <t> ptr mem) 11763 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 11764 // 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)) 11765 for { 11766 t := v.Type 11767 _ = v.Args[1] 11768 ptr := v.Args[0] 11769 mem := v.Args[1] 11770 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 11771 break 11772 } 11773 v.reset(OpStructMake4) 11774 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 11775 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 11776 v1.AuxInt = 0 11777 v1.AddArg(ptr) 11778 v0.AddArg(v1) 11779 v0.AddArg(mem) 11780 v.AddArg(v0) 11781 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 11782 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 11783 v3.AuxInt = t.FieldOff(1) 11784 v3.AddArg(ptr) 11785 v2.AddArg(v3) 11786 v2.AddArg(mem) 11787 v.AddArg(v2) 11788 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 11789 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 11790 v5.AuxInt = t.FieldOff(2) 11791 v5.AddArg(ptr) 11792 v4.AddArg(v5) 11793 v4.AddArg(mem) 11794 v.AddArg(v4) 11795 v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) 11796 v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 11797 v7.AuxInt = t.FieldOff(3) 11798 v7.AddArg(ptr) 11799 v6.AddArg(v7) 11800 v6.AddArg(mem) 11801 v.AddArg(v6) 11802 return true 11803 } 11804 // match: (Load <t> _ _) 11805 // cond: t.IsArray() && t.NumElem() == 0 11806 // result: (ArrayMake0) 11807 for { 11808 t := v.Type 11809 _ = v.Args[1] 11810 if !(t.IsArray() && t.NumElem() == 0) { 11811 break 11812 } 11813 v.reset(OpArrayMake0) 11814 return true 11815 } 11816 // match: (Load <t> ptr mem) 11817 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 11818 // result: (ArrayMake1 (Load <t.ElemType()> ptr mem)) 11819 for { 11820 t := v.Type 11821 _ = v.Args[1] 11822 ptr := v.Args[0] 11823 mem := v.Args[1] 11824 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 11825 break 11826 } 11827 v.reset(OpArrayMake1) 11828 v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType()) 11829 v0.AddArg(ptr) 11830 v0.AddArg(mem) 11831 v.AddArg(v0) 11832 return true 11833 } 11834 return false 11835 } 11836 func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { 11837 b := v.Block 11838 _ = b 11839 // match: (Lsh16x16 <t> x (Const16 [c])) 11840 // cond: 11841 // result: (Lsh16x64 x (Const64 <t> [int64(uint16(c))])) 11842 for { 11843 t := v.Type 11844 _ = v.Args[1] 11845 x := v.Args[0] 11846 v_1 := v.Args[1] 11847 if v_1.Op != OpConst16 { 11848 break 11849 } 11850 c := v_1.AuxInt 11851 v.reset(OpLsh16x64) 11852 v.AddArg(x) 11853 v0 := b.NewValue0(v.Pos, OpConst64, t) 11854 v0.AuxInt = int64(uint16(c)) 11855 v.AddArg(v0) 11856 return true 11857 } 11858 // match: (Lsh16x16 (Const16 [0]) _) 11859 // cond: 11860 // result: (Const16 [0]) 11861 for { 11862 _ = v.Args[1] 11863 v_0 := v.Args[0] 11864 if v_0.Op != OpConst16 { 11865 break 11866 } 11867 if v_0.AuxInt != 0 { 11868 break 11869 } 11870 v.reset(OpConst16) 11871 v.AuxInt = 0 11872 return true 11873 } 11874 return false 11875 } 11876 func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { 11877 b := v.Block 11878 _ = b 11879 // match: (Lsh16x32 <t> x (Const32 [c])) 11880 // cond: 11881 // result: (Lsh16x64 x (Const64 <t> [int64(uint32(c))])) 11882 for { 11883 t := v.Type 11884 _ = v.Args[1] 11885 x := v.Args[0] 11886 v_1 := v.Args[1] 11887 if v_1.Op != OpConst32 { 11888 break 11889 } 11890 c := v_1.AuxInt 11891 v.reset(OpLsh16x64) 11892 v.AddArg(x) 11893 v0 := b.NewValue0(v.Pos, OpConst64, t) 11894 v0.AuxInt = int64(uint32(c)) 11895 v.AddArg(v0) 11896 return true 11897 } 11898 // match: (Lsh16x32 (Const16 [0]) _) 11899 // cond: 11900 // result: (Const16 [0]) 11901 for { 11902 _ = v.Args[1] 11903 v_0 := v.Args[0] 11904 if v_0.Op != OpConst16 { 11905 break 11906 } 11907 if v_0.AuxInt != 0 { 11908 break 11909 } 11910 v.reset(OpConst16) 11911 v.AuxInt = 0 11912 return true 11913 } 11914 return false 11915 } 11916 func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { 11917 b := v.Block 11918 _ = b 11919 typ := &b.Func.Config.Types 11920 _ = typ 11921 // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) 11922 // cond: 11923 // result: (Const16 [int64(int16(c) << uint64(d))]) 11924 for { 11925 _ = v.Args[1] 11926 v_0 := v.Args[0] 11927 if v_0.Op != OpConst16 { 11928 break 11929 } 11930 c := v_0.AuxInt 11931 v_1 := v.Args[1] 11932 if v_1.Op != OpConst64 { 11933 break 11934 } 11935 d := v_1.AuxInt 11936 v.reset(OpConst16) 11937 v.AuxInt = int64(int16(c) << uint64(d)) 11938 return true 11939 } 11940 // match: (Lsh16x64 x (Const64 [0])) 11941 // cond: 11942 // result: x 11943 for { 11944 _ = v.Args[1] 11945 x := v.Args[0] 11946 v_1 := v.Args[1] 11947 if v_1.Op != OpConst64 { 11948 break 11949 } 11950 if v_1.AuxInt != 0 { 11951 break 11952 } 11953 v.reset(OpCopy) 11954 v.Type = x.Type 11955 v.AddArg(x) 11956 return true 11957 } 11958 // match: (Lsh16x64 (Const16 [0]) _) 11959 // cond: 11960 // result: (Const16 [0]) 11961 for { 11962 _ = v.Args[1] 11963 v_0 := v.Args[0] 11964 if v_0.Op != OpConst16 { 11965 break 11966 } 11967 if v_0.AuxInt != 0 { 11968 break 11969 } 11970 v.reset(OpConst16) 11971 v.AuxInt = 0 11972 return true 11973 } 11974 // match: (Lsh16x64 _ (Const64 [c])) 11975 // cond: uint64(c) >= 16 11976 // result: (Const16 [0]) 11977 for { 11978 _ = v.Args[1] 11979 v_1 := v.Args[1] 11980 if v_1.Op != OpConst64 { 11981 break 11982 } 11983 c := v_1.AuxInt 11984 if !(uint64(c) >= 16) { 11985 break 11986 } 11987 v.reset(OpConst16) 11988 v.AuxInt = 0 11989 return true 11990 } 11991 // match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d])) 11992 // cond: !uaddOvf(c,d) 11993 // result: (Lsh16x64 x (Const64 <t> [c+d])) 11994 for { 11995 t := v.Type 11996 _ = v.Args[1] 11997 v_0 := v.Args[0] 11998 if v_0.Op != OpLsh16x64 { 11999 break 12000 } 12001 _ = v_0.Args[1] 12002 x := v_0.Args[0] 12003 v_0_1 := v_0.Args[1] 12004 if v_0_1.Op != OpConst64 { 12005 break 12006 } 12007 c := v_0_1.AuxInt 12008 v_1 := v.Args[1] 12009 if v_1.Op != OpConst64 { 12010 break 12011 } 12012 d := v_1.AuxInt 12013 if !(!uaddOvf(c, d)) { 12014 break 12015 } 12016 v.reset(OpLsh16x64) 12017 v.AddArg(x) 12018 v0 := b.NewValue0(v.Pos, OpConst64, t) 12019 v0.AuxInt = c + d 12020 v.AddArg(v0) 12021 return true 12022 } 12023 // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12024 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12025 // result: (Lsh16x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12026 for { 12027 _ = v.Args[1] 12028 v_0 := v.Args[0] 12029 if v_0.Op != OpRsh16Ux64 { 12030 break 12031 } 12032 _ = v_0.Args[1] 12033 v_0_0 := v_0.Args[0] 12034 if v_0_0.Op != OpLsh16x64 { 12035 break 12036 } 12037 _ = v_0_0.Args[1] 12038 x := v_0_0.Args[0] 12039 v_0_0_1 := v_0_0.Args[1] 12040 if v_0_0_1.Op != OpConst64 { 12041 break 12042 } 12043 c1 := v_0_0_1.AuxInt 12044 v_0_1 := v_0.Args[1] 12045 if v_0_1.Op != OpConst64 { 12046 break 12047 } 12048 c2 := v_0_1.AuxInt 12049 v_1 := v.Args[1] 12050 if v_1.Op != OpConst64 { 12051 break 12052 } 12053 c3 := v_1.AuxInt 12054 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12055 break 12056 } 12057 v.reset(OpLsh16x64) 12058 v.AddArg(x) 12059 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12060 v0.AuxInt = c1 - c2 + c3 12061 v.AddArg(v0) 12062 return true 12063 } 12064 return false 12065 } 12066 func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { 12067 b := v.Block 12068 _ = b 12069 // match: (Lsh16x8 <t> x (Const8 [c])) 12070 // cond: 12071 // result: (Lsh16x64 x (Const64 <t> [int64(uint8(c))])) 12072 for { 12073 t := v.Type 12074 _ = v.Args[1] 12075 x := v.Args[0] 12076 v_1 := v.Args[1] 12077 if v_1.Op != OpConst8 { 12078 break 12079 } 12080 c := v_1.AuxInt 12081 v.reset(OpLsh16x64) 12082 v.AddArg(x) 12083 v0 := b.NewValue0(v.Pos, OpConst64, t) 12084 v0.AuxInt = int64(uint8(c)) 12085 v.AddArg(v0) 12086 return true 12087 } 12088 // match: (Lsh16x8 (Const16 [0]) _) 12089 // cond: 12090 // result: (Const16 [0]) 12091 for { 12092 _ = v.Args[1] 12093 v_0 := v.Args[0] 12094 if v_0.Op != OpConst16 { 12095 break 12096 } 12097 if v_0.AuxInt != 0 { 12098 break 12099 } 12100 v.reset(OpConst16) 12101 v.AuxInt = 0 12102 return true 12103 } 12104 return false 12105 } 12106 func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { 12107 b := v.Block 12108 _ = b 12109 // match: (Lsh32x16 <t> x (Const16 [c])) 12110 // cond: 12111 // result: (Lsh32x64 x (Const64 <t> [int64(uint16(c))])) 12112 for { 12113 t := v.Type 12114 _ = v.Args[1] 12115 x := v.Args[0] 12116 v_1 := v.Args[1] 12117 if v_1.Op != OpConst16 { 12118 break 12119 } 12120 c := v_1.AuxInt 12121 v.reset(OpLsh32x64) 12122 v.AddArg(x) 12123 v0 := b.NewValue0(v.Pos, OpConst64, t) 12124 v0.AuxInt = int64(uint16(c)) 12125 v.AddArg(v0) 12126 return true 12127 } 12128 // match: (Lsh32x16 (Const32 [0]) _) 12129 // cond: 12130 // result: (Const32 [0]) 12131 for { 12132 _ = v.Args[1] 12133 v_0 := v.Args[0] 12134 if v_0.Op != OpConst32 { 12135 break 12136 } 12137 if v_0.AuxInt != 0 { 12138 break 12139 } 12140 v.reset(OpConst32) 12141 v.AuxInt = 0 12142 return true 12143 } 12144 return false 12145 } 12146 func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { 12147 b := v.Block 12148 _ = b 12149 // match: (Lsh32x32 <t> x (Const32 [c])) 12150 // cond: 12151 // result: (Lsh32x64 x (Const64 <t> [int64(uint32(c))])) 12152 for { 12153 t := v.Type 12154 _ = v.Args[1] 12155 x := v.Args[0] 12156 v_1 := v.Args[1] 12157 if v_1.Op != OpConst32 { 12158 break 12159 } 12160 c := v_1.AuxInt 12161 v.reset(OpLsh32x64) 12162 v.AddArg(x) 12163 v0 := b.NewValue0(v.Pos, OpConst64, t) 12164 v0.AuxInt = int64(uint32(c)) 12165 v.AddArg(v0) 12166 return true 12167 } 12168 // match: (Lsh32x32 (Const32 [0]) _) 12169 // cond: 12170 // result: (Const32 [0]) 12171 for { 12172 _ = v.Args[1] 12173 v_0 := v.Args[0] 12174 if v_0.Op != OpConst32 { 12175 break 12176 } 12177 if v_0.AuxInt != 0 { 12178 break 12179 } 12180 v.reset(OpConst32) 12181 v.AuxInt = 0 12182 return true 12183 } 12184 return false 12185 } 12186 func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { 12187 b := v.Block 12188 _ = b 12189 typ := &b.Func.Config.Types 12190 _ = typ 12191 // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) 12192 // cond: 12193 // result: (Const32 [int64(int32(c) << uint64(d))]) 12194 for { 12195 _ = v.Args[1] 12196 v_0 := v.Args[0] 12197 if v_0.Op != OpConst32 { 12198 break 12199 } 12200 c := v_0.AuxInt 12201 v_1 := v.Args[1] 12202 if v_1.Op != OpConst64 { 12203 break 12204 } 12205 d := v_1.AuxInt 12206 v.reset(OpConst32) 12207 v.AuxInt = int64(int32(c) << uint64(d)) 12208 return true 12209 } 12210 // match: (Lsh32x64 x (Const64 [0])) 12211 // cond: 12212 // result: x 12213 for { 12214 _ = v.Args[1] 12215 x := v.Args[0] 12216 v_1 := v.Args[1] 12217 if v_1.Op != OpConst64 { 12218 break 12219 } 12220 if v_1.AuxInt != 0 { 12221 break 12222 } 12223 v.reset(OpCopy) 12224 v.Type = x.Type 12225 v.AddArg(x) 12226 return true 12227 } 12228 // match: (Lsh32x64 (Const32 [0]) _) 12229 // cond: 12230 // result: (Const32 [0]) 12231 for { 12232 _ = v.Args[1] 12233 v_0 := v.Args[0] 12234 if v_0.Op != OpConst32 { 12235 break 12236 } 12237 if v_0.AuxInt != 0 { 12238 break 12239 } 12240 v.reset(OpConst32) 12241 v.AuxInt = 0 12242 return true 12243 } 12244 // match: (Lsh32x64 _ (Const64 [c])) 12245 // cond: uint64(c) >= 32 12246 // result: (Const32 [0]) 12247 for { 12248 _ = v.Args[1] 12249 v_1 := v.Args[1] 12250 if v_1.Op != OpConst64 { 12251 break 12252 } 12253 c := v_1.AuxInt 12254 if !(uint64(c) >= 32) { 12255 break 12256 } 12257 v.reset(OpConst32) 12258 v.AuxInt = 0 12259 return true 12260 } 12261 // match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d])) 12262 // cond: !uaddOvf(c,d) 12263 // result: (Lsh32x64 x (Const64 <t> [c+d])) 12264 for { 12265 t := v.Type 12266 _ = v.Args[1] 12267 v_0 := v.Args[0] 12268 if v_0.Op != OpLsh32x64 { 12269 break 12270 } 12271 _ = v_0.Args[1] 12272 x := v_0.Args[0] 12273 v_0_1 := v_0.Args[1] 12274 if v_0_1.Op != OpConst64 { 12275 break 12276 } 12277 c := v_0_1.AuxInt 12278 v_1 := v.Args[1] 12279 if v_1.Op != OpConst64 { 12280 break 12281 } 12282 d := v_1.AuxInt 12283 if !(!uaddOvf(c, d)) { 12284 break 12285 } 12286 v.reset(OpLsh32x64) 12287 v.AddArg(x) 12288 v0 := b.NewValue0(v.Pos, OpConst64, t) 12289 v0.AuxInt = c + d 12290 v.AddArg(v0) 12291 return true 12292 } 12293 // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12294 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12295 // result: (Lsh32x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12296 for { 12297 _ = v.Args[1] 12298 v_0 := v.Args[0] 12299 if v_0.Op != OpRsh32Ux64 { 12300 break 12301 } 12302 _ = v_0.Args[1] 12303 v_0_0 := v_0.Args[0] 12304 if v_0_0.Op != OpLsh32x64 { 12305 break 12306 } 12307 _ = v_0_0.Args[1] 12308 x := v_0_0.Args[0] 12309 v_0_0_1 := v_0_0.Args[1] 12310 if v_0_0_1.Op != OpConst64 { 12311 break 12312 } 12313 c1 := v_0_0_1.AuxInt 12314 v_0_1 := v_0.Args[1] 12315 if v_0_1.Op != OpConst64 { 12316 break 12317 } 12318 c2 := v_0_1.AuxInt 12319 v_1 := v.Args[1] 12320 if v_1.Op != OpConst64 { 12321 break 12322 } 12323 c3 := v_1.AuxInt 12324 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12325 break 12326 } 12327 v.reset(OpLsh32x64) 12328 v.AddArg(x) 12329 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12330 v0.AuxInt = c1 - c2 + c3 12331 v.AddArg(v0) 12332 return true 12333 } 12334 return false 12335 } 12336 func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { 12337 b := v.Block 12338 _ = b 12339 // match: (Lsh32x8 <t> x (Const8 [c])) 12340 // cond: 12341 // result: (Lsh32x64 x (Const64 <t> [int64(uint8(c))])) 12342 for { 12343 t := v.Type 12344 _ = v.Args[1] 12345 x := v.Args[0] 12346 v_1 := v.Args[1] 12347 if v_1.Op != OpConst8 { 12348 break 12349 } 12350 c := v_1.AuxInt 12351 v.reset(OpLsh32x64) 12352 v.AddArg(x) 12353 v0 := b.NewValue0(v.Pos, OpConst64, t) 12354 v0.AuxInt = int64(uint8(c)) 12355 v.AddArg(v0) 12356 return true 12357 } 12358 // match: (Lsh32x8 (Const32 [0]) _) 12359 // cond: 12360 // result: (Const32 [0]) 12361 for { 12362 _ = v.Args[1] 12363 v_0 := v.Args[0] 12364 if v_0.Op != OpConst32 { 12365 break 12366 } 12367 if v_0.AuxInt != 0 { 12368 break 12369 } 12370 v.reset(OpConst32) 12371 v.AuxInt = 0 12372 return true 12373 } 12374 return false 12375 } 12376 func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { 12377 b := v.Block 12378 _ = b 12379 // match: (Lsh64x16 <t> x (Const16 [c])) 12380 // cond: 12381 // result: (Lsh64x64 x (Const64 <t> [int64(uint16(c))])) 12382 for { 12383 t := v.Type 12384 _ = v.Args[1] 12385 x := v.Args[0] 12386 v_1 := v.Args[1] 12387 if v_1.Op != OpConst16 { 12388 break 12389 } 12390 c := v_1.AuxInt 12391 v.reset(OpLsh64x64) 12392 v.AddArg(x) 12393 v0 := b.NewValue0(v.Pos, OpConst64, t) 12394 v0.AuxInt = int64(uint16(c)) 12395 v.AddArg(v0) 12396 return true 12397 } 12398 // match: (Lsh64x16 (Const64 [0]) _) 12399 // cond: 12400 // result: (Const64 [0]) 12401 for { 12402 _ = v.Args[1] 12403 v_0 := v.Args[0] 12404 if v_0.Op != OpConst64 { 12405 break 12406 } 12407 if v_0.AuxInt != 0 { 12408 break 12409 } 12410 v.reset(OpConst64) 12411 v.AuxInt = 0 12412 return true 12413 } 12414 return false 12415 } 12416 func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { 12417 b := v.Block 12418 _ = b 12419 // match: (Lsh64x32 <t> x (Const32 [c])) 12420 // cond: 12421 // result: (Lsh64x64 x (Const64 <t> [int64(uint32(c))])) 12422 for { 12423 t := v.Type 12424 _ = v.Args[1] 12425 x := v.Args[0] 12426 v_1 := v.Args[1] 12427 if v_1.Op != OpConst32 { 12428 break 12429 } 12430 c := v_1.AuxInt 12431 v.reset(OpLsh64x64) 12432 v.AddArg(x) 12433 v0 := b.NewValue0(v.Pos, OpConst64, t) 12434 v0.AuxInt = int64(uint32(c)) 12435 v.AddArg(v0) 12436 return true 12437 } 12438 // match: (Lsh64x32 (Const64 [0]) _) 12439 // cond: 12440 // result: (Const64 [0]) 12441 for { 12442 _ = v.Args[1] 12443 v_0 := v.Args[0] 12444 if v_0.Op != OpConst64 { 12445 break 12446 } 12447 if v_0.AuxInt != 0 { 12448 break 12449 } 12450 v.reset(OpConst64) 12451 v.AuxInt = 0 12452 return true 12453 } 12454 return false 12455 } 12456 func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { 12457 b := v.Block 12458 _ = b 12459 typ := &b.Func.Config.Types 12460 _ = typ 12461 // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) 12462 // cond: 12463 // result: (Const64 [c << uint64(d)]) 12464 for { 12465 _ = v.Args[1] 12466 v_0 := v.Args[0] 12467 if v_0.Op != OpConst64 { 12468 break 12469 } 12470 c := v_0.AuxInt 12471 v_1 := v.Args[1] 12472 if v_1.Op != OpConst64 { 12473 break 12474 } 12475 d := v_1.AuxInt 12476 v.reset(OpConst64) 12477 v.AuxInt = c << uint64(d) 12478 return true 12479 } 12480 // match: (Lsh64x64 x (Const64 [0])) 12481 // cond: 12482 // result: x 12483 for { 12484 _ = v.Args[1] 12485 x := v.Args[0] 12486 v_1 := v.Args[1] 12487 if v_1.Op != OpConst64 { 12488 break 12489 } 12490 if v_1.AuxInt != 0 { 12491 break 12492 } 12493 v.reset(OpCopy) 12494 v.Type = x.Type 12495 v.AddArg(x) 12496 return true 12497 } 12498 // match: (Lsh64x64 (Const64 [0]) _) 12499 // cond: 12500 // result: (Const64 [0]) 12501 for { 12502 _ = v.Args[1] 12503 v_0 := v.Args[0] 12504 if v_0.Op != OpConst64 { 12505 break 12506 } 12507 if v_0.AuxInt != 0 { 12508 break 12509 } 12510 v.reset(OpConst64) 12511 v.AuxInt = 0 12512 return true 12513 } 12514 // match: (Lsh64x64 _ (Const64 [c])) 12515 // cond: uint64(c) >= 64 12516 // result: (Const64 [0]) 12517 for { 12518 _ = v.Args[1] 12519 v_1 := v.Args[1] 12520 if v_1.Op != OpConst64 { 12521 break 12522 } 12523 c := v_1.AuxInt 12524 if !(uint64(c) >= 64) { 12525 break 12526 } 12527 v.reset(OpConst64) 12528 v.AuxInt = 0 12529 return true 12530 } 12531 // match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d])) 12532 // cond: !uaddOvf(c,d) 12533 // result: (Lsh64x64 x (Const64 <t> [c+d])) 12534 for { 12535 t := v.Type 12536 _ = v.Args[1] 12537 v_0 := v.Args[0] 12538 if v_0.Op != OpLsh64x64 { 12539 break 12540 } 12541 _ = v_0.Args[1] 12542 x := v_0.Args[0] 12543 v_0_1 := v_0.Args[1] 12544 if v_0_1.Op != OpConst64 { 12545 break 12546 } 12547 c := v_0_1.AuxInt 12548 v_1 := v.Args[1] 12549 if v_1.Op != OpConst64 { 12550 break 12551 } 12552 d := v_1.AuxInt 12553 if !(!uaddOvf(c, d)) { 12554 break 12555 } 12556 v.reset(OpLsh64x64) 12557 v.AddArg(x) 12558 v0 := b.NewValue0(v.Pos, OpConst64, t) 12559 v0.AuxInt = c + d 12560 v.AddArg(v0) 12561 return true 12562 } 12563 // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12564 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12565 // result: (Lsh64x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12566 for { 12567 _ = v.Args[1] 12568 v_0 := v.Args[0] 12569 if v_0.Op != OpRsh64Ux64 { 12570 break 12571 } 12572 _ = v_0.Args[1] 12573 v_0_0 := v_0.Args[0] 12574 if v_0_0.Op != OpLsh64x64 { 12575 break 12576 } 12577 _ = v_0_0.Args[1] 12578 x := v_0_0.Args[0] 12579 v_0_0_1 := v_0_0.Args[1] 12580 if v_0_0_1.Op != OpConst64 { 12581 break 12582 } 12583 c1 := v_0_0_1.AuxInt 12584 v_0_1 := v_0.Args[1] 12585 if v_0_1.Op != OpConst64 { 12586 break 12587 } 12588 c2 := v_0_1.AuxInt 12589 v_1 := v.Args[1] 12590 if v_1.Op != OpConst64 { 12591 break 12592 } 12593 c3 := v_1.AuxInt 12594 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12595 break 12596 } 12597 v.reset(OpLsh64x64) 12598 v.AddArg(x) 12599 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12600 v0.AuxInt = c1 - c2 + c3 12601 v.AddArg(v0) 12602 return true 12603 } 12604 return false 12605 } 12606 func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { 12607 b := v.Block 12608 _ = b 12609 // match: (Lsh64x8 <t> x (Const8 [c])) 12610 // cond: 12611 // result: (Lsh64x64 x (Const64 <t> [int64(uint8(c))])) 12612 for { 12613 t := v.Type 12614 _ = v.Args[1] 12615 x := v.Args[0] 12616 v_1 := v.Args[1] 12617 if v_1.Op != OpConst8 { 12618 break 12619 } 12620 c := v_1.AuxInt 12621 v.reset(OpLsh64x64) 12622 v.AddArg(x) 12623 v0 := b.NewValue0(v.Pos, OpConst64, t) 12624 v0.AuxInt = int64(uint8(c)) 12625 v.AddArg(v0) 12626 return true 12627 } 12628 // match: (Lsh64x8 (Const64 [0]) _) 12629 // cond: 12630 // result: (Const64 [0]) 12631 for { 12632 _ = v.Args[1] 12633 v_0 := v.Args[0] 12634 if v_0.Op != OpConst64 { 12635 break 12636 } 12637 if v_0.AuxInt != 0 { 12638 break 12639 } 12640 v.reset(OpConst64) 12641 v.AuxInt = 0 12642 return true 12643 } 12644 return false 12645 } 12646 func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { 12647 b := v.Block 12648 _ = b 12649 // match: (Lsh8x16 <t> x (Const16 [c])) 12650 // cond: 12651 // result: (Lsh8x64 x (Const64 <t> [int64(uint16(c))])) 12652 for { 12653 t := v.Type 12654 _ = v.Args[1] 12655 x := v.Args[0] 12656 v_1 := v.Args[1] 12657 if v_1.Op != OpConst16 { 12658 break 12659 } 12660 c := v_1.AuxInt 12661 v.reset(OpLsh8x64) 12662 v.AddArg(x) 12663 v0 := b.NewValue0(v.Pos, OpConst64, t) 12664 v0.AuxInt = int64(uint16(c)) 12665 v.AddArg(v0) 12666 return true 12667 } 12668 // match: (Lsh8x16 (Const8 [0]) _) 12669 // cond: 12670 // result: (Const8 [0]) 12671 for { 12672 _ = v.Args[1] 12673 v_0 := v.Args[0] 12674 if v_0.Op != OpConst8 { 12675 break 12676 } 12677 if v_0.AuxInt != 0 { 12678 break 12679 } 12680 v.reset(OpConst8) 12681 v.AuxInt = 0 12682 return true 12683 } 12684 return false 12685 } 12686 func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { 12687 b := v.Block 12688 _ = b 12689 // match: (Lsh8x32 <t> x (Const32 [c])) 12690 // cond: 12691 // result: (Lsh8x64 x (Const64 <t> [int64(uint32(c))])) 12692 for { 12693 t := v.Type 12694 _ = v.Args[1] 12695 x := v.Args[0] 12696 v_1 := v.Args[1] 12697 if v_1.Op != OpConst32 { 12698 break 12699 } 12700 c := v_1.AuxInt 12701 v.reset(OpLsh8x64) 12702 v.AddArg(x) 12703 v0 := b.NewValue0(v.Pos, OpConst64, t) 12704 v0.AuxInt = int64(uint32(c)) 12705 v.AddArg(v0) 12706 return true 12707 } 12708 // match: (Lsh8x32 (Const8 [0]) _) 12709 // cond: 12710 // result: (Const8 [0]) 12711 for { 12712 _ = v.Args[1] 12713 v_0 := v.Args[0] 12714 if v_0.Op != OpConst8 { 12715 break 12716 } 12717 if v_0.AuxInt != 0 { 12718 break 12719 } 12720 v.reset(OpConst8) 12721 v.AuxInt = 0 12722 return true 12723 } 12724 return false 12725 } 12726 func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { 12727 b := v.Block 12728 _ = b 12729 typ := &b.Func.Config.Types 12730 _ = typ 12731 // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) 12732 // cond: 12733 // result: (Const8 [int64(int8(c) << uint64(d))]) 12734 for { 12735 _ = v.Args[1] 12736 v_0 := v.Args[0] 12737 if v_0.Op != OpConst8 { 12738 break 12739 } 12740 c := v_0.AuxInt 12741 v_1 := v.Args[1] 12742 if v_1.Op != OpConst64 { 12743 break 12744 } 12745 d := v_1.AuxInt 12746 v.reset(OpConst8) 12747 v.AuxInt = int64(int8(c) << uint64(d)) 12748 return true 12749 } 12750 // match: (Lsh8x64 x (Const64 [0])) 12751 // cond: 12752 // result: x 12753 for { 12754 _ = v.Args[1] 12755 x := v.Args[0] 12756 v_1 := v.Args[1] 12757 if v_1.Op != OpConst64 { 12758 break 12759 } 12760 if v_1.AuxInt != 0 { 12761 break 12762 } 12763 v.reset(OpCopy) 12764 v.Type = x.Type 12765 v.AddArg(x) 12766 return true 12767 } 12768 // match: (Lsh8x64 (Const8 [0]) _) 12769 // cond: 12770 // result: (Const8 [0]) 12771 for { 12772 _ = v.Args[1] 12773 v_0 := v.Args[0] 12774 if v_0.Op != OpConst8 { 12775 break 12776 } 12777 if v_0.AuxInt != 0 { 12778 break 12779 } 12780 v.reset(OpConst8) 12781 v.AuxInt = 0 12782 return true 12783 } 12784 // match: (Lsh8x64 _ (Const64 [c])) 12785 // cond: uint64(c) >= 8 12786 // result: (Const8 [0]) 12787 for { 12788 _ = v.Args[1] 12789 v_1 := v.Args[1] 12790 if v_1.Op != OpConst64 { 12791 break 12792 } 12793 c := v_1.AuxInt 12794 if !(uint64(c) >= 8) { 12795 break 12796 } 12797 v.reset(OpConst8) 12798 v.AuxInt = 0 12799 return true 12800 } 12801 // match: (Lsh8x64 <t> (Lsh8x64 x (Const64 [c])) (Const64 [d])) 12802 // cond: !uaddOvf(c,d) 12803 // result: (Lsh8x64 x (Const64 <t> [c+d])) 12804 for { 12805 t := v.Type 12806 _ = v.Args[1] 12807 v_0 := v.Args[0] 12808 if v_0.Op != OpLsh8x64 { 12809 break 12810 } 12811 _ = v_0.Args[1] 12812 x := v_0.Args[0] 12813 v_0_1 := v_0.Args[1] 12814 if v_0_1.Op != OpConst64 { 12815 break 12816 } 12817 c := v_0_1.AuxInt 12818 v_1 := v.Args[1] 12819 if v_1.Op != OpConst64 { 12820 break 12821 } 12822 d := v_1.AuxInt 12823 if !(!uaddOvf(c, d)) { 12824 break 12825 } 12826 v.reset(OpLsh8x64) 12827 v.AddArg(x) 12828 v0 := b.NewValue0(v.Pos, OpConst64, t) 12829 v0.AuxInt = c + d 12830 v.AddArg(v0) 12831 return true 12832 } 12833 // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12834 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12835 // result: (Lsh8x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12836 for { 12837 _ = v.Args[1] 12838 v_0 := v.Args[0] 12839 if v_0.Op != OpRsh8Ux64 { 12840 break 12841 } 12842 _ = v_0.Args[1] 12843 v_0_0 := v_0.Args[0] 12844 if v_0_0.Op != OpLsh8x64 { 12845 break 12846 } 12847 _ = v_0_0.Args[1] 12848 x := v_0_0.Args[0] 12849 v_0_0_1 := v_0_0.Args[1] 12850 if v_0_0_1.Op != OpConst64 { 12851 break 12852 } 12853 c1 := v_0_0_1.AuxInt 12854 v_0_1 := v_0.Args[1] 12855 if v_0_1.Op != OpConst64 { 12856 break 12857 } 12858 c2 := v_0_1.AuxInt 12859 v_1 := v.Args[1] 12860 if v_1.Op != OpConst64 { 12861 break 12862 } 12863 c3 := v_1.AuxInt 12864 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12865 break 12866 } 12867 v.reset(OpLsh8x64) 12868 v.AddArg(x) 12869 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12870 v0.AuxInt = c1 - c2 + c3 12871 v.AddArg(v0) 12872 return true 12873 } 12874 return false 12875 } 12876 func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { 12877 b := v.Block 12878 _ = b 12879 // match: (Lsh8x8 <t> x (Const8 [c])) 12880 // cond: 12881 // result: (Lsh8x64 x (Const64 <t> [int64(uint8(c))])) 12882 for { 12883 t := v.Type 12884 _ = v.Args[1] 12885 x := v.Args[0] 12886 v_1 := v.Args[1] 12887 if v_1.Op != OpConst8 { 12888 break 12889 } 12890 c := v_1.AuxInt 12891 v.reset(OpLsh8x64) 12892 v.AddArg(x) 12893 v0 := b.NewValue0(v.Pos, OpConst64, t) 12894 v0.AuxInt = int64(uint8(c)) 12895 v.AddArg(v0) 12896 return true 12897 } 12898 // match: (Lsh8x8 (Const8 [0]) _) 12899 // cond: 12900 // result: (Const8 [0]) 12901 for { 12902 _ = v.Args[1] 12903 v_0 := v.Args[0] 12904 if v_0.Op != OpConst8 { 12905 break 12906 } 12907 if v_0.AuxInt != 0 { 12908 break 12909 } 12910 v.reset(OpConst8) 12911 v.AuxInt = 0 12912 return true 12913 } 12914 return false 12915 } 12916 func rewriteValuegeneric_OpMod16_0(v *Value) bool { 12917 b := v.Block 12918 _ = b 12919 // match: (Mod16 (Const16 [c]) (Const16 [d])) 12920 // cond: d != 0 12921 // result: (Const16 [int64(int16(c % d))]) 12922 for { 12923 _ = v.Args[1] 12924 v_0 := v.Args[0] 12925 if v_0.Op != OpConst16 { 12926 break 12927 } 12928 c := v_0.AuxInt 12929 v_1 := v.Args[1] 12930 if v_1.Op != OpConst16 { 12931 break 12932 } 12933 d := v_1.AuxInt 12934 if !(d != 0) { 12935 break 12936 } 12937 v.reset(OpConst16) 12938 v.AuxInt = int64(int16(c % d)) 12939 return true 12940 } 12941 // match: (Mod16 <t> n (Const16 [c])) 12942 // cond: c < 0 && c != -1<<15 12943 // result: (Mod16 <t> n (Const16 <t> [-c])) 12944 for { 12945 t := v.Type 12946 _ = v.Args[1] 12947 n := v.Args[0] 12948 v_1 := v.Args[1] 12949 if v_1.Op != OpConst16 { 12950 break 12951 } 12952 c := v_1.AuxInt 12953 if !(c < 0 && c != -1<<15) { 12954 break 12955 } 12956 v.reset(OpMod16) 12957 v.Type = t 12958 v.AddArg(n) 12959 v0 := b.NewValue0(v.Pos, OpConst16, t) 12960 v0.AuxInt = -c 12961 v.AddArg(v0) 12962 return true 12963 } 12964 // match: (Mod16 <t> x (Const16 [c])) 12965 // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) 12966 // result: (Sub16 x (Mul16 <t> (Div16 <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 12967 for { 12968 t := v.Type 12969 _ = v.Args[1] 12970 x := v.Args[0] 12971 v_1 := v.Args[1] 12972 if v_1.Op != OpConst16 { 12973 break 12974 } 12975 c := v_1.AuxInt 12976 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { 12977 break 12978 } 12979 v.reset(OpSub16) 12980 v.AddArg(x) 12981 v0 := b.NewValue0(v.Pos, OpMul16, t) 12982 v1 := b.NewValue0(v.Pos, OpDiv16, t) 12983 v1.AddArg(x) 12984 v2 := b.NewValue0(v.Pos, OpConst16, t) 12985 v2.AuxInt = c 12986 v1.AddArg(v2) 12987 v0.AddArg(v1) 12988 v3 := b.NewValue0(v.Pos, OpConst16, t) 12989 v3.AuxInt = c 12990 v0.AddArg(v3) 12991 v.AddArg(v0) 12992 return true 12993 } 12994 return false 12995 } 12996 func rewriteValuegeneric_OpMod16u_0(v *Value) bool { 12997 b := v.Block 12998 _ = b 12999 // match: (Mod16u (Const16 [c]) (Const16 [d])) 13000 // cond: d != 0 13001 // result: (Const16 [int64(uint16(c) % uint16(d))]) 13002 for { 13003 _ = v.Args[1] 13004 v_0 := v.Args[0] 13005 if v_0.Op != OpConst16 { 13006 break 13007 } 13008 c := v_0.AuxInt 13009 v_1 := v.Args[1] 13010 if v_1.Op != OpConst16 { 13011 break 13012 } 13013 d := v_1.AuxInt 13014 if !(d != 0) { 13015 break 13016 } 13017 v.reset(OpConst16) 13018 v.AuxInt = int64(uint16(c) % uint16(d)) 13019 return true 13020 } 13021 // match: (Mod16u <t> n (Const16 [c])) 13022 // cond: isPowerOfTwo(c&0xffff) 13023 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 13024 for { 13025 t := v.Type 13026 _ = v.Args[1] 13027 n := v.Args[0] 13028 v_1 := v.Args[1] 13029 if v_1.Op != OpConst16 { 13030 break 13031 } 13032 c := v_1.AuxInt 13033 if !(isPowerOfTwo(c & 0xffff)) { 13034 break 13035 } 13036 v.reset(OpAnd16) 13037 v.AddArg(n) 13038 v0 := b.NewValue0(v.Pos, OpConst16, t) 13039 v0.AuxInt = (c & 0xffff) - 1 13040 v.AddArg(v0) 13041 return true 13042 } 13043 // match: (Mod16u <t> x (Const16 [c])) 13044 // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) 13045 // result: (Sub16 x (Mul16 <t> (Div16u <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 13046 for { 13047 t := v.Type 13048 _ = v.Args[1] 13049 x := v.Args[0] 13050 v_1 := v.Args[1] 13051 if v_1.Op != OpConst16 { 13052 break 13053 } 13054 c := v_1.AuxInt 13055 if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { 13056 break 13057 } 13058 v.reset(OpSub16) 13059 v.AddArg(x) 13060 v0 := b.NewValue0(v.Pos, OpMul16, t) 13061 v1 := b.NewValue0(v.Pos, OpDiv16u, t) 13062 v1.AddArg(x) 13063 v2 := b.NewValue0(v.Pos, OpConst16, t) 13064 v2.AuxInt = c 13065 v1.AddArg(v2) 13066 v0.AddArg(v1) 13067 v3 := b.NewValue0(v.Pos, OpConst16, t) 13068 v3.AuxInt = c 13069 v0.AddArg(v3) 13070 v.AddArg(v0) 13071 return true 13072 } 13073 return false 13074 } 13075 func rewriteValuegeneric_OpMod32_0(v *Value) bool { 13076 b := v.Block 13077 _ = b 13078 // match: (Mod32 (Const32 [c]) (Const32 [d])) 13079 // cond: d != 0 13080 // result: (Const32 [int64(int32(c % d))]) 13081 for { 13082 _ = v.Args[1] 13083 v_0 := v.Args[0] 13084 if v_0.Op != OpConst32 { 13085 break 13086 } 13087 c := v_0.AuxInt 13088 v_1 := v.Args[1] 13089 if v_1.Op != OpConst32 { 13090 break 13091 } 13092 d := v_1.AuxInt 13093 if !(d != 0) { 13094 break 13095 } 13096 v.reset(OpConst32) 13097 v.AuxInt = int64(int32(c % d)) 13098 return true 13099 } 13100 // match: (Mod32 <t> n (Const32 [c])) 13101 // cond: c < 0 && c != -1<<31 13102 // result: (Mod32 <t> n (Const32 <t> [-c])) 13103 for { 13104 t := v.Type 13105 _ = v.Args[1] 13106 n := v.Args[0] 13107 v_1 := v.Args[1] 13108 if v_1.Op != OpConst32 { 13109 break 13110 } 13111 c := v_1.AuxInt 13112 if !(c < 0 && c != -1<<31) { 13113 break 13114 } 13115 v.reset(OpMod32) 13116 v.Type = t 13117 v.AddArg(n) 13118 v0 := b.NewValue0(v.Pos, OpConst32, t) 13119 v0.AuxInt = -c 13120 v.AddArg(v0) 13121 return true 13122 } 13123 // match: (Mod32 <t> x (Const32 [c])) 13124 // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) 13125 // result: (Sub32 x (Mul32 <t> (Div32 <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13126 for { 13127 t := v.Type 13128 _ = v.Args[1] 13129 x := v.Args[0] 13130 v_1 := v.Args[1] 13131 if v_1.Op != OpConst32 { 13132 break 13133 } 13134 c := v_1.AuxInt 13135 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { 13136 break 13137 } 13138 v.reset(OpSub32) 13139 v.AddArg(x) 13140 v0 := b.NewValue0(v.Pos, OpMul32, t) 13141 v1 := b.NewValue0(v.Pos, OpDiv32, t) 13142 v1.AddArg(x) 13143 v2 := b.NewValue0(v.Pos, OpConst32, t) 13144 v2.AuxInt = c 13145 v1.AddArg(v2) 13146 v0.AddArg(v1) 13147 v3 := b.NewValue0(v.Pos, OpConst32, t) 13148 v3.AuxInt = c 13149 v0.AddArg(v3) 13150 v.AddArg(v0) 13151 return true 13152 } 13153 return false 13154 } 13155 func rewriteValuegeneric_OpMod32u_0(v *Value) bool { 13156 b := v.Block 13157 _ = b 13158 // match: (Mod32u (Const32 [c]) (Const32 [d])) 13159 // cond: d != 0 13160 // result: (Const32 [int64(uint32(c) % uint32(d))]) 13161 for { 13162 _ = v.Args[1] 13163 v_0 := v.Args[0] 13164 if v_0.Op != OpConst32 { 13165 break 13166 } 13167 c := v_0.AuxInt 13168 v_1 := v.Args[1] 13169 if v_1.Op != OpConst32 { 13170 break 13171 } 13172 d := v_1.AuxInt 13173 if !(d != 0) { 13174 break 13175 } 13176 v.reset(OpConst32) 13177 v.AuxInt = int64(uint32(c) % uint32(d)) 13178 return true 13179 } 13180 // match: (Mod32u <t> n (Const32 [c])) 13181 // cond: isPowerOfTwo(c&0xffffffff) 13182 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 13183 for { 13184 t := v.Type 13185 _ = v.Args[1] 13186 n := v.Args[0] 13187 v_1 := v.Args[1] 13188 if v_1.Op != OpConst32 { 13189 break 13190 } 13191 c := v_1.AuxInt 13192 if !(isPowerOfTwo(c & 0xffffffff)) { 13193 break 13194 } 13195 v.reset(OpAnd32) 13196 v.AddArg(n) 13197 v0 := b.NewValue0(v.Pos, OpConst32, t) 13198 v0.AuxInt = (c & 0xffffffff) - 1 13199 v.AddArg(v0) 13200 return true 13201 } 13202 // match: (Mod32u <t> x (Const32 [c])) 13203 // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) 13204 // result: (Sub32 x (Mul32 <t> (Div32u <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13205 for { 13206 t := v.Type 13207 _ = v.Args[1] 13208 x := v.Args[0] 13209 v_1 := v.Args[1] 13210 if v_1.Op != OpConst32 { 13211 break 13212 } 13213 c := v_1.AuxInt 13214 if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { 13215 break 13216 } 13217 v.reset(OpSub32) 13218 v.AddArg(x) 13219 v0 := b.NewValue0(v.Pos, OpMul32, t) 13220 v1 := b.NewValue0(v.Pos, OpDiv32u, t) 13221 v1.AddArg(x) 13222 v2 := b.NewValue0(v.Pos, OpConst32, t) 13223 v2.AuxInt = c 13224 v1.AddArg(v2) 13225 v0.AddArg(v1) 13226 v3 := b.NewValue0(v.Pos, OpConst32, t) 13227 v3.AuxInt = c 13228 v0.AddArg(v3) 13229 v.AddArg(v0) 13230 return true 13231 } 13232 return false 13233 } 13234 func rewriteValuegeneric_OpMod64_0(v *Value) bool { 13235 b := v.Block 13236 _ = b 13237 // match: (Mod64 (Const64 [c]) (Const64 [d])) 13238 // cond: d != 0 13239 // result: (Const64 [c % d]) 13240 for { 13241 _ = v.Args[1] 13242 v_0 := v.Args[0] 13243 if v_0.Op != OpConst64 { 13244 break 13245 } 13246 c := v_0.AuxInt 13247 v_1 := v.Args[1] 13248 if v_1.Op != OpConst64 { 13249 break 13250 } 13251 d := v_1.AuxInt 13252 if !(d != 0) { 13253 break 13254 } 13255 v.reset(OpConst64) 13256 v.AuxInt = c % d 13257 return true 13258 } 13259 // match: (Mod64 <t> n (Const64 [c])) 13260 // cond: c < 0 && c != -1<<63 13261 // result: (Mod64 <t> n (Const64 <t> [-c])) 13262 for { 13263 t := v.Type 13264 _ = v.Args[1] 13265 n := v.Args[0] 13266 v_1 := v.Args[1] 13267 if v_1.Op != OpConst64 { 13268 break 13269 } 13270 c := v_1.AuxInt 13271 if !(c < 0 && c != -1<<63) { 13272 break 13273 } 13274 v.reset(OpMod64) 13275 v.Type = t 13276 v.AddArg(n) 13277 v0 := b.NewValue0(v.Pos, OpConst64, t) 13278 v0.AuxInt = -c 13279 v.AddArg(v0) 13280 return true 13281 } 13282 // match: (Mod64 <t> x (Const64 [c])) 13283 // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) 13284 // result: (Sub64 x (Mul64 <t> (Div64 <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 13285 for { 13286 t := v.Type 13287 _ = v.Args[1] 13288 x := v.Args[0] 13289 v_1 := v.Args[1] 13290 if v_1.Op != OpConst64 { 13291 break 13292 } 13293 c := v_1.AuxInt 13294 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { 13295 break 13296 } 13297 v.reset(OpSub64) 13298 v.AddArg(x) 13299 v0 := b.NewValue0(v.Pos, OpMul64, t) 13300 v1 := b.NewValue0(v.Pos, OpDiv64, t) 13301 v1.AddArg(x) 13302 v2 := b.NewValue0(v.Pos, OpConst64, t) 13303 v2.AuxInt = c 13304 v1.AddArg(v2) 13305 v0.AddArg(v1) 13306 v3 := b.NewValue0(v.Pos, OpConst64, t) 13307 v3.AuxInt = c 13308 v0.AddArg(v3) 13309 v.AddArg(v0) 13310 return true 13311 } 13312 return false 13313 } 13314 func rewriteValuegeneric_OpMod64u_0(v *Value) bool { 13315 b := v.Block 13316 _ = b 13317 // match: (Mod64u (Const64 [c]) (Const64 [d])) 13318 // cond: d != 0 13319 // result: (Const64 [int64(uint64(c) % uint64(d))]) 13320 for { 13321 _ = v.Args[1] 13322 v_0 := v.Args[0] 13323 if v_0.Op != OpConst64 { 13324 break 13325 } 13326 c := v_0.AuxInt 13327 v_1 := v.Args[1] 13328 if v_1.Op != OpConst64 { 13329 break 13330 } 13331 d := v_1.AuxInt 13332 if !(d != 0) { 13333 break 13334 } 13335 v.reset(OpConst64) 13336 v.AuxInt = int64(uint64(c) % uint64(d)) 13337 return true 13338 } 13339 // match: (Mod64u <t> n (Const64 [c])) 13340 // cond: isPowerOfTwo(c) 13341 // result: (And64 n (Const64 <t> [c-1])) 13342 for { 13343 t := v.Type 13344 _ = v.Args[1] 13345 n := v.Args[0] 13346 v_1 := v.Args[1] 13347 if v_1.Op != OpConst64 { 13348 break 13349 } 13350 c := v_1.AuxInt 13351 if !(isPowerOfTwo(c)) { 13352 break 13353 } 13354 v.reset(OpAnd64) 13355 v.AddArg(n) 13356 v0 := b.NewValue0(v.Pos, OpConst64, t) 13357 v0.AuxInt = c - 1 13358 v.AddArg(v0) 13359 return true 13360 } 13361 // match: (Mod64u <t> n (Const64 [-1<<63])) 13362 // cond: 13363 // result: (And64 n (Const64 <t> [1<<63-1])) 13364 for { 13365 t := v.Type 13366 _ = v.Args[1] 13367 n := v.Args[0] 13368 v_1 := v.Args[1] 13369 if v_1.Op != OpConst64 { 13370 break 13371 } 13372 if v_1.AuxInt != -1<<63 { 13373 break 13374 } 13375 v.reset(OpAnd64) 13376 v.AddArg(n) 13377 v0 := b.NewValue0(v.Pos, OpConst64, t) 13378 v0.AuxInt = 1<<63 - 1 13379 v.AddArg(v0) 13380 return true 13381 } 13382 // match: (Mod64u <t> x (Const64 [c])) 13383 // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) 13384 // result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 13385 for { 13386 t := v.Type 13387 _ = v.Args[1] 13388 x := v.Args[0] 13389 v_1 := v.Args[1] 13390 if v_1.Op != OpConst64 { 13391 break 13392 } 13393 c := v_1.AuxInt 13394 if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { 13395 break 13396 } 13397 v.reset(OpSub64) 13398 v.AddArg(x) 13399 v0 := b.NewValue0(v.Pos, OpMul64, t) 13400 v1 := b.NewValue0(v.Pos, OpDiv64u, t) 13401 v1.AddArg(x) 13402 v2 := b.NewValue0(v.Pos, OpConst64, t) 13403 v2.AuxInt = c 13404 v1.AddArg(v2) 13405 v0.AddArg(v1) 13406 v3 := b.NewValue0(v.Pos, OpConst64, t) 13407 v3.AuxInt = c 13408 v0.AddArg(v3) 13409 v.AddArg(v0) 13410 return true 13411 } 13412 return false 13413 } 13414 func rewriteValuegeneric_OpMod8_0(v *Value) bool { 13415 b := v.Block 13416 _ = b 13417 // match: (Mod8 (Const8 [c]) (Const8 [d])) 13418 // cond: d != 0 13419 // result: (Const8 [int64(int8(c % d))]) 13420 for { 13421 _ = v.Args[1] 13422 v_0 := v.Args[0] 13423 if v_0.Op != OpConst8 { 13424 break 13425 } 13426 c := v_0.AuxInt 13427 v_1 := v.Args[1] 13428 if v_1.Op != OpConst8 { 13429 break 13430 } 13431 d := v_1.AuxInt 13432 if !(d != 0) { 13433 break 13434 } 13435 v.reset(OpConst8) 13436 v.AuxInt = int64(int8(c % d)) 13437 return true 13438 } 13439 // match: (Mod8 <t> n (Const8 [c])) 13440 // cond: c < 0 && c != -1<<7 13441 // result: (Mod8 <t> n (Const8 <t> [-c])) 13442 for { 13443 t := v.Type 13444 _ = v.Args[1] 13445 n := v.Args[0] 13446 v_1 := v.Args[1] 13447 if v_1.Op != OpConst8 { 13448 break 13449 } 13450 c := v_1.AuxInt 13451 if !(c < 0 && c != -1<<7) { 13452 break 13453 } 13454 v.reset(OpMod8) 13455 v.Type = t 13456 v.AddArg(n) 13457 v0 := b.NewValue0(v.Pos, OpConst8, t) 13458 v0.AuxInt = -c 13459 v.AddArg(v0) 13460 return true 13461 } 13462 // match: (Mod8 <t> x (Const8 [c])) 13463 // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) 13464 // result: (Sub8 x (Mul8 <t> (Div8 <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 13465 for { 13466 t := v.Type 13467 _ = v.Args[1] 13468 x := v.Args[0] 13469 v_1 := v.Args[1] 13470 if v_1.Op != OpConst8 { 13471 break 13472 } 13473 c := v_1.AuxInt 13474 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { 13475 break 13476 } 13477 v.reset(OpSub8) 13478 v.AddArg(x) 13479 v0 := b.NewValue0(v.Pos, OpMul8, t) 13480 v1 := b.NewValue0(v.Pos, OpDiv8, t) 13481 v1.AddArg(x) 13482 v2 := b.NewValue0(v.Pos, OpConst8, t) 13483 v2.AuxInt = c 13484 v1.AddArg(v2) 13485 v0.AddArg(v1) 13486 v3 := b.NewValue0(v.Pos, OpConst8, t) 13487 v3.AuxInt = c 13488 v0.AddArg(v3) 13489 v.AddArg(v0) 13490 return true 13491 } 13492 return false 13493 } 13494 func rewriteValuegeneric_OpMod8u_0(v *Value) bool { 13495 b := v.Block 13496 _ = b 13497 // match: (Mod8u (Const8 [c]) (Const8 [d])) 13498 // cond: d != 0 13499 // result: (Const8 [int64(uint8(c) % uint8(d))]) 13500 for { 13501 _ = v.Args[1] 13502 v_0 := v.Args[0] 13503 if v_0.Op != OpConst8 { 13504 break 13505 } 13506 c := v_0.AuxInt 13507 v_1 := v.Args[1] 13508 if v_1.Op != OpConst8 { 13509 break 13510 } 13511 d := v_1.AuxInt 13512 if !(d != 0) { 13513 break 13514 } 13515 v.reset(OpConst8) 13516 v.AuxInt = int64(uint8(c) % uint8(d)) 13517 return true 13518 } 13519 // match: (Mod8u <t> n (Const8 [c])) 13520 // cond: isPowerOfTwo(c&0xff) 13521 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 13522 for { 13523 t := v.Type 13524 _ = v.Args[1] 13525 n := v.Args[0] 13526 v_1 := v.Args[1] 13527 if v_1.Op != OpConst8 { 13528 break 13529 } 13530 c := v_1.AuxInt 13531 if !(isPowerOfTwo(c & 0xff)) { 13532 break 13533 } 13534 v.reset(OpAnd8) 13535 v.AddArg(n) 13536 v0 := b.NewValue0(v.Pos, OpConst8, t) 13537 v0.AuxInt = (c & 0xff) - 1 13538 v.AddArg(v0) 13539 return true 13540 } 13541 // match: (Mod8u <t> x (Const8 [c])) 13542 // cond: x.Op != OpConst8 && c > 0 && umagicOK(8 ,c) 13543 // result: (Sub8 x (Mul8 <t> (Div8u <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 13544 for { 13545 t := v.Type 13546 _ = v.Args[1] 13547 x := v.Args[0] 13548 v_1 := v.Args[1] 13549 if v_1.Op != OpConst8 { 13550 break 13551 } 13552 c := v_1.AuxInt 13553 if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { 13554 break 13555 } 13556 v.reset(OpSub8) 13557 v.AddArg(x) 13558 v0 := b.NewValue0(v.Pos, OpMul8, t) 13559 v1 := b.NewValue0(v.Pos, OpDiv8u, t) 13560 v1.AddArg(x) 13561 v2 := b.NewValue0(v.Pos, OpConst8, t) 13562 v2.AuxInt = c 13563 v1.AddArg(v2) 13564 v0.AddArg(v1) 13565 v3 := b.NewValue0(v.Pos, OpConst8, t) 13566 v3.AuxInt = c 13567 v0.AddArg(v3) 13568 v.AddArg(v0) 13569 return true 13570 } 13571 return false 13572 } 13573 func rewriteValuegeneric_OpMul16_0(v *Value) bool { 13574 b := v.Block 13575 _ = b 13576 typ := &b.Func.Config.Types 13577 _ = typ 13578 // match: (Mul16 (Const16 [c]) (Const16 [d])) 13579 // cond: 13580 // result: (Const16 [int64(int16(c*d))]) 13581 for { 13582 _ = v.Args[1] 13583 v_0 := v.Args[0] 13584 if v_0.Op != OpConst16 { 13585 break 13586 } 13587 c := v_0.AuxInt 13588 v_1 := v.Args[1] 13589 if v_1.Op != OpConst16 { 13590 break 13591 } 13592 d := v_1.AuxInt 13593 v.reset(OpConst16) 13594 v.AuxInt = int64(int16(c * d)) 13595 return true 13596 } 13597 // match: (Mul16 (Const16 [d]) (Const16 [c])) 13598 // cond: 13599 // result: (Const16 [int64(int16(c*d))]) 13600 for { 13601 _ = v.Args[1] 13602 v_0 := v.Args[0] 13603 if v_0.Op != OpConst16 { 13604 break 13605 } 13606 d := v_0.AuxInt 13607 v_1 := v.Args[1] 13608 if v_1.Op != OpConst16 { 13609 break 13610 } 13611 c := v_1.AuxInt 13612 v.reset(OpConst16) 13613 v.AuxInt = int64(int16(c * d)) 13614 return true 13615 } 13616 // match: (Mul16 (Const16 [1]) x) 13617 // cond: 13618 // result: x 13619 for { 13620 _ = v.Args[1] 13621 v_0 := v.Args[0] 13622 if v_0.Op != OpConst16 { 13623 break 13624 } 13625 if v_0.AuxInt != 1 { 13626 break 13627 } 13628 x := v.Args[1] 13629 v.reset(OpCopy) 13630 v.Type = x.Type 13631 v.AddArg(x) 13632 return true 13633 } 13634 // match: (Mul16 x (Const16 [1])) 13635 // cond: 13636 // result: x 13637 for { 13638 _ = v.Args[1] 13639 x := v.Args[0] 13640 v_1 := v.Args[1] 13641 if v_1.Op != OpConst16 { 13642 break 13643 } 13644 if v_1.AuxInt != 1 { 13645 break 13646 } 13647 v.reset(OpCopy) 13648 v.Type = x.Type 13649 v.AddArg(x) 13650 return true 13651 } 13652 // match: (Mul16 (Const16 [-1]) x) 13653 // cond: 13654 // result: (Neg16 x) 13655 for { 13656 _ = v.Args[1] 13657 v_0 := v.Args[0] 13658 if v_0.Op != OpConst16 { 13659 break 13660 } 13661 if v_0.AuxInt != -1 { 13662 break 13663 } 13664 x := v.Args[1] 13665 v.reset(OpNeg16) 13666 v.AddArg(x) 13667 return true 13668 } 13669 // match: (Mul16 x (Const16 [-1])) 13670 // cond: 13671 // result: (Neg16 x) 13672 for { 13673 _ = v.Args[1] 13674 x := v.Args[0] 13675 v_1 := v.Args[1] 13676 if v_1.Op != OpConst16 { 13677 break 13678 } 13679 if v_1.AuxInt != -1 { 13680 break 13681 } 13682 v.reset(OpNeg16) 13683 v.AddArg(x) 13684 return true 13685 } 13686 // match: (Mul16 <t> n (Const16 [c])) 13687 // cond: isPowerOfTwo(c) 13688 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 13689 for { 13690 t := v.Type 13691 _ = v.Args[1] 13692 n := v.Args[0] 13693 v_1 := v.Args[1] 13694 if v_1.Op != OpConst16 { 13695 break 13696 } 13697 c := v_1.AuxInt 13698 if !(isPowerOfTwo(c)) { 13699 break 13700 } 13701 v.reset(OpLsh16x64) 13702 v.Type = t 13703 v.AddArg(n) 13704 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13705 v0.AuxInt = log2(c) 13706 v.AddArg(v0) 13707 return true 13708 } 13709 // match: (Mul16 <t> (Const16 [c]) n) 13710 // cond: isPowerOfTwo(c) 13711 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 13712 for { 13713 t := v.Type 13714 _ = v.Args[1] 13715 v_0 := v.Args[0] 13716 if v_0.Op != OpConst16 { 13717 break 13718 } 13719 c := v_0.AuxInt 13720 n := v.Args[1] 13721 if !(isPowerOfTwo(c)) { 13722 break 13723 } 13724 v.reset(OpLsh16x64) 13725 v.Type = t 13726 v.AddArg(n) 13727 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13728 v0.AuxInt = log2(c) 13729 v.AddArg(v0) 13730 return true 13731 } 13732 // match: (Mul16 <t> n (Const16 [c])) 13733 // cond: t.IsSigned() && isPowerOfTwo(-c) 13734 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 13735 for { 13736 t := v.Type 13737 _ = v.Args[1] 13738 n := v.Args[0] 13739 v_1 := v.Args[1] 13740 if v_1.Op != OpConst16 { 13741 break 13742 } 13743 c := v_1.AuxInt 13744 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13745 break 13746 } 13747 v.reset(OpNeg16) 13748 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 13749 v0.AddArg(n) 13750 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13751 v1.AuxInt = log2(-c) 13752 v0.AddArg(v1) 13753 v.AddArg(v0) 13754 return true 13755 } 13756 // match: (Mul16 <t> (Const16 [c]) n) 13757 // cond: t.IsSigned() && isPowerOfTwo(-c) 13758 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 13759 for { 13760 t := v.Type 13761 _ = v.Args[1] 13762 v_0 := v.Args[0] 13763 if v_0.Op != OpConst16 { 13764 break 13765 } 13766 c := v_0.AuxInt 13767 n := v.Args[1] 13768 if !(t.IsSigned() && isPowerOfTwo(-c)) { 13769 break 13770 } 13771 v.reset(OpNeg16) 13772 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 13773 v0.AddArg(n) 13774 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13775 v1.AuxInt = log2(-c) 13776 v0.AddArg(v1) 13777 v.AddArg(v0) 13778 return true 13779 } 13780 return false 13781 } 13782 func rewriteValuegeneric_OpMul16_10(v *Value) bool { 13783 b := v.Block 13784 _ = b 13785 // match: (Mul16 (Const16 [0]) _) 13786 // cond: 13787 // result: (Const16 [0]) 13788 for { 13789 _ = v.Args[1] 13790 v_0 := v.Args[0] 13791 if v_0.Op != OpConst16 { 13792 break 13793 } 13794 if v_0.AuxInt != 0 { 13795 break 13796 } 13797 v.reset(OpConst16) 13798 v.AuxInt = 0 13799 return true 13800 } 13801 // match: (Mul16 _ (Const16 [0])) 13802 // cond: 13803 // result: (Const16 [0]) 13804 for { 13805 _ = v.Args[1] 13806 v_1 := v.Args[1] 13807 if v_1.Op != OpConst16 { 13808 break 13809 } 13810 if v_1.AuxInt != 0 { 13811 break 13812 } 13813 v.reset(OpConst16) 13814 v.AuxInt = 0 13815 return true 13816 } 13817 // match: (Mul16 (Const16 <t> [c]) (Mul16 (Const16 <t> [d]) x)) 13818 // cond: 13819 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 13820 for { 13821 _ = v.Args[1] 13822 v_0 := v.Args[0] 13823 if v_0.Op != OpConst16 { 13824 break 13825 } 13826 t := v_0.Type 13827 c := v_0.AuxInt 13828 v_1 := v.Args[1] 13829 if v_1.Op != OpMul16 { 13830 break 13831 } 13832 _ = v_1.Args[1] 13833 v_1_0 := v_1.Args[0] 13834 if v_1_0.Op != OpConst16 { 13835 break 13836 } 13837 if v_1_0.Type != t { 13838 break 13839 } 13840 d := v_1_0.AuxInt 13841 x := v_1.Args[1] 13842 v.reset(OpMul16) 13843 v0 := b.NewValue0(v.Pos, OpConst16, t) 13844 v0.AuxInt = int64(int16(c * d)) 13845 v.AddArg(v0) 13846 v.AddArg(x) 13847 return true 13848 } 13849 // match: (Mul16 (Const16 <t> [c]) (Mul16 x (Const16 <t> [d]))) 13850 // cond: 13851 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 13852 for { 13853 _ = v.Args[1] 13854 v_0 := v.Args[0] 13855 if v_0.Op != OpConst16 { 13856 break 13857 } 13858 t := v_0.Type 13859 c := v_0.AuxInt 13860 v_1 := v.Args[1] 13861 if v_1.Op != OpMul16 { 13862 break 13863 } 13864 _ = v_1.Args[1] 13865 x := v_1.Args[0] 13866 v_1_1 := v_1.Args[1] 13867 if v_1_1.Op != OpConst16 { 13868 break 13869 } 13870 if v_1_1.Type != t { 13871 break 13872 } 13873 d := v_1_1.AuxInt 13874 v.reset(OpMul16) 13875 v0 := b.NewValue0(v.Pos, OpConst16, t) 13876 v0.AuxInt = int64(int16(c * d)) 13877 v.AddArg(v0) 13878 v.AddArg(x) 13879 return true 13880 } 13881 // match: (Mul16 (Mul16 (Const16 <t> [d]) x) (Const16 <t> [c])) 13882 // cond: 13883 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 13884 for { 13885 _ = v.Args[1] 13886 v_0 := v.Args[0] 13887 if v_0.Op != OpMul16 { 13888 break 13889 } 13890 _ = v_0.Args[1] 13891 v_0_0 := v_0.Args[0] 13892 if v_0_0.Op != OpConst16 { 13893 break 13894 } 13895 t := v_0_0.Type 13896 d := v_0_0.AuxInt 13897 x := v_0.Args[1] 13898 v_1 := v.Args[1] 13899 if v_1.Op != OpConst16 { 13900 break 13901 } 13902 if v_1.Type != t { 13903 break 13904 } 13905 c := v_1.AuxInt 13906 v.reset(OpMul16) 13907 v0 := b.NewValue0(v.Pos, OpConst16, t) 13908 v0.AuxInt = int64(int16(c * d)) 13909 v.AddArg(v0) 13910 v.AddArg(x) 13911 return true 13912 } 13913 // match: (Mul16 (Mul16 x (Const16 <t> [d])) (Const16 <t> [c])) 13914 // cond: 13915 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 13916 for { 13917 _ = v.Args[1] 13918 v_0 := v.Args[0] 13919 if v_0.Op != OpMul16 { 13920 break 13921 } 13922 _ = v_0.Args[1] 13923 x := v_0.Args[0] 13924 v_0_1 := v_0.Args[1] 13925 if v_0_1.Op != OpConst16 { 13926 break 13927 } 13928 t := v_0_1.Type 13929 d := v_0_1.AuxInt 13930 v_1 := v.Args[1] 13931 if v_1.Op != OpConst16 { 13932 break 13933 } 13934 if v_1.Type != t { 13935 break 13936 } 13937 c := v_1.AuxInt 13938 v.reset(OpMul16) 13939 v0 := b.NewValue0(v.Pos, OpConst16, t) 13940 v0.AuxInt = int64(int16(c * d)) 13941 v.AddArg(v0) 13942 v.AddArg(x) 13943 return true 13944 } 13945 return false 13946 } 13947 func rewriteValuegeneric_OpMul32_0(v *Value) bool { 13948 b := v.Block 13949 _ = b 13950 typ := &b.Func.Config.Types 13951 _ = typ 13952 // match: (Mul32 (Const32 [c]) (Const32 [d])) 13953 // cond: 13954 // result: (Const32 [int64(int32(c*d))]) 13955 for { 13956 _ = v.Args[1] 13957 v_0 := v.Args[0] 13958 if v_0.Op != OpConst32 { 13959 break 13960 } 13961 c := v_0.AuxInt 13962 v_1 := v.Args[1] 13963 if v_1.Op != OpConst32 { 13964 break 13965 } 13966 d := v_1.AuxInt 13967 v.reset(OpConst32) 13968 v.AuxInt = int64(int32(c * d)) 13969 return true 13970 } 13971 // match: (Mul32 (Const32 [d]) (Const32 [c])) 13972 // cond: 13973 // result: (Const32 [int64(int32(c*d))]) 13974 for { 13975 _ = v.Args[1] 13976 v_0 := v.Args[0] 13977 if v_0.Op != OpConst32 { 13978 break 13979 } 13980 d := v_0.AuxInt 13981 v_1 := v.Args[1] 13982 if v_1.Op != OpConst32 { 13983 break 13984 } 13985 c := v_1.AuxInt 13986 v.reset(OpConst32) 13987 v.AuxInt = int64(int32(c * d)) 13988 return true 13989 } 13990 // match: (Mul32 (Const32 [1]) x) 13991 // cond: 13992 // result: x 13993 for { 13994 _ = v.Args[1] 13995 v_0 := v.Args[0] 13996 if v_0.Op != OpConst32 { 13997 break 13998 } 13999 if v_0.AuxInt != 1 { 14000 break 14001 } 14002 x := v.Args[1] 14003 v.reset(OpCopy) 14004 v.Type = x.Type 14005 v.AddArg(x) 14006 return true 14007 } 14008 // match: (Mul32 x (Const32 [1])) 14009 // cond: 14010 // result: x 14011 for { 14012 _ = v.Args[1] 14013 x := v.Args[0] 14014 v_1 := v.Args[1] 14015 if v_1.Op != OpConst32 { 14016 break 14017 } 14018 if v_1.AuxInt != 1 { 14019 break 14020 } 14021 v.reset(OpCopy) 14022 v.Type = x.Type 14023 v.AddArg(x) 14024 return true 14025 } 14026 // match: (Mul32 (Const32 [-1]) x) 14027 // cond: 14028 // result: (Neg32 x) 14029 for { 14030 _ = v.Args[1] 14031 v_0 := v.Args[0] 14032 if v_0.Op != OpConst32 { 14033 break 14034 } 14035 if v_0.AuxInt != -1 { 14036 break 14037 } 14038 x := v.Args[1] 14039 v.reset(OpNeg32) 14040 v.AddArg(x) 14041 return true 14042 } 14043 // match: (Mul32 x (Const32 [-1])) 14044 // cond: 14045 // result: (Neg32 x) 14046 for { 14047 _ = v.Args[1] 14048 x := v.Args[0] 14049 v_1 := v.Args[1] 14050 if v_1.Op != OpConst32 { 14051 break 14052 } 14053 if v_1.AuxInt != -1 { 14054 break 14055 } 14056 v.reset(OpNeg32) 14057 v.AddArg(x) 14058 return true 14059 } 14060 // match: (Mul32 <t> n (Const32 [c])) 14061 // cond: isPowerOfTwo(c) 14062 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14063 for { 14064 t := v.Type 14065 _ = v.Args[1] 14066 n := v.Args[0] 14067 v_1 := v.Args[1] 14068 if v_1.Op != OpConst32 { 14069 break 14070 } 14071 c := v_1.AuxInt 14072 if !(isPowerOfTwo(c)) { 14073 break 14074 } 14075 v.reset(OpLsh32x64) 14076 v.Type = t 14077 v.AddArg(n) 14078 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14079 v0.AuxInt = log2(c) 14080 v.AddArg(v0) 14081 return true 14082 } 14083 // match: (Mul32 <t> (Const32 [c]) n) 14084 // cond: isPowerOfTwo(c) 14085 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14086 for { 14087 t := v.Type 14088 _ = v.Args[1] 14089 v_0 := v.Args[0] 14090 if v_0.Op != OpConst32 { 14091 break 14092 } 14093 c := v_0.AuxInt 14094 n := v.Args[1] 14095 if !(isPowerOfTwo(c)) { 14096 break 14097 } 14098 v.reset(OpLsh32x64) 14099 v.Type = t 14100 v.AddArg(n) 14101 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14102 v0.AuxInt = log2(c) 14103 v.AddArg(v0) 14104 return true 14105 } 14106 // match: (Mul32 <t> n (Const32 [c])) 14107 // cond: t.IsSigned() && isPowerOfTwo(-c) 14108 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14109 for { 14110 t := v.Type 14111 _ = v.Args[1] 14112 n := v.Args[0] 14113 v_1 := v.Args[1] 14114 if v_1.Op != OpConst32 { 14115 break 14116 } 14117 c := v_1.AuxInt 14118 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14119 break 14120 } 14121 v.reset(OpNeg32) 14122 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14123 v0.AddArg(n) 14124 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14125 v1.AuxInt = log2(-c) 14126 v0.AddArg(v1) 14127 v.AddArg(v0) 14128 return true 14129 } 14130 // match: (Mul32 <t> (Const32 [c]) n) 14131 // cond: t.IsSigned() && isPowerOfTwo(-c) 14132 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14133 for { 14134 t := v.Type 14135 _ = v.Args[1] 14136 v_0 := v.Args[0] 14137 if v_0.Op != OpConst32 { 14138 break 14139 } 14140 c := v_0.AuxInt 14141 n := v.Args[1] 14142 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14143 break 14144 } 14145 v.reset(OpNeg32) 14146 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14147 v0.AddArg(n) 14148 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14149 v1.AuxInt = log2(-c) 14150 v0.AddArg(v1) 14151 v.AddArg(v0) 14152 return true 14153 } 14154 return false 14155 } 14156 func rewriteValuegeneric_OpMul32_10(v *Value) bool { 14157 b := v.Block 14158 _ = b 14159 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x)) 14160 // cond: 14161 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14162 for { 14163 _ = v.Args[1] 14164 v_0 := v.Args[0] 14165 if v_0.Op != OpConst32 { 14166 break 14167 } 14168 t := v_0.Type 14169 c := v_0.AuxInt 14170 v_1 := v.Args[1] 14171 if v_1.Op != OpAdd32 { 14172 break 14173 } 14174 if v_1.Type != t { 14175 break 14176 } 14177 _ = v_1.Args[1] 14178 v_1_0 := v_1.Args[0] 14179 if v_1_0.Op != OpConst32 { 14180 break 14181 } 14182 if v_1_0.Type != t { 14183 break 14184 } 14185 d := v_1_0.AuxInt 14186 x := v_1.Args[1] 14187 v.reset(OpAdd32) 14188 v0 := b.NewValue0(v.Pos, OpConst32, t) 14189 v0.AuxInt = int64(int32(c * d)) 14190 v.AddArg(v0) 14191 v1 := b.NewValue0(v.Pos, OpMul32, t) 14192 v2 := b.NewValue0(v.Pos, OpConst32, t) 14193 v2.AuxInt = c 14194 v1.AddArg(v2) 14195 v1.AddArg(x) 14196 v.AddArg(v1) 14197 return true 14198 } 14199 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> x (Const32 <t> [d]))) 14200 // cond: 14201 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14202 for { 14203 _ = v.Args[1] 14204 v_0 := v.Args[0] 14205 if v_0.Op != OpConst32 { 14206 break 14207 } 14208 t := v_0.Type 14209 c := v_0.AuxInt 14210 v_1 := v.Args[1] 14211 if v_1.Op != OpAdd32 { 14212 break 14213 } 14214 if v_1.Type != t { 14215 break 14216 } 14217 _ = v_1.Args[1] 14218 x := v_1.Args[0] 14219 v_1_1 := v_1.Args[1] 14220 if v_1_1.Op != OpConst32 { 14221 break 14222 } 14223 if v_1_1.Type != t { 14224 break 14225 } 14226 d := v_1_1.AuxInt 14227 v.reset(OpAdd32) 14228 v0 := b.NewValue0(v.Pos, OpConst32, t) 14229 v0.AuxInt = int64(int32(c * d)) 14230 v.AddArg(v0) 14231 v1 := b.NewValue0(v.Pos, OpMul32, t) 14232 v2 := b.NewValue0(v.Pos, OpConst32, t) 14233 v2.AuxInt = c 14234 v1.AddArg(v2) 14235 v1.AddArg(x) 14236 v.AddArg(v1) 14237 return true 14238 } 14239 // match: (Mul32 (Add32 <t> (Const32 <t> [d]) x) (Const32 <t> [c])) 14240 // cond: 14241 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14242 for { 14243 _ = v.Args[1] 14244 v_0 := v.Args[0] 14245 if v_0.Op != OpAdd32 { 14246 break 14247 } 14248 t := v_0.Type 14249 _ = v_0.Args[1] 14250 v_0_0 := v_0.Args[0] 14251 if v_0_0.Op != OpConst32 { 14252 break 14253 } 14254 if v_0_0.Type != t { 14255 break 14256 } 14257 d := v_0_0.AuxInt 14258 x := v_0.Args[1] 14259 v_1 := v.Args[1] 14260 if v_1.Op != OpConst32 { 14261 break 14262 } 14263 if v_1.Type != t { 14264 break 14265 } 14266 c := v_1.AuxInt 14267 v.reset(OpAdd32) 14268 v0 := b.NewValue0(v.Pos, OpConst32, t) 14269 v0.AuxInt = int64(int32(c * d)) 14270 v.AddArg(v0) 14271 v1 := b.NewValue0(v.Pos, OpMul32, t) 14272 v2 := b.NewValue0(v.Pos, OpConst32, t) 14273 v2.AuxInt = c 14274 v1.AddArg(v2) 14275 v1.AddArg(x) 14276 v.AddArg(v1) 14277 return true 14278 } 14279 // match: (Mul32 (Add32 <t> x (Const32 <t> [d])) (Const32 <t> [c])) 14280 // cond: 14281 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14282 for { 14283 _ = v.Args[1] 14284 v_0 := v.Args[0] 14285 if v_0.Op != OpAdd32 { 14286 break 14287 } 14288 t := v_0.Type 14289 _ = v_0.Args[1] 14290 x := v_0.Args[0] 14291 v_0_1 := v_0.Args[1] 14292 if v_0_1.Op != OpConst32 { 14293 break 14294 } 14295 if v_0_1.Type != t { 14296 break 14297 } 14298 d := v_0_1.AuxInt 14299 v_1 := v.Args[1] 14300 if v_1.Op != OpConst32 { 14301 break 14302 } 14303 if v_1.Type != t { 14304 break 14305 } 14306 c := v_1.AuxInt 14307 v.reset(OpAdd32) 14308 v0 := b.NewValue0(v.Pos, OpConst32, t) 14309 v0.AuxInt = int64(int32(c * d)) 14310 v.AddArg(v0) 14311 v1 := b.NewValue0(v.Pos, OpMul32, t) 14312 v2 := b.NewValue0(v.Pos, OpConst32, t) 14313 v2.AuxInt = c 14314 v1.AddArg(v2) 14315 v1.AddArg(x) 14316 v.AddArg(v1) 14317 return true 14318 } 14319 // match: (Mul32 (Const32 [0]) _) 14320 // cond: 14321 // result: (Const32 [0]) 14322 for { 14323 _ = v.Args[1] 14324 v_0 := v.Args[0] 14325 if v_0.Op != OpConst32 { 14326 break 14327 } 14328 if v_0.AuxInt != 0 { 14329 break 14330 } 14331 v.reset(OpConst32) 14332 v.AuxInt = 0 14333 return true 14334 } 14335 // match: (Mul32 _ (Const32 [0])) 14336 // cond: 14337 // result: (Const32 [0]) 14338 for { 14339 _ = v.Args[1] 14340 v_1 := v.Args[1] 14341 if v_1.Op != OpConst32 { 14342 break 14343 } 14344 if v_1.AuxInt != 0 { 14345 break 14346 } 14347 v.reset(OpConst32) 14348 v.AuxInt = 0 14349 return true 14350 } 14351 // match: (Mul32 (Const32 <t> [c]) (Mul32 (Const32 <t> [d]) x)) 14352 // cond: 14353 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 14354 for { 14355 _ = v.Args[1] 14356 v_0 := v.Args[0] 14357 if v_0.Op != OpConst32 { 14358 break 14359 } 14360 t := v_0.Type 14361 c := v_0.AuxInt 14362 v_1 := v.Args[1] 14363 if v_1.Op != OpMul32 { 14364 break 14365 } 14366 _ = v_1.Args[1] 14367 v_1_0 := v_1.Args[0] 14368 if v_1_0.Op != OpConst32 { 14369 break 14370 } 14371 if v_1_0.Type != t { 14372 break 14373 } 14374 d := v_1_0.AuxInt 14375 x := v_1.Args[1] 14376 v.reset(OpMul32) 14377 v0 := b.NewValue0(v.Pos, OpConst32, t) 14378 v0.AuxInt = int64(int32(c * d)) 14379 v.AddArg(v0) 14380 v.AddArg(x) 14381 return true 14382 } 14383 // match: (Mul32 (Const32 <t> [c]) (Mul32 x (Const32 <t> [d]))) 14384 // cond: 14385 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 14386 for { 14387 _ = v.Args[1] 14388 v_0 := v.Args[0] 14389 if v_0.Op != OpConst32 { 14390 break 14391 } 14392 t := v_0.Type 14393 c := v_0.AuxInt 14394 v_1 := v.Args[1] 14395 if v_1.Op != OpMul32 { 14396 break 14397 } 14398 _ = v_1.Args[1] 14399 x := v_1.Args[0] 14400 v_1_1 := v_1.Args[1] 14401 if v_1_1.Op != OpConst32 { 14402 break 14403 } 14404 if v_1_1.Type != t { 14405 break 14406 } 14407 d := v_1_1.AuxInt 14408 v.reset(OpMul32) 14409 v0 := b.NewValue0(v.Pos, OpConst32, t) 14410 v0.AuxInt = int64(int32(c * d)) 14411 v.AddArg(v0) 14412 v.AddArg(x) 14413 return true 14414 } 14415 // match: (Mul32 (Mul32 (Const32 <t> [d]) x) (Const32 <t> [c])) 14416 // cond: 14417 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 14418 for { 14419 _ = v.Args[1] 14420 v_0 := v.Args[0] 14421 if v_0.Op != OpMul32 { 14422 break 14423 } 14424 _ = v_0.Args[1] 14425 v_0_0 := v_0.Args[0] 14426 if v_0_0.Op != OpConst32 { 14427 break 14428 } 14429 t := v_0_0.Type 14430 d := v_0_0.AuxInt 14431 x := v_0.Args[1] 14432 v_1 := v.Args[1] 14433 if v_1.Op != OpConst32 { 14434 break 14435 } 14436 if v_1.Type != t { 14437 break 14438 } 14439 c := v_1.AuxInt 14440 v.reset(OpMul32) 14441 v0 := b.NewValue0(v.Pos, OpConst32, t) 14442 v0.AuxInt = int64(int32(c * d)) 14443 v.AddArg(v0) 14444 v.AddArg(x) 14445 return true 14446 } 14447 // match: (Mul32 (Mul32 x (Const32 <t> [d])) (Const32 <t> [c])) 14448 // cond: 14449 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 14450 for { 14451 _ = v.Args[1] 14452 v_0 := v.Args[0] 14453 if v_0.Op != OpMul32 { 14454 break 14455 } 14456 _ = v_0.Args[1] 14457 x := v_0.Args[0] 14458 v_0_1 := v_0.Args[1] 14459 if v_0_1.Op != OpConst32 { 14460 break 14461 } 14462 t := v_0_1.Type 14463 d := v_0_1.AuxInt 14464 v_1 := v.Args[1] 14465 if v_1.Op != OpConst32 { 14466 break 14467 } 14468 if v_1.Type != t { 14469 break 14470 } 14471 c := v_1.AuxInt 14472 v.reset(OpMul32) 14473 v0 := b.NewValue0(v.Pos, OpConst32, t) 14474 v0.AuxInt = int64(int32(c * d)) 14475 v.AddArg(v0) 14476 v.AddArg(x) 14477 return true 14478 } 14479 return false 14480 } 14481 func rewriteValuegeneric_OpMul32F_0(v *Value) bool { 14482 // match: (Mul32F (Const32F [c]) (Const32F [d])) 14483 // cond: 14484 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 14485 for { 14486 _ = v.Args[1] 14487 v_0 := v.Args[0] 14488 if v_0.Op != OpConst32F { 14489 break 14490 } 14491 c := v_0.AuxInt 14492 v_1 := v.Args[1] 14493 if v_1.Op != OpConst32F { 14494 break 14495 } 14496 d := v_1.AuxInt 14497 v.reset(OpConst32F) 14498 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 14499 return true 14500 } 14501 // match: (Mul32F (Const32F [d]) (Const32F [c])) 14502 // cond: 14503 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 14504 for { 14505 _ = v.Args[1] 14506 v_0 := v.Args[0] 14507 if v_0.Op != OpConst32F { 14508 break 14509 } 14510 d := v_0.AuxInt 14511 v_1 := v.Args[1] 14512 if v_1.Op != OpConst32F { 14513 break 14514 } 14515 c := v_1.AuxInt 14516 v.reset(OpConst32F) 14517 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 14518 return true 14519 } 14520 // match: (Mul32F x (Const32F [f2i(1)])) 14521 // cond: 14522 // result: x 14523 for { 14524 _ = v.Args[1] 14525 x := v.Args[0] 14526 v_1 := v.Args[1] 14527 if v_1.Op != OpConst32F { 14528 break 14529 } 14530 if v_1.AuxInt != f2i(1) { 14531 break 14532 } 14533 v.reset(OpCopy) 14534 v.Type = x.Type 14535 v.AddArg(x) 14536 return true 14537 } 14538 // match: (Mul32F (Const32F [f2i(1)]) x) 14539 // cond: 14540 // result: x 14541 for { 14542 _ = v.Args[1] 14543 v_0 := v.Args[0] 14544 if v_0.Op != OpConst32F { 14545 break 14546 } 14547 if v_0.AuxInt != f2i(1) { 14548 break 14549 } 14550 x := v.Args[1] 14551 v.reset(OpCopy) 14552 v.Type = x.Type 14553 v.AddArg(x) 14554 return true 14555 } 14556 // match: (Mul32F x (Const32F [f2i(-1)])) 14557 // cond: 14558 // result: (Neg32F x) 14559 for { 14560 _ = v.Args[1] 14561 x := v.Args[0] 14562 v_1 := v.Args[1] 14563 if v_1.Op != OpConst32F { 14564 break 14565 } 14566 if v_1.AuxInt != f2i(-1) { 14567 break 14568 } 14569 v.reset(OpNeg32F) 14570 v.AddArg(x) 14571 return true 14572 } 14573 // match: (Mul32F (Const32F [f2i(-1)]) x) 14574 // cond: 14575 // result: (Neg32F x) 14576 for { 14577 _ = v.Args[1] 14578 v_0 := v.Args[0] 14579 if v_0.Op != OpConst32F { 14580 break 14581 } 14582 if v_0.AuxInt != f2i(-1) { 14583 break 14584 } 14585 x := v.Args[1] 14586 v.reset(OpNeg32F) 14587 v.AddArg(x) 14588 return true 14589 } 14590 // match: (Mul32F x (Const32F [f2i(2)])) 14591 // cond: 14592 // result: (Add32F x x) 14593 for { 14594 _ = v.Args[1] 14595 x := v.Args[0] 14596 v_1 := v.Args[1] 14597 if v_1.Op != OpConst32F { 14598 break 14599 } 14600 if v_1.AuxInt != f2i(2) { 14601 break 14602 } 14603 v.reset(OpAdd32F) 14604 v.AddArg(x) 14605 v.AddArg(x) 14606 return true 14607 } 14608 // match: (Mul32F (Const32F [f2i(2)]) x) 14609 // cond: 14610 // result: (Add32F x x) 14611 for { 14612 _ = v.Args[1] 14613 v_0 := v.Args[0] 14614 if v_0.Op != OpConst32F { 14615 break 14616 } 14617 if v_0.AuxInt != f2i(2) { 14618 break 14619 } 14620 x := v.Args[1] 14621 v.reset(OpAdd32F) 14622 v.AddArg(x) 14623 v.AddArg(x) 14624 return true 14625 } 14626 return false 14627 } 14628 func rewriteValuegeneric_OpMul64_0(v *Value) bool { 14629 b := v.Block 14630 _ = b 14631 typ := &b.Func.Config.Types 14632 _ = typ 14633 // match: (Mul64 (Const64 [c]) (Const64 [d])) 14634 // cond: 14635 // result: (Const64 [c*d]) 14636 for { 14637 _ = v.Args[1] 14638 v_0 := v.Args[0] 14639 if v_0.Op != OpConst64 { 14640 break 14641 } 14642 c := v_0.AuxInt 14643 v_1 := v.Args[1] 14644 if v_1.Op != OpConst64 { 14645 break 14646 } 14647 d := v_1.AuxInt 14648 v.reset(OpConst64) 14649 v.AuxInt = c * d 14650 return true 14651 } 14652 // match: (Mul64 (Const64 [d]) (Const64 [c])) 14653 // cond: 14654 // result: (Const64 [c*d]) 14655 for { 14656 _ = v.Args[1] 14657 v_0 := v.Args[0] 14658 if v_0.Op != OpConst64 { 14659 break 14660 } 14661 d := v_0.AuxInt 14662 v_1 := v.Args[1] 14663 if v_1.Op != OpConst64 { 14664 break 14665 } 14666 c := v_1.AuxInt 14667 v.reset(OpConst64) 14668 v.AuxInt = c * d 14669 return true 14670 } 14671 // match: (Mul64 (Const64 [1]) x) 14672 // cond: 14673 // result: x 14674 for { 14675 _ = v.Args[1] 14676 v_0 := v.Args[0] 14677 if v_0.Op != OpConst64 { 14678 break 14679 } 14680 if v_0.AuxInt != 1 { 14681 break 14682 } 14683 x := v.Args[1] 14684 v.reset(OpCopy) 14685 v.Type = x.Type 14686 v.AddArg(x) 14687 return true 14688 } 14689 // match: (Mul64 x (Const64 [1])) 14690 // cond: 14691 // result: x 14692 for { 14693 _ = v.Args[1] 14694 x := v.Args[0] 14695 v_1 := v.Args[1] 14696 if v_1.Op != OpConst64 { 14697 break 14698 } 14699 if v_1.AuxInt != 1 { 14700 break 14701 } 14702 v.reset(OpCopy) 14703 v.Type = x.Type 14704 v.AddArg(x) 14705 return true 14706 } 14707 // match: (Mul64 (Const64 [-1]) x) 14708 // cond: 14709 // result: (Neg64 x) 14710 for { 14711 _ = v.Args[1] 14712 v_0 := v.Args[0] 14713 if v_0.Op != OpConst64 { 14714 break 14715 } 14716 if v_0.AuxInt != -1 { 14717 break 14718 } 14719 x := v.Args[1] 14720 v.reset(OpNeg64) 14721 v.AddArg(x) 14722 return true 14723 } 14724 // match: (Mul64 x (Const64 [-1])) 14725 // cond: 14726 // result: (Neg64 x) 14727 for { 14728 _ = v.Args[1] 14729 x := v.Args[0] 14730 v_1 := v.Args[1] 14731 if v_1.Op != OpConst64 { 14732 break 14733 } 14734 if v_1.AuxInt != -1 { 14735 break 14736 } 14737 v.reset(OpNeg64) 14738 v.AddArg(x) 14739 return true 14740 } 14741 // match: (Mul64 <t> n (Const64 [c])) 14742 // cond: isPowerOfTwo(c) 14743 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14744 for { 14745 t := v.Type 14746 _ = v.Args[1] 14747 n := v.Args[0] 14748 v_1 := v.Args[1] 14749 if v_1.Op != OpConst64 { 14750 break 14751 } 14752 c := v_1.AuxInt 14753 if !(isPowerOfTwo(c)) { 14754 break 14755 } 14756 v.reset(OpLsh64x64) 14757 v.Type = t 14758 v.AddArg(n) 14759 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14760 v0.AuxInt = log2(c) 14761 v.AddArg(v0) 14762 return true 14763 } 14764 // match: (Mul64 <t> (Const64 [c]) n) 14765 // cond: isPowerOfTwo(c) 14766 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14767 for { 14768 t := v.Type 14769 _ = v.Args[1] 14770 v_0 := v.Args[0] 14771 if v_0.Op != OpConst64 { 14772 break 14773 } 14774 c := v_0.AuxInt 14775 n := v.Args[1] 14776 if !(isPowerOfTwo(c)) { 14777 break 14778 } 14779 v.reset(OpLsh64x64) 14780 v.Type = t 14781 v.AddArg(n) 14782 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14783 v0.AuxInt = log2(c) 14784 v.AddArg(v0) 14785 return true 14786 } 14787 // match: (Mul64 <t> n (Const64 [c])) 14788 // cond: t.IsSigned() && isPowerOfTwo(-c) 14789 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14790 for { 14791 t := v.Type 14792 _ = v.Args[1] 14793 n := v.Args[0] 14794 v_1 := v.Args[1] 14795 if v_1.Op != OpConst64 { 14796 break 14797 } 14798 c := v_1.AuxInt 14799 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14800 break 14801 } 14802 v.reset(OpNeg64) 14803 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 14804 v0.AddArg(n) 14805 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14806 v1.AuxInt = log2(-c) 14807 v0.AddArg(v1) 14808 v.AddArg(v0) 14809 return true 14810 } 14811 // match: (Mul64 <t> (Const64 [c]) n) 14812 // cond: t.IsSigned() && isPowerOfTwo(-c) 14813 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14814 for { 14815 t := v.Type 14816 _ = v.Args[1] 14817 v_0 := v.Args[0] 14818 if v_0.Op != OpConst64 { 14819 break 14820 } 14821 c := v_0.AuxInt 14822 n := v.Args[1] 14823 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14824 break 14825 } 14826 v.reset(OpNeg64) 14827 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 14828 v0.AddArg(n) 14829 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14830 v1.AuxInt = log2(-c) 14831 v0.AddArg(v1) 14832 v.AddArg(v0) 14833 return true 14834 } 14835 return false 14836 } 14837 func rewriteValuegeneric_OpMul64_10(v *Value) bool { 14838 b := v.Block 14839 _ = b 14840 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x)) 14841 // cond: 14842 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 14843 for { 14844 _ = v.Args[1] 14845 v_0 := v.Args[0] 14846 if v_0.Op != OpConst64 { 14847 break 14848 } 14849 t := v_0.Type 14850 c := v_0.AuxInt 14851 v_1 := v.Args[1] 14852 if v_1.Op != OpAdd64 { 14853 break 14854 } 14855 if v_1.Type != t { 14856 break 14857 } 14858 _ = v_1.Args[1] 14859 v_1_0 := v_1.Args[0] 14860 if v_1_0.Op != OpConst64 { 14861 break 14862 } 14863 if v_1_0.Type != t { 14864 break 14865 } 14866 d := v_1_0.AuxInt 14867 x := v_1.Args[1] 14868 v.reset(OpAdd64) 14869 v0 := b.NewValue0(v.Pos, OpConst64, t) 14870 v0.AuxInt = c * d 14871 v.AddArg(v0) 14872 v1 := b.NewValue0(v.Pos, OpMul64, t) 14873 v2 := b.NewValue0(v.Pos, OpConst64, t) 14874 v2.AuxInt = c 14875 v1.AddArg(v2) 14876 v1.AddArg(x) 14877 v.AddArg(v1) 14878 return true 14879 } 14880 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> x (Const64 <t> [d]))) 14881 // cond: 14882 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 14883 for { 14884 _ = v.Args[1] 14885 v_0 := v.Args[0] 14886 if v_0.Op != OpConst64 { 14887 break 14888 } 14889 t := v_0.Type 14890 c := v_0.AuxInt 14891 v_1 := v.Args[1] 14892 if v_1.Op != OpAdd64 { 14893 break 14894 } 14895 if v_1.Type != t { 14896 break 14897 } 14898 _ = v_1.Args[1] 14899 x := v_1.Args[0] 14900 v_1_1 := v_1.Args[1] 14901 if v_1_1.Op != OpConst64 { 14902 break 14903 } 14904 if v_1_1.Type != t { 14905 break 14906 } 14907 d := v_1_1.AuxInt 14908 v.reset(OpAdd64) 14909 v0 := b.NewValue0(v.Pos, OpConst64, t) 14910 v0.AuxInt = c * d 14911 v.AddArg(v0) 14912 v1 := b.NewValue0(v.Pos, OpMul64, t) 14913 v2 := b.NewValue0(v.Pos, OpConst64, t) 14914 v2.AuxInt = c 14915 v1.AddArg(v2) 14916 v1.AddArg(x) 14917 v.AddArg(v1) 14918 return true 14919 } 14920 // match: (Mul64 (Add64 <t> (Const64 <t> [d]) x) (Const64 <t> [c])) 14921 // cond: 14922 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 14923 for { 14924 _ = v.Args[1] 14925 v_0 := v.Args[0] 14926 if v_0.Op != OpAdd64 { 14927 break 14928 } 14929 t := v_0.Type 14930 _ = v_0.Args[1] 14931 v_0_0 := v_0.Args[0] 14932 if v_0_0.Op != OpConst64 { 14933 break 14934 } 14935 if v_0_0.Type != t { 14936 break 14937 } 14938 d := v_0_0.AuxInt 14939 x := v_0.Args[1] 14940 v_1 := v.Args[1] 14941 if v_1.Op != OpConst64 { 14942 break 14943 } 14944 if v_1.Type != t { 14945 break 14946 } 14947 c := v_1.AuxInt 14948 v.reset(OpAdd64) 14949 v0 := b.NewValue0(v.Pos, OpConst64, t) 14950 v0.AuxInt = c * d 14951 v.AddArg(v0) 14952 v1 := b.NewValue0(v.Pos, OpMul64, t) 14953 v2 := b.NewValue0(v.Pos, OpConst64, t) 14954 v2.AuxInt = c 14955 v1.AddArg(v2) 14956 v1.AddArg(x) 14957 v.AddArg(v1) 14958 return true 14959 } 14960 // match: (Mul64 (Add64 <t> x (Const64 <t> [d])) (Const64 <t> [c])) 14961 // cond: 14962 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 14963 for { 14964 _ = v.Args[1] 14965 v_0 := v.Args[0] 14966 if v_0.Op != OpAdd64 { 14967 break 14968 } 14969 t := v_0.Type 14970 _ = v_0.Args[1] 14971 x := v_0.Args[0] 14972 v_0_1 := v_0.Args[1] 14973 if v_0_1.Op != OpConst64 { 14974 break 14975 } 14976 if v_0_1.Type != t { 14977 break 14978 } 14979 d := v_0_1.AuxInt 14980 v_1 := v.Args[1] 14981 if v_1.Op != OpConst64 { 14982 break 14983 } 14984 if v_1.Type != t { 14985 break 14986 } 14987 c := v_1.AuxInt 14988 v.reset(OpAdd64) 14989 v0 := b.NewValue0(v.Pos, OpConst64, t) 14990 v0.AuxInt = c * d 14991 v.AddArg(v0) 14992 v1 := b.NewValue0(v.Pos, OpMul64, t) 14993 v2 := b.NewValue0(v.Pos, OpConst64, t) 14994 v2.AuxInt = c 14995 v1.AddArg(v2) 14996 v1.AddArg(x) 14997 v.AddArg(v1) 14998 return true 14999 } 15000 // match: (Mul64 (Const64 [0]) _) 15001 // cond: 15002 // result: (Const64 [0]) 15003 for { 15004 _ = v.Args[1] 15005 v_0 := v.Args[0] 15006 if v_0.Op != OpConst64 { 15007 break 15008 } 15009 if v_0.AuxInt != 0 { 15010 break 15011 } 15012 v.reset(OpConst64) 15013 v.AuxInt = 0 15014 return true 15015 } 15016 // match: (Mul64 _ (Const64 [0])) 15017 // cond: 15018 // result: (Const64 [0]) 15019 for { 15020 _ = v.Args[1] 15021 v_1 := v.Args[1] 15022 if v_1.Op != OpConst64 { 15023 break 15024 } 15025 if v_1.AuxInt != 0 { 15026 break 15027 } 15028 v.reset(OpConst64) 15029 v.AuxInt = 0 15030 return true 15031 } 15032 // match: (Mul64 (Const64 <t> [c]) (Mul64 (Const64 <t> [d]) x)) 15033 // cond: 15034 // result: (Mul64 (Const64 <t> [c*d]) x) 15035 for { 15036 _ = v.Args[1] 15037 v_0 := v.Args[0] 15038 if v_0.Op != OpConst64 { 15039 break 15040 } 15041 t := v_0.Type 15042 c := v_0.AuxInt 15043 v_1 := v.Args[1] 15044 if v_1.Op != OpMul64 { 15045 break 15046 } 15047 _ = v_1.Args[1] 15048 v_1_0 := v_1.Args[0] 15049 if v_1_0.Op != OpConst64 { 15050 break 15051 } 15052 if v_1_0.Type != t { 15053 break 15054 } 15055 d := v_1_0.AuxInt 15056 x := v_1.Args[1] 15057 v.reset(OpMul64) 15058 v0 := b.NewValue0(v.Pos, OpConst64, t) 15059 v0.AuxInt = c * d 15060 v.AddArg(v0) 15061 v.AddArg(x) 15062 return true 15063 } 15064 // match: (Mul64 (Const64 <t> [c]) (Mul64 x (Const64 <t> [d]))) 15065 // cond: 15066 // result: (Mul64 (Const64 <t> [c*d]) x) 15067 for { 15068 _ = v.Args[1] 15069 v_0 := v.Args[0] 15070 if v_0.Op != OpConst64 { 15071 break 15072 } 15073 t := v_0.Type 15074 c := v_0.AuxInt 15075 v_1 := v.Args[1] 15076 if v_1.Op != OpMul64 { 15077 break 15078 } 15079 _ = v_1.Args[1] 15080 x := v_1.Args[0] 15081 v_1_1 := v_1.Args[1] 15082 if v_1_1.Op != OpConst64 { 15083 break 15084 } 15085 if v_1_1.Type != t { 15086 break 15087 } 15088 d := v_1_1.AuxInt 15089 v.reset(OpMul64) 15090 v0 := b.NewValue0(v.Pos, OpConst64, t) 15091 v0.AuxInt = c * d 15092 v.AddArg(v0) 15093 v.AddArg(x) 15094 return true 15095 } 15096 // match: (Mul64 (Mul64 (Const64 <t> [d]) x) (Const64 <t> [c])) 15097 // cond: 15098 // result: (Mul64 (Const64 <t> [c*d]) x) 15099 for { 15100 _ = v.Args[1] 15101 v_0 := v.Args[0] 15102 if v_0.Op != OpMul64 { 15103 break 15104 } 15105 _ = v_0.Args[1] 15106 v_0_0 := v_0.Args[0] 15107 if v_0_0.Op != OpConst64 { 15108 break 15109 } 15110 t := v_0_0.Type 15111 d := v_0_0.AuxInt 15112 x := v_0.Args[1] 15113 v_1 := v.Args[1] 15114 if v_1.Op != OpConst64 { 15115 break 15116 } 15117 if v_1.Type != t { 15118 break 15119 } 15120 c := v_1.AuxInt 15121 v.reset(OpMul64) 15122 v0 := b.NewValue0(v.Pos, OpConst64, t) 15123 v0.AuxInt = c * d 15124 v.AddArg(v0) 15125 v.AddArg(x) 15126 return true 15127 } 15128 // match: (Mul64 (Mul64 x (Const64 <t> [d])) (Const64 <t> [c])) 15129 // cond: 15130 // result: (Mul64 (Const64 <t> [c*d]) x) 15131 for { 15132 _ = v.Args[1] 15133 v_0 := v.Args[0] 15134 if v_0.Op != OpMul64 { 15135 break 15136 } 15137 _ = v_0.Args[1] 15138 x := v_0.Args[0] 15139 v_0_1 := v_0.Args[1] 15140 if v_0_1.Op != OpConst64 { 15141 break 15142 } 15143 t := v_0_1.Type 15144 d := v_0_1.AuxInt 15145 v_1 := v.Args[1] 15146 if v_1.Op != OpConst64 { 15147 break 15148 } 15149 if v_1.Type != t { 15150 break 15151 } 15152 c := v_1.AuxInt 15153 v.reset(OpMul64) 15154 v0 := b.NewValue0(v.Pos, OpConst64, t) 15155 v0.AuxInt = c * d 15156 v.AddArg(v0) 15157 v.AddArg(x) 15158 return true 15159 } 15160 return false 15161 } 15162 func rewriteValuegeneric_OpMul64F_0(v *Value) bool { 15163 // match: (Mul64F (Const64F [c]) (Const64F [d])) 15164 // cond: 15165 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15166 for { 15167 _ = v.Args[1] 15168 v_0 := v.Args[0] 15169 if v_0.Op != OpConst64F { 15170 break 15171 } 15172 c := v_0.AuxInt 15173 v_1 := v.Args[1] 15174 if v_1.Op != OpConst64F { 15175 break 15176 } 15177 d := v_1.AuxInt 15178 v.reset(OpConst64F) 15179 v.AuxInt = f2i(i2f(c) * i2f(d)) 15180 return true 15181 } 15182 // match: (Mul64F (Const64F [d]) (Const64F [c])) 15183 // cond: 15184 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15185 for { 15186 _ = v.Args[1] 15187 v_0 := v.Args[0] 15188 if v_0.Op != OpConst64F { 15189 break 15190 } 15191 d := v_0.AuxInt 15192 v_1 := v.Args[1] 15193 if v_1.Op != OpConst64F { 15194 break 15195 } 15196 c := v_1.AuxInt 15197 v.reset(OpConst64F) 15198 v.AuxInt = f2i(i2f(c) * i2f(d)) 15199 return true 15200 } 15201 // match: (Mul64F x (Const64F [f2i(1)])) 15202 // cond: 15203 // result: x 15204 for { 15205 _ = v.Args[1] 15206 x := v.Args[0] 15207 v_1 := v.Args[1] 15208 if v_1.Op != OpConst64F { 15209 break 15210 } 15211 if v_1.AuxInt != f2i(1) { 15212 break 15213 } 15214 v.reset(OpCopy) 15215 v.Type = x.Type 15216 v.AddArg(x) 15217 return true 15218 } 15219 // match: (Mul64F (Const64F [f2i(1)]) x) 15220 // cond: 15221 // result: x 15222 for { 15223 _ = v.Args[1] 15224 v_0 := v.Args[0] 15225 if v_0.Op != OpConst64F { 15226 break 15227 } 15228 if v_0.AuxInt != f2i(1) { 15229 break 15230 } 15231 x := v.Args[1] 15232 v.reset(OpCopy) 15233 v.Type = x.Type 15234 v.AddArg(x) 15235 return true 15236 } 15237 // match: (Mul64F x (Const64F [f2i(-1)])) 15238 // cond: 15239 // result: (Neg64F x) 15240 for { 15241 _ = v.Args[1] 15242 x := v.Args[0] 15243 v_1 := v.Args[1] 15244 if v_1.Op != OpConst64F { 15245 break 15246 } 15247 if v_1.AuxInt != f2i(-1) { 15248 break 15249 } 15250 v.reset(OpNeg64F) 15251 v.AddArg(x) 15252 return true 15253 } 15254 // match: (Mul64F (Const64F [f2i(-1)]) x) 15255 // cond: 15256 // result: (Neg64F x) 15257 for { 15258 _ = v.Args[1] 15259 v_0 := v.Args[0] 15260 if v_0.Op != OpConst64F { 15261 break 15262 } 15263 if v_0.AuxInt != f2i(-1) { 15264 break 15265 } 15266 x := v.Args[1] 15267 v.reset(OpNeg64F) 15268 v.AddArg(x) 15269 return true 15270 } 15271 // match: (Mul64F x (Const64F [f2i(2)])) 15272 // cond: 15273 // result: (Add64F x x) 15274 for { 15275 _ = v.Args[1] 15276 x := v.Args[0] 15277 v_1 := v.Args[1] 15278 if v_1.Op != OpConst64F { 15279 break 15280 } 15281 if v_1.AuxInt != f2i(2) { 15282 break 15283 } 15284 v.reset(OpAdd64F) 15285 v.AddArg(x) 15286 v.AddArg(x) 15287 return true 15288 } 15289 // match: (Mul64F (Const64F [f2i(2)]) x) 15290 // cond: 15291 // result: (Add64F x x) 15292 for { 15293 _ = v.Args[1] 15294 v_0 := v.Args[0] 15295 if v_0.Op != OpConst64F { 15296 break 15297 } 15298 if v_0.AuxInt != f2i(2) { 15299 break 15300 } 15301 x := v.Args[1] 15302 v.reset(OpAdd64F) 15303 v.AddArg(x) 15304 v.AddArg(x) 15305 return true 15306 } 15307 return false 15308 } 15309 func rewriteValuegeneric_OpMul8_0(v *Value) bool { 15310 b := v.Block 15311 _ = b 15312 typ := &b.Func.Config.Types 15313 _ = typ 15314 // match: (Mul8 (Const8 [c]) (Const8 [d])) 15315 // cond: 15316 // result: (Const8 [int64(int8(c*d))]) 15317 for { 15318 _ = v.Args[1] 15319 v_0 := v.Args[0] 15320 if v_0.Op != OpConst8 { 15321 break 15322 } 15323 c := v_0.AuxInt 15324 v_1 := v.Args[1] 15325 if v_1.Op != OpConst8 { 15326 break 15327 } 15328 d := v_1.AuxInt 15329 v.reset(OpConst8) 15330 v.AuxInt = int64(int8(c * d)) 15331 return true 15332 } 15333 // match: (Mul8 (Const8 [d]) (Const8 [c])) 15334 // cond: 15335 // result: (Const8 [int64(int8(c*d))]) 15336 for { 15337 _ = v.Args[1] 15338 v_0 := v.Args[0] 15339 if v_0.Op != OpConst8 { 15340 break 15341 } 15342 d := v_0.AuxInt 15343 v_1 := v.Args[1] 15344 if v_1.Op != OpConst8 { 15345 break 15346 } 15347 c := v_1.AuxInt 15348 v.reset(OpConst8) 15349 v.AuxInt = int64(int8(c * d)) 15350 return true 15351 } 15352 // match: (Mul8 (Const8 [1]) x) 15353 // cond: 15354 // result: x 15355 for { 15356 _ = v.Args[1] 15357 v_0 := v.Args[0] 15358 if v_0.Op != OpConst8 { 15359 break 15360 } 15361 if v_0.AuxInt != 1 { 15362 break 15363 } 15364 x := v.Args[1] 15365 v.reset(OpCopy) 15366 v.Type = x.Type 15367 v.AddArg(x) 15368 return true 15369 } 15370 // match: (Mul8 x (Const8 [1])) 15371 // cond: 15372 // result: x 15373 for { 15374 _ = v.Args[1] 15375 x := v.Args[0] 15376 v_1 := v.Args[1] 15377 if v_1.Op != OpConst8 { 15378 break 15379 } 15380 if v_1.AuxInt != 1 { 15381 break 15382 } 15383 v.reset(OpCopy) 15384 v.Type = x.Type 15385 v.AddArg(x) 15386 return true 15387 } 15388 // match: (Mul8 (Const8 [-1]) x) 15389 // cond: 15390 // result: (Neg8 x) 15391 for { 15392 _ = v.Args[1] 15393 v_0 := v.Args[0] 15394 if v_0.Op != OpConst8 { 15395 break 15396 } 15397 if v_0.AuxInt != -1 { 15398 break 15399 } 15400 x := v.Args[1] 15401 v.reset(OpNeg8) 15402 v.AddArg(x) 15403 return true 15404 } 15405 // match: (Mul8 x (Const8 [-1])) 15406 // cond: 15407 // result: (Neg8 x) 15408 for { 15409 _ = v.Args[1] 15410 x := v.Args[0] 15411 v_1 := v.Args[1] 15412 if v_1.Op != OpConst8 { 15413 break 15414 } 15415 if v_1.AuxInt != -1 { 15416 break 15417 } 15418 v.reset(OpNeg8) 15419 v.AddArg(x) 15420 return true 15421 } 15422 // match: (Mul8 <t> n (Const8 [c])) 15423 // cond: isPowerOfTwo(c) 15424 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15425 for { 15426 t := v.Type 15427 _ = v.Args[1] 15428 n := v.Args[0] 15429 v_1 := v.Args[1] 15430 if v_1.Op != OpConst8 { 15431 break 15432 } 15433 c := v_1.AuxInt 15434 if !(isPowerOfTwo(c)) { 15435 break 15436 } 15437 v.reset(OpLsh8x64) 15438 v.Type = t 15439 v.AddArg(n) 15440 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15441 v0.AuxInt = log2(c) 15442 v.AddArg(v0) 15443 return true 15444 } 15445 // match: (Mul8 <t> (Const8 [c]) n) 15446 // cond: isPowerOfTwo(c) 15447 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15448 for { 15449 t := v.Type 15450 _ = v.Args[1] 15451 v_0 := v.Args[0] 15452 if v_0.Op != OpConst8 { 15453 break 15454 } 15455 c := v_0.AuxInt 15456 n := v.Args[1] 15457 if !(isPowerOfTwo(c)) { 15458 break 15459 } 15460 v.reset(OpLsh8x64) 15461 v.Type = t 15462 v.AddArg(n) 15463 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15464 v0.AuxInt = log2(c) 15465 v.AddArg(v0) 15466 return true 15467 } 15468 // match: (Mul8 <t> n (Const8 [c])) 15469 // cond: t.IsSigned() && isPowerOfTwo(-c) 15470 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15471 for { 15472 t := v.Type 15473 _ = v.Args[1] 15474 n := v.Args[0] 15475 v_1 := v.Args[1] 15476 if v_1.Op != OpConst8 { 15477 break 15478 } 15479 c := v_1.AuxInt 15480 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15481 break 15482 } 15483 v.reset(OpNeg8) 15484 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 15485 v0.AddArg(n) 15486 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15487 v1.AuxInt = log2(-c) 15488 v0.AddArg(v1) 15489 v.AddArg(v0) 15490 return true 15491 } 15492 // match: (Mul8 <t> (Const8 [c]) n) 15493 // cond: t.IsSigned() && isPowerOfTwo(-c) 15494 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15495 for { 15496 t := v.Type 15497 _ = v.Args[1] 15498 v_0 := v.Args[0] 15499 if v_0.Op != OpConst8 { 15500 break 15501 } 15502 c := v_0.AuxInt 15503 n := v.Args[1] 15504 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15505 break 15506 } 15507 v.reset(OpNeg8) 15508 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 15509 v0.AddArg(n) 15510 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15511 v1.AuxInt = log2(-c) 15512 v0.AddArg(v1) 15513 v.AddArg(v0) 15514 return true 15515 } 15516 return false 15517 } 15518 func rewriteValuegeneric_OpMul8_10(v *Value) bool { 15519 b := v.Block 15520 _ = b 15521 // match: (Mul8 (Const8 [0]) _) 15522 // cond: 15523 // result: (Const8 [0]) 15524 for { 15525 _ = v.Args[1] 15526 v_0 := v.Args[0] 15527 if v_0.Op != OpConst8 { 15528 break 15529 } 15530 if v_0.AuxInt != 0 { 15531 break 15532 } 15533 v.reset(OpConst8) 15534 v.AuxInt = 0 15535 return true 15536 } 15537 // match: (Mul8 _ (Const8 [0])) 15538 // cond: 15539 // result: (Const8 [0]) 15540 for { 15541 _ = v.Args[1] 15542 v_1 := v.Args[1] 15543 if v_1.Op != OpConst8 { 15544 break 15545 } 15546 if v_1.AuxInt != 0 { 15547 break 15548 } 15549 v.reset(OpConst8) 15550 v.AuxInt = 0 15551 return true 15552 } 15553 // match: (Mul8 (Const8 <t> [c]) (Mul8 (Const8 <t> [d]) x)) 15554 // cond: 15555 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 15556 for { 15557 _ = v.Args[1] 15558 v_0 := v.Args[0] 15559 if v_0.Op != OpConst8 { 15560 break 15561 } 15562 t := v_0.Type 15563 c := v_0.AuxInt 15564 v_1 := v.Args[1] 15565 if v_1.Op != OpMul8 { 15566 break 15567 } 15568 _ = v_1.Args[1] 15569 v_1_0 := v_1.Args[0] 15570 if v_1_0.Op != OpConst8 { 15571 break 15572 } 15573 if v_1_0.Type != t { 15574 break 15575 } 15576 d := v_1_0.AuxInt 15577 x := v_1.Args[1] 15578 v.reset(OpMul8) 15579 v0 := b.NewValue0(v.Pos, OpConst8, t) 15580 v0.AuxInt = int64(int8(c * d)) 15581 v.AddArg(v0) 15582 v.AddArg(x) 15583 return true 15584 } 15585 // match: (Mul8 (Const8 <t> [c]) (Mul8 x (Const8 <t> [d]))) 15586 // cond: 15587 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 15588 for { 15589 _ = v.Args[1] 15590 v_0 := v.Args[0] 15591 if v_0.Op != OpConst8 { 15592 break 15593 } 15594 t := v_0.Type 15595 c := v_0.AuxInt 15596 v_1 := v.Args[1] 15597 if v_1.Op != OpMul8 { 15598 break 15599 } 15600 _ = v_1.Args[1] 15601 x := v_1.Args[0] 15602 v_1_1 := v_1.Args[1] 15603 if v_1_1.Op != OpConst8 { 15604 break 15605 } 15606 if v_1_1.Type != t { 15607 break 15608 } 15609 d := v_1_1.AuxInt 15610 v.reset(OpMul8) 15611 v0 := b.NewValue0(v.Pos, OpConst8, t) 15612 v0.AuxInt = int64(int8(c * d)) 15613 v.AddArg(v0) 15614 v.AddArg(x) 15615 return true 15616 } 15617 // match: (Mul8 (Mul8 (Const8 <t> [d]) x) (Const8 <t> [c])) 15618 // cond: 15619 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 15620 for { 15621 _ = v.Args[1] 15622 v_0 := v.Args[0] 15623 if v_0.Op != OpMul8 { 15624 break 15625 } 15626 _ = v_0.Args[1] 15627 v_0_0 := v_0.Args[0] 15628 if v_0_0.Op != OpConst8 { 15629 break 15630 } 15631 t := v_0_0.Type 15632 d := v_0_0.AuxInt 15633 x := v_0.Args[1] 15634 v_1 := v.Args[1] 15635 if v_1.Op != OpConst8 { 15636 break 15637 } 15638 if v_1.Type != t { 15639 break 15640 } 15641 c := v_1.AuxInt 15642 v.reset(OpMul8) 15643 v0 := b.NewValue0(v.Pos, OpConst8, t) 15644 v0.AuxInt = int64(int8(c * d)) 15645 v.AddArg(v0) 15646 v.AddArg(x) 15647 return true 15648 } 15649 // match: (Mul8 (Mul8 x (Const8 <t> [d])) (Const8 <t> [c])) 15650 // cond: 15651 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 15652 for { 15653 _ = v.Args[1] 15654 v_0 := v.Args[0] 15655 if v_0.Op != OpMul8 { 15656 break 15657 } 15658 _ = v_0.Args[1] 15659 x := v_0.Args[0] 15660 v_0_1 := v_0.Args[1] 15661 if v_0_1.Op != OpConst8 { 15662 break 15663 } 15664 t := v_0_1.Type 15665 d := v_0_1.AuxInt 15666 v_1 := v.Args[1] 15667 if v_1.Op != OpConst8 { 15668 break 15669 } 15670 if v_1.Type != t { 15671 break 15672 } 15673 c := v_1.AuxInt 15674 v.reset(OpMul8) 15675 v0 := b.NewValue0(v.Pos, OpConst8, t) 15676 v0.AuxInt = int64(int8(c * d)) 15677 v.AddArg(v0) 15678 v.AddArg(x) 15679 return true 15680 } 15681 return false 15682 } 15683 func rewriteValuegeneric_OpNeg16_0(v *Value) bool { 15684 // match: (Neg16 (Const16 [c])) 15685 // cond: 15686 // result: (Const16 [int64(-int16(c))]) 15687 for { 15688 v_0 := v.Args[0] 15689 if v_0.Op != OpConst16 { 15690 break 15691 } 15692 c := v_0.AuxInt 15693 v.reset(OpConst16) 15694 v.AuxInt = int64(-int16(c)) 15695 return true 15696 } 15697 // match: (Neg16 (Sub16 x y)) 15698 // cond: 15699 // result: (Sub16 y x) 15700 for { 15701 v_0 := v.Args[0] 15702 if v_0.Op != OpSub16 { 15703 break 15704 } 15705 _ = v_0.Args[1] 15706 x := v_0.Args[0] 15707 y := v_0.Args[1] 15708 v.reset(OpSub16) 15709 v.AddArg(y) 15710 v.AddArg(x) 15711 return true 15712 } 15713 return false 15714 } 15715 func rewriteValuegeneric_OpNeg32_0(v *Value) bool { 15716 // match: (Neg32 (Const32 [c])) 15717 // cond: 15718 // result: (Const32 [int64(-int32(c))]) 15719 for { 15720 v_0 := v.Args[0] 15721 if v_0.Op != OpConst32 { 15722 break 15723 } 15724 c := v_0.AuxInt 15725 v.reset(OpConst32) 15726 v.AuxInt = int64(-int32(c)) 15727 return true 15728 } 15729 // match: (Neg32 (Sub32 x y)) 15730 // cond: 15731 // result: (Sub32 y x) 15732 for { 15733 v_0 := v.Args[0] 15734 if v_0.Op != OpSub32 { 15735 break 15736 } 15737 _ = v_0.Args[1] 15738 x := v_0.Args[0] 15739 y := v_0.Args[1] 15740 v.reset(OpSub32) 15741 v.AddArg(y) 15742 v.AddArg(x) 15743 return true 15744 } 15745 return false 15746 } 15747 func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { 15748 // match: (Neg32F (Const32F [c])) 15749 // cond: i2f(c) != 0 15750 // result: (Const32F [f2i(-i2f(c))]) 15751 for { 15752 v_0 := v.Args[0] 15753 if v_0.Op != OpConst32F { 15754 break 15755 } 15756 c := v_0.AuxInt 15757 if !(i2f(c) != 0) { 15758 break 15759 } 15760 v.reset(OpConst32F) 15761 v.AuxInt = f2i(-i2f(c)) 15762 return true 15763 } 15764 return false 15765 } 15766 func rewriteValuegeneric_OpNeg64_0(v *Value) bool { 15767 // match: (Neg64 (Const64 [c])) 15768 // cond: 15769 // result: (Const64 [-c]) 15770 for { 15771 v_0 := v.Args[0] 15772 if v_0.Op != OpConst64 { 15773 break 15774 } 15775 c := v_0.AuxInt 15776 v.reset(OpConst64) 15777 v.AuxInt = -c 15778 return true 15779 } 15780 // match: (Neg64 (Sub64 x y)) 15781 // cond: 15782 // result: (Sub64 y x) 15783 for { 15784 v_0 := v.Args[0] 15785 if v_0.Op != OpSub64 { 15786 break 15787 } 15788 _ = v_0.Args[1] 15789 x := v_0.Args[0] 15790 y := v_0.Args[1] 15791 v.reset(OpSub64) 15792 v.AddArg(y) 15793 v.AddArg(x) 15794 return true 15795 } 15796 return false 15797 } 15798 func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { 15799 // match: (Neg64F (Const64F [c])) 15800 // cond: i2f(c) != 0 15801 // result: (Const64F [f2i(-i2f(c))]) 15802 for { 15803 v_0 := v.Args[0] 15804 if v_0.Op != OpConst64F { 15805 break 15806 } 15807 c := v_0.AuxInt 15808 if !(i2f(c) != 0) { 15809 break 15810 } 15811 v.reset(OpConst64F) 15812 v.AuxInt = f2i(-i2f(c)) 15813 return true 15814 } 15815 return false 15816 } 15817 func rewriteValuegeneric_OpNeg8_0(v *Value) bool { 15818 // match: (Neg8 (Const8 [c])) 15819 // cond: 15820 // result: (Const8 [int64( -int8(c))]) 15821 for { 15822 v_0 := v.Args[0] 15823 if v_0.Op != OpConst8 { 15824 break 15825 } 15826 c := v_0.AuxInt 15827 v.reset(OpConst8) 15828 v.AuxInt = int64(-int8(c)) 15829 return true 15830 } 15831 // match: (Neg8 (Sub8 x y)) 15832 // cond: 15833 // result: (Sub8 y x) 15834 for { 15835 v_0 := v.Args[0] 15836 if v_0.Op != OpSub8 { 15837 break 15838 } 15839 _ = v_0.Args[1] 15840 x := v_0.Args[0] 15841 y := v_0.Args[1] 15842 v.reset(OpSub8) 15843 v.AddArg(y) 15844 v.AddArg(x) 15845 return true 15846 } 15847 return false 15848 } 15849 func rewriteValuegeneric_OpNeq16_0(v *Value) bool { 15850 b := v.Block 15851 _ = b 15852 // match: (Neq16 x x) 15853 // cond: 15854 // result: (ConstBool [0]) 15855 for { 15856 _ = v.Args[1] 15857 x := v.Args[0] 15858 if x != v.Args[1] { 15859 break 15860 } 15861 v.reset(OpConstBool) 15862 v.AuxInt = 0 15863 return true 15864 } 15865 // match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 15866 // cond: 15867 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 15868 for { 15869 _ = v.Args[1] 15870 v_0 := v.Args[0] 15871 if v_0.Op != OpConst16 { 15872 break 15873 } 15874 t := v_0.Type 15875 c := v_0.AuxInt 15876 v_1 := v.Args[1] 15877 if v_1.Op != OpAdd16 { 15878 break 15879 } 15880 _ = v_1.Args[1] 15881 v_1_0 := v_1.Args[0] 15882 if v_1_0.Op != OpConst16 { 15883 break 15884 } 15885 if v_1_0.Type != t { 15886 break 15887 } 15888 d := v_1_0.AuxInt 15889 x := v_1.Args[1] 15890 v.reset(OpNeq16) 15891 v0 := b.NewValue0(v.Pos, OpConst16, t) 15892 v0.AuxInt = int64(int16(c - d)) 15893 v.AddArg(v0) 15894 v.AddArg(x) 15895 return true 15896 } 15897 // match: (Neq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 15898 // cond: 15899 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 15900 for { 15901 _ = v.Args[1] 15902 v_0 := v.Args[0] 15903 if v_0.Op != OpConst16 { 15904 break 15905 } 15906 t := v_0.Type 15907 c := v_0.AuxInt 15908 v_1 := v.Args[1] 15909 if v_1.Op != OpAdd16 { 15910 break 15911 } 15912 _ = v_1.Args[1] 15913 x := v_1.Args[0] 15914 v_1_1 := v_1.Args[1] 15915 if v_1_1.Op != OpConst16 { 15916 break 15917 } 15918 if v_1_1.Type != t { 15919 break 15920 } 15921 d := v_1_1.AuxInt 15922 v.reset(OpNeq16) 15923 v0 := b.NewValue0(v.Pos, OpConst16, t) 15924 v0.AuxInt = int64(int16(c - d)) 15925 v.AddArg(v0) 15926 v.AddArg(x) 15927 return true 15928 } 15929 // match: (Neq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 15930 // cond: 15931 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 15932 for { 15933 _ = v.Args[1] 15934 v_0 := v.Args[0] 15935 if v_0.Op != OpAdd16 { 15936 break 15937 } 15938 _ = v_0.Args[1] 15939 v_0_0 := v_0.Args[0] 15940 if v_0_0.Op != OpConst16 { 15941 break 15942 } 15943 t := v_0_0.Type 15944 d := v_0_0.AuxInt 15945 x := v_0.Args[1] 15946 v_1 := v.Args[1] 15947 if v_1.Op != OpConst16 { 15948 break 15949 } 15950 if v_1.Type != t { 15951 break 15952 } 15953 c := v_1.AuxInt 15954 v.reset(OpNeq16) 15955 v0 := b.NewValue0(v.Pos, OpConst16, t) 15956 v0.AuxInt = int64(int16(c - d)) 15957 v.AddArg(v0) 15958 v.AddArg(x) 15959 return true 15960 } 15961 // match: (Neq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 15962 // cond: 15963 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 15964 for { 15965 _ = v.Args[1] 15966 v_0 := v.Args[0] 15967 if v_0.Op != OpAdd16 { 15968 break 15969 } 15970 _ = v_0.Args[1] 15971 x := v_0.Args[0] 15972 v_0_1 := v_0.Args[1] 15973 if v_0_1.Op != OpConst16 { 15974 break 15975 } 15976 t := v_0_1.Type 15977 d := v_0_1.AuxInt 15978 v_1 := v.Args[1] 15979 if v_1.Op != OpConst16 { 15980 break 15981 } 15982 if v_1.Type != t { 15983 break 15984 } 15985 c := v_1.AuxInt 15986 v.reset(OpNeq16) 15987 v0 := b.NewValue0(v.Pos, OpConst16, t) 15988 v0.AuxInt = int64(int16(c - d)) 15989 v.AddArg(v0) 15990 v.AddArg(x) 15991 return true 15992 } 15993 // match: (Neq16 (Const16 [c]) (Const16 [d])) 15994 // cond: 15995 // result: (ConstBool [b2i(c != d)]) 15996 for { 15997 _ = v.Args[1] 15998 v_0 := v.Args[0] 15999 if v_0.Op != OpConst16 { 16000 break 16001 } 16002 c := v_0.AuxInt 16003 v_1 := v.Args[1] 16004 if v_1.Op != OpConst16 { 16005 break 16006 } 16007 d := v_1.AuxInt 16008 v.reset(OpConstBool) 16009 v.AuxInt = b2i(c != d) 16010 return true 16011 } 16012 // match: (Neq16 (Const16 [d]) (Const16 [c])) 16013 // cond: 16014 // result: (ConstBool [b2i(c != d)]) 16015 for { 16016 _ = v.Args[1] 16017 v_0 := v.Args[0] 16018 if v_0.Op != OpConst16 { 16019 break 16020 } 16021 d := v_0.AuxInt 16022 v_1 := v.Args[1] 16023 if v_1.Op != OpConst16 { 16024 break 16025 } 16026 c := v_1.AuxInt 16027 v.reset(OpConstBool) 16028 v.AuxInt = b2i(c != d) 16029 return true 16030 } 16031 return false 16032 } 16033 func rewriteValuegeneric_OpNeq32_0(v *Value) bool { 16034 b := v.Block 16035 _ = b 16036 // match: (Neq32 x x) 16037 // cond: 16038 // result: (ConstBool [0]) 16039 for { 16040 _ = v.Args[1] 16041 x := v.Args[0] 16042 if x != v.Args[1] { 16043 break 16044 } 16045 v.reset(OpConstBool) 16046 v.AuxInt = 0 16047 return true 16048 } 16049 // match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 16050 // cond: 16051 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16052 for { 16053 _ = v.Args[1] 16054 v_0 := v.Args[0] 16055 if v_0.Op != OpConst32 { 16056 break 16057 } 16058 t := v_0.Type 16059 c := v_0.AuxInt 16060 v_1 := v.Args[1] 16061 if v_1.Op != OpAdd32 { 16062 break 16063 } 16064 _ = v_1.Args[1] 16065 v_1_0 := v_1.Args[0] 16066 if v_1_0.Op != OpConst32 { 16067 break 16068 } 16069 if v_1_0.Type != t { 16070 break 16071 } 16072 d := v_1_0.AuxInt 16073 x := v_1.Args[1] 16074 v.reset(OpNeq32) 16075 v0 := b.NewValue0(v.Pos, OpConst32, t) 16076 v0.AuxInt = int64(int32(c - d)) 16077 v.AddArg(v0) 16078 v.AddArg(x) 16079 return true 16080 } 16081 // match: (Neq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 16082 // cond: 16083 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16084 for { 16085 _ = v.Args[1] 16086 v_0 := v.Args[0] 16087 if v_0.Op != OpConst32 { 16088 break 16089 } 16090 t := v_0.Type 16091 c := v_0.AuxInt 16092 v_1 := v.Args[1] 16093 if v_1.Op != OpAdd32 { 16094 break 16095 } 16096 _ = v_1.Args[1] 16097 x := v_1.Args[0] 16098 v_1_1 := v_1.Args[1] 16099 if v_1_1.Op != OpConst32 { 16100 break 16101 } 16102 if v_1_1.Type != t { 16103 break 16104 } 16105 d := v_1_1.AuxInt 16106 v.reset(OpNeq32) 16107 v0 := b.NewValue0(v.Pos, OpConst32, t) 16108 v0.AuxInt = int64(int32(c - d)) 16109 v.AddArg(v0) 16110 v.AddArg(x) 16111 return true 16112 } 16113 // match: (Neq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 16114 // cond: 16115 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16116 for { 16117 _ = v.Args[1] 16118 v_0 := v.Args[0] 16119 if v_0.Op != OpAdd32 { 16120 break 16121 } 16122 _ = v_0.Args[1] 16123 v_0_0 := v_0.Args[0] 16124 if v_0_0.Op != OpConst32 { 16125 break 16126 } 16127 t := v_0_0.Type 16128 d := v_0_0.AuxInt 16129 x := v_0.Args[1] 16130 v_1 := v.Args[1] 16131 if v_1.Op != OpConst32 { 16132 break 16133 } 16134 if v_1.Type != t { 16135 break 16136 } 16137 c := v_1.AuxInt 16138 v.reset(OpNeq32) 16139 v0 := b.NewValue0(v.Pos, OpConst32, t) 16140 v0.AuxInt = int64(int32(c - d)) 16141 v.AddArg(v0) 16142 v.AddArg(x) 16143 return true 16144 } 16145 // match: (Neq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 16146 // cond: 16147 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16148 for { 16149 _ = v.Args[1] 16150 v_0 := v.Args[0] 16151 if v_0.Op != OpAdd32 { 16152 break 16153 } 16154 _ = v_0.Args[1] 16155 x := v_0.Args[0] 16156 v_0_1 := v_0.Args[1] 16157 if v_0_1.Op != OpConst32 { 16158 break 16159 } 16160 t := v_0_1.Type 16161 d := v_0_1.AuxInt 16162 v_1 := v.Args[1] 16163 if v_1.Op != OpConst32 { 16164 break 16165 } 16166 if v_1.Type != t { 16167 break 16168 } 16169 c := v_1.AuxInt 16170 v.reset(OpNeq32) 16171 v0 := b.NewValue0(v.Pos, OpConst32, t) 16172 v0.AuxInt = int64(int32(c - d)) 16173 v.AddArg(v0) 16174 v.AddArg(x) 16175 return true 16176 } 16177 // match: (Neq32 (Const32 [c]) (Const32 [d])) 16178 // cond: 16179 // result: (ConstBool [b2i(c != d)]) 16180 for { 16181 _ = v.Args[1] 16182 v_0 := v.Args[0] 16183 if v_0.Op != OpConst32 { 16184 break 16185 } 16186 c := v_0.AuxInt 16187 v_1 := v.Args[1] 16188 if v_1.Op != OpConst32 { 16189 break 16190 } 16191 d := v_1.AuxInt 16192 v.reset(OpConstBool) 16193 v.AuxInt = b2i(c != d) 16194 return true 16195 } 16196 // match: (Neq32 (Const32 [d]) (Const32 [c])) 16197 // cond: 16198 // result: (ConstBool [b2i(c != d)]) 16199 for { 16200 _ = v.Args[1] 16201 v_0 := v.Args[0] 16202 if v_0.Op != OpConst32 { 16203 break 16204 } 16205 d := v_0.AuxInt 16206 v_1 := v.Args[1] 16207 if v_1.Op != OpConst32 { 16208 break 16209 } 16210 c := v_1.AuxInt 16211 v.reset(OpConstBool) 16212 v.AuxInt = b2i(c != d) 16213 return true 16214 } 16215 return false 16216 } 16217 func rewriteValuegeneric_OpNeq64_0(v *Value) bool { 16218 b := v.Block 16219 _ = b 16220 // match: (Neq64 x x) 16221 // cond: 16222 // result: (ConstBool [0]) 16223 for { 16224 _ = v.Args[1] 16225 x := v.Args[0] 16226 if x != v.Args[1] { 16227 break 16228 } 16229 v.reset(OpConstBool) 16230 v.AuxInt = 0 16231 return true 16232 } 16233 // match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 16234 // cond: 16235 // result: (Neq64 (Const64 <t> [c-d]) x) 16236 for { 16237 _ = v.Args[1] 16238 v_0 := v.Args[0] 16239 if v_0.Op != OpConst64 { 16240 break 16241 } 16242 t := v_0.Type 16243 c := v_0.AuxInt 16244 v_1 := v.Args[1] 16245 if v_1.Op != OpAdd64 { 16246 break 16247 } 16248 _ = v_1.Args[1] 16249 v_1_0 := v_1.Args[0] 16250 if v_1_0.Op != OpConst64 { 16251 break 16252 } 16253 if v_1_0.Type != t { 16254 break 16255 } 16256 d := v_1_0.AuxInt 16257 x := v_1.Args[1] 16258 v.reset(OpNeq64) 16259 v0 := b.NewValue0(v.Pos, OpConst64, t) 16260 v0.AuxInt = c - d 16261 v.AddArg(v0) 16262 v.AddArg(x) 16263 return true 16264 } 16265 // match: (Neq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 16266 // cond: 16267 // result: (Neq64 (Const64 <t> [c-d]) x) 16268 for { 16269 _ = v.Args[1] 16270 v_0 := v.Args[0] 16271 if v_0.Op != OpConst64 { 16272 break 16273 } 16274 t := v_0.Type 16275 c := v_0.AuxInt 16276 v_1 := v.Args[1] 16277 if v_1.Op != OpAdd64 { 16278 break 16279 } 16280 _ = v_1.Args[1] 16281 x := v_1.Args[0] 16282 v_1_1 := v_1.Args[1] 16283 if v_1_1.Op != OpConst64 { 16284 break 16285 } 16286 if v_1_1.Type != t { 16287 break 16288 } 16289 d := v_1_1.AuxInt 16290 v.reset(OpNeq64) 16291 v0 := b.NewValue0(v.Pos, OpConst64, t) 16292 v0.AuxInt = c - d 16293 v.AddArg(v0) 16294 v.AddArg(x) 16295 return true 16296 } 16297 // match: (Neq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 16298 // cond: 16299 // result: (Neq64 (Const64 <t> [c-d]) x) 16300 for { 16301 _ = v.Args[1] 16302 v_0 := v.Args[0] 16303 if v_0.Op != OpAdd64 { 16304 break 16305 } 16306 _ = v_0.Args[1] 16307 v_0_0 := v_0.Args[0] 16308 if v_0_0.Op != OpConst64 { 16309 break 16310 } 16311 t := v_0_0.Type 16312 d := v_0_0.AuxInt 16313 x := v_0.Args[1] 16314 v_1 := v.Args[1] 16315 if v_1.Op != OpConst64 { 16316 break 16317 } 16318 if v_1.Type != t { 16319 break 16320 } 16321 c := v_1.AuxInt 16322 v.reset(OpNeq64) 16323 v0 := b.NewValue0(v.Pos, OpConst64, t) 16324 v0.AuxInt = c - d 16325 v.AddArg(v0) 16326 v.AddArg(x) 16327 return true 16328 } 16329 // match: (Neq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 16330 // cond: 16331 // result: (Neq64 (Const64 <t> [c-d]) x) 16332 for { 16333 _ = v.Args[1] 16334 v_0 := v.Args[0] 16335 if v_0.Op != OpAdd64 { 16336 break 16337 } 16338 _ = v_0.Args[1] 16339 x := v_0.Args[0] 16340 v_0_1 := v_0.Args[1] 16341 if v_0_1.Op != OpConst64 { 16342 break 16343 } 16344 t := v_0_1.Type 16345 d := v_0_1.AuxInt 16346 v_1 := v.Args[1] 16347 if v_1.Op != OpConst64 { 16348 break 16349 } 16350 if v_1.Type != t { 16351 break 16352 } 16353 c := v_1.AuxInt 16354 v.reset(OpNeq64) 16355 v0 := b.NewValue0(v.Pos, OpConst64, t) 16356 v0.AuxInt = c - d 16357 v.AddArg(v0) 16358 v.AddArg(x) 16359 return true 16360 } 16361 // match: (Neq64 (Const64 [c]) (Const64 [d])) 16362 // cond: 16363 // result: (ConstBool [b2i(c != d)]) 16364 for { 16365 _ = v.Args[1] 16366 v_0 := v.Args[0] 16367 if v_0.Op != OpConst64 { 16368 break 16369 } 16370 c := v_0.AuxInt 16371 v_1 := v.Args[1] 16372 if v_1.Op != OpConst64 { 16373 break 16374 } 16375 d := v_1.AuxInt 16376 v.reset(OpConstBool) 16377 v.AuxInt = b2i(c != d) 16378 return true 16379 } 16380 // match: (Neq64 (Const64 [d]) (Const64 [c])) 16381 // cond: 16382 // result: (ConstBool [b2i(c != d)]) 16383 for { 16384 _ = v.Args[1] 16385 v_0 := v.Args[0] 16386 if v_0.Op != OpConst64 { 16387 break 16388 } 16389 d := v_0.AuxInt 16390 v_1 := v.Args[1] 16391 if v_1.Op != OpConst64 { 16392 break 16393 } 16394 c := v_1.AuxInt 16395 v.reset(OpConstBool) 16396 v.AuxInt = b2i(c != d) 16397 return true 16398 } 16399 return false 16400 } 16401 func rewriteValuegeneric_OpNeq8_0(v *Value) bool { 16402 b := v.Block 16403 _ = b 16404 // match: (Neq8 x x) 16405 // cond: 16406 // result: (ConstBool [0]) 16407 for { 16408 _ = v.Args[1] 16409 x := v.Args[0] 16410 if x != v.Args[1] { 16411 break 16412 } 16413 v.reset(OpConstBool) 16414 v.AuxInt = 0 16415 return true 16416 } 16417 // match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 16418 // cond: 16419 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 16420 for { 16421 _ = v.Args[1] 16422 v_0 := v.Args[0] 16423 if v_0.Op != OpConst8 { 16424 break 16425 } 16426 t := v_0.Type 16427 c := v_0.AuxInt 16428 v_1 := v.Args[1] 16429 if v_1.Op != OpAdd8 { 16430 break 16431 } 16432 _ = v_1.Args[1] 16433 v_1_0 := v_1.Args[0] 16434 if v_1_0.Op != OpConst8 { 16435 break 16436 } 16437 if v_1_0.Type != t { 16438 break 16439 } 16440 d := v_1_0.AuxInt 16441 x := v_1.Args[1] 16442 v.reset(OpNeq8) 16443 v0 := b.NewValue0(v.Pos, OpConst8, t) 16444 v0.AuxInt = int64(int8(c - d)) 16445 v.AddArg(v0) 16446 v.AddArg(x) 16447 return true 16448 } 16449 // match: (Neq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 16450 // cond: 16451 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 16452 for { 16453 _ = v.Args[1] 16454 v_0 := v.Args[0] 16455 if v_0.Op != OpConst8 { 16456 break 16457 } 16458 t := v_0.Type 16459 c := v_0.AuxInt 16460 v_1 := v.Args[1] 16461 if v_1.Op != OpAdd8 { 16462 break 16463 } 16464 _ = v_1.Args[1] 16465 x := v_1.Args[0] 16466 v_1_1 := v_1.Args[1] 16467 if v_1_1.Op != OpConst8 { 16468 break 16469 } 16470 if v_1_1.Type != t { 16471 break 16472 } 16473 d := v_1_1.AuxInt 16474 v.reset(OpNeq8) 16475 v0 := b.NewValue0(v.Pos, OpConst8, t) 16476 v0.AuxInt = int64(int8(c - d)) 16477 v.AddArg(v0) 16478 v.AddArg(x) 16479 return true 16480 } 16481 // match: (Neq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 16482 // cond: 16483 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 16484 for { 16485 _ = v.Args[1] 16486 v_0 := v.Args[0] 16487 if v_0.Op != OpAdd8 { 16488 break 16489 } 16490 _ = v_0.Args[1] 16491 v_0_0 := v_0.Args[0] 16492 if v_0_0.Op != OpConst8 { 16493 break 16494 } 16495 t := v_0_0.Type 16496 d := v_0_0.AuxInt 16497 x := v_0.Args[1] 16498 v_1 := v.Args[1] 16499 if v_1.Op != OpConst8 { 16500 break 16501 } 16502 if v_1.Type != t { 16503 break 16504 } 16505 c := v_1.AuxInt 16506 v.reset(OpNeq8) 16507 v0 := b.NewValue0(v.Pos, OpConst8, t) 16508 v0.AuxInt = int64(int8(c - d)) 16509 v.AddArg(v0) 16510 v.AddArg(x) 16511 return true 16512 } 16513 // match: (Neq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 16514 // cond: 16515 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 16516 for { 16517 _ = v.Args[1] 16518 v_0 := v.Args[0] 16519 if v_0.Op != OpAdd8 { 16520 break 16521 } 16522 _ = v_0.Args[1] 16523 x := v_0.Args[0] 16524 v_0_1 := v_0.Args[1] 16525 if v_0_1.Op != OpConst8 { 16526 break 16527 } 16528 t := v_0_1.Type 16529 d := v_0_1.AuxInt 16530 v_1 := v.Args[1] 16531 if v_1.Op != OpConst8 { 16532 break 16533 } 16534 if v_1.Type != t { 16535 break 16536 } 16537 c := v_1.AuxInt 16538 v.reset(OpNeq8) 16539 v0 := b.NewValue0(v.Pos, OpConst8, t) 16540 v0.AuxInt = int64(int8(c - d)) 16541 v.AddArg(v0) 16542 v.AddArg(x) 16543 return true 16544 } 16545 // match: (Neq8 (Const8 [c]) (Const8 [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 != OpConst8 { 16552 break 16553 } 16554 c := v_0.AuxInt 16555 v_1 := v.Args[1] 16556 if v_1.Op != OpConst8 { 16557 break 16558 } 16559 d := v_1.AuxInt 16560 v.reset(OpConstBool) 16561 v.AuxInt = b2i(c != d) 16562 return true 16563 } 16564 // match: (Neq8 (Const8 [d]) (Const8 [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 != OpConst8 { 16571 break 16572 } 16573 d := v_0.AuxInt 16574 v_1 := v.Args[1] 16575 if v_1.Op != OpConst8 { 16576 break 16577 } 16578 c := v_1.AuxInt 16579 v.reset(OpConstBool) 16580 v.AuxInt = b2i(c != d) 16581 return true 16582 } 16583 return false 16584 } 16585 func rewriteValuegeneric_OpNeqB_0(v *Value) bool { 16586 // match: (NeqB (ConstBool [c]) (ConstBool [d])) 16587 // cond: 16588 // result: (ConstBool [b2i(c != d)]) 16589 for { 16590 _ = v.Args[1] 16591 v_0 := v.Args[0] 16592 if v_0.Op != OpConstBool { 16593 break 16594 } 16595 c := v_0.AuxInt 16596 v_1 := v.Args[1] 16597 if v_1.Op != OpConstBool { 16598 break 16599 } 16600 d := v_1.AuxInt 16601 v.reset(OpConstBool) 16602 v.AuxInt = b2i(c != d) 16603 return true 16604 } 16605 // match: (NeqB (ConstBool [d]) (ConstBool [c])) 16606 // cond: 16607 // result: (ConstBool [b2i(c != d)]) 16608 for { 16609 _ = v.Args[1] 16610 v_0 := v.Args[0] 16611 if v_0.Op != OpConstBool { 16612 break 16613 } 16614 d := v_0.AuxInt 16615 v_1 := v.Args[1] 16616 if v_1.Op != OpConstBool { 16617 break 16618 } 16619 c := v_1.AuxInt 16620 v.reset(OpConstBool) 16621 v.AuxInt = b2i(c != d) 16622 return true 16623 } 16624 // match: (NeqB (ConstBool [0]) x) 16625 // cond: 16626 // result: x 16627 for { 16628 _ = v.Args[1] 16629 v_0 := v.Args[0] 16630 if v_0.Op != OpConstBool { 16631 break 16632 } 16633 if v_0.AuxInt != 0 { 16634 break 16635 } 16636 x := v.Args[1] 16637 v.reset(OpCopy) 16638 v.Type = x.Type 16639 v.AddArg(x) 16640 return true 16641 } 16642 // match: (NeqB x (ConstBool [0])) 16643 // cond: 16644 // result: x 16645 for { 16646 _ = v.Args[1] 16647 x := v.Args[0] 16648 v_1 := v.Args[1] 16649 if v_1.Op != OpConstBool { 16650 break 16651 } 16652 if v_1.AuxInt != 0 { 16653 break 16654 } 16655 v.reset(OpCopy) 16656 v.Type = x.Type 16657 v.AddArg(x) 16658 return true 16659 } 16660 // match: (NeqB (ConstBool [1]) x) 16661 // cond: 16662 // result: (Not x) 16663 for { 16664 _ = v.Args[1] 16665 v_0 := v.Args[0] 16666 if v_0.Op != OpConstBool { 16667 break 16668 } 16669 if v_0.AuxInt != 1 { 16670 break 16671 } 16672 x := v.Args[1] 16673 v.reset(OpNot) 16674 v.AddArg(x) 16675 return true 16676 } 16677 // match: (NeqB x (ConstBool [1])) 16678 // cond: 16679 // result: (Not x) 16680 for { 16681 _ = v.Args[1] 16682 x := v.Args[0] 16683 v_1 := v.Args[1] 16684 if v_1.Op != OpConstBool { 16685 break 16686 } 16687 if v_1.AuxInt != 1 { 16688 break 16689 } 16690 v.reset(OpNot) 16691 v.AddArg(x) 16692 return true 16693 } 16694 // match: (NeqB (Not x) (Not y)) 16695 // cond: 16696 // result: (NeqB x y) 16697 for { 16698 _ = v.Args[1] 16699 v_0 := v.Args[0] 16700 if v_0.Op != OpNot { 16701 break 16702 } 16703 x := v_0.Args[0] 16704 v_1 := v.Args[1] 16705 if v_1.Op != OpNot { 16706 break 16707 } 16708 y := v_1.Args[0] 16709 v.reset(OpNeqB) 16710 v.AddArg(x) 16711 v.AddArg(y) 16712 return true 16713 } 16714 // match: (NeqB (Not y) (Not x)) 16715 // cond: 16716 // result: (NeqB x y) 16717 for { 16718 _ = v.Args[1] 16719 v_0 := v.Args[0] 16720 if v_0.Op != OpNot { 16721 break 16722 } 16723 y := v_0.Args[0] 16724 v_1 := v.Args[1] 16725 if v_1.Op != OpNot { 16726 break 16727 } 16728 x := v_1.Args[0] 16729 v.reset(OpNeqB) 16730 v.AddArg(x) 16731 v.AddArg(y) 16732 return true 16733 } 16734 return false 16735 } 16736 func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { 16737 b := v.Block 16738 _ = b 16739 typ := &b.Func.Config.Types 16740 _ = typ 16741 // match: (NeqInter x y) 16742 // cond: 16743 // result: (NeqPtr (ITab x) (ITab y)) 16744 for { 16745 _ = v.Args[1] 16746 x := v.Args[0] 16747 y := v.Args[1] 16748 v.reset(OpNeqPtr) 16749 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 16750 v0.AddArg(x) 16751 v.AddArg(v0) 16752 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 16753 v1.AddArg(y) 16754 v.AddArg(v1) 16755 return true 16756 } 16757 } 16758 func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { 16759 // match: (NeqPtr p (ConstNil)) 16760 // cond: 16761 // result: (IsNonNil p) 16762 for { 16763 _ = v.Args[1] 16764 p := v.Args[0] 16765 v_1 := v.Args[1] 16766 if v_1.Op != OpConstNil { 16767 break 16768 } 16769 v.reset(OpIsNonNil) 16770 v.AddArg(p) 16771 return true 16772 } 16773 // match: (NeqPtr (ConstNil) p) 16774 // cond: 16775 // result: (IsNonNil p) 16776 for { 16777 _ = v.Args[1] 16778 v_0 := v.Args[0] 16779 if v_0.Op != OpConstNil { 16780 break 16781 } 16782 p := v.Args[1] 16783 v.reset(OpIsNonNil) 16784 v.AddArg(p) 16785 return true 16786 } 16787 return false 16788 } 16789 func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { 16790 b := v.Block 16791 _ = b 16792 typ := &b.Func.Config.Types 16793 _ = typ 16794 // match: (NeqSlice x y) 16795 // cond: 16796 // result: (NeqPtr (SlicePtr x) (SlicePtr y)) 16797 for { 16798 _ = v.Args[1] 16799 x := v.Args[0] 16800 y := v.Args[1] 16801 v.reset(OpNeqPtr) 16802 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 16803 v0.AddArg(x) 16804 v.AddArg(v0) 16805 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 16806 v1.AddArg(y) 16807 v.AddArg(v1) 16808 return true 16809 } 16810 } 16811 func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { 16812 b := v.Block 16813 _ = b 16814 config := b.Func.Config 16815 _ = config 16816 fe := b.Func.fe 16817 _ = fe 16818 // match: (NilCheck (GetG mem) mem) 16819 // cond: 16820 // result: mem 16821 for { 16822 _ = v.Args[1] 16823 v_0 := v.Args[0] 16824 if v_0.Op != OpGetG { 16825 break 16826 } 16827 mem := v_0.Args[0] 16828 if mem != v.Args[1] { 16829 break 16830 } 16831 v.reset(OpCopy) 16832 v.Type = mem.Type 16833 v.AddArg(mem) 16834 return true 16835 } 16836 // match: (NilCheck (Load (OffPtr [c] (SP)) (StaticCall {sym} _)) _) 16837 // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 16838 // result: (Invalid) 16839 for { 16840 _ = v.Args[1] 16841 v_0 := v.Args[0] 16842 if v_0.Op != OpLoad { 16843 break 16844 } 16845 _ = v_0.Args[1] 16846 v_0_0 := v_0.Args[0] 16847 if v_0_0.Op != OpOffPtr { 16848 break 16849 } 16850 c := v_0_0.AuxInt 16851 v_0_0_0 := v_0_0.Args[0] 16852 if v_0_0_0.Op != OpSP { 16853 break 16854 } 16855 v_0_1 := v_0.Args[1] 16856 if v_0_1.Op != OpStaticCall { 16857 break 16858 } 16859 sym := v_0_1.Aux 16860 if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 16861 break 16862 } 16863 v.reset(OpInvalid) 16864 return true 16865 } 16866 // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) (StaticCall {sym} _))) _) 16867 // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 16868 // result: (Invalid) 16869 for { 16870 _ = v.Args[1] 16871 v_0 := v.Args[0] 16872 if v_0.Op != OpOffPtr { 16873 break 16874 } 16875 v_0_0 := v_0.Args[0] 16876 if v_0_0.Op != OpLoad { 16877 break 16878 } 16879 _ = v_0_0.Args[1] 16880 v_0_0_0 := v_0_0.Args[0] 16881 if v_0_0_0.Op != OpOffPtr { 16882 break 16883 } 16884 c := v_0_0_0.AuxInt 16885 v_0_0_0_0 := v_0_0_0.Args[0] 16886 if v_0_0_0_0.Op != OpSP { 16887 break 16888 } 16889 v_0_0_1 := v_0_0.Args[1] 16890 if v_0_0_1.Op != OpStaticCall { 16891 break 16892 } 16893 sym := v_0_0_1.Aux 16894 if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 16895 break 16896 } 16897 v.reset(OpInvalid) 16898 return true 16899 } 16900 return false 16901 } 16902 func rewriteValuegeneric_OpNot_0(v *Value) bool { 16903 // match: (Not (Eq64 x y)) 16904 // cond: 16905 // result: (Neq64 x y) 16906 for { 16907 v_0 := v.Args[0] 16908 if v_0.Op != OpEq64 { 16909 break 16910 } 16911 _ = v_0.Args[1] 16912 x := v_0.Args[0] 16913 y := v_0.Args[1] 16914 v.reset(OpNeq64) 16915 v.AddArg(x) 16916 v.AddArg(y) 16917 return true 16918 } 16919 // match: (Not (Eq32 x y)) 16920 // cond: 16921 // result: (Neq32 x y) 16922 for { 16923 v_0 := v.Args[0] 16924 if v_0.Op != OpEq32 { 16925 break 16926 } 16927 _ = v_0.Args[1] 16928 x := v_0.Args[0] 16929 y := v_0.Args[1] 16930 v.reset(OpNeq32) 16931 v.AddArg(x) 16932 v.AddArg(y) 16933 return true 16934 } 16935 // match: (Not (Eq16 x y)) 16936 // cond: 16937 // result: (Neq16 x y) 16938 for { 16939 v_0 := v.Args[0] 16940 if v_0.Op != OpEq16 { 16941 break 16942 } 16943 _ = v_0.Args[1] 16944 x := v_0.Args[0] 16945 y := v_0.Args[1] 16946 v.reset(OpNeq16) 16947 v.AddArg(x) 16948 v.AddArg(y) 16949 return true 16950 } 16951 // match: (Not (Eq8 x y)) 16952 // cond: 16953 // result: (Neq8 x y) 16954 for { 16955 v_0 := v.Args[0] 16956 if v_0.Op != OpEq8 { 16957 break 16958 } 16959 _ = v_0.Args[1] 16960 x := v_0.Args[0] 16961 y := v_0.Args[1] 16962 v.reset(OpNeq8) 16963 v.AddArg(x) 16964 v.AddArg(y) 16965 return true 16966 } 16967 // match: (Not (EqB x y)) 16968 // cond: 16969 // result: (NeqB x y) 16970 for { 16971 v_0 := v.Args[0] 16972 if v_0.Op != OpEqB { 16973 break 16974 } 16975 _ = v_0.Args[1] 16976 x := v_0.Args[0] 16977 y := v_0.Args[1] 16978 v.reset(OpNeqB) 16979 v.AddArg(x) 16980 v.AddArg(y) 16981 return true 16982 } 16983 // match: (Not (Neq64 x y)) 16984 // cond: 16985 // result: (Eq64 x y) 16986 for { 16987 v_0 := v.Args[0] 16988 if v_0.Op != OpNeq64 { 16989 break 16990 } 16991 _ = v_0.Args[1] 16992 x := v_0.Args[0] 16993 y := v_0.Args[1] 16994 v.reset(OpEq64) 16995 v.AddArg(x) 16996 v.AddArg(y) 16997 return true 16998 } 16999 // match: (Not (Neq32 x y)) 17000 // cond: 17001 // result: (Eq32 x y) 17002 for { 17003 v_0 := v.Args[0] 17004 if v_0.Op != OpNeq32 { 17005 break 17006 } 17007 _ = v_0.Args[1] 17008 x := v_0.Args[0] 17009 y := v_0.Args[1] 17010 v.reset(OpEq32) 17011 v.AddArg(x) 17012 v.AddArg(y) 17013 return true 17014 } 17015 // match: (Not (Neq16 x y)) 17016 // cond: 17017 // result: (Eq16 x y) 17018 for { 17019 v_0 := v.Args[0] 17020 if v_0.Op != OpNeq16 { 17021 break 17022 } 17023 _ = v_0.Args[1] 17024 x := v_0.Args[0] 17025 y := v_0.Args[1] 17026 v.reset(OpEq16) 17027 v.AddArg(x) 17028 v.AddArg(y) 17029 return true 17030 } 17031 // match: (Not (Neq8 x y)) 17032 // cond: 17033 // result: (Eq8 x y) 17034 for { 17035 v_0 := v.Args[0] 17036 if v_0.Op != OpNeq8 { 17037 break 17038 } 17039 _ = v_0.Args[1] 17040 x := v_0.Args[0] 17041 y := v_0.Args[1] 17042 v.reset(OpEq8) 17043 v.AddArg(x) 17044 v.AddArg(y) 17045 return true 17046 } 17047 // match: (Not (NeqB x y)) 17048 // cond: 17049 // result: (EqB x y) 17050 for { 17051 v_0 := v.Args[0] 17052 if v_0.Op != OpNeqB { 17053 break 17054 } 17055 _ = v_0.Args[1] 17056 x := v_0.Args[0] 17057 y := v_0.Args[1] 17058 v.reset(OpEqB) 17059 v.AddArg(x) 17060 v.AddArg(y) 17061 return true 17062 } 17063 return false 17064 } 17065 func rewriteValuegeneric_OpNot_10(v *Value) bool { 17066 // match: (Not (Greater64 x y)) 17067 // cond: 17068 // result: (Leq64 x y) 17069 for { 17070 v_0 := v.Args[0] 17071 if v_0.Op != OpGreater64 { 17072 break 17073 } 17074 _ = v_0.Args[1] 17075 x := v_0.Args[0] 17076 y := v_0.Args[1] 17077 v.reset(OpLeq64) 17078 v.AddArg(x) 17079 v.AddArg(y) 17080 return true 17081 } 17082 // match: (Not (Greater32 x y)) 17083 // cond: 17084 // result: (Leq32 x y) 17085 for { 17086 v_0 := v.Args[0] 17087 if v_0.Op != OpGreater32 { 17088 break 17089 } 17090 _ = v_0.Args[1] 17091 x := v_0.Args[0] 17092 y := v_0.Args[1] 17093 v.reset(OpLeq32) 17094 v.AddArg(x) 17095 v.AddArg(y) 17096 return true 17097 } 17098 // match: (Not (Greater16 x y)) 17099 // cond: 17100 // result: (Leq16 x y) 17101 for { 17102 v_0 := v.Args[0] 17103 if v_0.Op != OpGreater16 { 17104 break 17105 } 17106 _ = v_0.Args[1] 17107 x := v_0.Args[0] 17108 y := v_0.Args[1] 17109 v.reset(OpLeq16) 17110 v.AddArg(x) 17111 v.AddArg(y) 17112 return true 17113 } 17114 // match: (Not (Greater8 x y)) 17115 // cond: 17116 // result: (Leq8 x y) 17117 for { 17118 v_0 := v.Args[0] 17119 if v_0.Op != OpGreater8 { 17120 break 17121 } 17122 _ = v_0.Args[1] 17123 x := v_0.Args[0] 17124 y := v_0.Args[1] 17125 v.reset(OpLeq8) 17126 v.AddArg(x) 17127 v.AddArg(y) 17128 return true 17129 } 17130 // match: (Not (Greater64U x y)) 17131 // cond: 17132 // result: (Leq64U x y) 17133 for { 17134 v_0 := v.Args[0] 17135 if v_0.Op != OpGreater64U { 17136 break 17137 } 17138 _ = v_0.Args[1] 17139 x := v_0.Args[0] 17140 y := v_0.Args[1] 17141 v.reset(OpLeq64U) 17142 v.AddArg(x) 17143 v.AddArg(y) 17144 return true 17145 } 17146 // match: (Not (Greater32U x y)) 17147 // cond: 17148 // result: (Leq32U x y) 17149 for { 17150 v_0 := v.Args[0] 17151 if v_0.Op != OpGreater32U { 17152 break 17153 } 17154 _ = v_0.Args[1] 17155 x := v_0.Args[0] 17156 y := v_0.Args[1] 17157 v.reset(OpLeq32U) 17158 v.AddArg(x) 17159 v.AddArg(y) 17160 return true 17161 } 17162 // match: (Not (Greater16U x y)) 17163 // cond: 17164 // result: (Leq16U x y) 17165 for { 17166 v_0 := v.Args[0] 17167 if v_0.Op != OpGreater16U { 17168 break 17169 } 17170 _ = v_0.Args[1] 17171 x := v_0.Args[0] 17172 y := v_0.Args[1] 17173 v.reset(OpLeq16U) 17174 v.AddArg(x) 17175 v.AddArg(y) 17176 return true 17177 } 17178 // match: (Not (Greater8U x y)) 17179 // cond: 17180 // result: (Leq8U x y) 17181 for { 17182 v_0 := v.Args[0] 17183 if v_0.Op != OpGreater8U { 17184 break 17185 } 17186 _ = v_0.Args[1] 17187 x := v_0.Args[0] 17188 y := v_0.Args[1] 17189 v.reset(OpLeq8U) 17190 v.AddArg(x) 17191 v.AddArg(y) 17192 return true 17193 } 17194 // match: (Not (Geq64 x y)) 17195 // cond: 17196 // result: (Less64 x y) 17197 for { 17198 v_0 := v.Args[0] 17199 if v_0.Op != OpGeq64 { 17200 break 17201 } 17202 _ = v_0.Args[1] 17203 x := v_0.Args[0] 17204 y := v_0.Args[1] 17205 v.reset(OpLess64) 17206 v.AddArg(x) 17207 v.AddArg(y) 17208 return true 17209 } 17210 // match: (Not (Geq32 x y)) 17211 // cond: 17212 // result: (Less32 x y) 17213 for { 17214 v_0 := v.Args[0] 17215 if v_0.Op != OpGeq32 { 17216 break 17217 } 17218 _ = v_0.Args[1] 17219 x := v_0.Args[0] 17220 y := v_0.Args[1] 17221 v.reset(OpLess32) 17222 v.AddArg(x) 17223 v.AddArg(y) 17224 return true 17225 } 17226 return false 17227 } 17228 func rewriteValuegeneric_OpNot_20(v *Value) bool { 17229 // match: (Not (Geq16 x y)) 17230 // cond: 17231 // result: (Less16 x y) 17232 for { 17233 v_0 := v.Args[0] 17234 if v_0.Op != OpGeq16 { 17235 break 17236 } 17237 _ = v_0.Args[1] 17238 x := v_0.Args[0] 17239 y := v_0.Args[1] 17240 v.reset(OpLess16) 17241 v.AddArg(x) 17242 v.AddArg(y) 17243 return true 17244 } 17245 // match: (Not (Geq8 x y)) 17246 // cond: 17247 // result: (Less8 x y) 17248 for { 17249 v_0 := v.Args[0] 17250 if v_0.Op != OpGeq8 { 17251 break 17252 } 17253 _ = v_0.Args[1] 17254 x := v_0.Args[0] 17255 y := v_0.Args[1] 17256 v.reset(OpLess8) 17257 v.AddArg(x) 17258 v.AddArg(y) 17259 return true 17260 } 17261 // match: (Not (Geq64U x y)) 17262 // cond: 17263 // result: (Less64U x y) 17264 for { 17265 v_0 := v.Args[0] 17266 if v_0.Op != OpGeq64U { 17267 break 17268 } 17269 _ = v_0.Args[1] 17270 x := v_0.Args[0] 17271 y := v_0.Args[1] 17272 v.reset(OpLess64U) 17273 v.AddArg(x) 17274 v.AddArg(y) 17275 return true 17276 } 17277 // match: (Not (Geq32U x y)) 17278 // cond: 17279 // result: (Less32U x y) 17280 for { 17281 v_0 := v.Args[0] 17282 if v_0.Op != OpGeq32U { 17283 break 17284 } 17285 _ = v_0.Args[1] 17286 x := v_0.Args[0] 17287 y := v_0.Args[1] 17288 v.reset(OpLess32U) 17289 v.AddArg(x) 17290 v.AddArg(y) 17291 return true 17292 } 17293 // match: (Not (Geq16U x y)) 17294 // cond: 17295 // result: (Less16U x y) 17296 for { 17297 v_0 := v.Args[0] 17298 if v_0.Op != OpGeq16U { 17299 break 17300 } 17301 _ = v_0.Args[1] 17302 x := v_0.Args[0] 17303 y := v_0.Args[1] 17304 v.reset(OpLess16U) 17305 v.AddArg(x) 17306 v.AddArg(y) 17307 return true 17308 } 17309 // match: (Not (Geq8U x y)) 17310 // cond: 17311 // result: (Less8U x y) 17312 for { 17313 v_0 := v.Args[0] 17314 if v_0.Op != OpGeq8U { 17315 break 17316 } 17317 _ = v_0.Args[1] 17318 x := v_0.Args[0] 17319 y := v_0.Args[1] 17320 v.reset(OpLess8U) 17321 v.AddArg(x) 17322 v.AddArg(y) 17323 return true 17324 } 17325 // match: (Not (Less64 x y)) 17326 // cond: 17327 // result: (Geq64 x y) 17328 for { 17329 v_0 := v.Args[0] 17330 if v_0.Op != OpLess64 { 17331 break 17332 } 17333 _ = v_0.Args[1] 17334 x := v_0.Args[0] 17335 y := v_0.Args[1] 17336 v.reset(OpGeq64) 17337 v.AddArg(x) 17338 v.AddArg(y) 17339 return true 17340 } 17341 // match: (Not (Less32 x y)) 17342 // cond: 17343 // result: (Geq32 x y) 17344 for { 17345 v_0 := v.Args[0] 17346 if v_0.Op != OpLess32 { 17347 break 17348 } 17349 _ = v_0.Args[1] 17350 x := v_0.Args[0] 17351 y := v_0.Args[1] 17352 v.reset(OpGeq32) 17353 v.AddArg(x) 17354 v.AddArg(y) 17355 return true 17356 } 17357 // match: (Not (Less16 x y)) 17358 // cond: 17359 // result: (Geq16 x y) 17360 for { 17361 v_0 := v.Args[0] 17362 if v_0.Op != OpLess16 { 17363 break 17364 } 17365 _ = v_0.Args[1] 17366 x := v_0.Args[0] 17367 y := v_0.Args[1] 17368 v.reset(OpGeq16) 17369 v.AddArg(x) 17370 v.AddArg(y) 17371 return true 17372 } 17373 // match: (Not (Less8 x y)) 17374 // cond: 17375 // result: (Geq8 x y) 17376 for { 17377 v_0 := v.Args[0] 17378 if v_0.Op != OpLess8 { 17379 break 17380 } 17381 _ = v_0.Args[1] 17382 x := v_0.Args[0] 17383 y := v_0.Args[1] 17384 v.reset(OpGeq8) 17385 v.AddArg(x) 17386 v.AddArg(y) 17387 return true 17388 } 17389 return false 17390 } 17391 func rewriteValuegeneric_OpNot_30(v *Value) bool { 17392 // match: (Not (Less64U x y)) 17393 // cond: 17394 // result: (Geq64U x y) 17395 for { 17396 v_0 := v.Args[0] 17397 if v_0.Op != OpLess64U { 17398 break 17399 } 17400 _ = v_0.Args[1] 17401 x := v_0.Args[0] 17402 y := v_0.Args[1] 17403 v.reset(OpGeq64U) 17404 v.AddArg(x) 17405 v.AddArg(y) 17406 return true 17407 } 17408 // match: (Not (Less32U x y)) 17409 // cond: 17410 // result: (Geq32U x y) 17411 for { 17412 v_0 := v.Args[0] 17413 if v_0.Op != OpLess32U { 17414 break 17415 } 17416 _ = v_0.Args[1] 17417 x := v_0.Args[0] 17418 y := v_0.Args[1] 17419 v.reset(OpGeq32U) 17420 v.AddArg(x) 17421 v.AddArg(y) 17422 return true 17423 } 17424 // match: (Not (Less16U x y)) 17425 // cond: 17426 // result: (Geq16U x y) 17427 for { 17428 v_0 := v.Args[0] 17429 if v_0.Op != OpLess16U { 17430 break 17431 } 17432 _ = v_0.Args[1] 17433 x := v_0.Args[0] 17434 y := v_0.Args[1] 17435 v.reset(OpGeq16U) 17436 v.AddArg(x) 17437 v.AddArg(y) 17438 return true 17439 } 17440 // match: (Not (Less8U x y)) 17441 // cond: 17442 // result: (Geq8U x y) 17443 for { 17444 v_0 := v.Args[0] 17445 if v_0.Op != OpLess8U { 17446 break 17447 } 17448 _ = v_0.Args[1] 17449 x := v_0.Args[0] 17450 y := v_0.Args[1] 17451 v.reset(OpGeq8U) 17452 v.AddArg(x) 17453 v.AddArg(y) 17454 return true 17455 } 17456 // match: (Not (Leq64 x y)) 17457 // cond: 17458 // result: (Greater64 x y) 17459 for { 17460 v_0 := v.Args[0] 17461 if v_0.Op != OpLeq64 { 17462 break 17463 } 17464 _ = v_0.Args[1] 17465 x := v_0.Args[0] 17466 y := v_0.Args[1] 17467 v.reset(OpGreater64) 17468 v.AddArg(x) 17469 v.AddArg(y) 17470 return true 17471 } 17472 // match: (Not (Leq32 x y)) 17473 // cond: 17474 // result: (Greater32 x y) 17475 for { 17476 v_0 := v.Args[0] 17477 if v_0.Op != OpLeq32 { 17478 break 17479 } 17480 _ = v_0.Args[1] 17481 x := v_0.Args[0] 17482 y := v_0.Args[1] 17483 v.reset(OpGreater32) 17484 v.AddArg(x) 17485 v.AddArg(y) 17486 return true 17487 } 17488 // match: (Not (Leq16 x y)) 17489 // cond: 17490 // result: (Greater16 x y) 17491 for { 17492 v_0 := v.Args[0] 17493 if v_0.Op != OpLeq16 { 17494 break 17495 } 17496 _ = v_0.Args[1] 17497 x := v_0.Args[0] 17498 y := v_0.Args[1] 17499 v.reset(OpGreater16) 17500 v.AddArg(x) 17501 v.AddArg(y) 17502 return true 17503 } 17504 // match: (Not (Leq8 x y)) 17505 // cond: 17506 // result: (Greater8 x y) 17507 for { 17508 v_0 := v.Args[0] 17509 if v_0.Op != OpLeq8 { 17510 break 17511 } 17512 _ = v_0.Args[1] 17513 x := v_0.Args[0] 17514 y := v_0.Args[1] 17515 v.reset(OpGreater8) 17516 v.AddArg(x) 17517 v.AddArg(y) 17518 return true 17519 } 17520 // match: (Not (Leq64U x y)) 17521 // cond: 17522 // result: (Greater64U x y) 17523 for { 17524 v_0 := v.Args[0] 17525 if v_0.Op != OpLeq64U { 17526 break 17527 } 17528 _ = v_0.Args[1] 17529 x := v_0.Args[0] 17530 y := v_0.Args[1] 17531 v.reset(OpGreater64U) 17532 v.AddArg(x) 17533 v.AddArg(y) 17534 return true 17535 } 17536 // match: (Not (Leq32U x y)) 17537 // cond: 17538 // result: (Greater32U x y) 17539 for { 17540 v_0 := v.Args[0] 17541 if v_0.Op != OpLeq32U { 17542 break 17543 } 17544 _ = v_0.Args[1] 17545 x := v_0.Args[0] 17546 y := v_0.Args[1] 17547 v.reset(OpGreater32U) 17548 v.AddArg(x) 17549 v.AddArg(y) 17550 return true 17551 } 17552 return false 17553 } 17554 func rewriteValuegeneric_OpNot_40(v *Value) bool { 17555 // match: (Not (Leq16U x y)) 17556 // cond: 17557 // result: (Greater16U x y) 17558 for { 17559 v_0 := v.Args[0] 17560 if v_0.Op != OpLeq16U { 17561 break 17562 } 17563 _ = v_0.Args[1] 17564 x := v_0.Args[0] 17565 y := v_0.Args[1] 17566 v.reset(OpGreater16U) 17567 v.AddArg(x) 17568 v.AddArg(y) 17569 return true 17570 } 17571 // match: (Not (Leq8U x y)) 17572 // cond: 17573 // result: (Greater8U x y) 17574 for { 17575 v_0 := v.Args[0] 17576 if v_0.Op != OpLeq8U { 17577 break 17578 } 17579 _ = v_0.Args[1] 17580 x := v_0.Args[0] 17581 y := v_0.Args[1] 17582 v.reset(OpGreater8U) 17583 v.AddArg(x) 17584 v.AddArg(y) 17585 return true 17586 } 17587 return false 17588 } 17589 func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { 17590 // match: (OffPtr (OffPtr p [b]) [a]) 17591 // cond: 17592 // result: (OffPtr p [a+b]) 17593 for { 17594 a := v.AuxInt 17595 v_0 := v.Args[0] 17596 if v_0.Op != OpOffPtr { 17597 break 17598 } 17599 b := v_0.AuxInt 17600 p := v_0.Args[0] 17601 v.reset(OpOffPtr) 17602 v.AuxInt = a + b 17603 v.AddArg(p) 17604 return true 17605 } 17606 // match: (OffPtr p [0]) 17607 // cond: v.Type.Compare(p.Type) == types.CMPeq 17608 // result: p 17609 for { 17610 if v.AuxInt != 0 { 17611 break 17612 } 17613 p := v.Args[0] 17614 if !(v.Type.Compare(p.Type) == types.CMPeq) { 17615 break 17616 } 17617 v.reset(OpCopy) 17618 v.Type = p.Type 17619 v.AddArg(p) 17620 return true 17621 } 17622 return false 17623 } 17624 func rewriteValuegeneric_OpOr16_0(v *Value) bool { 17625 // match: (Or16 (Const16 [c]) (Const16 [d])) 17626 // cond: 17627 // result: (Const16 [int64(int16(c|d))]) 17628 for { 17629 _ = v.Args[1] 17630 v_0 := v.Args[0] 17631 if v_0.Op != OpConst16 { 17632 break 17633 } 17634 c := v_0.AuxInt 17635 v_1 := v.Args[1] 17636 if v_1.Op != OpConst16 { 17637 break 17638 } 17639 d := v_1.AuxInt 17640 v.reset(OpConst16) 17641 v.AuxInt = int64(int16(c | d)) 17642 return true 17643 } 17644 // match: (Or16 (Const16 [d]) (Const16 [c])) 17645 // cond: 17646 // result: (Const16 [int64(int16(c|d))]) 17647 for { 17648 _ = v.Args[1] 17649 v_0 := v.Args[0] 17650 if v_0.Op != OpConst16 { 17651 break 17652 } 17653 d := v_0.AuxInt 17654 v_1 := v.Args[1] 17655 if v_1.Op != OpConst16 { 17656 break 17657 } 17658 c := v_1.AuxInt 17659 v.reset(OpConst16) 17660 v.AuxInt = int64(int16(c | d)) 17661 return true 17662 } 17663 // match: (Or16 x x) 17664 // cond: 17665 // result: x 17666 for { 17667 _ = v.Args[1] 17668 x := v.Args[0] 17669 if x != v.Args[1] { 17670 break 17671 } 17672 v.reset(OpCopy) 17673 v.Type = x.Type 17674 v.AddArg(x) 17675 return true 17676 } 17677 // match: (Or16 (Const16 [0]) x) 17678 // cond: 17679 // result: x 17680 for { 17681 _ = v.Args[1] 17682 v_0 := v.Args[0] 17683 if v_0.Op != OpConst16 { 17684 break 17685 } 17686 if v_0.AuxInt != 0 { 17687 break 17688 } 17689 x := v.Args[1] 17690 v.reset(OpCopy) 17691 v.Type = x.Type 17692 v.AddArg(x) 17693 return true 17694 } 17695 // match: (Or16 x (Const16 [0])) 17696 // cond: 17697 // result: x 17698 for { 17699 _ = v.Args[1] 17700 x := v.Args[0] 17701 v_1 := v.Args[1] 17702 if v_1.Op != OpConst16 { 17703 break 17704 } 17705 if v_1.AuxInt != 0 { 17706 break 17707 } 17708 v.reset(OpCopy) 17709 v.Type = x.Type 17710 v.AddArg(x) 17711 return true 17712 } 17713 // match: (Or16 (Const16 [-1]) _) 17714 // cond: 17715 // result: (Const16 [-1]) 17716 for { 17717 _ = v.Args[1] 17718 v_0 := v.Args[0] 17719 if v_0.Op != OpConst16 { 17720 break 17721 } 17722 if v_0.AuxInt != -1 { 17723 break 17724 } 17725 v.reset(OpConst16) 17726 v.AuxInt = -1 17727 return true 17728 } 17729 // match: (Or16 _ (Const16 [-1])) 17730 // cond: 17731 // result: (Const16 [-1]) 17732 for { 17733 _ = v.Args[1] 17734 v_1 := v.Args[1] 17735 if v_1.Op != OpConst16 { 17736 break 17737 } 17738 if v_1.AuxInt != -1 { 17739 break 17740 } 17741 v.reset(OpConst16) 17742 v.AuxInt = -1 17743 return true 17744 } 17745 // match: (Or16 x (Or16 x y)) 17746 // cond: 17747 // result: (Or16 x y) 17748 for { 17749 _ = v.Args[1] 17750 x := v.Args[0] 17751 v_1 := v.Args[1] 17752 if v_1.Op != OpOr16 { 17753 break 17754 } 17755 _ = v_1.Args[1] 17756 if x != v_1.Args[0] { 17757 break 17758 } 17759 y := v_1.Args[1] 17760 v.reset(OpOr16) 17761 v.AddArg(x) 17762 v.AddArg(y) 17763 return true 17764 } 17765 // match: (Or16 x (Or16 y x)) 17766 // cond: 17767 // result: (Or16 x y) 17768 for { 17769 _ = v.Args[1] 17770 x := v.Args[0] 17771 v_1 := v.Args[1] 17772 if v_1.Op != OpOr16 { 17773 break 17774 } 17775 _ = v_1.Args[1] 17776 y := v_1.Args[0] 17777 if x != v_1.Args[1] { 17778 break 17779 } 17780 v.reset(OpOr16) 17781 v.AddArg(x) 17782 v.AddArg(y) 17783 return true 17784 } 17785 // match: (Or16 (Or16 x y) x) 17786 // cond: 17787 // result: (Or16 x y) 17788 for { 17789 _ = v.Args[1] 17790 v_0 := v.Args[0] 17791 if v_0.Op != OpOr16 { 17792 break 17793 } 17794 _ = v_0.Args[1] 17795 x := v_0.Args[0] 17796 y := v_0.Args[1] 17797 if x != v.Args[1] { 17798 break 17799 } 17800 v.reset(OpOr16) 17801 v.AddArg(x) 17802 v.AddArg(y) 17803 return true 17804 } 17805 return false 17806 } 17807 func rewriteValuegeneric_OpOr16_10(v *Value) bool { 17808 b := v.Block 17809 _ = b 17810 // match: (Or16 (Or16 y x) x) 17811 // cond: 17812 // result: (Or16 x y) 17813 for { 17814 _ = v.Args[1] 17815 v_0 := v.Args[0] 17816 if v_0.Op != OpOr16 { 17817 break 17818 } 17819 _ = v_0.Args[1] 17820 y := v_0.Args[0] 17821 x := v_0.Args[1] 17822 if x != v.Args[1] { 17823 break 17824 } 17825 v.reset(OpOr16) 17826 v.AddArg(x) 17827 v.AddArg(y) 17828 return true 17829 } 17830 // match: (Or16 (And16 x (Const16 [c2])) (Const16 <t> [c1])) 17831 // cond: ^(c1 | c2) == 0 17832 // result: (Or16 (Const16 <t> [c1]) x) 17833 for { 17834 _ = v.Args[1] 17835 v_0 := v.Args[0] 17836 if v_0.Op != OpAnd16 { 17837 break 17838 } 17839 _ = v_0.Args[1] 17840 x := v_0.Args[0] 17841 v_0_1 := v_0.Args[1] 17842 if v_0_1.Op != OpConst16 { 17843 break 17844 } 17845 c2 := v_0_1.AuxInt 17846 v_1 := v.Args[1] 17847 if v_1.Op != OpConst16 { 17848 break 17849 } 17850 t := v_1.Type 17851 c1 := v_1.AuxInt 17852 if !(^(c1 | c2) == 0) { 17853 break 17854 } 17855 v.reset(OpOr16) 17856 v0 := b.NewValue0(v.Pos, OpConst16, t) 17857 v0.AuxInt = c1 17858 v.AddArg(v0) 17859 v.AddArg(x) 17860 return true 17861 } 17862 // match: (Or16 (And16 (Const16 [c2]) x) (Const16 <t> [c1])) 17863 // cond: ^(c1 | c2) == 0 17864 // result: (Or16 (Const16 <t> [c1]) x) 17865 for { 17866 _ = v.Args[1] 17867 v_0 := v.Args[0] 17868 if v_0.Op != OpAnd16 { 17869 break 17870 } 17871 _ = v_0.Args[1] 17872 v_0_0 := v_0.Args[0] 17873 if v_0_0.Op != OpConst16 { 17874 break 17875 } 17876 c2 := v_0_0.AuxInt 17877 x := v_0.Args[1] 17878 v_1 := v.Args[1] 17879 if v_1.Op != OpConst16 { 17880 break 17881 } 17882 t := v_1.Type 17883 c1 := v_1.AuxInt 17884 if !(^(c1 | c2) == 0) { 17885 break 17886 } 17887 v.reset(OpOr16) 17888 v0 := b.NewValue0(v.Pos, OpConst16, t) 17889 v0.AuxInt = c1 17890 v.AddArg(v0) 17891 v.AddArg(x) 17892 return true 17893 } 17894 // match: (Or16 (Const16 <t> [c1]) (And16 x (Const16 [c2]))) 17895 // cond: ^(c1 | c2) == 0 17896 // result: (Or16 (Const16 <t> [c1]) x) 17897 for { 17898 _ = v.Args[1] 17899 v_0 := v.Args[0] 17900 if v_0.Op != OpConst16 { 17901 break 17902 } 17903 t := v_0.Type 17904 c1 := v_0.AuxInt 17905 v_1 := v.Args[1] 17906 if v_1.Op != OpAnd16 { 17907 break 17908 } 17909 _ = v_1.Args[1] 17910 x := v_1.Args[0] 17911 v_1_1 := v_1.Args[1] 17912 if v_1_1.Op != OpConst16 { 17913 break 17914 } 17915 c2 := v_1_1.AuxInt 17916 if !(^(c1 | c2) == 0) { 17917 break 17918 } 17919 v.reset(OpOr16) 17920 v0 := b.NewValue0(v.Pos, OpConst16, t) 17921 v0.AuxInt = c1 17922 v.AddArg(v0) 17923 v.AddArg(x) 17924 return true 17925 } 17926 // match: (Or16 (Const16 <t> [c1]) (And16 (Const16 [c2]) x)) 17927 // cond: ^(c1 | c2) == 0 17928 // result: (Or16 (Const16 <t> [c1]) x) 17929 for { 17930 _ = v.Args[1] 17931 v_0 := v.Args[0] 17932 if v_0.Op != OpConst16 { 17933 break 17934 } 17935 t := v_0.Type 17936 c1 := v_0.AuxInt 17937 v_1 := v.Args[1] 17938 if v_1.Op != OpAnd16 { 17939 break 17940 } 17941 _ = v_1.Args[1] 17942 v_1_0 := v_1.Args[0] 17943 if v_1_0.Op != OpConst16 { 17944 break 17945 } 17946 c2 := v_1_0.AuxInt 17947 x := v_1.Args[1] 17948 if !(^(c1 | c2) == 0) { 17949 break 17950 } 17951 v.reset(OpOr16) 17952 v0 := b.NewValue0(v.Pos, OpConst16, t) 17953 v0.AuxInt = c1 17954 v.AddArg(v0) 17955 v.AddArg(x) 17956 return true 17957 } 17958 // match: (Or16 (Or16 i:(Const16 <t>) z) x) 17959 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 17960 // result: (Or16 i (Or16 <t> z x)) 17961 for { 17962 _ = v.Args[1] 17963 v_0 := v.Args[0] 17964 if v_0.Op != OpOr16 { 17965 break 17966 } 17967 _ = v_0.Args[1] 17968 i := v_0.Args[0] 17969 if i.Op != OpConst16 { 17970 break 17971 } 17972 t := i.Type 17973 z := v_0.Args[1] 17974 x := v.Args[1] 17975 if !(z.Op != OpConst16 && x.Op != OpConst16) { 17976 break 17977 } 17978 v.reset(OpOr16) 17979 v.AddArg(i) 17980 v0 := b.NewValue0(v.Pos, OpOr16, t) 17981 v0.AddArg(z) 17982 v0.AddArg(x) 17983 v.AddArg(v0) 17984 return true 17985 } 17986 // match: (Or16 (Or16 z i:(Const16 <t>)) x) 17987 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 17988 // result: (Or16 i (Or16 <t> z x)) 17989 for { 17990 _ = v.Args[1] 17991 v_0 := v.Args[0] 17992 if v_0.Op != OpOr16 { 17993 break 17994 } 17995 _ = v_0.Args[1] 17996 z := v_0.Args[0] 17997 i := v_0.Args[1] 17998 if i.Op != OpConst16 { 17999 break 18000 } 18001 t := i.Type 18002 x := v.Args[1] 18003 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18004 break 18005 } 18006 v.reset(OpOr16) 18007 v.AddArg(i) 18008 v0 := b.NewValue0(v.Pos, OpOr16, t) 18009 v0.AddArg(z) 18010 v0.AddArg(x) 18011 v.AddArg(v0) 18012 return true 18013 } 18014 // match: (Or16 x (Or16 i:(Const16 <t>) z)) 18015 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18016 // result: (Or16 i (Or16 <t> z x)) 18017 for { 18018 _ = v.Args[1] 18019 x := v.Args[0] 18020 v_1 := v.Args[1] 18021 if v_1.Op != OpOr16 { 18022 break 18023 } 18024 _ = v_1.Args[1] 18025 i := v_1.Args[0] 18026 if i.Op != OpConst16 { 18027 break 18028 } 18029 t := i.Type 18030 z := v_1.Args[1] 18031 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18032 break 18033 } 18034 v.reset(OpOr16) 18035 v.AddArg(i) 18036 v0 := b.NewValue0(v.Pos, OpOr16, t) 18037 v0.AddArg(z) 18038 v0.AddArg(x) 18039 v.AddArg(v0) 18040 return true 18041 } 18042 // match: (Or16 x (Or16 z i:(Const16 <t>))) 18043 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18044 // result: (Or16 i (Or16 <t> z x)) 18045 for { 18046 _ = v.Args[1] 18047 x := v.Args[0] 18048 v_1 := v.Args[1] 18049 if v_1.Op != OpOr16 { 18050 break 18051 } 18052 _ = v_1.Args[1] 18053 z := v_1.Args[0] 18054 i := v_1.Args[1] 18055 if i.Op != OpConst16 { 18056 break 18057 } 18058 t := i.Type 18059 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18060 break 18061 } 18062 v.reset(OpOr16) 18063 v.AddArg(i) 18064 v0 := b.NewValue0(v.Pos, OpOr16, t) 18065 v0.AddArg(z) 18066 v0.AddArg(x) 18067 v.AddArg(v0) 18068 return true 18069 } 18070 // match: (Or16 (Const16 <t> [c]) (Or16 (Const16 <t> [d]) x)) 18071 // cond: 18072 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18073 for { 18074 _ = v.Args[1] 18075 v_0 := v.Args[0] 18076 if v_0.Op != OpConst16 { 18077 break 18078 } 18079 t := v_0.Type 18080 c := v_0.AuxInt 18081 v_1 := v.Args[1] 18082 if v_1.Op != OpOr16 { 18083 break 18084 } 18085 _ = v_1.Args[1] 18086 v_1_0 := v_1.Args[0] 18087 if v_1_0.Op != OpConst16 { 18088 break 18089 } 18090 if v_1_0.Type != t { 18091 break 18092 } 18093 d := v_1_0.AuxInt 18094 x := v_1.Args[1] 18095 v.reset(OpOr16) 18096 v0 := b.NewValue0(v.Pos, OpConst16, t) 18097 v0.AuxInt = int64(int16(c | d)) 18098 v.AddArg(v0) 18099 v.AddArg(x) 18100 return true 18101 } 18102 return false 18103 } 18104 func rewriteValuegeneric_OpOr16_20(v *Value) bool { 18105 b := v.Block 18106 _ = b 18107 // match: (Or16 (Const16 <t> [c]) (Or16 x (Const16 <t> [d]))) 18108 // cond: 18109 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18110 for { 18111 _ = v.Args[1] 18112 v_0 := v.Args[0] 18113 if v_0.Op != OpConst16 { 18114 break 18115 } 18116 t := v_0.Type 18117 c := v_0.AuxInt 18118 v_1 := v.Args[1] 18119 if v_1.Op != OpOr16 { 18120 break 18121 } 18122 _ = v_1.Args[1] 18123 x := v_1.Args[0] 18124 v_1_1 := v_1.Args[1] 18125 if v_1_1.Op != OpConst16 { 18126 break 18127 } 18128 if v_1_1.Type != t { 18129 break 18130 } 18131 d := v_1_1.AuxInt 18132 v.reset(OpOr16) 18133 v0 := b.NewValue0(v.Pos, OpConst16, t) 18134 v0.AuxInt = int64(int16(c | d)) 18135 v.AddArg(v0) 18136 v.AddArg(x) 18137 return true 18138 } 18139 // match: (Or16 (Or16 (Const16 <t> [d]) x) (Const16 <t> [c])) 18140 // cond: 18141 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18142 for { 18143 _ = v.Args[1] 18144 v_0 := v.Args[0] 18145 if v_0.Op != OpOr16 { 18146 break 18147 } 18148 _ = v_0.Args[1] 18149 v_0_0 := v_0.Args[0] 18150 if v_0_0.Op != OpConst16 { 18151 break 18152 } 18153 t := v_0_0.Type 18154 d := v_0_0.AuxInt 18155 x := v_0.Args[1] 18156 v_1 := v.Args[1] 18157 if v_1.Op != OpConst16 { 18158 break 18159 } 18160 if v_1.Type != t { 18161 break 18162 } 18163 c := v_1.AuxInt 18164 v.reset(OpOr16) 18165 v0 := b.NewValue0(v.Pos, OpConst16, t) 18166 v0.AuxInt = int64(int16(c | d)) 18167 v.AddArg(v0) 18168 v.AddArg(x) 18169 return true 18170 } 18171 // match: (Or16 (Or16 x (Const16 <t> [d])) (Const16 <t> [c])) 18172 // cond: 18173 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18174 for { 18175 _ = v.Args[1] 18176 v_0 := v.Args[0] 18177 if v_0.Op != OpOr16 { 18178 break 18179 } 18180 _ = v_0.Args[1] 18181 x := v_0.Args[0] 18182 v_0_1 := v_0.Args[1] 18183 if v_0_1.Op != OpConst16 { 18184 break 18185 } 18186 t := v_0_1.Type 18187 d := v_0_1.AuxInt 18188 v_1 := v.Args[1] 18189 if v_1.Op != OpConst16 { 18190 break 18191 } 18192 if v_1.Type != t { 18193 break 18194 } 18195 c := v_1.AuxInt 18196 v.reset(OpOr16) 18197 v0 := b.NewValue0(v.Pos, OpConst16, t) 18198 v0.AuxInt = int64(int16(c | d)) 18199 v.AddArg(v0) 18200 v.AddArg(x) 18201 return true 18202 } 18203 return false 18204 } 18205 func rewriteValuegeneric_OpOr32_0(v *Value) bool { 18206 // match: (Or32 (Const32 [c]) (Const32 [d])) 18207 // cond: 18208 // result: (Const32 [int64(int32(c|d))]) 18209 for { 18210 _ = v.Args[1] 18211 v_0 := v.Args[0] 18212 if v_0.Op != OpConst32 { 18213 break 18214 } 18215 c := v_0.AuxInt 18216 v_1 := v.Args[1] 18217 if v_1.Op != OpConst32 { 18218 break 18219 } 18220 d := v_1.AuxInt 18221 v.reset(OpConst32) 18222 v.AuxInt = int64(int32(c | d)) 18223 return true 18224 } 18225 // match: (Or32 (Const32 [d]) (Const32 [c])) 18226 // cond: 18227 // result: (Const32 [int64(int32(c|d))]) 18228 for { 18229 _ = v.Args[1] 18230 v_0 := v.Args[0] 18231 if v_0.Op != OpConst32 { 18232 break 18233 } 18234 d := v_0.AuxInt 18235 v_1 := v.Args[1] 18236 if v_1.Op != OpConst32 { 18237 break 18238 } 18239 c := v_1.AuxInt 18240 v.reset(OpConst32) 18241 v.AuxInt = int64(int32(c | d)) 18242 return true 18243 } 18244 // match: (Or32 x x) 18245 // cond: 18246 // result: x 18247 for { 18248 _ = v.Args[1] 18249 x := v.Args[0] 18250 if x != v.Args[1] { 18251 break 18252 } 18253 v.reset(OpCopy) 18254 v.Type = x.Type 18255 v.AddArg(x) 18256 return true 18257 } 18258 // match: (Or32 (Const32 [0]) x) 18259 // cond: 18260 // result: x 18261 for { 18262 _ = v.Args[1] 18263 v_0 := v.Args[0] 18264 if v_0.Op != OpConst32 { 18265 break 18266 } 18267 if v_0.AuxInt != 0 { 18268 break 18269 } 18270 x := v.Args[1] 18271 v.reset(OpCopy) 18272 v.Type = x.Type 18273 v.AddArg(x) 18274 return true 18275 } 18276 // match: (Or32 x (Const32 [0])) 18277 // cond: 18278 // result: x 18279 for { 18280 _ = v.Args[1] 18281 x := v.Args[0] 18282 v_1 := v.Args[1] 18283 if v_1.Op != OpConst32 { 18284 break 18285 } 18286 if v_1.AuxInt != 0 { 18287 break 18288 } 18289 v.reset(OpCopy) 18290 v.Type = x.Type 18291 v.AddArg(x) 18292 return true 18293 } 18294 // match: (Or32 (Const32 [-1]) _) 18295 // cond: 18296 // result: (Const32 [-1]) 18297 for { 18298 _ = v.Args[1] 18299 v_0 := v.Args[0] 18300 if v_0.Op != OpConst32 { 18301 break 18302 } 18303 if v_0.AuxInt != -1 { 18304 break 18305 } 18306 v.reset(OpConst32) 18307 v.AuxInt = -1 18308 return true 18309 } 18310 // match: (Or32 _ (Const32 [-1])) 18311 // cond: 18312 // result: (Const32 [-1]) 18313 for { 18314 _ = v.Args[1] 18315 v_1 := v.Args[1] 18316 if v_1.Op != OpConst32 { 18317 break 18318 } 18319 if v_1.AuxInt != -1 { 18320 break 18321 } 18322 v.reset(OpConst32) 18323 v.AuxInt = -1 18324 return true 18325 } 18326 // match: (Or32 x (Or32 x y)) 18327 // cond: 18328 // result: (Or32 x y) 18329 for { 18330 _ = v.Args[1] 18331 x := v.Args[0] 18332 v_1 := v.Args[1] 18333 if v_1.Op != OpOr32 { 18334 break 18335 } 18336 _ = v_1.Args[1] 18337 if x != v_1.Args[0] { 18338 break 18339 } 18340 y := v_1.Args[1] 18341 v.reset(OpOr32) 18342 v.AddArg(x) 18343 v.AddArg(y) 18344 return true 18345 } 18346 // match: (Or32 x (Or32 y x)) 18347 // cond: 18348 // result: (Or32 x y) 18349 for { 18350 _ = v.Args[1] 18351 x := v.Args[0] 18352 v_1 := v.Args[1] 18353 if v_1.Op != OpOr32 { 18354 break 18355 } 18356 _ = v_1.Args[1] 18357 y := v_1.Args[0] 18358 if x != v_1.Args[1] { 18359 break 18360 } 18361 v.reset(OpOr32) 18362 v.AddArg(x) 18363 v.AddArg(y) 18364 return true 18365 } 18366 // match: (Or32 (Or32 x y) x) 18367 // cond: 18368 // result: (Or32 x y) 18369 for { 18370 _ = v.Args[1] 18371 v_0 := v.Args[0] 18372 if v_0.Op != OpOr32 { 18373 break 18374 } 18375 _ = v_0.Args[1] 18376 x := v_0.Args[0] 18377 y := v_0.Args[1] 18378 if x != v.Args[1] { 18379 break 18380 } 18381 v.reset(OpOr32) 18382 v.AddArg(x) 18383 v.AddArg(y) 18384 return true 18385 } 18386 return false 18387 } 18388 func rewriteValuegeneric_OpOr32_10(v *Value) bool { 18389 b := v.Block 18390 _ = b 18391 // match: (Or32 (Or32 y x) x) 18392 // cond: 18393 // result: (Or32 x y) 18394 for { 18395 _ = v.Args[1] 18396 v_0 := v.Args[0] 18397 if v_0.Op != OpOr32 { 18398 break 18399 } 18400 _ = v_0.Args[1] 18401 y := v_0.Args[0] 18402 x := v_0.Args[1] 18403 if x != v.Args[1] { 18404 break 18405 } 18406 v.reset(OpOr32) 18407 v.AddArg(x) 18408 v.AddArg(y) 18409 return true 18410 } 18411 // match: (Or32 (And32 x (Const32 [c2])) (Const32 <t> [c1])) 18412 // cond: ^(c1 | c2) == 0 18413 // result: (Or32 (Const32 <t> [c1]) x) 18414 for { 18415 _ = v.Args[1] 18416 v_0 := v.Args[0] 18417 if v_0.Op != OpAnd32 { 18418 break 18419 } 18420 _ = v_0.Args[1] 18421 x := v_0.Args[0] 18422 v_0_1 := v_0.Args[1] 18423 if v_0_1.Op != OpConst32 { 18424 break 18425 } 18426 c2 := v_0_1.AuxInt 18427 v_1 := v.Args[1] 18428 if v_1.Op != OpConst32 { 18429 break 18430 } 18431 t := v_1.Type 18432 c1 := v_1.AuxInt 18433 if !(^(c1 | c2) == 0) { 18434 break 18435 } 18436 v.reset(OpOr32) 18437 v0 := b.NewValue0(v.Pos, OpConst32, t) 18438 v0.AuxInt = c1 18439 v.AddArg(v0) 18440 v.AddArg(x) 18441 return true 18442 } 18443 // match: (Or32 (And32 (Const32 [c2]) x) (Const32 <t> [c1])) 18444 // cond: ^(c1 | c2) == 0 18445 // result: (Or32 (Const32 <t> [c1]) x) 18446 for { 18447 _ = v.Args[1] 18448 v_0 := v.Args[0] 18449 if v_0.Op != OpAnd32 { 18450 break 18451 } 18452 _ = v_0.Args[1] 18453 v_0_0 := v_0.Args[0] 18454 if v_0_0.Op != OpConst32 { 18455 break 18456 } 18457 c2 := v_0_0.AuxInt 18458 x := v_0.Args[1] 18459 v_1 := v.Args[1] 18460 if v_1.Op != OpConst32 { 18461 break 18462 } 18463 t := v_1.Type 18464 c1 := v_1.AuxInt 18465 if !(^(c1 | c2) == 0) { 18466 break 18467 } 18468 v.reset(OpOr32) 18469 v0 := b.NewValue0(v.Pos, OpConst32, t) 18470 v0.AuxInt = c1 18471 v.AddArg(v0) 18472 v.AddArg(x) 18473 return true 18474 } 18475 // match: (Or32 (Const32 <t> [c1]) (And32 x (Const32 [c2]))) 18476 // cond: ^(c1 | c2) == 0 18477 // result: (Or32 (Const32 <t> [c1]) x) 18478 for { 18479 _ = v.Args[1] 18480 v_0 := v.Args[0] 18481 if v_0.Op != OpConst32 { 18482 break 18483 } 18484 t := v_0.Type 18485 c1 := v_0.AuxInt 18486 v_1 := v.Args[1] 18487 if v_1.Op != OpAnd32 { 18488 break 18489 } 18490 _ = v_1.Args[1] 18491 x := v_1.Args[0] 18492 v_1_1 := v_1.Args[1] 18493 if v_1_1.Op != OpConst32 { 18494 break 18495 } 18496 c2 := v_1_1.AuxInt 18497 if !(^(c1 | c2) == 0) { 18498 break 18499 } 18500 v.reset(OpOr32) 18501 v0 := b.NewValue0(v.Pos, OpConst32, t) 18502 v0.AuxInt = c1 18503 v.AddArg(v0) 18504 v.AddArg(x) 18505 return true 18506 } 18507 // match: (Or32 (Const32 <t> [c1]) (And32 (Const32 [c2]) x)) 18508 // cond: ^(c1 | c2) == 0 18509 // result: (Or32 (Const32 <t> [c1]) x) 18510 for { 18511 _ = v.Args[1] 18512 v_0 := v.Args[0] 18513 if v_0.Op != OpConst32 { 18514 break 18515 } 18516 t := v_0.Type 18517 c1 := v_0.AuxInt 18518 v_1 := v.Args[1] 18519 if v_1.Op != OpAnd32 { 18520 break 18521 } 18522 _ = v_1.Args[1] 18523 v_1_0 := v_1.Args[0] 18524 if v_1_0.Op != OpConst32 { 18525 break 18526 } 18527 c2 := v_1_0.AuxInt 18528 x := v_1.Args[1] 18529 if !(^(c1 | c2) == 0) { 18530 break 18531 } 18532 v.reset(OpOr32) 18533 v0 := b.NewValue0(v.Pos, OpConst32, t) 18534 v0.AuxInt = c1 18535 v.AddArg(v0) 18536 v.AddArg(x) 18537 return true 18538 } 18539 // match: (Or32 (Or32 i:(Const32 <t>) z) x) 18540 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 18541 // result: (Or32 i (Or32 <t> z x)) 18542 for { 18543 _ = v.Args[1] 18544 v_0 := v.Args[0] 18545 if v_0.Op != OpOr32 { 18546 break 18547 } 18548 _ = v_0.Args[1] 18549 i := v_0.Args[0] 18550 if i.Op != OpConst32 { 18551 break 18552 } 18553 t := i.Type 18554 z := v_0.Args[1] 18555 x := v.Args[1] 18556 if !(z.Op != OpConst32 && x.Op != OpConst32) { 18557 break 18558 } 18559 v.reset(OpOr32) 18560 v.AddArg(i) 18561 v0 := b.NewValue0(v.Pos, OpOr32, t) 18562 v0.AddArg(z) 18563 v0.AddArg(x) 18564 v.AddArg(v0) 18565 return true 18566 } 18567 // match: (Or32 (Or32 z i:(Const32 <t>)) x) 18568 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 18569 // result: (Or32 i (Or32 <t> z x)) 18570 for { 18571 _ = v.Args[1] 18572 v_0 := v.Args[0] 18573 if v_0.Op != OpOr32 { 18574 break 18575 } 18576 _ = v_0.Args[1] 18577 z := v_0.Args[0] 18578 i := v_0.Args[1] 18579 if i.Op != OpConst32 { 18580 break 18581 } 18582 t := i.Type 18583 x := v.Args[1] 18584 if !(z.Op != OpConst32 && x.Op != OpConst32) { 18585 break 18586 } 18587 v.reset(OpOr32) 18588 v.AddArg(i) 18589 v0 := b.NewValue0(v.Pos, OpOr32, t) 18590 v0.AddArg(z) 18591 v0.AddArg(x) 18592 v.AddArg(v0) 18593 return true 18594 } 18595 // match: (Or32 x (Or32 i:(Const32 <t>) z)) 18596 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 18597 // result: (Or32 i (Or32 <t> z x)) 18598 for { 18599 _ = v.Args[1] 18600 x := v.Args[0] 18601 v_1 := v.Args[1] 18602 if v_1.Op != OpOr32 { 18603 break 18604 } 18605 _ = v_1.Args[1] 18606 i := v_1.Args[0] 18607 if i.Op != OpConst32 { 18608 break 18609 } 18610 t := i.Type 18611 z := v_1.Args[1] 18612 if !(z.Op != OpConst32 && x.Op != OpConst32) { 18613 break 18614 } 18615 v.reset(OpOr32) 18616 v.AddArg(i) 18617 v0 := b.NewValue0(v.Pos, OpOr32, t) 18618 v0.AddArg(z) 18619 v0.AddArg(x) 18620 v.AddArg(v0) 18621 return true 18622 } 18623 // match: (Or32 x (Or32 z i:(Const32 <t>))) 18624 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 18625 // result: (Or32 i (Or32 <t> z x)) 18626 for { 18627 _ = v.Args[1] 18628 x := v.Args[0] 18629 v_1 := v.Args[1] 18630 if v_1.Op != OpOr32 { 18631 break 18632 } 18633 _ = v_1.Args[1] 18634 z := v_1.Args[0] 18635 i := v_1.Args[1] 18636 if i.Op != OpConst32 { 18637 break 18638 } 18639 t := i.Type 18640 if !(z.Op != OpConst32 && x.Op != OpConst32) { 18641 break 18642 } 18643 v.reset(OpOr32) 18644 v.AddArg(i) 18645 v0 := b.NewValue0(v.Pos, OpOr32, t) 18646 v0.AddArg(z) 18647 v0.AddArg(x) 18648 v.AddArg(v0) 18649 return true 18650 } 18651 // match: (Or32 (Const32 <t> [c]) (Or32 (Const32 <t> [d]) x)) 18652 // cond: 18653 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 18654 for { 18655 _ = v.Args[1] 18656 v_0 := v.Args[0] 18657 if v_0.Op != OpConst32 { 18658 break 18659 } 18660 t := v_0.Type 18661 c := v_0.AuxInt 18662 v_1 := v.Args[1] 18663 if v_1.Op != OpOr32 { 18664 break 18665 } 18666 _ = v_1.Args[1] 18667 v_1_0 := v_1.Args[0] 18668 if v_1_0.Op != OpConst32 { 18669 break 18670 } 18671 if v_1_0.Type != t { 18672 break 18673 } 18674 d := v_1_0.AuxInt 18675 x := v_1.Args[1] 18676 v.reset(OpOr32) 18677 v0 := b.NewValue0(v.Pos, OpConst32, t) 18678 v0.AuxInt = int64(int32(c | d)) 18679 v.AddArg(v0) 18680 v.AddArg(x) 18681 return true 18682 } 18683 return false 18684 } 18685 func rewriteValuegeneric_OpOr32_20(v *Value) bool { 18686 b := v.Block 18687 _ = b 18688 // match: (Or32 (Const32 <t> [c]) (Or32 x (Const32 <t> [d]))) 18689 // cond: 18690 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 18691 for { 18692 _ = v.Args[1] 18693 v_0 := v.Args[0] 18694 if v_0.Op != OpConst32 { 18695 break 18696 } 18697 t := v_0.Type 18698 c := v_0.AuxInt 18699 v_1 := v.Args[1] 18700 if v_1.Op != OpOr32 { 18701 break 18702 } 18703 _ = v_1.Args[1] 18704 x := v_1.Args[0] 18705 v_1_1 := v_1.Args[1] 18706 if v_1_1.Op != OpConst32 { 18707 break 18708 } 18709 if v_1_1.Type != t { 18710 break 18711 } 18712 d := v_1_1.AuxInt 18713 v.reset(OpOr32) 18714 v0 := b.NewValue0(v.Pos, OpConst32, t) 18715 v0.AuxInt = int64(int32(c | d)) 18716 v.AddArg(v0) 18717 v.AddArg(x) 18718 return true 18719 } 18720 // match: (Or32 (Or32 (Const32 <t> [d]) x) (Const32 <t> [c])) 18721 // cond: 18722 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 18723 for { 18724 _ = v.Args[1] 18725 v_0 := v.Args[0] 18726 if v_0.Op != OpOr32 { 18727 break 18728 } 18729 _ = v_0.Args[1] 18730 v_0_0 := v_0.Args[0] 18731 if v_0_0.Op != OpConst32 { 18732 break 18733 } 18734 t := v_0_0.Type 18735 d := v_0_0.AuxInt 18736 x := v_0.Args[1] 18737 v_1 := v.Args[1] 18738 if v_1.Op != OpConst32 { 18739 break 18740 } 18741 if v_1.Type != t { 18742 break 18743 } 18744 c := v_1.AuxInt 18745 v.reset(OpOr32) 18746 v0 := b.NewValue0(v.Pos, OpConst32, t) 18747 v0.AuxInt = int64(int32(c | d)) 18748 v.AddArg(v0) 18749 v.AddArg(x) 18750 return true 18751 } 18752 // match: (Or32 (Or32 x (Const32 <t> [d])) (Const32 <t> [c])) 18753 // cond: 18754 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 18755 for { 18756 _ = v.Args[1] 18757 v_0 := v.Args[0] 18758 if v_0.Op != OpOr32 { 18759 break 18760 } 18761 _ = v_0.Args[1] 18762 x := v_0.Args[0] 18763 v_0_1 := v_0.Args[1] 18764 if v_0_1.Op != OpConst32 { 18765 break 18766 } 18767 t := v_0_1.Type 18768 d := v_0_1.AuxInt 18769 v_1 := v.Args[1] 18770 if v_1.Op != OpConst32 { 18771 break 18772 } 18773 if v_1.Type != t { 18774 break 18775 } 18776 c := v_1.AuxInt 18777 v.reset(OpOr32) 18778 v0 := b.NewValue0(v.Pos, OpConst32, t) 18779 v0.AuxInt = int64(int32(c | d)) 18780 v.AddArg(v0) 18781 v.AddArg(x) 18782 return true 18783 } 18784 return false 18785 } 18786 func rewriteValuegeneric_OpOr64_0(v *Value) bool { 18787 // match: (Or64 (Const64 [c]) (Const64 [d])) 18788 // cond: 18789 // result: (Const64 [c|d]) 18790 for { 18791 _ = v.Args[1] 18792 v_0 := v.Args[0] 18793 if v_0.Op != OpConst64 { 18794 break 18795 } 18796 c := v_0.AuxInt 18797 v_1 := v.Args[1] 18798 if v_1.Op != OpConst64 { 18799 break 18800 } 18801 d := v_1.AuxInt 18802 v.reset(OpConst64) 18803 v.AuxInt = c | d 18804 return true 18805 } 18806 // match: (Or64 (Const64 [d]) (Const64 [c])) 18807 // cond: 18808 // result: (Const64 [c|d]) 18809 for { 18810 _ = v.Args[1] 18811 v_0 := v.Args[0] 18812 if v_0.Op != OpConst64 { 18813 break 18814 } 18815 d := v_0.AuxInt 18816 v_1 := v.Args[1] 18817 if v_1.Op != OpConst64 { 18818 break 18819 } 18820 c := v_1.AuxInt 18821 v.reset(OpConst64) 18822 v.AuxInt = c | d 18823 return true 18824 } 18825 // match: (Or64 x x) 18826 // cond: 18827 // result: x 18828 for { 18829 _ = v.Args[1] 18830 x := v.Args[0] 18831 if x != v.Args[1] { 18832 break 18833 } 18834 v.reset(OpCopy) 18835 v.Type = x.Type 18836 v.AddArg(x) 18837 return true 18838 } 18839 // match: (Or64 (Const64 [0]) x) 18840 // cond: 18841 // result: x 18842 for { 18843 _ = v.Args[1] 18844 v_0 := v.Args[0] 18845 if v_0.Op != OpConst64 { 18846 break 18847 } 18848 if v_0.AuxInt != 0 { 18849 break 18850 } 18851 x := v.Args[1] 18852 v.reset(OpCopy) 18853 v.Type = x.Type 18854 v.AddArg(x) 18855 return true 18856 } 18857 // match: (Or64 x (Const64 [0])) 18858 // cond: 18859 // result: x 18860 for { 18861 _ = v.Args[1] 18862 x := v.Args[0] 18863 v_1 := v.Args[1] 18864 if v_1.Op != OpConst64 { 18865 break 18866 } 18867 if v_1.AuxInt != 0 { 18868 break 18869 } 18870 v.reset(OpCopy) 18871 v.Type = x.Type 18872 v.AddArg(x) 18873 return true 18874 } 18875 // match: (Or64 (Const64 [-1]) _) 18876 // cond: 18877 // result: (Const64 [-1]) 18878 for { 18879 _ = v.Args[1] 18880 v_0 := v.Args[0] 18881 if v_0.Op != OpConst64 { 18882 break 18883 } 18884 if v_0.AuxInt != -1 { 18885 break 18886 } 18887 v.reset(OpConst64) 18888 v.AuxInt = -1 18889 return true 18890 } 18891 // match: (Or64 _ (Const64 [-1])) 18892 // cond: 18893 // result: (Const64 [-1]) 18894 for { 18895 _ = v.Args[1] 18896 v_1 := v.Args[1] 18897 if v_1.Op != OpConst64 { 18898 break 18899 } 18900 if v_1.AuxInt != -1 { 18901 break 18902 } 18903 v.reset(OpConst64) 18904 v.AuxInt = -1 18905 return true 18906 } 18907 // match: (Or64 x (Or64 x y)) 18908 // cond: 18909 // result: (Or64 x y) 18910 for { 18911 _ = v.Args[1] 18912 x := v.Args[0] 18913 v_1 := v.Args[1] 18914 if v_1.Op != OpOr64 { 18915 break 18916 } 18917 _ = v_1.Args[1] 18918 if x != v_1.Args[0] { 18919 break 18920 } 18921 y := v_1.Args[1] 18922 v.reset(OpOr64) 18923 v.AddArg(x) 18924 v.AddArg(y) 18925 return true 18926 } 18927 // match: (Or64 x (Or64 y x)) 18928 // cond: 18929 // result: (Or64 x y) 18930 for { 18931 _ = v.Args[1] 18932 x := v.Args[0] 18933 v_1 := v.Args[1] 18934 if v_1.Op != OpOr64 { 18935 break 18936 } 18937 _ = v_1.Args[1] 18938 y := v_1.Args[0] 18939 if x != v_1.Args[1] { 18940 break 18941 } 18942 v.reset(OpOr64) 18943 v.AddArg(x) 18944 v.AddArg(y) 18945 return true 18946 } 18947 // match: (Or64 (Or64 x y) x) 18948 // cond: 18949 // result: (Or64 x y) 18950 for { 18951 _ = v.Args[1] 18952 v_0 := v.Args[0] 18953 if v_0.Op != OpOr64 { 18954 break 18955 } 18956 _ = v_0.Args[1] 18957 x := v_0.Args[0] 18958 y := v_0.Args[1] 18959 if x != v.Args[1] { 18960 break 18961 } 18962 v.reset(OpOr64) 18963 v.AddArg(x) 18964 v.AddArg(y) 18965 return true 18966 } 18967 return false 18968 } 18969 func rewriteValuegeneric_OpOr64_10(v *Value) bool { 18970 b := v.Block 18971 _ = b 18972 // match: (Or64 (Or64 y x) x) 18973 // cond: 18974 // result: (Or64 x y) 18975 for { 18976 _ = v.Args[1] 18977 v_0 := v.Args[0] 18978 if v_0.Op != OpOr64 { 18979 break 18980 } 18981 _ = v_0.Args[1] 18982 y := v_0.Args[0] 18983 x := v_0.Args[1] 18984 if x != v.Args[1] { 18985 break 18986 } 18987 v.reset(OpOr64) 18988 v.AddArg(x) 18989 v.AddArg(y) 18990 return true 18991 } 18992 // match: (Or64 (And64 x (Const64 [c2])) (Const64 <t> [c1])) 18993 // cond: ^(c1 | c2) == 0 18994 // result: (Or64 (Const64 <t> [c1]) x) 18995 for { 18996 _ = v.Args[1] 18997 v_0 := v.Args[0] 18998 if v_0.Op != OpAnd64 { 18999 break 19000 } 19001 _ = v_0.Args[1] 19002 x := v_0.Args[0] 19003 v_0_1 := v_0.Args[1] 19004 if v_0_1.Op != OpConst64 { 19005 break 19006 } 19007 c2 := v_0_1.AuxInt 19008 v_1 := v.Args[1] 19009 if v_1.Op != OpConst64 { 19010 break 19011 } 19012 t := v_1.Type 19013 c1 := v_1.AuxInt 19014 if !(^(c1 | c2) == 0) { 19015 break 19016 } 19017 v.reset(OpOr64) 19018 v0 := b.NewValue0(v.Pos, OpConst64, t) 19019 v0.AuxInt = c1 19020 v.AddArg(v0) 19021 v.AddArg(x) 19022 return true 19023 } 19024 // match: (Or64 (And64 (Const64 [c2]) x) (Const64 <t> [c1])) 19025 // cond: ^(c1 | c2) == 0 19026 // result: (Or64 (Const64 <t> [c1]) x) 19027 for { 19028 _ = v.Args[1] 19029 v_0 := v.Args[0] 19030 if v_0.Op != OpAnd64 { 19031 break 19032 } 19033 _ = v_0.Args[1] 19034 v_0_0 := v_0.Args[0] 19035 if v_0_0.Op != OpConst64 { 19036 break 19037 } 19038 c2 := v_0_0.AuxInt 19039 x := v_0.Args[1] 19040 v_1 := v.Args[1] 19041 if v_1.Op != OpConst64 { 19042 break 19043 } 19044 t := v_1.Type 19045 c1 := v_1.AuxInt 19046 if !(^(c1 | c2) == 0) { 19047 break 19048 } 19049 v.reset(OpOr64) 19050 v0 := b.NewValue0(v.Pos, OpConst64, t) 19051 v0.AuxInt = c1 19052 v.AddArg(v0) 19053 v.AddArg(x) 19054 return true 19055 } 19056 // match: (Or64 (Const64 <t> [c1]) (And64 x (Const64 [c2]))) 19057 // cond: ^(c1 | c2) == 0 19058 // result: (Or64 (Const64 <t> [c1]) x) 19059 for { 19060 _ = v.Args[1] 19061 v_0 := v.Args[0] 19062 if v_0.Op != OpConst64 { 19063 break 19064 } 19065 t := v_0.Type 19066 c1 := v_0.AuxInt 19067 v_1 := v.Args[1] 19068 if v_1.Op != OpAnd64 { 19069 break 19070 } 19071 _ = v_1.Args[1] 19072 x := v_1.Args[0] 19073 v_1_1 := v_1.Args[1] 19074 if v_1_1.Op != OpConst64 { 19075 break 19076 } 19077 c2 := v_1_1.AuxInt 19078 if !(^(c1 | c2) == 0) { 19079 break 19080 } 19081 v.reset(OpOr64) 19082 v0 := b.NewValue0(v.Pos, OpConst64, t) 19083 v0.AuxInt = c1 19084 v.AddArg(v0) 19085 v.AddArg(x) 19086 return true 19087 } 19088 // match: (Or64 (Const64 <t> [c1]) (And64 (Const64 [c2]) x)) 19089 // cond: ^(c1 | c2) == 0 19090 // result: (Or64 (Const64 <t> [c1]) x) 19091 for { 19092 _ = v.Args[1] 19093 v_0 := v.Args[0] 19094 if v_0.Op != OpConst64 { 19095 break 19096 } 19097 t := v_0.Type 19098 c1 := v_0.AuxInt 19099 v_1 := v.Args[1] 19100 if v_1.Op != OpAnd64 { 19101 break 19102 } 19103 _ = v_1.Args[1] 19104 v_1_0 := v_1.Args[0] 19105 if v_1_0.Op != OpConst64 { 19106 break 19107 } 19108 c2 := v_1_0.AuxInt 19109 x := v_1.Args[1] 19110 if !(^(c1 | c2) == 0) { 19111 break 19112 } 19113 v.reset(OpOr64) 19114 v0 := b.NewValue0(v.Pos, OpConst64, t) 19115 v0.AuxInt = c1 19116 v.AddArg(v0) 19117 v.AddArg(x) 19118 return true 19119 } 19120 // match: (Or64 (Or64 i:(Const64 <t>) z) x) 19121 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19122 // result: (Or64 i (Or64 <t> z x)) 19123 for { 19124 _ = v.Args[1] 19125 v_0 := v.Args[0] 19126 if v_0.Op != OpOr64 { 19127 break 19128 } 19129 _ = v_0.Args[1] 19130 i := v_0.Args[0] 19131 if i.Op != OpConst64 { 19132 break 19133 } 19134 t := i.Type 19135 z := v_0.Args[1] 19136 x := v.Args[1] 19137 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19138 break 19139 } 19140 v.reset(OpOr64) 19141 v.AddArg(i) 19142 v0 := b.NewValue0(v.Pos, OpOr64, t) 19143 v0.AddArg(z) 19144 v0.AddArg(x) 19145 v.AddArg(v0) 19146 return true 19147 } 19148 // match: (Or64 (Or64 z i:(Const64 <t>)) x) 19149 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19150 // result: (Or64 i (Or64 <t> z x)) 19151 for { 19152 _ = v.Args[1] 19153 v_0 := v.Args[0] 19154 if v_0.Op != OpOr64 { 19155 break 19156 } 19157 _ = v_0.Args[1] 19158 z := v_0.Args[0] 19159 i := v_0.Args[1] 19160 if i.Op != OpConst64 { 19161 break 19162 } 19163 t := i.Type 19164 x := v.Args[1] 19165 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19166 break 19167 } 19168 v.reset(OpOr64) 19169 v.AddArg(i) 19170 v0 := b.NewValue0(v.Pos, OpOr64, t) 19171 v0.AddArg(z) 19172 v0.AddArg(x) 19173 v.AddArg(v0) 19174 return true 19175 } 19176 // match: (Or64 x (Or64 i:(Const64 <t>) z)) 19177 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19178 // result: (Or64 i (Or64 <t> z x)) 19179 for { 19180 _ = v.Args[1] 19181 x := v.Args[0] 19182 v_1 := v.Args[1] 19183 if v_1.Op != OpOr64 { 19184 break 19185 } 19186 _ = v_1.Args[1] 19187 i := v_1.Args[0] 19188 if i.Op != OpConst64 { 19189 break 19190 } 19191 t := i.Type 19192 z := v_1.Args[1] 19193 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19194 break 19195 } 19196 v.reset(OpOr64) 19197 v.AddArg(i) 19198 v0 := b.NewValue0(v.Pos, OpOr64, t) 19199 v0.AddArg(z) 19200 v0.AddArg(x) 19201 v.AddArg(v0) 19202 return true 19203 } 19204 // match: (Or64 x (Or64 z i:(Const64 <t>))) 19205 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19206 // result: (Or64 i (Or64 <t> z x)) 19207 for { 19208 _ = v.Args[1] 19209 x := v.Args[0] 19210 v_1 := v.Args[1] 19211 if v_1.Op != OpOr64 { 19212 break 19213 } 19214 _ = v_1.Args[1] 19215 z := v_1.Args[0] 19216 i := v_1.Args[1] 19217 if i.Op != OpConst64 { 19218 break 19219 } 19220 t := i.Type 19221 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19222 break 19223 } 19224 v.reset(OpOr64) 19225 v.AddArg(i) 19226 v0 := b.NewValue0(v.Pos, OpOr64, t) 19227 v0.AddArg(z) 19228 v0.AddArg(x) 19229 v.AddArg(v0) 19230 return true 19231 } 19232 // match: (Or64 (Const64 <t> [c]) (Or64 (Const64 <t> [d]) x)) 19233 // cond: 19234 // result: (Or64 (Const64 <t> [c|d]) x) 19235 for { 19236 _ = v.Args[1] 19237 v_0 := v.Args[0] 19238 if v_0.Op != OpConst64 { 19239 break 19240 } 19241 t := v_0.Type 19242 c := v_0.AuxInt 19243 v_1 := v.Args[1] 19244 if v_1.Op != OpOr64 { 19245 break 19246 } 19247 _ = v_1.Args[1] 19248 v_1_0 := v_1.Args[0] 19249 if v_1_0.Op != OpConst64 { 19250 break 19251 } 19252 if v_1_0.Type != t { 19253 break 19254 } 19255 d := v_1_0.AuxInt 19256 x := v_1.Args[1] 19257 v.reset(OpOr64) 19258 v0 := b.NewValue0(v.Pos, OpConst64, t) 19259 v0.AuxInt = c | d 19260 v.AddArg(v0) 19261 v.AddArg(x) 19262 return true 19263 } 19264 return false 19265 } 19266 func rewriteValuegeneric_OpOr64_20(v *Value) bool { 19267 b := v.Block 19268 _ = b 19269 // match: (Or64 (Const64 <t> [c]) (Or64 x (Const64 <t> [d]))) 19270 // cond: 19271 // result: (Or64 (Const64 <t> [c|d]) x) 19272 for { 19273 _ = v.Args[1] 19274 v_0 := v.Args[0] 19275 if v_0.Op != OpConst64 { 19276 break 19277 } 19278 t := v_0.Type 19279 c := v_0.AuxInt 19280 v_1 := v.Args[1] 19281 if v_1.Op != OpOr64 { 19282 break 19283 } 19284 _ = v_1.Args[1] 19285 x := v_1.Args[0] 19286 v_1_1 := v_1.Args[1] 19287 if v_1_1.Op != OpConst64 { 19288 break 19289 } 19290 if v_1_1.Type != t { 19291 break 19292 } 19293 d := v_1_1.AuxInt 19294 v.reset(OpOr64) 19295 v0 := b.NewValue0(v.Pos, OpConst64, t) 19296 v0.AuxInt = c | d 19297 v.AddArg(v0) 19298 v.AddArg(x) 19299 return true 19300 } 19301 // match: (Or64 (Or64 (Const64 <t> [d]) x) (Const64 <t> [c])) 19302 // cond: 19303 // result: (Or64 (Const64 <t> [c|d]) x) 19304 for { 19305 _ = v.Args[1] 19306 v_0 := v.Args[0] 19307 if v_0.Op != OpOr64 { 19308 break 19309 } 19310 _ = v_0.Args[1] 19311 v_0_0 := v_0.Args[0] 19312 if v_0_0.Op != OpConst64 { 19313 break 19314 } 19315 t := v_0_0.Type 19316 d := v_0_0.AuxInt 19317 x := v_0.Args[1] 19318 v_1 := v.Args[1] 19319 if v_1.Op != OpConst64 { 19320 break 19321 } 19322 if v_1.Type != t { 19323 break 19324 } 19325 c := v_1.AuxInt 19326 v.reset(OpOr64) 19327 v0 := b.NewValue0(v.Pos, OpConst64, t) 19328 v0.AuxInt = c | d 19329 v.AddArg(v0) 19330 v.AddArg(x) 19331 return true 19332 } 19333 // match: (Or64 (Or64 x (Const64 <t> [d])) (Const64 <t> [c])) 19334 // cond: 19335 // result: (Or64 (Const64 <t> [c|d]) x) 19336 for { 19337 _ = v.Args[1] 19338 v_0 := v.Args[0] 19339 if v_0.Op != OpOr64 { 19340 break 19341 } 19342 _ = v_0.Args[1] 19343 x := v_0.Args[0] 19344 v_0_1 := v_0.Args[1] 19345 if v_0_1.Op != OpConst64 { 19346 break 19347 } 19348 t := v_0_1.Type 19349 d := v_0_1.AuxInt 19350 v_1 := v.Args[1] 19351 if v_1.Op != OpConst64 { 19352 break 19353 } 19354 if v_1.Type != t { 19355 break 19356 } 19357 c := v_1.AuxInt 19358 v.reset(OpOr64) 19359 v0 := b.NewValue0(v.Pos, OpConst64, t) 19360 v0.AuxInt = c | d 19361 v.AddArg(v0) 19362 v.AddArg(x) 19363 return true 19364 } 19365 return false 19366 } 19367 func rewriteValuegeneric_OpOr8_0(v *Value) bool { 19368 // match: (Or8 (Const8 [c]) (Const8 [d])) 19369 // cond: 19370 // result: (Const8 [int64(int8(c|d))]) 19371 for { 19372 _ = v.Args[1] 19373 v_0 := v.Args[0] 19374 if v_0.Op != OpConst8 { 19375 break 19376 } 19377 c := v_0.AuxInt 19378 v_1 := v.Args[1] 19379 if v_1.Op != OpConst8 { 19380 break 19381 } 19382 d := v_1.AuxInt 19383 v.reset(OpConst8) 19384 v.AuxInt = int64(int8(c | d)) 19385 return true 19386 } 19387 // match: (Or8 (Const8 [d]) (Const8 [c])) 19388 // cond: 19389 // result: (Const8 [int64(int8(c|d))]) 19390 for { 19391 _ = v.Args[1] 19392 v_0 := v.Args[0] 19393 if v_0.Op != OpConst8 { 19394 break 19395 } 19396 d := v_0.AuxInt 19397 v_1 := v.Args[1] 19398 if v_1.Op != OpConst8 { 19399 break 19400 } 19401 c := v_1.AuxInt 19402 v.reset(OpConst8) 19403 v.AuxInt = int64(int8(c | d)) 19404 return true 19405 } 19406 // match: (Or8 x x) 19407 // cond: 19408 // result: x 19409 for { 19410 _ = v.Args[1] 19411 x := v.Args[0] 19412 if x != v.Args[1] { 19413 break 19414 } 19415 v.reset(OpCopy) 19416 v.Type = x.Type 19417 v.AddArg(x) 19418 return true 19419 } 19420 // match: (Or8 (Const8 [0]) x) 19421 // cond: 19422 // result: x 19423 for { 19424 _ = v.Args[1] 19425 v_0 := v.Args[0] 19426 if v_0.Op != OpConst8 { 19427 break 19428 } 19429 if v_0.AuxInt != 0 { 19430 break 19431 } 19432 x := v.Args[1] 19433 v.reset(OpCopy) 19434 v.Type = x.Type 19435 v.AddArg(x) 19436 return true 19437 } 19438 // match: (Or8 x (Const8 [0])) 19439 // cond: 19440 // result: x 19441 for { 19442 _ = v.Args[1] 19443 x := v.Args[0] 19444 v_1 := v.Args[1] 19445 if v_1.Op != OpConst8 { 19446 break 19447 } 19448 if v_1.AuxInt != 0 { 19449 break 19450 } 19451 v.reset(OpCopy) 19452 v.Type = x.Type 19453 v.AddArg(x) 19454 return true 19455 } 19456 // match: (Or8 (Const8 [-1]) _) 19457 // cond: 19458 // result: (Const8 [-1]) 19459 for { 19460 _ = v.Args[1] 19461 v_0 := v.Args[0] 19462 if v_0.Op != OpConst8 { 19463 break 19464 } 19465 if v_0.AuxInt != -1 { 19466 break 19467 } 19468 v.reset(OpConst8) 19469 v.AuxInt = -1 19470 return true 19471 } 19472 // match: (Or8 _ (Const8 [-1])) 19473 // cond: 19474 // result: (Const8 [-1]) 19475 for { 19476 _ = v.Args[1] 19477 v_1 := v.Args[1] 19478 if v_1.Op != OpConst8 { 19479 break 19480 } 19481 if v_1.AuxInt != -1 { 19482 break 19483 } 19484 v.reset(OpConst8) 19485 v.AuxInt = -1 19486 return true 19487 } 19488 // match: (Or8 x (Or8 x y)) 19489 // cond: 19490 // result: (Or8 x y) 19491 for { 19492 _ = v.Args[1] 19493 x := v.Args[0] 19494 v_1 := v.Args[1] 19495 if v_1.Op != OpOr8 { 19496 break 19497 } 19498 _ = v_1.Args[1] 19499 if x != v_1.Args[0] { 19500 break 19501 } 19502 y := v_1.Args[1] 19503 v.reset(OpOr8) 19504 v.AddArg(x) 19505 v.AddArg(y) 19506 return true 19507 } 19508 // match: (Or8 x (Or8 y x)) 19509 // cond: 19510 // result: (Or8 x y) 19511 for { 19512 _ = v.Args[1] 19513 x := v.Args[0] 19514 v_1 := v.Args[1] 19515 if v_1.Op != OpOr8 { 19516 break 19517 } 19518 _ = v_1.Args[1] 19519 y := v_1.Args[0] 19520 if x != v_1.Args[1] { 19521 break 19522 } 19523 v.reset(OpOr8) 19524 v.AddArg(x) 19525 v.AddArg(y) 19526 return true 19527 } 19528 // match: (Or8 (Or8 x y) x) 19529 // cond: 19530 // result: (Or8 x y) 19531 for { 19532 _ = v.Args[1] 19533 v_0 := v.Args[0] 19534 if v_0.Op != OpOr8 { 19535 break 19536 } 19537 _ = v_0.Args[1] 19538 x := v_0.Args[0] 19539 y := v_0.Args[1] 19540 if x != v.Args[1] { 19541 break 19542 } 19543 v.reset(OpOr8) 19544 v.AddArg(x) 19545 v.AddArg(y) 19546 return true 19547 } 19548 return false 19549 } 19550 func rewriteValuegeneric_OpOr8_10(v *Value) bool { 19551 b := v.Block 19552 _ = b 19553 // match: (Or8 (Or8 y x) x) 19554 // cond: 19555 // result: (Or8 x y) 19556 for { 19557 _ = v.Args[1] 19558 v_0 := v.Args[0] 19559 if v_0.Op != OpOr8 { 19560 break 19561 } 19562 _ = v_0.Args[1] 19563 y := v_0.Args[0] 19564 x := v_0.Args[1] 19565 if x != v.Args[1] { 19566 break 19567 } 19568 v.reset(OpOr8) 19569 v.AddArg(x) 19570 v.AddArg(y) 19571 return true 19572 } 19573 // match: (Or8 (And8 x (Const8 [c2])) (Const8 <t> [c1])) 19574 // cond: ^(c1 | c2) == 0 19575 // result: (Or8 (Const8 <t> [c1]) x) 19576 for { 19577 _ = v.Args[1] 19578 v_0 := v.Args[0] 19579 if v_0.Op != OpAnd8 { 19580 break 19581 } 19582 _ = v_0.Args[1] 19583 x := v_0.Args[0] 19584 v_0_1 := v_0.Args[1] 19585 if v_0_1.Op != OpConst8 { 19586 break 19587 } 19588 c2 := v_0_1.AuxInt 19589 v_1 := v.Args[1] 19590 if v_1.Op != OpConst8 { 19591 break 19592 } 19593 t := v_1.Type 19594 c1 := v_1.AuxInt 19595 if !(^(c1 | c2) == 0) { 19596 break 19597 } 19598 v.reset(OpOr8) 19599 v0 := b.NewValue0(v.Pos, OpConst8, t) 19600 v0.AuxInt = c1 19601 v.AddArg(v0) 19602 v.AddArg(x) 19603 return true 19604 } 19605 // match: (Or8 (And8 (Const8 [c2]) x) (Const8 <t> [c1])) 19606 // cond: ^(c1 | c2) == 0 19607 // result: (Or8 (Const8 <t> [c1]) x) 19608 for { 19609 _ = v.Args[1] 19610 v_0 := v.Args[0] 19611 if v_0.Op != OpAnd8 { 19612 break 19613 } 19614 _ = v_0.Args[1] 19615 v_0_0 := v_0.Args[0] 19616 if v_0_0.Op != OpConst8 { 19617 break 19618 } 19619 c2 := v_0_0.AuxInt 19620 x := v_0.Args[1] 19621 v_1 := v.Args[1] 19622 if v_1.Op != OpConst8 { 19623 break 19624 } 19625 t := v_1.Type 19626 c1 := v_1.AuxInt 19627 if !(^(c1 | c2) == 0) { 19628 break 19629 } 19630 v.reset(OpOr8) 19631 v0 := b.NewValue0(v.Pos, OpConst8, t) 19632 v0.AuxInt = c1 19633 v.AddArg(v0) 19634 v.AddArg(x) 19635 return true 19636 } 19637 // match: (Or8 (Const8 <t> [c1]) (And8 x (Const8 [c2]))) 19638 // cond: ^(c1 | c2) == 0 19639 // result: (Or8 (Const8 <t> [c1]) x) 19640 for { 19641 _ = v.Args[1] 19642 v_0 := v.Args[0] 19643 if v_0.Op != OpConst8 { 19644 break 19645 } 19646 t := v_0.Type 19647 c1 := v_0.AuxInt 19648 v_1 := v.Args[1] 19649 if v_1.Op != OpAnd8 { 19650 break 19651 } 19652 _ = v_1.Args[1] 19653 x := v_1.Args[0] 19654 v_1_1 := v_1.Args[1] 19655 if v_1_1.Op != OpConst8 { 19656 break 19657 } 19658 c2 := v_1_1.AuxInt 19659 if !(^(c1 | c2) == 0) { 19660 break 19661 } 19662 v.reset(OpOr8) 19663 v0 := b.NewValue0(v.Pos, OpConst8, t) 19664 v0.AuxInt = c1 19665 v.AddArg(v0) 19666 v.AddArg(x) 19667 return true 19668 } 19669 // match: (Or8 (Const8 <t> [c1]) (And8 (Const8 [c2]) x)) 19670 // cond: ^(c1 | c2) == 0 19671 // result: (Or8 (Const8 <t> [c1]) x) 19672 for { 19673 _ = v.Args[1] 19674 v_0 := v.Args[0] 19675 if v_0.Op != OpConst8 { 19676 break 19677 } 19678 t := v_0.Type 19679 c1 := v_0.AuxInt 19680 v_1 := v.Args[1] 19681 if v_1.Op != OpAnd8 { 19682 break 19683 } 19684 _ = v_1.Args[1] 19685 v_1_0 := v_1.Args[0] 19686 if v_1_0.Op != OpConst8 { 19687 break 19688 } 19689 c2 := v_1_0.AuxInt 19690 x := v_1.Args[1] 19691 if !(^(c1 | c2) == 0) { 19692 break 19693 } 19694 v.reset(OpOr8) 19695 v0 := b.NewValue0(v.Pos, OpConst8, t) 19696 v0.AuxInt = c1 19697 v.AddArg(v0) 19698 v.AddArg(x) 19699 return true 19700 } 19701 // match: (Or8 (Or8 i:(Const8 <t>) z) x) 19702 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 19703 // result: (Or8 i (Or8 <t> z x)) 19704 for { 19705 _ = v.Args[1] 19706 v_0 := v.Args[0] 19707 if v_0.Op != OpOr8 { 19708 break 19709 } 19710 _ = v_0.Args[1] 19711 i := v_0.Args[0] 19712 if i.Op != OpConst8 { 19713 break 19714 } 19715 t := i.Type 19716 z := v_0.Args[1] 19717 x := v.Args[1] 19718 if !(z.Op != OpConst8 && x.Op != OpConst8) { 19719 break 19720 } 19721 v.reset(OpOr8) 19722 v.AddArg(i) 19723 v0 := b.NewValue0(v.Pos, OpOr8, t) 19724 v0.AddArg(z) 19725 v0.AddArg(x) 19726 v.AddArg(v0) 19727 return true 19728 } 19729 // match: (Or8 (Or8 z i:(Const8 <t>)) x) 19730 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 19731 // result: (Or8 i (Or8 <t> z x)) 19732 for { 19733 _ = v.Args[1] 19734 v_0 := v.Args[0] 19735 if v_0.Op != OpOr8 { 19736 break 19737 } 19738 _ = v_0.Args[1] 19739 z := v_0.Args[0] 19740 i := v_0.Args[1] 19741 if i.Op != OpConst8 { 19742 break 19743 } 19744 t := i.Type 19745 x := v.Args[1] 19746 if !(z.Op != OpConst8 && x.Op != OpConst8) { 19747 break 19748 } 19749 v.reset(OpOr8) 19750 v.AddArg(i) 19751 v0 := b.NewValue0(v.Pos, OpOr8, t) 19752 v0.AddArg(z) 19753 v0.AddArg(x) 19754 v.AddArg(v0) 19755 return true 19756 } 19757 // match: (Or8 x (Or8 i:(Const8 <t>) z)) 19758 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 19759 // result: (Or8 i (Or8 <t> z x)) 19760 for { 19761 _ = v.Args[1] 19762 x := v.Args[0] 19763 v_1 := v.Args[1] 19764 if v_1.Op != OpOr8 { 19765 break 19766 } 19767 _ = v_1.Args[1] 19768 i := v_1.Args[0] 19769 if i.Op != OpConst8 { 19770 break 19771 } 19772 t := i.Type 19773 z := v_1.Args[1] 19774 if !(z.Op != OpConst8 && x.Op != OpConst8) { 19775 break 19776 } 19777 v.reset(OpOr8) 19778 v.AddArg(i) 19779 v0 := b.NewValue0(v.Pos, OpOr8, t) 19780 v0.AddArg(z) 19781 v0.AddArg(x) 19782 v.AddArg(v0) 19783 return true 19784 } 19785 // match: (Or8 x (Or8 z i:(Const8 <t>))) 19786 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 19787 // result: (Or8 i (Or8 <t> z x)) 19788 for { 19789 _ = v.Args[1] 19790 x := v.Args[0] 19791 v_1 := v.Args[1] 19792 if v_1.Op != OpOr8 { 19793 break 19794 } 19795 _ = v_1.Args[1] 19796 z := v_1.Args[0] 19797 i := v_1.Args[1] 19798 if i.Op != OpConst8 { 19799 break 19800 } 19801 t := i.Type 19802 if !(z.Op != OpConst8 && x.Op != OpConst8) { 19803 break 19804 } 19805 v.reset(OpOr8) 19806 v.AddArg(i) 19807 v0 := b.NewValue0(v.Pos, OpOr8, t) 19808 v0.AddArg(z) 19809 v0.AddArg(x) 19810 v.AddArg(v0) 19811 return true 19812 } 19813 // match: (Or8 (Const8 <t> [c]) (Or8 (Const8 <t> [d]) x)) 19814 // cond: 19815 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 19816 for { 19817 _ = v.Args[1] 19818 v_0 := v.Args[0] 19819 if v_0.Op != OpConst8 { 19820 break 19821 } 19822 t := v_0.Type 19823 c := v_0.AuxInt 19824 v_1 := v.Args[1] 19825 if v_1.Op != OpOr8 { 19826 break 19827 } 19828 _ = v_1.Args[1] 19829 v_1_0 := v_1.Args[0] 19830 if v_1_0.Op != OpConst8 { 19831 break 19832 } 19833 if v_1_0.Type != t { 19834 break 19835 } 19836 d := v_1_0.AuxInt 19837 x := v_1.Args[1] 19838 v.reset(OpOr8) 19839 v0 := b.NewValue0(v.Pos, OpConst8, t) 19840 v0.AuxInt = int64(int8(c | d)) 19841 v.AddArg(v0) 19842 v.AddArg(x) 19843 return true 19844 } 19845 return false 19846 } 19847 func rewriteValuegeneric_OpOr8_20(v *Value) bool { 19848 b := v.Block 19849 _ = b 19850 // match: (Or8 (Const8 <t> [c]) (Or8 x (Const8 <t> [d]))) 19851 // cond: 19852 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 19853 for { 19854 _ = v.Args[1] 19855 v_0 := v.Args[0] 19856 if v_0.Op != OpConst8 { 19857 break 19858 } 19859 t := v_0.Type 19860 c := v_0.AuxInt 19861 v_1 := v.Args[1] 19862 if v_1.Op != OpOr8 { 19863 break 19864 } 19865 _ = v_1.Args[1] 19866 x := v_1.Args[0] 19867 v_1_1 := v_1.Args[1] 19868 if v_1_1.Op != OpConst8 { 19869 break 19870 } 19871 if v_1_1.Type != t { 19872 break 19873 } 19874 d := v_1_1.AuxInt 19875 v.reset(OpOr8) 19876 v0 := b.NewValue0(v.Pos, OpConst8, t) 19877 v0.AuxInt = int64(int8(c | d)) 19878 v.AddArg(v0) 19879 v.AddArg(x) 19880 return true 19881 } 19882 // match: (Or8 (Or8 (Const8 <t> [d]) x) (Const8 <t> [c])) 19883 // cond: 19884 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 19885 for { 19886 _ = v.Args[1] 19887 v_0 := v.Args[0] 19888 if v_0.Op != OpOr8 { 19889 break 19890 } 19891 _ = v_0.Args[1] 19892 v_0_0 := v_0.Args[0] 19893 if v_0_0.Op != OpConst8 { 19894 break 19895 } 19896 t := v_0_0.Type 19897 d := v_0_0.AuxInt 19898 x := v_0.Args[1] 19899 v_1 := v.Args[1] 19900 if v_1.Op != OpConst8 { 19901 break 19902 } 19903 if v_1.Type != t { 19904 break 19905 } 19906 c := v_1.AuxInt 19907 v.reset(OpOr8) 19908 v0 := b.NewValue0(v.Pos, OpConst8, t) 19909 v0.AuxInt = int64(int8(c | d)) 19910 v.AddArg(v0) 19911 v.AddArg(x) 19912 return true 19913 } 19914 // match: (Or8 (Or8 x (Const8 <t> [d])) (Const8 <t> [c])) 19915 // cond: 19916 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 19917 for { 19918 _ = v.Args[1] 19919 v_0 := v.Args[0] 19920 if v_0.Op != OpOr8 { 19921 break 19922 } 19923 _ = v_0.Args[1] 19924 x := v_0.Args[0] 19925 v_0_1 := v_0.Args[1] 19926 if v_0_1.Op != OpConst8 { 19927 break 19928 } 19929 t := v_0_1.Type 19930 d := v_0_1.AuxInt 19931 v_1 := v.Args[1] 19932 if v_1.Op != OpConst8 { 19933 break 19934 } 19935 if v_1.Type != t { 19936 break 19937 } 19938 c := v_1.AuxInt 19939 v.reset(OpOr8) 19940 v0 := b.NewValue0(v.Pos, OpConst8, t) 19941 v0.AuxInt = int64(int8(c | d)) 19942 v.AddArg(v0) 19943 v.AddArg(x) 19944 return true 19945 } 19946 return false 19947 } 19948 func rewriteValuegeneric_OpPhi_0(v *Value) bool { 19949 // match: (Phi (Const8 [c]) (Const8 [c])) 19950 // cond: 19951 // result: (Const8 [c]) 19952 for { 19953 _ = v.Args[1] 19954 v_0 := v.Args[0] 19955 if v_0.Op != OpConst8 { 19956 break 19957 } 19958 c := v_0.AuxInt 19959 v_1 := v.Args[1] 19960 if v_1.Op != OpConst8 { 19961 break 19962 } 19963 if v_1.AuxInt != c { 19964 break 19965 } 19966 if len(v.Args) != 2 { 19967 break 19968 } 19969 v.reset(OpConst8) 19970 v.AuxInt = c 19971 return true 19972 } 19973 // match: (Phi (Const16 [c]) (Const16 [c])) 19974 // cond: 19975 // result: (Const16 [c]) 19976 for { 19977 _ = v.Args[1] 19978 v_0 := v.Args[0] 19979 if v_0.Op != OpConst16 { 19980 break 19981 } 19982 c := v_0.AuxInt 19983 v_1 := v.Args[1] 19984 if v_1.Op != OpConst16 { 19985 break 19986 } 19987 if v_1.AuxInt != c { 19988 break 19989 } 19990 if len(v.Args) != 2 { 19991 break 19992 } 19993 v.reset(OpConst16) 19994 v.AuxInt = c 19995 return true 19996 } 19997 // match: (Phi (Const32 [c]) (Const32 [c])) 19998 // cond: 19999 // result: (Const32 [c]) 20000 for { 20001 _ = v.Args[1] 20002 v_0 := v.Args[0] 20003 if v_0.Op != OpConst32 { 20004 break 20005 } 20006 c := v_0.AuxInt 20007 v_1 := v.Args[1] 20008 if v_1.Op != OpConst32 { 20009 break 20010 } 20011 if v_1.AuxInt != c { 20012 break 20013 } 20014 if len(v.Args) != 2 { 20015 break 20016 } 20017 v.reset(OpConst32) 20018 v.AuxInt = c 20019 return true 20020 } 20021 // match: (Phi (Const64 [c]) (Const64 [c])) 20022 // cond: 20023 // result: (Const64 [c]) 20024 for { 20025 _ = v.Args[1] 20026 v_0 := v.Args[0] 20027 if v_0.Op != OpConst64 { 20028 break 20029 } 20030 c := v_0.AuxInt 20031 v_1 := v.Args[1] 20032 if v_1.Op != OpConst64 { 20033 break 20034 } 20035 if v_1.AuxInt != c { 20036 break 20037 } 20038 if len(v.Args) != 2 { 20039 break 20040 } 20041 v.reset(OpConst64) 20042 v.AuxInt = c 20043 return true 20044 } 20045 return false 20046 } 20047 func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { 20048 b := v.Block 20049 _ = b 20050 config := b.Func.Config 20051 _ = config 20052 typ := &b.Func.Config.Types 20053 _ = typ 20054 // match: (PtrIndex <t> ptr idx) 20055 // cond: config.PtrSize == 4 20056 // result: (AddPtr ptr (Mul32 <typ.Int> idx (Const32 <typ.Int> [t.ElemType().Size()]))) 20057 for { 20058 t := v.Type 20059 _ = v.Args[1] 20060 ptr := v.Args[0] 20061 idx := v.Args[1] 20062 if !(config.PtrSize == 4) { 20063 break 20064 } 20065 v.reset(OpAddPtr) 20066 v.AddArg(ptr) 20067 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) 20068 v0.AddArg(idx) 20069 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 20070 v1.AuxInt = t.ElemType().Size() 20071 v0.AddArg(v1) 20072 v.AddArg(v0) 20073 return true 20074 } 20075 // match: (PtrIndex <t> ptr idx) 20076 // cond: config.PtrSize == 8 20077 // result: (AddPtr ptr (Mul64 <typ.Int> idx (Const64 <typ.Int> [t.ElemType().Size()]))) 20078 for { 20079 t := v.Type 20080 _ = v.Args[1] 20081 ptr := v.Args[0] 20082 idx := v.Args[1] 20083 if !(config.PtrSize == 8) { 20084 break 20085 } 20086 v.reset(OpAddPtr) 20087 v.AddArg(ptr) 20088 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) 20089 v0.AddArg(idx) 20090 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 20091 v1.AuxInt = t.ElemType().Size() 20092 v0.AddArg(v1) 20093 v.AddArg(v0) 20094 return true 20095 } 20096 return false 20097 } 20098 func rewriteValuegeneric_OpRound32F_0(v *Value) bool { 20099 // match: (Round32F x:(Const32F)) 20100 // cond: 20101 // result: x 20102 for { 20103 x := v.Args[0] 20104 if x.Op != OpConst32F { 20105 break 20106 } 20107 v.reset(OpCopy) 20108 v.Type = x.Type 20109 v.AddArg(x) 20110 return true 20111 } 20112 return false 20113 } 20114 func rewriteValuegeneric_OpRound64F_0(v *Value) bool { 20115 // match: (Round64F x:(Const64F)) 20116 // cond: 20117 // result: x 20118 for { 20119 x := v.Args[0] 20120 if x.Op != OpConst64F { 20121 break 20122 } 20123 v.reset(OpCopy) 20124 v.Type = x.Type 20125 v.AddArg(x) 20126 return true 20127 } 20128 return false 20129 } 20130 func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { 20131 b := v.Block 20132 _ = b 20133 // match: (Rsh16Ux16 <t> x (Const16 [c])) 20134 // cond: 20135 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))])) 20136 for { 20137 t := v.Type 20138 _ = v.Args[1] 20139 x := v.Args[0] 20140 v_1 := v.Args[1] 20141 if v_1.Op != OpConst16 { 20142 break 20143 } 20144 c := v_1.AuxInt 20145 v.reset(OpRsh16Ux64) 20146 v.AddArg(x) 20147 v0 := b.NewValue0(v.Pos, OpConst64, t) 20148 v0.AuxInt = int64(uint16(c)) 20149 v.AddArg(v0) 20150 return true 20151 } 20152 // match: (Rsh16Ux16 (Const16 [0]) _) 20153 // cond: 20154 // result: (Const16 [0]) 20155 for { 20156 _ = v.Args[1] 20157 v_0 := v.Args[0] 20158 if v_0.Op != OpConst16 { 20159 break 20160 } 20161 if v_0.AuxInt != 0 { 20162 break 20163 } 20164 v.reset(OpConst16) 20165 v.AuxInt = 0 20166 return true 20167 } 20168 return false 20169 } 20170 func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { 20171 b := v.Block 20172 _ = b 20173 // match: (Rsh16Ux32 <t> x (Const32 [c])) 20174 // cond: 20175 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))])) 20176 for { 20177 t := v.Type 20178 _ = v.Args[1] 20179 x := v.Args[0] 20180 v_1 := v.Args[1] 20181 if v_1.Op != OpConst32 { 20182 break 20183 } 20184 c := v_1.AuxInt 20185 v.reset(OpRsh16Ux64) 20186 v.AddArg(x) 20187 v0 := b.NewValue0(v.Pos, OpConst64, t) 20188 v0.AuxInt = int64(uint32(c)) 20189 v.AddArg(v0) 20190 return true 20191 } 20192 // match: (Rsh16Ux32 (Const16 [0]) _) 20193 // cond: 20194 // result: (Const16 [0]) 20195 for { 20196 _ = v.Args[1] 20197 v_0 := v.Args[0] 20198 if v_0.Op != OpConst16 { 20199 break 20200 } 20201 if v_0.AuxInt != 0 { 20202 break 20203 } 20204 v.reset(OpConst16) 20205 v.AuxInt = 0 20206 return true 20207 } 20208 return false 20209 } 20210 func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { 20211 b := v.Block 20212 _ = b 20213 typ := &b.Func.Config.Types 20214 _ = typ 20215 // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) 20216 // cond: 20217 // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) 20218 for { 20219 _ = v.Args[1] 20220 v_0 := v.Args[0] 20221 if v_0.Op != OpConst16 { 20222 break 20223 } 20224 c := v_0.AuxInt 20225 v_1 := v.Args[1] 20226 if v_1.Op != OpConst64 { 20227 break 20228 } 20229 d := v_1.AuxInt 20230 v.reset(OpConst16) 20231 v.AuxInt = int64(int16(uint16(c) >> uint64(d))) 20232 return true 20233 } 20234 // match: (Rsh16Ux64 x (Const64 [0])) 20235 // cond: 20236 // result: x 20237 for { 20238 _ = v.Args[1] 20239 x := v.Args[0] 20240 v_1 := v.Args[1] 20241 if v_1.Op != OpConst64 { 20242 break 20243 } 20244 if v_1.AuxInt != 0 { 20245 break 20246 } 20247 v.reset(OpCopy) 20248 v.Type = x.Type 20249 v.AddArg(x) 20250 return true 20251 } 20252 // match: (Rsh16Ux64 (Const16 [0]) _) 20253 // cond: 20254 // result: (Const16 [0]) 20255 for { 20256 _ = v.Args[1] 20257 v_0 := v.Args[0] 20258 if v_0.Op != OpConst16 { 20259 break 20260 } 20261 if v_0.AuxInt != 0 { 20262 break 20263 } 20264 v.reset(OpConst16) 20265 v.AuxInt = 0 20266 return true 20267 } 20268 // match: (Rsh16Ux64 _ (Const64 [c])) 20269 // cond: uint64(c) >= 16 20270 // result: (Const16 [0]) 20271 for { 20272 _ = v.Args[1] 20273 v_1 := v.Args[1] 20274 if v_1.Op != OpConst64 { 20275 break 20276 } 20277 c := v_1.AuxInt 20278 if !(uint64(c) >= 16) { 20279 break 20280 } 20281 v.reset(OpConst16) 20282 v.AuxInt = 0 20283 return true 20284 } 20285 // match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) 20286 // cond: !uaddOvf(c,d) 20287 // result: (Rsh16Ux64 x (Const64 <t> [c+d])) 20288 for { 20289 t := v.Type 20290 _ = v.Args[1] 20291 v_0 := v.Args[0] 20292 if v_0.Op != OpRsh16Ux64 { 20293 break 20294 } 20295 _ = v_0.Args[1] 20296 x := v_0.Args[0] 20297 v_0_1 := v_0.Args[1] 20298 if v_0_1.Op != OpConst64 { 20299 break 20300 } 20301 c := v_0_1.AuxInt 20302 v_1 := v.Args[1] 20303 if v_1.Op != OpConst64 { 20304 break 20305 } 20306 d := v_1.AuxInt 20307 if !(!uaddOvf(c, d)) { 20308 break 20309 } 20310 v.reset(OpRsh16Ux64) 20311 v.AddArg(x) 20312 v0 := b.NewValue0(v.Pos, OpConst64, t) 20313 v0.AuxInt = c + d 20314 v.AddArg(v0) 20315 return true 20316 } 20317 // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 20318 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 20319 // result: (Rsh16Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 20320 for { 20321 _ = v.Args[1] 20322 v_0 := v.Args[0] 20323 if v_0.Op != OpLsh16x64 { 20324 break 20325 } 20326 _ = v_0.Args[1] 20327 v_0_0 := v_0.Args[0] 20328 if v_0_0.Op != OpRsh16Ux64 { 20329 break 20330 } 20331 _ = v_0_0.Args[1] 20332 x := v_0_0.Args[0] 20333 v_0_0_1 := v_0_0.Args[1] 20334 if v_0_0_1.Op != OpConst64 { 20335 break 20336 } 20337 c1 := v_0_0_1.AuxInt 20338 v_0_1 := v_0.Args[1] 20339 if v_0_1.Op != OpConst64 { 20340 break 20341 } 20342 c2 := v_0_1.AuxInt 20343 v_1 := v.Args[1] 20344 if v_1.Op != OpConst64 { 20345 break 20346 } 20347 c3 := v_1.AuxInt 20348 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 20349 break 20350 } 20351 v.reset(OpRsh16Ux64) 20352 v.AddArg(x) 20353 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 20354 v0.AuxInt = c1 - c2 + c3 20355 v.AddArg(v0) 20356 return true 20357 } 20358 // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 20359 // cond: 20360 // result: (ZeroExt8to16 (Trunc16to8 <typ.UInt8> x)) 20361 for { 20362 _ = v.Args[1] 20363 v_0 := v.Args[0] 20364 if v_0.Op != OpLsh16x64 { 20365 break 20366 } 20367 _ = v_0.Args[1] 20368 x := v_0.Args[0] 20369 v_0_1 := v_0.Args[1] 20370 if v_0_1.Op != OpConst64 { 20371 break 20372 } 20373 if v_0_1.AuxInt != 8 { 20374 break 20375 } 20376 v_1 := v.Args[1] 20377 if v_1.Op != OpConst64 { 20378 break 20379 } 20380 if v_1.AuxInt != 8 { 20381 break 20382 } 20383 v.reset(OpZeroExt8to16) 20384 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) 20385 v0.AddArg(x) 20386 v.AddArg(v0) 20387 return true 20388 } 20389 return false 20390 } 20391 func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { 20392 b := v.Block 20393 _ = b 20394 // match: (Rsh16Ux8 <t> x (Const8 [c])) 20395 // cond: 20396 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))])) 20397 for { 20398 t := v.Type 20399 _ = v.Args[1] 20400 x := v.Args[0] 20401 v_1 := v.Args[1] 20402 if v_1.Op != OpConst8 { 20403 break 20404 } 20405 c := v_1.AuxInt 20406 v.reset(OpRsh16Ux64) 20407 v.AddArg(x) 20408 v0 := b.NewValue0(v.Pos, OpConst64, t) 20409 v0.AuxInt = int64(uint8(c)) 20410 v.AddArg(v0) 20411 return true 20412 } 20413 // match: (Rsh16Ux8 (Const16 [0]) _) 20414 // cond: 20415 // result: (Const16 [0]) 20416 for { 20417 _ = v.Args[1] 20418 v_0 := v.Args[0] 20419 if v_0.Op != OpConst16 { 20420 break 20421 } 20422 if v_0.AuxInt != 0 { 20423 break 20424 } 20425 v.reset(OpConst16) 20426 v.AuxInt = 0 20427 return true 20428 } 20429 return false 20430 } 20431 func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { 20432 b := v.Block 20433 _ = b 20434 // match: (Rsh16x16 <t> x (Const16 [c])) 20435 // cond: 20436 // result: (Rsh16x64 x (Const64 <t> [int64(uint16(c))])) 20437 for { 20438 t := v.Type 20439 _ = v.Args[1] 20440 x := v.Args[0] 20441 v_1 := v.Args[1] 20442 if v_1.Op != OpConst16 { 20443 break 20444 } 20445 c := v_1.AuxInt 20446 v.reset(OpRsh16x64) 20447 v.AddArg(x) 20448 v0 := b.NewValue0(v.Pos, OpConst64, t) 20449 v0.AuxInt = int64(uint16(c)) 20450 v.AddArg(v0) 20451 return true 20452 } 20453 // match: (Rsh16x16 (Const16 [0]) _) 20454 // cond: 20455 // result: (Const16 [0]) 20456 for { 20457 _ = v.Args[1] 20458 v_0 := v.Args[0] 20459 if v_0.Op != OpConst16 { 20460 break 20461 } 20462 if v_0.AuxInt != 0 { 20463 break 20464 } 20465 v.reset(OpConst16) 20466 v.AuxInt = 0 20467 return true 20468 } 20469 return false 20470 } 20471 func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { 20472 b := v.Block 20473 _ = b 20474 // match: (Rsh16x32 <t> x (Const32 [c])) 20475 // cond: 20476 // result: (Rsh16x64 x (Const64 <t> [int64(uint32(c))])) 20477 for { 20478 t := v.Type 20479 _ = v.Args[1] 20480 x := v.Args[0] 20481 v_1 := v.Args[1] 20482 if v_1.Op != OpConst32 { 20483 break 20484 } 20485 c := v_1.AuxInt 20486 v.reset(OpRsh16x64) 20487 v.AddArg(x) 20488 v0 := b.NewValue0(v.Pos, OpConst64, t) 20489 v0.AuxInt = int64(uint32(c)) 20490 v.AddArg(v0) 20491 return true 20492 } 20493 // match: (Rsh16x32 (Const16 [0]) _) 20494 // cond: 20495 // result: (Const16 [0]) 20496 for { 20497 _ = v.Args[1] 20498 v_0 := v.Args[0] 20499 if v_0.Op != OpConst16 { 20500 break 20501 } 20502 if v_0.AuxInt != 0 { 20503 break 20504 } 20505 v.reset(OpConst16) 20506 v.AuxInt = 0 20507 return true 20508 } 20509 return false 20510 } 20511 func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { 20512 b := v.Block 20513 _ = b 20514 typ := &b.Func.Config.Types 20515 _ = typ 20516 // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) 20517 // cond: 20518 // result: (Const16 [int64(int16(c) >> uint64(d))]) 20519 for { 20520 _ = v.Args[1] 20521 v_0 := v.Args[0] 20522 if v_0.Op != OpConst16 { 20523 break 20524 } 20525 c := v_0.AuxInt 20526 v_1 := v.Args[1] 20527 if v_1.Op != OpConst64 { 20528 break 20529 } 20530 d := v_1.AuxInt 20531 v.reset(OpConst16) 20532 v.AuxInt = int64(int16(c) >> uint64(d)) 20533 return true 20534 } 20535 // match: (Rsh16x64 x (Const64 [0])) 20536 // cond: 20537 // result: x 20538 for { 20539 _ = v.Args[1] 20540 x := v.Args[0] 20541 v_1 := v.Args[1] 20542 if v_1.Op != OpConst64 { 20543 break 20544 } 20545 if v_1.AuxInt != 0 { 20546 break 20547 } 20548 v.reset(OpCopy) 20549 v.Type = x.Type 20550 v.AddArg(x) 20551 return true 20552 } 20553 // match: (Rsh16x64 (Const16 [0]) _) 20554 // cond: 20555 // result: (Const16 [0]) 20556 for { 20557 _ = v.Args[1] 20558 v_0 := v.Args[0] 20559 if v_0.Op != OpConst16 { 20560 break 20561 } 20562 if v_0.AuxInt != 0 { 20563 break 20564 } 20565 v.reset(OpConst16) 20566 v.AuxInt = 0 20567 return true 20568 } 20569 // match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d])) 20570 // cond: !uaddOvf(c,d) 20571 // result: (Rsh16x64 x (Const64 <t> [c+d])) 20572 for { 20573 t := v.Type 20574 _ = v.Args[1] 20575 v_0 := v.Args[0] 20576 if v_0.Op != OpRsh16x64 { 20577 break 20578 } 20579 _ = v_0.Args[1] 20580 x := v_0.Args[0] 20581 v_0_1 := v_0.Args[1] 20582 if v_0_1.Op != OpConst64 { 20583 break 20584 } 20585 c := v_0_1.AuxInt 20586 v_1 := v.Args[1] 20587 if v_1.Op != OpConst64 { 20588 break 20589 } 20590 d := v_1.AuxInt 20591 if !(!uaddOvf(c, d)) { 20592 break 20593 } 20594 v.reset(OpRsh16x64) 20595 v.AddArg(x) 20596 v0 := b.NewValue0(v.Pos, OpConst64, t) 20597 v0.AuxInt = c + d 20598 v.AddArg(v0) 20599 return true 20600 } 20601 // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 20602 // cond: 20603 // result: (SignExt8to16 (Trunc16to8 <typ.Int8> x)) 20604 for { 20605 _ = v.Args[1] 20606 v_0 := v.Args[0] 20607 if v_0.Op != OpLsh16x64 { 20608 break 20609 } 20610 _ = v_0.Args[1] 20611 x := v_0.Args[0] 20612 v_0_1 := v_0.Args[1] 20613 if v_0_1.Op != OpConst64 { 20614 break 20615 } 20616 if v_0_1.AuxInt != 8 { 20617 break 20618 } 20619 v_1 := v.Args[1] 20620 if v_1.Op != OpConst64 { 20621 break 20622 } 20623 if v_1.AuxInt != 8 { 20624 break 20625 } 20626 v.reset(OpSignExt8to16) 20627 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) 20628 v0.AddArg(x) 20629 v.AddArg(v0) 20630 return true 20631 } 20632 return false 20633 } 20634 func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { 20635 b := v.Block 20636 _ = b 20637 // match: (Rsh16x8 <t> x (Const8 [c])) 20638 // cond: 20639 // result: (Rsh16x64 x (Const64 <t> [int64(uint8(c))])) 20640 for { 20641 t := v.Type 20642 _ = v.Args[1] 20643 x := v.Args[0] 20644 v_1 := v.Args[1] 20645 if v_1.Op != OpConst8 { 20646 break 20647 } 20648 c := v_1.AuxInt 20649 v.reset(OpRsh16x64) 20650 v.AddArg(x) 20651 v0 := b.NewValue0(v.Pos, OpConst64, t) 20652 v0.AuxInt = int64(uint8(c)) 20653 v.AddArg(v0) 20654 return true 20655 } 20656 // match: (Rsh16x8 (Const16 [0]) _) 20657 // cond: 20658 // result: (Const16 [0]) 20659 for { 20660 _ = v.Args[1] 20661 v_0 := v.Args[0] 20662 if v_0.Op != OpConst16 { 20663 break 20664 } 20665 if v_0.AuxInt != 0 { 20666 break 20667 } 20668 v.reset(OpConst16) 20669 v.AuxInt = 0 20670 return true 20671 } 20672 return false 20673 } 20674 func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { 20675 b := v.Block 20676 _ = b 20677 // match: (Rsh32Ux16 <t> x (Const16 [c])) 20678 // cond: 20679 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))])) 20680 for { 20681 t := v.Type 20682 _ = v.Args[1] 20683 x := v.Args[0] 20684 v_1 := v.Args[1] 20685 if v_1.Op != OpConst16 { 20686 break 20687 } 20688 c := v_1.AuxInt 20689 v.reset(OpRsh32Ux64) 20690 v.AddArg(x) 20691 v0 := b.NewValue0(v.Pos, OpConst64, t) 20692 v0.AuxInt = int64(uint16(c)) 20693 v.AddArg(v0) 20694 return true 20695 } 20696 // match: (Rsh32Ux16 (Const32 [0]) _) 20697 // cond: 20698 // result: (Const32 [0]) 20699 for { 20700 _ = v.Args[1] 20701 v_0 := v.Args[0] 20702 if v_0.Op != OpConst32 { 20703 break 20704 } 20705 if v_0.AuxInt != 0 { 20706 break 20707 } 20708 v.reset(OpConst32) 20709 v.AuxInt = 0 20710 return true 20711 } 20712 return false 20713 } 20714 func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { 20715 b := v.Block 20716 _ = b 20717 // match: (Rsh32Ux32 <t> x (Const32 [c])) 20718 // cond: 20719 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))])) 20720 for { 20721 t := v.Type 20722 _ = v.Args[1] 20723 x := v.Args[0] 20724 v_1 := v.Args[1] 20725 if v_1.Op != OpConst32 { 20726 break 20727 } 20728 c := v_1.AuxInt 20729 v.reset(OpRsh32Ux64) 20730 v.AddArg(x) 20731 v0 := b.NewValue0(v.Pos, OpConst64, t) 20732 v0.AuxInt = int64(uint32(c)) 20733 v.AddArg(v0) 20734 return true 20735 } 20736 // match: (Rsh32Ux32 (Const32 [0]) _) 20737 // cond: 20738 // result: (Const32 [0]) 20739 for { 20740 _ = v.Args[1] 20741 v_0 := v.Args[0] 20742 if v_0.Op != OpConst32 { 20743 break 20744 } 20745 if v_0.AuxInt != 0 { 20746 break 20747 } 20748 v.reset(OpConst32) 20749 v.AuxInt = 0 20750 return true 20751 } 20752 return false 20753 } 20754 func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { 20755 b := v.Block 20756 _ = b 20757 typ := &b.Func.Config.Types 20758 _ = typ 20759 // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) 20760 // cond: 20761 // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) 20762 for { 20763 _ = v.Args[1] 20764 v_0 := v.Args[0] 20765 if v_0.Op != OpConst32 { 20766 break 20767 } 20768 c := v_0.AuxInt 20769 v_1 := v.Args[1] 20770 if v_1.Op != OpConst64 { 20771 break 20772 } 20773 d := v_1.AuxInt 20774 v.reset(OpConst32) 20775 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 20776 return true 20777 } 20778 // match: (Rsh32Ux64 x (Const64 [0])) 20779 // cond: 20780 // result: x 20781 for { 20782 _ = v.Args[1] 20783 x := v.Args[0] 20784 v_1 := v.Args[1] 20785 if v_1.Op != OpConst64 { 20786 break 20787 } 20788 if v_1.AuxInt != 0 { 20789 break 20790 } 20791 v.reset(OpCopy) 20792 v.Type = x.Type 20793 v.AddArg(x) 20794 return true 20795 } 20796 // match: (Rsh32Ux64 (Const32 [0]) _) 20797 // cond: 20798 // result: (Const32 [0]) 20799 for { 20800 _ = v.Args[1] 20801 v_0 := v.Args[0] 20802 if v_0.Op != OpConst32 { 20803 break 20804 } 20805 if v_0.AuxInt != 0 { 20806 break 20807 } 20808 v.reset(OpConst32) 20809 v.AuxInt = 0 20810 return true 20811 } 20812 // match: (Rsh32Ux64 _ (Const64 [c])) 20813 // cond: uint64(c) >= 32 20814 // result: (Const32 [0]) 20815 for { 20816 _ = v.Args[1] 20817 v_1 := v.Args[1] 20818 if v_1.Op != OpConst64 { 20819 break 20820 } 20821 c := v_1.AuxInt 20822 if !(uint64(c) >= 32) { 20823 break 20824 } 20825 v.reset(OpConst32) 20826 v.AuxInt = 0 20827 return true 20828 } 20829 // match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) 20830 // cond: !uaddOvf(c,d) 20831 // result: (Rsh32Ux64 x (Const64 <t> [c+d])) 20832 for { 20833 t := v.Type 20834 _ = v.Args[1] 20835 v_0 := v.Args[0] 20836 if v_0.Op != OpRsh32Ux64 { 20837 break 20838 } 20839 _ = v_0.Args[1] 20840 x := v_0.Args[0] 20841 v_0_1 := v_0.Args[1] 20842 if v_0_1.Op != OpConst64 { 20843 break 20844 } 20845 c := v_0_1.AuxInt 20846 v_1 := v.Args[1] 20847 if v_1.Op != OpConst64 { 20848 break 20849 } 20850 d := v_1.AuxInt 20851 if !(!uaddOvf(c, d)) { 20852 break 20853 } 20854 v.reset(OpRsh32Ux64) 20855 v.AddArg(x) 20856 v0 := b.NewValue0(v.Pos, OpConst64, t) 20857 v0.AuxInt = c + d 20858 v.AddArg(v0) 20859 return true 20860 } 20861 // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 20862 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 20863 // result: (Rsh32Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 20864 for { 20865 _ = v.Args[1] 20866 v_0 := v.Args[0] 20867 if v_0.Op != OpLsh32x64 { 20868 break 20869 } 20870 _ = v_0.Args[1] 20871 v_0_0 := v_0.Args[0] 20872 if v_0_0.Op != OpRsh32Ux64 { 20873 break 20874 } 20875 _ = v_0_0.Args[1] 20876 x := v_0_0.Args[0] 20877 v_0_0_1 := v_0_0.Args[1] 20878 if v_0_0_1.Op != OpConst64 { 20879 break 20880 } 20881 c1 := v_0_0_1.AuxInt 20882 v_0_1 := v_0.Args[1] 20883 if v_0_1.Op != OpConst64 { 20884 break 20885 } 20886 c2 := v_0_1.AuxInt 20887 v_1 := v.Args[1] 20888 if v_1.Op != OpConst64 { 20889 break 20890 } 20891 c3 := v_1.AuxInt 20892 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 20893 break 20894 } 20895 v.reset(OpRsh32Ux64) 20896 v.AddArg(x) 20897 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 20898 v0.AuxInt = c1 - c2 + c3 20899 v.AddArg(v0) 20900 return true 20901 } 20902 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 20903 // cond: 20904 // result: (ZeroExt8to32 (Trunc32to8 <typ.UInt8> x)) 20905 for { 20906 _ = v.Args[1] 20907 v_0 := v.Args[0] 20908 if v_0.Op != OpLsh32x64 { 20909 break 20910 } 20911 _ = v_0.Args[1] 20912 x := v_0.Args[0] 20913 v_0_1 := v_0.Args[1] 20914 if v_0_1.Op != OpConst64 { 20915 break 20916 } 20917 if v_0_1.AuxInt != 24 { 20918 break 20919 } 20920 v_1 := v.Args[1] 20921 if v_1.Op != OpConst64 { 20922 break 20923 } 20924 if v_1.AuxInt != 24 { 20925 break 20926 } 20927 v.reset(OpZeroExt8to32) 20928 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) 20929 v0.AddArg(x) 20930 v.AddArg(v0) 20931 return true 20932 } 20933 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 20934 // cond: 20935 // result: (ZeroExt16to32 (Trunc32to16 <typ.UInt16> x)) 20936 for { 20937 _ = v.Args[1] 20938 v_0 := v.Args[0] 20939 if v_0.Op != OpLsh32x64 { 20940 break 20941 } 20942 _ = v_0.Args[1] 20943 x := v_0.Args[0] 20944 v_0_1 := v_0.Args[1] 20945 if v_0_1.Op != OpConst64 { 20946 break 20947 } 20948 if v_0_1.AuxInt != 16 { 20949 break 20950 } 20951 v_1 := v.Args[1] 20952 if v_1.Op != OpConst64 { 20953 break 20954 } 20955 if v_1.AuxInt != 16 { 20956 break 20957 } 20958 v.reset(OpZeroExt16to32) 20959 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) 20960 v0.AddArg(x) 20961 v.AddArg(v0) 20962 return true 20963 } 20964 return false 20965 } 20966 func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { 20967 b := v.Block 20968 _ = b 20969 // match: (Rsh32Ux8 <t> x (Const8 [c])) 20970 // cond: 20971 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))])) 20972 for { 20973 t := v.Type 20974 _ = v.Args[1] 20975 x := v.Args[0] 20976 v_1 := v.Args[1] 20977 if v_1.Op != OpConst8 { 20978 break 20979 } 20980 c := v_1.AuxInt 20981 v.reset(OpRsh32Ux64) 20982 v.AddArg(x) 20983 v0 := b.NewValue0(v.Pos, OpConst64, t) 20984 v0.AuxInt = int64(uint8(c)) 20985 v.AddArg(v0) 20986 return true 20987 } 20988 // match: (Rsh32Ux8 (Const32 [0]) _) 20989 // cond: 20990 // result: (Const32 [0]) 20991 for { 20992 _ = v.Args[1] 20993 v_0 := v.Args[0] 20994 if v_0.Op != OpConst32 { 20995 break 20996 } 20997 if v_0.AuxInt != 0 { 20998 break 20999 } 21000 v.reset(OpConst32) 21001 v.AuxInt = 0 21002 return true 21003 } 21004 return false 21005 } 21006 func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { 21007 b := v.Block 21008 _ = b 21009 // match: (Rsh32x16 <t> x (Const16 [c])) 21010 // cond: 21011 // result: (Rsh32x64 x (Const64 <t> [int64(uint16(c))])) 21012 for { 21013 t := v.Type 21014 _ = v.Args[1] 21015 x := v.Args[0] 21016 v_1 := v.Args[1] 21017 if v_1.Op != OpConst16 { 21018 break 21019 } 21020 c := v_1.AuxInt 21021 v.reset(OpRsh32x64) 21022 v.AddArg(x) 21023 v0 := b.NewValue0(v.Pos, OpConst64, t) 21024 v0.AuxInt = int64(uint16(c)) 21025 v.AddArg(v0) 21026 return true 21027 } 21028 // match: (Rsh32x16 (Const32 [0]) _) 21029 // cond: 21030 // result: (Const32 [0]) 21031 for { 21032 _ = v.Args[1] 21033 v_0 := v.Args[0] 21034 if v_0.Op != OpConst32 { 21035 break 21036 } 21037 if v_0.AuxInt != 0 { 21038 break 21039 } 21040 v.reset(OpConst32) 21041 v.AuxInt = 0 21042 return true 21043 } 21044 return false 21045 } 21046 func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { 21047 b := v.Block 21048 _ = b 21049 // match: (Rsh32x32 <t> x (Const32 [c])) 21050 // cond: 21051 // result: (Rsh32x64 x (Const64 <t> [int64(uint32(c))])) 21052 for { 21053 t := v.Type 21054 _ = v.Args[1] 21055 x := v.Args[0] 21056 v_1 := v.Args[1] 21057 if v_1.Op != OpConst32 { 21058 break 21059 } 21060 c := v_1.AuxInt 21061 v.reset(OpRsh32x64) 21062 v.AddArg(x) 21063 v0 := b.NewValue0(v.Pos, OpConst64, t) 21064 v0.AuxInt = int64(uint32(c)) 21065 v.AddArg(v0) 21066 return true 21067 } 21068 // match: (Rsh32x32 (Const32 [0]) _) 21069 // cond: 21070 // result: (Const32 [0]) 21071 for { 21072 _ = v.Args[1] 21073 v_0 := v.Args[0] 21074 if v_0.Op != OpConst32 { 21075 break 21076 } 21077 if v_0.AuxInt != 0 { 21078 break 21079 } 21080 v.reset(OpConst32) 21081 v.AuxInt = 0 21082 return true 21083 } 21084 return false 21085 } 21086 func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { 21087 b := v.Block 21088 _ = b 21089 typ := &b.Func.Config.Types 21090 _ = typ 21091 // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) 21092 // cond: 21093 // result: (Const32 [int64(int32(c) >> uint64(d))]) 21094 for { 21095 _ = v.Args[1] 21096 v_0 := v.Args[0] 21097 if v_0.Op != OpConst32 { 21098 break 21099 } 21100 c := v_0.AuxInt 21101 v_1 := v.Args[1] 21102 if v_1.Op != OpConst64 { 21103 break 21104 } 21105 d := v_1.AuxInt 21106 v.reset(OpConst32) 21107 v.AuxInt = int64(int32(c) >> uint64(d)) 21108 return true 21109 } 21110 // match: (Rsh32x64 x (Const64 [0])) 21111 // cond: 21112 // result: x 21113 for { 21114 _ = v.Args[1] 21115 x := v.Args[0] 21116 v_1 := v.Args[1] 21117 if v_1.Op != OpConst64 { 21118 break 21119 } 21120 if v_1.AuxInt != 0 { 21121 break 21122 } 21123 v.reset(OpCopy) 21124 v.Type = x.Type 21125 v.AddArg(x) 21126 return true 21127 } 21128 // match: (Rsh32x64 (Const32 [0]) _) 21129 // cond: 21130 // result: (Const32 [0]) 21131 for { 21132 _ = v.Args[1] 21133 v_0 := v.Args[0] 21134 if v_0.Op != OpConst32 { 21135 break 21136 } 21137 if v_0.AuxInt != 0 { 21138 break 21139 } 21140 v.reset(OpConst32) 21141 v.AuxInt = 0 21142 return true 21143 } 21144 // match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d])) 21145 // cond: !uaddOvf(c,d) 21146 // result: (Rsh32x64 x (Const64 <t> [c+d])) 21147 for { 21148 t := v.Type 21149 _ = v.Args[1] 21150 v_0 := v.Args[0] 21151 if v_0.Op != OpRsh32x64 { 21152 break 21153 } 21154 _ = v_0.Args[1] 21155 x := v_0.Args[0] 21156 v_0_1 := v_0.Args[1] 21157 if v_0_1.Op != OpConst64 { 21158 break 21159 } 21160 c := v_0_1.AuxInt 21161 v_1 := v.Args[1] 21162 if v_1.Op != OpConst64 { 21163 break 21164 } 21165 d := v_1.AuxInt 21166 if !(!uaddOvf(c, d)) { 21167 break 21168 } 21169 v.reset(OpRsh32x64) 21170 v.AddArg(x) 21171 v0 := b.NewValue0(v.Pos, OpConst64, t) 21172 v0.AuxInt = c + d 21173 v.AddArg(v0) 21174 return true 21175 } 21176 // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 21177 // cond: 21178 // result: (SignExt8to32 (Trunc32to8 <typ.Int8> x)) 21179 for { 21180 _ = v.Args[1] 21181 v_0 := v.Args[0] 21182 if v_0.Op != OpLsh32x64 { 21183 break 21184 } 21185 _ = v_0.Args[1] 21186 x := v_0.Args[0] 21187 v_0_1 := v_0.Args[1] 21188 if v_0_1.Op != OpConst64 { 21189 break 21190 } 21191 if v_0_1.AuxInt != 24 { 21192 break 21193 } 21194 v_1 := v.Args[1] 21195 if v_1.Op != OpConst64 { 21196 break 21197 } 21198 if v_1.AuxInt != 24 { 21199 break 21200 } 21201 v.reset(OpSignExt8to32) 21202 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) 21203 v0.AddArg(x) 21204 v.AddArg(v0) 21205 return true 21206 } 21207 // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 21208 // cond: 21209 // result: (SignExt16to32 (Trunc32to16 <typ.Int16> x)) 21210 for { 21211 _ = v.Args[1] 21212 v_0 := v.Args[0] 21213 if v_0.Op != OpLsh32x64 { 21214 break 21215 } 21216 _ = v_0.Args[1] 21217 x := v_0.Args[0] 21218 v_0_1 := v_0.Args[1] 21219 if v_0_1.Op != OpConst64 { 21220 break 21221 } 21222 if v_0_1.AuxInt != 16 { 21223 break 21224 } 21225 v_1 := v.Args[1] 21226 if v_1.Op != OpConst64 { 21227 break 21228 } 21229 if v_1.AuxInt != 16 { 21230 break 21231 } 21232 v.reset(OpSignExt16to32) 21233 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) 21234 v0.AddArg(x) 21235 v.AddArg(v0) 21236 return true 21237 } 21238 return false 21239 } 21240 func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { 21241 b := v.Block 21242 _ = b 21243 // match: (Rsh32x8 <t> x (Const8 [c])) 21244 // cond: 21245 // result: (Rsh32x64 x (Const64 <t> [int64(uint8(c))])) 21246 for { 21247 t := v.Type 21248 _ = v.Args[1] 21249 x := v.Args[0] 21250 v_1 := v.Args[1] 21251 if v_1.Op != OpConst8 { 21252 break 21253 } 21254 c := v_1.AuxInt 21255 v.reset(OpRsh32x64) 21256 v.AddArg(x) 21257 v0 := b.NewValue0(v.Pos, OpConst64, t) 21258 v0.AuxInt = int64(uint8(c)) 21259 v.AddArg(v0) 21260 return true 21261 } 21262 // match: (Rsh32x8 (Const32 [0]) _) 21263 // cond: 21264 // result: (Const32 [0]) 21265 for { 21266 _ = v.Args[1] 21267 v_0 := v.Args[0] 21268 if v_0.Op != OpConst32 { 21269 break 21270 } 21271 if v_0.AuxInt != 0 { 21272 break 21273 } 21274 v.reset(OpConst32) 21275 v.AuxInt = 0 21276 return true 21277 } 21278 return false 21279 } 21280 func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { 21281 b := v.Block 21282 _ = b 21283 // match: (Rsh64Ux16 <t> x (Const16 [c])) 21284 // cond: 21285 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))])) 21286 for { 21287 t := v.Type 21288 _ = v.Args[1] 21289 x := v.Args[0] 21290 v_1 := v.Args[1] 21291 if v_1.Op != OpConst16 { 21292 break 21293 } 21294 c := v_1.AuxInt 21295 v.reset(OpRsh64Ux64) 21296 v.AddArg(x) 21297 v0 := b.NewValue0(v.Pos, OpConst64, t) 21298 v0.AuxInt = int64(uint16(c)) 21299 v.AddArg(v0) 21300 return true 21301 } 21302 // match: (Rsh64Ux16 (Const64 [0]) _) 21303 // cond: 21304 // result: (Const64 [0]) 21305 for { 21306 _ = v.Args[1] 21307 v_0 := v.Args[0] 21308 if v_0.Op != OpConst64 { 21309 break 21310 } 21311 if v_0.AuxInt != 0 { 21312 break 21313 } 21314 v.reset(OpConst64) 21315 v.AuxInt = 0 21316 return true 21317 } 21318 return false 21319 } 21320 func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { 21321 b := v.Block 21322 _ = b 21323 // match: (Rsh64Ux32 <t> x (Const32 [c])) 21324 // cond: 21325 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))])) 21326 for { 21327 t := v.Type 21328 _ = v.Args[1] 21329 x := v.Args[0] 21330 v_1 := v.Args[1] 21331 if v_1.Op != OpConst32 { 21332 break 21333 } 21334 c := v_1.AuxInt 21335 v.reset(OpRsh64Ux64) 21336 v.AddArg(x) 21337 v0 := b.NewValue0(v.Pos, OpConst64, t) 21338 v0.AuxInt = int64(uint32(c)) 21339 v.AddArg(v0) 21340 return true 21341 } 21342 // match: (Rsh64Ux32 (Const64 [0]) _) 21343 // cond: 21344 // result: (Const64 [0]) 21345 for { 21346 _ = v.Args[1] 21347 v_0 := v.Args[0] 21348 if v_0.Op != OpConst64 { 21349 break 21350 } 21351 if v_0.AuxInt != 0 { 21352 break 21353 } 21354 v.reset(OpConst64) 21355 v.AuxInt = 0 21356 return true 21357 } 21358 return false 21359 } 21360 func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { 21361 b := v.Block 21362 _ = b 21363 typ := &b.Func.Config.Types 21364 _ = typ 21365 // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) 21366 // cond: 21367 // result: (Const64 [int64(uint64(c) >> uint64(d))]) 21368 for { 21369 _ = v.Args[1] 21370 v_0 := v.Args[0] 21371 if v_0.Op != OpConst64 { 21372 break 21373 } 21374 c := v_0.AuxInt 21375 v_1 := v.Args[1] 21376 if v_1.Op != OpConst64 { 21377 break 21378 } 21379 d := v_1.AuxInt 21380 v.reset(OpConst64) 21381 v.AuxInt = int64(uint64(c) >> uint64(d)) 21382 return true 21383 } 21384 // match: (Rsh64Ux64 x (Const64 [0])) 21385 // cond: 21386 // result: x 21387 for { 21388 _ = v.Args[1] 21389 x := v.Args[0] 21390 v_1 := v.Args[1] 21391 if v_1.Op != OpConst64 { 21392 break 21393 } 21394 if v_1.AuxInt != 0 { 21395 break 21396 } 21397 v.reset(OpCopy) 21398 v.Type = x.Type 21399 v.AddArg(x) 21400 return true 21401 } 21402 // match: (Rsh64Ux64 (Const64 [0]) _) 21403 // cond: 21404 // result: (Const64 [0]) 21405 for { 21406 _ = v.Args[1] 21407 v_0 := v.Args[0] 21408 if v_0.Op != OpConst64 { 21409 break 21410 } 21411 if v_0.AuxInt != 0 { 21412 break 21413 } 21414 v.reset(OpConst64) 21415 v.AuxInt = 0 21416 return true 21417 } 21418 // match: (Rsh64Ux64 _ (Const64 [c])) 21419 // cond: uint64(c) >= 64 21420 // result: (Const64 [0]) 21421 for { 21422 _ = v.Args[1] 21423 v_1 := v.Args[1] 21424 if v_1.Op != OpConst64 { 21425 break 21426 } 21427 c := v_1.AuxInt 21428 if !(uint64(c) >= 64) { 21429 break 21430 } 21431 v.reset(OpConst64) 21432 v.AuxInt = 0 21433 return true 21434 } 21435 // match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) 21436 // cond: !uaddOvf(c,d) 21437 // result: (Rsh64Ux64 x (Const64 <t> [c+d])) 21438 for { 21439 t := v.Type 21440 _ = v.Args[1] 21441 v_0 := v.Args[0] 21442 if v_0.Op != OpRsh64Ux64 { 21443 break 21444 } 21445 _ = v_0.Args[1] 21446 x := v_0.Args[0] 21447 v_0_1 := v_0.Args[1] 21448 if v_0_1.Op != OpConst64 { 21449 break 21450 } 21451 c := v_0_1.AuxInt 21452 v_1 := v.Args[1] 21453 if v_1.Op != OpConst64 { 21454 break 21455 } 21456 d := v_1.AuxInt 21457 if !(!uaddOvf(c, d)) { 21458 break 21459 } 21460 v.reset(OpRsh64Ux64) 21461 v.AddArg(x) 21462 v0 := b.NewValue0(v.Pos, OpConst64, t) 21463 v0.AuxInt = c + d 21464 v.AddArg(v0) 21465 return true 21466 } 21467 // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 21468 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 21469 // result: (Rsh64Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 21470 for { 21471 _ = v.Args[1] 21472 v_0 := v.Args[0] 21473 if v_0.Op != OpLsh64x64 { 21474 break 21475 } 21476 _ = v_0.Args[1] 21477 v_0_0 := v_0.Args[0] 21478 if v_0_0.Op != OpRsh64Ux64 { 21479 break 21480 } 21481 _ = v_0_0.Args[1] 21482 x := v_0_0.Args[0] 21483 v_0_0_1 := v_0_0.Args[1] 21484 if v_0_0_1.Op != OpConst64 { 21485 break 21486 } 21487 c1 := v_0_0_1.AuxInt 21488 v_0_1 := v_0.Args[1] 21489 if v_0_1.Op != OpConst64 { 21490 break 21491 } 21492 c2 := v_0_1.AuxInt 21493 v_1 := v.Args[1] 21494 if v_1.Op != OpConst64 { 21495 break 21496 } 21497 c3 := v_1.AuxInt 21498 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 21499 break 21500 } 21501 v.reset(OpRsh64Ux64) 21502 v.AddArg(x) 21503 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 21504 v0.AuxInt = c1 - c2 + c3 21505 v.AddArg(v0) 21506 return true 21507 } 21508 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 21509 // cond: 21510 // result: (ZeroExt8to64 (Trunc64to8 <typ.UInt8> x)) 21511 for { 21512 _ = v.Args[1] 21513 v_0 := v.Args[0] 21514 if v_0.Op != OpLsh64x64 { 21515 break 21516 } 21517 _ = v_0.Args[1] 21518 x := v_0.Args[0] 21519 v_0_1 := v_0.Args[1] 21520 if v_0_1.Op != OpConst64 { 21521 break 21522 } 21523 if v_0_1.AuxInt != 56 { 21524 break 21525 } 21526 v_1 := v.Args[1] 21527 if v_1.Op != OpConst64 { 21528 break 21529 } 21530 if v_1.AuxInt != 56 { 21531 break 21532 } 21533 v.reset(OpZeroExt8to64) 21534 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) 21535 v0.AddArg(x) 21536 v.AddArg(v0) 21537 return true 21538 } 21539 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 21540 // cond: 21541 // result: (ZeroExt16to64 (Trunc64to16 <typ.UInt16> x)) 21542 for { 21543 _ = v.Args[1] 21544 v_0 := v.Args[0] 21545 if v_0.Op != OpLsh64x64 { 21546 break 21547 } 21548 _ = v_0.Args[1] 21549 x := v_0.Args[0] 21550 v_0_1 := v_0.Args[1] 21551 if v_0_1.Op != OpConst64 { 21552 break 21553 } 21554 if v_0_1.AuxInt != 48 { 21555 break 21556 } 21557 v_1 := v.Args[1] 21558 if v_1.Op != OpConst64 { 21559 break 21560 } 21561 if v_1.AuxInt != 48 { 21562 break 21563 } 21564 v.reset(OpZeroExt16to64) 21565 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) 21566 v0.AddArg(x) 21567 v.AddArg(v0) 21568 return true 21569 } 21570 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 21571 // cond: 21572 // result: (ZeroExt32to64 (Trunc64to32 <typ.UInt32> x)) 21573 for { 21574 _ = v.Args[1] 21575 v_0 := v.Args[0] 21576 if v_0.Op != OpLsh64x64 { 21577 break 21578 } 21579 _ = v_0.Args[1] 21580 x := v_0.Args[0] 21581 v_0_1 := v_0.Args[1] 21582 if v_0_1.Op != OpConst64 { 21583 break 21584 } 21585 if v_0_1.AuxInt != 32 { 21586 break 21587 } 21588 v_1 := v.Args[1] 21589 if v_1.Op != OpConst64 { 21590 break 21591 } 21592 if v_1.AuxInt != 32 { 21593 break 21594 } 21595 v.reset(OpZeroExt32to64) 21596 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) 21597 v0.AddArg(x) 21598 v.AddArg(v0) 21599 return true 21600 } 21601 return false 21602 } 21603 func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { 21604 b := v.Block 21605 _ = b 21606 // match: (Rsh64Ux8 <t> x (Const8 [c])) 21607 // cond: 21608 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))])) 21609 for { 21610 t := v.Type 21611 _ = v.Args[1] 21612 x := v.Args[0] 21613 v_1 := v.Args[1] 21614 if v_1.Op != OpConst8 { 21615 break 21616 } 21617 c := v_1.AuxInt 21618 v.reset(OpRsh64Ux64) 21619 v.AddArg(x) 21620 v0 := b.NewValue0(v.Pos, OpConst64, t) 21621 v0.AuxInt = int64(uint8(c)) 21622 v.AddArg(v0) 21623 return true 21624 } 21625 // match: (Rsh64Ux8 (Const64 [0]) _) 21626 // cond: 21627 // result: (Const64 [0]) 21628 for { 21629 _ = v.Args[1] 21630 v_0 := v.Args[0] 21631 if v_0.Op != OpConst64 { 21632 break 21633 } 21634 if v_0.AuxInt != 0 { 21635 break 21636 } 21637 v.reset(OpConst64) 21638 v.AuxInt = 0 21639 return true 21640 } 21641 return false 21642 } 21643 func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { 21644 b := v.Block 21645 _ = b 21646 // match: (Rsh64x16 <t> x (Const16 [c])) 21647 // cond: 21648 // result: (Rsh64x64 x (Const64 <t> [int64(uint16(c))])) 21649 for { 21650 t := v.Type 21651 _ = v.Args[1] 21652 x := v.Args[0] 21653 v_1 := v.Args[1] 21654 if v_1.Op != OpConst16 { 21655 break 21656 } 21657 c := v_1.AuxInt 21658 v.reset(OpRsh64x64) 21659 v.AddArg(x) 21660 v0 := b.NewValue0(v.Pos, OpConst64, t) 21661 v0.AuxInt = int64(uint16(c)) 21662 v.AddArg(v0) 21663 return true 21664 } 21665 // match: (Rsh64x16 (Const64 [0]) _) 21666 // cond: 21667 // result: (Const64 [0]) 21668 for { 21669 _ = v.Args[1] 21670 v_0 := v.Args[0] 21671 if v_0.Op != OpConst64 { 21672 break 21673 } 21674 if v_0.AuxInt != 0 { 21675 break 21676 } 21677 v.reset(OpConst64) 21678 v.AuxInt = 0 21679 return true 21680 } 21681 return false 21682 } 21683 func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { 21684 b := v.Block 21685 _ = b 21686 // match: (Rsh64x32 <t> x (Const32 [c])) 21687 // cond: 21688 // result: (Rsh64x64 x (Const64 <t> [int64(uint32(c))])) 21689 for { 21690 t := v.Type 21691 _ = v.Args[1] 21692 x := v.Args[0] 21693 v_1 := v.Args[1] 21694 if v_1.Op != OpConst32 { 21695 break 21696 } 21697 c := v_1.AuxInt 21698 v.reset(OpRsh64x64) 21699 v.AddArg(x) 21700 v0 := b.NewValue0(v.Pos, OpConst64, t) 21701 v0.AuxInt = int64(uint32(c)) 21702 v.AddArg(v0) 21703 return true 21704 } 21705 // match: (Rsh64x32 (Const64 [0]) _) 21706 // cond: 21707 // result: (Const64 [0]) 21708 for { 21709 _ = v.Args[1] 21710 v_0 := v.Args[0] 21711 if v_0.Op != OpConst64 { 21712 break 21713 } 21714 if v_0.AuxInt != 0 { 21715 break 21716 } 21717 v.reset(OpConst64) 21718 v.AuxInt = 0 21719 return true 21720 } 21721 return false 21722 } 21723 func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { 21724 b := v.Block 21725 _ = b 21726 typ := &b.Func.Config.Types 21727 _ = typ 21728 // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) 21729 // cond: 21730 // result: (Const64 [c >> uint64(d)]) 21731 for { 21732 _ = v.Args[1] 21733 v_0 := v.Args[0] 21734 if v_0.Op != OpConst64 { 21735 break 21736 } 21737 c := v_0.AuxInt 21738 v_1 := v.Args[1] 21739 if v_1.Op != OpConst64 { 21740 break 21741 } 21742 d := v_1.AuxInt 21743 v.reset(OpConst64) 21744 v.AuxInt = c >> uint64(d) 21745 return true 21746 } 21747 // match: (Rsh64x64 x (Const64 [0])) 21748 // cond: 21749 // result: x 21750 for { 21751 _ = v.Args[1] 21752 x := v.Args[0] 21753 v_1 := v.Args[1] 21754 if v_1.Op != OpConst64 { 21755 break 21756 } 21757 if v_1.AuxInt != 0 { 21758 break 21759 } 21760 v.reset(OpCopy) 21761 v.Type = x.Type 21762 v.AddArg(x) 21763 return true 21764 } 21765 // match: (Rsh64x64 (Const64 [0]) _) 21766 // cond: 21767 // result: (Const64 [0]) 21768 for { 21769 _ = v.Args[1] 21770 v_0 := v.Args[0] 21771 if v_0.Op != OpConst64 { 21772 break 21773 } 21774 if v_0.AuxInt != 0 { 21775 break 21776 } 21777 v.reset(OpConst64) 21778 v.AuxInt = 0 21779 return true 21780 } 21781 // match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d])) 21782 // cond: !uaddOvf(c,d) 21783 // result: (Rsh64x64 x (Const64 <t> [c+d])) 21784 for { 21785 t := v.Type 21786 _ = v.Args[1] 21787 v_0 := v.Args[0] 21788 if v_0.Op != OpRsh64x64 { 21789 break 21790 } 21791 _ = v_0.Args[1] 21792 x := v_0.Args[0] 21793 v_0_1 := v_0.Args[1] 21794 if v_0_1.Op != OpConst64 { 21795 break 21796 } 21797 c := v_0_1.AuxInt 21798 v_1 := v.Args[1] 21799 if v_1.Op != OpConst64 { 21800 break 21801 } 21802 d := v_1.AuxInt 21803 if !(!uaddOvf(c, d)) { 21804 break 21805 } 21806 v.reset(OpRsh64x64) 21807 v.AddArg(x) 21808 v0 := b.NewValue0(v.Pos, OpConst64, t) 21809 v0.AuxInt = c + d 21810 v.AddArg(v0) 21811 return true 21812 } 21813 // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 21814 // cond: 21815 // result: (SignExt8to64 (Trunc64to8 <typ.Int8> x)) 21816 for { 21817 _ = v.Args[1] 21818 v_0 := v.Args[0] 21819 if v_0.Op != OpLsh64x64 { 21820 break 21821 } 21822 _ = v_0.Args[1] 21823 x := v_0.Args[0] 21824 v_0_1 := v_0.Args[1] 21825 if v_0_1.Op != OpConst64 { 21826 break 21827 } 21828 if v_0_1.AuxInt != 56 { 21829 break 21830 } 21831 v_1 := v.Args[1] 21832 if v_1.Op != OpConst64 { 21833 break 21834 } 21835 if v_1.AuxInt != 56 { 21836 break 21837 } 21838 v.reset(OpSignExt8to64) 21839 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) 21840 v0.AddArg(x) 21841 v.AddArg(v0) 21842 return true 21843 } 21844 // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 21845 // cond: 21846 // result: (SignExt16to64 (Trunc64to16 <typ.Int16> x)) 21847 for { 21848 _ = v.Args[1] 21849 v_0 := v.Args[0] 21850 if v_0.Op != OpLsh64x64 { 21851 break 21852 } 21853 _ = v_0.Args[1] 21854 x := v_0.Args[0] 21855 v_0_1 := v_0.Args[1] 21856 if v_0_1.Op != OpConst64 { 21857 break 21858 } 21859 if v_0_1.AuxInt != 48 { 21860 break 21861 } 21862 v_1 := v.Args[1] 21863 if v_1.Op != OpConst64 { 21864 break 21865 } 21866 if v_1.AuxInt != 48 { 21867 break 21868 } 21869 v.reset(OpSignExt16to64) 21870 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) 21871 v0.AddArg(x) 21872 v.AddArg(v0) 21873 return true 21874 } 21875 // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 21876 // cond: 21877 // result: (SignExt32to64 (Trunc64to32 <typ.Int32> x)) 21878 for { 21879 _ = v.Args[1] 21880 v_0 := v.Args[0] 21881 if v_0.Op != OpLsh64x64 { 21882 break 21883 } 21884 _ = v_0.Args[1] 21885 x := v_0.Args[0] 21886 v_0_1 := v_0.Args[1] 21887 if v_0_1.Op != OpConst64 { 21888 break 21889 } 21890 if v_0_1.AuxInt != 32 { 21891 break 21892 } 21893 v_1 := v.Args[1] 21894 if v_1.Op != OpConst64 { 21895 break 21896 } 21897 if v_1.AuxInt != 32 { 21898 break 21899 } 21900 v.reset(OpSignExt32to64) 21901 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) 21902 v0.AddArg(x) 21903 v.AddArg(v0) 21904 return true 21905 } 21906 return false 21907 } 21908 func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { 21909 b := v.Block 21910 _ = b 21911 // match: (Rsh64x8 <t> x (Const8 [c])) 21912 // cond: 21913 // result: (Rsh64x64 x (Const64 <t> [int64(uint8(c))])) 21914 for { 21915 t := v.Type 21916 _ = v.Args[1] 21917 x := v.Args[0] 21918 v_1 := v.Args[1] 21919 if v_1.Op != OpConst8 { 21920 break 21921 } 21922 c := v_1.AuxInt 21923 v.reset(OpRsh64x64) 21924 v.AddArg(x) 21925 v0 := b.NewValue0(v.Pos, OpConst64, t) 21926 v0.AuxInt = int64(uint8(c)) 21927 v.AddArg(v0) 21928 return true 21929 } 21930 // match: (Rsh64x8 (Const64 [0]) _) 21931 // cond: 21932 // result: (Const64 [0]) 21933 for { 21934 _ = v.Args[1] 21935 v_0 := v.Args[0] 21936 if v_0.Op != OpConst64 { 21937 break 21938 } 21939 if v_0.AuxInt != 0 { 21940 break 21941 } 21942 v.reset(OpConst64) 21943 v.AuxInt = 0 21944 return true 21945 } 21946 return false 21947 } 21948 func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { 21949 b := v.Block 21950 _ = b 21951 // match: (Rsh8Ux16 <t> x (Const16 [c])) 21952 // cond: 21953 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))])) 21954 for { 21955 t := v.Type 21956 _ = v.Args[1] 21957 x := v.Args[0] 21958 v_1 := v.Args[1] 21959 if v_1.Op != OpConst16 { 21960 break 21961 } 21962 c := v_1.AuxInt 21963 v.reset(OpRsh8Ux64) 21964 v.AddArg(x) 21965 v0 := b.NewValue0(v.Pos, OpConst64, t) 21966 v0.AuxInt = int64(uint16(c)) 21967 v.AddArg(v0) 21968 return true 21969 } 21970 // match: (Rsh8Ux16 (Const8 [0]) _) 21971 // cond: 21972 // result: (Const8 [0]) 21973 for { 21974 _ = v.Args[1] 21975 v_0 := v.Args[0] 21976 if v_0.Op != OpConst8 { 21977 break 21978 } 21979 if v_0.AuxInt != 0 { 21980 break 21981 } 21982 v.reset(OpConst8) 21983 v.AuxInt = 0 21984 return true 21985 } 21986 return false 21987 } 21988 func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { 21989 b := v.Block 21990 _ = b 21991 // match: (Rsh8Ux32 <t> x (Const32 [c])) 21992 // cond: 21993 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))])) 21994 for { 21995 t := v.Type 21996 _ = v.Args[1] 21997 x := v.Args[0] 21998 v_1 := v.Args[1] 21999 if v_1.Op != OpConst32 { 22000 break 22001 } 22002 c := v_1.AuxInt 22003 v.reset(OpRsh8Ux64) 22004 v.AddArg(x) 22005 v0 := b.NewValue0(v.Pos, OpConst64, t) 22006 v0.AuxInt = int64(uint32(c)) 22007 v.AddArg(v0) 22008 return true 22009 } 22010 // match: (Rsh8Ux32 (Const8 [0]) _) 22011 // cond: 22012 // result: (Const8 [0]) 22013 for { 22014 _ = v.Args[1] 22015 v_0 := v.Args[0] 22016 if v_0.Op != OpConst8 { 22017 break 22018 } 22019 if v_0.AuxInt != 0 { 22020 break 22021 } 22022 v.reset(OpConst8) 22023 v.AuxInt = 0 22024 return true 22025 } 22026 return false 22027 } 22028 func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { 22029 b := v.Block 22030 _ = b 22031 typ := &b.Func.Config.Types 22032 _ = typ 22033 // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) 22034 // cond: 22035 // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) 22036 for { 22037 _ = v.Args[1] 22038 v_0 := v.Args[0] 22039 if v_0.Op != OpConst8 { 22040 break 22041 } 22042 c := v_0.AuxInt 22043 v_1 := v.Args[1] 22044 if v_1.Op != OpConst64 { 22045 break 22046 } 22047 d := v_1.AuxInt 22048 v.reset(OpConst8) 22049 v.AuxInt = int64(int8(uint8(c) >> uint64(d))) 22050 return true 22051 } 22052 // match: (Rsh8Ux64 x (Const64 [0])) 22053 // cond: 22054 // result: x 22055 for { 22056 _ = v.Args[1] 22057 x := v.Args[0] 22058 v_1 := v.Args[1] 22059 if v_1.Op != OpConst64 { 22060 break 22061 } 22062 if v_1.AuxInt != 0 { 22063 break 22064 } 22065 v.reset(OpCopy) 22066 v.Type = x.Type 22067 v.AddArg(x) 22068 return true 22069 } 22070 // match: (Rsh8Ux64 (Const8 [0]) _) 22071 // cond: 22072 // result: (Const8 [0]) 22073 for { 22074 _ = v.Args[1] 22075 v_0 := v.Args[0] 22076 if v_0.Op != OpConst8 { 22077 break 22078 } 22079 if v_0.AuxInt != 0 { 22080 break 22081 } 22082 v.reset(OpConst8) 22083 v.AuxInt = 0 22084 return true 22085 } 22086 // match: (Rsh8Ux64 _ (Const64 [c])) 22087 // cond: uint64(c) >= 8 22088 // result: (Const8 [0]) 22089 for { 22090 _ = v.Args[1] 22091 v_1 := v.Args[1] 22092 if v_1.Op != OpConst64 { 22093 break 22094 } 22095 c := v_1.AuxInt 22096 if !(uint64(c) >= 8) { 22097 break 22098 } 22099 v.reset(OpConst8) 22100 v.AuxInt = 0 22101 return true 22102 } 22103 // match: (Rsh8Ux64 <t> (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) 22104 // cond: !uaddOvf(c,d) 22105 // result: (Rsh8Ux64 x (Const64 <t> [c+d])) 22106 for { 22107 t := v.Type 22108 _ = v.Args[1] 22109 v_0 := v.Args[0] 22110 if v_0.Op != OpRsh8Ux64 { 22111 break 22112 } 22113 _ = v_0.Args[1] 22114 x := v_0.Args[0] 22115 v_0_1 := v_0.Args[1] 22116 if v_0_1.Op != OpConst64 { 22117 break 22118 } 22119 c := v_0_1.AuxInt 22120 v_1 := v.Args[1] 22121 if v_1.Op != OpConst64 { 22122 break 22123 } 22124 d := v_1.AuxInt 22125 if !(!uaddOvf(c, d)) { 22126 break 22127 } 22128 v.reset(OpRsh8Ux64) 22129 v.AddArg(x) 22130 v0 := b.NewValue0(v.Pos, OpConst64, t) 22131 v0.AuxInt = c + d 22132 v.AddArg(v0) 22133 return true 22134 } 22135 // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 22136 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 22137 // result: (Rsh8Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 22138 for { 22139 _ = v.Args[1] 22140 v_0 := v.Args[0] 22141 if v_0.Op != OpLsh8x64 { 22142 break 22143 } 22144 _ = v_0.Args[1] 22145 v_0_0 := v_0.Args[0] 22146 if v_0_0.Op != OpRsh8Ux64 { 22147 break 22148 } 22149 _ = v_0_0.Args[1] 22150 x := v_0_0.Args[0] 22151 v_0_0_1 := v_0_0.Args[1] 22152 if v_0_0_1.Op != OpConst64 { 22153 break 22154 } 22155 c1 := v_0_0_1.AuxInt 22156 v_0_1 := v_0.Args[1] 22157 if v_0_1.Op != OpConst64 { 22158 break 22159 } 22160 c2 := v_0_1.AuxInt 22161 v_1 := v.Args[1] 22162 if v_1.Op != OpConst64 { 22163 break 22164 } 22165 c3 := v_1.AuxInt 22166 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 22167 break 22168 } 22169 v.reset(OpRsh8Ux64) 22170 v.AddArg(x) 22171 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 22172 v0.AuxInt = c1 - c2 + c3 22173 v.AddArg(v0) 22174 return true 22175 } 22176 return false 22177 } 22178 func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { 22179 b := v.Block 22180 _ = b 22181 // match: (Rsh8Ux8 <t> x (Const8 [c])) 22182 // cond: 22183 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))])) 22184 for { 22185 t := v.Type 22186 _ = v.Args[1] 22187 x := v.Args[0] 22188 v_1 := v.Args[1] 22189 if v_1.Op != OpConst8 { 22190 break 22191 } 22192 c := v_1.AuxInt 22193 v.reset(OpRsh8Ux64) 22194 v.AddArg(x) 22195 v0 := b.NewValue0(v.Pos, OpConst64, t) 22196 v0.AuxInt = int64(uint8(c)) 22197 v.AddArg(v0) 22198 return true 22199 } 22200 // match: (Rsh8Ux8 (Const8 [0]) _) 22201 // cond: 22202 // result: (Const8 [0]) 22203 for { 22204 _ = v.Args[1] 22205 v_0 := v.Args[0] 22206 if v_0.Op != OpConst8 { 22207 break 22208 } 22209 if v_0.AuxInt != 0 { 22210 break 22211 } 22212 v.reset(OpConst8) 22213 v.AuxInt = 0 22214 return true 22215 } 22216 return false 22217 } 22218 func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { 22219 b := v.Block 22220 _ = b 22221 // match: (Rsh8x16 <t> x (Const16 [c])) 22222 // cond: 22223 // result: (Rsh8x64 x (Const64 <t> [int64(uint16(c))])) 22224 for { 22225 t := v.Type 22226 _ = v.Args[1] 22227 x := v.Args[0] 22228 v_1 := v.Args[1] 22229 if v_1.Op != OpConst16 { 22230 break 22231 } 22232 c := v_1.AuxInt 22233 v.reset(OpRsh8x64) 22234 v.AddArg(x) 22235 v0 := b.NewValue0(v.Pos, OpConst64, t) 22236 v0.AuxInt = int64(uint16(c)) 22237 v.AddArg(v0) 22238 return true 22239 } 22240 // match: (Rsh8x16 (Const8 [0]) _) 22241 // cond: 22242 // result: (Const8 [0]) 22243 for { 22244 _ = v.Args[1] 22245 v_0 := v.Args[0] 22246 if v_0.Op != OpConst8 { 22247 break 22248 } 22249 if v_0.AuxInt != 0 { 22250 break 22251 } 22252 v.reset(OpConst8) 22253 v.AuxInt = 0 22254 return true 22255 } 22256 return false 22257 } 22258 func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { 22259 b := v.Block 22260 _ = b 22261 // match: (Rsh8x32 <t> x (Const32 [c])) 22262 // cond: 22263 // result: (Rsh8x64 x (Const64 <t> [int64(uint32(c))])) 22264 for { 22265 t := v.Type 22266 _ = v.Args[1] 22267 x := v.Args[0] 22268 v_1 := v.Args[1] 22269 if v_1.Op != OpConst32 { 22270 break 22271 } 22272 c := v_1.AuxInt 22273 v.reset(OpRsh8x64) 22274 v.AddArg(x) 22275 v0 := b.NewValue0(v.Pos, OpConst64, t) 22276 v0.AuxInt = int64(uint32(c)) 22277 v.AddArg(v0) 22278 return true 22279 } 22280 // match: (Rsh8x32 (Const8 [0]) _) 22281 // cond: 22282 // result: (Const8 [0]) 22283 for { 22284 _ = v.Args[1] 22285 v_0 := v.Args[0] 22286 if v_0.Op != OpConst8 { 22287 break 22288 } 22289 if v_0.AuxInt != 0 { 22290 break 22291 } 22292 v.reset(OpConst8) 22293 v.AuxInt = 0 22294 return true 22295 } 22296 return false 22297 } 22298 func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { 22299 b := v.Block 22300 _ = b 22301 // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) 22302 // cond: 22303 // result: (Const8 [int64(int8(c) >> uint64(d))]) 22304 for { 22305 _ = v.Args[1] 22306 v_0 := v.Args[0] 22307 if v_0.Op != OpConst8 { 22308 break 22309 } 22310 c := v_0.AuxInt 22311 v_1 := v.Args[1] 22312 if v_1.Op != OpConst64 { 22313 break 22314 } 22315 d := v_1.AuxInt 22316 v.reset(OpConst8) 22317 v.AuxInt = int64(int8(c) >> uint64(d)) 22318 return true 22319 } 22320 // match: (Rsh8x64 x (Const64 [0])) 22321 // cond: 22322 // result: x 22323 for { 22324 _ = v.Args[1] 22325 x := v.Args[0] 22326 v_1 := v.Args[1] 22327 if v_1.Op != OpConst64 { 22328 break 22329 } 22330 if v_1.AuxInt != 0 { 22331 break 22332 } 22333 v.reset(OpCopy) 22334 v.Type = x.Type 22335 v.AddArg(x) 22336 return true 22337 } 22338 // match: (Rsh8x64 (Const8 [0]) _) 22339 // cond: 22340 // result: (Const8 [0]) 22341 for { 22342 _ = v.Args[1] 22343 v_0 := v.Args[0] 22344 if v_0.Op != OpConst8 { 22345 break 22346 } 22347 if v_0.AuxInt != 0 { 22348 break 22349 } 22350 v.reset(OpConst8) 22351 v.AuxInt = 0 22352 return true 22353 } 22354 // match: (Rsh8x64 <t> (Rsh8x64 x (Const64 [c])) (Const64 [d])) 22355 // cond: !uaddOvf(c,d) 22356 // result: (Rsh8x64 x (Const64 <t> [c+d])) 22357 for { 22358 t := v.Type 22359 _ = v.Args[1] 22360 v_0 := v.Args[0] 22361 if v_0.Op != OpRsh8x64 { 22362 break 22363 } 22364 _ = v_0.Args[1] 22365 x := v_0.Args[0] 22366 v_0_1 := v_0.Args[1] 22367 if v_0_1.Op != OpConst64 { 22368 break 22369 } 22370 c := v_0_1.AuxInt 22371 v_1 := v.Args[1] 22372 if v_1.Op != OpConst64 { 22373 break 22374 } 22375 d := v_1.AuxInt 22376 if !(!uaddOvf(c, d)) { 22377 break 22378 } 22379 v.reset(OpRsh8x64) 22380 v.AddArg(x) 22381 v0 := b.NewValue0(v.Pos, OpConst64, t) 22382 v0.AuxInt = c + d 22383 v.AddArg(v0) 22384 return true 22385 } 22386 return false 22387 } 22388 func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { 22389 b := v.Block 22390 _ = b 22391 // match: (Rsh8x8 <t> x (Const8 [c])) 22392 // cond: 22393 // result: (Rsh8x64 x (Const64 <t> [int64(uint8(c))])) 22394 for { 22395 t := v.Type 22396 _ = v.Args[1] 22397 x := v.Args[0] 22398 v_1 := v.Args[1] 22399 if v_1.Op != OpConst8 { 22400 break 22401 } 22402 c := v_1.AuxInt 22403 v.reset(OpRsh8x64) 22404 v.AddArg(x) 22405 v0 := b.NewValue0(v.Pos, OpConst64, t) 22406 v0.AuxInt = int64(uint8(c)) 22407 v.AddArg(v0) 22408 return true 22409 } 22410 // match: (Rsh8x8 (Const8 [0]) _) 22411 // cond: 22412 // result: (Const8 [0]) 22413 for { 22414 _ = v.Args[1] 22415 v_0 := v.Args[0] 22416 if v_0.Op != OpConst8 { 22417 break 22418 } 22419 if v_0.AuxInt != 0 { 22420 break 22421 } 22422 v.reset(OpConst8) 22423 v.AuxInt = 0 22424 return true 22425 } 22426 return false 22427 } 22428 func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { 22429 // match: (SignExt16to32 (Const16 [c])) 22430 // cond: 22431 // result: (Const32 [int64( int16(c))]) 22432 for { 22433 v_0 := v.Args[0] 22434 if v_0.Op != OpConst16 { 22435 break 22436 } 22437 c := v_0.AuxInt 22438 v.reset(OpConst32) 22439 v.AuxInt = int64(int16(c)) 22440 return true 22441 } 22442 // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) 22443 // cond: s >= 16 22444 // result: x 22445 for { 22446 v_0 := v.Args[0] 22447 if v_0.Op != OpTrunc32to16 { 22448 break 22449 } 22450 x := v_0.Args[0] 22451 if x.Op != OpRsh32x64 { 22452 break 22453 } 22454 _ = x.Args[1] 22455 x_1 := x.Args[1] 22456 if x_1.Op != OpConst64 { 22457 break 22458 } 22459 s := x_1.AuxInt 22460 if !(s >= 16) { 22461 break 22462 } 22463 v.reset(OpCopy) 22464 v.Type = x.Type 22465 v.AddArg(x) 22466 return true 22467 } 22468 return false 22469 } 22470 func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { 22471 // match: (SignExt16to64 (Const16 [c])) 22472 // cond: 22473 // result: (Const64 [int64( int16(c))]) 22474 for { 22475 v_0 := v.Args[0] 22476 if v_0.Op != OpConst16 { 22477 break 22478 } 22479 c := v_0.AuxInt 22480 v.reset(OpConst64) 22481 v.AuxInt = int64(int16(c)) 22482 return true 22483 } 22484 // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) 22485 // cond: s >= 48 22486 // result: x 22487 for { 22488 v_0 := v.Args[0] 22489 if v_0.Op != OpTrunc64to16 { 22490 break 22491 } 22492 x := v_0.Args[0] 22493 if x.Op != OpRsh64x64 { 22494 break 22495 } 22496 _ = x.Args[1] 22497 x_1 := x.Args[1] 22498 if x_1.Op != OpConst64 { 22499 break 22500 } 22501 s := x_1.AuxInt 22502 if !(s >= 48) { 22503 break 22504 } 22505 v.reset(OpCopy) 22506 v.Type = x.Type 22507 v.AddArg(x) 22508 return true 22509 } 22510 return false 22511 } 22512 func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { 22513 // match: (SignExt32to64 (Const32 [c])) 22514 // cond: 22515 // result: (Const64 [int64( int32(c))]) 22516 for { 22517 v_0 := v.Args[0] 22518 if v_0.Op != OpConst32 { 22519 break 22520 } 22521 c := v_0.AuxInt 22522 v.reset(OpConst64) 22523 v.AuxInt = int64(int32(c)) 22524 return true 22525 } 22526 // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) 22527 // cond: s >= 32 22528 // result: x 22529 for { 22530 v_0 := v.Args[0] 22531 if v_0.Op != OpTrunc64to32 { 22532 break 22533 } 22534 x := v_0.Args[0] 22535 if x.Op != OpRsh64x64 { 22536 break 22537 } 22538 _ = x.Args[1] 22539 x_1 := x.Args[1] 22540 if x_1.Op != OpConst64 { 22541 break 22542 } 22543 s := x_1.AuxInt 22544 if !(s >= 32) { 22545 break 22546 } 22547 v.reset(OpCopy) 22548 v.Type = x.Type 22549 v.AddArg(x) 22550 return true 22551 } 22552 return false 22553 } 22554 func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { 22555 // match: (SignExt8to16 (Const8 [c])) 22556 // cond: 22557 // result: (Const16 [int64( int8(c))]) 22558 for { 22559 v_0 := v.Args[0] 22560 if v_0.Op != OpConst8 { 22561 break 22562 } 22563 c := v_0.AuxInt 22564 v.reset(OpConst16) 22565 v.AuxInt = int64(int8(c)) 22566 return true 22567 } 22568 // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) 22569 // cond: s >= 8 22570 // result: x 22571 for { 22572 v_0 := v.Args[0] 22573 if v_0.Op != OpTrunc16to8 { 22574 break 22575 } 22576 x := v_0.Args[0] 22577 if x.Op != OpRsh16x64 { 22578 break 22579 } 22580 _ = x.Args[1] 22581 x_1 := x.Args[1] 22582 if x_1.Op != OpConst64 { 22583 break 22584 } 22585 s := x_1.AuxInt 22586 if !(s >= 8) { 22587 break 22588 } 22589 v.reset(OpCopy) 22590 v.Type = x.Type 22591 v.AddArg(x) 22592 return true 22593 } 22594 return false 22595 } 22596 func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { 22597 // match: (SignExt8to32 (Const8 [c])) 22598 // cond: 22599 // result: (Const32 [int64( int8(c))]) 22600 for { 22601 v_0 := v.Args[0] 22602 if v_0.Op != OpConst8 { 22603 break 22604 } 22605 c := v_0.AuxInt 22606 v.reset(OpConst32) 22607 v.AuxInt = int64(int8(c)) 22608 return true 22609 } 22610 // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) 22611 // cond: s >= 24 22612 // result: x 22613 for { 22614 v_0 := v.Args[0] 22615 if v_0.Op != OpTrunc32to8 { 22616 break 22617 } 22618 x := v_0.Args[0] 22619 if x.Op != OpRsh32x64 { 22620 break 22621 } 22622 _ = x.Args[1] 22623 x_1 := x.Args[1] 22624 if x_1.Op != OpConst64 { 22625 break 22626 } 22627 s := x_1.AuxInt 22628 if !(s >= 24) { 22629 break 22630 } 22631 v.reset(OpCopy) 22632 v.Type = x.Type 22633 v.AddArg(x) 22634 return true 22635 } 22636 return false 22637 } 22638 func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { 22639 // match: (SignExt8to64 (Const8 [c])) 22640 // cond: 22641 // result: (Const64 [int64( int8(c))]) 22642 for { 22643 v_0 := v.Args[0] 22644 if v_0.Op != OpConst8 { 22645 break 22646 } 22647 c := v_0.AuxInt 22648 v.reset(OpConst64) 22649 v.AuxInt = int64(int8(c)) 22650 return true 22651 } 22652 // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) 22653 // cond: s >= 56 22654 // result: x 22655 for { 22656 v_0 := v.Args[0] 22657 if v_0.Op != OpTrunc64to8 { 22658 break 22659 } 22660 x := v_0.Args[0] 22661 if x.Op != OpRsh64x64 { 22662 break 22663 } 22664 _ = x.Args[1] 22665 x_1 := x.Args[1] 22666 if x_1.Op != OpConst64 { 22667 break 22668 } 22669 s := x_1.AuxInt 22670 if !(s >= 56) { 22671 break 22672 } 22673 v.reset(OpCopy) 22674 v.Type = x.Type 22675 v.AddArg(x) 22676 return true 22677 } 22678 return false 22679 } 22680 func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { 22681 // match: (SliceCap (SliceMake _ _ (Const64 <t> [c]))) 22682 // cond: 22683 // result: (Const64 <t> [c]) 22684 for { 22685 v_0 := v.Args[0] 22686 if v_0.Op != OpSliceMake { 22687 break 22688 } 22689 _ = v_0.Args[2] 22690 v_0_2 := v_0.Args[2] 22691 if v_0_2.Op != OpConst64 { 22692 break 22693 } 22694 t := v_0_2.Type 22695 c := v_0_2.AuxInt 22696 v.reset(OpConst64) 22697 v.Type = t 22698 v.AuxInt = c 22699 return true 22700 } 22701 // match: (SliceCap (SliceMake _ _ (Const32 <t> [c]))) 22702 // cond: 22703 // result: (Const32 <t> [c]) 22704 for { 22705 v_0 := v.Args[0] 22706 if v_0.Op != OpSliceMake { 22707 break 22708 } 22709 _ = v_0.Args[2] 22710 v_0_2 := v_0.Args[2] 22711 if v_0_2.Op != OpConst32 { 22712 break 22713 } 22714 t := v_0_2.Type 22715 c := v_0_2.AuxInt 22716 v.reset(OpConst32) 22717 v.Type = t 22718 v.AuxInt = c 22719 return true 22720 } 22721 // match: (SliceCap (SliceMake _ _ (SliceCap x))) 22722 // cond: 22723 // result: (SliceCap x) 22724 for { 22725 v_0 := v.Args[0] 22726 if v_0.Op != OpSliceMake { 22727 break 22728 } 22729 _ = v_0.Args[2] 22730 v_0_2 := v_0.Args[2] 22731 if v_0_2.Op != OpSliceCap { 22732 break 22733 } 22734 x := v_0_2.Args[0] 22735 v.reset(OpSliceCap) 22736 v.AddArg(x) 22737 return true 22738 } 22739 // match: (SliceCap (SliceMake _ _ (SliceLen x))) 22740 // cond: 22741 // result: (SliceLen x) 22742 for { 22743 v_0 := v.Args[0] 22744 if v_0.Op != OpSliceMake { 22745 break 22746 } 22747 _ = v_0.Args[2] 22748 v_0_2 := v_0.Args[2] 22749 if v_0_2.Op != OpSliceLen { 22750 break 22751 } 22752 x := v_0_2.Args[0] 22753 v.reset(OpSliceLen) 22754 v.AddArg(x) 22755 return true 22756 } 22757 return false 22758 } 22759 func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { 22760 // match: (SliceLen (SliceMake _ (Const64 <t> [c]) _)) 22761 // cond: 22762 // result: (Const64 <t> [c]) 22763 for { 22764 v_0 := v.Args[0] 22765 if v_0.Op != OpSliceMake { 22766 break 22767 } 22768 _ = v_0.Args[2] 22769 v_0_1 := v_0.Args[1] 22770 if v_0_1.Op != OpConst64 { 22771 break 22772 } 22773 t := v_0_1.Type 22774 c := v_0_1.AuxInt 22775 v.reset(OpConst64) 22776 v.Type = t 22777 v.AuxInt = c 22778 return true 22779 } 22780 // match: (SliceLen (SliceMake _ (Const32 <t> [c]) _)) 22781 // cond: 22782 // result: (Const32 <t> [c]) 22783 for { 22784 v_0 := v.Args[0] 22785 if v_0.Op != OpSliceMake { 22786 break 22787 } 22788 _ = v_0.Args[2] 22789 v_0_1 := v_0.Args[1] 22790 if v_0_1.Op != OpConst32 { 22791 break 22792 } 22793 t := v_0_1.Type 22794 c := v_0_1.AuxInt 22795 v.reset(OpConst32) 22796 v.Type = t 22797 v.AuxInt = c 22798 return true 22799 } 22800 // match: (SliceLen (SliceMake _ (SliceLen x) _)) 22801 // cond: 22802 // result: (SliceLen x) 22803 for { 22804 v_0 := v.Args[0] 22805 if v_0.Op != OpSliceMake { 22806 break 22807 } 22808 _ = v_0.Args[2] 22809 v_0_1 := v_0.Args[1] 22810 if v_0_1.Op != OpSliceLen { 22811 break 22812 } 22813 x := v_0_1.Args[0] 22814 v.reset(OpSliceLen) 22815 v.AddArg(x) 22816 return true 22817 } 22818 return false 22819 } 22820 func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { 22821 // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) 22822 // cond: 22823 // result: (SlicePtr x) 22824 for { 22825 v_0 := v.Args[0] 22826 if v_0.Op != OpSliceMake { 22827 break 22828 } 22829 _ = v_0.Args[2] 22830 v_0_0 := v_0.Args[0] 22831 if v_0_0.Op != OpSlicePtr { 22832 break 22833 } 22834 x := v_0_0.Args[0] 22835 v.reset(OpSlicePtr) 22836 v.AddArg(x) 22837 return true 22838 } 22839 return false 22840 } 22841 func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { 22842 // match: (Slicemask (Const32 [x])) 22843 // cond: x > 0 22844 // result: (Const32 [-1]) 22845 for { 22846 v_0 := v.Args[0] 22847 if v_0.Op != OpConst32 { 22848 break 22849 } 22850 x := v_0.AuxInt 22851 if !(x > 0) { 22852 break 22853 } 22854 v.reset(OpConst32) 22855 v.AuxInt = -1 22856 return true 22857 } 22858 // match: (Slicemask (Const32 [0])) 22859 // cond: 22860 // result: (Const32 [0]) 22861 for { 22862 v_0 := v.Args[0] 22863 if v_0.Op != OpConst32 { 22864 break 22865 } 22866 if v_0.AuxInt != 0 { 22867 break 22868 } 22869 v.reset(OpConst32) 22870 v.AuxInt = 0 22871 return true 22872 } 22873 // match: (Slicemask (Const64 [x])) 22874 // cond: x > 0 22875 // result: (Const64 [-1]) 22876 for { 22877 v_0 := v.Args[0] 22878 if v_0.Op != OpConst64 { 22879 break 22880 } 22881 x := v_0.AuxInt 22882 if !(x > 0) { 22883 break 22884 } 22885 v.reset(OpConst64) 22886 v.AuxInt = -1 22887 return true 22888 } 22889 // match: (Slicemask (Const64 [0])) 22890 // cond: 22891 // result: (Const64 [0]) 22892 for { 22893 v_0 := v.Args[0] 22894 if v_0.Op != OpConst64 { 22895 break 22896 } 22897 if v_0.AuxInt != 0 { 22898 break 22899 } 22900 v.reset(OpConst64) 22901 v.AuxInt = 0 22902 return true 22903 } 22904 return false 22905 } 22906 func rewriteValuegeneric_OpSqrt_0(v *Value) bool { 22907 // match: (Sqrt (Const64F [c])) 22908 // cond: 22909 // result: (Const64F [f2i(math.Sqrt(i2f(c)))]) 22910 for { 22911 v_0 := v.Args[0] 22912 if v_0.Op != OpConst64F { 22913 break 22914 } 22915 c := v_0.AuxInt 22916 v.reset(OpConst64F) 22917 v.AuxInt = f2i(math.Sqrt(i2f(c))) 22918 return true 22919 } 22920 return false 22921 } 22922 func rewriteValuegeneric_OpStore_0(v *Value) bool { 22923 b := v.Block 22924 _ = b 22925 fe := b.Func.fe 22926 _ = fe 22927 // match: (Store {t1} p1 (Load <t2> p2 mem) mem) 22928 // cond: isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size() 22929 // result: mem 22930 for { 22931 t1 := v.Aux 22932 _ = v.Args[2] 22933 p1 := v.Args[0] 22934 v_1 := v.Args[1] 22935 if v_1.Op != OpLoad { 22936 break 22937 } 22938 t2 := v_1.Type 22939 _ = v_1.Args[1] 22940 p2 := v_1.Args[0] 22941 mem := v_1.Args[1] 22942 if mem != v.Args[2] { 22943 break 22944 } 22945 if !(isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size()) { 22946 break 22947 } 22948 v.reset(OpCopy) 22949 v.Type = mem.Type 22950 v.AddArg(mem) 22951 return true 22952 } 22953 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ oldmem)) 22954 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) 22955 // result: mem 22956 for { 22957 t1 := v.Aux 22958 _ = v.Args[2] 22959 v_0 := v.Args[0] 22960 if v_0.Op != OpOffPtr { 22961 break 22962 } 22963 o1 := v_0.AuxInt 22964 p1 := v_0.Args[0] 22965 v_1 := v.Args[1] 22966 if v_1.Op != OpLoad { 22967 break 22968 } 22969 t2 := v_1.Type 22970 _ = v_1.Args[1] 22971 v_1_0 := v_1.Args[0] 22972 if v_1_0.Op != OpOffPtr { 22973 break 22974 } 22975 if v_1_0.AuxInt != o1 { 22976 break 22977 } 22978 p2 := v_1_0.Args[0] 22979 oldmem := v_1.Args[1] 22980 mem := v.Args[2] 22981 if mem.Op != OpStore { 22982 break 22983 } 22984 t3 := mem.Aux 22985 _ = mem.Args[2] 22986 mem_0 := mem.Args[0] 22987 if mem_0.Op != OpOffPtr { 22988 break 22989 } 22990 o3 := mem_0.AuxInt 22991 p3 := mem_0.Args[0] 22992 if oldmem != mem.Args[2] { 22993 break 22994 } 22995 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size())) { 22996 break 22997 } 22998 v.reset(OpCopy) 22999 v.Type = mem.Type 23000 v.AddArg(mem) 23001 return true 23002 } 23003 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ oldmem))) 23004 // 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()) 23005 // result: mem 23006 for { 23007 t1 := v.Aux 23008 _ = v.Args[2] 23009 v_0 := v.Args[0] 23010 if v_0.Op != OpOffPtr { 23011 break 23012 } 23013 o1 := v_0.AuxInt 23014 p1 := v_0.Args[0] 23015 v_1 := v.Args[1] 23016 if v_1.Op != OpLoad { 23017 break 23018 } 23019 t2 := v_1.Type 23020 _ = v_1.Args[1] 23021 v_1_0 := v_1.Args[0] 23022 if v_1_0.Op != OpOffPtr { 23023 break 23024 } 23025 if v_1_0.AuxInt != o1 { 23026 break 23027 } 23028 p2 := v_1_0.Args[0] 23029 oldmem := v_1.Args[1] 23030 mem := v.Args[2] 23031 if mem.Op != OpStore { 23032 break 23033 } 23034 t3 := mem.Aux 23035 _ = mem.Args[2] 23036 mem_0 := mem.Args[0] 23037 if mem_0.Op != OpOffPtr { 23038 break 23039 } 23040 o3 := mem_0.AuxInt 23041 p3 := mem_0.Args[0] 23042 mem_2 := mem.Args[2] 23043 if mem_2.Op != OpStore { 23044 break 23045 } 23046 t4 := mem_2.Aux 23047 _ = mem_2.Args[2] 23048 mem_2_0 := mem_2.Args[0] 23049 if mem_2_0.Op != OpOffPtr { 23050 break 23051 } 23052 o4 := mem_2_0.AuxInt 23053 p4 := mem_2_0.Args[0] 23054 if oldmem != mem_2.Args[2] { 23055 break 23056 } 23057 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())) { 23058 break 23059 } 23060 v.reset(OpCopy) 23061 v.Type = mem.Type 23062 v.AddArg(mem) 23063 return true 23064 } 23065 // 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)))) 23066 // 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()) 23067 // result: mem 23068 for { 23069 t1 := v.Aux 23070 _ = v.Args[2] 23071 v_0 := v.Args[0] 23072 if v_0.Op != OpOffPtr { 23073 break 23074 } 23075 o1 := v_0.AuxInt 23076 p1 := v_0.Args[0] 23077 v_1 := v.Args[1] 23078 if v_1.Op != OpLoad { 23079 break 23080 } 23081 t2 := v_1.Type 23082 _ = v_1.Args[1] 23083 v_1_0 := v_1.Args[0] 23084 if v_1_0.Op != OpOffPtr { 23085 break 23086 } 23087 if v_1_0.AuxInt != o1 { 23088 break 23089 } 23090 p2 := v_1_0.Args[0] 23091 oldmem := v_1.Args[1] 23092 mem := v.Args[2] 23093 if mem.Op != OpStore { 23094 break 23095 } 23096 t3 := mem.Aux 23097 _ = mem.Args[2] 23098 mem_0 := mem.Args[0] 23099 if mem_0.Op != OpOffPtr { 23100 break 23101 } 23102 o3 := mem_0.AuxInt 23103 p3 := mem_0.Args[0] 23104 mem_2 := mem.Args[2] 23105 if mem_2.Op != OpStore { 23106 break 23107 } 23108 t4 := mem_2.Aux 23109 _ = mem_2.Args[2] 23110 mem_2_0 := mem_2.Args[0] 23111 if mem_2_0.Op != OpOffPtr { 23112 break 23113 } 23114 o4 := mem_2_0.AuxInt 23115 p4 := mem_2_0.Args[0] 23116 mem_2_2 := mem_2.Args[2] 23117 if mem_2_2.Op != OpStore { 23118 break 23119 } 23120 t5 := mem_2_2.Aux 23121 _ = mem_2_2.Args[2] 23122 mem_2_2_0 := mem_2_2.Args[0] 23123 if mem_2_2_0.Op != OpOffPtr { 23124 break 23125 } 23126 o5 := mem_2_2_0.AuxInt 23127 p5 := mem_2_2_0.Args[0] 23128 if oldmem != mem_2_2.Args[2] { 23129 break 23130 } 23131 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())) { 23132 break 23133 } 23134 v.reset(OpCopy) 23135 v.Type = mem.Type 23136 v.AddArg(mem) 23137 return true 23138 } 23139 // match: (Store _ (StructMake0) mem) 23140 // cond: 23141 // result: mem 23142 for { 23143 _ = v.Args[2] 23144 v_1 := v.Args[1] 23145 if v_1.Op != OpStructMake0 { 23146 break 23147 } 23148 mem := v.Args[2] 23149 v.reset(OpCopy) 23150 v.Type = mem.Type 23151 v.AddArg(mem) 23152 return true 23153 } 23154 // match: (Store dst (StructMake1 <t> f0) mem) 23155 // cond: 23156 // result: (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem) 23157 for { 23158 _ = v.Args[2] 23159 dst := v.Args[0] 23160 v_1 := v.Args[1] 23161 if v_1.Op != OpStructMake1 { 23162 break 23163 } 23164 t := v_1.Type 23165 f0 := v_1.Args[0] 23166 mem := v.Args[2] 23167 v.reset(OpStore) 23168 v.Aux = t.FieldType(0) 23169 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 23170 v0.AuxInt = 0 23171 v0.AddArg(dst) 23172 v.AddArg(v0) 23173 v.AddArg(f0) 23174 v.AddArg(mem) 23175 return true 23176 } 23177 // match: (Store dst (StructMake2 <t> f0 f1) mem) 23178 // cond: 23179 // 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)) 23180 for { 23181 _ = v.Args[2] 23182 dst := v.Args[0] 23183 v_1 := v.Args[1] 23184 if v_1.Op != OpStructMake2 { 23185 break 23186 } 23187 t := v_1.Type 23188 _ = v_1.Args[1] 23189 f0 := v_1.Args[0] 23190 f1 := v_1.Args[1] 23191 mem := v.Args[2] 23192 v.reset(OpStore) 23193 v.Aux = t.FieldType(1) 23194 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 23195 v0.AuxInt = t.FieldOff(1) 23196 v0.AddArg(dst) 23197 v.AddArg(v0) 23198 v.AddArg(f1) 23199 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23200 v1.Aux = t.FieldType(0) 23201 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 23202 v2.AuxInt = 0 23203 v2.AddArg(dst) 23204 v1.AddArg(v2) 23205 v1.AddArg(f0) 23206 v1.AddArg(mem) 23207 v.AddArg(v1) 23208 return true 23209 } 23210 // match: (Store dst (StructMake3 <t> f0 f1 f2) mem) 23211 // cond: 23212 // 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))) 23213 for { 23214 _ = v.Args[2] 23215 dst := v.Args[0] 23216 v_1 := v.Args[1] 23217 if v_1.Op != OpStructMake3 { 23218 break 23219 } 23220 t := v_1.Type 23221 _ = v_1.Args[2] 23222 f0 := v_1.Args[0] 23223 f1 := v_1.Args[1] 23224 f2 := v_1.Args[2] 23225 mem := v.Args[2] 23226 v.reset(OpStore) 23227 v.Aux = t.FieldType(2) 23228 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 23229 v0.AuxInt = t.FieldOff(2) 23230 v0.AddArg(dst) 23231 v.AddArg(v0) 23232 v.AddArg(f2) 23233 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23234 v1.Aux = t.FieldType(1) 23235 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 23236 v2.AuxInt = t.FieldOff(1) 23237 v2.AddArg(dst) 23238 v1.AddArg(v2) 23239 v1.AddArg(f1) 23240 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23241 v3.Aux = t.FieldType(0) 23242 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 23243 v4.AuxInt = 0 23244 v4.AddArg(dst) 23245 v3.AddArg(v4) 23246 v3.AddArg(f0) 23247 v3.AddArg(mem) 23248 v1.AddArg(v3) 23249 v.AddArg(v1) 23250 return true 23251 } 23252 // match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem) 23253 // cond: 23254 // 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)))) 23255 for { 23256 _ = v.Args[2] 23257 dst := v.Args[0] 23258 v_1 := v.Args[1] 23259 if v_1.Op != OpStructMake4 { 23260 break 23261 } 23262 t := v_1.Type 23263 _ = v_1.Args[3] 23264 f0 := v_1.Args[0] 23265 f1 := v_1.Args[1] 23266 f2 := v_1.Args[2] 23267 f3 := v_1.Args[3] 23268 mem := v.Args[2] 23269 v.reset(OpStore) 23270 v.Aux = t.FieldType(3) 23271 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 23272 v0.AuxInt = t.FieldOff(3) 23273 v0.AddArg(dst) 23274 v.AddArg(v0) 23275 v.AddArg(f3) 23276 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23277 v1.Aux = t.FieldType(2) 23278 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 23279 v2.AuxInt = t.FieldOff(2) 23280 v2.AddArg(dst) 23281 v1.AddArg(v2) 23282 v1.AddArg(f2) 23283 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23284 v3.Aux = t.FieldType(1) 23285 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 23286 v4.AuxInt = t.FieldOff(1) 23287 v4.AddArg(dst) 23288 v3.AddArg(v4) 23289 v3.AddArg(f1) 23290 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 23291 v5.Aux = t.FieldType(0) 23292 v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 23293 v6.AuxInt = 0 23294 v6.AddArg(dst) 23295 v5.AddArg(v6) 23296 v5.AddArg(f0) 23297 v5.AddArg(mem) 23298 v3.AddArg(v5) 23299 v1.AddArg(v3) 23300 v.AddArg(v1) 23301 return true 23302 } 23303 // match: (Store {t} dst (Load src mem) mem) 23304 // cond: !fe.CanSSA(t.(*types.Type)) 23305 // result: (Move {t} [t.(*types.Type).Size()] dst src mem) 23306 for { 23307 t := v.Aux 23308 _ = v.Args[2] 23309 dst := v.Args[0] 23310 v_1 := v.Args[1] 23311 if v_1.Op != OpLoad { 23312 break 23313 } 23314 _ = v_1.Args[1] 23315 src := v_1.Args[0] 23316 mem := v_1.Args[1] 23317 if mem != v.Args[2] { 23318 break 23319 } 23320 if !(!fe.CanSSA(t.(*types.Type))) { 23321 break 23322 } 23323 v.reset(OpMove) 23324 v.AuxInt = t.(*types.Type).Size() 23325 v.Aux = t 23326 v.AddArg(dst) 23327 v.AddArg(src) 23328 v.AddArg(mem) 23329 return true 23330 } 23331 return false 23332 } 23333 func rewriteValuegeneric_OpStore_10(v *Value) bool { 23334 b := v.Block 23335 _ = b 23336 config := b.Func.Config 23337 _ = config 23338 fe := b.Func.fe 23339 _ = fe 23340 // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) 23341 // cond: !fe.CanSSA(t.(*types.Type)) 23342 // result: (Move {t} [t.(*types.Type).Size()] dst src (VarDef {x} mem)) 23343 for { 23344 t := v.Aux 23345 _ = v.Args[2] 23346 dst := v.Args[0] 23347 v_1 := v.Args[1] 23348 if v_1.Op != OpLoad { 23349 break 23350 } 23351 _ = v_1.Args[1] 23352 src := v_1.Args[0] 23353 mem := v_1.Args[1] 23354 v_2 := v.Args[2] 23355 if v_2.Op != OpVarDef { 23356 break 23357 } 23358 x := v_2.Aux 23359 if mem != v_2.Args[0] { 23360 break 23361 } 23362 if !(!fe.CanSSA(t.(*types.Type))) { 23363 break 23364 } 23365 v.reset(OpMove) 23366 v.AuxInt = t.(*types.Type).Size() 23367 v.Aux = t 23368 v.AddArg(dst) 23369 v.AddArg(src) 23370 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) 23371 v0.Aux = x 23372 v0.AddArg(mem) 23373 v.AddArg(v0) 23374 return true 23375 } 23376 // match: (Store _ (ArrayMake0) mem) 23377 // cond: 23378 // result: mem 23379 for { 23380 _ = v.Args[2] 23381 v_1 := v.Args[1] 23382 if v_1.Op != OpArrayMake0 { 23383 break 23384 } 23385 mem := v.Args[2] 23386 v.reset(OpCopy) 23387 v.Type = mem.Type 23388 v.AddArg(mem) 23389 return true 23390 } 23391 // match: (Store dst (ArrayMake1 e) mem) 23392 // cond: 23393 // result: (Store {e.Type} dst e mem) 23394 for { 23395 _ = v.Args[2] 23396 dst := v.Args[0] 23397 v_1 := v.Args[1] 23398 if v_1.Op != OpArrayMake1 { 23399 break 23400 } 23401 e := v_1.Args[0] 23402 mem := v.Args[2] 23403 v.reset(OpStore) 23404 v.Aux = e.Type 23405 v.AddArg(dst) 23406 v.AddArg(e) 23407 v.AddArg(mem) 23408 return true 23409 } 23410 // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) 23411 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 23412 // result: mem 23413 for { 23414 _ = v.Args[2] 23415 v_0 := v.Args[0] 23416 if v_0.Op != OpLoad { 23417 break 23418 } 23419 _ = v_0.Args[1] 23420 v_0_0 := v_0.Args[0] 23421 if v_0_0.Op != OpOffPtr { 23422 break 23423 } 23424 c := v_0_0.AuxInt 23425 v_0_0_0 := v_0_0.Args[0] 23426 if v_0_0_0.Op != OpSP { 23427 break 23428 } 23429 mem := v_0.Args[1] 23430 x := v.Args[1] 23431 if mem != v.Args[2] { 23432 break 23433 } 23434 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 23435 break 23436 } 23437 v.reset(OpCopy) 23438 v.Type = mem.Type 23439 v.AddArg(mem) 23440 return true 23441 } 23442 // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) 23443 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 23444 // result: mem 23445 for { 23446 _ = v.Args[2] 23447 v_0 := v.Args[0] 23448 if v_0.Op != OpOffPtr { 23449 break 23450 } 23451 v_0_0 := v_0.Args[0] 23452 if v_0_0.Op != OpLoad { 23453 break 23454 } 23455 _ = v_0_0.Args[1] 23456 v_0_0_0 := v_0_0.Args[0] 23457 if v_0_0_0.Op != OpOffPtr { 23458 break 23459 } 23460 c := v_0_0_0.AuxInt 23461 v_0_0_0_0 := v_0_0_0.Args[0] 23462 if v_0_0_0_0.Op != OpSP { 23463 break 23464 } 23465 mem := v_0_0.Args[1] 23466 x := v.Args[1] 23467 if mem != v.Args[2] { 23468 break 23469 } 23470 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 23471 break 23472 } 23473 v.reset(OpCopy) 23474 v.Type = mem.Type 23475 v.AddArg(mem) 23476 return true 23477 } 23478 return false 23479 } 23480 func rewriteValuegeneric_OpStringLen_0(v *Value) bool { 23481 // match: (StringLen (StringMake _ (Const64 <t> [c]))) 23482 // cond: 23483 // result: (Const64 <t> [c]) 23484 for { 23485 v_0 := v.Args[0] 23486 if v_0.Op != OpStringMake { 23487 break 23488 } 23489 _ = v_0.Args[1] 23490 v_0_1 := v_0.Args[1] 23491 if v_0_1.Op != OpConst64 { 23492 break 23493 } 23494 t := v_0_1.Type 23495 c := v_0_1.AuxInt 23496 v.reset(OpConst64) 23497 v.Type = t 23498 v.AuxInt = c 23499 return true 23500 } 23501 return false 23502 } 23503 func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { 23504 // match: (StringPtr (StringMake (Const64 <t> [c]) _)) 23505 // cond: 23506 // result: (Const64 <t> [c]) 23507 for { 23508 v_0 := v.Args[0] 23509 if v_0.Op != OpStringMake { 23510 break 23511 } 23512 _ = v_0.Args[1] 23513 v_0_0 := v_0.Args[0] 23514 if v_0_0.Op != OpConst64 { 23515 break 23516 } 23517 t := v_0_0.Type 23518 c := v_0_0.AuxInt 23519 v.reset(OpConst64) 23520 v.Type = t 23521 v.AuxInt = c 23522 return true 23523 } 23524 return false 23525 } 23526 func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { 23527 // match: (StructSelect (StructMake1 x)) 23528 // cond: 23529 // result: x 23530 for { 23531 v_0 := v.Args[0] 23532 if v_0.Op != OpStructMake1 { 23533 break 23534 } 23535 x := v_0.Args[0] 23536 v.reset(OpCopy) 23537 v.Type = x.Type 23538 v.AddArg(x) 23539 return true 23540 } 23541 // match: (StructSelect [0] (StructMake2 x _)) 23542 // cond: 23543 // result: x 23544 for { 23545 if v.AuxInt != 0 { 23546 break 23547 } 23548 v_0 := v.Args[0] 23549 if v_0.Op != OpStructMake2 { 23550 break 23551 } 23552 _ = v_0.Args[1] 23553 x := v_0.Args[0] 23554 v.reset(OpCopy) 23555 v.Type = x.Type 23556 v.AddArg(x) 23557 return true 23558 } 23559 // match: (StructSelect [1] (StructMake2 _ x)) 23560 // cond: 23561 // result: x 23562 for { 23563 if v.AuxInt != 1 { 23564 break 23565 } 23566 v_0 := v.Args[0] 23567 if v_0.Op != OpStructMake2 { 23568 break 23569 } 23570 _ = v_0.Args[1] 23571 x := v_0.Args[1] 23572 v.reset(OpCopy) 23573 v.Type = x.Type 23574 v.AddArg(x) 23575 return true 23576 } 23577 // match: (StructSelect [0] (StructMake3 x _ _)) 23578 // cond: 23579 // result: x 23580 for { 23581 if v.AuxInt != 0 { 23582 break 23583 } 23584 v_0 := v.Args[0] 23585 if v_0.Op != OpStructMake3 { 23586 break 23587 } 23588 _ = v_0.Args[2] 23589 x := v_0.Args[0] 23590 v.reset(OpCopy) 23591 v.Type = x.Type 23592 v.AddArg(x) 23593 return true 23594 } 23595 // match: (StructSelect [1] (StructMake3 _ x _)) 23596 // cond: 23597 // result: x 23598 for { 23599 if v.AuxInt != 1 { 23600 break 23601 } 23602 v_0 := v.Args[0] 23603 if v_0.Op != OpStructMake3 { 23604 break 23605 } 23606 _ = v_0.Args[2] 23607 x := v_0.Args[1] 23608 v.reset(OpCopy) 23609 v.Type = x.Type 23610 v.AddArg(x) 23611 return true 23612 } 23613 // match: (StructSelect [2] (StructMake3 _ _ x)) 23614 // cond: 23615 // result: x 23616 for { 23617 if v.AuxInt != 2 { 23618 break 23619 } 23620 v_0 := v.Args[0] 23621 if v_0.Op != OpStructMake3 { 23622 break 23623 } 23624 _ = v_0.Args[2] 23625 x := v_0.Args[2] 23626 v.reset(OpCopy) 23627 v.Type = x.Type 23628 v.AddArg(x) 23629 return true 23630 } 23631 // match: (StructSelect [0] (StructMake4 x _ _ _)) 23632 // cond: 23633 // result: x 23634 for { 23635 if v.AuxInt != 0 { 23636 break 23637 } 23638 v_0 := v.Args[0] 23639 if v_0.Op != OpStructMake4 { 23640 break 23641 } 23642 _ = v_0.Args[3] 23643 x := v_0.Args[0] 23644 v.reset(OpCopy) 23645 v.Type = x.Type 23646 v.AddArg(x) 23647 return true 23648 } 23649 // match: (StructSelect [1] (StructMake4 _ x _ _)) 23650 // cond: 23651 // result: x 23652 for { 23653 if v.AuxInt != 1 { 23654 break 23655 } 23656 v_0 := v.Args[0] 23657 if v_0.Op != OpStructMake4 { 23658 break 23659 } 23660 _ = v_0.Args[3] 23661 x := v_0.Args[1] 23662 v.reset(OpCopy) 23663 v.Type = x.Type 23664 v.AddArg(x) 23665 return true 23666 } 23667 // match: (StructSelect [2] (StructMake4 _ _ x _)) 23668 // cond: 23669 // result: x 23670 for { 23671 if v.AuxInt != 2 { 23672 break 23673 } 23674 v_0 := v.Args[0] 23675 if v_0.Op != OpStructMake4 { 23676 break 23677 } 23678 _ = v_0.Args[3] 23679 x := v_0.Args[2] 23680 v.reset(OpCopy) 23681 v.Type = x.Type 23682 v.AddArg(x) 23683 return true 23684 } 23685 // match: (StructSelect [3] (StructMake4 _ _ _ x)) 23686 // cond: 23687 // result: x 23688 for { 23689 if v.AuxInt != 3 { 23690 break 23691 } 23692 v_0 := v.Args[0] 23693 if v_0.Op != OpStructMake4 { 23694 break 23695 } 23696 _ = v_0.Args[3] 23697 x := v_0.Args[3] 23698 v.reset(OpCopy) 23699 v.Type = x.Type 23700 v.AddArg(x) 23701 return true 23702 } 23703 return false 23704 } 23705 func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { 23706 b := v.Block 23707 _ = b 23708 fe := b.Func.fe 23709 _ = fe 23710 // match: (StructSelect [i] x:(Load <t> ptr mem)) 23711 // cond: !fe.CanSSA(t) 23712 // result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem) 23713 for { 23714 i := v.AuxInt 23715 x := v.Args[0] 23716 if x.Op != OpLoad { 23717 break 23718 } 23719 t := x.Type 23720 _ = x.Args[1] 23721 ptr := x.Args[0] 23722 mem := x.Args[1] 23723 if !(!fe.CanSSA(t)) { 23724 break 23725 } 23726 b = x.Block 23727 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 23728 v.reset(OpCopy) 23729 v.AddArg(v0) 23730 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) 23731 v1.AuxInt = t.FieldOff(int(i)) 23732 v1.AddArg(ptr) 23733 v0.AddArg(v1) 23734 v0.AddArg(mem) 23735 return true 23736 } 23737 // match: (StructSelect [0] x:(IData _)) 23738 // cond: 23739 // result: x 23740 for { 23741 if v.AuxInt != 0 { 23742 break 23743 } 23744 x := v.Args[0] 23745 if x.Op != OpIData { 23746 break 23747 } 23748 v.reset(OpCopy) 23749 v.Type = x.Type 23750 v.AddArg(x) 23751 return true 23752 } 23753 return false 23754 } 23755 func rewriteValuegeneric_OpSub16_0(v *Value) bool { 23756 b := v.Block 23757 _ = b 23758 // match: (Sub16 (Const16 [c]) (Const16 [d])) 23759 // cond: 23760 // result: (Const16 [int64(int16(c-d))]) 23761 for { 23762 _ = v.Args[1] 23763 v_0 := v.Args[0] 23764 if v_0.Op != OpConst16 { 23765 break 23766 } 23767 c := v_0.AuxInt 23768 v_1 := v.Args[1] 23769 if v_1.Op != OpConst16 { 23770 break 23771 } 23772 d := v_1.AuxInt 23773 v.reset(OpConst16) 23774 v.AuxInt = int64(int16(c - d)) 23775 return true 23776 } 23777 // match: (Sub16 x (Const16 <t> [c])) 23778 // cond: x.Op != OpConst16 23779 // result: (Add16 (Const16 <t> [int64(int16(-c))]) x) 23780 for { 23781 _ = v.Args[1] 23782 x := v.Args[0] 23783 v_1 := v.Args[1] 23784 if v_1.Op != OpConst16 { 23785 break 23786 } 23787 t := v_1.Type 23788 c := v_1.AuxInt 23789 if !(x.Op != OpConst16) { 23790 break 23791 } 23792 v.reset(OpAdd16) 23793 v0 := b.NewValue0(v.Pos, OpConst16, t) 23794 v0.AuxInt = int64(int16(-c)) 23795 v.AddArg(v0) 23796 v.AddArg(x) 23797 return true 23798 } 23799 // match: (Sub16 x x) 23800 // cond: 23801 // result: (Const16 [0]) 23802 for { 23803 _ = v.Args[1] 23804 x := v.Args[0] 23805 if x != v.Args[1] { 23806 break 23807 } 23808 v.reset(OpConst16) 23809 v.AuxInt = 0 23810 return true 23811 } 23812 // match: (Sub16 (Add16 x y) x) 23813 // cond: 23814 // result: y 23815 for { 23816 _ = v.Args[1] 23817 v_0 := v.Args[0] 23818 if v_0.Op != OpAdd16 { 23819 break 23820 } 23821 _ = v_0.Args[1] 23822 x := v_0.Args[0] 23823 y := v_0.Args[1] 23824 if x != v.Args[1] { 23825 break 23826 } 23827 v.reset(OpCopy) 23828 v.Type = y.Type 23829 v.AddArg(y) 23830 return true 23831 } 23832 // match: (Sub16 (Add16 y x) x) 23833 // cond: 23834 // result: y 23835 for { 23836 _ = v.Args[1] 23837 v_0 := v.Args[0] 23838 if v_0.Op != OpAdd16 { 23839 break 23840 } 23841 _ = v_0.Args[1] 23842 y := v_0.Args[0] 23843 x := v_0.Args[1] 23844 if x != v.Args[1] { 23845 break 23846 } 23847 v.reset(OpCopy) 23848 v.Type = y.Type 23849 v.AddArg(y) 23850 return true 23851 } 23852 // match: (Sub16 (Add16 x y) y) 23853 // cond: 23854 // result: x 23855 for { 23856 _ = v.Args[1] 23857 v_0 := v.Args[0] 23858 if v_0.Op != OpAdd16 { 23859 break 23860 } 23861 _ = v_0.Args[1] 23862 x := v_0.Args[0] 23863 y := v_0.Args[1] 23864 if y != v.Args[1] { 23865 break 23866 } 23867 v.reset(OpCopy) 23868 v.Type = x.Type 23869 v.AddArg(x) 23870 return true 23871 } 23872 // match: (Sub16 (Add16 y x) y) 23873 // cond: 23874 // result: x 23875 for { 23876 _ = v.Args[1] 23877 v_0 := v.Args[0] 23878 if v_0.Op != OpAdd16 { 23879 break 23880 } 23881 _ = v_0.Args[1] 23882 y := v_0.Args[0] 23883 x := v_0.Args[1] 23884 if y != v.Args[1] { 23885 break 23886 } 23887 v.reset(OpCopy) 23888 v.Type = x.Type 23889 v.AddArg(x) 23890 return true 23891 } 23892 // match: (Sub16 x (Sub16 i:(Const16 <t>) z)) 23893 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 23894 // result: (Sub16 (Add16 <t> x z) i) 23895 for { 23896 _ = v.Args[1] 23897 x := v.Args[0] 23898 v_1 := v.Args[1] 23899 if v_1.Op != OpSub16 { 23900 break 23901 } 23902 _ = v_1.Args[1] 23903 i := v_1.Args[0] 23904 if i.Op != OpConst16 { 23905 break 23906 } 23907 t := i.Type 23908 z := v_1.Args[1] 23909 if !(z.Op != OpConst16 && x.Op != OpConst16) { 23910 break 23911 } 23912 v.reset(OpSub16) 23913 v0 := b.NewValue0(v.Pos, OpAdd16, t) 23914 v0.AddArg(x) 23915 v0.AddArg(z) 23916 v.AddArg(v0) 23917 v.AddArg(i) 23918 return true 23919 } 23920 // match: (Sub16 x (Sub16 z i:(Const16 <t>))) 23921 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 23922 // result: (Add16 i (Sub16 <t> x z)) 23923 for { 23924 _ = v.Args[1] 23925 x := v.Args[0] 23926 v_1 := v.Args[1] 23927 if v_1.Op != OpSub16 { 23928 break 23929 } 23930 _ = v_1.Args[1] 23931 z := v_1.Args[0] 23932 i := v_1.Args[1] 23933 if i.Op != OpConst16 { 23934 break 23935 } 23936 t := i.Type 23937 if !(z.Op != OpConst16 && x.Op != OpConst16) { 23938 break 23939 } 23940 v.reset(OpAdd16) 23941 v.AddArg(i) 23942 v0 := b.NewValue0(v.Pos, OpSub16, t) 23943 v0.AddArg(x) 23944 v0.AddArg(z) 23945 v.AddArg(v0) 23946 return true 23947 } 23948 // match: (Sub16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 23949 // cond: 23950 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 23951 for { 23952 _ = v.Args[1] 23953 v_0 := v.Args[0] 23954 if v_0.Op != OpConst16 { 23955 break 23956 } 23957 t := v_0.Type 23958 c := v_0.AuxInt 23959 v_1 := v.Args[1] 23960 if v_1.Op != OpSub16 { 23961 break 23962 } 23963 _ = v_1.Args[1] 23964 x := v_1.Args[0] 23965 v_1_1 := v_1.Args[1] 23966 if v_1_1.Op != OpConst16 { 23967 break 23968 } 23969 if v_1_1.Type != t { 23970 break 23971 } 23972 d := v_1_1.AuxInt 23973 v.reset(OpSub16) 23974 v0 := b.NewValue0(v.Pos, OpConst16, t) 23975 v0.AuxInt = int64(int16(c + d)) 23976 v.AddArg(v0) 23977 v.AddArg(x) 23978 return true 23979 } 23980 return false 23981 } 23982 func rewriteValuegeneric_OpSub16_10(v *Value) bool { 23983 b := v.Block 23984 _ = b 23985 // match: (Sub16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 23986 // cond: 23987 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 23988 for { 23989 _ = v.Args[1] 23990 v_0 := v.Args[0] 23991 if v_0.Op != OpConst16 { 23992 break 23993 } 23994 t := v_0.Type 23995 c := v_0.AuxInt 23996 v_1 := v.Args[1] 23997 if v_1.Op != OpSub16 { 23998 break 23999 } 24000 _ = v_1.Args[1] 24001 v_1_0 := v_1.Args[0] 24002 if v_1_0.Op != OpConst16 { 24003 break 24004 } 24005 if v_1_0.Type != t { 24006 break 24007 } 24008 d := v_1_0.AuxInt 24009 x := v_1.Args[1] 24010 v.reset(OpAdd16) 24011 v0 := b.NewValue0(v.Pos, OpConst16, t) 24012 v0.AuxInt = int64(int16(c - d)) 24013 v.AddArg(v0) 24014 v.AddArg(x) 24015 return true 24016 } 24017 return false 24018 } 24019 func rewriteValuegeneric_OpSub32_0(v *Value) bool { 24020 b := v.Block 24021 _ = b 24022 // match: (Sub32 (Const32 [c]) (Const32 [d])) 24023 // cond: 24024 // result: (Const32 [int64(int32(c-d))]) 24025 for { 24026 _ = v.Args[1] 24027 v_0 := v.Args[0] 24028 if v_0.Op != OpConst32 { 24029 break 24030 } 24031 c := v_0.AuxInt 24032 v_1 := v.Args[1] 24033 if v_1.Op != OpConst32 { 24034 break 24035 } 24036 d := v_1.AuxInt 24037 v.reset(OpConst32) 24038 v.AuxInt = int64(int32(c - d)) 24039 return true 24040 } 24041 // match: (Sub32 x (Const32 <t> [c])) 24042 // cond: x.Op != OpConst32 24043 // result: (Add32 (Const32 <t> [int64(int32(-c))]) x) 24044 for { 24045 _ = v.Args[1] 24046 x := v.Args[0] 24047 v_1 := v.Args[1] 24048 if v_1.Op != OpConst32 { 24049 break 24050 } 24051 t := v_1.Type 24052 c := v_1.AuxInt 24053 if !(x.Op != OpConst32) { 24054 break 24055 } 24056 v.reset(OpAdd32) 24057 v0 := b.NewValue0(v.Pos, OpConst32, t) 24058 v0.AuxInt = int64(int32(-c)) 24059 v.AddArg(v0) 24060 v.AddArg(x) 24061 return true 24062 } 24063 // match: (Sub32 x x) 24064 // cond: 24065 // result: (Const32 [0]) 24066 for { 24067 _ = v.Args[1] 24068 x := v.Args[0] 24069 if x != v.Args[1] { 24070 break 24071 } 24072 v.reset(OpConst32) 24073 v.AuxInt = 0 24074 return true 24075 } 24076 // match: (Sub32 (Add32 x y) x) 24077 // cond: 24078 // result: y 24079 for { 24080 _ = v.Args[1] 24081 v_0 := v.Args[0] 24082 if v_0.Op != OpAdd32 { 24083 break 24084 } 24085 _ = v_0.Args[1] 24086 x := v_0.Args[0] 24087 y := v_0.Args[1] 24088 if x != v.Args[1] { 24089 break 24090 } 24091 v.reset(OpCopy) 24092 v.Type = y.Type 24093 v.AddArg(y) 24094 return true 24095 } 24096 // match: (Sub32 (Add32 y x) x) 24097 // cond: 24098 // result: y 24099 for { 24100 _ = v.Args[1] 24101 v_0 := v.Args[0] 24102 if v_0.Op != OpAdd32 { 24103 break 24104 } 24105 _ = v_0.Args[1] 24106 y := v_0.Args[0] 24107 x := v_0.Args[1] 24108 if x != v.Args[1] { 24109 break 24110 } 24111 v.reset(OpCopy) 24112 v.Type = y.Type 24113 v.AddArg(y) 24114 return true 24115 } 24116 // match: (Sub32 (Add32 x y) y) 24117 // cond: 24118 // result: x 24119 for { 24120 _ = v.Args[1] 24121 v_0 := v.Args[0] 24122 if v_0.Op != OpAdd32 { 24123 break 24124 } 24125 _ = v_0.Args[1] 24126 x := v_0.Args[0] 24127 y := v_0.Args[1] 24128 if y != v.Args[1] { 24129 break 24130 } 24131 v.reset(OpCopy) 24132 v.Type = x.Type 24133 v.AddArg(x) 24134 return true 24135 } 24136 // match: (Sub32 (Add32 y x) y) 24137 // cond: 24138 // result: x 24139 for { 24140 _ = v.Args[1] 24141 v_0 := v.Args[0] 24142 if v_0.Op != OpAdd32 { 24143 break 24144 } 24145 _ = v_0.Args[1] 24146 y := v_0.Args[0] 24147 x := v_0.Args[1] 24148 if y != v.Args[1] { 24149 break 24150 } 24151 v.reset(OpCopy) 24152 v.Type = x.Type 24153 v.AddArg(x) 24154 return true 24155 } 24156 // match: (Sub32 x (Sub32 i:(Const32 <t>) z)) 24157 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24158 // result: (Sub32 (Add32 <t> x z) i) 24159 for { 24160 _ = v.Args[1] 24161 x := v.Args[0] 24162 v_1 := v.Args[1] 24163 if v_1.Op != OpSub32 { 24164 break 24165 } 24166 _ = v_1.Args[1] 24167 i := v_1.Args[0] 24168 if i.Op != OpConst32 { 24169 break 24170 } 24171 t := i.Type 24172 z := v_1.Args[1] 24173 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24174 break 24175 } 24176 v.reset(OpSub32) 24177 v0 := b.NewValue0(v.Pos, OpAdd32, t) 24178 v0.AddArg(x) 24179 v0.AddArg(z) 24180 v.AddArg(v0) 24181 v.AddArg(i) 24182 return true 24183 } 24184 // match: (Sub32 x (Sub32 z i:(Const32 <t>))) 24185 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 24186 // result: (Add32 i (Sub32 <t> x z)) 24187 for { 24188 _ = v.Args[1] 24189 x := v.Args[0] 24190 v_1 := v.Args[1] 24191 if v_1.Op != OpSub32 { 24192 break 24193 } 24194 _ = v_1.Args[1] 24195 z := v_1.Args[0] 24196 i := v_1.Args[1] 24197 if i.Op != OpConst32 { 24198 break 24199 } 24200 t := i.Type 24201 if !(z.Op != OpConst32 && x.Op != OpConst32) { 24202 break 24203 } 24204 v.reset(OpAdd32) 24205 v.AddArg(i) 24206 v0 := b.NewValue0(v.Pos, OpSub32, t) 24207 v0.AddArg(x) 24208 v0.AddArg(z) 24209 v.AddArg(v0) 24210 return true 24211 } 24212 // match: (Sub32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 24213 // cond: 24214 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 24215 for { 24216 _ = v.Args[1] 24217 v_0 := v.Args[0] 24218 if v_0.Op != OpConst32 { 24219 break 24220 } 24221 t := v_0.Type 24222 c := v_0.AuxInt 24223 v_1 := v.Args[1] 24224 if v_1.Op != OpSub32 { 24225 break 24226 } 24227 _ = v_1.Args[1] 24228 x := v_1.Args[0] 24229 v_1_1 := v_1.Args[1] 24230 if v_1_1.Op != OpConst32 { 24231 break 24232 } 24233 if v_1_1.Type != t { 24234 break 24235 } 24236 d := v_1_1.AuxInt 24237 v.reset(OpSub32) 24238 v0 := b.NewValue0(v.Pos, OpConst32, t) 24239 v0.AuxInt = int64(int32(c + d)) 24240 v.AddArg(v0) 24241 v.AddArg(x) 24242 return true 24243 } 24244 return false 24245 } 24246 func rewriteValuegeneric_OpSub32_10(v *Value) bool { 24247 b := v.Block 24248 _ = b 24249 // match: (Sub32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 24250 // cond: 24251 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 24252 for { 24253 _ = v.Args[1] 24254 v_0 := v.Args[0] 24255 if v_0.Op != OpConst32 { 24256 break 24257 } 24258 t := v_0.Type 24259 c := v_0.AuxInt 24260 v_1 := v.Args[1] 24261 if v_1.Op != OpSub32 { 24262 break 24263 } 24264 _ = v_1.Args[1] 24265 v_1_0 := v_1.Args[0] 24266 if v_1_0.Op != OpConst32 { 24267 break 24268 } 24269 if v_1_0.Type != t { 24270 break 24271 } 24272 d := v_1_0.AuxInt 24273 x := v_1.Args[1] 24274 v.reset(OpAdd32) 24275 v0 := b.NewValue0(v.Pos, OpConst32, t) 24276 v0.AuxInt = int64(int32(c - d)) 24277 v.AddArg(v0) 24278 v.AddArg(x) 24279 return true 24280 } 24281 return false 24282 } 24283 func rewriteValuegeneric_OpSub32F_0(v *Value) bool { 24284 // match: (Sub32F (Const32F [c]) (Const32F [d])) 24285 // cond: 24286 // result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))]) 24287 for { 24288 _ = v.Args[1] 24289 v_0 := v.Args[0] 24290 if v_0.Op != OpConst32F { 24291 break 24292 } 24293 c := v_0.AuxInt 24294 v_1 := v.Args[1] 24295 if v_1.Op != OpConst32F { 24296 break 24297 } 24298 d := v_1.AuxInt 24299 v.reset(OpConst32F) 24300 v.AuxInt = f2i(float64(i2f32(c) - i2f32(d))) 24301 return true 24302 } 24303 // match: (Sub32F x (Const32F [0])) 24304 // cond: 24305 // result: x 24306 for { 24307 _ = v.Args[1] 24308 x := v.Args[0] 24309 v_1 := v.Args[1] 24310 if v_1.Op != OpConst32F { 24311 break 24312 } 24313 if v_1.AuxInt != 0 { 24314 break 24315 } 24316 v.reset(OpCopy) 24317 v.Type = x.Type 24318 v.AddArg(x) 24319 return true 24320 } 24321 return false 24322 } 24323 func rewriteValuegeneric_OpSub64_0(v *Value) bool { 24324 b := v.Block 24325 _ = b 24326 // match: (Sub64 (Const64 [c]) (Const64 [d])) 24327 // cond: 24328 // result: (Const64 [c-d]) 24329 for { 24330 _ = v.Args[1] 24331 v_0 := v.Args[0] 24332 if v_0.Op != OpConst64 { 24333 break 24334 } 24335 c := v_0.AuxInt 24336 v_1 := v.Args[1] 24337 if v_1.Op != OpConst64 { 24338 break 24339 } 24340 d := v_1.AuxInt 24341 v.reset(OpConst64) 24342 v.AuxInt = c - d 24343 return true 24344 } 24345 // match: (Sub64 x (Const64 <t> [c])) 24346 // cond: x.Op != OpConst64 24347 // result: (Add64 (Const64 <t> [-c]) x) 24348 for { 24349 _ = v.Args[1] 24350 x := v.Args[0] 24351 v_1 := v.Args[1] 24352 if v_1.Op != OpConst64 { 24353 break 24354 } 24355 t := v_1.Type 24356 c := v_1.AuxInt 24357 if !(x.Op != OpConst64) { 24358 break 24359 } 24360 v.reset(OpAdd64) 24361 v0 := b.NewValue0(v.Pos, OpConst64, t) 24362 v0.AuxInt = -c 24363 v.AddArg(v0) 24364 v.AddArg(x) 24365 return true 24366 } 24367 // match: (Sub64 x x) 24368 // cond: 24369 // result: (Const64 [0]) 24370 for { 24371 _ = v.Args[1] 24372 x := v.Args[0] 24373 if x != v.Args[1] { 24374 break 24375 } 24376 v.reset(OpConst64) 24377 v.AuxInt = 0 24378 return true 24379 } 24380 // match: (Sub64 (Add64 x y) x) 24381 // cond: 24382 // result: y 24383 for { 24384 _ = v.Args[1] 24385 v_0 := v.Args[0] 24386 if v_0.Op != OpAdd64 { 24387 break 24388 } 24389 _ = v_0.Args[1] 24390 x := v_0.Args[0] 24391 y := v_0.Args[1] 24392 if x != v.Args[1] { 24393 break 24394 } 24395 v.reset(OpCopy) 24396 v.Type = y.Type 24397 v.AddArg(y) 24398 return true 24399 } 24400 // match: (Sub64 (Add64 y x) x) 24401 // cond: 24402 // result: y 24403 for { 24404 _ = v.Args[1] 24405 v_0 := v.Args[0] 24406 if v_0.Op != OpAdd64 { 24407 break 24408 } 24409 _ = v_0.Args[1] 24410 y := v_0.Args[0] 24411 x := v_0.Args[1] 24412 if x != v.Args[1] { 24413 break 24414 } 24415 v.reset(OpCopy) 24416 v.Type = y.Type 24417 v.AddArg(y) 24418 return true 24419 } 24420 // match: (Sub64 (Add64 x y) y) 24421 // cond: 24422 // result: x 24423 for { 24424 _ = v.Args[1] 24425 v_0 := v.Args[0] 24426 if v_0.Op != OpAdd64 { 24427 break 24428 } 24429 _ = v_0.Args[1] 24430 x := v_0.Args[0] 24431 y := v_0.Args[1] 24432 if y != v.Args[1] { 24433 break 24434 } 24435 v.reset(OpCopy) 24436 v.Type = x.Type 24437 v.AddArg(x) 24438 return true 24439 } 24440 // match: (Sub64 (Add64 y x) y) 24441 // cond: 24442 // result: x 24443 for { 24444 _ = v.Args[1] 24445 v_0 := v.Args[0] 24446 if v_0.Op != OpAdd64 { 24447 break 24448 } 24449 _ = v_0.Args[1] 24450 y := v_0.Args[0] 24451 x := v_0.Args[1] 24452 if y != v.Args[1] { 24453 break 24454 } 24455 v.reset(OpCopy) 24456 v.Type = x.Type 24457 v.AddArg(x) 24458 return true 24459 } 24460 // match: (Sub64 x (Sub64 i:(Const64 <t>) z)) 24461 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 24462 // result: (Sub64 (Add64 <t> x z) i) 24463 for { 24464 _ = v.Args[1] 24465 x := v.Args[0] 24466 v_1 := v.Args[1] 24467 if v_1.Op != OpSub64 { 24468 break 24469 } 24470 _ = v_1.Args[1] 24471 i := v_1.Args[0] 24472 if i.Op != OpConst64 { 24473 break 24474 } 24475 t := i.Type 24476 z := v_1.Args[1] 24477 if !(z.Op != OpConst64 && x.Op != OpConst64) { 24478 break 24479 } 24480 v.reset(OpSub64) 24481 v0 := b.NewValue0(v.Pos, OpAdd64, t) 24482 v0.AddArg(x) 24483 v0.AddArg(z) 24484 v.AddArg(v0) 24485 v.AddArg(i) 24486 return true 24487 } 24488 // match: (Sub64 x (Sub64 z i:(Const64 <t>))) 24489 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 24490 // result: (Add64 i (Sub64 <t> x z)) 24491 for { 24492 _ = v.Args[1] 24493 x := v.Args[0] 24494 v_1 := v.Args[1] 24495 if v_1.Op != OpSub64 { 24496 break 24497 } 24498 _ = v_1.Args[1] 24499 z := v_1.Args[0] 24500 i := v_1.Args[1] 24501 if i.Op != OpConst64 { 24502 break 24503 } 24504 t := i.Type 24505 if !(z.Op != OpConst64 && x.Op != OpConst64) { 24506 break 24507 } 24508 v.reset(OpAdd64) 24509 v.AddArg(i) 24510 v0 := b.NewValue0(v.Pos, OpSub64, t) 24511 v0.AddArg(x) 24512 v0.AddArg(z) 24513 v.AddArg(v0) 24514 return true 24515 } 24516 // match: (Sub64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 24517 // cond: 24518 // result: (Sub64 (Const64 <t> [c+d]) x) 24519 for { 24520 _ = v.Args[1] 24521 v_0 := v.Args[0] 24522 if v_0.Op != OpConst64 { 24523 break 24524 } 24525 t := v_0.Type 24526 c := v_0.AuxInt 24527 v_1 := v.Args[1] 24528 if v_1.Op != OpSub64 { 24529 break 24530 } 24531 _ = v_1.Args[1] 24532 x := v_1.Args[0] 24533 v_1_1 := v_1.Args[1] 24534 if v_1_1.Op != OpConst64 { 24535 break 24536 } 24537 if v_1_1.Type != t { 24538 break 24539 } 24540 d := v_1_1.AuxInt 24541 v.reset(OpSub64) 24542 v0 := b.NewValue0(v.Pos, OpConst64, t) 24543 v0.AuxInt = c + d 24544 v.AddArg(v0) 24545 v.AddArg(x) 24546 return true 24547 } 24548 return false 24549 } 24550 func rewriteValuegeneric_OpSub64_10(v *Value) bool { 24551 b := v.Block 24552 _ = b 24553 // match: (Sub64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 24554 // cond: 24555 // result: (Add64 (Const64 <t> [c-d]) x) 24556 for { 24557 _ = v.Args[1] 24558 v_0 := v.Args[0] 24559 if v_0.Op != OpConst64 { 24560 break 24561 } 24562 t := v_0.Type 24563 c := v_0.AuxInt 24564 v_1 := v.Args[1] 24565 if v_1.Op != OpSub64 { 24566 break 24567 } 24568 _ = v_1.Args[1] 24569 v_1_0 := v_1.Args[0] 24570 if v_1_0.Op != OpConst64 { 24571 break 24572 } 24573 if v_1_0.Type != t { 24574 break 24575 } 24576 d := v_1_0.AuxInt 24577 x := v_1.Args[1] 24578 v.reset(OpAdd64) 24579 v0 := b.NewValue0(v.Pos, OpConst64, t) 24580 v0.AuxInt = c - d 24581 v.AddArg(v0) 24582 v.AddArg(x) 24583 return true 24584 } 24585 return false 24586 } 24587 func rewriteValuegeneric_OpSub64F_0(v *Value) bool { 24588 // match: (Sub64F (Const64F [c]) (Const64F [d])) 24589 // cond: 24590 // result: (Const64F [f2i(i2f(c) - i2f(d))]) 24591 for { 24592 _ = v.Args[1] 24593 v_0 := v.Args[0] 24594 if v_0.Op != OpConst64F { 24595 break 24596 } 24597 c := v_0.AuxInt 24598 v_1 := v.Args[1] 24599 if v_1.Op != OpConst64F { 24600 break 24601 } 24602 d := v_1.AuxInt 24603 v.reset(OpConst64F) 24604 v.AuxInt = f2i(i2f(c) - i2f(d)) 24605 return true 24606 } 24607 // match: (Sub64F x (Const64F [0])) 24608 // cond: 24609 // result: x 24610 for { 24611 _ = v.Args[1] 24612 x := v.Args[0] 24613 v_1 := v.Args[1] 24614 if v_1.Op != OpConst64F { 24615 break 24616 } 24617 if v_1.AuxInt != 0 { 24618 break 24619 } 24620 v.reset(OpCopy) 24621 v.Type = x.Type 24622 v.AddArg(x) 24623 return true 24624 } 24625 return false 24626 } 24627 func rewriteValuegeneric_OpSub8_0(v *Value) bool { 24628 b := v.Block 24629 _ = b 24630 // match: (Sub8 (Const8 [c]) (Const8 [d])) 24631 // cond: 24632 // result: (Const8 [int64(int8(c-d))]) 24633 for { 24634 _ = v.Args[1] 24635 v_0 := v.Args[0] 24636 if v_0.Op != OpConst8 { 24637 break 24638 } 24639 c := v_0.AuxInt 24640 v_1 := v.Args[1] 24641 if v_1.Op != OpConst8 { 24642 break 24643 } 24644 d := v_1.AuxInt 24645 v.reset(OpConst8) 24646 v.AuxInt = int64(int8(c - d)) 24647 return true 24648 } 24649 // match: (Sub8 x (Const8 <t> [c])) 24650 // cond: x.Op != OpConst8 24651 // result: (Add8 (Const8 <t> [int64(int8(-c))]) x) 24652 for { 24653 _ = v.Args[1] 24654 x := v.Args[0] 24655 v_1 := v.Args[1] 24656 if v_1.Op != OpConst8 { 24657 break 24658 } 24659 t := v_1.Type 24660 c := v_1.AuxInt 24661 if !(x.Op != OpConst8) { 24662 break 24663 } 24664 v.reset(OpAdd8) 24665 v0 := b.NewValue0(v.Pos, OpConst8, t) 24666 v0.AuxInt = int64(int8(-c)) 24667 v.AddArg(v0) 24668 v.AddArg(x) 24669 return true 24670 } 24671 // match: (Sub8 x x) 24672 // cond: 24673 // result: (Const8 [0]) 24674 for { 24675 _ = v.Args[1] 24676 x := v.Args[0] 24677 if x != v.Args[1] { 24678 break 24679 } 24680 v.reset(OpConst8) 24681 v.AuxInt = 0 24682 return true 24683 } 24684 // match: (Sub8 (Add8 x y) x) 24685 // cond: 24686 // result: y 24687 for { 24688 _ = v.Args[1] 24689 v_0 := v.Args[0] 24690 if v_0.Op != OpAdd8 { 24691 break 24692 } 24693 _ = v_0.Args[1] 24694 x := v_0.Args[0] 24695 y := v_0.Args[1] 24696 if x != v.Args[1] { 24697 break 24698 } 24699 v.reset(OpCopy) 24700 v.Type = y.Type 24701 v.AddArg(y) 24702 return true 24703 } 24704 // match: (Sub8 (Add8 y x) x) 24705 // cond: 24706 // result: y 24707 for { 24708 _ = v.Args[1] 24709 v_0 := v.Args[0] 24710 if v_0.Op != OpAdd8 { 24711 break 24712 } 24713 _ = v_0.Args[1] 24714 y := v_0.Args[0] 24715 x := v_0.Args[1] 24716 if x != v.Args[1] { 24717 break 24718 } 24719 v.reset(OpCopy) 24720 v.Type = y.Type 24721 v.AddArg(y) 24722 return true 24723 } 24724 // match: (Sub8 (Add8 x y) y) 24725 // cond: 24726 // result: x 24727 for { 24728 _ = v.Args[1] 24729 v_0 := v.Args[0] 24730 if v_0.Op != OpAdd8 { 24731 break 24732 } 24733 _ = v_0.Args[1] 24734 x := v_0.Args[0] 24735 y := v_0.Args[1] 24736 if y != v.Args[1] { 24737 break 24738 } 24739 v.reset(OpCopy) 24740 v.Type = x.Type 24741 v.AddArg(x) 24742 return true 24743 } 24744 // match: (Sub8 (Add8 y x) y) 24745 // cond: 24746 // result: x 24747 for { 24748 _ = v.Args[1] 24749 v_0 := v.Args[0] 24750 if v_0.Op != OpAdd8 { 24751 break 24752 } 24753 _ = v_0.Args[1] 24754 y := v_0.Args[0] 24755 x := v_0.Args[1] 24756 if y != v.Args[1] { 24757 break 24758 } 24759 v.reset(OpCopy) 24760 v.Type = x.Type 24761 v.AddArg(x) 24762 return true 24763 } 24764 // match: (Sub8 x (Sub8 i:(Const8 <t>) z)) 24765 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 24766 // result: (Sub8 (Add8 <t> x z) i) 24767 for { 24768 _ = v.Args[1] 24769 x := v.Args[0] 24770 v_1 := v.Args[1] 24771 if v_1.Op != OpSub8 { 24772 break 24773 } 24774 _ = v_1.Args[1] 24775 i := v_1.Args[0] 24776 if i.Op != OpConst8 { 24777 break 24778 } 24779 t := i.Type 24780 z := v_1.Args[1] 24781 if !(z.Op != OpConst8 && x.Op != OpConst8) { 24782 break 24783 } 24784 v.reset(OpSub8) 24785 v0 := b.NewValue0(v.Pos, OpAdd8, t) 24786 v0.AddArg(x) 24787 v0.AddArg(z) 24788 v.AddArg(v0) 24789 v.AddArg(i) 24790 return true 24791 } 24792 // match: (Sub8 x (Sub8 z i:(Const8 <t>))) 24793 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 24794 // result: (Add8 i (Sub8 <t> x z)) 24795 for { 24796 _ = v.Args[1] 24797 x := v.Args[0] 24798 v_1 := v.Args[1] 24799 if v_1.Op != OpSub8 { 24800 break 24801 } 24802 _ = v_1.Args[1] 24803 z := v_1.Args[0] 24804 i := v_1.Args[1] 24805 if i.Op != OpConst8 { 24806 break 24807 } 24808 t := i.Type 24809 if !(z.Op != OpConst8 && x.Op != OpConst8) { 24810 break 24811 } 24812 v.reset(OpAdd8) 24813 v.AddArg(i) 24814 v0 := b.NewValue0(v.Pos, OpSub8, t) 24815 v0.AddArg(x) 24816 v0.AddArg(z) 24817 v.AddArg(v0) 24818 return true 24819 } 24820 // match: (Sub8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 24821 // cond: 24822 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 24823 for { 24824 _ = v.Args[1] 24825 v_0 := v.Args[0] 24826 if v_0.Op != OpConst8 { 24827 break 24828 } 24829 t := v_0.Type 24830 c := v_0.AuxInt 24831 v_1 := v.Args[1] 24832 if v_1.Op != OpSub8 { 24833 break 24834 } 24835 _ = v_1.Args[1] 24836 x := v_1.Args[0] 24837 v_1_1 := v_1.Args[1] 24838 if v_1_1.Op != OpConst8 { 24839 break 24840 } 24841 if v_1_1.Type != t { 24842 break 24843 } 24844 d := v_1_1.AuxInt 24845 v.reset(OpSub8) 24846 v0 := b.NewValue0(v.Pos, OpConst8, t) 24847 v0.AuxInt = int64(int8(c + d)) 24848 v.AddArg(v0) 24849 v.AddArg(x) 24850 return true 24851 } 24852 return false 24853 } 24854 func rewriteValuegeneric_OpSub8_10(v *Value) bool { 24855 b := v.Block 24856 _ = b 24857 // match: (Sub8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 24858 // cond: 24859 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 24860 for { 24861 _ = v.Args[1] 24862 v_0 := v.Args[0] 24863 if v_0.Op != OpConst8 { 24864 break 24865 } 24866 t := v_0.Type 24867 c := v_0.AuxInt 24868 v_1 := v.Args[1] 24869 if v_1.Op != OpSub8 { 24870 break 24871 } 24872 _ = v_1.Args[1] 24873 v_1_0 := v_1.Args[0] 24874 if v_1_0.Op != OpConst8 { 24875 break 24876 } 24877 if v_1_0.Type != t { 24878 break 24879 } 24880 d := v_1_0.AuxInt 24881 x := v_1.Args[1] 24882 v.reset(OpAdd8) 24883 v0 := b.NewValue0(v.Pos, OpConst8, t) 24884 v0.AuxInt = int64(int8(c - d)) 24885 v.AddArg(v0) 24886 v.AddArg(x) 24887 return true 24888 } 24889 return false 24890 } 24891 func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { 24892 // match: (Trunc16to8 (Const16 [c])) 24893 // cond: 24894 // result: (Const8 [int64(int8(c))]) 24895 for { 24896 v_0 := v.Args[0] 24897 if v_0.Op != OpConst16 { 24898 break 24899 } 24900 c := v_0.AuxInt 24901 v.reset(OpConst8) 24902 v.AuxInt = int64(int8(c)) 24903 return true 24904 } 24905 // match: (Trunc16to8 (ZeroExt8to16 x)) 24906 // cond: 24907 // result: x 24908 for { 24909 v_0 := v.Args[0] 24910 if v_0.Op != OpZeroExt8to16 { 24911 break 24912 } 24913 x := v_0.Args[0] 24914 v.reset(OpCopy) 24915 v.Type = x.Type 24916 v.AddArg(x) 24917 return true 24918 } 24919 // match: (Trunc16to8 (SignExt8to16 x)) 24920 // cond: 24921 // result: x 24922 for { 24923 v_0 := v.Args[0] 24924 if v_0.Op != OpSignExt8to16 { 24925 break 24926 } 24927 x := v_0.Args[0] 24928 v.reset(OpCopy) 24929 v.Type = x.Type 24930 v.AddArg(x) 24931 return true 24932 } 24933 // match: (Trunc16to8 (And16 (Const16 [y]) x)) 24934 // cond: y&0xFF == 0xFF 24935 // result: (Trunc16to8 x) 24936 for { 24937 v_0 := v.Args[0] 24938 if v_0.Op != OpAnd16 { 24939 break 24940 } 24941 _ = v_0.Args[1] 24942 v_0_0 := v_0.Args[0] 24943 if v_0_0.Op != OpConst16 { 24944 break 24945 } 24946 y := v_0_0.AuxInt 24947 x := v_0.Args[1] 24948 if !(y&0xFF == 0xFF) { 24949 break 24950 } 24951 v.reset(OpTrunc16to8) 24952 v.AddArg(x) 24953 return true 24954 } 24955 // match: (Trunc16to8 (And16 x (Const16 [y]))) 24956 // cond: y&0xFF == 0xFF 24957 // result: (Trunc16to8 x) 24958 for { 24959 v_0 := v.Args[0] 24960 if v_0.Op != OpAnd16 { 24961 break 24962 } 24963 _ = v_0.Args[1] 24964 x := v_0.Args[0] 24965 v_0_1 := v_0.Args[1] 24966 if v_0_1.Op != OpConst16 { 24967 break 24968 } 24969 y := v_0_1.AuxInt 24970 if !(y&0xFF == 0xFF) { 24971 break 24972 } 24973 v.reset(OpTrunc16to8) 24974 v.AddArg(x) 24975 return true 24976 } 24977 return false 24978 } 24979 func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { 24980 // match: (Trunc32to16 (Const32 [c])) 24981 // cond: 24982 // result: (Const16 [int64(int16(c))]) 24983 for { 24984 v_0 := v.Args[0] 24985 if v_0.Op != OpConst32 { 24986 break 24987 } 24988 c := v_0.AuxInt 24989 v.reset(OpConst16) 24990 v.AuxInt = int64(int16(c)) 24991 return true 24992 } 24993 // match: (Trunc32to16 (ZeroExt8to32 x)) 24994 // cond: 24995 // result: (ZeroExt8to16 x) 24996 for { 24997 v_0 := v.Args[0] 24998 if v_0.Op != OpZeroExt8to32 { 24999 break 25000 } 25001 x := v_0.Args[0] 25002 v.reset(OpZeroExt8to16) 25003 v.AddArg(x) 25004 return true 25005 } 25006 // match: (Trunc32to16 (ZeroExt16to32 x)) 25007 // cond: 25008 // result: x 25009 for { 25010 v_0 := v.Args[0] 25011 if v_0.Op != OpZeroExt16to32 { 25012 break 25013 } 25014 x := v_0.Args[0] 25015 v.reset(OpCopy) 25016 v.Type = x.Type 25017 v.AddArg(x) 25018 return true 25019 } 25020 // match: (Trunc32to16 (SignExt8to32 x)) 25021 // cond: 25022 // result: (SignExt8to16 x) 25023 for { 25024 v_0 := v.Args[0] 25025 if v_0.Op != OpSignExt8to32 { 25026 break 25027 } 25028 x := v_0.Args[0] 25029 v.reset(OpSignExt8to16) 25030 v.AddArg(x) 25031 return true 25032 } 25033 // match: (Trunc32to16 (SignExt16to32 x)) 25034 // cond: 25035 // result: x 25036 for { 25037 v_0 := v.Args[0] 25038 if v_0.Op != OpSignExt16to32 { 25039 break 25040 } 25041 x := v_0.Args[0] 25042 v.reset(OpCopy) 25043 v.Type = x.Type 25044 v.AddArg(x) 25045 return true 25046 } 25047 // match: (Trunc32to16 (And32 (Const32 [y]) x)) 25048 // cond: y&0xFFFF == 0xFFFF 25049 // result: (Trunc32to16 x) 25050 for { 25051 v_0 := v.Args[0] 25052 if v_0.Op != OpAnd32 { 25053 break 25054 } 25055 _ = v_0.Args[1] 25056 v_0_0 := v_0.Args[0] 25057 if v_0_0.Op != OpConst32 { 25058 break 25059 } 25060 y := v_0_0.AuxInt 25061 x := v_0.Args[1] 25062 if !(y&0xFFFF == 0xFFFF) { 25063 break 25064 } 25065 v.reset(OpTrunc32to16) 25066 v.AddArg(x) 25067 return true 25068 } 25069 // match: (Trunc32to16 (And32 x (Const32 [y]))) 25070 // cond: y&0xFFFF == 0xFFFF 25071 // result: (Trunc32to16 x) 25072 for { 25073 v_0 := v.Args[0] 25074 if v_0.Op != OpAnd32 { 25075 break 25076 } 25077 _ = v_0.Args[1] 25078 x := v_0.Args[0] 25079 v_0_1 := v_0.Args[1] 25080 if v_0_1.Op != OpConst32 { 25081 break 25082 } 25083 y := v_0_1.AuxInt 25084 if !(y&0xFFFF == 0xFFFF) { 25085 break 25086 } 25087 v.reset(OpTrunc32to16) 25088 v.AddArg(x) 25089 return true 25090 } 25091 return false 25092 } 25093 func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { 25094 // match: (Trunc32to8 (Const32 [c])) 25095 // cond: 25096 // result: (Const8 [int64(int8(c))]) 25097 for { 25098 v_0 := v.Args[0] 25099 if v_0.Op != OpConst32 { 25100 break 25101 } 25102 c := v_0.AuxInt 25103 v.reset(OpConst8) 25104 v.AuxInt = int64(int8(c)) 25105 return true 25106 } 25107 // match: (Trunc32to8 (ZeroExt8to32 x)) 25108 // cond: 25109 // result: x 25110 for { 25111 v_0 := v.Args[0] 25112 if v_0.Op != OpZeroExt8to32 { 25113 break 25114 } 25115 x := v_0.Args[0] 25116 v.reset(OpCopy) 25117 v.Type = x.Type 25118 v.AddArg(x) 25119 return true 25120 } 25121 // match: (Trunc32to8 (SignExt8to32 x)) 25122 // cond: 25123 // result: x 25124 for { 25125 v_0 := v.Args[0] 25126 if v_0.Op != OpSignExt8to32 { 25127 break 25128 } 25129 x := v_0.Args[0] 25130 v.reset(OpCopy) 25131 v.Type = x.Type 25132 v.AddArg(x) 25133 return true 25134 } 25135 // match: (Trunc32to8 (And32 (Const32 [y]) x)) 25136 // cond: y&0xFF == 0xFF 25137 // result: (Trunc32to8 x) 25138 for { 25139 v_0 := v.Args[0] 25140 if v_0.Op != OpAnd32 { 25141 break 25142 } 25143 _ = v_0.Args[1] 25144 v_0_0 := v_0.Args[0] 25145 if v_0_0.Op != OpConst32 { 25146 break 25147 } 25148 y := v_0_0.AuxInt 25149 x := v_0.Args[1] 25150 if !(y&0xFF == 0xFF) { 25151 break 25152 } 25153 v.reset(OpTrunc32to8) 25154 v.AddArg(x) 25155 return true 25156 } 25157 // match: (Trunc32to8 (And32 x (Const32 [y]))) 25158 // cond: y&0xFF == 0xFF 25159 // result: (Trunc32to8 x) 25160 for { 25161 v_0 := v.Args[0] 25162 if v_0.Op != OpAnd32 { 25163 break 25164 } 25165 _ = v_0.Args[1] 25166 x := v_0.Args[0] 25167 v_0_1 := v_0.Args[1] 25168 if v_0_1.Op != OpConst32 { 25169 break 25170 } 25171 y := v_0_1.AuxInt 25172 if !(y&0xFF == 0xFF) { 25173 break 25174 } 25175 v.reset(OpTrunc32to8) 25176 v.AddArg(x) 25177 return true 25178 } 25179 return false 25180 } 25181 func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { 25182 // match: (Trunc64to16 (Const64 [c])) 25183 // cond: 25184 // result: (Const16 [int64(int16(c))]) 25185 for { 25186 v_0 := v.Args[0] 25187 if v_0.Op != OpConst64 { 25188 break 25189 } 25190 c := v_0.AuxInt 25191 v.reset(OpConst16) 25192 v.AuxInt = int64(int16(c)) 25193 return true 25194 } 25195 // match: (Trunc64to16 (ZeroExt8to64 x)) 25196 // cond: 25197 // result: (ZeroExt8to16 x) 25198 for { 25199 v_0 := v.Args[0] 25200 if v_0.Op != OpZeroExt8to64 { 25201 break 25202 } 25203 x := v_0.Args[0] 25204 v.reset(OpZeroExt8to16) 25205 v.AddArg(x) 25206 return true 25207 } 25208 // match: (Trunc64to16 (ZeroExt16to64 x)) 25209 // cond: 25210 // result: x 25211 for { 25212 v_0 := v.Args[0] 25213 if v_0.Op != OpZeroExt16to64 { 25214 break 25215 } 25216 x := v_0.Args[0] 25217 v.reset(OpCopy) 25218 v.Type = x.Type 25219 v.AddArg(x) 25220 return true 25221 } 25222 // match: (Trunc64to16 (SignExt8to64 x)) 25223 // cond: 25224 // result: (SignExt8to16 x) 25225 for { 25226 v_0 := v.Args[0] 25227 if v_0.Op != OpSignExt8to64 { 25228 break 25229 } 25230 x := v_0.Args[0] 25231 v.reset(OpSignExt8to16) 25232 v.AddArg(x) 25233 return true 25234 } 25235 // match: (Trunc64to16 (SignExt16to64 x)) 25236 // cond: 25237 // result: x 25238 for { 25239 v_0 := v.Args[0] 25240 if v_0.Op != OpSignExt16to64 { 25241 break 25242 } 25243 x := v_0.Args[0] 25244 v.reset(OpCopy) 25245 v.Type = x.Type 25246 v.AddArg(x) 25247 return true 25248 } 25249 // match: (Trunc64to16 (And64 (Const64 [y]) x)) 25250 // cond: y&0xFFFF == 0xFFFF 25251 // result: (Trunc64to16 x) 25252 for { 25253 v_0 := v.Args[0] 25254 if v_0.Op != OpAnd64 { 25255 break 25256 } 25257 _ = v_0.Args[1] 25258 v_0_0 := v_0.Args[0] 25259 if v_0_0.Op != OpConst64 { 25260 break 25261 } 25262 y := v_0_0.AuxInt 25263 x := v_0.Args[1] 25264 if !(y&0xFFFF == 0xFFFF) { 25265 break 25266 } 25267 v.reset(OpTrunc64to16) 25268 v.AddArg(x) 25269 return true 25270 } 25271 // match: (Trunc64to16 (And64 x (Const64 [y]))) 25272 // cond: y&0xFFFF == 0xFFFF 25273 // result: (Trunc64to16 x) 25274 for { 25275 v_0 := v.Args[0] 25276 if v_0.Op != OpAnd64 { 25277 break 25278 } 25279 _ = v_0.Args[1] 25280 x := v_0.Args[0] 25281 v_0_1 := v_0.Args[1] 25282 if v_0_1.Op != OpConst64 { 25283 break 25284 } 25285 y := v_0_1.AuxInt 25286 if !(y&0xFFFF == 0xFFFF) { 25287 break 25288 } 25289 v.reset(OpTrunc64to16) 25290 v.AddArg(x) 25291 return true 25292 } 25293 return false 25294 } 25295 func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { 25296 // match: (Trunc64to32 (Const64 [c])) 25297 // cond: 25298 // result: (Const32 [int64(int32(c))]) 25299 for { 25300 v_0 := v.Args[0] 25301 if v_0.Op != OpConst64 { 25302 break 25303 } 25304 c := v_0.AuxInt 25305 v.reset(OpConst32) 25306 v.AuxInt = int64(int32(c)) 25307 return true 25308 } 25309 // match: (Trunc64to32 (ZeroExt8to64 x)) 25310 // cond: 25311 // result: (ZeroExt8to32 x) 25312 for { 25313 v_0 := v.Args[0] 25314 if v_0.Op != OpZeroExt8to64 { 25315 break 25316 } 25317 x := v_0.Args[0] 25318 v.reset(OpZeroExt8to32) 25319 v.AddArg(x) 25320 return true 25321 } 25322 // match: (Trunc64to32 (ZeroExt16to64 x)) 25323 // cond: 25324 // result: (ZeroExt16to32 x) 25325 for { 25326 v_0 := v.Args[0] 25327 if v_0.Op != OpZeroExt16to64 { 25328 break 25329 } 25330 x := v_0.Args[0] 25331 v.reset(OpZeroExt16to32) 25332 v.AddArg(x) 25333 return true 25334 } 25335 // match: (Trunc64to32 (ZeroExt32to64 x)) 25336 // cond: 25337 // result: x 25338 for { 25339 v_0 := v.Args[0] 25340 if v_0.Op != OpZeroExt32to64 { 25341 break 25342 } 25343 x := v_0.Args[0] 25344 v.reset(OpCopy) 25345 v.Type = x.Type 25346 v.AddArg(x) 25347 return true 25348 } 25349 // match: (Trunc64to32 (SignExt8to64 x)) 25350 // cond: 25351 // result: (SignExt8to32 x) 25352 for { 25353 v_0 := v.Args[0] 25354 if v_0.Op != OpSignExt8to64 { 25355 break 25356 } 25357 x := v_0.Args[0] 25358 v.reset(OpSignExt8to32) 25359 v.AddArg(x) 25360 return true 25361 } 25362 // match: (Trunc64to32 (SignExt16to64 x)) 25363 // cond: 25364 // result: (SignExt16to32 x) 25365 for { 25366 v_0 := v.Args[0] 25367 if v_0.Op != OpSignExt16to64 { 25368 break 25369 } 25370 x := v_0.Args[0] 25371 v.reset(OpSignExt16to32) 25372 v.AddArg(x) 25373 return true 25374 } 25375 // match: (Trunc64to32 (SignExt32to64 x)) 25376 // cond: 25377 // result: x 25378 for { 25379 v_0 := v.Args[0] 25380 if v_0.Op != OpSignExt32to64 { 25381 break 25382 } 25383 x := v_0.Args[0] 25384 v.reset(OpCopy) 25385 v.Type = x.Type 25386 v.AddArg(x) 25387 return true 25388 } 25389 // match: (Trunc64to32 (And64 (Const64 [y]) x)) 25390 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 25391 // result: (Trunc64to32 x) 25392 for { 25393 v_0 := v.Args[0] 25394 if v_0.Op != OpAnd64 { 25395 break 25396 } 25397 _ = v_0.Args[1] 25398 v_0_0 := v_0.Args[0] 25399 if v_0_0.Op != OpConst64 { 25400 break 25401 } 25402 y := v_0_0.AuxInt 25403 x := v_0.Args[1] 25404 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 25405 break 25406 } 25407 v.reset(OpTrunc64to32) 25408 v.AddArg(x) 25409 return true 25410 } 25411 // match: (Trunc64to32 (And64 x (Const64 [y]))) 25412 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 25413 // result: (Trunc64to32 x) 25414 for { 25415 v_0 := v.Args[0] 25416 if v_0.Op != OpAnd64 { 25417 break 25418 } 25419 _ = v_0.Args[1] 25420 x := v_0.Args[0] 25421 v_0_1 := v_0.Args[1] 25422 if v_0_1.Op != OpConst64 { 25423 break 25424 } 25425 y := v_0_1.AuxInt 25426 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 25427 break 25428 } 25429 v.reset(OpTrunc64to32) 25430 v.AddArg(x) 25431 return true 25432 } 25433 return false 25434 } 25435 func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { 25436 // match: (Trunc64to8 (Const64 [c])) 25437 // cond: 25438 // result: (Const8 [int64(int8(c))]) 25439 for { 25440 v_0 := v.Args[0] 25441 if v_0.Op != OpConst64 { 25442 break 25443 } 25444 c := v_0.AuxInt 25445 v.reset(OpConst8) 25446 v.AuxInt = int64(int8(c)) 25447 return true 25448 } 25449 // match: (Trunc64to8 (ZeroExt8to64 x)) 25450 // cond: 25451 // result: x 25452 for { 25453 v_0 := v.Args[0] 25454 if v_0.Op != OpZeroExt8to64 { 25455 break 25456 } 25457 x := v_0.Args[0] 25458 v.reset(OpCopy) 25459 v.Type = x.Type 25460 v.AddArg(x) 25461 return true 25462 } 25463 // match: (Trunc64to8 (SignExt8to64 x)) 25464 // cond: 25465 // result: x 25466 for { 25467 v_0 := v.Args[0] 25468 if v_0.Op != OpSignExt8to64 { 25469 break 25470 } 25471 x := v_0.Args[0] 25472 v.reset(OpCopy) 25473 v.Type = x.Type 25474 v.AddArg(x) 25475 return true 25476 } 25477 // match: (Trunc64to8 (And64 (Const64 [y]) x)) 25478 // cond: y&0xFF == 0xFF 25479 // result: (Trunc64to8 x) 25480 for { 25481 v_0 := v.Args[0] 25482 if v_0.Op != OpAnd64 { 25483 break 25484 } 25485 _ = v_0.Args[1] 25486 v_0_0 := v_0.Args[0] 25487 if v_0_0.Op != OpConst64 { 25488 break 25489 } 25490 y := v_0_0.AuxInt 25491 x := v_0.Args[1] 25492 if !(y&0xFF == 0xFF) { 25493 break 25494 } 25495 v.reset(OpTrunc64to8) 25496 v.AddArg(x) 25497 return true 25498 } 25499 // match: (Trunc64to8 (And64 x (Const64 [y]))) 25500 // cond: y&0xFF == 0xFF 25501 // result: (Trunc64to8 x) 25502 for { 25503 v_0 := v.Args[0] 25504 if v_0.Op != OpAnd64 { 25505 break 25506 } 25507 _ = v_0.Args[1] 25508 x := v_0.Args[0] 25509 v_0_1 := v_0.Args[1] 25510 if v_0_1.Op != OpConst64 { 25511 break 25512 } 25513 y := v_0_1.AuxInt 25514 if !(y&0xFF == 0xFF) { 25515 break 25516 } 25517 v.reset(OpTrunc64to8) 25518 v.AddArg(x) 25519 return true 25520 } 25521 return false 25522 } 25523 func rewriteValuegeneric_OpXor16_0(v *Value) bool { 25524 b := v.Block 25525 _ = b 25526 // match: (Xor16 (Const16 [c]) (Const16 [d])) 25527 // cond: 25528 // result: (Const16 [int64(int16(c^d))]) 25529 for { 25530 _ = v.Args[1] 25531 v_0 := v.Args[0] 25532 if v_0.Op != OpConst16 { 25533 break 25534 } 25535 c := v_0.AuxInt 25536 v_1 := v.Args[1] 25537 if v_1.Op != OpConst16 { 25538 break 25539 } 25540 d := v_1.AuxInt 25541 v.reset(OpConst16) 25542 v.AuxInt = int64(int16(c ^ d)) 25543 return true 25544 } 25545 // match: (Xor16 (Const16 [d]) (Const16 [c])) 25546 // cond: 25547 // result: (Const16 [int64(int16(c^d))]) 25548 for { 25549 _ = v.Args[1] 25550 v_0 := v.Args[0] 25551 if v_0.Op != OpConst16 { 25552 break 25553 } 25554 d := v_0.AuxInt 25555 v_1 := v.Args[1] 25556 if v_1.Op != OpConst16 { 25557 break 25558 } 25559 c := v_1.AuxInt 25560 v.reset(OpConst16) 25561 v.AuxInt = int64(int16(c ^ d)) 25562 return true 25563 } 25564 // match: (Xor16 x x) 25565 // cond: 25566 // result: (Const16 [0]) 25567 for { 25568 _ = v.Args[1] 25569 x := v.Args[0] 25570 if x != v.Args[1] { 25571 break 25572 } 25573 v.reset(OpConst16) 25574 v.AuxInt = 0 25575 return true 25576 } 25577 // match: (Xor16 (Const16 [0]) x) 25578 // cond: 25579 // result: x 25580 for { 25581 _ = v.Args[1] 25582 v_0 := v.Args[0] 25583 if v_0.Op != OpConst16 { 25584 break 25585 } 25586 if v_0.AuxInt != 0 { 25587 break 25588 } 25589 x := v.Args[1] 25590 v.reset(OpCopy) 25591 v.Type = x.Type 25592 v.AddArg(x) 25593 return true 25594 } 25595 // match: (Xor16 x (Const16 [0])) 25596 // cond: 25597 // result: x 25598 for { 25599 _ = v.Args[1] 25600 x := v.Args[0] 25601 v_1 := v.Args[1] 25602 if v_1.Op != OpConst16 { 25603 break 25604 } 25605 if v_1.AuxInt != 0 { 25606 break 25607 } 25608 v.reset(OpCopy) 25609 v.Type = x.Type 25610 v.AddArg(x) 25611 return true 25612 } 25613 // match: (Xor16 x (Xor16 x y)) 25614 // cond: 25615 // result: y 25616 for { 25617 _ = v.Args[1] 25618 x := v.Args[0] 25619 v_1 := v.Args[1] 25620 if v_1.Op != OpXor16 { 25621 break 25622 } 25623 _ = v_1.Args[1] 25624 if x != v_1.Args[0] { 25625 break 25626 } 25627 y := v_1.Args[1] 25628 v.reset(OpCopy) 25629 v.Type = y.Type 25630 v.AddArg(y) 25631 return true 25632 } 25633 // match: (Xor16 x (Xor16 y x)) 25634 // cond: 25635 // result: y 25636 for { 25637 _ = v.Args[1] 25638 x := v.Args[0] 25639 v_1 := v.Args[1] 25640 if v_1.Op != OpXor16 { 25641 break 25642 } 25643 _ = v_1.Args[1] 25644 y := v_1.Args[0] 25645 if x != v_1.Args[1] { 25646 break 25647 } 25648 v.reset(OpCopy) 25649 v.Type = y.Type 25650 v.AddArg(y) 25651 return true 25652 } 25653 // match: (Xor16 (Xor16 x y) x) 25654 // cond: 25655 // result: y 25656 for { 25657 _ = v.Args[1] 25658 v_0 := v.Args[0] 25659 if v_0.Op != OpXor16 { 25660 break 25661 } 25662 _ = v_0.Args[1] 25663 x := v_0.Args[0] 25664 y := v_0.Args[1] 25665 if x != v.Args[1] { 25666 break 25667 } 25668 v.reset(OpCopy) 25669 v.Type = y.Type 25670 v.AddArg(y) 25671 return true 25672 } 25673 // match: (Xor16 (Xor16 y x) x) 25674 // cond: 25675 // result: y 25676 for { 25677 _ = v.Args[1] 25678 v_0 := v.Args[0] 25679 if v_0.Op != OpXor16 { 25680 break 25681 } 25682 _ = v_0.Args[1] 25683 y := v_0.Args[0] 25684 x := v_0.Args[1] 25685 if x != v.Args[1] { 25686 break 25687 } 25688 v.reset(OpCopy) 25689 v.Type = y.Type 25690 v.AddArg(y) 25691 return true 25692 } 25693 // match: (Xor16 (Xor16 i:(Const16 <t>) z) x) 25694 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 25695 // result: (Xor16 i (Xor16 <t> z x)) 25696 for { 25697 _ = v.Args[1] 25698 v_0 := v.Args[0] 25699 if v_0.Op != OpXor16 { 25700 break 25701 } 25702 _ = v_0.Args[1] 25703 i := v_0.Args[0] 25704 if i.Op != OpConst16 { 25705 break 25706 } 25707 t := i.Type 25708 z := v_0.Args[1] 25709 x := v.Args[1] 25710 if !(z.Op != OpConst16 && x.Op != OpConst16) { 25711 break 25712 } 25713 v.reset(OpXor16) 25714 v.AddArg(i) 25715 v0 := b.NewValue0(v.Pos, OpXor16, t) 25716 v0.AddArg(z) 25717 v0.AddArg(x) 25718 v.AddArg(v0) 25719 return true 25720 } 25721 return false 25722 } 25723 func rewriteValuegeneric_OpXor16_10(v *Value) bool { 25724 b := v.Block 25725 _ = b 25726 // match: (Xor16 (Xor16 z i:(Const16 <t>)) x) 25727 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 25728 // result: (Xor16 i (Xor16 <t> z x)) 25729 for { 25730 _ = v.Args[1] 25731 v_0 := v.Args[0] 25732 if v_0.Op != OpXor16 { 25733 break 25734 } 25735 _ = v_0.Args[1] 25736 z := v_0.Args[0] 25737 i := v_0.Args[1] 25738 if i.Op != OpConst16 { 25739 break 25740 } 25741 t := i.Type 25742 x := v.Args[1] 25743 if !(z.Op != OpConst16 && x.Op != OpConst16) { 25744 break 25745 } 25746 v.reset(OpXor16) 25747 v.AddArg(i) 25748 v0 := b.NewValue0(v.Pos, OpXor16, t) 25749 v0.AddArg(z) 25750 v0.AddArg(x) 25751 v.AddArg(v0) 25752 return true 25753 } 25754 // match: (Xor16 x (Xor16 i:(Const16 <t>) z)) 25755 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 25756 // result: (Xor16 i (Xor16 <t> z x)) 25757 for { 25758 _ = v.Args[1] 25759 x := v.Args[0] 25760 v_1 := v.Args[1] 25761 if v_1.Op != OpXor16 { 25762 break 25763 } 25764 _ = v_1.Args[1] 25765 i := v_1.Args[0] 25766 if i.Op != OpConst16 { 25767 break 25768 } 25769 t := i.Type 25770 z := v_1.Args[1] 25771 if !(z.Op != OpConst16 && x.Op != OpConst16) { 25772 break 25773 } 25774 v.reset(OpXor16) 25775 v.AddArg(i) 25776 v0 := b.NewValue0(v.Pos, OpXor16, t) 25777 v0.AddArg(z) 25778 v0.AddArg(x) 25779 v.AddArg(v0) 25780 return true 25781 } 25782 // match: (Xor16 x (Xor16 z i:(Const16 <t>))) 25783 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 25784 // result: (Xor16 i (Xor16 <t> z x)) 25785 for { 25786 _ = v.Args[1] 25787 x := v.Args[0] 25788 v_1 := v.Args[1] 25789 if v_1.Op != OpXor16 { 25790 break 25791 } 25792 _ = v_1.Args[1] 25793 z := v_1.Args[0] 25794 i := v_1.Args[1] 25795 if i.Op != OpConst16 { 25796 break 25797 } 25798 t := i.Type 25799 if !(z.Op != OpConst16 && x.Op != OpConst16) { 25800 break 25801 } 25802 v.reset(OpXor16) 25803 v.AddArg(i) 25804 v0 := b.NewValue0(v.Pos, OpXor16, t) 25805 v0.AddArg(z) 25806 v0.AddArg(x) 25807 v.AddArg(v0) 25808 return true 25809 } 25810 // match: (Xor16 (Const16 <t> [c]) (Xor16 (Const16 <t> [d]) x)) 25811 // cond: 25812 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 25813 for { 25814 _ = v.Args[1] 25815 v_0 := v.Args[0] 25816 if v_0.Op != OpConst16 { 25817 break 25818 } 25819 t := v_0.Type 25820 c := v_0.AuxInt 25821 v_1 := v.Args[1] 25822 if v_1.Op != OpXor16 { 25823 break 25824 } 25825 _ = v_1.Args[1] 25826 v_1_0 := v_1.Args[0] 25827 if v_1_0.Op != OpConst16 { 25828 break 25829 } 25830 if v_1_0.Type != t { 25831 break 25832 } 25833 d := v_1_0.AuxInt 25834 x := v_1.Args[1] 25835 v.reset(OpXor16) 25836 v0 := b.NewValue0(v.Pos, OpConst16, t) 25837 v0.AuxInt = int64(int16(c ^ d)) 25838 v.AddArg(v0) 25839 v.AddArg(x) 25840 return true 25841 } 25842 // match: (Xor16 (Const16 <t> [c]) (Xor16 x (Const16 <t> [d]))) 25843 // cond: 25844 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 25845 for { 25846 _ = v.Args[1] 25847 v_0 := v.Args[0] 25848 if v_0.Op != OpConst16 { 25849 break 25850 } 25851 t := v_0.Type 25852 c := v_0.AuxInt 25853 v_1 := v.Args[1] 25854 if v_1.Op != OpXor16 { 25855 break 25856 } 25857 _ = v_1.Args[1] 25858 x := v_1.Args[0] 25859 v_1_1 := v_1.Args[1] 25860 if v_1_1.Op != OpConst16 { 25861 break 25862 } 25863 if v_1_1.Type != t { 25864 break 25865 } 25866 d := v_1_1.AuxInt 25867 v.reset(OpXor16) 25868 v0 := b.NewValue0(v.Pos, OpConst16, t) 25869 v0.AuxInt = int64(int16(c ^ d)) 25870 v.AddArg(v0) 25871 v.AddArg(x) 25872 return true 25873 } 25874 // match: (Xor16 (Xor16 (Const16 <t> [d]) x) (Const16 <t> [c])) 25875 // cond: 25876 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 25877 for { 25878 _ = v.Args[1] 25879 v_0 := v.Args[0] 25880 if v_0.Op != OpXor16 { 25881 break 25882 } 25883 _ = v_0.Args[1] 25884 v_0_0 := v_0.Args[0] 25885 if v_0_0.Op != OpConst16 { 25886 break 25887 } 25888 t := v_0_0.Type 25889 d := v_0_0.AuxInt 25890 x := v_0.Args[1] 25891 v_1 := v.Args[1] 25892 if v_1.Op != OpConst16 { 25893 break 25894 } 25895 if v_1.Type != t { 25896 break 25897 } 25898 c := v_1.AuxInt 25899 v.reset(OpXor16) 25900 v0 := b.NewValue0(v.Pos, OpConst16, t) 25901 v0.AuxInt = int64(int16(c ^ d)) 25902 v.AddArg(v0) 25903 v.AddArg(x) 25904 return true 25905 } 25906 // match: (Xor16 (Xor16 x (Const16 <t> [d])) (Const16 <t> [c])) 25907 // cond: 25908 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 25909 for { 25910 _ = v.Args[1] 25911 v_0 := v.Args[0] 25912 if v_0.Op != OpXor16 { 25913 break 25914 } 25915 _ = v_0.Args[1] 25916 x := v_0.Args[0] 25917 v_0_1 := v_0.Args[1] 25918 if v_0_1.Op != OpConst16 { 25919 break 25920 } 25921 t := v_0_1.Type 25922 d := v_0_1.AuxInt 25923 v_1 := v.Args[1] 25924 if v_1.Op != OpConst16 { 25925 break 25926 } 25927 if v_1.Type != t { 25928 break 25929 } 25930 c := v_1.AuxInt 25931 v.reset(OpXor16) 25932 v0 := b.NewValue0(v.Pos, OpConst16, t) 25933 v0.AuxInt = int64(int16(c ^ d)) 25934 v.AddArg(v0) 25935 v.AddArg(x) 25936 return true 25937 } 25938 return false 25939 } 25940 func rewriteValuegeneric_OpXor32_0(v *Value) bool { 25941 b := v.Block 25942 _ = b 25943 // match: (Xor32 (Const32 [c]) (Const32 [d])) 25944 // cond: 25945 // result: (Const32 [int64(int32(c^d))]) 25946 for { 25947 _ = v.Args[1] 25948 v_0 := v.Args[0] 25949 if v_0.Op != OpConst32 { 25950 break 25951 } 25952 c := v_0.AuxInt 25953 v_1 := v.Args[1] 25954 if v_1.Op != OpConst32 { 25955 break 25956 } 25957 d := v_1.AuxInt 25958 v.reset(OpConst32) 25959 v.AuxInt = int64(int32(c ^ d)) 25960 return true 25961 } 25962 // match: (Xor32 (Const32 [d]) (Const32 [c])) 25963 // cond: 25964 // result: (Const32 [int64(int32(c^d))]) 25965 for { 25966 _ = v.Args[1] 25967 v_0 := v.Args[0] 25968 if v_0.Op != OpConst32 { 25969 break 25970 } 25971 d := v_0.AuxInt 25972 v_1 := v.Args[1] 25973 if v_1.Op != OpConst32 { 25974 break 25975 } 25976 c := v_1.AuxInt 25977 v.reset(OpConst32) 25978 v.AuxInt = int64(int32(c ^ d)) 25979 return true 25980 } 25981 // match: (Xor32 x x) 25982 // cond: 25983 // result: (Const32 [0]) 25984 for { 25985 _ = v.Args[1] 25986 x := v.Args[0] 25987 if x != v.Args[1] { 25988 break 25989 } 25990 v.reset(OpConst32) 25991 v.AuxInt = 0 25992 return true 25993 } 25994 // match: (Xor32 (Const32 [0]) x) 25995 // cond: 25996 // result: x 25997 for { 25998 _ = v.Args[1] 25999 v_0 := v.Args[0] 26000 if v_0.Op != OpConst32 { 26001 break 26002 } 26003 if v_0.AuxInt != 0 { 26004 break 26005 } 26006 x := v.Args[1] 26007 v.reset(OpCopy) 26008 v.Type = x.Type 26009 v.AddArg(x) 26010 return true 26011 } 26012 // match: (Xor32 x (Const32 [0])) 26013 // cond: 26014 // result: x 26015 for { 26016 _ = v.Args[1] 26017 x := v.Args[0] 26018 v_1 := v.Args[1] 26019 if v_1.Op != OpConst32 { 26020 break 26021 } 26022 if v_1.AuxInt != 0 { 26023 break 26024 } 26025 v.reset(OpCopy) 26026 v.Type = x.Type 26027 v.AddArg(x) 26028 return true 26029 } 26030 // match: (Xor32 x (Xor32 x y)) 26031 // cond: 26032 // result: y 26033 for { 26034 _ = v.Args[1] 26035 x := v.Args[0] 26036 v_1 := v.Args[1] 26037 if v_1.Op != OpXor32 { 26038 break 26039 } 26040 _ = v_1.Args[1] 26041 if x != v_1.Args[0] { 26042 break 26043 } 26044 y := v_1.Args[1] 26045 v.reset(OpCopy) 26046 v.Type = y.Type 26047 v.AddArg(y) 26048 return true 26049 } 26050 // match: (Xor32 x (Xor32 y x)) 26051 // cond: 26052 // result: y 26053 for { 26054 _ = v.Args[1] 26055 x := v.Args[0] 26056 v_1 := v.Args[1] 26057 if v_1.Op != OpXor32 { 26058 break 26059 } 26060 _ = v_1.Args[1] 26061 y := v_1.Args[0] 26062 if x != v_1.Args[1] { 26063 break 26064 } 26065 v.reset(OpCopy) 26066 v.Type = y.Type 26067 v.AddArg(y) 26068 return true 26069 } 26070 // match: (Xor32 (Xor32 x y) x) 26071 // cond: 26072 // result: y 26073 for { 26074 _ = v.Args[1] 26075 v_0 := v.Args[0] 26076 if v_0.Op != OpXor32 { 26077 break 26078 } 26079 _ = v_0.Args[1] 26080 x := v_0.Args[0] 26081 y := v_0.Args[1] 26082 if x != v.Args[1] { 26083 break 26084 } 26085 v.reset(OpCopy) 26086 v.Type = y.Type 26087 v.AddArg(y) 26088 return true 26089 } 26090 // match: (Xor32 (Xor32 y x) x) 26091 // cond: 26092 // result: y 26093 for { 26094 _ = v.Args[1] 26095 v_0 := v.Args[0] 26096 if v_0.Op != OpXor32 { 26097 break 26098 } 26099 _ = v_0.Args[1] 26100 y := v_0.Args[0] 26101 x := v_0.Args[1] 26102 if x != v.Args[1] { 26103 break 26104 } 26105 v.reset(OpCopy) 26106 v.Type = y.Type 26107 v.AddArg(y) 26108 return true 26109 } 26110 // match: (Xor32 (Xor32 i:(Const32 <t>) z) x) 26111 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 26112 // result: (Xor32 i (Xor32 <t> z x)) 26113 for { 26114 _ = v.Args[1] 26115 v_0 := v.Args[0] 26116 if v_0.Op != OpXor32 { 26117 break 26118 } 26119 _ = v_0.Args[1] 26120 i := v_0.Args[0] 26121 if i.Op != OpConst32 { 26122 break 26123 } 26124 t := i.Type 26125 z := v_0.Args[1] 26126 x := v.Args[1] 26127 if !(z.Op != OpConst32 && x.Op != OpConst32) { 26128 break 26129 } 26130 v.reset(OpXor32) 26131 v.AddArg(i) 26132 v0 := b.NewValue0(v.Pos, OpXor32, t) 26133 v0.AddArg(z) 26134 v0.AddArg(x) 26135 v.AddArg(v0) 26136 return true 26137 } 26138 return false 26139 } 26140 func rewriteValuegeneric_OpXor32_10(v *Value) bool { 26141 b := v.Block 26142 _ = b 26143 // match: (Xor32 (Xor32 z i:(Const32 <t>)) x) 26144 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 26145 // result: (Xor32 i (Xor32 <t> z x)) 26146 for { 26147 _ = v.Args[1] 26148 v_0 := v.Args[0] 26149 if v_0.Op != OpXor32 { 26150 break 26151 } 26152 _ = v_0.Args[1] 26153 z := v_0.Args[0] 26154 i := v_0.Args[1] 26155 if i.Op != OpConst32 { 26156 break 26157 } 26158 t := i.Type 26159 x := v.Args[1] 26160 if !(z.Op != OpConst32 && x.Op != OpConst32) { 26161 break 26162 } 26163 v.reset(OpXor32) 26164 v.AddArg(i) 26165 v0 := b.NewValue0(v.Pos, OpXor32, t) 26166 v0.AddArg(z) 26167 v0.AddArg(x) 26168 v.AddArg(v0) 26169 return true 26170 } 26171 // match: (Xor32 x (Xor32 i:(Const32 <t>) z)) 26172 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 26173 // result: (Xor32 i (Xor32 <t> z x)) 26174 for { 26175 _ = v.Args[1] 26176 x := v.Args[0] 26177 v_1 := v.Args[1] 26178 if v_1.Op != OpXor32 { 26179 break 26180 } 26181 _ = v_1.Args[1] 26182 i := v_1.Args[0] 26183 if i.Op != OpConst32 { 26184 break 26185 } 26186 t := i.Type 26187 z := v_1.Args[1] 26188 if !(z.Op != OpConst32 && x.Op != OpConst32) { 26189 break 26190 } 26191 v.reset(OpXor32) 26192 v.AddArg(i) 26193 v0 := b.NewValue0(v.Pos, OpXor32, t) 26194 v0.AddArg(z) 26195 v0.AddArg(x) 26196 v.AddArg(v0) 26197 return true 26198 } 26199 // match: (Xor32 x (Xor32 z i:(Const32 <t>))) 26200 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 26201 // result: (Xor32 i (Xor32 <t> z x)) 26202 for { 26203 _ = v.Args[1] 26204 x := v.Args[0] 26205 v_1 := v.Args[1] 26206 if v_1.Op != OpXor32 { 26207 break 26208 } 26209 _ = v_1.Args[1] 26210 z := v_1.Args[0] 26211 i := v_1.Args[1] 26212 if i.Op != OpConst32 { 26213 break 26214 } 26215 t := i.Type 26216 if !(z.Op != OpConst32 && x.Op != OpConst32) { 26217 break 26218 } 26219 v.reset(OpXor32) 26220 v.AddArg(i) 26221 v0 := b.NewValue0(v.Pos, OpXor32, t) 26222 v0.AddArg(z) 26223 v0.AddArg(x) 26224 v.AddArg(v0) 26225 return true 26226 } 26227 // match: (Xor32 (Const32 <t> [c]) (Xor32 (Const32 <t> [d]) x)) 26228 // cond: 26229 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 26230 for { 26231 _ = v.Args[1] 26232 v_0 := v.Args[0] 26233 if v_0.Op != OpConst32 { 26234 break 26235 } 26236 t := v_0.Type 26237 c := v_0.AuxInt 26238 v_1 := v.Args[1] 26239 if v_1.Op != OpXor32 { 26240 break 26241 } 26242 _ = v_1.Args[1] 26243 v_1_0 := v_1.Args[0] 26244 if v_1_0.Op != OpConst32 { 26245 break 26246 } 26247 if v_1_0.Type != t { 26248 break 26249 } 26250 d := v_1_0.AuxInt 26251 x := v_1.Args[1] 26252 v.reset(OpXor32) 26253 v0 := b.NewValue0(v.Pos, OpConst32, t) 26254 v0.AuxInt = int64(int32(c ^ d)) 26255 v.AddArg(v0) 26256 v.AddArg(x) 26257 return true 26258 } 26259 // match: (Xor32 (Const32 <t> [c]) (Xor32 x (Const32 <t> [d]))) 26260 // cond: 26261 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 26262 for { 26263 _ = v.Args[1] 26264 v_0 := v.Args[0] 26265 if v_0.Op != OpConst32 { 26266 break 26267 } 26268 t := v_0.Type 26269 c := v_0.AuxInt 26270 v_1 := v.Args[1] 26271 if v_1.Op != OpXor32 { 26272 break 26273 } 26274 _ = v_1.Args[1] 26275 x := v_1.Args[0] 26276 v_1_1 := v_1.Args[1] 26277 if v_1_1.Op != OpConst32 { 26278 break 26279 } 26280 if v_1_1.Type != t { 26281 break 26282 } 26283 d := v_1_1.AuxInt 26284 v.reset(OpXor32) 26285 v0 := b.NewValue0(v.Pos, OpConst32, t) 26286 v0.AuxInt = int64(int32(c ^ d)) 26287 v.AddArg(v0) 26288 v.AddArg(x) 26289 return true 26290 } 26291 // match: (Xor32 (Xor32 (Const32 <t> [d]) x) (Const32 <t> [c])) 26292 // cond: 26293 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 26294 for { 26295 _ = v.Args[1] 26296 v_0 := v.Args[0] 26297 if v_0.Op != OpXor32 { 26298 break 26299 } 26300 _ = v_0.Args[1] 26301 v_0_0 := v_0.Args[0] 26302 if v_0_0.Op != OpConst32 { 26303 break 26304 } 26305 t := v_0_0.Type 26306 d := v_0_0.AuxInt 26307 x := v_0.Args[1] 26308 v_1 := v.Args[1] 26309 if v_1.Op != OpConst32 { 26310 break 26311 } 26312 if v_1.Type != t { 26313 break 26314 } 26315 c := v_1.AuxInt 26316 v.reset(OpXor32) 26317 v0 := b.NewValue0(v.Pos, OpConst32, t) 26318 v0.AuxInt = int64(int32(c ^ d)) 26319 v.AddArg(v0) 26320 v.AddArg(x) 26321 return true 26322 } 26323 // match: (Xor32 (Xor32 x (Const32 <t> [d])) (Const32 <t> [c])) 26324 // cond: 26325 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 26326 for { 26327 _ = v.Args[1] 26328 v_0 := v.Args[0] 26329 if v_0.Op != OpXor32 { 26330 break 26331 } 26332 _ = v_0.Args[1] 26333 x := v_0.Args[0] 26334 v_0_1 := v_0.Args[1] 26335 if v_0_1.Op != OpConst32 { 26336 break 26337 } 26338 t := v_0_1.Type 26339 d := v_0_1.AuxInt 26340 v_1 := v.Args[1] 26341 if v_1.Op != OpConst32 { 26342 break 26343 } 26344 if v_1.Type != t { 26345 break 26346 } 26347 c := v_1.AuxInt 26348 v.reset(OpXor32) 26349 v0 := b.NewValue0(v.Pos, OpConst32, t) 26350 v0.AuxInt = int64(int32(c ^ d)) 26351 v.AddArg(v0) 26352 v.AddArg(x) 26353 return true 26354 } 26355 return false 26356 } 26357 func rewriteValuegeneric_OpXor64_0(v *Value) bool { 26358 b := v.Block 26359 _ = b 26360 // match: (Xor64 (Const64 [c]) (Const64 [d])) 26361 // cond: 26362 // result: (Const64 [c^d]) 26363 for { 26364 _ = v.Args[1] 26365 v_0 := v.Args[0] 26366 if v_0.Op != OpConst64 { 26367 break 26368 } 26369 c := v_0.AuxInt 26370 v_1 := v.Args[1] 26371 if v_1.Op != OpConst64 { 26372 break 26373 } 26374 d := v_1.AuxInt 26375 v.reset(OpConst64) 26376 v.AuxInt = c ^ d 26377 return true 26378 } 26379 // match: (Xor64 (Const64 [d]) (Const64 [c])) 26380 // cond: 26381 // result: (Const64 [c^d]) 26382 for { 26383 _ = v.Args[1] 26384 v_0 := v.Args[0] 26385 if v_0.Op != OpConst64 { 26386 break 26387 } 26388 d := v_0.AuxInt 26389 v_1 := v.Args[1] 26390 if v_1.Op != OpConst64 { 26391 break 26392 } 26393 c := v_1.AuxInt 26394 v.reset(OpConst64) 26395 v.AuxInt = c ^ d 26396 return true 26397 } 26398 // match: (Xor64 x x) 26399 // cond: 26400 // result: (Const64 [0]) 26401 for { 26402 _ = v.Args[1] 26403 x := v.Args[0] 26404 if x != v.Args[1] { 26405 break 26406 } 26407 v.reset(OpConst64) 26408 v.AuxInt = 0 26409 return true 26410 } 26411 // match: (Xor64 (Const64 [0]) x) 26412 // cond: 26413 // result: x 26414 for { 26415 _ = v.Args[1] 26416 v_0 := v.Args[0] 26417 if v_0.Op != OpConst64 { 26418 break 26419 } 26420 if v_0.AuxInt != 0 { 26421 break 26422 } 26423 x := v.Args[1] 26424 v.reset(OpCopy) 26425 v.Type = x.Type 26426 v.AddArg(x) 26427 return true 26428 } 26429 // match: (Xor64 x (Const64 [0])) 26430 // cond: 26431 // result: x 26432 for { 26433 _ = v.Args[1] 26434 x := v.Args[0] 26435 v_1 := v.Args[1] 26436 if v_1.Op != OpConst64 { 26437 break 26438 } 26439 if v_1.AuxInt != 0 { 26440 break 26441 } 26442 v.reset(OpCopy) 26443 v.Type = x.Type 26444 v.AddArg(x) 26445 return true 26446 } 26447 // match: (Xor64 x (Xor64 x y)) 26448 // cond: 26449 // result: y 26450 for { 26451 _ = v.Args[1] 26452 x := v.Args[0] 26453 v_1 := v.Args[1] 26454 if v_1.Op != OpXor64 { 26455 break 26456 } 26457 _ = v_1.Args[1] 26458 if x != v_1.Args[0] { 26459 break 26460 } 26461 y := v_1.Args[1] 26462 v.reset(OpCopy) 26463 v.Type = y.Type 26464 v.AddArg(y) 26465 return true 26466 } 26467 // match: (Xor64 x (Xor64 y x)) 26468 // cond: 26469 // result: y 26470 for { 26471 _ = v.Args[1] 26472 x := v.Args[0] 26473 v_1 := v.Args[1] 26474 if v_1.Op != OpXor64 { 26475 break 26476 } 26477 _ = v_1.Args[1] 26478 y := v_1.Args[0] 26479 if x != v_1.Args[1] { 26480 break 26481 } 26482 v.reset(OpCopy) 26483 v.Type = y.Type 26484 v.AddArg(y) 26485 return true 26486 } 26487 // match: (Xor64 (Xor64 x y) x) 26488 // cond: 26489 // result: y 26490 for { 26491 _ = v.Args[1] 26492 v_0 := v.Args[0] 26493 if v_0.Op != OpXor64 { 26494 break 26495 } 26496 _ = v_0.Args[1] 26497 x := v_0.Args[0] 26498 y := v_0.Args[1] 26499 if x != v.Args[1] { 26500 break 26501 } 26502 v.reset(OpCopy) 26503 v.Type = y.Type 26504 v.AddArg(y) 26505 return true 26506 } 26507 // match: (Xor64 (Xor64 y x) x) 26508 // cond: 26509 // result: y 26510 for { 26511 _ = v.Args[1] 26512 v_0 := v.Args[0] 26513 if v_0.Op != OpXor64 { 26514 break 26515 } 26516 _ = v_0.Args[1] 26517 y := v_0.Args[0] 26518 x := v_0.Args[1] 26519 if x != v.Args[1] { 26520 break 26521 } 26522 v.reset(OpCopy) 26523 v.Type = y.Type 26524 v.AddArg(y) 26525 return true 26526 } 26527 // match: (Xor64 (Xor64 i:(Const64 <t>) z) x) 26528 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 26529 // result: (Xor64 i (Xor64 <t> z x)) 26530 for { 26531 _ = v.Args[1] 26532 v_0 := v.Args[0] 26533 if v_0.Op != OpXor64 { 26534 break 26535 } 26536 _ = v_0.Args[1] 26537 i := v_0.Args[0] 26538 if i.Op != OpConst64 { 26539 break 26540 } 26541 t := i.Type 26542 z := v_0.Args[1] 26543 x := v.Args[1] 26544 if !(z.Op != OpConst64 && x.Op != OpConst64) { 26545 break 26546 } 26547 v.reset(OpXor64) 26548 v.AddArg(i) 26549 v0 := b.NewValue0(v.Pos, OpXor64, t) 26550 v0.AddArg(z) 26551 v0.AddArg(x) 26552 v.AddArg(v0) 26553 return true 26554 } 26555 return false 26556 } 26557 func rewriteValuegeneric_OpXor64_10(v *Value) bool { 26558 b := v.Block 26559 _ = b 26560 // match: (Xor64 (Xor64 z i:(Const64 <t>)) x) 26561 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 26562 // result: (Xor64 i (Xor64 <t> z x)) 26563 for { 26564 _ = v.Args[1] 26565 v_0 := v.Args[0] 26566 if v_0.Op != OpXor64 { 26567 break 26568 } 26569 _ = v_0.Args[1] 26570 z := v_0.Args[0] 26571 i := v_0.Args[1] 26572 if i.Op != OpConst64 { 26573 break 26574 } 26575 t := i.Type 26576 x := v.Args[1] 26577 if !(z.Op != OpConst64 && x.Op != OpConst64) { 26578 break 26579 } 26580 v.reset(OpXor64) 26581 v.AddArg(i) 26582 v0 := b.NewValue0(v.Pos, OpXor64, t) 26583 v0.AddArg(z) 26584 v0.AddArg(x) 26585 v.AddArg(v0) 26586 return true 26587 } 26588 // match: (Xor64 x (Xor64 i:(Const64 <t>) z)) 26589 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 26590 // result: (Xor64 i (Xor64 <t> z x)) 26591 for { 26592 _ = v.Args[1] 26593 x := v.Args[0] 26594 v_1 := v.Args[1] 26595 if v_1.Op != OpXor64 { 26596 break 26597 } 26598 _ = v_1.Args[1] 26599 i := v_1.Args[0] 26600 if i.Op != OpConst64 { 26601 break 26602 } 26603 t := i.Type 26604 z := v_1.Args[1] 26605 if !(z.Op != OpConst64 && x.Op != OpConst64) { 26606 break 26607 } 26608 v.reset(OpXor64) 26609 v.AddArg(i) 26610 v0 := b.NewValue0(v.Pos, OpXor64, t) 26611 v0.AddArg(z) 26612 v0.AddArg(x) 26613 v.AddArg(v0) 26614 return true 26615 } 26616 // match: (Xor64 x (Xor64 z i:(Const64 <t>))) 26617 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 26618 // result: (Xor64 i (Xor64 <t> z x)) 26619 for { 26620 _ = v.Args[1] 26621 x := v.Args[0] 26622 v_1 := v.Args[1] 26623 if v_1.Op != OpXor64 { 26624 break 26625 } 26626 _ = v_1.Args[1] 26627 z := v_1.Args[0] 26628 i := v_1.Args[1] 26629 if i.Op != OpConst64 { 26630 break 26631 } 26632 t := i.Type 26633 if !(z.Op != OpConst64 && x.Op != OpConst64) { 26634 break 26635 } 26636 v.reset(OpXor64) 26637 v.AddArg(i) 26638 v0 := b.NewValue0(v.Pos, OpXor64, t) 26639 v0.AddArg(z) 26640 v0.AddArg(x) 26641 v.AddArg(v0) 26642 return true 26643 } 26644 // match: (Xor64 (Const64 <t> [c]) (Xor64 (Const64 <t> [d]) x)) 26645 // cond: 26646 // result: (Xor64 (Const64 <t> [c^d]) x) 26647 for { 26648 _ = v.Args[1] 26649 v_0 := v.Args[0] 26650 if v_0.Op != OpConst64 { 26651 break 26652 } 26653 t := v_0.Type 26654 c := v_0.AuxInt 26655 v_1 := v.Args[1] 26656 if v_1.Op != OpXor64 { 26657 break 26658 } 26659 _ = v_1.Args[1] 26660 v_1_0 := v_1.Args[0] 26661 if v_1_0.Op != OpConst64 { 26662 break 26663 } 26664 if v_1_0.Type != t { 26665 break 26666 } 26667 d := v_1_0.AuxInt 26668 x := v_1.Args[1] 26669 v.reset(OpXor64) 26670 v0 := b.NewValue0(v.Pos, OpConst64, t) 26671 v0.AuxInt = c ^ d 26672 v.AddArg(v0) 26673 v.AddArg(x) 26674 return true 26675 } 26676 // match: (Xor64 (Const64 <t> [c]) (Xor64 x (Const64 <t> [d]))) 26677 // cond: 26678 // result: (Xor64 (Const64 <t> [c^d]) x) 26679 for { 26680 _ = v.Args[1] 26681 v_0 := v.Args[0] 26682 if v_0.Op != OpConst64 { 26683 break 26684 } 26685 t := v_0.Type 26686 c := v_0.AuxInt 26687 v_1 := v.Args[1] 26688 if v_1.Op != OpXor64 { 26689 break 26690 } 26691 _ = v_1.Args[1] 26692 x := v_1.Args[0] 26693 v_1_1 := v_1.Args[1] 26694 if v_1_1.Op != OpConst64 { 26695 break 26696 } 26697 if v_1_1.Type != t { 26698 break 26699 } 26700 d := v_1_1.AuxInt 26701 v.reset(OpXor64) 26702 v0 := b.NewValue0(v.Pos, OpConst64, t) 26703 v0.AuxInt = c ^ d 26704 v.AddArg(v0) 26705 v.AddArg(x) 26706 return true 26707 } 26708 // match: (Xor64 (Xor64 (Const64 <t> [d]) x) (Const64 <t> [c])) 26709 // cond: 26710 // result: (Xor64 (Const64 <t> [c^d]) x) 26711 for { 26712 _ = v.Args[1] 26713 v_0 := v.Args[0] 26714 if v_0.Op != OpXor64 { 26715 break 26716 } 26717 _ = v_0.Args[1] 26718 v_0_0 := v_0.Args[0] 26719 if v_0_0.Op != OpConst64 { 26720 break 26721 } 26722 t := v_0_0.Type 26723 d := v_0_0.AuxInt 26724 x := v_0.Args[1] 26725 v_1 := v.Args[1] 26726 if v_1.Op != OpConst64 { 26727 break 26728 } 26729 if v_1.Type != t { 26730 break 26731 } 26732 c := v_1.AuxInt 26733 v.reset(OpXor64) 26734 v0 := b.NewValue0(v.Pos, OpConst64, t) 26735 v0.AuxInt = c ^ d 26736 v.AddArg(v0) 26737 v.AddArg(x) 26738 return true 26739 } 26740 // match: (Xor64 (Xor64 x (Const64 <t> [d])) (Const64 <t> [c])) 26741 // cond: 26742 // result: (Xor64 (Const64 <t> [c^d]) x) 26743 for { 26744 _ = v.Args[1] 26745 v_0 := v.Args[0] 26746 if v_0.Op != OpXor64 { 26747 break 26748 } 26749 _ = v_0.Args[1] 26750 x := v_0.Args[0] 26751 v_0_1 := v_0.Args[1] 26752 if v_0_1.Op != OpConst64 { 26753 break 26754 } 26755 t := v_0_1.Type 26756 d := v_0_1.AuxInt 26757 v_1 := v.Args[1] 26758 if v_1.Op != OpConst64 { 26759 break 26760 } 26761 if v_1.Type != t { 26762 break 26763 } 26764 c := v_1.AuxInt 26765 v.reset(OpXor64) 26766 v0 := b.NewValue0(v.Pos, OpConst64, t) 26767 v0.AuxInt = c ^ d 26768 v.AddArg(v0) 26769 v.AddArg(x) 26770 return true 26771 } 26772 return false 26773 } 26774 func rewriteValuegeneric_OpXor8_0(v *Value) bool { 26775 b := v.Block 26776 _ = b 26777 // match: (Xor8 (Const8 [c]) (Const8 [d])) 26778 // cond: 26779 // result: (Const8 [int64(int8(c^d))]) 26780 for { 26781 _ = v.Args[1] 26782 v_0 := v.Args[0] 26783 if v_0.Op != OpConst8 { 26784 break 26785 } 26786 c := v_0.AuxInt 26787 v_1 := v.Args[1] 26788 if v_1.Op != OpConst8 { 26789 break 26790 } 26791 d := v_1.AuxInt 26792 v.reset(OpConst8) 26793 v.AuxInt = int64(int8(c ^ d)) 26794 return true 26795 } 26796 // match: (Xor8 (Const8 [d]) (Const8 [c])) 26797 // cond: 26798 // result: (Const8 [int64(int8(c^d))]) 26799 for { 26800 _ = v.Args[1] 26801 v_0 := v.Args[0] 26802 if v_0.Op != OpConst8 { 26803 break 26804 } 26805 d := v_0.AuxInt 26806 v_1 := v.Args[1] 26807 if v_1.Op != OpConst8 { 26808 break 26809 } 26810 c := v_1.AuxInt 26811 v.reset(OpConst8) 26812 v.AuxInt = int64(int8(c ^ d)) 26813 return true 26814 } 26815 // match: (Xor8 x x) 26816 // cond: 26817 // result: (Const8 [0]) 26818 for { 26819 _ = v.Args[1] 26820 x := v.Args[0] 26821 if x != v.Args[1] { 26822 break 26823 } 26824 v.reset(OpConst8) 26825 v.AuxInt = 0 26826 return true 26827 } 26828 // match: (Xor8 (Const8 [0]) x) 26829 // cond: 26830 // result: x 26831 for { 26832 _ = v.Args[1] 26833 v_0 := v.Args[0] 26834 if v_0.Op != OpConst8 { 26835 break 26836 } 26837 if v_0.AuxInt != 0 { 26838 break 26839 } 26840 x := v.Args[1] 26841 v.reset(OpCopy) 26842 v.Type = x.Type 26843 v.AddArg(x) 26844 return true 26845 } 26846 // match: (Xor8 x (Const8 [0])) 26847 // cond: 26848 // result: x 26849 for { 26850 _ = v.Args[1] 26851 x := v.Args[0] 26852 v_1 := v.Args[1] 26853 if v_1.Op != OpConst8 { 26854 break 26855 } 26856 if v_1.AuxInt != 0 { 26857 break 26858 } 26859 v.reset(OpCopy) 26860 v.Type = x.Type 26861 v.AddArg(x) 26862 return true 26863 } 26864 // match: (Xor8 x (Xor8 x y)) 26865 // cond: 26866 // result: y 26867 for { 26868 _ = v.Args[1] 26869 x := v.Args[0] 26870 v_1 := v.Args[1] 26871 if v_1.Op != OpXor8 { 26872 break 26873 } 26874 _ = v_1.Args[1] 26875 if x != v_1.Args[0] { 26876 break 26877 } 26878 y := v_1.Args[1] 26879 v.reset(OpCopy) 26880 v.Type = y.Type 26881 v.AddArg(y) 26882 return true 26883 } 26884 // match: (Xor8 x (Xor8 y x)) 26885 // cond: 26886 // result: y 26887 for { 26888 _ = v.Args[1] 26889 x := v.Args[0] 26890 v_1 := v.Args[1] 26891 if v_1.Op != OpXor8 { 26892 break 26893 } 26894 _ = v_1.Args[1] 26895 y := v_1.Args[0] 26896 if x != v_1.Args[1] { 26897 break 26898 } 26899 v.reset(OpCopy) 26900 v.Type = y.Type 26901 v.AddArg(y) 26902 return true 26903 } 26904 // match: (Xor8 (Xor8 x y) x) 26905 // cond: 26906 // result: y 26907 for { 26908 _ = v.Args[1] 26909 v_0 := v.Args[0] 26910 if v_0.Op != OpXor8 { 26911 break 26912 } 26913 _ = v_0.Args[1] 26914 x := v_0.Args[0] 26915 y := v_0.Args[1] 26916 if x != v.Args[1] { 26917 break 26918 } 26919 v.reset(OpCopy) 26920 v.Type = y.Type 26921 v.AddArg(y) 26922 return true 26923 } 26924 // match: (Xor8 (Xor8 y x) x) 26925 // cond: 26926 // result: y 26927 for { 26928 _ = v.Args[1] 26929 v_0 := v.Args[0] 26930 if v_0.Op != OpXor8 { 26931 break 26932 } 26933 _ = v_0.Args[1] 26934 y := v_0.Args[0] 26935 x := v_0.Args[1] 26936 if x != v.Args[1] { 26937 break 26938 } 26939 v.reset(OpCopy) 26940 v.Type = y.Type 26941 v.AddArg(y) 26942 return true 26943 } 26944 // match: (Xor8 (Xor8 i:(Const8 <t>) z) x) 26945 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26946 // result: (Xor8 i (Xor8 <t> z x)) 26947 for { 26948 _ = v.Args[1] 26949 v_0 := v.Args[0] 26950 if v_0.Op != OpXor8 { 26951 break 26952 } 26953 _ = v_0.Args[1] 26954 i := v_0.Args[0] 26955 if i.Op != OpConst8 { 26956 break 26957 } 26958 t := i.Type 26959 z := v_0.Args[1] 26960 x := v.Args[1] 26961 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26962 break 26963 } 26964 v.reset(OpXor8) 26965 v.AddArg(i) 26966 v0 := b.NewValue0(v.Pos, OpXor8, t) 26967 v0.AddArg(z) 26968 v0.AddArg(x) 26969 v.AddArg(v0) 26970 return true 26971 } 26972 return false 26973 } 26974 func rewriteValuegeneric_OpXor8_10(v *Value) bool { 26975 b := v.Block 26976 _ = b 26977 // match: (Xor8 (Xor8 z i:(Const8 <t>)) x) 26978 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26979 // result: (Xor8 i (Xor8 <t> z x)) 26980 for { 26981 _ = v.Args[1] 26982 v_0 := v.Args[0] 26983 if v_0.Op != OpXor8 { 26984 break 26985 } 26986 _ = v_0.Args[1] 26987 z := v_0.Args[0] 26988 i := v_0.Args[1] 26989 if i.Op != OpConst8 { 26990 break 26991 } 26992 t := i.Type 26993 x := v.Args[1] 26994 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26995 break 26996 } 26997 v.reset(OpXor8) 26998 v.AddArg(i) 26999 v0 := b.NewValue0(v.Pos, OpXor8, t) 27000 v0.AddArg(z) 27001 v0.AddArg(x) 27002 v.AddArg(v0) 27003 return true 27004 } 27005 // match: (Xor8 x (Xor8 i:(Const8 <t>) z)) 27006 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 27007 // result: (Xor8 i (Xor8 <t> z x)) 27008 for { 27009 _ = v.Args[1] 27010 x := v.Args[0] 27011 v_1 := v.Args[1] 27012 if v_1.Op != OpXor8 { 27013 break 27014 } 27015 _ = v_1.Args[1] 27016 i := v_1.Args[0] 27017 if i.Op != OpConst8 { 27018 break 27019 } 27020 t := i.Type 27021 z := v_1.Args[1] 27022 if !(z.Op != OpConst8 && x.Op != OpConst8) { 27023 break 27024 } 27025 v.reset(OpXor8) 27026 v.AddArg(i) 27027 v0 := b.NewValue0(v.Pos, OpXor8, t) 27028 v0.AddArg(z) 27029 v0.AddArg(x) 27030 v.AddArg(v0) 27031 return true 27032 } 27033 // match: (Xor8 x (Xor8 z i:(Const8 <t>))) 27034 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 27035 // result: (Xor8 i (Xor8 <t> z x)) 27036 for { 27037 _ = v.Args[1] 27038 x := v.Args[0] 27039 v_1 := v.Args[1] 27040 if v_1.Op != OpXor8 { 27041 break 27042 } 27043 _ = v_1.Args[1] 27044 z := v_1.Args[0] 27045 i := v_1.Args[1] 27046 if i.Op != OpConst8 { 27047 break 27048 } 27049 t := i.Type 27050 if !(z.Op != OpConst8 && x.Op != OpConst8) { 27051 break 27052 } 27053 v.reset(OpXor8) 27054 v.AddArg(i) 27055 v0 := b.NewValue0(v.Pos, OpXor8, t) 27056 v0.AddArg(z) 27057 v0.AddArg(x) 27058 v.AddArg(v0) 27059 return true 27060 } 27061 // match: (Xor8 (Const8 <t> [c]) (Xor8 (Const8 <t> [d]) x)) 27062 // cond: 27063 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 27064 for { 27065 _ = v.Args[1] 27066 v_0 := v.Args[0] 27067 if v_0.Op != OpConst8 { 27068 break 27069 } 27070 t := v_0.Type 27071 c := v_0.AuxInt 27072 v_1 := v.Args[1] 27073 if v_1.Op != OpXor8 { 27074 break 27075 } 27076 _ = v_1.Args[1] 27077 v_1_0 := v_1.Args[0] 27078 if v_1_0.Op != OpConst8 { 27079 break 27080 } 27081 if v_1_0.Type != t { 27082 break 27083 } 27084 d := v_1_0.AuxInt 27085 x := v_1.Args[1] 27086 v.reset(OpXor8) 27087 v0 := b.NewValue0(v.Pos, OpConst8, t) 27088 v0.AuxInt = int64(int8(c ^ d)) 27089 v.AddArg(v0) 27090 v.AddArg(x) 27091 return true 27092 } 27093 // match: (Xor8 (Const8 <t> [c]) (Xor8 x (Const8 <t> [d]))) 27094 // cond: 27095 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 27096 for { 27097 _ = v.Args[1] 27098 v_0 := v.Args[0] 27099 if v_0.Op != OpConst8 { 27100 break 27101 } 27102 t := v_0.Type 27103 c := v_0.AuxInt 27104 v_1 := v.Args[1] 27105 if v_1.Op != OpXor8 { 27106 break 27107 } 27108 _ = v_1.Args[1] 27109 x := v_1.Args[0] 27110 v_1_1 := v_1.Args[1] 27111 if v_1_1.Op != OpConst8 { 27112 break 27113 } 27114 if v_1_1.Type != t { 27115 break 27116 } 27117 d := v_1_1.AuxInt 27118 v.reset(OpXor8) 27119 v0 := b.NewValue0(v.Pos, OpConst8, t) 27120 v0.AuxInt = int64(int8(c ^ d)) 27121 v.AddArg(v0) 27122 v.AddArg(x) 27123 return true 27124 } 27125 // match: (Xor8 (Xor8 (Const8 <t> [d]) x) (Const8 <t> [c])) 27126 // cond: 27127 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 27128 for { 27129 _ = v.Args[1] 27130 v_0 := v.Args[0] 27131 if v_0.Op != OpXor8 { 27132 break 27133 } 27134 _ = v_0.Args[1] 27135 v_0_0 := v_0.Args[0] 27136 if v_0_0.Op != OpConst8 { 27137 break 27138 } 27139 t := v_0_0.Type 27140 d := v_0_0.AuxInt 27141 x := v_0.Args[1] 27142 v_1 := v.Args[1] 27143 if v_1.Op != OpConst8 { 27144 break 27145 } 27146 if v_1.Type != t { 27147 break 27148 } 27149 c := v_1.AuxInt 27150 v.reset(OpXor8) 27151 v0 := b.NewValue0(v.Pos, OpConst8, t) 27152 v0.AuxInt = int64(int8(c ^ d)) 27153 v.AddArg(v0) 27154 v.AddArg(x) 27155 return true 27156 } 27157 // match: (Xor8 (Xor8 x (Const8 <t> [d])) (Const8 <t> [c])) 27158 // cond: 27159 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 27160 for { 27161 _ = v.Args[1] 27162 v_0 := v.Args[0] 27163 if v_0.Op != OpXor8 { 27164 break 27165 } 27166 _ = v_0.Args[1] 27167 x := v_0.Args[0] 27168 v_0_1 := v_0.Args[1] 27169 if v_0_1.Op != OpConst8 { 27170 break 27171 } 27172 t := v_0_1.Type 27173 d := v_0_1.AuxInt 27174 v_1 := v.Args[1] 27175 if v_1.Op != OpConst8 { 27176 break 27177 } 27178 if v_1.Type != t { 27179 break 27180 } 27181 c := v_1.AuxInt 27182 v.reset(OpXor8) 27183 v0 := b.NewValue0(v.Pos, OpConst8, t) 27184 v0.AuxInt = int64(int8(c ^ d)) 27185 v.AddArg(v0) 27186 v.AddArg(x) 27187 return true 27188 } 27189 return false 27190 } 27191 func rewriteValuegeneric_OpZero_0(v *Value) bool { 27192 b := v.Block 27193 _ = b 27194 config := b.Func.Config 27195 _ = config 27196 // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) 27197 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 27198 // result: mem 27199 for { 27200 _ = v.Args[1] 27201 v_0 := v.Args[0] 27202 if v_0.Op != OpLoad { 27203 break 27204 } 27205 _ = v_0.Args[1] 27206 v_0_0 := v_0.Args[0] 27207 if v_0_0.Op != OpOffPtr { 27208 break 27209 } 27210 c := v_0_0.AuxInt 27211 v_0_0_0 := v_0_0.Args[0] 27212 if v_0_0_0.Op != OpSP { 27213 break 27214 } 27215 mem := v_0.Args[1] 27216 if mem != v.Args[1] { 27217 break 27218 } 27219 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 27220 break 27221 } 27222 v.reset(OpCopy) 27223 v.Type = mem.Type 27224 v.AddArg(mem) 27225 return true 27226 } 27227 return false 27228 } 27229 func rewriteValuegeneric_OpZeroExt16to32_0(v *Value) bool { 27230 // match: (ZeroExt16to32 (Const16 [c])) 27231 // cond: 27232 // result: (Const32 [int64(uint16(c))]) 27233 for { 27234 v_0 := v.Args[0] 27235 if v_0.Op != OpConst16 { 27236 break 27237 } 27238 c := v_0.AuxInt 27239 v.reset(OpConst32) 27240 v.AuxInt = int64(uint16(c)) 27241 return true 27242 } 27243 // match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s])))) 27244 // cond: s >= 16 27245 // result: x 27246 for { 27247 v_0 := v.Args[0] 27248 if v_0.Op != OpTrunc32to16 { 27249 break 27250 } 27251 x := v_0.Args[0] 27252 if x.Op != OpRsh32Ux64 { 27253 break 27254 } 27255 _ = x.Args[1] 27256 x_1 := x.Args[1] 27257 if x_1.Op != OpConst64 { 27258 break 27259 } 27260 s := x_1.AuxInt 27261 if !(s >= 16) { 27262 break 27263 } 27264 v.reset(OpCopy) 27265 v.Type = x.Type 27266 v.AddArg(x) 27267 return true 27268 } 27269 return false 27270 } 27271 func rewriteValuegeneric_OpZeroExt16to64_0(v *Value) bool { 27272 // match: (ZeroExt16to64 (Const16 [c])) 27273 // cond: 27274 // result: (Const64 [int64(uint16(c))]) 27275 for { 27276 v_0 := v.Args[0] 27277 if v_0.Op != OpConst16 { 27278 break 27279 } 27280 c := v_0.AuxInt 27281 v.reset(OpConst64) 27282 v.AuxInt = int64(uint16(c)) 27283 return true 27284 } 27285 // match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s])))) 27286 // cond: s >= 48 27287 // result: x 27288 for { 27289 v_0 := v.Args[0] 27290 if v_0.Op != OpTrunc64to16 { 27291 break 27292 } 27293 x := v_0.Args[0] 27294 if x.Op != OpRsh64Ux64 { 27295 break 27296 } 27297 _ = x.Args[1] 27298 x_1 := x.Args[1] 27299 if x_1.Op != OpConst64 { 27300 break 27301 } 27302 s := x_1.AuxInt 27303 if !(s >= 48) { 27304 break 27305 } 27306 v.reset(OpCopy) 27307 v.Type = x.Type 27308 v.AddArg(x) 27309 return true 27310 } 27311 return false 27312 } 27313 func rewriteValuegeneric_OpZeroExt32to64_0(v *Value) bool { 27314 // match: (ZeroExt32to64 (Const32 [c])) 27315 // cond: 27316 // result: (Const64 [int64(uint32(c))]) 27317 for { 27318 v_0 := v.Args[0] 27319 if v_0.Op != OpConst32 { 27320 break 27321 } 27322 c := v_0.AuxInt 27323 v.reset(OpConst64) 27324 v.AuxInt = int64(uint32(c)) 27325 return true 27326 } 27327 // match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s])))) 27328 // cond: s >= 32 27329 // result: x 27330 for { 27331 v_0 := v.Args[0] 27332 if v_0.Op != OpTrunc64to32 { 27333 break 27334 } 27335 x := v_0.Args[0] 27336 if x.Op != OpRsh64Ux64 { 27337 break 27338 } 27339 _ = x.Args[1] 27340 x_1 := x.Args[1] 27341 if x_1.Op != OpConst64 { 27342 break 27343 } 27344 s := x_1.AuxInt 27345 if !(s >= 32) { 27346 break 27347 } 27348 v.reset(OpCopy) 27349 v.Type = x.Type 27350 v.AddArg(x) 27351 return true 27352 } 27353 return false 27354 } 27355 func rewriteValuegeneric_OpZeroExt8to16_0(v *Value) bool { 27356 // match: (ZeroExt8to16 (Const8 [c])) 27357 // cond: 27358 // result: (Const16 [int64( uint8(c))]) 27359 for { 27360 v_0 := v.Args[0] 27361 if v_0.Op != OpConst8 { 27362 break 27363 } 27364 c := v_0.AuxInt 27365 v.reset(OpConst16) 27366 v.AuxInt = int64(uint8(c)) 27367 return true 27368 } 27369 // match: (ZeroExt8to16 (Trunc16to8 x:(Rsh16Ux64 _ (Const64 [s])))) 27370 // cond: s >= 8 27371 // result: x 27372 for { 27373 v_0 := v.Args[0] 27374 if v_0.Op != OpTrunc16to8 { 27375 break 27376 } 27377 x := v_0.Args[0] 27378 if x.Op != OpRsh16Ux64 { 27379 break 27380 } 27381 _ = x.Args[1] 27382 x_1 := x.Args[1] 27383 if x_1.Op != OpConst64 { 27384 break 27385 } 27386 s := x_1.AuxInt 27387 if !(s >= 8) { 27388 break 27389 } 27390 v.reset(OpCopy) 27391 v.Type = x.Type 27392 v.AddArg(x) 27393 return true 27394 } 27395 return false 27396 } 27397 func rewriteValuegeneric_OpZeroExt8to32_0(v *Value) bool { 27398 // match: (ZeroExt8to32 (Const8 [c])) 27399 // cond: 27400 // result: (Const32 [int64( uint8(c))]) 27401 for { 27402 v_0 := v.Args[0] 27403 if v_0.Op != OpConst8 { 27404 break 27405 } 27406 c := v_0.AuxInt 27407 v.reset(OpConst32) 27408 v.AuxInt = int64(uint8(c)) 27409 return true 27410 } 27411 // match: (ZeroExt8to32 (Trunc32to8 x:(Rsh32Ux64 _ (Const64 [s])))) 27412 // cond: s >= 24 27413 // result: x 27414 for { 27415 v_0 := v.Args[0] 27416 if v_0.Op != OpTrunc32to8 { 27417 break 27418 } 27419 x := v_0.Args[0] 27420 if x.Op != OpRsh32Ux64 { 27421 break 27422 } 27423 _ = x.Args[1] 27424 x_1 := x.Args[1] 27425 if x_1.Op != OpConst64 { 27426 break 27427 } 27428 s := x_1.AuxInt 27429 if !(s >= 24) { 27430 break 27431 } 27432 v.reset(OpCopy) 27433 v.Type = x.Type 27434 v.AddArg(x) 27435 return true 27436 } 27437 return false 27438 } 27439 func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { 27440 // match: (ZeroExt8to64 (Const8 [c])) 27441 // cond: 27442 // result: (Const64 [int64( uint8(c))]) 27443 for { 27444 v_0 := v.Args[0] 27445 if v_0.Op != OpConst8 { 27446 break 27447 } 27448 c := v_0.AuxInt 27449 v.reset(OpConst64) 27450 v.AuxInt = int64(uint8(c)) 27451 return true 27452 } 27453 // match: (ZeroExt8to64 (Trunc64to8 x:(Rsh64Ux64 _ (Const64 [s])))) 27454 // cond: s >= 56 27455 // result: x 27456 for { 27457 v_0 := v.Args[0] 27458 if v_0.Op != OpTrunc64to8 { 27459 break 27460 } 27461 x := v_0.Args[0] 27462 if x.Op != OpRsh64Ux64 { 27463 break 27464 } 27465 _ = x.Args[1] 27466 x_1 := x.Args[1] 27467 if x_1.Op != OpConst64 { 27468 break 27469 } 27470 s := x_1.AuxInt 27471 if !(s >= 56) { 27472 break 27473 } 27474 v.reset(OpCopy) 27475 v.Type = x.Type 27476 v.AddArg(x) 27477 return true 27478 } 27479 return false 27480 } 27481 func rewriteBlockgeneric(b *Block) bool { 27482 config := b.Func.Config 27483 _ = config 27484 fe := b.Func.fe 27485 _ = fe 27486 typ := &config.Types 27487 _ = typ 27488 switch b.Kind { 27489 case BlockIf: 27490 // match: (If (Not cond) yes no) 27491 // cond: 27492 // result: (If cond no yes) 27493 for { 27494 v := b.Control 27495 if v.Op != OpNot { 27496 break 27497 } 27498 cond := v.Args[0] 27499 b.Kind = BlockIf 27500 b.SetControl(cond) 27501 b.Aux = nil 27502 b.swapSuccessors() 27503 return true 27504 } 27505 // match: (If (ConstBool [c]) yes no) 27506 // cond: c == 1 27507 // result: (First nil yes no) 27508 for { 27509 v := b.Control 27510 if v.Op != OpConstBool { 27511 break 27512 } 27513 c := v.AuxInt 27514 if !(c == 1) { 27515 break 27516 } 27517 b.Kind = BlockFirst 27518 b.SetControl(nil) 27519 b.Aux = nil 27520 return true 27521 } 27522 // match: (If (ConstBool [c]) yes no) 27523 // cond: c == 0 27524 // result: (First nil no yes) 27525 for { 27526 v := b.Control 27527 if v.Op != OpConstBool { 27528 break 27529 } 27530 c := v.AuxInt 27531 if !(c == 0) { 27532 break 27533 } 27534 b.Kind = BlockFirst 27535 b.SetControl(nil) 27536 b.Aux = nil 27537 b.swapSuccessors() 27538 return true 27539 } 27540 } 27541 return false 27542 }