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?