| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/compiler/operator.h" |
| |
| #include <limits> |
| |
| namespace v8 { |
| namespace internal { |
| namespace compiler { |
| |
| namespace { |
| |
| template <typename N> |
| V8_INLINE N CheckRange(size_t val) { |
| // The getters on Operator for input and output counts currently return int. |
| // Thus check that the given value fits in the integer range. |
| // TODO(titzer): Remove this check once the getters return size_t. |
| CHECK_LE(val, std::min(static_cast<size_t>(std::numeric_limits<N>::max()), |
| static_cast<size_t>(kMaxInt))); |
| return static_cast<N>(val); |
| } |
| |
| } // namespace |
| |
| Operator::Operator(Opcode opcode, Properties properties, const char* mnemonic, |
| size_t value_in, size_t effect_in, size_t control_in, |
| size_t value_out, size_t effect_out, size_t control_out) |
| : mnemonic_(mnemonic), |
| opcode_(opcode), |
| properties_(properties), |
| value_in_(CheckRange<uint32_t>(value_in)), |
| effect_in_(CheckRange<uint32_t>(effect_in)), |
| control_in_(CheckRange<uint32_t>(control_in)), |
| value_out_(CheckRange<uint32_t>(value_out)), |
| effect_out_(CheckRange<uint8_t>(effect_out)), |
| control_out_(CheckRange<uint32_t>(control_out)) {} |
| |
| std::ostream& operator<<(std::ostream& os, const Operator& op) { |
| op.PrintTo(os); |
| return os; |
| } |
| |
| void Operator::PrintToImpl(std::ostream& os, PrintVerbosity verbose) const { |
| os << mnemonic(); |
| } |
| |
| void Operator::PrintPropsTo(std::ostream& os) const { |
| std::string separator = ""; |
| |
| #define PRINT_PROP_IF_SET(name) \ |
| if (HasProperty(Operator::k##name)) { \ |
| os << separator; \ |
| os << #name; \ |
| separator = ", "; \ |
| } |
| OPERATOR_PROPERTY_LIST(PRINT_PROP_IF_SET) |
| #undef PRINT_PROP_IF_SET |
| } |
| |
| } // namespace compiler |
| } // namespace internal |
| } // namespace v8 |