assembly 如何将无符号64位整数转换为浮点数?[duplicate]

jc3wubiy  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(133)

此问题在此处已有答案

How to convert an unsigned integer to floating-point in x86 (32-bit) assembly?(3个答案)
三个月前关门了。
我需要一个x86序列来将一个64位无符号整数转换为浮点数。对于一个有符号整数来说,这是非常简单的,但是似乎没有一条指令可以对一个无符号整数进行转换。我相信你通常可以使用VCVTUSI2SD,但是我的汇编程序无法访问它。
所以在组装方面,它可以完成以下任务:

unsigned long long x = ... ;
double y = (double)x;
2w2cym1i

2w2cym1i1#

这里我假设使用Intel x86_64。在这些情况下,您通常会使用cvtsi2sd来处理符号
https://www.felixcloutier.com/x86/cvtsi2sd

//
// prototype: double convert(uint64_t value)
//
convert(unsigned long):        
        testq   %rdi, %rdi
        js      .Negative
        pxor    %xmm0, %xmm0
        cvtsi2sdq       %rdi, %xmm0
        ret
.Negative:
        movq    %rdi, %rax
        andl    $1, %edi
        pxor    %xmm0, %xmm0
        shrq    %rax
        orq     %rdi, %rax
        cvtsi2sdq       %rax, %xmm0
        addsd   %xmm0, %xmm0
        ret

基本上,因为cvtsi2sdq取整数signed,所以很明显,必须将uint64_t视为负数。
基本上,这段代码的作用类似于:

double signed_convert( int64_t value ); // trivial

double convert( uint64_t value ) {
   if ( value>>63 == 0 ) return signed_convert( value );
   double half = signed_convert( (value>>1) | (value&1) );
   return 2*half;
}

相关问题