簡體   English   中英

是否可以在 AArch64 計算機中編寫執行 FMOV 指令的 Java 程序?

[英]Is it possible to write a Java program which executes the FMOV instruction in an AArch64 computer?

根據《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>

閱讀 armv8 規范:

浮點移動(寄存器)指令將標量浮點值從一個寄存器復制到另一個寄存器,而不執行任何轉換。 一些浮點移動(寄存器)指令與高級 SIMD 指令 DUP、INS 和 UMOV 提供的功能重疊。 但是,Arm 建議在對標量浮點數據進行操作時使用 FMOV 指令,以避免創建取決於高級 SIMD 指令集的可用性的標量浮點代碼。 表 C3-64 顯示了浮點移動(寄存器)指令。

規范表明,如果列出的 SIMD 指令不可用,則該指令是從浮點寄存器移動到通用寄存器的唯一方法。 因此,您需要 java 代碼將浮點數轉換為 int 而不執行轉換,以及不支持 SIMD 的處理器。

在 java 中執行此操作的事實上的方法似乎是Float.floatToIntBits

在我的 JVM 安裝(熱點 jdk8u 森林)上,這是作為本機 function 實現的。 這個原生的 function 最終到達了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的定義在同一個文件中,據我所知 output 是一條FMOV指令。

值得注意的是MoveF2INode被發出,盡管這最終可能會調用本機代碼而不是實際 JIT 的FMOV

我有點矛盾,因為看起來這個問題可能是一個家庭作業問題。 但是,如果這是作業發行人正在尋找的答案,那似乎是一個愚蠢的作業問題,所以我對現有的答案很好。

雖然無法確定該指令是否會在程序運行之前執行,但我們可以通過 HotSpot Disassembler (hsdis) 找出執行的指令以及與簡單 Java 程序的指令相關的操作碼。 為了獲取相應的操作碼,首先需要生成一個日志文件。 然后,通過使用這個日志文件,需要生成一個跟蹤文件來找出“那個”特定程序的執行操作碼是什么。 在這種情況下,最好只為目標 function 限制跟蹤文件的生成。 因為否則那將是一個大文件。

帶有此語句的簡單 Java 程序 - x = x*2.0F; 在 1000 萬次循環上運行導致該指令的執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM