ASM - математические операции без FPU

Я ищу подпрограмму, которая поможет мне выполнить любую операцию над числами с плавающей запятой (это может быть сложение), но без использования модуля с плавающей запятой (FPU).

Мне нужно сделать программу, которая сравнивает время работы без FPU и с FPU. Вторая часть с использованием FPU сделана, но я не могу найти подходящей процедуры.


person michail_w    schedule 10.02.2014    source источник
comment
Мне жаль быть таким парнем, но почему? Я гарантирую, что использование встроенного FPU будет намного быстрее, чем самостоятельное выполнение целочисленных операций. Это домашнее задание или что? В противном случае избавьте себя от проблем...   -  person TypeIA    schedule 11.02.2014
comment
Почему бы не использовать SoftFloat?   -  person Leeor    schedule 11.02.2014
comment
Кроме того, одна подпрограмма для выполнения всех возможных операций над числами с плавающей запятой в программном обеспечении была бы... ну... довольно большой и сложной... Тем не менее, вероятно, можно найти библиотеки и некоторые компиляторы (в по крайней мере gcc) при правильных параметрах может просто сгенерировать для вас код с плавающей запятой, не относящийся к FPU...   -  person twalberg    schedule 11.02.2014
comment
@dvnrrs: Это программа для учебы - она ​​должна сравнивать время. Все знают, что FPU быстрее, но я должен это измерить.   -  person michail_w    schedule 11.02.2014
comment
Leeor - как я могу использовать его в файлах .asm?   -  person michail_w    schedule 11.02.2014
comment
twalberg - Мне нужен только один. Сложение/вычитание/умножение/деление. Вы можете выбрать один :-)   -  person michail_w    schedule 11.02.2014
comment
Это довольно сложная вещь, мне трудно поверить, что вам нужно написать ее в качестве домашнего задания. Используйте для этого библиотеку.   -  person Brian Knoblauch    schedule 11.02.2014


Ответы (1)


Не уверен, почему все люди шокированы сложностью. Сложение, вычитание и умножение не представляют особой сложности. Вам нужно будет разделить числа на знак, мантиссу и показатель степени, затем использовать целочисленную математику для вычисления результата и, наконец, вернуть его в число с плавающей запятой. У меня есть пример кода для умножения с плавающей точкой (64-битный синтаксис GAS):

.globl main
main:
    subq $8, %rsp
    leaq format1(%rip), %rdi
    leaq (%rsp), %rsi
    leaq 4(%rsp), %rdx
    xor %eax, %eax
    call scanf

    movl (%rsp), %eax           # x
    movl 4(%rsp), %ecx          # y

    movl %eax, %edx             # edx = x
    xorl %ecx, %eax             # sgn(x*y) = sgn(x) ^ sgn(y)
    andl $0x80000000, %eax      # eax has correct sign bit now
    movl %ecx, %esi             # esi = y
    shrl $23, %esi
    andl $0xff, %esi            # esi = exp(y)
    movl %edx, %edi             # edi = x
    shrl $23, %edi
    andl $0xff, %edi            # edi = exp(x)
    addl %esi, %edi             # exp(x*y) = exp(x) + exp(y)
    subl $0x7f+23, %edi         # subtract bias and mantissa bits

    andl $0x007fffff, %edx      # edx = man(x)
    andl $0x007fffff, %ecx      # ecx = man(y)
    orl $0x00800000, %ecx       # put implicit leading 1 bit
    orl $0x00800000, %edx       # to both mantissas
    imulq %rcx, %rdx            # man(x*y) = man(x) * man(y)
    bsrq %rdx, %rcx             # find first set bit
    subl $23, %ecx              # leave 23 bits
    shrq %cl, %rdx              # shift the rest out
    andl $0x007fffff, %edx      # chop off implicit leading 1 bit
    addl %ecx, %edi             # adjust the exponent by the bits shifted out

    shll $23, %edi              # shift exponent into position
    orl %edi, %eax              # put exponent into result
    orl %edx, %eax              # put mantissa into result

    movss (%rsp), %xmm0
    movss 4(%rsp), %xmm1
    movd %eax, %xmm2
    cvtss2sd %xmm0, %xmm0
    cvtss2sd %xmm1, %xmm1
    cvtss2sd %xmm2, %xmm2
    movl $3, %eax
    leaq format2(%rip), %rdi
    call printf

    addq $8, %rsp
    ret
.data
    format1: .asciz "%f %f"
    format2: .asciz "%f * %f = %f\n"

Особые случаи для нуля, nan, inf, переполнения и тому подобного оставляем читателю в качестве упражнения :)

person Jester    schedule 11.02.2014
comment
Спасибо :-) А у вас есть вариант для 32 бит? И меня интересует синтаксис FASM, но если у вас есть любой другой 32 битный, мне будет достаточно. - person michail_w; 11.02.2014
comment
Единственная 64-битная часть (за исключением ввода и вывода, которые вам не нужны) — это 4 инструкции, начинающиеся с imulq. Вы должны быть в состоянии переписать это для 32-битного самостоятельно, но имейте в виду, что 64-битное умножение в 32-битном режиме будет использовать edx:eax, поэтому вам нужно немного перетасовать. - person Jester; 11.02.2014