1 // Code generated from gen/dec64.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 rewriteValuedec64(v *Value) bool { 17 switch v.Op { 18 case OpAdd64: 19 return rewriteValuedec64_OpAdd64_0(v) 20 case OpAnd64: 21 return rewriteValuedec64_OpAnd64_0(v) 22 case OpArg: 23 return rewriteValuedec64_OpArg_0(v) 24 case OpBitLen64: 25 return rewriteValuedec64_OpBitLen64_0(v) 26 case OpBswap64: 27 return rewriteValuedec64_OpBswap64_0(v) 28 case OpCom64: 29 return rewriteValuedec64_OpCom64_0(v) 30 case OpConst64: 31 return rewriteValuedec64_OpConst64_0(v) 32 case OpCtz64: 33 return rewriteValuedec64_OpCtz64_0(v) 34 case OpEq64: 35 return rewriteValuedec64_OpEq64_0(v) 36 case OpGeq64: 37 return rewriteValuedec64_OpGeq64_0(v) 38 case OpGeq64U: 39 return rewriteValuedec64_OpGeq64U_0(v) 40 case OpGreater64: 41 return rewriteValuedec64_OpGreater64_0(v) 42 case OpGreater64U: 43 return rewriteValuedec64_OpGreater64U_0(v) 44 case OpInt64Hi: 45 return rewriteValuedec64_OpInt64Hi_0(v) 46 case OpInt64Lo: 47 return rewriteValuedec64_OpInt64Lo_0(v) 48 case OpLeq64: 49 return rewriteValuedec64_OpLeq64_0(v) 50 case OpLeq64U: 51 return rewriteValuedec64_OpLeq64U_0(v) 52 case OpLess64: 53 return rewriteValuedec64_OpLess64_0(v) 54 case OpLess64U: 55 return rewriteValuedec64_OpLess64U_0(v) 56 case OpLoad: 57 return rewriteValuedec64_OpLoad_0(v) 58 case OpLsh16x64: 59 return rewriteValuedec64_OpLsh16x64_0(v) 60 case OpLsh32x64: 61 return rewriteValuedec64_OpLsh32x64_0(v) 62 case OpLsh64x16: 63 return rewriteValuedec64_OpLsh64x16_0(v) 64 case OpLsh64x32: 65 return rewriteValuedec64_OpLsh64x32_0(v) 66 case OpLsh64x64: 67 return rewriteValuedec64_OpLsh64x64_0(v) 68 case OpLsh64x8: 69 return rewriteValuedec64_OpLsh64x8_0(v) 70 case OpLsh8x64: 71 return rewriteValuedec64_OpLsh8x64_0(v) 72 case OpMul64: 73 return rewriteValuedec64_OpMul64_0(v) 74 case OpNeg64: 75 return rewriteValuedec64_OpNeg64_0(v) 76 case OpNeq64: 77 return rewriteValuedec64_OpNeq64_0(v) 78 case OpOr64: 79 return rewriteValuedec64_OpOr64_0(v) 80 case OpRsh16Ux64: 81 return rewriteValuedec64_OpRsh16Ux64_0(v) 82 case OpRsh16x64: 83 return rewriteValuedec64_OpRsh16x64_0(v) 84 case OpRsh32Ux64: 85 return rewriteValuedec64_OpRsh32Ux64_0(v) 86 case OpRsh32x64: 87 return rewriteValuedec64_OpRsh32x64_0(v) 88 case OpRsh64Ux16: 89 return rewriteValuedec64_OpRsh64Ux16_0(v) 90 case OpRsh64Ux32: 91 return rewriteValuedec64_OpRsh64Ux32_0(v) 92 case OpRsh64Ux64: 93 return rewriteValuedec64_OpRsh64Ux64_0(v) 94 case OpRsh64Ux8: 95 return rewriteValuedec64_OpRsh64Ux8_0(v) 96 case OpRsh64x16: 97 return rewriteValuedec64_OpRsh64x16_0(v) 98 case OpRsh64x32: 99 return rewriteValuedec64_OpRsh64x32_0(v) 100 case OpRsh64x64: 101 return rewriteValuedec64_OpRsh64x64_0(v) 102 case OpRsh64x8: 103 return rewriteValuedec64_OpRsh64x8_0(v) 104 case OpRsh8Ux64: 105 return rewriteValuedec64_OpRsh8Ux64_0(v) 106 case OpRsh8x64: 107 return rewriteValuedec64_OpRsh8x64_0(v) 108 case OpSignExt16to64: 109 return rewriteValuedec64_OpSignExt16to64_0(v) 110 case OpSignExt32to64: 111 return rewriteValuedec64_OpSignExt32to64_0(v) 112 case OpSignExt8to64: 113 return rewriteValuedec64_OpSignExt8to64_0(v) 114 case OpStore: 115 return rewriteValuedec64_OpStore_0(v) 116 case OpSub64: 117 return rewriteValuedec64_OpSub64_0(v) 118 case OpTrunc64to16: 119 return rewriteValuedec64_OpTrunc64to16_0(v) 120 case OpTrunc64to32: 121 return rewriteValuedec64_OpTrunc64to32_0(v) 122 case OpTrunc64to8: 123 return rewriteValuedec64_OpTrunc64to8_0(v) 124 case OpXor64: 125 return rewriteValuedec64_OpXor64_0(v) 126 case OpZeroExt16to64: 127 return rewriteValuedec64_OpZeroExt16to64_0(v) 128 case OpZeroExt32to64: 129 return rewriteValuedec64_OpZeroExt32to64_0(v) 130 case OpZeroExt8to64: 131 return rewriteValuedec64_OpZeroExt8to64_0(v) 132 } 133 return false 134 } 135 func rewriteValuedec64_OpAdd64_0(v *Value) bool { 136 b := v.Block 137 _ = b 138 typ := &b.Func.Config.Types 139 _ = typ 140 // match: (Add64 x y) 141 // cond: 142 // result: (Int64Make (Add32withcarry <typ.Int32> (Int64Hi x) (Int64Hi y) (Select1 <types.TypeFlags> (Add32carry (Int64Lo x) (Int64Lo y)))) (Select0 <typ.UInt32> (Add32carry (Int64Lo x) (Int64Lo y)))) 143 for { 144 _ = v.Args[1] 145 x := v.Args[0] 146 y := v.Args[1] 147 v.reset(OpInt64Make) 148 v0 := b.NewValue0(v.Pos, OpAdd32withcarry, typ.Int32) 149 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 150 v1.AddArg(x) 151 v0.AddArg(v1) 152 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 153 v2.AddArg(y) 154 v0.AddArg(v2) 155 v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) 156 v4 := b.NewValue0(v.Pos, OpAdd32carry, types.NewTuple(typ.UInt32, types.TypeFlags)) 157 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 158 v5.AddArg(x) 159 v4.AddArg(v5) 160 v6 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 161 v6.AddArg(y) 162 v4.AddArg(v6) 163 v3.AddArg(v4) 164 v0.AddArg(v3) 165 v.AddArg(v0) 166 v7 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 167 v8 := b.NewValue0(v.Pos, OpAdd32carry, types.NewTuple(typ.UInt32, types.TypeFlags)) 168 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 169 v9.AddArg(x) 170 v8.AddArg(v9) 171 v10 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 172 v10.AddArg(y) 173 v8.AddArg(v10) 174 v7.AddArg(v8) 175 v.AddArg(v7) 176 return true 177 } 178 } 179 func rewriteValuedec64_OpAnd64_0(v *Value) bool { 180 b := v.Block 181 _ = b 182 typ := &b.Func.Config.Types 183 _ = typ 184 // match: (And64 x y) 185 // cond: 186 // result: (Int64Make (And32 <typ.UInt32> (Int64Hi x) (Int64Hi y)) (And32 <typ.UInt32> (Int64Lo x) (Int64Lo y))) 187 for { 188 _ = v.Args[1] 189 x := v.Args[0] 190 y := v.Args[1] 191 v.reset(OpInt64Make) 192 v0 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32) 193 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 194 v1.AddArg(x) 195 v0.AddArg(v1) 196 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 197 v2.AddArg(y) 198 v0.AddArg(v2) 199 v.AddArg(v0) 200 v3 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32) 201 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 202 v4.AddArg(x) 203 v3.AddArg(v4) 204 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 205 v5.AddArg(y) 206 v3.AddArg(v5) 207 v.AddArg(v3) 208 return true 209 } 210 } 211 func rewriteValuedec64_OpArg_0(v *Value) bool { 212 b := v.Block 213 _ = b 214 config := b.Func.Config 215 _ = config 216 typ := &b.Func.Config.Types 217 _ = typ 218 // match: (Arg {n} [off]) 219 // cond: is64BitInt(v.Type) && !config.BigEndian && v.Type.IsSigned() 220 // result: (Int64Make (Arg <typ.Int32> {n} [off+4]) (Arg <typ.UInt32> {n} [off])) 221 for { 222 off := v.AuxInt 223 n := v.Aux 224 if !(is64BitInt(v.Type) && !config.BigEndian && v.Type.IsSigned()) { 225 break 226 } 227 v.reset(OpInt64Make) 228 v0 := b.NewValue0(v.Pos, OpArg, typ.Int32) 229 v0.AuxInt = off + 4 230 v0.Aux = n 231 v.AddArg(v0) 232 v1 := b.NewValue0(v.Pos, OpArg, typ.UInt32) 233 v1.AuxInt = off 234 v1.Aux = n 235 v.AddArg(v1) 236 return true 237 } 238 // match: (Arg {n} [off]) 239 // cond: is64BitInt(v.Type) && !config.BigEndian && !v.Type.IsSigned() 240 // result: (Int64Make (Arg <typ.UInt32> {n} [off+4]) (Arg <typ.UInt32> {n} [off])) 241 for { 242 off := v.AuxInt 243 n := v.Aux 244 if !(is64BitInt(v.Type) && !config.BigEndian && !v.Type.IsSigned()) { 245 break 246 } 247 v.reset(OpInt64Make) 248 v0 := b.NewValue0(v.Pos, OpArg, typ.UInt32) 249 v0.AuxInt = off + 4 250 v0.Aux = n 251 v.AddArg(v0) 252 v1 := b.NewValue0(v.Pos, OpArg, typ.UInt32) 253 v1.AuxInt = off 254 v1.Aux = n 255 v.AddArg(v1) 256 return true 257 } 258 // match: (Arg {n} [off]) 259 // cond: is64BitInt(v.Type) && config.BigEndian && v.Type.IsSigned() 260 // result: (Int64Make (Arg <typ.Int32> {n} [off]) (Arg <typ.UInt32> {n} [off+4])) 261 for { 262 off := v.AuxInt 263 n := v.Aux 264 if !(is64BitInt(v.Type) && config.BigEndian && v.Type.IsSigned()) { 265 break 266 } 267 v.reset(OpInt64Make) 268 v0 := b.NewValue0(v.Pos, OpArg, typ.Int32) 269 v0.AuxInt = off 270 v0.Aux = n 271 v.AddArg(v0) 272 v1 := b.NewValue0(v.Pos, OpArg, typ.UInt32) 273 v1.AuxInt = off + 4 274 v1.Aux = n 275 v.AddArg(v1) 276 return true 277 } 278 // match: (Arg {n} [off]) 279 // cond: is64BitInt(v.Type) && config.BigEndian && !v.Type.IsSigned() 280 // result: (Int64Make (Arg <typ.UInt32> {n} [off]) (Arg <typ.UInt32> {n} [off+4])) 281 for { 282 off := v.AuxInt 283 n := v.Aux 284 if !(is64BitInt(v.Type) && config.BigEndian && !v.Type.IsSigned()) { 285 break 286 } 287 v.reset(OpInt64Make) 288 v0 := b.NewValue0(v.Pos, OpArg, typ.UInt32) 289 v0.AuxInt = off 290 v0.Aux = n 291 v.AddArg(v0) 292 v1 := b.NewValue0(v.Pos, OpArg, typ.UInt32) 293 v1.AuxInt = off + 4 294 v1.Aux = n 295 v.AddArg(v1) 296 return true 297 } 298 return false 299 } 300 func rewriteValuedec64_OpBitLen64_0(v *Value) bool { 301 b := v.Block 302 _ = b 303 typ := &b.Func.Config.Types 304 _ = typ 305 // match: (BitLen64 x) 306 // cond: 307 // result: (Add32 <typ.Int> (BitLen32 <typ.Int> (Int64Hi x)) (BitLen32 <typ.Int> (Or32 <typ.UInt32> (Int64Lo x) (Zeromask (Int64Hi x))))) 308 for { 309 x := v.Args[0] 310 v.reset(OpAdd32) 311 v.Type = typ.Int 312 v0 := b.NewValue0(v.Pos, OpBitLen32, typ.Int) 313 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 314 v1.AddArg(x) 315 v0.AddArg(v1) 316 v.AddArg(v0) 317 v2 := b.NewValue0(v.Pos, OpBitLen32, typ.Int) 318 v3 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 319 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 320 v4.AddArg(x) 321 v3.AddArg(v4) 322 v5 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 323 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 324 v6.AddArg(x) 325 v5.AddArg(v6) 326 v3.AddArg(v5) 327 v2.AddArg(v3) 328 v.AddArg(v2) 329 return true 330 } 331 } 332 func rewriteValuedec64_OpBswap64_0(v *Value) bool { 333 b := v.Block 334 _ = b 335 typ := &b.Func.Config.Types 336 _ = typ 337 // match: (Bswap64 x) 338 // cond: 339 // result: (Int64Make (Bswap32 <typ.UInt32> (Int64Lo x)) (Bswap32 <typ.UInt32> (Int64Hi x))) 340 for { 341 x := v.Args[0] 342 v.reset(OpInt64Make) 343 v0 := b.NewValue0(v.Pos, OpBswap32, typ.UInt32) 344 v1 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 345 v1.AddArg(x) 346 v0.AddArg(v1) 347 v.AddArg(v0) 348 v2 := b.NewValue0(v.Pos, OpBswap32, typ.UInt32) 349 v3 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 350 v3.AddArg(x) 351 v2.AddArg(v3) 352 v.AddArg(v2) 353 return true 354 } 355 } 356 func rewriteValuedec64_OpCom64_0(v *Value) bool { 357 b := v.Block 358 _ = b 359 typ := &b.Func.Config.Types 360 _ = typ 361 // match: (Com64 x) 362 // cond: 363 // result: (Int64Make (Com32 <typ.UInt32> (Int64Hi x)) (Com32 <typ.UInt32> (Int64Lo x))) 364 for { 365 x := v.Args[0] 366 v.reset(OpInt64Make) 367 v0 := b.NewValue0(v.Pos, OpCom32, typ.UInt32) 368 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 369 v1.AddArg(x) 370 v0.AddArg(v1) 371 v.AddArg(v0) 372 v2 := b.NewValue0(v.Pos, OpCom32, typ.UInt32) 373 v3 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 374 v3.AddArg(x) 375 v2.AddArg(v3) 376 v.AddArg(v2) 377 return true 378 } 379 } 380 func rewriteValuedec64_OpConst64_0(v *Value) bool { 381 b := v.Block 382 _ = b 383 typ := &b.Func.Config.Types 384 _ = typ 385 // match: (Const64 <t> [c]) 386 // cond: t.IsSigned() 387 // result: (Int64Make (Const32 <typ.Int32> [c>>32]) (Const32 <typ.UInt32> [int64(int32(c))])) 388 for { 389 t := v.Type 390 c := v.AuxInt 391 if !(t.IsSigned()) { 392 break 393 } 394 v.reset(OpInt64Make) 395 v0 := b.NewValue0(v.Pos, OpConst32, typ.Int32) 396 v0.AuxInt = c >> 32 397 v.AddArg(v0) 398 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 399 v1.AuxInt = int64(int32(c)) 400 v.AddArg(v1) 401 return true 402 } 403 // match: (Const64 <t> [c]) 404 // cond: !t.IsSigned() 405 // result: (Int64Make (Const32 <typ.UInt32> [c>>32]) (Const32 <typ.UInt32> [int64(int32(c))])) 406 for { 407 t := v.Type 408 c := v.AuxInt 409 if !(!t.IsSigned()) { 410 break 411 } 412 v.reset(OpInt64Make) 413 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 414 v0.AuxInt = c >> 32 415 v.AddArg(v0) 416 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 417 v1.AuxInt = int64(int32(c)) 418 v.AddArg(v1) 419 return true 420 } 421 return false 422 } 423 func rewriteValuedec64_OpCtz64_0(v *Value) bool { 424 b := v.Block 425 _ = b 426 typ := &b.Func.Config.Types 427 _ = typ 428 // match: (Ctz64 x) 429 // cond: 430 // result: (Add32 <typ.UInt32> (Ctz32 <typ.UInt32> (Int64Lo x)) (And32 <typ.UInt32> (Com32 <typ.UInt32> (Zeromask (Int64Lo x))) (Ctz32 <typ.UInt32> (Int64Hi x)))) 431 for { 432 x := v.Args[0] 433 v.reset(OpAdd32) 434 v.Type = typ.UInt32 435 v0 := b.NewValue0(v.Pos, OpCtz32, typ.UInt32) 436 v1 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 437 v1.AddArg(x) 438 v0.AddArg(v1) 439 v.AddArg(v0) 440 v2 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32) 441 v3 := b.NewValue0(v.Pos, OpCom32, typ.UInt32) 442 v4 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 443 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 444 v5.AddArg(x) 445 v4.AddArg(v5) 446 v3.AddArg(v4) 447 v2.AddArg(v3) 448 v6 := b.NewValue0(v.Pos, OpCtz32, typ.UInt32) 449 v7 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 450 v7.AddArg(x) 451 v6.AddArg(v7) 452 v2.AddArg(v6) 453 v.AddArg(v2) 454 return true 455 } 456 } 457 func rewriteValuedec64_OpEq64_0(v *Value) bool { 458 b := v.Block 459 _ = b 460 typ := &b.Func.Config.Types 461 _ = typ 462 // match: (Eq64 x y) 463 // cond: 464 // result: (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Eq32 (Int64Lo x) (Int64Lo y))) 465 for { 466 _ = v.Args[1] 467 x := v.Args[0] 468 y := v.Args[1] 469 v.reset(OpAndB) 470 v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 471 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 472 v1.AddArg(x) 473 v0.AddArg(v1) 474 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 475 v2.AddArg(y) 476 v0.AddArg(v2) 477 v.AddArg(v0) 478 v3 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 479 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 480 v4.AddArg(x) 481 v3.AddArg(v4) 482 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 483 v5.AddArg(y) 484 v3.AddArg(v5) 485 v.AddArg(v3) 486 return true 487 } 488 } 489 func rewriteValuedec64_OpGeq64_0(v *Value) bool { 490 b := v.Block 491 _ = b 492 typ := &b.Func.Config.Types 493 _ = typ 494 // match: (Geq64 x y) 495 // cond: 496 // result: (OrB (Greater32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Geq32U (Int64Lo x) (Int64Lo y)))) 497 for { 498 _ = v.Args[1] 499 x := v.Args[0] 500 y := v.Args[1] 501 v.reset(OpOrB) 502 v0 := b.NewValue0(v.Pos, OpGreater32, typ.Bool) 503 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 504 v1.AddArg(x) 505 v0.AddArg(v1) 506 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 507 v2.AddArg(y) 508 v0.AddArg(v2) 509 v.AddArg(v0) 510 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool) 511 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 512 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 513 v5.AddArg(x) 514 v4.AddArg(v5) 515 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 516 v6.AddArg(y) 517 v4.AddArg(v6) 518 v3.AddArg(v4) 519 v7 := b.NewValue0(v.Pos, OpGeq32U, typ.Bool) 520 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 521 v8.AddArg(x) 522 v7.AddArg(v8) 523 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 524 v9.AddArg(y) 525 v7.AddArg(v9) 526 v3.AddArg(v7) 527 v.AddArg(v3) 528 return true 529 } 530 } 531 func rewriteValuedec64_OpGeq64U_0(v *Value) bool { 532 b := v.Block 533 _ = b 534 typ := &b.Func.Config.Types 535 _ = typ 536 // match: (Geq64U x y) 537 // cond: 538 // result: (OrB (Greater32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Geq32U (Int64Lo x) (Int64Lo y)))) 539 for { 540 _ = v.Args[1] 541 x := v.Args[0] 542 y := v.Args[1] 543 v.reset(OpOrB) 544 v0 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool) 545 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 546 v1.AddArg(x) 547 v0.AddArg(v1) 548 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 549 v2.AddArg(y) 550 v0.AddArg(v2) 551 v.AddArg(v0) 552 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool) 553 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 554 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 555 v5.AddArg(x) 556 v4.AddArg(v5) 557 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 558 v6.AddArg(y) 559 v4.AddArg(v6) 560 v3.AddArg(v4) 561 v7 := b.NewValue0(v.Pos, OpGeq32U, typ.Bool) 562 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 563 v8.AddArg(x) 564 v7.AddArg(v8) 565 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 566 v9.AddArg(y) 567 v7.AddArg(v9) 568 v3.AddArg(v7) 569 v.AddArg(v3) 570 return true 571 } 572 } 573 func rewriteValuedec64_OpGreater64_0(v *Value) bool { 574 b := v.Block 575 _ = b 576 typ := &b.Func.Config.Types 577 _ = typ 578 // match: (Greater64 x y) 579 // cond: 580 // result: (OrB (Greater32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Greater32U (Int64Lo x) (Int64Lo y)))) 581 for { 582 _ = v.Args[1] 583 x := v.Args[0] 584 y := v.Args[1] 585 v.reset(OpOrB) 586 v0 := b.NewValue0(v.Pos, OpGreater32, typ.Bool) 587 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 588 v1.AddArg(x) 589 v0.AddArg(v1) 590 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 591 v2.AddArg(y) 592 v0.AddArg(v2) 593 v.AddArg(v0) 594 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool) 595 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 596 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 597 v5.AddArg(x) 598 v4.AddArg(v5) 599 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 600 v6.AddArg(y) 601 v4.AddArg(v6) 602 v3.AddArg(v4) 603 v7 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool) 604 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 605 v8.AddArg(x) 606 v7.AddArg(v8) 607 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 608 v9.AddArg(y) 609 v7.AddArg(v9) 610 v3.AddArg(v7) 611 v.AddArg(v3) 612 return true 613 } 614 } 615 func rewriteValuedec64_OpGreater64U_0(v *Value) bool { 616 b := v.Block 617 _ = b 618 typ := &b.Func.Config.Types 619 _ = typ 620 // match: (Greater64U x y) 621 // cond: 622 // result: (OrB (Greater32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Greater32U (Int64Lo x) (Int64Lo y)))) 623 for { 624 _ = v.Args[1] 625 x := v.Args[0] 626 y := v.Args[1] 627 v.reset(OpOrB) 628 v0 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool) 629 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 630 v1.AddArg(x) 631 v0.AddArg(v1) 632 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 633 v2.AddArg(y) 634 v0.AddArg(v2) 635 v.AddArg(v0) 636 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool) 637 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 638 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 639 v5.AddArg(x) 640 v4.AddArg(v5) 641 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 642 v6.AddArg(y) 643 v4.AddArg(v6) 644 v3.AddArg(v4) 645 v7 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool) 646 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 647 v8.AddArg(x) 648 v7.AddArg(v8) 649 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 650 v9.AddArg(y) 651 v7.AddArg(v9) 652 v3.AddArg(v7) 653 v.AddArg(v3) 654 return true 655 } 656 } 657 func rewriteValuedec64_OpInt64Hi_0(v *Value) bool { 658 // match: (Int64Hi (Int64Make hi _)) 659 // cond: 660 // result: hi 661 for { 662 v_0 := v.Args[0] 663 if v_0.Op != OpInt64Make { 664 break 665 } 666 _ = v_0.Args[1] 667 hi := v_0.Args[0] 668 v.reset(OpCopy) 669 v.Type = hi.Type 670 v.AddArg(hi) 671 return true 672 } 673 return false 674 } 675 func rewriteValuedec64_OpInt64Lo_0(v *Value) bool { 676 // match: (Int64Lo (Int64Make _ lo)) 677 // cond: 678 // result: lo 679 for { 680 v_0 := v.Args[0] 681 if v_0.Op != OpInt64Make { 682 break 683 } 684 _ = v_0.Args[1] 685 lo := v_0.Args[1] 686 v.reset(OpCopy) 687 v.Type = lo.Type 688 v.AddArg(lo) 689 return true 690 } 691 return false 692 } 693 func rewriteValuedec64_OpLeq64_0(v *Value) bool { 694 b := v.Block 695 _ = b 696 typ := &b.Func.Config.Types 697 _ = typ 698 // match: (Leq64 x y) 699 // cond: 700 // result: (OrB (Less32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Leq32U (Int64Lo x) (Int64Lo y)))) 701 for { 702 _ = v.Args[1] 703 x := v.Args[0] 704 y := v.Args[1] 705 v.reset(OpOrB) 706 v0 := b.NewValue0(v.Pos, OpLess32, typ.Bool) 707 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 708 v1.AddArg(x) 709 v0.AddArg(v1) 710 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 711 v2.AddArg(y) 712 v0.AddArg(v2) 713 v.AddArg(v0) 714 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool) 715 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 716 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 717 v5.AddArg(x) 718 v4.AddArg(v5) 719 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 720 v6.AddArg(y) 721 v4.AddArg(v6) 722 v3.AddArg(v4) 723 v7 := b.NewValue0(v.Pos, OpLeq32U, typ.Bool) 724 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 725 v8.AddArg(x) 726 v7.AddArg(v8) 727 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 728 v9.AddArg(y) 729 v7.AddArg(v9) 730 v3.AddArg(v7) 731 v.AddArg(v3) 732 return true 733 } 734 } 735 func rewriteValuedec64_OpLeq64U_0(v *Value) bool { 736 b := v.Block 737 _ = b 738 typ := &b.Func.Config.Types 739 _ = typ 740 // match: (Leq64U x y) 741 // cond: 742 // result: (OrB (Less32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Leq32U (Int64Lo x) (Int64Lo y)))) 743 for { 744 _ = v.Args[1] 745 x := v.Args[0] 746 y := v.Args[1] 747 v.reset(OpOrB) 748 v0 := b.NewValue0(v.Pos, OpLess32U, typ.Bool) 749 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 750 v1.AddArg(x) 751 v0.AddArg(v1) 752 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 753 v2.AddArg(y) 754 v0.AddArg(v2) 755 v.AddArg(v0) 756 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool) 757 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 758 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 759 v5.AddArg(x) 760 v4.AddArg(v5) 761 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 762 v6.AddArg(y) 763 v4.AddArg(v6) 764 v3.AddArg(v4) 765 v7 := b.NewValue0(v.Pos, OpLeq32U, typ.Bool) 766 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 767 v8.AddArg(x) 768 v7.AddArg(v8) 769 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 770 v9.AddArg(y) 771 v7.AddArg(v9) 772 v3.AddArg(v7) 773 v.AddArg(v3) 774 return true 775 } 776 } 777 func rewriteValuedec64_OpLess64_0(v *Value) bool { 778 b := v.Block 779 _ = b 780 typ := &b.Func.Config.Types 781 _ = typ 782 // match: (Less64 x y) 783 // cond: 784 // result: (OrB (Less32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Less32U (Int64Lo x) (Int64Lo y)))) 785 for { 786 _ = v.Args[1] 787 x := v.Args[0] 788 y := v.Args[1] 789 v.reset(OpOrB) 790 v0 := b.NewValue0(v.Pos, OpLess32, typ.Bool) 791 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 792 v1.AddArg(x) 793 v0.AddArg(v1) 794 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 795 v2.AddArg(y) 796 v0.AddArg(v2) 797 v.AddArg(v0) 798 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool) 799 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 800 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 801 v5.AddArg(x) 802 v4.AddArg(v5) 803 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 804 v6.AddArg(y) 805 v4.AddArg(v6) 806 v3.AddArg(v4) 807 v7 := b.NewValue0(v.Pos, OpLess32U, typ.Bool) 808 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 809 v8.AddArg(x) 810 v7.AddArg(v8) 811 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 812 v9.AddArg(y) 813 v7.AddArg(v9) 814 v3.AddArg(v7) 815 v.AddArg(v3) 816 return true 817 } 818 } 819 func rewriteValuedec64_OpLess64U_0(v *Value) bool { 820 b := v.Block 821 _ = b 822 typ := &b.Func.Config.Types 823 _ = typ 824 // match: (Less64U x y) 825 // cond: 826 // result: (OrB (Less32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Less32U (Int64Lo x) (Int64Lo y)))) 827 for { 828 _ = v.Args[1] 829 x := v.Args[0] 830 y := v.Args[1] 831 v.reset(OpOrB) 832 v0 := b.NewValue0(v.Pos, OpLess32U, typ.Bool) 833 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 834 v1.AddArg(x) 835 v0.AddArg(v1) 836 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 837 v2.AddArg(y) 838 v0.AddArg(v2) 839 v.AddArg(v0) 840 v3 := b.NewValue0(v.Pos, OpAndB, typ.Bool) 841 v4 := b.NewValue0(v.Pos, OpEq32, typ.Bool) 842 v5 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 843 v5.AddArg(x) 844 v4.AddArg(v5) 845 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 846 v6.AddArg(y) 847 v4.AddArg(v6) 848 v3.AddArg(v4) 849 v7 := b.NewValue0(v.Pos, OpLess32U, typ.Bool) 850 v8 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 851 v8.AddArg(x) 852 v7.AddArg(v8) 853 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 854 v9.AddArg(y) 855 v7.AddArg(v9) 856 v3.AddArg(v7) 857 v.AddArg(v3) 858 return true 859 } 860 } 861 func rewriteValuedec64_OpLoad_0(v *Value) bool { 862 b := v.Block 863 _ = b 864 config := b.Func.Config 865 _ = config 866 typ := &b.Func.Config.Types 867 _ = typ 868 // match: (Load <t> ptr mem) 869 // cond: is64BitInt(t) && !config.BigEndian && t.IsSigned() 870 // result: (Int64Make (Load <typ.Int32> (OffPtr <typ.Int32Ptr> [4] ptr) mem) (Load <typ.UInt32> ptr mem)) 871 for { 872 t := v.Type 873 _ = v.Args[1] 874 ptr := v.Args[0] 875 mem := v.Args[1] 876 if !(is64BitInt(t) && !config.BigEndian && t.IsSigned()) { 877 break 878 } 879 v.reset(OpInt64Make) 880 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32) 881 v1 := b.NewValue0(v.Pos, OpOffPtr, typ.Int32Ptr) 882 v1.AuxInt = 4 883 v1.AddArg(ptr) 884 v0.AddArg(v1) 885 v0.AddArg(mem) 886 v.AddArg(v0) 887 v2 := b.NewValue0(v.Pos, OpLoad, typ.UInt32) 888 v2.AddArg(ptr) 889 v2.AddArg(mem) 890 v.AddArg(v2) 891 return true 892 } 893 // match: (Load <t> ptr mem) 894 // cond: is64BitInt(t) && !config.BigEndian && !t.IsSigned() 895 // result: (Int64Make (Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem) (Load <typ.UInt32> ptr mem)) 896 for { 897 t := v.Type 898 _ = v.Args[1] 899 ptr := v.Args[0] 900 mem := v.Args[1] 901 if !(is64BitInt(t) && !config.BigEndian && !t.IsSigned()) { 902 break 903 } 904 v.reset(OpInt64Make) 905 v0 := b.NewValue0(v.Pos, OpLoad, typ.UInt32) 906 v1 := b.NewValue0(v.Pos, OpOffPtr, typ.UInt32Ptr) 907 v1.AuxInt = 4 908 v1.AddArg(ptr) 909 v0.AddArg(v1) 910 v0.AddArg(mem) 911 v.AddArg(v0) 912 v2 := b.NewValue0(v.Pos, OpLoad, typ.UInt32) 913 v2.AddArg(ptr) 914 v2.AddArg(mem) 915 v.AddArg(v2) 916 return true 917 } 918 // match: (Load <t> ptr mem) 919 // cond: is64BitInt(t) && config.BigEndian && t.IsSigned() 920 // result: (Int64Make (Load <typ.Int32> ptr mem) (Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem)) 921 for { 922 t := v.Type 923 _ = v.Args[1] 924 ptr := v.Args[0] 925 mem := v.Args[1] 926 if !(is64BitInt(t) && config.BigEndian && t.IsSigned()) { 927 break 928 } 929 v.reset(OpInt64Make) 930 v0 := b.NewValue0(v.Pos, OpLoad, typ.Int32) 931 v0.AddArg(ptr) 932 v0.AddArg(mem) 933 v.AddArg(v0) 934 v1 := b.NewValue0(v.Pos, OpLoad, typ.UInt32) 935 v2 := b.NewValue0(v.Pos, OpOffPtr, typ.UInt32Ptr) 936 v2.AuxInt = 4 937 v2.AddArg(ptr) 938 v1.AddArg(v2) 939 v1.AddArg(mem) 940 v.AddArg(v1) 941 return true 942 } 943 // match: (Load <t> ptr mem) 944 // cond: is64BitInt(t) && config.BigEndian && !t.IsSigned() 945 // result: (Int64Make (Load <typ.UInt32> ptr mem) (Load <typ.UInt32> (OffPtr <typ.UInt32Ptr> [4] ptr) mem)) 946 for { 947 t := v.Type 948 _ = v.Args[1] 949 ptr := v.Args[0] 950 mem := v.Args[1] 951 if !(is64BitInt(t) && config.BigEndian && !t.IsSigned()) { 952 break 953 } 954 v.reset(OpInt64Make) 955 v0 := b.NewValue0(v.Pos, OpLoad, typ.UInt32) 956 v0.AddArg(ptr) 957 v0.AddArg(mem) 958 v.AddArg(v0) 959 v1 := b.NewValue0(v.Pos, OpLoad, typ.UInt32) 960 v2 := b.NewValue0(v.Pos, OpOffPtr, typ.UInt32Ptr) 961 v2.AuxInt = 4 962 v2.AddArg(ptr) 963 v1.AddArg(v2) 964 v1.AddArg(mem) 965 v.AddArg(v1) 966 return true 967 } 968 return false 969 } 970 func rewriteValuedec64_OpLsh16x64_0(v *Value) bool { 971 b := v.Block 972 _ = b 973 typ := &b.Func.Config.Types 974 _ = typ 975 // match: (Lsh16x64 _ (Int64Make (Const32 [c]) _)) 976 // cond: c != 0 977 // result: (Const32 [0]) 978 for { 979 _ = v.Args[1] 980 v_1 := v.Args[1] 981 if v_1.Op != OpInt64Make { 982 break 983 } 984 _ = v_1.Args[1] 985 v_1_0 := v_1.Args[0] 986 if v_1_0.Op != OpConst32 { 987 break 988 } 989 c := v_1_0.AuxInt 990 if !(c != 0) { 991 break 992 } 993 v.reset(OpConst32) 994 v.AuxInt = 0 995 return true 996 } 997 // match: (Lsh16x64 x (Int64Make (Const32 [0]) lo)) 998 // cond: 999 // result: (Lsh16x32 x lo) 1000 for { 1001 _ = v.Args[1] 1002 x := v.Args[0] 1003 v_1 := v.Args[1] 1004 if v_1.Op != OpInt64Make { 1005 break 1006 } 1007 _ = v_1.Args[1] 1008 v_1_0 := v_1.Args[0] 1009 if v_1_0.Op != OpConst32 { 1010 break 1011 } 1012 if v_1_0.AuxInt != 0 { 1013 break 1014 } 1015 lo := v_1.Args[1] 1016 v.reset(OpLsh16x32) 1017 v.AddArg(x) 1018 v.AddArg(lo) 1019 return true 1020 } 1021 // match: (Lsh16x64 x (Int64Make hi lo)) 1022 // cond: hi.Op != OpConst32 1023 // result: (Lsh16x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 1024 for { 1025 _ = v.Args[1] 1026 x := v.Args[0] 1027 v_1 := v.Args[1] 1028 if v_1.Op != OpInt64Make { 1029 break 1030 } 1031 _ = v_1.Args[1] 1032 hi := v_1.Args[0] 1033 lo := v_1.Args[1] 1034 if !(hi.Op != OpConst32) { 1035 break 1036 } 1037 v.reset(OpLsh16x32) 1038 v.AddArg(x) 1039 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1040 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 1041 v1.AddArg(hi) 1042 v0.AddArg(v1) 1043 v0.AddArg(lo) 1044 v.AddArg(v0) 1045 return true 1046 } 1047 return false 1048 } 1049 func rewriteValuedec64_OpLsh32x64_0(v *Value) bool { 1050 b := v.Block 1051 _ = b 1052 typ := &b.Func.Config.Types 1053 _ = typ 1054 // match: (Lsh32x64 _ (Int64Make (Const32 [c]) _)) 1055 // cond: c != 0 1056 // result: (Const32 [0]) 1057 for { 1058 _ = v.Args[1] 1059 v_1 := v.Args[1] 1060 if v_1.Op != OpInt64Make { 1061 break 1062 } 1063 _ = v_1.Args[1] 1064 v_1_0 := v_1.Args[0] 1065 if v_1_0.Op != OpConst32 { 1066 break 1067 } 1068 c := v_1_0.AuxInt 1069 if !(c != 0) { 1070 break 1071 } 1072 v.reset(OpConst32) 1073 v.AuxInt = 0 1074 return true 1075 } 1076 // match: (Lsh32x64 x (Int64Make (Const32 [0]) lo)) 1077 // cond: 1078 // result: (Lsh32x32 x lo) 1079 for { 1080 _ = v.Args[1] 1081 x := v.Args[0] 1082 v_1 := v.Args[1] 1083 if v_1.Op != OpInt64Make { 1084 break 1085 } 1086 _ = v_1.Args[1] 1087 v_1_0 := v_1.Args[0] 1088 if v_1_0.Op != OpConst32 { 1089 break 1090 } 1091 if v_1_0.AuxInt != 0 { 1092 break 1093 } 1094 lo := v_1.Args[1] 1095 v.reset(OpLsh32x32) 1096 v.AddArg(x) 1097 v.AddArg(lo) 1098 return true 1099 } 1100 // match: (Lsh32x64 x (Int64Make hi lo)) 1101 // cond: hi.Op != OpConst32 1102 // result: (Lsh32x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 1103 for { 1104 _ = v.Args[1] 1105 x := v.Args[0] 1106 v_1 := v.Args[1] 1107 if v_1.Op != OpInt64Make { 1108 break 1109 } 1110 _ = v_1.Args[1] 1111 hi := v_1.Args[0] 1112 lo := v_1.Args[1] 1113 if !(hi.Op != OpConst32) { 1114 break 1115 } 1116 v.reset(OpLsh32x32) 1117 v.AddArg(x) 1118 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1119 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 1120 v1.AddArg(hi) 1121 v0.AddArg(v1) 1122 v0.AddArg(lo) 1123 v.AddArg(v0) 1124 return true 1125 } 1126 return false 1127 } 1128 func rewriteValuedec64_OpLsh64x16_0(v *Value) bool { 1129 b := v.Block 1130 _ = b 1131 typ := &b.Func.Config.Types 1132 _ = typ 1133 // match: (Lsh64x16 (Int64Make hi lo) s) 1134 // cond: 1135 // result: (Int64Make (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Lsh32x16 <typ.UInt32> hi s) (Rsh32Ux16 <typ.UInt32> lo (Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s))) (Lsh32x16 <typ.UInt32> lo (Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32])))) (Lsh32x16 <typ.UInt32> lo s)) 1136 for { 1137 _ = v.Args[1] 1138 v_0 := v.Args[0] 1139 if v_0.Op != OpInt64Make { 1140 break 1141 } 1142 _ = v_0.Args[1] 1143 hi := v_0.Args[0] 1144 lo := v_0.Args[1] 1145 s := v.Args[1] 1146 v.reset(OpInt64Make) 1147 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1148 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1149 v2 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32) 1150 v2.AddArg(hi) 1151 v2.AddArg(s) 1152 v1.AddArg(v2) 1153 v3 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32) 1154 v3.AddArg(lo) 1155 v4 := b.NewValue0(v.Pos, OpSub16, typ.UInt16) 1156 v5 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) 1157 v5.AuxInt = 32 1158 v4.AddArg(v5) 1159 v4.AddArg(s) 1160 v3.AddArg(v4) 1161 v1.AddArg(v3) 1162 v0.AddArg(v1) 1163 v6 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32) 1164 v6.AddArg(lo) 1165 v7 := b.NewValue0(v.Pos, OpSub16, typ.UInt16) 1166 v7.AddArg(s) 1167 v8 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) 1168 v8.AuxInt = 32 1169 v7.AddArg(v8) 1170 v6.AddArg(v7) 1171 v0.AddArg(v6) 1172 v.AddArg(v0) 1173 v9 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32) 1174 v9.AddArg(lo) 1175 v9.AddArg(s) 1176 v.AddArg(v9) 1177 return true 1178 } 1179 return false 1180 } 1181 func rewriteValuedec64_OpLsh64x32_0(v *Value) bool { 1182 b := v.Block 1183 _ = b 1184 typ := &b.Func.Config.Types 1185 _ = typ 1186 // match: (Lsh64x32 (Int64Make hi lo) s) 1187 // cond: 1188 // result: (Int64Make (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Lsh32x32 <typ.UInt32> hi s) (Rsh32Ux32 <typ.UInt32> lo (Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s))) (Lsh32x32 <typ.UInt32> lo (Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32])))) (Lsh32x32 <typ.UInt32> lo s)) 1189 for { 1190 _ = v.Args[1] 1191 v_0 := v.Args[0] 1192 if v_0.Op != OpInt64Make { 1193 break 1194 } 1195 _ = v_0.Args[1] 1196 hi := v_0.Args[0] 1197 lo := v_0.Args[1] 1198 s := v.Args[1] 1199 v.reset(OpInt64Make) 1200 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1201 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1202 v2 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32) 1203 v2.AddArg(hi) 1204 v2.AddArg(s) 1205 v1.AddArg(v2) 1206 v3 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32) 1207 v3.AddArg(lo) 1208 v4 := b.NewValue0(v.Pos, OpSub32, typ.UInt32) 1209 v5 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 1210 v5.AuxInt = 32 1211 v4.AddArg(v5) 1212 v4.AddArg(s) 1213 v3.AddArg(v4) 1214 v1.AddArg(v3) 1215 v0.AddArg(v1) 1216 v6 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32) 1217 v6.AddArg(lo) 1218 v7 := b.NewValue0(v.Pos, OpSub32, typ.UInt32) 1219 v7.AddArg(s) 1220 v8 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 1221 v8.AuxInt = 32 1222 v7.AddArg(v8) 1223 v6.AddArg(v7) 1224 v0.AddArg(v6) 1225 v.AddArg(v0) 1226 v9 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32) 1227 v9.AddArg(lo) 1228 v9.AddArg(s) 1229 v.AddArg(v9) 1230 return true 1231 } 1232 return false 1233 } 1234 func rewriteValuedec64_OpLsh64x64_0(v *Value) bool { 1235 b := v.Block 1236 _ = b 1237 typ := &b.Func.Config.Types 1238 _ = typ 1239 // match: (Lsh64x64 _ (Int64Make (Const32 [c]) _)) 1240 // cond: c != 0 1241 // result: (Const64 [0]) 1242 for { 1243 _ = v.Args[1] 1244 v_1 := v.Args[1] 1245 if v_1.Op != OpInt64Make { 1246 break 1247 } 1248 _ = v_1.Args[1] 1249 v_1_0 := v_1.Args[0] 1250 if v_1_0.Op != OpConst32 { 1251 break 1252 } 1253 c := v_1_0.AuxInt 1254 if !(c != 0) { 1255 break 1256 } 1257 v.reset(OpConst64) 1258 v.AuxInt = 0 1259 return true 1260 } 1261 // match: (Lsh64x64 x (Int64Make (Const32 [0]) lo)) 1262 // cond: 1263 // result: (Lsh64x32 x lo) 1264 for { 1265 _ = v.Args[1] 1266 x := v.Args[0] 1267 v_1 := v.Args[1] 1268 if v_1.Op != OpInt64Make { 1269 break 1270 } 1271 _ = v_1.Args[1] 1272 v_1_0 := v_1.Args[0] 1273 if v_1_0.Op != OpConst32 { 1274 break 1275 } 1276 if v_1_0.AuxInt != 0 { 1277 break 1278 } 1279 lo := v_1.Args[1] 1280 v.reset(OpLsh64x32) 1281 v.AddArg(x) 1282 v.AddArg(lo) 1283 return true 1284 } 1285 // match: (Lsh64x64 x (Int64Make hi lo)) 1286 // cond: hi.Op != OpConst32 1287 // result: (Lsh64x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 1288 for { 1289 _ = v.Args[1] 1290 x := v.Args[0] 1291 v_1 := v.Args[1] 1292 if v_1.Op != OpInt64Make { 1293 break 1294 } 1295 _ = v_1.Args[1] 1296 hi := v_1.Args[0] 1297 lo := v_1.Args[1] 1298 if !(hi.Op != OpConst32) { 1299 break 1300 } 1301 v.reset(OpLsh64x32) 1302 v.AddArg(x) 1303 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1304 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 1305 v1.AddArg(hi) 1306 v0.AddArg(v1) 1307 v0.AddArg(lo) 1308 v.AddArg(v0) 1309 return true 1310 } 1311 return false 1312 } 1313 func rewriteValuedec64_OpLsh64x8_0(v *Value) bool { 1314 b := v.Block 1315 _ = b 1316 typ := &b.Func.Config.Types 1317 _ = typ 1318 // match: (Lsh64x8 (Int64Make hi lo) s) 1319 // cond: 1320 // result: (Int64Make (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Lsh32x8 <typ.UInt32> hi s) (Rsh32Ux8 <typ.UInt32> lo (Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s))) (Lsh32x8 <typ.UInt32> lo (Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32])))) (Lsh32x8 <typ.UInt32> lo s)) 1321 for { 1322 _ = v.Args[1] 1323 v_0 := v.Args[0] 1324 if v_0.Op != OpInt64Make { 1325 break 1326 } 1327 _ = v_0.Args[1] 1328 hi := v_0.Args[0] 1329 lo := v_0.Args[1] 1330 s := v.Args[1] 1331 v.reset(OpInt64Make) 1332 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1333 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1334 v2 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32) 1335 v2.AddArg(hi) 1336 v2.AddArg(s) 1337 v1.AddArg(v2) 1338 v3 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32) 1339 v3.AddArg(lo) 1340 v4 := b.NewValue0(v.Pos, OpSub8, typ.UInt8) 1341 v5 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) 1342 v5.AuxInt = 32 1343 v4.AddArg(v5) 1344 v4.AddArg(s) 1345 v3.AddArg(v4) 1346 v1.AddArg(v3) 1347 v0.AddArg(v1) 1348 v6 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32) 1349 v6.AddArg(lo) 1350 v7 := b.NewValue0(v.Pos, OpSub8, typ.UInt8) 1351 v7.AddArg(s) 1352 v8 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) 1353 v8.AuxInt = 32 1354 v7.AddArg(v8) 1355 v6.AddArg(v7) 1356 v0.AddArg(v6) 1357 v.AddArg(v0) 1358 v9 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32) 1359 v9.AddArg(lo) 1360 v9.AddArg(s) 1361 v.AddArg(v9) 1362 return true 1363 } 1364 return false 1365 } 1366 func rewriteValuedec64_OpLsh8x64_0(v *Value) bool { 1367 b := v.Block 1368 _ = b 1369 typ := &b.Func.Config.Types 1370 _ = typ 1371 // match: (Lsh8x64 _ (Int64Make (Const32 [c]) _)) 1372 // cond: c != 0 1373 // result: (Const32 [0]) 1374 for { 1375 _ = v.Args[1] 1376 v_1 := v.Args[1] 1377 if v_1.Op != OpInt64Make { 1378 break 1379 } 1380 _ = v_1.Args[1] 1381 v_1_0 := v_1.Args[0] 1382 if v_1_0.Op != OpConst32 { 1383 break 1384 } 1385 c := v_1_0.AuxInt 1386 if !(c != 0) { 1387 break 1388 } 1389 v.reset(OpConst32) 1390 v.AuxInt = 0 1391 return true 1392 } 1393 // match: (Lsh8x64 x (Int64Make (Const32 [0]) lo)) 1394 // cond: 1395 // result: (Lsh8x32 x lo) 1396 for { 1397 _ = v.Args[1] 1398 x := v.Args[0] 1399 v_1 := v.Args[1] 1400 if v_1.Op != OpInt64Make { 1401 break 1402 } 1403 _ = v_1.Args[1] 1404 v_1_0 := v_1.Args[0] 1405 if v_1_0.Op != OpConst32 { 1406 break 1407 } 1408 if v_1_0.AuxInt != 0 { 1409 break 1410 } 1411 lo := v_1.Args[1] 1412 v.reset(OpLsh8x32) 1413 v.AddArg(x) 1414 v.AddArg(lo) 1415 return true 1416 } 1417 // match: (Lsh8x64 x (Int64Make hi lo)) 1418 // cond: hi.Op != OpConst32 1419 // result: (Lsh8x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 1420 for { 1421 _ = v.Args[1] 1422 x := v.Args[0] 1423 v_1 := v.Args[1] 1424 if v_1.Op != OpInt64Make { 1425 break 1426 } 1427 _ = v_1.Args[1] 1428 hi := v_1.Args[0] 1429 lo := v_1.Args[1] 1430 if !(hi.Op != OpConst32) { 1431 break 1432 } 1433 v.reset(OpLsh8x32) 1434 v.AddArg(x) 1435 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1436 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 1437 v1.AddArg(hi) 1438 v0.AddArg(v1) 1439 v0.AddArg(lo) 1440 v.AddArg(v0) 1441 return true 1442 } 1443 return false 1444 } 1445 func rewriteValuedec64_OpMul64_0(v *Value) bool { 1446 b := v.Block 1447 _ = b 1448 typ := &b.Func.Config.Types 1449 _ = typ 1450 // match: (Mul64 x y) 1451 // cond: 1452 // result: (Int64Make (Add32 <typ.UInt32> (Mul32 <typ.UInt32> (Int64Lo x) (Int64Hi y)) (Add32 <typ.UInt32> (Mul32 <typ.UInt32> (Int64Hi x) (Int64Lo y)) (Select0 <typ.UInt32> (Mul32uhilo (Int64Lo x) (Int64Lo y))))) (Select1 <typ.UInt32> (Mul32uhilo (Int64Lo x) (Int64Lo y)))) 1453 for { 1454 _ = v.Args[1] 1455 x := v.Args[0] 1456 y := v.Args[1] 1457 v.reset(OpInt64Make) 1458 v0 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) 1459 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 1460 v2 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1461 v2.AddArg(x) 1462 v1.AddArg(v2) 1463 v3 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 1464 v3.AddArg(y) 1465 v1.AddArg(v3) 1466 v0.AddArg(v1) 1467 v4 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) 1468 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 1469 v6 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 1470 v6.AddArg(x) 1471 v5.AddArg(v6) 1472 v7 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1473 v7.AddArg(y) 1474 v5.AddArg(v7) 1475 v4.AddArg(v5) 1476 v8 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 1477 v9 := b.NewValue0(v.Pos, OpMul32uhilo, types.NewTuple(typ.UInt32, typ.UInt32)) 1478 v10 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1479 v10.AddArg(x) 1480 v9.AddArg(v10) 1481 v11 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1482 v11.AddArg(y) 1483 v9.AddArg(v11) 1484 v8.AddArg(v9) 1485 v4.AddArg(v8) 1486 v0.AddArg(v4) 1487 v.AddArg(v0) 1488 v12 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) 1489 v13 := b.NewValue0(v.Pos, OpMul32uhilo, types.NewTuple(typ.UInt32, typ.UInt32)) 1490 v14 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1491 v14.AddArg(x) 1492 v13.AddArg(v14) 1493 v15 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1494 v15.AddArg(y) 1495 v13.AddArg(v15) 1496 v12.AddArg(v13) 1497 v.AddArg(v12) 1498 return true 1499 } 1500 } 1501 func rewriteValuedec64_OpNeg64_0(v *Value) bool { 1502 b := v.Block 1503 _ = b 1504 // match: (Neg64 <t> x) 1505 // cond: 1506 // result: (Sub64 (Const64 <t> [0]) x) 1507 for { 1508 t := v.Type 1509 x := v.Args[0] 1510 v.reset(OpSub64) 1511 v0 := b.NewValue0(v.Pos, OpConst64, t) 1512 v0.AuxInt = 0 1513 v.AddArg(v0) 1514 v.AddArg(x) 1515 return true 1516 } 1517 } 1518 func rewriteValuedec64_OpNeq64_0(v *Value) bool { 1519 b := v.Block 1520 _ = b 1521 typ := &b.Func.Config.Types 1522 _ = typ 1523 // match: (Neq64 x y) 1524 // cond: 1525 // result: (OrB (Neq32 (Int64Hi x) (Int64Hi y)) (Neq32 (Int64Lo x) (Int64Lo y))) 1526 for { 1527 _ = v.Args[1] 1528 x := v.Args[0] 1529 y := v.Args[1] 1530 v.reset(OpOrB) 1531 v0 := b.NewValue0(v.Pos, OpNeq32, typ.Bool) 1532 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 1533 v1.AddArg(x) 1534 v0.AddArg(v1) 1535 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 1536 v2.AddArg(y) 1537 v0.AddArg(v2) 1538 v.AddArg(v0) 1539 v3 := b.NewValue0(v.Pos, OpNeq32, typ.Bool) 1540 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1541 v4.AddArg(x) 1542 v3.AddArg(v4) 1543 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1544 v5.AddArg(y) 1545 v3.AddArg(v5) 1546 v.AddArg(v3) 1547 return true 1548 } 1549 } 1550 func rewriteValuedec64_OpOr64_0(v *Value) bool { 1551 b := v.Block 1552 _ = b 1553 typ := &b.Func.Config.Types 1554 _ = typ 1555 // match: (Or64 x y) 1556 // cond: 1557 // result: (Int64Make (Or32 <typ.UInt32> (Int64Hi x) (Int64Hi y)) (Or32 <typ.UInt32> (Int64Lo x) (Int64Lo y))) 1558 for { 1559 _ = v.Args[1] 1560 x := v.Args[0] 1561 y := v.Args[1] 1562 v.reset(OpInt64Make) 1563 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1564 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 1565 v1.AddArg(x) 1566 v0.AddArg(v1) 1567 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 1568 v2.AddArg(y) 1569 v0.AddArg(v2) 1570 v.AddArg(v0) 1571 v3 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1572 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1573 v4.AddArg(x) 1574 v3.AddArg(v4) 1575 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 1576 v5.AddArg(y) 1577 v3.AddArg(v5) 1578 v.AddArg(v3) 1579 return true 1580 } 1581 } 1582 func rewriteValuedec64_OpRsh16Ux64_0(v *Value) bool { 1583 b := v.Block 1584 _ = b 1585 typ := &b.Func.Config.Types 1586 _ = typ 1587 // match: (Rsh16Ux64 _ (Int64Make (Const32 [c]) _)) 1588 // cond: c != 0 1589 // result: (Const32 [0]) 1590 for { 1591 _ = v.Args[1] 1592 v_1 := v.Args[1] 1593 if v_1.Op != OpInt64Make { 1594 break 1595 } 1596 _ = v_1.Args[1] 1597 v_1_0 := v_1.Args[0] 1598 if v_1_0.Op != OpConst32 { 1599 break 1600 } 1601 c := v_1_0.AuxInt 1602 if !(c != 0) { 1603 break 1604 } 1605 v.reset(OpConst32) 1606 v.AuxInt = 0 1607 return true 1608 } 1609 // match: (Rsh16Ux64 x (Int64Make (Const32 [0]) lo)) 1610 // cond: 1611 // result: (Rsh16Ux32 x lo) 1612 for { 1613 _ = v.Args[1] 1614 x := v.Args[0] 1615 v_1 := v.Args[1] 1616 if v_1.Op != OpInt64Make { 1617 break 1618 } 1619 _ = v_1.Args[1] 1620 v_1_0 := v_1.Args[0] 1621 if v_1_0.Op != OpConst32 { 1622 break 1623 } 1624 if v_1_0.AuxInt != 0 { 1625 break 1626 } 1627 lo := v_1.Args[1] 1628 v.reset(OpRsh16Ux32) 1629 v.AddArg(x) 1630 v.AddArg(lo) 1631 return true 1632 } 1633 // match: (Rsh16Ux64 x (Int64Make hi lo)) 1634 // cond: hi.Op != OpConst32 1635 // result: (Rsh16Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 1636 for { 1637 _ = v.Args[1] 1638 x := v.Args[0] 1639 v_1 := v.Args[1] 1640 if v_1.Op != OpInt64Make { 1641 break 1642 } 1643 _ = v_1.Args[1] 1644 hi := v_1.Args[0] 1645 lo := v_1.Args[1] 1646 if !(hi.Op != OpConst32) { 1647 break 1648 } 1649 v.reset(OpRsh16Ux32) 1650 v.AddArg(x) 1651 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1652 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 1653 v1.AddArg(hi) 1654 v0.AddArg(v1) 1655 v0.AddArg(lo) 1656 v.AddArg(v0) 1657 return true 1658 } 1659 return false 1660 } 1661 func rewriteValuedec64_OpRsh16x64_0(v *Value) bool { 1662 b := v.Block 1663 _ = b 1664 typ := &b.Func.Config.Types 1665 _ = typ 1666 // match: (Rsh16x64 x (Int64Make (Const32 [c]) _)) 1667 // cond: c != 0 1668 // result: (Signmask (SignExt16to32 x)) 1669 for { 1670 _ = v.Args[1] 1671 x := v.Args[0] 1672 v_1 := v.Args[1] 1673 if v_1.Op != OpInt64Make { 1674 break 1675 } 1676 _ = v_1.Args[1] 1677 v_1_0 := v_1.Args[0] 1678 if v_1_0.Op != OpConst32 { 1679 break 1680 } 1681 c := v_1_0.AuxInt 1682 if !(c != 0) { 1683 break 1684 } 1685 v.reset(OpSignmask) 1686 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 1687 v0.AddArg(x) 1688 v.AddArg(v0) 1689 return true 1690 } 1691 // match: (Rsh16x64 x (Int64Make (Const32 [0]) lo)) 1692 // cond: 1693 // result: (Rsh16x32 x lo) 1694 for { 1695 _ = v.Args[1] 1696 x := v.Args[0] 1697 v_1 := v.Args[1] 1698 if v_1.Op != OpInt64Make { 1699 break 1700 } 1701 _ = v_1.Args[1] 1702 v_1_0 := v_1.Args[0] 1703 if v_1_0.Op != OpConst32 { 1704 break 1705 } 1706 if v_1_0.AuxInt != 0 { 1707 break 1708 } 1709 lo := v_1.Args[1] 1710 v.reset(OpRsh16x32) 1711 v.AddArg(x) 1712 v.AddArg(lo) 1713 return true 1714 } 1715 // match: (Rsh16x64 x (Int64Make hi lo)) 1716 // cond: hi.Op != OpConst32 1717 // result: (Rsh16x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 1718 for { 1719 _ = v.Args[1] 1720 x := v.Args[0] 1721 v_1 := v.Args[1] 1722 if v_1.Op != OpInt64Make { 1723 break 1724 } 1725 _ = v_1.Args[1] 1726 hi := v_1.Args[0] 1727 lo := v_1.Args[1] 1728 if !(hi.Op != OpConst32) { 1729 break 1730 } 1731 v.reset(OpRsh16x32) 1732 v.AddArg(x) 1733 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1734 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 1735 v1.AddArg(hi) 1736 v0.AddArg(v1) 1737 v0.AddArg(lo) 1738 v.AddArg(v0) 1739 return true 1740 } 1741 return false 1742 } 1743 func rewriteValuedec64_OpRsh32Ux64_0(v *Value) bool { 1744 b := v.Block 1745 _ = b 1746 typ := &b.Func.Config.Types 1747 _ = typ 1748 // match: (Rsh32Ux64 _ (Int64Make (Const32 [c]) _)) 1749 // cond: c != 0 1750 // result: (Const32 [0]) 1751 for { 1752 _ = v.Args[1] 1753 v_1 := v.Args[1] 1754 if v_1.Op != OpInt64Make { 1755 break 1756 } 1757 _ = v_1.Args[1] 1758 v_1_0 := v_1.Args[0] 1759 if v_1_0.Op != OpConst32 { 1760 break 1761 } 1762 c := v_1_0.AuxInt 1763 if !(c != 0) { 1764 break 1765 } 1766 v.reset(OpConst32) 1767 v.AuxInt = 0 1768 return true 1769 } 1770 // match: (Rsh32Ux64 x (Int64Make (Const32 [0]) lo)) 1771 // cond: 1772 // result: (Rsh32Ux32 x lo) 1773 for { 1774 _ = v.Args[1] 1775 x := v.Args[0] 1776 v_1 := v.Args[1] 1777 if v_1.Op != OpInt64Make { 1778 break 1779 } 1780 _ = v_1.Args[1] 1781 v_1_0 := v_1.Args[0] 1782 if v_1_0.Op != OpConst32 { 1783 break 1784 } 1785 if v_1_0.AuxInt != 0 { 1786 break 1787 } 1788 lo := v_1.Args[1] 1789 v.reset(OpRsh32Ux32) 1790 v.AddArg(x) 1791 v.AddArg(lo) 1792 return true 1793 } 1794 // match: (Rsh32Ux64 x (Int64Make hi lo)) 1795 // cond: hi.Op != OpConst32 1796 // result: (Rsh32Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 1797 for { 1798 _ = v.Args[1] 1799 x := v.Args[0] 1800 v_1 := v.Args[1] 1801 if v_1.Op != OpInt64Make { 1802 break 1803 } 1804 _ = v_1.Args[1] 1805 hi := v_1.Args[0] 1806 lo := v_1.Args[1] 1807 if !(hi.Op != OpConst32) { 1808 break 1809 } 1810 v.reset(OpRsh32Ux32) 1811 v.AddArg(x) 1812 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1813 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 1814 v1.AddArg(hi) 1815 v0.AddArg(v1) 1816 v0.AddArg(lo) 1817 v.AddArg(v0) 1818 return true 1819 } 1820 return false 1821 } 1822 func rewriteValuedec64_OpRsh32x64_0(v *Value) bool { 1823 b := v.Block 1824 _ = b 1825 typ := &b.Func.Config.Types 1826 _ = typ 1827 // match: (Rsh32x64 x (Int64Make (Const32 [c]) _)) 1828 // cond: c != 0 1829 // result: (Signmask x) 1830 for { 1831 _ = v.Args[1] 1832 x := v.Args[0] 1833 v_1 := v.Args[1] 1834 if v_1.Op != OpInt64Make { 1835 break 1836 } 1837 _ = v_1.Args[1] 1838 v_1_0 := v_1.Args[0] 1839 if v_1_0.Op != OpConst32 { 1840 break 1841 } 1842 c := v_1_0.AuxInt 1843 if !(c != 0) { 1844 break 1845 } 1846 v.reset(OpSignmask) 1847 v.AddArg(x) 1848 return true 1849 } 1850 // match: (Rsh32x64 x (Int64Make (Const32 [0]) lo)) 1851 // cond: 1852 // result: (Rsh32x32 x lo) 1853 for { 1854 _ = v.Args[1] 1855 x := v.Args[0] 1856 v_1 := v.Args[1] 1857 if v_1.Op != OpInt64Make { 1858 break 1859 } 1860 _ = v_1.Args[1] 1861 v_1_0 := v_1.Args[0] 1862 if v_1_0.Op != OpConst32 { 1863 break 1864 } 1865 if v_1_0.AuxInt != 0 { 1866 break 1867 } 1868 lo := v_1.Args[1] 1869 v.reset(OpRsh32x32) 1870 v.AddArg(x) 1871 v.AddArg(lo) 1872 return true 1873 } 1874 // match: (Rsh32x64 x (Int64Make hi lo)) 1875 // cond: hi.Op != OpConst32 1876 // result: (Rsh32x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 1877 for { 1878 _ = v.Args[1] 1879 x := v.Args[0] 1880 v_1 := v.Args[1] 1881 if v_1.Op != OpInt64Make { 1882 break 1883 } 1884 _ = v_1.Args[1] 1885 hi := v_1.Args[0] 1886 lo := v_1.Args[1] 1887 if !(hi.Op != OpConst32) { 1888 break 1889 } 1890 v.reset(OpRsh32x32) 1891 v.AddArg(x) 1892 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1893 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 1894 v1.AddArg(hi) 1895 v0.AddArg(v1) 1896 v0.AddArg(lo) 1897 v.AddArg(v0) 1898 return true 1899 } 1900 return false 1901 } 1902 func rewriteValuedec64_OpRsh64Ux16_0(v *Value) bool { 1903 b := v.Block 1904 _ = b 1905 typ := &b.Func.Config.Types 1906 _ = typ 1907 // match: (Rsh64Ux16 (Int64Make hi lo) s) 1908 // cond: 1909 // result: (Int64Make (Rsh32Ux16 <typ.UInt32> hi s) (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Rsh32Ux16 <typ.UInt32> lo s) (Lsh32x16 <typ.UInt32> hi (Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s))) (Rsh32Ux16 <typ.UInt32> hi (Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32]))))) 1910 for { 1911 _ = v.Args[1] 1912 v_0 := v.Args[0] 1913 if v_0.Op != OpInt64Make { 1914 break 1915 } 1916 _ = v_0.Args[1] 1917 hi := v_0.Args[0] 1918 lo := v_0.Args[1] 1919 s := v.Args[1] 1920 v.reset(OpInt64Make) 1921 v0 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32) 1922 v0.AddArg(hi) 1923 v0.AddArg(s) 1924 v.AddArg(v0) 1925 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1926 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1927 v3 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32) 1928 v3.AddArg(lo) 1929 v3.AddArg(s) 1930 v2.AddArg(v3) 1931 v4 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32) 1932 v4.AddArg(hi) 1933 v5 := b.NewValue0(v.Pos, OpSub16, typ.UInt16) 1934 v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) 1935 v6.AuxInt = 32 1936 v5.AddArg(v6) 1937 v5.AddArg(s) 1938 v4.AddArg(v5) 1939 v2.AddArg(v4) 1940 v1.AddArg(v2) 1941 v7 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32) 1942 v7.AddArg(hi) 1943 v8 := b.NewValue0(v.Pos, OpSub16, typ.UInt16) 1944 v8.AddArg(s) 1945 v9 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) 1946 v9.AuxInt = 32 1947 v8.AddArg(v9) 1948 v7.AddArg(v8) 1949 v1.AddArg(v7) 1950 v.AddArg(v1) 1951 return true 1952 } 1953 return false 1954 } 1955 func rewriteValuedec64_OpRsh64Ux32_0(v *Value) bool { 1956 b := v.Block 1957 _ = b 1958 typ := &b.Func.Config.Types 1959 _ = typ 1960 // match: (Rsh64Ux32 (Int64Make hi lo) s) 1961 // cond: 1962 // result: (Int64Make (Rsh32Ux32 <typ.UInt32> hi s) (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Rsh32Ux32 <typ.UInt32> lo s) (Lsh32x32 <typ.UInt32> hi (Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s))) (Rsh32Ux32 <typ.UInt32> hi (Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32]))))) 1963 for { 1964 _ = v.Args[1] 1965 v_0 := v.Args[0] 1966 if v_0.Op != OpInt64Make { 1967 break 1968 } 1969 _ = v_0.Args[1] 1970 hi := v_0.Args[0] 1971 lo := v_0.Args[1] 1972 s := v.Args[1] 1973 v.reset(OpInt64Make) 1974 v0 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32) 1975 v0.AddArg(hi) 1976 v0.AddArg(s) 1977 v.AddArg(v0) 1978 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1979 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 1980 v3 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32) 1981 v3.AddArg(lo) 1982 v3.AddArg(s) 1983 v2.AddArg(v3) 1984 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32) 1985 v4.AddArg(hi) 1986 v5 := b.NewValue0(v.Pos, OpSub32, typ.UInt32) 1987 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 1988 v6.AuxInt = 32 1989 v5.AddArg(v6) 1990 v5.AddArg(s) 1991 v4.AddArg(v5) 1992 v2.AddArg(v4) 1993 v1.AddArg(v2) 1994 v7 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32) 1995 v7.AddArg(hi) 1996 v8 := b.NewValue0(v.Pos, OpSub32, typ.UInt32) 1997 v8.AddArg(s) 1998 v9 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 1999 v9.AuxInt = 32 2000 v8.AddArg(v9) 2001 v7.AddArg(v8) 2002 v1.AddArg(v7) 2003 v.AddArg(v1) 2004 return true 2005 } 2006 return false 2007 } 2008 func rewriteValuedec64_OpRsh64Ux64_0(v *Value) bool { 2009 b := v.Block 2010 _ = b 2011 typ := &b.Func.Config.Types 2012 _ = typ 2013 // match: (Rsh64Ux64 _ (Int64Make (Const32 [c]) _)) 2014 // cond: c != 0 2015 // result: (Const64 [0]) 2016 for { 2017 _ = v.Args[1] 2018 v_1 := v.Args[1] 2019 if v_1.Op != OpInt64Make { 2020 break 2021 } 2022 _ = v_1.Args[1] 2023 v_1_0 := v_1.Args[0] 2024 if v_1_0.Op != OpConst32 { 2025 break 2026 } 2027 c := v_1_0.AuxInt 2028 if !(c != 0) { 2029 break 2030 } 2031 v.reset(OpConst64) 2032 v.AuxInt = 0 2033 return true 2034 } 2035 // match: (Rsh64Ux64 x (Int64Make (Const32 [0]) lo)) 2036 // cond: 2037 // result: (Rsh64Ux32 x lo) 2038 for { 2039 _ = v.Args[1] 2040 x := v.Args[0] 2041 v_1 := v.Args[1] 2042 if v_1.Op != OpInt64Make { 2043 break 2044 } 2045 _ = v_1.Args[1] 2046 v_1_0 := v_1.Args[0] 2047 if v_1_0.Op != OpConst32 { 2048 break 2049 } 2050 if v_1_0.AuxInt != 0 { 2051 break 2052 } 2053 lo := v_1.Args[1] 2054 v.reset(OpRsh64Ux32) 2055 v.AddArg(x) 2056 v.AddArg(lo) 2057 return true 2058 } 2059 // match: (Rsh64Ux64 x (Int64Make hi lo)) 2060 // cond: hi.Op != OpConst32 2061 // result: (Rsh64Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 2062 for { 2063 _ = v.Args[1] 2064 x := v.Args[0] 2065 v_1 := v.Args[1] 2066 if v_1.Op != OpInt64Make { 2067 break 2068 } 2069 _ = v_1.Args[1] 2070 hi := v_1.Args[0] 2071 lo := v_1.Args[1] 2072 if !(hi.Op != OpConst32) { 2073 break 2074 } 2075 v.reset(OpRsh64Ux32) 2076 v.AddArg(x) 2077 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2078 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 2079 v1.AddArg(hi) 2080 v0.AddArg(v1) 2081 v0.AddArg(lo) 2082 v.AddArg(v0) 2083 return true 2084 } 2085 return false 2086 } 2087 func rewriteValuedec64_OpRsh64Ux8_0(v *Value) bool { 2088 b := v.Block 2089 _ = b 2090 typ := &b.Func.Config.Types 2091 _ = typ 2092 // match: (Rsh64Ux8 (Int64Make hi lo) s) 2093 // cond: 2094 // result: (Int64Make (Rsh32Ux8 <typ.UInt32> hi s) (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Rsh32Ux8 <typ.UInt32> lo s) (Lsh32x8 <typ.UInt32> hi (Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s))) (Rsh32Ux8 <typ.UInt32> hi (Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32]))))) 2095 for { 2096 _ = v.Args[1] 2097 v_0 := v.Args[0] 2098 if v_0.Op != OpInt64Make { 2099 break 2100 } 2101 _ = v_0.Args[1] 2102 hi := v_0.Args[0] 2103 lo := v_0.Args[1] 2104 s := v.Args[1] 2105 v.reset(OpInt64Make) 2106 v0 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32) 2107 v0.AddArg(hi) 2108 v0.AddArg(s) 2109 v.AddArg(v0) 2110 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2111 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2112 v3 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32) 2113 v3.AddArg(lo) 2114 v3.AddArg(s) 2115 v2.AddArg(v3) 2116 v4 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32) 2117 v4.AddArg(hi) 2118 v5 := b.NewValue0(v.Pos, OpSub8, typ.UInt8) 2119 v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) 2120 v6.AuxInt = 32 2121 v5.AddArg(v6) 2122 v5.AddArg(s) 2123 v4.AddArg(v5) 2124 v2.AddArg(v4) 2125 v1.AddArg(v2) 2126 v7 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32) 2127 v7.AddArg(hi) 2128 v8 := b.NewValue0(v.Pos, OpSub8, typ.UInt8) 2129 v8.AddArg(s) 2130 v9 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) 2131 v9.AuxInt = 32 2132 v8.AddArg(v9) 2133 v7.AddArg(v8) 2134 v1.AddArg(v7) 2135 v.AddArg(v1) 2136 return true 2137 } 2138 return false 2139 } 2140 func rewriteValuedec64_OpRsh64x16_0(v *Value) bool { 2141 b := v.Block 2142 _ = b 2143 typ := &b.Func.Config.Types 2144 _ = typ 2145 // match: (Rsh64x16 (Int64Make hi lo) s) 2146 // cond: 2147 // result: (Int64Make (Rsh32x16 <typ.UInt32> hi s) (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Rsh32Ux16 <typ.UInt32> lo s) (Lsh32x16 <typ.UInt32> hi (Sub16 <typ.UInt16> (Const16 <typ.UInt16> [32]) s))) (And32 <typ.UInt32> (Rsh32x16 <typ.UInt32> hi (Sub16 <typ.UInt16> s (Const16 <typ.UInt16> [32]))) (Zeromask (ZeroExt16to32 (Rsh16Ux32 <typ.UInt16> s (Const32 <typ.UInt32> [5]))))))) 2148 for { 2149 _ = v.Args[1] 2150 v_0 := v.Args[0] 2151 if v_0.Op != OpInt64Make { 2152 break 2153 } 2154 _ = v_0.Args[1] 2155 hi := v_0.Args[0] 2156 lo := v_0.Args[1] 2157 s := v.Args[1] 2158 v.reset(OpInt64Make) 2159 v0 := b.NewValue0(v.Pos, OpRsh32x16, typ.UInt32) 2160 v0.AddArg(hi) 2161 v0.AddArg(s) 2162 v.AddArg(v0) 2163 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2164 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2165 v3 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32) 2166 v3.AddArg(lo) 2167 v3.AddArg(s) 2168 v2.AddArg(v3) 2169 v4 := b.NewValue0(v.Pos, OpLsh32x16, typ.UInt32) 2170 v4.AddArg(hi) 2171 v5 := b.NewValue0(v.Pos, OpSub16, typ.UInt16) 2172 v6 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) 2173 v6.AuxInt = 32 2174 v5.AddArg(v6) 2175 v5.AddArg(s) 2176 v4.AddArg(v5) 2177 v2.AddArg(v4) 2178 v1.AddArg(v2) 2179 v7 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32) 2180 v8 := b.NewValue0(v.Pos, OpRsh32x16, typ.UInt32) 2181 v8.AddArg(hi) 2182 v9 := b.NewValue0(v.Pos, OpSub16, typ.UInt16) 2183 v9.AddArg(s) 2184 v10 := b.NewValue0(v.Pos, OpConst16, typ.UInt16) 2185 v10.AuxInt = 32 2186 v9.AddArg(v10) 2187 v8.AddArg(v9) 2188 v7.AddArg(v8) 2189 v11 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 2190 v12 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 2191 v13 := b.NewValue0(v.Pos, OpRsh16Ux32, typ.UInt16) 2192 v13.AddArg(s) 2193 v14 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 2194 v14.AuxInt = 5 2195 v13.AddArg(v14) 2196 v12.AddArg(v13) 2197 v11.AddArg(v12) 2198 v7.AddArg(v11) 2199 v1.AddArg(v7) 2200 v.AddArg(v1) 2201 return true 2202 } 2203 return false 2204 } 2205 func rewriteValuedec64_OpRsh64x32_0(v *Value) bool { 2206 b := v.Block 2207 _ = b 2208 typ := &b.Func.Config.Types 2209 _ = typ 2210 // match: (Rsh64x32 (Int64Make hi lo) s) 2211 // cond: 2212 // result: (Int64Make (Rsh32x32 <typ.UInt32> hi s) (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Rsh32Ux32 <typ.UInt32> lo s) (Lsh32x32 <typ.UInt32> hi (Sub32 <typ.UInt32> (Const32 <typ.UInt32> [32]) s))) (And32 <typ.UInt32> (Rsh32x32 <typ.UInt32> hi (Sub32 <typ.UInt32> s (Const32 <typ.UInt32> [32]))) (Zeromask (Rsh32Ux32 <typ.UInt32> s (Const32 <typ.UInt32> [5])))))) 2213 for { 2214 _ = v.Args[1] 2215 v_0 := v.Args[0] 2216 if v_0.Op != OpInt64Make { 2217 break 2218 } 2219 _ = v_0.Args[1] 2220 hi := v_0.Args[0] 2221 lo := v_0.Args[1] 2222 s := v.Args[1] 2223 v.reset(OpInt64Make) 2224 v0 := b.NewValue0(v.Pos, OpRsh32x32, typ.UInt32) 2225 v0.AddArg(hi) 2226 v0.AddArg(s) 2227 v.AddArg(v0) 2228 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2229 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2230 v3 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32) 2231 v3.AddArg(lo) 2232 v3.AddArg(s) 2233 v2.AddArg(v3) 2234 v4 := b.NewValue0(v.Pos, OpLsh32x32, typ.UInt32) 2235 v4.AddArg(hi) 2236 v5 := b.NewValue0(v.Pos, OpSub32, typ.UInt32) 2237 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 2238 v6.AuxInt = 32 2239 v5.AddArg(v6) 2240 v5.AddArg(s) 2241 v4.AddArg(v5) 2242 v2.AddArg(v4) 2243 v1.AddArg(v2) 2244 v7 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32) 2245 v8 := b.NewValue0(v.Pos, OpRsh32x32, typ.UInt32) 2246 v8.AddArg(hi) 2247 v9 := b.NewValue0(v.Pos, OpSub32, typ.UInt32) 2248 v9.AddArg(s) 2249 v10 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 2250 v10.AuxInt = 32 2251 v9.AddArg(v10) 2252 v8.AddArg(v9) 2253 v7.AddArg(v8) 2254 v11 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 2255 v12 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32) 2256 v12.AddArg(s) 2257 v13 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 2258 v13.AuxInt = 5 2259 v12.AddArg(v13) 2260 v11.AddArg(v12) 2261 v7.AddArg(v11) 2262 v1.AddArg(v7) 2263 v.AddArg(v1) 2264 return true 2265 } 2266 return false 2267 } 2268 func rewriteValuedec64_OpRsh64x64_0(v *Value) bool { 2269 b := v.Block 2270 _ = b 2271 typ := &b.Func.Config.Types 2272 _ = typ 2273 // match: (Rsh64x64 x (Int64Make (Const32 [c]) _)) 2274 // cond: c != 0 2275 // result: (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x))) 2276 for { 2277 _ = v.Args[1] 2278 x := v.Args[0] 2279 v_1 := v.Args[1] 2280 if v_1.Op != OpInt64Make { 2281 break 2282 } 2283 _ = v_1.Args[1] 2284 v_1_0 := v_1.Args[0] 2285 if v_1_0.Op != OpConst32 { 2286 break 2287 } 2288 c := v_1_0.AuxInt 2289 if !(c != 0) { 2290 break 2291 } 2292 v.reset(OpInt64Make) 2293 v0 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 2294 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 2295 v1.AddArg(x) 2296 v0.AddArg(v1) 2297 v.AddArg(v0) 2298 v2 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 2299 v3 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 2300 v3.AddArg(x) 2301 v2.AddArg(v3) 2302 v.AddArg(v2) 2303 return true 2304 } 2305 // match: (Rsh64x64 x (Int64Make (Const32 [0]) lo)) 2306 // cond: 2307 // result: (Rsh64x32 x lo) 2308 for { 2309 _ = v.Args[1] 2310 x := v.Args[0] 2311 v_1 := v.Args[1] 2312 if v_1.Op != OpInt64Make { 2313 break 2314 } 2315 _ = v_1.Args[1] 2316 v_1_0 := v_1.Args[0] 2317 if v_1_0.Op != OpConst32 { 2318 break 2319 } 2320 if v_1_0.AuxInt != 0 { 2321 break 2322 } 2323 lo := v_1.Args[1] 2324 v.reset(OpRsh64x32) 2325 v.AddArg(x) 2326 v.AddArg(lo) 2327 return true 2328 } 2329 // match: (Rsh64x64 x (Int64Make hi lo)) 2330 // cond: hi.Op != OpConst32 2331 // result: (Rsh64x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 2332 for { 2333 _ = v.Args[1] 2334 x := v.Args[0] 2335 v_1 := v.Args[1] 2336 if v_1.Op != OpInt64Make { 2337 break 2338 } 2339 _ = v_1.Args[1] 2340 hi := v_1.Args[0] 2341 lo := v_1.Args[1] 2342 if !(hi.Op != OpConst32) { 2343 break 2344 } 2345 v.reset(OpRsh64x32) 2346 v.AddArg(x) 2347 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2348 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 2349 v1.AddArg(hi) 2350 v0.AddArg(v1) 2351 v0.AddArg(lo) 2352 v.AddArg(v0) 2353 return true 2354 } 2355 return false 2356 } 2357 func rewriteValuedec64_OpRsh64x8_0(v *Value) bool { 2358 b := v.Block 2359 _ = b 2360 typ := &b.Func.Config.Types 2361 _ = typ 2362 // match: (Rsh64x8 (Int64Make hi lo) s) 2363 // cond: 2364 // result: (Int64Make (Rsh32x8 <typ.UInt32> hi s) (Or32 <typ.UInt32> (Or32 <typ.UInt32> (Rsh32Ux8 <typ.UInt32> lo s) (Lsh32x8 <typ.UInt32> hi (Sub8 <typ.UInt8> (Const8 <typ.UInt8> [32]) s))) (And32 <typ.UInt32> (Rsh32x8 <typ.UInt32> hi (Sub8 <typ.UInt8> s (Const8 <typ.UInt8> [32]))) (Zeromask (ZeroExt8to32 (Rsh8Ux32 <typ.UInt8> s (Const32 <typ.UInt32> [5]))))))) 2365 for { 2366 _ = v.Args[1] 2367 v_0 := v.Args[0] 2368 if v_0.Op != OpInt64Make { 2369 break 2370 } 2371 _ = v_0.Args[1] 2372 hi := v_0.Args[0] 2373 lo := v_0.Args[1] 2374 s := v.Args[1] 2375 v.reset(OpInt64Make) 2376 v0 := b.NewValue0(v.Pos, OpRsh32x8, typ.UInt32) 2377 v0.AddArg(hi) 2378 v0.AddArg(s) 2379 v.AddArg(v0) 2380 v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2381 v2 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2382 v3 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32) 2383 v3.AddArg(lo) 2384 v3.AddArg(s) 2385 v2.AddArg(v3) 2386 v4 := b.NewValue0(v.Pos, OpLsh32x8, typ.UInt32) 2387 v4.AddArg(hi) 2388 v5 := b.NewValue0(v.Pos, OpSub8, typ.UInt8) 2389 v6 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) 2390 v6.AuxInt = 32 2391 v5.AddArg(v6) 2392 v5.AddArg(s) 2393 v4.AddArg(v5) 2394 v2.AddArg(v4) 2395 v1.AddArg(v2) 2396 v7 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32) 2397 v8 := b.NewValue0(v.Pos, OpRsh32x8, typ.UInt32) 2398 v8.AddArg(hi) 2399 v9 := b.NewValue0(v.Pos, OpSub8, typ.UInt8) 2400 v9.AddArg(s) 2401 v10 := b.NewValue0(v.Pos, OpConst8, typ.UInt8) 2402 v10.AuxInt = 32 2403 v9.AddArg(v10) 2404 v8.AddArg(v9) 2405 v7.AddArg(v8) 2406 v11 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 2407 v12 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 2408 v13 := b.NewValue0(v.Pos, OpRsh8Ux32, typ.UInt8) 2409 v13.AddArg(s) 2410 v14 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 2411 v14.AuxInt = 5 2412 v13.AddArg(v14) 2413 v12.AddArg(v13) 2414 v11.AddArg(v12) 2415 v7.AddArg(v11) 2416 v1.AddArg(v7) 2417 v.AddArg(v1) 2418 return true 2419 } 2420 return false 2421 } 2422 func rewriteValuedec64_OpRsh8Ux64_0(v *Value) bool { 2423 b := v.Block 2424 _ = b 2425 typ := &b.Func.Config.Types 2426 _ = typ 2427 // match: (Rsh8Ux64 _ (Int64Make (Const32 [c]) _)) 2428 // cond: c != 0 2429 // result: (Const32 [0]) 2430 for { 2431 _ = v.Args[1] 2432 v_1 := v.Args[1] 2433 if v_1.Op != OpInt64Make { 2434 break 2435 } 2436 _ = v_1.Args[1] 2437 v_1_0 := v_1.Args[0] 2438 if v_1_0.Op != OpConst32 { 2439 break 2440 } 2441 c := v_1_0.AuxInt 2442 if !(c != 0) { 2443 break 2444 } 2445 v.reset(OpConst32) 2446 v.AuxInt = 0 2447 return true 2448 } 2449 // match: (Rsh8Ux64 x (Int64Make (Const32 [0]) lo)) 2450 // cond: 2451 // result: (Rsh8Ux32 x lo) 2452 for { 2453 _ = v.Args[1] 2454 x := v.Args[0] 2455 v_1 := v.Args[1] 2456 if v_1.Op != OpInt64Make { 2457 break 2458 } 2459 _ = v_1.Args[1] 2460 v_1_0 := v_1.Args[0] 2461 if v_1_0.Op != OpConst32 { 2462 break 2463 } 2464 if v_1_0.AuxInt != 0 { 2465 break 2466 } 2467 lo := v_1.Args[1] 2468 v.reset(OpRsh8Ux32) 2469 v.AddArg(x) 2470 v.AddArg(lo) 2471 return true 2472 } 2473 // match: (Rsh8Ux64 x (Int64Make hi lo)) 2474 // cond: hi.Op != OpConst32 2475 // result: (Rsh8Ux32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 2476 for { 2477 _ = v.Args[1] 2478 x := v.Args[0] 2479 v_1 := v.Args[1] 2480 if v_1.Op != OpInt64Make { 2481 break 2482 } 2483 _ = v_1.Args[1] 2484 hi := v_1.Args[0] 2485 lo := v_1.Args[1] 2486 if !(hi.Op != OpConst32) { 2487 break 2488 } 2489 v.reset(OpRsh8Ux32) 2490 v.AddArg(x) 2491 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2492 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 2493 v1.AddArg(hi) 2494 v0.AddArg(v1) 2495 v0.AddArg(lo) 2496 v.AddArg(v0) 2497 return true 2498 } 2499 return false 2500 } 2501 func rewriteValuedec64_OpRsh8x64_0(v *Value) bool { 2502 b := v.Block 2503 _ = b 2504 typ := &b.Func.Config.Types 2505 _ = typ 2506 // match: (Rsh8x64 x (Int64Make (Const32 [c]) _)) 2507 // cond: c != 0 2508 // result: (Signmask (SignExt8to32 x)) 2509 for { 2510 _ = v.Args[1] 2511 x := v.Args[0] 2512 v_1 := v.Args[1] 2513 if v_1.Op != OpInt64Make { 2514 break 2515 } 2516 _ = v_1.Args[1] 2517 v_1_0 := v_1.Args[0] 2518 if v_1_0.Op != OpConst32 { 2519 break 2520 } 2521 c := v_1_0.AuxInt 2522 if !(c != 0) { 2523 break 2524 } 2525 v.reset(OpSignmask) 2526 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 2527 v0.AddArg(x) 2528 v.AddArg(v0) 2529 return true 2530 } 2531 // match: (Rsh8x64 x (Int64Make (Const32 [0]) lo)) 2532 // cond: 2533 // result: (Rsh8x32 x lo) 2534 for { 2535 _ = v.Args[1] 2536 x := v.Args[0] 2537 v_1 := v.Args[1] 2538 if v_1.Op != OpInt64Make { 2539 break 2540 } 2541 _ = v_1.Args[1] 2542 v_1_0 := v_1.Args[0] 2543 if v_1_0.Op != OpConst32 { 2544 break 2545 } 2546 if v_1_0.AuxInt != 0 { 2547 break 2548 } 2549 lo := v_1.Args[1] 2550 v.reset(OpRsh8x32) 2551 v.AddArg(x) 2552 v.AddArg(lo) 2553 return true 2554 } 2555 // match: (Rsh8x64 x (Int64Make hi lo)) 2556 // cond: hi.Op != OpConst32 2557 // result: (Rsh8x32 x (Or32 <typ.UInt32> (Zeromask hi) lo)) 2558 for { 2559 _ = v.Args[1] 2560 x := v.Args[0] 2561 v_1 := v.Args[1] 2562 if v_1.Op != OpInt64Make { 2563 break 2564 } 2565 _ = v_1.Args[1] 2566 hi := v_1.Args[0] 2567 lo := v_1.Args[1] 2568 if !(hi.Op != OpConst32) { 2569 break 2570 } 2571 v.reset(OpRsh8x32) 2572 v.AddArg(x) 2573 v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) 2574 v1 := b.NewValue0(v.Pos, OpZeromask, typ.UInt32) 2575 v1.AddArg(hi) 2576 v0.AddArg(v1) 2577 v0.AddArg(lo) 2578 v.AddArg(v0) 2579 return true 2580 } 2581 return false 2582 } 2583 func rewriteValuedec64_OpSignExt16to64_0(v *Value) bool { 2584 b := v.Block 2585 _ = b 2586 typ := &b.Func.Config.Types 2587 _ = typ 2588 // match: (SignExt16to64 x) 2589 // cond: 2590 // result: (SignExt32to64 (SignExt16to32 x)) 2591 for { 2592 x := v.Args[0] 2593 v.reset(OpSignExt32to64) 2594 v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 2595 v0.AddArg(x) 2596 v.AddArg(v0) 2597 return true 2598 } 2599 } 2600 func rewriteValuedec64_OpSignExt32to64_0(v *Value) bool { 2601 b := v.Block 2602 _ = b 2603 typ := &b.Func.Config.Types 2604 _ = typ 2605 // match: (SignExt32to64 x) 2606 // cond: 2607 // result: (Int64Make (Signmask x) x) 2608 for { 2609 x := v.Args[0] 2610 v.reset(OpInt64Make) 2611 v0 := b.NewValue0(v.Pos, OpSignmask, typ.Int32) 2612 v0.AddArg(x) 2613 v.AddArg(v0) 2614 v.AddArg(x) 2615 return true 2616 } 2617 } 2618 func rewriteValuedec64_OpSignExt8to64_0(v *Value) bool { 2619 b := v.Block 2620 _ = b 2621 typ := &b.Func.Config.Types 2622 _ = typ 2623 // match: (SignExt8to64 x) 2624 // cond: 2625 // result: (SignExt32to64 (SignExt8to32 x)) 2626 for { 2627 x := v.Args[0] 2628 v.reset(OpSignExt32to64) 2629 v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 2630 v0.AddArg(x) 2631 v.AddArg(v0) 2632 return true 2633 } 2634 } 2635 func rewriteValuedec64_OpStore_0(v *Value) bool { 2636 b := v.Block 2637 _ = b 2638 config := b.Func.Config 2639 _ = config 2640 // match: (Store {t} dst (Int64Make hi lo) mem) 2641 // cond: t.(*types.Type).Size() == 8 && !config.BigEndian 2642 // result: (Store {hi.Type} (OffPtr <hi.Type.PtrTo()> [4] dst) hi (Store {lo.Type} dst lo mem)) 2643 for { 2644 t := v.Aux 2645 _ = v.Args[2] 2646 dst := v.Args[0] 2647 v_1 := v.Args[1] 2648 if v_1.Op != OpInt64Make { 2649 break 2650 } 2651 _ = v_1.Args[1] 2652 hi := v_1.Args[0] 2653 lo := v_1.Args[1] 2654 mem := v.Args[2] 2655 if !(t.(*types.Type).Size() == 8 && !config.BigEndian) { 2656 break 2657 } 2658 v.reset(OpStore) 2659 v.Aux = hi.Type 2660 v0 := b.NewValue0(v.Pos, OpOffPtr, hi.Type.PtrTo()) 2661 v0.AuxInt = 4 2662 v0.AddArg(dst) 2663 v.AddArg(v0) 2664 v.AddArg(hi) 2665 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 2666 v1.Aux = lo.Type 2667 v1.AddArg(dst) 2668 v1.AddArg(lo) 2669 v1.AddArg(mem) 2670 v.AddArg(v1) 2671 return true 2672 } 2673 // match: (Store {t} dst (Int64Make hi lo) mem) 2674 // cond: t.(*types.Type).Size() == 8 && config.BigEndian 2675 // result: (Store {lo.Type} (OffPtr <lo.Type.PtrTo()> [4] dst) lo (Store {hi.Type} dst hi mem)) 2676 for { 2677 t := v.Aux 2678 _ = v.Args[2] 2679 dst := v.Args[0] 2680 v_1 := v.Args[1] 2681 if v_1.Op != OpInt64Make { 2682 break 2683 } 2684 _ = v_1.Args[1] 2685 hi := v_1.Args[0] 2686 lo := v_1.Args[1] 2687 mem := v.Args[2] 2688 if !(t.(*types.Type).Size() == 8 && config.BigEndian) { 2689 break 2690 } 2691 v.reset(OpStore) 2692 v.Aux = lo.Type 2693 v0 := b.NewValue0(v.Pos, OpOffPtr, lo.Type.PtrTo()) 2694 v0.AuxInt = 4 2695 v0.AddArg(dst) 2696 v.AddArg(v0) 2697 v.AddArg(lo) 2698 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 2699 v1.Aux = hi.Type 2700 v1.AddArg(dst) 2701 v1.AddArg(hi) 2702 v1.AddArg(mem) 2703 v.AddArg(v1) 2704 return true 2705 } 2706 return false 2707 } 2708 func rewriteValuedec64_OpSub64_0(v *Value) bool { 2709 b := v.Block 2710 _ = b 2711 typ := &b.Func.Config.Types 2712 _ = typ 2713 // match: (Sub64 x y) 2714 // cond: 2715 // result: (Int64Make (Sub32withcarry <typ.Int32> (Int64Hi x) (Int64Hi y) (Select1 <types.TypeFlags> (Sub32carry (Int64Lo x) (Int64Lo y)))) (Select0 <typ.UInt32> (Sub32carry (Int64Lo x) (Int64Lo y)))) 2716 for { 2717 _ = v.Args[1] 2718 x := v.Args[0] 2719 y := v.Args[1] 2720 v.reset(OpInt64Make) 2721 v0 := b.NewValue0(v.Pos, OpSub32withcarry, typ.Int32) 2722 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 2723 v1.AddArg(x) 2724 v0.AddArg(v1) 2725 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 2726 v2.AddArg(y) 2727 v0.AddArg(v2) 2728 v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) 2729 v4 := b.NewValue0(v.Pos, OpSub32carry, types.NewTuple(typ.UInt32, types.TypeFlags)) 2730 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 2731 v5.AddArg(x) 2732 v4.AddArg(v5) 2733 v6 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 2734 v6.AddArg(y) 2735 v4.AddArg(v6) 2736 v3.AddArg(v4) 2737 v0.AddArg(v3) 2738 v.AddArg(v0) 2739 v7 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) 2740 v8 := b.NewValue0(v.Pos, OpSub32carry, types.NewTuple(typ.UInt32, types.TypeFlags)) 2741 v9 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 2742 v9.AddArg(x) 2743 v8.AddArg(v9) 2744 v10 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 2745 v10.AddArg(y) 2746 v8.AddArg(v10) 2747 v7.AddArg(v8) 2748 v.AddArg(v7) 2749 return true 2750 } 2751 } 2752 func rewriteValuedec64_OpTrunc64to16_0(v *Value) bool { 2753 // match: (Trunc64to16 (Int64Make _ lo)) 2754 // cond: 2755 // result: (Trunc32to16 lo) 2756 for { 2757 v_0 := v.Args[0] 2758 if v_0.Op != OpInt64Make { 2759 break 2760 } 2761 _ = v_0.Args[1] 2762 lo := v_0.Args[1] 2763 v.reset(OpTrunc32to16) 2764 v.AddArg(lo) 2765 return true 2766 } 2767 return false 2768 } 2769 func rewriteValuedec64_OpTrunc64to32_0(v *Value) bool { 2770 // match: (Trunc64to32 (Int64Make _ lo)) 2771 // cond: 2772 // result: lo 2773 for { 2774 v_0 := v.Args[0] 2775 if v_0.Op != OpInt64Make { 2776 break 2777 } 2778 _ = v_0.Args[1] 2779 lo := v_0.Args[1] 2780 v.reset(OpCopy) 2781 v.Type = lo.Type 2782 v.AddArg(lo) 2783 return true 2784 } 2785 return false 2786 } 2787 func rewriteValuedec64_OpTrunc64to8_0(v *Value) bool { 2788 // match: (Trunc64to8 (Int64Make _ lo)) 2789 // cond: 2790 // result: (Trunc32to8 lo) 2791 for { 2792 v_0 := v.Args[0] 2793 if v_0.Op != OpInt64Make { 2794 break 2795 } 2796 _ = v_0.Args[1] 2797 lo := v_0.Args[1] 2798 v.reset(OpTrunc32to8) 2799 v.AddArg(lo) 2800 return true 2801 } 2802 return false 2803 } 2804 func rewriteValuedec64_OpXor64_0(v *Value) bool { 2805 b := v.Block 2806 _ = b 2807 typ := &b.Func.Config.Types 2808 _ = typ 2809 // match: (Xor64 x y) 2810 // cond: 2811 // result: (Int64Make (Xor32 <typ.UInt32> (Int64Hi x) (Int64Hi y)) (Xor32 <typ.UInt32> (Int64Lo x) (Int64Lo y))) 2812 for { 2813 _ = v.Args[1] 2814 x := v.Args[0] 2815 y := v.Args[1] 2816 v.reset(OpInt64Make) 2817 v0 := b.NewValue0(v.Pos, OpXor32, typ.UInt32) 2818 v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 2819 v1.AddArg(x) 2820 v0.AddArg(v1) 2821 v2 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) 2822 v2.AddArg(y) 2823 v0.AddArg(v2) 2824 v.AddArg(v0) 2825 v3 := b.NewValue0(v.Pos, OpXor32, typ.UInt32) 2826 v4 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 2827 v4.AddArg(x) 2828 v3.AddArg(v4) 2829 v5 := b.NewValue0(v.Pos, OpInt64Lo, typ.UInt32) 2830 v5.AddArg(y) 2831 v3.AddArg(v5) 2832 v.AddArg(v3) 2833 return true 2834 } 2835 } 2836 func rewriteValuedec64_OpZeroExt16to64_0(v *Value) bool { 2837 b := v.Block 2838 _ = b 2839 typ := &b.Func.Config.Types 2840 _ = typ 2841 // match: (ZeroExt16to64 x) 2842 // cond: 2843 // result: (ZeroExt32to64 (ZeroExt16to32 x)) 2844 for { 2845 x := v.Args[0] 2846 v.reset(OpZeroExt32to64) 2847 v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 2848 v0.AddArg(x) 2849 v.AddArg(v0) 2850 return true 2851 } 2852 } 2853 func rewriteValuedec64_OpZeroExt32to64_0(v *Value) bool { 2854 b := v.Block 2855 _ = b 2856 typ := &b.Func.Config.Types 2857 _ = typ 2858 // match: (ZeroExt32to64 x) 2859 // cond: 2860 // result: (Int64Make (Const32 <typ.UInt32> [0]) x) 2861 for { 2862 x := v.Args[0] 2863 v.reset(OpInt64Make) 2864 v0 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 2865 v0.AuxInt = 0 2866 v.AddArg(v0) 2867 v.AddArg(x) 2868 return true 2869 } 2870 } 2871 func rewriteValuedec64_OpZeroExt8to64_0(v *Value) bool { 2872 b := v.Block 2873 _ = b 2874 typ := &b.Func.Config.Types 2875 _ = typ 2876 // match: (ZeroExt8to64 x) 2877 // cond: 2878 // result: (ZeroExt32to64 (ZeroExt8to32 x)) 2879 for { 2880 x := v.Args[0] 2881 v.reset(OpZeroExt32to64) 2882 v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 2883 v0.AddArg(x) 2884 v.AddArg(v0) 2885 return true 2886 } 2887 } 2888 func rewriteBlockdec64(b *Block) bool { 2889 config := b.Func.Config 2890 _ = config 2891 fe := b.Func.fe 2892 _ = fe 2893 typ := &config.Types 2894 _ = typ 2895 switch b.Kind { 2896 } 2897 return false 2898 } 2899