Para responder à sua pergunta em geral, link fornece um script que pode ser alimentado com um binário desmontado (a saída de objdump
) e tentará descobrir o conjunto mínimo de instruções necessárias. Essa técnica é necessariamente aproximada, já que um dado binário pode ter diferentes caminhos de execução dependendo do conjunto de instruções disponíveis, e tal binário pareceria exigir o "melhor" conjunto de instruções que ele suporta, mesmo que possa ser executado sem ele.
Especificamente em relação aos pacotes Debian, qualquer coisa empacotada para amd64
(o conjunto de instruções "PC" de 64 bits) deve ser capaz de rodar em qualquer CPU compatível com AMD64 ou x86-64; isso significa que ele pode usar o conjunto de instruções padrão completo de 64 bits, que inclui o SSE2, mas ele só pode usar outros recursos (incluindo aqueles que você lista) se ele fornece fallbacks para CPUs que não os suportam. Existem exceções, mas os pacotes devem indicar isso na descrição do pacote (veja, por exemplo, rr
).
O próprio kernel Linux pode adaptar seus recursos àqueles da CPU em que ele está rodando. Se for compilado para x86-64, assume que ele pode usar um TSC, CMPXCHG64 , CMOV (procure por qualquer coisa que dependa de X86_64
nesse link). Mas ele pode ser compilado para verificar em tempo de execução se recursos como AES-NI, AVX, AVX2 estão disponíveis e usá-los em particular para acelerar os cálculos de criptografia. Isso pode beneficiar qualquer programa usando esses recursos (ao custo de comutadores de contexto no kernel).
Em alguns casos, o vinculador dinâmico também pode ajudar a fornecer alternativas dependendo da CPU: libc6-i686
fornece um conjunto de bibliotecas para a arquitetura i386
que será usada automaticamente em vez dos equivalentes simples em CPUs compatíveis com o conjunto de instruções i686
(e suportando CMOV).