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();