diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-08 09:50:30 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-08 09:51:47 +0100 |
| commit | ffe20a577c74652f4ca37545ba2f1cbaa56025d0 (patch) | |
| tree | c93149dc11c483ff3c7ca684c88a98c0a740cb41 /CompilerDriver/ccplus.cc | |
| parent | 7b8670a56dff05d8e5f35f99d7d2049e41c41189 (diff) | |
ccplus: Add support for return codegen.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'CompilerDriver/ccplus.cc')
| -rw-r--r-- | CompilerDriver/ccplus.cc | 58 |
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); } |
