mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-02 13:00:26 +02:00
(translate-and, translate-or): Don't branch on the last expression.
This commit is contained in:
parent
fd329e8725
commit
e54350691e
1 changed files with 24 additions and 14 deletions
|
@ -166,37 +166,47 @@
|
|||
(return-or-push))
|
||||
|
||||
(define (translate-and . args)
|
||||
;; #:and ARG1 ARG2...
|
||||
;; #:and ARG1 ARG2... LAST
|
||||
;; ARG1
|
||||
;; %br-if-not L0
|
||||
;; ARG2
|
||||
;; %br-if-not L0
|
||||
;; ...
|
||||
;; LAST
|
||||
;; L0:
|
||||
(assert-for-each code? args)
|
||||
(let ((L0 (make-label)))
|
||||
(for-each (lambda (arg)
|
||||
(trans-non-stack arg)
|
||||
(push-code! '%br-if-not L0))
|
||||
args)
|
||||
(push-code! #:label L0))
|
||||
(let* ((list (reverse args))
|
||||
(last (car list))
|
||||
(ARGS (reverse! (cdr list))))
|
||||
(let ((L0 (make-label)))
|
||||
(for-each (lambda (arg)
|
||||
(trans-non-stack arg)
|
||||
(push-code! '%br-if-not L0))
|
||||
args)
|
||||
(trans-non-stack last)
|
||||
(push-code! #:label L0)))
|
||||
(return-or-push))
|
||||
|
||||
(define (translate-or . args)
|
||||
;; #:or ARG1 ARG2...
|
||||
;; #:or ARG1 ARG2... LAST
|
||||
;; ARG1
|
||||
;; %br-if L0
|
||||
;; ARG2
|
||||
;; %br-if L0
|
||||
;; ...
|
||||
;; LAST
|
||||
;; L0:
|
||||
(assert-for-each code? args)
|
||||
(let ((L0 (make-label)))
|
||||
(for-each (lambda (arg)
|
||||
(trans-non-stack arg)
|
||||
(push-code! '%br-if L0))
|
||||
args)
|
||||
(push-code! #:label L0))
|
||||
(let* ((list (reverse args))
|
||||
(last (car list))
|
||||
(ARGS (reverse! (cdr list))))
|
||||
(let ((L0 (make-label)))
|
||||
(for-each (lambda (arg)
|
||||
(trans-non-stack arg)
|
||||
(push-code! '%br-if L0))
|
||||
args)
|
||||
(trans-non-stack last)
|
||||
(push-code! #:label L0)))
|
||||
(return-or-push))
|
||||
|
||||
(define (translate-program nreqs restp code)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue