]> Cypherpunks.ru repositories - gostls13.git/commit
cmd/compile: AMD64v3 remove unnecessary TEST comparision in isPowerOfTwo
authorJorropo <jorropo.pgm@gmail.com>
Sun, 6 Nov 2022 05:37:13 +0000 (06:37 +0100)
committerKeith Randall <khr@golang.org>
Fri, 20 Jan 2023 04:58:59 +0000 (04:58 +0000)
commit5c67ebbb31a296ca1593d0229b1d51d5ac73aa6d
treec25ff96f9c26a52ca3e58d27acde5ac0d4ff35cf
parentfc814056aae191f61f46bef5be6e29ee3dc09b89
cmd/compile: AMD64v3 remove unnecessary TEST comparision in isPowerOfTwo

With GOAMD64=V3 the canonical isPowerOfTwo function:
  func isPowerOfTwo(x uintptr) bool {
    return x&(x-1) == 0
  }

Used to compile to:
  temp := BLSR(x) // x&(x-1)
  flags = TEST(temp, temp)
  return flags.zf

However the blsr instruction already set ZF according to the result.
So we can remove the TEST instruction if we are just checking ZF.
Such as in multiple pieces of code around memory allocations.

This make the code smaller and faster.

Change-Id: Ia12d5a73aa3cb49188c0b647b1eff7b56c5a7b58
Reviewed-on: https://go-review.googlesource.com/c/go/+/448255
Run-TryBot: Jakub Ciolek <jakub@ciolek.dev>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/compile/internal/amd64/ssa.go
src/cmd/compile/internal/ssa/_gen/AMD64.rules
src/cmd/compile/internal/ssa/_gen/AMD64Ops.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewriteAMD64.go
test/codegen/bmi.go