Получение SIGILL в float для фиксированной конвертации - PullRequest
0 голосов
/ 06 апреля 2010

Я получаю SIGILL после запуска следующего кода.Я не могу понять, что с ним не так.

Целевая платформа - ARM, и я пытаюсь портировать известную библиотеку (в которой содержится этот код)

void convertFloatToFixed(float nX, float nY, unsigned int &nFixed) {
    short sx = (short) (nX * 32);
    short sy = (short) (nY * 32);

    unsigned short *ux = (unsigned short*) &sx;
    unsigned short *uy = (unsigned short*) &sy;

    nFixed = (*ux << 16) | *uy;
}

Любая помощь по этому вопросу будет принята с благодарностью.*

Заранее спасибо

1 Ответ

1 голос
/ 29 сентября 2011

Некоторые процессоры ARM имеют аппаратную с плавающей запятой, а некоторые нет, поэтому возможно, что эта функция компилируется для аппаратной с плавающей запятой, но вашей платформе не хватает модуля с плавающей запятой, поэтому инструкции с плавающей запятой вызываютпроцессор сообщает о недопустимой инструкции.Если это первое вычисление с плавающей запятой в вашей тестовой программе, это, скорее всего, будет проблемой.Обратитесь к документации вашей платформы, чтобы узнать, какую опцию -march вам нужно передать gcc, или посмотрите опции компиляции, используемые какой-либо программой, которая уже работает.

Эта функция не имеет определенного поведения и без указанияЧто такое желаемое поведение, трудно предложить улучшение.Для начала попробуйте что-то вроде этого: -

void convertFloatToFixed(float nX, float nY, unsigned int &nFixed) {
    assert(nX * 32 < INT_MAX);
    assert(nY * 32 < INT_MAX);

    int sx = nX * 32;
    int sy = nY * 32;

    unsigned int ux = sx;
    unsigned int uy = sy;

    nFixed = (ux << 16) | uy;
}

Я избавился от приведения указателей, которые (как уже указывали другие) нарушают правило строгого наложения имен.Я также использовал int вместо short.Как правило, нет смысла иметь short автоматических переменных, так как они все равно расширены до int с до вычислений.(Это хорошая работа, так как смещение short на 16 битов было бы не очень полезно.) Я добавил несколько проверок, чтобы ваши отладочные сборки могли определить, переполнится ли преобразование с плавающей точкой в ​​целое, что вызываетнеопределенное поведение.

...