@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