Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
| 6 | 6 |
| 7 #include "src/assembler.h" | 7 #include "src/assembler.h" |
| 8 #include "src/base/lazy-instance.h" | 8 #include "src/base/lazy-instance.h" |
| 9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
| 10 #include "src/compiler/opcodes.h" | 10 #include "src/compiler/opcodes.h" |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 164 | 164 |
| 165 size_t hash_value(RelocatablePtrConstantInfo const& p) { | 165 size_t hash_value(RelocatablePtrConstantInfo const& p) { |
| 166 return base::hash_combine(p.value(), p.rmode(), p.type()); | 166 return base::hash_combine(p.value(), p.rmode(), p.type()); |
| 167 } | 167 } |
| 168 | 168 |
| 169 std::ostream& operator<<(std::ostream& os, | 169 std::ostream& operator<<(std::ostream& os, |
| 170 RelocatablePtrConstantInfo const& p) { | 170 RelocatablePtrConstantInfo const& p) { |
| 171 return os << p.value() << "|" << p.rmode() << "|" << p.type(); | 171 return os << p.value() << "|" << p.rmode() << "|" << p.type(); |
| 172 } | 172 } |
| 173 | 173 |
| 174 bool operator==(TypedStateValueInfo const& lhs, | |
| 175 TypedStateValueInfo const& rhs) { | |
| 176 return lhs.machine_types() == rhs.machine_types() && lhs.mask() == rhs.mask(); | |
| 177 } | |
| 178 | |
| 179 bool operator!=(TypedStateValueInfo const& lhs, | |
| 180 TypedStateValueInfo const& rhs) { | |
| 181 return !(lhs == rhs); | |
| 182 } | |
| 183 | |
| 184 size_t hash_value(TypedStateValueInfo const& p) { | |
| 185 return base::hash_combine(p.machine_types(), p.mask()); | |
| 186 } | |
| 187 | |
| 188 std::ostream& operator<<(std::ostream& os, TypedStateValueInfo const& p) { | |
| 189 return os << p.machine_types() << "|" << p.mask(); | |
|
Jarin
2016/12/07 08:56:20
Please update the printing to print something huma
Leszek Swirski
2016/12/08 15:44:30
Done.
| |
| 190 } | |
| 191 | |
| 174 size_t hash_value(RegionObservability observability) { | 192 size_t hash_value(RegionObservability observability) { |
| 175 return static_cast<size_t>(observability); | 193 return static_cast<size_t>(observability); |
| 176 } | 194 } |
| 177 | 195 |
| 178 std::ostream& operator<<(std::ostream& os, RegionObservability observability) { | 196 std::ostream& operator<<(std::ostream& os, RegionObservability observability) { |
| 179 switch (observability) { | 197 switch (observability) { |
| 180 case RegionObservability::kObservable: | 198 case RegionObservability::kObservable: |
| 181 return os << "observable"; | 199 return os << "observable"; |
| 182 case RegionObservability::kNotObservable: | 200 case RegionObservability::kNotObservable: |
| 183 return os << "not-observable"; | 201 return os << "not-observable"; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 231 } | 249 } |
| 232 | 250 |
| 233 OsrGuardType OsrGuardTypeOf(Operator const* op) { | 251 OsrGuardType OsrGuardTypeOf(Operator const* op) { |
| 234 DCHECK_EQ(IrOpcode::kOsrGuard, op->opcode()); | 252 DCHECK_EQ(IrOpcode::kOsrGuard, op->opcode()); |
| 235 return OpParameter<OsrGuardType>(op); | 253 return OpParameter<OsrGuardType>(op); |
| 236 } | 254 } |
| 237 | 255 |
| 238 ZoneVector<MachineType> const* MachineTypesOf(Operator const* op) { | 256 ZoneVector<MachineType> const* MachineTypesOf(Operator const* op) { |
| 239 DCHECK(op->opcode() == IrOpcode::kTypedObjectState || | 257 DCHECK(op->opcode() == IrOpcode::kTypedObjectState || |
| 240 op->opcode() == IrOpcode::kTypedStateValues); | 258 op->opcode() == IrOpcode::kTypedStateValues); |
| 259 | |
| 260 if (op->opcode() == IrOpcode::kTypedStateValues) { | |
| 261 return OpParameter<TypedStateValueInfo>(op).machine_types(); | |
| 262 } | |
| 241 return OpParameter<const ZoneVector<MachineType>*>(op); | 263 return OpParameter<const ZoneVector<MachineType>*>(op); |
| 242 } | 264 } |
| 243 | 265 |
| 244 #define CACHED_OP_LIST(V) \ | 266 #define CACHED_OP_LIST(V) \ |
| 245 V(Dead, Operator::kFoldable, 0, 0, 0, 1, 1, 1) \ | 267 V(Dead, Operator::kFoldable, 0, 0, 0, 1, 1, 1) \ |
| 246 V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 268 V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 247 V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 269 V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 248 V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 270 V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| 249 V(IfException, Operator::kKontrol, 0, 1, 1, 1, 1, 1) \ | 271 V(IfException, Operator::kKontrol, 0, 1, 1, 1, 1, 1) \ |
| 250 V(IfDefault, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ | 272 V(IfDefault, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 581 "Projection", // name | 603 "Projection", // name |
| 582 1, 0, 1, 1, 0, 0, // counts, | 604 1, 0, 1, 1, 0, 0, // counts, |
| 583 kIndex) {} // parameter | 605 kIndex) {} // parameter |
| 584 }; | 606 }; |
| 585 #define CACHED_PROJECTION(index) \ | 607 #define CACHED_PROJECTION(index) \ |
| 586 ProjectionOperator<index> kProjection##index##Operator; | 608 ProjectionOperator<index> kProjection##index##Operator; |
| 587 CACHED_PROJECTION_LIST(CACHED_PROJECTION) | 609 CACHED_PROJECTION_LIST(CACHED_PROJECTION) |
| 588 #undef CACHED_PROJECTION | 610 #undef CACHED_PROJECTION |
| 589 | 611 |
| 590 template <int kInputCount> | 612 template <int kInputCount> |
| 591 struct StateValuesOperator final : public Operator { | 613 struct StateValuesOperator final : public Operator1<uint32_t> { |
|
Jarin
2016/12/07 08:56:19
To get a good printing, it would be better to intr
Leszek Swirski
2016/12/08 15:44:30
Done.
| |
| 592 StateValuesOperator() | 614 StateValuesOperator() |
| 593 : Operator( // -- | 615 : Operator1<uint32_t>( // -- |
| 594 IrOpcode::kStateValues, // opcode | 616 IrOpcode::kStateValues, // opcode |
| 595 Operator::kPure, // flags | 617 Operator::kPure, // flags |
| 596 "StateValues", // name | 618 "StateValues", // name |
| 597 kInputCount, 0, 0, 1, 0, 0) {} // counts | 619 kInputCount, 0, 0, 1, 0, 0, // counts |
| 620 0) {} // parameter | |
| 598 }; | 621 }; |
| 599 #define CACHED_STATE_VALUES(input_count) \ | 622 #define CACHED_STATE_VALUES(input_count) \ |
| 600 StateValuesOperator<input_count> kStateValues##input_count##Operator; | 623 StateValuesOperator<input_count> kStateValues##input_count##Operator; |
| 601 CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES) | 624 CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES) |
| 602 #undef CACHED_STATE_VALUES | 625 #undef CACHED_STATE_VALUES |
| 603 }; | 626 }; |
| 604 | 627 |
| 605 | 628 |
| 606 static base::LazyInstance<CommonOperatorGlobalCache>::type kCache = | 629 static base::LazyInstance<CommonOperatorGlobalCache>::type kCache = |
| 607 LAZY_INSTANCE_INITIALIZER; | 630 LAZY_INSTANCE_INITIALIZER; |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 993 switch (region_observability) { | 1016 switch (region_observability) { |
| 994 case RegionObservability::kObservable: | 1017 case RegionObservability::kObservable: |
| 995 return &cache_.kBeginRegionObservableOperator; | 1018 return &cache_.kBeginRegionObservableOperator; |
| 996 case RegionObservability::kNotObservable: | 1019 case RegionObservability::kNotObservable: |
| 997 return &cache_.kBeginRegionNotObservableOperator; | 1020 return &cache_.kBeginRegionNotObservableOperator; |
| 998 } | 1021 } |
| 999 UNREACHABLE(); | 1022 UNREACHABLE(); |
| 1000 return nullptr; | 1023 return nullptr; |
| 1001 } | 1024 } |
| 1002 | 1025 |
| 1003 const Operator* CommonOperatorBuilder::StateValues(int arguments) { | 1026 const Operator* CommonOperatorBuilder::StateValues(int arguments, |
| 1004 switch (arguments) { | 1027 uint32_t bitmask) { |
| 1028 if (bitmask == 0) { | |
| 1029 switch (arguments) { | |
| 1005 #define CACHED_STATE_VALUES(arguments) \ | 1030 #define CACHED_STATE_VALUES(arguments) \ |
| 1006 case arguments: \ | 1031 case arguments: \ |
| 1007 return &cache_.kStateValues##arguments##Operator; | 1032 return &cache_.kStateValues##arguments##Operator; |
| 1008 CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES) | 1033 CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES) |
| 1009 #undef CACHED_STATE_VALUES | 1034 #undef CACHED_STATE_VALUES |
| 1010 default: | 1035 default: |
| 1011 break; | 1036 break; |
| 1037 } | |
| 1012 } | 1038 } |
| 1039 | |
| 1013 // Uncached. | 1040 // Uncached. |
| 1014 return new (zone()) Operator( // -- | 1041 return new (zone()) Operator1<uint32_t>( // -- |
| 1015 IrOpcode::kStateValues, Operator::kPure, // opcode | 1042 IrOpcode::kStateValues, Operator::kPure, // opcode |
| 1016 "StateValues", // name | 1043 "StateValues", // name |
| 1017 arguments, 0, 0, 1, 0, 0); // counts | 1044 arguments, 0, 0, 1, 0, 0, // counts |
| 1045 bitmask); // parameter | |
| 1018 } | 1046 } |
| 1019 | 1047 |
| 1020 const Operator* CommonOperatorBuilder::TypedStateValues( | 1048 const Operator* CommonOperatorBuilder::TypedStateValues( |
| 1021 const ZoneVector<MachineType>* types) { | 1049 const ZoneVector<MachineType>* types, uint32_t bitmask) { |
| 1022 return new (zone()) Operator1<const ZoneVector<MachineType>*>( // -- | 1050 return new (zone()) Operator1<TypedStateValueInfo>( // -- |
| 1023 IrOpcode::kTypedStateValues, Operator::kPure, // opcode | 1051 IrOpcode::kTypedStateValues, Operator::kPure, // opcode |
| 1024 "TypedStateValues", // name | 1052 "TypedStateValues", // name |
| 1025 static_cast<int>(types->size()), 0, 0, 1, 0, 0, // counts | 1053 static_cast<int>(types->size()), 0, 0, 1, 0, 0, // counts |
| 1026 types); // parameter | 1054 TypedStateValueInfo(types, bitmask)); // parameters |
| 1027 } | 1055 } |
| 1028 | 1056 |
| 1029 const Operator* CommonOperatorBuilder::ObjectState(int pointer_slots) { | 1057 const Operator* CommonOperatorBuilder::ObjectState(int pointer_slots) { |
| 1030 return new (zone()) Operator1<int>( // -- | 1058 return new (zone()) Operator1<int>( // -- |
| 1031 IrOpcode::kObjectState, Operator::kPure, // opcode | 1059 IrOpcode::kObjectState, Operator::kPure, // opcode |
| 1032 "ObjectState", // name | 1060 "ObjectState", // name |
| 1033 pointer_slots, 0, 0, 1, 0, 0, // counts | 1061 pointer_slots, 0, 0, 1, 0, 0, // counts |
| 1034 pointer_slots); // parameter | 1062 pointer_slots); // parameter |
| 1035 } | 1063 } |
| 1036 | 1064 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1136 CommonOperatorBuilder::CreateFrameStateFunctionInfo( | 1164 CommonOperatorBuilder::CreateFrameStateFunctionInfo( |
| 1137 FrameStateType type, int parameter_count, int local_count, | 1165 FrameStateType type, int parameter_count, int local_count, |
| 1138 Handle<SharedFunctionInfo> shared_info) { | 1166 Handle<SharedFunctionInfo> shared_info) { |
| 1139 return new (zone()->New(sizeof(FrameStateFunctionInfo))) | 1167 return new (zone()->New(sizeof(FrameStateFunctionInfo))) |
| 1140 FrameStateFunctionInfo(type, parameter_count, local_count, shared_info); | 1168 FrameStateFunctionInfo(type, parameter_count, local_count, shared_info); |
| 1141 } | 1169 } |
| 1142 | 1170 |
| 1143 } // namespace compiler | 1171 } // namespace compiler |
| 1144 } // namespace internal | 1172 } // namespace internal |
| 1145 } // namespace v8 | 1173 } // namespace v8 |
| OLD | NEW |