| 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_PPC | 5 #if V8_TARGET_ARCH_PPC |
| 6 | 6 |
| 7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
| 8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
| 9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
| 10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
| (...skipping 1578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1589 // static | 1589 // static |
| 1590 void Builtins::Generate_CallFunction(MacroAssembler* masm) { | 1590 void Builtins::Generate_CallFunction(MacroAssembler* masm) { |
| 1591 // ----------- S t a t e ------------- | 1591 // ----------- S t a t e ------------- |
| 1592 // -- r3 : the number of arguments (not including the receiver) | 1592 // -- r3 : the number of arguments (not including the receiver) |
| 1593 // -- r4 : the function to call (checked to be a JSFunction) | 1593 // -- r4 : the function to call (checked to be a JSFunction) |
| 1594 // ----------------------------------- | 1594 // ----------------------------------- |
| 1595 // See ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList) | 1595 // See ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList) |
| 1596 | 1596 |
| 1597 Label convert, convert_global_proxy, convert_to_object, done_convert; | 1597 Label convert, convert_global_proxy, convert_to_object, done_convert; |
| 1598 __ AssertFunction(r4); | 1598 __ AssertFunction(r4); |
| 1599 // TODO(bmeurer): Throw a TypeError if function's [[FunctionKind]] internal | 1599 __ LoadP(r5, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); |
| 1600 // slot is "classConstructor". | 1600 __ lwz(r6, FieldMemOperand(r5, SharedFunctionInfo::kCompilerHintsOffset)); |
| 1601 { |
| 1602 Label non_class_constructor; |
| 1603 // Check whether the current function is a classConstructor. |
| 1604 __ TestBitMask(r6, SharedFunctionInfo::kClassConstructorBits, r0); |
| 1605 __ beq(&non_class_constructor, cr0); |
| 1606 // Step: 2, If we call a classConstructor Function throw a TypeError. |
| 1607 { |
| 1608 FrameAndConstantPoolScope frame(masm, StackFrame::INTERNAL); |
| 1609 __ CallRuntime(Runtime::kThrowConstructorNonCallableError, 0); |
| 1610 } |
| 1611 __ bind(&non_class_constructor); |
| 1612 } |
| 1613 |
| 1601 // Enter the context of the function; ToObject has to run in the function | 1614 // Enter the context of the function; ToObject has to run in the function |
| 1602 // context, and we also need to take the global proxy from the function | 1615 // context, and we also need to take the global proxy from the function |
| 1603 // context in case of conversion. | 1616 // context in case of conversion. |
| 1604 STATIC_ASSERT(SharedFunctionInfo::kNativeByteOffset == | |
| 1605 SharedFunctionInfo::kStrictModeByteOffset); | |
| 1606 __ LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset)); | 1617 __ LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset)); |
| 1607 __ LoadP(r5, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); | |
| 1608 // We need to convert the receiver for non-native sloppy mode functions. | 1618 // We need to convert the receiver for non-native sloppy mode functions. |
| 1609 __ lbz(r6, FieldMemOperand(r5, SharedFunctionInfo::kNativeByteOffset)); | 1619 __ andi(r0, r6, Operand((1 << SharedFunctionInfo::kStrictModeBit) | |
| 1610 __ andi(r0, r6, Operand((1 << SharedFunctionInfo::kNativeBitWithinByte) | | 1620 (1 << SharedFunctionInfo::kNativeBit))); |
| 1611 (1 << SharedFunctionInfo::kStrictModeBitWithinByte))); | |
| 1612 __ bne(&done_convert, cr0); | 1621 __ bne(&done_convert, cr0); |
| 1613 { | 1622 { |
| 1614 __ ShiftLeftImm(r6, r3, Operand(kPointerSizeLog2)); | 1623 __ ShiftLeftImm(r6, r3, Operand(kPointerSizeLog2)); |
| 1615 __ LoadPX(r6, MemOperand(sp, r6)); | 1624 __ LoadPX(r6, MemOperand(sp, r6)); |
| 1616 | 1625 |
| 1617 // ----------- S t a t e ------------- | 1626 // ----------- S t a t e ------------- |
| 1618 // -- r3 : the number of arguments (not including the receiver) | 1627 // -- r3 : the number of arguments (not including the receiver) |
| 1619 // -- r4 : the function to call (checked to be a JSFunction) | 1628 // -- r4 : the function to call (checked to be a JSFunction) |
| 1620 // -- r5 : the shared function info. | 1629 // -- r5 : the shared function info. |
| 1621 // -- r6 : the receiver | 1630 // -- r6 : the receiver |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1859 __ b(&invoke); | 1868 __ b(&invoke); |
| 1860 } | 1869 } |
| 1861 | 1870 |
| 1862 { // Too few parameters: Actual < expected | 1871 { // Too few parameters: Actual < expected |
| 1863 __ bind(&too_few); | 1872 __ bind(&too_few); |
| 1864 | 1873 |
| 1865 // If the function is strong we need to throw an error. | 1874 // If the function is strong we need to throw an error. |
| 1866 Label no_strong_error; | 1875 Label no_strong_error; |
| 1867 __ LoadP(r7, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); | 1876 __ LoadP(r7, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); |
| 1868 __ lwz(r8, FieldMemOperand(r7, SharedFunctionInfo::kCompilerHintsOffset)); | 1877 __ lwz(r8, FieldMemOperand(r7, SharedFunctionInfo::kCompilerHintsOffset)); |
| 1869 __ TestBit(r8, | 1878 __ TestBit(r8, SharedFunctionInfo::kStrongModeBit, r0); |
| 1870 #if V8_TARGET_ARCH_PPC64 | |
| 1871 SharedFunctionInfo::kStrongModeFunction, | |
| 1872 #else | |
| 1873 SharedFunctionInfo::kStrongModeFunction + kSmiTagSize, | |
| 1874 #endif | |
| 1875 r0); | |
| 1876 __ beq(&no_strong_error, cr0); | 1879 __ beq(&no_strong_error, cr0); |
| 1877 | 1880 |
| 1878 // What we really care about is the required number of arguments. | 1881 // What we really care about is the required number of arguments. |
| 1879 __ lwz(r7, FieldMemOperand(r7, SharedFunctionInfo::kLengthOffset)); | 1882 __ lwz(r7, FieldMemOperand(r7, SharedFunctionInfo::kLengthOffset)); |
| 1880 #if V8_TARGET_ARCH_PPC64 | 1883 #if V8_TARGET_ARCH_PPC64 |
| 1881 // See commment near kLenghtOffset in src/objects.h | 1884 // See commment near kLenghtOffset in src/objects.h |
| 1882 __ srawi(r7, r7, kSmiTagSize); | 1885 __ srawi(r7, r7, kSmiTagSize); |
| 1883 #else | 1886 #else |
| 1884 __ SmiUntag(r7); | 1887 __ SmiUntag(r7); |
| 1885 #endif | 1888 #endif |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1964 __ bkpt(0); | 1967 __ bkpt(0); |
| 1965 } | 1968 } |
| 1966 } | 1969 } |
| 1967 | 1970 |
| 1968 | 1971 |
| 1969 #undef __ | 1972 #undef __ |
| 1970 } // namespace internal | 1973 } // namespace internal |
| 1971 } // namespace v8 | 1974 } // namespace v8 |
| 1972 | 1975 |
| 1973 #endif // V8_TARGET_ARCH_PPC | 1976 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |