diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-07-30 19:11:16 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-07-30 19:11:16 +0200 |
commit | 4f33c88a51587681b7be1ae57cfbc43b627c6bc4 (patch) | |
tree | 25560404dc80007e5dc268811242c9071f6a1017 /sys/src/cmd/8a | |
parent | fcc5e75d07e5bc6cb3ddac6d9a437e7ec62d0d95 (diff) |
import updated compilers from sources
Diffstat (limited to 'sys/src/cmd/8a')
-rw-r--r-- | sys/src/cmd/8a/a.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/8a/a.y | 63 | ||||
-rw-r--r-- | sys/src/cmd/8a/l.s | 2 | ||||
-rw-r--r-- | sys/src/cmd/8a/lex.c | 66 |
4 files changed, 124 insertions, 8 deletions
diff --git a/sys/src/cmd/8a/a.h b/sys/src/cmd/8a/a.h index 3095612f8..3bac7ae05 100644 --- a/sys/src/cmd/8a/a.h +++ b/sys/src/cmd/8a/a.h @@ -72,6 +72,7 @@ struct Gen double dval; char sval[8]; long offset; + long offset2; Sym* sym; short type; short index; diff --git a/sys/src/cmd/8a/a.y b/sys/src/cmd/8a/a.y index 167234b43..7c9487f64 100644 --- a/sys/src/cmd/8a/a.y +++ b/sys/src/cmd/8a/a.y @@ -4,6 +4,10 @@ %union { Sym *sym; long lval; + struct { + long v1; + long v2; + } con2; double dval; char sval[8]; Gen gen; @@ -16,16 +20,17 @@ %left '+' '-' %left '*' '/' '%' %token <lval> LTYPE0 LTYPE1 LTYPE2 LTYPE3 LTYPE4 -%token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI +%token <lval> LTYPEC LTYPED LTYPEN LTYPER LTYPET LTYPES LTYPEM LTYPEI LTYPEG %token <lval> LCONST LFP LPC LSB %token <lval> LBREG LLREG LSREG LFREG %token <dval> LFCONST %token <sval> LSCONST LSP %token <sym> LNAME LLAB LVAR %type <lval> con expr pointer offset -%type <gen> mem imm reg nam rel rem rim rom omem nmem +%type <con2> con2 +%type <gen> mem imm imm2 reg nam rel rem rim rom omem nmem %type <gen2> nonnon nonrel nonrem rimnon rimrem remrim -%type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 +%type <gen2> spec1 spec2 spec3 spec4 spec5 spec6 spec7 spec8 %% prog: | prog line @@ -73,6 +78,7 @@ inst: | LTYPES spec5 { outcode($1, &$2); } | LTYPEM spec6 { outcode($1, &$2); } | LTYPEI spec7 { outcode($1, &$2); } +| LTYPEG spec8 { outcode($1, &$2); } nonnon: { @@ -219,6 +225,19 @@ spec7: $$.to = $3; } +spec8: /* GLOBL */ + mem ',' imm + { + $$.from = $1; + $$.to = $3; + } +| mem ',' con ',' imm + { + $$.from = $1; + $$.from.scale = $3; + $$.to = $5; + } + rem: reg | mem @@ -236,6 +255,7 @@ rom: } | reg | omem +| imm rim: rem @@ -335,6 +355,37 @@ imm: $$.dval = -$3; } +imm2: + '$' con2 + { + $$ = nullgen; + $$.type = D_CONST2; + $$.offset = $2.v1; + $$.offset2 = $2.v2; + } + +con2: + LCONST + { + $$.v1 = $1; + $$.v2 = 0; + } +| '-' LCONST + { + $$.v1 = -$2; + $$.v2 = 0; + } +| LCONST '-' LCONST + { + $$.v1 = $1; + $$.v2 = $3; + } +| '-' LCONST '-' LCONST + { + $$.v1 = -$2; + $$.v2 = $4; + } + mem: omem | nmem @@ -386,6 +437,12 @@ omem: $$ = nullgen; $$.type = D_INDIR+D_SP; } +| con '(' LSREG ')' + { + $$ = nullgen; + $$.type = D_INDIR+$3; + $$.offset = $1; + } | '(' LLREG '*' con ')' { $$ = nullgen; diff --git a/sys/src/cmd/8a/l.s b/sys/src/cmd/8a/l.s index 09980d488..4bb92ef54 100644 --- a/sys/src/cmd/8a/l.s +++ b/sys/src/cmd/8a/l.s @@ -221,7 +221,7 @@ TEXT mode32bit(SB),$0 * 16 meg of physical memory */ LEAL tpt-KZERO(SB),AX /* get phys addr of temporary page table */ - ADDL $(BY2PG-1),AX /* must be page alligned */ + ADDL $(BY2PG-1),AX /* must be page aligned */ ANDL $(~(BY2PG-1)),AX /* ... */ MOVL $(4*1024),CX /* pte's per page */ MOVL $((((4*1024)-1)<<PGSHIFT)|PTEVALID|PTEKERNEL|PTEWRITE),BX diff --git a/sys/src/cmd/8a/lex.c b/sys/src/cmd/8a/lex.c index e0d22e59a..7aaf25737 100644 --- a/sys/src/cmd/8a/lex.c +++ b/sys/src/cmd/8a/lex.c @@ -274,6 +274,9 @@ struct "CMPSB", LTYPE0, ACMPSB, "CMPSL", LTYPE0, ACMPSL, "CMPSW", LTYPE0, ACMPSW, + "CMPXCHGB", LTYPE3, ACMPXCHGB, + "CMPXCHGL", LTYPE3, ACMPXCHGL, + "CMPXCHGW", LTYPE3, ACMPXCHGW, "DAA", LTYPE0, ADAA, "DAS", LTYPE0, ADAS, "DATA", LTYPED, ADATA, @@ -285,14 +288,14 @@ struct "DIVW", LTYPE2, ADIVW, "END", LTYPE0, AEND, "ENTER", LTYPE2, AENTER, - "GLOBL", LTYPET, AGLOBL, + "GLOBL", LTYPEG, AGLOBL, "HLT", LTYPE0, AHLT, "IDIVB", LTYPE2, AIDIVB, "IDIVL", LTYPE2, AIDIVL, "IDIVW", LTYPE2, AIDIVW, - "IMULB", LTYPE2, AIMULB, - "IMULL", LTYPE2, AIMULL, - "IMULW", LTYPE2, AIMULW, + "IMULB", LTYPEI, AIMULB, + "IMULL", LTYPEI, AIMULL, + "IMULW", LTYPEI, AIMULW, "INB", LTYPE0, AINB, "INL", LTYPE0, AINL, "INW", LTYPE0, AINW, @@ -493,6 +496,39 @@ struct "XORL", LTYPE3, AXORL, "XORW", LTYPE3, AXORW, + "CMOVLCC", LTYPE3, ACMOVLCC, + "CMOVLCS", LTYPE3, ACMOVLCS, + "CMOVLEQ", LTYPE3, ACMOVLEQ, + "CMOVLGE", LTYPE3, ACMOVLGE, + "CMOVLGT", LTYPE3, ACMOVLGT, + "CMOVLHI", LTYPE3, ACMOVLHI, + "CMOVLLE", LTYPE3, ACMOVLLE, + "CMOVLLS", LTYPE3, ACMOVLLS, + "CMOVLLT", LTYPE3, ACMOVLLT, + "CMOVLMI", LTYPE3, ACMOVLMI, + "CMOVLNE", LTYPE3, ACMOVLNE, + "CMOVLOC", LTYPE3, ACMOVLOC, + "CMOVLOS", LTYPE3, ACMOVLOS, + "CMOVLPC", LTYPE3, ACMOVLPC, + "CMOVLPL", LTYPE3, ACMOVLPL, + "CMOVLPS", LTYPE3, ACMOVLPS, + "CMOVWCC", LTYPE3, ACMOVWCC, + "CMOVWCS", LTYPE3, ACMOVWCS, + "CMOVWEQ", LTYPE3, ACMOVWEQ, + "CMOVWGE", LTYPE3, ACMOVWGE, + "CMOVWGT", LTYPE3, ACMOVWGT, + "CMOVWHI", LTYPE3, ACMOVWHI, + "CMOVWLE", LTYPE3, ACMOVWLE, + "CMOVWLS", LTYPE3, ACMOVWLS, + "CMOVWLT", LTYPE3, ACMOVWLT, + "CMOVWMI", LTYPE3, ACMOVWMI, + "CMOVWNE", LTYPE3, ACMOVWNE, + "CMOVWOC", LTYPE3, ACMOVWOC, + "CMOVWOS", LTYPE3, ACMOVWOS, + "CMOVWPC", LTYPE3, ACMOVWPC, + "CMOVWPL", LTYPE3, ACMOVWPL, + "CMOVWPS", LTYPE3, ACMOVWPS, + "FMOVB", LTYPE3, AFMOVB, "FMOVBP", LTYPE3, AFMOVBP, "FMOVD", LTYPE3, AFMOVD, @@ -507,6 +543,14 @@ struct "FMOVWP", LTYPE3, AFMOVWP, "FMOVX", LTYPE3, AFMOVX, "FMOVXP", LTYPE3, AFMOVXP, + "FCMOVCC", LTYPE3, AFCMOVCC, + "FCMOVCS", LTYPE3, AFCMOVCS, + "FCMOVEQ", LTYPE3, AFCMOVEQ, + "FCMOVHI", LTYPE3, AFCMOVHI, + "FCMOVLS", LTYPE3, AFCMOVLS, + "FCMOVNE", LTYPE3, AFCMOVNE, + "FCMOVNU", LTYPE3, AFCMOVNU, + "FCMOVUN", LTYPE3, AFCMOVUN, "FCOMB", LTYPE3, AFCOMB, "FCOMBP", LTYPE3, AFCOMBP, "FCOMD", LTYPE3, AFCOMD, @@ -514,11 +558,15 @@ struct "FCOMDPP", LTYPE3, AFCOMDPP, "FCOMF", LTYPE3, AFCOMF, "FCOMFP", LTYPE3, AFCOMFP, + "FCOMI", LTYPE3, AFCOMI, + "FCOMIP", LTYPE3, AFCOMIP, "FCOML", LTYPE3, AFCOML, "FCOMLP", LTYPE3, AFCOMLP, "FCOMW", LTYPE3, AFCOMW, "FCOMWP", LTYPE3, AFCOMWP, "FUCOM", LTYPE3, AFUCOM, + "FUCOMI", LTYPE3, AFUCOMI, + "FUCOMIP", LTYPE3, AFUCOMIP, "FUCOMP", LTYPE3, AFUCOMP, "FUCOMPP", LTYPE3, AFUCOMPP, "FADDW", LTYPE3, AFADDW, @@ -704,6 +752,9 @@ zaddr(Gen *a, int s) case D_FCONST: t |= T_FCONST; break; + case D_CONST2: + t |= T_OFFSET|T_OFFSET2; + break; case D_SCONST: t |= T_SCONST; break; @@ -723,6 +774,13 @@ zaddr(Gen *a, int s) Bputc(&obuf, l>>16); Bputc(&obuf, l>>24); } + if(t & T_OFFSET2) { + l = a->offset2; + Bputc(&obuf, l); + Bputc(&obuf, l>>8); + Bputc(&obuf, l>>16); + Bputc(&obuf, l>>24); + } if(t & T_SYM) /* implies sym */ Bputc(&obuf, s); if(t & T_FCONST) { |