[dev.ssa] cmd/compile/internal/ssa: rewrite rules for const comparisons

Shaves ~8k off the go binary on darwin x64.

Change-Id: I73396af44ae28cd4cfc675290d6858f304d45b76
Reviewed-on: https://go-review.googlesource.com/16456
Run-TryBot: Todd Neal <todd@tneal.org>
Reviewed-by: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go
index e30f17d..e068dcf 100644
--- a/src/cmd/compile/internal/ssa/rewritegeneric.go
+++ b/src/cmd/compile/internal/ssa/rewritegeneric.go
@@ -55,12 +55,76 @@
 		return rewriteValuegeneric_OpEqPtr(v, config)
 	case OpEqSlice:
 		return rewriteValuegeneric_OpEqSlice(v, config)
+	case OpGeq16:
+		return rewriteValuegeneric_OpGeq16(v, config)
+	case OpGeq16U:
+		return rewriteValuegeneric_OpGeq16U(v, config)
+	case OpGeq32:
+		return rewriteValuegeneric_OpGeq32(v, config)
+	case OpGeq32U:
+		return rewriteValuegeneric_OpGeq32U(v, config)
+	case OpGeq64:
+		return rewriteValuegeneric_OpGeq64(v, config)
+	case OpGeq64U:
+		return rewriteValuegeneric_OpGeq64U(v, config)
+	case OpGeq8:
+		return rewriteValuegeneric_OpGeq8(v, config)
+	case OpGeq8U:
+		return rewriteValuegeneric_OpGeq8U(v, config)
+	case OpGreater16:
+		return rewriteValuegeneric_OpGreater16(v, config)
+	case OpGreater16U:
+		return rewriteValuegeneric_OpGreater16U(v, config)
+	case OpGreater32:
+		return rewriteValuegeneric_OpGreater32(v, config)
+	case OpGreater32U:
+		return rewriteValuegeneric_OpGreater32U(v, config)
+	case OpGreater64:
+		return rewriteValuegeneric_OpGreater64(v, config)
+	case OpGreater64U:
+		return rewriteValuegeneric_OpGreater64U(v, config)
+	case OpGreater8:
+		return rewriteValuegeneric_OpGreater8(v, config)
+	case OpGreater8U:
+		return rewriteValuegeneric_OpGreater8U(v, config)
 	case OpIData:
 		return rewriteValuegeneric_OpIData(v, config)
 	case OpITab:
 		return rewriteValuegeneric_OpITab(v, config)
 	case OpIsInBounds:
 		return rewriteValuegeneric_OpIsInBounds(v, config)
+	case OpLeq16:
+		return rewriteValuegeneric_OpLeq16(v, config)
+	case OpLeq16U:
+		return rewriteValuegeneric_OpLeq16U(v, config)
+	case OpLeq32:
+		return rewriteValuegeneric_OpLeq32(v, config)
+	case OpLeq32U:
+		return rewriteValuegeneric_OpLeq32U(v, config)
+	case OpLeq64:
+		return rewriteValuegeneric_OpLeq64(v, config)
+	case OpLeq64U:
+		return rewriteValuegeneric_OpLeq64U(v, config)
+	case OpLeq8:
+		return rewriteValuegeneric_OpLeq8(v, config)
+	case OpLeq8U:
+		return rewriteValuegeneric_OpLeq8U(v, config)
+	case OpLess16:
+		return rewriteValuegeneric_OpLess16(v, config)
+	case OpLess16U:
+		return rewriteValuegeneric_OpLess16U(v, config)
+	case OpLess32:
+		return rewriteValuegeneric_OpLess32(v, config)
+	case OpLess32U:
+		return rewriteValuegeneric_OpLess32U(v, config)
+	case OpLess64:
+		return rewriteValuegeneric_OpLess64(v, config)
+	case OpLess64U:
+		return rewriteValuegeneric_OpLess64U(v, config)
+	case OpLess8:
+		return rewriteValuegeneric_OpLess8(v, config)
+	case OpLess8U:
+		return rewriteValuegeneric_OpLess8U(v, config)
 	case OpLoad:
 		return rewriteValuegeneric_OpLoad(v, config)
 	case OpMul64:
@@ -583,6 +647,28 @@
 	goto end0c0fe5fdfba3821add3448fd3f1fc6b7
 end0c0fe5fdfba3821add3448fd3f1fc6b7:
 	;
