(Const32 <typ.UInt32> [int64(1<<15+(umagic(16,c).m+1)/2)])
(Rsh32Ux64 <typ.UInt32> (ZeroExt16to32 x) (Const64 <typ.UInt64> [1])))
(Const64 <typ.UInt64> [16+umagic(16,c).s-2])))
-(Div16u x (Const16 [c])) && umagicOK(16, c) && config.RegSize == 4 ->
+(Div16u x (Const16 [c])) && umagicOK(16, c) && config.RegSize == 4 && config.useAvg ->
(Trunc32to16
(Rsh32Ux64 <typ.UInt32>
(Avg32u
(Const64 <typ.UInt64> [16+umagic(16,c).s-1])))
// For 32-bit divides on 32-bit machines
-(Div32u x (Const32 [c])) && umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 ->
+(Div32u x (Const32 [c])) && umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 && config.useHmul ->
(Rsh32Ux64 <typ.UInt32>
(Hmul32u <typ.UInt32>
(Const32 <typ.UInt32> [int64(int32(1<<31+umagic(32,c).m/2))])
x)
(Const64 <typ.UInt64> [umagic(32,c).s-1]))
-(Div32u x (Const32 [c])) && umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 ->
+(Div32u x (Const32 [c])) && umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 && config.useHmul ->
(Rsh32Ux64 <typ.UInt32>
(Hmul32u <typ.UInt32>
(Const32 <typ.UInt32> [int64(int32(1<<31+(umagic(32,c).m+1)/2))])
(Rsh32Ux64 <typ.UInt32> x (Const64 <typ.UInt64> [1])))
(Const64 <typ.UInt64> [umagic(32,c).s-2]))
-(Div32u x (Const32 [c])) && umagicOK(32, c) && config.RegSize == 4 ->
+(Div32u x (Const32 [c])) && umagicOK(32, c) && config.RegSize == 4 && config.useAvg && config.useHmul ->
(Rsh32Ux64 <typ.UInt32>
(Avg32u
x
(Const64 <typ.UInt64> [int64(1<<31+(umagic(32,c).m+1)/2)])
(Rsh64Ux64 <typ.UInt64> (ZeroExt32to64 x) (Const64 <typ.UInt64> [1])))
(Const64 <typ.UInt64> [32+umagic(32,c).s-2])))
-(Div32u x (Const32 [c])) && umagicOK(32, c) && config.RegSize == 8 ->
+(Div32u x (Const32 [c])) && umagicOK(32, c) && config.RegSize == 8 && config.useAvg ->
(Trunc64to32
(Rsh64Ux64 <typ.UInt64>
(Avg64u
// For 64-bit divides on 64-bit machines
// (64-bit divides on 32-bit machines are lowered to a runtime call by the walk pass.)
-(Div64u x (Const64 [c])) && umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 ->
+(Div64u x (Const64 [c])) && umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 && config.useHmul ->
(Rsh64Ux64 <typ.UInt64>
(Hmul64u <typ.UInt64>
(Const64 <typ.UInt64> [int64(1<<63+umagic(64,c).m/2)])
x)
(Const64 <typ.UInt64> [umagic(64,c).s-1]))
-(Div64u x (Const64 [c])) && umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 ->
+(Div64u x (Const64 [c])) && umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 && config.useHmul ->
(Rsh64Ux64 <typ.UInt64>
(Hmul64u <typ.UInt64>
(Const64 <typ.UInt64> [int64(1<<63+(umagic(64,c).m+1)/2)])
(Rsh64Ux64 <typ.UInt64> x (Const64 <typ.UInt64> [1])))
(Const64 <typ.UInt64> [umagic(64,c).s-2]))
-(Div64u x (Const64 [c])) && umagicOK(64, c) && config.RegSize == 8 ->
+(Div64u x (Const64 [c])) && umagicOK(64, c) && config.RegSize == 8 && config.useAvg && config.useHmul ->
(Rsh64Ux64 <typ.UInt64>
(Avg64u
x
(Rsh64x64 <t>
(SignExt32to64 x)
(Const64 <typ.UInt64> [63])))
-(Div32 <t> x (Const32 [c])) && smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 ->
+(Div32 <t> x (Const32 [c])) && smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 && config.useHmul ->
(Sub32 <t>
(Rsh32x64 <t>
(Hmul32 <t>
(Rsh32x64 <t>
x
(Const64 <typ.UInt64> [31])))
-(Div32 <t> x (Const32 [c])) && smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 ->
+(Div32 <t> x (Const32 [c])) && smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 && config.useHmul ->
(Sub32 <t>
(Rsh32x64 <t>
(Add32 <t>
(Rsh32x64 <t>
x
(Const64 <typ.UInt64> [31])))
-(Div64 <t> x (Const64 [c])) && smagicOK(64,c) && smagic(64,c).m&1 == 0 ->
+(Div64 <t> x (Const64 [c])) && smagicOK(64,c) && smagic(64,c).m&1 == 0 && config.useHmul ->
(Sub64 <t>
(Rsh64x64 <t>
(Hmul64 <t>
(Rsh64x64 <t>
x
(Const64 <typ.UInt64> [63])))
-(Div64 <t> x (Const64 [c])) && smagicOK(64,c) && smagic(64,c).m&1 != 0 ->
+(Div64 <t> x (Const64 [c])) && smagicOK(64,c) && smagic(64,c).m&1 != 0 && config.useHmul ->
(Sub64 <t>
(Rsh64x64 <t>
(Add64 <t>
return true
}
// match: (Div16u x (Const16 [c]))
- // cond: umagicOK(16, c) && config.RegSize == 4
+ // cond: umagicOK(16, c) && config.RegSize == 4 && config.useAvg
// result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Avg32u (Lsh32x64 <typ.UInt32> (ZeroExt16to32 x) (Const64 <typ.UInt64> [16])) (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(umagic(16,c).m)]) (ZeroExt16to32 x))) (Const64 <typ.UInt64> [16+umagic(16,c).s-1])))
for {
_ = v.Args[1]
break
}
c := v_1.AuxInt
- if !(umagicOK(16, c) && config.RegSize == 4) {
+ if !(umagicOK(16, c) && config.RegSize == 4 && config.useAvg) {
break
}
v.reset(OpTrunc32to16)
return true
}
// match: (Div32 <t> x (Const32 [c]))
- // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0
+ // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 && config.useHmul
// result: (Sub32 <t> (Rsh32x64 <t> (Hmul32 <t> (Const32 <typ.UInt32> [int64(int32(smagic(32,c).m/2))]) x) (Const64 <typ.UInt64> [smagic(32,c).s-1])) (Rsh32x64 <t> x (Const64 <typ.UInt64> [31])))
for {
t := v.Type
break
}
c := v_1.AuxInt
- if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0) {
+ if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0 && config.useHmul) {
break
}
v.reset(OpSub32)
return true
}
// match: (Div32 <t> x (Const32 [c]))
- // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0
+ // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 && config.useHmul
// result: (Sub32 <t> (Rsh32x64 <t> (Add32 <t> (Hmul32 <t> (Const32 <typ.UInt32> [int64(int32(smagic(32,c).m))]) x) x) (Const64 <typ.UInt64> [smagic(32,c).s])) (Rsh32x64 <t> x (Const64 <typ.UInt64> [31])))
for {
t := v.Type
break
}
c := v_1.AuxInt
- if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0) {
+ if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0 && config.useHmul) {
break
}
v.reset(OpSub32)
return true
}
// match: (Div32u x (Const32 [c]))
- // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0
+ // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 && config.useHmul
// result: (Rsh32Ux64 <typ.UInt32> (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(1<<31+umagic(32,c).m/2))]) x) (Const64 <typ.UInt64> [umagic(32,c).s-1]))
for {
_ = v.Args[1]
break
}
c := v_1.AuxInt
- if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0) {
+ if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0 && config.useHmul) {
break
}
v.reset(OpRsh32Ux64)
return true
}
// match: (Div32u x (Const32 [c]))
- // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0
+ // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 && config.useHmul
// result: (Rsh32Ux64 <typ.UInt32> (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(1<<31+(umagic(32,c).m+1)/2))]) (Rsh32Ux64 <typ.UInt32> x (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [umagic(32,c).s-2]))
for {
_ = v.Args[1]
break
}
c := v_1.AuxInt
- if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0) {
+ if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 && config.useHmul) {
break
}
v.reset(OpRsh32Ux64)
return true
}
// match: (Div32u x (Const32 [c]))
- // cond: umagicOK(32, c) && config.RegSize == 4
+ // cond: umagicOK(32, c) && config.RegSize == 4 && config.useAvg && config.useHmul
// result: (Rsh32Ux64 <typ.UInt32> (Avg32u x (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(umagic(32,c).m))]) x)) (Const64 <typ.UInt64> [umagic(32,c).s-1]))
for {
_ = v.Args[1]
break
}
c := v_1.AuxInt
- if !(umagicOK(32, c) && config.RegSize == 4) {
+ if !(umagicOK(32, c) && config.RegSize == 4 && config.useAvg && config.useHmul) {
break
}
v.reset(OpRsh32Ux64)
return true
}
// match: (Div32u x (Const32 [c]))
- // cond: umagicOK(32, c) && config.RegSize == 8
+ // cond: umagicOK(32, c) && config.RegSize == 8 && config.useAvg
// result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Avg64u (Lsh64x64 <typ.UInt64> (ZeroExt32to64 x) (Const64 <typ.UInt64> [32])) (Mul64 <typ.UInt64> (Const64 <typ.UInt32> [int64(umagic(32,c).m)]) (ZeroExt32to64 x))) (Const64 <typ.UInt64> [32+umagic(32,c).s-1])))
for {
_ = v.Args[1]
break
}
c := v_1.AuxInt
- if !(umagicOK(32, c) && config.RegSize == 8) {
+ if !(umagicOK(32, c) && config.RegSize == 8 && config.useAvg) {
break
}
v.reset(OpTrunc64to32)
func rewriteValuegeneric_OpDiv64_0(v *Value) bool {
b := v.Block
_ = b
+ config := b.Func.Config
+ _ = config
typ := &b.Func.Config.Types
_ = typ
// match: (Div64 (Const64 [c]) (Const64 [d]))
return true
}
// match: (Div64 <t> x (Const64 [c]))
- // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0
+ // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 && config.useHmul
// result: (Sub64 <t> (Rsh64x64 <t> (Hmul64 <t> (Const64 <typ.UInt64> [int64(smagic(64,c).m/2)]) x) (Const64 <typ.UInt64> [smagic(64,c).s-1])) (Rsh64x64 <t> x (Const64 <typ.UInt64> [63])))
for {
t := v.Type
break
}
c := v_1.AuxInt
- if !(smagicOK(64, c) && smagic(64, c).m&1 == 0) {
+ if !(smagicOK(64, c) && smagic(64, c).m&1 == 0 && config.useHmul) {
break
}
v.reset(OpSub64)
return true
}
// match: (Div64 <t> x (Const64 [c]))
- // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0
+ // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 && config.useHmul
// result: (Sub64 <t> (Rsh64x64 <t> (Add64 <t> (Hmul64 <t> (Const64 <typ.UInt64> [int64(smagic(64,c).m)]) x) x) (Const64 <typ.UInt64> [smagic(64,c).s])) (Rsh64x64 <t> x (Const64 <typ.UInt64> [63])))
for {
t := v.Type
break
}
c := v_1.AuxInt
- if !(smagicOK(64, c) && smagic(64, c).m&1 != 0) {
+ if !(smagicOK(64, c) && smagic(64, c).m&1 != 0 && config.useHmul) {
break
}
v.reset(OpSub64)
return true
}
// match: (Div64u x (Const64 [c]))
- // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0
+ // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 && config.useHmul
// result: (Rsh64Ux64 <typ.UInt64> (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<63+umagic(64,c).m/2)]) x) (Const64 <typ.UInt64> [umagic(64,c).s-1]))
for {
_ = v.Args[1]
break
}
c := v_1.AuxInt
- if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) {
+ if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0 && config.useHmul) {
break
}
v.reset(OpRsh64Ux64)
return true
}
// match: (Div64u x (Const64 [c]))
- // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0
+ // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 && config.useHmul
// result: (Rsh64Ux64 <typ.UInt64> (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<63+(umagic(64,c).m+1)/2)]) (Rsh64Ux64 <typ.UInt64> x (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [umagic(64,c).s-2]))
for {
_ = v.Args[1]
break
}
c := v_1.AuxInt
- if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) {
+ if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 && config.useHmul) {
break
}
v.reset(OpRsh64Ux64)
return true
}
// match: (Div64u x (Const64 [c]))
- // cond: umagicOK(64, c) && config.RegSize == 8
+ // cond: umagicOK(64, c) && config.RegSize == 8 && config.useAvg && config.useHmul
// result: (Rsh64Ux64 <typ.UInt64> (Avg64u x (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(umagic(64,c).m)]) x)) (Const64 <typ.UInt64> [umagic(64,c).s-1]))
for {
_ = v.Args[1]
break
}
c := v_1.AuxInt
- if !(umagicOK(64, c) && config.RegSize == 8) {
+ if !(umagicOK(64, c) && config.RegSize == 8 && config.useAvg && config.useHmul) {
break
}
v.reset(OpRsh64Ux64)