aboutsummaryrefslogtreecommitdiff
path: root/src/ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast.h')
-rw-r--r--src/ast.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/ast.h b/src/ast.h
index 75d8b12..1db8b99 100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -119,6 +119,7 @@ enum StatementKind
STATEMENT_CALL,
STATEMENT_STACK,
STATEMENT_INSTRUCTION,
+ STATEMENT_SELECT,
};
struct AssignStatement
@@ -187,6 +188,18 @@ struct InstructionStatement
size_t operand_capacity;
};
+// a branchless conditional move: `target = if_value if left cmp right else
+// else_value`. Lowers to csel on AArch64 and cmov on x86.
+struct SelectStatement
+{
+ struct Token target;
+ struct Expr* if_value;
+ struct Expr* left;
+ struct Token comparison;
+ struct Expr* right;
+ struct Expr* else_value;
+};
+
struct Statement
{
enum StatementKind kind;
@@ -200,6 +213,7 @@ struct Statement
struct CallStatement call;
struct StackStatement stack;
struct InstructionStatement instruction;
+ struct SelectStatement select;
};
};