2 * Copyright (C) 2011, 2013-2015 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef DFGOperations_h
27 #define DFGOperations_h
31 #include "JITOperations.h"
34 namespace JSC
{ namespace DFG
{
40 JSCell
* JIT_OPERATION
operationStringFromCharCode(ExecState
*, int32_t) WTF_INTERNAL
;
42 // These routines are provide callbacks out to C++ implementations of operations too complex to JIT.
43 JSCell
* JIT_OPERATION
operationCreateThis(ExecState
*, JSObject
* constructor
, int32_t inlineCapacity
) WTF_INTERNAL
;
44 EncodedJSValue JIT_OPERATION
operationToThis(ExecState
*, EncodedJSValue encodedOp1
) WTF_INTERNAL
;
45 EncodedJSValue JIT_OPERATION
operationToThisStrict(ExecState
*, EncodedJSValue encodedOp1
) WTF_INTERNAL
;
46 EncodedJSValue JIT_OPERATION
operationValueAdd(ExecState
*, EncodedJSValue encodedOp1
, EncodedJSValue encodedOp2
) WTF_INTERNAL
;
47 EncodedJSValue JIT_OPERATION
operationValueAddNotNumber(ExecState
*, EncodedJSValue encodedOp1
, EncodedJSValue encodedOp2
) WTF_INTERNAL
;
48 EncodedJSValue JIT_OPERATION
operationGetByVal(ExecState
*, EncodedJSValue encodedBase
, EncodedJSValue encodedProperty
) WTF_INTERNAL
;
49 EncodedJSValue JIT_OPERATION
operationGetByValCell(ExecState
*, JSCell
*, EncodedJSValue encodedProperty
) WTF_INTERNAL
;
50 EncodedJSValue JIT_OPERATION
operationGetByValArrayInt(ExecState
*, JSArray
*, int32_t) WTF_INTERNAL
;
51 EncodedJSValue JIT_OPERATION
operationGetByValStringInt(ExecState
*, JSString
*, int32_t) WTF_INTERNAL
;
52 EncodedJSValue JIT_OPERATION
operationToPrimitive(ExecState
*, EncodedJSValue
) WTF_INTERNAL
;
53 char* JIT_OPERATION
operationNewArray(ExecState
*, Structure
*, void*, size_t) WTF_INTERNAL
;
54 char* JIT_OPERATION
operationNewArrayBuffer(ExecState
*, Structure
*, size_t, size_t) WTF_INTERNAL
;
55 char* JIT_OPERATION
operationNewEmptyArray(ExecState
*, Structure
*) WTF_INTERNAL
;
56 char* JIT_OPERATION
operationNewArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
57 char* JIT_OPERATION
operationNewInt8ArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
58 char* JIT_OPERATION
operationNewInt8ArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
59 char* JIT_OPERATION
operationNewInt16ArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
60 char* JIT_OPERATION
operationNewInt16ArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
61 char* JIT_OPERATION
operationNewInt32ArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
62 char* JIT_OPERATION
operationNewInt32ArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
63 char* JIT_OPERATION
operationNewUint8ArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
64 char* JIT_OPERATION
operationNewUint8ArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
65 char* JIT_OPERATION
operationNewUint8ClampedArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
66 char* JIT_OPERATION
operationNewUint8ClampedArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
67 char* JIT_OPERATION
operationNewUint16ArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
68 char* JIT_OPERATION
operationNewUint16ArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
69 char* JIT_OPERATION
operationNewUint32ArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
70 char* JIT_OPERATION
operationNewUint32ArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
71 char* JIT_OPERATION
operationNewFloat32ArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
72 char* JIT_OPERATION
operationNewFloat32ArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
73 char* JIT_OPERATION
operationNewFloat64ArrayWithSize(ExecState
*, Structure
*, int32_t) WTF_INTERNAL
;
74 char* JIT_OPERATION
operationNewFloat64ArrayWithOneArgument(ExecState
*, Structure
*, EncodedJSValue
) WTF_INTERNAL
;
75 void JIT_OPERATION
operationPutByValStrict(ExecState
*, EncodedJSValue encodedBase
, EncodedJSValue encodedProperty
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
76 void JIT_OPERATION
operationPutByValNonStrict(ExecState
*, EncodedJSValue encodedBase
, EncodedJSValue encodedProperty
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
77 void JIT_OPERATION
operationPutByValCellStrict(ExecState
*, JSCell
*, EncodedJSValue encodedProperty
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
78 void JIT_OPERATION
operationPutByValCellNonStrict(ExecState
*, JSCell
*, EncodedJSValue encodedProperty
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
79 void JIT_OPERATION
operationPutByValBeyondArrayBoundsStrict(ExecState
*, JSObject
*, int32_t index
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
80 void JIT_OPERATION
operationPutByValBeyondArrayBoundsNonStrict(ExecState
*, JSObject
*, int32_t index
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
81 void JIT_OPERATION
operationPutByValDirectBeyondArrayBoundsNonStrict(ExecState
*, JSObject
*, int32_t index
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
82 void JIT_OPERATION
operationPutByValDirectStrict(ExecState
*, EncodedJSValue encodedBase
, EncodedJSValue encodedProperty
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
83 void JIT_OPERATION
operationPutByValDirectNonStrict(ExecState
*, EncodedJSValue encodedBase
, EncodedJSValue encodedProperty
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
84 void JIT_OPERATION
operationPutByValDirectCellStrict(ExecState
*, JSCell
*, EncodedJSValue encodedProperty
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
85 void JIT_OPERATION
operationPutByValDirectCellNonStrict(ExecState
*, JSCell
*, EncodedJSValue encodedProperty
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
86 void JIT_OPERATION
operationPutByValDirectBeyondArrayBoundsStrict(ExecState
*, JSObject
*, int32_t index
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
87 void JIT_OPERATION
operationPutByValDirectBeyondArrayBoundsNonStrict(ExecState
*, JSObject
*, int32_t index
, EncodedJSValue encodedValue
) WTF_INTERNAL
;
88 void JIT_OPERATION
operationPutDoubleByValBeyondArrayBoundsStrict(ExecState
*, JSObject
*, int32_t index
, double value
) WTF_INTERNAL
;
89 void JIT_OPERATION
operationPutDoubleByValBeyondArrayBoundsNonStrict(ExecState
*, JSObject
*, int32_t index
, double value
) WTF_INTERNAL
;
90 EncodedJSValue JIT_OPERATION
operationArrayPush(ExecState
*, EncodedJSValue encodedValue
, JSArray
*) WTF_INTERNAL
;
91 EncodedJSValue JIT_OPERATION
operationArrayPushDouble(ExecState
*, double value
, JSArray
*) WTF_INTERNAL
;
92 EncodedJSValue JIT_OPERATION
operationArrayPop(ExecState
*, JSArray
*) WTF_INTERNAL
;
93 EncodedJSValue JIT_OPERATION
operationArrayPopAndRecoverLength(ExecState
*, JSArray
*) WTF_INTERNAL
;
94 EncodedJSValue JIT_OPERATION
operationRegExpExec(ExecState
*, JSCell
*, JSCell
*) WTF_INTERNAL
;
95 // These comparisons return a boolean within a size_t such that the value is zero extended to fill the register.
96 size_t JIT_OPERATION
operationRegExpTest(ExecState
*, JSCell
*, JSCell
*) WTF_INTERNAL
;
97 size_t JIT_OPERATION
operationCompareStrictEqCell(ExecState
*, EncodedJSValue encodedOp1
, EncodedJSValue encodedOp2
) WTF_INTERNAL
;
98 size_t JIT_OPERATION
operationCompareStrictEq(ExecState
*, EncodedJSValue encodedOp1
, EncodedJSValue encodedOp2
) WTF_INTERNAL
;
99 JSCell
* JIT_OPERATION
operationCreateActivationDirect(ExecState
*, Structure
*, JSScope
*, SymbolTable
*);
100 JSCell
* JIT_OPERATION
operationCreateDirectArguments(ExecState
*, Structure
*, int32_t length
, int32_t minCapacity
);
101 JSCell
* JIT_OPERATION
operationCreateDirectArgumentsDuringExit(ExecState
*, InlineCallFrame
*, JSFunction
*, int32_t argumentCount
);
102 JSCell
* JIT_OPERATION
operationCreateScopedArguments(ExecState
*, Structure
*, Register
* argumentStart
, int32_t length
, JSFunction
* callee
, JSLexicalEnvironment
*);
103 JSCell
* JIT_OPERATION
operationCreateClonedArgumentsDuringExit(ExecState
*, InlineCallFrame
*, JSFunction
*, int32_t argumentCount
);
104 JSCell
* JIT_OPERATION
operationCreateClonedArguments(ExecState
*, Structure
*, Register
* argumentStart
, int32_t length
, JSFunction
* callee
);
105 double JIT_OPERATION
operationFModOnInts(int32_t, int32_t) WTF_INTERNAL
;
106 size_t JIT_OPERATION
operationObjectIsObject(ExecState
*, JSGlobalObject
*, JSCell
*) WTF_INTERNAL
;
107 size_t JIT_OPERATION
operationObjectIsFunction(ExecState
*, JSGlobalObject
*, JSCell
*) WTF_INTERNAL
;
108 JSCell
* JIT_OPERATION
operationTypeOfObject(ExecState
*, JSGlobalObject
*, JSCell
*) WTF_INTERNAL
;
109 int32_t JIT_OPERATION
operationTypeOfObjectAsTypeofType(ExecState
*, JSGlobalObject
*, JSCell
*) WTF_INTERNAL
;
110 char* JIT_OPERATION
operationAllocatePropertyStorageWithInitialCapacity(ExecState
*) WTF_INTERNAL
;
111 char* JIT_OPERATION
operationAllocatePropertyStorage(ExecState
*, size_t newSize
) WTF_INTERNAL
;
112 char* JIT_OPERATION
operationReallocateButterflyToHavePropertyStorageWithInitialCapacity(ExecState
*, JSObject
*) WTF_INTERNAL
;
113 char* JIT_OPERATION
operationReallocateButterflyToGrowPropertyStorage(ExecState
*, JSObject
*, size_t newSize
) WTF_INTERNAL
;
114 char* JIT_OPERATION
operationEnsureInt32(ExecState
*, JSCell
*);
115 char* JIT_OPERATION
operationEnsureDouble(ExecState
*, JSCell
*);
116 char* JIT_OPERATION
operationEnsureContiguous(ExecState
*, JSCell
*);
117 char* JIT_OPERATION
operationEnsureArrayStorage(ExecState
*, JSCell
*);
118 StringImpl
* JIT_OPERATION
operationResolveRope(ExecState
*, JSString
*);
119 JSString
* JIT_OPERATION
operationSingleCharacterString(ExecState
*, int32_t);
121 JSCell
* JIT_OPERATION
operationNewStringObject(ExecState
*, JSString
*, Structure
*);
122 JSCell
* JIT_OPERATION
operationToStringOnCell(ExecState
*, JSCell
*);
123 JSCell
* JIT_OPERATION
operationToString(ExecState
*, EncodedJSValue
);
124 JSCell
* JIT_OPERATION
operationCallStringConstructorOnCell(ExecState
*, JSCell
*);
125 JSCell
* JIT_OPERATION
operationCallStringConstructor(ExecState
*, EncodedJSValue
);
126 JSCell
* JIT_OPERATION
operationMakeRope2(ExecState
*, JSString
*, JSString
*);
127 JSCell
* JIT_OPERATION
operationMakeRope3(ExecState
*, JSString
*, JSString
*, JSString
*);
128 char* JIT_OPERATION
operationFindSwitchImmTargetForDouble(ExecState
*, EncodedJSValue
, size_t tableIndex
);
129 char* JIT_OPERATION
operationSwitchString(ExecState
*, size_t tableIndex
, JSString
*);
130 int32_t JIT_OPERATION
operationSwitchStringAndGetBranchOffset(ExecState
*, size_t tableIndex
, JSString
*);
131 void JIT_OPERATION
operationNotifyWrite(ExecState
*, WatchpointSet
*);
132 void JIT_OPERATION
operationThrowStackOverflowForVarargs(ExecState
*) WTF_INTERNAL
;
133 int32_t JIT_OPERATION
operationSizeOfVarargs(ExecState
*, EncodedJSValue arguments
, int32_t firstVarArgOffset
);
134 void JIT_OPERATION
operationLoadVarargs(ExecState
*, int32_t firstElementDest
, EncodedJSValue arguments
, int32_t offset
, int32_t length
, int32_t mandatoryMinimum
);
136 int64_t JIT_OPERATION
operationConvertBoxedDoubleToInt52(EncodedJSValue
);
137 int64_t JIT_OPERATION
operationConvertDoubleToInt52(double);
139 void JIT_OPERATION
operationProcessTypeProfilerLogDFG(ExecState
*) WTF_INTERNAL
;
141 // These operations implement the implicitly called ToInt32 and ToBoolean conversions from ES5.
142 // This conversion returns an int32_t within a size_t such that the value is zero extended to fill the register.
143 size_t JIT_OPERATION
dfgConvertJSValueToInt32(ExecState
*, EncodedJSValue
) WTF_INTERNAL
;
145 void JIT_OPERATION
debugOperationPrintSpeculationFailure(ExecState
*, void*, void*) WTF_INTERNAL
;
147 void JIT_OPERATION
triggerReoptimizationNow(CodeBlock
*, OSRExitBase
*) WTF_INTERNAL
;
150 void JIT_OPERATION
triggerTierUpNow(ExecState
*) WTF_INTERNAL
;
151 void JIT_OPERATION
triggerTierUpNowInLoop(ExecState
*) WTF_INTERNAL
;
152 char* JIT_OPERATION
triggerOSREntryNow(ExecState
*, int32_t bytecodeIndex
, int32_t streamIndex
) WTF_INTERNAL
;
153 #endif // ENABLE(FTL_JIT)
157 inline P_JITOperation_EStZ
operationNewTypedArrayWithSizeForType(TypedArrayType type
)
161 return operationNewInt8ArrayWithSize
;
163 return operationNewInt16ArrayWithSize
;
165 return operationNewInt32ArrayWithSize
;
167 return operationNewUint8ArrayWithSize
;
168 case TypeUint8Clamped
:
169 return operationNewUint8ClampedArrayWithSize
;
171 return operationNewUint16ArrayWithSize
;
173 return operationNewUint32ArrayWithSize
;
175 return operationNewFloat32ArrayWithSize
;
177 return operationNewFloat64ArrayWithSize
;
182 RELEASE_ASSERT_NOT_REACHED();
186 inline P_JITOperation_EStJ
operationNewTypedArrayWithOneArgumentForType(TypedArrayType type
)
190 return operationNewInt8ArrayWithOneArgument
;
192 return operationNewInt16ArrayWithOneArgument
;
194 return operationNewInt32ArrayWithOneArgument
;
196 return operationNewUint8ArrayWithOneArgument
;
197 case TypeUint8Clamped
:
198 return operationNewUint8ClampedArrayWithOneArgument
;
200 return operationNewUint16ArrayWithOneArgument
;
202 return operationNewUint32ArrayWithOneArgument
;
204 return operationNewFloat32ArrayWithOneArgument
;
206 return operationNewFloat64ArrayWithOneArgument
;
211 RELEASE_ASSERT_NOT_REACHED();
215 } } // namespace JSC::DFG