boot2

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

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