Documentation
¶
Index ¶
- Constants
- Variables
- func AddRegisterLink(vart *VariableT, rawNode NodeT)
- func AddStackFrames(proc *CallNodeT, frameType types.Type)
- func AllocateRegisters(top *CallNodeT)
- func Any[T any](predicate func(T) bool, slice []T) bool
- func AttachInput(parent *CallNodeT, index int, child NodeT)
- func AttachNext(parent *CallNodeT, next *CallNodeT, optionalIndex ...int)
- func CallString(call *CallNodeT) string
- func CheckNode(topCall *CallNodeT)
- func Cse(top *CallNodeT)
- func DefaultSimplify(call *CallNodeT)
- func DefinePrimops()
- func Erase(rawNode NodeT)
- func EraseAll(nodes []NodeT)
- func EraseVariable(vart *VariableT)
- func Evaluate(proc *CallNodeT, args []int) []int
- func Every[T any](predicate func(T) bool, slice []T) bool
- func Filter[T any](predicate func(T) bool, slice []T) []T
- func FindBasicBlocks[BB BasicBlockT](top *CallNodeT, makeBlock func() BB) []BB
- func FindLoopBlocks[T any](theirBlocks []*T, next func(*T) []*T, ...) []*T
- func InlineProcedure(call *CallNodeT, proc *CallNodeT)
- func InsertCallParent(child *CallNodeT, newParent *CallNodeT)
- func IsCallNode(node NodeT) bool
- func IsCalledNode(node NodeT) bool
- func IsCalledRef(node *ReferenceNodeT) bool
- func IsJumpLambdaNode(node NodeT) bool
- func IsLiteralNode(node NodeT) bool
- func IsNil(node NodeT) bool
- func IsProcLambdaNode(node NodeT) bool
- func IsReferenceNode(node NodeT) bool
- func IsStackAllocator(rawPrimop PrimopT) bool
- func IsVarReferenceNode(node NodeT, vart *VariableT) bool
- func Last[T any](slice []T) T
- func LinkCallRegisters(call *CallNodeT)
- func LinkJumpRegisters(call *CallNodeT)
- func Map[S any, T any](function func(S) T, slice []S) []T
- func MarkChanged(node NodeT)
- func NodeValue(rawNode NodeT, env EnvT) any
- func PpCps(rawNode NodeT)
- func ProclaimEmpty(node NodeT)
- func Push[T any](slice *[]T, thing T)
- func PushSlice[T any](slice *[]T, things []T)
- func RegEvaluate(proc *CallNodeT, args []int) []int
- func RemoveCall(node *CallNodeT)
- func RemoveNullInputs(node *CallNodeT, inputCount int)
- func RemoveUnusedInputs(top *CallNodeT)
- func RemoveUnusedOutputs(node *CallNodeT)
- func ReplaceInput(oldNode NodeT, newNode NodeT)
- func ReplaceNext(oldNode *CallNodeT, newNode *CallNodeT)
- func SimplifyArithBinop(call *CallNodeT)
- func SimplifyBooleanOp(call *CallNodeT, condPrimop string, negate bool)
- func SimplifyCells(top *CallNodeT)
- func SimplifyJump(call *CallNodeT)
- func SimplifyLet(call *CallNodeT)
- func SimplifyLetrec(call *CallNodeT)
- func SimplifyMakeCell(call *CallNodeT)
- func SimplifyNext(call *CallNodeT)
- func SimplifyProcCall(call *CallNodeT)
- func Substitute(vart *VariableT, val NodeT, detachVal bool)
- type BasicBlockT
- type BinopPrimopT
- func (primop *BinopPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *BinopPrimopT) Name() string
- func (primop *BinopPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *BinopPrimopT) SideEffects() bool
- func (primop *BinopPrimopT) Simplify(call *CallNodeT)
- type BlockT
- type CallNodeT
- type CallTypeT
- type CallsProcPrimopT
- type CallsT
- func (calls *CallsT) AddCall(primop PrimopT, outputs []*VariableT, inputs []NodeT)
- func (calls *CallsT) AddFirst(call *CallNodeT)
- func (calls *CallsT) AddPrimopVarsCall(primopName string, outputs []*VariableT, inputs ...NodeT)
- func (calls *CallsT) AppendCall(call *CallNodeT)
- func (calls *CallsT) AppendCalls(more *CallsT)
- func (calls *CallsT) BuildCall(primopName string, outputName string, outputType types.Type, inputs ...any) *VariableT
- func (calls *CallsT) BuildFinalCall(primopName string, exits int, args ...any) *CallNodeT
- func (calls *CallsT) BuildNoOutputCall(primopName string, inputs ...any)
- func (calls *CallsT) BuildVarCall(primopName string, output *VariableT, inputs ...any)
- func (calls *CallsT) HasFinal() bool
- func (calls *CallsT) SetLast(call *CallNodeT)
- func (calls *CallsT) SetLastSource(source token.Pos)
- type CellRefPrimopT
- func (primop *CellRefPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *CellRefPrimopT) Name() string
- func (primop *CellRefPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *CellRefPrimopT) SideEffects() bool
- func (primop *CellRefPrimopT) Simplify(call *CallNodeT)
- type CellSetPrimopT
- func (primop *CellSetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *CellSetPrimopT) Name() string
- func (primop *CellSetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *CellSetPrimopT) SideEffects() bool
- func (primop *CellSetPrimopT) Simplify(call *CallNodeT)
- type CellValuesT
- type CompPrimopT
- func (primop *CompPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *CompPrimopT) Name() string
- func (primop *CompPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *CompPrimopT) SideEffects() bool
- func (primop *CompPrimopT) Simplify(call *CallNodeT)
- type CompilatorT
- type ConstantT
- type EnvT
- type EvalPrimopT
- type IfEqPrimopT
- func (primop *IfEqPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *IfEqPrimopT) Name() string
- func (primop *IfEqPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *IfEqPrimopT) SideEffects() bool
- func (primop *IfEqPrimopT) Simplify(call *CallNodeT)
- type IfLtPrimopT
- func (primop *IfLtPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *IfLtPrimopT) Name() string
- func (primop *IfLtPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *IfLtPrimopT) SideEffects() bool
- func (primop *IfLtPrimopT) Simplify(call *CallNodeT)
- type IfPrimopT
- func (primop *IfPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *IfPrimopT) Name() string
- func (primop *IfPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *IfPrimopT) SideEffects() bool
- func (primop *IfPrimopT) Simplify(call *CallNodeT)
- type JumpLambdaPrimopT
- func (primop *JumpLambdaPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *JumpLambdaPrimopT) Name() string
- func (primop *JumpLambdaPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *JumpLambdaPrimopT) SideEffects() bool
- func (primop *JumpLambdaPrimopT) Simplify(call *CallNodeT)
- type JumpPrimopT
- func (primop *JumpPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *JumpPrimopT) Name() string
- func (primop *JumpPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *JumpPrimopT) SideEffects() bool
- func (primop *JumpPrimopT) Simplify(call *CallNodeT)
- type LenPrimopT
- func (primop *LenPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *LenPrimopT) Name() string
- func (primop *LenPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *LenPrimopT) SideEffects() bool
- func (primop *LenPrimopT) Simplify(call *CallNodeT)
- type LetPrimopT
- func (primop *LetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *LetPrimopT) Name() string
- func (primop *LetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *LetPrimopT) SideEffects() bool
- func (primop *LetPrimopT) Simplify(call *CallNodeT)
- type LetrecPrimopT
- func (primop *LetrecPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *LetrecPrimopT) Name() string
- func (primop *LetrecPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *LetrecPrimopT) SideEffects() bool
- func (primop *LetrecPrimopT) Simplify(call *CallNodeT)
- type LiteralNodeT
- type LoadRegPrimopT
- func (primop *LoadRegPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *LoadRegPrimopT) Name() string
- func (primop *LoadRegPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *LoadRegPrimopT) SideEffects() bool
- func (primop *LoadRegPrimopT) Simplify(call *CallNodeT)
- type MakeCellPrimopT
- func (primop *MakeCellPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *MakeCellPrimopT) Name() string
- func (primop *MakeCellPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *MakeCellPrimopT) SideEffects() bool
- func (primop *MakeCellPrimopT) Simplify(call *CallNodeT)
- type MakeLiteralPrimopT
- func (primop *MakeLiteralPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *MakeLiteralPrimopT) Name() string
- func (primop *MakeLiteralPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *MakeLiteralPrimopT) SideEffects() bool
- func (primop *MakeLiteralPrimopT) Simplify(call *CallNodeT)
- type NodeBaseT
- func (node *NodeBaseT) Flag() int
- func (node *NodeBaseT) Index() int
- func (node *NodeBaseT) IsSimplified() bool
- func (node *NodeBaseT) Parent() *CallNodeT
- func (node *NodeBaseT) SetFlag(flag int)
- func (node *NodeBaseT) SetIndex(index int)
- func (node *NodeBaseT) SetIsSimplified(isSimplified bool)
- func (node *NodeBaseT) SetParent(parent *CallNodeT)
- func (node *NodeBaseT) SetSource(source token.Pos)
- func (node *NodeBaseT) Source() token.Pos
- type NodeT
- type NodeTypeT
- type NotPrimopT
- func (primop *NotPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *NotPrimopT) Name() string
- func (primop *NotPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *NotPrimopT) SideEffects() bool
- func (primop *NotPrimopT) Simplify(call *CallNodeT)
- type PointerRefPrimopT
- func (primop *PointerRefPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *PointerRefPrimopT) Name() string
- func (primop *PointerRefPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *PointerRefPrimopT) SideEffects() bool
- func (primop *PointerRefPrimopT) Simplify(call *CallNodeT)
- type PointerSetPrimopT
- func (primop *PointerSetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *PointerSetPrimopT) Name() string
- func (primop *PointerSetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *PointerSetPrimopT) SideEffects() bool
- func (primop *PointerSetPrimopT) Simplify(call *CallNodeT)
- type PpCpsWriterT
- type PrimopT
- type ProcCallPrimopT
- func (primop *ProcCallPrimopT) CalledProc(call *CallNodeT) *CallNodeT
- func (primop *ProcCallPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *ProcCallPrimopT) Name() string
- func (primop *ProcCallPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *ProcCallPrimopT) SideEffects() bool
- func (primop *ProcCallPrimopT) Simplify(call *CallNodeT)
- type ProcLambdaPrimopT
- func (primop *ProcLambdaPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *ProcLambdaPrimopT) Name() string
- func (primop *ProcLambdaPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *ProcLambdaPrimopT) SideEffects() bool
- func (primop *ProcLambdaPrimopT) Simplify(call *CallNodeT)
- type QueueT
- type ReferenceNodeT
- type RegEnvT
- type RegUseSpecT
- type RegisterClassT
- type RegisterLinkerT
- type RegisterT
- type ReturnPrimopT
- func (primop *ReturnPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *ReturnPrimopT) Name() string
- func (primop *ReturnPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *ReturnPrimopT) SideEffects() bool
- func (primop *ReturnPrimopT) Simplify(call *CallNodeT)
- type SliceIndexPrimopT
- func (primop *SliceIndexPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
- func (primop *SliceIndexPrimopT) Name() string
- func (primop *SliceIndexPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
- func (primop *SliceIndexPrimopT) SideEffects() bool
- func (primop *SliceIndexPrimopT) Simplify(call *CallNodeT)
- type StackAllocator
- type VarEnvT
- type VariableT
Constants ¶
const ( LiteralNode = iota ReferenceNode CallNode )
const ( CallExit = iota // directly follows some other call ProcLambda // full procedure that is passed a continuation JumpLambda // only called tail-recursively and has no )
const ( EarlyRegUse = -2 MiddleRegUse = -1 LateRegUse = 0 )
Variables ¶
var Lambdas = util.SetT[*CallNodeT]{}
Set containing all calls that do not have a single predecessor.
var NextVariableId = 0
var PrimopTable = map[string]PrimopT{}
var TheFileSet *token.FileSet
Wart: We need an interface to replace Go's tokens for source data. token.FileSet is not an interface so we can't create our own.
Functions ¶
func AddRegisterLink ¶ added in v0.1.12
func AddStackFrames ¶ added in v0.1.6
func AllocateRegisters ¶
func AllocateRegisters(top *CallNodeT)
func AttachInput ¶
func AttachNext ¶
func CallString ¶
func DefaultSimplify ¶
func DefaultSimplify(call *CallNodeT)
func DefinePrimops ¶
func DefinePrimops()
func EraseVariable ¶
func EraseVariable(vart *VariableT)
func FindBasicBlocks ¶
func FindBasicBlocks[BB BasicBlockT](top *CallNodeT, makeBlock func() BB) []BB
func FindLoopBlocks ¶ added in v0.1.10
func InlineProcedure ¶
func InsertCallParent ¶
func IsCallNode ¶
func IsCalledNode ¶
func IsCalledRef ¶
func IsCalledRef(node *ReferenceNodeT) bool
func IsJumpLambdaNode ¶
func IsLiteralNode ¶
func IsProcLambdaNode ¶ added in v0.1.1
func IsReferenceNode ¶
func IsStackAllocator ¶ added in v0.1.6
func IsVarReferenceNode ¶
func LinkCallRegisters ¶ added in v0.1.12
func LinkCallRegisters(call *CallNodeT)
Ditto for procedure calls. Disabled until we figure out how to use this.
func LinkJumpRegisters ¶ added in v0.1.12
func LinkJumpRegisters(call *CallNodeT)
Called by the jump primop's RegisterUsage method.
func MarkChanged ¶
func MarkChanged(node NodeT)
func ProclaimEmpty ¶
func ProclaimEmpty(node NodeT)
func RegEvaluate ¶
func RemoveCall ¶
func RemoveCall(node *CallNodeT)
func RemoveNullInputs ¶
func RemoveUnusedInputs ¶
func RemoveUnusedInputs(top *CallNodeT)
func RemoveUnusedOutputs ¶
func RemoveUnusedOutputs(node *CallNodeT)
func ReplaceInput ¶
func ReplaceNext ¶
func SimplifyArithBinop ¶
func SimplifyArithBinop(call *CallNodeT)
func SimplifyBooleanOp ¶
func SimplifyCells ¶
func SimplifyCells(top *CallNodeT)
func SimplifyJump ¶
func SimplifyJump(call *CallNodeT)
func SimplifyLet ¶
func SimplifyLet(call *CallNodeT)
func SimplifyLetrec ¶
func SimplifyLetrec(call *CallNodeT)
func SimplifyMakeCell ¶
func SimplifyMakeCell(call *CallNodeT)
func SimplifyNext ¶
func SimplifyNext(call *CallNodeT)
func SimplifyProcCall ¶ added in v0.1.1
func SimplifyProcCall(call *CallNodeT)
func Substitute ¶
Types ¶
type BasicBlockT ¶
type BasicBlockT interface {
// contains filtered or unexported methods
}
func ContainingBlock ¶
func ContainingBlock(node NodeT) BasicBlockT
type BinopPrimopT ¶
type BinopPrimopT struct {
MyName string
}
func (*BinopPrimopT) Evaluate ¶
func (primop *BinopPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*BinopPrimopT) Name ¶
func (primop *BinopPrimopT) Name() string
func (*BinopPrimopT) RegisterUsage ¶
func (primop *BinopPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*BinopPrimopT) SideEffects ¶
func (primop *BinopPrimopT) SideEffects() bool
func (*BinopPrimopT) Simplify ¶
func (primop *BinopPrimopT) Simplify(call *CallNodeT)
type CallNodeT ¶
type CallNodeT struct {
NodeBaseT
CallType CallTypeT
Primop PrimopT // the primitive operator being called
Inputs []NodeT
Outputs []*VariableT
Next []*CallNodeT // calls that immediately follow this one
Block BasicBlockT // proc and jump lambdas and call exits of conditionals
Name string // for debugging
Id int // ditto
}
var TopLambda *CallNodeT
For debugging. This is the topmost node and has no parent.
func CalledLambda ¶
func DetachNext ¶
func (*CallNodeT) InputVariable ¶
type CallsProcPrimopT ¶ added in v0.1.1
Primops that call a procedure implement this.
type CallsT ¶
type CallsT struct {
First *CallNodeT // The first
Last *CallNodeT // and last calls in a block.
// contains filtered or unexported fields
}
func (*CallsT) AddPrimopVarsCall ¶
func (*CallsT) AppendCall ¶ added in v0.1.2
func (*CallsT) AppendCalls ¶ added in v0.1.2
func (*CallsT) BuildFinalCall ¶
func (*CallsT) BuildNoOutputCall ¶
func (*CallsT) BuildVarCall ¶
func (*CallsT) SetLastSource ¶
type CellRefPrimopT ¶
type CellRefPrimopT struct{}
func (*CellRefPrimopT) Evaluate ¶
func (primop *CellRefPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*CellRefPrimopT) Name ¶
func (primop *CellRefPrimopT) Name() string
func (*CellRefPrimopT) RegisterUsage ¶
func (primop *CellRefPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*CellRefPrimopT) SideEffects ¶
func (primop *CellRefPrimopT) SideEffects() bool
func (*CellRefPrimopT) Simplify ¶
func (primop *CellRefPrimopT) Simplify(call *CallNodeT)
type CellSetPrimopT ¶
type CellSetPrimopT struct{}
func (*CellSetPrimopT) Evaluate ¶
func (primop *CellSetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*CellSetPrimopT) Name ¶
func (primop *CellSetPrimopT) Name() string
func (*CellSetPrimopT) RegisterUsage ¶
func (primop *CellSetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*CellSetPrimopT) SideEffects ¶
func (primop *CellSetPrimopT) SideEffects() bool
func (*CellSetPrimopT) Simplify ¶
func (primop *CellSetPrimopT) Simplify(call *CallNodeT)
type CellValuesT ¶
type CellValuesT struct {
// contains filtered or unexported fields
}
type CompPrimopT ¶
func (*CompPrimopT) Evaluate ¶
func (primop *CompPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*CompPrimopT) Name ¶
func (primop *CompPrimopT) Name() string
func (*CompPrimopT) RegisterUsage ¶
func (primop *CompPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*CompPrimopT) SideEffects ¶
func (primop *CompPrimopT) SideEffects() bool
func (*CompPrimopT) Simplify ¶
func (primop *CompPrimopT) Simplify(call *CallNodeT)
type CompilatorT ¶ added in v0.1.2
type ConstantT ¶ added in v0.1.20
The constant.Value interface is closed. In order to allow other kinds of constants we use our own interface, which is the same as constant.Value minus the Kind() method.
Any two equal constants must return the same ExactStrings and any two unequal constants must return different ExactStrings.
type IfEqPrimopT ¶
type IfEqPrimopT struct{}
func (*IfEqPrimopT) Evaluate ¶
func (primop *IfEqPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*IfEqPrimopT) Name ¶
func (primop *IfEqPrimopT) Name() string
func (*IfEqPrimopT) RegisterUsage ¶
func (primop *IfEqPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*IfEqPrimopT) SideEffects ¶
func (primop *IfEqPrimopT) SideEffects() bool
func (*IfEqPrimopT) Simplify ¶
func (primop *IfEqPrimopT) Simplify(call *CallNodeT)
type IfLtPrimopT ¶
type IfLtPrimopT struct{}
func (*IfLtPrimopT) Evaluate ¶
func (primop *IfLtPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*IfLtPrimopT) Name ¶
func (primop *IfLtPrimopT) Name() string
func (*IfLtPrimopT) RegisterUsage ¶
func (primop *IfLtPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*IfLtPrimopT) SideEffects ¶
func (primop *IfLtPrimopT) SideEffects() bool
func (*IfLtPrimopT) Simplify ¶
func (primop *IfLtPrimopT) Simplify(call *CallNodeT)
type IfPrimopT ¶
type IfPrimopT struct{}
func (*IfPrimopT) RegisterUsage ¶
func (primop *IfPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*IfPrimopT) SideEffects ¶
type JumpLambdaPrimopT ¶
type JumpLambdaPrimopT struct {
}
func (*JumpLambdaPrimopT) Evaluate ¶
func (primop *JumpLambdaPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*JumpLambdaPrimopT) Name ¶
func (primop *JumpLambdaPrimopT) Name() string
func (*JumpLambdaPrimopT) RegisterUsage ¶
func (primop *JumpLambdaPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*JumpLambdaPrimopT) SideEffects ¶
func (primop *JumpLambdaPrimopT) SideEffects() bool
func (*JumpLambdaPrimopT) Simplify ¶
func (primop *JumpLambdaPrimopT) Simplify(call *CallNodeT)
type JumpPrimopT ¶
type JumpPrimopT struct{}
func (*JumpPrimopT) Evaluate ¶
func (primop *JumpPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*JumpPrimopT) Name ¶
func (primop *JumpPrimopT) Name() string
func (*JumpPrimopT) RegisterUsage ¶
func (primop *JumpPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*JumpPrimopT) SideEffects ¶
func (primop *JumpPrimopT) SideEffects() bool
func (*JumpPrimopT) Simplify ¶
func (primop *JumpPrimopT) Simplify(call *CallNodeT)
type LenPrimopT ¶ added in v0.1.1
type LenPrimopT struct{}
func (*LenPrimopT) Evaluate ¶ added in v0.1.1
func (primop *LenPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*LenPrimopT) Name ¶ added in v0.1.1
func (primop *LenPrimopT) Name() string
func (*LenPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *LenPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*LenPrimopT) SideEffects ¶ added in v0.1.1
func (primop *LenPrimopT) SideEffects() bool
func (*LenPrimopT) Simplify ¶ added in v0.1.1
func (primop *LenPrimopT) Simplify(call *CallNodeT)
type LetPrimopT ¶
type LetPrimopT struct{}
func (*LetPrimopT) Evaluate ¶
func (primop *LetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*LetPrimopT) Name ¶
func (primop *LetPrimopT) Name() string
func (*LetPrimopT) RegisterUsage ¶
func (primop *LetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*LetPrimopT) SideEffects ¶
func (primop *LetPrimopT) SideEffects() bool
func (*LetPrimopT) Simplify ¶
func (primop *LetPrimopT) Simplify(call *CallNodeT)
type LetrecPrimopT ¶
type LetrecPrimopT struct{}
func (*LetrecPrimopT) Evaluate ¶
func (primop *LetrecPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*LetrecPrimopT) Name ¶
func (primop *LetrecPrimopT) Name() string
func (*LetrecPrimopT) RegisterUsage ¶
func (primop *LetrecPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*LetrecPrimopT) SideEffects ¶
func (primop *LetrecPrimopT) SideEffects() bool
func (*LetrecPrimopT) Simplify ¶
func (primop *LetrecPrimopT) Simplify(call *CallNodeT)
type LiteralNodeT ¶
type LiteralNodeT struct {
NodeBaseT
Value ConstantT
// types.Type is an easy-to-implement interface, so it's not Go specific.
Type types.Type
}
func CopyLiteralNode ¶
func CopyLiteralNode(node *LiteralNodeT) *LiteralNodeT
func MakeLiteral ¶
func MakeLiteral(value any, typ types.Type) *LiteralNodeT
func (*LiteralNodeT) Constant ¶ added in v0.1.20
func (node *LiteralNodeT) Constant() constant.Value
func (*LiteralNodeT) IsNil ¶
func (node *LiteralNodeT) IsNil() bool
func (*LiteralNodeT) IsValue ¶
func (node *LiteralNodeT) IsValue() bool
func (*LiteralNodeT) NodeType ¶
func (node *LiteralNodeT) NodeType() NodeTypeT
func (*LiteralNodeT) String ¶
func (node *LiteralNodeT) String() string
type LoadRegPrimopT ¶
type LoadRegPrimopT struct{}
Load a register with an immediage value.
func (*LoadRegPrimopT) Evaluate ¶
func (primop *LoadRegPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*LoadRegPrimopT) Name ¶
func (primop *LoadRegPrimopT) Name() string
func (*LoadRegPrimopT) RegisterUsage ¶
func (primop *LoadRegPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*LoadRegPrimopT) SideEffects ¶
func (primop *LoadRegPrimopT) SideEffects() bool
func (*LoadRegPrimopT) Simplify ¶
func (primop *LoadRegPrimopT) Simplify(call *CallNodeT)
type MakeCellPrimopT ¶
type MakeCellPrimopT struct{}
func (*MakeCellPrimopT) Evaluate ¶
func (primop *MakeCellPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*MakeCellPrimopT) Name ¶
func (primop *MakeCellPrimopT) Name() string
func (*MakeCellPrimopT) RegisterUsage ¶
func (primop *MakeCellPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*MakeCellPrimopT) SideEffects ¶
func (primop *MakeCellPrimopT) SideEffects() bool
func (*MakeCellPrimopT) Simplify ¶
func (primop *MakeCellPrimopT) Simplify(call *CallNodeT)
type MakeLiteralPrimopT ¶ added in v0.1.1
type MakeLiteralPrimopT struct{}
Load a register with an immediage value.
func (*MakeLiteralPrimopT) Evaluate ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*MakeLiteralPrimopT) Name ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) Name() string
func (*MakeLiteralPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*MakeLiteralPrimopT) SideEffects ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) SideEffects() bool
func (*MakeLiteralPrimopT) Simplify ¶ added in v0.1.1
func (primop *MakeLiteralPrimopT) Simplify(call *CallNodeT)
type NodeBaseT ¶
type NodeBaseT struct {
// contains filtered or unexported fields
}
func (*NodeBaseT) IsSimplified ¶
func (*NodeBaseT) SetIsSimplified ¶
type NodeT ¶
type NodeT interface {
NodeType() NodeTypeT
Parent() *CallNodeT
SetParent(parent *CallNodeT)
Index() int // index in parent's inputs
SetIndex(index int)
IsNil() bool
// Is this a literal, variable references, or non-continuation
// lambda.
IsValue() bool
// The simplifier applies a set of optimizing code tranformations.
// Nodes that have been simplified are flagged and any change to a
// node clears that flag. There is an invariant that if a node
// has been simplified then all of its descendents have also been
// simplified.
IsSimplified() bool
SetIsSimplified(isSimplified bool)
// Temporary marker used in analysing the node tree. Must be set
// back to zero upon completion.
Flag() int
SetFlag(flag int)
String() string // So they're easy to print.
}
func CalledNode ¶
func CopyNodeTree ¶ added in v0.1.1
func DetachInput ¶
type NotPrimopT ¶
type NotPrimopT struct{}
func (*NotPrimopT) Evaluate ¶
func (primop *NotPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*NotPrimopT) Name ¶
func (primop *NotPrimopT) Name() string
func (*NotPrimopT) RegisterUsage ¶
func (primop *NotPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*NotPrimopT) SideEffects ¶
func (primop *NotPrimopT) SideEffects() bool
func (*NotPrimopT) Simplify ¶
func (primop *NotPrimopT) Simplify(call *CallNodeT)
type PointerRefPrimopT ¶ added in v0.1.1
type PointerRefPrimopT struct{}
func (*PointerRefPrimopT) Evaluate ¶ added in v0.1.1
func (primop *PointerRefPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*PointerRefPrimopT) Name ¶ added in v0.1.1
func (primop *PointerRefPrimopT) Name() string
func (*PointerRefPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *PointerRefPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*PointerRefPrimopT) SideEffects ¶ added in v0.1.1
func (primop *PointerRefPrimopT) SideEffects() bool
func (*PointerRefPrimopT) Simplify ¶ added in v0.1.1
func (primop *PointerRefPrimopT) Simplify(call *CallNodeT)
type PointerSetPrimopT ¶
type PointerSetPrimopT struct{}
func (*PointerSetPrimopT) Evaluate ¶
func (primop *PointerSetPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*PointerSetPrimopT) Name ¶
func (primop *PointerSetPrimopT) Name() string
func (*PointerSetPrimopT) RegisterUsage ¶
func (primop *PointerSetPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*PointerSetPrimopT) SideEffects ¶
func (primop *PointerSetPrimopT) SideEffects() bool
func (*PointerSetPrimopT) Simplify ¶
func (primop *PointerSetPrimopT) Simplify(call *CallNodeT)
type PpCpsWriterT ¶
type PpCpsWriterT struct {
Column int
// contains filtered or unexported fields
}
func MakePpCpsWriter ¶
func MakePpCpsWriter(writer io.Writer) *PpCpsWriterT
func (*PpCpsWriterT) Freshline ¶
func (writer *PpCpsWriterT) Freshline()
func (*PpCpsWriterT) IndentTo ¶
func (writer *PpCpsWriterT) IndentTo(column int)
func (*PpCpsWriterT) Newline ¶
func (writer *PpCpsWriterT) Newline()
type PrimopT ¶
type PrimopT interface {
Name() string
SideEffects() bool
Simplify(call *CallNodeT)
// The return values are the inputs' and outputs' register usages.
RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
}
func LookupPrimop ¶
type ProcCallPrimopT ¶ added in v0.1.1
type ProcCallPrimopT struct{}
func (*ProcCallPrimopT) CalledProc ¶ added in v0.1.1
func (primop *ProcCallPrimopT) CalledProc(call *CallNodeT) *CallNodeT
func (*ProcCallPrimopT) Evaluate ¶ added in v0.1.1
func (primop *ProcCallPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*ProcCallPrimopT) Name ¶ added in v0.1.1
func (primop *ProcCallPrimopT) Name() string
func (*ProcCallPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *ProcCallPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*ProcCallPrimopT) SideEffects ¶ added in v0.1.1
func (primop *ProcCallPrimopT) SideEffects() bool
func (*ProcCallPrimopT) Simplify ¶ added in v0.1.1
func (primop *ProcCallPrimopT) Simplify(call *CallNodeT)
type ProcLambdaPrimopT ¶
type ProcLambdaPrimopT struct{}
func (*ProcLambdaPrimopT) Evaluate ¶
func (primop *ProcLambdaPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*ProcLambdaPrimopT) Name ¶
func (primop *ProcLambdaPrimopT) Name() string
func (*ProcLambdaPrimopT) RegisterUsage ¶
func (primop *ProcLambdaPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*ProcLambdaPrimopT) SideEffects ¶
func (primop *ProcLambdaPrimopT) SideEffects() bool
func (*ProcLambdaPrimopT) Simplify ¶
func (primop *ProcLambdaPrimopT) Simplify(call *CallNodeT)
type ReferenceNodeT ¶
func MakeReferenceNode ¶
func MakeReferenceNode(variable *VariableT) *ReferenceNodeT
func (*ReferenceNodeT) IsNil ¶
func (node *ReferenceNodeT) IsNil() bool
func (*ReferenceNodeT) IsValue ¶
func (node *ReferenceNodeT) IsValue() bool
func (*ReferenceNodeT) NodeType ¶
func (node *ReferenceNodeT) NodeType() NodeTypeT
func (*ReferenceNodeT) String ¶ added in v0.1.1
func (node *ReferenceNodeT) String() string
type RegUseSpecT ¶
type RegUseSpecT struct {
PhaseOffset int // -2, -1, 0 for early, middle, and late use
Class *RegisterClassT
}
type RegisterClassT ¶
type RegisterClassT struct {
Name string
// contains filtered or unexported fields
}
A set of registers.
func (*RegisterClassT) SetRegisters ¶ added in v0.1.13
func (class *RegisterClassT) SetRegisters(allRegisters []RegisterT, usableMask uint64)
type RegisterLinkerT ¶ added in v0.1.12
type RegisterLinkerT interface {
LinkRegisters(call *CallNodeT)
}
Primops can implement this.
type RegisterT ¶
type RegisterT interface {
SetClass(*RegisterClassT) // for initialization
Class() *RegisterClassT
String() string
Number() int
}
type ReturnPrimopT ¶
type ReturnPrimopT struct{}
func (*ReturnPrimopT) Evaluate ¶
func (primop *ReturnPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*ReturnPrimopT) Name ¶
func (primop *ReturnPrimopT) Name() string
func (*ReturnPrimopT) RegisterUsage ¶
func (primop *ReturnPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*ReturnPrimopT) SideEffects ¶
func (primop *ReturnPrimopT) SideEffects() bool
func (*ReturnPrimopT) Simplify ¶
func (primop *ReturnPrimopT) Simplify(call *CallNodeT)
type SliceIndexPrimopT ¶ added in v0.1.1
type SliceIndexPrimopT struct{}
func (*SliceIndexPrimopT) Evaluate ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)
func (*SliceIndexPrimopT) Name ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) Name() string
func (*SliceIndexPrimopT) RegisterUsage ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)
func (*SliceIndexPrimopT) SideEffects ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) SideEffects() bool
func (*SliceIndexPrimopT) Simplify ¶ added in v0.1.1
func (primop *SliceIndexPrimopT) Simplify(call *CallNodeT)
type StackAllocator ¶ added in v0.1.6
type StackAllocator interface {
IsStackAllocator() bool
}
How primops tell us that they do stack allocation.