Zum Thema NVDI: NVDI macht auch einige "dreckige" Annahmen, wie z.B., dass gewissen Variablen in den ersten 32 kiB RAM stehen und somit über den xxx.W-Adressierungsmodus erreichbar sind. Wir mussten einmal EmuTOS deswegen anpassen.
Zum Thema kluge Compiler: Ein Beispiel. Divisionen sind sehr langsame Operationen (selbst auf modernen CPUs). Programmierer versuchen sie zu vermeiden. Aber nehmen wir an, eine Division durch drei sei nun einmal nötig:
uint16_t divide_by_three(uint16_t a)
{
uint16_t res;
res = a / 3;
return res;
}
Bestimmt 95% der Programmierer würden, wenn sie das händisch in Assembler formulieren müssten, in den sauren Apfel beißen und halt notgedrungen ein "DIVU.W #3,Dx" hinschreiben. Was gcc daraus macht, überrascht vielleicht den einen oder anderen:
https://tinyurl.com/2cz88ktvAuf einem 68000 braucht der naive Weg (mit DIVU) 136 Zyklen, gccs Code (obwohl mehrere Instruktionen) nur 76 Zyklen. Demnach gut 40% schneller.