File tree Expand file tree Collapse file tree 1 file changed +23
-30
lines changed
Expand file tree Collapse file tree 1 file changed +23
-30
lines changed Original file line number Diff line number Diff line change 218218(define (compile-match-clause p e c done t?)
219219 (let ((next (gensym)))
220220 (match (compile-pattern p '() next)
221- [(list i f cm)
221+ [(list i cm)
222222 (seq (Mov rax (Offset rsp 0 )) ; restore value being matched
223223 i
224224 (compile-e e (append cm c) t?)
225225 (Add rsp (* 8 (length cm)))
226226 (Jmp done)
227- f
228227 (Label next))])))
229228
230- ;; Pat CEnv Symbol -> (list Asm Asm CEnv)
229+ ;; Pat CEnv Symbol -> (list Asm CEnv)
231230(define (compile-pattern p cm next)
232231 (match p
233232 [(PWild)
234- (list (seq) (seq) cm)]
233+ (list (seq) cm)]
235234 [(PVar x)
236- (list (seq (Push rax))
237- (seq)
238- (cons x cm))]
235+ (list (seq (Push rax)) (cons x cm))]
239236 [(PLit l)
240- (let ((fail (gensym)))
237+ (let ((ok (gensym)))
241238 (list (seq (Cmp rax (value->bits l))
242- (Jne fail))
243- (seq (Label fail)
239+ (Je ok)
244240 (Add rsp (* 8 (length cm)))
245- (Jmp next))
241+ (Jmp next)
242+ (Label ok))
246243 cm))]
247244 [(PAnd p1 p2)
248245 (match (compile-pattern p1 (cons #f cm) next)
249- [(list i1 f1 cm1)
246+ [(list i1 cm1)
250247 (match (compile-pattern p2 cm1 next)
251- [(list i2 f2 cm2)
248+ [(list i2 cm2)
252249 (list
253250 (seq (Push rax)
254251 i1
255252 (Mov rax (Offset rsp (* 8 (- (sub1 (length cm1)) (length cm)))))
256253 i2)
257- (seq f1 f2)
258254 cm2)])])]
259255 [(PBox p)
260256 (match (compile-pattern p cm next)
261- [(list i1 f1 cm1)
262- (let ((fail (gensym)))
257+ [(list i1 cm1)
258+ (let ((ok (gensym)))
263259 (list
264260 (seq (Mov r8 rax)
265261 (And r8 ptr-mask)
266262 (Cmp r8 type-box)
267- (Jne fail)
263+ (Je ok)
264+ (Add rsp (* 8 (length cm))) ; haven't pushed anything yet
265+ (Jmp next)
266+ (Label ok)
268267 (Xor rax type-box)
269268 (Mov rax (Offset rax 0 ))
270269 i1)
271- (seq f1
272- (Label fail)
273- (Add rsp (* 8 (length cm))) ; haven't pushed anything yet
274- (Jmp next))
275270 cm1))])]
276271 [(PCons p1 p2)
277272 (match (compile-pattern p1 (cons #f cm) next)
278- [(list i1 f1 cm1)
273+ [(list i1 cm1)
279274 (match (compile-pattern p2 cm1 next)
280- [(list i2 f2 cm2)
281- (let ((fail (gensym)))
275+ [(list i2 cm2)
276+ (let ((ok (gensym)))
282277 (list
283278 (seq (Mov r8 rax)
284279 (And r8 ptr-mask)
285280 (Cmp r8 type-cons)
286- (Jne fail)
281+ (Je ok)
282+ (Add rsp (* 8 (length cm))) ; haven't pushed anything yet
283+ (Jmp next)
284+ (Label ok)
287285 (Xor rax type-cons)
288286 (Mov r8 (Offset rax 0 ))
289287 (Push r8) ; push cdr
290288 (Mov rax (Offset rax 8 )) ; mov rax car
291289 i1
292290 (Mov rax (Offset rsp (* 8 (- (sub1 (length cm1)) (length cm)))))
293291 i2)
294- (seq f1
295- f2
296- (Label fail)
297- (Add rsp (* 8 (length cm))) ; haven't pushed anything yet
298- (Jmp next))
299292 cm2))])])]))
300293
301294;; Id CEnv -> Integer
You can’t perform that action at this time.
0 commit comments