Преобразование с плавающей точкой в ​​целое число с использованием iPhone-SIMD-плавающего модуля

100
7

В настоящее время я пытаюсь оптимизировать некоторый код, связанный с DSP, с Shark и обнаружил, что я трачу много времени на преобразование с плавающей точкой в ​​целое число:


SInt16 nextInt = nextFloat * 32768.0f + 0.5f;

Поскольку у iPhone, похоже, есть сопроцессор ARM11 FP, мне интересно, могу ли я заменить свой код инструкцией FTOSI.
Существует некоторая документация, доступная на веб-сайте ARM, но у меня нет опыта в создании ручной оптимизации сборки.
Кто-то сделал это раньше?

Я думаю, что я мог бы встроить код с помощью


__asm__ volatile

Но как проверить, доступна ли инструкция?

Как передать значение?


EDIT1:
Как уже указывал Луис, я забыл упомянуть, что компиляция с "Компиляция для большого пальца" отключена.


EDIT2:
Поскольку я хочу преобразовать float в подписанный Int16, а не unsigned Int, я изменил инструкцию ARM от FTOUI до FTOSI. Это была ошибка в исходном сообщении.

спросил(а) 2021-01-19T17:48:13+03:00 6 месяцев, 2 недели назад
1
Решение
90

Это может быть очевидный вопрос, но уверены ли вы, что вы нацеливаете ARM? По умолчанию iPhone SDK компилирует все приложения для THUMB, который использует программное обеспечение с плавающей точкой (включая преобразование float/int).


В любом случае, если у устройства есть сопроцессор VFP, он имеет инструкцию. Вы можете проверить, есть ли у него соответствующий сопроцессор, прочитав регистр FPSID и убедившись, что это поддерживаемая модель.

Я подозреваю, что безопасно предположить, что все iPhone поддерживают его. Среди прочего, у ассемблера Apple есть поддержка кода операции, а бэкенд LLVM ARM использует его для преобразования типов, а это значит, что когда Apple в конечном итоге поддерживает LLVM на телефоне, их компилятор будет генерировать инструкции FTOUI.

ответил(а) 2021-01-19T17:48:13+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема