author | h4writer <hv1989@gmail.com> |
Thu, 29 Sep 2016 22:33:22 +0200 | |
changeset 315899 | 3a11c6866c92cc85911e9baa951f7f7b4c762c23 |
parent 315898 | a878585ab51022ffd457d5b4e2a7686f0b72c3f7 |
child 315900 | 72b020fd3ce14ea2a8e5c5548899a281c3f07f2e |
push id | 30757 |
push user | cbook@mozilla.com |
push date | Fri, 30 Sep 2016 10:02:43 +0000 |
treeherder | mozilla-central@5ffed033557e [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | lth |
bugs | 1301400 |
milestone | 52.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/asmjs/WasmBaselineCompile.cpp +++ b/js/src/asmjs/WasmBaselineCompile.cpp @@ -1074,16 +1074,62 @@ class BaseCompiler break; case Stk::None: break; default: MOZ_CRASH("Compiler bug: Expected int on stack"); } } +#ifdef JS_NUNBOX32 + void loadI64Low(Register r, Stk& src) { + switch (src.kind()) { + case Stk::ConstI64: + masm.move32(Imm64(src.i64val()).low(), r); + break; + case Stk::MemI64: + loadFromFrameI32(r, src.offs() - INT64LOW_OFFSET); + break; + case Stk::LocalI64: + loadFromFrameI32(r, frameOffsetFromSlot(src.slot(), MIRType::Int64) - INT64LOW_OFFSET); + break; + case Stk::RegisterI64: + if (src.i64reg().reg.low != r) + masm.move32(src.i64reg().reg.low, r); + break; + case Stk::None: + break; + default: + MOZ_CRASH("Compiler bug: Expected int on stack"); + } + } + + void loadI64High(Register r, Stk& src) { + switch (src.kind()) { + case Stk::ConstI64: + masm.move32(Imm64(src.i64val()).hi(), r); + break; + case Stk::MemI64: + loadFromFrameI32(r, src.offs() - INT64HIGH_OFFSET); + break; + case Stk::LocalI64: + loadFromFrameI32(r, frameOffsetFromSlot(src.slot(), MIRType::Int64) - INT64HIGH_OFFSET); + break; + case Stk::RegisterI64: + if (src.i64reg().reg.high != r) + masm.move32(src.i64reg().reg.high, r); + break; + case Stk::None: + break; + default: + MOZ_CRASH("Compiler bug: Expected int on stack"); + } + } +#endif + void loadF64(FloatRegister r, Stk& src) { switch (src.kind()) { case Stk::ConstF64: masm.loadConstantDouble(src.f64val(), r); break; case Stk::MemF64: loadFromFrameF64(r, src.offs()); break; @@ -2068,28 +2114,31 @@ class BaseCompiler loadI32(scratch, arg); masm.store32(scratch, Address(StackPointer, argLoc.offsetFromArgBase())); } else { loadI32(argLoc.gpr(), arg); } break; } case ValType::I64: { -#ifdef JS_CODEGEN_X64 ABIArg argLoc = call.abi_.next(MIRType::Int64); if (argLoc.kind() == ABIArg::Stack) { ScratchI32 scratch(*this); +#ifdef JS_PUNBOX64 loadI64(Register64(scratch), arg); masm.movq(scratch, Operand(StackPointer, argLoc.offsetFromArgBase())); +#else + loadI64Low(scratch, arg); + masm.move32(scratch, Operand(StackPointer, argLoc.offsetFromArgBase() + INT64LOW_OFFSET)); + loadI64High(scratch, arg); + masm.move32(scratch, Operand(StackPointer, argLoc.offsetFromArgBase() + INT64HIGH_OFFSET)); +#endif } else { loadI64(argLoc.gpr64(), arg); } -#else - MOZ_CRASH("BaseCompiler platform hook: passArg I64"); -#endif break; } case ValType::F64: { ABIArg argLoc = call.abi_.next(MIRType::Double); switch (argLoc.kind()) { case ABIArg::Stack: { ScratchF64 scratch(*this); loadF64(scratch, arg);