cps

package
v0.1.18 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 19, 2025 License: MIT Imports: 17 Imported by: 0

Documentation

Index

Constants

View Source
const (
	LiteralNode = iota
	ReferenceNode
	CallNode
)
View Source
const (
	CallExit   = iota // directly follows some other call
	ProcLambda        // full procedure that is passed a continuation
	JumpLambda        // only called tail-recursively and has no

)
View Source
const (
	EarlyRegUse  = -2
	MiddleRegUse = -1
	LateRegUse   = 0
)

Variables

View Source
var Lambdas = util.SetT[*CallNodeT]{}

Set containing all calls that do not have a single predecessor.

View Source
var NextVariableId = 0
View Source
var PrimopTable = map[string]PrimopT{}
View Source
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(vart *VariableT, rawNode NodeT)

func AddStackFrames added in v0.1.6

func AddStackFrames(proc *CallNodeT, frameType types.Type)

func AllocateRegisters

func AllocateRegisters(top *CallNodeT)

func Any

func Any[T any](predicate func(T) bool, slice []T) bool

func AttachInput

func AttachInput(parent *CallNodeT, index int, child NodeT)

func AttachNext

func AttachNext(parent *CallNodeT, next *CallNodeT, optionalIndex ...int)

func CallString

func CallString(call *CallNodeT) string

func CheckNode

func CheckNode(topCall *CallNodeT)

func Cse added in v0.1.10

func Cse(top *CallNodeT)

func DefaultSimplify

func DefaultSimplify(call *CallNodeT)

func DefinePrimops

func DefinePrimops()

func Erase

func Erase(rawNode NodeT)

func EraseAll

func EraseAll(nodes []NodeT)

func EraseVariable

func EraseVariable(vart *VariableT)

func Evaluate

func Evaluate(proc *CallNodeT, args []int) []int

func Every

func Every[T any](predicate func(T) bool, slice []T) bool

func Filter

func Filter[T any](predicate func(T) bool, slice []T) []T

func FindBasicBlocks

func FindBasicBlocks[BB BasicBlockT](top *CallNodeT, makeBlock func() BB) []BB

func FindLoopBlocks added in v0.1.10

func FindLoopBlocks[T any](
	theirBlocks []*T,
	next func(*T) []*T,
	setResult func(block *T, loopHeader *T, loopParent *T, loopDepth int)) []*T

func InlineProcedure

func InlineProcedure(call *CallNodeT, proc *CallNodeT)

func InsertCallParent

func InsertCallParent(child *CallNodeT, newParent *CallNodeT)

func IsCallNode

func IsCallNode(node NodeT) bool

func IsCalledNode

func IsCalledNode(node NodeT) bool

func IsCalledRef

func IsCalledRef(node *ReferenceNodeT) bool

func IsJumpLambdaNode

func IsJumpLambdaNode(node NodeT) bool

func IsLiteralNode

func IsLiteralNode(node NodeT) bool

func IsNil

func IsNil(node NodeT) bool

func IsProcLambdaNode added in v0.1.1

func IsProcLambdaNode(node NodeT) bool

func IsReferenceNode

func IsReferenceNode(node NodeT) bool

func IsStackAllocator added in v0.1.6

func IsStackAllocator(rawPrimop PrimopT) bool

func IsVarReferenceNode

func IsVarReferenceNode(node NodeT, vart *VariableT) bool

func Last

func Last[T any](slice []T) T

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 Map

func Map[S any, T any](function func(S) T, slice []S) []T

func MarkChanged

func MarkChanged(node NodeT)

func NodeValue

func NodeValue(rawNode NodeT, env EnvT) any

func PpCps

func PpCps(rawNode NodeT)

func ProclaimEmpty

func ProclaimEmpty(node NodeT)

func Push

func Push[T any](slice *[]T, thing T)

func PushSlice

func PushSlice[T any](slice *[]T, things []T)

func RegEvaluate

func RegEvaluate(proc *CallNodeT, args []int) []int

func RemoveCall

func RemoveCall(node *CallNodeT)

func RemoveNullInputs

func RemoveNullInputs(node *CallNodeT, inputCount int)

