Divisions-Algorithmus selbst schreiben... / Aber wie?
Der ARM Cortex-M0+ kann kein „DIV“... Oder?
Und GCC will ganz viele 32bit instructions aus seiner libgcc.a verwenden, die der STM32G030 überhaupt gar nicht verstehen kann...
Also habe ich mir selbst was gebastelt... ChatGPT findet mein Verfahren ungewöhnlich und vermutlich zu langsam und schlägt eine einzige Schleife vor, die immer genau 32 mal durchlaufen wird (allerdings sehe ich nicht, warum das dann eine Divison ergeben sollte (hab etwas Angst vor einer Art „Pentium FDIV bug“...)... aber ChatGPT meint, dass das das Standard-Vorgehen sei...)...
Wie findet ihr meinen Divisions-Algorithmus? Also den da (divmod(·,·)):
u32 lsb(const u8 l) { return (1U<<l)-1U; }
u64 divmodB(u32 N, u32 D, u32 B) {
for (; N>D && !(D&(lsb(8)<<24)); B<<=8)
{ u32 nD=D<<8; if (N<nD) break; D=nD; }
for (; N>D && !(D&(1U<<31)); B<<=1)
{ u32 nD=D<<1; if (N<nD) break; D=nD; }
u32 R; for (R=0; N!=0 && B!=0; D>>=1, B>>=1)
if (N>=D) { N-=D; R|=B; }
return (((u64)N)<<32) | R;
}
u64 divmod(u32 N, u32 D)
{ return (!D) ? -1ULL : divmodB(N,D,1); }