blob: 39f6bcb260e12fc3b79540ebdddd9ea49da688dc [file] [log] [blame]
Steve Blocka7e24c12009-10-30 11:49:00 +00001// Copyright 2006-2009 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef V8_GLOBALS_H_
29#define V8_GLOBALS_H_
30
31namespace v8 {
32namespace internal {
33
34// Processor architecture detection. For more info on what's defined, see:
35// http://msdn.microsoft.com/en-us/library/b0084kay.aspx
36// http://www.agner.org/optimize/calling_conventions.pdf
37// or with gcc, run: "echo | gcc -E -dM -"
38#if defined(_M_X64) || defined(__x86_64__)
39#define V8_HOST_ARCH_X64 1
40#define V8_HOST_ARCH_64_BIT 1
41#define V8_HOST_CAN_READ_UNALIGNED 1
42#elif defined(_M_IX86) || defined(__i386__)
43#define V8_HOST_ARCH_IA32 1
44#define V8_HOST_ARCH_32_BIT 1
45#define V8_HOST_CAN_READ_UNALIGNED 1
46#elif defined(__ARMEL__)
47#define V8_HOST_ARCH_ARM 1
48#define V8_HOST_ARCH_32_BIT 1
49#else
50#error Your host architecture was not detected as supported by v8
51#endif
52
53#if defined(V8_TARGET_ARCH_X64) || defined(V8_TARGET_ARCH_IA32)
54#define V8_TARGET_CAN_READ_UNALIGNED 1
55#elif V8_TARGET_ARCH_ARM
56#else
57#error Your target architecture is not supported by v8
58#endif
59
60// Support for alternative bool type. This is only enabled if the code is
61// compiled with USE_MYBOOL defined. This catches some nasty type bugs.
62// For instance, 'bool b = "false";' results in b == true! This is a hidden
63// source of bugs.
64// However, redefining the bool type does have some negative impact on some
65// platforms. It gives rise to compiler warnings (i.e. with
66// MSVC) in the API header files when mixing code that uses the standard
67// bool with code that uses the redefined version.
68// This does not actually belong in the platform code, but needs to be
69// defined here because the platform code uses bool, and platform.h is
70// include very early in the main include file.
71
72#ifdef USE_MYBOOL
73typedef unsigned int __my_bool__;
74#define bool __my_bool__ // use 'indirection' to avoid name clashes
75#endif
76
77typedef uint8_t byte;
78typedef byte* Address;
79
80// Define our own macros for writing 64-bit constants. This is less fragile
81// than defining __STDC_CONSTANT_MACROS before including <stdint.h>, and it
82// works on compilers that don't have it (like MSVC).
83#if V8_HOST_ARCH_64_BIT
84#ifdef _MSC_VER
85#define V8_UINT64_C(x) (x ## UI64)
86#define V8_INT64_C(x) (x ## I64)
87#define V8_PTR_PREFIX "ll"
88#else // _MSC_VER
89#define V8_UINT64_C(x) (x ## UL)
90#define V8_INT64_C(x) (x ## L)
91#define V8_PTR_PREFIX "l"
92#endif // _MSC_VER
93#else // V8_HOST_ARCH_64_BIT
94#define V8_PTR_PREFIX ""
95#endif // V8_HOST_ARCH_64_BIT
96
97#define V8PRIxPTR V8_PTR_PREFIX "x"
98#define V8PRIdPTR V8_PTR_PREFIX "d"
99
100// Fix for Mac OS X defining uintptr_t as "unsigned long":
101#if defined(__APPLE__) && defined(__MACH__)
102#undef V8PRIxPTR
103#define V8PRIxPTR "lx"
104#endif
105
Steve Blockd0582a62009-12-15 09:54:21 +0000106#if defined(__APPLE__) && defined(__MACH__)
107#define USING_MAC_ABI
108#endif
109
Steve Blocka7e24c12009-10-30 11:49:00 +0000110// Code-point values in Unicode 4.0 are 21 bits wide.
111typedef uint16_t uc16;
112typedef int32_t uc32;
113
114// -----------------------------------------------------------------------------
115// Constants
116
117const int KB = 1024;
118const int MB = KB * KB;
119const int GB = KB * KB * KB;
120const int kMaxInt = 0x7FFFFFFF;
121const int kMinInt = -kMaxInt - 1;
122
123const uint32_t kMaxUInt32 = 0xFFFFFFFFu;
124
125const int kCharSize = sizeof(char); // NOLINT
126const int kShortSize = sizeof(short); // NOLINT
127const int kIntSize = sizeof(int); // NOLINT
128const int kDoubleSize = sizeof(double); // NOLINT
129const int kPointerSize = sizeof(void*); // NOLINT
130const int kIntptrSize = sizeof(intptr_t); // NOLINT
131
132#if V8_HOST_ARCH_64_BIT
133const int kPointerSizeLog2 = 3;
134const intptr_t kIntptrSignBit = V8_INT64_C(0x8000000000000000);
135#else
136const int kPointerSizeLog2 = 2;
137const intptr_t kIntptrSignBit = 0x80000000;
138#endif
139
140const int kObjectAlignmentBits = kPointerSizeLog2;
141const intptr_t kObjectAlignment = 1 << kObjectAlignmentBits;
142const intptr_t kObjectAlignmentMask = kObjectAlignment - 1;
143
144// Desired alignment for pointers.
145const intptr_t kPointerAlignment = (1 << kPointerSizeLog2);
146const intptr_t kPointerAlignmentMask = kPointerAlignment - 1;
147
Leon Clarkee46be812010-01-19 14:06:41 +0000148// Desired alignment for maps.
149#if V8_HOST_ARCH_64_BIT
150const intptr_t kMapAlignmentBits = kObjectAlignmentBits;
151#else
152const intptr_t kMapAlignmentBits = kObjectAlignmentBits + 3;
153#endif
154const intptr_t kMapAlignment = (1 << kMapAlignmentBits);
155const intptr_t kMapAlignmentMask = kMapAlignment - 1;
Steve Blocka7e24c12009-10-30 11:49:00 +0000156
157// Tag information for Failure.
158const int kFailureTag = 3;
159const int kFailureTagSize = 2;
160const intptr_t kFailureTagMask = (1 << kFailureTagSize) - 1;
161
162
163const int kBitsPerByte = 8;
164const int kBitsPerByteLog2 = 3;
165const int kBitsPerPointer = kPointerSize * kBitsPerByte;
166const int kBitsPerInt = kIntSize * kBitsPerByte;
167
168
169// Zap-value: The value used for zapping dead objects.
170// Should be a recognizable hex value tagged as a heap object pointer.
171#ifdef V8_HOST_ARCH_64_BIT
172const Address kZapValue =
173 reinterpret_cast<Address>(V8_UINT64_C(0xdeadbeedbeadbeed));
174const Address kHandleZapValue =
175 reinterpret_cast<Address>(V8_UINT64_C(0x1baddead0baddead));
176const Address kFromSpaceZapValue =
177 reinterpret_cast<Address>(V8_UINT64_C(0x1beefdad0beefdad));
178#else
179const Address kZapValue = reinterpret_cast<Address>(0xdeadbeed);
180const Address kHandleZapValue = reinterpret_cast<Address>(0xbaddead);
181const Address kFromSpaceZapValue = reinterpret_cast<Address>(0xbeefdad);
182#endif
183
184
Leon Clarkee46be812010-01-19 14:06:41 +0000185// Number of bits to represent the page size for paged spaces. The value of 13
186// gives 8K bytes per page.
187const int kPageSizeBits = 13;
188
189
Steve Blockd0582a62009-12-15 09:54:21 +0000190// Constants relevant to double precision floating point numbers.
191
192// Quiet NaNs have bits 51 to 62 set, possibly the sign bit, and no
193// other bits set.
194const uint64_t kQuietNaNMask = static_cast<uint64_t>(0xfff) << 51;
195// If looking only at the top 32 bits, the QNaN mask is bits 19 to 30.
196const uint32_t kQuietNaNHighBitsMask = 0xfff << (51 - 32);
197
198
Steve Blocka7e24c12009-10-30 11:49:00 +0000199// -----------------------------------------------------------------------------
200// Forward declarations for frequently used classes
201// (sorted alphabetically)
202
203class AccessorInfo;
204class Allocation;
205class Arguments;
206class Assembler;
Leon Clarke4515c472010-02-03 11:58:03 +0000207class AssertNoAllocation;
Steve Blocka7e24c12009-10-30 11:49:00 +0000208class BreakableStatement;
209class Code;
210class CodeGenerator;
211class CodeStub;
212class Context;
213class Debug;
214class Debugger;
215class DebugInfo;
216class Descriptor;
217class DescriptorArray;
218class Expression;
219class ExternalReference;
220class FixedArray;
221class FunctionEntry;
222class FunctionLiteral;
223class FunctionTemplateInfo;
224class NumberDictionary;
225class StringDictionary;
226class FreeStoreAllocationPolicy;
227template <typename T> class Handle;
228class Heap;
229class HeapObject;
230class IC;
231class InterceptorInfo;
232class IterationStatement;
233class Array;
234class JSArray;
235class JSFunction;
236class JSObject;
237class LargeObjectSpace;
238template <typename T, class P = FreeStoreAllocationPolicy> class List;
239class LookupResult;
240class MacroAssembler;
241class Map;
242class MapSpace;
243class MarkCompactCollector;
244class NewSpace;
245class NodeVisitor;
246class Object;
247class OldSpace;
248class Property;
249class Proxy;
250class RegExpNode;
251struct RegExpCompileData;
252class RegExpTree;
253class RegExpCompiler;
254class RegExpVisitor;
255class Scope;
256template<class Allocator = FreeStoreAllocationPolicy> class ScopeInfo;
257class Script;
258class Slot;
259class Smi;
260class Statement;
261class String;
262class Struct;
263class SwitchStatement;
264class AstVisitor;
265class Variable;
266class VariableProxy;
267class RelocInfo;
268class Deserializer;
269class MessageLocation;
270class ObjectGroup;
271class TickSample;
272class VirtualMemory;
273class Mutex;
274class ZoneScopeInfo;
275
276typedef bool (*WeakSlotCallback)(Object** pointer);
277
278// -----------------------------------------------------------------------------
279// Miscellaneous
280
281// NOTE: SpaceIterator depends on AllocationSpace enumeration values being
282// consecutive.
283enum AllocationSpace {
284 NEW_SPACE, // Semispaces collected with copying collector.
285 OLD_POINTER_SPACE, // May contain pointers to new space.
286 OLD_DATA_SPACE, // Must not have pointers to new space.
287 CODE_SPACE, // No pointers to new space, marked executable.
288 MAP_SPACE, // Only and all map objects.
289 CELL_SPACE, // Only and all cell objects.
290 LO_SPACE, // Promoted large objects.
291
292 FIRST_SPACE = NEW_SPACE,
Steve Blockd0582a62009-12-15 09:54:21 +0000293 LAST_SPACE = LO_SPACE,
294 FIRST_PAGED_SPACE = OLD_POINTER_SPACE,
295 LAST_PAGED_SPACE = CELL_SPACE
Steve Blocka7e24c12009-10-30 11:49:00 +0000296};
297const int kSpaceTagSize = 3;
298const int kSpaceTagMask = (1 << kSpaceTagSize) - 1;
299
300
301// A flag that indicates whether objects should be pretenured when
302// allocated (allocated directly into the old generation) or not
303// (allocated in the young generation if the object size and type
304// allows).
305enum PretenureFlag { NOT_TENURED, TENURED };
306
307enum GarbageCollector { SCAVENGER, MARK_COMPACTOR };
308
309enum Executability { NOT_EXECUTABLE, EXECUTABLE };
310
Leon Clarkee46be812010-01-19 14:06:41 +0000311enum VisitMode { VISIT_ALL, VISIT_ALL_IN_SCAVENGE, VISIT_ONLY_STRONG };
Steve Blockd0582a62009-12-15 09:54:21 +0000312
Steve Blocka7e24c12009-10-30 11:49:00 +0000313
314// A CodeDesc describes a buffer holding instructions and relocation
315// information. The instructions start at the beginning of the buffer
316// and grow forward, the relocation information starts at the end of
317// the buffer and grows backward.
318//
319// |<--------------- buffer_size ---------------->|
320// |<-- instr_size -->| |<-- reloc_size -->|
321// +==================+========+==================+
322// | instructions | free | reloc info |
323// +==================+========+==================+
324// ^
325// |
326// buffer
327
328struct CodeDesc {
329 byte* buffer;
330 int buffer_size;
331 int instr_size;
332 int reloc_size;
333 Assembler* origin;
334};
335
336
337// Callback function on object slots, used for iterating heap object slots in
338// HeapObjects, global pointers to heap objects, etc. The callback allows the
339// callback function to change the value of the slot.
340typedef void (*ObjectSlotCallback)(HeapObject** pointer);
341
342
343// Callback function used for iterating objects in heap spaces,
344// for example, scanning heap objects.
345typedef int (*HeapObjectCallback)(HeapObject* obj);
346
347
348// Callback function used for checking constraints when copying/relocating
349// objects. Returns true if an object can be copied/relocated from its
350// old_addr to a new_addr.
351typedef bool (*ConstraintCallback)(Address new_addr, Address old_addr);
352
353
354// Callback function on inline caches, used for iterating over inline caches
355// in compiled code.
356typedef void (*InlineCacheCallback)(Code* code, Address ic);
357
358
359// State for inline cache call sites. Aliased as IC::State.
360enum InlineCacheState {
361 // Has never been executed.
362 UNINITIALIZED,
363 // Has been executed but monomorhic state has been delayed.
364 PREMONOMORPHIC,
365 // Has been executed and only one receiver type has been seen.
366 MONOMORPHIC,
367 // Like MONOMORPHIC but check failed due to prototype.
368 MONOMORPHIC_PROTOTYPE_FAILURE,
369 // Multiple receiver types have been seen.
370 MEGAMORPHIC,
371 // Special states for debug break or step in prepare stubs.
372 DEBUG_BREAK,
373 DEBUG_PREPARE_STEP_IN
374};
375
376
377enum InLoopFlag {
378 NOT_IN_LOOP,
379 IN_LOOP
380};
381
382
Leon Clarkee46be812010-01-19 14:06:41 +0000383enum CallFunctionFlags {
384 NO_CALL_FUNCTION_FLAGS = 0,
385 RECEIVER_MIGHT_BE_VALUE = 1 << 0 // Receiver might not be a JSObject.
386};
387
388
Steve Blocka7e24c12009-10-30 11:49:00 +0000389// Type of properties.
390// Order of properties is significant.
391// Must fit in the BitField PropertyDetails::TypeField.
392// A copy of this is in mirror-delay.js.
393enum PropertyType {
394 NORMAL = 0, // only in slow mode
395 FIELD = 1, // only in fast mode
396 CONSTANT_FUNCTION = 2, // only in fast mode
397 CALLBACKS = 3,
398 INTERCEPTOR = 4, // only in lookup results, not in descriptors.
399 MAP_TRANSITION = 5, // only in fast mode
400 CONSTANT_TRANSITION = 6, // only in fast mode
401 NULL_DESCRIPTOR = 7, // only in fast mode
402 // All properties before MAP_TRANSITION are real.
403 FIRST_PHANTOM_PROPERTY_TYPE = MAP_TRANSITION
404};
405
406
407// Whether to remove map transitions and constant transitions from a
408// DescriptorArray.
409enum TransitionFlag {
410 REMOVE_TRANSITIONS,
411 KEEP_TRANSITIONS
412};
413
414
415// Union used for fast testing of specific double values.
416union DoubleRepresentation {
417 double value;
418 int64_t bits;
419 DoubleRepresentation(double x) { value = x; }
420};
421
422
423// AccessorCallback
424struct AccessorDescriptor {
425 Object* (*getter)(Object* object, void* data);
426 Object* (*setter)(JSObject* object, Object* value, void* data);
427 void* data;
428};
429
430
431// Logging and profiling.
432// A StateTag represents a possible state of the VM. When compiled with
433// ENABLE_LOGGING_AND_PROFILING, the logger maintains a stack of these.
434// Creating a VMState object enters a state by pushing on the stack, and
435// destroying a VMState object leaves a state by popping the current state
436// from the stack.
437
438#define STATE_TAG_LIST(V) \
439 V(JS) \
440 V(GC) \
441 V(COMPILER) \
442 V(OTHER) \
443 V(EXTERNAL)
444
445enum StateTag {
446#define DEF_STATE_TAG(name) name,
447 STATE_TAG_LIST(DEF_STATE_TAG)
448#undef DEF_STATE_TAG
449 // Pseudo-types.
450 state_tag_count
451};
452
453
454// -----------------------------------------------------------------------------
455// Macros
456
457// Testers for test.
458
459#define HAS_SMI_TAG(value) \
460 ((reinterpret_cast<intptr_t>(value) & kSmiTagMask) == kSmiTag)
461
462#define HAS_FAILURE_TAG(value) \
463 ((reinterpret_cast<intptr_t>(value) & kFailureTagMask) == kFailureTag)
464
465// OBJECT_SIZE_ALIGN returns the value aligned HeapObject size
466#define OBJECT_SIZE_ALIGN(value) \
467 (((value) + kObjectAlignmentMask) & ~kObjectAlignmentMask)
468
469// POINTER_SIZE_ALIGN returns the value aligned as a pointer.
470#define POINTER_SIZE_ALIGN(value) \
471 (((value) + kPointerAlignmentMask) & ~kPointerAlignmentMask)
472
Leon Clarkee46be812010-01-19 14:06:41 +0000473// MAP_SIZE_ALIGN returns the value aligned as a map pointer.
474#define MAP_SIZE_ALIGN(value) \
475 (((value) + kMapAlignmentMask) & ~kMapAlignmentMask)
476
Steve Blocka7e24c12009-10-30 11:49:00 +0000477// The expression OFFSET_OF(type, field) computes the byte-offset
478// of the specified field relative to the containing type. This
479// corresponds to 'offsetof' (in stddef.h), except that it doesn't
480// use 0 or NULL, which causes a problem with the compiler warnings
481// we have enabled (which is also why 'offsetof' doesn't seem to work).
482// Here we simply use the non-zero value 4, which seems to work.
483#define OFFSET_OF(type, field) \
484 (reinterpret_cast<intptr_t>(&(reinterpret_cast<type*>(4)->field)) - 4)
485
486
487// The expression ARRAY_SIZE(a) is a compile-time constant of type
488// size_t which represents the number of elements of the given
489// array. You should only use ARRAY_SIZE on statically allocated
490// arrays.
491#define ARRAY_SIZE(a) \
492 ((sizeof(a) / sizeof(*(a))) / \
493 static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
494
495
496// The USE(x) template is used to silence C++ compiler warnings
497// issued for (yet) unused variables (typically parameters).
498template <typename T>
499static inline void USE(T) { }
500
501
502// FUNCTION_ADDR(f) gets the address of a C function f.
503#define FUNCTION_ADDR(f) \
504 (reinterpret_cast<v8::internal::Address>(reinterpret_cast<intptr_t>(f)))
505
506
507// FUNCTION_CAST<F>(addr) casts an address into a function
508// of type F. Used to invoke generated code from within C.
509template <typename F>
510F FUNCTION_CAST(Address addr) {
511 return reinterpret_cast<F>(reinterpret_cast<intptr_t>(addr));
512}
513
514
515// A macro to disallow the evil copy constructor and operator= functions
516// This should be used in the private: declarations for a class
517#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
518 TypeName(const TypeName&); \
519 void operator=(const TypeName&)
520
521
522// A macro to disallow all the implicit constructors, namely the
523// default constructor, copy constructor and operator= functions.
524//
525// This should be used in the private: declarations for a class
526// that wants to prevent anyone from instantiating it. This is
527// especially useful for classes containing only static methods.
528#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
529 TypeName(); \
530 DISALLOW_COPY_AND_ASSIGN(TypeName)
531
532
533// Support for tracking C++ memory allocation. Insert TRACK_MEMORY("Fisk")
534// inside a C++ class and new and delete will be overloaded so logging is
535// performed.
536// This file (globals.h) is included before log.h, so we use direct calls to
537// the Logger rather than the LOG macro.
538#ifdef DEBUG
539#define TRACK_MEMORY(name) \
540 void* operator new(size_t size) { \
541 void* result = ::operator new(size); \
542 Logger::NewEvent(name, result, size); \
543 return result; \
544 } \
545 void operator delete(void* object) { \
546 Logger::DeleteEvent(name, object); \
547 ::operator delete(object); \
548 }
549#else
550#define TRACK_MEMORY(name)
551#endif
552
553// define used for helping GCC to make better inlining. Don't bother for debug
554// builds. On GCC 3.4.5 using __attribute__((always_inline)) causes compilation
555// errors in debug build.
556#if defined(__GNUC__) && !defined(DEBUG)
557#if (__GNUC__ >= 4)
558#define INLINE(header) inline header __attribute__((always_inline))
559#else
560#define INLINE(header) inline __attribute__((always_inline)) header
561#endif
562#else
563#define INLINE(header) inline header
564#endif
565
566// The type-based aliasing rule allows the compiler to assume that pointers of
567// different types (for some definition of different) never alias each other.
568// Thus the following code does not work:
569//
570// float f = foo();
571// int fbits = *(int*)(&f);
572//
573// The compiler 'knows' that the int pointer can't refer to f since the types
574// don't match, so the compiler may cache f in a register, leaving random data
575// in fbits. Using C++ style casts makes no difference, however a pointer to
576// char data is assumed to alias any other pointer. This is the 'memcpy
577// exception'.
578//
579// Bit_cast uses the memcpy exception to move the bits from a variable of one
580// type of a variable of another type. Of course the end result is likely to
581// be implementation dependent. Most compilers (gcc-4.2 and MSVC 2005)
582// will completely optimize bit_cast away.
583//
584// There is an additional use for bit_cast.
585// Recent gccs will warn when they see casts that may result in breakage due to
586// the type-based aliasing rule. If you have checked that there is no breakage
587// you can use bit_cast to cast one pointer type to another. This confuses gcc
588// enough that it can no longer see that you have cast one pointer type to
589// another thus avoiding the warning.
590template <class Dest, class Source>
591inline Dest bit_cast(const Source& source) {
592 // Compile time assertion: sizeof(Dest) == sizeof(Source)
593 // A compile error here means your Dest and Source have different sizes.
594 typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1];
595
596 Dest dest;
597 memcpy(&dest, &source, sizeof(dest));
598 return dest;
599}
600
601
Steve Blockd0582a62009-12-15 09:54:21 +0000602// Feature flags bit positions. They are mostly based on the CPUID spec.
603// (We assign CPUID itself to one of the currently reserved bits --
604// feel free to change this if needed.)
605enum CpuFeature { SSE3 = 32, // x86
606 SSE2 = 26, // x86
607 CMOV = 15, // x86
608 RDTSC = 4, // x86
609 CPUID = 10, // x86
610 VFP3 = 1, // ARM
611 SAHF = 0}; // x86
612
Steve Blocka7e24c12009-10-30 11:49:00 +0000613} } // namespace v8::internal
614
615#endif // V8_GLOBALS_H_