diff --git a/include/codegen/Codegen.hh b/include/codegen/Codegen.hh deleted file mode 100644 index 5d125d0..0000000 --- a/include/codegen/Codegen.hh +++ /dev/null @@ -1,6 +0,0 @@ -/*************/ -/*GEMWIRE */ -/* ERYTHRO*/ -/*************/ - -#pragma once diff --git a/include/codegen/IGenerator.hh b/include/codegen/IGenerator.hh new file mode 100644 index 0000000..411a59e --- /dev/null +++ b/include/codegen/IGenerator.hh @@ -0,0 +1,102 @@ +/*************/ +/*GEMWIRE */ +/* ERYTHRO*/ +/*************/ + +#pragma once + +#include +#include + +//Note(anita): Should I make a virtal register to deal with the translation +// should I also do the samething with the instructions like I did +// with pasm? +class IGenerator { + private: + std::string buffer; + + public: + virtual auto gen_deallocate_all_register() -> void = 0; + virtual auto gen_retrieve_register() -> int = 0; + virtual auto gen_primitive_size(int type) -> int = 0; + + virtual auto gen_align_memory(int type, int offset, int Direction) -> int = 0; + + virtual auto gen_load(int value) -> int = 0; + + virtual auto gen_add(int left, int right) -> int = 0; + virtual auto gen_mul(int left, int right) -> int = 0; + virtual auto gen_sub(int left, int right) -> int = 0; + virtual auto gen_div(int left, int right) -> int = 0; + + virtual auto gen_load_global_variable(SymbolTableEntry* table, int operation) -> int = 0; + virtual auto gen_load_local_variable(SymbolTableEntry* table, int operation) -> int = 0; + + virtual auto gen_str_global_var(SymbolTableEntry* table, int Register) -> int = 0; + virtual auto gen_str_local_var(SymbolTableEntry* table, int Register) -> int = 0; + + virtual auto gen_calculate_offset(int type) -> int = 0; + + virtual auto gen_new_stackframe() -> int = 0; + + virtual auto gen_dereference(int reg, int type) -> int = 0; + virtual auto gen_str_dereference(int reg_1, int reg_2) -> int = 0; + + virtual auto gen_address(SymbolTableEntry* entry) -> int = 0; + virtual auto gen_global_symbol(SymbolTableEntry* entry) -> int = 0; + + virtual auto gen_new_string(char* value) -> int = 0; + virtual auto gen_load_string(int id) -> int = 0; + + virtual auto gen_equal(int left, int right) -> int = 0; + virtual auto gen_if_not_equal(int left, int right) -> int = 0; + virtual auto gen_less_than(int left, int right) -> int = 0; + virtual auto gen_less_equal_than(int left, int right) -> int = 0; + virtual auto gen_greater_than(int left, int right) -> int = 0; + virtual auto gen_greater_equal_than(int left, int right) -> int = 0; + + virtual auto gen_bitwise_and(int left, int right) -> int = 0; + virtual auto gen_bitwise_or(int left, int right) -> int = 0; + virtual auto gen_bitwise_xor(int left, int right) -> int = 0; + + virtual auto gen_negate(int reg) -> int = 0; + virtual auto gen_invert(int reg) -> int = 0; + + virtual auto gen_boolean_not(int reg) -> int = 0; + + virtual auto gen_shift_left(int left, int right) -> int = 0; + virtual auto gen_shift_right(int left, int right) -> int = 0; + + virtual auto gen_boolean_convert(int reg, int operation, int label) -> int = 0; + + virtual auto gen_compare(int operation, int reg_left, int reg_right) -> int = 0; + virtual auto gen_compare_jmp(int operation, int reg_left, int reg_right, int label) -> int = 0; + + virtual auto gen_if(ASTNode* node, int loop_start_lable, int loop_end_label) -> int = 0; + + virtual auto gen_new_label() -> int = 0; + + virtual auto gen_jmp(int label) -> int = 0; + virtual auto gen_label(int label) -> int = 0; + + //Shift left + virtual auto gen_shift_L(int reg, int val) -> int = 0; + + virtual auto gen_return(SymbolTableEntry* entry, int reg) -> int = 0; + + virtual auto gen_call_wrapper(ASTNode* node) -> int = 0; + + virtual auto gen_copy_args(int reg, int pos) -> int = 0; + + virtual auto gen_call(SymbolTableEntry* entry, int args) -> int = 0; + + virtual auto gen_while(ASTNode* node) -> int = 0; + + //Fixme(anita): This is a hack do a proper call to the systems libcs + virtual auto gen_hack_printf(int reg) -> int = 0; + + virtual auto gen_preamble() -> int = 0; + virtual auto gen_function_preamble() -> int = 0; + virtual auto gen_function_epilogue() -> int = 0; +}; +