Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 2380) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -3235,10 +3235,25 @@ |
void CodeGenerator::GenerateIsConstructCall(ZoneList<Expression*>* args) { |
- // TODO(X64): Optimize this like it's done on IA-32. |
ASSERT(args->length() == 0); |
- Result answer = frame_->CallRuntime(Runtime::kIsConstructCall, 0); |
- frame_->Push(&answer); |
+ |
+ // Get the frame pointer for the calling frame. |
+ Result fp = allocator()->Allocate(); |
+ __ movq(fp.reg(), Operand(rbp, StandardFrameConstants::kCallerFPOffset)); |
+ |
+ // Skip the arguments adaptor frame if it exists. |
+ Label check_frame_marker; |
+ __ cmpq(Operand(fp.reg(), StandardFrameConstants::kContextOffset), |
+ Immediate(ArgumentsAdaptorFrame::SENTINEL)); |
+ __ j(not_equal, &check_frame_marker); |
+ __ movq(fp.reg(), Operand(fp.reg(), StandardFrameConstants::kCallerFPOffset)); |
+ |
+ // Check the marker in the calling frame. |
+ __ bind(&check_frame_marker); |
+ __ cmpq(Operand(fp.reg(), StandardFrameConstants::kMarkerOffset), |
+ Immediate(Smi::FromInt(StackFrame::CONSTRUCT))); |
+ fp.Unuse(); |
+ destination()->Split(equal); |
} |