blob: 50d70f265db4478e37fc57a9495b0cecd3ea1995 [file] [log] [blame]
Ben Murdoch8b112d22011-06-08 16:22:53 +01001// Copyright 2011 the V8 project authors. All rights reserved.
Steve Blocka7e24c12009-10-30 11:49:00 +00002// 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_CODEGEN_H_
29#define V8_CODEGEN_H_
30
Steve Blocka7e24c12009-10-30 11:49:00 +000031#include "code-stubs.h"
32#include "runtime.h"
Steve Block6ded16b2010-05-10 14:33:55 +010033#include "type-info.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000034
35// Include the declaration of the architecture defined class CodeGenerator.
36// The contract to the shared code is that the the CodeGenerator is a subclass
37// of Visitor and that the following methods are available publicly:
38// MakeCode
Steve Block3ce2e202009-11-05 08:53:23 +000039// MakeCodePrologue
40// MakeCodeEpilogue
Steve Blocka7e24c12009-10-30 11:49:00 +000041// masm
42// frame
Steve Blockd0582a62009-12-15 09:54:21 +000043// script
Steve Blocka7e24c12009-10-30 11:49:00 +000044// has_valid_frame
45// SetFrame
46// DeleteFrame
47// allocator
48// AddDeferred
49// in_spilled_code
50// set_in_spilled_code
Steve Block3ce2e202009-11-05 08:53:23 +000051// RecordPositions
Steve Blocka7e24c12009-10-30 11:49:00 +000052//
53// These methods are either used privately by the shared code or implemented as
54// shared code:
55// CodeGenerator
56// ~CodeGenerator
Leon Clarke4515c472010-02-03 11:58:03 +000057// Generate
Steve Block3ce2e202009-11-05 08:53:23 +000058// ComputeLazyCompile
Steve Block6ded16b2010-05-10 14:33:55 +010059// BuildFunctionInfo
Steve Blocka7e24c12009-10-30 11:49:00 +000060// ProcessDeclarations
61// DeclareGlobals
Steve Blocka7e24c12009-10-30 11:49:00 +000062// CheckForInlineRuntimeCall
Steve Block3ce2e202009-11-05 08:53:23 +000063// AnalyzeCondition
Steve Blocka7e24c12009-10-30 11:49:00 +000064// CodeForFunctionPosition
65// CodeForReturnPosition
66// CodeForStatementPosition
Steve Blockd0582a62009-12-15 09:54:21 +000067// CodeForDoWhileConditionPosition
Steve Blocka7e24c12009-10-30 11:49:00 +000068// CodeForSourcePosition
69
Ben Murdochb0fe1622011-05-05 13:52:32 +010070enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
71
Ben Murdochbb769b22010-08-11 14:56:33 +010072#if V8_TARGET_ARCH_IA32
73#include "ia32/codegen-ia32.h"
74#elif V8_TARGET_ARCH_X64
75#include "x64/codegen-x64.h"
76#elif V8_TARGET_ARCH_ARM
77#include "arm/codegen-arm.h"
78#elif V8_TARGET_ARCH_MIPS
79#include "mips/codegen-mips.h"
80#else
81#error Unsupported target architecture.
82#endif
83
Ben Murdoch3ef787d2012-04-12 10:51:47 +010084namespace v8 {
85namespace internal {
86
87// Results of the library implementation of transcendental functions may differ
88// from the one we use in our generated code. Therefore we use the same
89// generated code both in runtime and compiled code.
90typedef double (*UnaryMathFunction)(double x);
91
92UnaryMathFunction CreateTranscendentalFunction(TranscendentalCache::Type type);
93UnaryMathFunction CreateSqrtFunction();
94
95
96class ElementsTransitionGenerator : public AllStatic {
97 public:
98 static void GenerateSmiOnlyToObject(MacroAssembler* masm);
99 static void GenerateSmiOnlyToDouble(MacroAssembler* masm, Label* fail);
100 static void GenerateDoubleToObject(MacroAssembler* masm, Label* fail);
101
102 private:
103 DISALLOW_COPY_AND_ASSIGN(ElementsTransitionGenerator);
104};
105
106} } // namespace v8::internal
107
Steve Blocka7e24c12009-10-30 11:49:00 +0000108#endif // V8_CODEGEN_H_