public ArithmeticResult comuteFunctionCall(String funcName,
			ArrayList<ArithmeticResult> argumentList, Block codeBlock) {
		// Predefined func
		if (funcName.equals("InputNum")) {
			codeBlock.putInputFuncCode();
			return new ArithmeticResult(new SSAVar(Instruction.getPC()));
		} else if (funcName.equals("OutputNum")) {
			if (argumentList.get(0).getKind() == Kind.CONST) {
				codeBlock.putOutputFuncCode(argumentList.get(0).getConstValue());
			} else {
				codeBlock.putOutputFuncCode(argumentList.get(0).getVariable());
			}
			return ArithmeticResult.NO_OP_RESULT;
		} else if (funcName.equals("OutputNewLine")) {
			codeBlock.putOutputFuncCode(null);
			return ArithmeticResult.NO_OP_RESULT;
		}

		Function func = Function.getFunction(funcName);
		// if (!func.isPending()) {
		// func.fixupLoadParams(argumentList);
		// }
		if (argumentList.size() != func.getParams().size()) {
			throw new IllegalArgumentException(
					"The function argument size is not valid, expected: " + func.getParams().size()
							+ " now is:" + argumentList.size());
		}
		codeBlock.pushParams(argumentList);

		codeBlock.call(func);
		func.returnBack(codeBlock);

		return new ArithmeticResult(new SSAVar(codeBlock.getLastInstruction().getId()));
		// return func.getArithmeticResult() == null ?
		// ArithmeticResult.FUNC_RETURN_RESULT : func
		// .getArithmeticResult();
	}