2014-11-24 108 views
1

我有一对存储在eax和ecx中的32位浮点数。我可以直接将它们加载到FPU中进行操作,而不必先存储到内存中?这会显着简化一些编译器代码,但fld似乎只能在内存上运行。在eax/ecx寄存器中添加32位浮点数?

+1

不,你不能。就编译器代码而言,如果你必须通过内存,我怀疑它会产生重大差异。你可以很容易地模拟'fld r32'('push r32; fld [esp]; pop r32')。无论如何,考虑使用SSE(如果可用)。 – Jester 2014-11-24 03:13:41

+0

@Jester我打算使用SSE,对于那个push-fld-pop示例,等效的SSE代码是什么? – Rotten194 2014-11-24 03:14:49

+0

您可以使用'MOVD'指令直接移动到SSE寄存器。你可以做'movd xmm0,eax; movd xmm1,ecx; addss xmm0,xmm1;'然后根据需要向后移动。当然你可以使用xmm寄存器作为你的浮点数:) – Jester 2014-11-24 03:16:36

回答

5

不,你不能那样做。至于生成代码的话,你可以模拟fld r32足够容易地通过例如下列序列(大小进行了优化;)):

push r32 
fld [esp] 
pop r32 

考虑使用SSE如果可用,这确实提供直接GPR到XMM移动使用movd指令。添加两个寄存器则可能类似于:

movd xmm0, eax 
movd xmm1, ecx 
addss xmm0, xmm1 

如果您需要的结果在GPR,您可以使用其他movd移回。

相关问题