| // Copyright 2013 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_COMPILER_OPCODES_H_ |
| #define V8_COMPILER_OPCODES_H_ |
| |
| // Opcodes for control operators. |
| #define INNER_CONTROL_OP_LIST(V) \ |
| V(Dead) \ |
| V(Loop) \ |
| V(Branch) \ |
| V(IfTrue) \ |
| V(IfFalse) \ |
| V(Merge) \ |
| V(Return) \ |
| V(Terminate) \ |
| V(Throw) |
| |
| #define CONTROL_OP_LIST(V) \ |
| INNER_CONTROL_OP_LIST(V) \ |
| V(Start) \ |
| V(End) |
| |
| // Opcodes for common operators. |
| #define LEAF_OP_LIST(V) \ |
| V(Int32Constant) \ |
| V(Int64Constant) \ |
| V(Float32Constant) \ |
| V(Float64Constant) \ |
| V(ExternalConstant) \ |
| V(NumberConstant) \ |
| V(HeapConstant) |
| |
| #define INNER_OP_LIST(V) \ |
| V(Select) \ |
| V(Phi) \ |
| V(EffectPhi) \ |
| V(ValueEffect) \ |
| V(Finish) \ |
| V(FrameState) \ |
| V(StateValues) \ |
| V(Call) \ |
| V(Parameter) \ |
| V(Projection) |
| |
| #define COMMON_OP_LIST(V) \ |
| LEAF_OP_LIST(V) \ |
| INNER_OP_LIST(V) |
| |
| // Opcodes for JavaScript operators. |
| #define JS_COMPARE_BINOP_LIST(V) \ |
| V(JSEqual) \ |
| V(JSNotEqual) \ |
| V(JSStrictEqual) \ |
| V(JSStrictNotEqual) \ |
| V(JSLessThan) \ |
| V(JSGreaterThan) \ |
| V(JSLessThanOrEqual) \ |
| V(JSGreaterThanOrEqual) |
| |
| #define JS_BITWISE_BINOP_LIST(V) \ |
| V(JSBitwiseOr) \ |
| V(JSBitwiseXor) \ |
| V(JSBitwiseAnd) \ |
| V(JSShiftLeft) \ |
| V(JSShiftRight) \ |
| V(JSShiftRightLogical) |
| |
| #define JS_ARITH_BINOP_LIST(V) \ |
| V(JSAdd) \ |
| V(JSSubtract) \ |
| V(JSMultiply) \ |
| V(JSDivide) \ |
| V(JSModulus) |
| |
| #define JS_SIMPLE_BINOP_LIST(V) \ |
| JS_COMPARE_BINOP_LIST(V) \ |
| JS_BITWISE_BINOP_LIST(V) \ |
| JS_ARITH_BINOP_LIST(V) |
| |
| #define JS_LOGIC_UNOP_LIST(V) V(JSUnaryNot) |
| |
| #define JS_CONVERSION_UNOP_LIST(V) \ |
| V(JSToBoolean) \ |
| V(JSToNumber) \ |
| V(JSToString) \ |
| V(JSToName) \ |
| V(JSToObject) |
| |
| #define JS_OTHER_UNOP_LIST(V) \ |
| V(JSTypeOf) |
| |
| #define JS_SIMPLE_UNOP_LIST(V) \ |
| JS_LOGIC_UNOP_LIST(V) \ |
| JS_CONVERSION_UNOP_LIST(V) \ |
| JS_OTHER_UNOP_LIST(V) |
| |
| #define JS_OBJECT_OP_LIST(V) \ |
| V(JSCreate) \ |
| V(JSLoadProperty) \ |
| V(JSLoadNamed) \ |
| V(JSStoreProperty) \ |
| V(JSStoreNamed) \ |
| V(JSDeleteProperty) \ |
| V(JSHasProperty) \ |
| V(JSInstanceOf) |
| |
| #define JS_CONTEXT_OP_LIST(V) \ |
| V(JSLoadContext) \ |
| V(JSStoreContext) \ |
| V(JSCreateFunctionContext) \ |
| V(JSCreateCatchContext) \ |
| V(JSCreateWithContext) \ |
| V(JSCreateBlockContext) \ |
| V(JSCreateModuleContext) \ |
| V(JSCreateScriptContext) |
| |
| #define JS_OTHER_OP_LIST(V) \ |
| V(JSCallConstruct) \ |
| V(JSCallFunction) \ |
| V(JSCallRuntime) \ |
| V(JSYield) \ |
| V(JSDebugger) |
| |
| #define JS_OP_LIST(V) \ |
| JS_SIMPLE_BINOP_LIST(V) \ |
| JS_SIMPLE_UNOP_LIST(V) \ |
| JS_OBJECT_OP_LIST(V) \ |
| JS_CONTEXT_OP_LIST(V) \ |
| JS_OTHER_OP_LIST(V) |
| |
| // Opcodes for VirtuaMachine-level operators. |
| #define SIMPLIFIED_OP_LIST(V) \ |
| V(AnyToBoolean) \ |
| V(BooleanNot) \ |
| V(BooleanToNumber) \ |
| V(NumberEqual) \ |
| V(NumberLessThan) \ |
| V(NumberLessThanOrEqual) \ |
| V(NumberAdd) \ |
| V(NumberSubtract) \ |
| V(NumberMultiply) \ |
| V(NumberDivide) \ |
| V(NumberModulus) \ |
| V(NumberToInt32) \ |
| V(NumberToUint32) \ |
| V(ReferenceEqual) \ |
| V(StringEqual) \ |
| V(StringLessThan) \ |
| V(StringLessThanOrEqual) \ |
| V(StringAdd) \ |
| V(ChangeTaggedToInt32) \ |
| V(ChangeTaggedToUint32) \ |
| V(ChangeTaggedToFloat64) \ |
| V(ChangeInt32ToTagged) \ |
| V(ChangeUint32ToTagged) \ |
| V(ChangeFloat64ToTagged) \ |
| V(ChangeBoolToBit) \ |
| V(ChangeBitToBool) \ |
| V(LoadField) \ |
| V(LoadBuffer) \ |
| V(LoadElement) \ |
| V(StoreField) \ |
| V(StoreBuffer) \ |
| V(StoreElement) \ |
| V(ObjectIsSmi) \ |
| V(ObjectIsNonNegativeSmi) |
| |
| // Opcodes for Machine-level operators. |
| #define MACHINE_OP_LIST(V) \ |
| V(Load) \ |
| V(Store) \ |
| V(Word32And) \ |
| V(Word32Or) \ |
| V(Word32Xor) \ |
| V(Word32Shl) \ |
| V(Word32Shr) \ |
| V(Word32Sar) \ |
| V(Word32Ror) \ |
| V(Word32Equal) \ |
| V(Word64And) \ |
| V(Word64Or) \ |
| V(Word64Xor) \ |
| V(Word64Shl) \ |
| V(Word64Shr) \ |
| V(Word64Sar) \ |
| V(Word64Ror) \ |
| V(Word64Equal) \ |
| V(Int32Add) \ |
| V(Int32AddWithOverflow) \ |
| V(Int32Sub) \ |
| V(Int32SubWithOverflow) \ |
| V(Int32Mul) \ |
| V(Int32MulHigh) \ |
| V(Int32Div) \ |
| V(Int32Mod) \ |
| V(Int32LessThan) \ |
| V(Int32LessThanOrEqual) \ |
| V(Uint32Div) \ |
| V(Uint32LessThan) \ |
| V(Uint32LessThanOrEqual) \ |
| V(Uint32Mod) \ |
| V(Uint32MulHigh) \ |
| V(Int64Add) \ |
| V(Int64Sub) \ |
| V(Int64Mul) \ |
| V(Int64Div) \ |
| V(Int64Mod) \ |
| V(Int64LessThan) \ |
| V(Int64LessThanOrEqual) \ |
| V(Uint64Div) \ |
| V(Uint64LessThan) \ |
| V(Uint64Mod) \ |
| V(ChangeFloat32ToFloat64) \ |
| V(ChangeFloat64ToInt32) \ |
| V(ChangeFloat64ToUint32) \ |
| V(ChangeInt32ToFloat64) \ |
| V(ChangeInt32ToInt64) \ |
| V(ChangeUint32ToFloat64) \ |
| V(ChangeUint32ToUint64) \ |
| V(TruncateFloat64ToFloat32) \ |
| V(TruncateFloat64ToInt32) \ |
| V(TruncateInt64ToInt32) \ |
| V(Float64Add) \ |
| V(Float64Sub) \ |
| V(Float64Mul) \ |
| V(Float64Div) \ |
| V(Float64Mod) \ |
| V(Float64Sqrt) \ |
| V(Float64Equal) \ |
| V(Float64LessThan) \ |
| V(Float64LessThanOrEqual) \ |
| V(Float64Floor) \ |
| V(Float64Ceil) \ |
| V(Float64RoundTruncate) \ |
| V(Float64RoundTiesAway) \ |
| V(LoadStackPointer) \ |
| V(CheckedLoad) \ |
| V(CheckedStore) |
| |
| #define VALUE_OP_LIST(V) \ |
| COMMON_OP_LIST(V) \ |
| SIMPLIFIED_OP_LIST(V) \ |
| MACHINE_OP_LIST(V) \ |
| JS_OP_LIST(V) |
| |
| // The combination of all operators at all levels and the common operators. |
| #define ALL_OP_LIST(V) \ |
| CONTROL_OP_LIST(V) \ |
| VALUE_OP_LIST(V) |
| |
| namespace v8 { |
| namespace internal { |
| namespace compiler { |
| |
| // Declare an enumeration with all the opcodes at all levels so that they |
| // can be globally, uniquely numbered. |
| class IrOpcode { |
| public: |
| enum Value { |
| #define DECLARE_OPCODE(x) k##x, |
| ALL_OP_LIST(DECLARE_OPCODE) |
| #undef DECLARE_OPCODE |
| kLast = -1 |
| #define COUNT_OPCODE(x) +1 |
| ALL_OP_LIST(COUNT_OPCODE) |
| #undef COUNT_OPCODE |
| }; |
| |
| // Returns the mnemonic name of an opcode. |
| static char const* Mnemonic(Value value); |
| |
| static bool IsJsOpcode(Value val) { |
| switch (val) { |
| // TODO(turbofan): make this a range check. |
| #define RETURN_NAME(x) \ |
| case k##x: \ |
| return true; |
| JS_OP_LIST(RETURN_NAME) |
| #undef RETURN_NAME |
| default: |
| return false; |
| } |
| } |
| |
| static bool IsControlOpcode(Value val) { |
| switch (val) { |
| // TODO(turbofan): make this a range check. |
| #define RETURN_NAME(x) \ |
| case k##x: \ |
| return true; |
| CONTROL_OP_LIST(RETURN_NAME) |
| #undef RETURN_NAME |
| default: |
| return false; |
| } |
| } |
| |
| static bool IsLeafOpcode(Value val) { |
| switch (val) { |
| // TODO(turbofan): make this a table lookup. |
| #define RETURN_NAME(x) \ |
| case k##x: \ |
| return true; |
| LEAF_OP_LIST(RETURN_NAME) |
| #undef RETURN_NAME |
| default: |
| return false; |
| } |
| } |
| |
| static bool IsCommonOpcode(Value val) { |
| switch (val) { |
| // TODO(turbofan): make this a table lookup or a range check. |
| #define RETURN_NAME(x) \ |
| case k##x: \ |
| return true; |
| CONTROL_OP_LIST(RETURN_NAME) |
| COMMON_OP_LIST(RETURN_NAME) |
| #undef RETURN_NAME |
| default: |
| return false; |
| } |
| } |
| }; |
| |
| } // namespace compiler |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_COMPILER_OPCODES_H_ |