aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-11-02 16:41:39 +0100
committerBad Diode <bd@badd10de.dev>2021-11-02 16:41:39 +0100
commitc1e253fbe7528038b00a6e7c17437846fc8cf568 (patch)
tree0009f6132f3e08279cb064077bdbd621a79bc030
parentdca96d579fdf7eb747294fc786e89a08031fe003 (diff)
downloadbdl-c1e253fbe7528038b00a6e7c17437846fc8cf568.tar.gz
bdl-c1e253fbe7528038b00a6e7c17437846fc8cf568.zip
Add `and` / `or` primitive procedures
-rw-r--r--src/compiler.h52
1 files 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) {
106 } 106 }
107 printf(" mov rax, 0\n"); 107 printf(" mov rax, 0\n");
108 printf(" sete al\n"); 108 printf(" sete al\n");
109 printf(" sal rax, %d\n", BOOL_SHIFT); 109 printf(" shl rax, %d\n", BOOL_SHIFT);
110 printf(" or rax, %d\n", BOOL_TAG); 110 printf(" or rax, %d\n", BOOL_TAG);
111 printf(" push rax\n"); 111 printf(" push rax\n");
112 printf(" ;; <-- compile_type_predicate\n"); 112 printf(" ;; <-- compile_type_predicate\n");
113} 113}
114 114
115 115
116// TODO: Next -> numerical comparison operators =, <=, ... 116// TODO: Next -> numerical comparison operators
117// "=", "<", ">", "<=", ">=", 117// "=", "<", ">", "<=", ">=",
118// "not", "and", "or",
119 118
120void 119void
121compile_logic_list(OpType op, Object* args) { 120compile_logic_list(OpType op, Object* args) {
122 printf(" ;; --> compile_logic_list\n"); 121 printf(" ;; --> compile_logic_list\n");
123 compile_object(args->head); 122 compile_object(args->head);
124 do { 123 if (op == OP_NOT) {
125 // TODO: Make sure to stop evaluating if the condition is not met. 124 printf(" pop rax\n");
125 printf(" cmp rax, %d\n", FALSE_VAL);
126 printf(" mov rax, 0\n");
127 printf(" sete al\n");
128 printf(" shl rax, %d\n", BOOL_SHIFT);
129 printf(" or rax, %d\n", BOOL_TAG);
130 printf(" push rax\n");
131 printf(" ;; <-- compile_logic_list\n");
132 return;
133 }
134
135 // TODO: Make sure to stop evaluating if the condition is not met.
136 args = args->tail;
137 while (args != NULL) {
138 compile_object(args->head);
126 args = args->tail; 139 args = args->tail;
140
141 // Current value.
142 printf(" pop rcx\n");
143 printf(" cmp rcx, %d\n", FALSE_VAL);
144 printf(" mov rcx, 0\n");
145 printf(" setne cl\n");
146
147 // Previous value.
127 printf(" pop rax\n"); 148 printf(" pop rax\n");
149 printf(" cmp rax, %d\n", FALSE_VAL);
150 printf(" mov rax, 0\n");
151 printf(" setne al\n");
152
128 switch (op) { 153 switch (op) {
129 case OP_NOT: { 154 case OP_AND: { printf(" and al, cl\n"); } break;
130 printf(" cmp rax, %d\n", FALSE_VAL); 155 case OP_OR: { printf(" or al, cl\n"); } break;
131 printf(" mov rax, 0\n");
132 } break;
133 default: break; 156 default: break;
134 } 157 }
135 printf(" sete al\n"); 158 printf(" shl rax, %d\n", BOOL_SHIFT);
136 printf(" sal rax, %d\n", BOOL_SHIFT);
137 printf(" or rax, %d\n", BOOL_TAG); 159 printf(" or rax, %d\n", BOOL_TAG);
138 printf(" push rax\n"); 160 printf(" push rax\n");
139 } while (args != NULL); 161 }
140 printf(" ;; <-- compile_logic_list\n"); 162 printf(" ;; <-- compile_logic_list\n");
141} 163}
142 164
@@ -157,14 +179,14 @@ compile_arithmetic_list(OpType op, Object* args) {
157 printf(" sar rax, %d\n", FIXNUM_SHIFT); 179 printf(" sar rax, %d\n", FIXNUM_SHIFT);
158 printf(" sar rcx, %d\n", FIXNUM_SHIFT); 180 printf(" sar rcx, %d\n", FIXNUM_SHIFT);
159 printf(" mul rcx\n"); 181 printf(" mul rcx\n");
160 printf(" sal rax, %d\n", FIXNUM_SHIFT); 182 printf(" shl rax, %d\n", FIXNUM_SHIFT);
161 } break; 183 } break;
162 case OP_DIV: { 184 case OP_DIV: {
163 printf(" sar rax, %d\n", FIXNUM_SHIFT); 185 printf(" sar rax, %d\n", FIXNUM_SHIFT);
164 printf(" sar rcx, %d\n", FIXNUM_SHIFT); 186 printf(" sar rcx, %d\n", FIXNUM_SHIFT);
165 printf(" mov rdx, 0\n"); 187 printf(" mov rdx, 0\n");
166 printf(" div rcx\n"); 188 printf(" div rcx\n");
167 printf(" sal rax, %d\n", FIXNUM_SHIFT); 189 printf(" shl rax, %d\n", FIXNUM_SHIFT);
168 } break; 190 } break;
169 case OP_MOD: { 191 case OP_MOD: {
170 printf(" sar rax, %d\n", FIXNUM_SHIFT); 192 printf(" sar rax, %d\n", FIXNUM_SHIFT);
@@ -172,7 +194,7 @@ compile_arithmetic_list(OpType op, Object* args) {
172 printf(" mov rdx, 0\n"); 194 printf(" mov rdx, 0\n");
173 printf(" div rcx\n"); 195 printf(" div rcx\n");
174 printf(" mov rax, rdx\n"); 196 printf(" mov rax, rdx\n");
175 printf(" sal rax, %d\n", FIXNUM_SHIFT); 197 printf(" shl rax, %d\n", FIXNUM_SHIFT);
176 } break; 198 } break;
177 default: break; 199 default: break;
178 } 200 }