summaryrefslogtreecommitdiffstats
path: root/libacc
diff options
context:
space:
mode:
authorJack Palevich <jackpal@google.com>2009-08-04 15:39:49 -0700
committerJack Palevich <jackpal@google.com>2009-08-04 15:39:49 -0700
commit80e4972625b60d799db67021af18194567aed3e7 (patch)
tree43ae52a46d096c2050643d9b5ef52ad66d658acc /libacc
parentb61545096d2f55f76b22b7ef734e7cdb0c5eaf97 (diff)
downloadsystem_core-80e4972625b60d799db67021af18194567aed3e7.zip
system_core-80e4972625b60d799db67021af18194567aed3e7.tar.gz
system_core-80e4972625b60d799db67021af18194567aed3e7.tar.bz2
Support 2D arrays.
Diffstat (limited to 'libacc')
-rw-r--r--libacc/acc.cpp19
-rw-r--r--libacc/tests/data/array.c30
-rw-r--r--libacc/tests/test.py12
3 files changed, 57 insertions, 4 deletions
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index 0a16489..b06ad53 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -1168,7 +1168,8 @@ class Compiler : public ErrorSink {
virtual void loadR0FromR0() {
Type* pPointerType = getR0Type();
assert(pPointerType->tag == TY_POINTER);
- TypeTag tag = pPointerType->pHead->tag;
+ Type* pNewType = pPointerType->pHead;
+ TypeTag tag = pNewType->tag;
switch (tag) {
case TY_POINTER:
case TY_INT:
@@ -1184,11 +1185,14 @@ class Compiler : public ErrorSink {
case TY_DOUBLE:
o4(0xE1C000D0); // ldrd r0, [r0]
break;
+ case TY_ARRAY:
+ pNewType = pNewType->pTail;
+ break;
default:
error("loadR0FromR0: unimplemented type %d", tag);
break;
}
- setR0Type(pPointerType->pHead);
+ setR0Type(pNewType);
}
virtual void leaR0(int ea, Type* pPointerType, ExpressionType et) {
@@ -2213,7 +2217,8 @@ class Compiler : public ErrorSink {
virtual void loadR0FromR0() {
Type* pPointerType = getR0Type();
assert(pPointerType->tag == TY_POINTER);
- TypeTag tag = pPointerType->pHead->tag;
+ Type* pNewType = pPointerType->pHead;
+ TypeTag tag = pNewType->tag;
switch (tag) {
case TY_POINTER:
case TY_INT:
@@ -2233,11 +2238,14 @@ class Compiler : public ErrorSink {
case TY_DOUBLE:
o2(0x00dd); // fldl (%eax)
break;
+ case TY_ARRAY:
+ pNewType = pNewType->pTail;
+ break;
default:
error("loadR0FromR0: unsupported type %d", tag);
break;
}
- setR0Type(pPointerType->pHead);
+ setR0Type(pNewType);
}
virtual void leaR0(int ea, Type* pPointerType, ExpressionType et) {
@@ -4126,6 +4134,9 @@ class Compiler : public ErrorSink {
pTargetType = pGen->getR0Type();
if (pTargetType->tag == TY_FLOAT) {
pTargetType = mkpDouble;
+ } else if (pTargetType->tag == TY_ARRAY) {
+ // Pass arrays by pointer.
+ pTargetType = pTargetType->pTail;
}
}
if (pTargetType->tag == TY_VOID) {
diff --git a/libacc/tests/data/array.c b/libacc/tests/data/array.c
index 3af5e31..ca4a728 100644
--- a/libacc/tests/data/array.c
+++ b/libacc/tests/data/array.c
@@ -66,6 +66,34 @@ void testArgs() {
printf("\n");
}
+void testDecay() {
+ char c[4];
+ c[0] = 'H';
+ c[1] = 'i';
+ c[2] = '!';
+ c[3] = 0;
+ printf("testDecay: %s\n", c);
+}
+
+void test2D() {
+ char c[10][20];
+ int x;
+ int y;
+ printf("test2D:\n");
+ for(y = 0; y < 10; y++) {
+ for(x = 0; x < 20; x++) {
+ c[y][x] = 'a' + (15 & (y * 19 + x));
+ }
+ }
+ for(y = 0; y < 10; y++) {
+ for(x = 0; x < 20; x++) {
+ printf("%c", c[y][x]);
+ }
+ printf("\n");
+ }
+
+}
+
int main()
{
testLocalInt();
@@ -73,5 +101,7 @@ int main()
testGlobalChar();
testGlobalDouble();
testArgs();
+ testDecay();
+ test2D();
return 0;
}
diff --git a/libacc/tests/test.py b/libacc/tests/test.py
index 4ad2e13..9691c27 100644
--- a/libacc/tests/test.py
+++ b/libacc/tests/test.py
@@ -394,6 +394,18 @@ localDouble: 3 3
globalChar: 3
globalDouble: 3
testArgs: 0 2 4
+testDecay: Hi!
+test2D:
+abcdefghijdefghijklm
+defghijklmghijklmnop
+ghijklmnopjklmnopabc
+jklmnopabcmnopabcdef
+mnopabcdefpabcdefghi
+pabcdefghicdefghijkl
+cdefghijklfghijklmno
+fghijklmnoijklmnopab
+ijklmnopablmnopabcde
+lmnopabcdefghijklmno
result: 0
""","""""")