+	// match: (Eq16 (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int16(c) == int16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto end4532e1d01c10d8906fe1da14f9dfaa88
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto end4532e1d01c10d8906fe1da14f9dfaa88
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int16(c) == int16(d))
+		return true
+	}
+	goto end4532e1d01c10d8906fe1da14f9dfaa88
+end4532e1d01c10d8906fe1da14f9dfaa88:
+	;
 	return false
 }
 func rewriteValuegeneric_OpEq32(v *Value, config *Config) bool {
@@ -606,6 +692,28 @@
 	goto end6da547ec4ee93d787434f3bda873e4a0
 end6da547ec4ee93d787434f3bda873e4a0:
 	;
+	// match: (Eq32 (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int32(c) == int32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto end00a2464e02c9ca00e8d0077acacbb5ad
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto end00a2464e02c9ca00e8d0077acacbb5ad
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int32(c) == int32(d))
+		return true
+	}
+	goto end00a2464e02c9ca00e8d0077acacbb5ad
+end00a2464e02c9ca00e8d0077acacbb5ad:
+	;
 	return false
 }
 func rewriteValuegeneric_OpEq64(v *Value, config *Config) bool {
@@ -629,6 +737,28 @@
 	goto endb1d471cc503ba8bb05440f01dbf33d81
 endb1d471cc503ba8bb05440f01dbf33d81:
 	;
+	// match: (Eq64 (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int64(c) == int64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto end405568a707dbbc86432e91f4ce7d97d7
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto end405568a707dbbc86432e91f4ce7d97d7
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int64(c) == int64(d))
+		return true
+	}
+	goto end405568a707dbbc86432e91f4ce7d97d7
+end405568a707dbbc86432e91f4ce7d97d7:
+	;
 	return false
 }
 func rewriteValuegeneric_OpEq8(v *Value, config *Config) bool {
@@ -652,6 +782,28 @@
 	goto enda66da0d3e7e51624ee46527727c48a9a
 enda66da0d3e7e51624ee46527727c48a9a:
 	;
+	// match: (Eq8  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(int8(c)  == int8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto endd49f3700ba2d1e500d3ab4fa34fd090d
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto endd49f3700ba2d1e500d3ab4fa34fd090d
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int8(c) == int8(d))
+		return true
+	}
+	goto endd49f3700ba2d1e500d3ab4fa34fd090d
+endd49f3700ba2d1e500d3ab4fa34fd090d:
+	;
 	return false
 }
 func rewriteValuegeneric_OpEqInter(v *Value, config *Config) bool {
@@ -757,6 +909,438 @@
 	;
 	return false
 }
