From c760292a7c1aa31b203686442fca8501cb3e0dce Mon Sep 17 00:00:00 2001 From: Chris Dodd Date: Thu, 30 Jan 2025 14:52:47 +1300 Subject: [PATCH] Add op= assignments Signed-off-by: Chris Dodd --- p4-16/spec/P4-16-spec.adoc | 6 ++++++ p4-16/spec/grammar.adoc | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/p4-16/spec/P4-16-spec.adoc b/p4-16/spec/P4-16-spec.adoc index d6a5d4d43c..625ebe66f5 100644 --- a/p4-16/spec/P4-16-spec.adoc +++ b/p4-16/spec/P4-16-spec.adoc @@ -5498,6 +5498,12 @@ types (e.g. ``struct``s) are copied recursively, and all components of ``header``s are copied, including "validity" bits. Assignment is not defined for `extern` values. +An assignment may also be written with a binary operator immediately +before the `=` sign. This performs the binary operator on the old +value of the left sub-expression and the right sub-expression and assigns +the result to the l-value. Thus an assignment like `A += B` is equivalent +to `A = A + B`, except that `A` is only evaluated once. + [#sec-empty-stmt] === Empty statement diff --git a/p4-16/spec/grammar.adoc b/p4-16/spec/grammar.adoc index d857ef7645..ff868b07d9 100644 --- a/p4-16/spec/grammar.adoc +++ b/p4-16/spec/grammar.adoc @@ -736,7 +736,19 @@ typedefDeclaration assignmentOrMethodCallStatement : lvalue "(" argumentList ")" ";" | lvalue "<" typeArgumentList ">" "(" argumentList ")" ";" - | lvalue "=" expression ";" + | lvalue "=" expression ";" + | lvalue "*=" expression ";" + | lvalue "/=" expression ";" + | lvalue "%=" expression ";" + | lvalue "+=" expression ";" + | lvalue "-=" expression ";" + | lvalue "|+|=" expression ";" + | lvalue "|-|=" expression ";" + | lvalue "<<=" expression ";" + | lvalue ">>=" expression ";" + | lvalue "&=" expression ";" + | lvalue "|=" expression ";" + | lvalue "^=" expression ";" ; // end::assignmentOrMethodCallStatement[]