This commit is contained in:
Joshua Warner 2014-07-16 18:07:56 -06:00 committed by Joshua Warner
parent 1ad1fe9048
commit 31de9a48c9
5 changed files with 165 additions and 181 deletions

View File

@ -31,11 +31,13 @@ class Args {
ir::Value* values[N]; ir::Value* values[N];
template <class... Ts> template <class... Ts>
Args(Ts... ts) : values{ts...} Args(Ts... ts)
: values{ts...}
{ {
} }
operator util::Slice<ir::Value*> () { operator util::Slice<ir::Value*>()
{
return util::Slice<ir::Value*>(&values[0], N); return util::Slice<ir::Value*>(&values[0], N);
} }
}; };
@ -51,7 +53,8 @@ inline Args<1> args(ir::Value* first)
} }
template <class... Ts> template <class... Ts>
inline Args<1 + util::ArgumentCount<Ts...>::Result> args(ir::Value* first, Ts... rest) inline Args<1 + util::ArgumentCount<Ts...>::Result> args(ir::Value* first,
Ts... rest)
{ {
return Args<1 + util::ArgumentCount<Ts...>::Result>{first, rest...}; return Args<1 + util::ArgumentCount<Ts...>::Result>{first, rest...};
} }

View File

@ -36,16 +36,12 @@ struct ArgumentCount;
template <class T, class... Ts> template <class T, class... Ts>
struct ArgumentCount<T, Ts...> { struct ArgumentCount<T, Ts...> {
enum { enum { Result = 1 + ArgumentCount<Ts...>::Result };
Result = 1 + ArgumentCount<Ts...>::Result
};
}; };
template <> template <>
struct ArgumentCount<> { struct ArgumentCount<> {
enum { enum { Result = 0 };
Result = 0
};
}; };
} // namespace util } // namespace util

View File