+func rewriteValuegeneric_OpGeq16(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Geq16 (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int16(c) >= int16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto endbac100e9f1065e7d2ff863951f686f4b
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto endbac100e9f1065e7d2ff863951f686f4b
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int16(c) >= int16(d))
+		return true
+	}
+	goto endbac100e9f1065e7d2ff863951f686f4b
+endbac100e9f1065e7d2ff863951f686f4b:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGeq16U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Geq16U (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint16(c) >= uint16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto end11c6acbc5827fc9508424b0ffcf98b34
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto end11c6acbc5827fc9508424b0ffcf98b34
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint16(c) >= uint16(d))
+		return true
+	}
+	goto end11c6acbc5827fc9508424b0ffcf98b34
+end11c6acbc5827fc9508424b0ffcf98b34:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGeq32(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Geq32 (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int32(c) >= int32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto end89ced97524ac75045911ca7cf6d44b28
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto end89ced97524ac75045911ca7cf6d44b28
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int32(c) >= int32(d))
+		return true
+	}
+	goto end89ced97524ac75045911ca7cf6d44b28
+end89ced97524ac75045911ca7cf6d44b28:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGeq32U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Geq32U (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint32(c) >= uint32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto end92fbe85c7bbbf0db287932822bdde991
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto end92fbe85c7bbbf0db287932822bdde991
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint32(c) >= uint32(d))
+		return true
+	}
+	goto end92fbe85c7bbbf0db287932822bdde991
+end92fbe85c7bbbf0db287932822bdde991:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGeq64(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Geq64 (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int64(c) >= int64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto end08a5a4bff12a346befe05ad561b080ac
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto end08a5a4bff12a346befe05ad561b080ac
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int64(c) >= int64(d))
+		return true
+	}
+	goto end08a5a4bff12a346befe05ad561b080ac
+end08a5a4bff12a346befe05ad561b080ac:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGeq64U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Geq64U (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint64(c) >= uint64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto endd72c497b6cc2b01d43a39ec12d5010b3
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto endd72c497b6cc2b01d43a39ec12d5010b3
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint64(c) >= uint64(d))
+		return true
+	}
+	goto endd72c497b6cc2b01d43a39ec12d5010b3
+endd72c497b6cc2b01d43a39ec12d5010b3:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGeq8(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Geq8  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(int8(c)  >= int8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto endea141068e84038c63cbdd87a8cb227d7
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto endea141068e84038c63cbdd87a8cb227d7
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int8(c) >= int8(d))
+		return true
+	}
+	goto endea141068e84038c63cbdd87a8cb227d7
+endea141068e84038c63cbdd87a8cb227d7:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGeq8U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Geq8U  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint8(c)  >= uint8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto end47c128ccdc54151a243c5856b0c52ef1
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto end47c128ccdc54151a243c5856b0c52ef1
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint8(c) >= uint8(d))
+		return true
+	}
+	goto end47c128ccdc54151a243c5856b0c52ef1
+end47c128ccdc54151a243c5856b0c52ef1:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGreater16(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Greater16 (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int16(c) > int16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto end390bae49463ace4d703dd24e18920f66
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto end390bae49463ace4d703dd24e18920f66
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int16(c) > int16(d))
+		return true
+	}
+	goto end390bae49463ace4d703dd24e18920f66
+end390bae49463ace4d703dd24e18920f66:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGreater16U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Greater16U (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint16(c) > uint16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto end89ba3caf5c156fa6d908ac04c058187b
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto end89ba3caf5c156fa6d908ac04c058187b
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint16(c) > uint16(d))
+		return true
+	}
+	goto end89ba3caf5c156fa6d908ac04c058187b
+end89ba3caf5c156fa6d908ac04c058187b:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGreater32(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Greater32 (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int32(c) > int32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto end86482a9dc6439e8470da5352dd74d68d
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto end86482a9dc6439e8470da5352dd74d68d
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int32(c) > int32(d))
+		return true
+	}
+	goto end86482a9dc6439e8470da5352dd74d68d
+end86482a9dc6439e8470da5352dd74d68d:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGreater32U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Greater32U (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint32(c) > uint32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto end1bf3f05c1e3599a969b8be1f5f6949e4
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto end1bf3f05c1e3599a969b8be1f5f6949e4
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint32(c) > uint32(d))
+		return true
+	}
+	goto end1bf3f05c1e3599a969b8be1f5f6949e4
+end1bf3f05c1e3599a969b8be1f5f6949e4:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGreater64(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Greater64 (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int64(c) > int64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto end96a82e893fda4882f23b6bab5f7fbff7
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto end96a82e893fda4882f23b6bab5f7fbff7
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int64(c) > int64(d))
+		return true
+	}
+	goto end96a82e893fda4882f23b6bab5f7fbff7
+end96a82e893fda4882f23b6bab5f7fbff7:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGreater64U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Greater64U (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint64(c) > uint64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto end2d8f5ad85fbffeb92af985a888f6fa69
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto end2d8f5ad85fbffeb92af985a888f6fa69
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint64(c) > uint64(d))
+		return true
+	}
+	goto end2d8f5ad85fbffeb92af985a888f6fa69
+end2d8f5ad85fbffeb92af985a888f6fa69:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGreater8(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Greater8  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(int8(c)  > int8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto ende221967c7516b7749109cf8343fe9c83
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto ende221967c7516b7749109cf8343fe9c83
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int8(c) > int8(d))
+		return true
+	}
+	goto ende221967c7516b7749109cf8343fe9c83
+ende221967c7516b7749109cf8343fe9c83:
+	;
+	return false
+}
+func rewriteValuegeneric_OpGreater8U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Greater8U  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint8(c)  > uint8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto enda9398c8188156dd46689fa2939147525
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto enda9398c8188156dd46689fa2939147525
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint8(c) > uint8(d))
+		return true
+	}
+	goto enda9398c8188156dd46689fa2939147525
+enda9398c8188156dd46689fa2939147525:
+	;
+	return false
+}
 func rewriteValuegeneric_OpIData(v *Value, config *Config) bool {
 	b := v.Block
 	_ = b
@@ -904,6 +1488,438 @@
 	;
 	return false
 }
