THE ADD FUNCTION COMPILES!!!!!
This commit is contained in:
@@ -132,39 +132,82 @@ class X86_64Generator(Generator):
|
||||
scope = scope or self.current_var_scope
|
||||
var_pos = self.get_var_pos(var_name, scope)
|
||||
|
||||
if type(new_value) == IntNode: # we're changing a variable to a number
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], {new_value.value}\n\t")
|
||||
scope.table[var_name]["type"] = IntNode
|
||||
if isinstance(var_pos, str):
|
||||
if type(new_value) == IntNode: # we're changing a variable to a number
|
||||
#lines.append(f"mov QWORD [rsp + {var_pos}], {new_value.value}\n\t")
|
||||
lines.append(f"mov {var_pos}, {new_value.value}\n\t")
|
||||
scope.table[var_name]["type"] = IntNode
|
||||
|
||||
elif type(new_value) == VarRefNode: # we're changing a variable to the value of another variable
|
||||
var_type = self.get_variable(lines, new_value.var_name, "rax")
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], rax\n\t")
|
||||
scope.table[var_name]["type"] = var_type
|
||||
elif type(new_value) == VarRefNode: # we're changing a variable to the value of another variable
|
||||
var_type = self.get_variable(lines, new_value.var_name, "rax")
|
||||
#lines.append(f"mov QWORD [rsp + {var_pos}], rax\n\t")
|
||||
lines.append(f"mov {var_pos}, rax\n\t")
|
||||
scope.table[var_name]["type"] = var_type
|
||||
|
||||
elif type(new_value) == StringNode: # we're changing a variable to a string
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], 0\n\t")
|
||||
|
||||
elif type(new_value) == StringNode: # we're changing a variable to a string
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], 0\n\t")
|
||||
|
||||
|
||||
string_pointer = self.add_constant(new_value.value)
|
||||
string_len = self.add_constant(f"equ $ - {string_pointer[1:-1]}", no_string=True)
|
||||
#lines.append(f"lea QWORD [rsp + {var_pos}], {string_pointer}\n\t")
|
||||
##lines.append(f"mov QWORD [rsp + {var_pos + 8}], {string_len[1:-1]}\n\t")
|
||||
string_pointer = self.add_constant(new_value.value)
|
||||
string_len = self.add_constant(f"equ $ - {string_pointer[1:-1]}", no_string=True)
|
||||
#lines.append(f"lea QWORD [rsp + {var_pos}], {string_pointer}\n\t")
|
||||
##lines.append(f"mov QWORD [rsp + {var_pos + 8}], {string_len[1:-1]}\n\t")
|
||||
|
||||
scope.table[var_name]["stack_loc"] = self.stack_size
|
||||
lines.append(f"lea rax, {string_pointer}\n\t")
|
||||
self.push("rax", lines)
|
||||
lines.append(f"mov rax, {string_len[1:-1]}\n\t")
|
||||
self.push("rax", lines)
|
||||
scope.table[var_name]["stack_loc"] = self.stack_size
|
||||
lines.append(f"lea rax, {string_pointer}\n\t")
|
||||
self.push("rax", lines)
|
||||
lines.append(f"mov rax, {string_len[1:-1]}\n\t")
|
||||
self.push("rax", lines)
|
||||
|
||||
scope.table[var_name]["type"] = StringNode
|
||||
scope.table[var_name]["type"] = StringNode
|
||||
|
||||
elif type(new_value) == BoolNode:
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], {'1' if new_value.value else '0'}\n\t")
|
||||
scope.table[var_name]["type"] = BoolNode
|
||||
elif type(new_value) == BoolNode:
|
||||
#lines.append(f"mov QWORD [rsp + {var_pos}], {'1' if new_value.value else '0'}\n\t")
|
||||
lines.append(f"mov {var_pos}, {int(new_value.value)}\n\t")
|
||||
scope.table[var_name]["type"] = BoolNode
|
||||
|
||||
elif type(new_value) == str: # we're changing a variable to the value of a register
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], {new_value}\n\t")
|
||||
scope.table[var_name]["type"] = IntNode
|
||||
elif type(new_value) == str: # we're changing a variable to the value of a register
|
||||
#lines.append(f"mov QWORD [rsp + {var_pos}], {new_value}\n\t")
|
||||
lines.append(f"mov {var_pos}, {new_value}\n\t")
|
||||
scope.table[var_name]["type"] = IntNode
|
||||
|
||||
|
||||
else:
|
||||
|
||||
|
||||
if type(new_value) == IntNode: # we're changing a variable to a number
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], {new_value.value}\n\t")
|
||||
scope.table[var_name]["type"] = IntNode
|
||||
|
||||
elif type(new_value) == VarRefNode: # we're changing a variable to the value of another variable
|
||||
var_type = self.get_variable(lines, new_value.var_name, "rax")
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], rax\n\t")
|
||||
scope.table[var_name]["type"] = var_type
|
||||
|
||||
elif type(new_value) == StringNode: # we're changing a variable to a string
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], 0\n\t")
|
||||
|
||||
|
||||
string_pointer = self.add_constant(new_value.value)
|
||||
string_len = self.add_constant(f"equ $ - {string_pointer[1:-1]}", no_string=True)
|
||||
#lines.append(f"lea QWORD [rsp + {var_pos}], {string_pointer}\n\t")
|
||||
##lines.append(f"mov QWORD [rsp + {var_pos + 8}], {string_len[1:-1]}\n\t")
|
||||
|
||||
scope.table[var_name]["stack_loc"] = self.stack_size
|
||||
lines.append(f"lea rax, {string_pointer}\n\t")
|
||||
self.push("rax", lines)
|
||||
lines.append(f"mov rax, {string_len[1:-1]}\n\t")
|
||||
self.push("rax", lines)
|
||||
|
||||
scope.table[var_name]["type"] = StringNode
|
||||
|
||||
elif type(new_value) == BoolNode:
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], {'1' if new_value.value else '0'}\n\t")
|
||||
scope.table[var_name]["type"] = BoolNode
|
||||
|
||||
elif type(new_value) == str: # we're changing a variable to the value of a register
|
||||
lines.append(f"mov QWORD [rsp + {var_pos}], {new_value}\n\t")
|
||||
scope.table[var_name]["type"] = IntNode
|
||||
|
||||
def generate_LabelDecNode(self, node: LabelDecNode, lines):
|
||||
self.labels.append(node.name)
|
||||
|
Reference in New Issue
Block a user