Commit 443e37ac authored by Jakob Gruber's avatar Jakob Gruber Committed by Commit Bot

[compiler] Refactor opcode macro lists

This extends the opcode macro lists to include both the long name
(e.g.: JSAdd) and short name (Add) to reduce duplication. The change
is only for JS operators for now but can be extended to others in the
future.

Drive-by: Base more predicates off the macro lists for robustness.

Bug: v8:8888
Change-Id: I10debdf86166dbe9dac63a6df57938820a8af8d0
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2255468
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: 's avatarGeorg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68477}
parent 5b5a5192
...@@ -43,10 +43,10 @@ JSGenericLowering::~JSGenericLowering() = default; ...@@ -43,10 +43,10 @@ JSGenericLowering::~JSGenericLowering() = default;
Reduction JSGenericLowering::Reduce(Node* node) { Reduction JSGenericLowering::Reduce(Node* node) {
switch (node->opcode()) { switch (node->opcode()) {
#define DECLARE_CASE(x) \ #define DECLARE_CASE(x, ...) \
case IrOpcode::k##x: \ case IrOpcode::k##x: \
Lower##x(node); \ Lower##x(node); \
break; break;
JS_OP_LIST(DECLARE_CASE) JS_OP_LIST(DECLARE_CASE)
#undef DECLARE_CASE #undef DECLARE_CASE
default: default:
...@@ -123,10 +123,7 @@ void JSGenericLowering::ReplaceWithRuntimeCall(Node* node, ...@@ -123,10 +123,7 @@ void JSGenericLowering::ReplaceWithRuntimeCall(Node* node,
void JSGenericLowering::ReplaceUnaryOpWithBuiltinCall( void JSGenericLowering::ReplaceUnaryOpWithBuiltinCall(
Node* node, Builtins::Name builtin_without_feedback, Node* node, Builtins::Name builtin_without_feedback,
Builtins::Name builtin_with_feedback) { Builtins::Name builtin_with_feedback) {
DCHECK(node->opcode() == IrOpcode::kJSBitwiseNot || DCHECK(JSOperator::IsUnaryWithFeedback(node->opcode()));
node->opcode() == IrOpcode::kJSDecrement ||
node->opcode() == IrOpcode::kJSIncrement ||
node->opcode() == IrOpcode::kJSNegate);
const FeedbackParameter& p = FeedbackParameterOf(node->op()); const FeedbackParameter& p = FeedbackParameterOf(node->op());
if (CollectFeedbackInGenericLowering() && p.feedback().IsValid()) { if (CollectFeedbackInGenericLowering() && p.feedback().IsValid()) {
Callable callable = Builtins::CallableFor(isolate(), builtin_with_feedback); Callable callable = Builtins::CallableFor(isolate(), builtin_with_feedback);
...@@ -163,23 +160,7 @@ DEF_UNARY_LOWERING(Negate) ...@@ -163,23 +160,7 @@ DEF_UNARY_LOWERING(Negate)
void JSGenericLowering::ReplaceBinaryOrCompareOpWithBuiltinCall( void JSGenericLowering::ReplaceBinaryOrCompareOpWithBuiltinCall(
Node* node, Builtins::Name builtin_without_feedback, Node* node, Builtins::Name builtin_without_feedback,
Builtins::Name builtin_with_feedback) { Builtins::Name builtin_with_feedback) {
DCHECK(node->opcode() == IrOpcode::kJSAdd || DCHECK(JSOperator::IsBinaryWithFeedback(node->opcode()));
node->opcode() == IrOpcode::kJSBitwiseAnd ||
node->opcode() == IrOpcode::kJSBitwiseOr ||
node->opcode() == IrOpcode::kJSBitwiseXor ||
node->opcode() == IrOpcode::kJSDivide ||
node->opcode() == IrOpcode::kJSEqual ||
node->opcode() == IrOpcode::kJSExponentiate ||
node->opcode() == IrOpcode::kJSGreaterThan ||
node->opcode() == IrOpcode::kJSGreaterThanOrEqual ||
node->opcode() == IrOpcode::kJSLessThan ||
node->opcode() == IrOpcode::kJSLessThanOrEqual ||
node->opcode() == IrOpcode::kJSModulus ||
node->opcode() == IrOpcode::kJSMultiply ||
node->opcode() == IrOpcode::kJSShiftLeft ||
node->opcode() == IrOpcode::kJSShiftRight ||
node->opcode() == IrOpcode::kJSShiftRightLogical ||
node->opcode() == IrOpcode::kJSSubtract);
Builtins::Name builtin_id; Builtins::Name builtin_id;
const FeedbackParameter& p = FeedbackParameterOf(node->op()); const FeedbackParameter& p = FeedbackParameterOf(node->op());
if (CollectFeedbackInGenericLowering() && p.feedback().IsValid()) { if (CollectFeedbackInGenericLowering() && p.feedback().IsValid()) {
......
...@@ -31,7 +31,7 @@ class JSGenericLowering final : public AdvancedReducer { ...@@ -31,7 +31,7 @@ class JSGenericLowering final : public AdvancedReducer {
Reduction Reduce(Node* node) final; Reduction Reduce(Node* node) final;
protected: protected:
#define DECLARE_LOWER(x) void Lower##x(Node* node); #define DECLARE_LOWER(x, ...) void Lower##x(Node* node);
// Dispatched depending on opcode. // Dispatched depending on opcode.
JS_OP_LIST(DECLARE_LOWER) JS_OP_LIST(DECLARE_LOWER)
#undef DECLARE_LOWER #undef DECLARE_LOWER
......
...@@ -16,6 +16,17 @@ namespace v8 { ...@@ -16,6 +16,17 @@ namespace v8 {
namespace internal { namespace internal {
namespace compiler { namespace compiler {
namespace {
// Returns properties for the given binary op.
constexpr Operator::Properties BinopProperties(Operator::Opcode opcode) {
CONSTEXPR_DCHECK(JSOperator::IsBinaryWithFeedback(opcode));
return opcode == IrOpcode::kJSStrictEqual ? Operator::kPure
: Operator::kNoProperties;
}
} // namespace
std::ostream& operator<<(std::ostream& os, CallFrequency const& f) { std::ostream& operator<<(std::ostream& os, CallFrequency const& f) {
if (f.IsUnknown()) return os << "unknown"; if (f.IsUnknown()) return os << "unknown";
return os << f.value(); return os << f.value();
...@@ -224,46 +235,13 @@ std::ostream& operator<<(std::ostream& os, FeedbackParameter const& p) { ...@@ -224,46 +235,13 @@ std::ostream& operator<<(std::ostream& os, FeedbackParameter const& p) {
return os << p.feedback(); return os << p.feedback();
} }
#define UNARY_OP_LIST(V) \
V(BitwiseNot) \
V(Decrement) \
V(Increment) \
V(Negate)
#define BINARY_OP_LIST(V) \
V(Add) \
V(Subtract) \
V(Multiply) \
V(Divide) \
V(Modulus) \
V(Exponentiate) \
V(BitwiseOr) \
V(BitwiseXor) \
V(BitwiseAnd) \
V(ShiftLeft) \
V(ShiftRight) \
V(ShiftRightLogical)
#define COMPARE_OP_LIST(V) \
V(Equal, Operator::kNoProperties) \
V(StrictEqual, Operator::kPure) \
V(LessThan, Operator::kNoProperties) \
V(GreaterThan, Operator::kNoProperties) \
V(LessThanOrEqual, Operator::kNoProperties) \
V(GreaterThanOrEqual, Operator::kNoProperties)
FeedbackParameter const& FeedbackParameterOf(const Operator* op) { FeedbackParameter const& FeedbackParameterOf(const Operator* op) {
#define V(Name, ...) op->opcode() == IrOpcode::kJS##Name || DCHECK(JSOperator::IsUnaryWithFeedback(op->opcode()) ||
// clang-format off JSOperator::IsBinaryWithFeedback(op->opcode()) ||
DCHECK(UNARY_OP_LIST(V)
BINARY_OP_LIST(V)
COMPARE_OP_LIST(V)
op->opcode() == IrOpcode::kJSCreateEmptyLiteralArray || op->opcode() == IrOpcode::kJSCreateEmptyLiteralArray ||
op->opcode() == IrOpcode::kJSInstanceOf || op->opcode() == IrOpcode::kJSInstanceOf ||
op->opcode() == IrOpcode::kJSStoreDataPropertyInLiteral || op->opcode() == IrOpcode::kJSStoreDataPropertyInLiteral ||
op->opcode() == IrOpcode::kJSStoreInArrayLiteral); op->opcode() == IrOpcode::kJSStoreInArrayLiteral);
// clang-format on
#undef V
return OpParameter<FeedbackParameter>(op); return OpParameter<FeedbackParameter>(op);
} }
...@@ -732,36 +710,27 @@ JSOperatorBuilder::JSOperatorBuilder(Zone* zone) ...@@ -732,36 +710,27 @@ JSOperatorBuilder::JSOperatorBuilder(Zone* zone)
CACHED_OP_LIST(CACHED_OP) CACHED_OP_LIST(CACHED_OP)
#undef CACHED_OP #undef CACHED_OP
#define UNARY_OP(Name) \ #define UNARY_OP(JSName, Name) \
const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) { \ const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) { \
FeedbackParameter parameters(feedback); \ FeedbackParameter parameters(feedback); \
return new (zone()) Operator1<FeedbackParameter>( \ return new (zone()) Operator1<FeedbackParameter>( \
IrOpcode::kJS##Name, Operator::kNoProperties, "JS" #Name, 2, 1, 1, 1, \ IrOpcode::k##JSName, Operator::kNoProperties, #JSName, 2, 1, 1, 1, 1, \
1, 2, parameters); \ 2, parameters); \
} }
UNARY_OP_LIST(UNARY_OP) JS_UNOP_WITH_FEEDBACK(UNARY_OP)
#undef UNARY_OP #undef UNARY_OP
#define BINARY_OP(Name) \ #define BINARY_OP(JSName, Name) \
const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) { \ const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) { \
static constexpr auto kProperties = BinopProperties(IrOpcode::k##JSName); \
FeedbackParameter parameters(feedback); \ FeedbackParameter parameters(feedback); \
return new (zone()) Operator1<FeedbackParameter>( \ return new (zone()) Operator1<FeedbackParameter>( \
IrOpcode::kJS##Name, Operator::kNoProperties, "JS" #Name, 2, 1, 1, 1, \ IrOpcode::k##JSName, kProperties, #JSName, 2, 1, 1, 1, 1, \
1, 2, parameters); \ Operator::ZeroIfNoThrow(kProperties), parameters); \
} }
BINARY_OP_LIST(BINARY_OP) JS_BINOP_WITH_FEEDBACK(BINARY_OP)
#undef BINARY_OP #undef BINARY_OP
#define COMPARE_OP(Name, Properties) \
const Operator* JSOperatorBuilder::Name(FeedbackSource const& feedback) { \
FeedbackParameter parameters(feedback); \
return new (zone()) Operator1<FeedbackParameter>( \
IrOpcode::kJS##Name, Properties, "JS" #Name, 2, 1, 1, 1, 1, \
Operator::ZeroIfNoThrow(Properties), parameters); \
}
COMPARE_OP_LIST(COMPARE_OP)
#undef COMPARE_OP
const Operator* JSOperatorBuilder::StoreDataPropertyInLiteral( const Operator* JSOperatorBuilder::StoreDataPropertyInLiteral(
const FeedbackSource& feedback) { const FeedbackSource& feedback) {
FeedbackParameter parameters(feedback); FeedbackParameter parameters(feedback);
...@@ -1333,10 +1302,7 @@ Handle<ScopeInfo> ScopeInfoOf(const Operator* op) { ...@@ -1333,10 +1302,7 @@ Handle<ScopeInfo> ScopeInfoOf(const Operator* op) {
return OpParameter<Handle<ScopeInfo>>(op); return OpParameter<Handle<ScopeInfo>>(op);
} }
#undef UNARY_OP_LIST
#undef BINARY_OP_LIST
#undef CACHED_OP_LIST #undef CACHED_OP_LIST
#undef COMPARE_OP_LIST
} // namespace compiler } // namespace compiler
} // namespace internal } // namespace internal
......
...@@ -29,15 +29,52 @@ namespace compiler { ...@@ -29,15 +29,52 @@ namespace compiler {
class Operator; class Operator;
struct JSOperatorGlobalCache; struct JSOperatorGlobalCache;
// Macro lists.
#define JS_UNOP_WITH_FEEDBACK(V) \
JS_BITWISE_UNOP_LIST(V) \
JS_ARITH_UNOP_LIST(V)
#define JS_BINOP_WITH_FEEDBACK(V) \
JS_ARITH_BINOP_LIST(V) \
JS_BITWISE_BINOP_LIST(V) \
JS_COMPARE_BINOP_LIST(V)
// Predicates.
class JSOperator final : public AllStatic {
public:
static constexpr bool IsUnaryWithFeedback(Operator::Opcode opcode) {
#define CASE(Name, ...) \
case IrOpcode::k##Name: \
return true;
switch (opcode) {
JS_UNOP_WITH_FEEDBACK(CASE);
default:
return false;
}
#undef CASE
return false;
}
static constexpr bool IsBinaryWithFeedback(Operator::Opcode opcode) {
#define CASE(Name, ...) \
case IrOpcode::k##Name: \
return true;
switch (opcode) {
JS_BINOP_WITH_FEEDBACK(CASE);
default:
return false;
}
#undef CASE
return false;
}
};
// Node wrappers. // Node wrappers.
class JSUnaryOpNode final : public NodeWrapper { class JSUnaryOpNode final : public NodeWrapper {
public: public:
explicit constexpr JSUnaryOpNode(Node* node) : NodeWrapper(node) { explicit constexpr JSUnaryOpNode(Node* node) : NodeWrapper(node) {
CONSTEXPR_DCHECK(node->opcode() == IrOpcode::kJSBitwiseNot || CONSTEXPR_DCHECK(JSOperator::IsUnaryWithFeedback(node->opcode()));
node->opcode() == IrOpcode::kJSDecrement ||
node->opcode() == IrOpcode::kJSIncrement ||
node->opcode() == IrOpcode::kJSNegate);
} }
static constexpr int ValueIndex() { return 0; } static constexpr int ValueIndex() { return 0; }
......
...@@ -39,7 +39,7 @@ struct NodeMatcher { ...@@ -39,7 +39,7 @@ struct NodeMatcher {
bool IsComparison() const; bool IsComparison() const;
#define DEFINE_IS_OPCODE(Opcode) \ #define DEFINE_IS_OPCODE(Opcode, ...) \
bool Is##Opcode() const { return opcode() == IrOpcode::k##Opcode; } bool Is##Opcode() const { return opcode() == IrOpcode::k##Opcode; }
ALL_OP_LIST(DEFINE_IS_OPCODE) ALL_OP_LIST(DEFINE_IS_OPCODE)
#undef DEFINE_IS_OPCODE #undef DEFINE_IS_OPCODE
......
...@@ -16,7 +16,7 @@ namespace compiler { ...@@ -16,7 +16,7 @@ namespace compiler {
namespace { namespace {
char const* const kMnemonics[] = { char const* const kMnemonics[] = {
#define DECLARE_MNEMONIC(x) #x, #define DECLARE_MNEMONIC(x, ...) #x,
ALL_OP_LIST(DECLARE_MNEMONIC) ALL_OP_LIST(DECLARE_MNEMONIC)
#undef DECLARE_MNEMONIC #undef DECLARE_MNEMONIC
"UnknownOpcode"}; "UnknownOpcode"};
......
...@@ -85,29 +85,30 @@ ...@@ -85,29 +85,30 @@
V(StaticAssert) V(StaticAssert)
// Opcodes for JavaScript operators. // Opcodes for JavaScript operators.
#define JS_COMPARE_BINOP_LIST(V) \ // Arguments are JSName (the name with a 'JS' prefix), and Name.
V(JSEqual) \ #define JS_COMPARE_BINOP_LIST(V) \
V(JSStrictEqual) \ V(JSEqual, Equal) \
V(JSLessThan) \ V(JSStrictEqual, StrictEqual) \
V(JSGreaterThan) \ V(JSLessThan, LessThan) \
V(JSLessThanOrEqual) \ V(JSGreaterThan, GreaterThan) \
V(JSGreaterThanOrEqual) V(JSLessThanOrEqual, LessThanOrEqual) \
V(JSGreaterThanOrEqual, GreaterThanOrEqual)
#define JS_BITWISE_BINOP_LIST(V) \ #define JS_BITWISE_BINOP_LIST(V) \
V(JSBitwiseOr) \ V(JSBitwiseOr, BitwiseOr) \
V(JSBitwiseXor) \ V(JSBitwiseXor, BitwiseXor) \
V(JSBitwiseAnd) \ V(JSBitwiseAnd, BitwiseAnd) \
V(JSShiftLeft) \ V(JSShiftLeft, ShiftLeft) \
V(JSShiftRight) \ V(JSShiftRight, ShiftRight) \
V(JSShiftRightLogical) V(JSShiftRightLogical, ShiftRightLogical)
#define JS_ARITH_BINOP_LIST(V) \ #define JS_ARITH_BINOP_LIST(V) \
V(JSAdd) \ V(JSAdd, Add) \
V(JSSubtract) \ V(JSSubtract, Subtract) \
V(JSMultiply) \ V(JSMultiply, Multiply) \
V(JSDivide) \ V(JSDivide, Divide) \
V(JSModulus) \ V(JSModulus, Modulus) \
V(JSExponentiate) V(JSExponentiate, Exponentiate)
#define JS_SIMPLE_BINOP_LIST(V) \ #define JS_SIMPLE_BINOP_LIST(V) \
JS_COMPARE_BINOP_LIST(V) \ JS_COMPARE_BINOP_LIST(V) \
...@@ -127,12 +128,18 @@ ...@@ -127,12 +128,18 @@
V(JSToString) \ V(JSToString) \
V(JSParseInt) V(JSParseInt)
#define JS_BITWISE_UNOP_LIST(V) \
V(JSBitwiseNot, BitwiseNot) \
V(JSNegate, Negate)
#define JS_ARITH_UNOP_LIST(V) \
V(JSDecrement, Decrement) \
V(JSIncrement, Increment)
#define JS_SIMPLE_UNOP_LIST(V) \ #define JS_SIMPLE_UNOP_LIST(V) \
JS_CONVERSION_UNOP_LIST(V) \ JS_ARITH_UNOP_LIST(V) \
V(JSBitwiseNot) \ JS_BITWISE_UNOP_LIST(V) \
V(JSDecrement) \ JS_CONVERSION_UNOP_LIST(V)
V(JSIncrement) \
V(JSNegate)
#define JS_CREATE_OP_LIST(V) \ #define JS_CREATE_OP_LIST(V) \
V(JSCloneObject) \ V(JSCloneObject) \
...@@ -971,12 +978,12 @@ namespace compiler { ...@@ -971,12 +978,12 @@ namespace compiler {
class V8_EXPORT_PRIVATE IrOpcode { class V8_EXPORT_PRIVATE IrOpcode {
public: public:
enum Value { enum Value {
#define DECLARE_OPCODE(x) k##x, #define DECLARE_OPCODE(x, ...) k##x,
ALL_OP_LIST(DECLARE_OPCODE) ALL_OP_LIST(DECLARE_OPCODE)
#undef DECLARE_OPCODE #undef DECLARE_OPCODE
kLast = -1 kLast = -1
#define COUNT_OPCODE(x) +1 #define COUNT_OPCODE(...) +1
ALL_OP_LIST(COUNT_OPCODE) ALL_OP_LIST(COUNT_OPCODE)
#undef COUNT_OPCODE #undef COUNT_OPCODE
}; };
...@@ -1000,7 +1007,16 @@ class V8_EXPORT_PRIVATE IrOpcode { ...@@ -1000,7 +1007,16 @@ class V8_EXPORT_PRIVATE IrOpcode {
// Returns true if opcode for constant operator. // Returns true if opcode for constant operator.
static bool IsConstantOpcode(Value value) { static bool IsConstantOpcode(Value value) {
return kInt32Constant <= value && value <= kRelocatableInt64Constant; #define CASE(Name) \
case k##Name: \
return true;
switch (value) {
CONSTANT_OP_LIST(CASE);
default:
return false;
}
#undef CASE
UNREACHABLE();
} }
static bool IsPhiOpcode(Value value) { static bool IsPhiOpcode(Value value) {
...@@ -1015,8 +1031,9 @@ class V8_EXPORT_PRIVATE IrOpcode { ...@@ -1015,8 +1031,9 @@ class V8_EXPORT_PRIVATE IrOpcode {
return kIfTrue <= value && value <= kIfDefault; return kIfTrue <= value && value <= kIfDefault;
} }
// Returns true if opcode terminates control flow in a graph (i.e. respective // Returns true if opcode terminates control flow in a graph (i.e.
// nodes are expected to have control uses by the graphs {End} node only). // respective nodes are expected to have control uses by the graphs {End}
// node only).
static bool IsGraphTerminator(Value value) { static bool IsGraphTerminator(Value value) {
return value == kDeoptimize || value == kReturn || value == kTailCall || return value == kDeoptimize || value == kReturn || value == kTailCall ||
value == kTerminate || value == kThrow; value == kTerminate || value == kThrow;
...@@ -1029,9 +1046,18 @@ class V8_EXPORT_PRIVATE IrOpcode { ...@@ -1029,9 +1046,18 @@ class V8_EXPORT_PRIVATE IrOpcode {
// Returns true if opcode for comparison operator. // Returns true if opcode for comparison operator.
static bool IsComparisonOpcode(Value value) { static bool IsComparisonOpcode(Value value) {
return (kJSEqual <= value && value <= kJSGreaterThanOrEqual) || #define CASE(Name, ...) \
(kNumberEqual <= value && value <= kStringLessThanOrEqual) || case k##Name: \
(kWord32Equal <= value && value <= kFloat64LessThanOrEqual); return true;
switch (value) {
JS_COMPARE_BINOP_LIST(CASE);
SIMPLIFIED_COMPARE_BINOP_LIST(CASE);
MACHINE_COMPARE_BINOP_LIST(CASE);
default:
return false;
}
#undef CASE
UNREACHABLE();
} }
static bool IsContextChainExtendingOpcode(Value value) { static bool IsContextChainExtendingOpcode(Value value) {
......
...@@ -24,7 +24,7 @@ bool OperatorProperties::NeedsExactContext(const Operator* op) { ...@@ -24,7 +24,7 @@ bool OperatorProperties::NeedsExactContext(const Operator* op) {
DCHECK(HasContextInput(op)); DCHECK(HasContextInput(op));
IrOpcode::Value const opcode = static_cast<IrOpcode::Value>(op->opcode()); IrOpcode::Value const opcode = static_cast<IrOpcode::Value>(op->opcode());
switch (opcode) { switch (opcode) {
#define CASE(Name) case IrOpcode::k##Name: #define CASE(Name, ...) case IrOpcode::k##Name:
// Binary/unary operators, calls and constructor calls only // Binary/unary operators, calls and constructor calls only
// need the context to generate exceptions or lookup fields // need the context to generate exceptions or lookup fields
// on the native context, so passing any context is fine. // on the native context, so passing any context is fine.
......
...@@ -228,7 +228,7 @@ namespace { ...@@ -228,7 +228,7 @@ namespace {
bool IsPotentiallyThrowingCall(IrOpcode::Value opcode) { bool IsPotentiallyThrowingCall(IrOpcode::Value opcode) {
switch (opcode) { switch (opcode) {
#define BUILD_BLOCK_JS_CASE(Name) case IrOpcode::k##Name: #define BUILD_BLOCK_JS_CASE(Name, ...) case IrOpcode::k##Name:
JS_OP_LIST(BUILD_BLOCK_JS_CASE) JS_OP_LIST(BUILD_BLOCK_JS_CASE)
#undef BUILD_BLOCK_JS_CASE #undef BUILD_BLOCK_JS_CASE
case IrOpcode::kCall: case IrOpcode::kCall:
......
...@@ -354,7 +354,7 @@ class CFGBuilder : public ZoneObject { ...@@ -354,7 +354,7 @@ class CFGBuilder : public ZoneObject {
case IrOpcode::kSwitch: case IrOpcode::kSwitch:
BuildBlocksForSuccessors(node); BuildBlocksForSuccessors(node);
break; break;
#define BUILD_BLOCK_JS_CASE(Name) case IrOpcode::k##Name: #define BUILD_BLOCK_JS_CASE(Name, ...) case IrOpcode::k##Name:
JS_OP_LIST(BUILD_BLOCK_JS_CASE) JS_OP_LIST(BUILD_BLOCK_JS_CASE)
// JS opcodes are just like calls => fall through. // JS opcodes are just like calls => fall through.
#undef BUILD_BLOCK_JS_CASE #undef BUILD_BLOCK_JS_CASE
...@@ -398,7 +398,7 @@ class CFGBuilder : public ZoneObject { ...@@ -398,7 +398,7 @@ class CFGBuilder : public ZoneObject {
scheduler_->UpdatePlacement(node, Scheduler::kFixed); scheduler_->UpdatePlacement(node, Scheduler::kFixed);
ConnectThrow(node); ConnectThrow(node);
break; break;
#define CONNECT_BLOCK_JS_CASE(Name) case IrOpcode::k##Name: #define CONNECT_BLOCK_JS_CASE(Name, ...) case IrOpcode::k##Name:
JS_OP_LIST(CONNECT_BLOCK_JS_CASE) JS_OP_LIST(CONNECT_BLOCK_JS_CASE)
// JS opcodes are just like calls => fall through. // JS opcodes are just like calls => fall through.
#undef CONNECT_BLOCK_JS_CASE #undef CONNECT_BLOCK_JS_CASE
......
...@@ -3717,7 +3717,7 @@ class RepresentationSelector { ...@@ -3717,7 +3717,7 @@ class RepresentationSelector {
case IrOpcode::kUnreachable: case IrOpcode::kUnreachable:
case IrOpcode::kRuntimeAbort: case IrOpcode::kRuntimeAbort:
// All JavaScript operators except JSToNumber have uniform handling. // All JavaScript operators except JSToNumber have uniform handling.
#define OPCODE_CASE(name) case IrOpcode::k##name: #define OPCODE_CASE(name, ...) case IrOpcode::k##name:
JS_SIMPLE_BINOP_LIST(OPCODE_CASE) JS_SIMPLE_BINOP_LIST(OPCODE_CASE)
JS_OBJECT_OP_LIST(OPCODE_CASE) JS_OBJECT_OP_LIST(OPCODE_CASE)
JS_CONTEXT_OP_LIST(OPCODE_CASE) JS_CONTEXT_OP_LIST(OPCODE_CASE)
......
...@@ -72,8 +72,8 @@ class Typer::Visitor : public Reducer { ...@@ -72,8 +72,8 @@ class Typer::Visitor : public Reducer {
Type TypeNode(Node* node) { Type TypeNode(Node* node) {
switch (node->opcode()) { switch (node->opcode()) {
#define DECLARE_UNARY_CASE(x) \ #define DECLARE_UNARY_CASE(x, ...) \
case IrOpcode::k##x: \ case IrOpcode::k##x: \
return Type##x(Operand(node, 0)); return Type##x(Operand(node, 0));
JS_SIMPLE_UNOP_LIST(DECLARE_UNARY_CASE) JS_SIMPLE_UNOP_LIST(DECLARE_UNARY_CASE)
SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_UNARY_CASE) SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_UNARY_CASE)
...@@ -81,8 +81,8 @@ class Typer::Visitor : public Reducer { ...@@ -81,8 +81,8 @@ class Typer::Visitor : public Reducer {
SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(DECLARE_UNARY_CASE) SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(DECLARE_UNARY_CASE)
SIMPLIFIED_SPECULATIVE_BIGINT_UNOP_LIST(DECLARE_UNARY_CASE) SIMPLIFIED_SPECULATIVE_BIGINT_UNOP_LIST(DECLARE_UNARY_CASE)
#undef DECLARE_UNARY_CASE #undef DECLARE_UNARY_CASE
#define DECLARE_BINARY_CASE(x) \ #define DECLARE_BINARY_CASE(x, ...) \
case IrOpcode::k##x: \ case IrOpcode::k##x: \
return Type##x(Operand(node, 0), Operand(node, 1)); return Type##x(Operand(node, 0), Operand(node, 1));
JS_SIMPLE_BINOP_LIST(DECLARE_BINARY_CASE) JS_SIMPLE_BINOP_LIST(DECLARE_BINARY_CASE)
SIMPLIFIED_NUMBER_BINOP_LIST(DECLARE_BINARY_CASE) SIMPLIFIED_NUMBER_BINOP_LIST(DECLARE_BINARY_CASE)
...@@ -90,8 +90,8 @@ class Typer::Visitor : public Reducer { ...@@ -90,8 +90,8 @@ class Typer::Visitor : public Reducer {
SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_BINARY_CASE) SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_BINARY_CASE)
SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(DECLARE_BINARY_CASE) SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(DECLARE_BINARY_CASE)
#undef DECLARE_BINARY_CASE #undef DECLARE_BINARY_CASE
#define DECLARE_OTHER_CASE(x) \ #define DECLARE_OTHER_CASE(x, ...) \
case IrOpcode::k##x: \ case IrOpcode::k##x: \
return Type##x(node); return Type##x(node);
DECLARE_OTHER_CASE(Start) DECLARE_OTHER_CASE(Start)
DECLARE_OTHER_CASE(IfException) DECLARE_OTHER_CASE(IfException)
...@@ -102,7 +102,7 @@ class Typer::Visitor : public Reducer { ...@@ -102,7 +102,7 @@ class Typer::Visitor : public Reducer {
JS_CONTEXT_OP_LIST(DECLARE_OTHER_CASE) JS_CONTEXT_OP_LIST(DECLARE_OTHER_CASE)
JS_OTHER_OP_LIST(DECLARE_OTHER_CASE) JS_OTHER_OP_LIST(DECLARE_OTHER_CASE)
#undef DECLARE_OTHER_CASE #undef DECLARE_OTHER_CASE
#define DECLARE_IMPOSSIBLE_CASE(x) case IrOpcode::k##x: #define DECLARE_IMPOSSIBLE_CASE(x, ...) case IrOpcode::k##x:
DECLARE_IMPOSSIBLE_CASE(Loop) DECLARE_IMPOSSIBLE_CASE(Loop)
DECLARE_IMPOSSIBLE_CASE(Branch) DECLARE_IMPOSSIBLE_CASE(Branch)
DECLARE_IMPOSSIBLE_CASE(IfTrue) DECLARE_IMPOSSIBLE_CASE(IfTrue)
...@@ -141,7 +141,7 @@ class Typer::Visitor : public Reducer { ...@@ -141,7 +141,7 @@ class Typer::Visitor : public Reducer {
LoopVariableOptimizer* induction_vars_; LoopVariableOptimizer* induction_vars_;
ZoneSet<NodeId> weakened_nodes_; ZoneSet<NodeId> weakened_nodes_;
#define DECLARE_METHOD(x) inline Type Type##x(Node* node); #define DECLARE_METHOD(x, ...) inline Type Type##x(Node* node);
DECLARE_METHOD(Start) DECLARE_METHOD(Start)
DECLARE_METHOD(IfException) DECLARE_METHOD(IfException)
COMMON_OP_LIST(DECLARE_METHOD) COMMON_OP_LIST(DECLARE_METHOD)
...@@ -151,7 +151,7 @@ class Typer::Visitor : public Reducer { ...@@ -151,7 +151,7 @@ class Typer::Visitor : public Reducer {
JS_CONTEXT_OP_LIST(DECLARE_METHOD) JS_CONTEXT_OP_LIST(DECLARE_METHOD)
JS_OTHER_OP_LIST(DECLARE_METHOD) JS_OTHER_OP_LIST(DECLARE_METHOD)
#undef DECLARE_METHOD #undef DECLARE_METHOD
#define DECLARE_METHOD(x) inline Type Type##x(Type input); #define DECLARE_METHOD(x, ...) inline Type Type##x(Type input);
JS_SIMPLE_UNOP_LIST(DECLARE_METHOD) JS_SIMPLE_UNOP_LIST(DECLARE_METHOD)
#undef DECLARE_METHOD #undef DECLARE_METHOD
...@@ -229,13 +229,13 @@ class Typer::Visitor : public Reducer { ...@@ -229,13 +229,13 @@ class Typer::Visitor : public Reducer {
SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_METHOD) SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_METHOD)
SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(DECLARE_METHOD) SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(DECLARE_METHOD)
#undef DECLARE_METHOD #undef DECLARE_METHOD
#define DECLARE_METHOD(Name) \ #define DECLARE_METHOD(Name, ...) \
inline Type Type##Name(Type left, Type right) { \ inline Type Type##Name(Type left, Type right) { \
return TypeBinaryOp(left, right, Name##Typer); \ return TypeBinaryOp(left, right, Name##Typer); \
} }
JS_SIMPLE_BINOP_LIST(DECLARE_METHOD) JS_SIMPLE_BINOP_LIST(DECLARE_METHOD)
#undef DECLARE_METHOD #undef DECLARE_METHOD
#define DECLARE_METHOD(Name) \ #define DECLARE_METHOD(Name, ...) \
inline Type Type##Name(Type left, Type right) { \ inline Type Type##Name(Type left, Type right) { \
return TypeBinaryOp(left, right, Name); \ return TypeBinaryOp(left, right, Name); \
} }
...@@ -244,7 +244,7 @@ class Typer::Visitor : public Reducer { ...@@ -244,7 +244,7 @@ class Typer::Visitor : public Reducer {
SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_METHOD) SIMPLIFIED_SPECULATIVE_NUMBER_BINOP_LIST(DECLARE_METHOD)
SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(DECLARE_METHOD) SIMPLIFIED_SPECULATIVE_BIGINT_BINOP_LIST(DECLARE_METHOD)
#undef DECLARE_METHOD #undef DECLARE_METHOD
#define DECLARE_METHOD(Name) \ #define DECLARE_METHOD(Name, ...) \
inline Type Type##Name(Type input) { return TypeUnaryOp(input, Name); } inline Type Type##Name(Type input) { return TypeUnaryOp(input, Name); }
SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_METHOD) SIMPLIFIED_NUMBER_UNOP_LIST(DECLARE_METHOD)
SIMPLIFIED_BIGINT_UNOP_LIST(DECLARE_METHOD) SIMPLIFIED_BIGINT_UNOP_LIST(DECLARE_METHOD)
...@@ -271,7 +271,7 @@ class Typer::Visitor : public Reducer { ...@@ -271,7 +271,7 @@ class Typer::Visitor : public Reducer {
static ComparisonOutcome JSCompareTyper(Type, Type, Typer*); static ComparisonOutcome JSCompareTyper(Type, Type, Typer*);
static ComparisonOutcome NumberCompareTyper(Type, Type, Typer*); static ComparisonOutcome NumberCompareTyper(Type, Type, Typer*);
#define DECLARE_METHOD(x) static Type x##Typer(Type, Type, Typer*); #define DECLARE_METHOD(x, ...) static Type x##Typer(Type, Type, Typer*);
JS_SIMPLE_BINOP_LIST(DECLARE_METHOD) JS_SIMPLE_BINOP_LIST(DECLARE_METHOD)
#undef DECLARE_METHOD #undef DECLARE_METHOD
......
...@@ -40,7 +40,7 @@ bool IsControlOpcode(IrOpcode::Value opcode) { ...@@ -40,7 +40,7 @@ bool IsControlOpcode(IrOpcode::Value opcode) {
bool IsJsOpcode(IrOpcode::Value opcode) { bool IsJsOpcode(IrOpcode::Value opcode) {
switch (opcode) { switch (opcode) {
#define OPCODE(Opcode) \ #define OPCODE(Opcode, ...) \
case IrOpcode::k##Opcode: \ case IrOpcode::k##Opcode: \
return true; return true;
JS_OP_LIST(OPCODE) JS_OP_LIST(OPCODE)
...@@ -66,7 +66,7 @@ bool IsConstantOpcode(IrOpcode::Value opcode) { ...@@ -66,7 +66,7 @@ bool IsConstantOpcode(IrOpcode::Value opcode) {
bool IsComparisonOpcode(IrOpcode::Value opcode) { bool IsComparisonOpcode(IrOpcode::Value opcode) {
switch (opcode) { switch (opcode) {
#define OPCODE(Opcode) \ #define OPCODE(Opcode, ...) \
case IrOpcode::k##Opcode: \ case IrOpcode::k##Opcode: \
return true; return true;
JS_COMPARE_BINOP_LIST(OPCODE) JS_COMPARE_BINOP_LIST(OPCODE)
...@@ -79,13 +79,13 @@ bool IsComparisonOpcode(IrOpcode::Value opcode) { ...@@ -79,13 +79,13 @@ bool IsComparisonOpcode(IrOpcode::Value opcode) {
} }
char const* const kMnemonics[] = { char const* const kMnemonics[] = {
#define OPCODE(Opcode) #Opcode, #define OPCODE(Opcode, ...) #Opcode,
ALL_OP_LIST(OPCODE) ALL_OP_LIST(OPCODE)
#undef OPCODE #undef OPCODE
}; };
const IrOpcode::Value kOpcodes[] = { const IrOpcode::Value kOpcodes[] = {
#define OPCODE(Opcode) IrOpcode::k##Opcode, #define OPCODE(Opcode, ...) IrOpcode::k##Opcode,
ALL_OP_LIST(OPCODE) ALL_OP_LIST(OPCODE)
#undef OPCODE #undef OPCODE
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment