如何将浮点常量值移动到 xmm 寄存器中?

Posted

技术标签:

【中文标题】如何将浮点常量值移动到 xmm 寄存器中?【英文标题】:How to move a floating-point constant value into an xmm register? 【发布时间】:2017-12-22 19:21:46 【问题描述】:

将值移动到 xmm 寄存器的唯一方法是首先将值移动到整数寄存器中,不知道它们被称为什么,然后进入 xmm 寄存器,例如

mov   [eax], (float)1000   ; store to memory
movss xmm1,[eax]           ; reload

mov        eax,  1000       ; move-immediate integer
cvtsi2ss   xmm1,eax         ; and convert

或者还有其他方法吗?有没有办法将一个值直接移动到 xmm 寄存器中,类似于:movss xmm1,(float)1000

【问题讨论】:

你也可以从内存中加载。没有即时版本。 【参考方案1】:

没有使用立即数加载 SSE 寄存器的指令。常见的做法是从全局常量中加载你需要的值:

const   dd 1000.0

...

        movss xmm0,[const]

【讨论】:

您当然可以使用 mov eax, imm32 / movd xmm0, eax 使用 2 条指令来完成,但是是的,静态常量通常是最好的。相关:What are the best instruction sequences to generate vector constants on the fly?.【参考方案2】:

这取决于汇编程序。

UASM:

LOADSS xmm1,1000.0

ASMC、FASM、POASM、JWasm:

mov eax,1000.0
movd xmm1,eax

NASM:

mov eax,__?float32?__(1000.0)
movd xmm1,eax

MASM、YASM、Sol_Asm:

mov eax,447A0000h
movd xmm1,eax

您还可以使用在数据部分创建常量的宏。 UASM 已经有一个内置宏FP4:

movss xmm1,FP4(1000.0)

如果你使用 ASMC、POASM、JWasm 或 MASM,你可以定义这个宏:

FP4 MACRO value
 LOCAL vname
 .const
 align 4
 vname REAL4 value
 .code
 EXITM <vname>
ENDM

【讨论】:

是从内存中加载常量还是通过整数寄存器反弹立即数的选择与汇编程序无关。奇怪的是,对于 MASM,您显示了一个在 .data 中创建常量的宏,而其他人则使用立即数。此外,这些是“汇编器”,而不是“编译器”。不同之处在于,您可以做出优化选择,例如立即与从 .rdata 加载,而不是让编译器来选择最好的。 LOADSS 大概是 UASM 提供的某种宏指令或伪指令。我找不到关于它的文档;你知道它扩展成什么实际指令吗? LOADSS 扩展为 mov eax,1000.0; vmovd xmm1,eax

以上是关于如何将浮点常量值移动到 xmm 寄存器中?的主要内容,如果未能解决你的问题,请参考以下文章

将单个浮点数移动到 xmm 寄存器

将浮点数从高 xmm 四字移动到低 xmm 四字

将 XMM 寄存器设置为重复字节模式(广播常量字节)

如何将浮点常量移入 FP 寄存器?

xmm 寄存器 sse x64 里面的值

为啥将 32 位寄存器移动到堆栈然后从堆栈移动到 xmm 寄存器?