def test_should_create_valid_constant_0(self): valid = """ SUB 0 """ assembly = create_constant_number(0) formatted_valid = remove_whitespace(valid) formatted_assembly = remove_whitespace(assembly) assert formatted_assembly == formatted_valid
def execute_and_load_binary_expression(codegen, expr): code = "" left = expr.left right = expr.right operator = expr.type if left.is_leaf() and right.is_leaf(): code += compute_and_store_constant_in_memory(left.value, right.value, operator) return code else: if left.is_leaf(): lval = left.value code += create_constant_number(lval, storage_addr=4) code += store_variable_in_reg(codegen, right.value, storage_addr=5) if right.is_leaf(): rval = right.value code += create_constant_number(rval, storage_addr=5) code += store_variable_in_reg(codegen, left.value, storage_addr=4) if not left.is_leaf() and not right.is_leaf(): code += store_variable_in_reg(codegen, left.value, 4) code += store_variable_in_reg(codegen, right.value, 5) code += execute_operation(codegen, operator) return code
def compute_and_store_constant_in_memory(l, r, operator): result = 0 if operator == 'PLUS': result = l + r if operator == 'MINUS': result = l - r if operator == 'TIMES': result = l * r if operator == 'DIV': if r == 0: result = 0 else: result = math.floor(l / r) if operator == 'MOD': if r == 0: result = 0 else: result = l - (r * math.floor(l / r)) return create_constant_number(result)
def test_should_create_valid_constant_negative_156(self): valid = """ SUB 0 DEC ADD 0 ADD 0 ADD 0 DEC ADD 0 DEC ADD 0 DEC ADD 0 ADD 0 """ assembly = create_constant_number(-156) formatted_valid = remove_whitespace(valid) formatted_assembly = remove_whitespace(assembly) assert formatted_assembly == formatted_valid
def store_array_start_index_addr_in_two(array_start_addr): return create_constant_number(array_start_addr, storage_addr=2)
def store_array_start_index_in_one(start_index): return create_constant_number(start_index, storage_addr=1)
def handle_constant_case(node): code = "" code += create_constant_number(node.value.value) code += "PUT\n" return code
def test_should_create_valid_constant_2_to_minus_62(self): valid = "SUB 0" + "DEC" + ("ADD 0 " * 62) assembly = create_constant_number(-2 ** 62) formatted_valid = remove_whitespace(valid) formatted_assembly = remove_whitespace(assembly) assert formatted_assembly == formatted_valid