From d42d1be8a5592ed2c7827b448c385125f1dd4706 Mon Sep 17 00:00:00 2001 From: Alon Krymgand Date: Fri, 13 Dec 2024 14:01:47 +0200 Subject: [PATCH] Added `jump` instruction --- usm64/isa/jump.go | 49 ++++++++++++++++++++++++++++++++++ usm64/managers/instructions.go | 5 ++-- 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 usm64/isa/jump.go diff --git a/usm64/isa/jump.go b/usm64/isa/jump.go new file mode 100644 index 0000000..8352f1c --- /dev/null +++ b/usm64/isa/jump.go @@ -0,0 +1,49 @@ +package usm64isa + +import ( + "alon.kr/x/list" + "alon.kr/x/usm/core" + "alon.kr/x/usm/gen" + usm64core "alon.kr/x/usm/usm64/core" +) + +type JumpInstruction struct { + JumpToInstructionIndex uint64 +} + +func (i *JumpInstruction) Emulate( + ctx *usm64core.EmulationContext, +) usm64core.EmulationError { + ctx.NextInstructionIndex = i.JumpToInstructionIndex + return nil +} + +func NewJumpInstruction( + targets []usm64core.Register, + argument []usm64core.Argument, +) (usm64core.Instruction, core.ResultList) { + + label, ok := argument[0].(usm64core.Label) + if !ok { + v := argument[0].Declaration() + return nil, list.FromSingle(core.Result{ + { + Type: core.ErrorResult, + Message: "Expected label argument", + Location: &v, + }, + }) + } + + return &JumpInstruction{ + JumpToInstructionIndex: label.InstructionIndex, + }, core.ResultList{} +} + +func NewJumpInstructionDefinition() gen.InstructionDefinition[usm64core.Instruction] { + return &FixedInstructionDefinition{ + Targets: 0, + Arguments: 1, + Creator: NewJumpInstruction, + } +} diff --git a/usm64/managers/instructions.go b/usm64/managers/instructions.go index ae93a23..076d63c 100644 --- a/usm64/managers/instructions.go +++ b/usm64/managers/instructions.go @@ -30,8 +30,9 @@ func (m *InstructionMap) GetInstructionDefinition( func NewInstructionManager() gen.InstructionManager[usm64core.Instruction] { return gen.InstructionManager[usm64core.Instruction]( &InstructionMap{ - "add": usm64isa.NewAddInstructionDefinition(), - "put": usm64isa.NewPutInstructionDefinition(), + "add": usm64isa.NewAddInstructionDefinition(), + "put": usm64isa.NewPutInstructionDefinition(), + "jump": usm64isa.NewJumpInstructionDefinition(), }, ) }