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