2014-10-20 2 views
0

Я пытаюсь перекрестно скомпилировать некоторый код с datatypes NEON с g ++ 4.9.1, но я продолжаю сбой компилятора. Не разрешен ли этот тип операции или это проблема с компилятором? Моя ОС Ubuntu 12.04, и я использую нарукавную GCC "GCC версии 4.9.1 (Ubuntu/Linaro 4.9.1-10ubuntu2)"Сбой компилятора с ARM NEON datatypes

Имя файла: crash.cpp

#include <arm_neon.h> 

void crash(
    const unsigned short * in, 
    unsigned short * out, 
    const int shift) 
{ 
    for(int x=0; x<200; x+=8) { 
    const uint16x8_t inValue = vld1q_u16(&in[x]); 

    const uint16x8_t normalizedValue = inValue >> shift; 

    vst1q_u16(&out[x], normalizedValue); 
    } 
} 

опции компиляции:

arm-linux-gnueabihf-g++-4.9 -mfpu=neon-vfpv4 -c crash.cpp -o crash.o 

Выход:

crash.cpp: In function ‘void crash(const short unsigned int*, short unsigned int*, int)’: 
crash.cpp:11:51: internal compiler error: in copy_to_mode_reg, at explow.c:654 
    const uint16x8_t normalizedValue = inValue >> shift; 
               ^
Please submit a full bug report, 
with preprocessed source if appropriate. 
See <file:///usr/share/doc/gcc-4.9/README.Bugs> for instructions. 
Preprocessed source stored into /tmp/ccfz4aZr.out file, please attach this to your bugreport. 

Этот код компилируется нормально, если я заменить "беззнаковое короткое" с "без знака Int", то «uint16x8_ t "с" uint32x4_t "и суффиксами" _u16 "с суффиксами" _u32 ".

+0

Предоставляет ли GCC автоматические перегруженные операторы для встроенных типов? Я бы подумал, что вы должны делать все с явным intrisics ('vshl' в этом случае). – Notlikethat

+0

Автоматический сдвиг работает с обычным ints, хотя он падает с 16-битным коротким ints. – Pete

+0

Вы создали отчет об ошибке в GCC? – auselen

ответ

2

Это ошибка компилятора, вы не должны получать внутреннюю ошибку компилятора.

Вы должны иметь возможность обойти его, выполнив смену с встроенными функциями NEON. Это также более переносимо для других компиляторов, так как определение NEON intrinsics не включает использование операторов C в типах NEON - это расширение GCC.

#include <arm_neon.h> 

void crash(
    const unsigned short * in, 
    unsigned short * out, 
    const int shift) 
{ 
    int16x8_t vshift = vdupq_n_s16(-shift); 
    for(int x=0; x<200; x+=8) { 
    const uint16x8_t inValue = vld1q_u16(&in[x]); 

    const uint16x8_t normalizedValue = vshlq_u16(inValue, vshift); 

    vst1q_u16(&out[x], normalizedValue); 
    } 
} 
Смежные вопросы