【问题标题】:Is it possible to write a Java program which executes the FMOV instruction in an AArch64 computer?是否可以在 AArch64 计算机中编写执行 FMOV 指令的 Java 程序?
【发布时间】:2020-08-13 18:40:34
【问题描述】:

根据《Arm Architecture Reference Manual Armv8, for Armv8-A architecture profile》,有一条指令FMOV (scalar, immediate)。说明“该指令将浮点立即数常量复制到 SIMD & FP 目标寄存器”。

是否可以编写一个简单的 Java 程序在 AArch64 机器上执行这条指令?另外,如何验证编写的程序是否执行特定指令?谢谢。

PS1:我正在使用 Eclipse OpenJ9 VM (https://www.eclipse.org/openj9)。
PS2:由于javap 是基于字节码的,所以这不是我想要的。我也尝试了以下命令,但无法验证指令执行-

java -Xjit:limit={<function_name>} -Xjit:verbose,vlog=<vlogfile_name> <class_name>
java -Xjit:verbose,vlog=<vlogfile_name> <class_name>

【问题讨论】:

  • javap -v 不会为您做任何事情:那是 Java 字节码,它根本不是特定于机器的。
  • 您必须使用 JNI 才能使用原始指令。或者你可以稍微修改一下JVM
  • 为什么需要这个?你想解决什么问题?
  • @Protik 你不能用 Java 编写像内联汇编这样的东西。您必须使用 JNI、JNA 或 Project Panama
  • 不同的人(12)提出了这个不寻常的问题,这是非常了不起的。所以,这是你的家庭作业/测试作业,不是吗?如果是这样,请看一下,how to ask homework questions

标签: java jvm arm64


【解决方案1】:

阅读 armv8 规范:

浮点移动(寄存器)指令将标量浮点值从一个寄存器复制到另一个寄存器 注册而不执行任何转换。 一些浮点移动(寄存器)指令与 Advanced 提供的功能重叠 SIMD 指令 DUP 、 INS 和 UMOV 。但是,Arm 建议在操作时使用 FMOV 指令 标量浮点数据,以避免创建依赖于可用性的标量浮点代码 高级 SIMD 指令集。 表 C3-64 显示了浮点移动(寄存器)指令。

规范表明,如果列出的 SIMD 指令不可用,则该指令是从浮点寄存器移动到通用寄存器的唯一方法。因此,您需要无需执行转换即可将浮点数转换为 int 的 java 代码,以及不支持 SIMD 的处理器。

在 java 中执行此操作的实际方法似乎是 Float.floatToIntBits

在我的 JVM 安装(热点 jdk8u 森林)上,这是作为本机函数实现的。这个原生函数最终到达hotspot/src/share/vm/opto/library_call.cpp,代码如下:

case vmIntrinsics::_floatToRawIntBits:
  case vmIntrinsics::_floatToIntBits:
  case vmIntrinsics::_intBitsToFloat:
  case vmIntrinsics::_doubleToRawLongBits:
  case vmIntrinsics::_doubleToLongBits:
  case vmIntrinsics::_longBitsToDouble:         
return inline_fp_conversions(intrinsic_id());

inline_fp_conversions 的定义在同一个文件中,据我所知可以输出FMOV 指令。

值得注意的是 MoveF2INode 被发出,尽管这最终可能会调用本机代码而不是实际 JIT 处理 FMOV

我有点矛盾,因为看起来这个问题可能是一个家庭作业问题。但是,如果这是作业发行者正在寻找的答案,那似乎是一个愚蠢的作业问题,所以我对现有的答案很好。

【讨论】:

  • 感谢您的回答。现在我更清楚了。但是我仍然不明白如何确定该指令(或任何其他指令而不是该指令)是针对 Java 代码执行的,因为提到的链接(在 cmets 中)谈到了 Sun Hotspot JVM,这与我的情况不同。我已经在 cmets 中澄清了这个问题是否是家庭作业。我无法想象会有这样的作业问题,我可能错了。
  • 你不能确定 FMOV 会被执行(没有调试/记录来找出实际执行的内容)。必须阅读 openj9 的源代码才能准确确定热点的不同之处。
【解决方案2】:

虽然无法确定该指令是否会在程序运行前执行,但我们可以通过 HotSpot Disassembler (hsdis) 找出执行的指令以及与简单 Java 程序的指令相关的操作码。为了获取相应的操作码,首先需要生成一个日志文件。然后,通过使用这个日志文件,需要生成一个跟踪文件来找出针对“那个”特定程序执行的操作码是什么。在这种情况下,最好只为目标函数限制跟踪文件的生成。因为否则那将是一个大文件。

一个带有这条语句的简单 Java 程序 - x = x*2.0F; 在 1000 万次循环上运行导致了这条指令的执行。

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多