@wali7, post #32
@zilog, post #33
@flops, post #34
@Krashan, post #35
@zilog, post #33
@wali7, post #37
@michal_zukowski, post #28
@Hexmage960, post #40
@wali7, post #38
@zilog, post #42
@TechNineWonder, post #43
@Hexmage960, post #40
Narzut spowodowany korzystaniem z tych funkcji jest taki, jak przy korzystaniu z dowolnych funkcji bibliotecznych,
@zilog, post #42
Postulat z emulacją koproca na procedurze obsługi przerwania ok. tylko, że to można zrobić w ramach swojego programu lub optymistycznie, jeśli system nie jest blokowany.
@Krashan, post #35
Przy próbie emulacji koprocesora mamy do tego jeszcze nieistniejące rejestry. To pociąga za sobą szereg konsekwencji, na przykład kwestię gdzie je umieścić, oraz przechowanie ich na stosie przy przełączaniu zadań, nie zapominajmy też o przerwaniach.
@mschulz, post #45
FMOVE.S D0,FP0 FADD.S D1,FP0 FMOVE.S FP0,D0 RTS
@Hexmage960, post #48
Jak widać instrukcja FADD.S dodaje bezpośrednio rejestr danych CPU do rejestru FPU. Liczba instrukcji jest minimalna.
@Hexmage960, post #48
@mschulz, post #49
@Hexmage960, post #51
Z tego co wiem (musiałbym sprawdzić), to w przypadku podwójnej precyzji liczby są przekazywane przez dwa rejestry - D0 i D1. W asemblerze łatwo takie coś wprowadzić.
# w twoim kodzie skok do mathieeedoubbas: ... jsr -LVO(a6) ... # w mathieeedoubbas w LVO table: jmp __fadd # w mathieeedoubbas w implementacji IEEEDPAdd __fadd: movem d0-d4,-(sp) fmove.d (sp),fp0 fadd.d 8(sp),fp0 fmove.d fp0,(sp) movem (sp)+,d0-d4 rts
@kiero, post #53
Do tego pamietaj, ze w miejscu wywolania musisz przerzucic dane do d0:d1 i d2:d3 bo tak jest zdefiniowane API. Potem po wyjsciu zrobic to samo z wynikiem. Narzut jest bardzo duzy.
@mschulz, post #52
MOVEM.L D0-D3,-(A7) FMOVE.D (A7)+,FP0 FADD.D (A7)+,FP0 FMOVE.D FP0,-(A7) MOVE.L (A7)+,D0 MOVE.L (A7)+,D1 RTS