func RemoveUnusedInputs

func RemoveUnusedInputs(top *CallNodeT)

func RemoveUnusedOutputs

func RemoveUnusedOutputs(node *CallNodeT)

func ReplaceInput

func ReplaceInput(oldNode NodeT, newNode NodeT)

func ReplaceNext

func ReplaceNext(oldNode *CallNodeT, newNode *CallNodeT)

func SimplifyArithBinop

func SimplifyArithBinop(call *CallNodeT)

func SimplifyBooleanOp

func SimplifyBooleanOp(call *CallNodeT, condPrimop string, negate bool)

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

func Substitute(vart *VariableT, val NodeT, detachVal bool)

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 BlockT

type BlockT struct {
	Start    *CallNodeT
	End      *CallNodeT
	Next     []*BlockT
	Previous []*BlockT
}

func MakeBlock

func MakeBlock() *BlockT

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 CalledLambda(call *CallNodeT) *CallNodeT

func DetachNext

func DetachNext(node *CallNodeT) *CallNodeT

func MakeCall

func MakeCall(primop PrimopT, outputs []*VariableT, inputs ...NodeT) *CallNodeT

func MakeLambda

func MakeLambda(name string, callType CallTypeT, outputs []*VariableT) *CallNodeT

func (*CallNodeT) InputVariable

func (node *CallNodeT) InputVariable(i int) *VariableT

func (*CallNodeT) IsExit

func (node *CallNodeT) IsExit() bool

func (*CallNodeT) IsLambda

func (node *CallNodeT) IsLambda() bool

func (*CallNodeT) IsNil

func (node *CallNodeT) IsNil() bool

func (*CallNodeT) IsValue

func (node *CallNodeT) IsValue() bool

func (*CallNodeT) NodeType

func (node *CallNodeT) NodeType() NodeTypeT

func (*CallNodeT) String added in v0.1.1

func (node *CallNodeT) String() string

type CallTypeT

type CallTypeT int

type CallsProcPrimopT added in v0.1.1

type CallsProcPrimopT interface {
	CalledProc(*CallNodeT) *CallNodeT // Proc being called.
}

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 MakeCalls

func MakeCalls() *CallsT

func (*CallsT) AddCall

func (calls *CallsT) AddCall(primop PrimopT, outputs []*VariableT, inputs []NodeT)

func (*CallsT) AddFirst

func (calls *CallsT) AddFirst(call *CallNodeT)

func (*CallsT) AddPrimopVarsCall

func (calls *CallsT) AddPrimopVarsCall(primopName string, outputs []*VariableT, inputs ...NodeT)

func (*CallsT) AppendCall added in v0.1.2

func (calls *CallsT) AppendCall(call *CallNodeT)

func (*CallsT) AppendCalls added in v0.1.2

func (calls *CallsT) AppendCalls(more *CallsT)

func (*CallsT) BuildCall

func (calls *CallsT) BuildCall(primopName string, outputName string, outputType types.Type, inputs ...any) *VariableT

func (*CallsT) BuildFinalCall

func (calls *CallsT) BuildFinalCall(primopName string, exits int, args ...any) *CallNodeT

func (*CallsT) BuildNoOutputCall

func (calls *CallsT) BuildNoOutputCall(primopName string, inputs ...any)

func (*CallsT) BuildVarCall

func (calls *CallsT) BuildVarCall(primopName string, output *VariableT, inputs ...any)

func (*CallsT) HasFinal

func (calls *CallsT) HasFinal() bool

func (*CallsT) SetLast

func (calls *CallsT) SetLast(call *CallNodeT)

func (*CallsT) SetLastSource

func (calls *CallsT) SetLastSource(source token.Pos)

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

type CompPrimopT struct {
	MyName     string
	CondPrimop string
	CondNegate bool
}

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 CompilatorT interface {
	ToCps(args []NodeT, resultVars []*VariableT, calls *CallsT)
}

type EnvT

type EnvT interface {
	Get(*VariableT) any
	Set(*VariableT, any)
}

type EvalPrimopT

type EvalPrimopT interface {
	Evaluate(*CallNodeT, EnvT) (*CallNodeT, EnvT)
}

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) Evaluate

