THE ADD FUNCTION COMPILES!!!!!
This commit is contained in:
@@ -132,39 +132,82 @@ class X86_64Generator(Generator):
|
|||||||
scope = scope or self.current_var_scope
|
scope = scope or self.current_var_scope
|
||||||
var_pos = self.get_var_pos(var_name, scope)
|
var_pos = self.get_var_pos(var_name, scope)
|
||||||
|
|
||||||
if type(new_value) == IntNode: # we're changing a variable to a number
|
if isinstance(var_pos, str):
|
||||||
lines.append(f"mov QWORD [rsp + {var_pos}], {new_value.value}\n\t")
|
if type(new_value) == IntNode: # we're changing a variable to a number
|
||||||
scope.table[var_name]["type"] = IntNode
|
#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
|
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")
|
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 QWORD [rsp + {var_pos}], rax\n\t")
|
||||||
scope.table[var_name]["type"] = var_type
|
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
|
elif type(new_value) == StringNode: # we're changing a variable to a string
|
||||||
lines.append(f"mov QWORD [rsp + {var_pos}], 0\n\t")
|
lines.append(f"mov QWORD [rsp + {var_pos}], 0\n\t")
|
||||||
|
|
||||||
|
|
||||||
string_pointer = self.add_constant(new_value.value)
|
string_pointer = self.add_constant(new_value.value)
|
||||||
string_len = self.add_constant(f"equ $ - {string_pointer[1:-1]}", no_string=True)
|
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"lea QWORD [rsp + {var_pos}], {string_pointer}\n\t")
|
||||||
##lines.append(f"mov QWORD [rsp + {var_pos + 8}], {string_len[1:-1]}\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
|
scope.table[var_name]["stack_loc"] = self.stack_size
|
||||||
lines.append(f"lea rax, {string_pointer}\n\t")
|
lines.append(f"lea rax, {string_pointer}\n\t")
|
||||||
self.push("rax", lines)
|
self.push("rax", lines)
|
||||||
lines.append(f"mov rax, {string_len[1:-1]}\n\t")
|
lines.append(f"mov rax, {string_len[1:-1]}\n\t")
|
||||||
self.push("rax", lines)
|
self.push("rax", lines)
|
||||||
|
|
||||||
scope.table[var_name]["type"] = StringNode
|
scope.table[var_name]["type"] = StringNode
|
||||||
|
|
||||||
elif type(new_value) == 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 QWORD [rsp + {var_pos}], {'1' if new_value.value else '0'}\n\t")
|
||||||
scope.table[var_name]["type"] = BoolNode
|
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
|
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 QWORD [rsp + {var_pos}], {new_value}\n\t")
|
||||||
scope.table[var_name]["type"] = IntNode
|
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):
|
def generate_LabelDecNode(self, node: LabelDecNode, lines):
|
||||||
self.labels.append(node.name)
|
self.labels.append(node.name)
|
||||||
|
@@ -132,5 +132,13 @@ class X86_64Optimizer(Optimizer):
|
|||||||
Instruction("mov", ["rax", "y"]),
|
Instruction("mov", ["rax", "y"]),
|
||||||
Instruction("cmp", ["rax", "x"])
|
Instruction("cmp", ["rax", "x"])
|
||||||
]
|
]
|
||||||
|
),
|
||||||
|
|
||||||
|
PeepholeRule(
|
||||||
|
match=[
|
||||||
|
Instruction("mov", ["x", "y"]),
|
||||||
|
Instruction("mov", ["y", "x"])
|
||||||
|
],
|
||||||
|
replace=[]
|
||||||
)
|
)
|
||||||
]
|
]
|
20
out.asm
20
out.asm
@@ -1,29 +1,23 @@
|
|||||||
; ~~~ Auto generated by the GroundPY compiler for Linux x86_64 targets. ~~~
|
; ~~~ Auto generated by the GroundPY compiler for Linux x86_64 targets. ~~~
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
.LC0: db "this was called by a function!!!!", 10, 0
|
|
||||||
.LC1: equ $ - .LC0
|
|
||||||
section .text
|
section .text
|
||||||
global _start
|
global _start
|
||||||
_start:
|
_start:
|
||||||
sub rsp, 8
|
sub rsp, 8
|
||||||
mov rdi, 115
|
mov rdi, 2
|
||||||
call test
|
mov rsi, 3
|
||||||
add rsp, 8
|
call add
|
||||||
|
add rsp, 16
|
||||||
push rax
|
push rax
|
||||||
mov rax, 60
|
mov rax, 60
|
||||||
mov rdi, [rsp + 0]
|
mov rdi, [rsp + 0]
|
||||||
syscall
|
syscall
|
||||||
test:
|
add:
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
mov rsi, .LC0
|
|
||||||
mov rdx, .LC1
|
|
||||||
push rdi
|
|
||||||
mov rax, 1
|
|
||||||
mov rdi, 1
|
|
||||||
syscall
|
|
||||||
pop rdi
|
|
||||||
mov rax, rdi
|
mov rax, rdi
|
||||||
|
mov rbx, rsi
|
||||||
|
add rax, rbx
|
||||||
pop rbp
|
pop rbp
|
||||||
ret
|
ret
|
||||||
|
11
test2.grnd
11
test2.grnd
@@ -1,8 +1,9 @@
|
|||||||
fun -int !test -int &arg1
|
fun -int !add -int &x -int &y
|
||||||
stdout "this was called by a function!!!!\n"
|
add $x $y &x
|
||||||
return $arg1
|
return $x
|
||||||
endfun
|
endfun
|
||||||
|
|
||||||
pusharg 115
|
pusharg 2
|
||||||
call !test &var
|
pusharg 3
|
||||||
|
call !add &var
|
||||||
end $var
|
end $var
|
Reference in New Issue
Block a user