1// Copyright 2011 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_CODEGEN_H_
29#define V8_CODEGEN_H_
30
31#include "code-stubs.h"
32#include "runtime.h"
33#include "type-info.h"
34
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
39//   MakeCodePrologue
40//   MakeCodeEpilogue
41//   masm
42//   frame
43//   script
44//   has_valid_frame
45//   SetFrame
46//   DeleteFrame
47//   allocator
48//   AddDeferred
49//   in_spilled_code
50//   set_in_spilled_code
51//   RecordPositions
52//
53// These methods are either used privately by the shared code or implemented as
54// shared code:
55//   CodeGenerator
56//   ~CodeGenerator
57//   Generate
58//   ComputeLazyCompile
59//   BuildFunctionInfo
60//   ProcessDeclarations
61//   DeclareGlobals
62//   CheckForInlineRuntimeCall
63//   AnalyzeCondition
64//   CodeForFunctionPosition
65//   CodeForReturnPosition
66//   CodeForStatementPosition
67//   CodeForDoWhileConditionPosition
68//   CodeForSourcePosition
69
70enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
71
72#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
84namespace 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
108#endif  // V8_CODEGEN_H_
109