summaryrefslogtreecommitdiff
path: root/src/cmd/8l/span.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-03-20 16:40:00 -0700
committerRuss Cox <rsc@golang.org>2009-03-20 16:40:00 -0700
commitb3e6c9aab3f96ddf2c0be0832b70ab1e504bbb3c (patch)
tree2f91f407749726e7de5074f35c4927adb6a04910 /src/cmd/8l/span.c
parentaa63fd67d59b14fef1795ee074a45c8e8935a0ee (diff)
downloadgolang-b3e6c9aab3f96ddf2c0be0832b70ab1e504bbb3c.tar.gz
update 8a, 8c, 8l to use new object format.
add "extern register" support to 8c. extern register means allocate in the FS-relative segment. make 8l generate segmented stack checks. R=ken OCL=26600 CL=26606
Diffstat (limited to 'src/cmd/8l/span.c')
-rw-r--r--src/cmd/8l/span.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/src/cmd/8l/span.c b/src/cmd/8l/span.c
index b524c735f..81703d304 100644
--- a/src/cmd/8l/span.c
+++ b/src/cmd/8l/span.c
@@ -148,7 +148,10 @@ xdefine(char *p, int t, int32 v)
void
putsymb(char *s, int t, int32 v, int ver)
{
- int i, f;
+ int i, j, f;
+ char *go;
+
+ go = nil; // TODO
if(t == 'f')
s++;
@@ -172,7 +175,14 @@ putsymb(char *s, int t, int32 v, int ver)
cput(s[i]);
cput(0);
}
- symsize += 4 + 1 + i + 1;
+ j = 0;
+ if(go) {
+ for(j=0; go[j]; j++)
+ cput(go[j]);
+ }
+ cput(0);
+
+ symsize += 4 + 1 + i + 1 + j + 1;
if(debug['n']) {
if(t == 'z' || t == 'Z') {
@@ -334,6 +344,24 @@ asmlc(void)
}
int
+prefixof(Adr *a)
+{
+ switch(a->type) {
+ case D_INDIR+D_CS:
+ return 0x2e;
+ case D_INDIR+D_DS:
+ return 0x3e;
+ case D_INDIR+D_ES:
+ return 0x26;
+ case D_INDIR+D_FS:
+ return 0x64;
+ case D_INDIR+D_GS:
+ return 0x65;
+ }
+ return 0;
+}
+
+int
oclass(Adr *a)
{
int32 v;
@@ -447,6 +475,7 @@ oclass(Adr *a)
return Ym;
case D_CONST:
+ case D_CONST2:
case D_ADDR:
if(a->sym == S) {
v = a->offset;
@@ -636,7 +665,7 @@ asmand(Adr *a, int r)
}
if(t >= D_INDIR) {
t -= D_INDIR;
- if(t == D_NONE) {
+ if(t == D_NONE || (D_CS <= t && t <= D_GS)) {
*andptr++ = (0 << 6) | (5 << 0) | (r << 3);
put4(v);
return;
@@ -851,7 +880,14 @@ doasm(Prog *p)
Prog *q, pp;
uchar *t;
int z, op, ft, tt;
- int32 v;
+ int32 v, pre;
+
+ pre = prefixof(&p->from);
+ if(pre)
+ *andptr++ = pre;
+ pre = prefixof(&p->to);
+ if(pre)
+ *andptr++ = pre;
o = &optab[p->as];
ft = oclass(&p->from) * Ymax;