Я написал ассемблерную функцию AT&T для вычисления интеграла. Мне нужно передать его как возвращаемое значение, поскольку оно вызывается кодом, написанным на C. Мне удалось вернуть его как одинарную точность float
и двойную точность double
. Но я знаю, что могу вычислить его с 80-битной двойной расширенной точностью, и я бы хотел передать его в C.
Предположим, что значение, которое я хочу передать, указано в регистре FPU, на который указывает TOP. Вот как я вызываю функции.
Для поплавка:
//C
double integ_fo=integ_asm_fpu_fl();
#asm
...
fstps max # Fpu STore and Pop Short <- short for 32-bit
movss max, %xmm0 # MOVe Scalar Single precision
Для двойного:
//C
double integ_do=integ_asm_fpu_do();
#asm
...
fstpl max # Fpu STore and Pop Long <- long for 64-bit
movsd max, %xmm0 # MOVe Scalar Dingle precision
Теперь мой вопрос: как мне завершить следующий код, чтобы C мог читать long double
из регистра %XMM0
.
Для длинного двойника:
//C
long double integ_lo=integ_asm_fpu_lo();
#asm
...
fstpt max # FPU Store and Pop exTended <- extended for 80-bit
Что мне делать после этого? Как мне переместить 80 бит из max
в %XMM0
?