From c1e253fbe7528038b00a6e7c17437846fc8cf568 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 2 Nov 2021 16:41:39 +0100 Subject: Add `and` / `or` primitive procedures --- src/compiler.h | 52 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/src/compiler.h b/src/compiler.h index 76aec85..a40fb1e 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -106,37 +106,59 @@ compile_type_predicate(OpType op, Object* args) { } printf(" mov rax, 0\n"); printf(" sete al\n"); - printf(" sal rax, %d\n", BOOL_SHIFT); + printf(" shl rax, %d\n", BOOL_SHIFT); printf(" or rax, %d\n", BOOL_TAG); printf(" push rax\n"); printf(" ;; <-- compile_type_predicate\n"); } -// TODO: Next -> numerical comparison operators =, <=, ... +// TODO: Next -> numerical comparison operators // "=", "<", ">", "<=", ">=", -// "not", "and", "or", void compile_logic_list(OpType op, Object* args) { printf(" ;; --> compile_logic_list\n"); compile_object(args->head); - do { - // TODO: Make sure to stop evaluating if the condition is not met. + if (op == OP_NOT) { + printf(" pop rax\n"); + printf(" cmp rax, %d\n", FALSE_VAL); + printf(" mov rax, 0\n"); + printf(" sete al\n"); + printf(" shl rax, %d\n", BOOL_SHIFT); + printf(" or rax, %d\n", BOOL_TAG); + printf(" push rax\n"); + printf(" ;; <-- compile_logic_list\n"); + return; + } + + // TODO: Make sure to stop evaluating if the condition is not met. + args = args->tail; + while (args != NULL) { + compile_object(args->head); args = args->tail; + + // Current value. + printf(" pop rcx\n"); + printf(" cmp rcx, %d\n", FALSE_VAL); + printf(" mov rcx, 0\n"); + printf(" setne cl\n"); + + // Previous value. printf(" pop rax\n"); + printf(" cmp rax, %d\n", FALSE_VAL); + printf(" mov rax, 0\n"); + printf(" setne al\n"); + switch (op) { - case OP_NOT: { - printf(" cmp rax, %d\n", FALSE_VAL); - printf(" mov rax, 0\n"); - } break; + case OP_AND: { printf(" and al, cl\n"); } break; + case OP_OR: { printf(" or al, cl\n"); } break; default: break; } - printf(" sete al\n"); - printf(" sal rax, %d\n", BOOL_SHIFT); + printf(" shl rax, %d\n", BOOL_SHIFT); printf(" or rax, %d\n", BOOL_TAG); printf(" push rax\n"); - } while (args != NULL); + } printf(" ;; <-- compile_logic_list\n"); } @@ -157,14 +179,14 @@ compile_arithmetic_list(OpType op, Object* args) { printf(" sar rax, %d\n", FIXNUM_SHIFT); printf(" sar rcx, %d\n", FIXNUM_SHIFT); printf(" mul rcx\n"); - printf(" sal rax, %d\n", FIXNUM_SHIFT); + printf(" shl rax, %d\n", FIXNUM_SHIFT); } break; case OP_DIV: { printf(" sar rax, %d\n", FIXNUM_SHIFT); printf(" sar rcx, %d\n", FIXNUM_SHIFT); printf(" mov rdx, 0\n"); printf(" div rcx\n"); - printf(" sal rax, %d\n", FIXNUM_SHIFT); + printf(" shl rax, %d\n", FIXNUM_SHIFT); } break; case OP_MOD: { printf(" sar rax, %d\n", FIXNUM_SHIFT); @@ -172,7 +194,7 @@ compile_arithmetic_list(OpType op, Object* args) { printf(" mov rdx, 0\n"); printf(" div rcx\n"); printf(" mov rax, rdx\n"); - printf(" sal rax, %d\n", FIXNUM_SHIFT); + printf(" shl rax, %d\n", FIXNUM_SHIFT); } break; default: break; } -- cgit v1.2.1