Portál AbcLinuxu, 9. května 2025 23:31

Dotaz: FPU - odečítání

Jardík avatar 6.12.2009 19:26 Jardík | skóre: 40 | blog: jarda_bloguje
FPU - odečítání
Přečteno: 284×
Odpovědět | Admin
Mám takový problém s odečítáním v assembleru (pomocí FPU).

Mám takovýto stav st registrů:
st(0) = 1/5! = 8,3333e-3
st(1) = 0,25/7! = 4,96031e-5
st(2) = 0,25
st(3) = 1
Teď potřebuju provést odčítání st(0) = st(0) - st(1) a dostat
st(0) = 1/5! - 0,25/7! = 8,2837e-3
st(1) = 0,25
st(2) = 1
Provedl jsem tedy
fsubrp %st(0), %st(1)  ; fsubrp st(1), st(0) v intel syntax
Což by mělo udělat to, co potřebuji:
Subtract ST(i) from ST(0), store result in ST(i), and pop register stack
Jenže nějakým zázrakem dostanu v st(0) hodnotu -8,2837e-3, takže to udělalo pravý opak. Když instrukci změním na fsubp, tak dostanu správný výsledek, ale podle manuálu je to blbost (?). Je to bug v gasu nebo ve mně?
Věřím v jednoho Boha.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

6.12.2009 19:55 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: FPU - odečítání
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pravdepodobne ide o tento problém 9.13.13 AT&T Syntax bugs (a teda gas má kvôli gcc vymenený zdrojový a cieľový register).
Jardík avatar 6.12.2009 20:12 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: FPU - odečítání
Super ... a co teď s tím, přece nebudu kvůli chybnému gasu odevzdávat chybný úkol v assembleru, který má být zkompilovatelný gasem. Takže buď:

udělám správný kód a budu cvičícímu vysvětlovat, že gas je chybný

udělám špatný úkol, který gas zkompiluje jako správný, ale cvičící mě pošle někam, protože je úkol špatně

vykašlu se na gas, použiju yasm a budu přesvědčovat cvičícího, že gas je zabugovaný, není schopen správně přeložit kód

zadání
Napište podprogram pro výpočet funkce sinus. sin(x) = x/1! - x^3/3! + x^5/5! - x^7/7!
není jednoznačné a proto použiju instrukci fsin (v čemž mi zadání nebrání), která s gasem vrátí správný výsledek ... a hádat se s cvičícím, že měl zakázat použití instrukce fsin, ten mi to stejně neuzná, jak je na ČVUT zvykem.

Co byste udělal vy?
Věřím v jednoho Boha.
6.12.2009 20:39 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: FPU - odečítání
Použij druhou možnost, nad tu instrukci napiš komentář, a rozeber to v dokumentaci s odkazem na tu bugu. Ohavná realita sometimes happens.
Ještě na tom nejsem tak špatně, abych četl Viewegha.
Jardík avatar 6.12.2009 20:53 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: FPU - odečítání
Asi jo, ale stejně mi to příde dost úchylný psát kvůli chybnému kompilátoru úmyslně chybný kód, aby byl výsledek nakonec správný.
Věřím v jednoho Boha.
6.12.2009 23:54 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: FPU - odečítání
Asi by u té instrukce mělo být makro které bude testovat verzi překladače a podle toho tam vloží správnou instrukci aby to počítalo správně.
6.12.2009 23:58 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: FPU - odečítání
Teď mě ještě napadlo není to test od učitele jak si poradíte s kompilátorem?

A s tím makrem by to mělo být čisté. (Teoreticky)
6.12.2009 20:57 l4m4
Rozbalit Rozbalit vše Re: FPU - odečítání
Odpovědět | | Sbalit | Link | Blokovat | Admin
Doufám, že si uvědomuješ, že je to celé 32bitová šmejďárna. Normálně se už dávno pro floating point aritmetiku používají SSE instrukce na XMM registrech, protože je to podstatně efektivnější než 387 instrukce.
Jardík avatar 6.12.2009 21:24 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: FPU - odečítání
Samozřejmě bych radši použil SSE2, ale zadání je zadání.
Věřím v jednoho Boha.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.