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 |