Refactor for faster Rust compile times

This commit is contained in:
Brian Carroll 2022-04-30 17:39:19 +01:00 committed by Jared Cone
parent c7459e9888
commit 07b3c74713
No known key found for this signature in database
GPG key ID: 99D4217479603EA1

View file

@ -116,6 +116,13 @@ impl From<&StoredValue> for CodeGenNumType {
} }
} }
fn integer_symbol_is_signed(backend: &WasmBackend<'_>, symbol: Symbol) -> bool {
return match backend.storage.symbol_layouts[&symbol] {
Layout::Builtin(Builtin::Int(int_width)) => int_width.is_signed(),
x => internal_error!("Expected integer, found {:?}", x),
};
}
pub struct LowLevelCall<'a> { pub struct LowLevelCall<'a> {
pub lowlevel: LowLevel, pub lowlevel: LowLevel,
pub arguments: &'a [Symbol], pub arguments: &'a [Symbol],
@ -180,16 +187,6 @@ 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 {:?}: {:?}",
@ -387,16 +384,20 @@ 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 => if integer_symbol_is_signed(backend, self.arguments[0]) { I32 => {
if integer_symbol_is_signed(backend, self.arguments[0]) {
backend.code_builder.i32_gt_s() backend.code_builder.i32_gt_s()
} else { } else {
backend.code_builder.i32_gt_u() backend.code_builder.i32_gt_u()
} }
I64 => if integer_symbol_is_signed(backend, self.arguments[0]) { }
I64 => {
if integer_symbol_is_signed(backend, self.arguments[0]) {
backend.code_builder.i64_gt_s() backend.code_builder.i64_gt_s()
} else { } else {
backend.code_builder.i64_gt_u() 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),
@ -405,16 +406,20 @@ 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 => if integer_symbol_is_signed(backend, self.arguments[0]) { I32 => {
if integer_symbol_is_signed(backend, self.arguments[0]) {
backend.code_builder.i32_ge_s() backend.code_builder.i32_ge_s()
} else { } else {
backend.code_builder.i32_ge_u() backend.code_builder.i32_ge_u()
} }
I64 => if integer_symbol_is_signed(backend, self.arguments[0]) { }
I64 => {
if integer_symbol_is_signed(backend, self.arguments[0]) {
backend.code_builder.i64_ge_s() backend.code_builder.i64_ge_s()
} else { } else {
backend.code_builder.i64_ge_u() 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),
@ -423,16 +428,20 @@ 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 => if integer_symbol_is_signed(backend, self.arguments[0]) { I32 => {
if integer_symbol_is_signed(backend, self.arguments[0]) {
backend.code_builder.i32_lt_s() backend.code_builder.i32_lt_s()
} else { } else {
backend.code_builder.i32_lt_u() backend.code_builder.i32_lt_u()
} }
I64 => if integer_symbol_is_signed(backend, self.arguments[0]) { }
I64 => {
if integer_symbol_is_signed(backend, self.arguments[0]) {
backend.code_builder.i64_lt_s() backend.code_builder.i64_lt_s()
} else { } else {
backend.code_builder.i64_lt_u() 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),
@ -441,16 +450,20 @@ 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 => if integer_symbol_is_signed(backend, self.arguments[0]) { I32 => {
if integer_symbol_is_signed(backend, self.arguments[0]) {
backend.code_builder.i32_le_s() backend.code_builder.i32_le_s()
} else { } else {
backend.code_builder.i32_le_u() backend.code_builder.i32_le_u()
} }
I64 => if integer_symbol_is_signed(backend, self.arguments[0]) { }
I64 => {
if integer_symbol_is_signed(backend, self.arguments[0]) {
backend.code_builder.i64_le_s() backend.code_builder.i64_le_s()
} else { } else {
backend.code_builder.i64_le_u() 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),