diff paper/quicksort_for_ppc/quicksort_cbc_inter.cbc @ 10:3d9addf62d0b

organized repository.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Tue, 16 Feb 2010 14:35:36 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/quicksort_for_ppc/quicksort_cbc_inter.cbc	Tue Feb 16 14:35:36 2010 +0900
@@ -0,0 +1,102 @@
+
+#include<stdlib.h>
+typedef void *stack;
+typedef struct {
+	int size;
+	void *interface;
+	__code  (*ret)(void*, stack) ;
+} frame, *framep;
+
+/* quickstart main routine. */
+typedef struct {
+	int *v;
+	int s;
+	int e;
+} QS_IF ;
+typedef __code  (*RET)(void*);
+
+#include"quicksort_cbc.h"
+
+
+typedef struct {
+	__code  (*ret)(void*);
+	void *ret_arg;
+	stack *sp;
+} QS_FINISH;
+
+extern int *IFv;
+extern int IFs;
+extern int IFe;
+extern RET IFret;
+extern void *IFarg;
+extern stack IFsp;
+extern int IFsize;
+
+static void(*exitfunc)(void*);
+__code exitter(void *arg) {
+	exitfunc(arg);
+}
+
+__code quicksort_finish_IF(void *arg, stack sp);
+
+void
+quicksort_IF()
+{
+	printf("v=%p\n", IFv);
+	printf("s=%d\n", IFs);
+	printf("e=%d\n", IFe);
+	printf("ret=%p\n", IFret);
+	printf("arg=%p\n", IFarg);
+	printf("sp=%p\n", IFsp);
+	printf("size=%d\n", IFsize);
+	exitfunc = IFret;
+
+	goto quicksort_IF0(IFv, IFs, IFe, exitter, IFarg, IFsp, IFsize);
+}
+
+__code 
+quicksort_IF0(int *v, int s, int e,  RET ret, void *arg, stack sp0,int size)
+{
+	framep fp;
+	stack sp;
+	sp = sp0 + size;
+	QS_FINISH *finish_if;
+	QS_IF *outif;
+
+	printf("v=%p\n", v);
+	printf("s=%d\n", s);
+	printf("e=%d\n", e);
+	printf("ret=%p\n", ret);
+	printf("arg=%p\n", arg);
+	printf("sp=%p\n", sp0);
+	printf("size=%d\n", size);
+	
+	/* interface for quicksort_finish.  */
+	finish_if = (sp -= sizeof(QS_FINISH));
+	finish_if->ret = ret;
+	finish_if->ret_arg = arg;
+	finish_if->sp = sp0;
+
+	/* interface for quicksort_start.  */
+	outif = (sp -= sizeof(QS_IF));
+	outif->v = v;
+	outif->s = s;
+	outif->e = e;
+	/* frame for quicksort_finish.  */
+	fp = (sp -= sizeof(frame));
+	fp->ret = quicksort_finish_IF;
+	fp->interface = finish_if;
+	fp->size = sizeof(frame)+sizeof(QS_IF);
+
+	goto quicksort_start(outif, sp);
+}
+
+__code 
+quicksort_finish_IF(void *arg, stack sp)
+{
+	QS_FINISH interface;
+	interface = *(QS_FINISH*)arg;
+	//assert((void*)interface.sp==(void*)mustbefreed);
+	goto interface.ret(interface.ret_arg);
+}
+