summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-08 09:50:30 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-08 09:51:47 +0100
commitffe20a577c74652f4ca37545ba2f1cbaa56025d0 (patch)
treec93149dc11c483ff3c7ca684c88a98c0a740cb41
parent7b8670a56dff05d8e5f35f99d7d2049e41c41189 (diff)
ccplus: Add support for return codegen.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
-rw-r--r--CompilerDriver/ccplus.cc58
1 files changed, 54 insertions, 4 deletions
diff --git a/CompilerDriver/ccplus.cc b/CompilerDriver/ccplus.cc
index 8d0a6c8..d022671 100644
--- a/CompilerDriver/ccplus.cc
+++ b/CompilerDriver/ccplus.cc
@@ -132,7 +132,7 @@ static int kMachine = 0;
/////////////////////////////////////////
static size_t kRegisterCnt = kAsmRegisterLimit;
-static size_t kStartUsable = 1;
+static size_t kStartUsable = 2;
static size_t kUsableLimit = 14;
static size_t kRegisterCounter = kStartUsable;
static std::string kRegisterPrefix = kAsmRegisterPrefix;
@@ -315,6 +315,7 @@ public:
};
std::vector<scope_type> scope;
+ scope.emplace_back();
bool found_type = false;
bool is_pointer = false;
@@ -331,6 +332,7 @@ public:
if (leaf.fUserData == "{")
{
+ kRegisterCounter = kStartUsable;
scope.pop_back();
}
@@ -395,6 +397,14 @@ public:
{
is_pointer = false;
}
+
+ auto& front = scope.front();
+
+ std::string reg = "r";
+ reg += std::to_string(front.reg_cnt);
+ ++front.reg_cnt;
+
+ front.vals.push_back(reg);
}
if (leaf.fUserData == "*")
@@ -413,6 +423,8 @@ public:
reg += std::to_string(front.reg_cnt);
++front.reg_cnt;
+ front.vals.push_back(reg);
+
leaf.fUserValue = !is_pointer ? "ldw %s, %s1\n" : "lda %s, %s1\n";
for (auto& ln : lines)
@@ -435,7 +447,7 @@ public:
}
else
{
- leaf.fUserValue = !is_pointer ? "ldw %s, %s1\n" : "lda %s, %s1\n";
+ leaf.fUserValue = !is_pointer ? "ldw %s, %s1\n" : "lda 0(%s), %s1\n";
for (auto& ln : lines)
{
@@ -462,9 +474,13 @@ public:
auto& front = scope.front();
std::string reg = "r";
- reg += std::to_string(front.reg_cnt - 1);
+ reg += std::to_string(front.reg_cnt);
+ ++front.reg_cnt;
+
leaf.fUserValue.replace(leaf.fUserValue.find("%s"), strlen("%s"), reg);
+ front.vals.push_back(reg);
+
if (is_pointer)
{
is_pointer = false;
@@ -486,6 +502,41 @@ public:
auto val = ln.substr(ln.find(leaf.fUserData) + leaf.fUserData.size());
val.erase(val.find(";"), 1);
+ std::string val_reg;
+ std::size_t& reg_cnt = kRegisterCounter;
+
+ for (int i = ln.find(leaf.fUserData) + leaf.fUserData.size(); i < ln.size(); ++i)
+ {
+ try
+ {
+ if (ln[i] == ',' ||
+ ln[i] == '+' ||
+ ln[i] == '/' ||
+ ln[i] == '-' ||
+ ln[i] == '*' ||
+ ln[i] == '|' ||
+ ln[i] == '&' ||
+ ln[i] == '&' ||
+ ln[i] == '|' ||
+ ln[i] == ';')
+ {
+ std::cout << val_reg;
+ val.replace(val.find(val_reg), val_reg.size(), "r" + std::to_string(reg_cnt));
+ val_reg.clear();
+ ++reg_cnt;
+
+ continue;
+ }
+ }
+ catch (...)
+ {
+
+ }
+
+ if (isalnum(ln[i]))
+ val_reg += ln[i];
+ }
+
leaf.fUserValue.replace(leaf.fUserValue.find("%s"), strlen("%s"), val);
}
}
@@ -498,7 +549,6 @@ public:
continue;
}
- std::cout << leaf.fUserData;
lines.emplace_back(leaf.fUserData);
}