如何将浮点常量值移动到 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 寄存器中?的主要内容,如果未能解决你的问题,请参考以下文章