Float para conversão inteira usando iPhones Simd Float Unit
-
16-09-2019 - |
Pergunta
Atualmente, estou tentando otimizar algum código relacionado ao DSP com o tubarão e descobri que estou perdendo muito tempo em uma conversão de bóia para inteiro:
SInt16 nextInt = nextFloat * 32768.0f + 0.5f;
Como o iPhone parece ter um co-processador ARM11 FP, estou me perguntando se posso substituir meu código pela instrução FTOSI. Há algum documentação Disponível no site do ARM, mas não tenho experiência em montagem otimizada à mão. Alguém já fez isso antes?
Eu acho que poderia entender o código com
__asm__ volatile
Mas como faço para verificar se a instrução está disponível?
Como posso passar meu valor?
EDIT1: Como Louis já apontou, esqueci de mencionar que estou compilando com "Compile for Thumb" desligado.
EDIT2: Como eu quero converter o float para o Int16 assinado e não o Int não assinado, mudei a instrução do braço de ftoui para ftosi. Este foi um erro no post original.
Solução
Essa pode ser uma pergunta óbvia, mas você tem certeza de que está mirando o braço? Por padrão, o iPhone SDK compila todos os aplicativos para o polegar, que usa o ponto flutuante de software tudo (incluindo conversão float/int).
De qualquer forma, se o dispositivo tiver um coprocessador VFP, ele tem a instrução. Você pode verificar se ele possui um coprocessador apropriado lendo o registro do FPSID e certificando -se de que ele é um modelo suportado.
Eu suspeito que é seguro assumir que todos os iPhones o apoiam. Entre outras coisas, o Assembler da Apple tem suporte para o OpCode, e o back -end do ARM LLVM o usa para as conversões de tipo, o que significa que quando a Apple eventualmente suporta LLVM no telefone, seu compilador vai gerar instruções FTOUI.