feat: 增加 IR 对类型转换指令的支持

This commit is contained in:
zhangxun 2025-07-10 17:32:40 +08:00
parent e66a5a3078
commit 61a2fda6fa
3 changed files with 136 additions and 34 deletions

View File

@ -82,34 +82,66 @@ public final class IROpCodeMapper {
opcodeMap.put(IROpCode.NEG_D64, "D_NEG");
// 比较运算映射
// 整形32位比较运算映射
opcodeMap.put(IROpCode.CMP_IEQ, "IC_E"); // 相等
opcodeMap.put(IROpCode.CMP_INE, "IC_NE"); // 不等
opcodeMap.put(IROpCode.CMP_ILT, "IC_L"); // 小于
opcodeMap.put(IROpCode.CMP_IGT, "IC_G"); // 大于
opcodeMap.put(IROpCode.CMP_ILE, "IC_LE"); // 小于等于
opcodeMap.put(IROpCode.CMP_IGE, "IC_GE"); // 大于等于
// 8位整数比较运算映射
opcodeMap.put(IROpCode.CMP_BEQ, "B_CE"); // 相等
opcodeMap.put(IROpCode.CMP_BNE, "B_CNE"); // 不等
opcodeMap.put(IROpCode.CMP_BLT, "B_CL"); // 小于
opcodeMap.put(IROpCode.CMP_BGT, "B_CG"); // 大于
opcodeMap.put(IROpCode.CMP_BLE, "B_CLE"); // 小于等于
opcodeMap.put(IROpCode.CMP_BGE, "B_CGE"); // 大于等于
// 整形64位比较运算映射
opcodeMap.put(IROpCode.CMP_LEQ, "LC_E"); // 相等
opcodeMap.put(IROpCode.CMP_LNE, "LC_NE"); // 不等
opcodeMap.put(IROpCode.CMP_LLT, "LC_L"); // 小于
opcodeMap.put(IROpCode.CMP_LGT, "LC_G"); // 大于
opcodeMap.put(IROpCode.CMP_LLE, "LC_LE"); // 小于等于
opcodeMap.put(IROpCode.CMP_LGE, "LC_GE"); // 大于等于
// 16位整数比较运算映射
opcodeMap.put(IROpCode.CMP_SEQ, "S_CE"); // 相等
opcodeMap.put(IROpCode.CMP_SNE, "S_CNE"); // 不等
opcodeMap.put(IROpCode.CMP_SLT, "S_CL"); // 小于
opcodeMap.put(IROpCode.CMP_SGT, "S_CG"); // 大于
opcodeMap.put(IROpCode.CMP_SLE, "S_CLE"); // 小于等于
opcodeMap.put(IROpCode.CMP_SGE, "S_CGE"); // 大于等于
// 32位整数比较运算映射
opcodeMap.put(IROpCode.CMP_IEQ, "I_CE"); // 相等
opcodeMap.put(IROpCode.CMP_INE, "I_CNE"); // 不等
opcodeMap.put(IROpCode.CMP_ILT, "I_CL"); // 小于
opcodeMap.put(IROpCode.CMP_IGT, "I_CG"); // 大于
opcodeMap.put(IROpCode.CMP_ILE, "I_CLE"); // 小于等于
opcodeMap.put(IROpCode.CMP_IGE, "I_CGE"); // 大于等于
// 64位整数比较运算映射
opcodeMap.put(IROpCode.CMP_LEQ, "L_CE"); // 相等
opcodeMap.put(IROpCode.CMP_LNE, "L_CNE"); // 不等
opcodeMap.put(IROpCode.CMP_LLT, "L_CL"); // 小于
opcodeMap.put(IROpCode.CMP_LGT, "L_CG"); // 大于
opcodeMap.put(IROpCode.CMP_LLE, "L_CLE"); // 小于等于
opcodeMap.put(IROpCode.CMP_LGE, "L_CGE"); // 大于等于
// 32位浮点比较运算映射
opcodeMap.put(IROpCode.CMP_FEQ, "F_CE"); // 相等
opcodeMap.put(IROpCode.CMP_FNE, "F_CNE"); // 不等
opcodeMap.put(IROpCode.CMP_FLT, "F_CL"); // 小于
opcodeMap.put(IROpCode.CMP_FGT, "F_CG"); // 大于
opcodeMap.put(IROpCode.CMP_FLE, "F_CLE"); // 小于等于
opcodeMap.put(IROpCode.CMP_FGE, "F_CGE"); // 大于等于
// 64位浮点比较运算映射
opcodeMap.put(IROpCode.CMP_DEQ, "D_CE"); // 相等
opcodeMap.put(IROpCode.CMP_DNE, "D_CNE"); // 不等
opcodeMap.put(IROpCode.CMP_DLT, "D_CL"); // 小于
opcodeMap.put(IROpCode.CMP_DGT, "D_CG"); // 大于
opcodeMap.put(IROpCode.CMP_DLE, "D_CLE"); // 小于等于
opcodeMap.put(IROpCode.CMP_DGE, "D_CGE"); // 大于等于
// 加载与存储
opcodeMap.put(IROpCode.LOAD, "I_LOAD"); // 加载
opcodeMap.put(IROpCode.STORE, "I_STORE"); // 存储
opcodeMap.put(IROpCode.CONST, "I_PUSH"); // 常量入栈
opcodeMap.put(IROpCode.LOAD, "I_LOAD"); // 加载
opcodeMap.put(IROpCode.STORE, "I_STORE"); // 存储
opcodeMap.put(IROpCode.CONST, "I_PUSH"); // 常量入栈
// 跳转与标签
opcodeMap.put(IROpCode.JUMP, "JMP"); // 无条件跳转
opcodeMap.put(IROpCode.LABEL, "LABEL"); // 标签
opcodeMap.put(IROpCode.JUMP, "JMP"); // 无条件跳转
opcodeMap.put(IROpCode.LABEL, "LABEL"); // 标签
// 函数相关
opcodeMap.put(IROpCode.CALL, "CALL"); // 调用
opcodeMap.put(IROpCode.RET, "RET"); // 返回
opcodeMap.put(IROpCode.CALL, "CALL"); // 调用
opcodeMap.put(IROpCode.RET, "RET"); // 返回
}
/**

View File

@ -66,21 +66,53 @@ public enum IROpCode {
DIV_D64, // 64位浮点除法
NEG_D64, // 64位浮点取负
/* ───── 逻辑与比较运算指令8位整数byte ───── */
CMP_BEQ, // 8位整数相等比较a == b
CMP_BNE, // 8位整数不等比较a != b
CMP_BLT, // 8位整数小于比较a < b
CMP_BGT, // 8位整数大于比较a > b
CMP_BLE, // 8位整数小于等于a <= b
CMP_BGE, // 8位整数大于等于a >= b
/* ───── 逻辑与比较运算指令16位整数int ───── */
CMP_SEQ, // 16位整数相等比较a == b
CMP_SNE, // 16位整数不等比较a != b
CMP_SLT, // 16位整数小于比较a < b
CMP_SGT, // 16位整数大于比较a > b
CMP_SLE, // 16位整数小于等于a <= b
CMP_SGE, // 16位整数大于等于a >= b
/* ───── 逻辑与比较运算指令32位整数int ───── */
CMP_IEQ, // 32位相等比较a == b
CMP_INE, // 32位不等比较a != b
CMP_ILT, // 32位小于比较a < b
CMP_IGT, // 32位大于比较a > b
CMP_ILE, // 32位小于等于a <= b
CMP_IGE, // 32位大于等于a >= b
CMP_IEQ, // 32位整数相等比较a == b
CMP_INE, // 32位整数不等比较a != b
CMP_ILT, // 32位整数小于比较a < b
CMP_IGT, // 32位整数大于比较a > b
CMP_ILE, // 32位整数小于等于a <= b
CMP_IGE, // 32位整数大于等于a >= b
/* ───── 逻辑与比较运算指令64位整数long ───── */
CMP_LEQ, // 64位相等比较a == b
CMP_LNE, // 64位不等比较a != b
CMP_LLT, // 64位小于比较a < b
CMP_LGT, // 64位大于比较a > b
CMP_LLE, // 64位小于等于a <= b
CMP_LGE, // 64位大于等于a >= b
CMP_LEQ, // 64位整数相等比较a == b
CMP_LNE, // 64位整数不等比较a != b
CMP_LLT, // 64位整数小于比较a < b
CMP_LGT, // 64位整数大于比较a > b
CMP_LLE, // 64位整数小于等于a <= b
CMP_LGE, // 64位整数大于等于a >= b
/* ───── 逻辑与比较运算指令32位浮点数float ───── */
CMP_FEQ, // 32位浮点相等比较a == b
CMP_FNE, // 32位浮点不等比较a != b
CMP_FLT, // 32位浮点小于比较a < b
CMP_FGT, // 32位浮点大于比较a > b
CMP_FLE, // 32位浮点小于等于a <= b
CMP_FGE, // 32位浮点大于等于a >= b
/* ───── 逻辑与比较运算指令64位浮点数double ───── */
CMP_DEQ, // 64位浮点相等比较a == b
CMP_DNE, // 64位浮点不等比较a != b
CMP_DLT, // 64位浮点小于比较a < b
CMP_DGT, // 64位浮点大于比较a > b
CMP_DLE, // 64位浮点小于等于a <= b
CMP_DGE, // 64位浮点大于等于a >= b
/* ───── 数据访问与常量操作 ───── */
LOAD, // 从内存加载数据至寄存器

