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