void CodeWriter::writeArithmeticGt() { string labelTrue("JGT_TRUE_" + moduleName + "_" + to_string(symbolCounter)); string labelFalse("JGT_FALSE_" + moduleName + "_" + to_string(symbolCounter)); write("@SP // gt"); write("AM=M-1"); write("D=M"); write("@SP"); write("AM=M-1"); write("D=M-D"); write("@" + labelTrue); write("D;JGT"); write("D=0"); write("@" + labelFalse); write("0;JMP"); write("(" + labelTrue + ")", false); write("D=-1"); write("(" + labelFalse + ")", false); write("@SP"); write("A=M"); write("M=D"); write("@SP"); write("M=M+1"); symbolCounter++; }
void BytecodeGenerator::genBoolFromIficmp(Bytecode* bc, Instruction ificmp, size_t popsNum) { Label labelTrue(bc); bc->addBranch(ificmp, labelTrue); genRepeatInsn(bc, BC_POP, popsNum); bc->addInsn(BC_ILOAD0); Label labelEnd(bc); bc->addBranch(BC_JA, labelEnd); bc->bind(labelTrue); genRepeatInsn(bc, BC_POP, popsNum); bc->addInsn(BC_ILOAD1); bc->bind(labelEnd); }