Wie kann ich das tun? Es wäre am besten, wenn das Ergebnis im e * x-Register ist.Intel x86_64 Assembly, wie Double von Xmm Register zu Int zu floor?
Antwort
Sie haben einige triviale Fragen gestellt, die Sie beantworten können, indem Sie sich ansehen, wie ein C-Compiler das tut. Von dort aus können Sie die verwendeten Anweisungen nachschlagen und entscheiden, welche Sie tatsächlich verwenden möchten. (Es gibt ungefähr eine Zillion verschiedener Rundungsfunktionen in libm, also ist es nicht immer einfach, die richtige zu wählen).
Mit -O3 -ffast-math
werden die meisten einfachen libm-Funktionen inline (da es möglicherweise errno
auf NaN nicht setzen, oder Mist wie das).
Wie auch immer, Compiler und -ausgabe, von gcc 5.3 on the Godbolt Compiler Explorer:
#include <math.h>
int floor_double(double x) { return (int) floor(x); }
roundsd xmm0, xmm0, 9
cvttsd2si eax, xmm0
ret
int truncate_double(double x) { return (int)x; }
cvttsd2si eax, xmm0
ret
Siehe x86 Tag Wiki für Links zu Intel-Befehlssatz Referenzhandbuch pdf. Es gibt auch eine unofficial HTML version generiert aus der PDF.
cvttsd2si
truncates towards zero, wie trunc()
, statt Rundung in Richtung -Infinity wie die floor()
function.
Deshalb kompiliert floor()
zu SSE4.1 roundsd
, wenn dieser Befehlssatz verfügbar ist. (Ansonsten muss man mit dem Rundungsmodus herumspielen, wie man sieht, wenn man die Option -march
auf godbolt entfernt oder ändert).
Es gibt auch gepackte Versionen der Konvertierungsbefehle, wie CVTTPD2DQ` 2 auf einmal zu tun. (Oder 4 mit AVX).
Zum Doppelboden verwenden CVTTPD2DQ—Convert with Truncation Packed Double-Precision FP Values to Packed Dword Integers.
CVTTPD2DQ
does floor/trunkate zwei double
s zu zwei int
s in einem XMM-Register.
Die entsprechende Intel C/C++ Compiler Intrinsic ist
____m128i _mm_cvttpd_epi32(__m128d a)
Um das Ergebnis zu einem GPR (General Purpose Register) wie EAX
zu setzen, können Sie die folgenden Anweisungen verwenden können:
CVTTPD2DQ xmm0, xmm1 ; XMM1 is the source of doubles
movd eax, xmm0 ; extracts int(0) from XMM0 to EAX
pextrd ecx, xmm0, 1 ; extracts int(1) from XMM0 to ECX
- 1. XMM-Register zum Stapel schieben
- 2. Wie alle XMM-Register in gdb ablegen?
- 3. GCC inline assembly: registrieren Einschränkungen auf Intel x86_64
- 4. Einschränkung von r10 register in gcc inline x86_64 assembly
- 5. Wie konvertiert man von Int zu Double?
- 6. XMM-Register auf alle Nullen prüfen
- 7. Intel intrinsics assembly code
- 8. Intel x86_64 hinzufügen Assembly ganze Zahl mit doppelter Genauigkeit Schwimmer SSE, SSE2
- 9. XMM-Register insgesamt oder pro Kern
- 10. x86_64 Assembly Befehlszeilenargumente
- 11. Wie interpet ich diesen x86_64 Assembly Opcode?
- 12. C++ - Wie double zu int richtig zu werfen
- 13. Umwandlung von Intel Assembly zu Gas/at & t
- 14. X86 Opcodes zum Verschieben von xmm-Registern in allgemeine Register
- 15. Assembly Register Anfänger
- 16. Double konvertiert nicht zu einem int
- 17. xorl% eax,% eax in x86_64 assembly code produziert von gcc
- 18. Java-Äquivalent von Register int?
- 19. x86_64: zwingen gcc, Argumente auf dem Stapel zu übergeben
- 20. Wie viele XMM-Register sind auf einem x86-Prozessor verfügbar, der SSE unterstützt?
- 21. Int zu Float zu Int Umwandlung Präzisionsverlust
- 22. Wie konvertiert man Int zu Double in Swift playground?
- 23. Objective-C, wie konvertiere ich ein Double zu einem Int?
- 24. Muss ich zu jeder Seite "<% @ Register assembly =" hinzufügen?
- 25. Benutzerdefinierte X86_64 Aufrufkonvention zu C-Funktionsaufruf
- 26. Verleiht ein int nach std :: floor das richtige Ergebnis?
- 27. Intel 64, rsi und rdi Register
- 28. Grundlegende Fragen zu Assembly und Macs
- 29. Wie kann man 96 Bits aus dem Speicher in ein XMM-Register laden?
- 30. von C zu Assembly
Wie kann ich dann das Ergebnis von xmm in f.e. EAX registrieren? – formateu
@formateu: Ich habe meine Antwort aktualisiert. – zx485
zx485: Wenn das int passen in eax registrieren, wird movd eax, xmm0 den Job tun? – formateu