From: Martin Möhrmann Date: Sat, 22 Oct 2016 13:43:23 +0000 (+0200) Subject: cmd/compile: replace ANDL with MOV?ZX X-Git-Tag: go1.8beta1~702 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7ff0c8267f25a628dc4c8b5fa356b26cbb72530d;p=gostls13.git cmd/compile: replace ANDL with MOV?ZX According to "Intel 64 and IA-32 Architectures Optimization Reference Manual" Section: "3.5.1.13 Zero-Latency MOV Instructions" MOV?ZX instructions have zero latency on newer processors. during make.bash: (ANDLconst [0xFF] x) -> (MOVBQZX x) applies 422 times (ANDLconst [0xFFFF] x) -> (MOVWQZX x) applies 114 times Updates #15105 Change-Id: I10933af599de3c26449c52f4b5cd859331028f39 Reviewed-on: https://go-review.googlesource.com/31639 TryBot-Result: Gobot Gobot Reviewed-by: David Chase Run-TryBot: David Chase --- diff --git a/src/cmd/compile/internal/ssa/gen/AMD64.rules b/src/cmd/compile/internal/ssa/gen/AMD64.rules index 65d85c4231..08916dedef 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64.rules +++ b/src/cmd/compile/internal/ssa/gen/AMD64.rules @@ -631,7 +631,9 @@ (CMPB x (MOVLconst [c])) -> (CMPBconst x [int64(int8(c))]) (CMPB (MOVLconst [c]) x) -> (InvertFlags (CMPBconst x [int64(int8(c))])) -// Using MOVBQZX instead of ANDQ is cheaper. +// Using MOVZX instead of AND is cheaper. +(ANDLconst [0xFF] x) -> (MOVBQZX x) +(ANDLconst [0xFFFF] x) -> (MOVWQZX x) (ANDQconst [0xFF] x) -> (MOVBQZX x) (ANDQconst [0xFFFF] x) -> (MOVWQZX x) (ANDQconst [0xFFFFFFFF] x) -> (MOVLQZX x) diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index f36a5aa439..86c65382cf 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -1409,6 +1409,30 @@ func rewriteValueAMD64_OpAMD64ANDLconst(v *Value, config *Config) bool { v.AddArg(x) return true } + // match: (ANDLconst [0xFF] x) + // cond: + // result: (MOVBQZX x) + for { + if v.AuxInt != 0xFF { + break + } + x := v.Args[0] + v.reset(OpAMD64MOVBQZX) + v.AddArg(x) + return true + } + // match: (ANDLconst [0xFFFF] x) + // cond: + // result: (MOVWQZX x) + for { + if v.AuxInt != 0xFFFF { + break + } + x := v.Args[0] + v.reset(OpAMD64MOVWQZX) + v.AddArg(x) + return true + } // match: (ANDLconst [c] _) // cond: int32(c)==0 // result: (MOVLconst [0])