gpt4 book ai didi

c - 如何最好地模拟 _mm_slli_si128(128 位位移)的逻辑含义,而不是 _mm_bslli_si128

转载 作者:行者123 更新时间:2023-12-03 23:33:31 25 4
gpt4 key购买 nike

查看英特尔内在指南,我看到了这个指令。查看命名模式,含义应该很清楚:“将 128 位寄存器左移固定位数”,但事实并非如此。实际上,它移动了固定数量的字节,这使得它与 _mm_bslli_si128 完全相同。 .

  • 这是疏忽吗?它不应该像 _mm_slli_epi32 那样按位移位吗?或 _mm_slli_epi64 ?
  • 如果不是,我应该在哪种情况下使用它而不是 _mm_bslli_si128 ?
  • 是否有正确执行此操作的汇编指令?
  • 用较小的类次模拟这一点的最佳方法是什么?
  • 最佳答案

    1 这不是疏忽。该指令确实按字节移动,即 8 位的倍数。
    2 没关系,_mm_slli_si128_mm_bslli_si128是等价的,都编译成 pslldq SSE2 指令。
    至于仿真,假设你有 C++/17,我会这样做。如果您正在编写 C++/14,请替换 if constexpr正常 if , 同时添加一条消息到 static_assert .

    template<int i>
    inline __m128i shiftLeftBits( __m128i vec )
    {
    static_assert( i >= 0 && i < 128 );
    // Handle couple trivial cases
    if constexpr( 0 == i )
    return vec;
    if constexpr( 0 == ( i % 8 ) )
    return _mm_slli_si128( vec, i / 8 );

    if constexpr( i > 64 )
    {
    // Shifting by more than 8 bytes, the lowest half will be all zeros
    vec = _mm_slli_si128( vec, 8 );
    return _mm_slli_epi64( vec, i - 64 );
    }
    else
    {
    // Shifting by less than 8 bytes.
    // Need to propagate a few bits across 64-bit lanes.
    __m128i low = _mm_slli_si128( vec, 8 );
    __m128i high = _mm_slli_epi64( vec, i );
    low = _mm_srli_epi64( low, 64 - i );
    return _mm_or_si128( low, high );
    }
    }

    关于c - 如何最好地模拟 _mm_slli_si128(128 位位移)的逻辑含义,而不是 _mm_bslli_si128,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66091420/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com