uint64 数组到 uint128 用于 SSE2
uint64 array to uint128 for SSE2
在 asm 中定义数组时以及从 c++ 传递到 asm 时,我有两个类似的问题。代码内联工作正常,但我需要将它们与 cpp 分离到一个 asm 文件中。编译器可能不会引发错误或警告,但每次运行的最终结果都是随机的,并且应该像内联时一样恒定。
下面的代码在MMX(movq mm6,twosMask_W
)中使用时有效,但我需要SSE2的等效代码。我以为这会起作用,但我似乎不正确。
.data
align 16
twosMask_W qword 2 dup(0002000200020002h)
.code
...
movdqa xmm6,oword ptr twosMask_W
...
第二个问题是当我将thresh128
数组从 C++ 传递到 asm 时(同样对于 SSE2):
//C++
uint64_t thresh128[2];
thresh128[0] = ((thresh-1)<<8)+(thresh-1);
thresh128[0] += (thresh128[0]<<48)+(thresh128[0]<<32)+(thresh128[0]<<16);
thresh128[1] = thresh128[0];
sendToASM(thresh128)
//ASM
;There are more parameters that utilize the registers but not listed.
receivedFromCPP proc thresh:qword
public receivedFromCPP
...
movdqu xmm4,oword ptr thresh
...
我尝试在过程中将 thresh 作为 oword 参数,但它没有产生任何结果。我确定我的语法或参数类型错误。任何帮助将不胜感激。
注意:在VS2013中为x86使用MASM编译。
好吧,我测试了第一部分,它似乎有效 - 所以我不能说任何与此特定问题相关的内容。
关于第二个问题:您似乎以 64 位模式在堆栈上传递了一个 32 位 qword(其中 64 位推送没有直接操作码),所以它将是 2 个推送......
receivedFromCPP proc thresh:qword
但期望指向堆栈上的 128 位值的指针:
movdqu xmm4,oword ptr thresh
还要记住 x86 的小端序 - 根据编译器选择如何推送 2*64 位数组,它可能与导致看似随机值的小端值不同。
编辑:由于堆栈是颠倒增长的,因此必须以相反的顺序推送128位值才能由EBP引用它。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- SSE2优化用于从RGB565转换为RGB888(无alpha通道)
- uint64 数组到 uint128 用于 SSE2
- 用于灰度到ARGB转换的c++ SSE2或AVX2特性