@Sventevith, post #26
@Krashan, post #32
@Don_Adan, post #33
Czyli powinien mu kazac uzyc D1?W tym momencie tak, bo cała rzecz zasadzała się na tym, żeby zmusić kompilator do zapisania tego adresu do rejestru danych, żeby flagi się ustawiły bez konieczności wykonywania CMPA. Dla kompilatora jednakże to działanie bez sensu, bo dana jest adresem, w dodatku chwilę później jest użyta jako baza do zaadresowania elementu struktury.
@Don_Adan, post #29
void MemoryRelease(void) { register APTR memoryBlock __asm("d1") = gm; if (memoryBlock) { register struct Library *SysBase __asm("a6") = GetExecBase(); register APTR block __asm("d0") = gm->chip; if (block) { FreeMem(block, MEMORY_CHIP_SIZE); } FreeMem(memoryBlock, MEMORY_PUBLIC_SIZE); } }
nop _MemoryRelease: move.l a4,d1 beq.s lbC000092 move.l 4.w,a6 move.l (a4),d0 beq.s lbC000088 move.l d0,a1 moveq #$30,d0 swap d0 jsr -$D2(a6) lbC000088: moveq #$10,d0 swap d0 move.l d1,a1 jsr -$D2(a6) lbC000092: rts
Moim zdaniem robienie tego rodzaju optymalizacji w kodzie, który pewnie się wykonuje raz, przy starcie programu, to sztuka dla sztuki.
@docent, post #31
@asman, post #35
@Don_Adan, post #37
Podejrzewam, ze kompilator moze miec problem jesli brakuje mu rejestrow.Ale pisząc samodzielnie w asemblerze, też masz problem gdy brakuje Ci rejestrów... Kompilator użyje na pewno D0-D7 i A0-A3. Kompilator użyje też A4, jeżeli nie skorzystasz z opcji -fbaserel (adresowanie zmiennych globalnych offsetem do A4). Kompilator użyje A5, jeżeli wyłączysz robienie ramek stosu (LINK/UNLK) opcją -fomit-frame-pointer. Kompilator użyje też A6, zwłaszcza jeżeli nie wywołasz w procedurze żadnej funkcji systemowej. A7 raczej nie użyje, ale to już trochę jechanie po bandzie. Bo gdzieś wskaźnik stosu musisz jednak przechować i to najlepiej nie na stosie.
short a, b; long c; c = a * b;Jeżeli ktoś myśli, że to się skompiluje do MULS.W, to będzie rozczarowany. Liczby 16-bitowe zostaną rozszerzone do 32 bitów i zostanie wykonany skok do procedury __mulsi3 z biblioteki standardowej. Promocja typów polega na tym, że najpierw typy wszystkich elementów wyrażenia są wyrównywane do "największego", a potem się robi operację. Można to obejść korzystając z extended asm, jak to zrobiłem w Untangle (dużo mnożeń jest potrzebnych przy sprawdzaniu czy poziom jest rozwiązany).
@Krashan, post #38
@Don_Adan, post #39
Nie wiem czy kompilator by tak potrafilRaczej nie. Asembler wygrał. Wiem, że chciałeś to przeczytać.
@Sventevith, post #36
@Krashan, post #40
@asman, post #35
@asman, post #1
typedef void(*PVF)(void); static PVF state; void foo(void) { } void bar(void) { state = foo; }
foo: nop rts bar: move.l #foo,state nop rts
@asman, post #1
_NewList: move.l 4(sp),a0 move.l a0,8(a0) addq.l #4,a0 clr.l (a0) move.l a0,-(a0) rts
@asman, post #47
@Krashan, post #48
@asman, post #49
Faktycznie, chodziło mi o -mregparm. To znaczy że jak mam tą opcję, to mogę się pożegnać z amiga.lib?Teoretycznie nie, o ile miałbyś jej źródła i skompilował je również z opcją -mregparm. Dotyczy to każdej biblioteki statycznej.
Druga sprawa jak używam gcc bez tego całego ixemul i innych rzeczy (dostarczam sam kod startowy) to czy mogę się również pożegnać z czymś takim jak funkcja exit?Tak.
Czy można ją jakoś samemu ogarnąć?W systemie bez śledzenia zasobów, a takim jest AmigaOS, będzie to zawsze hack. To, co jest w ixemul też jest hackiem.
@Krashan, post #50
Czy można ją jakoś samemu ogarnąć?
W systemie bez śledzenia zasobów, a takim jest AmigaOS, będzie to zawsze hack. To, co jest w ixemul też jest hackiem.
Faktycznie, chodziło mi o -mregparm. To znaczy że jak mam tą opcję, to mogę się pożegnać z amiga.lib?
Teoretycznie nie, o ile miałbyś jej źródła i skompilował je również z opcją -mregparm. Dotyczy to każdej biblioteki statycznej.
struct Obiekt *obiekt = start; { register LONG zmienna = obiekt->skladowa; /* Tutaj operacja na zmiennej */ } /* Tu zmienna niewidoczna - rejestr może być zwolniony */ obiekt++;
@Hexmage960, post #51
@asman, post #52
@Hexmage960, post #53
Gdyby w GCC dało się wykluczyć w podobny sposób funkcję NewList i inne z konwencji przekazywania przez rejestry, pewnie mogłoby to być bardzo zgrabne rozwiązanie.
@asman, post #54
Oczywiście że można, wydzielając do osobnego modułu wywołania NewList (by zrobić regułę w makefile bez mregparm ). Albo opakowując wywołanie NewList robiąc makro które przewali z rejestru na stos.
Tylko to jakby dla mnie słabe rozwiązanie. Najlepsze jest to co powiedział Krashan, czyli biblioteka statyczna skompilowana z mregparm. Najlepsze bo nie musisz myśleć i przede wszystkim pamiętać o tym, bo to nie jest kwestia tego czy będę pamiętał tylko kiedy zapomnę o tym.
Być może zby słabo to zaakcentowałem ale tu chodzi o poprawność działania.
@asman, post #47