diff options
-rw-r--r-- | src/compiler.h | 52 |
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 | ||
120 | void | 119 | void |
121 | compile_logic_list(OpType op, Object* args) { | 120 | compile_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 | } |