Skip to main content

jvm_assembler/optimizer/
mod.rs

1use crate::program::{JvmInstruction, JvmMethod, JvmProgram};
2
3/// JVM 字节码优化器
4pub struct JvmOptimizer;
5
6impl JvmOptimizer {
7    /// 优化整个程序
8    pub fn optimize_program(program: &mut JvmProgram) {
9        for method in &mut program.methods {
10            Self::optimize_method(method);
11        }
12    }
13
14    /// 优化单个方法
15    pub fn optimize_method(method: &mut JvmMethod) {
16        let mut optimized_instructions = Vec::with_capacity(method.instructions.len());
17
18        for instruction in method.instructions.drain(..) {
19            optimized_instructions.push(Self::optimize_instruction(instruction));
20        }
21
22        method.instructions = optimized_instructions;
23    }
24
25    /// 优化单条指令
26    fn optimize_instruction(instruction: JvmInstruction) -> JvmInstruction {
27        match instruction {
28            // 优化加载常量指令
29            JvmInstruction::Bipush { value } => match value {
30                -1 => JvmInstruction::IconstM1,
31                0 => JvmInstruction::Iconst0,
32                1 => JvmInstruction::Iconst1,
33                2 => JvmInstruction::Iconst2,
34                3 => JvmInstruction::Iconst3,
35                4 => JvmInstruction::Iconst4,
36                5 => JvmInstruction::Iconst5,
37                _ => JvmInstruction::Bipush { value },
38            },
39            JvmInstruction::Sipush { value } => match value {
40                -1 => JvmInstruction::IconstM1,
41                0 => JvmInstruction::Iconst0,
42                1 => JvmInstruction::Iconst1,
43                2 => JvmInstruction::Iconst2,
44                3 => JvmInstruction::Iconst3,
45                4 => JvmInstruction::Iconst4,
46                5 => JvmInstruction::Iconst5,
47                v if v >= -128 && v <= 127 => JvmInstruction::Bipush { value: v as i8 },
48                _ => JvmInstruction::Sipush { value },
49            },
50            // 优化 load 指令
51            JvmInstruction::Iload { index } => match index {
52                0 => JvmInstruction::Iload0,
53                1 => JvmInstruction::Iload1,
54                2 => JvmInstruction::Iload2,
55                3 => JvmInstruction::Iload3,
56                _ => JvmInstruction::Iload { index },
57            },
58            JvmInstruction::Lload { index } => match index {
59                0 => JvmInstruction::Lload0,
60                1 => JvmInstruction::Lload1,
61                2 => JvmInstruction::Lload2,
62                3 => JvmInstruction::Lload3,
63                _ => JvmInstruction::Lload { index },
64            },
65            JvmInstruction::Fload { index } => match index {
66                0 => JvmInstruction::Fload0,
67                1 => JvmInstruction::Fload1,
68                2 => JvmInstruction::Fload2,
69                3 => JvmInstruction::Fload3,
70                _ => JvmInstruction::Fload { index },
71            },
72            JvmInstruction::Dload { index } => match index {
73                0 => JvmInstruction::Dload0,
74                1 => JvmInstruction::Dload1,
75                2 => JvmInstruction::Dload2,
76                3 => JvmInstruction::Dload3,
77                _ => JvmInstruction::Dload { index },
78            },
79            JvmInstruction::Aload { index } => match index {
80                0 => JvmInstruction::Aload0,
81                1 => JvmInstruction::Aload1,
82                2 => JvmInstruction::Aload2,
83                3 => JvmInstruction::Aload3,
84                _ => JvmInstruction::Aload { index },
85            },
86            // 优化 store 指令
87            JvmInstruction::Istore { index } => match index {
88                0 => JvmInstruction::Istore0,
89                1 => JvmInstruction::Istore1,
90                2 => JvmInstruction::Istore2,
91                3 => JvmInstruction::Istore3,
92                _ => JvmInstruction::Istore { index },
93            },
94            JvmInstruction::Lstore { index } => match index {
95                0 => JvmInstruction::Lstore0,
96                1 => JvmInstruction::Lstore1,
97                2 => JvmInstruction::Lstore2,
98                3 => JvmInstruction::Lstore3,
99                _ => JvmInstruction::Lstore { index },
100            },
101            JvmInstruction::Fstore { index } => match index {
102                0 => JvmInstruction::Fstore0,
103                1 => JvmInstruction::Fstore1,
104                2 => JvmInstruction::Fstore2,
105                3 => JvmInstruction::Fstore3,
106                _ => JvmInstruction::Fstore { index },
107            },
108            JvmInstruction::Dstore { index } => match index {
109                0 => JvmInstruction::Dstore0,
110                1 => JvmInstruction::Dstore1,
111                2 => JvmInstruction::Dstore2,
112                3 => JvmInstruction::Dstore3,
113                _ => JvmInstruction::Dstore { index },
114            },
115            JvmInstruction::Astore { index } => match index {
116                0 => JvmInstruction::Astore0,
117                1 => JvmInstruction::Astore1,
118                2 => JvmInstruction::Astore2,
119                3 => JvmInstruction::Astore3,
120                _ => JvmInstruction::Astore { index },
121            },
122            _ => instruction,
123        }
124    }
125}