From e78cb09c0f9e55e982b9e58e990ff5b39fd7886a Mon Sep 17 00:00:00 2001 From: zhangxun <1958638841@qq.com> Date: Mon, 16 Jun 2025 23:06:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9D=A1=E4=BB=B6=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E6=94=AF=E6=8C=81=E7=B1=BB=E5=9E=8B=E6=8F=90=E5=8D=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/generator/CmpJumpGenerator.java | 70 ++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/backend/generator/CmpJumpGenerator.java b/src/main/java/org/jcnc/snow/compiler/backend/generator/CmpJumpGenerator.java index b660c11..0f10d64 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/generator/CmpJumpGenerator.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/generator/CmpJumpGenerator.java @@ -28,6 +28,60 @@ public class CmpJumpGenerator implements InstructionGenerator 6; + case 'F' -> 5; + case 'L' -> 4; + case 'I' -> 3; + case 'S' -> 2; + case 'B' -> 1; + default -> 0; + }; + } + + /** + * 返回优先级更高的类型字符 + */ + private static char promote(char a, char b) { + return rank(a) >= rank(b) ? a : b; + } + + /** + * 单字符转字符串 + */ + private static String str(char p) { + return String.valueOf(p); + } + + /** + * 获取从类型 {@code from} 到 {@code to} 的转换指令名。 + * 相同类型或无显式转换需求返回 {@code null}。 + */ + private static String convert(char from, char to) { + if (from == to) return null; + return switch ("" + from + to) { + case "IL" -> "I2L"; + case "ID" -> "I2D"; + case "IF" -> "I2F"; + case "LI" -> "L2I"; + case "LD" -> "L2D"; + case "LF" -> "L2F"; + case "FI" -> "F2I"; + case "FL" -> "F2L"; + case "FD" -> "F2D"; + case "DI" -> "D2I"; + case "DL" -> "D2L"; + case "DF" -> "D2F"; + case "SI" -> "S2I"; + case "BI" -> "B2I"; + default -> null; + }; + } + /** * 生成条件比较跳转相关的虚拟机指令。 * @@ -45,10 +99,22 @@ public class CmpJumpGenerator implements InstructionGenerator