Как использовать сборку arm64 для выполнения операций с плавающей запятой? - PullRequest
0 голосов
/ 16 апреля 2020

Как использовать сборку ARM64 для выполнения операций с плавающей запятой, таких как сложение, вычитание, умножение и деление?

Я пытался

static double  __attribute__((naked, pure)) MyASMAdd(double sub1, double sub2) {
#ifndef __arm__
    asm("           ADD     x0, x0, x1");
    asm("           RET");
#endif
}

Как и выше, если я использую два double или float операций, результатом всегда будет первый параметр, такой как 3.2 + 4.6, который должен быть равен 7.8, но ответ - 3.2. В других случаях тоже. Но если я использую int для обоих аргументов, я могу получить желаемый результат。

static int  __attribute__((naked, pure)) MyASMAdd(int sub1, int sub2) {
#ifndef __arm__
    asm("           ADD     x0, x0, x1");
    asm("           RET");
#endif
}

1 Ответ

2 голосов
/ 16 апреля 2020

Соглашение о вызовах AArch64 передает числа с плавающей запятой в s0-7 и удваивается в регистрах d0-7.

Вывод из Godbolt :

add_d(double, double):
        fadd    d0, d0, d1
        ret
add_f(float, float):
        fadd    s0, s0, s1
        ret
...