Die libgcc2 gehört zu GCC dazu, im Gegensetz etwa zur libc oder libm, die "eigenständige" Bibliotheken sind.
In der libgcc2 sind einfache Sachen -- wie etwa obige Division (mit Rest) -- implementiert, die zu komplex sind, um sie direkt in der jeweiligen Maschinenbeschreibung (hier avr) zu codieren.
Das Pattern im betreffenden Fall ist "udivmodsi4". Veröffentlich in Headern sowie global deklariert in der libgcc2 sind leider nur signed Division+Rest 16/16 und 32/32 resp. die passenden Structs div_t und ldiv_t.
Warum entsprechende Routinen für unsigned und 8/8 nicht offengelegt werden ist mir schleierhaft, immerhin sind alle in der libgcc2 implementiert...
Gerade die unsigned 8/8 Division (udivmodqi4) spart deutlich Bandbreite, etwa wenn man Daten für die Ausgabe nach Dezimalstring konvertieren will.
Wie die Prototypen zu sein haben hab ich tatsächlich in der Quelle zur libgcc2 (./gcc/config/avr/libgcc2.S) nachschauen müssen.
Die Divisions-Funktionen dort sind
__(u)divmodqi4: (un)singned Division mit Rest 8/8
__(u)divmodhi4: (un)singned Division mit Rest 16/16
__(u)divmodsi4: (un)singned Division mit Rest 32/32
Übrigens steht "si" immer für 32 Bit (single integer), "hi" für 16 Bit ("half int") und "qi" für 8 Bit ("quarter of an int"). "di" ist "double int" (64), "df" ist double (double float), "sf" ist "single float" (32), etc.
Weitere Beispiele sind im [wiki="avr-gcc"]-Artikel unter "Optimierungen"
Disclaimer: none. Sue me.
Lesezeichen