如何有效地定义128位常量?

ana*_*lyg 5 c optimization sse intrinsics visual-studio

我正在使用MS Visual Studio中的SSE2指令集.我用它来做16位数据的计算.

假设我有8个值加载到SSE寄存器中.我想为42所有这些添加常量(例如).这是我希望我的代码看起来如何.

__m128i values; // 8 values, 16 bits each
const __m128i my_const_42 = ???; // What should i write here?
values = _mm_add_epi16(values, my_const_2); // Add 42 to the 8 values
Run Code Online (Sandbox Code Playgroud)

现在,我该如何定义常数?以下两种方式有效,但一种方法效率低下,另一方面很难看.

  1. my_const_42 = _mm_set_epi16(42, 42, 42, 42, 42, 42, 42, 42) - 编译器生成8个命令来"构建"常量
  2. my_const_42 = {42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0} - 很难理解发生了什么; 改变42到如-42不是小事

有没有办法更方便地表达128位常数?

Han*_*ant 8

百分之九十的战斗是找到正确的内在.MSDN Library组织得很好,从这个页面开始.从那里,向下钻取:

  • 您知道要使用"MMX,SSE和SSE2内在函数",请单击该链接
  • 您知道要使用"Streaming SIMD Extensions 2",请单击该链接
  • 下一个有吸引力的链接是"整数内存和初始化",因为您不需要浮点数
  • 您将获得两个相关链接,加载和设置操作
  • 加载只是让你找到你已经找到的

套装是金色的,流行的 _mm_set1_epi16 (short w)