• 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 
25 #define PEEPHOLE_JUMP_ACTION_LIST(V) \
26   V(DefaultJumpAction)               \
27   V(UpdateLastJumpAction)            \
28   V(ChangeJumpBytecodeAction)        \
29   V(ElideLastBeforeJumpAction)
30 
31 #define PEEPHOLE_ACTION_LIST(V)    \
32   PEEPHOLE_NON_JUMP_ACTION_LIST(V) \
33   PEEPHOLE_JUMP_ACTION_LIST(V)
34 
35 // Actions to take when a pair of bytes is encountered. A handler
36 // exists for each action.
37 enum class PeepholeAction : uint8_t {
38 #define DECLARE_PEEPHOLE_ACTION(Action) k##Action,
39   PEEPHOLE_ACTION_LIST(DECLARE_PEEPHOLE_ACTION)
40 #undef DECLARE_PEEPHOLE_ACTION
41 };
42 
43 // Tuple of action to take when pair of bytecodes is encountered and
44 // optional data to invoke handler with.
45 struct PeepholeActionAndData final {
46   // Action to take when tuple of bytecodes encountered.
47   PeepholeAction action;
48 
49   // Replacement bytecode (if valid).
50   Bytecode bytecode;
51 };
52 
53 // Lookup table for matching pairs of bytecodes to peephole optimization
54 // actions. The contents of the table are generated by mkpeephole.cc.
55 struct PeepholeActionTable final {
56  public:
57   static const PeepholeActionAndData* Lookup(Bytecode last, Bytecode current);
58 
59  private:
60   static const size_t kNumberOfBytecodes =
61       static_cast<size_t>(Bytecode::kLast) + 1;
62 
63   static const PeepholeActionAndData row_data_[][kNumberOfBytecodes];
64   static const PeepholeActionAndData* const row_[kNumberOfBytecodes];
65 };
66 
67 }  // namespace interpreter
68 }  // namespace internal
69 }  // namespace v8
70 
71 #endif  // V8_INTERPRETER_BYTECODE_PEEPHOLE_TABLE_H_
72