- 将 MIR 中的 SCC_MIR_OP_MEM 替换为更精确的 SCC_MIR_OP_STACK_SLOT 和 SCC_MIR_OP_STACK_OFFSET 类型 - 在 x86_64 指令选择中更新相应的内存操作数处理逻辑 - 修改寄存器分配器中的栈槽操作数类型检查 - 更新 IR 转机器码过程中的内存操作数转换 refactor(hir): 使用 tree_dump_node 输出函数节点 - 将 hir_dump 中的函数名输出从 append 改为 node 类型 refactor(frame-layout): 重构栈帧布局传递实现结构 - 引入函数指针实现方式替代直接函数实现 - 将栈帧分配功能集成到 MIR 传递流程中 - 移除独立的 frame_layout 实现文件 refactor(prolog-epilog): 添加函数序言/尾声传递框架 - 为 Windows x64 平台初始化序言/尾声生成器 - 在 MIR 传递阶段添加序言/尾声处理步骤 refactor(win64): 更新 Windows x64 目标平台接口 - 重命名寄存器分配填充函数为 scc_win_pc_x64_reg_alloc_fill - 添加栈帧分配和序言/尾声初始化函数 - 修正参数传递中的栈槽操作数类型 refactor(dump): 改进 MIR 输出格式 - 将基本块显示改为分支节点类型 - 更新操作数类型的显示处理 chore: 添加 x86 编码相关数据结构定义 - 新增 scc_x86_encode.h 头文件包含内存操作数和指令编码接口定义
65 lines
2.1 KiB
C
65 lines
2.1 KiB
C
#include <scc_mir.h>
|
|
|
|
void scc_mir_func_meta_init(scc_mir_func_meta_t *func_meta) {
|
|
func_meta->frame_size = 0;
|
|
func_meta->stack_alignment = 0;
|
|
func_meta->vregs_count = 0;
|
|
scc_vec_init(func_meta->stack_slots);
|
|
|
|
// For null stack slot
|
|
scc_vec_push(func_meta->stack_slots, (scc_mir_stack_slot_t){0});
|
|
scc_hashtable_usize_init(&func_meta->vreg2physic);
|
|
}
|
|
|
|
int scc_mir_alloc_vreg(scc_mir_func_t *func) {
|
|
scc_mir_func_meta_t *meta = SCC_MIR_FUNC_META(func);
|
|
return meta->vregs_count++;
|
|
}
|
|
|
|
void scc_mir_vreg_op(const scc_mir_func_t *func, int vreg,
|
|
scc_mir_operand_t *out) {
|
|
scc_mir_func_meta_t *meta = SCC_MIR_FUNC_META(func);
|
|
isize idx =
|
|
(isize)scc_hashtable_get(&meta->vreg2physic, (void *)(usize)vreg);
|
|
if (idx == 0) {
|
|
out->kind = SCC_MIR_OP_VREG;
|
|
out->vreg = vreg;
|
|
} else if (idx < 0) {
|
|
out->kind = SCC_MIR_OP_PREG;
|
|
out->preg = (int)-idx;
|
|
} else {
|
|
out->kind = SCC_MIR_OP_STACK_SLOT;
|
|
Assert(idx < scc_vec_size(meta->stack_slots));
|
|
out->stack_slot = (int)(usize)idx;
|
|
}
|
|
}
|
|
|
|
void scc_mir_vreg_map2preg(scc_mir_func_t *func, int vreg, int preg) {
|
|
scc_mir_func_meta_t *meta = SCC_MIR_FUNC_META(func);
|
|
isize val =
|
|
(isize)scc_hashtable_get(&meta->vreg2physic, (void *)(usize)vreg);
|
|
if (val != 0) {
|
|
Panic("vreg %d already mapped", vreg);
|
|
return;
|
|
}
|
|
scc_hashtable_set(&meta->vreg2physic, (void *)(usize)vreg,
|
|
(void *)(usize)(isize)-preg);
|
|
}
|
|
|
|
int scc_mir_vreg_map2slot(scc_mir_func_t *func, int vreg, int size, int align) {
|
|
scc_mir_func_meta_t *meta = SCC_MIR_FUNC_META(func);
|
|
isize val =
|
|
(isize)scc_hashtable_get(&meta->vreg2physic, (void *)(usize)vreg);
|
|
if (val != 0) {
|
|
Panic("vreg %d already mapped", vreg);
|
|
return 0;
|
|
}
|
|
int new_slot = scc_vec_size(meta->stack_slots);
|
|
scc_mir_stack_slot_t s = {
|
|
.slot_id = new_slot, .size = size, .alignment = align, .offset = 0};
|
|
scc_vec_push(meta->stack_slots, s);
|
|
scc_hashtable_set(&meta->vreg2physic, (void *)(usize)vreg,
|
|
(void *)(usize)new_slot);
|
|
return new_slot;
|
|
}
|