mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:10 -07:00
cmd/compile: Improve const shifts in PPC64.rules
This change updates PPC64.rules to recognize constant shift counts and generate more efficient code sequences in those cases. Fixes #17336 Change-Id: I8a7b812408d7a68388df41e42bad045dd214be17 Reviewed-on: https://go-review.googlesource.com/30310 Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
f54c0db859
commit
6dd38ebae1
@ -75,6 +75,85 @@
|
|||||||
|
|
||||||
(Sqrt x) -> (FSQRT x)
|
(Sqrt x) -> (FSQRT x)
|
||||||
|
|
||||||
|
// Lowering constants
|
||||||
|
(Const8 [val]) -> (MOVDconst [val])
|
||||||
|
(Const16 [val]) -> (MOVDconst [val])
|
||||||
|
(Const32 [val]) -> (MOVDconst [val])
|
||||||
|
(Const64 [val]) -> (MOVDconst [val])
|
||||||
|
(Const32F [val]) -> (FMOVSconst [val])
|
||||||
|
(Const64F [val]) -> (FMOVDconst [val])
|
||||||
|
(ConstNil) -> (MOVDconst [0])
|
||||||
|
(ConstBool [b]) -> (MOVDconst [b])
|
||||||
|
|
||||||
|
(Lsh64x64 x (Const64 [c])) && uint64(c) < 64 -> (SLDconst x [c])
|
||||||
|
(Rsh64x64 x (Const64 [c])) && uint64(c) < 64 -> (SRADconst x [c])
|
||||||
|
(Rsh64Ux64 x (Const64 [c])) && uint64(c) < 64 -> (SRDconst x [c])
|
||||||
|
(Lsh32x64 x (Const64 [c])) && uint64(c) < 32 -> (SLWconst x [c])
|
||||||
|
(Rsh32x64 x (Const64 [c])) && uint64(c) < 32 -> (SRAWconst x [c])
|
||||||
|
(Rsh32Ux64 x (Const64 [c])) && uint64(c) < 32 -> (SRWconst x [c])
|
||||||
|
(Lsh16x64 x (Const64 [c])) && uint64(c) < 16 -> (SLWconst x [c])
|
||||||
|
(Rsh16x64 x (Const64 [c])) && uint64(c) < 16 -> (SRAWconst (SignExt16to32 x) [c])
|
||||||
|
(Rsh16Ux64 x (Const64 [c])) && uint64(c) < 16 -> (SRWconst (ZeroExt16to32 x) [c])
|
||||||
|
(Lsh8x64 x (Const64 [c])) && uint64(c) < 8 -> (SLWconst x [c])
|
||||||
|
(Rsh8x64 x (Const64 [c])) && uint64(c) < 8 -> (SRAWconst (SignExt8to32 x) [c])
|
||||||
|
(Rsh8Ux64 x (Const64 [c])) && uint64(c) < 8 -> (SRWconst (ZeroExt8to32 x) [c])
|
||||||
|
|
||||||
|
(Lsh64x32 x (Const64 [c])) && uint32(c) < 64 -> (SLDconst x [c])
|
||||||
|
(Rsh64x32 x (Const64 [c])) && uint32(c) < 64 -> (SRADconst x [c])
|
||||||
|
(Rsh64Ux32 x (Const64 [c])) && uint32(c) < 64 -> (SRDconst x [c])
|
||||||
|
(Lsh32x32 x (Const64 [c])) && uint32(c) < 32 -> (SLWconst x [c])
|
||||||
|
(Rsh32x32 x (Const64 [c])) && uint32(c) < 32 -> (SRAWconst x [c])
|
||||||
|
(Rsh32Ux32 x (Const64 [c])) && uint32(c) < 32 -> (SRWconst x [c])
|
||||||
|
(Lsh16x32 x (Const64 [c])) && uint32(c) < 16 -> (SLWconst x [c])
|
||||||
|
(Rsh16x32 x (Const64 [c])) && uint32(c) < 16 -> (SRAWconst (SignExt16to32 x) [c])
|
||||||
|
(Rsh16Ux32 x (Const64 [c])) && uint32(c) < 16 -> (SRWconst (ZeroExt16to32 x) [c])
|
||||||
|
(Lsh8x32 x (Const64 [c])) && uint32(c) < 8 -> (SLWconst x [c])
|
||||||
|
(Rsh8x32 x (Const64 [c])) && uint32(c) < 8 -> (SRAWconst (SignExt8to32 x) [c])
|
||||||
|
(Rsh8Ux32 x (Const64 [c])) && uint32(c) < 8 -> (SRWconst (ZeroExt8to32 x) [c])
|
||||||
|
|
||||||
|
// large constant shifts
|
||||||
|
(Lsh64x64 _ (Const64 [c])) && uint64(c) >= 64 -> (MOVDconst [0])
|
||||||
|
(Rsh64Ux64 _ (Const64 [c])) && uint64(c) >= 64 -> (MOVDconst [0])
|
||||||
|
(Lsh32x64 _ (Const64 [c])) && uint64(c) >= 32 -> (MOVDconst [0])
|
||||||
|
(Rsh32Ux64 _ (Const64 [c])) && uint64(c) >= 32 -> (MOVDconst [0])
|
||||||
|
(Lsh16x64 _ (Const64 [c])) && uint64(c) >= 16 -> (MOVDconst [0])
|
||||||
|
(Rsh16Ux64 _ (Const64 [c])) && uint64(c) >= 16 -> (MOVDconst [0])
|
||||||
|
(Lsh8x64 _ (Const64 [c])) && uint64(c) >= 8 -> (MOVDconst [0])
|
||||||
|
(Rsh8Ux64 _ (Const64 [c])) && uint64(c) >= 8 -> (MOVDconst [0])
|
||||||
|
|
||||||
|
// large constant signed right shift, we leave the sign bit
|
||||||
|
(Rsh64x64 x (Const64 [c])) && uint64(c) >= 64 -> (SRADconst x [63])
|
||||||
|
(Rsh32x64 x (Const64 [c])) && uint64(c) >= 32 -> (SRAWconst x [63])
|
||||||
|
(Rsh16x64 x (Const64 [c])) && uint64(c) >= 16 -> (SRAWconst (SignExt16to32 x) [63])
|
||||||
|
(Rsh8x64 x (Const64 [c])) && uint64(c) >= 8 -> (SRAWconst (SignExt8to32 x) [63])
|
||||||
|
|
||||||
|
// constant shifts
|
||||||
|
(Lsh64x64 x (MOVDconst [c])) && uint64(c) < 64 -> (SLDconst x [c])
|
||||||
|
(Rsh64x64 x (MOVDconst [c])) && uint64(c) < 64 -> (SRADconst x [c])
|
||||||
|
(Rsh64Ux64 x (MOVDconst [c])) && uint64(c) < 64 -> (SRDconst x [c])
|
||||||
|
(Lsh32x64 x (MOVDconst [c])) && uint64(c) < 32 -> (SLWconst x [c])
|
||||||
|
(Rsh32x64 x (MOVDconst [c])) && uint64(c) < 32 -> (SRAWconst x [c])
|
||||||
|
(Rsh32Ux64 x (MOVDconst [c])) && uint64(c) < 32 -> (SRWconst x [c])
|
||||||
|
(Lsh16x64 x (MOVDconst [c])) && uint64(c) < 16 -> (SLWconst x [c])
|
||||||
|
(Rsh16x64 x (MOVDconst [c])) && uint64(c) < 16 -> (SRAWconst (SignExt16to32 x) [c])
|
||||||
|
(Rsh16Ux64 x (MOVDconst [c])) && uint64(c) < 16 -> (SRWconst (ZeroExt16to32 x) [c])
|
||||||
|
(Lsh8x64 x (MOVDconst [c])) && uint64(c) < 8 -> (SLWconst x [c])
|
||||||
|
(Rsh8x64 x (MOVDconst [c])) && uint64(c) < 8 -> (SRAWconst (SignExt8to32 x) [c])
|
||||||
|
(Rsh8Ux64 x (MOVDconst [c])) && uint64(c) < 8 -> (SRWconst (ZeroExt8to32 x) [c])
|
||||||
|
|
||||||
|
(Lsh64x32 x (MOVDconst [c])) && uint32(c) < 64 -> (SLDconst x [c])
|
||||||
|
(Rsh64x32 x (MOVDconst [c])) && uint32(c) < 64 -> (SRADconst x [c])
|
||||||
|
(Rsh64Ux32 x (MOVDconst [c])) && uint32(c) < 64 -> (SRDconst x [c])
|
||||||
|
(Lsh32x32 x (MOVDconst [c])) && uint32(c) < 32 -> (SLWconst x [c])
|
||||||
|
(Rsh32x32 x (MOVDconst [c])) && uint32(c) < 32 -> (SRAWconst x [c])
|
||||||
|
(Rsh32Ux32 x (MOVDconst [c])) && uint32(c) < 32 -> (SRWconst x [c])
|
||||||
|
(Lsh16x32 x (MOVDconst [c])) && uint32(c) < 16 -> (SLWconst x [c])
|
||||||
|
(Rsh16x32 x (MOVDconst [c])) && uint32(c) < 16 -> (SRAWconst (SignExt16to32 x) [c])
|
||||||
|
(Rsh16Ux32 x (MOVDconst [c])) && uint32(c) < 16 -> (SRWconst (ZeroExt16to32 x) [c])
|
||||||
|
(Lsh8x32 x (MOVDconst [c])) && uint32(c) < 8 -> (SLWconst x [c])
|
||||||
|
(Rsh8x32 x (MOVDconst [c])) && uint32(c) < 8 -> (SRAWconst (SignExt8to32 x) [c])
|
||||||
|
(Rsh8Ux32 x (MOVDconst [c])) && uint32(c) < 8 -> (SRWconst (ZeroExt8to32 x) [c])
|
||||||
|
|
||||||
(Rsh64x64 x y) -> (SRAD x (ORN y <config.fe.TypeInt64()> (MaskIfNotCarry (ADDconstForCarry [-64] y))))
|
(Rsh64x64 x y) -> (SRAD x (ORN y <config.fe.TypeInt64()> (MaskIfNotCarry (ADDconstForCarry [-64] y))))
|
||||||
(Rsh64Ux64 x y) -> (SRD x (ORN y <config.fe.TypeInt64()> (MaskIfNotCarry (ADDconstForCarry [-64] y))))
|
(Rsh64Ux64 x y) -> (SRD x (ORN y <config.fe.TypeInt64()> (MaskIfNotCarry (ADDconstForCarry [-64] y))))
|
||||||
(Lsh64x64 x y) -> (SLD x (ORN y <config.fe.TypeInt64()> (MaskIfNotCarry (ADDconstForCarry [-64] y))))
|
(Lsh64x64 x y) -> (SLD x (ORN y <config.fe.TypeInt64()> (MaskIfNotCarry (ADDconstForCarry [-64] y))))
|
||||||
@ -148,16 +227,6 @@
|
|||||||
// (MaskIfNotCarry CarrySet) -> 0
|
// (MaskIfNotCarry CarrySet) -> 0
|
||||||
// (MaskIfNotCarry CarrySet) -> -1
|
// (MaskIfNotCarry CarrySet) -> -1
|
||||||
|
|
||||||
// Lowering constants
|
|
||||||
(Const8 [val]) -> (MOVDconst [val])
|
|
||||||
(Const16 [val]) -> (MOVDconst [val])
|
|
||||||
(Const32 [val]) -> (MOVDconst [val])
|
|
||||||
(Const64 [val]) -> (MOVDconst [val])
|
|
||||||
(Const32F [val]) -> (FMOVSconst [val])
|
|
||||||
(Const64F [val]) -> (FMOVDconst [val])
|
|
||||||
(ConstNil) -> (MOVDconst [0])
|
|
||||||
(ConstBool [b]) -> (MOVDconst [b])
|
|
||||||
|
|
||||||
(Addr {sym} base) -> (MOVDaddr {sym} base)
|
(Addr {sym} base) -> (MOVDaddr {sym} base)
|
||||||
// (Addr {sym} base) -> (ADDconst {sym} base)
|
// (Addr {sym} base) -> (ADDconst {sym} base)
|
||||||
(OffPtr [off] ptr) -> (ADD (MOVDconst <config.Frontend().TypeInt64()> [off]) ptr)
|
(OffPtr [off] ptr) -> (ADD (MOVDconst <config.Frontend().TypeInt64()> [off]) ptr)
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user