Index: src/compiler/machine-operator.cc |
diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc |
index c49e2ae878ee9d21e94098fcd85141722e27e328..930e4d4c61f5a0d0b77482184020088439b21ede 100644 |
--- a/src/compiler/machine-operator.cc |
+++ b/src/compiler/machine-operator.cc |
@@ -46,6 +46,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()); |
@@ -469,6 +479,14 @@ struct MachineOperatorGlobalCache { |
Operator::kNoDeopt | 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::kNoDeopt | Operator::kNoThrow | Operator::kNoWrite, \ |
+ "UnalignedLoad", 2, 1, 1, 1, 1, 0, MachineType::Type()) {} \ |
+ }; \ |
struct CheckedLoad##Type##Operator final \ |
: public Operator1<CheckedLoadRepresentation> { \ |
CheckedLoad##Type##Operator() \ |
@@ -478,6 +496,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 |
@@ -525,6 +544,15 @@ 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::kNoDeopt | Operator::kNoRead | Operator::kNoThrow, \ |
+ "UnalignedStore", 3, 1, 1, 0, 1, 0, \ |
+ MachineRepresentation::Type) {} \ |
+ }; \ |
struct CheckedStore##Type##Operator final \ |
: public Operator1<CheckedStoreRepresentation> { \ |
CheckedStore##Type##Operator() \ |
@@ -539,6 +567,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 |
@@ -598,6 +627,35 @@ MachineOperatorBuilder::MachineOperatorBuilder( |
word == MachineRepresentation::kWord64); |
} |
+const OptionalOperator MachineOperatorBuilder::UnalignedLoad( |
+ UnalignedLoadRepresentation rep) { |
+#define LOAD(Type) \ |
+ if (rep == MachineType::Type()) { \ |
+ return OptionalOperator(flags_ & kUnalignedLoad, \ |
+ &cache_.kUnalignedLoad##Type); \ |
+ } |
+ MACHINE_TYPE_LIST(LOAD) |
+#undef LOAD |
+ UNREACHABLE(); |
+ return OptionalOperator(false, nullptr); |
+} |
+ |
+const OptionalOperator MachineOperatorBuilder::UnalignedStore( |
+ UnalignedStoreRepresentation rep) { |
+ switch (rep) { |
+#define STORE(kRep) \ |
+ case MachineRepresentation::kRep: \ |
+ return OptionalOperator(flags_ & kUnalignedStore, \ |
+ &cache_.kUnalignedStore##kRep); |
+ MACHINE_REPRESENTATION_LIST(STORE) |
+#undef STORE |
+ case MachineRepresentation::kBit: |
+ case MachineRepresentation::kNone: |
+ break; |
+ } |
+ UNREACHABLE(); |
+ return OptionalOperator(false, nullptr); |
+} |
#define PURE(Name, properties, value_input_count, control_input_count, \ |
output_count) \ |