blob: 79b5d7f3ebe7ba89c82e82651434901572130d98 [file] [log] [blame]
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +00001/*
mark.lam@apple.com31fc87e22014-01-18 21:11:56 +00002 * Copyright (C) 2008, 2009, 2013, 2014 Apple Inc. All rights reserved.
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +00003 * Copyright (C) 2008 Cameron Zwarich <cwzwarich@uwaterloo.ca>
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
mjs@apple.com92047332014-03-15 04:08:27 +000014 * 3. Neither the name of Apple Inc. ("Apple") nor the names of
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +000015 * its contributors may be used to endorse or promote products derived
16 * from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
ryanhaddad@apple.com22104f52016-09-28 17:08:17 +000030#pragma once
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +000031
msaboff@apple.com51486072014-02-27 18:48:37 +000032#include "Bytecodes.h"
commit-queue@webkit.org61b1cdb2012-08-29 03:57:52 +000033#include "LLIntOpcode.h"
34
barraclough@apple.comeb51bd92008-07-30 17:38:35 +000035#include <algorithm>
36#include <string.h>
37
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +000038#include <wtf/Assertions.h>
39
cwzwarich@webkit.org3f782f62008-09-08 01:28:33 +000040namespace JSC {
cwzwarich@webkit.orgb7a96102008-06-05 04:39:09 +000041
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000042#define FOR_EACH_CORE_OPCODE_ID_WITH_EXTENSION(macro, extension__) \
msaboff@apple.com51486072014-02-27 18:48:37 +000043 FOR_EACH_BYTECODE_ID(macro) \
44 extension__
oliver@apple.com3fc29852012-08-27 23:03:03 +000045
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000046#define FOR_EACH_CORE_OPCODE_ID(macro) \
47 FOR_EACH_CORE_OPCODE_ID_WITH_EXTENSION(macro, /* No extension */ )
commit-queue@webkit.org02062002012-09-12 22:20:34 +000048
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000049#define FOR_EACH_OPCODE_ID(macro) \
50 FOR_EACH_CORE_OPCODE_ID_WITH_EXTENSION( \
51 macro, \
52 FOR_EACH_LLINT_OPCODE_EXTENSION(macro) \
53 )
commit-queue@webkit.org02062002012-09-12 22:20:34 +000054
55
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000056#define OPCODE_ID_ENUM(opcode, length) opcode,
fpizlo@apple.combc16ddb2016-09-06 01:02:22 +000057 enum OpcodeID : unsigned { FOR_EACH_OPCODE_ID(OPCODE_ID_ENUM) };
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000058#undef OPCODE_ID_ENUM
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +000059
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000060const int maxOpcodeLength = 9;
dbatyai.u-szeged@partner.samsung.com46f07e52014-06-19 16:32:31 +000061#if !ENABLE(JIT)
msaboff@apple.com8f8907e2014-04-10 22:33:59 +000062const int numOpcodeIDs = NUMBER_OF_BYTECODE_IDS + NUMBER_OF_CLOOP_BYTECODE_HELPER_IDS + NUMBER_OF_BYTECODE_HELPER_IDS;
msaboff@apple.com51486072014-02-27 18:48:37 +000063#else
msaboff@apple.com8f8907e2014-04-10 22:33:59 +000064const int numOpcodeIDs = NUMBER_OF_BYTECODE_IDS + NUMBER_OF_BYTECODE_HELPER_IDS;
msaboff@apple.com51486072014-02-27 18:48:37 +000065#endif
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +000066
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000067#define OPCODE_ID_LENGTHS(id, length) const int id##_length = length;
68 FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTHS);
69#undef OPCODE_ID_LENGTHS
cwzwarich@webkit.orgc8af3ef2008-12-09 19:19:04 +000070
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000071#define OPCODE_LENGTH(opcode) opcode##_length
weinig@apple.com0aaf82a2008-12-12 08:02:09 +000072
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000073#define OPCODE_ID_LENGTH_MAP(opcode, length) length,
74 const int opcodeLengths[numOpcodeIDs] = { FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTH_MAP) };
75#undef OPCODE_ID_LENGTH_MAP
76
mcatanzaro@igalia.comce78d372016-09-06 14:29:43 +000077#if COMPILER(GCC)
78#pragma GCC diagnostic push
79#pragma GCC diagnostic ignored "-Wtype-limits"
80#endif
81
msaboff@apple.com51486072014-02-27 18:48:37 +000082#define VERIFY_OPCODE_ID(id, size) COMPILE_ASSERT(id <= numOpcodeIDs, ASSERT_THAT_JS_OPCODE_IDS_ARE_VALID);
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000083 FOR_EACH_OPCODE_ID(VERIFY_OPCODE_ID);
84#undef VERIFY_OPCODE_ID
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +000085
mcatanzaro@igalia.comce78d372016-09-06 14:29:43 +000086#if COMPILER(GCC)
87#pragma GCC diagnostic pop
88#endif
89
commit-queue@webkit.orgb8419482012-08-30 22:21:48 +000090#if ENABLE(COMPUTED_GOTO_OPCODES)
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000091typedef void* Opcode;
eric@webkit.orgf8c87302010-01-27 04:20:33 +000092#else
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000093typedef OpcodeID Opcode;
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +000094#endif
95
barraclough@apple.comeb51bd92008-07-30 17:38:35 +000096#define PADDING_STRING " "
97#define PADDING_STRING_LENGTH static_cast<unsigned>(strlen(PADDING_STRING))
aroben@apple.com42e34ef2008-07-24 01:00:35 +000098
fpizlo@apple.com3f65c492013-02-19 23:21:06 +000099extern const char* const opcodeNames[];
barraclough@apple.comeb51bd92008-07-30 17:38:35 +0000100
fpizlo@apple.com3f65c492013-02-19 23:21:06 +0000101inline const char* padOpcodeName(OpcodeID op, unsigned width)
102{
103 unsigned pad = width - strlen(opcodeNames[op]);
104 pad = std::min(pad, PADDING_STRING_LENGTH);
105 return PADDING_STRING + PADDING_STRING_LENGTH - pad;
106}
barraclough@apple.comf2bacea2008-07-23 22:36:39 +0000107
barraclough@apple.comeb51bd92008-07-30 17:38:35 +0000108#undef PADDING_STRING_LENGTH
109#undef PADDING_STRING
barraclough@apple.comf2bacea2008-07-23 22:36:39 +0000110
ggaren@apple.com47d3f052008-11-15 21:37:49 +0000111#if ENABLE(OPCODE_STATS)
cwzwarich@webkit.orgb7a96102008-06-05 04:39:09 +0000112
fpizlo@apple.com3f65c492013-02-19 23:21:06 +0000113struct OpcodeStats {
114 OpcodeStats();
115 ~OpcodeStats();
116 static long long opcodeCounts[numOpcodeIDs];
117 static long long opcodePairCounts[numOpcodeIDs][numOpcodeIDs];
118 static int lastOpcode;
119
120 static void recordInstruction(int opcode);
121 static void resetLastInstruction();
122};
cwzwarich@webkit.orgb7a96102008-06-05 04:39:09 +0000123
124#endif
125
fpizlo@apple.com3f65c492013-02-19 23:21:06 +0000126inline size_t opcodeLength(OpcodeID opcode)
127{
128 switch (opcode) {
commit-queue@webkit.org6ef841b2010-08-05 22:22:49 +0000129#define OPCODE_ID_LENGTHS(id, length) case id: return OPCODE_LENGTH(id);
fpizlo@apple.com3f65c492013-02-19 23:21:06 +0000130 FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTHS)
commit-queue@webkit.org6ef841b2010-08-05 22:22:49 +0000131#undef OPCODE_ID_LENGTHS
commit-queue@webkit.org6ef841b2010-08-05 22:22:49 +0000132 }
fpizlo@apple.com3f65c492013-02-19 23:21:06 +0000133 RELEASE_ASSERT_NOT_REACHED();
134 return 0;
135}
commit-queue@webkit.org6ef841b2010-08-05 22:22:49 +0000136
utatane.tea@gmail.comc2585192016-08-25 22:55:10 +0000137inline bool isBranch(OpcodeID opcodeID)
138{
139 switch (opcodeID) {
140 case op_jmp:
141 case op_jtrue:
142 case op_jfalse:
143 case op_jeq_null:
144 case op_jneq_null:
145 case op_jneq_ptr:
146 case op_jless:
147 case op_jlesseq:
148 case op_jgreater:
149 case op_jgreatereq:
150 case op_jnless:
151 case op_jnlesseq:
152 case op_jngreater:
153 case op_jngreatereq:
154 case op_switch_imm:
155 case op_switch_char:
156 case op_switch_string:
157 return true;
158 default:
159 return false;
160 }
161}
162
163inline bool isUnconditionalBranch(OpcodeID opcodeID)
164{
165 switch (opcodeID) {
166 case op_jmp:
167 return true;
168 default:
169 return false;
170 }
171}
172
173inline bool isTerminal(OpcodeID opcodeID)
174{
175 switch (opcodeID) {
176 case op_ret:
177 case op_end:
fpizlo@apple.comf5026842017-06-06 18:08:17 +0000178 case op_unreachable:
utatane.tea@gmail.comc2585192016-08-25 22:55:10 +0000179 return true;
180 default:
181 return false;
182 }
183}
184
185inline bool isThrow(OpcodeID opcodeID)
186{
187 switch (opcodeID) {
188 case op_throw:
189 case op_throw_static_error:
190 return true;
191 default:
192 return false;
193 }
194}
195
cwzwarich@webkit.org3f782f62008-09-08 01:28:33 +0000196} // namespace JSC
mrowe@apple.com2f6dfdf2008-05-22 01:20:45 +0000197
mark.lam@apple.comdf884842015-11-11 22:31:18 +0000198namespace WTF {
199
200class PrintStream;
201
202void printInternal(PrintStream&, JSC::OpcodeID);
203
204} // namespace WTF