|
@@ -22,6 +22,8 @@ ginit(void)
|
|
|
lastp = P;
|
|
|
tfield = types[TLONG];
|
|
|
|
|
|
+ typeswitch = typechlv;
|
|
|
+
|
|
|
zprog.link = P;
|
|
|
zprog.as = AGOK;
|
|
|
zprog.from.type = D_NONE;
|
|
@@ -314,9 +316,29 @@ abort();
|
|
|
|
|
|
case TFLOAT:
|
|
|
case TDOUBLE:
|
|
|
- case TVLONG:
|
|
|
i = D_F0;
|
|
|
goto out;
|
|
|
+
|
|
|
+ case TVLONG:
|
|
|
+ case TUVLONG:
|
|
|
+ n->op = OREGPAIR;
|
|
|
+ n->complex = 0; /* already in registers */
|
|
|
+ n->addable = 11;
|
|
|
+ n->type = tn->type;
|
|
|
+ n->lineno = nearln;
|
|
|
+ n->left = alloc(sizeof(Node));
|
|
|
+ n->right = alloc(sizeof(Node));
|
|
|
+ if(o != Z && o->op == OREGPAIR) {
|
|
|
+ regalloc(n->left, ®node, o->left);
|
|
|
+ regalloc(n->right, ®node, o->right);
|
|
|
+ } else {
|
|
|
+ regalloc(n->left, ®node, Z);
|
|
|
+ regalloc(n->right, ®node, Z);
|
|
|
+ }
|
|
|
+ n->right->type = types[TULONG];
|
|
|
+ if(tn->type->etype == TUVLONG)
|
|
|
+ n->left->type = types[TULONG];
|
|
|
+ return;
|
|
|
}
|
|
|
diag(tn, "unknown type in regalloc: %T", tn->type);
|
|
|
err:
|
|
@@ -343,6 +365,12 @@ regfree(Node *n)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
+ if(n->op == OREGPAIR) {
|
|
|
+ regfree(n->left);
|
|
|
+ regfree(n->right);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
i = 0;
|
|
|
if(n->op != OREGISTER && n->op != OINDREG)
|
|
|
goto err;
|
|
@@ -618,9 +646,6 @@ gmove(Node *f, Node *t)
|
|
|
case TDOUBLE:
|
|
|
gins(AFMOVD, f, t);
|
|
|
return;
|
|
|
- case TVLONG:
|
|
|
- gins(AFMOVV, f, t);
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -659,9 +684,6 @@ gmove(Node *f, Node *t)
|
|
|
case TDOUBLE:
|
|
|
gins(AFMOVDP, f, t);
|
|
|
return;
|
|
|
- case TVLONG:
|
|
|
- gins(AFMOVVP, f, t);
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -989,7 +1011,7 @@ fgopcode(int o, Node *f, Node *t, int pop, int rev)
|
|
|
if(et == TFLOAT)
|
|
|
a = AFADDF;
|
|
|
else
|
|
|
- if(et == TDOUBLE || et == TVLONG) {
|
|
|
+ if(et == TDOUBLE) {
|
|
|
a = AFADDD;
|
|
|
if(pop)
|
|
|
a = AFADDDP;
|
|
@@ -1003,7 +1025,7 @@ fgopcode(int o, Node *f, Node *t, int pop, int rev)
|
|
|
if(rev)
|
|
|
a = AFSUBRF;
|
|
|
} else
|
|
|
- if(et == TDOUBLE || et == TVLONG) {
|
|
|
+ if(et == TDOUBLE) {
|
|
|
a = AFSUBD;
|
|
|
if(pop)
|
|
|
a = AFSUBDP;
|
|
@@ -1020,7 +1042,7 @@ fgopcode(int o, Node *f, Node *t, int pop, int rev)
|
|
|
if(et == TFLOAT)
|
|
|
a = AFMULF;
|
|
|
else
|
|
|
- if(et == TDOUBLE || et == TVLONG) {
|
|
|
+ if(et == TDOUBLE) {
|
|
|
a = AFMULD;
|
|
|
if(pop)
|
|
|
a = AFMULDP;
|
|
@@ -1036,7 +1058,7 @@ fgopcode(int o, Node *f, Node *t, int pop, int rev)
|
|
|
if(rev)
|
|
|
a = AFDIVRF;
|
|
|
} else
|
|
|
- if(et == TDOUBLE || et == TVLONG) {
|
|
|
+ if(et == TDOUBLE) {
|
|
|
a = AFDIVD;
|
|
|
if(pop)
|
|
|
a = AFDIVDP;
|
|
@@ -1063,7 +1085,7 @@ fgopcode(int o, Node *f, Node *t, int pop, int rev)
|
|
|
a = AGOK;
|
|
|
}
|
|
|
} else
|
|
|
- if(et == TDOUBLE || et == TVLONG) {
|
|
|
+ if(et == TDOUBLE) {
|
|
|
a = AFCOMF;
|
|
|
if(pop) {
|
|
|
a = AFCOMDP;
|