Чому чіпи ARM мають інструкцію з Javascript на ім’я (FJCVTZS)?


148

FJCVTZS - це "Перетворення Javascript з плаваючою комою на підписану фіксовану крапку, округлення до нуля". Він підтримується в чіпах Arm v8.3-A та пізніших версіях. Що дивно, адже ви не очікуєте побачити JavaScript так близько до оголеного металу.

Я можу знайти пояснення того, що робить інструкція, але не чому вона існує. Цей потік говорить: "він існує як одна інструкція, оскільки відсутність у JS цілочисельного типу означає, що певні випадки використання потребують цієї операції нецензурно часто без поважних алгоритмічних причин." Це правдоподібно, але я хотів би більш детального розуміння.


4
Підтримка цієї цитати: Механізм JavaScript повинен виконати цю операцію (що називається ToInt32в специфікації), коли ви застосовуєте побітове оператор до числа та в інший час (якщо движок не зміг зберегти число як ціле число як оптимізація, але в багатьох випадках це неможливо).
TJ Crowder,

1
Зверніть увагу, що суттєвою відмінністю від звичайних FCVTZSінструкцій, передбачених для цієї роботи, є те, що FJCVTZSвона має іншу поведінку при переповненні. А саме, ви завжди отримуєте мінімум 32 біти, тоді як, FCVTZSздається, робите щось інше, якщо число не відповідає. Правильна поведінка, FJCVTZSздається, трохи складна, щоб реалізувати інакше.
fuz

1
@Tim, я погоджуюсь з TJ, протоколи засідання не пов'язані з темою (і, я гадаю, вони також обмежені, то навряд чи ви можете їх мати), але запускати JavaScript на ARM-пристрої - це річ, див. Створення пристроїв IoT з JavaScript
Адріано Репетті

@TimSmith Дякуємо за співпрацю. Давайте подивимось, чи зможемо ми знову відкрити це питання.
fuz

Відповіді:


132

Це тому, що JS використовує подвійну точність для чисел, але якщо ви хочете виконувати операції з бітами, завдання нетривіальне, тому конкретна інструкція для перетворення JS double у ціле число полегшує справу.

Це посилання на ARM це дуже добре пояснює: https://community.arm.com/processors/b/blog/posts/armv8-a-architecture-2016-additions

Для того, щоб додати більше інформації щодо коментаря fuz, відмінності між FCVTZSі FJCVTZS(обидва вони перетворюють плаваючу крапку в int) полягають у тому, що у разі переповнення FJCVTZSзначення буде 0x80000000 замість переповнення. Крім того, FJCVTZSможе генерувати виняток, щоб вказати, яким було перетворення (тобто неточним).

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


8
Ви повинні пояснити, чому існуюча FCVTZSінструкція недостатня для виконання завдання.
fuz

13
Це недостатньо, воно набагато ПОВІЛЬШЕ (скажімо принаймні 2/3 рази), оскільки для виконання одного і того ж завдання потрібно 10 різних інструкцій. Звичайно, вплив на більший алгоритм НАБАГАТО менший, ніж при цьому, але при роботі над меншим A53 це виграє і швидкість, і пам’ять.) Тепер перенесімо це, наприклад, до V8, скомпільованого для ARM, і це, безумовно, буде гідним Процесорний простір.
Адріано Репетті,

Чи використовується ця інструкція лише при написанні середовища виконання JS, як v8? Загалом, чи корисно це в інших випадках?
wlnirvana
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.