use crate::enums::abix_64::ABIX64;
use crate::enums::category_x_64::CategoryX64;
use crate::enums::size_x_64::SizeX64;
use crate::macros::codegen_assert::CODEGEN_ASSERT;
use crate::methods::ir_call_wrapper_x_64_get_next_argument_target::{
systemv_gpr_order, windows_gpr_order, xmm_order,
};
use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
use crate::records::ir_call_wrapper_x_64::IrCallWrapperX64;
use crate::records::register_x_64::RegisterX64;
impl IrCallWrapperX64 {
pub fn suggest_argument_register<const N: usize>(
size: SizeX64,
build: &mut AssemblyBuilderX64,
) -> RegisterX64 {
const { assert!(N <= 3) };
if size == SizeX64::xmmword {
return xmm_order()[N].base;
}
let gpr_order = if build.abi == ABIX64::Windows {
windows_gpr_order()
} else {
systemv_gpr_order()
};
let mut target = gpr_order[N];
CODEGEN_ASSERT!(target.cat == CategoryX64::reg);
target.base = RegisterX64 {
bits: (target.base.bits & RegisterX64::INDEX_MASK) | size as u8,
};
target.base
}
}