c++ - 加载 128 位混合 float+int 数据?

标签 c++ assembly x86 sse avx

我有一个具有以下组成的结构:

static constexpr uint64_t emptyStructValue { 0 };

union MyStruct {
    explicit MyStruct(uint64_t comp) : composite(comp){}

    struct{
        int16_t a;    
        bool b;
        bool c;
        float d;
    };

    uint64_t composite = 0; 

    bool hasValue(){
        return composite != emptyStructValue;
    }
};

我在另一个对象中有两个这样的结构:

class B{
    Struct s1;
    Struct s2;
};

我想知道,给定类型 B 的对象,我如何将所有 128 位加载到 SSE 寄存器并检查是否设置了单个位?

我找到了 _mm_loadu_si128() 但我的数据混合了整数和 float ?

最佳答案

实际上,如果 (sizeof(B) == 2*sizeof(uint64_t),那么我认为没有理由不按照你的建议去做。但是如果速度很重要(而且看起来就像它一样),你应该将你的 B 对象对齐到 128 位边界,这样你就可以使用 _mm_load_si128 而不是 _mm_loadu_si128

编辑添加:事实上,在 64 位模式下,使用常规操作码可能会更快。像这样的东西:

mov   rax,[rsi]
or    rax,[rsi+8]
jnz   BitSet

即使在 32 位模式下,它也可能会更快。您将不得不进行试验。

关于c++ - 加载 128 位混合 float+int 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30693828/

相关文章:

android - 如何在 Android 项目中使用 ARM 汇编代码?

assembly - 在 Linux 上以汇编形式输出整数

linux - 用汇编语言访问 errno.h

c++ - C/C++ 跨平台库允许利用 GPU 进行浮点计算

c++ - 在指针上定义运算符重载

assembly - asm中字符串的DB定义中0x0a是什么意思

c - 覆盖默认 int 8h,9h

linux - ldd 在 x86 Linux 上显示不同的地址

c++ - 使用另一个类的函数指针

C++ 在 if 语句设置条件为真和 or-ing 循环条件之间的行为差​​异