+func rewriteValuegeneric_OpLeq16(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Leq16 (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int16(c) <= int16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto end76b1c51f9b7cd7ee2f75b9f7057569de
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto end76b1c51f9b7cd7ee2f75b9f7057569de
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int16(c) <= int16(d))
+		return true
+	}
+	goto end76b1c51f9b7cd7ee2f75b9f7057569de
+end76b1c51f9b7cd7ee2f75b9f7057569de:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLeq16U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Leq16U (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint16(c) <= uint16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto endf010fdf7f2c438ec18c33f493dd062aa
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto endf010fdf7f2c438ec18c33f493dd062aa
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint16(c) <= uint16(d))
+		return true
+	}
+	goto endf010fdf7f2c438ec18c33f493dd062aa
+endf010fdf7f2c438ec18c33f493dd062aa:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLeq32(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Leq32 (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int32(c) <= int32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto end6c7d61cfd188680bea8a5e23f08ca1de
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto end6c7d61cfd188680bea8a5e23f08ca1de
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int32(c) <= int32(d))
+		return true
+	}
+	goto end6c7d61cfd188680bea8a5e23f08ca1de
+end6c7d61cfd188680bea8a5e23f08ca1de:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLeq32U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Leq32U (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint32(c) <= uint32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto end4363555333511ee9b649b36f1a0ba34e
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto end4363555333511ee9b649b36f1a0ba34e
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint32(c) <= uint32(d))
+		return true
+	}
+	goto end4363555333511ee9b649b36f1a0ba34e
+end4363555333511ee9b649b36f1a0ba34e:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLeq64(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Leq64 (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int64(c) <= int64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto enddc865cd7ac2093abc7617bedbf371c22
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto enddc865cd7ac2093abc7617bedbf371c22
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int64(c) <= int64(d))
+		return true
+	}
+	goto enddc865cd7ac2093abc7617bedbf371c22
+enddc865cd7ac2093abc7617bedbf371c22:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLeq64U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Leq64U (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint64(c) <= uint64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto end412eadb168738ba92f3f0705d4495305
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto end412eadb168738ba92f3f0705d4495305
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint64(c) <= uint64(d))
+		return true
+	}
+	goto end412eadb168738ba92f3f0705d4495305
+end412eadb168738ba92f3f0705d4495305:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLeq8(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Leq8  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(int8(c)  <= int8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto endb5a459da8e18c40abc0c7a20e71d0187
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto endb5a459da8e18c40abc0c7a20e71d0187
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int8(c) <= int8(d))
+		return true
+	}
+	goto endb5a459da8e18c40abc0c7a20e71d0187
+endb5a459da8e18c40abc0c7a20e71d0187:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLeq8U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Leq8U  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint8(c)  <= uint8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto endd6622d55fcdf3fa7b08e7511cd3b7d85
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto endd6622d55fcdf3fa7b08e7511cd3b7d85
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint8(c) <= uint8(d))
+		return true
+	}
+	goto endd6622d55fcdf3fa7b08e7511cd3b7d85
+endd6622d55fcdf3fa7b08e7511cd3b7d85:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLess16(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Less16 (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int16(c) < int16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto end0dc915d089f05e79589ebb5c498cc360
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto end0dc915d089f05e79589ebb5c498cc360
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int16(c) < int16(d))
+		return true
+	}
+	goto end0dc915d089f05e79589ebb5c498cc360
+end0dc915d089f05e79589ebb5c498cc360:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLess16U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Less16U (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint16(c) < uint16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto endd2bb8249443788690946fc184631a00a
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto endd2bb8249443788690946fc184631a00a
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint16(c) < uint16(d))
+		return true
+	}
+	goto endd2bb8249443788690946fc184631a00a
+endd2bb8249443788690946fc184631a00a:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLess32(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Less32 (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int32(c) < int32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto endc86f65e499688809d414f03539bec5bf
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto endc86f65e499688809d414f03539bec5bf
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int32(c) < int32(d))
+		return true
+	}
+	goto endc86f65e499688809d414f03539bec5bf
+endc86f65e499688809d414f03539bec5bf:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLess32U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Less32U (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint32(c) < uint32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto end2cc68b5247b1afb90a9d3923b28ff247
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto end2cc68b5247b1afb90a9d3923b28ff247
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint32(c) < uint32(d))
+		return true
+	}
+	goto end2cc68b5247b1afb90a9d3923b28ff247
+end2cc68b5247b1afb90a9d3923b28ff247:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLess64(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Less64 (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int64(c) < int64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto end505de73cd15125dbb59b05d8975d3128
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto end505de73cd15125dbb59b05d8975d3128
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int64(c) < int64(d))
+		return true
+	}
+	goto end505de73cd15125dbb59b05d8975d3128
+end505de73cd15125dbb59b05d8975d3128:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLess64U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Less64U (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint64(c) < uint64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto endeb249ef36416cd1abf4f807026c059cd
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto endeb249ef36416cd1abf4f807026c059cd
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint64(c) < uint64(d))
+		return true
+	}
+	goto endeb249ef36416cd1abf4f807026c059cd
+endeb249ef36416cd1abf4f807026c059cd:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLess8(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Less8  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(int8(c)  < int8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto endef134de03bc8537ac1f38d5eccff7673
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto endef134de03bc8537ac1f38d5eccff7673
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int8(c) < int8(d))
+		return true
+	}
+	goto endef134de03bc8537ac1f38d5eccff7673
+endef134de03bc8537ac1f38d5eccff7673:
+	;
+	return false
+}
+func rewriteValuegeneric_OpLess8U(v *Value, config *Config) bool {
+	b := v.Block
+	_ = b
+	// match: (Less8U  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(uint8(c)  < uint8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto end263ecdc279924bff8771dd1ac3f42222
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto end263ecdc279924bff8771dd1ac3f42222
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(uint8(c) < uint8(d))
+		return true
+	}
+	goto end263ecdc279924bff8771dd1ac3f42222
+end263ecdc279924bff8771dd1ac3f42222:
+	;
+	return false
+}
 func rewriteValuegeneric_OpLoad(v *Value, config *Config) bool {
 	b := v.Block
 	_ = b
@@ -1158,6 +2174,28 @@
 	goto ende76a50b524aeb16c7aeccf5f5cc60c06
 ende76a50b524aeb16c7aeccf5f5cc60c06:
 	;
+	// match: (Neq16 (Const16 [c]) (Const16 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int16(c) != int16(d))])
+	{
+		if v.Args[0].Op != OpConst16 {
+			goto end6302c9b645bb191982d28c2f846904d6
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst16 {
+			goto end6302c9b645bb191982d28c2f846904d6
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int16(c) != int16(d))
+		return true
+	}
+	goto end6302c9b645bb191982d28c2f846904d6
+end6302c9b645bb191982d28c2f846904d6:
+	;
 	return false
 }
 func rewriteValuegeneric_OpNeq32(v *Value, config *Config) bool {
@@ -1181,6 +2219,28 @@
 	goto end3713a608cffd29b40ff7c3b3f2585cbb
 end3713a608cffd29b40ff7c3b3f2585cbb:
 	;
+	// match: (Neq32 (Const32 [c]) (Const32 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int32(c) != int32(d))])
+	{
+		if v.Args[0].Op != OpConst32 {
+			goto endf9f3d0814854d2d0879d331e9bdfcae2
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst32 {
+			goto endf9f3d0814854d2d0879d331e9bdfcae2
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int32(c) != int32(d))
+		return true
+	}
+	goto endf9f3d0814854d2d0879d331e9bdfcae2
+endf9f3d0814854d2d0879d331e9bdfcae2:
+	;
 	return false
 }
 func rewriteValuegeneric_OpNeq64(v *Value, config *Config) bool {
@@ -1204,6 +2264,28 @@
 	goto end3601ad382705ea12b79d2008c1e5725c
 end3601ad382705ea12b79d2008c1e5725c:
 	;
+	// match: (Neq64 (Const64 [c]) (Const64 [d]))
+	// cond:
+	// result: (ConstBool [b2i(int64(c) != int64(d))])
+	{
+		if v.Args[0].Op != OpConst64 {
+			goto endf07433ecd3c150b1b75e943aa44a7203
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst64 {
+			goto endf07433ecd3c150b1b75e943aa44a7203
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int64(c) != int64(d))
+		return true
+	}
+	goto endf07433ecd3c150b1b75e943aa44a7203
+endf07433ecd3c150b1b75e943aa44a7203:
+	;
 	return false
 }
 func rewriteValuegeneric_OpNeq8(v *Value, config *Config) bool {
@@ -1227,6 +2309,28 @@
 	goto end09a0deaf3c42627d0d2d3efa96e30745
 end09a0deaf3c42627d0d2d3efa96e30745:
 	;
+	// match: (Neq8  (Const8  [c]) (Const8  [d]))
+	// cond:
+	// result: (ConstBool [b2i(int8(c)  != int8(d))])
+	{
+		if v.Args[0].Op != OpConst8 {
+			goto end72ebdaf2de9b3aa57cf0cb8e068b5f9c
+		}
+		c := v.Args[0].AuxInt
+		if v.Args[1].Op != OpConst8 {
+			goto end72ebdaf2de9b3aa57cf0cb8e068b5f9c
+		}
+		d := v.Args[1].AuxInt
+		v.Op = OpConstBool
+		v.AuxInt = 0
+		v.Aux = nil
+		v.resetArgs()
+		v.AuxInt = b2i(int8(c) != int8(d))
+		return true
+	}
+	goto end72ebdaf2de9b3aa57cf0cb8e068b5f9c
+end72ebdaf2de9b3aa57cf0cb8e068b5f9c:
+	;
 	return false
 }
 func rewriteValuegeneric_OpNeqInter(v *Value, config *Config) bool {