我不明白 JVM 实现中的这个操作码



我正在编写一个JVM。我一个接一个地实现所有操作码,直到我面对dup2。oracle指令集https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.dup2表示

复制操作数堆栈上最前面的一个或两个值,并按原始顺序将重复的一个值或多个值推回到操作数堆栈

我应该如何选择要执行的操作?我怎么知道什么时候应该只复制顶部,还是应该复制顶部的两个值?

操作码的描述说:

表格1:

值2,值1→

value2,value1,value2,value 1

其中value1和value2都是类别1计算的值类型(§2.11.1(。

表格2:

价值→

值,值

其中value是第2类计算类型的值(§2.11.1(。

类别2类型为longdouble,类别1为其他类型。因此,在Java的原始版本中,类别2意味着64位类型,类别1意味着32位类型。当引入64位JVM时,这种区别就不再有效了。现在,解释器或JIT编译器需要跟踪从opstack推送和弹出的值的类别,直到它知道堆栈顶部的值是类别1还是类别2。

请注意,JVM需要在验证时进行这种分析,以便检查4.10.1.7.类型检查装载和储存说明

相关内容

  • 没有找到相关文章

最新更新