Reviewers: Jarin,
Message:
PTAL, not yet ported to other architectures.
I need to write some tests with manually created call descriptors in order
to
stress the cases covered here.
Description:
[turbofan] Various fixes to allow unboxed doubles as arguments in registers
and
on the stack.
[email protected]
BUG=
Please review this at https://codereview.chromium.org/1263033004/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+27, -29 lines):
M src/compiler/ia32/code-generator-ia32.cc
M src/compiler/linkage.cc
M src/compiler/machine-type.h
M src/compiler/register-allocator.cc
M src/compiler/register-allocator-verifier.cc
M src/compiler/x64/code-generator-x64.cc
Index: src/compiler/ia32/code-generator-ia32.cc
diff --git a/src/compiler/ia32/code-generator-ia32.cc
b/src/compiler/ia32/code-generator-ia32.cc
index
298627b55bd35dfb1ba40d35da6b49fa16eca1f6..22a7ea99a66f6b44924ca81061b535ebd3170f8f
100644
--- a/src/compiler/ia32/code-generator-ia32.cc
+++ b/src/compiler/ia32/code-generator-ia32.cc
@@ -1325,31 +1325,26 @@ void CodeGenerator::AssembleReturn() {
}
}
__ pop(ebp); // Pop caller's frame pointer.
- __ ret(0);
} else {
// No saved registers.
__ mov(esp, ebp); // Move stack pointer back to frame pointer.
__ pop(ebp); // Pop caller's frame pointer.
- __ ret(0);
}
} else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) {
__ jmp(&return_label_);
+ return;
} else {
__ bind(&return_label_);
__ mov(esp, ebp); // Move stack pointer back to 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);
}
Index: src/compiler/linkage.cc
diff --git a/src/compiler/linkage.cc b/src/compiler/linkage.cc
index
51b29e3ade348e6a7f56c27dd5932cadc7c025e4..2aae97ad4b8dd54eaec6fd167fed9d19574f9ee6
100644
--- a/src/compiler/linkage.cc
+++ b/src/compiler/linkage.cc
@@ -37,7 +37,7 @@ std::ostream& operator<<(std::ostream& os, const
CallDescriptor::Kind& k) {
std::ostream& operator<<(std::ostream& os, const CallDescriptor& d) {
// TODO(svenpanne) Output properties etc. and be less cryptic.
return os << d.kind() << ":" << d.debug_name() << ":r" << d.ReturnCount()
- << "j" << d.JSParameterCount() << "i" << d.InputCount() << "f"
+ << "s" << d.StackParameterCount() << "i" << d.InputCount()
<< "f"
<< d.FrameStateCount() << "t" << d.SupportsTailCalls();
}
Index: src/compiler/machine-type.h
diff --git a/src/compiler/machine-type.h b/src/compiler/machine-type.h
index
f152611a14bb7413edb65ec91452ff02260e6349..0cd2a84010b5fd238c7bd140b296462692dc3012
100644
--- a/src/compiler/machine-type.h
+++ b/src/compiler/machine-type.h
@@ -116,6 +116,11 @@ inline int ElementSizeOf(MachineType machine_type) {
return 1 << shift;
}
+inline bool IsFloatingPoint(MachineType type) {
+ MachineType rep = RepresentationOf(type);
+ return rep == kRepFloat32 || rep == kRepFloat64;
+}
+
typedef Signature<MachineType> MachineSignature;
} // namespace compiler
Index: src/compiler/register-allocator-verifier.cc
diff --git a/src/compiler/register-allocator-verifier.cc
b/src/compiler/register-allocator-verifier.cc
index
f23d24433f8dcfea5e1c45f1556046f20794af16..0b775d29e1d83620eb1bc9504a5e8dd315f2dbbb
100644
--- a/src/compiler/register-allocator-verifier.cc
+++ b/src/compiler/register-allocator-verifier.cc
@@ -155,7 +155,7 @@ void RegisterAllocatorVerifier::BuildConstraint(const
InstructionOperand* op,
int vreg = unallocated->virtual_register();
constraint->virtual_register_ = vreg;
if (unallocated->basic_policy() == UnallocatedOperand::FIXED_SLOT) {
- constraint->type_ = kFixedSlot;
+ constraint->type_ = sequence()->IsFloat(vreg) ? kDoubleSlot : kSlot;
constraint->value_ = unallocated->fixed_slot_index();
} else {
switch (unallocated->extended_policy()) {
@@ -185,11 +185,7 @@ void RegisterAllocatorVerifier::BuildConstraint(const
InstructionOperand* op,
}
break;
case UnallocatedOperand::MUST_HAVE_SLOT:
- if (sequence()->IsFloat(vreg)) {
- constraint->type_ = kDoubleSlot;
- } else {
- constraint->type_ = kSlot;
- }
+ constraint->type_ = sequence()->IsFloat(vreg) ? kDoubleSlot :
kSlot;
break;
case UnallocatedOperand::SAME_AS_FIRST_INPUT:
constraint->type_ = kSameAsFirst;
Index: src/compiler/register-allocator.cc
diff --git a/src/compiler/register-allocator.cc
b/src/compiler/register-allocator.cc
index
5bf858a86cf6e7551ce7a033603cc7c17990cbe2..5263aeccf95145371b6cf158a1929a857b42c3af
100644
--- a/src/compiler/register-allocator.cc
+++ b/src/compiler/register-allocator.cc
@@ -1102,8 +1102,11 @@ InstructionOperand* ConstraintBuilder::AllocateFixed(
machine_type = data()->MachineTypeFor(virtual_register);
}
if (operand->HasFixedSlotPolicy()) {
- allocated = AllocatedOperand(AllocatedOperand::STACK_SLOT,
machine_type,
- operand->fixed_slot_index());
+ AllocatedOperand::AllocatedKind kind =
+ IsFloatingPoint(machine_type) ? AllocatedOperand::DOUBLE_STACK_SLOT
+ : AllocatedOperand::STACK_SLOT;
+ allocated =
+ AllocatedOperand(kind, machine_type, operand->fixed_slot_index());
} else if (operand->HasFixedRegisterPolicy()) {
allocated = AllocatedOperand(AllocatedOperand::REGISTER, machine_type,
operand->fixed_register_index());
Index: src/compiler/x64/code-generator-x64.cc
diff --git a/src/compiler/x64/code-generator-x64.cc
b/src/compiler/x64/code-generator-x64.cc
index
38c7f2a31c90724b3fd39767c07b3801fde1cbc6..a0e4299238496d109b826a1e79e73e425eb19e1f
100644
--- a/src/compiler/x64/code-generator-x64.cc
+++ b/src/compiler/x64/code-generator-x64.cc
@@ -1219,6 +1219,10 @@ void
CodeGenerator::AssembleArchInstruction(Instruction* instr) {
} else {
if (instr->InputAt(0)->IsRegister()) {
__ pushq(i.InputRegister(0));
+ } else if (instr->InputAt(0)->IsDoubleRegister()) {
+ // TODO(titzer): use another machine instruction?
+ __ subq(rsp, Immediate(8));
+ __ movsd(Operand(rsp, 0), i.InputDoubleRegister(0));
} else {
__ pushq(i.InputOperand(0));
}
@@ -1554,31 +1558,26 @@ void CodeGenerator::AssembleReturn() {
}
}
__ popq(rbp); // Pop caller's frame pointer.
- __ ret(0);
} else {
// No saved registers.
__ movq(rsp, rbp); // Move stack pointer back to frame pointer.
__ popq(rbp); // Pop caller's frame pointer.
- __ ret(0);
}
} else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) {
__ jmp(&return_label_);
+ return;
} else {
__ bind(&return_label_);
__ movq(rsp, rbp); // Move stack pointer back to 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);
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.