This commit changes wazeroir.OperationSwap to OperationSet which is the combination of OperationSwap and Drop in the previous implementation. Previously, OperationSwap was always followed by OperationDrop on the swapped value on top. Because of that, we had a redundant register allocation in Swap. As a result, we use only one register in OperationSet which is a part of translations of local.tee and local.set. Signed-off-by: Takeshi Yoneda takeshi@tetrate.io
327 lines
20 KiB
Go
327 lines
20 KiB
Go
package compiler
|
|
|
|
import (
|
|
"github.com/tetratelabs/wazero/internal/asm"
|
|
"github.com/tetratelabs/wazero/internal/wazeroir"
|
|
)
|
|
|
|
// compiler is the interface of architecture-specific native code compiler,
|
|
// and this is responsible for compiling native code for all wazeroir operations.
|
|
type compiler interface {
|
|
// String is for debugging purpose.
|
|
String() string
|
|
// compilePreamble is called before compiling any wazeroir operation.
|
|
// This is used, for example, to initialize the reserved registers, etc.
|
|
compilePreamble() error
|
|
// compile generates the byte slice of native code.
|
|
// stackPointerCeil is the max stack pointer that the target function would reach.
|
|
compile() (code []byte, stackPointerCeil uint64, err error)
|
|
// compileGoHostFunction adds the trampoline code from which native code can jump into the Go-defined host function.
|
|
// TODO: maybe we wouldn't need to have trampoline for host functions.
|
|
compileGoDefinedHostFunction() error
|
|
// compileLabel notify compilers of the beginning of a label.
|
|
// Return true if the compiler decided to skip the entire label.
|
|
// See wazeroir.OperationLabel
|
|
compileLabel(o *wazeroir.OperationLabel) (skipThisLabel bool)
|
|
// compileUnreachable adds instruction to perform wazeroir.OperationUnreachable.
|
|
compileUnreachable() error
|
|
// compileSet adds instruction to perform wazeroir.OperationSet.
|
|
compileSet(o *wazeroir.OperationSet) error
|
|
// compileGlobalGet adds instructions to perform wazeroir.OperationGlobalGet.
|
|
compileGlobalGet(o *wazeroir.OperationGlobalGet) error
|
|
// compileGlobalSet adds instructions to perform wazeroir.OperationGlobalSet.
|
|
compileGlobalSet(o *wazeroir.OperationGlobalSet) error
|
|
// compileBr adds instructions to perform wazeroir.OperationBr.
|
|
compileBr(o *wazeroir.OperationBr) error
|
|
// compileBrIf adds instructions to perform wazeroir.OperationBrIf.
|
|
compileBrIf(o *wazeroir.OperationBrIf) error
|
|
// compileBrTable adds instructions to perform wazeroir.OperationBrTable.
|
|
compileBrTable(o *wazeroir.OperationBrTable) error
|
|
// compileCall adds instructions to perform wazeroir.OperationCall.
|
|
compileCall(o *wazeroir.OperationCall) error
|
|
// compileCallIndirect adds instructions to perform wazeroir.OperationCallIndirect.
|
|
compileCallIndirect(o *wazeroir.OperationCallIndirect) error
|
|
// compileDrop adds instructions to perform wazeroir.OperationDrop.
|
|
compileDrop(o *wazeroir.OperationDrop) error
|
|
// compileSelect adds instructions to perform wazeroir.OperationSelect.
|
|
compileSelect(o *wazeroir.OperationSelect) error
|
|
// compilePick adds instructions to perform wazeroir.OperationPick.
|
|
compilePick(o *wazeroir.OperationPick) error
|
|
// compileAdd adds instructions to perform wazeroir.OperationAdd.
|
|
compileAdd(o *wazeroir.OperationAdd) error
|
|
// compileSub adds instructions to perform wazeroir.OperationSub.
|
|
compileSub(o *wazeroir.OperationSub) error
|
|
// compileMul adds instructions to perform wazeroir.OperationMul.
|
|
compileMul(o *wazeroir.OperationMul) error
|
|
// compileClz adds instructions to perform wazeroir.OperationClz.
|
|
compileClz(o *wazeroir.OperationClz) error
|
|
// compileCtz adds instructions to perform wazeroir.OperationCtz.
|
|
compileCtz(o *wazeroir.OperationCtz) error
|
|
// compilePopcnt adds instructions to perform wazeroir.OperationPopcnt.
|
|
compilePopcnt(o *wazeroir.OperationPopcnt) error
|
|
// compileDiv adds instructions to perform wazeroir.OperationDiv.
|
|
compileDiv(o *wazeroir.OperationDiv) error
|
|
// compileRem adds instructions to perform wazeroir.OperationRem.
|
|
compileRem(o *wazeroir.OperationRem) error
|
|
// compileAnd adds instructions to perform wazeroir.OperationAnd.
|
|
compileAnd(o *wazeroir.OperationAnd) error
|
|
// compileOr adds instructions to perform wazeroir.OperationOr.
|
|
compileOr(o *wazeroir.OperationOr) error
|
|
// compileXor adds instructions to perform wazeroir.OperationXor.
|
|
compileXor(o *wazeroir.OperationXor) error
|
|
// compileShl adds instructions to perform wazeroir.OperationShl.
|
|
compileShl(o *wazeroir.OperationShl) error
|
|
// compileShr adds instructions to perform wazeroir.OperationShr.
|
|
compileShr(o *wazeroir.OperationShr) error
|
|
// compileRotl adds instructions to perform wazeroir.OperationRotl.
|
|
compileRotl(o *wazeroir.OperationRotl) error
|
|
// compileRotr adds instructions to perform wazeroir.OperationRotr.
|
|
compileRotr(o *wazeroir.OperationRotr) error
|
|
// compileNeg adds instructions to perform wazeroir.OperationAbs.
|
|
compileAbs(o *wazeroir.OperationAbs) error
|
|
// compileNeg adds instructions to perform wazeroir.OperationNeg.
|
|
compileNeg(o *wazeroir.OperationNeg) error
|
|
// compileCeil adds instructions to perform wazeroir.OperationCeil.
|
|
compileCeil(o *wazeroir.OperationCeil) error
|
|
// compileFloor adds instructions to perform wazeroir.OperationFloor.
|
|
compileFloor(o *wazeroir.OperationFloor) error
|
|
// compileTrunc adds instructions to perform wazeroir.OperationTrunc.
|
|
compileTrunc(o *wazeroir.OperationTrunc) error
|
|
// compileNearest adds instructions to perform wazeroir.OperationNearest.
|
|
compileNearest(o *wazeroir.OperationNearest) error
|
|
// compileSqrt adds instructions perform wazeroir.OperationSqrt.
|
|
compileSqrt(o *wazeroir.OperationSqrt) error
|
|
// compileMin adds instructions perform wazeroir.OperationMin.
|
|
compileMin(o *wazeroir.OperationMin) error
|
|
// compileMax adds instructions perform wazeroir.OperationMax.
|
|
compileMax(o *wazeroir.OperationMax) error
|
|
// compileCopysign adds instructions to perform wazeroir.OperationCopysign.
|
|
compileCopysign(o *wazeroir.OperationCopysign) error
|
|
// compileI32WrapFromI64 adds instructions to perform wazeroir.OperationI32WrapFromI64.
|
|
compileI32WrapFromI64() error
|
|
// compileITruncFromF adds instructions to perform wazeroir.OperationITruncFromF.
|
|
compileITruncFromF(o *wazeroir.OperationITruncFromF) error
|
|
// compileFConvertFromI adds instructions to perform wazeroir.OperationFConvertFromI.
|
|
compileFConvertFromI(o *wazeroir.OperationFConvertFromI) error
|
|
// compileF32DemoteFromF64 adds instructions to perform wazeroir.OperationF32DemoteFromF64.
|
|
compileF32DemoteFromF64() error
|
|
// compileF64PromoteFromF32 adds instructions to perform wazeroir.OperationF64PromoteFromF32.
|
|
compileF64PromoteFromF32() error
|
|
// compileI32ReinterpretFromF32 adds instructions to perform wazeroir.OperationI32ReinterpretFromF32.
|
|
compileI32ReinterpretFromF32() error
|
|
// compileI64ReinterpretFromF64 adds instructions to perform wazeroir.OperationI64ReinterpretFromF64.
|
|
compileI64ReinterpretFromF64() error
|
|
// compileF32ReinterpretFromI32 adds instructions to perform wazeroir.OperationF32ReinterpretFromI32.
|
|
compileF32ReinterpretFromI32() error
|
|
// compileF64ReinterpretFromI64 adds instructions to perform wazeroir.OperationF64ReinterpretFromI64.
|
|
compileF64ReinterpretFromI64() error
|
|
// compileExtend adds instructions to perform wazeroir.OperationExtend.
|
|
compileExtend(o *wazeroir.OperationExtend) error
|
|
// compileEq adds instructions to perform wazeroir.OperationEq.
|
|
compileEq(o *wazeroir.OperationEq) error
|
|
// compileEq adds instructions to perform wazeroir.OperationNe.
|
|
compileNe(o *wazeroir.OperationNe) error
|
|
// compileEq adds instructions to perform wazeroir.OperationEqz.
|
|
compileEqz(o *wazeroir.OperationEqz) error
|
|
// compileLt adds instructions to perform wazeroir.OperationLt.
|
|
compileLt(o *wazeroir.OperationLt) error
|
|
// compileGt adds instructions to perform wazeroir.OperationGt.
|
|
compileGt(o *wazeroir.OperationGt) error
|
|
// compileLe adds instructions to perform wazeroir.OperationLe.
|
|
compileLe(o *wazeroir.OperationLe) error
|
|
// compileLe adds instructions to perform wazeroir.OperationGe.
|
|
compileGe(o *wazeroir.OperationGe) error
|
|
// compileLoad adds instructions to perform wazeroir.OperationLoad.
|
|
compileLoad(o *wazeroir.OperationLoad) error
|
|
// compileLoad8 adds instructions to perform wazeroir.OperationLoad8.
|
|
compileLoad8(o *wazeroir.OperationLoad8) error
|
|
// compileLoad16 adds instructions to perform wazeroir.OperationLoad16.
|
|
compileLoad16(o *wazeroir.OperationLoad16) error
|
|
// compileLoad32 adds instructions to perform wazeroir.OperationLoad32.
|
|
compileLoad32(o *wazeroir.OperationLoad32) error
|
|
// compileStore adds instructions to perform wazeroir.OperationStore.
|
|
compileStore(o *wazeroir.OperationStore) error
|
|
// compileStore8 adds instructions to perform wazeroir.OperationStore8.
|
|
compileStore8(o *wazeroir.OperationStore8) error
|
|
// compileStore16 adds instructions to perform wazeroir.OperationStore16.
|
|
compileStore16(o *wazeroir.OperationStore16) error
|
|
// compileStore32 adds instructions to perform wazeroir.OperationStore32.
|
|
compileStore32(o *wazeroir.OperationStore32) error
|
|
// compileMemorySize adds instruction to perform wazeroir.OperationMemoryGrow.
|
|
compileMemoryGrow() error
|
|
// compileMemorySize adds instruction to perform wazeroir.OperationMemorySize.
|
|
compileMemorySize() error
|
|
// compileConstI32 adds instruction to perform wazeroir.OperationConstI32.
|
|
compileConstI32(o *wazeroir.OperationConstI32) error
|
|
// compileConstI64 adds instruction to perform wazeroir.OperationConstI64.
|
|
compileConstI64(o *wazeroir.OperationConstI64) error
|
|
// compileConstF32 adds instruction to perform wazeroir.OperationConstF32.
|
|
compileConstF32(o *wazeroir.OperationConstF32) error
|
|
// compileConstF64 adds instruction to perform wazeroir.OperationConstF64.
|
|
compileConstF64(o *wazeroir.OperationConstF64) error
|
|
// compileSignExtend32From8 adds instructions to perform wazeroir.OperationSignExtend32From8.
|
|
compileSignExtend32From8() error
|
|
// compileSignExtend32From16 adds instructions to perform wazeroir.OperationSignExtend32From16.
|
|
compileSignExtend32From16() error
|
|
// compileSignExtend64From8 adds instructions to perform wazeroir.OperationSignExtend64From8.
|
|
compileSignExtend64From8() error
|
|
// compileSignExtend64From16 adds instructions to perform wazeroir.OperationSignExtend64From16.
|
|
compileSignExtend64From16() error
|
|
// compileSignExtend64From32 adds instructions to perform wazeroir.OperationSignExtend64From32.
|
|
compileSignExtend64From32() error
|
|
// compileMemoryInit adds instructions to perform wazeroir.OperationMemoryInit.
|
|
compileMemoryInit(*wazeroir.OperationMemoryInit) error
|
|
// compileDataDrop adds instructions to perform wazeroir.OperationDataDrop.
|
|
compileDataDrop(*wazeroir.OperationDataDrop) error
|
|
// compileMemoryCopy adds instructions to perform wazeroir.OperationMemoryCopy.
|
|
compileMemoryCopy() error
|
|
// compileMemoryFill adds instructions to perform wazeroir.OperationMemoryFill.
|
|
compileMemoryFill() error
|
|
// compileTableInit adds instructions to perform wazeroir.OperationTableInit.
|
|
compileTableInit(*wazeroir.OperationTableInit) error
|
|
// compileTableCopy adds instructions to perform wazeroir.OperationTableCopy.
|
|
compileTableCopy(*wazeroir.OperationTableCopy) error
|
|
// compileElemDrop adds instructions to perform wazeroir.OperationElemDrop.
|
|
compileElemDrop(*wazeroir.OperationElemDrop) error
|
|
// compileRefFunc adds instructions to perform wazeroir.OperationRefFunc.
|
|
compileRefFunc(*wazeroir.OperationRefFunc) error
|
|
// compileTableGet adds instructions to perform wazeroir.OperationTableGet.
|
|
compileTableGet(*wazeroir.OperationTableGet) error
|
|
// compileTableSet adds instructions to perform wazeroir.OperationTableSet.
|
|
compileTableSet(*wazeroir.OperationTableSet) error
|
|
// compileTableGrow adds instructions to perform wazeroir.OperationTableGrow.
|
|
compileTableGrow(*wazeroir.OperationTableGrow) error
|
|
// compileTableSize adds instructions to perform wazeroir.OperationTableSize.
|
|
compileTableSize(*wazeroir.OperationTableSize) error
|
|
// compileTableFill adds instructions to perform wazeroir.OperationTableFill.
|
|
compileTableFill(*wazeroir.OperationTableFill) error
|
|
// compileV128Const adds instructions to perform wazeroir.OperationV128Const.
|
|
compileV128Const(*wazeroir.OperationV128Const) error
|
|
// compileV128Add adds instructions to perform wazeroir.OperationV128Add.
|
|
compileV128Add(o *wazeroir.OperationV128Add) error
|
|
// compileV128Sub adds instructions to perform wazeroir.OperationV128Sub.
|
|
compileV128Sub(o *wazeroir.OperationV128Sub) error
|
|
// compileV128Load adds instructions to perform wazeroir.OperationV128Load.
|
|
compileV128Load(o *wazeroir.OperationV128Load) error
|
|
// compileV128LoadLane adds instructions to perform wazeroir.OperationV128LoadLane.
|
|
compileV128LoadLane(o *wazeroir.OperationV128LoadLane) error
|
|
// compileV128Store adds instructions to perform wazeroir.OperationV128Store.
|
|
compileV128Store(o *wazeroir.OperationV128Store) error
|
|
// compileV128StoreLane adds instructions to perform wazeroir.OperationV128StoreLane.
|
|
compileV128StoreLane(o *wazeroir.OperationV128StoreLane) error
|
|
// compileV128ExtractLane adds instructions to perform wazeroir.OperationV128ExtractLane.
|
|
compileV128ExtractLane(o *wazeroir.OperationV128ExtractLane) error
|
|
// compileV128ReplaceLane adds instructions to perform wazeroir.OperationV128ReplaceLane.
|
|
compileV128ReplaceLane(o *wazeroir.OperationV128ReplaceLane) error
|
|
// compileV128Splat adds instructions to perform wazeroir.OperationV128Splat.
|
|
compileV128Splat(o *wazeroir.OperationV128Splat) error
|
|
// compileV128Shuffle adds instructions to perform wazeroir.OperationV128Shuffle.
|
|
compileV128Shuffle(o *wazeroir.OperationV128Shuffle) error
|
|
// compileV128Swizzle adds instructions to perform wazeroir.OperationV128Swizzle.
|
|
compileV128Swizzle(o *wazeroir.OperationV128Swizzle) error
|
|
// compileV128AnyTrue adds instructions to perform wazeroir.OperationV128AnyTrue.
|
|
compileV128AnyTrue(o *wazeroir.OperationV128AnyTrue) error
|
|
// compileV128AllTrue adds instructions to perform wazeroir.OperationV128AllTrue.
|
|
compileV128AllTrue(o *wazeroir.OperationV128AllTrue) error
|
|
// compileV128BitMask adds instructions to perform wazeroir.OperationV128BitMask.
|
|
compileV128BitMask(*wazeroir.OperationV128BitMask) error
|
|
// compileV128And adds instructions to perform wazeroir.OperationV128And.
|
|
compileV128And(*wazeroir.OperationV128And) error
|
|
// compileV128Not adds instructions to perform wazeroir.OperationV128Not.
|
|
compileV128Not(*wazeroir.OperationV128Not) error
|
|
// compileV128Or adds instructions to perform wazeroir.OperationV128Or.
|
|
compileV128Or(*wazeroir.OperationV128Or) error
|
|
// compileV128Xor adds instructions to perform wazeroir.OperationV128Xor.
|
|
compileV128Xor(*wazeroir.OperationV128Xor) error
|
|
// compileV128Bitselect adds instructions to perform wazeroir.OperationV128Bitselect.
|
|
compileV128Bitselect(*wazeroir.OperationV128Bitselect) error
|
|
// compileV128AndNot adds instructions to perform wazeroir.OperationV128AndNot.
|
|
compileV128AndNot(*wazeroir.OperationV128AndNot) error
|
|
// compileV128Shr adds instructions to perform wazeroir.OperationV128Shr.
|
|
compileV128Shr(*wazeroir.OperationV128Shr) error
|
|
// compileV128Shl adds instructions to perform wazeroir.OperationV128Shl.
|
|
compileV128Shl(*wazeroir.OperationV128Shl) error
|
|
// compileV128Cmp adds instructions to perform wazeroir.OperationV128Cmp.
|
|
compileV128Cmp(*wazeroir.OperationV128Cmp) error
|
|
// compileV128AddSat adds instructions to perform wazeroir.OperationV128AddSat.
|
|
compileV128AddSat(*wazeroir.OperationV128AddSat) error
|
|
// compileV128SubSat adds instructions to perform wazeroir.OperationV128SubSat.
|
|
compileV128SubSat(*wazeroir.OperationV128SubSat) error
|
|
// compileV128Mul adds instructions to perform wazeroir.OperationV128Mul.
|
|
compileV128Mul(*wazeroir.OperationV128Mul) error
|
|
// compileV128Div adds instructions to perform wazeroir.OperationV128Div.
|
|
compileV128Div(*wazeroir.OperationV128Div) error
|
|
// compileV128Neg adds instructions to perform wazeroir.OperationV128Neg.
|
|
compileV128Neg(*wazeroir.OperationV128Neg) error
|
|
// compileV128Sqrt adds instructions to perform wazeroir.OperationV128Sqrt.
|
|
compileV128Sqrt(*wazeroir.OperationV128Sqrt) error
|
|
// compileV128Abs adds instructions to perform wazeroir.OperationV128Abs.
|
|
compileV128Abs(*wazeroir.OperationV128Abs) error
|
|
// compileV128Popcnt adds instructions to perform wazeroir.OperationV128Popcnt.
|
|
compileV128Popcnt(*wazeroir.OperationV128Popcnt) error
|
|
// compileV128Min adds instructions to perform wazeroir.OperationV128Min.
|
|
compileV128Min(*wazeroir.OperationV128Min) error
|
|
// compileV128Max adds instructions to perform wazeroir.OperationV128Max.
|
|
compileV128Max(*wazeroir.OperationV128Max) error
|
|
// compileV128AvgrU adds instructions to perform wazeroir.OperationV128AvgrU.
|
|
compileV128AvgrU(*wazeroir.OperationV128AvgrU) error
|
|
// compileV128Pmin adds instructions to perform wazeroir.OperationV128Pmin.
|
|
compileV128Pmin(*wazeroir.OperationV128Pmin) error
|
|
// compileV128Pmax adds instructions to perform wazeroir.OperationV128Pmax.
|
|
compileV128Pmax(*wazeroir.OperationV128Pmax) error
|
|
// compileV128Ceil adds instructions to perform wazeroir.OperationV128Ceil.
|
|
compileV128Ceil(*wazeroir.OperationV128Ceil) error
|
|
// compileV128Floor adds instructions to perform wazeroir.OperationV128Floor.
|
|
compileV128Floor(*wazeroir.OperationV128Floor) error
|
|
// compileV128Trunc adds instructions to perform wazeroir.OperationV128Trunc.
|
|
compileV128Trunc(*wazeroir.OperationV128Trunc) error
|
|
// compileV128Nearest adds instructions to perform wazeroir.OperationV128Nearest.
|
|
compileV128Nearest(*wazeroir.OperationV128Nearest) error
|
|
// compileV128Extend adds instructions to perform wazeroir.OperationV128Extend.
|
|
compileV128Extend(*wazeroir.OperationV128Extend) error
|
|
// compileV128ExtMul adds instructions to perform wazeroir.OperationV128ExtMul.
|
|
compileV128ExtMul(*wazeroir.OperationV128ExtMul) error
|
|
// compileV128Q15mulrSatS adds instructions to perform wazeroir.OperationV128Q15mulrSatS.
|
|
compileV128Q15mulrSatS(*wazeroir.OperationV128Q15mulrSatS) error
|
|
// compileV128ExtAddPairwise adds instructions to perform wazeroir.OperationV128ExtAddPairwise.
|
|
compileV128ExtAddPairwise(o *wazeroir.OperationV128ExtAddPairwise) error
|
|
// compileV128FloatPromote adds instructions to perform wazeroir.OperationV128FloatPromote.
|
|
compileV128FloatPromote(o *wazeroir.OperationV128FloatPromote) error
|
|
// compileV128FloatDemote adds instructions to perform wazeroir.OperationV128FloatDemote.
|
|
compileV128FloatDemote(o *wazeroir.OperationV128FloatDemote) error
|
|
// compileV128FConvertFromI adds instructions to perform wazeroir.OperationV128FConvertFromI.
|
|
compileV128FConvertFromI(o *wazeroir.OperationV128FConvertFromI) error
|
|
// compileV128Dot adds instructions to perform wazeroir.OperationV128Dot.
|
|
compileV128Dot(o *wazeroir.OperationV128Dot) error
|
|
// compileV128Narrow adds instructions to perform wazeroir.OperationV128Narrow.
|
|
compileV128Narrow(o *wazeroir.OperationV128Narrow) error
|
|
// compileV128ITruncSatFromF adds instructions to perform wazeroir.OperationV128ITruncSatFromF.
|
|
compileV128ITruncSatFromF(o *wazeroir.OperationV128ITruncSatFromF) error
|
|
|
|
// compileReleaseRegisterToStack adds instructions to write the value on a register back to memory stack region.
|
|
compileReleaseRegisterToStack(loc *runtimeValueLocation)
|
|
// compileLoadValueOnStackToRegister adds instructions to load the value located on the stack to the assigned register.
|
|
compileLoadValueOnStackToRegister(loc *runtimeValueLocation)
|
|
|
|
// maybeCompileMoveTopConditionalToGeneralPurposeRegister moves the top value on the stack
|
|
// if the value is located on a conditional register.
|
|
//
|
|
// This is usually called at the beginning of methods on compiler interface where we possibly
|
|
// compile instructions without saving the conditional register value.
|
|
// The compileXXX functions without calling this function is saving the conditional
|
|
// value to the stack or register by invoking compileEnsureOnRegister for the top.
|
|
maybeCompileMoveTopConditionalToGeneralPurposeRegister() error
|
|
// allocateRegister returns an unused register of the given type. The register will be taken
|
|
// either from the free register pool or by stealing a used register.
|
|
//
|
|
// Note: resulting registers will not be marked as used so the call site should
|
|
// mark it used if necessary.
|
|
allocateRegister(t registerType) (reg asm.Register, err error)
|
|
// runtimeValueLocationStack returns the current runtimeValueLocationStack of the compiler implementation.
|
|
runtimeValueLocationStack() *runtimeValueLocationStack
|
|
// pushRuntimeValueLocationOnRegister pushes a new runtimeValueLocation on a register `reg` and of the type `vt`.
|
|
pushRuntimeValueLocationOnRegister(reg asm.Register, vt runtimeValueType) (ret *runtimeValueLocation)
|
|
// pushRuntimeValueLocationOnRegister pushes a new vector value's runtimeValueLocation on a register `reg`.
|
|
pushVectorRuntimeValueLocationOnRegister(reg asm.Register) (lowerBitsLocation *runtimeValueLocation)
|
|
}
|