Index: src/compiler/machine-operator.cc |
diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc |
index 6a506d26ad334c493ec8c92184eb1bf28b12d0cd..b4628abe085b20015246b57c6c936f5019bb8810 100644 |
--- a/src/compiler/machine-operator.cc |
+++ b/src/compiler/machine-operator.cc |
@@ -79,6 +79,16 @@ StoreRepresentation const& StoreRepresentationOf(Operator const* op) { |
return OpParameter<StoreRepresentation>(op); |
} |
+UnalignedLoadRepresentation UnalignedLoadRepresentationOf(Operator const* op) { |
+ DCHECK_EQ(IrOpcode::kUnalignedLoad, op->opcode()); |
+ return OpParameter<UnalignedLoadRepresentation>(op); |
+} |
+ |
+UnalignedStoreRepresentation const& UnalignedStoreRepresentationOf( |
+ Operator const* op) { |
+ DCHECK_EQ(IrOpcode::kUnalignedStore, op->opcode()); |
+ return OpParameter<UnalignedStoreRepresentation>(op); |
+} |
CheckedLoadRepresentation CheckedLoadRepresentationOf(Operator const* op) { |
DCHECK_EQ(IrOpcode::kCheckedLoad, op->opcode()); |
@@ -284,6 +294,14 @@ struct MachineOperatorGlobalCache { |
IrOpcode::kLoad, Operator::kNoThrow | Operator::kNoWrite, \ |
"Load", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \ |
}; \ |
+ struct UnalignedLoad##Type##Operator final \ |
+ : public Operator1<UnalignedLoadRepresentation> { \ |
+ UnalignedLoad##Type##Operator() \ |
+ : Operator1<UnalignedLoadRepresentation>( \ |
+ IrOpcode::kUnalignedLoad, \ |
+ Operator::kNoThrow | Operator::kNoWrite, "UnalignedLoad", 2, 1, \ |
+ 1, 1, 1, 0, MachineType::Type()) {} \ |
+ }; \ |
struct CheckedLoad##Type##Operator final \ |
: public Operator1<CheckedLoadRepresentation> { \ |
CheckedLoad##Type##Operator() \ |
@@ -292,6 +310,7 @@ struct MachineOperatorGlobalCache { |
"CheckedLoad", 3, 1, 1, 1, 1, 0, MachineType::Type()) {} \ |
}; \ |
Load##Type##Operator kLoad##Type; \ |
+ UnalignedLoad##Type##Operator kUnalignedLoad##Type; \ |
CheckedLoad##Type##Operator kCheckedLoad##Type; |
MACHINE_TYPE_LIST(LOAD) |
#undef LOAD |
@@ -337,6 +356,14 @@ struct MachineOperatorGlobalCache { |
Store##Type##FullWriteBarrier##Operator() \ |
: Store##Type##Operator(kFullWriteBarrier) {} \ |
}; \ |
+ struct UnalignedStore##Type##Operator final \ |
+ : public Operator1<UnalignedStoreRepresentation> { \ |
+ UnalignedStore##Type##Operator() \ |
+ : Operator1<UnalignedStoreRepresentation>( \ |
+ IrOpcode::kUnalignedStore, \ |
+ Operator::kNoRead | Operator::kNoThrow, "UnalignedStore", 3, 1, \ |
+ 1, 0, 1, 0, MachineRepresentation::Type) {} \ |
+ }; \ |
struct CheckedStore##Type##Operator final \ |
: public Operator1<CheckedStoreRepresentation> { \ |
CheckedStore##Type##Operator() \ |
@@ -350,6 +377,7 @@ struct MachineOperatorGlobalCache { |
Store##Type##PointerWriteBarrier##Operator \ |
kStore##Type##PointerWriteBarrier; \ |
Store##Type##FullWriteBarrier##Operator kStore##Type##FullWriteBarrier; \ |
+ UnalignedStore##Type##Operator kUnalignedStore##Type; \ |
CheckedStore##Type##Operator kCheckedStore##Type; |
MACHINE_REPRESENTATION_LIST(STORE) |
#undef STORE |
@@ -444,6 +472,35 @@ const Operator* MachineOperatorBuilder::Store(StoreRepresentation store_rep) { |
return nullptr; |
} |
+const OptionalOperator MachineOperatorBuilder::UnalignedLoad( |
+ UnalignedLoadRepresentation rep) { |
+#define LOAD(Type) \ |
+ if (rep == MachineType::Type()) { \ |
+ return OptionalOperator( \ |
+ flags_ & kUnalignedLoad ? &cache_.kUnalignedLoad##Type : nullptr); \ |
+ } |
+ MACHINE_TYPE_LIST(LOAD) |
+#undef LOAD |
+ UNREACHABLE(); |
+ return OptionalOperator(nullptr); |
+} |
+ |
+const OptionalOperator MachineOperatorBuilder::UnalignedStore( |
+ UnalignedStoreRepresentation rep) { |
+ switch (rep) { |
+#define STORE(kRep) \ |
+ case MachineRepresentation::kRep: \ |
+ return OptionalOperator( \ |
+ flags_ & kUnalignedStore ? &cache_.kUnalignedStore##kRep : nullptr); |
+ MACHINE_REPRESENTATION_LIST(STORE) |
+#undef STORE |
+ case MachineRepresentation::kBit: |
+ case MachineRepresentation::kNone: |
+ break; |
+ } |
+ UNREACHABLE(); |
+ return OptionalOperator(nullptr); |
+} |
const Operator* MachineOperatorBuilder::CheckedLoad( |
CheckedLoadRepresentation rep) { |