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

时间:2015-06-07 13:00:56

标签: 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(),但我的数据混合了整数和浮点数?

1 个答案:

答案 0 :(得分:3)

实际上,如果(sizeof(B) == 2*sizeof(uint64_t),我认为没有理由不做你的建议。但是,如果速度很重要(看起来很像),则应将B对象与128位边界对齐,这样就可以使用_mm_load_si128代替_mm_loadu_si128。< / p>

编辑添加:实际上,在64位模式下,使用常规操作码可能更快。类似的东西:

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

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