use ir::Type in Compiler::pop

This commit is contained in:
Joshua Warner
2014-04-30 20:28:33 -06:00
committed by Joshua Warner
parent 13342d28be
commit 4bfb359cdd
3 changed files with 34 additions and 28 deletions

View File

@ -84,7 +84,7 @@ class Compiler {
virtual void push(ir::Type type, Operand* value) = 0; virtual void push(ir::Type type, Operand* value) = 0;
virtual void save(ir::Type type, Operand* value) = 0; virtual void save(ir::Type type, Operand* value) = 0;
virtual Operand* pop(unsigned footprint) = 0; virtual Operand* pop(ir::Type type) = 0;
virtual void pushed() = 0; virtual void pushed() = 0;
virtual void popped(unsigned footprint) = 0; virtual void popped(unsigned footprint) = 0;
virtual unsigned topOfStack() = 0; virtual unsigned topOfStack() = 0;

View File

@ -2363,8 +2363,13 @@ class MyCompiler: public Compiler {
} }
} }
virtual Operand* pop(unsigned footprint) { virtual Operand* pop(ir::Type type)
return compiler::pop(&c, footprint); {
Operand* value = compiler::pop(&c, typeFootprint(&c, type));
// TODO: once type information is flowed properly, enable this assert.
// Some time later, we can remove the parameter.
// assert(&c, static_cast<Value*>(value)->type == type);
return value;
} }
virtual void pushed() { virtual void pushed() {

View File

@ -1688,12 +1688,13 @@ class Frame {
pushQuiet(types.i8, o); pushQuiet(types.i8, o);
} }
Value popQuiet(unsigned footprint) { Value popQuiet(ir::Type type)
return c->pop(footprint); {
return c->pop(type);
} }
Value popLongQuiet() { Value popLongQuiet() {
return popQuiet(2); return popQuiet(types.i8);
} }
void pushInt(Value o) { void pushInt(Value o) {
@ -1729,7 +1730,7 @@ class Frame {
Value popInt() { Value popInt() {
poppedInt(); poppedInt();
return popQuiet(1); return popQuiet(types.i4);
} }
Value popLong() { Value popLong() {
@ -1739,7 +1740,7 @@ class Frame {
Value popObject() { Value popObject() {
poppedObject(); poppedObject();
return popQuiet(1); return popQuiet(types.object);
} }
void loadInt(unsigned index) { void loadInt(unsigned index) {
@ -1773,7 +1774,7 @@ class Frame {
} }
void storeObjectOrAddress(unsigned index) { void storeObjectOrAddress(unsigned index) {
storeLocal(context, 1, popQuiet(1), index); storeLocal(context, 1, popQuiet(types.i4), index);
assert(t, sp >= 1); assert(t, sp >= 1);
assert(t, sp - 1 >= localSize()); assert(t, sp - 1 >= localSize());
@ -1793,8 +1794,8 @@ class Frame {
} }
void dupX1() { void dupX1() {
Value s0 = popQuiet(1); Value s0 = popQuiet(types.i4);
Value s1 = popQuiet(1); Value s1 = popQuiet(types.i4);
pushQuiet(types.i4, s0); pushQuiet(types.i4, s0);
pushQuiet(types.i4, s1); pushQuiet(types.i4, s1);
@ -1804,7 +1805,7 @@ class Frame {
} }
void dupX2() { void dupX2() {
Value s0 = popQuiet(1); Value s0 = popQuiet(types.i4);
if (get(sp - 2) == Long) { if (get(sp - 2) == Long) {
Value s1 = popLongQuiet(); Value s1 = popLongQuiet();
@ -1813,8 +1814,8 @@ class Frame {
pushLongQuiet(s1); pushLongQuiet(s1);
pushQuiet(types.i4, s0); pushQuiet(types.i4, s0);
} else { } else {
Value s1 = popQuiet(1); Value s1 = popQuiet(types.i4);
Value s2 = popQuiet(1); Value s2 = popQuiet(types.i4);
pushQuiet(types.i4, s0); pushQuiet(types.i4, s0);
pushQuiet(types.i4, s2); pushQuiet(types.i4, s2);
@ -1829,8 +1830,8 @@ class Frame {
if (get(sp - 1) == Long) { if (get(sp - 1) == Long) {
pushLongQuiet(c->peek(2, 0)); pushLongQuiet(c->peek(2, 0));
} else { } else {
Value s0 = popQuiet(1); Value s0 = popQuiet(types.i4);
Value s1 = popQuiet(1); Value s1 = popQuiet(types.i4);
pushQuiet(types.i4, s1); pushQuiet(types.i4, s1);
pushQuiet(types.i4, s0); pushQuiet(types.i4, s0);
@ -1844,15 +1845,15 @@ class Frame {
void dup2X1() { void dup2X1() {
if (get(sp - 1) == Long) { if (get(sp - 1) == Long) {
Value s0 = popLongQuiet(); Value s0 = popLongQuiet();
Value s1 = popQuiet(1); Value s1 = popQuiet(types.i4);
pushLongQuiet(s0); pushLongQuiet(s0);
pushQuiet(types.i4, s1); pushQuiet(types.i4, s1);
pushLongQuiet(s0); pushLongQuiet(s0);
} else { } else {
Value s0 = popQuiet(1); Value s0 = popQuiet(types.i4);
Value s1 = popQuiet(1); Value s1 = popQuiet(types.i4);
Value s2 = popQuiet(1); Value s2 = popQuiet(types.i4);
pushQuiet(types.i4, s1); pushQuiet(types.i4, s1);
pushQuiet(types.i4, s0); pushQuiet(types.i4, s0);
@ -1875,8 +1876,8 @@ class Frame {
pushLongQuiet(s1); pushLongQuiet(s1);
pushLongQuiet(s0); pushLongQuiet(s0);
} else { } else {
Value s1 = popQuiet(1); Value s1 = popQuiet(types.i4);
Value s2 = popQuiet(1); Value s2 = popQuiet(types.i4);
pushLongQuiet(s0); pushLongQuiet(s0);
pushQuiet(types.i4, s2); pushQuiet(types.i4, s2);
@ -1884,10 +1885,10 @@ class Frame {
pushLongQuiet(s0); pushLongQuiet(s0);
} }
} else { } else {
Value s0 = popQuiet(1); Value s0 = popQuiet(types.i4);
Value s1 = popQuiet(1); Value s1 = popQuiet(types.i4);
Value s2 = popQuiet(1); Value s2 = popQuiet(types.i4);
Value s3 = popQuiet(1); Value s3 = popQuiet(types.i4);
pushQuiet(types.i4, s1); pushQuiet(types.i4, s1);
pushQuiet(types.i4, s0); pushQuiet(types.i4, s0);
@ -1901,8 +1902,8 @@ class Frame {
} }
void swap() { void swap() {
Value s0 = popQuiet(1); Value s0 = popQuiet(types.i4);
Value s1 = popQuiet(1); Value s1 = popQuiet(types.i4);
pushQuiet(types.i4, s0); pushQuiet(types.i4, s0);
pushQuiet(types.i4, s1); pushQuiet(types.i4, s1);