comparison CbC-examples/quicksort/quicksort_cbc.cbc @ 25:2476ed92181e

modified machine description of i386 for support indirect sibcall attributed fastcall.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Tue, 27 Oct 2009 16:04:06 +0900
parents f37d7058d1ce
children 9117c3b65bc3
comparison
equal deleted inserted replaced
24:f37d7058d1ce 25:2476ed92181e
4 4
5 typedef void *stack; 5 typedef void *stack;
6 typedef struct { 6 typedef struct {
7 int size; 7 int size;
8 void *interface; 8 void *interface;
9 __code (*code)(void*, stack); 9 __code (*code)(void*, stack) ;
10 } frame, *framep; 10 } frame, *framep;
11 11
12 /* quickstart main routine. */ 12 /* quickstart main routine. */
13 typedef struct { 13 typedef struct {
14 int *v; 14 int *v;
15 int s; 15 int s;
16 int e; 16 int e;
17 } QS_IF ; 17 } QS_IF ;
18 typedef __code (*RET)(void*); 18 typedef __code (*RET)(void*);
19 19
20 #include"quicksort_cbc.h" 20 #include"quicksort_cbc.h"
21 21
22 /* for check. */ 22 /* for check. */
23 void *mustbefreed; 23 void *mustbefreed;
24 24
25 __code returner(stack sp) 25 __code returner(stack sp)
26 { 26 {
27 framep fp = (framep)sp; 27 framep fp = (framep)sp;
28 sp += fp->size; 28 sp += fp->size;
29 goto fp->code(fp->interface, sp); 29 goto fp->code(fp->interface, sp);
30 } 30 }
31 31
32 __code quicksort_start(void *arg, stack sp) 32 __code quicksort_start(void *arg, stack sp)
33 { 33 {
34 QS_IF *recvif = arg; 34 QS_IF *recvif = arg;
35 int a,b,c,p; 35 int a,b,c,p;
36 a = recvif->v[recvif->s]; 36 a = recvif->v[recvif->s];
37 b = recvif->v[recvif->e]; 37 b = recvif->v[recvif->e];
59 goto quicksort_divider (recvif, recvif->s, recvif->e, p, sp); 59 goto quicksort_divider (recvif, recvif->s, recvif->e, p, sp);
60 } 60 }
61 /* main routine end. */ 61 /* main routine end. */
62 62
63 /* divide routine. */ 63 /* divide routine. */
64 __code quicksort_divider(QS_IF *recvif, int s, int e, int p, stack sp) 64 __code quicksort_divider(QS_IF *recvif, int s, int e, int p, stack sp)
65 { 65 {
66 goto quicksort_divider_s(recvif, s, e, p, sp); 66 goto quicksort_divider_s(recvif, s, e, p, sp);
67 } 67 }
68 __code quicksort_divider_s(QS_IF *recvif, int s, int e, int p, stack sp) 68 __code quicksort_divider_s(QS_IF *recvif, int s, int e, int p, stack sp)
69 { 69 {
70 if (recvif->v[s]<p) { 70 if (recvif->v[s]<p) {
71 s++; 71 s++;
72 goto quicksort_divider_s(recvif, s, e, p, sp); 72 goto quicksort_divider_s(recvif, s, e, p, sp);
73 } else 73 } else
74 goto quicksort_divider_e(recvif, s, e, p, sp); 74 goto quicksort_divider_e(recvif, s, e, p, sp);
75 } 75 }
76 __code quicksort_divider_e(QS_IF *recvif, int s, int e, int p, stack sp) 76 __code quicksort_divider_e(QS_IF *recvif, int s, int e, int p, stack sp)
77 { 77 {
78 if (p<recvif->v[e]) { 78 if (p<recvif->v[e]) {
79 e--; 79 e--;
80 goto quicksort_divider_e(recvif, s, e, p, sp); 80 goto quicksort_divider_e(recvif, s, e, p, sp);
81 } else 81 } else
82 goto quicksort_swapper(recvif, s, e, p, sp); 82 goto quicksort_swapper(recvif, s, e, p, sp);
83 } 83 }
84 __code quicksort_swapper(QS_IF *recvif, int s, int e, int p, stack sp) 84 __code quicksort_swapper(QS_IF *recvif, int s, int e, int p, stack sp)
85 { 85 {
86 if (s<e) { 86 if (s<e) {
87 int tmp; 87 int tmp;
88 tmp = recvif->v[s]; 88 tmp = recvif->v[s];
89 recvif->v[s] = recvif->v[e]; 89 recvif->v[s] = recvif->v[e];
98 } 98 }
99 /* divide routin end. */ 99 /* divide routin end. */
100 100
101 101
102 /* recursive call routine. */ 102 /* recursive call routine. */
103 __code quicksort_treecall(QS_IF *recvif, int s, int e, stack sp) 103 __code quicksort_treecall(QS_IF *recvif, int s, int e, stack sp)
104 { 104 {
105 framep fp; 105 framep fp;
106 QS_IF *outif; 106 QS_IF *outif;
107 107
108 /* interface for first quicksort_start this segment directly jump to. */ 108 /* interface for first quicksort_start this segment directly jump to. */
122 /* recursive call routine end. */ 122 /* recursive call routine end. */
123 123
124 #define STACK_SIZE 10240 124 #define STACK_SIZE 10240
125 125
126 typedef struct { 126 typedef struct {
127 __code (*ret)(void*); 127 __code (*ret)(void*);
128 void *ret_arg; 128 void *ret_arg;
129 stack *sp; 129 stack *sp;
130 } QS_FINISH; 130 } QS_FINISH;
131 __code 131 __code
132 quicksort(int *v, int s, int e, RET ret, void *arg ) 132 quicksort(int *v, int s, int e, RET ret, void *arg )
133 { 133 {
134 framep fp; 134 framep fp;
135 stack sp0, sp; 135 stack sp0, sp;
136 sp0 = malloc(STACK_SIZE); 136 sp0 = mustbefreed = malloc(STACK_SIZE);
137 mustbefreed = sp0;
138 sp = sp0 + STACK_SIZE; 137 sp = sp0 + STACK_SIZE;
139 QS_FINISH *finish_if; 138 QS_FINISH *finish_if;
140 QS_IF *outif; 139 QS_IF *outif;
141 140
142 /* interface for quicksort_finish. */ 141 /* interface for quicksort_finish. */
156 fp->interface = finish_if; 155 fp->interface = finish_if;
157 fp->size = sizeof(frame)+sizeof(QS_IF); 156 fp->size = sizeof(frame)+sizeof(QS_IF);
158 157
159 goto quicksort_start(outif, sp); 158 goto quicksort_start(outif, sp);
160 } 159 }
161 __code 160 __code
162 quicksort_finish(void *arg, stack sp) 161 quicksort_finish(void *arg, stack sp)
163 { 162 {
164 QS_FINISH interface = *(QS_FINISH*)arg; 163 QS_FINISH interface = *(QS_FINISH*)arg;
165 assert(interface.sp==mustbefreed); 164 //assert(interface.sp==mustbefreed);
166 free(interface.sp); 165 free(interface.sp);
167 goto interface.ret(interface.ret_arg); 166 goto interface.ret(interface.ret_arg);
168 } 167 }
169 168
170 169