| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if V8_TARGET_ARCH_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 |
| 6 | 6 |
| 7 #include "src/ic/handler-compiler.h" | 7 #include "src/ic/handler-compiler.h" |
| 8 | 8 |
| 9 #include "src/field-type.h" | 9 #include "src/field-type.h" |
| 10 #include "src/ic/call-optimization.h" | 10 #include "src/ic/call-optimization.h" |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 void NamedStoreHandlerCompiler::GenerateStoreViaSetter( | 238 void NamedStoreHandlerCompiler::GenerateStoreViaSetter( |
| 239 MacroAssembler* masm, Handle<Map> map, Register receiver, Register holder, | 239 MacroAssembler* masm, Handle<Map> map, Register receiver, Register holder, |
| 240 int accessor_index, int expected_arguments, Register scratch) { | 240 int accessor_index, int expected_arguments, Register scratch) { |
| 241 // ----------- S t a t e ------------- | 241 // ----------- S t a t e ------------- |
| 242 // -- lr : return address | 242 // -- lr : return address |
| 243 // ----------------------------------- | 243 // ----------------------------------- |
| 244 Label miss; | 244 Label miss; |
| 245 { | 245 { |
| 246 FrameScope scope(masm, StackFrame::INTERNAL); | 246 FrameScope scope(masm, StackFrame::INTERNAL); |
| 247 | 247 |
| 248 // Save context register |
| 249 __ Push(cp); |
| 248 // Save value register, so we can restore it later. | 250 // Save value register, so we can restore it later. |
| 249 __ Push(value()); | 251 __ Push(value()); |
| 250 | 252 |
| 251 if (accessor_index >= 0) { | 253 if (accessor_index >= 0) { |
| 252 DCHECK(!AreAliased(holder, scratch)); | 254 DCHECK(!AreAliased(holder, scratch)); |
| 253 DCHECK(!AreAliased(receiver, scratch)); | 255 DCHECK(!AreAliased(receiver, scratch)); |
| 254 DCHECK(!AreAliased(value(), scratch)); | 256 DCHECK(!AreAliased(value(), scratch)); |
| 255 // Call the JavaScript setter with receiver and value on the stack. | 257 // Call the JavaScript setter with receiver and value on the stack. |
| 256 if (map->IsJSGlobalObjectMap()) { | 258 if (map->IsJSGlobalObjectMap()) { |
| 257 // Swap in the global receiver. | 259 // Swap in the global receiver. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 268 } else { | 270 } else { |
| 269 // If we generate a global code snippet for deoptimization only, remember | 271 // If we generate a global code snippet for deoptimization only, remember |
| 270 // the place to continue after deoptimization. | 272 // the place to continue after deoptimization. |
| 271 masm->isolate()->heap()->SetSetterStubDeoptPCOffset(masm->pc_offset()); | 273 masm->isolate()->heap()->SetSetterStubDeoptPCOffset(masm->pc_offset()); |
| 272 } | 274 } |
| 273 | 275 |
| 274 // We have to return the passed value, not the return value of the setter. | 276 // We have to return the passed value, not the return value of the setter. |
| 275 __ Pop(x0); | 277 __ Pop(x0); |
| 276 | 278 |
| 277 // Restore context register. | 279 // Restore context register. |
| 278 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 280 __ Pop(cp); |
| 279 } | 281 } |
| 280 __ Ret(); | 282 __ Ret(); |
| 281 } | 283 } |
| 282 | 284 |
| 283 | 285 |
| 284 void NamedLoadHandlerCompiler::GenerateLoadViaGetter( | 286 void NamedLoadHandlerCompiler::GenerateLoadViaGetter( |
| 285 MacroAssembler* masm, Handle<Map> map, Register receiver, Register holder, | 287 MacroAssembler* masm, Handle<Map> map, Register receiver, Register holder, |
| 286 int accessor_index, int expected_arguments, Register scratch) { | 288 int accessor_index, int expected_arguments, Register scratch) { |
| 287 { | 289 { |
| 288 FrameScope scope(masm, StackFrame::INTERNAL); | 290 FrameScope scope(masm, StackFrame::INTERNAL); |
| 289 | 291 |
| 292 // Save context register |
| 293 __ Push(cp); |
| 294 |
| 290 if (accessor_index >= 0) { | 295 if (accessor_index >= 0) { |
| 291 DCHECK(!AreAliased(holder, scratch)); | 296 DCHECK(!AreAliased(holder, scratch)); |
| 292 DCHECK(!AreAliased(receiver, scratch)); | 297 DCHECK(!AreAliased(receiver, scratch)); |
| 293 // Call the JavaScript getter with the receiver on the stack. | 298 // Call the JavaScript getter with the receiver on the stack. |
| 294 if (map->IsJSGlobalObjectMap()) { | 299 if (map->IsJSGlobalObjectMap()) { |
| 295 // Swap in the global receiver. | 300 // Swap in the global receiver. |
| 296 __ Ldr(scratch, | 301 __ Ldr(scratch, |
| 297 FieldMemOperand(receiver, JSGlobalObject::kGlobalProxyOffset)); | 302 FieldMemOperand(receiver, JSGlobalObject::kGlobalProxyOffset)); |
| 298 receiver = scratch; | 303 receiver = scratch; |
| 299 } | 304 } |
| 300 __ Push(receiver); | 305 __ Push(receiver); |
| 301 ParameterCount actual(0); | 306 ParameterCount actual(0); |
| 302 ParameterCount expected(expected_arguments); | 307 ParameterCount expected(expected_arguments); |
| 303 __ LoadAccessor(x1, holder, accessor_index, ACCESSOR_GETTER); | 308 __ LoadAccessor(x1, holder, accessor_index, ACCESSOR_GETTER); |
| 304 __ InvokeFunction(x1, expected, actual, CALL_FUNCTION, | 309 __ InvokeFunction(x1, expected, actual, CALL_FUNCTION, |
| 305 CheckDebugStepCallWrapper()); | 310 CheckDebugStepCallWrapper()); |
| 306 } else { | 311 } else { |
| 307 // If we generate a global code snippet for deoptimization only, remember | 312 // If we generate a global code snippet for deoptimization only, remember |
| 308 // the place to continue after deoptimization. | 313 // the place to continue after deoptimization. |
| 309 masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset()); | 314 masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset()); |
| 310 } | 315 } |
| 311 | 316 |
| 312 // Restore context register. | 317 // Restore context register. |
| 313 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 318 __ Pop(cp); |
| 314 } | 319 } |
| 315 __ Ret(); | 320 __ Ret(); |
| 316 } | 321 } |
| 317 | 322 |
| 318 | 323 |
| 319 static void StoreIC_PushArgs(MacroAssembler* masm) { | 324 static void StoreIC_PushArgs(MacroAssembler* masm) { |
| 320 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), | 325 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
| 321 StoreDescriptor::ValueRegister(), | 326 StoreDescriptor::ValueRegister(), |
| 322 VectorStoreICDescriptor::SlotRegister(), | 327 VectorStoreICDescriptor::SlotRegister(), |
| 323 VectorStoreICDescriptor::VectorRegister()); | 328 VectorStoreICDescriptor::VectorRegister()); |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 // Return the generated code. | 799 // Return the generated code. |
| 795 return GetCode(kind(), Code::FAST, name); | 800 return GetCode(kind(), Code::FAST, name); |
| 796 } | 801 } |
| 797 | 802 |
| 798 | 803 |
| 799 #undef __ | 804 #undef __ |
| 800 } // namespace internal | 805 } // namespace internal |
| 801 } // namespace v8 | 806 } // namespace v8 |
| 802 | 807 |
| 803 #endif // V8_TARGET_ARCH_IA32 | 808 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |