x86 - 设置 AVX 寄存器(__m256i)中的各个位,需要 "random access"运算符

标签 x86 bit-manipulation simd intrinsics avx

所以,我想设置 __m256i 寄存器的单个位。

比如说,我的 __m256i 包含:[ 1 0 1 0 | 1 0 1 0 | 1 0 1 0 ... | 1 0 1 0],如何设置和取消设置第 n 位?

最佳答案

这是一个可以在向量内设置单独位的函数的实现:

#include <immintrin.h>
#include <assert.h>

void SetBit(__m256i & vector, size_t position, bool value)
{
    assert(position <= 255);
    uint8_t lut[32] = { 0 };
    lut[position >> 3] = 1 << (position & 7);
    __m256i mask = _mm256_loadu_si256((__m256i*)lut);
    if (value)
        vector = _mm256_or_si256(mask, vector);
    else
        vector = _mm256_andnot_si256(mask, vector);
}

int main(int argc, char* argv[])
{
    __m256i a = _mm256_set1_epi8(-1);
    SetBit(a, 54, false);

    __m256i b = _mm256_set1_epi8(0);
    SetBit(b, 54, true);

    return 0;
}

关于x86 - 设置 AVX 寄存器(__m256i)中的各个位,需要 "random access"运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39475525/

相关文章:

multithreading - x86 上的两个后续 CPU 存储是否刷新到缓存以保持顺序?

c# - 为什么 C# 结构实例方法在结构字段上调用实例方法首先检查 ecx?

满足方程的按位变换算法

javascript - javascript中>>>按位移位运算符的用途是什么?

c++ - 打印 _mm_cmpeq_epi8 的输出(__m128i 类型)

node.js - 是否可以在 32 位环境上运行 Edge.js?

x86 - sfence 文档中的 "serializing operation"是什么意思?

algorithm - 快速倍增和斐波那契算法解释

c++ - Clang内置矩阵和 vector 扩展: efficient matrix-vector multiplication

c++ - 使用 SIMD 指令平滑样条