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

@ -25,17 +25,19 @@ class TraceHandler {
virtual void handleTrace(Promise* address, unsigned argumentIndex) = 0;
};
template<size_t N>
template <size_t N>
class Args {
public:
ir::Value* values[N];
template<class... Ts>
Args(Ts... ts) : values{ts...}
template <class... Ts>
Args(Ts... ts)
: values{ts...}
{
}
operator util::Slice<ir::Value*> () {
operator util::Slice<ir::Value*>()
{
return util::Slice<ir::Value*>(&values[0], N);
}
};
@ -47,13 +49,14 @@ inline Args<0> args()
inline Args<1> args(ir::Value* first)
{
return Args<1> { first};
return Args<1>{first};
}
template<class... Ts>
inline Args<1 + util::ArgumentCount<Ts...>::Result> args(ir::Value* first, Ts... rest)
template <class... Ts>
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...};
}
class Compiler {

View File

@ -31,21 +31,17 @@ struct NonConst {
typedef T Type;
};
template<class... Ts>
template <class... Ts>
struct ArgumentCount;
template<class T, class... Ts>
template <class T, class... Ts>
struct ArgumentCount<T, Ts...> {
enum {
Result = 1 + ArgumentCount<Ts...>::Result
};
enum { Result = 1 + ArgumentCount<Ts...>::Result };
};
template<>
template <>
struct ArgumentCount<> {
enum {
Result = 0
};
enum { Result = 0 };
};
} // namespace util

View File

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

View File

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