]> git.saurik.com Git - apple/javascriptcore.git/blame - ftl/FTLExitValue.cpp
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / ftl / FTLExitValue.cpp
CommitLineData
81345200 1/*
ed1e77d3 2 * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
81345200
A
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
26#include "config.h"
27#include "FTLExitValue.h"
28
29#if ENABLE(FTL_JIT)
30
ed1e77d3 31#include "FTLExitTimeObjectMaterialization.h"
81345200 32#include "JSCInlines.h"
ed1e77d3 33#include "TrackedReferences.h"
81345200
A
34
35namespace JSC { namespace FTL {
36
ed1e77d3
A
37ExitValue ExitValue::materializeNewObject(ExitTimeObjectMaterialization* data)
38{
39 ExitValue result;
40 result.m_kind = ExitValueMaterializeNewObject;
41 result.u.newObjectMaterializationData = data;
42 return result;
43}
44
45ExitValue ExitValue::withLocalsOffset(int offset) const
46{
47 if (!isInJSStackSomehow())
48 return *this;
49 if (!virtualRegister().isLocal())
50 return *this;
51 return withVirtualRegister(virtualRegister() + offset);
52}
53
54ValueFormat ExitValue::valueFormat() const
55{
56 switch (kind()) {
57 case InvalidExitValue:
58 RELEASE_ASSERT_NOT_REACHED();
59 return InvalidValueFormat;
60
61 case ExitValueDead:
62 case ExitValueConstant:
63 case ExitValueInJSStack:
64 case ExitValueMaterializeNewObject:
65 return ValueFormatJSValue;
66
67 case ExitValueArgument:
68 return exitArgument().format();
69
70 case ExitValueInJSStackAsInt32:
71 return ValueFormatInt32;
72
73 case ExitValueInJSStackAsInt52:
74 return ValueFormatInt52;
75
76 case ExitValueInJSStackAsDouble:
77 return ValueFormatDouble;
78
79 case ExitValueRecovery:
80 return recoveryFormat();
81 }
82
83 RELEASE_ASSERT_NOT_REACHED();
84 return InvalidValueFormat;
85}
86
81345200
A
87void ExitValue::dumpInContext(PrintStream& out, DumpContext* context) const
88{
89 switch (kind()) {
90 case InvalidExitValue:
91 out.print("Invalid");
92 return;
93 case ExitValueDead:
94 out.print("Dead");
95 return;
96 case ExitValueArgument:
97 out.print("Argument(", exitArgument(), ")");
98 return;
99 case ExitValueConstant:
100 out.print("Constant(", inContext(constant(), context), ")");
101 return;
102 case ExitValueInJSStack:
ed1e77d3 103 out.print("InJSStack:", virtualRegister());
81345200
A
104 return;
105 case ExitValueInJSStackAsInt32:
ed1e77d3 106 out.print("InJSStackAsInt32:", virtualRegister());
81345200
A
107 return;
108 case ExitValueInJSStackAsInt52:
ed1e77d3 109 out.print("InJSStackAsInt52:", virtualRegister());
81345200
A
110 return;
111 case ExitValueInJSStackAsDouble:
ed1e77d3 112 out.print("InJSStackAsDouble:", virtualRegister());
81345200
A
113 return;
114 case ExitValueRecovery:
115 out.print("Recovery(", recoveryOpcode(), ", arg", leftRecoveryArgument(), ", arg", rightRecoveryArgument(), ", ", recoveryFormat(), ")");
116 return;
ed1e77d3
A
117 case ExitValueMaterializeNewObject:
118 out.print("Materialize(", WTF::RawPointer(objectMaterialization()), ")");
119 return;
81345200
A
120 }
121
122 RELEASE_ASSERT_NOT_REACHED();
123}
124
125void ExitValue::dump(PrintStream& out) const
126{
127 dumpInContext(out, 0);
128}
129
ed1e77d3
A
130void ExitValue::validateReferences(const TrackedReferences& trackedReferences) const
131{
132 if (isConstant())
133 trackedReferences.check(constant());
134}
135
81345200
A
136} } // namespace JSC::FTL
137
138#endif // ENABLE(FTL_JIT)
139