blob: f72d33dbc8263907a0ff7de364092b75b71b5643 [file] [log] [blame]
mrowe@apple.comf88a4632008-09-07 05:44:58 +00001/*
2 * Copyright (C) 2008 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
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.
12 *
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.
24 */
25
ggaren@apple.comcc0f1f12008-11-17 23:16:00 +000026#ifndef JIT_h
27#define JIT_h
mrowe@apple.comf88a4632008-09-07 05:44:58 +000028
ggaren@apple.comf272d2d2008-11-17 04:25:37 +000029#include <wtf/Platform.h>
30
31#if ENABLE(JIT)
mrowe@apple.comf88a4632008-09-07 05:44:58 +000032
barraclough@apple.com71500d52008-09-15 02:18:13 +000033#define WTF_USE_CTI_REPATCH_PIC 1
34
ggaren@apple.com901a8a22008-11-17 20:57:18 +000035#include "Interpreter.h"
mrowe@apple.comf88a4632008-09-07 05:44:58 +000036#include "Opcode.h"
mrowe@apple.comf88a4632008-09-07 05:44:58 +000037#include "RegisterFile.h"
ggaren@apple.comf272d2d2008-11-17 04:25:37 +000038#include "X86Assembler.h"
39#include "Profiler.h"
mrowe@apple.comf88a4632008-09-07 05:44:58 +000040#include <wtf/AlwaysInline.h>
41#include <wtf/Vector.h>
42
mrowe@apple.comf88a4632008-09-07 05:44:58 +000043#define CTI_ARGS_code 0x0C
darin@apple.comd3f46402008-10-04 21:12:54 +000044#define CTI_ARGS_registerFile 0x0D
darin@apple.com8c2bac02008-10-09 00:40:43 +000045#define CTI_ARGS_callFrame 0x0E
darin@apple.comd3f46402008-10-04 21:12:54 +000046#define CTI_ARGS_exception 0x0F
47#define CTI_ARGS_profilerReference 0x10
48#define CTI_ARGS_globalData 0x11
mrowe@apple.comf88a4632008-09-07 05:44:58 +000049
darin@apple.com5a494422008-10-18 23:08:12 +000050#define ARG_callFrame static_cast<CallFrame*>(ARGS[CTI_ARGS_callFrame])
51#define ARG_registerFile static_cast<RegisterFile*>(ARGS[CTI_ARGS_registerFile])
darin@apple.com44331f82008-10-24 16:22:51 +000052#define ARG_exception static_cast<JSValue**>(ARGS[CTI_ARGS_exception])
darin@apple.com5a494422008-10-18 23:08:12 +000053#define ARG_profilerReference static_cast<Profiler**>(ARGS[CTI_ARGS_profilerReference])
54#define ARG_globalData static_cast<JSGlobalData*>(ARGS[CTI_ARGS_globalData])
mrowe@apple.comf88a4632008-09-07 05:44:58 +000055
darin@apple.com5a494422008-10-18 23:08:12 +000056#define ARG_setCallFrame(newCallFrame) (ARGS[CTI_ARGS_callFrame] = (newCallFrame))
mrowe@apple.comf88a4632008-09-07 05:44:58 +000057
darin@apple.com5c465b02008-10-19 16:58:58 +000058#define ARG_src1 static_cast<JSValue*>(ARGS[1])
59#define ARG_src2 static_cast<JSValue*>(ARGS[2])
60#define ARG_src3 static_cast<JSValue*>(ARGS[3])
61#define ARG_src4 static_cast<JSValue*>(ARGS[4])
62#define ARG_src5 static_cast<JSValue*>(ARGS[5])
darin@apple.com5a494422008-10-18 23:08:12 +000063#define ARG_id1 static_cast<Identifier*>(ARGS[1])
64#define ARG_id2 static_cast<Identifier*>(ARGS[2])
65#define ARG_id3 static_cast<Identifier*>(ARGS[3])
66#define ARG_id4 static_cast<Identifier*>(ARGS[4])
67#define ARG_int1 reinterpret_cast<intptr_t>(ARGS[1])
68#define ARG_int2 reinterpret_cast<intptr_t>(ARGS[2])
69#define ARG_int3 reinterpret_cast<intptr_t>(ARGS[3])
70#define ARG_int4 reinterpret_cast<intptr_t>(ARGS[4])
71#define ARG_int5 reinterpret_cast<intptr_t>(ARGS[5])
72#define ARG_int6 reinterpret_cast<intptr_t>(ARGS[6])
73#define ARG_func1 static_cast<FuncDeclNode*>(ARGS[1])
74#define ARG_funcexp1 static_cast<FuncExprNode*>(ARGS[1])
75#define ARG_registers1 static_cast<Register*>(ARGS[1])
76#define ARG_regexp1 static_cast<RegExp*>(ARGS[1])
77#define ARG_pni1 static_cast<JSPropertyNameIterator*>(ARGS[1])
78#define ARG_instr1 static_cast<Instruction*>(ARGS[1])
79#define ARG_instr2 static_cast<Instruction*>(ARGS[2])
80#define ARG_instr3 static_cast<Instruction*>(ARGS[3])
81#define ARG_instr4 static_cast<Instruction*>(ARGS[4])
82#define ARG_instr5 static_cast<Instruction*>(ARGS[5])
83#define ARG_instr6 static_cast<Instruction*>(ARGS[6])
barraclough@apple.com1bab56d2008-11-15 01:33:36 +000084#define ARG_returnAddress2 static_cast<void*>(ARGS[2])
barraclough@apple.com52eea522008-11-07 01:30:03 +000085#define ARG_codeBlock4 static_cast<CodeBlock*>(ARGS[4])
darin@apple.com5a494422008-10-18 23:08:12 +000086
87#define CTI_RETURN_ADDRESS_SLOT (ARGS[-1])
mrowe@apple.comf88a4632008-09-07 05:44:58 +000088
oliver@apple.com487b61b2008-10-30 04:33:21 +000089#if COMPILER(MSVC)
90#define FASTCALL __fastcall
91#elif COMPILER(GCC)
92#define FASTCALL __attribute__ ((fastcall))
93#else
94#error Need to support fastcall calling convention in this compiler
95#endif
96
cwzwarich@webkit.org3f782f62008-09-08 01:28:33 +000097namespace JSC {
mrowe@apple.comf88a4632008-09-07 05:44:58 +000098
99 class CodeBlock;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000100 class JSPropertyNameIterator;
ggaren@apple.com031563e2008-11-17 02:21:16 +0000101 class Interpreter;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000102 class Register;
103 class RegisterFile;
104 class ScopeChainNode;
105 class SimpleJumpTable;
106 class StringJumpTable;
darin@apple.coma9778f92008-11-16 04:40:06 +0000107 class StructureChain;
darin@apple.com5a494422008-10-18 23:08:12 +0000108
barraclough@apple.come9642652008-10-23 22:29:54 +0000109 struct CallLinkInfo;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000110 struct Instruction;
barraclough@apple.comb8b15e22008-09-27 01:44:15 +0000111 struct OperandTypes;
barraclough@apple.combc0fea62008-11-22 03:34:43 +0000112 struct PolymorphicAccessStructureList;
barraclough@apple.comf5f74822008-11-21 05:04:19 +0000113 struct StructureStubInfo;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000114
darin@apple.com40d7c812008-10-20 16:22:55 +0000115 typedef JSValue* (SFX_CALL *CTIHelper_j)(CTI_ARGS);
116 typedef JSObject* (SFX_CALL *CTIHelper_o)(CTI_ARGS);
mjs@apple.com36f4f422008-10-15 02:39:52 +0000117 typedef JSPropertyNameIterator* (SFX_CALL *CTIHelper_p)(CTI_ARGS);
118 typedef void (SFX_CALL *CTIHelper_v)(CTI_ARGS);
119 typedef void* (SFX_CALL *CTIHelper_s)(CTI_ARGS);
120 typedef int (SFX_CALL *CTIHelper_b)(CTI_ARGS);
121 typedef VoidPtrPair (SFX_CALL *CTIHelper_2)(CTI_ARGS);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000122
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000123 struct CallRecord {
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000124 typedef X86Assembler::JmpSrc JmpSrc;
125
126 JmpSrc from;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000127 void* to;
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000128 unsigned bytecodeIndex;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000129
130 CallRecord()
131 {
132 }
133
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000134 CallRecord(JmpSrc f, CTIHelper_j t, unsigned i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000135 : from(f)
darin@apple.com40d7c812008-10-20 16:22:55 +0000136 , to(reinterpret_cast<void*>(t))
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000137 , bytecodeIndex(i)
darin@apple.com40d7c812008-10-20 16:22:55 +0000138 {
139 }
140
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000141 CallRecord(JmpSrc f, CTIHelper_o t, unsigned i)
darin@apple.com40d7c812008-10-20 16:22:55 +0000142 : from(f)
143 , to(reinterpret_cast<void*>(t))
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000144 , bytecodeIndex(i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000145 {
146 }
147
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000148 CallRecord(JmpSrc f, CTIHelper_p t, unsigned i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000149 : from(f)
darin@apple.com40d7c812008-10-20 16:22:55 +0000150 , to(reinterpret_cast<void*>(t))
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000151 , bytecodeIndex(i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000152 {
153 }
154
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000155 CallRecord(JmpSrc f, CTIHelper_v t, unsigned i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000156 : from(f)
darin@apple.com40d7c812008-10-20 16:22:55 +0000157 , to(reinterpret_cast<void*>(t))
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000158 , bytecodeIndex(i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000159 {
160 }
161
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000162 CallRecord(JmpSrc f, CTIHelper_s t, unsigned i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000163 : from(f)
darin@apple.com40d7c812008-10-20 16:22:55 +0000164 , to(reinterpret_cast<void*>(t))
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000165 , bytecodeIndex(i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000166 {
167 }
168
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000169 CallRecord(JmpSrc f, CTIHelper_b t, unsigned i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000170 : from(f)
darin@apple.com40d7c812008-10-20 16:22:55 +0000171 , to(reinterpret_cast<void*>(t))
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000172 , bytecodeIndex(i)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000173 {
174 }
ggaren@apple.com107bd0e2008-09-24 00:27:18 +0000175
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000176 CallRecord(JmpSrc f, CTIHelper_2 t, unsigned i)
barraclough@apple.com79c9ae12008-10-07 20:27:50 +0000177 : from(f)
darin@apple.com40d7c812008-10-20 16:22:55 +0000178 , to(reinterpret_cast<void*>(t))
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000179 , bytecodeIndex(i)
barraclough@apple.com79c9ae12008-10-07 20:27:50 +0000180 {
181 }
182
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000183 CallRecord(JmpSrc f, unsigned i)
ggaren@apple.com107bd0e2008-09-24 00:27:18 +0000184 : from(f)
185 , to(0)
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000186 , bytecodeIndex(i)
ggaren@apple.com107bd0e2008-09-24 00:27:18 +0000187 {
188 }
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000189 };
190
191 struct JmpTable {
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000192 typedef X86Assembler::JmpSrc JmpSrc;
193
194 JmpSrc from;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000195 unsigned to;
196
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000197 JmpTable(JmpSrc f, unsigned t)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000198 : from(f)
199 , to(t)
200 {
201 }
202 };
203
204 struct SlowCaseEntry {
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000205 typedef X86Assembler::JmpSrc JmpSrc;
206
207 JmpSrc from;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000208 unsigned to;
209 unsigned hint;
210
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000211 SlowCaseEntry(JmpSrc f, unsigned t, unsigned h = 0)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000212 : from(f)
213 , to(t)
214 , hint(h)
215 {
216 }
217 };
218
219 struct SwitchRecord {
220 enum Type {
221 Immediate,
222 Character,
223 String
224 };
225
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000226 Type type;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000227
228 union {
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000229 SimpleJumpTable* simpleJumpTable;
230 StringJumpTable* stringJumpTable;
231 } jumpTable;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000232
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000233 unsigned bytecodeIndex;
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000234 unsigned defaultOffset;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000235
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000236 SwitchRecord(SimpleJumpTable* jumpTable, unsigned bytecodeIndex, unsigned defaultOffset, Type type)
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000237 : type(type)
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000238 , bytecodeIndex(bytecodeIndex)
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000239 , defaultOffset(defaultOffset)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000240 {
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000241 this->jumpTable.simpleJumpTable = jumpTable;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000242 }
243
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000244 SwitchRecord(StringJumpTable* jumpTable, unsigned bytecodeIndex, unsigned defaultOffset)
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000245 : type(String)
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000246 , bytecodeIndex(bytecodeIndex)
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000247 , defaultOffset(defaultOffset)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000248 {
cwzwarich@webkit.orge8827732008-11-11 18:31:51 +0000249 this->jumpTable.stringJumpTable = jumpTable;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000250 }
251 };
252
barraclough@apple.com71500d52008-09-15 02:18:13 +0000253 struct StructureStubCompilationInfo {
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000254 typedef X86Assembler::JmpSrc JmpSrc;
255 typedef X86Assembler::JmpDst JmpDst;
256
257 JmpSrc callReturnLocation;
258 JmpDst hotPathBegin;
259 JmpSrc hotPathOther;
260 JmpDst coldPathOther;
barraclough@apple.com71500d52008-09-15 02:18:13 +0000261 };
262
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000263 extern "C" {
darin@apple.com44331f82008-10-24 16:22:51 +0000264 JSValue* ctiTrampoline(void* code, RegisterFile*, CallFrame*, JSValue** exception, Profiler**, JSGlobalData*);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000265 void ctiVMThrowTrampoline();
266 };
267
268 void ctiSetReturnAddress(void** where, void* what);
269 void ctiRepatchCallByReturnAddress(void* where, void* what);
270
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000271 class JIT {
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000272 typedef X86Assembler::RegisterID RegisterID;
273 typedef X86Assembler::XMMRegisterID XMMRegisterID;
274 typedef X86Assembler::JmpSrc JmpSrc;
275 typedef X86Assembler::JmpDst JmpDst;
276
darin@apple.coma9778f92008-11-16 04:40:06 +0000277 static const int repatchGetByIdDefaultStructure = -1;
barraclough@apple.com71500d52008-09-15 02:18:13 +0000278 // Magic number - initial offset cannot be representable as a signed 8bit value, or the X86Assembler
279 // will compress the displacement, and we may not be able to fit a repatched offset.
280 static const int repatchGetByIdDefaultOffset = 256;
281
mjs@apple.com36f4f422008-10-15 02:39:52 +0000282#if USE(FAST_CALL_CTI_ARGUMENT)
oliver@apple.com6dc83fb2008-10-08 04:56:38 +0000283 static const int ctiArgumentInitSize = 2;
mjs@apple.com36f4f422008-10-15 02:39:52 +0000284#elif USE(CTI_ARGUMENT)
285 static const int ctiArgumentInitSize = 4;
286#else
287 static const int ctiArgumentInitSize = 0;
288#endif
barraclough@apple.com71500d52008-09-15 02:18:13 +0000289 // These architecture specific value are used to enable repatching - see comment on op_put_by_id.
darin@apple.coma9778f92008-11-16 04:40:06 +0000290 static const int repatchOffsetPutByIdStructure = 7;
mjs@apple.come32adbc2008-11-13 12:53:35 +0000291 static const int repatchOffsetPutByIdPropertyMapOffset = 22;
barraclough@apple.com71500d52008-09-15 02:18:13 +0000292 // These architecture specific value are used to enable repatching - see comment on op_get_by_id.
darin@apple.coma9778f92008-11-16 04:40:06 +0000293 static const int repatchOffsetGetByIdStructure = 7;
mjs@apple.come32adbc2008-11-13 12:53:35 +0000294 static const int repatchOffsetGetByIdBranchToSlowCase = 13;
295 static const int repatchOffsetGetByIdPropertyMapOffset = 22;
ggaren@apple.com47d3f052008-11-15 21:37:49 +0000296#if ENABLE(OPCODE_SAMPLING)
mjs@apple.com0d68a332008-10-17 09:06:42 +0000297 static const int repatchOffsetGetByIdSlowCaseCall = 27 + 4 + ctiArgumentInitSize;
barraclough@apple.com6bd3e1652008-10-05 17:38:32 +0000298#else
mjs@apple.com0d68a332008-10-17 09:06:42 +0000299 static const int repatchOffsetGetByIdSlowCaseCall = 17 + 4 + ctiArgumentInitSize;
barraclough@apple.com6bd3e1652008-10-05 17:38:32 +0000300#endif
barraclough@apple.com3a4eb9b2008-10-18 02:51:52 +0000301 static const int repatchOffsetOpCallCall = 6;
barraclough@apple.com71500d52008-09-15 02:18:13 +0000302
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000303 public:
barraclough@apple.com7c876fc2008-11-11 05:09:46 +0000304 static void compile(JSGlobalData* globalData, CodeBlock* codeBlock)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000305 {
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000306 JIT jit(globalData, codeBlock);
307 jit.privateCompile();
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000308 }
309
darin@apple.coma9778f92008-11-16 04:40:06 +0000310 static void compileGetByIdSelf(JSGlobalData* globalData, CodeBlock* codeBlock, Structure* structure, size_t cachedOffset, void* returnAddress)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000311 {
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000312 JIT jit(globalData, codeBlock);
313 jit.privateCompileGetByIdSelf(structure, cachedOffset, returnAddress);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000314 }
315
darin@apple.coma9778f92008-11-16 04:40:06 +0000316 static void compileGetByIdProto(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, void* returnAddress)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000317 {
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000318 JIT jit(globalData, codeBlock);
319 jit.privateCompileGetByIdProto(structure, prototypeStructure, cachedOffset, returnAddress, callFrame);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000320 }
321
barraclough@apple.comf5f74822008-11-21 05:04:19 +0000322#if USE(CTI_REPATCH_PIC)
barraclough@apple.combc0fea62008-11-22 03:34:43 +0000323 static void compileGetByIdSelfList(JSGlobalData* globalData, CodeBlock* codeBlock, StructureStubInfo* stubInfo, PolymorphicAccessStructureList* polymorphicStructures, int currentIndex, Structure* structure, size_t cachedOffset)
324 {
325 JIT jit(globalData, codeBlock);
326 jit.privateCompileGetByIdSelfList(stubInfo, polymorphicStructures, currentIndex, structure, cachedOffset);
327 }
328 static void compileGetByIdProtoList(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructureList, int currentIndex, Structure* structure, Structure* prototypeStructure, size_t cachedOffset)
barraclough@apple.comf5f74822008-11-21 05:04:19 +0000329 {
330 JIT jit(globalData, codeBlock);
331 jit.privateCompileGetByIdProtoList(stubInfo, prototypeStructureList, currentIndex, structure, prototypeStructure, cachedOffset, callFrame);
332 }
333#endif
334
darin@apple.coma9778f92008-11-16 04:40:06 +0000335 static void compileGetByIdChain(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, void* returnAddress)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000336 {
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000337 JIT jit(globalData, codeBlock);
338 jit.privateCompileGetByIdChain(structure, chain, count, cachedOffset, returnAddress, callFrame);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000339 }
340
darin@apple.coma9778f92008-11-16 04:40:06 +0000341 static void compilePutByIdReplace(JSGlobalData* globalData, CodeBlock* codeBlock, Structure* structure, size_t cachedOffset, void* returnAddress)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000342 {
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000343 JIT jit(globalData, codeBlock);
344 jit.privateCompilePutByIdReplace(structure, cachedOffset, returnAddress);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000345 }
oliver@apple.come3c5d0e2008-09-14 08:18:49 +0000346
darin@apple.coma9778f92008-11-16 04:40:06 +0000347 static void compilePutByIdTransition(JSGlobalData* globalData, CodeBlock* codeBlock, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, void* returnAddress)
oliver@apple.come3c5d0e2008-09-14 08:18:49 +0000348 {
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000349 JIT jit(globalData, codeBlock);
350 jit.privateCompilePutByIdTransition(oldStructure, newStructure, cachedOffset, chain, returnAddress);
oliver@apple.come3c5d0e2008-09-14 08:18:49 +0000351 }
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000352
barraclough@apple.com7c876fc2008-11-11 05:09:46 +0000353 static void compileCTIMachineTrampolines(JSGlobalData* globalData)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000354 {
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000355 JIT jit(globalData);
356 jit.privateCompileCTIMachineTrampolines();
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000357 }
ggaren@apple.com031563e2008-11-17 02:21:16 +0000358 static void freeCTIMachineTrampolines(Interpreter*);
barraclough@apple.com71500d52008-09-15 02:18:13 +0000359
darin@apple.coma9778f92008-11-16 04:40:06 +0000360 static void patchGetByIdSelf(CodeBlock* codeBlock, Structure* structure, size_t cachedOffset, void* returnAddress);
361 static void patchPutByIdReplace(CodeBlock* codeBlock, Structure* structure, size_t cachedOffset, void* returnAddress);
barraclough@apple.com71500d52008-09-15 02:18:13 +0000362
barraclough@apple.com7c876fc2008-11-11 05:09:46 +0000363 static void compilePatchGetArrayLength(JSGlobalData* globalData, CodeBlock* codeBlock, void* returnAddress)
barraclough@apple.com71500d52008-09-15 02:18:13 +0000364 {
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000365 JIT jit(globalData, codeBlock);
366 return jit.privateCompilePatchGetArrayLength(returnAddress);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000367 }
368
barraclough@apple.come9642652008-10-23 22:29:54 +0000369 static void linkCall(JSFunction* callee, CodeBlock* calleeCodeBlock, void* ctiCode, CallLinkInfo* callLinkInfo, int callerArgCount);
370 static void unlinkCall(CallLinkInfo*);
barraclough@apple.com3a4eb9b2008-10-18 02:51:52 +0000371
darin@apple.com44331f82008-10-24 16:22:51 +0000372 inline static JSValue* execute(void* code, RegisterFile* registerFile, CallFrame* callFrame, JSGlobalData* globalData, JSValue** exception)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000373 {
darin@apple.com8c2bac02008-10-09 00:40:43 +0000374 return ctiTrampoline(code, registerFile, callFrame, exception, Profiler::enabledProfilerReference(), globalData);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000375 }
376
377 private:
ggaren@apple.com4f7d7a92008-11-17 03:34:05 +0000378 JIT(JSGlobalData*, CodeBlock* = 0);
darin@apple.com5a494422008-10-18 23:08:12 +0000379
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000380 void privateCompileMainPass();
381 void privateCompileLinkPass();
382 void privateCompileSlowCases();
383 void privateCompile();
darin@apple.coma9778f92008-11-16 04:40:06 +0000384 void privateCompileGetByIdSelf(Structure*, size_t cachedOffset, void* returnAddress);
385 void privateCompileGetByIdProto(Structure*, Structure* prototypeStructure, size_t cachedOffset, void* returnAddress, CallFrame* callFrame);
barraclough@apple.comf5f74822008-11-21 05:04:19 +0000386#if USE(CTI_REPATCH_PIC)
barraclough@apple.combc0fea62008-11-22 03:34:43 +0000387 void privateCompileGetByIdSelfList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, size_t cachedOffset);
388 void privateCompileGetByIdProtoList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, Structure* prototypeStructure, size_t cachedOffset, CallFrame* callFrame);
barraclough@apple.comf5f74822008-11-21 05:04:19 +0000389#endif
darin@apple.coma9778f92008-11-16 04:40:06 +0000390 void privateCompileGetByIdChain(Structure*, StructureChain*, size_t count, size_t cachedOffset, void* returnAddress, CallFrame* callFrame);
391 void privateCompilePutByIdReplace(Structure*, size_t cachedOffset, void* returnAddress);
392 void privateCompilePutByIdTransition(Structure*, Structure*, size_t cachedOffset, StructureChain*, void* returnAddress);
barraclough@apple.com71500d52008-09-15 02:18:13 +0000393
barraclough@apple.com7c876fc2008-11-11 05:09:46 +0000394 void privateCompileCTIMachineTrampolines();
barraclough@apple.com71500d52008-09-15 02:18:13 +0000395 void privateCompilePatchGetArrayLength(void* returnAddress);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000396
ggaren@apple.com47d3f052008-11-15 21:37:49 +0000397 void compileOpCall(OpcodeID, Instruction* instruction, unsigned i, unsigned callLinkInfoIndex);
barraclough@apple.com1bab56d2008-11-15 01:33:36 +0000398 void compileOpCallInitializeCallFrame();
ggaren@apple.com68313b02008-11-13 00:48:23 +0000399 void compileOpCallSetupArgs(Instruction*);
400 void compileOpCallEvalSetupArgs(Instruction*);
401 void compileOpConstructSetupArgs(Instruction*);
mjs@apple.comdb29af22008-09-23 13:20:23 +0000402 enum CompileOpStrictEqType { OpStrictEq, OpNStrictEq };
403 void compileOpStrictEq(Instruction* instruction, unsigned i, CompileOpStrictEqType type);
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000404 void putDoubleResultToJSNumberCellOrJSImmediate(XMMRegisterID xmmSource, RegisterID jsNumberCell, unsigned dst, JmpSrc* wroteJSNumberCell, XMMRegisterID tempXmm, RegisterID tempReg1, RegisterID tempReg2);
ggaren@apple.com47d3f052008-11-15 21:37:49 +0000405 void compileBinaryArithOp(OpcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes opi, unsigned i);
406 void compileBinaryArithOpSlowCase(Instruction*, OpcodeID, Vector<SlowCaseEntry>::iterator& iter, unsigned dst, unsigned src1, unsigned src2, OperandTypes opi, unsigned i);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000407
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000408 void emitGetVirtualRegister(int src, RegisterID dst, unsigned i);
409 void emitGetVirtualRegisters(int src1, RegisterID dst1, int src2, RegisterID dst2, unsigned i);
410 void emitPutVirtualRegister(unsigned dst, RegisterID from = X86::eax);
barraclough@apple.coma5524512008-11-15 02:51:39 +0000411
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000412 void emitPutCTIArg(RegisterID src, unsigned offset);
413 void emitPutCTIArgFromVirtualRegister(unsigned src, unsigned offset, RegisterID scratch);
barraclough@apple.coma5524512008-11-15 02:51:39 +0000414 void emitPutCTIArgConstant(unsigned value, unsigned offset);
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000415 void emitGetCTIArg(unsigned offset, RegisterID dst);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000416
ggaren@apple.com107bd0e2008-09-24 00:27:18 +0000417 void emitInitRegister(unsigned dst);
oliver@apple.comecfd2242008-09-20 03:00:43 +0000418
barraclough@apple.comce5a0b32008-09-16 17:40:01 +0000419 void emitPutCTIParam(void* value, unsigned name);
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000420 void emitPutCTIParam(RegisterID from, unsigned name);
421 void emitGetCTIParam(unsigned name, RegisterID to);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000422
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000423 void emitPutToCallFrameHeader(RegisterID from, RegisterFile::CallFrameHeaderEntry entry);
424 void emitGetFromCallFrameHeader(RegisterFile::CallFrameHeaderEntry entry, RegisterID to);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000425
darin@apple.com44331f82008-10-24 16:22:51 +0000426 JSValue* getConstantImmediateNumericArg(unsigned src);
427 unsigned getDeTaggedConstantImmediate(JSValue* imm);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000428
mjs@apple.come32adbc2008-11-13 12:53:35 +0000429 bool linkSlowCaseIfNotJSCell(const Vector<SlowCaseEntry>::iterator&, int vReg);
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000430 void emitJumpSlowCaseIfNotJSCell(RegisterID, unsigned bytecodeIndex);
431 void emitJumpSlowCaseIfNotJSCell(RegisterID, unsigned bytecodeIndex, int VReg);
weinig@apple.com262302f2008-09-16 03:46:58 +0000432
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000433 void emitJumpSlowCaseIfNotImmNum(RegisterID, unsigned bytecodeIndex);
434 void emitJumpSlowCaseIfNotImmNums(RegisterID, RegisterID, unsigned bytecodeIndex);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000435
barraclough@apple.comf5f74822008-11-21 05:04:19 +0000436 JmpSrc checkStructure(RegisterID reg, Structure* structure);
437
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000438 void emitFastArithDeTagImmediate(RegisterID);
439 JmpSrc emitFastArithDeTagImmediateJumpIfZero(RegisterID);
440 void emitFastArithReTagImmediate(RegisterID);
441 void emitFastArithPotentiallyReTagImmediate(RegisterID);
442 void emitFastArithImmToInt(RegisterID);
443 void emitFastArithIntToImmOrSlowCase(RegisterID, unsigned bytecodeIndex);
444 void emitFastArithIntToImmNoCheck(RegisterID);
445 JmpSrc emitArithIntToImmWithJump(RegisterID reg);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000446
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000447 void emitTagAsBoolImmediate(RegisterID reg);
mjs@apple.com40328732008-09-21 10:39:29 +0000448
oliver@apple.com487b61b2008-10-30 04:33:21 +0000449 void emitAllocateNumber(JSGlobalData*, unsigned);
450
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000451 JmpSrc emitNakedCall(unsigned bytecodeIndex, RegisterID);
452 JmpSrc emitNakedCall(unsigned bytecodeIndex, void* function);
453 JmpSrc emitNakedFastCall(unsigned bytecodeIndex, void*);
454 JmpSrc emitCTICall(Instruction*, unsigned bytecodeIndex, CTIHelper_j);
455 JmpSrc emitCTICall(Instruction*, unsigned bytecodeIndex, CTIHelper_o);
456 JmpSrc emitCTICall(Instruction*, unsigned bytecodeIndex, CTIHelper_p);
457 JmpSrc emitCTICall(Instruction*, unsigned bytecodeIndex, CTIHelper_v);
458 JmpSrc emitCTICall(Instruction*, unsigned bytecodeIndex, CTIHelper_s);
459 JmpSrc emitCTICall(Instruction*, unsigned bytecodeIndex, CTIHelper_b);
460 JmpSrc emitCTICall(Instruction*, unsigned bytecodeIndex, CTIHelper_2);
barraclough@apple.com79c9ae12008-10-07 20:27:50 +0000461
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000462 void emitGetVariableObjectRegister(RegisterID variableObject, int index, RegisterID dst);
463 void emitPutVariableObjectRegister(RegisterID src, RegisterID variableObject, int index);
oliver@apple.com957eefc2008-09-10 09:23:35 +0000464
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000465 void emitSlowScriptCheck(Instruction*, unsigned bytecodeIndex);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000466#ifndef NDEBUG
ggaren@apple.com77dd3c62008-11-15 20:34:40 +0000467 void printBytecodeOperandTypes(unsigned src1, unsigned src2);
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000468#endif
469
cwzwarich@webkit.orgeacadfb2008-11-13 11:26:38 +0000470 void killLastResultRegister();
471
ggaren@apple.com4d997cb2008-11-15 22:43:27 +0000472 X86Assembler m_assembler;
ggaren@apple.com031563e2008-11-17 02:21:16 +0000473 Interpreter* m_interpreter;
barraclough@apple.com7c876fc2008-11-11 05:09:46 +0000474 JSGlobalData* m_globalData;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000475 CodeBlock* m_codeBlock;
476
477 Vector<CallRecord> m_calls;
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000478 Vector<JmpDst> m_labels;
barraclough@apple.come9642652008-10-23 22:29:54 +0000479 Vector<StructureStubCompilationInfo> m_propertyAccessCompilationInfo;
480 Vector<StructureStubCompilationInfo> m_callStructureStubCompilationInfo;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000481 Vector<JmpTable> m_jmpTable;
482
483 struct JSRInfo {
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000484 JmpDst addrPosition;
485 JmpDst target;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000486
ggaren@apple.com0bbea112008-11-17 03:21:12 +0000487 JSRInfo(const JmpDst& storeLocation, const JmpDst& targetLocation)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000488 : addrPosition(storeLocation)
489 , target(targetLocation)
490 {
491 }
492 };
493
494 Vector<JSRInfo> m_jsrSites;
495 Vector<SlowCaseEntry> m_slowCases;
496 Vector<SwitchRecord> m_switches;
497
cwzwarich@webkit.orgeacadfb2008-11-13 11:26:38 +0000498 int m_lastResultBytecodeRegister;
499 unsigned m_jumpTargetsPosition;
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000500 };
501}
502
ggaren@apple.comf272d2d2008-11-17 04:25:37 +0000503#endif // ENABLE(JIT)
mrowe@apple.comf88a4632008-09-07 05:44:58 +0000504
ggaren@apple.comcc0f1f12008-11-17 23:16:00 +0000505#endif // JIT_h