x86bytecodevisitor.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 2,035 行 · 第 1/5 页
JAVA
2,035 行
os.writeMOV(INTSIZE, T1, S0, 4);
helper.writePUSH64(T0, T1);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dastore()
*/
public final void visit_dastore() {
os.writeMOV(INTSIZE, T0, SP, 8); // Index
os.writeMOV(INTSIZE, S0, SP, 12); // Arrayref
checkBounds(S0, T0);
os.writeLEA(S0, S0, T0, 8, VmArray.DATA_OFFSET * 4);
helper.writePOP64(T0, T1); // Value
os.writeMOV(INTSIZE, S0, 0, T0);
os.writeMOV(INTSIZE, S0, 4, T1);
os.writeLEA(SP, SP, 8); // Remove index, arrayref
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dcmpg()
*/
public final void visit_dcmpg() {
visit_dfcmp(true, false);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dcmpl()
*/
public final void visit_dcmpl() {
visit_dfcmp(false, false);
}
/**
* @param value
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dconst(double)
*/
public final void visit_dconst(double value) {
visit_lconst(Double.doubleToLongBits(value));
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_ddiv()
*/
public final void visit_ddiv() {
os.writeFLD64(SP, 8);
os.writeFDIV64(SP, 0);
os.writeLEA(SP, SP, 8);
os.writeFSTP64(SP, 0);
}
/**
* @param index
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dload(int)
*/
public final void visit_dload(int index) {
int ebpOfs = stackFrame.getWideEbpOffset(index);
os.writeMOV(INTSIZE, Register.EAX, FP, ebpOfs);
os.writeMOV(INTSIZE, Register.EDX, FP, ebpOfs + 4);
helper.writePUSH64(Register.EAX, Register.EDX);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dmul()
*/
public final void visit_dmul() {
os.writeFLD64(SP, 8);
os.writeFMUL64(SP, 0);
os.writeLEA(SP, SP, 8);
os.writeFSTP64(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dneg()
*/
public final void visit_dneg() {
os.writeFLD64(SP, 0);
os.writeFCHS();
os.writeFSTP64(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_drem()
*/
public final void visit_drem() {
os.writeFLD64(SP, 8);
os.writeFLD64(SP, 0);
os.writeFPREM();
os.writeLEA(SP, SP, 8);
os.writeFSTP64(SP, 0);
os.writeFFREE(Register.ST0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dreturn()
*/
public final void visit_dreturn() {
helper.writePOP64(Register.EAX, Register.EDX);
visit_return();
}
/**
* @param index
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dstore(int)
*/
public final void visit_dstore(int index) {
int ebpOfs = stackFrame.getWideEbpOffset(index);
helper.writePOP64(Register.EAX, Register.EDX);
os.writeMOV(INTSIZE, FP, ebpOfs, Register.EAX);
os.writeMOV(INTSIZE, FP, ebpOfs + 4, Register.EDX);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dsub()
*/
public final void visit_dsub() {
os.writeFLD64(SP, 8);
os.writeFSUB64(SP, 0);
os.writeLEA(SP, SP, 8);
os.writeFSTP64(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup_x1()
*/
public final void visit_dup_x1() {
os.log("dup_x1");
helper.writePOP(T0); // Value1
helper.writePOP(S0); // Value2
helper.writePUSH(T0); // Value1
helper.writePUSH(S0); // Value2
helper.writePUSH(T0); // Value1
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup_x2()
*/
public final void visit_dup_x2() {
os.log("dup_x2");
helper.writePOP(T0); // Value1
helper.writePOP(T1); // Value2
helper.writePOP(S0); // Value3
helper.writePUSH(T0); // Value1
helper.writePUSH(S0); // Value3
helper.writePUSH(T1); // Value2
helper.writePUSH(T0); // Value1
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup()
*/
public final void visit_dup() {
os.log("dup");
os.writeMOV(INTSIZE, T0, SP, 0); // Value1, leave on stack
helper.writePUSH(T0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup2_x1()
*/
public final void visit_dup2_x1() {
os.log("dup2_x1");
helper.writePOP(T0); // Value1
helper.writePOP(T1); // Value2
helper.writePOP(S0); // Value3
helper.writePUSH(T1); // Value2
helper.writePUSH(T0); // Value1
helper.writePUSH(S0); // Value3
helper.writePUSH(T1); // Value2
helper.writePUSH(T0); // Value1
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup2_x2()
*/
public final void visit_dup2_x2() {
os.log("dup2_x2");
helper.writePOP(Register.EAX); // Value1
helper.writePOP(Register.EBX); // Value2
helper.writePOP(Register.ECX); // Value3
helper.writePOP(Register.EDX); // Value4
helper.writePUSH(Register.EBX); // Value2
helper.writePUSH(Register.EAX); // Value1
helper.writePUSH(Register.EDX); // Value4
helper.writePUSH(Register.ECX); // Value3
helper.writePUSH(Register.EBX); // Value2
helper.writePUSH(Register.EAX); // Value1
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_dup2()
*/
public final void visit_dup2() {
os.log("dup2");
os.writeMOV(INTSIZE, T0, SP, 0); // value1
os.writeMOV(INTSIZE, S0, SP, 4); // value2
helper.writePUSH(S0);
helper.writePUSH(T0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_f2d()
*/
public final void visit_f2d() {
os.writeFLD32(SP, 0);
os.writeLEA(SP, SP, -4);
os.writeFSTP64(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_f2i()
*/
public final void visit_f2i() {
os.writeFLD32(SP, 0);
os.writeFISTP32(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_f2l()
*/
public final void visit_f2l() {
os.writeFLD32(SP, 0);
os.writeLEA(SP, SP, -4);
os.writeFISTP64(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fadd()
*/
public final void visit_fadd() {
os.writeFLD32(SP, 4);
os.writeFADD32(SP, 0);
os.writeLEA(SP, SP, 4);
os.writeFSTP32(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_faload()
*/
public final void visit_faload() {
helper.writePOP(T0); // Index
helper.writePOP(S0); // Arrayref
checkBounds(S0, T0);
os.writeMOV(INTSIZE, T0, S0, T0, 4, VmArray.DATA_OFFSET * 4);
helper.writePUSH(T0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fastore()
*/
public final void visit_fastore() {
helper.writePOP(T1); // Value
helper.writePOP(T0); // Index
helper.writePOP(S0); // Arrayref
checkBounds(S0, T0);
os.writeMOV(INTSIZE, S0, T0, 4, VmArray.DATA_OFFSET * 4, T1);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fcmpg()
*/
public final void visit_fcmpg() {
visit_dfcmp(true, true);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fcmpl()
*/
public final void visit_fcmpl() {
visit_dfcmp(false, true);
}
private void visit_dfcmp(boolean gt, boolean isfloat) {
if (isfloat) {
if (gt) {
os.writeFLD32(SP, 4); // reverse order
os.writeFLD32(SP, 0);
} else {
os.writeFLD32(SP, 0);
os.writeFLD32(SP, 4);
}
os.writeLEA(SP, SP, 8);
} else {
if (gt) {
os.writeFLD64(SP, 8); // reverse order
os.writeFLD64(SP, 0);
} else {
os.writeFLD64(SP, 0);
os.writeFLD64(SP, 8);
}
os.writeLEA(SP, SP, 16);
}
os.writeFUCOMPP(); // Compare, Pop twice
os.writeFNSTSW_AX(); // Store fp status word in AX
os.writeSAHF(); // Store AH to Flags
Label eqLabel = new Label(this.curInstrLabel + "eq");
Label ltLabel = new Label(this.curInstrLabel + "lt");
Label endLabel = new Label(this.curInstrLabel + "end");
os.writeJCC(eqLabel, X86Constants.JE);
os.writeJCC(ltLabel, X86Constants.JB);
// Greater
if (gt) {
os.writeMOV_Const(Register.ECX, -1);
} else {
os.writeMOV_Const(Register.ECX, 1);
}
os.writeJMP(endLabel);
// Equal
os.setObjectRef(eqLabel);
os.writeXOR(Register.ECX, Register.ECX);
os.writeJMP(endLabel);
// Less
os.setObjectRef(ltLabel);
if (gt) {
os.writeMOV_Const(Register.ECX, 1);
} else {
os.writeMOV_Const(Register.ECX, -1);
}
// End
os.setObjectRef(endLabel);
helper.writePUSH(Register.ECX);
}
/**
* @param value
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fconst(float)
*/
public final void visit_fconst(float value) {
os.writeMOV_Const(Register.EAX, Float.floatToIntBits(value));
helper.writePUSH(Register.EAX);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fdiv()
*/
public final void visit_fdiv() {
os.writeFLD32(SP, 4);
os.writeFDIV32(SP, 0);
os.writeLEA(SP, SP, 4);
os.writeFSTP32(SP, 0);
}
/**
* @param index
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fload(int)
*/
public final void visit_fload(int index) {
final int ebpOfs = stackFrame.getEbpOffset(index);
os.writeMOV(INTSIZE, T0, FP, ebpOfs);
helper.writePUSH(T0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fmul()
*/
public final void visit_fmul() {
os.writeFLD32(SP, 4);
os.writeFMUL32(SP, 0);
os.writeLEA(SP, SP, 4);
os.writeFSTP32(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fneg()
*/
public final void visit_fneg() {
os.writeFLD32(SP, 0);
os.writeFCHS();
os.writeFSTP32(SP, 0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_frem()
*/
public final void visit_frem() {
// reverse because pushing on fp stack
os.writeFLD32(SP, 0);
os.writeFLD32(SP, 4);
os.writeFPREM();
os.writeLEA(SP, SP, 4);
os.writeFSTP32(SP, 0);
os.writeFFREE(Register.ST0);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_freturn()
*/
public final void visit_freturn() {
helper.writePOP(Register.EAX);
visit_return();
}
/**
* @param index
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fstore(int)
*/
public final void visit_fstore(int index) {
int ebpOfs = stackFrame.getEbpOffset(index);
helper.writePOP(FP, ebpOfs);
}
/**
* @see org.jnode.vm.bytecode.BytecodeVisitor#visit_fsub()
*/
public final void visit_fsub() {
os.writeFLD32(SP, 4);
os.writeFSUB32(SP, 0);
os.writeLEA(SP, SP, 4);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?