| Index: src/compiler/opcodes.h
|
| diff --git a/src/compiler/opcodes.h b/src/compiler/opcodes.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ea107c9c7da07cad6c6cb3a40a859eda8e4bc8ca
|
| --- /dev/null
|
| +++ b/src/compiler/opcodes.h
|
| @@ -0,0 +1,294 @@
|
| +// 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 CONTROL_OP_LIST(V) \
|
| + V(Start) \
|
| + V(Dead) \
|
| + V(Loop) \
|
| + V(End) \
|
| + V(Branch) \
|
| + V(IfTrue) \
|
| + V(IfFalse) \
|
| + V(Merge) \
|
| + V(Return) \
|
| + V(Throw) \
|
| + V(Continuation) \
|
| + V(LazyDeoptimization) \
|
| + V(Deoptimize)
|
| +
|
| +// Opcodes for common operators.
|
| +#define LEAF_OP_LIST(V) \
|
| + V(Parameter) \
|
| + V(Int32Constant) \
|
| + V(Int64Constant) \
|
| + V(Float64Constant) \
|
| + V(ExternalConstant) \
|
| + V(NumberConstant) \
|
| + V(HeapConstant)
|
| +
|
| +#define INNER_OP_LIST(V) \
|
| + V(Phi) \
|
| + V(EffectPhi) \
|
| + V(FrameState) \
|
| + V(Call) \
|
| + 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(JSCreateGlobalContext)
|
| +
|
| +#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(BooleanNot) \
|
| + 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(LoadElement) \
|
| + V(StoreField) \
|
| + V(StoreElement)
|
| +
|
| +// 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(Word32Equal) \
|
| + V(Word64And) \
|
| + V(Word64Or) \
|
| + V(Word64Xor) \
|
| + V(Word64Shl) \
|
| + V(Word64Shr) \
|
| + V(Word64Sar) \
|
| + V(Word64Equal) \
|
| + V(Int32Add) \
|
| + V(Int32Sub) \
|
| + V(Int32Mul) \
|
| + V(Int32Div) \
|
| + V(Int32UDiv) \
|
| + V(Int32Mod) \
|
| + V(Int32UMod) \
|
| + V(Int32LessThan) \
|
| + V(Int32LessThanOrEqual) \
|
| + V(Uint32LessThan) \
|
| + V(Uint32LessThanOrEqual) \
|
| + V(Int64Add) \
|
| + V(Int64Sub) \
|
| + V(Int64Mul) \
|
| + V(Int64Div) \
|
| + V(Int64UDiv) \
|
| + V(Int64Mod) \
|
| + V(Int64UMod) \
|
| + V(Int64LessThan) \
|
| + V(Int64LessThanOrEqual) \
|
| + V(ConvertInt64ToInt32) \
|
| + V(ConvertInt32ToInt64) \
|
| + V(ConvertInt32ToFloat64) \
|
| + V(ConvertUint32ToFloat64) \
|
| + V(ConvertFloat64ToInt32) \
|
| + V(ConvertFloat64ToUint32) \
|
| + V(Float64Add) \
|
| + V(Float64Sub) \
|
| + V(Float64Mul) \
|
| + V(Float64Div) \
|
| + V(Float64Mod) \
|
| + V(Float64Equal) \
|
| + V(Float64LessThan) \
|
| + V(Float64LessThanOrEqual)
|
| +
|
| +#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 const char* Mnemonic(Value val) {
|
| + switch (val) {
|
| +#define RETURN_NAME(x) \
|
| + case k##x: \
|
| + return #x;
|
| + ALL_OP_LIST(RETURN_NAME)
|
| +#undef RETURN_NAME
|
| + default:
|
| + return "UnknownOpcode";
|
| + }
|
| + }
|
| +
|
| + static bool IsJsOpcode(Value val) {
|
| + switch (val) {
|
| +#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) {
|
| +#define RETURN_NAME(x) \
|
| + case k##x: \
|
| + return true;
|
| + CONTROL_OP_LIST(RETURN_NAME)
|
| +#undef RETURN_NAME
|
| + default:
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + static bool IsCommonOpcode(Value val) {
|
| + switch (val) {
|
| +#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_
|
|
|