为啥 ARM 芯片的指令名称中带有 Javascript(FJCVTZS)?

Posted

技术标签:

【中文标题】为啥 ARM 芯片的指令名称中带有 Javascript(FJCVTZS)?【英文标题】:Why do ARM chips have an instruction with Javascript in the name (FJCVTZS)?为什么 ARM 芯片的指令名称中带有 Javascript(FJCVTZS)? 【发布时间】:2018-11-30 16:14:15 【问题描述】:

FJCVTZS 是“浮点 javascript 转换为有符号定点,向零舍入”。 Arm v8.3-A 芯片及更高版本支持它。这很奇怪,因为您不希望看到 JavaScript 如此接近裸机。

我可以找到该指令作用的解释,但找不到它存在的原因。 This thread 说“它作为一条指令存在是因为 JS 缺少整数类型意味着某些用例经常需要这个操作,因为没有好的算法原因。”。这似乎是合理的,但我想要更详细的了解。

【问题讨论】:

支持该引用:JavaScript 引擎必须执行此操作(在规范中称为 ToInt32),无论何时您将按位运算符应用于数字和其他各种时间(除非引擎具有能够将数字保持为整数作为优化,但在许多情况下它不能)。 请注意,与通常为该作业提供的FCVTZS 指令的关键区别在于FJCVTZS 在溢出时具有不同的行为。也就是说,你总是得到最少的 32 位,而 FCVTZS 似乎会做一些不同的事情,而不是如果数字不合适。 FJCVTZS 的正确行为似乎有点难以实现。 @Tim 我同意 TJ 的观点,会议纪要是题外话(我想它们也受到限制,你几乎无法拥有它们)但是在 ARM 驱动的设备上运行 JavaScript 是一件事,见Building IoT devices with JavaScript @TimSmith 感谢您的合作。让我们看看我们是否可以重新提出这个问题。 【参考方案1】:

这是因为 JS 对数字使用了双精度,但是如果你想用位执行操作,任务就很重要了,所以将 JS 的双精度转换为整数的特定指令使事情变得更容易。

这个 ARM 链接解释得很好:https://community.arm.com/processors/b/blog/posts/armv8-a-architecture-2016-additions

为了补充更多关于fuz评论的信息,FCVTZSFJCVTZS之间的区别(两者都将浮点数转换为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

【讨论】:

您应该解释为什么现有的FCVTZS 指令不足以完成该任务。 这不是不够的,它要慢得多(假设至少是 2/3 倍),因为它需要 10 条不同的指令来执行相同的任务。当然,对更大算法的影响远低于此,但在较小的 A53 上工作时,速度和内存都会受益于此。)现在让我们将其移至为 ARM 编译的 V8,它肯定值得一些CPU 空间。 这个指令是不是只有在写像v8这样的JS运行时才会用到?一般来说,它在其他情况下有用吗? @wlnirvana 对于在 ARM 上获取 x86_64 行为也很有用 ***.com/questions/66279679

以上是关于为啥 ARM 芯片的指令名称中带有 Javascript(FJCVTZS)?的主要内容,如果未能解决你的问题,请参考以下文章

国产CPU命名为啥?

不懂,为啥都说高通820的Kryo架构是自研架构

三种主流芯片架构

为啥 ARM 使用两条指令来屏蔽一个值?

为啥要使用thumb模式,与ARM相比较,Thumb代码的两大优势是啥?

ARM 架构及汇编