func (primop *IfPrimopT) Evaluate(call *CallNodeT, env EnvT) (*CallNodeT, EnvT)

func (*IfPrimopT) Name

func (primop *IfPrimopT) Name() string

func (*IfPrimopT) RegisterUsage

func (primop *IfPrimopT) RegisterUsage(call *CallNodeT) ([]*RegUseSpecT, []*RegUseSpecT)

func (*IfPrimopT) SideEffects

func (primop *IfPrimopT) SideEffects() bool

func (*IfPrimopT) Simplify

func (primop *IfPrimopT) Simplify(call *CallNodeT)

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 constant.Value
	// 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) 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) Flag

func (node *NodeBaseT) Flag() int

func (*NodeBaseT) Index

func (node *NodeBaseT) Index() int

func (*NodeBaseT) IsSimplified

func (node *NodeBaseT) IsSimplified() bool

func (*NodeBaseT) Parent

func (node *NodeBaseT) Parent() *CallNodeT

func (*NodeBaseT) SetFlag

func (node *NodeBaseT) SetFlag(flag int)

func (*NodeBaseT) SetIndex

func (node *NodeBaseT) SetIndex(index int)

func (*NodeBaseT) SetIsSimplified

func (node *NodeBaseT) SetIsSimplified(isSimplified bool)

func (*NodeBaseT) SetParent

func (node *NodeBaseT) SetParent(parent *CallNodeT)

func (*NodeBaseT) SetSource

func (node *NodeBaseT) SetSource(source token.Pos)

func (*NodeBaseT) Source

func (node *NodeBaseT) Source() token.Pos

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 CalledNode(node *CallNodeT) NodeT

func CopyNodeTree added in v0.1.1

func CopyNodeTree(rawNode NodeT) NodeT

func DetachInput

func DetachInput(node NodeT) NodeT

func Nodeify

func Nodeify(rawSpec any) NodeT

type NodeTypeT

type NodeTypeT int

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()

func (*PpCpsWriterT) Write

func (writer *PpCpsWriterT) Write(p []byte) (n int, err error)

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

func LookupPrimop(name string) PrimopT

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 QueueT

type QueueT[T any] struct {
	// contains filtered or unexported fields
}

func (*QueueT[T]) Dequeue

func (queue *QueueT[T]) Dequeue() T

func (*QueueT[T]) Empty

func (queue *QueueT[T]) Empty() bool

func (*QueueT[T]) Enqueue

func (queue *QueueT[T]) Enqueue(value T)

type ReferenceNodeT

type ReferenceNodeT struct {
	NodeBaseT
	Variable *VariableT
}

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 RegEnvT

type RegEnvT struct {
	// contains filtered or unexported fields
}

func (*RegEnvT) Get

func (env *RegEnvT) Get(vart *VariableT) any

func (*RegEnvT) Set

func (env *RegEnvT) Set(vart *VariableT, rawValue any)

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.

type VarEnvT

type VarEnvT struct {
	// contains filtered or unexported fields
}

func (*VarEnvT) Get

func (env *VarEnvT) Get(vart *VariableT) any

func (*VarEnvT) Set

func (env *VarEnvT) Set(vart *VariableT, value any)

type VariableT

type VariableT struct {
	Name   string
	Id     int
	Binder *CallNodeT
	Refs   []*ReferenceNodeT
	Flags  map[string]any
	Copy   *VariableT // used when copying node trees
	Type   types.Type
	Source token.Pos
	// contains filtered or unexported fields
}

func CopyVariable

func CopyVariable(vart *VariableT) *VariableT

func MakeCellVariable

func MakeCellVariable(name string, typ types.Type, source ...token.Pos) *VariableT

func MakeVariable

func MakeVariable(name string, typ types.Type, source ...token.Pos) *VariableT

func (*VariableT) HasFlag

func (vart *VariableT) HasFlag(flag string) bool

func (*VariableT) IsUnused

func (vart *VariableT) IsUnused() bool

func (*VariableT) IsUsed

func (vart *VariableT) IsUsed() bool

func (*VariableT) String added in v0.1.5

func (vart *VariableT) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL