Hello, Guest the thread was called132 times and contains 2 replays

last post from enthusi at the

Intelligentes Makro-Inlining beim ca65

  • Ich arbeite gerade an einer Library mit Assemblermakros und -funktionen zu 16bit und 24bit Arithmetik sowie zu Basisfunktionen für Sprites, Hi-Res-Grafik und Diskzugriff.


    Ich würde gerne folgendes erreichen:


    Kurze Funktionen (zum Beispiel ADC16, SBC16) normalerweise als Makro.
    Lange Funktionen (MUL, DIV, DRAWLINE) als Funktion.


    1. Eine Funktion die in einem Programm aber nur ein einziges Mal verwendet wird soll aber immer als Makro eingebunden werden (das spart mindestens ein JSR $xxxx und ein RTS, also 4 Bytes und 12 Taktzyklen, ggf. spart man sich auch noch was bei der Parameterübergabe).


    2. Funktionen die nie benötigt werden sollen nicht gelinkt werden.


    Frage 1: gibt es so eine Funktionalität bereits in einem vorhandenen Programm?


    Frage 2: Wie könnte ich sowas am besten umsetzen? Meine Ideen sind:


    Einmal builden, dann die Labels extrahieren und daraus die Aufrufhäufigkeit ermitteln. Dann erneut builden, und anhand der gespeicherten Aufrufhäufigkeiten Regel 0 implementieren. Die anderen Optimierungsmöglichkeiten über ein voreingestelltes Label ausführen.


    oder


    Ein Analyseprogramm schreiben das den Sourcecode untersucht und daraus die Aufrufhäufigkeit ermittelt.




    Ich befürchte auch dass ich sämtliche Funktionen in der Library wahrscheinlich doppelt anlegen muss: einmal als inline-Makro und einmal als Makro welches den Stub mit der Parameterübergabe und den jsr call enthält, dazu wird ein Flag gesetzt dass am Ende die benötigten Funktionen dazufügt.




    Was ist eure Meinung dazu?

  • Hmja. Ich habe das gleiche einmal gemacht, allerdings in Kickassembler, sogar noch furchtbar viel intelligenter mit verschiedenen Implementierungen der Funktionen, die abhängig von den Makro-Parametern automatisch ausgewählt werden (man konnte global angeben, wie weit man nach Speicher oder nach Zyklen optimieren will). Ob es in ca65 auch ginge, weiß ich nicht. Was ich aber weiß, ist dass ich diese tolle Makro-Library am Ende NIE benutzt habe! Ich habe mich nämlich dabei ertappt, dass ich öfter mal geschaut habe, was denn am Ende für Code erzeugt wurde (inline oder nicht, welche Implementierung etc.), um zu wissen was das Programm denn nun wirklich macht. Lustigerweise kann es auch unerwartete Effekte geben, wenn man z.B. das Makro in einem Raster-IRQ verwendet und plötzlich mehr oder weniger Zyklen verbraucht werden, weil man an einer ganz anderen Stelle des Programm das selbe Makro noch einmal verwenden will.


    Unter dem Strich habe ich einen Haufen Arbeit hineininvestiert und was ich heute damit mache ist dass ich die Implementierungen aus dieser Library herauskopiere und explizit im Sourcecode verwende ;( .


    Ich will Dir den Mut nicht nehmen, aber die allermeisten fortgeschrittenen Assembler-Programmierer am C64 sind nach meiner Erfahrung zu dem Schluss gekommen, dass Makros abgesehen von ganz trivialen Dingen mehr schaden als nutzen...

    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────