Home | History | Annotate | Download | only in compiler
      1 // Copyright 2013 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_COMPILER_OPCODES_H_
      6 #define V8_COMPILER_OPCODES_H_
      7 
      8 // Opcodes for control operators.
      9 #define INNER_CONTROL_OP_LIST(V) \
     10   V(Dead)                  \
     11   V(Loop)                  \
     12   V(Branch)                \
     13   V(IfTrue)                \
     14   V(IfFalse)               \
     15   V(Merge)                 \
     16   V(Return)                \
     17   V(Throw)
     18 
     19 #define CONTROL_OP_LIST(V) \
     20   INNER_CONTROL_OP_LIST(V) \
     21   V(Start)                 \
     22   V(End)
     23 
     24 // Opcodes for common operators.
     25 #define LEAF_OP_LIST(V) \
     26   V(Int32Constant)      \
     27   V(Int64Constant)      \
     28   V(Float32Constant)    \
     29   V(Float64Constant)    \
     30   V(ExternalConstant)   \
     31   V(NumberConstant)     \
     32   V(HeapConstant)
     33 
     34 #define INNER_OP_LIST(V) \
     35   V(Phi)                 \
     36   V(EffectPhi)           \
     37   V(ControlEffect)       \
     38   V(ValueEffect)         \
     39   V(Finish)              \
     40   V(FrameState)          \
     41   V(StateValues)         \
     42   V(Call)                \
     43   V(Parameter)           \
     44   V(Projection)
     45 
     46 #define COMMON_OP_LIST(V) \
     47   LEAF_OP_LIST(V)         \
     48   INNER_OP_LIST(V)
     49 
     50 // Opcodes for JavaScript operators.
     51 #define JS_COMPARE_BINOP_LIST(V) \
     52   V(JSEqual)                     \
     53   V(JSNotEqual)                  \
     54   V(JSStrictEqual)               \
     55   V(JSStrictNotEqual)            \
     56   V(JSLessThan)                  \
     57   V(JSGreaterThan)               \
     58   V(JSLessThanOrEqual)           \
     59   V(JSGreaterThanOrEqual)
     60 
     61 #define JS_BITWISE_BINOP_LIST(V) \
     62   V(JSBitwiseOr)                 \
     63   V(JSBitwiseXor)                \
     64   V(JSBitwiseAnd)                \
     65   V(JSShiftLeft)                 \
     66   V(JSShiftRight)                \
     67   V(JSShiftRightLogical)
     68 
     69 #define JS_ARITH_BINOP_LIST(V) \
     70   V(JSAdd)                     \
     71   V(JSSubtract)                \
     72   V(JSMultiply)                \
     73   V(JSDivide)                  \
     74   V(JSModulus)
     75 
     76 #define JS_SIMPLE_BINOP_LIST(V) \
     77   JS_COMPARE_BINOP_LIST(V)      \
     78   JS_BITWISE_BINOP_LIST(V)      \
     79   JS_ARITH_BINOP_LIST(V)
     80 
     81 #define JS_LOGIC_UNOP_LIST(V) V(JSUnaryNot)
     82 
     83 #define JS_CONVERSION_UNOP_LIST(V) \
     84   V(JSToBoolean)                   \
     85   V(JSToNumber)                    \
     86   V(JSToString)                    \
     87   V(JSToName)                      \
     88   V(JSToObject)
     89 
     90 #define JS_OTHER_UNOP_LIST(V) \
     91   V(JSTypeOf)
     92 
     93 #define JS_SIMPLE_UNOP_LIST(V) \
     94   JS_LOGIC_UNOP_LIST(V)        \
     95   JS_CONVERSION_UNOP_LIST(V)   \
     96   JS_OTHER_UNOP_LIST(V)
     97 
     98 #define JS_OBJECT_OP_LIST(V) \
     99   V(JSCreate)                \
    100   V(JSLoadProperty)          \
    101   V(JSLoadNamed)             \
    102   V(JSStoreProperty)         \
    103   V(JSStoreNamed)            \
    104   V(JSDeleteProperty)        \
    105   V(JSHasProperty)           \
    106   V(JSInstanceOf)
    107 
    108 #define JS_CONTEXT_OP_LIST(V) \
    109   V(JSLoadContext)            \
    110   V(JSStoreContext)           \
    111   V(JSCreateFunctionContext)  \
    112   V(JSCreateCatchContext)     \
    113   V(JSCreateWithContext)      \
    114   V(JSCreateBlockContext)     \
    115   V(JSCreateModuleContext)    \
    116   V(JSCreateGlobalContext)
    117 
    118 #define JS_OTHER_OP_LIST(V) \
    119   V(JSCallConstruct)        \
    120   V(JSCallFunction)         \
    121   V(JSCallRuntime)          \
    122   V(JSYield)                \
    123   V(JSDebugger)
    124 
    125 #define JS_OP_LIST(V)     \
    126   JS_SIMPLE_BINOP_LIST(V) \
    127   JS_SIMPLE_UNOP_LIST(V)  \
    128   JS_OBJECT_OP_LIST(V)    \
    129   JS_CONTEXT_OP_LIST(V)   \
    130   JS_OTHER_OP_LIST(V)
    131 
    132 // Opcodes for VirtuaMachine-level operators.
    133 #define SIMPLIFIED_OP_LIST(V) \
    134   V(BooleanNot)               \
    135   V(BooleanToNumber)          \
    136   V(NumberEqual)              \
    137   V(NumberLessThan)           \
    138   V(NumberLessThanOrEqual)    \
    139   V(NumberAdd)                \
    140   V(NumberSubtract)           \
    141   V(NumberMultiply)           \
    142   V(NumberDivide)             \
    143   V(NumberModulus)            \
    144   V(NumberToInt32)            \
    145   V(NumberToUint32)           \
    146   V(ReferenceEqual)           \
    147   V(StringEqual)              \
    148   V(StringLessThan)           \
    149   V(StringLessThanOrEqual)    \
    150   V(StringAdd)                \
    151   V(ChangeTaggedToInt32)      \
    152   V(ChangeTaggedToUint32)     \
    153   V(ChangeTaggedToFloat64)    \
    154   V(ChangeInt32ToTagged)      \
    155   V(ChangeUint32ToTagged)     \
    156   V(ChangeFloat64ToTagged)    \
    157   V(ChangeBoolToBit)          \
    158   V(ChangeBitToBool)          \
    159   V(LoadField)                \
    160   V(LoadElement)              \
    161   V(StoreField)               \
    162   V(StoreElement)
    163 
    164 // Opcodes for Machine-level operators.
    165 #define MACHINE_OP_LIST(V)    \
    166   V(Load)                     \
    167   V(Store)                    \
    168   V(Word32And)                \
    169   V(Word32Or)                 \
    170   V(Word32Xor)                \
    171   V(Word32Shl)                \
    172   V(Word32Shr)                \
    173   V(Word32Sar)                \
    174   V(Word32Ror)                \
    175   V(Word32Equal)              \
    176   V(Word64And)                \
    177   V(Word64Or)                 \
    178   V(Word64Xor)                \
    179   V(Word64Shl)                \
    180   V(Word64Shr)                \
    181   V(Word64Sar)                \
    182   V(Word64Ror)                \
    183   V(Word64Equal)              \
    184   V(Int32Add)                 \
    185   V(Int32AddWithOverflow)     \
    186   V(Int32Sub)                 \
    187   V(Int32SubWithOverflow)     \
    188   V(Int32Mul)                 \
    189   V(Int32Div)                 \
    190   V(Int32UDiv)                \
    191   V(Int32Mod)                 \
    192   V(Int32UMod)                \
    193   V(Int32LessThan)            \
    194   V(Int32LessThanOrEqual)     \
    195   V(Uint32LessThan)           \
    196   V(Uint32LessThanOrEqual)    \
    197   V(Int64Add)                 \
    198   V(Int64Sub)                 \
    199   V(Int64Mul)                 \
    200   V(Int64Div)                 \
    201   V(Int64UDiv)                \
    202   V(Int64Mod)                 \
    203   V(Int64UMod)                \
    204   V(Int64LessThan)            \
    205   V(Int64LessThanOrEqual)     \
    206   V(ChangeFloat32ToFloat64)   \
    207   V(ChangeFloat64ToInt32)     \
    208   V(ChangeFloat64ToUint32)    \
    209   V(ChangeInt32ToFloat64)     \
    210   V(ChangeInt32ToInt64)       \
    211   V(ChangeUint32ToFloat64)    \
    212   V(ChangeUint32ToUint64)     \
    213   V(TruncateFloat64ToFloat32) \
    214   V(TruncateFloat64ToInt32)   \
    215   V(TruncateInt64ToInt32)     \
    216   V(Float64Add)               \
    217   V(Float64Sub)               \
    218   V(Float64Mul)               \
    219   V(Float64Div)               \
    220   V(Float64Mod)               \
    221   V(Float64Sqrt)              \
    222   V(Float64Equal)             \
    223   V(Float64LessThan)          \
    224   V(Float64LessThanOrEqual)
    225 
    226 #define VALUE_OP_LIST(V) \
    227   COMMON_OP_LIST(V)      \
    228   SIMPLIFIED_OP_LIST(V)  \
    229   MACHINE_OP_LIST(V)     \
    230   JS_OP_LIST(V)
    231 
    232 // The combination of all operators at all levels and the common operators.
    233 #define ALL_OP_LIST(V) \
    234   CONTROL_OP_LIST(V)   \
    235   VALUE_OP_LIST(V)
    236 
    237 namespace v8 {
    238 namespace internal {
    239 namespace compiler {
    240 
    241 // Declare an enumeration with all the opcodes at all levels so that they
    242 // can be globally, uniquely numbered.
    243 class IrOpcode {
    244  public:
    245   enum Value {
    246 #define DECLARE_OPCODE(x) k##x,
    247     ALL_OP_LIST(DECLARE_OPCODE)
    248 #undef DECLARE_OPCODE
    249     kLast = -1
    250 #define COUNT_OPCODE(x) +1
    251             ALL_OP_LIST(COUNT_OPCODE)
    252 #undef COUNT_OPCODE
    253   };
    254 
    255   // Returns the mnemonic name of an opcode.
    256   static const char* Mnemonic(Value val) {
    257     switch (val) {
    258 #define RETURN_NAME(x) \
    259   case k##x:           \
    260     return #x;
    261       ALL_OP_LIST(RETURN_NAME)
    262 #undef RETURN_NAME
    263       default:
    264         return "UnknownOpcode";
    265     }
    266   }
    267 
    268   static bool IsJsOpcode(Value val) {
    269     switch (val) {
    270 #define RETURN_NAME(x) \
    271   case k##x:           \
    272     return true;
    273       JS_OP_LIST(RETURN_NAME)
    274 #undef RETURN_NAME
    275       default:
    276         return false;
    277     }
    278   }
    279 
    280   static bool IsControlOpcode(Value val) {
    281     switch (val) {
    282 #define RETURN_NAME(x) \
    283   case k##x:           \
    284     return true;
    285       CONTROL_OP_LIST(RETURN_NAME)
    286 #undef RETURN_NAME
    287       default:
    288         return false;
    289     }
    290   }
    291 
    292   static bool IsCommonOpcode(Value val) {
    293     switch (val) {
    294 #define RETURN_NAME(x) \
    295   case k##x:           \
    296     return true;
    297       CONTROL_OP_LIST(RETURN_NAME)
    298       COMMON_OP_LIST(RETURN_NAME)
    299 #undef RETURN_NAME
    300       default:
    301         return false;
    302     }
    303   }
    304 };
    305 
    306 }  // namespace compiler
    307 }  // namespace internal
    308 }  // namespace v8
    309 
    310 #endif  // V8_COMPILER_OPCODES_H_
    311