more pthread
This commit is contained in:
parent
ce2a378d46
commit
281c90a5be
8 changed files with 132 additions and 115 deletions
|
|
@ -132,7 +132,10 @@ struct Store
|
|||
String* string;
|
||||
List* l;
|
||||
Node* cc;
|
||||
char* reg;
|
||||
struct {
|
||||
char *name;
|
||||
uint thread;
|
||||
} reg;
|
||||
Node* con;
|
||||
} u;
|
||||
};
|
||||
|
|
@ -258,6 +261,7 @@ String* strnode(char*);
|
|||
String* strnodlen(char*, int);
|
||||
#define system acidsystem
|
||||
char* system(void);
|
||||
Regs* threadregs(uint);
|
||||
int trlist(Map*, Regs*, ulong, ulong, Symbol*, int);
|
||||
void unwind(void);
|
||||
void userinit(void);
|
||||
|
|
|
|||
|
|
@ -325,22 +325,33 @@ xkill(Node *r, Node *args)
|
|||
void
|
||||
xregister(Node *r, Node *args)
|
||||
{
|
||||
int tid;
|
||||
Regdesc *rp;
|
||||
Node res;
|
||||
Node res, resid;
|
||||
Node *av[Maxarg];
|
||||
|
||||
if(args == 0)
|
||||
error("register(string): arg count");
|
||||
expr(args, &res);
|
||||
na = 0;
|
||||
flatten(av, args);
|
||||
if(na != 1 && na != 2)
|
||||
error("register(name[, threadid]): arg count");
|
||||
|
||||
expr(av[0], &res);
|
||||
if(res.type != TSTRING)
|
||||
error("register(string): arg type");
|
||||
|
||||
error("register(name[, threadid]): arg type: name should be string");
|
||||
tid = 0;
|
||||
if(na == 2){
|
||||
expr(av[1], &resid);
|
||||
if(resid.type != TINT)
|
||||
error("register(name[, threadid]): arg type: threadid should be int");
|
||||
tid = resid.store.u.ival;
|
||||
}
|
||||
if((rp = regdesc(res.store.u.string->string)) == nil)
|
||||
error("no such register");
|
||||
|
||||
r->op = OCONST;
|
||||
r->type = TREG;
|
||||
r->store.fmt = rp->format;
|
||||
r->store.u.reg = rp->name;
|
||||
r->store.u.reg.name = rp->name;
|
||||
r->store.u.reg.thread = tid;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -1127,7 +1138,10 @@ patom(char type, Store *res)
|
|||
|
||||
switch(type){
|
||||
case TREG:
|
||||
Bprint(bout, "register(\"%s\")", res->u.reg);
|
||||
if(res->u.reg.thread)
|
||||
Bprint(bout, "register(\"%s\", 0x%ux)", res->u.reg.name, res->u.reg.thread);
|
||||
else
|
||||
Bprint(bout, "register(\"%s\")", res->u.reg.name);
|
||||
return;
|
||||
case TCON:
|
||||
Bprint(bout, "refconst(");
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ oindm(Node *n, Node *res)
|
|||
res->store.comt = l.store.comt;
|
||||
break;
|
||||
case TREG:
|
||||
indirreg(correg, l.store.u.reg, l.store.fmt, res);
|
||||
indirreg(threadregs(l.store.u.reg.thread), l.store.u.reg.name, l.store.fmt, res);
|
||||
res->store.comt = l.store.comt;
|
||||
break;
|
||||
case TCON:
|
||||
|
|
@ -334,7 +334,7 @@ oasgn(Node *n, Node *res)
|
|||
case OINDM:
|
||||
expr(lp->left, &aes);
|
||||
if(aes.type == TREG)
|
||||
windirreg(correg, aes.store.u.reg, n->right, res);
|
||||
windirreg(threadregs(aes.store.u.reg.thread), aes.store.u.reg.name, n->right, res);
|
||||
else
|
||||
windir(cormap, aes, n->right, res);
|
||||
break;
|
||||
|
|
@ -1097,7 +1097,7 @@ acidregsrw(Regs *r, char *name, ulong *u, int isr)
|
|||
werrstr("*%s: register %s not mapped", name, v->store.u.reg);
|
||||
return -1;
|
||||
}
|
||||
return rget(correg, v->store.u.reg, u);
|
||||
return rget(threadregs(v->store.u.reg.thread), v->store.u.reg.name, u);
|
||||
case TCON:
|
||||
n = v->store.u.con;
|
||||
if(n->op != OCONST || n->type != TINT){
|
||||
|
|
|
|||
|
|
@ -216,7 +216,8 @@ varreg(void)
|
|||
l = mkvar(r->name);
|
||||
v = l->v;
|
||||
v->set = 1;
|
||||
v->store.u.reg = r->name;
|
||||
v->store.u.reg.name = r->name;
|
||||
v->store.u.reg.thread = 0;
|
||||
v->store.fmt = r->format;
|
||||
v->type = TREG;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue