mirror of
https://github.com/golang/go
synced 2024-11-23 11:20:05 -07:00
cmd/compile: add new ops for experiment with late call expansion
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>
This commit is contained in:
parent
f554eb7bc3
commit
35e413c537
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user