void MacroAssemblerX64::passABIArg(const MoveOperand& from, MoveOp::Type type) { MoveOperand to; switch (type) { case MoveOp::FLOAT32: case MoveOp::DOUBLE: { FloatRegister dest; if (GetFloatArgReg(passedIntArgs_, passedFloatArgs_++, &dest)) { // Convert to the right type of register. if (type == MoveOp::FLOAT32) dest = dest.asSingle(); if (from.isFloatReg() && from.floatReg() == dest) { // Nothing to do; the value is in the right register already return; } to = MoveOperand(dest); } else { to = MoveOperand(StackPointer, stackForCall_); switch (type) { case MoveOp::FLOAT32: stackForCall_ += sizeof(float); break; case MoveOp::DOUBLE: stackForCall_ += sizeof(double); break; default: MOZ_CRASH("Unexpected float register class argument type"); } } break; } case MoveOp::GENERAL: { Register dest; if (GetIntArgReg(passedIntArgs_++, passedFloatArgs_, &dest)) { if (from.isGeneralReg() && from.reg() == dest) { // Nothing to do; the value is in the right register already return; } to = MoveOperand(dest); } else { to = MoveOperand(StackPointer, stackForCall_); stackForCall_ += sizeof(int64_t); } break; } default: MOZ_CRASH("Unexpected argument type"); } enoughMemory_ = moveResolver_.addMove(from, to, type); }