Index: src/compiler/instruction-codes.h |
diff --git a/src/compiler/instruction-codes.h b/src/compiler/instruction-codes.h |
index cb47be64467ddd1f9f13639fbb567b1799c1cb7a..ee3655735b2477cf3f46d1cfc0daea558e9ad17e 100644 |
--- a/src/compiler/instruction-codes.h |
+++ b/src/compiler/instruction-codes.h |
@@ -33,45 +33,55 @@ namespace v8 { |
namespace internal { |
namespace compiler { |
+// A set of flags describing some properties of the instructions. |
+enum ArchOpcodeFlags { |
+ kNoOpcodeFlags = 0, |
+ kIsBlockTerminator = 1, // The instruction marks the end of a basic block |
+ // e.g.: jump and return instructions. |
+ kHasSideEffect = 2, // The instruction has some side effects (memory |
+ // store, function call...) |
+ kIsLoadOperation = 4, // The instruction is a memory load. |
+}; |
+ |
// Target-specific opcodes that specify which assembly sequence to emit. |
// Most opcodes specify a single instruction. |
-#define ARCH_OPCODE_LIST(V) \ |
- V(ArchCallCodeObject) \ |
- V(ArchTailCallCodeObject) \ |
- V(ArchCallJSFunction) \ |
- V(ArchTailCallJSFunction) \ |
- V(ArchPrepareCallCFunction) \ |
- V(ArchCallCFunction) \ |
- V(ArchJmp) \ |
- V(ArchLookupSwitch) \ |
- V(ArchTableSwitch) \ |
- V(ArchNop) \ |
- V(ArchDeoptimize) \ |
- V(ArchRet) \ |
- V(ArchStackPointer) \ |
- V(ArchFramePointer) \ |
- V(ArchTruncateDoubleToI) \ |
- V(CheckedLoadInt8) \ |
- V(CheckedLoadUint8) \ |
- V(CheckedLoadInt16) \ |
- V(CheckedLoadUint16) \ |
- V(CheckedLoadWord32) \ |
- V(CheckedLoadWord64) \ |
- V(CheckedLoadFloat32) \ |
- V(CheckedLoadFloat64) \ |
- V(CheckedStoreWord8) \ |
- V(CheckedStoreWord16) \ |
- V(CheckedStoreWord32) \ |
- V(CheckedStoreWord64) \ |
- V(CheckedStoreFloat32) \ |
- V(CheckedStoreFloat64) \ |
+#define ARCH_OPCODE_LIST(V) \ |
+ V(ArchCallCodeObject, kHasSideEffect) \ |
+ V(ArchTailCallCodeObject, kHasSideEffect | kIsBlockTerminator) \ |
+ V(ArchCallJSFunction, kHasSideEffect) \ |
+ V(ArchTailCallJSFunction, kHasSideEffect | kIsBlockTerminator) \ |
+ V(ArchPrepareCallCFunction, kHasSideEffect) \ |
+ V(ArchCallCFunction, kHasSideEffect) \ |
+ V(ArchJmp, kIsBlockTerminator) \ |
+ V(ArchLookupSwitch, kIsBlockTerminator) \ |
+ V(ArchTableSwitch, kIsBlockTerminator) \ |
+ V(ArchNop, kNoOpcodeFlags) \ |
+ V(ArchDeoptimize, kNoOpcodeFlags) \ |
+ V(ArchRet, kIsBlockTerminator) \ |
+ V(ArchStackPointer, kNoOpcodeFlags) \ |
+ V(ArchFramePointer, kNoOpcodeFlags) \ |
+ V(ArchTruncateDoubleToI, kNoOpcodeFlags) \ |
+ V(CheckedLoadInt8, kIsLoadOperation) \ |
+ V(CheckedLoadUint8, kIsLoadOperation) \ |
+ V(CheckedLoadInt16, kIsLoadOperation) \ |
+ V(CheckedLoadUint16, kIsLoadOperation) \ |
+ V(CheckedLoadWord32, kIsLoadOperation) \ |
+ V(CheckedLoadWord64, kIsLoadOperation) \ |
+ V(CheckedLoadFloat32, kIsLoadOperation) \ |
+ V(CheckedLoadFloat64, kIsLoadOperation) \ |
+ V(CheckedStoreWord8, kHasSideEffect) \ |
+ V(CheckedStoreWord16, kHasSideEffect) \ |
+ V(CheckedStoreWord32, kHasSideEffect) \ |
+ V(CheckedStoreWord64, kHasSideEffect) \ |
+ V(CheckedStoreFloat32, kHasSideEffect) \ |
+ V(CheckedStoreFloat64, kHasSideEffect) \ |
TARGET_ARCH_OPCODE_LIST(V) |
enum ArchOpcode { |
-#define DECLARE_ARCH_OPCODE(Name) k##Name, |
+#define DECLARE_ARCH_OPCODE(Name, Flags) k##Name, |
ARCH_OPCODE_LIST(DECLARE_ARCH_OPCODE) |
#undef DECLARE_ARCH_OPCODE |
-#define COUNT_ARCH_OPCODE(Name) +1 |
+#define COUNT_ARCH_OPCODE(Name, Flags) +1 |
kLastArchOpcode = -1 ARCH_OPCODE_LIST(COUNT_ARCH_OPCODE) |
#undef COUNT_ARCH_OPCODE |
}; |