mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
Update wasm implementation
This commit is contained in:
parent
4029748bdf
commit
134a7bf787
2 changed files with 29 additions and 34 deletions
|
@ -92,8 +92,8 @@ pub fn exportAtan(comptime T: type, comptime name: []const u8) void {
|
||||||
|
|
||||||
pub fn exportRound(comptime T: type, comptime name: []const u8) void {
|
pub fn exportRound(comptime T: type, comptime name: []const u8) void {
|
||||||
comptime var f = struct {
|
comptime var f = struct {
|
||||||
fn func(input: T) callconv(.C) i64 {
|
fn func(input: T) callconv(.C) T {
|
||||||
return @floatToInt(i64, (@round(input)));
|
return @round(input);
|
||||||
}
|
}
|
||||||
}.func;
|
}.func;
|
||||||
@export(f, .{ .name = name ++ @typeName(T), .linkage = .Strong });
|
@export(f, .{ .name = name ++ @typeName(T), .linkage = .Strong });
|
||||||
|
|
|
@ -503,18 +503,6 @@ impl<'a> LowLevelCall<'a> {
|
||||||
NumCos => todo!("{:?}", self.lowlevel),
|
NumCos => todo!("{:?}", self.lowlevel),
|
||||||
NumSqrtUnchecked => todo!("{:?}", self.lowlevel),
|
NumSqrtUnchecked => todo!("{:?}", self.lowlevel),
|
||||||
NumLogUnchecked => todo!("{:?}", self.lowlevel),
|
NumLogUnchecked => todo!("{:?}", self.lowlevel),
|
||||||
NumRound => {
|
|
||||||
self.load_args(backend);
|
|
||||||
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
|
||||||
F32 => {
|
|
||||||
self.load_args_and_call_zig(backend, &bitcode::NUM_ROUND[FloatWidth::F32])
|
|
||||||
}
|
|
||||||
F64 => {
|
|
||||||
self.load_args_and_call_zig(backend, &bitcode::NUM_ROUND[FloatWidth::F64])
|
|
||||||
}
|
|
||||||
_ => todo!("{:?} for {:?}", self.lowlevel, self.ret_layout),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NumToFloat => {
|
NumToFloat => {
|
||||||
self.load_args(backend);
|
self.load_args(backend);
|
||||||
let ret_type = CodeGenNumType::from(self.ret_layout);
|
let ret_type = CodeGenNumType::from(self.ret_layout);
|
||||||
|
@ -534,35 +522,42 @@ impl<'a> LowLevelCall<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NumPow => todo!("{:?}", self.lowlevel),
|
NumPow => todo!("{:?}", self.lowlevel),
|
||||||
NumCeiling => {
|
NumCeiling | NumFloor | NumRound => {
|
||||||
self.load_args(backend);
|
self.load_args(backend);
|
||||||
match CodeGenNumType::from(self.ret_layout) {
|
let arg_type = CodeGenNumType::for_symbol(backend, self.arguments[0]);
|
||||||
I32 => {
|
let ret_type = CodeGenNumType::from(self.ret_layout);
|
||||||
|
match (arg_type, self.lowlevel) {
|
||||||
|
(F32, NumCeiling) => {
|
||||||
backend.code_builder.f32_ceil();
|
backend.code_builder.f32_ceil();
|
||||||
backend.code_builder.i32_trunc_s_f32()
|
|
||||||
}
|
}
|
||||||
I64 => {
|
(F64, NumCeiling) => {
|
||||||
backend.code_builder.f64_ceil();
|
backend.code_builder.f64_ceil();
|
||||||
backend.code_builder.i64_trunc_s_f64()
|
|
||||||
}
|
}
|
||||||
|
(F32, NumFloor) => {
|
||||||
|
backend.code_builder.f32_floor();
|
||||||
|
}
|
||||||
|
(F64, NumFloor) => {
|
||||||
|
backend.code_builder.f64_floor();
|
||||||
|
}
|
||||||
|
(F32, NumRound) => {
|
||||||
|
self.load_args_and_call_zig(backend, &bitcode::NUM_ROUND[FloatWidth::F32])
|
||||||
|
}
|
||||||
|
(F64, NumRound) => {
|
||||||
|
self.load_args_and_call_zig(backend, &bitcode::NUM_ROUND[FloatWidth::F64])
|
||||||
|
}
|
||||||
|
_ => internal_error!("Invalid argument type for ceiling: {:?}", arg_type),
|
||||||
|
}
|
||||||
|
match (ret_type, arg_type) {
|
||||||
|
// TODO: signed truncation
|
||||||
|
(I32, F32) => backend.code_builder.i32_trunc_s_f32(),
|
||||||
|
(I32, F64) => backend.code_builder.i32_trunc_s_f64(),
|
||||||
|
(I64, F32) => backend.code_builder.i64_trunc_s_f32(),
|
||||||
|
(I64, F64) => backend.code_builder.i64_trunc_s_f64(),
|
||||||
|
(I128, _) => todo!("{:?} for I128", self.lowlevel),
|
||||||
_ => panic_ret_type(),
|
_ => panic_ret_type(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NumPowInt => todo!("{:?}", self.lowlevel),
|
NumPowInt => todo!("{:?}", self.lowlevel),
|
||||||
NumFloor => {
|
|
||||||
self.load_args(backend);
|
|
||||||
match CodeGenNumType::from(self.ret_layout) {
|
|
||||||
I32 => {
|
|
||||||
backend.code_builder.f32_floor();
|
|
||||||
backend.code_builder.i32_trunc_s_f32()
|
|
||||||
}
|
|
||||||
I64 => {
|
|
||||||
backend.code_builder.f64_floor();
|
|
||||||
backend.code_builder.i64_trunc_s_f64()
|
|
||||||
}
|
|
||||||
_ => panic_ret_type(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NumIsFinite => num_is_finite(backend, self.arguments[0]),
|
NumIsFinite => num_is_finite(backend, self.arguments[0]),
|
||||||
|
|
||||||
NumAtan => match self.ret_layout {
|
NumAtan => match self.ret_layout {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue