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)))