Mercurial > hg > CbC > old > device
annotate test/test1.c @ 752:a38f18a08b30
i64 continue... struct
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 14 Nov 2010 05:16:14 +0900 |
parents | c2c709727221 |
children | 5313ed059cee |
rev | line source |
---|---|
725
3f1f6c0610c1
goto with enviornment syntax changed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
720
diff
changeset
|
1 #define __environment _CbC_environment |
3f1f6c0610c1
goto with enviornment syntax changed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
720
diff
changeset
|
2 #define __return _CbC_return |
3f1f6c0610c1
goto with enviornment syntax changed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
720
diff
changeset
|
3 |
449 | 4 /* |
622 | 5 test for CbC converted __code from C |
449 | 6 */ |
7 | |
720 | 8 #include <stdio.h> |
9 | |
10 extern void *malloc(int); | |
17 | 11 |
172 | 12 typedef void *stack; |
17 | 13 |
449 | 14 void *stack0; /* size of void* == 1 */ |
15 | |
172 | 16 struct cont_save { /* General Return Continuation */ |
622 | 17 __code (*ret)(); |
172 | 18 }; |
17 | 19 |
20 /* | |
622 | 21 __code g(int,void *); |
22 __code f_g0(int ,int ,void *); | |
23 __code f_g1(int,void *); | |
172 | 24 */ |
17 | 25 |
172 | 26 struct f_g0_save { /* Specialized Return Continuation */ |
622 | 27 __code (*ret)(); |
172 | 28 int ii,kk,jj; |
29 }; | |
17 | 30 |
622 | 31 __code g(int i,void *sp) { |
172 | 32 goto (* ((struct cont_save *)sp)->ret)(i+4,sp); |
33 } | |
17 | 34 |
622 | 35 __code f_g1(int j,void *sp) { /* Continuation */ |
172 | 36 int k; |
37 struct f_g0_save *c; | |
17 | 38 |
172 | 39 c = sp; |
40 k = c->kk; | |
41 sp += sizeof(struct f_g0_save); | |
42 goto (* ((struct cont_save *)sp)->ret)(k+4+j,sp); | |
43 } | |
17 | 44 |
622 | 45 __code f(int i,void *sp) { |
172 | 46 int k,j; |
47 struct f_g0_save *c; | |
748
c2c709727221
i64 continue... basic.s assembled.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
48 printf("#0047:f 0 sp: %x\n",sp-stack0); |
17 | 49 |
172 | 50 k = 3+i; |
17 | 51 |
748
c2c709727221
i64 continue... basic.s assembled.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
52 printf("#0051:f 1 sp: %x\n",sp-stack0); |
172 | 53 sp -= sizeof(struct f_g0_save); |
748
c2c709727221
i64 continue... basic.s assembled.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
54 printf("#0053:f 2 sp: %x\n",sp-stack0); |
172 | 55 c = sp; |
56 c->kk = k; | |
57 c->ii = i; | |
58 c->jj = j; | |
59 c->ret = f_g1; | |
60 goto g(i,sp); | |
61 } | |
17 | 62 |
63 | |
64 | |
65 struct f0_save { /* Specialized Return Continuation */ | |
622 | 66 __code (*ret)(); |
67 __code (*exit1)(); | |
17 | 68 void *exit1env; |
69 int jj; | |
70 }; | |
71 | |
622 | 72 __code f1(int i,void *sp) ; |
73 __code f0(int i,int j,__code(*exit2)(), void *exit2env,void *sp) | |
17 | 74 { |
75 struct f0_save *c; | |
748
c2c709727221
i64 continue... basic.s assembled.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
76 printf("#0075:f0 1 sp: %x\n",sp-stack0); |
17 | 77 sp -= sizeof(struct f0_save); |
748
c2c709727221
i64 continue... basic.s assembled.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
78 printf("#0077:f0 2 sp: %x\n",sp-stack0); |
17 | 79 c = sp; |
80 c->jj = j; | |
81 c->exit1 = exit2; | |
82 c->exit1env = exit2env; | |
83 c->ret = f1; | |
748
c2c709727221
i64 continue... basic.s assembled.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
84 printf("#0083:f0 3 sp: %x\n",sp-stack0); |
17 | 85 goto f(i,sp); |
86 } | |
87 | |
729 | 88 __code print(int i,int j,__code (*exit1)(),void*exit1env); |
89 | |
622 | 90 __code f1(int i,void *sp) { |
17 | 91 int j; |
92 int *exit2env; | |
622 | 93 __code (*exit2)(); |
17 | 94 struct f0_save *c; |
95 | |
96 c = sp; | |
97 j = c->jj; | |
98 exit2 = c->exit1; | |
99 exit2env = c->exit1env; | |
100 | |
101 sp += sizeof(struct f0_save); | |
102 goto print(i,j,exit2,exit2env); | |
103 } | |
104 | |
105 int main( int ac, char *av[]) | |
106 { | |
107 int i,j; | |
108 int *sp; | |
109 | |
172 | 110 // i = atoi(av[1]); |
111 i = 1; | |
17 | 112 stack0 = ((char *)malloc(1024)+1024); |
113 sp = stack0; | |
114 j = i; | |
115 | |
748
c2c709727221
i64 continue... basic.s assembled.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
116 printf("#0115:sp: %x %x\n",sp-(int*)stack0,sizeof(*stack0)); |
720 | 117 goto f0(i,j,__return,__environment,sp); |
17 | 118 } |
119 | |
720 | 120 __code print(int i,int j,__code (*exit1)(),void*exit1env) |
17 | 121 { |
748
c2c709727221
i64 continue... basic.s assembled.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
729
diff
changeset
|
122 printf("#0121:%d %d\n",i,j); |
725
3f1f6c0610c1
goto with enviornment syntax changed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
720
diff
changeset
|
123 goto (*exit1)(0,exit1env); |
17 | 124 } |
125 |