073-struct-ret-3word.scm (2176B)
1 ;; tests/cc-cg/73-struct-ret-3word.scm — indirect-result struct return. 2 ;; 3 ;; struct Triple { long a; long b; long c; }; /* 24B — > 16B */ 4 ;; struct Triple make(long a, long b, long c) { ...; return t; } 5 ;; int main(void) { struct Triple r = make(10,20,30); 6 ;; return (int)(r.a+r.b+r.c); } /* 60 */ 7 ;; 8 ;; Stream A2 (P1.md §Arguments): caller passes result-buffer ptr in 9 ;; a0; explicit args 0..2 land in a1..a3; cg-fn-begin/v shifts param 10 ;; ABI by one register; cg-return writes through saved sret pointer. 11 12 (let* ((cg (cg-init)) 13 (ty (%ctype 'struct 24 8 14 (list "T" #t 15 (list (list "a" %t-i64 0) 16 (list "b" %t-i64 8) 17 (list "c" %t-i64 16))))) 18 (fty (%ctype 'fn 8 8 19 (cons ty (cons (list %t-i64 %t-i64 %t-i64) #f)))) 20 (mk (%sym "make" 'fn 'extern fty #f))) 21 (let* ((ps (cg-fn-begin cg "make" 22 (list (cons "a" %t-i64) 23 (cons "b" %t-i64) 24 (cons "c" %t-i64)) 25 ty)) 26 (a* (cdr (car ps))) (b* (cdr (cadr ps))) (c* (cdr (caddr ps))) 27 (to (cg-alloc-slot cg 24 8)) 28 (ts (%sym "t" 'var 'auto ty to))) 29 (cg-push-sym cg ts) (cg-push-field cg "a") 30 (cg-push-sym cg a*) (cg-load cg) (cg-assign cg) (cg-pop cg) 31 (cg-push-sym cg ts) (cg-push-field cg "b") 32 (cg-push-sym cg b*) (cg-load cg) (cg-assign cg) (cg-pop cg) 33 (cg-push-sym cg ts) (cg-push-field cg "c") 34 (cg-push-sym cg c*) (cg-load cg) (cg-assign cg) (cg-pop cg) 35 (cg-push-sym cg ts) (cg-return cg) 36 (cg-fn-end cg)) 37 (cg-fn-begin cg "main" '() %t-i32) 38 (cg-push-sym cg mk) 39 (cg-push-imm cg %t-i64 10) 40 (cg-push-imm cg %t-i64 20) 41 (cg-push-imm cg %t-i64 30) 42 (cg-call cg 3 #t) 43 (let ((r (cg-pop cg))) 44 (cg-push cg r) (cg-push-field cg "a") (cg-load cg) 45 (cg-push cg r) (cg-push-field cg "b") (cg-load cg) 46 (cg-binop cg 'add) 47 (cg-push cg r) (cg-push-field cg "c") (cg-load cg) 48 (cg-binop cg 'add)) 49 (cg-cast cg %t-i32) (cg-return cg) 50 (cg-fn-end cg) 51 (write-bv-fd 1 (cg-finish cg)))