use ir::Type in Compiler::store

This commit is contained in:
Joshua Warner 2014-04-30 22:33:54 -06:00 committed by Joshua Warner
parent 8af9bb8297
commit 2ed52c05a8
3 changed files with 57 additions and 40 deletions

View File

@ -110,7 +110,9 @@ class Compiler {
virtual void checkBounds(Operand* object, unsigned lengthOffset,
Operand* index, intptr_t handler) = 0;
virtual void store(unsigned srcSize, Operand* src, unsigned dstSize,
virtual void store(ir::Type srcType,
Operand* src,
ir::Type dstType,
Operand* dst) = 0;
virtual Operand* load(unsigned srcSize, unsigned srcSelectSize, Operand* src,
unsigned dstSize) = 0;

View File

@ -2593,11 +2593,18 @@ class MyCompiler: public Compiler {
static_cast<Value*>(index), handler);
}
virtual void store(unsigned srcSize, Operand* src, unsigned dstSize,
virtual void store(ir::Type srcType,
Operand* src,
ir::Type dstType,
Operand* dst)
{
appendMove(&c, lir::Move, srcSize, srcSize, static_cast<Value*>(src),
dstSize, static_cast<Value*>(dst));
appendMove(&c,
lir::Move,
srcType.size(),
srcType.size(),
static_cast<Value*>(src),
dstType.size(),
static_cast<Value*>(dst));
}
virtual Operand* load(unsigned srcSize, unsigned srcSelectSize, Operand* src,

View File

@ -3205,9 +3205,9 @@ compileDirectInvoke(MyThread* t, Frame* frame, object target, bool tailCall,
methodParameterFootprint(t, target));
c->store(
TargetBytesPerWord,
types.address,
frame->absoluteAddressOperand(returnAddressPromise),
TargetBytesPerWord,
types.address,
c->memory(
c->threadRegister(), types.address, TARGET_THREAD_TAILADDRESS));
@ -3764,8 +3764,10 @@ intrinsic(MyThread* t, Frame* frame, object target)
Compiler::Operand* value = frame->popInt();
Compiler::Operand* address = popLongAddress(frame);
frame->popObject();
c->store(
TargetBytesPerWord, value, 1, c->memory(address, types.i4, 0, 0, 1));
c->store(types.address,
value,
types.i1,
c->memory(address, types.i4, 0, 0, 1));
return true;
} else if ((MATCH(methodName(t, target), "getShort")
and MATCH(methodSpec(t, target), "(J)S"))
@ -3785,8 +3787,10 @@ intrinsic(MyThread* t, Frame* frame, object target)
Compiler::Operand* value = frame->popInt();
Compiler::Operand* address = popLongAddress(frame);
frame->popObject();
c->store(
TargetBytesPerWord, value, 2, c->memory(address, types.i4, 0, 0, 1));
c->store(types.address,
value,
types.i2,
c->memory(address, types.i4, 0, 0, 1));
return true;
} else if ((MATCH(methodName(t, target), "getInt")
and MATCH(methodSpec(t, target), "(J)I"))
@ -3814,9 +3818,9 @@ intrinsic(MyThread* t, Frame* frame, object target)
Compiler::Operand* value = frame->popInt();
Compiler::Operand* address = popLongAddress(frame);
frame->popObject();
c->store(TargetBytesPerWord,
c->store(types.address,
value,
4,
types.i4,
c->memory(
address,
MATCH(methodName(t, target), "putInt") ? types.i4 : types.f4,
@ -3850,9 +3854,9 @@ intrinsic(MyThread* t, Frame* frame, object target)
Compiler::Operand* value = frame->popLong();
Compiler::Operand* address = popLongAddress(frame);
frame->popObject();
c->store(8,
c->store(types.i8,
value,
8,
types.i8,
c->memory(address,
MATCH(methodName(t, target), "putLong") ? types.i4
: types.f4,
@ -3876,9 +3880,9 @@ intrinsic(MyThread* t, Frame* frame, object target)
Compiler::Operand* value = frame->popLong();
Compiler::Operand* address = popLongAddress(frame);
frame->popObject();
c->store(8,
c->store(types.i8,
value,
TargetBytesPerWord,
types.address,
c->memory(address, types.address, 0, 0, 1));
return true;
}
@ -4236,42 +4240,46 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
} break;
case fastore:
c->store(TargetBytesPerWord,
c->store(types.address,
value,
4,
types.f4,
c->memory(array, types.f4, TargetArrayBody, index, 4));
break;
case iastore:
c->store(TargetBytesPerWord,
c->store(types.address,
value,
4,
types.f4,
c->memory(array, types.i4, TargetArrayBody, index, 4));
break;
case bastore:
c->store(TargetBytesPerWord,
c->store(types.address,
value,
1,
types.i1,
c->memory(array, types.i4, TargetArrayBody, index, 1));
break;
case castore:
case sastore:
c->store(TargetBytesPerWord,
c->store(types.address,
value,
2,
types.i2,
c->memory(array, types.i4, TargetArrayBody, index, 2));
break;
case dastore:
c->store(
8, value, 8, c->memory(array, types.f4, TargetArrayBody, index, 8));
c->store(types.f8,
value,
types.f8,
c->memory(array, types.f4, TargetArrayBody, index, 8));
break;
case lastore:
c->store(
8, value, 8, c->memory(array, types.i4, TargetArrayBody, index, 8));
c->store(types.i8,
value,
types.f8,
c->memory(array, types.i4, TargetArrayBody, index, 8));
break;
}
} break;
@ -5834,9 +5842,9 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
case ByteField:
case BooleanField:
c->store(
TargetBytesPerWord,
types.address,
value,
1,
types.i1,
c->memory(
table, types.i4, targetFieldOffset(context, field), 0, 1));
break;
@ -5844,45 +5852,45 @@ compile(MyThread* t, Frame* initialFrame, unsigned initialIp,
case CharField:
case ShortField:
c->store(
TargetBytesPerWord,
types.address,
value,
2,
types.i2,
c->memory(
table, types.i4, targetFieldOffset(context, field), 0, 1));
break;
case FloatField:
c->store(
TargetBytesPerWord,
types.address,
value,
4,
types.f4,
c->memory(
table, types.f4, targetFieldOffset(context, field), 0, 1));
break;
case IntField:
c->store(
TargetBytesPerWord,
types.address,
value,
4,
types.i4,
c->memory(
table, types.i4, targetFieldOffset(context, field), 0, 1));
break;
case DoubleField:
c->store(
8,
types.f8,
value,
8,
types.f8,
c->memory(
table, types.f4, targetFieldOffset(context, field), 0, 1));
break;
case LongField:
c->store(
8,
types.i8,
value,
8,
types.i8,
c->memory(
table, types.i4, targetFieldOffset(context, field), 0, 1));
break;