什么Java代码会强制javac 1.6使用'swap'和'nop'操作码?

per*_*iae 8 java jvm bytecode javac opcode

我正在开发一个业余的JVM实现,我正在努力确保我对规范中的所有操作码都有测试覆盖率.我已经得到它倒在过去的几年,但nopswap已经躲避我.例如,这是一个可能使用的简单函数swap:

static int do_swap() {
  int a = 56;
  int b = 32;
  return b%a;
}
Run Code Online (Sandbox Code Playgroud)

但是生成的字节码javac 1.6避免了交换代替本地存储:

static int do_swap();
  Code:
   0:   bipush  56
   2:   istore_0
   3:   bipush  32
   5:   istore_1
   6:   iload_1
   7:   iload_0
   8:   irem
   9:   ireturn
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Mat*_*hen 6

没有.Java语言规范不提供此类保证.您可以使用Jasmin(字节码汇编程序)编写自己的Java字节码.

  • 我认为Krakatau汇编程序对于生成JVM测试用例会更有用,因为它支持Jasmin没有的类文件格式的更加模糊的功能.(披露我写的).但对于像这样简单的事情,Jasmin足够好了. (2认同)