use crate::local_variables::LocalVariables;
use crate::operand_stack::OperandStack;
use crate::{Result, jit_value};
use cranelift::codegen::ir::Value;
use cranelift::prelude::{FunctionBuilder, InstBuilder, MemFlags, types};
pub(crate) fn aconst_null(
function_builder: &mut FunctionBuilder,
stack: &mut OperandStack,
) -> Result<()> {
let null = function_builder.ins().iconst(types::I64, 0);
stack.push_object(function_builder, null)?;
Ok(())
}
pub(crate) fn aload_ref(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
index: u8,
) -> Result<()> {
let index = usize::from(index);
let value = locals.get_object(function_builder, index)?;
stack.push_object(function_builder, value)?;
Ok(())
}
pub(crate) fn aload_ref_w(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
index: u16,
) -> Result<()> {
let index = usize::from(index);
let value = locals.get_object(function_builder, index)?;
stack.push_object(function_builder, value)?;
Ok(())
}
pub(crate) fn aload_ref_0(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
) -> Result<()> {
let value = locals.get_object(function_builder, 0)?;
stack.push_object(function_builder, value)?;
Ok(())
}
pub(crate) fn aload_ref_1(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
) -> Result<()> {
let value = locals.get_object(function_builder, 1)?;
stack.push_object(function_builder, value)?;
Ok(())
}
pub(crate) fn aload_ref_2(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
) -> Result<()> {
let value = locals.get_object(function_builder, 2)?;
stack.push_object(function_builder, value)?;
Ok(())
}
pub(crate) fn aload_ref_3(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
) -> Result<()> {
let value = locals.get_object(function_builder, 3)?;
stack.push_object(function_builder, value)?;
Ok(())
}
pub(crate) fn astore_ref(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
index: u8,
) -> Result<()> {
let index = usize::from(index);
let value = stack.pop_object(function_builder)?;
locals.set_object(function_builder, index, value)?;
Ok(())
}
pub(crate) fn astore_ref_w(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
index: u16,
) -> Result<()> {
let index = usize::from(index);
let value = stack.pop_object(function_builder)?;
locals.set_object(function_builder, index, value)?;
Ok(())
}
pub(crate) fn astore_ref_0(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
) -> Result<()> {
let value = stack.pop_object(function_builder)?;
locals.set_object(function_builder, 0, value)?;
Ok(())
}
pub(crate) fn astore_ref_1(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
) -> Result<()> {
let value = stack.pop_object(function_builder)?;
locals.set_object(function_builder, 1, value)?;
Ok(())
}
pub(crate) fn astore_ref_2(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
) -> Result<()> {
let value = stack.pop_object(function_builder)?;
locals.set_object(function_builder, 2, value)?;
Ok(())
}
pub(crate) fn astore_ref_3(
function_builder: &mut FunctionBuilder,
locals: &mut LocalVariables,
stack: &mut OperandStack,
) -> Result<()> {
let value = stack.pop_object(function_builder)?;
locals.set_object(function_builder, 3, value)?;
Ok(())
}
pub(crate) fn areturn(
function_builder: &mut FunctionBuilder,
stack: &mut OperandStack,
return_pointer: Value,
) -> Result<()> {
let value = stack.pop_object(function_builder)?;
let discriminant = i64::from(jit_value::PTR);
let discriminant = function_builder.ins().iconst(types::I8, discriminant);
function_builder
.ins()
.store(MemFlags::new(), discriminant, return_pointer, 0);
function_builder
.ins()
.store(MemFlags::new(), value, return_pointer, 8);
function_builder.ins().return_(&[]);
Ok(())
}