Comment 2 for bug 720382

Revision history for this message
Nikodemus Siivola (nikodemus) wrote :

Note to self:

Just converting the ((LAMBDA ...) ...) to (FUNCALL (LAMBDA ...) ...) is not good -- at least not until the following is fixed:

 ; GOOD
 (disassemble
  (compile nil
   `(lambda (x y)
      (declare (single-float x y))
      (+ x ((lambda (z) z) y)))))

 ; disassembly for (LAMBDA (X Y))
 ; 0485DF02: 0F28D9 MOVAPS XMM3, XMM1 ; no-arg-parsing entry point
 ; 05: F30F58DA ADDSS XMM3, XMM2
 ; 09: 66480F7EDA MOVD RDX, XMM3
 ; 0E: 48C1E220 SHL RDX, 32
 ; 12: 4883CA1A OR RDX, 26
 ; 16: 488BE5 MOV RSP, RBP
 ; 19: F8 CLC
 ; 1A: 5D POP RBP
 ; 1B: C3 RET

 ;; BAD
 (disassemble
  (compile nil
   `(lambda (x y)
      (declare (single-float x y))
        (+ x (funcall (lambda (z) z) y)))))

 ; disassembly for (LAMBDA (X Y))
 ; 048E1BF8: 488D5C24F0 LEA RBX, [RSP-16] ; no-arg-parsing entry point
 ; BFD: 4883EC18 SUB RSP, 24
 ; C01: 488B55F0 MOV RDX, [RBP-16]
 ; C05: 488B0584FFFFFF MOV RAX, [RIP-124] ; #<FUNCTION (LAMBDA
                                                              ; #) ..>
 ; C0C: B908000000 MOV ECX, 8
 ; C11: 48892B MOV [RBX], RBP
 ; C14: 488BEB MOV RBP, RBX
 ; C17: FF50FF CALL QWORD PTR [RAX-1]
 ; C1A: 480F42E3 CMOVB RSP, RBX
 ; C1E: 488BFA MOV RDI, RDX
 ; C21: 488B55F8 MOV RDX, [RBP-8]
 ; C25: 4C8D1C25E0010020 LEA R11, [#x200001E0] ; GENERIC-+
 ; C2D: 41FFD3 CALL R11
 ; C30: 480F42E3 CMOVB RSP, RBX
 ; C34: 488BE5 MOV RSP, RBP
 ; C37: F8 CLC
 ; C38: 5D POP RBP
 ; C39: C3 RET