Mercurial > hg > Members > kono > compiler-examples
changeset 19:0a1507c12f9a
O_DIVR broken
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 28 Oct 2016 15:35:31 +0900 |
parents | 230d5ca49f9f |
children | d71b36deaa9d |
files | Makefile s-code-intel-r.c s-code-intel64-mac-r.c s-token.c s-token.h s-tree.c |
diffstat | 6 files changed, 32 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Fri Oct 28 15:16:55 2016 +0900 +++ b/Makefile Fri Oct 28 15:35:31 2016 +0900 @@ -5,8 +5,8 @@ CFLAGS = -g -O0 -Wall YYFLAGS = -v YACC = bison -COMPILER = s-compile.o s-token.o -# COMPILER = s-tree-compile.o s-token.o +# COMPILER = s-trecompile.o s-token.o +COMPILER = s-tree-compile.o s-token.o # COMPILER = s-yacc.o s-token.o # TARGET = token calc s-calc s-prefix s-rpn s-09 s-intel s-intel-r s-sparc s-rs6k s-m68k s-ppc s-imac
--- a/s-code-intel-r.c Fri Oct 28 15:16:55 2016 +0900 +++ b/s-code-intel-r.c Fri Oct 28 15:35:31 2016 +0900 @@ -83,8 +83,8 @@ */ #define MAX_MAX 20 -static int regs[MAX_MAX]; /* 使われているレジスタを示すフラグ */ -static int reg_stack[MAX_MAX]; /* 実際のレジスタの領域 */ +static int regs[MAX_MAX]; /* 篏帥吾鴻帥腓冴 */ +static int reg_stack[MAX_MAX]; /* 絎吾鴻帥 */ const int MAX_REGISTER=6; const int MAX_DATA_REG=4; @@ -103,19 +103,19 @@ static int get_register() -{ /* 使われていないレジスタを調べる */ +{ /* 篏帥吾鴻帥茯帥鴻 */ int i; for(i=0;i<MAX_REGISTER;i++) { - if (! regs[i]) { /* 使われていないなら */ - regs[i]=1; /* そのレジスタを使うことを宣言し */ - return i; /* その場所を表す番号を返す */ + if (! regs[i]) { /* 篏帥 */ + regs[i]=1; /* 吾鴻帥篏帥絎h */ + return i; /* 贋茵垩菴 */ } } - return -1; /* 空いている場所がないなら、それを表す -1 を返す */ + return -1; /* 腥冴贋茵 -1 菴 */ } static void -free_register(i) { /* いらなくなったレジスタを開放 */ +free_register(i) { /* c吾鴻帥 */ regs[i]=0; } @@ -140,7 +140,7 @@ for(i=0;i<MAX_REGISTER;i++) regs[i]=0; creg = get_register(); crn = reg_name[creg]; - dreg = REG_EDX; /* これは割算などで特別に使われる */ + dreg = REG_EDX; /* 牙х劫ャ篏帥 */ regs[dreg]=1; drn = reg_name[dreg]; reg_sp = 0; @@ -148,7 +148,7 @@ static int pop_register() -{ /* レジスタから値を取り出す */ +{ /* 吾鴻帥ゃ冴 */ int i,j; j = creg; @@ -169,7 +169,7 @@ { int new_reg; new_reg = get_register(); - if(new_reg<0) { /* もうレジスタがない */ + if(new_reg<0) { /* 吾鴻帥 */ if (reg_sp==MAX_MAX-1) { printf("Compilation error: too complex expression\n"); } else { @@ -177,7 +177,7 @@ printf("\tpushl %s\n",crn); } } else { - reg_stack[reg_sp++] = creg; /* push するかわりにレジスタを使う */ + reg_stack[reg_sp++] = creg; /* push 吾鴻帥篏帥 */ creg = new_reg; crn = reg_name[creg]; }
--- a/s-code-intel64-mac-r.c Fri Oct 28 15:16:55 2016 +0900 +++ b/s-code-intel64-mac-r.c Fri Oct 28 15:35:31 2016 +0900 @@ -320,6 +320,11 @@ // rdx !!! printf("\tcltd\n"); printf("\tidivq %s\n",orn); + } else if(op==O_DIV_R) { + printf("\txchg %s,%%rax\n",crn); + printf("\tcltd\n"); + printf("\tidivq %s\n",crn); + crn = "%rax"; } else if(op==O_SUB) { printf("\t%s %s,%s\n",opcode[op],orn,crn); printf("\tnegq %s\n",crn);
--- a/s-token.c Fri Oct 28 15:16:55 2016 +0900 +++ b/s-token.c Fri Oct 28 15:35:31 2016 +0900 @@ -56,9 +56,7 @@ } void -error(s) -char *s; -{ +error(char *s) { fprintf(stderr,"%s on %s\n",s,last_ptr); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-token.h Fri Oct 28 15:35:31 2016 +0900 @@ -0,0 +1,7 @@ +extern char *ptr,*last_ptr,*before; +extern int value,lvalue; +extern int last_token; + +extern void error(char *s); +extern int token(); +
--- a/s-tree.c Fri Oct 28 15:16:55 2016 +0900 +++ b/s-tree.c Fri Oct 28 15:35:31 2016 +0900 @@ -4,6 +4,11 @@ */ #include <stdio.h> +#include <stdlib.h> +#include "s-token.h" + +// extern int label; +// extern char *comments; int variable[48]; @@ -14,8 +19,6 @@ int value; } node; -static node *free; - static node *expr(); static node *aexpr(); static node *mexpr(); @@ -73,7 +76,6 @@ static node * expr() { - int assign; node *d; d = aexpr();