SECTION "LCG7"

GET "LCGHDR"

LET cgentry() BE
$(  LET n = rdn()
    LET l = rdl()
    LET v = VEC 7
    chkrefs(20)
    v!0 := 7  // string length
    FOR i = 1 TO n DO $( LET k=rdn(); IF i <= 7 DO v!i := k $)
    FOR i = n+1 TO 7 DO v!i := #40  // ASCII space
    UNLESS (CGFLAGS & cgf.Procnames)=0
    DO FOR i=0 TO 6 BY 2 DO code((v!i<<8)+v!(i+1), 0)

    setlabel(l)
    incode := yes

    // Entry sequence
    code(0, 0)  // Return link!
    gens(f.l, r.y, m.rel + #X80 - 2)
    gens(f.add, r.x, m.y)
    gens(f.st, r.y, m.x)
    UNLESS (CGFLAGS & cgf.Procnames)=0
    $( genrr(f.lr, r.p, r.y); gens(f.st, r.y, m.x + 1) $)
    UNLESS (CGFLAGS & cgf.Callcounting)=0 DO insertcount()
$)

AND cgsave(n) BE
  $( LET j = n - 3
     IF j > 1 THEN j := 1
     forgetall()
     FOR r = 0 TO j $( gens(f.st, r.a+r, r+2+m.x); setinfo(r.a+r, k.loc, r+2) $)
     initstack(n)
  $)

AND cgapply(op, k) BE
  $( cgpendingop()
     $( LET base = h3!tempv
        LET notloaded = VEC 1
        LET a = ssp - k - 4
        store(k+4, ssp-2)  // store args 3,...

        // Now deal with non-args
        FOR t = tempv TO arg2 BY 3 DO
          $( IF h3!t>k THEN BREAK; IF regusedby(t)>=0 THEN storet(t) $)

        IF a > 1 THEN a := 1

        notloaded ! 0, notloaded ! 1 := yes, yes

        FOR r = 0 TO a DO
          IF isfree(r + r.a) THEN
            $( loadarg(k + 2 + r, base, r + r.a); notloaded ! r := no $)
        FOR r = 0 TO a IF notloaded ! r THEN loadarg(k+2+r, base, r+r.a)
     $)
     chkrefs(4)
     gengoto(f.jst, f.jste)
     IF incode THEN code(k, 0)
     forgetall()
     stack(k)
     IF op = s.fnap THEN loadt(k.reg, r.a)
  $)


AND loadarg(s, base, r) BE
  TEST s >= base THEN movetor(tempv + (s - base) * 3, r)
   ELSE $( freereg(r); gensore(f.l, f.le, r, m.x, s); forgetreg(r) $)

AND cgreturn(op) BE
  $( cgpendingop()
     IF op=s.fnrn THEN $( movetor(arg1, r.a); stack(ssp-1) $)
     gens(f.jmp, 0, a.rtn)
     incode := no
     initstack(ssp)
  $)


