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