diff --git a/src/compile.cpp b/src/compile.cpp index f7f1fbe490..9bc57e2fa2 100644 --- a/src/compile.cpp +++ b/src/compile.cpp @@ -1388,6 +1388,18 @@ intToFloat(int32_t a) return floatToBits(static_cast(a)); } +uint64_t +longToDouble(int64_t a) +{ + return doubleToBits(static_cast(a)); +} + +uint32_t +longToFloat(int64_t a) +{ + return floatToBits(static_cast(a)); +} + object FORCE_ALIGN makeBlankObjectArray(Thread* t, object class_, int32_t length) { @@ -2800,6 +2812,30 @@ compile(MyThread* t, Frame* initialFrame, unsigned ip) frame->pop(1); } break; + case l2d: { + Operand* a = frame->popLong(); + + c->directCall + (c->constant(reinterpret_cast(longToDouble)), 2, 0, a); + + Operand* result = c->result8(); + frame->pushLong(result); + c->release(result); + c->release(a); + } break; + + case l2f: { + Operand* a = frame->popLong(); + + c->directCall + (c->constant(reinterpret_cast(longToDouble)), 2, 0, a); + + Operand* result = c->result4(); + frame->pushInt(result); + c->release(result); + c->release(a); + } break; + case l2i: frame->topLongToInt(); break;