diff options
| Commit | d0c8546702bcb021f09b3279db048894a88c179a (patch) | |
|---|---|---|
| Author | 2023-02-08 00:14:42 +0200 | |
| Committer | 2023-02-08 00:14:42 +0200 | |
| Files | dbc5536d89cd9805d29554da117599ed80292368 | |
| uni-projects-d0c8546702bcb021f09b3279db048894a88c179a.tar uni-projects-d0c8546702bcb021f09b3279db048894a88c179a.tar.gz uni-projects-d0c8546702bcb021f09b3279db048894a88c179a.zip | ||
| Parent | b21256461dae9546f6690ff3b1ea53d4c508f252 (diff) | |
[IPL/T] Added some bool functions
3 files changed, 43 insertions, 2 deletions
diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp index 1db9365..9035c74 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp @@ -147,6 +147,35 @@ LLVMRet LLVMVisitor::f_div(funcargs args) { return aritop("div", args); } +LLVMRet LLVMVisitor::boolop(const std::string name, funcargs args) { + LLVMRet leftArg = args[0]->Visit(*this), + rightArg = args[1]->Visit(*this); + Register r = lreg++; + + outBuf.push_back(*r + " = " + ((leftArg.type == "double") ? "f" : "i") + "cmp " + ((leftArg.type == "double") ? "o" : "s") + name + " " + leftArg.toStr() + ", " + rightArg.addr); + return { "i1", *r }; +} + +LLVMRet LLVMVisitor::f_eq(funcargs args) { + return boolop("eq", args); +} + +LLVMRet LLVMVisitor::f_gt(funcargs args) { + return boolop("gt", args); +} + +LLVMRet LLVMVisitor::f_ge(funcargs args) { + return boolop("ge", args); +} + +LLVMRet LLVMVisitor::f_lt(funcargs args) { + return boolop("lt", args); +} + +LLVMRet LLVMVisitor::f_le(funcargs args) { + return boolop("le", args); +} + LLVMRet LLVMVisitor::Visit(const Funcall& vfuncall) { // Direct functions generate their own LLVM IR auto directFuncIt = funcs_direct.find(vfuncall.get_funname()); @@ -187,6 +216,11 @@ LLVMVisitor::LLVMVisitor(const char* fileName) : outFile(std::ofstream(fileName) funcs_direct.insert({"defun", &LLVMVisitor::f_defun}); funcs_direct.insert({"defvar", &LLVMVisitor::f_defvar}); funcs_direct.insert({"if", &LLVMVisitor::f_if}); + funcs_direct.insert({"=", &LLVMVisitor::f_eq}); + funcs_direct.insert({">", &LLVMVisitor::f_gt}); + funcs_direct.insert({">=", &LLVMVisitor::f_gt}); + funcs_direct.insert({"<", &LLVMVisitor::f_lt}); + funcs_direct.insert({"<=", &LLVMVisitor::f_le}); } void LLVMVisitor::insertMain() { diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h index a71219b..d473451 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.h @@ -35,6 +35,13 @@ class LLVMVisitor { LLVMRet f_mul(funcargs args); LLVMRet f_div(funcargs args); + LLVMRet boolop(const std::string name, funcargs args); + LLVMRet f_eq(funcargs args); + LLVMRet f_gt(funcargs args); + LLVMRet f_ge(funcargs args); + LLVMRet f_lt(funcargs args); + LLVMRet f_le(funcargs args); + std::stack<std::map<std::string, LLVMRet>*> locals; std::map<std::string, LLVMRet> funcs_user; std::map<std::string, LLVMRet> vars_user; diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp index 4d58dc7..4c66e70 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp @@ -8,7 +8,7 @@ int main() { std::deque<Value*> nodes = { new Funcall("defvar", { new Name("myvar"), - new Funcall("+", { new Funcall("-", { new Integer(8), new Integer(4) }), new Integer(19) }) + new Integer(19) }), new Funcall("+", { new Float(1), @@ -24,7 +24,7 @@ int main() { new Name("b") }), new Funcall("if", { - new Integer(5), + new Funcall(">=", { new Integer(5), new Integer(6) }), new Funcall("+", { new Integer(1), new Integer(2) }), new Funcall("-", { new Integer(3), new Integer(4) }) })}) |
