(Round64F x:(Const64F)) => x
(CvtBoolToUint8 (ConstBool [false])) => (Const8 [0])
(CvtBoolToUint8 (ConstBool [true])) => (Const8 [1])
+(BitLen64 (Const64 [c])) && config.PtrSize == 8 => (Const64 [int64(bits.Len64(uint64(c)))])
+(BitLen32 (Const32 [c])) && config.PtrSize == 8 => (Const64 [int64(bits.Len32(uint32(c)))])
+(BitLen16 (Const16 [c])) && config.PtrSize == 8 => (Const64 [int64(bits.Len16(uint16(c)))])
+(BitLen8 (Const8 [c])) && config.PtrSize == 8 => (Const64 [int64(bits.Len8(uint8(c)))])
+(BitLen64 (Const64 [c])) && config.PtrSize == 4 => (Const32 [int32(bits.Len64(uint64(c)))])
+(BitLen32 (Const32 [c])) && config.PtrSize == 4 => (Const32 [int32(bits.Len32(uint32(c)))])
+(BitLen16 (Const16 [c])) && config.PtrSize == 4 => (Const32 [int32(bits.Len16(uint16(c)))])
+(BitLen8 (Const8 [c])) && config.PtrSize == 4 => (Const32 [int32(bits.Len8(uint8(c)))])
(Trunc16to8 (ZeroExt8to16 x)) => x
(Trunc32to8 (ZeroExt8to32 x)) => x
package ssa
import "math"
+import "math/bits"
import "cmd/internal/obj"
import "cmd/compile/internal/types"
import "cmd/compile/internal/ir"
return rewriteValuegeneric_OpAndB(v)
case OpArraySelect:
return rewriteValuegeneric_OpArraySelect(v)
+ case OpBitLen16:
+ return rewriteValuegeneric_OpBitLen16(v)
+ case OpBitLen32:
+ return rewriteValuegeneric_OpBitLen32(v)
+ case OpBitLen64:
+ return rewriteValuegeneric_OpBitLen64(v)
+ case OpBitLen8:
+ return rewriteValuegeneric_OpBitLen8(v)
case OpCeil:
return rewriteValuegeneric_OpCeil(v)
case OpCom16:
}
return false
}
+func rewriteValuegeneric_OpBitLen16(v *Value) bool {
+ v_0 := v.Args[0]
+ b := v.Block
+ config := b.Func.Config
+ // match: (BitLen16 (Const16 [c]))
+ // cond: config.PtrSize == 8
+ // result: (Const64 [int64(bits.Len16(uint16(c)))])
+ for {
+ if v_0.Op != OpConst16 {
+ break
+ }
+ c := auxIntToInt16(v_0.AuxInt)
+ if !(config.PtrSize == 8) {
+ break
+ }
+ v.reset(OpConst64)
+ v.AuxInt = int64ToAuxInt(int64(bits.Len16(uint16(c))))
+ return true
+ }
+ // match: (BitLen16 (Const16 [c]))
+ // cond: config.PtrSize == 4
+ // result: (Const32 [int32(bits.Len16(uint16(c)))])
+ for {
+ if v_0.Op != OpConst16 {
+ break
+ }
+ c := auxIntToInt16(v_0.AuxInt)
+ if !(config.PtrSize == 4) {
+ break
+ }
+ v.reset(OpConst32)
+ v.AuxInt = int32ToAuxInt(int32(bits.Len16(uint16(c))))
+ return true
+ }
+ return false
+}
+func rewriteValuegeneric_OpBitLen32(v *Value) bool {
+ v_0 := v.Args[0]
+ b := v.Block
+ config := b.Func.Config
+ // match: (BitLen32 (Const32 [c]))
+ // cond: config.PtrSize == 8
+ // result: (Const64 [int64(bits.Len32(uint32(c)))])
+ for {
+ if v_0.Op != OpConst32 {
+ break
+ }
+ c := auxIntToInt32(v_0.AuxInt)
+ if !(config.PtrSize == 8) {
+ break
+ }
+ v.reset(OpConst64)
+ v.AuxInt = int64ToAuxInt(int64(bits.Len32(uint32(c))))
+ return true
+ }
+ // match: (BitLen32 (Const32 [c]))
+ // cond: config.PtrSize == 4
+ // result: (Const32 [int32(bits.Len32(uint32(c)))])
+ for {
+ if v_0.Op != OpConst32 {
+ break
+ }
+ c := auxIntToInt32(v_0.AuxInt)
+ if !(config.PtrSize == 4) {
+ break
+ }
+ v.reset(OpConst32)
+ v.AuxInt = int32ToAuxInt(int32(bits.Len32(uint32(c))))
+ return true
+ }
+ return false
+}
+func rewriteValuegeneric_OpBitLen64(v *Value) bool {
+ v_0 := v.Args[0]
+ b := v.Block
+ config := b.Func.Config
+ // match: (BitLen64 (Const64 [c]))
+ // cond: config.PtrSize == 8
+ // result: (Const64 [int64(bits.Len64(uint64(c)))])
+ for {
+ if v_0.Op != OpConst64 {
+ break
+ }
+ c := auxIntToInt64(v_0.AuxInt)
+ if !(config.PtrSize == 8) {
+ break
+ }
+ v.reset(OpConst64)
+ v.AuxInt = int64ToAuxInt(int64(bits.Len64(uint64(c))))
+ return true
+ }
+ // match: (BitLen64 (Const64 [c]))
+ // cond: config.PtrSize == 4
+ // result: (Const32 [int32(bits.Len64(uint64(c)))])
+ for {
+ if v_0.Op != OpConst64 {
+ break
+ }
+ c := auxIntToInt64(v_0.AuxInt)
+ if !(config.PtrSize == 4) {
+ break
+ }
+ v.reset(OpConst32)
+ v.AuxInt = int32ToAuxInt(int32(bits.Len64(uint64(c))))
+ return true
+ }
+ return false
+}
+func rewriteValuegeneric_OpBitLen8(v *Value) bool {
+ v_0 := v.Args[0]
+ b := v.Block
+ config := b.Func.Config
+ // match: (BitLen8 (Const8 [c]))
+ // cond: config.PtrSize == 8
+ // result: (Const64 [int64(bits.Len8(uint8(c)))])
+ for {
+ if v_0.Op != OpConst8 {
+ break
+ }
+ c := auxIntToInt8(v_0.AuxInt)
+ if !(config.PtrSize == 8) {
+ break
+ }
+ v.reset(OpConst64)
+ v.AuxInt = int64ToAuxInt(int64(bits.Len8(uint8(c))))
+ return true
+ }
+ // match: (BitLen8 (Const8 [c]))
+ // cond: config.PtrSize == 4
+ // result: (Const32 [int32(bits.Len8(uint8(c)))])
+ for {
+ if v_0.Op != OpConst8 {
+ break
+ }
+ c := auxIntToInt8(v_0.AuxInt)
+ if !(config.PtrSize == 4) {
+ break
+ }
+ v.reset(OpConst32)
+ v.AuxInt = int32ToAuxInt(int32(bits.Len8(uint8(c))))
+ return true
+ }
+ return false
+}
func rewriteValuegeneric_OpCeil(v *Value) bool {
v_0 := v.Args[0]
// match: (Ceil (Const64F [c]))