deimos-lang/src/vm/instruction.rs

149 lines
2.9 KiB
Rust

use crate::vm::constant::DvmConstant;
use crate::vm::source_code_location::SourceCodeLocation;
use std::rc::Rc;
#[derive(Debug, Clone)]
pub enum Instruction {
MoveImmediate {
destination_register: usize,
immediate: Immediate,
},
Copy {
source: Location,
destination: Location,
},
Push {
source_register: usize,
},
Pop {
destination_register: Option<usize>,
},
AllocateObject {
implementation_name: Rc<String>,
destination_register: usize,
},
InvokeStatic {
function_name: Rc<String>,
source_code_location: SourceCodeLocation,
},
InvokeObject {
object_register: usize,
function_name: Rc<String>,
source_code_location: SourceCodeLocation,
},
InvokeStaticPlatform {
function_name: Rc<String>,
source_code_location: SourceCodeLocation,
},
InvokeObjectPlatform {
object_register: usize,
function_name: Rc<String>,
source_code_location: SourceCodeLocation,
},
SetReturnValue {
source_register: usize,
},
TakeReturnValue {
destination_register: usize,
},
Add {
left: u8,
right: u8,
destination: u8,
},
Subtract {
left: u8,
right: u8,
destination: u8,
},
Multiply {
left: u8,
right: u8,
destination: u8,
},
Divide {
left: u8,
right: u8,
destination: u8,
},
Modulo {
left: u8,
right: u8,
destination: u8,
},
Power {
left: u8,
right: u8,
destination: u8,
},
Jump {
offset: isize,
},
JumpEqual {
left_register: usize,
right_register: usize,
offset: isize,
},
JumpNotEqual {
left_register: usize,
right_register: usize,
offset: isize,
},
JumpLessThan {
left_register: usize,
right_register: usize,
offset: isize,
},
JumpGreaterThan {
left_register: usize,
right_register: usize,
offset: isize,
},
JumpLessThanEqual {
left_register: usize,
right_register: usize,
offset: isize,
},
JumpGreaterThanEqual {
left_register: usize,
right_register: usize,
offset: isize,
},
Return,
DumpState {
message: String,
},
}
#[derive(Debug, Clone)]
pub enum Immediate {
Byte(u8),
Int(i32),
Long(i64),
Double(f64),
Usize(usize),
Boolean(bool),
Constant(DvmConstant),
Empty,
}
#[derive(Debug, Clone)]
pub enum Location {
Register(usize),
StackFrameBase {
offset: isize,
},
StackTop {
offset: isize,
},
Field {
object_register: usize,
field_name: Rc<String>,
},
Array {
array_register: usize,
index_register: usize,
offset: isize,
},
}