Использование x87-FPU в режиме x64 / AMD64 под Linux - PullRequest
1 голос
/ 21 октября 2019

Кто-нибудь знает, поддерживает ли Linux использование x87-FPU в 64-битном режиме, т.е. если инструкции не перехвачены и регистры сохранены при переключении контекста. Я не хочу его использовать, и я знаю, что SSE является стандартом в режиме x64;это просто для любопытства.

1 Ответ

1 голос
/ 21 октября 2019

Да. Это поддерживается. Язык D использует эту функцию. Когда вы используете типы float или double, он компилирует код SSE, когда вы используете real, который говорит компилятору использовать наиболее точный тип реализации. В случае x86 это x87 с его 80-битным типом.

https://godbolt.org/z/50kr-H

real square(real num) {
    return num * num;
}

float square(float num) {
    return num * num;
}

компилируется в

real example.square(real):
    push    rbp
    mov     rbp, rsp
    fld     tbyte ptr [rbp + 16]
    fstp    tbyte ptr [rbp - 16]
    fld     tbyte ptr [rbp - 16]
    fmul    st(0), st
    pop     rbp
    ret

float example.square(float):
    push    rbp
    mov     rbp, rsp
    movss   dword ptr [rbp - 4], xmm0
    movss   xmm0, dword ptr [rbp - 4]
    mulss   xmm0, dword ptr [rbp - 4]
    pop     rbp
    ret
...