use crate::Result;
use crate::operand_stack::OperandStack;
use cranelift::frontend::FunctionBuilder;
use cranelift::prelude::{InstBuilder, types};
pub(crate) fn i2l(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_int(function_builder)?;
let value = function_builder.ins().sextend(types::I64, value);
stack.push_long(function_builder, value)?;
Ok(())
}
pub(crate) fn i2f(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_int(function_builder)?;
let value = function_builder.ins().fcvt_from_sint(types::F32, value);
stack.push_float(function_builder, value)?;
Ok(())
}
pub(crate) fn i2d(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_int(function_builder)?;
let value = function_builder.ins().fcvt_from_sint(types::F64, value);
stack.push_double(function_builder, value)?;
Ok(())
}
pub(crate) fn l2i(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_long(function_builder)?;
let value = function_builder.ins().ireduce(types::I32, value);
stack.push_int(function_builder, value)?;
Ok(())
}
pub(crate) fn l2f(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_long(function_builder)?;
let value = function_builder.ins().fcvt_from_sint(types::F32, value);
stack.push_float(function_builder, value)?;
Ok(())
}
pub(crate) fn l2d(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_long(function_builder)?;
let value = function_builder.ins().fcvt_from_sint(types::F64, value);
stack.push_double(function_builder, value)?;
Ok(())
}
pub(crate) fn f2i(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_float(function_builder)?;
let value = function_builder.ins().fcvt_to_sint(types::I32, value);
stack.push_int(function_builder, value)?;
Ok(())
}
pub(crate) fn f2l(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_float(function_builder)?;
let value = function_builder.ins().fcvt_to_sint(types::I64, value);
stack.push_long(function_builder, value)?;
Ok(())
}
pub(crate) fn f2d(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_float(function_builder)?;
let value = function_builder.ins().fpromote(types::F64, value);
stack.push_double(function_builder, value)?;
Ok(())
}
pub(crate) fn d2i(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_double(function_builder)?;
let value = function_builder.ins().fcvt_to_sint(types::I32, value);
stack.push_int(function_builder, value)?;
Ok(())
}
pub(crate) fn d2l(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_double(function_builder)?;
let value = function_builder.ins().fcvt_to_sint(types::I64, value);
stack.push_long(function_builder, value)?;
Ok(())
}
pub(crate) fn d2f(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_double(function_builder)?;
let value = function_builder.ins().fdemote(types::F32, value);
stack.push_float(function_builder, value)?;
Ok(())
}
pub(crate) fn i2b(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_int(function_builder)?;
let value = function_builder.ins().ireduce(types::I8, value);
let value = function_builder.ins().sextend(types::I32, value);
stack.push_int(function_builder, value)?;
Ok(())
}
pub(crate) fn i2c(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_int(function_builder)?;
let value = function_builder.ins().ireduce(types::I16, value);
let value = function_builder.ins().uextend(types::I32, value);
stack.push_int(function_builder, value)?;
Ok(())
}
pub(crate) fn i2s(function_builder: &mut FunctionBuilder, stack: &mut OperandStack) -> Result<()> {
let value = stack.pop_int(function_builder)?;
let value = function_builder.ins().ireduce(types::I16, value);
let value = function_builder.ins().sextend(types::I32, value);
stack.push_int(function_builder, value)?;
Ok(())
}