summaryrefslogtreecommitdiffstats
path: root/libacc/acc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libacc/acc.cpp')
-rw-r--r--libacc/acc.cpp19
1 files changed, 15 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) {