I'm building a class that gathers some of the possible JVM opcodes. I found out how to generate DUP2_X2 and DUP_X2 but not DUP2, DUP2_X1, SWAP.
Below the code sample in which I starting gathering some of the jvm opcodes :
public class JvmOpCodes {
long dup2x2(long[] array, int i, long l) {
return array[i] = l;
}
int dupx2(int[] array, int i, int l) {
return array[i] = l;
}
long lneg(long a) {
return -a;
}
long lor(long a, long b) {
return a | b;
}
long land(long a, long b) {
return a & b;
}
long lushr(long a, long b) {
return a >>> b;
}
int iushr(int a, int b) {
return a >>> b;
}
long lshl(long a, long b) {
return a << b;
}
float fsub(float a, float b) {
return a - b;
}
float fadd(float a, float b) {
return a + b;
}
float frem(float a, float b) {
return a % b;
}
float fneg(float a) {
return -a;
}
double drem(double a, double b) {
return a % b;
}
double dneg(double a) {
return -a;
}
void pop() {
Math.round(0.5f);
}
void pop2() {
Math.round(0.5d);
}
}
After compiling with javac
command and running javap -p -c
, I'm able to identify the produced JVM opcodes inside the output :
Compiled from "JvmOpCodes.java"
public class org.apache.bcel.verifier.tests.JvmOpCodes {
public org.apache.bcel.verifier.tests.JvmOpCodes();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
long dup2x2(long[], int, long);
Code:
0: aload_1
1: iload_2
2: lload_3
3: dup2_x2
4: lastore
5: lreturn
int dupx2(int[], int, int);
Code:
0: aload_1
1: iload_2
2: iload_3
3: dup_x2
4: iastore
5: ireturn
long lneg(long);
Code:
0: lload_1
1: lneg
2: lreturn
long lor(long, long);
Code:
0: lload_1
1: lload_3
2: lor
3: lreturn
long land(long, long);
Code:
0: lload_1
1: lload_3
2: land
3: lreturn
long lushr(long, long);
Code:
0: lload_1
1: lload_3
2: l2i
3: lushr
4: lreturn
int iushr(int, int);
Code:
0: iload_1
1: iload_2
2: iushr
3: ireturn
long lshl(long, long);
Code:
0: lload_1
1: lload_3
2: l2i
3: lshl
4: lreturn
float fsub(float, float);
Code:
0: fload_1
1: fload_2
2: fsub
3: freturn
float fadd(float, float);
Code:
0: fload_1
1: fload_2
2: fadd
3: freturn
float frem(float, float);
Code:
0: fload_1
1: fload_2
2: frem
3: freturn
float fneg(float);
Code:
0: fload_1
1: fneg
2: freturn
double drem(double, double);
Code:
0: dload_1
1: dload_3
2: drem
3: dreturn
double dneg(double);
Code:
0: dload_1
1: dneg
2: dreturn
void pop();
Code:
0: ldc #7 // float 0.5f
2: invokestatic #8 // Method java/lang/Math.round:(F)I
5: pop
6: return
void pop2();
Code:
0: ldc2_w #14 // double 0.5d
3: invokestatic #16 // Method java/lang/Math.round:(D)J
6: pop2
7: return
}
However, what piece of code in Java will generate the JVM instructions DUP2, DUP2_X1, SWAP ?
Also, an interesting related answer with demo here : https://stackoverflow.com/a/72131218/8315843