more pthread
diff --git a/src/cmd/acid/acid.h b/src/cmd/acid/acid.h
index 866816e..95f768e 100644
--- a/src/cmd/acid/acid.h
+++ b/src/cmd/acid/acid.h
@@ -132,7 +132,10 @@
 		String*	string;
 		List*	l;
 		Node*	cc;
-		char*	reg;
+		struct {
+			char *name;
+			uint	thread;
+		} reg;
 		Node*	con;
 	} u;
 };
@@ -258,6 +261,7 @@
 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);
diff --git a/src/cmd/acid/builtin.c b/src/cmd/acid/builtin.c
index 316c492..8dbc176 100644
--- a/src/cmd/acid/builtin.c
+++ b/src/cmd/acid/builtin.c
@@ -325,22 +325,33 @@
 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 @@
 
 	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(");
diff --git a/src/cmd/acid/expr.c b/src/cmd/acid/expr.c
index 6a0430d..822d7bb 100644
--- a/src/cmd/acid/expr.c
+++ b/src/cmd/acid/expr.c
@@ -135,7 +135,7 @@
 		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 @@
 	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 @@
 			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){
diff --git a/src/cmd/acid/util.c b/src/cmd/acid/util.c
index 3ea3c4c..3e6a313 100644
--- a/src/cmd/acid/util.c
+++ b/src/cmd/acid/util.c
@@ -216,7 +216,8 @@
 		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;