| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "jsregexp.h" | 35 #include "jsregexp.h" |
| 36 #include "regexp-macro-assembler.h" | 36 #include "regexp-macro-assembler.h" |
| 37 #include "runtime.h" | 37 #include "runtime.h" |
| 38 #include "stub-cache.h" | 38 #include "stub-cache.h" |
| 39 #include "codegen.h" | 39 #include "codegen.h" |
| 40 | 40 |
| 41 namespace v8 { | 41 namespace v8 { |
| 42 namespace internal { | 42 namespace internal { |
| 43 | 43 |
| 44 | 44 |
| 45 void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( |
| 46 Isolate* isolate, |
| 47 CodeStubInterfaceDescriptor* descriptor) { |
| 48 static Register registers[] = { eax, ebx, ecx, edx }; |
| 49 descriptor->register_param_count_ = 4; |
| 50 descriptor->register_params_ = registers; |
| 51 descriptor->stack_parameter_count_ = NULL; |
| 52 descriptor->deoptimization_handler_ = |
| 53 Runtime::FunctionForId(Runtime::kCreateObjectLiteralShallow)->entry; |
| 54 } |
| 55 |
| 56 |
| 45 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( | 57 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( |
| 46 Isolate* isolate, | 58 Isolate* isolate, |
| 47 CodeStubInterfaceDescriptor* descriptor) { | 59 CodeStubInterfaceDescriptor* descriptor) { |
| 48 static Register registers[] = { edx, ecx }; | 60 static Register registers[] = { edx, ecx }; |
| 49 descriptor->register_param_count_ = 2; | 61 descriptor->register_param_count_ = 2; |
| 50 descriptor->register_params_ = registers; | 62 descriptor->register_params_ = registers; |
| 51 descriptor->deoptimization_handler_ = | 63 descriptor->deoptimization_handler_ = |
| 52 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); | 64 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); |
| 53 } | 65 } |
| 54 | 66 |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 &slow_case); | 498 &slow_case); |
| 487 | 499 |
| 488 // Return and remove the on-stack parameters. | 500 // Return and remove the on-stack parameters. |
| 489 __ ret(3 * kPointerSize); | 501 __ ret(3 * kPointerSize); |
| 490 | 502 |
| 491 __ bind(&slow_case); | 503 __ bind(&slow_case); |
| 492 __ TailCallRuntime(Runtime::kCreateArrayLiteralShallow, 3, 1); | 504 __ TailCallRuntime(Runtime::kCreateArrayLiteralShallow, 3, 1); |
| 493 } | 505 } |
| 494 | 506 |
| 495 | 507 |
| 496 void FastCloneShallowObjectStub::Generate(MacroAssembler* masm) { | |
| 497 // Stack layout on entry: | |
| 498 // | |
| 499 // [esp + kPointerSize]: object literal flags. | |
| 500 // [esp + (2 * kPointerSize)]: constant properties. | |
| 501 // [esp + (3 * kPointerSize)]: literal index. | |
| 502 // [esp + (4 * kPointerSize)]: literals array. | |
| 503 | |
| 504 // Load boilerplate object into ecx and check if we need to create a | |
| 505 // boilerplate. | |
| 506 Label slow_case; | |
| 507 __ mov(ecx, Operand(esp, 4 * kPointerSize)); | |
| 508 __ mov(eax, Operand(esp, 3 * kPointerSize)); | |
| 509 STATIC_ASSERT(kPointerSize == 4); | |
| 510 STATIC_ASSERT(kSmiTagSize == 1); | |
| 511 STATIC_ASSERT(kSmiTag == 0); | |
| 512 __ mov(ecx, FieldOperand(ecx, eax, times_half_pointer_size, | |
| 513 FixedArray::kHeaderSize)); | |
| 514 Factory* factory = masm->isolate()->factory(); | |
| 515 __ cmp(ecx, factory->undefined_value()); | |
| 516 __ j(equal, &slow_case); | |
| 517 | |
| 518 // Check that the boilerplate contains only fast properties and we can | |
| 519 // statically determine the instance size. | |
| 520 int size = JSObject::kHeaderSize + length_ * kPointerSize; | |
| 521 __ mov(eax, FieldOperand(ecx, HeapObject::kMapOffset)); | |
| 522 __ movzx_b(eax, FieldOperand(eax, Map::kInstanceSizeOffset)); | |
| 523 __ cmp(eax, Immediate(size >> kPointerSizeLog2)); | |
| 524 __ j(not_equal, &slow_case); | |
| 525 | |
| 526 // Allocate the JS object and copy header together with all in-object | |
| 527 // properties from the boilerplate. | |
| 528 __ AllocateInNewSpace(size, eax, ebx, edx, &slow_case, TAG_OBJECT); | |
| 529 for (int i = 0; i < size; i += kPointerSize) { | |
| 530 __ mov(ebx, FieldOperand(ecx, i)); | |
| 531 __ mov(FieldOperand(eax, i), ebx); | |
| 532 } | |
| 533 | |
| 534 // Return and remove the on-stack parameters. | |
| 535 __ ret(4 * kPointerSize); | |
| 536 | |
| 537 __ bind(&slow_case); | |
| 538 __ TailCallRuntime(Runtime::kCreateObjectLiteralShallow, 4, 1); | |
| 539 } | |
| 540 | |
| 541 | |
| 542 // The stub expects its argument on the stack and returns its result in tos_: | 508 // The stub expects its argument on the stack and returns its result in tos_: |
| 543 // zero for false, and a non-zero value for true. | 509 // zero for false, and a non-zero value for true. |
| 544 void ToBooleanStub::Generate(MacroAssembler* masm) { | 510 void ToBooleanStub::Generate(MacroAssembler* masm) { |
| 545 // This stub overrides SometimesSetsUpAFrame() to return false. That means | 511 // This stub overrides SometimesSetsUpAFrame() to return false. That means |
| 546 // we cannot call anything that could cause a GC from this stub. | 512 // we cannot call anything that could cause a GC from this stub. |
| 547 Label patch; | 513 Label patch; |
| 548 Factory* factory = masm->isolate()->factory(); | 514 Factory* factory = masm->isolate()->factory(); |
| 549 const Register argument = eax; | 515 const Register argument = eax; |
| 550 const Register map = edx; | 516 const Register map = edx; |
| 551 | 517 |
| (...skipping 7162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7714 // Restore ecx. | 7680 // Restore ecx. |
| 7715 __ pop(ecx); | 7681 __ pop(ecx); |
| 7716 __ ret(0); | 7682 __ ret(0); |
| 7717 } | 7683 } |
| 7718 | 7684 |
| 7719 #undef __ | 7685 #undef __ |
| 7720 | 7686 |
| 7721 } } // namespace v8::internal | 7687 } } // namespace v8::internal |
| 7722 | 7688 |
| 7723 #endif // V8_TARGET_ARCH_IA32 | 7689 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |