Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将小常数加载到向量中?_C_Powerpc_Altivec - Fatal编程技术网

C 如何将小常数加载到向量中?

C 如何将小常数加载到向量中?,c,powerpc,altivec,C,Powerpc,Altivec,请原谅我对以下问题的无知。我们支持GCC4.8及以上版本和IBMXLC/C++12及以上版本。我们还在AIX和Linux上支持big和little endian。编译器和平台使得代码相当混乱 我们要将常数1加载到VSX寄存器中。这是我们能够编写的代码,但它似乎是错误的,因为它太复杂了。宏XLC_版本、GCC_版本和LITTLE_ENDIAN有它们的习惯含义,因此省略了导致它们的附加预处理器宏 typedef __vector unsigned char uint8x16_p8; typ

请原谅我对以下问题的无知。我们支持GCC4.8及以上版本和IBMXLC/C++12及以上版本。我们还在AIX和Linux上支持big和little endian。编译器和平台使得代码相当混乱

我们要将常数1加载到VSX寄存器中。这是我们能够编写的代码,但它似乎是错误的,因为它太复杂了。宏XLC_版本、GCC_版本和LITTLE_ENDIAN有它们的习惯含义,因此省略了导致它们的附加预处理器宏

typedef __vector unsigned char      uint8x16_p8;
typedef __vector unsigned long long uint64x2_p8;

#if defined(XLC_VERSION)
    typedef uint8x16_p8 VectorType;
#elif defined(GCC_VERSION)
    typedef uint64x2_p8 VectorType;
#endif

#if defined(LITTLE_ENDIAN)
    const VectorType one = {1};
#else
    const VectorType one = (VectorType)((uint64x2_p8){0,1});
#endif
不明显的是,xlc/C++支持所有数据安排,并且有丰富的API集。当IBM编译器不产生难以理解的警告和错误时,使用它是一件轻而易举的事

返回到4.8的GCC只支持64x2安排,并且它只有API的一个子集。例如,GCC缺少用于8x16安排的IBM API,并且GCC没有vec_reve,这将使endian反转变得容易

我真正想做的是这样的事情,让它在任何地方都能工作,但它无法编译:

VectorType one = 1;
有没有一种不太复杂的方法将小常数加载到向量寄存器中?

您的示例

VectorType one = 1;
正在尝试将标量指定给向量。试着用一个向量代替。对于16个字符的向量,这将是:

vector char one = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
gcc-4.8似乎可以编译此文件;我手头没有LE4.8,但至少适用于big endian:

   0:   10 41 03 0c     vspltisb v2,1
带有gcc-5的LE也很好

   0:   0c 03 41 10     vspltisb v2,1
你的例子

VectorType one = 1;
正在尝试将标量指定给向量。试着用一个向量代替。对于16个字符的向量,这将是:

vector char one = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
gcc-4.8似乎可以编译此文件;我手头没有LE4.8,但至少适用于big endian:

   0:   10 41 03 0c     vspltisb v2,1
带有gcc-5的LE也很好

   0:   0c 03 41 10     vspltisb v2,1

您可能需要检查BCD_INIT示例。它使用宏来反转向量初始化


关于vec_reve:它是vec_perm的语法糖。您可以将其实现为标头中的内联函数或库函数,并将其用于没有它的编译器。

您可能需要检查BCD_INIT示例。它使用宏来反转向量初始化


关于vec_reve:它是vec_perm的语法糖。您可以将其实现为标头中的内联函数或库函数,并将其用于没有它的编译器。

噢,您是否尝试将1加载到每个向量槽中?还是只有一个?@Jeremy-只有一个;没有一个splat'd。我遇到的问题是,我们必须手动处理endian转换。例如,请参见。我想要一些不那么复杂、更直观的东西,比如不可编译的语句。@Jeremy-信不信由你,我花了6个小时在AES/CTR模式下跟踪一个失败的自检。这是因为我想要VectorType 1=1;所以我写了VectorType one={1};。它在小型endian Linux机器上运行良好,但在大型endian AIX机器上失败。现在我想添加一个控件来避免这个问题。这个问题是试图找到我可以设置的控制,这样问题就不会在将来出现。不要嘲笑这个值。是真正的价值造成了问题。也不要嘲笑这六个小时。我们在AIX和Linux上有一半的调试器可以工作。AIX似乎完全缺少一些工具,比如反汇编程序,因此我可以脱机检查对象文件。这是一次非常痛苦的经历。@jww关于AIX上的反汇编程序:XL编译器可以通过选项生成汇编文件而不是对象文件。还可以通过-qlist选项在清单文件*.lst中获取伪程序集。最后,XL编译器在/opt/IBM/*/exe/目录中附带一个dis工具。例如,dis a.out创建a.out.s.oh,您是否尝试将1加载到每个向量槽中?还是只有一个?@Jeremy-只有一个;没有一个splat'd。我遇到的问题是,我们必须手动处理endian转换。例如,请参见。我想要一些不那么复杂、更直观的东西,比如不可编译的语句。@Jeremy-信不信由你,我花了6个小时在AES/CTR模式下跟踪一个失败的自检。这是因为我想要VectorType 1=1;所以我写了VectorType one={1};。它在小型endian Linux机器上运行良好,但在大型endian AIX机器上失败。现在我想添加一个控件来避免这个问题。这个问题是试图找到我可以设置的控制,这样问题就不会在将来出现。不要嘲笑这个值。是真正的价值造成了问题。也不要嘲笑这六个小时。我们在AIX和Linux上有一半的调试器可以工作。AIX似乎完全缺少一些工具,比如反汇编程序,因此我可以脱机检查对象文件。这是一次非常痛苦的经历。@jww关于AIX上的反汇编程序:XL编译器可以通过选项生成汇编文件而不是对象文件。还可以通过-qlist选项在清单文件*.lst中获取伪程序集。 最后,XL编译器在/opt/IBM/*/exe/目录中附带一个dis工具。例如,dis a.out创建a.out.s。