# HG changeset patch # User Shinji KONO # Date 1290501940 -32400 # Node ID 80a59598df5fb4c9bde8c374e5a1c2c9650344f2 # Parent a4fd2ab28e2473131bcd322d8207bfd2faa697ff ia64 stdarg diff -r a4fd2ab28e24 -r 80a59598df5f mc-code-i64.c --- a/mc-code-i64.c Tue Nov 23 12:45:22 2010 +0900 +++ b/mc-code-i64.c Tue Nov 23 17:45:40 2010 +0900 @@ -52,7 +52,7 @@ #define __builtin_va_start(ap,v) \\\n\ { \\\n\ ap = &__my_va_list; \\\n\ - ap->float_first = ap->long_last+8; \\\n\ + ap->float_first = ap->long_last-8; \\\n\ long adr = (long)&v; \\\n\ if (adr >= ap->stack_top) ap->arg = ap->float_first = adr; \\\n\ if (__builtin_types_compatible_p(typeof(v),double)) \\\n\ @@ -1243,14 +1243,17 @@ int stype = type; int smode = mode; int sstmode = stmode; - - NMTBL *nptr =name_space_search(get_name("__builtin_va_list1",0,NONDEF),0); - if (!nptr) error(-1); - type = nptr->ty; - typedefed=glist3n(TYPEDEF,typedefed,nptr); - mode = LDECL; - stmode = 0; - NMTBL *n = def(lsearch("__my_va_list",0),0); + NMTBL *n; + + if (!parse_mode || inmode) { + NMTBL *nptr =name_space_search(get_name("__builtin_va_list1",0,NONDEF),0); + if (!nptr) error(-1); + type = nptr->ty; + typedefed=glist3n(TYPEDEF,typedefed,nptr); + mode = LDECL; + stmode = 0; + n = def(lsearch("__my_va_list",0),0); + } // ssetup va_list structure // __my_va_list is defined as local in code_arg_register @@ -1261,19 +1264,19 @@ long float_last; \n\ long stack_top; \n\ */ - if (inmode) { + if (parse_mode && inmode) { parse = list5n(ST_DECL,parse,list3(mode,0,0),0,n); // long_last - parse = list3(ST_COMP,parse,assign_expr0( list3n(LVAR,n->dsp,n),list3(LADD,list2(LREGISTER,REG_EBP),llist2(LCONST,FUNC_LVAR(long_last))),LONGLONG,LONGLONG)); + parse = list3(ST_COMP,parse,assign_expr0( list3n(IVAR,n->dsp,n),list2(ADDRESS,list3n(LVAR,long_last,0)),LONGLONG,LONGLONG)); // float_last - parse = list3(ST_COMP,parse,assign_expr0( list3(ADD,list3n(LVAR,n->dsp,n),list2(CONST,16)),list3(LADD,list2(LREGISTER,REG_EBP),llist2(LCONST,FUNC_LVAR(float_last))),LONGLONG,LONGLONG)); + parse = list3(ST_COMP,parse,assign_expr0( list3(LADD,list3n(IVAR,n->dsp,n),llist2(LCONST,16)),list2(ADDRESS,list3n(LVAR,float_last,0)),LONGLONG,LONGLONG)); // stack_top - parse = list3(ST_COMP,parse,assign_expr0( list3(ADD,list3n(LVAR,n->dsp,n),list2(CONST,24)),list3(LADD,list2(LREGISTER,REG_EBP),llist2(LCONST,16)),LONGLONG,LONGLONG)); - } else { + parse = list3(ST_COMP,parse,assign_expr0( list3(LADD,list3n(IVAR,n->dsp,n),llist2(LCONST,24)),list3(LADD,list2(LREGISTER,REG_EBP),llist2(LCONST,16)),LONGLONG,LONGLONG)); + } else if (!parse_mode && !inmode) { // long_last - g_expr_u(assign_expr0( list3n(LVAR,n->dsp,n),list3(LADD,list2(LREGISTER,REG_EBP),llist2(LCONST,FUNC_LVAR(long_last))),LONGLONG,LONGLONG)); + g_expr_u(assign_expr0( list3n(LVAR,n->dsp,n),list2(ADDRESS,list3n(LVAR,long_last,0)),LONGLONG,LONGLONG)); // float_last - g_expr_u(assign_expr0( list3n(LVAR,n->dsp+16,n),list3(LADD,list2(LREGISTER,REG_EBP),llist2(LCONST,FUNC_LVAR(float_last))),LONGLONG,LONGLONG)); + g_expr_u(assign_expr0( list3n(LVAR,n->dsp+16,n),list2(ADDRESS,list3n(LVAR,float_last,0)),LONGLONG,LONGLONG)); // stack_top g_expr_u(assign_expr0( list3n(LVAR,n->dsp+24,n),list3(LADD,list2(LREGISTER,REG_EBP),llist2(LCONST,16)),LONGLONG,LONGLONG)); } @@ -1352,8 +1355,8 @@ MAX_INPUT_REGISTER_VAR*SIZE_OF_LONGLONG + MAX_INPUT_DREGISTER_VAR*SIZE_OF_DOUBLE; - int long_last = -arg_offset_v + reg_var*SIZE_OF_LONGLONG; - int float_last = long_last + freg_var*SIZE_OF_LONGLONG; + int long_last = -arg_offset_v + (MAX_INPUT_REGISTER_VAR)*SIZE_OF_LONGLONG; + int float_last = long_last + (MAX_INPUT_DREGISTER_VAR)*SIZE_OF_DOUBLE; def_va_list_truct(long_last,float_last); #ifndef __APPLE__ diff -r a4fd2ab28e24 -r 80a59598df5f test/tstdarg.c --- a/test/tstdarg.c Tue Nov 23 12:45:22 2010 +0900 +++ b/test/tstdarg.c Tue Nov 23 17:45:40 2010 +0900 @@ -15,22 +15,10 @@ va_list ap; va_start(ap,numtypes); - -printf("__my_va_list.long_last = %llx\n", __my_va_list.long_last); -printf("__my_va_list.float_first = %llx\n", __my_va_list.float_first); -printf("__my_va_list.float_last = %llx\n", __my_va_list.float_last); -printf("__my_va_list.stack_top = %llx\n", __my_va_list.stack_top); -printf("__my_va_list.arg = %llx\n", __my_va_list.arg); - while((t= *numtypes++)) { if (t=='i') { i = va_arg(ap,int); printf("#0021:int arg: %d\n",i); -printf("__my_va_list.long_last = %llx\n", __my_va_list.long_last); -printf("__my_va_list.float_first = %llx\n", __my_va_list.float_first); -printf("__my_va_list.float_last = %llx\n", __my_va_list.float_last); -printf("__my_va_list.stack_top = %llx\n", __my_va_list.stack_top); -printf("__my_va_list.arg = %llx\n", __my_va_list.arg); #if 0 /* ‘float’ is promoted to ‘double’ when passed through ‘...’ */ } else if (t=='f') {