View File

@ -40,6 +40,26 @@ public final class IROpCodeMappings {
);
/* ────── 比较运算符映射 ────── */
/** 8-bitbyte比较 */
public static final Map<String, IROpCode> CMP_B8 = Map.of(
"==", IROpCode.CMP_BEQ,
"!=", IROpCode.CMP_BNE,
"<", IROpCode.CMP_BLT,
">", IROpCode.CMP_BGT,
"<=", IROpCode.CMP_BLE,
">=", IROpCode.CMP_BGE
);
/** 16-bitshort比较 */
public static final Map<String, IROpCode> CMP_S16 = Map.of(
"==", IROpCode.CMP_SEQ,
"!=", IROpCode.CMP_SNE,
"<", IROpCode.CMP_SLT,
">", IROpCode.CMP_SGT,
"<=", IROpCode.CMP_SLE,
">=", IROpCode.CMP_SGE
);
/** 32-bitint比较 */
public static final Map<String, IROpCode> CMP_I32 = Map.of(
"==", IROpCode.CMP_IEQ,
@ -60,5 +80,23 @@ public final class IROpCodeMappings {
">=", IROpCode.CMP_LGE
);
/** 32-bitfloat比较 */
public static final Map<String, IROpCode> CMP_F32 = Map.of(
"==", IROpCode.CMP_FEQ,
"!=", IROpCode.CMP_FNE,
"<", IROpCode.CMP_FLT,
">", IROpCode.CMP_FGT,
"<=", IROpCode.CMP_FLE,
">=", IROpCode.CMP_FGE
);
/** 64-bitdouble比较 */
public static final Map<String, IROpCode> CMP_D64 = Map.of(
"==", IROpCode.CMP_DEQ,
"!=", IROpCode.CMP_DNE,
"<", IROpCode.CMP_DLT,
">", IROpCode.CMP_DGT,
"<=", IROpCode.CMP_DLE,
">=", IROpCode.CMP_DGE
);
}