]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: intrinsify runtime.getcallersp
authorCherry Zhang <cherryyz@google.com>
Mon, 9 Oct 2017 19:33:29 +0000 (15:33 -0400)
committerCherry Zhang <cherryyz@google.com>
Tue, 10 Oct 2017 15:15:21 +0000 (15:15 +0000)
Add a compiler intrinsic for getcallersp. So we are able to get
rid of the argument (not done in this CL).

Change-Id: Ic38fda1c694f918328659ab44654198fb116668d
Reviewed-on: https://go-review.googlesource.com/69350
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: David Chase <drchase@google.com>
37 files changed:
src/cmd/compile/internal/amd64/ssa.go
src/cmd/compile/internal/arm/ssa.go
src/cmd/compile/internal/arm64/ssa.go
src/cmd/compile/internal/gc/dcl.go
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/mips/ssa.go
src/cmd/compile/internal/mips64/ssa.go
src/cmd/compile/internal/ppc64/ssa.go
src/cmd/compile/internal/s390x/ssa.go
src/cmd/compile/internal/ssa/gen/386.rules
src/cmd/compile/internal/ssa/gen/386Ops.go
src/cmd/compile/internal/ssa/gen/AMD64.rules
src/cmd/compile/internal/ssa/gen/AMD64Ops.go
src/cmd/compile/internal/ssa/gen/ARM.rules
src/cmd/compile/internal/ssa/gen/ARM64.rules
src/cmd/compile/internal/ssa/gen/ARM64Ops.go
src/cmd/compile/internal/ssa/gen/ARMOps.go
src/cmd/compile/internal/ssa/gen/MIPS.rules
src/cmd/compile/internal/ssa/gen/MIPS64.rules
src/cmd/compile/internal/ssa/gen/MIPS64Ops.go
src/cmd/compile/internal/ssa/gen/MIPSOps.go
src/cmd/compile/internal/ssa/gen/PPC64.rules
src/cmd/compile/internal/ssa/gen/PPC64Ops.go
src/cmd/compile/internal/ssa/gen/S390X.rules
src/cmd/compile/internal/ssa/gen/S390XOps.go
src/cmd/compile/internal/ssa/gen/genericOps.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewrite386.go
src/cmd/compile/internal/ssa/rewriteAMD64.go
src/cmd/compile/internal/ssa/rewriteARM.go
src/cmd/compile/internal/ssa/rewriteARM64.go
src/cmd/compile/internal/ssa/rewriteMIPS.go
src/cmd/compile/internal/ssa/rewriteMIPS64.go
src/cmd/compile/internal/ssa/rewritePPC64.go
src/cmd/compile/internal/ssa/rewriteS390X.go
src/cmd/compile/internal/x86/ssa.go
src/runtime/stubs.go

index 7980e6cc15cf41beb39802408209dae92b65ff1f..2d3034b64b043b64a7c6e553ea462bee6ed0d852 100644 (file)
@@ -804,6 +804,19 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
                p.To.Type = obj.TYPE_REG
                p.To.Reg = v.Reg()
 
+       case ssa.OpAMD64LoweredGetCallerSP:
+               // caller's SP is the address of the first arg
+               mov := x86.AMOVQ
+               if gc.Widthptr == 4 {
+                       mov = x86.AMOVL
+               }
+               p := s.Prog(mov)
+               p.From.Type = obj.TYPE_ADDR
+               p.From.Offset = -gc.Ctxt.FixedFrameSize() // 0 on amd64, just to be consistent with other architectures
+               p.From.Name = obj.NAME_PARAM
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
+
        case ssa.OpAMD64NEGQ, ssa.OpAMD64NEGL,
                ssa.OpAMD64BSWAPQ, ssa.OpAMD64BSWAPL,
                ssa.OpAMD64NOTQ, ssa.OpAMD64NOTL:
index 140b9d10acb8b99e423f4a3febdb8907db798ebc..41887753291bd64f4a19ba5f4261bea37fce4b9e 100644 (file)
@@ -778,6 +778,14 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
        case ssa.OpARMLoweredGetClosurePtr:
                // Closure pointer is R7 (arm.REGCTXT).
                gc.CheckLoweredGetClosurePtr(v)
+       case ssa.OpARMLoweredGetCallerSP:
+               // caller's SP is FixedFrameSize below the address of the first arg
+               p := s.Prog(arm.AMOVW)
+               p.From.Type = obj.TYPE_ADDR
+               p.From.Offset = -gc.Ctxt.FixedFrameSize()
+               p.From.Name = obj.NAME_PARAM
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
        case ssa.OpARMFlagEQ,
                ssa.OpARMFlagLT_ULT,
                ssa.OpARMFlagLT_UGT,
