Do not inline builtin wrapper for Str.toNum

This commit is contained in:
Brian Carroll 2021-12-29 21:08:16 +00:00
parent 2cfd49f941
commit f90d9a74bd
2 changed files with 28 additions and 29 deletions

View file

@ -49,22 +49,21 @@ pub fn dispatch_low_level<'a>(
} }
StrCountGraphemes => return BuiltinCall(bitcode::STR_COUNT_GRAPEHEME_CLUSTERS), StrCountGraphemes => return BuiltinCall(bitcode::STR_COUNT_GRAPEHEME_CLUSTERS),
StrToNum => { StrToNum => {
if let Layout::Union(UnionLayout::NonRecursive(union_layout)) = mono_layout { let number_layout = match mono_layout {
// match on the return layout to figure out which zig builtin we need Layout::Union(UnionLayout::NonRecursive(tags)) => tags[1][0],
let intrinsic = match union_layout[1][0] { Layout::Struct(fields) => fields[0], // TODO: why is it sometimes a struct?
Layout::Builtin(Builtin::Int(int_width)) => &bitcode::STR_TO_INT[int_width], _ => internal_error!("Unexpected mono layout {:?} for StrToNum", mono_layout),
Layout::Builtin(Builtin::Float(float_width)) => { };
&bitcode::STR_TO_FLOAT[float_width] // match on the return layout to figure out which zig builtin we need
} let intrinsic = match number_layout {
Layout::Builtin(Builtin::Decimal) => bitcode::DEC_FROM_STR, Layout::Builtin(Builtin::Int(int_width)) => &bitcode::STR_TO_INT[int_width],
rest => internal_error!("Unexpected builtin {:?} for StrToNum", rest), Layout::Builtin(Builtin::Float(float_width)) => &bitcode::STR_TO_FLOAT[float_width],
}; Layout::Builtin(Builtin::Decimal) => bitcode::DEC_FROM_STR,
rest => internal_error!("Unexpected builtin {:?} for StrToNum", rest),
};
return BuiltinCall(intrinsic); return BuiltinCall(intrinsic);
} else { }
internal_error!("Unexpected mono layout {:?} for StrToNum", mono_layout);
}
} // choose builtin based on storage size
StrFromInt => { StrFromInt => {
// This does not get exposed in user space. We switched to NumToStr instead. // This does not get exposed in user space. We switched to NumToStr instead.
// We can probably just leave this as NotImplemented. We may want remove this LowLevel. // We can probably just leave this as NotImplemented. We may want remove this LowLevel.

View file

@ -198,20 +198,20 @@ impl LowLevel {
Symbol::STR_TRIM => Some(StrTrim), Symbol::STR_TRIM => Some(StrTrim),
Symbol::STR_TRIM_LEFT => Some(StrTrimLeft), Symbol::STR_TRIM_LEFT => Some(StrTrimLeft),
Symbol::STR_TRIM_RIGHT => Some(StrTrimRight), Symbol::STR_TRIM_RIGHT => Some(StrTrimRight),
Symbol::STR_TO_DEC => Some(StrToNum), Symbol::STR_TO_DEC => None,
Symbol::STR_TO_F64 => Some(StrToNum), Symbol::STR_TO_F64 => None,
Symbol::STR_TO_F32 => Some(StrToNum), Symbol::STR_TO_F32 => None,
Symbol::STR_TO_NAT => Some(StrToNum), Symbol::STR_TO_NAT => None,
Symbol::STR_TO_U128 => Some(StrToNum), Symbol::STR_TO_U128 => None,
Symbol::STR_TO_I128 => Some(StrToNum), Symbol::STR_TO_I128 => None,
Symbol::STR_TO_U64 => Some(StrToNum), Symbol::STR_TO_U64 => None,
Symbol::STR_TO_I64 => Some(StrToNum), Symbol::STR_TO_I64 => None,
Symbol::STR_TO_U32 => Some(StrToNum), Symbol::STR_TO_U32 => None,
Symbol::STR_TO_I32 => Some(StrToNum), Symbol::STR_TO_I32 => None,
Symbol::STR_TO_U16 => Some(StrToNum), Symbol::STR_TO_U16 => None,
Symbol::STR_TO_I16 => Some(StrToNum), Symbol::STR_TO_I16 => None,
Symbol::STR_TO_U8 => Some(StrToNum), Symbol::STR_TO_U8 => None,
Symbol::STR_TO_I8 => Some(StrToNum), Symbol::STR_TO_I8 => None,
Symbol::LIST_LEN => Some(ListLen), Symbol::LIST_LEN => Some(ListLen),
Symbol::LIST_GET => None, Symbol::LIST_GET => None,
Symbol::LIST_SET => None, Symbol::LIST_SET => None,