changeset 799:56ba015b37ca

i64 fix register save offset, make diff2 passed.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 23 Nov 2010 23:05:08 +0900
parents df9861be349f
children c3957d127e17
files Changes mc-code-i64.c
diffstat 2 files changed, 13 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Tue Nov 23 21:59:14 2010 +0900
+++ b/Changes	Tue Nov 23 23:05:08 2010 +0900
@@ -9909,8 +9909,10 @@
 
 stdarg は、コード生成と va_arg を statment expression で乗り切りました。疲れた。
 
-
-
-
-
-
+Tue Nov 23 23:02:38 JST 2010
+
+register をsave するのに、push を使っているけど、その分、余計にstackを確保する
+必要がある。でも、そうすると、function_disp_offset にラベルを使う必要がある。
+それは、ちょっとうれしくない。pushではなくて、local 変数にsaveすると言う
+技もあるが... その方がいいか?
+
--- a/mc-code-i64.c	Tue Nov 23 21:59:14 2010 +0900
+++ b/mc-code-i64.c	Tue Nov 23 23:05:08 2010 +0900
@@ -337,6 +337,9 @@
                     -12  <- disp_offset          %ebp
                      -8
                      -4
+                      pushq r13
+                      pushq r14
+                      pushq r15
         %ebp = %esp   0
         %eip          4   <- arg_offset
                  arg8 8
@@ -565,7 +568,7 @@
 #define round8(i)    align(i,8)
 
 
-#define func_disp_offset (16)
+#define func_disp_offset (16+8*5)
 // #define code_disp_offset (16)
 
 #define arg_offset  (16)
@@ -3234,10 +3237,10 @@
     // before goto leave code, set return register
     if (cadr(fnptr->ty)==FLOAT) {
         set_freg(RET_FREGISTER,mode);
-	return 0;
+	return freg;
     } else if (cadr(fnptr->ty)==DOUBLE) {
         set_freg(RET_DREGISTER,mode);
-	return 0;
+	return freg;
     } else if (cadr(fnptr->ty)==LONGLONG||cadr(fnptr->ty)==ULONGLONG) {
         set_lreg(RET_LREGISTER,mode);
 	return ireg;