OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #ifndef V8_COMPILER_MACHINE_OPERATOR_H_ | 5 #ifndef V8_COMPILER_MACHINE_OPERATOR_H_ |
6 #define V8_COMPILER_MACHINE_OPERATOR_H_ | 6 #define V8_COMPILER_MACHINE_OPERATOR_H_ |
7 | 7 |
8 #include "src/base/flags.h" | 8 #include "src/base/flags.h" |
9 #include "src/compiler/machine-type.h" | 9 #include "src/compiler/machine-type.h" |
10 | 10 |
11 namespace v8 { | 11 namespace v8 { |
12 namespace internal { | 12 namespace internal { |
13 namespace compiler { | 13 namespace compiler { |
14 | 14 |
15 // Forward declarations. | 15 // Forward declarations. |
16 struct MachineOperatorGlobalCache; | 16 struct MachineOperatorGlobalCache; |
17 class Operator; | 17 class Operator; |
18 | 18 |
| 19 |
19 // For operators that are not supported on all platforms. | 20 // For operators that are not supported on all platforms. |
20 class OptionalOperator { | 21 class OptionalOperator final { |
21 public: | 22 public: |
22 explicit OptionalOperator(const Operator* op) : op_(op) {} | 23 explicit OptionalOperator(const Operator* op) : op_(op) {} |
23 | 24 |
24 bool IsSupported() const { return op_ != nullptr; } | 25 bool IsSupported() const { return op_ != nullptr; } |
25 const Operator* op() const { | 26 const Operator* op() const { |
26 DCHECK_NOT_NULL(op_); | 27 DCHECK_NOT_NULL(op_); |
27 return op_; | 28 return op_; |
28 } | 29 } |
29 | 30 |
30 private: | 31 private: |
31 const Operator* op_; | 32 const Operator* const op_; |
32 }; | 33 }; |
33 | 34 |
| 35 |
| 36 // Supported float64 to int32 truncation modes. |
| 37 enum class TruncationMode : uint8_t { |
| 38 kJavaScript, // ES6 section 7.1.5 |
| 39 kRoundToZero // Round towards zero. Implementation defined for NaN and ovf. |
| 40 }; |
| 41 |
| 42 V8_INLINE size_t hash_value(TruncationMode mode) { |
| 43 return static_cast<uint8_t>(mode); |
| 44 } |
| 45 |
| 46 std::ostream& operator<<(std::ostream&, TruncationMode); |
| 47 |
| 48 TruncationMode TruncationModeOf(Operator const*); |
| 49 |
| 50 |
34 // Supported write barrier modes. | 51 // Supported write barrier modes. |
35 enum WriteBarrierKind { kNoWriteBarrier, kFullWriteBarrier }; | 52 enum WriteBarrierKind { kNoWriteBarrier, kFullWriteBarrier }; |
36 | 53 |
37 std::ostream& operator<<(std::ostream& os, WriteBarrierKind); | 54 std::ostream& operator<<(std::ostream& os, WriteBarrierKind); |
38 | 55 |
39 | 56 |
40 // A Load needs a MachineType. | 57 // A Load needs a MachineType. |
41 typedef MachineType LoadRepresentation; | 58 typedef MachineType LoadRepresentation; |
42 | 59 |
43 | 60 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 const Operator* ChangeFloat64ToInt32(); // narrowing | 185 const Operator* ChangeFloat64ToInt32(); // narrowing |
169 const Operator* ChangeFloat64ToUint32(); // narrowing | 186 const Operator* ChangeFloat64ToUint32(); // narrowing |
170 const Operator* ChangeInt32ToFloat64(); | 187 const Operator* ChangeInt32ToFloat64(); |
171 const Operator* ChangeInt32ToInt64(); | 188 const Operator* ChangeInt32ToInt64(); |
172 const Operator* ChangeUint32ToFloat64(); | 189 const Operator* ChangeUint32ToFloat64(); |
173 const Operator* ChangeUint32ToUint64(); | 190 const Operator* ChangeUint32ToUint64(); |
174 | 191 |
175 // These operators truncate numbers, both changing the representation of | 192 // These operators truncate numbers, both changing the representation of |
176 // the number and mapping multiple input values onto the same output value. | 193 // the number and mapping multiple input values onto the same output value. |
177 const Operator* TruncateFloat64ToFloat32(); | 194 const Operator* TruncateFloat64ToFloat32(); |
178 const Operator* TruncateFloat64ToInt32(); // JavaScript semantics. | 195 const Operator* TruncateFloat64ToInt32(TruncationMode); |
179 const Operator* TruncateInt64ToInt32(); | 196 const Operator* TruncateInt64ToInt32(); |
180 | 197 |
181 // Floating point operators always operate with IEEE 754 round-to-nearest | 198 // Floating point operators always operate with IEEE 754 round-to-nearest |
182 // (single-precision). | 199 // (single-precision). |
183 const Operator* Float32Add(); | 200 const Operator* Float32Add(); |
184 const Operator* Float32Sub(); | 201 const Operator* Float32Sub(); |
185 const Operator* Float32Mul(); | 202 const Operator* Float32Mul(); |
186 const Operator* Float32Div(); | 203 const Operator* Float32Div(); |
187 const Operator* Float32Sqrt(); | 204 const Operator* Float32Sqrt(); |
188 | 205 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 }; | 306 }; |
290 | 307 |
291 | 308 |
292 DEFINE_OPERATORS_FOR_FLAGS(MachineOperatorBuilder::Flags) | 309 DEFINE_OPERATORS_FOR_FLAGS(MachineOperatorBuilder::Flags) |
293 | 310 |
294 } // namespace compiler | 311 } // namespace compiler |
295 } // namespace internal | 312 } // namespace internal |
296 } // namespace v8 | 313 } // namespace v8 |
297 | 314 |
298 #endif // V8_COMPILER_MACHINE_OPERATOR_H_ | 315 #endif // V8_COMPILER_MACHINE_OPERATOR_H_ |
OLD | NEW |