- 修改x86_64_isel.h接口,将func_meta替换为func指针,并添加新的isel函数原型 - 添加x86_64_reg_alloc.h头文件,提供架构特定的寄存器分配操作填充函数 - 更新frame_layout.h定义frame_layout上下文结构 - 重构reg_alloc.h中的寄存器分配操作结构体,将ops从指针改为值类型, 并将mark_reg_unused重命名为clean_mark_regs - 扩展scc_mir.h中的函数元数据,添加vregs_count字段和虚拟寄存器管理函数 - 重新定义MIR pass阶段枚举,添加FRAME_LAYOUT和PROLOGUE_EPILOGUE阶段 - 添加win64目标相关头文件和实现,提供Windows x64 ABI降低和寄存器分配填充 - 更新虚拟寄存器表示格式从$到%,修复alloca指令处理 - 重构寄存器分配算法,改进虚拟寄存器到物理寄存器/栈槽的映射机制 - 完善MIR pass调度,支持多阶段处理流程
67 lines
2.2 KiB
C
67 lines
2.2 KiB
C
#ifndef __SCC_X86_64_ISEL_H__
|
|
#define __SCC_X86_64_ISEL_H__
|
|
|
|
#include <scc_lir_module.h>
|
|
#include <scc_tree_dump.h>
|
|
|
|
#include <x86/scc_x86_iform.h>
|
|
#include <x86/scc_x86_reg.h>
|
|
|
|
#include "../core_pass/scc_abi_lowering.h"
|
|
#include "../scc_mir_module.h"
|
|
|
|
typedef struct scc_x86_64_isel {
|
|
scc_mir_instr_vec_t instrs;
|
|
scc_mir_func_t *func;
|
|
scc_abi_lowering_t abi_lowering;
|
|
} scc_x86_64_isel_t;
|
|
|
|
void scc_isel_x86_64(scc_mir_module_t *mir_module,
|
|
const scc_lir_module_t *lir_module,
|
|
scc_x86_64_isel_t *isel);
|
|
|
|
static void add_instr(scc_x86_64_isel_t *isel, const scc_mir_instr_t *instr) {
|
|
scc_vec_push(isel->instrs, *instr);
|
|
}
|
|
|
|
static inline void add_instr_0(scc_x86_64_isel_t *isel,
|
|
scc_x86_iform_t opcode) {
|
|
scc_mir_instr_t out = {.opcode = opcode, .num_operands = 0};
|
|
add_instr(isel, &out);
|
|
}
|
|
|
|
static inline void add_instr_1(scc_x86_64_isel_t *isel, scc_x86_iform_t opcode,
|
|
scc_mir_operand_t op1) {
|
|
scc_mir_instr_t out = {.opcode = opcode, .num_operands = 1};
|
|
out.operands[0] = op1;
|
|
add_instr(isel, &out);
|
|
}
|
|
|
|
static inline void add_instr_2(scc_x86_64_isel_t *isel, scc_x86_iform_t opcode,
|
|
scc_mir_operand_t op1, scc_mir_operand_t op2) {
|
|
scc_mir_instr_t out = {.opcode = opcode, .num_operands = 2};
|
|
out.operands[0] = op1;
|
|
out.operands[1] = op2;
|
|
add_instr(isel, &out);
|
|
}
|
|
|
|
static inline scc_mir_operand_t reg_operand(scc_x86_reg_t reg) {
|
|
return (scc_mir_operand_t){.kind = SCC_MIR_OP_PREG, .preg = reg};
|
|
}
|
|
|
|
// Utils
|
|
|
|
void scc_x86_emit_move(scc_x86_64_isel_t *isel, scc_mir_operand_t dst,
|
|
scc_mir_operand_t src, u8 size);
|
|
scc_mir_operand_t scc_x86_lir_val_to_mir_op(scc_x86_64_isel_t *isel,
|
|
const scc_lir_val_t *val);
|
|
static inline void emit_call(scc_x86_64_isel_t *isel, const char *callee) {
|
|
scc_mir_operand_t sym = {.kind = SCC_MIR_OP_SYMBOL, .symbol = callee};
|
|
add_instr_1(isel, SCC_X86_IFORM_CALL_NEAR_GPRV, sym);
|
|
}
|
|
static inline void emit_ret(scc_x86_64_isel_t *isel) {
|
|
add_instr_0(isel, SCC_X86_IFORM_RET_NEAR);
|
|
}
|
|
|
|
#endif /* __SCC_X86_64_ISEL_H__ */
|