changeset 39:9117c3b65bc3

modify quicksort examples.
author kent@zeus.cr.ie.u-ryukyu.ac.jp
date Mon, 25 Jan 2010 16:14:42 +0900
parents 27e6f95b2c21
children 3367c5a7ec79
files CbC-examples/quicksort/Makefile CbC-examples/quicksort/quicksort_cbc.cbc CbC-examples/quicksort/quicksort_cbc2.cbc gcc/c-parser.c
diffstat 4 files changed, 29 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- 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
 
--- 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
--- 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;
--- 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;