[英]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.