我正在编写一个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类型为long
和double
,类别1为其他类型。因此,在Java的原始版本中,类别2意味着64位类型,类别1意味着32位类型。当引入64位JVM时,这种区别就不再有效了。现在,解释器或JIT编译器需要跟踪从opstack推送和弹出的值的类别,直到它知道堆栈顶部的值是类别1还是类别2。
请注意,JVM需要在验证时进行这种分析,以便检查4.10.1.7.类型检查装载和储存说明