Arm 霓虹灯中的成对加法

Arm 霓虹灯中的成对加法,arm,simd,neon,cortex-a,Arm,Simd,Neon,Cortex A,我想在neon中添加00和01索引int64x2\u t向量的值。 我找不到任何能够实现此功能的成对添加指令 int64x2_t sum_64_2; //I am expecting result should be.. //int64_t result = sum_64_2[0] + sum_64_2[1]; 有没有关于这个逻辑的指令 您可以用两种方式编写它。该指令明确使用NEONVADD.I64指令: int64x1_t f(int64x2_t v) { return vadd_s

我想在neon中添加
00
01
索引
int64x2\u t
向量的值。 我找不到任何能够实现此功能的成对添加指令

int64x2_t sum_64_2;
//I am expecting result should be.. 
//int64_t result = sum_64_2[0] + sum_64_2[1];
  • 有没有关于这个逻辑的指令

    • 您可以用两种方式编写它。该指令明确使用NEON
      VADD.I64
      指令:

      int64x1_t f(int64x2_t v)
      {
        return vadd_s64 (vget_high_s64 (v), vget_low_s64 (v));
      }
      
      下面的一个依赖于编译器在使用NEON指令集和通用整数指令集之间进行正确选择。GCC4.9在这种情况下是正确的,但其他编译器可能不会

      int64x1_t g(int64x2_t v)
      {
        int64x1_t r;
        r=vset_lane_s64(vgetq_lane_s64(v, 0) + vgetq_lane_s64(v, 1), r, 0);
        return r;
      }
      

      针对ARM时,代码生成是高效的。对于AArch64,使用了额外的指令,但是编译器可以做得更好。

      int64x1\u t和int64变量之间有什么区别吗。根据你的回答,我可以这样写吗?:int64\u t result=f(v)//根据你的回答,它们应该是不同的。实际上,这是GCC允许的一个bug,但它会破坏太多现有代码,现在无法更改。但是,其他编译器和GCC的AARC64后端不允许这样做,因此最好避免这样做,而
      vget_lane_s64
      /
      vset_lane_s64
      内部函数应该用来在int64x1_t和int64_t之间进行转换。感谢Charles Baylis的回复。但我仍然对你的逻辑得出的结果不满意。很抱歉,可能是我做错了什么。我问了一个与NEON问题不同的问题wrt相同的实现。如果可能,请更新您的答案。看起来您在该问题中的格式字符串错误-64位值需要%lld。werewindle发布的答案是正确的。