• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_INTERPRETER_BYTECODE_PEEPHOLE_TABLE_H_
6 #define V8_INTERPRETER_BYTECODE_PEEPHOLE_TABLE_H_
7 
8 #include "src/interpreter/bytecodes.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace interpreter {
13 
14 #define PEEPHOLE_NON_JUMP_ACTION_LIST(V)              \
15   V(DefaultAction)                                    \
16   V(UpdateLastAction)                                 \
17   V(UpdateLastIfSourceInfoPresentAction)              \
18   V(ElideCurrentAction)                               \
19   V(ElideCurrentIfOperand0MatchesAction)              \
20   V(ElideLastAction)                                  \
21   V(ChangeBytecodeAction)                             \
22   V(TransformLdaSmiBinaryOpToBinaryOpWithSmiAction)   \
23   V(TransformLdaZeroBinaryOpToBinaryOpWithZeroAction) \
24   V(TransformEqualityWithNullOrUndefinedAction)
25 
26 #define PEEPHOLE_JUMP_ACTION_LIST(V) \
27   V(DefaultJumpAction)               \
28   V(UpdateLastJumpAction)            \
29   V(ChangeJumpBytecodeAction)        \
30   V(ElideLastBeforeJumpAction)
31 
32 #define PEEPHOLE_ACTION_LIST(V)    \
33   PEEPHOLE_NON_JUMP_ACTION_LIST(V) \
34   PEEPHOLE_JUMP_ACTION_LIST(V)
35 
36 // Actions to take when a pair of bytes is encountered. A handler
37 // exists for each action.
38 enum class PeepholeAction : uint8_t {
39 #define DECLARE_PEEPHOLE_ACTION(Action) k##Action,
40   PEEPHOLE_ACTION_LIST(DECLARE_PEEPHOLE_ACTION)
41 #undef DECLARE_PEEPHOLE_ACTION
42 };
43 
44 // Tuple of action to take when pair of bytecodes is encountered and
45 // optional data to invoke handler with.
46 struct PeepholeActionAndData final {
47   // Action to take when tuple of bytecodes encountered.
48   PeepholeAction action;
49 
50   // Replacement bytecode (if valid).
51   Bytecode bytecode;
52 };
53 
54 // Lookup table for matching pairs of bytecodes to peephole optimization
55 // actions. The contents of the table are generated by mkpeephole.cc.
56 struct PeepholeActionTable final {
57  public:
58   static const PeepholeActionAndData* Lookup(Bytecode last, Bytecode current);
59 
60  private:
61   static const size_t kNumberOfBytecodes =
62       static_cast<size_t>(Bytecode::kLast) + 1;
63 
64   static const PeepholeActionAndData row_data_[][kNumberOfBytecodes];
65   static const PeepholeActionAndData* const row_[kNumberOfBytecodes];
66 };
67 
68 }  // namespace interpreter
69 }  // namespace internal
70 }  // namespace v8
71 
72 #endif  // V8_INTERPRETER_BYTECODE_PEEPHOLE_TABLE_H_
73