0

我想将值从%rax或内存传递到%xmm0,这个值应该是双倍的,所以我以后可以乘以%xmm0某事。

目前我正在使用这个:

movq    $1, -72(%rbp)
movq    -72(%rbp), %rax
movsd   -72(%rbp), %xmm0  # 1 should be
movsd   -8(%rbp), %xmm1   # 5
mulss   %xmm0, %xmm1      # 5 shoud be

但是在 %mm0(double) 下,我得到 0,而不是 1。当我相乘时,它返回 0... :(

xmm0           {
  v4_float = {0x0, 0x0, 0x0, 0x0}, 
  v2_double = {0x0, 0x0}, 
  v16_int8 = {0x1, 0x0 <repeats 15 times>}, 
  v8_int16 = {0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, 
  v4_int32 = {0x1, 0x0, 0x0, 0x0}, 
  v2_int64 = {0x1, 0x0}, 
  uint128 = 0x00000000000000000000000000000001
}

任何想法如何将整数传递给 xmm0?或者如何将 xmm1 乘以/除以 -72(%rbp) 所以返回是正确的?

美国电话电报公司,Linux,64b。

编辑:我读过一些关于 PINSRW 的文章,但不知道如何使用它。

4

1 回答 1

2

(假定)问题:

movq $1, -72(%rbp)将整数值 1 移动到内存中,当表示为浮点数时,它非常小。当您将“x”乘以这个数字时,结果非常小,以至于四舍五入为 0。

潜在的解决方案:

  • 将浮点立即值 1.0f 移动到内存中,而不是 1。我不能确切地说明如何执行此操作,因为我不知道您使用的是什么汇编程序。

  • 就像 Brett Hale 所说,将整数转换为浮点数。可能有一百万种方法可以做到这一点,所以只需谷歌“SSE Integer to Float”之类的东西,你就会得到一堆结果。

于 2013-06-07T02:21:01.940 回答