- 创建scc_x86_mir.h头文件,定义x86后端MIR指令结构和操作数构造器 - 创建scc_x86_isel.h头文件,定义x86_64指令选择器和相关工具函数 - 创建scc_x86_reg_alloc.h头文件,定义x86寄存器分配架构特定接口 - 移除旧的x86_64_isel.h和x86_64_reg_alloc.h文件 - 重构scc_mir.h中的指令表示,使用联合体存储伪指令数据 - 更新ABI lowering回调参数,使用void指针保持类型无关 - 扩展寄存器分配操作接口,添加指令信息查询和伪指令处理功能 - 更新目标文件包含路径以使用新的头文件命名
135 lines
5.4 KiB
C
135 lines
5.4 KiB
C
#ifndef __SCC_X86_MIR_H__
|
||
#define __SCC_X86_MIR_H__
|
||
|
||
#include "../scc_mir.h"
|
||
#include <scc_cfg.h>
|
||
#include <scc_pos.h>
|
||
#include <x86/scc_x86_encode.h>
|
||
#include <x86/scc_x86_iform.h>
|
||
#include <x86/scc_x86_reg.h>
|
||
|
||
typedef struct {
|
||
int opcode;
|
||
uint8_t num_operands;
|
||
scc_x86_operand_value_t operands[6];
|
||
scc_pos_t src_loc;
|
||
} scc_x86_instr_t;
|
||
|
||
// x86 后端指令:首字段 int opcode(正 = scc_x86_iform_t,负 = 伪指令)
|
||
typedef union scc_mir_x86_instr {
|
||
scc_mir_instr_t instr;
|
||
scc_x86_instr_t x86_instr;
|
||
} scc_mir_x86_instr_t;
|
||
|
||
typedef SCC_VEC(scc_mir_x86_instr_t) scc_mir_x86_instr_vec_t;
|
||
|
||
// ── 基本块 values 强制转换 ──────────────────────────────────────────────
|
||
|
||
#define SCC_MIR_X86_BBLOCK_INSTRS(bb) ((scc_mir_x86_instr_vec_t *)&bb->values)
|
||
#define SCC_MIR_X86_BBLOCK_INSTRS_C(bb) \
|
||
((const scc_mir_x86_instr_vec_t *)&bb->values)
|
||
|
||
// ── vreg 编码 ──────────────────────────────────────────────────────────
|
||
static inline bool scc_x86_op_is_vreg(const scc_x86_operand_value_t *op) {
|
||
return op->kind == SCC_X86_OPR_REG &&
|
||
(int)op->reg >= (int)SCC_X86_REG_COUNT;
|
||
}
|
||
static inline int scc_x86_op_get_vreg(const scc_x86_operand_value_t *op) {
|
||
return (int)op->reg - (int)SCC_X86_REG_COUNT;
|
||
}
|
||
static inline void scc_x86_op_set_preg(scc_x86_operand_value_t *op,
|
||
scc_x86_reg_t preg) {
|
||
op->kind = SCC_X86_OPR_REG;
|
||
op->reg = preg;
|
||
}
|
||
|
||
// ── 未解析栈槽编码 (base=INVALID, disp=slot_id) ──────────────────────
|
||
static inline bool scc_x86_op_is_slot(const scc_x86_operand_value_t *op) {
|
||
return op->kind == SCC_X86_OPR_MEM && op->mem.base == SCC_X86_REG_INVALID;
|
||
}
|
||
static inline int scc_x86_op_slot_id(const scc_x86_operand_value_t *op) {
|
||
return op->mem.disp;
|
||
}
|
||
|
||
// ── 指令构建辅助 ──────────────────────────────────────────────────────
|
||
static inline void scc_mir_x86_instr_0(scc_mir_x86_instr_t *out, int opcode,
|
||
scc_pos_t pos) {
|
||
out->x86_instr.opcode = opcode;
|
||
out->x86_instr.num_operands = 0;
|
||
out->x86_instr.src_loc = pos;
|
||
}
|
||
static inline void scc_mir_x86_instr_1(scc_mir_x86_instr_t *out, int opcode,
|
||
scc_x86_operand_value_t op0,
|
||
scc_pos_t pos) {
|
||
out->x86_instr.opcode = opcode;
|
||
out->x86_instr.num_operands = 1;
|
||
out->x86_instr.operands[0] = op0;
|
||
out->x86_instr.src_loc = pos;
|
||
}
|
||
static inline void scc_mir_x86_instr_2(scc_mir_x86_instr_t *out, int opcode,
|
||
scc_x86_operand_value_t op0,
|
||
scc_x86_operand_value_t op1,
|
||
scc_pos_t pos) {
|
||
out->x86_instr.opcode = opcode;
|
||
out->x86_instr.num_operands = 2;
|
||
out->x86_instr.operands[0] = op0;
|
||
out->x86_instr.operands[1] = op1;
|
||
out->x86_instr.src_loc = pos;
|
||
}
|
||
static inline void scc_mir_x86_instr_3(scc_mir_x86_instr_t *out, int opcode,
|
||
scc_x86_operand_value_t op0,
|
||
scc_x86_operand_value_t op1,
|
||
scc_x86_operand_value_t op2,
|
||
scc_pos_t pos) {
|
||
out->x86_instr.opcode = opcode;
|
||
out->x86_instr.num_operands = 3;
|
||
out->x86_instr.operands[0] = op0;
|
||
out->x86_instr.operands[1] = op1;
|
||
out->x86_instr.operands[2] = op2;
|
||
out->x86_instr.src_loc = pos;
|
||
}
|
||
|
||
// ── 常用操作数构造器 ──────────────────────────────────────────────────
|
||
static inline scc_x86_operand_value_t scc_x86_op_preg(scc_x86_reg_t reg) {
|
||
scc_x86_operand_value_t o = {.kind = SCC_X86_OPR_REG, .reg = reg};
|
||
return o;
|
||
}
|
||
static inline scc_x86_operand_value_t scc_x86_op_vreg(int vreg) {
|
||
scc_x86_operand_value_t o = {
|
||
.kind = SCC_X86_OPR_REG,
|
||
.reg = (scc_x86_reg_t)((int)SCC_X86_REG_COUNT + vreg)};
|
||
return o;
|
||
}
|
||
static inline scc_x86_operand_value_t scc_x86_op_relbr(i32 rel) {
|
||
scc_x86_operand_value_t o = {.kind = SCC_X86_OPR_RELBR, .imm = rel};
|
||
return o;
|
||
}
|
||
static inline scc_x86_operand_value_t scc_x86_op_imm(i64 imm) {
|
||
scc_x86_operand_value_t o = {.kind = SCC_X86_OPR_IMM, .imm = imm};
|
||
return o;
|
||
}
|
||
// slot_id 编码为 base=INVALID, disp=slot_id
|
||
static inline scc_x86_operand_value_t scc_x86_op_slot(int slot_id) {
|
||
scc_x86_operand_value_t o = {.kind = SCC_X86_OPR_MEM};
|
||
o.mem.base = SCC_X86_REG_INVALID;
|
||
o.mem.index = SCC_X86_REG_INVALID;
|
||
o.mem.scale = 1;
|
||
o.mem.disp = slot_id;
|
||
return o;
|
||
}
|
||
static inline scc_x86_operand_value_t scc_x86_op_symbol(const char *sym) {
|
||
scc_x86_operand_value_t o = {.kind = SCC_X86_OPR_IMM,
|
||
.imm = (i64)(usize)sym};
|
||
(void)o;
|
||
// symbol 暂用一个近似值占位,编码阶段处理重定位
|
||
return o;
|
||
}
|
||
static inline scc_x86_operand_value_t
|
||
scc_x86_op_block(scc_cfg_bblock_id_t bid) {
|
||
scc_x86_operand_value_t o = {.kind = SCC_X86_OPR_RELBR, .imm = 0};
|
||
(void)bid;
|
||
return o;
|
||
}
|
||
|
||
#endif /* __SCC_X86_MIR_H__ */
|