Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Implementation of Programming Languages / Transpiler / src / LLVMVisitor / LLVMVisitor.cpp
diff options
context:
space:
mode:
Commitd0c8546702bcb021f09b3279db048894a88c179a (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-02-08 00:14:42 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-02-08 00:14:42 +0200
Filesdbc5536d89cd9805d29554da117599ed80292368 /Year 2/Implementation of Programming Languages/Transpiler/src/LLVMVisitor/LLVMVisitor.cpp
uni-projects-d0c8546702bcb021f09b3279db048894a88c179a.tar
uni-projects-d0c8546702bcb021f09b3279db048894a88c179a.tar.gz
uni-projects-d0c8546702bcb021f09b3279db048894a88c179a.zip
Parentb21256461dae9546f6690ff3b1ea53d4c508f252 (diff)
[IPL/T] Added some bool functions
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() {