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

I don't understand this opcode in JVM Implementation

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

Duplicate the top one or two values on the operand stack and push the duplicated value or values back onto the operand stack in the original order

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

操作码的描述说:

Form 1:

..., value2, value1 →

..., value2, value1, value2, value1

where both value1 and value2 are values of a category 1 computational type (§2.11.1).

Form 2:

..., value →

..., value, value

where value is a value of a category 2 computational type (§2.11.1).

第 2 类是 longdouble,第 1 类是其他类型。所以在 Java 的原始版本中,类别 2 类型表示 64 位类型,类别 1 表示 32 位类型。当引入 64 位 JVM 时,这种区别不再有效。现在,解释器或 JIT 编译器需要跟踪从 opstack 推送和弹出的值的类别,以使其知道堆栈顶部的值是类别 1 还是类别 2。

请注意,JVM 需要在验证时进行此类分析,以检查 中规定的要求 4.10.1.7。类型检查加载和存储指令