Warum haben ARM-Chips eine Anweisung mit Javascript im Namen (FJCVTZS)?

137

FJCVTZS ist "Gleitkomma-Javascript-Konvertierung in signierten Festpunkt, Rundung in Richtung Null". Es wird in Arm v8.3-A-Chips und höher unterstützt. Was seltsam ist, weil Sie nicht erwarten, dass JavaScript so nah am Bare Metal ist.

Ich kann Erklärungen finden, was die Anweisung tut, aber nicht, warum sie existiert. In diesem Thread heißt es: "Es existiert als einzelne Anweisung, weil das Fehlen eines Integer-Typs bei JS bedeutet, dass bestimmte Anwendungsfälle diese Operation ohne guten algorithmischen Grund obszön oft benötigen." Das ist plausibel, aber ich hätte gerne ein detaillierteres Verständnis.

Tim Smith
quelle
4
Unterstützung dieses Zitats: Die JavaScript-Engine muss diese Operation (die ToInt32in der Spezifikation aufgerufen wird) ausführen, wenn Sie einen bitweisen Operator auf eine Zahl und zu verschiedenen anderen Zeiten anwenden (es sei denn, die Engine konnte die Zahl als Ganzzahl als beibehalten Optimierung, aber in vielen Fällen nicht).
TJ Crowder
1
Beachten Sie, dass der entscheidende Unterschied zu den üblichen FCVTZSAnweisungen für diesen Job darin besteht, dass FJCVTZSsich der Überlauf anders verhält. Sie erhalten nämlich immer die mindestens 32 Bits, während FCVTZSstattdessen etwas anderes zu tun scheint, wenn die Zahl nicht passt. Das korrekte Verhalten von FJCVTZSscheint etwas schwierig zu implementieren zu sein.
Fuz
1
@Tim Ich stimme TJ zu, die Protokolle des Meetings sind nicht zum Thema (und ich nehme an, sie sind auch eingeschränkt, dann können Sie sie kaum haben), aber JavaScript auf einem ARM-basierten Gerät auszuführen, ist eine Sache, siehe Erstellen von IoT-Geräten mit JavaScript
Adriano Repetti
@ TimSmith Vielen Dank für Ihre Mitarbeit. Mal sehen, ob wir diese Frage wieder öffnen können.
Fuz

Antworten:

124

Dies liegt daran, dass JS eine doppelte Genauigkeit für die Zahlen verwendet. Wenn Sie jedoch Operationen mit Bits ausführen möchten, ist die Aufgabe nicht trivial. Eine spezielle Anweisung zum Konvertieren von JS double in eine Ganzzahl erleichtert die Sache.

Dieser ARM-Link erklärt es sehr gut: https://community.arm.com/processors/b/blog/posts/armv8-a-architecture-2016-additions

Um weitere Informationen zu fuz 'Kommentar hinzuzufügen, bestehen die Unterschiede zwischen FCVTZSund FJCVTZS(beide konvertieren Gleitkomma in int) darin, dass im Falle eines Überlaufs der FJCVTZSWert 0x80000000 ist, anstatt überzulaufen. Darüber hinaus FJCVTZSkann eine Ausnahme generiert werden, um anzuzeigen, wie die Konvertierung war (dh ungenau).

FJCVTZS: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801g/hko1477562192868.html

FCVTZS: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0802a/FCVTZS_float_int.html

Jose
quelle
8
Sie sollten erklären, warum die vorhandene FCVTZSAnweisung für die Aufgabe nicht ausreicht.
Fuz
13
Es ist nicht unzureichend, es ist viel langsamer (sagen wir mindestens 2/3 Mal), weil es 10 verschiedene Anweisungen erfordert, um dieselbe Aufgabe auszuführen. Natürlich ist die Auswirkung auf einen größeren Algorithmus VIEL geringer als diese, aber wenn Sie an einem kleineren A53 arbeiten, profitieren sowohl Geschwindigkeit als auch Speicher davon.) Lassen Sie uns dies nun beispielsweise auf V8 verschieben, das für ARM kompiliert wurde, und es wird definitiv einige wert sein CPU-Speicherplatz.
Adriano Repetti
Wird diese Anweisung nur verwendet, wenn JS-Laufzeit wie v8 geschrieben wird? Ist es im Allgemeinen in anderen Fällen nützlich?
wlnirvana