# HG changeset patch # User kent@zeus.cr.ie.u-ryukyu.ac.jp # Date 1264403682 -32400 # Node ID 9117c3b65bc3bd82e32ffe7d961a1d9d7d9eca0e # Parent 27e6f95b2c2128408f71eb88b70343a7899543a0 modify quicksort examples. diff -r 27e6f95b2c21 -r 9117c3b65bc3 CbC-examples/quicksort/Makefile --- a/CbC-examples/quicksort/Makefile Tue Jan 05 17:33:06 2010 +0900 +++ b/CbC-examples/quicksort/Makefile Mon Jan 25 16:14:42 2010 +0900 @@ -7,9 +7,10 @@ HEADERMAKER=../../CbC-scripts/make_headers.py2 # fastcall版では-O0,-O2は動作確認、-O3以上はだめ -#CFLAGS=-g -O2 -fomit-frame-pointer -CFLAGS=-g -O2 +CFLAGS=-g -O2 -fomit-frame-pointer +#CFLAGS=-g -O2 #CFLAGS=-g -O0 +#CFLAGS=-g -Os # an error occurred. .SUFFIXES: .cbc .o diff -r 27e6f95b2c21 -r 9117c3b65bc3 CbC-examples/quicksort/quicksort_cbc.cbc --- a/CbC-examples/quicksort/quicksort_cbc.cbc Tue Jan 05 17:33:06 2010 +0900 +++ b/CbC-examples/quicksort/quicksort_cbc.cbc Mon Jan 25 16:14:42 2010 +0900 @@ -6,7 +6,7 @@ typedef struct { int size; void *interface; - __code (*code)(void*, stack) ; + __code (*ret)(void*, stack) ; } frame, *framep; /* quickstart main routine. */ @@ -26,7 +26,7 @@ { framep fp = (framep)sp; sp += fp->size; - goto fp->code(fp->interface, sp); + goto fp->ret(fp->interface, sp); } __code quicksort_start(void *arg, stack sp) @@ -88,11 +88,10 @@ tmp = recvif->v[s]; recvif->v[s] = recvif->v[e]; recvif->v[e] = tmp; - s++; - e--; - goto quicksort_divider(recvif, s, e, p, sp); + //s++; + //e--; + goto quicksort_divider(recvif, s+1, e-1, p, sp); } else { - assert(e+1==s || s==e); goto quicksort_treecall(recvif, s, e, sp); } } @@ -111,7 +110,7 @@ outif->s = recvif->s; outif->e = e; fp = (sp-=sizeof(frame)); - fp->code = quicksort_start; + fp->ret = quicksort_start; fp->interface = recvif; fp->size = sizeof(frame)+sizeof(QS_IF); @@ -151,7 +150,7 @@ outif->e = e; /* frame for quicksort_finish. */ fp = (sp -= sizeof(frame)); - fp->code = quicksort_finish; + fp->ret = quicksort_finish; fp->interface = finish_if; fp->size = sizeof(frame)+sizeof(QS_IF); @@ -160,8 +159,9 @@ __code quicksort_finish(void *arg, stack sp) { - QS_FINISH interface = *(QS_FINISH*)arg; - //assert(interface.sp==mustbefreed); + QS_FINISH interface; + interface = *(QS_FINISH*)arg; + //assert((void*)interface.sp==(void*)mustbefreed); free(interface.sp); goto interface.ret(interface.ret_arg); } @@ -202,18 +202,18 @@ * + ↑ - * sp */ -/* code segmentへgotoしたときのstack spの状態 +/* ret segmentへgotoしたときのstack spの状態 * * sp が直接さすのは frame 構造体 * frame.size: - * frame.code: そのcode segmentが終了した時にgotoすべきcode segment. - * frame.interface: frame.codeへgotoするときのinterface. + * frame.ret: そのret segmentが終了した時にgotoすべきret segment. + * frame.interface: frame.retへgotoするときのinterface. * このポインタが指すメモリ領域は stack * 中にあっても良いしなくても良い。 - * ただしframe.codeを登録した側で解放すべき。 - * sp+sizeof(frame)が指すのは実行中のcode segmentのinterface(引数) - * これは実行中のcode segmentがメモリ管理する - * 通常はこのcode segmentが終了する際に sp+=frame.size とすればよい + * ただしframe.retを登録した側で解放すべき。 + * sp+sizeof(frame)が指すのは実行中のret segmentのinterface(引数) + * これは実行中のret segmentがメモリ管理する + * 通常はこのret segmentが終了する際に sp+=frame.size とすればよい */ __code caller0(void *arg, stack sp) { @@ -223,7 +223,7 @@ /* arg for quicksort_start. */ outif = (sp -= sizeof(*outif)); framep fp = (sp -= sizeof(frame)); - fp->code = caller_finish; + fp->ret = caller_finish; fp->interface = NULL; fp->size = sizeof(*outif)+sizeof(frame); @@ -237,7 +237,7 @@ { framep fp = sp; sp += fp->size; - goto fp->code(fp->interface, sp); + goto fp->ret(fp->interface, sp); } #endif diff -r 27e6f95b2c21 -r 9117c3b65bc3 CbC-examples/quicksort/quicksort_cbc2.cbc --- a/CbC-examples/quicksort/quicksort_cbc2.cbc Tue Jan 05 17:33:06 2010 +0900 +++ b/CbC-examples/quicksort/quicksort_cbc2.cbc Mon Jan 25 16:14:42 2010 +0900 @@ -13,7 +13,7 @@ typedef struct { int size; QS_IF interface; - RET code; + RET ret; } frame, *framep; typedef __code (*RETTYPE)(void*); @@ -30,7 +30,7 @@ { framep fp = (framep)sp; sp += fp->size; - goto fp->code(fp->interface, sp); + goto fp->ret(fp->interface, sp); } __code quicksort_start(QS_IF recvif, stack sp) @@ -95,7 +95,7 @@ e--; goto quicksort_divider(recvif, s, e, p, sp); } else { - assert(e+1==s || s==e); + //assert(e+1==s || s==e); goto quicksort_treecall(recvif, s, e, sp); } } @@ -109,7 +109,7 @@ /* interface for first quicksort_start this segment directly jump to. */ fp = (sp-=sizeof(frame)); - fp->code = quicksort_start; + fp->ret = quicksort_start; fp->size = sizeof(frame); fp->interface.v = recvif.v; fp->interface.s = e+1; @@ -140,7 +140,7 @@ /* interface for quicksort_start. */ /* frame for quicksort_finish. */ fp = (sp -= sizeof(frame)); - fp->code = quicksort_finish; + fp->ret = quicksort_finish; fp->size = sizeof(frame); fp->interface.v = v; fp->interface.s = s; diff -r 27e6f95b2c21 -r 9117c3b65bc3 gcc/c-parser.c --- a/gcc/c-parser.c Tue Jan 05 17:33:06 2010 +0900 +++ b/gcc/c-parser.c Mon Jan 25 16:14:42 2010 +0900 @@ -1552,9 +1552,9 @@ attrs = build_tree_list(attrs, NULL_TREE); declspecs_add_attrs(specs, attrs); */ - //attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE); + attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE); /*attrs = build_tree_list (get_identifier("noreturn"), attrs);*/ - //declspecs_add_attrs(specs, attrs); + declspecs_add_attrs(specs, attrs); c_parser_consume_token (parser); break;