ARMチップにJavascriptという名前の命令(FJCVTZS)があるのはなぜですか?


148

FJCVTZSは、「浮動小数点Javascriptを符号付き固定小数点に変換し、ゼロに向かって丸める」です。Armv8.3-Aチップ以降でサポートされています。JavaScriptがベアメタルにそれほど近いとは思わないので、これは奇妙なことです。

命令の機能の説明はありますが、なぜ存在するのかはわかりません。 このスレッドは、「JSには整数型がないため、特定のユースケースでは、アルゴリズム上の理由がないために、この操作がわいせつに必要になることが多いため、単一の命令として存在します」と述べています。それはもっともらしいですが、もっと詳しく理解したいと思います。


4
その引用のサポート:JavaScriptエンジンはToInt32、ビット単位の演算子を数値に適用するとき、およびその他のさまざまなときに(エンジンが数値を整数として維持できた場合を除き)、この操作(仕様で呼び出されます)を実行する必要があります。最適化されますが、多くの場合はできません)。
TJクラウダー

1
FCVTZSこのジョブに提供される通常の命令との決定的な違いFJCVTZSは、オーバーフロー時の動作が異なることです。つまり、常に最小32ビットを取得しますがFCVTZS、数が収まらない場合は、代わりに別のことを行うように見えます。の正しい動作は、FJCVTZS他の方法で実装するのは少し難しいようです。
fuz 2018年

1
@Tim私はTJに同意します、会議の議事録はトピックから外れています(そして、それらも制限されているので、ほとんど持つことができないと思います)が、ARM搭載デバイスでJavaScriptを実行することは重要です、IoTデバイスの構築を
Adriano Repetti 2018年

@TimSmithご協力ありがとうございます。この質問を再開できるかどうか見てみましょう。
fuz 2018年

回答:


132

JSは数値に倍精度を使用しているためですが、ビットを使用して演算を実行する場合、タスクは簡単ではないため、JSの倍精度を整数に変換する特定の命令を使用すると簡単になります。

このARMリンクはそれを非常によく説明しています:https//community.arm.com/processors/b/blog/posts/armv8-a-architecture-2016-additions

fuzのコメントに関する詳細情報を追加するために、FCVTZSFJCVTZS(両方とも浮動小数点をintに変換する)の違いは、オーバーフローの場合、FJCVTZS値がオーバーフローではなく0x80000000になることです。さらに、FJCVTZS変換がどのように行われたか(つまり不正確)を示すために例外を生成できます。

FJCVTZShttp//infocenter.arm.com/help/index.jsp?topic = / com.arm.doc.dui0801g / hko1477562192868.html

FCVTZShttp//infocenter.arm.com/help/index.jsp?topic = / com.arm.doc.dui0802a / FCVTZS_float_int.html


8
既存のFCVTZS命令がタスクに対して不十分である理由を説明する必要があります。
fuz 2018年

13
同じタスクを実行するには10の異なる命令が必要なため、不十分ではありません。かなり遅くなります(たとえば、少なくとも2/3倍)。もちろん、より大きなアルゴリズムへの影響はそれよりもはるかに低いですが、より小さなA53で作業する場合は、速度とメモリの両方がこれの恩恵を受けます。)次に、これをたとえばARM用にコンパイルされたV8に移動しましょう。 CPUスペース。
アドリアーノレペッティ2018年

この命令は、v8のようなJSランタイムを作成する場合にのみ使用されますか?一般的に、それは他の場合に役立ちますか?
wlnirvana
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.