Skip to content

Commit b8547ae

Browse files
committed
Fixed some some Div/Mod issues in x86
1 parent 8a70870 commit b8547ae

File tree

9 files changed

+63
-28
lines changed

9 files changed

+63
-28
lines changed

src/codegen/Assembly.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,18 @@ public void unspill(int free) {
127127
}
128128
}
129129

130+
public int spillTo(int free, String target_reg) {
131+
int orig_free = free;
132+
while (!target_reg.equals(reg(free))) {
133+
spill(++free);
134+
}
135+
return free;
136+
}
137+
public void unspillTo(int free, int orig_free) {
138+
while (free > orig_free) {
139+
unspill(free--);
140+
}
141+
}
130142
public void spillAll(int free) {
131143
int toSpill = Math.min(free, numRegs - 1);
132144
for (int i = 1; i <= toSpill; i++) {
@@ -180,14 +192,14 @@ public void loadThis(int size, int free) {
180192
public void loadTmp(int x86_tmp, int free) {
181193
out.println("// Attempting to load " + x86_tmp + " into " + free);
182194
int diff = free - x86_tmp;
183-
if (diff >= numRegs) {
184-
emit("movl", indirect((free - x86_tmp) * 4, "%esp"), reg(free));
185-
} else if (diff > 0) {
195+
if (diff < 0) {
196+
assert(false); /* reg is higher on stack ? */
197+
} else if (diff < numRegs) {
186198
emit("movl", reg(x86_tmp), reg(free));
187-
} else if (diff == 0) {
188-
/* same register ? */
199+
} else if (diff > 0) {
200+
emit("movl", indirect(diff * WORDSIZE, "%esp"), reg(free));
189201
} else {
190-
assert(false); /* cannot reference a tmp that doesn't exist */
202+
/* same register ? */
191203
}
192204
}
193205
//- emit individual instructions, with varying numbers of arguments ------

src/syntax/ArrayLiteral.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ public Type typeOf(Context ctxt, VarEnv env)
9494
* leave the result in the specified free variable.
9595
*/
9696
public void compileExpr(Assembly a, int free) {
97+
a.emit("//compiling tmp to " + free);
9798
this.object.compileExpr(a, free);
99+
a.emit("//setting tmp to " + free);
98100
tmp.setTmp(free);
99101
a.spill(free + 1);
100102
for (Expression e : inits) {

src/syntax/DivExpr.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,16 @@ boolean commutes() {
4242
* leave the result in the specified free variable.
4343
*/
4444
public void compileExpr(Assembly a, int free) {
45-
int orig_free = free;
46-
while (!a.reg(free).equals("%eax")) {
47-
free++;
48-
}
49-
a.spill(free);
50-
left.compileExpr(a, free);
51-
a.spill(free + 1);
52-
right.compileExpr(a, free + 1);
45+
int freed = a.spillTo(free, "%eax");
46+
left.compileExpr(a, freed);
47+
a.spill(freed + 1);
48+
right.compileExpr(a, freed + 1);
5349
a.emit("movl", a.immed(0), "%edx");
54-
a.emit("idivl", a.reg(free + 1));
55-
50+
a.emit("idivl", a.reg(freed + 1));
5651
/* hiding %eax into %edx in case overwritten by spills */
5752
a.emit("movl", "%eax", "%edx");
58-
/* %edx will not be touched by this */
59-
a.unspillAll(orig_free);
53+
/* %edx will not be touched by this unspill */
54+
a.unspillTo(freed + 1, free);
6055
a.emit("movl", "%edx", a.reg(free));
6156
}
6257

src/syntax/ModExpr.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,15 @@ boolean commutes() {
4242
* leave the result in the specified free variable.
4343
*/
4444
public void compileExpr(Assembly a, int free) {
45-
int orig_free = free;
46-
while (!a.reg(free).equals("%eax")) {
47-
free++;
48-
}
49-
a.spill(free);
50-
left.compileExpr(a, free);
51-
a.spill(free + 1);
52-
right.compileExpr(a, free + 1);
45+
int freed = a.spillTo(free, "%eax");
46+
left.compileExpr(a, freed);
47+
a.spill(freed + 1);
48+
right.compileExpr(a, freed + 1);
5349
a.emit("movl", a.immed(0), "%edx");
54-
a.emit("idivl", a.reg(free + 1));
50+
a.emit("idivl", a.reg(freed + 1));
5551

5652
/* %edx will not be touched by this */
57-
a.unspillAll(orig_free);
53+
a.unspillTo(freed + 1, free);
5854
a.emit("movl", "%edx", a.reg(free));
5955
}
6056

src/syntax/TmpAccess.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public void setTmp(int free) {
5858
* leave the result in the specified free variable.
5959
*/
6060
public void compileExpr(Assembly a, int free) {
61+
//a.emit("int", "$3");
6162
a.loadTmp(x86_tmp, free);
6263
}
6364

unitTests/arraylit3.gcc.ref

Whitespace-only changes.

unitTests/arraylit3.j

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Main {
2+
static void main() {
3+
int [][] test2 = new int[][] {
4+
new int[]{2147483647 / 2 / 2 / 2 / 2 / 2 / 2 / 2 / 2 / 2 / 2 / 2, 2, 3, 4, 5, 6},
5+
new int[]{1, 2, 3},
6+
new int[]{9, 2, 3, 4},
7+
new int[]{},
8+
new int[]{1, 2, 3, 4, 5, 6, 7, 8}
9+
};
10+
int x = 0;
11+
while (x < test2.length) {
12+
int y = 0;
13+
while (y < test2[x].length) {
14+
System.out.print(Integer.toString(test2[x][y]));
15+
System.out.print(" ");
16+
y = y + 1;
17+
}
18+
System.out.println("");
19+
x = x + 1;
20+
}
21+
}
22+
}
23+

unitTests/arraylit3.mjc.ref

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Writing LLVM Bitcode to build/test/arraylit3.bc

unitTests/arraylit3.run.ref

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
1048575 2 3 4 5 6
2+
1 2 3
3+
9 2 3 4
4+
5+
1 2 3 4 5 6 7 8

0 commit comments

Comments
 (0)