boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

030-lor.scm (1017B)


      1 ;; tests/cc-cg/30-lor.scm — `||` short-circuits, leaves one i32 (§H.3).
      2 ;;
      3 ;; Models: int a = 0; int b = 5; return (a || b) ? 11 : 33;  → exit 11.
      4 
      5 (let ((cg (cg-init)))
      6   (cg-fn-begin cg "main" '() %t-i32)
      7   (let* ((off-a (cg-alloc-slot cg 4 4))
      8          (sym-a (%sym "a" 'var 'auto %t-i32 off-a))
      9          (off-b (cg-alloc-slot cg 4 4))
     10          (sym-b (%sym "b" 'var 'auto %t-i32 off-b)))
     11     (cg-push-sym cg sym-a)
     12     (cg-push-imm cg %t-i32 0)
     13     (cg-assign cg) (cg-pop cg)
     14     (cg-push-sym cg sym-b)
     15     (cg-push-imm cg %t-i32 5)
     16     (cg-assign cg) (cg-pop cg)
     17     ;; (a || b)
     18     (cg-push-sym cg sym-a) (cg-load cg)
     19     (cg-ifelse-merge cg
     20       (lambda () (cg-push-imm cg %t-i32 1))
     21       (lambda ()
     22         (cg-push-sym cg sym-b) (cg-load cg)
     23         (cg-cast cg %t-bool) (cg-cast cg %t-i32)))
     24     ;; outer ?: 11/33
     25     (cg-ifelse-merge cg
     26       (lambda () (cg-push-imm cg %t-i32 11))
     27       (lambda () (cg-push-imm cg %t-i32 33)))
     28     (cg-return cg))
     29   (cg-fn-end cg)
     30   (write-bv-fd 1 (cg-finish cg)))