MIPS: api accessor store ics should return passed value.
authorplind44@gmail.com <plind44@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 14 Feb 2014 17:45:53 +0000 (17:45 +0000)
committerplind44@gmail.com <plind44@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 14 Feb 2014 17:45:53 +0000 (17:45 +0000)
Port r19380 (114a9ca)

BUG=
R=plind44@gmail.com

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

Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19392 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/mips/code-stubs-mips.cc
src/mips/stub-cache-mips.cc

index 3d4d605..1a3f336 100644 (file)
@@ -5640,7 +5640,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
   Register context = cp;
 
   int argc = ArgumentBits::decode(bit_field_);
-  bool restore_context = RestoreContextBits::decode(bit_field_);
+  bool is_store = IsStoreBits::decode(bit_field_);
   bool call_data_undefined = CallDataUndefinedBits::decode(bit_field_);
 
   typedef FunctionCallbackArguments FCA;
@@ -5707,15 +5707,16 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
   AllowExternalCallThatCantCauseGC scope(masm);
   MemOperand context_restore_operand(
       fp, (2 + FCA::kContextSaveIndex) * kPointerSize);
-  MemOperand return_value_operand(fp,
-                                  (2 + FCA::kReturnValueOffset) * kPointerSize);
+  // Stores return the first js argument.
+  int return_value_offset =
+      2 + (is_store ? FCA::kArgsLength : FCA::kReturnValueOffset);
+  MemOperand return_value_operand(fp, return_value_offset * kPointerSize);
 
   __ CallApiFunctionAndReturn(api_function_address,
                               thunk_ref,
                               kStackUnwindSpace,
                               return_value_operand,
-                              restore_context ?
-                                  &context_restore_operand : NULL);
+                              &context_restore_operand);
 }
 
 
index 60ab0b8..3d0e1fc 100644 (file)
@@ -775,6 +775,7 @@ static void GenerateFastApiCall(MacroAssembler* masm,
                                 Handle<Map> receiver_map,
                                 Register receiver,
                                 Register scratch_in,
+                                bool is_store,
                                 int argc,
                                 Register* values) {
   ASSERT(!receiver.is(scratch_in));
@@ -843,7 +844,7 @@ static void GenerateFastApiCall(MacroAssembler* masm,
   __ li(api_function_address, Operand(ref));
 
   // Jump to stub.
-  CallApiFunctionStub stub(true, call_data_undefined, argc);
+  CallApiFunctionStub stub(is_store, call_data_undefined, argc);
   __ TailCallStub(&stub);
 }
 
@@ -1068,7 +1069,7 @@ void LoadStubCompiler::GenerateLoadCallback(
     Handle<Map> receiver_map) {
   GenerateFastApiCall(
       masm(), call_optimization, receiver_map,
-      receiver(), scratch3(), 0, NULL);
+      receiver(), scratch3(), false, 0, NULL);
 }
 
 
@@ -1257,7 +1258,7 @@ Handle<Code> StoreStubCompiler::CompileStoreCallback(
   Register values[] = { value() };
   GenerateFastApiCall(
       masm(), call_optimization, handle(object->map()),
-      receiver(), scratch3(), 1, values);
+      receiver(), scratch3(), true, 1, values);
 
   // Return the generated code.
   return GetCode(kind(), Code::FAST, name);