x64 ISA target for lowering MilkIR into MachV
///|
test "inspect x64 ABI policy" {
let abi = abi_policy()
inspect(abi.pointer_size, content="8")
inspect(abi.stack_alignment, content="16")
inspect(abi.int_argument_regs.length(), content="6")
inspect(abi.float_argument_regs.length(), content="8")
}///|
test "lower an integer add function for x64" {
let builder = @milkir.FunctionBuilder::FunctionBuilder("add64")
let lhs = builder.add_param(I64)
let rhs = builder.add_param(I64)
builder.add_result(I64)
builder.return_([builder.iadd(lhs, rhs)])
let lowered = lower_function(builder.get_function())
inspect(lowered.name, content="add64")
inspect(lowered.blocks.length(), content="1")
inspect(
lowered.blocks[0].insts.any(fn(inst) { inst.opcode is Add(_) }),
content="true",
)
}///|
test "lower x64 with an explicit call convention" {
let builder = @milkir.FunctionBuilder::FunctionBuilder("custom_add64")
let context = builder.add_param(Ptr)
let lhs = builder.add_param(I64)
let rhs = builder.add_param(I64)
builder.add_result(I64)
builder.return_([builder.iadd(lhs, rhs)])
context |> ignore
let conv : @abi.CallConventionLayout = {
context_arg: { index: 7, class: Int },
user_arg_gprs: [{ index: 6, class: Int }, { index: 2, class: Int }],
arg_fprs: [],
ret_gprs: [{ index: 0, class: Int }],
ret_fprs: [],
}
let lowered = lower_function_with_call_conv(builder.get_function(), conv)
inspect(lowered.name, content="custom_add64")
inspect(lowered.blocks.length(), content="1")
}pub(all) struct MachineEnvData {
preferred_int : Array[PReg]
nonpreferred_int : Array[PReg]
preferred_float : Array[PReg]
nonpreferred_float : Array[PReg]
preferred_vector : Array[PReg]
nonpreferred_vector : Array[PReg]
callee_saved_int : Array[PReg]
callee_saved_float : Array[PReg]
scratch_int : Array[Int]
scratch_float : Array[Int]
} derive(Debug)pub(all) struct Target {
triple : String
calling_convention : CallingConvention
abi : AbiPolicy
} derive(Debug)fn lower_function_with_call_conv(func : Function, call_conv_layout : CallConventionLayout, return_area_base_reg? : PReg?) -> Function