Add support for "short" data type.
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index 676947e..313bf1c 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -133,13 +133,22 @@
class Compiler : public ErrorSink {
typedef int tokenid_t;
enum TypeTag {
- TY_INT, TY_CHAR, TY_VOID, TY_FLOAT, TY_DOUBLE,
- TY_POINTER, TY_FUNC, TY_PARAM
+ TY_INT, // 0
+ TY_CHAR, // 1
+ TY_SHORT, // 2
+ TY_VOID, // 3
+ TY_FLOAT, // 4
+ TY_DOUBLE, // 5
+ TY_POINTER, // 6
+ TY_ARRAY, // 7
+ TY_STRUCT, // 8
+ TY_FUNC, // 9
+ TY_PARAM // 10
};
struct Type {
TypeTag tag;
- tokenid_t id; // For function arguments
+ tokenid_t id; // For function arguments (stores length for array)
Type* pHead;
Type* pTail;
};
@@ -594,8 +603,18 @@
TypeTag collapseType(TypeTag tag) {
static const TypeTag collapsedTag[] = {
- TY_INT, TY_INT, TY_VOID, TY_FLOAT, TY_DOUBLE, TY_INT,
- TY_VOID, TY_VOID};
+ TY_INT,
+ TY_INT,
+ TY_INT,
+ TY_VOID,
+ TY_FLOAT,
+ TY_DOUBLE,
+ TY_INT,
+ TY_INT,
+ TY_VOID,
+ TY_VOID,
+ TY_VOID
+ };
return collapsedTag[tag];
}
@@ -1093,6 +1112,9 @@
case TY_FLOAT:
o4(0xE5820000); // str r0, [r2]
break;
+ case TY_SHORT:
+ o4(0xE1C200B0); // strh r0, [r2]
+ break;
case TY_CHAR:
o4(0xE5C20000); // strb r0, [r2]
break;
@@ -1115,6 +1137,9 @@
case TY_FLOAT:
o4(0xE5900000); // ldr r0, [r0]
break;
+ case TY_SHORT:
+ o4(0xE1D000F0); // ldrsh r0, [r0]
+ break;
case TY_CHAR:
o4(0xE5D00000); // ldrb r0, [r0]
break;
@@ -1378,6 +1403,8 @@
switch(pType->tag) {
case TY_CHAR:
return 1;
+ case TY_SHORT:
+ return 1;
case TY_DOUBLE:
return 8;
default:
@@ -1392,6 +1419,8 @@
switch(pType->tag) {
case TY_INT:
return 4;
+ case TY_SHORT:
+ return 2;
case TY_CHAR:
return 1;
default:
@@ -2095,6 +2124,9 @@
case TY_INT:
o(0x0189); /* movl %eax/%al, (%ecx) */
break;
+ case TY_SHORT:
+ o(0x018966); /* movw %ax, (%ecx) */
+ break;
case TY_CHAR:
o(0x0188); /* movl %eax/%al, (%ecx) */
break;
@@ -2119,6 +2151,10 @@
case TY_INT:
o2(0x008b); /* mov (%eax), %eax */
break;
+ case TY_SHORT:
+ o(0xbf0f); /* movswl (%eax), %eax */
+ ob(0);
+ break;
case TY_CHAR:
o(0xbe0f); /* movsbl (%eax), %eax */
ob(0); /* add zero in code */
@@ -2288,6 +2324,8 @@
switch (pType->tag) {
case TY_CHAR:
return 1;
+ case TY_SHORT:
+ return 2;
default:
return 4;
}
@@ -2300,6 +2338,8 @@
switch(pType->tag) {
case TY_INT:
return 4;
+ case TY_SHORT:
+ return 2;
case TY_CHAR:
return 1;
default:
@@ -3158,6 +3198,7 @@
// Prebuilt types, makes things slightly faster.
Type* mkpInt; // int
+ Type* mkpShort; // short
Type* mkpChar; // char
Type* mkpVoid; // void
Type* mkpFloat;
@@ -4013,7 +4054,8 @@
pGen->pushR0();
pGen->loadR0FromR0();
int tag = pGen->getR0Type()->tag;
- if (!(tag == TY_INT || tag == TY_CHAR || tag == TY_POINTER)) {
+ if (!(tag == TY_INT || tag == TY_SHORT || tag == TY_CHAR ||
+ tag == TY_POINTER)) {
error("++/-- illegal for this type. %d", tag);
}
if (isPost) {
@@ -4262,6 +4304,9 @@
case TY_INT:
buffer.appendCStr("int");
break;
+ case TY_SHORT:
+ buffer.appendCStr("short");
+ break;
case TY_CHAR:
buffer.appendCStr("char");
break;
@@ -4283,6 +4328,8 @@
switch (tag) {
case TY_INT:
break;
+ case TY_SHORT:
+ break;
case TY_CHAR:
break;
case TY_VOID:
@@ -4347,6 +4394,8 @@
Type* pType;
if (tok == TOK_INT) {
pType = mkpInt;
+ } else if (tok == TOK_SHORT) {
+ pType = mkpShort;
} else if (tok == TOK_CHAR) {
pType = mkpChar;
} else if (tok == TOK_VOID) {
@@ -4844,6 +4893,7 @@
void createPrimitiveTypes() {
mkpInt = createType(TY_INT, NULL, NULL);
+ mkpShort = createType(TY_SHORT, NULL, NULL);
mkpChar = createType(TY_CHAR, NULL, NULL);
mkpVoid = createType(TY_VOID, NULL, NULL);
mkpFloat = createType(TY_FLOAT, NULL, NULL);