Index: src/x64/full-codegen-x64.cc |
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc |
index 4387a321a232098c971605e1d22064d236f5378b..2c237a32daaf8c0dbb384d20149d3dcf60908039 100644 |
--- a/src/x64/full-codegen-x64.cc |
+++ b/src/x64/full-codegen-x64.cc |
@@ -2820,6 +2820,25 @@ void FullCodeGenerator::EmitValueOf(CallRuntime* expr) { |
} |
+void FullCodeGenerator::EmitDateField(CallRuntime* expr) { |
+ ZoneList<Expression*>* args = expr->arguments(); |
+ ASSERT(args->length() == 2); |
+ ASSERT_NE(NULL, args->at(1)->AsLiteral()); |
+ int index = Smi::cast(*(args->at(1)->AsLiteral()->handle()))->value(); |
+ |
+ VisitForAccumulatorValue(args->at(0)); // Load the object. |
+ |
+#ifdef DEBUG |
+ __ AbortIfSmi(rax); |
+ __ CmpObjectType(rax, JS_DATE_TYPE, rbx); |
+ __ Assert(equal, "Trying to get date field from non-date."); |
+#endif |
+ |
+ __ movq(rax, FieldOperand(rax, JSDate::kValueOffset + kPointerSize * index)); |
+ context()->Plug(rax); |
+} |
+ |
+ |
void FullCodeGenerator::EmitMathPow(CallRuntime* expr) { |
// Load the arguments on the stack and call the runtime function. |
ZoneList<Expression*>* args = expr->arguments(); |
@@ -2860,6 +2879,36 @@ void FullCodeGenerator::EmitSetValueOf(CallRuntime* expr) { |
} |
+void FullCodeGenerator::EmitSetDateField(CallRuntime* expr) { |
+ ZoneList<Expression*>* args = expr->arguments(); |
+ ASSERT(args->length() == 3); |
+ ASSERT_NE(NULL, args->at(1)->AsLiteral()); |
+ int index = Smi::cast(*(args->at(1)->AsLiteral()->handle()))->value(); |
+ |
+ VisitForStackValue(args->at(0)); // Load the object. |
+ VisitForAccumulatorValue(args->at(2)); // Load the value. |
+ __ pop(rbx); // rax = value. rbx = object. |
+ |
+#ifdef DEBUG |
+ __ AbortIfSmi(rbx); |
+ __ CmpObjectType(rbx, JS_DATE_TYPE, rcx); |
+ __ Assert(equal, "Trying to set date field on non-date."); |
+#endif |
+ |
+ // Store the value. |
+ __ movq(FieldOperand(rbx, JSDate::kValueOffset + kPointerSize * index), rax); |
+ // Caches can only be smi or NaN, so we can skip the write barrier for them. |
+ if (index < JSDate::kFirstBarrierFree) { |
+ // Update the write barrier. Save the value as it will be |
+ // overwritten by the write barrier code and is needed afterward. |
+ __ movq(rdx, rax); |
+ __ RecordWriteField(rbx, JSDate::kValueOffset + kPointerSize * index, |
+ rdx, rcx, kDontSaveFPRegs); |
+ } |
+ context()->Plug(rax); |
+} |
+ |
+ |
void FullCodeGenerator::EmitNumberToString(CallRuntime* expr) { |
ZoneList<Expression*>* args = expr->arguments(); |
ASSERT_EQ(args->length(), 1); |