Пример #1
0
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++;
}
Пример #2
0
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);
}