【问题标题】:Convert int to double in AVX x86在 AVX x86 中将 int 转换为 double
【发布时间】:2016-05-28 00:46:11
【问题描述】:

我有一个外部函数:

extern "C" void calculateAreaUnderCurve_(double startPoint, double endPoint, int numberOfTrapezes, double* coefficients, double* result);

我想在我的 .asm 文件中将 numberOfTrapezes 转换为 double

我尝试过:vcvtsi2sdcvtsi2sd,但它不起作用。

编辑:

这是我的 .asm 文件

.model flat,c    
.code

;   Function declatation:
;   int calculateAreaUnderCurve_(double startPoint, double endPoint, 
;   int numberOfTrapezes, double* coefficients, double* result);

calculateAreaUnderCurve_ proc
        push ebp
        mov ebp,esp

;   Load argument values
        vmovsd  xmm1,real8 ptr [ebp+8]      ;xmm1 = startPoint
        vmovsd  xmm2,real8 ptr [ebp+16]     ;xmm2 = endPoint
        mov     ebx, [ebp+20]               ;ebx  = numberOfTrapezez int value
        mov     eax, [ebp+28]               ;eax  = pointer to coefficients array
        mov     ecx, [ebp+32]               ;ecx  = pointer to result

        cvtsi2sd xmm3,dword [ebp+20]        ;convert to double
        movsd real8 ptr [ecx],xmm3          ;save result
        pop ebp
        ret
calculateAreaUnderCurve_ endp
        end

还有我的函数调用:

int numberOfTrapezes=100;
//initialize other parameters
calculateAreaUnderCurve_(startPoint,endPoint,numberOfTrapezes, coefficients, &result);

结果我得到一个奇怪的数字1.0761e+09

【问题讨论】:

  • 你可能会因为破坏 ebx 而崩溃。如果您正在为像 32 位 x86 这样在堆栈上传递参数的蹩脚调用约定编写代码,只需将 vcvtsi2sd 与内存操作数一起使用。
  • 你用的是什么CPU? vcvtsi2sd 是 AVX-512,不是 AVX。
  • @PaulR 如果我是你,我会再看看指令集参考。
  • @EOF:嗯 - 一定是在线内在函数指南中的错误:software.intel.com/sites/landingpage/IntrinsicsGuide/…
  • @PaulR: vcvtsi2sd 只是 VEX 编码 of the SSE2 instruction。出于某种原因,它的 EVEX 编码有新的内在函数,没有舍入控制覆盖,即使它们仍然没有改变愚蠢的语义(合并到现有的 reg 中,而不是将上半部分归零以破坏依赖链常见的标量用例)。

标签: assembly x86 x86-64 masm avx


【解决方案1】:
vmovsd  xmm1,real8 ptr [ebp+8]      ;xmm1 = startPoint
vmovsd  xmm2,real8 ptr [ebp+16]     ;xmm2 = endPoint
mov     ebx, [ebp+20]               ;ebx  = numberOfTrapezez int value

您正在从错误的地址检索 numberOfTrapezezendPoint 占用 8 个字节,因此将偏移量从 20 更改为 24。

mov ebx, [ebp+24]

还有

cvtsi2sd xmm3,dword [ebp+24]        ;convert to double

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多