Dlaczego układy ARM mają instrukcję z Javascriptem w nazwie (FJCVTZS)?

148

FJCVTZS to „Konwersja zmiennoprzecinkowego kodu JavaScript na stały punkt ze znakiem , zaokrąglanie w kierunku zera”. Jest obsługiwany w układach Arm v8.3-A i nowszych. Co jest dziwne, ponieważ nie spodziewasz się, że JavaScript zobaczysz tak blisko gołego metalu.

Potrafię znaleźć wyjaśnienia dotyczące tego, co robi instrukcja, ale nie mogę znaleźć wyjaśnienia, dlaczego istnieje. Ten wątek mówi, że „istnieje jako pojedyncza instrukcja, ponieważ brak typu całkowitego w JS oznacza, że ​​niektóre przypadki użycia często wymagają tej operacji bez dobrego algorytmicznego powodu”. To prawdopodobne, ale chciałbym dokładniejszego zrozumienia.

Tim Smith
źródło
4
Wspierając ten cytat: mechanizm JavaScript musi wykonać tę operację (która jest wywoływana ToInt32w specyfikacji) za każdym razem, gdy zastosujesz operator bitowy do liczby i w różnych innych momentach (chyba że silnik był w stanie zachować liczbę jako liczbę całkowitą jako optymalizacji, ale w wielu przypadkach nie).
TJ Crowder
1
Zwróć uwagę, że zasadnicza różnica w stosunku do zwykłej FCVTZSinstrukcji dostarczonej dla tego zadania polega na tym, że FJCVTZSzachowuje się inaczej w przypadku przepełnienia. Mianowicie, zawsze otrzymujesz co najmniej 32 bity, podczas gdy FCVTZSwydaje się, że zamiast tego robisz coś innego, jeśli liczba nie pasuje. W przeciwnym razie poprawne zachowanie FJCVTZSwydaje się być nieco trudne do zaimplementowania.
fuz
1
@Tim Zgadzam się z TJ, protokoły ze spotkania są poza tematem (i przypuszczam, że są również ograniczone, więc prawie nie możesz ich mieć), ale uruchomienie JavaScript na urządzeniu z procesorem ARM jest rzeczą, zobacz Budowanie urządzeń IoT z JavaScript
Adriano Repetti
@TimSmith Dziękujemy za współpracę. Zobaczmy, czy uda nam się ponownie otworzyć to pytanie.
fuz

Odpowiedzi:

132

Dzieje się tak, ponieważ JS używa podwójnej precyzji dla liczb, ale jeśli chcesz wykonywać operacje na bitach, zadanie jest nietrywialne, więc konkretna instrukcja zamiany liczby podwójnej JS na liczbę całkowitą ułatwia sprawę.

Ten link ARM bardzo dobrze to wyjaśnia: https://community.arm.com/processors/b/blog/posts/armv8-a-architecture-2016-additions

Aby dodać więcej informacji na temat komentarza fuz, różnice między FCVTZSi FJCVTZS(oba konwertują zmiennoprzecinkowe na int) polegają na tym, że w przypadku przepełnienia FJCVTZSwartość będzie wynosić 0x80000000 zamiast przepełnienia. Ponadto FJCVTZSmoże wygenerować wyjątek, aby wskazać, w jaki sposób konwersja była (tj. Niedokładna).

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
źródło
8
Powinieneś wyjaśnić, dlaczego istniejąca FCVTZSinstrukcja jest niewystarczająca do wykonania zadania.
fuz
13
To nie jest niewystarczające, jest znacznie WOLNIEJSZE (powiedzmy co najmniej 2/3 razy), ponieważ wymaga 10 różnych instrukcji, aby wykonać to samo zadanie. Oczywiście wpływ na większy algorytm jest DUŻO mniejszy, ale podczas pracy na mniejszym A53 zarówno szybkość, jak i pamięć na tym skorzystają.) Teraz przenieśmy to na przykład do V8 skompilowanego dla ARM i na pewno będzie to warte trochę Przestrzeń procesora.
Adriano Repetti
Czy ta instrukcja jest używana tylko podczas pisania środowiska wykonawczego JS, takiego jak v8? Ogólnie, czy jest to przydatne w innych przypadkach?
wlnirvana