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