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