cmd/compile: constant fold CtzNN

Change-Id: I3ecd2c7ed3c8ae35c2bb9562aed09f7ade5c8cdd
Reviewed-on: https://go-review.googlesource.com/c/go/+/221609
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2020-02-28 12:36:03 -08:00
parent 7b30a2d268
commit 82253ddc7a
3 changed files with 166 additions and 3 deletions

View file

@ -50,6 +50,14 @@ func rewriteValuegeneric(v *Value) bool {
return rewriteValuegeneric_OpConstString(v)
case OpConvert:
return rewriteValuegeneric_OpConvert(v)
case OpCtz16:
return rewriteValuegeneric_OpCtz16(v)
case OpCtz32:
return rewriteValuegeneric_OpCtz32(v)
case OpCtz64:
return rewriteValuegeneric_OpCtz64(v)
case OpCtz8:
return rewriteValuegeneric_OpCtz8(v)
case OpCvt32Fto32:
return rewriteValuegeneric_OpCvt32Fto32(v)
case OpCvt32Fto64:
@ -4048,6 +4056,150 @@ func rewriteValuegeneric_OpConvert(v *Value) bool {
}
return false
}
func rewriteValuegeneric_OpCtz16(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
// match: (Ctz16 (Const16 [c]))
// cond: config.PtrSize == 4
// result: (Const32 [ntz16(c)])
for {
if v_0.Op != OpConst16 {
break
}
c := v_0.AuxInt
if !(config.PtrSize == 4) {
break
}
v.reset(OpConst32)
v.AuxInt = ntz16(c)
return true
}
// match: (Ctz16 (Const16 [c]))
// cond: config.PtrSize == 8
// result: (Const64 [ntz16(c)])
for {
if v_0.Op != OpConst16 {
break
}
c := v_0.AuxInt
if !(config.PtrSize == 8) {
break
}
v.reset(OpConst64)
v.AuxInt = ntz16(c)
return true
}
return false
}
func rewriteValuegeneric_OpCtz32(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
// match: (Ctz32 (Const32 [c]))
// cond: config.PtrSize == 4
// result: (Const32 [ntz32(c)])
for {
if v_0.Op != OpConst32 {
break
}
c := v_0.AuxInt
if !(config.PtrSize == 4) {
break
}
v.reset(OpConst32)
v.AuxInt = ntz32(c)
return true
}
// match: (Ctz32 (Const32 [c]))
// cond: config.PtrSize == 8
// result: (Const64 [ntz32(c)])
for {
if v_0.Op != OpConst32 {
break
}
c := v_0.AuxInt
if !(config.PtrSize == 8) {
break
}
v.reset(OpConst64)
v.AuxInt = ntz32(c)
return true
}
return false
}
func rewriteValuegeneric_OpCtz64(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
// match: (Ctz64 (Const64 [c]))
// cond: config.PtrSize == 4
// result: (Const32 [ntz(c)])
for {
if v_0.Op != OpConst64 {
break
}
c := v_0.AuxInt
if !(config.PtrSize == 4) {
break
}
v.reset(OpConst32)
v.AuxInt = ntz(c)
return true
}
// match: (Ctz64 (Const64 [c]))
// cond: config.PtrSize == 8
// result: (Const64 [ntz(c)])
for {
if v_0.Op != OpConst64 {
break
}
c := v_0.AuxInt
if !(config.PtrSize == 8) {
break
}
v.reset(OpConst64)
v.AuxInt = ntz(c)
return true
}
return false
}
func rewriteValuegeneric_OpCtz8(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
config := b.Func.Config
// match: (Ctz8 (Const8 [c]))
// cond: config.PtrSize == 4
// result: (Const32 [ntz8(c)])
for {
if v_0.Op != OpConst8 {
break
}
c := v_0.AuxInt
if !(config.PtrSize == 4) {
break
}
v.reset(OpConst32)
v.AuxInt = ntz8(c)
return true
}
// match: (Ctz8 (Const8 [c]))
// cond: config.PtrSize == 8
// result: (Const64 [ntz8(c)])
for {
if v_0.Op != OpConst8 {
break
}
c := v_0.AuxInt
if !(config.PtrSize == 8) {
break
}
v.reset(OpConst64)
v.AuxInt = ntz8(c)
return true
}
return false
}
func rewriteValuegeneric_OpCvt32Fto32(v *Value) bool {
v_0 := v.Args[0]
// match: (Cvt32Fto32 (Const32F [c]))