From 21e4016317af3eaf03ffc36bfd90a7a2af4a354f Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Tue, 28 Mar 2017 17:00:19 +0100 Subject: Working array arithmatic --- c_compiler/src/expression.cpp | 18 +++++++++++++++--- test_deliverable/testcases/test_MULTARR1.c | 9 +++++++++ test_deliverable/testcases/test_MULTARR1_driver.c | 6 ++++++ test_deliverable/testcases/test_POINTERAD0.c | 7 +++++++ test_deliverable/testcases/test_POINTERAD0_driver.c | 4 ++++ test_deliverable/testcases/test_POINTERADD.c | 4 ++++ test_deliverable/testcases/test_POINTERADD_driver.c | 7 +++++++ 7 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 test_deliverable/testcases/test_MULTARR1.c create mode 100644 test_deliverable/testcases/test_MULTARR1_driver.c create mode 100644 test_deliverable/testcases/test_POINTERAD0.c create mode 100644 test_deliverable/testcases/test_POINTERAD0_driver.c create mode 100644 test_deliverable/testcases/test_POINTERADD.c create mode 100644 test_deliverable/testcases/test_POINTERADD_driver.c diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp index 59440ec..9f99dc2 100644 --- a/c_compiler/src/expression.cpp +++ b/c_compiler/src/expression.cpp @@ -460,8 +460,20 @@ Bindings AdditiveExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); - // TODO currently using signed and sub because I only have signed numbers implemented - // must update this as I add more types + // when its a pointer added to a non pointer, multiply non pointer by pointer type + if(std::dynamic_pointer_cast(lhs_->getType(bindings)) != nullptr && + std::dynamic_pointer_cast(rhs_->getType(bindings)) == nullptr && + std::dynamic_pointer_cast(lhs_) != nullptr) + { + printf("\tsll\t$3,$3,%d\n", lhs_->getType(bindings)->getSize()/2); + } + else if(std::dynamic_pointer_cast(lhs_->getType(bindings)) == nullptr && + std::dynamic_pointer_cast(rhs_->getType(bindings)) != nullptr && + std::dynamic_pointer_cast(rhs_) != nullptr) + { + printf("\tsll\t$2,$2,%d\n", rhs_->getType(bindings)->getSize()/2); + } + if(operator_ == "+") printf("\taddu\t$2,$2,$3\n"); else if(operator_ == "-") @@ -1023,7 +1035,7 @@ void Initializer::printInitializerAsm(Bindings &bindings, int &label_count, int { Bindings temp_bindings = bindings; expression_vector[i]->printAsm(temp_bindings, label_count); - printf("\tsw\t$2,%d($fp)\n", bindings.currentStackPosition()); + type->store(bindings.currentStackPosition()); } type->increaseStackPosition(bindings); } diff --git a/test_deliverable/testcases/test_MULTARR1.c b/test_deliverable/testcases/test_MULTARR1.c new file mode 100644 index 0000000..e3d11ee --- /dev/null +++ b/test_deliverable/testcases/test_MULTARR1.c @@ -0,0 +1,9 @@ +char multiarr1(char a, char b, char c, char d, char e) +{ + char x[2][3] = { + {a, b,}, + {c, d, e}, + }; + + return x[1][2]; +} diff --git a/test_deliverable/testcases/test_MULTARR1_driver.c b/test_deliverable/testcases/test_MULTARR1_driver.c new file mode 100644 index 0000000..8e1a67e --- /dev/null +++ b/test_deliverable/testcases/test_MULTARR1_driver.c @@ -0,0 +1,6 @@ +char multiarr1(char, char, char, char, char); + +int main() +{ + return !( 'e' == multiarr1('a', 'b', 'c', 'd', 'e') ); +} diff --git a/test_deliverable/testcases/test_POINTERAD0.c b/test_deliverable/testcases/test_POINTERAD0.c new file mode 100644 index 0000000..c4050f5 --- /dev/null +++ b/test_deliverable/testcases/test_POINTERAD0.c @@ -0,0 +1,7 @@ +int pointeradd(int *a); + +int main() +{ + int x[5] = {1, 2, 3, 4, 5}; + return !( 4 == pointeradd(&x[1]) ); +} diff --git a/test_deliverable/testcases/test_POINTERAD0_driver.c b/test_deliverable/testcases/test_POINTERAD0_driver.c new file mode 100644 index 0000000..af7bcee --- /dev/null +++ b/test_deliverable/testcases/test_POINTERAD0_driver.c @@ -0,0 +1,4 @@ +int pointeradd(int *a) +{ + return *(a+2); +} diff --git a/test_deliverable/testcases/test_POINTERADD.c b/test_deliverable/testcases/test_POINTERADD.c new file mode 100644 index 0000000..af7bcee --- /dev/null +++ b/test_deliverable/testcases/test_POINTERADD.c @@ -0,0 +1,4 @@ +int pointeradd(int *a) +{ + return *(a+2); +} diff --git a/test_deliverable/testcases/test_POINTERADD_driver.c b/test_deliverable/testcases/test_POINTERADD_driver.c new file mode 100644 index 0000000..44ea6d7 --- /dev/null +++ b/test_deliverable/testcases/test_POINTERADD_driver.c @@ -0,0 +1,7 @@ +int pointeradd(int *a); + +int main() +{ + int x[5] = {1, 2, 3, 4, 5}; + return !( 3 == pointeradd(x) ); +} -- cgit