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?