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