Mercurial > hg > CbC > old > device
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;