anchor.diff:                         `(sys.lap-x86:mov64 (:rbx ,(+ 1 (* (- env-size (length (first *environment*))) 8)))
                                              :r13))
                    (push rest-arg (first *environment*)))))))
  -    (let ((code-tag (let ((*for-value* :multiple))
  -                      (cg-form `(progn ,@(lambda-information-body lambda))))))
  +    (let* ((code-tag (let ((*for-value* :multiple))
  +                       (cg-form `(progn ,@(lambda-information-body lambda)))))
  +           (req-count (length (lambda-information-required-args lambda)))
  +           (opt-count (length (lambda-information-optional-args lambda)))
  +           (arg-count (+ req-count opt-count))
  +           (stack-arg-count (max 0 (- arg-count 5))))
         (when code-tag
  -        (cond ((eql code-tag :multiple)
  -               ;; FIXME. Not right when >5 arguments are supplied.
  -               (emit `(sys.lap-x86:mov64 :rbx :lfp)
  -                     `(sys.lap-x86:mov64 :lfp (:cfp -8))
  -                     `(sys.lap-x86:leave)
  -                     `(sys.lap-x86:ret)))
  -              (t (load-in-r8 code-tag t)
  -                 ;; FIXME. Not right when >5 arguments are supplied.
  -                 (emit `(sys.lap-x86:mov64 :rbx :lfp)
  -                       `(sys.lap-x86:mov64 :lfp (:cfp -8))
  -                       `(sys.lap-x86:mov32 :ecx 1)
  -                       `(sys.lap-x86:leave)
  -                       `(sys.lap-x86:ret))))))
  +        (unless (eql code-tag :multiple)
  +          (load-in-r8 code-tag t)
  +          (emit `(sys.lap-x86:mov32 :ecx 1)))
  +        (cond ((and (plusp stack-arg-count)
  +                    (zerop opt-count)
  +                    (not (lambda-information-rest-arg lambda)))
  +               ;; More than 5 required arguments, no &OPTIONAL or &REST.
  +               (emit `(sys.lap-x86:lea64 :rbx (:lfp ,(* stack-arg-count 8)))))
  +              ((or (and (plusp stack-arg-count)
  +                        (plusp opt-count))
  +                   (lambda-information-rest-arg lambda))
  +               ;; Many &OPTIONAL args or a &REST arg supplied. Do the full-fat pop.
  +               (emit `(sys.lap-x86:mov64 :rax (:cfp -24))
  +                     `(sys.lap-x86:xor32 :edx :edx)
  +                     `(sys.lap-x86:sub64 :rax ,(* 8 5))
  +                     `(sys.lap-x86:cmov64ng :rax :rdx)
  +                     `(sys.lap-x86:lea64 :rbx (:lfp :rax))))
  +              (t ;; 5 or fewer arguments, no &REST.
  +               (emit `(sys.lap-x86:mov64 :rbx :lfp))))
  +        (emit `(sys.lap-x86:mov64 :lfp (:cfp -8)))
  +        (emit `(sys.lap-x86:leave)
  +              `(sys.lap-x86:ret))))
       (sys.int::assemble-lap (nconc
   			    (generate-entry-code lambda)
   			    (nreverse *code-accum*)
  
positive.code: 	   `(sys.lap-x86:mov64 :r11 (:lsp 48))
  	   `(sys.lap-x86:mov64 :r12 (:lsp 56))
  	   ;; Pop all the arguments off and the two scrach slots.
  	   `(sys.lap-x86:add64 :lsp ,(* 8 8))
  	   `(sys.lap-x86:mov64 :rax (:cfp -24))
  	   `(sys.lap-x86:sub64 :rax ,(fixnum-to-raw 5))
  	   `(sys.lap-x86:cmp64 :rax 0)
  	   `(sys.lap-x86:jl ,pop-args-over)
  	   `(sys.lap-x86:add64 :lsp :rax)
  	   pop-args-over))))
       ;; No arguments on the stack at this point.
       (list `(sys.lap-x86:mov64 :lfp :lsp))
       ;; Flush stack slots.
  
negative.code: 					(length (lambda-information-optional-args lambda))))
  	     (rest-loop-head (gensym "REST-LOOP-HEAD"))
  	     (rest-loop-test (gensym "REST-LOOP-TEST"))
               (dx-rest (lexical-variable-dynamic-extent (lambda-information-rest-arg lambda))))
  	 ;; Assemble the rest list into r13.
  	 (nconc
  