Esempio n. 1
0
 def apply(self, visitor, node, codegen):
     id = get_id()
     code = ""
     code += evaluate_condition(codegen, node, id)
     code += exec_start_label(id)
     code += visitor.visit_children(node.commands)
     code += exec_end_label(id)
     return code
Esempio n. 2
0
 def apply(self, visitor, node, codegen):
     id = get_id()
     code = ""
     code += start_loop_label(id)
     code += visitor.visit(node.commands)
     code += evaluate_condition(codegen, node, id)
     code += f"JUMP {start_loop_label(id)}"
     code += end_loop_label(id)
     return code
Esempio n. 3
0
    def apply(self, visitor, node, codegen):
        variable_name = node.local_iterator.variable
        codegen.allocate_local_variable_with_term_cond(variable_name)
        id = get_id()
        var_addr, var_term_addr, code = initialize_local_variables(codegen, variable_name, node)

        code += evaluate_condition(codegen, var_addr, var_term_addr, id, for_type=FOR_UP_TO)
        code += visitor.visit_children(node.commands)
        code += increment_iterator(var_addr)
        code += f"JUMP {cond_eval_start_label(id)}"
        code += end_loop_label(id)
        codegen.deallocate_local_variable_with_term_cond(variable_name)
        return code
Esempio n. 4
0
def execute_division(codegen):
    """
    R4 - left value
    R5 - right value
    R6 - r copy = rcp
    R7 - total quotient sum = sum
    R8 - current 2 pow - two_pow
    R9 - number one constant value
    R10 - temp value
    R11 - is negative flag
    """

    id = get_id()
    code = ""

    code += detect_division_by_zero(id)
    code += initialize_constant_one_and_clear_sum(id)
    code += determine_isneg(id)
    code += div_outer_loop(id)
    code += div_zero_label(id)
    return code
Esempio n. 5
0
def execute_multiplication(codegen):
    id = get_id()
    code = ""
    code += detect_multiply_by_zero(id)
    code += initialize_multiplication_registers()
    code += place_smaller_on_left(
        id)  # optimization for big and small number (abs val)

    code += check_l_eq_one(id)
    code += check_l_even(id)
    code += execute_l_odd_logic(id)
    code += mul_l_even_label(id)
    code += execute_l_even_logic(id)

    code += mul_done_label(id)
    code += finalize_computation_result_positive(id)

    code += mul_done_neg_result_label(id)
    code += finalize_computation_result_negative(id)

    code += mul_zero_label(id)

    return code