blob: 4331b088fb7c59f2b32973f38cf60fb4b4af9f01 [file] [log] [blame]
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00001// Copyright 2012 the V8 project authors. All rights reserved.
rossberg@chromium.org34849642014-04-29 16:30:47 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
ager@chromium.org8bb60582008-12-11 12:02:20 +00004
machenbach@chromium.org196eb602014-06-04 00:06:13 +00005#include "src/v8.h"
ager@chromium.org8bb60582008-12-11 12:02:20 +00006
jkummerow@chromium.org93a47f42013-07-02 14:43:41 +00007#if V8_TARGET_ARCH_IA32
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00008
machenbach@chromium.org196eb602014-06-04 00:06:13 +00009#include "src/codegen.h"
10#include "src/debug.h"
ager@chromium.org8bb60582008-12-11 12:02:20 +000011
12
kasperl@chromium.org71affb52009-05-26 05:44:31 +000013namespace v8 {
14namespace internal {
ager@chromium.org8bb60582008-12-11 12:02:20 +000015
iposva@chromium.org245aa852009-02-10 00:49:54 +000016bool BreakLocationIterator::IsDebugBreakAtReturn() {
ager@chromium.org381abbb2009-02-25 13:23:22 +000017 return Debug::IsDebugBreakAtReturn(rinfo());
iposva@chromium.org245aa852009-02-10 00:49:54 +000018}
19
20
21// Patch the JS frame exit code with a debug break call. See
22// CodeGenerator::VisitReturnStatement and VirtualFrame::Exit in codegen-ia32.cc
23// for the precise return instructions sequence.
24void BreakLocationIterator::SetDebugBreakAtReturn() {
machenbach@chromium.orge3c177a2014-08-05 00:05:55 +000025 DCHECK(Assembler::kJSReturnSequenceLength >=
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +000026 Assembler::kCallInstructionLength);
dslomov@chromium.orge97852d2013-09-12 09:02:59 +000027 rinfo()->PatchCodeWithCall(
machenbach@chromium.orgaf6f6992014-05-06 00:04:47 +000028 debug_info_->GetIsolate()->builtins()->Return_DebugBreak()->entry(),
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +000029 Assembler::kJSReturnSequenceLength - Assembler::kCallInstructionLength);
iposva@chromium.org245aa852009-02-10 00:49:54 +000030}
31
32
33// Restore the JS frame exit code.
34void BreakLocationIterator::ClearDebugBreakAtReturn() {
35 rinfo()->PatchCode(original_rinfo()->pc(),
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +000036 Assembler::kJSReturnSequenceLength);
iposva@chromium.org245aa852009-02-10 00:49:54 +000037}
38
39
ager@chromium.orga1645e22009-09-09 19:27:10 +000040// A debug break in the frame exit code is identified by the JS frame exit code
41// having been patched with a call instruction.
ager@chromium.org381abbb2009-02-25 13:23:22 +000042bool Debug::IsDebugBreakAtReturn(RelocInfo* rinfo) {
machenbach@chromium.orge3c177a2014-08-05 00:05:55 +000043 DCHECK(RelocInfo::IsJSReturn(rinfo->rmode()));
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +000044 return rinfo->IsPatchedReturnSequence();
ager@chromium.org381abbb2009-02-25 13:23:22 +000045}
46
47
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +000048bool BreakLocationIterator::IsDebugBreakAtSlot() {
machenbach@chromium.orge3c177a2014-08-05 00:05:55 +000049 DCHECK(IsDebugBreakSlot());
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +000050 // Check whether the debug break slot instructions have been patched.
51 return rinfo()->IsPatchedDebugBreakSlotSequence();
52}
53
54
55void BreakLocationIterator::SetDebugBreakAtSlot() {
machenbach@chromium.orge3c177a2014-08-05 00:05:55 +000056 DCHECK(IsDebugBreakSlot());
dslomov@chromium.orge97852d2013-09-12 09:02:59 +000057 Isolate* isolate = debug_info_->GetIsolate();
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +000058 rinfo()->PatchCodeWithCall(
machenbach@chromium.orgaf6f6992014-05-06 00:04:47 +000059 isolate->builtins()->Slot_DebugBreak()->entry(),
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +000060 Assembler::kDebugBreakSlotLength - Assembler::kCallInstructionLength);
61}
62
63
64void BreakLocationIterator::ClearDebugBreakAtSlot() {
machenbach@chromium.orge3c177a2014-08-05 00:05:55 +000065 DCHECK(IsDebugBreakSlot());
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +000066 rinfo()->PatchCode(original_rinfo()->pc(), Assembler::kDebugBreakSlotLength);
67}
68
mstarzinger@chromium.orge0e1b0d2013-07-08 08:38:06 +000069
ager@chromium.org65dad4b2009-04-23 08:48:43 +000070#define __ ACCESS_MASM(masm)
ager@chromium.org8bb60582008-12-11 12:02:20 +000071
ager@chromium.org8bb60582008-12-11 12:02:20 +000072static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +000073 RegList object_regs,
74 RegList non_object_regs,
ager@chromium.org8bb60582008-12-11 12:02:20 +000075 bool convert_call_to_jmp) {
ager@chromium.org8bb60582008-12-11 12:02:20 +000076 // Enter an internal frame.
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000077 {
78 FrameScope scope(masm, StackFrame::INTERNAL);
ager@chromium.org8bb60582008-12-11 12:02:20 +000079
jkummerow@chromium.org212d9642012-05-11 15:02:09 +000080 // Load padding words on stack.
machenbach@chromium.orge31b63e2014-05-29 00:04:57 +000081 for (int i = 0; i < LiveEdit::kFramePaddingInitialSize; i++) {
82 __ push(Immediate(Smi::FromInt(LiveEdit::kFramePaddingValue)));
jkummerow@chromium.org212d9642012-05-11 15:02:09 +000083 }
machenbach@chromium.orge31b63e2014-05-29 00:04:57 +000084 __ push(Immediate(Smi::FromInt(LiveEdit::kFramePaddingInitialSize)));
jkummerow@chromium.org212d9642012-05-11 15:02:09 +000085
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000086 // Store the registers containing live values on the expression stack to
87 // make sure that these are correctly updated during GC. Non object values
88 // are stored as a smi causing it to be untouched by GC.
machenbach@chromium.orge3c177a2014-08-05 00:05:55 +000089 DCHECK((object_regs & ~kJSCallerSaved) == 0);
90 DCHECK((non_object_regs & ~kJSCallerSaved) == 0);
91 DCHECK((object_regs & non_object_regs) == 0);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000092 for (int i = 0; i < kNumJSCallerSaved; i++) {
93 int r = JSCallerSavedCode(i);
94 Register reg = { r };
95 if ((object_regs & (1 << r)) != 0) {
96 __ push(reg);
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +000097 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000098 if ((non_object_regs & (1 << r)) != 0) {
99 if (FLAG_debug_code) {
100 __ test(reg, Immediate(0xc0000000));
danno@chromium.org59400602013-08-13 17:09:37 +0000101 __ Assert(zero, kUnableToEncodeValueAsSmi);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000102 }
103 __ SmiTag(reg);
104 __ push(reg);
105 }
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000106 }
ager@chromium.org8bb60582008-12-11 12:02:20 +0000107
108#ifdef DEBUG
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000109 __ RecordComment("// Calling from debug break to runtime - come in - over");
ager@chromium.org8bb60582008-12-11 12:02:20 +0000110#endif
machenbach@chromium.orga2218802014-03-25 07:30:47 +0000111 __ Move(eax, Immediate(0)); // No arguments.
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000112 __ mov(ebx, Immediate(ExternalReference::debug_break(masm->isolate())));
ager@chromium.org8bb60582008-12-11 12:02:20 +0000113
machenbach@chromium.orgf2f04892014-04-25 00:05:01 +0000114 CEntryStub ceb(masm->isolate(), 1);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000115 __ CallStub(&ceb);
ager@chromium.org8bb60582008-12-11 12:02:20 +0000116
jkummerow@chromium.org212d9642012-05-11 15:02:09 +0000117 // Automatically find register that could be used after register restore.
118 // We need one register for padding skip instructions.
119 Register unused_reg = { -1 };
120
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000121 // Restore the register values containing object pointers from the
122 // expression stack.
123 for (int i = kNumJSCallerSaved; --i >= 0;) {
124 int r = JSCallerSavedCode(i);
125 Register reg = { r };
126 if (FLAG_debug_code) {
machenbach@chromium.orga2218802014-03-25 07:30:47 +0000127 __ Move(reg, Immediate(kDebugZapValue));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000128 }
jkummerow@chromium.org212d9642012-05-11 15:02:09 +0000129 bool taken = reg.code() == esi.code();
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000130 if ((object_regs & (1 << r)) != 0) {
131 __ pop(reg);
jkummerow@chromium.org212d9642012-05-11 15:02:09 +0000132 taken = true;
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000133 }
134 if ((non_object_regs & (1 << r)) != 0) {
135 __ pop(reg);
136 __ SmiUntag(reg);
jkummerow@chromium.org212d9642012-05-11 15:02:09 +0000137 taken = true;
138 }
139 if (!taken) {
140 unused_reg = reg;
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000141 }
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000142 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000143
machenbach@chromium.orge3c177a2014-08-05 00:05:55 +0000144 DCHECK(unused_reg.code() != -1);
jkummerow@chromium.org212d9642012-05-11 15:02:09 +0000145
146 // Read current padding counter and skip corresponding number of words.
147 __ pop(unused_reg);
148 // We divide stored value by 2 (untagging) and multiply it by word's size.
ulan@chromium.orgd6899c32012-05-18 14:12:25 +0000149 STATIC_ASSERT(kSmiTagSize == 1 && kSmiShiftSize == 0);
jkummerow@chromium.org212d9642012-05-11 15:02:09 +0000150 __ lea(esp, Operand(esp, unused_reg, times_half_pointer_size, 0));
151
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000152 // Get rid of the internal frame.
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000153 }
ager@chromium.org8bb60582008-12-11 12:02:20 +0000154
ager@chromium.org8bb60582008-12-11 12:02:20 +0000155 // If this call did not replace a call but patched other code then there will
156 // be an unwanted return address left on the stack. Here we get rid of that.
157 if (convert_call_to_jmp) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000158 __ add(esp, Immediate(kPointerSize));
ager@chromium.org8bb60582008-12-11 12:02:20 +0000159 }
160
ager@chromium.org8bb60582008-12-11 12:02:20 +0000161 // Now that the break point has been handled, resume normal execution by
162 // jumping to the target address intended by the caller and that was
163 // overwritten by the address of DebugBreakXXX.
164 ExternalReference after_break_target =
machenbach@chromium.orgfb547e02014-05-23 00:04:50 +0000165 ExternalReference::debug_after_break_target_address(masm->isolate());
ager@chromium.org8bb60582008-12-11 12:02:20 +0000166 __ jmp(Operand::StaticVariable(after_break_target));
167}
168
169
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000170void DebugCodegen::GenerateCallICStubDebugBreak(MacroAssembler* masm) {
machenbach@chromium.orga86d4162014-05-01 00:05:11 +0000171 // Register state for CallICStub
172 // ----------- S t a t e -------------
173 // -- edx : type feedback slot (smi)
174 // -- edi : function
175 // -----------------------------------
176 Generate_DebugBreakCallHelper(masm, edx.bit() | edi.bit(),
177 0, false);
178}
179
180
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000181void DebugCodegen::GenerateLoadICDebugBreak(MacroAssembler* masm) {
ager@chromium.org8bb60582008-12-11 12:02:20 +0000182 // Register state for IC load call (from ic-ia32.cc).
machenbach@chromium.org9aaa8252014-09-04 10:39:50 +0000183 Register receiver = LoadDescriptor::ReceiverRegister();
184 Register name = LoadDescriptor::NameRegister();
machenbach@chromium.org248dd432014-06-30 00:04:54 +0000185 Generate_DebugBreakCallHelper(masm, receiver.bit() | name.bit(), 0, false);
ager@chromium.org8bb60582008-12-11 12:02:20 +0000186}
187
188
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000189void DebugCodegen::GenerateStoreICDebugBreak(MacroAssembler* masm) {
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000190 // Register state for IC store call (from ic-ia32.cc).
machenbach@chromium.org9aaa8252014-09-04 10:39:50 +0000191 Register receiver = StoreDescriptor::ReceiverRegister();
192 Register name = StoreDescriptor::NameRegister();
193 Register value = StoreDescriptor::ValueRegister();
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000194 Generate_DebugBreakCallHelper(
machenbach@chromium.org70d29e12014-07-11 07:33:43 +0000195 masm, receiver.bit() | name.bit() | value.bit(), 0, false);
ager@chromium.org8bb60582008-12-11 12:02:20 +0000196}
197
198
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000199void DebugCodegen::GenerateKeyedLoadICDebugBreak(MacroAssembler* masm) {
ager@chromium.org8bb60582008-12-11 12:02:20 +0000200 // Register state for keyed IC load call (from ic-ia32.cc).
yangguo@chromium.org5de00742014-07-01 11:58:10 +0000201 GenerateLoadICDebugBreak(masm);
ager@chromium.org8bb60582008-12-11 12:02:20 +0000202}
203
204
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000205void DebugCodegen::GenerateKeyedStoreICDebugBreak(MacroAssembler* masm) {
machenbach@chromium.org70d29e12014-07-11 07:33:43 +0000206 // Register state for keyed IC store call (from ic-ia32.cc).
machenbach@chromium.org9aaa8252014-09-04 10:39:50 +0000207 Register receiver = StoreDescriptor::ReceiverRegister();
208 Register name = StoreDescriptor::NameRegister();
209 Register value = StoreDescriptor::ValueRegister();
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000210 Generate_DebugBreakCallHelper(
machenbach@chromium.org70d29e12014-07-11 07:33:43 +0000211 masm, receiver.bit() | name.bit() | value.bit(), 0, false);
ager@chromium.org8bb60582008-12-11 12:02:20 +0000212}
213
214
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000215void DebugCodegen::GenerateCompareNilICDebugBreak(MacroAssembler* masm) {
danno@chromium.orgf005df62013-04-30 16:36:45 +0000216 // Register state for CompareNil IC
217 // ----------- S t a t e -------------
218 // -- eax : value
219 // -----------------------------------
220 Generate_DebugBreakCallHelper(masm, eax.bit(), 0, false);
221}
222
223
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000224void DebugCodegen::GenerateReturnDebugBreak(MacroAssembler* masm) {
ager@chromium.org8bb60582008-12-11 12:02:20 +0000225 // Register state just before return from JS function (from codegen-ia32.cc).
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000226 // ----------- S t a t e -------------
227 // -- eax: return value
228 // -----------------------------------
229 Generate_DebugBreakCallHelper(masm, eax.bit(), 0, true);
230}
231
232
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000233void DebugCodegen::GenerateCallFunctionStubDebugBreak(MacroAssembler* masm) {
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000234 // Register state for CallFunctionStub (from code-stubs-ia32.cc).
235 // ----------- S t a t e -------------
236 // -- edi: function
237 // -----------------------------------
238 Generate_DebugBreakCallHelper(masm, edi.bit(), 0, false);
239}
240
241
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000242void DebugCodegen::GenerateCallConstructStubDebugBreak(MacroAssembler* masm) {
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000243 // Register state for CallConstructStub (from code-stubs-ia32.cc).
ager@chromium.org8bb60582008-12-11 12:02:20 +0000244 // eax is the actual number of arguments not encoded as a smi see comment
245 // above IC call.
246 // ----------- S t a t e -------------
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000247 // -- eax: number of arguments (not smi)
248 // -- edi: constructor function
ager@chromium.org8bb60582008-12-11 12:02:20 +0000249 // -----------------------------------
250 // The number of arguments in eax is not smi encoded.
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000251 Generate_DebugBreakCallHelper(masm, edi.bit(), eax.bit(), false);
ager@chromium.org8bb60582008-12-11 12:02:20 +0000252}
253
254
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000255void DebugCodegen::GenerateCallConstructStubRecordDebugBreak(
256 MacroAssembler* masm) {
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000257 // Register state for CallConstructStub (from code-stubs-ia32.cc).
258 // eax is the actual number of arguments not encoded as a smi see comment
259 // above IC call.
ager@chromium.org8bb60582008-12-11 12:02:20 +0000260 // ----------- S t a t e -------------
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000261 // -- eax: number of arguments (not smi)
titzer@chromium.orgf5a24542014-03-04 09:06:17 +0000262 // -- ebx: feedback array
263 // -- edx: feedback slot (smi)
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000264 // -- edi: constructor function
ager@chromium.org8bb60582008-12-11 12:02:20 +0000265 // -----------------------------------
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000266 // The number of arguments in eax is not smi encoded.
titzer@chromium.orgf5a24542014-03-04 09:06:17 +0000267 Generate_DebugBreakCallHelper(masm, ebx.bit() | edx.bit() | edi.bit(),
268 eax.bit(), false);
ager@chromium.org8bb60582008-12-11 12:02:20 +0000269}
270
271
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000272void DebugCodegen::GenerateSlot(MacroAssembler* masm) {
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +0000273 // Generate enough nop's to make space for a call instruction.
274 Label check_codesize;
275 __ bind(&check_codesize);
276 __ RecordDebugBreakSlot();
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +0000277 __ Nop(Assembler::kDebugBreakSlotLength);
machenbach@chromium.orge3c177a2014-08-05 00:05:55 +0000278 DCHECK_EQ(Assembler::kDebugBreakSlotLength,
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +0000279 masm->SizeOfCodeGeneratedSince(&check_codesize));
280}
281
282
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000283void DebugCodegen::GenerateSlotDebugBreak(MacroAssembler* masm) {
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +0000284 // In the places where a debug break slot is inserted no registers can contain
285 // object pointers.
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +0000286 Generate_DebugBreakCallHelper(masm, 0, 0, true);
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +0000287}
288
289
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000290void DebugCodegen::GeneratePlainReturnLiveEdit(MacroAssembler* masm) {
ager@chromium.org357bf652010-04-12 11:30:10 +0000291 masm->ret(0);
292}
293
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +0000294
machenbach@chromium.orgd06b9262014-05-28 06:48:05 +0000295void DebugCodegen::GenerateFrameDropperLiveEdit(MacroAssembler* masm) {
whesse@chromium.orge90029b2010-08-02 11:52:17 +0000296 ExternalReference restarter_frame_function_slot =
machenbach@chromium.orgfb547e02014-05-23 00:04:50 +0000297 ExternalReference::debug_restarter_frame_function_pointer_address(
298 masm->isolate());
whesse@chromium.orge90029b2010-08-02 11:52:17 +0000299 __ mov(Operand::StaticVariable(restarter_frame_function_slot), Immediate(0));
300
ager@chromium.org357bf652010-04-12 11:30:10 +0000301 // We do not know our frame height, but set esp based on ebp.
ager@chromium.orgea4f62e2010-08-16 16:28:43 +0000302 __ lea(esp, Operand(ebp, -1 * kPointerSize));
ager@chromium.org357bf652010-04-12 11:30:10 +0000303
ager@chromium.orgea4f62e2010-08-16 16:28:43 +0000304 __ pop(edi); // Function.
ager@chromium.org357bf652010-04-12 11:30:10 +0000305 __ pop(ebp);
306
ager@chromium.orgea4f62e2010-08-16 16:28:43 +0000307 // Load context from the function.
308 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset));
309
ager@chromium.org357bf652010-04-12 11:30:10 +0000310 // Get function code.
311 __ mov(edx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset));
312 __ mov(edx, FieldOperand(edx, SharedFunctionInfo::kCodeOffset));
313 __ lea(edx, FieldOperand(edx, Code::kHeaderSize));
314
315 // Re-run JSFunction, edi is function, esi is context.
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000316 __ jmp(edx);
ager@chromium.org357bf652010-04-12 11:30:10 +0000317}
318
machenbach@chromium.orge31b63e2014-05-29 00:04:57 +0000319
320const bool LiveEdit::kFrameDropperSupported = true;
ager@chromium.orgea4f62e2010-08-16 16:28:43 +0000321
ager@chromium.org8bb60582008-12-11 12:02:20 +0000322#undef __
323
ager@chromium.org8bb60582008-12-11 12:02:20 +0000324} } // namespace v8::internal
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +0000325
326#endif // V8_TARGET_ARCH_IA32