index 3c140be97deca5c29c668109989aec2b5edceb8a..6fa01912f50a89d3868fa3d80027eebd063d1f9d 100644 (file)
@@ -666,6 +666,14 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
        case ssa.OpARM64LoweredGetClosurePtr:
                // Closure pointer is R26 (arm64.REGCTXT).
                gc.CheckLoweredGetClosurePtr(v)
+       case ssa.OpARM64LoweredGetCallerSP:
+               // caller's SP is FixedFrameSize below the address of the first arg
+               p := s.Prog(arm64.AMOVD)
+               p.From.Type = obj.TYPE_ADDR
+               p.From.Offset = -gc.Ctxt.FixedFrameSize()
+               p.From.Name = obj.NAME_PARAM
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
        case ssa.OpARM64FlagEQ,
                ssa.OpARM64FlagLT_ULT,
                ssa.OpARM64FlagLT_UGT,
index 2351f931f3f001026df9dc4903328277fc685ae9..2f060fa05f278bbf29916e70c2b9cbe1a4a3740e 100644 (file)
@@ -1081,9 +1081,10 @@ func makefuncsym(s *types.Sym) {
        if s.IsBlank() {
                return
        }
-       if compiling_runtime && (s.Name == "getg" || s.Name == "getclosureptr" || s.Name == "getcallerpc") {
-               // runtime.getg(), getclosureptr(), and getcallerpc() are
-               // not real functions and so do not get funcsyms.
+       if compiling_runtime && (s.Name == "getg" || s.Name == "getclosureptr" || s.Name == "getcallerpc" || s.Name == "getcallersp") {
+               // runtime.getg(), getclosureptr(), getcallerpc(), and
+               // getcallersp() are not real functions and so do not
+               // get funcsyms.
                return
        }
        if _, existed := s.Pkg.LookupOK(funcsymname(s)); !existed {
index 8353e0fdd38487828b31f00ce5f4e761d9c8eeb1..b559eacd4e03301dd0ddc307aa3edd3e6cfd68bd 100644 (file)
@@ -2641,6 +2641,12 @@ func init() {
                        return s.newValue0(ssa.OpGetCallerPC, s.f.Config.Types.Uintptr)
                }, sys.AMD64, sys.I386)
 
+       add("runtime", "getcallersp",
+               func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
+                       return s.newValue0(ssa.OpGetCallerSP, s.f.Config.Types.Uintptr)
+               },
+               all...)
+
        /******** runtime/internal/sys ********/
        addF("runtime/internal/sys", "Ctz32",
                func(s *state, n *Node, args []*ssa.Value) *ssa.Value {
index f7810ca49715e1f5ff677c6b31c8b635873289e1..ee68afdfa3e787670e041b49e057b7695959f75b 100644 (file)
@@ -755,6 +755,14 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
        case ssa.OpMIPSLoweredGetClosurePtr:
                // Closure pointer is R22 (mips.REGCTXT).
                gc.CheckLoweredGetClosurePtr(v)
+       case ssa.OpMIPSLoweredGetCallerSP:
+               // caller's SP is FixedFrameSize below the address of the first arg
+               p := s.Prog(mips.AMOVW)
+               p.From.Type = obj.TYPE_ADDR
+               p.From.Offset = -gc.Ctxt.FixedFrameSize()
+               p.From.Name = obj.NAME_PARAM
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
        case ssa.OpClobber:
                // TODO: implement for clobberdead experiment. Nop is ok for now.
        default:
index 65314e48b606ae77c395488df7282446b4a924e3..f6ddc1f502a4627c1907ced3e904e7f170fb01a2 100644 (file)
@@ -520,6 +520,14 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
        case ssa.OpMIPS64LoweredGetClosurePtr:
                // Closure pointer is R22 (mips.REGCTXT).
                gc.CheckLoweredGetClosurePtr(v)
+       case ssa.OpMIPS64LoweredGetCallerSP:
+               // caller's SP is FixedFrameSize below the address of the first arg
+               p := s.Prog(mips.AMOVV)
+               p.From.Type = obj.TYPE_ADDR
+               p.From.Offset = -gc.Ctxt.FixedFrameSize()
+               p.From.Name = obj.NAME_PARAM
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
        case ssa.OpClobber:
                // TODO: implement for clobberdead experiment. Nop is ok for now.
        default:
index 1228da21277bed053189073cc52a496e07f57698..c30494f8f1eb4077ac3f168073c15a7eae79b440 100644 (file)
@@ -422,6 +422,15 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
                // Closure pointer is R11 (already)
                gc.CheckLoweredGetClosurePtr(v)
 
+       case ssa.OpPPC64LoweredGetCallerSP:
+               // caller's SP is FixedFrameSize below the address of the first arg
+               p := s.Prog(ppc64.AMOVD)
+               p.From.Type = obj.TYPE_ADDR
+               p.From.Offset = -gc.Ctxt.FixedFrameSize()
+               p.From.Name = obj.NAME_PARAM
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
+
        case ssa.OpPPC64LoweredRound32F, ssa.OpPPC64LoweredRound64F:
                // input is already rounded
 
index 19899ecd5b291929521bd269389728ad0c175b41..ad6699e563ea2cabb55e6549f8ea57ee60bb8804 100644 (file)
@@ -489,6 +489,14 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
                p.From.Reg = s390x.REGG
                p.To.Type = obj.TYPE_REG
                p.To.Reg = r
+       case ssa.OpS390XLoweredGetCallerSP:
+               // caller's SP is FixedFrameSize below the address of the first arg
+               p := s.Prog(s390x.AMOVD)
+               p.From.Type = obj.TYPE_ADDR
+               p.From.Offset = -gc.Ctxt.FixedFrameSize()
+               p.From.Name = obj.NAME_PARAM
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
        case ssa.OpS390XCALLstatic, ssa.OpS390XCALLclosure, ssa.OpS390XCALLinter:
                s.Call(v)
        case ssa.OpS390XFLOGR, ssa.OpS390XNEG, ssa.OpS390XNEGW,
index bc1c25646a8b828c527da84d96ed0944db19c29f..226bea6b74f8e93cd67d6092092ecb3d90fdfdc2 100644 (file)
 (GetG mem) -> (LoweredGetG mem)
 (GetClosurePtr) -> (LoweredGetClosurePtr)
 (GetCallerPC) -> (LoweredGetCallerPC)
+(GetCallerSP) -> (LoweredGetCallerSP)
 (Addr {sym} base) -> (LEAL {sym} base)
 
 // block rewrites
index bea80fd47d6ce3ccd1797545f08f09a2e94e6d28..d407c73cd568ed7a22ad9fb637c2cf99396e6038 100644 (file)
@@ -445,6 +445,8 @@ func init() {
                // the result should be the PC within f that g will return to.
                // See runtime/stubs.go for a more detailed discussion.
                {name: "LoweredGetCallerPC", reg: gp01},
+               // LoweredGetCallerSP returns the SP of the caller of the current function.
+               {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
                //arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
                {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
 
index 02e187b70b239e11a87932cee748fd84c3b90e42..7f7fa35bfeb571e59e20b205f14c17255816395e 100644 (file)
 (GetG mem) -> (LoweredGetG mem)
 (GetClosurePtr) -> (LoweredGetClosurePtr)
 (GetCallerPC) -> (LoweredGetCallerPC)
+(GetCallerSP) -> (LoweredGetCallerSP)
 (Addr {sym} base) && config.PtrSize == 8 -> (LEAQ {sym} base)
 (Addr {sym} base) && config.PtrSize == 4 -> (LEAL {sym} base)
 
index c251f7e657abc423e77be869f2abf4f321458a5a..653b5d61e37b29bda8604f68799e9442fc207e29 100644 (file)
@@ -556,6 +556,8 @@ func init() {
                // the result should be the PC within f that g will return to.
                // See runtime/stubs.go for a more detailed discussion.
                {name: "LoweredGetCallerPC", reg: gp01},
+               // LoweredGetCallerSP returns the SP of the caller of the current function.
+               {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
                //arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
                {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
 
index 0c53aa3b77936f612e29d61a8ab8fa38635c8b12..3378e4db8a6022cd0946bbcdfef17bc58f680552 100644 (file)
 
 // pseudo-ops
 (GetClosurePtr) -> (LoweredGetClosurePtr)
+(GetCallerSP) -> (LoweredGetCallerSP)
 (Convert x mem) -> (MOVWconvert x mem)
 
 // Absorb pseudo-ops into blocks.
index efad9c6ed3d96eecb15575e70634869d663b2775..558e60f6e229258fac15db6861432d104a1bdea3 100644 (file)
 
 // pseudo-ops
 (GetClosurePtr) -> (LoweredGetClosurePtr)
+(GetCallerSP) -> (LoweredGetCallerSP)
 (Convert x mem) -> (MOVDconvert x mem)
 
 // Absorb pseudo-ops into blocks.
index 1cac97f3ae5335736698943c28e4e91eb15b9c56..10a19cbd41ddab1f0b49ad4e174b3943bcead2e7 100644 (file)
@@ -425,6 +425,9 @@ func init() {
                // use of R26 (arm64.REGCTXT, the closure pointer)
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R26")}}},
 
+               // LoweredGetCallerSP returns the SP of the caller of the current function.
+               {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+
                // MOVDconvert converts between pointers and integers.
                // We have a special op for this so as to not confuse GC
                // (particularly stack maps).  It takes a memory arg so it
index 668ee46a549a652d481eba5c419d2f33aacfb847..928236b73ce7b25a26afccf77f8a7d7b0304badb 100644 (file)
@@ -498,6 +498,9 @@ func init() {
                // use of R7 (arm.REGCTXT, the closure pointer)
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R7")}}},
 
+               // LoweredGetCallerSP returns the SP of the caller of the current function.
+               {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+
                // MOVWconvert converts between pointers and integers.
                // We have a special op for this so as to not confuse GC
                // (particularly stack maps).  It takes a memory arg so it
index 60a37224087ee2c39e4d665b860a25c9dd558a9e..2e7a0230b8b8a27f65954ba6af612f975eb90af8 100644 (file)
 
 // pseudo-ops
 (GetClosurePtr) -> (LoweredGetClosurePtr)
+(GetCallerSP) -> (LoweredGetCallerSP)
 (Convert x mem) -> (MOVWconvert x mem)
 
 (If cond yes no) -> (NE cond yes no)
index ee7a88f7e63e6887575a9a13b2fb6be4bde3fd87..9fd8b023afc6486d2e431239707042d9cefa1fa4 100644 (file)
 
 // pseudo-ops
 (GetClosurePtr) -> (LoweredGetClosurePtr)
+(GetCallerSP) -> (LoweredGetCallerSP)
 (Convert x mem) -> (MOVVconvert x mem)
 
 (If cond yes no) -> (NE cond yes no)
index b0e6564d521a20461111d0f1939d854294fee39b..02583147229bc16516cbeb989d4ae34ab0133905 100644 (file)
@@ -344,6 +344,9 @@ func init() {
                // use of R22 (mips.REGCTXT, the closure pointer)
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R22")}}},
 
+               // LoweredGetCallerSP returns the SP of the caller of the current function.
+               {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+
                // MOVDconvert converts between pointers and integers.
                // We have a special op for this so as to not confuse GC
                // (particularly stack maps).  It takes a memory arg so it
index b632c6bfdc1a3a18cb2bf9cc52773c381be80459..155a20bbad29f38efa5b977c47c94c2e769d4681 100644 (file)
@@ -376,6 +376,9 @@ func init() {
                // use of R22 (mips.REGCTXT, the closure pointer)
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R22")}}},
 
+               // LoweredGetCallerSP returns the SP of the caller of the current function.
+               {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+
                // MOVWconvert converts between pointers and integers.
                // We have a special op for this so as to not confuse GC
                // (particularly stack maps).  It takes a memory arg so it
index 6e8d335c90e2d8658041fb1fd5f6cd9efb7a8261..374b5c0cb119ef2ed255c4f72256d9c2b9ac4428 100644 (file)
 // Miscellaneous
 (Convert <t> x mem) -> (MOVDconvert <t> x mem)
 (GetClosurePtr) -> (LoweredGetClosurePtr)
+(GetCallerSP) -> (LoweredGetCallerSP)
 (IsNonNil ptr) -> (NotEqual (CMPconst [0] ptr))
 (IsInBounds idx len) -> (LessThan (CMPU idx len))
 (IsSliceInBounds idx len) -> (LessEqual (CMPU idx len))
index b96bd66b1ac0e6a112e22dd9cd5f9ada606ffafd..e31c4503443697a44516ed49447896fac9f6f5bf 100644 (file)
@@ -315,6 +315,9 @@ func init() {
                // use of the closure pointer.
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{ctxt}}},
 
+               // LoweredGetCallerSP returns the SP of the caller of the current function.
+               {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
+
                //arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
                {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
                // Round ops to block fused-multiply-add extraction.
index d03ca32f8f64250463fc28bbe65ad8abc57c434e..f31b1c3007240c75e5062736f930e80f1f8e9d3d 100644 (file)
 (NilCheck ptr mem) -> (LoweredNilCheck ptr mem)
 (GetG mem) -> (LoweredGetG mem)
 (GetClosurePtr) -> (LoweredGetClosurePtr)
+(GetCallerSP) -> (LoweredGetCallerSP)
 (Addr {sym} base) -> (MOVDaddr {sym} base)
 (ITab (Load ptr mem)) -> (MOVDload ptr mem)
 
index 0d71dac87b64088038dd11c87d5bb14603cbf041..372a87d4873aafa21e9ff77ccc5c40f0fc1337c4 100644 (file)
@@ -439,6 +439,8 @@ func init() {
                // use of R12 (the closure pointer)
                {name: "LoweredGetClosurePtr", reg: regInfo{outputs: []regMask{buildReg("R12")}}},
                // arg0=ptr,arg1=mem, returns void.  Faults if ptr is nil.
+               // LoweredGetCallerSP returns the SP of the caller of the current function.
+               {name: "LoweredGetCallerSP", reg: gp01, rematerializeable: true},
                {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{ptrsp}}, clobberFlags: true, nilCheck: true, faultOnNilArg0: true},
                // Round ops to block fused-multiply-add extraction.
                {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true},
index bec7ef97d56cc282ff86498365f8d5ed4ddb7e83..117ea076697e491ba1598d921676cf24fed2b9d8 100644 (file)
@@ -379,6 +379,7 @@ var genericOps = []opData{
        {name: "GetG", argLength: 1}, // runtime.getg() (read g pointer). arg0=mem
        {name: "GetClosurePtr"},      // get closure pointer from dedicated register
        {name: "GetCallerPC"},        // for getcallerpc intrinsic
+       {name: "GetCallerSP"},        // for getcallersp intrinsic
 
        // Indexing operations
        {name: "PtrIndex", argLength: 2},             // arg0=ptr, arg1=index. Computes ptr+sizeof(*v.type)*index, where index is extended to ptrwidth type
index a8c7a52c7dca7f3f243e93b1a9aaa5c649e1158c..819de9d2c247827bcea917dcfa3894c69dacaa3e 100644 (file)
@@ -397,6 +397,7 @@ const (
        Op386LoweredGetG
        Op386LoweredGetClosurePtr
        Op386LoweredGetCallerPC
+       Op386LoweredGetCallerSP
        Op386LoweredNilCheck
        Op386MOVLconvert
        Op386FlagEQ
@@ -665,6 +666,7 @@ const (
        OpAMD64LoweredGetG
        OpAMD64LoweredGetClosurePtr
        OpAMD64LoweredGetCallerPC
+       OpAMD64LoweredGetCallerSP
        OpAMD64LoweredNilCheck
        OpAMD64MOVQconvert
        OpAMD64MOVLconvert
@@ -918,6 +920,7 @@ const (
        OpARMLoweredZero
        OpARMLoweredMove
        OpARMLoweredGetClosurePtr
+       OpARMLoweredGetCallerSP
        OpARMMOVWconvert
        OpARMFlagEQ
        OpARMFlagLT_ULT
@@ -1083,6 +1086,7 @@ const (
        OpARM64DUFFCOPY
        OpARM64LoweredMove
        OpARM64LoweredGetClosurePtr
+       OpARM64LoweredGetCallerSP
        OpARM64MOVDconvert
        OpARM64FlagEQ
        OpARM64FlagLT_ULT
@@ -1202,6 +1206,7 @@ const (
        OpMIPSFPFlagTrue
        OpMIPSFPFlagFalse
        OpMIPSLoweredGetClosurePtr
+       OpMIPSLoweredGetCallerSP
        OpMIPSMOVWconvert
 
        OpMIPS64ADDV
@@ -1298,6 +1303,7 @@ const (
        OpMIPS64FPFlagTrue
        OpMIPS64FPFlagFalse
        OpMIPS64LoweredGetClosurePtr
+       OpMIPS64LoweredGetCallerSP
        OpMIPS64MOVVconvert
 
        OpPPC64ADD
@@ -1421,6 +1427,7 @@ const (
        OpPPC64GreaterEqual
        OpPPC64FGreaterEqual
        OpPPC64LoweredGetClosurePtr
+       OpPPC64LoweredGetCallerSP
        OpPPC64LoweredNilCheck
        OpPPC64LoweredRound32F
        OpPPC64LoweredRound64F
@@ -1624,6 +1631,7 @@ const (
        OpS390XInvertFlags
        OpS390XLoweredGetG
        OpS390XLoweredGetClosurePtr
+       OpS390XLoweredGetCallerSP
        OpS390XLoweredNilCheck
        OpS390XLoweredRound32F
        OpS390XLoweredRound64F
@@ -1918,6 +1926,7 @@ const (
        OpGetG
        OpGetClosurePtr
        OpGetCallerPC
+       OpGetCallerSP
        OpPtrIndex
        OpOffPtr
        OpSliceMake
@@ -4308,6 +4317,16 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:              "LoweredGetCallerSP",
+               argLen:            0,
+               rematerializeable: true,
+               reg: regInfo{
+                       outputs: []outputInfo{
+                               {0, 239}, // AX CX DX BX BP SI DI
+                       },
+               },
+       },
        {
                name:           "LoweredNilCheck",
                argLen:         2,
@@ -8075,6 +8094,16 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:              "LoweredGetCallerSP",
+               argLen:            0,
+               rematerializeable: true,
+               reg: regInfo{
+                       outputs: []outputInfo{
+                               {0, 65519}, // AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R14 R15
+                       },
+               },
+       },
        {
                name:           "LoweredNilCheck",
                argLen:         2,
@@ -11598,6 +11627,16 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:              "LoweredGetCallerSP",
+               argLen:            0,
+               rematerializeable: true,
+               reg: regInfo{
+                       outputs: []outputInfo{
+                               {0, 21503}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14
+                       },
+               },
+       },
        {
                name:   "MOVWconvert",
                argLen: 2,
@@ -13743,6 +13782,16 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:              "LoweredGetCallerSP",
+               argLen:            0,
+               rematerializeable: true,
+               reg: regInfo{
+                       outputs: []outputInfo{
+                               {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30
+                       },
+               },
+       },
        {
                name:   "MOVDconvert",
                argLen: 2,
@@ -15321,6 +15370,16 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:              "LoweredGetCallerSP",
+               argLen:            0,
+               rematerializeable: true,
+               reg: regInfo{
+                       outputs: []outputInfo{
+                               {0, 335544318}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R28 R31
+                       },
+               },
+       },
        {
                name:   "MOVWconvert",
                argLen: 2,
@@ -16614,6 +16673,16 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:              "LoweredGetCallerSP",
+               argLen:            0,
+               rematerializeable: true,
+               reg: regInfo{
+                       outputs: []outputInfo{
+                               {0, 167772158}, // R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 R22 R24 R25 R31
+                       },
+               },
+       },
        {
                name:   "MOVVconvert",
                argLen: 2,
@@ -18238,6 +18307,16 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:              "LoweredGetCallerSP",
+               argLen:            0,
+               rematerializeable: true,
+               reg: regInfo{
+                       outputs: []outputInfo{
+                               {0, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29
+                       },
+               },
+       },
        {
                name:           "LoweredNilCheck",
                argLen:         2,
@@ -21200,6 +21279,16 @@ var opcodeTable = [...]opInfo{
                        },
                },
        },
+       {
+               name:              "LoweredGetCallerSP",
+               argLen:            0,
+               rematerializeable: true,
+               reg: regInfo{
+                       outputs: []outputInfo{
+                               {0, 21503}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14
+                       },
+               },
+       },
        {
                name:           "LoweredNilCheck",
                argLen:         2,
@@ -23000,6 +23089,11 @@ var opcodeTable = [...]opInfo{
                argLen:  0,
                generic: true,
        },
+       {
+               name:    "GetCallerSP",
+               argLen:  0,
+               generic: true,
+       },
        {
                name:    "PtrIndex",
                argLen:  2,
index 60f66c70a1c66108eae20e4bfb36f30c272de242..3706302d63cecb8859d5f3176ace297f7206e708 100644 (file)
@@ -331,6 +331,8 @@ func rewriteValue386(v *Value) bool {
                return rewriteValue386_OpGeq8U_0(v)
        case OpGetCallerPC:
                return rewriteValue386_OpGetCallerPC_0(v)
+       case OpGetCallerSP:
+               return rewriteValue386_OpGetCallerSP_0(v)
        case OpGetClosurePtr:
                return rewriteValue386_OpGetClosurePtr_0(v)
        case OpGetG:
@@ -15049,6 +15051,15 @@ func rewriteValue386_OpGetCallerPC_0(v *Value) bool {
                return true
        }
 }
+func rewriteValue386_OpGetCallerSP_0(v *Value) bool {
+       // match: (GetCallerSP)
+       // cond:
+       // result: (LoweredGetCallerSP)
+       for {
+               v.reset(Op386LoweredGetCallerSP)
+               return true
+       }
+}
 func rewriteValue386_OpGetClosurePtr_0(v *Value) bool {
        // match: (GetClosurePtr)
        // cond:
index 0d05fd30aad091da1ddc0f9f4db4b7be2b96c820..1bddf29338a105cb949c3428c501ee923d6c78a9 100644 (file)
@@ -585,6 +585,8 @@ func rewriteValueAMD64(v *Value) bool {
                return rewriteValueAMD64_OpGeq8U_0(v)
        case OpGetCallerPC:
                return rewriteValueAMD64_OpGetCallerPC_0(v)
+       case OpGetCallerSP:
+               return rewriteValueAMD64_OpGetCallerSP_0(v)
        case OpGetClosurePtr:
                return rewriteValueAMD64_OpGetClosurePtr_0(v)
        case OpGetG:
@@ -41967,6 +41969,15 @@ func rewriteValueAMD64_OpGetCallerPC_0(v *Value) bool {
                return true
        }
 }
+func rewriteValueAMD64_OpGetCallerSP_0(v *Value) bool {
+       // match: (GetCallerSP)
+       // cond:
+       // result: (LoweredGetCallerSP)
+       for {
+               v.reset(OpAMD64LoweredGetCallerSP)
+               return true
+       }
+}
 func rewriteValueAMD64_OpGetClosurePtr_0(v *Value) bool {
        // match: (GetClosurePtr)
        // cond:
index 73aeb81ed7720e8f64c00693f4b8942db34d611f..3514886e8ef9c509d4e704f28c43cd92e8f329bb 100644 (file)
@@ -503,6 +503,8 @@ func rewriteValueARM(v *Value) bool {
                return rewriteValueARM_OpGeq8_0(v)
        case OpGeq8U:
                return rewriteValueARM_OpGeq8U_0(v)
+       case OpGetCallerSP:
+               return rewriteValueARM_OpGetCallerSP_0(v)
        case OpGetClosurePtr:
                return rewriteValueARM_OpGetClosurePtr_0(v)
        case OpGreater16:
@@ -16748,6 +16750,15 @@ func rewriteValueARM_OpGeq8U_0(v *Value) bool {
                return true
        }
 }
+func rewriteValueARM_OpGetCallerSP_0(v *Value) bool {
+       // match: (GetCallerSP)
+       // cond:
+       // result: (LoweredGetCallerSP)
+       for {
+               v.reset(OpARMLoweredGetCallerSP)
+               return true
+       }
+}
 func rewriteValueARM_OpGetClosurePtr_0(v *Value) bool {
        // match: (GetClosurePtr)
        // cond:
index 8385a18fbfa4223ac45b52ff19f0995f024edfc3..1cb8de8a34251798b285a51d857b077f4b9f04e2 100644 (file)
@@ -399,6 +399,8 @@ func rewriteValueARM64(v *Value) bool {
                return rewriteValueARM64_OpGeq8_0(v)
        case OpGeq8U:
                return rewriteValueARM64_OpGeq8U_0(v)
+       case OpGetCallerSP:
+               return rewriteValueARM64_OpGetCallerSP_0(v)
        case OpGetClosurePtr:
                return rewriteValueARM64_OpGetClosurePtr_0(v)
        case OpGreater16:
@@ -11846,6 +11848,15 @@ func rewriteValueARM64_OpGeq8U_0(v *Value) bool {
                return true
        }
 }
+func rewriteValueARM64_OpGetCallerSP_0(v *Value) bool {
+       // match: (GetCallerSP)
+       // cond:
+       // result: (LoweredGetCallerSP)
+       for {
+               v.reset(OpARM64LoweredGetCallerSP)
+               return true
+       }
+}
 func rewriteValueARM64_OpGetClosurePtr_0(v *Value) bool {
        // match: (GetClosurePtr)
        // cond:
index 3bfaf4fdaf96c8e49dacff56fd33064c16190f5d..d4f4c03ca3e97e4f61c724e02a6f223cf73bbd74 100644 (file)
@@ -145,6 +145,8 @@ func rewriteValueMIPS(v *Value) bool {
                return rewriteValueMIPS_OpGeq8_0(v)
        case OpGeq8U:
                return rewriteValueMIPS_OpGeq8U_0(v)
+       case OpGetCallerSP:
+               return rewriteValueMIPS_OpGetCallerSP_0(v)
        case OpGetClosurePtr:
                return rewriteValueMIPS_OpGetClosurePtr_0(v)
        case OpGreater16:
@@ -1759,6 +1761,15 @@ func rewriteValueMIPS_OpGeq8U_0(v *Value) bool {
                return true
        }
 }
+func rewriteValueMIPS_OpGetCallerSP_0(v *Value) bool {
+       // match: (GetCallerSP)
+       // cond:
+       // result: (LoweredGetCallerSP)
+       for {
+               v.reset(OpMIPSLoweredGetCallerSP)
+               return true
+       }
+}
 func rewriteValueMIPS_OpGetClosurePtr_0(v *Value) bool {
        // match: (GetClosurePtr)
        // cond:
index f15e51ec67e26bb0de339d9652853a5cbef57d01..fadadbc1fe11c5780610ad4a7d0445bbeeb8619e 100644 (file)
@@ -147,6 +147,8 @@ func rewriteValueMIPS64(v *Value) bool {
                return rewriteValueMIPS64_OpGeq8_0(v)
        case OpGeq8U:
                return rewriteValueMIPS64_OpGeq8U_0(v)
+       case OpGetCallerSP:
+               return rewriteValueMIPS64_OpGetCallerSP_0(v)
        case OpGetClosurePtr:
                return rewriteValueMIPS64_OpGetClosurePtr_0(v)
        case OpGreater16:
@@ -1719,6 +1721,15 @@ func rewriteValueMIPS64_OpGeq8U_0(v *Value) bool {
                return true
        }
 }
+func rewriteValueMIPS64_OpGetCallerSP_0(v *Value) bool {
+       // match: (GetCallerSP)
+       // cond:
+       // result: (LoweredGetCallerSP)
+       for {
+               v.reset(OpMIPS64LoweredGetCallerSP)
+               return true
+       }
+}
 func rewriteValueMIPS64_OpGetClosurePtr_0(v *Value) bool {
        // match: (GetClosurePtr)
        // cond:
index 7167c9516bbc3138a7e046ff896ed9d3f4dadc72..3be0c6ab841c785914bcf680be8af712d42ab391 100644 (file)
@@ -185,6 +185,8 @@ func rewriteValuePPC64(v *Value) bool {
                return rewriteValuePPC64_OpGeq8_0(v)
        case OpGeq8U:
                return rewriteValuePPC64_OpGeq8U_0(v)
+       case OpGetCallerSP:
+               return rewriteValuePPC64_OpGetCallerSP_0(v)
        case OpGetClosurePtr:
                return rewriteValuePPC64_OpGetClosurePtr_0(v)
        case OpGreater16:
@@ -2051,6 +2053,15 @@ func rewriteValuePPC64_OpGeq8U_0(v *Value) bool {
                return true
        }
 }
+func rewriteValuePPC64_OpGetCallerSP_0(v *Value) bool {
+       // match: (GetCallerSP)
+       // cond:
+       // result: (LoweredGetCallerSP)
+       for {
+               v.reset(OpPPC64LoweredGetCallerSP)
+               return true
+       }
+}
 func rewriteValuePPC64_OpGetClosurePtr_0(v *Value) bool {
        // match: (GetClosurePtr)
        // cond:
index 78758981d0f6c1d1122d0e894dd1f2b9187d49b4..a937da12eb9d08a657ef54019d88fd2804f7eaed 100644 (file)
@@ -185,6 +185,8 @@ func rewriteValueS390X(v *Value) bool {
                return rewriteValueS390X_OpGeq8_0(v)
        case OpGeq8U:
                return rewriteValueS390X_OpGeq8U_0(v)
+       case OpGetCallerSP:
+               return rewriteValueS390X_OpGetCallerSP_0(v)
        case OpGetClosurePtr:
                return rewriteValueS390X_OpGetClosurePtr_0(v)
        case OpGetG:
@@ -2219,6 +2221,15 @@ func rewriteValueS390X_OpGeq8U_0(v *Value) bool {
                return true
        }
 }
+func rewriteValueS390X_OpGetCallerSP_0(v *Value) bool {
+       // match: (GetCallerSP)
+       // cond:
+       // result: (LoweredGetCallerSP)
+       for {
+               v.reset(OpS390XLoweredGetCallerSP)
+               return true
+       }
+}
 func rewriteValueS390X_OpGetClosurePtr_0(v *Value) bool {
        // match: (GetClosurePtr)
        // cond:
index 12cbac63bb318d20530294ba42c40e55718c2114..6ac0022d8f2d9c21341cd53005cafbcab4b2c5a7 100644 (file)
@@ -675,6 +675,15 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
                p.To.Type = obj.TYPE_REG
                p.To.Reg = v.Reg()
 
+       case ssa.Op386LoweredGetCallerSP:
+               // caller's SP is the address of the first arg
+               p := s.Prog(x86.AMOVL)
+               p.From.Type = obj.TYPE_ADDR
+               p.From.Offset = -gc.Ctxt.FixedFrameSize() // 0 on 386, just to be consistent with other architectures
+               p.From.Name = obj.NAME_PARAM
+               p.To.Type = obj.TYPE_REG
+               p.To.Reg = v.Reg()
+
        case ssa.Op386CALLstatic, ssa.Op386CALLclosure, ssa.Op386CALLinter:
                s.Call(v)
        case ssa.Op386NEGL,
index 373ece4e0cdf29f2455c355920a76ce95ac79871..cbc6f06323d32307964d00ecc20475971281165d 100644 (file)
@@ -4,10 +4,7 @@
 
 package runtime
 
-import (
-       "runtime/internal/sys"
-       "unsafe"
-)
+import "unsafe"
 
 // Should be a built-in for unsafe.Pointer?
 //go:nosplit
@@ -229,10 +226,8 @@ func publicationBarrier()
 //go:noescape
 func getcallerpc() uintptr
 
-//go:nosplit
-func getcallersp(argp unsafe.Pointer) uintptr {
-       return uintptr(argp) - sys.MinFrameSize
-}
+//go:noescape
+func getcallersp(argp unsafe.Pointer) uintptr // implemented as an intrinsic on all platforms
 
 // getclosureptr returns the pointer to the current closure.
 // getclosureptr can only be used in an assignment statement