我正在编写JVM。我一直在逐个实现所有的操作码,直到我面对dup2。甲骨文指令集https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.dup2说
复制操作数堆栈上的一个或两个值,并按原来的顺序将重复的值推送回操作数堆栈。
我该如何选择执行哪一项手术?我如何知道什么时候应该只复制顶部,或者应该复制前两个值?
发布于 2022-02-26 13:53:40
对操作码的描述是:
表格1:
,value2,value1→
,value2,value1,value2,value1
其中value1和value2都是第1类计算类型的值(§2.11.1)。
表格2:
.,值→
.,价值
其中值是第2类计算类型的值(§2.11.1)。
类别2类型为long和double,类别1为其他类型。因此,在Java的原始版本中,类别2表示64位类型,类别1表示32位类型。当引入64位JVM时,这种区别不再有效。现在,解释器或JIT编译器需要跟踪从opstack中推入和弹出的值类别,直到它知道堆栈顶部的值是类别1还是类别2。
请注意,JVM需要在验证时进行这种分析,以检查 4.10.1.7. Type Checking Load and Store Instructions 中列出的需求。
https://stackoverflow.com/questions/71277062
复制相似问题