| Index: src/compiler/machine-operator.cc
|
| diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc
|
| index 83459f70e90f2ad8d18f09e7f94025670454c873..eb034e92e3736837e4120bf67226290a9f14c8b7 100644
|
| --- a/src/compiler/machine-operator.cc
|
| +++ b/src/compiler/machine-operator.cc
|
| @@ -54,6 +54,18 @@ StoreRepresentation const& StoreRepresentationOf(Operator const* op) {
|
| }
|
|
|
|
|
| +CheckedLoadRepresentation CheckedLoadRepresentationOf(Operator const* op) {
|
| + DCHECK_EQ(IrOpcode::kCheckedLoad, op->opcode());
|
| + return OpParameter<CheckedLoadRepresentation>(op);
|
| +}
|
| +
|
| +
|
| +CheckedStoreRepresentation CheckedStoreRepresentationOf(Operator const* op) {
|
| + DCHECK_EQ(IrOpcode::kCheckedStore, op->opcode());
|
| + return OpParameter<CheckedStoreRepresentation>(op);
|
| +}
|
| +
|
| +
|
| #define PURE_OP_LIST(V) \
|
| V(Word32And, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| V(Word32Or, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
|
| @@ -158,37 +170,53 @@ struct MachineOperatorGlobalCache {
|
| PURE_OP_LIST(PURE)
|
| #undef PURE
|
|
|
| -#define LOAD(Type) \
|
| - struct Load##Type##Operator FINAL : public Operator1<LoadRepresentation> { \
|
| - Load##Type##Operator() \
|
| - : Operator1<LoadRepresentation>( \
|
| - IrOpcode::kLoad, Operator::kNoThrow | Operator::kNoWrite, \
|
| - "Load", 2, 1, 1, 1, 1, 0, k##Type) {} \
|
| - }; \
|
| - Load##Type##Operator k##Load##Type;
|
| +#define LOAD(Type) \
|
| + struct Load##Type##Operator FINAL : public Operator1<LoadRepresentation> { \
|
| + Load##Type##Operator() \
|
| + : Operator1<LoadRepresentation>( \
|
| + IrOpcode::kLoad, Operator::kNoThrow | Operator::kNoWrite, \
|
| + "Load", 2, 1, 1, 1, 1, 0, k##Type) {} \
|
| + }; \
|
| + struct CheckedLoad##Type##Operator FINAL \
|
| + : public Operator1<CheckedLoadRepresentation> { \
|
| + CheckedLoad##Type##Operator() \
|
| + : Operator1<CheckedLoadRepresentation>( \
|
| + IrOpcode::kCheckedLoad, Operator::kNoThrow | Operator::kNoWrite, \
|
| + "CheckedLoad", 3, 1, 1, 1, 1, 0, k##Type) {} \
|
| + }; \
|
| + Load##Type##Operator kLoad##Type; \
|
| + CheckedLoad##Type##Operator kCheckedLoad##Type;
|
| MACHINE_TYPE_LIST(LOAD)
|
| #undef LOAD
|
|
|
| -#define STORE(Type) \
|
| - struct Store##Type##Operator : public Operator1<StoreRepresentation> { \
|
| - explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \
|
| - : Operator1<StoreRepresentation>( \
|
| - IrOpcode::kStore, Operator::kNoRead | Operator::kNoThrow, \
|
| - "Store", 3, 1, 1, 0, 1, 0, \
|
| - StoreRepresentation(k##Type, write_barrier_kind)) {} \
|
| - }; \
|
| - struct Store##Type##NoWriteBarrier##Operator FINAL \
|
| - : public Store##Type##Operator { \
|
| - Store##Type##NoWriteBarrier##Operator() \
|
| - : Store##Type##Operator(kNoWriteBarrier) {} \
|
| - }; \
|
| - struct Store##Type##FullWriteBarrier##Operator FINAL \
|
| - : public Store##Type##Operator { \
|
| - Store##Type##FullWriteBarrier##Operator() \
|
| - : Store##Type##Operator(kFullWriteBarrier) {} \
|
| - }; \
|
| - Store##Type##NoWriteBarrier##Operator k##Store##Type##NoWriteBarrier; \
|
| - Store##Type##FullWriteBarrier##Operator k##Store##Type##FullWriteBarrier;
|
| +#define STORE(Type) \
|
| + struct Store##Type##Operator : public Operator1<StoreRepresentation> { \
|
| + explicit Store##Type##Operator(WriteBarrierKind write_barrier_kind) \
|
| + : Operator1<StoreRepresentation>( \
|
| + IrOpcode::kStore, Operator::kNoRead | Operator::kNoThrow, \
|
| + "Store", 3, 1, 1, 0, 1, 0, \
|
| + StoreRepresentation(k##Type, write_barrier_kind)) {} \
|
| + }; \
|
| + struct Store##Type##NoWriteBarrier##Operator FINAL \
|
| + : public Store##Type##Operator { \
|
| + Store##Type##NoWriteBarrier##Operator() \
|
| + : Store##Type##Operator(kNoWriteBarrier) {} \
|
| + }; \
|
| + struct Store##Type##FullWriteBarrier##Operator FINAL \
|
| + : public Store##Type##Operator { \
|
| + Store##Type##FullWriteBarrier##Operator() \
|
| + : Store##Type##Operator(kFullWriteBarrier) {} \
|
| + }; \
|
| + struct CheckedStore##Type##Operator FINAL \
|
| + : public Operator1<CheckedStoreRepresentation> { \
|
| + CheckedStore##Type##Operator() \
|
| + : Operator1<CheckedStoreRepresentation>( \
|
| + IrOpcode::kCheckedStore, Operator::kNoRead | Operator::kNoThrow, \
|
| + "CheckedStore", 4, 1, 1, 0, 1, 0, k##Type) {} \
|
| + }; \
|
| + Store##Type##NoWriteBarrier##Operator kStore##Type##NoWriteBarrier; \
|
| + Store##Type##FullWriteBarrier##Operator kStore##Type##FullWriteBarrier; \
|
| + CheckedStore##Type##Operator kCheckedStore##Type;
|
| MACHINE_TYPE_LIST(STORE)
|
| #undef STORE
|
| };
|
| @@ -216,10 +244,9 @@ const Operator* MachineOperatorBuilder::Load(LoadRepresentation rep) {
|
| switch (rep) {
|
| #define LOAD(Type) \
|
| case k##Type: \
|
| - return &cache_.k##Load##Type;
|
| + return &cache_.kLoad##Type;
|
| MACHINE_TYPE_LIST(LOAD)
|
| #undef LOAD
|
| -
|
| default:
|
| break;
|
| }
|
| @@ -252,6 +279,43 @@ const Operator* MachineOperatorBuilder::Store(StoreRepresentation rep) {
|
| IrOpcode::kStore, Operator::kNoRead | Operator::kNoThrow, "Store", 3, 1,
|
| 1, 0, 1, 0, rep);
|
| }
|
| +
|
| +
|
| +const Operator* MachineOperatorBuilder::CheckedLoad(
|
| + CheckedLoadRepresentation rep) {
|
| + switch (rep) {
|
| +#define LOAD(Type) \
|
| + case k##Type: \
|
| + return &cache_.kCheckedLoad##Type;
|
| + MACHINE_TYPE_LIST(LOAD)
|
| +#undef LOAD
|
| + default:
|
| + break;
|
| + }
|
| + // Uncached.
|
| + return new (zone_) Operator1<CheckedLoadRepresentation>(
|
| + IrOpcode::kCheckedLoad, Operator::kNoThrow | Operator::kNoWrite,
|
| + "CheckedLoad", 3, 1, 1, 1, 1, 0, rep);
|
| +}
|
| +
|
| +
|
| +const Operator* MachineOperatorBuilder::CheckedStore(
|
| + CheckedStoreRepresentation rep) {
|
| + switch (rep) {
|
| +#define STORE(Type) \
|
| + case k##Type: \
|
| + return &cache_.kCheckedStore##Type;
|
| + MACHINE_TYPE_LIST(STORE)
|
| +#undef STORE
|
| + default:
|
| + break;
|
| + }
|
| + // Uncached.
|
| + return new (zone_) Operator1<CheckedStoreRepresentation>(
|
| + IrOpcode::kCheckedStore, Operator::kNoRead | Operator::kNoThrow,
|
| + "CheckedStore", 4, 1, 1, 0, 1, 0, rep);
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|