Index: src/compiler/simplified-operator.h |
diff --git a/src/compiler/simplified-operator.h b/src/compiler/simplified-operator.h |
index b56b6322b17435a5e6a4b6ea2c866cf107bec199..01fd6e7c997fc6925e8eb246c8170d976b27825c 100644 |
--- a/src/compiler/simplified-operator.h |
+++ b/src/compiler/simplified-operator.h |
@@ -5,11 +5,8 @@ |
#ifndef V8_COMPILER_SIMPLIFIED_OPERATOR_H_ |
#define V8_COMPILER_SIMPLIFIED_OPERATOR_H_ |
-#include "src/compiler/machine-operator.h" |
-#include "src/compiler/opcodes.h" |
-#include "src/compiler/operator.h" |
+#include "src/compiler/machine-type.h" |
#include "src/handles.h" |
-#include "src/zone.h" |
namespace v8 { |
namespace internal { |
@@ -19,10 +16,16 @@ template <class> |
class TypeImpl; |
struct ZoneTypeConfig; |
typedef TypeImpl<ZoneTypeConfig> Type; |
+class Zone; |
namespace compiler { |
+// Forward declarations. |
+class Operator; |
+struct SimplifiedOperatorBuilderImpl; |
+ |
+ |
enum BaseTaggedness { kUntaggedBase, kTaggedBase }; |
// An access descriptor for loads/stores of fixed structures like field |
@@ -57,44 +60,8 @@ struct ElementAccess { |
static const int kNonHeapObjectHeaderSize = kHeapObjectTag; |
-// Specialization for static parameters of type {FieldAccess}. |
-template <> |
-struct StaticParameterTraits<FieldAccess> { |
- static OStream& PrintTo(OStream& os, const FieldAccess& val) { // NOLINT |
- return os << val.offset; |
- } |
- static int HashCode(const FieldAccess& val) { |
- return (val.offset < 16) | (val.machine_type & 0xffff); |
- } |
- static bool Equals(const FieldAccess& lhs, const FieldAccess& rhs); |
-}; |
- |
- |
-// Specialization for static parameters of type {ElementAccess}. |
-template <> |
-struct StaticParameterTraits<ElementAccess> { |
- static OStream& PrintTo(OStream& os, const ElementAccess& val) { // NOLINT |
- return os << val.header_size; |
- } |
- static int HashCode(const ElementAccess& val) { |
- return (val.header_size < 16) | (val.machine_type & 0xffff); |
- } |
- static bool Equals(const ElementAccess& lhs, const ElementAccess& rhs); |
-}; |
- |
- |
-inline const FieldAccess FieldAccessOf(const Operator* op) { |
- DCHECK(op->opcode() == IrOpcode::kLoadField || |
- op->opcode() == IrOpcode::kStoreField); |
- return OpParameter<FieldAccess>(op); |
-} |
- |
- |
-inline const ElementAccess ElementAccessOf(const Operator* op) { |
- DCHECK(op->opcode() == IrOpcode::kLoadElement || |
- op->opcode() == IrOpcode::kStoreElement); |
- return OpParameter<ElementAccess>(op); |
-} |
+const FieldAccess& FieldAccessOf(const Operator* op) WARN_UNUSED_RESULT; |
+const ElementAccess& ElementAccessOf(const Operator* op) WARN_UNUSED_RESULT; |
// Interface for building simplified operators, which represent the |
@@ -119,78 +86,55 @@ inline const ElementAccess ElementAccessOf(const Operator* op) { |
// - Bool: a tagged pointer to either the canonical JS #false or |
// the canonical JS #true object |
// - Bit: an untagged integer 0 or 1, but word-sized |
-class SimplifiedOperatorBuilder { |
+class SimplifiedOperatorBuilder FINAL { |
public: |
- explicit inline SimplifiedOperatorBuilder(Zone* zone) : zone_(zone) {} |
- |
-#define SIMPLE(name, properties, inputs, outputs) \ |
- return new (zone_) \ |
- SimpleOperator(IrOpcode::k##name, properties, inputs, outputs, #name); |
- |
-#define OP1(name, ptype, pname, properties, inputs, outputs) \ |
- return new (zone_) \ |
- Operator1<ptype>(IrOpcode::k##name, properties | Operator::kNoThrow, \ |
- inputs, outputs, #name, pname) |
- |
-#define UNOP(name) SIMPLE(name, Operator::kPure, 1, 1) |
-#define BINOP(name) SIMPLE(name, Operator::kPure, 2, 1) |
- |
- const Operator* BooleanNot() const { UNOP(BooleanNot); } |
- |
- const Operator* NumberEqual() const { BINOP(NumberEqual); } |
- const Operator* NumberLessThan() const { BINOP(NumberLessThan); } |
- const Operator* NumberLessThanOrEqual() const { |
- BINOP(NumberLessThanOrEqual); |
- } |
- const Operator* NumberAdd() const { BINOP(NumberAdd); } |
- const Operator* NumberSubtract() const { BINOP(NumberSubtract); } |
- const Operator* NumberMultiply() const { BINOP(NumberMultiply); } |
- const Operator* NumberDivide() const { BINOP(NumberDivide); } |
- const Operator* NumberModulus() const { BINOP(NumberModulus); } |
- const Operator* NumberToInt32() const { UNOP(NumberToInt32); } |
- const Operator* NumberToUint32() const { UNOP(NumberToUint32); } |
- |
- const Operator* ReferenceEqual(Type* type) const { BINOP(ReferenceEqual); } |
- |
- const Operator* StringEqual() const { BINOP(StringEqual); } |
- const Operator* StringLessThan() const { BINOP(StringLessThan); } |
- const Operator* StringLessThanOrEqual() const { |
- BINOP(StringLessThanOrEqual); |
- } |
- const Operator* StringAdd() const { BINOP(StringAdd); } |
- |
- const Operator* ChangeTaggedToInt32() const { UNOP(ChangeTaggedToInt32); } |
- const Operator* ChangeTaggedToUint32() const { UNOP(ChangeTaggedToUint32); } |
- const Operator* ChangeTaggedToFloat64() const { UNOP(ChangeTaggedToFloat64); } |
- const Operator* ChangeInt32ToTagged() const { UNOP(ChangeInt32ToTagged); } |
- const Operator* ChangeUint32ToTagged() const { UNOP(ChangeUint32ToTagged); } |
- const Operator* ChangeFloat64ToTagged() const { UNOP(ChangeFloat64ToTagged); } |
- const Operator* ChangeBoolToBit() const { UNOP(ChangeBoolToBit); } |
- const Operator* ChangeBitToBool() const { UNOP(ChangeBitToBool); } |
- |
- const Operator* LoadField(const FieldAccess& access) const { |
- OP1(LoadField, FieldAccess, access, Operator::kNoWrite, 1, 1); |
- } |
- const Operator* StoreField(const FieldAccess& access) const { |
- OP1(StoreField, FieldAccess, access, Operator::kNoRead, 2, 0); |
- } |
- const Operator* LoadElement(const ElementAccess& access) const { |
- OP1(LoadElement, ElementAccess, access, Operator::kNoWrite, 2, 1); |
- } |
- const Operator* StoreElement(const ElementAccess& access) const { |
- OP1(StoreElement, ElementAccess, access, Operator::kNoRead, 3, 0); |
- } |
- |
-#undef BINOP |
-#undef UNOP |
-#undef OP1 |
-#undef SIMPLE |
+ explicit SimplifiedOperatorBuilder(Zone* zone); |
+ |
+ const Operator* BooleanNot() const WARN_UNUSED_RESULT; |
+ |
+ const Operator* NumberEqual() const WARN_UNUSED_RESULT; |
+ const Operator* NumberLessThan() const WARN_UNUSED_RESULT; |
+ const Operator* NumberLessThanOrEqual() const WARN_UNUSED_RESULT; |
+ const Operator* NumberAdd() const WARN_UNUSED_RESULT; |
+ const Operator* NumberSubtract() const WARN_UNUSED_RESULT; |
+ const Operator* NumberMultiply() const WARN_UNUSED_RESULT; |
+ const Operator* NumberDivide() const WARN_UNUSED_RESULT; |
+ const Operator* NumberModulus() const WARN_UNUSED_RESULT; |
+ const Operator* NumberToInt32() const WARN_UNUSED_RESULT; |
+ const Operator* NumberToUint32() const WARN_UNUSED_RESULT; |
+ |
+ const Operator* ReferenceEqual(Type* type) const WARN_UNUSED_RESULT; |
+ |
+ const Operator* StringEqual() const WARN_UNUSED_RESULT; |
+ const Operator* StringLessThan() const WARN_UNUSED_RESULT; |
+ const Operator* StringLessThanOrEqual() const WARN_UNUSED_RESULT; |
+ const Operator* StringAdd() const WARN_UNUSED_RESULT; |
+ |
+ const Operator* ChangeTaggedToInt32() const WARN_UNUSED_RESULT; |
+ const Operator* ChangeTaggedToUint32() const WARN_UNUSED_RESULT; |
+ const Operator* ChangeTaggedToFloat64() const WARN_UNUSED_RESULT; |
+ const Operator* ChangeInt32ToTagged() const WARN_UNUSED_RESULT; |
+ const Operator* ChangeUint32ToTagged() const WARN_UNUSED_RESULT; |
+ const Operator* ChangeFloat64ToTagged() const WARN_UNUSED_RESULT; |
+ const Operator* ChangeBoolToBit() const WARN_UNUSED_RESULT; |
+ const Operator* ChangeBitToBool() const WARN_UNUSED_RESULT; |
+ |
+ const Operator* LoadField(const FieldAccess&) const WARN_UNUSED_RESULT; |
+ const Operator* StoreField(const FieldAccess&) const WARN_UNUSED_RESULT; |
+ const Operator* LoadElement(const ElementAccess&) const WARN_UNUSED_RESULT; |
+ const Operator* StoreElement(const ElementAccess&) const WARN_UNUSED_RESULT; |
private: |
- Zone* zone_; |
+ Zone* zone() const { return zone_; } |
+ |
+ const SimplifiedOperatorBuilderImpl& impl_; |
+ Zone* const zone_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SimplifiedOperatorBuilder); |
}; |
-} |
-} |
-} // namespace v8::internal::compiler |
+ |
+} // namespace compiler |
+} // namespace internal |
+} // namespace v8 |
#endif // V8_COMPILER_SIMPLIFIED_OPERATOR_H_ |