diff options
| author | Russ Cox <rsc@golang.org> | 2009-03-20 16:40:00 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-03-20 16:40:00 -0700 |
| commit | b3e6c9aab3f96ddf2c0be0832b70ab1e504bbb3c (patch) | |
| tree | 2f91f407749726e7de5074f35c4927adb6a04910 /src/cmd/8l/span.c | |
| parent | aa63fd67d59b14fef1795ee074a45c8e8935a0ee (diff) | |
| download | golang-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.c | 44 |
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; |
