Index: src/x64/stub-cache-x64.cc |
=================================================================== |
--- src/x64/stub-cache-x64.cc (revision 2542) |
+++ src/x64/stub-cache-x64.cc (working copy) |
@@ -471,8 +471,36 @@ |
Object* StoreStubCompiler::CompileStoreGlobal(GlobalObject* object, |
JSGlobalPropertyCell* cell, |
String* name) { |
- // TODO(X64): Implement a real stub. |
- return Failure::InternalError(); |
+ // ----------- S t a t e ------------- |
+ // -- rax : value |
+ // -- rcx : name |
+ // -- rsp[0] : return address |
+ // -- rsp[8] : receiver |
+ // ----------------------------------- |
+ Label miss; |
+ |
+ // Check that the map of the global has not changed. |
+ __ movq(rbx, Operand(rsp, kPointerSize)); |
+ __ Cmp(FieldOperand(rbx, HeapObject::kMapOffset), |
+ Handle<Map>(object->map())); |
+ __ j(not_equal, &miss); |
+ |
+ // Store the value in the cell. |
+ __ Move(rcx, Handle<JSGlobalPropertyCell>(cell)); |
+ __ movq(FieldOperand(rcx, JSGlobalPropertyCell::kValueOffset), rax); |
+ |
+ __ IncrementCounter(&Counters::named_store_global_inline, 1); |
+ // Return the value (register rax). |
+ __ ret(0); |
+ |
+ // Handle store cache miss. |
+ __ bind(&miss); |
+ __ IncrementCounter(&Counters::named_store_global_inline_miss, 1); |
+ Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); |
+ __ Jump(ic, RelocInfo::CODE_TARGET); |
+ |
+ // Return the generated code. |
+ return GetCode(NORMAL, name); |
} |