编译器崩溃与ARM NEON数据类型

时间:2014-10-20 20:38:40

标签: gcc crash arm simd neon

我正在尝试使用g ++ 4.9.1与NEON数据类型交叉编译一些代码,但是我一直在崩溃编译器。是不允许这种类型的操作,还是编译器问题?我的操作系统是Ubuntu 12.04,我正在使用arm-gcc“gcc version 4.9.1(Ubuntu / Linaro 4.9.1-10ubuntu2)”

文件名: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.

如果我将“unsigned short”替换为“unsigned int”,将“uint16x8_t”替换为“uint32x4_t”,将“_u16”后缀替换为“_u32”后缀,则此代码编译良好。

1 个答案:

答案 0 :(得分:2)

这是一个编译器错误,你不应该得到内部编译器错误。

你应该能够通过使用NEON内在函数执行转换来解决它。这对于其他编译器来说也更具可移植性,因为NEON内在函数定义不包括在NEON类型上使用C运算符 - 它是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);
  }
}