mirror of
https://github.com/golang/go
synced 2024-11-21 22:54:40 -07:00
undo CL 5485063 / 21595dc0395a
breaks 64-bit build ««« original CL description 8c: handle 64-bit switch value Cases must still be 32-bit values, but one thing at a time. R=ality, ken2, ken CC=golang-dev https://golang.org/cl/5485063 »»» R=ken2 CC=golang-dev https://golang.org/cl/5488075
This commit is contained in:
parent
1e63a4e424
commit
c8a5f8841c
@ -36,40 +36,12 @@ swit1(C1 *q, int nc, int32 def, Node *n)
|
|||||||
C1 *r;
|
C1 *r;
|
||||||
int i;
|
int i;
|
||||||
Prog *sp;
|
Prog *sp;
|
||||||
Node n1, nreg, ncon;
|
|
||||||
|
|
||||||
if(typev[n->type->etype]) {
|
|
||||||
if(n->op != ONAME || n->sym != nodsafe->sym) {
|
|
||||||
regsalloc(&nreg, n);
|
|
||||||
nreg.type = types[TVLONG];
|
|
||||||
cgen(n, &nreg);
|
|
||||||
swit1(q, nc, def, &nreg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(n->op != OREGISTER) {
|
|
||||||
regalloc(&nreg, n, Z);
|
|
||||||
nreg.type = types[TLONG];
|
|
||||||
cgen(n, &nreg);
|
|
||||||
swit1(q, nc, def, &nreg);
|
|
||||||
regfree(&nreg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(nc < 5) {
|
if(nc < 5) {
|
||||||
for(i=0; i<nc; i++) {
|
for(i=0; i<nc; i++) {
|
||||||
if(debug['W'])
|
if(debug['W'])
|
||||||
print("case = %.8ux\n", q->val);
|
print("case = %.8ux\n", q->val);
|
||||||
if(n->type && typev[n->type->etype]) {
|
gopcode(OEQ, n->type, n, nodconst(q->val));
|
||||||
memset(&n1, 0, sizeof n1);
|
|
||||||
n1.op = OEQ;
|
|
||||||
n1.left = n;
|
|
||||||
ncon = *nodconst(q->val);
|
|
||||||
n1.right = &ncon;
|
|
||||||
boolgen(&n1, 1, Z);
|
|
||||||
} else
|
|
||||||
gopcode(OEQ, n->type, n, nodconst(q->val));
|
|
||||||
patch(p, q->label);
|
patch(p, q->label);
|
||||||
q++;
|
q++;
|
||||||
}
|
}
|
||||||
@ -81,22 +53,10 @@ swit1(C1 *q, int nc, int32 def, Node *n)
|
|||||||
r = q+i;
|
r = q+i;
|
||||||
if(debug['W'])
|
if(debug['W'])
|
||||||
print("case > %.8ux\n", r->val);
|
print("case > %.8ux\n", r->val);
|
||||||
if(n->type && typev[n->type->etype]) {
|
gopcode(OGT, n->type, n, nodconst(r->val));
|
||||||
memset(&n1, 0, sizeof n1);
|
sp = p;
|
||||||
n1.op = OGT;
|
gbranch(OGOTO);
|
||||||
n1.left = n;
|
p->as = AJEQ;
|
||||||
ncon = *nodconst(r->val);
|
|
||||||
n1.right = &ncon;
|
|
||||||
boolgen(&n1, 1, Z);
|
|
||||||
sp = p;
|
|
||||||
n1.op = OEQ;
|
|
||||||
boolgen(&n1, 1, Z);
|
|
||||||
} else {
|
|
||||||
gopcode(OGT, n->type, n, nodconst(r->val));
|
|
||||||
sp = p;
|
|
||||||
gbranch(OGOTO);
|
|
||||||
p->as = AJEQ;
|
|
||||||
}
|
|
||||||
patch(p, r->label);
|
patch(p, r->label);
|
||||||
swit1(q, i, def, n);
|
swit1(q, i, def, n);
|
||||||
|
|
||||||
|
@ -293,7 +293,7 @@ loop:
|
|||||||
complex(l);
|
complex(l);
|
||||||
if(l->type == T)
|
if(l->type == T)
|
||||||
break;
|
break;
|
||||||
if(!typechlvp[l->type->etype] || l->type->etype == TIND) {
|
if(!typeword[l->type->etype] || l->type->etype == TIND) {
|
||||||
diag(n, "switch expression must be integer");
|
diag(n, "switch expression must be integer");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -320,7 +320,15 @@ loop:
|
|||||||
}
|
}
|
||||||
|
|
||||||
patch(sp, pc);
|
patch(sp, pc);
|
||||||
doswit(l);
|
regalloc(&nod, l, Z);
|
||||||
|
/* always signed */
|
||||||
|
if(typev[l->type->etype])
|
||||||
|
nod.type = types[TVLONG];
|
||||||
|
else
|
||||||
|
nod.type = types[TLONG];
|
||||||
|
cgen(l, &nod);
|
||||||
|
doswit(&nod);
|
||||||
|
regfree(&nod);
|
||||||
patch(spb, pc);
|
patch(spb, pc);
|
||||||
|
|
||||||
cases = cn;
|
cases = cn;
|
||||||
|
Loading…
Reference in New Issue
Block a user