From 9132c79c5486f8d1b12603f52f88d3d82873fecb Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 28 Jul 2025 17:11:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E5=92=8C=E6=B5=AE=E7=82=B9=E6=95=B0=E7=9A=84=E5=8F=96=E4=BD=99?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 IROpCode枚举中添加了 MOD_B8、MOD_S16、MOD_I32、MOD_L64、MOD_F32 和 MOD_D64 指令 - 更新了 IROpCodeMapper 映射,增加了取余运算的后端指令 - 修改了 IROpCodeMappings 类,添加了取余运算符与 IR 操作码的映射 --- .../backend/utils/IROpCodeMapper.java | 6 ++ .../jcnc/snow/compiler/ir/core/IROpCode.java | 16 ++- .../compiler/ir/core/IROpCodeMappings.java | 102 +++++++++++------- 3 files changed, 81 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/backend/utils/IROpCodeMapper.java b/src/main/java/org/jcnc/snow/compiler/backend/utils/IROpCodeMapper.java index bb81d07..431484c 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/utils/IROpCodeMapper.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/utils/IROpCodeMapper.java @@ -44,6 +44,7 @@ public final class IROpCodeMapper { opcodeMap.put(IROpCode.MUL_B8, "B_MUL"); opcodeMap.put(IROpCode.DIV_B8, "B_DIV"); opcodeMap.put(IROpCode.NEG_B8, "B_NEG"); + opcodeMap.put(IROpCode.MOD_B8, "B_MOD"); // 整形16位算术运算映射 opcodeMap.put(IROpCode.ADD_S16, "S_ADD"); @@ -51,6 +52,7 @@ public final class IROpCodeMapper { opcodeMap.put(IROpCode.MUL_S16, "S_MUL"); opcodeMap.put(IROpCode.DIV_S16, "S_DIV"); opcodeMap.put(IROpCode.NEG_S16, "S_NEG"); + opcodeMap.put(IROpCode.MOD_S16, "S_MOD"); // 整形32位算术运算映射 opcodeMap.put(IROpCode.ADD_I32, "I_ADD"); @@ -58,6 +60,7 @@ public final class IROpCodeMapper { opcodeMap.put(IROpCode.MUL_I32, "I_MUL"); opcodeMap.put(IROpCode.DIV_I32, "I_DIV"); opcodeMap.put(IROpCode.NEG_I32, "I_NEG"); + opcodeMap.put(IROpCode.MOD_I32, "I_MOD"); // 整形64位算术运算映射 opcodeMap.put(IROpCode.ADD_L64, "L_ADD"); @@ -65,6 +68,7 @@ public final class IROpCodeMapper { opcodeMap.put(IROpCode.MUL_L64, "L_MUL"); opcodeMap.put(IROpCode.DIV_L64, "L_DIV"); opcodeMap.put(IROpCode.NEG_L64, "L_NEG"); + opcodeMap.put(IROpCode.MOD_L64, "L_MOD"); // --- 32-bit floating point --- @@ -73,6 +77,7 @@ public final class IROpCodeMapper { opcodeMap.put(IROpCode.MUL_F32, "F_MUL"); opcodeMap.put(IROpCode.DIV_F32, "F_DIV"); opcodeMap.put(IROpCode.NEG_F32, "F_NEG"); + opcodeMap.put(IROpCode.MOD_F32, "F_MOD"); // --- 64-bit floating point --- opcodeMap.put(IROpCode.ADD_D64, "D_ADD"); @@ -80,6 +85,7 @@ public final class IROpCodeMapper { opcodeMap.put(IROpCode.MUL_D64, "D_MUL"); opcodeMap.put(IROpCode.DIV_D64, "D_DIV"); opcodeMap.put(IROpCode.NEG_D64, "D_NEG"); + opcodeMap.put(IROpCode.MOD_D64, "D_MOD"); // 比较运算映射 // 8位整数比较运算映射 diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java index 41342da..6dd7cfc 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java @@ -25,11 +25,12 @@ public enum IROpCode { /* ───── 算术运算(8位整数: byte)───── */ - ADD_B8, // 8位整型加法: a = b + c - SUB_B8, // 8位整型减法: a = b - c - MUL_B8, // 8位整型乘法: a = b * c - DIV_B8, // 8位整型除法: a = b / c - NEG_B8, // 8位整型取负: a = -b + ADD_B8, // 8位整型加法: + SUB_B8, // 8位整型减法: + MUL_B8, // 8位整型乘法: + DIV_B8, // 8位整型除法: + NEG_B8, // 8位整型取负: + MOD_B8, // 8位整型取余 /* ───── 算术运算(16位整数: short)───── */ ADD_S16, // 16位整型加法 @@ -37,6 +38,7 @@ public enum IROpCode { MUL_S16, // 16位整型乘法 DIV_S16, // 16位整型除法 NEG_S16, // 16位整型取负 + MOD_S16, // 16位整型取余 /* ───── 算术运算(32位整数: int)───── */ ADD_I32, // 32位整型加法 @@ -44,6 +46,7 @@ public enum IROpCode { MUL_I32, // 32位整型乘法 DIV_I32, // 32位整型除法 NEG_I32, // 32位整型取负 + MOD_I32, // 32位整型取余 /* ───── 算术运算(64位整数: long)───── */ ADD_L64, // 64位整型加法 @@ -51,6 +54,7 @@ public enum IROpCode { MUL_L64, // 64位整型乘法 DIV_L64, // 64位整型除法 NEG_L64, // 64位整型取负 + MOD_L64, // 64位整型取余 /* ───── 算术运算(32位浮点数: float)───── */ ADD_F32, // 32位浮点加法 @@ -58,6 +62,7 @@ public enum IROpCode { MUL_F32, // 32位浮点乘法 DIV_F32, // 32位浮点除法 NEG_F32, // 32位浮点取负 + MOD_F32, // 32位浮点取余 /* ───── 算术运算(64位浮点数: double)───── */ ADD_D64, // 64位浮点加法 @@ -65,6 +70,7 @@ public enum IROpCode { MUL_D64, // 64位浮点乘法 DIV_D64, // 64位浮点除法 NEG_D64, // 64位浮点取负 + MOD_D64, // 64位浮点取余 /* ───── 逻辑与比较运算指令(8位整数: byte) ───── */ CMP_BEQ, // 8位整数相等比较: a == b diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCodeMappings.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCodeMappings.java index 92677a6..1b1695e 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCodeMappings.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCodeMappings.java @@ -6,97 +6,123 @@ import java.util.Map; * 操作符与IR操作码映射表,统一管理所有类型的算术和比较操作映射。 */ public final class IROpCodeMappings { - private IROpCodeMappings() {} // 禁止实例化 - // 8位整型运算符映射 public static final Map OP_B8 = Map.of( - "+", IROpCode.ADD_B8, "-", IROpCode.SUB_B8, - "*", IROpCode.MUL_B8, "/", IROpCode.DIV_B8 + "+", IROpCode.ADD_B8, + "-", IROpCode.SUB_B8, + "*", IROpCode.MUL_B8, + "/", IROpCode.DIV_B8, + "%", IROpCode.MOD_B8 ); // 16位整型 public static final Map OP_S16 = Map.of( - "+", IROpCode.ADD_S16, "-", IROpCode.SUB_S16, - "*", IROpCode.MUL_S16, "/", IROpCode.DIV_S16 + "+", IROpCode.ADD_S16, + "-", IROpCode.SUB_S16, + "*", IROpCode.MUL_S16, + "/", IROpCode.DIV_S16, + "%", IROpCode.MOD_S16 ); // 32位整型 public static final Map OP_I32 = Map.of( - "+", IROpCode.ADD_I32, "-", IROpCode.SUB_I32, - "*", IROpCode.MUL_I32, "/", IROpCode.DIV_I32 + "+", IROpCode.ADD_I32, + "-", IROpCode.SUB_I32, + "*", IROpCode.MUL_I32, + "/", IROpCode.DIV_I32, + "%", IROpCode.MOD_I32 ); // 64位长整型 public static final Map OP_L64 = Map.of( - "+", IROpCode.ADD_L64, "-", IROpCode.SUB_L64, - "*", IROpCode.MUL_L64, "/", IROpCode.DIV_L64 + "+", IROpCode.ADD_L64, + "-", IROpCode.SUB_L64, + "*", IROpCode.MUL_L64, + "/", IROpCode.DIV_L64, + "%", IROpCode.MOD_L64 ); // 32位浮点型 public static final Map OP_F32 = Map.of( - "+", IROpCode.ADD_F32, "-", IROpCode.SUB_F32, - "*", IROpCode.MUL_F32, "/", IROpCode.DIV_F32 + "+", IROpCode.ADD_F32, + "-", IROpCode.SUB_F32, + "*", IROpCode.MUL_F32, + "/", IROpCode.DIV_F32, + "%", IROpCode.MOD_F32 ); // 64位双精度浮点型 public static final Map OP_D64 = Map.of( - "+", IROpCode.ADD_D64, "-", IROpCode.SUB_D64, - "*", IROpCode.MUL_D64, "/", IROpCode.DIV_D64 + "+", IROpCode.ADD_D64, + "-", IROpCode.SUB_D64, + "*", IROpCode.MUL_D64, + "/", IROpCode.DIV_D64, + "%", IROpCode.MOD_D64 ); - - /* ────── 比较运算符映射 ────── */ - /** 8-bit(byte)比较 */ + /** + * 8-bit(byte)比较 + */ public static final Map CMP_B8 = Map.of( "==", IROpCode.CMP_BEQ, "!=", IROpCode.CMP_BNE, - "<", IROpCode.CMP_BLT, - ">", IROpCode.CMP_BGT, + "<", IROpCode.CMP_BLT, + ">", IROpCode.CMP_BGT, "<=", IROpCode.CMP_BLE, ">=", IROpCode.CMP_BGE ); - /** 16-bit(short)比较 */ + /* ────── 比较运算符映射 ────── */ + /** + * 16-bit(short)比较 + */ public static final Map CMP_S16 = Map.of( "==", IROpCode.CMP_SEQ, "!=", IROpCode.CMP_SNE, - "<", IROpCode.CMP_SLT, - ">", IROpCode.CMP_SGT, + "<", IROpCode.CMP_SLT, + ">", IROpCode.CMP_SGT, "<=", IROpCode.CMP_SLE, ">=", IROpCode.CMP_SGE ); - - /** 32-bit(int)比较 */ + /** + * 32-bit(int)比较 + */ public static final Map CMP_I32 = Map.of( "==", IROpCode.CMP_IEQ, "!=", IROpCode.CMP_INE, - "<", IROpCode.CMP_ILT, - ">", IROpCode.CMP_IGT, + "<", IROpCode.CMP_ILT, + ">", IROpCode.CMP_IGT, "<=", IROpCode.CMP_ILE, ">=", IROpCode.CMP_IGE ); - - /** 64-bit(long)比较 */ + /** + * 64-bit(long)比较 + */ public static final Map CMP_L64 = Map.of( "==", IROpCode.CMP_LEQ, "!=", IROpCode.CMP_LNE, - "<", IROpCode.CMP_LLT, - ">", IROpCode.CMP_LGT, + "<", IROpCode.CMP_LLT, + ">", IROpCode.CMP_LGT, "<=", IROpCode.CMP_LLE, ">=", IROpCode.CMP_LGE ); - - /** 32-bit(float)比较 */ + /** + * 32-bit(float)比较 + */ public static final Map CMP_F32 = Map.of( "==", IROpCode.CMP_FEQ, "!=", IROpCode.CMP_FNE, - "<", IROpCode.CMP_FLT, - ">", IROpCode.CMP_FGT, + "<", IROpCode.CMP_FLT, + ">", IROpCode.CMP_FGT, "<=", IROpCode.CMP_FLE, ">=", IROpCode.CMP_FGE ); - - /** 64-bit(double)比较 */ + /** + * 64-bit(double)比较 + */ public static final Map CMP_D64 = Map.of( "==", IROpCode.CMP_DEQ, "!=", IROpCode.CMP_DNE, - "<", IROpCode.CMP_DLT, - ">", IROpCode.CMP_DGT, + "<", IROpCode.CMP_DLT, + ">", IROpCode.CMP_DGT, "<=", IROpCode.CMP_DLE, ">=", IROpCode.CMP_DGE ); + + private IROpCodeMappings() { + } // 禁止实例化 }