aboutsummaryrefslogtreecommitdiffhomepage
path: root/codegen.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-08-13 23:37:08 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 10:06:21 +0900
commitcefe477fdf8c8a7a081e08add9cafbe1d8a2acf0 (patch)
treeeb0e53cfebe273636ebaf3d6b5e50936903302ad /codegen.c
parent7685bff588632a486a9e677c63ae7123b112ba9e (diff)
downloadducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.tar.gz
ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.tar.zst
ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.zip
feat: implement shift operators
Diffstat (limited to 'codegen.c')
-rw-r--r--codegen.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/codegen.c b/codegen.c
index 92a8619..f717c25 100644
--- a/codegen.c
+++ b/codegen.c
@@ -174,6 +174,13 @@ void codegen_binary_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
printf(" mov rax, rdx\n");
} else if (ast->node_op == TokenKind_or) {
printf(" or rax, rdi\n");
+ } else if (ast->node_op == TokenKind_lshift) {
+ printf(" mov rcx, rdi\n");
+ printf(" shl rax, cl\n");
+ } else if (ast->node_op == TokenKind_rshift) {
+ // TODO: check if the operand is signed or unsigned
+ printf(" mov rcx, rdi\n");
+ printf(" sar rax, cl\n");
} else if (ast->node_op == TokenKind_eq) {
printf(" cmp rax, rdi\n");
printf(" sete al\n");