diff options
author | philhofer <phofer@umich.edu> | 2017-08-09 05:01:26 +0000 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2017-08-15 13:39:11 +0000 |
commit | c59b495963851d971036eb88a77b5c81db3a0982 (patch) | |
tree | 3b221c733713a53d75e5358a0c34b11ccc215712 /src/cmd/compile/internal/ssa/gen/ARM64Ops.go | |
parent | 583a941d4ed7cb8e03bbeceaf05969c285c30b2e (diff) | |
download | go-c59b495963851d971036eb88a77b5c81db3a0982.tar.gz go-c59b495963851d971036eb88a77b5c81db3a0982.zip |
cmd/compile: add support for arm64 bit-test instructions
Add support for generating TBZ/TBNZ instructions.
The bit-test-and-branch pattern shows up in a number of
important places, including the runtime (gc bitmaps).
Before this change, there were 3 TB[N]?Z instructions in the Go tool,
all of which were in hand-written assembly. After this change, there
are 285. Also, the go1 benchmark binary gets about 4.5kB smaller.
Fixes #21361
Change-Id: I170c138b852754b9b8df149966ca5e62e6dfa771
Reviewed-on: https://go-review.googlesource.com/54470
Run-TryBot: Philip Hofer <phofer@umich.edu>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/gen/ARM64Ops.go')
-rw-r--r-- | src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index 832bea227c..3b3d494c54 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -512,10 +512,12 @@ func init() { {name: "ULE"}, {name: "UGT"}, {name: "UGE"}, - {name: "Z"}, // Control == 0 (take a register instead of flags) - {name: "NZ"}, // Control != 0 - {name: "ZW"}, // Control == 0, 32-bit - {name: "NZW"}, // Control != 0, 32-bit + {name: "Z"}, // Control == 0 (take a register instead of flags) + {name: "NZ"}, // Control != 0 + {name: "ZW"}, // Control == 0, 32-bit + {name: "NZW"}, // Control != 0, 32-bit + {name: "TBZ"}, // Control & (1 << Aux.(int64)) == 0 + {name: "TBNZ"}, // Control & (1 << Aux.(int64)) != 0 } archs = append(archs, arch{ |