非 SSE2 CPU 上 SSE2 movq 指令的快速解决方法

Posted

技术标签:

【中文标题】非 SSE2 CPU 上 SSE2 movq 指令的快速解决方法【英文标题】:Quick workaround for SSE2 movq instruction on non-SSE2 CPUs 【发布时间】:2021-02-19 18:13:02 【问题描述】:

我如何将movq SSE2 指令转换为简单的代码 sn-p,然后我可以将其修补到产生的原始 EXE 中?如果您能提供示例直接说明以用作替代“模板”,那就更好了!

我最感兴趣的是主要使用 C 将这种基于模板的替换写入我的 CodeBlocks 项目,所以我更喜欢它是内联 ASM 形式。这样,我可以通过 ASM 调用我用来修补 EXE 的同一 C 中的内联代码段以编程方式将 subst 修补到 5 字节长的原始指令中(其余代码已经编写)。

我知道这个问题听起来比您想的要笼统一些,但我们将不胜感激。提前致谢!

【问题讨论】:

有帮助吗:***.com/questions/3852909/movq-assembly-function 澄清一下:在我说movq %xmm0, [some memory location](这是Linux中的CodeBlocks)的情况下,我在XMM0 reg为0时得到它,例如xor %eax, %eax 然后在该位置将其修补到两个连续的 DWORDS 上。但是,如果之前在 XMMn 中收取了显着的价值怎么办?如何将值“释放”到“正常”寄存器中,然后再放入内存中? (抱歉,我非常了解 x86 标准 ASM 的方式,但之前没有使用 SSE/SSE2 的经验......) @DanielA.White 谢谢,不确定是否适用。有什么标准方法可以将movq分成两半,可以在无 SSE2 的 CPU 中执行吗?我需要使用标准寄存器吗?是否有任何没有 SSE2 的“将 XMMn 的一半写入 DWORD”我可以为当前加载的 FP 值使用两次?我很困惑,因为我看到了 CPU 处理和正常执行的其他一些 SSE(我猜不是 2 条)指令。这只是我烦恼的原始代码中的几个 movq! (这是编译后的代码,如果我有源代码,我可以使用 SSE2-less swtich/es 重新编译...) 【参考方案1】:

只有 MMX/SSE,选项有限。

内存中的movq 例如movq xmm4, [edx] 可以模拟为:

xorps xmm4, xmm4
movlps xmm4, [edi]

一个movq 到内存例如movq [edx], xmm5 可以模拟:

movlps [edx], xmm5

【讨论】:

以上是关于非 SSE2 CPU 上 SSE2 movq 指令的快速解决方法的主要内容,如果未能解决你的问题,请参考以下文章

MSI 安装条件以检查 CPU 的 SSE2 功能?

将 TBB 与 SSE2 内在函数混合

SSE/SSE2 指令的打包和解包数据?

sse2 指令集未启用

#error “SSE2 指令集未启用”通过 pip 安装 scikit-bio 时

是否启用了 SSE2 指令?