Visão geral do x 64 convenções de chamada
Dois importantes modificações de x86 para x64 são a capacidade de endereçamento de 64 bits e um conjunto simples de 16 a 64-bit registra para uso geral. Dada a expandido registrar o conjunto, x64 usa apenas o __fastcall convenção de chamada e um baseado em RISC manipulação de exceção modelo. O __fastcall modelo usa registros para os quatro primeiros argumentos e o quadro de pilha para passar outros parâmetros.
A opção de compilador a seguir ajuda a otimizar o seu aplicativo para x64:
Convenção de chamada
O x64 Application Binary Interface (ABI) é um 4 registrar a chamada de fast convenção de chamada, com apoio de pilha para esses registros. Há uma correspondência estrita entre os argumentos em uma função e os registradores para esses argumentos. Qualquer argumento que não couber em 8 bytes, ou não é 1, 2, 4 ou 8 bytes, deve ser passado por referência. Não há nenhuma tentativa de se espalhar de um único argumento por vários registros. A pilha de registro de 87 x é utilizada. Ele pode ser usado, mas deve ser considerado voláteis em chamadas de função. Ponto flutuante de todas as operações são feitas usando o 16 registra de XMM. Os argumentos são passados nos registradores RCX, RDX, R8 e R9. Se os argumentos são float/dupla, eles são passados em XMM0L, XMM1L, XMM2L e XMM3L. os argumentos de 16 bytes são passados por referência. Parâmetro passando é descrito em detalhes em Passagem de parâmetro. Além desses registradores RAX R10, R11, XMM4 e XMM5 são voláteis. Todos os outros registradores são não-volátil. Uso do registro está documentado em detalhes em Registrar o uso e Registradores de salvo Caller/Callee.
O chamador é responsável por alocar espaço para os parâmetros para o chamador e deve sempre alocar espaço suficiente para os parâmetros de registro de 4, mesmo se o chamador não tem que muitos parâmetros. Isso ajuda a simplicidade de funções de c unprototyped de suporte e funções de C/C++ vararg. Para funções vararg ou unprototyped, quaisquer valores de float devem ser duplicadas no registrador de propósito geral correspondente. Todos os parâmetros acima da primeira 4 devem ser armazenados na pilha, acima o armazenamento de backup para 4 primeiro, antes da chamada. Detalhes da função vararg podem ser encontradas em VarArgs. Informações de função Unprototyped são detalhadas na Funções de Unprototyped.
Alinhamento
A maioria das estruturas são alinhadas com o seu alinhamento natural. As principais exceções são o ponteiro de pilha e a memória malloc ou alloca, que são alinhados para 16 bytes, para auxiliar o desempenho. Alinhamento acima de 16 bytes deve ser feito manualmente, mas como 16 bytes é um tamanho comum de alinhamento para operações de XMM, isso deve ser suficiente para a maioria dos códigos. Para obter mais informações sobre o layout da estrutura e o alinhamento, consulte Tipos e armazenamento. Para obter informações sobre o layout da pilha, consulte Uso da pilha.
Unwindability
Todas as funções de folha [funções chamam uma função nem alocar qualquer espaço de pilha próprios] devem ser anotadas com dados [chamados xdata ou ehdata, que é apontada do pdata] que descreve o sistema operacional como corretamente desenrolá-los para recuperar os registros não-volátil. Prologs e epilogs são altamente restritos, para que possa ser corretamente descritos em xdata. O ponteiro de pilha precisa ser alinhado com 16 bytes, exceto para as funções de folha, em qualquer região de código que não faça parte de um epilog ou um prólogo. Para obter detalhes sobre a estrutura apropriada de prólogo da função e epilogs, consulte Prólogo e Epilog. Para obter mais informações sobre a manipulação de exceção e pdata desenrolar/tratamento de exceção e xdata consulte Tratamento (x64) de exceção.