diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-08-13 23:37:08 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-15 10:06:21 +0900 |
| commit | cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0 (patch) | |
| tree | eb0e53cfebe273636ebaf3d6b5e50936903302ad /codegen.c | |
| parent | 7685bff588632a486a9e677c63ae7123b112ba9e (diff) | |
| download | ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.tar.gz ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.tar.zst ducc-cefe477fdf8c8a7a081e08add9cafbe1d8a2acf0.zip | |
feat: implement shift operators
Diffstat (limited to 'codegen.c')
| -rw-r--r-- | codegen.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -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"); |
