aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-28 17:00:19 +0100
committerYann Herklotz <ymherklotz@gmail.com>2017-03-28 17:00:19 +0100
commit21e4016317af3eaf03ffc36bfd90a7a2af4a354f (patch)
treeea215f91757d0aaae5626aa078aa66bc62cddf5c
parent915c49f93d9a4120dc89872f609824603b9310bb (diff)
downloadCompiler-21e4016317af3eaf03ffc36bfd90a7a2af4a354f.tar.gz
Compiler-21e4016317af3eaf03ffc36bfd90a7a2af4a354f.zip
Working array arithmatic
-rw-r--r--c_compiler/src/expression.cpp18
-rw-r--r--test_deliverable/testcases/test_MULTARR1.c9
-rw-r--r--test_deliverable/testcases/test_MULTARR1_driver.c6
-rw-r--r--test_deliverable/testcases/test_POINTERAD0.c7
-rw-r--r--test_deliverable/testcases/test_POINTERAD0_driver.c4
-rw-r--r--test_deliverable/testcases/test_POINTERADD.c4
-rw-r--r--test_deliverable/testcases/test_POINTERADD_driver.c7
7 files changed, 52 insertions, 3 deletions
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<Pointer>(lhs_->getType(bindings)) != nullptr &&
+ std::dynamic_pointer_cast<Pointer>(rhs_->getType(bindings)) == nullptr &&
+ std::dynamic_pointer_cast<Identifier>(lhs_) != nullptr)
+ {
+ printf("\tsll\t$3,$3,%d\n", lhs_->getType(bindings)->getSize()/2);
+ }
+ else if(std::dynamic_pointer_cast<Pointer>(lhs_->getType(bindings)) == nullptr &&
+ std::dynamic_pointer_cast<Pointer>(rhs_->getType(bindings)) != nullptr &&
+ std::dynamic_pointer_cast<Identifier>(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) );
+}