Instructions Bytecode::parser(const Tokens& tokens) const { Tokens tokens_group; // Abstract syntax tree. Instructions ast; int funcs = 0, params = 0, specs = 0; for (int i = 0; i < tokens.size(); i++) { if (tokens[i].type == DELIMITER) { checkFunctions(tokens_group[0], funcs); checkById(tokens_group[0].function_id, params, specs); Instruction inst = makeInstruction(params, specs, tokens_group); ast.push_back(inst); funcs = 0, params = 0, specs = 0; tokens_group.clear(); } else { if (tokens[i].type == FUNCTION) { funcs++; } else if (tokens[i].type == PARAMETER) { params++; } else { specs++; } tokens_group.push_back(tokens[i]); } } return ast; }
SSATmp* Simplifier::simplifyQueryJmp(IRInstruction* inst) { SSATmp* src1 = inst->getSrc(0); SSATmp* src2 = inst->getSrc(1); Opcode opc = inst->getOpcode(); // reuse the logic in simplifyCmp. SSATmp* newCmp = simplifyCmp(queryJmpToQueryOp(opc), src1, src2); if (!newCmp) return nullptr; SSATmp* newQueryJmp = makeInstruction( [=] (IRInstruction* condJmp) -> SSATmp* { SSATmp* newCondJmp = simplifyCondJmp(condJmp); if (newCondJmp) return newCondJmp; if (condJmp->getOpcode() == Nop) { // simplifyCondJmp folded the branch into a nop inst->convertToNop(); } // Couldn't fold condJmp or combine it with newCmp return nullptr; }, JmpNZero, inst->getTaken(), newCmp); if (!newQueryJmp) return nullptr; return newQueryJmp; }