added not instruction and escape sequences

This commit is contained in:
SpookyDervish
2025-09-13 19:29:06 +10:00
parent cc82d27b03
commit 9e2846962c
6 changed files with 88 additions and 131 deletions

View File

@@ -30,8 +30,6 @@ class X86_64Generator(Generator):
var = scope.lookup(var_name)
var_pos = self.get_var_pos(var_name, scope)
print(self.stack_size, var_name, var_pos)
if isinstance(var_pos, str): # in a reg, not on the stack
waste = {
@@ -50,7 +48,6 @@ class X86_64Generator(Generator):
lines.append(f"mov {reg}, {var_pos}\n\t")
else:
try:
#print(var["type"])
if var["type"] == FloatNode:
conversion = {
"rax": "xmm0",
@@ -132,7 +129,6 @@ class X86_64Generator(Generator):
self.push("rax", lines)
lines.append(f"mov rax, {string_len[1:-1]}\n\t")
self.push("rax", lines)
print(self.stack_size)
elif type(starting_value) == BoolNode:
self.push("1" if starting_value.value else "0", lines)
@@ -268,7 +264,6 @@ class X86_64Generator(Generator):
#self.generate_InstructionNode(inst, self.function_lines)
def generate_InstructionNode(self, node: InstructionNode, lines = None):
print(node.instruction, self.stack_size)
lines = lines or self.lines
### MISC ###
@@ -538,6 +533,27 @@ class X86_64Generator(Generator):
self.create_variable(lines, var_name, "rax", BoolNode)
else:
self.change_variable(lines, var_name, "rax")
elif node.instruction == "not":
self.clamp_instruction_args(node, 2, 2)
if type(node.arguments[0]) not in [VarRefNode,BoolNode]:
traceback(self.code, "TypeError", f"Argument 1 of \"not\" must be a boolean or variable reference, not \"{node.arguments[0]}\"")
elif not isinstance(node.arguments[1], VarPointerNode):
traceback(self.code, "TypeError", f"Argument 2 of \"not\" must be a variable pointer, not \"{node.arguments[1]}\"")
result = ""
if isinstance(node.arguments[0], BoolNode):
result = BoolNode(not node.arguments[0].value)
elif isinstance(node.arguments[0], VarRefNode):
var_type = self.get_variable(lines, node.arguments[0].var_name, "rax")
if var_type != BoolNode:
traceback(self.code, "TypeError", f"Argument 1 of \"not\" must be a boolean or variable reference, not \"{var_type(0).__repr__()}\"")
result = "rax"
lines.append("xor rax, 1\n\t")
if self.current_var_scope.table.get(node.arguments[1].var_name):
self.change_variable(lines, node.arguments[1].var_name, result)
else:
self.create_variable(lines, node.arguments[1].var_name, result, BoolNode)
elif node.instruction == "endfun":
return