@ -3084,7 +3084,8 @@ bool useLongJump(MyThread* t, uintptr_t target)
void compileSafePoint(MyThread* t, Compiler* c, Frame* frame) void compileSafePoint(MyThread* t, Compiler* c, Frame* frame)
{ {
c->nativeCall(c->constant(getThunk(t, idleIfNecessaryThunk), ir::Type::iptr()), c->nativeCall(
c->constant(getThunk(t, idleIfNecessaryThunk), ir::Type::iptr()),
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
@ -3655,7 +3656,8 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target)
frame->pop(ir::Type::object()); frame->pop(ir::Type::object());
ir::Type type = MATCH(target->name(), "getInt") ? ir::Type::i4() ir::Type type = MATCH(target->name(), "getInt") ? ir::Type::i4()
: ir::Type::f4(); : ir::Type::f4();
frame->push(type, frame->push(
type,
c->load(ir::ExtendMode::Signed, c->memory(address, type), type)); c->load(ir::ExtendMode::Signed, c->memory(address, type), type));
return true; return true;
} else if ((MATCH(target->name(), "putInt") } else if ((MATCH(target->name(), "putInt")
@ -3677,7 +3679,8 @@ bool intrinsic(MyThread* t UNUSED, Frame* frame, GcMethod* target)
frame->pop(ir::Type::object()); frame->pop(ir::Type::object());
ir::Type type = MATCH(target->name(), "getLong") ? ir::Type::i8() ir::Type type = MATCH(target->name(), "getLong") ? ir::Type::i8()
: ir::Type::f8(); : ir::Type::f8();
frame->pushLarge(type, frame->pushLarge(
type,
c->load(ir::ExtendMode::Signed, c->memory(address, type), type)); c->load(ir::ExtendMode::Signed, c->memory(address, type), type));
return true; return true;
} else if ((MATCH(target->name(), "putLong") } else if ((MATCH(target->name(), "putLong")
@ -3916,7 +3919,8 @@ loop:
frame->pushObject(); frame->pushObject();
c->nativeCall(c->constant(getThunk(t, gcIfNecessaryThunk), ir::Type::iptr()), c->nativeCall(
c->constant(getThunk(t, gcIfNecessaryThunk), ir::Type::iptr()),
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
@ -4489,8 +4493,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(), frame->append(field->class_())));
frame->append(field->class_())));
} }
table = frame->append(field->class_()->staticTable()); table = frame->append(field->class_()->staticTable());
@ -4591,8 +4594,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(), frame->append(field)));
frame->append(field)));
} else { } else {
c->nullaryOp(lir::LoadBarrier); c->nullaryOp(lir::LoadBarrier);
} }
@ -4614,8 +4616,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
rType, rType,
args(c->threadRegister(), args(c->threadRegister(), frame->append(pair)));
frame->append(pair)));
} else { } else {
ir::Value* instance = frame->pop(ir::Type::object()); ir::Value* instance = frame->pop(ir::Type::object());
@ -4625,9 +4626,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
rType, rType,
args(c->threadRegister(), args(c->threadRegister(), frame->append(pair), instance));
frame->append(pair),
instance));
} }
frame->pushReturnValue(fieldCode, result); frame->pushReturnValue(fieldCode, result);
@ -4918,14 +4917,14 @@ loop:
thunk = instanceOfFromReferenceThunk; thunk = instanceOfFromReferenceThunk;
} }
frame->push(ir::Type::i4(), frame->push(
c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), ir::Type::i4(),
c->nativeCall(
c->constant(getThunk(t, thunk), ir::Type::iptr()),
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::i4(), ir::Type::i4(),
args(c->threadRegister(), args(c->threadRegister(), frame->append(argument), instance)));
frame->append(argument),
instance)));
} break; } break;
case invokeinterface: { case invokeinterface: {
@ -5122,7 +5121,8 @@ loop:
args(c->threadRegister(), args(c->threadRegister(),
frame->append(pair), frame->append(pair),
c->peek(1, c->peek(1,
methodReferenceParameterFootprint(t, ref, false) - 1))), methodReferenceParameterFootprint(t, ref, false)
- 1))),
ref, ref,
false, false,
isReferenceTailCall(t, code, ip, context->method, ref)); isReferenceTailCall(t, code, ip, context->method, ref));
@ -5254,10 +5254,7 @@ loop:
0, 0,
0, 0,
ir::Type::i4(), ir::Type::i4(),
args(nullptr, args(nullptr, a, nullptr, b)));
a,
nullptr,
b)));
} }
} break; } break;
@ -5302,20 +5299,21 @@ loop:
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::object(), ir::Type::object(),
args(c->threadRegister(), args(c->threadRegister(),
frame->append(makePair(t, context->method, reference))))); frame->append(
makePair(t, context->method, reference)))));
} }
} }
if (v) { if (v) {
if (objectClass(t, v) == type(t, GcClass::Type)) { if (objectClass(t, v) == type(t, GcClass::Type)) {
frame->push(ir::Type::object(), frame->push(
ir::Type::object(),
c->nativeCall(c->constant(getThunk(t, getJClass64Thunk), c->nativeCall(c->constant(getThunk(t, getJClass64Thunk),
ir::Type::iptr()), ir::Type::iptr()),
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::object(), ir::Type::object(),
args(c->threadRegister(), args(c->threadRegister(), frame->append(v))));
frame->append(v))));
} else { } else {
frame->push(ir::Type::object(), frame->append(v)); frame->push(ir::Type::object(), frame->append(v));
} }
@ -5539,8 +5537,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(), target));
target));
} break; } break;
case monitorexit: { case monitorexit: {
@ -5550,8 +5547,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(), target));
target));
} break; } break;
case multianewarray: { case multianewarray: {
@ -5620,13 +5616,13 @@ loop:
thunk = makeNewFromReferenceThunk; thunk = makeNewFromReferenceThunk;
} }
frame->push(ir::Type::object(), frame->push(
ir::Type::object(),
c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()), c->nativeCall(c->constant(getThunk(t, thunk), ir::Type::iptr()),
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::object(), ir::Type::object(),
args(c->threadRegister(), args(c->threadRegister(), frame->append(argument))));
frame->append(argument))));
} break; } break;
case newarray: { case newarray: {
@ -5683,8 +5679,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(), frame->append(field->class_())));
frame->append(field->class_())));
} }
staticTable = field->class_()->staticTable(); staticTable = field->class_()->staticTable();
@ -5707,8 +5702,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(), frame->append(field)));
frame->append(field)));
} else { } else {
c->nullaryOp(lir::StoreStoreBarrier); c->nullaryOp(lir::StoreStoreBarrier);
} }
@ -5780,7 +5774,8 @@ loop:
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(),
table, table,
c->constant(targetFieldOffset(context, field), ir::Type::i4()), c->constant(targetFieldOffset(context, field),
ir::Type::i4()),
value)); value));
} else { } else {
c->nativeCall( c->nativeCall(
@ -5790,7 +5785,8 @@ loop:
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(),
table, table,
c->constant(targetFieldOffset(context, field), ir::Type::i4()), c->constant(targetFieldOffset(context, field),
ir::Type::i4()),
value)); value));
} }
break; break;
@ -5807,8 +5803,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
ir::Type::void_(), ir::Type::void_(),
args(c->threadRegister(), args(c->threadRegister(), frame->append(field)));
frame->append(field)));
} else { } else {
c->nullaryOp(lir::StoreLoadBarrier); c->nullaryOp(lir::StoreLoadBarrier);
} }
@ -5837,37 +5832,32 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
rType, rType,
args(c->threadRegister(), args(c->threadRegister(), frame->append(pair), value));
frame->append(pair),
value));
} else { } else {
ir::Value* instance = frame->pop(ir::Type::object()); ir::Value* instance = frame->pop(ir::Type::object());
c->nativeCall(c->constant(getThunk(t, setFieldValueFromReferenceThunk), c->nativeCall(
c->constant(getThunk(t, setFieldValueFromReferenceThunk),
ir::Type::iptr()), ir::Type::iptr()),
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
rType, rType,
args(c->threadRegister(), args(
frame->append(pair), c->threadRegister(), frame->append(pair), instance, value));
instance,
value));
} }
} break; } break;
case DoubleField: case DoubleField:
case LongField: { case LongField: {
if (instruction == putstatic) { if (instruction == putstatic) {
c->nativeCall(c->constant( c->nativeCall(
c->constant(
getThunk(t, setStaticLongFieldValueFromReferenceThunk), getThunk(t, setStaticLongFieldValueFromReferenceThunk),
ir::Type::iptr()), ir::Type::iptr()),
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
rType, rType,
args(c->threadRegister(), args(c->threadRegister(), frame->append(pair), nullptr, value));
frame->append(pair),
nullptr,
value));
} else { } else {
ir::Value* instance = frame->pop(ir::Type::object()); ir::Value* instance = frame->pop(ir::Type::object());
@ -5894,9 +5884,7 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
rType, rType,
args(c->threadRegister(), args(c->threadRegister(), frame->append(pair), value));
frame->append(pair),
value));
} else { } else {
ir::Value* instance = frame->pop(ir::Type::object()); ir::Value* instance = frame->pop(ir::Type::object());
@ -5906,10 +5894,8 @@ loop:
0, 0,
frame->trace(0, 0), frame->trace(0, 0),
rType, rType,
args(c->threadRegister(), args(
frame->append(pair), c->threadRegister(), frame->append(pair), instance, value));
instance,
value));
} }
} break; } break;

View File

@ -1473,7 +1473,6 @@ void writeMap(Output* out, Module& module, Class* cl)
{ {
std::ostringstream ss; std::ostringstream ss;
for (const auto f : cl->fields) { for (const auto f : cl->fields) {
ss << "Type_"; ss << "Type_";
ss << enumName(module, f); ss << enumName(module, f);
if (f->nogc) { if (f->nogc) {