ПРЕДПОСЫЛКИ
При использовании 64-битного стального банка Common Lisp в Windows для тривиальной функции идентификации:
(defun a (x)
(declare (fixnum x))
(declare (optimize (speed 3) (safety 0)))
(the fixnum x))
Я считаю, что разборка задана как:
* (disassemble 'a)
; disassembly for A
; Size: 13 bytes
; 02D7DFA6: 84042500000F20 TEST AL, [#x200F0000] ; safepoint
; no-arg-parsing entry point
; AD: 488BE5 MOV RSP, RBP
; B0: F8 CLC
; B1: 5D POP RBP
; B2: C3 RET
Я понимаю, что строки:
mov rsp, rbp
pop rbp
ret
выполнить стандартный возврат из функциональных операций, но я не понимаю, почему существуют строки:
TEST AL, [#x200F0000] // My understanding is that this sets flags based on bitwise and of AL and contents of memory 0x200F0000
и
CLC // My understanding is that this clears the carry flag.
ВОПРОСЫ
- Почему SBCL генерирует тестовую инструкцию, но никогда не использует флаги?
- Почему SBCL очищает флаг переноса перед возвратом из функции?