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),
StrToNum => {
if let Layout::Union(UnionLayout::NonRecursive(union_layout)) = mono_layout {
// match on the return layout to figure out which zig builtin we need
let intrinsic = match union_layout[1][0] {
Layout::Builtin(Builtin::Int(int_width)) => &bitcode::STR_TO_INT[int_width],
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),
};
let number_layout = match mono_layout {
Layout::Union(UnionLayout::NonRecursive(tags)) => tags[1][0],
Layout::Struct(fields) => fields[0], // TODO: why is it sometimes a struct?
_ => internal_error!("Unexpected mono layout {:?} for StrToNum", mono_layout),
};
// match on the return layout to figure out which zig builtin we need
let intrinsic = match number_layout {
Layout::Builtin(Builtin::Int(int_width)) => &bitcode::STR_TO_INT[int_width],
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);
} else {
internal_error!("Unexpected mono layout {:?} for StrToNum", mono_layout);
}
} // choose builtin based on storage size
return BuiltinCall(intrinsic);
}
StrFromInt => {
// 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.

View File

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