diff options
[IPL/T] Added some bool functions
1 files changed, 34 insertions, 0 deletions
| -rw-r--r-- | Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp | 34 |
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() { |
