void MacroAssemblerMIPS::passABIArg(const MoveOperand &from) { MoveOperand to; ++passedArgs_; if (passedArgs_ <= 4) { Register destReg; FloatRegister destFloatReg; if (from.isDouble() && GetArgFloatReg(passedArgs_, &destFloatReg)) { to = MoveOperand(destFloatReg); enoughMemory_ &= moveResolver_.addMove(from, to, MoveOp::DOUBLE); }else { GetArgReg(passedArgs_, &destReg); to = MoveOperand(destReg); enoughMemory_ &= moveResolver_.addMove(from, to, MoveOp::GENERAL); } } else { #if 1 to = MoveOperand(StackPointer, stackForCall_); if (from.isDouble()) { stackForCall_ += sizeof(double); enoughMemory_ &= moveResolver_.addMove(from, to, MoveOp::DOUBLE); } else { stackForCall_ += sizeof(int32_t); enoughMemory_ &= moveResolver_.addMove(from, to, MoveOp::GENERAL); } #endif } }
void MacroAssemblerX64::passABIArg(const MoveOperand &from) { MoveOperand to; if (from.isDouble()) { FloatRegister dest; if (GetFloatArgReg(passedIntArgs_, passedFloatArgs_++, &dest)) { 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_); stackForCall_ += sizeof(double); } enoughMemory_ = moveResolver_.addMove(from, to, Move::DOUBLE); } else { 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); } enoughMemory_ = moveResolver_.addMove(from, to, Move::GENERAL); } }
void MacroAssemblerX86::passABIArg(const MoveOperand &from) { ++passedArgs_; MoveOperand to = MoveOperand(StackPointer, stackForCall_); if (from.isDouble()) { stackForCall_ += sizeof(double); enoughMemory_ &= moveResolver_.addMove(from, to, Move::DOUBLE); } else { stackForCall_ += sizeof(int32_t); enoughMemory_ &= moveResolver_.addMove(from, to, Move::GENERAL); } }
void MacroAssemblerX64::passABIArg(const MoveOperand &from) { MoveOperand to; if (from.isDouble()) { FloatRegister dest; if (GetFloatArgReg(passedIntArgs_, passedFloatArgs_++, &dest)) { to = MoveOperand(dest); } else { to = MoveOperand(StackPointer, stackForCall_); stackForCall_ += sizeof(double); } enoughMemory_ = moveResolver_.addMove(from, to, Move::DOUBLE); } else { Register dest; if (GetIntArgReg(passedIntArgs_++, passedFloatArgs_, &dest)) { to = MoveOperand(dest); } else { to = MoveOperand(StackPointer, stackForCall_); stackForCall_ += sizeof(int64_t); } enoughMemory_ = moveResolver_.addMove(from, to, Move::GENERAL); } }