]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: implement clobberdead mode on ARM64
authorCherry Mui <cherryyz@google.com>
Thu, 3 Jun 2021 16:23:14 +0000 (12:23 -0400)
committerCherry Mui <cherryyz@google.com>
Thu, 3 Jun 2021 20:00:30 +0000 (20:00 +0000)
For debugging.

Change-Id: I5875ccd2413b8ffd2ec97a0ace66b5cae7893b24
Reviewed-on: https://go-review.googlesource.com/c/go/+/324765
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/cmd/compile/internal/arm64/ssa.go
test/codegen/clobberdead.go

index 74308a18f60f311e999e7427388d177986801589..c3319f949122bd14faf95c5317f39b62f2ffa5d1 100644 (file)
@@ -1114,8 +1114,34 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
                v.Fatalf("FlagConstant op should never make it to codegen %v", v.LongString())
        case ssa.OpARM64InvertFlags:
                v.Fatalf("InvertFlags should never make it to codegen %v", v.LongString())
-       case ssa.OpClobber, ssa.OpClobberReg:
-               // TODO: implement for clobberdead experiment. Nop is ok for now.
+       case ssa.OpClobber:
+               // MOVW $0xdeaddead, REGTMP
+               // MOVW REGTMP, (slot)
+               // MOVW REGTMP, 4(slot)
+               p := s.Prog(arm64.AMOVW)
+               p.From.Type = obj.TYPE_CONST
+               p.From.Offset = 0xdeaddead
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = arm64.REGTMP
+               p = s.Prog(arm64.AMOVW)
+               p.From.Type = obj.TYPE_REG
+               p.From.Reg = arm64.REGTMP
+               p.To.Type = obj.TYPE_MEM
+               p.To.Reg = arm64.REGSP
+               ssagen.AddAux(&p.To, v)
+               p = s.Prog(arm64.AMOVW)
+               p.From.Type = obj.TYPE_REG
+               p.From.Reg = arm64.REGTMP
+               p.To.Type = obj.TYPE_MEM
+               p.To.Reg = arm64.REGSP
+               ssagen.AddAux2(&p.To, v, v.AuxInt+4)
+       case ssa.OpClobberReg:
+               x := uint64(0xdeaddeaddeaddead)
+               p := s.Prog(arm64.AMOVD)
+               p.From.Type = obj.TYPE_CONST
+               p.From.Offset = int64(x)
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
        default:
                v.Fatalf("genValue not implemented: %s", v.LongString())
        }
index f8d964cba689a80b1924e62a5a9f7c7e9080fd7d..c490790bb63ded8997211ff95a6ffc5a5fedb442 100644 (file)
@@ -1,6 +1,6 @@
 // asmcheck -gcflags=-clobberdead
 
-// +build amd64
+// +build amd64 arm64
 
 // Copyright 2021 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -13,15 +13,18 @@ type T [2]*int // contain pointer, not SSA-able (so locals are not registerized)
 var p1, p2, p3 T
 
 func F() {
-       // 3735936685 is 0xdeaddead
+       // 3735936685 is 0xdeaddead. On ARM64 R27 is REGTMP.
        // clobber x, y at entry. not clobber z (stack object).
        // amd64:`MOVL\t\$3735936685, ""\.x`, `MOVL\t\$3735936685, ""\.y`, -`MOVL\t\$3735936685, ""\.z`
+       // arm64:`MOVW\tR27, ""\.x`, `MOVW\tR27, ""\.y`, -`MOVW\tR27, ""\.z`
        x, y, z := p1, p2, p3
        addrTaken(&z)
        // x is dead at the call (the value of x is loaded before the CALL), y is not
        // amd64:`MOVL\t\$3735936685, ""\.x`, -`MOVL\t\$3735936685, ""\.y`
+       // arm64:`MOVW\tR27, ""\.x`, -`MOVW\tR27, ""\.y`
        use(x)
        // amd64:`MOVL\t\$3735936685, ""\.x`, `MOVL\t\$3735936685, ""\.y`
+       // arm64:`MOVW\tR27, ""\.x`, `MOVW\tR27, ""\.y`
        use(y)
 }