We have observed that the ABI implementations for AArch64 and x64 are very similar; in fact, x64's implementation started as a modified copy of AArch64's implementation. This is an artifact of both a similar ABI (both machines pass args and return values in registers first, then the stack, and both machines give considerable freedom with stack-frame layout) and a too-low-level ABI abstraction in the existing design. For machines that fit the mainstream or most common ABI-design idioms, we should be able to do much better. This commit factors AArch64 into machine-specific and machine-independent parts, but does not yet modify x64; that will come next. This should be completely neutral with respect to compile time and generated code performance.
19 lines
555 B
Rust
19 lines
555 B
Rust
//! Miscellaneous helpers for machine backends.
|
|
|
|
use crate::ir::Type;
|
|
|
|
/// Returns the size (in bits) of a given type.
|
|
pub fn ty_bits(ty: Type) -> usize {
|
|
usize::from(ty.bits())
|
|
}
|
|
|
|
/// Is the type represented by an integer (not float) at the machine level?
|
|
pub(crate) fn ty_has_int_representation(ty: Type) -> bool {
|
|
ty.is_int() || ty.is_bool() || ty.is_ref()
|
|
}
|
|
|
|
/// Is the type represented by a float or vector value at the machine level?
|
|
pub(crate) fn ty_has_float_or_vec_representation(ty: Type) -> bool {
|
|
ty.is_vector() || ty.is_float()
|
|
}
|