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