mirror of
https://github.com/roc-lang/roc.git
synced 2024-09-21 15:59:20 +03:00
Added support for unsigned gt/lt to wasm.
Breaks some other tests, pushing now for sharing
This commit is contained in:
parent
47f5b89b26
commit
c7459e9888
@ -180,6 +180,16 @@ impl<'a> LowLevelCall<'a> {
|
|||||||
use CodeGenNumType::*;
|
use CodeGenNumType::*;
|
||||||
use LowLevel::*;
|
use LowLevel::*;
|
||||||
|
|
||||||
|
fn integer_symbol_is_signed(backend: &WasmBackend<'_>, symbol: Symbol) -> bool {
|
||||||
|
return match backend.storage.symbol_layouts[&symbol] {
|
||||||
|
Layout::Builtin(Builtin::Int(int_width)) => match int_width {
|
||||||
|
IntWidth::U8 | IntWidth::U16 | IntWidth::U32 | IntWidth::U64 | IntWidth::U128 => false,
|
||||||
|
IntWidth::I8 | IntWidth::I16 | IntWidth::I32 | IntWidth::I64 | IntWidth::I128 => true,
|
||||||
|
},
|
||||||
|
_ => internal_error!("Expected integer, found {:?}", symbol),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
let panic_ret_type = || {
|
let panic_ret_type = || {
|
||||||
internal_error!(
|
internal_error!(
|
||||||
"Invalid return layout for {:?}: {:?}",
|
"Invalid return layout for {:?}: {:?}",
|
||||||
@ -377,8 +387,16 @@ impl<'a> LowLevelCall<'a> {
|
|||||||
NumGt => {
|
NumGt => {
|
||||||
self.load_args(backend);
|
self.load_args(backend);
|
||||||
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
||||||
I32 => backend.code_builder.i32_gt_s(),
|
I32 => if integer_symbol_is_signed(backend, self.arguments[0]) {
|
||||||
I64 => backend.code_builder.i64_gt_s(),
|
backend.code_builder.i32_gt_s()
|
||||||
|
} else {
|
||||||
|
backend.code_builder.i32_gt_u()
|
||||||
|
}
|
||||||
|
I64 => if integer_symbol_is_signed(backend, self.arguments[0]) {
|
||||||
|
backend.code_builder.i64_gt_s()
|
||||||
|
} else {
|
||||||
|
backend.code_builder.i64_gt_u()
|
||||||
|
}
|
||||||
F32 => backend.code_builder.f32_gt(),
|
F32 => backend.code_builder.f32_gt(),
|
||||||
F64 => backend.code_builder.f64_gt(),
|
F64 => backend.code_builder.f64_gt(),
|
||||||
x => todo!("{:?} for {:?}", self.lowlevel, x),
|
x => todo!("{:?} for {:?}", self.lowlevel, x),
|
||||||
@ -387,8 +405,16 @@ impl<'a> LowLevelCall<'a> {
|
|||||||
NumGte => {
|
NumGte => {
|
||||||
self.load_args(backend);
|
self.load_args(backend);
|
||||||
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
||||||
I32 => backend.code_builder.i32_ge_s(),
|
I32 => if integer_symbol_is_signed(backend, self.arguments[0]) {
|
||||||
I64 => backend.code_builder.i64_ge_s(),
|
backend.code_builder.i32_ge_s()
|
||||||
|
} else {
|
||||||
|
backend.code_builder.i32_ge_u()
|
||||||
|
}
|
||||||
|
I64 => if integer_symbol_is_signed(backend, self.arguments[0]) {
|
||||||
|
backend.code_builder.i64_ge_s()
|
||||||
|
} else {
|
||||||
|
backend.code_builder.i64_ge_u()
|
||||||
|
}
|
||||||
F32 => backend.code_builder.f32_ge(),
|
F32 => backend.code_builder.f32_ge(),
|
||||||
F64 => backend.code_builder.f64_ge(),
|
F64 => backend.code_builder.f64_ge(),
|
||||||
x => todo!("{:?} for {:?}", self.lowlevel, x),
|
x => todo!("{:?} for {:?}", self.lowlevel, x),
|
||||||
@ -397,8 +423,16 @@ impl<'a> LowLevelCall<'a> {
|
|||||||
NumLt => {
|
NumLt => {
|
||||||
self.load_args(backend);
|
self.load_args(backend);
|
||||||
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
||||||
I32 => backend.code_builder.i32_lt_s(),
|
I32 => if integer_symbol_is_signed(backend, self.arguments[0]) {
|
||||||
I64 => backend.code_builder.i64_lt_s(),
|
backend.code_builder.i32_lt_s()
|
||||||
|
} else {
|
||||||
|
backend.code_builder.i32_lt_u()
|
||||||
|
}
|
||||||
|
I64 => if integer_symbol_is_signed(backend, self.arguments[0]) {
|
||||||
|
backend.code_builder.i64_lt_s()
|
||||||
|
} else {
|
||||||
|
backend.code_builder.i64_lt_u()
|
||||||
|
}
|
||||||
F32 => backend.code_builder.f32_lt(),
|
F32 => backend.code_builder.f32_lt(),
|
||||||
F64 => backend.code_builder.f64_lt(),
|
F64 => backend.code_builder.f64_lt(),
|
||||||
x => todo!("{:?} for {:?}", self.lowlevel, x),
|
x => todo!("{:?} for {:?}", self.lowlevel, x),
|
||||||
@ -407,8 +441,16 @@ impl<'a> LowLevelCall<'a> {
|
|||||||
NumLte => {
|
NumLte => {
|
||||||
self.load_args(backend);
|
self.load_args(backend);
|
||||||
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
match CodeGenNumType::for_symbol(backend, self.arguments[0]) {
|
||||||
I32 => backend.code_builder.i32_le_s(),
|
I32 => if integer_symbol_is_signed(backend, self.arguments[0]) {
|
||||||
I64 => backend.code_builder.i64_le_s(),
|
backend.code_builder.i32_le_s()
|
||||||
|
} else {
|
||||||
|
backend.code_builder.i32_le_u()
|
||||||
|
}
|
||||||
|
I64 => if integer_symbol_is_signed(backend, self.arguments[0]) {
|
||||||
|
backend.code_builder.i64_le_s()
|
||||||
|
} else {
|
||||||
|
backend.code_builder.i64_le_u()
|
||||||
|
}
|
||||||
F32 => backend.code_builder.f32_le(),
|
F32 => backend.code_builder.f32_le(),
|
||||||
F64 => backend.code_builder.f64_le(),
|
F64 => backend.code_builder.f64_le(),
|
||||||
x => todo!("{:?} for {:?}", self.lowlevel, x),
|
x => todo!("{:?} for {:?}", self.lowlevel, x),
|
||||||
|
Loading…
Reference in New Issue
Block a user