Commit 650160e3 authored by Russ Cox's avatar Russ Cox

cmd/gc: prepare for 64-bit ints

This CL makes the compiler understand that the type of
the len or cap of a map, slice, or string is 'int', not 'int32'.
It does not change the meaning of int, but it should make
the eventual change of the meaning of int in 6g a bit smoother.

Update #2188.

R=ken, dave, remyoudompheng
CC=golang-dev
https://golang.org/cl/6542059
parent 0bf46d0c
...@@ -27,6 +27,7 @@ void ...@@ -27,6 +27,7 @@ void
betypeinit(void) betypeinit(void)
{ {
widthptr = 4; widthptr = 4;
widthint = 4;
zprog.link = P; zprog.link = P;
zprog.as = AGOK; zprog.as = AGOK;
......
...@@ -309,7 +309,7 @@ cgen(Node *n, Node *res) ...@@ -309,7 +309,7 @@ cgen(Node *n, Node *res)
case OLEN: case OLEN:
if(istype(nl->type, TMAP) || istype(nl->type, TCHAN)) { if(istype(nl->type, TMAP) || istype(nl->type, TCHAN)) {
// map and chan have len in the first 32-bit word. // map and chan have len in the first int-sized word.
// a zero pointer means zero length // a zero pointer means zero length
regalloc(&n1, types[tptr], res); regalloc(&n1, types[tptr], res);
cgen(nl, &n1); cgen(nl, &n1);
...@@ -320,7 +320,7 @@ cgen(Node *n, Node *res) ...@@ -320,7 +320,7 @@ cgen(Node *n, Node *res)
n2 = n1; n2 = n1;
n2.op = OINDREG; n2.op = OINDREG;
n2.type = types[TINT32]; n2.type = types[simtype[TINT]];
gmove(&n2, &n1); gmove(&n2, &n1);
patch(p1, pc); patch(p1, pc);
...@@ -333,7 +333,7 @@ cgen(Node *n, Node *res) ...@@ -333,7 +333,7 @@ cgen(Node *n, Node *res)
// both slice and string have len one pointer into the struct. // both slice and string have len one pointer into the struct.
// a zero pointer means zero length // a zero pointer means zero length
igen(nl, &n1, res); igen(nl, &n1, res);
n1.type = types[TUINT32]; n1.type = types[simtype[TUINT]];
n1.xoffset += Array_nel; n1.xoffset += Array_nel;
gmove(&n1, res); gmove(&n1, res);
regfree(&n1); regfree(&n1);
...@@ -344,7 +344,7 @@ cgen(Node *n, Node *res) ...@@ -344,7 +344,7 @@ cgen(Node *n, Node *res)
case OCAP: case OCAP:
if(istype(nl->type, TCHAN)) { if(istype(nl->type, TCHAN)) {
// chan has cap in the second 32-bit word. // chan has cap in the second int-sized word.
// a zero pointer means zero length // a zero pointer means zero length
regalloc(&n1, types[tptr], res); regalloc(&n1, types[tptr], res);
cgen(nl, &n1); cgen(nl, &n1);
...@@ -355,8 +355,8 @@ cgen(Node *n, Node *res) ...@@ -355,8 +355,8 @@ cgen(Node *n, Node *res)
n2 = n1; n2 = n1;
n2.op = OINDREG; n2.op = OINDREG;
n2.xoffset = 4; n2.xoffset = widthint;
n2.type = types[TINT32]; n2.type = types[simtype[TINT]];
gmove(&n2, &n1); gmove(&n2, &n1);
patch(p1, pc); patch(p1, pc);
...@@ -367,7 +367,7 @@ cgen(Node *n, Node *res) ...@@ -367,7 +367,7 @@ cgen(Node *n, Node *res)
} }
if(isslice(nl->type)) { if(isslice(nl->type)) {
igen(nl, &n1, res); igen(nl, &n1, res);
n1.type = types[TUINT32]; n1.type = types[simtype[TUINT]];
n1.xoffset += Array_cap; n1.xoffset += Array_cap;
gmove(&n1, res); gmove(&n1, res);
regfree(&n1); regfree(&n1);
...@@ -596,7 +596,7 @@ agen(Node *n, Node *res) ...@@ -596,7 +596,7 @@ agen(Node *n, Node *res)
nlen.type = types[tptr]; nlen.type = types[tptr];
nlen.xoffset += Array_array; nlen.xoffset += Array_array;
gmove(&nlen, &n3); gmove(&nlen, &n3);
nlen.type = types[TUINT32]; nlen.type = types[simtype[TUINT]];
nlen.xoffset += Array_nel-Array_array; nlen.xoffset += Array_nel-Array_array;
} }
} }
...@@ -621,7 +621,7 @@ agen(Node *n, Node *res) ...@@ -621,7 +621,7 @@ agen(Node *n, Node *res)
nlen.type = types[tptr]; nlen.type = types[tptr];
nlen.xoffset += Array_array; nlen.xoffset += Array_array;
gmove(&nlen, &n3); gmove(&nlen, &n3);
nlen.type = types[TUINT32]; nlen.type = types[simtype[TUINT]];
nlen.xoffset += Array_nel-Array_array; nlen.xoffset += Array_nel-Array_array;
} }
} }
...@@ -656,9 +656,9 @@ agen(Node *n, Node *res) ...@@ -656,9 +656,9 @@ agen(Node *n, Node *res)
v = mpgetfix(nr->val.u.xval); v = mpgetfix(nr->val.u.xval);
if(isslice(nl->type) || nl->type->etype == TSTRING) { if(isslice(nl->type) || nl->type->etype == TSTRING) {
if(!debug['B'] && !n->bounded) { if(!debug['B'] && !n->bounded) {
nodconst(&n2, types[TUINT32], v); nodconst(&n2, types[simtype[TUINT]], v);
gins(optoas(OCMP, types[TUINT32]), &nlen, &n2); gins(optoas(OCMP, types[simtype[TUINT]]), &nlen, &n2);
p1 = gbranch(optoas(OGT, types[TUINT32]), T, +1); p1 = gbranch(optoas(OGT, types[simtype[TUINT]]), T, +1);
ginscall(panicindex, -1); ginscall(panicindex, -1);
patch(p1, pc); patch(p1, pc);
} }
...@@ -683,7 +683,7 @@ agen(Node *n, Node *res) ...@@ -683,7 +683,7 @@ agen(Node *n, Node *res)
if(!debug['B'] && !n->bounded) { if(!debug['B'] && !n->bounded) {
// check bounds // check bounds
t = types[TUINT32]; t = types[simtype[TUINT]];
if(is64(nr->type)) if(is64(nr->type))
t = types[TUINT64]; t = types[TUINT64];
if(isconst(nl, CTSTR)) { if(isconst(nl, CTSTR)) {
...@@ -1350,7 +1350,7 @@ componentgen(Node *nr, Node *nl) ...@@ -1350,7 +1350,7 @@ componentgen(Node *nr, Node *nl)
gmove(&nodr, &nodl); gmove(&nodr, &nodl);
nodl.xoffset += Array_nel-Array_array; nodl.xoffset += Array_nel-Array_array;
nodl.type = types[TUINT32]; nodl.type = types[simtype[TUINT]];
if(nr != N) { if(nr != N) {
nodr.xoffset += Array_nel-Array_array; nodr.xoffset += Array_nel-Array_array;
...@@ -1360,7 +1360,7 @@ componentgen(Node *nr, Node *nl) ...@@ -1360,7 +1360,7 @@ componentgen(Node *nr, Node *nl)
gmove(&nodr, &nodl); gmove(&nodr, &nodl);
nodl.xoffset += Array_cap-Array_nel; nodl.xoffset += Array_cap-Array_nel;
nodl.type = types[TUINT32]; nodl.type = types[simtype[TUINT]];
if(nr != N) { if(nr != N) {
nodr.xoffset += Array_cap-Array_nel; nodr.xoffset += Array_cap-Array_nel;
...@@ -1383,7 +1383,7 @@ componentgen(Node *nr, Node *nl) ...@@ -1383,7 +1383,7 @@ componentgen(Node *nr, Node *nl)
gmove(&nodr, &nodl); gmove(&nodr, &nodl);
nodl.xoffset += Array_nel-Array_array; nodl.xoffset += Array_nel-Array_array;
nodl.type = types[TUINT32]; nodl.type = types[simtype[TUINT]];
if(nr != N) { if(nr != N) {
nodr.xoffset += Array_nel-Array_array; nodr.xoffset += Array_nel-Array_array;
......
...@@ -27,6 +27,7 @@ void ...@@ -27,6 +27,7 @@ void
betypeinit(void) betypeinit(void)
{ {
widthptr = 8; widthptr = 8;
widthint = 4;
zprog.link = P; zprog.link = P;
zprog.as = AGOK; zprog.as = AGOK;
......
...@@ -21,7 +21,7 @@ struct Addr ...@@ -21,7 +21,7 @@ struct Addr
Sym* gotype; Sym* gotype;
Sym* sym; Sym* sym;
Node* node; Node* node;
int width; int64 width;
uchar type; uchar type;
uchar index; uchar index;
uchar etype; uchar etype;
......
...@@ -312,8 +312,8 @@ datastring(char *s, int len, Addr *a) ...@@ -312,8 +312,8 @@ datastring(char *s, int len, Addr *a)
a->type = D_EXTERN; a->type = D_EXTERN;
a->sym = sym; a->sym = sym;
a->node = sym->def; a->node = sym->def;
a->offset = widthptr+4; // skip header a->offset = widthptr+widthint; // skip header
a->etype = TINT32; a->etype = simtype[TINT];
} }
/* /*
...@@ -324,7 +324,7 @@ void ...@@ -324,7 +324,7 @@ void
datagostring(Strlit *sval, Addr *a) datagostring(Strlit *sval, Addr *a)
{ {
Sym *sym; Sym *sym;
sym = stringsym(sval->s, sval->len); sym = stringsym(sval->s, sval->len);
a->type = D_EXTERN; a->type = D_EXTERN;
a->sym = sym; a->sym = sym;
...@@ -386,10 +386,10 @@ gdatastring(Node *nam, Strlit *sval) ...@@ -386,10 +386,10 @@ gdatastring(Node *nam, Strlit *sval)
p->to.type = D_ADDR; p->to.type = D_ADDR;
//print("%P\n", p); //print("%P\n", p);
nodconst(&nod1, types[TINT32], sval->len); nodconst(&nod1, types[TINT], sval->len);
p = gins(ADATA, nam, &nod1); p = gins(ADATA, nam, &nod1);
p->from.scale = types[TINT32]->width; p->from.scale = widthint;
p->from.offset += types[tptr]->width; p->from.offset += widthptr;
} }
int int
...@@ -408,7 +408,7 @@ dstringptr(Sym *s, int off, char *str) ...@@ -408,7 +408,7 @@ dstringptr(Sym *s, int off, char *str)
datastring(str, strlen(str)+1, &p->to); datastring(str, strlen(str)+1, &p->to);
p->to.index = p->to.type; p->to.index = p->to.type;
p->to.type = D_ADDR; p->to.type = D_ADDR;
p->to.etype = TINT32; p->to.etype = simtype[TINT];
off += widthptr; off += widthptr;
return off; return off;
...@@ -432,7 +432,7 @@ dgostrlitptr(Sym *s, int off, Strlit *lit) ...@@ -432,7 +432,7 @@ dgostrlitptr(Sym *s, int off, Strlit *lit)
datagostring(lit, &p->to); datagostring(lit, &p->to);
p->to.index = p->to.type; p->to.index = p->to.type;
p->to.type = D_ADDR; p->to.type = D_ADDR;
p->to.etype = TINT32; p->to.etype = simtype[TINT];
off += widthptr; off += widthptr;
return off; return off;
......
...@@ -1247,9 +1247,9 @@ naddr(Node *n, Addr *a, int canemitcode) ...@@ -1247,9 +1247,9 @@ naddr(Node *n, Addr *a, int canemitcode)
naddr(n->left, a, canemitcode); naddr(n->left, a, canemitcode);
if(a->type == D_CONST && a->offset == 0) if(a->type == D_CONST && a->offset == 0)
break; // len(nil) break; // len(nil)
a->etype = TUINT32; a->etype = simtype[TUINT];
a->offset += Array_nel; a->offset += Array_nel;
a->width = 4; a->width = widthint;
if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero) if(a->offset >= unmappedzero && a->offset-Array_nel < unmappedzero)
checkoffset(a, canemitcode); checkoffset(a, canemitcode);
break; break;
...@@ -1259,9 +1259,9 @@ naddr(Node *n, Addr *a, int canemitcode) ...@@ -1259,9 +1259,9 @@ naddr(Node *n, Addr *a, int canemitcode)
naddr(n->left, a, canemitcode); naddr(n->left, a, canemitcode);
if(a->type == D_CONST && a->offset == 0) if(a->type == D_CONST && a->offset == 0)
break; // cap(nil) break; // cap(nil)
a->etype = TUINT32; a->etype = simtype[TUINT];
a->offset += Array_cap; a->offset += Array_cap;
a->width = 4; a->width = widthint;
if(a->offset >= unmappedzero && a->offset-Array_cap < unmappedzero) if(a->offset >= unmappedzero && a->offset-Array_cap < unmappedzero)
checkoffset(a, canemitcode); checkoffset(a, canemitcode);
break; break;
...@@ -2086,12 +2086,12 @@ oindex: ...@@ -2086,12 +2086,12 @@ oindex:
if(!debug['B'] && !n->bounded) { if(!debug['B'] && !n->bounded) {
// check bounds // check bounds
n4.op = OXXX; n4.op = OXXX;
t = types[TUINT32]; t = types[simtype[TUINT]];
if(o & ODynam) { if(o & ODynam) {
if(o & OAddable) { if(o & OAddable) {
n2 = *l; n2 = *l;
n2.xoffset += Array_nel; n2.xoffset += Array_nel;
n2.type = types[TUINT32]; n2.type = types[simtype[TUINT]];
if(is64(r->type)) { if(is64(r->type)) {
t = types[TUINT64]; t = types[TUINT64];
regalloc(&n4, t, N); regalloc(&n4, t, N);
...@@ -2102,7 +2102,7 @@ oindex: ...@@ -2102,7 +2102,7 @@ oindex:
n2 = *reg; n2 = *reg;
n2.xoffset = Array_nel; n2.xoffset = Array_nel;
n2.op = OINDREG; n2.op = OINDREG;
n2.type = types[TUINT32]; n2.type = types[simtype[TUINT]];
if(is64(r->type)) { if(is64(r->type)) {
t = types[TUINT64]; t = types[TUINT64];
regalloc(&n4, t, N); regalloc(&n4, t, N);
...@@ -2180,8 +2180,8 @@ oindex_const: ...@@ -2180,8 +2180,8 @@ oindex_const:
n1.type = types[tptr]; n1.type = types[tptr];
n1.xoffset = Array_nel; n1.xoffset = Array_nel;
nodconst(&n2, types[TUINT64], v); nodconst(&n2, types[TUINT64], v);
gins(optoas(OCMP, types[TUINT32]), &n1, &n2); gins(optoas(OCMP, types[simtype[TUINT]]), &n1, &n2);
p1 = gbranch(optoas(OGT, types[TUINT32]), T, +1); p1 = gbranch(optoas(OGT, types[simtype[TUINT]]), T, +1);
ginscall(panicindex, -1); ginscall(panicindex, -1);
patch(p1, pc); patch(p1, pc);
} }
...@@ -2223,9 +2223,9 @@ oindex_const_sudo: ...@@ -2223,9 +2223,9 @@ oindex_const_sudo:
if(!debug['B'] && !n->bounded) { if(!debug['B'] && !n->bounded) {
a->offset += Array_nel; a->offset += Array_nel;
nodconst(&n2, types[TUINT64], v); nodconst(&n2, types[TUINT64], v);
p1 = gins(optoas(OCMP, types[TUINT32]), N, &n2); p1 = gins(optoas(OCMP, types[simtype[TUINT]]), N, &n2);
p1->from = *a; p1->from = *a;
p1 = gbranch(optoas(OGT, types[TUINT32]), T, +1); p1 = gbranch(optoas(OGT, types[simtype[TUINT]]), T, +1);
ginscall(panicindex, -1); ginscall(panicindex, -1);
patch(p1, pc); patch(p1, pc);
a->offset -= Array_nel; a->offset -= Array_nel;
......
...@@ -945,7 +945,8 @@ Bits ...@@ -945,7 +945,8 @@ Bits
mkvar(Reg *r, Adr *a) mkvar(Reg *r, Adr *a)
{ {
Var *v; Var *v;
int i, t, n, et, z, w, flag; int i, t, n, et, z, flag;
int64 w;
uint32 regu; uint32 regu;
int32 o; int32 o;
Bits bit; Bits bit;
...@@ -998,7 +999,7 @@ mkvar(Reg *r, Adr *a) ...@@ -998,7 +999,7 @@ mkvar(Reg *r, Adr *a)
o = a->offset; o = a->offset;
w = a->width; w = a->width;
if(w < 0) if(w < 0)
fatal("bad width %d for %D", w, a); fatal("bad width %lld for %D", w, a);
flag = 0; flag = 0;
for(i=0; i<nvar; i++) { for(i=0; i<nvar; i++) {
......
...@@ -27,6 +27,7 @@ void ...@@ -27,6 +27,7 @@ void
betypeinit(void) betypeinit(void)
{ {
widthptr = 4; widthptr = 4;
widthint = 4;
zprog.link = P; zprog.link = P;
zprog.as = AGOK; zprog.as = AGOK;
......
...@@ -615,12 +615,12 @@ typeinit(void) ...@@ -615,12 +615,12 @@ typeinit(void)
} }
Array_array = rnd(0, widthptr); Array_array = rnd(0, widthptr);
Array_nel = rnd(Array_array+widthptr, types[TUINT32]->width); Array_nel = rnd(Array_array+widthptr, widthint);
Array_cap = rnd(Array_nel+types[TUINT32]->width, types[TUINT32]->width); Array_cap = rnd(Array_nel+widthint, widthint);
sizeof_Array = rnd(Array_cap+types[TUINT32]->width, widthptr); sizeof_Array = rnd(Array_cap+widthint, widthptr);
// string is same as slice wo the cap // string is same as slice wo the cap
sizeof_String = rnd(Array_nel+types[TUINT32]->width, widthptr); sizeof_String = rnd(Array_nel+widthint, widthptr);
dowidth(types[TSTRING]); dowidth(types[TSTRING]);
dowidth(idealstring); dowidth(idealstring);
......
...@@ -763,7 +763,7 @@ cgen_eface(Node *n, Node *res) ...@@ -763,7 +763,7 @@ cgen_eface(Node *n, Node *res)
* generate: * generate:
* res = s[lo, hi]; * res = s[lo, hi];
* n->left is s * n->left is s
* n->list is (cap(s)-lo(TUINT32), hi-lo(TUINT32)[, lo*width(TUINTPTR)]) * n->list is (cap(s)-lo(TUINT), hi-lo(TUINT)[, lo*width(TUINTPTR)])
* caller (cgen) guarantees res is an addable ONAME. * caller (cgen) guarantees res is an addable ONAME.
*/ */
void void
...@@ -780,14 +780,14 @@ cgen_slice(Node *n, Node *res) ...@@ -780,14 +780,14 @@ cgen_slice(Node *n, Node *res)
// dst.len = hi [ - lo ] // dst.len = hi [ - lo ]
dst = *res; dst = *res;
dst.xoffset += Array_nel; dst.xoffset += Array_nel;
dst.type = types[TUINT32]; dst.type = types[simtype[TUINT]];
cgen(len, &dst); cgen(len, &dst);
if(n->op != OSLICESTR) { if(n->op != OSLICESTR) {
// dst.cap = cap [ - lo ] // dst.cap = cap [ - lo ]
dst = *res; dst = *res;
dst.xoffset += Array_cap; dst.xoffset += Array_cap;
dst.type = types[TUINT32]; dst.type = types[simtype[TUINT]];
cgen(cap, &dst); cgen(cap, &dst);
} }
......
...@@ -905,6 +905,7 @@ EXTERN int hasdefer; // flag that curfn has defer statetment ...@@ -905,6 +905,7 @@ EXTERN int hasdefer; // flag that curfn has defer statetment
EXTERN Node* curfn; EXTERN Node* curfn;
EXTERN int widthptr; EXTERN int widthptr;
EXTERN int widthint;
EXTERN Node* typesw; EXTERN Node* typesw;
EXTERN Node* nblank; EXTERN Node* nblank;
......
...@@ -302,8 +302,8 @@ stringsym(char *s, int len) ...@@ -302,8 +302,8 @@ stringsym(char *s, int len)
off = 0; off = 0;
// string header // string header
off = dsymptr(sym, off, sym, widthptr+4); off = dsymptr(sym, off, sym, widthptr+widthint);
off = duint32(sym, off, len); off = duintxx(sym, off, len, widthint);
// string data // string data
for(n=0; n<len; n+=m) { for(n=0; n<len; n+=m) {
......
...@@ -378,9 +378,9 @@ dextratype(Sym *sym, int off, Type *t, int ptroff) ...@@ -378,9 +378,9 @@ dextratype(Sym *sym, int off, Type *t, int ptroff)
} }
// slice header // slice header
ot = dsymptr(s, ot, s, ot + widthptr + 2*4); ot = dsymptr(s, ot, s, ot + widthptr + 2*widthint);
ot = duint32(s, ot, n); ot = duintxx(s, ot, n, widthint);
ot = duint32(s, ot, n); ot = duintxx(s, ot, n, widthint);
// methods // methods
for(a=m; a; a=a->link) { for(a=m; a; a=a->link) {
...@@ -780,13 +780,13 @@ ok: ...@@ -780,13 +780,13 @@ ok:
// two slice headers: in and out. // two slice headers: in and out.
ot = rnd(ot, widthptr); ot = rnd(ot, widthptr);
ot = dsymptr(s, ot, s, ot+2*(widthptr+2*4)); ot = dsymptr(s, ot, s, ot+2*(widthptr+2*widthint));
n = t->thistuple + t->intuple; n = t->thistuple + t->intuple;
ot = duint32(s, ot, n); ot = duintxx(s, ot, n, widthint);
ot = duint32(s, ot, n); ot = duintxx(s, ot, n, widthint);
ot = dsymptr(s, ot, s, ot+1*(widthptr+2*4)+n*widthptr); ot = dsymptr(s, ot, s, ot+1*(widthptr+2*widthint)+n*widthptr);
ot = duint32(s, ot, t->outtuple); ot = duintxx(s, ot, t->outtuple, widthint);
ot = duint32(s, ot, t->outtuple); ot = duintxx(s, ot, t->outtuple, widthint);
// slice data // slice data
for(t1=getthisx(t)->type; t1; t1=t1->down, n++) for(t1=getthisx(t)->type; t1; t1=t1->down, n++)
...@@ -808,9 +808,9 @@ ok: ...@@ -808,9 +808,9 @@ ok:
// ../../pkg/runtime/type.go:/InterfaceType // ../../pkg/runtime/type.go:/InterfaceType
ot = dcommontype(s, ot, t); ot = dcommontype(s, ot, t);
xt = ot - 2*widthptr; xt = ot - 2*widthptr;
ot = dsymptr(s, ot, s, ot+widthptr+2*4); ot = dsymptr(s, ot, s, ot+widthptr+2*widthint);
ot = duint32(s, ot, n); ot = duintxx(s, ot, n, widthint);
ot = duint32(s, ot, n); ot = duintxx(s, ot, n, widthint);
for(a=m; a; a=a->link) { for(a=m; a; a=a->link) {
// ../../pkg/runtime/type.go:/imethod // ../../pkg/runtime/type.go:/imethod
ot = dgostringptr(s, ot, a->name); ot = dgostringptr(s, ot, a->name);
...@@ -853,9 +853,9 @@ ok: ...@@ -853,9 +853,9 @@ ok:
} }
ot = dcommontype(s, ot, t); ot = dcommontype(s, ot, t);
xt = ot - 2*widthptr; xt = ot - 2*widthptr;
ot = dsymptr(s, ot, s, ot+widthptr+2*4); ot = dsymptr(s, ot, s, ot+widthptr+2*widthint);
ot = duint32(s, ot, n); ot = duintxx(s, ot, n, widthint);
ot = duint32(s, ot, n); ot = duintxx(s, ot, n, widthint);
for(t1=t->type; t1!=T; t1=t1->down) { for(t1=t->type; t1!=T; t1=t1->down) {
// ../../pkg/runtime/type.go:/structField // ../../pkg/runtime/type.go:/structField
if(t1->sym && !t1->embedded) { if(t1->sym && !t1->embedded) {
......
...@@ -46,8 +46,6 @@ func appendstr(typ *byte, x []byte, y string) []byte ...@@ -46,8 +46,6 @@ func appendstr(typ *byte, x []byte, y string) []byte
func cmpstring(string, string) int func cmpstring(string, string) int
func eqstring(string, string) bool func eqstring(string, string) bool
func slicestring(string, int, int) string
func slicestring1(string, int) string
func intstring(int64) string func intstring(int64) string
func slicebytetostring([]byte) string func slicebytetostring([]byte) string
func slicerunetostring([]rune) string func slicerunetostring([]rune) string
...@@ -55,7 +53,7 @@ func stringtoslicebyte(string) []byte ...@@ -55,7 +53,7 @@ func stringtoslicebyte(string) []byte
func stringtoslicerune(string) []rune func stringtoslicerune(string) []rune
func stringiter(string, int) int func stringiter(string, int) int
func stringiter2(string, int) (retk int, retv rune) func stringiter2(string, int) (retk int, retv rune)
func copy(to any, fr any, wid uint32) int func copy(to any, fr any, wid uintptr) int
func slicestringcopy(to any, fr any) int func slicestringcopy(to any, fr any) int
// interface conversions // interface conversions
...@@ -109,7 +107,7 @@ func selectnbsend(chanType *byte, hchan chan<- any, elem any) bool ...@@ -109,7 +107,7 @@ func selectnbsend(chanType *byte, hchan chan<- any, elem any) bool
func selectnbrecv(chanType *byte, elem *any, hchan <-chan any) bool func selectnbrecv(chanType *byte, elem *any, hchan <-chan any) bool
func selectnbrecv2(chanType *byte, elem *any, received *bool, hchan <-chan any) bool func selectnbrecv2(chanType *byte, elem *any, received *bool, hchan <-chan any) bool
func newselect(size int) (sel *byte) func newselect(size int32) (sel *byte)
func selectsend(sel *byte, hchan chan<- any, elem *any) (selected bool) func selectsend(sel *byte, hchan chan<- any, elem *any) (selected bool)
func selectrecv(sel *byte, hchan <-chan any, elem *any) (selected bool) func selectrecv(sel *byte, hchan <-chan any, elem *any) (selected bool)
func selectrecv2(sel *byte, hchan <-chan any, elem *any, received *bool) (selected bool) func selectrecv2(sel *byte, hchan <-chan any, elem *any, received *bool) (selected bool)
......
...@@ -300,9 +300,9 @@ staticcopy(Node *l, Node *r, NodeList **out) ...@@ -300,9 +300,9 @@ staticcopy(Node *l, Node *r, NodeList **out)
n1.xoffset = l->xoffset + Array_array; n1.xoffset = l->xoffset + Array_array;
gdata(&n1, nod(OADDR, a, N), widthptr); gdata(&n1, nod(OADDR, a, N), widthptr);
n1.xoffset = l->xoffset + Array_nel; n1.xoffset = l->xoffset + Array_nel;
gdata(&n1, r->right, 4); gdata(&n1, r->right, widthint);
n1.xoffset = l->xoffset + Array_cap; n1.xoffset = l->xoffset + Array_cap;
gdata(&n1, r->right, 4); gdata(&n1, r->right, widthint);
return 1; return 1;
} }
// fall through // fall through
...@@ -403,9 +403,9 @@ staticassign(Node *l, Node *r, NodeList **out) ...@@ -403,9 +403,9 @@ staticassign(Node *l, Node *r, NodeList **out)
n1.xoffset = l->xoffset + Array_array; n1.xoffset = l->xoffset + Array_array;
gdata(&n1, nod(OADDR, a, N), widthptr); gdata(&n1, nod(OADDR, a, N), widthptr);
n1.xoffset = l->xoffset + Array_nel; n1.xoffset = l->xoffset + Array_nel;
gdata(&n1, r->right, 4); gdata(&n1, r->right, widthint);
n1.xoffset = l->xoffset + Array_cap; n1.xoffset = l->xoffset + Array_cap;
gdata(&n1, r->right, 4); gdata(&n1, r->right, widthint);
// Fall through to init underlying array. // Fall through to init underlying array.
l = a; l = a;
} }
...@@ -1232,11 +1232,11 @@ slice: ...@@ -1232,11 +1232,11 @@ slice:
gdata(&nam, nl, types[tptr]->width); gdata(&nam, nl, types[tptr]->width);
nam.xoffset += Array_nel-Array_array; nam.xoffset += Array_nel-Array_array;
nodconst(&nod1, types[TINT32], nr->type->bound); nodconst(&nod1, types[TINT], nr->type->bound);
gdata(&nam, &nod1, types[TINT32]->width); gdata(&nam, &nod1, widthint);
nam.xoffset += Array_cap-Array_nel; nam.xoffset += Array_cap-Array_nel;
gdata(&nam, &nod1, types[TINT32]->width); gdata(&nam, &nod1, widthint);
goto yes; goto yes;
......
...@@ -2496,7 +2496,7 @@ sliceany(Node* n, NodeList **init) ...@@ -2496,7 +2496,7 @@ sliceany(Node* n, NodeList **init)
chk1 = N; chk1 = N;
chk2 = N; chk2 = N;
bt = types[TUINT32]; bt = types[simtype[TUINT]];
if(hb != N && hb->type->width > 4) if(hb != N && hb->type->width > 4)
bt = types[TUINT64]; bt = types[TUINT64];
if(lb != N && lb->type->width > 4) if(lb != N && lb->type->width > 4)
...@@ -2546,18 +2546,18 @@ sliceany(Node* n, NodeList **init) ...@@ -2546,18 +2546,18 @@ sliceany(Node* n, NodeList **init)
n->right = N; n->right = N;
n->list = nil; n->list = nil;
if(lb == N) if(lb == N)
bound = conv(bound, types[TUINT32]); bound = conv(bound, types[simtype[TUINT]]);
else else
bound = nod(OSUB, conv(bound, types[TUINT32]), conv(lb, types[TUINT32])); bound = nod(OSUB, conv(bound, types[simtype[TUINT]]), conv(lb, types[simtype[TUINT]]));
typecheck(&bound, Erv); typecheck(&bound, Erv);
walkexpr(&bound, init); walkexpr(&bound, init);
n->list = list(n->list, bound); n->list = list(n->list, bound);
// len = hi [ - lo] // len = hi [ - lo]
if(lb == N) if(lb == N)
hb = conv(hb, types[TUINT32]); hb = conv(hb, types[simtype[TUINT]]);
else else
hb = nod(OSUB, conv(hb, types[TUINT32]), conv(lb, types[TUINT32])); hb = nod(OSUB, conv(hb, types[simtype[TUINT]]), conv(lb, types[simtype[TUINT]]));
typecheck(&hb, Erv); typecheck(&hb, Erv);
walkexpr(&hb, init); walkexpr(&hb, init);
n->list = list(n->list, hb); n->list = list(n->list, hb);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment