LINUX.ORG.RU

История изменений

Исправление Zubok, (текущая версия) :

В SBCL, когда возвращается несколько значений, первые три возвращаются через регистры, а потом - через стек. Это на x86-64, резумеется. Разные реализации по-разному будут делать. По сути своей values - это больше для оптимизации:

* (defun test () (values 1.1 1.2 'a 123))
TEST
* (disassemble 'test)
; disassembly for TEST
; Size: 51 bytes. Origin: #x52C29447                          ; TEST
; 47:       488B15D2FFFFFF   MOV RDX, [RIP-46]                ; 1.1
; 4E:       488B3DC3FFFFFF   MOV RDI, [RIP-61]                ; 1.2
; 55:       488B35B4FFFFFF   MOV RSI, [RIP-76]                ; 'A
; 5C:       48C745F0F6000000 MOV QWORD PTR [RBP-16], 246      ; 123
; 64:       488D5D10         LEA RBX, [RBP+16]
; 68:       B908000000       MOV ECX, 8
; 6D:       F9               STC
; 6E:       488D65F0         LEA RSP, [RBP-16]
; 72:       488B6D00         MOV RBP, [RBP]
; 76:       FF73F8           PUSH QWORD PTR [RBX-8]
; 79:       C3               RET
NIL

* (defun test () (values 1.1 1.2 'a))    
WARNING: redefining COMMON-LISP-USER::TEST in DEFUN
TEST
* (disassemble 'test)
; disassembly for TEST
; Size: 36 bytes. Origin: #x52C29506                          ; TEST
; 06:       488B15D3FFFFFF   MOV RDX, [RIP-45]                ; 1.1
; 0D:       488B3DC4FFFFFF   MOV RDI, [RIP-60]                ; 1.2
; 14:       488B35B5FFFFFF   MOV RSI, [RIP-75]                ; 'A
; 1B:       488D5D10         LEA RBX, [RBP+16]
; 1F:       B906000000       MOV ECX, 6
; 24:       F9               STC
; 25:       488BE5           MOV RSP, RBP
; 28:       5D               POP RBP
; 29:       C3               RET
NIL
* 

Исходная версия Zubok, :

В SBCL, когда возвращается несколько значений, первые три возвращаются через регистры, а потом - через стек. Это на x86-64, резумеется. Разные реализации по-разному будут делать. По сути своей values - это больше для оптимизации:

* (defun test () (values 1.1 1.2 'a 123))
TEST
* (disassemble 'test)
; disassembly for TEST
; Size: 51 bytes. Origin: #x52C29447                          ; TEST
; 47:       488B15D2FFFFFF   MOV RDX, [RIP-46]                ; 1.1
; 4E:       488B3DC3FFFFFF   MOV RDI, [RIP-61]                ; 1.2
; 55:       488B35B4FFFFFF   MOV RSI, [RIP-76]                ; 'A
; 5C:       48C745F0F6000000 MOV QWORD PTR [RBP-16], 246
; 64:       488D5D10         LEA RBX, [RBP+16]
; 68:       B908000000       MOV ECX, 8
; 6D:       F9               STC
; 6E:       488D65F0         LEA RSP, [RBP-16]
; 72:       488B6D00         MOV RBP, [RBP]
; 76:       FF73F8           PUSH QWORD PTR [RBX-8]
; 79:       C3               RET
NIL

* (defun test () (values 1.1 1.2 'a))    
WARNING: redefining COMMON-LISP-USER::TEST in DEFUN
TEST
* (disassemble 'test)
; disassembly for TEST
; Size: 36 bytes. Origin: #x52C29506                          ; TEST
; 06:       488B15D3FFFFFF   MOV RDX, [RIP-45]                ; 1.1
; 0D:       488B3DC4FFFFFF   MOV RDI, [RIP-60]                ; 1.2
; 14:       488B35B5FFFFFF   MOV RSI, [RIP-75]                ; 'A
; 1B:       488D5D10         LEA RBX, [RBP+16]
; 1F:       B906000000       MOV ECX, 6
; 24:       F9               STC
; 25:       488BE5           MOV RSP, RBP
; 28:       5D               POP RBP
; 29:       C3               RET
NIL
*