changeset 458:0bc9f3273aa7

*** empty log message ***
author kono
date Wed, 01 Dec 2004 23:14:50 +0900
parents a7d76928e3c1
children 9fc266d4010f
files Changes mc-code-arm.c mc-code-ia32.c mc-code-mips.c mc-code-powerpc.c mc-codegen.c mc-parse.c mc-switch.c
diffstat 8 files changed, 36 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Wed Dec 01 22:04:36 2004 +0900
+++ b/Changes	Wed Dec 01 23:14:50 2004 +0900
@@ -6970,3 +6970,18 @@
 
 static  で used っていう属性がないとちょっとまずい。compiler warning
 だすべきだし。
+
+switch(5) みたいな場合をone pathで取り扱うのは、ちょっと面倒。
+     switch(5) 
+        for() {
+	default: ...
+        case 3: ...
+        case 5: ...
+        case 7: ...
+        }
+みたいな場合があるわけだよね。しかも、default があるかどうか
+は、switch の場合ではわからないし。cslist をチェックすればわ
+かるか。でも、default code を取り除けるかどうかは、default 
+を見つけた時点ではわかりえない。
+
+pexpr では、もっと詳しい情報が得られるので、より簡単になる。
--- a/mc-code-arm.c	Wed Dec 01 22:04:36 2004 +0900
+++ b/mc-code-arm.c	Wed Dec 01 23:14:50 2004 +0900
@@ -3123,7 +3123,7 @@
 int
 code_csvalue()
 {
-    return creg;
+    return glist2(REGISTER,creg);
 }
 
 void
--- a/mc-code-ia32.c	Wed Dec 01 22:04:36 2004 +0900
+++ b/mc-code-ia32.c	Wed Dec 01 23:14:50 2004 +0900
@@ -1733,7 +1733,7 @@
 int
 code_csvalue()
 {
-    return rname[creg]; /* for switch value */
+    return glist2(REGISTER,rname[creg]); /* for switch value */
 }
 
 void
--- a/mc-code-mips.c	Wed Dec 01 22:04:36 2004 +0900
+++ b/mc-code-mips.c	Wed Dec 01 23:14:50 2004 +0900
@@ -2671,7 +2671,7 @@
 int
 code_csvalue()
 {
-    return creg;
+    return glist2(REGISTER,creg);
 }
 
 void
--- a/mc-code-powerpc.c	Wed Dec 01 22:04:36 2004 +0900
+++ b/mc-code-powerpc.c	Wed Dec 01 23:14:50 2004 +0900
@@ -2591,7 +2591,7 @@
 int
 code_csvalue()
 {
-    return creg;
+    return glist2(REGISTER,creg);
 }
 
 void
--- a/mc-codegen.c	Wed Dec 01 22:04:36 2004 +0900
+++ b/mc-codegen.c	Wed Dec 01 23:14:50 2004 +0900
@@ -2317,8 +2317,20 @@
 extern void 
 cmpdimm(int e, int csreg,int label,int cond)
 {
-    if (!chk)
-	code_cmpdimm(e, csreg,label,cond);
+    if (!chk) {
+	if (car(csreg)==CONST) {
+	    switch(cond) {
+	    case 1: case 0: 
+	    if (cond ^ (cadr(csreg)==e)) gen_jmp(label);
+		break;
+	    case LT:
+	    if ((cadr(csreg)>e)) gen_jmp(label);
+		break;
+	    }
+	} else if (car(csreg)==REGISTER) {
+	    code_cmpdimm(e, cadr(csreg),label,cond);
+	} else error(-1);
+    }
 }
 
 extern int 
--- a/mc-parse.c	Wed Dec 01 22:04:36 2004 +0900
+++ b/mc-parse.c	Wed Dec 01 23:14:50 2004 +0900
@@ -2176,6 +2176,7 @@
 	if(dlabel) def_label(cslabel,dlabel);
 	else fwddef(cslabel);
 #endif
+	free_glist2(csvalue1);
     }
     csvalue1=svalue;
     cslabel=scase;
--- a/mc-switch.c	Wed Dec 01 22:04:36 2004 +0900
+++ b/mc-switch.c	Wed Dec 01 23:14:50 2004 +0900
@@ -200,7 +200,8 @@
 	    count,delta,max,min);
 
     l = fwdlabel();
-    code_table_jump(l,csvalue1,delta,max,min,dlabel);
+    if (car(csvalue1)!=REGISTER) error(-1);
+    code_table_jump(l,cadr(csvalue1),delta,max,min,dlabel);
     control=0;
     code_table_open(l);
     i = min;