| Index: src/compiler/machine-operator.cc
|
| diff --git a/src/compiler/machine-operator.cc b/src/compiler/machine-operator.cc
|
| index c49e2ae878ee9d21e94098fcd85141722e27e328..0f5a251d3f87b6e55b110cdd414f1a968a4ee301 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,33 @@ MachineOperatorBuilder::MachineOperatorBuilder(
|
| word == MachineRepresentation::kWord64);
|
| }
|
|
|
| +const Operator* MachineOperatorBuilder::UnalignedLoad(
|
| + UnalignedLoadRepresentation rep) {
|
| +#define LOAD(Type) \
|
| + if (rep == MachineType::Type()) { \
|
| + return &cache_.kUnalignedLoad##Type; \
|
| + }
|
| + MACHINE_TYPE_LIST(LOAD)
|
| +#undef LOAD
|
| + UNREACHABLE();
|
| + return nullptr;
|
| +}
|
| +
|
| +const Operator* MachineOperatorBuilder::UnalignedStore(
|
| + UnalignedStoreRepresentation rep) {
|
| + switch (rep) {
|
| +#define STORE(kRep) \
|
| + case MachineRepresentation::kRep: \
|
| + return &cache_.kUnalignedStore##kRep;
|
| + MACHINE_REPRESENTATION_LIST(STORE)
|
| +#undef STORE
|
| + case MachineRepresentation::kBit:
|
| + case MachineRepresentation::kNone:
|
| + break;
|
| + }
|
| + UNREACHABLE();
|
| + return nullptr;
|
| +}
|
|
|
| #define PURE(Name, properties, value_input_count, control_input_count, \
|
| output_count) \
|
|
|