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