Extract LoadAccessor into a masm function.
authorulan <ulan@chromium.org>
Wed, 28 Jan 2015 16:31:29 +0000 (08:31 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 28 Jan 2015 16:31:44 +0000 (16:31 +0000)
BUG=

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

Cr-Commit-Position: refs/heads/master@{#26310}

21 files changed:
src/arm/macro-assembler-arm.cc
src/arm/macro-assembler-arm.h
src/arm64/macro-assembler-arm64.cc
src/arm64/macro-assembler-arm64.h
src/ia32/macro-assembler-ia32.cc
src/ia32/macro-assembler-ia32.h
src/ic/arm/handler-compiler-arm.cc
src/ic/arm64/handler-compiler-arm64.cc
src/ic/ia32/handler-compiler-ia32.cc
src/ic/mips/handler-compiler-mips.cc
src/ic/mips64/handler-compiler-mips64.cc
src/ic/x64/handler-compiler-x64.cc
src/ic/x87/handler-compiler-x87.cc
src/mips/macro-assembler-mips.cc
src/mips/macro-assembler-mips.h
src/mips64/macro-assembler-mips64.cc
src/mips64/macro-assembler-mips64.h
src/x64/macro-assembler-x64.cc
src/x64/macro-assembler-x64.h
src/x87/macro-assembler-x87.cc
src/x87/macro-assembler-x87.h

index 31ffbf1e49010e8eaec1263510fe0930a6db85c2..b12b3ef903e5b90f5a0b39ad33a4af7889df2206 100644 (file)
@@ -3750,6 +3750,19 @@ void MacroAssembler::EnumLength(Register dst, Register map) {
 }
 
 
+void MacroAssembler::LoadAccessor(Register dst, Register holder,
+                                  int accessor_index,
+                                  AccessorComponent accessor) {
+  ldr(dst, FieldMemOperand(holder, HeapObject::kMapOffset));
+  LoadInstanceDescriptors(dst, dst);
+  ldr(dst,
+      FieldMemOperand(dst, DescriptorArray::GetValueOffset(accessor_index)));
+  int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset
+                                           : AccessorPair::kSetterOffset;
+  ldr(dst, FieldMemOperand(dst, offset));
+}
+
+
 void MacroAssembler::CheckEnumCache(Register null_value, Label* call_runtime) {
   Register  empty_fixed_array_value = r6;
   LoadRoot(empty_fixed_array_value, Heap::kEmptyFixedArrayRootIndex);
index 8ac6bad5d112d6f2241383027792b90890277d6f..88a68a90c2aa49f4bde29f8cd973755c609f529f 100644 (file)
@@ -1357,6 +1357,8 @@ class MacroAssembler: public Assembler {
   void LoadInstanceDescriptors(Register map, Register descriptors);
   void EnumLength(Register dst, Register map);
   void NumberOfOwnDescriptors(Register dst, Register map);
+  void LoadAccessor(Register dst, Register holder, int accessor_index,
+                    AccessorComponent accessor);
 
   template<typename Field>
   void DecodeField(Register dst, Register src) {
index e2599143ce74efdde315c1887bd882095150f3bf..0644c341cb42084e1454fa0645b614939f065189 100644 (file)
@@ -1453,6 +1453,19 @@ void MacroAssembler::EnumLengthSmi(Register dst, Register map) {
 }
 
 
+void MacroAssembler::LoadAccessor(Register dst, Register holder,
+                                  int accessor_index,
+                                  AccessorComponent accessor) {
+  Ldr(dst, FieldMemOperand(holder, HeapObject::kMapOffset));
+  LoadInstanceDescriptors(dst, dst);
+  Ldr(dst,
+      FieldMemOperand(dst, DescriptorArray::GetValueOffset(accessor_index)));
+  int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset
+                                           : AccessorPair::kSetterOffset;
+  Ldr(dst, FieldMemOperand(dst, offset));
+}
+
+
 void MacroAssembler::CheckEnumCache(Register object,
                                     Register null_value,
                                     Register scratch0,
index 3cbd40646249c0bf7902392e5068b6da8601c27d..fbb7d5b4fbac161c650471fe3d61cb4cb4fe7329 100644 (file)
@@ -881,6 +881,8 @@ class MacroAssembler : public Assembler {
   void EnumLengthUntagged(Register dst, Register map);
   void EnumLengthSmi(Register dst, Register map);
   void NumberOfOwnDescriptors(Register dst, Register map);
+  void LoadAccessor(Register dst, Register holder, int accessor_index,
+                    AccessorComponent accessor);
 
   template<typename Field>
   void DecodeField(Register dst, Register src) {
index 27f8f35b66ff277f2d340c581e1c05e51f894f42..6274b744036cf51d396d67254338e832dfdda16e 100644 (file)
@@ -2671,6 +2671,18 @@ void MacroAssembler::NumberOfOwnDescriptors(Register dst, Register map) {
 }
 
 
+void MacroAssembler::LoadAccessor(Register dst, Register holder,
+                                  int accessor_index,
+                                  AccessorComponent accessor) {
+  mov(dst, FieldOperand(holder, HeapObject::kMapOffset));
+  LoadInstanceDescriptors(dst, dst);
+  mov(dst, FieldOperand(dst, DescriptorArray::GetValueOffset(accessor_index)));
+  int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset
+                                           : AccessorPair::kSetterOffset;
+  mov(dst, FieldOperand(dst, offset));
+}
+
+
 void MacroAssembler::LoadPowerOf2(XMMRegister dst,
                                   Register scratch,
                                   int power) {
index b8c59b70bc23376ffb8f5f6d97e36e3cf229eccf..e686debeea6596b89bfde6066121333216f5b8ae 100644 (file)
@@ -517,6 +517,8 @@ class MacroAssembler: public Assembler {
   void LoadInstanceDescriptors(Register map, Register descriptors);
   void EnumLength(Register dst, Register map);
   void NumberOfOwnDescriptors(Register dst, Register map);
+  void LoadAccessor(Register dst, Register holder, int accessor_index,
+                    AccessorComponent accessor);
 
   template<typename Field>
   void DecodeField(Register reg) {
index 88189aa31e65ad36a9a5a0d769f806ac75ce5e76..9a774e85086343bd923dda223db9f2242a758ee1 100644 (file)
@@ -37,12 +37,7 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter(
       __ push(receiver);
       ParameterCount actual(0);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ ldr(scratch, FieldMemOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ ldr(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset(
-                                                   accessor_index)));
-      __ ldr(r1, FieldMemOperand(scratch, AccessorPair::kGetterOffset));
+      __ LoadAccessor(r1, holder, accessor_index, ACCESSOR_GETTER);
       __ InvokeFunction(r1, expected, actual, CALL_FUNCTION, NullCallWrapper());
     } else {
       // If we generate a global code snippet for deoptimization only, remember
@@ -79,12 +74,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter(
       __ Push(receiver, value());
       ParameterCount actual(1);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ ldr(scratch, FieldMemOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ ldr(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset(
-                                                   accessor_index)));
-      __ ldr(r1, FieldMemOperand(scratch, AccessorPair::kSetterOffset));
+      __ LoadAccessor(r1, holder, accessor_index, ACCESSOR_SETTER);
       __ InvokeFunction(r1, expected, actual, CALL_FUNCTION, NullCallWrapper());
     } else {
       // If we generate a global code snippet for deoptimization only, remember
index 5de315d2e025891595c184ab4bfd456cac8548bc..2444b6918e502c2d9620f105f3bbdc4229006dc5 100644 (file)
@@ -243,12 +243,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter(
       __ Push(receiver, value());
       ParameterCount actual(1);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ Ldr(scratch, FieldMemOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ Ldr(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset(
-                                                   accessor_index)));
-      __ Ldr(x1, FieldMemOperand(scratch, AccessorPair::kSetterOffset));
+      __ LoadAccessor(x1, holder, accessor_index, ACCESSOR_SETTER);
       __ InvokeFunction(x1, expected, actual, CALL_FUNCTION, NullCallWrapper());
     } else {
       // If we generate a global code snippet for deoptimization only, remember
@@ -282,12 +277,7 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter(
       __ Push(receiver);
       ParameterCount actual(0);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ Ldr(scratch, FieldMemOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ Ldr(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset(
-                                                   accessor_index)));
-      __ Ldr(x1, FieldMemOperand(scratch, AccessorPair::kGetterOffset));
+      __ LoadAccessor(x1, holder, accessor_index, ACCESSOR_GETTER);
       __ InvokeFunction(x1, expected, actual, CALL_FUNCTION, NullCallWrapper());
     } else {
       // If we generate a global code snippet for deoptimization only, remember
index be6245c2778cb56f7b89426fdd992c2b08ee2645..2d2251ee421251663da844be3ae236c28d28e236 100644 (file)
@@ -32,12 +32,7 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter(
       __ push(receiver);
       ParameterCount actual(0);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ mov(scratch, FieldOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ mov(scratch, FieldOperand(scratch, DescriptorArray::GetValueOffset(
-                                                accessor_index)));
-      __ mov(edi, FieldOperand(scratch, AccessorPair::kGetterOffset));
+      __ LoadAccessor(edi, holder, accessor_index, ACCESSOR_GETTER);
       __ InvokeFunction(edi, expected, actual, CALL_FUNCTION,
                         NullCallWrapper());
     } else {
@@ -257,12 +252,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter(
       __ push(value());
       ParameterCount actual(1);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ mov(scratch, FieldOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ mov(scratch, FieldOperand(scratch, DescriptorArray::GetValueOffset(
-                                                accessor_index)));
-      __ mov(edi, FieldOperand(scratch, AccessorPair::kSetterOffset));
+      __ LoadAccessor(edi, holder, accessor_index, ACCESSOR_SETTER);
       __ InvokeFunction(edi, expected, actual, CALL_FUNCTION,
                         NullCallWrapper());
     } else {
index 4fc736fee512d9c9b2fa21a0fc627b65925c9a71..d9dc2b0dc3cbb1ff262263d2ac44c2eb5e27473f 100644 (file)
@@ -37,12 +37,7 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter(
       __ push(receiver);
       ParameterCount actual(0);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ lw(scratch, FieldMemOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ lw(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset(
-                                                  accessor_index)));
-      __ lw(a1, FieldMemOperand(scratch, AccessorPair::kGetterOffset));
+      __ LoadAccessor(a1, holder, accessor_index, ACCESSOR_GETTER);
       __ InvokeFunction(a1, expected, actual, CALL_FUNCTION, NullCallWrapper());
     } else {
       // If we generate a global code snippet for deoptimization only, remember
@@ -79,12 +74,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter(
       __ Push(receiver, value());
       ParameterCount actual(1);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ lw(scratch, FieldMemOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ lw(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset(
-                                                  accessor_index)));
-      __ lw(a1, FieldMemOperand(scratch, AccessorPair::kSetterOffset));
+      __ LoadAccessor(a1, holder, accessor_index, ACCESSOR_SETTER);
       __ InvokeFunction(a1, expected, actual, CALL_FUNCTION, NullCallWrapper());
     } else {
       // If we generate a global code snippet for deoptimization only, remember
index 53ef0bf9f5e0ded5d174103771587ab07d544717..14a9161075d6724856c01616b11e86936993af0c 100644 (file)
@@ -37,12 +37,7 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter(
       __ push(receiver);
       ParameterCount actual(0);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ ld(scratch, FieldMemOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ ld(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset(
-                                                  accessor_index)));
-      __ ld(a1, FieldMemOperand(scratch, AccessorPair::kGetterOffset));
+      __ LoadAccessor(a1, holder, accessor_index, ACCESSOR_GETTER);
       __ InvokeFunction(a1, expected, actual, CALL_FUNCTION, NullCallWrapper());
     } else {
       // If we generate a global code snippet for deoptimization only, remember
@@ -79,12 +74,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter(
       __ Push(receiver, value());
       ParameterCount actual(1);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ ld(scratch, FieldMemOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ ld(scratch, FieldMemOperand(scratch, DescriptorArray::GetValueOffset(
-                                                  accessor_index)));
-      __ ld(a1, FieldMemOperand(scratch, AccessorPair::kSetterOffset));
+      __ LoadAccessor(a1, holder, accessor_index, ACCESSOR_SETTER);
       __ InvokeFunction(a1, expected, actual, CALL_FUNCTION, NullCallWrapper());
     } else {
       // If we generate a global code snippet for deoptimization only, remember
index ff69191db5f4bcec0a5d405aa7b8951c72362d53..38754a94a0a86557e15453fd250007d05fe25344 100644 (file)
@@ -235,12 +235,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter(
       __ Push(value());
       ParameterCount actual(1);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ movp(scratch, FieldOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ movp(scratch, FieldOperand(scratch, DescriptorArray::GetValueOffset(
-                                                 accessor_index)));
-      __ movp(rdi, FieldOperand(scratch, AccessorPair::kSetterOffset));
+      __ LoadAccessor(rdi, holder, accessor_index, ACCESSOR_SETTER);
       __ InvokeFunction(rdi, expected, actual, CALL_FUNCTION,
                         NullCallWrapper());
     } else {
@@ -280,12 +275,7 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter(
       __ Push(receiver);
       ParameterCount actual(0);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ movp(scratch, FieldOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ movp(scratch, FieldOperand(scratch, DescriptorArray::GetValueOffset(
-                                                 accessor_index)));
-      __ movp(rdi, FieldOperand(scratch, AccessorPair::kGetterOffset));
+      __ LoadAccessor(rdi, holder, accessor_index, ACCESSOR_GETTER);
       __ InvokeFunction(rdi, expected, actual, CALL_FUNCTION,
                         NullCallWrapper());
     } else {
index d0e7dfe74daff7365d537c8d277d5127474a6259..6b97ccb0fb3de0beaa4dced361c1f7909a788273 100644 (file)
@@ -32,12 +32,7 @@ void NamedLoadHandlerCompiler::GenerateLoadViaGetter(
       __ push(receiver);
       ParameterCount actual(0);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ mov(scratch, FieldOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ mov(scratch, FieldOperand(scratch, DescriptorArray::GetValueOffset(
-                                                accessor_index)));
-      __ mov(edi, FieldOperand(scratch, AccessorPair::kGetterOffset));
+      __ LoadAccessor(edi, holder, accessor_index, ACCESSOR_GETTER);
       __ InvokeFunction(edi, expected, actual, CALL_FUNCTION,
                         NullCallWrapper());
     } else {
@@ -257,12 +252,7 @@ void NamedStoreHandlerCompiler::GenerateStoreViaSetter(
       __ push(value());
       ParameterCount actual(1);
       ParameterCount expected(expected_arguments);
-      Register scratch = holder;
-      __ mov(scratch, FieldOperand(holder, HeapObject::kMapOffset));
-      __ LoadInstanceDescriptors(scratch, scratch);
-      __ mov(scratch, FieldOperand(scratch, DescriptorArray::GetValueOffset(
-                                                accessor_index)));
-      __ mov(edi, FieldOperand(scratch, AccessorPair::kSetterOffset));
+      __ LoadAccessor(edi, holder, accessor_index, ACCESSOR_SETTER);
       __ InvokeFunction(edi, expected, actual, CALL_FUNCTION,
                         NullCallWrapper());
     } else {
index b43fb56084f67b8b79e670eead73fe01b677214d..c601657dd94707d6ce5765828645d75d12fcacdd 100644 (file)
@@ -5884,6 +5884,19 @@ void MacroAssembler::EnumLength(Register dst, Register map) {
 }
 
 
+void MacroAssembler::LoadAccessor(Register dst, Register holder,
+                                  int accessor_index,
+                                  AccessorComponent accessor) {
+  lw(dst, FieldMemOperand(holder, HeapObject::kMapOffset));
+  LoadInstanceDescriptors(dst, dst);
+  lw(dst,
+     FieldMemOperand(dst, DescriptorArray::GetValueOffset(accessor_index)));
+  int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset
+                                           : AccessorPair::kSetterOffset;
+  lw(dst, FieldMemOperand(dst, offset));
+}
+
+
 void MacroAssembler::CheckEnumCache(Register null_value, Label* call_runtime) {
   Register  empty_fixed_array_value = t2;
   LoadRoot(empty_fixed_array_value, Heap::kEmptyFixedArrayRootIndex);
index 4f7729bee77e8e17abbe1a04347bbb811040f757..643b9b5e77bbd3eb9080eb022219f9ea50747bfc 100644 (file)
@@ -1516,6 +1516,8 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
   void LoadInstanceDescriptors(Register map, Register descriptors);
   void EnumLength(Register dst, Register map);
   void NumberOfOwnDescriptors(Register dst, Register map);
+  void LoadAccessor(Register dst, Register holder, int accessor_index,
+                    AccessorComponent accessor);
 
   template<typename Field>
   void DecodeField(Register dst, Register src) {
index 903247394301f5efff2b8b0489b14d70a2c03ca6..21cc3dc1eb29957742e4b23662bc18e1d1c08312 100644 (file)
@@ -5929,6 +5929,19 @@ void MacroAssembler::EnumLength(Register dst, Register map) {
 }
 
 
+void MacroAssembler::LoadAccessor(Register dst, Register holder,
+                                  int accessor_index,
+                                  AccessorComponent accessor) {
+  ld(dst, FieldMemOperand(holder, HeapObject::kMapOffset));
+  LoadInstanceDescriptors(dst, dst);
+  ld(dst,
+     FieldMemOperand(dst, DescriptorArray::GetValueOffset(accessor_index)));
+  int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset
+                                           : AccessorPair::kSetterOffset;
+  ld(dst, FieldMemOperand(dst, offset));
+}
+
+
 void MacroAssembler::CheckEnumCache(Register null_value, Label* call_runtime) {
   Register  empty_fixed_array_value = a6;
   LoadRoot(empty_fixed_array_value, Heap::kEmptyFixedArrayRootIndex);
index fa853c1e4e9e3a855fef8dcd946610bed52a084b..cf0becec7a76a85c4d57684654f48de8a6f64343 100644 (file)
@@ -1591,6 +1591,8 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
   void LoadInstanceDescriptors(Register map, Register descriptors);
   void EnumLength(Register dst, Register map);
   void NumberOfOwnDescriptors(Register dst, Register map);
+  void LoadAccessor(Register dst, Register holder, int accessor_index,
+                    AccessorComponent accessor);
 
   template<typename Field>
   void DecodeField(Register dst, Register src) {
index f5aa8d6a4f363e000be615e11397a041eceac3d2..3a477fc7937382ceae2ba1951f918683cb779c0e 100644 (file)
@@ -3413,6 +3413,18 @@ void MacroAssembler::EnumLength(Register dst, Register map) {
 }
 
 
+void MacroAssembler::LoadAccessor(Register dst, Register holder,
+                                  int accessor_index,
+                                  AccessorComponent accessor) {
+  movp(dst, FieldOperand(holder, HeapObject::kMapOffset));
+  LoadInstanceDescriptors(dst, dst);
+  movp(dst, FieldOperand(dst, DescriptorArray::GetValueOffset(accessor_index)));
+  int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset
+                                           : AccessorPair::kSetterOffset;
+  movp(dst, FieldOperand(dst, offset));
+}
+
+
 void MacroAssembler::DispatchWeakMap(Register obj, Register scratch1,
                                      Register scratch2, Handle<WeakCell> cell,
                                      Handle<Code> success,
index b48656af35702936e86ed07dbd6e944f0fd5284d..2308d290ac72542edcf32c1a03a02e09f53bec4c 100644 (file)
@@ -1046,6 +1046,8 @@ class MacroAssembler: public Assembler {
   void LoadInstanceDescriptors(Register map, Register descriptors);
   void EnumLength(Register dst, Register map);
   void NumberOfOwnDescriptors(Register dst, Register map);
+  void LoadAccessor(Register dst, Register holder, int accessor_index,
+                    AccessorComponent accessor);
 
   template<typename Field>
   void DecodeField(Register reg) {
index a02fad8f2007c74fffadc2f21e9739db4c724a02..8f34c19c9be0cd171afa840c0c0d71606bbcc796 100644 (file)
@@ -2617,6 +2617,18 @@ void MacroAssembler::NumberOfOwnDescriptors(Register dst, Register map) {
 }
 
 
+void MacroAssembler::LoadAccessor(Register dst, Register holder,
+                                  int accessor_index,
+                                  AccessorComponent accessor) {
+  mov(dst, FieldOperand(holder, HeapObject::kMapOffset));
+  LoadInstanceDescriptors(dst, dst);
+  mov(dst, FieldOperand(dst, DescriptorArray::GetValueOffset(accessor_index)));
+  int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset
+                                           : AccessorPair::kSetterOffset;
+  mov(dst, FieldOperand(dst, offset));
+}
+
+
 void MacroAssembler::LookupNumberStringCache(Register object,
                                              Register result,
                                              Register scratch1,
index 65d0994f2d82fc5291b4ba2ee3d6700a0320c7e5..7f8a4567c868af18644a29d1ba6f939252c43d59 100644 (file)
@@ -485,6 +485,8 @@ class MacroAssembler: public Assembler {
   void LoadInstanceDescriptors(Register map, Register descriptors);
   void EnumLength(Register dst, Register map);
   void NumberOfOwnDescriptors(Register dst, Register map);
+  void LoadAccessor(Register dst, Register holder, int accessor_index,
+                    AccessorComponent accessor);
 
   template<typename Field>
   void DecodeField(Register reg) {