boot2

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

024-cmpd-ptr.scm (1101B)


      1 ;; tests/cc-cg/24-cmpd-ptr.scm — compound assignment through pointer (§B.4).
      2 ;;
      3 ;; Models: int x = 7; int *p = &x; *p += 3; return x; → exit 10.
      4 
      5 (let ((cg (cg-init)))
      6   (cg-fn-begin cg "main" '() %t-i32)
      7   (let* ((off-x (cg-alloc-slot cg 4 4))
      8          (sym-x (%sym "x" 'var 'auto %t-i32 off-x))
      9          (off-p (cg-alloc-slot cg 8 8))
     10          (ptr-i32 (%ctype 'ptr 8 8 %t-i32))
     11          (sym-p (%sym "p" 'var 'auto ptr-i32 off-p)))
     12     ;; x = 7
     13     (cg-push-sym cg sym-x)
     14     (cg-push-imm cg %t-i32 7)
     15     (cg-assign cg) (cg-pop cg)
     16     ;; p = &x
     17     (cg-push-sym cg sym-p)
     18     (cg-push-sym cg sym-x)
     19     (cg-take-addr cg)
     20     (cg-assign cg) (cg-pop cg)
     21     ;; *p += 3:  push p; load (rval ptr); push-deref (lval int);
     22     ;;          dup; load (rval int); push 3; add; assign; pop
     23     (cg-push-sym cg sym-p)
     24     (cg-load cg)
     25     (cg-push-deref cg)
     26     (cg-dup cg)
     27     (cg-load cg)
     28     (cg-push-imm cg %t-i32 3)
     29     (cg-binop cg 'add)
     30     (cg-assign cg) (cg-pop cg)
     31     ;; return x
     32     (cg-push-sym cg sym-x) (cg-load cg)
     33     (cg-return cg))
     34   (cg-fn-end cg)
     35   (write-bv-fd 1 (cg-finish cg)))