On 8689 day of my life Raymond Toy wrote:
> If you really MUST have fast fixnum, here is one way to do it in
> cmucl.
>
> (in-package :vm)
> (defknown fixnum+ (fixnum fixnum)
>   fixnum
>   (movable foldable flushable))
>
> (define-vop (fixnum-add fast-+/fixnum=>fixnum)
>   (:translate fixnum+))
>
> (defun fixnum+ (x y)
>   (declare (fixnum x y))
>   (fixnum+ x y))
>
> Then
>
> (vm:fixnum+ most-positive-fixnum 1) => -536870912

It's exactly what I want!  But when I try (fixnum+ anything1
anything2), it just loops and cons a memory...  I can't fix it without
your help, because I don't understand anyting here :(

Looks like 

> (defun fixnum+ (x y)
>   (declare (fixnum x y))
>   (fixnum+ x y))

is compiled as tail-call function:

CL-USER> (disassemble 'fixnum+)
488ED8A0:       .ENTRY FIXNUM+(x y)          ; (FUNCTION (FIXNUM FIXNUM) NIL)
      B8:       POP     DWORD PTR [EBP-8]
      BB:       LEA     ESP, [EBP-32]

      BE:       CMP     ECX, 8
      C1:       JNE     L1
      C3:       TEST    DL, 3
      C6:       JNE     L2
      C8:       TEST    EDI, 3
      CE:       JNE     L3
      D0: L0:   JMP     L0                   ; No-arg-parsing entry point
      D2:       NOP
      D3:       NOP
      D4:       NOP
      D5:       NOP
      D6:       NOP
      D7:       NOP
      D8: L1:   BREAK   10                   ; Error trap
      DA:       BYTE    #x02
      DB:       BYTE    #x19                 ; INVALID-ARGUMENT-COUNT-ERROR
      DC:       BYTE    #x4D                 ; ECX
      DD: L2:   BREAK   10                   ; Error trap
      DF:       BYTE    #x02
      E0:       BYTE    #x0A                 ; OBJECT-NOT-FIXNUM-ERROR
      E1:       BYTE    #x8E                 ; EDX
      E2: L3:   BREAK   10                   ; Error trap
      E4:       BYTE    #x04
      E5:       BYTE    #x0A                 ; OBJECT-NOT-FIXNUM-ERROR
      E6:       BYTE    #xFE, #xCE, #x01     ; EDI

-- 
Ivan Boldyrev

                                                  Is 'morning' a gerund?


Reply via email to