Commit 31a3f68d authored by yangguo's avatar yangguo Committed by Commit bot

Revert of [turbofan] Various fixes to allow unboxed doubles as arguments in...

Revert of [turbofan] Various fixes to allow unboxed doubles as arguments in registers and on the stack. (patchset #7 id:120001 of https://codereview.chromium.org/1263033004/ )

Reason for revert:
This CL breaks MIPS (roll blocker).

https://build.chromium.org/p/client.v8/builders/V8%20Linux%20-%20mipsel%20-%20sim/builds/2061/steps/Check/logs/Run_Int32_Select_1

Original issue's description:
> [turbofan] Various fixes to allow unboxed doubles as arguments in registers and on the stack.
>
> R=jarin@chromium.org
> BUG=
>
> Committed: https://crrev.com/71409be5395f867bbca0f6998bf6caa175cd8192
> Cr-Commit-Position: refs/heads/master@{#30091}

TBR=jarin@chromium.org,titzer@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=

Review URL: https://codereview.chromium.org/1284853002

Cr-Commit-Position: refs/heads/master@{#30101}
parent a946401a
...@@ -147,9 +147,12 @@ class ArmOperandConverter final : public InstructionOperandConverter { ...@@ -147,9 +147,12 @@ class ArmOperandConverter final : public InstructionOperandConverter {
MemOperand ToMemOperand(InstructionOperand* op) const { MemOperand ToMemOperand(InstructionOperand* op) const {
DCHECK(op != NULL); DCHECK(op != NULL);
DCHECK(!op->IsRegister());
DCHECK(!op->IsDoubleRegister());
DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
FrameOffset offset = // The linkage computes where all spill slots are located.
linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); FrameOffset offset = linkage()->GetFrameOffset(
AllocatedOperand::cast(op)->index(), frame(), 0);
return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset());
} }
}; };
...@@ -989,8 +992,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -989,8 +992,6 @@ void CodeGenerator::AssemblePrologue() {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else {
frame()->SetPCOnStack(false);
} }
if (info()->is_osr()) { if (info()->is_osr()) {
...@@ -1018,7 +1019,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1018,7 +1019,6 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount(); int stack_slots = frame()->GetSpillSlotCount();
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
...@@ -1041,17 +1041,23 @@ void CodeGenerator::AssembleReturn() { ...@@ -1041,17 +1041,23 @@ void CodeGenerator::AssembleReturn() {
} }
} }
__ LeaveFrame(StackFrame::MANUAL); __ LeaveFrame(StackFrame::MANUAL);
__ Ret();
} else if (descriptor->IsJSFunctionCall() || needs_frame_) { } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now. // Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) { if (return_label_.is_bound()) {
__ b(&return_label_); __ b(&return_label_);
return;
} else { } else {
__ bind(&return_label_); __ bind(&return_label_);
__ LeaveFrame(StackFrame::MANUAL); __ LeaveFrame(StackFrame::MANUAL);
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (pop_count != 0) {
__ Drop(pop_count);
}
__ Ret();
} }
} else {
__ Ret();
} }
__ Ret(pop_count);
} }
......
...@@ -184,9 +184,12 @@ class Arm64OperandConverter final : public InstructionOperandConverter { ...@@ -184,9 +184,12 @@ class Arm64OperandConverter final : public InstructionOperandConverter {
MemOperand ToMemOperand(InstructionOperand* op, MacroAssembler* masm) const { MemOperand ToMemOperand(InstructionOperand* op, MacroAssembler* masm) const {
DCHECK(op != NULL); DCHECK(op != NULL);
DCHECK(!op->IsRegister());
DCHECK(!op->IsDoubleRegister());
DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
FrameOffset offset = // The linkage computes where all spill slots are located.
linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); FrameOffset offset = linkage()->GetFrameOffset(
AllocatedOperand::cast(op)->index(), frame(), 0);
return MemOperand(offset.from_stack_pointer() ? masm->StackPointer() : fp, return MemOperand(offset.from_stack_pointer() ? masm->StackPointer() : fp,
offset.offset()); offset.offset());
} }
...@@ -1115,8 +1118,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1115,8 +1118,6 @@ void CodeGenerator::AssemblePrologue() {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else {
frame()->SetPCOnStack(false);
} }
if (info()->is_osr()) { if (info()->is_osr()) {
...@@ -1148,7 +1149,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1148,7 +1149,6 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount(); int stack_slots = frame()->GetSpillSlotCount();
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
...@@ -1169,19 +1169,24 @@ void CodeGenerator::AssembleReturn() { ...@@ -1169,19 +1169,24 @@ void CodeGenerator::AssembleReturn() {
__ Mov(csp, fp); __ Mov(csp, fp);
__ Pop(fp, lr); __ Pop(fp, lr);
__ Ret();
} else if (descriptor->IsJSFunctionCall() || needs_frame_) { } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now. // Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) { if (return_label_.is_bound()) {
__ B(&return_label_); __ B(&return_label_);
return;
} else { } else {
__ Bind(&return_label_); __ Bind(&return_label_);
__ Mov(jssp, fp); __ Mov(jssp, fp);
__ Pop(fp, lr); __ Pop(fp, lr);
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (pop_count != 0) {
__ Drop(pop_count);
}
__ Ret();
} }
} else {
__ Ret();
} }
__ Drop(pop_count);
__ Ret();
} }
......
...@@ -22,8 +22,7 @@ class Frame : public ZoneObject { ...@@ -22,8 +22,7 @@ class Frame : public ZoneObject {
spill_slot_count_(0), spill_slot_count_(0),
osr_stack_slot_count_(0), osr_stack_slot_count_(0),
allocated_registers_(NULL), allocated_registers_(NULL),
allocated_double_registers_(NULL), allocated_double_registers_(NULL) {}
pc_on_stack_(true) {}
inline int GetSpillSlotCount() { return spill_slot_count_; } inline int GetSpillSlotCount() { return spill_slot_count_; }
...@@ -72,17 +71,12 @@ class Frame : public ZoneObject { ...@@ -72,17 +71,12 @@ class Frame : public ZoneObject {
spill_slot_count_ = static_cast<int>(slot_count); spill_slot_count_ = static_cast<int>(slot_count);
} }
void SetPCOnStack(bool val) { pc_on_stack_ = val; }
int PCOnStackSize() { return pc_on_stack_ ? kRegisterSize : 0; }
private: private:
int register_save_area_size_; int register_save_area_size_;
int spill_slot_count_; int spill_slot_count_;
int osr_stack_slot_count_; int osr_stack_slot_count_;
BitVector* allocated_registers_; BitVector* allocated_registers_;
BitVector* allocated_double_registers_; BitVector* allocated_double_registers_;
bool pc_on_stack_;
DISALLOW_COPY_AND_ASSIGN(Frame); DISALLOW_COPY_AND_ASSIGN(Frame);
}; };
......
...@@ -46,10 +46,10 @@ class IA32OperandConverter : public InstructionOperandConverter { ...@@ -46,10 +46,10 @@ class IA32OperandConverter : public InstructionOperandConverter {
return Operand(ToDoubleRegister(op)); return Operand(ToDoubleRegister(op));
} }
DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
FrameOffset offset = // The linkage computes where all spill slots are located.
linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); FrameOffset offset = linkage()->GetFrameOffset(
return Operand(offset.from_stack_pointer() ? esp : ebp, AllocatedOperand::cast(op)->index(), frame(), extra);
offset.offset() + extra); return Operand(offset.from_stack_pointer() ? esp : ebp, offset.offset());
} }
Operand HighOperand(InstructionOperand* op) { Operand HighOperand(InstructionOperand* op) {
...@@ -1325,26 +1325,31 @@ void CodeGenerator::AssembleReturn() { ...@@ -1325,26 +1325,31 @@ void CodeGenerator::AssembleReturn() {
} }
} }
__ pop(ebp); // Pop caller's frame pointer. __ pop(ebp); // Pop caller's frame pointer.
__ ret(0);
} else { } else {
// No saved registers. // No saved registers.
__ mov(esp, ebp); // Move stack pointer back to frame pointer. __ mov(esp, ebp); // Move stack pointer back to frame pointer.
__ pop(ebp); // Pop caller's frame pointer. __ pop(ebp); // Pop caller's frame pointer.
__ ret(0);
} }
} else if (descriptor->IsJSFunctionCall() || needs_frame_) { } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now. // Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) { if (return_label_.is_bound()) {
__ jmp(&return_label_); __ jmp(&return_label_);
return;
} else { } else {
__ bind(&return_label_); __ bind(&return_label_);
__ mov(esp, ebp); // Move stack pointer back to frame pointer. __ mov(esp, ebp); // Move stack pointer back to frame pointer.
__ pop(ebp); // Pop caller's frame pointer. __ pop(ebp); // Pop caller's frame pointer.
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (pop_count == 0) {
__ ret(0);
} else {
__ Ret(pop_count * kPointerSize, ebx);
}
} }
} else {
__ ret(0);
} }
size_t pop_size = descriptor->StackParameterCount() * kPointerSize;
// Might need ecx for scratch if pop_size is too big.
DCHECK_EQ(0, descriptor->CalleeSavedRegisters() & ecx.bit());
__ Ret(static_cast<int>(pop_size), ecx);
} }
......
...@@ -70,7 +70,7 @@ std::ostream& operator<<(std::ostream& os, const CallDescriptor::Kind& k) { ...@@ -70,7 +70,7 @@ std::ostream& operator<<(std::ostream& os, const CallDescriptor::Kind& k) {
std::ostream& operator<<(std::ostream& os, const CallDescriptor& d) { std::ostream& operator<<(std::ostream& os, const CallDescriptor& d) {
// TODO(svenpanne) Output properties etc. and be less cryptic. // TODO(svenpanne) Output properties etc. and be less cryptic.
return os << d.kind() << ":" << d.debug_name() << ":r" << d.ReturnCount() return os << d.kind() << ":" << d.debug_name() << ":r" << d.ReturnCount()
<< "s" << d.StackParameterCount() << "i" << d.InputCount() << "f" << "j" << d.JSParameterCount() << "i" << d.InputCount() << "f"
<< d.FrameStateCount() << "t" << d.SupportsTailCalls(); << d.FrameStateCount() << "t" << d.SupportsTailCalls();
} }
...@@ -189,7 +189,8 @@ CallDescriptor* Linkage::ComputeIncoming(Zone* zone, CompilationInfo* info) { ...@@ -189,7 +189,8 @@ CallDescriptor* Linkage::ComputeIncoming(Zone* zone, CompilationInfo* info) {
} }
FrameOffset Linkage::GetFrameOffset(int spill_slot, Frame* frame) const { FrameOffset Linkage::GetFrameOffset(int spill_slot, Frame* frame,
int extra) const {
if (frame->GetSpillSlotCount() > 0 || incoming_->IsJSFunctionCall() || if (frame->GetSpillSlotCount() > 0 || incoming_->IsJSFunctionCall() ||
incoming_->kind() == CallDescriptor::kCallAddress) { incoming_->kind() == CallDescriptor::kCallAddress) {
int offset; int offset;
...@@ -197,11 +198,12 @@ FrameOffset Linkage::GetFrameOffset(int spill_slot, Frame* frame) const { ...@@ -197,11 +198,12 @@ FrameOffset Linkage::GetFrameOffset(int spill_slot, Frame* frame) const {
if (spill_slot >= 0) { if (spill_slot >= 0) {
// Local or spill slot. Skip the frame pointer, function, and // Local or spill slot. Skip the frame pointer, function, and
// context in the fixed part of the frame. // context in the fixed part of the frame.
offset = -(spill_slot + 1) * kPointerSize - register_save_area_size; offset =
-(spill_slot + 1) * kPointerSize - register_save_area_size + extra;
} else { } else {
// Incoming parameter. Skip the return address. // Incoming parameter. Skip the return address.
offset = -(spill_slot + 1) * kPointerSize + kFPOnStackSize + offset = -(spill_slot + 1) * kPointerSize + kFPOnStackSize +
frame->PCOnStackSize(); kPCOnStackSize + extra;
} }
return FrameOffset::FromFramePointer(offset); return FrameOffset::FromFramePointer(offset);
} else { } else {
...@@ -209,7 +211,7 @@ FrameOffset Linkage::GetFrameOffset(int spill_slot, Frame* frame) const { ...@@ -209,7 +211,7 @@ FrameOffset Linkage::GetFrameOffset(int spill_slot, Frame* frame) const {
DCHECK(spill_slot < 0); // Must be a parameter. DCHECK(spill_slot < 0); // Must be a parameter.
int register_save_area_size = frame->GetRegisterSaveAreaSize(); int register_save_area_size = frame->GetRegisterSaveAreaSize();
int offset = register_save_area_size - (spill_slot + 1) * kPointerSize + int offset = register_save_area_size - (spill_slot + 1) * kPointerSize +
frame->PCOnStackSize(); kPCOnStackSize + extra;
return FrameOffset::FromStackPointer(offset); return FrameOffset::FromStackPointer(offset);
} }
} }
......
...@@ -313,8 +313,9 @@ class Linkage : public ZoneObject { ...@@ -313,8 +313,9 @@ class Linkage : public ZoneObject {
// Get the frame offset for a given spill slot. The location depends on the // Get the frame offset for a given spill slot. The location depends on the
// calling convention and the specific frame layout, and may thus be // calling convention and the specific frame layout, and may thus be
// architecture-specific. Negative spill slots indicate arguments on the // architecture-specific. Negative spill slots indicate arguments on the
// caller's frame. // caller's frame. The {extra} parameter indicates an additional offset from
FrameOffset GetFrameOffset(int spill_slot, Frame* frame) const; // the frame offset, e.g. to index into part of a double slot.
FrameOffset GetFrameOffset(int spill_slot, Frame* frame, int extra = 0) const;
static int FrameStateInputCount(Runtime::FunctionId function); static int FrameStateInputCount(Runtime::FunctionId function);
......
...@@ -116,11 +116,6 @@ inline int ElementSizeOf(MachineType machine_type) { ...@@ -116,11 +116,6 @@ inline int ElementSizeOf(MachineType machine_type) {
return 1 << shift; return 1 << shift;
} }
inline bool IsFloatingPoint(MachineType type) {
MachineType rep = RepresentationOf(type);
return rep == kRepFloat32 || rep == kRepFloat64;
}
typedef Signature<MachineType> MachineSignature; typedef Signature<MachineType> MachineSignature;
} // namespace compiler } // namespace compiler
......
...@@ -106,9 +106,12 @@ class MipsOperandConverter final : public InstructionOperandConverter { ...@@ -106,9 +106,12 @@ class MipsOperandConverter final : public InstructionOperandConverter {
MemOperand ToMemOperand(InstructionOperand* op) const { MemOperand ToMemOperand(InstructionOperand* op) const {
DCHECK(op != NULL); DCHECK(op != NULL);
DCHECK(!op->IsRegister());
DCHECK(!op->IsDoubleRegister());
DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
FrameOffset offset = // The linkage computes where all spill slots are located.
linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); FrameOffset offset = linkage()->GetFrameOffset(
AllocatedOperand::cast(op)->index(), frame(), 0);
return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset());
} }
}; };
...@@ -1097,8 +1100,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1097,8 +1100,6 @@ void CodeGenerator::AssemblePrologue() {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else {
frame()->SetPCOnStack(false);
} }
if (info()->is_osr()) { if (info()->is_osr()) {
...@@ -1126,7 +1127,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1126,7 +1127,6 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount(); int stack_slots = frame()->GetSpillSlotCount();
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
...@@ -1143,19 +1143,22 @@ void CodeGenerator::AssembleReturn() { ...@@ -1143,19 +1143,22 @@ void CodeGenerator::AssembleReturn() {
} }
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
__ Ret();
} else if (descriptor->IsJSFunctionCall() || needs_frame_) { } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now. // Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) { if (return_label_.is_bound()) {
__ Branch(&return_label_); __ Branch(&return_label_);
return;
} else { } else {
__ bind(&return_label_); __ bind(&return_label_);
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (pop_count != 0) {
__ DropAndRet(pop_count);
} else {
__ Ret();
}
} }
}
if (pop_count != 0) {
__ DropAndRet(pop_count);
} else { } else {
__ Ret(); __ Ret();
} }
......
...@@ -106,9 +106,12 @@ class MipsOperandConverter final : public InstructionOperandConverter { ...@@ -106,9 +106,12 @@ class MipsOperandConverter final : public InstructionOperandConverter {
MemOperand ToMemOperand(InstructionOperand* op) const { MemOperand ToMemOperand(InstructionOperand* op) const {
DCHECK(op != NULL); DCHECK(op != NULL);
DCHECK(!op->IsRegister());
DCHECK(!op->IsDoubleRegister());
DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
FrameOffset offset = // The linkage computes where all spill slots are located.
linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); FrameOffset offset = linkage()->GetFrameOffset(
AllocatedOperand::cast(op)->index(), frame(), 0);
return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset());
} }
}; };
...@@ -1173,8 +1176,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1173,8 +1176,6 @@ void CodeGenerator::AssemblePrologue() {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else {
frame()->SetPCOnStack(false);
} }
if (info()->is_osr()) { if (info()->is_osr()) {
...@@ -1202,7 +1203,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1202,7 +1203,6 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount(); int stack_slots = frame()->GetSpillSlotCount();
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
...@@ -1219,19 +1219,22 @@ void CodeGenerator::AssembleReturn() { ...@@ -1219,19 +1219,22 @@ void CodeGenerator::AssembleReturn() {
} }
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
__ Ret();
} else if (descriptor->IsJSFunctionCall() || needs_frame_) { } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now. // Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) { if (return_label_.is_bound()) {
__ Branch(&return_label_); __ Branch(&return_label_);
return;
} else { } else {
__ bind(&return_label_); __ bind(&return_label_);
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (pop_count != 0) {
__ DropAndRet(pop_count);
} else {
__ Ret();
}
} }
}
if (pop_count != 0) {
__ DropAndRet(pop_count);
} else { } else {
__ Ret(); __ Ret();
} }
......
...@@ -99,9 +99,12 @@ class PPCOperandConverter final : public InstructionOperandConverter { ...@@ -99,9 +99,12 @@ class PPCOperandConverter final : public InstructionOperandConverter {
MemOperand ToMemOperand(InstructionOperand* op) const { MemOperand ToMemOperand(InstructionOperand* op) const {
DCHECK(op != NULL); DCHECK(op != NULL);
DCHECK(!op->IsRegister());
DCHECK(!op->IsDoubleRegister());
DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
FrameOffset offset = // The linkage computes where all spill slots are located.
linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); FrameOffset offset = linkage()->GetFrameOffset(
AllocatedOperand::cast(op)->index(), frame(), 0);
return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset());
} }
}; };
...@@ -1357,7 +1360,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1357,7 +1360,6 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount(); int stack_slots = frame()->GetSpillSlotCount();
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
...@@ -1376,17 +1378,21 @@ void CodeGenerator::AssembleReturn() { ...@@ -1376,17 +1378,21 @@ void CodeGenerator::AssembleReturn() {
const RegList saves = descriptor->CalleeSavedRegisters() & ~frame_saves; const RegList saves = descriptor->CalleeSavedRegisters() & ~frame_saves;
__ MultiPop(saves); __ MultiPop(saves);
} }
__ LeaveFrame(StackFrame::MANUAL);
__ Ret();
} else if (descriptor->IsJSFunctionCall() || needs_frame_) { } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now. // Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) { if (return_label_.is_bound()) {
__ b(&return_label_); __ b(&return_label_);
return;
} else { } else {
__ bind(&return_label_); __ bind(&return_label_);
int pop_count = static_cast<int>(descriptor->StackParameterCount());
__ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
__ Ret();
} }
} else {
__ Ret();
} }
__ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
__ Ret();
} }
......
...@@ -100,22 +100,6 @@ void RawMachineAssembler::Return(Node* value) { ...@@ -100,22 +100,6 @@ void RawMachineAssembler::Return(Node* value) {
} }
Node* RawMachineAssembler::CallN(CallDescriptor* desc, Node* function,
Node** args) {
int param_count =
static_cast<int>(desc->GetMachineSignature()->parameter_count());
Node** buffer = zone()->NewArray<Node*>(param_count + 1);
int index = 0;
buffer[index++] = function;
for (int i = 0; i < param_count; i++) {
buffer[index++] = args[i];
}
Node* call = graph()->NewNode(common()->Call(desc), param_count + 1, buffer);
schedule()->AddNode(CurrentBlock(), call);
return call;
}
Node* RawMachineAssembler::CallFunctionStub0(Node* function, Node* receiver, Node* RawMachineAssembler::CallFunctionStub0(Node* function, Node* receiver,
Node* context, Node* frame_state, Node* context, Node* frame_state,
CallFunctionFlags flags) { CallFunctionFlags flags) {
......
...@@ -479,28 +479,25 @@ class RawMachineAssembler { ...@@ -479,28 +479,25 @@ class RawMachineAssembler {
return HeapConstant(isolate()->factory()->InternalizeUtf8String(string)); return HeapConstant(isolate()->factory()->InternalizeUtf8String(string));
} }
// Call a given call descriptor and the given arguments.
Node* CallN(CallDescriptor* desc, Node* function, Node** args);
// Call through CallFunctionStub with lazy deopt and frame-state. // Call through CallFunctionStub with lazy deopt and frame-state.
Node* CallFunctionStub0(Node* function, Node* receiver, Node* context, Node* CallFunctionStub0(Node* function, Node* receiver, Node* context,
Node* frame_state, CallFunctionFlags flags); Node* frame_state, CallFunctionFlags flags);
// Call to a JS function with zero arguments. // Call to a JS function with zero parameters.
Node* CallJS0(Node* function, Node* receiver, Node* context, Node* CallJS0(Node* function, Node* receiver, Node* context,
Node* frame_state); Node* frame_state);
// Call to a runtime function with zero arguments. // Call to a runtime function with zero parameters.
Node* CallRuntime1(Runtime::FunctionId function, Node* arg0, Node* context, Node* CallRuntime1(Runtime::FunctionId function, Node* arg0, Node* context,
Node* frame_state); Node* frame_state);
// Call to a C function with zero arguments. // Call to a C function with zero parameters.
Node* CallCFunction0(MachineType return_type, Node* function); Node* CallCFunction0(MachineType return_type, Node* function);
// Call to a C function with one parameter. // Call to a C function with one parameter.
Node* CallCFunction1(MachineType return_type, MachineType arg0_type, Node* CallCFunction1(MachineType return_type, MachineType arg0_type,
Node* function, Node* arg0); Node* function, Node* arg0);
// Call to a C function with two arguments. // Call to a C function with two parameters.
Node* CallCFunction2(MachineType return_type, MachineType arg0_type, Node* CallCFunction2(MachineType return_type, MachineType arg0_type,
MachineType arg1_type, Node* function, Node* arg0, MachineType arg1_type, Node* function, Node* arg0,
Node* arg1); Node* arg1);
// Call to a C function with eight arguments. // Call to a C function with eight parameters.
Node* CallCFunction8(MachineType return_type, MachineType arg0_type, Node* CallCFunction8(MachineType return_type, MachineType arg0_type,
MachineType arg1_type, MachineType arg2_type, MachineType arg1_type, MachineType arg2_type,
MachineType arg3_type, MachineType arg4_type, MachineType arg3_type, MachineType arg4_type,
......
...@@ -155,7 +155,7 @@ void RegisterAllocatorVerifier::BuildConstraint(const InstructionOperand* op, ...@@ -155,7 +155,7 @@ void RegisterAllocatorVerifier::BuildConstraint(const InstructionOperand* op,
int vreg = unallocated->virtual_register(); int vreg = unallocated->virtual_register();
constraint->virtual_register_ = vreg; constraint->virtual_register_ = vreg;
if (unallocated->basic_policy() == UnallocatedOperand::FIXED_SLOT) { if (unallocated->basic_policy() == UnallocatedOperand::FIXED_SLOT) {
constraint->type_ = sequence()->IsFloat(vreg) ? kDoubleSlot : kSlot; constraint->type_ = kFixedSlot;
constraint->value_ = unallocated->fixed_slot_index(); constraint->value_ = unallocated->fixed_slot_index();
} else { } else {
switch (unallocated->extended_policy()) { switch (unallocated->extended_policy()) {
...@@ -185,7 +185,11 @@ void RegisterAllocatorVerifier::BuildConstraint(const InstructionOperand* op, ...@@ -185,7 +185,11 @@ void RegisterAllocatorVerifier::BuildConstraint(const InstructionOperand* op,
} }
break; break;
case UnallocatedOperand::MUST_HAVE_SLOT: case UnallocatedOperand::MUST_HAVE_SLOT:
constraint->type_ = sequence()->IsFloat(vreg) ? kDoubleSlot : kSlot; if (sequence()->IsFloat(vreg)) {
constraint->type_ = kDoubleSlot;
} else {
constraint->type_ = kSlot;
}
break; break;
case UnallocatedOperand::SAME_AS_FIRST_INPUT: case UnallocatedOperand::SAME_AS_FIRST_INPUT:
constraint->type_ = kSameAsFirst; constraint->type_ = kSameAsFirst;
......
...@@ -1242,11 +1242,8 @@ InstructionOperand* ConstraintBuilder::AllocateFixed( ...@@ -1242,11 +1242,8 @@ InstructionOperand* ConstraintBuilder::AllocateFixed(
machine_type = data()->MachineTypeFor(virtual_register); machine_type = data()->MachineTypeFor(virtual_register);
} }
if (operand->HasFixedSlotPolicy()) { if (operand->HasFixedSlotPolicy()) {
AllocatedOperand::AllocatedKind kind = allocated = AllocatedOperand(AllocatedOperand::STACK_SLOT, machine_type,
IsFloatingPoint(machine_type) ? AllocatedOperand::DOUBLE_STACK_SLOT operand->fixed_slot_index());
: AllocatedOperand::STACK_SLOT;
allocated =
AllocatedOperand(kind, machine_type, operand->fixed_slot_index());
} else if (operand->HasFixedRegisterPolicy()) { } else if (operand->HasFixedRegisterPolicy()) {
allocated = AllocatedOperand(AllocatedOperand::REGISTER, machine_type, allocated = AllocatedOperand(AllocatedOperand::REGISTER, machine_type,
operand->fixed_register_index()); operand->fixed_register_index());
......
...@@ -48,10 +48,10 @@ class X64OperandConverter : public InstructionOperandConverter { ...@@ -48,10 +48,10 @@ class X64OperandConverter : public InstructionOperandConverter {
Operand ToOperand(InstructionOperand* op, int extra = 0) { Operand ToOperand(InstructionOperand* op, int extra = 0) {
DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
FrameOffset offset = // The linkage computes where all spill slots are located.
linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); FrameOffset offset = linkage()->GetFrameOffset(
return Operand(offset.from_stack_pointer() ? rsp : rbp, AllocatedOperand::cast(op)->index(), frame(), extra);
offset.offset() + extra); return Operand(offset.from_stack_pointer() ? rsp : rbp, offset.offset());
} }
static size_t NextOffset(size_t* offset) { static size_t NextOffset(size_t* offset) {
...@@ -1219,10 +1219,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { ...@@ -1219,10 +1219,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
} else { } else {
if (instr->InputAt(0)->IsRegister()) { if (instr->InputAt(0)->IsRegister()) {
__ pushq(i.InputRegister(0)); __ pushq(i.InputRegister(0));
} else if (instr->InputAt(0)->IsDoubleRegister()) {
// TODO(titzer): use another machine instruction?
__ subq(rsp, Immediate(kDoubleSize));
__ movsd(Operand(rsp, 0), i.InputDoubleRegister(0));
} else { } else {
__ pushq(i.InputOperand(0)); __ pushq(i.InputOperand(0));
} }
...@@ -1558,26 +1554,31 @@ void CodeGenerator::AssembleReturn() { ...@@ -1558,26 +1554,31 @@ void CodeGenerator::AssembleReturn() {
} }
} }
__ popq(rbp); // Pop caller's frame pointer. __ popq(rbp); // Pop caller's frame pointer.
__ ret(0);
} else { } else {
// No saved registers. // No saved registers.
__ movq(rsp, rbp); // Move stack pointer back to frame pointer. __ movq(rsp, rbp); // Move stack pointer back to frame pointer.
__ popq(rbp); // Pop caller's frame pointer. __ popq(rbp); // Pop caller's frame pointer.
__ ret(0);
} }
} else if (descriptor->IsJSFunctionCall() || needs_frame_) { } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now. // Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) { if (return_label_.is_bound()) {
__ jmp(&return_label_); __ jmp(&return_label_);
return;
} else { } else {
__ bind(&return_label_); __ bind(&return_label_);
__ movq(rsp, rbp); // Move stack pointer back to frame pointer. __ movq(rsp, rbp); // Move stack pointer back to frame pointer.
__ popq(rbp); // Pop caller's frame pointer. __ popq(rbp); // Pop caller's frame pointer.
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (pop_count == 0) {
__ Ret();
} else {
__ Ret(pop_count * kPointerSize, rbx);
}
} }
} else {
__ Ret();
} }
size_t pop_size = descriptor->StackParameterCount() * kPointerSize;
// Might need rcx for scratch if pop_size is too big.
DCHECK_EQ(0, descriptor->CalleeSavedRegisters() & rcx.bit());
__ Ret(static_cast<int>(pop_size), rcx);
} }
......
...@@ -38,12 +38,15 @@ class X87OperandConverter : public InstructionOperandConverter { ...@@ -38,12 +38,15 @@ class X87OperandConverter : public InstructionOperandConverter {
if (op->IsRegister()) { if (op->IsRegister()) {
DCHECK(extra == 0); DCHECK(extra == 0);
return Operand(ToRegister(op)); return Operand(ToRegister(op));
} else if (op->IsDoubleRegister()) {
DCHECK(extra == 0);
UNIMPLEMENTED();
} }
DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot());
FrameOffset offset = // The linkage computes where all spill slots are located.
linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); FrameOffset offset = linkage()->GetFrameOffset(
return Operand(offset.from_stack_pointer() ? esp : ebp, AllocatedOperand::cast(op)->index(), frame(), extra);
offset.offset() + extra); return Operand(offset.from_stack_pointer() ? esp : ebp, offset.offset());
} }
Operand HighOperand(InstructionOperand* op) { Operand HighOperand(InstructionOperand* op) {
...@@ -1565,7 +1568,6 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1565,7 +1568,6 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount(); int stack_slots = frame()->GetSpillSlotCount();
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
const RegList saves = descriptor->CalleeSavedRegisters(); const RegList saves = descriptor->CalleeSavedRegisters();
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
...@@ -1581,26 +1583,30 @@ void CodeGenerator::AssembleReturn() { ...@@ -1581,26 +1583,30 @@ void CodeGenerator::AssembleReturn() {
} }
} }
__ pop(ebp); // Pop caller's frame pointer. __ pop(ebp); // Pop caller's frame pointer.
__ ret(0);
} else { } else {
// No saved registers. // No saved registers.
__ mov(esp, ebp); // Move stack pointer back to frame pointer. __ mov(esp, ebp); // Move stack pointer back to frame pointer.
__ pop(ebp); // Pop caller's frame pointer. __ pop(ebp); // Pop caller's frame pointer.
__ ret(0);
} }
} else if (descriptor->IsJSFunctionCall() || needs_frame_) { } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now. // Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) { if (return_label_.is_bound()) {
__ jmp(&return_label_); __ jmp(&return_label_);
return;
} else { } else {
__ bind(&return_label_); __ bind(&return_label_);
__ mov(esp, ebp); // Move stack pointer back to frame pointer. __ mov(esp, ebp); // Move stack pointer back to frame pointer.
__ pop(ebp); // Pop caller's frame pointer. __ pop(ebp); // Pop caller's frame pointer.
int pop_count = static_cast<int>(descriptor->StackParameterCount());
if (pop_count == 0) {
__ ret(0);
} else {
__ Ret(pop_count * kPointerSize, ebx);
}
} }
}
if (pop_count == 0) {
__ ret(0);
} else { } else {
__ Ret(pop_count * kPointerSize, ebx); __ ret(0);
} }
} }
......
...@@ -76,7 +76,6 @@ ...@@ -76,7 +76,6 @@
'compiler/test-run-jsexceptions.cc', 'compiler/test-run-jsexceptions.cc',
'compiler/test-run-jsops.cc', 'compiler/test-run-jsops.cc',
'compiler/test-run-machops.cc', 'compiler/test-run-machops.cc',
'compiler/test-run-native-calls.cc',
'compiler/test-run-properties.cc', 'compiler/test-run-properties.cc',
'compiler/test-run-stackcheck.cc', 'compiler/test-run-stackcheck.cc',
'compiler/test-run-stubs.cc', 'compiler/test-run-stubs.cc',
......
...@@ -69,10 +69,6 @@ class CSignature : public MachineSignature { ...@@ -69,10 +69,6 @@ class CSignature : public MachineSignature {
} }
} }
static CSignature* FromMachine(Zone* zone, MachineSignature* msig) {
return reinterpret_cast<CSignature*>(msig);
}
static CSignature* New(Zone* zone, MachineType ret, static CSignature* New(Zone* zone, MachineType ret,
MachineType p1 = kMachNone, MachineType p2 = kMachNone, MachineType p1 = kMachNone, MachineType p2 = kMachNone,
MachineType p3 = kMachNone, MachineType p4 = kMachNone, MachineType p3 = kMachNone, MachineType p4 = kMachNone,
......
...@@ -304,21 +304,6 @@ class CallHelper { ...@@ -304,21 +304,6 @@ class CallHelper {
Isolate* isolate_; Isolate* isolate_;
}; };
// A call helper that calls the given code object assuming C calling convention.
template <typename T>
class CodeRunner : public CallHelper<T> {
public:
CodeRunner(Isolate* isolate, Handle<Code> code, CSignature* csig)
: CallHelper<T>(isolate, csig), code_(code) {}
virtual ~CodeRunner() {}
virtual byte* Generate() { return code_->entry(); }
private:
Handle<Code> code_;
};
} // namespace compiler } // namespace compiler
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
...@@ -28,12 +28,6 @@ class GraphAndBuilders { ...@@ -28,12 +28,6 @@ class GraphAndBuilders {
main_machine_(zone), main_machine_(zone),
main_simplified_(zone) {} main_simplified_(zone) {}
Graph* graph() const { return main_graph_; }
Zone* zone() const { return graph()->zone(); }
CommonOperatorBuilder* common() { return &main_common_; }
MachineOperatorBuilder* machine() { return &main_machine_; }
SimplifiedOperatorBuilder* simplified() { return &main_simplified_; }
protected: protected:
// Prefixed with main_ to avoid naming conflicts. // Prefixed with main_ to avoid naming conflicts.
Graph* main_graph_; Graph* main_graph_;
...@@ -45,7 +39,7 @@ class GraphAndBuilders { ...@@ -45,7 +39,7 @@ class GraphAndBuilders {
template <typename ReturnType> template <typename ReturnType>
class GraphBuilderTester : public HandleAndZoneScope, class GraphBuilderTester : public HandleAndZoneScope,
public GraphAndBuilders, private GraphAndBuilders,
public CallHelper<ReturnType> { public CallHelper<ReturnType> {
public: public:
explicit GraphBuilderTester(MachineType p0 = kMachNone, explicit GraphBuilderTester(MachineType p0 = kMachNone,
...@@ -73,7 +67,12 @@ class GraphBuilderTester : public HandleAndZoneScope, ...@@ -73,7 +67,12 @@ class GraphBuilderTester : public HandleAndZoneScope,
} }
Isolate* isolate() { return main_isolate(); } Isolate* isolate() { return main_isolate(); }
Graph* graph() const { return main_graph_; }
Zone* zone() const { return graph()->zone(); }
Factory* factory() { return isolate()->factory(); } Factory* factory() { return isolate()->factory(); }
CommonOperatorBuilder* common() { return &main_common_; }
MachineOperatorBuilder* machine() { return &main_machine_; }
SimplifiedOperatorBuilder* simplified() { return &main_simplified_; }
// Initialize graph and builder. // Initialize graph and builder.
void Begin(int num_parameters) { void Begin(int num_parameters) {
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment