]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: add new ops for experiment with late call expansion
authorDavid Chase <drchase@google.com>
Mon, 15 Jun 2020 18:20:36 +0000 (14:20 -0400)
committerDavid Chase <drchase@google.com>
Thu, 17 Sep 2020 19:18:10 +0000 (19:18 +0000)
Added Dereference, StaticLECall, SelectN, SelectNAddr

Change-Id: I5426ae488e83956539aa07f7415b8acc26c933e6
Reviewed-on: https://go-review.googlesource.com/c/go/+/239082
Trust: David Chase <drchase@google.com>
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/cmd/compile/internal/ssa/gen/genericOps.go
src/cmd/compile/internal/ssa/opGen.go

index 145ba2d50c6f8f37573198592aea17b382f1ce10..95edff4c8c0ea2de21be9c0bfa91cc0e58f88cdc 100644 (file)
@@ -346,6 +346,7 @@ var genericOps = []opData{
 
        // Memory operations
        {name: "Load", argLength: 2},                          // Load from arg0.  arg1=memory
+       {name: "Dereference", argLength: 2},                   // Load from arg0.  arg1=memory.  Helper op for arg/result passing, result is an otherwise not-SSA-able "value".
        {name: "Store", argLength: 3, typ: "Mem", aux: "Typ"}, // Store arg1 to arg0.  arg2=memory, aux=type.  Returns memory.
        // The source and destination of Move may overlap in some cases. See e.g.
        // memmove inlining in generic.rules. When inlineablememmovesize (in ../rewrite.go)
@@ -387,9 +388,11 @@ var genericOps = []opData{
        // as a phantom first argument.
        // TODO(josharian): ClosureCall and InterCall should have Int32 aux
        // to match StaticCall's 32 bit arg size limit.
-       {name: "ClosureCall", argLength: 3, aux: "CallOff", call: true}, // arg0=code pointer, arg1=context ptr, arg2=memory.  auxint=arg size.  Returns memory.
-       {name: "StaticCall", argLength: 1, aux: "CallOff", call: true},  // call function aux.(*obj.LSym), arg0=memory.  auxint=arg size.  Returns memory.
-       {name: "InterCall", argLength: 2, aux: "CallOff", call: true},   // interface call.  arg0=code pointer, arg1=memory, auxint=arg size.  Returns memory.
+       // TODO(drchase,josharian): could the arg size limit be bundled into the rules for CallOff?
+       {name: "ClosureCall", argLength: 3, aux: "CallOff", call: true},   // arg0=code pointer, arg1=context ptr, arg2=memory.  auxint=arg size.  Returns memory.
+       {name: "StaticCall", argLength: 1, aux: "CallOff", call: true},    // call function aux.(*obj.LSym), arg0=memory.  auxint=arg size.  Returns memory.
+       {name: "InterCall", argLength: 2, aux: "CallOff", call: true},     // interface call.  arg0=code pointer, arg1=memory, auxint=arg size.  Returns memory.
+       {name: "StaticLECall", argLength: -1, aux: "CallOff", call: true}, // late-expanded static call function aux.(*ssa.AuxCall.Fn). arg0..argN-1 are inputs, argN is mem. auxint = arg size. Result is tuple of result(s), plus mem.
 
        // Conversions: signed extensions, zero (unsigned) extensions, truncations
        {name: "SignExt8to16", argLength: 1, typ: "Int16"},
@@ -531,8 +534,10 @@ var genericOps = []opData{
        {name: "Cvt64Fto64U", argLength: 1}, // float64 -> uint64, only used on archs that has the instruction
 
        // pseudo-ops for breaking Tuple
-       {name: "Select0", argLength: 1, zeroWidth: true}, // the first component of a tuple
-       {name: "Select1", argLength: 1, zeroWidth: true}, // the second component of a tuple
+       {name: "Select0", argLength: 1, zeroWidth: true},  // the first component of a tuple
+       {name: "Select1", argLength: 1, zeroWidth: true},  // the second component of a tuple
+       {name: "SelectN", argLength: 1, aux: "Int64"},     // arg0=tuple, auxint=field index.  Returns the auxint'th member.
+       {name: "SelectNAddr", argLength: 1, aux: "Int64"}, // arg0=tuple, auxint=field index.  Returns the address of auxint'th member. Used for un-SSA-able result types.
 
        // Atomic operations used for semantically inlining runtime/internal/atomic.
        // Atomic loads return a new memory so that the loads are properly ordered
index f00dc3f7f530ea5ac4292d66fc81e639e4e06596..1fc0f7ea7945052b7db99535c12a485c264bab5d 100644 (file)
@@ -2717,6 +2717,7 @@ const (
        OpSP
        OpSB
        OpLoad
+       OpDereference
        OpStore
        OpMove
        OpZero
@@ -2730,6 +2731,7 @@ const (
        OpClosureCall
        OpStaticCall
        OpInterCall
+       OpStaticLECall
        OpSignExt8to16
        OpSignExt8to32
        OpSignExt8to64
@@ -2826,6 +2828,8 @@ const (
        OpCvt64Fto64U
        OpSelect0
        OpSelect1
+       OpSelectN
+       OpSelectNAddr
        OpAtomicLoad8
        OpAtomicLoad32
        OpAtomicLoad64
@@ -34742,6 +34746,11 @@ var opcodeTable = [...]opInfo{
                argLen:  2,
                generic: true,
        },
+       {
+               name:    "Dereference",
+               argLen:  2,
+               generic: true,
+       },
        {
                name:    "Store",
                auxType: auxTyp,
@@ -34827,6 +34836,13 @@ var opcodeTable = [...]opInfo{
                call:    true,
                generic: true,
        },
+       {
+               name:    "StaticLECall",
+               auxType: auxCallOff,
+               argLen:  -1,
+               call:    true,
+               generic: true,
+       },
        {
                name:    "SignExt8to16",
                argLen:  1,
@@ -35328,6 +35344,18 @@ var opcodeTable = [...]opInfo{
                zeroWidth: true,
                generic:   true,
        },
+       {
+               name:    "SelectN",
+               auxType: auxInt64,
+               argLen:  1,
+               generic: true,
+       },
+       {
+               name:    "SelectNAddr",
+               auxType: auxInt64,
+               argLen:  1,
+               generic: true,
+       },
        {
                name:    "AtomicLoad8",
                argLen:  2,