5c: handle 64 bit mixedmode asop
This commit is contained in:
parent
e6d64bab9d
commit
8e41723741
2 changed files with 47 additions and 28 deletions
|
@ -1,5 +1,7 @@
|
||||||
#include "gc.h"
|
#include "gc.h"
|
||||||
|
|
||||||
|
static void genasop(int, Node*, Node*, Node*);
|
||||||
|
|
||||||
void
|
void
|
||||||
cgen(Node *n, Node *nn)
|
cgen(Node *n, Node *nn)
|
||||||
{
|
{
|
||||||
|
@ -54,7 +56,7 @@ cgenrel(Node *n, Node *nn, int inrel)
|
||||||
cgen(r, &nod);
|
cgen(r, &nod);
|
||||||
|
|
||||||
regsalloc(&nod1, r);
|
regsalloc(&nod1, r);
|
||||||
gopcode(OAS, &nod, Z, &nod1);
|
gmove(&nod, &nod1);
|
||||||
|
|
||||||
regfree(&nod);
|
regfree(&nod);
|
||||||
nod = *n;
|
nod = *n;
|
||||||
|
@ -244,7 +246,7 @@ cgenrel(Node *n, Node *nn, int inrel)
|
||||||
reglcgen(&nod2, l, Z);
|
reglcgen(&nod2, l, Z);
|
||||||
else
|
else
|
||||||
nod2 = *l;
|
nod2 = *l;
|
||||||
regalloc(&nod, r, nn);
|
regalloc(&nod, l, nn);
|
||||||
gopcode(OAS, &nod2, Z, &nod);
|
gopcode(OAS, &nod2, Z, &nod);
|
||||||
gopcode(o, r, Z, &nod);
|
gopcode(o, r, Z, &nod);
|
||||||
gopcode(OAS, &nod, Z, &nod2);
|
gopcode(OAS, &nod, Z, &nod2);
|
||||||
|
@ -254,6 +256,8 @@ cgenrel(Node *n, Node *nn, int inrel)
|
||||||
regfree(&nod2);
|
regfree(&nod2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
genasop(o, l, r, nn);
|
||||||
|
break;
|
||||||
|
|
||||||
case OASLMUL:
|
case OASLMUL:
|
||||||
case OASLDIV:
|
case OASLDIV:
|
||||||
|
@ -263,32 +267,7 @@ cgenrel(Node *n, Node *nn, int inrel)
|
||||||
case OASMOD:
|
case OASMOD:
|
||||||
if(l->op == OBIT)
|
if(l->op == OBIT)
|
||||||
goto asbitop;
|
goto asbitop;
|
||||||
if(l->complex >= r->complex) {
|
genasop(o, l, r, nn);
|
||||||
if(l->addable < INDEXED)
|
|
||||||
reglcgen(&nod2, l, Z);
|
|
||||||
else
|
|
||||||
nod2 = *l;
|
|
||||||
regalloc(&nod1, r, Z);
|
|
||||||
cgen(r, &nod1);
|
|
||||||
} else {
|
|
||||||
regalloc(&nod1, r, Z);
|
|
||||||
cgen(r, &nod1);
|
|
||||||
if(l->addable < INDEXED)
|
|
||||||
reglcgen(&nod2, l, Z);
|
|
||||||
else
|
|
||||||
nod2 = *l;
|
|
||||||
}
|
|
||||||
|
|
||||||
regalloc(&nod, n, nn);
|
|
||||||
gmove(&nod2, &nod);
|
|
||||||
gopcode(o, &nod1, Z, &nod);
|
|
||||||
gmove(&nod, &nod2);
|
|
||||||
if(nn != Z)
|
|
||||||
gopcode(OAS, &nod, Z, nn);
|
|
||||||
regfree(&nod);
|
|
||||||
regfree(&nod1);
|
|
||||||
if(l->addable < INDEXED)
|
|
||||||
regfree(&nod2);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
asbitop:
|
asbitop:
|
||||||
|
@ -564,6 +543,43 @@ cgenrel(Node *n, Node *nn, int inrel)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
genasop(int o, Node *l, Node *r, Node *nn)
|
||||||
|
{
|
||||||
|
Node nod, nod1, nod2;
|
||||||
|
int hardleft;
|
||||||
|
|
||||||
|
hardleft = l->addable < INDEXED || l->complex >= FNX;
|
||||||
|
if(l->complex >= r->complex) {
|
||||||
|
if(hardleft)
|
||||||
|
reglcgen(&nod2, l, Z);
|
||||||
|
else
|
||||||
|
nod2 = *l;
|
||||||
|
regalloc(&nod1, r, Z);
|
||||||
|
cgen(r, &nod1);
|
||||||
|
} else {
|
||||||
|
regalloc(&nod1, r, Z);
|
||||||
|
cgen(r, &nod1);
|
||||||
|
if(hardleft)
|
||||||
|
reglcgen(&nod2, l, Z);
|
||||||
|
else
|
||||||
|
nod2 = *l;
|
||||||
|
}
|
||||||
|
if(nod1.type == nod2.type || !typefd[nod1.type->etype])
|
||||||
|
regalloc(&nod, &nod2, nn);
|
||||||
|
else
|
||||||
|
regalloc(&nod, &nod1, Z);
|
||||||
|
gmove(&nod2, &nod);
|
||||||
|
gopcode(o, &nod1, Z, &nod);
|
||||||
|
gmove(&nod, &nod2);
|
||||||
|
if(nn != Z)
|
||||||
|
gmove(&nod, nn);
|
||||||
|
regfree(&nod);
|
||||||
|
regfree(&nod1);
|
||||||
|
if(hardleft)
|
||||||
|
regfree(&nod2);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
reglcgen(Node *t, Node *n, Node *nn)
|
reglcgen(Node *t, Node *n, Node *nn)
|
||||||
{
|
{
|
||||||
|
|
|
@ -566,6 +566,9 @@ gmove(Node *f, Node *t)
|
||||||
|
|
||||||
ft = f->type->etype;
|
ft = f->type->etype;
|
||||||
tt = t->type->etype;
|
tt = t->type->etype;
|
||||||
|
if(debug['M'])
|
||||||
|
print("gop: %O %O[%s],%O[%s]\n", OAS,
|
||||||
|
f->op, tnames[ft], t->op, tnames[tt]);
|
||||||
|
|
||||||
if(ft == TDOUBLE && f->op == OCONST) {
|
if(ft == TDOUBLE && f->op == OCONST) {
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue