aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto Donizetti <alb.donizetti@gmail.com>2018-04-10 11:20:20 +0200
committerAlberto Donizetti <alb.donizetti@gmail.com>2018-04-10 10:57:50 +0000
commit188e2bf89712fcb97bd5329f167fedc6dd90316b (patch)
tree0ede1d832e9ad8a5957581c0867429d244ba4b36
parentd5ff631e6b86787857913049fc5312969211a1c7 (diff)
downloadgo-188e2bf89712fcb97bd5329f167fedc6dd90316b.tar.xz
test/codegen: port arm64 BIC/EON/ORN and masking tests
And delete them from asm_test. Change-Id: I24f421b87e8cb4770c887a6dfd58eacd0088947d Reviewed-on: https://go-review.googlesource.com/106056 Reviewed-by: Keith Randall <khr@golang.org>
-rw-r--r--src/cmd/compile/internal/gc/asm_test.go43
-rw-r--r--test/codegen/bits.go29
2 files changed, 29 insertions, 43 deletions
diff --git a/src/cmd/compile/internal/gc/asm_test.go b/src/cmd/compile/internal/gc/asm_test.go
index a23e958995..1b7c94837f 100644
--- a/src/cmd/compile/internal/gc/asm_test.go
+++ b/src/cmd/compile/internal/gc/asm_test.go
@@ -283,49 +283,6 @@ var linuxARMTests = []*asmTest{
}
var linuxARM64Tests = []*asmTest{
- {
- fn: `
- func $(x, y uint32) uint32 {
- return x &^ y
- }
- `,
- pos: []string{"\tBIC\t"},
- neg: []string{"\tAND\t"},
- },
- {
- fn: `
- func $(x, y uint32) uint32 {
- return x ^ ^y
- }
- `,
- pos: []string{"\tEON\t"},
- neg: []string{"\tXOR\t"},
- },
- {
- fn: `
- func $(x, y uint32) uint32 {
- return x | ^y
- }
- `,
- pos: []string{"\tORN\t"},
- neg: []string{"\tORR\t"},
- },
- {
- fn: `
- func f34(a uint64) uint64 {
- return a & ((1<<63)-1)
- }
- `,
- pos: []string{"\tAND\t"},
- },
- {
- fn: `
- func f35(a uint64) uint64 {
- return a & (1<<63)
- }
- `,
- pos: []string{"\tAND\t"},
- },
// Load-combining tests.
{
fn: `
diff --git a/test/codegen/bits.go b/test/codegen/bits.go
index 53f03094d7..9de2201cb1 100644
--- a/test/codegen/bits.go
+++ b/test/codegen/bits.go
@@ -261,3 +261,32 @@ func bitcompl32(a, b uint32) (n uint32) {
return n
}
+
+// Check AND masking on arm64 (Issue #19857)
+
+func and_mask_1(a uint64) uint64 {
+ // arm64:`AND\t`
+ return a & ((1 << 63) - 1)
+}
+
+func and_mask_2(a uint64) uint64 {
+ // arm64:`AND\t`
+ return a & (1 << 63)
+}
+
+// Check generation of arm64 BIC/EON/ORN instructions
+
+func op_bic(x, y uint32) uint32 {
+ // arm64:`BIC\t`,-`AND`
+ return x &^ y
+}
+
+func op_eon(x, y uint32) uint32 {
+ // arm64:`EON\t`,-`XOR`
+ return x ^ ^y
+}
+
+func op_orn(x, y uint32) uint32 {
+ // arm64:`ORN\t`,-`ORR`
+ return x | ^y
+}