]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: Optimize ARM64's code with EON
authordiaxu01 <dianhong.xu@arm.com>
Fri, 5 Jun 2020 03:53:53 +0000 (03:53 +0000)
committerCherry Zhang <cherryyz@google.com>
Wed, 19 Aug 2020 16:47:14 +0000 (16:47 +0000)
This patch fuses pattern '(MVN (XOR x y))' into '(EON x y)'.

Change-Id: I269c98ce198d51a4945ce8bd0e1024acbd1b7609
Reviewed-on: https://go-review.googlesource.com/c/go/+/239638
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/compile/internal/ssa/gen/ARM64.rules
src/cmd/compile/internal/ssa/rewriteARM64.go
test/codegen/bits.go

index 27959d01fc22d0613b8c56c7e838100aba9fddeb..80e8c7137b0c8c2243556e43d70cc8f62a99ac6e 100644 (file)
 (AND x (MVN y)) -> (BIC x y)
 (XOR x (MVN y)) -> (EON x y)
 (OR  x (MVN y)) -> (ORN x y)
+(MVN (XOR x y)) -> (EON x y)
 (CSEL {cc} x (MOVDconst [0]) flag) -> (CSEL0 {cc} x flag)
 (CSEL {cc} (MOVDconst [0]) y flag) -> (CSEL0 {arm64Negate(cc.(Op))} y flag)
 (SUB x (SUB y z)) -> (SUB (ADD <v.Type> x z) y)
index 023d9908c2c99ed23c32539678b58a9b6c32bdc5..842eddbf4a8d6274db3b9c2756f19146c14d43c5 100644 (file)
@@ -14593,6 +14593,18 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool {
 }
 func rewriteValueARM64_OpARM64MVN(v *Value) bool {
        v_0 := v.Args[0]
+       // match: (MVN (XOR x y))
+       // result: (EON x y)
+       for {
+               if v_0.Op != OpARM64XOR {
+                       break
+               }
+               y := v_0.Args[1]
+               x := v_0.Args[0]
+               v.reset(OpARM64EON)
+               v.AddArg2(x, y)
+               return true
+       }
        // match: (MVN (MOVDconst [c]))
        // result: (MOVDconst [^c])
        for {
index 0a5428b55a393733ede11c0dfc80e723c855a375..398dd84e9e067c97d36126ca7302d2cfe827b555 100644 (file)
@@ -310,9 +310,18 @@ func op_bic(x, y uint32) uint32 {
        return x &^ y
 }
 
-func op_eon(x, y uint32) uint32 {
+func op_eon(x, y, z uint32, a []uint32, n, m uint64) uint64 {
+       // arm64:`EON\t`,-`EOR`,-`MVN`
+       a[0] = x ^ (y ^ 0xffffffff)
+
+       // arm64:`EON\t`,-`EOR`,-`MVN`
+       a[1] = ^(y ^ z)
+
        // arm64:`EON\t`,-`XOR`
-       return x ^ ^y
+       a[2] = x ^ ^z
+
+       // arm64:`EON\t`,-`EOR`,-`MVN`
+       return n ^ (m ^ 0xffffffffffffffff)
 }
 
 func op_orn(x, y uint32) uint32 {