为啥 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评论的信息,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
【讨论】:
您应该解释为什么现有的FCVTZS
指令不足以完成该任务。
这不是不够的,它要慢得多(假设至少是 2/3 倍),因为它需要 10 条不同的指令来执行相同的任务。当然,对更大算法的影响远低于此,但在较小的 A53 上工作时,速度和内存都会受益于此。)现在让我们将其移至为 ARM 编译的 V8,它肯定值得一些CPU 空间。
这个指令是不是只有在写像v8这样的JS运行时才会用到?一般来说,它在其他情况下有用吗?
@wlnirvana 对于在 ARM 上获取 x86_64 行为也很有用 ***.com/questions/66279679以上是关于为啥 ARM 芯片的指令名称中带有 Javascript(FJCVTZS)?的主要内容,如果未能解决你的问题,请参考以下文章