jvm_assembler/optimizer/
mod.rs1use crate::program::{JvmInstruction, JvmMethod, JvmProgram};
2
3pub struct JvmOptimizer;
5
6impl JvmOptimizer {
7 pub fn optimize_program(program: &mut JvmProgram) {
9 for method in &mut program.methods {
10 Self::optimize_method(method);
11 }
12 }
13
14 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 fn optimize_instruction(instruction: JvmInstruction) -> JvmInstruction {
27 match instruction {
28 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 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 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}