mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-04 04:08:19 +00:00
From parts works with llvm
This commit is contained in:
parent
e697064ae3
commit
834015a758
1 changed files with 76 additions and 48 deletions
|
@ -54,6 +54,7 @@ use crate::llvm::{
|
|||
LLVM_SUB_WITH_OVERFLOW,
|
||||
},
|
||||
refcounting::PointerToRefcount,
|
||||
struct_::struct_from_fields,
|
||||
};
|
||||
|
||||
use super::{build::Env, convert::zig_dec_type};
|
||||
|
@ -1178,58 +1179,63 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
}
|
||||
NumF32ToParts => {
|
||||
arguments!(arg);
|
||||
let zig_result = call_bitcode_fn(env, &[arg], bitcode::NUM_F32_TO_PARTS);
|
||||
let zig_return_alloca = env
|
||||
.builder
|
||||
.new_build_alloca(zig_result.get_type(), "zig_return_alloca");
|
||||
env.builder.new_build_store(zig_return_alloca, zig_result);
|
||||
|
||||
let roc_return_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
.ptr_type(AddressSpace::default());
|
||||
|
||||
let roc_return_alloca = env.builder.new_build_pointer_cast(
|
||||
zig_return_alloca,
|
||||
roc_return_type,
|
||||
"cast_to_roc",
|
||||
);
|
||||
|
||||
load_roc_value(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
roc_return_alloca,
|
||||
"f64_to_parts_result",
|
||||
)
|
||||
let fn_name = bitcode::NUM_F32_TO_PARTS;
|
||||
call_bitcode_fn_and_cast_result(env, &[arg], fn_name, layout_interner, layout)
|
||||
}
|
||||
NumF64ToParts => {
|
||||
arguments!(arg);
|
||||
let zig_result = call_bitcode_fn(env, &[arg], bitcode::NUM_F64_TO_PARTS);
|
||||
let zig_return_alloca = env
|
||||
.builder
|
||||
.new_build_alloca(zig_result.get_type(), "zig_return_alloca");
|
||||
env.builder.new_build_store(zig_return_alloca, zig_result);
|
||||
|
||||
let roc_return_type =
|
||||
basic_type_from_layout(env, layout_interner, layout_interner.get_repr(layout))
|
||||
.ptr_type(AddressSpace::default());
|
||||
|
||||
let roc_return_alloca = env.builder.new_build_pointer_cast(
|
||||
zig_return_alloca,
|
||||
roc_return_type,
|
||||
"cast_to_roc",
|
||||
);
|
||||
|
||||
load_roc_value(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
roc_return_alloca,
|
||||
"f64_to_parts_result",
|
||||
)
|
||||
let fn_name = bitcode::NUM_F64_TO_PARTS;
|
||||
call_bitcode_fn_and_cast_result(env, &[arg], fn_name, layout_interner, layout)
|
||||
}
|
||||
NumF32FromParts => {
|
||||
arguments!(arg);
|
||||
let fn_name = bitcode::NUM_F32_FROM_PARTS;
|
||||
|
||||
let roc_call_alloca = env
|
||||
.builder
|
||||
.new_build_alloca(arg.get_type(), "roc_call_alloca");
|
||||
env.builder.new_build_store(roc_call_alloca, arg);
|
||||
|
||||
let fn_val = env.module.get_function(fn_name).unwrap();
|
||||
let zig_param_type = fn_val.get_params()[0].get_type();
|
||||
let zig_value =
|
||||
env.builder
|
||||
.new_build_load(zig_param_type, roc_call_alloca, "zig_value");
|
||||
|
||||
call_bitcode_fn(env, &[zig_value], fn_name)
|
||||
}
|
||||
NumF64FromParts => {
|
||||
arguments!(arg);
|
||||
let fn_name = bitcode::NUM_F64_FROM_PARTS;
|
||||
|
||||
let roc_call_alloca = env
|
||||
.builder
|
||||
.new_build_alloca(arg.get_type(), "roc_call_alloca");
|
||||
env.builder.new_build_store(roc_call_alloca, arg);
|
||||
|
||||
let fn_val = env.module.get_function(fn_name).unwrap();
|
||||
|
||||
let zig_params_types: Vec<_> =
|
||||
fn_val.get_params().iter().map(|p| p.get_type()).collect();
|
||||
|
||||
let zig_record_type = env.context.struct_type(&zig_params_types, false);
|
||||
let zig_recode_value = env
|
||||
.builder
|
||||
.new_build_load(zig_record_type, roc_call_alloca, "zig_value")
|
||||
.into_struct_value();
|
||||
|
||||
let zig_value_0 = env
|
||||
.builder
|
||||
.build_extract_value(zig_recode_value, 0, "zig_value_0")
|
||||
.unwrap();
|
||||
|
||||
let zig_value_1 = env
|
||||
.builder
|
||||
.build_extract_value(zig_recode_value, 1, "zig_value_1")
|
||||
.unwrap();
|
||||
|
||||
call_bitcode_fn(env, &[zig_value_0, zig_value_1], fn_name)
|
||||
}
|
||||
NumF32FromParts => todo!("NumF32FromParts"),
|
||||
NumF64FromParts => todo!("NumF64FromParts"),
|
||||
Eq => {
|
||||
arguments_with_layouts!((lhs_arg, lhs_layout), (rhs_arg, rhs_layout));
|
||||
|
||||
|
@ -1400,6 +1406,28 @@ pub(crate) fn run_low_level<'a, 'ctx>(
|
|||
}
|
||||
}
|
||||
|
||||
fn call_bitcode_fn_and_cast_result<'ctx>(
|
||||
env: &Env<'_, 'ctx, '_>,
|
||||
args: &[BasicValueEnum<'ctx>],
|
||||
fn_name: &str,
|
||||
layout_interner: &STLayoutInterner<'_>,
|
||||
layout: InLayout<'_>,
|
||||
) -> BasicValueEnum<'ctx> {
|
||||
let zig_result = call_bitcode_fn(env, args, fn_name);
|
||||
let zig_return_alloca = env
|
||||
.builder
|
||||
.new_build_alloca(zig_result.get_type(), "zig_return_alloca");
|
||||
env.builder.new_build_store(zig_return_alloca, zig_result);
|
||||
|
||||
load_roc_value(
|
||||
env,
|
||||
layout_interner,
|
||||
layout_interner.get_repr(layout),
|
||||
zig_return_alloca,
|
||||
"f64_to_parts_result",
|
||||
)
|
||||
}
|
||||
|
||||
fn intwidth_from_layout(layout: InLayout) -> IntWidth {
|
||||
layout.to_int_width()
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue