如何使用Aarch64架构进行80位浮点运算?

问题描述 投票:0回答:1

为我在标题中提出的问题提供更多背景信息:我正在使用 VS C++,我需要从内存中读取 80 位浮点数并将其格式化为人类可读的形式。我可以在某种程度上为 Intel x64/x86 架构做到这一点,但我正在努力弄清楚如何为 Aarch64 做到这一点。

PS。对于 x64,我可以通过使用此函数将 80 位

long double
转换为
double
来在汇编中完成此操作:

; RCX = points to `long double` to convert from
; RDX = points to `double` to convert to

FLD     tbyte ptr [RCX]
FSTP    qword ptr [RDX]
ret

然后打印转换后的

double
值。它会失去一些精度,但没关系。

c++ visual-studio assembly floating-point arm64
1个回答
0
投票

我需要从内存中读取一个 80 位浮点数并将其格式化为人类可读的形式。我可以在某种程度上为 Intel x64/x86 架构做到这一点,但我正在努力弄清楚如何为 Aarch64 做到这一点。

尝试 SoftFloat 库,它有 floatx80_to_float32、floatx80_to_float64 和 floatx80_to_float128。检测本机格式,并采取相应措施。

#include "softfloat.h"
#include <iostream>

typedef struct {
    void* (*processFloatx80)(floatx80 fx80);
} FloatProcessor;

void* processFloatx80_to_float64(floatx80 fx80) {
    float64_t* result = (float64_t*)malloc(sizeof(float64_t));
    
    if (result != NULL) {
        *result = floatx80_to_float64(fx80);
    }
    return result;
}

void* processFloatx80_to_float32(floatx80 fx80) {
    float32_t* result = (float32_t*)malloc(sizeof(float32_t));
    
    if (result != NULL) {
        *result = floatx80_to_float32(fx80);
    }
    return result;
}

void* processFloatx80_to_float128(floatx80 fx80) {
    float128_t* result = (float128_t*)malloc(sizeof(float128_t));
    
    if (result != NULL) {
        *result = floatx80_to_float128(fx80);
    }
    return result;
}

int main() {
    ...

    floatx80 fx80;
    FloatProcessor processor;

    #if defined(__FLOAT128__)
    processor.processFloatx80 = processFloatx80_to_float128;
    #elif defined(__aarch64__) || defined(__arm__) || defined(__x86_64__)
    processor.processFloatx80 = processFloatx80_to_float64;
    #else
    processor.processFloatx80 = processFloatx80_to_float32;
    #endif

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.