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