VMOVDQA 和 VMOVAPS 之间的区别?

问题描述 投票:0回答:1

我阅读了 ISA 参考资料,很清楚这两条指令加载的值类型不同(整数与单精度浮点数)。我不明白的是,无论数据类型如何,加载的效果都是相同的,它应该只是将值从源复制到目标。

我的问题是,是否有一些我忽略的差异需要不同类型的说明?使用 VMOVDQA 将一些数据从内存移动到寄存器,然后对其执行浮点操作会产生一些问题吗?

assembly x86 sse avx
1个回答
0
投票

首先,区分整数数据的

VMOVDQA
和单精度浮点数据的
VMOVAPS
很重要。虽然上述两条指令的一般含义是将数据从一个寄存器传输到另一个寄存器或从内存传输到寄存器,但关键的区别在于 CPU 对您正在操作的数据的解释。这意味着使用 VMOVAPS,CPU 可以预期该数据将参与浮点计算,并以这种方式对其进行优化,而 VMOVDQA 是严格的整数数据。

如果您使用

VMOVDQA
移入了一些稍后打算将其视为浮点的数据,它可能不会立即崩溃,但可能会导致一些问题。其中一个问题可能是对齐:根据 CPU 处理的是整数还是浮点数,它可能期望以某种方式对齐数据。错误的指令可能会导致错位或内存访问效率低下。更糟糕的是,如果您尝试对这些数据进行操作,会发生什么。

话虽如此,使用 VMOVDQA 将数据作为整数移动,然后使用 ADDPS 等浮点运算对其进行操作可能会导致 CPU 误解数据,因为数据没有以这些操作的正确格式移动,这将导致错误的结果甚至崩溃。然而,这些看似简单的指令中隐含着一些关于数据最终将如何使用的期望; CPU 隐式地针对对某些类型的数据执行某些操作进行了优化。因此,选择对不同类型的数据执行复制的指令可能会导致稍后的性能和正确性方面出现一些微妙的问题。

© www.soinside.com 2019 - 2024. All rights reserved.