Wie kann ich eine 64-Bit-Division mit einer 32-Bit-Divisionsanweisung durchführen?

8

Dies ist (AFAIK) eine spezielle Frage innerhalb diese allgemeine Thema .

Hier ist die Situation:

Ich habe ein Embedded-System (eine Videospielkonsole), das auf einem 32-Bit-RISC-Mikrocontroller basiert (eine Variante des V810 von NEC). Ich möchte eine Festkomma-Mathematikbibliothek schreiben. Ich lese diesen Artikel , aber der dazugehörige Quellcode ist in 386 Assembly geschrieben, also ist er weder direkt verwendbar noch leicht modifizierbar .

Der V810 hat eine eingebaute Multiplikation / Division, aber ich möchte das 18.14 Format verwenden, das im obigen Artikel erwähnt wurde. Dies erfordert das Unterteilen eines 64-Bit-Int durch einen 32-Bit-Int und der V810 nur (32-Bit / 32-Bit-Division mit Vorzeichen oder Vorzeichen) (was einen 32-Bit-Quotienten und einen 32-Bit-Rest erzeugt) / p>

Also, meine Frage ist: Wie simuliere ich eine 64-Bit / 32-Bit-Division mit einer 32-Bit / 32-Bit-Division (um die Dividendendrehung zu ermöglichen)? Oder, um das Problem von einem anderen Weg aus zu betrachten, was ist der beste Weg, um einen 18,14-Fixpunkt durch einen anderen unter Verwendung von 32-Bit-Arithmetik / Logik-Standardoperationen zu teilen? ("am besten" bedeutet am schnellsten, am kleinsten oder beides).

Algebra, (V810) Assembly und Pseudo-Code sind alle in Ordnung. Ich werde den Code von C aufrufen.

Vielen Dank im Voraus!

EDIT: Irgendwie habe ich diese Frage verpasst. Es wird jedoch noch einige Modifikationen benötigen, um super effizient zu sein (es muss schneller sein als das Gleitkomma-Div, das vom v810 zur Verfügung gestellt wird, obwohl es vielleicht schon ...), also fühlen Sie sich frei, meine Arbeit für mich zu tun im Austausch für Reputation Punkte;) (und Kredit in meiner Bibliothek Dokumentation natürlich).

    
RunnerPack 26.08.2010, 06:01
quelle

2 Antworten

5

GCC hat eine solche Routine für viele Prozessoren namens _divdi3 (normalerweise unter Verwendung eines gemeinsamen divmod-Aufrufs implementiert). Hier ist einer . Einige Unix-Kernel haben auch eine Implementierung, z. FreeBSD .

    
Igor Skochinsky 26.08.2010, 07:52
quelle
0

Wenn Ihre Dividende 64 Bit ohne Vorzeichen hat, ist Ihr Divisor 32 Bit ohne Vorzeichen, die Architektur ist i386 (x86), die Assembleranweisung div kann Ihnen bei der Vorbereitung helfen:

%Vor%

Wenn die obige Zeile mit __udivdi3 nicht für Sie kompiliert wird, verwenden Sie die Funktion __div64_32 aus dem Linux-Kernel: Ссылка

    
pts 01.02.2017 14:34
quelle